diff --git a/dll/win32/shell32/folders/CDrivesFolder.cpp b/dll/win32/shell32/folders/CDrivesFolder.cpp
index 2293884e9ea..f8c28e77c88 100644
--- a/dll/win32/shell32/folders/CDrivesFolder.cpp
+++ b/dll/win32/shell32/folders/CDrivesFolder.cpp
@@ -511,9 +511,38 @@ HRESULT CDrivesExtractIcon_CreateInstance(IShellFolder * psf, LPCITEMIDLIST pidl
         DriveType = DRIVE_FIXED;
 
     WCHAR wTemp[MAX_PATH];
-    int icon_idx;
+    int icon_idx, reg_idx;
     UINT flags = 0;
-    if ((DriveType == DRIVE_FIXED || DriveType == DRIVE_UNKNOWN) &&
+    switch (DriveType)
+    {
+        case DRIVE_FIXED:
+        case DRIVE_UNKNOWN:
+            reg_idx = 8;
+            break;
+        case DRIVE_CDROM:
+            reg_idx = 11;
+            break;
+        case DRIVE_REMOTE:
+            reg_idx = 9;
+            break;
+        case DRIVE_REMOVABLE:
+            if (!IsDriveFloppyA(pszDrive))
+                reg_idx = 7;
+            else
+                reg_idx = 6;
+            break;
+        case DRIVE_RAMDISK:
+            reg_idx = 12;
+            break;
+        default:
+            reg_idx = 0;
+            break;
+    }
+    if (HLM_GetIconW(reg_idx, wTemp, MAX_PATH, &icon_idx))
+    {
+        initIcon->SetNormalIcon(wTemp, icon_idx);
+    }
+    else if ((DriveType == DRIVE_FIXED || DriveType == DRIVE_UNKNOWN) &&
         (HCR_GetIconW(L"Drive", wTemp, NULL, MAX_PATH, &icon_idx)))
     {
         initIcon->SetNormalIcon(wTemp, icon_idx);
diff --git a/dll/win32/shell32/folders/CFSFolder.cpp b/dll/win32/shell32/folders/CFSFolder.cpp
index 93cacdd1e2f..26e30ddd518 100644
--- a/dll/win32/shell32/folders/CFSFolder.cpp
+++ b/dll/win32/shell32/folders/CFSFolder.cpp
@@ -136,10 +136,13 @@ HRESULT GetCLSIDForFileType(PCUIDLIST_RELATIVE pidl, LPCWSTR KeyName, CLSID* pcl
 static HRESULT
 getDefaultIconLocation(LPWSTR szIconFile, UINT cchMax, int *piIndex, UINT uFlags)
 {
-    if (!HCR_GetIconW(L"Folder", szIconFile, NULL, cchMax, piIndex))
+    if (!HLM_GetIconW(3, szIconFile, cchMax, piIndex))
     {
-        lstrcpynW(szIconFile, swShell32Name, cchMax);
-        *piIndex = -IDI_SHELL_FOLDER;
+        if (!HCR_GetIconW(L"Folder", szIconFile, NULL, cchMax, piIndex))
+        {
+            lstrcpynW(szIconFile, swShell32Name, cchMax);
+            *piIndex = -IDI_SHELL_FOLDER;
+        }
     }
 
     if (uFlags & GIL_OPENICON)
diff --git a/dll/win32/shell32/folders/CRegFolder.cpp b/dll/win32/shell32/folders/CRegFolder.cpp
index 5b2d513569b..08d00e56286 100644
--- a/dll/win32/shell32/folders/CRegFolder.cpp
+++ b/dll/win32/shell32/folders/CRegFolder.cpp
@@ -145,14 +145,7 @@ HRESULT CGuidItemExtractIcon_CreateInstance(LPCITEMIDLIST pidl, REFIID iid, LPVO
     if (!riid)
         return E_FAIL;
 
-    /* my computer and other shell extensions */
-    WCHAR xriid[50];
-
-    swprintf(xriid, L"CLSID\\{%08lx-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x}",
-             riid->Data1, riid->Data2, riid->Data3,
-             riid->Data4[0], riid->Data4[1], riid->Data4[2], riid->Data4[3],
-             riid->Data4[4], riid->Data4[5], riid->Data4[6], riid->Data4[7]);
-
+    /* Choose a correct icon for Recycle Bin (full or empty) */
     const WCHAR* iconname = NULL;
     if (_ILIsBitBucket(pidl))
     {
@@ -179,23 +172,37 @@ HRESULT CGuidItemExtractIcon_CreateInstance(LPCITEMIDLIST pidl, REFIID iid, LPVO
         }
     }
 
-    if (HCR_GetIconW(xriid, wTemp, iconname, MAX_PATH, &icon_idx))
+    /* Prepare registry path for loading icons of My Computer and other shell extensions */
+    WCHAR xriid[256];
+
+    swprintf(xriid, L"Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\CLSID\\{%08lx-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x}",
+             riid->Data1, riid->Data2, riid->Data3,
+             riid->Data4[0], riid->Data4[1], riid->Data4[2], riid->Data4[3],
+             riid->Data4[4], riid->Data4[5], riid->Data4[6], riid->Data4[7]);
+
+    /* Load icon for the current user */
+    BOOL ret = HCU_GetIconW(xriid, wTemp, iconname, MAX_PATH, &icon_idx);
+    if (!ret)
     {
+        /* Failed, load default system-wide icon */
+        swprintf(xriid, L"CLSID\\{%08lx-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x}",
+                 riid->Data1, riid->Data2, riid->Data3,
+                 riid->Data4[0], riid->Data4[1], riid->Data4[2], riid->Data4[3],
+                 riid->Data4[4], riid->Data4[5], riid->Data4[6], riid->Data4[7]);
+
+        ret = HCR_GetIconW(xriid, wTemp, iconname, MAX_PATH, &icon_idx);
+    }
+
+    if (ret)
+    {
+        /* Success, set loaded icon */
         initIcon->SetNormalIcon(wTemp, icon_idx);
     }
     else
     {
-        // FIXME: Delete these hacks and make HCR_GetIconW and registry working
-        if (IsEqualGUID(*riid, CLSID_MyComputer))
-            initIcon->SetNormalIcon(swShell32Name, -IDI_SHELL_MY_COMPUTER);
-        else if (IsEqualGUID(*riid, CLSID_MyDocuments))
-            initIcon->SetNormalIcon(swShell32Name, -IDI_SHELL_MY_DOCUMENTS);
-        else if (IsEqualGUID(*riid, CLSID_NetworkPlaces))
-            initIcon->SetNormalIcon(swShell32Name, -IDI_SHELL_MY_NETWORK_PLACES);
-        else if (IsEqualGUID(*riid, CLSID_Internet))
-            initIcon->SetNormalIcon(swShell32Name, -IDI_SHELL_WEB_BROWSER);
-        else
-            initIcon->SetNormalIcon(swShell32Name, -IDI_SHELL_FOLDER);
+        /* Everything has failed, set blank paper icon */
+        WARN("Failed to load an icon for the item, setting blank icon\n");
+        initIcon->SetNormalIcon(swShell32Name, 0);
     }
 
     return initIcon->QueryInterface(iid, ppvOut);
diff --git a/dll/win32/shell32/wine/classes.c b/dll/win32/shell32/wine/classes.c
index df2099914da..fa8a1e2d315 100644
--- a/dll/win32/shell32/wine/classes.c
+++ b/dll/win32/shell32/wine/classes.c
@@ -293,8 +293,7 @@ BOOL HCR_GetIconW(LPCWSTR szClass, LPWSTR szDest, LPCWSTR szName, DWORD len, int
 
 	TRACE("%s\n",debugstr_w(szClass) );
 
-	lstrcpynW(sTemp, szClass, MAX_PATH);
-	lstrcatW(sTemp, L"\\DefaultIcon");
+	swprintf(sTemp, L"%s\\DefaultIcon",szClass);
 
 	if (!RegOpenKeyExW(HKEY_CLASSES_ROOT, sTemp, 0, KEY_READ, &hkey))
 	{
@@ -334,6 +333,112 @@ BOOL HCR_GetIconA(LPCSTR szClass, LPSTR szDest, LPCSTR szName, DWORD len, int* p
 	return ret;
 }
 
+#ifdef __REACTOS__
+BOOL HCU_GetIconW(LPCWSTR szClass, LPWSTR szDest, LPCWSTR szName, DWORD len, int* picon_idx)
+{
+	HKEY	hkey;
+	WCHAR	sTemp[MAX_PATH];
+	BOOL	ret = FALSE;
+
+	TRACE("%s\n",debugstr_w(szClass) );
+
+	swprintf(sTemp, L"%s\\DefaultIcon", szClass);
+
+	if (!RegOpenKeyExW(HKEY_CURRENT_USER, sTemp, 0, KEY_READ, &hkey))
+	{
+	  ret = HCR_RegGetIconW(hkey, szDest, szName, len, picon_idx);
+	  RegCloseKey(hkey);
+	}
+
+        if(ret)
+            TRACE("-- %s %i\n", debugstr_w(szDest), *picon_idx);
+        else
+            TRACE("-- not found\n");
+
+	return ret;
+}
+
+BOOL HCU_GetIconA(LPCSTR szClass, LPSTR szDest, LPCSTR szName, DWORD len, int* picon_idx)
+{
+	HKEY	hkey;
+	char	sTemp[MAX_PATH];
+	BOOL	ret = FALSE;
+
+	TRACE("%s\n",szClass );
+
+	sprintf(sTemp, "%s\\DefaultIcon", szClass);
+
+	if (!RegOpenKeyExA(HKEY_CURRENT_USER, sTemp, 0, KEY_READ, &hkey))
+	{
+	  ret = HCR_RegGetIconA(hkey, szDest, szName, len, picon_idx);
+	  RegCloseKey(hkey);
+	}
+
+    if (ret)
+        TRACE("-- %s %i\n", szDest, *picon_idx);
+    else
+        TRACE("-- not found\n");
+
+	return ret;
+}
+
+BOOL HLM_GetIconW(int reg_idx, LPWSTR szDest, DWORD len, int* picon_idx)
+{
+	HKEY	hkey;
+	WCHAR	sTemp[8];
+	BOOL	ret = FALSE;
+
+	TRACE("%d\n",reg_idx );
+
+	swprintf(sTemp, L"%d", reg_idx);
+
+	if (!RegOpenKeyExW(HKEY_LOCAL_MACHINE,
+	                   L"Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Shell Icons",
+	                   0,
+	                   KEY_READ,
+	                   &hkey))
+	{
+	  ret = HCR_RegGetIconW(hkey, szDest, sTemp, len, picon_idx);
+	  RegCloseKey(hkey);
+	}
+
+        if(ret)
+            TRACE("-- %s %i\n", debugstr_w(szDest), *picon_idx);
+        else
+            TRACE("-- not found\n");
+
+	return ret;
+}
+
+BOOL HLM_GetIconA(int reg_idx, LPSTR szDest, DWORD len, int* picon_idx)
+{
+	HKEY	hkey;
+	char	sTemp[8];
+	BOOL	ret = FALSE;
+
+	TRACE("%d\n",reg_idx );
+
+	sprintf(sTemp, "%d", reg_idx);
+
+	if (!RegOpenKeyExA(HKEY_LOCAL_MACHINE,
+	                   "Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Shell Icons",
+	                   0,
+	                   KEY_READ,
+	                   &hkey))
+	{
+	  ret = HCR_RegGetIconA(hkey, szDest, sTemp, len, picon_idx);
+	  RegCloseKey(hkey);
+	}
+
+    if (ret)
+        TRACE("-- %s %i\n", szDest, *picon_idx);
+    else
+        TRACE("-- not found\n");
+
+	return ret;
+}
+#endif
+
 /***************************************************************************************
 *	HCR_GetClassName	[internal]
 *
diff --git a/dll/win32/shell32/wine/shell32_main.h b/dll/win32/shell32/wine/shell32_main.h
index a9da0b2e10f..158739f3a6c 100644
--- a/dll/win32/shell32/wine/shell32_main.h
+++ b/dll/win32/shell32/wine/shell32_main.h
@@ -50,6 +50,16 @@ BOOL HCR_GetExecuteCommandW( HKEY hkeyClass, LPCWSTR szClass, LPCWSTR szVerb, LP
 BOOL HCR_GetIconW(LPCWSTR szClass, LPWSTR szDest, LPCWSTR szName, DWORD len, int* picon_idx);
 BOOL HCR_GetClassNameW(REFIID riid, LPWSTR szDest, DWORD len) DECLSPEC_HIDDEN;
 
+#ifdef __REACTOS__
+/* Curren User */
+BOOL HCU_GetIconW(LPCWSTR szClass, LPWSTR szDest, LPCWSTR szName, DWORD len, int* picon_idx) DECLSPEC_HIDDEN;
+BOOL HCU_GetIconA(LPCSTR szClass, LPSTR szDest, LPCSTR szName, DWORD len, int* picon_idx) DECLSPEC_HIDDEN;
+
+/* Local Machine */
+BOOL HLM_GetIconW(int reg_idx, LPWSTR szDest, DWORD len, int* picon_idx) DECLSPEC_HIDDEN;
+BOOL HLM_GetIconA(int reg_idx, LPSTR szDest, DWORD len, int* picon_idx) DECLSPEC_HIDDEN;
+#endif
+
 /* ANSI versions of above functions, supposed to go away as soon as they are not used anymore */
 BOOL HCR_MapTypeToValueA(LPCSTR szExtension, LPSTR szFileType, LONG len, BOOL bPrependDot) DECLSPEC_HIDDEN;
 BOOL HCR_GetIconA(LPCSTR szClass, LPSTR szDest, LPCSTR sName, DWORD len, int* picon_idx);
