diff --git a/loader/module.c b/loader/module.c
index 7b7ff65..2668174 100644
--- a/loader/module.c
+++ b/loader/module.c
@@ -173,6 +173,12 @@
             return (FARPROC16)PrintSetupDlgProc;
         if (!strcmp(name,"ReplaceTextDlgProc"))
             return (FARPROC16)ReplaceTextDlgProc16;
+        if (!strcmp(name,"DefResourceHandler"))
+            return (FARPROC16)NE_DefResourceHandler;
+        if (!strcmp(name,"LoadDIBIconHandler"))
+            return (FARPROC16)LoadDIBIconHandler;
+        if (!strcmp(name,"LoadDIBCursorHandler"))
+            return (FARPROC16)LoadDIBCursorHandler;
         FIXME(module,"No mapping for %s(), add one in library/miscstubs.c\n",name);
         assert( FALSE );
         return NULL;
@@ -236,7 +242,7 @@
 	    if (dotptr)	*dotptr		= '\0';
 	    if (xdotptr) *xdotptr	= '\0';
 	}
-	if (!lstrcmpi32A( filename, xmodname)) {
+	if (!strcasecmp( filename, xmodname)) {
 	    HeapFree(process->heap,0,filename);
 	    HeapFree(process->heap,0,xmodname);
 	    return wm->module;
diff --git a/loader/ne/module.c b/loader/ne/module.c
index e9b645c..148efbc 100644
--- a/loader/ne/module.c
+++ b/loader/ne/module.c
@@ -18,6 +18,7 @@
 #include "global.h"
 #include "process.h"
 #include "toolhelp.h"
+#include "snoop.h"
 #include "debug.h"
 
 static HMODULE16 hFirstModule = 0;
@@ -327,7 +328,10 @@
 
     if (sel == 0xfe) sel = 0xffff;  /* constant entry */
     else sel = (WORD)(DWORD)NE_SEG_TABLE(pModule)[sel-1].selector;
-    return (FARPROC16)PTR_SEG_OFF_TO_SEGPTR( sel, offset );
+    if (sel==0xffff)
+	return (FARPROC16)PTR_SEG_OFF_TO_SEGPTR( sel, offset );
+    else
+	return (FARPROC16)SNOOP16_GetProcAddress16(hModule,ordinal,(FARPROC16)PTR_SEG_OFF_TO_SEGPTR( sel, offset ));
 }
 
 
@@ -444,8 +448,6 @@
     /* We now have a valid NE header */
 
     size = sizeof(NE_MODULE) +
-             /* loaded file info */
-           sizeof(OFSTRUCT)-sizeof(ofs->szPathName)+strlen(ofs->szPathName)+1+
              /* segment table */
            ne_header.n_segment_tab * sizeof(SEGTABLEENTRY) +
              /* resource table */
@@ -457,9 +459,11 @@
              /* imported names table */
            ne_header.entry_tab_offset - ne_header.iname_tab_offset +
              /* entry table length */
-           ne_header.entry_tab_length;
+           ne_header.entry_tab_length +
+             /* loaded file info */
+           sizeof(OFSTRUCT)-sizeof(ofs->szPathName)+strlen(ofs->szPathName)+1;
 
-    hModule = GlobalAlloc16( GMEM_MOVEABLE | GMEM_ZEROINIT, size );
+    hModule = GlobalAlloc16( GMEM_FIXED | GMEM_ZEROINIT, size );
     if (!hModule) return (HMODULE16)11;  /* invalid exe */
     FarSetOwner( hModule, hModule );
     pModule = (NE_MODULE *)GlobalLock16( hModule );
@@ -494,14 +498,6 @@
         }
     }
 
-    /* Store the filename information */
-
-    pModule->fileinfo = (int)pData - (int)pModule;
-    size = sizeof(OFSTRUCT)-sizeof(ofs->szPathName)+strlen(ofs->szPathName)+1;
-    memcpy( pData, ofs, size );
-    ((OFSTRUCT *)pData)->cBytes = size - 1;
-    pData += size;
-
     /* Get the segment table */
 
     pModule->seg_table = (int)pData - (int)pModule;
