diff --git a/src/physfs/platform/windows.c b/src/physfs/platform/windows.c
index fbc09619398768de64e505f375a53868c8c80f6f..02c595bad36efe29da6ad90bf9466dc9e8a4617e 100644
--- a/src/physfs/platform/windows.c
+++ b/src/physfs/platform/windows.c
@@ -123,6 +123,7 @@ static HANDLE (WINAPI *pFindFirstFileW)(LPCWSTR, LPWIN32_FIND_DATAW);
 static BOOL (WINAPI *pFindNextFileW)(HANDLE, LPWIN32_FIND_DATAW);
 static DWORD (WINAPI *pGetCurrentDirectoryW)(DWORD, LPWSTR);
 static BOOL (WINAPI *pDeleteFileW)(LPCWSTR);
+static BOOL (WINAPI *pMoveFileW)(LPCWSTR,LPCWSTR);
 static BOOL (WINAPI *pRemoveDirectoryW)(LPCWSTR);
 static BOOL (WINAPI *pCreateDirectoryW)(LPCWSTR, LPSECURITY_ATTRIBUTES);
 static BOOL (WINAPI *pGetFileAttributesExA)
@@ -216,6 +217,25 @@ static BOOL WINAPI fallbackRemoveDirectoryW(LPCWSTR dname)
     return(retval);
 } /* fallbackRemoveDirectoryW */
 
+static BOOL WINAPI fallbackMoveFileW(LPCWSTR fname1, LPCWSTR fname2)
+{
+    BOOL retval = 0;
+
+    const int buflen1 = (int) (wStrLen(fname1) + 1);
+    char *cpstr1 = (char *) __PHYSFS_smallAlloc(buflen1);
+    WideCharToMultiByte(CP_ACP, 0, fname1, buflen1, cpstr1, buflen1, NULL, NULL);
+
+    const int buflen2 = (int) (wStrLen(fname2) + 1);
+    char *cpstr2 = (char *) __PHYSFS_smallAlloc(buflen2);
+    WideCharToMultiByte(CP_ACP, 0, fname2, buflen2, cpstr2, buflen2, NULL, NULL);
+
+    retval = MoveFile(cpstr1, cpstr2);
+	
+    __PHYSFS_smallFree(cpstr1);
+    __PHYSFS_smallFree(cpstr2);
+    return(retval);
+} /* fallbackRemoveDirectoryW */
+
 static BOOL WINAPI fallbackCreateDirectoryW(LPCWSTR dname,
                                             LPSECURITY_ATTRIBUTES attr)
 {
@@ -313,6 +333,7 @@ static int findApiSymbols(void)
         LOOKUP(RemoveDirectoryW, osHasUnicode);
         LOOKUP(CreateFileW, osHasUnicode);
         LOOKUP(DeleteFileW, osHasUnicode);
+        LOOKUP(MoveFileW, osHasUnicode);
     } /* if */
 
     #undef LOOKUP_NOFALLBACK
@@ -982,7 +1003,20 @@ int __PHYSFS_platformDeinit(void)
 
 int __PHYSFS_platformRename(const char *filename1, const char *filename2)
 {
-    return MoveFile(filename1, filename2);
+    WCHAR *wfname1, *wfname2;
+
+    UTF8_TO_UNICODE_STACK_MACRO(wfname1, filename1);
+    BAIL_IF_MACRO(wfname1 == NULL, ERR_OUT_OF_MEMORY, NULL);
+
+    UTF8_TO_UNICODE_STACK_MACRO(wfname2, filename2);
+    BAIL_IF_MACRO(wfname2 == NULL, ERR_OUT_OF_MEMORY, NULL);
+
+    BOOL ret = pMoveFileW(wfname1, wfname2);
+	
+    __PHYSFS_smallFree(wfname1);
+    __PHYSFS_smallFree(wfname2);
+	
+	return ret;
 } /* __PHYSFS_platformRename */
 
 static void *doOpen(const char *fname, DWORD mode, DWORD creation, int rdonly)