Release 961117

Sun Nov 17 15:01:45 1996  Alexandre Julliard  <julliard@lrc.epfl.ch>

	* [graphics/bitblt.c] [graphics/x11drv/bitblt.c]
	Moved BitBlt operations to the new graphics driver
	interface. Implemented PatBlt32, BitBlt32 and StretchBlt32.

	* [memory/global.c]
	Unified MemManInfo() and GlobalMemoryStatus().

	* [objects/text.c]
	Fixed ExtTextOut() to always use physical coords for clip rect.

	* [windows/dialog.c]
	Implemented DlgDirSelectEx() and Win32 version of DlgDirSelect*.

	* [windows/event.c]
	Avoid busy-looping in EVENT_WaitXEvent when no timer is pending
	(thanks to Thomas Koenig).

	* [windows/painting.c]
	Moved update region clipping for CS_PARENTDC windows to BeginPaint().
	
	* [windows/scroll.c]
	Implemented Win32 version of ScrollWindow() and ScrollDC().

Tue Nov 12 09:52:17 1996  Marcus Meissner <msmeissn@cip.informatik.uni-erlangen.de>

	* [files/*.c] [win32/file.c]
	Some win32 filetime conversion functions added.
	Fixed behaviour with DOS drives pointing to UNIX /
	SetCurrentDirectory() may also get X:\xxx paths.
	Fixed FILE_Open when called from CreateFile().
	Added GetFileSize(), MapViewOfFile(), SetFileTime(), GetFileTime().

	* [misc/crtdll.c] [if1632/crtdll.spec]
	Added some new functions.

	* [if1632/user32.spec]
	Some thunks into win16 code added.

	* [win32/init.c]
	Added GetSystemInfo(), removed GetModuleFileName() stub.

	* [win32/code_page.c] [if1632/thunk.c]
	Added EnumSystemCodePages* (untested).

	* [objects/font.c] [if1632/thunk.c]
	Added EnumFontFamilies32*.
	
Mon Nov 11 14:50:24 1996  Huw D. M. Davies <h.davies1@physics.oxford.ac.uk>

	* [controls/menu.c] [windows/mdi.c]
	Don't delete the MDI `windows' menu if it's already been deleted.

	* [misc/exec.c]
	Notepad always calls WinHelp(.., HELP_QUIT, ...) at termination
 	and complains if it returns FALSE.

	* [windows/winpos.c]
	Get maximized MDI child's nonclient area redrawn after resize.

Thu Nov  7 13:32:34 1996  Lee Jaekil <juria@seodu.co.kr>

	* [memory/global.c]
	Use /proc filesystem for GlobalMemoryStatus() on Linux.

Mon Nov  4 18:30:00 1996  Alex Korobka <alex@trantor.pharm.sunysb.edu>

	* [windows/event.c]
	Added OffiX-style file drop handling. File paths must be
	DOS-mappable by Wine (via wine.conf).

	* [controls/combo.c]
        Added WM_GETTEXT handler.

	* [objects/palette.c]
	Added ResizePalette() (untested).

	* [objects/cursoricon.c]
	Implemented icon to cursor conversion.

	* [objects/color.c]
	Fixed crash on startup when no colorcells are writeable.

Mon Nov  4 00:49:41 1996  Ulrich Schmid  <uschmid@mail.hh.provi.de>

	* [rc/winerc.c]
	Added support for win32 output.

	* [library/libres.c] [include/libres.h] [loader/resource.c]
	Renamed LIBRES_FindResource to LIBRES_FindResource16.
	Added LIBRES_FindResource32.

Sun Nov 3 21:21:45 1996  Robert Pouliot <krynos@clic.net>

	* [loader/builtin.c] [if1632/Makefile.in] [if1632/wing.spec]
	Added the spec file for WinG, it's only stub for now, but it
	should be easy to do by someone with Windows programming
	knowledge. See: ftp.microsoft.com/SoftLib/MSLFILES/wing10.exe.

	* [if1632/crtdll.spec]
	Added some string and memory functions to make sfxed95.exe (of
 	Warcraft 2) almost work.
diff --git a/ANNOUNCE b/ANNOUNCE
index d5d35fe..a999ecd 100644
--- a/ANNOUNCE
+++ b/ANNOUNCE
@@ -1,12 +1,13 @@
-This is release 961102 of Wine, the MS Windows emulator.  This is still a
+This is release 961117 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-961102: (see ChangeLog for details)
+WHAT'S NEW with Wine-961117: (see ChangeLog for details)
 	- More Win32 functions.
+	- OffiX-style drag and drop.
 	- Lots of bug fixes.
 
 See the README file in the distribution for installation instructions.
@@ -15,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-961102.tar.gz
-  ftp://tsx-11.mit.edu/pub/linux/ALPHA/Wine/development/Wine-961102.tar.gz
-  ftp://ftp.infomagic.com/pub/mirrors/linux/wine/development/Wine-961102.tar.gz
-  ftp://aris.com/pub/linux/ALPHA/Wine/development/Wine-961102.tar.gz
+  ftp://sunsite.unc.edu/pub/Linux/ALPHA/wine/development/Wine-961117.tar.gz
+  ftp://tsx-11.mit.edu/pub/linux/ALPHA/Wine/development/Wine-961117.tar.gz
+  ftp://ftp.infomagic.com/pub/mirrors/linux/wine/development/Wine-961117.tar.gz
+  ftp://aris.com/pub/linux/ALPHA/Wine/development/Wine-961117.tar.gz
 
 It should also be available from any site that mirrors tsx-11 or sunsite.
 
diff --git a/BUGS b/BUGS
index 1148443..4785851 100644
--- a/BUGS
+++ b/BUGS
@@ -1,20 +1,45 @@
-1. Messaging:
+This is intended to be a place where you should look first if
+you want to contribute to Wine development. Add your e-mail
+address to the corresponding entry if you are working on/have 
+done something for one of the problems. You are encouraged to 
+add new entries and, more importantly, remove those for the 
+bugs you fixed ;-)
+------------------------------------------------------------
+As of Nov 8 1996 -
 
-- Message flow is not correct for multiple tasks
-- Dialog Boxes created by WM_CREATE handler aren't visible
-- MDI does not send WM_GETMINMAX message.
-- resizing of MDI child windows sometimes leaves them unrepainted
+General:
 
-2. Controls:
+ * Combobox code is very inadequate (no notification messages,
+   dropdown listboxes often stay visible, etc... ).
 
-- Some features are missing (like VK_SHIFT aided multiple selection in listboxes)
+ * Multicolumn and/or LBS_EXTENDEDSEL style listboxes are still 
+   screwed up. [julliard@lrc.epfl.ch]
 
-3. Miscellaneous:
+ * Winsock asynchronous functions do not work.
 
-- AllocCSToDSAlias() shouldn't alloc alias for the same segment multiple times.
+ * Font mapping is too generic. No soft font loading, no rotated 
+   text support. [alex@amadeus.pharm.sunysb.edu]
 
-4. Where to look in source files:
+ * No thread support in Win32 code. 
 
-- grep for FIXME in the source files.
+ * Very alpha printing code. [john@division.co.uk]
+
+ * No icon titles.
+	- Windows uses a special window class to display icon titles.
+	  Handles to these title windows are stored in the icon window
+	  properties.
+
+Miscellaneous:
+
+ * AllocCSToDSAlias() shouldn't alloc alias for the same segment multiple
+   times.
+ * ScrollWindowEx() is outdated.
+ * HCBT_CLICKSKIPPED/HCBT_KEYSKIPPED hook actions are not implemented.
+ * Write sometimes segfaults in StretchDIBits() (when inside BITBLT_GetRow)
+   when only lower part of the resulting image is visible.
+
+Where to look in source files:
+
+ * grep for FIXME in the source files.
 
 
diff --git a/ChangeLog b/ChangeLog
index fec97dd..d848a91 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,4 +1,109 @@
 ----------------------------------------------------------------------
+Sun Nov 17 15:01:45 1996  Alexandre Julliard  <julliard@lrc.epfl.ch>
+
+	* [graphics/bitblt.c] [graphics/x11drv/bitblt.c]
+	Moved BitBlt operations to the new graphics driver
+	interface. Implemented PatBlt32, BitBlt32 and StretchBlt32.
+
+	* [memory/global.c]
+	Unified MemManInfo() and GlobalMemoryStatus().
+
+	* [objects/text.c]
+	Fixed ExtTextOut() to always use physical coords for clip rect.
+
+	* [windows/dialog.c]
+	Implemented DlgDirSelectEx() and Win32 version of DlgDirSelect*.
+
+	* [windows/event.c]
+	Avoid busy-looping in EVENT_WaitXEvent when no timer is pending
+	(thanks to Thomas Koenig).
+
+	* [windows/painting.c]
+	Moved update region clipping for CS_PARENTDC windows to BeginPaint().
+	
+	* [windows/scroll.c]
+	Implemented Win32 version of ScrollWindow() and ScrollDC().
+
+Tue Nov 12 09:52:17 1996  Marcus Meissner <msmeissn@cip.informatik.uni-erlangen.de>
+
+	* [files/*.c] [win32/file.c]
+	Some win32 filetime conversion functions added.
+	Fixed behaviour with DOS drives pointing to UNIX /
+	SetCurrentDirectory() may also get X:\xxx paths.
+	Fixed FILE_Open when called from CreateFile().
+	Added GetFileSize(), MapViewOfFile(), SetFileTime(), GetFileTime().
+
+	* [misc/crtdll.c] [if1632/crtdll.spec]
+	Added some new functions.
+
+	* [if1632/user32.spec]
+	Some thunks into win16 code added.
+
+	* [win32/init.c]
+	Added GetSystemInfo(), removed GetModuleFileName() stub.
+
+	* [win32/code_page.c] [if1632/thunk.c]
+	Added EnumSystemCodePages* (untested).
+
+	* [objects/font.c] [if1632/thunk.c]
+	Added EnumFontFamilies32*.
+	
+Mon Nov 11 14:50:24 1996  Huw D. M. Davies <h.davies1@physics.oxford.ac.uk>
+
+	* [controls/menu.c] [windows/mdi.c]
+	Don't delete the MDI `windows' menu if it's already been deleted.
+
+	* [misc/exec.c]
+	Notepad always calls WinHelp(.., HELP_QUIT, ...) at termination
+ 	and complains if it returns FALSE.
+
+	* [windows/winpos.c]
+	Get maximized MDI child's nonclient area redrawn after resize.
+
+Thu Nov  7 13:32:34 1996  Lee Jaekil <juria@seodu.co.kr>
+
+	* [memory/global.c]
+	Use /proc filesystem for GlobalMemoryStatus() on Linux.
+
+Mon Nov  4 18:30:00 1996  Alex Korobka <alex@trantor.pharm.sunysb.edu>
+
+	* [windows/event.c]
+	Added OffiX-style file drop handling. File paths must be
+	DOS-mappable by Wine (via wine.conf).
+
+	* [controls/combo.c]
+        Added WM_GETTEXT handler.
+
+	* [objects/palette.c]
+	Added ResizePalette() (untested).
+
+	* [objects/cursoricon.c]
+	Implemented icon to cursor conversion.
+
+	* [objects/color.c]
+	Fixed crash on startup when no colorcells are writeable.
+
+Mon Nov  4 00:49:41 1996  Ulrich Schmid  <uschmid@mail.hh.provi.de>
+
+	* [rc/winerc.c]
+	Added support for win32 output.
+
+	* [library/libres.c] [include/libres.h] [loader/resource.c]
+	Renamed LIBRES_FindResource to LIBRES_FindResource16.
+	Added LIBRES_FindResource32.
+
+Sun Nov 3 21:21:45 1996  Robert Pouliot <krynos@clic.net>
+
+	* [loader/builtin.c] [if1632/Makefile.in] [if1632/wing.spec]
+	Added the spec file for WinG, it's only stub for now, but it
+	should be easy to do by someone with Windows programming
+	knowledge. See: ftp.microsoft.com/SoftLib/MSLFILES/wing10.exe.
+
+	* [if1632/crtdll.spec]
+	Added some string and memory functions to make sfxed95.exe (of
+ 	Warcraft 2) almost work.
+
+----------------------------------------------------------------------
 Sat Nov  2 12:50:40 1996  Alexandre Julliard  <julliard@lrc.epfl.ch>
 
 	* [files/dos_fs.c]
diff --git a/Make.rules.in b/Make.rules.in
index 43d024a..f8d1c90 100644
--- a/Make.rules.in
+++ b/Make.rules.in
@@ -52,7 +52,7 @@
 	echo "#include \"windows.h\"" >winerctmp.c
 	echo WINDOWS_H_ENDS_HERE >>winerctmp.c
 	cat $< >>winerctmp.c
-	$(CPP) $(DEFS) $(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) $(RCFLAGS) -c -o $* -p $*
 	$(RM) winerctmp.c
 
 .rc.h:
diff --git a/controls/button.c b/controls/button.c
index 8d92822..3367a66 100644
--- a/controls/button.c
+++ b/controls/button.c
@@ -284,8 +284,8 @@
     {
         /* draw button shadow: */
         SelectObject32(hDC, sysColorObjects.hbrushBtnShadow );
-        PatBlt(hDC, rc.left, rc.top, 1, rc.bottom-rc.top, PATCOPY );
-        PatBlt(hDC, rc.left, rc.top, rc.right-rc.left, 1, PATCOPY );
+        PatBlt32(hDC, rc.left, rc.top, 1, rc.bottom-rc.top, PATCOPY );
+        PatBlt32(hDC, rc.left, rc.top, rc.right-rc.left, 1, PATCOPY );
         rc.left += 2;  /* To position the text down and right */
         rc.top  += 2;
     }
@@ -352,12 +352,12 @@
     SelectObject32( hdcMem, hbmMem);
     hBr = SelectObject32( hdcMem, CreatePatternBrush32(hbm) );
     DeleteObject32( hbm );
-    PatBlt( hdcMem,0,0,rect.right,rect.bottom,WHITENESS);
+    PatBlt32( hdcMem,0,0,rect.right,rect.bottom,WHITENESS);
     if (hFont) SelectObject32( hdcMem, hFont);
     DrawText32A( hdcMem, text, -1, &rc2, DT_SINGLELINE);  
-    PatBlt( hdcMem,0,0,rect.right,rect.bottom,0xFA0089);
+    PatBlt32( hdcMem,0,0,rect.right,rect.bottom,0xFA0089);
     DeleteObject32( SelectObject32( hdcMem,hBr) );
-    BitBlt( hDC,rect.left,rect.top,rect.right,rect.bottom,hdcMem,0,0,0x990000);
+    BitBlt32(hDC,rect.left,rect.top,rect.right,rect.bottom,hdcMem,0,0,0x990000);
     DeleteDC( hdcMem);
     DeleteObject32( hbmMem );
 }
diff --git a/controls/combo.c b/controls/combo.c
index c3f429e..43a368b 100644
--- a/controls/combo.c
+++ b/controls/combo.c
@@ -21,7 +21,6 @@
 #include "graphics.h"
 #include "heap.h"
 #include "listbox.h"
-#include "dos_fs.h"
 #include "drive.h"
 #include "stddebug.h"
 #include "debug.h"
@@ -289,7 +288,7 @@
 static LRESULT CBLButtonDown(HWND hwnd, WPARAM16 wParam, LPARAM lParam)
 {
   LPHEADCOMBO lphc = ComboGetStorageHeader(hwnd);
-  SendMessage16(hwnd,CB_SHOWDROPDOWN,!lphc->DropDownVisible,0);
+  SendMessage16(hwnd,CB_SHOWDROPDOWN16,!lphc->DropDownVisible,0);
   return 0;
 }
 
@@ -774,6 +773,15 @@
     return SendMessage16(lphc->hWndEdit, EM_SETSEL, 0, lParam);
 }
 
+/***********************************************************************
+ *           CBGetText
+ */
+static LRESULT CBGetText(HWND hwnd, WPARAM16 wParam, LPARAM lParam)
+{
+    LPHEADCOMBO lphc = ComboGetStorageHeader(hwnd);
+
+    return SendMessage16(lphc->hWndEdit, WM_GETTEXT, wParam, lParam);   
+}
 
 /***********************************************************************
  *           ComboWndProc
@@ -790,31 +798,32 @@
      case WM_SETFONT: return CBSetFont(hwnd, wParam, lParam);
      case WM_SETREDRAW: return CBSetRedraw(hwnd, wParam, lParam);
      case WM_PAINT: return CBPaint(hwnd, wParam, lParam);
+     case WM_GETTEXT: return CBGetText( hwnd, wParam, lParam);
      case WM_LBUTTONDOWN: return CBLButtonDown(hwnd, wParam, lParam);
      case WM_SETFOCUS: return CBSetFocus(hwnd, wParam, lParam);
      case WM_KILLFOCUS: return CBKillFocus(hwnd, wParam, lParam);
      case WM_SIZE: return CBCheckSize(hwnd);
      case WM_COMMAND: return CBCommand(hwnd, wParam, lParam);
-     case CB_RESETCONTENT: return CBResetContent(hwnd, wParam, lParam);
-     case CB_DIR: return CBDir(hwnd, wParam, lParam);
-     case CB_ADDSTRING: return CBAddString(hwnd, wParam, lParam);
-     case CB_INSERTSTRING: return CBInsertString(hwnd, wParam, lParam);
-     case CB_DELETESTRING: return CBDeleteString(hwnd, wParam, lParam);
-     case CB_FINDSTRING: return CBFindString(hwnd, wParam, lParam);
-     case CB_GETCOUNT: return CBGetCount(hwnd, wParam, lParam);
-     case CB_GETCURSEL: return CBGetCurSel(hwnd, wParam, lParam);
-     case CB_GETITEMDATA: return CBGetItemData(hwnd, wParam, lParam);
-     case CB_GETITEMHEIGHT: return CBGetItemHeight(hwnd, wParam, lParam);
-     case CB_GETLBTEXT: return CBGetLBText(hwnd, wParam, lParam);
-     case CB_GETLBTEXTLEN: return CBGetLBTextLen(hwnd, wParam, lParam);
-     case CB_SELECTSTRING: return CBSelectString(hwnd, wParam, lParam);
-     case CB_SETITEMDATA: return CBSetItemData(hwnd, wParam, lParam);
-     case CB_SETCURSEL: return CBSetCurSel(hwnd, wParam, lParam);
-     case CB_SETITEMHEIGHT: return CBSetItemHeight(hwnd, wParam, lParam);
-     case CB_SHOWDROPDOWN: return CBShowDropDown(hwnd, wParam, lParam);
-     case CB_GETEDITSEL: return CBGetEditSel(hwnd, wParam, lParam);
-     case CB_SETEDITSEL: return CBSetEditSel(hwnd, wParam, lParam);
-     case CB_FINDSTRINGEXACT: return CBFindStringExact(hwnd, wParam, lParam);
+     case CB_RESETCONTENT16: return CBResetContent(hwnd, wParam, lParam);
+     case CB_DIR16: return CBDir(hwnd, wParam, lParam);
+     case CB_ADDSTRING16: return CBAddString(hwnd, wParam, lParam);
+     case CB_INSERTSTRING16: return CBInsertString(hwnd, wParam, lParam);
+     case CB_DELETESTRING16: return CBDeleteString(hwnd, wParam, lParam);
+     case CB_FINDSTRING16: return CBFindString(hwnd, wParam, lParam);
+     case CB_GETCOUNT16: return CBGetCount(hwnd, wParam, lParam);
+     case CB_GETCURSEL16: return CBGetCurSel(hwnd, wParam, lParam);
+     case CB_GETITEMDATA16: return CBGetItemData(hwnd, wParam, lParam);
+     case CB_GETITEMHEIGHT16: return CBGetItemHeight(hwnd, wParam, lParam);
+     case CB_GETLBTEXT16: return CBGetLBText(hwnd, wParam, lParam);
+     case CB_GETLBTEXTLEN16: return CBGetLBTextLen(hwnd, wParam, lParam);
+     case CB_SELECTSTRING16: return CBSelectString(hwnd, wParam, lParam);
+     case CB_SETITEMDATA16: return CBSetItemData(hwnd, wParam, lParam);
+     case CB_SETCURSEL16: return CBSetCurSel(hwnd, wParam, lParam);
+     case CB_SETITEMHEIGHT16: return CBSetItemHeight(hwnd, wParam, lParam);
+     case CB_SHOWDROPDOWN16: return CBShowDropDown(hwnd, wParam, lParam);
+     case CB_GETEDITSEL16: return CBGetEditSel(hwnd, wParam, lParam);
+     case CB_SETEDITSEL16: return CBSetEditSel(hwnd, wParam, lParam);
+     case CB_FINDSTRINGEXACT16: return CBFindStringExact(hwnd, wParam, lParam);
     }
     return DefWindowProc16(hwnd, message, wParam, lParam);
 }
@@ -988,7 +997,7 @@
  */
 static LRESULT CBLKillFocus( HWND hwnd, WPARAM16 wParam, LPARAM lParam )
 {
-/*  SendMessage16(CLBoxGetCombo(hwnd),CB_SHOWDROPDOWN,0,0);*/
+/*  SendMessage16(CLBoxGetCombo(hwnd),CB_SHOWDROPDOWN16,0,0);*/
   return 0;
 }
 
@@ -998,7 +1007,7 @@
 static LRESULT CBLActivate( HWND hwnd, WPARAM16 wParam, LPARAM lParam )
 {
   if (wParam == WA_INACTIVE)
-    SendMessage16(CLBoxGetCombo(hwnd),CB_SHOWDROPDOWN,0,0);
+    SendMessage16(CLBoxGetCombo(hwnd),CB_SHOWDROPDOWN16,0,0);
   return 0;
 }
 
@@ -1042,12 +1051,12 @@
      }
   else if (lphl->PrevFocused != lphl->ItemFocused) 
           {
-      		SendMessage16(CLBoxGetCombo(hwnd),CB_SETCURSEL,lphl->ItemFocused,0);
+      		SendMessage16(CLBoxGetCombo(hwnd),CB_SETCURSEL16,lphl->ItemFocused,0);
       		SendMessage16(GetParent16(hwnd), WM_COMMAND,ID_CLB,MAKELONG(0,CBN_SELCHANGE));
       		ListBoxSendNotification(lphl, CBN_SELCHANGE);
      	  }
 
-  SendMessage16(CLBoxGetCombo(hwnd),CB_SHOWDROPDOWN,0,0);
+  SendMessage16(CLBoxGetCombo(hwnd),CB_SHOWDROPDOWN16,0,0);
 
   return 0;
 }
@@ -1225,15 +1234,6 @@
     return DefWindowProc16(hwnd, message, wParam, lParam);
 }
 
-/************************************************************************
- * 			       	DlgDirSelectComboBox	[USER.194]
- */
-BOOL DlgDirSelectComboBox(HWND hDlg, LPSTR lpStr, INT nIDLBox)
-{
-	fprintf(stdnimp,"DlgDirSelectComboBox(%04x, '%s', %d) \n",
-				hDlg, lpStr, nIDLBox);
-	return TRUE;
-}
 
 static INT32 COMBO_DlgDirList( HWND32 hDlg, LPARAM path, INT32 idCBox,
                                INT32 idStatic, UINT32 wType, BOOL32 unicode )
@@ -1242,11 +1242,11 @@
 
     if (idCBox)
     {
-        SendDlgItemMessage32A( hDlg, idCBox, CB_RESETCONTENT, 0, 0 );
+        SendDlgItemMessage32A( hDlg, idCBox, CB_RESETCONTENT16, 0, 0 );
         if (unicode)
-            res = SendDlgItemMessage32W( hDlg, idCBox, CB_DIR, wType, path );
+            res = SendDlgItemMessage32W( hDlg, idCBox, CB_DIR16, wType, path );
         else
-            res = SendDlgItemMessage32A( hDlg, idCBox, CB_DIR, wType, path );
+            res = SendDlgItemMessage32A( hDlg, idCBox, CB_DIR16, wType, path );
     }
     if (idStatic)
     {
diff --git a/controls/edit.c b/controls/edit.c
index e86af14..66baa58 100644
--- a/controls/edit.c
+++ b/controls/edit.c
@@ -1879,7 +1879,7 @@
 		if (wndPtr->hwndSelf == GetFocus32())
 			HideCaret(wndPtr->hwndSelf);
 		if (EDIT_GetRedraw(wndPtr)) 
-			ScrollWindow(wndPtr->hwndSelf, dx, dy, NULL, NULL);
+			ScrollWindow32(wndPtr->hwndSelf, dx, dy, NULL, NULL);
 		es->FirstVisibleLine = nfv;
 		es->XOffset = nxoff;
 		if (IsVScrollBar(wndPtr))
diff --git a/controls/listbox.c b/controls/listbox.c
index 1fe77b2..a07645d 100644
--- a/controls/listbox.c
+++ b/controls/listbox.c
@@ -2176,43 +2176,6 @@
 
 
 /**********************************************************************
- *	    DlgDirSelect    (USER.99)
- */
-BOOL DlgDirSelect( HWND hDlg, LPSTR lpStr, INT id )
-{
-    char *buffer;
-    INT i;
-
-    dprintf_listbox( stddeb, "DlgDirSelect: %04x '%s' %d\n", hDlg, lpStr, id );
-    if ((i = SendDlgItemMessage16( hDlg, id, LB_GETCURSEL16, 0, 0 )) == LB_ERR)
-        return FALSE;
-    if (!(buffer = SEGPTR_ALLOC( 20 * sizeof(char) ))) return FALSE;
-    SendDlgItemMessage16(hDlg, id, LB_GETTEXT16, i, (LPARAM)SEGPTR_GET(buffer) );
-    if (buffer[0] == '[')  /* drive or directory */
-    {
-        if (buffer[1] == '-')  /* drive */
-        {
-            lpStr[0] = buffer[2];
-            lpStr[1] = ':';
-            lpStr[2] = '\0';
-            dprintf_listbox( stddeb, "Returning drive '%s'\n", lpStr );
-            SEGPTR_FREE(buffer);
-            return TRUE;
-        }
-        strcpy( lpStr, buffer + 1 );
-        lpStr[strlen(lpStr)-1] = '\\';
-        dprintf_listbox( stddeb, "Returning directory '%s'\n", lpStr );
-        SEGPTR_FREE(buffer);
-        return TRUE;
-    }
-    strcpy( lpStr, buffer );
-    dprintf_listbox( stddeb, "Returning file '%s'\n", lpStr );
-    SEGPTR_FREE(buffer);
-    return FALSE;
-}
-
-
-/**********************************************************************
  *	    DlgDirList    (USER.100)
  */
 INT DlgDirList( HWND hDlg, SEGPTR spec, INT idLBox, INT idStatic, UINT attrib )
diff --git a/controls/menu.c b/controls/menu.c
index 8443376..59cee28 100644
--- a/controls/menu.c
+++ b/controls/menu.c
@@ -2173,7 +2173,7 @@
 	LPPOPUPMENU	menu;
 	dprintf_menu(stddeb,"GetMenuItemCount(%04x);\n", hMenu);
 	menu = (LPPOPUPMENU) USER_HEAP_LIN_ADDR(hMenu);
-	if (menu == NULL) return (UINT)-1;
+	if (menu == NULL || menu->wMagic != MENU_MAGIC) return (UINT)-1;
 	dprintf_menu(stddeb,"GetMenuItemCount(%04x) return %d \n", 
 		     hMenu, menu->nItems);
 	return menu->nItems;
diff --git a/controls/scroll.c b/controls/scroll.c
index 481f6cb..21316a0 100644
--- a/controls/scroll.c
+++ b/controls/scroll.c
@@ -48,7 +48,7 @@
 #define SCROLL_MIN_RECT  4  
 
   /* Minimum size of the thumb in pixels */
-#define SCROLL_MIN_THUMB 4
+#define SCROLL_MIN_THUMB 6
 
   /* Delay (in ms) before first repetition when holding the button down */
 #define SCROLL_FIRST_DELAY   200
@@ -316,28 +316,28 @@
                                     TOP_ARROW(infoPtr->flags, top_pressed)
                                     : LEFT_ARROW(infoPtr->flags, top_pressed));
     SetStretchBltMode( hdc, STRETCH_DELETESCANS );
-    StretchBlt( hdc, rect->left, rect->top,
-                vertical ? rect->right-rect->left : arrowSize+1,
-                vertical ? arrowSize+1 : rect->bottom-rect->top,
-                hdcMem, 0, 0,
-                SYSMETRICS_CXVSCROLL + 1, SYSMETRICS_CYHSCROLL + 1,
-                SRCCOPY );
+    StretchBlt32( hdc, rect->left, rect->top,
+                  vertical ? rect->right-rect->left : arrowSize+1,
+                  vertical ? arrowSize+1 : rect->bottom-rect->top,
+                  hdcMem, 0, 0,
+                  SYSMETRICS_CXVSCROLL + 1, SYSMETRICS_CYHSCROLL + 1,
+                  SRCCOPY );
 
     SelectObject32( hdcMem, vertical ?
                     BOTTOM_ARROW( infoPtr->flags, bottom_pressed )
                     : RIGHT_ARROW( infoPtr->flags, bottom_pressed ) );
     if (vertical)
-        StretchBlt( hdc, rect->left, rect->bottom - arrowSize - 1,
-                   rect->right - rect->left, arrowSize + 1,
-                   hdcMem, 0, 0,
-                   SYSMETRICS_CXVSCROLL + 1, SYSMETRICS_CYHSCROLL + 1,
-                   SRCCOPY );
+        StretchBlt32( hdc, rect->left, rect->bottom - arrowSize - 1,
+                      rect->right - rect->left, arrowSize + 1,
+                      hdcMem, 0, 0,
+                      SYSMETRICS_CXVSCROLL + 1, SYSMETRICS_CYHSCROLL + 1,
+                      SRCCOPY );
     else
-        StretchBlt( hdc, rect->right - arrowSize - 1, rect->top,
-                   arrowSize + 1, rect->bottom - rect->top,
-                   hdcMem, 0, 0,
-                   SYSMETRICS_CXVSCROLL + 1, SYSMETRICS_CYHSCROLL + 1,
-                   SRCCOPY );
+        StretchBlt32( hdc, rect->right - arrowSize - 1, rect->top,
+                      arrowSize + 1, rect->bottom - rect->top,
+                      hdcMem, 0, 0,
+                      SYSMETRICS_CXVSCROLL + 1, SYSMETRICS_CYHSCROLL + 1,
+                      SRCCOPY );
     SelectObject32( hdcMem, hbmpPrev );
     DeleteDC( hdcMem );
 }
@@ -432,35 +432,35 @@
 
     if (!thumbPos)  /* No thumb to draw */
     {
-        PatBlt( hdc, r.left+1, r.top+1, r.right - r.left - 2,
-                r.bottom - r.top - 2, PATCOPY );
+        PatBlt32( hdc, r.left+1, r.top+1, r.right - r.left - 2,
+                  r.bottom - r.top - 2, PATCOPY );
         return;
     }
 
     if (vertical)
     {
-        PatBlt( hdc, r.left + 1, r.top + 1,
-                r.right - r.left - 2,
-                thumbPos - arrowSize,
-                top_selected ? 0x0f0000 : PATCOPY );
+        PatBlt32( hdc, r.left + 1, r.top + 1,
+                  r.right - r.left - 2,
+                  thumbPos - arrowSize,
+                  top_selected ? 0x0f0000 : PATCOPY );
         r.top += thumbPos - arrowSize;
-        PatBlt( hdc, r.left + 1, r.top + thumbSize + 1,
-                r.right - r.left - 2,
-                r.bottom - r.top - thumbSize - 2,
-                bottom_selected ? 0x0f0000 : PATCOPY );
+        PatBlt32( hdc, r.left + 1, r.top + thumbSize + 1,
+                  r.right - r.left - 2,
+                  r.bottom - r.top - thumbSize - 2,
+                  bottom_selected ? 0x0f0000 : PATCOPY );
         r.bottom = r.top + thumbSize + 1;
     }
     else  /* horizontal */
     {
-        PatBlt( hdc, r.left + 1, r.top + 1,
-                thumbPos - arrowSize,
-                r.bottom - r.top - 2,
-                top_selected ? 0x0f0000 : PATCOPY );
+        PatBlt32( hdc, r.left + 1, r.top + 1,
+                  thumbPos - arrowSize,
+                  r.bottom - r.top - 2,
+                  top_selected ? 0x0f0000 : PATCOPY );
         r.left += thumbPos - arrowSize;
-        PatBlt( hdc, r.left + thumbSize + 1, r.top + 1,
-                r.right - r.left - thumbSize - 2,
-                r.bottom - r.top - 2,
-                bottom_selected ? 0x0f0000 : PATCOPY );
+        PatBlt32( hdc, r.left + thumbSize + 1, r.top + 1,
+                  r.right - r.left - thumbSize - 2,
+                  r.bottom - r.top - 2,
+                  bottom_selected ? 0x0f0000 : PATCOPY );
         r.right = r.left + thumbSize + 1;
     }
 
diff --git a/controls/widgets.c b/controls/widgets.c
index 0235053..88d01a4 100644
--- a/controls/widgets.c
+++ b/controls/widgets.c
@@ -16,6 +16,8 @@
 #include "module.h"
 #include "heap.h"
 
