diff --git a/loader/main.c b/loader/main.c
index d5bd59e..ed75c11 100644
--- a/loader/main.c
+++ b/loader/main.c
@@ -1,7 +1,7 @@
 /*
-static char RCSId[] = "$Id: wine.c,v 1.2 1993/07/04 04:04:21 root Exp root $";
-static char Copyright[] = "Copyright  Robert J. Amstadt, 1993";
-*/
+ * Main initialization code
+ */
+
 #include <stdio.h>
 #include <stdlib.h>
 #include <sys/types.h>
@@ -23,7 +23,6 @@
 #include "queue.h"
 #include "syscolor.h"
 #include "sysmetrics.h"
-#include "callback.h"
 #include "file.h"
 #include "gdi.h"
 #include "heap.h"
@@ -41,78 +40,48 @@
 #include "stddebug.h"
 #include "debug.h"
 
-#ifndef WINELIB
-#include "debugger.h"
-#endif
 
 int __winelib = 1;  /* Winelib run-time flag */
 
 HANDLE32 SystemHeap = 0;
 HANDLE32 SegptrHeap = 0;
 
+
 /***********************************************************************
- *           Main initialisation routine
+ *           Kernel initialisation routine
  */
-int MAIN_Init(void)
+BOOL32 MAIN_KernelInit(void)
 {
     extern BOOL32 EVENT_Init(void);
-    extern BOOL32 RELAY_Init(void);
-    extern BOOL32 WIN16DRV_Init(void);
     extern BOOL32 VIRTUAL_Init(void);
-    extern BOOL32 WIDGETS_Init(void);
-
-    int queueSize;
 
     /* Initialize virtual memory management */
-    if (!VIRTUAL_Init()) return 0;
+    if (!VIRTUAL_Init()) return FALSE;
 
     /* Create the system and SEGPTR heaps */
-    if (!(SystemHeap = HeapCreate( HEAP_GROWABLE, 0x10000, 0 ))) return 0;
-    if (!(SegptrHeap = HeapCreate( HEAP_WINE_SEGPTR, 0, 0 ))) return 0;
+    if (!(SystemHeap = HeapCreate( HEAP_GROWABLE, 0x10000, 0 ))) return FALSE;
+    if (!(SegptrHeap = HeapCreate( HEAP_WINE_SEGPTR, 0, 0 ))) return FALSE;
 
     /* Load the configuration file */
-    if (!PROFILE_LoadWineIni()) return 0;
+    if (!PROFILE_LoadWineIni()) return FALSE;
 
       /* Initialize DOS memory */
-    if (!DOSMEM_Init()) return 0;
+    if (!DOSMEM_Init()) return FALSE;
 
       /* Initialize signal handling */
-    if (!SIGNAL_Init()) return 0;
-
-      /* Initialize event handling */
-    if (!EVENT_Init()) return 0;
-
-#ifdef WINELIB
-    /* Create USER and GDI heap */
-    USER_HeapSel = GlobalAlloc16( GMEM_FIXED, 0x10000 );
-    LocalInit( USER_HeapSel, 0, 0xffff );
-    GDI_HeapSel  = GlobalAlloc16( GMEM_FIXED, GDI_HEAP_SIZE );
-    LocalInit( GDI_HeapSel, 0, GDI_HEAP_SIZE-1 );
-#else
-    /* Initialize relay code */
-    if (!RELAY_Init()) return 0;
-
-      /* Initialize signal handling */
-    if (!SIGNAL_InitEmulator()) return 0;
-
-    /* Create the Win16 printer driver */
-    if (!WIN16DRV_Init()) return 0;
-#endif  /* WINELIB */
-
-    /* Initialize Wine tweaks */
-    if (!TWEAK_Init()) return 0;
-
-    /* Initialize OEM Bitmaps */
-    if (!OBM_Init()) return 0;
+    if (!SIGNAL_Init()) return FALSE;
 
     /* Initialise DOS drives */
-    if (!DRIVE_Init()) return 0;
+    if (!DRIVE_Init()) return FALSE;
 
     /* Initialise DOS directories */
-    if (!DIR_Init()) return 0;
+    if (!DIR_Init()) return FALSE;
 
     /* Initialize tasks */
-    if (!TASK_Init()) return 0;
+    if (!TASK_Init()) return FALSE;
+
+      /* Initialize event handling */
+    if (!EVENT_Init()) return FALSE;
 
     /* Initialize communications */
     COMM_Init();
@@ -120,14 +89,45 @@
     /* Initialize IO-port permissions */
     IO_port_init();
 
+    return TRUE;
+}
+
+
+/***********************************************************************
+ *           USER (and GDI) initialisation routine
+ */
+BOOL32 MAIN_UserInit(void)
+{
+    extern BOOL32 WIDGETS_Init(void);
+
+    int queueSize;
+
+    /* Create USER and GDI heap */
+    if (!USER_HeapSel)
+    {
+        USER_HeapSel = GlobalAlloc16( GMEM_FIXED, 0x10000 );
+        LocalInit( USER_HeapSel, 0, 0xffff );
+    }
+    if (!GDI_HeapSel)
+    {
+        GDI_HeapSel  = GlobalAlloc16( GMEM_FIXED, GDI_HEAP_SIZE );
+        LocalInit( GDI_HeapSel, 0, GDI_HEAP_SIZE-1 );
+    }
+
+    /* Initialize Wine tweaks */
+    if (!TWEAK_Init()) return FALSE;
+
+    /* Initialize OEM Bitmaps */
+    if (!OBM_Init()) return FALSE;
+
     /* registry initialisation */
     SHELL_LoadRegistry();
     
     /* Global atom table initialisation */
-    if (!ATOM_Init()) return 0;
+    if (!ATOM_Init()) return FALSE;
 
     /* GDI initialisation */
-    if (!GDI_Init()) return 0;
+    if (!GDI_Init()) return FALSE;
 
     /* Initialize system colors and metrics*/
     SYSMETRICS_Init();
@@ -137,103 +137,49 @@
     DCE_Init();
 
     /* Initialize keyboard */
-    if (!KEYBOARD_Init()) return 0;
+    if (!KEYBOARD_Init()) return FALSE;
 
     /* Initialize window procedures */
-    if (!WINPROC_Init()) return 0;
+    if (!WINPROC_Init()) return FALSE;
 
     /* Initialize built-in window classes */
-    if (!WIDGETS_Init()) return 0;
+    if (!WIDGETS_Init()) return FALSE;
 
     /* Initialize dialog manager */
-    if (!DIALOG_Init()) return 0;
+    if (!DIALOG_Init()) return FALSE;
 
     /* Initialize menus */
-    if (!MENU_Init()) return 0;
+    if (!MENU_Init()) return FALSE;
 
     /* Create desktop window */
-    if (!WIN_CreateDesktopWindow()) return 0;
+    if (!WIN_CreateDesktopWindow()) return FALSE;
 
     /* Initialize message spying */
-    if (!SPY_Init()) return 0;
+    if (!SPY_Init()) return FALSE;
 
     /* Check wine.conf for old/bad entries */
-    if (!TWEAK_CheckConfiguration()) return 0;
+    if (!TWEAK_CheckConfiguration()) return FALSE;
 
     /* Create system message queue */
     queueSize = GetProfileInt32A( "windows", "TypeAhead", 120 );
-    if (!QUEUE_CreateSysMsgQueue( queueSize )) return 0;
+    if (!QUEUE_CreateSysMsgQueue( queueSize )) return FALSE;
 
     /* Set double click time */
     SetDoubleClickTime32( GetProfileInt32A("windows","DoubleClickSpeed",452) );
 
+    return TRUE;
+}
+
+
+/***********************************************************************
+ *           Winelib initialisation routine
+ */
+int MAIN_WinelibInit(void)
+{
+    /* Initialize the kernel */
+    if (!MAIN_KernelInit()) return 0;
+
+    /* Initialize all the USER stuff */
+    if (!MAIN_UserInit()) return 0;
     return 1;
 }
