https://git.reactos.org/?p=reactos.git;a=commitdiff;h=46ff964e22a969377ec31…
commit 46ff964e22a969377ec312cbe6b7731a7f50942b
Author:     Katayama Hirofumi MZ <katayama.hirofumi.mz(a)gmail.com>
AuthorDate: Tue Aug 18 05:30:54 2020 +0900
Commit:     GitHub <noreply(a)github.com>
CommitDate: Tue Aug 18 05:30:54 2020 +0900
    [SHELL32] Implement Move To Folder (#3056)
    - Add context menu item "Mo&ve to folder..." and implement the action.
    - Implement the "Mo&ve to folder..." menu item of "Edit" menu
of Explorer.
    CORE-11132
---
 dll/win32/shell32/CCopyToMenu.cpp                  |   3 +-
 .../shell32/{CCopyToMenu.h => CCopyToMoveToMenu.h} |  55 +++++++++-
 dll/win32/shell32/CDefView.cpp                     |   1 +
 dll/win32/shell32/CDefaultContextMenu.cpp          |  22 +++-
 dll/win32/shell32/CMakeLists.txt                   |   1 +
 .../shell32/{CCopyToMenu.cpp => CMoveToMenu.cpp}   | 111 ++++++++-------------
 dll/win32/shell32/lang/bg-BG.rc                    |   4 +
 dll/win32/shell32/lang/ca-ES.rc                    |   4 +
 dll/win32/shell32/lang/cs-CZ.rc                    |   4 +
 dll/win32/shell32/lang/da-DK.rc                    |   4 +
 dll/win32/shell32/lang/de-DE.rc                    |   4 +
 dll/win32/shell32/lang/el-GR.rc                    |   4 +
 dll/win32/shell32/lang/en-GB.rc                    |   4 +
 dll/win32/shell32/lang/en-US.rc                    |   4 +
 dll/win32/shell32/lang/es-ES.rc                    |   4 +
 dll/win32/shell32/lang/et-EE.rc                    |   4 +
 dll/win32/shell32/lang/fi-FI.rc                    |   4 +
 dll/win32/shell32/lang/fr-FR.rc                    |   4 +
 dll/win32/shell32/lang/he-IL.rc                    |   4 +
 dll/win32/shell32/lang/hi-IN.rc                    |   4 +
 dll/win32/shell32/lang/hu-HU.rc                    |   4 +
 dll/win32/shell32/lang/id-ID.rc                    |   4 +
 dll/win32/shell32/lang/it-IT.rc                    |   4 +
 dll/win32/shell32/lang/ja-JP.rc                    |   4 +
 dll/win32/shell32/lang/ko-KR.rc                    |   4 +
 dll/win32/shell32/lang/nl-NL.rc                    |   4 +
 dll/win32/shell32/lang/no-NO.rc                    |   4 +
 dll/win32/shell32/lang/pl-PL.rc                    |   4 +
 dll/win32/shell32/lang/pt-BR.rc                    |   4 +
 dll/win32/shell32/lang/pt-PT.rc                    |   4 +
 dll/win32/shell32/lang/ro-RO.rc                    |   4 +
 dll/win32/shell32/lang/ru-RU.rc                    |   4 +
 dll/win32/shell32/lang/sk-SK.rc                    |   4 +
 dll/win32/shell32/lang/sl-SI.rc                    |   4 +
 dll/win32/shell32/lang/sq-AL.rc                    |   4 +
 dll/win32/shell32/lang/sv-SE.rc                    |   4 +
 dll/win32/shell32/lang/tr-TR.rc                    |   4 +
 dll/win32/shell32/lang/uk-UA.rc                    |   4 +
 dll/win32/shell32/lang/zh-CN.rc                    |   4 +
 dll/win32/shell32/lang/zh-TW.rc                    |   4 +
 dll/win32/shell32/precomp.h                        |   2 +-
 dll/win32/shell32/res/rgs/movetomenu.rgs           |  26 +++++
 dll/win32/shell32/rgs_res.rc                       |   1 +
 dll/win32/shell32/shell32.cpp                      |   1 +
 dll/win32/shell32/shresdef.h                       |   6 ++
 45 files changed, 286 insertions(+), 79 deletions(-)
diff --git a/dll/win32/shell32/CCopyToMenu.cpp b/dll/win32/shell32/CCopyToMenu.cpp
index bc1325bb86d..a20ed449abe 100644
--- a/dll/win32/shell32/CCopyToMenu.cpp
+++ b/dll/win32/shell32/CCopyToMenu.cpp
@@ -9,8 +9,7 @@
 WINE_DEFAULT_DEBUG_CHANNEL(shell);
-static HRESULT
-_GetCidlFromDataObject(IDataObject *pDataObject, CIDA** ppcida)
+HRESULT _GetCidlFromDataObject(IDataObject *pDataObject, CIDA** ppcida)
 {
     static CLIPFORMAT s_cfHIDA = 0;
     if (s_cfHIDA == 0)
diff --git a/dll/win32/shell32/CCopyToMenu.h b/dll/win32/shell32/CCopyToMoveToMenu.h
similarity index 51%
rename from dll/win32/shell32/CCopyToMenu.h
rename to dll/win32/shell32/CCopyToMoveToMenu.h
index a56cba111de..da61ca14284 100644
--- a/dll/win32/shell32/CCopyToMenu.h
+++ b/dll/win32/shell32/CCopyToMoveToMenu.h
@@ -1,11 +1,13 @@
 /*
  * PROJECT:     shell32
  * LICENSE:     GPL-2.0-or-later (
https://spdx.org/licenses/GPL-2.0-or-later)
- * PURPOSE:     CopyTo implementation
+ * PURPOSE:     CopyTo and MoveTo implementation
  * COPYRIGHT:   Copyright 2020 Katayama Hirofumi MZ (katayama.hirofumi.mz(a)gmail.com)
  */
 #pragma once
+HRESULT _GetCidlFromDataObject(IDataObject *pDataObject, CIDA** ppcida);
+
 class CCopyToMenu :
     public CComCoClass<CCopyToMenu, &CLSID_CopyToMenu>,
     public CComObjectRootEx<CComMultiThreadModelNoCS>,
@@ -56,3 +58,54 @@ public:
         COM_INTERFACE_ENTRY_IID(IID_IObjectWithSite, IObjectWithSite)
     END_COM_MAP()
 };
+
+class CMoveToMenu :
+    public CComCoClass<CMoveToMenu, &CLSID_MoveToMenu>,
+    public CComObjectRootEx<CComMultiThreadModelNoCS>,
+    public IContextMenu2,
+    public IObjectWithSite,
+    public IShellExtInit
+{
+protected:
+    UINT m_idCmdFirst, m_idCmdLast, m_idCmdMoveTo;
+    CComPtr<IDataObject> m_pDataObject;
+    CComPtr<IUnknown> m_pSite;
+
+    HRESULT DoMoveToFolder(LPCMINVOKECOMMANDINFO lpici);
+    HRESULT DoRealMove(LPCMINVOKECOMMANDINFO lpici, PCUIDLIST_ABSOLUTE pidl);
+    CStringW DoGetFileTitle();
+
+public:
+    CComHeapPtr<ITEMIDLIST> m_pidlFolder;
+    WNDPROC m_fnOldWndProc;
+
+    CMoveToMenu();
+    ~CMoveToMenu();
+
+    // IContextMenu
+    virtual HRESULT WINAPI QueryContextMenu(HMENU hMenu, UINT indexMenu, UINT idCmdFirst,
UINT idCmdLast, UINT uFlags);
+    virtual HRESULT WINAPI InvokeCommand(LPCMINVOKECOMMANDINFO lpcmi);
+    virtual HRESULT WINAPI GetCommandString(UINT_PTR idCommand, UINT uFlags, UINT
*lpReserved, LPSTR lpszName, UINT uMaxNameLen);
+
+    // IContextMenu2
+    virtual HRESULT WINAPI HandleMenuMsg(UINT uMsg, WPARAM wParam, LPARAM lParam);
+
+    // IShellExtInit
+    virtual HRESULT WINAPI Initialize(PCIDLIST_ABSOLUTE pidlFolder, IDataObject *pdtobj,
HKEY hkeyProgID);
+
+    // IObjectWithSite
+    virtual HRESULT WINAPI SetSite(IUnknown *pUnkSite);
+    virtual HRESULT WINAPI GetSite(REFIID riid, void **ppvSite);
+
+    DECLARE_REGISTRY_RESOURCEID(IDR_MOVETOMENU)
+    DECLARE_NOT_AGGREGATABLE(CMoveToMenu)
+
+    DECLARE_PROTECT_FINAL_CONSTRUCT()
+
+    BEGIN_COM_MAP(CMoveToMenu)
+        COM_INTERFACE_ENTRY_IID(IID_IContextMenu2, IContextMenu2)
+        COM_INTERFACE_ENTRY_IID(IID_IContextMenu, IContextMenu)
+        COM_INTERFACE_ENTRY_IID(IID_IShellExtInit, IShellExtInit)
+        COM_INTERFACE_ENTRY_IID(IID_IObjectWithSite, IObjectWithSite)
+    END_COM_MAP()
+};
diff --git a/dll/win32/shell32/CDefView.cpp b/dll/win32/shell32/CDefView.cpp
index a42d4d495cb..6948e572958 100644
--- a/dll/win32/shell32/CDefView.cpp
+++ b/dll/win32/shell32/CDefView.cpp
@@ -1823,6 +1823,7 @@ LRESULT CDefView::OnCommand(UINT uMsg, WPARAM wParam, LPARAM lParam,
BOOL &bHand
         case FCIDM_SHVIEW_RENAME:
         case FCIDM_SHVIEW_PROPERTIES:
         case FCIDM_SHVIEW_COPYTO:
+        case FCIDM_SHVIEW_MOVETO:
             return OnExplorerCommand(dwCmdID, TRUE);
         case FCIDM_SHVIEW_INSERT:
diff --git a/dll/win32/shell32/CDefaultContextMenu.cpp
b/dll/win32/shell32/CDefaultContextMenu.cpp
index a717078f70b..30d1433df65 100644
--- a/dll/win32/shell32/CDefaultContextMenu.cpp
+++ b/dll/win32/shell32/CDefaultContextMenu.cpp
@@ -49,6 +49,7 @@ struct _StaticInvokeCommandMap_
     { "properties", FCIDM_SHVIEW_PROPERTIES},
     { "rename", FCIDM_SHVIEW_RENAME},
     { "copyto", FCIDM_SHVIEW_COPYTO },
+    { "moveto", FCIDM_SHVIEW_MOVETO },
 };
 class CDefaultContextMenu :
@@ -95,7 +96,7 @@ class CDefaultContextMenu :
         HRESULT DoRename(LPCMINVOKECOMMANDINFO lpcmi);
         HRESULT DoProperties(LPCMINVOKECOMMANDINFO lpcmi);
         HRESULT DoCreateNewFolder(LPCMINVOKECOMMANDINFO lpici);
-        HRESULT DoCopyToFolder(LPCMINVOKECOMMANDINFO lpici);
+        HRESULT DoCopyToMoveToFolder(LPCMINVOKECOMMANDINFO lpici, BOOL bCopy);
         HRESULT InvokeShellExt(LPCMINVOKECOMMANDINFO lpcmi);
         HRESULT InvokeRegVerb(LPCMINVOKECOMMANDINFO lpcmi);
         DWORD BrowserFlagsFromVerb(LPCMINVOKECOMMANDINFO lpcmi, PStaticShellEntry
pEntry);
@@ -895,7 +896,7 @@ CDefaultContextMenu::DoProperties(
 }
 HRESULT
-CDefaultContextMenu::DoCopyToFolder(LPCMINVOKECOMMANDINFO lpici)
+CDefaultContextMenu::DoCopyToMoveToFolder(LPCMINVOKECOMMANDINFO lpici, BOOL bCopy)
 {
     HRESULT hr = E_FAIL;
     if (!m_pDataObj)
@@ -905,7 +906,12 @@ CDefaultContextMenu::DoCopyToFolder(LPCMINVOKECOMMANDINFO lpici)
     }
     CComPtr<IContextMenu> pContextMenu;
-    hr = SHCoCreateInstance(NULL, &CLSID_CopyToMenu, NULL, IID_PPV_ARG(IContextMenu,
&pContextMenu));
+    if (bCopy)
+        hr = SHCoCreateInstance(NULL, &CLSID_CopyToMenu, NULL,
+                                IID_PPV_ARG(IContextMenu, &pContextMenu));
+    else
+        hr = SHCoCreateInstance(NULL, &CLSID_MoveToMenu, NULL,
+                                IID_PPV_ARG(IContextMenu, &pContextMenu));
     if (FAILED_UNEXPECTEDLY(hr))
         return hr;
@@ -918,7 +924,10 @@ CDefaultContextMenu::DoCopyToFolder(LPCMINVOKECOMMANDINFO lpici)
     if (FAILED_UNEXPECTEDLY(hr))
         return hr;
-    lpici->lpVerb = "copyto";
+    if (bCopy)
+        lpici->lpVerb = "copyto";
+    else
+        lpici->lpVerb = "moveto";
     return pContextMenu->InvokeCommand(lpici);
 }