+#define OLD_LISTBOX
+
 typedef struct
 {
     UINT16     style;
@@ -29,8 +31,10 @@
 {
     { CS_GLOBALCLASS | CS_PARENTDC,
        sizeof(STATICINFO), 0, "StaticWndProc", "STATIC" },
+#ifdef OLD_LISTBOX
     { CS_GLOBALCLASS | CS_PARENTDC | CS_DBLCLKS,
       8, 0, "ListBoxWndProc", "LISTBOX" },
+#endif
     { CS_GLOBALCLASS | CS_PARENTDC | CS_DBLCLKS,
       8, 0, "ComboBoxWndProc", "COMBOBOX" },
     { CS_GLOBALCLASS | CS_DBLCLKS | CS_SAVEBITS,
@@ -53,6 +57,10 @@
 {
     { CS_GLOBALCLASS | CS_DBLCLKS | CS_VREDRAW | CS_HREDRAW | CS_PARENTDC,
       ButtonWndProc, 0, sizeof(BUTTONINFO), 0, 0, 0, 0, 0, "BUTTON" },
+#ifndef OLD_LISTBOX
+    { CS_GLOBALCLASS | CS_DBLCLKS /*| CS_PARENTDC*/,
+      ListBoxWndProc32, 0, sizeof(void *), 0, 0, 0, 0, 0, "LISTBOX" },
+#endif
     { CS_GLOBALCLASS | CS_DBLCLKS | CS_VREDRAW | CS_HREDRAW | CS_PARENTDC,
       ScrollBarWndProc, 0, sizeof(SCROLLBAR_INFO), 0, 0, 0, 0, 0, "SCROLLBAR"},
     { CS_GLOBALCLASS, DesktopWndProc, 0, sizeof(DESKTOPINFO),
diff --git a/documentation/user_module b/documentation/user_module
index 4335f9c..8cff4cb 100644
--- a/documentation/user_module
+++ b/documentation/user_module
@@ -213,5 +213,4 @@
        and in this case SendMessage has to build some sort of message 
        queue for sent messages. Another issue is what to do with messages 
        sent to the sender when it is blocked inside its own SendMessage. 
-       At this point Wine addresses very few of these problems.
 
diff --git a/files/dos_fs.c b/files/dos_fs.c
index 3e3c8dc..77aa5ed 100644
--- a/files/dos_fs.c
+++ b/files/dos_fs.c
@@ -306,6 +306,25 @@
                  + tm->tm_mday;
 }
 
+/***********************************************************************
+ *           DOSFS_DosDateTimeToUnixTime
+ *
+ * Convert from the DOS (FAT) date/time format into Unix time
+ * (borrowed from files/file.c)
+ */
+time_t DOSFS_DosDateTimeToUnixTime( WORD date, WORD time )
+{
+    struct tm newtm;
+
+    newtm.tm_sec  = (time & 0x1f) * 2;
+    newtm.tm_min  = (time >> 5) & 0x3f;
+    newtm.tm_hour = (time >> 11);
+    newtm.tm_mday = (date & 0x1f);
+    newtm.tm_mon  = ((date >> 5) & 0x0f) - 1;
+    newtm.tm_year = (date >> 9) + 80;
+    return mktime( &newtm );
+}
+
 
 /***********************************************************************
  *           DOSFS_UnixTimeToFileTime
@@ -760,7 +779,8 @@
                        path, skip, buffer, cur_pos );
         cur_pos = skip;
         if (dir) closedir(dir);
-        if (!(dir = opendir( path ))) return 0;
+        if (!*path) path = "/";
+        if (!(dir = opendir(path))) return 0;
         drive_path = path;
         drive_root = 0;
         if (DRIVE_FindDriveRoot( &drive_path ) != -1)
@@ -876,3 +896,94 @@
 		*lastpart=strrchr(buf,'\\');
 	return strlen(fn);
 }
+
+
+/***********************************************************************
+ *           DosDateTimeToFileTime   (KERNEL32.76)
+ */
+BOOL32 DosDateTimeToFileTime( WORD fatdate, WORD fattime, LPFILETIME ft )
+{
+    time_t unixtime = DOSFS_DosDateTimeToUnixTime(fatdate,fattime);
+    DOSFS_UnixTimeToFileTime(unixtime,ft);
+    return TRUE;
+}
+
+
+/***********************************************************************
+ *           FileTimeToDosDateTime   (KERNEL32.111)
+ */
+BOOL32 FileTimeToDosDateTime( LPFILETIME ft, LPWORD fatdate, LPWORD fattime)
+{
+    time_t unixtime = DOSFS_FileTimeToUnixTime(ft);
+    DOSFS_ToDosDateTime(unixtime,fatdate,fattime);
+    return TRUE;
+}
+
+
+/***********************************************************************
+ *           LocalFileTimeToFileTime   (KERNEL32.373)
+ */
+BOOL32 LocalFileTimeToFileTime( LPFILETIME localft, LPFILETIME utcft )
+{
+    struct tm *xtm;
+
+    /* convert from local to UTC. Perhaps not correct. FIXME */
+    xtm = gmtime((time_t*)&(localft->dwLowDateTime));
+    utcft->dwLowDateTime  = mktime(xtm);
+    utcft->dwHighDateTime = 0;
+    return TRUE; 
+}
+
+
+/***********************************************************************
+ *           FileTimeToLocalFileTime   (KERNEL32.112)
+ */
+BOOL32 FileTimeToLocalFileTime( LPFILETIME utcft, LPFILETIME localft )
+{
+    struct tm *xtm;
+
+    /* convert from UTC to local. Perhaps not correct. FIXME */
+    xtm = localtime((time_t*)&(utcft->dwLowDateTime));
+    localft->dwLowDateTime  = mktime(xtm);
+    localft->dwHighDateTime = 0;
+    return TRUE; 
+}
+
+
+/***********************************************************************
+ *           FileTimeToSystemTime   (KERNEL32.113)
+ */
+BOOL32 FileTimeToSystemTime( LPFILETIME ft, LPSYSTEMTIME syst )
+{
+    struct tm *xtm;
+    time_t xtime = DOSFS_FileTimeToUnixTime(ft);
+    xtm = gmtime(&xtime);
+    syst->wYear      = xtm->tm_year;
+    syst->wMonth     = xtm->tm_mon;
+    syst->wDayOfWeek = xtm->tm_wday;
+    syst->wDay	     = xtm->tm_mday;
+    syst->wHour	     = xtm->tm_hour;
+    syst->wMinute    = xtm->tm_min;
+    syst->wSecond    = xtm->tm_sec;
+    syst->wMilliseconds	= 0; /* FIXME */
+    return TRUE; 
+}
+
+
+/***********************************************************************
+ *           SystemTimeToFileTime   (KERNEL32.526)
+ */
+BOOL32 SystemTimeToFileTime( LPSYSTEMTIME syst, LPFILETIME ft )
+{
+    struct tm xtm;
+
+    xtm.tm_year	= syst->wYear;
+    xtm.tm_mon	= syst->wMonth;
+    xtm.tm_wday	= syst->wDayOfWeek;
+    xtm.tm_mday	= syst->wDay;
+    xtm.tm_hour	= syst->wHour;
+    xtm.tm_min	= syst->wMinute;
+    xtm.tm_sec	= syst->wSecond;
+    DOSFS_UnixTimeToFileTime(mktime(&xtm),ft);
+    return TRUE; 
+}
diff --git a/files/drive.c b/files/drive.c
index 9210de7..8a5bf5a 100644
--- a/files/drive.c
+++ b/files/drive.c
@@ -136,7 +136,10 @@
         {
             p = path + strlen(path) - 1;
             while ((p > path) && ((*p == '/') || (*p == '\\'))) *p-- = '\0';
-            drive->root     = xstrdup( path );
+            if (strlen(path))
+                drive->root = xstrdup( path );
+            else
+                drive->root = xstrdup( "/" );
             drive->dos_cwd  = xstrdup( "" );
             drive->unix_cwd = xstrdup( "" );
             drive->type     = DRIVE_GetDriveType( name );
@@ -681,6 +684,17 @@
  */
 BOOL32 SetCurrentDirectory( LPCSTR dir )
 {
+    if (dir[0] && (dir[1]==':'))
+    {
+        int drive = tolower( *dir ) - 'a';
+        if (!DRIVE_IsValid(drive))
+        {
+            DOS_ERROR( ER_InvalidDrive, EC_MediaError, SA_Abort, EL_Disk );
+            return 0;
+        }
+        dir += 2;
+    }
+    /* FIXME: what about empty strings? Add a \\ ? */
     return DRIVE_Chdir( DRIVE_GetCurrentDrive(), dir );
 }
 
diff --git a/files/file.c b/files/file.c
index d8b22b2..45ac9f0 100644
--- a/files/file.c
+++ b/files/file.c
@@ -366,8 +366,9 @@
             return HFILE_ERROR;
         }
     }
-    else if (!(unixName = DOSFS_GetUnixFileName( path, TRUE )))
-        return HFILE_ERROR;
+    else /* check for filename, don't check for last entry if creating */
+        if (!(unixName = DOSFS_GetUnixFileName( path, !(mode & O_CREAT) )))
+            return HFILE_ERROR;
 
     if (!(file = FILE_OpenUnixFile( unixName, mode ))) return HFILE_ERROR;
     if ((handle = FILE_AllocTaskHandle( file )) == HFILE_ERROR)
@@ -1406,3 +1407,71 @@
     }
     return file->type;
 }
+
+
+/***********************************************************************
+ *              GetFileTime   (KERNEL32.221)
+ */
+BOOL32 GetFileTime( HFILE hFile, FILETIME *lpCreationTime,
+                    FILETIME *lpLastAccessTime, FILETIME *lpLastWriteTime )
+{
+    DOS_FILE *file = FILE_GetFile(hFile);
+    struct stat stbuf;
+    
+    if (!file) {
+    	SetLastError( ERROR_INVALID_HANDLE );
+	return FILE_TYPE_UNKNOWN; /* FIXME: correct? */
+    }
+    dprintf_file(stddeb,"SetFileTime(%s,%p,%p,%p)\n",
+	file->unix_name,
+	lpCreationTime,
+	lpLastAccessTime,
+	lpLastWriteTime
+    );
+    if (-1==fstat(file->unix_handle,&stbuf)) {
+	FILE_SetDosError();
+	return FALSE;
+    }
+    if (lpLastWriteTime)
+    	DOSFS_UnixTimeToFileTime(stbuf.st_mtime,lpLastWriteTime);
+    if (lpCreationTime)
+	DOSFS_UnixTimeToFileTime(stbuf.st_ctime,lpCreationTime);
+    if (lpLastAccessTime)
+    	DOSFS_UnixTimeToFileTime(stbuf.st_atime,lpLastAccessTime);
+    return TRUE;
+}
+
+
+/***********************************************************************
+ *              SetFileTime   (KERNEL32.493)
+ */
+BOOL32 SetFileTime( HFILE hFile, FILETIME *lpCreationTime,
+                    FILETIME *lpLastAccessTime, FILETIME *lpLastWriteTime )
+{
+    DOS_FILE *file = FILE_GetFile(hFile);
+    struct utimbuf utimbuf;
+    
+    if (!file) {
+    	SetLastError( ERROR_INVALID_HANDLE );
+    	return FILE_TYPE_UNKNOWN; /* FIXME: correct? */
+    }
+    dprintf_file(stddeb,"SetFileTime(%s,%p,%p,%p)\n",
+	file->unix_name,
+	lpCreationTime,
+	lpLastAccessTime,
+	lpLastWriteTime
+    );
+    if (lpLastAccessTime)
+	utimbuf.actime	= DOSFS_FileTimeToUnixTime(lpLastAccessTime);
+    else
+	utimbuf.actime	= 0; /* FIXME */
+    if (lpLastWriteTime)
+	utimbuf.modtime	= DOSFS_FileTimeToUnixTime(lpLastWriteTime);
+    else
+	utimbuf.modtime	= 0; /* FIXME */
+    if (-1==utime(file->unix_name,&utimbuf)) {
+	FILE_SetDosError();
+	return FALSE;
+    }
+    return TRUE;
+}
diff --git a/files/profile.c b/files/profile.c
index 4570b5e..ddb21ed 100644
--- a/files/profile.c
+++ b/files/profile.c
@@ -10,8 +10,8 @@
 #include <stdlib.h>
 #include <string.h>
 
-#include "dos_fs.h"
 #include "windows.h"
+#include "dos_fs.h"
 #include "xmalloc.h"
 #include "stddebug.h"
 #include "debug.h"
diff --git a/graphics/Makefile.in b/graphics/Makefile.in
index cc46354..9bb9535 100644
--- a/graphics/Makefile.in
+++ b/graphics/Makefile.in
@@ -6,6 +6,7 @@
 MODULE    = graphics
 
 C_SRCS = \
+	bitblt.c \
 	driver.c
 
 all: $(MODULE).o
diff --git a/graphics/bitblt.c b/graphics/bitblt.c
new file mode 100644
index 0000000..2acda69
--- /dev/null
+++ b/graphics/bitblt.c
@@ -0,0 +1,149 @@
+/*
+ * GDI bit-blit operations
+ *
+ * Copyright 1993, 1994  Alexandre Julliard
+ */
+
+#include "gdi.h"
+#include "stddebug.h"
+#include "debug.h"
+
+
+/***********************************************************************
+ *           PatBlt16    (GDI.29)
+ */
+BOOL16 PatBlt16( HDC16 hdc, INT16 left, INT16 top,
+                 INT16 width, INT16 height, DWORD rop)
+{
+    DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC );
+    if (!dc || !dc->funcs->pPatBlt) return FALSE;
+
+    dprintf_bitblt( stddeb, "PatBlt16: %04x %d,%d %dx%d %06lx\n",
+                    hdc, left, top, width, height, rop );
+    return dc->funcs->pPatBlt( dc, left, top, width, height, rop );
+}
+
+
+/***********************************************************************
+ *           PatBlt32    (GDI32.260)
+ */
+BOOL32 PatBlt32( HDC32 hdc, INT32 left, INT32 top,
+                 INT32 width, INT32 height, DWORD rop)
+{
+    DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC );
+    if (!dc || !dc->funcs->pPatBlt) return FALSE;
+
+    dprintf_bitblt( stddeb, "PatBlt32: %04x %d,%d %dx%d %06lx\n",
+                    hdc, left, top, width, height, rop );
+    return dc->funcs->pPatBlt( dc, left, top, width, height, rop );
+}
+
+
+/***********************************************************************
+ *           BitBlt16    (GDI.34)
+ */
+BOOL16 BitBlt16( HDC16 hdcDst, INT16 xDst, INT16 yDst, INT16 width,
+                 INT16 height, HDC16 hdcSrc, INT16 xSrc, INT16 ySrc, DWORD rop)
+{
+    DC *dcDst, *dcSrc;
+
+    if (!(dcDst = (DC *)GDI_GetObjPtr( hdcDst, DC_MAGIC ))) return FALSE;
+    if (!dcDst->funcs->pBitBlt) return FALSE;
+    dcSrc = (DC *) GDI_GetObjPtr( hdcSrc, DC_MAGIC );
+
+    dprintf_bitblt(stddeb,
+                "BitBlt16: hdcSrc=%04x %d,%d %d bpp -> hdcDest=%04x %d,%d %dx%dx%d rop=%06lx\n",
+                hdcSrc, xSrc, ySrc, dcSrc ? dcSrc->w.bitsPerPixel : 0,
+                hdcDst, xDst, yDst, width, height, dcDst->w.bitsPerPixel, rop);
+    return dcDst->funcs->pBitBlt( dcDst, xDst, yDst, width, height,
+                                  dcSrc, xSrc, ySrc, rop );
+}
+
+
+/***********************************************************************
+ *           BitBlt32    (GDI32.10)
+ */
+BOOL32 BitBlt32( HDC32 hdcDst, INT32 xDst, INT32 yDst, INT32 width,
+                 INT32 height, HDC32 hdcSrc, INT32 xSrc, INT32 ySrc, DWORD rop)
+{
+    DC *dcDst, *dcSrc;
+
+    if (!(dcDst = (DC *)GDI_GetObjPtr( hdcDst, DC_MAGIC ))) return FALSE;
+    if (!dcDst->funcs->pBitBlt) return FALSE;
+    dcSrc = (DC *) GDI_GetObjPtr( hdcSrc, DC_MAGIC );
+
+    dprintf_bitblt(stddeb,
+                "BitBlt32: hdcSrc=%04x %d,%d %d bpp -> hdcDest=%04x %d,%d %dx%dx%d rop=%06lx\n",
+                hdcSrc, xSrc, ySrc, dcSrc ? dcSrc->w.bitsPerPixel : 0,
+                hdcDst, xDst, yDst, width, height, dcDst->w.bitsPerPixel, rop);
+    return dcDst->funcs->pBitBlt( dcDst, xDst, yDst, width, height,
+                                  dcSrc, xSrc, ySrc, rop );
+}
+
+
+/***********************************************************************
+ *           StretchBlt16    (GDI.35)
+ */
+BOOL16 StretchBlt16( HDC16 hdcDst, INT16 xDst, INT16 yDst,
+                     INT16 widthDst, INT16 heightDst,
+                     HDC16 hdcSrc, INT16 xSrc, INT16 ySrc,
+                     INT16 widthSrc, INT16 heightSrc, DWORD rop )
+{
+    DC *dcDst, *dcSrc;
+
+    if (!(dcDst = (DC *) GDI_GetObjPtr( hdcDst, DC_MAGIC ))) return FALSE;
+    if (!dcDst->funcs->pStretchBlt) return FALSE;
+    dcSrc = (DC *) GDI_GetObjPtr( hdcSrc, DC_MAGIC );
+    dprintf_bitblt(stddeb,
+        "StretchBlt16: %04x %d,%d %dx%dx%d -> %04x %d,%d %dx%dx%d rop=%06lx\n",
+                   hdcSrc, xSrc, ySrc, widthSrc, heightSrc,
+                   dcSrc ? dcSrc->w.bitsPerPixel : 0, hdcDst, xDst, yDst,
+                   widthDst, heightDst, dcDst->w.bitsPerPixel, rop );
+    return dcDst->funcs->pStretchBlt( dcDst, xDst, yDst, widthDst, heightDst,
+                                      dcSrc, xSrc, ySrc, widthSrc, heightSrc,
+                                      rop );
+}
+
+
+/***********************************************************************
+ *           StretchBlt32    (GDI32.350)
+ */
+BOOL32 StretchBlt32( HDC32 hdcDst, INT32 xDst, INT32 yDst,
+                     INT32 widthDst, INT32 heightDst,
+                     HDC32 hdcSrc, INT32 xSrc, INT32 ySrc,
+                     INT32 widthSrc, INT32 heightSrc, DWORD rop )
+{
+    DC *dcDst, *dcSrc;
+
+    if (!(dcDst = (DC *) GDI_GetObjPtr( hdcDst, DC_MAGIC ))) return FALSE;
+    if (!dcDst->funcs->pStretchBlt) return FALSE;
+    dcSrc = (DC *) GDI_GetObjPtr( hdcSrc, DC_MAGIC );
+    dprintf_bitblt(stddeb,
+        "StretchBlt32: %04x %d,%d %dx%dx%d -> %04x %d,%d %dx%dx%d rop=%06lx\n",
+                   hdcSrc, xSrc, ySrc, widthSrc, heightSrc,
+                   dcSrc ? dcSrc->w.bitsPerPixel : 0, hdcDst, xDst, yDst,
+                   widthDst, heightDst, dcDst->w.bitsPerPixel, rop );
+    return dcDst->funcs->pStretchBlt( dcDst, xDst, yDst, widthDst, heightDst,
+                                      dcSrc, xSrc, ySrc, widthSrc, heightSrc,
+                                      rop );
+}
+
+
+/***********************************************************************
+ *           FastWindowFrame    (GDI.400)
+ */
+BOOL16 FastWindowFrame( HDC16 hdc, const RECT16 *rect,
+                        INT16 width, INT16 height, DWORD rop )
+{
+    HBRUSH32 hbrush = SelectObject32( hdc, GetStockObject32( GRAY_BRUSH ) );
+    PatBlt32( hdc, rect->left, rect->top,
+              rect->right - rect->left - width, height, rop );
+    PatBlt32( hdc, rect->left, rect->top + height, width,
+              rect->bottom - rect->top - height, rop );
+    PatBlt32( hdc, rect->left + width, rect->bottom,
+              rect->right - rect->left - width, -height, rop );
+    PatBlt32( hdc, rect->right, rect->top, -width, 
+              rect->bottom - rect->top - height, rop );
+    SelectObject32( hdc, hbrush );
+    return TRUE;
+}
diff --git a/graphics/metafiledrv/Makefile.in b/graphics/metafiledrv/Makefile.in
index 1e39e5b..02de44e 100644
--- a/graphics/metafiledrv/Makefile.in
+++ b/graphics/metafiledrv/Makefile.in
@@ -6,6 +6,7 @@
 MODULE    = metafiledrv
 
 C_SRCS = \
+	bitblt.c \
 	init.c
 
 all: $(MODULE).o
diff --git a/graphics/metafiledrv/bitblt.c b/graphics/metafiledrv/bitblt.c
new file mode 100644
index 0000000..34c6ad6
--- /dev/null
+++ b/graphics/metafiledrv/bitblt.c
@@ -0,0 +1,45 @@
+/*
+ * GDI bit-blit operations
+ *
+ * Copyright 1993, 1994  Alexandre Julliard
+ */
+
+#include "gdi.h"
+#include "metafile.h"
+#include "metafiledrv.h"
+
+/***********************************************************************
+ *           MFDRV_PatBlt
+ */
+BOOL32 MFDRV_PatBlt( DC *dc, INT32 left, INT32 top,
+                     INT32 width, INT32 height, DWORD rop )
+{
+    MF_MetaParam6( dc, META_PATBLT, left, top, width, height,
+                   HIWORD(rop), LOWORD(rop) );
+    return TRUE;
+}
+
+
+/***********************************************************************
+ *           MFDRV_BitBlt
+ */
+BOOL32 MFDRV_BitBlt( DC *dcDst, INT32 xDst, INT32 yDst,
+                      INT32 width, INT32 height, DC *dcSrc,
+                      INT32 xSrc, INT32 ySrc, DWORD rop )
+{
+    return MF_BitBlt( dcDst, xDst, yDst, width, height,
+                      dcSrc, xSrc, ySrc, rop );
+}
+
+
+/***********************************************************************
+ *           MFDRV_StretchBlt
+ */
+BOOL32 MFDRV_StretchBlt( DC *dcDst, INT32 xDst, INT32 yDst,
+                          INT32 widthDst, INT32 heightDst,
+                          DC *dcSrc, INT32 xSrc, INT32 ySrc,
+                          INT32 widthSrc, INT32 heightSrc, DWORD rop )
+{
+    return MF_StretchBlt( dcDst, xDst, yDst, widthDst, heightDst,
+                          dcSrc, xSrc, ySrc, widthSrc, heightSrc, rop );
+}
diff --git a/graphics/metafiledrv/init.c b/graphics/metafiledrv/init.c
index dc11829..e8ad11d 100644
--- a/graphics/metafiledrv/init.c
+++ b/graphics/metafiledrv/init.c
@@ -17,7 +17,7 @@
 static const DC_FUNCTIONS MFDRV_Funcs =
 {
     NULL,                            /* pArc */
-    NULL,                            /* pBitBlt */
+    MFDRV_BitBlt,                    /* pBitBlt */
     NULL,                            /* pChord */
     NULL,                            /* pCreateDC */
     MFDRV_DeleteDC,                  /* pDeleteDC */
@@ -42,7 +42,7 @@
     NULL,                            /* pOffsetViewportOrgEx */
     NULL,                            /* pOffsetWindowOrgEx */
     NULL,                            /* pPaintRgn */
-    NULL,                            /* pPatBlt */
+    MFDRV_PatBlt,                    /* pPatBlt */
     NULL,                            /* pPie */
     NULL,                            /* pPolyPolygon */
     NULL,                            /* pPolygon */
@@ -76,7 +76,7 @@
     NULL,                            /* pSetViewportOrgEx */
     NULL,                            /* pSetWindowExtEx */
     NULL,                            /* pSetWindowOrgEx */
-    NULL,                            /* pStretchBlt */
+    MFDRV_StretchBlt,                /* pStretchBlt */
     NULL,                            /* pStretchDIBits */
     NULL                             /* pTextOut */
 };
@@ -146,7 +146,6 @@
     METAFILEDRV_PDEVICE *physDev;
     HFILE hFile;
 
-    printf( "CreateMetafile16: '%s'\n", filename );
     dprintf_metafile( stddeb, "CreateMetaFile16: '%s'\n", filename );
 
     if (!(dc = MFDRV_AllocMetaFile())) return 0;
diff --git a/graphics/x11drv/Makefile.in b/graphics/x11drv/Makefile.in
index a197fd7..77883a2 100644
--- a/graphics/x11drv/Makefile.in
+++ b/graphics/x11drv/Makefile.in
@@ -6,6 +6,7 @@
 MODULE    = x11drv
 
 C_SRCS = \
+	bitblt.c \
 	clipping.c \
 	font.c \
 	init.c
diff --git a/objects/bitblt.c b/graphics/x11drv/bitblt.c
similarity index 90%
rename from objects/bitblt.c
rename to graphics/x11drv/bitblt.c
index 1bf8657..d037d13 100644
--- a/objects/bitblt.c
+++ b/graphics/x11drv/bitblt.c
@@ -14,8 +14,8 @@
 #include "dc.h"
 #include "metafile.h"
 #include "options.h"
+#include "x11drv.h"
 #include "stddebug.h"
-/* #define DEBUG_BITBLT */
 #include "debug.h"
 #include "xmalloc.h"
 
