diff --git a/cc32.bat b/cc32.bat
index d30e150..de8f3ba 100644
--- a/cc32.bat
+++ b/cc32.bat
@@ -1,6 +1,6 @@
 windres --target=pe-i386 kaijuu.rc kaijuu-resource.o
 g++ -m32 -I. -std=gnu++0x -O3 -fomit-frame-pointer -c kaijuu.cpp
-g++ -m32 -shared -static-libgcc -Wl,kaijuu.def -Wl,-enable-stdcall-fixup -s -o kaijuu32.dll kaijuu.o -lm -lole32 -luuid -lshlwapi
+g++ -m32 -shared -static-libgcc -Wl,kaijuu.def -Wl,-enable-stdcall-fixup -s -o kaijuu32.dll kaijuu.o -lm -lole32 -luuid -lshlwapi -lgdi32
 g++ -m32 -I. -std=gnu++0x -O3 -fomit-frame-pointer -o phoenix.o -c phoenix/phoenix.cpp -DPHOENIX_WINDOWS
 g++ -m32 -I. -std=gnu++0x -O3 -fomit-frame-pointer -c interface.cpp
 g++ -m32 -mwindows -s -o kaijuu32.exe interface.o kaijuu-resource.o phoenix.o -lkernel32 -luser32 -lgdi32 -ladvapi32 -lole32 -lcomctl32 -lcomdlg32 -lshlwapi
diff --git a/cc64.bat b/cc64.bat
index b2fb144..d239155 100644
--- a/cc64.bat
+++ b/cc64.bat
@@ -1,6 +1,6 @@
 windres kaijuu.rc kaijuu-resource.o
 g++ -m64 -I. -std=gnu++0x -O3 -fomit-frame-pointer -c kaijuu.cpp
-g++ -m64 -shared -static-libgcc -Wl,kaijuu.def -Wl,-enable-stdcall-fixup -s -o kaijuu64.dll kaijuu.o -lm -lole32 -luuid -lshlwapi
+g++ -m64 -shared -static-libgcc -Wl,kaijuu.def -Wl,-enable-stdcall-fixup -s -o kaijuu64.dll kaijuu.o -lm -lole32 -luuid -lshlwapi -lgdi32
 g++ -m64 -I. -std=gnu++0x -O3 -fomit-frame-pointer -o phoenix.o -c phoenix/phoenix.cpp -DPHOENIX_WINDOWS
 g++ -m64 -I. -std=gnu++0x -O3 -fomit-frame-pointer -c interface.cpp
 g++ -m64 -mwindows -s -o kaijuu64.exe interface.o kaijuu-resource.o phoenix.o -lkernel32 -luser32 -lgdi32 -ladvapi32 -lole32 -lcomctl32 -lcomdlg32 -lshlwapi