@@ -605,6 +601,14 @@
     }
     pData += ne_header.entry_tab_length;
 
+    /* Store the filename information */
+
+    pModule->fileinfo = (int)pData - (int)pModule;
+    size = sizeof(OFSTRUCT)-sizeof(ofs->szPathName)+strlen(ofs->szPathName)+1;
+    memcpy( pData, ofs, size );
+    ((OFSTRUCT *)pData)->cBytes = size - 1;
+    pData += size;
+
     /* Free the fast-load area */
 
 #undef READ
@@ -650,6 +654,7 @@
     else pModule->dlls_to_init = 0;
 
     NE_RegisterModule( pModule );
+    SNOOP16_RegisterDLL(pModule,ofs->szPathName);
     return hModule;
 }
 
diff --git a/loader/ne/resource.c b/loader/ne/resource.c
index 7339467..c5d3fce 100644
--- a/loader/ne/resource.c
+++ b/loader/ne/resource.c
@@ -20,6 +20,7 @@
 #include "module.h"
 #include "neexe.h"
 #include "resource.h"
+#include "callback.h"
 #include "debug.h"
 
 #define NEXT_TYPEINFO(pTypeInfo) ((NE_TYPEINFO *)((char*)((pTypeInfo) + 1) + \
@@ -218,11 +219,13 @@
     NE_MODULE *pModule = NE_GetPtr( hModule );
     NE_TYPEINFO *pTypeInfo = (NE_TYPEINFO *)((char *)pModule + pModule->res_table + 2);
 
+    FARPROC16 handler = MODULE_GetWndProcEntry16("DefResourceHandler");
+
     TRACE(resource,"InitResourceHandler[%04x]\n", hModule );
 
     while(pTypeInfo->type_id)
     {
-	pTypeInfo->resloader = (FARPROC16)&NE_DefResourceHandler;
+	pTypeInfo->resloader = handler;
 	pTypeInfo = NEXT_TYPEINFO(pTypeInfo);
     }
     return TRUE;
@@ -450,7 +453,6 @@
 
     if (pNameInfo)
     {
-	RESOURCEHANDLER16 loader;
 	if (pNameInfo->handle
 	    && !(GlobalFlags16(pNameInfo->handle) & GMEM_DISCARDED))
 	{
@@ -461,16 +463,16 @@
 	else
 	{
 	    if (pTypeInfo->resloader)
-	  	loader = (RESOURCEHANDLER16)pTypeInfo->resloader;
+                pNameInfo->handle = Callbacks->CallResourceHandlerProc(
+                    pTypeInfo->resloader, pNameInfo->handle, hModule, hRsrc );
 	    else /* this is really bad */
 	    {
 		ERR(resource, "[%04x]: Missing resource handler!\n", hModule);
-		loader = NE_DefResourceHandler;
+                pNameInfo->handle = NE_DefResourceHandler(
+                                         pNameInfo->handle, hModule, hRsrc );
 	    }
 
-	    /* Finally call resource loader */
-
-	    if ((pNameInfo->handle = loader(pNameInfo->handle, hModule, hRsrc)))
+	    if (pNameInfo->handle)
 	    {
 		pNameInfo->usage++;
 		pNameInfo->flags |= NE_SEGFLAGS_LOADED;
diff --git a/loader/ne/segment.c b/loader/ne/segment.c
index 719d6d1..28caa77 100644
--- a/loader/ne/segment.c
+++ b/loader/ne/segment.c
@@ -349,7 +349,7 @@
                 if (next_offset == offset) break;  /* avoid infinite loop */
                 if (next_offset >= GlobalSize16(pSeg->selector)) break;
                 offset = next_offset;
-            } while (offset && (offset != 0xffff));
+            } while (offset != 0xffff);
         }
     }
 
diff --git a/loader/signal.c b/loader/signal.c
index 2e3dec6..0023c65 100644
--- a/loader/signal.c
+++ b/loader/signal.c
@@ -34,6 +34,8 @@
 #include "sig_context.h"
 #include "winsock.h"
 
