diff --git a/reactos/dll/win32/shell32/CDefView.cpp b/reactos/dll/win32/shell32/CDefView.cpp
index 5a9ee99..9faf556 100644
--- a/reactos/dll/win32/shell32/CDefView.cpp
+++ b/reactos/dll/win32/shell32/CDefView.cpp
@@ -93,6 +93,7 @@ class CDefView :
         UINT                      m_uState;
         UINT                      m_cidl;
         PCUITEMID_CHILD_ARRAY     m_apidl;
+        PITEMID_CHILD             m_pidlParent;
         LISTVIEW_SORT_INFO        m_sortInfo;
         ULONG                     m_hNotify;            /* change notification handle */
         HACCEL                    m_hAccel;
@@ -924,6 +925,7 @@ LRESULT CDefView::OnDestroy(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHand
     if (m_hMenu)
         DestroyMenu(m_hMenu);
     RevokeDragDrop(m_hWnd);
+    SHFree(m_pidlParent);
     SHChangeNotifyDeregister(m_hNotify);
     bHandled = FALSE;
     return 0;
@@ -982,12 +984,10 @@ LRESULT CDefView::OnCreate(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandl
     m_pSFParent->QueryInterface(IID_PPV_ARG(IPersistFolder2, &ppf2));
     if (ppf2)
     {
-        PIDLIST_ABSOLUTE pidlParent;
-        ppf2->GetCurFolder(&pidlParent);
+        ppf2->GetCurFolder(&m_pidlParent);
         ntreg.fRecursive = TRUE;
-        ntreg.pidl = pidlParent;
+        ntreg.pidl = m_pidlParent;
         m_hNotify = SHChangeNotifyRegister(m_hWnd, SHCNF_IDLIST, SHCNE_ALLEVENTS, SHV_CHANGE_NOTIFY, 1, &ntreg);
-        SHFree(pidlParent);
     }
 
     m_hAccel = LoadAcceleratorsW(shell32_hInstance, MAKEINTRESOURCEW(IDA_SHELLVIEW));
@@ -1822,6 +1822,7 @@ LRESULT CDefView::OnNotify(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandl
     return 0;
 }
 
+
 /**********************************************************
 * ShellView_OnChange()
 */
@@ -1831,25 +1832,64 @@ LRESULT CDefView::OnChangeNotify(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &
 
     TRACE("(%p)(%p,%p,0x%08x)\n", this, Pidls[0], Pidls[1], lParam);
 
+    struct X {
+        /*
+         * This is just a quick hack to make the desktop work correctly.
+         * ITranslateShellChangeNotify's IsChildID is undocumented, but most likely the way that
+         * a folder should know if it should update upon a change notification.
+         * It is exported by merged folders at a minimum.
+         */
+        static BOOL ILIsParentOrSpecialParent(PCIDLIST_ABSOLUTE pidl1, PCIDLIST_ABSOLUTE pidl2) {
+            if (ILIsParent(pidl1, pidl2, TRUE))
+                return TRUE;
+
+            if (_ILIsDesktop(pidl1)) {
+                LPITEMIDLIST deskpidl;
+                WCHAR wszPath[MAX_PATH];
+                SHGetSpecialFolderPathW(0, wszPath, CSIDL_DESKTOPDIRECTORY, FALSE);
+                deskpidl = SHSimpleIDListFromPathW(wszPath);
+                if (ILIsParent(deskpidl, pidl2, TRUE))
+                {
+                    ILFree(deskpidl);
+                    return TRUE;
+                }
+                ILFree(deskpidl);
+                SHGetSpecialFolderPathW(0, wszPath, CSIDL_COMMON_DESKTOPDIRECTORY, FALSE);
+                deskpidl = SHSimpleIDListFromPathW(wszPath);
+                if (ILIsParent(deskpidl, pidl2, TRUE))
+                {
+                    ILFree(deskpidl);
+                    return TRUE;
+                }
+                ILFree(deskpidl);
+            }
+            return FALSE;
+        }
+    };
+
     switch (lParam)
     {
         case SHCNE_MKDIR:
         case SHCNE_CREATE:
-            LV_AddItem(ILFindLastID(Pidls[0]));
+            if (X::ILIsParentOrSpecialParent(m_pidlParent, Pidls[0]))
+                LV_AddItem(ILFindLastID(Pidls[0]));
             break;
 
         case SHCNE_RMDIR:
         case SHCNE_DELETE:
-            LV_DeleteItem(ILFindLastID(Pidls[0]));
+            if (X::ILIsParentOrSpecialParent(m_pidlParent, Pidls[0]))
+                LV_DeleteItem(ILFindLastID(Pidls[0]));
             break;
 
         case SHCNE_RENAMEFOLDER:
         case SHCNE_RENAMEITEM:
-            LV_RenameItem(ILFindLastID(Pidls[0]), ILFindLastID(Pidls[1]));
+            if (X::ILIsParentOrSpecialParent(m_pidlParent, Pidls[0]))
+                LV_RenameItem(ILFindLastID(Pidls[0]), ILFindLastID(Pidls[1]));
             break;
 
         case SHCNE_UPDATEITEM:
-            LV_RenameItem(ILFindLastID(Pidls[0]), ILFindLastID(Pidls[0]));
+            if (X::ILIsParentOrSpecialParent(m_pidlParent, Pidls[0]))
+                LV_RenameItem(ILFindLastID(Pidls[0]), ILFindLastID(Pidls[0]));
             break;
 
         case SHCNE_UPDATEDIR:
diff --git a/reactos/dll/win32/shell32/wine/changenotify.c b/reactos/dll/win32/shell32/wine/changenotify.c
index 8da87dc..5bed3f2 100644
--- a/reactos/dll/win32/shell32/wine/changenotify.c
+++ b/reactos/dll/win32/shell32/wine/changenotify.c
@@ -255,28 +255,7 @@ static BOOL should_notify( LPCITEMIDLIST changed, LPCITEMIDLIST watched, BOOL su
         return TRUE;
     if( sub && ILIsParent( watched, changed, FALSE ) )
         return TRUE;
-#ifdef __REACTOS__
-    if (sub && _ILIsDesktop(watched)) {
-        LPITEMIDLIST deskpidl;
-        WCHAR wszPath[MAX_PATH];
-        SHGetSpecialFolderPathW(0, wszPath, CSIDL_DESKTOPDIRECTORY, FALSE);
-        deskpidl = SHSimpleIDListFromPathW(wszPath);
-        if (ILIsParent(deskpidl, changed, TRUE))
-        {
-            ILFree(deskpidl);
-            return TRUE;
-        }
-        ILFree(deskpidl);
-        SHGetSpecialFolderPathW(0, wszPath, CSIDL_COMMON_DESKTOPDIRECTORY, FALSE);
-        deskpidl = SHSimpleIDListFromPathW(wszPath);
-        if (ILIsParent(deskpidl, changed, TRUE))
-        {
-            ILFree(deskpidl);
-            return TRUE;
-        }
-        ILFree(deskpidl);
-    }
-#endif
+
     return FALSE;
 }
 
