diff --git a/loader/module.c b/loader/module.c
index 48a062e67f3bc1bcf0fb717af13f37ac4c27824b..6b4222bfafd8d7b2159ed669406769401eb23896 100644
--- a/loader/module.c
+++ b/loader/module.c
@@ -777,6 +777,12 @@ static BOOL MODULE_CreateUnixProcess( LPCSTR filename, LPCSTR lpCmdLine,
              || lpStartupInfo->wShowWindow == SW_SHOWMINNOACTIVE )
             iconic = TRUE;
 
+    /* Build argument list */
+
+    argptr = argv;
+    if ( !useWine )
+    {
+        char *p = strdup(lpCmdLine);
     if (    strchr(filename, '/') 
          || strchr(filename, ':') 
          || strchr(filename, '\\') )
@@ -784,19 +790,6 @@ static BOOL MODULE_CreateUnixProcess( LPCSTR filename, LPCSTR lpCmdLine,
         if ( DOSFS_GetFullName( filename, TRUE, &full_name ) )
             unixfilename = full_name.long_name;
     }
-
-    if ( !unixfilename )
-    {
-        SetLastError( ERROR_FILE_NOT_FOUND );
-        return FALSE;
-    }
-
-    /* Build argument list */
-
-    argptr = argv;
-    if ( !useWine )
-    {
-        char *p = strdup(lpCmdLine);
         *argptr++ = unixfilename;
         if (iconic) *argptr++ = "-iconic";
         while (1)
@@ -806,6 +799,7 @@ static BOOL MODULE_CreateUnixProcess( LPCSTR filename, LPCSTR lpCmdLine,
             *argptr++ = p;
             while (*p && *p != ' ' && *p != '\t') p++;
         }
+	free (p);
     }
     else
     {
@@ -1129,8 +1123,10 @@ BOOL WINAPI CreateProcessA( LPCSTR lpApplicationName, LPSTR lpCommandLine,
     HFILE hFile;
     OFSTRUCT ofs;
     DWORD type;
-    char name[256];
+    char name[256], dummy[256];
     LPCSTR cmdline = NULL;
+    LPSTR tidy_cmdline;
+    int len = 0;
 
     /* Get name and command line */
 
@@ -1140,16 +1136,24 @@ BOOL WINAPI CreateProcessA( LPCSTR lpApplicationName, LPSTR lpCommandLine,
         return FALSE;
     }
 
-    /* Process the AppName or CmdLine to get module name and path */
+    /* Process the AppName and/or CmdLine to get module name and path */
 
     name[0] = '\0';
 
     if (lpApplicationName) {
        found_file = make_lpApplicationName_name( lpApplicationName, name, sizeof(name) );
-       cmdline = (lpCommandLine) ? lpCommandLine : lpApplicationName ;
+       if (lpCommandLine) {
+	  make_lpCommandLine_name( lpCommandLine, dummy, sizeof ( dummy ), &cmdline );
     }
-    else 
+       else {
+	  cmdline = lpApplicationName;
+       }
+       len += strlen(lpApplicationName);
+    }
+    else {
        found_file = make_lpCommandLine_name( lpCommandLine, name, sizeof ( name ), &cmdline );
+       if (lpCommandLine) len = strlen(lpCommandLine);
+    }
 
     if ( !found_file ) {
         /* make an early exit if file not found - save second pass */
@@ -1157,6 +1161,10 @@ BOOL WINAPI CreateProcessA( LPCSTR lpApplicationName, LPSTR lpCommandLine,
         return FALSE;
     }
 
+    len += strlen(name) + 2;
+    tidy_cmdline = HeapAlloc( GetProcessHeap(), 0, len );
+    sprintf( tidy_cmdline, "\"%s\"%s", name, cmdline);
+
     /* Warn if unsupported features are used */
 
     if (dwCreationFlags & CREATE_SUSPENDED)
@@ -1217,14 +1225,17 @@ BOOL WINAPI CreateProcessA( LPCSTR lpApplicationName, LPSTR lpCommandLine,
 
     /* When in WineLib, always fork new Unix process */
 
-    if ( __winelib )
-        return MODULE_CreateUnixProcess( name, cmdline, 
+    if ( __winelib ) {
+        retv = MODULE_CreateUnixProcess( name, tidy_cmdline, 
                                          lpStartupInfo, lpProcessInfo, TRUE );
+	HeapFree( GetProcessHeap(), 0, tidy_cmdline );
+	return (retv);
+    }
 
     /* Check for special case: second instance of NE module */
 
     lstrcpynA( ofs.szPathName, name, sizeof( ofs.szPathName ) );
-    retv = NE_CreateProcess( HFILE_ERROR, &ofs, cmdline, lpEnvironment, 
+    retv = NE_CreateProcess( HFILE_ERROR, &ofs, tidy_cmdline, lpEnvironment, 
                              lpProcessAttributes, lpThreadAttributes,
                              bInheritHandles, dwCreationFlags,
                              lpStartupInfo, lpProcessInfo );
@@ -1238,6 +1249,7 @@ BOOL WINAPI CreateProcessA( LPCSTR lpApplicationName, LPSTR lpCommandLine,
         if ( (hFile = OpenFile( name, &ofs, OF_READ )) == HFILE_ERROR )
         {
             SetLastError( ERROR_FILE_NOT_FOUND );
+            HeapFree( GetProcessHeap(), 0, tidy_cmdline );
             return FALSE;
         }
 
@@ -1246,10 +1258,13 @@ BOOL WINAPI CreateProcessA( LPCSTR lpApplicationName, LPSTR lpCommandLine,
             CloseHandle( hFile );
 
             /* FIXME: Try Unix executable only when appropriate! */
-            if ( MODULE_CreateUnixProcess( name, cmdline, 
+            if ( MODULE_CreateUnixProcess( name, tidy_cmdline, 
                                            lpStartupInfo, lpProcessInfo, FALSE ) )
+            {
+                HeapFree( GetProcessHeap(), 0, tidy_cmdline );
                 return TRUE;
-
+            }
+            HeapFree( GetProcessHeap(), 0, tidy_cmdline );
             SetLastError( ERROR_BAD_FORMAT );
             return FALSE;
         }
@@ -1260,21 +1275,21 @@ BOOL WINAPI CreateProcessA( LPCSTR lpApplicationName, LPSTR lpCommandLine,
         switch ( type )
         {
         case SCS_32BIT_BINARY:
-            retv = PE_CreateProcess( hFile, &ofs, cmdline, lpEnvironment, 
+            retv = PE_CreateProcess( hFile, &ofs, tidy_cmdline, lpEnvironment, 
                                      lpProcessAttributes, lpThreadAttributes,
                                      bInheritHandles, dwCreationFlags,
                                      lpStartupInfo, lpProcessInfo );
             break;
     
         case SCS_DOS_BINARY:
-            retv = MZ_CreateProcess( hFile, &ofs, cmdline, lpEnvironment, 
+            retv = MZ_CreateProcess( hFile, &ofs, tidy_cmdline, lpEnvironment, 
                                      lpProcessAttributes, lpThreadAttributes,
                                      bInheritHandles, dwCreationFlags,
                                      lpStartupInfo, lpProcessInfo );
             break;
 
         case SCS_WOW_BINARY:
-            retv = NE_CreateProcess( hFile, &ofs, cmdline, lpEnvironment, 
+            retv = NE_CreateProcess( hFile, &ofs, tidy_cmdline, lpEnvironment, 
                                      lpProcessAttributes, lpThreadAttributes,
                                      bInheritHandles, dwCreationFlags,
                                      lpStartupInfo, lpProcessInfo );
@@ -1294,6 +1309,7 @@ BOOL WINAPI CreateProcessA( LPCSTR lpApplicationName, LPSTR lpCommandLine,
 
         CloseHandle( hFile );
     }
+    HeapFree( GetProcessHeap(), 0, tidy_cmdline );
     return retv;
 }