-
-
-#ifndef WINELIB
-/**********************************************************************
- *					main
- */
-int main(int argc, char *argv[] )
-{
-    extern BOOL32 MAIN_WineInit( int *argc, char *argv[] );
-    extern void *CALL32_Init(void);
-    extern char * DEBUG_argv0;
-
-    int i,loaded;
-    HINSTANCE32 handle;
-
-    __winelib = 0;  /* First of all, clear the Winelib flag */
-
-    /*
-     * Save this so that the internal debugger can get a hold of it if
-     * it needs to.
-     */
-    DEBUG_argv0 = argv[0];
-
-    if (!MAIN_WineInit( &argc, argv )) return 1;
-    if (!MAIN_Init()) return 1;
-
-    /* Initialize CALL32 routines */
-    /* This needs to be done just before task-switching starts */
-    IF1632_CallLargeStack = (int (*)(int (*func)(), void *arg))CALL32_Init();
-
-    loaded=0;
-    for (i = 1; i < argc; i++)
-    {
-        if ((handle = WinExec32( argv[i], SW_SHOWNORMAL )) < 32)
-        {
-            fprintf(stderr, "wine: can't exec '%s': ", argv[i]);
-            switch (handle)
-            {
-            case 2: fprintf( stderr, "file not found\n" ); break;
-            case 11: fprintf( stderr, "invalid exe file\n" ); break;
-            case 21: fprintf( stderr, "win32 executable\n" ); break;
-            default: fprintf( stderr, "error=%d\n", handle ); break;
-            }
-            return 1;
-        }
-	loaded++;
-    }
-
-    if (!loaded) { /* nothing loaded */
-    	extern void MAIN_Usage(char*);
-    	MAIN_Usage(argv[0]);
-	return 1;
-    }
-
-    if (!GetNumTasks())
-    {
-        fprintf( stderr, "wine: no executable file found.\n" );
-        return 0;
-    }
-
-    if (Options.debug) DEBUG_AddModuleBreakpoints();
-
-    Yield();  /* Start the first task */
-    fprintf( stderr, "WinMain: Should never happen: returned from Yield()\n" );
-    return 0;
-}
-
-#endif /* #ifndef WINELIB */
