diff --git a/ANNOUNCE b/ANNOUNCE
index 9eb3ba9..0d473b4 100644
--- a/ANNOUNCE
+++ b/ANNOUNCE
@@ -1,14 +1,13 @@
-This is release 960928 of Wine, the MS Windows emulator.  This is still a
+This is release 961013 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-960928: (see ChangeLog for details)
-	- Intertask messaging improved.
-	- Many painting fixes.
-	- Still more Win32 support.
+WHAT'S NEW with Wine-961013: (see ChangeLog for details)
+	- Several non Win32-clean data types removed.
+	- Graphics driver for metafiles.
 	- Lots of bug fixes.
 
 See the README file in the distribution for installation instructions.
@@ -17,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-960928.tar.gz
-  ftp://tsx-11.mit.edu/pub/linux/ALPHA/Wine/development/Wine-960928.tar.gz
-  ftp://ftp.infomagic.com/pub/mirrors/linux/wine/development/Wine-960928.tar.gz
-  ftp://aris.com/pub/linux/ALPHA/Wine/development/Wine-960928.tar.gz
+  ftp://sunsite.unc.edu/pub/Linux/ALPHA/wine/development/Wine-961013.tar.gz
+  ftp://tsx-11.mit.edu/pub/linux/ALPHA/Wine/development/Wine-961013.tar.gz
+  ftp://ftp.infomagic.com/pub/mirrors/linux/wine/development/Wine-961013.tar.gz
+  ftp://aris.com/pub/linux/ALPHA/Wine/development/Wine-961013.tar.gz
 
 It should also be available from any site that mirrors tsx-11 or sunsite.
 
diff --git a/ChangeLog b/ChangeLog
index c508615..03051aa 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,4 +1,47 @@
 ----------------------------------------------------------------------
+Sun Oct 13 15:32:32 1996  Alexandre Julliard  <julliard@lrc.epfl.ch>
+
+	* [Make.rules.in] [*/Makefile.in]
+	Made it possible to compile from a directory other than the source
+	directory.
+
+	* [graphics/metafiledrv/init.c] [include/metafiledrv.h]
+	  [objects/metafile.c] [objects/dc.c]
+	New graphics driver for metafiles.
+
+	* [if1632/thunk.c]
+	Added thunks for SetWindowsHook and SetDCHook.
+
+	* [windows/dialog.c]
+	Fixed GetNextDlgGroupItem and GetNextDlgTabItem to skip disabled
+	items.
+
+	* [*/*]
+	Removed non Win32-clean types HANDLE, HBITMAP, HBRUSH, HFONT,
+ 	HINSTANCE, HMENU, HRGN and HTASK.
+
+Wed Oct  9 14:59:45 1996  Frans van Dorsselaer  <dorssel@rulhm1.LeidenUniv.nl>
+
+	* [controls/edit.c]
+	Fixed EditWndProc() to fall back to DefWndProc() when the
+	edit state structure is not available.
+
+Wed Oct  2 14:00:34 1996  Huw D. M. Davies  <h.davies1@physics.oxford.ac.uk>
+
+	* [windows/nonclient.c] [windows/mdi.c]
+	AdjustWindowRectEx16() should only take notice of the styles
+ 	WS_DLGFRAME, WS_BORDER, WS_THICKFRAME and
+ 	WS_EX_DLGMODALFRAME. Thanks to Alex Korobka.
+
+	* [controls/scroll.c]
+	Fixed typo in ShowScrollBar32().
+
+Sun Aug 25 20:18:56 1996  Jukka Iivonen <iivonen@cc.helsinki.fi>
+
+	* [if1632/user32.spec] [if1632/winmm.spec]
+	Added SetParent and sndPlaySoundA.
+	
+----------------------------------------------------------------------
 Fri Sep 27 14:18:42 1996  Alexandre Julliard  <julliard@lrc.epfl.ch>
 
 	* [controls/button.c]
diff --git a/Make.rules.in b/Make.rules.in
index 41c1430..06455e1 100644
--- a/Make.rules.in
+++ b/Make.rules.in
@@ -1,5 +1,14 @@
 # Global rules shared by all makefiles
-# The makefile must define at least TOPSRC and MODULE
+#
+# Each individual makefile should define the following variables:
+# TOPSRCDIR  : top-level source directory
+# TOPOBJDIR  : top-level object directory
+# SRCDIR     : source directory for this module
+# MODULE     : name of the module being built
+# C_SRCS     : C sources for the module
+# GEN_C_SRCS : generated C sources (optional)
+# ASM_SRCS   : assembly sources (optional)
+# EXTRA_OBJS : extra object files (optional)
 
 # First some useful definitions
 
@@ -10,24 +19,24 @@
 OPTIONS   = @OPTIONS@
 X_CFLAGS  = @X_CFLAGS@
 X_LIBS    = @X_LIBS@
-XPM_LIB	  = -lXpm
-XLIB	  = @X_PRE_LIBS@ -lXext -lX11 @X_EXTRA_LIBS@
-WINELIB   = -L$(TOPSRC) -lwine
-LDLIBS	  = @LDLIBS@
+XPM_LIB   = -lXpm
+XLIB      = @X_PRE_LIBS@ -lXext -lX11 @X_EXTRA_LIBS@
+WINELIB   = -L$(TOPOBJDIR) -lwine
+LDLIBS    = @LDLIBS@
 YACC      = @YACC@
 LEX       = @LEX@
 LEXLIB    = @LEXLIB@
-DIVINCL   = -I$(TOPSRC)/include
+DIVINCL   = -I$(TOPSRCDIR)/include -I$(TOPOBJDIR)/include -I.
 ALLCFLAGS = $(CFLAGS) $(DEFS) $(OPTIONS) $(DIVINCL) $(X_CFLAGS)
 LDCOMBINE = ld -r
 RM        = rm -f
-BUILD     = $(TOPSRC)/tools/build
-WINERC    = $(TOPSRC)/rc/winerc
+BUILD     = $(TOPOBJDIR)/tools/build
+WINERC    = $(TOPOBJDIR)/rc/winerc
 SUBMAKE   = $(MAKE) 'CC=$(CC)' 'CFLAGS=$(CFLAGS)' 'OPTIONS=$(OPTIONS)'
 @SET_MAKE@
 
-OBJS = $(C_SRCS:.c=.o) $(ASM_SRCS:.S=.o) $(EXTRA_OBJS)
-
+OBJS = $(C_SRCS:.c=.o) $(GEN_C_SRCS:.c=.o) $(ASM_SRCS:.S=.o) $(EXTRA_OBJS)
+DEPEND_SRCS = $(C_SRCS:%=$(SRCDIR)/%) $(GEN_C_SRCS:%=./%)
 
 # Implicit rules
 
@@ -43,21 +52,21 @@
 	echo "#include \"windows.h\"" >winerctmp.c
 	echo WINDOWS_H_ENDS_HERE >>winerctmp.c
 	cat $< >>winerctmp.c
-	$(CPP) $(OPTIONS) $(DIVINCL) -DRC_INVOKED -P winerctmp.c | sed -e '1,/^WINDOWS_H_ENDS_HERE/d' | $(WINERC) -c -o $* -p $*
+	$(CPP) $(DEFS) $(OPTIONS) $(DIVINCL) -DRC_INVOKED -P winerctmp.c | sed -e '1,/^WINDOWS_H_ENDS_HERE/d' | $(WINERC) -c -o $* -p $*
 	$(RM) winerctmp.c
 
 .rc.h:
 	echo "#include \"windows.h\"" >winerctmp.c
 	echo WINDOWS_H_ENDS_HERE >>winerctmp.c
 	cat $< >>winerctmp.c
-	$(CPP) $(OPTIONS) $(DIVINCL) -DRC_INVOKED -P winerctmp.c | sed -e '1,/^WINDOWS_H_ENDS_HERE/d' | $(WINERC) -c -o $* -p $*
+	$(CPP) $(DEFS) $(OPTIONS) $(DIVINCL) -DRC_INVOKED -P winerctmp.c | sed -e '1,/^WINDOWS_H_ENDS_HERE/d' | $(WINERC) -c -o $* -p $*
 	$(RM) winerctmp.c
 
 
 # Rule to rebuild resource compiler
 
 $(WINERC) check_winerc:
-	cd $(TOPSRC)/rc; $(SUBMAKE) winerc
+	cd $(TOPOBJDIR)/rc; $(SUBMAKE) winerc
 
 
 # Rule for main module
@@ -68,13 +77,13 @@
 
 # Misc. rules
 
-depend:: $(C_SRCS)
+depend:: $(C_SRCS) $(GEN_C_SRCS)
 	sed '/\#\#\# Dependencies/q' < Makefile > tmp_make
-	$(CC) $(ALLCFLAGS) -MM $(C_SRCS) >> tmp_make
+	$(CC) $(ALLCFLAGS) -MM $(DEPEND_SRCS) >> tmp_make
 	mv tmp_make Makefile
 
 clean::
-	$(RM) *.o \#*\# *~ *.bak *.orig *.rej *.flc tmp_make winerctmp.c
+	$(RM) *.o \#*\# *~ *.bak *.orig *.rej *.flc tmp_make winerctmp.c $(GEN_C_SRCS)
 
 dummy:
 
diff --git a/Makefile.in b/Makefile.in
index a50864f..3bfdb34 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -47,6 +47,7 @@
 	controls \
 	files \
 	graphics \
+	graphics/metafiledrv \
 	graphics/x11drv \
 	ipc \
 	loader \
@@ -75,6 +76,7 @@
 	controls/controls.o \
 	files/files.o \
 	graphics/graphics.o \
+	graphics/metafiledrv/metafiledrv.o \
 	graphics/x11drv/x11drv.o \
 	ipc/ipc.o \
 	loader/loader.o \
diff --git a/configure b/configure
index cc2ab47..6d3c83d 100755
--- a/configure
+++ b/configure
@@ -2066,6 +2066,7 @@
 debugger/Makefile
 files/Makefile
 graphics/Makefile
+graphics/metafiledrv/Makefile
 graphics/win16drv/Makefile
 graphics/x11drv/Makefile
 if1632/Makefile
@@ -2144,6 +2145,7 @@
 debugger/Makefile
 files/Makefile
 graphics/Makefile
+graphics/metafiledrv/Makefile
 graphics/win16drv/Makefile
 graphics/x11drv/Makefile
 if1632/Makefile
diff --git a/configure.in b/configure.in
index 0df6d51..e96abcc 100644
--- a/configure.in
+++ b/configure.in
@@ -104,6 +104,7 @@
 debugger/Makefile
 files/Makefile
 graphics/Makefile
+graphics/metafiledrv/Makefile
 graphics/win16drv/Makefile
 graphics/x11drv/Makefile
 if1632/Makefile
diff --git a/controls/Makefile.in b/controls/Makefile.in
index 0b99780..09188b5 100644
--- a/controls/Makefile.in
+++ b/controls/Makefile.in
@@ -1,6 +1,9 @@
-DEFS   = -D__WINE__
-TOPSRC = @top_srcdir@
-MODULE = controls
+DEFS      = -D__WINE__
+TOPSRCDIR = @top_srcdir@
+TOPOBJDIR = ..
+SRCDIR    = @srcdir@
+VPATH     = @srcdir@
+MODULE    = controls
 
 C_SRCS = \
 	button.c \
diff --git a/controls/button.c b/controls/button.c
index d224256..4ccf659 100644
--- a/controls/button.c
+++ b/controls/button.c
@@ -11,7 +11,7 @@
 #include "button.h"
 
 static void PB_Paint( WND *wndPtr, HDC32 hDC, WORD action );
-static void PB_PaintGrayOnGray(HDC32 hDC,HFONT hFont,RECT32 *rc,char *text);
+static void PB_PaintGrayOnGray(HDC32 hDC,HFONT32 hFont,RECT32 *rc,char *text);
 static void CB_Paint( WND *wndPtr, HDC32 hDC, WORD action );
 static void GB_Paint( WND *wndPtr, HDC32 hDC, WORD action );
 static void UB_Paint( WND *wndPtr, HDC32 hDC, WORD action );
@@ -64,7 +64,7 @@
     SendMessage32A( GetParent32((wndPtr)->hwndSelf), WM_CTLCOLORBTN, \
                     (hdc), (wndPtr)->hwndSelf )
 
-static HBITMAP hbitmapCheckBoxes = 0;
+static HBITMAP16 hbitmapCheckBoxes = 0;
 static WORD checkBoxWidth = 0, checkBoxHeight = 0;
 
 
@@ -173,7 +173,7 @@
         return 0;
 
     case WM_SETFONT:
-        infoPtr->hFont = (HFONT) wParam;
+        infoPtr->hFont = (HFONT16)wParam;
         if (lParam) PAINT_BUTTON( wndPtr, style, ODA_DRAWENTIRE );
         break;
 
@@ -253,7 +253,7 @@
 {
     RECT32 rc;
     HPEN16 hOldPen;
-    HBRUSH hOldBrush;
+    HBRUSH16 hOldBrush;
     BUTTONINFO *infoPtr = (BUTTONINFO *)wndPtr->wExtra;
 
     GetClientRect32( wndPtr->hwndSelf, &rc );
@@ -262,7 +262,7 @@
     if (infoPtr->hFont) SelectObject( hDC, infoPtr->hFont );
     BUTTON_SEND_CTLCOLOR( wndPtr, hDC );
     hOldPen = (HPEN16)SelectObject(hDC, sysColorObjects.hpenWindowFrame);
-    hOldBrush = (HBRUSH)SelectObject(hDC, sysColorObjects.hbrushBtnFace);
+    hOldBrush = (HBRUSH16)SelectObject(hDC, sysColorObjects.hbrushBtnFace);
     SetBkMode(hDC, TRANSPARENT);
     Rectangle(hDC, rc.left, rc.top, rc.right, rc.bottom);
     if (action == ODA_DRAWENTIRE)
@@ -334,13 +334,13 @@
  *   using a raster brush to avoid gray text on gray background
  */
 
-void PB_PaintGrayOnGray(HDC32 hDC,HFONT hFont,RECT32 *rc,char *text)
+void PB_PaintGrayOnGray(HDC32 hDC,HFONT32 hFont,RECT32 *rc,char *text)
 {
     static int Pattern[] = {0xAA,0x55,0xAA,0x55,0xAA,0x55,0xAA,0x55};
-    HBITMAP hbm  = CreateBitmap(8, 8, 1, 1, Pattern);
+    HBITMAP16 hbm  = CreateBitmap(8, 8, 1, 1, Pattern);
     HDC hdcMem   = CreateCompatibleDC(hDC);
-    HBITMAP hbmMem;
-    HBRUSH hBr;
+    HBITMAP16 hbmMem;
+    HBRUSH16 hBr;
     RECT32 rect,rc2;
 
     rect=*rc;
@@ -370,7 +370,7 @@
 static void CB_Paint( WND *wndPtr, HDC32 hDC, WORD action )
 {
     RECT16 rc;
-    HBRUSH hBrush;
+    HBRUSH16 hBrush;
     int textlen, delta, x, y;
     TEXTMETRIC16 tm;
     BUTTONINFO *infoPtr = (BUTTONINFO *)wndPtr->wExtra;
@@ -431,12 +431,12 @@
  */
 static void BUTTON_CheckAutoRadioButton( WND *wndPtr )
 {
-    HWND parent, sibling;
+    HWND32 parent, sibling;
     if (!(wndPtr->dwStyle & WS_CHILD)) return;
     parent = wndPtr->parent->hwndSelf;
-    for(sibling = GetNextDlgGroupItem(parent,wndPtr->hwndSelf,FALSE);
+    for(sibling = GetNextDlgGroupItem32( parent, wndPtr->hwndSelf, FALSE );
         sibling != wndPtr->hwndSelf;
-        sibling = GetNextDlgGroupItem(parent,sibling,FALSE))
+        sibling = GetNextDlgGroupItem32( parent, sibling, FALSE ))
 	    SendMessage32A( sibling, BM_SETCHECK32, BUTTON_UNCHECKED, 0 );
 }
 
@@ -479,7 +479,7 @@
 static void UB_Paint( WND *wndPtr, HDC32 hDC, WORD action )
 {
     RECT16 rc;
-    HBRUSH hBrush;
+    HBRUSH16 hBrush;
     BUTTONINFO *infoPtr = (BUTTONINFO *)wndPtr->wExtra;
 
     if (action == ODA_SELECT) return;
diff --git a/controls/combo.c b/controls/combo.c
index 412fb2e..917ab1b 100644
--- a/controls/combo.c
+++ b/controls/combo.c
@@ -42,7 +42,7 @@
 static BOOL CBCheckSize(HWND hwnd);
 static BOOL CBLCheckSize(HWND hwnd);
 
-static HBITMAP hComboBit = 0;
+static HBITMAP16 hComboBit = 0;
 static WORD CBitHeight, CBitWidth;
 
 static int COMBO_Init()
@@ -175,7 +175,7 @@
 				  WS_CHILD | WS_CLIPCHILDREN | WS_VISIBLE | ES_LEFT,
 				  0, 0, rect.right-6-CBitWidth,
 				  lphl->StdItemHeight+2*SYSMETRICS_CYBORDER,
-				  hwnd, (HMENU)ID_EDIT, WIN_GetWindowInstance(hwnd), NULL );
+				  hwnd, (HMENU16)ID_EDIT, WIN_GetWindowInstance(hwnd), NULL );
 				  
   lboxrect.top+=lphc->LBoxTop;
   lphc->hWndLBox = CreateWindow16( className, NULL, style |
@@ -184,7 +184,7 @@
 				lboxrect.left, lboxrect.top,
 				lboxrect.right - lboxrect.left, 
 				lboxrect.bottom - lboxrect.top,
-				hwndp,(HMENU)ID_CLB, WIN_GetWindowInstance(hwnd),
+				hwndp,(HMENU16)ID_CLB, WIN_GetWindowInstance(hwnd),
 				(LPVOID)(HWND32)hwnd );
 
    wndPtr->dwStyle &= ~(WS_VSCROLL | WS_HSCROLL);
@@ -224,8 +224,8 @@
   LPHEADCOMBO lphc = ComboGetStorageHeader(hwnd);
   LPLISTSTRUCT lpls;
   PAINTSTRUCT16  ps;
-  HBRUSH hBrush;
-  HFONT  hOldFont;
+  HBRUSH16 hBrush;
+  HFONT16  hOldFont;
   HDC16 hdc;
   RECT16 rect;
   
@@ -558,7 +558,7 @@
   if (wParam == 0)
     lphl->hFont = GetStockObject(SYSTEM_FONT);
   else
-    lphl->hFont = (HFONT)wParam;
+    lphl->hFont = (HFONT16)wParam;
   if (lphc->hWndEdit)
      SendMessage16(lphc->hWndEdit,WM_SETFONT,lphl->hFont,0); 
   return 0;
@@ -914,8 +914,8 @@
   LPHEADLIST   lphl = CLBoxGetListHeader(hwnd);
   LPLISTSTRUCT lpls;
   PAINTSTRUCT16  ps;
-  HBRUSH       hBrush;
-  HFONT        hOldFont;
+  HBRUSH16 hBrush;
+  HFONT16 hOldFont;
   WND * wndPtr = WIN_FindWndPtr(hwnd);
   HWND  combohwnd = CLBoxGetCombo(hwnd);
   HDC16 hdc;
diff --git a/controls/edit.c b/controls/edit.c
index fb87a79..a5e811e 100644
--- a/controls/edit.c
+++ b/controls/edit.c
@@ -49,7 +49,7 @@
 	UINT TextWidth;		/* width of the widest line in pixels */
 	HLOCAL16 hBuf;
 	char *text;
-	HFONT hFont;
+	HFONT16 hFont;
 	LINEDEF *LineDefs;
 	UINT XOffset;		/* offset of the viewport in pixels */
 	UINT FirstVisibleLine;
@@ -240,6 +240,9 @@
 	LRESULT lResult = 0L;
 	WND *wndPtr = WIN_FindWndPtr(hwnd);
 
+	if ((!EDITSTATEPTR(wndPtr)) && (msg != WM_CREATE))
+		return DefWindowProc16(hwnd, msg, wParam, lParam);
+
 	switch (msg) {
 	case EM_CANUNDO:
 		DPRINTF_EDIT_MSG("EM_CANUNDO");
@@ -504,8 +507,8 @@
 	char *text = EDIT_GetPasswordPointer(wndPtr);
 	int ww = EDIT_GetWndWidth(wndPtr);
 	HDC32 hdc;
-	HFONT hFont;
-	HFONT oldFont = 0;
+	HFONT16 hFont;
+	HFONT16 oldFont = 0;
 	char *start, *cp;
 	int prev, next;
 	int width;
@@ -513,7 +516,7 @@
 	LINE_END ending;
 
 	hdc = GetDC32(wndPtr->hwndSelf);
-	hFont = (HFONT)EDIT_WM_GetFont(wndPtr, 0, 0L);
+	hFont = (HFONT16)EDIT_WM_GetFont(wndPtr, 0, 0L);
 	if (hFont)
 		oldFont = SelectObject(hdc, hFont);
 
@@ -1442,15 +1445,15 @@
 	char *text = EDIT_GetPasswordPointer(wndPtr);
 	INT ret;
 	HDC32 hdc;
-	HFONT hFont;
-	HFONT oldFont = 0;
+	HFONT16 hFont;
+	HFONT16 oldFont = 0;
 	UINT lc = (UINT)EDIT_EM_GetLineCount(wndPtr, 0, 0L);
 	UINT li = (UINT)EDIT_EM_LineIndex(wndPtr, line, 0L);
 	UINT ll = (UINT)EDIT_EM_LineLength(wndPtr, li, 0L);
 	UINT xoff = EDIT_GetXOffset(wndPtr);
 
 	hdc = GetDC32(wndPtr->hwndSelf);
-	hFont = (HFONT)EDIT_WM_GetFont(wndPtr, 0, 0L);
+	hFont = (HFONT16)EDIT_WM_GetFont(wndPtr, 0, 0L);
 	if (hFont)
 		oldFont = SelectObject(hdc, hFont);
 	line = MAX(0, MIN(line, lc - 1));
@@ -2311,12 +2314,12 @@
  */
 static LRESULT EDIT_WM_EraseBkGnd(WND *wndPtr, WPARAM wParam, LPARAM lParam)
 {
-	HBRUSH hBrush;
+	HBRUSH16 hBrush;
 	RECT16 rc;
 
-	hBrush = (HBRUSH)EDIT_SEND_CTLCOLOR(wndPtr, wParam);
+	hBrush = (HBRUSH16)EDIT_SEND_CTLCOLOR(wndPtr, wParam);
 	if (!hBrush)
-		hBrush = (HBRUSH)GetStockObject(WHITE_BRUSH);
+		hBrush = (HBRUSH16)GetStockObject(WHITE_BRUSH);
 
 	GetClientRect16(wndPtr->hwndSelf, &rc);
 	IntersectClipRect((HDC)wParam, rc.left, rc.top, rc.right, rc.bottom);
@@ -2678,8 +2681,8 @@
 	UINT vlc = EDIT_GetVisibleLineCount(wndPtr);
 	UINT lc = (UINT)EDIT_EM_GetLineCount(wndPtr, 0, 0L);
 	HDC16 hdc;
-	HFONT hFont;
-	HFONT oldFont = 0;
+	HFONT16 hFont;
+	HFONT16 oldFont = 0;
 	RECT16 rc;
 	RECT16 rcLine;
 	RECT16 rcRgn;
@@ -2776,9 +2779,9 @@
 	EDITSTATE *es = EDITSTATEPTR(wndPtr);
 	LPARAM sel = EDIT_EM_GetSel(wndPtr, 0, 0L);
 	HDC32 hdc;
-	HFONT oldFont = 0;
+	HFONT16 oldFont = 0;
 
-	es->hFont = (HFONT)wParam;
+	es->hFont = (HFONT16)wParam;
 	hdc = GetDC32(wndPtr->hwndSelf);
 	if (es->hFont)
 		oldFont = SelectObject(hdc, es->hFont);
diff --git a/controls/listbox.c b/controls/listbox.c
index 4abf763..f39cfdc 100644
--- a/controls/listbox.c
+++ b/controls/listbox.c
@@ -430,7 +430,7 @@
 int ListBoxInsertString(LPHEADLIST lphl, UINT uIndex, LPCSTR newstr)
 {
   LPLISTSTRUCT *lppls, lplsnew, lpls;
-  HANDLE       hStr;
+  HANDLE16 hStr;
   LPSTR	str;
   UINT	Count;
     
@@ -1408,7 +1408,7 @@
   if (wParam == 0)
     lphl->hFont = GetStockObject(SYSTEM_FONT);
   else
-    lphl->hFont = (HFONT) wParam;
+    lphl->hFont = (HFONT16)wParam;
 
   /* a new font means possible new text height */
   /* does this mean the height of each entry must be separately changed? */
@@ -1434,8 +1434,8 @@
   LPHEADLIST   lphl = ListBoxGetStorageHeader(hwnd);
   LPLISTSTRUCT lpls;
   PAINTSTRUCT16 ps;
-  HBRUSH       hBrush;
-  HFONT        hOldFont;
+  HBRUSH16 hBrush;
+  HFONT16 hOldFont;
   HDC16 hdc    = BeginPaint16( hwnd, &ps );
   DC    *dc    = (DC *)GDI_GetObjPtr(hdc, DC_MAGIC);
   RECT16  rect, paintRect, scratchRect;
@@ -1454,8 +1454,8 @@
 
   hOldFont = SelectObject(hdc, lphl->hFont);
 
-  hBrush = (HBRUSH)SendMessage32A( lphl->hParent, WM_CTLCOLORLISTBOX,
-                                   (WPARAM)hdc, (LPARAM)hwnd);
+  hBrush = (HBRUSH16)SendMessage32A( lphl->hParent, WM_CTLCOLORLISTBOX,
+                                     (WPARAM)hdc, (LPARAM)hwnd);
   if (hBrush == 0) hBrush = GetStockObject(WHITE_BRUSH);
 
   FillRect16(hdc, &rect, hBrush);
@@ -1536,7 +1536,7 @@
        if( lphl->ItemsCount && lphl->ItemFocused != -1)
          {
            HDC32        hDC = GetDC32(hwnd);
-           HFONT        hOldFont = SelectObject(hDC, lphl->hFont);
+           HFONT16      hOldFont = SelectObject(hDC, lphl->hFont);
            LPLISTSTRUCT lpls;
 
            lpls = ListBoxGetItem(lphl,lphl->ItemFocused);
@@ -1566,7 +1566,7 @@
            if( lphl->ItemFocused != -1 )
              {
               HDC32        hDC = GetDC32(hwnd);
-              HFONT        hOldFont = SelectObject(hDC, lphl->hFont);
+              HFONT16      hOldFont = SelectObject(hDC, lphl->hFont);
               LPLISTSTRUCT lpls;
 
               lpls = ListBoxGetItem(lphl,lphl->ItemFocused);
diff --git a/controls/menu.c b/controls/menu.c
index d18b3ca..c01dfcb 100644
--- a/controls/menu.c
+++ b/controls/menu.c
@@ -39,8 +39,8 @@
     UINT	item_id;       /* Item or popup id */
     RECT16      rect;          /* Item area (relative to menu window) */
     WORD        xTab;          /* X position of text after Tab */
-    HBITMAP	hCheckBit;     /* Bitmap for checked item */
-    HBITMAP	hUnCheckBit;   /* Bitmap for unchecked item */
+    HBITMAP16	hCheckBit;     /* Bitmap for checked item */
+    HBITMAP16	hUnCheckBit;   /* Bitmap for unchecked item */
     LPSTR       text;          /* Item text or bitmap handle */
 } MENUITEM;
 
@@ -49,7 +49,7 @@
 {
     WORD        wFlags;       /* Menu flags (MF_POPUP, MF_SYSMENU) */
     WORD        wMagic;       /* Magic number */
-    HANDLE      hTaskQ;       /* Task queue for this menu */
+    HQUEUE16    hTaskQ;       /* Task queue for this menu */
     WORD	Width;        /* Width of the whole menu */
     WORD	Height;       /* Height of the whole menu */
     WORD	nItems;       /* Number of items in the menu */
@@ -89,11 +89,11 @@
 
 extern void  NC_DrawSysButton(HWND hwnd, HDC hdc, BOOL down); /* nonclient.c */
 extern BOOL  NC_GetSysPopupPos(WND* wndPtr, RECT16* rect);
-extern HTASK TASK_GetNextTask(HTASK);
+extern HTASK16 TASK_GetNextTask(HTASK16);
 
-static HBITMAP hStdCheck = 0;
-static HBITMAP hStdMnArrow = 0;
-static HMENU MENU_DefSysMenu = 0;  /* Default system menu */
+static HBITMAP16 hStdCheck = 0;
+static HBITMAP16 hStdMnArrow = 0;
+static HMENU16 MENU_DefSysMenu = 0;  /* Default system menu */
 
 
 /* we _can_ use global popup window because there's no way 2 menues can
@@ -109,9 +109,9 @@
  *
  * Load a copy of the system menu.
  */
-static HMENU MENU_CopySysMenu(void)
+static HMENU16 MENU_CopySysMenu(void)
 {
-    HMENU hMenu;
+    HMENU16 hMenu;
     HGLOBAL16 handle;
     POPUPMENU *menu;
 
@@ -166,7 +166,7 @@
  *
  * Return the default system menu.
  */
-HMENU MENU_GetDefSysMenu(void)
+HMENU16 MENU_GetDefSysMenu(void)
 {
     return MENU_DefSysMenu;
 }
@@ -215,7 +215,7 @@
  *
  * Grey the appropriate items in System menu.
  */
-void MENU_InitSysMenuPopup(HMENU hmenu, DWORD style, DWORD clsStyle)
+void MENU_InitSysMenuPopup(HMENU16 hmenu, DWORD style, DWORD clsStyle)
 {
     BOOL gray;
 
@@ -240,7 +240,7 @@
  * Find a menu item. Return a pointer on the item, and modifies *hmenu
  * in case the item was in a sub-menu.
  */
-static MENUITEM *MENU_FindItem( HMENU *hmenu, UINT *nPos, UINT wFlags )
+static MENUITEM *MENU_FindItem( HMENU16 *hmenu, UINT *nPos, UINT wFlags )
 {
     POPUPMENU *menu;
     int i;
@@ -263,7 +263,7 @@
 	    }
 	    else if (item->item_flags & MF_POPUP)
 	    {
-		HMENU hsubmenu = (HMENU)item->item_id;
+		HMENU16 hsubmenu = (HMENU16)item->item_id;
 		MENUITEM *subitem = MENU_FindItem( &hsubmenu, nPos, wFlags );
 		if (subitem)
 		{
@@ -311,7 +311,7 @@
  * Find the menu item selected by a key press.
  * Return item id, -1 if none, -2 if we should close the menu.
  */
-static UINT MENU_FindItemByKey( HWND hwndOwner, HMENU hmenu, UINT key )
+static UINT MENU_FindItemByKey( HWND hwndOwner, HMENU16 hmenu, UINT key )
 {
     POPUPMENU *menu;
     MENUITEM *item;
@@ -704,7 +704,7 @@
  *
  * Paint a popup menu.
  */
-static void MENU_DrawPopupMenu( HWND hwnd, HDC hdc, HMENU hmenu )
+static void MENU_DrawPopupMenu( HWND hwnd, HDC hdc, HMENU16 hmenu )
 {
     POPUPMENU *menu;
     MENUITEM *item;
@@ -731,7 +731,7 @@
     int i;
     WND *wndPtr = WIN_FindWndPtr( hwnd );
     
-    lppop = (LPPOPUPMENU) USER_HEAP_LIN_ADDR( (HMENU)wndPtr->wIDmenu );
+    lppop = (LPPOPUPMENU) USER_HEAP_LIN_ADDR( (HMENU16)wndPtr->wIDmenu );
     if (lppop == NULL || lprect == NULL) return SYSMETRICS_CYMENU;
     dprintf_menu(stddeb,"MENU_DrawMenuBar(%04x, %p, %p); !\n", 
 		 hDC, lprect, lppop);
@@ -756,7 +756,7 @@
 /***********************************************************************
  *	     MENU_SwitchTPWndTo
  */
-BOOL32 MENU_SwitchTPWndTo( HTASK hTask)
+BOOL32 MENU_SwitchTPWndTo( HTASK16 hTask )
 {
   /* This is supposed to be called when popup is hidden. 
    * AppExit() calls with hTask == 0, so we get the next to current.
@@ -789,7 +789,7 @@
  *
  * Display a popup menu.
  */
-static BOOL MENU_ShowPopup(HWND hwndOwner, HMENU hmenu, UINT id, int x, int y, 
+static BOOL MENU_ShowPopup(HWND hwndOwner, HMENU16 hmenu, UINT id, int x, int y, 
 						        int xanchor, int yanchor)
 {
     POPUPMENU 	*menu;
@@ -885,7 +885,7 @@
 /***********************************************************************
  *           MENU_SelectItem
  */
-static void MENU_SelectItem( HWND hwndOwner, HMENU hmenu, UINT wIndex,
+static void MENU_SelectItem( HWND hwndOwner, HMENU16 hmenu, UINT wIndex,
                              BOOL sendMenuSelect )
 {
     LPPOPUPMENU lppop;
@@ -949,7 +949,7 @@
  *           MENU_SelectItemRel
  *
  */
-static void MENU_SelectItemRel( HWND hwndOwner, HMENU hmenu, int offset )
+static void MENU_SelectItemRel( HWND hwndOwner, HMENU16 hmenu, int offset )
 {
     int i, min = 0;
     POPUPMENU *menu;
@@ -1038,7 +1038,7 @@
  *
  * Insert a new item into a menu.
  */
-static MENUITEM *MENU_InsertItem( HMENU hMenu, UINT pos, UINT flags )
+static MENUITEM *MENU_InsertItem( HMENU16 hMenu, UINT pos, UINT flags )
 {
     MENUITEM *newItems;
     POPUPMENU *menu;
@@ -1104,7 +1104,7 @@
  * Parse a standard menu resource and add items to the menu.
  * Return a pointer to the end of the resource.
  */
-static LPCSTR MENU_ParseResource( LPCSTR res, HMENU hMenu, BOOL unicode )
+static LPCSTR MENU_ParseResource( LPCSTR res, HMENU16 hMenu, BOOL unicode )
 {
     WORD flags, id = 0;
     LPCSTR str;
@@ -1126,7 +1126,7 @@
         else res += (lstrlen32W((LPCWSTR)str) + 1) * sizeof(WCHAR);
         if (flags & MF_POPUP)
         {
-            HMENU hSubMenu = CreatePopupMenu();
+            HMENU16 hSubMenu = CreatePopupMenu();
             if (!hSubMenu) return NULL;
             if (!(res = MENU_ParseResource( res, hSubMenu, unicode )))
                 return NULL;
@@ -1149,7 +1149,7 @@
  *
  * Return the handle of the selected sub-popup menu (if any).
  */
-static HMENU MENU_GetSubPopup( HMENU hmenu )
+static HMENU16 MENU_GetSubPopup( HMENU16 hmenu )
 {
     POPUPMENU *menu;
     MENUITEM *item;
@@ -1162,7 +1162,7 @@
     item = &menu->items[menu->FocusedItem];
     if (!(item->item_flags & MF_POPUP) || !(item->item_flags & MF_MOUSESELECT))
 	return 0;
-    return (HMENU)item->item_id;
+    return (HMENU16)item->item_id;
 }
 
 
@@ -1171,12 +1171,12 @@
  *
  * Hide the sub-popup menus of this menu.
  */
-static void MENU_HideSubPopups( HWND hwndOwner, HMENU hmenu,
+static void MENU_HideSubPopups( HWND hwndOwner, HMENU16 hmenu,
                                 BOOL sendMenuSelect )
 {
     MENUITEM *item;
     POPUPMENU *menu, *submenu;
-    HMENU hsubmenu;
+    HMENU16 hsubmenu;
 
     if (!(menu = (POPUPMENU *) USER_HEAP_LIN_ADDR( hmenu ))) return;
     if (menu->FocusedItem == NO_SELECTED_ITEM) return;
@@ -1190,7 +1190,7 @@
 	if (!(item->item_flags & MF_POPUP) ||
 	    !(item->item_flags & MF_MOUSESELECT)) return;
 	item->item_flags &= ~MF_MOUSESELECT;
-	hsubmenu = (HMENU)item->item_id;
+	hsubmenu = (HMENU16)item->item_id;
     }
     submenu = (POPUPMENU *) USER_HEAP_LIN_ADDR( hsubmenu );
     MENU_HideSubPopups( hwndOwner, hsubmenu, FALSE );
@@ -1214,7 +1214,8 @@
  * Display the sub-menu of the selected item of this menu.
  * Return the handle of the submenu, or hmenu if no submenu to display.
  */
-static HMENU MENU_ShowSubPopup( HWND hwndOwner, HMENU hmenu, BOOL selectFirst )
+static HMENU16 MENU_ShowSubPopup( HWND hwndOwner, HMENU16 hmenu,
+                                  BOOL selectFirst )
 {
     POPUPMENU *menu;
     MENUITEM *item;
@@ -1239,7 +1240,7 @@
     item->item_flags |= MF_MOUSESELECT;
     if (menu->wFlags & MF_POPUP)
     {
-	MENU_ShowPopup( hwndOwner, (HMENU)item->item_id, menu->FocusedItem,
+	MENU_ShowPopup( hwndOwner, (HMENU16)item->item_id, menu->FocusedItem,
 		 wndPtr->rectWindow.left + item->rect.right-arrow_bitmap_width,
 		 wndPtr->rectWindow.top + item->rect.top,
 		 item->rect.left - item->rect.right + 2*arrow_bitmap_width, 
@@ -1247,13 +1248,13 @@
     }
     else
     {
-	MENU_ShowPopup( hwndOwner, (HMENU)item->item_id, menu->FocusedItem,
+	MENU_ShowPopup( hwndOwner, (HMENU16)item->item_id, menu->FocusedItem,
 		        wndPtr->rectWindow.left + item->rect.left,
 		        wndPtr->rectWindow.top + item->rect.bottom,
 			item->rect.right - item->rect.left, item->rect.bottom - item->rect.top );
     }
-    if (selectFirst) MENU_SelectItemRel( hwndOwner, (HMENU)item->item_id, ITEM_NEXT );
-    return (HMENU)item->item_id;
+    if (selectFirst) MENU_SelectItemRel( hwndOwner, (HMENU16)item->item_id, ITEM_NEXT );
+    return (HMENU16)item->item_id;
 }
 
 
@@ -1262,7 +1263,7 @@
  *
  * Find the menu containing a given point (in screen coords).
  */
-static HMENU MENU_FindMenuByCoords( HMENU hmenu, POINT16 pt )
+static HMENU16 MENU_FindMenuByCoords( HMENU16 hmenu, POINT16 pt )
 {
     POPUPMENU *menu;
     HWND hwnd;
@@ -1300,8 +1301,8 @@
  * Execute a menu item (for instance when user pressed Enter).
  * Return TRUE if we can go on with menu tracking.
  */
-static BOOL MENU_ExecFocusedItem( HWND hwndOwner, HMENU hmenu,
-				  HMENU *hmenuCurrent )
+static BOOL MENU_ExecFocusedItem( HWND hwndOwner, HMENU16 hmenu,
+				  HMENU16 *hmenuCurrent )
 {
     MENUITEM *item;
     POPUPMENU *menu = (POPUPMENU *) USER_HEAP_LIN_ADDR( hmenu );
@@ -1333,8 +1334,8 @@
  * hmenuCurrent is the top-most visible popup.
  * Return TRUE if we can go on with menu tracking.
  */
-static BOOL MENU_ButtonDown( HWND hwndOwner, HMENU hmenu, HMENU *hmenuCurrent,
-			     POINT16 pt )
+static BOOL MENU_ButtonDown( HWND hwndOwner, HMENU16 hmenu,
+                             HMENU16 *hmenuCurrent, POINT16 pt )
 {
     POPUPMENU *menu;
     MENUITEM *item;
@@ -1383,12 +1384,12 @@
  * hmenuCurrent is the top-most visible popup.
  * Return TRUE if we can go on with menu tracking.
  */
-static BOOL MENU_ButtonUp( HWND hwndOwner, HMENU hmenu, HMENU *hmenuCurrent,
-			   POINT16 pt )
+static BOOL MENU_ButtonUp( HWND hwndOwner, HMENU16 hmenu,
+                           HMENU16 *hmenuCurrent, POINT16 pt )
 {
     POPUPMENU *menu;
     MENUITEM *item;
-    HMENU hsubmenu = 0;
+    HMENU16 hsubmenu = 0;
     UINT id;
 
     if (!hmenu) return FALSE;  /* Outside all menus */
@@ -1409,7 +1410,7 @@
 	{
 	    return MENU_ExecFocusedItem( hwndOwner, hmenu, hmenuCurrent );
 	}
-	hsubmenu = (HMENU)item->item_id;
+	hsubmenu = (HMENU16)item->item_id;
     }
       /* Select first item of sub-popup */
     MENU_SelectItem( hwndOwner, hsubmenu, NO_SELECTED_ITEM, FALSE );
@@ -1425,8 +1426,8 @@
  * hmenuCurrent is the top-most visible popup.
  * Return TRUE if we can go on with menu tracking.
  */
-static BOOL MENU_MouseMove( HWND hwndOwner, HMENU hmenu, HMENU *hmenuCurrent,
-			    POINT16 pt )
+static BOOL MENU_MouseMove( HWND hwndOwner, HMENU16 hmenu,
+                            HMENU16 *hmenuCurrent, POINT16 pt )
 {
     MENUITEM *item;
     POPUPMENU *menu = (POPUPMENU *) USER_HEAP_LIN_ADDR( hmenu );
@@ -1458,7 +1459,8 @@
 /***********************************************************************
  *           MENU_DoNextMenu
  */
-static LRESULT MENU_DoNextMenu( HWND* hwndOwner, HMENU* hmenu, HMENU *hmenuCurrent, UINT vk)
+static LRESULT MENU_DoNextMenu( HWND* hwndOwner, HMENU16* hmenu,
+                                HMENU16 *hmenuCurrent, UINT vk)
 {
   POPUPMENU *menu = (POPUPMENU *) USER_HEAP_LIN_ADDR( *hmenu );
   UINT	     id = 0;
@@ -1541,10 +1543,11 @@
  * Handle a VK_LEFT key event in a menu.
  * hmenuCurrent is the top-most visible popup.
  */
-static void MENU_KeyLeft( HWND* hwndOwner, HMENU* hmenu, HMENU *hmenuCurrent )
+static void MENU_KeyLeft( HWND* hwndOwner, HMENU16* hmenu,
+                          HMENU16 *hmenuCurrent )
 {
     POPUPMENU *menu;
-    HMENU hmenutmp, hmenuprev;
+    HMENU16 hmenutmp, hmenuprev;
 
     menu = (POPUPMENU *) USER_HEAP_LIN_ADDR( *hmenu );
     hmenuprev = hmenutmp = *hmenu;
@@ -1581,10 +1584,11 @@
  * Handle a VK_RIGHT key event in a menu.
  * hmenuCurrent is the top-most visible popup.
  */
-static void MENU_KeyRight( HWND* hwndOwner, HMENU* hmenu, HMENU *hmenuCurrent )
+static void MENU_KeyRight( HWND* hwndOwner, HMENU16* hmenu,
+                           HMENU16 *hmenuCurrent )
 {
     POPUPMENU *menu;
-    HMENU hmenutmp;
+    HMENU16 hmenutmp;
 
     menu = (POPUPMENU *) USER_HEAP_LIN_ADDR( *hmenu );
 
@@ -1620,7 +1624,7 @@
     }
     else if (*hmenuCurrent != *hmenu)  /* Hide last level popup */
     {
-	HMENU hmenuprev;
+	HMENU16 hmenuprev;
 	hmenuprev = hmenutmp = *hmenu;
 	while (hmenutmp != *hmenuCurrent)
 	{
@@ -1640,12 +1644,12 @@
  * 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( HMENU hmenu, UINT wFlags, int x, int y,
+static BOOL MENU_TrackMenu( HMENU16 hmenu, UINT wFlags, int x, int y,
 			    HWND hwnd, const RECT16 *lprect )
 {
     MSG16 msg;
     POPUPMENU *menu;
-    HMENU hmenuCurrent = hmenu;
+    HMENU16 hmenuCurrent = hmenu;
     BOOL fClosed = FALSE, fRemove;
     UINT pos;
 
@@ -1668,7 +1672,7 @@
 	if ((msg.message >= WM_MOUSEFIRST) && (msg.message <= WM_MOUSELAST))
 	{
 	      /* Find the sub-popup for this mouse event (if any) */
-	    HMENU hsubmenu = MENU_FindMenuByCoords( hmenu, msg.pt );
+	    HMENU16 hsubmenu = MENU_FindMenuByCoords( hmenu, msg.pt );
 
 	    switch(msg.message)
 	    {
@@ -1822,7 +1826,7 @@
     HideCaret(0);
     SendMessage16( hwnd, WM_ENTERMENULOOP, 0, 0 );
     SendMessage16( hwnd, WM_INITMENU, wndPtr->wIDmenu, 0 );
-    MENU_TrackMenu( (HMENU)wndPtr->wIDmenu, TPM_LEFTALIGN | TPM_LEFTBUTTON,
+    MENU_TrackMenu( (HMENU16)wndPtr->wIDmenu, TPM_LEFTALIGN | TPM_LEFTBUTTON,
 		    pt.x, pt.y, hwnd, NULL );
     SendMessage16( hwnd, WM_EXITMENULOOP, 0, 0 );
     ShowCaret(0);
@@ -1837,7 +1841,7 @@
 void MENU_TrackKbdMenuBar( WND* wndPtr, UINT wParam, INT vkey)
 {
     UINT uItem = NO_SELECTED_ITEM;
-   HMENU hTrackMenu; 
+   HMENU16 hTrackMenu; 
 
     /* find window that has a menu 
      */
@@ -1945,7 +1949,7 @@
 	    PAINTSTRUCT16 ps;
 	    BeginPaint16( hwnd, &ps );
 	    MENU_DrawPopupMenu( hwnd, ps.hdc,
-                                (HMENU)GetWindowLong32A( hwnd, 0 ) );
+                                (HMENU16)GetWindowLong32A( hwnd, 0 ) );
 	    EndPaint16( hwnd, &ps );
 	    return 0;
 	}
@@ -1962,7 +1966,7 @@
 	    break;
 
     case WM_USER:
-	if (wParam) SetWindowLong32A( hwnd, 0, (HMENU)wParam );
+	if (wParam) SetWindowLong32A( hwnd, 0, (HMENU16)wParam );
         break;
     default:
 	return DefWindowProc16(hwnd, message, wParam, lParam);
@@ -1984,7 +1988,7 @@
     LPPOPUPMENU lppop;
 
     if (!(wndPtr = WIN_FindWndPtr( hwnd ))) return 0;
-    if (!(lppop = (LPPOPUPMENU)USER_HEAP_LIN_ADDR((HMENU)wndPtr->wIDmenu)))
+    if (!(lppop = (LPPOPUPMENU)USER_HEAP_LIN_ADDR((HMENU16)wndPtr->wIDmenu)))
       return 0;
     hdc = GetDCEx32( hwnd, 0, DCX_CACHE | DCX_WINDOW );
     SetRect16(&rectBar, orgX, orgY, orgX+menubarWidth, orgY+SYSMETRICS_CYMENU);
@@ -2063,7 +2067,7 @@
 /*******************************************************************
  *         CheckMenuItem    (USER.154)
  */
-INT CheckMenuItem( HMENU hMenu, UINT id, UINT flags )
+INT CheckMenuItem( HMENU16 hMenu, UINT id, UINT flags )
 {
     MENUITEM *item;
     INT ret;
@@ -2080,7 +2084,7 @@
 /**********************************************************************
  *			EnableMenuItem		[USER.155]
  */
-BOOL EnableMenuItem(HMENU hMenu, UINT wItemID, UINT wFlags)
+BOOL EnableMenuItem(HMENU16 hMenu, UINT wItemID, UINT wFlags)
 {
     MENUITEM *item;
     dprintf_menu(stddeb,"EnableMenuItem (%04x, %04X, %04X) !\n", 
@@ -2107,7 +2111,7 @@
 /*******************************************************************
  *         GetMenuString    (USER.161)
  */
-int GetMenuString( HMENU hMenu, UINT wItemID,
+int GetMenuString( HMENU16 hMenu, UINT wItemID,
                    LPSTR str, short nMaxSiz, UINT wFlags )
 {
     MENUITEM *item;
@@ -2127,7 +2131,7 @@
 /**********************************************************************
  *			HiliteMenuItem		[USER.162]
  */
-BOOL HiliteMenuItem(HWND hWnd, HMENU hMenu, UINT wItemID, UINT wHilite)
+BOOL HiliteMenuItem(HWND hWnd, HMENU16 hMenu, UINT wItemID, UINT wHilite)
 {
     LPPOPUPMENU menu;
     dprintf_menu(stddeb,"HiliteMenuItem(%04x, %04x, %04x, %04x);\n", 
@@ -2144,7 +2148,7 @@
 /**********************************************************************
  *			GetMenuState		[USER.250]
  */
-UINT GetMenuState(HMENU hMenu, UINT wItemID, UINT wFlags)
+UINT GetMenuState(HMENU16 hMenu, UINT wItemID, UINT wFlags)
 {
     MENUITEM *item;
     dprintf_menu(stddeb,"GetMenuState(%04x, %04x, %04x);\n", 
@@ -2152,7 +2156,7 @@
     if (!(item = MENU_FindItem( &hMenu, &wItemID, wFlags ))) return -1;
     if (item->item_flags & MF_POPUP)
     {
-	POPUPMENU *menu = (POPUPMENU *) USER_HEAP_LIN_ADDR( (HMENU)item->item_id );
+	POPUPMENU *menu = (POPUPMENU *) USER_HEAP_LIN_ADDR( (HMENU16)item->item_id );
 	if (!menu) return -1;
 	else return (menu->nItems << 8) | (menu->wFlags & 0xff);
     }
@@ -2163,7 +2167,7 @@
 /**********************************************************************
  *			GetMenuItemCount		[USER.263]
  */
-INT GetMenuItemCount(HMENU hMenu)
+INT GetMenuItemCount(HMENU16 hMenu)
 {
 	LPPOPUPMENU	menu;
 	dprintf_menu(stddeb,"GetMenuItemCount(%04x);\n", hMenu);
@@ -2178,7 +2182,7 @@
 /**********************************************************************
  *			GetMenuItemID			[USER.264]
  */
-UINT GetMenuItemID(HMENU hMenu, int nPos)
+UINT GetMenuItemID(HMENU16 hMenu, int nPos)
 {
     LPPOPUPMENU	menu;
 
@@ -2226,7 +2230,7 @@
     }
 
     if (flags & MF_POPUP)  /* Set the MF_POPUP flag on the popup-menu */
-	((POPUPMENU *)USER_HEAP_LIN_ADDR((HMENU)id))->wFlags |= MF_POPUP;
+	((POPUPMENU *)USER_HEAP_LIN_ADDR((HMENU16)id))->wFlags |= MF_POPUP;
 
     item->hCheckBit   = hStdCheck;
     item->hUnCheckBit = 0;
@@ -2283,7 +2287,7 @@
 /**********************************************************************
  *			RemoveMenu		[USER.412]
  */
-BOOL RemoveMenu(HMENU hMenu, UINT nPos, UINT wFlags)
+BOOL RemoveMenu(HMENU16 hMenu, UINT nPos, UINT wFlags)
 {
     LPPOPUPMENU	menu;
     MENUITEM *item;
@@ -2319,11 +2323,11 @@
 /**********************************************************************
  *			DeleteMenu		[USER.413]
  */
-BOOL DeleteMenu(HMENU hMenu, UINT nPos, UINT wFlags)
+BOOL DeleteMenu(HMENU16 hMenu, UINT nPos, UINT wFlags)
 {
     MENUITEM *item = MENU_FindItem( &hMenu, &nPos, wFlags );
     if (!item) return FALSE;
-    if (item->item_flags & MF_POPUP) DestroyMenu( (HMENU)item->item_id );
+    if (item->item_flags & MF_POPUP) DestroyMenu( (HMENU16)item->item_id );
       /* nPos is now the position of the item */
     RemoveMenu( hMenu, nPos, wFlags | MF_BYPOSITION );
     return TRUE;
@@ -2350,7 +2354,7 @@
                       UINT32 id, LPCSTR str )
 {
     MENUITEM *item;
-    HMENU hMenu16 = hMenu;
+    HMENU16 hMenu16 = hMenu;
     UINT16 pos16 = pos;
 
     if (IS_STRING_ITEM(flags))
@@ -2392,9 +2396,9 @@
 /**********************************************************************
  *			CreatePopupMenu		[USER.415]
  */
-HMENU CreatePopupMenu()
+HMENU16 CreatePopupMenu()
 {
-    HMENU hmenu;
+    HMENU16 hmenu;
     POPUPMENU *menu;
 
     if (!(hmenu = CreateMenu())) return 0;
@@ -2416,8 +2420,8 @@
 /**********************************************************************
  *			SetMenuItemBitmaps	[USER.418]
  */
-BOOL SetMenuItemBitmaps(HMENU hMenu, UINT nPos, UINT wFlags,
-                        HBITMAP hNewUnCheck, HBITMAP hNewCheck)
+BOOL SetMenuItemBitmaps(HMENU16 hMenu, UINT nPos, UINT wFlags,
+                        HBITMAP16 hNewUnCheck, HBITMAP16 hNewCheck)
 {
     MENUITEM *item;
     dprintf_menu(stddeb,"SetMenuItemBitmaps(%04x, %04x, %04x, %04x, %04x)\n",
@@ -2444,9 +2448,9 @@
 /**********************************************************************
  *			CreateMenu		[USER.151]
  */
-HMENU CreateMenu()
+HMENU16 CreateMenu()
 {
-    HMENU hMenu;
+    HMENU16 hMenu;
     LPPOPUPMENU menu;
     dprintf_menu(stddeb,"CreateMenu !\n");
     if (!(hMenu = USER_HEAP_ALLOC( sizeof(POPUPMENU) )))
@@ -2469,7 +2473,7 @@
 /**********************************************************************
  *			DestroyMenu		[USER.152]
  */
-BOOL DestroyMenu(HMENU hMenu)
+BOOL DestroyMenu(HMENU16 hMenu)
 {
     LPPOPUPMENU lppop;
     dprintf_menu(stddeb,"DestroyMenu (%04x) !\n", hMenu);
@@ -2490,7 +2494,7 @@
         for (i = lppop->nItems; i > 0; i--, item++)
         {
             if (item->item_flags & MF_POPUP)
-                DestroyMenu( (HMENU)item->item_id );
+                DestroyMenu( (HMENU16)item->item_id );
 	    if (IS_STRING_ITEM(item->item_flags) && item->text)
                 HeapFree( SystemHeap, 0, item->text );
         }
@@ -2504,7 +2508,7 @@
 /**********************************************************************
  *			GetSystemMenu		[USER.156]
  */
-HMENU GetSystemMenu(HWND hWnd, BOOL bRevert)
+HMENU16 GetSystemMenu(HWND hWnd, BOOL bRevert)
 {
     WND *wndPtr = WIN_FindWndPtr( hWnd );
     if (!wndPtr) return 0;
@@ -2524,7 +2528,7 @@
 /*******************************************************************
  *         SetSystemMenu    (USER.280)
  */
-BOOL SetSystemMenu( HWND hwnd, HMENU hMenu )
+BOOL SetSystemMenu( HWND hwnd, HMENU16 hMenu )
 {
     WND *wndPtr;
 
@@ -2539,18 +2543,18 @@
 /**********************************************************************
  *			GetMenu		[USER.157]
  */
-HMENU GetMenu(HWND hWnd) 
+HMENU16 GetMenu(HWND hWnd) 
 { 
 	WND * wndPtr = WIN_FindWndPtr(hWnd);
 	if (wndPtr == NULL) return 0;
-	return (HMENU)wndPtr->wIDmenu;
+	return (HMENU16)wndPtr->wIDmenu;
 }
 
 
 /**********************************************************************
  * 			SetMenu 	[USER.158]
  */
-BOOL SetMenu(HWND hWnd, HMENU hMenu)
+BOOL SetMenu(HWND hWnd, HMENU16 hMenu)
 {
 	LPPOPUPMENU lpmenu;
 	WND * wndPtr = WIN_FindWndPtr(hWnd);
@@ -2585,7 +2589,7 @@
 /**********************************************************************
  *			GetSubMenu		[USER.159]
  */
-HMENU GetSubMenu(HMENU hMenu, short nPos)
+HMENU16 GetSubMenu(HMENU16 hMenu, short nPos)
 {
     LPPOPUPMENU lppop;
 
@@ -2593,7 +2597,7 @@
     if (!(lppop = (LPPOPUPMENU) USER_HEAP_LIN_ADDR(hMenu))) return 0;
     if ((UINT)nPos >= lppop->nItems) return 0;
     if (!(lppop->items[nPos].item_flags & MF_POPUP)) return 0;
-    return (HMENU)lppop->items[nPos].item_id;
+    return (HMENU16)lppop->items[nPos].item_id;
 }
 
 
@@ -2610,7 +2614,7 @@
 		wndPtr->wIDmenu != 0) {
 		dprintf_menu(stddeb,"DrawMenuBar wIDmenu=%04X \n", 
 			     wndPtr->wIDmenu);
-		lppop = (LPPOPUPMENU) USER_HEAP_LIN_ADDR((HMENU)wndPtr->wIDmenu);
+		lppop = (LPPOPUPMENU) USER_HEAP_LIN_ADDR((HMENU16)wndPtr->wIDmenu);
 		if (lppop == NULL) return;
 
 		lppop->Height = 0; /* Make sure we call MENU_MenuBarCalcSize */
@@ -2633,7 +2637,7 @@
 /***********************************************************************
  *           LookupMenuHandle   (USER.217)
  */
-HMENU LookupMenuHandle( HMENU hmenu, INT id )
+HMENU16 LookupMenuHandle( HMENU16 hmenu, INT id )
 {
     if (!MENU_FindItem( &hmenu, &id, MF_BYCOMMAND )) return 0;
     else return hmenu;
@@ -2700,7 +2704,7 @@
  */
 HMENU16 LoadMenuIndirect16( LPCVOID template )
 {
-    HMENU hMenu;
+    HMENU16 hMenu;
     WORD version, offset;
     LPCSTR p = (LPCSTR)template;
 
@@ -2729,7 +2733,7 @@
  */
 HMENU32 LoadMenuIndirect32A( LPCVOID template )
 {
-    HMENU hMenu;
+    HMENU16 hMenu;
     WORD version, offset;
     LPCSTR p = (LPCSTR)template;
 
@@ -2767,7 +2771,7 @@
 /**********************************************************************
  *		IsMenu    (USER.358)
  */
-BOOL IsMenu( HMENU hmenu )
+BOOL IsMenu( HMENU16 hmenu )
 {
     LPPOPUPMENU menu;
     if (!(menu = (LPPOPUPMENU) USER_HEAP_LIN_ADDR( hmenu ))) return FALSE;
diff --git a/controls/scroll.c b/controls/scroll.c
index 34497fc..1364fc1 100644
--- a/controls/scroll.c
+++ b/controls/scroll.c
@@ -1249,7 +1249,7 @@
         else  /* hide it */
         {
             if (!(wndPtr->dwStyle & WS_HSCROLL)
-                && !(wndPtr->dwStyle & WS_HSCROLL)) return TRUE;
+                && !(wndPtr->dwStyle & WS_VSCROLL)) return TRUE;
             wndPtr->dwStyle &= ~(WS_HSCROLL | WS_VSCROLL);
         }
         break;
diff --git a/controls/static.c b/controls/static.c
index 8f91c6f..88bf0b2 100644
--- a/controls/static.c
+++ b/controls/static.c
@@ -145,7 +145,7 @@
 
         case WM_SETFONT:
             if (style == SS_ICON) return 0;
-            infoPtr->hFont = (HFONT)wParam;
+            infoPtr->hFont = (HFONT16)wParam;
             if (LOWORD(lParam))
             {
                 InvalidateRect32( hWnd, NULL, FALSE );
@@ -183,7 +183,7 @@
 static void STATIC_PaintTextfn( WND *wndPtr, HDC hdc )
 {
     RECT16 rc;
-    HBRUSH hBrush;
+    HBRUSH16 hBrush;
     WORD wFormat;
 
     LONG style = wndPtr->dwStyle;
@@ -231,7 +231,7 @@
 static void STATIC_PaintRectfn( WND *wndPtr, HDC hdc )
 {
     RECT16 rc;
-    HBRUSH hBrush;
+    HBRUSH16 hBrush;
 
     GetClientRect16( wndPtr->hwndSelf, &rc);
     
@@ -271,7 +271,7 @@
 static void STATIC_PaintIconfn( WND *wndPtr, HDC hdc )
 {
     RECT16 rc;
-    HBRUSH      hbrush;
+    HBRUSH16 hbrush;
     STATICINFO *infoPtr = (STATICINFO *)wndPtr->wExtra;
 
     GetClientRect16( wndPtr->hwndSelf, &rc);
diff --git a/debugger/Makefile.in b/debugger/Makefile.in
index d574c2a..337d43d 100644
--- a/debugger/Makefile.in
+++ b/debugger/Makefile.in
@@ -1,6 +1,9 @@
-DEFS   = -D__WINE__ -DNO_TRANSITION_TYPES
-TOPSRC = @top_srcdir@
-MODULE = debugger
+DEFS      = -D__WINE__ -DNO_TRANSITION_TYPES
+TOPSRCDIR = @top_srcdir@
+TOPOBJDIR = ..
+SRCDIR    = @srcdir@
+VPATH     = @srcdir@
+MODULE    = debugger
 
 C_SRCS = \
 	break.c \
@@ -10,7 +13,9 @@
 	info.c \
 	memory.c \
 	registers.c \
-	stack.c \
+	stack.c
+
+GEN_C_SRCS = \
 	y.tab.c \
 	lex.yy.c
 
@@ -19,12 +24,12 @@
 @MAKE_RULES@
 
 y.tab.c y.tab.h: dbg.y
-	$(YACC) -d -t dbg.y
+	$(YACC) -d -t $(SRCDIR)/dbg.y
 
 lex.yy.c: debug.l
-	$(LEX) -8 -I debug.l
+	$(LEX) -8 -I $(SRCDIR)/debug.l
 
 clean::
-	$(RM) y.tab.c y.tab.h lex.yy.c
+	$(RM) y.tab.h
 
 ### Dependencies:
diff --git a/debugger/dbg.y b/debugger/dbg.y
index b94dee9..fa505b7 100644
--- a/debugger/dbg.y
+++ b/debugger/dbg.y
@@ -229,6 +229,17 @@
 }
 
 
+/***********************************************************************
+ *           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 int loaded_symbols = 0;
diff --git a/files/Makefile.in b/files/Makefile.in
index ae0a951..c5f236b 100644
--- a/files/Makefile.in
+++ b/files/Makefile.in
@@ -1,7 +1,10 @@
 prefix     = @prefix@
 sysconfdir = @sysconfdir@
 DEFS       = -D__WINE__  -DETCDIR=\"$(sysconfdir)\"
-TOPSRC     = @top_srcdir@
+TOPSRCDIR  = @top_srcdir@
+TOPOBJDIR  = ..
+SRCDIR     = @srcdir@
+VPATH      = @srcdir@
 MODULE     = files
 
 C_SRCS = \
diff --git a/files/drive.c b/files/drive.c
index 8695320..9210de7 100644
--- a/files/drive.c
+++ b/files/drive.c
@@ -80,7 +80,7 @@
 static DOSDRIVE DOSDrives[MAX_DOS_DRIVES];
 static int DRIVE_CurDrive = -1;
 
-static HTASK DRIVE_LastTask = 0;
+static HTASK16 DRIVE_LastTask = 0;
 
 
 /***********************************************************************
diff --git a/files/file.c b/files/file.c
index 2d786f2..d8b22b2 100644
--- a/files/file.c
+++ b/files/file.c
@@ -1154,7 +1154,7 @@
  */
 UINT16 SetHandleCount16( UINT16 count )
 {
-    HANDLE hPDB = GetCurrentPDB();
+    HGLOBAL16 hPDB = GetCurrentPDB();
     PDB *pdb = (PDB *)GlobalLock16( hPDB );
     BYTE *files = PTR_SEG_TO_LIN( pdb->fileHandlesPtr );
     WORD i;
@@ -1198,7 +1198,7 @@
 #ifdef WINELIB
         newfiles = (BYTE *)GlobalAlloc32( GMEM_FIXED, count );
 #else
-        HANDLE newhandle = GlobalAlloc16( GMEM_MOVEABLE, count );
+        HGLOBAL16 newhandle = GlobalAlloc16( GMEM_MOVEABLE, count );
         if (!newhandle)
         {
             DOS_ERROR( ER_OutOfMemory, EC_OutOfResource, SA_Abort, EL_Memory );
diff --git a/graphics/Makefile.in b/graphics/Makefile.in
index 7049eca..cc46354 100644
--- a/graphics/Makefile.in
+++ b/graphics/Makefile.in
@@ -1,6 +1,9 @@
-DEFS   = -D__WINE__ -DNO_TRANSITION_TYPES
-TOPSRC = @top_srcdir@
-MODULE = graphics
+DEFS      = -D__WINE__ -DNO_TRANSITION_TYPES
+TOPSRCDIR = @top_srcdir@
+TOPOBJDIR = ..
+SRCDIR    = @srcdir@
+VPATH     = @srcdir@
+MODULE    = graphics
 
 C_SRCS = \
 	driver.c
diff --git a/graphics/metafiledrv/Makefile.in b/graphics/metafiledrv/Makefile.in
new file mode 100644
index 0000000..1e39e5b
--- /dev/null
+++ b/graphics/metafiledrv/Makefile.in
@@ -0,0 +1,15 @@
+DEFS      = -D__WINE__ -DNO_TRANSITION_TYPES
+TOPSRCDIR = @top_srcdir@
+TOPOBJDIR = ../..
+SRCDIR    = @srcdir@
+VPATH     = @srcdir@
+MODULE    = metafiledrv
+
+C_SRCS = \
+	init.c
+
+all: $(MODULE).o
+
+@MAKE_RULES@
+
+### Dependencies:
diff --git a/graphics/metafiledrv/init.c b/graphics/metafiledrv/init.c
new file mode 100644
index 0000000..af5aea1
--- /dev/null
+++ b/graphics/metafiledrv/init.c
@@ -0,0 +1,240 @@
+/*
+ * Metafile driver initialisation functions
+ *
+ * Copyright 1996 Alexandre Julliard
+ */
+
+#include "metafiledrv.h"
+#include "dc.h"
+#include "heap.h"
+#include "global.h"
+#include "metafile.h"
+#include "stddebug.h"
+#include "debug.h"
+
+static BOOL32 MFDRV_DeleteDC( DC *dc );
+
+static const DC_FUNCTIONS MFDRV_Funcs =
+{
+    NULL,                            /* pArc */
+    NULL,                            /* pBitBlt */
+    NULL,                            /* pChord */
+    NULL,                            /* pCreateDC */
+    MFDRV_DeleteDC,                  /* pDeleteDC */
+    NULL,                            /* pDeleteObject */
+    NULL,                            /* pEllipse */
+    NULL,                            /* pEscape */
+    NULL,                            /* pExcludeClipRect */
+    NULL,                            /* pExcludeVisRect */
+    NULL,                            /* pExtFloodFill */
+    NULL,                            /* pExtTextOut */
+    NULL,                            /* pFillRgn */
+    NULL,                            /* pFloodFill */
+    NULL,                            /* pFrameRgn */
+    NULL,                            /* pGetTextExtentPoint */
+    NULL,                            /* pGetTextMetrics */
+    NULL,                            /* pIntersectClipRect */
+    NULL,                            /* pIntersectVisRect */
+    NULL,                            /* pInvertRgn */
+    NULL,                            /* pLineTo */
+    NULL,                            /* pMoveToEx */
+    NULL,                            /* pOffsetClipRgn */
+    NULL,                            /* pOffsetViewportOrgEx */
+    NULL,                            /* pOffsetWindowOrgEx */
+    NULL,                            /* pPaintRgn */
+    NULL,                            /* pPatBlt */
+    NULL,                            /* pPie */
+    NULL,                            /* pPolyPolygon */
+    NULL,                            /* pPolygon */
+    NULL,                            /* pPolyline */
+    NULL,                            /* pRealizePalette */
+    NULL,                            /* pRectangle */
+    NULL,                            /* pRestoreDC */
+    NULL,                            /* pRoundRect */
+    NULL,                            /* pSaveDC */
+    NULL,                            /* pScaleViewportExtEx */
+    NULL,                            /* pScaleWindowExtEx */
+    NULL,                            /* pSelectClipRgn */
+    NULL,                            /* pSelectObject */
+    NULL,                            /* pSelectPalette */
+    NULL,                            /* pSetBkColor */
+    NULL,                            /* pSetBkMode */
+    NULL,                            /* pSetDIBitsToDevice */
+    NULL,                            /* pSetMapMode */
+    NULL,                            /* pSetMapperFlags */
+    NULL,                            /* pSetPixel */
+    NULL,                            /* pSetPolyFillMode */
+    NULL,                            /* pSetROP2 */
+    NULL,                            /* pSetRelAbs */
+    NULL,                            /* pSetStretchBltMode */
+    NULL,                            /* pSetTextAlign */
+    NULL,                            /* pSetTextCharacterExtra */
+    NULL,                            /* pSetTextColor */
+    NULL,                            /* pSetTextJustification */
+    NULL,                            /* pSetViewportExtEx */
+    NULL,                            /* pSetViewportOrgEx */
+    NULL,                            /* pSetWindowExtEx */
+    NULL,                            /* pSetWindowOrgEx */
+    NULL,                            /* pStretchBlt */
+    NULL,                            /* pStretchDIBits */
+    NULL                             /* pTextOut */
+};
+
+
+
+/**********************************************************************
+ *	     MFDRV_AllocMetaFile
+ */
+static DC *MFDRV_AllocMetaFile(void)
+{
+    DC *dc;
+    METAFILEDRV_PDEVICE *physDev;
+    
+    if (!(dc = DC_AllocDC( &MFDRV_Funcs ))) return NULL;
+    dc->header.wMagic = METAFILE_DC_MAGIC;
+
+    physDev = (METAFILEDRV_PDEVICE *)HeapAlloc(SystemHeap,0,sizeof(*physDev));
+    if (!physDev)
+    {
+        GDI_HEAP_FREE( dc->hSelf );
+        return NULL;
+    }
+    dc->physDev = physDev;
+
+    if (!(physDev->mh = HeapAlloc( SystemHeap, 0, sizeof(*physDev->mh) )))
+    {
+        HeapFree( SystemHeap, 0, physDev );
+        GDI_HEAP_FREE( dc->hSelf );
+        return NULL;
+    }
+
+    physDev->nextHandle = 0;
+
+    physDev->mh->mtHeaderSize   = sizeof(METAHEADER) / sizeof(WORD);
+    physDev->mh->mtVersion      = 0x0300;
+    physDev->mh->mtSize         = physDev->mh->mtHeaderSize;
+    physDev->mh->mtNoObjects    = 0;
+    physDev->mh->mtMaxRecord    = 0;
+    physDev->mh->mtNoParameters = 0;
+
+/*    DC_InitDC( dc ); */
+    return dc;
+}
+
+
+/**********************************************************************
+*	     MFDRV_DeleteDC
+ */
+static BOOL32 MFDRV_DeleteDC( DC *dc )
+{
+    METAFILEDRV_PDEVICE *physDev = (METAFILEDRV_PDEVICE *)dc->physDev;
+    
+    if (physDev->mh) HeapFree( SystemHeap, 0, physDev->mh );
+    HeapFree( SystemHeap, 0, physDev );
+    dc->physDev = NULL;
+    return TRUE;
+}
+
+
+/**********************************************************************
+ *	     CreateMetafile16   (GDI.125)
+ */
+HDC16 CreateMetaFile16( LPCSTR filename )
+{
+    DC *dc;
+    METAFILEDRV_PDEVICE *physDev;
+    HFILE hFile;
+
+    printf( "CreateMetafile16: '%s'\n", filename );
+    dprintf_metafile( stddeb, "CreateMetaFile16: '%s'\n", filename );
+
+    if (!(dc = MFDRV_AllocMetaFile())) return 0;
+    physDev = (METAFILEDRV_PDEVICE *)dc->physDev;
+    
+    if (filename)  /* disk based metafile */
+    {
+        physDev->mh->mtType = METAFILE_DISK;
+        if ((hFile = _lcreat( filename, 0 )) == HFILE_ERROR)
+        {
+            DeleteDC( dc->hSelf );
+            return 0;
+        }
+        if (_lwrite32( hFile, (LPSTR)physDev->mh,
+                       sizeof(*physDev->mh)) == HFILE_ERROR)
+	{
+            DeleteDC( dc->hSelf );
+            return 0;
+	}
+	physDev->mh->mtNoParameters = hFile; /* store file descriptor here */
+	                            /* windows probably uses this too*/
+    }
+    else  /* memory based metafile */
+	physDev->mh->mtType = METAFILE_MEMORY;
+
+    dprintf_metafile( stddeb, "CreateMetaFile16: returning %04x\n", dc->hSelf);
+    return dc->hSelf;
+}
+
+
+/******************************************************************
+ *	     CloseMetafile16   (GDI.126)
+ */
+HMETAFILE16 CloseMetaFile16( HDC16 hdc )
+{
+    DC *dc;
+    HMETAFILE16 hmf;
+    HFILE hFile;
+    METAFILEDRV_PDEVICE *physDev;
+    
+    dprintf_metafile( stddeb, "CloseMetaFile(%04x)\n", hdc );
+
+    if (!(dc = DC_GetDCPtr( hdc ))) return 0;
+    physDev = (METAFILEDRV_PDEVICE *)dc->physDev;
+
+    /* Construct the end of metafile record - this is documented
+     * in SDK Knowledgebase Q99334.
+     */
+
+    if (!MF_MetaParam0(dc, META_EOF))
+    {
+        DeleteDC( hdc );
+	return 0;
+    }	
+
+    if (physDev->mh->mtType == METAFILE_DISK)  /* disk based metafile */
+    {
+        hFile = physDev->mh->mtNoParameters;
+	physDev->mh->mtNoParameters = 0;
+        if (_llseek(hFile, 0L, 0) == HFILE_ERROR)
+        {
+            DeleteDC( hdc );
+            return 0;
+        }
+        if (_lwrite32( hFile, (LPSTR)physDev->mh,
+                       sizeof(*physDev->mh)) == HFILE_ERROR)
+        {
+            DeleteDC( hdc );
+            return 0;
+        }
+        _lclose(hFile);
+    }
+
+    /* Now allocate a global handle for the metafile */
+
+    hmf = GLOBAL_CreateBlock( GMEM_MOVEABLE, physDev->mh,
+                              physDev->mh->mtSize * sizeof(WORD),
+                              GetCurrentPDB(), FALSE, FALSE, FALSE, NULL );
+    physDev->mh = NULL;  /* So it won't be deleted */
+    DeleteDC( hdc );
+    return hmf;
+}
+
+
+/******************************************************************
+ *	     DeleteMetafile16   (GDI.127)
+ */
+BOOL16 DeleteMetaFile16( HMETAFILE16 hmf )
+{
+    return !GlobalFree16( hmf );
+}
+
diff --git a/graphics/win16drv/Makefile.in b/graphics/win16drv/Makefile.in
index 119ab9d..4514382 100644
--- a/graphics/win16drv/Makefile.in
+++ b/graphics/win16drv/Makefile.in
@@ -1,6 +1,9 @@
-DEFS   = -D__WINE__ -DNO_TRANSITION_TYPES
-TOPSRC = @top_srcdir@
-MODULE = win16drv
+DEFS      = -D__WINE__ -DNO_TRANSITION_TYPES
+TOPSRCDIR = @top_srcdir@
+TOPOBJDIR = ../..
+SRCDIR    = @srcdir@
+VPATH     = @srcdir@
+MODULE    = win16drv
 
 C_SRCS = \
 	font.c \
diff --git a/graphics/x11drv/Makefile.in b/graphics/x11drv/Makefile.in
index 255c66e..841f3f7 100644
--- a/graphics/x11drv/Makefile.in
+++ b/graphics/x11drv/Makefile.in
@@ -1,6 +1,9 @@
-DEFS   = -D__WINE__ -DNO_TRANSITION_TYPES
-TOPSRC = @top_srcdir@
-MODULE = x11drv
+DEFS      = -D__WINE__ -DNO_TRANSITION_TYPES
+TOPSRCDIR = @top_srcdir@
+TOPOBJDIR = ../..
+SRCDIR    = @srcdir@
+VPATH     = @srcdir@
+MODULE    = x11drv
 
 C_SRCS = \
 	font.c \
diff --git a/if1632/Makefile.in b/if1632/Makefile.in
index 6e2c87f..62c579b 100644
--- a/if1632/Makefile.in
+++ b/if1632/Makefile.in
@@ -1,8 +1,11 @@
-DEFS   = -D__WINE__ -DNO_TRANSITION_TYPES
-TOPSRC = @top_srcdir@
-MODULE = if1632
+DEFS      = -D__WINE__ -DNO_TRANSITION_TYPES
+TOPSRCDIR = @top_srcdir@
+TOPOBJDIR = ..
+SRCDIR    = @srcdir@
+VPATH     = @srcdir@
+MODULE    = if1632
 
-DLLS	= \
+DLLS = \
 	advapi32.spec \
 	comctl32.spec \
 	comdlg32.spec \
@@ -75,7 +78,7 @@
 $(SPEC_FILES): $(BUILD)
 
 $(BUILD) checkbuild:
-	cd $(TOPSRC)/tools; $(SUBMAKE) build
+	cd $(TOPOBJDIR)/tools; $(SUBMAKE) build
 
 callfrom16.S: $(SPEC_FILES)
 	$(BUILD) -callfrom16 `cat $(SPEC_FILES) | grep CallFrom16_ | sed 's/.*CallFrom16_\(.*\)/\1/' | sort | uniq` > callfrom16.S
@@ -83,13 +86,16 @@
 callfrom32.S: $(SPEC_FILES)
 	$(BUILD) -callfrom32 `cat $(SPEC_FILES) | grep CallFrom32_ | sed 's/.*CallFrom32_\(.*\)/\1/' | sort | uniq` > callfrom32.S
 
-callto16.S: $(TOPSRC)/include/callback.h $(BUILD)
-	$(BUILD) -callto16 `cat $(TOPSRC)/include/callback.h | grep "extern.*CallTo16_" | sed 's/.*CallTo16_\(.*\)(.*/\1/' | sort | uniq` > callto16.S
+callto16.S: $(TOPSRCDIR)/include/callback.h $(BUILD)
+	$(BUILD) -callto16 `cat $(TOPSRCDIR)/include/callback.h | grep "extern.*CallTo16_" | sed 's/.*CallTo16_\(.*\)(.*/\1/' | sort | uniq` > callto16.S
 
-callto32.S: $(TOPSRC)/include/callback.h $(BUILD)
-	$(BUILD) -callto32 `cat $(TOPSRC)/include/callback.h | grep "extern.*CallTo32_" | sed 's/.*CallTo32_\(.*\)(.*/\1/' | sort | uniq` > callto32.S
+callto32.S: $(TOPSRCDIR)/include/callback.h $(BUILD)
+	$(BUILD) -callto32 `cat $(TOPSRCDIR)/include/callback.h | grep "extern.*CallTo32_" | sed 's/.*CallTo32_\(.*\)(.*/\1/' | sort | uniq` > callto32.S
+
+except.o: except.S $(TOPOBJDIR)/include/config.h
+	$(CC) -c $(DIVINCL) -o $*.o $(SRCDIR)/except.S
 
 clean::
-	rm -f $(SPEC_FILES) callfrom16.S callfrom32.S callto16.S callto32.S
+	$(RM) $(SPEC_FILES) callfrom16.S callfrom32.S callto16.S callto32.S
 
 ### Dependencies:
diff --git a/if1632/except.S b/if1632/except.S
index 66fb861..cbe05b7 100644
--- a/if1632/except.S
+++ b/if1632/except.S
@@ -4,7 +4,7 @@
  * Copyright (c) 1996 Onno Hovers, (onno@stack.urc.tue.nl)
  *
  */
-#include "../include/config.h"
+#include "config.h"
 
 #ifdef NEED_UNDERSCORE_PREFIX
 
diff --git a/if1632/gdi.spec b/if1632/gdi.spec
index 6ab8988..e131b6c 100644
--- a/if1632/gdi.spec
+++ b/if1632/gdi.spec
@@ -121,9 +121,9 @@
 #122 pascal ReSurRection
 123 pascal16 PlayMetaFile(word word) PlayMetaFile
 124 pascal16 GetMetaFile(ptr) GetMetaFile
-125 pascal16 CreateMetaFile(ptr) CreateMetaFile
-126 pascal16 CloseMetaFile(word) CloseMetaFile
-127 pascal16 DeleteMetaFile(word) DeleteMetaFile
+125 pascal16 CreateMetaFile(ptr) CreateMetaFile16
+126 pascal16 CloseMetaFile(word) CloseMetaFile16
+127 pascal16 DeleteMetaFile(word) DeleteMetaFile16
 128 pascal16 MulDiv(s_word s_word s_word) MulDiv16
 129 pascal16 SaveVisRgn(word) SaveVisRgn
 130 pascal16 RestoreVisRgn(word) RestoreVisRgn
@@ -157,8 +157,8 @@
 180 pascal16 SetDCState(word word) SetDCState
 181 pascal16 RectInRegionOld(word ptr) RectInRegion16
 188 stub GetTextExtentEx
-190 pascal16 SetDCHook(word segptr long) SetDCHook
-191 pascal   GetDCHook(word ptr) GetDCHook
+190 pascal16 SetDCHook(word segptr long) THUNK_SetDCHook
+191 pascal   GetDCHook(word ptr) THUNK_GetDCHook
 192 pascal16 SetHookFlags(word word) SetHookFlags
 193 stub SetBoundsRect
 194 stub GetBoundsRect
@@ -352,6 +352,26 @@
 527 stub SetMiterLimit
 528 stub GDIParametersInfo
 529 stub CreateHalftonePalette
+# Stubs for Hebrew version
+530 pascal16 GDI_530() stub_GDI_530
+531 pascal16 GDI_531() stub_GDI_531
+532 pascal16 GDI_532() stub_GDI_532
+536 pascal16 GDI_536() stub_GDI_536
+538 pascal16 GDI_538() stub_GDI_538
+540 pascal16 GDI_540() stub_GDI_540
+543 pascal16 GDI_543() stub_GDI_543
+555 pascal16 GDI_555() stub_GDI_555
+560 pascal16 GDI_560() stub_GDI_560
+561 pascal16 GDI_561() stub_GDI_561
+564 pascal16 GDI_564() stub_GDI_564
+565 pascal16 GDI_565() stub_GDI_565
+566 pascal16 GDI_566() stub_GDI_566
+571 pascal16 GDI_571() stub_GDI_571
+572 pascal16 GDI_572() stub_GDI_572
+573 pascal16 GDI_573() stub_GDI_573
+556 pascal16 GDI_556() stub_GDI_556
+558 pascal16 GDI_558() stub_GDI_558
+569 pascal16 GDI_569() stub_GDI_569
 602 stub SetDIBColorTable
 603 stub GetDIBColorTable
 604 stub SetSolidBrush
@@ -377,23 +397,3 @@
 822 stub ICMTranslateRGB
 823 stub ICMTranslateRGBs
 824 stub ICMCheckCOlorsInGamut
-# Stubs for Hebrew version
-530 pascal16 GDI_530() stub_GDI_530
-531 pascal16 GDI_531() stub_GDI_531
-532 pascal16 GDI_532() stub_GDI_532
-536 pascal16 GDI_536() stub_GDI_536
-538 pascal16 GDI_538() stub_GDI_538
-540 pascal16 GDI_540() stub_GDI_540
-543 pascal16 GDI_543() stub_GDI_543
-555 pascal16 GDI_555() stub_GDI_555
-560 pascal16 GDI_560() stub_GDI_560
-561 pascal16 GDI_561() stub_GDI_561
-564 pascal16 GDI_564() stub_GDI_564
-565 pascal16 GDI_565() stub_GDI_565
-566 pascal16 GDI_566() stub_GDI_566
-571 pascal16 GDI_571() stub_GDI_571
-572 pascal16 GDI_572() stub_GDI_572
-573 pascal16 GDI_573() stub_GDI_573
-556 pascal16 GDI_556() stub_GDI_556
-558 pascal16 GDI_558() stub_GDI_558
-569 pascal16 GDI_569() stub_GDI_569
diff --git a/if1632/gdi32.spec b/if1632/gdi32.spec
index 443043b..7c00df7 100644
--- a/if1632/gdi32.spec
+++ b/if1632/gdi32.spec
@@ -213,7 +213,7 @@
 0206 stdcall GetObjectW(long long ptr) GetObject32W
 0207 stub GetOutlineTextMetricsA
 0208 stub GetOutlineTextMetricsW
-0209 stub GetPaletteEntries
+0209 stdcall GetPaletteEntries(long long long ptr) GetPaletteEntries
 0210 stub GetPath
 0211 stdcall GetPixel(long long long)	GetPixel
 0212 stub GetPixelFormat
diff --git a/if1632/kernel.spec b/if1632/kernel.spec
index 604c87c..9b2c4c9 100644
--- a/if1632/kernel.spec
+++ b/if1632/kernel.spec
@@ -151,9 +151,9 @@
 150 pascal16 DirectedYield(word) DirectedYield
 151 stub WinOldApCall
 152 pascal16 GetNumTasks() GetNumTasks
-154 return GlobalNotify 4 0
+154 pascal16 GlobalNotify(segptr) GlobalNotify
 155 pascal16 GetTaskDS() GetTaskDS
-156 stub LimitEMSPages
+156 return LimitEMSPages 4 0
 157 return GetCurPID 4 0
 158 return IsWinOldApTask 2 0
 159 stub GlobalHandleNoRIP
@@ -200,7 +200,7 @@
 200 stub ValidateFreeSpaces
 201 stub ReplaceInst
 202 stub RegisterPtrace
-203 stub DebugBreak
+203 register DebugBreak() DebugBreak16
 204 stub SwapRecording
 205 stub CVWBreak
 206 pascal16 AllocSelectorArray(word) AllocSelectorArray
diff --git a/if1632/relay.c b/if1632/relay.c
index ce0f4dd..63b3509 100644
--- a/if1632/relay.c
+++ b/if1632/relay.c
@@ -44,7 +44,6 @@
                                     codesel );
     CALLTO16_RetAddr_long=MAKELONG( (int)CALLTO16_Ret_long-(int)CALLTO16_Start,
                                     codesel );
-
     return TRUE;
 }
 
diff --git a/if1632/thunk.c b/if1632/thunk.c
index 48a8022..e3c1983 100644
--- a/if1632/thunk.c
+++ b/if1632/thunk.c
@@ -6,27 +6,36 @@
 
 #include "windows.h"
 #include "callback.h"
+#include "heap.h"
+#include "hook.h"
+#include "module.h"
 #include "stddebug.h"
 #include "debug.h"
-#include "heap.h"
 
 typedef void (*RELAY)();
 
-typedef struct
+#pragma pack(1)
+
+typedef struct tagTHUNK
 {
-    BYTE       popl_eax;           /* 0x58  popl  %eax (return address) */
-    BYTE       pushl_func;         /* 0x68  pushl $proc */
-    FARPROC32  proc WINE_PACKED;
-    BYTE       pushl_eax;          /* 0x50  pushl %eax */
-    BYTE       jmp;                /* 0xe9  jmp   relay (relative jump)*/
-    RELAY      relay WINE_PACKED;
+    BYTE             popl_eax;           /* 0x58  popl  %eax (return address)*/
+    BYTE             pushl_func;         /* 0x68  pushl $proc */
+    FARPROC32        proc WINE_PACKED;
+    BYTE             pushl_eax;          /* 0x50  pushl %eax */
+    BYTE             jmp;                /* 0xe9  jmp   relay (relative jump)*/
+    RELAY            relay WINE_PACKED;
+    struct tagTHUNK *next WINE_PACKED;
 } THUNK;
 
+#pragma pack(4)
+
 #define DECL_THUNK(name,proc,relay) \
     THUNK name = { 0x58, 0x68, (FARPROC32)(proc), 0x50, 0xe9, \
-                    (RELAY)((char *)(relay) - (char *)(&(name) + 1)) }
+                   (RELAY)((char *)(relay) - (char *)(&(name).next)), NULL }
 
 
+static THUNK *firstThunk = NULL;
+
 /***********************************************************************
  *           THUNK_Alloc
  */
@@ -40,18 +49,42 @@
         thunk->proc       = func;
         thunk->pushl_eax  = 0x50;
         thunk->jmp        = 0xe9;
-        thunk->relay      = relay;
+        thunk->relay      = (RELAY)((char *)relay - (char *)(&thunk->next));
+        thunk->next       = firstThunk;
+        firstThunk = thunk;
     }
     return thunk;
 }
 
 
 /***********************************************************************
+ *           THUNK_Find
+ */
+static THUNK *THUNK_Find( FARPROC32 func )
+{
+    THUNK *thunk = firstThunk;
+    while (thunk && (thunk->proc != func)) thunk = thunk->next;
+    return thunk;
+}
+
+
+/***********************************************************************
  *           THUNK_Free
  */
-static void THUNK_Free( THUNK *thunk )
+void THUNK_Free( THUNK *thunk )
 {
-    HeapFree( SystemHeap, 0, thunk );
+    if (HEAP_IsInsideHeap( SystemHeap, 0, thunk ))
+    {
+        THUNK **prev = &firstThunk;
+        while (*prev && (*prev != thunk)) prev = &(*prev)->next;
+        if (*prev)
+        {
+            *prev = thunk->next;
+            HeapFree( SystemHeap, 0, thunk );
+            return;
+        }
+    }
+    fprintf( stderr, "THUNK_Free: invalid thunk addr %p\n", thunk );
 }
 
 
@@ -251,6 +284,104 @@
 }
 
 
+/***********************************************************************
+ *           THUNK_SetWindowsHook16   (USER.121)
+ */
+FARPROC16 THUNK_SetWindowsHook16( INT16 id, HOOKPROC16 proc )
+{
+    HINSTANCE16 hInst = FarGetOwner( HIWORD(proc) );
+    HTASK16 hTask = (id == WH_MSGFILTER) ? GetCurrentTask() : 0;
+    THUNK *thunk = THUNK_Alloc( (FARPROC16)proc, (RELAY)CallTo16_long_wwl );
+    if (!thunk) return 0;
+    return (FARPROC16)SetWindowsHookEx16( id, (HOOKPROC16)thunk, hInst, hTask);
+}
+
+
+/***********************************************************************
+ *           THUNK_UnhookWindowsHook16   (USER.234)
+ */
+BOOL16 THUNK_UnhookWindowsHook16( INT16 id, HOOKPROC16 proc )
+{
+    BOOL16 ret = FALSE;
+    THUNK *thunk = THUNK_Find( (FARPROC16)proc );
+    if (thunk) ret = UnhookWindowsHook16( id, (HOOKPROC16)thunk );
+    return ret;
+}
+
+
+/***********************************************************************
+ *           THUNK_SetWindowsHookEx16   (USER.291)
+ */
+HHOOK THUNK_SetWindowsHookEx16( INT16 id, HOOKPROC16 proc, HINSTANCE16 hInst,
+                                HTASK16 hTask )
+{
+    THUNK *thunk = THUNK_Alloc( (FARPROC16)proc, (RELAY)CallTo16_long_wwl );
+    if (!thunk) return 0;
+    return SetWindowsHookEx16( id, (HOOKPROC16)thunk, hInst, hTask );
+}
+
+
+/***********************************************************************
+ *           THUNK_UnhookWindowHookEx16   (USER.292)
+ */
+BOOL16 THUNK_UnhookWindowsHookEx16( HHOOK hhook )
+{
+    THUNK *thunk = (THUNK *)HOOK_GetProc16( hhook );
+    BOOL16 ret = UnhookWindowsHookEx16( hhook );
+    THUNK_Free( thunk );
+    return ret;
+}
+
+
+static FARPROC16 defDCHookProc = NULL;
+
+/***********************************************************************
+ *           THUNK_SetDCHook   (GDI.190)
+ */
+BOOL16 THUNK_SetDCHook( HDC16 hdc, FARPROC16 proc, DWORD dwHookData )
+{
+    THUNK *thunk, *oldThunk;
+
+    if (!defDCHookProc)  /* Get DCHook Win16 entry point */
+        defDCHookProc = MODULE_GetEntryPoint( GetModuleHandle("USER"), 362 );
+
+    if (proc != defDCHookProc)
+    {
+        thunk = THUNK_Alloc( proc, (RELAY)CallTo16_word_wwll );
+        if (!thunk) return FALSE;
+    }
+    else thunk = (THUNK *)DCHook;
+
+    /* Free the previous thunk */
+    GetDCHook( hdc, (FARPROC16 *)&oldThunk );
+    if (oldThunk && (oldThunk != (THUNK *)DCHook)) THUNK_Free( oldThunk );
+
+    return SetDCHook( hdc, (FARPROC16)thunk, dwHookData );
+}
+
+
+/***********************************************************************
+ *           THUNK_GetDCHook   (GDI.191)
+ */
+DWORD THUNK_GetDCHook( HDC16 hdc, FARPROC16 *phookProc )
+{
+    THUNK *thunk = NULL;
+    DWORD ret = GetDCHook( hdc, (FARPROC16 *)&thunk );
+    if (thunk)
+    {
+        if (thunk == (THUNK *)DCHook)
+        {
+            if (!defDCHookProc)  /* Get DCHook Win16 entry point */
+                defDCHookProc = MODULE_GetEntryPoint( GetModuleHandle("USER"),
+                                                      362 );
+            *phookProc = defDCHookProc;
+        }
+        else *phookProc = thunk->proc;
+    }
+    return ret;
+}
+
+
 struct thunkstruct
 {
 	char	magic[4];
diff --git a/if1632/user.spec b/if1632/user.spec
index b833439..3b40231 100644
--- a/if1632/user.spec
+++ b/if1632/user.spec
@@ -6,7 +6,7 @@
 2   stub OldExitWindows
 3   stub EnableOEMLayer
 4   stub DisableOEMLayer
-5   pascal16 InitApp(word) USER_InitApp
+5   pascal16 InitApp(word) InitApp
 6   pascal16 PostQuitMessage(word) PostQuitMessage
 7   pascal16 ExitWindows(long word) ExitWindows
 10  pascal16 SetTimer(word word word segptr) SetTimer16
@@ -115,12 +115,12 @@
 113 pascal16 TranslateMessage(ptr) TranslateMessage
 114 pascal   DispatchMessage(ptr) DispatchMessage
 115 pascal16 ReplyMessage(long) ReplyMessage
-116 pascal16 PostAppMessage(word word word long) PostAppMessage
+116 pascal16 PostAppMessage(word word word long) PostAppMessage16
 118 pascal16 RegisterWindowMessage(segptr) RegisterWindowMessage16
 117 pascal16 WindowFromDC(word) WindowFromDC16
 119 pascal   GetMessagePos() GetMessagePos
 120 pascal   GetMessageTime() GetMessageTime
-121 pascal   SetWindowsHook(s_word segptr) SetWindowsHook
+121 pascal   SetWindowsHook(s_word segptr) THUNK_SetWindowsHook16
 122 pascal   CallWindowProc(segptr word word word long) CallWindowProc16
 123 pascal16 CallMsgFilter(segptr s_word) CallMsgFilter
 124 pascal16 UpdateWindow(word) UpdateWindow
@@ -227,14 +227,14 @@
 224 pascal16 GetWindowTask(word) GetWindowTask16
 225 pascal16 EnumTaskWindows(word segptr long) THUNK_EnumTaskWindows16
 226 stub LockInput
-227 pascal16 GetNextDlgGroupItem(word word word) GetNextDlgGroupItem
-228 pascal16 GetNextDlgTabItem(word word word) GetNextDlgTabItem
+227 pascal16 GetNextDlgGroupItem(word word word) GetNextDlgGroupItem16
+228 pascal16 GetNextDlgTabItem(word word word) GetNextDlgTabItem16
 229 pascal16 GetTopWindow(word) GetTopWindow
 230 pascal16 GetNextWindow(word word) GetNextWindow
 231 stub GetSystemDebugState
 232 pascal16 SetWindowPos(word word word word word word word) SetWindowPos
 233 pascal16 SetParent(word word) SetParent
-234 pascal16 UnhookWindowsHook(s_word segptr) UnhookWindowsHook
+234 pascal16 UnhookWindowsHook(s_word segptr) THUNK_UnhookWindowsHook16
 235 pascal   DefHookProc(s_word word long ptr) DefHookProc
 236 pascal16 GetCapture() GetCapture16
 237 pascal16 GetUpdateRgn(word word word) GetUpdateRgn
@@ -294,8 +294,8 @@
 288 pascal   GetMessageExtraInfo() GetMessageExtraInfo
 #289 KEYB_EVENT
 290 pascal16 RedrawWindow(word ptr word word) RedrawWindow16
-291 pascal   SetWindowsHookEx(s_word segptr word word) SetWindowsHookEx
-292 pascal16 UnhookWindowsHookEx(segptr) UnhookWindowsHookEx
+291 pascal   SetWindowsHookEx(s_word segptr word word) THUNK_SetWindowsHookEx16
+292 pascal16 UnhookWindowsHookEx(segptr) THUNK_UnhookWindowsHookEx16
 293 pascal   CallNextHookEx(segptr s_word word long) CallNextHookEx
 294 stub LockWindowUpdate
 299 register Mouse_Event() Mouse_Event
diff --git a/if1632/user32.spec b/if1632/user32.spec
index 133cf02..5969794 100644
--- a/if1632/user32.spec
+++ b/if1632/user32.spec
@@ -132,7 +132,7 @@
 0125 stdcall DefWindowProcA(long long long long) DefWindowProc32A
 0126 stdcall DefWindowProcW(long long long long) DefWindowProc32W
 0127 stdcall DeferWindowPos(long long long long long long long long) DeferWindowPos
-0128 stdcall DeleteMenu(long) DeleteMenu
+0128 stdcall DeleteMenu(long long long) DeleteMenu
 0129 stub DestroyAcceleratorTable
 0130 stdcall DestroyCaret() DestroyCaret
 0131 stub DestroyCursor
@@ -278,8 +278,8 @@
 0271 stub GetMessagePos
 0272 stub GetMessageTime
 0273 stdcall GetMessageW(ptr long long long) USER32_GetMessageA
-0274 stub GetNextDlgGroupItem
-0275 stub GetNextDlgTabItem
+0274 stdcall GetNextDlgGroupItem(long long long) GetNextDlgGroupItem32
+0275 stdcall GetNextDlgTabItem(long long long) GetNextDlgTabItem32
 0276 stub GetOpenClipboardWindow
 0277 stdcall GetParent(long) GetParent32
 0278 stub GetPriorityClipboardFormat
@@ -498,7 +498,7 @@
 0491 stub SetMenuItemInfoW
 0492 stub SetMessageExtraInfo
 0493 stdcall  SetMessageQueue(long) SetMessageQueue
-0494 stub SetParent
+0494 stdcall SetParent(long long) SetParent
 0495 stub SetProcessWindowStation
 0496 stdcall SetPropA(long ptr long) SetProp32A
 0497 stdcall SetPropW(long ptr long) SetProp32W
diff --git a/if1632/winmm.spec b/if1632/winmm.spec
index 8254403..5707803 100644
--- a/if1632/winmm.spec
+++ b/if1632/winmm.spec
@@ -133,7 +133,7 @@
 0132 stub mmioStringToFOURCCW
 0133 stub mmioWrite
 0134 stub mmsystemGetVersion
-0135 stub sndPlaySoundA
+0135 stdcall sndPlaySoundA(ptr long) sndPlaySound
 0136 stub sndPlaySoundW
 0137 stub timeBeginPeriod
 0138 stub timeEndPeriod
diff --git a/include/brush.h b/include/brush.h
index a7c02f6..25803e6 100644
--- a/include/brush.h
+++ b/include/brush.h
@@ -18,7 +18,7 @@
 
 extern BOOL BRUSH_Init(void);
 extern int BRUSH_GetObject( BRUSHOBJ * brush, int count, LPSTR buffer );
-extern BOOL BRUSH_DeleteObject( HBRUSH hbrush, BRUSHOBJ * brush );
-extern HBRUSH BRUSH_SelectObject( DC * dc, HBRUSH hbrush, BRUSHOBJ * brush );
+extern BOOL32 BRUSH_DeleteObject( HBRUSH16 hbrush, BRUSHOBJ * brush );
+extern HBRUSH16 BRUSH_SelectObject(DC * dc, HBRUSH16 hbrush, BRUSHOBJ * brush);
 
 #endif  /* __WINE_BRUSH_H */
diff --git a/include/button.h b/include/button.h
index b4f7ad7..ae1b6fe 100644
--- a/include/button.h
+++ b/include/button.h
@@ -15,8 +15,8 @@
   /* broken enough to rely on this :-) */
 typedef struct
 {
-    WORD   state;   /* Current state */
-    HFONT  hFont;   /* Button font (or 0 for system font) */
+    WORD     state;   /* Current state */
+    HFONT16  hFont;   /* Button font (or 0 for system font) */
 } BUTTONINFO;
 
   /* Button state values */
diff --git a/include/callback.h b/include/callback.h
index dfd37e9..bf94586 100644
--- a/include/callback.h
+++ b/include/callback.h
@@ -12,7 +12,6 @@
 extern
 int CallTo32_LargeStack( int (*func)(), int nbargs, ... );
 
-
 /* List of the 16-bit callback functions. This list is used  */
 /* by the build program to generate the file if1632/callto16.S */
 
@@ -51,12 +50,8 @@
 extern WORD CallTo16_regs_( FARPROC16 func, WORD ds, WORD es, WORD bp, WORD ax,
                             WORD bx, WORD cx, WORD dx, WORD si, WORD di );
 
-#define CallDCHookProc( func, hdc, code, data, lparam) \
-    CallTo16_word_wwll( func, hdc, code, data, lparam )
 #define CallDriverProc( func, dwId, msg, hdrvr, lparam1, lparam2 ) \
     CallTo16_long_lwwll( func, dwId, msg, hdrvr, lparam1, lparam2 )
-#define CallHookProc( func, code, wParam, lParam ) \
-    CallTo16_long_wwl( func, code, wParam, lParam )
 #define CallTimeFuncProc( func, id, msg, dwUser, dw1, dw2 ) \
     CallTo16_word_wwlll( func, id, msg, dwUser, dw1, dw2 )
 #define CallWindowsExitProc( func, nExitType ) \
@@ -72,7 +67,6 @@
                                  style, MAKELONG(y,x), MAKELONG(cy,cx), \
                                  MAKELONG(hmenu,hparent), instance, params, \
                                  hwnd, msg, wParam, lParam )
-#define _InitTermProc( func ) CallTo32_0( (FARPROC32)func )
 
 
 /* List of the 32-bit callback functions. This list is used  */
@@ -93,12 +87,8 @@
 
 #else  /* WINELIB */
 
-#define CallDCHookProc( func, hdc, code, data, lparam ) \
-    (*func)( hdc, code, data, lparam )
 #define CallDriverProc( func, dwId, msg, hdrvr, lparam1, lparam2 ) \
     (*func)( dwId, msg, hdrvr, lparam1, lparam2 )
-#define CallHookProc( func, code, wParam, lParam ) \
-    (*func)( code, wParam, lParam )
 #define CallTimeFuncProc( func, id, msg, dwUser, dw1, dw2 ) \
     (*func)( id, msg, dwUser, dw1, dw2 )
 #define CallWindowsExitProc( func, nExitType ) \
@@ -109,8 +99,6 @@
     (*func)( hwnd, msg, wParam, lParam )
 #define CallWordBreakProc( func, lpch, ichCurrent, cch, code ) \
     (*func)( lpch, ichCurrent, cch, code )
-#define _InitTermProc( func ) (*func)()
-
 
 #endif  /* WINELIB */
 
diff --git a/include/commdlg.h b/include/commdlg.h
index 83f794e..b3d3293 100644
--- a/include/commdlg.h
+++ b/include/commdlg.h
@@ -50,7 +50,7 @@
 typedef struct {
 	DWORD		lStructSize;
 	HWND		hwndOwner;
-	HINSTANCE	hInstance;
+	HINSTANCE16	hInstance;
 	SEGPTR	        lpstrFilter;
 	SEGPTR          lpstrCustomFilter;
 	DWORD		nMaxCustFilter;
@@ -96,7 +96,7 @@
 typedef struct {
 	DWORD		lStructSize; 			/* size of this struct 0x20 */
 	HWND		hwndOwner; 				/* handle to owner's window */
-	HINSTANCE	hInstance; 				/* instance handle of.EXE that  */
+	HINSTANCE16	hInstance; 				/* instance handle of.EXE that  */
 										/*	contains cust. dlg. template */
 	DWORD		Flags;                  /* one or more of the FR_?? */
 	SEGPTR		lpstrFindWhat;          /* ptr. to search string    */
@@ -141,7 +141,7 @@
 	LPARAM	                lCustData;          /* data passed to hook fn.  */
         WNDPROC16               lpfnHook;
 	SEGPTR			lpTemplateName;     /* custom template name     */
-	HINSTANCE		hInstance;          /* instance handle of.EXE that   */
+	HINSTANCE16		hInstance;          /* instance handle of.EXE that   */
 							/* contains cust. dlg. template  */
 	SEGPTR			lpszStyle WINE_PACKED;  /* return the style field here   */
 							/* must be LF_FACESIZE or bigger */
@@ -215,7 +215,7 @@
 	UINT		nMinPage;
 	UINT		nMaxPage;
 	UINT		nCopies;
-	HINSTANCE 	hInstance;
+	HINSTANCE16 	hInstance;
 	LPARAM 		lCustData;
         WNDPROC16       lpfnPrintHook;
         WNDPROC16       lpfnSetupHook;
diff --git a/include/dc.h b/include/dc.h
index 8f98b9c..192c2a3 100644
--- a/include/dc.h
+++ b/include/dc.h
@@ -14,12 +14,13 @@
 #define CLIP_EXCLUDE	0x0002
 #define CLIP_KEEPRGN	0x0004
 
-extern void DC_InitDC( DC* dc );
-extern BOOL DC_SetupGCForPatBlt( DC * dc, GC gc, BOOL fMapColors );
-extern BOOL DC_SetupGCForBrush( DC * dc );
-extern BOOL DC_SetupGCForPen( DC * dc );
-extern BOOL DC_SetupGCForText( DC * dc );
-extern BOOL DC_CallHookProc( DC * dc, WORD code, LPARAM lParam );
+extern DC * DC_AllocDC( const DC_FUNCTIONS *funcs );
+extern DC * DC_GetDCPtr( HDC32 hdc );
+extern void DC_InitDC( DC * dc );
+extern BOOL32 DC_SetupGCForPatBlt( DC * dc, GC gc, BOOL32 fMapColors );
+extern BOOL32 DC_SetupGCForBrush( DC * dc );
+extern BOOL32 DC_SetupGCForPen( DC * dc );
+extern BOOL32 DC_SetupGCForText( DC * dc );
 
 extern const int DC_XROPfunction[];
 
diff --git a/include/dialog.h b/include/dialog.h
index fefdc45..dd01585 100644
--- a/include/dialog.h
+++ b/include/dialog.h
@@ -19,16 +19,15 @@
     INT32       msgResult;   /* Result of EndDialog() / Default button id */
     HWINDOWPROC dlgProc;     /* Dialog procedure */
     LONG        userInfo;    /* User information (for DWL_USER) */
-    HWND        hwndFocus;   /* Current control with focus */
-    HFONT       hUserFont;   /* Dialog font */
-    HMENU       hMenu;       /* Dialog menu */
+    HWND16      hwndFocus;   /* Current control with focus */
+    HFONT16     hUserFont;   /* Dialog font */
+    HMENU16     hMenu;       /* Dialog menu */
     WORD        xBaseUnit;   /* Dialog units (depends on the font) */
     WORD        yBaseUnit;
     WORD        fEnd;        /* EndDialog() called for this dialog */
-    HANDLE      hDialogHeap;
+    HGLOBAL16   hDialogHeap;
 } DIALOGINFO;
 
-extern BOOL DIALOG_Init(void);
-extern HWND DIALOG_GetFirstTabItem( HWND hwndDlg );
+extern BOOL32 DIALOG_Init(void);
 
 #endif  /* DIALOG_H */
diff --git a/include/gdi.h b/include/gdi.h
index 5e88208..b58f484 100644
--- a/include/gdi.h
+++ b/include/gdi.h
@@ -75,9 +75,6 @@
     int           flags;
     const DeviceCaps *devCaps;
 
-    HMETAFILE16   hMetaFile;
-    HGLOBAL16     hHT;          /* Handle table for metafile */
-    WORD          HTLen;        /* Handle table length (in entries) */
     HRGN16        hClipRgn;     /* Clip region (may be 0) */
     HRGN16        hVisRgn;      /* Visible region (must never be 0) */
     HRGN16        hGCClipRgn;   /* GC clip region (ClipRgn AND VisRgn) */
@@ -130,7 +127,7 @@
 typedef struct tagDC
 {
     GDIOBJHDR      header;
-    HDC16          hSelf;            /* Handle to this DC */
+    HDC32          hSelf;            /* Handle to this DC */
     const struct tagDC_FUNCS *funcs; /* DC function table */
     void          *physDev;          /* Physical device (driver-specific) */
     WORD           saveLevel;
@@ -235,28 +232,28 @@
 
 #define NB_STOCK_OBJECTS          (SYSTEM_FIXED_FONT + 1)
 
-#define STOCK_WHITE_BRUSH         ((HBRUSH)(FIRST_STOCK_HANDLE+WHITE_BRUSH))
-#define STOCK_LTGRAY_BRUSH        ((HBRUSH)(FIRST_STOCK_HANDLE+LTGRAY_BRUSH))
-#define STOCK_GRAY_BRUSH          ((HBRUSH)(FIRST_STOCK_HANDLE+GRAY_BRUSH))
-#define STOCK_DKGRAY_BRUSH        ((HBRUSH)(FIRST_STOCK_HANDLE+DKGRAY_BRUSH))
-#define STOCK_BLACK_BRUSH         ((HBRUSH)(FIRST_STOCK_HANDLE+BLACK_BRUSH))
-#define STOCK_NULL_BRUSH          ((HBRUSH)(FIRST_STOCK_HANDLE+NULL_BRUSH))
-#define STOCK_HOLLOW_BRUSH        ((HBRUSH)(FIRST_STOCK_HANDLE+HOLLOW_BRUSH))
-#define STOCK_WHITE_PEN	          ((HPEN16)(FIRST_STOCK_HANDLE+WHITE_PEN))
-#define STOCK_BLACK_PEN	          ((HPEN16)(FIRST_STOCK_HANDLE+BLACK_PEN))
-#define STOCK_NULL_PEN	          ((HPEN16)(FIRST_STOCK_HANDLE+NULL_PEN))
-#define STOCK_OEM_FIXED_FONT      ((HFONT)(FIRST_STOCK_HANDLE+OEM_FIXED_FONT))
-#define STOCK_ANSI_FIXED_FONT     ((HFONT)(FIRST_STOCK_HANDLE+ANSI_FIXED_FONT))
-#define STOCK_ANSI_VAR_FONT       ((HFONT)(FIRST_STOCK_HANDLE+ANSI_VAR_FONT))
-#define STOCK_SYSTEM_FONT         ((HFONT)(FIRST_STOCK_HANDLE+SYSTEM_FONT))
-#define STOCK_DEVICE_DEFAULT_FONT ((HFONT)(FIRST_STOCK_HANDLE+DEVICE_DEFAULT_FONT))
-#define STOCK_DEFAULT_PALETTE     ((HPALETTE16)(FIRST_STOCK_HANDLE+DEFAULT_PALETTE))
-#define STOCK_SYSTEM_FIXED_FONT   ((HFONT)(FIRST_STOCK_HANDLE+SYSTEM_FIXED_FONT))
+#define STOCK_WHITE_BRUSH       ((HBRUSH16)(FIRST_STOCK_HANDLE+WHITE_BRUSH))
+#define STOCK_LTGRAY_BRUSH      ((HBRUSH16)(FIRST_STOCK_HANDLE+LTGRAY_BRUSH))
+#define STOCK_GRAY_BRUSH        ((HBRUSH16)(FIRST_STOCK_HANDLE+GRAY_BRUSH))
+#define STOCK_DKGRAY_BRUSH      ((HBRUSH16)(FIRST_STOCK_HANDLE+DKGRAY_BRUSH))
+#define STOCK_BLACK_BRUSH       ((HBRUSH16)(FIRST_STOCK_HANDLE+BLACK_BRUSH))
+#define STOCK_NULL_BRUSH        ((HBRUSH16)(FIRST_STOCK_HANDLE+NULL_BRUSH))
+#define STOCK_HOLLOW_BRUSH      ((HBRUSH16)(FIRST_STOCK_HANDLE+HOLLOW_BRUSH))
+#define STOCK_WHITE_PEN	        ((HPEN16)(FIRST_STOCK_HANDLE+WHITE_PEN))
+#define STOCK_BLACK_PEN	        ((HPEN16)(FIRST_STOCK_HANDLE+BLACK_PEN))
+#define STOCK_NULL_PEN	        ((HPEN16)(FIRST_STOCK_HANDLE+NULL_PEN))
+#define STOCK_OEM_FIXED_FONT    ((HFONT16)(FIRST_STOCK_HANDLE+OEM_FIXED_FONT))
+#define STOCK_ANSI_FIXED_FONT   ((HFONT16)(FIRST_STOCK_HANDLE+ANSI_FIXED_FONT))
+#define STOCK_ANSI_VAR_FONT     ((HFONT16)(FIRST_STOCK_HANDLE+ANSI_VAR_FONT))
+#define STOCK_SYSTEM_FONT       ((HFONT16)(FIRST_STOCK_HANDLE+SYSTEM_FONT))
+#define STOCK_DEVICE_DEFAULT_FONT ((HFONT16)(FIRST_STOCK_HANDLE+DEVICE_DEFAULT_FONT))
+#define STOCK_DEFAULT_PALETTE   ((HPALETTE16)(FIRST_STOCK_HANDLE+DEFAULT_PALETTE))
+#define STOCK_SYSTEM_FIXED_FONT ((HFONT16)(FIRST_STOCK_HANDLE+SYSTEM_FIXED_FONT))
 
-#define FIRST_STOCK_FONT          STOCK_OEM_FIXED_FONT
-#define LAST_STOCK_FONT           STOCK_SYSTEM_FIXED_FONT
+#define FIRST_STOCK_FONT        STOCK_OEM_FIXED_FONT
+#define LAST_STOCK_FONT         STOCK_SYSTEM_FIXED_FONT
 
-#define LAST_STOCK_HANDLE         ((DWORD)STOCK_SYSTEM_FIXED_FONT)
+#define LAST_STOCK_HANDLE       ((DWORD)STOCK_SYSTEM_FIXED_FONT)
 
   /* Device <-> logical coords conversion */
 
@@ -286,10 +283,9 @@
          ((handle) ? PTR_SEG_OFF_TO_SEGPTR(GDI_HeapSel, (handle)) : (SEGPTR)0)
 
 extern BOOL32 GDI_Init(void);
-extern HANDLE16 GDI_AllocObject( WORD, WORD );
-extern BOOL32 GDI_FreeObject( HANDLE16 );
-extern GDIOBJHDR * GDI_GetObjPtr( HANDLE16, WORD );
-extern FARPROC16 GDI_GetDefDCHook(void);
+extern HGDIOBJ16 GDI_AllocObject( WORD, WORD );
+extern BOOL32 GDI_FreeObject( HGDIOBJ16 );
+extern GDIOBJHDR * GDI_GetObjPtr( HGDIOBJ16, WORD );
 
 extern BOOL32 DRIVER_RegisterDriver( LPCSTR name, const DC_FUNCTIONS *funcs );
 extern const DC_FUNCTIONS *DRIVER_FindDriver( LPCSTR name );
diff --git a/include/hook.h b/include/hook.h
index 0f49988..535afc2 100644
--- a/include/hook.h
+++ b/include/hook.h
@@ -8,28 +8,11 @@
 #define __WINE_HOOK_H
 
 #include "windows.h"
-#include "ldt.h"
-
-#pragma pack(1)
-
-  /* Hook data (pointed to by a HHOOK) */
-typedef struct
-{
-    HANDLE16   next;               /* 00 Next hook in chain */
-    HOOKPROC16 proc WINE_PACKED;   /* 02 Hook procedure */
-    INT16      id;                 /* 06 Hook id (WH_xxx) */
-    HQUEUE16   ownerQueue;         /* 08 Owner queue (0 for system hook) */
-    HMODULE16  ownerModule;        /* 0a Owner module */
-    WORD       inHookProc;         /* 0c TRUE if in this->proc */
-} HOOKDATA;
-
-#pragma pack(4)
-
-#define HOOK_MAGIC  ((int)'H' | (int)'K' << 8)  /* 'HK' */
 
 extern HANDLE16 HOOK_GetHook( INT16 id , HQUEUE16 hQueue );
 extern LRESULT HOOK_CallHooks( INT16 id, INT16 code,
                                WPARAM16 wParam, LPARAM lParam );
+extern HOOKPROC16 HOOK_GetProc16( HHOOK hook );
 extern void HOOK_FreeModuleHooks( HMODULE16 hModule );
 extern void HOOK_FreeQueueHooks( HQUEUE16 hQueue );
 
diff --git a/include/libres.h b/include/libres.h
index f1e9628..288f5ec 100644
--- a/include/libres.h
+++ b/include/libres.h
@@ -9,13 +9,13 @@
 #include "wintypes.h"
 #include "resource.h"
 
-extern INT     LIBRES_AccessResource( HINSTANCE hModule, HRSRC32 hRsrc );
-extern HGLOBAL32 LIBRES_AllocResource( HINSTANCE hModule, HRSRC32 hRsrc, DWORD size );
-extern HRSRC32 LIBRES_FindResource( HINSTANCE hModule, LPCSTR name, LPCSTR type );
-extern BOOL    LIBRES_FreeResource( HGLOBAL32 handle );
-extern HGLOBAL32 LIBRES_LoadResource( HINSTANCE hModule, HRSRC32 hRsrc );
-extern LPVOID  LIBRES_LockResource( HGLOBAL32 handle );
-extern DWORD   LIBRES_SizeofResource( HINSTANCE hModule, HRSRC32 hRsrc );
+extern INT32 LIBRES_AccessResource( HINSTANCE32 hModule, HRSRC32 hRsrc );
+extern HGLOBAL32 LIBRES_AllocResource( HINSTANCE32 hModule, HRSRC32 hRsrc, DWORD size );
+extern HRSRC32 LIBRES_FindResource( HINSTANCE32 hModule, LPCSTR name, LPCSTR type );
+extern BOOL32 LIBRES_FreeResource( HGLOBAL32 handle );
+extern HGLOBAL32 LIBRES_LoadResource( HINSTANCE32 hModule, HRSRC32 hRsrc );
+extern LPVOID LIBRES_LockResource( HGLOBAL32 handle );
+extern DWORD LIBRES_SizeofResource( HINSTANCE32 hModule, HRSRC32 hRsrc );
 
 #endif /* WINELIB */
 
diff --git a/include/listbox.h b/include/listbox.h
index 2dd1101..af816b6 100644
--- a/include/listbox.h
+++ b/include/listbox.h
@@ -6,7 +6,7 @@
         MEASUREITEMSTRUCT16 mis;
         UINT            itemState;
         RECT16          itemRect;
-	HANDLE		hData;
+	HLOCAL16	hData;
 	char            *itemText;
 	struct tagLISTSTRUCT *lpNext;
 } LISTSTRUCT, *LPLISTSTRUCT;
@@ -27,14 +27,14 @@
 	HWND	hSelf;
 	DWORD   dwStyle;      /* added for COMBOLBOX style faking */
 	HWND    hParent;
-	HFONT   hFont;
+	HFONT16 hFont;
 	BOOL    bRedrawFlag;
         BOOL    HasStrings;
         BOOL    OwnerDrawn;
 	WORD    iNumStops;
 	LPINT16 TabStops;
         BOOL    needMeasure;
-	HANDLE	HeapSel;
+	HGLOBAL16 HeapSel;
 /*	MDESC   *Heap; */
 } HEADLIST,*LPHEADLIST;
 
diff --git a/include/mdi.h b/include/mdi.h
index 6f26824..97911de 100644
--- a/include/mdi.h
+++ b/include/mdi.h
@@ -34,7 +34,7 @@
     WORD   	nActiveChildren;
     HWND   	hwndChildMaximized;
     HWND   	hwndActiveChild;
-    HMENU  	hWindowMenu;
+    HMENU16  	hWindowMenu;
     WORD   	idFirstChild;
     WORD	nTotalCreated;
     LPSTR 	frameTitle;
diff --git a/include/menu.h b/include/menu.h
index dfb7ec5..68d5ca9 100644
--- a/include/menu.h
+++ b/include/menu.h
@@ -6,8 +6,8 @@
 #define __WINE_MENU_H
 
 extern BOOL MENU_Init(void);
-extern HMENU MENU_GetDefSysMenu(void);
-extern void MENU_InitSysMenuPopup(HMENU hmenu, DWORD style, DWORD clsStyle);
+extern HMENU16 MENU_GetDefSysMenu(void);
+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 );
diff --git a/include/metafile.h b/include/metafile.h
index 5e475c1..a6378dd 100644
--- a/include/metafile.h
+++ b/include/metafile.h
@@ -13,31 +13,28 @@
 #define MFVERSION 0x300
 #define META_EOF 0x0000
 
-HMETAFILE16 MF_WriteRecord(HMETAFILE16 hmf, METARECORD *mr, WORD rlen);
-int MF_AddHandle(HANDLETABLE16 *ht, WORD htlen, HANDLE hobj);
-int MF_AddHandleInternal(HANDLE hobj);
-BOOL MF_MetaParam0(DC *dc, short func);
-BOOL MF_MetaParam1(DC *dc, short func, short param1);
-BOOL MF_MetaParam2(DC *dc, short func, short param1, short param2);
-BOOL MF_MetaParam4(DC *dc, short func, short param1, short param2, 
+BOOL32 MF_MetaParam0(DC *dc, short func);
+BOOL32 MF_MetaParam1(DC *dc, short func, short param1);
+BOOL32 MF_MetaParam2(DC *dc, short func, short param1, short param2);
+BOOL32 MF_MetaParam4(DC *dc, short func, short param1, short param2, 
 		   short param3, short param4);
-BOOL MF_MetaParam6(DC *dc, short func, short param1, short param2, 
+BOOL32 MF_MetaParam6(DC *dc, short func, short param1, short param2, 
 		   short param3, short param4, short param5, short param6);
-BOOL MF_MetaParam8(DC *dc, short func, short param1, short param2, 
+BOOL32 MF_MetaParam8(DC *dc, short func, short param1, short param2, 
 		   short param3, short param4, short param5,
 		   short param6, short param7, short param8);
-BOOL MF_CreateBrushIndirect(DC *dc, HBRUSH hBrush, LOGBRUSH16 *logbrush);
-BOOL MF_CreatePatternBrush(DC *dc, HBRUSH hBrush, LOGBRUSH16 *logbrush);
-BOOL MF_CreatePenIndirect(DC *dc, HPEN16 hPen, LOGPEN16 *logpen);
-BOOL MF_CreateFontIndirect(DC *dc, HFONT hFont, LOGFONT16 *logfont);
-BOOL MF_TextOut(DC *dc, short x, short y, LPCSTR str, short count);
-BOOL MF_ExtTextOut(DC *dc, short x, short y, UINT16 flags, const RECT16 *rect,
+BOOL32 MF_CreateBrushIndirect(DC *dc, HBRUSH16 hBrush, LOGBRUSH16 *logbrush);
+BOOL32 MF_CreatePatternBrush(DC *dc, HBRUSH16 hBrush, LOGBRUSH16 *logbrush);
+BOOL32 MF_CreatePenIndirect(DC *dc, HPEN16 hPen, LOGPEN16 *logpen);
+BOOL32 MF_CreateFontIndirect(DC *dc, HFONT16 hFont, LOGFONT16 *logfont);
+BOOL32 MF_TextOut(DC *dc, short x, short y, LPCSTR str, short count);
+BOOL32 MF_ExtTextOut(DC *dc, short x, short y, UINT16 flags, const RECT16 *rect,
                    LPCSTR str, short count, const INT16 *lpDx);
-BOOL MF_MetaPoly(DC *dc, short func, LPPOINT16 pt, short count);
-BOOL MF_BitBlt(DC *dcDest, short xDest, short yDest, short width,
-	       short height, HDC hdcSrc, short xSrc, short ySrc, DWORD rop);
-BOOL MF_StretchBlt(DC *dcDest, short xDest, short yDest, short widthDest,
-		   short heightDest, HDC hdcSrc, short xSrc, short ySrc, 
+BOOL32 MF_MetaPoly(DC *dc, short func, LPPOINT16 pt, short count);
+BOOL32 MF_BitBlt(DC *dcDest, short xDest, short yDest, short width,
+	       short height, HDC16 hdcSrc, short xSrc, short ySrc, DWORD rop);
+BOOL32 MF_StretchBlt(DC *dcDest, short xDest, short yDest, short widthDest,
+		   short heightDest, HDC16 hdcSrc, short xSrc, short ySrc, 
 		   short widthSrc, short heightSrc, DWORD rop);
 
 #endif   /* METAFILE_H */
diff --git a/include/metafiledrv.h b/include/metafiledrv.h
new file mode 100644
index 0000000..519f3a5
--- /dev/null
+++ b/include/metafiledrv.h
@@ -0,0 +1,22 @@
+/*
+ * Metafile driver definitions
+ */
+
+#ifndef __WINE_METAFILEDRV_H
+#define __WINE_METAFILEDRV_H
+
+#include "windows.h"
+#include "gdi.h"
+
+/* FIXME: SDK docs says these should be 1 and 2 */
+#define METAFILE_MEMORY 0
+#define METAFILE_DISK   1
+
+/* Metafile driver physical DC */
+typedef struct
+{
+    METAHEADER  *mh;           /* Pointer to metafile header */
+    UINT32       nextHandle;   /* Next handle number */
+} METAFILEDRV_PDEVICE;
+
+#endif  /* __WINE_METAFILEDRV_H */
diff --git a/include/mmsystem.h b/include/mmsystem.h
index 4d35773..9416024 100644
--- a/include/mmsystem.h
+++ b/include/mmsystem.h
@@ -533,7 +533,7 @@
         FOURCC          fccIOProc;      /* pointer to I/O procedure */
         LPMMIOPROC      pIOProc;        /* pointer to I/O procedure */
         UINT            wErrorRet;      /* place for error to be returned */
-        HTASK           htask;          /* alternate local task */
+        HTASK16         htask;          /* alternate local task */
         /* fields maintained by MMIO functions during buffered I/O */
         LONG            cchBuffer;      /* size of I/O buffer (or 0L) */
         HPSTR           pchBuffer;      /* start of I/O buffer (or NULL) */
@@ -661,7 +661,7 @@
 BOOL mciSetYieldProc (UINT uDeviceID, YIELDPROC fpYieldProc,
     DWORD dwYieldData);
 
-HTASK mciGetCreatorTask(UINT uDeviceID);
+HTASK16 mciGetCreatorTask(UINT uDeviceID);
 YIELDPROC mciGetYieldProc (UINT uDeviceID, DWORD * lpdwYieldData);
 
 #define MCIERR_INVALID_DEVICE_ID        (MCIERR_BASE + 1)
@@ -1515,7 +1515,7 @@
 UINT  mciDriverYield(UINT uDeviceID);
 BOOL  mciDriverNotify(HWND hwndCallback, UINT uDeviceID,
     UINT uStatus);
-UINT  mciLoadCommandResource(HINSTANCE hInstance,
+UINT  mciLoadCommandResource(HINSTANCE16 hInstance,
     LPCSTR lpResName, UINT uType);
 BOOL  mciFreeCommandResource(UINT uTable);
 
@@ -1526,7 +1526,7 @@
 #define DCB_TYPEMASK	0x0007
 #define DCB_NOSWITCH	0x0008			/* don't switch stacks for callback */
 
-BOOL DriverCallback(DWORD dwCallBack, UINT uFlags, HANDLE hDev, 
+BOOL DriverCallback(DWORD dwCallBack, UINT uFlags, HANDLE16 hDev, 
 		WORD wMsg, DWORD dwUser, DWORD dwParam1, DWORD dwParam2);
 DWORD auxMessage(WORD wDevID, WORD wMsg, DWORD dwUser, 
 					DWORD dwParam1, DWORD dwParam2);
diff --git a/include/module.h b/include/module.h
index dba95d9..f3a4522 100644
--- a/include/module.h
+++ b/include/module.h
@@ -85,10 +85,10 @@
   /* Parameters for LoadModule() */
 typedef struct
 {
-    HANDLE16 hEnvironment;         /* Environment segment */
-    SEGPTR   cmdLine WINE_PACKED;  /* Command-line */
-    SEGPTR   showCmd WINE_PACKED;  /* Code for ShowWindow() */
-    SEGPTR   reserved WINE_PACKED;
+    HGLOBAL16 hEnvironment;         /* Environment segment */
+    SEGPTR    cmdLine WINE_PACKED;  /* Command-line */
+    SEGPTR    showCmd WINE_PACKED;  /* Code for ShowWindow() */
+    SEGPTR    reserved WINE_PACKED;
 } LOADPARAMS;
 
 #pragma pack(4)
diff --git a/include/nonclient.h b/include/nonclient.h
index fdf9bb5..b2ffa02 100644
--- a/include/nonclient.h
+++ b/include/nonclient.h
@@ -11,8 +11,8 @@
 
 extern void NC_GetMinMaxInfo( HWND hwnd, POINT16 *maxSize, POINT16 *maxPos,
                               POINT16 *minTrack, POINT16 *maxTrack );
-extern void NC_DoNCPaint( HWND hwnd, HRGN clip, BOOL suppress_menupaint );
-extern LONG NC_HandleNCPaint( HWND hwnd , HRGN clip);
+extern void NC_DoNCPaint( HWND hwnd, HRGN32 clip, BOOL suppress_menupaint );
+extern LONG NC_HandleNCPaint( HWND hwnd , HRGN32 clip);
 extern LONG NC_HandleNCActivate( WND *pwnd, WPARAM wParam );
 extern LONG NC_HandleNCCalcSize( WND *pWnd, RECT16 *winRect );
 extern LONG NC_HandleNCHitTest( HWND hwnd, POINT16 pt );
diff --git a/include/ole.h b/include/ole.h
index a85f105..4c42776 100644
--- a/include/ole.h
+++ b/include/ole.h
@@ -208,8 +208,8 @@
 	OLESTATUS	(*Release)(LPOLEOBJECT);
 	OLESTATUS	(*Show)(LPOLEOBJECT,BOOL);
 	OLESTATUS	(*DoVerb)(LPOLEOBJECT,UINT,BOOL,BOOL);
-	OLESTATUS	(*GetData)(LPOLEOBJECT,OLECLIPFORMAT,HANDLE *);
-	OLESTATUS	(*SetData)(LPOLEOBJECT,OLECLIPFORMAT,HANDLE);
+	OLESTATUS	(*GetData)(LPOLEOBJECT,OLECLIPFORMAT,HANDLE16 *);
+	OLESTATUS	(*SetData)(LPOLEOBJECT,OLECLIPFORMAT,HANDLE16);
 	OLESTATUS	(*SetTargetDevice)(LPOLEOBJECT,HGLOBAL16);
 	OLESTATUS	(*SetBounds)(LPOLEOBJECT,LPRECT16);
 	OLESTATUS	(*EnumFormats)(LPOLEOBJECT,OLECLIPFORMAT);
@@ -250,7 +250,7 @@
 } OLEOBJECT;
 
 
-OLESTATUS OleRegisterServer(LPCSTR,LPOLESERVER,LHSERVER *,HINSTANCE,OLE_SERVER_USE);
+OLESTATUS OleRegisterServer(LPCSTR,LPOLESERVER,LHSERVER *,HINSTANCE16,OLE_SERVER_USE);
 OLESTATUS OleUnblockServer(LHSERVER,BOOL *);
 OLESTATUS OleRegisterServerDoc(LHSERVER,LPCSTR,LPOLESERVERDOC,LHSERVERDOC *);
 OLESTATUS OleRegisterClientDoc(LPCSTR,LPCSTR,LONG,LHCLIENTDOC *);
diff --git a/include/task.h b/include/task.h
index f71ce81..b12250f 100644
--- a/include/task.h
+++ b/include/task.h
@@ -72,7 +72,7 @@
     WORD      signal_flags;               /* 24 Flags for signal handler */
     FARPROC16 sighandler WINE_PACKED;     /* 26 Signal handler */
     FARPROC16 userhandler WINE_PACKED;    /* 2a USER signal handler */
-    DWORD     discardhandler WINE_PACKED; /* 2e Handler for GlobalDiscard() */
+    FARPROC16 discardhandler WINE_PACKED; /* 2e Handler for GlobalNotify() */
     DWORD     int0 WINE_PACKED;           /* 32 int 0 (divide by 0) handler */
     DWORD     int2 WINE_PACKED;           /* 36 int 2 (NMI) handler */
     DWORD     int4 WINE_PACKED;           /* 3a int 4 (INTO) handler */
diff --git a/include/wincon.h b/include/wincon.h
index 1c612d0..c295bf7 100644
--- a/include/wincon.h
+++ b/include/wincon.h
@@ -1,5 +1,5 @@
-#ifndef _WINECON_H_
-#define _WINECON_H_
+#ifndef __WINE_WINCON_H
+#define __WINE_WINCON_H
 
 #define CTRL_C_EVENT 0
 #define CTRL_BREAK_EVENT 1
@@ -46,7 +46,7 @@
 } CONSOLE_SCREEN_BUFFER_INFO,*LPCONSOLE_SCREEN_BUFFER_INFO;
 
 
-#endif
+#endif  /* __WINE_WINCON_H */
 
 #if 0
 #ifndef _WINCON_H_
@@ -86,26 +86,6 @@
 
 #if 0
 
-typedef struct
-  {
-    int bKeyDown;
-    WORD wRepeatCount;
-    WORD wVirtualKeyCode;
-    WORD wVirtualScanCode;
-
-    char AsciiChar;
-char pad;
-#if 0
-    union
-      {
-	WCHAR UnicodeChar;
-	CHAR AsciiChar;
-      }
-    uChar;
-#endif
-    DWORD dwControlKeyState;
-  } __attribute__ ((packed)) KEY_EVENT_RECORD;
-
 
 
 #define RIGHT_ALT_PRESSED 0x1
diff --git a/include/windows.h b/include/windows.h
index 28b9c8a..88f1cbb 100644
--- a/include/windows.h
+++ b/include/windows.h
@@ -3211,7 +3211,18 @@
     INT16        xExt;
     INT16        yExt;
     HMETAFILE16  hMF;
-} METAFILEPICT, *LPMETAFILEPICT;
+} METAFILEPICT16, *LPMETAFILEPICT16;
+
+typedef struct
+{
+    INT32        mm;
+    INT32        xExt;
+    INT32        yExt;
+    HMETAFILE32  hMF;
+} METAFILEPICT32, *LPMETAFILEPICT32;
+
+DECL_WINELIB_TYPE(METAFILEPICT);
+DECL_WINELIB_TYPE(LPMETAFILEPICT);
 
 /* Metafile functions */
 #define META_SETBKCOLOR              0x0201
@@ -3622,35 +3633,58 @@
 WORD       AllocSelector(WORD);
 WORD       AllocSelectorArray(WORD);
 INT16      Catch(LPCATCHBUF);
+WORD       ChangeSelector(WORD,WORD);
 INT16      CloseComm(INT16);
+BOOL16     DCHook(HDC16,WORD,DWORD,LPARAM);
+VOID       DirectedYield(HTASK16);
+HGLOBAL16  DirectResAlloc(HINSTANCE16,WORD,UINT16);
 BOOL16     EnableHardwareInput(BOOL16);
 HANDLE16   FarGetOwner(HGLOBAL16);
 VOID       FarSetOwner(HGLOBAL16,HANDLE16);
 VOID       FillWindow(HWND16,HWND16,HDC16,HBRUSH16);
 INT16      FlushComm(INT16,INT16);
 WORD       FreeSelector(WORD);
+void       GlobalFreeAll(HGLOBAL16);
+HGLOBAL16  GlobalLRUNewest(HGLOBAL16);
+HGLOBAL16  GlobalLRUOldest(HGLOBAL16);
+VOID       GlobalNotify(FARPROC16);
 HANDLE16   GetAtomHandle(ATOM);
 DWORD      GetBitmapDimension(HBITMAP16);
+HANDLE16   GetCodeHandle(FARPROC16);
 INT16      GetCommError(INT16,LPCOMSTAT);
 UINT16     GetCommEventMask(INT16,UINT16);
+VOID       GetCodeInfo(FARPROC16,LPVOID);
 HANDLE16   GetCurrentPDB(void);
 HTASK16    GetCurrentTask(void);
+DWORD      GetDCHook(HDC16,FARPROC16*);
 HWND16     GetDesktopHwnd(void);
 HMODULE16  GetExePtr(HANDLE16);
 WORD       GetExeVersion(void);
+INT16      GetInstanceData(HINSTANCE16,WORD,INT16);
 BOOL16     GetModuleName(HINSTANCE16,LPSTR,INT16);
+FARPROC16  GetMouseEventProc(void);
+UINT16     GetNumTasks(void);
 DWORD      GetSelectorBase(WORD);
 DWORD      GetSelectorLimit(WORD);
 HINSTANCE16 GetTaskDS(void);
 HQUEUE16   GetTaskQueue(HTASK16);
 DWORD      GlobalDOSAlloc(DWORD);
 WORD       GlobalDOSFree(WORD);
+WORD       GlobalPageLock(HGLOBAL16);
+WORD       GlobalPageUnlock(HGLOBAL16);
+INT16      InitApp(HINSTANCE16);
 BOOL16     IsSharedSelector(HANDLE16);
+BOOL16     IsTask(HTASK16);
+HTASK16    IsTaskLocked(void);
 BOOL16     LocalInit(HANDLE16,WORD,WORD);
+HTASK16    LockCurrentTask(BOOL16);
 DWORD      OffsetViewportOrg(HDC16,INT16,INT16);
 DWORD      OffsetWindowOrg(HDC16,INT16,INT16);
+VOID       OldYield(void);
 INT16      OpenComm(LPCSTR,UINT16,UINT16);
 VOID       PaintRect(HWND16,HWND16,HDC16,HBRUSH16,const RECT16*);
+VOID       PostEvent(HTASK16);
+WORD       PrestoChangoSelector(WORD,WORD);
 INT16      ReadComm(INT16,LPSTR,INT16);
 DWORD      ScaleViewportExt(HDC16,INT16,INT16,INT16,INT16);
 DWORD      ScaleWindowExt(HDC16,INT16,INT16,INT16,INT16);
@@ -3658,18 +3692,26 @@
 DWORD      SetBitmapDimension(HBITMAP16,INT16,INT16);
 DWORD      SetBrushOrg(HDC16,INT16,INT16);
 UINT16*    SetCommEventMask(INT16,UINT16);
+BOOL16     SetDCHook(HDC16,FARPROC16,DWORD);
 BOOL16     SetDeskPattern(void);
+VOID       SetPriority(HTASK16,INT16);
 WORD       SetSelectorBase(WORD,DWORD);
 WORD       SetSelectorLimit(WORD,DWORD);
+HQUEUE16   SetTaskQueue(HTASK16,HQUEUE16);
 FARPROC16  SetTaskSignalProc(HTASK16,FARPROC16);
 DWORD      SetViewportExt(HDC16,INT16,INT16);
 DWORD      SetViewportOrg(HDC16,INT16,INT16);
 DWORD      SetWindowExt(HDC16,INT16,INT16);
 DWORD      SetWindowOrg(HDC16,INT16,INT16);
+VOID       SwitchStackBack(void);
+VOID       SwitchStackTo(WORD,WORD,WORD);
 INT16      Throw(LPCATCHBUF,INT16);
 INT16      UngetCommChar(INT16,CHAR);
+VOID       UserYield(void);
+BOOL16     WaitEvent(HTASK16);
 INT16      WriteComm(INT16,LPSTR,INT16);
 VOID       hmemcpy(LPVOID,LPCVOID,LONG);
+VOID       Yield(void);
 
 /* Declarations for functions that exist only in Win32 */
 
@@ -3695,9 +3737,12 @@
 #define    GetCommandLine WINELIB_NAME_AW(GetCommandLine)
 BOOL32     GetCommTimeouts(INT32,LPCOMMTIMEOUTS);
 DWORD      GetFileInformationByHandle(HFILE,BY_HANDLE_FILE_INFORMATION*);
+VOID       GetLocalTime(LPSYSTEMTIME);
 DWORD      GetLogicalDrives(void);
 HANDLE32   GetProcessHeap(void);
 HFILE      GetStdHandle(DWORD);
+BOOL32     GetSystemPowerStatus(LPSYSTEM_POWER_STATUS);
+VOID       GetSystemTime(LPSYSTEMTIME);
 VOID       GlobalMemoryStatus(LPMEMORYSTATUS);
 LPVOID     HeapAlloc(HANDLE32,DWORD,DWORD);
 DWORD      HeapCompact(HANDLE32,DWORD);
@@ -3744,6 +3789,9 @@
 BOOL32     SetEndOfFile(HFILE);
 DWORD      SetFilePointer(HFILE,LONG,LPLONG,DWORD);
 BOOL32     SetTimeZoneInformation(const LPTIME_ZONE_INFORMATION);
+BOOL32     SetSystemPowerState(BOOL32,BOOL32);
+BOOL32     SetSystemTime(const SYSTEMTIME*);
+VOID       Sleep(DWORD);
 LPVOID     VirtualAlloc(LPVOID,DWORD,DWORD,DWORD);
 BOOL32     VirtualFree(LPVOID,DWORD,DWORD);
 BOOL32     WriteFile(HFILE,LPVOID,DWORD,LPDWORD,LPOVERLAPPED);
@@ -3805,6 +3853,7 @@
 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);
@@ -3890,6 +3939,9 @@
 BOOL16     ClipCursor16(const RECT16*);
 BOOL32     ClipCursor32(const RECT32*);
 #define    ClipCursor WINELIB_NAME(ClipCursor)
+HMETAFILE16 CloseMetaFile16(HDC16);
+HMETAFILE32 CloseMetaFile32(HDC32);
+#define    CloseMetaFile WINELIB_NAME(CloseMetaFile)
 UINT16     CompareString16(DWORD,DWORD,LPCSTR,DWORD,LPCSTR,DWORD);
 UINT32     CompareString32A(DWORD,DWORD,LPCSTR,DWORD,LPCSTR,DWORD);
 UINT32     CompareString32W(DWORD,DWORD,LPCWSTR,DWORD,LPCWSTR,DWORD);
@@ -3941,6 +3993,10 @@
 HFONT32    CreateFontIndirect32A(const LOGFONT32A*);
 HFONT32    CreateFontIndirect32W(const LOGFONT32W*);
 #define    CreateFontIndirect WINELIB_NAME_AW(CreateFontIndirect)
+HDC16      CreateMetaFile16(LPCSTR);
+HDC32      CreateMetaFile32A(LPCSTR);
+HDC32      CreateMetaFile32W(LPCWSTR);
+#define    CreateMetaFile WINELIB_NAME_AW(CreateMetaFile)
 HRGN16     CreatePolyPolygonRgn16(const POINT16*,const INT16*,INT16,INT16);
 HRGN32     CreatePolyPolygonRgn32(const POINT32*,const INT32*,INT32,INT32);
 #define    CreatePolyPolygonRgn WINELIB_NAME(CreatePolyPolygonRgn)
@@ -3984,6 +4040,9 @@
 BOOL32     DeleteFile32A(LPCSTR);
 BOOL32     DeleteFile32W(LPCWSTR);
 #define    DeleteFile WINELIB_NAME_AW(DeleteFile)
+BOOL16     DeleteMetaFile16(HMETAFILE16);
+BOOL32     DeleteMetaFile32(HMETAFILE32);
+#define    DeleteMetaFile WINELIB_NAME(DeleteMetaFile)
 INT16      DialogBox16(HINSTANCE16,SEGPTR,HWND16,DLGPROC16);
 #define    DialogBox32A(inst,template,owner,func) \
            DialogBoxParam32A(inst,template,owner,func,0)
@@ -4191,6 +4250,12 @@
 UINT32     GetLogicalDriveStrings32A(UINT32,LPSTR);
 UINT32     GetLogicalDriveStrings32W(UINT32,LPWSTR);
 #define    GetLogicalDriveStrings WINELIB_NAME_AW(GetLogicalDriveStrings)
+HWND16     GetNextDlgGroupItem16(HWND16,HWND16,BOOL16);
+HWND32     GetNextDlgGroupItem32(HWND32,HWND32,BOOL32);
+#define    GetNextDlgGroupItem WINELIB_NAME(GetNextDlgGroupItem)
+HWND16     GetNextDlgTabItem16(HWND16,HWND16,BOOL16);
+HWND32     GetNextDlgTabItem32(HWND32,HWND32,BOOL32);
+#define    GetNextDlgTabItem WINELIB_NAME(GetNextDlgTabItem)
 INT16      GetObject16(HANDLE16,INT16,LPVOID);
 INT32      GetObject32A(HANDLE32,INT32,LPVOID);
 INT32      GetObject32W(HANDLE32,INT32,LPVOID);
@@ -4513,6 +4578,12 @@
 BOOL16     Polyline16(HDC16,LPPOINT16,INT16);
 BOOL32     Polyline32(HDC32,LPPOINT32,INT32);
 #define    Polyline WINELIB_NAME(Polyline)
+BOOL16     PostAppMessage16(HTASK16,UINT16,WPARAM16,LPARAM);
+#define    PostAppMessage32A(thread,msg,wparam,lparam) \
+           PostThreadMessage32A((DWORD)(thread),msg,wparam,lparam)
+#define    PostAppMessage32W(thread,msg,wparam,lparam) \
+           PostThreadMessage32W((DWORD)(thread),msg,wparam,lparam)
+#define    PostAppMessage WINELIB_NAME_AW(PostAppMessage)
 BOOL16     PtInRect16(const RECT16*,POINT16);
 BOOL32     PtInRect32(const RECT32*,POINT32);
 #define    PtInRect WINELIB_NAME(PtInRect)
@@ -4694,6 +4765,14 @@
 BOOL16     SetWindowPlacement16(HWND16,const WINDOWPLACEMENT16*);
 BOOL32     SetWindowPlacement32(HWND32,const WINDOWPLACEMENT32*);
 #define    SetWindowPlacement WINELIB_NAME(SetWindowPlacement)
+FARPROC16  SetWindowsHook16(INT16,HOOKPROC16);
+HHOOK      SetWindowsHook32A(INT32,HOOKPROC32);
+HHOOK      SetWindowsHook32W(INT32,HOOKPROC32);
+#define    SetWindowsHook WINELIB_NAME_AW(SetWindowsHook)
+HHOOK      SetWindowsHookEx16(INT16,HOOKPROC16,HINSTANCE16,HTASK16);
+HHOOK      SetWindowsHookEx32A(INT32,HOOKPROC32,HINSTANCE32,DWORD);
+HHOOK      SetWindowsHookEx32W(INT32,HOOKPROC32,HINSTANCE32,DWORD);
+#define    SetWindowsHookEx WINELIB_NAME_AW(SetWindowsHookEx)
 void       SetWindowText16(HWND16,SEGPTR);
 void       SetWindowText32A(HWND32,LPCSTR);
 void       SetWindowText32W(HWND32,LPCWSTR);
@@ -4714,6 +4793,12 @@
 INT16      TransmitCommChar16(INT16,CHAR);
 BOOL32     TransmitCommChar32(INT32,CHAR);
 #define    TransmitCommChar WINELIB_NAME(TransmitCommChar)
+BOOL16     UnhookWindowsHook16(INT16,HOOKPROC16);
+BOOL32     UnhookWindowsHook32(INT32,HOOKPROC32);
+#define    UnhookWindowsHook WINELIB_NAME(UnhookWindowsHook)
+BOOL16     UnhookWindowsHookEx16(HHOOK);
+BOOL32     UnhookWindowsHookEx32(HHOOK);
+#define    UnhookWindowsHookEx WINELIB_NAME(UnhookWindowsHookEx)
 BOOL16     UnionRect16(LPRECT16,const RECT16*,const RECT16*);
 BOOL32     UnionRect32(LPRECT32,const RECT32*,const RECT32*);
 #define    UnionRect WINELIB_NAME(UnionRect)
@@ -4823,30 +4908,14 @@
 typedef UINT32 UINT;
 typedef BOOL32 BOOL;
 typedef WPARAM32 WPARAM;
-typedef HANDLE32 HANDLE;
-typedef HANDLE32 HBITMAP;
-typedef HANDLE32 HBRUSH;
 typedef HANDLE32 HDC;
-typedef HANDLE32 HFONT;
-typedef HANDLE32 HINSTANCE;
-typedef HANDLE32 HMENU;
-typedef HANDLE32 HRGN;
-typedef HANDLE32 HTASK;
 typedef HANDLE32 HWND;
 # else  /* WINELIB32 */
 typedef INT16 INT;
 typedef UINT16 UINT;
 typedef BOOL16 BOOL;
 typedef WPARAM16 WPARAM;
-typedef HANDLE16 HANDLE;
-typedef HANDLE16 HBITMAP;
-typedef HANDLE16 HBRUSH;
 typedef HANDLE16 HDC;
-typedef HANDLE16 HFONT;
-typedef HANDLE16 HINSTANCE;
-typedef HANDLE16 HMENU;
-typedef HANDLE16 HRGN;
-typedef HANDLE16 HTASK;
 typedef HANDLE16 HWND;
 # endif  /* WINELIB32 */
 #endif  /* __WINE__ */
@@ -4882,61 +4951,54 @@
 BOOL       CallMsgFilter(SEGPTR,INT);
 LRESULT    CallNextHookEx(HHOOK,INT,WPARAM,LPARAM);
 BOOL       ChangeClipboardChain(HWND,HWND);
-WORD       ChangeSelector(WORD,WORD);
-INT        CheckMenuItem(HMENU,UINT,UINT);
+INT        CheckMenuItem(HMENU16,UINT,UINT);
 BOOL       Chord(HDC,INT,INT,INT,INT,INT,INT,INT,INT);
 BOOL       CloseClipboard(void);
-HMETAFILE16 CloseMetaFile(HDC);
 void       CloseSound(void);
 BOOL       CloseWindow(HWND);
 int        ConvertRequest(HWND,LPKANJISTRUCT);
 HMETAFILE16 CopyMetaFile(HMETAFILE16,LPCSTR);
 INT        CountClipboardFormats(void);
 INT        CountVoiceNotes(INT);
-HBRUSH     CreateBrushIndirect(const LOGBRUSH16*);
+HBRUSH16   CreateBrushIndirect(const LOGBRUSH16*);
 HDC        CreateCompatibleDC(HDC);
-HCURSOR16  CreateCursor(HANDLE,INT,INT,INT,INT,const BYTE*,const BYTE*);
-HANDLE     CreateCursorIconIndirect(HANDLE,CURSORICONINFO*,const BYTE*,const BYTE*);
+HCURSOR16  CreateCursor(HINSTANCE16,INT,INT,INT,INT,const BYTE*,const BYTE*);
+HGLOBAL16  CreateCursorIconIndirect(HINSTANCE16,CURSORICONINFO*,const BYTE*,const BYTE*);
 HDC        CreateDC(LPCSTR,LPCSTR,LPCSTR,const DEVMODE*);
-HBRUSH     CreateDIBPatternBrush(HGLOBAL16,UINT);
-HBITMAP    CreateDIBitmap(HDC,BITMAPINFOHEADER*,DWORD,LPVOID,BITMAPINFO*,UINT);
-HBRUSH     CreateHatchBrush(INT,COLORREF);
+HBRUSH16   CreateDIBPatternBrush(HGLOBAL16,UINT);
+HBITMAP16  CreateDIBitmap(HDC,BITMAPINFOHEADER*,DWORD,LPVOID,BITMAPINFO*,UINT);
+HBRUSH16   CreateHatchBrush(INT,COLORREF);
 HDC        CreateIC(LPCSTR,LPCSTR,LPCSTR,const DEVMODE*);
-HICON16    CreateIcon(HINSTANCE,INT,INT,BYTE,BYTE,const BYTE*,const BYTE*);
-HMENU      CreateMenu(void);
-HDC        CreateMetaFile(LPCSTR);
+HICON16    CreateIcon(HINSTANCE16,INT,INT,BYTE,BYTE,const BYTE*,const BYTE*);
+HMENU16    CreateMenu(void);
 HPALETTE16 CreatePalette(const LOGPALETTE*);
-HBRUSH     CreatePatternBrush(HBITMAP);
+HBRUSH16   CreatePatternBrush(HBITMAP16);
 HPEN16     CreatePen(INT,INT,COLORREF);
 HPEN16     CreatePenIndirect(const LOGPEN16*);
-HMENU      CreatePopupMenu(void);
-HBRUSH     CreateSolidBrush(COLORREF);
-void       DebugBreak(void);
+HMENU16    CreatePopupMenu(void);
+HBRUSH16   CreateSolidBrush(COLORREF);
 DWORD      DefHookProc(short,WORD,DWORD,HHOOK*);
 HDWP16     DeferWindowPos(HDWP16,HWND,HWND,INT,INT,INT,INT,UINT);
 ATOM       DeleteAtom(ATOM);
 BOOL       DeleteDC(HDC);
-BOOL       DeleteMenu(HMENU,UINT,UINT);
-BOOL       DeleteMetaFile(HMETAFILE16);
+BOOL       DeleteMenu(HMENU16,UINT,UINT);
 BOOL       DeleteObject(HGDIOBJ16);
 BOOL       DestroyCursor(HCURSOR16);
 BOOL       DestroyIcon(HICON16);
-BOOL       DestroyMenu(HMENU);
+BOOL       DestroyMenu(HMENU16);
 BOOL       DestroyWindow(HWND);
-HANDLE     DirectResAlloc(HANDLE,WORD,WORD);
-void       DirectedYield(HTASK);
 LONG       DispatchMessage(const MSG16*);
 INT        DlgDirList(HWND,SEGPTR,INT,INT,UINT);
 BOOL       DlgDirSelect(HWND,LPSTR,INT);
 BOOL       DlgDirSelectComboBox(HWND,LPSTR,INT);
 BOOL16     DragDetect(HWND16,POINT16);
-DWORD      DragObject(HWND, HWND, WORD, HANDLE, WORD, HCURSOR16);
+DWORD      DragObject(HWND, HWND, WORD, HANDLE16, WORD, HCURSOR16);
 BOOL       DrawIcon(HDC,INT,INT,HICON16);
 void       DrawMenuBar(HWND);
 DWORD      DumpIcon(SEGPTR,WORD*,SEGPTR*,SEGPTR*);
 BOOL       Ellipse(HDC,INT,INT,INT,INT);
 BOOL       EmptyClipboard(void);
-BOOL       EnableMenuItem(HMENU,UINT,UINT);
+BOOL       EnableMenuItem(HMENU16,UINT,UINT);
 BOOL       EnableWindow(HWND,BOOL);
 BOOL       EndDeferWindowPos(HDWP16);
 UINT16     EnumClipboardFormats(UINT16);
@@ -4948,15 +5010,15 @@
 int        ExcludeClipRect(HDC,short,short,short,short);
 int        ExcludeVisRect(HDC,short,short,short,short);
 BOOL       ExitWindows(DWORD,WORD);
-HICON16    ExtractIcon(HINSTANCE,LPCSTR,WORD);
+HICON16    ExtractIcon(HINSTANCE16,LPCSTR,WORD);
 void       FatalAppExit(UINT,LPCSTR);
 void       FatalExit(int);
-BOOL       FillRgn(HDC,HRGN,HBRUSH);
+BOOL       FillRgn(HDC,HRGN32,HBRUSH16);
 ATOM       FindAtom(SEGPTR);
-HINSTANCE  FindExecutable(LPCSTR,LPCSTR,LPSTR);
+HINSTANCE16 FindExecutable(LPCSTR,LPCSTR,LPSTR);
 BOOL       FlashWindow(HWND,BOOL);
-BOOL       FrameRgn(HDC,HRGN,HBRUSH,int,int);
-void       FreeLibrary(HANDLE);
+BOOL       FrameRgn(HDC,HRGN32,HBRUSH16,int,int);
+void       FreeLibrary(HINSTANCE16);
 UINT       GDIRealizePalette(HDC);
 HPALETTE16 GDISelectPalette(HDC,HPALETTE16,WORD);
 HWND       GetActiveWindow(void);
@@ -4968,21 +5030,18 @@
 DWORD      GetBrushOrg(HDC);
 BOOL       GetCharABCWidths(HDC,UINT,UINT,LPABC16);
 BOOL       GetCharWidth(HDC,WORD,WORD,LPINT16);
-HRGN       GetClipRgn(HDC);
-HANDLE     GetClipboardData(WORD);
+HRGN32     GetClipRgn(HDC);
+HANDLE16   GetClipboardData(WORD);
 int        GetClipboardFormatName(WORD,LPSTR,short);
 HWND       GetClipboardOwner(void);
 HWND       GetClipboardViewer(void);
-HANDLE     GetCodeHandle(FARPROC16);
-void       GetCodeInfo(FARPROC16,LPVOID);
-HBRUSH     GetControlBrush(HWND,HDC,WORD);
+HBRUSH16   GetControlBrush(HWND,HDC,WORD);
 DWORD      GetCurrentPosition(HDC);
 DWORD      GetCurrentTime(void);
 HCURSOR16  GetCursor(void);
-DWORD      GetDCHook(HDC,FARPROC16*);
 DWORD      GetDCOrg(HDC);
 HDC        GetDCState(HDC);
-int        GetDIBits(HDC,HANDLE,WORD,WORD,LPSTR,LPBITMAPINFO,WORD);
+int        GetDIBits(HDC,HBITMAP16,WORD,WORD,LPSTR,LPBITMAPINFO,WORD);
 SEGPTR     GetDOSEnvironment(void);
 int        GetDeviceCaps(HDC,WORD);
 DWORD      GetDialogBaseUnits(void);
@@ -4993,7 +5052,6 @@
 DWORD      GetFreeSpace(UINT16);
 DWORD      GetHeapSpaces(HMODULE16);
 BOOL       GetInputState(void);
-int        GetInstanceData(HANDLE,WORD,int);
 int        GetKBCodePage(void);
 int        GetKerningPairs(HDC,int,LPKERNINGPAIR16);
 int        GetKeyNameText(LONG,LPSTR,int);
@@ -5001,30 +5059,25 @@
 void       GetKeyboardState(BYTE*);
 int        GetKeyboardType(int);
 HWND       GetLastActivePopup(HWND);
-VOID       GetLocalTime(LPSYSTEMTIME); /* Win32 */
 WORD       GetMapMode(HDC);
-HMENU      GetMenu(HWND);
+HMENU16    GetMenu(HWND);
 DWORD      GetMenuCheckMarkDimensions(void);
-INT        GetMenuItemCount(HMENU);
-UINT       GetMenuItemID(HMENU,int);
-UINT       GetMenuState(HMENU,UINT,UINT);
-int        GetMenuString(HMENU,UINT,LPSTR,short,UINT);
+INT        GetMenuItemCount(HMENU16);
+UINT       GetMenuItemID(HMENU16,int);
+UINT       GetMenuState(HMENU16,UINT,UINT);
+int        GetMenuString(HMENU16,UINT,LPSTR,short,UINT);
 BOOL       GetMessage(SEGPTR,HWND,UINT,UINT);
 LONG       GetMessageExtraInfo(void);
 DWORD      GetMessagePos(void);
 LONG       GetMessageTime(void);
 HMETAFILE16 GetMetaFile(LPSTR);
-HANDLE     GetMetaFileBits(HMETAFILE16);
-int        GetModuleFileName(HANDLE,LPSTR,short);
+HGLOBAL16  GetMetaFileBits(HMETAFILE16);
+INT16      GetModuleFileName(HINSTANCE16,LPSTR,INT16);
 HMODULE16  GetModuleHandle(LPCSTR);
-int        GetModuleUsage(HANDLE);
-FARPROC16  GetMouseEventProc(void);
+INT16      GetModuleUsage(HINSTANCE16);
 DWORD      GetNearestColor(HDC,DWORD);
 WORD       GetNearestPaletteIndex(HPALETTE16,DWORD);
-HWND       GetNextDlgGroupItem(HWND,HWND,BOOL);
-HWND       GetNextDlgTabItem(HWND,HWND,BOOL);
 HWND       GetNextWindow(HWND,WORD);
-WORD       GetNumTasks(void);
 HWND       GetOpenClipboardWindow(void);
 WORD       GetPaletteEntries(HPALETTE16,WORD,WORD,LPPALETTEENTRY);
 DWORD      GetPixel(HDC,short,short);
@@ -5038,15 +5091,13 @@
 BOOL       GetRasterizerCaps(LPRASTERIZER_STATUS,UINT);
 WORD       GetROP2(HDC);
 WORD       GetRelAbs(HDC);
-HANDLE     GetStockObject(int);
+HGDIOBJ16  GetStockObject(INT16);
 WORD       GetStretchBltMode(HDC);
-HMENU      GetSubMenu(HMENU,short);
-HMENU      GetSystemMenu(HWND,BOOL);
+HMENU16    GetSubMenu(HMENU16,short);
+HMENU16    GetSystemMenu(HWND,BOOL);
 int        GetSystemMetrics(WORD);
 WORD       GetSystemPaletteEntries(HDC,WORD,WORD,LPPALETTEENTRY);
 WORD       GetSystemPaletteUse(HDC);
-BOOL       GetSystemPowerStatus(LPSYSTEM_POWER_STATUS);
-VOID       GetSystemTime(LPSYSTEMTIME); /* Win32 */
 DWORD      GetTabbedTextExtent(HDC,LPSTR,int,int,LPINT16);
 BYTE       GetTempDrive(BYTE);
 WORD       GetTextAlign(HDC);
@@ -5067,43 +5118,34 @@
 int        GetWindowTextLength(HWND);
 ATOM       GlobalDeleteAtom(ATOM);
 void       GlobalFix(HGLOBAL16);
-void       GlobalFreeAll(HGLOBAL16);
-HGLOBAL16  GlobalLRUNewest(HGLOBAL16);
-HGLOBAL16  GlobalLRUOldest(HGLOBAL16);
-void       GlobalNotify(FARPROC16);
-WORD       GlobalPageLock(HGLOBAL16);
-WORD       GlobalPageUnlock(HGLOBAL16);
 BOOL16     GlobalUnWire(HGLOBAL16);
 void       GlobalUnfix(HGLOBAL16);
 SEGPTR     GlobalWire(HGLOBAL16);
-BOOL       GrayString(HDC,HBRUSH,GRAYSTRINGPROC16,LPARAM,INT,INT,INT,INT,INT);
-BOOL       HiliteMenuItem(HWND,HMENU,UINT,UINT);
+BOOL       GrayString(HDC,HBRUSH16,GRAYSTRINGPROC16,LPARAM,INT,INT,INT,INT,INT);
+BOOL       HiliteMenuItem(HWND,HMENU16,UINT,UINT);
 BOOL       InSendMessage(void);
 WORD       InitAtomTable(WORD);
-HRGN       InquireVisRgn(HDC);
+HRGN32     InquireVisRgn(HDC);
 int        IntersectClipRect(HDC,short,short,short,short);
 int        IntersectVisRect(HDC,short,short,short,short);
 void       InvalidateRgn(HWND32,HRGN32,BOOL32);
-BOOL       InvertRgn(HDC,HRGN);
+BOOL       InvertRgn(HDC,HRGN32);
 BOOL       IsChild(HWND,HWND);
 BOOL       IsClipboardFormatAvailable(WORD);
 BOOL       IsDialogMessage(HWND,LPMSG16);
 WORD       IsDlgButtonChecked(HWND,WORD);
-BOOL       IsGDIObject(HANDLE);
+BOOL16     IsGDIObject(HGDIOBJ16);
 BOOL       IsIconic(HWND);
-BOOL       IsMenu(HMENU);
-BOOL       IsTask(HTASK);
-HTASK      IsTaskLocked(void);
+BOOL       IsMenu(HMENU16);
 BOOL       IsValidMetaFile(HMETAFILE16);
 BOOL       IsWindowEnabled(HWND);
 BOOL       IsWindowVisible(HWND);
 BOOL       IsZoomed(HWND);
-void       LimitEmsPages(DWORD);
 BOOL       LineTo(HDC,short,short);
-HANDLE     LoadLibrary(LPCSTR);
-HANDLE     LoadModule(LPCSTR,LPVOID);
+HINSTANCE16 LoadLibrary(LPCSTR);
+HINSTANCE16 LoadModule(LPCSTR,LPVOID);
 FARPROC16  LocalNotify(FARPROC16);
-HMENU      LookupMenuHandle(HMENU,INT);
+HMENU16    LookupMenuHandle(HMENU16,INT);
 WORD       MapVirtualKey(WORD,WORD);
 void       MessageBeep(WORD);
 int        MessageBox(HWND,LPCSTR,LPCSTR,WORD);
@@ -5113,21 +5155,17 @@
 BOOL       OemToAnsi(LPCSTR,LPSTR);
 void       OemToAnsiBuff(LPCSTR,LPSTR,INT);
 int        OffsetClipRgn(HDC,short,short);
-void       OldYield(void);
 BOOL       OpenClipboard(HWND);
 BOOL       OpenIcon(HWND);
 int        OpenSound(void);
 void       OutputDebugString(LPCSTR);
-BOOL       PaintRgn(HDC,HRGN);
+BOOL       PaintRgn(HDC,HRGN32);
 BOOL       PatBlt(HDC,short,short,short,short,DWORD);
 BOOL       Pie(HDC,INT,INT,INT,INT,INT,INT,INT,INT);
 BOOL       PlayMetaFile(HDC,HMETAFILE16);
 void       PlayMetaFileRecord(HDC,LPHANDLETABLE16,LPMETARECORD,WORD);
-BOOL       PostAppMessage(HANDLE,WORD,WORD,LONG);
-void       PostEvent(HTASK);
 BOOL       PostMessage(HWND,WORD,WORD,LONG);
 void       PostQuitMessage(INT);
-WORD       PrestoChangoSelector(WORD,WORD);
 void       ProfClear(void);
 void       ProfFinish(void);
 void       ProfFlush(void);
@@ -5141,7 +5179,7 @@
 BOOL       Rectangle(HDC,INT,INT,INT,INT);
 WORD       RegisterClipboardFormat(LPCSTR);
 BOOL       RemoveFontResource(LPSTR);
-BOOL       RemoveMenu(HMENU,UINT,UINT);
+BOOL       RemoveMenu(HMENU16,UINT,UINT);
 void       ReplyMessage(LRESULT);
 HDC        ResetDC(HDC,LPVOID);
 BOOL       ResizePalette(HPALETTE16,UINT);
@@ -5149,25 +5187,24 @@
 int        RestoreVisRgn(HDC);
 BOOL       RoundRect(HDC,INT,INT,INT,INT,INT,INT);
 int        SaveDC(HDC);
-HRGN       SaveVisRgn(HDC);
+HRGN32     SaveVisRgn(HDC);
 void       ScrollChildren(HWND,UINT,WPARAM,LPARAM);
-BOOL       ScrollDC(HDC,short,short,LPRECT16,LPRECT16,HRGN,LPRECT16);
+BOOL       ScrollDC(HDC,short,short,LPRECT16,LPRECT16,HRGN32,LPRECT16);
 void       ScrollWindow(HWND,short,short,LPRECT16,LPRECT16);
-int        ScrollWindowEx(HWND,short,short,LPRECT16,LPRECT16,HRGN,LPRECT16,WORD);
-int        SelectClipRgn(HDC,HRGN);
-HANDLE     SelectObject(HDC,HANDLE);
+int        ScrollWindowEx(HWND,short,short,LPRECT16,LPRECT16,HRGN32,LPRECT16,WORD);
+int        SelectClipRgn(HDC,HRGN32);
+HGDIOBJ16  SelectObject(HDC,HGDIOBJ16);
 HPALETTE16 SelectPalette(HDC,HPALETTE16,BOOL);
-int        SelectVisRgn(HDC,HRGN);
+int        SelectVisRgn(HDC,HRGN32);
 HWND       SetActiveWindow(HWND);
 WORD       SetBkMode(HDC,WORD);
-HANDLE     SetClipboardData(WORD,HANDLE);
+HANDLE16   SetClipboardData(WORD,HANDLE16);
 HWND       SetClipboardViewer(HWND);
 void       SetConvertHook(BOOL);
 BOOL       SetConvertParams(int,int);
 BOOL32     SetCurrentDirectory(LPCSTR);
 HCURSOR16  SetCursor(HCURSOR16);
 void       SetCursorPos(short,short);
-BOOL       SetDCHook(HDC,FARPROC16,DWORD);
 void       SetDCState(HDC,HDC);
 void       SetDoubleClickTime(WORD);
 int        SetEnvironment(LPCSTR,LPCSTR,WORD);
@@ -5176,25 +5213,22 @@
 void       SetKeyboardState(BYTE*);
 WORD       SetMapMode(HDC,WORD);
 DWORD      SetMapperFlags(HDC,DWORD);
-BOOL       SetMenu(HWND,HMENU);
-BOOL       SetMenuItemBitmaps(HMENU,UINT,UINT,HBITMAP,HBITMAP);
+BOOL       SetMenu(HWND,HMENU16);
+BOOL       SetMenuItemBitmaps(HMENU16,UINT,UINT,HBITMAP16,HBITMAP16);
 BOOL       SetMessageQueue(int);
-HMETAFILE16 SetMetaFileBits(HANDLE);
+HMETAFILE16 SetMetaFileBits(HGLOBAL16);
 WORD       SetPaletteEntries(HPALETTE16,WORD,WORD,LPPALETTEENTRY);
 HWND       SetParent(HWND,HWND);
 COLORREF   SetPixel(HDC,short,short,COLORREF);
 WORD       SetPolyFillMode(HDC,WORD);
 WORD       SetROP2(HDC,WORD);
 WORD       SetRelAbs(HDC,WORD);
-FARPROC16  SetResourceHandler(HANDLE,LPSTR,FARPROC16);
+FARPROC16  SetResourceHandler(HINSTANCE16,LPSTR,FARPROC16);
 int        SetSoundNoise(int,int);
 WORD       SetStretchBltMode(HDC,WORD);
 LONG       SetSwapAreaSize(WORD);
 void       SetSysColors(int,LPINT16,COLORREF*);
 WORD       SetSystemPaletteUse(HDC,WORD);
-BOOL       SetSystemPowerState(BOOL, BOOL);
-BOOL       SetSystemTime(const SYSTEMTIME*);
-HQUEUE16   SetTaskQueue(HTASK16,HQUEUE16);
 WORD       SetTextAlign(HDC,WORD);
 short      SetTextCharacterExtra(HDC,short);
 short      SetTextJustification(HDC,short,short);
@@ -5206,55 +5240,42 @@
 int        SetVoiceThreshold(int,int);
 BOOL       SetWinDebugInfo(LPWINDEBUGINFO);
 BOOL       SetWindowPos(HWND,HWND,INT,INT,INT,INT,WORD);
-FARPROC16  SetWindowsHook(short,HOOKPROC16);
-HHOOK      SetWindowsHookEx(INT16,HOOKPROC16,HINSTANCE,HTASK);
-HINSTANCE  ShellExecute(HWND,LPCSTR,LPCSTR,LPSTR,LPCSTR,INT);
+HINSTANCE16 ShellExecute(HWND,LPCSTR,LPCSTR,LPSTR,LPCSTR,INT);
 int        ShowCursor(BOOL);
 void       ShowOwnedPopups(HWND,BOOL);
 BOOL       ShowWindow(HWND,int);
 DWORD      SizeofResource(HMODULE16,HRSRC16);
-VOID       Sleep(DWORD); /* Win32 */
 int        StartSound(void);
 int        StopSound(void);
 BOOL       StretchBlt(HDC,short,short,short,short,HDC,short,short,short,short,DWORD);
 int        StretchDIBits(HDC,WORD,WORD,WORD,WORD,WORD,WORD,WORD,WORD,LPSTR,LPBITMAPINFO,WORD,DWORD);
 BOOL       SwapMouseButton(BOOL);
 void       SwapRecording(WORD);
-void       SwitchStackBack(void);
-void       SwitchStackTo(WORD,WORD,WORD);
 int        SyncAllVoices(void);
 BOOL       SystemParametersInfo(UINT,UINT,LPVOID,UINT);
 LONG       TabbedTextOut(HDC,short,short,LPSTR,short,short,LPINT16,short);
 int        ToAscii(WORD,WORD,LPSTR,LPVOID,WORD);
-int        TranslateAccelerator(HWND,HANDLE,LPMSG16);
+INT16      TranslateAccelerator(HWND,HACCEL16,LPMSG16);
 BOOL       TranslateMDISysAccel(HWND,LPMSG16);
 BOOL       TranslateMessage(LPMSG16);
-BOOL       UnhookWindowsHook(short,HOOKPROC16);
-BOOL       UnhookWindowsHookEx(HHOOK);
-BOOL       UnrealizeObject(HBRUSH);
+BOOL       UnrealizeObject(HGDIOBJ16);
 int        UpdateColors(HDC);
-void       UpdateWindow(HWND32);
-void       UserYield(void);
 void       ValidateCodeSegments(void);
 LPSTR      ValidateFreeSpaces(void);
 void       ValidateRgn(HWND32,HRGN32);
 WORD       VkKeyScan(WORD);
-SEGPTR     WIN16_LockResource(HANDLE);
-BOOL       WaitEvent(HTASK);
+SEGPTR     WIN16_LockResource(HGLOBAL16);
 void       WaitMessage(void);
 int        WaitSoundState(int);
-HANDLE     WinExec(LPSTR,WORD);
+HINSTANCE16 WinExec(LPSTR,WORD);
 BOOL       WinHelp(HWND,LPSTR,WORD,DWORD);
 void       WriteOutProfiles(void);
 BOOL       WritePrivateProfileString(LPCSTR,LPCSTR,LPCSTR,LPCSTR);
 BOOL       WriteProfileString(LPCSTR,LPCSTR,LPCSTR);
-void       Yield(void);
 
 #endif  /* NO_TRANSITION_TYPES */
 
-#ifdef WINELIB
 #define WINELIB_UNIMP(x) fprintf (stderr, "WineLib: Unimplemented %s\n", x)
-#endif
 
 #ifdef __cplusplus
 }
diff --git a/include/winsock.h b/include/winsock.h
index 0fb3202..9548229 100644
--- a/include/winsock.h
+++ b/include/winsock.h
@@ -198,20 +198,20 @@
 INT WSAUnhookBlockingHook(void);
 FARPROC16 WSASetBlockingHook(FARPROC16 lpBlockFunc);
 INT WSACancelBlockingCall(void);
-HANDLE WSAAsyncGetServByName(HWND hWnd, u_int wMsg,
-                             LPCSTR name, LPCSTR proto,
-                             LPSTR buf, INT buflen);
-HANDLE WSAAsyncGetServByPort(HWND hWnd, u_int wMsg, INT port,
-                             LPCSTR proto, LPSTR buf, INT buflen);
-HANDLE WSAAsyncGetProtoByName(HWND hWnd, u_int wMsg,
-                              LPCSTR name, LPSTR buf, INT buflen);
-HANDLE WSAAsyncGetProtoByNumber(HWND hWnd, u_int wMsg,
-                                INT number, LPSTR buf, INT buflen);
-HANDLE WSAAsyncGetHostByName(HWND hWnd, u_int wMsg,
-                             LPCSTR name, LPSTR buf, INT buflen);
-HANDLE WSAAsyncGetHostByAddr(HWND hWnd, u_int wMsg, LPCSTR addr, INT len,
-                             INT type, LPSTR buf, INT buflen);
-INT WSACancelAsyncRequest(HANDLE hAsyncTaskHandle);
+HANDLE16 WSAAsyncGetServByName(HWND hWnd, u_int wMsg,
+                               LPCSTR name, LPCSTR proto,
+                               LPSTR buf, INT buflen);
+HANDLE16 WSAAsyncGetServByPort(HWND hWnd, u_int wMsg, INT port,
+                               LPCSTR proto, LPSTR buf, INT buflen);
+HANDLE16 WSAAsyncGetProtoByName(HWND hWnd, u_int wMsg,
+                                LPCSTR name, LPSTR buf, INT buflen);
+HANDLE16 WSAAsyncGetProtoByNumber(HWND hWnd, u_int wMsg,
+                                  INT number, LPSTR buf, INT buflen);
+HANDLE16 WSAAsyncGetHostByName(HWND hWnd, u_int wMsg,
+                               LPCSTR name, LPSTR buf, INT buflen);
+HANDLE16 WSAAsyncGetHostByAddr(HWND hWnd, u_int wMsg, LPCSTR addr, INT len,
+                               INT type, LPSTR buf, INT buflen);
+INT WSACancelAsyncRequest(HANDLE16 hAsyncTaskHandle);
 INT WSAAsyncSelect(SOCKET s, HWND hWnd, u_int wMsg, long lEvent);
 
 #ifdef __cplusplus
diff --git a/include/wintypes.h b/include/wintypes.h
index 503bcaa..8565ad8 100644
--- a/include/wintypes.h
+++ b/include/wintypes.h
@@ -12,7 +12,8 @@
 #endif
 
 #if !defined(__WINE__) && !defined(WINELIB)
-/* If we are not compiling Wine, then we are using Winelib */
+/* If we are not compiling Wine, then we should be using Winelib */
+#error You must use 'configure --with-library' to build Winelib programs
 #define WINELIB
 #endif
 
diff --git a/ipc/Makefile.in b/ipc/Makefile.in
index cd5ec96..3d56314 100644
--- a/ipc/Makefile.in
+++ b/ipc/Makefile.in
@@ -1,6 +1,9 @@
-DEFS   = -D__WINE__
-TOPSRC = @top_srcdir@
-MODULE = ipc
+DEFS      = -D__WINE__
+TOPSRCDIR = @top_srcdir@
+TOPOBJDIR = ..
+SRCDIR    = @srcdir@
+VPATH     = @srcdir@
+MODULE    = ipc
 
 C_SRCS = \
 	bit_array.c \
diff --git a/library/Makefile.in b/library/Makefile.in
index ed3aade..37edb7b 100644
--- a/library/Makefile.in
+++ b/library/Makefile.in
@@ -1,6 +1,9 @@
-DEFS   = -D__WINE__
-TOPSRC = @top_srcdir@
-MODULE = library
+DEFS      = -D__WINE__
+TOPSRCDIR = @top_srcdir@
+TOPOBJDIR = ..
+SRCDIR    = @srcdir@
+VPATH     = @srcdir@
+MODULE    = library
 
 C_SRCS = \
 	arch.c \
diff --git a/library/libres.c b/library/libres.c
index 2093ee9..c3964ec 100644
--- a/library/libres.c
+++ b/library/libres.c
@@ -32,7 +32,7 @@
 /**********************************************************************
  *	    LIBRES_FindResource    
  */
-HRSRC32 LIBRES_FindResource( HINSTANCE hModule, LPCSTR name, LPCSTR type )
+HRSRC32 LIBRES_FindResource( HINSTANCE32 hModule, LPCSTR name, LPCSTR type )
 {
   int nameid=0,typeid;
   ResListE* ResBlock;
@@ -81,7 +81,7 @@
 /**********************************************************************
  *	    LIBRES_LoadResource    
  */
-HGLOBAL32 LIBRES_LoadResource( HINSTANCE hModule, HRSRC32 hRsrc )
+HGLOBAL32 LIBRES_LoadResource( HINSTANCE32 hModule, HRSRC32 hRsrc )
 {
   return (HGLOBAL32)(((struct resource*)hRsrc)->bytes);
 }
@@ -108,7 +108,7 @@
 /**********************************************************************
  *	    LIBRES_AccessResource    
  */
-INT LIBRES_AccessResource( HINSTANCE hModule, HRSRC32 hRsrc )
+INT32 LIBRES_AccessResource( HINSTANCE32 hModule, HRSRC32 hRsrc )
 {
   WINELIB_UNIMP("LIBRES_AccessResource()");
   return -1; /* Obsolete in Win32 */
@@ -118,7 +118,7 @@
 /**********************************************************************
  *	    LIBRES_SizeofResource    
  */
-DWORD LIBRES_SizeofResource( HINSTANCE hModule, HRSRC32 hRsrc )
+DWORD LIBRES_SizeofResource( HINSTANCE32 hModule, HRSRC32 hRsrc )
 {
   return (DWORD)(((struct resource*)hRsrc)->size);
 }
@@ -127,7 +127,7 @@
 /**********************************************************************
  *	    LIBRES_AllocResource    
  */
-HGLOBAL32 LIBRES_AllocResource( HINSTANCE hModule, HRSRC32 hRsrc, DWORD size )
+HGLOBAL32 LIBRES_AllocResource( HINSTANCE32 hModule, HRSRC32 hRsrc, DWORD size)
 {
   WINELIB_UNIMP("LIBRES_AllocResource()");
   return 0; /* Obsolete in Win32 */
diff --git a/library/winmain.c b/library/winmain.c
index f048062..2ee677c 100644
--- a/library/winmain.c
+++ b/library/winmain.c
@@ -7,14 +7,13 @@
 extern int MAIN_Init(void);
 extern BOOL WIDGETS_Init(void);
 extern BOOL WIN_CreateDesktopWindow(void);
-extern int WinMain(HINSTANCE,HINSTANCE,LPSTR,int);
+extern int WinMain(HINSTANCE16,HINSTANCE16,LPSTR,int);
 extern void TASK_Reschedule(void);
-extern int USER_InitApp(HINSTANCE);
 
 
 int _WinMain (int argc, char *argv [])
 {
-  HINSTANCE hInstance;
+  HINSTANCE16 hInstance;
   LPSTR lpszCmdParam;
   int i, len = 0;
 
@@ -29,7 +28,7 @@
   if(!MAIN_Init()) return 0; /* JBP: Needed for DosDrives[] structure, etc. */
   hInstance = WinExec( *argv, SW_SHOWNORMAL );
   TASK_Reschedule();
-  USER_InitApp( hInstance );
+  InitApp( hInstance );
 
 #ifdef WINELIBDLL
   return (int)hInstance;
diff --git a/libtest/Makefile.in b/libtest/Makefile.in
index fe7dadb..6f050d6 100644
--- a/libtest/Makefile.in
+++ b/libtest/Makefile.in
@@ -1,7 +1,10 @@
-TOPSRC   = @top_srcdir@
-MODULE   = none
-PROGRAMS = hello hello2 hello3 hello4 new rolex
-ALL_LIBS = $(WINELIB) $(X_LIBS) $(XPM_LIB) $(XLIB) $(LDLIBS)
+TOPSRCDIR = @top_srcdir@
+TOPOBJDIR = ..
+SRCDIR    = @srcdir@
+VPATH     = @srcdir@
+MODULE    = none
+PROGRAMS  = hello hello2 hello3 hello4 new rolex
+ALL_LIBS  = $(WINELIB) $(X_LIBS) $(XPM_LIB) $(XLIB) $(LDLIBS)
 
 C_SRCS = \
 	hello.c \
diff --git a/loader/Makefile.in b/loader/Makefile.in
index ba99e39..2e38a37 100644
--- a/loader/Makefile.in
+++ b/loader/Makefile.in
@@ -1,6 +1,9 @@
-DEFS   = -D__WINE__
-TOPSRC = @top_srcdir@
-MODULE = loader
+DEFS      = -D__WINE__
+TOPSRCDIR = @top_srcdir@
+TOPOBJDIR = ..
+SRCDIR    = @srcdir@
+VPATH     = @srcdir@
+MODULE    = loader
 
 C_SRCS = \
 	builtin.c \
diff --git a/loader/main.c b/loader/main.c
index 1501255..ada2934 100644
--- a/loader/main.c
+++ b/loader/main.c
@@ -166,7 +166,7 @@
 int _WinMain(int argc, char **argv)
 {
     int i;
-    HANDLE handle;
+    HINSTANCE16 handle;
 
     if (!MAIN_Init()) return 0;
 
diff --git a/loader/module.c b/loader/module.c
index c5ec62b..6dadc3f 100644
--- a/loader/module.c
+++ b/loader/module.c
@@ -27,13 +27,13 @@
 #include "debug.h"
 #include "callback.h"
 
-extern HINSTANCE PE_LoadModule( int fd, OFSTRUCT *ofs, LOADPARAMS* params );
+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 HANDLE hInitialStack32 = 0;
+static HGLOBAL16 hInitialStack32 = 0;
 #endif
 
 
@@ -335,7 +335,7 @@
     SEGTABLEENTRY *pSegment;
     NE_MODULE *pModule;
     int minsize;
-    HINSTANCE hNewInstance, hPrevInstance;
+    HINSTANCE16 hNewInstance, hPrevInstance;
 
     if (!(pModule = MODULE_GetPtr( hModule ))) return 0;
     if (pModule->dgroup == 0) return hModule;
@@ -997,10 +997,10 @@
 /**********************************************************************
  *	    LoadModule    (KERNEL.45)
  */
-HINSTANCE LoadModule( LPCSTR name, LPVOID paramBlock )
+HINSTANCE16 LoadModule( LPCSTR name, LPVOID paramBlock )
 {
     HMODULE16 hModule;
-    HANDLE hInstance, hPrevInstance;
+    HINSTANCE16 hInstance, hPrevInstance;
     NE_MODULE *pModule;
     LOADPARAMS *params = (LOADPARAMS *)paramBlock;
     OFSTRUCT ofs;
@@ -1257,7 +1257,7 @@
  */
 HMODULE16 WIN16_GetModuleHandle( SEGPTR name )
 {
-    if (HIWORD(name) == 0) return GetExePtr( (HANDLE)name );
+    if (HIWORD(name) == 0) return GetExePtr( (HINSTANCE16)name );
     return MODULE_FindModule( PTR_SEG_TO_LIN(name) );
 }
 
@@ -1270,7 +1270,7 @@
 /**********************************************************************
  *	    GetModuleUsage    (KERNEL.48)
  */
-int GetModuleUsage( HANDLE hModule )
+INT16 GetModuleUsage( HINSTANCE16 hModule )
 {
     NE_MODULE *pModule;
 
@@ -1285,7 +1285,7 @@
 /**********************************************************************
  *	    GetModuleFileName    (KERNEL.49)
  */
-int GetModuleFileName( HANDLE hModule, LPSTR lpFileName, short nSize )
+INT16 GetModuleFileName( HINSTANCE16 hModule, LPSTR lpFileName, INT16 nSize )
 {
     NE_MODULE *pModule;
 
@@ -1312,14 +1312,14 @@
 /***********************************************************************
  *           LoadLibrary   (KERNEL.95)
  */
-HANDLE LoadLibrary( LPCSTR libname )
+HINSTANCE16 LoadLibrary( LPCSTR libname )
 {
-    HANDLE handle;
+    HINSTANCE16 handle;
 
     if (__winelib)
     {
         fprintf( stderr, "LoadLibrary not supported in Winelib\n" );
-        return (HANDLE)0;
+        return 0;
     }
     dprintf_module( stddeb, "LoadLibrary: (%08x) %s\n", (int)libname, libname);
 
@@ -1328,7 +1328,7 @@
     if ((handle = MODULE_FindModule( libname )) != 0) return handle;
      */
     handle = LoadModule( libname, (LPVOID)-1 );
-    if (handle == (HANDLE)2)  /* file not found */
+    if (handle == (HINSTANCE16)2)  /* file not found */
     {
         char buffer[256];
         lstrcpyn32A( buffer, libname, 252 );
@@ -1336,7 +1336,7 @@
         handle = LoadModule( buffer, (LPVOID)-1 );
     }
 #ifndef WINELIB
-    if (handle >= (HANDLE)32) NE_InitializeDLLs( GetExePtr(handle) );
+    if (handle >= (HINSTANCE16)32) NE_InitializeDLLs( GetExePtr(handle) );
 #endif
     return handle;
 }
@@ -1345,7 +1345,7 @@
 /***********************************************************************
  *           FreeLibrary   (KERNEL.96)
  */
-void FreeLibrary( HANDLE handle )
+void FreeLibrary( HINSTANCE16 handle )
 {
     dprintf_module( stddeb,"FreeLibrary: %04x\n", handle );
     FreeModule16( handle );
@@ -1355,11 +1355,11 @@
 /***********************************************************************
  *           WinExec   (KERNEL.166)
  */
-HANDLE WinExec( LPSTR lpCmdLine, WORD nCmdShow )
+HINSTANCE16 WinExec( LPSTR lpCmdLine, WORD nCmdShow )
 {
     LOADPARAMS params;
     HGLOBAL16 cmdShowHandle, cmdLineHandle;
-    HANDLE handle;
+    HINSTANCE16 handle;
     WORD *cmdShowPtr;
     char *p, *cmdline, filename[256];
     static int use_load_module = 1;
@@ -1394,9 +1394,9 @@
 #ifdef WINELIB
         /* WINELIB: Use LoadModule() only for the program itself */
         use_load_module = 0;
-	params.hEnvironment = (HANDLE)GetDOSEnvironment();
+	params.hEnvironment = (HGLOBAL16)GetDOSEnvironment();
 #else
-	params.hEnvironment = (HANDLE)SELECTOROF( GetDOSEnvironment() );
+	params.hEnvironment = (HGLOBAL16)SELECTOROF( GetDOSEnvironment() );
 #endif  /* WINELIB */
 	params.cmdLine  = (SEGPTR)WIN16_GlobalLock16( cmdLineHandle );
 	params.showCmd  = (SEGPTR)WIN16_GlobalLock16( cmdShowHandle );
@@ -1478,12 +1478,6 @@
 
     GlobalFree16( cmdShowHandle );
     GlobalFree16( cmdLineHandle );
-
-#if 0
-    if (handle < (HANDLE)32)	/* Error? */
-	return handle;
-#endif
-
     return handle;
 }
 
diff --git a/loader/ne_image.c b/loader/ne_image.c
index 720ba89..3bf7849 100644
--- a/loader/ne_image.c
+++ b/loader/ne_image.c
@@ -529,7 +529,7 @@
     }
     if (pModule->dlls_to_init)
     {
-	HANDLE to_init = pModule->dlls_to_init;
+	HGLOBAL16 to_init = pModule->dlls_to_init;
 	pModule->dlls_to_init = 0;
         for (pDLL = (HMODULE16 *)GlobalLock16( to_init ); *pDLL; pDLL++)
         {
@@ -549,7 +549,7 @@
  */
 
 /* It does nothing */
-void PatchCodeHandle(HANDLE hSel)
+void PatchCodeHandle(HANDLE16 hSel)
 {
 }
 #endif /* WINELIB */
diff --git a/loader/ne_resource.c b/loader/ne_resource.c
index e235131..cd18408 100644
--- a/loader/ne_resource.c
+++ b/loader/ne_resource.c
@@ -53,7 +53,7 @@
             dprintf_resource( stddeb, "NameTable entry: type=%04x id=%04x\n",
                               pTypeInfo->type_id, pNameInfo->id );
             handle = LoadResource16( hModule, 
-				   (HANDLE)((int)pNameInfo - (int)pModule) );
+				   (HRSRC16)((int)pNameInfo - (int)pModule) );
             for(p = (WORD*)LockResource16(handle); p && *p; p = (WORD *)((char*)p+*p))
             {
                 dprintf_resource( stddeb,"  type=%04x '%s' id=%04x '%s'\n",
diff --git a/loader/pe_image.c b/loader/pe_image.c
index 8ab35e9..5168949 100644
--- a/loader/pe_image.c
+++ b/loader/pe_image.c
@@ -558,10 +558,10 @@
         return pe;
 }
 
-HINSTANCE MODULE_CreateInstance(HMODULE16 hModule,LOADPARAMS *params);
+HINSTANCE16 MODULE_CreateInstance(HMODULE16 hModule,LOADPARAMS *params);
 void InitTask( SIGCONTEXT *context );
 
-HINSTANCE PE_LoadModule( int fd, OFSTRUCT *ofs, LOADPARAMS* params )
+HINSTANCE16 PE_LoadModule( int fd, OFSTRUCT *ofs, LOADPARAMS* params )
 {
     HMODULE16 hModule;
     HINSTANCE16 hInstance;
@@ -598,7 +598,6 @@
     return hInstance;
 }
 
-int USER_InitApp(HINSTANCE hInstance);
 void PE_InitTEB(int hTEB);
 
 void PE_InitializeDLLs(HMODULE16 hModule);
@@ -612,7 +611,7 @@
     InitTask( context );
     hModule = GetExePtr( GetCurrentTask() );
     pModule = MODULE_GetPtr( hModule );
-    USER_InitApp( hModule );
+    InitApp( hModule );
     fs=(int)GlobalAlloc16( GMEM_FIXED | GMEM_ZEROINIT, 0x10000 );
     PE_InitTEB(fs);
     __asm__ __volatile__("movw %w0,%%fs"::"r" (fs));
@@ -686,7 +685,7 @@
 	pModule = MODULE_GetPtr( GetExePtr(hModule) );
 	if (pModule->dlls_to_init)
 	{
-		HANDLE to_init = pModule->dlls_to_init;
+		HGLOBAL16 to_init = pModule->dlls_to_init;
 		pModule->dlls_to_init = 0;
 		for (pDLL = (HMODULE16 *)GlobalLock16( to_init ); *pDLL; pDLL++)
 		{
diff --git a/loader/pe_resource.c b/loader/pe_resource.c
index 1f9fa13..c5a6c69 100644
--- a/loader/pe_resource.c
+++ b/loader/pe_resource.c
@@ -116,7 +116,7 @@
  *	    PE_FindResourceEx32W
  */
 HANDLE32 PE_FindResourceEx32W( 
-	HINSTANCE hModule, LPCWSTR name, LPCWSTR type, WORD lang
+	HINSTANCE32 hModule, LPCWSTR name, LPCWSTR type, WORD lang
 )
 {
     PE_MODULE *pe;
@@ -152,7 +152,7 @@
 /**********************************************************************
  *	    PE_LoadResource32
  */
-HANDLE32 PE_LoadResource32( HINSTANCE hModule, HANDLE32 hRsrc )
+HANDLE32 PE_LoadResource32( HINSTANCE32 hModule, HANDLE32 hRsrc )
 {
     NE_MODULE *pModule;
     PE_MODULE *pe;
diff --git a/loader/resource.c b/loader/resource.c
index 8017685..9bf8dba 100644
--- a/loader/resource.c
+++ b/loader/resource.c
@@ -376,7 +376,7 @@
  *
  * Check Schulman, p. 232 for details
  */
-HANDLE DirectResAlloc(HANDLE hInstance, WORD wType, WORD wSize)
+HGLOBAL16 DirectResAlloc( HINSTANCE16 hInstance, WORD wType, UINT16 wSize )
 {
     dprintf_resource(stddeb,"DirectResAlloc(%04x,%04x,%04x)\n",
                      hInstance, wType, wSize );
@@ -507,7 +507,7 @@
 /**********************************************************************
  *			TranslateAccelerator 	[USER.178]
  */
-int TranslateAccelerator(HWND hWnd, HANDLE hAccel, LPMSG16 msg)
+INT16 TranslateAccelerator(HWND hWnd, HACCEL16 hAccel, LPMSG16 msg)
 {
     ACCELHEADER	*lpAccelTbl;
     int 	i;
diff --git a/loader/task.c b/loader/task.c
index 0983041..87b1e37 100644
--- a/loader/task.c
+++ b/loader/task.c
@@ -54,8 +54,8 @@
 static HTASK16 hCurrentTask = 0;
 static HTASK16 hTaskToKill = 0;
 static HTASK16 hLockedTask = 0;
-static WORD nTaskCount = 0;
-static HANDLE hDOSEnvironment = 0;
+static UINT16 nTaskCount = 0;
+static HGLOBAL16 hDOSEnvironment = 0;
 
   /* TASK_Reschedule() 16-bit entry point */
 static FARPROC16 TASK_RescheduleProc;
@@ -66,7 +66,7 @@
 #define TASK_SCHEDULE()  CallTo16_word_(TASK_RescheduleProc)
 #endif
 
-static HANDLE TASK_CreateDOSEnvironment(void);
+static HGLOBAL16 TASK_CreateDOSEnvironment(void);
 
 /***********************************************************************
  *           TASK_Init
@@ -83,7 +83,7 @@
 /***********************************************************************
  *	     TASK_GetNextTask
  */
-HTASK TASK_GetNextTask( HTASK hTask )
+HTASK16 TASK_GetNextTask( HTASK16 hTask )
 {
     TDB* pTask = (TDB*)GlobalLock16(hTask);
 
@@ -97,12 +97,12 @@
  *
  * Create the original DOS environment.
  */
-static HANDLE TASK_CreateDOSEnvironment(void)
+static HGLOBAL16 TASK_CreateDOSEnvironment(void)
 {
     static const char program_name[] = "KRNL386.EXE";
     char **e, *p;
     int initial_size, size, i, winpathlen, sysdirlen;
-    HANDLE handle;
+    HGLOBAL16 handle;
 
     extern char **environ;
 
@@ -279,7 +279,7 @@
  * Allocate a thunk for MakeProcInstance().
  */
 #ifndef WINELIB32
-static SEGPTR TASK_AllocThunk( HTASK hTask )
+static SEGPTR TASK_AllocThunk( HTASK16 hTask )
 {
     TDB *pTask;
     THUNKS *pThunk;
@@ -316,7 +316,7 @@
  * Free a MakeProcInstance() thunk.
  */
 #ifndef WINELIB32
-static BOOL TASK_FreeThunk( HTASK hTask, SEGPTR thunk )
+static BOOL TASK_FreeThunk( HTASK16 hTask, SEGPTR thunk )
 {
     TDB *pTask;
     THUNKS *pThunk;
@@ -396,9 +396,9 @@
                          HINSTANCE16 hPrevInstance, HANDLE16 hEnvironment,
                          LPCSTR cmdLine, UINT16 cmdShow )
 {
-    HTASK hTask;
+    HTASK16 hTask;
     TDB *pTask;
-    HANDLE hParentEnv;
+    HGLOBAL16 hParentEnv;
     NE_MODULE *pModule;
     SEGTABLEENTRY *pSegTable;
     LPSTR name;
@@ -598,10 +598,10 @@
 /***********************************************************************
  *           TASK_DeleteTask
  */
-static void TASK_DeleteTask( HTASK hTask )
+static void TASK_DeleteTask( HTASK16 hTask )
 {
     TDB *pTask;
-    HANDLE hPDB;
+    HGLOBAL16 hPDB;
 
     if (!(pTask = (TDB *)GlobalLock16( hTask ))) return;
     hPDB = pTask->hPDB;
@@ -711,7 +711,7 @@
 void TASK_Reschedule(void)
 {
     TDB *pOldTask = NULL, *pNewTask;
-    HTASK hTask = 0;
+    HTASK16 hTask = 0;
 
 #ifdef CONFIG_IPC
     dde_reschedule();
@@ -862,7 +862,7 @@
 /***********************************************************************
  *           WaitEvent  (KERNEL.30)
  */
-BOOL WaitEvent( HTASK hTask )
+BOOL16 WaitEvent( HTASK16 hTask )
 {
     TDB *pTask;
 
@@ -885,7 +885,7 @@
 /***********************************************************************
  *           PostEvent  (KERNEL.31)
  */
-void PostEvent( HTASK hTask )
+void PostEvent( HTASK16 hTask )
 {
     TDB *pTask;
 
@@ -898,10 +898,10 @@
 /***********************************************************************
  *           SetPriority  (KERNEL.32)
  */
-void SetPriority( HTASK hTask, int delta )
+void SetPriority( HTASK16 hTask, INT16 delta )
 {
     TDB *pTask;
-    int newpriority;
+    INT16 newpriority;
 
     if (!hTask) hTask = hCurrentTask;
     if (!(pTask = (TDB *)GlobalLock16( hTask ))) return;
@@ -919,7 +919,7 @@
 /***********************************************************************
  *           LockCurrentTask  (KERNEL.33)
  */
-HTASK LockCurrentTask( BOOL bLock )
+HTASK16 LockCurrentTask( BOOL16 bLock )
 {
     if (bLock) hLockedTask = hCurrentTask;
     else hLockedTask = 0;
@@ -930,7 +930,7 @@
 /***********************************************************************
  *           IsTaskLocked  (KERNEL.122)
  */
-HTASK IsTaskLocked(void)
+HTASK16 IsTaskLocked(void)
 {
     return hLockedTask;
 }
@@ -953,7 +953,7 @@
 /***********************************************************************
  *           DirectedYield  (KERNEL.150)
  */
-void DirectedYield( HTASK hTask )
+void DirectedYield( HTASK16 hTask )
 {
     TDB *pCurTask = (TDB *)GlobalLock16( hCurrentTask );
     pCurTask->hYieldTo = hTask;
@@ -1035,10 +1035,10 @@
 /**********************************************************************
  *	    GetCodeHandle    (KERNEL.93)
  */
-HANDLE GetCodeHandle( FARPROC16 proc )
+HANDLE16 GetCodeHandle( FARPROC16 proc )
 {
 #ifndef WINELIB32
-    HANDLE handle;
+    HANDLE16 handle;
     BYTE *thunk = (BYTE *)PTR_SEG_TO_LIN( proc );
 
     /* Return the code segment containing 'proc'. */
@@ -1052,7 +1052,7 @@
 
     return handle;
 #else
-    return (HANDLE)proc;
+    return (HANDLE16)proc;
 #endif
 }
 
@@ -1224,7 +1224,7 @@
 /***********************************************************************
  *           GetInstanceData   (KERNEL.54)
  */
-int GetInstanceData( HANDLE instance, WORD buffer, int len )
+INT16 GetInstanceData( HINSTANCE16 instance, WORD buffer, INT16 len )
 {
     char *ptr = (char *)GlobalLock16( instance );
     if (!ptr || !len) return 0;
@@ -1276,7 +1276,7 @@
 /***********************************************************************
  *           GetNumTasks   (KERNEL.152)
  */
-WORD GetNumTasks(void)
+UINT16 GetNumTasks(void)
 {
     return nTaskCount;
 }
@@ -1300,7 +1300,7 @@
 /***********************************************************************
  *           IsTask   (KERNEL.320)
  */
-BOOL IsTask( HTASK hTask )
+BOOL16 IsTask( HTASK16 hTask )
 {
     TDB *pTask;
 
@@ -1352,6 +1352,18 @@
 
 
 /***********************************************************************
+ *           GlobalNotify   (KERNEL.154)
+ */
+VOID GlobalNotify( FARPROC16 proc )
+{
+    TDB *pTask;
+
+    if (!(pTask = (TDB *)GlobalLock16( hCurrentTask ))) return;
+    pTask->discardhandler = proc;
+}
+
+
+/***********************************************************************
  *           GetExePtr   (KERNEL.133)
  */
 HMODULE16 GetExePtr( HANDLE16 handle )
diff --git a/memory/Makefile.in b/memory/Makefile.in
index f1a6348..d473cd0 100644
--- a/memory/Makefile.in
+++ b/memory/Makefile.in
@@ -1,6 +1,9 @@
-DEFS   = -D__WINE__ -DNO_TRANSITION_TYPES
-TOPSRC = @top_srcdir@
-MODULE = memory
+DEFS      = -D__WINE__ -DNO_TRANSITION_TYPES
+TOPSRCDIR = @top_srcdir@
+TOPOBJDIR = ..
+SRCDIR    = @srcdir@
+VPATH     = @srcdir@
+MODULE    = memory
 
 C_SRCS = \
 	atom.c \
diff --git a/memory/ldt.c b/memory/ldt.c
index d365936..0d9200c 100644
--- a/memory/ldt.c
+++ b/memory/ldt.c
@@ -15,8 +15,18 @@
 
 #ifdef linux
 #include <syscall.h>
-#include <linux/head.h>
-#include <linux/ldt.h>
+
+struct modify_ldt_s 
+{
+    unsigned int  entry_number;
+    unsigned long base_addr;
+    unsigned int  limit;
+    unsigned int  seg_32bit : 1;
+    unsigned int  contents : 2;
+    unsigned int  read_exec_only : 1;
+    unsigned int  limit_in_pages : 1;
+    unsigned int  seg_not_present : 1;
+};
 
 static __inline__ _syscall3(int, modify_ldt, int, func, void *, ptr,
                             unsigned long, bytecount);
@@ -122,17 +132,16 @@
 #ifdef linux
     if (!__winelib)
     {
-        struct modify_ldt_ldt_s ldt_info;
+        struct modify_ldt_s ldt_info;
 
-        /* Clear all unused bits (like seg_not_present) */
-        memset( &ldt_info, 0, sizeof(ldt_info) );
-        ldt_info.entry_number   = entry;
-        ldt_info.base_addr      = content->base;
-        ldt_info.limit          = content->limit;
-        ldt_info.seg_32bit      = content->seg_32bit != 0;
-        ldt_info.contents       = content->type;
-        ldt_info.read_exec_only = content->read_only != 0;
-        ldt_info.limit_in_pages = content->limit_in_pages != 0;
+        ldt_info.entry_number    = entry;
+        ldt_info.base_addr       = content->base;
+        ldt_info.limit           = content->limit;
+        ldt_info.seg_32bit       = content->seg_32bit != 0;
+        ldt_info.contents        = content->type;
+        ldt_info.read_exec_only  = content->read_only != 0;
+        ldt_info.limit_in_pages  = content->limit_in_pages != 0;
+        ldt_info.seg_not_present = 0;
         /* Make sure the info will be accepted by the kernel */
         /* This is ugly, but what can I do? */
         if (content->type == SEGMENT_STACK)
diff --git a/misc/Makefile.in b/misc/Makefile.in
index a7d7746..32b5cc2 100644
--- a/misc/Makefile.in
+++ b/misc/Makefile.in
@@ -1,6 +1,9 @@
-DEFS   = -D__WINE__
-TOPSRC = @top_srcdir@
-MODULE = misc
+DEFS      = -D__WINE__
+TOPSRCDIR = @top_srcdir@
+TOPOBJDIR = ..
+SRCDIR    = @srcdir@
+VPATH     = @srcdir@
+MODULE    = misc
 
 C_SRCS = \
 	clipboard.c \
diff --git a/misc/clipboard.c b/misc/clipboard.c
index 03d80ca..5bd3544 100644
--- a/misc/clipboard.c
+++ b/misc/clipboard.c
@@ -299,7 +299,7 @@
 /**************************************************************************
  *			SetClipboardData	[USER.141]
  */
-HANDLE SetClipboardData(WORD wFormat, HANDLE hData)
+HANDLE16 SetClipboardData(WORD wFormat, HANDLE16 hData)
 {
     LPCLIPFORMAT lpFormat = ClipFormats; 
     Window       owner;
@@ -403,7 +403,7 @@
 /**************************************************************************
  *			GetClipboardData	[USER.142]
  */
-HANDLE GetClipboardData(WORD wFormat)
+HANDLE16 GetClipboardData(WORD wFormat)
 {
     LPCLIPFORMAT lpRender = ClipFormats; 
     LPCLIPFORMAT lpUpdate = NULL;
diff --git a/misc/commdlg.c b/misc/commdlg.c
index cb24335..aacfc81 100644
--- a/misc/commdlg.c
+++ b/misc/commdlg.c
@@ -22,12 +22,12 @@
 
 static	DWORD 		CommDlgLastError = 0;
 
-static	HBITMAP		hFolder = 0;
-static	HBITMAP		hFolder2 = 0;
-static	HBITMAP		hFloppy = 0;
-static	HBITMAP		hHDisk = 0;
-static	HBITMAP		hCDRom = 0;
-static  HBITMAP 	hBitmapTT = 0;
+static HBITMAP16 hFolder = 0;
+static HBITMAP16 hFolder2 = 0;
+static HBITMAP16 hFloppy = 0;
+static HBITMAP16 hHDisk = 0;
+static HBITMAP16 hCDRom = 0;
+static HBITMAP16 hBitmapTT = 0;
 
 /***********************************************************************
  * 				FileDlg_Init			[internal]
@@ -58,8 +58,8 @@
  */
 BOOL GetOpenFileName( SEGPTR ofn )
 {
-    HINSTANCE hInst;
-    HANDLE hDlgTmpl, hResInfo;
+    HINSTANCE16 hInst;
+    HANDLE16 hDlgTmpl, hResInfo;
     BOOL bRet;
     LPOPENFILENAME lpofn = (LPOPENFILENAME)PTR_SEG_TO_LIN(ofn);
 
@@ -105,8 +105,8 @@
  */
 BOOL GetSaveFileName( SEGPTR ofn)
 {
-    HINSTANCE hInst;
-    HANDLE hDlgTmpl, hResInfo;
+    HINSTANCE16 hInst;
+    HANDLE16 hDlgTmpl, hResInfo;
     BOOL bRet;
     LPOPENFILENAME lpofn = (LPOPENFILENAME)PTR_SEG_TO_LIN(ofn);
   
@@ -218,8 +218,8 @@
 {
     LPDRAWITEMSTRUCT16 lpdis = (LPDRAWITEMSTRUCT16)PTR_SEG_TO_LIN(lParam);
     char *str;
-    HBRUSH hBrush;
-    HBITMAP hBitmap, hPrevBitmap;
+    HBRUSH16 hBrush;
+    HBITMAP16 hBitmap, hPrevBitmap;
     BITMAP16 bm;
     HDC hMemDC;
 
@@ -706,7 +706,7 @@
  */
 BOOL FindText( SEGPTR find )
 {
-    HANDLE hInst, hDlgTmpl;
+    HANDLE16 hInst, hDlgTmpl;
     BOOL bRet;
     LPCVOID ptr;
     LPFINDREPLACE lpFind = (LPFINDREPLACE)PTR_SEG_TO_LIN(find);
@@ -736,7 +736,7 @@
  */
 BOOL ReplaceText( SEGPTR find )
 {
-    HANDLE hInst, hDlgTmpl;
+    HANDLE16 hInst, hDlgTmpl;
     BOOL bRet;
     LPCVOID ptr;
     LPFINDREPLACE lpFind = (LPFINDREPLACE)PTR_SEG_TO_LIN(find);
@@ -989,7 +989,7 @@
  */
 BOOL PrintDlg( SEGPTR printdlg )
 {
-    HANDLE hInst, hDlgTmpl;
+    HANDLE16 hInst, hDlgTmpl;
     BOOL bRet;
     LPPRINTDLG lpPrint = (LPPRINTDLG)PTR_SEG_TO_LIN(printdlg);
 
@@ -1118,8 +1118,8 @@
  */
 BOOL ChooseColor(LPCHOOSECOLOR lpChCol)
 {
-    HINSTANCE hInst;
-    HANDLE hDlgTmpl, hResInfo;
+    HINSTANCE16 hInst;
+    HANDLE16 hDlgTmpl, hResInfo;
     BOOL bRet;
 
     dprintf_commdlg(stddeb,"ChooseColor\n");
@@ -1177,7 +1177,7 @@
  LPCHOOSECOLOR lpcc;  /* points to public known data structure */
  int nextuserdef;     /* next free place in user defined color array */
  HDC hdcMem;          /* color graph used for BitBlt() */
- HBITMAP hbmMem;      /* color graph bitmap */    
+ HBITMAP16 hbmMem;    /* color graph bitmap */    
  RECT16 fullsize;     /* original dialog window size */
  UINT msetrgb;        /* # of SETRGBSTRING message (today not used)  */
  RECT16 old3angle;    /* last position of l-marker */
@@ -1476,7 +1476,7 @@
 {
  RECT16 rect;
  HDC32  hdc;
- HBRUSH hBrush;
+ HBRUSH16 hBrush;
  HWND hwnd=GetDlgItem(hDlg,0x2c5);
  if (IsWindowVisible(GetDlgItem(hDlg,0x2c6)))   /* if full size */
  {
@@ -1599,7 +1599,7 @@
  int sdif,hdif,xdif,ydif,r,g,b,hue,sat;
  HWND hwnd=GetDlgItem(hDlg,0x2c6);
  struct CCPRIVATE * lpp=(struct CCPRIVATE *)GetWindowLong32A(hDlg, DWL_USER);  
- HBRUSH hbrush;
+ HBRUSH16 hbrush;
  HDC32 hdc ;
  RECT16 rect,client;
  HCURSOR16 hcursor=SetCursor(LoadCursor16(0,IDC_WAIT));
@@ -1666,7 +1666,7 @@
  HWND hwnd=GetDlgItem(hDlg,0x2be);
  RECT16 rect,client;
  int lum,ldif,ydif,r,g,b;
- HBRUSH hbrush;
+ HBRUSH16 hbrush;
  HDC32 hDC;
 
  if (IsWindowVisible(hwnd))
@@ -1776,7 +1776,7 @@
  HWND hwnd=GetDlgItem(hDlg,0x2d0);
  RECT16 rect;
  HDC32  hdc;
- HBRUSH hBrush;
+ HBRUSH16 hBrush;
  int dx,dy,i,j,k;
 
  GetClientRect16(hwnd,&rect);
@@ -1815,7 +1815,7 @@
  HWND hwnd=GetDlgItem(hDlg,0x2d1);
  RECT16 rect;
  HDC32  hdc;
- HBRUSH hBrush;
+ HBRUSH16 hBrush;
  int dx,dy,i,j,k;
 
  GetClientRect16(hwnd,&rect);
@@ -2199,8 +2199,8 @@
  */
 BOOL ChooseFont(LPCHOOSEFONT lpChFont)
 {
-    HINSTANCE hInst;
-    HANDLE hDlgTmpl, hResInfo;
+    HINSTANCE16 hInst;
+    HANDLE16 hDlgTmpl, hResInfo;
     BOOL bRet;
 
     dprintf_commdlg(stddeb,"ChooseFont\n");
@@ -2313,7 +2313,7 @@
    static struct FONTSTYLE fontstyles[FSTYLES]={ 
           { 0,FW_NORMAL,"Regular"},{0,FW_BOLD,"Bold"},
           { 1,FW_NORMAL,"Italic"}, {1,FW_BOLD,"Bold Italic"}};
-   HFONT hf;                      
+   HFONT16 hf;                      
    int i,j;
 
    for (i=0;i<FSTYLES;i++)
@@ -2550,7 +2550,7 @@
  */
 LRESULT CFn_WMDrawItem(HWND hDlg, WPARAM wParam, LPARAM lParam)
 {
-  HBRUSH hBrush;
+  HBRUSH16 hBrush;
   char *buffer;
   BITMAP16 bm;
   COLORREF cr;
@@ -2558,7 +2558,7 @@
 #if 0  
   HDC hMemDC;
   int nFontType;
-  HBITMAP hBitmap; /* for later TT usage */
+  HBITMAP16 hBitmap; /* for later TT usage */
 #endif  
   LPDRAWITEMSTRUCT16 lpdi = (LPDRAWITEMSTRUCT16)PTR_SEG_TO_LIN(lParam);
 
@@ -2658,7 +2658,7 @@
  */
 LRESULT CFn_WMCommand(HWND hDlg, WPARAM wParam, LPARAM lParam)
 {
-  HFONT hFont/*,hFontOld*/;
+  HFONT16 hFont;
   int i,j;
   long l;
   HDC hdc;
diff --git a/misc/crtdll.c b/misc/crtdll.c
index 1b04915..4917a4e 100644
--- a/misc/crtdll.c
+++ b/misc/crtdll.c
@@ -19,7 +19,6 @@
 #include "stddebug.h"
 #include "debug.h"
 #include "module.h"
-#include "callback.h"
 #include "xmalloc.h"
 
 UINT32 CRTDLL_argc_dll;         /* CRTDLL.23 */
@@ -109,8 +108,7 @@
 	dprintf_crtdll(stddeb,"_initterm(%p,%p)\n",start,end);
 	current=start;
 	while (current<end) {
-		if (*current)
-			_InitTermProc(*current);
+		if (*current) (*current)();
 		current++;
 	}
 	return 0;
diff --git a/misc/exec.c b/misc/exec.c
index 6c6b844..5594182 100644
--- a/misc/exec.c
+++ b/misc/exec.c
@@ -98,7 +98,7 @@
 	static WORD WM_WINHELP=0;
 	HWND hDest;
 	LPWINHELP lpwh;
-	HANDLE hwh;
+	HGLOBAL16 hwh;
 	void *data=0;
 	int size,dsize,nlen;
         if (wCommand != HELP_QUIT)  /* FIXME */
diff --git a/misc/network.c b/misc/network.c
index 7303d60..f6267b4 100644
--- a/misc/network.c
+++ b/misc/network.c
@@ -270,7 +270,7 @@
 /**************************************************************************
  *              WNetWriteJob       [USER.524]
  */
-int WNetWriteJob(HANDLE hJob,void *lpData,LPWORD lpcbData)
+int WNetWriteJob(HANDLE16 hJob,void *lpData,LPWORD lpcbData)
 {
 	printf("EMPTY STUB !!! WNetWriteJob(%04x,%p,%p)\n",
 		hJob,lpData,lpcbData);
@@ -372,7 +372,7 @@
 /**************************************************************************
  *				WNetCloseEnum		[USER.???]
  */
-UINT WNetCloseEnum(HANDLE hEnum)
+UINT WNetCloseEnum(HANDLE16 hEnum)
 {
 	printf("EMPTY STUB !!! WNetCloseEnum(%04x);\n", hEnum);
 	return WN_NET_ERROR;
@@ -381,7 +381,7 @@
 /**************************************************************************
  *				WNetEnumResource	[USER.???]
  */
-UINT WNetEnumResource(HANDLE hEnum, DWORD cRequ, 
+UINT WNetEnumResource(HANDLE16 hEnum, DWORD cRequ, 
 				DWORD *lpCount, LPVOID lpBuf)
 {
 	printf("EMPTY STUB !!! WNetEnumResource(%04x, %08lX, %p, %p);\n", 
@@ -393,7 +393,7 @@
  *				WNetOpenEnum		[USER.???]
  */
 UINT WNetOpenEnum(DWORD dwScope, DWORD dwType, 
-	LPNETRESOURCE lpNet, HANDLE *lphEnum)
+	LPNETRESOURCE lpNet, HANDLE16 *lphEnum)
 {
 	printf("EMPTY STUB !!! WNetOpenEnum(%08lX, %08lX, %p, %p);\n",
                dwScope, dwType, lpNet, lphEnum);
diff --git a/misc/olesvr.c b/misc/olesvr.c
index 4035e08..490ab48 100644
--- a/misc/olesvr.c
+++ b/misc/olesvr.c
@@ -18,7 +18,7 @@
  *           OleRegisterServer
  */
 OLESTATUS OleRegisterServer( LPCSTR name, LPOLESERVER serverStruct,
-                             LHSERVER *hRet, HINSTANCE hServer,
+                             LHSERVER *hRet, HINSTANCE16 hServer,
                              OLE_SERVER_USE use )
 {
     dprintf_ole(stdnimp,"OleRegisterServer:%s\n",name);
diff --git a/misc/shell.c b/misc/shell.c
index 4e80173..31637ea 100644
--- a/misc/shell.c
+++ b/misc/shell.c
@@ -46,8 +46,8 @@
 
 #pragma pack(4)
 
-extern HANDLE 	CURSORICON_LoadHandler( HANDLE, HINSTANCE, BOOL);
-extern WORD 	GetIconID( HANDLE hResource, DWORD resType );
+extern HGLOBAL16 CURSORICON_LoadHandler( HGLOBAL16, HINSTANCE16, BOOL);
+extern WORD 	GetIconID( HGLOBAL16 hResource, DWORD resType );
 
 /*************************************************************************
  *				DragAcceptFiles		[SHELL.9]
@@ -136,10 +136,10 @@
  *				SHELL_FindExecutable
  * Utility for code sharing between FindExecutable and ShellExecute
  */
-static HINSTANCE SHELL_FindExecutable( LPCSTR lpFile, 
-				      LPCSTR lpDirectory,
-				      LPCSTR lpOperation,
-				      LPSTR lpResult)
+static HINSTANCE16 SHELL_FindExecutable( LPCSTR lpFile, 
+                                         LPCSTR lpDirectory,
+                                         LPCSTR lpOperation,
+                                         LPSTR lpResult)
 {
     char *extension = NULL; /* pointer to file extension */
     char tmpext[5];         /* local copy to mung as we please */
@@ -148,7 +148,7 @@
     char command[256];      /* command from registry */
     LONG commandlen=256;    /* This is the most DOS can handle :) */
     char buffer[256];       /* Used to GetProfileString */
-    HINSTANCE retval=31;    /* default - 'No association was found' */
+    HINSTANCE16 retval=31;  /* default - 'No association was found' */
     char *tok;              /* token pointer */
     int i;                  /* random counter */
     char xlpFile[256];      /* result of SearchPath */
@@ -286,11 +286,11 @@
 /*************************************************************************
  *				ShellExecute		[SHELL.20]
  */
-HINSTANCE ShellExecute(HWND hWnd, LPCSTR lpOperation, LPCSTR lpFile,
-		       LPSTR lpParameters, LPCSTR lpDirectory,
-		       INT iShowCmd)
+HINSTANCE16 ShellExecute(HWND hWnd, LPCSTR lpOperation, LPCSTR lpFile,
+                         LPSTR lpParameters, LPCSTR lpDirectory,
+                         INT iShowCmd)
 {
-    HINSTANCE retval=31;
+    HINSTANCE16 retval=31;
     char cmd[256];
 
     dprintf_exec(stddeb, "ShellExecute(%04x,'%s','%s','%s','%s',%x)\n",
@@ -322,9 +322,9 @@
 /*************************************************************************
  *				FindExecutable		[SHELL.21]
  */
-HINSTANCE FindExecutable(LPCSTR lpFile, LPCSTR lpDirectory, LPSTR lpResult)
+HINSTANCE16 FindExecutable(LPCSTR lpFile, LPCSTR lpDirectory, LPSTR lpResult)
 {
-    HINSTANCE retval=31;    /* default - 'No association was found' */
+    HINSTANCE16 retval=31;    /* default - 'No association was found' */
 
     dprintf_exec(stddeb, "FindExecutable: File %s, Dir %s\n", 
 		 (lpFile != NULL?lpFile:"-"), 
@@ -380,7 +380,7 @@
  */
 INT ShellAbout(HWND hWnd, LPCSTR szApp, LPCSTR szOtherStuff, HICON16 hIcon)
 {
-    HANDLE handle;
+    HGLOBAL16 handle;
     BOOL bRet;
 
     if (szApp) strncpy(AppName, szApp, sizeof(AppName));
@@ -448,10 +448,10 @@
 /*************************************************************************
  *			SHELL_LoadResource
  */
-static HANDLE	SHELL_LoadResource(HINSTANCE hInst, HFILE hFile, NE_NAMEINFO* pNInfo, WORD sizeShift)
+static HGLOBAL16 SHELL_LoadResource(HINSTANCE16 hInst, HFILE hFile, NE_NAMEINFO* pNInfo, WORD sizeShift)
 {
  BYTE*	ptr;
- HANDLE handle = DirectResAlloc( hInst, 0x10, (DWORD)pNInfo->length << sizeShift);
+ HGLOBAL16 handle = DirectResAlloc( hInst, 0x10, (DWORD)pNInfo->length << sizeShift);
 
  if( (ptr = (BYTE*)GlobalLock16( handle )) )
    {
@@ -459,16 +459,16 @@
      _lread32( hFile, (char*)ptr, pNInfo->length << sizeShift);
      return handle;
    }
- return (HANDLE)0;
+ return 0;
 }
 
 /*************************************************************************
  *                      ICO_LoadIcon
  */
-static HANDLE   ICO_LoadIcon(HINSTANCE hInst, HFILE hFile, LPicoICONDIRENTRY lpiIDE)
+static HGLOBAL16 ICO_LoadIcon(HINSTANCE16 hInst, HFILE hFile, LPicoICONDIRENTRY lpiIDE)
 {
  BYTE*  ptr;
- HANDLE handle = DirectResAlloc( hInst, 0x10, lpiIDE->dwBytesInRes);
+ HGLOBAL16 handle = DirectResAlloc( hInst, 0x10, lpiIDE->dwBytesInRes);
 
  if( (ptr = (BYTE*)GlobalLock16( handle )) )
    {
@@ -476,7 +476,7 @@
      _lread32( hFile, (char*)ptr, lpiIDE->dwBytesInRes);
      return handle;
    }
- return (HANDLE)0;
+ return 0;
 }
 
 /*************************************************************************
@@ -484,7 +484,7 @@
  *
  *  Read .ico file and build phony ICONDIR struct for GetIconID
  */
-static HANDLE ICO_GetIconDirectory(HINSTANCE hInst, HFILE hFile, LPicoICONDIR* lplpiID ) 
+static HGLOBAL16 ICO_GetIconDirectory(HINSTANCE16 hInst, HFILE hFile, LPicoICONDIR* lplpiID ) 
 {
   WORD		id[3];	/* idReserved, idType, idCount */
   LPicoICONDIR	lpiID;
@@ -506,8 +506,8 @@
 
   if( _lread32(hFile,(char*)lpiID->idEntries,i) == i )
   {  
-     HANDLE	handle = DirectResAlloc( hInst, 0x10,
-					 id[2]*sizeof(ICONDIRENTRY) + sizeof(id) );
+     HGLOBAL16 handle = DirectResAlloc( hInst, 0x10,
+                                     id[2]*sizeof(ICONDIRENTRY) + sizeof(id) );
      if( handle ) 
      {
        CURSORICONDIR*     lpID = (CURSORICONDIR*)GlobalLock16( handle );
@@ -535,10 +535,10 @@
  *
  * This abortion is called directly by Progman
  */
-HICON16 InternalExtractIcon(HINSTANCE hInstance, LPCSTR lpszExeFileName, UINT nIconIndex, WORD n )
+HGLOBAL16 InternalExtractIcon(HINSTANCE16 hInstance, LPCSTR lpszExeFileName, UINT nIconIndex, WORD n )
 {
-  HANDLE 	hRet = 0;
-  HICON16*	RetPtr = NULL;
+  HGLOBAL16 	hRet = 0;
+  HGLOBAL16*	RetPtr = NULL;
   BYTE*  	pData;
   OFSTRUCT 	ofs;
   HFILE 	hFile = OpenFile( lpszExeFileName, &ofs, OF_READ );
@@ -639,9 +639,9 @@
 /*************************************************************************
  *				ExtractIcon 		[SHELL.34]
  */
-HICON16 ExtractIcon(HINSTANCE hInstance, LPCSTR lpszExeFileName, WORD nIconIndex)
+HICON16 ExtractIcon(HINSTANCE16 hInstance, LPCSTR lpszExeFileName, WORD nIconIndex)
 {
-  HANDLE handle = InternalExtractIcon(hInstance,lpszExeFileName,nIconIndex, 1);
+  HGLOBAL16 handle = InternalExtractIcon(hInstance,lpszExeFileName,nIconIndex, 1);
 
   if( handle )
     {
@@ -828,7 +828,7 @@
 SHGetFileInfo32A(LPCSTR path,DWORD dwFileAttributes,SHFILEINFO32A *psfi,
 	UINT32 sizeofpsfi,UINT32 flags
 ) {
-	fprintf(stdnimp,"SHGetFileInfo32A(%s,0x%08lx,%p,%ld,0x%08lx)\n",
+	fprintf(stdnimp,"SHGetFileInfo32A(%s,0x%08lx,%p,%d,0x%08x)\n",
 		path,dwFileAttributes,psfi,sizeofpsfi,flags
 	);
 	return TRUE;
diff --git a/misc/toolhelp.c b/misc/toolhelp.c
index ff4c04b..f5f73db 100644
--- a/misc/toolhelp.c
+++ b/misc/toolhelp.c
@@ -22,7 +22,7 @@
  */
 static struct notify
 {
-    HTASK    htask;
+    HTASK16   htask;
     FARPROC16 lpfnCallback;
     WORD     wFlags;
 } *notifys = NULL;
@@ -51,8 +51,7 @@
     return TRUE;
 }
 
-BOOL
-NotifyUnregister(HTASK htask)
+BOOL16 NotifyUnregister( HTASK16 htask )
 {
     int	i;
     
diff --git a/misc/user.c b/misc/user.c
index 5763a46..3516a78 100644
--- a/misc/user.c
+++ b/misc/user.c
@@ -21,8 +21,8 @@
 WORD USER_HeapSel = 0;
 
 
-extern HTASK	TASK_GetNextTask(HTASK);
-extern BOOL32   MENU_SwitchTPWndTo(HTASK);
+extern HTASK16 TASK_GetNextTask(HTASK16);
+extern BOOL32 MENU_SwitchTPWndTo(HTASK16);
 
 /***********************************************************************
  *           GetFreeSystemResources   (USER.284)
@@ -94,9 +94,9 @@
 
 
 /**********************************************************************
- *					USER_InitApp
+ *           InitApp   (USER.5)
  */
-int USER_InitApp(HINSTANCE hInstance)
+INT16 InitApp( HINSTANCE16 hInstance )
 {
     int queueSize;
 
diff --git a/misc/winsocket.c b/misc/winsocket.c
index 5cdae3d..5b496ce 100644
--- a/misc/winsocket.c
+++ b/misc/winsocket.c
@@ -44,7 +44,7 @@
 
 struct ipc_packet {
 	long	mtype;
-	HANDLE	handle;
+	HANDLE16 handle;
 	HWND	hWnd;
 	WORD	wMsg;
 	LONG	lParam;
@@ -114,7 +114,7 @@
 	char scratch[8192];
 };
 static struct WinSockHeap *Heap;
-static HANDLE HeapHandle;
+static HGLOBAL16 HeapHandle;
 #ifndef WINELIB32
 static int ScratchPtr;
 #endif
@@ -1156,9 +1156,9 @@
 /******************** winsock specific functions ************************
  *
  */
-static HANDLE new_handle = 1;
+static HANDLE16 new_handle = 1;
 
-static HANDLE AllocWSAHandle(void)
+static HANDLE16 AllocWSAHandle(void)
 {
 	return new_handle++;
 }
@@ -1198,7 +1198,7 @@
 }
 
 
-static void send_message( HWND hWnd, u_int wMsg, HANDLE handle, long lParam)
+static void send_message( HWND hWnd, u_int wMsg, HANDLE16 handle, long lParam)
 {
 	struct ipc_packet message;
 	
@@ -1216,10 +1216,10 @@
 }
 
 
-HANDLE WSAAsyncGetHostByAddr(HWND hWnd, u_int wMsg, LPCSTR addr,
+HANDLE16 WSAAsyncGetHostByAddr(HWND hWnd, u_int wMsg, LPCSTR addr,
                              INT len, INT type, LPSTR buf, INT buflen)
 {
-	HANDLE handle;
+	HANDLE16 handle;
 	struct hostent *host;
 	int newpid;
 
@@ -1251,10 +1251,10 @@
 }
 
 
-HANDLE WSAAsyncGetHostByName(HWND hWnd, u_int wMsg, LPCSTR name, 
+HANDLE16 WSAAsyncGetHostByName(HWND hWnd, u_int wMsg, LPCSTR name, 
                              LPSTR buf, INT buflen)
 {
-	HANDLE handle;
+	HANDLE16 handle;
 	struct hostent *host;
 	int newpid;
 
@@ -1286,10 +1286,10 @@
 }                     
 
 
-HANDLE WSAAsyncGetProtoByName(HWND hWnd, u_int wMsg, LPCSTR name, 
+HANDLE16 WSAAsyncGetProtoByName(HWND hWnd, u_int wMsg, LPCSTR name, 
                               LPSTR buf, INT buflen)
 {
-	HANDLE handle;
+	HANDLE16 handle;
 	struct protoent *proto;
 	int newpid;
 
@@ -1321,10 +1321,10 @@
 }
 
 
-HANDLE WSAAsyncGetProtoByNumber(HWND hWnd, u_int wMsg, INT number, 
+HANDLE16 WSAAsyncGetProtoByNumber(HWND hWnd, u_int wMsg, INT number, 
                                 LPSTR buf, INT buflen)
 {
-	HANDLE handle;
+	HANDLE16 handle;
 	struct protoent *proto;
 	int newpid;
 
@@ -1356,10 +1356,10 @@
 }
 
 
-HANDLE WSAAsyncGetServByName(HWND hWnd, u_int wMsg, LPCSTR name, 
+HANDLE16 WSAAsyncGetServByName(HWND hWnd, u_int wMsg, LPCSTR name, 
                              LPCSTR proto, LPSTR buf, INT buflen)
 {
-	HANDLE handle;
+	HANDLE16 handle;
 	struct servent *service;
 	int newpid;
 
@@ -1391,10 +1391,10 @@
 }
 
 
-HANDLE WSAAsyncGetServByPort(HWND hWnd, u_int wMsg, INT port, LPCSTR proto,
+HANDLE16 WSAAsyncGetServByPort(HWND hWnd, u_int wMsg, INT port, LPCSTR proto,
                              LPSTR buf, INT buflen)
 {
-	HANDLE handle;
+	HANDLE16 handle;
 	struct servent *service;
 	int newpid;
 
@@ -1493,7 +1493,7 @@
   return 0;
 }                                                            
 
-INT WSACancelAsyncRequest(HANDLE hAsyncTaskHandle)
+INT WSACancelAsyncRequest(HANDLE16 hAsyncTaskHandle)
 {
 	dprintf_winsock(stddeb, "WSA_AsyncRequest: handle %04x\n", hAsyncTaskHandle);
 
diff --git a/miscemu/Makefile.in b/miscemu/Makefile.in
index 4fb7d5f..3fd74e7 100644
--- a/miscemu/Makefile.in
+++ b/miscemu/Makefile.in
@@ -1,6 +1,9 @@
-DEFS   = -D__WINE__ -DNO_TRANSITION_TYPES
-TOPSRC = @top_srcdir@
-MODULE = miscemu
+DEFS      = -D__WINE__ -DNO_TRANSITION_TYPES
+TOPSRCDIR = @top_srcdir@
+TOPOBJDIR = ..
+SRCDIR    = @srcdir@
+VPATH     = @srcdir@
+MODULE    = miscemu
 
 C_SRCS = \
 	cpu.c \
diff --git a/multimedia/Makefile.in b/multimedia/Makefile.in
index d6e1c1c..717bec4 100644
--- a/multimedia/Makefile.in
+++ b/multimedia/Makefile.in
@@ -1,6 +1,9 @@
-DEFS   = -D__WINE__
-TOPSRC = @top_srcdir@
-MODULE = multimedia
+DEFS      = -D__WINE__
+TOPSRCDIR = @top_srcdir@
+TOPOBJDIR = ..
+SRCDIR    = @srcdir@
+VPATH     = @srcdir@
+MODULE    = multimedia
 
 C_SRCS = \
 	audio.c \
diff --git a/multimedia/audio.c b/multimedia/audio.c
index 4b4cbef..f92a6b7 100644
--- a/multimedia/audio.c
+++ b/multimedia/audio.c
@@ -71,7 +71,7 @@
     int     nUseCount;          /* Incremented for each shared open */
     BOOL    fShareable;         /* TRUE if first open was shareable */
     WORD    wNotifyDeviceID;    /* MCI device ID with a pending notification */
-    HANDLE  hCallback;          /* Callback handle for pending notification */
+    HANDLE16 hCallback;          /* Callback handle for pending notification */
 	HMMIO16	hFile;				/* mmio file handle open as Element		*/
 	MCI_WAVE_OPEN_PARMS openParms;
 	PCMWAVEFORMAT	WaveFormat;
@@ -104,9 +104,9 @@
 * 				WAVE_mciOpen	*/
 static DWORD WAVE_mciOpen(UINT wDevID, DWORD dwFlags, LPMCI_WAVE_OPEN_PARMS lpParms)
 {
-	HANDLE		hFormat;
+	HLOCAL16	hFormat;
 	LPPCMWAVEFORMAT	lpWaveFormat;
-	HANDLE		hDesc;
+	HLOCAL16	hDesc;
 	LPWAVEOPENDESC 	lpDesc;
 	LPSTR		lpstrElementName;
 	DWORD		dwRet;
@@ -246,8 +246,8 @@
 {
 	int				start, end;
 	LONG			bufsize, count;
-	HANDLE			hData;
-	HANDLE			hWaveHdr;
+	HGLOBAL16		hData;
+	HLOCAL16		hWaveHdr;
 	LPWAVEHDR		lpWaveHdr;
 	LPWAVEHDR		lp16WaveHdr;
 	DWORD			dwRet;
@@ -331,8 +331,8 @@
 {
 	int				start, end;
 	LONG			bufsize;
-	HANDLE			hData;
-	HANDLE			hWaveHdr;
+	HGLOBAL16		hData;
+	HLOCAL16		hWaveHdr;
 	LPWAVEHDR		lpWaveHdr;
 	LPWAVEHDR		lp16WaveHdr;
 	DWORD			dwRet;
diff --git a/multimedia/mcianim.c b/multimedia/mcianim.c
index ac22ac1..3620d74 100644
--- a/multimedia/mcianim.c
+++ b/multimedia/mcianim.c
@@ -34,7 +34,7 @@
     int     nUseCount;          /* Incremented for each shared open */
     BOOL    fShareable;         /* TRUE if first open was shareable */
     WORD    wNotifyDeviceID;    /* MCI device ID with a pending notification */
-    HANDLE  hCallback;          /* Callback handle for pending notification */
+    HANDLE16 hCallback;          /* Callback handle for pending notification */
 	MCI_OPEN_PARMS openParms;
 	DWORD	dwTimeFormat;
 	int		mode;
diff --git a/multimedia/mcicda.c b/multimedia/mcicda.c
index f654573..7562e5e 100644
--- a/multimedia/mcicda.c
+++ b/multimedia/mcicda.c
@@ -56,7 +56,7 @@
     int     nUseCount;          /* Incremented for each shared open */
     BOOL    fShareable;         /* TRUE if first open was shareable */
     WORD    wNotifyDeviceID;    /* MCI device ID with a pending notification */
-    HANDLE  hCallback;          /* Callback handle for pending notification */
+    HANDLE16 hCallback;          /* Callback handle for pending notification */
 	MCI_OPEN_PARMS openParms;
 	DWORD	dwTimeFormat;
 	int		unixdev;
diff --git a/multimedia/midi.c b/multimedia/midi.c
index 6c38c30..b86c933 100644
--- a/multimedia/midi.c
+++ b/multimedia/midi.c
@@ -67,7 +67,7 @@
 	int     nUseCount;          /* Incremented for each shared open */
 	BOOL    fShareable;         /* TRUE if first open was shareable */
 	WORD    wNotifyDeviceID;    /* MCI device ID with a pending notification */
-	HANDLE  hCallback;          /* Callback handle for pending notification */
+	HANDLE16 hCallback;         /* Callback handle for pending notification */
 	HMMIO16	hFile;				/* mmio file handle open as Element		*/
 	DWORD	dwBeginData;
 	DWORD	dwTotalLen;
diff --git a/multimedia/mmsystem.c b/multimedia/mmsystem.c
index a1fef77..c8a066a1 100644
--- a/multimedia/mmsystem.c
+++ b/multimedia/mmsystem.c
@@ -52,7 +52,7 @@
 /**************************************************************************
 * 				MMSYSTEM_WEP		[MMSYSTEM.1]
 */
-int MMSYSTEM_WEP(HANDLE hInstance, WORD wDataSeg,
+int MMSYSTEM_WEP(HINSTANCE16 hInstance, WORD wDataSeg,
 		 WORD cbHeapSize, LPSTR lpCmdLine)
 {
 	/* isn't WEP the Windows Exit Procedure ? */
@@ -68,16 +68,16 @@
 	HMMIO16			hmmio;
 	MMCKINFO		mmckInfo;
 	MMCKINFO		ckMainRIFF;
-	HANDLE			hFormat;
+	HLOCAL16		hFormat;
 	PCMWAVEFORMAT 	pcmWaveFormat;
 	int				count;
 	int				bufsize;
-	HANDLE			hDesc;
+	HLOCAL16		hDesc;
 	LPWAVEOPENDESC 	lpWaveDesc;
-	HANDLE			hWaveHdr;
+	HLOCAL16		hWaveHdr;
 	LPWAVEHDR		lpWaveHdr;
 	LPWAVEHDR		lp16WaveHdr;
-	HANDLE			hData;
+	HLOCAL16		hData;
 	DWORD			dwRet;
 	char			str[128];
 	LPSTR			ptr;
@@ -201,7 +201,7 @@
 /**************************************************************************
 * 				DriverCallback	[MMSYSTEM.31]
 */
-BOOL DriverCallback(DWORD dwCallBack, UINT uFlags, HANDLE hDev, 
+BOOL DriverCallback(DWORD dwCallBack, UINT uFlags, HANDLE16 hDev, 
 		WORD wMsg, DWORD dwUser, DWORD dwParam1, DWORD dwParam2)
 {
 	dprintf_mmsys(stddeb, "DriverCallback(%08lX, %04X, %04X, %04X, %08lX, %08lX, %08lX); !\n",
@@ -552,7 +552,7 @@
 */
 
 #define	_MCI_STRDUP_TO_SEG(dest,source) {\
-	HANDLE	x;\
+	HLOCAL16 x;\
 	x=USER_HEAP_ALLOC(strlen(source)+1);\
 	dest=(LPSTR)MAKELONG(x,USER_HeapSel);\
 	strcpy(PTR_SEG_TO_LIN(dest),source);\
@@ -865,7 +865,7 @@
 /**************************************************************************
 * 				mciGetCreatorTask	[MMSYSTEM.717]
 */
-HTASK mciGetCreatorTask(UINT uDeviceID)
+HTASK16 mciGetCreatorTask(UINT uDeviceID)
 {
     return 0;
 }
@@ -2219,7 +2219,7 @@
 /**************************************************************************
 * 				DrvGetModuleHandle	[MMSYSTEM.1103]
 */
-HANDLE DrvGetModuleHandle(HDRVR16 hDrvr)
+HANDLE16 DrvGetModuleHandle(HDRVR16 hDrvr)
 {
 	dprintf_mmsys(stddeb, "DrvGetModuleHandle(%04X);\n", hDrvr);
         return 0;
diff --git a/multimedia/time.c b/multimedia/time.c
index 299405e..a6b4795 100644
--- a/multimedia/time.c
+++ b/multimedia/time.c
@@ -28,7 +28,7 @@
     WORD wDelay;
     WORD wResol;
     FARPROC16 lpFunc;
-    HINSTANCE hInstance;
+    HINSTANCE16 hInstance;
     DWORD dwUser;
     WORD wFlags;
     WORD wTimerID;
diff --git a/objects/Makefile.in b/objects/Makefile.in
index 0829312..56b3307 100644
--- a/objects/Makefile.in
+++ b/objects/Makefile.in
@@ -1,6 +1,9 @@
-DEFS   = -D__WINE__
-TOPSRC = @top_srcdir@
-MODULE = objects
+DEFS      = -D__WINE__
+TOPSRCDIR = @top_srcdir@
+TOPOBJDIR = ..
+SRCDIR    = @srcdir@
+VPATH     = @srcdir@
+MODULE    = objects
 
 C_SRCS = \
 	bitblt.c \
diff --git a/objects/bitmap.c b/objects/bitmap.c
index 53237a8..926f176 100644
--- a/objects/bitmap.c
+++ b/objects/bitmap.c
@@ -124,7 +124,7 @@
  */
 HBITMAP16 CreateCompatibleBitmap( HDC32 hdc, INT32 width, INT32 height )
 {
-    HBITMAP hbmpRet = 0;
+    HBITMAP16 hbmpRet = 0;
     DC *dc;
 
     dprintf_gdi( stddeb, "CreateCompatibleBitmap(%04x,%d,%d) = \n", 
@@ -421,8 +421,8 @@
 HBITMAP16 BITMAP_SelectObject( DC * dc, HBITMAP16 hbitmap,
                                BITMAPOBJ * bmp )
 {
-    HRGN hrgn;
-    HBITMAP prevHandle = dc->w.hBitmap;
+    HRGN32 hrgn;
+    HBITMAP16 prevHandle = dc->w.hBitmap;
     
     if (!(dc->w.flags & DC_MEMORY)) return 0;
 
diff --git a/objects/brush.c b/objects/brush.c
index 27c847f..3816170 100644
--- a/objects/brush.c
+++ b/objects/brush.c
@@ -141,10 +141,10 @@
 /***********************************************************************
  *           CreateBrushIndirect    (GDI.50)
  */
-HBRUSH CreateBrushIndirect( const LOGBRUSH16 * brush )
+HBRUSH16 CreateBrushIndirect( const LOGBRUSH16 * brush )
 {
     BRUSHOBJ * brushPtr;
-    HBRUSH hbrush = GDI_AllocObject( sizeof(BRUSHOBJ), BRUSH_MAGIC );
+    HBRUSH16 hbrush = GDI_AllocObject( sizeof(BRUSHOBJ), BRUSH_MAGIC );
     if (!hbrush) return 0;
     brushPtr = (BRUSHOBJ *) GDI_HEAP_LIN_ADDR( hbrush );
     memcpy( &brushPtr->logbrush, brush, sizeof(*brush) );
@@ -155,7 +155,7 @@
 /***********************************************************************
  *           CreateHatchBrush    (GDI.58)
  */
-HBRUSH CreateHatchBrush( INT style, COLORREF color )
+HBRUSH16 CreateHatchBrush( INT style, COLORREF color )
 {
     LOGBRUSH16 logbrush = { BS_HATCHED, color, style };
     dprintf_gdi(stddeb, "CreateHatchBrush: %d %06lx\n", style, color );
@@ -167,7 +167,7 @@
 /***********************************************************************
  *           CreatePatternBrush    (GDI.60)
  */
-HBRUSH CreatePatternBrush( HBITMAP hbitmap )
+HBRUSH16 CreatePatternBrush( HBITMAP16 hbitmap )
 {
     LOGBRUSH16 logbrush = { BS_PATTERN, 0, 0 };
     BITMAPOBJ *bmp, *newbmp;
@@ -179,7 +179,7 @@
     if (!(bmp = (BITMAPOBJ *) GDI_GetObjPtr( hbitmap, BITMAP_MAGIC )))
 	return 0;
     logbrush.lbHatch = (INT16)CreateBitmapIndirect16( &bmp->bitmap );
-    newbmp = (BITMAPOBJ *) GDI_GetObjPtr( (HANDLE)logbrush.lbHatch, BITMAP_MAGIC );
+    newbmp = (BITMAPOBJ *) GDI_GetObjPtr( (HGDIOBJ16)logbrush.lbHatch, BITMAP_MAGIC );
     if (!newbmp) return 0;
     XCopyArea( display, bmp->pixmap, newbmp->pixmap, BITMAP_GC(bmp),
 	       0, 0, bmp->bitmap.bmWidth, bmp->bitmap.bmHeight, 0, 0 );
@@ -190,7 +190,7 @@
 /***********************************************************************
  *           CreateDIBPatternBrush    (GDI.445)
  */
-HBRUSH CreateDIBPatternBrush( HGLOBAL16 hbitmap, UINT coloruse )
+HBRUSH16 CreateDIBPatternBrush( HGLOBAL16 hbitmap, UINT coloruse )
 {
     LOGBRUSH16 logbrush = { BS_DIBPATTERN, coloruse, 0 };
     BITMAPINFO *info, *newInfo;
@@ -214,9 +214,9 @@
 	GlobalUnlock16( hbitmap );
 	return 0;
     }
-    newInfo = (BITMAPINFO *) GlobalLock16( (HANDLE)logbrush.lbHatch );
+    newInfo = (BITMAPINFO *) GlobalLock16( (HGLOBAL16)logbrush.lbHatch );
     memcpy( newInfo, info, size );
-    GlobalUnlock16( (HANDLE)logbrush.lbHatch );
+    GlobalUnlock16( (HGLOBAL16)logbrush.lbHatch );
     GlobalUnlock16( hbitmap );
     return CreateBrushIndirect( &logbrush );
 }
@@ -225,7 +225,7 @@
 /***********************************************************************
  *           CreateSolidBrush    (GDI.66)
  */
-HBRUSH CreateSolidBrush( COLORREF color )
+HBRUSH16 CreateSolidBrush( COLORREF color )
 {
     LOGBRUSH16 logbrush = { BS_SOLID, color, 0 };
     dprintf_gdi(stddeb, "CreateSolidBrush: %06lx\n", color );
@@ -270,7 +270,7 @@
 /***********************************************************************
  *           GetSysColorBrush    (USER.281)
  */
-HBRUSH GetSysColorBrush(WORD x)
+HBRUSH16 GetSysColorBrush(WORD x)
 {
     fprintf( stderr, "Unimplemented stub: GetSysColorBrush(%d)\n", x );
     return GetStockObject(LTGRAY_BRUSH);
@@ -280,15 +280,15 @@
 /***********************************************************************
  *           BRUSH_DeleteObject
  */
-BOOL BRUSH_DeleteObject( HBRUSH hbrush, BRUSHOBJ * brush )
+BOOL32 BRUSH_DeleteObject( HBRUSH16 hbrush, BRUSHOBJ * brush )
 {
     switch(brush->logbrush.lbStyle)
     {
       case BS_PATTERN:
-	  DeleteObject( (HANDLE)brush->logbrush.lbHatch );
+	  DeleteObject( (HGDIOBJ16)brush->logbrush.lbHatch );
 	  break;
       case BS_DIBPATTERN:
-	  GlobalFree16( (HANDLE)brush->logbrush.lbHatch );
+	  GlobalFree16( (HGLOBAL16)brush->logbrush.lbHatch );
 	  break;
     }
     return GDI_FreeObject( hbrush );
@@ -330,7 +330,7 @@
 /***********************************************************************
  *           BRUSH_SelectPatternBrush
  */
-static BOOL BRUSH_SelectPatternBrush( DC * dc, HBITMAP hbitmap )
+static BOOL BRUSH_SelectPatternBrush( DC * dc, HBITMAP16 hbitmap )
 {
     BITMAPOBJ * bmp = (BITMAPOBJ *) GDI_GetObjPtr( hbitmap, BITMAP_MAGIC );
     if (!bmp) return FALSE;
@@ -357,11 +357,11 @@
 /***********************************************************************
  *           BRUSH_SelectObject
  */
-HBRUSH BRUSH_SelectObject( DC * dc, HBRUSH hbrush, BRUSHOBJ * brush )
+HBRUSH16 BRUSH_SelectObject( DC * dc, HBRUSH16 hbrush, BRUSHOBJ * brush )
 {
-    HBITMAP hBitmap;
+    HBITMAP16 hBitmap;
     BITMAPINFO * bmpInfo;
-    HBRUSH prevHandle = dc->w.hBrush;
+    HBRUSH16 prevHandle = dc->w.hBrush;
 
     dprintf_gdi(stddeb, "Brush_SelectObject: hdc=%04x hbrush=%04x\n",
                 dc->hSelf,hbrush);
@@ -373,16 +373,16 @@
 	case BS_HATCHED:
 	case BS_HOLLOW:
 	    if (!MF_CreateBrushIndirect(dc, hbrush, &(brush->logbrush)))
-		return (HBRUSH)0;
+		return (HBRUSH16)0;
 	    break;
 
 	case BS_PATTERN:
 	case BS_DIBPATTERN:
 	    if (!MF_CreatePatternBrush(dc, hbrush, &(brush->logbrush)))
-		return (HBRUSH)0;
+		return (HBRUSH16)0;
 	    break;
 	}
-	return (HBRUSH)1;
+	return (HBRUSH16)1;
     }
     
     dc->w.hBrush = hbrush;
@@ -415,12 +415,12 @@
 	
       case BS_PATTERN:
 	dprintf_gdi( stddeb, "BS_PATTERN\n");
-	BRUSH_SelectPatternBrush( dc, (HBRUSH)brush->logbrush.lbHatch );
+	BRUSH_SelectPatternBrush( dc, (HBRUSH16)brush->logbrush.lbHatch );
 	break;
 
       case BS_DIBPATTERN:
 	dprintf_gdi( stddeb, "BS_DIBPATTERN\n");
-	if ((bmpInfo = (BITMAPINFO *) GlobalLock16( (HANDLE)brush->logbrush.lbHatch )))
+	if ((bmpInfo = (BITMAPINFO *) GlobalLock16( (HGLOBAL16)brush->logbrush.lbHatch )))
 	{
 	    int size = DIB_BitmapInfoSize( bmpInfo, brush->logbrush.lbColor );
 	    hBitmap = CreateDIBitmap( dc->hSelf, &bmpInfo->bmiHeader, CBM_INIT,
@@ -428,7 +428,7 @@
 				      (WORD) brush->logbrush.lbColor );
 	    BRUSH_SelectPatternBrush( dc, hBitmap );
 	    DeleteObject( hBitmap );
-	    GlobalUnlock16( (HANDLE)brush->logbrush.lbHatch );	    
+	    GlobalUnlock16( (HGLOBAL16)brush->logbrush.lbHatch );	    
 	}
 	
 	break;
diff --git a/objects/clipping.c b/objects/clipping.c
index 29a5cb4..eae9dbc 100644
--- a/objects/clipping.c
+++ b/objects/clipping.c
@@ -12,7 +12,11 @@
 /* #define DEBUG_CLIPPING */
 #include "debug.h"
 
-#define UpdateDirtyDC(dc) DC_CallHookProc( dc, DCHC_INVALIDVISRGN, 0 )
+#define UPDATE_DIRTY_DC(dc) \
+ do { \
+   if ((dc)->hookProc && !((dc)->w.flags & (DC_SAVED | DC_MEMORY))) \
+     (dc)->hookProc( (dc)->hSelf, DCHC_INVALIDVISRGN, (dc)->dwHookData, 0 ); \
+ } while(0)
 
 /***********************************************************************
  *           CLIPPING_SetDeviceClipping
@@ -56,7 +60,7 @@
 
     if (dc->w.flags & DC_DIRTY)
     {
-        UpdateDirtyDC(dc);
+        UPDATE_DIRTY_DC(dc);
         dc->w.flags &= ~DC_DIRTY;
     }
 
@@ -71,7 +75,7 @@
 /***********************************************************************
  *           SelectClipRgn    (GDI.44)
  */
-int SelectClipRgn( HDC hdc, HRGN hrgn )
+int SelectClipRgn( HDC hdc, HRGN32 hrgn )
 {
     int retval;
     DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC );
@@ -99,7 +103,7 @@
 /***********************************************************************
  *           SelectVisRgn    (GDI.105)
  */
-int SelectVisRgn( HDC hdc, HRGN hrgn )
+int SelectVisRgn( HDC hdc, HRGN32 hrgn )
 {
     int retval;
     DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC );
@@ -166,7 +170,7 @@
 int CLIPPING_IntersectClipRect( DC * dc, short left, short top,
                                          short right, short bottom, UINT16 flags)
 {
-    HRGN	newRgn;
+    HRGN32 newRgn;
     int 	ret;
 
     if ( !(newRgn = CreateRectRgn( left, top, right, bottom )) ) return ERROR;
@@ -253,7 +257,7 @@
 static int CLIPPING_IntersectVisRect( DC * dc, short left, short top,
                                       short right, short bottom, BOOL exclude )
 {
-    HRGN tempRgn, newRgn;
+    HRGN32 tempRgn, newRgn;
     int ret;
 
     left   = XLPTODP( dc, left );
@@ -325,7 +329,7 @@
     dprintf_clipping(stddeb, "PtVisible: %04x %d,%d\n", hdc, x, y );
     if (!dc->w.hGCClipRgn) return FALSE;
 
-    if( dc->w.flags & DC_DIRTY ) UpdateDirtyDC(dc);
+    if( dc->w.flags & DC_DIRTY ) UPDATE_DIRTY_DC(dc);
     dc->w.flags &= ~DC_DIRTY;
 
     return PtInRegion( dc->w.hGCClipRgn, XLPTODP(dc,x), YLPTODP(dc,y) );
@@ -392,9 +396,9 @@
 /***********************************************************************
  *           SaveVisRgn    (GDI.129)
  */
-HRGN SaveVisRgn( HDC hdc )
+HRGN32 SaveVisRgn( HDC hdc )
 {
-    HRGN copy;
+    HRGN32 copy;
     RGNOBJ *obj, *copyObj;
     DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC );
     if (!dc) return 0;
@@ -404,7 +408,7 @@
         fprintf( stderr, "SaveVisRgn: hVisRgn is zero. Please report this.\n" );
         exit(1);
     }
-    if( dc->w.flags & DC_DIRTY ) UpdateDirtyDC(dc);
+    if( dc->w.flags & DC_DIRTY ) UPDATE_DIRTY_DC(dc);
     dc->w.flags &= ~DC_DIRTY;
 
     if (!(obj = (RGNOBJ *) GDI_GetObjPtr( dc->w.hVisRgn, REGION_MAGIC )))
@@ -424,7 +428,7 @@
  */
 int RestoreVisRgn( HDC hdc )
 {
-    HRGN saved;
+    HRGN32 saved;
     RGNOBJ *obj, *savedObj;
     DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC );
     if (!dc || !dc->w.hVisRgn) return ERROR;    
diff --git a/objects/cursoricon.c b/objects/cursoricon.c
index 180e1ae..064d02b 100644
--- a/objects/cursoricon.c
+++ b/objects/cursoricon.c
@@ -232,10 +232,10 @@
  *
  * Create a cursor or icon from a resource.
  */
-HANDLE CURSORICON_LoadHandler( HANDLE handle, HINSTANCE hInstance,
-                                      BOOL fCursor )
+HGLOBAL16 CURSORICON_LoadHandler( HGLOBAL16 handle, HINSTANCE16 hInstance,
+                                  BOOL fCursor )
 {
-    HANDLE hAndBits, hXorBits;
+    HBITMAP16 hAndBits, hXorBits;
     HDC32 hdc;
     int size, sizeAnd, sizeXor;
     POINT16 hotspot = { 0 ,0 };
@@ -367,10 +367,11 @@
  *
  * Load a cursor or icon.
  */
-static HANDLE CURSORICON_Load( HANDLE hInstance, SEGPTR name, int width,
-                               int height, int colors, BOOL fCursor )
+static HGLOBAL16 CURSORICON_Load( HINSTANCE16 hInstance, SEGPTR name,
+                                  int width, int height, int colors,
+                                  BOOL fCursor )
 {
-    HANDLE handle,hRet;
+    HGLOBAL16 handle, hRet;
     HRSRC16 hRsrc;
     CURSORICONDIRENTRY dirEntry;
 
@@ -408,11 +409,11 @@
  *
  * Make a copy of a cursor or icon.
  */
-static HANDLE CURSORICON_Copy( HANDLE hInstance, HANDLE handle )
+static HGLOBAL16 CURSORICON_Copy( HINSTANCE16 hInstance, HGLOBAL16 handle )
 {
     char *ptrOld, *ptrNew;
     int size;
-    HANDLE hNew;
+    HGLOBAL16 hNew;
 
     if (!(ptrOld = (char *)GlobalLock16( handle ))) return 0;
     if (!(hInstance = GetExePtr( hInstance ))) return 0;
@@ -446,9 +447,7 @@
        else 
 	  {
 	   /* kludge */
-
-	   HTASK hTask = GetCurrentTask();
-	   TDB*  pTask = (TDB *)GlobalLock16(hTask);
+	   TDB* pTask = (TDB *)GlobalLock16( GetCurrentTask() );
 
 	   if(!pTask) return 0;
 
@@ -499,7 +498,7 @@
 /***********************************************************************
  *           CreateCursor    (USER.406)
  */
-HCURSOR16 CreateCursor( HINSTANCE hInstance, INT xHotSpot, INT yHotSpot,
+HCURSOR16 CreateCursor( HINSTANCE16 hInstance, INT xHotSpot, INT yHotSpot,
                         INT nWidth, INT nHeight,
                         const BYTE *lpANDbits, const BYTE *lpXORbits )
 {
@@ -514,7 +513,7 @@
 /***********************************************************************
  *           CreateIcon    (USER.407)
  */
-HICON16 CreateIcon( HINSTANCE hInstance, INT nWidth, INT nHeight, BYTE bPlanes,
+HICON16 CreateIcon( HINSTANCE16 hInstance, INT nWidth, INT nHeight, BYTE bPlanes,
                   BYTE bBitsPixel, const BYTE* lpANDbits, const BYTE* lpXORbits)
 {
     CURSORICONINFO info = { { 0, 0 }, nWidth, nHeight, 0, bPlanes, bBitsPixel };
@@ -528,10 +527,12 @@
 /***********************************************************************
  *           CreateCursorIconIndirect    (USER.408)
  */
-HANDLE CreateCursorIconIndirect( HANDLE hInstance, CURSORICONINFO *info,
-                                 const BYTE *lpANDbits, const BYTE *lpXORbits )
+HGLOBAL16 CreateCursorIconIndirect( HINSTANCE16 hInstance,
+                                    CURSORICONINFO *info,
+                                    const BYTE *lpANDbits,
+                                    const BYTE *lpXORbits )
 {
-    HANDLE handle;
+    HGLOBAL16 handle;
     char *ptr;
     int sizeAnd, sizeXor;
 
@@ -611,7 +612,7 @@
 {
     CURSORICONINFO *ptr;
     HDC hMemDC;
-    HBITMAP hXorBits, hAndBits;
+    HBITMAP16 hXorBits, hAndBits;
     COLORREF oldFg, oldBg;
 
     if (!(ptr = (CURSORICONINFO *)GlobalLock16( hIcon ))) return FALSE;
@@ -625,7 +626,7 @@
 
     if (hXorBits && hAndBits)
     {
-        HBITMAP hBitTemp = SelectObject( hMemDC, hAndBits );
+        HBITMAP16 hBitTemp = SelectObject( hMemDC, hAndBits );
         BitBlt( hdc, x, y, ptr->nWidth, ptr->nHeight, hMemDC, 0, 0, SRCAND );
         SelectObject( hMemDC, hXorBits );
         BitBlt( hdc, x, y, ptr->nWidth, ptr->nHeight, hMemDC, 0, 0, SRCINVERT);
@@ -934,7 +935,7 @@
 /**********************************************************************
  *	    GetIconID    (USER.455)
  */
-WORD GetIconID( HANDLE hResource, DWORD resType )
+WORD GetIconID( HGLOBAL16 hResource, DWORD resType )
 {
     CURSORICONDIR *lpDir = (CURSORICONDIR *)GlobalLock16(hResource);
 /* LockResource16(hResource); */
@@ -973,7 +974,7 @@
 /**********************************************************************
  *	    LoadIconHandler    (USER.456)
  */
-HICON16 LoadIconHandler( HANDLE hResource, BOOL bNew )
+HICON16 LoadIconHandler( HGLOBAL16 hResource, BOOL bNew )
 {
     dprintf_cursor(stddeb,"LoadIconHandler: hRes=%04x\n",hResource);
 
diff --git a/objects/dc.c b/objects/dc.c
index 76d925a..f777779 100644
--- a/objects/dc.c
+++ b/objects/dc.c
@@ -14,20 +14,15 @@
 #include "color.h"
 #include "debug.h"
 #include "font.h"
-#include "callback.h"
 #include "xmalloc.h"
 
 extern void CLIPPING_UpdateGCRegion( DC * dc );     /* objects/clipping.c */
-extern BOOL DCHook( HDC, WORD, DWORD, DWORD );      /* windows/dce.c */
 
   /* Default DC values */
 static const WIN_DC_INFO DC_defaultValues =
 {
     0,                      /* flags */
     NULL,                   /* devCaps */
-    0,                      /* hMetaFile */
-    0,			    /* hHT */
-    0,			    /* HTLen */
     0,                      /* hClipRgn */
     0,                      /* hVisRgn */
     0,                      /* hGCClipRgn */
@@ -146,6 +141,41 @@
 
 
 /***********************************************************************
+ *           DC_AllocDC
+ */
+DC *DC_AllocDC( const DC_FUNCTIONS *funcs )
+{
+    HDC16 hdc;
+    DC *dc;
+
+    if (!(hdc = GDI_AllocObject( sizeof(DC), DC_MAGIC ))) return NULL;
+    dc = (DC *) GDI_HEAP_LIN_ADDR( hdc );
+
+    dc->hSelf      = hdc;
+    dc->funcs      = funcs;
+    dc->physDev    = NULL;
+    dc->saveLevel  = 0;
+    dc->dwHookData = 0L;
+    dc->hookProc   = NULL;
+
+    memcpy( &dc->w, &DC_defaultValues, sizeof(DC_defaultValues) );
+    return dc;
+}
+
+
+/***********************************************************************
+ *           DC_GetDCPtr
+ */
+DC *DC_GetDCPtr( HDC32 hdc )
+{
+    GDIOBJHDR *ptr = (GDIOBJHDR *)GDI_HEAP_LIN_ADDR( hdc );
+    if ((ptr->wMagic == DC_MAGIC) || (ptr->wMagic == METAFILE_DC_MAGIC))
+        return (DC *)ptr;
+    return NULL;
+}
+
+
+/***********************************************************************
  *           DC_InitDC
  *
  * Setup device-specific DC values for a newly created DC.
@@ -169,7 +199,7 @@
  * If fMapColors is TRUE, X pixels are mapped to Windows colors.
  * Return FALSE if brush is BS_NULL, TRUE otherwise.
  */
-BOOL DC_SetupGCForPatBlt( DC * dc, GC gc, BOOL fMapColors )
+BOOL32 DC_SetupGCForPatBlt( DC * dc, GC gc, BOOL32 fMapColors )
 {
     XGCValues val;
     unsigned long mask;
@@ -251,7 +281,7 @@
  * Setup dc->u.x.gc for drawing operations using current brush.
  * Return FALSE if brush is BS_NULL, TRUE otherwise.
  */
-BOOL DC_SetupGCForBrush( DC * dc )
+BOOL32 DC_SetupGCForBrush( DC * dc )
 {
     return DC_SetupGCForPatBlt( dc, dc->u.x.gc, FALSE );
 }
@@ -263,7 +293,7 @@
  * Setup dc->u.x.gc for drawing operations using current pen.
  * Return FALSE if pen is PS_NULL, TRUE otherwise.
  */
-BOOL DC_SetupGCForPen( DC * dc )
+BOOL32 DC_SetupGCForPen( DC * dc )
 {
     XGCValues val;
 
@@ -309,7 +339,7 @@
  * Setup dc->u.x.gc for text drawing operations.
  * Return FALSE if the font is null, TRUE otherwise.
  */
-BOOL DC_SetupGCForText( DC * dc )
+BOOL32 DC_SetupGCForText( DC * dc )
 {
     XGCValues val;
 
@@ -334,32 +364,12 @@
 
 
 /***********************************************************************
- *           DC_CallHookProc
- */
-BOOL DC_CallHookProc(DC* dc, WORD code, LPARAM lParam)
-{
-  BOOL bRet = FALSE;
-  FARPROC16 ptr = GDI_GetDefDCHook();
-
-  dprintf_dc(stddeb,"CallDCHook: code %04x\n", code);
-
-  /* if 16-bit callback is, in fact, a thunk to DCHook simply call DCHook */
-
-  if( dc->hookProc && !(dc->w.flags & (DC_SAVED | DC_MEMORY)) )
-    bRet = (dc->hookProc == ptr) ?
-          DCHook(dc->hSelf, code, dc->dwHookData, lParam):
-          CallDCHookProc(dc->hookProc, dc->hSelf, code, dc->dwHookData, lParam);
-
-  return bRet;
-}
-
-/***********************************************************************
  *           GetDCState    (GDI.179)
  */
 HDC GetDCState( HDC hdc )
 {
     DC * newdc, * dc;
-    HANDLE handle;
+    HGDIOBJ16 handle;
     
     if (!(dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC ))) return 0;
     if (!(handle = GDI_AllocObject( sizeof(DC), DC_MAGIC ))) return 0;
@@ -393,9 +403,9 @@
 void SetDCState( HDC hdc, HDC hdcs )
 {
     DC * dc, * dcs;
-    HRGN hVisRgn, hClipRgn, hGCClipRgn;
-    HFONT hfont;
-    HBRUSH hbrush;
+    HRGN32 hVisRgn, hClipRgn, hGCClipRgn;
+    HFONT16 hfont;
+    HBRUSH16 hbrush;
     
     if (!(dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC ))) return;
     if (!(dcs = (DC *) GDI_GetObjPtr( hdcs, DC_MAGIC ))) return;
@@ -489,39 +499,25 @@
 HDC CreateDC( LPCSTR driver, LPCSTR device, LPCSTR output, const DEVMODE* initData )
 {
     DC * dc;
-    HDC16 handle;
     const DC_FUNCTIONS *funcs;
 
     if (!(funcs = DRIVER_FindDriver( driver ))) return 0;
-
-    handle = GDI_AllocObject( sizeof(DC), DC_MAGIC );
-    if (!handle) return 0;
-    dc = (DC *) GDI_HEAP_LIN_ADDR( handle );
+    if (!(dc = DC_AllocDC( funcs ))) return 0;
+    dc->w.flags = 0;
 
     dprintf_dc(stddeb, "CreateDC(%s %s %s): returning %04x\n",
-	    driver, device, output, handle );
-
-    dc->hSelf      = handle;
-    dc->funcs      = funcs;
-    dc->physDev    = NULL;
-    dc->saveLevel  = 0;
-    dc->dwHookData = 0L;
-    dc->hookProc   = (SEGPTR)0;
-
-    memcpy( &dc->w, &DC_defaultValues, sizeof(DC_defaultValues) );
-    dc->w.flags = 0;
+               driver, device, output, dc->hSelf );
 
     if (dc->funcs->pCreateDC &&
         !dc->funcs->pCreateDC( dc, driver, device, output, initData ))
     {
         dprintf_dc( stddeb, "CreateDC: creation aborted by device\n" );
-        GDI_HEAP_FREE( handle );
+        GDI_HEAP_FREE( dc->hSelf );
         return 0;
     }
 
     DC_InitDC( dc );
-
-    return handle;
+    return dc->hSelf;
 }
 
 
@@ -541,35 +537,24 @@
 HDC CreateCompatibleDC( HDC hdc )
 {
     DC *dc, *origDC;
-    HDC16 handle;
-    HBITMAP hbitmap;
+    HBITMAP16 hbitmap;
     const DC_FUNCTIONS *funcs;
 
     if ((origDC = (DC *)GDI_GetObjPtr( hdc, DC_MAGIC ))) funcs = origDC->funcs;
     else funcs = DRIVER_FindDriver( "DISPLAY" );
     if (!funcs) return 0;
 
-    handle = GDI_AllocObject( sizeof(DC), DC_MAGIC );
-    if (!handle) return 0;
-    dc = (DC *) GDI_HEAP_LIN_ADDR( handle );
+    if (!(dc = DC_AllocDC( funcs ))) return 0;
 
-    dprintf_dc(stddeb, "CreateCompatibleDC(%04x): returning %04x\n", hdc, handle );
+    dprintf_dc(stddeb, "CreateCompatibleDC(%04x): returning %04x\n",
+               hdc, dc->hSelf );
 
       /* Create default bitmap */
     if (!(hbitmap = CreateBitmap( 1, 1, 1, 1, NULL )))
     {
-	GDI_HEAP_FREE( handle );
+	GDI_HEAP_FREE( dc->hSelf );
 	return 0;
     }
-
-    memcpy( &dc->w, &DC_defaultValues, sizeof(DC_defaultValues) );
-
-    dc->hSelf          = handle;
-    dc->funcs          = funcs;
-    dc->physDev        = NULL;
-    dc->saveLevel      = 0;
-    dc->dwHookData     = 0L;
-    dc->hookProc       = (SEGPTR)0;
     dc->w.flags        = DC_MEMORY;
     dc->w.bitsPerPixel = 1;
     dc->w.hBitmap      = hbitmap;
@@ -580,13 +565,12 @@
     {
         dprintf_dc( stddeb, "CreateDC: creation aborted by device\n" );
         DeleteObject( hbitmap );
-        GDI_HEAP_FREE( handle );
+        GDI_HEAP_FREE( dc->hSelf );
         return 0;
     }
 
     DC_InitDC( dc );
-
-    return handle;
+    return dc->hSelf;
 }
 
 
@@ -751,12 +735,12 @@
 /***********************************************************************
  *           SetDCHook   (GDI.190)
  */
-BOOL SetDCHook( HDC hDC, FARPROC16 hookProc, DWORD dwHookData )
+BOOL16 SetDCHook( HDC16 hdc, FARPROC16 hookProc, DWORD dwHookData )
 {
-    DC *dc = (DC *)GDI_GetObjPtr( hDC, DC_MAGIC );
+    DC *dc = (DC *)GDI_GetObjPtr( hdc, DC_MAGIC );
 
     dprintf_dc( stddeb, "SetDCHook: hookProc %08x, default is %08x\n",
-                (unsigned)hookProc,(unsigned)GDI_GetDefDCHook() );
+                (UINT32)hookProc, (UINT32)DCHook );
 
     if (!dc) return FALSE;
     dc->hookProc = hookProc;
@@ -768,9 +752,9 @@
 /***********************************************************************
  *           GetDCHook   (GDI.191)
  */
-DWORD GetDCHook( HDC hDC, FARPROC16 *phookProc )
+DWORD GetDCHook( HDC16 hdc, FARPROC16 *phookProc )
 {
-    DC *dc = (DC *)GDI_GetObjPtr( hDC, DC_MAGIC );
+    DC *dc = (DC *)GDI_GetObjPtr( hdc, DC_MAGIC );
     if (!dc) return 0;
     *phookProc = dc->hookProc;
     return dc->dwHookData;
diff --git a/objects/dcvalues.c b/objects/dcvalues.c
index c330f41..9ce69c5 100644
--- a/objects/dcvalues.c
+++ b/objects/dcvalues.c
@@ -84,11 +84,11 @@
 DC_GET_X_Y( DWORD, GetViewportOrg, VportOrgX, VportOrgY )         /* GDI.95 */
 DC_GET_X_Y( DWORD, GetWindowExt, WndExtX, WndExtY )               /* GDI.96 */
 DC_GET_X_Y( DWORD, GetWindowOrg, WndOrgX, WndOrgY )               /* GDI.97 */
-DC_GET_VAL( HRGN, InquireVisRgn, hVisRgn )                        /* GDI.131 */
+DC_GET_VAL( HRGN32, InquireVisRgn, hVisRgn )                      /* GDI.131 */
 DC_GET_X_Y( DWORD, GetBrushOrg, brushOrgX, brushOrgY )            /* GDI.149 */
-DC_GET_VAL( HRGN, GetClipRgn, hClipRgn )                          /* GDI.173 */
+DC_GET_VAL( HRGN32, GetClipRgn, hClipRgn )                        /* GDI.173 */
 DC_GET_VAL( WORD, GetTextAlign, textAlign )                       /* GDI.345 */
-DC_GET_VAL( HFONT, GetCurLogFont, hFont )                         /* GDI.411 */
+DC_GET_VAL( HFONT16, GetCurLogFont, hFont )                       /* GDI.411 */
 DC_GET_VAL_EX( GetBrushOrgEx, brushOrgX, brushOrgY )              /* GDI.469 */
 DC_GET_VAL_EX( GetCurrentPositionEx, CursPosX, CursPosY )         /* GDI.470 */
 DC_GET_VAL_EX( GetViewportExtEx, VportExtX, VportExtY )           /* GDI.472 */
diff --git a/objects/dib.c b/objects/dib.c
index 8d2907d..4f8dd6c 100644
--- a/objects/dib.c
+++ b/objects/dib.c
@@ -626,7 +626,7 @@
 	WORD xSrc, WORD ySrc, WORD wSrcWidth, WORD wSrcHeight,
 	LPSTR bits, LPBITMAPINFO info, WORD wUsage, DWORD dwRop )
 {
-    HBITMAP hBitmap, hOldBitmap;
+    HBITMAP16 hBitmap, hOldBitmap;
     HDC hdcMem;
 
     hBitmap = CreateDIBitmap( hdc, &info->bmiHeader, CBM_INIT,
@@ -724,7 +724,7 @@
 /***********************************************************************
  *           GetDIBits    (GDI.441)
  */
-int GetDIBits( HDC hdc, HBITMAP hbitmap, WORD startscan, WORD lines,
+int GetDIBits( HDC hdc, HBITMAP16 hbitmap, WORD startscan, WORD lines,
 	       LPSTR bits, BITMAPINFO * info, WORD coloruse )
 {
     DC * dc;
@@ -792,10 +792,10 @@
 /***********************************************************************
  *           CreateDIBitmap    (GDI.442)
  */
-HBITMAP CreateDIBitmap( HDC hdc, BITMAPINFOHEADER * header, DWORD init,
-		        LPVOID bits, BITMAPINFO * data, UINT coloruse )
+HBITMAP16 CreateDIBitmap( HDC hdc, BITMAPINFOHEADER * header, DWORD init,
+                          LPVOID bits, BITMAPINFO * data, UINT coloruse )
 {
-    HBITMAP handle;
+    HBITMAP16 handle;
     BOOL fColor;
     DWORD width, height;
     WORD bpp;
diff --git a/objects/font.c b/objects/font.c
index a632754..aca3874 100644
--- a/objects/font.c
+++ b/objects/font.c
@@ -529,7 +529,7 @@
     static X_PHYSFONT stockFonts[LAST_STOCK_FONT-FIRST_STOCK_FONT+1];
 
     static struct {
-		HFONT		id;
+		HFONT16		id;
 		LOGFONT16	logfont;
 		int		access;
 		int		used;
@@ -537,7 +537,7 @@
     int 	i;
 
     X_PHYSFONT * stockPtr;
-    HFONT prevHandle = dc->w.hFont;
+    HFONT16 prevHandle = dc->w.hFont;
     XFontStruct * fontStruct;
     dprintf_font(stddeb,"FONT_SelectObject(%p, %04x, %p)\n", dc, hfont, font);
 
@@ -545,7 +545,7 @@
       /* Load font if necessary */
     if (!font)
     {
-	HFONT hnewfont;
+	HFONT16 hnewfont;
 
 	hnewfont = CreateFont16(10, 7, 0, 0, FW_DONTCARE,
 			      FALSE, FALSE, FALSE, DEFAULT_CHARSET, 0, 0,
@@ -1155,10 +1155,10 @@
  */
 INT EnumFonts(HDC hDC, LPCSTR lpFaceName, FONTENUMPROC16 lpEnumFunc, LPARAM lpData)
 {
-  HANDLE       hLog;
-  HANDLE       hMet;
-  HFONT	       hFont;
-  HFONT	       hOldFont;
+  HLOCAL16     hLog;
+  HLOCAL16     hMet;
+  HFONT16 hFont;
+  HFONT16 hOldFont;
   LPLOGFONT16  lpLogFont;
   LPTEXTMETRIC16 lptm;
   LPSTR	       lpOldName;
@@ -1225,10 +1225,10 @@
  */
 INT EnumFontFamilies(HDC hDC, LPCSTR lpszFamily, FONTENUMPROC16 lpEnumFunc, LPARAM lpData)
 {
-  HANDLE       	hLog;
-  HANDLE       	hMet;
-  HFONT	       	hFont;
-  HFONT	       	hOldFont;
+  HLOCAL16     	hLog;
+  HLOCAL16     	hMet;
+  HFONT16 hFont;
+  HFONT16 hOldFont;
   LPENUMLOGFONT16 lpEnumLogFont;
   LPTEXTMETRIC16 lptm;
   LPSTR	       	lpOldName;
diff --git a/objects/gdiobj.c b/objects/gdiobj.c
index f196635..3aae235 100644
--- a/objects/gdiobj.c
+++ b/objects/gdiobj.c
@@ -12,7 +12,6 @@
 #include "brush.h"
 #include "font.h"
 #include "heap.h"
-#include "module.h"
 #include "palette.h"
 #include "pen.h"
 #include "region.h"
@@ -148,8 +147,6 @@
     (GDIOBJHDR *) &SystemFixedFont
 };
 
-static FARPROC16 defDCHookCallback;
-
 
 /***********************************************************************
  *           GDI_Init
@@ -165,13 +162,6 @@
 
     if (!X11DRV_Init()) return FALSE;
 
-    /* Get default hook */
-
-    defDCHookCallback = (FARPROC16)MODULE_GetEntryPoint(GetModuleHandle("USER"),
-                                                        362  /* DCHook */ );
-    dprintf_gdi( stddeb, "DCHook: 16-bit callback is %08x\n",
-                 (unsigned)defDCHookCallback );
-
       /* Create default palette */
 
     if (!(hpalette = COLOR_Init())) return FALSE;
@@ -194,22 +184,13 @@
 
 
 /***********************************************************************
- *           GDI_GetDefDCHook
- */
-FARPROC16 GDI_GetDefDCHook(void)
-{
-    return defDCHookCallback;
-}
-
-
-/***********************************************************************
  *           GDI_AllocObject
  */
-HANDLE16 GDI_AllocObject( WORD size, WORD magic )
+HGDIOBJ16 GDI_AllocObject( WORD size, WORD magic )
 {
     static DWORD count = 0;
     GDIOBJHDR * obj;
-    HANDLE handle = GDI_HEAP_ALLOC( size );
+    HGDIOBJ16 handle = GDI_HEAP_ALLOC( size );
     if (!handle) return 0;
     obj = (GDIOBJHDR *) GDI_HEAP_LIN_ADDR( handle );
     obj->hNext   = 0;
@@ -222,7 +203,7 @@
 /***********************************************************************
  *           GDI_FreeObject
  */
-BOOL32 GDI_FreeObject( HANDLE16 handle )
+BOOL32 GDI_FreeObject( HGDIOBJ16 handle )
 {
     GDIOBJHDR * object;
 
@@ -246,7 +227,7 @@
  * Return a pointer to the GDI object associated to the handle.
  * Return NULL if the object has the wrong magic number.
  */
-GDIOBJHDR * GDI_GetObjPtr( HANDLE16 handle, WORD magic )
+GDIOBJHDR * GDI_GetObjPtr( HGDIOBJ16 handle, WORD magic )
 {
     GDIOBJHDR * ptr = NULL;
 
@@ -290,13 +271,13 @@
 /***********************************************************************
  *           GetStockObject    (GDI.87)
  */
-HANDLE GetStockObject( int obj )
+HGDIOBJ16 GetStockObject( INT16 obj )
 {
     if ((obj < 0) || (obj >= NB_STOCK_OBJECTS)) return 0;
     if (!StockObjects[obj]) return 0;
     dprintf_gdi(stddeb, "GetStockObject: returning %d\n",
                 FIRST_STOCK_HANDLE + obj );
-    return (HANDLE)(FIRST_STOCK_HANDLE + obj);
+    return (HGDIOBJ16)(FIRST_STOCK_HANDLE + obj);
 }
 
 
@@ -376,7 +357,7 @@
 /***********************************************************************
  *           SelectObject    (GDI.45)
  */
-HANDLE SelectObject( HDC hdc, HANDLE handle )
+HGDIOBJ16 SelectObject( HDC hdc, HGDIOBJ16 handle )
 {
     GDIOBJHDR * ptr = NULL;
     DC * dc;
@@ -406,7 +387,7 @@
       case FONT_MAGIC:
 	  return FONT_SelectObject( dc, handle, (FONTOBJ *)ptr );	  
       case REGION_MAGIC:
-	  return (HANDLE)SelectClipRgn( hdc, handle );
+	  return (HGDIOBJ16)SelectClipRgn( hdc, handle );
     }
     return 0;
 }
@@ -415,7 +396,7 @@
 /***********************************************************************
  *           UnrealizeObject    (GDI.150)
  */
-BOOL UnrealizeObject( HANDLE obj )
+BOOL UnrealizeObject( HGDIOBJ16 obj )
 {
       /* Check if object is valid */
 
@@ -521,7 +502,7 @@
 /***********************************************************************
  *           IsGDIObject    (GDI.462)
  */
-BOOL IsGDIObject(HANDLE handle)
+BOOL16 IsGDIObject( HGDIOBJ16 handle )
 {
     GDIOBJHDR *object = (GDIOBJHDR *) GDI_HEAP_LIN_ADDR( handle );
     if (object)
diff --git a/objects/metafile.c b/objects/metafile.c
index 3d38d3a..1b1760f 100644
--- a/objects/metafile.c
+++ b/objects/metafile.c
@@ -11,11 +11,48 @@
 #include "gdi.h"
 #include "bitmap.h"
 #include "file.h"
+#include "heap.h"
 #include "metafile.h"
+#include "metafiledrv.h"
 #include "stddebug.h"
 #include "debug.h"
 
-#define HTINCR  10      /* handle table allocation size increment */
+/******************************************************************
+ *         MF_AddHandle
+ *
+ *    Add a handle to an external handle table and return the index
+ */
+
+static int MF_AddHandle(HANDLETABLE16 *ht, WORD htlen, HGDIOBJ16 hobj)
+{
+    int i;
+
+    for (i = 0; i < htlen; i++)
+    {
+	if (*(ht->objectHandle + i) == 0)
+	{
+	    *(ht->objectHandle + i) = hobj;
+	    return i;
+	}
+    }
+    return -1;
+}
+
+
+/******************************************************************
+ *         MF_AddHandleDC
+ *
+ * Note: this function assumes that we never delete objects.
+ * If we do someday, we'll need to maintain a table to re-use deleted
+ * handles.
+ */
+static int MF_AddHandleDC( DC *dc )
+{
+    METAFILEDRV_PDEVICE *physDev = (METAFILEDRV_PDEVICE *)dc->physDev;
+    physDev->mh->mtNoObjects++;
+    return physDev->nextHandle++;
+}
+
 
 /******************************************************************
  *         GetMetafile         GDI.124 By Kenny MacDonald 30 Nov 94
@@ -79,68 +116,6 @@
 
 }
 
-/******************************************************************
- *         CreateMetafile         GDI.125
- */
-
-HANDLE CreateMetaFile(LPCSTR lpFilename)
-{
-    DC *dc;
-    HANDLE handle;
-    METAHEADER *mh;
-    HFILE hFile;
-    
-    dprintf_metafile(stddeb,"CreateMetaFile: %s\n", lpFilename);
-
-    handle = GDI_AllocObject(sizeof(DC), METAFILE_DC_MAGIC);
-    
-    if (!handle) 
-      return 0;
-    
-    dc = (DC *)GDI_HEAP_LIN_ADDR(handle);
-
-    if (!(dc->w.hMetaFile = GlobalAlloc16(GMEM_MOVEABLE, sizeof(METAHEADER)))) {
-        GDI_FreeObject(handle);
-	return 0;
-    }
-    if (!(dc->w.hHT = GlobalAlloc16(GMEM_MOVEABLE | GMEM_ZEROINIT,
-				    sizeof(HANDLETABLE16) * HTINCR))) {
-	GlobalFree16(dc->w.hMetaFile);
-	GDI_FreeObject(handle);
-	return 0;
-    }
-    dc->w.HTLen = HTINCR;
-    dc->w.bitsPerPixel = screenDepth;
-    mh = (METAHEADER *)GlobalLock16(dc->w.hMetaFile);
-
-    mh->mtHeaderSize = MFHEADERSIZE / 2;
-    mh->mtVersion = MFVERSION;
-    mh->mtSize = MFHEADERSIZE / 2;
-    mh->mtNoObjects = 0;
-    mh->mtMaxRecord = 0;
-    mh->mtNoParameters = 0;
-
-    if (lpFilename)          /* disk based metafile */
-    {
-	mh->mtType = 1;     /* disk */
-	hFile = _lcreat(lpFilename, 0);
-	if (_lwrite32(hFile, (char *)mh, MFHEADERSIZE) == -1)
-	{
-	    GlobalFree16(dc->w.hHT);
-	    GlobalFree16(dc->w.hMetaFile);
-	    GDI_FreeObject(handle);
-	    return 0;
-	}
-	mh->mtNoParameters = hFile; /* store file descriptor here */
-	                            /* windows probably uses this too*/
-    }
-    else                     /* memory based metafile */
-	mh->mtType = 0;
-
-    GlobalUnlock16(dc->w.hMetaFile);
-    dprintf_metafile(stddeb,"CreateMetaFile: returning %04x\n", handle);
-    return handle;
-}
 
 /******************************************************************
  *         CopyMetafile         GDI.151 Niels de Carpentier, April 1996
@@ -204,6 +179,7 @@
 }
 
 
+#if 0
 /******************************************************************
  *         CloseMetafile         GDI.126
  */
@@ -214,15 +190,14 @@
     METAHEADER *mh;
     HMETAFILE16 hmf;
     HFILE hFile;
+    METAFILEDRV_PDEVICE *physDev;
     
     dprintf_metafile(stddeb,"CloseMetaFile\n");
 
-    dc = (DC *)GDI_GetObjPtr(hdc, METAFILE_DC_MAGIC);
-    
-    if (!dc) 
-      return 0;
-    
-    mh = (METAHEADER *)GlobalLock16(dc->w.hMetaFile);
+    if (!(dc = (DC *)GDI_GetObjPtr(hdc, METAFILE_DC_MAGIC))) return 0;
+
+    physDev = (METAFILEDRV_PDEVICE *)dc->physDev;
+    mh = (METAHEADER *)GlobalLock16( physDev->hMetafile );
 
     /* Construct the end of metafile record - this is documented
      * in SDK Knowledgebase Q99334.
@@ -230,9 +205,7 @@
 
     if (!MF_MetaParam0(dc, META_EOF))
     {
-	GlobalFree16(dc->w.hHT);
-	GlobalFree16(dc->w.hMetaFile);
-	GDI_FreeObject(hdc);
+        DeleteDC( hdc );
 	return 0;
     }	
 
@@ -242,25 +215,21 @@
 	mh->mtNoParameters = 0;
         if (_llseek(hFile, 0L, 0) == -1)
         {
-	    GlobalFree16(dc->w.hHT);
-            GlobalFree16(dc->w.hMetaFile);
-	    GDI_FreeObject(hdc);
+            DeleteDC( hdc );
             return 0;
         }
         if (_lwrite32(hFile, (char *)mh, MFHEADERSIZE) == -1)
         {
-	    GlobalFree16(dc->w.hHT);
-            GlobalFree16(dc->w.hMetaFile);
-	    GDI_FreeObject(hdc);
+            DeleteDC( hdc );
             return 0;
         }
         _lclose(hFile);
     }
 
-    GlobalFree16(dc->w.hHT);
-    hmf = dc->w.hMetaFile;
-    GlobalUnlock16(hmf);
-    GDI_FreeObject(hdc);
+    hmf = physDev->hMetafile;
+    GlobalUnlock16( hmf );
+    physDev->hMetafile = 0;  /* So it won't be deleted */
+    DeleteDC( hdc );
     return hmf;
 }
 
@@ -279,7 +248,7 @@
     GlobalFree16(hmf);
     return TRUE;
 }
-
+#endif
 
 /******************************************************************
  *         PlayMetafile         GDI.123
@@ -418,7 +387,7 @@
 			                           WORD nHandles)
 {
     short s1;
-    HANDLE hndl;
+    HANDLE16 hndl;
     char *ptr;
     BITMAPINFOHEADER *infohdr;
 
@@ -774,7 +743,7 @@
  * Trade in a meta file object handle for a handle to the meta file memory
  */
 
-HANDLE GetMetaFileBits(HMETAFILE16 hmf)
+HGLOBAL16 GetMetaFileBits(HMETAFILE16 hmf)
 {
     dprintf_metafile(stddeb,"GetMetaFileBits: hMem out: %04x\n", hmf);
 
@@ -787,7 +756,7 @@
  * Trade in a meta file memory handle for a handle to a meta file object
  */
 
-HMETAFILE16 SetMetaFileBits(HANDLE hMem)
+HMETAFILE16 SetMetaFileBits( HGLOBAL16 hMem )
 {
     dprintf_metafile(stddeb,"SetMetaFileBits: hmf out: %04x\n", hMem);
 
@@ -796,88 +765,38 @@
 
 /******************************************************************
  *         MF_WriteRecord
+ *
+ * Warning: this function can change the metafile handle.
  */
 
-HMETAFILE16 MF_WriteRecord(HMETAFILE16 hmf, METARECORD *mr, WORD rlen)
+static BOOL32 MF_WriteRecord( DC *dc, METARECORD *mr, WORD rlen)
 {
     DWORD len;
-    METAHEADER *mh = (METAHEADER *)GlobalLock16(hmf);
-    
-    if (mh->mtType == 0)          /* memory based metafile */
+    METAHEADER *mh;
+    METAFILEDRV_PDEVICE *physDev = (METAFILEDRV_PDEVICE *)dc->physDev;
+
+    switch(physDev->mh->mtType)
     {
-	len = mh->mtSize * 2 + rlen;
-	GlobalUnlock16(hmf);
-	hmf = GlobalReAlloc16(hmf, len, GMEM_MOVEABLE); /* hmf can change */
-	mh = (METAHEADER *)GlobalLock16(hmf);
-	memcpy((WORD *)mh + mh->mtSize, mr, rlen);
-    }
-    else if (mh->mtType == 1)     /* disk based metafile */
-    {
-      dprintf_metafile(stddeb,"Writing record to disk\n");
-	if (_lwrite32(mh->mtNoParameters, (char *)mr, rlen) == -1)
-	{
-	    GlobalUnlock16(hmf);
-	    return 0;
-	}
-    }
-    else
-    {
-	GlobalUnlock16(hmf);
-	return 0;
+    case METAFILE_MEMORY:
+	len = physDev->mh->mtSize * 2 + rlen;
+	mh = HeapReAlloc( SystemHeap, 0, physDev->mh, len );
+        if (!mh) return FALSE;
+        physDev->mh = mh;
+	memcpy((WORD *)physDev->mh + physDev->mh->mtSize, mr, rlen);
+        break;
+    case METAFILE_DISK:
+        dprintf_metafile(stddeb,"Writing record to disk\n");
+	if (_lwrite32(physDev->mh->mtNoParameters, (char *)mr, rlen) == -1)
+	    return FALSE;
+        break;
+    default:
+        fprintf( stderr, "Uknown metafile type %d\n", physDev->mh->mtType );
+        return FALSE;
     }
 
-    mh->mtSize += rlen / 2;
-    mh->mtMaxRecord = MAX(mh->mtMaxRecord, rlen / 2);
-    GlobalUnlock16(hmf);
-    return hmf;
-}
-
-
-/******************************************************************
- *         MF_AddHandle
- *
- *    Add a handle to an external handle table and return the index
- */
-
-int MF_AddHandle(HANDLETABLE16 *ht, WORD htlen, HANDLE hobj)
-{
-    int i;
-
-    for (i = 0; i < htlen; i++)
-    {
-	if (*(ht->objectHandle + i) == 0)
-	{
-	    *(ht->objectHandle + i) = hobj;
-	    return i;
-	}
-    }
-    return -1;
-}
-
-
-/******************************************************************
- *         MF_AddHandleDC
- *
- *    Add a handle to the handle table in the DC, growing table if
- *    necessary. Return the index
- */
-
-int MF_AddHandleDC(DC *dc, HANDLE hobj)
-{
-    int i;
-    HANDLETABLE16 *ht = (HANDLETABLE16 *)GlobalLock16(dc->w.hHT);
-
-    if((i = MF_AddHandle(ht, dc->w.HTLen, hobj)) == -1) {
-	GlobalUnlock16(dc->w.hHT);
-	if(!(dc->w.hHT = GlobalReAlloc16(dc->w.hHT, (dc->w.HTLen + HTINCR) *
-	 sizeof(HANDLETABLE16), GMEM_MOVEABLE | GMEM_ZEROINIT)))
-	    return -1;
-	dc->w.HTLen += HTINCR;
-	ht = (HANDLETABLE16 *)GlobalLock16(dc->w.hHT);
-	i = MF_AddHandle(ht, dc->w.HTLen, hobj);
-    }
-    GlobalUnlock16(dc->w.hHT);
-    return i;
+    physDev->mh->mtSize += rlen / 2;
+    physDev->mh->mtMaxRecord = MAX(physDev->mh->mtMaxRecord, rlen / 2);
+    return TRUE;
 }
 
 
@@ -885,57 +804,45 @@
  *         MF_MetaParam0
  */
 
-BOOL MF_MetaParam0(DC *dc, short func)
+BOOL32 MF_MetaParam0(DC *dc, short func)
 {
     char buffer[8];
     METARECORD *mr = (METARECORD *)&buffer;
-    HMETAFILE16 handle;
     
     mr->rdSize = 3;
     mr->rdFunction = func;
-    handle = MF_WriteRecord(dc->w.hMetaFile, mr, mr->rdSize * 2);
-    dc->w.hMetaFile = handle;
-    
-    return handle; 
+    return MF_WriteRecord( dc, mr, mr->rdSize * 2);
 }
 
 
 /******************************************************************
  *         MF_MetaParam1
  */
-BOOL MF_MetaParam1(DC *dc, short func, short param1)
+BOOL32 MF_MetaParam1(DC *dc, short func, short param1)
 {
     char buffer[8];
     METARECORD *mr = (METARECORD *)&buffer;
-    HMETAFILE16 handle;
     
     mr->rdSize = 4;
     mr->rdFunction = func;
     *(mr->rdParam) = param1;
-    handle = MF_WriteRecord(dc->w.hMetaFile, mr, mr->rdSize * 2);
-    dc->w.hMetaFile = handle;
-
-    return handle;
+    return MF_WriteRecord( dc, mr, mr->rdSize * 2);
 }
 
 
 /******************************************************************
  *         MF_MetaParam2
  */
-BOOL MF_MetaParam2(DC *dc, short func, short param1, short param2)
+BOOL32 MF_MetaParam2(DC *dc, short func, short param1, short param2)
 {
     char buffer[10];
     METARECORD *mr = (METARECORD *)&buffer;
-    HMETAFILE16 handle;
     
     mr->rdSize = 5;
     mr->rdFunction = func;
     *(mr->rdParam) = param2;
     *(mr->rdParam + 1) = param1;
-    handle = MF_WriteRecord(dc->w.hMetaFile, mr, mr->rdSize * 2);
-    dc->w.hMetaFile = handle;
-    
-    return handle;
+    return MF_WriteRecord( dc, mr, mr->rdSize * 2);
 }
 
 
@@ -943,12 +850,11 @@
  *         MF_MetaParam4
  */
 
-BOOL MF_MetaParam4(DC *dc, short func, short param1, short param2, 
+BOOL32 MF_MetaParam4(DC *dc, short func, short param1, short param2, 
 		   short param3, short param4)
 {
     char buffer[14];
     METARECORD *mr = (METARECORD *)&buffer;
-    HMETAFILE16 handle;
     
     mr->rdSize = 7;
     mr->rdFunction = func;
@@ -956,10 +862,7 @@
     *(mr->rdParam + 1) = param3;
     *(mr->rdParam + 2) = param2;
     *(mr->rdParam + 3) = param1;
-    handle = MF_WriteRecord(dc->w.hMetaFile, mr, mr->rdSize * 2);
-    dc->w.hMetaFile = handle;
-    
-    return handle;
+    return MF_WriteRecord( dc, mr, mr->rdSize * 2);
 }
 
 
@@ -967,12 +870,11 @@
  *         MF_MetaParam6
  */
 
-BOOL MF_MetaParam6(DC *dc, short func, short param1, short param2, 
+BOOL32 MF_MetaParam6(DC *dc, short func, short param1, short param2, 
 		   short param3, short param4, short param5, short param6)
 {
     char buffer[18];
     METARECORD *mr = (METARECORD *)&buffer;
-    HMETAFILE16 handle;
     
     mr->rdSize = 9;
     mr->rdFunction = func;
@@ -982,23 +884,19 @@
     *(mr->rdParam + 3) = param3;
     *(mr->rdParam + 4) = param2;
     *(mr->rdParam + 5) = param1;
-    handle = MF_WriteRecord(dc->w.hMetaFile, mr, mr->rdSize * 2);
-    dc->w.hMetaFile = handle;
-    
-    return handle; 
+    return MF_WriteRecord( dc, mr, mr->rdSize * 2);
 }
 
 
 /******************************************************************
  *         MF_MetaParam8
  */
-BOOL MF_MetaParam8(DC *dc, short func, short param1, short param2, 
+BOOL32 MF_MetaParam8(DC *dc, short func, short param1, short param2, 
 		   short param3, short param4, short param5,
 		   short param6, short param7, short param8)
 {
     char buffer[22];
     METARECORD *mr = (METARECORD *)&buffer;
-    HMETAFILE16 handle;
     
     mr->rdSize = 11;
     mr->rdFunction = func;
@@ -1010,10 +908,7 @@
     *(mr->rdParam + 5) = param3;
     *(mr->rdParam + 6) = param2;
     *(mr->rdParam + 7) = param1;
-    handle = MF_WriteRecord(dc->w.hMetaFile, mr, mr->rdSize * 2);
-    dc->w.hMetaFile = handle;
-    
-    return handle;
+    return MF_WriteRecord( dc, mr, mr->rdSize * 2);
 }
 
 
@@ -1021,37 +916,23 @@
  *         MF_CreateBrushIndirect
  */
 
-BOOL MF_CreateBrushIndirect(DC *dc, HBRUSH hBrush, LOGBRUSH16 *logbrush)
+BOOL32 MF_CreateBrushIndirect(DC *dc, HBRUSH16 hBrush, LOGBRUSH16 *logbrush)
 {
     int index;
-    HMETAFILE16 handle;
     char buffer[sizeof(METARECORD) - 2 + sizeof(LOGBRUSH16)];
     METARECORD *mr = (METARECORD *)&buffer;
-    METAHEADER *mh;
 
     mr->rdSize = (sizeof(METARECORD) + sizeof(LOGBRUSH16) - 2) / 2;
     mr->rdFunction = META_CREATEBRUSHINDIRECT;
     memcpy(&(mr->rdParam), logbrush, sizeof(LOGBRUSH16));
-    if (!(dc->w.hMetaFile = MF_WriteRecord(dc->w.hMetaFile, 
-					  mr, mr->rdSize * 2)))
-	return FALSE;
+    if (!(MF_WriteRecord( dc, mr, mr->rdSize * 2))) return FALSE;
 
     mr->rdSize = sizeof(METARECORD) / 2;
     mr->rdFunction = META_SELECTOBJECT;
 
-    if ((index = MF_AddHandleDC(dc, hBrush)) == -1)
-	return FALSE;
-
-    mh = (METAHEADER *)GlobalLock16(dc->w.hMetaFile);
+    if ((index = MF_AddHandleDC( dc )) == -1) return FALSE;
     *(mr->rdParam) = index;
-    if (index >= mh->mtNoObjects)
-	mh->mtNoObjects++;
-    
-    GlobalUnlock16(dc->w.hMetaFile);
-    handle = MF_WriteRecord(dc->w.hMetaFile, mr, mr->rdSize * 2);
-    dc->w.hMetaFile = handle;
-
-    return handle;
+    return MF_WriteRecord( dc, mr, mr->rdSize * 2);
 }
 
 
@@ -1059,23 +940,21 @@
  *         MF_CreatePatternBrush
  */
 
-BOOL MF_CreatePatternBrush(DC *dc, HBRUSH hBrush, LOGBRUSH16 *logbrush)
+BOOL32 MF_CreatePatternBrush(DC *dc, HBRUSH16 hBrush, LOGBRUSH16 *logbrush)
 {
     DWORD len, bmSize, biSize;
-    HANDLE hmr;
+    HGLOBAL16 hmr;
     METARECORD *mr;
     BITMAPOBJ *bmp;
     BITMAPINFO *info;
     BITMAPINFOHEADER *infohdr;
     int index;
-    HMETAFILE16 handle;
     char buffer[sizeof(METARECORD)];
-    METAHEADER *mh;
 
     switch (logbrush->lbStyle)
     {
     case BS_PATTERN:
-	bmp = (BITMAPOBJ *)GDI_GetObjPtr((HANDLE)logbrush->lbHatch, BITMAP_MAGIC);
+	bmp = (BITMAPOBJ *)GDI_GetObjPtr((HGDIOBJ16)logbrush->lbHatch, BITMAP_MAGIC);
 	if (!bmp) return FALSE;
 	len = sizeof(METARECORD) + sizeof(BITMAPINFOHEADER) + 
 	      (bmp->bitmap.bmHeight * bmp->bitmap.bmWidthBytes) + 6;
@@ -1099,7 +978,7 @@
 	break;
 
     case BS_DIBPATTERN:
-	info = (BITMAPINFO *)GlobalLock16((HANDLE)logbrush->lbHatch);
+	info = (BITMAPINFO *)GlobalLock16((HGLOBAL16)logbrush->lbHatch);
 	if (info->bmiHeader.biCompression)
             bmSize = info->bmiHeader.biSizeImage;
         else
@@ -1120,7 +999,7 @@
     default:
         return FALSE;
     }
-    if (!(dc->w.hMetaFile = MF_WriteRecord(dc->w.hMetaFile, mr, len)))
+    if (!(MF_WriteRecord(dc, mr, len)))
     {
 	GlobalFree16(hmr);
 	return FALSE;
@@ -1131,18 +1010,10 @@
     mr = (METARECORD *)&buffer;
     mr->rdSize = sizeof(METARECORD) / 2;
     mr->rdFunction = META_SELECTOBJECT;
-    if ((index = MF_AddHandleDC(dc, hBrush)) == -1)
-	return FALSE;
 
-    mh = (METAHEADER *)GlobalLock16(dc->w.hMetaFile);
+    if ((index = MF_AddHandleDC( dc )) == -1) return FALSE;
     *(mr->rdParam) = index;
-    if (index >= mh->mtNoObjects)
-	mh->mtNoObjects++;
-    GlobalUnlock16(dc->w.hMetaFile);
-    handle = MF_WriteRecord(dc->w.hMetaFile, mr, mr->rdSize * 2);
-    dc->w.hMetaFile = handle;
-
-    return handle;
+    return MF_WriteRecord( dc, mr, mr->rdSize * 2);
 }
 
 
@@ -1150,36 +1021,23 @@
  *         MF_CreatePenIndirect
  */
 
-BOOL MF_CreatePenIndirect(DC *dc, HPEN16 hPen, LOGPEN16 *logpen)
+BOOL32 MF_CreatePenIndirect(DC *dc, HPEN16 hPen, LOGPEN16 *logpen)
 {
     int index;
-    HMETAFILE16 handle;
     char buffer[sizeof(METARECORD) - 2 + sizeof(LOGPEN16)];
     METARECORD *mr = (METARECORD *)&buffer;
-    METAHEADER *mh;
 
     mr->rdSize = (sizeof(METARECORD) + sizeof(LOGPEN16) - 2) / 2;
     mr->rdFunction = META_CREATEPENINDIRECT;
     memcpy(&(mr->rdParam), logpen, sizeof(LOGPEN16));
-    if (!(dc->w.hMetaFile = MF_WriteRecord(dc->w.hMetaFile, mr, 
-					   mr->rdSize * 2)))
-	return FALSE;
+    if (!(MF_WriteRecord( dc, mr, mr->rdSize * 2))) return FALSE;
 
     mr->rdSize = sizeof(METARECORD) / 2;
     mr->rdFunction = META_SELECTOBJECT;
 
-    if ((index = MF_AddHandleDC(dc, hPen)) == -1)
-	return FALSE;
-
-    mh = (METAHEADER *)GlobalLock16(dc->w.hMetaFile);
+    if ((index = MF_AddHandleDC( dc )) == -1) return FALSE;
     *(mr->rdParam) = index;
-    if (index >= mh->mtNoObjects)
-	mh->mtNoObjects++;
-    GlobalUnlock16(dc->w.hMetaFile);
-    handle = MF_WriteRecord(dc->w.hMetaFile, mr, mr->rdSize * 2);
-    dc->w.hMetaFile = handle;
-    
-    return handle;
+    return MF_WriteRecord( dc, mr, mr->rdSize * 2);
 }
 
 
@@ -1187,47 +1045,34 @@
  *         MF_CreateFontIndirect
  */
 
-BOOL MF_CreateFontIndirect(DC *dc, HFONT hFont, LOGFONT16 *logfont)
+BOOL32 MF_CreateFontIndirect(DC *dc, HFONT16 hFont, LOGFONT16 *logfont)
 {
     int index;
-    HMETAFILE16 handle;
     char buffer[sizeof(METARECORD) - 2 + sizeof(LOGFONT16)];
     METARECORD *mr = (METARECORD *)&buffer;
-    METAHEADER *mh;
 
     mr->rdSize = (sizeof(METARECORD) + sizeof(LOGFONT16) - 2) / 2;
     mr->rdFunction = META_CREATEFONTINDIRECT;
     memcpy(&(mr->rdParam), logfont, sizeof(LOGFONT16));
-    if (!(dc->w.hMetaFile = MF_WriteRecord(dc->w.hMetaFile, mr, 
-					  mr->rdSize * 2)))
-	return FALSE;
+    if (!(MF_WriteRecord( dc, mr, mr->rdSize * 2))) return FALSE;
 
     mr->rdSize = sizeof(METARECORD) / 2;
     mr->rdFunction = META_SELECTOBJECT;
 
-    if ((index = MF_AddHandleDC(dc, hFont)) == -1)
-	return FALSE;
-
-    mh = (METAHEADER *)GlobalLock16(dc->w.hMetaFile);
+    if ((index = MF_AddHandleDC( dc )) == -1) return FALSE;
     *(mr->rdParam) = index;
-    if (index >= mh->mtNoObjects)
-	mh->mtNoObjects++;
-    GlobalUnlock16(dc->w.hMetaFile);
-    handle  = MF_WriteRecord(dc->w.hMetaFile, mr, mr->rdSize * 2);
-    dc->w.hMetaFile = handle;
-    
-    return handle;
+    return MF_WriteRecord( dc, mr, mr->rdSize * 2);
 }
 
 
 /******************************************************************
  *         MF_TextOut
  */
-BOOL MF_TextOut(DC *dc, short x, short y, LPCSTR str, short count)
+BOOL32 MF_TextOut(DC *dc, short x, short y, LPCSTR str, short count)
 {
-    HMETAFILE16 handle;
+    BOOL32 ret;
     DWORD len;
-    HANDLE hmr;
+    HGLOBAL16 hmr;
     METARECORD *mr;
 
     len = sizeof(METARECORD) + (((count + 1) >> 1) * 2) + 4;
@@ -1242,21 +1087,20 @@
     memcpy(mr->rdParam + 1, str, count);
     *(mr->rdParam + ((count + 1) >> 1) + 1) = y;
     *(mr->rdParam + ((count + 1) >> 1) + 2) = x;
-    handle = MF_WriteRecord(dc->w.hMetaFile, mr, mr->rdSize * 2);
-    dc->w.hMetaFile = handle;
+    ret = MF_WriteRecord( dc, mr, mr->rdSize * 2);
     GlobalFree16(hmr);
-    return handle;
+    return ret;
 }
 
 /******************************************************************
  *         MF_ExtTextOut
  */
-BOOL MF_ExtTextOut(DC *dc, short x, short y, UINT16 flags, const RECT16 *rect,
-                   LPCSTR str, short count, const INT16 *lpDx)
+BOOL32 MF_ExtTextOut(DC*dc, short x, short y, UINT16 flags, const RECT16 *rect,
+                     LPCSTR str, short count, const INT16 *lpDx)
 {
-    HMETAFILE16 handle;
+    BOOL32 ret;
     DWORD len;
-    HANDLE hmr;
+    HGLOBAL16 hmr;
     METARECORD *mr;
 
     len = sizeof(METARECORD) + (((count + 1) >> 1) * 2) + 2 * sizeof(short)
@@ -1278,20 +1122,19 @@
     memcpy(mr->rdParam + 8, str, count);
     if (lpDx)
      memcpy(mr->rdParam + 8+ ((count + 1) >> 1),lpDx,count*sizeof(INT16));
-    handle = MF_WriteRecord(dc->w.hMetaFile, mr, mr->rdSize * 2);
-    dc->w.hMetaFile = handle;
+    ret = MF_WriteRecord( dc, mr, mr->rdSize * 2);
     GlobalFree16(hmr);
-    return handle;
+    return ret;
 }
 
 /******************************************************************
  *         MF_MetaPoly - implements Polygon and Polyline
  */
-BOOL MF_MetaPoly(DC *dc, short func, LPPOINT16 pt, short count)
+BOOL32 MF_MetaPoly(DC *dc, short func, LPPOINT16 pt, short count)
 {
-    HMETAFILE16 handle;
+    BOOL32 ret;
     DWORD len;
-    HANDLE hmr;
+    HGLOBAL16 hmr;
     METARECORD *mr;
 
     len = sizeof(METARECORD) + (count * 4); 
@@ -1304,22 +1147,21 @@
     mr->rdFunction = func;
     *(mr->rdParam) = count;
     memcpy(mr->rdParam + 1, pt, count * 4);
-    handle  = MF_WriteRecord(dc->w.hMetaFile, mr, mr->rdSize * 2);
-    dc->w.hMetaFile = handle;
+    ret = MF_WriteRecord( dc, mr, mr->rdSize * 2);
     GlobalFree16(hmr);
-    return handle;
+    return ret;
 }
 
 
 /******************************************************************
  *         MF_BitBlt
  */
-BOOL MF_BitBlt(DC *dcDest, short xDest, short yDest, short width,
-	       short height, HDC hdcSrc, short xSrc, short ySrc, DWORD rop)
+BOOL32 MF_BitBlt(DC *dcDest, short xDest, short yDest, short width,
+                 short height, HDC16 hdcSrc, short xSrc, short ySrc, DWORD rop)
 {
-    HMETAFILE16 handle;
+    BOOL32 ret;
     DWORD len;
-    HANDLE hmr;
+    HGLOBAL16 hmr;
     METARECORD *mr;
     DC *dcSrc;
     BITMAP16  BM;
@@ -1347,13 +1189,12 @@
       *(mr->rdParam + 4) = width;
       *(mr->rdParam + 5) = yDest;
       *(mr->rdParam + 6) = xDest;
-      handle = MF_WriteRecord(dcDest->w.hMetaFile, mr, mr->rdSize * 2);
+      ret = MF_WriteRecord( dcDest, mr, mr->rdSize * 2);
     }  
     else
-      handle = 0;  
-    dcDest->w.hMetaFile = handle;
+        ret = FALSE;
     GlobalFree16(hmr);
-    return handle;
+    return ret;
 }
 
 
@@ -1365,13 +1206,13 @@
  */
 #define STRETCH_VIA_DIB
 #undef  STRETCH_VIA_DIB
-BOOL MF_StretchBlt(DC *dcDest, short xDest, short yDest, short widthDest,
-		   short heightDest, HDC hdcSrc, short xSrc, short ySrc, 
-		   short widthSrc, short heightSrc, DWORD rop)
+BOOL32 MF_StretchBlt(DC *dcDest, short xDest, short yDest, short widthDest,
+                     short heightDest, HDC16 hdcSrc, short xSrc, short ySrc, 
+                     short widthSrc, short heightSrc, DWORD rop)
 {
-    HMETAFILE16 handle;
+    BOOL32 ret;
     DWORD len;
-    HANDLE hmr;
+    HGLOBAL16 hmr;
     METARECORD *mr;
     DC *dcSrc;
     BITMAP16  BM;
@@ -1434,13 +1275,12 @@
       *(mr->rdParam + 7) = widthDest;
       *(mr->rdParam + 8) = yDest;
       *(mr->rdParam + 9) = xDest;
-      handle = MF_WriteRecord(dcDest->w.hMetaFile, mr, mr->rdSize * 2);
+      ret = MF_WriteRecord( dcDest, mr, mr->rdSize * 2);
     }  
     else
-      handle = 0;  
-    dcDest->w.hMetaFile = handle;
+        ret = FALSE;
     GlobalFree16(hmr);
-    return handle;
+    return ret;
 }
 
 
diff --git a/objects/text.c b/objects/text.c
index 3d7eb81..acf51de 100644
--- a/objects/text.c
+++ b/objects/text.c
@@ -325,7 +325,7 @@
                      const RECT16 *lprect, LPCSTR str, UINT16 count,
                      const INT16 *lpDx )
 {
-    HRGN	hRgnClip = 0;
+    HRGN32	hRgnClip = 0;
     int 	dir, ascent, descent, i;
     XCharStruct info;
     XFontStruct *font;
@@ -638,7 +638,7 @@
 /***********************************************************************
  *           GrayString   (USER.185)
  */
-BOOL GrayString(HDC hdc, HBRUSH hbr, GRAYSTRINGPROC16 gsprc, LPARAM lParam, 
+BOOL GrayString(HDC hdc, HBRUSH16 hbr, GRAYSTRINGPROC16 gsprc, LPARAM lParam, 
 		INT cch, INT x, INT y, INT cx, INT cy)
 {
     BOOL ret;
diff --git a/programs/progman/Makefile.in b/programs/progman/Makefile.in
index c319479..fcc846b 100644
--- a/programs/progman/Makefile.in
+++ b/programs/progman/Makefile.in
@@ -1,7 +1,11 @@
-TOPSRC   = @top_srcdir@
-MODULE   = none
-PROGRAMS = progman
-ALL_LIBS = $(WINELIB) $(X_LIBS) $(XPM_LIB) $(XLIB) $(LDLIBS)
+TOPSRCDIR = @top_srcdir@
+TOPOBJDIR = ../..
+SRCDIR    = @srcdir@
+VPATH     = @srcdir@
+MODULE    = none
+PROGRAMS  = progman
+ALL_LIBS  = $(WINELIB) $(X_LIBS) $(XPM_LIB) $(XLIB) $(LDLIBS)
+DEFS      = -I$(SRCDIR)
 
 LANGUAGES   = En De Fr Fi
 LICENSELANG = En
@@ -19,27 +23,32 @@
 mandir          = @mandir@/man1
 manext          = .1
 
-MOSTOBJS = \
-	dialog.o \
-	group.o \
-	grpfile.o \
-	license.o \
-	main.o \
-	program.o
+MOSTSRCS = \
+	dialog.c \
+	group.c \
+	grpfile.c \
+	license.c \
+	main.c \
+	program.c
 
-STRINGOBJS = \
-	accel.o \
-	string.o \
-	$(LANGUAGES:%=%.o) \
-	$(LICENSELANG:%=License_%.o)
+# Some strings need addresses >= 0x10000
+STRINGSRCS = \
+	string.c \
+	$(LICENSELANG:%=License_%.c)
 
-C_SRCS = $(MOSTOBJS:.o=.c) $(STRINGOBJS:.o=.c)
+GEN_C_SRCS = \
+	accel.c \
+	$(LANGUAGES:%=%.c) \
+
+C_SRCS = $(MOSTSRCS) $(STRINGSRCS)
+
+MOSTOBJS = $(MOSTSRCS:.c=.o)
+STRINGOBJS = $(STRINGSRCS:.c=.o) $(GEN_C_SRCS:.c=.o)
 
 all: check_winerc $(PROGRAMS)
 
 @MAKE_RULES@
 
-# Some strings need addresses >= 0x10000
 progman: $(MOSTOBJS) $(STRINGOBJS)
 	$(CC) -o progman $(MOSTOBJS) $(LDOPTIONS) $(ALL_LIBS) $(STRINGOBJS)
 
@@ -50,6 +59,7 @@
 	$(RM) accel.c accel.h $(LANGUAGES:%=%.c) $(LANGUAGES:%=%.h) progman
 
 accel.c accel.h: $(WINERC) Xx.rc
+
 $(LANGUAGES:%=%.c) $(LANGUAGES:%=%.h): $(WINERC) Xx.rc
 
 dummy:
diff --git a/programs/winhelp/Makefile.in b/programs/winhelp/Makefile.in
index 219e42e..f13bf66 100644
--- a/programs/winhelp/Makefile.in
+++ b/programs/winhelp/Makefile.in
@@ -1,7 +1,10 @@
-TOPSRC   = @top_srcdir@
-MODULE   = none
-PROGRAMS = winhelp hlp2sgml
-ALL_LIBS = $(WINELIB) $(X_LIBS) $(XPM_LIB) $(XLIB) $(LDLIBS)
+TOPSRCDIR = @top_srcdir@
+TOPOBJDIR = ../..
+SRCDIR    = @srcdir@
+VPATH     = @srcdir@
+MODULE    = none
+PROGRAMS  = winhelp hlp2sgml
+ALL_LIBS  = $(WINELIB) $(X_LIBS) $(XPM_LIB) $(XLIB) $(LDLIBS)
 
 LANGUAGES   = En De Fr Fi
 
@@ -18,18 +21,24 @@
 mandir          = @mandir@/man1
 manext          = .1
 
-MOSTOBJS = \
-	winhelp.o \
-	hlpfile.o \
-	macro.o \
-	y.tab.o \
-	lex.yy.o
+MOSTSRCS = \
+	winhelp.c \
+	hlpfile.c \
+	macro.c
 
-STRINGOBJS = \
-	string.o \
-	$(LANGUAGES:%=%.o)
+# Some strings need addresses >= 0x10000
+STRINGSRCS = \
+	string.c
 
-C_SRCS = $(MOSTOBJS:.o=.c) $(STRINGOBJS:.o=.c) hlp2sgml.c
+GEN_C_SRCS = \
+	y.tab.c \
+	lex.yy.c \
+	$(LANGUAGES:%=%.c)
+
+C_SRCS = $(MOSTSRCS) $(STRINGSRCS)
+
+MOSTOBJS = $(MOSTSRCS:.c=.o)
+STRINGOBJS = $(STRINGSRCS:.c=.o) $(GEN_C_SRCS:.c=.o)
 
 all: check_winerc $(PROGRAMS)
 
@@ -51,10 +60,10 @@
 	$(RM) $(LANGUAGES:%=%.c) $(LANGUAGES:%=%.h)
 
 y.tab.c y.tab.h: macro.yacc.y
-	$(YACC) -d -t macro.yacc.y
+	$(YACC) -d -t $(SRCDIR)/macro.yacc.y
 
 lex.yy.c: macro.lex.l
-	$(LEX) -8 -i macro.lex.l
+	$(LEX) -8 -i $(SRCDIR)/macro.lex.l
 
 $(LANGUAGES:%=%.c) $(LANGUAGES:%=%.h): $(WINERC) Xx.rc
 
diff --git a/rc/Makefile.in b/rc/Makefile.in
index d5e9e15..81dd34b 100644
--- a/rc/Makefile.in
+++ b/rc/Makefile.in
@@ -1,10 +1,13 @@
-DEFS   = -D__WINE__ -DNO_TRANSITION_TYPES
-TOPSRC = @top_srcdir@
+DEFS      = -D__WINE__ -DNO_TRANSITION_TYPES
+TOPSRCDIR = @top_srcdir@
+TOPOBJDIR = ..
+SRCDIR    = @srcdir@
+VPATH     = @srcdir@
+PROGRAM   = winerc
+MODULE    = none
 
-PROGRAM = winerc
-MODULE = none
-
-C_SRCS = y.tab.c lex.yy.c winerc.c 
+C_SRCS     = winerc.c
+GEN_C_SRCS = y.tab.c lex.yy.c
 
 all: $(PROGRAM)
 
@@ -14,12 +17,12 @@
 	$(CC) $(CFLAGS) -o winerc $(OBJS) $(LEXLIB)
 
 y.tab.c y.tab.h: parser.y
-	$(YACC) -d -t parser.y
+	$(YACC) -d -t $(SRCDIR)/parser.y
 
 lex.yy.c: parser.l
-	$(LEX) -8 -I parser.l
+	$(LEX) -8 -I $(SRCDIR)/parser.l
 
 clean::
-	$(RM) y.tab.c y.tab.h lex.yy.c $(PROGRAM)
+	$(RM) y.tab.h $(PROGRAM)
 
 ### Dependencies:
diff --git a/resources/Makefile.in b/resources/Makefile.in
index b972f81..5d3afd0 100644
--- a/resources/Makefile.in
+++ b/resources/Makefile.in
@@ -1,12 +1,16 @@
-DEFS   = -D__WINE__ -DNO_TRANSITION_TYPES
-TOPSRC = @top_srcdir@
-MODULE = resources
+DEFS      = -D__WINE__ -DNO_TRANSITION_TYPES
+TOPSRCDIR = @top_srcdir@
+TOPOBJDIR = ..
+SRCDIR    = @srcdir@
+VPATH     = @srcdir@
+MODULE    = resources
 
 LANGUAGES = En Es De No Fr Fi Da Cz Eo It Ko
 
 SYSRES_SRCS = $(LANGUAGES:%=sysres_%.c)
 
-C_SRCS = $(SYSRES_SRCS) sysres.c
+C_SRCS = sysres.c
+GEN_C_SRCS = $(SYSRES_SRCS)
 
 all: check_winerc $(MODULE).o
 
@@ -15,6 +19,6 @@
 $(SYSRES_SRCS): $(WINERC)
 
 clean::
-	$(RM) $(SYSRES_SRCS) $(SYSRES_SRCS:.c=.h)
+	$(RM) $(SYSRES_SRCS:.c=.h)
 
 ### Dependencies:
diff --git a/tools/Makefile.in b/tools/Makefile.in
index 303b5ec..ae76df1 100644
--- a/tools/Makefile.in
+++ b/tools/Makefile.in
@@ -1,5 +1,8 @@
-DEFS   = -D__WINE__ -DNO_TRANSITION_TYPES
-TOPSRC = @top_srcdir@
+DEFS      = -D__WINE__ -DNO_TRANSITION_TYPES
+TOPSRCDIR = @top_srcdir@
+TOPOBJDIR = ..
+SRCDIR    = @srcdir@
+VPATH     = @srcdir@
 
 PROGRAM = build
 MODULE  = none
diff --git a/win32/Makefile.in b/win32/Makefile.in
index df4f9b6..e0c8162 100644
--- a/win32/Makefile.in
+++ b/win32/Makefile.in
@@ -1,6 +1,9 @@
-DEFS   = -D__WINE__
-TOPSRC = @top_srcdir@
-MODULE = win32
+DEFS      = -D__WINE__
+TOPSRCDIR = @top_srcdir@
+TOPOBJDIR = ..
+SRCDIR    = @srcdir@
+VPATH     = @srcdir@
+MODULE    = win32
 
 C_SRCS = \
 	advapi.c \
diff --git a/win32/cursoricon32.c b/win32/cursoricon32.c
index fb8a226..0fa0316 100644
--- a/win32/cursoricon32.c
+++ b/win32/cursoricon32.c
@@ -233,7 +233,7 @@
  * Load the icon/cursor directory for a given resource name and find the
  * best matching entry.
  */
-static BOOL CURSORICON32_LoadDirEntry(HANDLE hInstance, LPCWSTR name,
+static BOOL CURSORICON32_LoadDirEntry(HINSTANCE32 hInstance, LPCWSTR name,
                                     int width, int height, int colors,
                                     BOOL fCursor, CURSORICONDIRENTRY32 *dirEntry)
 {
@@ -266,10 +266,12 @@
  *
  * Create a cursor or icon from a resource.
  */
-static HANDLE CURSORICON32_LoadHandler( HANDLE32 handle, HINSTANCE hInstance,
-                                      BOOL fCursor )
+static HGLOBAL32 CURSORICON32_LoadHandler( HANDLE32 handle,
+                                           HINSTANCE32 hInstance,
+                                           BOOL32 fCursor )
 {
-    HANDLE hAndBits, hXorBits, hRes;
+    HBITMAP32 hAndBits, hXorBits;
+    HGLOBAL32 hRes;
     HDC32 hdc;
     int size, sizeAnd, sizeXor;
     POINT16 hotspot = { 0 ,0 };
@@ -402,12 +404,13 @@
  *
  * Load a cursor or icon.
  */
-static HANDLE CURSORICON32_Load( HANDLE hInstance, LPCWSTR name, int width,
-                               int height, int colors, BOOL fCursor )
+static HGLOBAL32 CURSORICON32_Load( HINSTANCE32 hInstance, LPCWSTR name,
+                                    int width, int height, int colors,
+                                    BOOL fCursor )
 {
     HANDLE32 handle;
-	HANDLE hRet;
-    HANDLE32  hRsrc;
+    HANDLE32 hRet;
+    HANDLE32 hRsrc;
     CURSORICONDIRENTRY32 dirEntry;
 
 	if(!hInstance)	/* OEM cursor/icon */
diff --git a/win32/environment.c b/win32/environment.c
index 85d4083..2480765 100644
--- a/win32/environment.c
+++ b/win32/environment.c
@@ -51,7 +51,7 @@
 /***********************************************************************
  *           GetSystemPowerStatus      (KERNEL32.621)
  */
-BOOL GetSystemPowerStatus(LPSYSTEM_POWER_STATUS sps_ptr)
+BOOL32 GetSystemPowerStatus(LPSYSTEM_POWER_STATUS sps_ptr)
 {
     return FALSE;   /* no power management support */
 }
@@ -60,7 +60,7 @@
 /***********************************************************************
  *           SetSystemPowerState      (KERNEL32.630)
  */
-BOOL SetSystemPowerState(BOOL suspend_or_hibernate, BOOL force_flag)
+BOOL32 SetSystemPowerState(BOOL32 suspend_or_hibernate, BOOL32 force_flag)
 {
     /* suspend_or_hibernate flag: w95 does not support
        this feature anyway */
diff --git a/win32/init.c b/win32/init.c
index e5e5af7..5fa1b3a 100644
--- a/win32/init.c
+++ b/win32/init.c
@@ -94,9 +94,9 @@
 
     lpStartupInfo->cbReserved2 = 0;
     lpStartupInfo->lpReserved2 = NULL; /* must be NULL for VC runtime */
-    lpStartupInfo->hStdInput  = (HANDLE)0;
-    lpStartupInfo->hStdOutput = (HANDLE)1;
-    lpStartupInfo->hStdError  = (HANDLE)2;
+    lpStartupInfo->hStdInput  = (HANDLE32)0;
+    lpStartupInfo->hStdOutput = (HANDLE32)1;
+    lpStartupInfo->hStdError  = (HANDLE32)2;
 }
 
 /* Initialize whatever internal data structures we need.
diff --git a/win32/newfns.c b/win32/newfns.c
index b114cdd..e9de49a 100644
--- a/win32/newfns.c
+++ b/win32/newfns.c
@@ -23,17 +23,17 @@
 	return WinHelp(hWnd,lpszHelp,uCommand,dwData);
 }
 
-HHOOK SetWindowsHookEx32A(int HookId, HOOKPROC32 hookfn, HINSTANCE hModule,
+HHOOK SetWindowsHookEx32A(INT32 id, HOOKPROC32 hookfn, HINSTANCE32 hModule,
 				DWORD ThreadId)
 
 {
 	/* Stub for now */
-	fprintf(stdnimp, "SetWindowsHookEx32A Stub called! (hook Id %d)\n", HookId);
+	fprintf(stdnimp, "SetWindowsHookEx32A Stub called! (hook Id %d)\n",id);
 	
 	return (HHOOK) NULL;
 }
 
-HHOOK SetWindowsHook32A(int HookId, HOOKPROC32 hookfn)
+HHOOK SetWindowsHook32A(INT32 HookId, HOOKPROC32 hookfn)
 {
 	/* Stub for now */
 	fprintf(stdnimp, "SetWindowsHook32A Stub called! (hook Id %d)\n", HookId);
@@ -41,7 +41,7 @@
 	return (HHOOK) NULL;
 }
 
-BOOL UnhookWindowsHookEx32(HHOOK hHook)
+BOOL32 UnhookWindowsHookEx32(HHOOK hHook)
 
 {
 	/* Stub for now */
diff --git a/win32/process.c b/win32/process.c
index eb02e54..30c23f4 100644
--- a/win32/process.c
+++ b/win32/process.c
@@ -100,12 +100,12 @@
  * copied from LoadLibrary
  * This does not currently support built-in libraries
  */
-HANDLE32 LoadLibraryA(char *libname)
+HINSTANCE32 LoadLibraryA(char *libname)
 {
-	HANDLE handle;
+	HINSTANCE32 handle;
 	dprintf_module( stddeb, "LoadLibrary: (%08x) %s\n", (int)libname, libname);
 	handle = LoadModule( libname, (LPVOID)-1 );
-	if (handle == (HANDLE) -1)
+	if (handle == (HINSTANCE32) -1)
 	{
 		char buffer[256];
 		strcpy( buffer, libname );
@@ -114,7 +114,7 @@
 	}
 	/* Obtain module handle and call initialization function */
 #ifndef WINELIB
-	if (handle >= (HANDLE)32) PE_InitializeDLLs( GetExePtr(handle));
+	if (handle >= (HINSTANCE32)32) PE_InitializeDLLs( GetExePtr(handle));
 #endif
 	return handle;
 }
@@ -122,7 +122,7 @@
 /***********************************************************************
  *           FreeLibrary
  */
-BOOL FreeLibrary32(HINSTANCE hLibModule)
+BOOL FreeLibrary32(HINSTANCE32 hLibModule)
 {
 	fprintf(stderr,"FreeLibrary: empty stub\n");
 	return TRUE;
diff --git a/win32/thread.c b/win32/thread.c
index accc9f4..1495f7c 100644
--- a/win32/thread.c
+++ b/win32/thread.c
@@ -26,14 +26,14 @@
 /***********************************************************************
  *           GetThreadContext         (KERNEL32.294)
  */
-BOOL GetThreadContext(HANDLE hThread, void *lpContext)
+BOOL GetThreadContext(HANDLE32 hThread, void *lpContext)
 {
         return FALSE;
 }
 /***********************************************************************
  *           GetCurrentThread    (KERNEL32.200)
  */
-HANDLE GetCurrentThread(void)
+HANDLE32 GetCurrentThread(void)
 {
 	return 0;
 }
diff --git a/win32/time.c b/win32/time.c
index 797cbe7..bfc26ef 100644
--- a/win32/time.c
+++ b/win32/time.c
@@ -63,7 +63,7 @@
 /***********************************************************************
  *              SetSystemTime            (KERNEL32.507)
  */
-BOOL SetSystemTime(const SYSTEMTIME *systime)
+BOOL32 SetSystemTime(const SYSTEMTIME *systime)
 {
     struct timeval tv;
     struct timezone tz;
diff --git a/windows/Makefile.in b/windows/Makefile.in
index af47d45..5b3343f 100644
--- a/windows/Makefile.in
+++ b/windows/Makefile.in
@@ -1,6 +1,9 @@
-DEFS   = -D__WINE__
-TOPSRC = @top_srcdir@
-MODULE = windows
+DEFS      = -D__WINE__
+TOPSRCDIR = @top_srcdir@
+TOPOBJDIR = ..
+SRCDIR    = @srcdir@
+VPATH     = @srcdir@
+MODULE    = windows
 
 C_SRCS = \
 	caret.c \
diff --git a/windows/dce.c b/windows/dce.c
index 7afa5f7..b9a0fb7 100644
--- a/windows/dce.c
+++ b/windows/dce.c
@@ -30,8 +30,6 @@
 static DCE *firstDCE = 0;
 static HDC defaultDCstate = 0;
 
-BOOL   DCHook(HDC, WORD, DWORD, DWORD);
-
 /***********************************************************************
  *           DCE_AllocDCE
 *
@@ -49,7 +47,7 @@
 
     /* store DCE handle in DC hook data field */
 
-    SetDCHook(dce->hDC, GDI_GetDefDCHook(), (DWORD)dce);
+    SetDCHook( dce->hDC, (FARPROC16)DCHook, (DWORD)dce );
 
     dce->hwndCurrent = hWnd;
     dce->hClipRgn    = 0;
@@ -85,7 +83,7 @@
     while (*ppDCE && (*ppDCE != dce)) ppDCE = &(*ppDCE)->next;
     if (*ppDCE == dce) *ppDCE = dce->next;
 
-    SetDCHook(dce->hDC,(SEGPTR)NULL,0L);
+    SetDCHook(dce->hDC, NULL, 0L);
 
     DeleteDC( dce->hDC );
     if( dce->hClipRgn && !(dce->DCXflags & DCX_KEEPCLIPRGN) )
@@ -238,10 +236,10 @@
  * is destroyed.  Used to implement DCX_CLIPSIBLINGS and
  * DCX_CLIPCHILDREN styles.
  */
-static HRGN DCE_ClipWindows( WND *pWndStart, WND *pWndEnd,
-                             HRGN hrgn, int xoffset, int yoffset )
+static HRGN32 DCE_ClipWindows( WND *pWndStart, WND *pWndEnd,
+                               HRGN32 hrgn, int xoffset, int yoffset )
 {
-    HRGN hrgnNew;
+    HRGN32 hrgnNew;
 
     if (!pWndStart) return hrgn;
     if (!(hrgnNew = CreateRectRgn( 0, 0, 0, 0 )))
@@ -275,10 +273,10 @@
  * clipped by the client area of all ancestors, and then optionally
  * by siblings and children.
  */
-HRGN DCE_GetVisRgn( HWND hwnd, WORD flags )
+HRGN32 DCE_GetVisRgn( HWND hwnd, WORD flags )
 {
     RECT16 rect;
-    HRGN hrgn;
+    HRGN32 hrgn;
     int xoffset, yoffset;
     WND *wndPtr = WIN_FindWndPtr( hwnd );
 
@@ -397,7 +395,7 @@
  */
 HDC32 GetDCEx32( HWND32 hwnd, HRGN32 hrgnClip, DWORD flags )
 {
-    HRGN 	hrgnVisible;
+    HRGN32 	hrgnVisible;
     HDC 	hdc = 0;
     DCE * 	dce;
     DC * 	dc;
@@ -644,7 +642,7 @@
  *
  * See "Undoc. Windows" for hints (DC, SetDCHook, SetHookFlags)..  
  */
-BOOL DCHook(HDC hDC, WORD code, DWORD data, DWORD lParam)
+BOOL16 DCHook( HDC16 hDC, WORD code, DWORD data, LPARAM lParam )
 {
     HRGN32 hVisRgn;
     DCE *dce = firstDCE;;
diff --git a/windows/defdlg.c b/windows/defdlg.c
index d37f1bb..a0970a8 100644
--- a/windows/defdlg.c
+++ b/windows/defdlg.c
@@ -122,7 +122,7 @@
 	    return 0;
 
         case WM_ERASEBKGND:
-	    FillWindow( hwnd, hwnd, (HDC)wParam, (HBRUSH)CTLCOLOR_DLG );
+	    FillWindow( hwnd, hwnd, (HDC)wParam, (HBRUSH16)CTLCOLOR_DLG );
 	    return 1;
 
 	case WM_NCDESTROY:
@@ -188,13 +188,7 @@
 	    {
                 HWND hwndDest = (HWND)wParam;
                 if (!lParam)
-                {
-                    HWND32 hwndPrev = GetFocus32();
-                    if (!hwndPrev)  /* Set focus to the first item */
-                        hwndDest = DIALOG_GetFirstTabItem( hwnd );
-                    else
-                        hwndDest = GetNextDlgTabItem( hwnd, hwndPrev, wParam );
-                }
+                    hwndDest = GetNextDlgTabItem32(hwnd, GetFocus32(), wParam);
                 if (hwndDest) DEFDLG_SetFocus( hwnd, hwndDest );
                 DEFDLG_SetDefButton( hwnd, dlgInfo, hwndDest );
             }
diff --git a/windows/defwnd.c b/windows/defwnd.c
index 7284cd1..46727b3 100644
--- a/windows/defwnd.c
+++ b/windows/defwnd.c
@@ -78,7 +78,7 @@
     switch(msg)
     {
     case WM_NCPAINT:
-	return NC_HandleNCPaint( wndPtr->hwndSelf, (HRGN)wParam );
+	return NC_HandleNCPaint( wndPtr->hwndSelf, (HRGN32)wParam );
 
     case WM_NCHITTEST:
         return NC_HandleNCHitTest( wndPtr->hwndSelf, MAKEPOINT16(lParam) );
@@ -170,10 +170,10 @@
 			     (e.g for textured desktop) ? */
 	    }
 
-	    if (wndPtr->class->hbrBackground <= (HBRUSH)(COLOR_MAX+1))
+	    if (wndPtr->class->hbrBackground <= (HBRUSH16)(COLOR_MAX+1))
             {
-                HBRUSH hbrush = CreateSolidBrush( 
-			        GetSysColor(((DWORD)wndPtr->class->hbrBackground)-1));
+                HBRUSH16 hbrush = CreateSolidBrush( 
+			 GetSysColor(((DWORD)wndPtr->class->hbrBackground)-1));
                  FillWindow( GetParent16(wndPtr->hwndSelf), wndPtr->hwndSelf,
                              (HDC)wParam, hbrush);
                  DeleteObject (hbrush);
@@ -382,7 +382,7 @@
 
     case WM_SETTEXT:
 	DEFWND_SetText( wndPtr, (LPSTR)PTR_SEG_TO_LIN(lParam) );
-	NC_HandleNCPaint( hwnd , (HRGN)1 );  /* Repaint caption */
+	NC_HandleNCPaint( hwnd , (HRGN32)1 );  /* Repaint caption */
         break;
 
     default:
@@ -448,7 +448,7 @@
 
     case WM_SETTEXT:
 	DEFWND_SetText( wndPtr, (LPSTR)lParam );
-	NC_HandleNCPaint( hwnd , (HRGN)1 );  /* Repaint caption */
+	NC_HandleNCPaint( hwnd , (HRGN32)1 );  /* Repaint caption */
         break;
 
     default:
diff --git a/windows/dialog.c b/windows/dialog.c
index fe31129..d180503 100644
--- a/windows/dialog.c
+++ b/windows/dialog.c
@@ -61,7 +61,7 @@
  *
  * Initialisation of the dialog manager.
  */
-BOOL DIALOG_Init()
+BOOL32 DIALOG_Init()
 {
     TEXTMETRIC16 tm;
     HDC hdc;
@@ -85,20 +85,6 @@
 
 
 /***********************************************************************
- *           DIALOG_GetFirstTabItem
- *
- * Return the first item of the dialog that has the WS_TABSTOP style.
- */
-HWND DIALOG_GetFirstTabItem( HWND hwndDlg )
-{
-    WND *pWnd = WIN_FindWndPtr( hwndDlg );
-    for (pWnd = pWnd->child; pWnd; pWnd = pWnd->next)
-        if (pWnd->dwStyle & WS_TABSTOP) return pWnd->hwndSelf;
-    return 0;
-}
-
-
-/***********************************************************************
  *           DIALOG_GetControl16
  *
  * Return the class and text of the control pointed to by ptr,
@@ -274,7 +260,7 @@
                                          info.y * dlgInfo->yBaseUnit / 8,
                                          info.cx * dlgInfo->xBaseUnit / 4,
                                          info.cy * dlgInfo->yBaseUnit / 8,
-                                         pWnd->hwndSelf, (HMENU)info.id,
+                                         pWnd->hwndSelf, (HMENU16)info.id,
                                          instance, info.data );
         }
         else
@@ -288,7 +274,7 @@
                                           info.y * dlgInfo->yBaseUnit / 8,
                                           info.cx * dlgInfo->xBaseUnit / 4,
                                           info.cy * dlgInfo->yBaseUnit / 8,
-                                          pWnd->hwndSelf, (HMENU)info.id,
+                                          pWnd->hwndSelf, (HMENU32)info.id,
                                           hInst, info.data );
         }
         if (!hwndCtrl) return FALSE;
@@ -469,12 +455,12 @@
 /***********************************************************************
  *           DIALOG_CreateIndirect
  */
-static HWND DIALOG_CreateIndirect( HINSTANCE hInst, LPCSTR dlgTemplate,
+static HWND DIALOG_CreateIndirect( HINSTANCE32 hInst, LPCSTR dlgTemplate,
                                    HWND owner, DLGPROC16 dlgProc,
                                    LPARAM param, WINDOWPROCTYPE procType )
 {
-    HMENU hMenu = 0;
-    HFONT hFont = 0;
+    HMENU16 hMenu = 0;
+    HFONT16 hFont = 0;
     HWND hwnd;
     RECT16 rect;
     WND * wndPtr;
@@ -513,7 +499,7 @@
 	if (hFont)
 	{
 	    TEXTMETRIC16 tm;
-	    HFONT oldFont;
+	    HFONT16 oldFont;
 
 	    HDC32 hdc = GetDC32(0);
 	    oldFont = SelectObject( hdc, hFont );
@@ -594,7 +580,7 @@
 
     /* Send initialisation messages and set focus */
 
-    dlgInfo->hwndFocus = DIALOG_GetFirstTabItem( hwnd );
+    dlgInfo->hwndFocus = GetNextDlgTabItem32( hwnd, 0, FALSE );
     if (dlgInfo->hUserFont)
 	SendMessage32A( hwnd, WM_SETFONT, (WPARAM)dlgInfo->hUserFont, 0 );
     if (SendMessage32A(hwnd, WM_INITDIALOG, (WPARAM)dlgInfo->hwndFocus, param))
@@ -905,7 +891,8 @@
         case VK_DOWN:
             if (!(dlgCode & DLGC_WANTARROWS))
             {
-                SetFocus32( GetNextDlgGroupItem(hwndDlg,GetFocus32(),FALSE) );
+                SetFocus32( GetNextDlgGroupItem32( hwndDlg, GetFocus32(),
+                                                   FALSE ) );
                 return TRUE;
             }
             break;
@@ -914,7 +901,8 @@
         case VK_UP:
             if (!(dlgCode & DLGC_WANTARROWS))
             {
-                SetFocus32( GetNextDlgGroupItem(hwndDlg,GetFocus32(),TRUE) );
+                SetFocus32( GetNextDlgGroupItem32( hwndDlg, GetFocus32(),
+                                                   TRUE ) );
                 return TRUE;
             }
             break;
@@ -1225,56 +1213,95 @@
 
 
 /***********************************************************************
- *           GetNextDlgGroupItem   (USER.227)
+ *           GetNextDlgGroupItem16   (USER.227)
  */
-HWND GetNextDlgGroupItem( HWND hwndDlg, HWND hwndCtrl, BOOL fPrevious )
+HWND16 GetNextDlgGroupItem16(HWND16 hwndDlg, HWND16 hwndCtrl, BOOL16 fPrevious)
 {
-    WND *pWnd, *pWndStart, *pWndCtrl, *pWndDlg;
-
-    if (!(pWndDlg = WIN_FindWndPtr( hwndDlg ))) return 0;
-    if (!(pWndCtrl = WIN_FindWndPtr( hwndCtrl ))) return 0;
-    if (pWndCtrl->parent != pWndDlg) return 0;
-
-    if (!fPrevious && pWndCtrl->next)  /* Check if next control is in group */
-    {
-        if (!(pWndCtrl->next->dwStyle & WS_GROUP))
-            return pWndCtrl->next->hwndSelf;
-    }
-
-      /* Now we will have to find the start of the group */
-
-    for (pWnd = pWndStart = pWndDlg->child; pWnd; pWnd = pWnd->next)
-    {
-        if (pWnd->dwStyle & WS_GROUP) pWndStart = pWnd;  /* Start of a group */
-	if (pWnd == pWndCtrl) break;
-    }
-
-    if (!pWnd) fprintf(stderr, "GetNextDlgGroupItem: hwnd not in dialog!\n");
-
-      /* only case left for forward search: wraparound */
-    if (!fPrevious) return pWndStart->hwndSelf;
-
-    pWnd = pWndStart->next;
-    while (pWnd && (pWnd != pWndCtrl))
-    {
-        if (pWnd->dwStyle & WS_GROUP) break;
-        pWndStart = pWnd;
-        pWnd = pWnd->next;
-    }
-    return pWndStart->hwndSelf;
+    return (HWND16)GetNextDlgGroupItem32( hwndDlg, hwndCtrl, fPrevious );
 }
 
 
 /***********************************************************************
- *           GetNextDlgTabItem   (USER.228)
+ *           GetNextDlgGroupItem32   (USER32.274)
  */
-HWND GetNextDlgTabItem( HWND hwndDlg, HWND hwndCtrl, BOOL fPrevious )
+HWND32 GetNextDlgGroupItem32(HWND32 hwndDlg, HWND32 hwndCtrl, BOOL32 fPrevious)
 {
     WND *pWnd, *pWndLast, *pWndCtrl, *pWndDlg;
 
     if (!(pWndDlg = WIN_FindWndPtr( hwndDlg ))) return 0;
-    if (!(pWndCtrl = WIN_FindWndPtr( hwndCtrl ))) return 0;
-    if (pWndCtrl->parent != pWndDlg) return 0;
+    if (hwndCtrl)
+    {
+        if (!(pWndCtrl = WIN_FindWndPtr( hwndCtrl ))) return 0;
+        /* Make sure hwndCtrl is a top-level child */
+        while ((pWndCtrl->dwStyle & WS_CHILD) && (pWndCtrl->parent != pWndDlg))
+            pWndCtrl = pWndCtrl->parent;
+        if (pWndCtrl->parent != pWndDlg) return 0;
+    }
+    else
+    {
+        /* No ctrl specified -> start from the beginning */
+        if (!(pWndCtrl = pWndDlg->child)) return 0;
+        if (fPrevious) while (pWndCtrl->next) pWndCtrl = pWndCtrl->next;
+    }
+
+    pWndLast = pWndCtrl;
+    pWnd = pWndCtrl->next;
+    while (1)
+    {
+        if (!pWnd || (pWnd->dwStyle & WS_GROUP))
+        {
+            /* Wrap-around to the beginning of the group */
+            WND *pWndStart = pWndDlg->child;
+            for (pWnd = pWndStart; pWnd; pWnd = pWnd->next)
+            {
+                if (pWnd->dwStyle & WS_GROUP) pWndStart = pWnd;
+                if (pWnd == pWndCtrl) break;
+            }
+            pWnd = pWndStart;
+        }
+        if (pWnd == pWndCtrl) break;
+	if ((pWnd->dwStyle & WS_VISIBLE) && !(pWnd->dwStyle & WS_DISABLED))
+	{
+            pWndLast = pWnd;
+	    if (!fPrevious) break;
+	}
+        pWnd = pWnd->next;
+    }
+    return pWndLast->hwndSelf;
+}
+
+
+/***********************************************************************
+ *           GetNextDlgTabItem16   (USER.228)
+ */
+HWND16 GetNextDlgTabItem16( HWND16 hwndDlg, HWND16 hwndCtrl, BOOL16 fPrevious )
+{
+    return (HWND16)GetNextDlgTabItem32( hwndDlg, hwndCtrl, fPrevious );
+}
+
+
+/***********************************************************************
+ *           GetNextDlgTabItem32   (USER32.275)
+ */
+HWND32 GetNextDlgTabItem32( HWND32 hwndDlg, HWND32 hwndCtrl, BOOL32 fPrevious )
+{
+    WND *pWnd, *pWndLast, *pWndCtrl, *pWndDlg;
+
+    if (!(pWndDlg = WIN_FindWndPtr( hwndDlg ))) return 0;
+    if (hwndCtrl)
+    {
+        if (!(pWndCtrl = WIN_FindWndPtr( hwndCtrl ))) return 0;
+        /* Make sure hwndCtrl is a top-level child */
+        while ((pWndCtrl->dwStyle & WS_CHILD) && (pWndCtrl->parent != pWndDlg))
+            pWndCtrl = pWndCtrl->parent;
+        if (pWndCtrl->parent != pWndDlg) return 0;
+    }
+    else
+    {
+        /* No ctrl specified -> start from the beginning */
+        if (!(pWndCtrl = pWndDlg->child)) return 0;
+        if (fPrevious) while (pWndCtrl->next) pWndCtrl = pWndCtrl->next;
+    }
 
     pWndLast = pWndCtrl;
     pWnd = pWndCtrl->next;
@@ -1282,7 +1309,8 @@
     {
         if (!pWnd) pWnd = pWndDlg->child;
         if (pWnd == pWndCtrl) break;
-	if ((pWnd->dwStyle & WS_TABSTOP) && (pWnd->dwStyle & WS_VISIBLE))
+	if ((pWnd->dwStyle & WS_TABSTOP) && (pWnd->dwStyle & WS_VISIBLE) &&
+            !(pWnd->dwStyle & WS_DISABLED))
 	{
             pWndLast = pWnd;
 	    if (!fPrevious) break;
diff --git a/windows/event.c b/windows/event.c
index 77532ea..46fc7c4 100644
--- a/windows/event.c
+++ b/windows/event.c
@@ -728,7 +728,7 @@
         WND *wndPtr;
 	WINDOWPOS16 *winpos;
 	RECT16 newWindowRect, newClientRect;
-	HRGN hrgnOldPos, hrgnNewPos;
+	HRGN32 hrgnOldPos, hrgnNewPos;
 
 	if (!(wndPtr = WIN_FindWndPtr( hwnd )) ||
 	    !(wndPtr->flags & WIN_MANAGED) )
@@ -800,7 +800,7 @@
 
     if(event->target == XA_STRING)
     {
-	HANDLE hText;
+	HANDLE16 hText;
 	LPSTR  text;
 	int    size,i,j;
 
diff --git a/windows/graphics.c b/windows/graphics.c
index aca1f6c..5de568a 100644
--- a/windows/graphics.c
+++ b/windows/graphics.c
@@ -456,7 +456,7 @@
  */
 INT16 FillRect16( HDC16 hdc, const RECT16 *rect, HBRUSH16 hbrush )
 {
-    HBRUSH prevBrush;
+    HBRUSH16 prevBrush;
 
     /* coordinates are logical so we cannot fast-check rectangle
      * - do it in PatBlt() after LPtoDP().
@@ -475,7 +475,7 @@
  */
 INT32 FillRect32( HDC32 hdc, const RECT32 *rect, HBRUSH32 hbrush )
 {
-    HBRUSH prevBrush;
+    HBRUSH16 prevBrush;
 
     if (!(prevBrush = SelectObject( hdc, (HBRUSH16)hbrush ))) return 0;
     PatBlt( hdc, rect->left, rect->top,
@@ -510,7 +510,7 @@
  */
 INT16 FrameRect16( HDC16 hdc, const RECT16 *rect, HBRUSH16 hbrush )
 {
-    HBRUSH prevBrush;
+    HBRUSH16 prevBrush;
     int left, top, right, bottom;
 
     DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC );
@@ -626,10 +626,10 @@
 /***********************************************************************
  *           PaintRgn    (GDI.43)
  */
-BOOL PaintRgn( HDC hdc, HRGN hrgn )
+BOOL PaintRgn( HDC hdc, HRGN32 hrgn )
 {
     RECT16 box;
-    HRGN tmpVisRgn, prevVisRgn;
+    HRGN32 tmpVisRgn, prevVisRgn;
     DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC );
     if (!dc) return FALSE;
 
@@ -663,10 +663,10 @@
 /***********************************************************************
  *           FillRgn    (GDI.40)
  */
-BOOL FillRgn( HDC hdc, HRGN hrgn, HBRUSH hbrush )
+BOOL FillRgn( HDC hdc, HRGN32 hrgn, HBRUSH16 hbrush )
 {
     BOOL retval;
-    HBRUSH prevBrush = SelectObject( hdc, hbrush );
+    HBRUSH16 prevBrush = SelectObject( hdc, hbrush );
     if (!prevBrush) return FALSE;
     retval = PaintRgn( hdc, hrgn );
     SelectObject( hdc, prevBrush );
@@ -676,9 +676,9 @@
 /***********************************************************************
  *           FrameRgn     (GDI.41)
  */
-BOOL FrameRgn( HDC hdc, HRGN hrgn, HBRUSH hbrush, int nWidth, int nHeight )
+BOOL FrameRgn( HDC hdc, HRGN32 hrgn, HBRUSH16 hbrush, int nWidth, int nHeight )
 {
-    HRGN tmp = CreateRectRgn( 0, 0, 0, 0 );
+    HRGN32 tmp = CreateRectRgn( 0, 0, 0, 0 );
     if(!REGION_FrameRgn( tmp, hrgn, nWidth, nHeight )) return 0;
     FillRgn( hdc, tmp, hbrush );
     DeleteObject( tmp );
@@ -688,9 +688,9 @@
 /***********************************************************************
  *           InvertRgn    (GDI.42)
  */
-BOOL InvertRgn( HDC hdc, HRGN hrgn )
+BOOL InvertRgn( HDC hdc, HRGN32 hrgn )
 {
-    HBRUSH prevBrush = SelectObject( hdc, GetStockObject(BLACK_BRUSH) );
+    HBRUSH16 prevBrush = SelectObject( hdc, GetStockObject(BLACK_BRUSH) );
     WORD prevROP = SetROP2( hdc, R2_NOT );
     BOOL retval = PaintRgn( hdc, hrgn );
     SelectObject( hdc, prevBrush );
@@ -729,7 +729,7 @@
 
     SetBkMode(hdc, oldBkMode);
     SetROP2(hdc, oldDrawMode);
-    SelectObject(hdc, (HANDLE)hOldPen);
+    SelectObject(hdc, hOldPen);
 }
 
 
@@ -786,7 +786,7 @@
 void GRAPH_DrawReliefRect( HDC32 hdc, const RECT32 *rect, INT32 highlight_size,
                            INT32 shadow_size, BOOL32 pressed )
 {
-    HBRUSH hbrushOld;
+    HBRUSH16 hbrushOld;
     int i;
 
     hbrushOld = SelectObject( hdc, pressed ? sysColorObjects.hbrushBtnShadow :
@@ -881,7 +881,7 @@
  */
 BOOL16 PolyPolygon16( HDC16 hdc, LPPOINT16 pt, LPINT16 counts, UINT16 polygons)
 {
-    HRGN hrgn;
+    HRGN32 hrgn;
     DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC );
 
     if (!dc) 
@@ -1088,7 +1088,7 @@
  */
 BOOL32 DrawEdge32( HDC32 hdc, LPRECT32 rc, UINT32 edge, UINT32 flags )
 {
-    HBRUSH hbrushOld;
+    HBRUSH16 hbrushOld;
 
     if (flags >= BF_DIAGONAL)
         fprintf( stderr, "DrawEdge: unsupported flags %04x\n", flags );
diff --git a/windows/hook.c b/windows/hook.c
index ce58107..4deddf7 100644
--- a/windows/hook.c
+++ b/windows/hook.c
@@ -15,12 +15,28 @@
 
 #define NO_TRANSITION_TYPES  /* This file is Win32-clean */
 #include "hook.h"
-#include "callback.h"
 #include "queue.h"
 #include "user.h"
 #include "stddebug.h"
 #include "debug.h"
 
+#pragma pack(1)
+
+  /* Hook data (pointed to by a HHOOK) */
+typedef struct
+{
+    HANDLE16   next;               /* 00 Next hook in chain */
+    HOOKPROC16 proc WINE_PACKED;   /* 02 Hook procedure */
+    INT16      id;                 /* 06 Hook id (WH_xxx) */
+    HQUEUE16   ownerQueue;         /* 08 Owner queue (0 for system hook) */
+    HMODULE16  ownerModule;        /* 0a Owner module */
+    WORD       inHookProc;         /* 0c TRUE if in this->proc */
+} HOOKDATA;
+
+#pragma pack(4)
+
+#define HOOK_MAGIC  ((int)'H' | (int)'K' << 8)  /* 'HK' */
+
   /* This should probably reside in USER heap */
 static HANDLE16 HOOK_systemHooks[WH_NB_HOOKS] = { 0, };
 
@@ -59,6 +75,16 @@
 
 
 /***********************************************************************
+ *           HOOK_GetProc16
+ */
+HOOKPROC16 HOOK_GetProc16( HHOOK hhook )
+{
+    HOOKDATA *data = (HOOKDATA *)USER_HEAP_LIN_ADDR( hhook );
+    return data ? data->proc : NULL;
+}
+
+
+/***********************************************************************
  *           HOOK_SetHook
  *
  * Install a given hook.
@@ -197,9 +223,9 @@
     queue->hCurHook = hook;
     data->inHookProc = 1;
 
-    dprintf_hook( stddeb, "Calling hook %04x: %d %04lx %08lx\n",
-                  hook, code, (DWORD)wParam, lParam );
-    ret = CallHookProc( data->proc, code, wParam, lParam );
+    dprintf_hook( stddeb, "Calling hook %04x: proc=%p %d %04lx %08lx\n",
+                  hook, data->proc, code, (DWORD)wParam, lParam );
+    ret = data->proc( code, wParam, lParam );
     dprintf_hook( stddeb, "Ret hook %04x = %08lx\n", hook, ret );
 
     data->inHookProc = 0;
@@ -280,23 +306,23 @@
     }
 }
 
+
 /***********************************************************************
- *           SetWindowsHook   (USER.121)
+ *           SetWindowsHook16   (USER.121)
  */
-FARPROC16 SetWindowsHook( INT16 id, HOOKPROC16 proc )
+FARPROC16 SetWindowsHook16( INT16 id, HOOKPROC16 proc )
 {
-    HINSTANCE16 hInst = __winelib ? 0 : FarGetOwner( HIWORD(proc) );
     HTASK16 	hTask = (id == WH_MSGFILTER) ? GetCurrentTask() : 0;
-    HANDLE16 	handle = HOOK_SetHook( id, proc, hInst, hTask );
+    HANDLE16 	handle = HOOK_SetHook( id, proc, 0, hTask );
 
     return (handle) ? (FARPROC16)MAKELONG( handle, HOOK_MAGIC ) : NULL;
 }
 
 
 /***********************************************************************
- *           UnhookWindowsHook   (USER.234)
+ *           UnhookWindowsHook16   (USER.234)
  */
-BOOL16 UnhookWindowsHook( INT16 id, HOOKPROC16 proc )
+BOOL16 UnhookWindowsHook16( INT16 id, HOOKPROC16 proc )
 {
     HANDLE16 hook = HOOK_GetHook( id , 0 );
 
@@ -341,10 +367,10 @@
 
 
 /***********************************************************************
- *           SetWindowsHookEx   (USER.291)
+ *           SetWindowsHookEx16   (USER.291)
  */
-HHOOK SetWindowsHookEx( INT16 id, HOOKPROC16 proc, HINSTANCE16 hInst,
-                        HTASK16 hTask )
+HHOOK SetWindowsHookEx16( INT16 id, HOOKPROC16 proc, HINSTANCE16 hInst,
+                          HTASK16 hTask )
 {
     HANDLE16 handle = HOOK_SetHook( id, proc, hInst, hTask );
     return (handle) ? MAKELONG( handle, HOOK_MAGIC ) : NULL;
@@ -352,9 +378,9 @@
 
 
 /***********************************************************************
- *           UnhookWindowHookEx   (USER.292)
+ *           UnhookWindowHookEx16   (USER.292)
  */
-BOOL16 UnhookWindowsHookEx( HHOOK hhook )
+BOOL16 UnhookWindowsHookEx16( HHOOK hhook )
 {
     if (HIWORD(hhook) != HOOK_MAGIC) return FALSE;  /* Not a new format hook */
     return HOOK_RemoveHook( LOWORD(hhook) );
diff --git a/windows/mdi.c b/windows/mdi.c
index 40b0d4d..6631b94 100644
--- a/windows/mdi.c
+++ b/windows/mdi.c
@@ -31,8 +31,8 @@
 #include "debug.h"
 
 
-static HBITMAP hBmpClose   = 0;
-static HBITMAP hBmpRestore = 0;
+static HBITMAP16 hBmpClose   = 0;
+static HBITMAP16 hBmpRestore = 0;
 
 DWORD SCROLL_SetNCSbState(WND*,int,int,int,int,int,int);
 
@@ -215,7 +215,8 @@
 /**********************************************************************
  *					MDISetMenu
  */
-HMENU MDISetMenu(HWND hwnd, BOOL fRefresh, HMENU hmenuFrame, HMENU hmenuWindow)
+HMENU16 MDISetMenu(HWND hwnd, BOOL fRefresh, HMENU16 hmenuFrame,
+                   HMENU16 hmenuWindow)
 {
     WND           *w         = WIN_FindWndPtr(hwnd);
     MDICLIENTINFO *ci;
@@ -228,7 +229,7 @@
     if (!fRefresh) 
        {
 	HWND hwndFrame = GetParent16(hwnd);
-	HMENU oldFrameMenu = GetMenu(hwndFrame);
+	HMENU16 oldFrameMenu = GetMenu(hwndFrame);
         
 	if( ci->hwndChildMaximized && hmenuFrame && hmenuFrame!=oldFrameMenu )
 	    MDI_RestoreFrameMenu(w->parent, ci->hwndChildMaximized );
@@ -356,7 +357,7 @@
     hwnd = CreateWindow16( (LPCSTR)PTR_SEG_TO_LIN(cs->szClass),
                            (LPCSTR)PTR_SEG_TO_LIN(cs->szTitle), style, 
 			  cs->x, cs->y, cs->cx, cs->cy, parent, 
-                         (HMENU)(DWORD)(WORD)wIDmenu, w->hInstance, 
+                         (HMENU16)wIDmenu, w->hInstance, 
 			 (LPVOID)lParam);
 
     /* MDI windows are WS_CHILD so they won't be activated by CreateWindow */
@@ -406,8 +407,7 @@
 
  MapWindowPoints16(clientWnd->parent->hwndSelf, 
 	       ((MDICLIENTINFO*)clientWnd->wExtra)->self, (LPPOINT16)&rect, 2);
- AdjustWindowRectEx16( &rect, childWnd->dwStyle & ~(WS_VSCROLL | WS_HSCROLL),
-		      0, childWnd->dwExStyle );
+ AdjustWindowRectEx16( &rect, childWnd->dwStyle, 0, childWnd->dwExStyle );
 
  lpMinMax->ptMaxSize.x = rect.right -= rect.left;
  lpMinMax->ptMaxSize.y = rect.bottom -= rect.top;
@@ -664,7 +664,7 @@
 /**********************************************************************
  *				CreateMDIMenuBitmap
  */
-HBITMAP CreateMDIMenuBitmap(void)
+HBITMAP16 CreateMDIMenuBitmap(void)
 {
  HDC 		hDCSrc  = CreateCompatibleDC(0);
  HDC		hDCDest	= CreateCompatibleDC(hDCSrc);
@@ -842,7 +842,7 @@
 {
  WND*		child = WIN_FindWndPtr(hChild);
  HGLOBAL16      handle;
- HMENU  	hSysPopup = 0;
+ HMENU16  	hSysPopup = 0;
 
  dprintf_mdi(stddeb,"MDI_AugmentFrameMenu: frame %p,child %04x\n",frame,hChild);
 
@@ -1070,7 +1070,7 @@
 
       case WM_MDISETMENU:
 #ifdef WINELIB32
-	return (LRESULT)MDISetMenu(hwnd, FALSE, (HMENU)wParam, (HMENU)lParam);
+	return (LRESULT)MDISetMenu(hwnd, FALSE, (HMENU16)wParam, (HMENU16)lParam);
 #else
 	return (LRESULT)MDISetMenu(hwnd, wParam, LOWORD(lParam), HIWORD(lParam));
 #endif
diff --git a/windows/message.c b/windows/message.c
index 2f9cae1..27eec64 100644
--- a/windows/message.c
+++ b/windows/message.c
@@ -403,7 +403,7 @@
 static BOOL MSG_PeekHardwareMsg( MSG16 *msg, HWND hwnd, WORD first, WORD last,
                                  BOOL remove )
 {
-    SYSQ_STATUS status;
+    SYSQ_STATUS status = SYSQ_MSG_ACCEPT;
     MESSAGEQUEUE *sysMsgQueue = QUEUE_GetSysQueue();
     int i, pos = sysMsgQueue->nextMessage;
 
@@ -885,9 +885,10 @@
 }
 
 /***********************************************************************
- *           PostAppMessage   (USER.116)
+ *           PostAppMessage16   (USER.116)
  */
-BOOL PostAppMessage( HTASK hTask, WORD message, WORD wParam, LONG lParam )
+BOOL16 PostAppMessage16( HTASK16 hTask, UINT16 message, WPARAM16 wParam,
+                         LPARAM lParam )
 {
     MSG16 msg;
 
diff --git a/windows/msgbox.c b/windows/msgbox.c
index 693ccba..178e9bc 100644
--- a/windows/msgbox.c
+++ b/windows/msgbox.c
@@ -176,7 +176,7 @@
 
 int MessageBox(HWND hWnd, LPCSTR text, LPCSTR title, WORD type)
 {
-    HANDLE handle;
+    HANDLE16 handle;
     MSGBOX mbox;
     int ret;
 
diff --git a/windows/nonclient.c b/windows/nonclient.c
index fe3148d..3a9268c 100644
--- a/windows/nonclient.c
+++ b/windows/nonclient.c
@@ -26,13 +26,13 @@
 #include "options.h"
 
 
-static HBITMAP hbitmapClose = 0;
-static HBITMAP hbitmapMinimize = 0;
-static HBITMAP hbitmapMinimizeD = 0;
-static HBITMAP hbitmapMaximize = 0;
-static HBITMAP hbitmapMaximizeD = 0;
-static HBITMAP hbitmapRestore = 0;
-static HBITMAP hbitmapRestoreD = 0;
+static HBITMAP16 hbitmapClose = 0;
+static HBITMAP16 hbitmapMinimize = 0;
+static HBITMAP16 hbitmapMinimizeD = 0;
+static HBITMAP16 hbitmapMaximize = 0;
+static HBITMAP16 hbitmapMaximizeD = 0;
+static HBITMAP16 hbitmapRestore = 0;
+static HBITMAP16 hbitmapRestoreD = 0;
 
 #define SC_ABOUTWINE    	(SC_SCREENSAVE+1)
 
@@ -64,6 +64,7 @@
  */
 static void NC_AdjustRect(LPRECT16 rect, DWORD style, BOOL menu, DWORD exStyle)
 {
+    if(style & WS_ICONIC) return;
     /* Decide if the window will be managed (see CreateWindowEx) */
     if (!(Options.managed && !(style & WS_CHILD) &&
           ((style & (WS_DLGFRAME | WS_THICKFRAME)) ||
@@ -117,6 +118,8 @@
 
     if (!(style & (WS_POPUP | WS_CHILD)))  /* Overlapped window */
 	style |= WS_CAPTION;
+    style &= (WS_DLGFRAME | WS_BORDER | WS_THICKFRAME);
+    exStyle &= WS_EX_DLGMODALFRAME;
     if (exStyle & WS_EX_DLGMODALFRAME) style &= ~WS_THICKFRAME;
 
     dprintf_nonclient(stddeb, "AdjustWindowRectEx: (%d,%d)-(%d,%d) %08lx %d %08lx\n",
@@ -432,7 +435,7 @@
 {
     RECT16 rect;
     HDC hdcMem;
-    HBITMAP hbitmap;
+    HBITMAP16 hbitmap;
     WND *wndPtr = WIN_FindWndPtr( hwnd );
 
     if( !(wndPtr->flags & WIN_MANAGED) )
@@ -620,7 +623,7 @@
     
     if (wndPtr->dwExStyle & WS_EX_DLGMODALFRAME)
     {
-	HBRUSH hbrushOld = SelectObject( hdc, sysColorObjects.hbrushWindow );
+	HBRUSH16 hbrushOld = SelectObject( hdc, sysColorObjects.hbrushWindow );
 	PatBlt( hdc, r.left, r.top, 1, r.bottom-r.top+1,PATCOPY );
 	PatBlt( hdc, r.right-1, r.top, 1, r.bottom-r.top+1, PATCOPY );
 	PatBlt( hdc, r.left, r.top-1, r.right-r.left, 1, PATCOPY );
@@ -669,7 +672,7 @@
  *
  * Paint the non-client area. clip is currently unused.
  */
-void NC_DoNCPaint( HWND hwnd, HRGN clip, BOOL suppress_menupaint )
+void NC_DoNCPaint( HWND hwnd, HRGN32 clip, BOOL suppress_menupaint )
 {
     HDC32 hdc;
     RECT16 rect;
@@ -763,7 +766,7 @@
  *
  * Handle a WM_NCPAINT message. Called from DefWindowProc().
  */
-LONG NC_HandleNCPaint( HWND hwnd , HRGN clip)
+LONG NC_HandleNCPaint( HWND hwnd , HRGN32 clip)
 {
     NC_DoNCPaint( hwnd, clip, FALSE );
     return 0;
@@ -790,7 +793,7 @@
       if( wndPtr->dwStyle & WS_MINIMIZE )
 	PAINT_RedrawWindow( wndPtr->hwndSelf, NULL, 0, RDW_INVALIDATE | RDW_ERASE | RDW_ERASENOW, 0 );
       else
-	NC_DoNCPaint( wndPtr->hwndSelf, (HRGN)1, FALSE );
+	NC_DoNCPaint( wndPtr->hwndSelf, (HRGN32)1, FALSE );
     }
     return TRUE;
 }
@@ -875,7 +878,7 @@
     RECT16 rect;
     WND *wndPtr = WIN_FindWndPtr( hwnd );
     int iconic = wndPtr->dwStyle & WS_MINIMIZE;
-    HMENU hmenu;
+    HMENU16 hmenu;
     
     if (!(wndPtr->dwStyle & WS_SYSMENU)) return;
 
diff --git a/windows/painting.c b/windows/painting.c
index 76c5a73..366c629 100644
--- a/windows/painting.c
+++ b/windows/painting.c
@@ -25,7 +25,7 @@
 void WIN_UpdateNCArea(WND* wnd, BOOL bUpdate)
 {
     POINT16 pt = {0, 0}; 
-    HRGN hClip = 1;
+    HRGN32 hClip = 1;
 
     dprintf_nonclient(stddeb,"NCUpdate: hwnd %04x, hrgnUpdate %04x\n", 
                       wnd->hwndSelf, wnd->hrgnUpdate );
@@ -53,7 +53,7 @@
         if (bUpdate)
         {
 	    /* exclude non-client area from update region */
-            HRGN hrgn = CreateRectRgn(0, 0, wnd->rectClient.right - wnd->rectClient.left,
+            HRGN32 hrgn = CreateRectRgn(0, 0, wnd->rectClient.right - wnd->rectClient.left,
 					    wnd->rectClient.bottom - wnd->rectClient.top);
 
             if (hrgn && (CombineRgn(wnd->hrgnUpdate, wnd->hrgnUpdate,
@@ -89,7 +89,7 @@
 HDC16 BeginPaint16( HWND16 hwnd, LPPAINTSTRUCT16 lps ) 
 {
     BOOL32 bIcon;
-    HRGN hrgnUpdate;
+    HRGN32 hrgnUpdate;
     WND *wndPtr = WIN_FindWndPtr( hwnd );
     if (!wndPtr) return 0;
 
@@ -206,9 +206,9 @@
     if ((UINT32)hbrush <= CTLCOLOR_MAX)
     {
 	if (!hwndParent) return;
-	hbrush = (HBRUSH)SendMessage32A( hwndParent, 
-                                         WM_CTLCOLORMSGBOX + (UINT32)hbrush,
-                                         (WPARAM)hdc, (LPARAM)hwnd );
+	hbrush = (HBRUSH16)SendMessage32A( hwndParent, 
+                                           WM_CTLCOLORMSGBOX + (UINT32)hbrush,
+                                           (WPARAM)hdc, (LPARAM)hwnd );
     }
     if (hbrush) FillRect16( hdc, rect, hbrush );
 }
@@ -217,10 +217,10 @@
 /***********************************************************************
  *           GetControlBrush    (USER.326)
  */
-HBRUSH GetControlBrush( HWND hwnd, HDC hdc, WORD control )
+HBRUSH16 GetControlBrush( HWND hwnd, HDC hdc, WORD control )
 {
-    return (HBRUSH)SendMessage32A( GetParent32(hwnd), WM_CTLCOLOR+control,
-                                   (WPARAM)hdc, (LPARAM)hwnd );
+    return (HBRUSH16)SendMessage32A( GetParent32(hwnd), WM_CTLCOLOR+control,
+                                     (WPARAM)hdc, (LPARAM)hwnd );
 }
 
 
@@ -238,10 +238,10 @@
  * HIWORD(lParam) = hwndSkip  (not used; always NULL)
  */
 BOOL32 PAINT_RedrawWindow( HWND32 hwnd, const RECT32 *rectUpdate,
-                         HRGN32 hrgnUpdate, UINT32 flags, UINT32 control )
+                           HRGN32 hrgnUpdate, UINT32 flags, UINT32 control )
 {
     BOOL32 bIcon;
-    HRGN hrgn;
+    HRGN32 hrgn;
     RECT32 rectClient;
     WND* wndPtr;
 
@@ -564,7 +564,7 @@
     {
 	if (wndPtr->hrgnUpdate > 1)
 	{
-	    HRGN hrgn = CreateRectRgn( 0, 0, 0, 0 );
+	    HRGN32 hrgn = CreateRectRgn( 0, 0, 0, 0 );
 	    if (GetUpdateRgn( hwnd, hrgn, erase ) == ERROR) return FALSE;
 	    GetRgnBox32( hrgn, rect );
 	    DeleteObject( hrgn );
@@ -601,7 +601,7 @@
 INT16 ExcludeUpdateRgn( HDC32 hdc, HWND32 hwnd )
 {
     INT16 retval = ERROR;
-    HRGN hrgn;
+    HRGN32 hrgn;
     WND * wndPtr;
 
     if (!(wndPtr = WIN_FindWndPtr( hwnd ))) return ERROR;
diff --git a/windows/scroll.c b/windows/scroll.c
index f92adf1..8692792 100644
--- a/windows/scroll.c
+++ b/windows/scroll.c
@@ -30,7 +30,7 @@
 void ScrollWindow(HWND hwnd, short dx, short dy, LPRECT16 rect, LPRECT16 clipRect)
 {
     HDC32  	hdc;
-    HRGN 	hrgnUpdate,hrgnClip;
+    HRGN32 	hrgnUpdate,hrgnClip;
     RECT16 	rc, cliprc;
     HWND 	hCaretWnd = CARET_GetHwnd();
     WND*	wndScroll = WIN_FindWndPtr( hwnd );
@@ -102,10 +102,10 @@
  *
  */
 BOOL ScrollDC(HDC hdc, short dx, short dy, LPRECT16 rc, LPRECT16 cliprc,
-	      HRGN hrgnUpdate, LPRECT16 rcUpdate)
+	      HRGN32 hrgnUpdate, LPRECT16 rcUpdate)
 {
-    HRGN        hrgnClip 	= 0;
-    HRGN 	hrgnScrollClip  = 0;
+    HRGN32 hrgnClip = 0;
+    HRGN32 hrgnScrollClip = 0;
     RECT16	rectClip;
     POINT16 	src, dest;
     short width, height;
@@ -179,7 +179,7 @@
 
     if (hrgnUpdate || rcUpdate)
     {
-	HRGN   hrgn1 = (hrgnUpdate)?hrgnUpdate:CreateRectRgn( 0,0,0,0 );
+	HRGN32 hrgn1 = (hrgnUpdate)?hrgnUpdate:CreateRectRgn( 0,0,0,0 );
 
 	if( dc->w.hVisRgn )
 	{
@@ -228,7 +228,7 @@
  */
 
 int ScrollWindowEx(HWND hwnd, short dx, short dy, LPRECT16 rect, LPRECT16 clipRect,
-		   HRGN hrgnUpdate, LPRECT16 rcUpdate, WORD flags)
+		   HRGN32 hrgnUpdate, LPRECT16 rcUpdate, WORD flags)
 {
     HDC32 hdc;
     RECT16 rc, cliprc;
diff --git a/windows/win.c b/windows/win.c
index 563c788..da4b5e6 100644
--- a/windows/win.c
+++ b/windows/win.c
@@ -359,7 +359,7 @@
     }
 
     if (!(wndPtr->dwStyle & WS_CHILD))
-       if (wndPtr->wIDmenu) DestroyMenu( (HMENU)wndPtr->wIDmenu );
+       if (wndPtr->wIDmenu) DestroyMenu( (HMENU16)wndPtr->wIDmenu );
     if (wndPtr->hSysMenu) DestroyMenu( wndPtr->hSysMenu );
     if (wndPtr->window) XDestroyWindow( display, wndPtr->window );
     if (wndPtr->class->style & CS_OWNDC) DCE_FreeDCE( wndPtr->dce );
@@ -1906,7 +1906,7 @@
 BOOL16 EnumTaskWindows16( HTASK16 hTask, WNDENUMPROC16 func, LPARAM lParam )
 {
     WND **list, **ppWnd;
-    HANDLE hQueue = GetTaskQueue( hTask );
+    HQUEUE16 hQueue = GetTaskQueue( hTask );
 
     /* This function is the same as EnumWindows(),    */
     /* except for an added check on the window queue. */
@@ -2178,14 +2178,14 @@
  *                              DragObject ( USER.464 )
  *
  */
-DWORD DragObject(HWND hwndScope, HWND hWnd, WORD wObj, HANDLE hOfStruct,
+DWORD DragObject(HWND hwndScope, HWND hWnd, WORD wObj, HANDLE16 hOfStruct,
                 WORD szList , HCURSOR16 hCursor)
 {
  MSG16	 	msg;
  LPDRAGINFO	lpDragInfo;
  SEGPTR		spDragInfo;
  HCURSOR16 	hDragCursor=0, hOldCursor=0, hBummer=0;
- HANDLE		hDragInfo  = GlobalAlloc16( GMEM_SHARE | GMEM_ZEROINIT, 2*sizeof(DRAGINFO));
+ HGLOBAL16	hDragInfo  = GlobalAlloc16( GMEM_SHARE | GMEM_ZEROINIT, 2*sizeof(DRAGINFO));
  WND           *wndPtr = WIN_FindWndPtr(hWnd);
  DWORD		dwRet = 0;
  short	 	dragDone = 0;
diff --git a/windows/winpos.c b/windows/winpos.c
index 7efd791..a5743f8 100644
--- a/windows/winpos.c
+++ b/windows/winpos.c
@@ -39,7 +39,7 @@
 /* ----- external functions ----- */
 
 extern void 	FOCUS_SwitchFocus( HWND , HWND );
-extern HRGN 	DCE_GetVisRgn( HWND, WORD );
+extern HRGN32 	DCE_GetVisRgn( HWND, WORD );
 extern HWND	CARET_GetHwnd();
 extern BOOL     DCE_InvalidateDCE(WND*, RECT16* );
 
@@ -940,8 +940,8 @@
     WND                   *wndTemp         = WIN_FindWndPtr(hwndActive);
     CBTACTIVATESTRUCT16   *cbtStruct;
     WORD                   wIconized=0;
-    HANDLE		   hOldActiveQueue = (pActiveQueue)?pActiveQueue->self:0;
-    HANDLE 		   hNewActiveQueue;
+    HQUEUE16 hOldActiveQueue = (pActiveQueue)?pActiveQueue->self:0;
+    HQUEUE16 hNewActiveQueue;
 
     /* paranoid checks */
     if( hWnd == GetDesktopWindow32() || hWnd == hwndActive )
@@ -1384,10 +1384,10 @@
  * update regions are in window client coordinates
  * client and window rectangles are in parent client coordinates
  */
-static UINT WINPOS_SizeMoveClean(WND* Wnd, HRGN oldVisRgn, LPRECT16 lpOldWndRect, LPRECT16 lpOldClientRect, UINT uFlags )
+static UINT WINPOS_SizeMoveClean(WND* Wnd, HRGN32 oldVisRgn, LPRECT16 lpOldWndRect, LPRECT16 lpOldClientRect, UINT uFlags )
 {
- HRGN newVisRgn    = DCE_GetVisRgn(Wnd->hwndSelf, DCX_WINDOW | DCX_CLIPSIBLINGS );
- HRGN dirtyRgn     = CreateRectRgn(0,0,0,0);
+ HRGN32 newVisRgn = DCE_GetVisRgn(Wnd->hwndSelf,DCX_WINDOW | DCX_CLIPSIBLINGS);
+ HRGN32 dirtyRgn = CreateRectRgn(0,0,0,0);
  int  other, my;
 
  dprintf_win(stddeb,"cleaning up...new wnd=(%i %i-%i %i) old wnd=(%i %i-%i %i)\n\
@@ -1434,7 +1434,7 @@
    { 
      HDC32 hDC;
      int   update;
-     HRGN  updateRgn;
+     HRGN32 updateRgn;
      int   xfrom,yfrom,xto,yto,width,height;
 
      if( uFlags & SMC_DRAWFRAME )
@@ -1581,7 +1581,7 @@
     WINDOWPOS16 *winpos;
     WND *	wndPtr;
     RECT16 	newWindowRect, newClientRect, oldWindowRect;
-    HRGN	visRgn = 0;
+    HRGN32	visRgn = 0;
     HWND	tempInsertAfter= 0;
     int 	result = 0;
     UINT 	uFlags = 0;
