Release 970101

Wed Jan  1 15:36:17 1997  Alexandre Julliard  <julliard@lrc.epfl.ch>

	* [controls/listbox.c]
	Use FindFirstFile/FindNextFile in LISTBOX_Directory.

	* [files/dos_fs.c]
	Rewrote FindFirstFile/FindNextFile to use DOSFS_FindNext().

	* [files/file.c] [files/directory.c]
	Use Win32 kernel objects and handles for file handles.
	Unified SearchPath() and OpenFile().

	* [loader/builtin.c]
	Moved to if1632/ directory.

	* [tools/build.c] [debugger/*] [miscemu/*]
	Win16 register functions now receive the same CONTEXT * structure
	as Win32 functions.

	* [include/sigcontext.h] [miscemu/instr.c]
	Added new macros to get register values from the SIGCONTEXT
	structure (only used for instruction emulation now).

	* [scheduler/process.c] [scheduler/thread.c] (New files)
	Allocate process and thread structures.

	* [scheduler/process.c] [win32/k32obj.c]
	Added Win32 kernel objects and handles management.

	* [loader/task.c]
	Create a Win32 process and thread for every Win16 task.

	* [misc/commdlg.c] [misc/shell.c] [windows/msgbox.c]
	Built-in resources are now in Win32 format. This also avoids
	16-bit callbacks for built-in dialogs.

	* [misc/lzexpand.c]
	Differentiate between 16-bit and 32-bit file handles.

	* [miscemu/int*.c]
	Moved all int emulation to msdos/ directory.

	* [msdos/*]
	New directory msdos/ contains all MS-DOS emulation code that can
	also be used for Winelib; this should enable Winelib apps to use
	DOS3Call and related functions.

	* [rc/winerc.c]
	A few bug fixes for Win32 resource format.

	* [windows/winpos.c]
	Hack in WINPOS_ReorderOwnerPopups() to avoid X crashed (still not
	right though).

Sun Dec 29 17:47:55 1996  O. Flebbe <flebbe@science-computing.uni-tuebingen.de>

	* [loader/pe_image.c]
	Make sure BSS of a PE_Image is zero.

Sat Dec 28 22:15:34 1996 Alex Korobka <alex@trantor.pharm.sunysb.edu>

	* [windows/scroll.c]
	ScrollWindowEx() rewrite, ScrollDC() fix.

	* [windows/nonclient.c] [controls/menu.c]
	Fixed Alt-Space crashes in dialogs.

	* [windows/event.c] [windows/message.c]
	Some changes in mouse message generation.

Thu Dec 26 09:25:24 1996  Philippe De Muyter  <phdm@info.ucl.ac.be>

	* [debugger/stabs.c]
	Dummy DEBUG_ReadExecutableDbgInfo provided for !__ELF__ case.

Tue Dec 24 00:59:05 MET 1996  Martin Buck <martin-2.buck@student.uni-ulm.de>

	* [windows/event.c]
	Changed XK_Page_{Up,Down} to XK_{Prior,Next} for X11R5
	compatibility.
diff --git a/ANNOUNCE b/ANNOUNCE
index ba07f17..13b5bb4 100644
--- a/ANNOUNCE
+++ b/ANNOUNCE
@@ -1,13 +1,13 @@
-This is release 961222 of Wine, the MS Windows emulator.  This is still a
+This is release 970101 of Wine, the MS Windows emulator.  This is still a
 developer's only release.  There are many bugs and many unimplemented API
 features.  Most applications still do not work correctly.
 
 Patches should be submitted to "julliard@lrc.epfl.ch".  Please don't
 forget to include a ChangeLog entry.
 
-WHAT'S NEW with Wine-961222: (see ChangeLog for details)
-	- Lots of improvements to the built-in debugger
-	- Yet more Win32 stuff.
+WHAT'S NEW with Wine-970101: (see ChangeLog for details)
+	- Win32 handle management and related stuff.
+	- Several files moved around, new directories created.
 	- Lots of bug fixes.
 
 See the README file in the distribution for installation instructions.
@@ -16,10 +16,10 @@
 the release is available at the ftp sites.  The sources will be available
 from the following locations:
 
-  ftp://sunsite.unc.edu/pub/Linux/ALPHA/wine/development/Wine-961222.tar.gz
-  ftp://tsx-11.mit.edu/pub/linux/ALPHA/Wine/development/Wine-961222.tar.gz
-  ftp://ftp.infomagic.com/pub/mirrors/linux/wine/development/Wine-961222.tar.gz
-  ftp://aris.com/pub/linux/ALPHA/Wine/development/Wine-961222.tar.gz
+  ftp://sunsite.unc.edu/pub/Linux/ALPHA/wine/development/Wine-970101.tar.gz
+  ftp://tsx-11.mit.edu/pub/linux/ALPHA/Wine/development/Wine-970101.tar.gz
+  ftp://ftp.infomagic.com/pub/mirrors/linux/wine/development/Wine-970101.tar.gz
+  ftp://aris.com/pub/linux/ALPHA/Wine/development/Wine-970101.tar.gz
 
 It should also be available from any site that mirrors tsx-11 or sunsite.
 
diff --git a/ChangeLog b/ChangeLog
index 517be68..f98f01d 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,4 +1,86 @@
 ----------------------------------------------------------------------
+Wed Jan  1 15:36:17 1997  Alexandre Julliard  <julliard@lrc.epfl.ch>
+
+	* [controls/listbox.c]
+	Use FindFirstFile/FindNextFile in LISTBOX_Directory.
+
+	* [files/dos_fs.c]
+	Rewrote FindFirstFile/FindNextFile to use DOSFS_FindNext().
+
+	* [files/file.c] [files/directory.c]
+	Use Win32 kernel objects and handles for file handles.
+	Unified SearchPath() and OpenFile().
+
+	* [loader/builtin.c]
+	Moved to if1632/ directory.
+
+	* [tools/build.c] [debugger/*] [miscemu/*]
+	Win16 register functions now receive the same CONTEXT * structure
+	as Win32 functions.
+
+	* [include/sigcontext.h] [miscemu/instr.c]
+	Added new macros to get register values from the SIGCONTEXT
+	structure (only used for instruction emulation now).
+
+	* [scheduler/process.c] [scheduler/thread.c] (New files)
+	Allocate process and thread structures.
+
+	* [scheduler/process.c] [win32/k32obj.c]
+	Added Win32 kernel objects and handles management.
+
+	* [loader/task.c]
+	Create a Win32 process and thread for every Win16 task.
+
+	* [misc/commdlg.c] [misc/shell.c] [windows/msgbox.c]
+	Built-in resources are now in Win32 format. This also avoids
+	16-bit callbacks for built-in dialogs.
+
+	* [misc/lzexpand.c]
+	Differentiate between 16-bit and 32-bit file handles.
+
+	* [miscemu/int*.c]
+	Moved all int emulation to msdos/ directory.
+
+	* [msdos/*]
+	New directory msdos/ contains all MS-DOS emulation code that can
+	also be used for Winelib; this should enable Winelib apps to use
+	DOS3Call and related functions.
+
+	* [rc/winerc.c]
+	A few bug fixes for Win32 resource format.
+
+	* [windows/winpos.c]
+	Hack in WINPOS_ReorderOwnerPopups() to avoid X crashed (still not
+	right though).
+
+Sun Dec 29 17:47:55 1996  O. Flebbe <flebbe@science-computing.uni-tuebingen.de>
+
+	* [loader/pe_image.c]
+	Make sure BSS of a PE_Image is zero.
+
+Sat Dec 28 22:15:34 1996 Alex Korobka <alex@trantor.pharm.sunysb.edu>
+
+	* [windows/scroll.c]
+	ScrollWindowEx() rewrite, ScrollDC() fix.
+
+	* [windows/nonclient.c] [controls/menu.c]
+	Fixed Alt-Space crashes in dialogs.
+
+	* [windows/event.c] [windows/message.c]
+	Some changes in mouse message generation.
+
+Thu Dec 26 09:25:24 1996  Philippe De Muyter  <phdm@info.ucl.ac.be>
+
+	* [debugger/stabs.c]
+	Dummy DEBUG_ReadExecutableDbgInfo provided for !__ELF__ case.
+
+Tue Dec 24 00:59:05 MET 1996  Martin Buck <martin-2.buck@student.uni-ulm.de>
+
+	* [windows/event.c]
+	Changed XK_Page_{Up,Down} to XK_{Prior,Next} for X11R5
+	compatibility.
+
+----------------------------------------------------------------------
 Sun Dec 22 13:30:18 1996  Alexandre Julliard  <julliard@lrc.epfl.ch>
 
 	* [graphics/metafiledrv/init.c] [graphisc/metafiledrv/mapping.c]
diff --git a/Makefile.in b/Makefile.in
index 9a676b1..f861a0a 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -53,9 +53,11 @@
 	loader \
 	memory \
 	misc \
+	msdos \
 	multimedia \
 	objects \
 	resources \
+	scheduler \
 	win32 \
 	windows
 
@@ -82,9 +84,11 @@
 	loader/loader.o \
 	memory/memory.o \
 	misc/misc.o \
+	msdos/msdos.o \
 	multimedia/multimedia.o \
 	objects/objects.o \
 	resources/resources.o \
+	scheduler/scheduler.o \
 	win32/win32.o \
 	windows/windows.o
 
diff --git a/configure b/configure
index b7d6163..8189b70 100755
--- a/configure
+++ b/configure
@@ -2489,6 +2489,7 @@
 memory/Makefile
 misc/Makefile
 miscemu/Makefile
+msdos/Makefile
 multimedia/Makefile
 objects/Makefile
 programs/Makefile
@@ -2496,6 +2497,7 @@
 programs/winhelp/Makefile
 rc/Makefile
 resources/Makefile
+scheduler/Makefile
 tools/Makefile
 win32/Makefile
 windows/Makefile  include/config.h" | sed "s/:[^ ]*//g"` conftest*; exit 1' 1 2 15
@@ -2604,6 +2606,7 @@
 memory/Makefile
 misc/Makefile
 miscemu/Makefile
+msdos/Makefile
 multimedia/Makefile
 objects/Makefile
 programs/Makefile
@@ -2611,6 +2614,7 @@
 programs/winhelp/Makefile
 rc/Makefile
 resources/Makefile
+scheduler/Makefile
 tools/Makefile
 win32/Makefile
 windows/Makefile "}
diff --git a/configure.in b/configure.in
index 273f842..ede5e0c 100644
--- a/configure.in
+++ b/configure.in
@@ -131,6 +131,7 @@
 memory/Makefile
 misc/Makefile
 miscemu/Makefile
+msdos/Makefile
 multimedia/Makefile
 objects/Makefile
 programs/Makefile
@@ -138,6 +139,7 @@
 programs/winhelp/Makefile
 rc/Makefile
 resources/Makefile
+scheduler/Makefile
 tools/Makefile
 win32/Makefile
 windows/Makefile ])
diff --git a/controls/desktop.c b/controls/desktop.c
index 8fcde45..895fec4 100644
--- a/controls/desktop.c
+++ b/controls/desktop.c
@@ -10,7 +10,6 @@
 #include <unistd.h>
 #include "win.h"
 #include "desktop.h"
-#include "directory.h"
 #include "graphics.h"
 #include "heap.h"
 
@@ -25,13 +24,13 @@
     BITMAPFILEHEADER *fileHeader;
     BITMAPINFO *bitmapInfo;
     HBITMAP32 hbitmap;
-    HFILE file;
+    HFILE32 file;
     LPSTR buffer;
     LONG size;
 
     /* Read all the file into memory */
 
-    if ((file = _lopen( filename, OF_READ )) == HFILE_ERROR)
+    if ((file = _lopen32( filename, OF_READ )) == HFILE_ERROR32)
     {
         UINT32 len = GetWindowsDirectory32A( NULL, 0 );
         if (!(buffer = HeapAlloc( SystemHeap, 0, len + strlen(filename) + 2 )))
@@ -39,19 +38,19 @@
         GetWindowsDirectory32A( buffer, len + 1 );
         strcat( buffer, "\\" );
         strcat( buffer, filename );
-        file = _lopen( buffer, OF_READ );
+        file = _lopen32( buffer, OF_READ );
         HeapFree( SystemHeap, 0, buffer );
     }
-    if (file == HFILE_ERROR) return 0;
-    size = _llseek( file, 0, 2 );
+    if (file == HFILE_ERROR32) return 0;
+    size = _llseek32( file, 0, 2 );
     if (!(buffer = HeapAlloc( SystemHeap, 0, size )))
     {
-	_lclose( file );
+	_lclose32( file );
 	return 0;
     }
-    _llseek( file, 0, 0 );
+    _llseek32( file, 0, 0 );
     size = _lread32( file, buffer, size );
-    _lclose( file );
+    _lclose32( file );
     fileHeader = (BITMAPFILEHEADER *)buffer;
     bitmapInfo = (BITMAPINFO *)(buffer + sizeof(BITMAPFILEHEADER));
     
@@ -157,7 +156,7 @@
 
     case WM_SYSCOMMAND:
 	if ((wParam & 0xfff0) != SC_CLOSE) return 0;
-	ExitWindows( 0, 0 ); 
+	ExitWindows16( 0, 0 ); 
 
     case WM_SETCURSOR:
         return (LRESULT)SetCursor( LoadCursor16( 0, IDC_ARROW ) );
diff --git a/controls/listbox.c b/controls/listbox.c
index ceed8b2..70f13b3 100644
--- a/controls/listbox.c
+++ b/controls/listbox.c
@@ -8,9 +8,8 @@
 #include <string.h>
 #include <stdio.h>
 #include "windows.h"
+#include "winerror.h"
 #include "drive.h"
-#include "dos_fs.h"
-#include "msdos.h"
 #include "heap.h"
 #include "spy.h"
 #include "win.h"
@@ -478,7 +477,7 @@
             else
                 SetTextColor( hdc, GetSysColor( COLOR_WINDOWTEXT ) );
         }
-        dprintf_listbox( stddeb, "Listbox %04x: painting %d (%s) action=%02x"
+        dprintf_listbox( stddeb, "Listbox %04x: painting %d (%s) action=%02x "
                          "rect=%d,%d-%d,%d\n",
                          wnd->hwndSelf, index, item ? item->str : "", action,
                          rect->left, rect->top, rect->right, rect->bottom );
@@ -1455,55 +1454,45 @@
 LRESULT LISTBOX_Directory( WND *wnd, LB_DESCR *descr, UINT32 attrib,
                            LPCSTR filespec, BOOL32 long_names )
 {
-    char mask[13];
-    const char *ptr;
-    char *path, *p;
-    int count, skip, pos;
-    LRESULT ret;
-    DOS_DIRENT entry;
+    HANDLE32 handle;
+    LRESULT ret = LB_OKAY;
+    WIN32_FIND_DATA32A entry;
+    int pos;
 
-    /* FIXME: should use FindFirstFile/FindNextFile */
-
-    if (!filespec) return LB_ERR;
-    if (!(ptr = DOSFS_GetUnixFileName( filespec, FALSE ))) return LB_ERR;
-    path = HEAP_strdupA( SystemHeap, 0, ptr );
-    p = strrchr( path, '/' );
-    *p++ = '\0';
-    if (!(ptr = DOSFS_ToDosFCBFormat( p )))
+    if ((handle = FindFirstFile32A(filespec,&entry)) == INVALID_HANDLE_VALUE32)
     {
-        HeapFree( SystemHeap, 0, path );
-        return LB_ERR;
+        if (GetLastError() != ERROR_NO_MORE_FILES) return LB_ERR;
     }
-    strcpy( mask, ptr );
-
-    skip = 0;
-    ret = LB_OKAY;
-    attrib &= ~FA_LABEL;
-    while ((count = DOSFS_FindNext( path, mask, NULL, 0,
-                                    attrib, skip, &entry )) > 0)
+    else
     {
-        char buffer[260];
-        skip += count;
-        if (entry.attr & FA_DIRECTORY)
+        do
         {
-            if (!(attrib & DDL_DIRECTORY) || !strcmp(entry.name,".          "))
-                continue;
-            if (long_names) sprintf( buffer, "[%s]", entry.unixname );
-            else sprintf( buffer, "[%s]", DOSFS_ToDosDTAFormat( entry.name ) );
-        }
-        else  /* not a directory */
-        {
-            if ((attrib & DDL_EXCLUSIVE) &&
-                ((attrib & (FA_RDONLY|FA_HIDDEN|FA_SYSTEM|FA_ARCHIVE)) !=
-                 (entry.attr & (FA_RDONLY|FA_HIDDEN|FA_SYSTEM|FA_ARCHIVE))))
-                continue;
-            if (long_names) strcpy( buffer, entry.unixname );
-            else strcpy( buffer, DOSFS_ToDosDTAFormat( entry.name ) );
-        }
-        if (!long_names) AnsiLower( buffer );
-        pos = LISTBOX_FindFileStrPos( wnd, descr, buffer );
-        if ((ret = LISTBOX_InsertString( wnd, descr, pos, buffer )) < 0)
-            break;
+            char buffer[270];
+            if (entry.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
+            {
+                if (!(attrib & DDL_DIRECTORY) ||
+                    !strcmp( entry.cAlternateFileName, "." )) continue;
+                if (long_names) sprintf( buffer, "[%s]", entry.cFileName );
+                else sprintf( buffer, "[%s]", entry.cAlternateFileName );
+            }
+            else  /* not a directory */
+            {
+#define ATTRIBS (FILE_ATTRIBUTE_READONLY | FILE_ATTRIBUTE_HIDDEN | \
+                 FILE_ATTRIBUTE_SYSTEM | FILE_ATTRIBUTE_ARCHIVE)
+
+                if ((attrib & DDL_EXCLUSIVE) &&
+                    ((attrib & ATTRIBS) != (entry.dwFileAttributes & ATTRIBS)))
+                    continue;
+#undef ATTRIBS
+                if (long_names) strcpy( buffer, entry.cFileName );
+                else strcpy( buffer, entry.cAlternateFileName );
+            }
+            if (!long_names) AnsiLower( buffer );
+            pos = LISTBOX_FindFileStrPos( wnd, descr, buffer );
+            if ((ret = LISTBOX_InsertString( wnd, descr, pos, buffer )) < 0)
+                break;
+        } while (FindNextFile32A( handle, &entry ));
+        FindClose32( handle );
     }
 
     if ((ret == LB_OKAY) && (attrib & DDL_DRIVES))
@@ -1517,8 +1506,6 @@
                 break;
         }
     }
-
-    HeapFree( SystemHeap, 0, path );
     return ret;
 }
 
@@ -1744,6 +1731,7 @@
         break;
     case LB_TIMER_DOWN:
         index = descr->top_item + LISTBOX_GetCurrentPageSize( wnd, descr );
+        if (index == descr->focus_item) index++;
         if (index >= descr->nb_items) index = descr->nb_items - 1;
         break;
     case LB_TIMER_RIGHT:
diff --git a/controls/menu.c b/controls/menu.c
index 8e8583d..8c6123f 100644
--- a/controls/menu.c
+++ b/controls/menu.c
@@ -88,7 +88,6 @@
 
 extern void  NC_DrawSysButton(HWND hwnd, HDC32 hdc, BOOL down); /*nonclient.c*/
 extern BOOL  NC_GetSysPopupPos(WND* wndPtr, RECT16* rect);
-extern HTASK16 TASK_GetNextTask(HTASK16);
 
 static HBITMAP16 hStdCheck = 0;
 static HBITMAP16 hStdMnArrow = 0;
@@ -111,13 +110,9 @@
 static HMENU16 MENU_CopySysMenu(void)
 {
     HMENU16 hMenu;
-    HGLOBAL16 handle;
     POPUPMENU *menu;
 
-    if (!(handle = SYSRES_LoadResource( SYSRES_MENU_SYSMENU ))) return 0;
-    hMenu = LoadMenuIndirect16( GlobalLock16( handle ) );
-    SYSRES_FreeResource( handle );
-    if (!hMenu)
+    if (!(hMenu = LoadMenuIndirect32A( SYSRES_GetResPtr(SYSRES_MENU_SYSMENU))))
     {
 	dprintf_menu(stddeb,"No SYSMENU\n");
 	return 0;
@@ -1644,8 +1639,8 @@
  * If 'x' and 'y' are not 0, we simulate a button-down event at (x,y)
  * before beginning tracking. This is to help menu-bar tracking.
  */
-static BOOL MENU_TrackMenu( HMENU16 hmenu, UINT wFlags, int x, int y,
-			    HWND hwnd, const RECT16 *lprect )
+static BOOL32 MENU_TrackMenu( HMENU16 hmenu, UINT32 wFlags, int x, int y,
+                              HWND16 hwnd, const RECT16 *lprect )
 {
     MSG16 msg;
     POPUPMENU *menu;
@@ -1660,10 +1655,17 @@
 	POINT16 pt = { x, y };
 	MENU_ButtonDown( hwnd, hmenu, &hmenuCurrent, pt );
     }
-    SetCapture32( hwnd );
+
+    EVENT_Capture( hwnd, HTMENU );
+
     while (!fClosed)
     {
-	if (!MSG_InternalGetMessage( &msg, 0, hwnd, MSGF_MENU, 0, TRUE ))
+	/* we have to keep the message in the queue until it's
+	 * clear that menu loop is not over yet.
+	 */
+
+	if (!MSG_InternalGetMessage( &msg, 0, hwnd, MSGF_MENU, 
+					      PM_NOREMOVE, TRUE ))
 	    break;
 
         TranslateMessage( &msg );
@@ -1672,26 +1674,29 @@
 	if ((msg.message >= WM_MOUSEFIRST) && (msg.message <= WM_MOUSELAST))
 	{
 	      /* Find the sub-popup for this mouse event (if any) */
+
 	    HMENU16 hsubmenu = MENU_FindMenuByCoords( hmenu, msg.pt );
 
 	    switch(msg.message)
 	    {
+		/* no WM_NC... messages in captured state */
+
+	    case WM_RBUTTONDBLCLK:
 	    case WM_RBUTTONDOWN:
-	    case WM_NCRBUTTONDOWN:
 		if (!(wFlags & TPM_RIGHTBUTTON)) break;
 		/* fall through */
+
+	    case WM_LBUTTONDBLCLK:
 	    case WM_LBUTTONDOWN:
-	    case WM_NCLBUTTONDOWN:
 		fClosed = !MENU_ButtonDown( hwnd, hsubmenu,
 					    &hmenuCurrent, msg.pt );
 		break;
 		
 	    case WM_RBUTTONUP:
-	    case WM_NCRBUTTONUP:
 		if (!(wFlags & TPM_RIGHTBUTTON)) break;
 		/* fall through */
+
 	    case WM_LBUTTONUP:
-	    case WM_NCLBUTTONUP:
 		  /* If outside all menus but inside lprect, ignore it */
 		if (!hsubmenu && lprect && PtInRect16(lprect, msg.pt)) break;
 		fClosed = !MENU_ButtonUp( hwnd, hsubmenu,
@@ -1700,7 +1705,6 @@
 		break;
 		
 	    case WM_MOUSEMOVE:
-	    case WM_NCMOUSEMOVE:
 		if ((msg.wParam & MK_LBUTTON) ||
 		    ((wFlags & TPM_RIGHTBUTTON) && (msg.wParam & MK_RBUTTON)))
 		{
@@ -1814,22 +1818,63 @@
     return TRUE;
 }
 
+/***********************************************************************
+ *           MENU_TrackSysPopup
+ */
+static void MENU_TrackSysPopup( WND* pWnd )
+{
+    RECT16      rect;
+    HMENU16     hMenu = pWnd->hSysMenu;
+    HDC16       hDC = 0;
+
+    /* track the system menu like a normal popup menu */
+
+    if( IsMenu(hMenu) )
+    {
+	HWND16 hWnd = pWnd->hwndSelf;
+	if (!(pWnd->dwStyle & WS_MINIMIZE))
+	{
+	    hDC = GetWindowDC32( hWnd );
+	    NC_DrawSysButton( hWnd, hDC, TRUE );
+	}
+	NC_GetSysPopupPos( pWnd, &rect );
+	MENU_InitSysMenuPopup( hMenu, pWnd->dwStyle,
+				      pWnd->class->style);
+	TrackPopupMenu16( hMenu, TPM_LEFTALIGN | TPM_LEFTBUTTON,
+				 rect.left, rect.bottom, 0, hWnd, &rect );
+	if (!(pWnd->dwStyle & WS_MINIMIZE))
+	{
+             NC_DrawSysButton( hWnd, hDC, FALSE );
+             ReleaseDC32( hWnd, hDC );
+	}
+    }
+}
 
 /***********************************************************************
  *           MENU_TrackMouseMenuBar
  *
  * Menu-bar tracking upon a mouse event. Called from NC_HandleSysCommand().
  */
-void MENU_TrackMouseMenuBar( HWND hwnd, POINT16 pt )
+void MENU_TrackMouseMenuBar( WND* wndPtr, INT16 ht, POINT16 pt )
 {
-    WND *wndPtr = WIN_FindWndPtr( hwnd );
-    HideCaret(0);
-    SendMessage16( hwnd, WM_ENTERMENULOOP, 0, 0 );
-    SendMessage16( hwnd, WM_INITMENU, wndPtr->wIDmenu, 0 );
-    MENU_TrackMenu( (HMENU16)wndPtr->wIDmenu, TPM_LEFTALIGN | TPM_LEFTBUTTON,
-		    pt.x, pt.y, hwnd, NULL );
-    SendMessage16( hwnd, WM_EXITMENULOOP, 0, 0 );
-    ShowCaret(0);
+    BOOL32	bTrackSys = ((ht == HTSYSMENU && !wndPtr->wIDmenu) ||
+		             (wndPtr->dwStyle & (WS_MINIMIZE | WS_CHILD)));
+    HWND16	hWnd = wndPtr->hwndSelf;
+    HMENU16	hMenu = (bTrackSys) ? wndPtr->hSysMenu : wndPtr->wIDmenu;
+
+    if( IsMenu(hMenu) )
+    {
+	HideCaret(0);
+	SendMessage16( hWnd, WM_ENTERMENULOOP, 0, 0 );
+	SendMessage16( hWnd, WM_INITMENU, hMenu, 0 );
+	if( bTrackSys )
+	    MENU_TrackSysPopup( wndPtr );
+	else
+	    MENU_TrackMenu( hMenu, TPM_LEFTALIGN | TPM_LEFTBUTTON,
+			    pt.x, pt.y, hWnd, NULL );
+	SendMessage16( hWnd, WM_EXITMENULOOP, 0, 0 );
+	ShowCaret(0);
+    }
 }
 
 
@@ -1838,64 +1883,67 @@
  *
  * Menu-bar tracking upon a keyboard event. Called from NC_HandleSysCommand().
  */
-void MENU_TrackKbdMenuBar( WND* wndPtr, UINT wParam, INT vkey)
+void MENU_TrackKbdMenuBar( WND* wndPtr, UINT16 wParam, INT16 vkey)
 {
-    UINT uItem = NO_SELECTED_ITEM;
+   INT16 htMenu;
+   UINT16 uItem = NO_SELECTED_ITEM;
    HMENU16 hTrackMenu; 
 
-    /* find window that has a menu 
-     */
+    /* find window that has a menu */
  
-    if( !(wndPtr->dwStyle & WS_CHILD) )
-      {
-	  wndPtr = WIN_FindWndPtr( GetActiveWindow() );
-          if( !wndPtr ) return;
-      }
-    else
-      while( wndPtr->dwStyle & WS_CHILD && 
-           !(wndPtr->dwStyle & WS_SYSMENU) )
-           if( !(wndPtr = wndPtr->parent) ) return;
+    while( wndPtr->dwStyle & WS_CHILD && !(wndPtr->dwStyle & WS_SYSMENU) )
+	if( !(wndPtr = wndPtr->parent) ) return;
           
-    if( wndPtr->dwStyle & WS_CHILD || !wndPtr->wIDmenu )
-      if( !(wndPtr->dwStyle & WS_SYSMENU) )
-	return;
+    if( !wndPtr->wIDmenu && !(wndPtr->dwStyle & WS_SYSMENU) ) return;
 
-    hTrackMenu = ( IsMenu( wndPtr->wIDmenu ) )? wndPtr->wIDmenu:
-                                                wndPtr->hSysMenu;
+    htMenu = ((wndPtr->dwStyle & (WS_CHILD | WS_MINIMIZE)) || 
+	      !wndPtr->wIDmenu) ? HTSYSMENU : HTMENU;
+    hTrackMenu = ( htMenu == HTSYSMENU ) ? wndPtr->hSysMenu : wndPtr->wIDmenu;
 
-    HideCaret(0);
-    SendMessage16( wndPtr->hwndSelf, WM_ENTERMENULOOP, 0, 0 );
-    SendMessage16( wndPtr->hwndSelf, WM_INITMENU, wndPtr->wIDmenu, 0 );
+    if( IsMenu( hTrackMenu ) )
+    {
+        HideCaret(0);
+        SendMessage16( wndPtr->hwndSelf, WM_ENTERMENULOOP, 0, 0 );
+        SendMessage16( wndPtr->hwndSelf, WM_INITMENU, hTrackMenu, 0 );
 
-    /* find suitable menu entry 
-     */
+        /* find suitable menu entry */
 
-    if( vkey == VK_SPACE )
-        uItem = SYSMENU_SELECTED;
-    else if( vkey )
-      {
-        uItem = MENU_FindItemByKey( wndPtr->hwndSelf, wndPtr->wIDmenu, vkey );
-	if( uItem >= 0xFFFE )
-	  {
-	    if( uItem == 0xFFFF ) 
-                MessageBeep(0);
-	    SendMessage16( wndPtr->hwndSelf, WM_EXITMENULOOP, 0, 0 );
-            ShowCaret(0);
-	    return;
-	  }
-      }
+        if( vkey == VK_SPACE )
+            uItem = SYSMENU_SELECTED;
+        else if( vkey )
+        {
+            uItem = ( htMenu == HTSYSMENU )
+		    ? 0xFFFE	/* only VK_SPACE in this case */
+		    : MENU_FindItemByKey( wndPtr->hwndSelf, wndPtr->wIDmenu, vkey );
+	    if( uItem >= 0xFFFE )
+	    {
+	        if( uItem == 0xFFFF ) MessageBeep(0);
+		htMenu = 0;
+	    }
+        }
 
-    MENU_SelectItem( wndPtr->hwndSelf, hTrackMenu, uItem, TRUE );
-    if( uItem == NO_SELECTED_ITEM )
-      MENU_SelectItemRel( wndPtr->hwndSelf, hTrackMenu, ITEM_NEXT );
-    else
-      PostMessage( wndPtr->hwndSelf, WM_KEYDOWN, VK_DOWN, 0L );
+	switch( htMenu )
+	{
+	    case HTMENU:
+ 		MENU_SelectItem( wndPtr->hwndSelf, hTrackMenu, uItem, TRUE );
+		if( uItem == NO_SELECTED_ITEM )
+		    MENU_SelectItemRel( wndPtr->hwndSelf, hTrackMenu, ITEM_NEXT );
+		else
+		    PostMessage( wndPtr->hwndSelf, WM_KEYDOWN, VK_DOWN, 0L );
 
-    MENU_TrackMenu( hTrackMenu, TPM_LEFTALIGN | TPM_LEFTBUTTON,
-		    0, 0, wndPtr->hwndSelf, NULL );
+		MENU_TrackMenu( hTrackMenu, TPM_LEFTALIGN | TPM_LEFTBUTTON,
+				0, 0, wndPtr->hwndSelf, NULL );
+		break;
 
-    SendMessage16( wndPtr->hwndSelf, WM_EXITMENULOOP, 0, 0 );
-    ShowCaret(0);
+	    case HTSYSMENU:
+		MENU_TrackSysPopup( wndPtr );
+
+	    default:
+	}
+
+        SendMessage16( wndPtr->hwndSelf, WM_EXITMENULOOP, 0, 0 );
+        ShowCaret(0);
+    }
 }
 
 
@@ -1927,6 +1975,20 @@
     return TrackPopupMenu16(hMenu,wFlags,x,y,nReserved,hWnd,lpRect?&r:NULL);
 }
 
+/**********************************************************************
+ *           TrackPopupMenuEx   (USER32.549)
+ */
+BOOL32 TrackPopupMenuEx( HMENU32 hMenu, UINT32 wFlags, INT32 x, INT32 y,
+			 HWND32 hWnd, LPTPMPARAMS lpTpm )
+{
+    RECT16 r;
+
+    fprintf( stderr, "TrackPopupMenuEx: not fully implemented\n" );
+
+    if (lpTpm)
+        CONV_RECT32TO16( &lpTpm->rcExclude, &r );
+    return TrackPopupMenu16(hMenu,wFlags,x,y,0,hWnd,lpTpm?&r:NULL);
+}
 
 /***********************************************************************
  *           PopupMenuWndProc
@@ -2709,7 +2771,7 @@
     WORD version, offset;
     LPCSTR p = (LPCSTR)template;
 
-    dprintf_menu(stddeb,"LoadMenuIndirect32A: %p\n", template );
+    dprintf_menu(stddeb,"LoadMenuIndirect16: %p\n", template );
     version = GET_WORD(p);
     p += sizeof(WORD);
     if (version)
@@ -2738,7 +2800,7 @@
     WORD version, offset;
     LPCSTR p = (LPCSTR)template;
 
-    dprintf_menu(stddeb,"LoadMenuIndirect32A: %p\n", template );
+    dprintf_menu(stddeb,"LoadMenuIndirect16: %p\n", template );
     version = GET_WORD(p);
     p += sizeof(WORD);
     if (version)
diff --git a/controls/oldlbox.c b/controls/oldlbox.c
index c1577ce..4c256c9 100644
--- a/controls/oldlbox.c
+++ b/controls/oldlbox.c
@@ -27,7 +27,6 @@
 #include "listbox.h"
 #include "dos_fs.h"
 #include "drive.h"
-#include "file.h"
 #include "heap.h"
 #include "stddebug.h"
 #include "debug.h"
@@ -699,6 +698,7 @@
 
 LONG ListBoxDirectory(LPHEADLIST lphl, UINT attrib, LPCSTR filespec)
 {
+#if 0
     char 	mask[13];
     char*	temp = NULL;
     const char*	ptr;
@@ -772,6 +772,8 @@
     SEGPTR_FREE( temp );
 
     return ret;
+#endif
+    return 0;
 }
 
 /* ------------------------- dimensions ------------------------- */
diff --git a/debugger/break.c b/debugger/break.c
index 8c727b4..eb97f6c 100644
--- a/debugger/break.c
+++ b/debugger/break.c
@@ -65,9 +65,10 @@
  * Determine if the instruction at CS:EIP is an instruction that
  * we need to step over (like a call or a repetitive string move).
  */
-static BOOL32 DEBUG_IsStepOverInstr( SIGCONTEXT *context )
+static BOOL32 DEBUG_IsStepOverInstr(void)
 {
-    BYTE *instr = (BYTE *)PTR_SEG_OFF_TO_LIN(CS_reg(context),EIP_reg(context));
+    BYTE *instr = (BYTE *)PTR_SEG_OFF_TO_LIN( CS_reg(&DEBUG_context),
+                                              EIP_reg(&DEBUG_context) );
 
     for (;;)
     {
@@ -182,7 +183,7 @@
     int num;
     BYTE *p;
 
-    DBG_FIX_ADDR_SEG( &addr, CS_reg(DEBUG_context) );
+    DBG_FIX_ADDR_SEG( &addr, CS_reg(&DEBUG_context) );
 
     if (next_bp < MAX_BREAKPOINTS)
         num = next_bp++;
@@ -273,17 +274,17 @@
  * Determine if we should continue execution after a SIGTRAP signal when
  * executing in the given mode.
  */
-BOOL32 DEBUG_ShouldContinue( SIGCONTEXT *context, enum exec_mode mode )
+BOOL32 DEBUG_ShouldContinue( enum exec_mode mode )
 {
     DBG_ADDR addr;
     int bpnum;
 
       /* If not single-stepping, back up over the int3 instruction */
-    if (!(EFL_reg(DEBUG_context) & STEP_FLAG)) EIP_reg(DEBUG_context)--;
+    if (!(EFL_reg(&DEBUG_context) & STEP_FLAG)) EIP_reg(&DEBUG_context)--;
 
-    addr.seg = (CS_reg(DEBUG_context) == WINE_CODE_SELECTOR) ? 
-                0 : CS_reg(DEBUG_context);
-    addr.off = EIP_reg(DEBUG_context);
+    addr.seg = (CS_reg(&DEBUG_context) == WINE_CODE_SELECTOR) ? 
+                0 : CS_reg(&DEBUG_context);
+    addr.off = EIP_reg(&DEBUG_context);
         
     bpnum = DEBUG_FindBreakpoint( &addr );
     breakpoints[0].enabled = 0;  /* disable the step-over breakpoint */
@@ -299,8 +300,8 @@
 
     /* If there's no breakpoint and we are not single-stepping, then we     */
     /* must have encountered an int3 in the Windows program; let's skip it. */
-    if ((bpnum == -1) && !(EFL_reg(DEBUG_context) & STEP_FLAG))
-        EIP_reg(DEBUG_context)++;
+    if ((bpnum == -1) && !(EFL_reg(&DEBUG_context) & STEP_FLAG))
+        EIP_reg(&DEBUG_context)++;
 
       /* no breakpoint, continue if in continuous mode */
     return (mode == EXEC_CONT);
@@ -313,14 +314,13 @@
  * Set the breakpoints to the correct state to restart execution
  * in the given mode.
  */
-void DEBUG_RestartExecution( SIGCONTEXT *context, enum exec_mode mode,
-                             int instr_len )
+void DEBUG_RestartExecution( enum exec_mode mode, int instr_len )
 {
     DBG_ADDR addr;
 
-    addr.seg = (CS_reg(DEBUG_context) == WINE_CODE_SELECTOR) ?
-                0 : CS_reg(DEBUG_context);
-    addr.off = EIP_reg(DEBUG_context);
+    addr.seg = (CS_reg(&DEBUG_context) == WINE_CODE_SELECTOR) ?
+                0 : CS_reg(&DEBUG_context);
+    addr.off = EIP_reg(&DEBUG_context);
 
     if (DEBUG_FindBreakpoint( &addr ) != -1)
         mode = EXEC_STEP_INSTR;  /* If there's a breakpoint, skip it */
@@ -328,14 +328,14 @@
     switch(mode)
     {
     case EXEC_CONT: /* Continuous execution */
-        EFL_reg(DEBUG_context) &= ~STEP_FLAG;
+        EFL_reg(&DEBUG_context) &= ~STEP_FLAG;
         DEBUG_SetBreakpoints( TRUE );
         break;
 
     case EXEC_STEP_OVER:  /* Stepping over a call */
-        if (DEBUG_IsStepOverInstr(DEBUG_context))
+        if (DEBUG_IsStepOverInstr())
         {
-            EFL_reg(DEBUG_context) &= ~STEP_FLAG;
+            EFL_reg(&DEBUG_context) &= ~STEP_FLAG;
             addr.off += instr_len;
             breakpoints[0].addr    = addr;
             breakpoints[0].enabled = TRUE;
@@ -347,7 +347,7 @@
         /* else fall through to single-stepping */
 
     case EXEC_STEP_INSTR: /* Single-stepping an instruction */
-        EFL_reg(DEBUG_context) |= STEP_FLAG;
+        EFL_reg(&DEBUG_context) |= STEP_FLAG;
         break;
     }
 }
diff --git a/debugger/dbg.y b/debugger/dbg.y
index a7ab4f7..4bc7fdf 100644
--- a/debugger/dbg.y
+++ b/debugger/dbg.y
@@ -134,8 +134,8 @@
                                     addr.off += $4;
                                     DEBUG_AddBreakpoint( &addr ); 
                                   }
-    | tBREAK tEOL              { DBG_ADDR addr = { CS_reg(DEBUG_context),
-                                                   EIP_reg(DEBUG_context) };
+    | tBREAK tEOL              { DBG_ADDR addr = { CS_reg(&DEBUG_context),
+                                                   EIP_reg(&DEBUG_context) };
                                  DEBUG_AddBreakpoint( &addr );
                                }
 
@@ -239,32 +239,15 @@
 }
 
 
-
 /***********************************************************************
- *           DEBUG_EnterDebugger
+ *           DEBUG_Main
  *
- * Force an entry into the debugger.
+ * Debugger main loop.
  */
-void DEBUG_EnterDebugger(void)
-{
-    kill( getpid(), SIGHUP );
-}
-
-
-/***********************************************************************
- *           DebugBreak16   (KERNEL.203)
- */
-void DebugBreak16( SIGCONTEXT *regs )
-{
-    const char *module = MODULE_GetModuleName( GetExePtr(GetCurrentTask()) );
-    fprintf( stderr, "%s called DebugBreak\n", module ? module : "???" );
-    wine_debug( SIGTRAP, regs );
-}
-
-
-void wine_debug( int signal, SIGCONTEXT *regs )
+static void DEBUG_Main( int signal )
 {
     static int loaded_symbols = 0;
+    static BOOL32 in_debugger = FALSE;
     char SymbolTableFile[256];
     int instr_len = 0, newmode;
     BOOL32 ret_ok;
@@ -272,8 +255,13 @@
     yydebug = 0;
 #endif
 
+    if (in_debugger)
+    {
+        fprintf( stderr, "Segmentation fault inside debugger, exiting.\n" );
+        exit(1);
+    }
+    in_debugger = TRUE;
     yyin = stdin;
-    DEBUG_context = regs;
 
     DEBUG_SetBreakpoints( FALSE );
 
@@ -306,12 +294,12 @@
         DEBUG_LoadEntryPoints();
     }
 
-    if ((signal != SIGTRAP) || !DEBUG_ShouldContinue( regs, dbg_exec_mode ))
+    if ((signal != SIGTRAP) || !DEBUG_ShouldContinue( dbg_exec_mode ))
     {
         DBG_ADDR addr;
 
-        addr.seg = CS_reg(DEBUG_context);
-        addr.off = EIP_reg(DEBUG_context);
+        addr.seg = CS_reg(&DEBUG_context);
+        addr.off = EIP_reg(&DEBUG_context);
         DBG_FIX_ADDR_SEG( &addr, 0 );
 
         /* Put the display in a correct state */
@@ -332,9 +320,9 @@
             DEBUG_InfoStack();
             if (dbg_mode == 16)
             {
-                LDT_Print( SELECTOR_TO_ENTRY(DS_reg(DEBUG_context)), 1 );
-                if (ES_reg(DEBUG_context) != DS_reg(DEBUG_context))
-                    LDT_Print( SELECTOR_TO_ENTRY(ES_reg(DEBUG_context)), 1 );
+                LDT_Print( SELECTOR_TO_ENTRY(DS_reg(&DEBUG_context)), 1 );
+                if (ES_reg(&DEBUG_context) != DS_reg(&DEBUG_context))
+                    LDT_Print( SELECTOR_TO_ENTRY(ES_reg(&DEBUG_context)), 1 );
             }
             DEBUG_BackTrace();
         }
@@ -347,7 +335,7 @@
         {
             DEBUG_Disasm( &addr );
             fprintf(stderr,"\n");
-            instr_len = addr.off - EIP_reg(DEBUG_context);
+            instr_len = addr.off - EIP_reg(&DEBUG_context);
         }
 
         ret_ok = 0;
@@ -356,18 +344,48 @@
             issue_prompt();
             yyparse();
             flush_symbols();
-            addr.seg = CS_reg(DEBUG_context);
-            addr.off = EIP_reg(DEBUG_context);
+            addr.seg = CS_reg(&DEBUG_context);
+            addr.off = EIP_reg(&DEBUG_context);
             DBG_FIX_ADDR_SEG( &addr, 0 );
             ret_ok = DEBUG_ValidateRegisters();
             if (ret_ok) ret_ok = DBG_CHECK_READ_PTR( &addr, 1 );
         } while (!ret_ok);
     }
 
-    DEBUG_RestartExecution( regs, dbg_exec_mode, instr_len );
+    DEBUG_RestartExecution( dbg_exec_mode, instr_len );
+    in_debugger = FALSE;
 }
 
 
+/***********************************************************************
+ *           DEBUG_EnterDebugger
+ *
+ * Force an entry into the debugger.
+ */
+void DEBUG_EnterDebugger(void)
+{
+    kill( getpid(), SIGHUP );
+}
+
+
+/***********************************************************************
+ *           DebugBreak16   (KERNEL.203)
+ */
+void DebugBreak16( CONTEXT *regs )
+{
+    const char *module = MODULE_GetModuleName( GetExePtr(GetCurrentTask()) );
+    fprintf( stderr, "%s called DebugBreak\n", module ? module : "???" );
+    DEBUG_Main( SIGTRAP );
+}
+
+
+void wine_debug( int signal, SIGCONTEXT *regs )
+{
+    DEBUG_SetSigContext( regs );
+    DEBUG_Main( signal );
+    DEBUG_GetSigContext( regs );
+}
+
 int yyerror(char * s)
 {
 	fprintf(stderr,"%s\n", s);
diff --git a/debugger/debug.l b/debugger/debug.l
index 93e0929..1fc3770 100644
--- a/debugger/debug.l
+++ b/debugger/debug.l
@@ -34,7 +34,7 @@
 DIGIT	   [0-9]
 HEXDIGIT   [0-9a-fA-F]
 FORMAT     [bcdiswx]
-IDENTIFIER [_a-zA-Z\.~][_a-zA-Z0-9\.~]*
+IDENTIFIER [_a-zA-Z\.~][_a-zA-Z0-9\.~@]*
 
 %%
 
diff --git a/debugger/hash.c b/debugger/hash.c
index bfbdafa..0a9df01 100644
--- a/debugger/hash.c
+++ b/debugger/hash.c
@@ -164,7 +164,7 @@
 
     if (!nh) return FALSE;
     nh->addr = *addr;
-    DBG_FIX_ADDR_SEG( &nh->addr, DS_reg(DEBUG_context) );
+    DBG_FIX_ADDR_SEG( &nh->addr, DS_reg(&DEBUG_context) );
     return TRUE;
 }
 
diff --git a/debugger/info.c b/debugger/info.c
index 2abc981..ee6ce29 100644
--- a/debugger/info.c
+++ b/debugger/info.c
@@ -166,7 +166,7 @@
     static DBG_ADDR lasttime = { 0xffffffff, 0 };
 
     if (addr == NULL) addr = &lasttime;
-    DBG_FIX_ADDR_SEG( addr, CS_reg(DEBUG_context) );
+    DBG_FIX_ADDR_SEG( addr, CS_reg(&DEBUG_context) );
     while (count-- > 0)
     {
         DEBUG_PrintAddress( addr, dbg_mode, FALSE );
diff --git a/debugger/memory.c b/debugger/memory.c
index ee826b4..244fcde 100644
--- a/debugger/memory.c
+++ b/debugger/memory.c
@@ -114,7 +114,7 @@
 {
     DBG_ADDR addr = *address;
 
-    DBG_FIX_ADDR_SEG( &addr, DS_reg(DEBUG_context) );
+    DBG_FIX_ADDR_SEG( &addr, DS_reg(&DEBUG_context) );
     if (!DBG_CHECK_READ_PTR( &addr, sizeof(int) )) return 0;
     return *(int *)DBG_ADDR_TO_LIN( &addr );
 }
@@ -129,7 +129,7 @@
 {
     DBG_ADDR addr = *address;
 
-    DBG_FIX_ADDR_SEG( &addr, DS_reg(DEBUG_context) );
+    DBG_FIX_ADDR_SEG( &addr, DS_reg(&DEBUG_context) );
     if (!DBG_CHECK_WRITE_PTR( &addr, sizeof(int) )) return;
     *(int *)DBG_ADDR_TO_LIN( &addr ) = value;
 }
@@ -149,7 +149,7 @@
     int i;
 
     DBG_FIX_ADDR_SEG( &addr, (format == 'i') ?
-                             CS_reg(DEBUG_context) : DS_reg(DEBUG_context) );
+                             CS_reg(&DEBUG_context) : DS_reg(&DEBUG_context) );
 
     if (format != 'i' && count > 1)
     {
diff --git a/debugger/registers.c b/debugger/registers.c
index 3fc5422..2ecaf6a 100644
--- a/debugger/registers.c
+++ b/debugger/registers.c
@@ -7,7 +7,7 @@
 #include <stdio.h>
 #include "debugger.h"
 
-SIGCONTEXT *DEBUG_context;
+CONTEXT DEBUG_context;
 
 /***********************************************************************
  *           DEBUG_SetRegister
@@ -18,44 +18,32 @@
 {
     switch(reg)
     {
-        case REG_EAX: EAX_reg(DEBUG_context) = val; break;
-        case REG_EBX: EBX_reg(DEBUG_context) = val; break;
-        case REG_ECX: ECX_reg(DEBUG_context) = val; break;
-        case REG_EDX: EDX_reg(DEBUG_context) = val; break;
-        case REG_ESI: ESI_reg(DEBUG_context) = val; break;
-        case REG_EDI: EDI_reg(DEBUG_context) = val; break;
-        case REG_EBP: EBP_reg(DEBUG_context) = val; break;
-        case REG_EFL: EFL_reg(DEBUG_context) = val; break;
-        case REG_EIP: EIP_reg(DEBUG_context) = val; break;
-        case REG_ESP: ESP_reg(DEBUG_context) = val; break;
-        case REG_AX:  AX_reg(DEBUG_context)  = val; break;
-        case REG_BX:  BX_reg(DEBUG_context)  = val; break;
-        case REG_CX:  CX_reg(DEBUG_context)  = val; break;
-        case REG_DX:  DX_reg(DEBUG_context)  = val; break;
-        case REG_SI:  SI_reg(DEBUG_context)  = val; break;
-        case REG_DI:  DI_reg(DEBUG_context)  = val; break;
-        case REG_BP:  BP_reg(DEBUG_context)  = val; break;
-        case REG_FL:  FL_reg(DEBUG_context)  = val; break;
-        case REG_IP:  IP_reg(DEBUG_context)  = val; break;
-        case REG_SP:  SP_reg(DEBUG_context)  = val; break;
-        case REG_CS:  CS_reg(DEBUG_context)  = val; break;
-        case REG_DS:  DS_reg(DEBUG_context)  = val; break;
-        case REG_ES:  ES_reg(DEBUG_context)  = val; break;
-        case REG_SS:  SS_reg(DEBUG_context)  = val; break;
-#ifdef FS_reg
-        case REG_FS:  FS_reg(DEBUG_context)  = val; break;
-#else
-        case REG_FS:
-            fprintf( stderr, "Register %%fs not supported on this system\n" );
-            break;
-#endif
-#ifdef GS_reg
-        case REG_GS:  GS_reg(DEBUG_context)  = val; break;
-#else
-        case REG_GS:
-            fprintf( stderr, "Register %%gs not supported on this system\n" );
-            break;
-#endif
+        case REG_EAX: EAX_reg(&DEBUG_context) = val; break;
+        case REG_EBX: EBX_reg(&DEBUG_context) = val; break;
+        case REG_ECX: ECX_reg(&DEBUG_context) = val; break;
+        case REG_EDX: EDX_reg(&DEBUG_context) = val; break;
+        case REG_ESI: ESI_reg(&DEBUG_context) = val; break;
+        case REG_EDI: EDI_reg(&DEBUG_context) = val; break;
+        case REG_EBP: EBP_reg(&DEBUG_context) = val; break;
+        case REG_EFL: EFL_reg(&DEBUG_context) = val; break;
+        case REG_EIP: EIP_reg(&DEBUG_context) = val; break;
+        case REG_ESP: ESP_reg(&DEBUG_context) = val; break;
+        case REG_AX:  AX_reg(&DEBUG_context)  = val; break;
+        case REG_BX:  BX_reg(&DEBUG_context)  = val; break;
+        case REG_CX:  CX_reg(&DEBUG_context)  = val; break;
+        case REG_DX:  DX_reg(&DEBUG_context)  = val; break;
+        case REG_SI:  SI_reg(&DEBUG_context)  = val; break;
+        case REG_DI:  DI_reg(&DEBUG_context)  = val; break;
+        case REG_BP:  BP_reg(&DEBUG_context)  = val; break;
+        case REG_FL:  FL_reg(&DEBUG_context)  = val; break;
+        case REG_IP:  IP_reg(&DEBUG_context)  = val; break;
+        case REG_SP:  SP_reg(&DEBUG_context)  = val; break;
+        case REG_CS:  CS_reg(&DEBUG_context)  = val; break;
+        case REG_DS:  DS_reg(&DEBUG_context)  = val; break;
+        case REG_ES:  ES_reg(&DEBUG_context)  = val; break;
+        case REG_SS:  SS_reg(&DEBUG_context)  = val; break;
+        case REG_FS:  FS_reg(&DEBUG_context)  = val; break;
+        case REG_GS:  GS_reg(&DEBUG_context)  = val; break;
     }
 }
 
@@ -69,49 +57,106 @@
 {
     switch(reg)
     {
-        case REG_EAX: return EAX_reg(DEBUG_context);
-        case REG_EBX: return EBX_reg(DEBUG_context);
-        case REG_ECX: return ECX_reg(DEBUG_context);
-        case REG_EDX: return EDX_reg(DEBUG_context);
-        case REG_ESI: return ESI_reg(DEBUG_context);
-        case REG_EDI: return EDI_reg(DEBUG_context);
-        case REG_EBP: return EBP_reg(DEBUG_context);
-        case REG_EFL: return EFL_reg(DEBUG_context);
-        case REG_EIP: return EIP_reg(DEBUG_context);
-        case REG_ESP: return ESP_reg(DEBUG_context);
-        case REG_AX:  return AX_reg(DEBUG_context);
-        case REG_BX:  return BX_reg(DEBUG_context);
-        case REG_CX:  return CX_reg(DEBUG_context);
-        case REG_DX:  return DX_reg(DEBUG_context);
-        case REG_SI:  return SI_reg(DEBUG_context);
-        case REG_DI:  return DI_reg(DEBUG_context);
-        case REG_BP:  return BP_reg(DEBUG_context);
-        case REG_FL:  return FL_reg(DEBUG_context);
-        case REG_IP:  return IP_reg(DEBUG_context);
-        case REG_SP:  return SP_reg(DEBUG_context);
-        case REG_CS:  return CS_reg(DEBUG_context);
-        case REG_DS:  return DS_reg(DEBUG_context);
-        case REG_ES:  return ES_reg(DEBUG_context);
-        case REG_SS:  return SS_reg(DEBUG_context);
-#ifdef FS_reg
-        case REG_FS:  return FS_reg(DEBUG_context);
-#else
-        case REG_FS:
-            fprintf( stderr, "Register %%fs not supported on this system\n" );
-            return 0;
-#endif
-#ifdef GS_reg
-        case REG_GS:  return GS_reg(DEBUG_context);
-#else
-        case REG_GS:
-            fprintf( stderr, "Register %%gs not supported on this system\n" );
-            return 0;
-#endif
+        case REG_EAX: return EAX_reg(&DEBUG_context);
+        case REG_EBX: return EBX_reg(&DEBUG_context);
+        case REG_ECX: return ECX_reg(&DEBUG_context);
+        case REG_EDX: return EDX_reg(&DEBUG_context);
+        case REG_ESI: return ESI_reg(&DEBUG_context);
+        case REG_EDI: return EDI_reg(&DEBUG_context);
+        case REG_EBP: return EBP_reg(&DEBUG_context);
+        case REG_EFL: return EFL_reg(&DEBUG_context);
+        case REG_EIP: return EIP_reg(&DEBUG_context);
+        case REG_ESP: return ESP_reg(&DEBUG_context);
+        case REG_AX:  return AX_reg(&DEBUG_context);
+        case REG_BX:  return BX_reg(&DEBUG_context);
+        case REG_CX:  return CX_reg(&DEBUG_context);
+        case REG_DX:  return DX_reg(&DEBUG_context);
+        case REG_SI:  return SI_reg(&DEBUG_context);
+        case REG_DI:  return DI_reg(&DEBUG_context);
+        case REG_BP:  return BP_reg(&DEBUG_context);
+        case REG_FL:  return FL_reg(&DEBUG_context);
+        case REG_IP:  return IP_reg(&DEBUG_context);
+        case REG_SP:  return SP_reg(&DEBUG_context);
+        case REG_CS:  return CS_reg(&DEBUG_context);
+        case REG_DS:  return DS_reg(&DEBUG_context);
+        case REG_ES:  return ES_reg(&DEBUG_context);
+        case REG_SS:  return SS_reg(&DEBUG_context);
+        case REG_FS:  return FS_reg(&DEBUG_context);
+        case REG_GS:  return GS_reg(&DEBUG_context);
     }
     return 0;  /* should not happen */
 }
 
 
+/***********************************************************************
+ *           DEBUG_SetSigContext
+ *
+ * Set the register values from a sigcontext. 
+ */
+extern void DEBUG_SetSigContext( const SIGCONTEXT *sigcontext )
+{
+    EAX_reg(&DEBUG_context) = EAX_sig(sigcontext);
+    EBX_reg(&DEBUG_context) = EBX_sig(sigcontext);
+    ECX_reg(&DEBUG_context) = ECX_sig(sigcontext);
+    EDX_reg(&DEBUG_context) = EDX_sig(sigcontext);
+    ESI_reg(&DEBUG_context) = ESI_sig(sigcontext);
+    EDI_reg(&DEBUG_context) = EDI_sig(sigcontext);
+    EBP_reg(&DEBUG_context) = EBP_sig(sigcontext);
+    EFL_reg(&DEBUG_context) = EFL_sig(sigcontext);
+    EIP_reg(&DEBUG_context) = EIP_sig(sigcontext);
+    ESP_reg(&DEBUG_context) = ESP_sig(sigcontext);
+    CS_reg(&DEBUG_context)  = LOWORD(CS_sig(sigcontext));
+    DS_reg(&DEBUG_context)  = LOWORD(DS_sig(sigcontext));
+    ES_reg(&DEBUG_context)  = LOWORD(ES_sig(sigcontext));
+    SS_reg(&DEBUG_context)  = LOWORD(SS_sig(sigcontext));
+#ifdef FS_sig
+    FS_reg(&DEBUG_context)  = LOWORD(FS_sig(sigcontext));
+#else
+    __asm__("movw %%fs,%w0":"=r" (FS_reg(&DEBUG_context)));
+    FS_reg(&DEBUG_context) &= 0xffff;
+#endif
+#ifdef GS_sig
+    GS_reg(&DEBUG_context)  = LOWORD(GS_sig(sigcontext));
+#else
+    __asm__("movw %%gs,%w0":"=r" (GS_reg(&DEBUG_context)));
+    GS_reg(&DEBUG_context) &= 0xffff;
+#endif
+}
+
+
+/***********************************************************************
+ *           DEBUG_GetSigContext
+ *
+ * Build a sigcontext from the register values.
+ */
+extern void DEBUG_GetSigContext( SIGCONTEXT *sigcontext )
+{
+    EAX_sig(sigcontext) = EAX_reg(&DEBUG_context);
+    EBX_sig(sigcontext) = EBX_reg(&DEBUG_context);
+    ECX_sig(sigcontext) = ECX_reg(&DEBUG_context);
+    EDX_sig(sigcontext) = EDX_reg(&DEBUG_context);
+    ESI_sig(sigcontext) = ESI_reg(&DEBUG_context);
+    EDI_sig(sigcontext) = EDI_reg(&DEBUG_context);
+    EBP_sig(sigcontext) = EBP_reg(&DEBUG_context);
+    EFL_sig(sigcontext) = EFL_reg(&DEBUG_context);
+    EIP_sig(sigcontext) = EIP_reg(&DEBUG_context);
+    ESP_sig(sigcontext) = ESP_reg(&DEBUG_context);
+    CS_sig(sigcontext)  = CS_reg(&DEBUG_context);
+    DS_sig(sigcontext)  = DS_reg(&DEBUG_context);
+    ES_sig(sigcontext)  = ES_reg(&DEBUG_context);
+    SS_sig(sigcontext)  = SS_reg(&DEBUG_context);
+#ifdef FS_sig
+    FS_sig(sigcontext)  = FS_reg(&DEBUG_context);
+#else
+    __asm__("movw %w0,%%fs"::"r" (FS_reg(&DEBUG_context)));
+#endif
+#ifdef GS_sig
+    GS_sig(sigcontext)  = GS_reg(&DEBUG_context);
+#else
+    __asm__("movw %w0,%%gs"::"r" (FS_reg(&DEBUG_context)));
+#endif
+}
+
 
 /***********************************************************************
  *           DEBUG_InfoRegisters
@@ -123,35 +168,30 @@
     fprintf(stderr,"Register dump:\n");
 
     /* First get the segment registers out of the way */
-    fprintf( stderr," CS:%04x SS:%04x DS:%04x ES:%04x",
-             CS_reg(DEBUG_context), SS_reg(DEBUG_context),
-             DS_reg(DEBUG_context), ES_reg(DEBUG_context) );
-#ifdef FS_reg
-    fprintf( stderr, " FS:%04x", FS_reg(DEBUG_context) );
-#endif
-#ifdef GS_reg
-    fprintf( stderr, " GS:%04x", GS_reg(DEBUG_context) );
-#endif
+    fprintf( stderr," CS:%04x SS:%04x DS:%04x ES:%04x FS:%04x GS:%04x",
+             (WORD)CS_reg(&DEBUG_context), (WORD)SS_reg(&DEBUG_context),
+             (WORD)DS_reg(&DEBUG_context), (WORD)ES_reg(&DEBUG_context),
+             (WORD)FS_reg(&DEBUG_context), (WORD)GS_reg(&DEBUG_context) );
     if (dbg_mode == 16)
     {
         fprintf( stderr,"\n IP:%04x SP:%04x BP:%04x FLAGS:%04x\n",
-                 IP_reg(DEBUG_context), SP_reg(DEBUG_context),
-                 BP_reg(DEBUG_context), FL_reg(DEBUG_context) );
+                 IP_reg(&DEBUG_context), SP_reg(&DEBUG_context),
+                 BP_reg(&DEBUG_context), FL_reg(&DEBUG_context) );
 	fprintf( stderr," AX:%04x BX:%04x CX:%04x DX:%04x SI:%04x DI:%04x\n",
-                 AX_reg(DEBUG_context), BX_reg(DEBUG_context),
-                 CX_reg(DEBUG_context), DX_reg(DEBUG_context),
-                 SI_reg(DEBUG_context), DI_reg(DEBUG_context) );
+                 AX_reg(&DEBUG_context), BX_reg(&DEBUG_context),
+                 CX_reg(&DEBUG_context), DX_reg(&DEBUG_context),
+                 SI_reg(&DEBUG_context), DI_reg(&DEBUG_context) );
     }
     else  /* 32-bit mode */
     {
         fprintf( stderr, "\n EIP:%08lx ESP:%08lx EBP:%08lx EFLAGS:%08lx\n", 
-                 EIP_reg(DEBUG_context), ESP_reg(DEBUG_context),
-                 EBP_reg(DEBUG_context), EFL_reg(DEBUG_context) );
+                 EIP_reg(&DEBUG_context), ESP_reg(&DEBUG_context),
+                 EBP_reg(&DEBUG_context), EFL_reg(&DEBUG_context) );
 	fprintf( stderr, " EAX:%08lx EBX:%08lx ECX:%08lx EDX:%08lx\n", 
-		 EAX_reg(DEBUG_context), EBX_reg(DEBUG_context),
-                 ECX_reg(DEBUG_context), EDX_reg(DEBUG_context) );
+		 EAX_reg(&DEBUG_context), EBX_reg(&DEBUG_context),
+                 ECX_reg(&DEBUG_context), EDX_reg(&DEBUG_context) );
 	fprintf( stderr, " ESI:%08lx EDI:%08lx\n",
-                 ESI_reg(DEBUG_context), EDI_reg(DEBUG_context) );
+                 ESI_reg(&DEBUG_context), EDI_reg(&DEBUG_context) );
     }
 }
 
@@ -170,39 +210,35 @@
         ((((seg) & 7) != 7) || IS_LDT_ENTRY_FREE(SELECTOR_TO_ENTRY(seg)))) \
     { \
         fprintf( stderr, "*** Invalid value for %s register: %04x\n", \
-                 (name), (seg) ); \
+                 (name), (WORD)(seg) ); \
         return FALSE; \
     }
 
-    if (CS_reg(DEBUG_context) != WINE_CODE_SELECTOR)
-        CHECK_SEG( CS_reg(DEBUG_context), "CS" );
-    if (SS_reg(DEBUG_context) != WINE_DATA_SELECTOR)
-        CHECK_SEG( SS_reg(DEBUG_context), "SS" );
-    if (DS_reg(DEBUG_context) != WINE_DATA_SELECTOR)
-        CHECK_SEG( DS_reg(DEBUG_context), "DS" );
-    if (ES_reg(DEBUG_context) != WINE_DATA_SELECTOR)
-        CHECK_SEG( ES_reg(DEBUG_context), "ES" );
-#ifdef FS_reg
-    if (FS_reg(DEBUG_context) != WINE_DATA_SELECTOR)
-        CHECK_SEG( FS_reg(DEBUG_context), "FS" );
-#endif
-#ifdef GS_reg
-    if (GS_reg(DEBUG_context) != WINE_DATA_SELECTOR)
-        CHECK_SEG( GS_reg(DEBUG_context), "GS" );
-#endif
+    if (CS_reg(&DEBUG_context) != WINE_CODE_SELECTOR)
+        CHECK_SEG( CS_reg(&DEBUG_context), "CS" );
+    if (SS_reg(&DEBUG_context) != WINE_DATA_SELECTOR)
+        CHECK_SEG( SS_reg(&DEBUG_context), "SS" );
+    if (DS_reg(&DEBUG_context) != WINE_DATA_SELECTOR)
+        CHECK_SEG( DS_reg(&DEBUG_context), "DS" );
+    if (ES_reg(&DEBUG_context) != WINE_DATA_SELECTOR)
+        CHECK_SEG( ES_reg(&DEBUG_context), "ES" );
+    if (FS_reg(&DEBUG_context) != WINE_DATA_SELECTOR)
+        CHECK_SEG( FS_reg(&DEBUG_context), "FS" );
+    if (GS_reg(&DEBUG_context) != WINE_DATA_SELECTOR)
+        CHECK_SEG( GS_reg(&DEBUG_context), "GS" );
 
     /* Check that CS and SS are not NULL */
 
-    if (!(CS_reg(DEBUG_context) & ~3))
+    if (!(CS_reg(&DEBUG_context) & ~3))
     {
         fprintf( stderr, "*** Invalid value for CS register: %04x\n",
-                 CS_reg(DEBUG_context) );
+                 (WORD)CS_reg(&DEBUG_context) );
         return FALSE;
     }
-    if (!(SS_reg(DEBUG_context) & ~3))
+    if (!(SS_reg(&DEBUG_context) & ~3))
     {
         fprintf( stderr, "*** Invalid value for SS register: %04x\n",
-                 SS_reg(DEBUG_context) );
+                 (WORD)SS_reg(&DEBUG_context) );
         return FALSE;
     }
     return TRUE;
diff --git a/debugger/stabs.c b/debugger/stabs.c
index 2c238be..216ff4d 100644
--- a/debugger/stabs.c
+++ b/debugger/stabs.c
@@ -372,4 +372,12 @@
 
 }
 
+#else	/* !__ELF__ */
+
+int
+DEBUG_ReadExecutableDbgInfo(void)
+{
+return FALSE;
+}
+
 #endif  /* __ELF__ */
diff --git a/debugger/stack.c b/debugger/stack.c
index 9ac2ea2..adc4e88 100644
--- a/debugger/stack.c
+++ b/debugger/stack.c
@@ -57,17 +57,17 @@
     DBG_ADDR addr;
 
     fprintf(stderr,"Stack dump:\n");
-    if ((SS_reg(DEBUG_context) == WINE_DATA_SELECTOR) ||
-        (GET_SEL_FLAGS(SS_reg(DEBUG_context)) & LDT_FLAGS_32BIT))
+    if ((SS_reg(&DEBUG_context) == WINE_DATA_SELECTOR) ||
+        (GET_SEL_FLAGS(SS_reg(&DEBUG_context)) & LDT_FLAGS_32BIT))
     {  /* 32-bit mode */
         addr.seg = 0;
-        addr.off = ESP_reg(DEBUG_context);
+        addr.off = ESP_reg(&DEBUG_context);
         DEBUG_ExamineMemory( &addr, 24, 'x' );
     }
     else  /* 16-bit mode */
     {
-        addr.seg = SS_reg(DEBUG_context);
-        addr.off = SP_reg(DEBUG_context);
+        addr.seg = SS_reg(&DEBUG_context);
+        addr.off = SP_reg(&DEBUG_context);
         DEBUG_ExamineMemory( &addr, 24, 'w' );
     }
     fprintf(stderr,"\n");
@@ -85,40 +85,28 @@
     int frameno = 0;
 
     fprintf(stderr,"Backtrace:\n");
-    if (SS_reg(DEBUG_context) == WINE_DATA_SELECTOR)  /* 32-bit mode */
+    if (SS_reg(&DEBUG_context) == WINE_DATA_SELECTOR)  /* 32-bit mode */
     {
-        addr.seg = 0;
-        addr.off = EBP_reg(DEBUG_context);
-	nframe = 1;
-        while (addr.off)
-        {
-            FRAME32 *frame = (FRAME32 *)addr.off;
-            if (!DBG_CHECK_READ_PTR( &addr, sizeof(FRAME32) )) return;
-            if (!frame->ip) break;
-            addr.off = frame->bp;
-	    nframe++;
-        }
-	if( frames != NULL )
-	  {
-	    free(frames);
-	  }
-
-	frames = (struct bt_info *) xmalloc(nframe 
-					      * sizeof(struct bt_info) );
+        nframe = 1;
+        if (frames) free( frames );
+	frames = (struct bt_info *) xmalloc( sizeof(struct bt_info) );
         fprintf(stderr,"%s%d ",(curr_frame == 0 ? "=>" : "  "), frameno++);
-        addr.off = EIP_reg(DEBUG_context);
+
+        addr.seg = 0;
+        addr.off = EIP_reg(&DEBUG_context);
 	frames[0].eip = addr.off;
         frames[0].frame = DEBUG_PrintAddress( &addr, 32, TRUE );
         fprintf( stderr, "\n" );
-        addr.off = EBP_reg(DEBUG_context);
-
-	frames[0].ebp = addr.off;
+	frames[0].ebp = addr.off = EBP_reg(&DEBUG_context);
 
         while (addr.off)
         {
             FRAME32 *frame = (FRAME32 *)addr.off;
             if (!DBG_CHECK_READ_PTR( &addr, sizeof(FRAME32) )) return;
             if (!frame->ip) break;
+            nframe++;
+            frames = (struct bt_info *)xrealloc(frames,
+                                                nframe*sizeof(struct bt_info));
             fprintf(stderr,"%s%d ", (frameno == curr_frame ? "=>" : "  "),
 		    frameno);
             addr.off = frame->ip;
@@ -133,7 +121,7 @@
     }
     else  /* 16-bit mode */
     {
-      WORD ss = SS_reg(DEBUG_context), cs = CS_reg(DEBUG_context);
+      WORD ss = SS_reg(&DEBUG_context), cs = CS_reg(&DEBUG_context);
       if (GET_SEL_FLAGS(ss) & LDT_FLAGS_32BIT)
       {
           fprintf( stderr, "Not implemented: 32-bit backtrace on a different stack segment.\n" );
@@ -141,11 +129,11 @@
       }
       fprintf( stderr,"%d ", frameno++ );
       addr.seg = cs;
-      addr.off = IP_reg(DEBUG_context);
+      addr.off = IP_reg(&DEBUG_context);
       DEBUG_PrintAddress( &addr, 16, TRUE );
       fprintf( stderr, "\n" );
       addr.seg = ss;
-      addr.off = BP_reg(DEBUG_context) & ~1;
+      addr.off = BP_reg(&DEBUG_context) & ~1;
       for (;;)
       {
           FRAME16 *frame = (FRAME16 *)DBG_ADDR_TO_LIN(&addr);
diff --git a/files/Makefile.in b/files/Makefile.in
index c5f236b..4a2735e 100644
--- a/files/Makefile.in
+++ b/files/Makefile.in
@@ -1,6 +1,6 @@
 prefix     = @prefix@
 sysconfdir = @sysconfdir@
-DEFS       = -D__WINE__  -DETCDIR=\"$(sysconfdir)\"
+DEFS       = -D__WINE__  -DNO_TRANSITION_TYPES -DETCDIR=\"$(sysconfdir)\"
 TOPSRCDIR  = @top_srcdir@
 TOPOBJDIR  = ..
 SRCDIR     = @srcdir@
diff --git a/files/directory.c b/files/directory.c
index f83d81b..157fea4 100644
--- a/files/directory.c
+++ b/files/directory.c
@@ -6,16 +6,18 @@
 
 #include <stdlib.h>
 #include <string.h>
+#include <sys/stat.h>
 #include <unistd.h>
 #include <errno.h>
 
 #include "windows.h"
+#include "winerror.h"
 #include "dos_fs.h"
 #include "drive.h"
 #include "file.h"
+#include "heap.h"
 #include "msdos.h"
 #include "options.h"
-#include "xmalloc.h"
 #include "stddebug.h"
 #include "debug.h"
 
@@ -42,12 +44,12 @@
 {
     char path[MAX_PATHNAME_LEN];
     const char *dos_name ,*unix_name;
-    BYTE attr;
+    BY_HANDLE_FILE_INFORMATION info;
 
     PROFILE_GetWineIniString( "wine", keyname, defval, path, sizeof(path) );
     if (!(unix_name = DOSFS_GetUnixFileName( path, TRUE )) ||
-        !FILE_Stat( unix_name, &attr, NULL, NULL, NULL ) ||
-        !(attr & FA_DIRECTORY))
+        !FILE_Stat( unix_name, &info ) ||
+        !(info.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY))
     {
         fprintf(stderr, "Invalid path '%s' for %s directory\n", path, keyname);
         return 0;
@@ -58,8 +60,8 @@
                  keyname, unix_name );
         return 0;
     }
-    *unix_path = xstrdup( unix_name );
-    *dos_path  = xstrdup( dos_name );
+    *unix_path = HEAP_strdupA( SystemHeap, 0, unix_name );
+    *dos_path  = HEAP_strdupA( SystemHeap, 0, dos_name );
     return 1;
 }
 
@@ -71,7 +73,7 @@
 {
     char *p;
     const char *dos_name ,*unix_name;
-    BYTE attr;
+    BY_HANDLE_FILE_INFORMATION info;
     int i;
 
     for ( ; path && *path; path = p)
@@ -86,8 +88,8 @@
             break;
         }
         if (!(unix_name = DOSFS_GetUnixFileName( path, TRUE )) ||
-            !FILE_Stat( unix_name, &attr, NULL, NULL, NULL ) ||
-            !(attr & FA_DIRECTORY))
+            !FILE_Stat( unix_name, &info ) ||
+            !(info.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY))
         {
             fprintf(stderr,"Warning: invalid dir '%s' in path, deleting it.\n",
                     path );
@@ -99,8 +101,8 @@
                      unix_name );
             continue;
         }
-        DIR_UnixPath[DIR_PathElements] = xstrdup( unix_name );
-        DIR_DosPath[DIR_PathElements]  = xstrdup( dos_name );
+        DIR_UnixPath[DIR_PathElements] = HEAP_strdupA(SystemHeap,0,unix_name);
+        DIR_DosPath[DIR_PathElements]  = HEAP_strdupA(SystemHeap,0,dos_name);
         DIR_PathElements++;
     }
 
@@ -171,11 +173,11 @@
 
     /* Put the temp and Windows directories into the environment */
 
-    env_p = (char *)xmalloc( strlen(DIR_TempDosDir) + 6 );
+    env_p = HEAP_xalloc( SystemHeap, 0, strlen(DIR_TempDosDir) + 6 );
     strcpy( env_p, "TEMP=" );
     strcpy( env_p + 5, DIR_TempDosDir );
     putenv( env_p );
-    env_p = (char *)xmalloc( strlen(DIR_WindowsDosDir) + 8 );
+    env_p = HEAP_xalloc( SystemHeap, 0, strlen(DIR_WindowsDosDir) + 8 );
     strcpy( env_p, "windir=" );
     strcpy( env_p + 7, DIR_WindowsDosDir );
     putenv( env_p );
@@ -325,3 +327,303 @@
     if (path) lstrcpynAtoW( path, DIR_SystemDosDir, count );
     return strlen( DIR_SystemDosDir );
 }
+
+
+/***********************************************************************
+ *           CreateDirectory16   (KERNEL.144)
+ */
+BOOL16 CreateDirectory16( LPCSTR path, LPVOID dummy )
+{
+    dprintf_file( stddeb,"CreateDirectory16(%s,%p)\n", path, dummy );
+    return (BOOL16)CreateDirectory32A( path, NULL );
+}
+
+
+/***********************************************************************
+ *           CreateDirectory32A   (KERNEL32.39)
+ */
+BOOL32 CreateDirectory32A( LPCSTR path, LPSECURITY_ATTRIBUTES lpsecattribs )
+{
+    const char *unixName;
+
+    dprintf_file( stddeb, "CreateDirectory32A(%s,%p)\n", path, lpsecattribs );
+    if ((unixName = DOSFS_IsDevice( path )) != NULL)
+    {
+        dprintf_file(stddeb, "CreateDirectory: device '%s'!\n", unixName);
+        DOS_ERROR( ER_AccessDenied, EC_AccessDenied, SA_Abort, EL_Disk );
+        return FALSE;
+    }
+    if (!(unixName = DOSFS_GetUnixFileName( path, FALSE ))) return 0;
+    if ((mkdir( unixName, 0777 ) == -1) && (errno != EEXIST))
+    {
+        FILE_SetDosError();
+        return FALSE;
+    }
+    return TRUE;
+}
+
+
+/***********************************************************************
+ *           CreateDirectory32W   (KERNEL32.42)
+ */
+BOOL32 CreateDirectory32W( LPCWSTR path, LPSECURITY_ATTRIBUTES lpsecattribs )
+{
+    LPSTR xpath = HEAP_strdupWtoA( GetProcessHeap(), 0, path );
+    BOOL32 ret = CreateDirectory32A( xpath, lpsecattribs );
+    HeapFree( GetProcessHeap(), 0, xpath );
+    return ret;
+}
+
+
+/***********************************************************************
+ *           CreateDirectoryEx32A   (KERNEL32.40)
+ */
+BOOL32 CreateDirectoryEx32A( LPCSTR template, LPCSTR path,
+                             LPSECURITY_ATTRIBUTES lpsecattribs)
+{
+    return CreateDirectory32A(path,lpsecattribs);
+}
+
+
+/***********************************************************************
+ *           CreateDirectoryEx32W   (KERNEL32.41)
+ */
+BOOL32 CreateDirectoryEx32W( LPCWSTR template, LPCWSTR path,
+                             LPSECURITY_ATTRIBUTES lpsecattribs)
+{
+    return CreateDirectory32W(path,lpsecattribs);
+}
+
+
+/***********************************************************************
+ *           RemoveDirectory16   (KERNEL)
+ */
+BOOL16 RemoveDirectory16( LPCSTR path )
+{
+    return (BOOL16)RemoveDirectory32A( path );
+}
+
+
+/***********************************************************************
+ *           RemoveDirectory32A   (KERNEL32.437)
+ */
+BOOL32 RemoveDirectory32A( LPCSTR path )
+{
+    const char *unixName;
+
+    dprintf_file(stddeb, "RemoveDirectory: '%s'\n", path );
+
+    if ((unixName = DOSFS_IsDevice( path )) != NULL)
+    {
+        dprintf_file(stddeb, "RemoveDirectory: device '%s'!\n", unixName);
+        DOS_ERROR( ER_FileNotFound, EC_NotFound, SA_Abort, EL_Disk );
+        return FALSE;
+    }
+    if (!(unixName = DOSFS_GetUnixFileName( path, TRUE ))) return FALSE;
+    if (rmdir( unixName ) == -1)
+    {
+        FILE_SetDosError();
+        return FALSE;
+    }
+    return TRUE;
+}
+
+
+/***********************************************************************
+ *           RemoveDirectory32W   (KERNEL32.438)
+ */
+BOOL32 RemoveDirectory32W( LPCWSTR path )
+{
+    LPSTR xpath = HEAP_strdupWtoA( GetProcessHeap(), 0, path );
+    BOOL32 ret = RemoveDirectory32A( xpath );
+    HeapFree( GetProcessHeap(), 0, xpath );
+    return ret;
+}
+
+
+/***********************************************************************
+ *           DIR_SearchPath
+ *
+ * Implementation of SearchPath32A. 'win32' specifies whether the search
+ * order is Win16 (module path last) or Win32 (module path first).
+ *
+ * FIXME: should return long path names.
+ */
+DWORD DIR_SearchPath( LPCSTR path, LPCSTR name, LPCSTR ext,
+                      DWORD buflen, LPSTR buffer, LPSTR *lastpart,
+                      BOOL32 win32 )
+{
+    DWORD len;
+    LPSTR tmp;
+    int i;
+
+    /* First check the supplied parameters */
+
+    if (strchr( name, '.' )) ext = NULL;  /* Ignore the specified extension */
+    if (path && !*path) path = NULL;  /* Ignore empty path */
+    len = strlen(name);
+    if (ext) len += strlen(ext);
+    if (path) len += strlen(path) + 1;
+
+    /* Allocate a buffer for the file name and extension */
+
+    if (path || ext)
+    {
+        if (!(tmp = HeapAlloc( GetProcessHeap(), 0, len + 1 )))
+        {
+            SetLastError( ERROR_OUTOFMEMORY );
+            return 0;
+        }
+        if (path)
+        {
+            strcpy( tmp, path );
+            strcat( tmp, "\\" );
+            strcat( tmp, name );
+        }
+        else strcpy( tmp, name );
+        if (ext) strcat( tmp, ext );
+    }
+    else tmp = (LPSTR)name;
+    
+    /* If we have an explicit path, everything's easy */
+
+    if (path || (*tmp && (tmp[1] == ':')) ||
+        strchr( tmp, '/' ) || strchr( tmp, '\\' ))
+    {
+        if (!DOSFS_GetUnixFileName( tmp, TRUE )) goto not_found;
+        lstrcpyn32A( buffer, tmp, buflen );
+        if (tmp != name) HeapFree( GetProcessHeap(), 0, tmp );
+        return len;
+    }
+
+    /* Try the path of the current executable (for Win32 search order) */
+
+    if (win32 && GetCurrentTask())
+    {
+        LPSTR p;
+        GetModuleFileName32A( GetCurrentTask(), buffer, buflen );
+        if ((p = strrchr( buffer, '\\' )))
+        {
+            lstrcpyn32A( p + 1, tmp, (INT32)buflen - (p - buffer) );
+            if (DOSFS_GetUnixFileName( buffer, TRUE ))
+            {
+                *p = '\0';
+                goto found;
+            }
+        }
+    }
+
+    /* Try the current directory */
+
+    if (DOSFS_GetUnixFileName( tmp, TRUE ))
+    {
+        GetCurrentDirectory32A( buflen, buffer );
+        goto found;
+    }
+
+    /* Try the Windows directory */
+
+    if (DOSFS_FindUnixName( DIR_WindowsUnixDir, name, NULL, 0,
+                            DRIVE_GetFlags( DIR_WindowsDosDir[0] - 'A' ) ))
+    {
+        lstrcpyn32A( buffer, DIR_WindowsDosDir, buflen );
+        goto found;
+    }
+
+    /* Try the Windows system directory */
+
+    if (DOSFS_FindUnixName( DIR_SystemUnixDir, name, NULL, 0,
+                            DRIVE_GetFlags( DIR_SystemDosDir[0] - 'A' ) ))
+    {
+        lstrcpyn32A( buffer, DIR_SystemDosDir, buflen );
+        goto found;
+    }
+
+    /* Try the path of the current executable (for Win16 search order) */
+
+    if (!win32 && GetCurrentTask())
+    {
+        LPSTR p;
+        GetModuleFileName32A( GetCurrentTask(), buffer, buflen );
+        if ((p = strrchr( buffer, '\\' )))
+        {
+            lstrcpyn32A( p + 1, tmp, (INT32)buflen - (p - buffer) );
+            if (DOSFS_GetUnixFileName( buffer, TRUE ))
+            {
+                *p = '\0';
+                goto found;
+            }
+        }
+    }
+    /* Try all directories in path */
+
+    for (i = 0; i < DIR_PathElements; i++)
+    {
+        if (DOSFS_FindUnixName( DIR_UnixPath[i], name, NULL, 0,
+                                DRIVE_GetFlags( DIR_DosPath[i][0] - 'A' ) ))
+        {
+            lstrcpyn32A( buffer, DIR_DosPath[i], buflen );
+            goto found;
+        }
+    }
+
+not_found:
+    if (tmp != name) HeapFree( GetProcessHeap(), 0, tmp );
+    SetLastError( ERROR_FILE_NOT_FOUND );
+    DOS_ERROR( ER_FileNotFound, EC_NotFound, SA_Abort, EL_Disk );
+    return 0;
+
+found:
+    len = strlen(buffer);
+    if (lastpart) *lastpart = buffer + len + 1;
+    if (len + 1 < buflen)
+    {
+        buffer += len;
+        *buffer++ = '\\';
+        buflen -= len + 1;
+        lstrcpyn32A( buffer, tmp, buflen );
+    }
+    len += strlen(tmp) + 1;
+    if (tmp != name) HeapFree( GetProcessHeap(), 0, tmp );
+    return len;
+}
+
+
+/***********************************************************************
+ *           SearchPath32A   (KERNEL32.447)
+ */
+DWORD SearchPath32A( LPCSTR path, LPCSTR name, LPCSTR ext, DWORD buflen,
+                     LPSTR buffer, LPSTR *lastpart )
+{
+    return DIR_SearchPath( path, name, ext, buflen, buffer, lastpart, TRUE );
+}
+
+
+/***********************************************************************
+ *           SearchPath32W   (KERNEL32.448)
+ */
+DWORD SearchPath32W( LPCWSTR path, LPCWSTR name, LPCWSTR ext, DWORD buflen,
+                     LPWSTR buffer, LPWSTR *lastpart )
+{
+    LPSTR pathA = HEAP_strdupWtoA( GetProcessHeap(), 0, path );
+    LPSTR nameA = HEAP_strdupWtoA( GetProcessHeap(), 0, name );
+    LPSTR extA  = HEAP_strdupWtoA( GetProcessHeap(), 0, ext );
+    LPSTR lastpartA;
+    LPSTR bufferA = HeapAlloc( GetProcessHeap(), 0, buflen + 1 );
+
+    DWORD ret = DIR_SearchPath( pathA, nameA, extA, buflen, bufferA,
+                                &lastpartA, TRUE );
+    lstrcpyAtoW( buffer, bufferA );
+    if (lastpart)
+    {
+        if (lastpartA) *lastpart = buffer + (lastpartA - bufferA);
+        else *lastpart = NULL;
+    }
+    HeapFree( GetProcessHeap(), 0, bufferA );
+    HeapFree( GetProcessHeap(), 0, extA );
+    HeapFree( GetProcessHeap(), 0, nameA );
+    HeapFree( GetProcessHeap(), 0, pathA );
+    return ret;
+}
+
+
diff --git a/files/dos_fs.c b/files/dos_fs.c
index 6ce5881..fb3c0e7 100644
--- a/files/dos_fs.c
+++ b/files/dos_fs.c
@@ -8,16 +8,20 @@
 #include <sys/types.h>
 #include <ctype.h>
 #include <dirent.h>
+#include <fcntl.h>
 #include <string.h>
 #include <stdlib.h>
 #include <stdio.h>
 #include <sys/stat.h>
+#include <sys/ioctl.h>
 #include <time.h>
+#include <unistd.h>
 #if defined(__svr4__) || defined(_SCO_DS)
 #include <sys/statfs.h>
 #endif
 
 #include "windows.h"
+#include "winerror.h"
 #include "dos_fs.h"
 #include "drive.h"
 #include "file.h"
@@ -25,7 +29,15 @@
 #include "msdos.h"
 #include "stddebug.h"
 #include "debug.h"
-#include "xmalloc.h"
+
+/* Define the VFAT ioctl to get both short and long file names */
+#if 0  /* not working yet */
+#ifdef linux
+#define VFAT_IOCTL_READDIR_BOTH  _IOR('r', 1, long)
+#else   /* linux */
+#undef VFAT_IOCTL_READDIR_BOTH  /* just in case... */
+#endif  /* linux */
+#endif
 
 /* Chars we don't want to see in DOS file names */
 #define INVALID_DOS_CHARS  "*?<>|\"+=,;[] \345"
@@ -55,6 +67,27 @@
 BYTE DOS_ErrorAction;
 BYTE DOS_ErrorLocus;
 
+/* Info structure for FindFirstFile handle */
+typedef struct
+{
+    LPSTR path;
+    LPSTR mask;
+    int   drive;
+    int   skip;
+} FIND_FIRST_INFO;
+
+
+/* Directory info for DOSFS_ReadDir */
+typedef struct
+{
+    DIR           *dir;
+#ifdef VFAT_IOCTL_READDIR_BOTH
+    int            fd;
+    char           short_name[12];
+    struct dirent  dirent[2];
+#endif
+} DOS_DIR;
+
 
 /***********************************************************************
  *           DOSFS_ValidDOSName
@@ -150,7 +183,11 @@
     {
         p++;
         strcpy( buffer, ".          " );
-        if (*p == '.') p++;
+        if (*p == '.')
+        {
+            buffer[1] = '.';
+            p++;
+        }
         return (!*p || (*p == '/') || (*p == '\\')) ? buffer : NULL;
     }
 
@@ -265,6 +302,7 @@
 static int DOSFS_MatchLong( const char *mask, const char *name,
                             int case_sensitive )
 {
+    if (!strcmp( mask, "*.*" )) return 1;
     while (*name && *mask)
     {
         if (*mask == '*')
@@ -292,6 +330,95 @@
 
 
 /***********************************************************************
+ *           DOSFS_OpenDir
+ */
+static DOS_DIR *DOSFS_OpenDir( LPCSTR path )
+{
+    DOS_DIR *dir = HeapAlloc( SystemHeap, 0, sizeof(*dir) );
+    if (!dir)
+    {
+        DOS_ERROR( ER_OutOfMemory, EC_OutOfResource, SA_Abort, EL_Memory );
+        return NULL;
+    }
+
+#ifdef VFAT_IOCTL_READDIR_BOTH
+
+    /* Check if the VFAT ioctl is supported on this directory */
+
+    if ((dir->fd = open( path, O_RDONLY )) != -1)
+    {
+        if (ioctl( dir->fd, VFAT_IOCTL_READDIR_BOTH, (long)dir->dirent ) == -1)
+        {
+            close( dir->fd );
+            dir->fd = -1;
+        }
+        else
+        {
+            /* Set the file pointer back at the start of the directory */
+            lseek( dir->fd, 0, SEEK_SET );
+            dir->dir = NULL;
+            return dir;
+        }
+    }
+#endif  /* VFAT_IOCTL_READDIR_BOTH */
+
+    /* Now use the standard opendir/readdir interface */
+
+    if (!(dir->dir = opendir( path )))
+    {
+        HeapFree( SystemHeap, 0, dir );
+        return NULL;
+    }
+    return dir;
+}
+
+
+/***********************************************************************
+ *           DOSFS_CloseDir
+ */
+static void DOSFS_CloseDir( DOS_DIR *dir )
+{
+#ifdef VFAT_IOCTL_READDIR_BOTH
+    if (dir->fd != -1) close( dir->fd );
+#endif  /* VFAT_IOCTL_READDIR_BOTH */
+    if (dir->dir) closedir( dir->dir );
+    HeapFree( SystemHeap, 0, dir );
+}
+
+
+/***********************************************************************
+ *           DOSFS_ReadDir
+ */
+static BOOL32 DOSFS_ReadDir( DOS_DIR *dir, LPCSTR *long_name,
+                             LPCSTR *short_name )
+{
+    struct dirent *dirent;
+
+#ifdef VFAT_IOCTL_READDIR_BOTH
+    if (dir->fd != -1)
+    {
+        LPCSTR fcb_name;
+        if (ioctl( dir->fd, VFAT_IOCTL_READDIR_BOTH, (long)dir->dirent ) == -1)
+            return FALSE;
+        if (!dir->dirent[0].d_reclen) return FALSE;
+        fcb_name = DOSFS_ToDosFCBFormat( dir->dirent[0].d_name );
+        if (fcb_name) strcpy( dir->short_name, fcb_name );
+        else dir->short_name[0] = '\0';
+        *short_name = dir->short_name;
+        if (dir->dirent[1].d_name[0]) *long_name = dir->dirent[1].d_name;
+        else *long_name = dir->dirent[0].d_name;
+        return TRUE;
+    }
+#endif  /* VFAT_IOCTL_READDIR_BOTH */
+
+    if (!(dirent = readdir( dir->dir ))) return FALSE;
+    *long_name  = dirent->d_name;
+    *short_name = NULL;
+    return TRUE;
+}
+
+
+/***********************************************************************
  *           DOSFS_ToDosDateTime
  *
  * Convert a Unix time in the DOS date/time format.
@@ -344,7 +471,7 @@
  *
  * Convert a FILETIME format to Unix time.
  */
-time_t DOSFS_FileTimeToUnixTime( FILETIME *filetime )
+time_t DOSFS_FileTimeToUnixTime( const FILETIME *filetime )
 {
     /* FIXME :-) */
     return filetime->dwLowDateTime;
@@ -359,7 +486,8 @@
  * hashed version that fits in 8.3 format.
  * File name can be terminated by '\0', '\\' or '/'.
  */
-const char *DOSFS_Hash( const char *name, int dir_format, int ignore_case )
+static const char *DOSFS_Hash( const char *name, int dir_format,
+                               int ignore_case )
 {
     static const char invalid_chars[] = INVALID_DOS_CHARS "~.";
     static const char hash_chars[32] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ012345";
@@ -439,7 +567,7 @@
         {
             if (!dir_format) *dst++ = '.';
             for (i = 3, ext++; (i > 0) && !IS_END_OF_NAME(*ext); i--, ext++)
-                *dst++ = toupper(*ext);
+                *dst++ = strchr( invalid_chars, *ext ) ? '_' : toupper(*ext);
         }
         if (!dir_format) *dst = '\0';
     }
@@ -455,53 +583,59 @@
  * File name can be terminated by '\0', '\\' or '/'.
  * Return 1 if OK, 0 if no file name matches.
  */
-static int DOSFS_FindUnixName( const char *path, const char *name,
-                               char *buffer, int maxlen, UINT32 drive_flags )
+BOOL32 DOSFS_FindUnixName( const char *path, const char *name,
+                           char *buffer, int maxlen, UINT32 drive_flags )
 {
-    DIR *dir;
-    struct dirent *dirent;
+    DOS_DIR *dir;
+    LPCSTR long_name, short_name;
+    char dos_name[12];
+    BOOL32 ret;
 
-    const char *dos_name = DOSFS_ToDosFCBFormat( name );
     const char *p = strchr( name, '/' );
     int len = p ? (int)(p - name) : strlen(name);
 
-    dprintf_dosfs( stddeb, "DOSFS_FindUnixName: %s %s\n", path, name );
+    dprintf_dosfs( stddeb, "DOSFS_FindUnixName: %s,%s\n", path, name );
 
     if ((p = strchr( name, '\\' ))) len = MIN( (int)(p - name), len );
 
-    if (!(dir = opendir( path )))
+    dos_name[0] = '\0';
+    if ((p = DOSFS_ToDosFCBFormat( name ))) strcpy( dos_name, p );
+
+    if (!(dir = DOSFS_OpenDir( path )))
     {
         dprintf_dosfs( stddeb, "DOSFS_FindUnixName(%s,%s): can't open dir\n",
                        path, name );
         return 0;
     }
-    while ((dirent = readdir( dir )) != NULL)
+
+    while ((ret = DOSFS_ReadDir( dir, &long_name, &short_name )))
     {
         /* Check against Unix name */
-        if (len == strlen(dirent->d_name))
+        if (len == strlen(long_name))
         {
             if (drive_flags & DRIVE_CASE_SENSITIVE)
             {
-                if (!lstrncmp32A( dirent->d_name, name, len )) break;
+                if (!lstrncmp32A( long_name, name, len )) break;
             }
             else
             {
-                if (!lstrncmpi32A( dirent->d_name, name, len )) break;
+                if (!lstrncmpi32A( long_name, name, len )) break;
             }
         }
-        if (dos_name)
+        if (dos_name[0])
         {
             /* Check against hashed DOS name */
-            const char *hash_name = DOSFS_Hash( dirent->d_name, TRUE,
+            if (!short_name)
+                short_name = DOSFS_Hash( long_name, TRUE,
                                        !(drive_flags & DRIVE_CASE_SENSITIVE) );
-            if (!strcmp( dos_name, hash_name )) break;
+            if (!strcmp( dos_name, short_name )) break;
         }
     }
-    if (dirent) lstrcpyn32A( buffer, dirent->d_name, maxlen );
-    closedir( dir );
+    if (ret && buffer) lstrcpyn32A( buffer, long_name, maxlen );
     dprintf_dosfs( stddeb, "DOSFS_FindUnixName(%s,%s) -> %s\n",
-                   path, name, dirent ? buffer : "** Not found **" );
-    return (dirent != NULL);
+                   path, name, ret ? long_name : "** Not found **" );
+    DOSFS_CloseDir( dir );
+    return ret;
 }
 
 
@@ -531,6 +665,41 @@
     return NULL;
 }
 
+/***********************************************************************
+ *           DOSFS_GetPathDrive
+ *
+ * Get the drive specified by a given path name (DOS or Unix format).
+ */
+static int DOSFS_GetPathDrive( const char **name )
+{
+    int drive;
+    const char *p = *name;
+
+    if (*p && (p[1] == ':'))
+    {
+        drive = toupper(*p) - 'A';
+        *name += 2;
+    }
+    else if (*p == '/') /* Absolute Unix path? */
+    {
+        if ((drive = DRIVE_FindDriveRoot( name )) == -1)
+        {
+            fprintf( stderr, "Warning: %s not accessible from a DOS drive\n",
+                     *name );
+            /* Assume it really was a DOS name */
+            drive = DRIVE_GetCurrentDrive();            
+        }
+    }
+    else drive = DRIVE_GetCurrentDrive();
+
+    if (!DRIVE_IsValid(drive))
+    {
+        DOS_ERROR( ER_InvalidDrive, EC_MediaError, SA_Abort, EL_Disk );
+        return -1;
+    }
+    return drive;
+}
+
 
 /***********************************************************************
  *           DOSFS_GetUnixFileName
@@ -542,33 +711,14 @@
 const char * DOSFS_GetUnixFileName( const char * name, int check_last )
 {
     static char buffer[MAX_PATHNAME_LEN];
-    int drive, len, found;
+    int drive, len;
+    BOOL32 found;
     UINT32 flags;
     char *p, *root;
 
     dprintf_dosfs( stddeb, "DOSFS_GetUnixFileName: %s\n", name );
-    if (name[0] && (name[1] == ':'))
-    {
-        drive = toupper(name[0]) - 'A';
-        name += 2;
-    }
-    else if (name[0] == '/') /* Absolute Unix path? */
-    {
-        if ((drive = DRIVE_FindDriveRoot( &name )) == -1)
-        {
-            fprintf( stderr, "Warning: %s not accessible from a DOS drive\n",
-                     name );
-            /* Assume it really was a DOS name */
-            drive = DRIVE_GetCurrentDrive();            
-        }
-    }
-    else drive = DRIVE_GetCurrentDrive();
 
-    if (!DRIVE_IsValid(drive))
-    {
-        DOS_ERROR( ER_InvalidDrive, EC_MediaError, SA_Abort, EL_Disk );
-        return NULL;
-    }
+    if ((drive = DOSFS_GetPathDrive( &name )) == -1) return NULL;
     flags = DRIVE_GetFlags(drive);
     lstrcpyn32A( buffer, DRIVE_GetRoot(drive), MAX_PATHNAME_LEN );
     if (buffer[1]) root = buffer + strlen(buffer);
@@ -587,7 +737,7 @@
 
     p = buffer[1] ? buffer + strlen(buffer) : buffer;
     len = MAX_PATHNAME_LEN - strlen(buffer);
-    found = 1;
+    found = TRUE;
     while (*name && found)
     {
         const char *newname = DOSFS_CheckDotDot( name, root, '/', &len );
@@ -652,29 +802,8 @@
     char *p;
 
     dprintf_dosfs( stddeb, "DOSFS_GetDosTrueName(%s,%d)\n", name, unix_format);
-    if (name[0] && (name[1] == ':'))
-    {
-        drive = toupper(name[0]) - 'A';
-        name += 2;
-    }
-    else if (name[0] == '/') /* Absolute Unix path? */
-    {
-        if ((drive = DRIVE_FindDriveRoot( &name )) == -1)
-        {
-            fprintf( stderr, "Warning: %s not accessible from a DOS drive\n",
-                     name );
-            /* Assume it really was a DOS name */
-            drive = DRIVE_GetCurrentDrive();            
-        }
-    }
-    else drive = DRIVE_GetCurrentDrive();
 
-    if (!DRIVE_IsValid(drive))
-    {
-        DOS_ERROR( ER_InvalidDrive, EC_MediaError, SA_Abort, EL_Disk );
-        return NULL;
-    }
-
+    if ((drive = DOSFS_GetPathDrive( &name )) == -1) return NULL;
     p = buffer;
     *p++ = 'A' + drive;
     *p++ = ':';
@@ -748,25 +877,32 @@
  */
 int DOSFS_FindNext( const char *path, const char *short_mask,
                     const char *long_mask, int drive, BYTE attr,
-                    int skip, DOS_DIRENT *entry )
+                    int skip, WIN32_FIND_DATA32A *entry )
 {
-    static DIR *dir = NULL;
-    struct dirent *dirent;
+    static DOS_DIR *dir = NULL;
     int count = 0;
     static char buffer[MAX_PATHNAME_LEN];
     static int cur_pos = 0;
     static int drive_root = 0;
     char *p;
-    const char *hash_name;
+    LPCSTR long_name, short_name;
     UINT32 flags;
+    BY_HANDLE_FILE_INFORMATION info;
 
     if ((attr & ~(FA_UNUSED | FA_ARCHIVE | FA_RDONLY)) == FA_LABEL)
     {
         if (skip) return 0;
-        strcpy( entry->name, DRIVE_GetLabel( drive ) );
-        entry->attr = FA_LABEL;
-        entry->size = 0;
-        DOSFS_ToDosDateTime( time(NULL), &entry->date, &entry->time );
+        entry->dwFileAttributes  = FILE_ATTRIBUTE_LABEL;
+        DOSFS_UnixTimeToFileTime( (time_t)0, &entry->ftCreationTime );
+        DOSFS_UnixTimeToFileTime( (time_t)0, &entry->ftLastAccessTime );
+        DOSFS_UnixTimeToFileTime( (time_t)0, &entry->ftLastWriteTime );
+        entry->nFileSizeHigh     = 0;
+        entry->nFileSizeLow      = 0;
+        entry->dwReserved0       = 0;
+        entry->dwReserved1       = 0;
+        strcpy( entry->cFileName,
+                DOSFS_ToDosDTAFormat( DRIVE_GetLabel( drive )) );
+        strcpy( entry->cAlternateFileName, entry->cFileName );
         return 1;
     }
 
@@ -778,9 +914,9 @@
         dprintf_dosfs( stddeb, "DOSFS_FindNext: cache miss, path=%s skip=%d buf=%s cur=%d\n",
                        path, skip, buffer, cur_pos );
         cur_pos = skip;
-        if (dir) closedir(dir);
+        if (dir) DOSFS_CloseDir(dir);
         if (!*path) path = "/";
-        if (!(dir = opendir(path))) return 0;
+        if (!(dir = DOSFS_OpenDir(path))) return 0;
         drive_path = path;
         drive_root = 0;
         if (DRIVE_FindDriveRoot( &drive_path ) != -1)
@@ -796,23 +932,22 @@
     p = buffer + strlen(buffer);
     attr |= FA_UNUSED | FA_ARCHIVE | FA_RDONLY;
     flags = DRIVE_GetFlags( drive );
-    hash_name = NULL;
 
-    while ((dirent = readdir( dir )) != NULL)
+    while (DOSFS_ReadDir( dir, &long_name, &short_name ))
     {
         if (skip-- > 0) continue;
         count++;
 
         /* Don't return '.' and '..' in the root of the drive */
-        if (drive_root && (dirent->d_name[0] == '.') &&
-            (!dirent->d_name[1] ||
-             ((dirent->d_name[1] == '.') && !dirent->d_name[2]))) continue;
+        if (drive_root && (long_name[0] == '.') &&
+            (!long_name[1] || ((long_name[1] == '.') && !long_name[2])))
+            continue;
 
         /* Check the long mask */
 
         if (long_mask)
         {
-            if (!DOSFS_MatchLong( long_mask, dirent->d_name,
+            if (!DOSFS_MatchLong( long_mask, long_name,
                                   flags & DRIVE_CASE_SENSITIVE )) continue;
         }
 
@@ -820,44 +955,208 @@
 
         if (short_mask)
         {
-            hash_name = DOSFS_Hash( dirent->d_name, TRUE,
-                                    !(flags & DRIVE_CASE_SENSITIVE) );
-            if (!DOSFS_MatchShort( short_mask, hash_name )) continue;
+            if (!short_name)
+                short_name = DOSFS_Hash( long_name, TRUE,
+                                         !(flags & DRIVE_CASE_SENSITIVE) );
+            if (!DOSFS_MatchShort( short_mask, short_name )) continue;
         }
 
         /* Check the file attributes */
 
-        lstrcpyn32A( p, dirent->d_name, sizeof(buffer) - (int)(p - buffer) );
-        if (!FILE_Stat( buffer, &entry->attr, &entry->size,
-                        &entry->date, &entry->time ))
+        lstrcpyn32A( p, long_name, sizeof(buffer) - (int)(p - buffer) );
+        if (!FILE_Stat( buffer, &info ))
         {
             fprintf( stderr, "DOSFS_FindNext: can't stat %s\n", buffer );
             continue;
         }
-        if (entry->attr & ~attr) continue;
+        if (info.dwFileAttributes & ~attr) continue;
 
         /* We now have a matching entry; fill the result and return */
 
-        if (!hash_name)
-            hash_name = DOSFS_Hash( dirent->d_name, TRUE,
-                                    !(flags & DRIVE_CASE_SENSITIVE) );
-        strcpy( entry->name, hash_name );
-        lstrcpyn32A( entry->unixname, dirent->d_name, sizeof(entry->unixname));
-        if (!(flags & DRIVE_CASE_PRESERVING)) AnsiLower( entry->unixname );
-        dprintf_dosfs( stddeb, "DOSFS_FindNext: returning %s %02x %ld\n",
-                       entry->name, entry->attr, entry->size );
+        if (!short_name)
+            short_name = DOSFS_Hash( long_name, TRUE,
+                                     !(flags & DRIVE_CASE_SENSITIVE) );
+
+        entry->dwFileAttributes = info.dwFileAttributes;
+        entry->ftCreationTime   = info.ftCreationTime;
+        entry->ftLastAccessTime = info.ftLastAccessTime;
+        entry->ftLastWriteTime  = info.ftLastWriteTime;
+        entry->nFileSizeHigh    = info.nFileSizeHigh;
+        entry->nFileSizeLow     = info.nFileSizeLow;
+        strcpy( entry->cAlternateFileName, DOSFS_ToDosDTAFormat(short_name) );
+        lstrcpyn32A( entry->cFileName, long_name, sizeof(entry->cFileName) );
+        if (!(flags & DRIVE_CASE_PRESERVING)) AnsiLower( entry->cFileName );
+        dprintf_dosfs( stddeb, "DOSFS_FindNext: returning %s (%s) %02lx %ld\n",
+                       entry->cFileName, entry->cAlternateFileName,
+                       entry->dwFileAttributes, entry->nFileSizeLow );
         cur_pos += count;
         p[-1] = '\0';  /* Remove trailing slash in buffer */
         return count;
     }
-    closedir( dir );
+    DOSFS_CloseDir( dir );
     dir = NULL;
     return 0;  /* End of directory */
 }
 
 
+/*************************************************************************
+ *           FindFirstFile16   (KERNEL.413)
+ */
+HANDLE16 FindFirstFile16( LPCSTR path, WIN32_FIND_DATA32A *data )
+{
+    HGLOBAL16 handle;
+    FIND_FIRST_INFO *info;
+    LPCSTR ptr;
+
+    if (!path) return 0;
+    if (!(ptr = DOSFS_GetUnixFileName( path, FALSE )))
+        return INVALID_HANDLE_VALUE16;
+    if (!(handle = GlobalAlloc16( GMEM_MOVEABLE, sizeof(FIND_FIRST_INFO) )))
+        return INVALID_HANDLE_VALUE16;
+    info = (FIND_FIRST_INFO *)GlobalLock16( handle );
+    info->path = HEAP_strdupA( SystemHeap, 0, ptr );
+    info->mask = strrchr( info->path, '/' );
+    *(info->mask++) = '\0';
+    if (path[0] && (path[1] == ':')) info->drive = toupper(*path) - 'A';
+    else info->drive = DRIVE_GetCurrentDrive();
+    info->skip = 0;
+    GlobalUnlock16( handle );
+    if (!FindNextFile16( handle, data ))
+    {
+        FindClose16( handle );
+        DOS_ERROR( ER_NoMoreFiles, EC_MediaError, SA_Abort, EL_Disk );
+        return INVALID_HANDLE_VALUE16;
+    }
+    return handle;
+}
+
+
+/*************************************************************************
+ *           FindFirstFile32A   (KERNEL32.123)
+ */
+HANDLE32 FindFirstFile32A( LPCSTR path, WIN32_FIND_DATA32A *data )
+{
+    HANDLE32 handle = FindFirstFile16( path, data );
+    if (handle == INVALID_HANDLE_VALUE16) return INVALID_HANDLE_VALUE32;
+    return handle;
+}
+
+
+/*************************************************************************
+ *           FindFirstFile32W   (KERNEL32.124)
+ */
+HANDLE32 FindFirstFile32W( LPCWSTR path, WIN32_FIND_DATA32W *data )
+{
+    WIN32_FIND_DATA32A dataA;
+    LPSTR pathA = HEAP_strdupWtoA( GetProcessHeap(), 0, path );
+    HANDLE32 handle = FindFirstFile32A( pathA, &dataA );
+    HeapFree( GetProcessHeap(), 0, pathA );
+    if (handle != INVALID_HANDLE_VALUE32)
+    {
+        data->dwFileAttributes = dataA.dwFileAttributes;
+        data->ftCreationTime   = dataA.ftCreationTime;
+        data->ftLastAccessTime = dataA.ftLastAccessTime;
+        data->ftLastWriteTime  = dataA.ftLastWriteTime;
+        data->nFileSizeHigh    = dataA.nFileSizeHigh;
+        data->nFileSizeLow     = dataA.nFileSizeLow;
+        lstrcpyAtoW( data->cFileName, dataA.cFileName );
+        lstrcpyAtoW( data->cAlternateFileName, dataA.cAlternateFileName );
+    }
+    return handle;
+}
+
+
+/*************************************************************************
+ *           FindNextFile16   (KERNEL.414)
+ */
+BOOL16 FindNextFile16( HANDLE16 handle, WIN32_FIND_DATA32A *data )
+{
+    FIND_FIRST_INFO *info;
+    int count;
+
+    if (!(info = (FIND_FIRST_INFO *)GlobalLock16( handle )))
+    {
+        DOS_ERROR( ER_InvalidHandle, EC_ProgramError, SA_Abort, EL_Disk );
+        return FALSE;
+    }
+    GlobalUnlock16( handle );
+    if (!info->path)
+    {
+        DOS_ERROR( ER_NoMoreFiles, EC_MediaError, SA_Abort, EL_Disk );
+        return FALSE;
+    }
+    if (!(count = DOSFS_FindNext( info->path, NULL, info->mask, info->drive,
+                                  0xff, info->skip, data )))
+    {
+        HeapFree( SystemHeap, 0, info->path );
+        info->path = info->mask = NULL;
+        DOS_ERROR( ER_NoMoreFiles, EC_MediaError, SA_Abort, EL_Disk );
+        return FALSE;
+    }
+    info->skip += count;
+    return TRUE;
+}
+
+
+/*************************************************************************
+ *           FindNextFile32A   (KERNEL32.126)
+ */
+BOOL32 FindNextFile32A( HANDLE32 handle, WIN32_FIND_DATA32A *data )
+{
+    return FindNextFile16( handle, data );
+}
+
+
+/*************************************************************************
+ *           FindNextFile32W   (KERNEL32.127)
+ */
+BOOL32 FindNextFile32W( HANDLE32 handle, WIN32_FIND_DATA32W *data )
+{
+    WIN32_FIND_DATA32A dataA;
+    if (!FindNextFile32A( handle, &dataA )) return FALSE;
+    data->dwFileAttributes = dataA.dwFileAttributes;
+    data->ftCreationTime   = dataA.ftCreationTime;
+    data->ftLastAccessTime = dataA.ftLastAccessTime;
+    data->ftLastWriteTime  = dataA.ftLastWriteTime;
+    data->nFileSizeHigh    = dataA.nFileSizeHigh;
+    data->nFileSizeLow     = dataA.nFileSizeLow;
+    lstrcpyAtoW( data->cFileName, dataA.cFileName );
+    lstrcpyAtoW( data->cAlternateFileName, dataA.cAlternateFileName );
+    return TRUE;
+}
+
+
+/*************************************************************************
+ *           FindClose16   (KERNEL.415)
+ */
+BOOL16 FindClose16( HANDLE16 handle )
+{
+    FIND_FIRST_INFO *info;
+
+    if ((handle == INVALID_HANDLE_VALUE16) ||
+        !(info = (FIND_FIRST_INFO *)GlobalLock16( handle )))
+    {
+        DOS_ERROR( ER_InvalidHandle, EC_ProgramError, SA_Abort, EL_Disk );
+        return FALSE;
+    }
+    if (info->path) HeapFree( SystemHeap, 0, info->path );
+    GlobalUnlock16( handle );
+    GlobalFree16( handle );
+    return TRUE;
+}
+
+
+/*************************************************************************
+ *           FindClose32   (KERNEL32.119)
+ */
+BOOL32 FindClose32( HANDLE32 handle )
+{
+    return FindClose16( (HANDLE16)handle );
+}
+
+
 /***********************************************************************
- *           GetShortPathNameA   (KERNEL32.271)
+ *           GetShortPathName32A   (KERNEL32.271)
  */
 DWORD GetShortPathName32A( LPCSTR longpath, LPSTR shortpath, DWORD shortlen )
 {
@@ -940,7 +1239,8 @@
 /***********************************************************************
  *           FileTimeToDosDateTime   (KERNEL32.111)
  */
-BOOL32 FileTimeToDosDateTime( LPFILETIME ft, LPWORD fatdate, LPWORD fattime)
+BOOL32 FileTimeToDosDateTime( const FILETIME *ft, LPWORD fatdate,
+                              LPWORD fattime )
 {
     time_t unixtime = DOSFS_FileTimeToUnixTime(ft);
     DOSFS_ToDosDateTime(unixtime,fatdate,fattime);
@@ -951,7 +1251,7 @@
 /***********************************************************************
  *           LocalFileTimeToFileTime   (KERNEL32.373)
  */
-BOOL32 LocalFileTimeToFileTime( LPFILETIME localft, LPFILETIME utcft )
+BOOL32 LocalFileTimeToFileTime( const FILETIME *localft, LPFILETIME utcft )
 {
     struct tm *xtm;
 
@@ -966,7 +1266,7 @@
 /***********************************************************************
  *           FileTimeToLocalFileTime   (KERNEL32.112)
  */
-BOOL32 FileTimeToLocalFileTime( LPFILETIME utcft, LPFILETIME localft )
+BOOL32 FileTimeToLocalFileTime( const FILETIME *utcft, LPFILETIME localft )
 {
     struct tm *xtm;
 
@@ -981,7 +1281,7 @@
 /***********************************************************************
  *           FileTimeToSystemTime   (KERNEL32.113)
  */
-BOOL32 FileTimeToSystemTime( LPFILETIME ft, LPSYSTEMTIME syst )
+BOOL32 FileTimeToSystemTime( const FILETIME *ft, LPSYSTEMTIME syst )
 {
     struct tm *xtm;
     time_t xtime = DOSFS_FileTimeToUnixTime(ft);
@@ -1001,7 +1301,7 @@
 /***********************************************************************
  *           SystemTimeToFileTime   (KERNEL32.526)
  */
-BOOL32 SystemTimeToFileTime( LPSYSTEMTIME syst, LPFILETIME ft )
+BOOL32 SystemTimeToFileTime( const SYSTEMTIME *syst, LPFILETIME ft )
 {
     struct tm xtm;
 
diff --git a/files/drive.c b/files/drive.c
index 522518c..b876675 100644
--- a/files/drive.c
+++ b/files/drive.c
@@ -32,7 +32,6 @@
 #include "msdos.h"
 #include "options.h"
 #include "task.h"
-#include "xmalloc.h"
 #include "stddebug.h"
 #include "debug.h"
 
@@ -137,11 +136,11 @@
             p = path + strlen(path) - 1;
             while ((p > path) && ((*p == '/') || (*p == '\\'))) *p-- = '\0';
             if (strlen(path))
-                drive->root = xstrdup( path );
+                drive->root = HEAP_strdupA( SystemHeap, 0, path );
             else
-                drive->root = xstrdup( "/" );
-            drive->dos_cwd  = xstrdup( "" );
-            drive->unix_cwd = xstrdup( "" );
+                drive->root = HEAP_strdupA( SystemHeap, 0, "/" );
+            drive->dos_cwd  = HEAP_strdupA( SystemHeap, 0, "" );
+            drive->unix_cwd = HEAP_strdupA( SystemHeap, 0, "" );
             drive->type     = DRIVE_GetDriveType( name );
             drive->flags    = 0;
 
@@ -180,9 +179,9 @@
     {
         fprintf( stderr, "Warning: no valid DOS drive found, check your configuration file.\n" );
         /* Create a C drive pointing to Unix root dir */
-        DOSDrives[2].root     = xstrdup( "/" );
-        DOSDrives[2].dos_cwd  = xstrdup( "" );
-        DOSDrives[2].unix_cwd = xstrdup( "" );
+        DOSDrives[2].root     = HEAP_strdupA( SystemHeap, 0, "/" );
+        DOSDrives[2].dos_cwd  = HEAP_strdupA( SystemHeap, 0, "" );
+        DOSDrives[2].unix_cwd = HEAP_strdupA( SystemHeap, 0, "" );
         strcpy( DOSDrives[2].label, "Drive C    " );
         DOSDrives[2].serial   = 0x12345678;
         DOSDrives[2].type     = TYPE_HD;
@@ -413,7 +412,7 @@
 {
     char buffer[MAX_PATHNAME_LEN];
     const char *unix_cwd, *dos_cwd;
-    BYTE attr;
+    BY_HANDLE_FILE_INFORMATION info;
     TDB *pTask = (TDB *)GlobalLock16( GetCurrentTask() );
 
     dprintf_dosfs( stddeb, "DRIVE_Chdir(%c:,%s)\n", 'A' + drive, path );
@@ -422,8 +421,8 @@
     lstrcpyn32A( buffer + 2, path, sizeof(buffer) - 2 );
 
     if (!(unix_cwd = DOSFS_GetUnixFileName( buffer, TRUE ))) return 0;
-    if (!FILE_Stat( unix_cwd, &attr, NULL, NULL, NULL )) return 0;
-    if (!(attr & FA_DIRECTORY))
+    if (!FILE_Stat( unix_cwd, &info )) return 0;
+    if (!(info.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY))
     {
         DOS_ERROR( ER_FileNotFound, EC_NotFound, SA_Abort, EL_Disk );
         return 0;
@@ -437,10 +436,10 @@
     dprintf_dosfs( stddeb, "DRIVE_Chdir(%c:): unix_cwd=%s dos_cwd=%s\n",
                    'A' + drive, unix_cwd, dos_cwd + 3 );
 
-    free( DOSDrives[drive].dos_cwd );
-    free( DOSDrives[drive].unix_cwd );
-    DOSDrives[drive].dos_cwd  = xstrdup( dos_cwd + 3 );
-    DOSDrives[drive].unix_cwd = xstrdup( unix_cwd );
+    HeapFree( SystemHeap, 0, DOSDrives[drive].dos_cwd );
+    HeapFree( SystemHeap, 0, DOSDrives[drive].unix_cwd );
+    DOSDrives[drive].dos_cwd  = HEAP_strdupA( SystemHeap, 0, dos_cwd + 3 );
+    DOSDrives[drive].unix_cwd = HEAP_strdupA( SystemHeap, 0, unix_cwd );
 
     if (pTask && (pTask->curdrive & 0x80) && 
         ((pTask->curdrive & ~0x80) == drive))
@@ -569,7 +568,7 @@
                             LPDWORD total_clusters )
 {
     LPSTR xroot;
-    BOOL ret;
+    BOOL32 ret;
 
     xroot = HEAP_strdupWtoA( GetProcessHeap(), 0, root);
     ret = GetDiskFreeSpace32A( xroot,cluster_sectors, sector_bytes,
diff --git a/files/file.c b/files/file.c
index 5f41ecf..f841b81 100644
--- a/files/file.c
+++ b/files/file.c
@@ -5,6 +5,7 @@
  * Copyright 1996 Alexandre Julliard
  */
 
+#include <assert.h>
 #include <ctype.h>
 #include <errno.h>
 #include <fcntl.h>
@@ -19,221 +20,110 @@
 
 #include "windows.h"
 #include "winerror.h"
-#include "directory.h"
 #include "dos_fs.h"
 #include "drive.h"
+#include "file.h"
 #include "global.h"
 #include "heap.h"
 #include "msdos.h"
 #include "options.h"
 #include "ldt.h"
+#include "process.h"
 #include "task.h"
 #include "stddebug.h"
 #include "debug.h"
-#include "xmalloc.h"
 
-#define MAX_OPEN_FILES 64  /* Max. open files for all tasks; must be <255 */
 
-typedef struct tagDOS_FILE
+typedef struct
 {
-    struct tagDOS_FILE *next;
-    int                 count;        /* Usage count (0 if free) */
-    int                 unix_handle;
-    int                 mode;
-    char               *unix_name;
-    WORD                filedate;
-    WORD                filetime;
-    DWORD               type;         /* Type for win32 apps */
+    K32OBJ    header;
+    int       unix_handle;
+    int       mode;
+    char     *unix_name;
+    DWORD     type;         /* Type for win32 apps */
 } DOS_FILE;
 
-/* Global files array */
-static DOS_FILE DOSFiles[MAX_OPEN_FILES];
-
-static DOS_FILE *FILE_First = DOSFiles;
-static DOS_FILE *FILE_LastUsed = DOSFiles;
-
-/* Small file handles array for boot-up, before the first PDB is created */
-#define MAX_BOOT_HANDLES  4
-static BYTE bootFileHandles[MAX_BOOT_HANDLES] = { 0xff, 0xff, 0xff, 0xff };
 
 /***********************************************************************
  *           FILE_Alloc
  *
- * Allocate a DOS file.
+ * Allocate a file.
  */
-static DOS_FILE *FILE_Alloc(void)
+static HFILE32 FILE_Alloc( DOS_FILE **file )
 {
-    DOS_FILE *file = FILE_First;
-    if (file) FILE_First = file->next;
-    else if (FILE_LastUsed >= &DOSFiles[MAX_OPEN_FILES-1])
+    HFILE32 handle;
+    *file = HeapAlloc( SystemHeap, 0, sizeof(DOS_FILE) );
+    if (!*file)
     {
         DOS_ERROR( ER_TooManyOpenFiles, EC_ProgramError, SA_Abort, EL_Disk );
         return NULL;
     }
-    else file = ++FILE_LastUsed;
-    file->count = 1;
-    file->unix_handle = -1;
-    file->unix_name = NULL;
-    file->type = FILE_TYPE_DISK;
-    return file;
+    (*file)->header.type = K32OBJ_FILE;
+    (*file)->header.refcount = 0;
+    (*file)->unix_handle = -1;
+    (*file)->unix_name = NULL;
+    (*file)->type = FILE_TYPE_DISK;
+
+    handle = PROCESS_AllocHandle( &(*file)->header, 0 );
+    if (handle == INVALID_HANDLE_VALUE32) *file = NULL;
+    return handle;
 }
 
 
 /***********************************************************************
- *           FILE_Close
+ *           FILE_Destroy
  *
- * Close a DOS file.
+ * Destroy a DOS file.
  */
-static BOOL FILE_Close( DOS_FILE *file )
+void FILE_Destroy( K32OBJ *ptr )
 {
-    if (!file->count) return FALSE;
-    if (--file->count > 0) return TRUE;
-    /* Now really close the file */
+    DOS_FILE *file = (DOS_FILE *)ptr;
+    assert( ptr->type == K32OBJ_FILE );
+
     if (file->unix_handle != -1) close( file->unix_handle );
-    if (file->unix_name) free( file->unix_name );
-    file->next = FILE_First;
-    FILE_First = file;
-    return TRUE;
-}
-
-
-/***********************************************************************
- *           FILE_GetPDBFiles
- *
- * Return a pointer to the current PDB files array.
- */
-static void FILE_GetPDBFiles( BYTE **files, WORD *nbFiles )
-{
-    PDB *pdb;
-
-    if ((pdb = (PDB *)GlobalLock16( GetCurrentPDB() )) != NULL)
-    {
-        *files = PTR_SEG_TO_LIN( pdb->fileHandlesPtr );
-        *nbFiles = pdb->nbFiles;
-    }
-    else
-    {
-        *files = bootFileHandles;
-        *nbFiles = MAX_BOOT_HANDLES;
-    }
-}
-
-
-/***********************************************************************
- *           FILE_AllocTaskHandle
- *
- * Allocate a task file handle for a DOS file.
- */
-static HFILE FILE_AllocTaskHandle( DOS_FILE *dos_file )
-{
-    BYTE *files, *fp;
-    WORD i, nbFiles;
-
-    FILE_GetPDBFiles( &files, &nbFiles );
-    fp = files + 1;  /* Don't use handle 0, as some programs don't like it */
-    for (i = nbFiles - 1; (i > 0) && (*fp != 0xff); i--, fp++);
-    if (!i)
-    {  /* No more handles or files */
-        DOS_ERROR( ER_TooManyOpenFiles, EC_ProgramError, SA_Abort, EL_Disk );
-        return -1;
-    }
-    *fp = dos_file ? (BYTE)(dos_file - DOSFiles) : 0;
-    dprintf_file(stddeb, 
-       "FILE_AllocTaskHandle: returning task handle %d, dos_file %d, file %d of %d \n", 
-             (fp - files), *fp, nbFiles - i, nbFiles  );
-    return (HFILE)(fp - files);
-}
-
-
-/***********************************************************************
- *           FILE_FreeTaskHandle
- *
- * Free a per-task file handle.
- */
-static void FILE_FreeTaskHandle( HFILE handle )
-{
-    BYTE *files;
-    WORD nbFiles;
-
-    FILE_GetPDBFiles( &files, &nbFiles );
-    dprintf_file( stddeb,"FILE_FreeTaskHandle: dos=%d file=%d\n",
-                  handle, files[handle] );
-    if ((handle < 0) || (handle >= (INT)nbFiles))
-    {
-        fprintf( stderr, "FILE_FreeTaskHandle: invalid file handle %d\n",
-                 handle );
-        return;
-    }
-    files[handle] = 0xff;
-}
-
-
-/***********************************************************************
- *           FILE_SetTaskHandle
- *
- * Set the value of a task handle (no error checking).
- */
-static void FILE_SetTaskHandle( HFILE handle, DOS_FILE *file )
-{
-    BYTE *files;
-    WORD nbFiles;
-
-    FILE_GetPDBFiles( &files, &nbFiles );
-    files[handle] = (BYTE)(file - DOSFiles);
+    if (file->unix_name) HeapFree( SystemHeap, 0, file->unix_name );
+    ptr->type = K32OBJ_UNKNOWN;
+    HeapFree( SystemHeap, 0, file );
 }
 
 
 /***********************************************************************
  *           FILE_GetFile
  *
- * Return the DOS file associated to a task file handle.
+ * Return the DOS file associated to a task file handle. FILE_ReleaseFile must
+ * be called to release the file.
  */
-static DOS_FILE *FILE_GetFile( HFILE handle )
+static DOS_FILE *FILE_GetFile( HFILE32 handle )
 {
-    BYTE *files;
-    WORD nbFiles;
-    DOS_FILE *file;
-
-    FILE_GetPDBFiles( &files, &nbFiles );
-    if ((handle < 0) || (handle >= (INT)nbFiles) ||
-        (files[handle] >= MAX_OPEN_FILES) ||
-        !(file = &DOSFiles[files[handle]])->count)
-    {
-        DOS_ERROR( ER_InvalidHandle, EC_ProgramError, SA_Abort, EL_Disk );
-        return NULL;
-    }
-    return file;
-}
-
-
-int FILE_GetUnixHandle( HFILE hFile )
-{
-    DOS_FILE *file;
-
-    if (!(file = FILE_GetFile( hFile ))) return -1;
-    return file->unix_handle;
+    return (DOS_FILE *)PROCESS_GetObjPtr( handle, K32OBJ_FILE );
 }
 
 
 /***********************************************************************
- *           FILE_CloseAllFiles
+ *           FILE_ReleaseFile
  *
- * Close all open files of a given PDB. Used on task termination.
+ * Release a DOS file obtained with FILE_GetFile.
  */
-void FILE_CloseAllFiles( HANDLE16 hPDB )
+static void FILE_ReleaseFile( DOS_FILE *file )
 {
-    BYTE *files;
-    WORD count;
-    PDB *pdb = (PDB *)GlobalLock16( hPDB );
+    K32OBJ_DecCount( &file->header );
+}
 
-    if (!pdb) return;
-    files = PTR_SEG_TO_LIN( pdb->fileHandlesPtr );
-    dprintf_file(stddeb,"FILE_CloseAllFiles: closing %d files\n",pdb->nbFiles);
-    for (count = pdb->nbFiles; count > 0; count--, files++)
-    {
-        if (*files < MAX_OPEN_FILES) FILE_Close( &DOSFiles[*files] );
-        *files = 0xff;
-    }
+
+/***********************************************************************
+ *           FILE_GetUnixHandle
+ *
+ * Return the Unix handle associated to a file handle.
+ */
+int FILE_GetUnixHandle( HFILE32 hFile )
+{
+    DOS_FILE *file;
+    int ret;
+
+    if (!(file = FILE_GetFile( hFile ))) return -1;
+    ret = file->unix_handle;
+    FILE_ReleaseFile( file );
+    return ret;
 }
 
 
@@ -290,20 +180,20 @@
  *
  * Duplicate a Unix handle into a task handle.
  */
-HFILE FILE_DupUnixHandle( int fd )
+HFILE32 FILE_DupUnixHandle( int fd )
 {
-    HFILE handle;
+    HFILE32 handle;
     DOS_FILE *file;
 
-    if (!(file = FILE_Alloc())) return HFILE_ERROR;
-    if ((file->unix_handle = dup(fd)) == -1)
+    if ((handle = FILE_Alloc( &file )) != INVALID_HANDLE_VALUE32)
     {
-        FILE_SetDosError();
-        FILE_Close( file );
-        return HFILE_ERROR;
+        if ((file->unix_handle = dup(fd)) == -1)
+        {
+            FILE_SetDosError();
+            CloseHandle( handle );
+            return INVALID_HANDLE_VALUE32;
+        }
     }
-    if ((handle = FILE_AllocTaskHandle( file )) == HFILE_ERROR)
-        FILE_Close( file );
     return handle;
 }
 
@@ -311,12 +201,15 @@
 /***********************************************************************
  *           FILE_OpenUnixFile
  */
-static DOS_FILE *FILE_OpenUnixFile( const char *name, int mode )
+static HFILE32 FILE_OpenUnixFile( const char *name, int mode )
 {
+    HFILE32 handle;
     DOS_FILE *file;
     struct stat st;
 
-    if (!(file = FILE_Alloc())) return NULL;
+    if ((handle = FILE_Alloc( &file )) == INVALID_HANDLE_VALUE32)
+        return INVALID_HANDLE_VALUE32;
+
     if ((file->unix_handle = open( name, mode, 0666 )) == -1)
     {
         if (Options.allowReadOnly && (mode == O_RDWR))
@@ -328,32 +221,29 @@
     if ((file->unix_handle == -1) || (fstat( file->unix_handle, &st ) == -1))
     {
         FILE_SetDosError();
-        FILE_Close( file );
-        return NULL;
+        CloseHandle( handle );
+        return INVALID_HANDLE_VALUE32;
     }
     if (S_ISDIR(st.st_mode))
     {
         DOS_ERROR( ER_AccessDenied, EC_AccessDenied, SA_Abort, EL_Disk );
-        FILE_Close( file );
-        return NULL;
+        CloseHandle( handle );
+        return INVALID_HANDLE_VALUE32;
     }
 
     /* File opened OK, now fill the DOS_FILE */
 
-    file->unix_name = xstrdup( name );
-    DOSFS_ToDosDateTime( st.st_mtime, &file->filedate, &file->filetime );
-    return file;
+    file->unix_name = HEAP_strdupA( SystemHeap, 0, name );
+    return handle;
 }
 
 
 /***********************************************************************
  *           FILE_Open
  */
-HFILE FILE_Open( LPCSTR path, INT32 mode )
+HFILE32 FILE_Open( LPCSTR path, INT32 mode )
 {
     const char *unixName;
-    DOS_FILE *file;
-    HFILE handle;
 
     dprintf_file(stddeb, "FILE_Open: '%s' %04x\n", path, mode );
     if ((unixName = DOSFS_IsDevice( path )) != NULL)
@@ -363,25 +253,23 @@
         {
             dprintf_file(stddeb, "FILE_Open: Non-existing device\n");
             DOS_ERROR( ER_FileNotFound, EC_NotFound, SA_Abort, EL_Disk );
-            return HFILE_ERROR;
+            return HFILE_ERROR32;
         }
     }
     else /* check for filename, don't check for last entry if creating */
         if (!(unixName = DOSFS_GetUnixFileName( path, !(mode & O_CREAT) )))
-            return HFILE_ERROR;
+            return HFILE_ERROR32;
 
-    if (!(file = FILE_OpenUnixFile( unixName, mode ))) return HFILE_ERROR;
-    if ((handle = FILE_AllocTaskHandle( file )) == HFILE_ERROR)
-        FILE_Close( file );
-    return handle;
+    return FILE_OpenUnixFile( unixName, mode );
 }
 
 
 /***********************************************************************
  *           FILE_Create
  */
-static DOS_FILE *FILE_Create( LPCSTR path, int mode, int unique )
+static HFILE32 FILE_Create( LPCSTR path, int mode, int unique )
 {
+    HFILE32 handle;
     DOS_FILE *file;
     const char *unixName;
 
@@ -391,104 +279,155 @@
     {
         dprintf_file(stddeb, "FILE_Create: creating device '%s'!\n", unixName);
         DOS_ERROR( ER_AccessDenied, EC_NotFound, SA_Abort, EL_Disk );
-        return NULL;
+        return INVALID_HANDLE_VALUE32;
     }
 
-    if (!(file = FILE_Alloc())) return NULL;
+    if ((handle = FILE_Alloc( &file )) == INVALID_HANDLE_VALUE32)
+        return INVALID_HANDLE_VALUE32;
 
     if (!(unixName = DOSFS_GetUnixFileName( path, FALSE )))
     {
-        FILE_Close( file );
-        return NULL;
+        CloseHandle( handle );
+        return INVALID_HANDLE_VALUE32;
     }
     if ((file->unix_handle = open( unixName,
                            O_CREAT | O_TRUNC | O_RDWR | (unique ? O_EXCL : 0),
                            mode )) == -1)
     {
         FILE_SetDosError();
-        FILE_Close( file );
-        return NULL;
+        CloseHandle( handle );
+        return INVALID_HANDLE_VALUE32;
     } 
 
     /* File created OK, now fill the DOS_FILE */
 
-    file->unix_name = xstrdup( unixName );
-    DOSFS_ToDosDateTime( time(NULL), &file->filedate, &file->filetime );
-    return file;
+    file->unix_name = HEAP_strdupA( SystemHeap, 0, unixName );
+    return handle;
+}
+
+
+/***********************************************************************
+ *           FILE_FillInfo
+ *
+ * Fill a file information from a struct stat.
+ */
+static void FILE_FillInfo( struct stat *st, BY_HANDLE_FILE_INFORMATION *info )
+{
+    info->dwFileAttributes = FILE_ATTRIBUTE_ARCHIVE;
+    if (S_ISDIR(st->st_mode))
+        info->dwFileAttributes |= FILE_ATTRIBUTE_DIRECTORY;
+
+    DOSFS_UnixTimeToFileTime( st->st_mtime, &info->ftCreationTime );
+    DOSFS_UnixTimeToFileTime( st->st_mtime, &info->ftLastWriteTime );
+    DOSFS_UnixTimeToFileTime( st->st_atime, &info->ftLastAccessTime );
+
+    info->dwVolumeSerialNumber = 0;  /* FIXME */
+    info->nFileSizeHigh = 0;
+    info->nFileSizeLow  = S_ISDIR(st->st_mode) ? 0 : st->st_size;
+    info->nNumberOfLinks = st->st_nlink;
+    info->nFileIndexHigh = 0;
+    info->nFileIndexLow  = st->st_ino;
 }
 
 
 /***********************************************************************
  *           FILE_Stat
  *
- * Stat a Unix path name. Return 1 if OK.
+ * Stat a Unix path name. Return TRUE if OK.
  */
-int FILE_Stat( LPCSTR unixName, BYTE *pattr, DWORD *psize,
-               WORD *pdate, WORD *ptime )
+BOOL32 FILE_Stat( LPCSTR unixName, BY_HANDLE_FILE_INFORMATION *info )
 {
     struct stat st;
 
     if (stat( unixName, &st ) == -1)
     {
         FILE_SetDosError();
-        return 0;
+        return FALSE;
     }
-    if (pattr) *pattr = FA_ARCHIVE | (S_ISDIR(st.st_mode) ? FA_DIRECTORY : 0);
-    if (psize) *psize = S_ISDIR(st.st_mode) ? 0 : st.st_size;
-    DOSFS_ToDosDateTime( st.st_mtime, pdate, ptime );
-    return 1;
+    FILE_FillInfo( &st, info );
+    return TRUE;
 }
 
 
 /***********************************************************************
- *           FILE_GetDateTime
- *
- * Get the date and time of a file.
+ *             GetFileInformationByHandle   (KERNEL32.219)
  */
-int FILE_GetDateTime( HFILE hFile, WORD *pdate, WORD *ptime, BOOL32 refresh )
+DWORD GetFileInformationByHandle( HFILE32 hFile,
+                                  BY_HANDLE_FILE_INFORMATION *info )
 {
     DOS_FILE *file;
+    DWORD ret = 0;
+    struct stat st;
 
     if (!(file = FILE_GetFile( hFile ))) return 0;
-    if (refresh)
+    if (fstat( file->unix_handle, &st ) == -1) FILE_SetDosError();
+    else
     {
-        struct stat st;
-        if (fstat( file->unix_handle, &st ) == -1)
-        {
-            FILE_SetDosError();
-            return 0;
-        }
-        DOSFS_ToDosDateTime( st.st_mtime, &file->filedate, &file->filetime );
+        FILE_FillInfo( &st, info );
+        ret = 1;
     }
-    *pdate = file->filedate;
-    *ptime = file->filetime;
-    return 1;
+    FILE_ReleaseFile( file );
+    return ret;
+}
+
+
+/**************************************************************************
+ *           GetFileAttributes16   (KERNEL.420)
+ */
+DWORD GetFileAttributes16( LPCSTR name )
+{
+    return GetFileAttributes32A( name );
+}
+
+
+/**************************************************************************
+ *           GetFileAttributes32A   (KERNEL32.217)
+ */
+DWORD GetFileAttributes32A( LPCSTR name )
+{
+    BY_HANDLE_FILE_INFORMATION info;
+
+    if (!FILE_Stat( name, &info )) return -1;
+    return info.dwFileAttributes;
+}
+
+
+/**************************************************************************
+ *           GetFileAttributes32W   (KERNEL32.218)
+ */
+DWORD GetFileAttributes32W( LPCWSTR name )
+{
+    LPSTR nameA = HEAP_strdupWtoA( GetProcessHeap(), 0, name );
+    DWORD res = GetFileAttributes32A( nameA );
+    HeapFree( GetProcessHeap(), 0, nameA );
+    return res;
 }
 
 
 /***********************************************************************
- *           FILE_SetDateTime
- *
- * Set the date and time of a file.
+ *           GetFileSize   (KERNEL32.220)
  */
-int FILE_SetDateTime( HFILE hFile, WORD date, WORD time )
+DWORD GetFileSize( HFILE32 hFile, LPDWORD filesizehigh )
 {
-    DOS_FILE *file;
-    struct tm newtm;
-    struct utimbuf filetime;
+    BY_HANDLE_FILE_INFORMATION info;
+    if (!GetFileInformationByHandle( hFile, &info )) return 0;
+    if (filesizehigh) *filesizehigh = info.nFileSizeHigh;
+    return info.nFileSizeLow;
+}
 
-    if (!(file = FILE_GetFile( hFile ))) return 0;
-    newtm.tm_sec  = (time & 0x1f) * 2;
-    newtm.tm_min  = (time >> 5) & 0x3f;
-    newtm.tm_hour = (time >> 11);
-    newtm.tm_mday = (date & 0x1f);
-    newtm.tm_mon  = ((date >> 5) & 0x0f) - 1;
-    newtm.tm_year = (date >> 9) + 80;
 
-    filetime.actime = filetime.modtime = mktime( &newtm );
-    if (utime( file->unix_name, &filetime ) != -1) return 1;
-    FILE_SetDosError();
-    return 0;
+/***********************************************************************
+ *           GetFileTime   (KERNEL32.221)
+ */
+BOOL32 GetFileTime( HFILE32 hFile, FILETIME *lpCreationTime,
+                    FILETIME *lpLastAccessTime, FILETIME *lpLastWriteTime )
+{
+    BY_HANDLE_FILE_INFORMATION info;
+    if (!GetFileInformationByHandle( hFile, &info )) return FALSE;
+    if (lpCreationTime)   *lpCreationTime   = info.ftCreationTime;
+    if (lpLastAccessTime) *lpLastAccessTime = info.ftLastAccessTime;
+    if (lpLastWriteTime)  *lpLastWriteTime  = info.ftLastWriteTime;
+    return TRUE;
 }
 
 
@@ -497,14 +436,15 @@
  *
  * dup() function for DOS handles.
  */
-HFILE FILE_Dup( HFILE hFile )
+HFILE32 FILE_Dup( HFILE32 hFile )
 {
     DOS_FILE *file;
-    HFILE handle;
+    HFILE32 handle;
 
     dprintf_file( stddeb, "FILE_Dup for handle %d\n", hFile );
-    if (!(file = FILE_GetFile( hFile ))) return HFILE_ERROR;
-    if ((handle = FILE_AllocTaskHandle( file )) != HFILE_ERROR) file->count++;
+    if (!(file = FILE_GetFile( hFile ))) return HFILE_ERROR32;
+    handle = PROCESS_AllocHandle( &file->header, 0 );
+    FILE_ReleaseFile( file );
     dprintf_file( stddeb, "FILE_Dup return handle %d\n", handle );
     return handle;
 }
@@ -515,29 +455,14 @@
  *
  * dup2() function for DOS handles.
  */
-HFILE FILE_Dup2( HFILE hFile1, HFILE hFile2 )
+HFILE32 FILE_Dup2( HFILE32 hFile1, HFILE32 hFile2 )
 {
     DOS_FILE *file;
-    PDB *pdb = (PDB *)GlobalLock16( GetCurrentPDB() );
-    BYTE *files = PTR_SEG_TO_LIN( pdb->fileHandlesPtr );
 
     dprintf_file( stddeb, "FILE_Dup2 for handle %d\n", hFile1 );
-    if (!(file = FILE_GetFile( hFile1 ))) return HFILE_ERROR;
-
-    if ((hFile2 < 0) || (hFile2 >= (INT)pdb->nbFiles))
-    {
-        DOS_ERROR( ER_InvalidHandle, EC_ProgramError, SA_Abort, EL_Disk );
-        return HFILE_ERROR;
-    }
-    if (files[hFile2] < MAX_OPEN_FILES)
-    {
-        dprintf_file( stddeb, "FILE_Dup2 closing old handle2 %d\n",
-                      files[hFile2] );
-        FILE_Close( &DOSFiles[files[hFile2]] );
-    }
-    files[hFile2] = (BYTE)(file - DOSFiles);
-    file->count++;
-    dprintf_file( stddeb, "FILE_Dup2 return handle2 %d\n", hFile2 );
+    if (!(file = FILE_GetFile( hFile1 ))) return HFILE_ERROR32;
+    if (!PROCESS_SetObjPtr( hFile2, &file->header, 0 )) hFile2 = HFILE_ERROR32;
+    FILE_ReleaseFile( file );
     return hFile2;
 }
 
@@ -599,11 +524,11 @@
 
     do
     {
-        DOS_FILE *file;
-        if ((file = FILE_Create( buffer, 0666, TRUE )) != NULL)
+        HFILE32 handle;
+        if ((handle = FILE_Create(buffer,0666,TRUE)) != INVALID_HANDLE_VALUE32)
         {  /* We created it */
             dprintf_file( stddeb, "GetTempFileName: created %s\n", buffer );
-            FILE_Close( file );
+            CloseHandle( handle );
             break;
         }
         if (DOS_ExtendedError != ER_FileExists) break;  /* No need to go on */
@@ -641,31 +566,25 @@
 
 
 /***********************************************************************
- *           OpenFile   (KERNEL.74) (KERNEL32.396)
+ *           FILE_DoOpenFile
+ *
+ * Implementation of OpenFile16() and OpenFile32().
  */
-HFILE OpenFile( LPCSTR name, OFSTRUCT *ofs, UINT32 mode )
+static HFILE32 FILE_DoOpenFile( LPCSTR name, OFSTRUCT *ofs, UINT32 mode,
+                                BOOL32 win32 )
 {
-    DOS_FILE *file;
-    HFILE hFileRet;
+    HFILE32 hFileRet;
+    FILETIME filetime;
     WORD filedatetime[2];
     const char *unixName, *dosName;
     char *p;
-    int len, i, unixMode;
+    int unixMode;
 
     ofs->cBytes = sizeof(OFSTRUCT);
     ofs->nErrCode = 0;
     if (mode & OF_REOPEN) name = ofs->szPathName;
     dprintf_file( stddeb, "OpenFile: %s %04x\n", name, mode );
 
-    /* First allocate a task handle */
-
-    if ((hFileRet = FILE_AllocTaskHandle( NULL )) == HFILE_ERROR)
-    {
-        ofs->nErrCode = DOS_ExtendedError;
-        dprintf_file( stddeb, "OpenFile: no more task handles.\n" );
-        return HFILE_ERROR;
-    }
-
     /* OF_PARSE simply fills the structure */
 
     if (mode & OF_PARSE)
@@ -673,12 +592,9 @@
         if (!(dosName = DOSFS_GetDosTrueName( name, FALSE ))) goto error;
         lstrcpyn32A( ofs->szPathName, dosName, sizeof(ofs->szPathName) );
         ofs->fFixedDisk = (GetDriveType16( dosName[0]-'A' ) != DRIVE_REMOVABLE);
-        dprintf_file( stddeb, "OpenFile(%s): OF_PARSE, res = '%s', %d\n",
-                      name, ofs->szPathName, hFileRet );
-        /* Return the handle, but close it first */
-        FILE_FreeTaskHandle( hFileRet );
-/*        return hFileRet; */
-        return 0;  /* Progman seems to like this better */
+        dprintf_file( stddeb, "OpenFile(%s): OF_PARSE, res = '%s'\n",
+                      name, ofs->szPathName );
+        return 0;
     }
 
     /* OF_CREATE is completely different from all other options, so
@@ -686,76 +602,37 @@
 
     if (mode & OF_CREATE)
     {
-        if (!(file = FILE_Create( name, 0666, FALSE ))) goto error;
+        if ((hFileRet = FILE_Create(name,0666,FALSE))== INVALID_HANDLE_VALUE32)
+            goto error;
         lstrcpyn32A( ofs->szPathName, DOSFS_GetDosTrueName( name, FALSE ),
                      sizeof(ofs->szPathName) );
         goto success;
     }
 
-    /* Now look for the file */
-
-    /* First try the current directory */
-
-    lstrcpyn32A( ofs->szPathName, name, sizeof(ofs->szPathName) );
-    if ((unixName = DOSFS_GetUnixFileName( ofs->szPathName, TRUE )) != NULL)
-        goto found;
-
-    /* Now try some different paths if none was specified */
+    /* If OF_SEARCH is set, ignore the given path */
 
     if ((mode & OF_SEARCH) && !(mode & OF_REOPEN))
     {
-        if (name[1] == ':') name += 2;
+        /* First try the file name as is */
+        if ((unixName = DOSFS_GetUnixFileName( name, TRUE )) != NULL)
+        {
+            lstrcpyn32A( ofs->szPathName, name, sizeof(ofs->szPathName) );
+            goto found;
+        }
+        /* Now remove the path */
+        if (name[0] && (name[1] == ':')) name += 2;
         if ((p = strrchr( name, '\\' ))) name = p + 1;
         if ((p = strrchr( name, '/' ))) name = p + 1;
         if (!name[0]) goto not_found;
     }
-    else
-    {
-        if ((name[1] == ':') || strchr( name, '/' ) || strchr( name, '\\' ))
-            goto not_found;
-    }
 
-    if ((len = sizeof(ofs->szPathName) - strlen(name) - 1) < 0) goto not_found;
+    /* Now look for the file */
 
-    /* Try the Windows directory */
-
-    GetWindowsDirectory32A( ofs->szPathName, len );
-    strcat( ofs->szPathName, "\\" );
-    strcat( ofs->szPathName, name );
-    if ((unixName = DOSFS_GetUnixFileName( ofs->szPathName, TRUE )) != NULL)
-        goto found;
-
-    /* Try the Windows system directory */
-
-    GetSystemDirectory32A( ofs->szPathName, len );
-    strcat( ofs->szPathName, "\\" );
-    strcat( ofs->szPathName, name );
-    if ((unixName = DOSFS_GetUnixFileName( ofs->szPathName, TRUE )) != NULL)
-        goto found;
-
-    /* Try the path of the current executable */
-
-    if (GetCurrentTask())
-    {
-        GetModuleFileName16( GetCurrentTask(), ofs->szPathName, len );
-        if ((p = strrchr( ofs->szPathName, '\\' )))
-        {
-            strcpy( p + 1, name );
-            if ((unixName = DOSFS_GetUnixFileName( ofs->szPathName, TRUE )))
-                goto found;
-        }
-    }
-
-    /* Try all directories in path */
-
-    for (i = 0; ; i++)
-    {
-        if (!DIR_GetDosPath( i, ofs->szPathName, len )) goto not_found;
-        strcat( ofs->szPathName, "\\" );
-        strcat( ofs->szPathName, name );
-        if ((unixName = DOSFS_GetUnixFileName( ofs->szPathName, TRUE)) != NULL)
-            break;
-    }
+    if (!DIR_SearchPath( NULL, name, NULL, sizeof(ofs->szPathName),
+                         ofs->szPathName, NULL, win32 ))
+        goto not_found;
+    if (!(unixName = DOSFS_GetUnixFileName( ofs->szPathName, TRUE )))
+        goto not_found;
 
 found:
     dprintf_file( stddeb, "OpenFile: found '%s'\n", unixName );
@@ -766,9 +643,7 @@
     {
         if (unlink( unixName ) == -1) goto not_found;
         dprintf_file( stddeb, "OpenFile(%s): OF_DELETE return = OK\n", name);
-        /* Return the handle, but close it first */
-        FILE_FreeTaskHandle( hFileRet );
-        return hFileRet;
+        return 1;
     }
 
     switch(mode & 3)
@@ -782,14 +657,15 @@
         unixMode = O_RDONLY; break;
     }
 
-    if (!(file = FILE_OpenUnixFile( unixName, unixMode ))) goto not_found;
-    filedatetime[0] = file->filedate;
-    filedatetime[1] = file->filetime;
+    if ((hFileRet = FILE_OpenUnixFile( unixName, unixMode )) == HFILE_ERROR32)
+        goto not_found;
+    GetFileTime( hFileRet, NULL, NULL, &filetime );
+    FileTimeToDosDateTime( &filetime, &filedatetime[0], &filedatetime[1] );
     if ((mode & OF_VERIFY) && (mode & OF_REOPEN))
     {
         if (memcmp( ofs->reserved, filedatetime, sizeof(ofs->reserved) ))
         {
-            FILE_Close( file );
+            CloseHandle( hFileRet );
             dprintf_file( stddeb, "OpenFile(%s): OF_VERIFY failed\n", name );
             /* FIXME: what error here? */
             DOS_ERROR( ER_FileNotFound, EC_NotFound, SA_Abort, EL_Disk );
@@ -798,17 +674,10 @@
     }
     memcpy( ofs->reserved, filedatetime, sizeof(ofs->reserved) );
 
-    if (mode & OF_EXIST)
-    {
-        FILE_Close( file );
-        /* Return the handle, but close it first */
-        FILE_FreeTaskHandle( hFileRet );
-        return hFileRet;
-    }
-
 success:  /* We get here if the open was successful */
     dprintf_file( stddeb, "OpenFile(%s): OK, return = %d\n", name, hFileRet );
-    FILE_SetTaskHandle( hFileRet, file );
+    if (mode & OF_EXIST) /* Return the handle, but close it first */
+        CloseHandle( hFileRet );
     return hFileRet;
 
 not_found:  /* We get here if the file does not exist */
@@ -819,151 +688,52 @@
 error:  /* We get here if there was an error opening the file */
     ofs->nErrCode = DOS_ExtendedError;
     dprintf_file( stddeb, "OpenFile(%s): return = HFILE_ERROR\n", name );
-    FILE_FreeTaskHandle( hFileRet );
-    return HFILE_ERROR;
+    return HFILE_ERROR32;
 }
 
-/***********************************************************************
- *           SearchPath32A   (KERNEL32.447)
- * Code borrowed from OpenFile above.
- */
-DWORD SearchPath32A(
-	LPCSTR path,LPCSTR fn,LPCSTR ext,DWORD buflen,LPSTR buf,LPSTR *lastpart
-) {
-    LPCSTR	unixName;
-    INT32	len;
-    char	testpath[1000]; /* should be enough for now */
-    char	*name,*p;
-    int		i;
-
-    if (ext==NULL)
-    	ext = "";
-    name=(char*)xmalloc(strlen(fn)+strlen(ext)+1);
-    strcpy(name,fn);
-    strcat(name,ext);
-
-    dprintf_file(stddeb,"SearchPath32A(%s,%s,%s,%ld,%p,%p)\n",
-    	path,fn,ext,buflen,buf,lastpart
-    );
-    if (path) {
-	strcpy(testpath,path);
-	strcat(testpath,"\\");
-	strcat(testpath,name);
-	if ((unixName=DOSFS_GetUnixFileName((LPCSTR)testpath,TRUE))!=NULL) {
-	    goto found;
-	} else {
-	    strcpy(testpath,name);
-	    if ((unixName=DOSFS_GetUnixFileName((LPCSTR)testpath,TRUE))!=NULL)
-		goto found;
-	    return 0;
-	}
-    }
-    if ((len=sizeof(testpath)-strlen(name)-1)<0)
-    	return 0;
-
-    /* Try the path of the current executable */
-    if (GetCurrentTask()) {
-	GetModuleFileName16(GetCurrentTask(),testpath,len);
-	if ((p=strrchr(testpath,'\\'))) {
-            strcpy(p+1,name);
-            if ((unixName=DOSFS_GetUnixFileName((LPCSTR)testpath,TRUE)))
-                goto found;
-        }
-    }
-
-    /* Try the current directory */
-    lstrcpyn32A(testpath,name,sizeof(testpath) );
-    if ((unixName=DOSFS_GetUnixFileName((LPCSTR)testpath,TRUE))!=NULL)
-        goto found;
-
-    /* Try the Windows directory */
-    GetWindowsDirectory32A(testpath,len);
-    strcat(testpath,"\\");
-    strcat(testpath,name);
-    if ((unixName = DOSFS_GetUnixFileName((LPCSTR)testpath,TRUE))!=NULL)
-        goto found;
-
-    /* Try the Windows system directory */
-    GetSystemDirectory32A(testpath,len);
-    strcat(testpath,"\\");
-    strcat(testpath,name);
-    if ((unixName=DOSFS_GetUnixFileName((LPCSTR)testpath,TRUE))!=NULL)
-        goto found;
-
-    /* Try all directories in path */
-
-    for (i=0;;i++)
-    {
-        if (!DIR_GetDosPath(i,testpath,len)) 
-		return 0;
-        strcat(testpath,"\\");
-        strcat(testpath,name);
-        if ((unixName=DOSFS_GetUnixFileName((LPCSTR)testpath,TRUE))!=NULL)
-            break;
-    }
-
-found:
-    strncpy(buf,testpath,buflen);
-    if (NULL!=(p=strrchr(testpath,'\\')))
-    	p=p+1;
-    else
-        p=testpath;
-    if (lastpart) {
-	if (p-testpath<buflen)
-	    *lastpart=(p-testpath)+buf;
-	else
-	    *lastpart=NULL;
-    }
-    dprintf_file(stddeb,"	-> found %s,last part is %s\n",testpath,p);
-    return strlen(testpath);
-}
 
 /***********************************************************************
- *           SearchPath32W   (KERNEL32.448)
+ *           OpenFile16   (KERNEL.74)
  */
-DWORD SearchPath32W( LPCWSTR path, LPCWSTR fn, LPCWSTR ext, DWORD buflen,
-                     LPWSTR buf, LPWSTR *lastpart )
+HFILE16 OpenFile16( LPCSTR name, OFSTRUCT *ofs, UINT16 mode )
 {
-	LPSTR	pathA = HEAP_strdupWtoA( GetProcessHeap(), 0, path );
-	LPSTR	fnA = HEAP_strdupWtoA( GetProcessHeap(), 0, fn );
-	LPSTR	extA = HEAP_strdupWtoA( GetProcessHeap(), 0, ext );
-	LPSTR	lastpartA;
-	LPSTR	bufA = HeapAlloc( GetProcessHeap(), 0, buflen + 1 );
-	DWORD	ret;
-
-	ret = SearchPath32A(pathA,fnA,extA,buflen,bufA,&lastpartA);
-	lstrcpyAtoW( buf, bufA );
-	if (lastpart)
-        {
-            if (lastpartA) *lastpart = buf+(lastpartA-bufA);
-            else *lastpart = NULL;
-	}
-	HeapFree( GetProcessHeap(), 0, bufA );
-	HeapFree( GetProcessHeap(), 0, fnA );
-	HeapFree( GetProcessHeap(), 0, pathA );
-	HeapFree( GetProcessHeap(), 0, extA );
-	return ret;
+    return FILE_DoOpenFile( name, ofs, mode, FALSE );
 }
 
-/***********************************************************************
- *           _lclose   (KERNEL.81) (KERNEL32.592)
- */
-HFILE _lclose( HFILE hFile )
-{
-    DOS_FILE *file;
 
+/***********************************************************************
+ *           OpenFile32   (KERNEL32.396)
+ */
+HFILE32 OpenFile32( LPCSTR name, OFSTRUCT *ofs, UINT32 mode )
+{
+    return FILE_DoOpenFile( name, ofs, mode, TRUE );
+}
+
+
+/***********************************************************************
+ *           _lclose16   (KERNEL.81)
+ */
+HFILE16 _lclose16( HFILE16 hFile )
+{
     dprintf_file( stddeb, "_lclose: handle %d\n", hFile );
-    if (!(file = FILE_GetFile( hFile ))) return HFILE_ERROR;
-    FILE_Close( file );
-    FILE_FreeTaskHandle( hFile );
-    return 0;
+    return CloseHandle( hFile ) ? 0 : HFILE_ERROR16;
+}
+
+
+/***********************************************************************
+ *           _lclose32   (KERNEL32.592)
+ */
+HFILE32 _lclose32( HFILE32 hFile )
+{
+    dprintf_file( stddeb, "_lclose: handle %d\n", hFile );
+    return CloseHandle( hFile ) ? 0 : HFILE_ERROR32;
 }
 
 
 /***********************************************************************
  *           WIN16_hread
  */
-LONG WIN16_hread( HFILE hFile, SEGPTR buffer, LONG count )
+LONG WIN16_hread( HFILE16 hFile, SEGPTR buffer, LONG count )
 {
     LONG maxlen;
 
@@ -980,7 +750,7 @@
 /***********************************************************************
  *           WIN16_lread
  */
-UINT16 WIN16_lread( HFILE hFile, SEGPTR buffer, UINT16 count )
+UINT16 WIN16_lread( HFILE16 hFile, SEGPTR buffer, UINT16 count )
 {
     return (UINT16)WIN16_hread( hFile, buffer, (LONG)count );
 }
@@ -989,16 +759,17 @@
 /***********************************************************************
  *           _lread32   (KERNEL32.596)
  */
-UINT32 _lread32( HFILE hFile, LPVOID buffer, UINT32 count )
+UINT32 _lread32( HFILE32 hFile, LPVOID buffer, UINT32 count )
 {
     DOS_FILE *file;
     UINT32 result;
 
     dprintf_file( stddeb, "_lread32: %d %p %d\n", hFile, buffer, count );
     if (!(file = FILE_GetFile( hFile ))) return -1;
-    if (!count) return 0;
-    if ((result = read( file->unix_handle, buffer, count )) == -1)
+    if (!count) result = 0;
+    else if ((result = read( file->unix_handle, buffer, count )) == -1)
         FILE_SetDosError();
+    FILE_ReleaseFile( file );
     return result;
 }
 
@@ -1006,52 +777,58 @@
 /***********************************************************************
  *           _lread16   (KERNEL.82)
  */
-UINT16 _lread16( HFILE hFile, LPVOID buffer, UINT16 count )
+UINT16 _lread16( HFILE16 hFile, LPVOID buffer, UINT16 count )
 {
     return (UINT16)_lread32( hFile, buffer, (LONG)count );
 }
 
 
 /***********************************************************************
- *           _lcreat   (KERNEL.83) (KERNEL32.593)
+ *           _lcreat16   (KERNEL.83)
  */
-HFILE _lcreat( LPCSTR path, INT32 attr )
+HFILE16 _lcreat16( LPCSTR path, INT16 attr )
 {
-    DOS_FILE *file;
-    HFILE handle;
-    int mode;
-    
-    dprintf_file( stddeb, "_lcreat: %s %02x\n", path, attr );
-    mode = (attr & 1) ? 0444 : 0666;
-    if (!(file = FILE_Create( path, mode, FALSE ))) return HFILE_ERROR;
-    if ((handle = FILE_AllocTaskHandle( file )) == HFILE_ERROR)
-        FILE_Close( file );
-    return handle;
+    int mode = (attr & 1) ? 0444 : 0666;
+    dprintf_file( stddeb, "_lcreat16: %s %02x\n", path, attr );
+    return (HFILE16)FILE_Create( path, mode, FALSE );
+}
+
+
+/***********************************************************************
+ *           _lcreat32   (KERNEL32.593)
+ */
+HFILE32 _lcreat32( LPCSTR path, INT32 attr )
+{
+    int mode = (attr & 1) ? 0444 : 0666;
+    dprintf_file( stddeb, "_lcreat32: %s %02x\n", path, attr );
+    return FILE_Create( path, mode, FALSE );
 }
 
 
 /***********************************************************************
  *           _lcreat_uniq   (Not a Windows API)
  */
-HFILE _lcreat_uniq( LPCSTR path, INT32 attr )
+HFILE32 _lcreat_uniq( LPCSTR path, INT32 attr )
 {
-    DOS_FILE *file;
-    HFILE handle;
-    int mode;
-    
+    int mode = (attr & 1) ? 0444 : 0666;
     dprintf_file( stddeb, "_lcreat: %s %02x\n", path, attr );
-    mode = (attr & 1) ? 0444 : 0666;
-    if (!(file = FILE_Create( path, mode, TRUE ))) return HFILE_ERROR;
-    if ((handle = FILE_AllocTaskHandle( file )) == HFILE_ERROR)
-        FILE_Close( file );
-    return handle;
+    return FILE_Create( path, mode, TRUE );
 }
 
 
 /***********************************************************************
- *           _llseek   (KERNEL.84) (KERNEL32.594)
+ *           _llseek16   (KERNEL.84)
  */
-LONG _llseek( HFILE hFile, LONG lOffset, INT32 nOrigin )
+LONG _llseek16( HFILE16 hFile, LONG lOffset, INT16 nOrigin )
+{
+    return _llseek32( hFile, lOffset, nOrigin );
+}
+
+
+/***********************************************************************
+ *           _llseek32   (KERNEL32.594)
+ */
+LONG _llseek32( HFILE32 hFile, LONG lOffset, INT32 nOrigin )
 {
     DOS_FILE *file;
     int origin, result;
@@ -1059,7 +836,7 @@
     dprintf_file( stddeb, "_llseek: handle %d, offset %ld, origin %d\n", 
                   hFile, lOffset, nOrigin);
 
-    if (!(file = FILE_GetFile( hFile ))) return HFILE_ERROR;
+    if (!(file = FILE_GetFile( hFile ))) return HFILE_ERROR32;
     switch(nOrigin)
     {
         case 1:  origin = SEEK_CUR; break;
@@ -1069,14 +846,24 @@
 
     if ((result = lseek( file->unix_handle, lOffset, origin )) == -1)
         FILE_SetDosError();
+    FILE_ReleaseFile( file );
     return result;
 }
 
 
 /***********************************************************************
- *           _lopen   (KERNEL.85) (KERNEL32.595)
+ *           _lopen16   (KERNEL.85)
  */
-HFILE _lopen( LPCSTR path, INT32 mode )
+HFILE16 _lopen16( LPCSTR path, INT16 mode )
+{
+    return _lopen32( path, mode );
+}
+
+
+/***********************************************************************
+ *           _lopen32   (KERNEL32.595)
+ */
+HFILE32 _lopen32( LPCSTR path, INT32 mode )
 {
     INT32 unixMode;
 
@@ -1102,41 +889,58 @@
 /***********************************************************************
  *           _lwrite16   (KERNEL.86)
  */
-UINT16 _lwrite16( HFILE hFile, LPCSTR buffer, UINT16 count )
+UINT16 _lwrite16( HFILE16 hFile, LPCSTR buffer, UINT16 count )
 {
-    return (UINT16)_hwrite( hFile, buffer, (LONG)count );
+    return (UINT16)_hwrite32( hFile, buffer, (LONG)count );
 }
 
 /***********************************************************************
  *           _lwrite32   (KERNEL.86)
  */
-UINT32 _lwrite32( HFILE hFile, LPCSTR buffer, UINT32 count )
+UINT32 _lwrite32( HFILE32 hFile, LPCSTR buffer, UINT32 count )
 {
-    return (UINT32)_hwrite( hFile, buffer, (LONG)count );
+    return (UINT32)_hwrite32( hFile, buffer, (LONG)count );
 }
 
 
 /***********************************************************************
- *           _hread   (KERNEL.349)
+ *           _hread16   (KERNEL.349)
  */
-LONG _hread( HFILE hFile, LPVOID buffer, LONG count)
+LONG _hread16( HFILE16 hFile, LPVOID buffer, LONG count)
 {
     return _lread32( hFile, buffer, count );
 }
 
 
 /***********************************************************************
- *           _hwrite   (KERNEL.350)
+ *           _hread32   (KERNEL32.590)
  */
-LONG _hwrite( HFILE hFile, LPCSTR buffer, LONG count )
+LONG _hread32( HFILE32 hFile, LPVOID buffer, LONG count)
+{
+    return _lread32( hFile, buffer, count );
+}
+
+
+/***********************************************************************
+ *           _hwrite16   (KERNEL.350)
+ */
+LONG _hwrite16( HFILE16 hFile, LPCSTR buffer, LONG count )
+{
+    return _hwrite32( hFile, buffer, count );
+}
+
+
+/***********************************************************************
+ *           _hwrite32   (KERNEL32.591)
+ */
+LONG _hwrite32( HFILE32 hFile, LPCSTR buffer, LONG count )
 {
     DOS_FILE *file;
     LONG result;
 
     dprintf_file( stddeb, "_hwrite: %d %p %ld\n", hFile, buffer, count );
 
-    if (!(file = FILE_GetFile( hFile ))) return HFILE_ERROR;
-    
+    if (!(file = FILE_GetFile( hFile ))) return HFILE_ERROR32;
     if (count == 0)  /* Expand or truncate at current position */
         result = ftruncate( file->unix_handle,
                             lseek( file->unix_handle, 0, SEEK_CUR ) );
@@ -1144,6 +948,7 @@
         result = write( file->unix_handle, buffer, count );
 
     if (result == -1) FILE_SetDosError();
+    FILE_ReleaseFile( file );
     return result;
 }
 
@@ -1225,18 +1030,54 @@
 }
 
 
+/*************************************************************************
+ *           SetHandleCount32   (KERNEL32.494)
+ */
+UINT32 SetHandleCount32( UINT32 count )
+{
+    return MIN( 256, count );
+}
+
+
 /***********************************************************************
  *           FlushFileBuffers   (KERNEL32.133)
  */
-BOOL32 FlushFileBuffers( HFILE hFile )
+BOOL32 FlushFileBuffers( HFILE32 hFile )
 {
     DOS_FILE *file;
+    BOOL32 ret;
 
     dprintf_file( stddeb, "FlushFileBuffers(%d)\n", hFile );
     if (!(file = FILE_GetFile( hFile ))) return FALSE;
-    if (fsync( file->unix_handle ) != -1) return TRUE;
-    FILE_SetDosError();
-    return FALSE;
+    if (fsync( file->unix_handle ) != -1) ret = TRUE;
+    else
+    {
+        FILE_SetDosError();
+        ret = FALSE;
+    }
+    FILE_ReleaseFile( file );
+    return ret;
+}
+
+
+/**************************************************************************
+ *           SetEndOfFile   (KERNEL32.483)
+ */
+BOOL32 SetEndOfFile( HFILE32 hFile )
+{
+    DOS_FILE *file;
+    BOOL32 ret = TRUE;
+
+    dprintf_file( stddeb, "SetEndOfFile(%d)\n", hFile );
+    if (!(file = FILE_GetFile( hFile ))) return FALSE;
+    if (ftruncate( file->unix_handle,
+                   lseek( file->unix_handle, 0, SEEK_CUR ) ))
+    {
+        FILE_SetDosError();
+        ret = FALSE;
+    }
+    FILE_ReleaseFile( file );
+    return ret;
 }
 
 
@@ -1288,122 +1129,14 @@
 
 
 /***********************************************************************
- *           CreateDirectory16   (KERNEL.144)
- */
-BOOL16 CreateDirectory16( LPCSTR path, LPVOID dummy )
-{
-    dprintf_file( stddeb,"CreateDirectory16(%s,%p)\n", path, dummy );
-    return (BOOL16)CreateDirectory32A( path, NULL );
-}
-
-
-/***********************************************************************
- *           CreateDirectory32A   (KERNEL32.39)
- */
-BOOL32 CreateDirectory32A( LPCSTR path, LPSECURITY_ATTRIBUTES lpsecattribs )
-{
-    const char *unixName;
-
-    dprintf_file( stddeb, "CreateDirectory32A(%s,%p)\n", path, lpsecattribs );
-    if ((unixName = DOSFS_IsDevice( path )) != NULL)
-    {
-        dprintf_file(stddeb, "CreateDirectory: device '%s'!\n", unixName);
-        DOS_ERROR( ER_AccessDenied, EC_AccessDenied, SA_Abort, EL_Disk );
-        return FALSE;
-    }
-    if (!(unixName = DOSFS_GetUnixFileName( path, FALSE ))) return 0;
-    if ((mkdir( unixName, 0777 ) == -1) && (errno != EEXIST))
-    {
-        FILE_SetDosError();
-        return FALSE;
-    }
-    return TRUE;
-}
-
-
-/***********************************************************************
- *           CreateDirectory32W   (KERNEL32.42)
- */
-BOOL32 CreateDirectory32W( LPCWSTR path, LPSECURITY_ATTRIBUTES lpsecattribs )
-{
-    LPSTR xpath = HEAP_strdupWtoA( GetProcessHeap(), 0, path );
-    BOOL32 ret = CreateDirectory32A( xpath, lpsecattribs );
-    HeapFree( GetProcessHeap(), 0, xpath );
-    return ret;
-}
-
-/***********************************************************************
- *           CreateDirectoryEx32A   (KERNEL32.40)
- */
-BOOL32 CreateDirectoryEx32A( LPCSTR template, LPCSTR path,
-                             LPSECURITY_ATTRIBUTES lpsecattribs)
-{
-    return CreateDirectory32A(path,lpsecattribs);
-}
-
-/***********************************************************************
- *           CreateDirectoryEx32W   (KERNEL32.41)
- */
-BOOL32 CreateDirectoryEx32W( LPCWSTR template, LPCWSTR path,
-                             LPSECURITY_ATTRIBUTES lpsecattribs)
-{
-    return CreateDirectory32W(path,lpsecattribs);
-}
-
-/***********************************************************************
- *           RemoveDirectory16   (KERNEL)
- */
-BOOL16 RemoveDirectory16( LPCSTR path )
-{
-    return (BOOL16)RemoveDirectory32A( path );
-}
-
-
-/***********************************************************************
- *           RemoveDirectory32A   (KERNEL32.437)
- */
-BOOL32 RemoveDirectory32A( LPCSTR path )
-{
-    const char *unixName;
-
-    dprintf_file(stddeb, "RemoveDirectory: '%s'\n", path );
-
-    if ((unixName = DOSFS_IsDevice( path )) != NULL)
-    {
-        dprintf_file(stddeb, "RemoveDirectory: device '%s'!\n", unixName);
-        DOS_ERROR( ER_FileNotFound, EC_NotFound, SA_Abort, EL_Disk );
-        return FALSE;
-    }
-    if (!(unixName = DOSFS_GetUnixFileName( path, TRUE ))) return FALSE;
-    if (rmdir( unixName ) == -1)
-    {
-        FILE_SetDosError();
-        return FALSE;
-    }
-    return TRUE;
-}
-
-
-/***********************************************************************
- *           RemoveDirectory32W   (KERNEL32.438)
- */
-BOOL32 RemoveDirectory32W( LPCWSTR path )
-{
-    LPSTR xpath = HEAP_strdupWtoA( GetProcessHeap(), 0, path );
-    BOOL32 ret = RemoveDirectory32A( xpath );
-    HeapFree( GetProcessHeap(), 0, xpath );
-    return ret;
-}
-
-
-/***********************************************************************
  *           FILE_SetFileType
  */
-BOOL32 FILE_SetFileType( HFILE hFile, DWORD type )
+BOOL32 FILE_SetFileType( HFILE32 hFile, DWORD type )
 {
-    DOS_FILE *file = FILE_GetFile(hFile);
+    DOS_FILE *file = FILE_GetFile( hFile );
     if (!file) return FALSE;
     file->type = type;
+    FILE_ReleaseFile( file );
     return TRUE;
 }
 
@@ -1411,65 +1144,27 @@
 /***********************************************************************
  *           GetFileType   (KERNEL32.222)
  */
-DWORD GetFileType( HFILE hFile )
+DWORD GetFileType( HFILE32 hFile )
 {
     DOS_FILE *file = FILE_GetFile(hFile);
-    
-    if (!file)
-    {
-    	SetLastError( ERROR_INVALID_HANDLE );
-    	return FILE_TYPE_UNKNOWN; /* FIXME: correct? */
-    }
+    if (!file) return FILE_TYPE_UNKNOWN; /* FIXME: correct? */
+    FILE_ReleaseFile( file );
     return file->type;
 }
 
 
 /***********************************************************************
- *              GetFileTime   (KERNEL32.221)
- */
-BOOL32 GetFileTime( HFILE hFile, FILETIME *lpCreationTime,
-                    FILETIME *lpLastAccessTime, FILETIME *lpLastWriteTime )
-{
-    DOS_FILE *file = FILE_GetFile(hFile);
-    struct stat stbuf;
-    
-    if (!file) {
-    	SetLastError( ERROR_INVALID_HANDLE );
-	return FILE_TYPE_UNKNOWN; /* FIXME: correct? */
-    }
-    dprintf_file(stddeb,"SetFileTime(%s,%p,%p,%p)\n",
-	file->unix_name,
-	lpCreationTime,
-	lpLastAccessTime,
-	lpLastWriteTime
-    );
-    if (-1==fstat(file->unix_handle,&stbuf)) {
-	FILE_SetDosError();
-	return FALSE;
-    }
-    if (lpLastWriteTime)
-    	DOSFS_UnixTimeToFileTime(stbuf.st_mtime,lpLastWriteTime);
-    if (lpCreationTime)
-	DOSFS_UnixTimeToFileTime(stbuf.st_ctime,lpCreationTime);
-    if (lpLastAccessTime)
-    	DOSFS_UnixTimeToFileTime(stbuf.st_atime,lpLastAccessTime);
-    return TRUE;
-}
-
-
-/***********************************************************************
  *              SetFileTime   (KERNEL32.493)
  */
-BOOL32 SetFileTime( HFILE hFile, FILETIME *lpCreationTime,
-                    FILETIME *lpLastAccessTime, FILETIME *lpLastWriteTime )
+BOOL32 SetFileTime( HFILE32 hFile,
+                    const FILETIME *lpCreationTime,
+                    const FILETIME *lpLastAccessTime,
+                    const FILETIME *lpLastWriteTime )
 {
     DOS_FILE *file = FILE_GetFile(hFile);
     struct utimbuf utimbuf;
     
-    if (!file) {
-    	SetLastError( ERROR_INVALID_HANDLE );
-    	return FILE_TYPE_UNKNOWN; /* FIXME: correct? */
-    }
+    if (!file) return FILE_TYPE_UNKNOWN; /* FIXME: correct? */
     dprintf_file(stddeb,"SetFileTime(%s,%p,%p,%p)\n",
 	file->unix_name,
 	lpCreationTime,
@@ -1484,9 +1179,12 @@
 	utimbuf.modtime	= DOSFS_FileTimeToUnixTime(lpLastWriteTime);
     else
 	utimbuf.modtime	= 0; /* FIXME */
-    if (-1==utime(file->unix_name,&utimbuf)) {
+    if (-1==utime(file->unix_name,&utimbuf))
+    {
+        FILE_ReleaseFile( file );
 	FILE_SetDosError();
 	return FALSE;
     }
+    FILE_ReleaseFile( file );
     return TRUE;
 }
diff --git a/files/profile.c b/files/profile.c
index 2f08849..393fe48 100644
--- a/files/profile.c
+++ b/files/profile.c
@@ -5,7 +5,6 @@
  * Copyright 1996 Alexandre Julliard
  */
 
-#define NO_TRANSITION_TYPES  /* This file is Win32-clean */
 #include <ctype.h>
 #include <stdio.h>
 #include <stdlib.h>
@@ -14,7 +13,6 @@
 #include "windows.h"
 #include "dos_fs.h"
 #include "heap.h"
-#include "xmalloc.h"
 #include "stddebug.h"
 #include "debug.h"
 
@@ -139,16 +137,16 @@
 
     for ( ; section; section = next_section)
     {
-        if (section->name) free( section->name );
+        if (section->name) HeapFree( SystemHeap, 0, section->name );
         for (key = section->key; key; key = next_key)
         {
             next_key = key->next;
-            if (key->name) free( key->name );
-            if (key->value) free( key->value );
-            free( key );
+            if (key->name) HeapFree( SystemHeap, 0, key->name );
+            if (key->value) HeapFree( SystemHeap, 0, key->value );
+            HeapFree( SystemHeap, 0, key );
         }
         next_section = section->next;
-        free( section );
+        HeapFree( SystemHeap, 0, section );
     }
 }
 
@@ -167,7 +165,7 @@
     PROFILESECTION **prev_section;
     PROFILEKEY *key, **prev_key;
 
-    first_section = (PROFILESECTION *)xmalloc( sizeof(*section) );
+    first_section = HEAP_xalloc( SystemHeap, 0, sizeof(*section) );
     first_section->name = NULL;
     first_section->key  = NULL;
     first_section->next = NULL;
@@ -192,8 +190,8 @@
             {
                 *p2 = '\0';
                 p++;
-                section = (PROFILESECTION *)xmalloc( sizeof(*section));
-                section->name = xstrdup( p );
+                section = HEAP_xalloc( SystemHeap, 0, sizeof(*section) );
+                section->name = HEAP_strdupA( SystemHeap, 0, p );
                 section->key  = NULL;
                 section->next = NULL;
                 *prev_section = section;
@@ -209,9 +207,9 @@
             *p2++ = '\0';
             while (*p2 && isspace(*p2)) p2++;
         }
-        key = (PROFILEKEY *)xmalloc( sizeof(*key) );
-        key->name  = xstrdup( p );
-        key->value = p2 ? xstrdup( p2 ) : NULL;
+        key = HEAP_xalloc( SystemHeap, 0, sizeof(*key) );
+        key->name  = HEAP_strdupA( SystemHeap, 0, p );
+        key->value = HEAP_strdupA( SystemHeap, 0, p2 );
         key->next  = NULL;
         *prev_key  = key;
         prev_key = &key->next;
@@ -268,9 +266,9 @@
                 {
                     PROFILEKEY *to_del = *key;
                     *key = to_del->next;
-                    if (to_del->name) free( to_del->name );
-                    if (to_del->value) free( to_del->value );
-                    free( to_del );
+                    if (to_del->name) HeapFree( SystemHeap, 0, to_del->name );
+                    if (to_del->value) HeapFree( SystemHeap, 0, to_del->value);
+                    HeapFree( SystemHeap, 0, to_del );
                     return TRUE;
                 }
                 key = &(*key)->next;
@@ -302,8 +300,8 @@
                 key = &(*key)->next;
             }
             if (!create) return NULL;
-            *key = (PROFILEKEY *)xmalloc( sizeof(PROFILEKEY) );
-            (*key)->name  = xstrdup( key_name );
+            *key = HEAP_xalloc( SystemHeap, 0, sizeof(PROFILEKEY) );
+            (*key)->name  = HEAP_strdupA( SystemHeap, 0, key_name );
             (*key)->value = NULL;
             (*key)->next  = NULL;
             return *key;
@@ -311,11 +309,11 @@
         section = &(*section)->next;
     }
     if (!create) return NULL;
-    *section = (PROFILESECTION *)xmalloc( sizeof(PROFILESECTION) );
-    (*section)->name = xstrdup(section_name);
+    *section = HEAP_xalloc( SystemHeap, 0, sizeof(PROFILESECTION) );
+    (*section)->name = HEAP_strdupA( SystemHeap, 0, section_name );
     (*section)->next = NULL;
-    (*section)->key  = (PROFILEKEY *)xmalloc( sizeof(PROFILEKEY) );
-    (*section)->key->name  = xstrdup( key_name );
+    (*section)->key  = HEAP_xalloc( SystemHeap, 0, sizeof(PROFILEKEY) );
+    (*section)->key->name  = HEAP_strdupA( SystemHeap, 0, key_name );
     (*section)->key->value = NULL;
     (*section)->key->next  = NULL;
     return (*section)->key;
@@ -400,10 +398,10 @@
 
     /* Flush the previous profile */
 
-    newdos_name = xstrdup( dos_name );
+    newdos_name = HEAP_strdupA( SystemHeap, 0, dos_name );
     PROFILE_FlushFile();
     PROFILE_Free( CurProfile.section );
-    if (CurProfile.dos_name) free( CurProfile.dos_name );
+    if (CurProfile.dos_name) HeapFree( SystemHeap, 0, CurProfile.dos_name );
     CurProfile.section   = NULL;
     CurProfile.dos_name  = newdos_name;
 
@@ -528,6 +526,7 @@
                                         key_name, TRUE );
         dprintf_profile( stddeb, "PROFILE_SetString('%s','%s','%s'): ",
                          section_name, key_name, value );
+        if (!key) return FALSE;
         if (key->value)
         {
             if (!strcmp( key->value, value ))
@@ -536,10 +535,10 @@
                 return TRUE;  /* No change needed */
             }
             dprintf_profile( stddeb, "replacing '%s'\n", key->value );
-            free( key->value );
+            HeapFree( SystemHeap, 0, key->value );
         }
         else dprintf_profile( stddeb, "creating key\n" );
-        key->value = xstrdup( value );
+        key->value = HEAP_strdupA( SystemHeap, 0, value );
         CurProfile.changed = TRUE;
     }
     return TRUE;
diff --git a/graphics/metafiledrv/init.c b/graphics/metafiledrv/init.c
index f1d3454..93d38ca 100644
--- a/graphics/metafiledrv/init.c
+++ b/graphics/metafiledrv/init.c
@@ -144,7 +144,7 @@
 {
     DC *dc;
     METAFILEDRV_PDEVICE *physDev;
-    HFILE hFile;
+    HFILE32 hFile;
 
     dprintf_metafile( stddeb, "CreateMetaFile16: '%s'\n", filename );
 
@@ -154,13 +154,13 @@
     if (filename)  /* disk based metafile */
     {
         physDev->mh->mtType = METAFILE_DISK;
-        if ((hFile = _lcreat( filename, 0 )) == HFILE_ERROR)
+        if ((hFile = _lcreat32( filename, 0 )) == HFILE_ERROR32)
         {
             DeleteDC32( dc->hSelf );
             return 0;
         }
         if (_lwrite32( hFile, (LPSTR)physDev->mh,
-                       sizeof(*physDev->mh)) == HFILE_ERROR)
+                       sizeof(*physDev->mh)) == HFILE_ERROR32)
 	{
             DeleteDC32( dc->hSelf );
             return 0;
@@ -183,7 +183,7 @@
 {
     DC *dc;
     HMETAFILE16 hmf;
-    HFILE hFile;
+    HFILE32 hFile;
     METAFILEDRV_PDEVICE *physDev;
     
     dprintf_metafile( stddeb, "CloseMetaFile(%04x)\n", hdc );
@@ -205,18 +205,18 @@
     {
         hFile = physDev->mh->mtNoParameters;
 	physDev->mh->mtNoParameters = 0;
-        if (_llseek(hFile, 0L, 0) == HFILE_ERROR)
+        if (_llseek32(hFile, 0L, 0) == HFILE_ERROR32)
         {
             DeleteDC32( hdc );
             return 0;
         }
         if (_lwrite32( hFile, (LPSTR)physDev->mh,
-                       sizeof(*physDev->mh)) == HFILE_ERROR)
+                       sizeof(*physDev->mh)) == HFILE_ERROR32)
         {
             DeleteDC32( hdc );
             return 0;
         }
-        _lclose(hFile);
+        _lclose32(hFile);
     }
 
     /* Now allocate a global handle for the metafile */
diff --git a/graphics/wing.c b/graphics/wing.c
index 0ed174f..c3254bc 100644
--- a/graphics/wing.c
+++ b/graphics/wing.c
@@ -149,23 +149,9 @@
 				  bmpObjPtr->bitmap.bmHeight, bmpi->biBitCount );
 		    if( bmpObjPtr->pixmap )
 		    {
-			WORD s; 
-			if( (sel = AllocSelectorArray( (bytes + 0xFFFF) >> 16 )) )
-			{
-			    DWORD	base = (DWORD)p->si.shmaddr, l;
-
-			    SetSelectorBase( sel, base );
-			    SetSelectorLimit( sel, bytes );
-			    s = sel;
-			    for( l = 0x10000; l < bytes ; )
-			    {
-			       s += __AHINCR;
-			       SetSelectorBase( s, base + l );
-			       l += 0x10000;
-			       SetSelectorLimit( s, (l < bytes)?0xFFFF:bytes%0x10000);
-			    }
-			    p->bits = MAKELONG(0, sel);
-			} 
+                        sel = SELECTOR_AllocBlock( p->si.shmaddr, bytes,
+                                                   SEGMENT_DATA, FALSE, FALSE);
+                        if (sel) p->bits = PTR_SEG_OFF_TO_SEGPTR(sel,0);
 			else XFreePixmap( display, bmpObjPtr->pixmap );
 		    }
 		    if( !sel )
diff --git a/if1632/Makefile.in b/if1632/Makefile.in
index 1df513d..11222e0 100644
--- a/if1632/Makefile.in
+++ b/if1632/Makefile.in
@@ -55,6 +55,7 @@
 SPEC_FILES = $(DLLS:.spec=.s)
 
 C_SRCS = \
+	builtin.c \
 	dummy.c \
 	relay.c \
 	thunk.c
diff --git a/loader/builtin.c b/if1632/builtin.c
similarity index 88%
rename from loader/builtin.c
rename to if1632/builtin.c
index 0a12bc6..a023ef3 100644
--- a/loader/builtin.c
+++ b/if1632/builtin.c
@@ -4,20 +4,20 @@
  * Copyright 1996 Alexandre Julliard
  */
 
-#ifndef WINELIB
-
+#include <assert.h>
 #include <ctype.h>
 #include <string.h>
 #include "windows.h"
 #include "gdi.h"
 #include "global.h"
 #include "module.h"
+#include "miscemu.h"
 #include "neexe.h"
+#include "stackframe.h"
 #include "user.h"
 #include "stddebug.h"
 #include "debug.h"
 
-
 /* Built-in modules descriptors */
 /* Don't change these structures! (see tools/build.c) */
 
@@ -166,6 +166,8 @@
     { NULL, 0 }
 };
 
+  /* Ordinal number for interrupt 0 handler in WPROCS.DLL */
+#define FIRST_INTERRUPT_ORDINAL 100
 
 /***********************************************************************
  *           BUILTIN_Init
@@ -176,15 +178,13 @@
 {
     BUILTIN_DLL *dll;
     NE_MODULE *pModule;
+    WORD vector;
+    HMODULE16 hModule;
 
     for (dll = BuiltinDLLs; dll->descr; dll++)
         if (dll->flags & DLL_FLAG_ALWAYS_USED)
             if (!BUILTIN_LoadModule(dll->descr->name, TRUE)) return FALSE;
 
-    /* Initialize KERNEL.178 (__WINFLAGS) with the correct flags value */
-
-    MODULE_SetEntryPoint( GetModuleHandle( "KERNEL" ), 178, GetWinFlags() );
-
     /* Set the USER and GDI heap selectors */
 
     pModule      = MODULE_GetPtr( GetModuleHandle( "USER" ));
@@ -192,6 +192,40 @@
     pModule      = MODULE_GetPtr( GetModuleHandle( "GDI" ));
     GDI_HeapSel  = (NE_SEG_TABLE( pModule ) + pModule->dgroup - 1)->selector;
 
+    /* Initialize KERNEL.178 (__WINFLAGS) with the correct flags value */
+
+    hModule = GetModuleHandle( "KERNEL" );
+    MODULE_SetEntryPoint( hModule, 178, GetWinFlags() );
+
+    /* Initialize the real-mode selector entry points */
+
+#define SET_ENTRY_POINT(num,addr) \
+    MODULE_SetEntryPoint( hModule, (num), GLOBAL_CreateBlock( GMEM_FIXED, \
+                                  DOSMEM_dosmem+(addr), 0x10000, hModule, \
+                                  FALSE, FALSE, FALSE, NULL ))
+
+    SET_ENTRY_POINT( 174, 0xa0000 );  /* KERNEL.174: __A000H */
+    SET_ENTRY_POINT( 181, 0xb0000 );  /* KERNEL.181: __B000H */
+    SET_ENTRY_POINT( 182, 0xb8000 );  /* KERNEL.182: __B800H */
+    SET_ENTRY_POINT( 195, 0xc0000 );  /* KERNEL.195: __C000H */
+    SET_ENTRY_POINT( 179, 0xd0000 );  /* KERNEL.179: __D000H */
+    SET_ENTRY_POINT( 190, 0xe0000 );  /* KERNEL.190: __E000H */
+    SET_ENTRY_POINT( 173, 0xf0000 );  /* KERNEL.173: __ROMBIOS */
+    SET_ENTRY_POINT( 194, 0xf0000 );  /* KERNEL.194: __F000H */
+    MODULE_SetEntryPoint(hModule,193,DOSMEM_BiosSeg); /* KERNEL.193: __0040H */
+#undef SET_ENTRY_POINT
+
+    /* Set interrupt vectors from entry points in WPROCS.DLL */
+
+    hModule = GetModuleHandle( "WPROCS" );
+    for (vector = 0; vector < 256; vector++)
+    {
+        FARPROC16 proc = MODULE_GetEntryPoint( hModule,
+                                               FIRST_INTERRUPT_ORDINAL+vector);
+        assert(proc);
+        INT_SetHandler( vector, proc );
+    }
+
     return TRUE;
 }
 
@@ -416,6 +450,20 @@
 }
 
 
+/**********************************************************************
+ *	    BUILTIN_DefaultIntHandler
+ *
+ * Default interrupt handler.
+ */
+void BUILTIN_DefaultIntHandler( CONTEXT *context )
+{
+    WORD ordinal;
+    STACK16FRAME *frame = CURRENT_STACK16;
+    BUILTIN_GetEntryPoint16( frame->entry_cs, frame->entry_ip, &ordinal );
+    INT_BARF( context, ordinal - FIRST_INTERRUPT_ORDINAL );
+}
+
+
 /***********************************************************************
  *           BUILTIN_ParseDLLOptions
  *
@@ -475,5 +523,3 @@
     fprintf(stderr,"\n");
     exit(1);
 }
-
-#endif  /* WINELIB */
diff --git a/if1632/kernel.spec b/if1632/kernel.spec
index 7d335ba..88456fd 100644
--- a/if1632/kernel.spec
+++ b/if1632/kernel.spec
@@ -70,18 +70,18 @@
 71  pascal16 DeleteAtom(word) DeleteAtom
 72  pascal16 GetAtomName(word ptr word) GetAtomName
 73  pascal16 GetAtomHandle(word) GetAtomHandle
-74  pascal16 OpenFile(ptr ptr word) OpenFile
+74  pascal16 OpenFile(ptr ptr word) OpenFile16
 75  stub OpenPathName
 76  stub DeletePathName
 #77 RESERVED1
 #78 RESERVED2
 #79 RESERVED3
 #80 RESERVED4
-81  pascal16 _lclose(word) _lclose
+81  pascal16 _lclose(word) _lclose16
 82  pascal16 _lread(word segptr word) WIN16_lread
-83  pascal16 _lcreat(ptr word) _lcreat
-84  pascal   _llseek(word long word) _llseek
-85  pascal16 _lopen(ptr word) _lopen
+83  pascal16 _lcreat(ptr word) _lcreat16
+84  pascal   _llseek(word long word) _llseek16
+85  pascal16 _lopen(ptr word) _lopen16
 86  pascal16 _lwrite(word ptr word) _lwrite16
 87  pascal16 RESERVED5(ptr ptr) lstrcmp16
 88  pascal   lstrcpy(segptr segptr) lstrcpy16
@@ -96,7 +96,7 @@
 97  pascal16 GetTempFileName(byte ptr word ptr) GetTempFileName16
 98  return GetLastDiskChange 0 0
 99  stub GetLPErrMode
-100 stub ValidateCodeSegments
+100 return ValidateCodeSegments 0 0
 101 stub NoHookDosCall
 102 register DOS3Call() DOS3Call
 103 register NetBIOSCall() NetBIOSCall
@@ -135,7 +135,7 @@
 134 pascal16 GetWindowsDirectory(ptr word) GetWindowsDirectory16
 135 pascal16 GetSystemDirectory(ptr word) GetSystemDirectory16
 136 pascal16 GetDriveType(byte) GetDriveType16
-137 pascal FatalAppExit(word ptr) FatalAppExit
+137 pascal16 FatalAppExit(word ptr) FatalAppExit16
 138 pascal GetHeapSpaces(word) GetHeapSpaces
 139 stub DoSignal
 140 pascal16 SetSigHandler(segptr ptr ptr word word) SetSigHandler
@@ -146,7 +146,7 @@
 145 pascal16 RemoveDirectory(ptr) RemoveDirectory16
 146 pascal16 DeleteFile(ptr) DeleteFile16
 147 pascal16 SetLastError(long) SetLastError
-148 pascal16 GetLastError() GetLastError
+148 pascal   GetLastError() GetLastError
 149 stub GetVersionEx
 150 pascal16 DirectedYield(word) DirectedYield
 151 stub WinOldApCall
@@ -163,7 +163,7 @@
 163 pascal16 GlobalLRUOldest(word) GlobalLRUOldest
 164 pascal16 GlobalLRUNewest(word) GlobalLRUNewest
 165 return A20Proc 2 0
-166 pascal16 WinExec(ptr word) WinExec
+166 pascal16 WinExec(ptr word) WinExec16
 167 pascal16 GetExpWinVer(word) GetExpWinVer
 168 pascal16 DirectResAlloc(word word word) DirectResAlloc
 169 pascal GetFreeSpace(word) GetFreeSpace
@@ -197,7 +197,7 @@
 197 pascal16 GlobalFix(word) GlobalFix
 198 pascal16 GlobalUnfix(word) GlobalUnfix
 199 pascal16 SetHandleCount(word) SetHandleCount16
-200 stub ValidateFreeSpaces
+200 return ValidateFreeSpaces 0 0
 201 stub ReplaceInst
 202 stub RegisterPtrace
 203 register DebugBreak() DebugBreak16
@@ -257,7 +257,7 @@
 347 pascal16 IsBadHugeWritePtr(segptr long) IsBadHugeWritePtr16
 348 pascal16 hmemcpy(ptr ptr long) hmemcpy
 349 pascal   _hread(word segptr long) WIN16_hread
-350 pascal   _hwrite(word ptr long) _hwrite
+350 pascal   _hwrite(word ptr long) _hwrite16
 #351 BUNNY_351
 352 pascal   lstrcatn(segptr segptr word) lstrcatn16
 353 pascal   lstrcpyn(segptr segptr word) lstrcpyn16
@@ -279,8 +279,8 @@
 417 stub WriteProfileSection
 418 stub GetPrivateProfileSection
 419 stub GetProfileSection
-420 stub GetFileAttributes
-421 stub SetFileAttributes
+420 pascal   GetFileAttributes(ptr) GetFileAttributes16
+421 pascal16 SetFileAttributes(ptr long) SetFileAttributes16
 422 pascal16 GetDiskFreeSpace(ptr ptr ptr ptr ptr) GetDiskFreeSpace16 
 432 stub FileTimeToLocalFileTime
 450 pascal16 KERNEL_450() stub_KERNEL_450
diff --git a/if1632/kernel32.spec b/if1632/kernel32.spec
index 68d060c..9fbd367 100644
--- a/if1632/kernel32.spec
+++ b/if1632/kernel32.spec
@@ -25,7 +25,7 @@
 0020 stdcall ClearCommBreak(long) ClearCommBreak32
 0021 stdcall ClearCommError(long ptr ptr) ClearCommError
 0022 stub CloseConsoleHandle
-0023    stdcall CloseHandle(long) CloseHandle
+0023 stdcall CloseHandle(long) CloseHandle
 0024 stub CloseProfileUserMapping
 0025 stub CmdBatNotification
 0026 stub CommConfigDialogA
@@ -110,8 +110,8 @@
 0105 stub ExpungeConsoleCommandHistoryA
 0106 stub ExpungeConsoleCommandHistoryW
 0107 stub ExtendVirtualBuffer
-0108 stub FatalAppExitA
-0109 stub FatalAppExitW
+0108 stdcall FatalAppExitA(long ptr) FatalAppExit32A
+0109 stdcall FatalAppExitW(long ptr) FatalAppExit32W
 0110 stub FatalExit
 0111 stdcall FileTimeToDosDateTime(ptr ptr ptr) FileTimeToDosDateTime
 0112 stdcall FileTimeToLocalFileTime(ptr ptr) FileTimeToLocalFileTime
@@ -201,9 +201,9 @@
 0196 stdcall GetCurrentDirectoryA(long ptr) GetCurrentDirectory32A
 0197 stdcall GetCurrentDirectoryW(long ptr) GetCurrentDirectory32W
 0198 stdcall GetCurrentProcess() GetCurrentProcess
-0199 stdcall GetCurrentProcessId() GetCurrentThreadId
-0200 	stdcall GetCurrentThread() GetCurrentThread
-0201	stdcall GetCurrentThreadId()	GetCurrentThreadId
+0199 stdcall GetCurrentProcessId() GetCurrentProcessId
+0200 stdcall GetCurrentThread() GetCurrentThread
+0201 stdcall GetCurrentThreadId() GetCurrentThreadId
 0202 stub GetDateFormatA
 0203 stub GetDateFormatW
 0204 stub GetDefaultCommConfigA
@@ -398,7 +398,7 @@
 0393 stub OpenConsoleW
 0394 stub OpenEventA
 0395 stub OpenEventW
-0396 stdcall OpenFile(ptr ptr long) OpenFile
+0396 stdcall OpenFile(ptr ptr long) OpenFile32
 0397 stdcall OpenFileMappingA(long long ptr) OpenFileMapping
 0398 stub OpenFileMappingW
 0399 stub OpenMutexA
@@ -499,7 +499,7 @@
 0494 stdcall SetHandleCount(long) SetHandleCount32
 0495 stub SetHandleInformation
 0496 stub SetLastConsoleEventActive
-0497    stdcall SetLastError(long) SetLastError
+0497 stdcall SetLastError(long) SetLastError
 0498 stub SetLocalTime
 0499 stdcall SetLocaleInfoA(long long ptr) SetLocaleInfoA
 0500 stub SetLocaleInfoW
@@ -533,9 +533,9 @@
 0528 stub TerminateProcess
 0529 stub TerminateThread
 0530 stdcall TlsAlloc()	TlsAlloc
-0531 stdcall TlsFree(long)	TlsFree
-0532 stdcall TlsGetValue(long)	TlsGetValue
-0533 stdcall TlsSetValue(long ptr)	TlsSetValue
+0531 stdcall TlsFree(long) TlsFree
+0532 stdcall TlsGetValue(long) TlsGetValue
+0533 stdcall TlsSetValue(long ptr) TlsSetValue
 0534 stub TransactNamedPipe
 0535 stdcall TransmitCommChar(long long) TransmitCommChar32
 0536 stub TrimVirtualBuffer
@@ -568,7 +568,7 @@
 0563 stub WaitNamedPipeA
 0564 stub WaitNamedPipeW
 0565 stdcall WideCharToMultiByte(long long ptr long ptr long ptr ptr)	WideCharToMultiByte
-0566 stdcall WinExec(ptr long) WinExec
+0566 stdcall WinExec(ptr long) WinExec32
 0567 stdcall WriteConsoleA(long ptr long ptr ptr) WriteConsole32A
 0568 stub WriteConsoleInputA
 0569 stub WriteConsoleInputVDMA
@@ -592,12 +592,12 @@
 0587 stdcall WriteProfileStringA(ptr ptr ptr) WriteProfileString32A
 0588 stdcall WriteProfileStringW(ptr ptr ptr) WriteProfileString32W
 0589 stub WriteTapemark
-0590 stdcall _hread(long ptr long) _hread
-0591 stdcall _hwrite(long ptr long) _hwrite
-0592 stdcall _lclose(long) _lclose
-0593 stdcall _lcreat(ptr long) _lcreat
-0594 stdcall _llseek(long long long) _llseek
-0595 stdcall _lopen(ptr long) _lopen
+0590 stdcall _hread(long ptr long) _hread32
+0591 stdcall _hwrite(long ptr long) _hwrite32
+0592 stdcall _lclose(long) _lclose32
+0593 stdcall _lcreat(ptr long) _lcreat32
+0594 stdcall _llseek(long long long) _llseek32
+0595 stdcall _lopen(ptr long) _lopen32
 0596 stdcall _lread(long ptr long) _lread32
 0597 stdcall _lwrite(long ptr long) _lwrite32
 0598 stdcall lstrcat(ptr ptr) lstrcat32A
diff --git a/if1632/lz32.spec b/if1632/lz32.spec
index 2caac4e..a51a5f1 100644
--- a/if1632/lz32.spec
+++ b/if1632/lz32.spec
@@ -1,14 +1,14 @@
 name	lz32
 type	win32
 
-0 stdcall LZCopy(long long) LZCopy
+0 stdcall LZCopy(long long) LZCopy32
 1 stdcall LZOpenFileA(ptr ptr long) LZOpenFile32A
-2 stdcall LZInit(long) LZInit
-3 stdcall LZSeek(long long long) LZSeek
+2 stdcall LZInit(long) LZInit32
+3 stdcall LZSeek(long long long) LZSeek32
 4 stdcall LZRead(long ptr long) LZRead32
-5 stdcall LZClose(long) LZClose
-6 stdcall LZStart() LZStart
-7 stdcall CopyLZFile(long long) CopyLZFile
+5 stdcall LZClose(long) LZClose32
+6 stdcall LZStart() LZStart32
+7 stdcall CopyLZFile(long long) CopyLZFile32
 8 stdcall LZDone() LZDone
 9 stdcall GetExpandedNameA(ptr ptr) GetExpandedName32A
 10 stdcall LZOpenFileW(ptr ptr long) LZOpenFile32W
diff --git a/if1632/lzexpand.spec b/if1632/lzexpand.spec
index e05997a..a12c7e2 100644
--- a/if1632/lzexpand.spec
+++ b/if1632/lzexpand.spec
@@ -1,14 +1,14 @@
 name	lzexpand
 type	win16
 
-1  pascal   LZCopy(word word) LZCopy
+1  pascal   LZCopy(word word) LZCopy16
 2  pascal16 LZOpenFile(ptr ptr word) LZOpenFile16
-3  pascal16 LZInit(word) LZInit
-4  pascal   LZSeek(word long word) LZSeek
-5  pascal16 LZRead(word segptr word) LZRead16
-6  pascal16 LZClose(word) LZClose
-7  pascal16 LZStart() LZStart
-8  pascal   CopyLZFile(word word) CopyLZFile
+3  pascal16 LZInit(word) LZInit16
+4  pascal   LZSeek(word long word) LZSeek16
+5  pascal16 LZRead(word ptr word) LZRead16
+6  pascal16 LZClose(word) LZClose16
+7  pascal16 LZStart() LZStart16
+8  pascal   CopyLZFile(word word) CopyLZFile16
 9  pascal16 LZDone() LZDone
 10 pascal16 GetExpandedName(ptr ptr) GetExpandedName16
 #11 WEP
diff --git a/if1632/relay.c b/if1632/relay.c
index 63b3509..cc9b839 100644
--- a/if1632/relay.c
+++ b/if1632/relay.c
@@ -5,9 +5,9 @@
 
 #include <stdio.h>
 #include "windows.h"
+#include "winnt.h"
 #include "global.h"
 #include "module.h"
-#include "registers.h"
 #include "stackframe.h"
 #include "task.h"
 #include "stddebug.h"
@@ -52,7 +52,7 @@
  *           RELAY_DebugCallFrom16
  */
 void RELAY_DebugCallFrom16( int func_type, char *args,
-                            void *entry_point, SIGCONTEXT *context )
+                            void *entry_point, CONTEXT *context )
 {
     STACK16FRAME *frame;
     WORD ordinal;
@@ -108,25 +108,19 @@
         printf( "     AX=%04x BX=%04x CX=%04x DX=%04x SI=%04x DI=%04x ES=%04x EFL=%08lx\n",
                 AX_reg(context), BX_reg(context), CX_reg(context),
                 DX_reg(context), SI_reg(context), DI_reg(context),
-                ES_reg(context), EFL_reg(context) );
+                (WORD)ES_reg(context), EFL_reg(context) );
 }
 
 
 /***********************************************************************
  *           RELAY_DebugCallFrom16Ret
  */
-void RELAY_DebugCallFrom16Ret( int func_type, int ret_val, SIGCONTEXT *context)
+void RELAY_DebugCallFrom16Ret( int func_type, int ret_val, CONTEXT *context)
 {
     STACK16FRAME *frame;
     WORD ordinal;
 
-    if (*(DWORD *)PTR_SEG_TO_LIN(IF1632_Stack32_base) != 0xDEADBEEF)
-    {
-	fprintf(stderr, "Wine wrote past the end of the 32 bit stack. Please report this.\n");
-        exit(1);  /* There's probably no point in going on */
-    }
     if (!debugging_relay) return;
-
     frame = CURRENT_STACK16;
     printf( "Ret  %s() ", BUILTIN_GetEntryPoint16( frame->entry_cs,
                                                    frame->entry_ip,
@@ -147,7 +141,7 @@
         printf( "     AX=%04x BX=%04x CX=%04x DX=%04x SI=%04x DI=%04x ES=%04x EFL=%08lx\n",
                 AX_reg(context), BX_reg(context), CX_reg(context),
                 DX_reg(context), SI_reg(context), DI_reg(context),
-                ES_reg(context), EFL_reg(context) );
+                (WORD)ES_reg(context), EFL_reg(context) );
         break;
     }
 }
diff --git a/if1632/shell.spec b/if1632/shell.spec
index 8b53f1e..c9c907d 100644
--- a/if1632/shell.spec
+++ b/if1632/shell.spec
@@ -14,8 +14,8 @@
  13 pascal16 DragQueryPoint(word ptr) DragQueryPoint
  20 pascal16 ShellExecute(word ptr ptr ptr ptr s_word) ShellExecute 
  21 pascal16 FindExecutable(ptr ptr ptr) FindExecutable
- 22 pascal16 ShellAbout(word ptr ptr word) ShellAbout
- 33 pascal16 AboutDlgProc(word word word long) AboutDlgProc
+ 22 pascal16 ShellAbout(word ptr ptr word) ShellAbout16
+ 33 pascal16 AboutDlgProc(word word word long) AboutDlgProc16
  34 pascal16 ExtractIcon(word ptr s_word) ExtractIcon
  36 pascal16 ExtractAssociatedIcon(word ptr ptr) ExtractAssociatedIcon
  37 pascal   DoEnvironmentSubst(ptr word) DoEnvironmentSubst
diff --git a/if1632/shell32.spec b/if1632/shell32.spec
index 9977d78..b7c65f7 100644
--- a/if1632/shell32.spec
+++ b/if1632/shell32.spec
@@ -84,7 +84,7 @@
 0079 stub SheSetCurDrive
 0080 stub SheShortenPathA
 0081 stub SheShortenPathW
-0082 stdcall ShellAboutA(long ptr ptr long) ShellAbout
+0082 stdcall ShellAboutA(long ptr ptr long) ShellAbout32A
 0083 stdcall ShellAboutW(long ptr ptr long) ShellAbout32W
 0084 stdcall ShellExecuteA(long ptr ptr ptr ptr long) ShellExecute
 0085 stub ShellExecuteEx
diff --git a/if1632/user.spec b/if1632/user.spec
index c97fdc9..dee73b5 100644
--- a/if1632/user.spec
+++ b/if1632/user.spec
@@ -8,7 +8,7 @@
 4   stub DisableOEMLayer
 5   pascal16 InitApp(word) InitApp
 6   pascal16 PostQuitMessage(word) PostQuitMessage
-7   pascal16 ExitWindows(long word) ExitWindows
+7   pascal16 ExitWindows(long word) ExitWindows16
 10  pascal16 SetTimer(word word word segptr) SetTimer16
 11  pascal16 SetSystemTimer(word word word segptr) SetSystemTimer16
 12  pascal16 KillTimer(word word) KillTimer16
@@ -125,9 +125,9 @@
 123 pascal16 CallMsgFilter(segptr s_word) CallMsgFilter16
 124 pascal16 UpdateWindow(word) UpdateWindow
 125 pascal16 InvalidateRect(word ptr word) InvalidateRect16
-126 pascal16 InvalidateRgn(word word word) InvalidateRgn
+126 pascal16 InvalidateRgn(word word word) InvalidateRgn16
 127 pascal16 ValidateRect(word ptr) ValidateRect16
-128 pascal16 ValidateRgn(word word) ValidateRgn
+128 pascal16 ValidateRgn(word word) ValidateRgn16
 129 pascal16 GetClassWord(word s_word) GetClassWord
 130 pascal16 SetClassWord(word s_word word) SetClassWord
 131 pascal   GetClassLong(word s_word) GetClassLong16
@@ -170,7 +170,7 @@
 168 pascal16 SetCaretBlinkTime(word) SetCaretBlinkTime
 169 pascal16 GetCaretBlinkTime() GetCaretBlinkTime16
 170 pascal16 ArrangeIconicWindows(word) ArrangeIconicWindows
-171 pascal16 WinHelp(word ptr word long) WinHelp
+171 pascal16 WinHelp(word ptr word long) WinHelp16
 172 stub SwitchToThisWindow
 173 pascal16 LoadCursor(word segptr) LoadCursor16
 174 pascal16 LoadIcon(word segptr) LoadIcon16
diff --git a/if1632/user32.spec b/if1632/user32.spec
index a0cb5c4..3f5f9e8 100644
--- a/if1632/user32.spec
+++ b/if1632/user32.spec
@@ -199,7 +199,7 @@
 0192 stdcall EnumWindows(ptr long) THUNK_EnumWindows32
 0193 stdcall EqualRect(ptr ptr) EqualRect32
 0194 stdcall ExcludeUpdateRgn(long long) ExcludeUpdateRgn
-0195 stub ExitWindowsEx
+0195 stdcall ExitWindowsEx(long long) ExitWindowsEx
 0196 stdcall FillRect(long ptr long) FillRect32
 0197 stdcall FindWindowA(ptr ptr) FindWindow32A
 0198 stdcall FindWindowExA(long long ptr ptr) FindWindowEx32A
@@ -332,7 +332,7 @@
 0325 stub InternalGetWindowText
 0326 stdcall IntersectRect(ptr ptr ptr) IntersectRect32
 0327 stdcall InvalidateRect(long ptr long) InvalidateRect32
-0328 stdcall InvalidateRgn(long long long) InvalidateRgn
+0328 stdcall InvalidateRgn(long long long) InvalidateRgn32
 0329 stdcall InvertRect(long ptr) InvertRect32
 0330 stdcall IsCharAlphaA(long) IsCharAlpha32A
 0331 stdcall IsCharAlphaNumericA(long) IsCharAlphaNumeric32A
@@ -553,7 +553,7 @@
 0546 stub ToAsciiEx
 0547 stub ToUnicode
 0548 stdcall TrackPopupMenu(long long long long long long ptr) TrackPopupMenu32
-0549 stub TrackPopupMenuEx
+0549 stdcall TrackPopupMenuEx(long long long long long ptr) TrackPopupMenuEx
 0550 stdcall TranslateAccelerator(long long ptr) TranslateAccelerator
 0551 stdcall TranslateAcceleratorA(long long ptr) TranslateAccelerator
 0552 stdcall TranslateAcceleratorW(long long ptr) TranslateAccelerator
@@ -575,15 +575,15 @@
 0568 stub UserRealizePalette
 0569 stub UserRegisterWowHandlers
 0570 stdcall ValidateRect(long ptr) ValidateRect32
-0571 stdcall ValidateRgn(long long) ValidateRgn
+0571 stdcall ValidateRgn(long long) ValidateRgn32
 0572 stdcall VkKeyScanA(long) VkKeyScan
 0573 stub VkKeyScanExA
 0574 stub VkKeyScanExW
 0575 stub VkKeyScanW
 0576 stub WaitForInputIdle
 0577 stub WaitMessage
-0578 stdcall WinHelpA(long ptr long long)	WIN32_WinHelpA
-0579 stub WinHelpW
+0578 stdcall WinHelpA(long ptr long long) WinHelp32A
+0579 stdcall WinHelpW(long ptr long long) WinHelp32W
 0580 stdcall WindowFromDC(long) WindowFromDC32
 0581 stdcall WindowFromPoint(long long) WindowFromPoint32
 0582 stub keybd_event
diff --git a/if1632/wprocs.spec b/if1632/wprocs.spec
index 3522fec..70970d0 100644
--- a/if1632/wprocs.spec
+++ b/if1632/wprocs.spec
@@ -9,7 +9,6 @@
 7  pascal PopupMenuWndProc(word word word long) PopupMenuWndProc
 9  pascal DefDlgProc(word word word long) DefDlgProc16
 10 pascal MDIClientWndProc(word word word long) MDIClientWndProc
-13 pascal SystemMessageBoxProc(word word word long) SystemMessageBoxProc
 14 pascal FileOpenDlgProc(word word word long) FileOpenDlgProc
 15 pascal FileSaveDlgProc(word word word long) FileSaveDlgProc
 16 pascal ColorDlgProc(word word word long) ColorDlgProc
@@ -17,7 +16,6 @@
 18 pascal ReplaceTextDlgProc(word word word long) ReplaceTextDlgProc
 19 pascal PrintSetupDlgProc(word word word long) PrintSetupDlgProc
 20 pascal PrintDlgProc(word word word long) PrintDlgProc
-21 pascal AboutDlgProc(word word word long) AboutDlgProc
 22 pascal ComboLBoxWndProc(word word word long) ComboLBoxWndProc
 24 pascal16 TASK_Reschedule() TASK_Reschedule
 27 pascal EntryAddrProc(word word) MODULE_GetEntryPoint
@@ -26,263 +24,263 @@
  
 # Interrupt vectors 0-255 are ordinals 100-355
 # The 'word' parameter are the flags pushed on the stack by the interrupt
-100 register INT_Int00Handler(word) INT_DummyHandler
-101 register INT_Int01Handler(word) INT_DummyHandler
-102 register INT_Int02Handler(word) INT_DummyHandler
-103 register INT_Int03Handler(word) INT_DummyHandler
-104 register INT_Int04Handler(word) INT_DummyHandler
-105 register INT_Int05Handler(word) INT_DummyHandler
-106 register INT_Int06Handler(word) INT_DummyHandler
-107 register INT_Int07Handler(word) INT_DummyHandler
-108 register INT_Int08Handler(word) INT_DummyHandler
-109 register INT_Int09Handler(word) INT_DummyHandler
-110 register INT_Int0aHandler(word) INT_DummyHandler
-111 register INT_Int0bHandler(word) INT_DummyHandler
-112 register INT_Int0cHandler(word) INT_DummyHandler
-113 register INT_Int0dHandler(word) INT_DummyHandler
-114 register INT_Int0eHandler(word) INT_DummyHandler
-115 register INT_Int0fHandler(word) INT_DummyHandler
+100 register INT_Int00Handler(word) BUILTIN_DefaultIntHandler
+101 register INT_Int01Handler(word) BUILTIN_DefaultIntHandler
+102 register INT_Int02Handler(word) BUILTIN_DefaultIntHandler
+103 register INT_Int03Handler(word) BUILTIN_DefaultIntHandler
+104 register INT_Int04Handler(word) BUILTIN_DefaultIntHandler
+105 register INT_Int05Handler(word) BUILTIN_DefaultIntHandler
+106 register INT_Int06Handler(word) BUILTIN_DefaultIntHandler
+107 register INT_Int07Handler(word) BUILTIN_DefaultIntHandler
+108 register INT_Int08Handler(word) BUILTIN_DefaultIntHandler
+109 register INT_Int09Handler(word) BUILTIN_DefaultIntHandler
+110 register INT_Int0aHandler(word) BUILTIN_DefaultIntHandler
+111 register INT_Int0bHandler(word) BUILTIN_DefaultIntHandler
+112 register INT_Int0cHandler(word) BUILTIN_DefaultIntHandler
+113 register INT_Int0dHandler(word) BUILTIN_DefaultIntHandler
+114 register INT_Int0eHandler(word) BUILTIN_DefaultIntHandler
+115 register INT_Int0fHandler(word) BUILTIN_DefaultIntHandler
 116 register INT_Int10Handler(word) INT_Int10Handler
 117 register INT_Int11Handler(word) INT_Int11Handler
 118 register INT_Int12Handler(word) INT_Int12Handler
 119 register INT_Int13Handler(word) INT_Int13Handler
-120 register INT_Int14Handler(word) INT_DummyHandler
-121 register INT_Int15Handler(word) INT_Int15Handler
-122 register INT_Int16Handler(word) INT_Int16Handler
-123 register INT_Int17Handler(word) INT_DummyHandler
-124 register INT_Int18Handler(word) INT_DummyHandler
-125 register INT_Int19Handler(word) INT_DummyHandler
+120 register INT_Int14Handler(word) BUILTIN_DefaultIntHandler
+121 register INT_Int15Handler(word) BUILTIN_DefaultIntHandler
+122 register INT_Int16Handler(word) BUILTIN_DefaultIntHandler
+123 register INT_Int17Handler(word) BUILTIN_DefaultIntHandler
+124 register INT_Int18Handler(word) BUILTIN_DefaultIntHandler
+125 register INT_Int19Handler(word) BUILTIN_DefaultIntHandler
 126 register INT_Int1aHandler(word) INT_Int1aHandler
-127 register INT_Int1bHandler(word) INT_DummyHandler
-128 register INT_Int1cHandler(word) INT_DummyHandler
-129 register INT_Int1dHandler(word) INT_DummyHandler
-130 register INT_Int1eHandler(word) INT_DummyHandler
-131 register INT_Int1fHandler(word) INT_DummyHandler
-132 register INT_Int20Handler(word) INT_DummyHandler
+127 register INT_Int1bHandler(word) BUILTIN_DefaultIntHandler
+128 register INT_Int1cHandler(word) BUILTIN_DefaultIntHandler
+129 register INT_Int1dHandler(word) BUILTIN_DefaultIntHandler
+130 register INT_Int1eHandler(word) BUILTIN_DefaultIntHandler
+131 register INT_Int1fHandler(word) BUILTIN_DefaultIntHandler
+132 register INT_Int20Handler(word) BUILTIN_DefaultIntHandler
 133 register INT_Int21Handler(word) DOS3Call
-134 register INT_Int22Handler(word) INT_DummyHandler
-135 register INT_Int23Handler(word) INT_DummyHandler
-136 register INT_Int24Handler(word) INT_DummyHandler
+134 register INT_Int22Handler(word) BUILTIN_DefaultIntHandler
+135 register INT_Int23Handler(word) BUILTIN_DefaultIntHandler
+136 register INT_Int24Handler(word) BUILTIN_DefaultIntHandler
 # Note: int 25 and 26 don't pop the flags from the stack
 137 register INT_Int25Handler()     INT_Int25Handler
 138 register INT_Int26Handler()     INT_Int26Handler
-139 register INT_Int27Handler(word) INT_DummyHandler
-140 register INT_Int28Handler(word) INT_DummyHandler
-141 register INT_Int29Handler(word) INT_DummyHandler
+139 register INT_Int27Handler(word) BUILTIN_DefaultIntHandler
+140 register INT_Int28Handler(word) BUILTIN_DefaultIntHandler
+141 register INT_Int29Handler(word) BUILTIN_DefaultIntHandler
 142 register INT_Int2aHandler(word) INT_Int2aHandler
-143 register INT_Int2bHandler(word) INT_DummyHandler
-144 register INT_Int2cHandler(word) INT_DummyHandler
-145 register INT_Int2dHandler(word) INT_DummyHandler
-146 register INT_Int2eHandler(word) INT_DummyHandler
+143 register INT_Int2bHandler(word) BUILTIN_DefaultIntHandler
+144 register INT_Int2cHandler(word) BUILTIN_DefaultIntHandler
+145 register INT_Int2dHandler(word) BUILTIN_DefaultIntHandler
+146 register INT_Int2eHandler(word) BUILTIN_DefaultIntHandler
 147 register INT_Int2fHandler(word) INT_Int2fHandler
-148 register INT_Int30Handler(word) INT_DummyHandler
+148 register INT_Int30Handler(word) BUILTIN_DefaultIntHandler
 149 register INT_Int31Handler(word) INT_Int31Handler
-150 register INT_Int32Handler(word) INT_DummyHandler
-151 register INT_Int33Handler(word) INT_DummyHandler
-152 register INT_Int34Handler(word) INT_DummyHandler
-153 register INT_Int35Handler(word) INT_DummyHandler
-154 register INT_Int36Handler(word) INT_DummyHandler
-155 register INT_Int37Handler(word) INT_DummyHandler
-156 register INT_Int38Handler(word) INT_DummyHandler
-157 register INT_Int39Handler(word) INT_DummyHandler
-158 register INT_Int3aHandler(word) INT_DummyHandler
-159 register INT_Int3bHandler(word) INT_DummyHandler
-160 register INT_Int3cHandler(word) INT_DummyHandler
-161 register INT_Int3dHandler(word) INT_DummyHandler
-162 register INT_Int3eHandler(word) INT_DummyHandler
-163 register INT_Int3fHandler(word) INT_DummyHandler
-164 register INT_Int40Handler(word) INT_DummyHandler
-165 register INT_Int41Handler(word) INT_DummyHandler
-166 register INT_Int42Handler(word) INT_DummyHandler
-167 register INT_Int43Handler(word) INT_DummyHandler
-168 register INT_Int44Handler(word) INT_DummyHandler
-169 register INT_Int45Handler(word) INT_DummyHandler
-170 register INT_Int46Handler(word) INT_DummyHandler
-171 register INT_Int47Handler(word) INT_DummyHandler
-172 register INT_Int48Handler(word) INT_DummyHandler
-173 register INT_Int49Handler(word) INT_DummyHandler
-174 register INT_Int4aHandler(word) INT_DummyHandler
+150 register INT_Int32Handler(word) BUILTIN_DefaultIntHandler
+151 register INT_Int33Handler(word) BUILTIN_DefaultIntHandler
+152 register INT_Int34Handler(word) BUILTIN_DefaultIntHandler
+153 register INT_Int35Handler(word) BUILTIN_DefaultIntHandler
+154 register INT_Int36Handler(word) BUILTIN_DefaultIntHandler
+155 register INT_Int37Handler(word) BUILTIN_DefaultIntHandler
+156 register INT_Int38Handler(word) BUILTIN_DefaultIntHandler
+157 register INT_Int39Handler(word) BUILTIN_DefaultIntHandler
+158 register INT_Int3aHandler(word) BUILTIN_DefaultIntHandler
+159 register INT_Int3bHandler(word) BUILTIN_DefaultIntHandler
+160 register INT_Int3cHandler(word) BUILTIN_DefaultIntHandler
+161 register INT_Int3dHandler(word) BUILTIN_DefaultIntHandler
+162 register INT_Int3eHandler(word) BUILTIN_DefaultIntHandler
+163 register INT_Int3fHandler(word) BUILTIN_DefaultIntHandler
+164 register INT_Int40Handler(word) BUILTIN_DefaultIntHandler
+165 register INT_Int41Handler(word) BUILTIN_DefaultIntHandler
+166 register INT_Int42Handler(word) BUILTIN_DefaultIntHandler
+167 register INT_Int43Handler(word) BUILTIN_DefaultIntHandler
+168 register INT_Int44Handler(word) BUILTIN_DefaultIntHandler
+169 register INT_Int45Handler(word) BUILTIN_DefaultIntHandler
+170 register INT_Int46Handler(word) BUILTIN_DefaultIntHandler
+171 register INT_Int47Handler(word) BUILTIN_DefaultIntHandler
+172 register INT_Int48Handler(word) BUILTIN_DefaultIntHandler
+173 register INT_Int49Handler(word) BUILTIN_DefaultIntHandler
+174 register INT_Int4aHandler(word) BUILTIN_DefaultIntHandler
 175 register INT_Int4bHandler(word) INT_Int4bHandler
-176 register INT_Int4cHandler(word) INT_DummyHandler
-177 register INT_Int4dHandler(word) INT_DummyHandler
-178 register INT_Int4eHandler(word) INT_DummyHandler
-179 register INT_Int4fHandler(word) INT_DummyHandler
-180 register INT_Int50Handler(word) INT_DummyHandler
-181 register INT_Int51Handler(word) INT_DummyHandler
-182 register INT_Int52Handler(word) INT_DummyHandler
-183 register INT_Int53Handler(word) INT_DummyHandler
-184 register INT_Int54Handler(word) INT_DummyHandler
-185 register INT_Int55Handler(word) INT_DummyHandler
-186 register INT_Int56Handler(word) INT_DummyHandler
-187 register INT_Int57Handler(word) INT_DummyHandler
-188 register INT_Int58Handler(word) INT_DummyHandler
-189 register INT_Int59Handler(word) INT_DummyHandler
-190 register INT_Int5aHandler(word) INT_DummyHandler
-191 register INT_Int5bHandler(word) INT_DummyHandler
+176 register INT_Int4cHandler(word) BUILTIN_DefaultIntHandler
+177 register INT_Int4dHandler(word) BUILTIN_DefaultIntHandler
+178 register INT_Int4eHandler(word) BUILTIN_DefaultIntHandler
+179 register INT_Int4fHandler(word) BUILTIN_DefaultIntHandler
+180 register INT_Int50Handler(word) BUILTIN_DefaultIntHandler
+181 register INT_Int51Handler(word) BUILTIN_DefaultIntHandler
+182 register INT_Int52Handler(word) BUILTIN_DefaultIntHandler
+183 register INT_Int53Handler(word) BUILTIN_DefaultIntHandler
+184 register INT_Int54Handler(word) BUILTIN_DefaultIntHandler
+185 register INT_Int55Handler(word) BUILTIN_DefaultIntHandler
+186 register INT_Int56Handler(word) BUILTIN_DefaultIntHandler
+187 register INT_Int57Handler(word) BUILTIN_DefaultIntHandler
+188 register INT_Int58Handler(word) BUILTIN_DefaultIntHandler
+189 register INT_Int59Handler(word) BUILTIN_DefaultIntHandler
+190 register INT_Int5aHandler(word) BUILTIN_DefaultIntHandler
+191 register INT_Int5bHandler(word) BUILTIN_DefaultIntHandler
 192 register INT_Int5cHandler(word) NetBIOSCall
-193 register INT_Int5dHandler(word) INT_DummyHandler
-194 register INT_Int5eHandler(word) INT_DummyHandler
-195 register INT_Int5fHandler(word) INT_DummyHandler
-196 register INT_Int60Handler(word) INT_DummyHandler
-197 register INT_Int61Handler(word) INT_DummyHandler
-198 register INT_Int62Handler(word) INT_DummyHandler
-199 register INT_Int63Handler(word) INT_DummyHandler
-200 register INT_Int64Handler(word) INT_DummyHandler
-201 register INT_Int65Handler(word) INT_DummyHandler
-202 register INT_Int66Handler(word) INT_DummyHandler
-203 register INT_Int67Handler(word) INT_DummyHandler
-204 register INT_Int68Handler(word) INT_DummyHandler
-205 register INT_Int69Handler(word) INT_DummyHandler
-206 register INT_Int6aHandler(word) INT_DummyHandler
-207 register INT_Int6bHandler(word) INT_DummyHandler
-208 register INT_Int6cHandler(word) INT_DummyHandler
-209 register INT_Int6dHandler(word) INT_DummyHandler
-210 register INT_Int6eHandler(word) INT_DummyHandler
-211 register INT_Int6fHandler(word) INT_DummyHandler
-212 register INT_Int70Handler(word) INT_DummyHandler
-213 register INT_Int71Handler(word) INT_DummyHandler
-214 register INT_Int72Handler(word) INT_DummyHandler
-215 register INT_Int73Handler(word) INT_DummyHandler
-216 register INT_Int74Handler(word) INT_DummyHandler
-217 register INT_Int75Handler(word) INT_DummyHandler
-218 register INT_Int76Handler(word) INT_DummyHandler
-219 register INT_Int77Handler(word) INT_DummyHandler
-220 register INT_Int78Handler(word) INT_DummyHandler
-221 register INT_Int79Handler(word) INT_DummyHandler
-222 register INT_Int7aHandler(word) INT_DummyHandler
-223 register INT_Int7bHandler(word) INT_DummyHandler
-224 register INT_Int7cHandler(word) INT_DummyHandler
-225 register INT_Int7dHandler(word) INT_DummyHandler
-226 register INT_Int7eHandler(word) INT_DummyHandler
-227 register INT_Int7fHandler(word) INT_DummyHandler
-228 register INT_Int80Handler(word) INT_DummyHandler
-229 register INT_Int81Handler(word) INT_DummyHandler
-230 register INT_Int82Handler(word) INT_DummyHandler
-231 register INT_Int83Handler(word) INT_DummyHandler
-232 register INT_Int84Handler(word) INT_DummyHandler
-233 register INT_Int85Handler(word) INT_DummyHandler
-234 register INT_Int86Handler(word) INT_DummyHandler
-235 register INT_Int87Handler(word) INT_DummyHandler
-236 register INT_Int88Handler(word) INT_DummyHandler
-237 register INT_Int89Handler(word) INT_DummyHandler
-238 register INT_Int8aHandler(word) INT_DummyHandler
-239 register INT_Int8bHandler(word) INT_DummyHandler
-240 register INT_Int8cHandler(word) INT_DummyHandler
-241 register INT_Int8dHandler(word) INT_DummyHandler
-242 register INT_Int8eHandler(word) INT_DummyHandler
-243 register INT_Int8fHandler(word) INT_DummyHandler
-244 register INT_Int90Handler(word) INT_DummyHandler
-245 register INT_Int91Handler(word) INT_DummyHandler
-246 register INT_Int92Handler(word) INT_DummyHandler
-247 register INT_Int93Handler(word) INT_DummyHandler
-248 register INT_Int94Handler(word) INT_DummyHandler
-249 register INT_Int95Handler(word) INT_DummyHandler
-250 register INT_Int96Handler(word) INT_DummyHandler
-251 register INT_Int97Handler(word) INT_DummyHandler
-252 register INT_Int98Handler(word) INT_DummyHandler
-253 register INT_Int99Handler(word) INT_DummyHandler
-254 register INT_Int9aHandler(word) INT_DummyHandler
-255 register INT_Int9bHandler(word) INT_DummyHandler
-256 register INT_Int9cHandler(word) INT_DummyHandler
-257 register INT_Int9dHandler(word) INT_DummyHandler
-258 register INT_Int9eHandler(word) INT_DummyHandler
-259 register INT_Int9fHandler(word) INT_DummyHandler
-260 register INT_Inta0Handler(word) INT_DummyHandler
-261 register INT_Inta1Handler(word) INT_DummyHandler
-262 register INT_Inta2Handler(word) INT_DummyHandler
-263 register INT_Inta3Handler(word) INT_DummyHandler
-264 register INT_Inta4Handler(word) INT_DummyHandler
-265 register INT_Inta5Handler(word) INT_DummyHandler
-266 register INT_Inta6Handler(word) INT_DummyHandler
-267 register INT_Inta7Handler(word) INT_DummyHandler
-268 register INT_Inta8Handler(word) INT_DummyHandler
-269 register INT_Inta9Handler(word) INT_DummyHandler
-270 register INT_IntaaHandler(word) INT_DummyHandler
-271 register INT_IntabHandler(word) INT_DummyHandler
-272 register INT_IntacHandler(word) INT_DummyHandler
-273 register INT_IntadHandler(word) INT_DummyHandler
-274 register INT_IntaeHandler(word) INT_DummyHandler
-275 register INT_IntafHandler(word) INT_DummyHandler
-276 register INT_Intb0Handler(word) INT_DummyHandler
-277 register INT_Intb1Handler(word) INT_DummyHandler
-278 register INT_Intb2Handler(word) INT_DummyHandler
-279 register INT_Intb3Handler(word) INT_DummyHandler
-280 register INT_Intb4Handler(word) INT_DummyHandler
-281 register INT_Intb5Handler(word) INT_DummyHandler
-282 register INT_Intb6Handler(word) INT_DummyHandler
-283 register INT_Intb7Handler(word) INT_DummyHandler
-284 register INT_Intb8Handler(word) INT_DummyHandler
-285 register INT_Intb9Handler(word) INT_DummyHandler
-286 register INT_IntbaHandler(word) INT_DummyHandler
-287 register INT_IntbbHandler(word) INT_DummyHandler
-288 register INT_IntbcHandler(word) INT_DummyHandler
-289 register INT_IntbdHandler(word) INT_DummyHandler
-290 register INT_IntbeHandler(word) INT_DummyHandler
-291 register INT_IntbfHandler(word) INT_DummyHandler
-292 register INT_Intc0Handler(word) INT_DummyHandler
-293 register INT_Intc1Handler(word) INT_DummyHandler
-294 register INT_Intc2Handler(word) INT_DummyHandler
-295 register INT_Intc3Handler(word) INT_DummyHandler
-296 register INT_Intc4Handler(word) INT_DummyHandler
-297 register INT_Intc5Handler(word) INT_DummyHandler
-298 register INT_Intc6Handler(word) INT_DummyHandler
-299 register INT_Intc7Handler(word) INT_DummyHandler
-300 register INT_Intc8Handler(word) INT_DummyHandler
-301 register INT_Intc9Handler(word) INT_DummyHandler
-302 register INT_IntcaHandler(word) INT_DummyHandler
-303 register INT_IntcbHandler(word) INT_DummyHandler
-304 register INT_IntccHandler(word) INT_DummyHandler
-305 register INT_IntcdHandler(word) INT_DummyHandler
-306 register INT_IntceHandler(word) INT_DummyHandler
-307 register INT_IntcfHandler(word) INT_DummyHandler
-308 register INT_Intd0Handler(word) INT_DummyHandler
-309 register INT_Intd1Handler(word) INT_DummyHandler
-310 register INT_Intd2Handler(word) INT_DummyHandler
-311 register INT_Intd3Handler(word) INT_DummyHandler
-312 register INT_Intd4Handler(word) INT_DummyHandler
-313 register INT_Intd5Handler(word) INT_DummyHandler
-314 register INT_Intd6Handler(word) INT_DummyHandler
-315 register INT_Intd7Handler(word) INT_DummyHandler
-316 register INT_Intd8Handler(word) INT_DummyHandler
-317 register INT_Intd9Handler(word) INT_DummyHandler
-318 register INT_IntdaHandler(word) INT_DummyHandler
-319 register INT_IntdbHandler(word) INT_DummyHandler
-320 register INT_IntdcHandler(word) INT_DummyHandler
-321 register INT_IntddHandler(word) INT_DummyHandler
-322 register INT_IntdeHandler(word) INT_DummyHandler
-323 register INT_IntdfHandler(word) INT_DummyHandler
-324 register INT_Inte0Handler(word) INT_DummyHandler
-325 register INT_Inte1Handler(word) INT_DummyHandler
-326 register INT_Inte2Handler(word) INT_DummyHandler
-327 register INT_Inte3Handler(word) INT_DummyHandler
-328 register INT_Inte4Handler(word) INT_DummyHandler
-329 register INT_Inte5Handler(word) INT_DummyHandler
-330 register INT_Inte6Handler(word) INT_DummyHandler
-331 register INT_Inte7Handler(word) INT_DummyHandler
-332 register INT_Inte8Handler(word) INT_DummyHandler
-333 register INT_Inte9Handler(word) INT_DummyHandler
-334 register INT_InteaHandler(word) INT_DummyHandler
-335 register INT_IntebHandler(word) INT_DummyHandler
-336 register INT_IntecHandler(word) INT_DummyHandler
-337 register INT_IntedHandler(word) INT_DummyHandler
-338 register INT_InteeHandler(word) INT_DummyHandler
-339 register INT_IntefHandler(word) INT_DummyHandler
-340 register INT_Intf0Handler(word) INT_DummyHandler
-341 register INT_Intf1Handler(word) INT_DummyHandler
-342 register INT_Intf2Handler(word) INT_DummyHandler
-343 register INT_Intf3Handler(word) INT_DummyHandler
-344 register INT_Intf4Handler(word) INT_DummyHandler
-345 register INT_Intf5Handler(word) INT_DummyHandler
-346 register INT_Intf6Handler(word) INT_DummyHandler
-347 register INT_Intf7Handler(word) INT_DummyHandler
-348 register INT_Intf8Handler(word) INT_DummyHandler
-349 register INT_Intf9Handler(word) INT_DummyHandler
-350 register INT_IntfaHandler(word) INT_DummyHandler
-351 register INT_IntfbHandler(word) INT_DummyHandler
-352 register INT_IntfcHandler(word) INT_DummyHandler
-353 register INT_IntfdHandler(word) INT_DummyHandler
-354 register INT_IntfeHandler(word) INT_DummyHandler
-355 register INT_IntffHandler(word) INT_DummyHandler
+193 register INT_Int5dHandler(word) BUILTIN_DefaultIntHandler
+194 register INT_Int5eHandler(word) BUILTIN_DefaultIntHandler
+195 register INT_Int5fHandler(word) BUILTIN_DefaultIntHandler
+196 register INT_Int60Handler(word) BUILTIN_DefaultIntHandler
+197 register INT_Int61Handler(word) BUILTIN_DefaultIntHandler
+198 register INT_Int62Handler(word) BUILTIN_DefaultIntHandler
+199 register INT_Int63Handler(word) BUILTIN_DefaultIntHandler
+200 register INT_Int64Handler(word) BUILTIN_DefaultIntHandler
+201 register INT_Int65Handler(word) BUILTIN_DefaultIntHandler
+202 register INT_Int66Handler(word) BUILTIN_DefaultIntHandler
+203 register INT_Int67Handler(word) BUILTIN_DefaultIntHandler
+204 register INT_Int68Handler(word) BUILTIN_DefaultIntHandler
+205 register INT_Int69Handler(word) BUILTIN_DefaultIntHandler
+206 register INT_Int6aHandler(word) BUILTIN_DefaultIntHandler
+207 register INT_Int6bHandler(word) BUILTIN_DefaultIntHandler
+208 register INT_Int6cHandler(word) BUILTIN_DefaultIntHandler
+209 register INT_Int6dHandler(word) BUILTIN_DefaultIntHandler
+210 register INT_Int6eHandler(word) BUILTIN_DefaultIntHandler
+211 register INT_Int6fHandler(word) BUILTIN_DefaultIntHandler
+212 register INT_Int70Handler(word) BUILTIN_DefaultIntHandler
+213 register INT_Int71Handler(word) BUILTIN_DefaultIntHandler
+214 register INT_Int72Handler(word) BUILTIN_DefaultIntHandler
+215 register INT_Int73Handler(word) BUILTIN_DefaultIntHandler
+216 register INT_Int74Handler(word) BUILTIN_DefaultIntHandler
+217 register INT_Int75Handler(word) BUILTIN_DefaultIntHandler
+218 register INT_Int76Handler(word) BUILTIN_DefaultIntHandler
+219 register INT_Int77Handler(word) BUILTIN_DefaultIntHandler
+220 register INT_Int78Handler(word) BUILTIN_DefaultIntHandler
+221 register INT_Int79Handler(word) BUILTIN_DefaultIntHandler
+222 register INT_Int7aHandler(word) BUILTIN_DefaultIntHandler
+223 register INT_Int7bHandler(word) BUILTIN_DefaultIntHandler
+224 register INT_Int7cHandler(word) BUILTIN_DefaultIntHandler
+225 register INT_Int7dHandler(word) BUILTIN_DefaultIntHandler
+226 register INT_Int7eHandler(word) BUILTIN_DefaultIntHandler
+227 register INT_Int7fHandler(word) BUILTIN_DefaultIntHandler
+228 register INT_Int80Handler(word) BUILTIN_DefaultIntHandler
+229 register INT_Int81Handler(word) BUILTIN_DefaultIntHandler
+230 register INT_Int82Handler(word) BUILTIN_DefaultIntHandler
+231 register INT_Int83Handler(word) BUILTIN_DefaultIntHandler
+232 register INT_Int84Handler(word) BUILTIN_DefaultIntHandler
+233 register INT_Int85Handler(word) BUILTIN_DefaultIntHandler
+234 register INT_Int86Handler(word) BUILTIN_DefaultIntHandler
+235 register INT_Int87Handler(word) BUILTIN_DefaultIntHandler
+236 register INT_Int88Handler(word) BUILTIN_DefaultIntHandler
+237 register INT_Int89Handler(word) BUILTIN_DefaultIntHandler
+238 register INT_Int8aHandler(word) BUILTIN_DefaultIntHandler
+239 register INT_Int8bHandler(word) BUILTIN_DefaultIntHandler
+240 register INT_Int8cHandler(word) BUILTIN_DefaultIntHandler
+241 register INT_Int8dHandler(word) BUILTIN_DefaultIntHandler
+242 register INT_Int8eHandler(word) BUILTIN_DefaultIntHandler
+243 register INT_Int8fHandler(word) BUILTIN_DefaultIntHandler
+244 register INT_Int90Handler(word) BUILTIN_DefaultIntHandler
+245 register INT_Int91Handler(word) BUILTIN_DefaultIntHandler
+246 register INT_Int92Handler(word) BUILTIN_DefaultIntHandler
+247 register INT_Int93Handler(word) BUILTIN_DefaultIntHandler
+248 register INT_Int94Handler(word) BUILTIN_DefaultIntHandler
+249 register INT_Int95Handler(word) BUILTIN_DefaultIntHandler
+250 register INT_Int96Handler(word) BUILTIN_DefaultIntHandler
+251 register INT_Int97Handler(word) BUILTIN_DefaultIntHandler
+252 register INT_Int98Handler(word) BUILTIN_DefaultIntHandler
+253 register INT_Int99Handler(word) BUILTIN_DefaultIntHandler
+254 register INT_Int9aHandler(word) BUILTIN_DefaultIntHandler
+255 register INT_Int9bHandler(word) BUILTIN_DefaultIntHandler
+256 register INT_Int9cHandler(word) BUILTIN_DefaultIntHandler
+257 register INT_Int9dHandler(word) BUILTIN_DefaultIntHandler
+258 register INT_Int9eHandler(word) BUILTIN_DefaultIntHandler
+259 register INT_Int9fHandler(word) BUILTIN_DefaultIntHandler
+260 register INT_Inta0Handler(word) BUILTIN_DefaultIntHandler
+261 register INT_Inta1Handler(word) BUILTIN_DefaultIntHandler
+262 register INT_Inta2Handler(word) BUILTIN_DefaultIntHandler
+263 register INT_Inta3Handler(word) BUILTIN_DefaultIntHandler
+264 register INT_Inta4Handler(word) BUILTIN_DefaultIntHandler
+265 register INT_Inta5Handler(word) BUILTIN_DefaultIntHandler
+266 register INT_Inta6Handler(word) BUILTIN_DefaultIntHandler
+267 register INT_Inta7Handler(word) BUILTIN_DefaultIntHandler
+268 register INT_Inta8Handler(word) BUILTIN_DefaultIntHandler
+269 register INT_Inta9Handler(word) BUILTIN_DefaultIntHandler
+270 register INT_IntaaHandler(word) BUILTIN_DefaultIntHandler
+271 register INT_IntabHandler(word) BUILTIN_DefaultIntHandler
+272 register INT_IntacHandler(word) BUILTIN_DefaultIntHandler
+273 register INT_IntadHandler(word) BUILTIN_DefaultIntHandler
+274 register INT_IntaeHandler(word) BUILTIN_DefaultIntHandler
+275 register INT_IntafHandler(word) BUILTIN_DefaultIntHandler
+276 register INT_Intb0Handler(word) BUILTIN_DefaultIntHandler
+277 register INT_Intb1Handler(word) BUILTIN_DefaultIntHandler
+278 register INT_Intb2Handler(word) BUILTIN_DefaultIntHandler
+279 register INT_Intb3Handler(word) BUILTIN_DefaultIntHandler
+280 register INT_Intb4Handler(word) BUILTIN_DefaultIntHandler
+281 register INT_Intb5Handler(word) BUILTIN_DefaultIntHandler
+282 register INT_Intb6Handler(word) BUILTIN_DefaultIntHandler
+283 register INT_Intb7Handler(word) BUILTIN_DefaultIntHandler
+284 register INT_Intb8Handler(word) BUILTIN_DefaultIntHandler
+285 register INT_Intb9Handler(word) BUILTIN_DefaultIntHandler
+286 register INT_IntbaHandler(word) BUILTIN_DefaultIntHandler
+287 register INT_IntbbHandler(word) BUILTIN_DefaultIntHandler
+288 register INT_IntbcHandler(word) BUILTIN_DefaultIntHandler
+289 register INT_IntbdHandler(word) BUILTIN_DefaultIntHandler
+290 register INT_IntbeHandler(word) BUILTIN_DefaultIntHandler
+291 register INT_IntbfHandler(word) BUILTIN_DefaultIntHandler
+292 register INT_Intc0Handler(word) BUILTIN_DefaultIntHandler
+293 register INT_Intc1Handler(word) BUILTIN_DefaultIntHandler
+294 register INT_Intc2Handler(word) BUILTIN_DefaultIntHandler
+295 register INT_Intc3Handler(word) BUILTIN_DefaultIntHandler
+296 register INT_Intc4Handler(word) BUILTIN_DefaultIntHandler
+297 register INT_Intc5Handler(word) BUILTIN_DefaultIntHandler
+298 register INT_Intc6Handler(word) BUILTIN_DefaultIntHandler
+299 register INT_Intc7Handler(word) BUILTIN_DefaultIntHandler
+300 register INT_Intc8Handler(word) BUILTIN_DefaultIntHandler
+301 register INT_Intc9Handler(word) BUILTIN_DefaultIntHandler
+302 register INT_IntcaHandler(word) BUILTIN_DefaultIntHandler
+303 register INT_IntcbHandler(word) BUILTIN_DefaultIntHandler
+304 register INT_IntccHandler(word) BUILTIN_DefaultIntHandler
+305 register INT_IntcdHandler(word) BUILTIN_DefaultIntHandler
+306 register INT_IntceHandler(word) BUILTIN_DefaultIntHandler
+307 register INT_IntcfHandler(word) BUILTIN_DefaultIntHandler
+308 register INT_Intd0Handler(word) BUILTIN_DefaultIntHandler
+309 register INT_Intd1Handler(word) BUILTIN_DefaultIntHandler
+310 register INT_Intd2Handler(word) BUILTIN_DefaultIntHandler
+311 register INT_Intd3Handler(word) BUILTIN_DefaultIntHandler
+312 register INT_Intd4Handler(word) BUILTIN_DefaultIntHandler
+313 register INT_Intd5Handler(word) BUILTIN_DefaultIntHandler
+314 register INT_Intd6Handler(word) BUILTIN_DefaultIntHandler
+315 register INT_Intd7Handler(word) BUILTIN_DefaultIntHandler
+316 register INT_Intd8Handler(word) BUILTIN_DefaultIntHandler
+317 register INT_Intd9Handler(word) BUILTIN_DefaultIntHandler
+318 register INT_IntdaHandler(word) BUILTIN_DefaultIntHandler
+319 register INT_IntdbHandler(word) BUILTIN_DefaultIntHandler
+320 register INT_IntdcHandler(word) BUILTIN_DefaultIntHandler
+321 register INT_IntddHandler(word) BUILTIN_DefaultIntHandler
+322 register INT_IntdeHandler(word) BUILTIN_DefaultIntHandler
+323 register INT_IntdfHandler(word) BUILTIN_DefaultIntHandler
+324 register INT_Inte0Handler(word) BUILTIN_DefaultIntHandler
+325 register INT_Inte1Handler(word) BUILTIN_DefaultIntHandler
+326 register INT_Inte2Handler(word) BUILTIN_DefaultIntHandler
+327 register INT_Inte3Handler(word) BUILTIN_DefaultIntHandler
+328 register INT_Inte4Handler(word) BUILTIN_DefaultIntHandler
+329 register INT_Inte5Handler(word) BUILTIN_DefaultIntHandler
+330 register INT_Inte6Handler(word) BUILTIN_DefaultIntHandler
+331 register INT_Inte7Handler(word) BUILTIN_DefaultIntHandler
+332 register INT_Inte8Handler(word) BUILTIN_DefaultIntHandler
+333 register INT_Inte9Handler(word) BUILTIN_DefaultIntHandler
+334 register INT_InteaHandler(word) BUILTIN_DefaultIntHandler
+335 register INT_IntebHandler(word) BUILTIN_DefaultIntHandler
+336 register INT_IntecHandler(word) BUILTIN_DefaultIntHandler
+337 register INT_IntedHandler(word) BUILTIN_DefaultIntHandler
+338 register INT_InteeHandler(word) BUILTIN_DefaultIntHandler
+339 register INT_IntefHandler(word) BUILTIN_DefaultIntHandler
+340 register INT_Intf0Handler(word) BUILTIN_DefaultIntHandler
+341 register INT_Intf1Handler(word) BUILTIN_DefaultIntHandler
+342 register INT_Intf2Handler(word) BUILTIN_DefaultIntHandler
+343 register INT_Intf3Handler(word) BUILTIN_DefaultIntHandler
+344 register INT_Intf4Handler(word) BUILTIN_DefaultIntHandler
+345 register INT_Intf5Handler(word) BUILTIN_DefaultIntHandler
+346 register INT_Intf6Handler(word) BUILTIN_DefaultIntHandler
+347 register INT_Intf7Handler(word) BUILTIN_DefaultIntHandler
+348 register INT_Intf8Handler(word) BUILTIN_DefaultIntHandler
+349 register INT_Intf9Handler(word) BUILTIN_DefaultIntHandler
+350 register INT_IntfaHandler(word) BUILTIN_DefaultIntHandler
+351 register INT_IntfbHandler(word) BUILTIN_DefaultIntHandler
+352 register INT_IntfcHandler(word) BUILTIN_DefaultIntHandler
+353 register INT_IntfdHandler(word) BUILTIN_DefaultIntHandler
+354 register INT_IntfeHandler(word) BUILTIN_DefaultIntHandler
+355 register INT_IntffHandler(word) BUILTIN_DefaultIntHandler
 
 # VxDs. The first Vxd is at 400
 #
diff --git a/include/bitmap.h b/include/bitmap.h
index a27edc3..b4a731e 100644
--- a/include/bitmap.h
+++ b/include/bitmap.h
@@ -9,6 +9,7 @@
 
 #include <X11/extensions/XShm.h>
 #include "gdi.h"
+#include "xmalloc.h"
 
 #ifdef PRELIMINARY_WING16_SUPPORT
 
diff --git a/include/commdlg.h b/include/commdlg.h
index db57549..e7a8eab 100644
--- a/include/commdlg.h
+++ b/include/commdlg.h
@@ -277,12 +277,12 @@
 
 BOOL  ChooseColor(LPCHOOSECOLOR lpChCol);
 DWORD CommDlgExtendedError(void);
-BOOL  FindText( SEGPTR find);
+HWND16 FindText( SEGPTR find);
 short GetFileTitle(LPCSTR lpFile, LPSTR lpTitle, UINT cbBuf);
 BOOL  GetOpenFileName(SEGPTR ofn);
 BOOL  GetSaveFileName(SEGPTR ofn);
 BOOL  PrintDlg( SEGPTR print);
-BOOL  ReplaceText( SEGPTR find);
+HWND16 ReplaceText( SEGPTR find);
 BOOL  ChooseFont(LPCHOOSEFONT lpChFont);
 
 LRESULT FileOpenDlgProc(HWND hWnd, UINT wMsg, WPARAM16 wParam, LPARAM lParam);
diff --git a/include/debug.h b/include/debug.h
index 8f2c028..14bc9d0 100644
--- a/include/debug.h
+++ b/include/debug.h
@@ -3,16 +3,6 @@
 #define stddeb stdout
 #define stdnimp stdout
 
-#ifdef DEBUG_RUNTIME
-#define api_assert(name,test) if (test) ; else \
-    { \
-        fprintf(stddeb,"API assertion failed for %s: %s\n", name, #test); \
-        abort(); \
-    }
-#else
-#define api_assert(name,test) ;
-#endif
-
 /* Do not remove this line or change anything below this line */
 
 #ifdef DEBUG_NONE_EXT
diff --git a/include/debugger.h b/include/debugger.h
index 306cb18..5a69215 100644
--- a/include/debugger.h
+++ b/include/debugger.h
@@ -7,9 +7,9 @@
 #ifndef __WINE_DEBUGGER_H
 #define __WINE_DEBUGGER_H
 
-#include "ldt.h"
-#include "registers.h"
-
+#include "winnt.h"
+#include "selectors.h"
+#include "sigcontext.h"
 #include "pe_image.h"
 
 #define STEP_FLAG 0x100 /* single step flag */
@@ -101,7 +101,7 @@
     EXEC_STEP_INSTR  /* Single-stepping an instruction */
 };
 
-extern SIGCONTEXT *DEBUG_context;  /* debugger/registers.c */
+extern CONTEXT DEBUG_context;  /* debugger/registers.c */
 extern unsigned int dbg_mode;
 
   /* debugger/break.c */
@@ -111,10 +111,9 @@
 extern void DEBUG_DelBreakpoint( int num );
 extern void DEBUG_EnableBreakpoint( int num, BOOL32 enable );
 extern void DEBUG_InfoBreakpoints(void);
-extern BOOL32 DEBUG_HandleTrap( SIGCONTEXT *context );
-extern BOOL32 DEBUG_ShouldContinue( SIGCONTEXT *context, enum exec_mode mode );
-extern void DEBUG_RestartExecution( SIGCONTEXT *context, enum exec_mode mode,
-                                    int instr_len );
+extern BOOL32 DEBUG_HandleTrap(void);
+extern BOOL32 DEBUG_ShouldContinue( enum exec_mode mode );
+extern void DEBUG_RestartExecution( enum exec_mode mode, int instr_len );
 
   /* debugger/db_disasm.c */
 extern void DEBUG_Disasm( DBG_ADDR *addr );
@@ -163,6 +162,8 @@
 extern int DEBUG_GetRegister( enum debug_regs reg );
 extern void DEBUG_InfoRegisters(void);
 extern BOOL32 DEBUG_ValidateRegisters(void);
+extern void DEBUG_SetSigContext( const SIGCONTEXT *sigcontext );
+extern void DEBUG_GetSigContext( SIGCONTEXT *sigcontext );
 
   /* debugger/stack.c */
 extern void DEBUG_InfoStack(void);
diff --git a/include/dialog.h b/include/dialog.h
index eb95f2f..b9cb5f4 100644
--- a/include/dialog.h
+++ b/include/dialog.h
@@ -38,5 +38,10 @@
 #pragma pack(4)
 
 extern BOOL32 DIALOG_Init(void);
+extern HWND32 DIALOG_CreateIndirect( HINSTANCE32 hInst, LPCSTR dlgTemplate,
+                                     BOOL32 win32Template, HWND32 owner,
+                                     DLGPROC16 dlgProc, LPARAM param,
+                                     WINDOWPROCTYPE procType );
+extern INT32 DIALOG_DoDialogBox( HWND32 hwnd, HWND32 owner );
 
 #endif  /* DIALOG_H */
diff --git a/include/directory.h b/include/directory.h
deleted file mode 100644
index c9c34a8..0000000
--- a/include/directory.h
+++ /dev/null
@@ -1,17 +0,0 @@
-/*
- * DOS directory handling declarations
- *
- * Copyright 1996 Alexandre Julliard
- */
-
-#ifndef __WINE_DIRECTORY_H
-#define __WINE_DIRECTORY_H
-
-extern int DIR_Init(void);
-extern UINT32 DIR_GetWindowsUnixDir( LPSTR path, UINT32 count );
-extern UINT32 DIR_GetSystemUnixDir( LPSTR path, UINT32 count );
-extern UINT32 DIR_GetTempUnixDir( LPSTR path, UINT32 count );
-extern UINT32 DIR_GetDosPath( INT32 element, LPSTR path, UINT32 count );
-extern UINT32 DIR_GetUnixPath( INT32 element, LPSTR path, UINT32 count );
-
-#endif  /* __WINE_DIRECTORY_H */
diff --git a/include/dos_fs.h b/include/dos_fs.h
index 4bb2b7f..ec7a717 100644
--- a/include/dos_fs.h
+++ b/include/dos_fs.h
@@ -8,21 +8,10 @@
 #define __WINE_DOS_FS_H
 
 #include <time.h>
-#include "wintypes.h"
+#include "windows.h"
 
-#define MAX_FILENAME_LEN   256
 #define MAX_PATHNAME_LEN   1024
 
-typedef struct
-{
-    char   name[12];                    /* File name in FCB format */
-    char   unixname[MAX_FILENAME_LEN];  /* Unix file name */
-    DWORD  size;                        /* File size in bytes */
-    WORD   date;                        /* File date in DOS format */
-    WORD   time;                        /* File time in DOS format */
-    BYTE   attr;                        /* File DOS attributes */
-} DOS_DIRENT;
-
 #define IS_END_OF_NAME(ch)  (!(ch) || ((ch) == '/') || ((ch) == '\\'))
 
 extern void DOSFS_ToDosDateTime( time_t unixtime, WORD *pDate, WORD *pTime );
@@ -30,17 +19,16 @@
 extern const char *DOSFS_ToDosFCBFormat( const char *name );
 extern const char *DOSFS_ToDosDTAFormat( const char *name );
 extern const char *DOSFS_IsDevice( const char *name );
+extern BOOL32 DOSFS_FindUnixName( const char *path, const char *name,
+                                  char *buffer, int maxlen,
+                                  UINT32 drive_flags );
 extern const char * DOSFS_GetUnixFileName( const char * name, int check_last );
 extern const char * DOSFS_GetDosTrueName( const char *name, int unix_format );
 extern int DOSFS_GetDosFileName( const char *name, char *buffer, int len );
-extern time_t DOSFS_FileTimeToUnixTime(LPFILETIME ft);
+extern time_t DOSFS_FileTimeToUnixTime( const FILETIME *ft );
 extern void DOSFS_UnixTimeToFileTime(time_t unixtime,LPFILETIME ft);
 extern int DOSFS_FindNext( const char *path, const char *short_mask,
                            const char *long_mask, int drive, BYTE attr,
-                           int skip, DOS_DIRENT *entry );
-
-
-extern int DOS_GetFreeSpace(int drive, long *size, long *available);
-extern char *WineIniFileName(void);
+                           int skip, WIN32_FIND_DATA32A *entry );
 
 #endif /* __WINE_DOS_FS_H */
diff --git a/include/except.h b/include/except.h
index 0fbd40e..ff68c39 100644
--- a/include/except.h
+++ b/include/except.h
@@ -6,8 +6,7 @@
 #ifndef __WINE_EXCEPT_H
 #define __WINE_EXCEPT_H
 
-#include "wintypes.h"
-#include "registers.h"
+#include "winnt.h"
 /*
  * exception codes
  */
diff --git a/include/file.h b/include/file.h
index 048383a..4856df6 100644
--- a/include/file.h
+++ b/include/file.h
@@ -8,21 +8,28 @@
 #define __WINE_FILE_H
 
 #include "windows.h"
+#include "handle32.h"
 
+/* files/file.c */
+extern void FILE_Destroy( K32OBJ *ptr );
 extern void FILE_SetDosError(void);
-extern void FILE_CloseAllFiles( HANDLE16 hPDB );
-extern HFILE FILE_DupUnixHandle( int fd );
-extern int FILE_Stat( LPCSTR unixName, BYTE *pattr, DWORD *psize,
-                      WORD *pdate, WORD *ptime );
-extern int FILE_GetDateTime( HFILE hFile, WORD *pdate, WORD *ptime,
-                             BOOL32 refresh );
-extern int FILE_SetDateTime( HFILE hFile, WORD date, WORD time );
-extern int FILE_Fstat( HFILE hFile, BYTE *pattr, DWORD *psize,
-                       WORD *pdate, WORD *ptime );
-extern HFILE FILE_Dup( HFILE hFile );
-extern HFILE FILE_Dup2( HFILE hFile1, HFILE hFile2 );
-extern HFILE FILE_Open( LPCSTR path, INT32 mode );
-extern BOOL32 FILE_SetFileType( HFILE hFile, DWORD type );
-extern HFILE _lcreat_uniq( LPCSTR path, INT32 attr );
+extern HFILE32 FILE_DupUnixHandle( int fd );
+extern BOOL32 FILE_Stat( LPCSTR unixName, BY_HANDLE_FILE_INFORMATION *info );
+extern HFILE32 FILE_Dup( HFILE32 hFile );
+extern HFILE32 FILE_Dup2( HFILE32 hFile1, HFILE32 hFile2 );
+extern HFILE32 FILE_Open( LPCSTR path, INT32 mode );
+extern BOOL32 FILE_SetFileType( HFILE32 hFile, DWORD type );
+extern HFILE32 _lcreat_uniq( LPCSTR path, INT32 attr );
+
+/* files/directory.c */
+extern int DIR_Init(void);
+extern UINT32 DIR_GetWindowsUnixDir( LPSTR path, UINT32 count );
+extern UINT32 DIR_GetSystemUnixDir( LPSTR path, UINT32 count );
+extern UINT32 DIR_GetTempUnixDir( LPSTR path, UINT32 count );
+extern UINT32 DIR_GetDosPath( INT32 element, LPSTR path, UINT32 count );
+extern UINT32 DIR_GetUnixPath( INT32 element, LPSTR path, UINT32 count );
+extern DWORD DIR_SearchPath( LPCSTR path, LPCSTR name, LPCSTR ext,
+                             DWORD buflen, LPSTR buffer, LPSTR *lastpart,
+                             BOOL32 win32 );
 
 #endif  /* __WINE_FILE_H */
diff --git a/include/handle32.h b/include/handle32.h
index 3ad80e1..a589091 100644
--- a/include/handle32.h
+++ b/include/handle32.h
@@ -1,9 +1,49 @@
+/*
+ * KERNEL32 objects
+ *
+ * Copyright 1996 Alexandre Julliard
+ */
+
 #ifndef __WINE_HANDLE32_H
 #define __WINE_HANDLE32_H
 
-#include <stdlib.h>
 #include "wintypes.h"
 
+/* Object types */
+typedef enum
+{
+    K32OBJ_UNKNOWN = 0,
+    K32OBJ_SEMAPHORE,
+    K32OBJ_EVENT,
+    K32OBJ_MUTEX,
+    K32OBJ_CRITICAL_SECTION,
+    K32OBJ_PROCESS,
+    K32OBJ_THREAD,
+    K32OBJ_FILE,
+    K32OBJ_CHANGE,
+    K32OBJ_CONSOLE,
+    K32OBJ_SCREEN_BUFFER,
+    K32OBJ_MEM_MAPPED_FILE,
+    K32OBJ_SERIAL,
+    K32OBJ_DEVICE_IOCTL,
+    K32OBJ_PIPE,
+    K32OBJ_MAILSLOT,
+    K32OBJ_TOOLHELP_SNAPSHOT,
+    K32OBJ_SOCKET,
+    K32OBJ_NBOBJECTS
+} K32OBJ_TYPE;
+
+/* Kernel object */
+typedef struct
+{
+    K32OBJ_TYPE   type;
+    DWORD         refcount;
+} K32OBJ;
+
+extern void K32OBJ_IncCount( K32OBJ *ptr );
+extern void K32OBJ_DecCount( K32OBJ *ptr );
+
+
 /* The _*_OBJECT structures contain information needed about each
  * particular type of handle.  This information is a combination of
  * equivalent UNIX-style handles/descriptors and general information
@@ -17,63 +57,6 @@
     unsigned long       magic;
 } KERNEL_OBJECT;
 
-typedef struct {
-    KERNEL_OBJECT       common;
-    unsigned long       thread_id;
-    unsigned long       process_id;
-} THREAD_OBJECT;
-
-typedef struct {
-    KERNEL_OBJECT       common;
-    unsigned long       process_id;
-    unsigned long       main_thread_id;
-} PROCESS_OBJECT;
-
-typedef struct {
-    KERNEL_OBJECT	common;
-    HFILE		hfile;
-    int			prot;
-    unsigned long	size;
-} FILEMAP_OBJECT;
-
-typedef struct {
-    KERNEL_OBJECT       common;
-} SEMAPHORE_OBJECT;
-
-typedef struct {
-    KERNEL_OBJECT       common;
-} EVENT_OBJECT;
-
-/* Should this even be here?
- */
-typedef struct {
-    KERNEL_OBJECT       common;
-} REGKEY_OBJECT;
-
-typedef struct _VRANGE_OBJECT{
-	KERNEL_OBJECT		common;
-	DWORD				start;
-	DWORD				size;
-	struct _VRANGE_OBJECT *next;
-} VRANGE_OBJECT;
-
-struct _HEAPITEM_OBJECT;
-typedef struct{
-	KERNEL_OBJECT		common;
-	LPVOID	start;
-	DWORD	size;
-	DWORD	maximum;
-	DWORD	flags;
-	struct _HEAPITEM_OBJECT *first,*last;
-} HEAP_OBJECT;
-
-typedef struct _HEAPITEM_OBJECT{
-	KERNEL_OBJECT	common;
-	HEAP_OBJECT	*heap;
-	DWORD size;		/* size including header */
-	struct _HEAPITEM_OBJECT *next,*prev;
-} HEAPITEM_OBJECT;
-
 
 /* Object number definitions.  These numbers are used to
  * validate the kernel object by comparison against the
@@ -101,8 +84,4 @@
 #define CreateKernelObject(size) (malloc(size))
 #define ReleaseKernelObject(ptr) (free(ptr))
 
-/* Prototypes for the Close*Handle functions
- */
-int CloseFileHandle(HFILE hFile);
-
 #endif /* __WINE_HANDLE32_H */
diff --git a/include/heap.h b/include/heap.h
index 5cdfdeb..8459eba 100644
--- a/include/heap.h
+++ b/include/heap.h
@@ -15,6 +15,7 @@
 
 extern int HEAP_IsInsideHeap( HANDLE32 heap, DWORD flags, LPCVOID ptr );
 extern SEGPTR HEAP_GetSegptr( HANDLE32 heap, DWORD flags, LPCVOID ptr );
+extern LPVOID HEAP_xalloc( HANDLE32 heap, DWORD flags, DWORD size );
 extern LPSTR HEAP_strdupA( HANDLE32 heap, DWORD flags, LPCSTR str );
 extern LPWSTR HEAP_strdupW( HANDLE32 heap, DWORD flags, LPCWSTR str );
 extern LPWSTR HEAP_strdupAtoW( HANDLE32 heap, DWORD flags, LPCSTR str );
diff --git a/include/menu.h b/include/menu.h
index bdb3b12..4cd9318 100644
--- a/include/menu.h
+++ b/include/menu.h
@@ -10,8 +10,8 @@
 extern void MENU_InitSysMenuPopup(HMENU16 hmenu, DWORD style, DWORD clsStyle);
 extern UINT MENU_GetMenuBarHeight( HWND hwnd, UINT menubarWidth,
 				   int orgX, int orgY );
-extern void MENU_TrackMouseMenuBar( HWND hwnd, POINT16 pt );
-extern void MENU_TrackKbdMenuBar( WND*, UINT wParam, INT vkey);
+extern void MENU_TrackMouseMenuBar( WND* , INT16 ht, POINT16 pt );
+extern void MENU_TrackKbdMenuBar( WND*, UINT16 wParam, INT16 vkey);
 extern UINT MENU_DrawMenuBar( HDC32 hDC, LPRECT16 lprect,
 			      HWND hwnd, BOOL suppress_draw );
 extern LRESULT PopupMenuWndProc( HWND hwnd, UINT message,
diff --git a/include/message.h b/include/message.h
index f51efd2..8a59d79 100644
--- a/include/message.h
+++ b/include/message.h
@@ -33,5 +33,7 @@
 extern void EVENT_RegisterWindow( WND *pWnd );
 extern void EVENT_DestroyWindow( WND *pWnd );
 extern void EVENT_DummyMotionNotify(void);
+extern HWND32 EVENT_Capture( HWND32, INT16 );
+extern INT16 EVENT_GetCaptureInfo(void);
 
 #endif  /* __WINE_MESSAGE_H */
diff --git a/include/miscemu.h b/include/miscemu.h
index c876e60..bacc10e 100644
--- a/include/miscemu.h
+++ b/include/miscemu.h
@@ -8,38 +8,35 @@
 #define __WINE_MISCEMU_H
 
 #include <stdio.h>
-#include "wintypes.h"
-#include "registers.h"
+#include "winnt.h"
 
   /* miscemu/dosmem.c */
 extern BOOL32 DOSMEM_Init(void);
 extern void DOSMEM_Tick(void);
 extern void DOSMEM_FillBiosSegment(void);
-extern HANDLE16 DOSMEM_BiosSeg;
 extern void DOSMEM_InitMemoryHandling();
 extern LPVOID DOSMEM_RealMode2Linear(DWORD);
 extern WORD DOSMEM_AllocSelector(WORD);
+extern HANDLE16 DOSMEM_BiosSeg;
+extern char *DOSMEM_dosmem;
 extern DWORD DOSMEM_CollateTable;
-extern void DOSMEM_InitCollateTable();
 
-  /* miscemu/instr.c */
-extern BOOL32 INSTR_EmulateInstruction( SIGCONTEXT *context );
-
-  /* miscemu/interrupts.c */
+/* miscemu/interrupts.c */
 extern BOOL32 INT_Init(void);
+
+/* msdos/interrupts.c */
 extern FARPROC16 INT_GetHandler( BYTE intnum );
 extern void INT_SetHandler( BYTE intnum, FARPROC16 handler );
 
-  /* miscemu/int1a.c */
+/* msdos/ioports.c */
+extern DWORD IO_inport( int port, int count );
+extern void IO_outport( int port, int count, DWORD value );
+
+/* msdos/int1a.c */
 extern DWORD INT1A_GetTicksSinceMidnight(void);
 
-  /* miscemu/int21.c */
-extern BOOL32 INT21_Init(void);
-
-  /* miscemu/ioports.c */
-extern DWORD inport( int port, int count );
-extern void outport( int port, int count, DWORD value );
-
+/* misc/cpu.c */
+extern int runtime_cpu(void);
 
 #define INT_BARF(context,num) \
     fprintf( stderr, "int%x: unknown/not implemented parameters:\n" \
@@ -47,6 +44,6 @@
                      "SI %04x, DI %04x, DS %04x, ES %04x\n", \
              (num), (num), AX_reg(context), BX_reg(context), CX_reg(context), \
              DX_reg(context), SI_reg(context), DI_reg(context), \
-             DS_reg(context), ES_reg(context) )
+             (WORD)DS_reg(context), (WORD)ES_reg(context) )
 
 #endif /* __WINE_MISCEMU_H */
diff --git a/include/msdos.h b/include/msdos.h
index 96a8732..355aed7 100644
--- a/include/msdos.h
+++ b/include/msdos.h
@@ -84,7 +84,8 @@
 extern BYTE DOS_ErrorClass, DOS_ErrorAction, DOS_ErrorLocus;
 
 #define DOS_ERROR(err,class,action,locus) \
-    ( DOS_ErrorClass = (class), DOS_ErrorAction = (action), \
+    ( SetLastError(err), \
+      DOS_ErrorClass = (class), DOS_ErrorAction = (action), \
       DOS_ErrorLocus = (locus), DOS_ExtendedError = (err) )
 
 /* Error codes */
diff --git a/include/process.h b/include/process.h
new file mode 100644
index 0000000..ca5670c
--- /dev/null
+++ b/include/process.h
@@ -0,0 +1,105 @@
+/*
+ * Process definitions
+ *
+ * Copyright 1996 Alexandre Julliard
+ */
+
+#ifndef __WINE_PROCESS_H
+#define __WINE_PROCESS_H
+
+#include "windows.h"
+#include "winbase.h"
+#include "handle32.h"
+
+/* Process handle entry */
+typedef struct
+{
+    DWORD    flags;   /* Handle flags */
+    K32OBJ  *ptr;     /* Object ptr */
+} HANDLE_ENTRY;
+
+/* Process handle table */
+typedef struct
+{
+    DWORD         count;
+    HANDLE_ENTRY  entries[1];
+} HANDLE_TABLE;
+
+/* Win32 process environment database */
+typedef struct
+{
+    LPSTR           environ;          /* 00 Process environment strings */
+    DWORD           unknown1;         /* 04 Unknown */
+    LPSTR           cmd_line;         /* 08 Command line */
+    LPSTR           cur_dir;          /* 0c Current directory */
+    STARTUPINFO32A *startup_info;     /* 10 Startup information */
+    HANDLE32        hStdin;            /* 14 Handle for standard input */
+    HANDLE32        hStdout;           /* 18 Handle for standard output */
+    HANDLE32        hStderr;           /* 1c Handle for standard error */
+    DWORD           unknown2;         /* 20 Unknown */
+    DWORD           inherit_console;  /* 24 Inherit console flag */
+    DWORD           break_type;       /* 28 Console events flag */
+    K32OBJ         *break_sem;        /* 2c SetConsoleCtrlHandler semaphore */
+    K32OBJ         *break_event;      /* 30 SetConsoleCtrlHandler event */
+    K32OBJ         *break_thread;     /* 34 SetConsoleCtrlHandler thread */
+    void           *break_handlers;   /* 38 List of console handlers */
+} ENVDB;
+
+/* Win32 process database */
+typedef struct _PDB32
+{
+    K32OBJ           header;           /* 00 Kernel object header */
+    DWORD            unknown1;         /* 08 Unknown */
+    K32OBJ          *event;            /* 0c Pointer to an event object */
+    DWORD            exit_code;        /* 10 Process exit code */
+    DWORD            unknown2;         /* 14 Unknown */
+    HANDLE32         heap;             /* 18 Default process heap */
+    HANDLE32         mem_context;      /* 1c Process memory context */
+    DWORD            flags;            /* 20 Flags */
+    void            *pdb16;            /* 24 DOS PSP */
+    WORD             PSP_sel;          /* 28 Selector to DOS PSP */
+    WORD             module;           /* 2a IMTE for the process module */
+    WORD             threads;          /* 2c Number of threads */
+    WORD             running_threads;  /* 2e Number of running threads */
+    WORD             unknown3;         /* 30 Unknown */
+    WORD             ring0_threads;    /* 32 Number of ring 0 threads */
+    HANDLE32         system_heap;      /* 34 System heap to allocate handles */
+    HTASK32          task;             /* 38 Win16 task */
+    void            *mem_map_files;    /* 3c Pointer to mem-mapped files */
+    ENVDB           *env_DB;           /* 40 Environment database */
+    HANDLE_TABLE    *handle_table;     /* 44 Handle table */
+    struct _PDB32   *parent;           /* 48 Parent process */
+    void            *modref_list;      /* 4c MODREF list */
+    void            *thread_list;      /* 50 List of threads */
+    void            *debuggee_CB;      /* 54 Debuggee context block */
+    void            *local_heap_free;  /* 58 Head of local heap free list */
+    DWORD            unknown4;         /* 5c Unknown */
+    CRITICAL_SECTION crit_section;     /* 60 Critical section */
+    DWORD            unknown5[3];      /* 78 Unknown */
+    K32OBJ          *console;          /* 84 Console */
+    DWORD            tls_bits[2];      /* 88 TLS in-use bits */
+    DWORD            process_dword;    /* 90 Unknown */
+    struct _PDB32   *group;            /* 94 Process group */
+    void            *exe_modref;       /* 98 MODREF for the process EXE */
+    void            *top_exc_filter;   /* 9c Top exception filter */
+    DWORD            priority;         /* a0 Priority level */
+    HANDLE32         heap_list;        /* a4 Head of process heap list */
+    void            *heap_handles;     /* a8 Head of heap handles list */
+    DWORD            unknown6;         /* ac Unknown */
+    K32OBJ          *console_provider; /* b0 Console provider (??) */
+    WORD             env_selector;     /* b4 Selector to process environment */
+    WORD             error_mode;       /* b6 Error mode */
+    K32OBJ          *load_done_evt;    /* b8 Event for process loading done */
+    DWORD            unknown7;         /* bc Unknown */
+} PDB32;
+
+extern HANDLE32 PROCESS_AllocHandle( K32OBJ *ptr, DWORD flags);
+extern K32OBJ *PROCESS_GetObjPtr( HANDLE32 handle, K32OBJ_TYPE type );
+extern BOOL32 PROCESS_SetObjPtr( HANDLE32 handle, K32OBJ *ptr, DWORD flags );
+
+extern PDB32 *PROCESS_Create(void);
+extern void PROCESS_Destroy( K32OBJ *ptr );
+
+extern PDB32 *pCurrentProcess;
+
+#endif  /* __WINE_PROCESS_H */
diff --git a/include/registers.h b/include/registers.h
deleted file mode 100644
index 6c93955..0000000
--- a/include/registers.h
+++ /dev/null
@@ -1,235 +0,0 @@
-/*
- * Register definitions
- *
- * Copyright 1995 Alexandre Julliard
- */
-
-#ifndef __WINE_REGISTERS_H
-#define __WINE_REGISTERS_H
-
-#include "wintypes.h"
-
-/* The Win32 register context */
-
-#define CONTEXT_i386      0x00010000
-#define CONTEXT_i486      CONTEXT_i386
-#define CONTEXT_CONTROL   (CONTEXT_i386 | 0x0001) /* SS:SP, CS:IP, FLAGS, BP */
-#define CONTEXT_INTEGER   (CONTEXT_i386 | 0x0002) /* AX, BX, CX, DX, SI, DI */
-#define CONTEXT_SEGMENTS  (CONTEXT_i386 | 0x0004) /* DS, ES, FS, GS */
-#define CONTEXT_FLOATING_POINT  (CONTEXT_i386 | 0x0008L) /* 387 state */
-#define CONTEXT_DEBUG_REGISTERS (CONTEXT_i386 | 0x0010L) /* DB 0-3,6,7 */
-#define CONTEXT_FULL (CONTEXT_CONTROL | CONTEXT_INTEGER | CONTEXT_SEGMENTS)
-
-#define SIZE_OF_80387_REGISTERS      80
-
-typedef struct
-{
-    DWORD   ControlWord;
-    DWORD   StatusWord;
-    DWORD   TagWord;    
-    DWORD   ErrorOffset;
-    DWORD   ErrorSelector;
-    DWORD   DataOffset;
-    DWORD   DataSelector;    
-    BYTE    RegisterArea[SIZE_OF_80387_REGISTERS];
-    DWORD   Cr0NpxState;
-} FLOATING_SAVE_AREA;
-
-typedef struct
-{
-    DWORD   ContextFlags;
-
-    /* These are selected by CONTEXT_DEBUG_REGISTERS */
-    DWORD   Dr0;
-    DWORD   Dr1;
-    DWORD   Dr2;
-    DWORD   Dr3;
-    DWORD   Dr6;
-    DWORD   Dr7;
-
-    /* These are selected by CONTEXT_FLOATING_POINT */
-    FLOATING_SAVE_AREA FloatSave;
-
-    /* These are selected by CONTEXT_SEGMENTS */
-    DWORD   SegGs;
-    DWORD   SegFs;
-    DWORD   SegEs;
-    DWORD   SegDs;    
-
-    /* These are selected by CONTEXT_INTEGER */
-    DWORD   Edi;
-    DWORD   Esi;
-    DWORD   Ebx;
-    DWORD   Edx;    
-    DWORD   Ecx;
-    DWORD   Eax;
-
-    /* These are selected by CONTEXT_CONTROL */
-    DWORD   Ebp;    
-    DWORD   Eip;
-    DWORD   SegCs;
-    DWORD   EFlags;
-    DWORD   Esp;
-    DWORD   SegSs;
-} CONTEXT, *PCONTEXT;
-
-#ifndef WINELIB
-
-#ifdef i386
-extern int runtime_cpu (void);
-#else
-static inline int runtime_cpu(void) { return 3; }
-#endif
-
-#ifdef linux
-typedef struct
-{
-    unsigned short sc_gs, __gsh;
-    unsigned short sc_fs, __fsh;
-    unsigned short sc_es, __esh;
-    unsigned short sc_ds, __dsh;
-    unsigned long sc_edi;
-    unsigned long sc_esi;
-    unsigned long sc_ebp;
-    unsigned long sc_esp;
-    unsigned long sc_ebx;
-    unsigned long sc_edx;
-    unsigned long sc_ecx;
-    unsigned long sc_eax;
-    unsigned long sc_trapno;
-    unsigned long sc_err;
-    unsigned long sc_eip;
-    unsigned short sc_cs, __csh;
-    unsigned long sc_eflags;
-    unsigned long esp_at_signal;
-    unsigned short sc_ss, __ssh;
-    unsigned long i387;
-    unsigned long oldmask;
-    unsigned long cr2;
-} SIGCONTEXT;
-#define WINE_DATA_SELECTOR 0x2b
-#define WINE_CODE_SELECTOR 0x23
-#endif  /* linux */
-
-#ifdef __NetBSD__
-#include <signal.h>
-typedef struct sigcontext SIGCONTEXT;
-#define WINE_DATA_SELECTOR 0x1f
-#define WINE_CODE_SELECTOR 0x17
-#endif  /* NetBSD */
-
-#if defined(__svr4__) || defined(_SCO_DS)
-#include <signal.h>
-#ifdef _SCO_DS
-#include <sys/regset.h>
-#endif
-#include <sys/ucontext.h>
-typedef struct ucontext SIGCONTEXT;
-#define WINE_DATA_SELECTOR 0x1f
-#define WINE_CODE_SELECTOR 0x17
-#endif  /* svr4 || SCO_DS */
-
-#ifdef __FreeBSD__
-#include <signal.h>
-typedef struct sigcontext SIGCONTEXT;
-#define WINE_DATA_SELECTOR 0x27
-#define WINE_CODE_SELECTOR 0x1f
-#endif  /* FreeBSD */
-
-#if !defined(__svr4__) && !defined(_SCO_DS)
-
-#define EAX_reg(context)     ((context)->sc_eax)
-#define EBX_reg(context)     ((context)->sc_ebx)
-#define ECX_reg(context)     ((context)->sc_ecx)
-#define EDX_reg(context)     ((context)->sc_edx)
-#define ESI_reg(context)     ((context)->sc_esi)
-#define EDI_reg(context)     ((context)->sc_edi)
-#define EBP_reg(context)     ((context)->sc_ebp)
-                            
-#define CS_reg(context)      ((context)->sc_cs)
-#define DS_reg(context)      ((context)->sc_ds)
-#define ES_reg(context)      ((context)->sc_es)
-#define SS_reg(context)      ((context)->sc_ss)
-                            
-#ifdef linux
-/* fs and gs are not supported on *BSD. Hopefully we won't need them. */
-#define FS_reg(context)      ((context)->sc_fs)
-#define GS_reg(context)      ((context)->sc_gs)
-#endif
-                            
-#ifndef __FreeBSD__         
-#define EFL_reg(context)     ((context)->sc_eflags)
-#else                       
-#define EFL_reg(context)     ((context)->sc_efl)
-#endif                      
-                            
-#define EIP_reg(context)     ((context)->sc_eip)
-#define ESP_reg(context)     ((context)->sc_esp)
-                            
-#else  /* __svr4__ || _SCO_DS */
-
-#ifdef _SCO_DS
-#define gregs regs
-#endif
-
-#define EAX_reg(context)     ((context)->uc_mcontext.gregs[EAX])
-#define EBX_reg(context)     ((context)->uc_mcontext.gregs[EBX])
-#define ECX_reg(context)     ((context)->uc_mcontext.gregs[ECX])
-#define EDX_reg(context)     ((context)->uc_mcontext.gregs[EDX])
-#define ESI_reg(context)     ((context)->uc_mcontext.gregs[ESI])
-#define EDI_reg(context)     ((context)->uc_mcontext.gregs[EDI])
-#define EBP_reg(context)     ((context)->uc_mcontext.gregs[EBP])
-                            
-#define CS_reg(context)      ((context)->uc_mcontext.gregs[CS])
-#define DS_reg(context)      ((context)->uc_mcontext.gregs[DS])
-#define ES_reg(context)      ((context)->uc_mcontext.gregs[ES])
-#define SS_reg(context)      ((context)->uc_mcontext.gregs[SS])
-                            
-#define FS_reg(context)      ((context)->uc_mcontext.gregs[FS])
-#define GS_reg(context)      ((context)->uc_mcontext.gregs[GS])
-
-#define EFL_reg(context)     ((context)->uc_mcontext.gregs[EFL])
-                            
-#define EIP_reg(context)     ((context)->uc_mcontext.gregs[EIP])
-#ifdef R_ESP
-#define ESP_reg(context)     ((context)->uc_mcontext.gregs[R_ESP])
-#else
-#define ESP_reg(context)     ((context)->uc_mcontext.gregs[ESP])
-#endif
-                            
-#endif  /* __svr4__ || _SCO_DS */
-
-#define AX_reg(context)      (*(WORD*)&EAX_reg(context))
-#define BX_reg(context)      (*(WORD*)&EBX_reg(context))
-#define CX_reg(context)      (*(WORD*)&ECX_reg(context))
-#define DX_reg(context)      (*(WORD*)&EDX_reg(context))
-#define SI_reg(context)      (*(WORD*)&ESI_reg(context))
-#define DI_reg(context)      (*(WORD*)&EDI_reg(context))
-#define BP_reg(context)      (*(WORD*)&EBP_reg(context))
-
-#define AL_reg(context)      (*(BYTE*)&EAX_reg(context))
-#define AH_reg(context)      (*((BYTE*)&EAX_reg(context)+1))
-#define BL_reg(context)      (*(BYTE*)&EBX_reg(context))
-#define BH_reg(context)      (*((BYTE*)&EBX_reg(context)+1))
-#define CL_reg(context)      (*(BYTE*)&ECX_reg(context))
-#define CH_reg(context)      (*((BYTE*)&ECX_reg(context)+1))
-#define DL_reg(context)      (*(BYTE*)&EDX_reg(context))
-#define DH_reg(context)      (*((BYTE*)&EDX_reg(context)+1))
-                            
-#define IP_reg(context)      (*(WORD*)&EIP_reg(context))
-#define SP_reg(context)      (*(WORD*)&ESP_reg(context))
-                            
-#define FL_reg(context)      (*(WORD*)&EFL_reg(context))
-
-#define SET_CFLAG(context)   (EFL_reg(context) |= 0x0001)
-#define RESET_CFLAG(context) (EFL_reg(context) &= 0xfffffffe)
-
-#else  /* ifndef WINELIB */
-
-typedef void SIGCONTEXT;
-#define WINE_DATA_SELECTOR 0x00
-#define WINE_CODE_SELECTOR 0x00
-
-#endif  /* ifndef WINELIB */
-
-#endif /* __WINE_REGISTERS_H */
diff --git a/include/resource.h b/include/resource.h
index 2540faf..0898fed 100644
--- a/include/resource.h
+++ b/include/resource.h
@@ -54,5 +54,6 @@
 
 extern HGLOBAL16 SYSRES_LoadResource( SYSTEM_RESOURCE id );
 extern void SYSRES_FreeResource( HGLOBAL16 handle );
+extern LPCVOID SYSRES_GetResPtr( SYSTEM_RESOURCE id );
 
 #endif /* __WINE_RESOURCE_H */
diff --git a/include/selectors.h b/include/selectors.h
index 66495c7..b8e1196 100644
--- a/include/selectors.h
+++ b/include/selectors.h
@@ -18,4 +18,33 @@
                                    BOOL32 readonly );
 extern void SELECTOR_FreeBlock( WORD sel, WORD count );
 
+#ifndef WINELIB
+
+#ifdef linux
+#define WINE_DATA_SELECTOR 0x2b
+#define WINE_CODE_SELECTOR 0x23
+#endif  /* linux */
+
+#ifdef __NetBSD__
+#define WINE_DATA_SELECTOR 0x1f
+#define WINE_CODE_SELECTOR 0x17
+#endif  /* NetBSD */
+
+#ifdef __FreeBSD__
+#define WINE_DATA_SELECTOR 0x27
+#define WINE_CODE_SELECTOR 0x1f
+#endif  /* FreeBSD */
+
+#if defined(__svr4__) || defined(_SCO_DS)
+#define WINE_DATA_SELECTOR 0x1f
+#define WINE_CODE_SELECTOR 0x17
+#endif  /* svr4 || SCO_DS */
+
+#else  /* WINELIB */
+
+#define WINE_DATA_SELECTOR 0x00
+#define WINE_CODE_SELECTOR 0x00
+
+#endif  /* WINELIB */
+
 #endif /* __WINE_SELECTORS_H */
diff --git a/include/shell.h b/include/shell.h
index 4a7e0cd..49cade42 100644
--- a/include/shell.h
+++ b/include/shell.h
@@ -13,8 +13,6 @@
 #define MAX_PATH 260
 #endif
 
-extern INT ShellAbout(HWND hWnd, LPCSTR szApp, LPCSTR szOtherStuff,
-                      HICON16 hIcon);
 extern void SHELL_LoadRegistry();
 extern void SHELL_SaveRegistry();
 extern void SHELL_Init();
@@ -81,6 +79,6 @@
 #define SE_ERR_DDEBUSY          30
 #define SE_ERR_NOASSOC          31
 
-LRESULT AboutDlgProc(HWND hWnd,UINT msg,WPARAM16 wParam,LPARAM lParam);
+LRESULT AboutDlgProc(HWND32 hWnd,UINT32 msg,WPARAM16 wParam,LPARAM lParam);
 
 #endif  /* __WINE_SHELL_H */
diff --git a/include/sigcontext.h b/include/sigcontext.h
new file mode 100644
index 0000000..24e5a59
--- /dev/null
+++ b/include/sigcontext.h
@@ -0,0 +1,146 @@
+/*
+ * Signal context definitions
+ *
+ * Copyright 1995 Alexandre Julliard
+ */
+
+#ifndef __WINE_SIGCONTEXT_H
+#define __WINE_SIGCONTEXT_H
+
+#ifdef WINELIB
+#error This file must not be used in Winelib
+#endif
+
+#ifdef linux
+typedef struct
+{
+    unsigned short sc_gs, __gsh;
+    unsigned short sc_fs, __fsh;
+    unsigned short sc_es, __esh;
+    unsigned short sc_ds, __dsh;
+    unsigned long sc_edi;
+    unsigned long sc_esi;
+    unsigned long sc_ebp;
+    unsigned long sc_esp;
+    unsigned long sc_ebx;
+    unsigned long sc_edx;
+    unsigned long sc_ecx;
+    unsigned long sc_eax;
+    unsigned long sc_trapno;
+    unsigned long sc_err;
+    unsigned long sc_eip;
+    unsigned short sc_cs, __csh;
+    unsigned long sc_eflags;
+    unsigned long esp_at_signal;
+    unsigned short sc_ss, __ssh;
+    unsigned long i387;
+    unsigned long oldmask;
+    unsigned long cr2;
+} SIGCONTEXT;
+#endif  /* linux */
+
+#ifdef __NetBSD__
+#include <signal.h>
+typedef struct sigcontext SIGCONTEXT;
+#endif  /* NetBSD */
+
+#if defined(__svr4__) || defined(_SCO_DS)
+#include <signal.h>
+#ifdef _SCO_DS
+#include <sys/regset.h>
+#endif
+#include <sys/ucontext.h>
+typedef struct ucontext SIGCONTEXT;
+#endif  /* svr4 || SCO_DS */
+
+#ifdef __FreeBSD__
+#include <signal.h>
+typedef struct sigcontext SIGCONTEXT;
+#endif  /* FreeBSD */
+
+#if !defined(__svr4__) && !defined(_SCO_DS)
+
+#define EAX_sig(context)     ((context)->sc_eax)
+#define EBX_sig(context)     ((context)->sc_ebx)
+#define ECX_sig(context)     ((context)->sc_ecx)
+#define EDX_sig(context)     ((context)->sc_edx)
+#define ESI_sig(context)     ((context)->sc_esi)
+#define EDI_sig(context)     ((context)->sc_edi)
+#define EBP_sig(context)     ((context)->sc_ebp)
+                            
+#define CS_sig(context)      ((context)->sc_cs)
+#define DS_sig(context)      ((context)->sc_ds)
+#define ES_sig(context)      ((context)->sc_es)
+#define SS_sig(context)      ((context)->sc_ss)
+                            
+#ifdef linux
+/* fs and gs are not supported on *BSD. Hopefully we won't need them. */
+#define FS_sig(context)      ((context)->sc_fs)
+#define GS_sig(context)      ((context)->sc_gs)
+#endif
+                            
+#ifndef __FreeBSD__         
+#define EFL_sig(context)     ((context)->sc_eflags)
+#else                       
+#define EFL_sig(context)     ((context)->sc_efl)
+#endif                      
+                            
+#define EIP_sig(context)     ((context)->sc_eip)
+#define ESP_sig(context)     ((context)->sc_esp)
+
+#else  /* __svr4__ || _SCO_DS */
+
+#ifdef _SCO_DS
+#define gregs regs
+#endif
+
+#define EAX_sig(context)     ((context)->uc_mcontext.gregs[EAX])
+#define EBX_sig(context)     ((context)->uc_mcontext.gregs[EBX])
+#define ECX_sig(context)     ((context)->uc_mcontext.gregs[ECX])
+#define EDX_sig(context)     ((context)->uc_mcontext.gregs[EDX])
+#define ESI_sig(context)     ((context)->uc_mcontext.gregs[ESI])
+#define EDI_sig(context)     ((context)->uc_mcontext.gregs[EDI])
+#define EBP_sig(context)     ((context)->uc_mcontext.gregs[EBP])
+                            
+#define CS_sig(context)      ((context)->uc_mcontext.gregs[CS])
+#define DS_sig(context)      ((context)->uc_mcontext.gregs[DS])
+#define ES_sig(context)      ((context)->uc_mcontext.gregs[ES])
+#define SS_sig(context)      ((context)->uc_mcontext.gregs[SS])
+                            
+#define FS_sig(context)      ((context)->uc_mcontext.gregs[FS])
+#define GS_sig(context)      ((context)->uc_mcontext.gregs[GS])
+
+#define EFL_sig(context)     ((context)->uc_mcontext.gregs[EFL])
+                            
+#define EIP_sig(context)     ((context)->uc_mcontext.gregs[EIP])
+#ifdef R_ESP
+#define ESP_sig(context)     ((context)->uc_mcontext.gregs[R_ESP])
+#else
+#define ESP_sig(context)     ((context)->uc_mcontext.gregs[ESP])
+#endif
+                            
+#endif  /* __svr4__ || _SCO_DS */
+
+#define AX_sig(context)      (*(WORD*)&EAX_sig(context))
+#define BX_sig(context)      (*(WORD*)&EBX_sig(context))
+#define CX_sig(context)      (*(WORD*)&ECX_sig(context))
+#define DX_sig(context)      (*(WORD*)&EDX_sig(context))
+#define SI_sig(context)      (*(WORD*)&ESI_sig(context))
+#define DI_sig(context)      (*(WORD*)&EDI_sig(context))
+#define BP_sig(context)      (*(WORD*)&EBP_sig(context))
+
+#define AL_sig(context)      (*(BYTE*)&EAX_sig(context))
+#define AH_sig(context)      (*((BYTE*)&EAX_sig(context)+1))
+#define BL_sig(context)      (*(BYTE*)&EBX_sig(context))
+#define BH_sig(context)      (*((BYTE*)&EBX_sig(context)+1))
+#define CL_sig(context)      (*(BYTE*)&ECX_sig(context))
+#define CH_sig(context)      (*((BYTE*)&ECX_sig(context)+1))
+#define DL_sig(context)      (*(BYTE*)&EDX_sig(context))
+#define DH_sig(context)      (*((BYTE*)&EDX_sig(context)+1))
+                            
+#define IP_sig(context)      (*(WORD*)&EIP_sig(context))
+#define SP_sig(context)      (*(WORD*)&ESP_sig(context))
+                            
+#define FL_sig(context)      (*(WORD*)&EFL_sig(context))
+
+#endif /* __WINE_SIGCONTEXT_H */
diff --git a/include/stackframe.h b/include/stackframe.h
index bc46ce0..736e104 100644
--- a/include/stackframe.h
+++ b/include/stackframe.h
@@ -51,7 +51,6 @@
 
   /* Saved 32-bit stack for current process (Win16 only) */
 extern DWORD IF1632_Saved32_esp;
-extern SEGPTR IF1632_Stack32_base;
 
   /* Original Unix stack */
 extern DWORD IF1632_Original32_esp;
diff --git a/include/string32.h b/include/string32.h
index f8f234d..371b5cc 100644
--- a/include/string32.h
+++ b/include/string32.h
@@ -10,7 +10,6 @@
 
 #include "wintypes.h"
 
-LPSTR	STRING32_DupUniToAnsi(LPCWSTR src);
 LPWSTR	STRING32_DupAnsiToUni(LPCSTR src);
 LPWSTR	STRING32_strdupW(LPCWSTR);
 
diff --git a/include/task.h b/include/task.h
index 04c48ba..df65c60 100644
--- a/include/task.h
+++ b/include/task.h
@@ -47,6 +47,7 @@
 
 #define THUNK_MAGIC  ('P' | ('T' << 8))
 
+struct _THDB;
 
   /* Task database. See 'Windows Internals' p. 226 */
 typedef struct
@@ -55,9 +56,8 @@
     WORD      sp;                         /* 02 Stack pointer of task */
     WORD      ss;                         /* 04 Stack segment of task */
     WORD      nEvents;                    /* 06 Events for this task */
-    char      priority;                   /* 08 Task priority, -32..15 */
-    BYTE      unused1;                    /* 09 */
-    HGLOBAL16 hStack32;                   /* 0a Handle to 32-bit stack */
+    INT16     priority;                   /* 08 Task priority, -32..15 */
+    WORD      unused1;                    /* 0a */
     HTASK16   hSelf;                      /* 0c Selector of this TDB */
     HANDLE16  hPrevInstance;              /* 0e Previous instance of module */
     DWORD     esp;                        /* 10 32-bit stack pointer */
@@ -81,7 +81,9 @@
     DWORD     int3e WINE_PACKED;          /* 46 int 3e (80x87 emu) handler */
     DWORD     int75 WINE_PACKED;          /* 4a int 75 (80x87 error) handler */
     DWORD     compat_flags WINE_PACKED;   /* 4e Compatibility flags */
-    BYTE      unused4[14];                /* 52 */
+    BYTE      unused4[2];                 /* 52 */
+    struct _THDB *thdb;                   /* 54 Pointer to thread database */
+    BYTE      unused5[8];                 /* 58 */
     HANDLE16  hPDB;                       /* 60 Selector of PDB (i.e. PSP) */
     SEGPTR    dta WINE_PACKED;            /* 62 Current DTA */
     BYTE      curdrive;                   /* 66 Current drive */
@@ -113,5 +115,6 @@
                                 HANDLE16 hEnvironment, LPCSTR cmdLine,
                                 UINT16 cmdShow );
 extern void TASK_KillCurrentTask( INT16 exitCode );
+extern HTASK16 TASK_GetNextTask( HTASK16 hTask );
 
 #endif /* _WINE_TASK_H */
diff --git a/include/thread.h b/include/thread.h
new file mode 100644
index 0000000..11d9cbb
--- /dev/null
+++ b/include/thread.h
@@ -0,0 +1,81 @@
+/*
+ * Thread definitions
+ *
+ * Copyright 1996 Alexandre Julliard
+ */
+
+#ifndef __WINE_THREAD_H
+#define __WINE_THREAD_H
+
+#include "process.h"
+
+/* Thread exception block */
+typedef struct _TEB
+{
+    void        *except;         /* 00 Head of exception handling chain */
+    void        *stack_top;      /* 04 Top of thread stack */
+    void        *stack_low;      /* 08 Stack low-water mark */
+    HTASK16      htask16;        /* 0c Win16 task handle */
+    WORD         stack_sel;      /* 0e 16-bit stack selector */
+    DWORD        selman_list;    /* 10 Selector manager list */
+    DWORD        user_ptr;       /* 14 User pointer */
+    struct _TEB *self;           /* 18 Pointer to this structure */
+    WORD         flags;          /* 1c Flags */
+    WORD         mutex_count;    /* 1e Win16 mutex count */
+    DWORD        debug_context;  /* 20 Debug context */
+    DWORD       *ppriority;      /* 24 Pointer to current priority */
+    HQUEUE16     queue;          /* 28 Message queue */
+    WORD         pad1;           /* 2a */
+    LPVOID      *tls_ptr;        /* 2c Pointer to TLS array */
+} TEB;
+
+/* Thread database */
+typedef struct _THDB
+{
+    K32OBJ       header;         /*  00 Kernel object header */
+    PDB32       *process;        /*  08 Process owning this thread */
+    K32OBJ      *event;          /*  0c Thread event */
+    TEB          teb;            /*  10 Thread information block */
+    PDB32       *process2;       /*  40 Same as offset 08 (?) */
+    DWORD        flags;          /*  44 Flags */
+    DWORD        exit_code;      /*  48 Termination status */
+    WORD         teb_sel;        /*  4c Selector to TEB */
+    WORD         emu_sel;        /*  4e 80387 emulator selector */
+    DWORD        unknown1;       /*  50 Unknown */
+    void        *wait_list;      /*  54 Event waiting list */
+    DWORD        unknown2;       /*  58 Unknown */
+    void        *ring0_thread;   /*  5c Pointer to ring 0 thread */
+    void        *ptdbx;          /*  60 Pointer to TDBX structure */
+    void        *stack_base;     /*  64 Base of the stack */
+    void        *exit_stack;     /*  68 Stack pointer on thread exit */
+    void        *emu_data;       /*  6c Related to 80387 emulation */
+    DWORD        last_error;     /*  70 Last error code */
+    void        *debugger_CB;    /*  74 Debugger context block */
+    DWORD        debug_thread;   /*  78 Thread debugging this one (?) */
+    void        *context;        /*  7c Thread register context */
+    DWORD        unknown3[3];    /*  80 Unknown */
+    WORD         current_ss;     /*  8c Another 16-bit stack selector */
+    WORD         pad2;           /*  8e */
+    void        *ss_table;       /*  90 Pointer to info about 16-bit stack */
+    WORD         thunk_ss;       /*  94 Yet another 16-bit stack selector */
+    WORD         pad3;           /*  96 */
+    LPVOID       tls_array[64];  /*  98 Thread local storage */
+    DWORD        delta_priority; /* 198 Priority delta */
+    DWORD        unknown4[7];    /* 19c Unknown */
+    void        *create_data;    /* 1b8 Pointer to creation structure */
+    DWORD        suspend_count;  /* 1bc SuspendThread() counter */
+    DWORD        unknown5[9];    /* 1c0 Unknown */
+    K32OBJ      *crit_section;   /* 1e4 Some critical section */
+    K32OBJ      *win16_mutex;    /* 1e8 Pointer to Win16 mutex */
+    K32OBJ      *win32_mutex;    /* 1ec Pointer to KERNEL32 mutex */
+    K32OBJ      *crit_section2;  /* 1f0 Another critical section */
+    DWORD        unknown6[2];    /* 1f4 Unknown */
+} THDB;
+
+
+extern THDB *THREAD_Create( PDB32 *pdb, DWORD stack_size );
+extern void THREAD_Destroy( K32OBJ *ptr );
+
+extern THDB *pCurrentThread;
+
+#endif  /* __WINE_THREAD_H */
diff --git a/include/winbase.h b/include/winbase.h
index 411c42b..5b432c7 100644
--- a/include/winbase.h
+++ b/include/winbase.h
@@ -3,8 +3,6 @@
 
 #include "windows.h"
 
-#define INVALID_HANDLE_VALUE    ((HANDLE32) -1)
-
 #define WAIT_FAILED		0xffffffff
 #define WAIT_OBJECT_0		0
 #define WAIT_ABANDONED		STATUS_ABANDONED_WAIT_0
@@ -148,7 +146,6 @@
 
 void     DeleteCriticalSection(CRITICAL_SECTION *lpCrit);
 void     EnterCriticalSection(CRITICAL_SECTION *lpCrit);
-int      GetCurrentProcessId(void);
 void     InitializeCriticalSection(CRITICAL_SECTION *lpCrit);
 void     LeaveCriticalSection(CRITICAL_SECTION *lpCrit);
 HANDLE32 OpenProcess(DWORD access, BOOL32 inherit, DWORD id);
diff --git a/include/windows.h b/include/windows.h
index be336a8..e0d8cd4 100644
--- a/include/windows.h
+++ b/include/windows.h
@@ -6,7 +6,6 @@
 #endif
 
 #include "wintypes.h"
-#include "winuser.h"
 
 #pragma pack(1)
 
@@ -432,6 +431,139 @@
 #define SC_SCREENSAVE   0xf140
 #define SC_HOTKEY       0xf150
 
+/****** Window classes ******/
+
+typedef struct
+{
+    UINT16      style;
+    WNDPROC16   lpfnWndProc WINE_PACKED;
+    INT16       cbClsExtra;
+    INT16       cbWndExtra;
+    HANDLE16    hInstance;
+    HICON16     hIcon;
+    HCURSOR16   hCursor;
+    HBRUSH16    hbrBackground;
+    SEGPTR      lpszMenuName WINE_PACKED;
+    SEGPTR      lpszClassName WINE_PACKED;
+} WNDCLASS16, *LPWNDCLASS16;
+
+typedef struct
+{
+    UINT32      style;
+    WNDPROC32   lpfnWndProc;
+    INT32       cbClsExtra;
+    INT32       cbWndExtra;
+    HINSTANCE32 hInstance;
+    HICON32     hIcon;
+    HCURSOR32   hCursor;
+    HBRUSH32    hbrBackground;
+    LPCSTR      lpszMenuName;
+    LPCSTR      lpszClassName;
+} WNDCLASS32A, *LPWNDCLASS32A;
+
+typedef struct
+{
+    UINT32      style;
+    WNDPROC32   lpfnWndProc;
+    INT32       cbClsExtra;
+    INT32       cbWndExtra;
+    HINSTANCE32 hInstance;
+    HICON32     hIcon;
+    HCURSOR32   hCursor;
+    HBRUSH32    hbrBackground;
+    LPCWSTR     lpszMenuName;
+    LPCWSTR     lpszClassName;
+} WNDCLASS32W, *LPWNDCLASS32W;
+
+DECL_WINELIB_TYPE_AW(WNDCLASS);
+DECL_WINELIB_TYPE_AW(LPWNDCLASS);
+
+typedef struct
+{
+    UINT32      cbSize;
+    UINT32      style;
+    WNDPROC16   lpfnWndProc;
+    INT16       cbClsExtra;
+    INT16       cbWndExtra;
+    HANDLE16    hInstance;
+    HICON16     hIcon;
+    HCURSOR16   hCursor;
+    HBRUSH16    hbrBackground;
+    SEGPTR      lpszMenuName;
+    SEGPTR      lpszClassName;
+    HICON16     hIconSm;
+} WNDCLASSEX16, *LPWNDCLASSEX16;
+
+typedef struct
+{
+    UINT32      cbSize;
+    UINT32      style;
+    WNDPROC32   lpfnWndProc;
+    INT32       cbClsExtra;
+    INT32       cbWndExtra;
+    HINSTANCE32 hInstance;
+    HICON32     hIcon;
+    HCURSOR32   hCursor;
+    HBRUSH32    hbrBackground;
+    LPCSTR      lpszMenuName;
+    LPCSTR      lpszClassName;
+    HICON32     hIconSm;
+} WNDCLASSEX32A, *LPWNDCLASSEX32A;
+
+typedef struct
+{
+    UINT32      cbSize;
+    UINT32      style;
+    WNDPROC32   lpfnWndProc;
+    INT32       cbClsExtra;
+    INT32       cbWndExtra;
+    HINSTANCE32 hInstance;
+    HICON32     hIcon;
+    HCURSOR32   hCursor;
+    HBRUSH32    hbrBackground;
+    LPCWSTR     lpszMenuName;
+    LPCWSTR     lpszClassName;
+    HICON32     hIconSm;
+} WNDCLASSEX32W, *LPWNDCLASSEX32W;
+
+DECL_WINELIB_TYPE_AW(WNDCLASSEX);
+DECL_WINELIB_TYPE_AW(LPWNDCLASSEX);
+
+#define CS_VREDRAW          0x0001
+#define CS_HREDRAW          0x0002
+#define CS_KEYCVTWINDOW     0x0004
+#define CS_DBLCLKS          0x0008
+#define CS_OWNDC            0x0020
+#define CS_CLASSDC          0x0040
+#define CS_PARENTDC         0x0080
+#define CS_NOKEYCVT         0x0100
+#define CS_NOCLOSE          0x0200
+#define CS_SAVEBITS         0x0800
+#define CS_BYTEALIGNCLIENT  0x1000
+#define CS_BYTEALIGNWINDOW  0x2000
+#define CS_GLOBALCLASS      0x4000
+
+  /* Offsets for GetClassLong() and GetClassWord() */
+#define GCL_MENUNAME        (-8)
+#define GCW_HBRBACKGROUND   (-10)
+#define GCL_HBRBACKGROUND   GCW_HBRBACKGROUND
+#define GCW_HCURSOR         (-12)
+#define GCL_HCURSOR         GCW_HCURSOR
+#define GCW_HICON           (-14)
+#define GCL_HICON           GCW_HICON
+#define GCW_HMODULE         (-16)
+#define GCL_HMODULE         GCW_HMODULE
+#define GCW_CBWNDEXTRA      (-18)
+#define GCL_CBWNDEXTRA      GCW_CBWNDEXTRA
+#define GCW_CBCLSEXTRA      (-20)
+#define GCL_CBCLSEXTRA      GCW_CBCLSEXTRA
+#define GCL_WNDPROC         (-24)
+#define GCW_STYLE           (-26)
+#define GCL_STYLE           GCW_STYLE
+#define GCW_ATOM            (-32)
+#define GCW_HICONSM         (-34)
+#define GCL_HICONSM         GCW_HICONSM
+
 /***** Window hooks *****/
 
   /* Hook values */
@@ -1653,7 +1785,9 @@
 #define DRIVE_CDROM                5
 #define DRIVE_RAMDISK              6
 
-#define HFILE_ERROR	-1
+#define HFILE_ERROR16   ((HFILE16)-1)
+#define HFILE_ERROR32   ((HFILE32)-1)
+#define HFILE_ERROR     WINELIB_NAME(HFILE_ERROR)
 
 #define DDL_READWRITE	0x0000
 #define DDL_READONLY	0x0001
@@ -1717,6 +1851,10 @@
 DECL_WINELIB_TYPE_AW(WIN32_FIND_DATA);
 DECL_WINELIB_TYPE_AW(LPWIN32_FIND_DATA);
 
+#define INVALID_HANDLE_VALUE16  ((HANDLE16) -1)
+#define INVALID_HANDLE_VALUE32  ((HANDLE32) -1)
+#define INVALID_HANDLE_VALUE WINELIB_NAME(INVALID_HANDLE_VALUE)
+
 /* comm */
 
 #define CBR_110	0xFF10
@@ -2482,11 +2620,25 @@
 #define HWND_NOTOPMOST      ((HWND)-2)
 
 /* Flags for TrackPopupMenu */
-#define TPM_LEFTBUTTON  0x0000
-#define TPM_RIGHTBUTTON 0x0002
-#define TPM_LEFTALIGN   0x0000
-#define TPM_CENTERALIGN 0x0004
-#define TPM_RIGHTALIGN  0x0008
+#define TPM_LEFTBUTTON    0x0000
+#define TPM_RIGHTBUTTON   0x0002
+#define TPM_LEFTALIGN     0x0000
+#define TPM_CENTERALIGN   0x0004
+#define TPM_RIGHTALIGN    0x0008
+#define TPM_TOPALIGN      0x0000
+#define TPM_VCENTERALIGN  0x0010
+#define TPM_BOTTOMALIGN   0x0020
+#define TPM_HORIZONTAL    0x0000
+#define TPM_VERTICAL      0x0040
+#define TPM_NONOTIFY      0x0080
+#define TPM_RETURNCMD     0x0100
+
+typedef struct 
+{
+    UINT32   cbSize;
+    RECT32   rcExclude;
+} TPMPARAMS, *LPTPMPARAMS;
+
 
 #define MF_INSERT          0x0000
 #define MF_CHANGE          0x0080
@@ -3723,10 +3875,14 @@
 
 /* Code page information.
  */
-typedef struct {
-        DWORD MaxCharSize;
-        BYTE DefaultChar[2];
-        BYTE LeadBytes[5];
+#define MAX_LEADBYTES     12
+#define MAX_DEFAULTCHAR   2
+
+typedef struct
+{
+    UINT32 MaxCharSize;
+    BYTE   DefaultChar[MAX_DEFAULTCHAR];
+    BYTE   LeadByte[MAX_LEADBYTES];
 } CPINFO, *LPCPINFO;
 
 /* The 'overlapped' data structure used by async I/O functions.
@@ -3848,16 +4004,17 @@
 
 /* File attribute flags
  */
-#define FILE_ATTRIBUTE_ARCHIVE          0x0020
-#define FILE_ATTRIBUTE_COMPRESSED       0x0800
-#define FILE_ATTRIBUTE_DIRECTORY        0x0010
-#define FILE_ATTRIBUTE_HIDDEN           0x0002
-#define FILE_ATTRIBUTE_NORMAL           0x0080
 #define FILE_ATTRIBUTE_READONLY         0x0001
+#define FILE_ATTRIBUTE_HIDDEN           0x0002
 #define FILE_ATTRIBUTE_SYSTEM           0x0004
+#define FILE_ATTRIBUTE_LABEL            0x0008  /* Not in Windows API */
+#define FILE_ATTRIBUTE_DIRECTORY        0x0010
+#define FILE_ATTRIBUTE_ARCHIVE          0x0020
+#define FILE_ATTRIBUTE_NORMAL           0x0080
 #define FILE_ATTRIBUTE_TEMPORARY        0x0100
 #define FILE_ATTRIBUTE_ATOMIC_WRITE     0x0200
 #define FILE_ATTRIBUTE_XACTION_WRITE    0x0400
+#define FILE_ATTRIBUTE_COMPRESSED       0x0800
 
 
 /* WinHelp internal structure */
@@ -3902,6 +4059,19 @@
 #define HELP_MULTIKEY       0x0201
 #define HELP_SETWINPOS      0x0203
 
+/* ExitWindows() flags */
+#define EW_RESTARTWINDOWS   0x0042
+#define EW_REBOOTSYSTEM     0x0043
+#define EW_EXITANDEXECAPP   0x0044
+
+/* ExitWindowsEx() flags */
+#define EWX_LOGOFF           0
+#define EWX_SHUTDOWN         1
+#define EWX_REBOOT           2
+#define EWX_FORCE            4
+#define EWX_POWEROFF         8
+
+
 #define CCHDEVICENAME 32
 #define CCHFORMNAME   32
 
@@ -4281,6 +4451,7 @@
 VOID       SetPriority(HTASK16,INT16);
 WORD       SetSelectorBase(WORD,DWORD);
 WORD       SetSelectorLimit(WORD,DWORD);
+LONG       SetSwapAreaSize(WORD);
 HQUEUE16   SetTaskQueue(HTASK16,HQUEUE16);
 FARPROC16  SetTaskSignalProc(HTASK16,FARPROC16);
 DWORD      SetViewportExt(HDC16,INT16,INT16);
@@ -4302,8 +4473,9 @@
 
 BOOL32     Beep(DWORD,DWORD);
 BOOL32     ClearCommError(INT32,LPDWORD,LPCOMSTAT);
-HFILE      CreateFile32A(LPCSTR,DWORD,DWORD,LPSECURITY_ATTRIBUTES,DWORD,DWORD,HANDLE32);
-HFILE      CreateFile32W(LPCWSTR,DWORD,DWORD,LPSECURITY_ATTRIBUTES,DWORD,DWORD,HANDLE32);
+BOOL32     CloseHandle(HANDLE32);
+HFILE32    CreateFile32A(LPCSTR,DWORD,DWORD,LPSECURITY_ATTRIBUTES,DWORD,DWORD,HANDLE32);
+HFILE32    CreateFile32W(LPCWSTR,DWORD,DWORD,LPSECURITY_ATTRIBUTES,DWORD,DWORD,HANDLE32);
 #define    CreateFile WINELIB_NAME_AW(CreateFile)
 HANDLE32   CreateFileMapping32A(HANDLE32,LPSECURITY_ATTRIBUTES,DWORD,DWORD,DWORD,LPCSTR);
 HANDLE32   CreateFileMapping32W(HANDLE32,LPSECURITY_ATTRIBUTES,DWORD,DWORD,DWORD,LPCWSTR);
@@ -4320,24 +4492,29 @@
 #define    EnumSystemLocales WINELIB_NAME_AW(EnumSystemLocales)
 BOOL32     EnumThreadWindows(DWORD,WNDENUMPROC32,LPARAM);
 void       ExitProcess(DWORD);
-BOOL32     FileTimeToDosDateTime(LPFILETIME,LPWORD,LPWORD);
-BOOL32     FileTimeToLocalFileTime(LPFILETIME,LPFILETIME);
-BOOL32     FileTimeToSystemTime(LPFILETIME,LPSYSTEMTIME);
+BOOL32     ExitWindowsEx(UINT32,DWORD);
+BOOL32     FileTimeToDosDateTime(const FILETIME*,LPWORD,LPWORD);
+BOOL32     FileTimeToLocalFileTime(const FILETIME*,LPFILETIME);
+BOOL32     FileTimeToSystemTime(const FILETIME*,LPSYSTEMTIME);
 HRSRC32    FindResourceEx32A(HINSTANCE32,LPCSTR,LPCSTR,WORD);
 HRSRC32    FindResourceEx32W(HINSTANCE32,LPCWSTR,LPCWSTR,WORD);
 #define    FindResourceEx WINELIB_NAME_AW(FindResourceEx)
-BOOL32     FlushFileBuffers(HFILE);
+BOOL32     FlushFileBuffers(HFILE32);
 UINT32     GetACP(void);
 LPCSTR     GetCommandLine32A();
 LPCWSTR    GetCommandLine32W();
 #define    GetCommandLine WINELIB_NAME_AW(GetCommandLine)
 BOOL32     GetCommTimeouts(INT32,LPCOMMTIMEOUTS);
-DWORD      GetCurrentThreadId(void);
+BOOL32     GetCPInfo(UINT32,LPCPINFO);
+HANDLE32   GetCurrentProcess(void);
+DWORD      GetCurrentProcessId(void);
 HANDLE32   GetCurrentThread(void);
+DWORD      GetCurrentThreadId(void);
 BOOL32     GetDCOrgEx(HDC32,LPPOINT32);
-DWORD      GetFileInformationByHandle(HFILE,BY_HANDLE_FILE_INFORMATION*);
-DWORD      GetFileSize(HFILE,LPDWORD);
-DWORD      GetFileType(HFILE);
+DWORD      GetFileInformationByHandle(HFILE32,BY_HANDLE_FILE_INFORMATION*);
+DWORD      GetFileSize(HFILE32,LPDWORD);
+BOOL32     GetFileTime(HFILE32,LPFILETIME,LPFILETIME,LPFILETIME);
+DWORD      GetFileType(HFILE32);
 VOID       GetLocalTime(LPSYSTEMTIME);
 DWORD      GetLogicalDrives(void);
 UINT32     GetOEMCP(void);
@@ -4345,7 +4522,7 @@
 DWORD      GetShortPathName32A(LPCSTR,LPSTR,DWORD);
 DWORD      GetShortPathName32W(LPCWSTR,LPWSTR,DWORD);
 #define    GetShortPathName WINELIB_NAME_AW(GetShortPathName)
-HFILE      GetStdHandle(DWORD);
+HFILE32    GetStdHandle(DWORD);
 VOID       GetSystemInfo(LPSYSTEM_INFO);
 BOOL32     GetSystemPowerStatus(LPSYSTEM_POWER_STATUS);
 VOID       GetSystemTime(LPSYSTEMTIME);
@@ -4362,7 +4539,7 @@
 BOOL32     HeapValidate(HANDLE32,DWORD,LPVOID);
 BOOL32     IsWindowUnicode(HWND32);
 BOOL32     IsValidLocale(DWORD,DWORD);
-BOOL32     LocalFileTimeToFileTime(LPFILETIME,LPFILETIME);
+BOOL32     LocalFileTimeToFileTime(const FILETIME*,LPFILETIME);
 LPVOID     MapViewOfFileEx(HANDLE32,DWORD,DWORD,DWORD,DWORD,DWORD);
 BOOL32     MoveFile32A(LPCSTR,LPCSTR);
 BOOL32     MoveFile32W(LPCWSTR,LPCWSTR);
@@ -4371,7 +4548,7 @@
 BOOL32     ReadConsole32A(HANDLE32,LPVOID,DWORD,LPDWORD,LPVOID);
 BOOL32     ReadConsole32W(HANDLE32,LPVOID,DWORD,LPDWORD,LPVOID);
 #define    ReadConsole WINELIB_NAME_AW(ReadConsole)
-BOOL32     ReadFile(HFILE,LPVOID,DWORD,LPDWORD,LPOVERLAPPED);
+BOOL32     ReadFile(HFILE32,LPVOID,DWORD,LPDWORD,LPOVERLAPPED);
 DWORD      RegCreateKeyEx32A(HKEY,LPCSTR,DWORD,LPSTR,DWORD,REGSAM,
                              LPSECURITY_ATTRIBUTES,LPHKEY,LPDWORD);
 DWORD      RegCreateKeyEx32W(HKEY,LPCWSTR,DWORD,LPWSTR,DWORD,REGSAM,
@@ -4400,27 +4577,32 @@
 BOOL32     SetConsoleTitle32A(LPCSTR);
 BOOL32     SetConsoleTitle32W(LPCWSTR);
 #define    SetConsoleTitle WINELIB_NAME_AW(SetConsoleTitle)
-BOOL32     SetEndOfFile(HFILE);
-DWORD      SetFilePointer(HFILE,LONG,LPLONG,DWORD);
-BOOL32     SetFileTime(HFILE,LPFILETIME,LPFILETIME,LPFILETIME);
+BOOL32     SetEndOfFile(HFILE32);
+DWORD      SetFilePointer(HFILE32,LONG,LPLONG,DWORD);
+BOOL32     SetFileTime(HFILE32,const FILETIME*,const FILETIME*,const FILETIME*);
+VOID       SetLastErrorEx(DWORD,DWORD);
 BOOL32     SetTimeZoneInformation(const LPTIME_ZONE_INFORMATION);
 BOOL32     SetSystemPowerState(BOOL32,BOOL32);
 BOOL32     SetSystemTime(const SYSTEMTIME*);
 VOID       Sleep(DWORD);
-BOOL32     SystemTimeToFileTime(LPSYSTEMTIME,LPFILETIME);
+BOOL32     SystemTimeToFileTime(const SYSTEMTIME*,LPFILETIME);
+BOOL32     TrackPopupMenuEx(HMENU32,UINT32,INT32,INT32,HWND32,LPTPMPARAMS);
+DWORD      TlsAlloc(void);
+BOOL32     TlsFree(DWORD);
+LPVOID     TlsGetValue(DWORD);
+BOOL32     TlsSetValue(DWORD,LPVOID);
 LPVOID     VirtualAlloc(LPVOID,DWORD,DWORD,DWORD);
 BOOL32     VirtualFree(LPVOID,DWORD,DWORD);
 BOOL32     WriteConsole32A(HANDLE32,LPVOID,DWORD,LPDWORD,LPVOID);
 BOOL32     WriteConsole32W(HANDLE32,LPVOID,DWORD,LPDWORD,LPVOID);
 #define    WriteConsole WINELIB_NAME_AW(WriteConsole)
-BOOL32     WriteFile(HFILE,LPVOID,DWORD,LPDWORD,LPOVERLAPPED);
+BOOL32     WriteFile(HFILE32,LPVOID,DWORD,LPDWORD,LPOVERLAPPED);
 
 
 /* Declarations for functions that are the same in Win16 and Win32 */
 
 BOOL16     CheckDlgButton(HWND32,INT32,UINT32);
 BOOL16     CheckRadioButton(HWND32,UINT32,UINT32,UINT32);
-LONG       CopyLZFile(HFILE,HFILE);
 HBITMAP16  CreateBitmap(INT32,INT32,UINT32,UINT32,LPCVOID);
 BOOL16     CreateCaret(HWND32,HBITMAP32,INT32,INT32);
 HBITMAP16  CreateCompatibleBitmap(HDC32,INT32,INT32);
@@ -4439,13 +4621,7 @@
 WORD       GetWindowWord(HWND32,INT32);
 BOOL16     HideCaret(HWND32);
 BOOL16     IsWindow(HWND32);
-void       LZClose(HFILE);
-LONG       LZCopy(HFILE,HFILE);
 void       LZDone(void);
-HFILE      LZInit(HFILE);
-LONG       LZSeek(HFILE,LONG,INT32);
-INT16      LZStart(void);
-HFILE      OpenFile(LPCSTR,OFSTRUCT*,UINT32);
 UINT16     RealizePalette(HDC32);
 DWORD      RegCloseKey(HKEY);
 DWORD      RegFlushKey(HKEY);
@@ -4456,18 +4632,11 @@
 BOOL16     SetCaretPos(INT32,INT32);
 WORD       SetClassWord(HWND32,INT32,WORD);
 VOID       SetLastError(DWORD);
-VOID       SetLastErrorEx(DWORD,DWORD);
 VOID       SetRectRgn(HRGN32,INT32,INT32,INT32,INT32);
 COLORREF   SetTextColor(HDC32,COLORREF);
 WORD       SetWindowWord(HWND32,INT32,WORD);
 BOOL16     ShowCaret(HWND32);
 VOID       UpdateWindow(HWND32);
-LONG       _hread(HFILE,LPVOID,LONG);
-HFILE      _lclose(HFILE);
-HFILE      _lcreat(LPCSTR,INT32);
-LONG       _llseek(HFILE,LONG,INT32);
-HFILE      _lopen(LPCSTR,INT32);
-LONG       _hwrite(HFILE,LPCSTR,LONG);
 
 /* Declarations for functions that change between Win16 and Win32 */
 
@@ -4583,6 +4752,9 @@
 HICON16    CopyIcon16(HINSTANCE16,HICON16);
 HICON32    CopyIcon32(HICON32);
 #define    CopyIcon WINELIB_NAME(CopyIcon)
+LONG       CopyLZFile16(HFILE16,HFILE16);
+LONG       CopyLZFile32(HFILE32,HFILE32);
+#define    CopyLZFile WINELIB_NAME(CopyLZFile)
 BOOL16     CopyRect16(RECT16*,const RECT16*);
 BOOL32     CopyRect32(RECT32*,const RECT32*);
 #define    CopyRect WINELIB_NAME(CopyRect)
@@ -4835,6 +5007,9 @@
 INT16      ExcludeClipRect16(HDC16,INT16,INT16,INT16,INT16);
 INT32      ExcludeClipRect32(HDC32,INT32,INT32,INT32,INT32);
 #define    ExcludeClipRect WINELIB_NAME(ExcludeClipRect)
+BOOL16     ExitWindows16(DWORD,UINT16);
+#define    ExitWindows32(a,b) ExitWindowsEx(EWX_LOGOFF,0xffffffff)
+#define    ExitWindows WINELIB_NAME(ExitWindows)
 BOOL16     ExtFloodFill16(HDC16,INT16,INT16,COLORREF,UINT16);
 BOOL32     ExtFloodFill32(HDC32,INT32,INT32,COLORREF,UINT32);
 #define    ExtFloodFill WINELIB_NAME(ExtFloodFill)
@@ -4842,6 +5017,10 @@
 BOOL32     ExtTextOut32A(HDC32,INT32,INT32,UINT32,const RECT32*,LPCSTR,UINT32,const INT32*);
 BOOL32     ExtTextOut32W(HDC32,INT32,INT32,UINT32,const RECT32*,LPCWSTR,UINT32,const INT32*);
 #define    ExtTextOut WINELIB_NAME_AW(ExtTextOut)
+void       FatalAppExit16(UINT16,LPCSTR);
+void       FatalAppExit32A(UINT32,LPCSTR);
+void       FatalAppExit32W(UINT32,LPCWSTR);
+#define    FatalAppExit WINELIB_NAME_AW(FatalAppExit)
 INT16      FillRect16(HDC16,const RECT16*,HBRUSH16);
 INT32      FillRect32(HDC32,const RECT32*,HBRUSH32);
 #define    FillRect WINELIB_NAME(FillRect)
@@ -4851,11 +5030,11 @@
 BOOL16     FindClose16(HANDLE16);
 BOOL32     FindClose32(HANDLE32);
 #define    FindClose WINELIB_NAME(FindClose)
-HANDLE16   FindFirstFile16(LPCSTR,LPVOID);
+HANDLE16   FindFirstFile16(LPCSTR,LPWIN32_FIND_DATA32A);
 HANDLE32   FindFirstFile32A(LPCSTR,LPWIN32_FIND_DATA32A);
 HANDLE32   FindFirstFile32W(LPCWSTR,LPWIN32_FIND_DATA32W);
 #define    FindFirst WINELIB_NAME_AW(FindFirst)
-BOOL16     FindNextFile16(HANDLE16,LPVOID);
+BOOL16     FindNextFile16(HANDLE16,LPWIN32_FIND_DATA32A);
 BOOL32     FindNextFile32A(HANDLE32,LPWIN32_FIND_DATA32A);
 BOOL32     FindNextFile32W(HANDLE32,LPWIN32_FIND_DATA32W);
 #define    FindNext WINELIB_NAME_AW(FindNext)
@@ -5227,6 +5406,9 @@
 void       InvalidateRect16(HWND16,const RECT16*,BOOL16);
 void       InvalidateRect32(HWND32,const RECT32*,BOOL32);
 #define    InvalidateRect WINELIB_NAME(InvalidateRect)
+void       InvalidateRgn16(HWND16,HRGN16,BOOL16);
+void       InvalidateRgn32(HWND32,HRGN32,BOOL32);
+#define    InvalidateRgn WINELIB_NAME(InvalidateRgn)
 void       InvertRect16(HDC16,const RECT16*);
 void       InvertRect32(HDC32,const RECT32*);
 #define    InvertRect WINELIB_NAME(InvertRect)
@@ -5277,13 +5459,16 @@
 BOOL16     KillTimer16(HWND16,UINT16);
 BOOL32     KillTimer32(HWND32,UINT32);
 #define    KillTimer WINELIB_NAME(KillTimer)
-HFILE      LZOpenFile16(LPCSTR,LPOFSTRUCT,UINT16);
-HFILE      LZOpenFile32A(LPCSTR,LPOFSTRUCT,UINT32);
-HFILE      LZOpenFile32W(LPCWSTR,LPOFSTRUCT,UINT32);
+HFILE16    LZOpenFile16(LPCSTR,LPOFSTRUCT,UINT16);
+HFILE32    LZOpenFile32A(LPCSTR,LPOFSTRUCT,UINT32);
+HFILE32    LZOpenFile32W(LPCWSTR,LPOFSTRUCT,UINT32);
 #define    LZOpenFile WINELIB_NAME_AW(LZOpenFile)
-INT16      LZRead16(HFILE,SEGPTR,UINT16); 
-INT32      LZRead32(HFILE,LPVOID,UINT32); 
+INT16      LZRead16(HFILE16,LPVOID,UINT16); 
+INT32      LZRead32(HFILE32,LPVOID,UINT32); 
 #define    LZRead WINELIB_NAME(LZRead)
+INT16      LZStart16(void);
+INT32      LZStart32(void);
+#define    LZStart WINELIB_NAME(LZStart)
 VOID       LineDDA16(INT16,INT16,INT16,INT16,LINEDDAPROC16,LPARAM);
 BOOL32     LineDDA32(INT32,INT32,INT32,INT32,LINEDDAPROC32,LPARAM);
 #define    LineDDA WINELIB_NAME(LineDDA)
@@ -5364,6 +5549,18 @@
 BOOL16     LPtoDP16(HDC16,LPPOINT16,INT16);
 BOOL32     LPtoDP32(HDC32,LPPOINT32,INT32);
 #define    LPtoDP WINELIB_NAME(LPtoDP)
+void       LZClose16(HFILE16);
+void       LZClose32(HFILE32);
+#define    LZClose WINELIB_NAME(LZClose)
+LONG       LZCopy16(HFILE16,HFILE16);
+LONG       LZCopy32(HFILE32,HFILE32);
+#define    LZCopy WINELIB_NAME(LZCopy)
+HFILE16    LZInit16(HFILE16);
+HFILE32    LZInit32(HFILE32);
+#define    LZInit WINELIB_NAME(LZInit)
+LONG       LZSeek16(HFILE16,LONG,INT16);
+LONG       LZSeek32(HFILE32,LONG,INT32);
+#define    LZSeek WINELIB_NAME(LZSeek)
 FARPROC16  MakeProcInstance16(FARPROC16,HANDLE16);
 #define    MakeProcInstance32(proc,inst) (proc)
 #define    MakeProcInstance WINELIB_NAME(MakeProcInstance)
@@ -5416,6 +5613,9 @@
 BOOL16     OffsetWindowOrgEx16(HDC16,INT16,INT16,LPPOINT16);
 BOOL32     OffsetWindowOrgEx32(HDC32,INT32,INT32,LPPOINT32);
 #define    OffsetWindowOrgEx WINELIB_NAME(OffsetWindowOrgEx)
+HFILE16    OpenFile16(LPCSTR,OFSTRUCT*,UINT16);
+HFILE32    OpenFile32(LPCSTR,OFSTRUCT*,UINT32);
+#define    OpenFile WINELIB_NAME(OpenFile)
 BOOL16     PaintRgn16(HDC16,HRGN16);
 BOOL32     PaintRgn32(HDC32,HRGN32);
 #define    PaintRgn WINELIB_NAME(PaintRgn)
@@ -5720,6 +5920,10 @@
 void       SetWindowText32A(HWND32,LPCSTR);
 void       SetWindowText32W(HWND32,LPCWSTR);
 #define    SetWindowText WINELIB_NAME_AW(SetWindowText)
+BOOL16     ShellAbout16(HWND16,LPCSTR,LPCSTR,HICON16);
+BOOL32     ShellAbout32A(HWND32,LPCSTR,LPCSTR,HICON32);
+BOOL32     ShellAbout32W(HWND32,LPCWSTR,LPCWSTR,HICON32);
+#define    ShellAbout WINELIB_NAME_AW(ShellAbout)
 void       ShowScrollBar16(HWND16,INT16,BOOL16);
 BOOL32     ShowScrollBar32(HWND32,INT32,BOOL32);
 #define    ShowScrollBar WINELIB_NAME(ShowScrollBar)
@@ -5728,8 +5932,10 @@
 BOOL32     StretchBlt32(HDC32,INT32,INT32,INT32,INT32,HDC32,INT32,INT32,
                         INT32,INT32,DWORD);
 #define    StretchBlt WINELIB_NAME(StretchBlt)
-INT16      StretchDIBits16(HDC16,INT16,INT16,INT16,INT16,INT16,INT16,INT16,INT16,const VOID*,const BITMAPINFO*,UINT16,DWORD);
-INT32      StretchDIBits32(HDC32,INT32,INT32,INT32,INT32,INT32,INT32,INT32,INT32,const VOID*,const BITMAPINFO*,UINT32,DWORD);
+INT16      StretchDIBits16(HDC16,INT16,INT16,INT16,INT16,INT16,INT16,INT16,
+                           INT16,const VOID*,const BITMAPINFO*,UINT16,DWORD);
+INT32      StretchDIBits32(HDC32,INT32,INT32,INT32,INT32,INT32,INT32,INT32,
+                           INT32,const VOID*,const BITMAPINFO*,UINT32,DWORD);
 #define    StretchDIBits WINELIB_NAME(StretchDIBits)
 BOOL16     SubtractRect16(LPRECT16,const RECT16*,const RECT16*);
 BOOL32     SubtractRect32(LPRECT32,const RECT32*,const RECT32*);
@@ -5770,6 +5976,9 @@
 void       ValidateRect16(HWND16,const RECT16*);
 void       ValidateRect32(HWND32,const RECT32*);
 #define    ValidateRect WINELIB_NAME(ValidateRect)
+VOID       ValidateRgn16(HWND16,HRGN16);
+VOID       ValidateRgn32(HWND32,HRGN32);
+#define    ValidateRgn WINELIB_NAME(ValidateRgn)
 DWORD      VerFindFile16(UINT16,LPCSTR,LPCSTR,LPCSTR,LPSTR,UINT16*,LPSTR,UINT16*);
 DWORD      VerFindFile32A(UINT32,LPCSTR,LPCSTR,LPCSTR,LPSTR,UINT32*,LPSTR,UINT32*);
 DWORD      VerFindFile32W(UINT32,LPCWSTR,LPCWSTR,LPCWSTR,LPWSTR,UINT32*,LPWSTR,UINT32*);
@@ -5828,6 +6037,13 @@
 INT32      lstrlen32A(LPCSTR);
 INT32      lstrlen32W(LPCWSTR);
 #define    lstrlen WINELIB_NAME_AW(lstrlen)
+HINSTANCE16 WinExec16(LPCSTR,UINT16);
+HINSTANCE32 WinExec32(LPCSTR,UINT32);
+#define    WinExec WINELIB_NAME(WinExec)
+BOOL16     WinHelp16(HWND16,LPCSTR,UINT16,DWORD);
+BOOL32     WinHelp32A(HWND32,LPCSTR,UINT32,DWORD);
+BOOL32     WinHelp32W(HWND32,LPCWSTR,UINT32,DWORD);
+#define    WinHelp WINELIB_NAME_AW(WinHelp)
 INT16      wsnprintf16(LPSTR,UINT16,LPCSTR,...);
 INT32      wsnprintf32A(LPSTR,UINT32,LPCSTR,...);
 INT32      wsnprintf32W(LPWSTR,UINT32,LPCWSTR,...);
@@ -5844,11 +6060,29 @@
 INT32      wvsprintf32A(LPSTR,LPCSTR,LPCVOID);
 INT32      wvsprintf32W(LPWSTR,LPCWSTR,LPCVOID);
 #define    wvsprintf WINELIB_NAME_AW(wvsprintf)
-UINT16     _lread16(HFILE,LPVOID,UINT16);
-UINT32     _lread32(HFILE,LPVOID,UINT32);
+LONG       _hread16(HFILE16,LPVOID,LONG);
+LONG       _hread32(HFILE32,LPVOID,LONG);
+#define    _hread WINELIB_NAME(_hread)
+LONG       _hwrite16(HFILE16,LPCSTR,LONG);
+LONG       _hwrite32(HFILE32,LPCSTR,LONG);
+#define    _hwrite WINELIB_NAME(_hwrite)
+HFILE16    _lcreat16(LPCSTR,INT16);
+HFILE32    _lcreat32(LPCSTR,INT32);
+#define    _lcreat WINELIB_NAME(_lcreat)
+HFILE16    _lclose16(HFILE16);
+HFILE32    _lclose32(HFILE32);
+#define    _lclose WINELIB_NAME(_lclose)
+LONG       _llseek16(HFILE16,LONG,INT16);
+LONG       _llseek32(HFILE32,LONG,INT32);
+#define    _llseek WINELIB_NAME(_llseek)
+HFILE16    _lopen16(LPCSTR,INT16);
+HFILE32    _lopen32(LPCSTR,INT32);
+#define    _lopen WINELIB_NAME(_lopen)
+UINT16     _lread16(HFILE16,LPVOID,UINT16);
+UINT32     _lread32(HFILE32,LPVOID,UINT32);
 #define    _lread WINELIB_NAME(_lread)
-UINT16     _lwrite16(HFILE,LPCSTR,UINT16);
-UINT32     _lwrite32(HFILE,LPCSTR,UINT32);
+UINT16     _lwrite16(HFILE16,LPCSTR,UINT16);
+UINT32     _lwrite32(HFILE32,LPCSTR,UINT32);
 #define    _lwrite WINELIB_NAME(_lwrite)
 
 /* Extra functions that don't exist in the Windows API */
@@ -5942,9 +6176,7 @@
 UINT16     EnumClipboardFormats(UINT16);
 BOOL       EnumMetaFile(HDC16,HMETAFILE16,MFENUMPROC16,LPARAM);
 INT        Escape(HDC16,INT,INT,SEGPTR,SEGPTR);
-BOOL       ExitWindows(DWORD,WORD);
 HICON16    ExtractIcon(HINSTANCE16,LPCSTR,WORD);
-void       FatalAppExit(UINT,LPCSTR);
 void       FatalExit(int);
 ATOM       FindAtom(SEGPTR);
 HINSTANCE16 FindExecutable(LPCSTR,LPCSTR,LPSTR);
@@ -6023,7 +6255,6 @@
 BOOL       HiliteMenuItem(HWND,HMENU16,UINT,UINT);
 BOOL       InSendMessage(void);
 WORD       InitAtomTable(WORD);
-void       InvalidateRgn(HWND32,HRGN32,BOOL32);
 BOOL       IsChild(HWND,HWND);
 BOOL       IsClipboardFormatAvailable(WORD);
 BOOL       IsDialogMessage(HWND,LPMSG16);
@@ -6086,7 +6317,6 @@
 HWND       SetParent(HWND,HWND);
 FARPROC16  SetResourceHandler(HINSTANCE16,LPSTR,FARPROC16);
 int        SetSoundNoise(int,int);
-LONG       SetSwapAreaSize(WORD);
 void       SetSysColors(int,LPINT16,COLORREF*);
 WORD       SetSystemPaletteUse(HDC16,WORD);
 int        SetVoiceAccent(int,int,int,int,int);
@@ -6113,15 +6343,10 @@
 BOOL       TranslateMDISysAccel(HWND,LPMSG16);
 BOOL       TranslateMessage(LPMSG16);
 int        UpdateColors(HDC16);
-void       ValidateCodeSegments(void);
-LPSTR      ValidateFreeSpaces(void);
-void       ValidateRgn(HWND32,HRGN32);
 WORD       VkKeyScan(WORD);
 SEGPTR     WIN16_LockResource(HGLOBAL16);
 void       WaitMessage(void);
 int        WaitSoundState(int);
-HINSTANCE16 WinExec(LPSTR,WORD);
-BOOL       WinHelp(HWND,LPSTR,WORD,DWORD);
 
 #endif  /* NO_TRANSITION_TYPES */
 
diff --git a/include/winerror.h b/include/winerror.h
index cdca7ea..c48cc69 100644
--- a/include/winerror.h
+++ b/include/winerror.h
@@ -5,26 +5,28 @@
  * All instances of ERROR_UNKNOWN should be tested under Win95/NT
  * and replaced.
  */
-#define     ERROR_UNKNOWN               99999
+#define ERROR_UNKNOWN               99999
 
-#define     ERROR_SUCCESS               0
-#define     ERROR_FILE_NOT_FOUND        2
-#define     ERROR_TOO_MANY_OPEN_FILES   4
-#define     ERROR_ACCESS_DENIED         5
-#define     ERROR_INVALID_HANDLE        6
-#define     ERROR_BAD_FORMAT            11
-#define     ERROR_OUTOFMEMORY           14
-#define     ERROR_FILE_EXISTS           80
-#define     ERROR_INVALID_PARAMETER     87
-#define     ERROR_BROKEN_PIPE           109
-#define     ERROR_DISK_FULL             112
-#define     ERROR_CALL_NOT_IMPLEMENTED  120
-#define     ERROR_SEEK_ON_DEVICE        132
-#define     ERROR_DIR_NOT_EMPTY         145
-#define     ERROR_BUSY                  170
-#define     ERROR_FILENAME_EXCED_RANGE  206
-#define     ERROR_MORE_DATA		234
-#define     ERROR_NO_MORE_ITEMS		259
-#define     ERROR_IO_DEVICE             1117
-#define     ERROR_POSSIBLE_DEADLOCK     1131
-#define     ERROR_BAD_DEVICE            1200
+#define ERROR_SUCCESS               0
+#define ERROR_FILE_NOT_FOUND        2
+#define ERROR_PATH_NOT_FOUND        3
+#define ERROR_TOO_MANY_OPEN_FILES   4
+#define ERROR_ACCESS_DENIED         5
+#define ERROR_INVALID_HANDLE        6
+#define ERROR_BAD_FORMAT            11
+#define ERROR_OUTOFMEMORY           14
+#define ERROR_NO_MORE_FILES         18
+#define ERROR_FILE_EXISTS           80
+#define ERROR_INVALID_PARAMETER     87
+#define ERROR_BROKEN_PIPE           109
+#define ERROR_DISK_FULL             112
+#define ERROR_CALL_NOT_IMPLEMENTED  120
+#define ERROR_SEEK_ON_DEVICE        132
+#define ERROR_DIR_NOT_EMPTY         145
+#define ERROR_BUSY                  170
+#define ERROR_FILENAME_EXCED_RANGE  206
+#define ERROR_MORE_DATA             234
+#define ERROR_NO_MORE_ITEMS         259
+#define ERROR_IO_DEVICE             1117
+#define ERROR_POSSIBLE_DEADLOCK     1131
+#define ERROR_BAD_DEVICE            1200
diff --git a/include/winnt.h b/include/winnt.h
index 4a5d3bf..654ec46 100644
--- a/include/winnt.h
+++ b/include/winnt.h
@@ -7,6 +7,8 @@
 #ifndef __WINE_WINNT_H
 #define __WINE_WINNT_H
 
+#include "wintypes.h"
+
 /* Heap flags */
 #define HEAP_NO_SERIALIZE               0x00000001
 #define HEAP_GROWABLE                   0x00000002
@@ -21,4 +23,119 @@
 #define HEAP_WINE_SEGPTR                0x01000000  /* Not a Win32 flag */
 #define HEAP_WINE_CODESEG               0x02000000  /* Not a Win32 flag */
 
+/* The Win32 register context */
+
+#define CONTEXT_i386      0x00010000
+#define CONTEXT_i486      CONTEXT_i386
+#define CONTEXT_CONTROL   (CONTEXT_i386 | 0x0001) /* SS:SP, CS:IP, FLAGS, BP */
+#define CONTEXT_INTEGER   (CONTEXT_i386 | 0x0002) /* AX, BX, CX, DX, SI, DI */
+#define CONTEXT_SEGMENTS  (CONTEXT_i386 | 0x0004) /* DS, ES, FS, GS */
+#define CONTEXT_FLOATING_POINT  (CONTEXT_i386 | 0x0008L) /* 387 state */
+#define CONTEXT_DEBUG_REGISTERS (CONTEXT_i386 | 0x0010L) /* DB 0-3,6,7 */
+#define CONTEXT_FULL (CONTEXT_CONTROL | CONTEXT_INTEGER | CONTEXT_SEGMENTS)
+
+#define SIZE_OF_80387_REGISTERS      80
+
+typedef struct
+{
+    DWORD   ControlWord;
+    DWORD   StatusWord;
+    DWORD   TagWord;    
+    DWORD   ErrorOffset;
+    DWORD   ErrorSelector;
+    DWORD   DataOffset;
+    DWORD   DataSelector;    
+    BYTE    RegisterArea[SIZE_OF_80387_REGISTERS];
+    DWORD   Cr0NpxState;
+} FLOATING_SAVE_AREA;
+
+typedef struct
+{
+    DWORD   ContextFlags;
+
+    /* These are selected by CONTEXT_DEBUG_REGISTERS */
+    DWORD   Dr0;
+    DWORD   Dr1;
+    DWORD   Dr2;
+    DWORD   Dr3;
+    DWORD   Dr6;
+    DWORD   Dr7;
+
+    /* These are selected by CONTEXT_FLOATING_POINT */
+    FLOATING_SAVE_AREA FloatSave;
+
+    /* These are selected by CONTEXT_SEGMENTS */
+    DWORD   SegGs;
+    DWORD   SegFs;
+    DWORD   SegEs;
+    DWORD   SegDs;    
+
+    /* These are selected by CONTEXT_INTEGER */
+    DWORD   Edi;
+    DWORD   Esi;
+    DWORD   Ebx;
+    DWORD   Edx;    
+    DWORD   Ecx;
+    DWORD   Eax;
+
+    /* These are selected by CONTEXT_CONTROL */
+    DWORD   Ebp;    
+    DWORD   Eip;
+    DWORD   SegCs;
+    DWORD   EFlags;
+    DWORD   Esp;
+    DWORD   SegSs;
+} CONTEXT, *PCONTEXT;
+
+
+#ifdef __WINE__
+
+/* Macros for easier access to context registers */
+
+#define EAX_reg(context)     ((context)->Eax)
+#define EBX_reg(context)     ((context)->Ebx)
+#define ECX_reg(context)     ((context)->Ecx)
+#define EDX_reg(context)     ((context)->Edx)
+#define ESI_reg(context)     ((context)->Esi)
+#define EDI_reg(context)     ((context)->Edi)
+#define EBP_reg(context)     ((context)->Ebp)
+
+#define CS_reg(context)      ((context)->SegCs)
+#define DS_reg(context)      ((context)->SegDs)
+#define ES_reg(context)      ((context)->SegEs)
+#define FS_reg(context)      ((context)->SegFs)
+#define GS_reg(context)      ((context)->SegGs)
+#define SS_reg(context)      ((context)->SegSs)
+
+#define EFL_reg(context)     ((context)->EFlags)
+#define EIP_reg(context)     ((context)->Eip)
+#define ESP_reg(context)     ((context)->Esp)
+
+#define AX_reg(context)      (*(WORD*)&EAX_reg(context))
+#define BX_reg(context)      (*(WORD*)&EBX_reg(context))
+#define CX_reg(context)      (*(WORD*)&ECX_reg(context))
+#define DX_reg(context)      (*(WORD*)&EDX_reg(context))
+#define SI_reg(context)      (*(WORD*)&ESI_reg(context))
+#define DI_reg(context)      (*(WORD*)&EDI_reg(context))
+#define BP_reg(context)      (*(WORD*)&EBP_reg(context))
+
+#define AL_reg(context)      (*(BYTE*)&EAX_reg(context))
+#define AH_reg(context)      (*((BYTE*)&EAX_reg(context)+1))
+#define BL_reg(context)      (*(BYTE*)&EBX_reg(context))
+#define BH_reg(context)      (*((BYTE*)&EBX_reg(context)+1))
+#define CL_reg(context)      (*(BYTE*)&ECX_reg(context))
+#define CH_reg(context)      (*((BYTE*)&ECX_reg(context)+1))
+#define DL_reg(context)      (*(BYTE*)&EDX_reg(context))
+#define DH_reg(context)      (*((BYTE*)&EDX_reg(context)+1))
+                            
+#define IP_reg(context)      (*(WORD*)&EIP_reg(context))
+#define SP_reg(context)      (*(WORD*)&ESP_reg(context))
+                            
+#define FL_reg(context)      (*(WORD*)&EFL_reg(context))
+
+#define SET_CFLAG(context)   (EFL_reg(context) |= 0x0001)
+#define RESET_CFLAG(context) (EFL_reg(context) &= 0xfffffffe)
+
+#endif  /* __WINE__ */
+
 #endif  /* __WINE_WINNT_H */
diff --git a/include/wintypes.h b/include/wintypes.h
index 8565ad8..c6b69ab 100644
--- a/include/wintypes.h
+++ b/include/wintypes.h
@@ -93,7 +93,6 @@
 typedef WORD           *LPCATCHBUF;
 typedef DWORD           ACCESS_MASK;
 typedef ACCESS_MASK     REGSAM;
-typedef INT16           HFILE;
 typedef HANDLE32        HHOOK;
 typedef HANDLE32        HKEY;
 typedef HANDLE32        HMIXEROBJ;
@@ -138,6 +137,7 @@
 DECLARE_HANDLE(HDROP);
 DECLARE_HANDLE(HDRVR);
 DECLARE_HANDLE(HDWP);
+DECLARE_HANDLE(HFILE);
 DECLARE_HANDLE(HFONT);
 DECLARE_HANDLE(HGDIOBJ);
 DECLARE_HANDLE(HGLOBAL);
@@ -234,6 +234,7 @@
 DECL_WINELIB_TYPE(HDROP);
 DECL_WINELIB_TYPE(HDRVR);
 DECL_WINELIB_TYPE(HDWP);
+DECL_WINELIB_TYPE(HFILE);
 DECL_WINELIB_TYPE(HFONT);
 DECL_WINELIB_TYPE(HGDIOBJ);
 DECL_WINELIB_TYPE(HGLOBAL);
diff --git a/include/winuser.h b/include/winuser.h
deleted file mode 100644
index 9cd6041..0000000
--- a/include/winuser.h
+++ /dev/null
@@ -1,149 +0,0 @@
-/*
- * USER definitions
- *
- * Copyright 1996 Alexandre Julliard
- */
-
-#ifndef __WINE_WINUSER_H
-#define __WINE_WINUSER_H
-
-#include "wintypes.h"
-
-
-/* Window classes */
-
-typedef struct
-{
-    UINT32      style;
-    WNDPROC32   lpfnWndProc;
-    INT32       cbClsExtra;
-    INT32       cbWndExtra;
-    HINSTANCE32 hInstance;
-    HICON32     hIcon;
-    HCURSOR32   hCursor;
-    HBRUSH32    hbrBackground;
-    LPCSTR      lpszMenuName;
-    LPCSTR      lpszClassName;
-} WNDCLASS32A, *LPWNDCLASS32A;
-
-typedef struct
-{
-    UINT32      style;
-    WNDPROC32   lpfnWndProc;
-    INT32       cbClsExtra;
-    INT32       cbWndExtra;
-    HINSTANCE32 hInstance;
-    HICON32     hIcon;
-    HCURSOR32   hCursor;
-    HBRUSH32    hbrBackground;
-    LPCWSTR     lpszMenuName;
-    LPCWSTR     lpszClassName;
-} WNDCLASS32W, *LPWNDCLASS32W;
-
-#pragma pack(1)
-
-typedef struct
-{
-    UINT16      style;
-    WNDPROC16   lpfnWndProc WINE_PACKED;
-    INT16       cbClsExtra;
-    INT16       cbWndExtra;
-    HANDLE16    hInstance;
-    HICON16     hIcon;
-    HCURSOR16   hCursor;
-    HBRUSH16    hbrBackground;
-    SEGPTR      lpszMenuName WINE_PACKED;
-    SEGPTR      lpszClassName WINE_PACKED;
-} WNDCLASS16, *LPWNDCLASS16;
-
-#pragma pack(4)
-
-typedef struct
-{
-    UINT32      cbSize;
-    UINT32      style;
-    WNDPROC32   lpfnWndProc;
-    INT32       cbClsExtra;
-    INT32       cbWndExtra;
-    HINSTANCE32 hInstance;
-    HICON32     hIcon;
-    HCURSOR32   hCursor;
-    HBRUSH32    hbrBackground;
-    LPCSTR      lpszMenuName;
-    LPCSTR      lpszClassName;
-    HICON32     hIconSm;
-} WNDCLASSEX32A, *LPWNDCLASSEX32A;
-
-typedef struct
-{
-    UINT32      cbSize;
-    UINT32      style;
-    WNDPROC32   lpfnWndProc;
-    INT32       cbClsExtra;
-    INT32       cbWndExtra;
-    HINSTANCE32 hInstance;
-    HICON32     hIcon;
-    HCURSOR32   hCursor;
-    HBRUSH32    hbrBackground;
-    LPCWSTR     lpszMenuName;
-    LPCWSTR     lpszClassName;
-    HICON32     hIconSm;
-} WNDCLASSEX32W, *LPWNDCLASSEX32W;
-
-typedef struct
-{
-    UINT32      cbSize;
-    UINT32      style;
-    WNDPROC16   lpfnWndProc;
-    INT16       cbClsExtra;
-    INT16       cbWndExtra;
-    HANDLE16    hInstance;
-    HICON16     hIcon;
-    HCURSOR16   hCursor;
-    HBRUSH16    hbrBackground;
-    SEGPTR      lpszMenuName;
-    SEGPTR      lpszClassName;
-    HICON16     hIconSm;
-} WNDCLASSEX16, *LPWNDCLASSEX16;
-
-DECL_WINELIB_TYPE_AW(WNDCLASS);
-DECL_WINELIB_TYPE_AW(LPWNDCLASS);
-DECL_WINELIB_TYPE_AW(WNDCLASSEX);
-DECL_WINELIB_TYPE_AW(LPWNDCLASSEX);
-
-#define CS_VREDRAW          0x0001
-#define CS_HREDRAW          0x0002
-#define CS_KEYCVTWINDOW     0x0004
-#define CS_DBLCLKS          0x0008
-#define CS_OWNDC            0x0020
-#define CS_CLASSDC          0x0040
-#define CS_PARENTDC         0x0080
-#define CS_NOKEYCVT         0x0100
-#define CS_NOCLOSE          0x0200
-#define CS_SAVEBITS         0x0800
-#define CS_BYTEALIGNCLIENT  0x1000
-#define CS_BYTEALIGNWINDOW  0x2000
-#define CS_GLOBALCLASS      0x4000
-
-  /* Offsets for GetClassLong() and GetClassWord() */
-#define GCL_MENUNAME        (-8)
-#define GCW_HBRBACKGROUND   (-10)
-#define GCL_HBRBACKGROUND   GCW_HBRBACKGROUND
-#define GCW_HCURSOR         (-12)
-#define GCL_HCURSOR         GCW_HCURSOR
-#define GCW_HICON           (-14)
-#define GCL_HICON           GCW_HICON
-#define GCW_HMODULE         (-16)
-#define GCL_HMODULE         GCW_HMODULE
-#define GCW_CBWNDEXTRA      (-18)
-#define GCL_CBWNDEXTRA      GCW_CBWNDEXTRA
-#define GCW_CBCLSEXTRA      (-20)
-#define GCL_CBCLSEXTRA      GCW_CBCLSEXTRA
-#define GCL_WNDPROC         (-24)
-#define GCW_STYLE           (-26)
-#define GCL_STYLE           GCW_STYLE
-#define GCW_ATOM            (-32)
-#define GCW_HICONSM         (-34)
-#define GCL_HICONSM         GCW_HICONSM
-
-#endif  /* __WINE_WINUSER_H */
diff --git a/library/miscstubs.c b/library/miscstubs.c
index 6a7cda1..e9c377f 100644
--- a/library/miscstubs.c
+++ b/library/miscstubs.c
@@ -11,7 +11,6 @@
 #include "dde_mem.h"
 #include "global.h"
 #include "debug.h"
-#include "xmalloc.h"
 
 void SIGNAL_MaskAsyncEvents( BOOL32 mask )
 {
@@ -46,7 +45,6 @@
   }
 }
 
-extern LRESULT AboutDlgProc(HWND,UINT,WPARAM16,LPARAM);
 extern LRESULT ColorDlgProc(HWND,UINT,WPARAM16,LPARAM);
 extern LRESULT ComboBoxWndProc(HWND,UINT,WPARAM16,LPARAM);
 extern LRESULT ComboLBoxWndProc(HWND,UINT,WPARAM16,LPARAM);
@@ -61,7 +59,6 @@
 extern LRESULT ReplaceTextDlgProc(HWND,UINT,WPARAM16,LPARAM);
 extern LRESULT ScrollBarWndProc(HWND,UINT,WPARAM16,LPARAM);
 extern LRESULT StaticWndProc(HWND,UINT,WPARAM16,LPARAM);
-extern LRESULT SystemMessageBoxProc(HWND,UINT,WPARAM16,LPARAM);
 extern LRESULT TASK_Reschedule(void);
 
 /***********************************************************************
@@ -72,7 +69,6 @@
 FARPROC16 MODULE_GetWndProcEntry16( char *name )
 {
 #define MAP_STR_TO_PROC(str,proc) if(!strcmp(name,str))return (FARPROC16)proc
-  MAP_STR_TO_PROC("AboutDlgProc",AboutDlgProc);
   MAP_STR_TO_PROC("ColorDlgProc",ColorDlgProc);
   MAP_STR_TO_PROC("ComboBoxWndProc",ComboBoxWndProc);
   MAP_STR_TO_PROC("ComboLBoxWndProc",ComboLBoxWndProc);
@@ -88,7 +84,6 @@
   MAP_STR_TO_PROC("ReplaceTextDlgProc",ReplaceTextDlgProc);
   MAP_STR_TO_PROC("ScrollBarWndProc",ScrollBarWndProc);
   MAP_STR_TO_PROC("StaticWndProc",StaticWndProc);
-  MAP_STR_TO_PROC("SystemMessageBoxProc",SystemMessageBoxProc);
   MAP_STR_TO_PROC("TASK_Reschedule",TASK_Reschedule);
   fprintf(stderr,"warning: No mapping for %s(), add one in library/miscstubs.c\n",name);
   return NULL;
diff --git a/library/winestub.c b/library/winestub.c
index 33992cd..d1c53e6 100644
--- a/library/winestub.c
+++ b/library/winestub.c
@@ -26,7 +26,7 @@
   for (i = 2; i < argc; i++) strcat(strcat(lpszCmdParam, " "), argv[i]);
 
   if(!MAIN_Init()) return 0; /* JBP: Needed for DosDrives[] structure, etc. */
-  hInstance = WinExec( *argv, SW_SHOWNORMAL );
+  hInstance = WinExec32( *argv, SW_SHOWNORMAL );
   TASK_Reschedule();
   InitApp( hInstance );
 
diff --git a/loader/Makefile.in b/loader/Makefile.in
index 2e38a37..39f2b30 100644
--- a/loader/Makefile.in
+++ b/loader/Makefile.in
@@ -6,7 +6,6 @@
 MODULE    = loader
 
 C_SRCS = \
-	builtin.c \
 	main.c \
 	module.c \
 	ne_image.c \
diff --git a/loader/main.c b/loader/main.c
index b14f691..9b13e8f 100644
--- a/loader/main.c
+++ b/loader/main.c
@@ -18,14 +18,13 @@
 #include "menu.h"
 #include "atom.h"
 #include "dialog.h"
-#include "directory.h"
 #include "drive.h"
 #include "queue.h"
 #include "syscolor.h"
 #include "sysmetrics.h"
+#include "file.h"
 #include "gdi.h"
 #include "heap.h"
-#include "debugger.h"
 #include "miscemu.h"
 #include "neexe.h"
 #include "options.h"
@@ -39,6 +38,9 @@
 #include "stddebug.h"
 #include "debug.h"
 
+#ifndef WINELIB
+#include "debugger.h"
+#endif
 
 /* Winelib run-time flag */
 #ifdef WINELIB
@@ -70,6 +72,9 @@
     /* Load the configuration file */
     if (!PROFILE_LoadWineIni()) return 0;
 
+      /* Initialize DOS memory */
+    if (!DOSMEM_Init()) return 0;
+
 #ifdef WINELIB
     /* Create USER and GDI heap */
     USER_HeapSel = GlobalAlloc16( GMEM_FIXED, 0x10000 );
@@ -83,15 +88,6 @@
     /* Create built-in modules */
     if (!BUILTIN_Init()) return 0;
 
-    /* Initialize interrupt vectors */
-    if (!INT_Init()) return 0;
-
-      /* Initialize DOS memory */
-    if (!DOSMEM_Init()) return 0;
-
-      /* Initialize the DOS interrupt */
-    if (!INT21_Init()) return 0;
-
       /* Initialize signal handling */
     if (!SIGNAL_Init()) return 0;
 
@@ -182,7 +178,7 @@
 
     for (i = 1; i < argc; i++)
     {
-        if ((handle = WinExec( argv[i], SW_SHOWNORMAL )) < 32)
+        if ((handle = WinExec32( argv[i], SW_SHOWNORMAL )) < 32)
         {
             fprintf(stderr, "wine: can't exec '%s': ", argv[i]);
             switch (handle)
diff --git a/loader/module.c b/loader/module.c
index ed35931..d49c705 100644
--- a/loader/module.c
+++ b/loader/module.c
@@ -15,28 +15,23 @@
 #include "dos_fs.h"
 #include "file.h"
 #include "global.h"
+#include "heap.h"
 #include "hook.h"
-#include "ldt.h"
 #include "module.h"
 #include "neexe.h"
-#include "registers.h"
+#include "selectors.h"
 #include "stackframe.h"
 #include "task.h"
 #include "toolhelp.h"
 #include "stddebug.h"
 #include "debug.h"
 #include "callback.h"
-#include "xmalloc.h"
 
 extern HINSTANCE16 PE_LoadModule( int fd, OFSTRUCT *ofs, LOADPARAMS* params );
 
 static HMODULE16 hFirstModule = 0;
 static HMODULE16 hCachedModule = 0;  /* Module cached by MODULE_OpenFile */
 
-#ifndef WINELIB
-static HGLOBAL16 hInitialStack32 = 0;
-#endif
-
 
 /***********************************************************************
  *           MODULE_GetPtr
@@ -281,8 +276,7 @@
 /***********************************************************************
  *           MODULE_CreateSegments
  */
-#ifndef WINELIB32
-static BOOL MODULE_CreateSegments( HMODULE16 hModule )
+static BOOL32 MODULE_CreateSegments( HMODULE16 hModule )
 {
     SEGTABLEENTRY *pSegment;
     NE_MODULE *pModule;
@@ -308,7 +302,6 @@
                             (pModule->dgroup - 1) * sizeof(SEGTABLEENTRY) : 0;
     return TRUE;
 }
-#endif
 
 
 /***********************************************************************
@@ -443,7 +436,7 @@
 /***********************************************************************
  *           MODULE_LoadExeHeader
  */
-static HMODULE16 MODULE_LoadExeHeader( HFILE hFile, OFSTRUCT *ofs )
+static HMODULE16 MODULE_LoadExeHeader( HFILE32 hFile, OFSTRUCT *ofs )
 {
     struct mz_header_s mz_header;
     struct ne_header_s ne_header;
@@ -459,15 +452,15 @@
        ((fastload && ((offset) >= fastload_offset) && \
          ((offset)+(size) <= fastload_offset+fastload_length)) ? \
         (memcpy( buffer, fastload+(offset)-fastload_offset, (size) ), TRUE) : \
-        (_llseek( hFile, mz_header.ne_offset+(offset), SEEK_SET), \
+        (_llseek32( hFile, mz_header.ne_offset+(offset), SEEK_SET), \
          _lread32( hFile, (buffer), (size) ) == (size)))
 
-    _llseek( hFile, 0, SEEK_SET );
+    _llseek32( hFile, 0, SEEK_SET );
     if ((_lread32(hFile,&mz_header,sizeof(mz_header)) != sizeof(mz_header)) ||
         (mz_header.mz_magic != MZ_SIGNATURE))
         return (HMODULE16)11;  /* invalid exe */
 
-    _llseek( hFile, mz_header.ne_offset, SEEK_SET );
+    _llseek32( hFile, mz_header.ne_offset, SEEK_SET );
     if (_lread32( hFile, &ne_header, sizeof(ne_header) ) != sizeof(ne_header))
         return (HMODULE16)11;  /* invalid exe */
 
@@ -515,12 +508,12 @@
         fastload_length=ne_header.fastload_length<<ne_header.align_shift_count;
         dprintf_module( stddeb, "Using fast-load area offset=%x len=%d\n",
                         fastload_offset, fastload_length );
-        if ((fastload = (char *)xmalloc( fastload_length )) != NULL)
+        if ((fastload = HeapAlloc( SystemHeap, 0, fastload_length )) != NULL)
         {
-            _llseek( hFile, mz_header.ne_offset + fastload_offset, SEEK_SET );
+            _llseek32( hFile, mz_header.ne_offset + fastload_offset, SEEK_SET);
             if (_lread32(hFile, fastload, fastload_length) != fastload_length)
             {
-                free( fastload );
+                HeapFree( SystemHeap, 0, fastload );
                 fastload = NULL;
             }
         }
@@ -537,7 +530,8 @@
     /* Get the segment table */
 
     pModule->seg_table = (int)pData - (int)pModule;
-    buffer = xmalloc( ne_header.n_segment_tab * sizeof(struct ne_segment_table_entry_s) );
+    buffer = HeapAlloc( SystemHeap, 0, ne_header.n_segment_tab *
+                                      sizeof(struct ne_segment_table_entry_s));
     if (buffer)
     {
         int i;
@@ -545,17 +539,24 @@
 
         if (!READ( ne_header.segment_tab_offset,
              ne_header.n_segment_tab * sizeof(struct ne_segment_table_entry_s),
-             buffer )) return (HMODULE16)11;  /* invalid exe */
+             buffer ))
+        {
+            HeapFree( SystemHeap, 0, buffer );
+            HeapFree( SystemHeap, 0, fastload );
+            GlobalFree16( hModule );
+            return (HMODULE16)11;  /* invalid exe */
+        }
         pSeg = (struct ne_segment_table_entry_s *)buffer;
         for (i = ne_header.n_segment_tab; i > 0; i--, pSeg++)
         {
             memcpy( pData, pSeg, sizeof(*pSeg) );
             pData += sizeof(SEGTABLEENTRY);
         }
-        free( buffer );
+        HeapFree( SystemHeap, 0, buffer );
     }
     else
     {
+        HeapFree( SystemHeap, 0, fastload );
         GlobalFree16( hModule );
         return (HMODULE16)11;  /* invalid exe */
     }
@@ -579,6 +580,7 @@
                ne_header.moduleref_tab_offset - ne_header.rname_tab_offset,
                pData ))
     {
+        HeapFree( SystemHeap, 0, fastload );
         GlobalFree16( hModule );
         return (HMODULE16)11;  /* invalid exe */
     }
@@ -591,7 +593,12 @@
         pModule->modref_table = (int)pData - (int)pModule;
         if (!READ( ne_header.moduleref_tab_offset,
                   ne_header.n_mod_ref_tab * sizeof(WORD),
-                  pData )) return (HMODULE16)11;  /* invalid exe */
+                  pData ))
+        {
+            HeapFree( SystemHeap, 0, fastload );
+            GlobalFree16( hModule );
+            return (HMODULE16)11;  /* invalid exe */
+        }
         pData += ne_header.n_mod_ref_tab * sizeof(WORD);
     }
     else pModule->modref_table = 0;  /* No module references */
@@ -603,6 +610,7 @@
                ne_header.entry_tab_offset - ne_header.iname_tab_offset,
                pData ))
     {
+        HeapFree( SystemHeap, 0, fastload );
         GlobalFree16( hModule );
         return (HMODULE16)11;  /* invalid exe */
     }
@@ -615,11 +623,17 @@
                ne_header.entry_tab_length,
                pData ))
     {
+        HeapFree( SystemHeap, 0, fastload );
         GlobalFree16( hModule );
         return (HMODULE16)11;  /* invalid exe */
     }
     pData += ne_header.entry_tab_length;
 
+    /* Free the fast-load area */
+
+#undef READ
+    HeapFree( SystemHeap, 0, fastload );
+
     /* Get the non-resident names table */
 
     if (ne_header.nrname_tab_length)
@@ -632,7 +646,7 @@
             return (HMODULE16)11;  /* invalid exe */
         }
         buffer = GlobalLock16( pModule->nrname_handle );
-        _llseek( hFile, ne_header.nrname_tab_offset, SEEK_SET );
+        _llseek32( hFile, ne_header.nrname_tab_offset, SEEK_SET );
         if (_lread32( hFile, buffer, ne_header.nrname_tab_length )
               != ne_header.nrname_tab_length)
         {
@@ -661,7 +675,6 @@
 
     MODULE_RegisterModule( pModule );
     return hModule;
-#undef READ
 }
 
 
@@ -1007,7 +1020,7 @@
     OFSTRUCT ofs;
 #ifndef WINELIB
     WORD *pModRef, *pDLLs;
-    HFILE hFile;
+    HFILE32 hFile;
     int i;
 
     hModule = MODULE_FindModule( name );
@@ -1017,7 +1030,7 @@
         /* Try to load the built-in first if not disabled */
         if ((hModule = BUILTIN_LoadModule( name, FALSE ))) return hModule;
 
-        if ((hFile = OpenFile( name, &ofs, OF_READ )) == HFILE_ERROR)
+        if ((hFile = OpenFile32( name, &ofs, OF_READ )) == HFILE_ERROR32)
         {
             /* Now try the built-in even if disabled */
             if ((hModule = BUILTIN_LoadModule( name, TRUE )))
@@ -1035,7 +1048,7 @@
         {
             /* FIXME: Hack because PE_LoadModule is recursive */
             int fd = dup( FILE_GetUnixHandle(hFile) );
-            _lclose( hFile );
+            _lclose32( hFile );
             if (hModule == 21) hModule = PE_LoadModule( fd, &ofs, paramBlock );
             close( fd );
             if (hModule < 32)
@@ -1043,7 +1056,7 @@
                          name, hModule );
             return hModule;
         }
-        _lclose( hFile );
+        _lclose32( hFile );
         pModule = MODULE_GetPtr( hModule );
 
           /* Allocate the segments for this module */
@@ -1101,7 +1114,8 @@
 
 	if (pModule->flags & NE_FFLAGS_SELFLOAD)
 	{
-                HFILE hf;
+                HFILE32 hf;
+                HGLOBAL16 hInitialStack32 = 0;
 		/* Handle self loading modules */
 		SEGTABLEENTRY * pSegTable = (SEGTABLEENTRY *) NE_SEG_TABLE(pModule);
 		SELFLOADHEADER *selfloadheader;
@@ -1139,17 +1153,17 @@
                 stack16Top->ip = 0;
                 stack16Top->cs = 0;
 
-		if (!IF1632_Stack32_base) {
+		if (!IF1632_Saved32_esp)
+                {
 		  STACK32FRAME* frame32;
 		  char *stack32Top;
 		  /* Setup an initial 32 bit stack frame */
-		  hInitialStack32 =  GLOBAL_Alloc( GMEM_FIXED, 0x10000,
+		  hInitialStack32 = GLOBAL_Alloc( GMEM_FIXED, 0x10000,
 						  hModule, FALSE, FALSE, 
 						  FALSE );
 
 		  /* Create the 32-bit stack frame */
 		  
-		  *(DWORD *)GlobalLock16(hInitialStack32) = 0xDEADBEEF;
 		  stack32Top = (char*)GlobalLock16(hInitialStack32) + 
 		    0x10000;
 		  frame32 = (STACK32FRAME *)stack32Top - 1;
@@ -1163,20 +1177,19 @@
 		  frame32->retaddr = 0;
 		  frame32->codeselector = WINE_CODE_SELECTOR;
 		  /* pTask->esp = (DWORD)frame32; */
-		  IF1632_Stack32_base = WIN16_GlobalLock16(hInitialStack32);
-
 		}
                 hf = FILE_DupUnixHandle( MODULE_OpenFile( hModule ) );
 		CallTo16_word_ww( selfloadheader->BootApp, hModule, hf );
-                _lclose(hf);
+                _lclose32(hf);
 		/* some BootApp procs overwrite the selector of dgroup */
 		pSegTable[pModule->dgroup - 1].selector = saved_dgroup;
 		IF1632_Saved16_ss = oldss;
 		IF1632_Saved16_sp = oldsp;
 		for (i = 2; i <= pModule->seg_count; i++) NE_LoadSegment( hModule, i );
-		if (hInitialStack32){
+		if (hInitialStack32)
+                {
 		  GlobalFree16(hInitialStack32);
-		  IF1632_Stack32_base = hInitialStack32 = 0;
+		  hInitialStack32 = 0;
 		}
 	} 
 	else
@@ -1389,9 +1402,18 @@
 
 
 /***********************************************************************
- *           WinExec   (KERNEL.166)
+ *           WinExec16   (KERNEL.166)
  */
-HINSTANCE16 WinExec( LPSTR lpCmdLine, WORD nCmdShow )
+HINSTANCE16 WinExec16( LPCSTR lpCmdLine, UINT16 nCmdShow )
+{
+    return WinExec32( lpCmdLine, nCmdShow );
+}
+
+
+/***********************************************************************
+ *           WinExec32   (KERNEL32.566)
+ */
+HINSTANCE32 WinExec32( LPCSTR lpCmdLine, UINT32 nCmdShow )
 {
     LOADPARAMS params;
     HGLOBAL16 cmdShowHandle, cmdLineHandle;
diff --git a/loader/ne_image.c b/loader/ne_image.c
index 3bf7849..9bbdf21 100644
--- a/loader/ne_image.c
+++ b/loader/ne_image.c
@@ -68,7 +68,7 @@
  	SELFLOADHEADER *selfloadheader;
         STACK16FRAME *stack16Top;
  	WORD oldss, oldsp, oldselector, newselector;
-        HFILE hf = FILE_DupUnixHandle( fd );
+        HFILE32 hf = FILE_DupUnixHandle( fd );
 
  	selfloadheader = (SELFLOADHEADER *)
  		PTR_SEG_OFF_TO_LIN(pSegTable->selector,0);
@@ -89,7 +89,7 @@
         stack16Top->cs = 0;
  	newselector =  CallTo16_word_www( selfloadheader->LoadAppSeg,
                                           hModule, hf, segnum );
-        _lclose( hf );
+        _lclose32( hf );
  	if (newselector != oldselector) {
  	  /* Self loaders like creating their own selectors; 
  	   * they love asking for trouble to Wine developers
diff --git a/loader/ne_resource.c b/loader/ne_resource.c
index cd18408..5da7e3d 100644
--- a/loader/ne_resource.c
+++ b/loader/ne_resource.c
@@ -234,7 +234,7 @@
 int NE_AccessResource( HMODULE16 hModule, HRSRC16 hRsrc )
 {
     NE_NAMEINFO *pNameInfo=NULL;
-    int fd;
+    HFILE32 fd;
 
     NE_MODULE *pModule = MODULE_GetPtr( hModule );
     if (!pModule || !pModule->res_table) return -1;
@@ -242,10 +242,10 @@
     pNameInfo = (NE_NAMEINFO*)((char*)pModule + hRsrc);
 #endif
 
-    if ((fd = _lopen( NE_MODULE_NAME(pModule), OF_READ )) != -1)
+    if ((fd = _lopen32( NE_MODULE_NAME(pModule), OF_READ )) != -1)
     {
         WORD sizeShift = *(WORD *)((char *)pModule + pModule->res_table);
-        _llseek( fd, (int)pNameInfo->offset << sizeShift, SEEK_SET );
+        _llseek32( fd, (int)pNameInfo->offset << sizeShift, SEEK_SET );
     }
     return fd;
 }
diff --git a/loader/pe_image.c b/loader/pe_image.c
index b8c321e..7f58b4d 100644
--- a/loader/pe_image.c
+++ b/loader/pe_image.c
@@ -28,7 +28,6 @@
 #include "global.h"
 #include "task.h"
 #include "ldt.h"
-#include "registers.h"
 #include "stddebug.h"
 #include "debug.h"
 #include "debugger.h"
@@ -419,7 +418,8 @@
 	load_addr = pe->load_addr = (int)xmalloc(pe->vma_size);
 	dprintf_win32(stddeb, "Load addr is really %x, range %x\n",
 		pe->load_addr, pe->vma_size);
-
+	
+	memset( (void *)load_addr, 0, pe->vma_size);
 
 	for(i=0; i < pe->pe_header->coff.NumberOfSections; i++)
 	{
@@ -575,7 +575,6 @@
 }
 
 HINSTANCE16 MODULE_CreateInstance(HMODULE16 hModule,LOADPARAMS *params);
-void InitTask( SIGCONTEXT *context );
 
 HINSTANCE16 PE_LoadModule( int fd, OFSTRUCT *ofs, LOADPARAMS* params )
 {
@@ -636,49 +635,6 @@
     }
 }
 
-
-/* FIXME: This stuff is all on a "well it works" basis. An implementation
-based on some kind of documentation would be greatly appreciated :-) */
-
-typedef struct _TEB
-{
-    void        *Except;	/* 00 */
-    void        *stack;		/* 04 */
-    int	        dummy1[4];	/* 08 */
-    struct _TEB *TEBDSAlias;	/* 18 */
-    int	        dummy2[2];	/* 1C */
-    int	        taskid;		/* 24 */
-    int		dummy3[2];	/* 28 */
-    LPBYTE	process;	/* 30 */ /* points to current process struct */
-} TEB;
-
-/* the current process structure. Only the processheap is of interest (off 0x18) */
-struct {
-	DWORD		dummy[6];
-	HANDLE32	procheap; /* 18: Process Heap */
-} dummyprocess;
-
-void PE_InitTEB(int hTEB)
-{
-    TDB *pTask;
-    TEB *pTEB;
-
-    pTask = (TDB *)(GlobalLock16(GetCurrentTask() & 0xffff));
-    pTEB  = (TEB *)(GlobalLock16(hTEB));
-    pTEB->stack = (void *)pTask->esp;
-    pTEB->Except = (void *)(-1); 
-    pTEB->TEBDSAlias = pTEB;
-    pTEB->taskid = getpid();
-
-    dummyprocess.procheap = GetProcessHeap();
-    pTEB->process = &dummyprocess;
-}
-
-VOID
-NtCurrentTeb(CONTEXT *context) {
-	context->Eax = GlobalLock16(LOWORD(context->SegFs));
-}
-
 void PE_InitializeDLLs(HMODULE16 hModule)
 {
 	NE_MODULE *pModule;
diff --git a/loader/signal.c b/loader/signal.c
index 9d11530..e88fada 100644
--- a/loader/signal.c
+++ b/loader/signal.c
@@ -22,9 +22,8 @@
 #endif
 
 #include "debugger.h"
-#include "miscemu.h"
 #include "options.h"
-#include "registers.h"
+#include "sigcontext.h"
 #include "win.h"
 #include "winsock.h"
 
@@ -51,6 +50,7 @@
 }
 #endif
 
+extern BOOL32 INSTR_EmulateInstruction( SIGCONTEXT *context );
 
 /**********************************************************************
  *		wine_timer
@@ -139,17 +139,17 @@
 static void SIGNAL_fault(int signal, int code, SIGCONTEXT *context)
 {
 #endif
-    if (CS_reg(context) == WINE_CODE_SELECTOR)
+    if (CS_sig(context) == WINE_CODE_SELECTOR)
     {
         fprintf( stderr, "Segmentation fault in Wine program (%x:%lx)."
                          "  Please debug.\n",
-                 CS_reg(context), EIP_reg(context) );
+                 CS_sig(context), EIP_sig(context) );
     }
     else
     {
         if (INSTR_EmulateInstruction( context )) return;
         fprintf( stderr, "Segmentation fault in Windows program %x:%lx.\n",
-                 CS_reg(context), EIP_reg(context) );
+                 CS_sig(context), EIP_sig(context) );
     }
     wine_debug( signal, context );
 }
diff --git a/loader/task.c b/loader/task.c
index 1795097..9443dfa 100644
--- a/loader/task.c
+++ b/loader/task.c
@@ -11,10 +11,8 @@
 #include "windows.h"
 #include "task.h"
 #include "callback.h"
-#include "directory.h"
 #include "dos_fs.h"
 #include "file.h"
-#include "debugger.h"
 #include "global.h"
 #include "instance.h"
 #include "message.h"
@@ -24,19 +22,24 @@
 #include "options.h"
 #include "peexe.h"
 #include "pe_image.h"
+#include "process.h"
 #include "queue.h"
+#include "selectors.h"
 #include "stackframe.h"
+#include "thread.h"
 #include "toolhelp.h"
+#include "winnt.h"
 #include "stddebug.h"
 #include "debug.h"
 #include "dde_proc.h"
 
+#ifndef WINELIB
+#include "debugger.h"
+#endif
+
   /* Min. number of thunks allocated when creating a new segment */
 #define MIN_THUNKS  32
 
-  /* 32-bit stack size for each task */
-#define STACK32_SIZE 0x10000
-
 extern void USER_AppExit( HTASK16, HINSTANCE16, HQUEUE16 );
 
   /* Saved 16-bit stack for current process (Win16 only) */
@@ -45,7 +48,6 @@
 
   /* Saved 32-bit stack for current process (Win16 only) */
 DWORD IF1632_Saved32_esp = 0;
-SEGPTR IF1632_Stack32_base = 0;
 
   /* Original Unix stack */
 DWORD IF1632_Original32_esp;
@@ -279,7 +281,6 @@
  *
  * Allocate a thunk for MakeProcInstance().
  */
-#ifndef WINELIB32
 static SEGPTR TASK_AllocThunk( HTASK16 hTask )
 {
     TDB *pTask;
@@ -308,7 +309,6 @@
     pThunk->free = *(WORD *)((BYTE *)pThunk + pThunk->free);
     return PTR_SEG_OFF_TO_SEGPTR( sel, base );
 }
-#endif
 
 
 /***********************************************************************
@@ -316,7 +316,6 @@
  *
  * Free a MakeProcInstance() thunk.
  */
-#ifndef WINELIB32
 static BOOL TASK_FreeThunk( HTASK16 hTask, SEGPTR thunk )
 {
     TDB *pTask;
@@ -338,7 +337,6 @@
     pThunk->free = LOWORD(thunk) - base;
     return TRUE;
 }
-#endif
 
 
 /***********************************************************************
@@ -350,7 +348,7 @@
 #ifndef WINELIB
 static void TASK_CallToStart(void)
 {
-    int cs_reg, ds_reg, fs_reg, ip_reg;
+    int cs_reg, ds_reg, ip_reg;
     int exit_code = 1;
     TDB *pTask = (TDB *)GlobalLock16( hCurrentTask );
     NE_MODULE *pModule = MODULE_GetPtr( pTask->hModule );
@@ -363,15 +361,12 @@
     {
         /* FIXME: all this is an ugly hack */
 
-        extern void PE_InitTEB( int hTEB );
-        extern void InitTask( SIGCONTEXT *context );
+        extern void InitTask( CONTEXT *context );
         extern void PE_InitializeDLLs( HMODULE16 hModule );
 
         InitTask( NULL );
         InitApp( pTask->hModule );
-        fs_reg = (int)GlobalAlloc16( GMEM_FIXED | GMEM_ZEROINIT, 0x10000 );
-        PE_InitTEB( fs_reg );
-        __asm__ __volatile__("movw %w0,%%fs"::"r" (fs_reg));
+        __asm__ __volatile__("movw %w0,%%fs"::"r" (pCurrentThread->teb_sel));
         PE_InitializeDLLs( pTask->hModule );
         exit_code = CallTaskStart32((FARPROC32)(pModule->pe_module->load_addr + 
                 pModule->pe_module->pe_header->opt_coff.AddressOfEntryPoint) );
@@ -421,6 +416,7 @@
 {
     HTASK16 hTask;
     TDB *pTask;
+    PDB32 *pdb32;
     HGLOBAL16 hParentEnv;
     NE_MODULE *pModule;
     SEGTABLEENTRY *pSegTable;
@@ -505,10 +501,10 @@
     pTask->pdb.dispatcher[0] = 0x9a;  /* ljmp */
 #ifndef WINELIB
     *(FARPROC16 *)&pTask->pdb.dispatcher[1] = MODULE_GetEntryPoint( GetModuleHandle("KERNEL"), 102 );  /* KERNEL.102 is DOS3Call() */
+#endif
     pTask->pdb.savedint22 = INT_GetHandler( 0x22 );
     pTask->pdb.savedint23 = INT_GetHandler( 0x23 );
     pTask->pdb.savedint24 = INT_GetHandler( 0x24 );
-#endif
     pTask->pdb.fileHandlesPtr =
         PTR_SEG_OFF_TO_SEGPTR( GlobalHandleToSel(pTask->hPDB),
                                (int)&((PDB *)0)->fileHandles );
@@ -537,15 +533,14 @@
     pTask->dta = PTR_SEG_OFF_TO_SEGPTR( pTask->hPDB, 
                                 (int)&pTask->pdb.cmdLine - (int)&pTask->pdb );
 
-      /* Allocate the 32-bit stack */
+    /* Create the Win32 part of the task */
 
-    pTask->hStack32 = GLOBAL_Alloc( GMEM_FIXED, STACK32_SIZE, pTask->hPDB,
-                                    FALSE, FALSE, FALSE );
+    pdb32 = PROCESS_Create();
+    pTask->thdb = THREAD_Create( pdb32, 0 );
 
-      /* Create the 32-bit stack frame */
+    /* Create the 32-bit stack frame */
 
-    *(DWORD *)GlobalLock16(pTask->hStack32) = 0xDEADBEEF;
-    stack32Top = (char*)GlobalLock16(pTask->hStack32) + STACK32_SIZE;
+    stack32Top = (char*)pTask->thdb->teb.stack_top;
     frame32 = (STACK32FRAME *)stack32Top - 1;
     frame32->saved_esp = (DWORD)stack32Top;
     frame32->edi = 0;
@@ -633,14 +628,15 @@
     if (!(pTask = (TDB *)GlobalLock16( hTask ))) return;
     hPDB = pTask->hPDB;
 
+    /* Delete the Win32 part of the task */
+
+    PROCESS_Destroy( &pTask->thdb->process->header );
+    THREAD_Destroy( &pTask->thdb->header );
+
     /* Free the task module */
 
     FreeModule16( pTask->hModule );
 
-    /* Close all open files of this task */
-
-    FILE_CloseAllFiles( pTask->hPDB );
-
     /* Free the selector aliases */
 
     GLOBAL_FreeBlock( pTask->hCSAlias );
@@ -667,10 +663,10 @@
  */
 void TASK_KillCurrentTask( INT16 exitCode )
 {
-    extern void EXEC_ExitWindows( int retCode );
+    extern void EXEC_ExitWindows(void);
 
     TDB* pTask = (TDB*) GlobalLock16( hCurrentTask );
-    if (!pTask) EXEC_ExitWindows(0);  /* No current task yet */
+    if (!pTask) EXEC_ExitWindows();  /* No current task yet */
 
     /* Perform USER cleanup */
 
@@ -686,7 +682,7 @@
     if (nTaskCount <= 1)
     {
         dprintf_task( stddeb, "Killing the last task, exiting\n" );
-        EXEC_ExitWindows( 0 );
+        EXEC_ExitWindows();
     }
 
     /* Remove the task from the list to be sure we never switch back to it */
@@ -714,29 +710,6 @@
 }
 
 /***********************************************************************
- *           TASK_YieldToSystem
- *
- * Scheduler interface, this way we ensure that all "unsafe" events are
- * processed outside the scheduler.
- */
-void TASK_YieldToSystem(TDB* pTask)
-{
-  MESSAGEQUEUE*		pQ;
-
-  TASK_SCHEDULE();
-
-  if( pTask )
-  {
-    pQ = (MESSAGEQUEUE*)GlobalLock16(pTask->hQueue);
-    if( pQ && pQ->flags & QUEUE_FLAG_XEVENT )
-    {
-      pQ->flags &= ~QUEUE_FLAG_XEVENT;
-      EVENT_WaitXEvent( FALSE, FALSE );
-    }
-  }
-}
-
-/***********************************************************************
  *           TASK_Reschedule
  *
  * This is where all the magic of task-switching happens!
@@ -830,21 +803,42 @@
       /* Switch to the new stack */
 
     hCurrentTask = hTask;
+    pCurrentThread = pNewTask->thdb;
+    pCurrentProcess = pCurrentThread->process;
     IF1632_Saved16_ss   = pNewTask->ss;
     IF1632_Saved16_sp   = pNewTask->sp;
     IF1632_Saved32_esp  = pNewTask->esp;
-    IF1632_Stack32_base = WIN16_GlobalLock16( pNewTask->hStack32 );
+}
+
+
+/***********************************************************************
+ *           TASK_YieldToSystem
+ *
+ * Scheduler interface, this way we ensure that all "unsafe" events are
+ * processed outside the scheduler.
+ */
+void TASK_YieldToSystem(TDB* pTask)
+{
+  MESSAGEQUEUE*		pQ;
+
+  TASK_SCHEDULE();
+
+  if( pTask )
+  {
+    pQ = (MESSAGEQUEUE*)GlobalLock16(pTask->hQueue);
+    if( pQ && pQ->flags & QUEUE_FLAG_XEVENT )
+    {
+      pQ->flags &= ~QUEUE_FLAG_XEVENT;
+      EVENT_WaitXEvent( FALSE, FALSE );
+    }
+  }
 }
 
 
 /***********************************************************************
  *           InitTask  (KERNEL.91)
  */
-#ifdef WINELIB
-void InitTask(void)
-#else
-void InitTask( SIGCONTEXT *context )
-#endif
+void InitTask( CONTEXT *context )
 {
     TDB *pTask;
     NE_MODULE *pModule;
@@ -852,14 +846,13 @@
     INSTANCEDATA *pinstance;
     LONG stacklow, stackhi;
 
-#ifndef WINELIB
     if (context) EAX_reg(context) = 0;
-#endif
     if (!(pTask = (TDB *)GlobalLock16( hCurrentTask ))) return;
     if (!(pModule = MODULE_GetPtr( pTask->hModule ))) return;
 
 #ifndef WINELIB
     NE_InitializeDLLs( pTask->hModule );
+#endif
 
     if (context)
     {
@@ -885,7 +878,6 @@
     {
         LocalInit( pTask->hInstance, 0, pModule->heap_size );
     }    
-#endif
 
     /* Initialize the INSTANCEDATA structure */
     pSegTable = NE_SEG_TABLE( pModule );
@@ -1039,12 +1031,10 @@
  */
 FARPROC16 MakeProcInstance16( FARPROC16 func, HANDLE16 hInstance )
 {
-#ifdef WINELIB
-    return func; /* func can be called directly in Winelib */
-#else
     BYTE *thunk;
     SEGPTR thunkaddr;
     
+    if (__winelib) return func; /* func can be called directly in Winelib */
     thunkaddr = TASK_AllocThunk( hCurrentTask );
     if (!thunkaddr) return (FARPROC16)0;
     thunk = PTR_SEG_TO_LIN( thunkaddr );
@@ -1058,7 +1048,6 @@
     *thunk++ = 0xea;    /* ljmp func */
     *(DWORD *)thunk = (DWORD)func;
     return (FARPROC16)thunkaddr;
-#endif
 }
 
 
@@ -1067,10 +1056,8 @@
  */
 void FreeProcInstance16( FARPROC16 func )
 {
-#ifndef WINELIB
     dprintf_task( stddeb, "FreeProcInstance(%08lx)\n", (DWORD)func );
-    TASK_FreeThunk( hCurrentTask, (SEGPTR)func );
-#endif
+    if (!__winelib) TASK_FreeThunk( hCurrentTask, (SEGPTR)func );
 }
 
 
@@ -1079,10 +1066,11 @@
  */
 HANDLE16 GetCodeHandle( FARPROC16 proc )
 {
-#ifndef WINELIB32
     HANDLE16 handle;
     BYTE *thunk = (BYTE *)PTR_SEG_TO_LIN( proc );
 
+    if (__winelib) return 0;
+
     /* Return the code segment containing 'proc'. */
     /* Not sure if this is really correct (shouldn't matter that much). */
 
@@ -1093,9 +1081,6 @@
         handle = GlobalHandle16( HIWORD(proc) );
 
     return handle;
-#else
-    return (HANDLE16)proc;
-#endif
 }
 
 
@@ -1174,7 +1159,7 @@
  *
  * Note: the function is declared as 'register' in the spec file in order
  * to make sure all registers are preserved, but we don't use them in any
- * way, so we don't need a SIGCONTEXT* argument.
+ * way, so we don't need a CONTEXT* argument.
  */
 void SwitchStackBack(void)
 {
@@ -1217,7 +1202,7 @@
  *           GetTaskQueueDS  (KERNEL.118)
  */
 #ifndef WINELIB
-void GetTaskQueueDS( SIGCONTEXT *context )
+void GetTaskQueueDS( CONTEXT *context )
 {
     DS_reg(context) = GlobalHandleToSel( GetTaskQueue(0) );
 }
@@ -1228,7 +1213,7 @@
  *           GetTaskQueueES  (KERNEL.119)
  */
 #ifndef WINELIB
-void GetTaskQueueES( SIGCONTEXT *context )
+void GetTaskQueueES( CONTEXT *context )
 {
     ES_reg(context) = GlobalHandleToSel( GetTaskQueue(0) );
 }
diff --git a/memory/heap.c b/memory/heap.c
index 6924de4..39cf885 100644
--- a/memory/heap.c
+++ b/memory/heap.c
@@ -4,11 +4,11 @@
  * Copyright 1996 Alexandre Julliard
  */
 
+#include <assert.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
 #include "windows.h"
-#include "debugger.h"
 #include "selectors.h"
 #include "winbase.h"
 #include "winerror.h"
@@ -187,7 +187,7 @@
     if (debugging_heap && !HeapValidate( heap, 0, NULL ))
     {
         HEAP_Dump( heapPtr );
-        DEBUG_EnterDebugger();
+        assert( FALSE );
         SetLastError( ERROR_INVALID_HANDLE );
         return NULL;
     }
@@ -1204,12 +1204,28 @@
 
 
 /***********************************************************************
+ *           HEAP_xalloc
+ *
+ * Same as HeapAlloc(), but die on failure.
+ */
+LPVOID HEAP_xalloc( HANDLE32 heap, DWORD flags, DWORD size )
+{
+    LPVOID p = HeapAlloc( heap, flags, size );
+    if (!p)
+    {
+        fprintf( stderr, "Virtual memory exhausted.\n" );
+        exit(1);
+    }
+    return p;
+}
+
+
+/***********************************************************************
  *           HEAP_strdupA
  */
 LPSTR HEAP_strdupA( HANDLE32 heap, DWORD flags, LPCSTR str )
 {
-    INT32 len = lstrlen32A(str) + 1;
-    LPSTR p = HeapAlloc( heap, flags, len );
+    LPSTR p = HEAP_xalloc( heap, flags, lstrlen32A(str) + 1 );
     lstrcpy32A( p, str );
     return p;
 }
@@ -1221,7 +1237,7 @@
 LPWSTR HEAP_strdupW( HANDLE32 heap, DWORD flags, LPCWSTR str )
 {
     INT32 len = lstrlen32W(str) + 1;
-    LPWSTR p = HeapAlloc( heap, flags, len * sizeof(WCHAR) );
+    LPWSTR p = HEAP_xalloc( heap, flags, len * sizeof(WCHAR) );
     lstrcpy32W( p, str );
     return p;
 }
@@ -1235,11 +1251,7 @@
     LPWSTR ret;
 
     if (!str) return NULL;
-    if (!(ret = HeapAlloc( heap, flags, (lstrlen32A(str)+1) * sizeof(WCHAR) )))
-    {
-        fprintf( stderr, "Virtual memory exhausted.\n" );
-        exit(1);
-    }
+    ret = HEAP_xalloc( heap, flags, (lstrlen32A(str)+1) * sizeof(WCHAR) );
     lstrcpyAtoW( ret, str );
     return ret;
 }
@@ -1253,11 +1265,7 @@
     LPSTR ret;
 
     if (!str) return NULL;
-    if (!(ret = HeapAlloc( heap, flags, lstrlen32W(str) + 1 )))
-    {
-        fprintf( stderr, "Virtual memory exhausted.\n" );
-        exit(1);
-    }
+    ret = HEAP_xalloc( heap, flags, lstrlen32W(str) + 1 );
     lstrcpyWtoA( ret, str );
     return ret;
 }
diff --git a/memory/selector.c b/memory/selector.c
index 411186a..49a1309 100644
--- a/memory/selector.c
+++ b/memory/selector.c
@@ -271,14 +271,11 @@
 
     base = GET_SEL_BASE(sel);
 
-#ifndef WINELIB
     /* if base points into DOSMEM, assume we have to
      * return pointer into physical lower 1MB
      */
-    if ((base >=  (DWORD)DOSMEM_dosmem)  &&
-        (base <  ((DWORD)DOSMEM_dosmem+0x100000))) 
-    	base = base - (DWORD)DOSMEM_dosmem;
-#endif
+    if ((base >= (DWORD)DOSMEM_dosmem) &&
+        (base < (DWORD)DOSMEM_dosmem+0x100000)) base -= (DWORD)DOSMEM_dosmem;
     return base;
 }
 
diff --git a/misc/Makefile.in b/misc/Makefile.in
index 6e34b27..702bb00 100644
--- a/misc/Makefile.in
+++ b/misc/Makefile.in
@@ -11,6 +11,7 @@
 	commdlg.c \
 	compobj.c \
 	crtdll.c \
+	cpu.c \
 	driver.c \
 	exec.c \
 	escape.c \
diff --git a/misc/comm.c b/misc/comm.c
index ea2735d..91b2161 100644
--- a/misc/comm.c
+++ b/misc/comm.c
@@ -739,7 +739,7 @@
 {
     	dprintf_comm(stddeb,"SetCommEventMask:fd %d,mask %d\n",fd,fuEvtMask);
 	eventmask |= fuEvtMask;
-	return (UINT *)&eventmask;	/* FIXME, should be SEGPTR */
+	return (UINT16 *)&eventmask;	/* FIXME, should be SEGPTR */
 }
 
 /*****************************************************************************
diff --git a/misc/commdlg.c b/misc/commdlg.c
index 42845d5..1b55460 100644
--- a/misc/commdlg.c
+++ b/misc/commdlg.c
@@ -12,6 +12,7 @@
 #include "heap.h"
 #include "message.h"
 #include "commdlg.h"
+#include "dialog.h"
 #include "dlgs.h"
 #include "module.h"
 #include "resource.h"
@@ -59,13 +60,22 @@
 BOOL GetOpenFileName( SEGPTR ofn )
 {
     HINSTANCE16 hInst;
-    HANDLE16 hDlgTmpl, hResInfo;
-    BOOL bRet;
+    HANDLE16 hDlgTmpl = 0, hResInfo;
+    BOOL32 bRet = FALSE, win32Format = FALSE;
+    HWND32 hwndDialog;
     LPOPENFILENAME lpofn = (LPOPENFILENAME)PTR_SEG_TO_LIN(ofn);
+    LPCVOID template;
 
     if (!lpofn || !FileDlg_Init()) return FALSE;
 
-    if (lpofn->Flags & OFN_ENABLETEMPLATEHANDLE) hDlgTmpl = lpofn->hInstance;
+    if (lpofn->Flags & OFN_ENABLETEMPLATEHANDLE)
+    {
+        if (!(template = LockResource16( lpofn->hInstance )))
+        {
+            CommDlgLastError = CDERR_LOADRESFAILURE;
+            return FALSE;
+        }
+    }
     else if (lpofn->Flags & OFN_ENABLETEMPLATE)
     {
         if (!(hResInfo = FindResource16(lpofn->hInstance,
@@ -74,25 +84,27 @@
             CommDlgLastError = CDERR_FINDRESFAILURE;
             return FALSE;
         }
-        hDlgTmpl = LoadResource16( lpofn->hInstance, hResInfo );
+        if (!(hDlgTmpl = LoadResource16( lpofn->hInstance, hResInfo )) ||
+            !(template = LockResource16( hDlgTmpl )))
+        {
+            CommDlgLastError = CDERR_LOADRESFAILURE;
+            return FALSE;
+        }
     }
-    else hDlgTmpl = SYSRES_LoadResource( SYSRES_DIALOG_OPEN_FILE );
-    if (!hDlgTmpl)
+    else
     {
-        CommDlgLastError = CDERR_LOADRESFAILURE;
-        return FALSE;
+        template = SYSRES_GetResPtr( SYSRES_DIALOG_OPEN_FILE );
+        win32Format = TRUE;
     }
 
     hInst = WIN_GetWindowInstance( lpofn->hwndOwner );
-    bRet = DialogBoxIndirectParam16( hInst, hDlgTmpl, lpofn->hwndOwner,
-                        (DLGPROC16)MODULE_GetWndProcEntry16("FileOpenDlgProc"),
-                        ofn );
+    hwndDialog = DIALOG_CreateIndirect( hInst, template, win32Format,
+                                        lpofn->hwndOwner,
+                                        (DLGPROC16)MODULE_GetWndProcEntry16("FileOpenDlgProc"),
+                                        ofn, WIN_PROC_16 );
+    if (hwndDialog) bRet = DIALOG_DoDialogBox( hwndDialog, lpofn->hwndOwner );
 
-    if (!(lpofn->Flags & OFN_ENABLETEMPLATEHANDLE))
-    {
-        if (lpofn->Flags & OFN_ENABLETEMPLATE) FreeResource16( hDlgTmpl );
-        else SYSRES_FreeResource( hDlgTmpl );
-    }
+    if (hDlgTmpl) FreeResource16( hDlgTmpl );
 
     dprintf_commdlg(stddeb,"GetOpenFileName // return lpstrFile='%s' !\n", 
            (LPSTR)PTR_SEG_TO_LIN(lpofn->lpstrFile));
@@ -106,35 +118,53 @@
 BOOL GetSaveFileName( SEGPTR ofn)
 {
     HINSTANCE16 hInst;
-    HANDLE16 hDlgTmpl, hResInfo;
-    BOOL bRet;
+    HANDLE16 hDlgTmpl = 0;
+    BOOL32 bRet = FALSE, win32Format = FALSE;
     LPOPENFILENAME lpofn = (LPOPENFILENAME)PTR_SEG_TO_LIN(ofn);
-  
+    LPCVOID template;
+    HWND32 hwndDialog;
+
     if (!lpofn || !FileDlg_Init()) return FALSE;
 
-    if (lpofn->Flags & OFN_ENABLETEMPLATEHANDLE) hDlgTmpl = lpofn->hInstance;
+    if (lpofn->Flags & OFN_ENABLETEMPLATEHANDLE)
+    {
+        if (!(template = LockResource16( lpofn->hInstance )))
+        {
+            CommDlgLastError = CDERR_LOADRESFAILURE;
+            return FALSE;
+        }
+    }
     else if (lpofn->Flags & OFN_ENABLETEMPLATE)
     {
-        hInst = lpofn->hInstance;
+        HANDLE16 hResInfo;
         if (!(hResInfo = FindResource16(lpofn->hInstance,
-                                        lpofn->lpTemplateName, RT_DIALOG )))
+                                        lpofn->lpTemplateName, RT_DIALOG)))
         {
             CommDlgLastError = CDERR_FINDRESFAILURE;
             return FALSE;
         }
-        hDlgTmpl = LoadResource16( lpofn->hInstance, hResInfo );
+        if (!(hDlgTmpl = LoadResource16( lpofn->hInstance, hResInfo )) ||
+            !(template = LockResource16( hDlgTmpl )))
+        {
+            CommDlgLastError = CDERR_LOADRESFAILURE;
+            return FALSE;
+        }
     }
-    else hDlgTmpl = SYSRES_LoadResource( SYSRES_DIALOG_SAVE_FILE );
+    else
+    {
+        template = SYSRES_GetResPtr( SYSRES_DIALOG_SAVE_FILE );
+        win32Format = TRUE;
+    }
 
     hInst = WIN_GetWindowInstance( lpofn->hwndOwner );
-    bRet = DialogBoxIndirectParam16( hInst, hDlgTmpl, lpofn->hwndOwner,
-                        (DLGPROC16)MODULE_GetWndProcEntry16("FileSaveDlgProc"),
-                        ofn );
-    if (!(lpofn->Flags & OFN_ENABLETEMPLATEHANDLE))
-    {
-        if (lpofn->Flags & OFN_ENABLETEMPLATE) FreeResource16( hDlgTmpl );
-        else SYSRES_FreeResource( hDlgTmpl );
-    }
+
+    hwndDialog = DIALOG_CreateIndirect( hInst, template, win32Format,
+                                        lpofn->hwndOwner,
+                                        (DLGPROC16)MODULE_GetWndProcEntry16("FileSaveDlgProc"),
+                                        ofn, WIN_PROC_16 );
+    if (hwndDialog) bRet = DIALOG_DoDialogBox( hwndDialog, lpofn->hwndOwner );
+
+    if (hDlgTmpl) FreeResource16( hDlgTmpl );
 
     dprintf_commdlg(stddeb, "GetSaveFileName // return lpstrFile='%s' !\n", 
             (LPSTR)PTR_SEG_TO_LIN(lpofn->lpstrFile));
@@ -693,10 +723,9 @@
 /***********************************************************************
  *           FindTextDlg   (COMMDLG.11)
  */
-BOOL FindText( SEGPTR find )
+HWND16 FindText( SEGPTR find )
 {
-    HANDLE16 hInst, hDlgTmpl;
-    BOOL bRet;
+    HANDLE16 hInst;
     LPCVOID ptr;
     LPFINDREPLACE lpFind = (LPFINDREPLACE)PTR_SEG_TO_LIN(find);
 
@@ -708,25 +737,20 @@
      * FIXME : We should do error checking on the lpFind structure here
      * and make CommDlgExtendedError() return the error condition.
      */
-    hDlgTmpl = SYSRES_LoadResource( SYSRES_DIALOG_FIND_TEXT );
+    ptr = SYSRES_GetResPtr( SYSRES_DIALOG_FIND_TEXT );
     hInst = WIN_GetWindowInstance( lpFind->hwndOwner );
-    if (!(ptr = GlobalLock16( hDlgTmpl ))) return -1;
-    bRet = CreateDialogIndirectParam16( hInst, ptr, lpFind->hwndOwner,
+    return DIALOG_CreateIndirect( hInst, ptr, TRUE, lpFind->hwndOwner,
                         (DLGPROC16)MODULE_GetWndProcEntry16("FindTextDlgProc"),
-                        find );
-    GlobalUnlock16( hDlgTmpl );
-    SYSRES_FreeResource( hDlgTmpl );
-    return bRet;
+                                  find, WIN_PROC_16 );
 }
 
 
 /***********************************************************************
- *           ReplaceTextDlg   (COMMDLG.12)
+ *           ReplaceText   (COMMDLG.12)
  */
-BOOL ReplaceText( SEGPTR find )
+HWND16 ReplaceText( SEGPTR find )
 {
-    HANDLE16 hInst, hDlgTmpl;
-    BOOL bRet;
+    HANDLE16 hInst;
     LPCVOID ptr;
     LPFINDREPLACE lpFind = (LPFINDREPLACE)PTR_SEG_TO_LIN(find);
 
@@ -738,15 +762,11 @@
      * FIXME : We should do error checking on the lpFind structure here
      * and make CommDlgExtendedError() return the error condition.
      */
-    hDlgTmpl = SYSRES_LoadResource( SYSRES_DIALOG_REPLACE_TEXT );
+    ptr = SYSRES_GetResPtr( SYSRES_DIALOG_REPLACE_TEXT );
     hInst = WIN_GetWindowInstance( lpFind->hwndOwner );
-    if (!(ptr = GlobalLock16( hDlgTmpl ))) return -1;
-    bRet = CreateDialogIndirectParam16( hInst, ptr, lpFind->hwndOwner,
+    return DIALOG_CreateIndirect( hInst, ptr, TRUE, lpFind->hwndOwner,
                      (DLGPROC16)MODULE_GetWndProcEntry16("ReplaceTextDlgProc"),
-                     find );
-    GlobalUnlock16( hDlgTmpl );
-    SYSRES_FreeResource( hDlgTmpl );
-    return bRet;
+                                  find, WIN_PROC_16 );
 }
 
 
@@ -978,8 +998,10 @@
  */
 BOOL PrintDlg( SEGPTR printdlg )
 {
-    HANDLE16 hInst, hDlgTmpl;
-    BOOL bRet;
+    HANDLE16 hInst;
+    BOOL bRet = FALSE;
+    LPCVOID template;
+    HWND32 hwndDialog;
     LPPRINTDLG lpPrint = (LPPRINTDLG)PTR_SEG_TO_LIN(printdlg);
 
     dprintf_commdlg(stddeb,"PrintDlg(%p) // Flags=%08lX\n", lpPrint, lpPrint->Flags );
@@ -989,17 +1011,18 @@
         return TRUE;
 
     if (lpPrint->Flags & PD_PRINTSETUP)
-	hDlgTmpl = SYSRES_LoadResource( SYSRES_DIALOG_PRINT_SETUP );
+	template = SYSRES_GetResPtr( SYSRES_DIALOG_PRINT_SETUP );
     else
-	hDlgTmpl = SYSRES_LoadResource( SYSRES_DIALOG_PRINT );
+	template = SYSRES_GetResPtr( SYSRES_DIALOG_PRINT );
 
     hInst = WIN_GetWindowInstance( lpPrint->hwndOwner );
-    bRet = DialogBoxIndirectParam16( hInst, hDlgTmpl, lpPrint->hwndOwner,
+    hwndDialog = DIALOG_CreateIndirect( hInst, template, TRUE,
+                                        lpPrint->hwndOwner,
                                (DLGPROC16)((lpPrint->Flags & PD_PRINTSETUP) ?
                                 MODULE_GetWndProcEntry16("PrintSetupDlgProc") :
                                 MODULE_GetWndProcEntry16("PrintDlgProc")),
-                                printdlg );
-    SYSRES_FreeResource( hDlgTmpl );
+                                printdlg, WIN_PROC_16 );
+    if (hwndDialog) bRet = DIALOG_DoDialogBox( hwndDialog, lpPrint->hwndOwner);
     return bRet;
 }
 
@@ -1108,37 +1131,51 @@
 BOOL ChooseColor(LPCHOOSECOLOR lpChCol)
 {
     HINSTANCE16 hInst;
-    HANDLE16 hDlgTmpl, hResInfo;
-    BOOL bRet;
+    HANDLE16 hDlgTmpl = 0;
+    BOOL bRet = FALSE, win32Format = FALSE;
+    LPCVOID template;
+    HWND32 hwndDialog;
 
     dprintf_commdlg(stddeb,"ChooseColor\n");
     if (!lpChCol) return FALSE;    
-    if (lpChCol->Flags & CC_ENABLETEMPLATEHANDLE) hDlgTmpl = lpChCol->hInstance;
+
+    if (lpChCol->Flags & CC_ENABLETEMPLATEHANDLE)
+    {
+        if (!(template = LockResource16( lpChCol->hInstance )))
+        {
+            CommDlgLastError = CDERR_LOADRESFAILURE;
+            return FALSE;
+        }
+    }
     else if (lpChCol->Flags & CC_ENABLETEMPLATE)
     {
+        HANDLE16 hResInfo;
         if (!(hResInfo = FindResource16(lpChCol->hInstance,
                                         lpChCol->lpTemplateName, RT_DIALOG)))
         {
             CommDlgLastError = CDERR_FINDRESFAILURE;
             return FALSE;
         }
-        hDlgTmpl = LoadResource16( lpChCol->hInstance, hResInfo );
+        if (!(hDlgTmpl = LoadResource16( lpChCol->hInstance, hResInfo )) ||
+            !(template = LockResource16( hDlgTmpl )))
+        {
+            CommDlgLastError = CDERR_LOADRESFAILURE;
+            return FALSE;
+        }
     }
-    else hDlgTmpl = SYSRES_LoadResource( SYSRES_DIALOG_CHOOSE_COLOR );
-    if (!hDlgTmpl)
+    else
     {
-        CommDlgLastError = CDERR_LOADRESFAILURE;
-        return FALSE;
+        template = SYSRES_GetResPtr( SYSRES_DIALOG_CHOOSE_COLOR );
+        win32Format = TRUE;
     }
+
     hInst = WIN_GetWindowInstance( lpChCol->hwndOwner );
-    bRet = DialogBoxIndirectParam16( hInst, hDlgTmpl, lpChCol->hwndOwner,
+    hwndDialog = DIALOG_CreateIndirect( hInst, template, win32Format,
+                                        lpChCol->hwndOwner,
                            (DLGPROC16)MODULE_GetWndProcEntry16("ColorDlgProc"),
-                           (DWORD)lpChCol);
-    if (!(lpChCol->Flags & CC_ENABLETEMPLATEHANDLE))
-    {
-        if (lpChCol->Flags & CC_ENABLETEMPLATE) FreeResource16( hDlgTmpl );
-        else SYSRES_FreeResource( hDlgTmpl );
-    }
+                                        (DWORD)lpChCol, WIN_PROC_16 );
+    if (hwndDialog) bRet = DIALOG_DoDialogBox( hwndDialog, lpChCol->hwndOwner);
+    if (hDlgTmpl) FreeResource16( hDlgTmpl );
     return bRet;
 }
 
@@ -2189,37 +2226,52 @@
 BOOL ChooseFont(LPCHOOSEFONT lpChFont)
 {
     HINSTANCE16 hInst;
-    HANDLE16 hDlgTmpl, hResInfo;
-    BOOL bRet;
+    HANDLE16 hDlgTmpl = 0;
+    BOOL bRet = FALSE, win32Format = FALSE;
+    LPCVOID template;
+    HWND32 hwndDialog;
 
     dprintf_commdlg(stddeb,"ChooseFont\n");
     if (!lpChFont) return FALSE;    
-    if (lpChFont->Flags & CF_ENABLETEMPLATEHANDLE) hDlgTmpl = lpChFont->hInstance;
+
+    if (lpChFont->Flags & CF_ENABLETEMPLATEHANDLE)
+    {
+        if (!(template = LockResource16( lpChFont->hInstance )))
+        {
+            CommDlgLastError = CDERR_LOADRESFAILURE;
+            return FALSE;
+        }
+    }
     else if (lpChFont->Flags & CF_ENABLETEMPLATE)
     {
-        if (!(hResInfo = FindResource16(lpChFont->hInstance,
-                                        lpChFont->lpTemplateName, RT_DIALOG)))
+        HANDLE16 hResInfo;
+        if (!(hResInfo = FindResource16( lpChFont->hInstance,
+                                         lpChFont->lpTemplateName, RT_DIALOG)))
         {
             CommDlgLastError = CDERR_FINDRESFAILURE;
             return FALSE;
         }
-        hDlgTmpl = LoadResource16( lpChFont->hInstance, hResInfo );
+        if (!(hDlgTmpl = LoadResource16( lpChFont->hInstance, hResInfo )) ||
+            !(template = LockResource16( hDlgTmpl )))
+        {
+            CommDlgLastError = CDERR_LOADRESFAILURE;
+            return FALSE;
+        }
     }
-    else hDlgTmpl = SYSRES_LoadResource( SYSRES_DIALOG_CHOOSE_FONT );
-    if (!hDlgTmpl)
+    else
     {
-        CommDlgLastError = CDERR_LOADRESFAILURE;
-        return FALSE;
+        template = SYSRES_GetResPtr( SYSRES_DIALOG_CHOOSE_FONT );
+        win32Format = TRUE;
     }
+
     hInst = WIN_GetWindowInstance( lpChFont->hwndOwner );
-    bRet = DialogBoxIndirectParam16( hInst, hDlgTmpl, lpChFont->hwndOwner,
+
+    hwndDialog = DIALOG_CreateIndirect( hInst, template, win32Format,
+                                        lpChFont->hwndOwner,
                       (DLGPROC16)MODULE_GetWndProcEntry16("FormatCharDlgProc"),
-                      (DWORD)lpChFont);
-    if (!(lpChFont->Flags & CF_ENABLETEMPLATEHANDLE))
-    {
-        if (lpChFont->Flags & CF_ENABLETEMPLATE) FreeResource16( hDlgTmpl );
-        else SYSRES_FreeResource( hDlgTmpl );
-    }
+                                        (DWORD)lpChFont, WIN_PROC_16 );
+    if (hwndDialog) bRet = DIALOG_DoDialogBox(hwndDialog, lpChFont->hwndOwner);
+    if (hDlgTmpl) FreeResource16( hDlgTmpl );
     return bRet;
 }
 
diff --git a/miscemu/cpu.c b/misc/cpu.c
similarity index 83%
rename from miscemu/cpu.c
rename to misc/cpu.c
index 63211bd..f5d10e8 100644
--- a/miscemu/cpu.c
+++ b/misc/cpu.c
@@ -11,6 +11,9 @@
 
 int runtime_cpu (void)
 {
+#ifndef __i386__
+    return 5;  /* Might as well pretend to be a Pentium... */
+#else  /* __i386__ */
   static int cache = 0;
 
 #ifdef linux
@@ -37,8 +40,8 @@
 	}
     }
   return cache;
-#else
+#endif  /* linux */
   /* FIXME: how do we do this on other systems? */
   return 3;
-#endif
+#endif  /* __i386__ */
 }
diff --git a/misc/exec.c b/misc/exec.c
index c69416d..143dfe3 100644
--- a/misc/exec.c
+++ b/misc/exec.c
@@ -1,8 +1,8 @@
 /*
-*     Windows Exec & Help
-*
-*/
+ *     Windows Exec & Help
+ */
 
+#define NO_TRANSITION_TYPES  /* This file is Win32-clean */
 #include <stdlib.h>
 #include <stdio.h>
 #include <string.h>
@@ -15,21 +15,6 @@
 #include "debug.h"
 #include "win.h"
 
-#define HELP_CONTEXT      0x0001
-#define HELP_QUIT         0x0002
-#define HELP_INDEX        0x0003
-#define HELP_CONTENTS     0x0003
-#define HELP_HELPONHELP   0x0004
-#define HELP_SETINDEX     0x0005
-#define HELP_SETCONTENTS  0x0005
-#define HELP_CONTEXTPOPUP 0x0008
-#define HELP_FORCEFILE    0x0009
-#define HELP_KEY          0x0101
-#define HELP_COMMAND      0x0102
-#define HELP_PARTIALKEY   0x0105
-#define HELP_MULTIKEY     0x0201
-#define HELP_SETWINPOS    0x0203
-
 
 /***********************************************************************
  *           EXEC_ExitWindows
@@ -38,29 +23,35 @@
  * This is the back-end of ExitWindows(), called when all windows
  * have agreed to be terminated.
  */
-void EXEC_ExitWindows( int retCode )
+void EXEC_ExitWindows(void)
 {
     /* Do the clean-up stuff */
 
     WriteOutProfiles();
     SHELL_SaveRegistry();
 
-    exit( retCode );
+    exit(0);
 }
 
 
 /***********************************************************************
- *           ExitWindows   (USER.7)
+ *           ExitWindows16   (USER.7)
  */
-BOOL ExitWindows( DWORD dwReturnCode, WORD wReserved )
+BOOL16 ExitWindows16( DWORD dwReturnCode, UINT16 wReserved )
+{
+    return ExitWindowsEx( EWX_LOGOFF, 0xffffffff );
+}
+
+
+/***********************************************************************
+ *           ExitWindowsEx   (USER32.195)
+ */
+BOOL32 ExitWindowsEx( UINT32 flags, DWORD reserved )
 {
     int i;
-    BOOL16 result;
+    BOOL32 result;
     WND **list, **ppWnd;
         
-    api_assert("ExitWindows", wReserved == 0);
-    api_assert("ExitWindows", HIWORD(dwReturnCode) == 0);
-
     /* We have to build a list of all windows first, as in EnumWindows */
 
     if (!(list = WIN_BuildWinArray( WIN_GetDesktop() ))) return FALSE;
@@ -85,24 +76,35 @@
     }
     HeapFree( SystemHeap, 0, list );
 
-    if (result) EXEC_ExitWindows( LOWORD(dwReturnCode) );
+    if (result) EXEC_ExitWindows();
     return FALSE;
 }
 
 
 /**********************************************************************
- *				WinHelp		[USER.171]
+ *             WinHelp16   (USER.171)
  */
-BOOL WinHelp(HWND hWnd, LPSTR lpHelpFile, WORD wCommand, DWORD dwData)
+BOOL16 WinHelp16( HWND16 hWnd, LPCSTR lpHelpFile, UINT16 wCommand,
+                  DWORD dwData )
+{
+    return WinHelp32A( hWnd, lpHelpFile, wCommand,
+                       (DWORD)PTR_SEG_TO_LIN(dwData) );
+}
+
+
+/**********************************************************************
+ *             WinHelp32A   (USER32.578)
+ */
+BOOL32 WinHelp32A( HWND32 hWnd, LPCSTR lpHelpFile, UINT32 wCommand,
+                   DWORD dwData )
 {
 	static WORD WM_WINHELP=0;
-	HWND hDest;
+	HWND32 hDest;
 	LPWINHELP lpwh;
 	HGLOBAL16 hwh;
-	void *data=0;
 	int size,dsize,nlen;
         if (wCommand != HELP_QUIT)  /* FIXME */
-            if(WinExec("winhelp.exe -x",SW_SHOWNORMAL)<=32)
+            if(WinExec32("winhelp.exe -x",SW_SHOWNORMAL)<=32)
 		return FALSE;
 	/* FIXME: Should be directed yield, to let winhelp open the window */
 	Yield();
@@ -131,16 +133,13 @@
 		case HELP_KEY:
 		case HELP_PARTIALKEY:
 		case HELP_COMMAND:
-			data = PTR_SEG_TO_LIN(dwData);
-			dsize = strlen(data)+1;
+			dsize = strlen( (LPSTR)dwData )+1;
 			break;
 		case HELP_MULTIKEY:
-			data = PTR_SEG_TO_LIN(dwData);
-			dsize = ((LPMULTIKEYHELP)data) -> mkSize;
+			dsize = ((LPMULTIKEYHELP)dwData)->mkSize;
 			break;
 		case HELP_SETWINPOS:
-			data = PTR_SEG_TO_LIN(dwData);
-			dsize = ((LPHELPWININFO)data) -> wStructSize;
+			dsize = ((LPHELPWININFO)dwData)->wStructSize;
 			break;
 		default:
 			fprintf(stderr,"Unknown help command %d\n",wCommand);
@@ -160,10 +159,23 @@
 		strcpy(((char*)lpwh) + sizeof(WINHELP),lpHelpFile);
 	}
 	if(dsize) {
-		memcpy(((char*)lpwh)+sizeof(WINHELP)+nlen,data,dsize);
+		memcpy(((char*)lpwh)+sizeof(WINHELP)+nlen,(LPSTR)dwData,dsize);
 		lpwh->ofsData = sizeof(WINHELP)+nlen;
 	} else
 		lpwh->ofsData = 0;
 	GlobalUnlock16(hwh);
 	return SendMessage16(hDest,WM_WINHELP,hWnd,hwh);
 }
+
+
+/**********************************************************************
+ *             WinHelp32W   (USER32.579)
+ */
+BOOL32 WinHelp32W( HWND32 hWnd, LPCWSTR helpFile, UINT32 command,
+                   DWORD dwData )
+{
+    LPSTR file = HEAP_strdupWtoA( GetProcessHeap(), 0, helpFile );
+    BOOL32 ret = WinHelp32A( hWnd, file, command, dwData );
+    HeapFree( GetProcessHeap(), 0, file );
+    return ret;
+}
diff --git a/misc/lstr.c b/misc/lstr.c
index 82d68b0..730b540 100644
--- a/misc/lstr.c
+++ b/misc/lstr.c
@@ -12,12 +12,12 @@
 #include <ctype.h>
 
 #include "windows.h"
+#include "heap.h"
 #include "ldt.h"
 #include "module.h"
 #include "stddebug.h"
 #include "debug.h"
 #include "xmalloc.h"
-#include "string32.h"
 
 #define ToUpper(c)	toupper(c)
 #define ToLower(c)	tolower(c)
@@ -173,7 +173,7 @@
 void OutputDebugString( LPCSTR str )
 {
     char *module;
-    char *p, *buffer = xmalloc( strlen(str)+1 );
+    char *p, *buffer = HeapAlloc( GetProcessHeap(), 0, strlen(str)+1 );
     /* Remove CRs */
     for (p = buffer; *str; str++) if (*str != '\r') *p++ = *str;
     *p = '\0';
@@ -181,7 +181,7 @@
     module = MODULE_GetModuleName( GetExePtr(GetCurrentTask()) );
     fprintf( stderr, "OutputDebugString: %s says '%s'\n",
              module ? module : "???", buffer );
-    free( buffer );
+    HeapFree( GetProcessHeap(), 0, buffer );
 }
 
 /***********************************************************************
@@ -506,7 +506,7 @@
 		fprintf(stdnimp,"	- line wrapping not supported.\n");
 	from = NULL;
 	if (dwFlags & FORMAT_MESSAGE_FROM_STRING)
-		from = xstrdup((LPSTR)lpSource);
+		from = HEAP_strdupA( GetProcessHeap(), 0, (LPSTR)lpSource);
 	if (dwFlags & FORMAT_MESSAGE_FROM_SYSTEM) {
 		/* gather information from system message tables ... */
 		fprintf(stdnimp,"	- FORMAT_MESSAGE_FROM_SYSTEM not implemented.\n");
@@ -517,11 +517,11 @@
 		dwMessageId &= 0xFFFF;
 		bufsize=LoadMessage32A(0,dwMessageId,dwLanguageId,NULL,100);
 		if (bufsize) {
-			from = (char*)xmalloc(bufsize+1);
+			from = HeapAlloc( GetProcessHeap(), 0, bufsize + 1 );
 			LoadMessage32A(0,dwMessageId,dwLanguageId,from,bufsize+1);
 		}
 	}
-	target	= (char*)xmalloc(100);
+	target	= HeapAlloc( GetProcessHeap(), 0, 100);
 	t	= target;
 	talloced= 100;
 	*t	= 0;
@@ -568,12 +568,12 @@
 						f++;
 						if (NULL!=(x=strchr(f,'!'))) {
 							*x='\0';
-							fmtstr=(char*)xmalloc(strlen(f)+2);
+							fmtstr=HeapAlloc(GetProcessHeap(),0,strlen(f)+2);
 							sprintf(fmtstr,"%%%s",f);
 							f=x+1;
 						}
 					} else
-						fmtstr=strdup("%s");
+						fmtstr=HEAP_strdupA(GetProcessHeap(),0,"%s");
 					if (dwFlags & FORMAT_MESSAGE_ARGUMENT_ARRAY)
 						argliststart=args+insertnr-1;
 					else
@@ -583,16 +583,16 @@
 						argliststart=((DWORD*)&args)+insertnr-1;
 
 					if (fmtstr[strlen(fmtstr)]=='s')
-						sprintfbuf=(char*)xmalloc(strlen((LPSTR)argliststart[0])+1);
+						sprintfbuf=HeapAlloc(GetProcessHeap(),0,strlen((LPSTR)argliststart[0])+1);
 					else
-						sprintfbuf=(char*)xmalloc(100);
+						sprintfbuf=HeapAlloc(GetProcessHeap(),0,100);
 					vsprintf(sprintfbuf,fmtstr,argliststart);
 					x=sprintfbuf;
 					while (*x) {
 						ADD_TO_T(*x++);
 					}
-					free(sprintfbuf);
-					free(fmtstr);
+					HeapFree(GetProcessHeap(),0,sprintfbuf);
+					HeapFree(GetProcessHeap(),0,fmtstr);
 					break;
 				case '0':
 					nolinefeed=1;
@@ -620,8 +620,8 @@
 		memcpy(*(LPSTR*)lpBuffer,target,talloced);
 	} else
 		strncpy(lpBuffer,target,nSize);
-	free(target);
-	if (from) free(from);
+	HeapFree(GetProcessHeap(),0,target);
+	if (from) HeapFree(GetProcessHeap(),0,from);
 	return (dwFlags & FORMAT_MESSAGE_ALLOCATE_BUFFER) ? 
 			strlen(*(LPSTR*)lpBuffer):
 			strlen(lpBuffer);
@@ -689,7 +689,7 @@
 		fprintf(stdnimp,"	- line wrapping not supported.\n");
 	from = NULL;
 	if (dwFlags & FORMAT_MESSAGE_FROM_STRING)
-		from = STRING32_DupUniToAnsi((LPWSTR)lpSource);
+		from = HEAP_strdupWtoA(GetProcessHeap(),0,(LPWSTR)lpSource);
 	if (dwFlags & FORMAT_MESSAGE_FROM_SYSTEM) {
 		/* gather information from system message tables ... */
 		fprintf(stdnimp,"	- FORMAT_MESSAGE_FROM_SYSTEM not implemented.\n");
@@ -699,12 +699,13 @@
 
 		dwMessageId &= 0xFFFF;
 		bufsize=LoadMessage32A(0,dwMessageId,dwLanguageId,NULL,100);
-		if (bufsize) {
-			from = (char*)xmalloc(bufsize+1);
-			LoadMessage32A(0,dwMessageId,dwLanguageId,from,bufsize+1);
+		if (bufsize)
+                {
+                    from = HeapAlloc( GetProcessHeap(), 0, bufsize + 1 );
+                    LoadMessage32A(0,dwMessageId,dwLanguageId,from,bufsize+1);
 		}
 	}
-	target	= (char*)xmalloc(100);
+	target	= HeapAlloc( GetProcessHeap(), 0, 100 );
 	t	= target;
 	talloced= 100;
 	*t	= 0;
@@ -749,14 +750,15 @@
 					}
 					if (*f=='!') {
 						f++;
-						if (NULL!=(x=strchr(f,'!'))) {
-							*x='\0';
-							fmtstr=(char*)xmalloc(strlen(f)+2);
+						if (NULL!=(x=strchr(f,'!')))
+                                                {
+                                                    *x='\0';
+                                                    fmtstr=HeapAlloc( GetProcessHeap(), 0, strlen(f)+2);
 							sprintf(fmtstr,"%%%s",f);
 							f=x+1;
 						}
 					} else
-						fmtstr=strdup("%s");
+						fmtstr=HEAP_strdupA( GetProcessHeap(),0,"%s");
 					if (dwFlags & FORMAT_MESSAGE_ARGUMENT_ARRAY)
 						argliststart=args+insertnr-1;
 					else
@@ -768,22 +770,22 @@
 					if (fmtstr[strlen(fmtstr)]=='s') {
 						DWORD	xarr[3];
 
-						xarr[0]=(DWORD)STRING32_DupUniToAnsi((LPWSTR)(*(argliststart+0)));
+						xarr[0]=(DWORD)HEAP_strdupWtoA(GetProcessHeap(),0,(LPWSTR)(*(argliststart+0)));
 						/* possible invalid pointers */
 						xarr[1]=*(argliststart+1);
 						xarr[2]=*(argliststart+2);
-						sprintfbuf=(char*)xmalloc(lstrlen32W((LPWSTR)argliststart[0])*2+1);
+						sprintfbuf=HeapAlloc(GetProcessHeap(),0,lstrlen32W((LPWSTR)argliststart[0])*2+1);
 						vsprintf(sprintfbuf,fmtstr,xarr);
 					} else {
-						sprintfbuf=(char*)xmalloc(100);
+						sprintfbuf=HeapAlloc(GetProcessHeap(),0,100);
 						vsprintf(sprintfbuf,fmtstr,argliststart);
 					}
 					x=sprintfbuf;
 					while (*x) {
 						ADD_TO_T(*x++);
 					}
-					free(sprintfbuf);
-					free(fmtstr);
+					HeapFree(GetProcessHeap(),0,sprintfbuf);
+					HeapFree(GetProcessHeap(),0,fmtstr);
 					break;
 				case '0':
 					nolinefeed=1;
@@ -810,8 +812,8 @@
 		lstrcpynAtoW(*(LPWSTR*)lpBuffer,target,talloced);
 	} else
 		lstrcpynAtoW(lpBuffer,target,nSize);
-	free(target);
-	if (from) free(from);
+	HeapFree(GetProcessHeap(),0,target);
+	if (from) HeapFree(GetProcessHeap(),0,from);
 	return (dwFlags & FORMAT_MESSAGE_ALLOCATE_BUFFER) ? 
 			lstrlen32W(*(LPWSTR*)lpBuffer):
 			lstrlen32W(lpBuffer);
diff --git a/misc/lzexpand.c b/misc/lzexpand.c
index a48fa0d..a149b2d 100644
--- a/misc/lzexpand.c
+++ b/misc/lzexpand.c
@@ -7,6 +7,7 @@
  * FIXME: return values might be wrong
  */
 
+#define NO_TRANSITION_TYPES  /* This file is Win32-clean */
 #include <stdlib.h>
 #include <stdio.h>
 #include <string.h>
@@ -39,8 +40,8 @@
 static BYTE LZMagic[8]={'S','Z','D','D',0x88,0xf0,0x27,0x33};
 
 static struct lzstate {
-	HFILE	lzfd;		/* the handle used by the program */
-	HFILE	realfd;		/* the real filedescriptor */
+	HFILE32	lzfd;		/* the handle used by the program */
+	HFILE32	realfd;		/* the real filedescriptor */
 	CHAR	lastchar;	/* the last char of the filename */
 
 	DWORD	reallength;	/* the decompressed length of the file */
@@ -48,7 +49,7 @@
 	DWORD	realwanted;	/* the position the user wants to read from */
 
 	BYTE	table[0x1000];	/* the rotating LZ table */
-	UINT	curtabent;	/* CURrent TABle ENTry */
+	UINT32	curtabent;	/* CURrent TABle ENTry */
 
 	BYTE	stringlen;	/* length and position of current string */ 
 	DWORD	stringpos;	/* from stringtable */
@@ -73,8 +74,8 @@
 		return		1;
 	} else {
 		int ret = _lread32(lzs->realfd,lzs->get,GETLEN);
-		if (ret==HFILE_ERROR)
-			return HFILE_ERROR;
+		if (ret==HFILE_ERROR32)
+			return HFILE_ERROR32;
 		if (ret==0)
 			return 0;
 		lzs->getlen	= ret;
@@ -89,11 +90,11 @@
  * return UNKNOWNALG for unknown algorithm
  * returns lzfileheader in *head
  */
-static INT
-read_header(HFILE fd,struct lzfileheader *head) {
+static INT32 read_header(HFILE32 fd,struct lzfileheader *head)
+{
 	BYTE	buf[14];
 
-	if (_llseek(fd,0,SEEK_SET)==-1)
+	if (_llseek32(fd,0,SEEK_SET)==-1)
 		return LZERROR_BADINHANDLE;
 
 	/* We can't directly read the lzfileheader struct due to 
@@ -114,18 +115,39 @@
 		return LZERROR_UNKNOWNALG;
 	return 1;
 }
-/* 
- * LZStart				[LZEXPAND.7] [LZ32.6]
+
+/***********************************************************************
+ *           LZStart16   (LZEXPAND.7)
  */
-INT16 LZStart(void)
+INT16 LZStart16(void)
 {
-    dprintf_file(stddeb,"LZStart(void)\n");
+    dprintf_file(stddeb,"LZStart16(void)\n");
     return 1;
 }
 
-/*
- * LZInit				[LZEXPAND.3] [LZ32.2]
- * 
+
+/***********************************************************************
+ *           LZStart32   (LZ32.6)
+ */
+INT32 LZStart32(void)
+{
+    dprintf_file(stddeb,"LZStart32(void)\n");
+    return 1;
+}
+
+
+/***********************************************************************
+ *           LZInit16   (LZEXPAND.3)
+ */
+HFILE16 LZInit16( HFILE16 hfSrc )
+{
+    return LZInit32( hfSrc );
+}
+
+
+/***********************************************************************
+ *           LZInit32   (LZ32.2)
+ *
  * initializes internal decompression buffers, returns lzfiledescriptor.
  * (return value the same as hfSrc, if hfSrc is not compressed)
  * on failure, returns error code <0
@@ -135,8 +157,9 @@
  * since _llseek uses the same types as libc.lseek, we just use the macros of 
  *  libc
  */
-HFILE
-LZInit(HFILE hfSrc) {
+HFILE32 LZInit32( HFILE32 hfSrc )
+{
+
 	struct	lzfileheader	head;
 	struct	lzstate		*lzs;
 	DWORD	ret;
@@ -144,7 +167,7 @@
 	dprintf_file(stddeb,"LZInit(%d)\n",hfSrc);
 	ret=read_header(hfSrc,&head);
 	if (ret<=0) {
-		_llseek(hfSrc,0,SEEK_SET);
+		_llseek32(hfSrc,0,SEEK_SET);
 		return ret?ret:hfSrc;
 	}
 	lzstates=xrealloc(lzstates,(++nroflzstates)*sizeof(struct lzstate));
@@ -167,17 +190,27 @@
 	return lzs->lzfd;
 }
 
-/*
- * LZDone				[LZEXPAND.9]  [LZ32.8]
- */
 
-void
-LZDone(void) {
-	dprintf_file(stddeb,"LZDone()\n");
+/***********************************************************************
+ *           LZDone   (LZEXPAND.9) (LZ32.8)
+ */
+void LZDone(void)
+{
+    dprintf_file(stddeb,"LZDone()\n");
 }
 
-/*
- * GetExpandedName			[LZEXPAND.10]
+
+/***********************************************************************
+ *           GetExpandedName16   (LZEXPAND.10)
+ */
+INT16 GetExpandedName16( LPCSTR in, LPSTR out )
+{
+    return GetExpandedName32A( in, out );
+}
+
+
+/***********************************************************************
+ *           GetExpandedName32A   (LZ32.9)
  *
  * gets the full filename of the compressed file 'in' by opening it
  * and reading the header
@@ -187,21 +220,21 @@
  * "FILE.BL_" (with lastchar 'a') is being translated to "FILE.BLA"
  */
 
-INT16
-GetExpandedName16(LPCSTR in,LPSTR out) {
+INT32 GetExpandedName32A( LPCSTR in, LPSTR out )
+{
 	struct lzfileheader	head;
-	HFILE		fd;
+	HFILE32		fd;
 	OFSTRUCT	ofs;
-	INT		fnislowercased,ret,len;
+	INT32		fnislowercased,ret,len;
 	LPSTR		s,t;
 
 	dprintf_file(stddeb,"GetExpandedName(%s)\n",in);
-	fd=OpenFile(in,&ofs,OF_READ);
-	if (fd==HFILE_ERROR)
+	fd=OpenFile32(in,&ofs,OF_READ);
+	if (fd==HFILE_ERROR32)
 		return LZERROR_BADINHANDLE;
 	ret=read_header(fd,&head);
 	if (ret<=0) {
-		_lclose(fd);
+		_lclose32(fd);
 		return LZERROR_BADINHANDLE;
 	}
 
@@ -219,7 +252,7 @@
 	if (!*s) {
 		/* FIXME: hmm. shouldn't happen? */
 		fprintf(stddeb,__FILE__":GetExpandedFileName(), specified a directory or what? (%s)\n",in);
-		_lclose(fd);
+		_lclose32(fd);
 		return 1;
 	}
 	/* see if we should use lowercase or uppercase on the last char */
@@ -250,15 +283,16 @@
 				t[len]=head.lastchar;
 		}
 	} /* else no modification necessary */
-	_lclose(fd);
+	_lclose32(fd);
 	return 1;
 }
 
-/* 
- * GetExpandedNameW			[LZ32.11] 
+
+/***********************************************************************
+ *           GetExpandedName32W   (LZ32.11)
  */
-INT32
-GetExpandedName32W(LPCWSTR in,LPWSTR out) {
+INT32 GetExpandedName32W( LPCWSTR in, LPWSTR out )
+{
 	char	*xin,*xout;
 	INT32	ret;
 
@@ -271,26 +305,21 @@
 	return	ret;
 }
 
-/* 
- * GetExpandedNameA			[LZ32.9] 
+
+/***********************************************************************
+ *           LZRead16   (LZEXPAND.5)
  */
-INT32
-GetExpandedName32A(LPCSTR in,LPSTR out) {
-	return	GetExpandedName16(in,out);
+INT16 LZRead16( HFILE16 fd, LPVOID buf, UINT16 toread )
+{
+    return LZRead32(fd,buf,toread);
 }
 
-/*
- * LZRead				[LZEXPAND.5] [LZ32.4]
- * just as normal read, but reads from LZ special fd and uncompresses.
- */
-INT16
-LZRead16(HFILE fd,SEGPTR segbuf,UINT16 toread) {
-	dprintf_file(stddeb,"LZRead16(%d,%08lx,%d)\n",fd,(DWORD)segbuf,toread);
-	return LZRead32(fd,(LPBYTE)PTR_SEG_TO_LIN(segbuf),toread);
-}
 
-INT32
-LZRead32(HFILE fd,LPVOID vbuf,UINT32 toread) {
+/***********************************************************************
+ *           LZRead32   (LZ32.4)
+ */
+INT32 LZRead32( HFILE32 fd, LPVOID vbuf, UINT32 toread )
+{
 	int	i,howmuch;
 	BYTE	b,*buf;
 	struct	lzstate	*lzs;
@@ -358,7 +387,7 @@
 		 */
 		if (lzs->realcurrent>lzs->realwanted) {
 			/* flush decompressor state */
-			_llseek(lzs->realfd,14,SEEK_SET);
+			_llseek32(lzs->realfd,14,SEEK_SET);
 			GET_FLUSH(lzs);
 			lzs->realcurrent= 0;
 			lzs->bytetype	= 0;
@@ -381,14 +410,21 @@
 #undef DECOMPRESS_ONE_BYTE
 }
 
-/* 
- * LZSeek				[LZEXPAND.4] [LZ32.3]
- *
- * works as the usual _llseek
- */
 
-LONG
-LZSeek(HFILE fd,LONG off,INT32 type) {
+/***********************************************************************
+ *           LZSeek16   (LZEXPAND.4)
+ */
+LONG LZSeek16( HFILE16 fd, LONG off, INT16 type )
+{
+    return LZSeek32( fd, off, type );
+}
+
+
+/***********************************************************************
+ *           LZSeek32   (LZ32.3)
+ */
+LONG LZSeek32( HFILE32 fd, LONG off, INT32 type )
+{
 	int	i;
 	struct	lzstate	*lzs;
 	LONG	newwanted;
@@ -399,7 +435,7 @@
 			break;
 	/* not compressed? just use normal _llseek() */
 	if (i==nroflzstates)
-		return _llseek(fd,off,type);
+		return _llseek32(fd,off,type);
 	lzs		= lzstates+i;
 	newwanted	= lzs->realwanted;
 	switch (type) {
@@ -421,20 +457,30 @@
 	return newwanted;
 }
 
-/* 
- * LZCopy			[LZEXPAND.1] [LZ32.0]
+
+/***********************************************************************
+ *           LZCopy16   (LZEXPAND.1)
+ */
+LONG LZCopy16( HFILE16 src, HFILE16 dest )
+{
+    return LZCopy32( src, dest );
+}
+
+
+/***********************************************************************
+ *           LZCopy32   (LZ32.0)
  *
  * Copies everything from src to dest
  * if src is a LZ compressed file, it will be uncompressed.
  * will return the number of bytes written to dest or errors.
  */
-LONG
-LZCopy(HFILE src,HFILE dest) {
+LONG LZCopy32( HFILE32 src, HFILE32 dest )
+{
 	int	i,ret,wret;
 	LONG	len;
 #define BUFLEN	1000
 	BYTE	buf[BUFLEN];
-	INT32	(*xread)(HFILE,LPVOID,UINT32);
+	INT32	(*xread)(HFILE32,LPVOID,UINT32);
 
 	dprintf_file(stddeb,"LZCopy(%d,%d)\n",src,dest);
 	for (i=0;i<nroflzstates;i++)
@@ -443,7 +489,7 @@
 
 	/* not compressed? just copy */
 	if (i==nroflzstates)
-		xread=(INT32(*)(HFILE,LPVOID,UINT32))_lread32;
+		xread=(INT32(*)(HFILE32,LPVOID,UINT32))_lread32;
 	else
 		xread=LZRead32;
 	len=0;
@@ -482,54 +528,58 @@
     return mfn;
 }
 
-/*
- * LZOpenFile				[LZEXPAND.2]
+
+/***********************************************************************
+ *           LZOpenFile16   (LZEXPAND.2)
+ */
+HFILE16 LZOpenFile16( LPCSTR fn, LPOFSTRUCT ofs, UINT16 mode )
+{
+    return LZOpenFile32A( fn, ofs, mode );
+}
+
+
+/***********************************************************************
+ *           LZOpenFile32A   (LZ32.1)
+ *
  * Opens a file. If not compressed, open it as a normal file.
  */
-HFILE
-LZOpenFile16(LPCSTR fn,LPOFSTRUCT ofs,UINT16 mode) {
-	HFILE	fd,cfd;
+HFILE32 LZOpenFile32A( LPCSTR fn, LPOFSTRUCT ofs, UINT32 mode )
+{
+	HFILE32	fd,cfd;
 
 	dprintf_file(stddeb,"LZOpenFile(%s,%p,%d)\n",fn,ofs,mode);
 	/* 0x70 represents all OF_SHARE_* flags, ignore them for the check */
-	fd=OpenFile(fn,ofs,mode);
-	if (fd==HFILE_ERROR)
+	fd=OpenFile32(fn,ofs,mode);
+	if (fd==HFILE_ERROR32)
         {
             LPSTR mfn = LZEXPAND_MangleName(fn);
-            fd = OpenFile(mfn,ofs,mode);
+            fd = OpenFile32(mfn,ofs,mode);
             free( mfn );
 	}
 	if ((mode&~0x70)!=OF_READ)
 		return fd;
-	if (fd==HFILE_ERROR)
-		return HFILE_ERROR;
-	cfd=LZInit(fd);
+	if (fd==HFILE_ERROR32)
+		return HFILE_ERROR32;
+	cfd=LZInit32(fd);
 	if (cfd<=0)
 		return fd;
 	return cfd;
 }
 
-/* 
- * LZOpenFileA				[LZ32.1]
- */
-HFILE
-LZOpenFile32A(LPCSTR fn,LPOFSTRUCT ofs,UINT32 mode) {
-	return LZOpenFile16(fn,ofs,mode);
-}
 
-/* 
- * LZOpenFileW				[LZ32.10]
+/***********************************************************************
+ *           LZOpenFile32W   (LZ32.10)
  */
-HFILE
-LZOpenFile32W(LPCWSTR fn,LPOFSTRUCT ofs,UINT32 mode) {
+HFILE32 LZOpenFile32W( LPCWSTR fn, LPOFSTRUCT ofs, UINT32 mode )
+{
 	LPSTR	xfn;
 	LPWSTR	yfn;
-	HFILE	ret;
+	HFILE32	ret;
 
 	xfn	= HEAP_strdupWtoA( GetProcessHeap(), 0, fn);
 	ret	= LZOpenFile16(xfn,ofs,mode);
 	HeapFree( GetProcessHeap(), 0, xfn );
-	if (ret!=HFILE_ERROR) {
+	if (ret!=HFILE_ERROR32) {
 		/* ofs->szPathName is an array with the OFSTRUCT */
                 yfn = HEAP_strdupAtoW( GetProcessHeap(), 0, ofs->szPathName );
 		memcpy(ofs->szPathName,yfn,lstrlen32W(yfn)*2+2);
@@ -538,11 +588,21 @@
 	return	ret;
 }
 
-/*
- * LZClose			[LZEXPAND.6] [LZ32.5]
+
+/***********************************************************************
+ *           LZClose16   (LZEXPAND.6)
  */
-void
-LZClose(HFILE fd) {
+void LZClose16( HFILE16 fd )
+{
+    return LZClose32( fd );
+}
+
+
+/***********************************************************************
+ *           LZClose32   (LZ32.5)
+ */
+void LZClose32( HFILE32 fd )
+{
 	int	i;
 
 	dprintf_file(stddeb,"LZClose(%d)\n",fd);
@@ -550,25 +610,35 @@
 		if (lzstates[i].lzfd==fd)
 			break;
 	if (i==nroflzstates) {
-		_lclose(fd);
+		_lclose32(fd);
 		return;
 	}
 	if (lzstates[i].get)
 		free(lzstates[i].get);
-	_lclose(lzstates[i].realfd);
+	_lclose32(lzstates[i].realfd);
 	memcpy(lzstates+i,lzstates+i+1,sizeof(struct lzstate)*(nroflzstates-i-1));
 	nroflzstates--;
 	lzstates=xrealloc(lzstates,sizeof(struct lzstate)*nroflzstates);
 }
 
-/*
- * CopyLZFile				[LZEXPAND.8] [LZ32.7]
+/***********************************************************************
+ *           CopyLZFile16   (LZEXPAND.8)
+ */
+LONG CopyLZFile16( HFILE16 src, HFILE16 dest )
+{
+    dprintf_file(stddeb,"CopyLZFile16(%d,%d)\n",src,dest);
+    return LZCopy32(src,dest);
+}
+
+
+/***********************************************************************
+ *           CopyLZFile32  (LZ32.7)
  *
  * Copy src to dest (including uncompressing src).
  * NOTE: Yes. This is exactly the same function as LZCopy.
  */
-LONG
-CopyLZFile(HFILE src,HFILE dest) {
-	dprintf_file(stddeb,"CopyLZFile(%d,%d)\n",src,dest);
-	return LZCopy(src,dest);
+LONG CopyLZFile32( HFILE32 src, HFILE32 dest )
+{
+    dprintf_file(stddeb,"CopyLZFile32(%d,%d)\n",src,dest);
+    return LZCopy32(src,dest);
 }
diff --git a/misc/main.c b/misc/main.c
index 754950e..5be6dbf 100644
--- a/misc/main.c
+++ b/misc/main.c
@@ -27,7 +27,6 @@
 #include "winsock.h"
 #include "options.h"
 #include "desktop.h"
-#include "registers.h"
 #include "shell.h"
 #include "winbase.h"
 #define DEBUG_DEFINE_VARIABLES
@@ -781,11 +780,7 @@
   long result = 0;
 
   /* There doesn't seem to be any Pentium flag.  */
-#ifndef WINELIB
   long cpuflag = cpuflags[MIN (runtime_cpu (), 4)];
-#else
-  long cpuflag = cpuflags[4];
-#endif
 
   switch(Options.mode) {
   case MODE_STANDARD:
diff --git a/misc/registry.c b/misc/registry.c
index ece9fb0..9b7c209 100644
--- a/misc/registry.c
+++ b/misc/registry.c
@@ -201,7 +201,7 @@
 	int	i,j,len;
 	LPWSTR	ws;
 
-	ws	= strdupW(wp);
+	ws	= HEAP_strdupW( SystemHeap, 0, wp );
 	*wpc	= 1;
 	for (i=0;ws[i];i++) {
 		if (ws[i]=='\\') {
@@ -210,7 +210,7 @@
 		}
 	}
 	len	= i;
-	*wpv	= (LPWSTR*)xmalloc(sizeof(LPWSTR)*(*wpc+2));
+	*wpv	= (LPWSTR*)HeapAlloc( SystemHeap, 0, sizeof(LPWSTR)*(*wpc+2));
 	(*wpv)[0]= ws;
 	j	= 1;
 	for (i=1;i<len;i++)
@@ -218,7 +218,7 @@
 			(*wpv)[j++]=ws+i;
 	(*wpv)[j]=NULL;
 }
-#define FREE_KEY_PATH	free(wps[0]);free(wps);
+#define FREE_KEY_PATH HeapFree(SystemHeap,0,wps[0]);HeapFree(SystemHeap,0,wps);
 
 /*
  * Shell initialisation, allocates keys. 
@@ -1109,7 +1109,7 @@
 	};
 	struct	_w95nr2da 	*nr2da;
 
-	HFILE		hfd;
+	HFILE32		hfd;
 	int		lastmodified;
 	char		magic[5];
 	unsigned long	nr,pos,i,where,version,rgdbsection,end,off_next_rgdb;
@@ -1120,8 +1120,8 @@
 	BY_HANDLE_FILE_INFORMATION hfdinfo;
 
 	dprintf_reg(stddeb,"Loading Win95 registry database '%s'\n",fn);
-	hfd=OpenFile(fn,&ofs,OF_READ);
-	if (hfd==HFILE_ERROR)
+	hfd=OpenFile32(fn,&ofs,OF_READ);
+	if (hfd==HFILE_ERROR32)
 		return;
 	magic[4]=0;
 	if (4!=_lread32(hfd,magic,4))
@@ -1134,7 +1134,7 @@
 		return;
 	if (4!=_lread32(hfd,&rgdbsection,4))
 		return;
-	if (-1==_llseek(hfd,0x20,SEEK_SET))
+	if (-1==_llseek32(hfd,0x20,SEEK_SET))
 		return;
 	if (4!=_lread32(hfd,magic,4))
 		return;
@@ -1144,7 +1144,7 @@
 	}
 
 	/* STEP 1: Keylink structures */
-	if (-1==_llseek(hfd,0x40,SEEK_SET))
+	if (-1==_llseek32(hfd,0x40,SEEK_SET))
 		return;
 	where	= 0x40;
 	end	= rgdbsection;
@@ -1231,12 +1231,12 @@
 	end		= hfdinfo.nFileSizeLow;
 	lastmodified	= DOSFS_FileTimeToUnixTime(&(hfdinfo.ftLastWriteTime));
 
-	if (-1==_llseek(hfd,rgdbsection,SEEK_SET))
+	if (-1==_llseek32(hfd,rgdbsection,SEEK_SET))
 		return;
 	data = (char*)xmalloc(end-rgdbsection);
 	if ((end-rgdbsection)!=_lread32(hfd,data,end-rgdbsection))
 		return;
-	_lclose(hfd);
+	_lclose32(hfd);
 	curdata = data;
 	memcpy(magic,curdata,4);
 	memcpy(&off_next_rgdb,curdata+4,4);
@@ -1471,7 +1471,7 @@
 
 void
 _w31_loadreg() {
-	HFILE			hf;
+	HFILE32			hf;
 	struct _w31_header	head;
 	struct _w31_tabent	*tab;
 	unsigned char		*txt;
@@ -1482,19 +1482,19 @@
 	HKEY			hkey;
 	LPKEYSTRUCT		lpkey;
 
-	hf = OpenFile("reg.dat",&ofs,OF_READ);
-	if (hf==HFILE_ERROR)
+	hf = OpenFile32("reg.dat",&ofs,OF_READ);
+	if (hf==HFILE_ERROR32)
 		return;
 
 	/* read & dump header */
 	if (sizeof(head)!=_lread32(hf,&head,sizeof(head))) {
 		dprintf_reg(stddeb,"_w31_loadreg:reg.dat is too short.\n");
-		_lclose(hf);
+		_lclose32(hf);
 		return;
 	}
 	if (memcmp(head.cookie, "SHCC3.10", sizeof(head.cookie))!=0) {
 		dprintf_reg(stddeb,"_w31_loadreg:reg.dat has bad signature.\n");
-		_lclose(hf);
+		_lclose32(hf);
 		return;
 	}
 
@@ -1504,24 +1504,24 @@
 	if (len!=_lread32(hf,tab,len)) {
 		dprintf_reg(stderr,"_w31_loadreg:couldn't read %d bytes.\n",len); 
 		free(tab);
-		_lclose(hf);
+		_lclose32(hf);
 		return;
 	}
 
 	/* read text */
 	txt = xmalloc(head.textsize);
-	if (-1==_llseek(hf,head.textoff,SEEK_SET)) {
+	if (-1==_llseek32(hf,head.textoff,SEEK_SET)) {
 		dprintf_reg(stderr,"_w31_loadreg:couldn't seek to textblock.\n"); 
 		free(tab);
 		free(txt);
-		_lclose(hf);
+		_lclose32(hf);
 		return;
 	}
 	if (head.textsize!=_lread32(hf,txt,head.textsize)) {
 		dprintf_reg(stderr,"_w31_loadreg:textblock too short (%d instead of %ld).\n",len,head.textsize); 
 		free(tab);
 		free(txt);
-		_lclose(hf);
+		_lclose32(hf);
 		return;
 	}
 
@@ -1529,7 +1529,7 @@
 		dprintf_reg(stderr,"_w31_loadreg:GetFileInformationByHandle failed?.\n"); 
 		free(tab);
 		free(txt);
-		_lclose(hf);
+		_lclose32(hf);
 		return;
 	}
 	lastmodified	= DOSFS_FileTimeToUnixTime(&(hfinfo.ftLastWriteTime));
@@ -1540,7 +1540,7 @@
 	__w31_dumptree(tab[0].w1,txt,tab,&head,lpkey,lastmodified,0);
 	free(tab);
 	free(txt);
-	_lclose(hf);
+	_lclose32(hf);
 	return;
 }
 
@@ -2800,9 +2800,9 @@
 	dprintf_reg(stddeb,"RegDeleteKey32A(%x,%s)\n",
 		hkey,lpszSubKey
 	);
-	lpszSubKeyW=strdupA2W(lpszSubKey);
+	lpszSubKeyW=HEAP_strdupAtoW(GetProcessHeap(),0,lpszSubKey);
 	ret=RegDeleteKey32W(hkey,lpszSubKeyW);
-	free(lpszSubKeyW);
+	HeapFree(GetProcessHeap(),0,lpszSubKeyW);
 	return ret;
 }
 
@@ -2867,13 +2867,9 @@
 	DWORD	ret;
 
 	dprintf_reg( stddeb, "RegDeleteValue32A(%x,%s)\n", hkey,lpszValue );
-	if (lpszValue)
-		lpszValueW=strdupA2W(lpszValue);
-	else
-		lpszValueW=NULL;
+        lpszValueW=HEAP_strdupAtoW(GetProcessHeap(),0,lpszValue);
 	ret=RegDeleteValue32W(hkey,lpszValueW);
-	if (lpszValueW)
-		free(lpszValueW);
+        HeapFree(GetProcessHeap(),0,lpszValueW);
 	return ret;
 }
 
diff --git a/misc/shell.c b/misc/shell.c
index 486e733..40a4534 100644
--- a/misc/shell.c
+++ b/misc/shell.c
@@ -163,12 +163,8 @@
 	/* FIXME - should throw a warning, perhaps! */
 	return 2; /* File not found. Close enough, I guess. */
     }
-    if (SearchPath32A(lpDirectory,lpFile,NULL,sizeof(xlpFile),xlpFile,NULL))
-    	lpFile = xlpFile;
-    else {
-    	if (SearchPath32A(lpDirectory,lpFile,".exe",sizeof(xlpFile),xlpFile,NULL))
-	    lpFile = xlpFile;
-    }
+    if (SearchPath32A(lpDirectory,lpFile,".exe",sizeof(xlpFile),xlpFile,NULL))
+        lpFile = xlpFile;
 
     /* First thing we need is the file's extension */
     extension = strrchr( xlpFile, '.' ); /* Assume last "." is the one; */
@@ -321,7 +317,7 @@
     }
 
     dprintf_exec(stddeb,"ShellExecute:starting %s\n",cmd);
-    return WinExec(cmd,iShowCmd);
+    return WinExec32(cmd,iShowCmd);
 }
 
 /*************************************************************************
@@ -351,105 +347,124 @@
     return retval;
 }
 
-static char AppName[128], AppMisc[1536];
+typedef struct
+{
+    LPCSTR  szApp;
+    LPCSTR  szOtherStuff;
+    HICON32 hIcon;
+} ABOUT_INFO;
+
 
 /*************************************************************************
- *				AboutDlgProc		[SHELL.33]
+ *             AboutDlgProc32  (not an exported API function)
  */
-LRESULT AboutDlgProc(HWND hWnd, UINT msg, WPARAM16 wParam, LPARAM lParam)
+LRESULT AboutDlgProc32( HWND32 hWnd, UINT32 msg, WPARAM32 wParam,
+                        LPARAM lParam )
 {
-  char Template[512], AppTitle[512];
- 
-  switch(msg) {
-   case WM_INITDIALOG:
-    SendDlgItemMessage32A(hWnd,stc1,STM_SETICON,lParam,0);
-    GetWindowText32A(hWnd, Template, sizeof(Template));
-    sprintf(AppTitle, Template, AppName);
-    SetWindowText32A(hWnd, AppTitle);
-    SetWindowText32A(GetDlgItem(hWnd,100), AppMisc);
-    return 1;
+    char Template[512], AppTitle[512];
+
+    switch(msg)
+    {
+    case WM_INITDIALOG:
+        {
+            ABOUT_INFO *info = (ABOUT_INFO *)lParam;
+            if (info)
+            {
+                SendDlgItemMessage32A(hWnd, stc1, STM_SETICON, info->hIcon, 0);
+                GetWindowText32A( hWnd, Template, sizeof(Template) );
+                sprintf( AppTitle, Template, info->szApp );
+                SetWindowText32A( hWnd, AppTitle );
+                SetWindowText32A( GetDlgItem(hWnd,100), info->szOtherStuff );
+            }
+        }
+        return 1;
     
-   case WM_COMMAND:
-    switch (wParam) {
-     case IDOK:
-      EndDialog(hWnd, TRUE);
-      return TRUE;
+    case WM_COMMAND:
+        if (wParam == IDOK)
+        {
+            EndDialog(hWnd, TRUE);
+            return TRUE;
+        }
+        break;
     }
-    break;
-  }
-  return FALSE;
+    return 0;
+}
+
+
+/*************************************************************************
+ *             AboutDlgProc16   (SHELL.33)
+ */
+LRESULT AboutDlgProc16( HWND16 hWnd, UINT16 msg, WPARAM16 wParam,
+                        LPARAM lParam )
+{
+    return AboutDlgProc32( hWnd, msg, wParam, lParam );
+}
+
+
+/*************************************************************************
+ *             ShellAbout16   (SHELL.22)
+ */
+BOOL16 ShellAbout16( HWND16 hWnd, LPCSTR szApp, LPCSTR szOtherStuff,
+                     HICON16 hIcon )
+{
+    return ShellAbout32A( hWnd, szApp, szOtherStuff, hIcon );
 }
 
 /*************************************************************************
- *				ShellAbout		[SHELL.22]
+ *             ShellAbout32A   (SHELL32.82)
  */
-INT ShellAbout(HWND hWnd, LPCSTR szApp, LPCSTR szOtherStuff, HICON16 hIcon)
+BOOL32 ShellAbout32A( HWND32 hWnd, LPCSTR szApp, LPCSTR szOtherStuff,
+                      HICON32 hIcon )
 {
-    HGLOBAL16 handle;
-    BOOL bRet;
-
-    if (szApp) strncpy(AppName, szApp, sizeof(AppName));
-    else *AppName = 0;
-    AppName[sizeof(AppName)-1]=0;
-
-    if (szOtherStuff) strncpy(AppMisc, szOtherStuff, sizeof(AppMisc));
-    else *AppMisc = 0;
-    AppMisc[sizeof(AppMisc)-1]=0;
-
-    if (!hIcon) hIcon = LoadIcon16(0,MAKEINTRESOURCE(OIC_WINEICON));
-    handle = SYSRES_LoadResource( SYSRES_DIALOG_SHELL_ABOUT_MSGBOX );
-    if (!handle) return FALSE;
-    bRet = DialogBoxIndirectParam16( WIN_GetWindowInstance( hWnd ),
-                                     handle, hWnd,
-                                     (DLGPROC16)MODULE_GetWndProcEntry16("AboutDlgProc"), 
-                                     (LPARAM)hIcon );
-    SYSRES_FreeResource( handle );
-    return bRet;
+    ABOUT_INFO info;
+    info.szApp        = szApp;
+    info.szOtherStuff = szOtherStuff;
+    info.hIcon        = hIcon;
+    if (!hIcon) info.hIcon = LoadIcon16( 0, MAKEINTRESOURCE(OIC_WINEICON) );
+    return DialogBoxIndirectParam32A( WIN_GetWindowInstance( hWnd ),
+                         SYSRES_GetResPtr( SYSRES_DIALOG_SHELL_ABOUT_MSGBOX ),
+                                      hWnd, AboutDlgProc32, (LPARAM)&info );
 }
 
+
 /*************************************************************************
- *				ShellAbout32W		[SHELL32.83]
+ *             ShellAbout32W   (SHELL32.83)
  */
-INT32 ShellAbout32W(HWND32 hWnd, LPCWSTR szApp, LPCWSTR szOtherStuff, HICON16 hIcon)
+BOOL32 ShellAbout32W( HWND32 hWnd, LPCWSTR szApp, LPCWSTR szOtherStuff,
+                      HICON32 hIcon )
 {
-    HGLOBAL16 handle;
-    BOOL bRet;
+    BOOL32 ret;
+    ABOUT_INFO info;
 
-    if (szApp) lstrcpynWtoA(AppName, szApp, sizeof(AppName));
-    else *AppName = 0;
-    AppName[sizeof(AppName)-1]=0;
-
-    if (szOtherStuff) lstrcpynWtoA(AppMisc, szOtherStuff, sizeof(AppMisc));
-    else *AppMisc = 0;
-    AppMisc[sizeof(AppMisc)-1]=0;
-
-    if (!hIcon) hIcon = LoadIcon16(0,MAKEINTRESOURCE(OIC_WINEICON));
-    handle = SYSRES_LoadResource( SYSRES_DIALOG_SHELL_ABOUT_MSGBOX );
-    if (!handle) return FALSE;
-    bRet = DialogBoxIndirectParam16( WIN_GetWindowInstance( hWnd ),
-                                     handle, hWnd,
-                                     (DLGPROC16)MODULE_GetWndProcEntry16("AboutDlgProc"), 
-                                     (LPARAM)hIcon );
-    SYSRES_FreeResource( handle );
-    return bRet;
+    info.szApp        = HEAP_strdupWtoA( GetProcessHeap(), 0, szApp );
+    info.szOtherStuff = HEAP_strdupWtoA( GetProcessHeap(), 0, szOtherStuff );
+    info.hIcon        = hIcon;
+    if (!hIcon) info.hIcon = LoadIcon16( 0, MAKEINTRESOURCE(OIC_WINEICON) );
+    ret = DialogBoxIndirectParam32A( WIN_GetWindowInstance( hWnd ),
+                         SYSRES_GetResPtr( SYSRES_DIALOG_SHELL_ABOUT_MSGBOX ),
+                                      hWnd, AboutDlgProc32, (LPARAM)&info );
+    HeapFree( GetProcessHeap(), 0, (LPSTR)info.szApp );
+    HeapFree( GetProcessHeap(), 0, (LPSTR)info.szOtherStuff );
+    return ret;
 }
 
+
 /*************************************************************************
  *				SHELL_GetResourceTable
  *
  * FIXME: Implement GetPEResourceTable in w32sys.c and call it here.
  */
-static BYTE* SHELL_GetResourceTable(HFILE hFile)
+static BYTE* SHELL_GetResourceTable(HFILE32 hFile)
 {
   struct mz_header_s mz_header;
   struct ne_header_s ne_header;
   int		size;
   
-  _llseek( hFile, 0, SEEK_SET );
+  _llseek32( hFile, 0, SEEK_SET );
   if ((_lread32(hFile,&mz_header,sizeof(mz_header)) != sizeof(mz_header)) ||
       (mz_header.mz_magic != MZ_SIGNATURE)) return (BYTE*)-1;
 
-  _llseek( hFile, mz_header.ne_offset, SEEK_SET );
+  _llseek32( hFile, mz_header.ne_offset, SEEK_SET );
   if (_lread32( hFile, &ne_header, sizeof(ne_header) ) != sizeof(ne_header))
       return NULL;
 
@@ -467,7 +482,7 @@
 
       if( !pTypeInfo ) return NULL;
 
-      _llseek(hFile, mz_header.ne_offset+ne_header.resource_tab_offset, SEEK_SET);
+      _llseek32(hFile, mz_header.ne_offset+ne_header.resource_tab_offset, SEEK_SET);
       if( _lread32( hFile, (char*)pTypeInfo, size) != size )
 	{ free(pTypeInfo); return NULL; }
       return pTypeInfo;
@@ -480,14 +495,14 @@
 /*************************************************************************
  *			SHELL_LoadResource
  */
-static HGLOBAL16 SHELL_LoadResource(HINSTANCE16 hInst, HFILE hFile, NE_NAMEINFO* pNInfo, WORD sizeShift)
+static HGLOBAL16 SHELL_LoadResource(HINSTANCE16 hInst, HFILE32 hFile, NE_NAMEINFO* pNInfo, WORD sizeShift)
 {
  BYTE*	ptr;
  HGLOBAL16 handle = DirectResAlloc( hInst, 0x10, (DWORD)pNInfo->length << sizeShift);
 
  if( (ptr = (BYTE*)GlobalLock16( handle )) )
    {
-    _llseek( hFile, (DWORD)pNInfo->offset << sizeShift, SEEK_SET);
+    _llseek32( hFile, (DWORD)pNInfo->offset << sizeShift, SEEK_SET);
      _lread32( hFile, (char*)ptr, pNInfo->length << sizeShift);
      return handle;
    }
@@ -497,14 +512,14 @@
 /*************************************************************************
  *                      ICO_LoadIcon
  */
-static HGLOBAL16 ICO_LoadIcon(HINSTANCE16 hInst, HFILE hFile, LPicoICONDIRENTRY lpiIDE)
+static HGLOBAL16 ICO_LoadIcon(HINSTANCE16 hInst, HFILE32 hFile, LPicoICONDIRENTRY lpiIDE)
 {
  BYTE*  ptr;
  HGLOBAL16 handle = DirectResAlloc( hInst, 0x10, lpiIDE->dwBytesInRes);
 
  if( (ptr = (BYTE*)GlobalLock16( handle )) )
    {
-    _llseek( hFile, lpiIDE->dwImageOffset, SEEK_SET);
+    _llseek32( hFile, lpiIDE->dwImageOffset, SEEK_SET);
      _lread32( hFile, (char*)ptr, lpiIDE->dwBytesInRes);
      return handle;
    }
@@ -516,13 +531,13 @@
  *
  *  Read .ico file and build phony ICONDIR struct for GetIconID
  */
-static HGLOBAL16 ICO_GetIconDirectory(HINSTANCE16 hInst, HFILE hFile, LPicoICONDIR* lplpiID ) 
+static HGLOBAL16 ICO_GetIconDirectory(HINSTANCE16 hInst, HFILE32 hFile, LPicoICONDIR* lplpiID ) 
 {
   WORD		id[3];	/* idReserved, idType, idCount */
   LPicoICONDIR	lpiID;
   int		i;
  
-  _llseek( hFile, 0, SEEK_SET );
+  _llseek32( hFile, 0, SEEK_SET );
   if( _lread32(hFile,(char*)id,sizeof(id)) != sizeof(id) ) return 0;
 
   /* check .ICO header 
@@ -573,12 +588,12 @@
   HGLOBAL16*	RetPtr = NULL;
   BYTE*  	pData;
   OFSTRUCT 	ofs;
-  HFILE 	hFile = OpenFile( lpszExeFileName, &ofs, OF_READ );
+  HFILE32 	hFile = OpenFile32( lpszExeFileName, &ofs, OF_READ );
   
   dprintf_reg(stddeb, "InternalExtractIcon(%04x, file '%s', start from %d, extract %d\n", 
 		       hInstance, lpszExeFileName, nIconIndex, n);
 
-  if( hFile == HFILE_ERROR || !n ) return 0;
+  if( hFile == HFILE_ERROR32 || !n ) return 0;
 
   hRet = GlobalAlloc16( GMEM_FIXED | GMEM_ZEROINIT, sizeof(HICON16)*n);
   RetPtr = (HICON16*)GlobalLock16(hRet);
@@ -661,7 +676,7 @@
     if( icoFile ) free(lpiID);
     else free(pData);
  } 
- _lclose( hFile );
+ _lclose32( hFile );
  
   /* return array with icon handles */
 
diff --git a/misc/user.c b/misc/user.c
index 68a91a5..7fd72874 100644
--- a/misc/user.c
+++ b/misc/user.c
@@ -20,8 +20,6 @@
 
 WORD USER_HeapSel = 0;
 
-
-extern HTASK16 TASK_GetNextTask(HTASK16);
 extern BOOL32 MENU_SwitchTPWndTo(HTASK16);
 
 /***********************************************************************
diff --git a/misc/ver.c b/misc/ver.c
index 84740c8..7eedf6d 100644
--- a/misc/ver.c
+++ b/misc/ver.c
@@ -23,21 +23,21 @@
 
 #define LZREAD(what) \
   if (sizeof(*what)!=LZRead32(lzfd,what,sizeof(*what))) return 0;
-#define LZTELL(lzfd) LZSeek(lzfd, 0, SEEK_CUR);
+#define LZTELL(lzfd) LZSeek32(lzfd, 0, SEEK_CUR);
 
 int
-read_ne_header(HFILE lzfd,struct ne_header_s *nehd) {
+read_ne_header(HFILE32 lzfd,struct ne_header_s *nehd) {
 	struct	mz_header_s	mzh;
 
-	LZSeek(lzfd,0,SEEK_SET);
+	LZSeek32(lzfd,0,SEEK_SET);
 	if (sizeof(mzh)!=LZRead32(lzfd,&mzh,sizeof(mzh)))
 		return 0;
 	if (mzh.mz_magic!=MZ_SIGNATURE)
 		return 0;
-	LZSeek(lzfd,mzh.ne_offset,SEEK_SET);
+	LZSeek32(lzfd,mzh.ne_offset,SEEK_SET);
 	LZREAD(nehd);
 	if (nehd->ne_magic == NE_SIGNATURE) {
-		LZSeek(lzfd,mzh.ne_offset,SEEK_SET);
+		LZSeek32(lzfd,mzh.ne_offset,SEEK_SET);
 		return 1;
 	}
 	/* must handle PE files too. Later. */
@@ -47,7 +47,7 @@
 
 int
 find_ne_resource(
-	HFILE lzfd,struct ne_header_s *nehd,SEGPTR typeid,SEGPTR resid,
+	HFILE32 lzfd,struct ne_header_s *nehd,SEGPTR typeid,SEGPTR resid,
 	BYTE **resdata,int *reslen,DWORD *off
 ) {
 	NE_TYPEINFO	ti;
@@ -57,7 +57,7 @@
 	DWORD		nehdoffset;
 
 	nehdoffset = LZTELL(lzfd);
-	LZSeek(lzfd,nehd->resource_tab_offset,SEEK_CUR);
+	LZSeek32(lzfd,nehd->resource_tab_offset,SEEK_CUR);
 	LZREAD(&shiftcount);
 	dprintf_ver(stddeb,"shiftcount is %d\n",shiftcount);
 	dprintf_ver(stddeb,"reading resource typeinfo dir.\n");
@@ -84,7 +84,7 @@
 				DWORD	whereleft;
 
 				whereleft = LZTELL(lzfd);
-				LZSeek(
+				LZSeek32(
 					lzfd,
 					nehdoffset+nehd->resource_tab_offset+ti.type_id,
 					SEEK_SET
@@ -99,11 +99,11 @@
 				if (lstrcmpi32A(str,(char*)PTR_SEG_TO_LIN(typeid)))
 					skipflag=1;
 				free(str);
-				LZSeek(lzfd,whereleft,SEEK_SET);
+				LZSeek32(lzfd,whereleft,SEEK_SET);
 			}
 		}
 		if (skipflag) {
-			LZSeek(lzfd,ti.count*sizeof(ni),SEEK_CUR);
+			LZSeek32(lzfd,ti.count*sizeof(ni),SEEK_CUR);
 			continue;
 		}
 		for (i=0;i<ti.count;i++) {
@@ -125,7 +125,7 @@
 					DWORD	whereleft;
 
 					whereleft = LZTELL(lzfd);
-					  LZSeek(
+					  LZSeek32(
 						lzfd,
 						nehdoffset+nehd->resource_tab_offset+ni.id,
 						SEEK_SET
@@ -140,12 +140,12 @@
 					if (!lstrcmpi32A(str,(char*)PTR_SEG_TO_LIN(typeid)))
 						skipflag=0;
 					free(str);
-					LZSeek(lzfd,whereleft,SEEK_SET);
+					LZSeek32(lzfd,whereleft,SEEK_SET);
 				}
 			}
 			if (skipflag)
 				continue;
-			LZSeek(lzfd,((int)ni.offset<<shiftcount),SEEK_SET);
+			LZSeek32(lzfd,((int)ni.offset<<shiftcount),SEEK_SET);
 			*off	= (int)ni.offset<<shiftcount;
 			len	= ni.length<<shiftcount;
 			rdata=(WORD*)xmalloc(len);
@@ -164,7 +164,7 @@
 /* GetFileResourceSize				[VER.2] */
 DWORD
 GetFileResourceSize(LPCSTR filename,SEGPTR restype,SEGPTR resid,LPDWORD off) {
-	HFILE	lzfd;
+	HFILE32	lzfd;
 	OFSTRUCT	ofs;
 	BYTE	*resdata;
 	int	reslen;
@@ -173,19 +173,19 @@
 	dprintf_ver(stddeb,"GetFileResourceSize(%s,%lx,%lx,%p)\n",
 		filename,(LONG)restype,(LONG)resid,off
 	);
-	lzfd=LZOpenFile16(filename,&ofs,OF_READ);
+	lzfd=LZOpenFile32A(filename,&ofs,OF_READ);
 	if (lzfd==0)
 		return 0;
 	if (!read_ne_header(lzfd,&nehd)) {
-		LZClose(lzfd);
+		LZClose32(lzfd);
 		return 0;
 	}
 	if (!find_ne_resource(lzfd,&nehd,restype,resid,&resdata,&reslen,off)) {
-		LZClose(lzfd);
+		LZClose32(lzfd);
 		return 0;
 	}
 	free(resdata);
-	LZClose(lzfd);
+	LZClose32(lzfd);
 	return reslen;
 }
 
@@ -194,7 +194,7 @@
 GetFileResource(LPCSTR filename,SEGPTR restype,SEGPTR resid,
 		DWORD off,DWORD datalen,LPVOID data
 ) {
-	HFILE	lzfd;
+	HFILE32	lzfd;
 	OFSTRUCT	ofs;
 	BYTE	*resdata;
 	int	reslen=datalen;
@@ -203,25 +203,25 @@
 		filename,(LONG)restype,(LONG)resid,off,datalen,data
 	);
 
-	lzfd=LZOpenFile16(filename,&ofs,OF_READ);
+	lzfd=LZOpenFile32A(filename,&ofs,OF_READ);
 	if (lzfd==0)
 		return 0;
 	if (!off) {
 		if (!read_ne_header(lzfd,&nehd)) {
-			LZClose(lzfd);
+			LZClose32(lzfd);
 			return 0;
 		}
 		if (!find_ne_resource(lzfd,&nehd,restype,resid,&resdata,&reslen,&off)) {
-			LZClose(lzfd);
+			LZClose32(lzfd);
 			return 0;
 		}
 		free(resdata);
 	}
-	LZSeek(lzfd,off,SEEK_SET);
+	LZSeek32(lzfd,off,SEEK_SET);
 	if (reslen>datalen)
 		reslen=datalen;
 	LZRead32(lzfd,data,reslen);
-	LZClose(lzfd);
+	LZClose32(lzfd);
 	return reslen;
 }
 
diff --git a/miscemu/Makefile.in b/miscemu/Makefile.in
index 3fd74e7..79950ea 100644
--- a/miscemu/Makefile.in
+++ b/miscemu/Makefile.in
@@ -6,24 +6,8 @@
 MODULE    = miscemu
 
 C_SRCS = \
-	cpu.c \
-	dosmem.c \
-	dpmi.c \
 	emulate.c \
-	instr.c \
-	int10.c \
-	int13.c \
-	int1a.c \
-	int21.c \
-	int25.c \
-	int26.c \
-	int2a.c \
-	int2f.c \
-	int4b.c \
-	int5c.c \
-	interrupts.c \
-	ioports.c \
-	vxd.c
+	instr.c
 
 all: $(MODULE).o
 
diff --git a/miscemu/emulate.c b/miscemu/emulate.c
index 0fcdc7e..eee31e0 100644
--- a/miscemu/emulate.c
+++ b/miscemu/emulate.c
@@ -28,11 +28,11 @@
  */
 /* FIXME: Only skeletal implementation for now */
 
-void WIN87_fpmath( SIGCONTEXT *context )
+void WIN87_fpmath( CONTEXT *context )
 {
     dprintf_int(stddeb, "_fpmath: (cs:eip=%x:%lx es=%x bx=%04x ax=%04x dx==%04x)\n",
-                 CS_reg(context), EIP_reg(context),
-                 ES_reg(context), BX_reg(context),
+                 (WORD)CS_reg(context), EIP_reg(context),
+                 (WORD)ES_reg(context), BX_reg(context),
                  AX_reg(context), DX_reg(context) );
 
     switch(BX_reg(context))
diff --git a/miscemu/instr.c b/miscemu/instr.c
index e07fcb6..0d50be6 100644
--- a/miscemu/instr.c
+++ b/miscemu/instr.c
@@ -8,14 +8,15 @@
 #include "windows.h"
 #include "ldt.h"
 #include "miscemu.h"
+#include "sigcontext.h"
 
 
-#define STACK_reg(context) \
-   ((GET_SEL_FLAGS(SS_reg(context)) & LDT_FLAGS_32BIT) ? \
-                   ESP_reg(context) : SP_reg(context))
+#define STACK_sig(context) \
+   ((GET_SEL_FLAGS(SS_sig(context)) & LDT_FLAGS_32BIT) ? \
+                   ESP_sig(context) : SP_sig(context))
 
 #define STACK_PTR(context) \
-    (PTR_SEG_OFF_TO_LIN(SS_reg(context),STACK_reg(context)))
+    (PTR_SEG_OFF_TO_LIN(SS_sig(context),STACK_sig(context)))
 
 /***********************************************************************
  *           INSTR_ReplaceSelector
@@ -29,7 +30,7 @@
     {
         extern void SIGNAL_StartBIOSTimer(void);
         fprintf( stderr, "Direct access to segment 0x40 (cs:ip=%04x:%04lx).\n",
-                 CS_reg(context), EIP_reg(context) );
+                 CS_sig(context), EIP_sig(context) );
         SIGNAL_StartBIOSTimer();
         return DOSMEM_BiosSeg;
     }
@@ -59,14 +60,14 @@
     {
         switch(rm)
         {
-        case 0: return (BYTE *)&EAX_reg(context);
-        case 1: return (BYTE *)&ECX_reg(context);
-        case 2: return (BYTE *)&EDX_reg(context);
-        case 3: return (BYTE *)&EBX_reg(context);
-        case 4: return (BYTE *)&ESP_reg(context);
-        case 5: return (BYTE *)&EBP_reg(context);
-        case 6: return (BYTE *)&ESI_reg(context);
-        case 7: return (BYTE *)&EDI_reg(context);
+        case 0: return (BYTE *)&EAX_sig(context);
+        case 1: return (BYTE *)&ECX_sig(context);
+        case 2: return (BYTE *)&EDX_sig(context);
+        case 3: return (BYTE *)&EBX_sig(context);
+        case 4: return (BYTE *)&ESP_sig(context);
+        case 5: return (BYTE *)&EBP_sig(context);
+        case 6: return (BYTE *)&ESI_sig(context);
+        case 7: return (BYTE *)&EDI_sig(context);
         }
     }
 
@@ -80,27 +81,27 @@
             ss = sib >> 6;
             switch(sib >> 3)
             {
-            case 0: index = EAX_reg(context); break;
-            case 1: index = ECX_reg(context); break;
-            case 2: index = EDX_reg(context); break;
-            case 3: index = EBX_reg(context); break;
+            case 0: index = EAX_sig(context); break;
+            case 1: index = ECX_sig(context); break;
+            case 2: index = EDX_sig(context); break;
+            case 3: index = EBX_sig(context); break;
             case 4: index = 0; break;
-            case 5: index = EBP_reg(context); break;
-            case 6: index = ESI_reg(context); break;
-            case 7: index = EDI_reg(context); break;
+            case 5: index = EBP_sig(context); break;
+            case 6: index = ESI_sig(context); break;
+            case 7: index = EDI_sig(context); break;
             }
         }
 
         switch(rm)
         {
-        case 0: base = EAX_reg(context); seg = DS_reg(context); break;
-        case 1: base = ECX_reg(context); seg = DS_reg(context); break;
-        case 2: base = EDX_reg(context); seg = DS_reg(context); break;
-        case 3: base = EBX_reg(context); seg = DS_reg(context); break;
-        case 4: base = ESP_reg(context); seg = SS_reg(context); break;
-        case 5: base = EBP_reg(context); seg = SS_reg(context); break;
-        case 6: base = ESI_reg(context); seg = DS_reg(context); break;
-        case 7: base = EDI_reg(context); seg = DS_reg(context); break;
+        case 0: base = EAX_sig(context); seg = DS_sig(context); break;
+        case 1: base = ECX_sig(context); seg = DS_sig(context); break;
+        case 2: base = EDX_sig(context); seg = DS_sig(context); break;
+        case 3: base = EBX_sig(context); seg = DS_sig(context); break;
+        case 4: base = ESP_sig(context); seg = SS_sig(context); break;
+        case 5: base = EBP_sig(context); seg = SS_sig(context); break;
+        case 6: base = ESI_sig(context); seg = DS_sig(context); break;
+        case 7: base = EDI_sig(context); seg = DS_sig(context); break;
         }
         switch (mod)
         {
@@ -108,7 +109,7 @@
             if (rm == 5)  /* special case: ds:(disp32) */
             {
                 GET_VAL( &base, DWORD );
-                seg = DS_reg(context);
+                seg = DS_sig(context);
             }
             break;
 
@@ -128,36 +129,36 @@
         switch(rm)
         {
         case 0:  /* ds:(bx,si) */
-            base = BX_reg(context) + SI_reg(context);
-            seg  = DS_reg(context);
+            base = BX_sig(context) + SI_sig(context);
+            seg  = DS_sig(context);
             break;
         case 1:  /* ds:(bx,di) */
-            base = BX_reg(context) + DI_reg(context);
-            seg  = DS_reg(context);
+            base = BX_sig(context) + DI_sig(context);
+            seg  = DS_sig(context);
             break;
         case 2:  /* ss:(bp,si) */
-            base = BP_reg(context) + SI_reg(context);
-            seg  = SS_reg(context);
+            base = BP_sig(context) + SI_sig(context);
+            seg  = SS_sig(context);
             break;
         case 3:  /* ss:(bp,di) */
-            base = BP_reg(context) + DI_reg(context);
-            seg  = SS_reg(context);
+            base = BP_sig(context) + DI_sig(context);
+            seg  = SS_sig(context);
             break;
         case 4:  /* ds:(si) */
-            base = SI_reg(context);
-            seg  = DS_reg(context);
+            base = SI_sig(context);
+            seg  = DS_sig(context);
             break;
         case 5:  /* ds:(di) */
-            base = DI_reg(context);
-            seg  = DS_reg(context);
+            base = DI_sig(context);
+            seg  = DS_sig(context);
             break;
         case 6:  /* ss:(bp) */
-            base = BP_reg(context);
-            seg  = SS_reg(context);
+            base = BP_sig(context);
+            seg  = SS_sig(context);
             break;
         case 7:  /* ds:(bx) */
-            base = BX_reg(context);
-            seg  = DS_reg(context);
+            base = BX_sig(context);
+            seg  = DS_sig(context);
             break;
         }
 
@@ -167,7 +168,7 @@
             if (rm == 6)  /* special case: ds:(disp16) */
             {
                 GET_VAL( &base, WORD );
-                seg  = DS_reg(context);
+                seg  = DS_sig(context);
             }
             break;
 
@@ -187,6 +188,7 @@
 
     /* FIXME: should check limit of the segment here */
     return (BYTE *)PTR_SEG_OFF_TO_LIN( seg, (base + (index << ss)) );
+#undef GET_VAL
 }
 
 
@@ -214,36 +216,36 @@
     switch((*regmodrm >> 3) & 7)
     {
     case 0:
-        if (long_op) EAX_reg(context) = *(DWORD *)addr;
-        else AX_reg(context) = *(WORD *)addr;
+        if (long_op) EAX_sig(context) = *(DWORD *)addr;
+        else AX_sig(context) = *(WORD *)addr;
         break;
     case 1:
-        if (long_op) ECX_reg(context) = *(DWORD *)addr;
-        else CX_reg(context) = *(WORD *)addr;
+        if (long_op) ECX_sig(context) = *(DWORD *)addr;
+        else CX_sig(context) = *(WORD *)addr;
         break;
     case 2:
-        if (long_op) EDX_reg(context) = *(DWORD *)addr;
-        else DX_reg(context) = *(WORD *)addr;
+        if (long_op) EDX_sig(context) = *(DWORD *)addr;
+        else DX_sig(context) = *(WORD *)addr;
         break;
     case 3:
-        if (long_op) EBX_reg(context) = *(DWORD *)addr;
-        else BX_reg(context) = *(WORD *)addr;
+        if (long_op) EBX_sig(context) = *(DWORD *)addr;
+        else BX_sig(context) = *(WORD *)addr;
         break;
     case 4:
-        if (long_op) ESP_reg(context) = *(DWORD *)addr;
-        else SP_reg(context) = *(WORD *)addr;
+        if (long_op) ESP_sig(context) = *(DWORD *)addr;
+        else SP_sig(context) = *(WORD *)addr;
         break;
     case 5:
-        if (long_op) EBP_reg(context) = *(DWORD *)addr;
-        else BP_reg(context) = *(WORD *)addr;
+        if (long_op) EBP_sig(context) = *(DWORD *)addr;
+        else BP_sig(context) = *(WORD *)addr;
         break;
     case 6:
-        if (long_op) ESI_reg(context) = *(DWORD *)addr;
-        else SI_reg(context) = *(WORD *)addr;
+        if (long_op) ESI_sig(context) = *(DWORD *)addr;
+        else SI_sig(context) = *(WORD *)addr;
         break;
     case 7:
-        if (long_op) EDI_reg(context) = *(DWORD *)addr;
-        else DI_reg(context) = *(WORD *)addr;
+        if (long_op) EDI_sig(context) = *(DWORD *)addr;
+        else DI_sig(context) = *(WORD *)addr;
         break;
     }
 
@@ -251,16 +253,16 @@
 
     switch(*instr)
     {
-    case 0xc4: ES_reg(context) = seg; break;  /* les */
-    case 0xc5: DS_reg(context) = seg; break;  /* lds */
+    case 0xc4: ES_sig(context) = seg; break;  /* les */
+    case 0xc5: DS_sig(context) = seg; break;  /* lds */
     case 0x0f: switch(instr[1])
                {
-               case 0xb2: SS_reg(context) = seg; break;  /* lss */
-#ifdef FS_reg
-               case 0xb4: FS_reg(context) = seg; break;  /* lfs */
+               case 0xb2: SS_sig(context) = seg; break;  /* lss */
+#ifdef FS_sig
+               case 0xb4: FS_sig(context) = seg; break;  /* lfs */
 #endif
-#ifdef GS_reg
-               case 0xb5: GS_reg(context) = seg; break;  /* lgs */
+#ifdef GS_sig
+               case 0xb5: GS_sig(context) = seg; break;  /* lgs */
 #endif
                }
                break;
@@ -283,8 +285,8 @@
     int prefix, segprefix, prefixlen, len, repX, long_op, long_addr;
     BYTE *instr;
 
-    long_op = long_addr = (GET_SEL_FLAGS(CS_reg(context)) & LDT_FLAGS_32BIT) != 0;
-    instr = (BYTE *) PTR_SEG_OFF_TO_LIN( CS_reg(context), EIP_reg(context) );
+    long_op = long_addr = (GET_SEL_FLAGS(CS_sig(context)) & LDT_FLAGS_32BIT) != 0;
+    instr = (BYTE *) PTR_SEG_OFF_TO_LIN( CS_sig(context), EIP_sig(context) );
 
     /* First handle any possible prefix */
 
@@ -297,25 +299,25 @@
         switch(*instr)
         {
         case 0x2e:
-            segprefix = CS_reg(context);
+            segprefix = CS_sig(context);
             break;
         case 0x36:
-            segprefix = SS_reg(context);
+            segprefix = SS_sig(context);
             break;
         case 0x3e:
-            segprefix = DS_reg(context);
+            segprefix = DS_sig(context);
             break;
         case 0x26:
-            segprefix = ES_reg(context);
+            segprefix = ES_sig(context);
             break;
-#ifdef FS_reg
+#ifdef FS_sig
         case 0x64:
-            segprefix = FS_reg(context);
+            segprefix = FS_sig(context);
             break;
 #endif
-#ifdef GS_reg
+#ifdef GS_sig
         case 0x65:
-            segprefix = GS_reg(context);
+            segprefix = GS_sig(context);
             break;
 #endif
         case 0x66:
@@ -356,12 +358,12 @@
                 {
                     switch(*instr)
                     {
-                    case 0x07: ES_reg(context) = seg; break;
-                    case 0x17: SS_reg(context) = seg; break;
-                    case 0x1f: DS_reg(context) = seg; break;
+                    case 0x07: ES_sig(context) = seg; break;
+                    case 0x17: SS_sig(context) = seg; break;
+                    case 0x1f: DS_sig(context) = seg; break;
                     }
-                    STACK_reg(context) += long_op ? 4 : 2;
-                    EIP_reg(context) += prefixlen + 1;
+                    STACK_sig(context) += long_op ? 4 : 2;
+                    EIP_sig(context) += prefixlen + 1;
                     return TRUE;
                 }
             }
@@ -370,47 +372,47 @@
         case 0x0f: /* extended instruction */
             switch(instr[1])
             {
-#ifdef FS_reg
+#ifdef FS_sig
             case 0xa1: /* pop fs */
                 {
                     WORD seg = *(WORD *)STACK_PTR( context );
                     if ((seg = INSTR_ReplaceSelector( context, seg )) != 0)
                     {
-                        FS_reg(context) = seg;
-                        STACK_reg(context) += long_op ? 4 : 2;
-                        EIP_reg(context) += prefixlen + 2;
+                        FS_sig(context) = seg;
+                        STACK_sig(context) += long_op ? 4 : 2;
+                        EIP_sig(context) += prefixlen + 2;
                         return TRUE;
                     }
                 }
                 break;
-#endif  /* FS_reg */
+#endif  /* FS_sig */
 
-#ifdef GS_reg
+#ifdef GS_sig
             case 0xa9: /* pop gs */
                 {
                     WORD seg = *(WORD *)STACK_PTR( context );
                     if ((seg = INSTR_ReplaceSelector( context, seg )) != 0)
                     {
-                        GS_reg(context) = seg;
-                        STACK_reg(context) += long_op ? 4 : 2;
-                        EIP_reg(context) += prefixlen + 2;
+                        GS_sig(context) = seg;
+                        STACK_sig(context) += long_op ? 4 : 2;
+                        EIP_sig(context) += prefixlen + 2;
                         return TRUE;
                     }
                 }
                 break;
-#endif  /* GS_reg */
+#endif  /* GS_sig */
 
             case 0xb2: /* lss addr,reg */
-#ifdef FS_reg
+#ifdef FS_sig
             case 0xb4: /* lfs addr,reg */
 #endif
-#ifdef GS_reg
+#ifdef GS_sig
             case 0xb5: /* lgs addr,reg */
 #endif
                 if (INSTR_EmulateLDS( context, instr, long_op,
                                       long_addr, segprefix, &len ))
                 {
-                    EIP_reg(context) += prefixlen + len;
+                    EIP_sig(context) += prefixlen + len;
                     return TRUE;
                 }
                 break;
@@ -425,10 +427,10 @@
 	      int typ = *instr;  /* Just in case it's overwritten.  */
 	      int outp = (typ >= 0x6e);
 	      unsigned long count = repX ?
-                          (long_addr ? ECX_reg(context) : CX_reg(context)) : 1;
+                          (long_addr ? ECX_sig(context) : CX_sig(context)) : 1;
 	      int opsize = (typ & 1) ? (long_op ? 4 : 2) : 1;
-	      int step = (EFL_reg(context) & 0x400) ? -opsize : +opsize;
-	      int seg = outp ? DS_reg(context) : ES_reg(context);  /* FIXME: is this right? */
+	      int step = (EFL_sig(context) & 0x400) ? -opsize : +opsize;
+	      int seg = outp ? DS_sig(context) : ES_sig(context);  /* FIXME: is this right? */
 
 	      if (outp)
 		/* FIXME: Check segment readable.  */
@@ -439,9 +441,9 @@
 
 	      if (repX)
 		if (long_addr)
-		  ECX_reg(context) = 0;
+		  ECX_sig(context) = 0;
 		else
-		  CX_reg(context) = 0;
+		  CX_sig(context) = 0;
 
 	      while (count-- > 0)
 		{
@@ -449,41 +451,41 @@
 		  if (outp)
                   {
 		      data = PTR_SEG_OFF_TO_LIN (seg,
-                               long_addr ? ESI_reg(context) : SI_reg(context));
-		      if (long_addr) ESI_reg(context) += step;
-		      else SI_reg(context) += step;
+                               long_addr ? ESI_sig(context) : SI_sig(context));
+		      if (long_addr) ESI_sig(context) += step;
+		      else SI_sig(context) += step;
                   }
 		  else
                   {
 		      data = PTR_SEG_OFF_TO_LIN (seg,
-                               long_addr ? EDI_reg(context) : DI_reg(context));
-		      if (long_addr) EDI_reg(context) += step;
-		      else DI_reg(context) += step;
+                               long_addr ? EDI_sig(context) : DI_sig(context));
+		      if (long_addr) EDI_sig(context) += step;
+		      else DI_sig(context) += step;
                   }
                   
 		  switch (typ)
                   {
 		    case 0x6c:
-		      *((BYTE *)data) = inport( DX_reg(context), 1);
+		      *((BYTE *)data) = IO_inport( DX_sig(context), 1);
 		      break;
 		    case 0x6d:
 		      if (long_op)
-			*((DWORD *)data) = inport( DX_reg(context), 4);
+			*((DWORD *)data) = IO_inport( DX_sig(context), 4);
 		      else
-			*((WORD *)data) = inport( DX_reg(context), 2);
+			*((WORD *)data) = IO_inport( DX_sig(context), 2);
 		      break;
 		    case 0x6e:
-		      outport( DX_reg(context), 1, *((BYTE *)data));
-		      break;
+                        IO_outport( DX_sig(context), 1, *((BYTE *)data));
+                        break;
 		    case 0x6f:
-		      if (long_op)
-			outport( DX_reg(context), 4, *((DWORD *)data));
-		      else
-			outport( DX_reg(context), 2, *((WORD *)data));
-		      break;
+                        if (long_op)
+                            IO_outport( DX_sig(context), 4, *((DWORD *)data));
+                        else
+                            IO_outport( DX_sig(context), 2, *((WORD *)data));
+                        break;
 		    }
 		}
-              EIP_reg(context) += prefixlen + 1;
+              EIP_sig(context) += prefixlen + 1;
 	    }
             return TRUE;
 
@@ -501,29 +503,29 @@
                 switch((instr[1] >> 3) & 7)
                 {
                 case 0:
-                    ES_reg(context) = seg;
-                    EIP_reg(context) += prefixlen + len + 1;
+                    ES_sig(context) = seg;
+                    EIP_sig(context) += prefixlen + len + 1;
                     return TRUE;
                 case 1:  /* cs */
                     break;
                 case 2:
-                    SS_reg(context) = seg;
-                    EIP_reg(context) += prefixlen + len + 1;
+                    SS_sig(context) = seg;
+                    EIP_sig(context) += prefixlen + len + 1;
                     return TRUE;
                 case 3:
-                    DS_reg(context) = seg;
-                    EIP_reg(context) += prefixlen + len + 1;
+                    DS_sig(context) = seg;
+                    EIP_sig(context) += prefixlen + len + 1;
                     return TRUE;
                 case 4:
-#ifdef FS_reg
-                    FS_reg(context) = seg;
-                    EIP_reg(context) += prefixlen + len + 1;
+#ifdef FS_sig
+                    FS_sig(context) = seg;
+                    EIP_sig(context) += prefixlen + len + 1;
                     return TRUE;
 #endif
                 case 5:
-#ifdef GS_reg
-                    GS_reg(context) = seg;
-                    EIP_reg(context) += prefixlen + len + 1;
+#ifdef GS_sig
+                    GS_sig(context) = seg;
+                    EIP_sig(context) += prefixlen + len + 1;
                     return TRUE;
 #endif
                 case 6:  /* unused */
@@ -538,7 +540,7 @@
             if (INSTR_EmulateLDS( context, instr, long_op,
                                   long_addr, segprefix, &len ))
             {
-                EIP_reg(context) += prefixlen + len;
+                EIP_sig(context) += prefixlen + len;
                 return TRUE;
             }
             break;  /* Unable to emulate it */
@@ -554,13 +556,13 @@
                 FARPROC16 addr = INT_GetHandler( instr[1] );
                 WORD *stack = (WORD *)STACK_PTR( context );
                 /* Push the flags and return address on the stack */
-                *(--stack) = FL_reg(context);
-                *(--stack) = CS_reg(context);
-                *(--stack) = IP_reg(context) + prefixlen + 2;
-                STACK_reg(context) -= 3 * sizeof(WORD);
+                *(--stack) = FL_sig(context);
+                *(--stack) = CS_sig(context);
+                *(--stack) = IP_sig(context) + prefixlen + 2;
+                STACK_sig(context) -= 3 * sizeof(WORD);
                 /* Jump to the interrupt handler */
-                CS_reg(context)  = HIWORD(addr);
-                EIP_reg(context) = LOWORD(addr);
+                CS_sig(context)  = HIWORD(addr);
+                EIP_sig(context) = LOWORD(addr);
             }
             return TRUE;
 
@@ -568,71 +570,71 @@
             if (long_op)
             {
                 DWORD *stack = (DWORD *)STACK_PTR( context );
-                EIP_reg(context) = *stack++;
-                CS_reg(context)  = *stack++;
-                EFL_reg(context) = *stack;
-                STACK_reg(context) += 3*sizeof(DWORD);  /* Pop the return address and flags */
+                EIP_sig(context) = *stack++;
+                CS_sig(context)  = *stack++;
+                EFL_sig(context) = *stack;
+                STACK_sig(context) += 3*sizeof(DWORD);  /* Pop the return address and flags */
             }
             else
             {
                 WORD *stack = (WORD *)STACK_PTR( context );
-                EIP_reg(context) = *stack++;
-                CS_reg(context)  = *stack++;
-                FL_reg(context)  = *stack;
-                STACK_reg(context) += 3*sizeof(WORD);  /* Pop the return address and flags */
+                EIP_sig(context) = *stack++;
+                CS_sig(context)  = *stack++;
+                FL_sig(context)  = *stack;
+                STACK_sig(context) += 3*sizeof(WORD);  /* Pop the return address and flags */
             }
             return TRUE;
 
         case 0xe4: /* inb al,XX */
-            AL_reg(context) = inport( instr[1], 1 );
-	    EIP_reg(context) += prefixlen + 2;
+            AL_sig(context) = IO_inport( instr[1], 1 );
+	    EIP_sig(context) += prefixlen + 2;
             return TRUE;
 
         case 0xe5: /* in (e)ax,XX */
-            if (long_op) EAX_reg(context) = inport( instr[1], 4 );
-            else AX_reg(context) = inport( instr[1], 2 );
-	    EIP_reg(context) += prefixlen + 2;
+            if (long_op) EAX_sig(context) = IO_inport( instr[1], 4 );
+            else AX_sig(context) = IO_inport( instr[1], 2 );
+	    EIP_sig(context) += prefixlen + 2;
             return TRUE;
 
         case 0xe6: /* outb XX,al */
-            outport( instr[1], 1, AL_reg(context) );
-	    EIP_reg(context) += prefixlen + 2;
+            IO_outport( instr[1], 1, AL_sig(context) );
+	    EIP_sig(context) += prefixlen + 2;
             return TRUE;
 
         case 0xe7: /* out XX,(e)ax */
-            if (long_op) outport( instr[1], 4, EAX_reg(context) );
-            else outport( instr[1], 2, AX_reg(context) );
-  	    EIP_reg(context) += prefixlen + 2;
+            if (long_op) IO_outport( instr[1], 4, EAX_sig(context) );
+            else IO_outport( instr[1], 2, AX_sig(context) );
+  	    EIP_sig(context) += prefixlen + 2;
             return TRUE;
 
         case 0xec: /* inb al,dx */
-            AL_reg(context) = inport( DX_reg(context), 1 );
-  	    EIP_reg(context) += prefixlen + 1;
+            AL_sig(context) = IO_inport( DX_sig(context), 1 );
+  	    EIP_sig(context) += prefixlen + 1;
             return TRUE;
 
         case 0xed: /* in (e)ax,dx */
-            if (long_op) EAX_reg(context) = inport( DX_reg(context), 4 );
-            else AX_reg(context) = inport( DX_reg(context), 2 );
-  	    EIP_reg(context) += prefixlen + 1;
+            if (long_op) EAX_sig(context) = IO_inport( DX_sig(context), 4 );
+            else AX_sig(context) = IO_inport( DX_sig(context), 2 );
+  	    EIP_sig(context) += prefixlen + 1;
             return TRUE;
 
         case 0xee: /* outb dx,al */
-            outport( DX_reg(context), 1, AL_reg(context) );
-  	    EIP_reg(context) += prefixlen + 1;
+            IO_outport( DX_sig(context), 1, AL_sig(context) );
+  	    EIP_sig(context) += prefixlen + 1;
             return TRUE;
       
         case 0xef: /* out dx,(e)ax */
-            if (long_op) outport( DX_reg(context), 4, EAX_reg(context) );
-            else outport( DX_reg(context), 2, AX_reg(context) );
-  	    EIP_reg(context) += prefixlen + 1;
+            if (long_op) IO_outport( DX_sig(context), 4, EAX_sig(context) );
+            else IO_outport( DX_sig(context), 2, AX_sig(context) );
+  	    EIP_sig(context) += prefixlen + 1;
             return TRUE;
 
         case 0xfa: /* cli, ignored */
-  	    EIP_reg(context) += prefixlen + 1;
+  	    EIP_sig(context) += prefixlen + 1;
             return TRUE;
 
         case 0xfb: /* sti, ignored */
-  	    EIP_reg(context) += prefixlen + 1;
+  	    EIP_sig(context) += prefixlen + 1;
             return TRUE;
     }
     fprintf(stderr, "Unexpected Windows program segfault"
diff --git a/miscemu/int4b.c b/miscemu/int4b.c
deleted file mode 100644
index ecf07fa..0000000
--- a/miscemu/int4b.c
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * Int 4B handling
- *
- */
-
-#include "miscemu.h"
-
-/***********************************************************************
- *           INT_Int4bHandler
- *
- */
-void INT_Int4bHandler( SIGCONTEXT *context )
-{
-
-  switch(AH_reg(context))
-   {
-	case 0x81: /* Virtual DMA Spec (IBM SCSI interface) */   
-             if(AL_reg(context) != 0x02) /* if not install check */
-		{
-		 SET_CFLAG(context);		 
-		 AL_reg(context) = 0x0f; /* function is not implemented */
-		}
-	     break;
-        default:
-	     INT_BARF(context, 0x4b);
-    }
-}
-
diff --git a/miscemu/int5c.c b/miscemu/int5c.c
deleted file mode 100644
index 575d2e9..0000000
--- a/miscemu/int5c.c
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * NetBIOS interrupt handling
- *
- * Copyright 1995 Alexandre Julliard, Alex Korobka
- */
-
-#include "ldt.h"
-#include "miscemu.h"
-#include "stddebug.h"
-#include "debug.h"
-
-
-/***********************************************************************
- *           NetBIOSCall  (KERNEL.103)
- *
- * Also handler for interrupt 5c. 
- */
-void NetBIOSCall( SIGCONTEXT *context )
-{
-  BYTE* ptr;
-
-  ptr = (BYTE*) PTR_SEG_OFF_TO_LIN(ES_reg(context),BX_reg(context));
-
-  fprintf(stdnimp,"NetBIOSCall: command code %02x (ignored)\n",*ptr);
-  
-  AL_reg(context) = *(ptr+0x01) = 0xFB; /* NetBIOS emulator not found */
-}
-
diff --git a/miscemu/interrupts.c b/miscemu/interrupts.c
deleted file mode 100644
index 6fa7cb7..0000000
--- a/miscemu/interrupts.c
+++ /dev/null
@@ -1,170 +0,0 @@
-/*
- * Interrupt vectors emulation
- *
- * Copyright 1995 Alexandre Julliard
- */
-
-#include <sys/types.h>
-
-#include "windows.h"
-#include "drive.h"
-#include "miscemu.h"
-#include "msdos.h"
-#include "module.h"
-#include "stackframe.h"
-#include "stddebug.h"
-#include "debug.h"
-
-static FARPROC16 INT_Vectors[256];
-
-  /* Ordinal number for interrupt 0 handler in WPROCS.DLL */
-#define FIRST_INTERRUPT_ORDINAL 100
-
-
-/**********************************************************************
- *	    INT_Init
- */
-BOOL32 INT_Init(void)
-{
-    WORD vector;
-    HMODULE16 hModule = GetModuleHandle( "WPROCS" );
-
-    for (vector = 0; vector < 256; vector++)
-    {
-        if (!(INT_Vectors[vector] = MODULE_GetEntryPoint( hModule,
-		                             FIRST_INTERRUPT_ORDINAL+vector )))
-	{
-	    fprintf(stderr,"Internal error: no vector for int %02x\n",vector);
-	    return FALSE;
-	}
-    }
-    return TRUE;
-}
-
-
-/**********************************************************************
- *	    INT_GetHandler
- *
- * Return the interrupt vector for a given interrupt.
- */
-FARPROC16 INT_GetHandler( BYTE intnum )
-{
-    return INT_Vectors[intnum];
-}
-
-
-/**********************************************************************
- *	    INT_SetHandler
- *
- * Set the interrupt handler for a given interrupt.
- */
-void INT_SetHandler( BYTE intnum, FARPROC16 handler )
-{
-    dprintf_int( stddeb, "Set interrupt vector %02x <- %04x:%04x\n",
-                 intnum, HIWORD(handler), LOWORD(handler) );
-    INT_Vectors[intnum] = handler;
-}
-
-
-/**********************************************************************
- *	    INT_DummyHandler
- */
-void INT_DummyHandler( SIGCONTEXT *context )
-{
-    WORD ordinal;
-    STACK16FRAME *frame = CURRENT_STACK16;
-    BUILTIN_GetEntryPoint16( frame->entry_cs, frame->entry_ip, &ordinal );
-    INT_BARF( context, ordinal - FIRST_INTERRUPT_ORDINAL );
-}
-
-
-/**********************************************************************
- *	    INT_Int11Handler
- *
- * Handler for int 11h (get equipment list).
- */
-void INT_Int11Handler( SIGCONTEXT *context )
-{
-    int diskdrives = 0;
-    int parallelports = 0;
-    int serialports = 0;
-    int x;
-
-/* borrowed from Ralph Brown's interrupt lists 
-
-		    bits 15-14: number of parallel devices
-		    bit     13: [Conv] Internal modem
-		    bit     12: reserved
-		    bits 11- 9: number of serial devices
-		    bit      8: reserved
-		    bits  7- 6: number of diskette drives minus one
-		    bits  5- 4: Initial video mode:
-				    00b = EGA,VGA,PGA
-				    01b = 40 x 25 color
-				    10b = 80 x 25 color
-				    11b = 80 x 25 mono
-		    bit      3: reserved
-		    bit      2: [PS] =1 if pointing device
-				[non-PS] reserved
-		    bit      1: =1 if math co-processor
-		    bit      0: =1 if diskette available for boot
-*/
-/*  Currently the only of these bits correctly set are:
-		bits 15-14 		} Added by William Owen Smith, 
-		bits 11-9		} wos@dcs.warwick.ac.uk
-		bits 7-6
-		bit  2			(always set)
-*/
-
-    if (DRIVE_IsValid(0)) diskdrives++;
-    if (DRIVE_IsValid(1)) diskdrives++;
-    if (diskdrives) diskdrives--;
-	
-    for (x=0; x!=MAX_PORTS; x++)
-    {
-	if (COM[x].devicename)
-	    serialports++;
-	if (LPT[x].devicename)
-	    parallelports++;
-    }
-    if (serialports > 7)		/* 3 bits -- maximum value = 7 */
-        serialports=7;
-    if (parallelports > 3)		/* 2 bits -- maximum value = 3 */
-        parallelports=3;
-    
-    AX_reg(context) = (diskdrives << 6) | (serialports << 9) | 
-                      (parallelports << 14) | 0x02;
-}
-
-
-/**********************************************************************
- *	    INT_Int12Handler
- *
- * Handler for int 12h (get memory size).
- */
-void INT_Int12Handler( SIGCONTEXT *context )
-{
-    AX_reg(context) = 640;
-}
-
-
-/**********************************************************************
- *	    INT_Int15Handler
- *
- * Handler for int 15h.
- */
-void INT_Int15Handler( SIGCONTEXT *context )
-{
-    INT_BARF( context, 0x15 );
-}
-
-
-/**********************************************************************
- *	    INT_Int16Handler
- *
- * Handler for int 16h (keyboard).
- */
-void INT_Int16Handler( SIGCONTEXT *context )
-{
-    INT_BARF( context, 0x16 );
-}
diff --git a/msdos/Makefile.in b/msdos/Makefile.in
new file mode 100644
index 0000000..1c7682b
--- /dev/null
+++ b/msdos/Makefile.in
@@ -0,0 +1,31 @@
+DEFS      = -D__WINE__ -DNO_TRANSITION_TYPES
+TOPSRCDIR = @top_srcdir@
+TOPOBJDIR = ..
+SRCDIR    = @srcdir@
+VPATH     = @srcdir@
+MODULE    = msdos
+
+C_SRCS = \
+	dosmem.c \
+	dpmi.c \
+	int10.c \
+	int11.c \
+	int12.c \
+	int13.c \
+	int1a.c \
+	int21.c \
+	int25.c \
+	int26.c \
+	int2a.c \
+	int2f.c \
+	int4b.c \
+	int5c.c \
+	interrupts.c \
+	ioports.c \
+	vxd.c
+
+all: $(MODULE).o
+
+@MAKE_RULES@
+
+### Dependencies:
diff --git a/miscemu/dosmem.c b/msdos/dosmem.c
similarity index 80%
rename from miscemu/dosmem.c
rename to msdos/dosmem.c
index 8b454e7..55078af 100644
--- a/miscemu/dosmem.c
+++ b/msdos/dosmem.c
@@ -86,15 +86,36 @@
 
 
 /***********************************************************************
+ *           DOSMEM_InitCollateTable
+ *
+ * Initialises the collate table (character sorting, language dependend)
+ */
+DWORD DOSMEM_CollateTable;
+
+static void DOSMEM_InitCollateTable()
+{
+	DWORD		x;
+	unsigned char	*tbl;
+	int		i;
+
+	x=GlobalDOSAlloc(258);
+	DOSMEM_CollateTable=MAKELONG(0,(x>>16));
+	tbl=DOSMEM_RealMode2Linear(DOSMEM_CollateTable);
+	*(WORD*)tbl	= 0x100;
+	tbl+=2;
+	for (i=0;i<0x100;i++)
+		*tbl++=i;
+}
+
+
+/***********************************************************************
  *           DOSMEM_Init
  *
  * Create the dos memory segments, and store them into the KERNEL
- * exported values. BUILTIN_Init() must already have been called.
+ * exported values.
  */
 BOOL32 DOSMEM_Init(void)
 {
-    HMODULE16 hModule = GetModuleHandle( "KERNEL" );
-
     /* Allocate 1 MB dosmemory */
     /* Yes, allocating 1 MB of memory, which is usually not even used, is a 
      * waste of memory. But I (MM) don't see any easy method to use 
@@ -112,44 +133,11 @@
         fprintf( stderr, "Could not allocate DOS memory.\n" );
         return FALSE;
     }
-
-    MODULE_SetEntryPoint( hModule, 183,  /* KERNEL.183: __0000H */
-                          GLOBAL_CreateBlock( GMEM_FIXED, DOSMEM_dosmem,
-                                0x10000, hModule, FALSE, FALSE, FALSE, NULL ));
     DOSMEM_BiosSeg = GLOBAL_CreateBlock(GMEM_FIXED,DOSMEM_dosmem+0x400,0x100,
-                                         hModule, FALSE, FALSE, FALSE, NULL );
-
-    MODULE_SetEntryPoint( hModule, 193,  /* KERNEL.193: __0040H */
-                          DOSMEM_BiosSeg );
-    MODULE_SetEntryPoint( hModule, 174,  /* KERNEL.174: __A000H */
-                          GLOBAL_CreateBlock( GMEM_FIXED, DOSMEM_dosmem+0xA0000,
-                                0x10000, hModule, FALSE, FALSE, FALSE, NULL ));
-    MODULE_SetEntryPoint( hModule, 181,  /* KERNEL.181: __B000H */
-                          GLOBAL_CreateBlock( GMEM_FIXED, DOSMEM_dosmem+0xB0000,
-                                0x10000, hModule, FALSE, FALSE, FALSE, NULL ));
-    MODULE_SetEntryPoint( hModule, 182,  /* KERNEL.182: __B800H */
-                          GLOBAL_CreateBlock( GMEM_FIXED, DOSMEM_dosmem+0xB8000,
-                                0x10000, hModule, FALSE, FALSE, FALSE, NULL ));
-    MODULE_SetEntryPoint( hModule, 195,  /* KERNEL.195: __C000H */
-                          GLOBAL_CreateBlock( GMEM_FIXED, DOSMEM_dosmem+0xC0000,
-                                0x10000, hModule, FALSE, FALSE, FALSE, NULL ));
-    MODULE_SetEntryPoint( hModule, 179,  /* KERNEL.179: __D000H */
-                          GLOBAL_CreateBlock( GMEM_FIXED, DOSMEM_dosmem+0xD0000,
-                                0x10000, hModule, FALSE, FALSE, FALSE, NULL ));
-    MODULE_SetEntryPoint( hModule, 190,  /* KERNEL.190: __E000H */
-                          GLOBAL_CreateBlock( GMEM_FIXED, DOSMEM_dosmem+0xE0000,
-                                0x10000, hModule, FALSE, FALSE, FALSE, NULL ));
-    MODULE_SetEntryPoint( hModule, 173,  /* KERNEL.173: __ROMBIOS */
-                          GLOBAL_CreateBlock( GMEM_FIXED, DOSMEM_dosmem+0xF0000,
-                                0x10000, hModule, FALSE, FALSE, FALSE, NULL ));
-    MODULE_SetEntryPoint( hModule, 194,  /* KERNEL.194: __F000H */
-                          GLOBAL_CreateBlock( GMEM_FIXED, DOSMEM_dosmem+0xF0000,
-                                0x10000, hModule, FALSE, FALSE, FALSE, NULL ));
+                                        0, FALSE, FALSE, FALSE, NULL );
     DOSMEM_FillBiosSegment();
-
     DOSMEM_InitMemoryHandling();
     DOSMEM_InitCollateTable();
-
     return TRUE;
 }
 
@@ -216,29 +204,6 @@
 }
 
 /***********************************************************************
- *           DOSMEM_InitCollateTable
- *
- * Initialises the collate table (character sorting, language dependend)
- */
-DWORD DOSMEM_CollateTable;
-
-void
-DOSMEM_InitCollateTable()
-{
-	DWORD		x;
-	unsigned char	*tbl;
-	int		i;
-
-	x=GlobalDOSAlloc(258);
-	DOSMEM_CollateTable=MAKELONG(0,(x>>16));
-	tbl=DOSMEM_RealMode2Linear(DOSMEM_CollateTable);
-	*(WORD*)tbl	= 0x100;
-	tbl+=2;
-	for (i=0;i<0x100;i++)
-		*tbl++=i;
-}
-
-/***********************************************************************
  *           GlobalDOSAlloc	(KERNEL.184)
  *
  * Allocates a piece of DOS Memory, in the first 1 MB physical memory.
@@ -340,7 +305,7 @@
 }
 
 /***********************************************************************
- *           DOSMEM_RealMode2Linear
+ *           DOSMEM_AllocSelector
  *
  * Allocates a protected mode selector for a realmode segment.
  */
diff --git a/miscemu/dpmi.c b/msdos/dpmi.c
similarity index 98%
rename from miscemu/dpmi.c
rename to msdos/dpmi.c
index 1f8daa4..092d500 100644
--- a/miscemu/dpmi.c
+++ b/msdos/dpmi.c
@@ -43,14 +43,14 @@
     WORD  ss;
 } REALMODECALL;
 
-extern void do_mscdex( SIGCONTEXT *context );
+extern void do_mscdex( CONTEXT *context );
 
 /**********************************************************************
  *	    INT_Int31Handler
  *
  * Handler for int 31h (DPMI).
  */
-void INT_Int31Handler( SIGCONTEXT *context )
+void INT_Int31Handler( CONTEXT *context )
 {
     DWORD dw;
     BYTE *ptr;
@@ -78,12 +78,8 @@
             /* set it to zero. */
             if (!((DS_reg(context)^BX_reg(context)) & ~3)) DS_reg(context) = 0;
             if (!((ES_reg(context)^BX_reg(context)) & ~3)) ES_reg(context) = 0;
-#ifdef FS_reg
             if (!((FS_reg(context)^BX_reg(context)) & ~3)) FS_reg(context) = 0;
-#endif
-#ifdef GS_reg
             if (!((GS_reg(context)^BX_reg(context)) & ~3)) GS_reg(context) = 0;
-#endif
         }
         break;
 
@@ -235,7 +231,6 @@
 		case 0x65:
 		    switch (p->eax & 0xFF) {
 		    case 06:{/* get collate table */
-		    	extern  DWORD	DOSMEM_CollateTable;
 		        char	*table;
 		        /* ES:DI is a REALMODE pointer to 5 byte dosmem 
 			 * we fill that with 0x6, realmode pointer to collateTB
@@ -353,8 +348,7 @@
 		    "	Function to call: %04x:%04x\n",
                     p->eax, p->ebx, p->ecx, p->edx,
                     p->esi, p->edi, p->es, p->ds, p->cs, p->ip,
-		    DS_reg(context),SI_reg(context)
-	    );
+		    (WORD)DS_reg(context), SI_reg(context) );
             SET_CFLAG(context);
         }
         break;
diff --git a/miscemu/int10.c b/msdos/int10.c
similarity index 88%
rename from miscemu/int10.c
rename to msdos/int10.c
index f9f7cf2..bb99f8e 100644
--- a/miscemu/int10.c
+++ b/msdos/int10.c
@@ -1,3 +1,7 @@
+/*
+ * BIOS interrupt 10h handler
+ */
+
 #include <stdio.h>
 #include <stdlib.h>
 #include "miscemu.h"
@@ -11,7 +15,7 @@
  *
  * Handler for int 10h (video).
  */
-void INT_Int10Handler( SIGCONTEXT *context )
+void INT_Int10Handler( CONTEXT *context )
 {
     switch(AH_reg(context))
     {
diff --git a/msdos/int11.c b/msdos/int11.c
new file mode 100644
index 0000000..88b3041
--- /dev/null
+++ b/msdos/int11.c
@@ -0,0 +1,69 @@
+/*
+ * BIOS interrupt 11h handler
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include "miscemu.h"
+#include "msdos.h"
+#include "drive.h"
+#include "stddebug.h"
+#include "debug.h"
+
+/**********************************************************************
+ *	    INT_Int11Handler
+ *
+ * Handler for int 11h (get equipment list).
+ */
+void INT_Int11Handler( CONTEXT *context )
+{
+    int diskdrives = 0;
+    int parallelports = 0;
+    int serialports = 0;
+    int x;
+
+/* borrowed from Ralph Brown's interrupt lists 
+
+		    bits 15-14: number of parallel devices
+		    bit     13: [Conv] Internal modem
+		    bit     12: reserved
+		    bits 11- 9: number of serial devices
+		    bit      8: reserved
+		    bits  7- 6: number of diskette drives minus one
+		    bits  5- 4: Initial video mode:
+				    00b = EGA,VGA,PGA
+				    01b = 40 x 25 color
+				    10b = 80 x 25 color
+				    11b = 80 x 25 mono
+		    bit      3: reserved
+		    bit      2: [PS] =1 if pointing device
+				[non-PS] reserved
+		    bit      1: =1 if math co-processor
+		    bit      0: =1 if diskette available for boot
+*/
+/*  Currently the only of these bits correctly set are:
+		bits 15-14 		} Added by William Owen Smith, 
+		bits 11-9		} wos@dcs.warwick.ac.uk
+		bits 7-6
+		bit  2			(always set)
+*/
+
+    if (DRIVE_IsValid(0)) diskdrives++;
+    if (DRIVE_IsValid(1)) diskdrives++;
+    if (diskdrives) diskdrives--;
+	
+    for (x=0; x!=MAX_PORTS; x++)
+    {
+	if (COM[x].devicename)
+	    serialports++;
+	if (LPT[x].devicename)
+	    parallelports++;
+    }
+    if (serialports > 7)		/* 3 bits -- maximum value = 7 */
+        serialports=7;
+    if (parallelports > 3)		/* 2 bits -- maximum value = 3 */
+        parallelports=3;
+    
+    AX_reg(context) = (diskdrives << 6) | (serialports << 9) | 
+                      (parallelports << 14) | 0x02;
+}
diff --git a/msdos/int12.c b/msdos/int12.c
new file mode 100644
index 0000000..cff7f52
--- /dev/null
+++ b/msdos/int12.c
@@ -0,0 +1,15 @@
+/*
+ * BIOS interrupt 12h handler
+ */
+
+#include "miscemu.h"
+
+/**********************************************************************
+ *	    INT_Int12Handler
+ *
+ * Handler for int 12h (get memory size).
+ */
+void INT_Int12Handler( CONTEXT *context )
+{
+    AX_reg(context) = 640;
+}
diff --git a/miscemu/int13.c b/msdos/int13.c
similarity index 95%
rename from miscemu/int13.c
rename to msdos/int13.c
index 3fda6f2..9213897 100644
--- a/miscemu/int13.c
+++ b/msdos/int13.c
@@ -1,3 +1,7 @@
+/*
+ * BIOS interrupt 13h handler
+ */
+
 #include <stdio.h>
 #include <stdlib.h>
 #include "miscemu.h"
@@ -11,7 +15,7 @@
  *
  * Handler for int 13h (disk I/O).
  */
-void INT_Int13Handler( SIGCONTEXT *context )
+void INT_Int13Handler( CONTEXT *context )
 {
     switch(AH_reg(context))
     {
diff --git a/miscemu/int1a.c b/msdos/int1a.c
similarity index 96%
rename from miscemu/int1a.c
rename to msdos/int1a.c
index 5017010..ddc52ef 100644
--- a/miscemu/int1a.c
+++ b/msdos/int1a.c
@@ -1,3 +1,7 @@
+/*
+ * BIOS interrupt 1ah handler
+ */
+
 #include <time.h>
 #include <sys/time.h>
 #include <stdio.h>
@@ -40,7 +44,7 @@
  *
  * Handler for int 1ah (date and time).
  */
-void INT_Int1aHandler( SIGCONTEXT *context )
+void INT_Int1aHandler( CONTEXT *context )
 {
     time_t ltime;
     DWORD ticks;
diff --git a/miscemu/int21.c b/msdos/int21.c
similarity index 86%
rename from miscemu/int21.c
rename to msdos/int21.c
index d2a5fb5..609b908 100644
--- a/miscemu/int21.c
+++ b/msdos/int21.c
@@ -1,5 +1,5 @@
 /*
- * (c) 1993, 1994 Erik Bos
+ * DOS interrupt 21h handler
  */
 
 #include <time.h>
@@ -65,7 +65,6 @@
 };
 
 WORD CodePage = 437;
-struct DPB *dpb;
 DWORD dpbsegptr;
 
 struct DosHeap {
@@ -82,6 +81,20 @@
 
 extern char TempDirectory[];
 
+static BOOL32 INT21_CreateHeap(void)
+{
+    if (!(DosHeapHandle = GlobalAlloc16(GMEM_FIXED,sizeof(struct DosHeap))))
+    {
+        fprintf( stderr, "INT21_Init: Out of memory\n");
+        return FALSE;
+    }
+    heap = (struct DosHeap *) GlobalLock16(DosHeapHandle);
+    dpbsegptr = PTR_SEG_OFF_TO_SEGPTR(DosHeapHandle,(int)&heap->dpb-(int)heap);
+    heap->InDosFlag = 0;
+    strcpy(heap->biosdate, "01/01/80");
+    return TRUE;
+}
+
 BYTE *GetCurrentDTA(void)
 {
     TDB *pTask = (TDB *)GlobalLock16( GetCurrentTask() );
@@ -133,7 +146,7 @@
 	}	
 }
 
-static int INT21_GetFreeDiskSpace( SIGCONTEXT *context )
+static int INT21_GetFreeDiskSpace( CONTEXT *context )
 {
     DWORD cluster_sectors, sector_bytes, free_clusters, total_clusters;
     char root[] = "A:\\";
@@ -148,23 +161,24 @@
     return 1;
 }
 
-static int INT21_GetDriveAllocInfo( SIGCONTEXT *context )
+static int INT21_GetDriveAllocInfo( CONTEXT *context )
 {
     if (!INT21_GetFreeDiskSpace( context )) return 0;
+    if (!heap && !INT21_CreateHeap()) return 0;
     heap->mediaID = 0xf0;
     DS_reg(context) = DosHeapHandle;
     BX_reg(context) = (int)&heap->mediaID - (int)heap;
     return 1;
 }
 
-static void GetDrivePB( SIGCONTEXT *context, int drive )
+static void GetDrivePB( CONTEXT *context, int drive )
 {
         if(!DRIVE_IsValid(drive))
         {
             DOS_ERROR( ER_InvalidDrive, EC_MediaError, SA_Abort, EL_Disk );
             AX_reg(context) = 0x00ff;
         }
-        else
+        else if (heap || INT21_CreateHeap())
         {
                 dprintf_int(stddeb, "int21: GetDrivePB not fully implemented.\n");
 
@@ -175,23 +189,23 @@
                  * does worry me, though.  Should we have a complete table of
                  * separate DPBs per drive?  Probably, but I'm lazy. :-)  -CH
                  */
-                dpb->drive_num = dpb->unit_num = drive;    /* The same? */
-                dpb->sector_size = 512;
-                dpb->high_sector = 1;
-                dpb->shift = drive < 2 ? 0 : 6; /* 6 for HD, 0 for floppy */
-                dpb->reserved = 0;
-                dpb->num_FAT = 1;
-                dpb->dir_entries = 2;
-                dpb->first_data = 2;
-                dpb->high_cluster = 64000;
-                dpb->sectors_in_FAT = 1;
-                dpb->start_dir = 1;
-                dpb->driver_head = 0;
-                dpb->media_ID = (drive > 1) ? 0xF8 : 0xF0;
-                dpb->access_flag = 0;
-                dpb->next = 0;
-                dpb->free_search = 0;
-                dpb->free_clusters = 0xFFFF;    /* unknown */
+                heap->dpb.drive_num = heap->dpb.unit_num = drive; /*The same?*/
+                heap->dpb.sector_size = 512;
+                heap->dpb.high_sector = 1;
+                heap->dpb.shift = drive < 2 ? 0 : 6; /*6 for HD, 0 for floppy*/
+                heap->dpb.reserved = 0;
+                heap->dpb.num_FAT = 1;
+                heap->dpb.dir_entries = 2;
+                heap->dpb.first_data = 2;
+                heap->dpb.high_cluster = 64000;
+                heap->dpb.sectors_in_FAT = 1;
+                heap->dpb.start_dir = 1;
+                heap->dpb.driver_head = 0;
+                heap->dpb.media_ID = (drive > 1) ? 0xF8 : 0xF0;
+                heap->dpb.access_flag = 0;
+                heap->dpb.next = 0;
+                heap->dpb.free_search = 0;
+                heap->dpb.free_clusters = 0xFFFF;    /* unknown */
 
                 AL_reg(context) = 0x00;
                 DS_reg(context) = SELECTOROF(dpbsegptr);
@@ -200,7 +214,7 @@
 }
 
 
-static void ioctlGetDeviceInfo( SIGCONTEXT *context )
+static void ioctlGetDeviceInfo( CONTEXT *context )
 {
     dprintf_int (stddeb, "int21: ioctl (%d, GetDeviceInfo)\n", BX_reg(context));
     
@@ -213,7 +227,7 @@
     RESET_CFLAG(context);
 }
 
-static void ioctlGenericBlkDevReq( SIGCONTEXT *context )
+static void ioctlGenericBlkDevReq( CONTEXT *context )
 {
 	BYTE *dataptr = PTR_SEG_OFF_TO_LIN(DS_reg(context), DX_reg(context));
 	int drive = DOS_GET_DRIVE( BL_reg(context) );
@@ -277,7 +291,7 @@
 	}
 }
 
-static void GetSystemDate( SIGCONTEXT *context )
+static void GetSystemDate( CONTEXT *context )
 {
 	struct tm *now;
 	time_t ltime;
@@ -290,7 +304,7 @@
 	AX_reg(context) = now->tm_wday;
 }
 
-static void INT21_GetSystemTime( SIGCONTEXT *context )
+static void INT21_GetSystemTime( CONTEXT *context )
 {
 	struct tm *now;
 	struct timeval tv;
@@ -305,11 +319,11 @@
 					/* Note hundredths of seconds */
 }
 
-static void INT21_CreateFile( SIGCONTEXT *context )
+static void INT21_CreateFile( CONTEXT *context )
 {
-    AX_reg(context) = _lcreat( PTR_SEG_OFF_TO_LIN( DS_reg(context),
+    AX_reg(context) = _lcreat16( PTR_SEG_OFF_TO_LIN( DS_reg(context),
                                           DX_reg(context) ), CX_reg(context) );
-    if (AX_reg(context) == (WORD)HFILE_ERROR)
+    if (AX_reg(context) == (WORD)HFILE_ERROR16)
     {
 	AX_reg(context) = DOS_ExtendedError;
 	SET_CFLAG(context);
@@ -317,11 +331,11 @@
 }
 
 
-void OpenExistingFile( SIGCONTEXT *context )
+void OpenExistingFile( CONTEXT *context )
 {
-    AX_reg(context) = _lopen( PTR_SEG_OFF_TO_LIN(DS_reg(context),DX_reg(context)),
+    AX_reg(context) = _lopen16( PTR_SEG_OFF_TO_LIN(DS_reg(context),DX_reg(context)),
                               AL_reg(context) );
-    if (AX_reg(context) == (WORD)HFILE_ERROR)
+    if (AX_reg(context) == (WORD)HFILE_ERROR16)
     {
         AX_reg(context) = DOS_ExtendedError;
         SET_CFLAG(context);
@@ -398,16 +412,16 @@
 #endif
 }
 
-static void CloseFile( SIGCONTEXT *context )
+static void CloseFile( CONTEXT *context )
 {
-    if ((AX_reg(context) = _lclose( BX_reg(context) )) != 0)
+    if ((AX_reg(context) = _lclose16( BX_reg(context) )) != 0)
     {
         AX_reg(context) = DOS_ExtendedError;
         SET_CFLAG(context);
     }
 }
 
-void ExtendedOpenCreateFile(SIGCONTEXT *context )
+void ExtendedOpenCreateFile(CONTEXT *context )
 {
   BYTE action=DL_reg(context);
   dprintf_int(stddeb, "int21: extended open/create: file= %s \n",
@@ -497,7 +511,7 @@
 }
 
 
-static int INT21_RenameFile( SIGCONTEXT *context )
+static int INT21_RenameFile( CONTEXT *context )
 {
     const char *newname, *oldname;
     char *buffer;
@@ -530,7 +544,7 @@
 }
 
 
-static void INT21_ChangeDir( SIGCONTEXT *context )
+static void INT21_ChangeDir( CONTEXT *context )
 {
     int drive;
     char *dirname = PTR_SEG_OFF_TO_LIN(DS_reg(context),DX_reg(context));
@@ -550,7 +564,7 @@
 }
 
 
-static int INT21_FindFirst( SIGCONTEXT *context )
+static int INT21_FindFirst( CONTEXT *context )
 {
     const char *path, *unixPath, *mask;
     char *p;
@@ -585,10 +599,10 @@
 }
 
 
-static int INT21_FindNext( SIGCONTEXT *context )
+static int INT21_FindNext( CONTEXT *context )
 {
     FINDFILE_DTA *dta = (FINDFILE_DTA *)GetCurrentDTA();
-    DOS_DIRENT entry;
+    WIN32_FIND_DATA32A entry;
     int count;
 
     if (!dta->unixPath) return 0;
@@ -607,16 +621,16 @@
         return 0;
     }
     dta->count += count;
-    dta->fileattr = entry.attr;
-    dta->filetime = entry.time;
-    dta->filedate = entry.date;
-    dta->filesize = entry.size;
-    strcpy( dta->filename, DOSFS_ToDosDTAFormat( entry.name ) );
+    dta->fileattr = entry.dwFileAttributes;
+    dta->filesize = entry.nFileSizeLow;
+    FileTimeToDosDateTime( &entry.ftLastWriteTime,
+                           &dta->filedate, &dta->filetime );
+    strcpy( dta->filename, entry.cAlternateFileName );
     return 1;
 }
 
 
-static int INT21_CreateTempFile( SIGCONTEXT *context )
+static int INT21_CreateTempFile( CONTEXT *context )
 {
     static int counter = 0;
     char *name = PTR_SEG_OFF_TO_LIN( DS_reg(context), DX_reg(context) );
@@ -627,7 +641,7 @@
         sprintf( p, "wine%04x.%03d", (int)getpid(), counter );
         counter = (counter + 1) % 1000;
 
-        if ((AX_reg(context) = _lcreat_uniq( name, 0 )) != (WORD)HFILE_ERROR)
+        if ((AX_reg(context) = _lcreat_uniq( name, 0 )) != (WORD)HFILE_ERROR16)
         {
             dprintf_int( stddeb, "INT21_CreateTempFile: created %s\n", name );
             return 1;
@@ -637,7 +651,7 @@
 }
 
 
-static int INT21_GetCurrentDirectory( SIGCONTEXT *context ) 
+static int INT21_GetCurrentDirectory( CONTEXT *context ) 
 {
     int drive = DOS_GET_DRIVE( DL_reg(context) );
     char *ptr = (char *)PTR_SEG_OFF_TO_LIN( DS_reg(context), SI_reg(context) );
@@ -653,7 +667,7 @@
 }
 
 
-static int INT21_GetDiskSerialNumber( SIGCONTEXT *context )
+static int INT21_GetDiskSerialNumber( CONTEXT *context )
 {
     BYTE *dataptr = PTR_SEG_OFF_TO_LIN(DS_reg(context), DX_reg(context));
     int drive = DOS_GET_DRIVE( BL_reg(context) );
@@ -672,7 +686,7 @@
 }
 
 
-static int INT21_SetDiskSerialNumber( SIGCONTEXT *context )
+static int INT21_SetDiskSerialNumber( CONTEXT *context )
 {
     BYTE *dataptr = PTR_SEG_OFF_TO_LIN(DS_reg(context), DX_reg(context));
     int drive = DOS_GET_DRIVE( BL_reg(context) );
@@ -691,7 +705,7 @@
 /* microsoft's programmers should be shot for using CP/M style int21
    calls in Windows for Workgroup's winfile.exe */
 
-static int INT21_FindFirstFCB( SIGCONTEXT *context )
+static int INT21_FindFirstFCB( CONTEXT *context )
 {
     BYTE *fcb = (BYTE *)PTR_SEG_OFF_TO_LIN(DS_reg(context), DX_reg(context));
     FINDFILE_FCB *pFCB;
@@ -719,12 +733,12 @@
 }
 
 
-static int INT21_FindNextFCB( SIGCONTEXT *context )
+static int INT21_FindNextFCB( CONTEXT *context )
 {
     BYTE *fcb = (BYTE *)PTR_SEG_OFF_TO_LIN(DS_reg(context), DX_reg(context));
     FINDFILE_FCB *pFCB;
     DOS_DIRENTRY_LAYOUT *pResult = (DOS_DIRENTRY_LAYOUT *)GetCurrentDTA();
-    DOS_DIRENT entry;
+    WIN32_FIND_DATA32A entry;
     BYTE attr;
     int count;
 
@@ -750,18 +764,37 @@
     }
     pFCB->count += count;
 
-    memcpy( pResult->filename, entry.name, sizeof(pResult->filename) );
-    pResult->fileattr = entry.attr;
-    memset( pResult->reserved, 0, sizeof(pResult->reserved) );
-    pResult->filetime = entry.time;
-    pResult->filedate = entry.date;
+    pResult->fileattr = entry.dwFileAttributes;
     pResult->cluster  = 0;  /* what else? */
-    pResult->filesize = entry.size;
+    pResult->filesize = entry.nFileSizeLow;
+    memset( pResult->reserved, 0, sizeof(pResult->reserved) );
+    FileTimeToDosDateTime( &entry.ftLastWriteTime,
+                           &pResult->filedate, &pResult->filetime );
+
+    /* Convert file name to FCB format */
+
+    memset( pResult->filename, ' ', sizeof(pResult->filename) );
+    if (!strcmp( entry.cAlternateFileName, "." )) pResult->filename[0] = '.';
+    else if (!strcmp( entry.cAlternateFileName, ".." ))
+        pResult->filename[0] = pResult->filename[1] = '.';
+    else
+    {
+        char *p = strrchr( entry.cAlternateFileName, '.' );
+        if (p && p[1] && (p != entry.cAlternateFileName))
+        {
+            memcpy( pResult->filename, entry.cAlternateFileName,
+                    MIN( (p - entry.cAlternateFileName), 8 ) );
+            memcpy( pResult->filename + 8, p + 1, MIN( strlen(p), 3 ) );
+        }
+        else
+            memcpy( pResult->filename, entry.cAlternateFileName,
+                    MIN( strlen(entry.cAlternateFileName), 8 ) );
+    }
     return 1;
 }
 
 
-static void DeleteFileFCB( SIGCONTEXT *context )
+static void DeleteFileFCB( CONTEXT *context )
 {
     fprintf( stderr, "DeleteFileFCB: not implemented yet\n" );
 #if 0
@@ -803,7 +836,7 @@
 #endif
 }
 
-static void RenameFileFCB( SIGCONTEXT *context )
+static void RenameFileFCB( CONTEXT *context )
 {
     fprintf( stderr, "RenameFileFCB: not implemented yet\n" );
 #if 0
@@ -849,7 +882,7 @@
 
 
 
-static void fLock( SIGCONTEXT * context )
+static void fLock( CONTEXT * context )
 {
 #if 0
     struct flock f;
@@ -900,14 +933,15 @@
 } 
 
 
-static int INT21_GetFileAttribute( SIGCONTEXT * context )
+static int INT21_GetFileAttribute( CONTEXT * context )
 {
     const char *unixName;
+    BY_HANDLE_FILE_INFORMATION info;
 
     unixName = DOSFS_GetUnixFileName( PTR_SEG_OFF_TO_LIN(DS_reg(context),DX_reg(context)), TRUE );
     if (!unixName) return 0;
-    if (!FILE_Stat( unixName, &CL_reg(context), NULL, NULL, NULL )) return 0;
-    CH_reg(context) = 0;
+    if (!FILE_Stat( unixName, &info )) return 0;
+    CX_reg(context) = info.dwFileAttributes;
     dprintf_int( stddeb, "INT21_GetFileAttributes(%s) = 0x%x\n",
                  unixName, CX_reg(context) );
     return 1;
@@ -919,13 +953,14 @@
 /***********************************************************************
  *           DOS3Call  (KERNEL.102)
  */
-void DOS3Call( SIGCONTEXT *context )
+void DOS3Call( CONTEXT *context )
 {
     dprintf_int( stddeb, "int21: AX=%04x BX=%04x CX=%04x DX=%04x "
                  "SI=%04x DI=%04x DS=%04x ES=%04x EFL=%08lx\n",
                  AX_reg(context), BX_reg(context), CX_reg(context),
                  DX_reg(context), SI_reg(context), DI_reg(context),
-                 DS_reg(context), ES_reg(context), EFL_reg(context));
+                 (WORD)DS_reg(context), (WORD)ES_reg(context),
+                 EFL_reg(context) );
 
     if (AH_reg(context) == 0x59)  /* Get extended error info */
     {
@@ -1124,6 +1159,7 @@
         break;	
 	    
     case 0x34: /* GET ADDRESS OF INDOS FLAG */
+        if (!heap) INT21_CreateHeap();
         ES_reg(context) = DosHeapHandle;
         BX_reg(context) = (int)&heap->InDosFlag - (int)heap;
         break;
@@ -1168,9 +1204,9 @@
         break;
 	
     case 0x3c: /* "CREAT" - CREATE OR TRUNCATE FILE */
-        AX_reg(context) = _lcreat( PTR_SEG_OFF_TO_LIN( DS_reg(context),
+        AX_reg(context) = _lcreat16( PTR_SEG_OFF_TO_LIN( DS_reg(context),
                                     DX_reg(context) ), CX_reg(context) );
-        if (AX_reg(context) == (WORD)HFILE_ERROR)
+        if (AX_reg(context) == (WORD)HFILE_ERROR16)
         {
             AX_reg(context) = DOS_ExtendedError;
             SET_CFLAG(context);
@@ -1182,7 +1218,7 @@
         break;
 
     case 0x3e: /* "CLOSE" - CLOSE FILE */
-        if ((AX_reg(context) = _lclose( BX_reg(context) )) != 0)
+        if ((AX_reg(context) = _lclose16( BX_reg(context) )) != 0)
         {
             AX_reg(context) = DOS_ExtendedError;
             SET_CFLAG(context);
@@ -1206,10 +1242,10 @@
 
     case 0x40: /* "WRITE" - WRITE TO FILE OR DEVICE */
         {
-            LONG result = _hwrite( BX_reg(context),
-                                   PTR_SEG_OFF_TO_LIN( DS_reg(context),
-                                                       DX_reg(context) ),
-                                   CX_reg(context) );
+            LONG result = _hwrite16( BX_reg(context),
+                                     PTR_SEG_OFF_TO_LIN( DS_reg(context),
+                                                         DX_reg(context) ),
+                                     CX_reg(context) );
             if (result == -1)
             {
                 AX_reg(context) = DOS_ExtendedError;
@@ -1230,10 +1266,10 @@
 
     case 0x42: /* "LSEEK" - SET CURRENT FILE POSITION */
         {
-            LONG status = _llseek( BX_reg(context),
-                                   MAKELONG(DX_reg(context),CX_reg(context)),
-                                   AL_reg(context) );
-            if (status == HFILE_ERROR)
+            LONG status = _llseek16( BX_reg(context),
+                                     MAKELONG(DX_reg(context),CX_reg(context)),
+                                     AL_reg(context) );
+            if (status == -1)
             {
                 AX_reg(context) = DOS_ExtendedError;
                 SET_CFLAG(context);
@@ -1357,7 +1393,7 @@
         break;
 
     case 0x45: /* "DUP" - DUPLICATE FILE HANDLE */
-        if ((AX_reg(context) = FILE_Dup(BX_reg(context))) == (WORD)HFILE_ERROR)
+        if ((AX_reg(context) = FILE_Dup(BX_reg(context))) == (WORD)HFILE_ERROR16)
         {
             AX_reg(context) = DOS_ExtendedError;
             SET_CFLAG(context);
@@ -1365,7 +1401,7 @@
         break;
 
     case 0x46: /* "DUP2", "FORCEDUP" - FORCE DUPLICATE FILE HANDLE */
-        if (FILE_Dup2( BX_reg(context), CX_reg(context) ) == HFILE_ERROR)
+        if (FILE_Dup2( BX_reg(context), CX_reg(context) ) == HFILE_ERROR32)
         {
             AX_reg(context) = DOS_ExtendedError;
             SET_CFLAG(context);
@@ -1389,9 +1425,9 @@
         break;
 	
     case 0x4b: /* "EXEC" - LOAD AND/OR EXECUTE PROGRAM */
-        AX_reg(context) = WinExec( PTR_SEG_OFF_TO_LIN( DS_reg(context),
-                                                        DX_reg(context) ),
-                                    SW_NORMAL );
+        AX_reg(context) = WinExec16( PTR_SEG_OFF_TO_LIN( DS_reg(context),
+                                                         DX_reg(context) ),
+                                     SW_NORMAL );
         if (AX_reg(context) < 32) SET_CFLAG(context);
         break;		
 	
@@ -1441,20 +1477,28 @@
         switch (AL_reg(context))
         {
         case 0x00:  /* Get */
-            if (!FILE_GetDateTime( BX_reg(context), &DX_reg(context),
-                                   &CX_reg(context), TRUE ))
             {
-                AX_reg(context) = DOS_ExtendedError;
-                SET_CFLAG(context);
+                FILETIME filetime;
+                if (!GetFileTime( BX_reg(context), NULL, NULL, &filetime ))
+                {
+                    AX_reg(context) = DOS_ExtendedError;
+                    SET_CFLAG(context);
+                }
+                else FileTimeToDosDateTime( &filetime, &DX_reg(context),
+                                            &CX_reg(context) );
             }
             break;
 
         case 0x01:  /* Set */
-            if (!FILE_SetDateTime( BX_reg(context), DX_reg(context),
-                                   CX_reg(context) ))
             {
-                AX_reg(context) = DOS_ExtendedError;
-                SET_CFLAG(context);
+                FILETIME filetime;
+                DosDateTimeToFileTime( DX_reg(context), CX_reg(context),
+                                       &filetime );
+                if (!SetFileTime( BX_reg(context), NULL, NULL, &filetime ))
+                {
+                    AX_reg(context) = DOS_ExtendedError;
+                    SET_CFLAG(context);
+                }
             }
             break;
         }
@@ -1485,7 +1529,7 @@
         break;
 
     case 0x5b: /* CREATE NEW FILE */
-        if ((AX_reg(context) = _lcreat_uniq( PTR_SEG_OFF_TO_LIN(DS_reg(context),DX_reg(context)), 0 )) == (WORD)HFILE_ERROR)
+        if ((AX_reg(context) = _lcreat_uniq( PTR_SEG_OFF_TO_LIN(DS_reg(context),DX_reg(context)), 0 )) == (WORD)HFILE_ERROR16)
         {
             AX_reg(context) = DOS_ExtendedError;
             SET_CFLAG(context);
@@ -1564,14 +1608,11 @@
 	    *(WORD*)(dataptr+3) = WINE_LanguageId;
 	    *(WORD*)(dataptr+5) = CodePage;
 	    break;
-	case 0x06: {
-	    extern  DWORD   DOSMEM_CollateTable;
-
+	case 0x06:
 	    dataptr[0] = 0x06;
 	    *(DWORD*)(dataptr+1) = MAKELONG(DOSMEM_CollateTable & 0xFFFF,DOSMEM_AllocSelector(DOSMEM_CollateTable>>16));
 	    CX_reg(context)         = 258;/*FIXME: size of table?*/
 	    break;
-	}
 	default:
             INT_BARF( context, 0x21 );
             SET_CFLAG(context);
@@ -1656,14 +1697,39 @@
                 SET_CFLAG(context);
             }
             break;
+        case 0x4e:  /* Find first file */
+            /* FIXME: use attributes in CX */
+            if (!(AX_reg(context) = FindFirstFile16(
+                   PTR_SEG_OFF_TO_LIN(DS_reg(context),DX_reg(context)),
+                   (WIN32_FIND_DATA32A *)PTR_SEG_OFF_TO_LIN(ES_reg(context),
+                                                            DI_reg(context)))))
+            {
+                AX_reg(context) = DOS_ExtendedError;
+                SET_CFLAG(context);
+            }
+            break;
+        case 0x4f:  /* Find next file */
+            if (!FindNextFile16( BX_reg(context),
+                    (WIN32_FIND_DATA32A *)PTR_SEG_OFF_TO_LIN(ES_reg(context),
+                                                             DI_reg(context))))
+            {
+                AX_reg(context) = DOS_ExtendedError;
+                SET_CFLAG(context);
+            }
+            break;
+        case 0xa1:  /* Find close */
+            if (!FindClose16( BX_reg(context) ))
+            {
+                AX_reg(context) = DOS_ExtendedError;
+                SET_CFLAG(context);
+            }
+            break;
 	case 0xa0:
 	    break;
         case 0x3b:  /* Change directory */
         case 0x41:  /* Delete file */
         case 0x43:  /* Get/Set file attributes */
         case 0x47:  /* Get current directory */
-        case 0x4e:  /* Find first file */
-        case 0x4f:  /* Find next file */
         case 0x56:  /* Move (rename) file */
         case 0x6c:  /* Create/Open file */
         default:
@@ -1697,22 +1763,6 @@
                  "SI=%04x DI=%04x DS=%04x ES=%04x EFL=%08lx\n",
                  AX_reg(context), BX_reg(context), CX_reg(context),
                  DX_reg(context), SI_reg(context), DI_reg(context),
-                 DS_reg(context), ES_reg(context), EFL_reg(context));
-}
-
-
-BOOL32 INT21_Init(void)
-{
-    if (!(DosHeapHandle = GlobalAlloc16(GMEM_FIXED,sizeof(struct DosHeap))))
-    {
-        fprintf( stderr, "INT21_Init: Out of memory\n");
-        return FALSE;
-    }
-    heap = (struct DosHeap *) GlobalLock16(DosHeapHandle);
-
-    dpb = &heap->dpb;
-    dpbsegptr = PTR_SEG_OFF_TO_SEGPTR(DosHeapHandle,(int)&heap->dpb-(int)heap);
-    heap->InDosFlag = 0;
-    strcpy(heap->biosdate, "01/01/80");
-    return TRUE;
+                 (WORD)DS_reg(context), (WORD)ES_reg(context),
+                 EFL_reg(context));
 }
diff --git a/miscemu/int25.c b/msdos/int25.c
similarity index 93%
rename from miscemu/int25.c
rename to msdos/int25.c
index f1b8052..7073bd8 100644
--- a/miscemu/int25.c
+++ b/msdos/int25.c
@@ -1,3 +1,7 @@
+/*
+ * DOS interrupt 25h handler
+ */
+
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
@@ -14,7 +18,7 @@
  *
  * Handler for int 25h (absolute disk read).
  */
-void INT_Int25Handler( SIGCONTEXT *context )
+void INT_Int25Handler( CONTEXT *context )
 {
     BYTE *dataptr = PTR_SEG_OFF_TO_LIN( DS_reg(context), BX_reg(context) );
     DWORD begin, length;
diff --git a/miscemu/int26.c b/msdos/int26.c
similarity index 92%
rename from miscemu/int26.c
rename to msdos/int26.c
index 4009184..09ee526 100644
--- a/miscemu/int26.c
+++ b/msdos/int26.c
@@ -1,3 +1,7 @@
+/*
+ * DOS interrupt 26h handler
+ */
+
 #include <stdio.h>
 #include <stdlib.h>
 #include "msdos.h"
@@ -13,7 +17,7 @@
  *
  * Handler for int 26h (absolute disk read).
  */
-void INT_Int26Handler( SIGCONTEXT *context )
+void INT_Int26Handler( CONTEXT *context )
 {
     BYTE *dataptr = PTR_SEG_OFF_TO_LIN( DS_reg(context), BX_reg(context) );
     DWORD begin, length;
diff --git a/miscemu/int2a.c b/msdos/int2a.c
similarity index 85%
rename from miscemu/int2a.c
rename to msdos/int2a.c
index c41b10d..02e37d8 100644
--- a/miscemu/int2a.c
+++ b/msdos/int2a.c
@@ -1,3 +1,7 @@
+/*
+ * DOS interrupt 2ah handler
+ */
+
 #include <stdio.h>
 #include <stdlib.h>
 #include "msdos.h"
@@ -11,7 +15,7 @@
  *
  * Handler for int 2ah (network).
  */
-void INT_Int2aHandler( SIGCONTEXT *context )
+void INT_Int2aHandler( CONTEXT *context )
 {
     switch(AH_reg(context))
     {
diff --git a/miscemu/int2f.c b/msdos/int2f.c
similarity index 95%
rename from miscemu/int2f.c
rename to msdos/int2f.c
index b8b6277..23eb9ab 100644
--- a/miscemu/int2f.c
+++ b/msdos/int2f.c
@@ -1,3 +1,7 @@
+/*
+ * DOS interrupt 2fh handler
+ */
+
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
@@ -15,15 +19,15 @@
   /* base WPROCS.DLL ordinal number for VxDs */
 #define VXD_BASE 400
 
-static void do_int2f_16( SIGCONTEXT *context );
-void do_mscdex( SIGCONTEXT *context );
+static void do_int2f_16( CONTEXT *context );
+void do_mscdex( CONTEXT *context );
 
 /**********************************************************************
  *	    INT_Int2fHandler
  *
  * Handler for int 2fh (multiplex).
  */
-void INT_Int2fHandler( SIGCONTEXT *context )
+void INT_Int2fHandler( CONTEXT *context )
 {
     switch(AH_reg(context))
     {
@@ -65,7 +69,7 @@
 /**********************************************************************
  *	    do_int2f_16
  */
-static void do_int2f_16( SIGCONTEXT *context )
+static void do_int2f_16( CONTEXT *context )
 {
     DWORD addr;
 
@@ -136,7 +140,7 @@
     }
 }
 
-void do_mscdex( SIGCONTEXT *context )
+void do_mscdex( CONTEXT *context )
 {
     int drive, count;
     char *p;
diff --git a/msdos/int4b.c b/msdos/int4b.c
new file mode 100644
index 0000000..4f4e8c5
--- /dev/null
+++ b/msdos/int4b.c
@@ -0,0 +1,25 @@
+/*
+ * DOS interrupt 4bh handler
+ */
+
+#include "miscemu.h"
+
+/***********************************************************************
+ *           INT_Int4bHandler
+ *
+ */
+void INT_Int4bHandler( CONTEXT *context )
+{
+    switch(AH_reg(context))
+    {
+    case 0x81: /* Virtual DMA Spec (IBM SCSI interface) */   
+        if(AL_reg(context) != 0x02) /* if not install check */
+        {
+            SET_CFLAG(context);		 
+            AL_reg(context) = 0x0f; /* function is not implemented */
+        }
+        break;
+    default:
+        INT_BARF(context, 0x4b);
+    }
+}
diff --git a/msdos/int5c.c b/msdos/int5c.c
new file mode 100644
index 0000000..ab22059
--- /dev/null
+++ b/msdos/int5c.c
@@ -0,0 +1,25 @@
+/*
+ * NetBIOS interrupt handling
+ *
+ * Copyright 1995 Alexandre Julliard, Alex Korobka
+ */
+
+#include "ldt.h"
+#include "miscemu.h"
+#include "stddebug.h"
+#include "debug.h"
+
+
+/***********************************************************************
+ *           NetBIOSCall  (KERNEL.103)
+ *
+ * Also handler for interrupt 5c. 
+ */
+void NetBIOSCall( CONTEXT *context )
+{
+    BYTE* ptr;
+    ptr = (BYTE*) PTR_SEG_OFF_TO_LIN(ES_reg(context),BX_reg(context));
+    fprintf(stdnimp,"NetBIOSCall: command code %02x (ignored)\n",*ptr);
+    AL_reg(context) = *(ptr+0x01) = 0xFB; /* NetBIOS emulator not found */
+}
+
diff --git a/msdos/interrupts.c b/msdos/interrupts.c
new file mode 100644
index 0000000..31710fd
--- /dev/null
+++ b/msdos/interrupts.c
@@ -0,0 +1,42 @@
+/*
+ * Interrupt vectors emulation
+ *
+ * Copyright 1995 Alexandre Julliard
+ */
+
+#include <sys/types.h>
+
+#include "windows.h"
+#include "drive.h"
+#include "miscemu.h"
+#include "msdos.h"
+#include "module.h"
+#include "stackframe.h"
+#include "stddebug.h"
+#include "debug.h"
+
+static FARPROC16 INT_Vectors[256];
+
+
+/**********************************************************************
+ *	    INT_GetHandler
+ *
+ * Return the interrupt vector for a given interrupt.
+ */
+FARPROC16 INT_GetHandler( BYTE intnum )
+{
+    return INT_Vectors[intnum];
+}
+
+
+/**********************************************************************
+ *	    INT_SetHandler
+ *
+ * Set the interrupt handler for a given interrupt.
+ */
+void INT_SetHandler( BYTE intnum, FARPROC16 handler )
+{
+    dprintf_int( stddeb, "Set interrupt vector %02x <- %04x:%04x\n",
+                 intnum, HIWORD(handler), LOWORD(handler) );
+    INT_Vectors[intnum] = handler;
+}
diff --git a/miscemu/ioports.c b/msdos/ioports.c
similarity index 76%
rename from miscemu/ioports.c
rename to msdos/ioports.c
index 3ea012a..7e41ce8 100644
--- a/miscemu/ioports.c
+++ b/msdos/ioports.c
@@ -34,7 +34,10 @@
 };
 
 
-DWORD inport( int port, int count )
+/**********************************************************************
+ *	    IO_inport
+ */
+DWORD IO_inport( int port, int count )
 {
     DWORD res = 0;
     BYTE b;
@@ -52,7 +55,9 @@
             b = cmosimage[cmosaddress & 0x3f];
             break;
 	default:
-	  b = 0xff;
+            fprintf( stderr, "Direct I/O read attempted from port %x\n", port);
+            b = 0xff;
+            break;
 	}
         res = (res << 8) | b;
     }
@@ -60,7 +65,10 @@
 }
 
 
-void outport( int port, int count, DWORD value )
+/**********************************************************************
+ *	    IO_outport
+ */
+void IO_outport( int port, int count, DWORD value )
 {
     BYTE b;
 
@@ -80,7 +88,8 @@
             cmosimage[cmosaddress & 0x3f] = b;
             break;
 	default:
-            /* Rien du tout.  */
+            fprintf( stderr, "Direct I/O write attempted to port %x\n", port );
+            break;
 	}
     }
 }
diff --git a/miscemu/vxd.c b/msdos/vxd.c
similarity index 94%
rename from miscemu/vxd.c
rename to msdos/vxd.c
index 92bf08e..a56c1e5 100644
--- a/miscemu/vxd.c
+++ b/msdos/vxd.c
@@ -19,12 +19,12 @@
                      "SI %04x, DI %04x, DS %04x, ES %04x\n", \
              (name), (name), AX_reg(context), BX_reg(context), \
              CX_reg(context), DX_reg(context), SI_reg(context), \
-             DI_reg(context), DS_reg(context), ES_reg(context) )
+             DI_reg(context), (WORD)DS_reg(context), (WORD)ES_reg(context) )
 
 /***********************************************************************
  *           VXD_PageFile
  */
-void VXD_PageFile( SIGCONTEXT *context )
+void VXD_PageFile( CONTEXT *context )
 {
     /* taken from Ralf Brown's Interrupt List */
 
@@ -69,7 +69,7 @@
 /***********************************************************************
  *           VXD_Shell
  */
-void VXD_Shell( SIGCONTEXT *context )
+void VXD_Shell( CONTEXT *context )
 {
     dprintf_vxd(stddeb,"VxD Shell called ...\n");
 
@@ -127,7 +127,7 @@
 /***********************************************************************
  *           VXD_Comm
  */
-void VXD_Comm( SIGCONTEXT *context )
+void VXD_Comm( CONTEXT *context )
 {
     dprintf_vxd(stddeb,"VxD Comm called ...\n");
 
diff --git a/multimedia/mmsystem.c b/multimedia/mmsystem.c
index 44c4bb4..a669a23 100644
--- a/multimedia/mmsystem.c
+++ b/multimedia/mmsystem.c
@@ -1901,19 +1901,19 @@
 */
 HMMIO16 mmioOpen(LPSTR szFileName, MMIOINFO * lpmmioinfo, DWORD dwOpenFlags)
 {
-	int		hFile;
+        HFILE32 hFile;
 	HMMIO16		hmmio;
 	OFSTRUCT	ofs;
 	LPMMIOINFO	lpmminfo;
 	dprintf_mmsys(stddeb, "mmioOpen('%s', %p, %08lX);\n", szFileName, lpmmioinfo, dwOpenFlags);
-	hFile = OpenFile(szFileName, &ofs, dwOpenFlags);
+	hFile = OpenFile32(szFileName, &ofs, dwOpenFlags);
 	if (hFile == -1) return 0;
 	hmmio = GlobalAlloc16(GMEM_MOVEABLE, sizeof(MMIOINFO));
 	lpmminfo = (LPMMIOINFO)GlobalLock16(hmmio);
 	if (lpmminfo == NULL) return 0;
 	memset(lpmminfo, 0, sizeof(MMIOINFO));
 	lpmminfo->hmmio = hmmio;
-	lpmminfo->dwReserved2 = MAKELONG(hFile, 0);
+	lpmminfo->dwReserved2 = hFile;
 	GlobalUnlock16(hmmio);
 	dprintf_mmsys(stddeb, "mmioOpen // return hmmio=%04X\n", hmmio);
 	return hmmio;
@@ -1929,7 +1929,7 @@
 	dprintf_mmsys(stddeb, "mmioClose(%04X, %04X);\n", hmmio, uFlags);
 	lpmminfo = (LPMMIOINFO)GlobalLock16(hmmio);
 	if (lpmminfo == NULL) return 0;
-	_lclose(LOWORD(lpmminfo->dwReserved2));
+	_lclose32((HFILE32)lpmminfo->dwReserved2);
 	GlobalUnlock16(hmmio);
 	GlobalFree16(hmmio);
 	return 0;
@@ -1983,7 +1983,7 @@
 		dprintf_mmsys(stddeb, "mmioSeek // can't lock hmmio=%04X !\n", hmmio);
 		return 0;
 		}
-	count = _llseek(LOWORD(lpmminfo->dwReserved2), lOffset, iOrigin);
+	count = _llseek32((HFILE32)lpmminfo->dwReserved2, lOffset, iOrigin);
 	GlobalUnlock16(hmmio);
 	return count;
 }
@@ -2058,7 +2058,7 @@
 		}
 	lpmmioinfo->pchNext	+= count;
 	GlobalUnlock16(hmmio);
-	lpmminfo->lDiskOffset = _llseek(LOWORD(lpmminfo->dwReserved2), 0, SEEK_CUR);
+	lpmminfo->lDiskOffset = _llseek32((HFILE32)lpmminfo->dwReserved2, 0, SEEK_CUR);
 	return 0;
 }
 
@@ -2106,20 +2106,20 @@
 	if (lpmminfo == NULL) return 0;
 	dwfcc = lpck->ckid;
 	dprintf_mmio(stddeb, "mmioDescend // dwfcc=%08lX\n", dwfcc);
-	dwOldPos = _llseek(LOWORD(lpmminfo->dwReserved2), 0, SEEK_CUR);
+	dwOldPos = _llseek32((HFILE32)lpmminfo->dwReserved2, 0, SEEK_CUR);
 	dprintf_mmio(stddeb, "mmioDescend // dwOldPos=%ld\n", dwOldPos);
 	if (lpckParent != NULL) {
 		dprintf_mmio(stddeb, "mmioDescend // seek inside parent at %ld !\n", lpckParent->dwDataOffset);
-		dwOldPos = _llseek(LOWORD(lpmminfo->dwReserved2), 
+		dwOldPos = _llseek32((HFILE32)lpmminfo->dwReserved2,
 					lpckParent->dwDataOffset, SEEK_SET);
 		}
 	if ((uFlags & MMIO_FINDCHUNK) || (uFlags & MMIO_FINDRIFF) || 
 		(uFlags & MMIO_FINDLIST)) {
 		dprintf_mmio(stddeb, "mmioDescend // MMIO_FINDxxxx dwfcc=%08lX !\n", dwfcc);
 		while (TRUE) {
-			if (_lread32(LOWORD(lpmminfo->dwReserved2), (LPSTR)lpck, 
+			if (_lread32((HFILE32)lpmminfo->dwReserved2, (LPSTR)lpck, 
 					sizeof(MMCKINFO)) < sizeof(MMCKINFO)) {
-				_llseek(LOWORD(lpmminfo->dwReserved2), dwOldPos, SEEK_SET);
+				_llseek32((HFILE32)lpmminfo->dwReserved2, dwOldPos, SEEK_SET);
 				GlobalUnlock16(hmmio);
 				return MMIOERR_CHUNKNOTFOUND;
 				}
@@ -2129,13 +2129,13 @@
 			dwOldPos += lpck->cksize + 2 * sizeof(DWORD);
 			if (lpck->ckid == FOURCC_RIFF || lpck->ckid == FOURCC_LIST) 
 				dwOldPos += sizeof(DWORD);
-			_llseek(LOWORD(lpmminfo->dwReserved2), dwOldPos, SEEK_SET);
+			_llseek32((HFILE32)lpmminfo->dwReserved2, dwOldPos, SEEK_SET);
 			}
 		}
 	else {
 		if (_lread32(LOWORD(lpmminfo->dwReserved2), (LPSTR)lpck, 
 				sizeof(MMCKINFO)) < sizeof(MMCKINFO)) {
-			_llseek(LOWORD(lpmminfo->dwReserved2), dwOldPos, SEEK_SET);
+                    _llseek32((HFILE32)lpmminfo->dwReserved2, dwOldPos, SEEK_SET);
 			GlobalUnlock16(hmmio);
 			return MMIOERR_CHUNKNOTFOUND;
 			}
@@ -2143,8 +2143,8 @@
 	lpck->dwDataOffset = dwOldPos + 2 * sizeof(DWORD);
 	if (lpck->ckid == FOURCC_RIFF || lpck->ckid == FOURCC_LIST) 
 		lpck->dwDataOffset += sizeof(DWORD);
-	lpmminfo->lDiskOffset = _llseek(LOWORD(lpmminfo->dwReserved2), 
-									lpck->dwDataOffset, SEEK_SET);
+	lpmminfo->lDiskOffset = _llseek32((HFILE32)lpmminfo->dwReserved2, 
+                                          lpck->dwDataOffset, SEEK_SET);
 	GlobalUnlock16(hmmio);
 	dprintf_mmio(stddeb, "mmioDescend // lpck->ckid=%08lX lpck->cksize=%ld !\n", 
 								lpck->ckid, lpck->cksize);
diff --git a/objects/brush.c b/objects/brush.c
index 5480b85..70f7143 100644
--- a/objects/brush.c
+++ b/objects/brush.c
@@ -12,7 +12,6 @@
 #include "color.h"
 #include "stddebug.h"
 #include "debug.h"
-#include "xmalloc.h"
 
 #define NB_HATCH_STYLES  6
 
diff --git a/objects/color.c b/objects/color.c
index 8aaed5c..76a24cb 100644
--- a/objects/color.c
+++ b/objects/color.c
@@ -68,6 +68,7 @@
 static int COLOR_gapStart = 256;
 static int COLOR_gapEnd = -1;
 static int COLOR_gapFilled = 0;
+static int COLOR_max = 256;
 
   /* First free dynamic color cell, 0 = full palette, -1 = fixed palette */
 static int            COLOR_firstFree = 0; 
@@ -231,8 +232,9 @@
   if( COLOR_gapStart < COLOR_gapEnd && COLOR_PixelToPalette )
   {
     XColor	xc;
-    int		r, g, b;
+    int		r, g, b, max;
 
+    max = COLOR_max - (256 - (COLOR_gapEnd - COLOR_gapStart));
     for ( i = 0, idx = COLOR_gapStart; i < 256 && idx <= COLOR_gapEnd; i++ )
       if( COLOR_PixelToPalette[i] == 0 )
 	{
@@ -248,6 +250,7 @@
 	     COLOR_PaletteToPixel[idx] = xc.pixel;
            *(COLORREF*)(COLOR_sysPal + idx) = RGB(r, g, b);
 	     COLOR_sysPal[idx++].peFlags |= PC_SYS_USED;
+	     if( --max <= 0 ) break;
 	  }
 	}
     COLOR_gapFilled = idx - COLOR_gapStart;    
@@ -317,16 +320,15 @@
    unsigned long*	pixDynMapping = NULL;
    unsigned long	plane_masks[1];
    int			i, j, warn = 0;
-   int			color_ini_max = 256;
    int			diff, r, g, b, max = 256, bp = 0, wp = 1;
    int			step = 1;
 
    /* read "AllocSystemColors" from wine.conf */
 
-   color_ini_max = PROFILE_GetWineIniInt( "options", "AllocSystemColors", 256);
-   if (color_ini_max > 256) color_ini_max = 256;
-   if (color_ini_max < 20) color_ini_max = 20;
-   dprintf_palette(stddeb,"COLOR_Init: %d colors configured.\n",color_ini_max);
+   COLOR_max = PROFILE_GetWineIniInt( "options", "AllocSystemColors", 256);
+   if (COLOR_max > 256) COLOR_max = 256;
+   else if (COLOR_max < 20) COLOR_max = 20;
+   dprintf_palette(stddeb,"COLOR_Init: %d colors configured.\n", COLOR_max);
    
    dprintf_palette(stddeb,"\tbuilding shared map - %i palette entries\n", cs->size);
 
@@ -425,8 +427,8 @@
                }
           }
 
-	if( c_min > color_ini_max - NB_RESERVED_COLORS) 
-	    c_min = color_ini_max - NB_RESERVED_COLORS;
+	if( c_min > COLOR_max - NB_RESERVED_COLORS) 
+	    c_min = COLOR_max - NB_RESERVED_COLORS;
 
 	c_min = (c_min/2) + (c_min/2);		/* need even set for split palette */
 
diff --git a/objects/dc.c b/objects/dc.c
index cfe93a1..d3363de 100644
--- a/objects/dc.c
+++ b/objects/dc.c
@@ -16,7 +16,6 @@
 #include "color.h"
 #include "debug.h"
 #include "font.h"
-#include "xmalloc.h"
 
 extern void CLIPPING_UpdateGCRegion( DC * dc );     /* objects/clipping.c */
 
@@ -171,6 +170,7 @@
 DC *DC_GetDCPtr( HDC32 hdc )
 {
     GDIOBJHDR *ptr = (GDIOBJHDR *)GDI_HEAP_LIN_ADDR( hdc );
+    if (!ptr) return NULL;
     if ((ptr->wMagic == DC_MAGIC) || (ptr->wMagic == METAFILE_DC_MAGIC))
         return (DC *)ptr;
     return NULL;
diff --git a/objects/dib.c b/objects/dib.c
index 66f8d8f..d49b091 100644
--- a/objects/dib.c
+++ b/objects/dib.c
@@ -16,7 +16,6 @@
 #include "stddebug.h"
 #include "color.h"
 #include "debug.h"
-#include "xmalloc.h"
 
 extern void CLIPPING_UpdateGCRegion(DC* );
 
diff --git a/objects/font.c b/objects/font.c
index cc54c0b..945b380 100644
--- a/objects/font.c
+++ b/objects/font.c
@@ -482,7 +482,6 @@
     if (!hfont) return 0;
     fontPtr = (FONTOBJ *) GDI_HEAP_LIN_ADDR( hfont );
     memcpy( &fontPtr->logfont, font, sizeof(LOGFONT16) );
-    AnsiLower( fontPtr->logfont.lfFaceName );
     dprintf_font(stddeb,"CreateFontIndirect(%p (%d,%d)); return %04x\n",
 	font, font->lfHeight, font->lfWidth, hfont);
     return hfont;
diff --git a/objects/gdiobj.c b/objects/gdiobj.c
index 0502c69..96f7e47 100644
--- a/objects/gdiobj.c
+++ b/objects/gdiobj.c
@@ -18,7 +18,6 @@
 #include "region.h"
 #include "stddebug.h"
 #include "debug.h"
-#include "xmalloc.h"
 
 WORD GDI_HeapSel = 0;
 
diff --git a/objects/metafile.c b/objects/metafile.c
index a912ce8..9610dc6 100644
--- a/objects/metafile.c
+++ b/objects/metafile.c
@@ -62,7 +62,7 @@
 {
   HMETAFILE16 hmf;
   METAHEADER *mh;
-  HFILE hFile;
+  HFILE32 hFile;
   DWORD size;
   
   dprintf_metafile(stddeb,"GetMetaFile: %s\n", lpFilename);
@@ -78,12 +78,12 @@
     return 0;
   }
   
-  if ((hFile = _lopen(lpFilename, OF_READ)) == HFILE_ERROR) {
+  if ((hFile = _lopen32(lpFilename, OF_READ)) == HFILE_ERROR32) {
     GlobalFree16(hmf);
     return 0;
   }
   
-  if (_lread32(hFile, (char *)mh, MFHEADERSIZE) == HFILE_ERROR) {
+  if (_lread32(hFile, (char *)mh, MFHEADERSIZE) == HFILE_ERROR32) {
     GlobalFree16(hmf);
     return 0;
   }
@@ -99,12 +99,12 @@
   }
   
   if (_lread32(hFile, (char*)mh + mh->mtHeaderSize * 2, 
-	        size - mh->mtHeaderSize * 2) == HFILE_ERROR) {
+	        size - mh->mtHeaderSize * 2) == HFILE_ERROR32) {
     GlobalFree16(hmf);
     return 0;
   }
   
-  _lclose(hFile);
+  _lclose32(hFile);
 
   if (mh->mtType != 1) {
     GlobalFree16(hmf);
@@ -126,7 +126,7 @@
     HMETAFILE16 handle = 0;
     METAHEADER *mh;
     METAHEADER *mh2;
-    HFILE hFile;
+    HFILE32 hFile;
     
     dprintf_metafile(stddeb,"CopyMetaFile: %s\n", lpFilename);
     
@@ -138,12 +138,12 @@
     if (lpFilename)          /* disk based metafile */
         {
         int i,j;
-	hFile = _lcreat(lpFilename, 0);
+	hFile = _lcreat32(lpFilename, 0);
 	j=mh->mtType;
 	mh->mtType=1;        /* disk file version stores 1 here */
 	i=_lwrite32(hFile, (char *)mh, mh->mtSize * 2) ;
 	mh->mtType=j;        /* restore old value  [0 or 1] */	
-        _lclose(hFile);
+        _lclose32(hFile);
 	if (i == -1)
 	    return 0;
         }
diff --git a/programs/progman/License_En.c b/programs/progman/License_En.c
index efe3437..60c1128 100644
--- a/programs/progman/License_En.c
+++ b/programs/progman/License_En.c
@@ -1,4 +1,4 @@
-#include <windows.h>
+#include "windows.h"
 #include "license.h"
 
 static CHAR LicenseCaption_En[] = "LICENSE";
diff --git a/programs/progman/dialog.c b/programs/progman/dialog.c
index f35d425..76efc95 100644
--- a/programs/progman/dialog.c
+++ b/programs/progman/dialog.c
@@ -4,8 +4,8 @@
  * Copyright 1996 Ulrich Schmid
  */
 
-#include <windows.h>
-#include <commdlg.h>
+#include "windows.h"
+#include "commdlg.h"
 #include "progman.h"
 
 static BOOL    DIALOG_BrowsePrograms(HWND, LPSTR, INT);
diff --git a/programs/progman/group.c b/programs/progman/group.c
index a133b55..0fcbada 100644
--- a/programs/progman/group.c
+++ b/programs/progman/group.c
@@ -5,7 +5,7 @@
  */
 
 #include <stdio.h>
-#include <windows.h>
+#include "windows.h"
 #include "progman.h"
 
 /***********************************************************************
diff --git a/programs/progman/grpfile.c b/programs/progman/grpfile.c
index 5e8b5b2..44f9f04 100644
--- a/programs/progman/grpfile.c
+++ b/programs/progman/grpfile.c
@@ -4,7 +4,7 @@
  * Copyright 1996 Ulrich Schmid
  */
 
-#include <windows.h>
+#include "windows.h"
 #include "progman.h"
 
 #define MALLOCHUNK 1000
diff --git a/programs/progman/license.c b/programs/progman/license.c
index 14308cd..c73dc26 100644
--- a/programs/progman/license.c
+++ b/programs/progman/license.c
@@ -1,4 +1,4 @@
-#include <windows.h>
+#include "windows.h"
 #include "license.h"
 
 static LICENSE* SelectLanguage(LPCSTR Language)
diff --git a/programs/progman/main.c b/programs/progman/main.c
index 779eb37..abfc430 100644
--- a/programs/progman/main.c
+++ b/programs/progman/main.c
@@ -5,13 +5,13 @@
  */
 
 #include <stdio.h>
-#include <windows.h>
+#include "windows.h"
 #include "license.h"
 #include "progman.h"
 #ifdef WINELIB
-#include <resource.h>
-#include <options.h>
-#include <shell.h>
+#include "resource.h"
+#include "options.h"
+#include "shell.h"
 void LIBWINE_Register_accel();
 void LIBWINE_Register_De();
 void LIBWINE_Register_En();
diff --git a/programs/progman/program.c b/programs/progman/program.c
index 7855dfe..871e939 100644
--- a/programs/progman/program.c
+++ b/programs/progman/program.c
@@ -4,7 +4,7 @@
  * Copyright 1996 Ulrich Schmid
  */
 
-#include <windows.h>
+#include "windows.h"
 #include "progman.h"
 
 /***********************************************************************
diff --git a/programs/progman/string.c b/programs/progman/string.c
index 07dbf3d..6948aac 100644
--- a/programs/progman/string.c
+++ b/programs/progman/string.c
@@ -4,9 +4,9 @@
  * Copyright 1996 Ulrich Schmid
  */
 
-#include <windows.h>
+#include "windows.h"
 #ifdef WINELIB
-#include <options.h>
+#include "options.h"
 #endif
 #include "progman.h"
 
diff --git a/programs/winhelp/hlp2sgml.c b/programs/winhelp/hlp2sgml.c
index 699be73..2294c85 100644
--- a/programs/winhelp/hlp2sgml.c
+++ b/programs/winhelp/hlp2sgml.c
@@ -252,19 +252,19 @@
 
 static FILE *file = 0;
 
-HFILE OpenFile( LPCSTR path, OFSTRUCT *ofs, UINT mode )
+HFILE OpenFile32( LPCSTR path, OFSTRUCT *ofs, UINT mode )
 {
   file = *path ? fopen(path, "r") : stdin;
   return file ? 1 : HFILE_ERROR;
 }
 
-HFILE _lclose( HFILE hFile )
+HFILE _lclose32( HFILE hFile )
 {
   fclose(file);
   return 0;
 }
 
-LONG _hread( HFILE hFile, SEGPTR buffer, LONG count )
+LONG _hread32( HFILE hFile, SEGPTR buffer, LONG count )
 {
   return fread(buffer, 1, count, file);
 }
diff --git a/programs/winhelp/hlpfile.c b/programs/winhelp/hlpfile.c
index 2a6c36a..bc1cac3 100644
--- a/programs/winhelp/hlpfile.c
+++ b/programs/winhelp/hlpfile.c
@@ -5,7 +5,7 @@
  */
 
 #include <stdio.h>
-#include <windows.h>
+#include "windows.h"
 #include "winhelp.h"
 
 static void Report(LPCSTR str)
diff --git a/programs/winhelp/macro.c b/programs/winhelp/macro.c
index 7355270..d33ddcc 100644
--- a/programs/winhelp/macro.c
+++ b/programs/winhelp/macro.c
@@ -5,10 +5,10 @@
  */
 
 #include <stdio.h>
-#include <windows.h>
-#include <commdlg.h>
+#include "windows.h"
+#include "commdlg.h"
 #ifdef WINELIB
-#include <shell.h>
+#include "shell.h"
 #endif
 #include "winhelp.h"
 #include "macro.h"
diff --git a/programs/winhelp/macro.h b/programs/winhelp/macro.h
index f1b403b..cc34ece 100644
--- a/programs/winhelp/macro.h
+++ b/programs/winhelp/macro.h
@@ -4,7 +4,7 @@
  * Copyright 1996 Ulrich Schmid
  */
 
-#include <windows.h>
+#include "windows.h"
 
 VOID MACRO_ExecuteMacro(LPCSTR);
 
diff --git a/programs/winhelp/string.c b/programs/winhelp/string.c
index 647b968..b404e92 100644
--- a/programs/winhelp/string.c
+++ b/programs/winhelp/string.c
@@ -4,7 +4,7 @@
  * Copyright 1996 Ulrich Schmid
  */
 
-#include <windows.h>
+#include "windows.h"
 #include "winhelp.h"
 
 /* Class names */
diff --git a/programs/winhelp/winhelp.c b/programs/winhelp/winhelp.c
index 54e0a8d..ff003d5 100644
--- a/programs/winhelp/winhelp.c
+++ b/programs/winhelp/winhelp.c
@@ -5,11 +5,11 @@
  */
 
 #include <stdio.h>
-#include <windows.h>
+#include "windows.h"
 #ifdef WINELIB
-#include <resource.h>
-#include <options.h>
-#include <shell.h>
+#include "resource.h"
+#include "options.h"
+#include "shell.h"
 extern const char people[];
 #endif
 #include "winhelp.h"
diff --git a/rc/winerc.c b/rc/winerc.c
index 3f9edbe..9dbcf90 100644
--- a/rc/winerc.c
+++ b/rc/winerc.c
@@ -426,7 +426,7 @@
 		put_WORD(ret->res+12,cx);
 		put_WORD(ret->res+14,cy);
 		put_WORD(ret->res+16,id);
-		ret->size=win32?24:17;
+		ret->size=24;
 		ret=insert_string(ret,label,20,0);
 		/* is it a predefined class? */
 		cl=0;
@@ -493,9 +493,18 @@
 /* an ICON control was specified, whf contains width, height, and flags */
 gen_res* add_icon(char* name,int id,int x,int y,gen_res* whf,gen_res* rest)
 {
+    if (win32)
+    {
+	put_WORD(whf->res+8,x);
+	put_WORD(whf->res+10,y);
+	put_WORD(whf->res+16,id);
+    }
+    else
+    {
 	put_WORD(whf->res+0,x);
 	put_WORD(whf->res+2,y);
 	put_WORD(whf->res+8,id);
+    }
 	whf=label_control_desc(name,whf);
 	return add_control(CT_STATIC,SS_ICON,whf,rest);
 }
@@ -503,6 +512,10 @@
 /* insert the generic control into rest */
 gen_res* add_generic_control(gen_res* ctl, gen_res* rest)
 {
+	char zeros[4]={0,0,0,0};
+	/* WIN32: Control is on dword boundary */
+	if(win32 && ctl->size%4)
+		ctl=insert_bytes(ctl,zeros,ctl->size,4-ctl->size%4);
 	return insert_at_beginning(rest,ctl->res,ctl->size);
 }
 
diff --git a/resources/Makefile.in b/resources/Makefile.in
index f4f1e5c..24251ec 100644
--- a/resources/Makefile.in
+++ b/resources/Makefile.in
@@ -4,7 +4,7 @@
 SRCDIR    = @srcdir@
 VPATH     = @srcdir@
 MODULE    = resources
-RCFLAGS   = -w16
+RCFLAGS   = -w32
 
 SYSRES_SRCS = \
 	sysres_Cz.c \
diff --git a/resources/sysres.c b/resources/sysres.c
index ca79f6a..8714ee1 100644
--- a/resources/sysres.c
+++ b/resources/sysres.c
@@ -38,6 +38,17 @@
 
 
 /***********************************************************************
+ *           SYSRES_GetResourcePtr
+ *
+ * Return a pointer to a system resource.
+ */
+LPCVOID SYSRES_GetResPtr( SYSTEM_RESOURCE id )
+{
+    return SYSRES_Resources[Options.language][id]->bytes;
+}
+
+
+/***********************************************************************
  *           SYSRES_LoadResource
  *
  * Create a global memory block for a system resource.
diff --git a/scheduler/Makefile.in b/scheduler/Makefile.in
new file mode 100644
index 0000000..f6327b1
--- /dev/null
+++ b/scheduler/Makefile.in
@@ -0,0 +1,16 @@
+DEFS      = -D__WINE__
+TOPSRCDIR = @top_srcdir@
+TOPOBJDIR = ..
+SRCDIR    = @srcdir@
+VPATH     = @srcdir@
+MODULE    = scheduler
+
+C_SRCS = \
+	process.c \
+	thread.c
+
+all: $(MODULE).o
+
+@MAKE_RULES@
+
+### Dependencies:
diff --git a/scheduler/process.c b/scheduler/process.c
new file mode 100644
index 0000000..c225531
--- /dev/null
+++ b/scheduler/process.c
@@ -0,0 +1,330 @@
+/*
+ * Win32 processes
+ *
+ * Copyright 1996 Alexandre Julliard
+ */
+
+#include <assert.h>
+#include "process.h"
+#include "heap.h"
+#include "task.h"
+#include "winerror.h"
+
+PDB32 *pCurrentProcess = NULL;
+
+#define HTABLE_SIZE  0x30  /* Handle table initial size */
+#define HTABLE_INC   0x10  /* Handle table increment */
+
+#define BOOT_HTABLE_SIZE  5
+
+static HANDLE_ENTRY boot_handles[BOOT_HTABLE_SIZE];
+
+/***********************************************************************
+ *           PROCESS_AllocHandleTable
+ */
+static HANDLE_TABLE *PROCESS_AllocHandleTable( PDB32 *process )
+{
+    HANDLE_TABLE *table = HeapAlloc( process->system_heap, HEAP_ZERO_MEMORY,
+                                     sizeof(HANDLE_TABLE) +
+                                     (HTABLE_SIZE-1) * sizeof(HANDLE_ENTRY) );
+    if (!table) return NULL;
+    table->count = HTABLE_SIZE;
+    return table;
+}
+
+
+/***********************************************************************
+ *           PROCESS_GrowHandleTable
+ */
+static BOOL32 PROCESS_GrowHandleTable( PDB32 *process )
+{
+    HANDLE_TABLE *table = process->handle_table;
+    table = HeapReAlloc( process->system_heap, HEAP_ZERO_MEMORY, table,
+                         sizeof(HANDLE_TABLE) +
+                         (table->count+HTABLE_INC-1) * sizeof(HANDLE_ENTRY) );
+    if (!table) return FALSE;
+    table->count += HTABLE_INC;
+    process->handle_table = table;
+    return TRUE;
+}
+
+
+/***********************************************************************
+ *           PROCESS_AllocBootHandle
+ *
+ * Allocate a handle from the boot table.
+ */
+static HANDLE32 PROCESS_AllocBootHandle( K32OBJ *ptr, DWORD flags )
+{
+    HANDLE32 h;
+    for (h = 0; h < BOOT_HTABLE_SIZE; h++)
+        if (!boot_handles[h].ptr) break;
+    assert( h < BOOT_HTABLE_SIZE );
+    K32OBJ_IncCount( ptr );
+    boot_handles[h].flags = flags;
+    boot_handles[h].ptr   = ptr;
+    return h + 1;  /* Avoid handle 0 */
+}
+
+
+/***********************************************************************
+ *           PROCESS_CloseBootHandle
+ *
+ * Close a handle from the boot table.
+ */
+static BOOL32 PROCESS_CloseBootHandle( HANDLE32 handle )
+{
+    HANDLE_ENTRY *entry = &boot_handles[handle - 1];
+    assert( (handle > 0) && (handle <= BOOT_HTABLE_SIZE) );
+    assert( entry->ptr );
+    K32OBJ_DecCount( entry->ptr );
+    entry->flags = 0;
+    entry->ptr   = NULL;
+    return TRUE;
+}
+
+
+/***********************************************************************
+ *           PROCESS_GetBootObjPtr
+ *
+ * Get a handle ptr from the boot table.
+ */
+static K32OBJ *PROCESS_GetBootObjPtr( HANDLE32 handle, K32OBJ_TYPE type )
+{
+    K32OBJ *ptr;
+
+    assert( (handle > 0) && (handle <= BOOT_HTABLE_SIZE) );
+    ptr = boot_handles[handle - 1].ptr;
+    assert (ptr && (ptr->type == type));
+    K32OBJ_IncCount( ptr );
+    return ptr;
+}
+
+
+/***********************************************************************
+ *           PROCESS_SetBootObjPtr
+ *
+ * Set a handle ptr from the boot table.
+ */
+static BOOL32 PROCESS_SetBootObjPtr( HANDLE32 handle, K32OBJ *ptr, DWORD flags)
+{
+    K32OBJ *old_ptr;
+
+    assert( (handle > 0) && (handle <= BOOT_HTABLE_SIZE) );
+    K32OBJ_IncCount( ptr );
+    if ((old_ptr = boot_handles[handle - 1].ptr)) K32OBJ_DecCount( old_ptr );
+    boot_handles[handle - 1].flags = flags;
+    boot_handles[handle - 1].ptr   = ptr;
+    return TRUE;
+}
+
+
+/***********************************************************************
+ *           PROCESS_AllocHandle
+ *
+ * Allocate a handle for a kernel object and increment its refcount.
+ */
+HANDLE32 PROCESS_AllocHandle( K32OBJ *ptr, DWORD flags )
+{
+    HANDLE32 h;
+    HANDLE_ENTRY *entry;
+
+    assert( ptr );
+    if (!pCurrentProcess) return PROCESS_AllocBootHandle( ptr, flags );
+    EnterCriticalSection( &pCurrentProcess->crit_section );
+    K32OBJ_IncCount( ptr );
+    entry = pCurrentProcess->handle_table->entries;
+    for (h = 0; h < pCurrentProcess->handle_table->count; h++, entry++)
+        if (!entry->ptr) break;
+    if ((h < pCurrentProcess->handle_table->count) ||
+        PROCESS_GrowHandleTable( pCurrentProcess ))
+    {
+        entry->flags = flags;
+        entry->ptr   = ptr;
+        LeaveCriticalSection( &pCurrentProcess->crit_section );
+        return h + 1;  /* Avoid handle 0 */
+    }
+    LeaveCriticalSection( &pCurrentProcess->crit_section );
+    SetLastError( ERROR_OUTOFMEMORY );
+    K32OBJ_DecCount( ptr );
+    return INVALID_HANDLE_VALUE32;
+}
+
+
+/***********************************************************************
+ *           PROCESS_GetObjPtr
+ *
+ * Retrieve a pointer to a kernel object and increments its reference count.
+ * The refcount must be decremented when the pointer is no longer used.
+ */
+K32OBJ *PROCESS_GetObjPtr( HANDLE32 handle, K32OBJ_TYPE type )
+{
+    K32OBJ *ptr = NULL;
+    if (!pCurrentProcess) return PROCESS_GetBootObjPtr( handle, type );
+    EnterCriticalSection( &pCurrentProcess->crit_section );
+    if ((handle > 0) && (handle <= pCurrentProcess->handle_table->count))
+    {
+        ptr = pCurrentProcess->handle_table->entries[handle - 1].ptr;
+        if (ptr && ((type == K32OBJ_UNKNOWN) || (ptr->type == type)))
+            K32OBJ_IncCount( ptr );
+        else ptr = NULL;
+    }
+    LeaveCriticalSection( &pCurrentProcess->crit_section );
+    if (!ptr) SetLastError( ERROR_INVALID_HANDLE );
+    return ptr;
+}
+
+
+/***********************************************************************
+ *           PROCESS_SetObjPtr
+ *
+ * Change the object pointer of a handle, and increment the refcount.
+ * Use with caution!
+ */
+BOOL32 PROCESS_SetObjPtr( HANDLE32 handle, K32OBJ *ptr, DWORD flags )
+{
+    BOOL32 ret = TRUE;
+    K32OBJ *old_ptr = NULL;
+
+    if (!pCurrentProcess) return PROCESS_SetBootObjPtr( handle, ptr, flags );
+    EnterCriticalSection( &pCurrentProcess->crit_section );
+    if ((handle > 0) && (handle <= pCurrentProcess->handle_table->count))
+    {
+        HANDLE_ENTRY*entry = &pCurrentProcess->handle_table->entries[handle-1];
+        old_ptr = entry->ptr;
+        K32OBJ_IncCount( ptr );
+        entry->flags = flags;
+        entry->ptr   = ptr;
+    }
+    else
+    {
+        SetLastError( ERROR_INVALID_HANDLE );
+        ret = FALSE;
+    }
+    LeaveCriticalSection( &pCurrentProcess->crit_section );
+    if (old_ptr) K32OBJ_DecCount( old_ptr );
+    return ret;
+}
+
+
+/*********************************************************************
+ *           CloseHandle   (KERNEL32.23)
+ */
+BOOL32 CloseHandle( HANDLE32 handle )
+{
+    BOOL32 ret = FALSE;
+    K32OBJ *ptr = NULL;
+
+    if (!pCurrentProcess) return PROCESS_CloseBootHandle( handle );
+    EnterCriticalSection( &pCurrentProcess->crit_section );
+    if ((handle > 0) && (handle <= pCurrentProcess->handle_table->count))
+    {
+        HANDLE_ENTRY*entry = &pCurrentProcess->handle_table->entries[handle-1];
+        if ((ptr = entry->ptr))
+        {
+            entry->flags = 0;
+            entry->ptr   = NULL;
+            ret = TRUE;
+        }
+    }
+    LeaveCriticalSection( &pCurrentProcess->crit_section );
+    if (!ret) SetLastError( ERROR_INVALID_HANDLE );
+    if (ptr) K32OBJ_DecCount( ptr );
+    return ret;
+}
+
+
+/***********************************************************************
+ *           PROCESS_Create
+ */
+PDB32 *PROCESS_Create(void)
+{
+    PDB32 *pdb = HeapAlloc( SystemHeap, HEAP_ZERO_MEMORY, sizeof(PDB32) );
+    if (!pdb) return NULL;
+    pdb->header.type     = K32OBJ_PROCESS;
+    pdb->header.refcount = 1;
+    pdb->exit_code       = 0x103; /* STILL_ACTIVE */
+    pdb->threads         = 1;
+    pdb->running_threads = 1;
+    pdb->ring0_threads   = 1;
+    pdb->system_heap     = SystemHeap;
+    pdb->parent          = pCurrentProcess;
+    pdb->group           = pdb;
+    pdb->priority        = 8;  /* Normal */
+    InitializeCriticalSection( &pdb->crit_section );
+    if (!(pdb->heap = HeapCreate( HEAP_GROWABLE, 0x10000, 0 ))) goto error;
+    if (!(pdb->env_DB = HeapAlloc(pdb->heap, HEAP_ZERO_MEMORY, sizeof(ENVDB))))
+        goto error;
+    if (!(pdb->handle_table = PROCESS_AllocHandleTable( pdb ))) goto error;
+    pdb->heap_list       = pdb->heap;
+    return pdb;
+
+error:
+    if (pdb->env_DB) HeapFree( pdb->heap, 0, pdb->env_DB );
+    if (pdb->handle_table) HeapFree( pdb->system_heap, 0, pdb->handle_table );
+    if (pdb->heap) HeapDestroy( pdb->heap );
+    DeleteCriticalSection( &pdb->crit_section );
+    HeapFree( SystemHeap, 0, pdb );
+    return NULL;
+}
+
+
+/***********************************************************************
+ *           PROCESS_Destroy
+ */
+void PROCESS_Destroy( K32OBJ *ptr )
+{
+    PDB32 *pdb = (PDB32 *)ptr;
+    HANDLE32 handle;
+    assert( ptr->type == K32OBJ_PROCESS );
+
+    /* Close all handles */
+    for (handle = 0; handle < pdb->handle_table->count; handle++)
+        if (pdb->handle_table->entries[handle].ptr) CloseHandle( handle );
+
+    /* Free everything */
+
+    ptr->type = K32OBJ_UNKNOWN;
+    HeapFree( pdb->heap, 0, pdb->env_DB );
+    HeapFree( pdb->system_heap, 0, pdb->handle_table );
+    HeapDestroy( pdb->heap );
+    DeleteCriticalSection( &pdb->crit_section );
+    HeapFree( SystemHeap, 0, pdb );
+}
+
+
+/***********************************************************************
+ *           ExitProcess   (KERNEL32.100)
+ */
+void ExitProcess( DWORD status )
+{
+    TASK_KillCurrentTask( status );
+}
+
+
+/***********************************************************************
+ *           GetCurrentProcess   (KERNEL32.198)
+ */
+HANDLE32 GetCurrentProcess(void)
+{
+    return 0x7fffffff;
+}
+
+
+/***********************************************************************
+ *           GetCurrentProcessId   (KERNEL32.199)
+ */
+DWORD GetCurrentProcessId(void)
+{
+    return (DWORD)pCurrentProcess;
+}
+
+
+/***********************************************************************
+ *           GetProcessHeap    (KERNEL32.259)
+ */
+HANDLE32 GetProcessHeap(void)
+{
+    if (!pCurrentProcess) return SystemHeap;  /* For the boot-up code */
+    return pCurrentProcess->heap;
+}
diff --git a/scheduler/thread.c b/scheduler/thread.c
new file mode 100644
index 0000000..78b71f8
--- /dev/null
+++ b/scheduler/thread.c
@@ -0,0 +1,231 @@
+/*
+ * Win32 threads
+ *
+ * Copyright 1996 Alexandre Julliard
+ */
+
+#include <assert.h>
+#include "thread.h"
+#include "winerror.h"
+#include "heap.h"
+#include "selectors.h"
+#include "winnt.h"
+
+THDB *pCurrentThread = NULL;
+
+
+/***********************************************************************
+ *           THREAD_Create
+ */
+THDB *THREAD_Create( PDB32 *pdb, DWORD stack_size )
+{
+    THDB *thdb = HeapAlloc( SystemHeap, HEAP_ZERO_MEMORY, sizeof(THDB) );
+    if (!thdb) return NULL;
+    thdb->header.type     = K32OBJ_THREAD;
+    thdb->header.refcount = 1;
+    thdb->process         = pdb;
+    thdb->teb.except      = (void *)-1;
+    thdb->teb.htask16     = 0; /* FIXME */
+    thdb->teb.stack_sel   = 0; /* FIXME */
+    thdb->teb.self        = &thdb->teb;
+    thdb->teb.tls_ptr     = thdb->tls_array;
+    thdb->process2        = pdb;
+    thdb->exit_code       = 0x103; /* STILL_ACTIVE */
+
+    /* Allocate the stack */
+
+    if (!stack_size) stack_size = 1024 * 1024;  /* default size = 1Mb */
+    thdb->stack_base = VirtualAlloc( NULL, stack_size, MEM_COMMIT,
+                                     PAGE_EXECUTE_READWRITE );
+    if (!thdb->stack_base) goto error;
+    /* Un-commit the first page (FIXME: should use PAGE_GUARD instead) */
+    VirtualFree( thdb->stack_base, 1, MEM_DECOMMIT );
+    thdb->teb.stack_top   = (char *)thdb->stack_base + stack_size;
+    thdb->teb.stack_low   = thdb->teb.stack_top;
+    thdb->exit_stack      = thdb->teb.stack_top;
+
+    /* Allocate the TEB selector (%fs register) */
+
+    thdb->teb_sel = SELECTOR_AllocBlock( &thdb->teb, 0x1000, SEGMENT_DATA,
+                                         TRUE, FALSE );
+    if (!thdb->teb_sel) goto error;
+    return thdb;
+
+error:
+    if (thdb->teb_sel) SELECTOR_FreeBlock( thdb->teb_sel, 1 );
+    if (thdb->stack_base) VirtualFree( thdb->stack_base, 0, MEM_RELEASE );
+    HeapFree( SystemHeap, 0, thdb );
+    return NULL;
+}
+
+
+/***********************************************************************
+ *           THREAD_Destroy
+ */
+void THREAD_Destroy( K32OBJ *ptr )
+{
+    THDB *thdb = (THDB *)ptr;
+    assert( ptr->type == K32OBJ_THREAD );
+    ptr->type = K32OBJ_UNKNOWN;
+    SELECTOR_FreeBlock( thdb->teb_sel, 1 );
+    HeapFree( SystemHeap, 0, thdb );
+}
+
+
+/***********************************************************************
+ *           GetCurrentThread   (KERNEL32.200)
+ */
+HANDLE32 GetCurrentThread(void)
+{
+    return 0xFFFFFFFE;
+}
+
+
+/***********************************************************************
+ *           GetCurrentThreadId   (KERNEL32.201)
+ */
+DWORD GetCurrentThreadId(void)
+{
+    /* FIXME: should probably use %fs register here */
+    assert( pCurrentThread );
+    return (DWORD)pCurrentThread;
+}
+
+
+/**********************************************************************
+ *           GetLastError   (KERNEL.148) (KERNEL32.227)
+ */
+DWORD GetLastError(void)
+{
+    THDB *thread = (THDB *)GetCurrentThreadId();
+    return thread->last_error;
+}
+
+
+/**********************************************************************
+ *           SetLastError   (KERNEL.147) (KERNEL32.497)
+ */
+void SetLastError( DWORD error )
+{
+    THDB *thread;
+    if (!pCurrentThread) return;  /* FIXME */
+    thread = (THDB *)GetCurrentThreadId();
+    thread->last_error = error;
+}
+
+
+/**********************************************************************
+ *           SetLastErrorEx   (USER32.484)
+ */
+void SetLastErrorEx( DWORD error, DWORD type )
+{
+    /* FIXME: what about 'type'? */
+    SetLastError( error );
+}
+
+
+/**********************************************************************
+ *           TlsAlloc   (KERNEL32.530)
+ */
+DWORD TlsAlloc(void)
+{
+    DWORD i, mask, ret = 0;
+    THDB *thread = (THDB *)GetCurrentThreadId();
+    DWORD *bits = thread->process->tls_bits;
+    EnterCriticalSection( &thread->process->crit_section );
+    if (*bits == 0xffffffff)
+    {
+        bits++;
+        ret = 32;
+        if (*bits == 0xffffffff)
+        {
+            LeaveCriticalSection( &thread->process->crit_section );
+            SetLastError( ERROR_NO_MORE_ITEMS );
+            return 0xffffffff;
+        }
+    }
+    for (i = 0, mask = 1; i < 32; i++, mask <<= 1) if (!(*bits & mask)) break;
+    *bits |= mask;
+    LeaveCriticalSection( &thread->process->crit_section );
+    return ret + i;
+}
+
+
+/**********************************************************************
+ *           TlsFree   (KERNEL32.531)
+ */
+BOOL32 TlsFree( DWORD index )
+{
+    DWORD mask;
+    THDB *thread = (THDB *)GetCurrentThreadId();
+    DWORD *bits = thread->process->tls_bits;
+    if (index >= 64)
+    {
+        SetLastError( ERROR_INVALID_PARAMETER );
+        return FALSE;
+    }
+    EnterCriticalSection( &thread->process->crit_section );
+    if (index >= 32) bits++;
+    mask = (1 << (index & 31));
+    if (!(*bits & mask))  /* already free? */
+    {
+        LeaveCriticalSection( &thread->process->crit_section );
+        SetLastError( ERROR_INVALID_PARAMETER );
+        return FALSE;
+    }
+    *bits &= ~mask;
+    thread->tls_array[index] = 0;
+    /* FIXME: should zero all other thread values */
+    LeaveCriticalSection( &thread->process->crit_section );
+    return TRUE;
+}
+
+
+/**********************************************************************
+ *           TlsGetValue   (KERNEL32.532)
+ */
+LPVOID TlsGetValue( DWORD index )
+{
+    THDB *thread = (THDB *)GetCurrentThreadId();
+    if (index >= 64)
+    {
+        SetLastError( ERROR_INVALID_PARAMETER );
+        return NULL;
+    }
+    SetLastError( ERROR_SUCCESS );
+    return thread->tls_array[index];
+}
+
+
+/**********************************************************************
+ *           TlsSetValue   (KERNEL32.533)
+ */
+BOOL32 TlsSetValue( DWORD index, LPVOID value )
+{
+    THDB *thread = (THDB *)GetCurrentThreadId();
+    if (index >= 64)
+    {
+        SetLastError( ERROR_INVALID_PARAMETER );
+        return FALSE;
+    }
+    thread->tls_array[index] = value;
+    return TRUE;
+}
+
+
+/***********************************************************************
+ *           GetThreadContext   (KERNEL32.294)
+ */
+BOOL32 GetThreadContext( HANDLE32 handle, CONTEXT *context )
+{
+    return FALSE;
+}
+
+
+/**********************************************************************
+ *           NtCurrentTeb   (NTDLL.89)
+ */
+void NtCurrentTeb( CONTEXT *context )
+{
+    EAX_reg(context) = GetSelectorBase( FS_reg(context) );
+}
diff --git a/tools/build.c b/tools/build.c
index bcb2697..95812d9 100644
--- a/tools/build.c
+++ b/tools/build.c
@@ -11,12 +11,12 @@
 #include <string.h>
 #include <ctype.h>
 #include <unistd.h>
-#include "wintypes.h"
-#include "registers.h"
+#include "windows.h"
+#include "winnt.h"
 #include "winerror.h"  /* for ERROR_CALL_NOT_IMPLEMENTED */
 #include "module.h"
 #include "neexe.h"
-#include "windows.h"
+#include "selectors.h"
 
 #ifdef NEED_UNDERSCORE_PREFIX
 # define PREFIX "_"
@@ -132,10 +132,6 @@
 
 static int debugging = 1;
 
-  /* Offset of register relative to the end of the SIGCONTEXT struct */
-#define SIGCONTEXTOFFSET(reg) \
-    ((int)&reg##_reg((SIGCONTEXT *)0) - sizeof(SIGCONTEXT))
-
   /* Offset of register relative to the start of the CONTEXT struct */
 #define CONTEXTOFFSET(reg) ((int)&((CONTEXT *)0)->reg)
 
@@ -1433,8 +1429,6 @@
  *         BuildContext16
  *
  * Build the context structure on the 32-bit stack.
- * The only valid registers in the context structure are:
- *   eax, ebx, ecx, edx, esi, edi, ds, es, (some of the) flags
  */
 static void BuildContext16( FILE *outfile )
 {
@@ -1448,18 +1442,46 @@
 
     /* Store the registers */
 
-    fprintf( outfile, "\tpopl %d(%%ebx)\n", SIGCONTEXTOFFSET(EBX) ); /* Get ebx from stack*/
-    fprintf( outfile, "\tmovl %%eax,%d(%%ebx)\n", SIGCONTEXTOFFSET(EAX) );
-    fprintf( outfile, "\tmovl %%ecx,%d(%%ebx)\n", SIGCONTEXTOFFSET(ECX) );
-    fprintf( outfile, "\tmovl %%edx,%d(%%ebx)\n", SIGCONTEXTOFFSET(EDX) );
-    fprintf( outfile, "\tmovl %%esi,%d(%%ebx)\n", SIGCONTEXTOFFSET(ESI) );
-    fprintf( outfile, "\tmovl %%edi,%d(%%ebx)\n", SIGCONTEXTOFFSET(EDI) );
-    fprintf( outfile, "\tmovw -10(%%ebp),%%ax\n" ); /*Get saved ds from stack*/
-    fprintf( outfile, "\tmovw %%ax,%d(%%ebx)\n", SIGCONTEXTOFFSET(DS) );
-    fprintf( outfile, "\tmovw -6(%%ebp),%%ax\n" ); /*Get saved es from stack*/
-    fprintf( outfile, "\tmovw %%ax,%d(%%ebx)\n", SIGCONTEXTOFFSET(ES) );
+    fprintf( outfile, "\tpopl %d(%%ebx)\n", /* Get ebx from stack*/
+             CONTEXTOFFSET(Ebx) - sizeof(CONTEXT) );
+    fprintf( outfile, "\tmovl %%eax,%d(%%ebx)\n",
+             CONTEXTOFFSET(Eax) - sizeof(CONTEXT) );
+    fprintf( outfile, "\tmovl %%ecx,%d(%%ebx)\n",
+             CONTEXTOFFSET(Ecx) - sizeof(CONTEXT) );
+    fprintf( outfile, "\tmovl %%edx,%d(%%ebx)\n",
+             CONTEXTOFFSET(Edx) - sizeof(CONTEXT) );
+    fprintf( outfile, "\tmovl %%esi,%d(%%ebx)\n",
+             CONTEXTOFFSET(Esi) - sizeof(CONTEXT) );
+    fprintf( outfile, "\tmovl %%edi,%d(%%ebx)\n",
+             CONTEXTOFFSET(Edi) - sizeof(CONTEXT) );
+    fprintf( outfile, "\tmovzwl -10(%%ebp),%%eax\n" ); /* Get %ds from stack*/
+    fprintf( outfile, "\tmovl %%eax,%d(%%ebx)\n",
+             CONTEXTOFFSET(SegDs) - sizeof(CONTEXT) );
+    fprintf( outfile, "\tmovzwl -6(%%ebp),%%eax\n" ); /* Get %es from stack*/
+    fprintf( outfile, "\tmovl %%eax,%d(%%ebx)\n",
+             CONTEXTOFFSET(SegEs) - sizeof(CONTEXT) );
     fprintf( outfile, "\tpushfl\n" );
-    fprintf( outfile, "\tpopl %d(%%ebx)\n", SIGCONTEXTOFFSET(EFL) );
+    fprintf( outfile, "\tpopl %d(%%ebx)\n",
+             CONTEXTOFFSET(EFlags) - sizeof(CONTEXT) );
+#if 0
+    fprintf( outfile, "\tmovzwl 0(%%ebp),%%eax\n" ); /* Get %bp from stack */
+    fprintf( outfile, "\tmovl %%eax,%d(%%ebx)\n",
+             CONTEXTOFFSET(Ebp) - sizeof(CONTEXT) );
+    fprintf( outfile, "\tmovzwl 2(%%ebp),%%eax\n" ); /* Get %ip from stack */
+    fprintf( outfile, "\tmovl %%eax,%d(%%ebx)\n",
+             CONTEXTOFFSET(Eip) - sizeof(CONTEXT) );
+    fprintf( outfile, "\tmovzwl 4(%%ebp),%%eax\n" ); /* Get %cs from stack */
+    fprintf( outfile, "\tmovl %%eax,%d(%%ebx)\n",
+             CONTEXTOFFSET(SegCs) - sizeof(CONTEXT) );
+    fprintf( outfile, "\tmovl %%fs,%d(%%ebx)\n",
+             CONTEXTOFFSET(SegFs) - sizeof(CONTEXT) );
+    fprintf( outfile, "\tmovl %%gs,%d(%%ebx)\n",
+             CONTEXTOFFSET(SegGs) - sizeof(CONTEXT) );
+    fprintf( outfile, "\tmovl %%ss,%d(%%ebx)\n",
+             CONTEXTOFFSET(SegSs) - sizeof(CONTEXT) );
+    fprintf( outfile, "\tfsave %d(%%ebx)\n",
+             CONTEXTOFFSET(FloatSave) - sizeof(CONTEXT) );
+#endif
 }
 
 
@@ -1476,18 +1498,27 @@
 
     /* Restore the registers */
 
-    fprintf( outfile, "\tmovl %d(%%ebx),%%ecx\n", SIGCONTEXTOFFSET(ECX) );
-    fprintf( outfile, "\tmovl %d(%%ebx),%%edx\n", SIGCONTEXTOFFSET(EDX) );
-    fprintf( outfile, "\tmovl %d(%%ebx),%%esi\n", SIGCONTEXTOFFSET(ESI) );
-    fprintf( outfile, "\tmovl %d(%%ebx),%%edi\n", SIGCONTEXTOFFSET(EDI) );
+    fprintf( outfile, "\tmovl %d(%%ebx),%%ecx\n",
+             CONTEXTOFFSET(Ecx) - sizeof(CONTEXT) );
+    fprintf( outfile, "\tmovl %d(%%ebx),%%edx\n",
+             CONTEXTOFFSET(Edx) - sizeof(CONTEXT) );
+    fprintf( outfile, "\tmovl %d(%%ebx),%%esi\n",
+             CONTEXTOFFSET(Esi) - sizeof(CONTEXT) );
+    fprintf( outfile, "\tmovl %d(%%ebx),%%edi\n",
+             CONTEXTOFFSET(Edi) - sizeof(CONTEXT) );
     fprintf( outfile, "\tpopl %%eax\n" ); /* Remove old ds and ip from stack */
     fprintf( outfile, "\tpopl %%eax\n" ); /* Remove old cs and es from stack */
-    fprintf( outfile, "\tpushw %d(%%ebx)\n", SIGCONTEXTOFFSET(DS) ); /* Push new ds */
-    fprintf( outfile, "\tpushw %d(%%ebx)\n", SIGCONTEXTOFFSET(ES) ); /*Push new es */
-    fprintf( outfile, "\tpushl %d(%%ebx)\n", SIGCONTEXTOFFSET(EFL) );
+    fprintf( outfile, "\tpushw %d(%%ebx)\n",  /* Push new ds */
+             CONTEXTOFFSET(SegDs) - sizeof(CONTEXT) );
+    fprintf( outfile, "\tpushw %d(%%ebx)\n",  /* Push new es */
+             CONTEXTOFFSET(SegEs) - sizeof(CONTEXT) );
+    fprintf( outfile, "\tpushl %d(%%ebx)\n",
+             CONTEXTOFFSET(EFlags) - sizeof(CONTEXT) );
     fprintf( outfile, "\tpopfl\n" );
-    fprintf( outfile, "\tmovl %d(%%ebx),%%eax\n", SIGCONTEXTOFFSET(EAX) );
-    fprintf( outfile, "\tmovl %d(%%ebx),%%ebx\n", SIGCONTEXTOFFSET(EBX) );
+    fprintf( outfile, "\tmovl %d(%%ebx),%%eax\n",
+             CONTEXTOFFSET(Eax) - sizeof(CONTEXT) );
+    fprintf( outfile, "\tmovl %d(%%ebx),%%ebx\n",
+             CONTEXTOFFSET(Ebx) - sizeof(CONTEXT) );
 }
 
 
@@ -1588,7 +1619,7 @@
     fprintf( outfile, "\tpushw %%ds\n" );
     fprintf( outfile, "\tpopw %%ss\n" );
     fprintf( outfile, "\tleal -%d(%%ebp),%%esp\n",
-             reg_func ? sizeof(SIGCONTEXT) : 4 * strlen(args) );
+             reg_func ? sizeof(CONTEXT) : 4 * strlen(args) );
     if (reg_func)  /* Push the address of the context struct */
         fprintf( outfile, "\tpushl %%esp\n" );
 
@@ -2101,6 +2132,8 @@
 
     /* Call the function */
 
+    fprintf( outfile, "\tpushw %%ds\n" );
+    fprintf( outfile, "\tpopw %%es\n" );  /* Set %es = %ds */
     fprintf( outfile, "\tcall -4(%%ebp)\n" );
 
     /* Print the debugging info */
diff --git a/win32/Makefile.in b/win32/Makefile.in
index e0c8162..e09e8ea 100644
--- a/win32/Makefile.in
+++ b/win32/Makefile.in
@@ -14,11 +14,10 @@
 	error.c \
 	except.c \
 	file.c \
-	findfile.c \
 	init.c \
+	k32obj.c \
 	memory.c \
 	newfns.c \
-	object_mgt.c \
 	process.c \
 	string32.c \
 	struct32.c \
diff --git a/win32/advapi.c b/win32/advapi.c
index 6ac2101..31a92d2 100644
--- a/win32/advapi.c
+++ b/win32/advapi.c
@@ -11,7 +11,6 @@
 #include "advapi32.h"
 #include "stddebug.h"
 #include "debug.h"
-#include "xmalloc.h"
 
 /***********************************************************************
  *           StartServiceCtrlDispatcherA   [ADVAPI32.196]
diff --git a/win32/code_page.c b/win32/code_page.c
index da1d7e0..463505f 100644
--- a/win32/code_page.c
+++ b/win32/code_page.c
@@ -25,11 +25,36 @@
 /***********************************************************************
  *           GetCPInfo            (KERNEL32.154)
  */
-BOOL GetCPInfo(UINT codepage, LPCPINFO cpinfo)
+BOOL32 GetCPInfo( UINT32 codepage, LPCPINFO cpinfo )
 {
-    cpinfo->MaxCharSize = 1;
     cpinfo->DefaultChar[0] = '?';
-
+    switch (codepage)
+    {
+    case 932 : /* Shift JIS (japan) */
+        cpinfo->MaxCharSize = 2;
+        cpinfo->LeadByte[0]= 0x81; cpinfo->LeadByte[1] = 0x9F;
+        cpinfo->LeadByte[2]= 0xE0; cpinfo->LeadByte[3] = 0xFC;
+        cpinfo->LeadByte[4]= 0x00; cpinfo->LeadByte[5] = 0x00;
+        break;
+    case 936 : /* GB2312 (Chinese) */
+    case 949 : /* KSC5601-1987 (Korean) */
+    case 950 : /* BIG5 (Chinese) */
+        cpinfo->MaxCharSize = 2;
+        cpinfo->LeadByte[0]= 0x81; cpinfo->LeadByte[1] = 0xFE;
+        cpinfo->LeadByte[2]= 0x00; cpinfo->LeadByte[3] = 0x00;
+        break;
+    case 1361 : /* Johab (Korean) */
+        cpinfo->MaxCharSize = 2;
+        cpinfo->LeadByte[0]= 0x84; cpinfo->LeadByte[1] = 0xD3;
+        cpinfo->LeadByte[2]= 0xD8; cpinfo->LeadByte[3] = 0xDE;
+        cpinfo->LeadByte[4]= 0xE0; cpinfo->LeadByte[5] = 0xF9;
+        cpinfo->LeadByte[6]= 0x00; cpinfo->LeadByte[7] = 0x00;
+        break;
+    default :
+    	cpinfo->MaxCharSize = 1;
+        cpinfo->LeadByte[0]= 0x00; cpinfo->LeadByte[1] = 0x00;
+    	break;
+    }
     return 1;
 }
 
@@ -86,6 +111,29 @@
 	return count;
 }
 
+
+BOOL32 IsDBCSLeadByteEx(UINT32 codepage, BYTE testchar)
+{
+    CPINFO cpinfo;
+    int i;
+
+    GetCPInfo(codepage, &cpinfo);
+    for (i = 0 ; i < sizeof(cpinfo.LeadByte)/sizeof(cpinfo.LeadByte[0]); i+=2)
+    {
+	if (cpinfo.LeadByte[i] == 0)
+            return FALSE;
+	if (cpinfo.LeadByte[i] <= testchar && testchar <= cpinfo.LeadByte[i+1])
+            return TRUE;
+    }
+    return FALSE;
+}
+
+BOOL32 IsDBCSLeadByte(BYTE testchar)
+{
+    return IsDBCSLeadByteEx(GetACP(), testchar);
+}
+
+
 /***********************************************************************
  *              EnumSystemCodePages32A                (KERNEL32.92)
  */
diff --git a/win32/error.c b/win32/error.c
index 5e8bdb8..44e86f7 100644
--- a/win32/error.c
+++ b/win32/error.c
@@ -11,12 +11,6 @@
 #include "stddebug.h"
 #include "debug.h"
 
-/* WIN32_LastError contains the last error that occurred in the
- * Win32 API.  This value should be stored separately for each
- * thread, when we eventually get thread support.
- */
-static int WIN32_LastError;
-
 /* The errno_xlat_table contains the errno-to-Win32 error
  * mapping.  Since this is a single table, it can't easily
  * take into account function-specific differences, so there
@@ -98,32 +92,6 @@
     {   -1,             0                               }
 };
 
-/**********************************************************************
- *              GetLastError   (KERNEL.148) (KERNEL32.227)
- */
-DWORD GetLastError(void)
-{
-    return WIN32_LastError;
-}
-
-/**********************************************************************
- *              SetLastError   (KERNEL.147) (KERNEL32.497)
- *
- * This is probably not used by apps too much, but it's useful for
- * our own internal use.
- */
-void SetLastError(DWORD error)
-{
-    WIN32_LastError = error;
-}
-
-/**********************************************************************
- *              SetLastErrorEx            (USER32.484)
- */
-void SetLastErrorEx(DWORD error,DWORD type) {
-    WIN32_LastError = error;
-}
-
 DWORD ErrnoToLastError(int errno_num)
 {
     DWORD rc = ERROR_UNKNOWN;
diff --git a/win32/file.c b/win32/file.c
index 7b9ec58..165be9a 100644
--- a/win32/file.c
+++ b/win32/file.c
@@ -6,6 +6,7 @@
 
 #include <errno.h>
 #include <stdio.h>
+#include <stdlib.h>
 #include <unistd.h>
 #include <sys/types.h>
 #include <sys/stat.h>
@@ -33,6 +34,12 @@
 #define MAP_ANON 0
 #endif
 
+typedef struct {
+    HFILE32		hfile;
+    int			prot;
+    unsigned long	size;
+} FILEMAP_OBJECT;
+
 /***********************************************************************
  *           OpenFileMappingA             (KERNEL32.397)
  * FIXME: stub
@@ -57,17 +64,16 @@
     );
     if (sh) {
         SetLastError(ErrnoToLastError(errno));
-        return INVALID_HANDLE_VALUE;
+        return INVALID_HANDLE_VALUE32;
     }
     filemap_obj=(FILEMAP_OBJECT *)CreateKernelObject(sizeof(FILEMAP_OBJECT));
     if(filemap_obj == NULL) {
         SetLastError(ERROR_UNKNOWN);
         return 0;
     }
-    if (h==INVALID_HANDLE_VALUE)
-    	h=_lcreat(lpName,1);/*FIXME*/
+    if (h==INVALID_HANDLE_VALUE32)
+    	h=_lcreat32(lpName,1);/*FIXME*/
 
-    filemap_obj->common.magic = KERNEL_OBJECT_FILEMAP;
     filemap_obj->hfile = h;
     filemap_obj->prot = TranslateProtectionFlags(pot);
     filemap_obj->size = hlow;
@@ -125,75 +131,14 @@
 
 
 /***********************************************************************
- *           GetFileInformationByHandle       (KERNEL32.219)
- */
-DWORD GetFileInformationByHandle(HFILE hFile,BY_HANDLE_FILE_INFORMATION *lpfi)
-{
-    struct stat file_stat;
-    int	rc;
-    int	unixfd = FILE_GetUnixHandle(hFile);
-
-    if (unixfd==-1)
-    	return 0;
-    rc = fstat(unixfd,&file_stat);
-    if(rc == -1) {
-        SetLastError(ErrnoToLastError(errno));
-        return 0;
-    }
-
-    /* Translate the file attributes.
-     */
-    lpfi->dwFileAttributes = 0;
-    if(file_stat.st_mode & S_IFREG)
-        lpfi->dwFileAttributes |= FILE_ATTRIBUTE_NORMAL;
-    if(file_stat.st_mode & S_IFDIR)
-        lpfi->dwFileAttributes |= FILE_ATTRIBUTE_DIRECTORY;
-    if((file_stat.st_mode & S_IWRITE) == 0)
-        lpfi->dwFileAttributes |= FILE_ATTRIBUTE_READONLY;
-
-    /* Translate the file times.  Use the last modification time
-     * for both the creation time and write time.
-     */
-    DOSFS_UnixTimeToFileTime(file_stat.st_mtime, &(lpfi->ftCreationTime));
-    DOSFS_UnixTimeToFileTime(file_stat.st_mtime, &(lpfi->ftLastWriteTime));
-    DOSFS_UnixTimeToFileTime(file_stat.st_atime, &(lpfi->ftLastAccessTime));
-
-    lpfi->nFileSizeLow = file_stat.st_size;
-    lpfi->nNumberOfLinks = file_stat.st_nlink;
-    lpfi->nFileIndexLow = file_stat.st_ino;
-
-    /* Zero out currently unused fields.
-     */
-    lpfi->dwVolumeSerialNumber = 0;
-    lpfi->nFileSizeHigh = 0;
-    lpfi->nFileIndexHigh = 0;
-
-    return 1;
-}
-
-/***********************************************************************
- *           GetFileSize             (KERNEL32.220)
- */
-DWORD GetFileSize(HFILE hf,LPDWORD filesizehigh) {
-    BY_HANDLE_FILE_INFORMATION	fi;
-	DWORD	res = GetFileInformationByHandle(hf,&fi);
-
-	if (!res) 
-		return 0;	/* FIXME: correct ? */
-	if (filesizehigh) 
-		*filesizehigh = fi.nFileSizeHigh;
-	return fi.nFileSizeLow;
-}
-
-/***********************************************************************
  *           GetStdHandle             (KERNEL32.276)
  * FIXME: We should probably allocate filehandles for stdin/stdout/stderr
  *	  at task creation (with HFILE-handle 0,1,2 respectively) and
  *	  return them here. Or at least look, if we created them already.
  */
-HFILE GetStdHandle(DWORD nStdHandle)
+HFILE32 GetStdHandle(DWORD nStdHandle)
 {
-    HFILE hfile;
+    HFILE32 hfile;
     int	unixfd;
 
     switch(nStdHandle)
@@ -211,11 +156,11 @@
             break;
         default:
             SetLastError(ERROR_INVALID_HANDLE);
-            return HFILE_ERROR;
+            return HFILE_ERROR32;
     }
     hfile = FILE_DupUnixHandle(unixfd);
-    if (hfile == HFILE_ERROR)
-    	return HFILE_ERROR;
+    if (hfile == HFILE_ERROR32)
+    	return HFILE_ERROR32;
     FILE_SetFileType( hfile, FILE_TYPE_CHAR );
     return hfile;
 }
@@ -227,7 +172,7 @@
  * Luckily enough, this function maps almost directly into an lseek
  * call, the exception being the use of 64-bit offsets.
  */
-DWORD SetFilePointer(HFILE hFile, LONG distance, LONG *highword,
+DWORD SetFilePointer(HFILE32 hFile, LONG distance, LONG *highword,
                      DWORD method)
 {
     LONG rc;
@@ -240,7 +185,7 @@
         }
     }
 
-    rc = _llseek(hFile, distance, method);
+    rc = _llseek32(hFile, distance, method);
     if(rc == -1)
         SetLastError(ErrnoToLastError(errno));
     return rc;
@@ -249,7 +194,7 @@
 /***********************************************************************
  *             WriteFile               (KERNEL32.578)
  */
-BOOL32 WriteFile(HFILE hFile, LPVOID lpBuffer, DWORD numberOfBytesToWrite,
+BOOL32 WriteFile(HFILE32 hFile, LPVOID lpBuffer, DWORD numberOfBytesToWrite,
                  LPDWORD numberOfBytesWritten, LPOVERLAPPED lpOverlapped)
 {
     LONG	res;
@@ -267,7 +212,7 @@
 /***********************************************************************
  *              ReadFile                (KERNEL32.428)
  */
-BOOL32 ReadFile(HFILE hFile, LPVOID lpBuffer, DWORD numtoread,
+BOOL32 ReadFile(HFILE32 hFile, LPVOID lpBuffer, DWORD numtoread,
                 LPDWORD numread, LPOVERLAPPED lpOverlapped)
 {
     int actual_read;
@@ -290,9 +235,9 @@
  * Doesn't support character devices, pipes, template files, or a
  * lot of the 'attributes' flags yet.
  */
-HFILE CreateFile32A(LPCSTR filename, DWORD access, DWORD sharing,
-                    LPSECURITY_ATTRIBUTES security, DWORD creation,
-                    DWORD attributes, HANDLE32 template)
+HFILE32 CreateFile32A(LPCSTR filename, DWORD access, DWORD sharing,
+                      LPSECURITY_ATTRIBUTES security, DWORD creation,
+                      DWORD attributes, HANDLE32 template)
 {
     int access_flags, create_flags;
 
@@ -315,7 +260,7 @@
     {
         dprintf_file(stddeb, "CreateFile: UNC names not supported.\n");
         SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
-        return HFILE_ERROR;
+        return HFILE_ERROR32;
     }
 
     /* If the name is either CONIN$ or CONOUT$, give them stdin
@@ -331,33 +276,17 @@
 /*************************************************************************
  *              CreateFile32W              (KERNEL32.48)
  */
-HFILE CreateFile32W(LPCWSTR filename, DWORD access, DWORD sharing,
-                    LPSECURITY_ATTRIBUTES security, DWORD creation,
-                    DWORD attributes, HANDLE32 template)
+HFILE32 CreateFile32W(LPCWSTR filename, DWORD access, DWORD sharing,
+                      LPSECURITY_ATTRIBUTES security, DWORD creation,
+                      DWORD attributes, HANDLE32 template)
 {
     LPSTR afn = HEAP_strdupWtoA( GetProcessHeap(), 0, filename );
-    HFILE res = CreateFile32A( afn, access, sharing, security, creation,
-                               attributes, template );
+    HFILE32 res = CreateFile32A( afn, access, sharing, security, creation,
+                                 attributes, template );
     HeapFree( GetProcessHeap(), 0, afn );
     return res;
 }
 
-/*************************************************************************
- *              SetHandleCount32   (KERNEL32.494)
- */
-UINT32 SetHandleCount32( UINT32 cHandles )
-{
-    return SetHandleCount16(cHandles);
-}
-
-
-int CloseFileHandle(HFILE hFile)
-{
-    if (!_lclose(hFile))
-	return TRUE;
-    return FALSE;
-}
-
 static int TranslateAccessFlags(DWORD access_flags)
 {
     int rc = 0;
@@ -412,39 +341,11 @@
 
 
 /**************************************************************************
- *              GetFileAttributes32A	(KERNEL32.217)
+ *              SetFileAttributes16	(KERNEL.421)
  */
-DWORD GetFileAttributes32A(LPCSTR lpFileName)
+BOOL16 SetFileAttributes16( LPCSTR lpFileName, DWORD attributes )
 {
-	struct stat buf;
-	DWORD	res=0;
-	char	*fn;
-
-	dprintf_file(stddeb,"GetFileAttributesA(%s)\n",lpFileName);
-	fn=(LPSTR)DOSFS_GetUnixFileName(lpFileName,FALSE);
-	/* fn points to a static buffer, don't free it */
-	if(stat(fn,&buf)==-1) {
-		SetLastError(ErrnoToLastError(errno));
-		return 0xFFFFFFFF;
-	}
-	if(buf.st_mode & S_IFREG)
-		res |= FILE_ATTRIBUTE_NORMAL;
-	if(buf.st_mode & S_IFDIR)
-		res |= FILE_ATTRIBUTE_DIRECTORY;
-	if((buf.st_mode & S_IWRITE) == 0)
-		res |= FILE_ATTRIBUTE_READONLY;
-	return res;
-}
-
-/**************************************************************************
- *              GetFileAttributes32W	(KERNEL32.218)
- */
-DWORD GetFileAttributes32W(LPCWSTR lpFileName)
-{
-    LPSTR afn = HEAP_strdupWtoA( GetProcessHeap(), 0, lpFileName );
-    DWORD res = GetFileAttributes32A( afn );
-    HeapFree( GetProcessHeap(), 0, afn );
-    return res;
+    return SetFileAttributes32A( lpFileName, attributes );
 }
 
 
@@ -487,24 +388,6 @@
 }
 
 /**************************************************************************
- *              SetEndOfFile		(KERNEL32.483)
- */
-BOOL32 SetEndOfFile(HFILE hFile)
-{
-	int	unixfd = FILE_GetUnixHandle(hFile);
-
-	dprintf_file(stddeb,"SetEndOfFile(%lx)\n",(LONG)hFile);
-	if (!unixfd)
-		return 0;
-	if (-1==ftruncate(unixfd,lseek(unixfd,0,SEEK_CUR))) {
-            SetLastError(ErrnoToLastError(errno));
-	    return FALSE;
-	}
-	return TRUE;
-}
-
-
-/**************************************************************************
  *              MoveFileA		(KERNEL32.387)
  */
 BOOL32 MoveFile32A(LPCSTR fn1,LPCSTR fn2)
@@ -569,40 +452,38 @@
 BOOL32 CopyFile32A(LPCSTR sourcefn,LPCSTR destfn,BOOL32 failifexists)
 {
 	OFSTRUCT	of;
-	HFILE		hf1,hf2;
+	HFILE32		hf1,hf2;
 	char		buffer[2048];
 	int		lastread,curlen;
 
 	fprintf(stddeb,"CopyFile: %s -> %s\n",sourcefn,destfn);
-	hf1 = OpenFile(sourcefn,&of,OF_READ);
-	if (hf1==HFILE_ERROR)
-		return TRUE;
-	if (failifexists) {
-		hf2 = OpenFile(sourcefn,&of,OF_WRITE);
-		if (hf2 != HFILE_ERROR)
-			return FALSE;
-		_lclose(hf2);
+	hf1 = OpenFile32(sourcefn,&of,OF_READ);
+	if (hf1==HFILE_ERROR32) return TRUE;
+	if (failifexists)
+        {
+		hf2 = OpenFile32(sourcefn,&of,OF_WRITE);
+		if (hf2 != HFILE_ERROR32) return FALSE;
+		_lclose32(hf2);
 	}
-	hf2 = OpenFile(sourcefn,&of,OF_WRITE);
-	if (hf2 == HFILE_ERROR)
-		return FALSE;
+	hf2 = OpenFile32(sourcefn,&of,OF_WRITE);
+	if (hf2 == HFILE_ERROR32) return FALSE;
 	curlen = 0;
-	while ((lastread=_lread16(hf1,buffer,sizeof(buffer)))>0) {
+	while ((lastread=_lread32(hf1,buffer,sizeof(buffer)))>0) {
 		curlen=0;
 		while (curlen<lastread) {
-			int res = _lwrite16(hf2,buffer+curlen,lastread-curlen);
+			int res = _lwrite32(hf2,buffer+curlen,lastread-curlen);
 			if (res<=0) break;
 			curlen+=res;
 		}
 	}
-	_lclose(hf1);
-	_lclose(hf2);
+	_lclose32(hf1);
+	_lclose32(hf2);
 	return curlen > 0;
 }
 
 BOOL32
 LockFile(
-	HFILE hFile,DWORD dwFileOffsetLow,DWORD dwFileOffsetHigh,
+	HFILE32 hFile,DWORD dwFileOffsetLow,DWORD dwFileOffsetHigh,
 	DWORD nNumberOfBytesToLockLow,DWORD nNumberOfBytesToLockHigh )
 {
 	fprintf(stdnimp,"LockFile(%d,0x%08lx%08lx,0x%08lx%08lx),stub!\n",
@@ -614,7 +495,7 @@
 
 BOOL32
 UnlockFile(
-	HFILE hFile,DWORD dwFileOffsetLow,DWORD dwFileOffsetHigh,
+	HFILE32 hFile,DWORD dwFileOffsetLow,DWORD dwFileOffsetHigh,
 	DWORD nNumberOfBytesToUnlockLow,DWORD nNumberOfBytesToUnlockHigh )
 {
 	fprintf(stdnimp,"UnlockFile(%d,0x%08lx%08lx,0x%08lx%08lx),stub!\n",
diff --git a/win32/findfile.c b/win32/findfile.c
deleted file mode 100644
index 799e5e1..0000000
--- a/win32/findfile.c
+++ /dev/null
@@ -1,389 +0,0 @@
-#include <sys/types.h>
-#include <dirent.h>
-#include <string.h>
-#include <ctype.h>
-#include <malloc.h>
-#include <errno.h>
-#include <sys/stat.h>
-#include <unistd.h>
-#include "xmalloc.h"
-#include "windows.h"
-#include "winerror.h"
-#include "dos_fs.h"
-#include "heap.h"
-#include "drive.h"
-#include "stddebug.h"
-#include "debug.h"
-
-
-
-#define PATH_LEN 260
-
-struct FindFileContext32 {
-    DIR *	dir;
-    char mask[PATH_LEN];
-    char path[PATH_LEN];
-    char unixpath[PATH_LEN];
-};
-
-typedef struct FindFileContext32 FindFileContext32;
-
-const char *DOSFS_Hash(const char *, int, int);
-
-/* TODO/FIXME
- * 1) Check volume information to see if long file names supported
- * and do separate wildcard matching if so. Win95 has extended wildcard
- * matching - It can have wildcards like '*foo*'. These can match both
- * the long file name and the short file name.
- * 2) These file functions may be called from an interrupt
- *    Interrupt 21h Function 714Eh	FindFirstFile
- *    Interrupt 21h Function 714Fh	FindNextFile
- *    Interrupt 21h Function 71A1h	FindClose
- */
-
-static BOOL32 MatchWildCard(LPCSTR file, LPCSTR mask)
-{
-    int	len;
-
-    len = strlen(file);
-
-    if (strcmp(mask, "*.*") == 0)
-      return TRUE;
-
-    while (*file) {
-	if (*mask == '*') {
-	    if (*(mask+1)) {
-		while (*file && (toupper(*file) != *(mask+1))) file++;
-		if (!*file)
-		    return FALSE;
-	    }
-	    else
-		break;
-	}
-	else {
-	    if (*mask != '?' && *mask != toupper(*file)) {
-		return FALSE;
-	    }
-	    file++;
-	}
-	mask++;
-    }
-    return (TRUE);
-}
-
-/* Functionality is same as GetFileInformationByHandle, but the structures
- * it fills out are different. This needs to be kept the same as the above
- * mentioned function.
- */
-
-
-static BOOL32 FINDFILE_GetFileInfo(const char *filename,
-				   LPWIN32_FIND_DATA32A finfo)
-{
-  struct stat file_stat;
-
-  if (stat(filename, &file_stat) == -1) {
-    SetLastError(ErrnoToLastError(errno));
-    return FALSE;
-  }
-  finfo->dwFileAttributes = 0;
-  if (file_stat.st_mode & S_IFREG)
-    finfo->dwFileAttributes |= FILE_ATTRIBUTE_NORMAL;
-  if (file_stat.st_mode & S_IFDIR)
-    finfo->dwFileAttributes |= FILE_ATTRIBUTE_DIRECTORY;
-  if ((file_stat.st_mode & S_IRUSR) == 0)
-    finfo->dwFileAttributes |= FILE_ATTRIBUTE_READONLY;
-
-  /* Translate the file times.  Use the last modification time
-   * for both the creation time and write time.
-   */
-  DOSFS_UnixTimeToFileTime(file_stat.st_mtime, &(finfo->ftCreationTime));
-  DOSFS_UnixTimeToFileTime(file_stat.st_mtime, &(finfo->ftLastWriteTime));
-  DOSFS_UnixTimeToFileTime(file_stat.st_atime, &(finfo->ftLastAccessTime));
-
-  finfo->nFileSizeLow = file_stat.st_size;
-
-  /* Zero out currently unused fields.
-   */
-  finfo->nFileSizeHigh = 0;
-  finfo->dwReserved0 = 0;
-  finfo->dwReserved1 = 0;
-  return TRUE;
-
-}
-
-
-/*************************************************************************
- *              FindNextFile32A             (KERNEL32.126)
- */
-BOOL32 FindNextFile32A(HANDLE32 handle, LPWIN32_FIND_DATA32A data)
-{
-    FindFileContext32 *context;
-    struct dirent *dirent;
-    char  dosname[14];
-    char  fullfilename[PATH_LEN];
-
-    memset(data, 0, sizeof(WIN32_FIND_DATA32A));
-    context = (FindFileContext32 *) handle;
-
-    while ((dirent = readdir(context->dir)) != NULL) {
-	if (strcmp(dirent->d_name, "..") == 0 ||
-	    strcmp(dirent->d_name, ".") == 0)
-	    continue;
-
-	lstrcpy32A(dosname, DOSFS_Hash(dirent->d_name, FALSE, FALSE));
-
-	if (MatchWildCard(dirent->d_name, context->mask)) {
-	    /* fill in file information */
-	    lstrcpy32A(fullfilename, context->unixpath);
-	    if (context->unixpath[strlen(context->unixpath)-1] != '/')
-	      strcat(fullfilename, "/");
-	    strcat(fullfilename, dirent->d_name);
-            FINDFILE_GetFileInfo(fullfilename, data);
-
-	    /* long file name */
-	    lstrcpy32A(data->cFileName, dirent->d_name);
-
-	    /* file name expressed in 8.3 format */
-	    lstrcpy32A(data->cAlternateFileName, dosname);
-
-	    dprintf_file(stddeb, "FindNextFile32A: %s (%s)\n",
-			 data->cFileName, data->cAlternateFileName);
-	    return (TRUE);
-	}
-    }
-    
-    return (FALSE);
-}
-
-/*************************************************************************
- *              FindNextFile32W             (KERNEL32.127)
- */
-BOOL32 FindNextFile32W(HANDLE32 handle, LPWIN32_FIND_DATA32W data)
-{
-    WIN32_FIND_DATA32A	adata;
-    BOOL32	res;
-
-    adata.dwFileAttributes	= data->dwFileAttributes;
-    adata.ftCreationTime	= data->ftCreationTime;
-    adata.ftLastAccessTime	= data->ftLastAccessTime;
-    adata.ftLastWriteTime	= data->ftLastWriteTime;
-    adata.nFileSizeHigh		= data->nFileSizeHigh;
-    adata.nFileSizeLow		= data->nFileSizeLow;
-    adata.dwReserved0		= data->dwReserved0;
-    adata.dwReserved1		= data->dwReserved1;
-    lstrcpyWtoA(adata.cFileName,data->cFileName);
-    lstrcpyWtoA(adata.cAlternateFileName,data->cAlternateFileName);
-    res=FindNextFile32A(handle,&adata);
-    if (res) {
-	    data->dwFileAttributes 	= adata.dwFileAttributes;
-	    data->ftCreationTime	= adata.ftCreationTime;
-	    data->ftLastAccessTime	= adata.ftLastAccessTime;
-	    data->ftLastWriteTime	= adata.ftLastWriteTime;
-	    data->nFileSizeHigh		= adata.nFileSizeHigh;
-	    data->nFileSizeLow		= adata.nFileSizeLow;
-	    data->dwReserved0		= adata.dwReserved0; 
-	    data->dwReserved1		= adata.dwReserved1;
-	    lstrcpyAtoW(data->cFileName,adata.cFileName);
-	    lstrcpyAtoW(data->cAlternateFileName,adata.cAlternateFileName);
-    }
-    return res;
-}
-
-/*************************************************************************
- *              FindFirstFile32A             (KERNEL32.123)
- */
-
-HANDLE32 FindFirstFile32A(LPCSTR lpfilename_in, 
-			  LPWIN32_FIND_DATA32A lpFindFileData)
-{
-    const char *unixpath;
-    char *slash, *p;
-    FindFileContext32 *context;
-    char	lpfilename[PATH_LEN];
-    INT32	len;
-
-    context = HeapAlloc(SystemHeap, 0, sizeof(FindFileContext32));
-    if (!context)
-	return (INVALID_HANDLE_VALUE);
-
-    /* These type of cases
-     * A;\*.*
-     * A;stuff\*.*
-     * *.*
-     * \stuff\*.*
-     */
-    lstrcpy32A(lpfilename, lpfilename_in);
-    if (lpfilename[1] != ':' &&
-	lpfilename[0] != '\\') {
-      /* drive and root path are not set */
-      len = GetCurrentDirectory32A(PATH_LEN, lpfilename);
-      if (lpfilename[len-1] != '\\')
-	strcat(lpfilename, "\\");
-      strcat(lpfilename, lpfilename_in);
-    }
-    else if (lpfilename[1] != ':') {
-      /* drive not set, but path is rooted */
-      memmove(&lpfilename[2], lpfilename, strlen(lpfilename));
-      lpfilename[0] = DRIVE_GetCurrentDrive();
-      lpfilename[1] = ':';
-    }
-    else if (lpfilename[1] == ':' &&
-	     lpfilename[2] != '\\') {
-      /* drive is set, but not root path */
-      lstrcpy32A(lpfilename, DRIVE_GetDosCwd(lpfilename[0]));
-      strcat(lpfilename, lpfilename_in);
-    }
-
-    dprintf_file(stddeb, "FindFirstFile32A: %s -> %s .\n",
-		 lpfilename_in, lpfilename);
-
-    slash = strrchr(lpfilename, '\\');
-
-    if (slash) {
-	lstrcpyn32A(context->path, lpfilename, slash - lpfilename + 1);
-	context->path[slash - lpfilename + 1] = '\0';
-	unixpath = DOSFS_GetUnixFileName(context->path, FALSE);
-	if (!unixpath) {
-	    /* FIXME: SetLastError(??) */
-	    HeapFree(SystemHeap, 0, context);
-	    return INVALID_HANDLE_VALUE;
-	}
-	lstrcpy32A(context->mask, slash+1);
-    }
-    else {
-      /* shouldn't really get here now */
-      context->path[0] = '\0';
-      unixpath = ".";
-      lstrcpy32A(context->mask, lpfilename);
-    }
-
-    lstrcpy32A(context->unixpath, unixpath);
-    context->dir = opendir(unixpath);
-    if (!context->dir) {
-	/* FIXME: SetLastError(??) */
-	HeapFree(SystemHeap, 0, context);
-	return INVALID_HANDLE_VALUE;
-    }
-
-    /* uppercase mask in place */
-    for (p = context->mask ; *p; p++)
-	*p = toupper(*p);
-
-    if (!FindNextFile32A((HANDLE32) context, lpFindFileData))
-	return (INVALID_HANDLE_VALUE);
-    return ((HANDLE32) context);
-}
-
-/*************************************************************************
- *              FindFirstFile32W             (KERNEL32.124)
- */
-HANDLE32 FindFirstFile32W(LPCWSTR filename,LPWIN32_FIND_DATA32W data)
-{
-    WIN32_FIND_DATA32A	adata;
-    LPSTR afn = HEAP_strdupWtoA( GetProcessHeap(), 0, filename );
-    HANDLE32 res = FindFirstFile32A(afn,&adata);
-    if (res)
-    {
-	data->dwFileAttributes 	= adata.dwFileAttributes;
-	data->ftCreationTime	= adata.ftCreationTime;
-	data->ftLastAccessTime	= adata.ftLastAccessTime;
-	data->ftLastWriteTime	= adata.ftLastWriteTime;
-	data->nFileSizeHigh	= adata.nFileSizeHigh;
-	data->nFileSizeLow	= adata.nFileSizeLow;
-	data->dwReserved0	= adata.dwReserved0; 
-	data->dwReserved1	= adata.dwReserved1;
-	lstrcpyAtoW(data->cFileName,adata.cFileName);
-	lstrcpyAtoW(data->cAlternateFileName,adata.cAlternateFileName);
-    }
-    HeapFree( GetProcessHeap(), 0, afn );
-    return res;
-}
-
-/*************************************************************************
- *              FindClose32             (KERNEL32.119)
- */
-BOOL32 FindClose32(HANDLE32 handle)
-{
-    FindFileContext32 *context;
-
-    /* Windows95 ignores an invalid handle. */
-    if (handle == INVALID_HANDLE_VALUE)
-    {
-	SetLastError(ERROR_INVALID_HANDLE);
-        return FALSE;
-    }
-    context = (FindFileContext32 *) handle;
-    if (context->dir)
-	closedir(context->dir);
-    HeapFree(SystemHeap, 0, context);
-    return (TRUE);
-}
-
-/* 16 bit versions of find functions */
-/*************************************************************************
- *              FindFirstFile16             (KERNEL.413)
- */
-
-HANDLE16
-FindFirstFile16(LPCSTR lpFileName, LPVOID lpdata)
-{
-  WIN32_FIND_DATA32A	*findData = (WIN32_FIND_DATA32A *) lpdata;
-  HANDLE32 h32;
-  HGLOBAL16 h16;
-  HANDLE32 *ptr;
-
-  /* get a handle to the real pointer */
-
-
-  h32 = FindFirstFile32A(lpFileName, findData);
-  if (h32 > 0) {
-    h16 = GlobalAlloc16(0, sizeof(h32));
-    ptr = GlobalLock16(h16);
-    *ptr = h32;
-    return (h16);
-  }
-  else
-    return ((HANDLE16) h32);
-}
-
-/*************************************************************************
- *              FindNextFile16             (KERNEL.414)
- */
-
-BOOL16
-FindNextFile16(HANDLE16 handle, LPVOID lpdata)
-{
-  WIN32_FIND_DATA32A	*findData = (WIN32_FIND_DATA32A *) lpdata;
-  HANDLE32 *lph32;
-  
-  lph32 = GlobalLock16(handle);
-  if (FindNextFile32A(*lph32, findData)) {
-    return TRUE;
-  }
-  else
-    return FALSE;
-}
-
-/*************************************************************************
- *              FindClose16             (KERNEL.415)
- */
-
-BOOL16
-FindClose16(HANDLE16 handle)
-{
-  HANDLE32 *lph32;
-  BOOL16 ret;
-
-  if (handle == (HANDLE16) INVALID_HANDLE_VALUE) {
-    SetLastError(ERROR_INVALID_HANDLE);
-    return FALSE;
-  }
-
-  lph32 = GlobalLock16(handle);
-  ret = FindClose32(*lph32);
-  GlobalFree16(handle);
-  return (ret);
-}
-
-
diff --git a/win32/init.c b/win32/init.c
index 3eb9ed3..7509da9 100644
--- a/win32/init.c
+++ b/win32/init.c
@@ -21,36 +21,6 @@
  */
 int WIN32_LastError;
 
-/*********************************************************************
- *              CloseHandle             (KERNEL32.23)
- */
-BOOL CloseHandle(KERNEL_OBJECT *handle)
-{
-    if ((int)handle<0x1000) /* FIXME: hack */
-    	return CloseFileHandle((int)handle);
-    if ((int)handle==0xFFFFFFFF)
-    	return FALSE;
-    switch(handle->magic)
-    {
-        case KERNEL_OBJECT_UNUSED:
-            SetLastError(ERROR_INVALID_HANDLE);
-            return 0;
-/* FIXME
-        case KERNEL_OBJECT_FILE:
-            rc = CloseFileHandle((FILE_OBJECT *)handle);
-            break;
- */
-
-        default:
-            dprintf_win32(stddeb, "CloseHandle: type %ld not implemented yet.\n",
-                   handle->magic);
-            break;
-    }
-
-    ReleaseKernelObject(handle);
-    return 0;
-}
-
 /***********************************************************************
  *              GetModuleHandle         (KERNEL32.237)
  */
diff --git a/win32/k32obj.c b/win32/k32obj.c
new file mode 100644
index 0000000..93919c3
--- /dev/null
+++ b/win32/k32obj.c
@@ -0,0 +1,62 @@
+/*
+ * KERNEL32 objects
+ *
+ * Copyright 1996 Alexandre Julliard
+ */
+
+#include <assert.h>
+#include "handle32.h"
+#include "heap.h"
+#include "file.h"
+#include "process.h"
+#include "thread.h"
+
+typedef void (*destroy_object)(K32OBJ *);
+
+static const destroy_object K32OBJ_Destroy[K32OBJ_NBOBJECTS] =
+{
+    NULL,
+    NULL,              /* K32OBJ_SEMAPHORE */
+    NULL,              /* K32OBJ_EVENT */
+    NULL,              /* K32OBJ_MUTEX */
+    NULL,              /* K32OBJ_CRITICAL_SECTION */
+    PROCESS_Destroy,   /* K32OBJ_PROCESS */
+    THREAD_Destroy,    /* K32OBJ_THREAD */
+    FILE_Destroy,      /* K32OBJ_FILE */
+    NULL,              /* K32OBJ_CHANGE */
+    NULL,              /* K32OBJ_CONSOLE */
+    NULL,              /* K32OBJ_SCREEN_BUFFER */
+    NULL,              /* K32OBJ_MEM_MAPPED_FILE */
+    NULL,              /* K32OBJ_SERIAL */
+    NULL,              /* K32OBJ_DEVICE_IOCTL */
+    NULL,              /* K32OBJ_PIPE */
+    NULL,              /* K32OBJ_MAILSLOT */
+    NULL,              /* K32OBJ_TOOLHELP_SNAPSHOT */
+    NULL               /* K32OBJ_SOCKET */
+};
+
+
+/***********************************************************************
+ *           K32OBJ_IncCount
+ */
+void K32OBJ_IncCount( K32OBJ *ptr )
+{
+    /* FIXME: not atomic */
+    assert( ptr->type && ((unsigned)ptr->type < K32OBJ_NBOBJECTS) );
+    ptr->refcount++;
+}
+
+
+/***********************************************************************
+ *           K32OBJ_DecCount
+ */
+void K32OBJ_DecCount( K32OBJ *ptr )
+{
+    /* FIXME: not atomic */
+    assert( ptr->type && ((unsigned)ptr->type < K32OBJ_NBOBJECTS) );
+    assert( ptr->refcount );
+    if (--ptr->refcount) return;
+    /* Free the object */
+    if (K32OBJ_Destroy[ptr->type]) K32OBJ_Destroy[ptr->type]( ptr );
+}
+
diff --git a/win32/memory.c b/win32/memory.c
index a08b07f..e8d055c 100644
--- a/win32/memory.c
+++ b/win32/memory.c
@@ -28,6 +28,13 @@
     long	size;
 } virtual_mem_t;
 
+typedef struct _VRANGE_OBJECT
+{
+	DWORD				start;
+	DWORD				size;
+	struct _VRANGE_OBJECT *next;
+} VRANGE_OBJECT;
+
 virtual_mem_t *mem = 0;
 int mem_count = 0;
 int mem_used = 0;
@@ -132,7 +139,6 @@
 VRANGE_OBJECT *MEMORY_AllocVrange(int start,int size)
 {
 	VRANGE_OBJECT *ret=CreateKernelObject(sizeof(VRANGE_OBJECT));
-	ret->common.magic=KERNEL_OBJECT_VRANGE;
 	MEMORY_InsertVrange(ret);
 	return ret;
 }
diff --git a/win32/newfns.c b/win32/newfns.c
index c7fb4c1..4bea247 100644
--- a/win32/newfns.c
+++ b/win32/newfns.c
@@ -13,16 +13,6 @@
 #include "stddebug.h"
 #include "debug.h"
 
-/***********************************************************************
- *          WinHelpA           (USER32.578)
- */
-BOOL WIN32_WinHelpA(HWND hWnd,LPCSTR lpszHelp,UINT uCommand, DWORD dwData)
-{
-	/* Should do parameter conversion here, but WinHelp is not working,
-	   anyways */
-	return WinHelp(hWnd,lpszHelp,uCommand,dwData);
-}
-
 /****************************************************************************
  *		QueryPerformanceCounter (KERNEL32.415)
  */
diff --git a/win32/object_mgt.c b/win32/object_mgt.c
deleted file mode 100644
index 6495694..0000000
--- a/win32/object_mgt.c
+++ /dev/null
@@ -1,19 +0,0 @@
-/*
- *      object_mgt.c - Kernel object management functions
- *
- *  Revision History:
- *
- *  Oct 28 1995 C. Heide
- *              First created.
- */
-
-#include <stdio.h>
-#include <stdlib.h>
-
-#include "handle32.h"
-
-int ValidateKernelObject(KERNEL_OBJECT *ptr)
-{
-  return (!ptr || (short int)(int)ptr==-1);
-}
-
diff --git a/win32/process.c b/win32/process.c
index 2b6f501..a8534ff 100644
--- a/win32/process.c
+++ b/win32/process.c
@@ -11,21 +11,9 @@
 #include "winerror.h"
 #include "heap.h"
 #include "handle32.h"
-#include "task.h"
 #include "stddebug.h"
 #include "debug.h"
 
-static HANDLE32 ProcessHeap = 0;  /* FIXME: should be in process database */
-
-/***********************************************************************
- *           ExitProcess   (KERNEL32.100)
- */
-
-void ExitProcess(DWORD status)
-{
-    TASK_KillCurrentTask( status );
-}
-
 /***********************************************************************
  *           CreateMutexA    (KERNEL32.52)
  */
@@ -79,22 +67,7 @@
 	*d = b;
 	return 1;
 }
-/***********************************************************************
- *           GetCurrentProcess    (KERNEL32.198)
- */
-HANDLE32 GetCurrentProcess(void)
-{
-	return 0;
-}
 
-/***********************************************************************
- *           GetProcessHeap    (KERNEL32.259)
- */
-HANDLE32 GetProcessHeap(void)
-{
-    if (!ProcessHeap) ProcessHeap = HeapCreate( 0, 0x10000, 0 );
-    return ProcessHeap;
-}
 
 /***********************************************************************
  *           LoadLibraryA         (KERNEL32.365)
diff --git a/win32/string32.c b/win32/string32.c
index f4a317b..253ab60 100644
--- a/win32/string32.c
+++ b/win32/string32.c
@@ -15,13 +15,6 @@
 #include "string32.h"
 #include "xmalloc.h"
 
-LPSTR STRING32_DupUniToAnsi(LPCWSTR src)
-{
-	LPSTR dest=xmalloc(lstrlen32W(src)+1);
-	lstrcpyWtoA(dest,src);
-	return dest;
-}
-
 LPWSTR STRING32_DupAnsiToUni(LPCSTR src)
 {
 	LPWSTR dest=xmalloc(2*strlen(src)+2);
@@ -29,14 +22,6 @@
 	return dest;
 }
 
-/* not an API function */
-
-WCHAR STRING32_tolowerW(WCHAR c)
-{
-	/* FIXME: Unicode */
-	return tolower(c);
-}
-
 LPWSTR
 STRING32_lstrchrW(LPCWSTR a,WCHAR c) {
 	while(*a) {
diff --git a/win32/thread.c b/win32/thread.c
index ae020f7..6c0559f 100644
--- a/win32/thread.c
+++ b/win32/thread.c
@@ -14,31 +14,6 @@
 #include "debug.h"
 #include "xmalloc.h"
 
-/***********************************************************************
- *           GetCurrentThreadId   (KERNEL32.201)
- */
-
-DWORD GetCurrentThreadId(void)
-{
-        /* Windows 95 returns the address of the thread database (sorta) */
-        return MAKELONG(GetCurrentTask(), 0);
-}
-
-/***********************************************************************
- *           GetThreadContext         (KERNEL32.294)
- */
-BOOL GetThreadContext(HANDLE32 hThread, void *lpContext)
-{
-        return FALSE;
-}
-/***********************************************************************
- *           GetCurrentThread    (KERNEL32.200)
- */
-HANDLE32 GetCurrentThread(void)
-{
-        return 0xFFFFFFFE;	/* that's -2 */
-}
-
 /**********************************************************************
  *          Critical Sections are currently ignored
  */
@@ -76,53 +51,6 @@
 	/* hmm */
 }
 
-/***********************************************************************
- *           Tls is available only for the single thread
- * (BTW: TLS means Thread Local Storage)
- */
-static LPVOID* Tls=0;
-static int TlsCount=0;
-
-DWORD TlsAlloc()
-{
-	if(!Tls){
-		TlsCount++;
-		Tls=xmalloc(sizeof(LPVOID));
-		/* Tls needs to be zero initialized */
-		Tls[0]=0;
-		return 0;
-	}
-	Tls=xrealloc(Tls,sizeof(LPVOID)*(++TlsCount));
-	Tls[TlsCount-1]=0;
-	return TlsCount-1;
-}
-
-void TlsFree(DWORD index)
-{
-	/*FIXME: should remember that it has been freed */
-	return;
-}
-
-LPVOID TlsGetValue(DWORD index)
-{
-	if(index>=TlsCount)
-	{
-		/* FIXME: Set last error*/
-		return 0;
-	}
-	return Tls[index];
-}
-
-BOOL32 TlsSetValue(DWORD index,LPVOID value)
-{
-	if(index>=TlsCount)
-	{
-		/* FIXME: Set last error*/
-		return FALSE;
-	}
-	Tls[index]=value;
-	return TRUE;
-}
 
 /* FIXME: This is required to work cross-addres space as well */
 static CRITICAL_SECTION interlocked;
diff --git a/win32/user32.c b/win32/user32.c
index 89c1a40..4d64343 100644
--- a/win32/user32.c
+++ b/win32/user32.c
@@ -13,7 +13,6 @@
 #include "windows.h"
 #include "winerror.h"
 #include "heap.h"
-#include "xmalloc.h"
 #include "handle32.h"
 #include "struct32.h"
 #include "win.h"
diff --git a/windows/caret.c b/windows/caret.c
index ca11b7e..da49ee4 100644
--- a/windows/caret.c
+++ b/windows/caret.c
@@ -11,7 +11,6 @@
 /* #define DEBUG_CARET */
 #include "debug.h"
 
-
 typedef struct
 {
     HWND32     hwnd;
@@ -35,16 +34,24 @@
 
 static CARET Caret = { 0, 0, FALSE, 0, 0, 2, 12, 0, 500, 0 };
 
-
 /*****************************************************************
  *              CARET_GetHwnd
  */
-HWND32 CARET_GetHwnd()
+HWND32 CARET_GetHwnd(void)
 {
     return Caret.hwnd;
 }
 
 /*****************************************************************
+ *              CARET_GetRect
+ */
+void CARET_GetRect(LPRECT32 lprc)
+{
+    lprc->right = (lprc->left = Caret.x) + Caret.width - 1;
+    lprc->bottom = (lprc->top = Caret.y) + Caret.height - 1;
+}
+
+/*****************************************************************
  *               CARET_DisplayCaret
  */
 static void CARET_DisplayCaret( DISPLAY_CARET status )
diff --git a/windows/dialog.c b/windows/dialog.c
index bd03f44..20437e1 100644
--- a/windows/dialog.c
+++ b/windows/dialog.c
@@ -458,9 +458,10 @@
 /***********************************************************************
  *           DIALOG_CreateIndirect
  */
-static HWND DIALOG_CreateIndirect( HINSTANCE32 hInst, LPCSTR dlgTemplate,
-                                   HWND owner, DLGPROC16 dlgProc,
-                                   LPARAM param, WINDOWPROCTYPE procType )
+HWND32 DIALOG_CreateIndirect( HINSTANCE32 hInst, LPCSTR dlgTemplate,
+                              BOOL32 win32Template, HWND32 owner,
+                              DLGPROC16 dlgProc, LPARAM param,
+                              WINDOWPROCTYPE procType )
 {
     HMENU16 hMenu = 0;
     HFONT16 hFont = 0;
@@ -475,7 +476,7 @@
       /* Parse dialog template */
 
     if (!dlgTemplate) return 0;
-    if (procType != WIN_PROC_16)
+    if (win32Template)
         dlgTemplate = DIALOG_ParseTemplate32( dlgTemplate, &template );
     else
         dlgTemplate = DIALOG_ParseTemplate16( dlgTemplate, &template );
@@ -593,7 +594,7 @@
     /* Create controls */
 
     if (!DIALOG_CreateControls( wndPtr, dlgTemplate, template.nbItems,
-                                hInst, (procType != WIN_PROC_16) ))
+                                hInst, win32Template ))
     {
         DestroyWindow( hwnd );
         return 0;
@@ -692,7 +693,7 @@
                                     HWND16 owner, DLGPROC16 dlgProc,
                                     LPARAM param )
 {
-    return DIALOG_CreateIndirect( hInst, dlgTemplate, owner,
+    return DIALOG_CreateIndirect( hInst, dlgTemplate, FALSE, owner,
                                   dlgProc, param, WIN_PROC_16 );
 }
 
@@ -704,7 +705,7 @@
                                      HWND32 owner, DLGPROC32 dlgProc,
                                      LPARAM param )
 {
-    return DIALOG_CreateIndirect( hInst, dlgTemplate, owner,
+    return DIALOG_CreateIndirect( hInst, dlgTemplate, TRUE, owner,
                                   (DLGPROC16)dlgProc, param, WIN_PROC_32A );
 }
 
@@ -716,7 +717,7 @@
                                      HWND32 owner, DLGPROC32 dlgProc,
                                      LPARAM param )
 {
-    return DIALOG_CreateIndirect( hInst, dlgTemplate, owner,
+    return DIALOG_CreateIndirect( hInst, dlgTemplate, TRUE, owner,
                                   (DLGPROC16)dlgProc, param, WIN_PROC_32W );
 }
 
@@ -724,7 +725,7 @@
 /***********************************************************************
  *           DIALOG_DoDialogBox
  */
-static INT32 DIALOG_DoDialogBox( HWND hwnd, HWND owner )
+INT32 DIALOG_DoDialogBox( HWND32 hwnd, HWND32 owner )
 {
     WND * wndPtr;
     DIALOGINFO * dlgInfo;
@@ -832,7 +833,7 @@
  *           DialogBoxIndirectParam32A   (USER32.135)
  */
 INT32 DialogBoxIndirectParam32A( HINSTANCE32 hInstance, LPCVOID template,
-                                 HWND32 owner, DLGPROC32 dlgProc ,LPARAM param)
+                                 HWND32 owner, DLGPROC32 dlgProc, LPARAM param)
 {
     HWND32 hwnd = CreateDialogIndirectParam32A( hInstance, template,
                                                 owner, dlgProc, param );
@@ -845,7 +846,7 @@
  *           DialogBoxIndirectParam32W   (USER32.137)
  */
 INT32 DialogBoxIndirectParam32W( HINSTANCE32 hInstance, LPCVOID template,
-                                 HWND32 owner, DLGPROC32 dlgProc ,LPARAM param)
+                                 HWND32 owner, DLGPROC32 dlgProc, LPARAM param)
 {
     HWND32 hwnd = CreateDialogIndirectParam32W( hInstance, template,
                                                 owner, dlgProc, param );
diff --git a/windows/event.c b/windows/event.c
index d01c38b..ac851e3 100644
--- a/windows/event.c
+++ b/windows/event.c
@@ -20,13 +20,13 @@
 #include <X11/Xatom.h>
 
 #include "windows.h"
+#include "winnt.h"
 #include "gdi.h"
 #include "heap.h"
 #include "queue.h"
 #include "win.h"
 #include "class.h"
 #include "clipboard.h"
-#include "debugger.h"
 #include "message.h"
 #include "module.h"
 #include "options.h"
@@ -35,7 +35,6 @@
 #include "drive.h"
 #include "dos_fs.h"
 #include "shell.h"
-#include "registers.h"
 #include "xmalloc.h"
 #include "keyboard.h"
 #include "stddebug.h"
@@ -65,7 +64,7 @@
 BOOL AsyncMouseButtonsStates[NB_BUTTONS];
 BYTE InputKeyStateTable[256];
 
-
+static INT16  captureHT = HTCLIENT;
 static HWND32 captureWnd = 0;
 static BOOL32 InputEnabled = TRUE;
 
@@ -542,10 +541,12 @@
 	   keysym, ksname, ascii_chars, Str[0], Str);
 	}
 
+#if 0
     /* Ctrl-Alt-Return enters the debugger */
     if ((keysym == XK_Return) && (event->type == KeyPress) &&
         (event->state & ControlMask) && (event->state & Mod1Mask))
         DEBUG_EnterDebugger();
+#endif
 
     xkey = LOWORD(keysym);
     key_type = HIBYTE(xkey);
@@ -585,8 +586,8 @@
 	    case XK_Delete :
 	    case XK_Home :
 	    case XK_End :
-	    case XK_Page_Up :
-	    case XK_Page_Down :
+	    case XK_Prior :
+	    case XK_Next :
 	    case XK_Left :
 	    case XK_Up :
 	    case XK_Right :
@@ -1082,20 +1083,13 @@
     return;
 }
 
-
 /**********************************************************************
- *		SetCapture16   (USER.18)
+ *              EVENT_Capture
+ * 
+ * We need this to be able to generate double click messages
+ * when menu code captures mouse in the window without CS_DBLCLK style.
  */
-HWND16 SetCapture16( HWND16 hwnd )
-{
-    return (HWND16)SetCapture32( hwnd );
-}
-
-
-/**********************************************************************
- *		SetCapture32   (USER32.463)
- */
-HWND32 SetCapture32( HWND32 hwnd )
+HWND32 EVENT_Capture(HWND32 hwnd, INT16 ht)
 {
     Window win;
     HWND32 old_capture_wnd = captureWnd;
@@ -1105,17 +1099,45 @@
         ReleaseCapture();
         return old_capture_wnd;
     }
-    if (!(win = WIN_GetXWindow( hwnd ))) return 0;
-    if (XGrabPointer(display, win, False, 
+    if ((win = WIN_GetXWindow( hwnd )))
+    {
+        if (XGrabPointer(display, win, False,
                      ButtonPressMask | ButtonReleaseMask | PointerMotionMask,
                      GrabModeAsync, GrabModeAsync,
                      None, None, CurrentTime ) == GrabSuccess)
-    {
-	dprintf_win(stddeb, "SetCapture: %04x\n", hwnd);
-	captureWnd   = hwnd;
-	return old_capture_wnd;
+	{
+            dprintf_win(stddeb, "SetCapture: %04x\n", hwnd);
+            captureWnd   = hwnd;
+	    captureHT    = ht;
+            return old_capture_wnd;
+        }
     }
-    else return 0;
+    return 0;
+}
+
+/**********************************************************************
+ *              EVENT_GetCaptureInfo
+ */
+INT16 EVENT_GetCaptureInfo()
+{
+    return captureHT;
+}
+
+/**********************************************************************
+ *		SetCapture16   (USER.18)
+ */
+HWND16 SetCapture16( HWND16 hwnd )
+{
+    return (HWND16)EVENT_Capture( hwnd, HTCLIENT );
+}
+
+
+/**********************************************************************
+ *		SetCapture32   (USER32.463)
+ */
+HWND32 SetCapture32( HWND32 hwnd )
+{
+    return EVENT_Capture( hwnd, HTCLIENT );
 }
 
 
@@ -1163,8 +1185,7 @@
 /***********************************************************************
  *           Mouse_Event   (USER.299)
  */
-#ifndef WINELIB
-void Mouse_Event( SIGCONTEXT *context )
+void Mouse_Event( CONTEXT *context )
 {
     /* Register values:
      * AX = mouse event
@@ -1199,7 +1220,6 @@
         hardware_event( WM_RBUTTONUP, EVENT_XStateToKeyState( state ), 0L,
                         rootX - desktopX, rootY - desktopY, GetTickCount(), 0);
 }
-#endif
 
 
 /**********************************************************************
diff --git a/windows/mdi.c b/windows/mdi.c
index e0b2474..f780b72 100644
--- a/windows/mdi.c
+++ b/windows/mdi.c
@@ -838,7 +838,6 @@
 BOOL MDI_AugmentFrameMenu(MDICLIENTINFO* ci, WND *frame, HWND hChild)
 {
  WND*		child = WIN_FindWndPtr(hChild);
- HGLOBAL16      handle;
  HMENU16  	hSysPopup = 0;
 
  dprintf_mdi(stddeb,"MDI_AugmentFrameMenu: frame %p,child %04x\n",frame,hChild);
@@ -847,9 +846,8 @@
 
  /* create a copy of sysmenu popup and insert it into frame menu bar */
 
- if (!(handle = SYSRES_LoadResource( SYSRES_MENU_SYSMENU ))) return 0;
- hSysPopup = LoadMenuIndirect16( GlobalLock16( handle ) );
- SYSRES_FreeResource( handle );
+ if (!(hSysPopup = LoadMenuIndirect32A(SYSRES_GetResPtr(SYSRES_MENU_SYSMENU))))
+     return 0;
  
  dprintf_mdi(stddeb,"\t\tgot popup %04x\n in sysmenu %04x",hSysPopup,child->hSysMenu);
  
diff --git a/windows/message.c b/windows/message.c
index dcfec8d..70b3043 100644
--- a/windows/message.c
+++ b/windows/message.c
@@ -32,7 +32,8 @@
 #define HWND_BROADCAST16  ((HWND16)0xffff)
 #define HWND_BROADCAST32  ((HWND32)0xffffffff)
 
-typedef enum { SYSQ_MSG_ABANDON, SYSQ_MSG_SKIP, SYSQ_MSG_ACCEPT } SYSQ_STATUS;
+typedef enum { SYSQ_MSG_ABANDON, SYSQ_MSG_SKIP, 
+               SYSQ_MSG_ACCEPT, SYSQ_MSG_CONTINUE } SYSQ_STATUS;
 
 extern BOOL MouseButtonsStates[3];
 extern BOOL AsyncMouseButtonsStates[3];
@@ -50,62 +51,64 @@
 static INT32 debugSMRL = 0;       /* intertask SendMessage() recursion level */
 
 /***********************************************************************
+ *           MSG_CheckFilter
+ */
+BOOL32 MSG_CheckFilter(WORD uMsg, DWORD filter)
+{
+   if( filter )
+       return (uMsg >= LOWORD(filter) && uMsg <= HIWORD(filter));
+   return TRUE;
+}
+
+/***********************************************************************
  *           MSG_TranslateMouseMsg
  *
  * Translate an mouse hardware event into a real mouse message.
  * Return value indicates whether the translated message must be passed
- * to the user.
- * Actions performed:
- * - Find the window for this message.
- * - Translate button-down messages in double-clicks.
- * - Send the WM_NCHITTEST message to find where the cursor is.
- * - Activate the window if needed.
- * - Translate the message into a non-client message, or translate
- *   the coordinates to client coordinates.
- * - Send the WM_SETCURSOR message.
+ * to the user, left in the queue, or skipped entirely (in this case
+ * HIWORD contains hit test code).
  */
-static SYSQ_STATUS MSG_TranslateMouseMsg( MSG16 *msg, BOOL remove )
+static DWORD MSG_TranslateMouseMsg( HWND16 hWndScope, DWORD filter, 
+				    MSG16 *msg, BOOL32 remove )
 {
-    WND *pWnd;
-    BOOL eatMsg = FALSE;
-    INT16 hittest;
-    MOUSEHOOKSTRUCT16 *hook;
-    BOOL32 ret;
-    static DWORD lastClickTime = 0;
-    static WORD  lastClickMsg = 0;
-    static POINT16 lastClickPos = { 0, 0 };
-    POINT16 pt = msg->pt;
-    MESSAGEQUEUE *queue = (MESSAGEQUEUE *)GlobalLock16(GetTaskQueue(0));
+    static DWORD   dblclk_time_limit = 0;
+    static UINT16     clk_message = 0;
+    static HWND16     clk_hwnd = 0;
+    static POINT16    clk_pos = { 0, 0 };
 
-    BOOL mouseClick = ((msg->message == WM_LBUTTONDOWN) ||
-		       (msg->message == WM_RBUTTONDOWN) ||
-		       (msg->message == WM_MBUTTONDOWN));
+    WND *pWnd;
+    HWND16 hWnd;
+    INT16 ht, hittest, sendSC = 0;
+    UINT16 message = msg->message;
+    POINT16 screen_pt, pt;
+    HANDLE16 hQ = GetTaskQueue(0);
+    MESSAGEQUEUE *queue = (MESSAGEQUEUE *)GlobalLock16(hQ);
+    BOOL32 eatMsg = FALSE;
+    BOOL32 mouseClick = ((message == WM_LBUTTONDOWN) ||
+		         (message == WM_RBUTTONDOWN) ||
+		         (message == WM_MBUTTONDOWN))?1:0;
+    SYSQ_STATUS ret = 0;
 
       /* Find the window */
 
-    if ((msg->hwnd = GetCapture16()) != 0)
+    ht = hittest = HTCLIENT;
+    hWnd = GetCapture16();
+    if( !hWnd )
     {
-        BOOL32 ret;
-
-	ScreenToClient16( msg->hwnd, &pt );
-	msg->lParam = MAKELONG( pt.x, pt.y );
-        /* No need to further process the message */
-
-        if (!HOOK_IsHooked( WH_MOUSE ) ||
-            !(hook = SEGPTR_NEW(MOUSEHOOKSTRUCT16)))
-            return SYSQ_MSG_ACCEPT;
-        hook->pt           = msg->pt;
-        hook->hwnd         = msg->hwnd;
-        hook->wHitTestCode = HTCLIENT;
-        hook->dwExtraInfo  = 0;
-        ret = !HOOK_CallHooks16( WH_MOUSE, remove ? HC_ACTION : HC_NOREMOVE,
-                                 msg->message, (LPARAM)SEGPTR_GET(hook));
-        SEGPTR_FREE(hook);
-        return ret ? SYSQ_MSG_ACCEPT : SYSQ_MSG_SKIP ;
+	sendSC = 1;
+	ht = hittest = WINPOS_WindowFromPoint( WIN_GetDesktop(), msg->pt, &pWnd );
+	if( !pWnd ) pWnd = WIN_GetDesktop();
+	hWnd = pWnd->hwndSelf;
+    } 
+    else 
+    {
+	pWnd = WIN_FindWndPtr(hWnd);
+	ht = EVENT_GetCaptureInfo();
     }
-   
-    hittest = WINPOS_WindowFromPoint( WIN_GetDesktop(), msg->pt, &pWnd );
-    if (pWnd->hmemTaskQ != GetTaskQueue(0))
+
+	/* stop if not the right queue */
+
+    if (pWnd->hmemTaskQ != hQ)
     {
         /* Not for the current task */
         if (queue) QUEUE_ClearWakeBit( queue, QS_MOUSE );
@@ -114,127 +117,147 @@
         if (queue) QUEUE_SetWakeBit( queue, QS_MOUSE );
         return SYSQ_MSG_ABANDON;
     }
-    pCursorQueue = queue;
-    msg->hwnd    = pWnd->hwndSelf;
 
-    if ((hittest != HTERROR) && mouseClick)
+	/* check if hWnd is within hWndScope */
+
+    if( hWndScope && hWnd != hWndScope )
+	if( !IsChild(hWndScope, hWnd) ) return SYSQ_MSG_CONTINUE;
+
+    if( mouseClick )
     {
-        HWND hwndTop = WIN_GetTopParent( msg->hwnd );
+	/* translate double clicks -
+	 * note that ...MOUSEMOVEs can slip in between
+	 * ...BUTTONDOWN and ...BUTTONDBLCLK messages */
 
-        /* Send the WM_PARENTNOTIFY message */
-
-        WIN_SendParentNotify( msg->hwnd, msg->message, 0,
-                              MAKELPARAM( msg->pt.x, msg->pt.y ) );
-
-        /* Activate the window if needed */
-
-        if (msg->hwnd != GetActiveWindow() &&
-            msg->hwnd != GetDesktopWindow16())
-        {
-            LONG ret = SendMessage16( msg->hwnd, WM_MOUSEACTIVATE, hwndTop,
-                                    MAKELONG( hittest, msg->message ) );
-
-            if ((ret == MA_ACTIVATEANDEAT) || (ret == MA_NOACTIVATEANDEAT))
-                eatMsg = TRUE;
-
-            if (((ret == MA_ACTIVATE) || (ret == MA_ACTIVATEANDEAT)) 
-                && hwndTop != GetActiveWindow() )
-                WINPOS_SetActiveWindow( hwndTop, TRUE , TRUE );
-        }
-    }
-
-      /* Send the WM_SETCURSOR message */
-
-    SendMessage16( msg->hwnd, WM_SETCURSOR, (WPARAM16)msg->hwnd,
-                   MAKELONG( hittest, msg->message ));
-    if (eatMsg) return SYSQ_MSG_SKIP;
-
-      /* Check for double-click */
-
-    if (mouseClick)
-    {
-	BOOL dbl_click = FALSE;
-
-	if ((msg->message == lastClickMsg) &&
-	    (msg->time - lastClickTime < doubleClickSpeed) &&
-	    (abs(msg->pt.x - lastClickPos.x) < SYSMETRICS_CXDOUBLECLK/2) &&
-	    (abs(msg->pt.y - lastClickPos.y) < SYSMETRICS_CYDOUBLECLK/2))
-	    dbl_click = TRUE;
-
-	if (dbl_click && (hittest == HTCLIENT))
+	if( pWnd->class->style & CS_DBLCLKS || ht != HTCLIENT )
 	{
-	    /* Check whether window wants the double click message. */
-            dbl_click = (pWnd->class->style & CS_DBLCLKS) != 0;
-	}
-
-	if (dbl_click) switch(msg->message)
-	{
-	    case WM_LBUTTONDOWN: msg->message = WM_LBUTTONDBLCLK; break;
-	    case WM_RBUTTONDOWN: msg->message = WM_RBUTTONDBLCLK; break;
-	    case WM_MBUTTONDOWN: msg->message = WM_MBUTTONDBLCLK; break;
-	}
-
-	if (remove)
-	{
-	    lastClickTime = msg->time;
-	    lastClickMsg  = msg->message;
-	    lastClickPos  = msg->pt;
+           if ((message == clk_message) && (hWnd == clk_hwnd) &&
+               (msg->time - dblclk_time_limit < doubleClickSpeed) &&
+               (abs(msg->pt.x - clk_pos.x) < SYSMETRICS_CXDOUBLECLK/2) &&
+               (abs(msg->pt.y - clk_pos.y) < SYSMETRICS_CYDOUBLECLK/2))
+	   {
+	      message += (WM_LBUTTONDBLCLK - WM_LBUTTONDOWN);
+	      mouseClick++;   /* == 2 */
+	   }
 	}
     }
+    screen_pt = pt = msg->pt;
 
-      /* Build the translated message */
-
-    if (hittest == HTCLIENT)
-        ScreenToClient16( msg->hwnd, &pt );
-    else
+    if (hittest != HTCLIENT)
     {
+	message += ((INT16)WM_NCMOUSEMOVE - WM_MOUSEMOVE);
 	msg->wParam = hittest;
-	msg->message += WM_NCLBUTTONDOWN - WM_LBUTTONDOWN;
     }
-    msg->lParam = MAKELONG( pt.x, pt.y );
+    else ScreenToClient16( hWnd, &pt );
 
-    /* Call the WH_MOUSE hook */
+	/* check message filter */
 
-    if (!HOOK_IsHooked( WH_MOUSE ) ||
-        !(hook = SEGPTR_NEW(MOUSEHOOKSTRUCT16)))
-        return SYSQ_MSG_ACCEPT;
+    if (!MSG_CheckFilter(message, filter)) return SYSQ_MSG_CONTINUE;
 
-    hook->pt           = msg->pt;
-    hook->hwnd         = msg->hwnd;
-    hook->wHitTestCode = hittest;
-    hook->dwExtraInfo  = 0;
-    ret = !HOOK_CallHooks16( WH_MOUSE, remove ? HC_ACTION : HC_NOREMOVE,
-                             msg->message, (LPARAM)SEGPTR_GET(hook) );
-    SEGPTR_FREE(hook);
-    return ret ? SYSQ_MSG_ACCEPT : SYSQ_MSG_SKIP;
+    pCursorQueue = queue;
+
+	/* call WH_MOUSE */
+
+    if (HOOK_IsHooked( WH_MOUSE ))
+    { 
+	MOUSEHOOKSTRUCT16 *hook = SEGPTR_NEW(MOUSEHOOKSTRUCT16);
+	if( hook )
+	{
+	    hook->pt           = screen_pt;
+	    hook->hwnd         = hWnd;
+	    hook->wHitTestCode = hittest;
+	    hook->dwExtraInfo  = 0;
+	    ret = HOOK_CallHooks16( WH_MOUSE, remove ? HC_ACTION : HC_NOREMOVE,
+	                            message, (LPARAM)SEGPTR_GET(hook) );
+	    SEGPTR_FREE(hook);
+	}
+	if( ret ) return MAKELONG((INT16)SYSQ_MSG_SKIP, hittest);
+    }
+
+    if ((hittest == HTERROR) || (hittest == HTNOWHERE)) 
+	eatMsg = sendSC = 1;
+    else if( remove && mouseClick )
+    {
+        HWND hwndTop = WIN_GetTopParent( hWnd );
+
+	if( mouseClick == 1 )
+	{
+	    /* set conditions */
+	    dblclk_time_limit = msg->time;
+	       clk_message = msg->message;
+	       clk_hwnd = hWnd;
+	       clk_pos = screen_pt;
+	} else 
+	    /* got double click - zero them out */
+	    dblclk_time_limit = clk_hwnd = 0;
+
+	if( sendSC )
+	{
+            /* Send the WM_PARENTNOTIFY,
+	     * note that even for double/nonclient clicks
+	     * notification message is still WM_L/M/RBUTTONDOWN.
+	     */
+
+            WIN_SendParentNotify( hWnd, msg->message, 0,
+                              MAKELPARAM( screen_pt.x, screen_pt.y ) );
+
+            /* Activate the window if needed */
+
+            if (hWnd != GetActiveWindow() && hWnd != GetDesktopWindow16())
+            {
+                LONG ret = SendMessage16( hWnd, WM_MOUSEACTIVATE, hwndTop,
+                                          MAKELONG( hittest, message ) );
+
+                if ((ret == MA_ACTIVATEANDEAT) || (ret == MA_NOACTIVATEANDEAT))
+                         eatMsg = TRUE;
+
+                if (((ret == MA_ACTIVATE) || (ret == MA_ACTIVATEANDEAT)) 
+                      && hwndTop != GetActiveWindow() )
+                      if (!WINPOS_SetActiveWindow( hwndTop, TRUE , TRUE ))
+			 eatMsg = TRUE;
+            }
+	}
+    } else sendSC = (remove && sendSC);
+
+     /* Send the WM_SETCURSOR message */
+
+    if (sendSC)
+        SendMessage16( hWnd, WM_SETCURSOR, (WPARAM16)hWnd,
+                       MAKELONG( hittest, message ));
+    if (eatMsg) return MAKELONG( (UINT16)SYSQ_MSG_SKIP, hittest);
+
+    msg->hwnd    = hWnd;
+    msg->message = message;
+    msg->lParam  = MAKELONG( pt.x, pt.y );
+    return SYSQ_MSG_ACCEPT;
 }
 
 
 /***********************************************************************
- *           MSG_TranslateKeyboardMsg
+ *           MSG_TranslateKbdMsg
  *
  * Translate an keyboard hardware event into a real message.
- * Return value indicates whether the translated message must be passed
- * to the user.
  */
-static SYSQ_STATUS MSG_TranslateKeyboardMsg( MSG16 *msg, BOOL remove )
+static DWORD MSG_TranslateKbdMsg( HWND16 hWndScope, DWORD filter,
+				  MSG16 *msg, BOOL32 remove )
 {
+    WORD message = msg->message;
+    HWND16 hWnd = GetFocus16();
     WND *pWnd;
 
       /* Should check Ctrl-Esc and PrintScreen here */
 
-    msg->hwnd = GetFocus16();
-    if (!msg->hwnd)
+    if (!hWnd)
     {
 	  /* Send the message to the active window instead,  */
 	  /* translating messages to their WM_SYS equivalent */
 
-	msg->hwnd = GetActiveWindow();
+	hWnd = GetActiveWindow();
 
-	if( msg->message < WM_SYSKEYDOWN )
-	    msg->message += WM_SYSKEYDOWN - WM_KEYDOWN;
+	if( message < WM_SYSKEYDOWN )
+	    message += WM_SYSKEYDOWN - WM_KEYDOWN;
     }
-    pWnd = WIN_FindWndPtr( msg->hwnd );
+    pWnd = WIN_FindWndPtr( hWnd );
     if (pWnd && (pWnd->hmemTaskQ != GetTaskQueue(0)))
     {
         /* Not for the current task */
@@ -245,6 +268,14 @@
         if (queue) QUEUE_SetWakeBit( queue, QS_KEY );
         return SYSQ_MSG_ABANDON;
     }
+
+    if (hWndScope && hWnd != hWndScope)
+	if (!IsChild(hWndScope, hWnd)) return SYSQ_MSG_CONTINUE;
+    if (!MSG_CheckFilter(message, filter)) return SYSQ_MSG_CONTINUE;
+
+    msg->hwnd = hWnd;
+    msg->message = message;
+
     return (HOOK_CallHooks16( WH_KEYBOARD, remove ? HC_ACTION : HC_NOREMOVE,
 			      msg->wParam, msg->lParam )
             ? SYSQ_MSG_SKIP : SYSQ_MSG_ACCEPT);
@@ -365,7 +396,13 @@
 		     (LPARAM)SEGPTR_GET(tmpMsg));
   }
   else
-    result= QS_MOUSE | QS_KEY;
+  {
+    if( tmpMsg->message == WM_QUEUESYNC )
+        if (HOOK_IsHooked( WH_CBT ))
+            HOOK_CallHooks16( WH_CBT, HCBT_QS, 0, 0L);
+
+    result= QS_MOUSE | QS_KEY; /* ? */
+  }
   SEGPTR_FREE(tmpMsg);
  }
  return result;
@@ -376,35 +413,34 @@
  *
  * Peek for a hardware message matching the hwnd and message filters.
  */
-static BOOL MSG_PeekHardwareMsg( MSG16 *msg, HWND hwnd, WORD first, WORD last,
-                                 BOOL remove )
+static BOOL32 MSG_PeekHardwareMsg( MSG16 *msg, HWND16 hwnd, DWORD filter, BOOL32 remove )
 {
-    SYSQ_STATUS status = SYSQ_MSG_ACCEPT;
+    DWORD status = SYSQ_MSG_ACCEPT;
     MESSAGEQUEUE *sysMsgQueue = QUEUE_GetSysQueue();
-    int i, pos = sysMsgQueue->nextMessage;
+    int i, kbd_msg, pos = sysMsgQueue->nextMessage;
 
     /* If the queue is empty, attempt to fill it */
     if (!sysMsgQueue->msgCount && XPending(display))
         EVENT_WaitXEvent( FALSE, FALSE );
 
-    for (i = 0; i < sysMsgQueue->msgCount; i++, pos++)
+    for (i = kbd_msg = 0; i < sysMsgQueue->msgCount; i++, pos++)
     {
         if (pos >= sysMsgQueue->queueSize) pos = 0;
 	*msg = sysMsgQueue->messages[pos].msg;
 
-          /* Translate message; return FALSE immediately on SYSQ_MSG_ABANDON */
+          /* Translate message */
 
         if ((msg->message >= WM_MOUSEFIRST) && (msg->message <= WM_MOUSELAST))
         {
-            if ((status = MSG_TranslateMouseMsg(msg,remove)) == SYSQ_MSG_ABANDON)
-                return FALSE;
+            status = MSG_TranslateMouseMsg(hwnd, filter, msg, remove);
+	    kbd_msg = 0;
         }
         else if ((msg->message >= WM_KEYFIRST) && (msg->message <= WM_KEYLAST))
         {
-            if ((status = MSG_TranslateKeyboardMsg(msg,remove)) == SYSQ_MSG_ABANDON)
-                return FALSE;
+            status = MSG_TranslateKbdMsg(hwnd, filter, msg, remove);
+	    kbd_msg = 1;
         }
-        else  /* Non-standard hardware event */
+        else /* Non-standard hardware event */
         {
             HARDWAREHOOKSTRUCT16 *hook;
             if ((hook = SEGPTR_NEW(HARDWAREHOOKSTRUCT16)))
@@ -418,56 +454,55 @@
                                         remove ? HC_ACTION : HC_NOREMOVE,
                                         0, (LPARAM)SEGPTR_GET(hook) );
                 SEGPTR_FREE(hook);
-                status = ret ? SYSQ_MSG_SKIP : SYSQ_MSG_ACCEPT;
+                if (ret) 
+		{
+		    QUEUE_RemoveMsg( sysMsgQueue, pos );
+		    continue;
+		}
+		status = SYSQ_MSG_ACCEPT; 
             }
         }
 
-        if (status == SYSQ_MSG_SKIP)
-        {
-            if (remove) QUEUE_RemoveMsg( sysMsgQueue, pos );
-            /* FIXME: call CBT_CLICKSKIPPED from here */
-            continue;
-        }
+	switch (LOWORD(status))
+	{
+	   case SYSQ_MSG_ACCEPT:
+		break;
 
-          /* Check message against filters */
+	   case SYSQ_MSG_SKIP:
+                if (HOOK_IsHooked( WH_CBT ))
+                   if( kbd_msg )
+		       HOOK_CallHooks16( WH_CBT, HCBT_KEYSKIPPED, 
+						 msg->wParam, msg->lParam );
+		   else
+		   {
+                       MOUSEHOOKSTRUCT16 *hook = SEGPTR_NEW(MOUSEHOOKSTRUCT16);
+                       if (hook)
+                       {
+                           hook->pt           = msg->pt;
+                           hook->hwnd         = msg->hwnd;
+                           hook->wHitTestCode = HIWORD(status);
+                           hook->dwExtraInfo  = 0;
+                           HOOK_CallHooks16( WH_CBT, HCBT_CLICKSKIPPED ,msg->message,
+                                          (LPARAM)SEGPTR_GET(hook) );
+                           SEGPTR_FREE(hook);
+                       }
+                   }
 
-        if (hwnd && (msg->hwnd != hwnd)) continue;
-        if ((first || last) && 
-            ((msg->message < first) || (msg->message > last))) continue;
+		if (remove)
+		    QUEUE_RemoveMsg( sysMsgQueue, pos );
+		/* continue */
+
+	   case SYSQ_MSG_CONTINUE:
+		continue;
+
+	   case SYSQ_MSG_ABANDON: 
+		return FALSE;
+	}
+
         if (remove)
         {
-            if (HOOK_IsHooked( WH_JOURNALRECORD ))
-                MSG_JournalRecordMsg( msg );
+            if (HOOK_IsHooked( WH_JOURNALRECORD )) MSG_JournalRecordMsg( msg );
             QUEUE_RemoveMsg( sysMsgQueue, pos );
-            
-            /* call CBT hook _after_ message removed from queue */
-	    if (HOOK_IsHooked( WH_CBT ))
-	    {
-	    	if (((msg->message >= WM_MOUSEFIRST) &&
-                     (msg->message <= WM_MOUSELAST)) ||
-	    	    ((msg->message >= WM_NCMOUSEFIRST) &&
-                     (msg->message <= WM_NCMOUSELAST)))
-	    	{
-                    MOUSEHOOKSTRUCT16 *hook = SEGPTR_NEW(MOUSEHOOKSTRUCT16);
-                    if (hook)
-                    {
-	    	  	hook->pt           = msg->pt;
-			hook->hwnd         = msg->hwnd;
-			hook->wHitTestCode = (INT16)SendMessage16( msg->hwnd,
-                                            WM_NCHITTEST, 0,
-                                            MAKELONG( msg->pt.x, msg->pt.y ) );
-			hook->dwExtraInfo  = 0;
-			HOOK_CallHooks16( WH_CBT, HCBT_CLICKSKIPPED ,msg->message, 
-                                          (LPARAM)SEGPTR_GET(hook) );
-			SEGPTR_FREE(hook);
-                    }
-                }
-                else 
-                    if ((msg->message >= WM_KEYFIRST) &&
-                        (msg->message <= WM_KEYLAST))
-		   	HOOK_CallHooks16( WH_CBT, HCBT_KEYSKIPPED,
-                                          msg->wParam, msg->lParam );
-            }
         }
         return TRUE;
     }
@@ -692,7 +727,7 @@
         /* Now find a hardware event */
 
         if (((msgQueue->wakeBits & mask) & (QS_MOUSE | QS_KEY)) &&
-            MSG_PeekHardwareMsg( msg, hwnd, first, last, flags & PM_REMOVE ))
+            MSG_PeekHardwareMsg( msg, hwnd, MAKELONG(first,last), flags & PM_REMOVE ))
         {
             /* Got one */
 	    msgQueue->GetMessageTimeVal      = msg->time;
diff --git a/windows/msgbox.c b/windows/msgbox.c
index 9708381..40d9344 100644
--- a/windows/msgbox.c
+++ b/windows/msgbox.c
@@ -2,11 +2,10 @@
  * Message boxes
  *
  * Copyright 1995 Bernd Schmidt
- *
  */
 
+#define NO_TRANSITION_TYPES  /* This file is Win32-clean */
 #include <stdio.h>
-#include <malloc.h>
 #include "windows.h"
 #include "dlgs.h"
 #include "heap.h"
@@ -15,19 +14,27 @@
 #include "resource.h"
 #include "task.h"
 
-typedef struct {
-  LPCSTR title;
-  LPCSTR text;
-  WORD  type;
+typedef struct
+{
+    LPCSTR title;
+    LPCSTR text;
+    UINT32 type;
 } MSGBOX, *LPMSGBOX;
 
-LRESULT SystemMessageBoxProc(HWND hwnd,UINT message,WPARAM16 wParam,LPARAM lParam)
+
+/**************************************************************************
+ *           MSGBOX_DlgProc
+ *
+ * Dialog procedure for message boxes.
+ */
+static LRESULT MSGBOX_DlgProc( HWND32 hwnd, UINT32 message,
+                               WPARAM32 wParam, LPARAM lParam )
 {
   LPMSGBOX lpmb;
-  RECT16 rect, textrect;
-  HWND hItem;
+  RECT32 rect, textrect;
+  HWND32 hItem;
   HDC32 hdc;
-  LONG lRet;
+  LRESULT lRet;
   int i, buttons, bwidth, bheight, theight, wwidth, bpos;
   int borheight, iheight, tiheight;
   
@@ -86,21 +93,21 @@
     }
     
     /* Position everything */
-    GetWindowRect16(hwnd, &rect);
+    GetWindowRect32(hwnd, &rect);
     borheight = rect.bottom - rect.top;
     wwidth = rect.right - rect.left;
-    GetClientRect16(hwnd, &rect);
+    GetClientRect32(hwnd, &rect);
     borheight -= rect.bottom - rect.top;
 
     /* Get the icon height */
-    GetWindowRect16(GetDlgItem(hwnd, 1088), &rect);
+    GetWindowRect32(GetDlgItem(hwnd, 1088), &rect);
     iheight = rect.bottom - rect.top;
     
     /* Get the number of visible buttons and their width */
-    GetWindowRect16(GetDlgItem(hwnd, 2), &rect);
+    GetWindowRect32(GetDlgItem(hwnd, 2), &rect);
     bheight = rect.bottom - rect.top;
     bwidth = rect.left;
-    GetWindowRect16(GetDlgItem(hwnd, 1), &rect);
+    GetWindowRect32(GetDlgItem(hwnd, 1), &rect);
     bwidth -= rect.left;
     for (buttons = 0, i = 1; i < 8; i++)
     {
@@ -110,13 +117,13 @@
     
     /* Get the text size */
     hItem = GetDlgItem(hwnd, 100);
-    GetWindowRect16(hItem, &textrect);
-    MapWindowPoints16(0, hwnd, (LPPOINT16)&textrect, 2);
+    GetWindowRect32(hItem, &textrect);
+    MapWindowPoints32(0, hwnd, (LPPOINT32)&textrect, 2);
     
-    GetClientRect16(hItem, &rect);
+    GetClientRect32(hItem, &rect);
     hdc = GetDC32(hItem);
-    lRet = DrawText16( hdc, lpmb->text, -1, &rect,
-                       DT_LEFT | DT_EXPANDTABS | DT_WORDBREAK | DT_CALCRECT);
+    lRet = DrawText32A( hdc, lpmb->text, -1, &rect,
+                        DT_LEFT | DT_EXPANDTABS | DT_WORDBREAK | DT_CALCRECT);
     theight = rect.bottom  - rect.top;
     tiheight = 16 + MAX(iheight, theight);
     ReleaseDC32(hItem, hdc);
@@ -128,8 +135,8 @@
     
     /* Position the icon */
     hItem = GetDlgItem(hwnd, 1088);
-    GetWindowRect16(hItem, &rect);
-    MapWindowPoints16(0, hwnd, (LPPOINT16)&rect, 2);
+    GetWindowRect32(hItem, &rect);
+    MapWindowPoints32(0, hwnd, (LPPOINT32)&rect, 2);
     SetWindowPos(hItem, 0, rect.left, (tiheight - iheight) / 2, 0, 0,
 		 SWP_NOSIZE | SWP_NOZORDER | SWP_NOACTIVATE | SWP_NOREDRAW);
     
@@ -139,7 +146,7 @@
     
     /* Position the buttons */
     bpos = (wwidth - bwidth * buttons) / 2;
-    GetWindowRect16(GetDlgItem(hwnd, 1), &rect);
+    GetWindowRect32(GetDlgItem(hwnd, 1), &rect);
     for (buttons = i = 0; i < 7; i++) {
       /* some arithmetic to get the right order for YesNoCancel windows */
       hItem = GetDlgItem(hwnd, (i + 5) % 7 + 1);
@@ -157,7 +164,8 @@
     break;
     
    case WM_COMMAND:
-    switch (wParam) {
+    switch (wParam)
+    {
      case IDOK:
      case IDCANCEL:
      case IDABORT:
@@ -173,6 +181,7 @@
   return 0;
 }
 
+
 /**************************************************************************
  *           MessageBox16   (USER.1)
  */
@@ -181,61 +190,60 @@
     return MessageBox32A( hwnd, text, title, type );
 }
 
+
 /**************************************************************************
  *           MessageBox32A   (USER32.390)
  */
 INT32 MessageBox32A( HWND32 hWnd, LPCSTR text, LPCSTR title, UINT32 type )
 {
-    HANDLE16 handle;
     MSGBOX mbox;
-    int ret;
-
     mbox.title = title;
     mbox.text  = text;
     mbox.type  = type;
-
-    handle = SYSRES_LoadResource( SYSRES_DIALOG_MSGBOX );
-    if (!handle) return 0;
-    ret = DialogBoxIndirectParam16( WIN_GetWindowInstance(hWnd),
-                                  handle, hWnd,
-                                  MODULE_GetWndProcEntry16("SystemMessageBoxProc"),
-                                  (LONG)&mbox );
-    SYSRES_FreeResource( handle );
-    return ret;
+    return DialogBoxIndirectParam32A( WIN_GetWindowInstance(hWnd),
+                                      SYSRES_GetResPtr( SYSRES_DIALOG_MSGBOX ),
+                                      hWnd, MSGBOX_DlgProc, (LPARAM)&mbox );
 }
 
+
 /**************************************************************************
  *           MessageBox32W   (USER32.395)
  */
-INT32 MessageBox32W( HWND32 hWnd, LPCWSTR text, LPCWSTR title, UINT32 type )
+INT32 MessageBox32W( HWND32 hwnd, LPCWSTR text, LPCWSTR title, UINT32 type )
 {
-    HANDLE16 handle;
-    MSGBOX mbox;
-    int ret;
-
-    mbox.title = HEAP_strdupWtoA( GetProcessHeap(), 0, title );
-    mbox.text  = HEAP_strdupWtoA( GetProcessHeap(), 0, text );
-    mbox.type  = type;
-
-    fprintf(stderr,"MessageBox(%s,%s)\n",mbox.text,mbox.title);
-    handle = SYSRES_LoadResource( SYSRES_DIALOG_MSGBOX );
-    if (!handle) return 0;
-    ret = DialogBoxIndirectParam16( WIN_GetWindowInstance(hWnd),
-                                  handle, hWnd,
-                                  MODULE_GetWndProcEntry16("SystemMessageBoxProc"),
-                                  (LONG)&mbox );
-    SYSRES_FreeResource( handle );
-    HeapFree( GetProcessHeap(), 0, mbox.title );
-    HeapFree( GetProcessHeap(), 0, mbox.text );
+    LPSTR titleA = HEAP_strdupWtoA( GetProcessHeap(), 0, title );
+    LPSTR textA  = HEAP_strdupWtoA( GetProcessHeap(), 0, text );
+    INT32 ret = MessageBox32A( hwnd, textA, titleA, type );
+    HeapFree( GetProcessHeap(), 0, titleA );
+    HeapFree( GetProcessHeap(), 0, textA );
     return ret;
 }
 
-/**************************************************************************
- *			FatalAppExit  [USER.137]
- */
 
-void FatalAppExit(UINT fuAction, LPCSTR str)
+/**************************************************************************
+ *           FatalAppExit16   (KERNEL.137)
+ */
+void FatalAppExit16( UINT16 action, LPCSTR str )
 {
-  MessageBox16(0, str, NULL, MB_SYSTEMMODAL | MB_OK);
-  TASK_KillCurrentTask(0);
+    FatalAppExit32A( action, str );
+}
+
+
+/**************************************************************************
+ *           FatalAppExit32A   (KERNEL32.108)
+ */
+void FatalAppExit32A( UINT32 action, LPCSTR str )
+{
+    MessageBox32A( 0, str, NULL, MB_SYSTEMMODAL | MB_OK );
+    TASK_KillCurrentTask(0);
+}
+
+
+/**************************************************************************
+ *           FatalAppExit32W   (KERNEL32.109)
+ */
+void FatalAppExit32W( UINT32 action, LPCWSTR str )
+{
+    MessageBox32W( 0, str, NULL, MB_SYSTEMMODAL | MB_OK );
+    TASK_KillCurrentTask(0);
 }
diff --git a/windows/nonclient.c b/windows/nonclient.c
index 4c6a2d5..20e2c6f 100644
--- a/windows/nonclient.c
+++ b/windows/nonclient.c
@@ -433,7 +433,7 @@
 /***********************************************************************
  *           NC_DrawSysButton
  */
-void NC_DrawSysButton( HWND hwnd, HDC16 hdc, BOOL down )
+void NC_DrawSysButton( HWND hwnd, HDC16 hdc, BOOL32 down )
 {
     RECT16 rect;
     HDC32 hdcMem;
@@ -844,17 +844,24 @@
 /***********************************************************************
  *           NC_GetSysPopupPos
  */
-BOOL NC_GetSysPopupPos( WND* wndPtr, RECT16* rect )
+BOOL32 NC_GetSysPopupPos( WND* wndPtr, RECT16* rect )
 {
-  if( !wndPtr->hSysMenu ) return FALSE;
-
-  NC_GetInsideRect( wndPtr->hwndSelf, rect );
-  OffsetRect16( rect, wndPtr->rectWindow.left, wndPtr->rectWindow.top );
-  if (wndPtr->dwStyle & WS_CHILD)
-     ClientToScreen16( wndPtr->parent->hwndSelf, (POINT16 *)rect );
-  rect->right = rect->left + SYSMETRICS_CXSIZE;
-  rect->bottom = rect->top + SYSMETRICS_CYSIZE;
-  return TRUE;
+  if( wndPtr->hSysMenu )
+  {
+      if( wndPtr->dwStyle & WS_MINIMIZE )
+	  GetWindowRect16( wndPtr->hwndSelf, rect );
+      else
+      {
+  	  NC_GetInsideRect( wndPtr->hwndSelf, rect );
+  	  OffsetRect16( rect, wndPtr->rectWindow.left, wndPtr->rectWindow.top );
+  	  if (wndPtr->dwStyle & WS_CHILD)
+     	      ClientToScreen16( wndPtr->parent->hwndSelf, (POINT16 *)rect );
+          rect->right = rect->left + SYSMETRICS_CXSIZE;
+          rect->bottom = rect->top + SYSMETRICS_CYSIZE;
+      }
+      return TRUE;
+  }
+  return FALSE;
 }
 
 /***********************************************************************
@@ -862,29 +869,53 @@
  *
  * Track a mouse button press on the system menu.
  */
-static void NC_TrackSysMenu( HWND hwnd, HDC16 hdc, POINT16 pt )
+static void NC_TrackSysMenu( HWND hwnd, POINT16 pt )
 {
-    RECT16 rect;
-    WND *wndPtr = WIN_FindWndPtr( hwnd );
-    int iconic = wndPtr->dwStyle & WS_MINIMIZE;
-    HMENU16 hmenu;
+    WND*	wndPtr = WIN_FindWndPtr( hwnd );
     
-    if (!(wndPtr->dwStyle & WS_SYSMENU)) return;
-
-    /* If window has a menu, track the menu bar normally if it not minimized */
-    if (HAS_MENU(wndPtr) && !iconic) MENU_TrackMouseMenuBar( hwnd, pt );
-    else
+    if (wndPtr->dwStyle & WS_SYSMENU)
     {
-	  /* Otherwise track the system menu like a normal popup menu */
+	int	iconic, on = 1;
 
-	NC_GetSysPopupPos( wndPtr, &rect );
-	if (!iconic) NC_DrawSysButton( hwnd, hdc, TRUE );
-	hmenu = GetSystemMenu(hwnd, 0);
-	MENU_InitSysMenuPopup(hmenu, wndPtr->dwStyle,
-				    wndPtr->class->style);
-	TrackPopupMenu16( hmenu, TPM_LEFTALIGN | TPM_LEFTBUTTON,
-                          rect.left, rect.bottom, 0, hwnd, &rect );
-	if (!iconic) NC_DrawSysButton( hwnd, hdc, FALSE );
+	iconic = wndPtr->dwStyle & WS_MINIMIZE;
+
+	if( !iconic ) 
+	{
+	     HDC16	hdc = GetWindowDC32(hwnd);
+	     RECT16	rect, rTrack;
+	     BOOL32 	bNew, bTrack = TRUE;
+	     MSG16	msg;
+	    
+	     NC_GetSysPopupPos( wndPtr, &rect );
+	     rTrack = rect;
+	     MapWindowPoints16( 0, hwnd, (LPPOINT16)&rTrack, 2 );
+
+	     /* track mouse while waiting for WM_LBUTTONUP */
+
+	     NC_DrawSysButton( hwnd, hdc, bTrack );
+	     SetCapture32(hwnd);
+	     do
+	     {
+		msg.message = WM_NULL;
+		PeekMessage16( &msg, 0, WM_MOUSEFIRST, WM_MOUSELAST, PM_REMOVE);
+		if( msg.message == WM_MOUSEMOVE )
+		{
+		    if( (bNew = PtInRect16(&rTrack, MAKEPOINT16(msg.lParam))) )
+		    {   if( bTrack ) continue; }
+		    else 
+		    {   if(!bTrack ) continue; }
+		    NC_DrawSysButton( hwnd, hdc, bTrack = bNew);
+		}
+	     } while( msg.message != WM_LBUTTONUP );
+
+	     ReleaseCapture();
+	     ReleaseDC32(hwnd, hdc);
+	     on = PtInRect16(&rTrack, MAKEPOINT16(msg.lParam));
+	} 
+
+	if( on ) 
+	    SendMessage16( hwnd, WM_SYSCOMMAND, 
+			   SC_MOUSEMENU + HTSYSMENU, *((LPARAM*)&pt));
     }
 }
 
@@ -1170,7 +1201,7 @@
 
     if (!moved && (wndPtr->dwStyle & WS_MINIMIZE))
     {
-        NC_TrackSysMenu( hwnd, hdc, pt );
+        NC_TrackSysMenu( hwnd, pt );
         return;
     }
 
@@ -1293,8 +1324,6 @@
  */
 LONG NC_HandleNCLButtonDown( HWND32 hwnd, WPARAM16 wParam, LPARAM lParam )
 {
-    HDC32 hdc;
-
     switch(wParam)  /* Hit test */
     {
     case HTCAPTION:
@@ -1302,9 +1331,7 @@
 	break;
 
     case HTSYSMENU:
-        hdc = GetWindowDC32( hwnd );
-	NC_TrackSysMenu( hwnd, hdc, MAKEPOINT16(lParam) );
-        ReleaseDC32( hwnd, hdc );
+        NC_TrackSysMenu( hwnd, MAKEPOINT16(lParam) );
 	break;
 
     case HTMENU:
@@ -1413,10 +1440,6 @@
 	ShowWindow( hwnd, SW_RESTORE );
 	break;
 
-    case SC_NEXTWINDOW:
-    case SC_PREVWINDOW:
-	break;
-
     case SC_CLOSE:
 	return SendMessage16( hwnd, WM_CLOSE, 0, 0 );
 
@@ -1427,30 +1450,31 @@
 	break;
 
     case SC_MOUSEMENU:
-	MENU_TrackMouseMenuBar( hwnd, pt );
+        MENU_TrackMouseMenuBar( wndPtr, wParam & 0x000F, pt );
 	break;
 
     case SC_KEYMENU:
 	MENU_TrackKbdMenuBar( wndPtr , wParam , pt.x );
 	break;
 	
-    case SC_ARRANGE:
-	break;
-
     case SC_TASKLIST:
-	WinExec( "taskman.exe", SW_SHOWNORMAL ); 
-	break;
-
-    case SC_HOTKEY:
+	WinExec32( "taskman.exe", SW_SHOWNORMAL ); 
 	break;
 
     case SC_SCREENSAVE:
 	if (wParam == SC_ABOUTWINE)
 	{   
-	  extern const char people[];
-	  ShellAbout(hwnd,"WINE",people,0);
+            extern const char people[];
+            ShellAbout32A(hwnd,"Wine",people,0);
         }
 	break;
+  
+    case SC_HOTKEY:
+    case SC_ARRANGE:
+    case SC_NEXTWINDOW:
+    case SC_PREVWINDOW:
+ 	/* FIXME: unimplemented */
+        break;
     }
     return 0;
 }
diff --git a/windows/painting.c b/windows/painting.c
index e3dfda3..42dacc6 100644
--- a/windows/painting.c
+++ b/windows/painting.c
@@ -491,9 +491,18 @@
 
 
 /***********************************************************************
- *           InvalidateRgn   (USER.126) (USER32.328)
+ *           InvalidateRgn16   (USER.126)
  */
-void InvalidateRgn( HWND32 hwnd, HRGN32 hrgn, BOOL32 erase )
+void InvalidateRgn16( HWND16 hwnd, HRGN16 hrgn, BOOL16 erase )
+{
+    RedrawWindow32(hwnd, NULL, hrgn, RDW_INVALIDATE | (erase ? RDW_ERASE : 0) );
+}
+
+
+/***********************************************************************
+ *           InvalidateRgn32   (USER32.328)
+ */
+void InvalidateRgn32( HWND32 hwnd, HRGN32 hrgn, BOOL32 erase )
 {
     RedrawWindow32(hwnd, NULL, hrgn, RDW_INVALIDATE | (erase ? RDW_ERASE : 0) );
 }
@@ -518,9 +527,18 @@
 
 
 /***********************************************************************
- *           ValidateRgn   (USER.128) (USER32.571)
+ *           ValidateRgn16   (USER.128)
  */
-void ValidateRgn( HWND32 hwnd, HRGN32 hrgn )
+void ValidateRgn16( HWND16 hwnd, HRGN16 hrgn )
+{
+    RedrawWindow32( hwnd, NULL, hrgn, RDW_VALIDATE | RDW_NOCHILDREN );
+}
+
+
+/***********************************************************************
+ *           ValidateRgn32   (USER32.571)
+ */
+void ValidateRgn32( HWND32 hwnd, HRGN32 hrgn )
 {
     RedrawWindow32( hwnd, NULL, hrgn, RDW_VALIDATE | RDW_NOCHILDREN );
 }
diff --git a/windows/scroll.c b/windows/scroll.c
index b416537..8689f90 100644
--- a/windows/scroll.c
+++ b/windows/scroll.c
@@ -9,21 +9,21 @@
 
 #define NO_TRANSITION_TYPES  /* This file is Win32-clean */
 #include <stdlib.h>
-#include "wintypes.h"
+#include "windows.h"
 #include "class.h"
 #include "win.h"
 #include "gdi.h"
+#include "dce.h"
 #include "region.h"
+#include "graphics.h"
 #include "sysmetrics.h"
 #include "stddebug.h"
 #include "debug.h"
 
 extern HWND32 CARET_GetHwnd();			/* windows/caret.c */
+extern void   CARET_GetRect(LPRECT32);
 extern void CLIPPING_UpdateGCRegion(DC* );	/* objects/clipping.c */
 
-static int RgnType;
-
-
 /*************************************************************************
  *             ScrollWindow16   (USER.61)
  */
@@ -38,7 +38,6 @@
                     clipRect ? &clipRect32 : NULL );
 }
 
-
 /*************************************************************************
  *             ScrollWindow32   (USER32.449)
  */
@@ -109,7 +108,14 @@
 			    RDW_INVALIDATE | RDW_ERASE | RDW_ERASENOW, RDW_C_USEHRGN );
 
     DeleteObject32( hrgnUpdate );
-    if( hCaretWnd ) ShowCaret(hCaretWnd);
+    if( hCaretWnd ) 
+    {
+	POINT32	pt;
+	GetCaretPos32(&pt);
+	pt.x += dx; pt.y += dy;
+	SetCaretPos(pt.x, pt.y);
+	ShowCaret(hCaretWnd);
+    }
     return TRUE;
 }
 
@@ -134,44 +140,72 @@
 
 /*************************************************************************
  *             ScrollDC32   (USER32.448)
+ * 
+ * Both 'rc' and 'rLClip' are in logical units but update info is 
+ * returned in device coordinates.
  */
 BOOL32 ScrollDC32( HDC32 hdc, INT32 dx, INT32 dy, const RECT32 *rc,
-                   const RECT32 *cliprc, HRGN32 hrgnUpdate, LPRECT32 rcUpdate )
+                   const RECT32 *prLClip, HRGN32 hrgnUpdate, LPRECT32 rcUpdate )
 {
+    RECT32 rDClip, rLClip;
     HRGN32 hrgnClip = 0;
     HRGN32 hrgnScrollClip = 0;
-    RECT32 rectClip;
     POINT32 src, dest;
-    INT32 width, height;
+    INT32  ldx, ldy;
     DC *dc = (DC *)GDI_GetObjPtr(hdc, DC_MAGIC);
 
-    dprintf_scroll(stddeb,"ScrollDC: dx=%d dy=%d, hrgnUpdate=%04x rcUpdate = %p cliprc = %p, rc=%d %d %d %d\n",
-                   dx, dy, hrgnUpdate, rcUpdate, cliprc, rc ? rc->left : 0,
-                   rc ? rc->top : 0, rc ? rc->right : 0, rc ? rc->bottom : 0 );
+    dprintf_scroll(stddeb,"ScrollDC: %04x %d,%d hrgnUpdate=%04x rcUpdate = %p cliprc = (%d,%d-%d,%d), rc=(%d,%d-%d,%d)\n",
+                   (HDC16)hdc, dx, dy, hrgnUpdate, rcUpdate, 
+		   prLClip ? prLClip->left : 0, prLClip ? prLClip->top : 0, prLClip ? prLClip->right : 0, prLClip ? prLClip->bottom : 0,
+		   rc ? rc->left : 0, rc ? rc->top : 0, rc ? rc->right : 0, rc ? rc->bottom : 0 );
 
     if ( !dc || !hdc ) return FALSE;
 
-    /* set clipping region */
+/*
+    printf(stddeb,"\t[wndOrgX=%i, wndExtX=%i, vportOrgX=%i, vportExtX=%i]\n",
+		  dc->wndOrgX, dc->wndExtX, dc->vportOrgX, dc->vportExtX );
+    printf(stddeb,"\t[wndOrgY=%i, wndExtY=%i, vportOrgY=%i, vportExtY=%i]\n",
+                  dc->wndOrgY, dc->wndExtY, dc->vportOrgY, dc->vportExtY );
+*/
 
-    if ( !rc ) GetClipBox32( hdc, &rectClip );
-    else rectClip = *rc;
+    /* compute device clipping region */
 
-    if (cliprc)
-	IntersectRect32(&rectClip,&rectClip,cliprc);
+    if ( rc )
+    {
+	rLClip = *rc;
+	rDClip.left = XLPTODP(dc, rc->left); rDClip.right = XLPTODP(dc, rc->right);
+	rDClip.top = YLPTODP(dc, rc->top); rDClip.bottom = YLPTODP(dc, rc->bottom);
+    }
+    else /* maybe we should just return FALSE? */
+    {
+	GetClipBox32( hdc, &rDClip );
+	rLClip.left = XDPTOLP(dc, rDClip.left); rLClip.right = XDPTOLP(dc, rDClip.right);
+	rLClip.top = YDPTOLP(dc, rDClip.top); rLClip.bottom = YDPTOLP(dc, rDClip.bottom);
+    }
 
-    if( rectClip.left >= rectClip.right || rectClip.top >= rectClip.bottom )
+    if (prLClip)
+    {
+	RECT32 r;
+
+	r.left = XLPTODP(dc, prLClip->left); r.right = XLPTODP(dc, prLClip->right);
+	r.top = YLPTODP(dc, prLClip->top); r.bottom = YLPTODP(dc, prLClip->bottom);
+	IntersectRect32(&rLClip,&rLClip,prLClip);
+	IntersectRect32(&rDClip,&rDClip,&r);
+    }
+
+    if( rDClip.left >= rDClip.right || rDClip.top >= rDClip.bottom )
 	return FALSE;
     
     hrgnClip = GetClipRgn16(hdc);
-    hrgnScrollClip = CreateRectRgnIndirect32(&rectClip);
+    hrgnScrollClip = CreateRectRgnIndirect32(&rDClip);
 
     if( hrgnClip )
       {
-        /* save a copy and change cliprgn directly */
+        /* change device clipping region directly */
 
         CombineRgn32( hrgnScrollClip, hrgnClip, 0, RGN_COPY );
-        SetRectRgn( hrgnClip, rectClip.left, rectClip.top,
-                    rectClip.right, rectClip.bottom );
+        SetRectRgn( hrgnClip, rDClip.left, rDClip.top,
+			      rDClip.right, rDClip.bottom );
 
 	CLIPPING_UpdateGCRegion( dc );
       }
@@ -180,80 +214,80 @@
 
     /* translate coordinates */
 
-    if (dx > 0)
-    {
-	src.x = XDPTOLP(dc, rectClip.left);
-	dest.x = XDPTOLP(dc, rectClip.left + abs(dx));
-    }
-    else
-    {
-	src.x = XDPTOLP(dc, rectClip.left + abs(dx));
-	dest.x = XDPTOLP(dc, rectClip.left);
-    }
-    if (dy > 0)
-    {
-	src.y = YDPTOLP(dc, rectClip.top);
-	dest.y = YDPTOLP(dc, rectClip.top + abs(dy));
-    }
-    else
-    {
-	src.y = YDPTOLP(dc, rectClip.top + abs(dy));
-	dest.y = YDPTOLP(dc, rectClip.top);
-    }
+    ldx = dx * dc->wndExtX / dc->vportExtX;
+    ldy = dy * dc->wndExtY / dc->vportExtY;
 
-    width = rectClip.right - rectClip.left - abs(dx);
-    height = rectClip.bottom - rectClip.top - abs(dy);
+    if (dx > 0)
+	dest.x = (src.x = rLClip.left) + ldx;
+    else
+	src.x = (dest.x = rLClip.left) - ldx;
+
+    if (dy > 0)
+	dest.y = (src.y = rLClip.top) + ldy;
+    else
+	src.y = (dest.y = rLClip.top) - ldy;
 
     /* copy bits */
 
-    if (!BitBlt32( hdc, dest.x, dest.y, width, height, hdc, src.x, src.y, 
-                   SRCCOPY))
-	return FALSE;
+    if( rDClip.right - rDClip.left > dx &&
+	rDClip.bottom - rDClip.top > dy )
+    {
+	ldx = rLClip.right - rLClip.left - ldx;
+	ldy = rLClip.bottom - rLClip.top - ldy;
+
+	if (!BitBlt32( hdc, dest.x, dest.y, ldx, ldy,
+		       hdc, src.x, src.y, SRCCOPY))
+	    return FALSE;
+    }
+
+    /* restore clipping region */
+
+    if( hrgnClip )
+    {
+	CombineRgn32( hrgnClip, hrgnScrollClip, 0, RGN_COPY );
+	CLIPPING_UpdateGCRegion( dc );
+	SetRectRgn( hrgnScrollClip, rDClip.left, rDClip.top, 
+				    rDClip.right, rDClip.bottom );
+    }
+    else
+        SelectClipRgn32( hdc, 0 );
 
     /* compute update areas */
 
     if (hrgnUpdate || rcUpdate)
     {
-	HRGN32 hrgn1 = (hrgnUpdate) ? hrgnUpdate : CreateRectRgn32( 0,0,0,0 );
+	HRGN32 hrgn = (hrgnUpdate) ? hrgnUpdate : CreateRectRgn32( 0,0,0,0 );
 
 	if( dc->w.hVisRgn )
 	{
-	  CombineRgn32( hrgn1, dc->w.hVisRgn, 0, RGN_COPY );
-	  CombineRgn32( hrgn1, hrgn1, hrgnClip ? hrgnClip : hrgnScrollClip,
-                        RGN_AND );
-	  OffsetRgn32( hrgn1, dx, dy );
-	  CombineRgn32( hrgn1, dc->w.hVisRgn, hrgn1, RGN_DIFF );
-	  RgnType = CombineRgn32( hrgn1, hrgn1,
-                                  hrgnClip ? hrgnClip : hrgnScrollClip,
-                                  RGN_AND );
+	  CombineRgn32( hrgn, dc->w.hVisRgn, hrgnScrollClip, RGN_AND );
+	  OffsetRgn32( hrgn, dx, dy );
+	  CombineRgn32( hrgn, dc->w.hVisRgn, hrgn, RGN_DIFF );
+	  CombineRgn32( hrgn, hrgn, hrgnScrollClip, RGN_AND );
 	}
 	else
 	{
 	  RECT32 rect;
 
-          rect = rectClip;				/* vertical band */
+          rect = rDClip;				/* vertical band */
           if (dx > 0) rect.right = rect.left + dx;
           else if (dx < 0) rect.left = rect.right + dx;
           else SetRectEmpty32( &rect );
-          SetRectRgn( hrgn1, rect.left, rect.top, rect.right, rect.bottom );
+          SetRectRgn( hrgn, rect.left, rect.top, rect.right, rect.bottom );
 
-          rect = rectClip;				/* horizontal band */
+          rect = rDClip;				/* horizontal band */
           if (dy > 0) rect.bottom = rect.top + dy;
           else if (dy < 0) rect.top = rect.bottom + dy;
           else SetRectEmpty32( &rect );
 
-          RgnType = REGION_UnionRectWithRgn( hrgn1, &rect );
+          REGION_UnionRectWithRgn( hrgn, &rect );
 	}
 
-	if (rcUpdate) GetRgnBox32( hrgn1, rcUpdate );
-	if (!hrgnUpdate) DeleteObject32( hrgn1 );
+	if (rcUpdate) GetRgnBox32( hrgn, rcUpdate );
+	if (!hrgnUpdate) DeleteObject32( hrgn );
     }
 
-    /* restore clipping region */
-
-    SelectClipRgn32( hdc, hrgnClip ? hrgnScrollClip : 0 );
     DeleteObject32( hrgnScrollClip );     
-
     return TRUE;
 }
 
@@ -272,49 +306,156 @@
     if (clipRect) CONV_RECT16TO32( clipRect, &clipRect32 );
     ret = ScrollWindowEx32( hwnd, dx, dy, rect ? &rect32 : NULL,
                             clipRect ? &clipRect32 : NULL, hrgnUpdate,
-                            &rcUpdate32, flags );
+                            (rcUpdate) ? &rcUpdate32 : NULL, flags );
     if (rcUpdate) CONV_RECT32TO16( &rcUpdate32, rcUpdate );
     return ret;
 }
 
+/*************************************************************************
+ *             SCROLL_FixCaret
+ */
+BOOL32 SCROLL_FixCaret(HWND32 hWnd, LPRECT32 lprc, UINT32 flags)
+{
+   HWND32 hCaret = CARET_GetHwnd();
+
+   if( hCaret )
+   {
+       RECT32	rc;
+       CARET_GetRect( &rc );
+       if( hCaret == hWnd ||
+          (flags & SW_SCROLLCHILDREN && IsChild(hWnd, hCaret)) )
+       {
+           POINT32     pt;
+
+           pt.x = rc.left; pt.y = rc.top;
+           MapWindowPoints32( hCaret, hWnd, (LPPOINT32)&rc, 2 );
+           if( IntersectRect32(lprc, lprc, &rc) )
+           {
+               HideCaret(0);
+  	       lprc->left = pt.x; lprc->top = pt.y;
+	       return TRUE;
+           }
+       }
+   }
+   return FALSE;
+}
 
 /*************************************************************************
  *             ScrollWindowEx32   (USER32.450)
- *
- * FIXME: broken, is there a program that actually uses it?
- *
  */
 INT32 ScrollWindowEx32( HWND32 hwnd, INT32 dx, INT32 dy, const RECT32 *rect,
                         const RECT32 *clipRect, HRGN32 hrgnUpdate,
                         LPRECT32 rcUpdate, UINT32 flags )
 {
-    HDC32 hdc;
+    INT32  retVal = NULLREGION;
+    BOOL32 bCaret = FALSE, bOwnRgn = TRUE;
     RECT32 rc, cliprc;
+    WND*   wnd = WIN_FindWndPtr( hwnd );
 
-    fprintf( stderr, "ScrollWindowEx: not fully implemented\n" );
+    if( !wnd || !WIN_IsWindowDrawable( wnd, TRUE )) return ERROR;
 
-    dprintf_scroll(stddeb,"ScrollWindowEx: dx=%d, dy=%d, wFlags=%04x\n",
-                   dx, dy, flags);
+    if (rect == NULL) GetClientRect32(hwnd, &rc);
+    else rc = *rect;
 
-    hdc = GetDC32(hwnd);
+    if (clipRect) IntersectRect32(&cliprc,&rc,clipRect);
+    else cliprc = rc;
 
-    if (rect == NULL)
-	GetClientRect32(hwnd, &rc);
-    else
-	CopyRect32(&rc, rect);
-    if (clipRect == NULL)
-	GetClientRect32(hwnd, &cliprc);
-    else
-	CopyRect32(&cliprc, clipRect);
-
-    ScrollDC32( hdc, dx, dy, &rc, &cliprc, hrgnUpdate, rcUpdate );
-
-    if (flags | SW_INVALIDATE)
+    if (!IsRectEmpty32(&cliprc) && (dx || dy))
     {
-	PAINT_RedrawWindow( hwnd, NULL, hrgnUpdate, RDW_INVALIDATE | RDW_ERASE |
-                        ((flags & SW_ERASE) ? RDW_ERASENOW : 0), 0 );
-    }
+	DC*	dc;
+	HDC32	hDC;
+	BOOL32  bUpdate = (rcUpdate || hrgnUpdate || flags & (SW_INVALIDATE | SW_ERASE));
+	HRGN32  hrgnClip = CreateRectRgnIndirect32(&cliprc);
 
-    ReleaseDC32(hwnd, hdc);
-    return RgnType;
+dprintf_scroll(stddeb,"ScrollWindowEx: %04x, %d,%d hrgnUpdate=%04x rcUpdate = %p \
+cliprc = (%d,%d-%d,%d), rc=(%d,%d-%d,%d) %04x\n",             
+(HWND16)hwnd, dx, dy, hrgnUpdate, rcUpdate,
+clipRect?clipRect->left:0, clipRect?clipRect->top:0, clipRect?clipRect->right:0, clipRect?clipRect->bottom:0,
+rect?rect->left:0, rect?rect->top:0, rect ?rect->right:0, rect ?rect->bottom:0, (UINT16)flags );
+
+	rc = cliprc;
+	bCaret = SCROLL_FixCaret(hwnd, &rc, flags);
+
+	if( hrgnUpdate ) bOwnRgn = FALSE;
+        else if( bUpdate ) hrgnUpdate = CreateRectRgn32( 0, 0, 0, 0 );
+
+	hDC = GetDCEx32( hwnd, hrgnClip, DCX_CACHE | DCX_USESTYLE | 
+		        (flags & SW_SCROLLCHILDREN) ? DCX_NOCLIPCHILDREN : 0 );
+	if( (dc = (DC *)GDI_GetObjPtr(hDC, DC_MAGIC)) )
+	{
+	    POINT32 dst, src;
+
+	    if( dx > 0 ) dst.x = (src.x = dc->w.DCOrgX + cliprc.left) + dx;
+	    else src.x = (dst.x = dc->w.DCOrgX + cliprc.left) - dx;
+
+	    if( dy > 0 ) dst.y = (src.y = dc->w.DCOrgY + cliprc.top) + dy;
+	    else src.y = (dst.y = dc->w.DCOrgY + cliprc.top) - dy;
+
+	    if( bUpdate )
+  		XSetGraphicsExposures( display, dc->u.x.gc, True );
+	    XSetFunction( display, dc->u.x.gc, GXcopy );
+	    XCopyArea( display, dc->u.x.drawable, dc->u.x.drawable, dc->u.x.gc, 
+		       src.x, src.y, cliprc.right - cliprc.left - abs(dx),
+		       cliprc.bottom - cliprc.top - abs(dy), dst.x, dst.y );
+	    if( bUpdate )
+		XSetGraphicsExposures( display, dc->u.x.gc, False );
+
+	    if( dc->w.hVisRgn && bUpdate )
+	    {
+		CombineRgn32( hrgnUpdate, dc->w.hVisRgn, hrgnClip, RGN_AND );
+		OffsetRgn32( hrgnUpdate, dx, dy );
+		CombineRgn32( hrgnUpdate, dc->w.hVisRgn, hrgnUpdate, RGN_DIFF );
+		CombineRgn32( hrgnUpdate, hrgnUpdate, hrgnClip, RGN_AND );
+
+		if( rcUpdate ) GetRgnBox32( hrgnUpdate, rcUpdate );
+	    }
+	    ReleaseDC32(hwnd, hDC);
+	}
+
+	if( wnd->hrgnUpdate > 1 )
+	{
+	    if( rect || clipRect )
+	    {
+		if( (CombineRgn32( hrgnClip, hrgnClip, 
+				   wnd->hrgnUpdate, RGN_AND ) != NULLREGION) )
+		{
+		    CombineRgn32( wnd->hrgnUpdate, wnd->hrgnUpdate, hrgnClip, RGN_DIFF );
+		    OffsetRgn32( hrgnClip, dx, dy );
+		    CombineRgn32( wnd->hrgnUpdate, wnd->hrgnUpdate, hrgnClip, RGN_OR );
+		}
+	    }
+	    else  
+		OffsetRgn32( wnd->hrgnUpdate, dx, dy );
+	}
+
+	if( flags & SW_SCROLLCHILDREN )
+	{
+	    RECT32	r;
+	    WND* 	w;
+	    for( w = wnd->child; w; w = w->next )
+	    {
+		 CONV_RECT16TO32( &w->rectWindow, &r );
+	         if( IntersectRect32(&r, &r, &cliprc) )
+		     SetWindowPos(w->hwndSelf, 0, w->rectWindow.left + dx,
+				  w->rectWindow.top  + dy, 0,0, SWP_NOZORDER |
+				  SWP_NOSIZE | SWP_NOACTIVATE | SWP_NOREDRAW |
+				  SWP_DEFERERASE );
+	    }
+	}
+
+	if( flags & (SW_INVALIDATE | SW_ERASE) )
+            PAINT_RedrawWindow( hwnd, NULL, hrgnUpdate, RDW_INVALIDATE | RDW_ERASE |
+					((flags & SW_ERASE) ? RDW_ERASENOW : 0), 0 );
+
+	if( bCaret )
+	{
+	    SetCaretPos( rc.left + dx, rc.top + dy );
+	    ShowCaret(0);
+	}
+
+	if( bOwnRgn && hrgnUpdate ) DeleteObject32( hrgnUpdate );
+	DeleteObject32( hrgnClip );
+    }
+    return retVal;
 }
+
diff --git a/windows/winpos.c b/windows/winpos.c
index 3142e14..9061686 100644
--- a/windows/winpos.c
+++ b/windows/winpos.c
@@ -1346,7 +1346,7 @@
      {
 	while( w != wndPtr->owner )
 	{
-	  hwndLocalPrev = w->hwndSelf;
+          if (w != wndPtr) hwndLocalPrev = w->hwndSelf;
 	  if( hwndLocalPrev == hwndInsertAfter ) break;
 	  w = w->next;
 	}
diff --git a/windows/winproc.c b/windows/winproc.c
index 6cbe823..e8946ee 100644
--- a/windows/winproc.c
+++ b/windows/winproc.c
@@ -9,8 +9,7 @@
 #include "windows.h"
 #include "callback.h"
 #include "heap.h"
-#include "ldt.h"
-#include "registers.h"
+#include "selectors.h"
 #include "stackframe.h"
 #include "struct32.h"
 #include "win.h"