@@ -521,10 +521,10 @@
  * Stretch a row of pixels. Helper function for BITBLT_StretchImage.
  */
 static void BITBLT_StretchRow( int *rowSrc, int *rowDst,
-                               short startDst, short widthDst,
-                               int xinc, WORD mode )
+                               INT32 startDst, INT32 widthDst,
+                               INT32 xinc, WORD mode )
 {
-    register int xsrc = xinc * startDst;
+    register INT32 xsrc = xinc * startDst;
     rowDst += startDst;
     switch(mode)
     {
@@ -550,10 +550,10 @@
  * Shrink a row of pixels. Helper function for BITBLT_StretchImage.
  */
 static void BITBLT_ShrinkRow( int *rowSrc, int *rowDst,
-                              short startSrc, short widthSrc,
-                              int xinc, WORD mode )
+                              INT32 startSrc, INT32 widthSrc,
+                              INT32 xinc, WORD mode )
 {
-    register int xdst = xinc * startSrc;
+    register INT32 xdst = xinc * startSrc;
     rowSrc += startSrc;
     switch(mode)
     {
@@ -578,11 +578,11 @@
  *
  * Retrieve a row from an image. Helper function for BITBLT_StretchImage.
  */
-static void BITBLT_GetRow( XImage *image, int *pdata, short row,
-                           short start, short width, short depthDst,
-                           int fg, int bg, BOOL swap)
+static void BITBLT_GetRow( XImage *image, int *pdata, INT32 row,
+                           INT32 start, INT32 width, INT32 depthDst,
+                           int fg, int bg, BOOL32 swap)
 {
-    register short i;
+    register INT32 i;
 
     pdata += swap ? start+width-1 : start;
     if (image->depth == depthDst)  /* color -> color */
@@ -627,17 +627,18 @@
  *           BITBLT_StretchImage
  *
  * Stretch an X image.
+ * FIXME: does not work for full 32-bit coordinates.
  */
 static void BITBLT_StretchImage( XImage *srcImage, XImage *dstImage,
-                                 short widthSrc, short heightSrc,
-                                 short widthDst, short heightDst,
-                                 RECT16 *visRectSrc, RECT16 *visRectDst,
+                                 INT32 widthSrc, INT32 heightSrc,
+                                 INT32 widthDst, INT32 heightDst,
+                                 RECT32 *visRectSrc, RECT32 *visRectDst,
                                  int foreground, int background, WORD mode )
 {
     int *rowSrc, *rowDst, *pixel;
-    int xinc, yinc, ysrc, ydst;
-    register short x, y;
-    BOOL hstretch, vstretch, hswap, vswap;
+    INT32 xinc, yinc, ysrc, ydst;
+    register INT32 x, y;
+    BOOL32 hstretch, vstretch, hswap, vswap;
 
     hswap = ((int)widthSrc * widthDst) < 0;
     vswap = ((int)heightSrc * heightDst) < 0;
@@ -774,18 +775,18 @@
  */
 static void BITBLT_GetSrcAreaStretch( DC *dcSrc, DC *dcDst,
                                       Pixmap pixmap, GC gc,
-                                      short xSrc, short ySrc,
-                                      short widthSrc, short heightSrc,
-                                      short xDst, short yDst,
-                                      short widthDst, short heightDst,
-                                      RECT16 *visRectSrc, RECT16 *visRectDst )
+                                      INT32 xSrc, INT32 ySrc,
+                                      INT32 widthSrc, INT32 heightSrc,
+                                      INT32 xDst, INT32 yDst,
+                                      INT32 widthDst, INT32 heightDst,
+                                      RECT32 *visRectSrc, RECT32 *visRectDst )
 {
     XImage *imageSrc, *imageDst;
 
-    RECT16 rectSrc = *visRectSrc;
-    RECT16 rectDst = *visRectDst;
-    OffsetRect16( &rectSrc, -xSrc, -ySrc );
-    OffsetRect16( &rectDst, -xDst, -yDst );
+    RECT32 rectSrc = *visRectSrc;
+    RECT32 rectDst = *visRectDst;
+    OffsetRect32( &rectSrc, -xSrc, -ySrc );
+    OffsetRect32( &rectDst, -xDst, -yDst );
     /* FIXME: avoid BadMatch errors */
     imageSrc = XGetImage( display, dcSrc->u.x.drawable,
                           visRectSrc->left, visRectSrc->top,
@@ -813,13 +814,12 @@
  * pixels to Windows colors.
  */
 static void BITBLT_GetSrcArea( DC *dcSrc, DC *dcDst, Pixmap pixmap, GC gc,
-                               short xSrc, short ySrc,
-                               RECT16 *visRectSrc )
+                               INT32 xSrc, INT32 ySrc, RECT32 *visRectSrc )
 {
     XImage *imageSrc, *imageDst;
-    register short x, y;
-    short width  = visRectSrc->right - visRectSrc->left;
-    short height = visRectSrc->bottom - visRectSrc->top;
+    register INT32 x, y;
+    INT32 width  = visRectSrc->right - visRectSrc->left;
+    INT32 height = visRectSrc->bottom - visRectSrc->top;
 
     if (dcSrc->w.bitsPerPixel == dcDst->w.bitsPerPixel)
     {
@@ -899,10 +899,10 @@
  * Retrieve an area from the destination DC, mapping all the
  * pixels to Windows colors.
  */
-static void BITBLT_GetDstArea(DC *dc, Pixmap pixmap, GC gc, RECT16 *visRectDst)
+static void BITBLT_GetDstArea(DC *dc, Pixmap pixmap, GC gc, RECT32 *visRectDst)
 {
-    short width  = visRectDst->right - visRectDst->left;
-    short height = visRectDst->bottom - visRectDst->top;
+    INT32 width  = visRectDst->right - visRectDst->left;
+    INT32 height = visRectDst->bottom - visRectDst->top;
 
     if (!COLOR_PixelToPalette || (dc->w.bitsPerPixel == 1) ||
 	(COLOR_GetSystemPaletteFlags() & COLOR_VIRTUAL) )
@@ -912,7 +912,7 @@
     }
     else
     {
-        register short x, y;
+        register INT32 x, y;
         XImage *image;
 
         if (dc->w.flags & DC_MEMORY)
@@ -942,10 +942,10 @@
  * Put an area back into the destination DC, mapping the pixel
  * colors to X pixels.
  */
-static void BITBLT_PutDstArea(DC *dc, Pixmap pixmap, GC gc, RECT16 *visRectDst)
+static void BITBLT_PutDstArea(DC *dc, Pixmap pixmap, GC gc, RECT32 *visRectDst)
 {
-    short width  = visRectDst->right - visRectDst->left;
-    short height = visRectDst->bottom - visRectDst->top;
+    INT32 width  = visRectDst->right - visRectDst->left;
+    INT32 height = visRectDst->bottom - visRectDst->top;
 
     /* !COLOR_PaletteToPixel is _NOT_ enough */
 
@@ -957,7 +957,7 @@
     }
     else
     {
-        register short x, y;
+        register INT32 x, y;
         XImage *image = XGetImage( display, pixmap, 0, 0, width, height,
                                    AllPlanes, ZPixmap );
         for (y = 0; y < height; y++)
@@ -979,13 +979,13 @@
  * Get the source and destination visible rectangles for StretchBlt().
  * Return FALSE if one of the rectangles is empty.
  */
-static BOOL BITBLT_GetVisRectangles( DC *dcDst, short xDst, short yDst,
-                                     short widthDst, short heightDst,
-                                     DC *dcSrc, short xSrc, short ySrc,
-                                     short widthSrc, short heightSrc,
-                                     RECT16 *visRectSrc, RECT16 *visRectDst )
+static BOOL32 BITBLT_GetVisRectangles( DC *dcDst, INT32 xDst, INT32 yDst,
+                                       INT32 widthDst, INT32 heightDst,
+                                       DC *dcSrc, INT32 xSrc, INT32 ySrc,
+                                       INT32 widthSrc, INT32 heightSrc,
+                                       RECT32 *visRectSrc, RECT32 *visRectDst )
 {
-    RECT16 tmpRect, clipRect;
+    RECT32 tmpRect, clipRect;
 
     if (widthSrc < 0)  { widthSrc = -widthSrc; xSrc -= widthSrc; }
     if (widthDst < 0)  { widthDst = -widthDst; xDst -= widthDst; }
@@ -994,28 +994,28 @@
 
       /* Get the destination visible rectangle */
 
-    SetRect16( &tmpRect, xDst, yDst, xDst + widthDst, yDst + heightDst );
-    GetRgnBox16( dcDst->w.hGCClipRgn, &clipRect );
-    OffsetRect16( &clipRect, dcDst->w.DCOrgX, dcDst->w.DCOrgY );
-    if (!IntersectRect16( visRectDst, &tmpRect, &clipRect )) return FALSE;
+    SetRect32( &tmpRect, xDst, yDst, xDst + widthDst, yDst + heightDst );
+    GetRgnBox32( dcDst->w.hGCClipRgn, &clipRect );
+    OffsetRect32( &clipRect, dcDst->w.DCOrgX, dcDst->w.DCOrgY );
+    if (!IntersectRect32( visRectDst, &tmpRect, &clipRect )) return FALSE;
 
       /* Get the source visible rectangle */
 
     if (!dcSrc) return TRUE;
-    SetRect16( &tmpRect, xSrc, ySrc, xSrc + widthSrc, ySrc + heightSrc );
+    SetRect32( &tmpRect, xSrc, ySrc, xSrc + widthSrc, ySrc + heightSrc );
     /* Apparently the clip region is only for output, so use hVisRgn here */
-    GetRgnBox16( dcSrc->w.hVisRgn, &clipRect );
-    OffsetRect16( &clipRect, dcSrc->w.DCOrgX, dcSrc->w.DCOrgY );
-    if (!IntersectRect16( visRectSrc, &tmpRect, &clipRect )) return FALSE;
+    GetRgnBox32( dcSrc->w.hVisRgn, &clipRect );
+    OffsetRect32( &clipRect, dcSrc->w.DCOrgX, dcSrc->w.DCOrgY );
+    if (!IntersectRect32( visRectSrc, &tmpRect, &clipRect )) return FALSE;
 
       /* Intersect the rectangles */
 
     if ((widthSrc == widthDst) && (heightSrc == heightDst)) /* no stretching */
     {
-        OffsetRect16( visRectSrc, xDst - xSrc, yDst - ySrc );
-        if (!IntersectRect16( &tmpRect, visRectSrc, visRectDst )) return FALSE;
+        OffsetRect32( visRectSrc, xDst - xSrc, yDst - ySrc );
+        if (!IntersectRect32( &tmpRect, visRectSrc, visRectDst )) return FALSE;
         *visRectSrc = *visRectDst = tmpRect;
-        OffsetRect16( visRectSrc, xSrc - xDst, ySrc - yDst );
+        OffsetRect32( visRectSrc, xSrc - xDst, ySrc - yDst );
     }
     else  /* stretching */
     {
@@ -1025,7 +1025,7 @@
                             ((visRectSrc->right-xSrc) * widthDst) / widthSrc;
         visRectSrc->bottom = yDst +
                          ((visRectSrc->bottom-ySrc) * heightDst) / heightSrc;
-        if (!IntersectRect16( &tmpRect, visRectSrc, visRectDst )) return FALSE;
+        if (!IntersectRect32( &tmpRect, visRectSrc, visRectDst )) return FALSE;
         *visRectSrc = *visRectDst = tmpRect;
         visRectSrc->left = xSrc + (visRectSrc->left-xDst)*widthSrc/widthDst;
         visRectSrc->top = ySrc + (visRectSrc->top-yDst)*heightSrc/heightDst;
@@ -1033,7 +1033,7 @@
                             ((visRectSrc->right-xDst) * widthSrc) / widthDst;
         visRectSrc->bottom = ySrc +
                          ((visRectSrc->bottom-yDst) * heightSrc) / heightDst;
-        if (IsRectEmpty16( visRectSrc )) return FALSE;
+        if (IsRectEmpty32( visRectSrc )) return FALSE;
     }
     return TRUE;
 }
@@ -1044,14 +1044,14 @@
  *
  * Implementation of PatBlt(), BitBlt() and StretchBlt().
  */
-BOOL BITBLT_InternalStretchBlt( DC *dcDst, short xDst, short yDst,
-                                short widthDst, short heightDst,
-                                DC *dcSrc, short xSrc, short ySrc,
-                                short widthSrc, short heightSrc, DWORD rop )
+BOOL32 BITBLT_InternalStretchBlt( DC *dcDst, INT32 xDst, INT32 yDst,
+                                  INT32 widthDst, INT32 heightDst,
+                                  DC *dcSrc, INT32 xSrc, INT32 ySrc,
+                                  INT32 widthSrc, INT32 heightSrc, DWORD rop )
 {
-    BOOL usePat, useSrc, useDst, destUsed, fStretch, fNullBrush;
-    RECT16 visRectDst, visRectSrc;
-    short width, height;
+    BOOL32 usePat, useSrc, useDst, destUsed, fStretch, fNullBrush;
+    RECT32 visRectDst, visRectSrc;
+    INT32 width, height;
     const BYTE *opcode;
     Pixmap pixmaps[3] = { 0, 0, 0 };  /* pixmaps for DST, SRC, TMP */
     GC tmpGC = 0;
@@ -1285,24 +1285,11 @@
 
 
 /***********************************************************************
- *           PatBlt    (GDI.29)
+ *           X11DRV_PatBlt
  */
-BOOL PatBlt( HDC16 hdc, short left, short top,
-	     short width, short height, DWORD rop)
+BOOL32 X11DRV_PatBlt( DC *dc, INT32 left, INT32 top,
+                      INT32 width, INT32 height, DWORD rop )
 {
-    DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC );
-    if (!dc) 
-    {
-	dc = (DC *)GDI_GetObjPtr(hdc, METAFILE_DC_MAGIC);
-	if (!dc) return FALSE;
-	MF_MetaParam6(dc, META_PATBLT, left, top, width, height,
-		      HIWORD(rop), LOWORD(rop));
-	return TRUE;
-    }
-
-    dprintf_bitblt(stddeb, "PatBlt: %04x %d,%d %dx%d %06lx\n",
-                   hdc, left, top, width, height, rop );
-
     return CallTo32_LargeStack( (int(*)())BITBLT_InternalStretchBlt, 11,
                                  dc, left, top, width, height,
                                  NULL, 0, 0, 0, 0, rop );
@@ -1310,27 +1297,12 @@
 
 
 /***********************************************************************
- *           BitBlt    (GDI.34)
+ *           X11DRV_BitBlt
  */
-BOOL BitBlt( HDC16 hdcDst, INT xDst, INT yDst, INT width, INT height,
-	     HDC16 hdcSrc, INT xSrc, INT ySrc, DWORD rop )
+BOOL32 X11DRV_BitBlt( DC *dcDst, INT32 xDst, INT32 yDst,
+                      INT32 width, INT32 height, DC *dcSrc,
+                      INT32 xSrc, INT32 ySrc, DWORD rop )
 {
-    DC *dcDst, *dcSrc;
-
-    if (!(dcDst = (DC *)GDI_GetObjPtr( hdcDst, DC_MAGIC )))
-    {
-        dcDst = (DC *)GDI_GetObjPtr( hdcDst, METAFILE_DC_MAGIC );
-        if (!dcDst) return FALSE;
-        return MF_BitBlt( dcDst, xDst, yDst, width, height,
-                          hdcSrc, xSrc, ySrc, rop );
-    }
-    dcSrc = (DC *) GDI_GetObjPtr( hdcSrc, DC_MAGIC );
-
-    dprintf_bitblt(stddeb,
-                "BitBlt: hdcSrc=%04x %d,%d %d bpp -> hdcDest=%04x %d,%d %dx%dx%d rop=%06lx\n",
-                hdcSrc, xSrc, ySrc, dcSrc ? dcSrc->w.bitsPerPixel : 0,
-                hdcDst, xDst, yDst, width, height, dcDst->w.bitsPerPixel, rop);
-
     return CallTo32_LargeStack( (int(*)())BITBLT_InternalStretchBlt, 11,
                                 dcDst, xDst, yDst, width, height,
                                 dcSrc, xSrc, ySrc, width, height, rop );
@@ -1338,39 +1310,14 @@
 
 
 /***********************************************************************
- *           StretchBlt    (GDI.35)
+ *           X11DRV_StretchBlt
  */
-BOOL StretchBlt( HDC16 hdcDst, short xDst, short yDst,
-                 short widthDst, short heightDst,
-                 HDC16 hdcSrc, short xSrc, short ySrc,
-                 short widthSrc, short heightSrc, DWORD rop )
+BOOL32 X11DRV_StretchBlt( DC *dcDst, INT32 xDst, INT32 yDst,
+                          INT32 widthDst, INT32 heightDst,
+                          DC *dcSrc, INT32 xSrc, INT32 ySrc,
+                          INT32 widthSrc, INT32 heightSrc, DWORD rop )
 {
-    DC *dcDst, *dcSrc;
-
-    if (!(dcDst = (DC *) GDI_GetObjPtr( hdcDst, DC_MAGIC )))
-    {
-	if (!(dcDst = (DC *)GDI_GetObjPtr( hdcDst, METAFILE_DC_MAGIC )))
-            return FALSE;
-        return MF_StretchBlt( dcDst, xDst, yDst, widthDst, heightDst,
-                              hdcSrc, xSrc, ySrc, widthSrc, heightSrc, rop );
-    }
-
-    dcSrc = (DC *) GDI_GetObjPtr( hdcSrc, DC_MAGIC );
-    dprintf_bitblt(stddeb,
-          "StretchBlt: %04x %d,%d %dx%dx%d -> %04x %d,%d %dx%dx%d rop=%06lx\n",
-                   hdcSrc, xSrc, ySrc, widthSrc, heightSrc,
-                   dcSrc ? dcSrc->w.bitsPerPixel : 0, hdcDst, xDst, yDst,
-                   widthDst, heightDst, dcDst->w.bitsPerPixel, rop );
-
     return CallTo32_LargeStack( (int(*)())BITBLT_InternalStretchBlt, 11,
                                 dcDst, xDst, yDst, widthDst, heightDst,
                                 dcSrc, xSrc, ySrc, widthSrc, heightSrc, rop );
 }
-/***********************************************************************
- *           FastWindowFrame    (GDI.400)
- */
-WORD
-FastWindowFrame(WORD x1,DWORD x2,WORD x3,WORD x4,DWORD x5) {
-	dprintf_gdi(stdnimp,"FastWindowFrame (%04x, %08lx, %04x, %04x, %08lx) // unimplemented!\n",x1,x2,x3,x4,x5);
-	return 0xFFFF; /* failed? */
-}
diff --git a/graphics/x11drv/init.c b/graphics/x11drv/init.c
index 5d43e8d..4841c2b 100644
--- a/graphics/x11drv/init.c
+++ b/graphics/x11drv/init.c
@@ -17,7 +17,7 @@
 static const DC_FUNCTIONS X11DRV_Funcs =
 {
     NULL,                            /* pArc */
-    NULL,                            /* pBitBlt */
+    X11DRV_BitBlt,                   /* pBitBlt */
     NULL,                            /* pChord */
     X11DRV_CreateDC,                 /* pCreateDC */
     X11DRV_DeleteDC,                 /* pDeleteDC */
@@ -42,7 +42,7 @@
     NULL,                            /* pOffsetViewportOrgEx */
     NULL,                            /* pOffsetWindowOrgEx */
     NULL,                            /* pPaintRgn */
-    NULL,                            /* pPatBlt */
+    X11DRV_PatBlt,                   /* pPatBlt */
     NULL,                            /* pPie */
     NULL,                            /* pPolyPolygon */
     NULL,                            /* pPolygon */
@@ -76,7 +76,7 @@
     NULL,                            /* pSetViewportOrgEx */
     NULL,                            /* pSetWindowExtEx */
     NULL,                            /* pSetWindowOrgEx */
-    NULL,                            /* pStretchBlt */
+    X11DRV_StretchBlt,               /* pStretchBlt */
     NULL,                            /* pStretchDIBits */
     NULL                             /* pTextOut */
 };
diff --git a/if1632/Makefile.in b/if1632/Makefile.in
index 62c579b..9efa8c9 100644
--- a/if1632/Makefile.in
+++ b/if1632/Makefile.in
@@ -45,6 +45,7 @@
 	version.spec \
 	w32sys.spec \
 	win87em.spec \
+	wing.spec \
 	winmm.spec \
 	winsock.spec \
 	winspool.spec \
diff --git a/if1632/crtdll.spec b/if1632/crtdll.spec
index bd07234..6e15693 100644
--- a/if1632/crtdll.spec
+++ b/if1632/crtdll.spec
@@ -287,7 +287,7 @@
 282 cdecl _strcmpi(ptr ptr) lstrcmpi32A
 283 stub _strdate
 284 stub _strdec
-285 stub _strdup
+285 cdecl _strdup(ptr) CRTDLL__strdup
 286 stub _strerror
 287 cdecl _stricmp(ptr ptr) lstrcmpi32A
 288 stub _stricoll
@@ -364,7 +364,7 @@
 359 cdecl exit(long) CRTDLL_exit
 360 cdecl exp(long) CRTDLL_exp
 361 cdecl fabs(long) CRTDLL_fabs
-362 stub fclose
+362 cdecl fclose(ptr) CRTDLL_fclose
 363 stub feof
 364 stub ferror
 365 cdecl fflush(ptr) CRTDLL_fflush
@@ -433,11 +433,11 @@
 428 stub mblen
 429 stub mbstowcs
 430 stub mbtowc
-431 stub memchr
-432 stub memcmp
-433 stub memcpy
-434 stub memmove
-435 stub memset
+431 cdecl memchr(ptr long long) memchr
+432 cdecl memcmp(ptr ptr long) memcmp
+433 cdecl memcpy(ptr ptr long) memcpy
+434 cdecl memmove(ptr ptr long) memmove
+435 cdecl memset(ptr long long) memset 
 436 stub mktime
 437 stub modf
 438 stub perror
@@ -460,16 +460,16 @@
 455 stub signal
 456 cdecl sin(long) CRTDLL_sin
 457 cdecl sinh(long) CRTDLL_sinh
-458 stub sprintf
+458 cdecl sprintf() CRTDLL_sprintf
 459 cdecl sqrt(long) CRTDLL_sqrt
 460 cdecl srand(long) CRTDLL_srand
 461 stub sscanf
 462 cdecl strcat(ptr ptr) lstrcat32A
-463 stub strchr
+463 cdecl strchr(ptr long) strchr
 464 cdecl strcmp(ptr ptr) lstrcmp32A
 465 stub strcoll
 466 cdecl strcpy(ptr ptr) lstrcpy32A
-467 stub strcspn
+467 cdecl strcspn(ptr ptr) strcspn
 468 stub strerror
 469 stub strftime
 470 cdecl strlen(ptr) lstrlen32A
@@ -478,11 +478,11 @@
 473 cdecl strncpy(ptr ptr long) lstrcpyn32A
 474 stub strpbrk
 475 stub strrchr
-476 stub strspn
-477 stub strstr
+476 cdecl strspn(ptr ptr) strspn
+477 cdecl strstr(ptr ptr) strstr
 478 stub strtod
-479 stub strtok
-480 stub strtol
+479 cdecl strtok(ptr ptr) strtok
+480 cdecl strtol(ptr ptr long) strtol
 481 cdecl strtoul(ptr ptr long) strtoul
 482 stub strxfrm
 483 stub swprintf
diff --git a/if1632/gdi.spec b/if1632/gdi.spec
index 2f0433c..4a8e1b5 100644
--- a/if1632/gdi.spec
+++ b/if1632/gdi.spec
@@ -33,15 +33,15 @@
 27  pascal16 Rectangle(word s_word s_word s_word s_word) Rectangle16
 28  pascal16 RoundRect(word s_word s_word s_word s_word s_word s_word)
              RoundRect16
-29  pascal16 PatBlt(word s_word s_word s_word s_word long) PatBlt
+29  pascal16 PatBlt(word s_word s_word s_word s_word long) PatBlt16
 30  pascal16 SaveDC(word) SaveDC
 31  pascal   SetPixel(word s_word s_word long) SetPixel16
 32  pascal16 OffsetClipRgn(word s_word s_word) OffsetClipRgn16
 33  pascal16 TextOut(word s_word s_word ptr word) TextOut16
 34  pascal16 BitBlt( word s_word s_word s_word s_word word s_word s_word long)
-             BitBlt
+             BitBlt16
 35  pascal16 StretchBlt(word s_word s_word s_word s_word word s_word s_word
-                        s_word s_word long) StretchBlt
+                        s_word s_word long) StretchBlt16
 36  pascal16 Polygon (word ptr word) Polygon16
 37  pascal16 Polyline (word ptr word) Polyline16
 38  pascal Escape(word word word segptr segptr) Escape
@@ -262,7 +262,7 @@
 380 stub ENDPAGE
 381 stub SETABORTPROC
 382 stub ABORTDOC
-400 pascal16 FastWindowFrame(word long word word long) FastWindowFrame
+400 pascal16 FastWindowFrame(word ptr s_word s_word long) FastWindowFrame
 401 stub GDIMOVEBITMAP
 403 stub GDIINIT2
 404 stub GetTTGlyphIndexMap
diff --git a/if1632/gdi32.spec b/if1632/gdi32.spec
index aad949c..6c6853e 100644
--- a/if1632/gdi32.spec
+++ b/if1632/gdi32.spec
@@ -12,7 +12,7 @@
 0007 stdcall Arc(long long long long long long long long long) Arc32
 0008 stub ArcTo
 0009 stub BeginPath
-0010 stdcall BitBlt(long long long long long long long long long) BitBlt
+0010 stdcall BitBlt(long long long long long long long long long) BitBlt32
 0011 stub CancelDC
 0012 stub CheckColorsInGamut
 0013 stub ChoosePixelFormat
@@ -85,10 +85,10 @@
 0077 stub EndPage
 0078 stub EndPath
 0079 stub EnumEnhMetaFile
-0080 stub EnumFontFamiliesA
+0080 stdcall EnumFontFamiliesA(long ptr ptr long) THUNK_EnumFontFamilies32A
 0081 stub EnumFontFamiliesExA
 0082 stub EnumFontFamiliesExW
-0083 stub EnumFontFamiliesW
+0083 stdcall EnumFontFamiliesW(long ptr ptr long) THUNK_EnumFontFamilies32W
 0084 stub EnumFontsA
 0085 stub EnumFontsW
 0086 stub EnumICMProfilesA
@@ -265,7 +265,7 @@
 0257 stdcall OffsetViewportOrgEx(long long long ptr) OffsetViewportOrgEx32
 0258 stdcall OffsetWindowOrgEx(long long long ptr) OffsetWindowOrgEx32
 0259 stdcall PaintRgn(long long) PaintRgn32
-0260 stdcall PatBlt(long long long long long long) PatBlt
+0260 stdcall PatBlt(long long long long long long) PatBlt32
 0261 stub PathToRegion
 0262 stdcall Pie(long long long long long long long long long) Pie32
 0263 stub PlayEnhMetaFile
@@ -356,7 +356,8 @@
 0347 stub StartDocA
 0348 stub StartDocW
 0349 stub StartPage
-0350 stdcall StretchBlt(long long long long long long long long long long long) StretchBlt
+0350 stdcall StretchBlt(long long long long long long long long long long long)
+             StretchBlt32
 0351 stdcall StretchDIBits(long long long long long long long
                                long long long long long long) StretchDIBits
 0352 stub StrokeAndFillPath
diff --git a/if1632/kernel32.spec b/if1632/kernel32.spec
index ca3fc9b..ecf6020 100644
--- a/if1632/kernel32.spec
+++ b/if1632/kernel32.spec
@@ -78,7 +78,7 @@
 0073 stub DeviceIoControl
 0074 stub DisableThreadLibraryCalls
 0075 stub DisconnectNamedPipe
-0076 stub DosDateTimeToFileTime
+0076 stdcall DosDateTimeToFileTime(long long ptr) DosDateTimeToFileTime
 0077 stub DuplicateConsoleHandle
 0078 	stdcall DuplicateHandle(long long long ptr long long long) DuplicateHandle
 0079 stub EndUpdateResourceA
@@ -94,8 +94,8 @@
 0089 stub EnumResourceNamesW
 0090 stub EnumResourceTypesA
 0091 stub EnumResourceTypesW
-0092 stub EnumSystemCodePagesA
-0093 stub EnumSystemCodePagesW
+0092 stdcall EnumSystemCodePagesA(ptr long) THUNK_EnumSystemCodePages32A
+0093 stdcall EnumSystemCodePagesW(ptr long) THUNK_EnumSystemCodePages32W
 0094 stub EnumSystemLocalesA
 0095 stub EnumSystemLocalesW
 0096 stub EnumTimeFormatsA
@@ -113,9 +113,9 @@
 0108 stub FatalAppExitA
 0109 stub FatalAppExitW
 0110 stub FatalExit
-0111 stub FileTimeToDosDateTime
-0112 stub FileTimeToLocalFileTime
-0113 stub FileTimeToSystemTime
+0111 stdcall FileTimeToDosDateTime(ptr ptr ptr) FileTimeToDosDateTime
+0112 stdcall FileTimeToLocalFileTime(ptr ptr) FileTimeToLocalFileTime
+0113 stdcall FileTimeToSystemTime(ptr ptr) FileTimeToSystemTime
 0114 stub FillConsoleOutputAttribute
 0115 stub FillConsoleOutputCharacterA
 0116 stub FillConsoleOutputCharacterW
@@ -222,22 +222,22 @@
 0217 stdcall GetFileAttributesA(ptr) GetFileAttributes32A
 0218 stdcall GetFileAttributesW(ptr) GetFileAttributes32W
 0219 stdcall GetFileInformationByHandle(long ptr) GetFileInformationByHandle
-0220 stub GetFileSize
-0221 stub GetFileTime
-0222    stdcall GetFileType(long) GetFileType
+0220 stdcall GetFileSize(long ptr ptr) GetFileSize
+0221 stdcall GetFileTime(long ptr ptr ptr) GetFileTime
+0222 stdcall GetFileType(long) GetFileType
 0223 stdcall GetFullPathNameA(ptr long ptr ptr) GetFullPathName32A
 0224 stub GetFullPathNameW
 0225 stub GetHandleInformation
 0226 stdcall GetLargestConsoleWindowSize(long) GetLargestConsoleWindowSize
-0227    stdcall GetLastError() GetLastError
-0228    stdcall GetLocalTime(ptr) GetLocalTime
+0227 stdcall GetLastError() GetLastError
+0228 stdcall GetLocalTime(ptr) GetLocalTime
 0229 stdcall GetLocaleInfoA(long long ptr long) GetLocaleInfoA
 0230 stdcall GetLocaleInfoW(long long ptr long) GetLocaleInfo32W
 0231 stdcall GetLogicalDriveStringsA(long ptr) GetLogicalDriveStrings32A
 0232 stdcall GetLogicalDriveStringsW(long ptr) GetLogicalDriveStrings32W
 0233 stdcall GetLogicalDrives() GetLogicalDrives
 0234 stub GetMailslotInfo
-0235	stdcall GetModuleFileNameA(long ptr long) GetModuleFileNameA
+0235 stdcall GetModuleFileNameA(long ptr long) GetModuleFileName
 0236 stub GetModuleFileNameW
 0237	stdcall GetModuleHandleA(ptr)	WIN32_GetModuleHandle
 0238 stub GetModuleHandleW
@@ -286,7 +286,7 @@
 0281 stdcall GetSystemDefaultLangID() GetSystemDefaultLangID
 0282 stdcall GetSystemDirectoryA(ptr long) GetSystemDirectory32A
 0283 stdcall GetSystemDirectoryW(ptr long) GetSystemDirectory32W
-0284 stub GetSystemInfo
+0284 stdcall GetSystemInfo(ptr) GetSystemInfo
 0285 	stdcall GetSystemTime(ptr) GetSystemTime
 0286 stub GetSystemTimeAdjustment
 0287 stub GetTapeParameters
@@ -375,7 +375,7 @@
 0370 stdcall LoadResource(long long) LoadResource32
 0371 stdcall LocalAlloc(long long) LocalAlloc32
 0372 stdcall LocalCompact(long) LocalCompact32
-0373 stub LocalFileTimeToFileTime
+0373 stdcall LocalFileTimeToFileTime(ptr ptr) LocalFileTimeToFileTime
 0374 stdcall LocalFlags(long) LocalFlags32
 0375 stdcall LocalFree(long) LocalFree32
 0376 stdcall LocalHandle(ptr) LocalHandle32
@@ -387,7 +387,7 @@
 0382 stub LockFile
 0383 stub LockFileEx
 0384 stdcall LockResource(long) LockResource32
-0385 stub MapViewOfFile
+0385 stdcall MapViewOfFile(long long long long long) MapViewOfFile
 0386 stdcall MapViewOfFileEx(long long long long long long) MapViewOfFileEx
 0387 stdcall MoveFileA(ptr ptr) MoveFile32A
 0388 stub MoveFileExA
@@ -494,8 +494,8 @@
 0489 stub SetFileApisToOEM
 0490 stdcall SetFileAttributesA(ptr long) SetFileAttributes32A
 0491 stdcall SetFileAttributesW(ptr long) SetFileAttributes32W
-0492    stdcall SetFilePointer(long long ptr long) SetFilePointer
-0493 stub SetFileTime
+0492 stdcall SetFilePointer(long long ptr long) SetFilePointer
+0493 stdcall SetFileTime(long ptr ptr ptr) SetFileTime
 0494 stdcall SetHandleCount(long) SetHandleCount32
 0495 stub SetHandleInformation
 0496 stub SetLastConsoleEventActive
@@ -528,7 +528,7 @@
 0523 	stdcall Sleep(long) Sleep
 0524 stub SleepEx
 0525 stub SuspendThread
-0526 stub SystemTimeToFileTime
+0526 stdcall SystemTimeToFileTime(ptr ptr) SystemTimeToFileTime
 0527 stub SystemTimeToTzSpecificLocalTime
 0528 stub TerminateProcess
 0529 stub TerminateThread
@@ -568,7 +568,7 @@
 0563 stub WaitNamedPipeA
 0564 stub WaitNamedPipeW
 0565 stdcall WideCharToMultiByte(long long ptr long ptr long ptr ptr)	WideCharToMultiByte
-0566 stub WinExec
+0566 stdcall WinExec(ptr long) WinExec
 0567 stub WriteConsoleA
 0568 stub WriteConsoleInputA
 0569 stub WriteConsoleInputVDMA
@@ -636,7 +636,7 @@
 0630    stdcall SetSystemPowerState(long long) SetSystemPowerState
 0631 stub WritePrivateProfileStructA
 0632 stub WritePrivateProfileStructW
-0633 stub MakeCriticalSectionGlobal
+0633 stdcall MakeCriticalSectionGlobal(ptr) MakeCriticalSectionGlobal
 #extra late additions
 0634 stdcall ThunkConnect32(ptr ptr ptr ptr ptr ptr) ThunkConnect32
 0636 stub SUnMapLS
diff --git a/if1632/ole32.spec b/if1632/ole32.spec
index cf93117..d6ff57b 100644
--- a/if1632/ole32.spec
+++ b/if1632/ole32.spec
@@ -109,7 +109,7 @@
 104 stub OleGetClipboard
 105 stub OleGetIconOfClass
 106 stub OleGetIconOfFile
-107 stub OleInitialize
+107 return OleInitialize 4 0
 108 stub OleInitializeWOW
 109 stub OleIsCurrentClipboard
 110 stub OleIsRunning
diff --git a/if1632/thunk.c b/if1632/thunk.c
index 8441542..348606f 100644
--- a/if1632/thunk.c
+++ b/if1632/thunk.c
@@ -139,7 +139,29 @@
                                 FONTENUMPROC16 func, LPARAM lParam )
 {
     DECL_THUNK( thunk, func, CallTo16_word_llwl );
-    return EnumFontFamilies( hdc, lpszFamily, (FONTENUMPROC16)&thunk, lParam );
+    return EnumFontFamilies16(hdc, lpszFamily, (FONTENUMPROC16)&thunk, lParam);
+}
+
+
+/*************************************************************************
+ *           THUNK_EnumFontFamilies32A   (GDI32.80)
+ */
+INT32 THUNK_EnumFontFamilies32A( HDC32 hdc, LPCSTR lpszFamily,
+                                 FONTENUMPROC32A func, LPARAM lParam )
+{
+    DECL_THUNK( thunk, func, CallTo32_4 );
+    return EnumFontFamilies32A(hdc,lpszFamily,(FONTENUMPROC32A)&thunk,lParam);
+}
+
+
+/*************************************************************************
+ *           THUNK_EnumFontFamilies32W   (GDI32.83)
+ */
+INT32 THUNK_EnumFontFamilies32W( HDC32 hdc, LPCWSTR lpszFamily,
+                                 FONTENUMPROC32W func, LPARAM lParam )
+{
+    DECL_THUNK( thunk, func, CallTo32_4 );
+    return EnumFontFamilies32W(hdc,lpszFamily,(FONTENUMPROC32W)&thunk,lParam);
 }
 
 
@@ -280,6 +302,26 @@
 
 
 /***********************************************************************
+ *           THUNK_EnumSystemCodePages32A	(KERNEL32.92)
+ */
+BOOL32 THUNK_EnumSystemCodePages32A( CODEPAGE_ENUMPROC32A func, DWORD flags )
+{
+    DECL_THUNK( thunk, func, CallTo32_1 );
+    return EnumSystemCodePages32A( (CODEPAGE_ENUMPROC32A)&thunk, flags );
+}
+
+
+/***********************************************************************
+ *           THUNK_EnumSystemCodePages32W	(KERNEL32.93)
+ */
+BOOL32 THUNK_EnumSystemCodePages32W( CODEPAGE_ENUMPROC32W func, DWORD flags )
+{
+    DECL_THUNK( thunk, func, CallTo32_1 );
+    return EnumSystemCodePages32W( (CODEPAGE_ENUMPROC32W)&thunk, flags );
+}
+
+
+/***********************************************************************
  *           THUNK_GrayString16   (USER.185)
  */
 BOOL16 THUNK_GrayString16( HDC16 hdc, HBRUSH16 hbr, GRAYSTRINGPROC16 func,
diff --git a/if1632/user.spec b/if1632/user.spec
index 77c3c62..2ca9abf 100644
--- a/if1632/user.spec
+++ b/if1632/user.spec
@@ -61,7 +61,7 @@
 58  pascal16 GetClassName(word ptr word) GetClassName16
 59  pascal16 SetActiveWindow(word) SetActiveWindow
 60  pascal16 GetActiveWindow() GetActiveWindow
-61  pascal16 ScrollWindow(word s_word s_word ptr ptr) ScrollWindow
+61  pascal16 ScrollWindow(word s_word s_word ptr ptr) ScrollWindow16
 62  pascal16 SetScrollPos(word word s_word word) SetScrollPos16
 63  pascal16 GetScrollPos(word word) GetScrollPos16
 64  pascal16 SetScrollRange(word word s_word s_word word) SetScrollRange16
@@ -221,7 +221,7 @@
 218 pascal16 DialogBoxIndirect(word word word segptr) DialogBoxIndirect16
 219 pascal16 CreateDialogIndirect(word ptr word segptr) CreateDialogIndirect16
 220 pascal16 LoadMenuIndirect(ptr) LoadMenuIndirect16
-221 pascal16 ScrollDC(word s_word s_word ptr ptr word ptr) ScrollDC
+221 pascal16 ScrollDC(word s_word s_word ptr ptr word ptr) ScrollDC16
 222 pascal16 GetKeyboardState(ptr) GetKeyboardState
 223 pascal16 SetKeyboardState(ptr) SetKeyboardState
 224 pascal16 GetWindowTask(word) GetWindowTask16
@@ -305,8 +305,7 @@
 308 pascal   DefDlgProc(word word word long) DefDlgProc16
 309 pascal16 GetClipCursor(ptr) GetClipCursor16
 314 stub SignalProc
-319 pascal16 ScrollWindowEx(word s_word s_word ptr ptr word ptr word)
-             ScrollWindowEx
+319 pascal16 ScrollWindowEx(word s_word s_word ptr ptr word ptr word) ScrollWindowEx16
 320 stub SysErrorBox
 321 stub SetEventHook
 322 stub WinOldAppHackOMatic
@@ -374,8 +373,8 @@
 418 pascal16 SetMenuItemBitmaps(word word word word word) SetMenuItemBitmaps
 420 pascal16 wsprintf() WIN16_wsprintf16
 421 pascal16 wvsprintf(ptr ptr ptr) wvsprintf16
-422 stub DlgDirSelectEx
-423 stub DlgDirSelectComboBoxEx
+422 pascal16 DlgDirSelectEx(word ptr word word) DlgDirSelectEx16
+423 pascal16 DlgDirSelectComboBoxEx(word ptr word word) DlgDirSelectComboBoxEx16
 427 pascal16 FindWindowEx(word word segptr ptr) FindWindowEx16
 428 stub TileWindows
 429 stub CascadeWindows
diff --git a/if1632/user32.spec b/if1632/user32.spec
index 0c12313..7a484ba 100644
--- a/if1632/user32.spec
+++ b/if1632/user32.spec
@@ -150,10 +150,10 @@
 0143 stdcall DlgDirListComboBoxA(long ptr long long long) DlgDirListComboBox32A
 0144 stdcall DlgDirListComboBoxW(long ptr long long long) DlgDirListComboBox32W
 0145 stub DlgDirListW
-0146 stub DlgDirSelectComboBoxExA
-0147 stub DlgDirSelectComboBoxExW
-0148 stub DlgDirSelectExA
-0149 stub DlgDirSelectExW
+0146 stdcall DlgDirSelectComboBoxExA(long ptr long long) DlgDirSelectComboBoxEx32A
+0147 stdcall DlgDirSelectComboBoxExW(long ptr long long) DlgDirSelectComboBoxEx32W
+0148 stdcall DlgDirSelectExA(long ptr long long) DlgDirSelectEx32A
+0149 stdcall DlgDirSelectExW(long ptr long long) DlgDirSelectEx32W
 0150 stub DragDetect
 0151 stub DragObject
 0152 stub DrawAnimatedRects
@@ -162,7 +162,7 @@
 0155 stdcall DrawFocusRect(long ptr) DrawFocusRect32
 0156 stub DrawFrame
 0157 stdcall DrawFrameControl(long ptr long long) DrawFrameControl32
-0158 stub DrawIcon
+0158 stdcall DrawIcon(long long long long) DrawIcon
 0159 stub DrawIconEx
 0160 stdcall DrawMenuBar(long) DrawMenuBar
 0161 stub DrawStateA
@@ -230,7 +230,7 @@
 0223 stub GetClipboardFormatNameW
 0224 stub GetClipboardOwner
 0225 stdcall GetClipboardViewer(long) GetClipboardViewer
-0226 stub GetCursor
+0226 stdcall GetCursor() GetCursor
 0227 stub GetCursorInfo
 0228 stdcall GetCursorPos(ptr) GetCursorPos32
 0229 stdcall GetDC(long) GetDC32
@@ -296,7 +296,7 @@
 0289 stdcall GetSysColorBrush(long) GetSysColorBrush32
 0290 stdcall GetSystemMenu(long long) GetSystemMenu
 0291 stdcall GetSystemMetrics(long) GetSystemMetrics
-0292 stub GetTabbedTextExtentA
+0292 stdcall GetTabbedTextExtentA(long ptr long long ptr) GetTabbedTextExtent
 0293 stub GetTabbedTextExtentW
 0294 stub GetThreadDesktop
 0295 stub GetTopWindow
@@ -452,9 +452,9 @@
 0445 stub ReuseDDElParam
 0446 stdcall ScreenToClient(long ptr) ScreenToClient32
 0447 stub ScrollChildren
-0448 stub ScrollDC
-0449 stub ScrollWindow
-0450 stub ScrollWindowEx
+0448 stdcall ScrollDC(long long long ptr ptr long ptr) ScrollDC32
+0449 stdcall ScrollWindow(long long long ptr ptr) ScrollWindow32
+0450 stdcall ScrollWindowEx(long long long ptr ptr long ptr long) ScrollWindowEx32
 0451 stdcall SendDlgItemMessageA(long long long long long) SendDlgItemMessage32A
 0452 stdcall SendDlgItemMessageW(long long long long long) SendDlgItemMessage32W
 0453 stdcall SendMessageA(long long long long) SendMessage32A
@@ -485,7 +485,7 @@
 0478 stdcall SetDlgItemTextW(long long ptr) SetDlgItemText32W
 0479 stub SetDoubleClickTime
 0480 stdcall SetFocus(long) SetFocus32
-0481 stub SetForegroundWindow
+0481 return SetForegroundWindow 4 0
 0482 stdcall SetInternalWindowPos(long long ptr ptr) SetInternalWindowPos32
 0483 stub SetKeyboardState
 0484 stdcall SetLastErrorEx(long long) SetLastErrorEx
diff --git a/if1632/wing.spec b/if1632/wing.spec
new file mode 100644
index 0000000..ec1ab43
--- /dev/null
+++ b/if1632/wing.spec
@@ -0,0 +1,20 @@
+name    wing
+type    win16
+
+1001 stub WINGCREATEDC
+1002 stub WINGRECOMMENDDIBFORMAT
+1003 stub WINGCREATEBITMAP
+1004 stub WINGGETDIBPOINTER
+1005 stub WINGGETDIBCOLORTABLE
+1006 stub WINGSETDIBCOLORTABLE
+1007 stub WINGCREATEHALFTONEPALETTE
+1008 stub WINGCREATEHALFTONEBRUSH
+1009 stub WINGSTRETCHBLT
+1010 stub WINGBITBLT
+
+# Seem that 1299 is the limit... weird...
+#1500 stub WINGINITIALIZETHUNK16
+#1501 stub WINGTHUNK16
+
+#2000 stub REGISTERWINGPAL
+#2001 stub EXCEPTIONHANDLER
diff --git a/include/callback.h b/include/callback.h
index bf94586..2f603c2 100644
--- a/include/callback.h
+++ b/include/callback.h
@@ -73,6 +73,7 @@
 /* by the build program to generate the file if1632/callto32.S */
 
 extern LONG CallTo32_0( FARPROC32 );
+extern LONG CallTo32_1( FARPROC32, DWORD );
 extern LONG CallTo32_2( FARPROC32, DWORD, DWORD );
 extern LONG CallTo32_3( FARPROC32, DWORD, DWORD, DWORD );
 extern LONG CallTo32_4( FARPROC32, DWORD, DWORD, DWORD, DWORD );
diff --git a/include/dos_fs.h b/include/dos_fs.h
index 303cbbb..4bb2b7f 100644
--- a/include/dos_fs.h
+++ b/include/dos_fs.h
@@ -26,12 +26,15 @@
 #define IS_END_OF_NAME(ch)  (!(ch) || ((ch) == '/') || ((ch) == '\\'))
 
 extern void DOSFS_ToDosDateTime( time_t unixtime, WORD *pDate, WORD *pTime );
+extern time_t DOSFS_DosDateTimeToUnixTime(WORD,WORD);
 extern const char *DOSFS_ToDosFCBFormat( const char *name );
 extern const char *DOSFS_ToDosDTAFormat( const char *name );
 extern const char *DOSFS_IsDevice( const char *name );
 extern const char * DOSFS_GetUnixFileName( const char * name, int check_last );
 extern const char * DOSFS_GetDosTrueName( const char *name, int unix_format );
 extern int DOSFS_GetDosFileName( const char *name, char *buffer, int len );
+extern time_t DOSFS_FileTimeToUnixTime(LPFILETIME ft);
+extern void DOSFS_UnixTimeToFileTime(time_t unixtime,LPFILETIME ft);
 extern int DOSFS_FindNext( const char *path, const char *short_mask,
                            const char *long_mask, int drive, BYTE attr,
                            int skip, DOS_DIRENT *entry );
diff --git a/include/libres.h b/include/libres.h
index 288f5ec..6014a3b 100644
--- a/include/libres.h
+++ b/include/libres.h
@@ -11,7 +11,8 @@
 
 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 HRSRC32 LIBRES_FindResource16( HINSTANCE32 hModule, LPCSTR name, LPCSTR type );
+extern HRSRC32 LIBRES_FindResource32( HINSTANCE32 hModule, LPCWSTR name, LPCWSTR type );
 extern BOOL32 LIBRES_FreeResource( HGLOBAL32 handle );
 extern HGLOBAL32 LIBRES_LoadResource( HINSTANCE32 hModule, HRSRC32 hRsrc );
 extern LPVOID LIBRES_LockResource( HGLOBAL32 handle );
diff --git a/include/metafile.h b/include/metafile.h
index a6378dd..22e0b61 100644
--- a/include/metafile.h
+++ b/include/metafile.h
@@ -32,9 +32,9 @@
                    LPCSTR str, short count, const INT16 *lpDx);
 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);
+	       short height, DC *dcSrc, 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 heightDest, DC *dcSrc, short xSrc, short ySrc, 
 		   short widthSrc, short heightSrc, DWORD rop);
 
 #endif   /* METAFILE_H */
diff --git a/include/metafiledrv.h b/include/metafiledrv.h
index 519f3a5..14b2da5 100644
--- a/include/metafiledrv.h
+++ b/include/metafiledrv.h
@@ -13,10 +13,24 @@
 #define METAFILE_DISK   1
 
 /* Metafile driver physical DC */
+
 typedef struct
 {
     METAHEADER  *mh;           /* Pointer to metafile header */
     UINT32       nextHandle;   /* Next handle number */
 } METAFILEDRV_PDEVICE;
 
+
+/* Metafile driver functions */
+
+extern BOOL32 MFDRV_BitBlt( struct tagDC *dcDst, INT32 xDst, INT32 yDst,
+                            INT32 width, INT32 height, struct tagDC *dcSrc,
+                            INT32 xSrc, INT32 ySrc, DWORD rop );
+extern BOOL32 MFDRV_PatBlt( struct tagDC *dc, INT32 left, INT32 top,
+                            INT32 width, INT32 height, DWORD rop );
+extern BOOL32 MFDRV_StretchBlt( struct tagDC *dcDst, INT32 xDst, INT32 yDst,
+                                INT32 widthDst, INT32 heightDst,
+                                struct tagDC *dcSrc, INT32 xSrc, INT32 ySrc,
+                                INT32 widthSrc, INT32 heightSrc, DWORD rop );
+
 #endif  /* __WINE_METAFILEDRV_H */
diff --git a/include/region.h b/include/region.h
index eb44f4f..c5818f1 100644
--- a/include/region.h
+++ b/include/region.h
@@ -18,7 +18,7 @@
 
 
 extern BOOL32 REGION_DeleteObject( HRGN32 hrgn, RGNOBJ * obj );
-extern BOOL32 REGION_UnionRectWithRgn( HRGN32 hrgn, LPRECT16 lpRect );
+extern BOOL32 REGION_UnionRectWithRgn( HRGN32 hrgn, const RECT32 *lpRect );
 extern BOOL32 REGION_FrameRgn( HRGN32 dest, HRGN32 src, INT32 x, INT32 y );
 
 #endif  /* __WINE_REGION_H */
diff --git a/include/shell.h b/include/shell.h
index 801d857..4a7e0cd 100644
--- a/include/shell.h
+++ b/include/shell.h
@@ -32,7 +32,7 @@
 typedef struct { 	   /* structure for dropped files */ 
 	WORD		wSize;
 	POINT16		ptMousePos;   
-	BOOL		fInNonClientArea;
+	BOOL16		fInNonClientArea;
 	/* memory block with filenames follows */     
 } DROPFILESTRUCT, *LPDROPFILESTRUCT; 
 
diff --git a/include/windows.h b/include/windows.h
index 7359e0b..8e03f49 100644
--- a/include/windows.h
+++ b/include/windows.h
@@ -1521,11 +1521,15 @@
     BOOL32  bInheritHandle;
 } SECURITY_ATTRIBUTES, *LPSECURITY_ATTRIBUTES;
 
+/* 64 bit number of 100 nanoseconds intervals since January 1, 1601 */
+/* FIXME: currently dwLowDateTime is equivalent to the UNIX time(),
+ * and dwHighDateTime 0
+ */
 typedef struct
 {
   INT32  dwLowDateTime;
   INT32  dwHighDateTime;
-} FILETIME;
+} FILETIME, *LPFILETIME;
 
 /* Find* structures */
 typedef struct
@@ -2427,7 +2431,7 @@
 /* Window scrolling */
 #define SW_SCROLLCHILDREN      0x0001
 #define SW_INVALIDATE          0x0002
-#define SW_ERASE               0x0003
+#define SW_ERASE               0x0004
 
 /* CreateWindow() coordinates */
 #define CW_USEDEFAULT16 ((INT16)0x8000)
@@ -2766,31 +2770,108 @@
 #define CBS_DISABLENOSCROLL   0x0800L
 
 /* Combo box messages */
-#define CB_GETEDITSEL            (WM_USER+0)
-#define CB_LIMITTEXT             (WM_USER+1)
-#define CB_SETEDITSEL            (WM_USER+2)
-#define CB_ADDSTRING             (WM_USER+3)
-#define CB_DELETESTRING          (WM_USER+4)
-#define CB_DIR                   (WM_USER+5)
-#define CB_GETCOUNT              (WM_USER+6)
-#define CB_GETCURSEL             (WM_USER+7)
-#define CB_GETLBTEXT             (WM_USER+8)
-#define CB_GETLBTEXTLEN          (WM_USER+9)
-#define CB_INSERTSTRING          (WM_USER+10)
-#define CB_RESETCONTENT          (WM_USER+11)
-#define CB_FINDSTRING            (WM_USER+12)
-#define CB_SELECTSTRING          (WM_USER+13)
-#define CB_SETCURSEL             (WM_USER+14)
-#define CB_SHOWDROPDOWN          (WM_USER+15)
-#define CB_GETITEMDATA           (WM_USER+16)
-#define CB_SETITEMDATA           (WM_USER+17)
-#define CB_GETDROPPEDCONTROLRECT (WM_USER+18)
-#define CB_SETITEMHEIGHT         (WM_USER+19)
-#define CB_GETITEMHEIGHT         (WM_USER+20)
-#define CB_SETEXTENDEDUI         (WM_USER+21)
-#define CB_GETEXTENDEDUI         (WM_USER+22)
-#define CB_GETDROPPEDSTATE       (WM_USER+23)
-#define CB_FINDSTRINGEXACT       (WM_USER+24)
+#define CB_GETEDITSEL16            (WM_USER+0)
+#define CB_GETEDITSEL32            0x0140
+#define CB_GETEDITSEL              WINELIB_NAME(CB_GETEDITSEL)
+#define CB_LIMITTEXT16             (WM_USER+1)
+#define CB_LIMITTEXT32             0x0141
+#define CB_LIMITTEXT               WINELIB_NAME(CB_LIMITTEXT)
+#define CB_SETEDITSEL16            (WM_USER+2)
+#define CB_SETEDITSEL32            0x0142
+#define CB_SETEDITSEL              WINELIB_NAME(CB_SETEDITSEL)
+#define CB_ADDSTRING16             (WM_USER+3)
+#define CB_ADDSTRING32             0x0143
+#define CB_ADDSTRING               WINELIB_NAME(CB_ADDSTRING)
+#define CB_DELETESTRING16          (WM_USER+4)
+#define CB_DELETESTRING32          0x0144
+#define CB_DELETESTRING            WINELIB_NAME(CB_DELETESTRING)
+#define CB_DIR16                   (WM_USER+5)
+#define CB_DIR32                   0x0145
+#define CB_DIR                     WINELIB_NAME(CB_DIR)
+#define CB_GETCOUNT16              (WM_USER+6)
+#define CB_GETCOUNT32              0x0146
+#define CB_GETCOUNT                WINELIB_NAME(CB_GETCOUNT)
+#define CB_GETCURSEL16             (WM_USER+7)
+#define CB_GETCURSEL32             0x0147
+#define CB_GETCURSEL               WINELIB_NAME(CB_GETCURSEL)
+#define CB_GETLBTEXT16             (WM_USER+8)
+#define CB_GETLBTEXT32             0x0148
+#define CB_GETLBTEXT               WINELIB_NAME(CB_GETLBTEXT)
+#define CB_GETLBTEXTLEN16          (WM_USER+9)
+#define CB_GETLBTEXTLEN32          0x0149
+#define CB_GETLBTEXTLEN            WINELIB_NAME(CB_GETLBTEXTLEN)
+#define CB_INSERTSTRING16          (WM_USER+10)
+#define CB_INSERTSTRING32          0x014a
+#define CB_INSERTSTRING            WINELIB_NAME(CB_INSERTSTRING)
+#define CB_RESETCONTENT16          (WM_USER+11)
+#define CB_RESETCONTENT32          0x014b
+#define CB_RESETCONTENT            WINELIB_NAME(CB_RESETCONTENT)
+#define CB_FINDSTRING16            (WM_USER+12)
+#define CB_FINDSTRING32            0x014c
+#define CB_FINDSTRING              WINELIB_NAME(CB_FINDSTRING)
+#define CB_SELECTSTRING16          (WM_USER+13)
+#define CB_SELECTSTRING32          0x014d
+#define CB_SELECTSTRING            WINELIB_NAME(CB_SELECTSTRING)
+#define CB_SETCURSEL16             (WM_USER+14)
+#define CB_SETCURSEL32             0x014e
+#define CB_SETCURSEL               WINELIB_NAME(CB_SETCURSEL)
+#define CB_SHOWDROPDOWN16          (WM_USER+15)
+#define CB_SHOWDROPDOWN32          0x014f
+#define CB_SHOWDROPDOWN            WINELIB_NAME(CB_SHOWDROPDOWN)
+#define CB_GETITEMDATA16           (WM_USER+16)
+#define CB_GETITEMDATA32           0x0150
+#define CB_GETITEMDATA             WINELIB_NAME(CB_GETITEMDATA)
+#define CB_SETITEMDATA16           (WM_USER+17)
+#define CB_SETITEMDATA32           0x0151
+#define CB_SETITEMDATA             WINELIB_NAME(CB_SETITEMDATA)
+#define CB_GETDROPPEDCONTROLRECT16 (WM_USER+18)
+#define CB_GETDROPPEDCONTROLRECT32 0x0152
+#define CB_GETDROPPEDCONTROLRECT   WINELIB_NAME(CB_GETDROPPEDCONTROLRECT)
+#define CB_SETITEMHEIGHT16         (WM_USER+19)
+#define CB_SETITEMHEIGHT32         0x0153
+#define CB_SETITEMHEIGHT           WINELIB_NAME(CB_SETITEMHEIGHT)
+#define CB_GETITEMHEIGHT16         (WM_USER+20)
+#define CB_GETITEMHEIGHT32         0x0154
+#define CB_GETITEMHEIGHT           WINELIB_NAME(CB_GETITEMHEIGHT)
+#define CB_SETEXTENDEDUI16         (WM_USER+21)
+#define CB_SETEXTENDEDUI32         0x0155
+#define CB_SETEXTENDEDUI           WINELIB_NAME(CB_SETEXTENDEDUI)
+#define CB_GETEXTENDEDUI16         (WM_USER+22)
+#define CB_GETEXTENDEDUI32         0x0156
+#define CB_GETEXTENDEDUI           WINELIB_NAME(CB_GETEXTENDEDUI)
+#define CB_GETDROPPEDSTATE16       (WM_USER+23)
+#define CB_GETDROPPEDSTATE32       0x0157
+#define CB_GETDROPPEDSTATE         WINELIB_NAME(CB_GETDROPPEDSTATE)
+#define CB_FINDSTRINGEXACT16       (WM_USER+24)
+#define CB_FINDSTRINGEXACT32       0x0158
+#define CB_FINDSTRINGEXACT         WINELIB_NAME(CB_FINDSTRINGEXACT)
+#define CB_SETLOCALE16             WM_NULL  /* Not in Win16 */
+#define CB_SETLOCALE32             0x0159
+#define CB_SETLOCALE               WINELIB_NAME(CB_SETLOCALE)
+#define CB_GETLOCALE16             WM_NULL  /* Not in Win16 */
+#define CB_GETLOCALE32             0x015a
+#define CB_GETLOCALE               WINELIB_NAME(CB_GETLOCALE)
+#define CB_GETTOPINDEX16           WM_NULL  /* Not in Win16 */
+#define CB_GETTOPINDEX32           0x015b
+#define CB_GETTOPINDEX             WINELIB_NAME(CB_GETTOPINDEX)
+#define CB_SETTOPINDEX16           WM_NULL  /* Not in Win16 */
+#define CB_SETTOPINDEX32           0x015c
+#define CB_SETTOPINDEX             WINELIB_NAME(CB_SETTOPINDEX)
+#define CB_GETHORIZONTALEXTENT16   WM_NULL  /* Not in Win16 */
+#define CB_GETHORIZONTALEXTENT32   0x015d
+#define CB_GETHORIZONTALEXTENT     WINELIB_NAME(CB_GETHORIZONTALEXTENT)
+#define CB_SETHORIZONTALEXTENT16   WM_NULL  /* Not in Win16 */
+#define CB_SETHORIZONTALEXTENT32   0x015e
+#define CB_SETHORIZONTALEXTENT     WINELIB_NAME(CB_SETHORIZONTALEXTENT)
+#define CB_GETDROPPEDWIDTH16       WM_NULL  /* Not in Win16 */
+#define CB_GETDROPPEDWIDTH32       0x015f
+#define CB_GETDROPPEDWIDTH         WINELIB_NAME(CB_GETDROPPEDWIDTH)
+#define CB_SETDROPPEDWIDTH16       WM_NULL  /* Not in Win16 */
+#define CB_SETDROPPEDWIDTH32       0x0160
+#define CB_SETDROPPEDWIDTH         WINELIB_NAME(CB_SETDROPPEDWIDTH)
+#define CB_INITSTORAGE16           WM_NULL  /* Not in Win16 */
+#define CB_INITSTORAGE32           0x0161
+#define CB_INITSTORAGE             WINELIB_NAME(CB_INITSTORAGE)
 
 /* Combo box notification codes */
 #define CBN_ERRSPACE        (-1)
@@ -3624,6 +3705,19 @@
 typedef BOOL32 (*CODEPAGE_ENUMPROC32W)(LPWSTR);
 DECL_WINELIB_TYPE_AW(CODEPAGE_ENUMPROC);
 
+typedef struct tagSYSTEM_INFO
+{
+    DWORD   dwOemId;
+    DWORD   dwPageSize;
+    LPVOID  lpMinimumApplicationAddress;
+    LPVOID  lpMaximumApplicationAddress;
+    DWORD   dwActiveProcessorMask;
+    DWORD   dwNumberOfProcessors;
+    DWORD   dwProcessorType;
+    DWORD   dwAllocationGranularity;
+    DWORD   dwReserved;
+} SYSTEM_INFO, *LPSYSTEM_INFO;
+
 #pragma pack(4)
 
 /* Declarations for functions that exist only in Win16 */
@@ -3638,10 +3732,13 @@
 BOOL16     DCHook(HDC16,WORD,DWORD,LPARAM);
 VOID       DirectedYield(HTASK16);
 HGLOBAL16  DirectResAlloc(HINSTANCE16,WORD,UINT16);
+BOOL16     DlgDirSelect(HWND16,LPSTR,INT16);
+BOOL16     DlgDirSelectComboBox(HWND16,LPSTR,INT16);
 BOOL16     EnableHardwareInput(BOOL16);
 INT16      ExcludeVisRect(HDC16,INT16,INT16,INT16,INT16);
 HANDLE16   FarGetOwner(HGLOBAL16);
 VOID       FarSetOwner(HGLOBAL16,HANDLE16);
+BOOL16     FastWindowFrame(HDC16,const RECT16*,INT16,INT16,DWORD);
 VOID       FillWindow(HWND16,HWND16,HDC16,HBRUSH16);
 INT16      FlushComm(INT16,INT16);
 WORD       FreeSelector(WORD);
@@ -3731,11 +3828,18 @@
 HANDLE32   CreateFileMapping32A(HANDLE32,LPSECURITY_ATTRIBUTES,DWORD,DWORD,DWORD,LPCSTR);
 HANDLE32   CreateFileMapping32W(HANDLE32,LPSECURITY_ATTRIBUTES,DWORD,DWORD,DWORD,LPCWSTR);
 #define    CreateFileMapping WINELIB_NAME_AW(CreateFileMapping)
+BOOL32     DosDateTimeToFileTime(WORD,WORD,LPFILETIME);
 INT32      EnumPropsEx32A(HWND32,PROPENUMPROCEX32A,LPARAM);
 INT32      EnumPropsEx32W(HWND32,PROPENUMPROCEX32W,LPARAM);
 #define    EnumPropsEx WINELIB_NAME_AW(EnumPropsEx)
+BOOL32     EnumSystemCodePages32A(CODEPAGE_ENUMPROC32A,DWORD);
+BOOL32     EnumSystemCodePages32W(CODEPAGE_ENUMPROC32W,DWORD);
+#define    EnumSystemCodePages WINELIB_NAME_AW(EnumSystemCodePages)
 BOOL32     EnumThreadWindows(DWORD,WNDENUMPROC32,LPARAM);
 void       ExitProcess(DWORD);
+BOOL32     FileTimeToDosDateTime(LPFILETIME,LPWORD,LPWORD);
+BOOL32     FileTimeToLocalFileTime(LPFILETIME,LPFILETIME);
+BOOL32     FileTimeToSystemTime(LPFILETIME,LPSYSTEMTIME);
 HRSRC32    FindResourceEx32A(HINSTANCE32,LPCSTR,LPCSTR,WORD);
 HRSRC32    FindResourceEx32W(HINSTANCE32,LPCWSTR,LPCWSTR,WORD);
 #define    FindResourceEx WINELIB_NAME_AW(FindResourceEx)
@@ -3745,6 +3849,8 @@
 #define    GetCommandLine WINELIB_NAME_AW(GetCommandLine)
 BOOL32     GetCommTimeouts(INT32,LPCOMMTIMEOUTS);
 DWORD      GetFileInformationByHandle(HFILE,BY_HANDLE_FILE_INFORMATION*);
+DWORD      GetFileSize(HFILE,LPDWORD);
+DWORD      GetFileType(HFILE);
 VOID       GetLocalTime(LPSYSTEMTIME);
 DWORD      GetLogicalDrives(void);
 HANDLE32   GetProcessHeap(void);
@@ -3752,6 +3858,7 @@
 DWORD      GetShortPathName32W(LPCWSTR,LPWSTR,DWORD);
 #define    GetShortPathName WINELIB_NAME_AW(GetShortPathName)
 HFILE      GetStdHandle(DWORD);
+VOID       GetSystemInfo(LPSYSTEM_INFO);
 BOOL32     GetSystemPowerStatus(LPSYSTEM_POWER_STATUS);
 VOID       GetSystemTime(LPSYSTEMTIME);
 VOID       GlobalMemoryStatus(LPMEMORYSTATUS);
@@ -3766,6 +3873,7 @@
 BOOL32     HeapUnlock(HANDLE32);
 BOOL32     HeapValidate(HANDLE32,DWORD,LPVOID);
 BOOL32     IsWindowUnicode(HWND32);
+BOOL32     LocalFileTimeToFileTime(LPFILETIME,LPFILETIME);
 LPVOID     MapViewOfFileEx(HANDLE32,DWORD,DWORD,DWORD,DWORD,DWORD);
 BOOL32     MoveFile32A(LPCSTR,LPCSTR);
 BOOL32     MoveFile32W(LPCWSTR,LPCWSTR);
@@ -3777,16 +3885,16 @@
 DWORD      RegCreateKeyEx32W(HKEY,LPCWSTR,DWORD,LPWSTR,DWORD,REGSAM,
                              LPSECURITY_ATTRIBUTES,LPHKEY,LPDWORD);
 #define    RegCreateKeyEx WINELIB_NAME_AW(RegCreateKeyEx)
-DWORD      RegEnumKeyEx32A(HKEY,DWORD,LPSTR,LPDWORD,LPDWORD,LPSTR,LPDWORD,FILETIME*);
-DWORD      RegEnumKeyEx32W(HKEY,DWORD,LPWSTR,LPDWORD,LPDWORD,LPWSTR,LPDWORD,FILETIME*);
+DWORD      RegEnumKeyEx32A(HKEY,DWORD,LPSTR,LPDWORD,LPDWORD,LPSTR,LPDWORD,LPFILETIME);
+DWORD      RegEnumKeyEx32W(HKEY,DWORD,LPWSTR,LPDWORD,LPDWORD,LPWSTR,LPDWORD,LPFILETIME);
 #define    RegEnumKeyEx WINELIB_NAME_AW(RegEnumKeyEx)
 DWORD      RegOpenKeyEx32W(HKEY,LPCWSTR,DWORD,REGSAM,LPHKEY);
 DWORD      RegOpenKeyEx32A(HKEY,LPCSTR,DWORD,REGSAM,LPHKEY);
 #define    RegOpenKeyEx WINELIB_NAME_AW(RegOpenKeyEx)
 DWORD      RegQueryInfoKey32W(HKEY,LPWSTR,LPDWORD,LPDWORD,LPDWORD,LPDWORD,
-                            LPDWORD,LPDWORD,LPDWORD,LPDWORD,LPDWORD,FILETIME*);
+                            LPDWORD,LPDWORD,LPDWORD,LPDWORD,LPDWORD,LPFILETIME);
 DWORD      RegQueryInfoKey32A(HKEY,LPSTR,LPDWORD,LPDWORD,LPDWORD,LPDWORD,
-                            LPDWORD,LPDWORD,LPDWORD,LPDWORD,LPDWORD,FILETIME*);
+                            LPDWORD,LPDWORD,LPDWORD,LPDWORD,LPDWORD,LPFILETIME);
 #define    RegQueryInfoKey WINELIB_NAME_AW(RegQueryInfoKey)
 VOID       RtlFillMemory(LPVOID,UINT32,UINT32);
 VOID       RtlMoveMemory(LPVOID,LPCVOID,UINT32);
@@ -3799,10 +3907,12 @@
 BOOL32     SetCommTimeouts(INT32,LPCOMMTIMEOUTS);
 BOOL32     SetEndOfFile(HFILE);
 DWORD      SetFilePointer(HFILE,LONG,LPLONG,DWORD);
+BOOL32     SetFileTime(HFILE,LPFILETIME,LPFILETIME,LPFILETIME);
 BOOL32     SetTimeZoneInformation(const LPTIME_ZONE_INFORMATION);
 BOOL32     SetSystemPowerState(BOOL32,BOOL32);
 BOOL32     SetSystemTime(const SYSTEMTIME*);
 VOID       Sleep(DWORD);
+BOOL32     SystemTimeToFileTime(LPSYSTEMTIME,LPFILETIME);
 LPVOID     VirtualAlloc(LPVOID,DWORD,DWORD,DWORD);
 BOOL32     VirtualFree(LPVOID,DWORD,DWORD);
 BOOL32     WriteFile(HFILE,LPVOID,DWORD,LPDWORD,LPOVERLAPPED);
@@ -3887,6 +3997,9 @@
 HDC16      BeginPaint16(HWND16,LPPAINTSTRUCT16);
 HDC32      BeginPaint32(HWND32,LPPAINTSTRUCT32);
 #define    BeginPaint WINELIB_NAME(BeginPaint)
+BOOL16     BitBlt16(HDC16,INT16,INT16,INT16,INT16,HDC16,INT16,INT16,DWORD);
+BOOL32     BitBlt32(HDC32,INT32,INT32,INT32,INT32,HDC32,INT32,INT32,DWORD);
+#define    BitBlt WINELIB_NAME(BitBlt)
 BOOL16     BuildCommDCB16(LPCSTR,LPDCB16);
 BOOL32     BuildCommDCB32A(LPCSTR,LPDCB32);
 BOOL32     BuildCommDCB32W(LPCWSTR,LPDCB32);
@@ -4111,6 +4224,14 @@
 INT32      DlgDirListComboBox32A(HWND32,LPCSTR,INT32,INT32,UINT32);
 INT32      DlgDirListComboBox32W(HWND32,LPCWSTR,INT32,INT32,UINT32);
 #define    DlgDirListComboBox WINELIB_NAME_AW(DlgDirListComboBox)
+BOOL16     DlgDirSelectComboBoxEx16(HWND16,LPSTR,INT16,INT16);
+BOOL32     DlgDirSelectComboBoxEx32A(HWND32,LPSTR,INT32,INT32);
+BOOL32     DlgDirSelectComboBoxEx32W(HWND32,LPWSTR,INT32,INT32);
+#define    DlgDirSelectComboBoxEx WINELIB_NAME_AW(DlgDirSelectComboBoxEx)
+BOOL16     DlgDirSelectEx16(HWND16,LPSTR,INT16,INT16);
+BOOL32     DlgDirSelectEx32A(HWND32,LPSTR,INT32,INT32);
+BOOL32     DlgDirSelectEx32W(HWND32,LPWSTR,INT32,INT32);
+#define    DlgDirSelectEx WINELIB_NAME_AW(DlgDirSelectEx)
 BOOL16     DPtoLP16(HDC16,LPPOINT16,INT16);
 BOOL32     DPtoLP32(HDC32,LPPOINT32,INT32);
 #define    DPtoLP WINELIB_NAME(DPtoLP)
@@ -4139,6 +4260,10 @@
 BOOL16     EnumChildWindows16(HWND16,WNDENUMPROC16,LPARAM);
 BOOL32     EnumChildWindows32(HWND32,WNDENUMPROC32,LPARAM);
 #define    EnumChildWindows WINELIB_NAME(EnumChildWindows)
+INT16      EnumFontFamilies16(HDC16,LPCSTR,FONTENUMPROC16,LPARAM);
+INT32      EnumFontFamilies32A(HDC32,LPCSTR,FONTENUMPROC32A,LPARAM);
+INT32      EnumFontFamilies32W(HDC32,LPCWSTR,FONTENUMPROC32W,LPARAM);
+#define    EnumFontFamilies WINELIB_NAME_AW(EnumFontFamilies)
 INT16      EnumObjects16(HDC16,INT16,GOBJENUMPROC16,LPARAM);
 INT32      EnumObjects32(HDC32,INT32,GOBJENUMPROC32,LPARAM);
 #define    EnumObjects WINELIB_NAME(EnumObjects)
@@ -4657,6 +4782,9 @@
 BOOL16     PaintRgn16(HDC16,HRGN16);
 BOOL32     PaintRgn32(HDC32,HRGN32);
 #define    PaintRgn WINELIB_NAME(PaintRgn)
+BOOL16     PatBlt16(HDC16,INT16,INT16,INT16,INT16,DWORD);
+BOOL32     PatBlt32(HDC32,INT32,INT32,INT32,INT32,DWORD);
+#define    PatBlt WINELIB_NAME(PatBlt)
 BOOL16     PeekMessage16(LPMSG16,HWND16,UINT16,UINT16,UINT16);
 BOOL32     PeekMessage32A(LPMSG32,HWND32,UINT32,UINT32,UINT32);
 BOOL32     PeekMessage32W(LPMSG32,HWND32,UINT32,UINT32,UINT32);
@@ -4775,6 +4903,19 @@
 void       ScreenToClient16(HWND16,LPPOINT16);
 void       ScreenToClient32(HWND32,LPPOINT32);
 #define    ScreenToClient WINELIB_NAME(ScreenToClient)
+BOOL16     ScrollDC16(HDC16,INT16,INT16,const RECT16*,const RECT16*,
+                      HRGN16,LPRECT16);
+BOOL32     ScrollDC32(HDC32,INT32,INT32,const RECT32*,const RECT32*,
+                      HRGN32,LPRECT32);
+#define    ScrollDC WINELIB_NAME(ScrollDC)
+void       ScrollWindow16(HWND16,INT16,INT16,const RECT16*,const RECT16*);
+BOOL32     ScrollWindow32(HWND32,INT32,INT32,const RECT32*,const RECT32*);
+#define    ScrollWindow WINELIB_NAME(ScrollWindow)
+INT16      ScrollWindowEx16(HWND16,INT16,INT16,const RECT16*,const RECT16*,
+                            HRGN16,LPRECT16,UINT16);
+INT32      ScrollWindowEx32(HWND32,INT32,INT32,const RECT32*,const RECT32*,
+                            HRGN32,LPRECT32,UINT32);
+#define    ScrollWindowEx WINELIB_NAME(ScrollWindowEx)
 INT16      SelectClipRgn16(HDC16,HRGN16);
 INT32      SelectClipRgn32(HDC32,HRGN32);
 #define    SelectClipRgn WINELIB_NAME(SelectClipRgn)
@@ -4896,6 +5037,11 @@
 void       ShowScrollBar16(HWND16,INT16,BOOL16);
 BOOL32     ShowScrollBar32(HWND32,INT32,BOOL32);
 #define    ShowScrollBar WINELIB_NAME(ShowScrollBar)
+BOOL16     StretchBlt16(HDC16,INT16,INT16,INT16,INT16,HDC16,INT16,INT16,
+                        INT16,INT16,DWORD);
+BOOL32     StretchBlt32(HDC32,INT32,INT32,INT32,INT32,HDC32,INT32,INT32,
+                        INT32,INT32,DWORD);
+#define    StretchBlt WINELIB_NAME(StretchBlt)
 BOOL16     SubtractRect16(LPRECT16,const RECT16*,const RECT16*);
 BOOL32     SubtractRect32(LPRECT32,const RECT32*,const RECT32*);
 #define    SubtractRect WINELIB_NAME(SubtractRect)
@@ -5059,7 +5205,6 @@
 BOOL       AnyPopup(void);
 UINT       ArrangeIconicWindows(HWND);
 HDWP16     BeginDeferWindowPos(INT);
-BOOL       BitBlt(HDC16,INT,INT,INT,INT,HDC16,INT,INT,DWORD);
 BOOL       BringWindowToTop(HWND);
 void       CalcChildScroll(HWND,WORD);
 BOOL       CallMsgFilter(SEGPTR,INT);
@@ -5094,8 +5239,6 @@
 BOOL       DestroyWindow(HWND);
 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, HANDLE16, WORD, HCURSOR16);
 BOOL       DrawIcon(HDC16,INT,INT,HICON16);
@@ -5106,7 +5249,6 @@
 BOOL       EnableWindow(HWND,BOOL);
 BOOL       EndDeferWindowPos(HDWP16);
 UINT16     EnumClipboardFormats(UINT16);
-INT        EnumFontFamilies(HDC16,LPCSTR,FONTENUMPROC16,LPARAM);
 INT        EnumFonts(HDC16,LPCSTR,FONTENUMPROC16,LPARAM);
 BOOL       EnumMetaFile(HDC16,HMETAFILE16,MFENUMPROC16,LPARAM);
 INT        Escape(HDC16,INT,INT,SEGPTR,SEGPTR);
@@ -5249,7 +5391,6 @@
 BOOL       OpenIcon(HWND);
 int        OpenSound(void);
 void       OutputDebugString(LPCSTR);
-BOOL       PatBlt(HDC16,short,short,short,short,DWORD);
 BOOL       PlayMetaFile(HDC16,HMETAFILE16);
 void       PlayMetaFileRecord(HDC16,LPHANDLETABLE16,LPMETARECORD,WORD);
 BOOL       PostMessage(HWND,WORD,WORD,LONG);
@@ -5272,9 +5413,6 @@
 BOOL       RestoreDC(HDC16,short);
 int        SaveDC(HDC16);
 void       ScrollChildren(HWND,UINT,WPARAM16,LPARAM);
-BOOL       ScrollDC(HDC16,short,short,LPRECT16,LPRECT16,HRGN32,LPRECT16);
-void       ScrollWindow(HWND,short,short,LPRECT16,LPRECT16);
-int        ScrollWindowEx(HWND,short,short,LPRECT16,LPRECT16,HRGN32,LPRECT16,WORD);
 HPALETTE16 SelectPalette(HDC16,HPALETTE16,BOOL);
 HWND       SetActiveWindow(HWND);
 WORD       SetBkMode(HDC16,WORD);
@@ -5326,7 +5464,6 @@
 DWORD      SizeofResource(HMODULE16,HRSRC16);
 int        StartSound(void);
 int        StopSound(void);
-BOOL       StretchBlt(HDC16,short,short,short,short,HDC16,short,short,short,short,DWORD);
 int        StretchDIBits(HDC16,WORD,WORD,WORD,WORD,WORD,WORD,WORD,WORD,LPSTR,LPBITMAPINFO,WORD,DWORD);
 BOOL       SwapMouseButton(BOOL);
 void       SwapRecording(WORD);
diff --git a/include/winpos.h b/include/winpos.h
index 2b30dd3..d8df072 100644
--- a/include/winpos.h
+++ b/include/winpos.h
@@ -35,6 +35,6 @@
 				  RECT16 *newClientRect );
 extern LONG WINPOS_HandleWindowPosChanging16(WND *wndPtr, WINDOWPOS16 *winpos);
 extern LONG WINPOS_HandleWindowPosChanging32(WND *wndPtr, WINDOWPOS32 *winpos);
-extern INT16 WINPOS_WindowFromPoint( POINT16 pt, WND **ppWnd );
+extern INT16 WINPOS_WindowFromPoint( WND* scopeWnd, POINT16 pt, WND **ppWnd );
 
 #endif  /* __WINE_WINPOS_H */
diff --git a/include/x11drv.h b/include/x11drv.h
index eea87db..0c811a4 100644
--- a/include/x11drv.h
+++ b/include/x11drv.h
@@ -50,8 +50,17 @@
 
 struct tagDC;
 
+extern BOOL32 X11DRV_BitBlt( struct tagDC *dcDst, INT32 xDst, INT32 yDst,
+                             INT32 width, INT32 height, struct tagDC *dcSrc,
+                             INT32 xSrc, INT32 ySrc, DWORD rop );
 extern BOOL32 X11DRV_GetTextExtentPoint( struct tagDC *dc, LPCSTR str,
                                          INT32 count, LPSIZE32 size );
+extern BOOL32 X11DRV_PatBlt( struct tagDC *dc, INT32 left, INT32 top,
+                             INT32 width, INT32 height, DWORD rop );
 extern VOID X11DRV_SetDeviceClipping(struct tagDC *dc);
+extern BOOL32 X11DRV_StretchBlt( struct tagDC *dcDst, INT32 xDst, INT32 yDst,
+                                 INT32 widthDst, INT32 heightDst,
+                                 struct tagDC *dcSrc, INT32 xSrc, INT32 ySrc,
+                                 INT32 widthSrc, INT32 heightSrc, DWORD rop );
 
 #endif  /* __WINE_X11DRV_H */
diff --git a/library/libres.c b/library/libres.c
index c3964ec..521f7c2 100644
--- a/library/libres.c
+++ b/library/libres.c
@@ -9,6 +9,7 @@
 #include "libres.h"
 #include "windows.h"
 #include "xmalloc.h"
+#include "string32.h"
 
 typedef struct RLE
 {
@@ -30,9 +31,9 @@
 }
 
 /**********************************************************************
- *	    LIBRES_FindResource    
+ *	    LIBRES_FindResource16    
  */
-HRSRC32 LIBRES_FindResource( HINSTANCE32 hModule, LPCSTR name, LPCSTR type )
+HRSRC32 LIBRES_FindResource16( HINSTANCE32 hModule, LPCSTR name, LPCSTR type )
 {
   int nameid=0,typeid;
   ResListE* ResBlock;
@@ -57,7 +58,7 @@
       typeid=atoi(type+1);
     else
     {
-      WINELIB_UNIMP("LIBRES_FindResource(*,*,type=string)");
+      WINELIB_UNIMP("LIBRES_FindResource16(*,*,type=string)");
       return 0;
     }
   }
@@ -77,6 +78,61 @@
   return 0;
 }
 