@@ -1279,7 +1288,10 @@ CDefaultContextMenu::InvokeCommand(
         Result = DoCreateNewFolder(&LocalInvokeInfo);
         break;
     case FCIDM_SHVIEW_COPYTO:
-        Result = DoCopyToFolder(&LocalInvokeInfo);
+        Result = DoCopyToMoveToFolder(&LocalInvokeInfo, TRUE);
+        break;
+    case FCIDM_SHVIEW_MOVETO:
+        Result = DoCopyToMoveToFolder(&LocalInvokeInfo, FALSE);
         break;
     default:
         Result = E_INVALIDARG;
diff --git a/dll/win32/shell32/CMakeLists.txt b/dll/win32/shell32/CMakeLists.txt
index aa51a47fe43..5c812e953e4 100644
--- a/dll/win32/shell32/CMakeLists.txt
+++ b/dll/win32/shell32/CMakeLists.txt
@@ -84,6 +84,7 @@ list(APPEND SOURCE
     CNewMenu.cpp
     CSendToMenu.cpp
     CCopyToMenu.cpp
+    CMoveToMenu.cpp
     CShellDispatch.cpp
     CFolder.cpp
     CFolderItems.cpp
diff --git a/dll/win32/shell32/CCopyToMenu.cpp b/dll/win32/shell32/CMoveToMenu.cpp
similarity index 73%
copy from dll/win32/shell32/CCopyToMenu.cpp
copy to dll/win32/shell32/CMoveToMenu.cpp
index bc1325bb86d..020a8e70b8a 100644
--- a/dll/win32/shell32/CCopyToMenu.cpp
+++ b/dll/win32/shell32/CMoveToMenu.cpp
@@ -1,7 +1,7 @@
 /*
  * PROJECT:     shell32
  * LICENSE:     GPL-2.0-or-later (
https://spdx.org/licenses/GPL-2.0-or-later)
- * PURPOSE:     CopyTo implementation
+ * PURPOSE:     MoveTo implementation
  * COPYRIGHT:   Copyright 2020 Katayama Hirofumi MZ (katayama.hirofumi.mz(a)gmail.com)
  */
@@ -9,48 +9,14 @@
 WINE_DEFAULT_DEBUG_CHANNEL(shell);
-static HRESULT
-_GetCidlFromDataObject(IDataObject *pDataObject, CIDA** ppcida)
-{
-    static CLIPFORMAT s_cfHIDA = 0;
-    if (s_cfHIDA == 0)
-    {
-        s_cfHIDA =
static_cast<CLIPFORMAT>(RegisterClipboardFormatW(CFSTR_SHELLIDLIST));
-    }
-
-    FORMATETC fmt = { s_cfHIDA, NULL, DVASPECT_CONTENT, -1, TYMED_HGLOBAL };
-    STGMEDIUM medium;
-
-    HRESULT hr = pDataObject->GetData(&fmt, &medium);
-    if (FAILED_UNEXPECTEDLY(hr))
-        return hr;
-
-    LPVOID lpSrc = GlobalLock(medium.hGlobal);
-    SIZE_T cbSize = GlobalSize(medium.hGlobal);
-
-    *ppcida = reinterpret_cast<CIDA *>(::CoTaskMemAlloc(cbSize));
-    if (*ppcida)
-    {
-        memcpy(*ppcida, lpSrc, cbSize);
-        hr = S_OK;
-    }
-    else
-    {
-        ERR("Out of memory\n");
-        hr = E_FAIL;
-    }
-    ReleaseStgMedium(&medium);
-    return hr;
-}
-
-CCopyToMenu::CCopyToMenu() :
+CMoveToMenu::CMoveToMenu() :
     m_idCmdFirst(0),
     m_idCmdLast(0),
-    m_idCmdCopyTo(-1)
+    m_idCmdMoveTo(-1)
 {
 }
-CCopyToMenu::~CCopyToMenu()
+CMoveToMenu::~CMoveToMenu()
 {
 }
@@ -59,8 +25,8 @@ CCopyToMenu::~CCopyToMenu()
 static LRESULT CALLBACK
 WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
 {
-    CCopyToMenu *this_ =
-        reinterpret_cast<CCopyToMenu *>(GetWindowLongPtr(hwnd, GWLP_USERDATA));
+    CMoveToMenu *this_ =
+        reinterpret_cast<CMoveToMenu *>(GetWindowLongPtr(hwnd, GWLP_USERDATA));
     switch (uMsg)
     {
@@ -74,27 +40,27 @@ WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
 static int CALLBACK
 BrowseCallbackProc(HWND hwnd, UINT uMsg, LPARAM lParam, LPARAM lpData)
 {
-    CCopyToMenu *this_ =
-        reinterpret_cast<CCopyToMenu *>(GetWindowLongPtr(hwnd, GWLP_USERDATA));
+    CMoveToMenu *this_ =
+        reinterpret_cast<CMoveToMenu *>(GetWindowLongPtr(hwnd, GWLP_USERDATA));
     switch (uMsg)
     {
         case BFFM_INITIALIZED:
         {
             SetWindowLongPtr(hwnd, GWLP_USERDATA, lpData);
-            this_ = reinterpret_cast<CCopyToMenu *>(lpData);
+            this_ = reinterpret_cast<CMoveToMenu *>(lpData);
             // Select initial directory
             SendMessageW(hwnd, BFFM_SETSELECTION, FALSE,
reinterpret_cast<LPARAM>(static_cast<LPCITEMIDLIST>(this_->m_pidlFolder)));
             // Set caption
-            CString strCaption(MAKEINTRESOURCEW(IDS_COPYITEMS));
+            CString strCaption(MAKEINTRESOURCEW(IDS_MOVEITEMS));
             SetWindowTextW(hwnd, strCaption);
             // Set OK button text
-            CString strCopy(MAKEINTRESOURCEW(IDS_COPYBUTTON));
-            SetDlgItemText(hwnd, IDOK, strCopy);
+            CString strMove(MAKEINTRESOURCEW(IDS_MOVEBUTTON));
+            SetDlgItemText(hwnd, IDOK, strMove);
             // Subclassing
             this_->m_fnOldWndProc =
@@ -126,7 +92,7 @@ BrowseCallbackProc(HWND hwnd, UINT uMsg, LPARAM lParam, LPARAM lpData)
     return FALSE;
 }
-HRESULT CCopyToMenu::DoRealCopy(LPCMINVOKECOMMANDINFO lpici, LPCITEMIDLIST pidl)
+HRESULT CMoveToMenu::DoRealMove(LPCMINVOKECOMMANDINFO lpici, LPCITEMIDLIST pidl)
 {
     CComHeapPtr<CIDA> pCIDA;
     HRESULT hr = _GetCidlFromDataObject(m_pDataObject, &pCIDA);
@@ -178,14 +144,14 @@ HRESULT CCopyToMenu::DoRealCopy(LPCMINVOKECOMMANDINFO lpici,
LPCITEMIDLIST pidl)
     }
     SHFILEOPSTRUCTW op = { lpici->hwnd };
-    op.wFunc = FO_COPY;
+    op.wFunc = FO_MOVE;
     op.pFrom = strFiles;
     op.pTo = szPath;
     op.fFlags = FOF_ALLOWUNDO;
     return ((SHFileOperation(&op) == 0) ? S_OK : E_FAIL);
 }
-CStringW CCopyToMenu::DoGetFileTitle()
+CStringW CMoveToMenu::DoGetFileTitle()
 {
     CStringW ret = L"(file)";
@@ -222,12 +188,12 @@ CStringW CCopyToMenu::DoGetFileTitle()
     return ret;
 }
-HRESULT CCopyToMenu::DoCopyToFolder(LPCMINVOKECOMMANDINFO lpici)
+HRESULT CMoveToMenu::DoMoveToFolder(LPCMINVOKECOMMANDINFO lpici)
 {
     WCHAR wszPath[MAX_PATH];
     HRESULT hr = E_FAIL;
-    TRACE("DoCopyToFolder(%p)\n", lpici);
+    TRACE("DoMoveToFolder(%p)\n", lpici);
     if (!SHGetPathFromIDListW(m_pidlFolder, wszPath))
     {
@@ -237,7 +203,7 @@ HRESULT CCopyToMenu::DoCopyToFolder(LPCMINVOKECOMMANDINFO lpici)
     CStringW strFileTitle = DoGetFileTitle();
     CStringW strTitle;
-    strTitle.Format(IDS_COPYTOTITLE, static_cast<LPCWSTR>(strFileTitle));
+    strTitle.Format(IDS_MOVETOTITLE, static_cast<LPCWSTR>(strFileTitle));
     BROWSEINFOW info = { lpici->hwnd };
     info.pidlRoot = NULL;
@@ -248,14 +214,14 @@ HRESULT CCopyToMenu::DoCopyToFolder(LPCMINVOKECOMMANDINFO lpici)
     CComHeapPtr<ITEMIDLIST> pidl(SHBrowseForFolder(&info));
     if (pidl)
     {
-        hr = DoRealCopy(lpici, pidl);
+        hr = DoRealMove(lpici, pidl);
     }
     return hr;
 }
 HRESULT WINAPI
-CCopyToMenu::QueryContextMenu(HMENU hMenu,
+CMoveToMenu::QueryContextMenu(HMENU hMenu,
                               UINT indexMenu,
                               UINT idCmdFirst,
                               UINT idCmdLast,
@@ -264,17 +230,22 @@ CCopyToMenu::QueryContextMenu(HMENU hMenu,
     MENUITEMINFOW mii;
     UINT Count = 0;
-    TRACE("CCopyToMenu::QueryContextMenu(%p, %u, %u, %u, %u)\n",
+    TRACE("CMoveToMenu::QueryContextMenu(%p, %u, %u, %u, %u)\n",
           hMenu, indexMenu, idCmdFirst, idCmdLast, uFlags);
     m_idCmdFirst = m_idCmdLast = idCmdFirst;
     // insert separator if necessary
+    CStringW strCopyTo(MAKEINTRESOURCEW(IDS_COPYTOMENU));
+    WCHAR szBuff[128];
     ZeroMemory(&mii, sizeof(mii));
     mii.cbSize = sizeof(mii);
     mii.fMask = MIIM_TYPE;
+    mii.dwTypeData = szBuff;
+    mii.cch = _countof(szBuff);
     if (GetMenuItemInfoW(hMenu, indexMenu - 1, TRUE, &mii) &&
-        mii.fType != MFT_SEPARATOR)
+        mii.fType != MFT_SEPARATOR &&
+        !(mii.fType == MFT_STRING && CStringW(szBuff) == strCopyTo))
     {
         ZeroMemory(&mii, sizeof(mii));
         mii.cbSize = sizeof(mii);
@@ -287,8 +258,8 @@ CCopyToMenu::QueryContextMenu(HMENU hMenu,
         }
     }
-    // insert "Copy to folder..."
-    CStringW strText(MAKEINTRESOURCEW(IDS_COPYTOMENU));
+    // insert "Move to folder..."
+    CStringW strText(MAKEINTRESOURCEW(IDS_MOVETOMENU));
     ZeroMemory(&mii, sizeof(mii));
     mii.cbSize = sizeof(mii);
     mii.fMask = MIIM_ID | MIIM_TYPE;
@@ -298,7 +269,7 @@ CCopyToMenu::QueryContextMenu(HMENU hMenu,
     mii.wID = m_idCmdLast;
     if (InsertMenuItemW(hMenu, indexMenu, TRUE, &mii))
     {
-        m_idCmdCopyTo = m_idCmdLast++;
+        m_idCmdMoveTo = m_idCmdLast++;
         ++indexMenu;
         ++Count;
     }
@@ -307,23 +278,23 @@ CCopyToMenu::QueryContextMenu(HMENU hMenu,
 }
 HRESULT WINAPI
-CCopyToMenu::InvokeCommand(LPCMINVOKECOMMANDINFO lpici)
+CMoveToMenu::InvokeCommand(LPCMINVOKECOMMANDINFO lpici)
 {
     HRESULT hr = E_FAIL;
-    TRACE("CCopyToMenu::InvokeCommand(%p)\n", lpici);
+    TRACE("CMoveToMenu::InvokeCommand(%p)\n", lpici);
     if (HIWORD(lpici->lpVerb) == 0)
     {
-        if (m_idCmdFirst + LOWORD(lpici->lpVerb) == m_idCmdCopyTo)
+        if (m_idCmdFirst + LOWORD(lpici->lpVerb) == m_idCmdMoveTo)
         {
-            hr = DoCopyToFolder(lpici);
+            hr = DoMoveToFolder(lpici);
         }
     }
     else
     {
-        if (::lstrcmpiA(lpici->lpVerb, "copyto") == 0)
+        if (::lstrcmpiA(lpici->lpVerb, "moveto") == 0)
         {
-            hr = DoCopyToFolder(lpici);
+            hr = DoMoveToFolder(lpici);
         }
     }
@@ -331,7 +302,7 @@ CCopyToMenu::InvokeCommand(LPCMINVOKECOMMANDINFO lpici)
 }
 HRESULT WINAPI
-CCopyToMenu::GetCommandString(UINT_PTR idCmd,
+CMoveToMenu::GetCommandString(UINT_PTR idCmd,
                               UINT uType,
                               UINT *pwReserved,
                               LPSTR pszName,
@@ -344,14 +315,14 @@ CCopyToMenu::GetCommandString(UINT_PTR idCmd,
 }
 HRESULT WINAPI
-CCopyToMenu::HandleMenuMsg(UINT uMsg, WPARAM wParam, LPARAM lParam)
+CMoveToMenu::HandleMenuMsg(UINT uMsg, WPARAM wParam, LPARAM lParam)
 {
     TRACE("This %p uMsg %x\n", this, uMsg);
     return E_NOTIMPL;
 }
 HRESULT WINAPI
-CCopyToMenu::Initialize(PCIDLIST_ABSOLUTE pidlFolder,
+CMoveToMenu::Initialize(PCIDLIST_ABSOLUTE pidlFolder,
                         IDataObject *pdtobj, HKEY hkeyProgID)
 {
     m_pidlFolder.Attach(ILClone(pidlFolder));
@@ -359,13 +330,13 @@ CCopyToMenu::Initialize(PCIDLIST_ABSOLUTE pidlFolder,
     return S_OK;
 }
-HRESULT WINAPI CCopyToMenu::SetSite(IUnknown *pUnkSite)
+HRESULT WINAPI CMoveToMenu::SetSite(IUnknown *pUnkSite)
 {
     m_pSite = pUnkSite;
     return S_OK;
 }
-HRESULT WINAPI CCopyToMenu::GetSite(REFIID riid, void **ppvSite)
+HRESULT WINAPI CMoveToMenu::GetSite(REFIID riid, void **ppvSite)
 {
     if (!m_pSite)
         return E_FAIL;
diff --git a/dll/win32/shell32/lang/bg-BG.rc b/dll/win32/shell32/lang/bg-BG.rc
index 56ca1049511..bbd769dbfe9 100644
--- a/dll/win32/shell32/lang/bg-BG.rc
+++ b/dll/win32/shell32/lang/bg-BG.rc
@@ -1003,4 +1003,8 @@ BEGIN
     IDS_COPYTOTITLE "Select the place where you want to copy '%s'. Then
click the Copy button."
     IDS_COPYITEMS "Copy Items"
     IDS_COPYBUTTON "Copy"
+    IDS_MOVETOMENU "Mo&ve to folder..."
+    IDS_MOVETOTITLE "Select the place where you want to move '%s' to. Then
click the Move button."
+    IDS_MOVEITEMS "Move Items"
+    IDS_MOVEBUTTON "Move"
 END
diff --git a/dll/win32/shell32/lang/ca-ES.rc b/dll/win32/shell32/lang/ca-ES.rc
index 8e920649408..5384ca39295 100644
--- a/dll/win32/shell32/lang/ca-ES.rc
+++ b/dll/win32/shell32/lang/ca-ES.rc
@@ -1002,4 +1002,8 @@ BEGIN
     IDS_COPYTOTITLE "Select the place where you want to copy '%s'. Then
click the Copy button."
     IDS_COPYITEMS "Copy Items"
     IDS_COPYBUTTON "Copy"
+    IDS_MOVETOMENU "Mo&ve to folder..."
+    IDS_MOVETOTITLE "Select the place where you want to move '%s' to. Then
click the Move button."
+    IDS_MOVEITEMS "Move Items"
+    IDS_MOVEBUTTON "Move"
 END
diff --git a/dll/win32/shell32/lang/cs-CZ.rc b/dll/win32/shell32/lang/cs-CZ.rc
index 4c86a7c5869..c5bcb89937c 100644
--- a/dll/win32/shell32/lang/cs-CZ.rc
+++ b/dll/win32/shell32/lang/cs-CZ.rc
@@ -1008,4 +1008,8 @@ BEGIN
     IDS_COPYTOTITLE "Select the place where you want to copy '%s'. Then
click the Copy button."
     IDS_COPYITEMS "Copy Items"
     IDS_COPYBUTTON "Copy"
+    IDS_MOVETOMENU "Mo&ve to folder..."
+    IDS_MOVETOTITLE "Select the place where you want to move '%s' to. Then
click the Move button."
+    IDS_MOVEITEMS "Move Items"
+    IDS_MOVEBUTTON "Move"
 END
diff --git a/dll/win32/shell32/lang/da-DK.rc b/dll/win32/shell32/lang/da-DK.rc
index 6bf29e180b5..f7b56f0c689 100644
--- a/dll/win32/shell32/lang/da-DK.rc
+++ b/dll/win32/shell32/lang/da-DK.rc
@@ -1008,4 +1008,8 @@ BEGIN
     IDS_COPYTOTITLE "Select the place where you want to copy '%s'. Then
click the Copy button."
     IDS_COPYITEMS "Copy Items"
     IDS_COPYBUTTON "Copy"
+    IDS_MOVETOMENU "Mo&ve to folder..."
+    IDS_MOVETOTITLE "Select the place where you want to move '%s' to. Then
click the Move button."
+    IDS_MOVEITEMS "Move Items"
+    IDS_MOVEBUTTON "Move"
 END
diff --git a/dll/win32/shell32/lang/de-DE.rc b/dll/win32/shell32/lang/de-DE.rc
index 42e29f229e3..54ea2e4af95 100644
--- a/dll/win32/shell32/lang/de-DE.rc
+++ b/dll/win32/shell32/lang/de-DE.rc
@@ -1003,4 +1003,8 @@ BEGIN
     IDS_COPYTOTITLE "Wählen Sie den Ort, in den '%s' kopiert werden soll.
Klicken Sie anschließend auf Kopieren."
     IDS_COPYITEMS "Elemente kopieren"
     IDS_COPYBUTTON "Kopieren"
+    IDS_MOVETOMENU "In Ordner &verschieben..."
+    IDS_MOVETOTITLE "Wählen Sie den Ort, in den '%s' verschoben werden soll.
Klicken Sie anschließend auf Verschieben."
+    IDS_MOVEITEMS "Elemente verschieben"
+    IDS_MOVEBUTTON "Verschieben"
 END
diff --git a/dll/win32/shell32/lang/el-GR.rc b/dll/win32/shell32/lang/el-GR.rc
index fd2bb3cfc42..897ce7ce517 100644
--- a/dll/win32/shell32/lang/el-GR.rc
+++ b/dll/win32/shell32/lang/el-GR.rc
@@ -1002,4 +1002,8 @@ BEGIN
     IDS_COPYTOTITLE "Select the place where you want to copy '%s'. Then
click the Copy button."
     IDS_COPYITEMS "Copy Items"
     IDS_COPYBUTTON "Copy"
+    IDS_MOVETOMENU "Mo&ve to folder..."
+    IDS_MOVETOTITLE "Select the place where you want to move '%s' to. Then
click the Move button."
+    IDS_MOVEITEMS "Move Items"
+    IDS_MOVEBUTTON "Move"
 END
diff --git a/dll/win32/shell32/lang/en-GB.rc b/dll/win32/shell32/lang/en-GB.rc
index 4d1f9e55495..ccbbe8e1f09 100644
--- a/dll/win32/shell32/lang/en-GB.rc
+++ b/dll/win32/shell32/lang/en-GB.rc
@@ -1002,4 +1002,8 @@ BEGIN
     IDS_COPYTOTITLE "Select the place where you want to copy '%s'. Then
click the Copy button."
     IDS_COPYITEMS "Copy Items"
     IDS_COPYBUTTON "Copy"
+    IDS_MOVETOMENU "Mo&ve to folder..."
+    IDS_MOVETOTITLE "Select the place where you want to move '%s' to. Then
click the Move button."
+    IDS_MOVEITEMS "Move Items"
+    IDS_MOVEBUTTON "Move"
 END
diff --git a/dll/win32/shell32/lang/en-US.rc b/dll/win32/shell32/lang/en-US.rc
index 21f06a42d42..b7b8d80b273 100644
--- a/dll/win32/shell32/lang/en-US.rc
+++ b/dll/win32/shell32/lang/en-US.rc
@@ -1002,4 +1002,8 @@ BEGIN
     IDS_COPYTOTITLE "Select the place where you want to copy '%s'. Then
click the Copy button."
     IDS_COPYITEMS "Copy Items"
     IDS_COPYBUTTON "Copy"
+    IDS_MOVETOMENU "Mo&ve to folder..."
+    IDS_MOVETOTITLE "Select the place where you want to move '%s' to. Then
click the Move button."
+    IDS_MOVEITEMS "Move Items"
+    IDS_MOVEBUTTON "Move"
 END
diff --git a/dll/win32/shell32/lang/es-ES.rc b/dll/win32/shell32/lang/es-ES.rc
index bdf04fd74a4..4cad05f2368 100644
--- a/dll/win32/shell32/lang/es-ES.rc
+++ b/dll/win32/shell32/lang/es-ES.rc
@@ -1011,4 +1011,8 @@ BEGIN
     IDS_COPYTOTITLE "Select the place where you want to copy '%s'. Then
click the Copy button."
     IDS_COPYITEMS "Copy Items"
     IDS_COPYBUTTON "Copy"
+    IDS_MOVETOMENU "Mo&ve to folder..."
+    IDS_MOVETOTITLE "Select the place where you want to move '%s' to. Then
click the Move button."
+    IDS_MOVEITEMS "Move Items"
+    IDS_MOVEBUTTON "Move"
 END
diff --git a/dll/win32/shell32/lang/et-EE.rc b/dll/win32/shell32/lang/et-EE.rc
index 8585ad68b08..aa53f7bd374 100644
--- a/dll/win32/shell32/lang/et-EE.rc
+++ b/dll/win32/shell32/lang/et-EE.rc
@@ -1009,4 +1009,8 @@ BEGIN
     IDS_COPYTOTITLE "Select the place where you want to copy '%s'. Then
click the Copy button."
     IDS_COPYITEMS "Copy Items"
     IDS_COPYBUTTON "Copy"
+    IDS_MOVETOMENU "Mo&ve to folder..."
+    IDS_MOVETOTITLE "Select the place where you want to move '%s' to. Then
click the Move button."
+    IDS_MOVEITEMS "Move Items"
+    IDS_MOVEBUTTON "Move"
 END
diff --git a/dll/win32/shell32/lang/fi-FI.rc b/dll/win32/shell32/lang/fi-FI.rc
index 80356afb3d5..e33bf0b7a1b 100644
--- a/dll/win32/shell32/lang/fi-FI.rc
+++ b/dll/win32/shell32/lang/fi-FI.rc
@@ -1002,4 +1002,8 @@ BEGIN
     IDS_COPYTOTITLE "Select the place where you want to copy '%s'. Then
click the Copy button."
     IDS_COPYITEMS "Copy Items"
     IDS_COPYBUTTON "Copy"
+    IDS_MOVETOMENU "Mo&ve to folder..."
+    IDS_MOVETOTITLE "Select the place where you want to move '%s' to. Then
click the Move button."
+    IDS_MOVEITEMS "Move Items"
+    IDS_MOVEBUTTON "Move"
 END
diff --git a/dll/win32/shell32/lang/fr-FR.rc b/dll/win32/shell32/lang/fr-FR.rc
index d209b586591..f032d9311d0 100644
--- a/dll/win32/shell32/lang/fr-FR.rc
+++ b/dll/win32/shell32/lang/fr-FR.rc
@@ -1002,4 +1002,8 @@ BEGIN
     IDS_COPYTOTITLE "Select the place where you want to copy '%s'. Then
click the Copy button."
     IDS_COPYITEMS "Copy Items"
     IDS_COPYBUTTON "Copy"
+    IDS_MOVETOMENU "Mo&ve to folder..."
+    IDS_MOVETOTITLE "Select the place where you want to move '%s' to. Then
click the Move button."
+    IDS_MOVEITEMS "Move Items"
+    IDS_MOVEBUTTON "Move"
 END
diff --git a/dll/win32/shell32/lang/he-IL.rc b/dll/win32/shell32/lang/he-IL.rc
index 8d469bf407e..4d5690c40e1 100644
--- a/dll/win32/shell32/lang/he-IL.rc
+++ b/dll/win32/shell32/lang/he-IL.rc
@@ -1004,4 +1004,8 @@ BEGIN
     IDS_COPYTOTITLE "Select the place where you want to copy '%s'. Then
click the Copy button."
     IDS_COPYITEMS "Copy Items"
     IDS_COPYBUTTON "Copy"
+    IDS_MOVETOMENU "Mo&ve to folder..."
+    IDS_MOVETOTITLE "Select the place where you want to move '%s' to. Then
click the Move button."
+    IDS_MOVEITEMS "Move Items"
+    IDS_MOVEBUTTON "Move"
 END
diff --git a/dll/win32/shell32/lang/hi-IN.rc b/dll/win32/shell32/lang/hi-IN.rc
index 59be1fd3cbf..ac380f56403 100644
--- a/dll/win32/shell32/lang/hi-IN.rc
+++ b/dll/win32/shell32/lang/hi-IN.rc
@@ -997,4 +997,8 @@ BEGIN
     IDS_COPYTOTITLE "Select the place where you want to copy '%s'. Then
click the Copy button."
     IDS_COPYITEMS "Copy Items"
     IDS_COPYBUTTON "Copy"
+    IDS_MOVETOMENU "Mo&ve to folder..."
+    IDS_MOVETOTITLE "Select the place where you want to move '%s' to. Then
click the Move button."
+    IDS_MOVEITEMS "Move Items"
+    IDS_MOVEBUTTON "Move"
 END
diff --git a/dll/win32/shell32/lang/hu-HU.rc b/dll/win32/shell32/lang/hu-HU.rc
index ea91a553c1f..7fa873b907b 100644
--- a/dll/win32/shell32/lang/hu-HU.rc
+++ b/dll/win32/shell32/lang/hu-HU.rc
@@ -1001,4 +1001,8 @@ BEGIN
     IDS_COPYTOTITLE "Select the place where you want to copy '%s'. Then
click the Copy button."
     IDS_COPYITEMS "Copy Items"
     IDS_COPYBUTTON "Copy"
+    IDS_MOVETOMENU "Mo&ve to folder..."
+    IDS_MOVETOTITLE "Select the place where you want to move '%s' to. Then
click the Move button."
+    IDS_MOVEITEMS "Move Items"
+    IDS_MOVEBUTTON "Move"
 END
diff --git a/dll/win32/shell32/lang/id-ID.rc b/dll/win32/shell32/lang/id-ID.rc
index 09571a9f2a6..d8b5a0d482f 100644
--- a/dll/win32/shell32/lang/id-ID.rc
+++ b/dll/win32/shell32/lang/id-ID.rc
@@ -998,4 +998,8 @@ BEGIN
     IDS_COPYTOTITLE "Select the place where you want to copy '%s'. Then
click the Copy button."
     IDS_COPYITEMS "Copy Items"
     IDS_COPYBUTTON "Copy"
+    IDS_MOVETOMENU "Mo&ve to folder..."
+    IDS_MOVETOTITLE "Select the place where you want to move '%s' to. Then
click the Move button."
+    IDS_MOVEITEMS "Move Items"
+    IDS_MOVEBUTTON "Move"
 END
diff --git a/dll/win32/shell32/lang/it-IT.rc b/dll/win32/shell32/lang/it-IT.rc
index ed3dac4bfc8..c7961cecae8 100644
--- a/dll/win32/shell32/lang/it-IT.rc
+++ b/dll/win32/shell32/lang/it-IT.rc
@@ -1002,4 +1002,8 @@ BEGIN
     IDS_COPYTOTITLE "Select the place where you want to copy '%s'. Then
click the Copy button."
     IDS_COPYITEMS "Copy Items"
     IDS_COPYBUTTON "Copy"
+    IDS_MOVETOMENU "Mo&ve to folder..."
+    IDS_MOVETOTITLE "Select the place where you want to move '%s' to. Then
click the Move button."
+    IDS_MOVEITEMS "Move Items"
+    IDS_MOVEBUTTON "Move"
 END
diff --git a/dll/win32/shell32/lang/ja-JP.rc b/dll/win32/shell32/lang/ja-JP.rc
index 3593c981ce7..4d49baf9bf2 100644
--- a/dll/win32/shell32/lang/ja-JP.rc
+++ b/dll/win32/shell32/lang/ja-JP.rc
@@ -999,4 +999,8 @@ BEGIN
     IDS_COPYTOTITLE "Select the place where you want to copy '%s'. Then
click the Copy button."
     IDS_COPYITEMS "Copy Items"
     IDS_COPYBUTTON "Copy"
+    IDS_MOVETOMENU "Mo&ve to folder..."
+    IDS_MOVETOTITLE "Select the place where you want to move '%s' to. Then
click the Move button."
+    IDS_MOVEITEMS "Move Items"
+    IDS_MOVEBUTTON "Move"
 END
diff --git a/dll/win32/shell32/lang/ko-KR.rc b/dll/win32/shell32/lang/ko-KR.rc
index 3c46406aab7..1c58188d4e9 100644
--- a/dll/win32/shell32/lang/ko-KR.rc
+++ b/dll/win32/shell32/lang/ko-KR.rc
@@ -1002,4 +1002,8 @@ BEGIN
     IDS_COPYTOTITLE "Select the place where you want to copy '%s'. Then
click the Copy button."
     IDS_COPYITEMS "Copy Items"
     IDS_COPYBUTTON "Copy"
+    IDS_MOVETOMENU "Mo&ve to folder..."
+    IDS_MOVETOTITLE "Select the place where you want to move '%s' to. Then
click the Move button."
+    IDS_MOVEITEMS "Move Items"
+    IDS_MOVEBUTTON "Move"
 END
diff --git a/dll/win32/shell32/lang/nl-NL.rc b/dll/win32/shell32/lang/nl-NL.rc
index 26b311387a5..c5b82b3b260 100644
--- a/dll/win32/shell32/lang/nl-NL.rc
+++ b/dll/win32/shell32/lang/nl-NL.rc
@@ -1002,4 +1002,8 @@ BEGIN
     IDS_COPYTOTITLE "Select the place where you want to copy '%s'. Then
click the Copy button."
     IDS_COPYITEMS "Copy Items"
     IDS_COPYBUTTON "Copy"
+    IDS_MOVETOMENU "Mo&ve to folder..."
+    IDS_MOVETOTITLE "Select the place where you want to move '%s' to. Then
click the Move button."
+    IDS_MOVEITEMS "Move Items"
+    IDS_MOVEBUTTON "Move"
 END
diff --git a/dll/win32/shell32/lang/no-NO.rc b/dll/win32/shell32/lang/no-NO.rc
index 1831921be23..4e5a739ff65 100644
--- a/dll/win32/shell32/lang/no-NO.rc
+++ b/dll/win32/shell32/lang/no-NO.rc
@@ -1002,4 +1002,8 @@ BEGIN
     IDS_COPYTOTITLE "Select the place where you want to copy '%s'. Then
click the Copy button."
     IDS_COPYITEMS "Copy Items"
     IDS_COPYBUTTON "Copy"
+    IDS_MOVETOMENU "Mo&ve to folder..."
+    IDS_MOVETOTITLE "Select the place where you want to move '%s' to. Then
click the Move button."
+    IDS_MOVEITEMS "Move Items"
+    IDS_MOVEBUTTON "Move"
 END
diff --git a/dll/win32/shell32/lang/pl-PL.rc b/dll/win32/shell32/lang/pl-PL.rc
index 44e4bde14f7..3f544061d55 100644
--- a/dll/win32/shell32/lang/pl-PL.rc
+++ b/dll/win32/shell32/lang/pl-PL.rc
@@ -1008,4 +1008,8 @@ BEGIN
     IDS_COPYTOTITLE "Zaznacz miejsce, w które chcesz skopiować '%s', a
następnie kliknij przycisk Kopiuj."
     IDS_COPYITEMS "Kopiowanie elementów"
     IDS_COPYBUTTON "Kopiuj"
+    IDS_MOVETOMENU "Mo&ve to folder..."
+    IDS_MOVETOTITLE "Select the place where you want to move '%s' to. Then
click the Move button."
+    IDS_MOVEITEMS "Move Items"
+    IDS_MOVEBUTTON "Move"
 END
diff --git a/dll/win32/shell32/lang/pt-BR.rc b/dll/win32/shell32/lang/pt-BR.rc
index 9610e4e0fb6..1052bfe9250 100644
--- a/dll/win32/shell32/lang/pt-BR.rc
+++ b/dll/win32/shell32/lang/pt-BR.rc
@@ -1002,4 +1002,8 @@ BEGIN
     IDS_COPYTOTITLE "Select the place where you want to copy '%s'. Then
click the Copy button."
     IDS_COPYITEMS "Copy Items"
     IDS_COPYBUTTON "Copy"
+    IDS_MOVETOMENU "Mo&ve to folder..."
+    IDS_MOVETOTITLE "Select the place where you want to move '%s' to. Then
click the Move button."
+    IDS_MOVEITEMS "Move Items"
+    IDS_MOVEBUTTON "Move"
 END
diff --git a/dll/win32/shell32/lang/pt-PT.rc b/dll/win32/shell32/lang/pt-PT.rc
index f64de677bc9..8c027f41871 100644
--- a/dll/win32/shell32/lang/pt-PT.rc
+++ b/dll/win32/shell32/lang/pt-PT.rc
@@ -1002,4 +1002,8 @@ BEGIN
     IDS_COPYTOTITLE "Select the place where you want to copy '%s'. Then
click the Copy button."
     IDS_COPYITEMS "Copy Items"
     IDS_COPYBUTTON "Copy"
+    IDS_MOVETOMENU "Mo&ve to folder..."
+    IDS_MOVETOTITLE "Select the place where you want to move '%s' to. Then
click the Move button."
+    IDS_MOVEITEMS "Move Items"
+    IDS_MOVEBUTTON "Move"
 END
diff --git a/dll/win32/shell32/lang/ro-RO.rc b/dll/win32/shell32/lang/ro-RO.rc
index b4f0e6059aa..eb0f8eb660a 100644
--- a/dll/win32/shell32/lang/ro-RO.rc
+++ b/dll/win32/shell32/lang/ro-RO.rc
@@ -1004,4 +1004,8 @@ BEGIN
     IDS_COPYTOTITLE "Select the place where you want to copy '%s'. Then
click the Copy button."
     IDS_COPYITEMS "Copy Items"
     IDS_COPYBUTTON "Copy"
+    IDS_MOVETOMENU "Mo&ve to folder..."
+    IDS_MOVETOTITLE "Select the place where you want to move '%s' to. Then
click the Move button."
+    IDS_MOVEITEMS "Move Items"
+    IDS_MOVEBUTTON "Move"
 END
diff --git a/dll/win32/shell32/lang/ru-RU.rc b/dll/win32/shell32/lang/ru-RU.rc
index 406a0937b34..9080370a56f 100644
--- a/dll/win32/shell32/lang/ru-RU.rc
+++ b/dll/win32/shell32/lang/ru-RU.rc
@@ -1009,4 +1009,8 @@ BEGIN
     IDS_COPYTOTITLE "Выберите расположение, куда вы хотите скопировать '%s',
затем нажмите кнопку 'Копировать'."
     IDS_COPYITEMS "Копирование элементов"
     IDS_COPYBUTTON "Копировать"
+    IDS_MOVETOMENU "Переместить в папку..."
+    IDS_MOVETOTITLE "Выберите место, куда Вы хотите переместить '%s'. Затем
нажмите кнопку 'Переместить.'"
+    IDS_MOVEITEMS "Перемещение предметов"
+    IDS_MOVEBUTTON "Переместить"
 END
diff --git a/dll/win32/shell32/lang/sk-SK.rc b/dll/win32/shell32/lang/sk-SK.rc
index 93e87e85cad..1c50c821e27 100644
--- a/dll/win32/shell32/lang/sk-SK.rc
+++ b/dll/win32/shell32/lang/sk-SK.rc
@@ -1002,4 +1002,8 @@ BEGIN
     IDS_COPYTOTITLE "Select the place where you want to copy '%s'. Then
click the Copy button."
     IDS_COPYITEMS "Copy Items"
     IDS_COPYBUTTON "Copy"
+    IDS_MOVETOMENU "Mo&ve to folder..."
+    IDS_MOVETOTITLE "Select the place where you want to move '%s' to. Then
click the Move button."
+    IDS_MOVEITEMS "Move Items"
+    IDS_MOVEBUTTON "Move"
 END
diff --git a/dll/win32/shell32/lang/sl-SI.rc b/dll/win32/shell32/lang/sl-SI.rc
index eca49866975..720ebe4bf81 100644
--- a/dll/win32/shell32/lang/sl-SI.rc
+++ b/dll/win32/shell32/lang/sl-SI.rc
@@ -1002,4 +1002,8 @@ BEGIN
     IDS_COPYTOTITLE "Select the place where you want to copy '%s'. Then
click the Copy button."
     IDS_COPYITEMS "Copy Items"
     IDS_COPYBUTTON "Copy"
+    IDS_MOVETOMENU "Mo&ve to folder..."
+    IDS_MOVETOTITLE "Select the place where you want to move '%s' to. Then
click the Move button."
+    IDS_MOVEITEMS "Move Items"
+    IDS_MOVEBUTTON "Move"
 END
diff --git a/dll/win32/shell32/lang/sq-AL.rc b/dll/win32/shell32/lang/sq-AL.rc
index fa69346d878..8834bd41517 100644
--- a/dll/win32/shell32/lang/sq-AL.rc
+++ b/dll/win32/shell32/lang/sq-AL.rc
@@ -1006,4 +1006,8 @@ BEGIN
     IDS_COPYTOTITLE "Select the place where you want to copy '%s'. Then
click the Copy button."
     IDS_COPYITEMS "Copy Items"
     IDS_COPYBUTTON "Copy"
+    IDS_MOVETOMENU "Mo&ve to folder..."
+    IDS_MOVETOTITLE "Select the place where you want to move '%s' to. Then
click the Move button."
+    IDS_MOVEITEMS "Move Items"
+    IDS_MOVEBUTTON "Move"
 END
diff --git a/dll/win32/shell32/lang/sv-SE.rc b/dll/win32/shell32/lang/sv-SE.rc
index a81f73f5c6a..df2a3b42eaa 100644
--- a/dll/win32/shell32/lang/sv-SE.rc
+++ b/dll/win32/shell32/lang/sv-SE.rc
@@ -1002,4 +1002,8 @@ BEGIN
     IDS_COPYTOTITLE "Select the place where you want to copy '%s'. Then
click the Copy button."
     IDS_COPYITEMS "Copy Items"
     IDS_COPYBUTTON "Copy"
+    IDS_MOVETOMENU "Mo&ve to folder..."
+    IDS_MOVETOTITLE "Select the place where you want to move '%s' to. Then
click the Move button."
+    IDS_MOVEITEMS "Move Items"
+    IDS_MOVEBUTTON "Move"
 END
diff --git a/dll/win32/shell32/lang/tr-TR.rc b/dll/win32/shell32/lang/tr-TR.rc
index 519103301b3..f31eef1ddb8 100644
--- a/dll/win32/shell32/lang/tr-TR.rc
+++ b/dll/win32/shell32/lang/tr-TR.rc
@@ -1004,4 +1004,8 @@ BEGIN
     IDS_COPYTOTITLE "Select the place where you want to copy '%s'. Then
click the Copy button."
     IDS_COPYITEMS "Copy Items"
     IDS_COPYBUTTON "Copy"
+    IDS_MOVETOMENU "Mo&ve to folder..."
+    IDS_MOVETOTITLE "Select the place where you want to move '%s' to. Then
click the Move button."
+    IDS_MOVEITEMS "Move Items"
+    IDS_MOVEBUTTON "Move"
 END
diff --git a/dll/win32/shell32/lang/uk-UA.rc b/dll/win32/shell32/lang/uk-UA.rc
index 62d8787ec23..d27d60b5808 100644
--- a/dll/win32/shell32/lang/uk-UA.rc
+++ b/dll/win32/shell32/lang/uk-UA.rc
@@ -1002,4 +1002,8 @@ BEGIN
     IDS_COPYTOTITLE "Select the place where you want to copy '%s'. Then
click the Copy button."
     IDS_COPYITEMS "Copy Items"
     IDS_COPYBUTTON "Copy"
+    IDS_MOVETOMENU "Mo&ve to folder..."
+    IDS_MOVETOTITLE "Select the place where you want to move '%s' to. Then
click the Move button."
+    IDS_MOVEITEMS "Move Items"
+    IDS_MOVEBUTTON "Move"
 END
diff --git a/dll/win32/shell32/lang/zh-CN.rc b/dll/win32/shell32/lang/zh-CN.rc
index a07f3cfdaf6..44e03161cd2 100644
--- a/dll/win32/shell32/lang/zh-CN.rc
+++ b/dll/win32/shell32/lang/zh-CN.rc
@@ -1012,4 +1012,8 @@ BEGIN
     IDS_COPYTOTITLE "Select the place where you want to copy '%s'. Then
click the Copy button."
     IDS_COPYITEMS "Copy Items"
     IDS_COPYBUTTON "Copy"
+    IDS_MOVETOMENU "Mo&ve to folder..."
+    IDS_MOVETOTITLE "Select the place where you want to move '%s' to. Then
click the Move button."
+    IDS_MOVEITEMS "Move Items"
+    IDS_MOVEBUTTON "Move"
 END
diff --git a/dll/win32/shell32/lang/zh-TW.rc b/dll/win32/shell32/lang/zh-TW.rc
index c634e81d2f4..7077460b6a5 100644
--- a/dll/win32/shell32/lang/zh-TW.rc
+++ b/dll/win32/shell32/lang/zh-TW.rc
@@ -1013,4 +1013,8 @@ BEGIN
     IDS_COPYTOTITLE "Select the place where you want to copy '%s'. Then
click the Copy button."
     IDS_COPYITEMS "Copy Items"
     IDS_COPYBUTTON "Copy"
+    IDS_MOVETOMENU "Mo&ve to folder..."
+    IDS_MOVETOTITLE "Select the place where you want to move '%s' to. Then
click the Move button."
+    IDS_MOVEITEMS "Move Items"
+    IDS_MOVEBUTTON "Move"
 END
diff --git a/dll/win32/shell32/precomp.h b/dll/win32/shell32/precomp.h
index 2703b42e817..84bb7e49dc5 100644
--- a/dll/win32/shell32/precomp.h
+++ b/dll/win32/shell32/precomp.h
@@ -81,7 +81,7 @@
 #include "COpenWithMenu.h"
 #include "CNewMenu.h"
 #include "CSendToMenu.h"
-#include "CCopyToMenu.h"
+#include "CCopyToMoveToMenu.h"
 #include "dialogs/filedefext.h"
 #include "dialogs/drvdefext.h"
 #include "CQueryAssociations.h"
diff --git a/dll/win32/shell32/res/rgs/movetomenu.rgs
b/dll/win32/shell32/res/rgs/movetomenu.rgs
new file mode 100644
index 00000000000..5d72d749faa
--- /dev/null
+++ b/dll/win32/shell32/res/rgs/movetomenu.rgs
@@ -0,0 +1,26 @@
+HKCR
+{
+       NoRemove CLSID
+       {
+               ForceRemove {C2FBB631-2971-11D1-A18C-00C04FD75D13} = s 'ReactOS MoveTo
Object Service'
+               {
+                       val flags = d '1'
+                       InprocServer32 = s '%MODULE%'
+                       {
+                               val ThreadingModel = s 'Apartment'
+                       }
+               }
+       }
+       NoRemove AllFilesystemObjects
+       {
+               NoRemove shellex
+               {
+                       NoRemove ContextMenuHandlers
+                       {
+                               ForceRemove MoveTo = s
'{C2FBB631-2971-11D1-A18C-00C04FD75D13}'
+                               {
+                               }
+                       }
+               }
+       }
+}
diff --git a/dll/win32/shell32/rgs_res.rc b/dll/win32/shell32/rgs_res.rc
index 9435241aaaa..9c5aacd0c48 100644
--- a/dll/win32/shell32/rgs_res.rc
+++ b/dll/win32/shell32/rgs_res.rc
@@ -31,3 +31,4 @@ IDR_SHELL REGISTRY "res/rgs/shell.rgs"
 IDR_ACTIVEDESKTOP REGISTRY "res/rgs/activedesktop.rgs"
 IDR_SENDTOMENU REGISTRY "res/rgs/sendtomenu.rgs"
 IDR_COPYTOMENU REGISTRY "res/rgs/copytomenu.rgs"
+IDR_MOVETOMENU REGISTRY "res/rgs/movetomenu.rgs"
diff --git a/dll/win32/shell32/shell32.cpp b/dll/win32/shell32/shell32.cpp
index 527cbd29342..011d5b2980b 100644
--- a/dll/win32/shell32/shell32.cpp
+++ b/dll/win32/shell32/shell32.cpp
@@ -291,6 +291,7 @@ BEGIN_OBJECT_MAP(ObjectMap)
     OBJECT_ENTRY(CLSID_NewMenu, CNewMenu)
     OBJECT_ENTRY(CLSID_SendToMenu, CSendToMenu)
     OBJECT_ENTRY(CLSID_CopyToMenu, CCopyToMenu)
+    OBJECT_ENTRY(CLSID_MoveToMenu, CMoveToMenu)
     OBJECT_ENTRY(CLSID_StartMenu, CStartMenuDummy)
     OBJECT_ENTRY(CLSID_MenuBandSite, CMenuSite)
     OBJECT_ENTRY(CLSID_MenuBand, CMenuBand)
diff --git a/dll/win32/shell32/shresdef.h b/dll/win32/shell32/shresdef.h
index 81f22f97530..e3be5f4f255 100644
--- a/dll/win32/shell32/shresdef.h
+++ b/dll/win32/shell32/shresdef.h
@@ -301,6 +301,10 @@
 #define IDS_COPYTOTITLE                             30533
 #define IDS_COPYITEMS                               30534
 #define IDS_COPYBUTTON                              30535
+#define IDS_MOVETOMENU                              30536
+#define IDS_MOVETOTITLE                             30537
+#define IDS_MOVEITEMS                               30538
+#define IDS_MOVEBUTTON                              30539
 /* Dialogs */
@@ -801,6 +805,7 @@
 #define IDM_RENAME (FCIDM_SHVIEW_RENAME - 0x7000)
 #define IDM_PROPERTIES (FCIDM_SHVIEW_PROPERTIES - 0x7000)
 #define IDM_COPYTO (FCIDM_SHVIEW_COPYTO - 0x7000)
+#define IDM_MOVETO (FCIDM_SHVIEW_MOVETO - 0x7000)
 #define IDM_DRAGFILE 0xce
 #define IDM_COPYHERE 0x7
@@ -842,3 +847,4 @@
 #define IDR_ACTIVEDESKTOP       157
 #define IDR_SENDTOMENU          158
 #define IDR_COPYTOMENU          159
+#define IDR_MOVETOMENU          160