diff --git a/extension.cpp b/extension.cpp
index 15c4bf0..d87d445 100644
--- a/extension.cpp
+++ b/extension.cpp
@@ -73,6 +73,13 @@ STDMETHODIMP CShellExt::QueryContextMenu(HMENU hMenu, UINT indexMenu, UINT idCmd
     auto &rule = settings.rules(ruleID);
     if(idCmd < idCmdLast) {
       InsertMenuW(hMenu, indexMenu, MF_STRING | MF_BYPOSITION, idCmd++, (const wchar_t*)utf16_t(rule.name));
+      HBITMAP icon = iconLoader.LoadIcon(rule.icon);
+      if(icon) {
+        MENUITEMINFO mii = { sizeof(mii) };
+        mii.fMask = MIIM_BITMAP;
+        mii.hbmpItem = icon;
+        SetMenuItemInfo(hMenu, indexMenu, true, &mii);
+      }
       if(rule.defaultAction && firstDefault) {
         firstDefault = false;  //there can be only one default menu item
         SetMenuDefaultItem(hMenu, indexMenu, TRUE);
diff --git a/extension.hpp b/extension.hpp
index f7c8576..c5956ab 100644
--- a/extension.hpp
+++ b/extension.hpp
@@ -18,6 +18,7 @@ public:
 
 private:
   vector<unsigned> matchedRules();
+  IconLoader iconLoader;
 };
 
 typedef CShellExt *LPCSHELLEXT;
\ No newline at end of file
diff --git a/iconloader.cpp b/iconloader.cpp
new file mode 100644
index 0000000..d541509
--- /dev/null
+++ b/iconloader.cpp
@@ -0,0 +1,237 @@
+IconLoader::IconLoader() {
+  OSVERSIONINFOEX osVinfo;
+
+  memset(&osVinfo,0,sizeof(OSVERSIONINFOEX));
+  osVinfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
+  GetVersionEx((OSVERSIONINFO *)&osVinfo);
+
+  uxThemeDll = 0;
+  isVistaUp = (osVinfo.dwMajorVersion >= 6);
+
+  if(isVistaUp) {
+    uxThemeDll = LoadLibraryW(L"UxTheme.dll");
+    if (uxThemeDll) {
+        GetBufferedPaintBits = (GETBUFFEREDPAINTBITS)GetProcAddress(uxThemeDll, "GetBufferedPaintBits");
+        BeginBufferedPaint = (BEGINBUFFEREDPAINT)GetProcAddress(uxThemeDll, "BeginBufferedPaint");
+        EndBufferedPaint = (ENDBUFFEREDPAINT)GetProcAddress(uxThemeDll, "EndBufferedPaint");
+    }
+  }
+}
+
+IconLoader::~IconLoader() {
+  std::map<string, HBITMAP>::iterator it;
+  for (it = icons.begin(); it != icons.end(); ++it) {
+      DeleteObject(it->second);
+  }
+
+  if(uxThemeDll)
+    FreeLibrary(uxThemeDll);
+}
+
+HBITMAP IconLoader::LoadIcon(string icon) {
+  if(!isVistaUp || icon.trim()=="") return 0;
+
+  std::map<string, HBITMAP>::iterator it = icons.find(icon);
+  if(it != icons.end()) return it->second;
+
+  lstring iconparts;
+  iconparts.split(",",icon);
+  int index = 0;
+  if(iconparts.size()>1)
+    index = integer(iconparts[1].trim());
+
+  HICON hIcon;
+  if(!ExtractIconExW((const wchar_t*)utf16_t(iconparts[0]),index,NULL,&hIcon,1))
+    return 0;
+
+  HBITMAP hBmp = IconToBitmapPARGB32(hIcon);
+
+  DestroyIcon(hIcon);
+
+  if(hBmp) {
+      icons.insert(std::make_pair(icon, hBmp));
+  }
+
+  return hBmp;
+}
+
+void IconLoader::InitBitmapInfo(BITMAPINFO *pbmi, ULONG cbInfo, LONG cx, LONG cy, WORD bpp)
+{
+    ZeroMemory(pbmi, cbInfo);
+    pbmi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
+    pbmi->bmiHeader.biPlanes = 1;
+    pbmi->bmiHeader.biCompression = BI_RGB;
+
+    pbmi->bmiHeader.biWidth = cx;
+    pbmi->bmiHeader.biHeight = cy;
+    pbmi->bmiHeader.biBitCount = bpp;
+}
+
+HRESULT IconLoader::Create32BitHBITMAP(HDC hdc, const SIZE *psize, void **ppvBits, HBITMAP* phBmp)
+{
+    *phBmp = NULL;
+
+    BITMAPINFO bmi;
+    InitBitmapInfo(&bmi, sizeof(bmi), psize->cx, psize->cy, 32);
+
+    HDC hdcUsed = hdc ? hdc : GetDC(NULL);
+    if (hdcUsed)
+    {
+        *phBmp = CreateDIBSection(hdcUsed, &bmi, DIB_RGB_COLORS, ppvBits, NULL, 0);
+        if (hdc != hdcUsed)
+        {
+            ReleaseDC(NULL, hdcUsed);
+        }
+    }
+    return (NULL == *phBmp) ? E_OUTOFMEMORY : S_OK;
+}
+
+HRESULT IconLoader::ConvertToPARGB32(HDC hdc, ARGB *pargb, HBITMAP hbmp, SIZE& sizImage, int cxRow)
+{
+    BITMAPINFO bmi;
+    InitBitmapInfo(&bmi, sizeof(bmi), sizImage.cx, sizImage.cy, 32);
+
+    HRESULT hr = E_OUTOFMEMORY;
+    HANDLE hHeap = GetProcessHeap();
+    void *pvBits = HeapAlloc(hHeap, 0, bmi.bmiHeader.biWidth * 4 * bmi.bmiHeader.biHeight);
+    if (pvBits)
+    {
+        hr = E_UNEXPECTED;
+        if (GetDIBits(hdc, hbmp, 0, bmi.bmiHeader.biHeight, pvBits, &bmi, DIB_RGB_COLORS) == bmi.bmiHeader.biHeight)
+        {
+            ULONG cxDelta = cxRow - bmi.bmiHeader.biWidth;
+            ARGB *pargbMask = static_cast<ARGB *>(pvBits);
+
+            for (ULONG y = bmi.bmiHeader.biHeight; y; --y)
+            {
+                for (ULONG x = bmi.bmiHeader.biWidth; x; --x)
+                {
+                    if (*pargbMask++)
+                    {
+                        // transparent pixel
+                        *pargb++ = 0;
+                    }
+                    else
+                    {
+                        // opaque pixel
+                        *pargb++ |= 0xFF000000;
+                    }
+                }
+
+                pargb += cxDelta;
+            }
+
+            hr = S_OK;
+        }
+
+        HeapFree(hHeap, 0, pvBits);
+    }
+
+    return hr;
+}
+
+bool IconLoader::HasAlpha(ARGB *pargb, SIZE& sizImage, int cxRow)
+{
+    ULONG cxDelta = cxRow - sizImage.cx;
+    for (ULONG y = sizImage.cy; y; --y)
+    {
+        for (ULONG x = sizImage.cx; x; --x)
+        {
+            if (*pargb++ & 0xFF000000)
+            {
+                return true;
+            }
+        }
+
+        pargb += cxDelta;
+    }
+
+    return false;
+}
+
+HRESULT IconLoader::ConvertBufferToPARGB32(HPAINTBUFFER hPaintBuffer, HDC hdc, HICON hicon, SIZE& sizIcon)
+{
+    RGBQUAD *prgbQuad;
+    int cxRow;
+    HRESULT hr = GetBufferedPaintBits(hPaintBuffer, &prgbQuad, &cxRow);
+    if (SUCCEEDED(hr))
+    {
+        ARGB *pargb = reinterpret_cast<ARGB *>(prgbQuad);
+        if (!HasAlpha(pargb, sizIcon, cxRow))
+        {
+            ICONINFO info;
+            if (GetIconInfo(hicon, &info))
+            {
+                if (info.hbmMask)
+                {
+                    hr = ConvertToPARGB32(hdc, pargb, info.hbmMask, sizIcon, cxRow);
+                }
+
+                DeleteObject(info.hbmColor);
+                DeleteObject(info.hbmMask);
+            }
+        }
+    }
+
+    return hr;
+}
+
+HBITMAP IconLoader::IconToBitmapPARGB32(HICON hicon)
+{
+    HRESULT hr = E_OUTOFMEMORY;
+    HBITMAP hbmp = NULL;
+
+    SIZE sizIcon;
+    sizIcon.cx = GetSystemMetrics(SM_CXSMICON);
+    sizIcon.cy = GetSystemMetrics(SM_CYSMICON);
+
+    RECT rcIcon;
+    SetRect(&rcIcon, 0, 0, sizIcon.cx, sizIcon.cy);
+
+    HDC hdcDest = CreateCompatibleDC(NULL);
+    if (hdcDest)
+    {
+        hr = Create32BitHBITMAP(hdcDest, &sizIcon, NULL, &hbmp);
+        if (SUCCEEDED(hr))
+        {
+            hr = E_FAIL;
+
+            HBITMAP hbmpOld = (HBITMAP)SelectObject(hdcDest, hbmp);
+            if (hbmpOld)
+            {
+                BLENDFUNCTION bfAlpha = { AC_SRC_OVER, 0, 255, AC_SRC_ALPHA };
+                BP_PAINTPARAMS paintParams = {0};
+                paintParams.cbSize = sizeof(paintParams);
+                paintParams.dwFlags = 0x0001;
+                paintParams.pBlendFunction = &bfAlpha;
+
+                HDC hdcBuffer;
+                HPAINTBUFFER hPaintBuffer = BeginBufferedPaint(hdcDest, &rcIcon, BPBF_DIB, &paintParams, &hdcBuffer);
+                if (hPaintBuffer)
+                {
+                    if (DrawIconEx(hdcBuffer, 0, 0, hicon, sizIcon.cx, sizIcon.cy, 0, NULL, DI_NORMAL))
+                    {
+                        // If icon did not have an alpha channel, we need to convert buffer to PARGB.
+                        hr = ConvertBufferToPARGB32(hPaintBuffer, hdcDest, hicon, sizIcon);
+                    }
+
+                    // This will write the buffer contents to the
+// destination bitmap.
+                    EndBufferedPaint(hPaintBuffer, TRUE);
+                }
+
+                SelectObject(hdcDest, hbmpOld);
+            }
+        }
+
+        DeleteDC(hdcDest);
+    }
+
+    if (FAILED(hr))
+    {
+        DeleteObject(hbmp);
+        hbmp = NULL;
+    }
+
+    return hbmp;
+}
diff --git a/iconloader.hpp b/iconloader.hpp
new file mode 100644
index 0000000..f74780b
--- /dev/null
+++ b/iconloader.hpp
@@ -0,0 +1,29 @@
+typedef HRESULT (WINAPI *GETBUFFEREDPAINTBITS) (HPAINTBUFFER hBufferedPaint, RGBQUAD **ppbBuffer, int *pcxRow);
+typedef HPAINTBUFFER (WINAPI *BEGINBUFFEREDPAINT) (HDC hdcTarget, const RECT *prcTarget, BP_BUFFERFORMAT dwFormat, BP_PAINTPARAMS *pPaintParams, HDC *phdc);
+typedef HRESULT (WINAPI *ENDBUFFEREDPAINT) (HPAINTBUFFER hBufferedPaint, BOOL fUpdateTarget);
+
+typedef DWORD ARGB;
+
+struct IconLoader {
+protected:
+  HMODULE uxThemeDll;
+  bool isVistaUp;
+  std::map<string,HBITMAP> icons;
+
+  GETBUFFEREDPAINTBITS GetBufferedPaintBits;
+  BEGINBUFFEREDPAINT BeginBufferedPaint;
+  ENDBUFFEREDPAINT EndBufferedPaint;
+
+  HBITMAP IconToBitmapPARGB32(HICON hicon);
+  HRESULT Create32BitHBITMAP(HDC hdc, const SIZE *psize, void **ppvBits, HBITMAP* phBmp);
+  void InitBitmapInfo(BITMAPINFO *pbmi, ULONG cbInfo, LONG cx, LONG cy, WORD bpp);
+  HRESULT ConvertBufferToPARGB32(HPAINTBUFFER hPaintBuffer, HDC hdc, HICON hicon, SIZE& sizIcon);
+  HRESULT ConvertToPARGB32(HDC hdc, ARGB *pargb, HBITMAP hbmp, SIZE& sizImage, int cxRow);
+  bool HasAlpha(ARGB *pargb, SIZE& sizImage, int cxRow);
+
+public:
+  IconLoader();
+  ~IconLoader();
+
+  HBITMAP LoadIcon(string icon);
+};
diff --git a/interface.cpp b/interface.cpp
index 7378426..ade8e2c 100644
--- a/interface.cpp
+++ b/interface.cpp
@@ -2,6 +2,10 @@
 Application *application = nullptr;
 RuleEditor *ruleEditor = nullptr;
 
+typedef int (WINAPI *PICKICONDLG)(HWND hwnd,LPWSTR pszIconPath,UINT cbIconPath,int *piIconIndex);
+HMODULE hShell32 = nullptr;
+PICKICONDLG PickIconDlgW = nullptr;
+
 Application::Application(const string &pathname) : pathname(pathname) {
   setTitle("kaijuu v04");
   setFrameGeometry({64, 64, 725, 480});
@@ -10,7 +14,7 @@ Application::Application(const string &pathname) : pathname(pathname) {
   statusLabel.setFont("Tahoma, 8, Bold");
   uninstallButton.setText("Uninstall");
   installButton.setText("Install");
-  settingList.setHeaderText("Name", "Default", "Match", "Pattern", "Command");
+  settingList.setHeaderText("Name", "Default", "Match", "Pattern", "Command", "Icon");
   settingList.setHeaderVisible();
   appendButton.setText("Append");
   modifyButton.setText("Modify");
@@ -85,7 +89,7 @@ void Application::refresh() {
     if(rule.matchFiles && rule.matchFolders) match = "Everything";
     else if(rule.matchFiles) match = "Files";
     else if(rule.matchFolders) match = "Folders";
-    settingList.append(rule.name, rule.defaultAction ? "Yes" : "No", match, rule.pattern, rule.command);
+    settingList.append(rule.name, rule.defaultAction ? "Yes" : "No", match, rule.pattern, rule.command, rule.icon);
   }
   settingList.autoSizeColumns();
 }
@@ -158,13 +162,15 @@ void Application::resetAction() {
 
 RuleEditor::RuleEditor() : index(-1) {
   setTitle("Rule Editor");
-  setFrameGeometry({128, 256, 500, 160});
+  setFrameGeometry({128, 256, 500, 200});
 
   layout.setMargin(5);
   nameLabel.setText("Name:");
   patternLabel.setText("Pattern:");
   commandLabel.setText("Command:");
   commandSelect.setText("Select ...");
+  iconLabel.setText("Icon:");
+  iconSelect.setText("Select ...");
   defaultAction.setText("Default Action");
   filesAction.setText("Match Files");
   foldersAction.setText("Match Folders");
@@ -175,6 +181,7 @@ RuleEditor::RuleEditor() : index(-1) {
   length = max(length, font.geometry("Name:").width);
   length = max(length, font.geometry("Pattern:").width);
   length = max(length, font.geometry("Command:").width);
+  length = max(length, font.geometry("Icon:").width);
 
   append(layout);
   layout.append(nameLayout, {~0, 0}, 5);
@@ -187,6 +194,10 @@ RuleEditor::RuleEditor() : index(-1) {
     commandLayout.append(commandLabel, {length, 0}, 5);
     commandLayout.append(commandValue, {~0, 0}, 5);
     commandLayout.append(commandSelect, {80, 0});
+  layout.append(iconLayout, {~0, 0}, 5);
+    iconLayout.append(iconLabel, {length, 0}, 5);
+    iconLayout.append(iconValue, {~0, 0}, 5);
+    iconLayout.append(iconSelect, {80, 0});
   layout.append(controlLayout, {~0, 0});
     controlLayout.append(defaultAction, {0, 0}, 5);
     controlLayout.append(filesAction, {0, 0}, 5);
@@ -205,6 +216,7 @@ RuleEditor::RuleEditor() : index(-1) {
   nameValue.onChange =
   patternValue.onChange =
   commandValue.onChange =
+  iconValue.onChange =
   {&RuleEditor::synchronize, this};
 
   commandSelect.onActivate = [&] {
@@ -212,6 +224,23 @@ RuleEditor::RuleEditor() : index(-1) {
     if(pathname.empty() == false) {
       pathname.transform("/", "\\");
       commandValue.setText({"\"", pathname, "\" {file}"});
+      iconValue.setText({pathname, ",0"});
+    }
+    synchronize();
+  };
+
+  iconSelect.onActivate = [&] {
+    lstring iconparts = iconValue.text().split(",");
+    int index = 0;
+    if(iconparts.size()>1)
+      index = integer(iconparts[1].trim());
+
+    wchar_t wfilename[PATH_MAX + 1];
+    wcscpy(wfilename,(const wchar_t*)utf16_t(iconparts[0]));
+
+    if(PickIconDlgW(0,wfilename,PATH_MAX + 1,&index)) {
+      string newicon = {string((const char*)utf8_t(wfilename)),",", string(index).ltrim("+") };
+      iconValue.setText(newicon);
     }
     synchronize();
   };
@@ -219,6 +248,7 @@ RuleEditor::RuleEditor() : index(-1) {
   nameValue.onActivate =
   patternValue.onActivate =
   commandValue.onActivate =
+  iconValue.onActivate =
   assignButton.onActivate = [&] {
     Settings::Rule rule = {
       nameValue.text(),
@@ -226,7 +256,8 @@ RuleEditor::RuleEditor() : index(-1) {
       defaultAction.checked(),
       filesAction.checked(),
       foldersAction.checked(),
-      commandValue.text()
+      commandValue.text(),
+      iconValue.text()
     };
     if(index == -1) {
       settings.rules.append(rule);
@@ -250,13 +281,14 @@ void RuleEditor::synchronize() {
 }
 
 void RuleEditor::show(signed ruleID) {
-  Settings::Rule rule{"", "", false, true, false, "", false};
+  Settings::Rule rule{"", "", false, true, false, "", "", false};
   if(ruleID >= 0) rule = settings.rules(ruleID);
 
   index = ruleID;
   nameValue.setText(rule.name);
   patternValue.setText(rule.pattern);
   commandValue.setText(rule.command);
+  iconValue.setText(rule.icon);
   defaultAction.setChecked(rule.defaultAction);
   filesAction.setChecked(rule.matchFiles);
   foldersAction.setChecked(rule.matchFolders);
@@ -293,6 +325,11 @@ int CALLBACK WinMain(HINSTANCE module, HINSTANCE, LPSTR, int) {
   wchar_t filename[MAX_PATH];
   GetModuleFileNameW(module, filename, MAX_PATH);
 
+  hShell32 = LoadLibraryW(L"shell32.dll");
+  if (hShell32) {
+    PickIconDlgW = (PICKICONDLG)GetProcAddress(hShell32, (const char*)62);
+  }
+
   string pathname = (const char*)utf8_t(filename);
   pathname.transform("\\", "/");
   pathname = dir(pathname);
@@ -302,5 +339,8 @@ int CALLBACK WinMain(HINSTANCE module, HINSTANCE, LPSTR, int) {
   application->setFocused();
   OS::main();
 
+  if(hShell32)
+    FreeLibrary(hShell32);
+
   return 0;
 }
diff --git a/interface.hpp b/interface.hpp
index 74dcb87..e3622c9 100644
--- a/interface.hpp
+++ b/interface.hpp
@@ -56,6 +56,10 @@ struct RuleEditor : Window {
       Label commandLabel;
       LineEdit commandValue;
       Button commandSelect;
+    HorizontalLayout iconLayout;
+      Label iconLabel;
+      LineEdit iconValue;
+      Button iconSelect;
     HorizontalLayout controlLayout;
       CheckBox defaultAction;
       CheckBox filesAction;
diff --git a/kaijuu.cpp b/kaijuu.cpp
index 6c71c4c..333de4f 100644
--- a/kaijuu.cpp
+++ b/kaijuu.cpp
@@ -1,4 +1,5 @@
 #include "kaijuu.hpp"
+#include "iconloader.cpp"
 #include "extension.cpp"
 #include "factory.cpp"
 
diff --git a/kaijuu.hpp b/kaijuu.hpp
index ed26fe9..00f3ab6 100644
--- a/kaijuu.hpp
+++ b/kaijuu.hpp
@@ -3,6 +3,7 @@
 #include <nall/file.hpp>
 #include <nall/string.hpp>
 #include <nall/vector.hpp>
+#include <nall/map.hpp>
 #include <nall/windows/registry.hpp>
 using namespace nall;
 
@@ -12,8 +13,12 @@ using namespace nall;
 #include <shlobj.h>
 #include <shlwapi.h>
 #include <strsafe.h>
+#undef _WIN32_WINNT
+#define _WIN32_WINNT 0x0600
+#include <uxtheme.h>
 #include <list>
 #include <string>
+#include <map>
 #define IDM_CFOPEN 0
 
 HINSTANCE module = NULL;
@@ -21,5 +26,6 @@ unsigned referenceCount = 0;
 
 #include "guid.hpp"
 #include "settings.hpp"
+#include "iconloader.hpp"
 #include "extension.hpp"
 #include "factory.hpp"
diff --git a/settings.hpp b/settings.hpp
index b9b11b4..372fbf7 100644
--- a/settings.hpp
+++ b/settings.hpp
@@ -6,6 +6,7 @@ struct Settings {
     bool matchFiles;
     bool matchFolders;
     string command;
+    string icon;
     bool multiSelection;
   };
   vector<Rule> rules;
@@ -22,6 +23,7 @@ struct Settings {
         registry::read({path, "Files"}) == "true",
         registry::read({path, "Folders"}) == "true",
         registry::read({path, "Command"}),
+        registry::read({path, "Icon"}),
       });
     }
     for(auto &rule : rules) {
@@ -40,6 +42,7 @@ struct Settings {
       registry::write({path, "Files"}, rule.matchFiles);
       registry::write({path, "Folders"}, rule.matchFolders);
       registry::write({path, "Command"}, rule.command);
+      registry::write({path, "Icon"}, rule.icon);
     }
   }
 } settings;