+/**********************************************************************
+ *	    LIBRES_FindResource32    
+ */
+HRSRC32 LIBRES_FindResource32( HINSTANCE32 hModule, LPCWSTR name, LPCWSTR type )
+{
+  int nameid=0,typeid;
+  ResListE* ResBlock;
+  const struct resource* const * Res;
+  LPSTR nameA, typeA;
+
+  if(HIWORD(name))
+  {
+    if(*name=='#')
+    {
+      nameA = STRING32_DupUniToAnsi(name);
+      nameid=atoi(nameA+1);
+      free(nameA);
+      name=NULL;
+    }
+  }
+  else
+  {
+    nameid=LOWORD(name);
+    name=NULL;
+  }
+  if(HIWORD(type))
+  {
+    if(*type=='#')
+    {
+      typeA = STRING32_DupUniToAnsi(type);
+      typeid=atoi(typeA+1);
+      free(typeA);
+    }
+    else
+    {
+      WINELIB_UNIMP("LIBRES_FindResource32(*,*,type=string)");
+      return 0;
+    }
+  }
+  else
+    typeid=LOWORD(type);
+  
+  for(ResBlock=ResourceList; ResBlock; ResBlock=ResBlock->next)
+    for(Res=ResBlock->Resources; *Res; Res++)
+      if(name)
+      {
+	if((*Res)->type==typeid && !lstrcmpi32W((*Res)->name,name))
+	  return (HRSRC32)*Res;
+      }
+      else
+	if((*Res)->type==typeid && (*Res)->id==nameid)
+	  return (HRSRC32)*Res;
+  return 0;
+}
+
 
 /**********************************************************************
  *	    LIBRES_LoadResource    
diff --git a/loader/builtin.c b/loader/builtin.c
index 0b67254..0a12bc6 100644
--- a/loader/builtin.c
+++ b/loader/builtin.c
@@ -90,6 +90,7 @@
 extern const DLL_DESCRIPTOR LZEXPAND_Descriptor;
 extern const DLL_DESCRIPTOR VER_Descriptor;
 extern const DLL_DESCRIPTOR W32SYS_Descriptor;
+extern const DLL_DESCRIPTOR WING_Descriptor;
 
 /* 32-bit DLLs */
 
@@ -143,6 +144,7 @@
     { &LZEXPAND_Descriptor, 0 },
     { &VER_Descriptor,      0 },
     { &W32SYS_Descriptor,   0 },
+    { &WING_Descriptor,     0 },
     /* Win32 DLLs */
     { &ADVAPI32_Descriptor, 0 },
     { &COMCTL32_Descriptor, DLL_FLAG_NOT_USED },
diff --git a/loader/resource.c b/loader/resource.c
index 9bf8dba..cf7cc0b 100644
--- a/loader/resource.c
+++ b/loader/resource.c
@@ -63,7 +63,7 @@
     }
     return NE_FindResource( hModule, type, name );
 #else
-    return LIBRES_FindResource( hModule, name, type );
+    return LIBRES_FindResource16( hModule, name, type );
 #endif
 }
 
@@ -116,7 +116,7 @@
     if (!(pModule->flags & NE_FFLAGS_WIN32)) return 0;
     return PE_FindResourceEx32W(hModule,name,type,lang);
 #else
-    return LIBRES_FindResource( hModule, name, type );
+    return LIBRES_FindResource32( hModule, name, type );
 #endif
 }
 
@@ -661,6 +661,7 @@
     LPWSTR buffer2 = buffer?(LPWSTR)xmalloc(buflen*2):NULL;
     INT32 retval = LoadString32W(instance,resource_id,buffer2,buflen);
 
+    if (!retval) return 0;
     if (buffer) {
 	STRING32_UniToAnsi(buffer,buffer2);
 	free(buffer2);
diff --git a/memory/global.c b/memory/global.c
index 4718a63..876c6c9 100644
--- a/memory/global.c
+++ b/memory/global.c
@@ -750,52 +750,23 @@
 /***********************************************************************
  *           MemManInfo   (TOOLHELP.72)
  */
-BOOL16 MemManInfo( MEMMANINFO *pInfo )
+BOOL16 MemManInfo( MEMMANINFO *info )
 {
-#ifdef linux
-    /* FIXME: does not take into account the dwSize member
-     * could be corrupting memory therefore
-     */
-    /* shamefully stolen from free */
-    DWORD availmem = 0;
-    DWORD totalmem = 0;
-    FILE *meminfo;
-    char buf[80];
-    int col[5];
-    int n;
+    MEMORYSTATUS status;
 
-    if ((meminfo = fopen("/proc/meminfo", "r")) < 0) {
-        perror("wine: open");
-        return FALSE;
-    }
-
-    fgets(buf, 80, meminfo); /* read first line */
-    while ( fgets(buf, 80, meminfo) ) {
-        n = sscanf( buf, "%*s %d %d %d %d %d", &col[0], &col[1], &col[2], &col[3], &col[4]);
-        if ( n < 1 ) continue; /* escape the loop at the top */
-        totalmem += col[0];
-        availmem += col[2] + col[4];
-    }
-
-    fprintf(stderr,"MemManInfo called with dwSize = %ld\n",pInfo->dwSize);
-    if (pInfo->dwSize) {
-        pInfo->wPageSize = getpagesize();
-        pInfo->dwLargestFreeBlock = availmem;
-        pInfo->dwTotalLinearSpace = totalmem / pInfo->wPageSize;
-        pInfo->dwMaxPagesAvailable = pInfo->dwLargestFreeBlock / pInfo->wPageSize;
-        pInfo->dwMaxPagesLockable = pInfo->dwMaxPagesLockable;
-        /* FIXME: the next three are not quite correct */
-        pInfo->dwTotalUnlockedPages = pInfo->dwMaxPagesAvailable;
-        pInfo->dwFreePages = pInfo->dwMaxPagesAvailable;
-        pInfo->dwTotalPages = pInfo->dwMaxPagesAvailable;
-        /* FIXME: the three above are not quite correct */
-        pInfo->dwFreeLinearSpace = pInfo->dwMaxPagesAvailable;
-        pInfo->dwSwapFilePages = 0L;
-    }
+    if (info->dwSize < sizeof(MEMMANINFO)) return FALSE;
+    GlobalMemoryStatus( &status );
+    info->wPageSize            = getpagesize();
+    info->dwLargestFreeBlock   = status.dwAvailVirtual;
+    info->dwMaxPagesAvailable  = info->dwLargestFreeBlock / info->wPageSize;
+    info->dwMaxPagesLockable   = info->dwMaxPagesAvailable;
+    info->dwTotalLinearSpace   = status.dwTotalVirtual / info->wPageSize;
+    info->dwTotalUnlockedPages = info->dwTotalLinearSpace;
+    info->dwFreePages          = info->dwMaxPagesAvailable;
+    info->dwTotalPages         = info->dwTotalLinearSpace;
+    info->dwFreeLinearSpace    = info->dwMaxPagesAvailable;
+    info->dwSwapFilePages      = status.dwTotalPageFile / info->wPageSize;
     return TRUE;
-#else
-    return TRUE;
-#endif
 }
 
 
@@ -897,11 +868,46 @@
  */
 VOID GlobalMemoryStatus( LPMEMORYSTATUS lpmem )
 {
-    /* FIXME: should do something like MemManInfo() here */
+#ifdef linux
+    FILE *f = fopen( "/proc/meminfo", "r" );
+    if (f)
+    {
+        char buffer[256];
+        int total, used, free;
+
+        lpmem->dwTotalPhys = lpmem->dwAvailPhys = 0;
+        lpmem->dwTotalPageFile = lpmem->dwAvailPageFile = 0;
+        while (fgets( buffer, sizeof(buffer), f ))
+        {
+            if (sscanf( buffer, "Mem: %d %d %d", &total, &used, &free ))
+            {
+                lpmem->dwTotalPhys += total;
+                lpmem->dwAvailPhys += free;
+            }
+            else if (sscanf( buffer, "Swap: %d %d %d", &total, &used, &free ))
+            {
+                lpmem->dwTotalPageFile += total;
+                lpmem->dwAvailPageFile += free;
+            }
+        }
+        fclose( f );
+
+        if (lpmem->dwTotalPhys)
+        {
+            lpmem->dwTotalVirtual = lpmem->dwTotalPhys+lpmem->dwTotalPageFile;
+            lpmem->dwAvailVirtual = lpmem->dwAvailPhys+lpmem->dwAvailPageFile;
+            lpmem->dwMemoryLoad = (lpmem->dwTotalVirtual-lpmem->dwAvailVirtual)
+                                      * 100 / lpmem->dwTotalVirtual;
+            return;
+        }
+    }
+#endif
+    /* FIXME: should do something for other systems */
     lpmem->dwMemoryLoad    = 0;
     lpmem->dwTotalPhys     = 16*1024*1024;
     lpmem->dwAvailPhys     = 16*1024*1024;
-    lpmem->dwTotalPageFile = 0;
+    lpmem->dwTotalPageFile = 16*1024*1024;
     lpmem->dwAvailPageFile = 16*1024*1024;
-    lpmem->dwAvailVirtual  = 16*1024*1024;
+    lpmem->dwTotalVirtual  = 32*1024*1024;
+    lpmem->dwAvailVirtual  = 32*1024*1024;
 }
diff --git a/misc/commdlg.c b/misc/commdlg.c
index 0133f88..80aa834 100644
--- a/misc/commdlg.c
+++ b/misc/commdlg.c
@@ -263,8 +263,8 @@
                   lpdis->rcItem.top, str, strlen(str));
 	hMemDC = CreateCompatibleDC(lpdis->hDC);
 	hPrevBitmap = SelectObject32(hMemDC, hBitmap);
-	BitBlt(lpdis->hDC, lpdis->rcItem.left, lpdis->rcItem.top,
-	       bm.bmWidth, bm.bmHeight, hMemDC, 0, 0, SRCCOPY);
+	BitBlt32(lpdis->hDC, lpdis->rcItem.left, lpdis->rcItem.top,
+                 bm.bmWidth, bm.bmHeight, hMemDC, 0, 0, SRCCOPY);
 	SelectObject32(hMemDC, hPrevBitmap);
 	DeleteDC(hMemDC);
 	if (lpdis->itemState != 0) InvertRect16(lpdis->hDC, &lpdis->rcItem);
@@ -277,7 +277,7 @@
 	hBrush = SelectObject32(lpdis->hDC, GetStockObject32(LTGRAY_BRUSH));
 	SelectObject32(lpdis->hDC, hBrush);
 	FillRect16(lpdis->hDC, &lpdis->rcItem, hBrush);