+/* Global variable to save %fs register while in 16-bit code */
+WORD CALLTO16_Current_fs;
 
 /* Linux sigaction function */
 
diff --git a/loader/task.c b/loader/task.c
index a842c08..5483f0f 100644
--- a/loader/task.c
+++ b/loader/task.c
@@ -346,6 +346,7 @@
 
     cmd_line = pdb32->env_db->cmd_line;
     while (*cmd_line && (*cmd_line != ' ') && (*cmd_line != '\t')) cmd_line++;
+    while ((*cmd_line == ' ') || (*cmd_line == '\t')) cmd_line++;
     lstrcpyn32A( pTask->pdb.cmdLine+1, cmd_line, sizeof(pTask->pdb.cmdLine)-1);
     pTask->pdb.cmdLine[0] = strlen( pTask->pdb.cmdLine + 1 );
 
@@ -1245,10 +1246,9 @@
 /***********************************************************************
  *           GetExePtr   (KERNEL.133)
  */
-HMODULE16 WINAPI GetExePtr( HANDLE16 handle )
+static HMODULE16 GetExePtrHelper( HANDLE16 handle, HTASK16 *hTask )
 {
     char *ptr;
-    HTASK16 hTask;
     HANDLE16 owner;
 
       /* Check for module handle */
@@ -1256,31 +1256,60 @@
     if (!(ptr = GlobalLock16( handle ))) return 0;
     if (((NE_MODULE *)ptr)->magic == IMAGE_OS2_SIGNATURE) return handle;
 
+      /* Search for this handle inside all tasks */
+
+    *hTask = hFirstTask;
+    while (*hTask)
+    {
+        TDB *pTask = (TDB *)GlobalLock16( *hTask );
+        if ((*hTask == handle) ||
+            (pTask->hInstance == handle) ||
+            (pTask->hQueue == handle) ||
+            (pTask->hPDB == handle)) return pTask->hModule;
+        *hTask = pTask->hNext;
+    }
+
       /* Check the owner for module handle */
 
     owner = FarGetOwner( handle );
     if (!(ptr = GlobalLock16( owner ))) return 0;
     if (((NE_MODULE *)ptr)->magic == IMAGE_OS2_SIGNATURE) return owner;
 
-      /* Search for this handle and its owner inside all tasks */
+      /* Search for the owner inside all tasks */
 
-    hTask = hFirstTask;
-    while (hTask)
+    *hTask = hFirstTask;
+    while (*hTask)
     {
-        TDB *pTask = (TDB *)GlobalLock16( hTask );
-        if ((hTask == handle) ||
-            (pTask->hInstance == handle) ||
-            (pTask->hQueue == handle) ||
-            (pTask->hPDB == handle)) return pTask->hModule;
-        if ((hTask == owner) ||
+        TDB *pTask = (TDB *)GlobalLock16( *hTask );
+        if ((*hTask == owner) ||
             (pTask->hInstance == owner) ||
             (pTask->hQueue == owner) ||
             (pTask->hPDB == owner)) return pTask->hModule;
-        hTask = pTask->hNext;
+        *hTask = pTask->hNext;
     }
+
     return 0;
 }
 
+HMODULE16 WINAPI GetExePtr( HANDLE16 handle )
+{
+    HTASK16 dummy;
+    return GetExePtrHelper( handle, &dummy );
+}
+
+void WINAPI WIN16_GetExePtr( CONTEXT *context )
+{
+    WORD *stack = PTR_SEG_OFF_TO_LIN(SS_reg(context), SP_reg(context));
+    HANDLE16 handle = (HANDLE16)stack[2];
+    HTASK16 hTask = 0;
+    HMODULE16 hModule;
+
+    hModule = GetExePtrHelper( handle, &hTask );
+
+    AX_reg(context) = CX_reg(context) = hModule;
+    if (hTask) ES_reg(context) = hTask;
+}
+
 /***********************************************************************
  *           TaskFirst   (TOOLHELP.63)
  */