-	SendMessage16(lpdis->hwndItem, CB_GETLBTEXT, lpdis->itemID, 
+	SendMessage16(lpdis->hwndItem, CB_GETLBTEXT16, lpdis->itemID, 
                       (LPARAM)SEGPTR_GET(str));
         switch(DRIVE_GetType( str[2] - 'a' ))
         {
@@ -292,8 +292,8 @@
                   lpdis->rcItem.top, str, strlen(str));
 	hMemDC = CreateCompatibleDC(lpdis->hDC);
 	hPrevBitmap = SelectObject32(hMemDC, hBitmap);
-	BitBlt(lpdis->hDC, lpdis->rcItem.left, lpdis->rcItem.top,
-	       bm.bmWidth, bm.bmHeight, hMemDC, 0, 0, SRCCOPY);
+	BitBlt32( lpdis->hDC, lpdis->rcItem.left, lpdis->rcItem.top,
+                  bm.bmWidth, bm.bmHeight, hMemDC, 0, 0, SRCCOPY );
 	SelectObject32(hMemDC, hPrevBitmap);
 	DeleteDC(hMemDC);
 	if (lpdis->itemState != 0) InvertRect16(lpdis->hDC, &lpdis->rcItem);
@@ -351,12 +351,12 @@
       while(*pstr)
 	{
 	  dprintf_commdlg(stddeb,"lpstrCustomFilter // add str='%s' ",pstr);
-          i = SendDlgItemMessage16(hWnd, cmb1, CB_ADDSTRING, 0,
+          i = SendDlgItemMessage16(hWnd, cmb1, CB_ADDSTRING16, 0,
                                    (LPARAM)lpofn->lpstrCustomFilter + n );
           n += strlen(pstr) + 1;
 	  pstr += strlen(pstr) + 1;
 	  dprintf_commdlg(stddeb,"associated to '%s'\n", pstr);
-          SendDlgItemMessage16(hWnd, cmb1, CB_SETITEMDATA, i, (LPARAM)pstr);
+          SendDlgItemMessage16(hWnd, cmb1, CB_SETITEMDATA16, i, (LPARAM)pstr);
           n += strlen(pstr) + 1;
 	  pstr += strlen(pstr) + 1;
 	}
@@ -367,12 +367,12 @@
 	n = 0;
 	while(*pstr) {
 	  dprintf_commdlg(stddeb,"lpstrFilter // add str='%s' ", pstr);
-	  i = SendDlgItemMessage16(hWnd, cmb1, CB_ADDSTRING, 0,
+	  i = SendDlgItemMessage16(hWnd, cmb1, CB_ADDSTRING16, 0,
 				       (LPARAM)lpofn->lpstrFilter + n );
 	  n += strlen(pstr) + 1;
 	  pstr += strlen(pstr) + 1;
 	  dprintf_commdlg(stddeb,"associated to '%s'\n", pstr);
-	  SendDlgItemMessage16(hWnd, cmb1, CB_SETITEMDATA, i, (LPARAM)pstr);
+	  SendDlgItemMessage16(hWnd, cmb1, CB_SETITEMDATA16, i, (LPARAM)pstr);
 	  n += strlen(pstr) + 1;
 	  pstr += strlen(pstr) + 1;
 	}
@@ -380,7 +380,7 @@
   /* set default filter */
   if (lpofn->nFilterIndex == 0 && lpofn->lpstrCustomFilter == (SEGPTR)NULL)
   	lpofn->nFilterIndex = 1;
-  SendDlgItemMessage16(hWnd, cmb1, CB_SETCURSEL, lpofn->nFilterIndex - 1, 0);    
+  SendDlgItemMessage16(hWnd, cmb1, CB_SETCURSEL16, lpofn->nFilterIndex - 1, 0);    
   strncpy(tmpstr, FILEDLG_GetFileType(PTR_SEG_TO_LIN(lpofn->lpstrCustomFilter),
 	     PTR_SEG_TO_LIN(lpofn->lpstrFilter), lpofn->nFilterIndex - 1),511);
   tmpstr[511]=0;
@@ -407,7 +407,7 @@
     fprintf(stderr, "FileDlg: couldn't read initial directory %s!\n", tmpstr);
   /* select current drive in combo 2 */
   n = DRIVE_GetCurrentDrive();
-  SendDlgItemMessage16(hWnd, cmb2, CB_SETCURSEL, n, 0);
+  SendDlgItemMessage16(hWnd, cmb2, CB_SETCURSEL16, n, 0);
   if (!(lpofn->Flags & OFN_SHOWHELP))
     ShowWindow(GetDlgItem(hWnd, pshHelp), SW_HIDE);
   if (lpofn->Flags & OFN_HIDEREADONLY)
@@ -486,18 +486,18 @@
       return TRUE;
     case cmb2: /* disk drop list */
       FILEDLG_StripEditControl(hWnd);
-      lRet = SendDlgItemMessage16(hWnd, cmb2, CB_GETCURSEL, 0, 0L);
+      lRet = SendDlgItemMessage16(hWnd, cmb2, CB_GETCURSEL16, 0, 0L);
       if (lRet == LB_ERR) return 0;
       pstr = SEGPTR_ALLOC(512);
-      SendDlgItemMessage16(hWnd, cmb2, CB_GETLBTEXT, lRet,
+      SendDlgItemMessage16(hWnd, cmb2, CB_GETLBTEXT16, lRet,
                            (LPARAM)SEGPTR_GET(pstr));
       sprintf(tmpstr, "%c:", pstr[2]);
       SEGPTR_FREE(pstr);
     reset_scan:
-      lRet = SendDlgItemMessage16(hWnd, cmb1, CB_GETCURSEL, 0, 0);
+      lRet = SendDlgItemMessage16(hWnd, cmb1, CB_GETCURSEL16, 0, 0);
       if (lRet == LB_ERR)
 	return TRUE;
-      pstr = (LPSTR)SendDlgItemMessage16(hWnd, cmb1, CB_GETITEMDATA, lRet, 0);
+      pstr = (LPSTR)SendDlgItemMessage16(hWnd, cmb1, CB_GETITEMDATA16, lRet, 0);
       dprintf_commdlg(stddeb,"Selected filter : %s\n", pstr);
       SetDlgItemText32A( hWnd, edt1, pstr );
       FILEDLG_ScanDir(hWnd, tmpstr);
@@ -536,7 +536,7 @@
       pstr2 = tmpstr + strlen(tmpstr);
       if (pstr == NULL || *(pstr+1) != 0)
 	strcat(tmpstr, "\\");
-      lRet = SendDlgItemMessage16(hWnd, cmb1, CB_GETCURSEL, 0, 0);
+      lRet = SendDlgItemMessage16(hWnd, cmb1, CB_GETCURSEL16, 0, 0);
       if (lRet == LB_ERR) return TRUE;
       lpofn->nFilterIndex = lRet + 1;
       dprintf_commdlg(stddeb,"commdlg: lpofn->nFilterIndex=%ld\n", lpofn->nFilterIndex);
@@ -1568,10 +1568,10 @@
    point.x=((long)rect.right*(long)x)/(long)MAXHORI;
    point.y=rect.bottom-((long)rect.bottom*(long)y)/(long)MAXVERT;
    if (lpp->oldcross.left!=lpp->oldcross.right)
-     BitBlt(hDC,lpp->oldcross.left,lpp->oldcross.top,
-	     lpp->oldcross.right-lpp->oldcross.left,
-	     lpp->oldcross.bottom-lpp->oldcross.top,
-	     lpp->hdcMem,lpp->oldcross.left,lpp->oldcross.top,SRCCOPY);
+     BitBlt32(hDC,lpp->oldcross.left,lpp->oldcross.top,
+              lpp->oldcross.right-lpp->oldcross.left,
+              lpp->oldcross.bottom-lpp->oldcross.top,
+              lpp->hdcMem,lpp->oldcross.left,lpp->oldcross.top,SRCCOPY);
    lpp->oldcross.left  =point.x-w-1;
    lpp->oldcross.right =point.x+w+1;
    lpp->oldcross.top   =point.y-w-1;
@@ -1652,7 +1652,7 @@
   hDC=GetDC32(hwnd);
   GetClientRect16(hwnd,&rect);
   if (lpp->hdcMem)
-    BitBlt(hDC,0,0,rect.right,rect.bottom,lpp->hdcMem,0,0,SRCCOPY);
+      BitBlt32(hDC,0,0,rect.right,rect.bottom,lpp->hdcMem,0,0,SRCCOPY);
   else
     fprintf(stderr,"choose color: hdcMem is not defined\n");
   ReleaseDC32(hwnd,hDC);
@@ -2285,12 +2285,12 @@
    if (!(nFontType & 0x0004))   /* this means 'TRUETYPE_FONTTYPE' */
      return 1;   
 
-  i=SendMessage16(hwnd,CB_ADDSTRING,0,
+  i=SendMessage16(hwnd,CB_ADDSTRING16,0,
                   (LPARAM)logfont + ((char *)lplf->lfFaceName - (char *)lplf));
   if (i!=CB_ERR)
   {
     w=(lplf->lfCharSet << 8) | lplf->lfPitchAndFamily;
-    SendMessage16(hwnd, CB_SETITEMDATA,i,MAKELONG(nFontType,w));
+    SendMessage16(hwnd, CB_SETITEMDATA16,i,MAKELONG(nFontType,w));
     return 1 ;        /* store some important font information */
   }
   else
@@ -2330,10 +2330,10 @@
          lptm->tmItalic==fontstyles[i].italic)    /* font successful created ? */
      {
        char *str = SEGPTR_STRDUP(fontstyles[i].stname);
-       j=SendMessage16(hwnd,CB_ADDSTRING,0,(LPARAM)SEGPTR_GET(str) );
+       j=SendMessage16(hwnd,CB_ADDSTRING16,0,(LPARAM)SEGPTR_GET(str) );
        SEGPTR_FREE(str);
        if (j==CB_ERR) return 1;
-       j=SendMessage16(hwnd, CB_SETITEMDATA, j, 
+       j=SendMessage16(hwnd, CB_SETITEMDATA16, j, 
                                  MAKELONG(fontstyles[i].weight,fontstyles[i].italic));
        if (j==CB_ERR) return 1;                                 
      }
@@ -2359,11 +2359,11 @@
            ((lpcf->Flags & CF_LIMITSIZE) && (h >= lpcf->nSizeMin) && (h <= lpcf->nSizeMax)))
    {
       sprintf(buffer,"%2d",h);
-      j=SendMessage16(hwnd,CB_FINDSTRING,-1,(LPARAM)SEGPTR_GET(buffer));
+      j=SendMessage16(hwnd,CB_FINDSTRING16,-1,(LPARAM)SEGPTR_GET(buffer));
       if (j==CB_ERR)
       {
-        j=SendMessage16(hwnd,CB_ADDSTRING,0,(LPARAM)SEGPTR_GET(buffer));
-        if (j!=CB_ERR) j = SendMessage16(hwnd, CB_SETITEMDATA, j, h); 
+        j=SendMessage16(hwnd,CB_ADDSTRING16,0,(LPARAM)SEGPTR_GET(buffer));
+        if (j!=CB_ERR) j = SendMessage16(hwnd, CB_SETITEMDATA16, j, h); 
         if (j==CB_ERR)
         {
             SEGPTR_FREE(buffer);
@@ -2400,7 +2400,7 @@
   if (SetFontSizesToCombo3(hcmb3, lplf ,lpcf))
    return 0;
 
-  if (!SendMessage16(hcmb2,CB_GETCOUNT,0,0))
+  if (!SendMessage16(hcmb2,CB_GETCOUNT16,0,0))
   {
        HDC32 hdc= (lpcf->Flags & CF_PRINTERFONTS && lpcf->hDC) ? lpcf->hDC : GetDC32(hDlg);
        i=SetFontStylesToCombo2(hcmb2,hdc,lplf,lptm);
@@ -2450,12 +2450,12 @@
       /* FIXME: load color name from resource:  res=LoadString(...,i+....,buffer,.....); */
       char *name = SEGPTR_ALLOC(20);
       strcpy( name, "[color name]" );
-      j=SendDlgItemMessage16(hDlg,cmb4,CB_ADDSTRING,0,(LPARAM)SEGPTR_GET(name));
+      j=SendDlgItemMessage16(hDlg,cmb4,CB_ADDSTRING16,0,(LPARAM)SEGPTR_GET(name));
       SEGPTR_FREE(name);
-      SendDlgItemMessage16(hDlg,cmb4, CB_SETITEMDATA,j,textcolors[j]);
+      SendDlgItemMessage16(hDlg,cmb4, CB_SETITEMDATA16,j,textcolors[j]);
       /* look for a fitting value in color combobox */
       if (textcolors[j]==lpcf->rgbColors)
-        SendDlgItemMessage16(hDlg,cmb4, CB_SETCURSEL,j,0);
+        SendDlgItemMessage16(hDlg,cmb4, CB_SETCURSEL16,j,0);
     }
   }
   else
@@ -2469,45 +2469,45 @@
   hdc= (lpcf->Flags & CF_PRINTERFONTS && lpcf->hDC) ? lpcf->hDC : GetDC32(hDlg);
   if (hdc)
   {
-    if (!EnumFontFamilies (hdc, NULL,FontFamilyEnumProc,(LPARAM)GetDlgItem(hDlg,cmb1)))
+    if (!EnumFontFamilies16(hdc, NULL,FontFamilyEnumProc,(LPARAM)GetDlgItem(hDlg,cmb1)))
       dprintf_commdlg(stddeb,"WM_INITDIALOG: EnumFontFamilies returns 0\n");
     if (lpcf->Flags & CF_INITTOLOGFONTSTRUCT)
     {
       /* look for fitting font name in combobox1 */
-      j=SendDlgItemMessage16(hDlg,cmb1,CB_FINDSTRING,-1,(LONG)lpxx->lfFaceName);
+      j=SendDlgItemMessage16(hDlg,cmb1,CB_FINDSTRING16,-1,(LONG)lpxx->lfFaceName);
       if (j!=CB_ERR)
       {
-        SendDlgItemMessage16(hDlg,cmb1,CB_SETCURSEL,j,0);
+        SendDlgItemMessage16(hDlg,cmb1,CB_SETCURSEL16,j,0);
 	SendMessage16(hDlg,WM_COMMAND,cmb1,MAKELONG(GetDlgItem(hDlg,cmb1),CBN_SELCHANGE));
         init=1;
         /* look for fitting font style in combobox2 */
         l=MAKELONG(lpxx->lfWeight > FW_MEDIUM ? FW_BOLD:FW_NORMAL,lpxx->lfItalic !=0);
         for (i=0;i<TEXT_EXTRAS;i++)
         {
-          if (l==SendDlgItemMessage16(hDlg,cmb2, CB_GETITEMDATA,i,0))
-            SendDlgItemMessage16(hDlg,cmb2,CB_SETCURSEL,i,0);
+          if (l==SendDlgItemMessage16(hDlg,cmb2, CB_GETITEMDATA16,i,0))
+            SendDlgItemMessage16(hDlg,cmb2,CB_SETCURSEL16,i,0);
         }
       
         /* look for fitting font size in combobox3 */
-        j=SendDlgItemMessage16(hDlg,cmb3,CB_GETCOUNT,0,0);
+        j=SendDlgItemMessage16(hDlg,cmb3,CB_GETCOUNT16,0,0);
         for (i=0;i<j;i++)
         {
-          if (lpxx->lfHeight==(int)SendDlgItemMessage16(hDlg,cmb3, CB_GETITEMDATA,i,0))
-            SendDlgItemMessage16(hDlg,cmb3,CB_SETCURSEL,i,0);
+          if (lpxx->lfHeight==(int)SendDlgItemMessage16(hDlg,cmb3, CB_GETITEMDATA16,i,0))
+            SendDlgItemMessage16(hDlg,cmb3,CB_SETCURSEL16,i,0);
         }
       }
       if (!init)
       {
-        SendDlgItemMessage16(hDlg,cmb1,CB_SETCURSEL,0,0);
+        SendDlgItemMessage16(hDlg,cmb1,CB_SETCURSEL16,0,0);
 	SendMessage16(hDlg,WM_COMMAND,cmb1,MAKELONG(GetDlgItem(hDlg,cmb1),CBN_SELCHANGE));      
       }
     }
     if (lpcf->Flags & CF_USESTYLE && lpcf->lpszStyle)
     {
-      j=SendDlgItemMessage16(hDlg,cmb2,CB_FINDSTRING,-1,(LONG)lpcf->lpszStyle);
+      j=SendDlgItemMessage16(hDlg,cmb2,CB_FINDSTRING16,-1,(LONG)lpcf->lpszStyle);
       if (j!=CB_ERR)
       {
-        j=SendDlgItemMessage16(hDlg,cmb2,CB_SETCURSEL,j,0);
+        j=SendDlgItemMessage16(hDlg,cmb2,CB_SETCURSEL16,j,0);
         SendMessage16(hDlg,WM_COMMAND,cmb2,MAKELONG(GetDlgItem(hDlg,cmb2),CBN_SELCHANGE));
       }
     }
@@ -2580,20 +2580,20 @@
    switch (lpdi->CtlID)
    {
     case cmb1:	/* dprintf_commdlg(stddeb,"WM_Drawitem cmb1\n"); */
-		SendMessage16(lpdi->hwndItem, CB_GETLBTEXT, lpdi->itemID,
+		SendMessage16(lpdi->hwndItem, CB_GETLBTEXT16, lpdi->itemID,
 			(LPARAM)SEGPTR_GET(buffer));	          
 		GetObject16( hBitmapTT, sizeof(bm), &bm );
 		TextOut16(lpdi->hDC, lpdi->rcItem.left + bm.bmWidth + 10,
                           lpdi->rcItem.top, buffer, lstrlen16(buffer));
 #if 0
-		nFontType = SendMessage16(lpdi->hwndItem, CB_GETITEMDATA, lpdi->itemID,0L);
+		nFontType = SendMessage16(lpdi->hwndItem, CB_GETITEMDATA16, lpdi->itemID,0L);
 		  /* FIXME: draw bitmap if truetype usage */
 		if (nFontType&TRUETYPE_FONTTYPE)
 		{
 		  hMemDC = CreateCompatibleDC(lpdi->hDC);
 		  hBitmap = SelectObject32(hMemDC, hBitmapTT);
-		  BitBlt(lpdi->hDC, lpdi->rcItem.left, lpdi->rcItem.top,
-			bm.bmWidth, bm.bmHeight, hMemDC, 0, 0, SRCCOPY);
+		  BitBlt32(lpdi->hDC, lpdi->rcItem.left, lpdi->rcItem.top,
+                           bm.bmWidth, bm.bmHeight, hMemDC, 0, 0, SRCCOPY);
 		  SelectObject32(hMemDC, hBitmap);
 		  DeleteDC(hMemDC);
 		}
@@ -2601,18 +2601,18 @@
 		break;
     case cmb2:
     case cmb3:	/* dprintf_commdlg(stddeb,"WM_DRAWITEN cmb2,cmb3\n"); */
-		SendMessage16(lpdi->hwndItem, CB_GETLBTEXT, lpdi->itemID,
+		SendMessage16(lpdi->hwndItem, CB_GETLBTEXT16, lpdi->itemID,
 			(LPARAM)SEGPTR_GET(buffer));
 		TextOut16(lpdi->hDC, lpdi->rcItem.left,
                           lpdi->rcItem.top, buffer, lstrlen16(buffer));
 		break;
 
     case cmb4:	/* dprintf_commdlg(stddeb,"WM_DRAWITEM cmb4 (=COLOR)\n"); */
-		SendMessage16(lpdi->hwndItem, CB_GETLBTEXT, lpdi->itemID,
+		SendMessage16(lpdi->hwndItem, CB_GETLBTEXT16, lpdi->itemID,
     		    (LPARAM)SEGPTR_GET(buffer));
 		TextOut16(lpdi->hDC, lpdi->rcItem.left +  25+5,
                           lpdi->rcItem.top, buffer, lstrlen16(buffer));
-		cr = SendMessage16(lpdi->hwndItem, CB_GETITEMDATA, lpdi->itemID,0L);
+		cr = SendMessage16(lpdi->hwndItem, CB_GETITEMDATA16, lpdi->itemID,0L);
 		hBrush = CreateSolidBrush32(cr);
 		if (hBrush)
 		{
@@ -2674,17 +2674,17 @@
 		    hdc=(lpcf->Flags & CF_PRINTERFONTS && lpcf->hDC) ? lpcf->hDC : GetDC32(hDlg);
 		    if (hdc)
 		    {
-                      SendDlgItemMessage16(hDlg,cmb2,CB_RESETCONTENT,0,0); 
-		      SendDlgItemMessage16(hDlg,cmb3,CB_RESETCONTENT,0,0);
-		      i=SendDlgItemMessage16(hDlg,cmb1,CB_GETCURSEL,0,0);
+                      SendDlgItemMessage16(hDlg,cmb2,CB_RESETCONTENT16,0,0); 
+		      SendDlgItemMessage16(hDlg,cmb3,CB_RESETCONTENT16,0,0);
+		      i=SendDlgItemMessage16(hDlg,cmb1,CB_GETCURSEL16,0,0);
 		      if (i!=CB_ERR)
 		      {
 		        HCURSOR16 hcursor=SetCursor(LoadCursor16(0,IDC_WAIT));
                         char *str = SEGPTR_ALLOC(256);
-                        SendDlgItemMessage16(hDlg,cmb1,CB_GETLBTEXT,i,
+                        SendDlgItemMessage16(hDlg,cmb1,CB_GETLBTEXT16,i,
                                              (LPARAM)SEGPTR_GET(str));
 	                dprintf_commdlg(stddeb,"WM_COMMAND/cmb1 =>%s\n",str);
-       		        EnumFontFamilies(hdc,str,FontStyleEnumProc,
+       		        EnumFontFamilies16(hdc,str,FontStyleEnumProc,
 		             MAKELONG(GetDlgItem(hDlg,cmb2),GetDlgItem(hDlg,cmb3)));
 		        SetCursor(hcursor);     
                         SEGPTR_FREE(str);
@@ -2706,14 +2706,14 @@
 	          {
                     char *str = SEGPTR_ALLOC(256);
                     dprintf_commdlg(stddeb,"WM_COMMAND/cmb2,3 =%08lX\n", lParam);
-		    i=SendDlgItemMessage16(hDlg,cmb1,CB_GETCURSEL,0,0);
+		    i=SendDlgItemMessage16(hDlg,cmb1,CB_GETCURSEL16,0,0);
 		    if (i==CB_ERR)
                       i=GetDlgItemText32A( hDlg, cmb1, str, 256 );
                     else
                     {
-		      SendDlgItemMessage16(hDlg,cmb1,CB_GETLBTEXT,i,
+		      SendDlgItemMessage16(hDlg,cmb1,CB_GETLBTEXT16,i,
                                            (LPARAM)SEGPTR_GET(str));
-		      l=SendDlgItemMessage16(hDlg,cmb1,CB_GETITEMDATA,i,0);
+		      l=SendDlgItemMessage16(hDlg,cmb1,CB_GETITEMDATA16,i,0);
 		      j=HIWORD(l);
 		      lpcf->nFontType = LOWORD(l);
 		      /* FIXME:   lpcf->nFontType |= ....  SIMULATED_FONTTYPE and so */
@@ -2724,18 +2724,18 @@
                     }
                     strcpy(lpxx->lfFaceName,str);
                     SEGPTR_FREE(str);
-		    i=SendDlgItemMessage16(hDlg,cmb2,CB_GETCURSEL,0,0);
+		    i=SendDlgItemMessage16(hDlg,cmb2,CB_GETCURSEL16,0,0);
 		    if (i!=CB_ERR)
 		    {
-		      l=SendDlgItemMessage16(hDlg,cmb2,CB_GETITEMDATA,i,0);
+		      l=SendDlgItemMessage16(hDlg,cmb2,CB_GETITEMDATA16,i,0);
 		      if (0!=(lpxx->lfItalic=HIWORD(l)))
 		        lpcf->nFontType |= ITALIC_FONTTYPE;
 		      if ((lpxx->lfWeight=LOWORD(l)) > FW_MEDIUM)
 		        lpcf->nFontType |= BOLD_FONTTYPE;
 		    }
-		    i=SendDlgItemMessage16(hDlg,cmb3,CB_GETCURSEL,0,0);
+		    i=SendDlgItemMessage16(hDlg,cmb3,CB_GETCURSEL16,0,0);
 		    if (i!=CB_ERR)
-		      lpxx->lfHeight=-LOWORD(SendDlgItemMessage16(hDlg,cmb3,CB_GETITEMDATA,i,0));
+		      lpxx->lfHeight=-LOWORD(SendDlgItemMessage16(hDlg,cmb3,CB_GETITEMDATA16,i,0));
 		    else
 		      lpxx->lfHeight=0;
 		    lpxx->lfStrikeOut=IsDlgButtonChecked(hDlg,chx1);
@@ -2753,7 +2753,7 @@
                   }
                   break;
 
-	case cmb4:i=SendDlgItemMessage16(hDlg,cmb4,CB_GETCURSEL,0,0);
+	case cmb4:i=SendDlgItemMessage16(hDlg,cmb4,CB_GETCURSEL16,0,0);
 		  if (i!=CB_ERR)
 		  {
 		   lpcf->rgbColors=textcolors[i];
diff --git a/misc/crtdll.c b/misc/crtdll.c
index 4917a4e..e7a8be6 100644
--- a/misc/crtdll.c
+++ b/misc/crtdll.c
@@ -20,6 +20,7 @@
 #include "debug.h"
 #include "module.h"
 #include "xmalloc.h"
+#include "heap.h"
 
 UINT32 CRTDLL_argc_dll;         /* CRTDLL.23 */
 LPSTR *CRTDLL_argv_dll;         /* CRTDLL.24 */
@@ -141,6 +142,14 @@
 }
 
 /*********************************************************************
+ *                  sprintf        (CRTDLL.458)
+ */
+int CRTDLL_sprintf(DWORD *args)
+{
+	return vsprintf((LPSTR)(args[0]),(LPSTR)(args[1]),args+2);
+}
+
+/*********************************************************************
  *                  time          (CRTDLL.488)
  */
 time_t CRTDLL_time(time_t *timeptr)
@@ -613,3 +622,20 @@
 {
     HeapFree(GetProcessHeap(),0,ptr);
 }
+
+/*********************************************************************
+ *                  _strdup          (CRTDLL.285)
+ */
+LPSTR CRTDLL__strdup(LPSTR ptr)
+{
+    return HEAP_strdupA(GetProcessHeap(),0,ptr);
+}
+
+/*********************************************************************
+ *                  fclose           (CRTDLL.362)
+ */
+DWORD CRTDLL_fclose(LPVOID x)
+{
+    dprintf_crtdll(stdnimp,"fclose(%p)\n",x);
+    return 0;
+}
diff --git a/misc/exec.c b/misc/exec.c
index 5594182..c69416d 100644
--- a/misc/exec.c
+++ b/misc/exec.c
@@ -113,7 +113,10 @@
 	}
 	hDest = FindWindow32A( "MS_WINHELP", NULL );
 	if(!hDest)
-		return FALSE;
+		if(wCommand == HELP_QUIT)
+			return TRUE;
+		else
+			return FALSE;
 	switch(wCommand)
 	{
 		case HELP_CONTEXT:
diff --git a/misc/registry.c b/misc/registry.c
index b5ba088..cdd6751 100644
--- a/misc/registry.c
+++ b/misc/registry.c
@@ -20,6 +20,7 @@
 #include "win.h"
 #include "winerror.h"
 #include "file.h"
+#include "dos_fs.h"
 #include "string32.h"	
 #include "stddebug.h"
 #include "debug.h"
@@ -1054,8 +1055,6 @@
 	return NULL;
 }
 
-extern time_t FileTimeToUnixTime(FILETIME*);
-
 static void
 _w95_loadreg(char* fn,LPKEYSTRUCT lpkey) {
 	/* Disk Key Entry structure (RGKN part) */
@@ -1211,7 +1210,7 @@
 	if (!GetFileInformationByHandle(hfd,&hfdinfo))
 		return;
 	end		= hfdinfo.nFileSizeLow;
-	lastmodified	= FileTimeToUnixTime(&(hfdinfo.ftLastWriteTime));
+	lastmodified	= DOSFS_FileTimeToUnixTime(&(hfdinfo.ftLastWriteTime));
 
 	if (-1==_llseek(hfd,rgdbsection,SEEK_SET))
 		return;
diff --git a/misc/shell.c b/misc/shell.c
index 3bec8c7..3a96897 100644
--- a/misc/shell.c
+++ b/misc/shell.c
@@ -79,11 +79,8 @@
 		hDrop,wFile,lpszFile,wLength);
     
     lpDropFileStruct = (LPDROPFILESTRUCT) GlobalLock16(hDrop); 
-    if(!lpDropFileStruct)
-    {
-	dprintf_reg(stddeb,"DragQueryFile: unable to lock handle!\n");
-	return 0;
-    } 
+    if(!lpDropFileStruct) return 0;
+
     lpCurrent = (LPSTR) lpDropFileStruct + lpDropFileStruct->wSize;
     
     i = 0;
@@ -100,7 +97,7 @@
     i = (wLength > i) ? i : wLength-1;
     strncpy(lpszFile, lpCurrent, i);
     lpszFile[i] = '\0';
-    
+
     GlobalUnlock16(hDrop);
     return i;
 }
@@ -121,7 +118,7 @@
 BOOL DragQueryPoint(HDROP16 hDrop, POINT16 *p)
 {
     LPDROPFILESTRUCT lpDropFileStruct;  
-    BOOL             bRet;
+    BOOL16           bRet;
 
     lpDropFileStruct = (LPDROPFILESTRUCT) GlobalLock16(hDrop);
 
@@ -807,7 +804,7 @@
  */
 int RegisterShellHook(void *ptr) 
 {
-	dprintf_reg(stdnimp, "RegisterShellHook : Empty Stub !!!\n");
+	fprintf(stdnimp, "RegisterShellHook : Empty Stub !!!\n");
 	return 0;
 }
 
@@ -817,7 +814,7 @@
  */
 int ShellHookProc(void) 
 {
-	dprintf_reg(stdnimp, "ShellHookProc : Empty Stub !!!\n");
+	fprintf(stdnimp, "ShellHookProc : Empty Stub !!!\n");
         return 0;
 }
 
diff --git a/misc/spy.c b/misc/spy.c
index 3cdf52d..57ce9d9 100644
--- a/misc/spy.c
+++ b/misc/spy.c
@@ -215,15 +215,43 @@
     NULL, NULL, NULL, NULL, NULL, NULL, NULL,
 
     /* 0x0140 - Win32 Comboboxes */
-    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
-    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+    "CB_GETEDITSEL32",          /* 0x0140 */
+    "CB_LIMITTEXT32",           /* 0x0141 */
+    "CB_SETEDITSEL32",          /* 0x0142 */
+    "CB_ADDSTRING32",           /* 0x0143 */
+    "CB_DELETESTRING32",        /* 0x0144 */
+    "CB_DIR32",                 /* 0x0145 */
+    "CB_GETCOUNT32",            /* 0x0146 */
+    "CB_GETCURSEL32",           /* 0x0147 */
+    "CB_GETLBTEXT32",           /* 0x0148 */
+    "CB_GETLBTEXTLEN32",        /* 0x0149 */
+    "CB_INSERTSTRING32",        /* 0x014a */
+    "CB_RESETCONTENT32",        /* 0x014b */
+    "CB_FINDSTRING32",          /* 0x014c */
+    "CB_SELECTSTRING32",        /* 0x014d */
+    "CB_SETCURSEL32",           /* 0x014e */
+    "CB_SHOWDROPDOWN32",        /* 0x014f */
 
-    /* 0x0150 */
-    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
-    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+    "CB_GETITEMDATA32",         /* 0x0150 */
+    "CB_SETITEMDATA32",         /* 0x0151 */
+    "CB_GETDROPPEDCONTROLRECT32",/* 0x0152 */
+    "CB_SETITEMHEIGHT32",       /* 0x0153 */
+    "CB_GETITEMHEIGHT32",       /* 0x0154 */
+    "CB_SETEXTENDEDUI32",       /* 0x0155 */
+    "CB_GETEXTENDEDUI32",       /* 0x0156 */
+    "CB_GETDROPPEDSTATE32",     /* 0x0157 */
+    "CB_FINDSTRINGEXACT32",     /* 0x0158 */
+    "CB_SETLOCALE32",           /* 0x0159 */
+    "CB_GETLOCALE32",           /* 0x015a */
+    "CB_GETTOPINDEX32",         /* 0x015b */
+    "CB_SETTOPINDEX32",         /* 0x015c */
+    "CB_GETHORIZONTALEXTENT32", /* 0x015d */
+    "CB_SETHORIZONTALEXTENT32", /* 0x015e */
+    "CB_GETDROPPEDWIDTH32",     /* 0x015f */
 
-    /* 0x0160 */
-    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+    "CB_SETDROPPEDWIDTH32",     /* 0x0160 */
+    "CB_INITSTORAGE32",         /* 0x0161 */
+    NULL, NULL, NULL, NULL, NULL, NULL,
     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
 
     /* 0x0170 - Win32 Static controls */
diff --git a/miscemu/int21.c b/miscemu/int21.c
index d701a8b..1a4cc96 100644
--- a/miscemu/int21.c
+++ b/miscemu/int21.c
@@ -15,10 +15,10 @@
 #include <unistd.h>
 #include <utime.h>
 #include <ctype.h>
+#include "windows.h"
 #include "dos_fs.h"
 #include "drive.h"
 #include "file.h"
-#include "windows.h"
 #include "msdos.h"
 #include "ldt.h"
 #include "task.h"
diff --git a/objects/Makefile.in b/objects/Makefile.in
index 56b3307..953c68d 100644
--- a/objects/Makefile.in
+++ b/objects/Makefile.in
@@ -6,7 +6,6 @@
 MODULE    = objects
 
 C_SRCS = \
-	bitblt.c \
 	bitmap.c \
 	brush.c \
 	clipping.c \
diff --git a/objects/color.c b/objects/color.c
index d5afb9d..bc1615f 100644
--- a/objects/color.c
+++ b/objects/color.c
@@ -482,9 +482,10 @@
     /* Build free list */
 
     if( COLOR_firstFree != -1 )
+    {
 	COLOR_FormatSystemPalette();
-
-    COLOR_FillDefaultColors();
+        COLOR_FillDefaultColors();
+    }
 
     /* create default palette (20 system colors) */
 
diff --git a/objects/cursoricon.c b/objects/cursoricon.c
index a3388af..df7be52 100644
--- a/objects/cursoricon.c
+++ b/objects/cursoricon.c
@@ -25,6 +25,7 @@
 #include <string.h>
 #include <stdlib.h>
 #include "windows.h"
+#include "color.h"
 #include "bitmap.h"
 #include "callback.h"
 #include "cursoricon.h"
@@ -430,34 +431,86 @@
 /***********************************************************************
  *           CURSORICON_IconToCursor
  *
- * Should convert bitmap to mono and truncate if too large
- * FIXME: if icon is passed returns a copy of OCR_DRAGOBJECT cursor
- *	  but should actually convert icon to cursor.
+ * Converts bitmap to mono and truncates if icon is too large
  */
-HCURSOR16 CURSORICON_IconToCursor(HICON16 hIcon)
+HCURSOR16 CURSORICON_IconToCursor(HICON16 hIcon, BOOL32 bSemiTransparent)
 {
+ HCURSOR16       hRet = 0;
  CURSORICONINFO *ptr = NULL;
+ HTASK16 	 hTask = GetCurrentTask();
+ TDB*  		 pTask = (TDB *)GlobalLock16(hTask);
 
  if(hIcon)
     if (!(ptr = (CURSORICONINFO*)GlobalLock16( hIcon ))) return FALSE;
        if (ptr->bPlanes * ptr->bBitsPerPixel == 1)
+           hRet = CURSORICON_Copy( pTask->hInstance, hIcon );
+       else
           {
-            return hIcon; /* assuming it's a cursor */
+           BYTE  pAndBits[128];
+           BYTE  pXorBits[128];
+	   int   x, y, ix, iy, shift; 
+	   int   bpp = (ptr->bBitsPerPixel>=24)?32:ptr->bBitsPerPixel; /* this sucks */
+           BYTE* psPtr = (BYTE *)(ptr + 1) +
+                            ptr->nHeight * BITMAP_WIDTH_BYTES(ptr->nWidth,1);
+           BYTE* pxbPtr = pXorBits;
+           unsigned *psc = NULL, val = 0;
+           unsigned val_base = 0xffffffff >> (32 - bpp);
+           BYTE* pbc = NULL;
+
+           COLORREF       col;
+           CURSORICONINFO cI;
+
+           if(!pTask) return 0;
+
+           memset(pXorBits, 0, 128);
+           cI.bBitsPerPixel = 1; cI.bPlanes = 1;
+           cI.ptHotSpot.x = cI.ptHotSpot.y = 15;
+           cI.nWidth = 32; cI.nHeight = 32;
+           cI.nWidthBytes = 4;	/* 1bpp */
+
+           x = (ptr->nWidth > 32) ? 32 : ptr->nWidth;
+           y = (ptr->nHeight > 32) ? 32 : ptr->nHeight;
+
+           for( iy = 0; iy < y; iy++ )
+           {
+              val = BITMAP_WIDTH_BYTES( ptr->nWidth, 1 );
+              memcpy( pAndBits + iy * 4,
+                     (BYTE *)(ptr + 1) + iy * val, (val>4) ? 4 : val);
+              shift = iy % 2;
+
+              for( ix = 0; ix < x; ix++ )
+              {
+                if( bSemiTransparent && ((ix+shift)%2) )
+                {
+                    pbc = pAndBits + iy * 4 + ix/8;
+                   *pbc |= 0x80 >> (ix%8);
+                }
+                else
+                {
+                  psc = (unsigned*)(psPtr + (ix * bpp)/8);
+                  val = ((*psc) >> (ix * bpp)%8) & val_base;
+                  col = COLOR_ToLogical(val);
+                  if( GetRValue(col) > 0xa0 ||
+                      GetGValue(col) > 0x80 ||
+                      GetBValue(col) > 0xa0 )
+                  {
+                    pbc = pxbPtr + ix/8;
+                   *pbc |= 0x80 >> (ix%8);
+                  }
+                }
+              }
+              psPtr += ptr->nWidthBytes;
+              pxbPtr += 4;
+           }
+           hRet = CreateCursorIconIndirect( pTask->hInstance , &cI, pAndBits, pXorBits);
+
+           if( !hRet ) /* fall back on default drag cursor */
+                hRet = CURSORICON_Copy( pTask->hInstance ,
+                              CURSORICON_Load(0,MAKEINTRESOURCE(OCR_DRAGOBJECT),
+                                         SYSMETRICS_CXCURSOR, SYSMETRICS_CYCURSOR, 1, TRUE) );
           }
-       else 
-	  {
-	   /* kludge */
-	   TDB* pTask = (TDB *)GlobalLock16( GetCurrentTask() );
 
-	   if(!pTask) return 0;
-
-           fprintf( stdnimp, "IconToCursor: Icons are not supported, returning default!\n");
-	   return CURSORICON_Copy( pTask->hInstance ,
-				   CURSORICON_Load(0,MAKEINTRESOURCE(OCR_DRAGOBJECT),
-				                   SYSMETRICS_CXCURSOR, SYSMETRICS_CYCURSOR, 1, TRUE) );
-	  }
-
- return 0;
+ return hRet;
 }
 
 /***********************************************************************
@@ -627,9 +680,9 @@
     if (hXorBits && hAndBits)
     {
         HBITMAP32 hBitTemp = SelectObject32( hMemDC, hAndBits );
-        BitBlt( hdc, x, y, ptr->nWidth, ptr->nHeight, hMemDC, 0, 0, SRCAND );
+        BitBlt32( hdc, x, y, ptr->nWidth, ptr->nHeight, hMemDC, 0, 0, SRCAND );
         SelectObject32( hMemDC, hXorBits );
-        BitBlt( hdc, x, y, ptr->nWidth, ptr->nHeight, hMemDC, 0, 0, SRCINVERT);
+        BitBlt32(hdc, x, y, ptr->nWidth, ptr->nHeight, hMemDC, 0, 0,SRCINVERT);
         SelectObject32( hMemDC, hBitTemp );
     }
     DeleteDC( hMemDC );
@@ -896,8 +949,8 @@
 	pt->x = pt->y = 0;
     else
     {
-	pt->x = rootX + desktopX;
-	pt->y = rootY + desktopY;
+	pt->x = childX;
+	pt->y = childY;
     }
     dprintf_cursor(stddeb, "GetCursorPos: ret=%d,%d\n", pt->x, pt->y );
 }
diff --git a/objects/dib.c b/objects/dib.c
index 8ec1ce1..7a4fcf0 100644
--- a/objects/dib.c
+++ b/objects/dib.c
@@ -633,8 +633,8 @@
                               bits, info, wUsage );
     hdcMem = CreateCompatibleDC( hdc );
     hOldBitmap = SelectObject32( hdcMem, hBitmap );
-    StretchBlt( hdc, xDest, yDest, wDestWidth, wDestHeight,
-                hdcMem, xSrc, ySrc, wSrcWidth, wSrcHeight, dwRop );
+    StretchBlt32( hdc, xDest, yDest, wDestWidth, wDestHeight,
+                  hdcMem, xSrc, ySrc, wSrcWidth, wSrcHeight, dwRop );
     SelectObject32( hdcMem, hOldBitmap );
     DeleteDC( hdcMem );
     DeleteObject32( hBitmap );
diff --git a/objects/font.c b/objects/font.c
index 0c4f2fe..df3b109 100644
--- a/objects/font.c
+++ b/objects/font.c
@@ -339,6 +339,78 @@
     return (DWORD)-1; /* failure */
 }
 
+void
+FONT_LOGFONT32AToLOGFONT16(const LOGFONT32A *font,LPLOGFONT16 font16) {
+    font16->lfHeight         = (INT16)font->lfHeight;
+    font16->lfWidth          = (INT16)font->lfWidth;
+    font16->lfEscapement     = (INT16)font->lfEscapement;
+    font16->lfOrientation    = (INT16)font->lfOrientation;
+    font16->lfWeight         = (INT16)font->lfWeight;
+    font16->lfItalic         = font->lfItalic;
+    font16->lfUnderline      = font->lfUnderline;
+    font16->lfStrikeOut      = font->lfStrikeOut;
+    font16->lfCharSet        = font->lfCharSet;
+    font16->lfOutPrecision   = font->lfOutPrecision;
+    font16->lfClipPrecision  = font->lfClipPrecision;
+    font16->lfQuality        = font->lfQuality;
+    font16->lfPitchAndFamily = font->lfPitchAndFamily;
+    lstrcpyn32A( font16->lfFaceName, font->lfFaceName, LF_FACESIZE );
+}
+
+void
+FONT_LOGFONT32WToLOGFONT16(const LOGFONT32W *font,LPLOGFONT16 font16) {
+    font16->lfHeight         = (INT16)font->lfHeight;
+    font16->lfWidth          = (INT16)font->lfWidth;
+    font16->lfEscapement     = (INT16)font->lfEscapement;
+    font16->lfOrientation    = (INT16)font->lfOrientation;
+    font16->lfWeight         = (INT16)font->lfWeight;
+    font16->lfItalic         = font->lfItalic;
+    font16->lfUnderline      = font->lfUnderline;
+    font16->lfStrikeOut      = font->lfStrikeOut;
+    font16->lfCharSet        = font->lfCharSet;
+    font16->lfOutPrecision   = font->lfOutPrecision;
+    font16->lfClipPrecision  = font->lfClipPrecision;
+    font16->lfQuality        = font->lfQuality;
+    font16->lfPitchAndFamily = font->lfPitchAndFamily;
+    lstrcpynWtoA( font16->lfFaceName, font->lfFaceName, LF_FACESIZE );
+}
+
+void
+FONT_LOGFONT16ToLOGFONT32A(LPLOGFONT16 font,LPLOGFONT32A font32A) {
+    font32A->lfHeight         = (INT32)font->lfHeight;
+    font32A->lfWidth          = (INT32)font->lfWidth;
+    font32A->lfEscapement     = (INT32)font->lfEscapement;
+    font32A->lfOrientation    = (INT32)font->lfOrientation;
+    font32A->lfWeight         = (INT32)font->lfWeight;
+    font32A->lfItalic         = font->lfItalic;
+    font32A->lfUnderline      = font->lfUnderline;
+    font32A->lfStrikeOut      = font->lfStrikeOut;
+    font32A->lfCharSet        = font->lfCharSet;
+    font32A->lfOutPrecision   = font->lfOutPrecision;
+    font32A->lfClipPrecision  = font->lfClipPrecision;
+    font32A->lfQuality        = font->lfQuality;
+    font32A->lfPitchAndFamily = font->lfPitchAndFamily;
+    lstrcpyn32A( font32A->lfFaceName, font->lfFaceName, LF_FACESIZE );
+}
+
+void
+FONT_LOGFONT16ToLOGFONT32W(LPLOGFONT16 font,LPLOGFONT32W font32W) {
+    font32W->lfHeight         = (INT32)font->lfHeight;
+    font32W->lfWidth          = (INT32)font->lfWidth;
+    font32W->lfEscapement     = (INT32)font->lfEscapement;
+    font32W->lfOrientation    = (INT32)font->lfOrientation;
+    font32W->lfWeight         = (INT32)font->lfWeight;
+    font32W->lfItalic         = font->lfItalic;
+    font32W->lfUnderline      = font->lfUnderline;
+    font32W->lfStrikeOut      = font->lfStrikeOut;
+    font32W->lfCharSet        = font->lfCharSet;
+    font32W->lfOutPrecision   = font->lfOutPrecision;
+    font32W->lfClipPrecision  = font->lfClipPrecision;
+    font32W->lfQuality        = font->lfQuality;
+    font32W->lfPitchAndFamily = font->lfPitchAndFamily;
+    lstrcpynAtoW( font32W->lfFaceName, font->lfFaceName, LF_FACESIZE );
+}
+
 
 /***********************************************************************
  *           CreateScalableFontResource    (GDI.310)
@@ -387,20 +459,8 @@
 {
     LOGFONT16 font16;
 
-    font16.lfHeight         = (INT16)font->lfHeight;
-    font16.lfWidth          = (INT16)font->lfWidth;
-    font16.lfEscapement     = (INT16)font->lfEscapement;
-    font16.lfOrientation    = (INT16)font->lfOrientation;
-    font16.lfWeight         = (INT16)font->lfWeight;
-    font16.lfItalic         = font->lfItalic;
-    font16.lfUnderline      = font->lfUnderline;
-    font16.lfStrikeOut      = font->lfStrikeOut;
-    font16.lfCharSet        = font->lfCharSet;
-    font16.lfOutPrecision   = font->lfOutPrecision;
-    font16.lfClipPrecision  = font->lfClipPrecision;
-    font16.lfQuality        = font->lfQuality;
-    font16.lfPitchAndFamily = font->lfPitchAndFamily;
-    lstrcpyn32A( font16.lfFaceName, font->lfFaceName, LF_FACESIZE );
+    FONT_LOGFONT32AToLOGFONT16(font,&font16);
+
     return CreateFontIndirect16( &font16 );
 }
 
@@ -412,20 +472,7 @@
 {
     LOGFONT16 font16;
 
-    font16.lfHeight         = (INT16)font->lfHeight;
-    font16.lfWidth          = (INT16)font->lfWidth;
-    font16.lfEscapement     = (INT16)font->lfEscapement;
-    font16.lfOrientation    = (INT16)font->lfOrientation;
-    font16.lfWeight         = (INT16)font->lfWeight;
-    font16.lfItalic         = font->lfItalic;
-    font16.lfUnderline      = font->lfUnderline;
-    font16.lfStrikeOut      = font->lfStrikeOut;
-    font16.lfCharSet        = font->lfCharSet;
-    font16.lfOutPrecision   = font->lfOutPrecision;
-    font16.lfClipPrecision  = font->lfClipPrecision;
-    font16.lfQuality        = font->lfQuality;
-    font16.lfPitchAndFamily = font->lfPitchAndFamily;
-    lstrcpynWtoA( font16.lfFaceName, font->lfFaceName, LF_FACESIZE );
+    FONT_LOGFONT32WToLOGFONT16(font,&font16);
     return CreateFontIndirect16( &font16 );
 }
 
@@ -1224,7 +1271,7 @@
 /*************************************************************************
  *				EnumFontFamilies	[GDI.330]
  */
-INT EnumFontFamilies(HDC16 hDC, LPCSTR lpszFamily, FONTENUMPROC16 lpEnumFunc, LPARAM lpData)
+INT16 EnumFontFamilies16(HDC16 hDC, LPCSTR lpszFamily, FONTENUMPROC16 lpEnumFunc, LPARAM lpData)
 {
   HLOCAL16     	hLog;
   HLOCAL16     	hMet;
@@ -1291,6 +1338,146 @@
 }
 
 /*************************************************************************
+ *				EnumFontFamiliesA	[GDI32.80]
+ */
+INT32 EnumFontFamilies32A(HDC32 hDC, LPCSTR lpszFamily, FONTENUMPROC32A lpEnumFunc, LPARAM lpData)
+{
+  HLOCAL16     	hLog;
+  HLOCAL16     	hMet;
+  HFONT32	hFont;
+  HFONT32	hOldFont;
+  LPENUMLOGFONT32A	lpEnumLogFont;
+  LPTEXTMETRIC32A	lptm;
+  LPSTR	       	lpOldName;
+  char	       	FaceName[LF_FACESIZE];
+  int	       	nRet = 0;
+  int	       	i;
+  
+  dprintf_font(stddeb,"EnumFontFamilies32A(%04x, %p, %08lx, %08lx)\n",
+	       hDC, lpszFamily, (DWORD)lpEnumFunc, lpData);
+  if (lpEnumFunc == 0) return 0;
+  hLog = GDI_HEAP_ALLOC( sizeof(ENUMLOGFONT32A) );
+  lpEnumLogFont = (LPENUMLOGFONT32A) GDI_HEAP_LIN_ADDR(hLog);
+  if (lpEnumLogFont == NULL) {
+    fprintf(stderr,"EnumFontFamilies // can't alloc LOGFONT struct !\n");
+    return 0;
+  }
+  hMet = GDI_HEAP_ALLOC( sizeof(TEXTMETRIC32A) );
+  lptm = (LPTEXTMETRIC32A) GDI_HEAP_LIN_ADDR(hMet);
+  if (lptm == NULL) {
+    GDI_HEAP_FREE(hLog);
+    fprintf(stderr,"EnumFontFamilies32A // can't alloc TEXTMETRIC struct !\n");
+    return 0;
+  }
+  lpOldName = NULL;
+  if (lpszFamily != NULL) {
+    strcpy(FaceName, lpszFamily);
+    AnsiUpper(FaceName);
+  }
+  if (lpLogFontList[0] == NULL) InitFontsList();
+  for(i = 0; lpLogFontList[i] != NULL; i++) {
+    if (lpszFamily == NULL) {
+      if (lpOldName != NULL) {
+	if (strcmp(lpOldName,lpLogFontList[i]->lfFaceName) == 0) continue;
+      }
+      lpOldName = lpLogFontList[i]->lfFaceName;
+    } else {
+      if (strcmp(FaceName, lpLogFontList[i]->lfFaceName) != 0) continue;
+    }
+    FONT_LOGFONT16ToLOGFONT32A(lpLogFontList[i],&(lpEnumLogFont->elfLogFont));
+    strcpy(lpEnumLogFont->elfFullName,"");
+    strcpy(lpEnumLogFont->elfStyle,"");
+    hFont = CreateFontIndirect32A((LPLOGFONT32A)lpEnumLogFont);
+    hOldFont = SelectObject32(hDC, hFont);
+    GetTextMetrics32A(hDC, lptm);
+    SelectObject32(hDC, hOldFont);
+    DeleteObject32(hFont);
+    dprintf_font(stddeb, "EnumFontFamilies32A // i=%d lpLogFont=%p lptm=%p\n", i, lpEnumLogFont, lptm);
+    
+    nRet = lpEnumFunc( GDI_HEAP_LIN_ADDR(hLog), GDI_HEAP_LIN_ADDR(hMet),
+                       0, lpData );
+    if (nRet == 0) {
+      dprintf_font(stddeb,"EnumFontFamilies32A // EnumEnd requested by application !\n");
+      break;
+    }
+  }
+  GDI_HEAP_FREE(hMet);
+  GDI_HEAP_FREE(hLog);
+  return nRet;
+}
+
+/*************************************************************************
+ *				EnumFontFamiliesW	[GDI32.83]
+ */
+INT32 EnumFontFamilies32W(HDC32 hDC, LPCWSTR lpszFamilyW, FONTENUMPROC32W lpEnumFunc, LPARAM lpData)
+{
+  HLOCAL16     	hLog;
+  HLOCAL16     	hMet;
+  HFONT32	hFont;
+  HFONT32	hOldFont;
+  LPENUMLOGFONT32W	lpEnumLogFont;
+  LPTEXTMETRIC32W	lptm;
+  LPSTR	       	lpOldName;
+  char	       	FaceName[LF_FACESIZE];
+  int	       	nRet = 0;
+  int	       	i;
+  LPCSTR	lpszFamily=lpszFamilyW?STRING32_DupUniToAnsi(lpszFamilyW):NULL;
+  
+  dprintf_font(stddeb,"EnumFontFamilies32W(%04x, %p, %08lx, %08lx)\n",
+	       hDC, lpszFamily, (DWORD)lpEnumFunc, lpData);
+  if (lpEnumFunc == 0) return 0;
+  hLog = GDI_HEAP_ALLOC( sizeof(ENUMLOGFONT32W) );
+  lpEnumLogFont = (LPENUMLOGFONT32W) GDI_HEAP_LIN_ADDR(hLog);
+  if (lpEnumLogFont == NULL) {
+    fprintf(stderr,"EnumFontFamilies32W // can't alloc LOGFONT struct !\n");
+    return 0;
+  }
+  hMet = GDI_HEAP_ALLOC( sizeof(TEXTMETRIC32W) );
+  lptm = (LPTEXTMETRIC32W) GDI_HEAP_LIN_ADDR(hMet);
+  if (lptm == NULL) {
+    GDI_HEAP_FREE(hLog);
+    fprintf(stderr,"EnumFontFamilies32W // can't alloc TEXTMETRIC struct !\n");
+    return 0;
+  }
+  lpOldName = NULL;
+  if (lpszFamily != NULL) {
+    strcpy(FaceName, lpszFamily);
+    AnsiUpper(FaceName);
+  }
+  if (lpLogFontList[0] == NULL) InitFontsList();
+  for(i = 0; lpLogFontList[i] != NULL; i++) {
+    if (lpszFamily == NULL) {
+      if (lpOldName != NULL) {
+	if (strcmp(lpOldName,lpLogFontList[i]->lfFaceName) == 0) continue;
+      }
+      lpOldName = lpLogFontList[i]->lfFaceName;
+    } else {
+      if (strcmp(FaceName, lpLogFontList[i]->lfFaceName) != 0) continue;
+    }
+    FONT_LOGFONT16ToLOGFONT32W(lpLogFontList[i],&(lpEnumLogFont->elfLogFont));
+    lstrcpynAtoW(lpEnumLogFont->elfFullName,"",1);
+    lstrcpynAtoW(lpEnumLogFont->elfStyle,"",1);
+    hFont = CreateFontIndirect32W((LPLOGFONT32W)lpEnumLogFont);
+    hOldFont = SelectObject32(hDC, hFont);
+    GetTextMetrics32W(hDC, lptm);
+    SelectObject32(hDC, hOldFont);
+    DeleteObject32(hFont);
+    dprintf_font(stddeb, "EnumFontFamilies32W // i=%d lpLogFont=%p lptm=%p\n", i, lpEnumLogFont, lptm);
+    
+    nRet = lpEnumFunc( GDI_HEAP_LIN_ADDR(hLog), GDI_HEAP_LIN_ADDR(hMet),
+                       0, lpData );
+    if (nRet == 0) {
+      dprintf_font(stddeb,"EnumFontFamilies32W // EnumEnd requested by application !\n");
+      break;
+    }
+  }
+  GDI_HEAP_FREE(hMet);
+  GDI_HEAP_FREE(hLog);
+  return nRet;
+}
+
+
+/*************************************************************************
  *				GetRasterizerCaps	[GDI.313]
  */
 
diff --git a/objects/metafile.c b/objects/metafile.c
index ad885d6..65e5484 100644
--- a/objects/metafile.c
+++ b/objects/metafile.c
@@ -522,9 +522,9 @@
 	break;
 
     case META_PATBLT:
-	PatBlt(hdc, *(mr->rdParam + 5), *(mr->rdParam + 4),
-	       *(mr->rdParam + 3), *(mr->rdParam + 2),
-	       MAKELONG(*(mr->rdParam), *(mr->rdParam + 1)));
+	PatBlt16(hdc, *(mr->rdParam + 5), *(mr->rdParam + 4),
+                 *(mr->rdParam + 3), *(mr->rdParam + 2),
+                 MAKELONG(*(mr->rdParam), *(mr->rdParam + 1)));
 	break;
 
     case META_SAVEDC:
@@ -705,7 +705,7 @@
                                       mr->rdParam[14], /*BitsPixel*/
                                       (LPSTR)&mr->rdParam[15]);  /*bits*/
        SelectObject32(hdcSrc,hbitmap);
-       StretchBlt(hdc,mr->rdParam[9],mr->rdParam[8],
+       StretchBlt32(hdc,mr->rdParam[9],mr->rdParam[8],
                     mr->rdParam[7],mr->rdParam[6],
 		    hdcSrc,mr->rdParam[5],mr->rdParam[4],
 		    mr->rdParam[3],mr->rdParam[2],
@@ -721,11 +721,10 @@
                             mr->rdParam[10]/*Planes*/,mr->rdParam[11]/*BitsPixel*/,
                             (LPSTR)&mr->rdParam[12]/*bits*/);
        SelectObject32(hdcSrc,hbitmap);
-       BitBlt(hdc,mr->rdParam[6],mr->rdParam[5],
-                    mr->rdParam[4],mr->rdParam[3],
-		    hdcSrc,
-		    mr->rdParam[2],mr->rdParam[1],
-		    MAKELONG(0,mr->rdParam[0]));
+       BitBlt32(hdc,mr->rdParam[6],mr->rdParam[5],
+                mr->rdParam[4],mr->rdParam[3],
+                hdcSrc, mr->rdParam[2],mr->rdParam[1],
+                MAKELONG(0,mr->rdParam[0]));
        DeleteDC(hdcSrc);		    
       }
       break;
@@ -1157,16 +1156,14 @@
  *         MF_BitBlt
  */
 BOOL32 MF_BitBlt(DC *dcDest, short xDest, short yDest, short width,
-                 short height, HDC16 hdcSrc, short xSrc, short ySrc, DWORD rop)
+                 short height, DC *dcSrc, short xSrc, short ySrc, DWORD rop)
 {
     BOOL32 ret;
     DWORD len;
     HGLOBAL16 hmr;
     METARECORD *mr;
-    DC *dcSrc;
     BITMAP16  BM;
 
-    if (!(dcSrc = (DC *) GDI_GetObjPtr( hdcSrc, DC_MAGIC ))) return 0;
     GetObject16(dcSrc->w.hBitmap, sizeof(BITMAP16), &BM);
     len = sizeof(METARECORD) + 12 * sizeof(INT16) + BM.bmWidthBytes * BM.bmHeight;
     if (!(hmr = GlobalAlloc16(GMEM_MOVEABLE, len)))
@@ -1207,20 +1204,18 @@
 #define STRETCH_VIA_DIB
 #undef  STRETCH_VIA_DIB
 BOOL32 MF_StretchBlt(DC *dcDest, short xDest, short yDest, short widthDest,
-                     short heightDest, HDC16 hdcSrc, short xSrc, short ySrc, 
+                     short heightDest, DC *dcSrc, short xSrc, short ySrc, 
                      short widthSrc, short heightSrc, DWORD rop)
 {
     BOOL32 ret;
     DWORD len;
     HGLOBAL16 hmr;
     METARECORD *mr;
-    DC *dcSrc;
     BITMAP16  BM;
 #ifdef STRETCH_VIA_DIB    
     LPBITMAPINFOHEADER lpBMI;
     WORD nBPP;
 #endif  
-    if (!(dcSrc = (DC *) GDI_GetObjPtr( hdcSrc, DC_MAGIC ))) return 0;
     GetObject16(dcSrc->w.hBitmap, sizeof(BITMAP16), &BM);
 #ifdef STRETCH_VIA_DIB
     nBPP = BM.bmPlanes * BM.bmBitsPixel;
@@ -1240,8 +1235,8 @@
     lpBMI->biClrUsed   = nBPP != 24 ? 1 << nBPP : 0;
     lpBMI->biSizeImage = ((lpBMI->biWidth * nBPP + 31) / 32) * 4 * lpBMI->biHeight;
     lpBMI->biCompression = BI_RGB;
-    lpBMI->biXPelsPerMeter = MulDiv32(GetDeviceCaps(hdcSrc,LOGPIXELSX),3937,100);
-    lpBMI->biYPelsPerMeter = MulDiv32(GetDeviceCaps(hdcSrc,LOGPIXELSY),3937,100);
+    lpBMI->biXPelsPerMeter = MulDiv32(GetDeviceCaps(dcSrc->hSelf,LOGPIXELSX),3937,100);
+    lpBMI->biYPelsPerMeter = MulDiv32(GetDeviceCaps(dcSrc->hSelf,LOGPIXELSY),3937,100);
     lpBMI->biClrImportant  = 0;                          /* 1 meter  = 39.37 inch */
 
     dprintf_metafile(stddeb,"MF_StretchBltViaDIB->len = %ld  rop=%lx  PixYPM=%ld Caps=%d\n",
diff --git a/objects/palette.c b/objects/palette.c
index 39a1ae7..7a67571 100644
--- a/objects/palette.c
+++ b/objects/palette.c
@@ -9,8 +9,10 @@
 #include <string.h>
 #include <X11/Xlib.h>
 
+#include "gdi.h"
 #include "color.h"
 #include "palette.h"
+#include "xmalloc.h"
 #include "stddebug.h"
 /* #define DEBUG_PALETTE */
 #include "debug.h"
@@ -120,12 +122,38 @@
  */
 BOOL ResizePalette(HPALETTE16 hPal, UINT cEntries)
 {
+    PALETTEOBJ * palPtr = (PALETTEOBJ *) GDI_GetObjPtr( hPal, PALETTE_MAGIC );
+    UINT	 cPrevEnt, prevVer;
+    int		 prevsize, size = sizeof(LOGPALETTE) + (cEntries - 1) * sizeof(PALETTEENTRY);
+    int*	 mapping = NULL;
 
-    /* should simply realloc memory and zero out
-     * added entries, if any */
+    dprintf_palette(stddeb,"ResizePalette: hpal = %04x, prev = %i, new = %i\n",
+		    hPal, (palPtr)? -1: palPtr->logpalette.palNumEntries, cEntries );
+    if( !palPtr ) return FALSE;
+    cPrevEnt = palPtr->logpalette.palNumEntries;
+    prevVer = palPtr->logpalette.palVersion;
+    prevsize = sizeof(LOGPALETTE) + (cPrevEnt - 1) * sizeof(PALETTEENTRY) +
+	      				sizeof(int*) + sizeof(GDIOBJHDR);
+    size += sizeof(int*) + sizeof(GDIOBJHDR);
+    mapping = palPtr->mapping;
 
-    fprintf(stdnimp,"ResizePalette: empty stub! \n");
-    return FALSE;
+    GDI_HEAP_REALLOC( hPal, size );
+    palPtr = (PALETTEOBJ *) GDI_GetObjPtr( hPal, PALETTE_MAGIC );
+    if( !palPtr ) return FALSE;
+
+    if( mapping )
+        palPtr->mapping = (int*) xrealloc( mapping, cEntries * sizeof(int) );
+    if( cEntries > cPrevEnt ) 
+    {
+	if( mapping )
+	    memset(palPtr->mapping + cPrevEnt, 0, (cEntries - cPrevEnt)*sizeof(int));
+	memset( (BYTE*)palPtr + prevsize, 0, size - prevsize );
+        PALETTE_ValidateFlags((PALETTEENTRY*)((BYTE*)palPtr + prevsize), 
+						     cEntries - cPrevEnt );
+    }
+    palPtr->logpalette.palNumEntries = cEntries;
+    palPtr->logpalette.palVersion = prevVer;
+    return TRUE;
 }
 
 /***********************************************************************
diff --git a/objects/region.c b/objects/region.c
index 4404062..40dae541 100644
--- a/objects/region.c
+++ b/objects/region.c
@@ -487,7 +487,7 @@
  *
  * Add rectangle to region
  */
-BOOL32 REGION_UnionRectWithRgn( HRGN32 hRgn, LPRECT16 rc )
+BOOL32 REGION_UnionRectWithRgn( HRGN32 hRgn, const RECT32 *rc )
 {
   RGNOBJ 	*rgnObj = (RGNOBJ*) GDI_GetObjPtr( hRgn, REGION_MAGIC );
   XRectangle     rect = { rc->left, rc->top, rc->right - rc->left, rc->bottom - rc->top };
diff --git a/objects/text.c b/objects/text.c
index 1862afe..782fe70 100644
--- a/objects/text.c
+++ b/objects/text.c
@@ -447,17 +447,9 @@
 
     if (flags & ETO_CLIPPED)
     {
-       if (dc->w.flags & DC_MEMORY)
-       {
-	  hRgnClip = dc->w.hClipRgn;
-	  CLIPPING_IntersectClipRect(dc, rect.left, rect.top, rect.right, rect.bottom,
-					 CLIP_INTERSECT | CLIP_KEEPRGN);
-       }
-       else
-       { 
-          SaveVisRgn( hdc );
-          IntersectVisRect( hdc, rect.left, rect.top, rect.right, rect.bottom );
-       }
+        hRgnClip = dc->w.hClipRgn;
+        CLIPPING_IntersectClipRect( dc, rect.left, rect.top, rect.right,
+                                    rect.bottom, CLIP_INTERSECT|CLIP_KEEPRGN );
     }
 
       /* Draw the text background if necessary */
@@ -565,11 +557,7 @@
 		   dc->w.DCOrgX + x + info.width, dc->w.DCOrgY + y - lineAscent );
     }
 
-    if (flags & ETO_CLIPPED) 
-    {
-	if (dc->w.flags & DC_MEMORY) SelectClipRgn16( hdc, hRgnClip );
-	else RestoreVisRgn( hdc );
-    }
+    if (flags & ETO_CLIPPED) SelectClipRgn32( hdc, hRgnClip );
     return TRUE;
 }
 
diff --git a/programs/progman/Makefile.in b/programs/progman/Makefile.in
index ddf06ce..ea2e954 100644
--- a/programs/progman/Makefile.in
+++ b/programs/progman/Makefile.in
@@ -6,6 +6,7 @@
 PROGRAMS  = progman
 ALL_LIBS  = $(WINELIB) $(X_LIBS) $(XPM_LIB) $(XLIB) $(LDLIBS)
 DEFS      = -I$(SRCDIR)
+RCFLAGS   = -w32
 
 LANGUAGES   = En De Fr Fi
 LICENSELANG = En
diff --git a/programs/winhelp/Makefile.in b/programs/winhelp/Makefile.in
index cb6a691..d70b716 100644
--- a/programs/winhelp/Makefile.in
+++ b/programs/winhelp/Makefile.in
@@ -5,6 +5,7 @@
 MODULE    = none
 PROGRAMS  = winhelp hlp2sgml
 ALL_LIBS  = $(WINELIB) $(X_LIBS) $(XPM_LIB) $(XLIB) $(LDLIBS)
+RCFLAGS   = -w32
 
 LANGUAGES   = En De Fr Fi
 
diff --git a/rc/winerc.c b/rc/winerc.c
index 43a27f3..63a9f4e 100644
--- a/rc/winerc.c
+++ b/rc/winerc.c
@@ -21,11 +21,12 @@
 	"   -d            Output debugging information\n"
 	"   -p prefix     Give a prefix for the generated names\n"
 	"   -v            Show each resource as it is processed\n"
-	"   -o file       Output to file.c and file.h\n";
-
+	"   -o file       Output to file.c and file.h\n"
+	"   -w 16|32      Select win16 or win32 output\n";
 
 /*might be overwritten by command line*/
 char *prefix="_Resource";
+int win32=1;
 int verbose,constant;
 gen_res* g_start;
 FILE *header,*code;
@@ -55,7 +56,7 @@
 	char* tmpc;
 	int optc,lose,ret,binary;
 	lose=binary=0;
-	while((optc=getopt(argc,argv,"bcdp:vo:"))!=EOF)
+	while((optc=getopt(argc,argv,"bcdp:vo:w:"))!=EOF)
 		switch(optc)
 		{
 			/* bison will print state transitions on stderr */
@@ -76,6 +77,10 @@
 					 setbuf(stderr,0);
 					break;
 			case 'o':set_out_file(optarg);break;
+			case 'w':if(!strcmp(optarg,"16"))win32=0;
+				 else if(!strcmp(optarg,"32"))win32=1;
+				 else lose++;
+				 break;
 			default: lose++;break;
 		}
 	if(lose)return fprintf(stderr,usage),1;
@@ -195,6 +200,35 @@
 	return res;
 }
 
+/* insert string into res, starting at start */
+gen_res* insert_string(gen_res* res,unsigned char* string,int start,int terminating0)
+{
+	unsigned char* p;
+	int lengthA = strlen(string) + (terminating0 ? 1 : 0);
+	int length = (win32 ? 2 : 1) * lengthA; 
+	while(res->size+length>res->space)res=grow(res);
+	save_memcpy(res->res+start+length,res->res+start,res->size-start);
+	p=res->res+start;
+	while(lengthA--)
+		if (win32)
+		{
+			put_WORD(p, *string++);
+			p+=2;
+		}
+		else
+			*p++=*string++;
+	res->size+=length;
+	return res;
+}
+
+/* insert string at offset 0, increase num_entries */
+gen_res* insert_string_at_beginning(gen_res* res,char* entry,int terminating0)
+{
+	res=insert_string(res,entry,0,terminating0);
+	res->num_entries++;
+	return res;
+}
+
 /*delete len bytes from res, starting at start*/
 gen_res* delete_bytes(gen_res* res,int start,int len)
 {
@@ -253,7 +287,7 @@
 /* create a new dialog header, set all items to 0 */
 gen_res* new_dialog()
 {	gen_res* ret=new_res();
-	ret->size=16; /*all strings "\0", no font*/
+	ret->size=win32?24:16; /*all strings "\0", no font*/
 	return ret;
 }
 
@@ -266,18 +300,18 @@
 	return attr;
 }
 
-/* menu name is at offset 13 */
+/* menu name is at offset 13 (win32: 18) */
 int dialog_get_menu(gen_res* attr)
 {
-	return 13;
+	return win32?18:13;
 }
 
 /* the class is after the menu name */
 int dialog_get_class(gen_res* attr)
 {
 	int offs=dialog_get_menu(attr);
-	while(attr->res[offs])offs++;
-	offs++;
+	while(attr->res[offs]||(win32&&attr->res[offs+1]))offs+=win32?2:1;
+	offs+=win32?2:1;
 	return offs;
 }
 
@@ -285,8 +319,8 @@
 int dialog_get_caption(gen_res* attr)
 {
 	int offs=dialog_get_class(attr);
-	while(attr->res[offs])offs++;
-	offs++;
+	while(attr->res[offs]||(win32&&attr->res[offs+1]))offs+=win32?2:1;
+	offs+=win32?2:1;
 	return offs;
 }
 
@@ -294,8 +328,8 @@
 int dialog_get_fontsize(gen_res* attr)
 {
 	int offs=dialog_get_caption(attr);
-	while(attr->res[offs])offs++;
-	offs++;
+	while(attr->res[offs]||(win32&&attr->res[offs+1]))offs+=win32?2:1;
+	offs+=win32?2:1;
 	return offs;
 }
 
@@ -304,7 +338,7 @@
 gen_res* dialog_caption(char* cap, gen_res*attr)
 {
 	/* we don't need the terminating 0 as it's already there */
-	return insert_bytes(attr,cap,dialog_get_caption(attr),strlen(cap));
+	return insert_string(attr,cap,dialog_get_caption(attr),0);
 }
 
 
@@ -318,31 +352,47 @@
 	attr=insert_bytes(attr,c_size,offs,2);
 	offs+=2;
 	/* as there is no font name by default, copy the '\0' */
-	return insert_bytes(attr,font,offs,strlen(font)+1);
+	return insert_string(attr,font,offs,1);
 }
 
 gen_res* dialog_class(char* cap, gen_res*attr)
 {
-	return insert_bytes(attr,cap,dialog_get_class(attr),strlen(cap));
+	return insert_string(attr,cap,dialog_get_class(attr),0);
 }
 
 gen_res* dialog_menu(char* cap, gen_res*attr)
 {
-	return insert_bytes(attr,cap,dialog_get_menu(attr),strlen(cap));
+	return insert_string(attr,cap,dialog_get_menu(attr),0);
 }
 
 /* set the dialogs id, position, extent, and style */
 gen_res* create_control_desc(int id,int x,int y,int cx, int cy,rc_style *style)
 {	gen_res* ret=new_res();
 	int s=WS_VISIBLE|WS_CHILD; /*defaults styles for any control*/
-	put_WORD(ret->res+0,x);
-	put_WORD(ret->res+2,y);
-	put_WORD(ret->res+4,cx);
-	put_WORD(ret->res+6,cy);
-	put_WORD(ret->res+8,id);
-	if(style)s=(s|style->or)&style->and;
-	put_DWORD(ret->res+10,s);
-	ret->size=17; /*empty strings, unused byte*/
+	if(win32)
+	{
+		if(style)s=(s|style->or)&style->and;
+		put_DWORD(ret->res+0,s);
+		/* FIXME */
+		/* put_WORD(ret->res+4, exStyle); */
+		put_WORD(ret->res+8,x);
+		put_WORD(ret->res+10,y);
+		put_WORD(ret->res+12,cx);
+		put_WORD(ret->res+14,cy);
+		put_WORD(ret->res+16,id);
+		ret->size=24; /*empty strings, unused byte*/
+	}
+	else
+	{
+		put_WORD(ret->res+0,x);
+		put_WORD(ret->res+2,y);
+		put_WORD(ret->res+4,cx);
+		put_WORD(ret->res+6,cy);
+		put_WORD(ret->res+8,id);
+		if(style)s=(s|style->or)&style->and;
+		put_DWORD(ret->res+10,s);
+		ret->size=17; /*empty strings, unused byte*/
+	}
 	return ret;
 }
 
@@ -350,45 +400,99 @@
 gen_res* label_control_desc(char* label,gen_res* cd)
 {
 	int offs;
-	if(cd->res[14]&0x80)offs=15; /* one-character class */
-	else {
-		for(offs=14;cd->res[offs];offs++);
-		offs++;
+	if(win32) {
+		if(get_WORD(cd->res+18)==0xffff)offs=20; /* one-character class */
+		else {
+			for(offs=18;get_WORD(cd->res+offs);offs+=2);
+			offs+=2;
+		}
 	}
-	return insert_bytes(cd,label,offs,strlen(label));
+	else {
+		if(cd->res[14]&0x80)offs=15; /* one-character class */
+		else {
+			for(offs=14;cd->res[offs];offs++);
+			offs++;
+		}
+	}
+	return insert_string(cd,label,offs,0);
 }
 
 /* a CONTROL was specified */
 gen_res* create_generic_control(char* label,int id,char* class,
 	rc_style*style,int x,int y,int cx,int cy)
-{	char cl;
-	gen_res* ret=new_res();
-	put_WORD(ret->res+0,x);
-    put_WORD(ret->res+2,y);
-    put_WORD(ret->res+4,cx);
-    put_WORD(ret->res+6,cy);
-    put_WORD(ret->res+8,id);
-	put_DWORD(ret->res+10,style->or);
-	ret->size=17;
-	ret=insert_bytes(ret,label,15,strlen(label));
-	/* is it a predefined class? */
-	cl=0;
-	if(!strcmp(class,"BUTTON"))cl=CT_BUTTON;
-	if(!strcmp(class,"EDIT"))cl=CT_EDIT;
-	if(!strcmp(class,"STATIC"))cl=CT_STATIC;
-	if(!strcmp(class,"LISTBOX"))cl=CT_LISTBOX;
-	if(!strcmp(class,"SCROLLBAR"))cl=CT_SCROLLBAR;
-	if(!strcmp(class,"COMBOBOX"))cl=CT_COMBOBOX;
-	if(cl)ret->res[14]=cl;
-	else ret=insert_bytes(ret,class,14,strlen(class));
+{	gen_res* ret=new_res();
+	if(win32)
+	{
+		WORD cl;
+		put_DWORD(ret->res+0,style->or);
+		/* FIXME */
+		/* put_DWORD(ret->res+4,exstyle->or); */
+		put_WORD(ret->res+8,x);
+		put_WORD(ret->res+10,y);
+		put_WORD(ret->res+12,cx);
+		put_WORD(ret->res+14,cy);
+		put_WORD(ret->res+16,id);
+		ret->size=win32?24:17;
+		ret=insert_string(ret,label,20,0);
+		/* is it a predefined class? */
+		cl=0;
+		if(!strcmp(class,"BUTTON"))cl=CT_BUTTON;
+		if(!strcmp(class,"EDIT"))cl=CT_EDIT;
+		if(!strcmp(class,"STATIC"))cl=CT_STATIC;
+		if(!strcmp(class,"LISTBOX"))cl=CT_LISTBOX;
+		if(!strcmp(class,"SCROLLBAR"))cl=CT_SCROLLBAR;
+		if(!strcmp(class,"COMBOBOX"))cl=CT_COMBOBOX;
+		if(cl) {
+			char ffff[2]={0xff, 0xff};
+			ret=insert_bytes(ret,ffff,18,2);
+			put_WORD(ret->res+20,cl);
+		}
+		else ret=insert_string(ret,class,18,0);
+	}
+	else
+	{
+		char cl;
+		put_WORD(ret->res+0,x);
+		put_WORD(ret->res+2,y);
+		put_WORD(ret->res+4,cx);
+		put_WORD(ret->res+6,cy);
+		put_WORD(ret->res+8,id);
+		put_DWORD(ret->res+10,style->or);
+		ret->size=17;
+		ret=insert_string(ret,label,15,0);
+		/* is it a predefined class? */
+		cl=0;
+		if(!strcmp(class,"BUTTON"))cl=CT_BUTTON;
+		if(!strcmp(class,"EDIT"))cl=CT_EDIT;
+		if(!strcmp(class,"STATIC"))cl=CT_STATIC;
+		if(!strcmp(class,"LISTBOX"))cl=CT_LISTBOX;
+		if(!strcmp(class,"SCROLLBAR"))cl=CT_SCROLLBAR;
+		if(!strcmp(class,"COMBOBOX"))cl=CT_COMBOBOX;
+		if(cl)ret->res[14]=cl;
+		else ret=insert_string(ret,class,14,0);
+	}
 	return ret;
 }
 
 /* insert cd into rest, set the type, add flags */
 gen_res* add_control(int type,int flags,gen_res*cd,gen_res* rest)
 {
-	put_DWORD(cd->res+10,get_DWORD(cd->res+10)|flags);
-	cd->res[14]=type;
+	char zeros[4]={0,0,0,0};
+	if(win32)
+	{
+		char ffff[2]={0xff, 0xff};
+		put_DWORD(cd->res+0,get_DWORD(cd->res+0)|flags);
+		cd=insert_bytes(cd,ffff,18,2);
+		put_WORD(cd->res+20,type);
+	}
+	else
+	{
+		put_DWORD(cd->res+10,get_DWORD(cd->res+10)|flags);
+		cd->res[14]=type;
+	}
+	/* WIN32: First control is on dword boundary */
+	if(win32 && cd->size%4)
+		cd=insert_bytes(cd,zeros,cd->size,4-cd->size%4);
 	return insert_at_beginning(rest,cd->res,cd->size);
 }
 
@@ -412,12 +516,28 @@
    Set position and extent */
 gen_res* make_dialog(gen_res* header,int x,int y,int cx,int cy,gen_res* ctls)
 {
-	header->res[4]=ctls->num_entries;
-	header->type=dlg;
-	put_WORD(header->res+5,x);
-	put_WORD(header->res+7,y);
-	put_WORD(header->res+9,cx);
-	put_WORD(header->res+11,cy);
+	char zeros[4]={0,0,0,0};
+	if(win32)
+	{
+		put_WORD(header->res+8, ctls->num_entries);
+		header->type=dlg;
+		put_WORD(header->res+10,x);
+		put_WORD(header->res+12,y);
+		put_WORD(header->res+14,cx);
+		put_WORD(header->res+16,cy);
+	}
+	else
+	{
+		header->res[4]=ctls->num_entries;
+		header->type=dlg;
+		put_WORD(header->res+5,x);
+		put_WORD(header->res+7,y);
+		put_WORD(header->res+9,cx);
+		put_WORD(header->res+11,cy);
+	}
+	/* WIN32: First control is on dword boundary */
+	if(win32 && header->size%4)
+		header=insert_bytes(header,zeros,header->size,4-header->size%4);
 	return insert_bytes(header,ctls->res,header->size,ctls->size);
 }
 
@@ -473,7 +593,7 @@
 	if(res->num_entries==0)flags|=MF_END;
 	put_WORD(item,flags);
 	put_WORD(item+2,id);
-	res=insert_at_beginning(res,name,strlen(name)+1);
+	res=insert_string_at_beginning(res,name,1);
 	res=insert_bytes(res,item,0,4);
 	return res;
 }
@@ -486,7 +606,7 @@
 	if(res->num_entries==0)flags|=MF_END;
 	put_WORD(c_flags,flags);
 	res=insert_at_beginning(res,body->res,body->size);
-	res=insert_bytes(res,name,0,strlen(name)+1);
+	res=insert_string(res,name,0,1);
 	res=insert_bytes(res,c_flags,0,2);
 	return res;
 }
@@ -543,27 +663,45 @@
   int size,i;
   gen_res* res;
   unsigned char* p;
-  char* q;
+  unsigned char* q;
 
   if(!string_table) return t;
   for(ste=string_table; ste; ste=ste->next)
   {
     for(size=0,i=0; i<16; i++)
-      size += ste->strings[i] ? strlen(ste->strings[i])+1 : 1;
+      size += (win32 ? 2 : 1) * (ste->strings[i] ? strlen(ste->strings[i])+1 : 1);
     res=new_res();
     while(res->space<size)res=grow(res);
     res->type=str;
     res->n.i_name=ste->group;
     res->n_type=0;
     res->size=size;
-    for(p=res->res,i=0; i<16; i++)
-      if((q=ste->strings[i])==NULL)
-	*p++ = 0;
-      else
-      {
-	*p++ = strlen(q);
-	while(*q) *p++ = *q++;
-      }
+    if (win32)
+      for(p=res->res,i=0; i<16; i++)
+        if((q=ste->strings[i])==NULL)
+        {
+	  put_WORD(p, 0);
+	  p+=2;
+	}
+	else
+	{
+	  put_WORD(p, strlen(q));
+	  p+=2;
+	  while(*q)
+	  {
+	    put_WORD(p, *q++);
+	    p+=2;
+	  }
+	}
+    else
+      for(p=res->res,i=0; i<16; i++)
+	if((q=ste->strings[i])==NULL)
+	  *p++ = 0;
+	else
+	{
+	  *p++ = strlen(q);
+	  while(*q) *p++ = *q++;
+	}
     t=add_resource(res,t);
   }
   return t;
@@ -628,8 +766,9 @@
     for(it=top;it;it=it->next)
     {
         int i;
-        fprintf( code, "static %sunsigned char %s__bytes[] = {\n",
-                 ISCONSTANT, get_resource_name(it) );
+        fprintf( code, "static %sunsigned char %s__bytes[]%s = {\n",
+                 ISCONSTANT, get_resource_name(it),
+		 win32?"\n__attribute__ ((aligned (4)))":"");
         for (i=0;i<it->size-1;i++)
         {
             fprintf(code,"0x%02x, ",it->res[i]);
@@ -638,6 +777,25 @@
         fprintf(code,"0x%02x };\n\n",it->res[i]);
     }
 
+    /* Print the resources names */
+
+    if (win32)
+        for(it=top;it;it=it->next)
+        {
+            int i;
+	    char s_buffer[20], *s_name=s_buffer;
+	    if(it->n_type) s_name=it->n.s_name;
+	    else sprintf(s_name,"@%d",it->n.i_name);
+	    fprintf( code, "static %sunsigned char %s__name[] = {\n",
+		     ISCONSTANT, get_resource_name(it) );
+	    for (i=0;*s_name;i++,s_name++)
+	      {
+		fprintf(code,"0x%02x, 0x00, ",*s_name);
+		if ((i&3)==3)fputc('\n',code);
+	      }
+	    fprintf(code,"0x00, 0x00};\n\n");
+	}
+
     /* Print the resources */
     for (it=top;it;it=it->next)
     {
@@ -655,14 +813,28 @@
         case str:type=(int)RT_STRING;break;
         default:fprintf(stderr,"Unknown restype\n");type=-1;break;
         }
-        if(it->n_type)
-            fprintf(code,"%sstruct resource %s = {0,%d,\"%s\",%s__bytes,%d};\n",
-                    ISCONSTANT, get_resource_name(it), type, it->n.s_name,
-                    get_resource_name(it), it->size );
-        else
-            fprintf(code,"%sstruct resource %s = {%d,%d,\"@%d\",%s__bytes,%d};\n",
-                    ISCONSTANT, get_resource_name(it), it->n.i_name, type,
-                    it->n.i_name, get_resource_name(it), it->size );
+	if(win32)
+	{
+            if(it->n_type)
+                fprintf(code,"%sstruct resource %s = {0,%d,%s__name,%s__bytes,%d};\n",
+			ISCONSTANT, get_resource_name(it), type, get_resource_name(it),
+			get_resource_name(it), it->size );
+	    else
+	        fprintf(code,"%sstruct resource %s = {%d,%d,%s__name,%s__bytes,%d};\n",
+			ISCONSTANT, get_resource_name(it), it->n.i_name, type,
+			get_resource_name(it), get_resource_name(it), it->size );
+	}
+	else
+	{
+            if(it->n_type)
+                fprintf(code,"%sstruct resource %s = {0,%d,\"%s\",%s__bytes,%d};\n",
+			ISCONSTANT, get_resource_name(it), type, it->n.s_name,
+			get_resource_name(it), it->size );
+	    else
+	        fprintf(code,"%sstruct resource %s = {%d,%d,\"@%d\",%s__bytes,%d};\n",
+			ISCONSTANT, get_resource_name(it), it->n.i_name, type,
+			it->n.i_name, get_resource_name(it), it->size );
+	}
     }
 
     /* Print the resource table (NULL terminated) */
diff --git a/resources/Makefile.in b/resources/Makefile.in
index e24d54f..f4f1e5c 100644
--- a/resources/Makefile.in
+++ b/resources/Makefile.in
@@ -4,6 +4,7 @@
 SRCDIR    = @srcdir@
 VPATH     = @srcdir@
 MODULE    = resources
+RCFLAGS   = -w16
 
 SYSRES_SRCS = \
 	sysres_Cz.c \
diff --git a/win32/code_page.c b/win32/code_page.c
index 731dd45..2d60fc4 100644
--- a/win32/code_page.c
+++ b/win32/code_page.c
@@ -5,11 +5,13 @@
  */
 
 #include <stdio.h>
+#include <malloc.h>
 #include "windows.h"
 #include "winerror.h"
 #include "winnls.h"
 #include "stddebug.h"
 #include "debug.h"
+#include "string32.h"
 
 
 /***********************************************************************
@@ -84,4 +86,30 @@
 	return count;
 }
 
-		
+/***********************************************************************
+ *              EnumSystemCodePages32A                (KERNEL32.92)
+ */
+BOOL32
+EnumSystemCodePages32A(CODEPAGE_ENUMPROC32A lpfnCodePageEnum,DWORD flags) {
+	dprintf_win32(stddeb,"EnumSystemCodePages32A(%p,%08lx)\n",
+		lpfnCodePageEnum,flags
+	);
+	lpfnCodePageEnum("437");
+	return TRUE;
+}
+
+/***********************************************************************
+ *              EnumSystemCodePages32W                (KERNEL32.93)
+ */
+BOOL32
+EnumSystemCodePages32W(CODEPAGE_ENUMPROC32W lpfnCodePageEnum,DWORD flags) {
+	WCHAR	*cp;
+	dprintf_win32(stddeb,"EnumSystemCodePages32W(%p,%08lx)\n",
+		lpfnCodePageEnum,flags
+	);
+
+	cp=STRING32_DupAnsiToUni("437");
+	lpfnCodePageEnum(cp);
+	free(cp);
+	return TRUE;
+}
diff --git a/win32/file.c b/win32/file.c
index 150322b..925de51 100644
--- a/win32/file.c
+++ b/win32/file.c
@@ -26,7 +26,6 @@
 #include "debug.h"
 
 
-static void UnixTimeToFileTime(time_t unix_time, FILETIME *filetime);
 static int TranslateCreationFlags(DWORD create_flags);
 static int TranslateAccessFlags(DWORD access_flags);
 int TranslateProtectionFlags(DWORD);
@@ -54,6 +53,9 @@
     HFILE hfile;
     FILEMAP_OBJECT *filemap_obj;
 
+    dprintf_win32(stddeb,"CreateFileMapping32A(%08x,%p,%ld,%ld,%ld,%s)\n",
+    	h,ats,pot,sh,hlow,lpName
+    );
     if (sh) {
         SetLastError(ErrnoToLastError(errno));
         return INVALID_HANDLE_VALUE;
@@ -94,6 +96,16 @@
 
 
 /***********************************************************************
+ *           MapViewOfFile                  (KERNEL32.385)
+ *
+ */
+LPVOID MapViewOfFile(HANDLE32 handle, DWORD access, DWORD offhi,
+                      DWORD offlo, DWORD size)
+{
+    return MapViewOfFileEx(handle,access,offhi,offlo,size,0);
+}
+
+/***********************************************************************
  *           MapViewOfFileEx                  (KERNEL32.386)
  *
  */
@@ -138,9 +150,9 @@
     /* Translate the file times.  Use the last modification time
      * for both the creation time and write time.
      */
-    UnixTimeToFileTime(file_stat.st_mtime, &(lpfi->ftCreationTime));
-    UnixTimeToFileTime(file_stat.st_mtime, &(lpfi->ftLastWriteTime));
-    UnixTimeToFileTime(file_stat.st_atime, &(lpfi->ftLastAccessTime));
+    DOSFS_UnixTimeToFileTime(file_stat.st_mtime, &(lpfi->ftCreationTime));
+    DOSFS_UnixTimeToFileTime(file_stat.st_mtime, &(lpfi->ftLastWriteTime));
+    DOSFS_UnixTimeToFileTime(file_stat.st_atime, &(lpfi->ftLastAccessTime));
 
     lpfi->nFileSizeLow = file_stat.st_size;
     lpfi->nNumberOfLinks = file_stat.st_nlink;
@@ -155,19 +167,18 @@
     return 1;
 }
 
-static void UnixTimeToFileTime(time_t unix_time, FILETIME *filetime)
-{
-    /* This isn't anywhere close to being correct, but should
-     * work for now.
-     */
-    filetime->dwLowDateTime  = (unix_time & 0x0000FFFF) << 16;
-    filetime->dwHighDateTime = (unix_time & 0xFFFF0000) >> 16;
-}
+/***********************************************************************
+ *           GetFileSize             (KERNEL32.220)
+ */
+DWORD GetFileSize(HFILE hf,LPDWORD filesizehigh) {
+    BY_HANDLE_FILE_INFORMATION	fi;
+	DWORD	res = GetFileInformationByHandle(hf,&fi);
 
-time_t FileTimeToUnixTime(FILETIME *filetime)
-{
-    /* reverse of UnixTimeToFileTime */
-    return (filetime->dwLowDateTime>>16)+(filetime->dwHighDateTime<<16);
+	if (!res) 
+		return 0;	/* FIXME: correct ? */
+	if (filesizehigh) 
+		*filesizehigh = fi.nFileSizeHigh;
+	return fi.nFileSizeLow;
 }
 
 /***********************************************************************
diff --git a/win32/findfile.c b/win32/findfile.c
index 8f9bf52..50bb75d 100644
--- a/win32/findfile.c
+++ b/win32/findfile.c
@@ -188,6 +188,8 @@
 {
     FindFileContext32 *context;
 
+	if (handle==(INVALID_HANDLE_VALUE))
+		return TRUE;
     context = (FindFileContext32 *) handle;
     if (context->dir)
 	closedir(context->dir);
diff --git a/win32/init.c b/win32/init.c
index 5fa1b3a..8585a93 100644
--- a/win32/init.c
+++ b/win32/init.c
@@ -55,15 +55,6 @@
 }
 
 /***********************************************************************
- *              GetModuleFileNameA      (KERNEL32.235)
- */
-DWORD GetModuleFileNameA(HMODULE32 hModule, LPSTR lpFilename, DWORD nSize)
-{
-    strcpy(lpFilename, "c:\\dummy");
-    return 8;
-}
-
-/***********************************************************************
  *              GetModuleHandle         (KERNEL32.237)
  */
 HMODULE32 WIN32_GetModuleHandle(char *module)
@@ -99,6 +90,26 @@
     lpStartupInfo->hStdError  = (HANDLE32)2;
 }
 
+/***********************************************************************
+ *              GetStartupInfoA         (KERNEL32.284)
+ * FIXME: perhaps supply better values.
+ */
+VOID
+GetSystemInfo(LPSYSTEM_INFO si) {
+    si->dwOemId		= 0x12345678;
+    si->dwPageSize	= 4096; /* 4K */
+    si->lpMinimumApplicationAddress = 0x40000000;
+    si->lpMaximumApplicationAddress = 0x80000000;
+    si->dwActiveProcessorMask       = 1;
+    si->dwNumberOfProcessors        = 1;
+#ifdef WINELIB
+    si->dwProcessorType             = 3;
+#else
+    si->dwProcessorType             = runtime_cpu();
+#endif
+    si->dwAllocationGranularity     = 8; /* hmm? */
+}
+
 /* Initialize whatever internal data structures we need.
  *
  * Returns 1 on success, 0 on failure.
diff --git a/win32/thread.c b/win32/thread.c
index 1495f7c..37e3c54 100644
--- a/win32/thread.c
+++ b/win32/thread.c
@@ -67,8 +67,11 @@
 	return;
 }
 
-void
-ReinitializeCriticalSection(CRITICAL_SECTION *lpCrit) {
+void ReinitializeCriticalSection(CRITICAL_SECTION *lpCrit) {
+	/* hmm */
+}
+
+void MakeCriticalSectionGlobal(CRITICAL_SECTION *lpCrit) {
 	/* hmm */
 }
 
diff --git a/windows/caret.c b/windows/caret.c
index 041eff0..99c955f 100644
--- a/windows/caret.c
+++ b/windows/caret.c
@@ -60,7 +60,7 @@
     Caret.on = !Caret.on;
     if (!(hdc = GetDCEx32( Caret.hwnd, 0, DCX_USESTYLE | DCX_CACHE ))) return;
     hPrevBrush = SelectObject32( hdc, Caret.hBrush );
-    PatBlt( hdc, Caret.x, Caret.y, Caret.width, Caret.height, PATINVERT );
+    PatBlt32( hdc, Caret.x, Caret.y, Caret.width, Caret.height, PATINVERT );
     SelectObject32( hdc, hPrevBrush );
     ReleaseDC32( Caret.hwnd, hdc );
 }
diff --git a/windows/dce.c b/windows/dce.c
index d83b8bb..5a7c9e0 100644
--- a/windows/dce.c
+++ b/windows/dce.c
@@ -331,8 +331,8 @@
         wndPtr = wndPtr->parent;
         xoffset -= wndPtr->rectClient.left;
         yoffset -= wndPtr->rectClient.top;
-        hrgn = DCE_ClipWindows( wndPtr->parent->child, wndPtr,
-                                hrgn, xoffset, yoffset );
+        hrgn = DCE_ClipWindows( wndPtr->parent ? wndPtr->parent->child : NULL,
+                                wndPtr, hrgn, xoffset, yoffset );
         if (!hrgn) return 0;
     }
     return hrgn;
diff --git a/windows/dialog.c b/windows/dialog.c
index 17a349a..03a0ddf 100644
--- a/windows/dialog.c
+++ b/windows/dialog.c
@@ -1320,3 +1320,143 @@
     }
     return pWndLast->hwndSelf;
 }
+
+
+/**********************************************************************
+ *           DIALOG_DlgDirSelect
+ *
+ * Helper function for DlgDirSelect*
+ */
+static BOOL32 DIALOG_DlgDirSelect( HWND32 hwnd, LPSTR str, INT32 len,
+                                   INT32 id, BOOL32 win32, BOOL32 unicode,
+                                   BOOL32 combo )
+{
+    char *buffer, *ptr;
+    INT32 item, size;
+    BOOL32 ret;
+    HWND32 listbox = GetDlgItem( hwnd, id );
+
+    dprintf_dialog( stddeb, "DlgDirSelect: %04x '%s' %d\n", hwnd, str, id );
+    if (!listbox) return FALSE;
+    if (win32)
+    {
+        item = SendMessage32A(listbox, combo ? CB_GETCURSEL32
+                                             : LB_GETCURSEL32, 0, 0 );
+        if (item == LB_ERR) return FALSE;
+        size = SendMessage32A(listbox, combo ? CB_GETLBTEXTLEN32
+                                             : LB_GETTEXTLEN32, 0, 0 );
+        if (size == LB_ERR) return FALSE;
+    }
+    else
+    {
+        item = SendMessage32A(listbox, combo ? CB_GETCURSEL16
+                                             : LB_GETCURSEL16, 0, 0 );
+        if (item == LB_ERR) return FALSE;
+        size = SendMessage32A(listbox, combo ? CB_GETLBTEXTLEN16
+                                             : LB_GETTEXTLEN16, 0, 0 );
+        if (size == LB_ERR) return FALSE;
+    }
+
+    if (!(buffer = SEGPTR_ALLOC( size+1 ))) return FALSE;
+
+    if (win32)
+        SendMessage32A( listbox, combo ? CB_GETLBTEXT32 : LB_GETTEXT32,
+                        item, (LPARAM)buffer );
+    else
+        SendMessage16( listbox, combo ? CB_GETLBTEXT16 : LB_GETTEXT16,
+                       item, (LPARAM)SEGPTR_GET(buffer) );
+
+    if ((ret = (buffer[0] == '[')))  /* drive or directory */
+    {
+        if (buffer[1] == '-')  /* drive */
+        {
+            buffer[3] = ':';
+            buffer[4] = 0;
+            ptr = buffer + 2;
+        }
+        else
+        {
+            buffer[strlen(buffer)-1] = '\\';
+            ptr = buffer + 1;
+        }
+    }
+    else ptr = buffer;
+
+    if (unicode) lstrcpynAtoW( (LPWSTR)str, ptr, len );
+    else lstrcpyn32A( str, ptr, len );
+    SEGPTR_FREE( buffer );
+    dprintf_dialog( stddeb, "Returning %d '%s'\n", ret, str );
+    return ret;
+}
+
+
+/**********************************************************************
+ *	    DlgDirSelect    (USER.99)
+ */
+BOOL16 DlgDirSelect( HWND16 hwnd, LPSTR str, INT16 id )
+{
+    return DlgDirSelectEx16( hwnd, str, 128, id );
+}
+
+
+/**********************************************************************
+ *	    DlgDirSelectComboBox    (USER.194)
+ */
+BOOL16 DlgDirSelectComboBox( HWND16 hwnd, LPSTR str, INT16 id )
+{
+    return DlgDirSelectComboBoxEx16( hwnd, str, 128, id );
+}
+
+
+/**********************************************************************
+ *           DlgDirSelectEx16    (USER.422)
+ */
+BOOL16 DlgDirSelectEx16( HWND16 hwnd, LPSTR str, INT16 len, INT16 id )
+{
+    return DIALOG_DlgDirSelect( hwnd, str, len, id, FALSE, FALSE, FALSE );
+}
+
+
+/**********************************************************************
+ *           DlgDirSelectEx32A    (USER32.148)
+ */
+BOOL32 DlgDirSelectEx32A( HWND32 hwnd, LPSTR str, INT32 len, INT32 id )
+{
+    return DIALOG_DlgDirSelect( hwnd, str, len, id, TRUE, FALSE, FALSE );
+}
+
+
+/**********************************************************************
+ *           DlgDirSelectEx32W    (USER32.149)
+ */
+BOOL32 DlgDirSelectEx32W( HWND32 hwnd, LPWSTR str, INT32 len, INT32 id )
+{
+    return DIALOG_DlgDirSelect( hwnd, (LPSTR)str, len, id, TRUE, TRUE, FALSE );
+}
+
+
+/**********************************************************************
+ *           DlgDirSelectComboBoxEx16    (USER.423)
+ */
+BOOL16 DlgDirSelectComboBoxEx16( HWND16 hwnd, LPSTR str, INT16 len, INT16 id )
+{
+    return DIALOG_DlgDirSelect( hwnd, str, len, id, FALSE, FALSE, TRUE );
+}
+
+
+/**********************************************************************
+ *           DlgDirSelectComboBoxEx32A    (USER32.146)
+ */
+BOOL32 DlgDirSelectComboBoxEx32A( HWND32 hwnd, LPSTR str, INT32 len, INT32 id )
+{
+    return DIALOG_DlgDirSelect( hwnd, str, len, id, TRUE, FALSE, TRUE );
+}
+
+
+/**********************************************************************
+ *           DlgDirSelectComboBoxEx32W    (USER32.147)
+ */
+BOOL32 DlgDirSelectComboBoxEx32W( HWND32 hwnd, LPWSTR str, INT32 len, INT32 id)
+{
+    return DIALOG_DlgDirSelect( hwnd, (LPSTR)str, len, id, TRUE, TRUE, TRUE );
+}
diff --git a/windows/event.c b/windows/event.c
index 24ec312..2010052 100644
--- a/windows/event.c
+++ b/windows/event.c
@@ -32,14 +32,30 @@
 #include "options.h"
 #include "queue.h"
 #include "winpos.h"
+#include "drive.h"
+#include "dos_fs.h"
+#include "shell.h"
 #include "registers.h"
 #include "xmalloc.h"
 #include "stddebug.h"
 #include "debug.h"
 #include "dde_proc.h"
 
+
 #define NB_BUTTONS      3     /* Windows can handle 3 buttons */
 
+#define DndNotDnd       -1    /* OffiX drag&drop */
+#define DndUnknown      0
+#define DndRawData      1
+#define DndFile         2
+#define DndFiles        3
+#define DndText         4
+#define DndDir          5
+#define DndLink         6
+#define DndExe          7
+
+#define DndEND          8
+
   /* X context to associate a hwnd to an X window */
 static XContext winContext = 0;
 
@@ -123,6 +139,11 @@
 
 static BOOL KeyDown = FALSE;
 
+static Atom wmProtocols = None;
+static Atom wmDeleteWindow = None;
+static Atom dndProtocol = None;
+static Atom dndSelection = None;
+
 static const char * const event_names[] =
 {
     "", "", "KeyPress", "KeyRelease", "ButtonPress", "ButtonRelease",
@@ -155,6 +176,9 @@
 static void EVENT_EnterNotify( WND *pWnd, XCrossingEvent *event );
 */
 
+extern void FOCUS_SetXFocus( HWND32 );
+extern BOOL16 DRAG_QueryUpdate( HWND, SEGPTR, BOOL32 );
+
 /***********************************************************************
  *           EVENT_ProcessEvent
  *
@@ -277,6 +301,15 @@
  */
 void EVENT_RegisterWindow( WND *pWnd )
 {
+    if (wmProtocols == None)
+        wmProtocols = XInternAtom( display, "WM_PROTOCOLS", True );
+    if (wmDeleteWindow == None)
+        wmDeleteWindow = XInternAtom( display, "WM_DELETE_WINDOW", True );
+    if( dndProtocol == None )
+	dndProtocol = XInternAtom( display, "DndProtocol" , False );
+    if( dndSelection == None )
+	dndSelection = XInternAtom( display, "DndSelection" , False );
+
     if (!winContext) winContext = XUniqueContext();
     XSaveContext( display, pWnd->window, winContext, (char *)pWnd );
 }
@@ -291,14 +324,18 @@
  */
 BOOL32 EVENT_WaitXEvent( BOOL32 sleep, BOOL32 peek )
 {
-    fd_set read_set;
-    struct timeval timeout;
     XEvent event;
-    int fd = ConnectionNumber(display);
+    LONG maxWait = sleep ? TIMER_GetNextExpiration() : 0;
 
-    if (!XPending(display))
+    /* Wait for an event or a timeout. If maxWait is -1, we have no timeout;
+     * in this case, we fall through directly to the XNextEvent loop.
+     */
+
+    if ((maxWait != -1) && !XPending(display))
     {
-        LONG maxWait = sleep ? TIMER_GetNextExpiration() : 0;
+        fd_set read_set;
+        struct timeval timeout;
+        int fd = ConnectionNumber(display);
 
         FD_ZERO( &read_set );
         FD_SET( fd, &read_set );
@@ -824,11 +861,11 @@
 	    /* remove carriage returns */
 
 	    lpstr = (char*)xmalloc(size--);
-	    for(i=0,j=0; i < size; i++ )
+	    for(i=0,j=0; i < size && text[i]; i++ )
 	    {
-	       if( text[i] == '\r' && text[i+1] == '\n' ) continue;
+	       if( text[i] == '\r' && 
+		  (text[i+1] == '\n' || text[i+1] == '\0') ) continue;
 	       lpstr[j++] = text[i];
-	       if( text[i] == '\0' ) break;
 	    }
 	    lpstr[j]='\0';
 
@@ -886,21 +923,121 @@
  */
 static void EVENT_ClientMessage( WND *pWnd, XClientMessageEvent *event )
 {
-    static Atom wmProtocols = None;
-    static Atom wmDeleteWindow = None;
-
-    if (wmProtocols == None)
-        wmProtocols = XInternAtom( display, "WM_PROTOCOLS", True );
-    if (wmDeleteWindow == None)
-        wmDeleteWindow = XInternAtom( display, "WM_DELETE_WINDOW", True );
-
-    if ((event->format != 32) || (event->message_type != wmProtocols) ||
-        (((Atom) event->data.l[0]) != wmDeleteWindow))
+    if (event->message_type != None && event->format == 32)
     {
-	dprintf_event( stddeb, "unrecognized ClientMessage\n" );
-	return;
+       if ((event->message_type == wmProtocols) && 
+           (((Atom) event->data.l[0]) == wmDeleteWindow))
+	  SendMessage16( pWnd->hwndSelf, WM_SYSCOMMAND, SC_CLOSE, 0 );
+       else if ( event->message_type == dndProtocol &&
+		(event->data.l[0] == DndFile || event->data.l[0] == DndFiles) )
+       {
+	  unsigned long		data_length;
+	  unsigned long		aux_long;
+	  unsigned char*	p_data = NULL;
+	  union {
+		   Atom		atom_aux;
+		   POINT32	pt_aux;
+		   BOOL16	bAccept;
+		   int		i;
+		}		u;
+	  int			x, y;
+	  HGLOBAL16		hDragInfo = GlobalAlloc16( GMEM_SHARE | GMEM_ZEROINIT, sizeof(DRAGINFO));
+	  LPDRAGINFO            lpDragInfo = (LPDRAGINFO) GlobalLock16(hDragInfo);
+	  SEGPTR		spDragInfo = (SEGPTR) WIN16_GlobalLock16(hDragInfo);
+	  Window		w_aux_root, w_aux_child;
+	  WND*			pDropWnd;
+	  
+          if( !lpDragInfo || !spDragInfo ) return;
+
+	  XQueryPointer( display, pWnd->window, &w_aux_root, &w_aux_child, 
+		 &x, &y, &u.pt_aux.x, &u.pt_aux.y, (unsigned int*)&aux_long);
+
+          lpDragInfo->hScope = pWnd->hwndSelf;
+          lpDragInfo->pt.x = (INT16)x; lpDragInfo->pt.y = (INT16)y;
+
+	  /* find out drop point and drop window */
+	  if( x < 0 || y < 0 ||
+	      x > (pWnd->rectWindow.right - pWnd->rectWindow.left) ||
+	      y > (pWnd->rectWindow.bottom - pWnd->rectWindow.top) )
+	  {   u.bAccept = pWnd->dwExStyle & WS_EX_ACCEPTFILES; x = y = 0; }
+	  else
+	  {
+	      u.bAccept = DRAG_QueryUpdate( pWnd->hwndSelf, spDragInfo, TRUE );
+	      x = lpDragInfo->pt.x; y = lpDragInfo->pt.y;
+	  }
+	  pDropWnd = WIN_FindWndPtr( lpDragInfo->hScope );
+	  GlobalFree16( hDragInfo );
+
+	  if( u.bAccept )
+	  {
+	      XGetWindowProperty( display, DefaultRootWindow(display),
+			      dndSelection, 0, 65535, FALSE,
+                              AnyPropertyType, &u.atom_aux, &u.pt_aux.y,
+		             &data_length, &aux_long, &p_data);
+
+	      if( !aux_long && p_data)	/* don't bother if > 64K */
+	      {
+		char*			p = (char*) p_data;
+		char*			p_filename,*p_drop;
+
+		aux_long = 0; 
+		while( *p )	/* calculate buffer size */
+		{
+		  p_drop = p;
+		  if((u.i = *p) != -1 ) 
+		      u.i = DRIVE_FindDriveRoot( (const char**)&p_drop );
+		  if( u.i == -1 ) *p = -1;	/* mark as "bad" */
+		  else
+		  {
+		      p_filename = (char*) DOSFS_GetDosTrueName( (const char*)p, TRUE );
+		      if( p_filename ) aux_long += strlen(p_filename) + 1;
+		      else *p = -1;
+		  }
+		  p += strlen(p) + 1;
+		}
+		if( aux_long && aux_long < 65535 )
+		{
+		  HDROP16                 hDrop;
+		  LPDROPFILESTRUCT        lpDrop;
+
+		  aux_long += sizeof(DROPFILESTRUCT) + 1; 
+		  hDrop = (HDROP16)GlobalAlloc16( GMEM_SHARE, aux_long );
+		  lpDrop = (LPDROPFILESTRUCT) GlobalLock16( hDrop );
+
+		  if( lpDrop )
+		  {
+		    lpDrop->wSize = sizeof(DROPFILESTRUCT);
+		    lpDrop->ptMousePos.x = (INT16)x;
+		    lpDrop->ptMousePos.y = (INT16)y;
+		    lpDrop->fInNonClientArea = (BOOL16) 
+			( x < (pDropWnd->rectClient.left - pDropWnd->rectWindow.left)  ||
+			  y < (pDropWnd->rectClient.top - pDropWnd->rectWindow.top)    ||
+			  x > (pDropWnd->rectClient.right - pDropWnd->rectWindow.left) ||
+			  y > (pDropWnd->rectClient.bottom - pDropWnd->rectWindow.top) );
+		    p_drop = ((char*)lpDrop) + sizeof(DROPFILESTRUCT);
+		    p = p_data;
+		    while(*p)
+		    {
+		      if( *p != -1 )	/* use only "good" entries */
+		      {
+			p_filename = (char*) DOSFS_GetDosTrueName( p, TRUE );
+			strcpy(p_drop, p_filename);
+			p_drop += strlen( p_filename ) + 1;
+		      }
+		      p += strlen(p) + 1;
+		    }
+		    *p_drop = '\0';
+		    PostMessage( pWnd->hwndSelf, WM_DROPFILES, (WPARAM16)hDrop, 0L );
+		  }
+	        }
+	      }
+	      if( p_data ) XFree(p_data);  
+
+	  } /* WS_EX_ACCEPTFILES */
+       } /* dndProtocol */
+       else
+	  dprintf_event( stddeb, "unrecognized ClientMessage\n" );
     }
-    SendMessage16( pWnd->hwndSelf, WM_SYSCOMMAND, SC_CLOSE, 0 );
 }
 
 /**********************************************************************
@@ -918,8 +1055,6 @@
   }
  */ 
 
-extern void FOCUS_SetXFocus( HWND32 );
-
 /**********************************************************************
  *		EVENT_MapNotify
  */
diff --git a/windows/graphics.c b/windows/graphics.c
index 78abec2..40d1c30 100644
--- a/windows/graphics.c
+++ b/windows/graphics.c
@@ -533,8 +533,8 @@
      */
 
     if (!(prevBrush = SelectObject16( hdc, hbrush ))) return 0;
-    PatBlt( hdc, rect->left, rect->top,
-	    rect->right - rect->left, rect->bottom - rect->top, PATCOPY );
+    PatBlt32( hdc, rect->left, rect->top,
+              rect->right - rect->left, rect->bottom - rect->top, PATCOPY );
     SelectObject16( hdc, prevBrush );
     return 1;
 }
@@ -548,8 +548,8 @@
     HBRUSH32 prevBrush;
 
     if (!(prevBrush = SelectObject32( hdc, hbrush ))) return 0;
-    PatBlt( hdc, rect->left, rect->top,
-	    rect->right - rect->left, rect->bottom - rect->top, PATCOPY );
+    PatBlt32( hdc, rect->left, rect->top,
+              rect->right - rect->left, rect->bottom - rect->top, PATCOPY );
     SelectObject32( hdc, prevBrush );
     return 1;
 }
@@ -560,8 +560,8 @@
  */
 void InvertRect16( HDC16 hdc, const RECT16 *rect )
 {
-    PatBlt( hdc, rect->left, rect->top,
-	    rect->right - rect->left, rect->bottom - rect->top, DSTINVERT );
+    PatBlt32( hdc, rect->left, rect->top,
+              rect->right - rect->left, rect->bottom - rect->top, DSTINVERT );
 }
 
 
@@ -570,8 +570,8 @@
  */
 void InvertRect32( HDC32 hdc, const RECT32 *rect )
 {
-    PatBlt( hdc, rect->left, rect->top,
-	    rect->right - rect->left, rect->bottom - rect->top, DSTINVERT );
+    PatBlt32( hdc, rect->left, rect->top,
+              rect->right - rect->left, rect->bottom - rect->top, DSTINVERT );
 }
 
 
@@ -596,15 +596,15 @@
     
     if (DC_SetupGCForBrush( dc ))
     {
-   	PatBlt( hdc, rect->left, rect->top, 1,
-	    rect->bottom - rect->top, PATCOPY );
-	PatBlt( hdc, rect->right - 1, rect->top, 1,
-	    rect->bottom - rect->top, PATCOPY );
-	PatBlt( hdc, rect->left, rect->top,
-	    rect->right - rect->left, 1, PATCOPY );
-	PatBlt( hdc, rect->left, rect->bottom - 1,
-	    rect->right - rect->left, 1, PATCOPY );
-	}    
+   	PatBlt32( hdc, rect->left, rect->top, 1,
+                  rect->bottom - rect->top, PATCOPY );
+	PatBlt32( hdc, rect->right - 1, rect->top, 1,
+                  rect->bottom - rect->top, PATCOPY );
+	PatBlt32( hdc, rect->left, rect->top,
+                  rect->right - rect->left, 1, PATCOPY );
+	PatBlt32( hdc, rect->left, rect->bottom - 1,
+                  rect->right - rect->left, 1, PATCOPY );
+    }
     SelectObject16( hdc, prevBrush );
     return 1;
 }
@@ -922,20 +922,20 @@
 			                  sysColorObjects.hbrushBtnHighlight );
     for (i = 0; i < highlight_size; i++)
     {
-	PatBlt( hdc, rect->left + i, rect->top,
-	        1, rect->bottom - rect->top - i, PATCOPY );
-	PatBlt( hdc, rect->left, rect->top + i,
-	        rect->right - rect->left - i, 1, PATCOPY );
+	PatBlt32( hdc, rect->left + i, rect->top,
+                  1, rect->bottom - rect->top - i, PATCOPY );
+	PatBlt32( hdc, rect->left, rect->top + i,
+                  rect->right - rect->left - i, 1, PATCOPY );
     }
 
     SelectObject32( hdc, pressed ? sysColorObjects.hbrushBtnHighlight :
 		                   sysColorObjects.hbrushBtnShadow );
     for (i = 0; i < shadow_size; i++)
     {
-	PatBlt( hdc, rect->right - i - 1, rect->top + i,
-	        1, rect->bottom - rect->top - i, PATCOPY );
-	PatBlt( hdc, rect->left + i, rect->bottom - i - 1,
-	        rect->right - rect->left - i, 1, PATCOPY );
+	PatBlt32( hdc, rect->right - i - 1, rect->top + i,
+                  1, rect->bottom - rect->top - i, PATCOPY );
+	PatBlt32( hdc, rect->left + i, rect->bottom - i - 1,
+                  rect->right - rect->left - i, 1, PATCOPY );
     }
 
     SelectObject32( hdc, hbrushOld );
@@ -1250,31 +1250,31 @@
     hbrushOld = SelectObject32( hdc, sysColorObjects.hbrushBtnHighlight );
     if (edge & BDR_RAISEDOUTER)
     {
-        if (flags & BF_LEFT) PatBlt( hdc, rc->left, rc->top,
-                                     1, rc->bottom - rc->top - 1, PATCOPY );
-        if (flags & BF_TOP) PatBlt( hdc, rc->left, rc->top,
-                                     rc->right - rc->left - 1, 1, PATCOPY );
+        if (flags & BF_LEFT) PatBlt32( hdc, rc->left, rc->top,
+                                       1, rc->bottom - rc->top - 1, PATCOPY );
+        if (flags & BF_TOP) PatBlt32( hdc, rc->left, rc->top,
+                                      rc->right - rc->left - 1, 1, PATCOPY );
     }
     if (edge & BDR_SUNKENOUTER)
     {
-        if (flags & BF_RIGHT) PatBlt( hdc, rc->right - 1, rc->top,
-                                      1, rc->bottom - rc->top, PATCOPY );
-        if (flags & BF_BOTTOM) PatBlt( hdc, rc->left, rc->bottom - 1,
-                                       rc->right - rc->left, 1, PATCOPY );
+        if (flags & BF_RIGHT) PatBlt32( hdc, rc->right - 1, rc->top,
+                                        1, rc->bottom - rc->top, PATCOPY );
+        if (flags & BF_BOTTOM) PatBlt32( hdc, rc->left, rc->bottom - 1,
+                                         rc->right - rc->left, 1, PATCOPY );
     }
     if (edge & BDR_RAISEDINNER)
     {
-        if (flags & BF_LEFT) PatBlt( hdc, rc->left + 1, rc->top + 1, 
-                                     1, rc->bottom - rc->top - 2, PATCOPY );
-        if (flags & BF_TOP) PatBlt( hdc, rc->left + 1, rc->top + 1,
-                                     rc->right - rc->left - 2, 1, PATCOPY );
+        if (flags & BF_LEFT) PatBlt32( hdc, rc->left + 1, rc->top + 1, 
+                                       1, rc->bottom - rc->top - 2, PATCOPY );
+        if (flags & BF_TOP) PatBlt32( hdc, rc->left + 1, rc->top + 1,
+                                      rc->right - rc->left - 2, 1, PATCOPY );
     }
     if (edge & BDR_SUNKENINNER)
     {
-        if (flags & BF_RIGHT) PatBlt( hdc, rc->right - 2, rc->top + 1,
-                                     1, rc->bottom - rc->top - 2, PATCOPY );
-        if (flags & BF_BOTTOM) PatBlt( hdc, rc->left + 1, rc->bottom - 2,
-                                       rc->right - rc->left - 2, 1, PATCOPY );
+        if (flags & BF_RIGHT) PatBlt32( hdc, rc->right - 2, rc->top + 1,
+                                        1, rc->bottom - rc->top - 2, PATCOPY );
+        if (flags & BF_BOTTOM) PatBlt32( hdc, rc->left + 1, rc->bottom - 2,
+                                         rc->right - rc->left - 2, 1, PATCOPY );
     }
 
     /* Then do all the sunken edges */
@@ -1282,31 +1282,31 @@
     SelectObject32( hdc, sysColorObjects.hbrushBtnShadow );
     if (edge & BDR_SUNKENOUTER)
     {
-        if (flags & BF_LEFT) PatBlt( hdc, rc->left, rc->top,
-                                     1, rc->bottom - rc->top - 1, PATCOPY );
-        if (flags & BF_TOP) PatBlt( hdc, rc->left, rc->top,
-                                     rc->right - rc->left - 1, 1, PATCOPY );
+        if (flags & BF_LEFT) PatBlt32( hdc, rc->left, rc->top,
+                                       1, rc->bottom - rc->top - 1, PATCOPY );
+        if (flags & BF_TOP) PatBlt32( hdc, rc->left, rc->top,
+                                      rc->right - rc->left - 1, 1, PATCOPY );
     }
     if (edge & BDR_RAISEDOUTER)
     {
-        if (flags & BF_RIGHT) PatBlt( hdc, rc->right - 1, rc->top,
-                                      1, rc->bottom - rc->top, PATCOPY );
-        if (flags & BF_BOTTOM) PatBlt( hdc, rc->left, rc->bottom - 1,
-                                       rc->right - rc->left, 1, PATCOPY );
+        if (flags & BF_RIGHT) PatBlt32( hdc, rc->right - 1, rc->top,
+                                        1, rc->bottom - rc->top, PATCOPY );
+        if (flags & BF_BOTTOM) PatBlt32( hdc, rc->left, rc->bottom - 1,
+                                         rc->right - rc->left, 1, PATCOPY );
     }
     if (edge & BDR_SUNKENINNER)
     {
-        if (flags & BF_LEFT) PatBlt( hdc, rc->left + 1, rc->top + 1, 
-                                     1, rc->bottom - rc->top - 2, PATCOPY );
-        if (flags & BF_TOP) PatBlt( hdc, rc->left + 1, rc->top + 1,
-                                     rc->right - rc->left - 2, 1, PATCOPY );
+        if (flags & BF_LEFT) PatBlt32( hdc, rc->left + 1, rc->top + 1, 
+                                       1, rc->bottom - rc->top - 2, PATCOPY );
+        if (flags & BF_TOP) PatBlt32( hdc, rc->left + 1, rc->top + 1,
+                                      rc->right - rc->left - 2, 1, PATCOPY );
     }
     if (edge & BDR_RAISEDINNER)
     {
-        if (flags & BF_RIGHT) PatBlt( hdc, rc->right - 2, rc->top + 1,
-                                     1, rc->bottom - rc->top - 2, PATCOPY );
-        if (flags & BF_BOTTOM) PatBlt( hdc, rc->left + 1, rc->bottom - 2,
-                                       rc->right - rc->left - 2, 1, PATCOPY );
+        if (flags & BF_RIGHT) PatBlt32( hdc, rc->right - 2, rc->top + 1,
+                                        1, rc->bottom - rc->top - 2, PATCOPY );
+        if (flags & BF_BOTTOM) PatBlt32( hdc, rc->left + 1, rc->bottom - 2,
+                                         rc->right - rc->left - 2, 1, PATCOPY );
     }
 
     SelectObject32( hdc, hbrushOld );
diff --git a/windows/mdi.c b/windows/mdi.c
index 1e6b45f..684b3fc 100644
--- a/windows/mdi.c
+++ b/windows/mdi.c
@@ -672,8 +672,8 @@
  hbCopy = CreateCompatibleBitmap(hDCSrc,SYSMETRICS_CXSIZE, SYSMETRICS_CYSIZE);
  hb_dest = SelectObject32(hDCDest,hbCopy);
 
- BitBlt(hDCDest, 0, 0, SYSMETRICS_CXSIZE, SYSMETRICS_CYSIZE,
-	hDCSrc, SYSMETRICS_CXSIZE, 0, SRCCOPY);
+ BitBlt32(hDCDest, 0, 0, SYSMETRICS_CXSIZE, SYSMETRICS_CYSIZE,
+          hDCSrc, SYSMETRICS_CXSIZE, 0, SRCCOPY);
  
  SelectObject32(hDCSrc,hb_src);
  SelectObject32(hDCDest,hb_dest);
@@ -982,7 +982,8 @@
     RECT16		 rect;
     WND                 *w 	  = WIN_FindWndPtr(hwnd);
     WND			*frameWnd = w->parent;
-
+    INT			nItems;
+    
     ci = (MDICLIENTINFO *) w->wExtra;
     
     switch (message)
@@ -1020,12 +1021,12 @@
       
       case WM_DESTROY:
 	if( ci->hwndChildMaximized ) MDI_RestoreFrameMenu(w, frameWnd->hwndSelf);
-	ci->idFirstChild = GetMenuItemCount(ci->hWindowMenu) - 1;
-	ci->nActiveChildren++; 			/* to delete a separator */
-
-	while( ci->nActiveChildren-- )
-	     DeleteMenu(ci->hWindowMenu,MF_BYPOSITION,ci->idFirstChild--);
-
+	if((nItems = GetMenuItemCount(ci->hWindowMenu)) > 0) {
+    	    ci->idFirstChild = nItems - 1;
+	    ci->nActiveChildren++; 		/* to delete a separator */
+	    while( ci->nActiveChildren-- )
+	        DeleteMenu(ci->hWindowMenu,MF_BYPOSITION,ci->idFirstChild--);
+	}
 	return 0;
 
       case WM_MDIACTIVATE:
@@ -1718,8 +1719,8 @@
  SetScrollPos32(hWnd, (uMsg == WM_VSCROLL)?SB_VERT:SB_HORZ , newPos, TRUE);
 
  if( uMsg == WM_VSCROLL )
-     ScrollWindow(hWnd ,0 ,curPos - newPos, NULL, NULL);
+     ScrollWindow32(hWnd ,0 ,curPos - newPos, NULL, NULL);
  else
-     ScrollWindow(hWnd ,curPos - newPos, 0, NULL, NULL);
+     ScrollWindow32(hWnd ,curPos - newPos, 0, NULL, NULL);
 }
 
diff --git a/windows/message.c b/windows/message.c
index 3e5f253..4ac32f3 100644
--- a/windows/message.c
+++ b/windows/message.c
@@ -105,7 +105,7 @@
         return ret ? SYSQ_MSG_ACCEPT : SYSQ_MSG_SKIP ;
     }
    
-    hittest = WINPOS_WindowFromPoint( msg->pt, &pWnd );
+    hittest = WINPOS_WindowFromPoint( WIN_GetDesktop(), msg->pt, &pWnd );
     if (pWnd->hmemTaskQ != GetTaskQueue(0))
     {
         /* Not for the current task */
diff --git a/windows/nonclient.c b/windows/nonclient.c
index ec0c986..d7f70cb 100644
--- a/windows/nonclient.c
+++ b/windows/nonclient.c
@@ -56,6 +56,8 @@
 #define ON_BOTTOM_BORDER(hit) \
  (((hit) == HTBOTTOM) || ((hit) == HTBOTTOMLEFT) || ((hit) == HTBOTTOMRIGHT))
 
+extern HCURSOR16 CURSORICON_IconToCursor( HICON16, BOOL32 );
+
 /***********************************************************************
  *           NC_AdjustRect
  *
@@ -443,9 +445,9 @@
       NC_GetInsideRect( hwnd, &rect );
       hdcMem = CreateCompatibleDC( hdc );
       hbitmap = SelectObject32( hdcMem, hbitmapClose );
-      BitBlt( hdc, rect.left, rect.top, SYSMETRICS_CXSIZE, SYSMETRICS_CYSIZE,
-              hdcMem, (wndPtr->dwStyle & WS_CHILD) ? SYSMETRICS_CXSIZE : 0, 0,
-              down ? NOTSRCCOPY : SRCCOPY );
+      BitBlt32(hdc, rect.left, rect.top, SYSMETRICS_CXSIZE, SYSMETRICS_CYSIZE,
+               hdcMem, (wndPtr->dwStyle & WS_CHILD) ? SYSMETRICS_CXSIZE : 0, 0,
+               down ? NOTSRCCOPY : SRCCOPY );
       SelectObject32( hdcMem, hbitmap );
       DeleteDC( hdcMem );
     }
@@ -517,14 +519,14 @@
     }
 
       /* Draw frame */
-    PatBlt( hdc, rect->left, rect->top,
-	    rect->right - rect->left, height, PATCOPY );
-    PatBlt( hdc, rect->left, rect->top,
-	    width, rect->bottom - rect->top, PATCOPY );
-    PatBlt( hdc, rect->left, rect->bottom,
-	    rect->right - rect->left, -height, PATCOPY );
-    PatBlt( hdc, rect->right, rect->top,
-	    -width, rect->bottom - rect->top, PATCOPY );
+    PatBlt32( hdc, rect->left, rect->top,
+              rect->right - rect->left, height, PATCOPY );
+    PatBlt32( hdc, rect->left, rect->top,
+              width, rect->bottom - rect->top, PATCOPY );
+    PatBlt32( hdc, rect->left, rect->bottom,
+              rect->right - rect->left, -height, PATCOPY );
+    PatBlt32( hdc, rect->right, rect->top,
+              -width, rect->bottom - rect->top, PATCOPY );
 
     if (dlgFrame)
     {
@@ -575,21 +577,8 @@
  */
 static void NC_DrawMovingFrame( HDC16 hdc, RECT16 *rect, BOOL thickframe )
 {
-    if (thickframe)
-    {
-	SelectObject32( hdc, GetStockObject32( GRAY_BRUSH ) );
-	PatBlt( hdc, rect->left, rect->top,
-	        rect->right - rect->left - SYSMETRICS_CXFRAME,
-	        SYSMETRICS_CYFRAME, PATINVERT );
-	PatBlt( hdc, rect->left, rect->top + SYSMETRICS_CYFRAME,
-	        SYSMETRICS_CXFRAME, 
-	        rect->bottom - rect->top - SYSMETRICS_CYFRAME, PATINVERT );
-	PatBlt( hdc, rect->left + SYSMETRICS_CXFRAME, rect->bottom,
-	        rect->right - rect->left - SYSMETRICS_CXFRAME,
-	        -SYSMETRICS_CYFRAME, PATINVERT );
-	PatBlt( hdc, rect->right, rect->top, -SYSMETRICS_CXFRAME, 
-	        rect->bottom - rect->top - SYSMETRICS_CYFRAME, PATINVERT );
-    }
+    if (thickframe) FastWindowFrame( hdc, rect, SYSMETRICS_CXFRAME,
+                                     SYSMETRICS_CYFRAME, PATINVERT );
     else DrawFocusRect16( hdc, rect );
 }
 
@@ -624,9 +613,9 @@
     if (wndPtr->dwExStyle & WS_EX_DLGMODALFRAME)
     {
 	HBRUSH32 hbrushOld = SelectObject32(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 );
+	PatBlt32( hdc, r.left, r.top, 1, r.bottom-r.top+1,PATCOPY );
+	PatBlt32( hdc, r.right-1, r.top, 1, r.bottom-r.top+1, PATCOPY );
+	PatBlt32( hdc, r.left, r.top-1, r.right-r.left, 1, PATCOPY );
 	r.left++;
 	r.right--;
 	SelectObject32( hdc, hbrushOld );
@@ -992,18 +981,18 @@
 static void NC_DoSizeMove( HWND hwnd, WORD wParam, POINT16 pt )
 {
     MSG16 msg;
-    LONG hittest;
     RECT16 sizingRect, mouseRect;
     HDC32 hdc;
-    BOOL thickframe;
-    POINT16 minTrack, maxTrack, capturePoint = pt;
-    WND * wndPtr = WIN_FindWndPtr( hwnd );
-    int moved = 0;
+    LONG hittest = (LONG)(wParam & 0x0f);
+    HCURSOR16 hDragCursor = 0, hOldCursor = 0;
+    POINT16   minTrack, maxTrack, capturePoint = pt;
+    WND *     wndPtr = WIN_FindWndPtr( hwnd );
+    BOOL32    thickframe = HAS_THICKFRAME( wndPtr->dwStyle );
+    BOOL32    iconic = wndPtr->dwStyle & WS_MINIMIZE;
+    int       moved = 0;
 
     if (IsZoomed(hwnd) || !IsWindowVisible(hwnd) ||
         (wndPtr->flags & WIN_MANAGED)) return;
-    hittest = wParam & 0x0f;
-    thickframe = HAS_THICKFRAME( wndPtr->dwStyle );
 
     if ((wParam & 0xfff0) == SC_MOVE)
     {
@@ -1068,7 +1057,21 @@
 	hdc = GetDC32( 0 );
 	if (rootWindow == DefaultRootWindow(display)) XGrabServer( display );
     }
-    NC_DrawMovingFrame( hdc, &sizingRect, thickframe );
+
+    if( iconic )
+    {
+      HICON16 hIcon = (wndPtr->class->hIcon)
+                      ? wndPtr->class->hIcon
+                      : (HICON16)SendMessage16( hwnd, WM_QUERYDRAGICON, 0, 0L);
+      if( hIcon )
+      {
+        hDragCursor =  CURSORICON_IconToCursor( hIcon, TRUE );
+        hOldCursor = SetCursor(hDragCursor);
+        ShowCursor(1);
+      } else iconic = FALSE;
+    }
+
+    if( !iconic ) NC_DrawMovingFrame( hdc, &sizingRect, thickframe );
 
     while(1)
     {
@@ -1117,16 +1120,26 @@
 		else if (ON_RIGHT_BORDER(hittest)) newRect.right += dx;
 		if (ON_TOP_BORDER(hittest)) newRect.top += dy;
 		else if (ON_BOTTOM_BORDER(hittest)) newRect.bottom += dy;
-		NC_DrawMovingFrame( hdc, &sizingRect, thickframe );
-		NC_DrawMovingFrame( hdc, &newRect, thickframe );
+		if( !iconic )
+		{
+		  NC_DrawMovingFrame( hdc, &sizingRect, thickframe );
+		  NC_DrawMovingFrame( hdc, &newRect, thickframe );
+		}
 		capturePoint = pt;
 		sizingRect = newRect;
 	    }
 	}
     }
 
-    NC_DrawMovingFrame( hdc, &sizingRect, thickframe );
     ReleaseCapture();
+    if( iconic )
+    {
+      ShowCursor(0);
+      SetCursor(hOldCursor);
+      if( hDragCursor ) DestroyCursor(hDragCursor);
+    }
+    else
+      NC_DrawMovingFrame( hdc, &sizingRect, thickframe );
 
     if (wndPtr->dwStyle & WS_CHILD)
         ReleaseDC32( wndPtr->parent->hwndSelf, hdc );
diff --git a/windows/painting.c b/windows/painting.c
index 3edfe8a..b41a6e9 100644
--- a/windows/painting.c
+++ b/windows/painting.c
@@ -115,8 +115,14 @@
      * (because rectClient == rectWindow for WS_MINIMIZE windows).
      */
 
-    lps->hdc = GetDCEx16(hwnd, hrgnUpdate, DCX_INTERSECTRGN | DCX_WINDOWPAINT |
-                         DCX_USESTYLE | (bIcon ? DCX_WINDOW : 0) );
+    if (wndPtr->class->style & CS_PARENTDC)
+        /* Don't clip the output to the update region for CS_PARENTDC window */
+        lps->hdc = GetDCEx16( hwnd, 0, DCX_WINDOWPAINT | DCX_USESTYLE |
+                              (bIcon ? DCX_WINDOW : 0) );
+    else
+        lps->hdc = GetDCEx16(hwnd, hrgnUpdate, DCX_INTERSECTRGN |
+                             DCX_WINDOWPAINT | DCX_USESTYLE |
+                             (bIcon ? DCX_WINDOW : 0) );
 
     dprintf_win(stddeb,"hdc = %04x\n", lps->hdc);
 
@@ -264,13 +270,7 @@
                      hwnd, hrgnUpdate, flags);
     }
 
-    if (wndPtr->class->style & CS_PARENTDC)
-    {
-        GetClientRect32( wndPtr->parent->hwndSelf, &rectClient );
-        OffsetRect32( &rectClient, -wndPtr->rectClient.left,
-                      -wndPtr->rectClient.top );
-    }
-    else GetClientRect32( hwnd, &rectClient );
+    GetClientRect32( hwnd, &rectClient );
 
     if (flags & RDW_INVALIDATE)  /* Invalidate */
     {
@@ -410,23 +410,16 @@
            for (wndPtr = wndPtr->child; wndPtr; wndPtr = wndPtr->next)
 	     if( wndPtr->dwStyle & WS_VISIBLE )
 	       {
-                   if (wndPtr->class->style & CS_PARENTDC)
-                   {
-                       if (!CombineRgn32( hrgn, hrgnUpdate, 0, RGN_COPY ))
-                           continue;
-                   }
-                   else
-                   {
-                       SetRectRgn( hrgn, wndPtr->rectWindow.left,
-                                   wndPtr->rectWindow.top,
-                                   wndPtr->rectWindow.right,
-                                   wndPtr->rectWindow.bottom );
-                       if (!CombineRgn32( hrgn, hrgn, hrgnUpdate, RGN_AND ))
-                           continue;
-                   }
+                   SetRectRgn( hrgn, wndPtr->rectWindow.left,
+                               wndPtr->rectWindow.top,
+                               wndPtr->rectWindow.right,
+                               wndPtr->rectWindow.bottom );
+                   if (!CombineRgn32( hrgn, hrgn, hrgnUpdate, RGN_AND ))
+                       continue;
                    OffsetRgn32( hrgn, -wndPtr->rectClient.left,
                                       -wndPtr->rectClient.top );
-                   PAINT_RedrawWindow( wndPtr->hwndSelf, NULL, hrgn, flags, RDW_C_USEHRGN );
+                   PAINT_RedrawWindow( wndPtr->hwndSelf, NULL, hrgn, flags,
+                                       RDW_C_USEHRGN );
                }
 	   DeleteObject32( hrgn );
 	   if (control & RDW_C_DELETEHRGN) DeleteObject32( hrgnUpdate );
diff --git a/windows/scroll.c b/windows/scroll.c
index b26ba15..71ecc98 100644
--- a/windows/scroll.c
+++ b/windows/scroll.c
@@ -7,6 +7,7 @@
  *
  */
 
+#define NO_TRANSITION_TYPES  /* This file is Win32-clean */
 #include <stdlib.h>
 #include "wintypes.h"
 #include "class.h"
@@ -15,38 +16,54 @@
 #include "region.h"
 #include "sysmetrics.h"
 #include "stddebug.h"
-/* #define DEBUG_SCROLL */
 #include "debug.h"
 
-extern HWND CARET_GetHwnd();			/* windows/caret.c */
+extern HWND32 CARET_GetHwnd();			/* windows/caret.c */
 extern void CLIPPING_UpdateGCRegion(DC* );	/* objects/clipping.c */
 
 static int RgnType;
 
+
 /*************************************************************************
- *             ScrollWindow         (USER.61)
- *
+ *             ScrollWindow16   (USER.61)
  */
-void ScrollWindow(HWND hwnd, short dx, short dy, LPRECT16 rect, LPRECT16 clipRect)
+void ScrollWindow16( HWND16 hwnd, INT16 dx, INT16 dy, const RECT16 *rect,
+                     const RECT16 *clipRect )
+{
+    RECT32 rect32, clipRect32;
+
+    if (rect) CONV_RECT16TO32( rect, &rect32 );
+    if (clipRect) CONV_RECT16TO32( clipRect, &clipRect32 );
+    ScrollWindow32( hwnd, dx, dy, rect ? &rect32 : NULL,
+                    clipRect ? &clipRect32 : NULL );
+}
+
+
+/*************************************************************************
+ *             ScrollWindow32   (USER32.449)
+ */
+BOOL32 ScrollWindow32( HWND32 hwnd, INT32 dx, INT32 dy, const RECT32 *rect,
+                       const RECT32 *clipRect )
 {
     HDC32  	hdc;
     HRGN32 	hrgnUpdate,hrgnClip;
-    RECT16 	rc, cliprc;
-    HWND 	hCaretWnd = CARET_GetHwnd();
+    RECT32 	rc, cliprc;
+    HWND32 	hCaretWnd = CARET_GetHwnd();
     WND*	wndScroll = WIN_FindWndPtr( hwnd );
 
-    dprintf_scroll(stddeb,"ScrollWindow: hwnd=%04x, dx=%d, dy=%d, lpRect =%08lx clipRect=%i,%i,%i,%i\n", 
-	    hwnd, dx, dy, (LONG)rect, (int)((clipRect)?clipRect->left:0),
-                                (int)((clipRect)?clipRect->top:0),
-                                (int)((clipRect)?clipRect->right:0), 
-                                (int)((clipRect)?clipRect->bottom:0));
+    dprintf_scroll(stddeb,"ScrollWindow: hwnd=%04x, dx=%d, dy=%d, lpRect =%p clipRect=%i,%i,%i,%i\n", 
+                   hwnd, dx, dy, rect,
+                   clipRect ? clipRect->left : 0,
+                   clipRect ? clipRect->top : 0,
+                   clipRect ? clipRect->right : 0, 
+                   clipRect ? clipRect->bottom : 0 );
 
-    if ( !wndScroll || !WIN_IsWindowDrawable( wndScroll, TRUE ) ) return;
+    if ( !wndScroll || !WIN_IsWindowDrawable( wndScroll, TRUE ) ) return TRUE;
 
     if ( !rect ) /* do not clip children */
        {
-	  GetClientRect16(hwnd, &rc);
-	  hrgnClip = CreateRectRgnIndirect16( &rc );
+	  GetClientRect32(hwnd, &rc);
+	  hrgnClip = CreateRectRgnIndirect32( &rc );
 
           if ((hCaretWnd == hwnd) || IsChild(hwnd,hCaretWnd))
               HideCaret(hCaretWnd);
@@ -57,22 +74,21 @@
        }
     else	/* clip children */
        {
-	  GetClientRect16(hwnd,&rc);
-	  CopyRect16(&rc, rect);
+	  CopyRect32(&rc, rect);
 
           if (hCaretWnd == hwnd) HideCaret(hCaretWnd);
           else hCaretWnd = 0;
 
-	  hdc = GetDC32(hwnd);
+	  hdc = GetDCEx32( hwnd, 0, DCX_CACHE | DCX_USESTYLE );
        }
 
     if (clipRect == NULL)
-	GetClientRect16(hwnd, &cliprc);
+	GetClientRect32(hwnd, &cliprc);
     else
-	CopyRect16(&cliprc, clipRect);
+	CopyRect32(&cliprc, clipRect);
 
     hrgnUpdate = CreateRectRgn32( 0, 0, 0, 0 );
-    ScrollDC(hdc, dx, dy, &rc, &cliprc, hrgnUpdate, NULL);
+    ScrollDC32( hdc, dx, dy, &rc, &cliprc, hrgnUpdate, NULL );
     ReleaseDC32(hwnd, hdc);
 
     if( !rect )		/* move child windows and update region */
@@ -94,21 +110,39 @@
 
     DeleteObject32( hrgnUpdate );
     if( hCaretWnd ) ShowCaret(hCaretWnd);
+    return TRUE;
 }
 
 
 /*************************************************************************
- *             ScrollDC         (USER.221)
- *
+ *             ScrollDC16   (USER.221)
  */
-BOOL ScrollDC(HDC16 hdc, short dx, short dy, LPRECT16 rc, LPRECT16 cliprc,
-	      HRGN32 hrgnUpdate, LPRECT16 rcUpdate)
+BOOL16 ScrollDC16( HDC16 hdc, INT16 dx, INT16 dy, const RECT16 *rect,
+                   const RECT16 *cliprc, HRGN16 hrgnUpdate, LPRECT16 rcUpdate )
+{
+    RECT32 rect32, clipRect32, rcUpdate32;
+    BOOL16 ret;
+
+    if (rect) CONV_RECT16TO32( rect, &rect32 );
+    if (cliprc) CONV_RECT16TO32( cliprc, &clipRect32 );
+    ret = ScrollDC32( hdc, dx, dy, rect ? &rect32 : NULL,
+                      cliprc ? &clipRect32 : NULL, hrgnUpdate, &rcUpdate32 );
+    if (rcUpdate) CONV_RECT32TO16( &rcUpdate32, rcUpdate );
+    return ret;
+}
+
+
+/*************************************************************************
+ *             ScrollDC32   (USER32.448)
+ */
+BOOL32 ScrollDC32( HDC32 hdc, INT32 dx, INT32 dy, const RECT32 *rc,
+                   const RECT32 *cliprc, HRGN32 hrgnUpdate, LPRECT32 rcUpdate )
 {
     HRGN32 hrgnClip = 0;
     HRGN32 hrgnScrollClip = 0;
-    RECT16	rectClip;
-    POINT16 	src, dest;
-    short width, height;
+    RECT32 rectClip;
+    POINT32 src, dest;
+    INT32 width, height;
     DC *dc = (DC *)GDI_GetObjPtr(hdc, DC_MAGIC);
 
     dprintf_scroll(stddeb,"ScrollDC: dx=%d dy=%d, hrgnUpdate=%04x rcUpdate = %p cliprc = %p, rc=%d %d %d %d\n",
@@ -119,17 +153,17 @@
 
     /* set clipping region */
 
-    if ( !rc ) GetClipBox16( hdc, &rectClip );
+    if ( !rc ) GetClipBox32( hdc, &rectClip );
     else rectClip = *rc;
 
     if (cliprc)
-	IntersectRect16(&rectClip,&rectClip,cliprc);
+	IntersectRect32(&rectClip,&rectClip,cliprc);
 
     if( rectClip.left >= rectClip.right || rectClip.top >= rectClip.bottom )
 	return FALSE;
     
     hrgnClip = GetClipRgn(hdc);
-    hrgnScrollClip = CreateRectRgnIndirect16(&rectClip);
+    hrgnScrollClip = CreateRectRgnIndirect32(&rectClip);
 
     if( hrgnClip )
       {
@@ -142,7 +176,7 @@
 	CLIPPING_UpdateGCRegion( dc );
       }
     else
-        SelectClipRgn16( hdc, hrgnScrollClip );
+        SelectClipRgn32( hdc, hrgnScrollClip );
 
     /* translate coordinates */
 
@@ -172,8 +206,8 @@
 
     /* copy bits */
 
-    if (!BitBlt(hdc, dest.x, dest.y, width, height, hdc, src.x, src.y, 
-		SRCCOPY))
+    if (!BitBlt32( hdc, dest.x, dest.y, width, height, hdc, src.x, src.y, 
+                   SRCCOPY))
 	return FALSE;
 
     /* compute update areas */
@@ -195,23 +229,23 @@
 	}
 	else
 	{
-	  RECT16	rect;
+	  RECT32 rect;
 
           rect = rectClip;				/* vertical band */
           if (dx > 0) rect.right = rect.left + dx;
           else if (dx < 0) rect.left = rect.right + dx;
-          else SetRectEmpty16( &rect );
+          else SetRectEmpty32( &rect );
           SetRectRgn( hrgn1, rect.left, rect.top, rect.right, rect.bottom );
 
           rect = rectClip;				/* horizontal band */
           if (dy > 0) rect.bottom = rect.top + dy;
           else if (dy < 0) rect.top = rect.bottom + dy;
-          else SetRectEmpty16( &rect );
+          else SetRectEmpty32( &rect );
 
           RgnType = REGION_UnionRectWithRgn( hrgn1, &rect );
 	}
 
-	if (rcUpdate) GetRgnBox16( hrgn1, rcUpdate );
+	if (rcUpdate) GetRgnBox32( hrgn1, rcUpdate );
 	if (!hrgnUpdate) DeleteObject32( hrgn1 );
     }
 
@@ -225,32 +259,55 @@
 
 
 /*************************************************************************
- *             ScrollWindowEx       (USER.319)
+ *             ScrollWindowEx16   (USER.319)
+ */
+INT16 ScrollWindowEx16( HWND16 hwnd, INT16 dx, INT16 dy, const RECT16 *rect,
+                        const RECT16 *clipRect, HRGN16 hrgnUpdate,
+                        LPRECT16 rcUpdate, UINT16 flags )
+{
+    RECT32 rect32, clipRect32, rcUpdate32;
+    BOOL16 ret;
+
+    if (rect) CONV_RECT16TO32( rect, &rect32 );
+    if (clipRect) CONV_RECT16TO32( clipRect, &clipRect32 );
+    ret = ScrollWindowEx32( hwnd, dx, dy, rect ? &rect32 : NULL,
+                            clipRect ? &clipRect32 : NULL, hrgnUpdate,
+                            &rcUpdate32, flags );
+    if (rcUpdate) CONV_RECT32TO16( &rcUpdate32, rcUpdate );
+    return ret;
+}
+
+
+/*************************************************************************
+ *             ScrollWindowEx32   (USER32.450)
  *
  * FIXME: broken, is there a program that actually uses it?
  *
  */
-
-int ScrollWindowEx(HWND hwnd, short dx, short dy, LPRECT16 rect, LPRECT16 clipRect,
-		   HRGN32 hrgnUpdate, LPRECT16 rcUpdate, WORD flags)
+INT32 ScrollWindowEx32( HWND32 hwnd, INT32 dx, INT32 dy, const RECT32 *rect,
+                        const RECT32 *clipRect, HRGN32 hrgnUpdate,
+                        LPRECT32 rcUpdate, UINT32 flags )
 {
     HDC32 hdc;
-    RECT16 rc, cliprc;
+    RECT32 rc, cliprc;
 
-    dprintf_scroll(stddeb,"ScrollWindowEx: dx=%d, dy=%d, wFlags=%04x\n",dx, dy, flags);
+    fprintf( stderr, "ScrollWindowEx: not fully implemented\n" );
+
+    dprintf_scroll(stddeb,"ScrollWindowEx: dx=%d, dy=%d, wFlags=%04x\n",
+                   dx, dy, flags);
 
     hdc = GetDC32(hwnd);
 
     if (rect == NULL)
-	GetClientRect16(hwnd, &rc);
+	GetClientRect32(hwnd, &rc);
     else
-	CopyRect16(&rc, rect);
+	CopyRect32(&rc, rect);
     if (clipRect == NULL)
-	GetClientRect16(hwnd, &cliprc);
+	GetClientRect32(hwnd, &cliprc);
     else
-	CopyRect16(&cliprc, clipRect);
+	CopyRect32(&cliprc, clipRect);
 
-    ScrollDC(hdc, dx, dy, &rc, &cliprc, hrgnUpdate, rcUpdate);
+    ScrollDC32( hdc, dx, dy, &rc, &cliprc, hrgnUpdate, rcUpdate );
 
     if (flags | SW_INVALIDATE)
     {
diff --git a/windows/win.c b/windows/win.c
index 0221627..f9b70ee 100644
--- a/windows/win.c
+++ b/windows/win.c
@@ -43,7 +43,7 @@
 static WORD wDragWidth = 4;
 static WORD wDragHeight= 3;
 
-extern HCURSOR16 CURSORICON_IconToCursor(HICON16);
+extern HCURSOR16 CURSORICON_IconToCursor(HICON16, BOOL32);
 extern HWND32 CARET_GetHwnd(void);
 extern BOOL32 WINPOS_ActivateOtherWindow(WND* pWnd);
 extern void   WINPOS_CheckActive(HWND32);
@@ -311,6 +311,8 @@
     HWND hwnd = wndPtr->hwndSelf;
     WND* pWnd,*pNext;
 
+    dprintf_win( stddeb, "WIN_DestroyWindow: %04x\n", wndPtr->hwndSelf );
+
 #ifdef CONFIG_IPC
     if (main_block)
 	DDE_DestroyWindow(wndPtr->hwndSelf);
@@ -659,7 +661,6 @@
     if (!(cs->style & WS_CHILD) && (rootWindow == DefaultRootWindow(display)))
     {
         XSetWindowAttributes win_attr;
-        Atom XA_WM_DELETE_WINDOW;
 
 	if (Options.managed && ((cs->style & (WS_DLGFRAME | WS_THICKFRAME)) ||
             (cs->dwExStyle & WS_EX_DLGMODALFRAME)))
@@ -689,9 +690,6 @@
                                         CWEventMask | CWOverrideRedirect |
                                         CWColormap | CWCursor | CWSaveUnder |
                                         CWBackingStore, &win_attr );
-	XA_WM_DELETE_WINDOW = XInternAtom( display, "WM_DELETE_WINDOW",
-					   False );
-	XSetWMProtocols( display, wndPtr->window, &XA_WM_DELETE_WINDOW, 1 );
 
         if ((wndPtr->flags & WIN_MANAGED) &&
             (cs->dwExStyle & WS_EX_DLGMODALFRAME))
@@ -2069,13 +2067,13 @@
  * recursively find a child that contains spDragInfo->pt point 
  * and send WM_QUERYDROPOBJECT
  */
-BOOL DRAG_QueryUpdate( HWND hQueryWnd, SEGPTR spDragInfo )
+BOOL16 DRAG_QueryUpdate( HWND hQueryWnd, SEGPTR spDragInfo, BOOL32 bNoSend )
 {
- BOOL		wParam,bResult = 0;
+ BOOL16		wParam,bResult = 0;
  POINT16        pt;
  LPDRAGINFO	ptrDragInfo = (LPDRAGINFO) PTR_SEG_TO_LIN(spDragInfo);
  WND 	       *ptrQueryWnd = WIN_FindWndPtr(hQueryWnd),*ptrWnd;
- RECT16		tempRect;	/* this sucks */
+ RECT16		tempRect;
 
  if( !ptrQueryWnd || !ptrDragInfo ) return 0;
 
@@ -2112,7 +2110,7 @@
                         ptrWnd->hwndSelf, ptrWnd->rectWindow.left, ptrWnd->rectWindow.top,
 			ptrWnd->rectWindow.right, ptrWnd->rectWindow.bottom );
             if( !(ptrWnd->dwStyle & WS_DISABLED) )
-	        bResult = DRAG_QueryUpdate(ptrWnd->hwndSelf, spDragInfo);
+	        bResult = DRAG_QueryUpdate(ptrWnd->hwndSelf, spDragInfo, bNoSend);
          }
 
 	 if(bResult) return bResult;
@@ -2125,7 +2123,9 @@
 
  ptrDragInfo->hScope = hQueryWnd;
 
- bResult = SendMessage16( hQueryWnd ,WM_QUERYDROPOBJECT ,
+ bResult = ( bNoSend ) 
+	   ? ptrQueryWnd->dwExStyle & WS_EX_ACCEPTFILES
+	   : SendMessage16( hQueryWnd ,WM_QUERYDROPOBJECT ,
                           (WPARAM16)wParam ,(LPARAM) spDragInfo );
  if( !bResult ) 
       ptrDragInfo->pt = pt;
@@ -2191,7 +2191,7 @@
  short	 	dragDone = 0;
  HCURSOR16	hCurrentCursor = 0;
  HWND		hCurrentWnd = 0;
- WORD	        btemp;
+ BOOL16		b;
 
  lpDragInfo = (LPDRAGINFO) GlobalLock16(hDragInfo);
  spDragInfo = (SEGPTR) WIN16_GlobalLock16(hDragInfo);
@@ -2208,7 +2208,7 @@
 
  if(hCursor)
    {
-	if( !(hDragCursor = CURSORICON_IconToCursor(hCursor)) )
+	if( !(hDragCursor = CURSORICON_IconToCursor(hCursor, FALSE)) )
 	  {
 	   GlobalFree16(hDragInfo);
 	   return 0L;
@@ -2244,7 +2244,7 @@
     /* update DRAGINFO struct */
     dprintf_msg(stddeb,"drag: lpDI->hScope = %04x\n",lpDragInfo->hScope);
 
-    if( (btemp = (WORD)DRAG_QueryUpdate(hwndScope, spDragInfo)) > 0 )
+    if( (b = DRAG_QueryUpdate(hwndScope, spDragInfo, FALSE)) > 0 )
 	 hCurrentCursor = hCursor;
     else
         {
@@ -2254,7 +2254,7 @@
     if( hCurrentCursor )
         SetCursor(hCurrentCursor);
 
-    dprintf_msg(stddeb,"drag: got %04x\n",btemp);
+    dprintf_msg(stddeb,"drag: got %04x\n", b);
 
     /* send WM_DRAGLOOP */
     SendMessage16( hWnd, WM_DRAGLOOP, (WPARAM16)(hCurrentCursor != hBummer) , 
diff --git a/windows/winpos.c b/windows/winpos.c
index 7d0dd30..81a727e 100644
--- a/windows/winpos.c
+++ b/windows/winpos.c
@@ -253,7 +253,7 @@
  *
  * Find the window and hittest for a given point.
  */
-INT16 WINPOS_WindowFromPoint( POINT16 pt, WND **ppWnd )
+INT16 WINPOS_WindowFromPoint( WND* wndScope, POINT16 pt, WND **ppWnd )
 {
     WND *wndPtr;
     INT16 hittest = HTERROR;
@@ -262,7 +262,7 @@
     *ppWnd = NULL;
     x = pt.x;
     y = pt.y;
-    wndPtr = WIN_GetDesktop()->child;
+    wndPtr = wndScope->child;
     for (;;)
     {
         while (wndPtr)
@@ -298,11 +298,20 @@
             else wndPtr = wndPtr->next;
         }
 
-        /* If nothing found, return the desktop window */
+        /* If nothing found, return the scope window */
         if (!*ppWnd)
         {
-            *ppWnd = WIN_GetDesktop();
-            return HTCLIENT;
+            *ppWnd = wndScope;
+            if( pt.x >= (wndScope->rectClient.left - wndScope->rectWindow.left) &&
+                pt.x >= (wndScope->rectClient.top - wndScope->rectWindow.top ) &&
+                pt.x <= (wndScope->rectClient.right - wndScope->rectWindow.left) &&
+                pt.x <= (wndScope->rectClient.bottom - wndScope->rectWindow.top ) )
+                return HTCLIENT;
+	    if( pt.x < 0 || pt.y < 0 || 
+		pt.x > (wndScope->rectWindow.right - wndScope->rectWindow.left) ||
+		pt.y > (wndScope->rectWindow.bottom - wndScope->rectWindow.top ) )
+		return HTNOWHERE;
+	    return HTCAPTION;	/* doesn't matter in this case */
         }
 
         /* Send the WM_NCHITTEST message (only if to the same task) */
@@ -331,7 +340,7 @@
 HWND16  WindowFromPoint16( POINT16 pt )
 {
     WND *pWnd;
-    WINPOS_WindowFromPoint( pt, &pWnd );
+    WINPOS_WindowFromPoint( WIN_GetDesktop(), pt, &pWnd );
     return pWnd->hwndSelf;
 }
 
@@ -344,7 +353,7 @@
     WND *pWnd;
     POINT16 pt16;
     CONV_POINT32TO16( &pt, &pt16 );
-    WINPOS_WindowFromPoint( pt16, &pWnd );
+    WINPOS_WindowFromPoint( WIN_GetDesktop(), pt16, &pWnd );
     return (HWND32)pWnd->hwndSelf;
 }
 
@@ -1419,9 +1428,12 @@
 
  if( uFlags & SMC_NOCOPY )	/* invalidate Wnd visible region */
    {
-     if (my != NULLREGION)  PAINT_RedrawWindow( Wnd->hwndSelf, NULL, newVisRgn, RDW_INVALIDATE |
-		            RDW_FRAME | RDW_ALLCHILDREN | RDW_ERASE, RDW_C_USEHRGN );
-   } 
+     if (my != NULLREGION)
+	 PAINT_RedrawWindow( Wnd->hwndSelf, NULL, newVisRgn, RDW_INVALIDATE |
+	  RDW_FRAME | RDW_ALLCHILDREN | RDW_ERASE, RDW_C_USEHRGN );
+     else if(uFlags & SMC_DRAWFRAME)
+	 Wnd->flags |= WIN_NEEDS_NCPAINT;
+   }
  else			/* bitblt old client area */
    { 
      HDC32 hDC;
@@ -1471,9 +1483,8 @@
                           DCX_KEEPCLIPRGN | DCX_INTERSECTRGN |
                           DCX_CACHE | DCX_CLIPSIBLINGS);
 
-         BitBlt( hDC, xto, yto, width, height, hDC, xfrom, yfrom, SRCCOPY );
-    
-	 ReleaseDC32( Wnd->parent->hwndSelf, hDC); 
+         BitBlt32( hDC, xto, yto, width, height, hDC, xfrom, yfrom, SRCCOPY );
+         ReleaseDC32( Wnd->parent->hwndSelf, hDC); 
        }
 
      if( update != NULLREGION )