diff --git a/ANNOUNCE b/ANNOUNCE
index 820759c..b4f14d3 100644
--- a/ANNOUNCE
+++ b/ANNOUNCE
@@ -1,13 +1,12 @@
-This is release 960606 of Wine, the MS Windows emulator.  This is still a
+This is release 960611 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-960606: (see ChangeLog for details)
-	- More Win32 code.
-	- Window repainting fixes.
+WHAT'S NEW with Wine-960611: (see ChangeLog for details)
+	- (surprise) More Win32 code.
 	- Lots of bug fixes.
 
 See the README file in the distribution for installation instructions.
@@ -16,10 +15,10 @@
 the release is available at the ftp sites.  The sources will be available
 from the following locations:
 
-    sunsite.unc.edu:/pub/Linux/ALPHA/wine/development/Wine-960606.tar.gz
-    tsx-11.mit.edu:/pub/linux/ALPHA/Wine/development/Wine-960606.tar.gz
-    ftp.infomagic.com:/pub/mirrors/linux/wine/development/Wine-960606.tar.gz
-    aris.com:/pub/linux/ALPHA/Wine/development/Wine-960606.tar.gz
+    sunsite.unc.edu:/pub/Linux/ALPHA/wine/development/Wine-960611.tar.gz
+    tsx-11.mit.edu:/pub/linux/ALPHA/Wine/development/Wine-960611.tar.gz
+    ftp.infomagic.com:/pub/mirrors/linux/wine/development/Wine-960611.tar.gz
+    aris.com:/pub/linux/ALPHA/Wine/development/Wine-960611.tar.gz
 
 It should also be available from any site that mirrors tsx-11 or sunsite.
 
diff --git a/ChangeLog b/ChangeLog
index 34238c6..0d6d6c1 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,4 +1,85 @@
 ----------------------------------------------------------------------
+Tue Jun 11 15:20:43 1996  Alexandre Julliard  <julliard@lrc.epfl.ch>
+
+	* [debugger/break.c] [loader/signal.c]
+	Fixed breakpoints in 32-bit code.
+
+	* [include/windows.h]
+	Added many more Win32 versions of standard structures.
+
+	* [include/winreg.h] [misc/registry.c]
+	Moved private types into registry.c.
+
+	* [memory/string.c] (New file)
+	Moved most string functions from misc/lstr.c; added Win32 version
+	of all functions.
+
+	* [misc/wsprintf.c]
+	Implemented Win32 wsprintf functions.
+
+	* [objects/bitmap.c]
+	Implemented Win32 bitmap functions.
+
+	* [windows/dialog.c]
+	Don't set dialog procedure before the controls are created. This
+	avoids a crash in Winhelp.
+
+Tue Jun 11 14:10:06 1996 Martin von Loewis <loewis@informatik.hu-berlin.de>
+
+	* [controls/menu.c] [if1632/user.spec] [windows/message.c]
+	Replace PeekMessage with PeekMessage16.
+
+	* [if1632/kernel32.spec][misc/main.c]
+	GetVersion32,GetVersionEx32A,GetVersionEx32W: new functions.
+	MAIN_ParseVersion: new function, new command line option -winver.
+	GetVersion: modified to take command line argument into account.
+
+	* [if1632/kernel32.spec] [win32/process.c]
+	FreeLibrary32: new function.
+	TlsAlloc: initialize Tls to zero.
+	InterlockedIncrement,InterlockedDecrement,InterlockedExchange: new
+	functions.
+
+	* [if1632/kernel32.spec]
+	SetErrorMode,GetActiveWindow: new relays to existing functions.
+
+	* [if1632/kernel32.spec][win32/user32.c]
+	PeekMessage32A,PeekMessage32W: new functions.
+
+	* [include/struct32.h][include/windows.h]
+	Moved MSG32 to windows.h.
+	Renamed MSG to MSG16.
+	Modified prototypes to use MSG16
+
+	* [include/winbase.h]
+	OSVERSIONINFO32A,OSVERSIONINFO32W: new structures.
+
+Sun Jun  9 20:53:30 1996  Marcus Meissner <msmeissn@cip.informatik.uni-erlangen.de>
+
+	* [if1632/Makefile.in] [loader/builtin.c]
+	version.dll,lz32.dll added.
+
+	* [include/lzexpand.h] [if1632/lz32.spec] [if1632/lzexpand.spec]
+	  [misc/lzexpand.c]
+	lz32.dll added.
+	Modified to new function naming standard.
+
+	* [include/ver.h] [if1632/ver.spec] [if1632/version.spec] [misc/ver.c]
+	version.dll added (win32 version of ver.dll).
+	Modified to new function naming standard.
+	Use registry to look up a LOCALE langids too.
+	(VerInstallFile,VerFindFile still stubs)
+
+Fri Jun  7 20:40:20 1996  Albrecht Kleine  <kleine@ak.sax.de>
+
+	* [files/file.c]
+	Added a warning if GetTempFileName() gets a bad drive parameter.
+
+	* [misc/commdlg.c]
+	Changed file listbox color to gray in SaveFile dialog 
+	(just like Windows does this).
+
+----------------------------------------------------------------------
 Wed Jun  5 20:13:54 1996  Alexandre Julliard  <julliard@lrc.epfl.ch>
 
 	* [controls/button.c] [controls/listbox.c]
diff --git a/controls/button.c b/controls/button.c
index a7870ed..3181a56 100644
--- a/controls/button.c
+++ b/controls/button.c
@@ -20,7 +20,7 @@
 
 #define MAX_BTN_TYPE  12
 
-static WORD maxCheckState[MAX_BTN_TYPE] =
+static const WORD maxCheckState[MAX_BTN_TYPE] =
 {
     BUTTON_UNCHECKED,   /* BS_PUSHBUTTON */
     BUTTON_UNCHECKED,   /* BS_DEFPUSHBUTTON */
@@ -38,7 +38,7 @@
 
 typedef void (*pfPaint)( WND *wndPtr, HDC hdc, WORD action );
 
-static pfPaint btnPaintFunc[MAX_BTN_TYPE] =
+static const pfPaint btnPaintFunc[MAX_BTN_TYPE] =
 {
     PB_Paint,    /* BS_PUSHBUTTON */
     PB_Paint,    /* BS_DEFPUSHBUTTON */
@@ -97,9 +97,9 @@
     case WM_CREATE:
         if (!hbitmapCheckBoxes)
         {
-            BITMAP bmp;
+            BITMAP16 bmp;
             hbitmapCheckBoxes = LoadBitmap(0, MAKEINTRESOURCE(OBM_CHECKBOXES));
-            GetObject( hbitmapCheckBoxes, sizeof(bmp), (LPSTR)&bmp );
+            GetObject16( hbitmapCheckBoxes, sizeof(bmp), &bmp );
             checkBoxWidth  = bmp.bmWidth / 4;
             checkBoxHeight = bmp.bmHeight / 3;
         }
@@ -255,7 +255,7 @@
     HPEN16 hOldPen;
     HBRUSH hOldBrush;
     DWORD dwTextSize;
-    TEXTMETRIC tm;
+    TEXTMETRIC16 tm;
     BUTTONINFO *infoPtr = (BUTTONINFO *)wndPtr->wExtra;
 
     GetClientRect16(wndPtr->hwndSelf, &rc);
@@ -296,8 +296,8 @@
     /* draw button label, if any: */
     if (wndPtr->text && wndPtr->text[0])
     {
-     LOGBRUSH lb;
-     GetObject(sysColorObjects.hbrushBtnFace,sizeof(LOGBRUSH),(LPSTR)&lb);
+     LOGBRUSH16 lb;
+     GetObject16( sysColorObjects.hbrushBtnFace, sizeof(lb), &lb );
      if (wndPtr->dwStyle & WS_DISABLED &&
          GetSysColor(COLOR_GRAYTEXT)==lb.lbColor)
          /* don't write gray text on gray bkg */
@@ -372,7 +372,7 @@
     RECT16 rc;
     HBRUSH hBrush;
     int textlen, delta, x, y;
-    TEXTMETRIC tm;
+    TEXTMETRIC16 tm;
     SIZE16 size;
     BUTTONINFO *infoPtr = (BUTTONINFO *)wndPtr->wExtra;
 
diff --git a/controls/combo.c b/controls/combo.c
index 44540dd..10ed406 100644
--- a/controls/combo.c
+++ b/controls/combo.c
@@ -48,11 +48,11 @@
 
 static int COMBO_Init()
 {
-  BITMAP bm;
+  BITMAP16 bm;
   
   dprintf_combo(stddeb, "COMBO_Init\n");
   hComboBit = LoadBitmap(0, MAKEINTRESOURCE(OBM_COMBO));
-  GetObject(hComboBit, sizeof(BITMAP), (LPSTR)&bm);
+  GetObject16( hComboBit, sizeof(bm), &bm );
   CBitHeight = bm.bmHeight;
   CBitWidth = bm.bmWidth;
   return 0;
@@ -1208,7 +1208,7 @@
         char temp[512] = "A:\\";
         int drive = DRIVE_GetCurrentDrive();
         temp[0] += drive;
-        lstrcpyn( temp + 3, DRIVE_GetDosCwd(drive), sizeof(temp)-3 );
+        lstrcpyn32A( temp + 3, DRIVE_GetDosCwd(drive), sizeof(temp)-3 );
         AnsiLower( temp );
         SetDlgItemText32A( hDlg, idStatic, temp );
     } 
diff --git a/controls/desktop.c b/controls/desktop.c
index e70d85a..a71a6f8 100644
--- a/controls/desktop.c
+++ b/controls/desktop.c
@@ -198,8 +198,8 @@
     infoPtr->fTileWallPaper = GetProfileInt( "desktop", "TileWallPaper", 0 );
     if (hbitmap)
     {
-	BITMAP bmp;
-	GetObject( hbitmap, sizeof(bmp), (LPSTR)&bmp );
+	BITMAP16 bmp;
+	GetObject16( hbitmap, sizeof(bmp), &bmp );
 	infoPtr->bitmapSize.cx = (bmp.bmWidth != 0) ? bmp.bmWidth : 1;
 	infoPtr->bitmapSize.cy = (bmp.bmHeight != 0) ? bmp.bmHeight : 1;
     }
diff --git a/controls/edit.c b/controls/edit.c
index 4018290..7db7bd4 100644
--- a/controls/edit.c
+++ b/controls/edit.c
@@ -2743,7 +2743,7 @@
  */
 static LRESULT EDIT_WM_SetFont(WND *wndPtr, WPARAM wParam, LPARAM lParam)
 {
-	TEXTMETRIC tm;
+	TEXTMETRIC16 tm;
 	EDITSTATE *es = EDITSTATEPTR(wndPtr);
 	LPARAM sel = EDIT_EM_GetSel(wndPtr, 0, 0L);
 	HDC hdc;
diff --git a/controls/listbox.c b/controls/listbox.c
index 27a173a..da7d1f0 100644
--- a/controls/listbox.c
+++ b/controls/listbox.c
@@ -106,7 +106,7 @@
   /* create dummy hdc to set text height */
   if ((hdc = GetDC(0)))
   {
-      TEXTMETRIC tm;
+      TEXTMETRIC16 tm;
       GetTextMetrics( hdc, &tm );
       lphl->StdItemHeight = tm.tmHeight;
       dprintf_listbox(stddeb,"CreateListBoxStruct:  font height %d\n",
@@ -305,8 +305,8 @@
 
 void ListBoxAskMeasure(LPHEADLIST lphl, LPLISTSTRUCT lpls)  
 {
-  HANDLE hTemp = USER_HEAP_ALLOC( sizeof(MEASUREITEMSTRUCT) );
-  MEASUREITEMSTRUCT *lpmeasure = (MEASUREITEMSTRUCT *) USER_HEAP_LIN_ADDR(hTemp);
+  HANDLE hTemp = USER_HEAP_ALLOC( sizeof(MEASUREITEMSTRUCT16) );
+  MEASUREITEMSTRUCT16 *lpmeasure = (MEASUREITEMSTRUCT16 *) USER_HEAP_LIN_ADDR(hTemp);
 
   if (lpmeasure == NULL) {
     fprintf(stdnimp,"ListBoxAskMeasure() out of memory !\n");
@@ -1274,7 +1274,7 @@
   /* or are we guaranteed to get a LBSetFont before the first insert/add? */
   if ((hdc = GetDC(0)))
   {
-      TEXTMETRIC tm;
+      TEXTMETRIC16 tm;
       GetTextMetrics( hdc, &tm );
       lphl->StdItemHeight = tm.tmHeight;
       dprintf_listbox(stddeb,"LBSetFont:  new font %d with height %d\n",
@@ -2107,7 +2107,7 @@
                 p = filespec;
                 if ((p2 = strrchr( p, '\\' ))) p = p2 + 1;
                 if ((p2 = strrchr( p, '/' ))) p = p2 + 1;
-                lstrcpyn( mask, p, sizeof(mask) );
+                lstrcpyn32A( mask, p, sizeof(mask) );
                 if (p != filespec)
                 {
                     p[-1] = '\0';
@@ -2151,7 +2151,7 @@
         int drive = DRIVE_GetCurrentDrive();
         strcpy( temp, "A:\\" );
         temp[0] += drive;
-        lstrcpyn( temp + 3, DRIVE_GetDosCwd(drive), sizeof(temp)-3 );
+        lstrcpyn32A( temp + 3, DRIVE_GetDosCwd(drive), sizeof(temp)-3 );
         AnsiLower( temp );
         /* Can't use PostMessage() here, because the string is on the stack */
         SetDlgItemText32A( hDlg, idStatic, temp );
diff --git a/controls/menu.c b/controls/menu.c
index 093627c..bf6a69d 100644
--- a/controls/menu.c
+++ b/controls/menu.c
@@ -132,18 +132,18 @@
  */
 BOOL MENU_Init()
 {
-    BITMAP bm;
+    BITMAP16 bm;
 
       /* Load bitmaps */
 
     if (!(hStdCheck = LoadBitmap( 0, MAKEINTRESOURCE(OBM_CHECK) )))
 	return FALSE;
-    GetObject( hStdCheck, sizeof(BITMAP), (LPSTR)&bm );
+    GetObject16( hStdCheck, sizeof(bm), &bm );
     check_bitmap_width = bm.bmWidth;
     check_bitmap_height = bm.bmHeight;
     if (!(hStdMnArrow = LoadBitmap( 0, MAKEINTRESOURCE(OBM_MNARROW) )))
 	return FALSE;
-    GetObject( hStdMnArrow, sizeof(BITMAP), (LPSTR)&bm );
+    GetObject16( hStdMnArrow, sizeof(bm), &bm );
     arrow_bitmap_width = bm.bmWidth;
     arrow_bitmap_height = bm.bmHeight;
 
@@ -331,8 +331,8 @@
 
     if (lpitem->item_flags & MF_OWNERDRAW)
     {
-        MEASUREITEMSTRUCT *mis;
-        if (!(mis = SEGPTR_NEW(MEASUREITEMSTRUCT))) return;
+        MEASUREITEMSTRUCT16 *mis;
+        if (!(mis = SEGPTR_NEW(MEASUREITEMSTRUCT16))) return;
         mis->CtlType    = ODT_MENU;
         mis->itemID     = lpitem->item_id;
         mis->itemData   = (DWORD)lpitem->text;
@@ -362,9 +362,8 @@
 
     if (lpitem->item_flags & MF_BITMAP)
     {
-	BITMAP bm;
-        if (GetObject( (HBITMAP16)(UINT32)lpitem->text,
-                       sizeof(BITMAP), (LPSTR)&bm ))
+	BITMAP16 bm;
+        if (GetObject16( (HBITMAP16)(UINT32)lpitem->text, sizeof(bm), &bm ))
         {
             lpitem->rect.right  += bm.bmWidth;
             lpitem->rect.bottom += bm.bmHeight;
@@ -1119,7 +1118,7 @@
                      flags );
         str = res;
         if (!unicode) res += strlen(str) + 1;
-        else res += (STRING32_lstrlenW((LPCWSTR)str) + 1) * sizeof(WCHAR);
+        else res += (lstrlen32W((LPCWSTR)str) + 1) * sizeof(WCHAR);
         if (flags & MF_POPUP)
         {
             HMENU hSubMenu = CreatePopupMenu();
@@ -1540,7 +1539,7 @@
 static BOOL MENU_TrackMenu( HMENU hmenu, UINT wFlags, int x, int y,
 			    HWND hwnd, const RECT16 *lprect )
 {
-    MSG *msg;
+    MSG16 *msg;
     HLOCAL16 hMsg;
     POPUPMENU *menu;
     HMENU hmenuCurrent = hmenu;
@@ -1555,8 +1554,8 @@
 	MENU_ButtonDown( hwnd, hmenu, &hmenuCurrent, pt );
     }
     SetCapture( hwnd );
-    hMsg = USER_HEAP_ALLOC( sizeof(MSG) );
-    msg = (MSG *)USER_HEAP_LIN_ADDR( hMsg );
+    hMsg = USER_HEAP_ALLOC( sizeof(MSG16) );
+    msg = (MSG16 *)USER_HEAP_LIN_ADDR( hMsg );
     while (!fClosed)
     {
 	if (!MSG_InternalGetMessage( (SEGPTR)USER_HEAP_SEG_ADDR(hMsg), 0,
@@ -1695,7 +1694,7 @@
 	if (!fClosed) fRemove = TRUE;
 
         if (fRemove)  /* Remove the message from the queue */
-	    PeekMessage( msg, 0, msg->message, msg->message, PM_REMOVE );
+	    PeekMessage16( msg, 0, msg->message, msg->message, PM_REMOVE );
     }
     USER_HEAP_FREE( hMsg );
     ReleaseCapture();
@@ -2019,7 +2018,7 @@
     str[0] = '\0';
     if (!(item = MENU_FindItem( &hMenu, &wItemID, wFlags ))) return 0;
     if (!IS_STRING_ITEM(item->item_flags)) return 0;
-    lstrcpyn( str, item->text, nMaxSiz );
+    lstrcpyn32A( str, item->text, nMaxSiz );
     dprintf_menu( stddeb, "GetMenuString: returning '%s'\n", str );
     return strlen(str);
 }
diff --git a/debugger/break.c b/debugger/break.c
index edbddb8..1726c16 100644
--- a/debugger/break.c
+++ b/debugger/break.c
@@ -288,7 +288,7 @@
                 0 : CS_reg(DEBUG_context);
     addr.off = EIP_reg(DEBUG_context);
         
-    bpnum  = DEBUG_FindBreakpoint( &addr );
+    bpnum = DEBUG_FindBreakpoint( &addr );
     breakpoints[0].enabled = 0;  /* disable the step-over breakpoint */
 
     if ((bpnum != 0) && (bpnum != -1))
@@ -299,6 +299,12 @@
         fprintf( stderr, "\n" );
         return FALSE;
     }
+
+    /* If there's no breakpoint and we are not single-stepping, then we     */
+    /* must have encountered an int3 in the Windows program; let's skip it. */
+    if ((bpnum == -1) && !(EFL_reg(DEBUG_context) & STEP_FLAG))
+        EIP_reg(DEBUG_context)++;
+
       /* no breakpoint, continue if in continuous mode */
     return (mode == EXEC_CONT);
 }
diff --git a/debugger/db_disasm.c b/debugger/db_disasm.c
index 8d38f5a..ab59a97 100644
--- a/debugger/db_disasm.c
+++ b/debugger/db_disasm.c
@@ -123,11 +123,11 @@
 #define	XA	34			/* for 'fstcw %ax' */
 
 struct inst {
-	char *	i_name;			/* name */
-	short	i_has_modrm;		/* has regmodrm byte */
-	short	i_size;			/* operand size */
-	int	i_mode;			/* addressing modes */
-	char *	i_extra;		/* pointer to extra opcode table */
+	const char *i_name;		/* name */
+	short       i_has_modrm;	/* has regmodrm byte */
+	short       i_size;		/* operand size */
+	int         i_mode;		/* addressing modes */
+	const char *i_extra;		/* pointer to extra opcode table */
 };
 
 #define	op1(x)		(x)
@@ -135,14 +135,14 @@
 #define	op3(x,y,z)	((x)|((y)<<8)|((z)<<16))
 
 struct finst {
-	char *	f_name;			/* name for memory instruction */
-	int	f_size;			/* size for memory instruction */
-	int	f_rrmode;		/* mode for rr instruction */
-	char *	f_rrname;		/* name for rr instruction
+	const char *f_name;		/* name for memory instruction */
+	int         f_size;		/* size for memory instruction */
+	int         f_rrmode;		/* mode for rr instruction */
+	const char *f_rrname;		/* name for rr instruction
 					   (or pointer to table) */
 };
 
-static char *	db_Grp6[] = {
+static const char * const db_Grp6[] = {
 	"sldt",
 	"str",
 	"lldt",
@@ -153,7 +153,7 @@
 	""
 };
 
-static char *	db_Grp7[] = {
+static const char * const db_Grp7[] = {
 	"sgdt",
 	"sidt",
 	"lgdt",
@@ -164,7 +164,7 @@
 	"invlpg"
 };
 
-static char *	db_Grp8[] = {
+static const char * const db_Grp8[] = {
 	"",
 	"",
 	"",
@@ -175,7 +175,7 @@
 	"btc"
 };
 
-static struct inst db_inst_0f0x[] = {
+static const struct inst db_inst_0f0x[] = {
 /*00*/	{ "",	   TRUE,  NONE,  op1(Ew),     (char *)db_Grp6 },
 /*01*/	{ "",	   TRUE,  NONE,  op1(Ew),     (char *)db_Grp7 },
 /*02*/	{ "lar",   TRUE,  LONG,  op2(E,R),    0 },
@@ -195,7 +195,7 @@
 /*0f*/	{ "",      FALSE, NONE,  0,	      0 },
 };
 
-static struct inst	db_inst_0f2x[] = {
+static const struct inst db_inst_0f2x[] = {
 /*20*/	{ "mov",   TRUE,  LONG,  op2(CR,E),   0 }, /* use E for reg */
 /*21*/	{ "mov",   TRUE,  LONG,  op2(DR,E),   0 }, /* since mod == 11 */
 /*22*/	{ "mov",   TRUE,  LONG,  op2(E,CR),   0 },
@@ -215,7 +215,7 @@
 /*2f*/	{ "",      FALSE, NONE,  0,	      0 },
 };
 
-static struct inst	db_inst_0f8x[] = {
+static const struct inst db_inst_0f8x[] = {
 /*80*/	{ "jo",    FALSE, NONE,  op1(Dl),     0 },
 /*81*/	{ "jno",   FALSE, NONE,  op1(Dl),     0 },
 /*82*/	{ "jb",    FALSE, NONE,  op1(Dl),     0 },
@@ -235,7 +235,7 @@
 /*8f*/	{ "jnle",  FALSE, NONE,  op1(Dl),     0 },
 };
 
-static struct inst	db_inst_0f9x[] = {
+static const struct inst db_inst_0f9x[] = {
 /*90*/	{ "seto",  TRUE,  NONE,  op1(Eb),     0 },
 /*91*/	{ "setno", TRUE,  NONE,  op1(Eb),     0 },
 /*92*/	{ "setb",  TRUE,  NONE,  op1(Eb),     0 },
@@ -255,7 +255,7 @@
 /*9f*/	{ "setnle",TRUE,  NONE,  op1(Eb),     0 },
 };
 
-static struct inst	db_inst_0fax[] = {
+static const struct inst db_inst_0fax[] = {
 /*a0*/	{ "push",  FALSE, NONE,  op1(Si),     0 },
 /*a1*/	{ "pop",   FALSE, NONE,  op1(Si),     0 },
 /*a2*/	{ "",      FALSE, NONE,  0,	      0 },
@@ -275,7 +275,7 @@
 /*a7*/	{ "imul",  TRUE,  LONG,  op2(E,R),    0 },
 };
 
-static struct inst	db_inst_0fbx[] = {
+static const struct inst db_inst_0fbx[] = {
 /*b0*/	{ "",      FALSE, NONE,  0,	      0 },
 /*b1*/	{ "",      FALSE, NONE,  0,	      0 },
 /*b2*/	{ "lss",   TRUE,  LONG,  op2(E, R),   0 },
@@ -295,7 +295,7 @@
 /*bf*/	{ "movsw", TRUE,  LONG,  op2(E, R),   0 },
 };
 
-static struct inst	db_inst_0fcx[] = {
+static const struct inst db_inst_0fcx[] = {
 /*c0*/	{ "xadd",  TRUE,  BYTE,	 op2(R, E),   0 },
 /*c1*/	{ "xadd",  TRUE,  LONG,	 op2(R, E),   0 },
 /*c2*/	{ "",	   FALSE, NONE,	 0,	      0 },
@@ -314,7 +314,7 @@
 /*cf*/	{ "bswap", FALSE, LONG,  op1(Ri),     0 },
 };
 
-static struct inst	db_inst_0fdx[] = {
+static const struct inst db_inst_0fdx[] = {
 /*c0*/	{ "cmpxchg",TRUE, BYTE,	 op2(R, E),   0 },
 /*c1*/	{ "cmpxchg",TRUE, LONG,	 op2(R, E),   0 },
 /*c2*/	{ "",	   FALSE, NONE,	 0,	      0 },
@@ -333,7 +333,7 @@
 /*cf*/	{ "",	   FALSE, NONE,	 0,	      0 },
 };
 
-static struct inst *db_inst_0f[] = {
+static const struct inst * const db_inst_0f[] = {
 	db_inst_0f0x,
 	0,
 	db_inst_0f2x,
@@ -352,43 +352,43 @@
 	0
 };
 
-static char *	db_Esc92[] = {
+static const char * const db_Esc92[] = {
 	"fnop",	"",	"",	"",	"",	"",	"",	""
 };
-static char *	db_Esc93[] = {
+static const char * const db_Esc93[] = {
 	"",	"",	"",	"",	"",	"",	"",	""
 };
-static char *	db_Esc94[] = {
+static const char * const db_Esc94[] = {
 	"fchs",	"fabs",	"",	"",	"ftst",	"fxam",	"",	""
 };
-static char *	db_Esc95[] = {
+static const char * const db_Esc95[] = {
 	"fld1",	"fldl2t","fldl2e","fldpi","fldlg2","fldln2","fldz",""
 };
-static char *	db_Esc96[] = {
+static const char * const db_Esc96[] = {
 	"f2xm1","fyl2x","fptan","fpatan","fxtract","fprem1","fdecstp",
 	"fincstp"
 };
-static char *	db_Esc97[] = {
+static const char * const db_Esc97[] = {
 	"fprem","fyl2xp1","fsqrt","fsincos","frndint","fscale","fsin","fcos"
 };
 
-static char *	db_Esca4[] = {
+static const char * const db_Esca4[] = {
 	"",	"fucompp","",	"",	"",	"",	"",	""
 };
 
-static char *	db_Escb4[] = {
+static const char * const db_Escb4[] = {
 	"",	"",	"fnclex","fninit","",	"",	"",	""
 };
 
-static char *	db_Esce3[] = {
+static const char * const db_Esce3[] = {
 	"",	"fcompp","",	"",	"",	"",	"",	""
 };
 
-static char *	db_Escf4[] = {
+static const char * const db_Escf4[] = {
 	"fnstsw","",	"",	"",	"",	"",	"",	""
 };
 
-static struct finst db_Esc8[] = {
+static const struct finst db_Esc8[] = {
 /*0*/	{ "fadd",   SNGL,  op2(STI,ST),	0 },
 /*1*/	{ "fmul",   SNGL,  op2(STI,ST),	0 },
 /*2*/	{ "fcom",   SNGL,  op2(STI,ST),	0 },
@@ -399,7 +399,7 @@
 /*7*/	{ "fdivr",  SNGL,  op2(STI,ST),	0 },
 };
 
-static struct finst db_Esc9[] = {
+static const struct finst db_Esc9[] = {
 /*0*/	{ "fld",    SNGL,  op1(STI),	0 },
 /*1*/	{ "",       NONE,  op1(STI),	"fxch" },
 /*2*/	{ "fst",    SNGL,  op1(X),	(char *)db_Esc92 },
@@ -410,7 +410,7 @@
 /*7*/	{ "fnstcw", NONE,  op1(X),	(char *)db_Esc97 },
 };
 
-static struct finst db_Esca[] = {
+static const struct finst db_Esca[] = {
 /*0*/	{ "fiadd",  WORD,  0,		0 },
 /*1*/	{ "fimul",  WORD,  0,		0 },
 /*2*/	{ "ficom",  WORD,  0,		0 },
@@ -421,7 +421,7 @@
 /*7*/	{ "fidivr", WORD,  0,		0 }
 };
 
-static struct finst db_Escb[] = {
+static const struct finst db_Escb[] = {
 /*0*/	{ "fild",   WORD,  0,		0 },
 /*1*/	{ "",       NONE,  0,		0 },
 /*2*/	{ "fist",   WORD,  0,		0 },
@@ -432,7 +432,7 @@
 /*7*/	{ "fstp",   EXTR,  0,		0 },
 };
 
-static struct finst db_Escc[] = {
+static const struct finst db_Escc[] = {
 /*0*/	{ "fadd",   DBLR,  op2(ST,STI),	0 },
 /*1*/	{ "fmul",   DBLR,  op2(ST,STI),	0 },
 /*2*/	{ "fcom",   DBLR,  op2(ST,STI),	0 },
@@ -443,7 +443,7 @@
 /*7*/	{ "fdivr",  DBLR,  op2(ST,STI),	"fdiv" },
 };
 
-static struct finst db_Escd[] = {
+static const struct finst db_Escd[] = {
 /*0*/	{ "fld",    DBLR,  op1(STI),	"ffree" },
 /*1*/	{ "",       NONE,  0,		0 },
 /*2*/	{ "fst",    DBLR,  op1(STI),	0 },
@@ -454,7 +454,7 @@
 /*7*/	{ "fnstsw", NONE,  0,		0 },
 };
 
-static struct finst db_Esce[] = {
+static const struct finst db_Esce[] = {
 /*0*/	{ "fiadd",  LONG,  op2(ST,STI),	"faddp" },
 /*1*/	{ "fimul",  LONG,  op2(ST,STI),	"fmulp" },
 /*2*/	{ "ficom",  LONG,  0,		0 },
@@ -465,7 +465,7 @@
 /*7*/	{ "fidivr", LONG,  op2(ST,STI),	"fdivp" },
 };
 
-static struct finst db_Escf[] = {
+static const struct finst db_Escf[] = {
 /*0*/	{ "fild",   LONG,  0,		0 },
 /*1*/	{ "",       LONG,  0,		0 },
 /*2*/	{ "fist",   LONG,  0,		0 },
@@ -476,12 +476,12 @@
 /*7*/	{ "fstp",   QUAD,  0,		0 },
 };
 
-static struct finst *db_Esc_inst[] = {
+static const struct finst * const db_Esc_inst[] = {
 	db_Esc8, db_Esc9, db_Esca, db_Escb,
 	db_Escc, db_Escd, db_Esce, db_Escf
 };
 
-static char *	db_Grp1[] = {
+static const char * const db_Grp1[] = {
 	"add",
 	"or",
 	"adc",
@@ -492,7 +492,7 @@
 	"cmp"
 };
 
-static char *	db_Grp2[] = {
+static const char * const db_Grp2[] = {
 	"rol",
 	"ror",
 	"rcl",
@@ -503,7 +503,7 @@
 	"sar"
 };
 
-static struct inst db_Grp3[] = {
+static const struct inst db_Grp3[] = {
 	{ "test",  TRUE, NONE, op2(I,E), 0 },
 	{ "test",  TRUE, NONE, op2(I,E), 0 },
 	{ "not",   TRUE, NONE, op1(E),   0 },
@@ -514,7 +514,7 @@
 	{ "idiv",  TRUE, NONE, op2(E,A), 0 },
 };
 
-static struct inst	db_Grp4[] = {
+static const struct inst db_Grp4[] = {
 	{ "inc",   TRUE, BYTE, op1(E),   0 },
 	{ "dec",   TRUE, BYTE, op1(E),   0 },
 	{ "",      TRUE, NONE, 0,	 0 },
@@ -525,7 +525,7 @@
 	{ "",      TRUE, NONE, 0,	 0 }
 };
 
-static struct inst	db_Grp5[] = {
+static const struct inst db_Grp5[] = {
 	{ "inc",   TRUE, LONG, op1(E),   0 },
 	{ "dec",   TRUE, LONG, op1(E),   0 },
 	{ "call",  TRUE, NONE, op1(Eind),0 },
@@ -536,7 +536,7 @@
 	{ "",      TRUE, NONE, 0,	 0 }
 };
 
-static struct inst db_inst_table[256] = {
+static const struct inst db_inst_table[256] = {
 /*00*/	{ "add",   TRUE,  BYTE,  op2(R, E),  0 },
 /*01*/	{ "add",   TRUE,  LONG,  op2(R, E),  0 },
 /*02*/	{ "add",   TRUE,  BYTE,  op2(E, R),  0 },
@@ -827,7 +827,7 @@
 /*ff*/	{ "",	   TRUE,  NONE,  0,	     (char *)db_Grp5 },
 };
 
-static struct inst	db_bad_inst =
+static const struct inst db_bad_inst =
 	{ "???",   FALSE, NONE,  0,	      0 }
 ;
 
@@ -842,12 +842,12 @@
 struct i_addr {
 	int		is_reg;	/* if reg, reg number is in 'disp' */
 	int		disp;
-	char *		base;
-	char *		index;
+	const char *	base;
+	const char *	index;
 	int		ss;
 };
 
-static char *	db_index_reg_16[8] = {
+static const char * const db_index_reg_16[8] = {
 	"%bx,%si",
 	"%bx,%di",
 	"%bp,%si",
@@ -858,20 +858,20 @@
 	"%bx"
 };
 
-static char *	db_reg[3][8] = {
+static const char * const db_reg[3][8] = {
 	{ "%al",  "%cl",  "%dl",  "%bl",  "%ah",  "%ch",  "%dh",  "%bh" },
 	{ "%ax",  "%cx",  "%dx",  "%bx",  "%sp",  "%bp",  "%si",  "%di" },
 	{ "%eax", "%ecx", "%edx", "%ebx", "%esp", "%ebp", "%esi", "%edi" }
 };
 
-static char *	db_seg_reg[8] = {
+static const char * const db_seg_reg[8] = {
 	"%es", "%cs", "%ss", "%ds", "%fs", "%gs", "", ""
 };
 
 /*
  * lengths for size attributes
  */
-static int db_lengths[] = {
+static const int db_lengths[] = {
 	1,	/* BYTE */
 	2,	/* WORD */
 	4,	/* LONG */
@@ -1051,10 +1051,10 @@
                     int size, char *seg )
 {
 	int		regmodrm;
-	struct finst	*fp;
+	const struct finst *fp;
 	int		mod;
 	struct i_addr	address;
-	char *		name;
+	const char *	name;
 
 	get_value_inc(regmodrm, addr, 1, FALSE);
 	fp = &db_Esc_inst[inst - 0xd8][f_reg(regmodrm)];
@@ -1134,8 +1134,8 @@
 	int	size;
 	int	short_addr;
 	char *	seg;
-	struct inst *	ip;
-	char *	i_name;
+	const struct inst *ip;
+	const char *i_name;
 	int	i_size;
 	int	i_mode;
 	int	regmodrm = 0;
diff --git a/debugger/hash.c b/debugger/hash.c
index c0e6e28..56af9e5 100644
--- a/debugger/hash.c
+++ b/debugger/hash.c
@@ -25,7 +25,7 @@
 
 #define NR_NAME_HASH 128
 
-static struct name_hash * name_hash_table[NR_NAME_HASH] = {0,};
+static struct name_hash * name_hash_table[NR_NAME_HASH];
 
 static unsigned int name_hash( const char * name )
 {
diff --git a/debugger/info.c b/debugger/info.c
index b656879..36e5cab 100644
--- a/debugger/info.c
+++ b/debugger/info.c
@@ -95,7 +95,7 @@
 void DEBUG_Help(void)
 {
     int i = 0;
-    static const char * helptext[] =
+    static const char * const helptext[] =
 {
 "The commands accepted by the Wine debugger are a small subset",
 "of the commands that gdb would accept.  The commands currently",
diff --git a/files/directory.c b/files/directory.c
index 85542dd..432b8c4 100644
--- a/files/directory.c
+++ b/files/directory.c
@@ -182,7 +182,7 @@
  */
 UINT DIR_GetTempDosDir( LPSTR path, UINT count )
 {
-    if (path) lstrcpyn( path, DIR_TempDosDir, count );
+    if (path) lstrcpyn32A( path, DIR_TempDosDir, count );
     return strlen( DIR_TempDosDir );
 }
 
@@ -192,7 +192,7 @@
  */
 UINT DIR_GetTempUnixDir( LPSTR path, UINT count )
 {
-    if (path) lstrcpyn( path, DIR_TempUnixDir, count );
+    if (path) lstrcpyn32A( path, DIR_TempUnixDir, count );
     return strlen( DIR_TempUnixDir );
 }
 
@@ -202,7 +202,7 @@
  */
 UINT DIR_GetWindowsUnixDir( LPSTR path, UINT count )
 {
-    if (path) lstrcpyn( path, DIR_WindowsUnixDir, count );
+    if (path) lstrcpyn32A( path, DIR_WindowsUnixDir, count );
     return strlen( DIR_WindowsUnixDir );
 }
 
@@ -212,7 +212,7 @@
  */
 UINT DIR_GetSystemUnixDir( LPSTR path, UINT count )
 {
-    if (path) lstrcpyn( path, DIR_SystemUnixDir, count );
+    if (path) lstrcpyn32A( path, DIR_SystemUnixDir, count );
     return strlen( DIR_SystemUnixDir );
 }
 
@@ -223,7 +223,7 @@
 UINT DIR_GetDosPath( int element, LPSTR path, UINT count )
 {
     if ((element < 0) || (element >= DIR_PathElements)) return 0;
-    if (path) lstrcpyn( path, DIR_DosPath[element], count );
+    if (path) lstrcpyn32A( path, DIR_DosPath[element], count );
     return strlen( DIR_DosPath[element] );
 }
 
@@ -242,7 +242,7 @@
  */
 UINT GetWindowsDirectory( LPSTR path, UINT count )
 {
-    if (path) lstrcpyn( path, DIR_WindowsDosDir, count );
+    if (path) lstrcpyn32A( path, DIR_WindowsDosDir, count );
     return strlen( DIR_WindowsDosDir );
 }
 
@@ -252,6 +252,6 @@
  */
 UINT GetSystemDirectory( LPSTR path, UINT count )
 {
-    if (path) lstrcpyn( path, DIR_SystemDosDir, count );
+    if (path) lstrcpyn32A( path, DIR_SystemDosDir, count );
     return strlen( DIR_SystemDosDir );
 }
diff --git a/files/dos_fs.c b/files/dos_fs.c
index 6565361..6e3efd8 100644
--- a/files/dos_fs.c
+++ b/files/dos_fs.c
@@ -397,7 +397,7 @@
             if (!strcmp( dos_name, hash_name )) break;
         }
     }
-    if (dirent) lstrcpyn( buffer, dirent->d_name, maxlen );
+    if (dirent) lstrcpyn32A( buffer, dirent->d_name, maxlen );
     closedir( dir );
     dprintf_dosfs( stddeb, "DOSFS_FindUnixName(%s,%s) -> %s\n",
                    path, name, dirent ? buffer : "** Not found **" );
@@ -422,7 +422,7 @@
     for (i = 0; i < sizeof(DOSFS_Devices)/sizeof(DOSFS_Devices[0]); i++)
     {
         const char *dev = DOSFS_Devices[i][0];
-        if (!lstrncmpi( dev, name, strlen(dev) ))
+        if (!lstrncmpi32A( dev, name, strlen(dev) ))
         {
             p = name + strlen( dev );
             if (!*p || (*p == '.')) return DOSFS_Devices[i][1];
@@ -468,7 +468,7 @@
         DOS_ERROR( ER_InvalidDrive, EC_MediaError, SA_Abort, EL_Disk );
         return NULL;
     }
-    lstrcpyn( buffer, DRIVE_GetRoot(drive), MAX_PATHNAME_LEN );
+    lstrcpyn32A( buffer, DRIVE_GetRoot(drive), MAX_PATHNAME_LEN );
     if (buffer[1]) root = buffer + strlen(buffer);
     else root = buffer;  /* root directory */
 
@@ -478,8 +478,8 @@
     }
     else
     {
-        lstrcpyn( root + 1, DRIVE_GetUnixCwd(drive),
-                  MAX_PATHNAME_LEN - (int)(root - buffer) - 1 );
+        lstrcpyn32A( root + 1, DRIVE_GetUnixCwd(drive),
+                     MAX_PATHNAME_LEN - (int)(root - buffer) - 1 );
         if (root[1]) *root = '/';
     }
 
@@ -582,7 +582,7 @@
     else
     {
         *p++ = '\\';
-        lstrcpyn( p, DRIVE_GetDosCwd(drive), sizeof(buffer) - 3 );
+        lstrcpyn32A( p, DRIVE_GetDosCwd(drive), sizeof(buffer) - 3 );
         if (*p) p += strlen(p); else p--;
     }
     *p = '\0';
@@ -605,7 +605,7 @@
         *p++ = '\\';
         if (unix_format)  /* Hash it into a DOS name */
         {
-            lstrcpyn( p, DOSFS_Hash( name, FALSE ), len );
+            lstrcpyn32A( p, DOSFS_Hash( name, FALSE ), len );
             len -= strlen(p);
             p += strlen(p);
             while (!IS_END_OF_NAME(*name)) name++;
@@ -678,7 +678,7 @@
             if (!*drive_path) drive_root = 1;
         }
         dprintf_dosfs(stddeb, "DOSFS_FindNext: drive_root = %d\n", drive_root);
-        lstrcpyn( buffer, path, sizeof(buffer) - 1 );
+        lstrcpyn32A( buffer, path, sizeof(buffer) - 1 );
         
     }
     strcat( buffer, "/" );
@@ -695,7 +695,7 @@
         if (drive_root && (dirent->d_name[0] == '.') &&
             (!dirent->d_name[1] ||
              ((dirent->d_name[1] == '.') && !dirent->d_name[2]))) continue;
-        lstrcpyn( p, dirent->d_name, sizeof(buffer) - (int)(p - buffer) );
+        lstrcpyn32A( p, dirent->d_name, sizeof(buffer) - (int)(p - buffer) );
 
         if (!FILE_Stat( buffer, &entry->attr, &entry->size,
                         &entry->date, &entry->time ))
@@ -705,7 +705,7 @@
         }
         if (entry->attr & ~attr) continue;
         strcpy( entry->name, hash_name );
-        lstrcpyn( entry->unixname, dirent->d_name, sizeof(entry->unixname) );
+        lstrcpyn32A( entry->unixname, dirent->d_name, sizeof(entry->unixname));
         dprintf_dosfs( stddeb, "DOSFS_FindNext: returning %s %02x %ld\n",
                        entry->name, entry->attr, entry->size );
         cur_pos += count;
diff --git a/files/drive.c b/files/drive.c
index c51c2f5..8813696 100644
--- a/files/drive.c
+++ b/files/drive.c
@@ -72,7 +72,7 @@
     PROFILE_GetWineIniString( name, "Type", "hd", buffer, sizeof(buffer) );
     for (i = 0; i < sizeof(DRIVE_Types)/sizeof(DRIVE_Types[0]); i++)
     {
-        if (!lstrcmpi( buffer, DRIVE_Types[i] )) return (DRIVETYPE)i;
+        if (!lstrcmpi32A( buffer, DRIVE_Types[i] )) return (DRIVETYPE)i;
     }
     fprintf( stderr, "%s: unknown type '%s', defaulting to 'hd'.\n",
              name, buffer );
@@ -362,7 +362,7 @@
     dprintf_dosfs( stddeb, "DRIVE_Chdir(%c:,%s)\n", 'A' + drive, path );
     strcpy( buffer, "A:" );
     buffer[0] += drive;
-    lstrcpyn( buffer + 2, path, sizeof(buffer) - 2 );
+    lstrcpyn32A( buffer + 2, path, sizeof(buffer) - 2 );
 
     if (!(unix_cwd = DOSFS_GetUnixFileName( buffer, TRUE ))) return 0;
     if (!FILE_Stat( unix_cwd, &attr, NULL, NULL, NULL )) return 0;
@@ -374,7 +374,7 @@
     unix_cwd += strlen( DOSDrives[drive].root );
     while (*unix_cwd == '/') unix_cwd++;
     buffer[2] = '/';
-    lstrcpyn( buffer + 3, unix_cwd, sizeof(buffer) - 3 );
+    lstrcpyn32A( buffer + 3, unix_cwd, sizeof(buffer) - 3 );
     if (!(dos_cwd = DOSFS_GetDosTrueName( buffer, TRUE ))) return 0;
 
     dprintf_dosfs( stddeb, "DRIVE_Chdir(%c:): unix_cwd=%s dos_cwd=%s\n",
@@ -388,7 +388,7 @@
     if (pTask && (pTask->curdrive & 0x80) && 
         ((pTask->curdrive & ~0x80) == drive))
     {
-        lstrcpyn( pTask->curdir, dos_cwd + 2, sizeof(pTask->curdir) );
+        lstrcpyn32A( pTask->curdir, dos_cwd + 2, sizeof(pTask->curdir) );
         DRIVE_LastTask = GetCurrentTask();
     }
     return 1;
@@ -511,7 +511,7 @@
         *buf = '\0';
         return 0;
     }
-    lstrcpyn( buf, s, buflen );
+    lstrcpyn32A( buf, s, buflen );
     return strlen(s); /* yes */
 }
 
diff --git a/files/file.c b/files/file.c
index e9881a0..9662636 100644
--- a/files/file.c
+++ b/files/file.c
@@ -5,6 +5,7 @@
  * Copyright 1996 Alexandre Julliard
  */
 
+#include <ctype.h>
 #include <errno.h>
 #include <fcntl.h>
 #include <stdio.h>
@@ -43,7 +44,7 @@
 } DOS_FILE;
 
 /* Global files array */
-static DOS_FILE DOSFiles[MAX_OPEN_FILES] = { { 0, }, };
+static DOS_FILE DOSFiles[MAX_OPEN_FILES];
 
 static DOS_FILE *FILE_First = DOSFiles;
 static DOS_FILE *FILE_LastUsed = DOSFiles;
@@ -599,12 +600,12 @@
 /***********************************************************************
  *           FILE_Read
  */
-LONG FILE_Read( HFILE hFile, void *buffer, LONG count )
+INT32 FILE_Read( HFILE hFile, LPVOID buffer, UINT32 count )
 {
     DOS_FILE *file;
-    LONG result;
+    INT32 result;
 
-    dprintf_file( stddeb, "FILE_Read: %d %p %ld\n", hFile, buffer, count );
+    dprintf_file( stddeb, "FILE_Read: %d %p %d\n", hFile, buffer, count );
     if (!(file = FILE_GetFile( hFile ))) return -1;
     if (!count) return 0;
     if ((result = read( file->unix_handle, buffer, count )) == -1)
@@ -622,6 +623,14 @@
     UINT num = unique ? (unique & 0xffff) : time(NULL) & 0xffff;
     char *p;
 
+    if ((drive & TF_FORCEDRIVE) &&
+        !DRIVE_IsValid( toupper(drive & ~TF_FORCEDRIVE) - 'A' ))
+    {
+        drive &= ~TF_FORCEDRIVE;
+        fprintf( stderr, "Warning: GetTempFileName: invalid drive %d specified\n",
+                 drive );
+    }
+
     if (drive & TF_FORCEDRIVE)
     {
         sprintf( buffer, "%c:", drive & ~TF_FORCEDRIVE );
@@ -638,7 +647,7 @@
 
     if (unique)
     {
-        lstrcpyn( buffer, DOSFS_GetDosTrueName( buffer, FALSE ), 144 );
+        lstrcpyn32A( buffer, DOSFS_GetDosTrueName( buffer, FALSE ), 144 );
         dprintf_file( stddeb, "GetTempFileName: returning %s\n", buffer );
         return unique;
     }
@@ -659,7 +668,7 @@
         sprintf( p, "%04x.tmp", num );
     } while (num != (unique & 0xffff));
 
-    lstrcpyn( buffer, DOSFS_GetDosTrueName( buffer, FALSE ), 144 );
+    lstrcpyn32A( buffer, DOSFS_GetDosTrueName( buffer, FALSE ), 144 );
     dprintf_file( stddeb, "GetTempFileName: returning %s\n", buffer );
     return num;
 }
@@ -696,7 +705,7 @@
     if (mode & OF_PARSE)
     {
         if (!(dosName = DOSFS_GetDosTrueName( name, FALSE ))) goto error;
-        lstrcpyn( ofs->szPathName, dosName, sizeof(ofs->szPathName) );
+        lstrcpyn32A( ofs->szPathName, dosName, sizeof(ofs->szPathName) );
         ofs->fFixedDisk = (GetDriveType( dosName[0]-'A' ) != DRIVE_REMOVABLE);
         dprintf_file( stddeb, "OpenFile(%s): OF_PARSE, res = '%s', %d\n",
                       name, ofs->szPathName, hFileRet );
@@ -712,8 +721,8 @@
     if (mode & OF_CREATE)
     {
         if (!(file = FILE_Create( name, 0666, FALSE ))) goto error;
-        lstrcpyn( ofs->szPathName, DOSFS_GetDosTrueName( name, FALSE ),
-                  sizeof(ofs->szPathName) );
+        lstrcpyn32A( ofs->szPathName, DOSFS_GetDosTrueName( name, FALSE ),
+                     sizeof(ofs->szPathName) );
         goto success;
     }
 
@@ -721,7 +730,7 @@
 
     /* First try the current directory */
 
-    lstrcpyn( ofs->szPathName, name, sizeof(ofs->szPathName) );
+    lstrcpyn32A( ofs->szPathName, name, sizeof(ofs->szPathName) );
     if ((unixName = DOSFS_GetUnixFileName( ofs->szPathName, TRUE )) != NULL)
         goto found;
 
@@ -784,8 +793,8 @@
 
 found:
     dprintf_file( stddeb, "OpenFile: found '%s'\n", unixName );
-    lstrcpyn( ofs->szPathName, DOSFS_GetDosTrueName( ofs->szPathName, FALSE ),
-              sizeof(ofs->szPathName) );
+    lstrcpyn32A(ofs->szPathName, DOSFS_GetDosTrueName( ofs->szPathName, FALSE),
+                sizeof(ofs->szPathName) );
 
     if (mode & OF_DELETE)
     {
diff --git a/files/profile.c b/files/profile.c
index 9932328..ec45261 100644
--- a/files/profile.c
+++ b/files/profile.c
@@ -73,7 +73,7 @@
 
     if (!handle_env)
     {
-        lstrcpyn( buffer, value, len );
+        lstrcpyn32A( buffer, value, len );
         if (quote && (len >= strlen(value))) buffer[strlen(buffer)-1] = '\0';
         return;
     }
@@ -86,10 +86,10 @@
             const char *env_p;
             const char *p2 = strchr( p, '}' );
             if (!p2) continue;  /* ignore it */
-            lstrcpyn( env_val, p + 2, MIN( sizeof(env_val), (int)(p2-p)-1 ) );
+            lstrcpyn32A(env_val, p + 2, MIN( sizeof(env_val), (int)(p2-p)-1 ));
             if ((env_p = getenv( env_val )) != NULL)
             {
-                lstrcpyn( buffer, env_p, len );
+                lstrcpyn32A( buffer, env_p, len );
                 buffer += strlen( buffer );
                 len -= strlen( buffer );
             }
@@ -230,7 +230,7 @@
 {
     while (*section)
     {
-        if ((*section)->name && !lstrcmpi( (*section)->name, name ))
+        if ((*section)->name && !lstrcmpi32A( (*section)->name, name ))
         {
             PROFILESECTION *to_del = *section;
             *section = to_del->next;
@@ -254,12 +254,12 @@
 {
     while (*section)
     {
-        if ((*section)->name && !lstrcmpi( (*section)->name, section_name ))
+        if ((*section)->name && !lstrcmpi32A( (*section)->name, section_name ))
         {
             PROFILEKEY **key = &(*section)->key;
             while (*key)
             {
-                if (!lstrcmpi( (*key)->name, key_name ))
+                if (!lstrcmpi32A( (*key)->name, key_name ))
                 {
                     PROFILEKEY *to_del = *key;
                     *key = to_del->next;
@@ -288,12 +288,12 @@
 {
     while (*section)
     {
-        if ((*section)->name && !lstrcmpi( (*section)->name, section_name ))
+        if ((*section)->name && !lstrcmpi32A( (*section)->name, section_name ))
         {
             PROFILEKEY **key = &(*section)->key;
             while (*key)
             {
-                if (!lstrcmpi( (*key)->name, key_name )) return *key;
+                if (!lstrcmpi32A( (*key)->name, key_name )) return *key;
                 key = &(*key)->next;
             }
             if (!create) return NULL;
@@ -446,7 +446,7 @@
     PROFILEKEY *key;
     while (section)
     {
-        if (section->name && !lstrcmpi( section->name, section_name ))
+        if (section->name && !lstrcmpi32A( section->name, section_name ))
         {
             INT oldlen = len;
             for (key = section->key; key; key = key->next)
@@ -574,7 +574,7 @@
 
     if ((p = getenv( "HOME" )) != NULL)
     {
-        lstrcpyn( buffer, p, MAX_PATHNAME_LEN - sizeof(PROFILE_WineIniName) );
+        lstrcpyn32A(buffer, p, MAX_PATHNAME_LEN - sizeof(PROFILE_WineIniName));
         strcat( buffer, PROFILE_WineIniName );
         if ((f = fopen( buffer, "r" )) != NULL)
         {
@@ -662,7 +662,7 @@
 {
     if (PROFILE_Open( filename ))
         return PROFILE_GetString( section, entry, def_val, buffer, len );
-    lstrcpyn( buffer, def_val, len );
+    lstrcpyn32A( buffer, def_val, len );
     return strlen( buffer );
 }
 
diff --git a/if1632/Makefile.in b/if1632/Makefile.in
index 5cb814c..c4bd7cc 100644
--- a/if1632/Makefile.in
+++ b/if1632/Makefile.in
@@ -15,6 +15,7 @@
 	kernel.spec \
 	kernel32.spec \
 	keyboard.spec \
+	lz32.spec \
 	lzexpand.spec \
 	mmsystem.spec \
 	mouse.spec \
@@ -37,6 +38,7 @@
 	user.spec \
 	user32.spec \
 	ver.spec \
+	version.spec \
 	w32sys.spec \
 	win87em.spec \
 	winsock.spec \
diff --git a/if1632/gdi.spec b/if1632/gdi.spec
index ef8e645..635e163 100644
--- a/if1632/gdi.spec
+++ b/if1632/gdi.spec
@@ -56,7 +56,7 @@
 #46  pascal __GP?
 47  pascal16 CombineRgn(word word word s_word) CombineRgn
 48  pascal16 CreateBitmap(word word word word ptr) CreateBitmap
-49  pascal16 CreateBitmapIndirect(ptr) CreateBitmapIndirect
+49  pascal16 CreateBitmapIndirect(ptr) CreateBitmapIndirect16
 50  pascal16 CreateBrushIndirect(ptr) CreateBrushIndirect
 51  pascal16 CreateCompatibleBitmap(word word word) CreateCompatibleBitmap
 52  pascal16 CreateCompatibleDC(word) CreateCompatibleDC
@@ -89,7 +89,7 @@
 79  pascal GetDCOrg(word) GetDCOrg
 80  pascal16 GetDeviceCaps(word s_word) GetDeviceCaps
 81  pascal16 GetMapMode(word) GetMapMode
-82  pascal16 GetObject(word word ptr) GetObject
+82  pascal16 GetObject(word s_word ptr) GetObject16
 83  pascal GetPixel(word s_word s_word) GetPixel
 84  pascal16 GetPolyFillMode(word) GetPolyFillMode
 85  pascal16 GetROP2(word) GetROP2
diff --git a/if1632/gdi32.spec b/if1632/gdi32.spec
index afa0d1c..e7dc132 100644
--- a/if1632/gdi32.spec
+++ b/if1632/gdi32.spec
@@ -27,8 +27,8 @@
 0022 stub CopyEnhMetaFileW
 0023 stub CopyMetaFileA
 0024 stub CopyMetaFileW
-0025 stub CreateBitmap
-0026 stub CreateBitmapIndirect
+0025 stdcall CreateBitmap(long long long long ptr) CreateBitmap
+0026 stdcall CreateBitmapIndirect(ptr) CreateBitmapIndirect32
 0027 stub CreateBrushIndirect
 0028 stub CreateColorSpaceA
 0029 stub CreateColorSpaceW
@@ -40,7 +40,7 @@
 0035 stub CreateDIBPatternBrushPt
 0036 stub CreateDIBSection
 0037 stub CreateDIBitmap
-0038 stub CreateDiscardableBitmap
+0038 stdcall CreateDiscardableBitmap(long long long) CreateDiscardableBitmap
 0039 stdcall CreateEllipticRgn(long long long long) CreateEllipticRgn
 0040 stdcall CreateEllipticRgnIndirect(ptr) CreateEllipticRgnIndirect32
 0041 stub CreateEnhMetaFileA
@@ -145,7 +145,7 @@
 0140 stub GdiSetServerAttr
 0141 stub GetArcDirection
 0142 stub GetAspectRatioFilterEx
-0143 stub GetBitmapBits
+0143 stdcall GetBitmapBits(long long ptr) GetBitmapBits
 0144 stdcall GetBitmapDimensionEx(long ptr) GetBitmapDimensionEx32
 0145 stub GetBkColor
 0146 stub GetBkMode
@@ -206,9 +206,9 @@
 0201 stub GetMiterLimit
 0202 stdcall GetNearestColor(long long) GetNearestColor
 0203 stub GetNearestPaletteIndex
-0204 stdcall GetObjectA(long long ptr) WIN32_GetObject
+0204 stdcall GetObjectA(long long ptr) GetObject32A
 0205 stub GetObjectType
-0206 stub GetObjectW
+0206 stdcall GetObjectW(long long ptr) GetObject32W
 0207 stub GetOutlineTextMetricsA
 0208 stub GetOutlineTextMetricsW
 0209 stub GetPaletteEntries
@@ -305,7 +305,7 @@
 0300 stub SelectPalette
 0301 stub SetAbortProc
 0302 stub SetArcDirection
-0303 stub SetBitmapBits
+0303 stdcall SetBitmapBits(long long ptr) SetBitmapBits
 0304 stdcall SetBitmapDimensionEx(long long long ptr) SetBitmapDimensionEx32
 0305 stdcall SetBkColor(long long) SetBkColor
 0306 stub SetBkMode
diff --git a/if1632/kernel.spec b/if1632/kernel.spec
index fb441e5..00fbace 100644
--- a/if1632/kernel.spec
+++ b/if1632/kernel.spec
@@ -83,10 +83,10 @@
 84  pascal   _llseek(word long word) _llseek
 85  pascal16 _lopen(ptr word) _lopen
 86  pascal16 _lwrite(word ptr word) _lwrite
-87  pascal16 RESERVED5(ptr ptr) lstrcmp
-88  pascal lstrcpy(segptr segptr) lstrcpy
-89  pascal lstrcat(segptr segptr) lstrcat
-90  pascal16 lstrlen(ptr) lstrlen
+87  pascal16 RESERVED5(ptr ptr) lstrcmp16
+88  pascal   lstrcpy(segptr segptr) lstrcpy16
+89  pascal   lstrcat(segptr segptr) lstrcat16
+90  pascal16 lstrlen(ptr) lstrlen16
 91  register InitTask() InitTask
 92  pascal16 GetTempDrive(byte) GetTempDrive
 93  pascal16 GetCodeHandle(segptr) GetCodeHandle
@@ -259,8 +259,8 @@
 349 pascal   _hread(word segptr long) _hread
 350 pascal   _hwrite(word ptr long) _hwrite
 #351 BUNNY_351
-352 stub lstrcatn
-353 pascal lstrcpyn(segptr segptr word) WIN16_lstrcpyn
+352 pascal   lstrcatn(segptr segptr word) lstrcatn16
+353 pascal   lstrcpyn(segptr segptr word) lstrcpyn16
 354 stub GetAppCompatFlags
 355 pascal16 GetWinDebugInfo(ptr word) GetWinDebugInfo
 356 pascal16 SetWinDebugInfo(ptr) SetWinDebugInfo
diff --git a/if1632/kernel32.spec b/if1632/kernel32.spec
index 82ced33..50982f9 100644
--- a/if1632/kernel32.spec
+++ b/if1632/kernel32.spec
@@ -145,7 +145,7 @@
 0140 stub FreeConsole
 0141 stdcall FreeEnvironmentStringsA(ptr)	FreeEnvironmentStringsA
 0142 stdcall FreeEnvironmentStringsW(ptr)	FreeEnvironmentStringsW
-0143 stub FreeLibrary
+0143 stdcall FreeLibrary(long) FreeLibrary32
 0144 stub FreeLibraryAndExitThread
 0145 stdcall FreeResource(long) FreeResource32
 0146 stub FreeVirtualBuffer
@@ -308,10 +308,9 @@
 0303 stub GetUserDefaultLCID
 0304 stub GetUserDefaultLangID
 0305 stub GetVDMCurrentDirectories
-#Use Win 3.1 GetVersion for now
-0306	stdcall GetVersion()	GetVersion
-0307 stub GetVersionExA
-0308 stub GetVersionExW
+0306 stdcall GetVersion() GetVersion32
+0307 stdcall GetVersionExA(ptr) GetVersionEx32A
+0308 stdcall GetVersionExW(ptr) GetVersionEx32W
 0309 stub GetVolumeInformationA
 0310 stub GetVolumeInformationW
 0311 stdcall GetWindowsDirectoryA(ptr long) GetWindowsDirectory
@@ -350,9 +349,9 @@
 0344 stdcall HeapWalk(long ptr) HeapWalk
 0345 stub InitAtomTable
 0346 stdcall InitializeCriticalSection(ptr) InitializeCriticalSection
-0347 stub InterlockedDecrement
-0348 stub InterlockedExchange
-0349 stub InterlockedIncrement
+0347 stdcall InterlockedDecrement(ptr) InterlockedDecrement
+0348 stdcall InterlockedExchange(ptr) InterlockedExchange
+0349 stdcall InterlockedIncrement(ptr) InterlockedIncrement
 0350 stub InvalidateConsoleDIBits
 0351 stdcall IsBadCodePtr(ptr long)	WIN32_IsBadCodePtr
 0352 stub IsBadHugeReadPtr
@@ -489,7 +488,7 @@
 0483 stub SetEndOfFile
 0484    stdcall SetEnvironmentVariableA(ptr ptr) SetEnvironmentVariableA
 0485 stub SetEnvironmentVariableW
-0486 stub SetErrorMode
+0486 stdcall SetErrorMode(long) SetErrorMode
 0487 	stdcall	SetEvent(long) SetEvent
 0488 stub SetFileApisToANSI
 0489 stub SetFileApisToOEM
@@ -601,24 +600,24 @@
 0595 stub _lopen
 0596 stub _lread
 0597 stub _lwrite
-0598    stdcall lstrcat(ptr ptr) strcat
-0599    stdcall lstrcatA(ptr ptr) strcat
-0600 stub lstrcatW
-0601    stdcall lstrcmp(ptr ptr) strcmp
-0602    stdcall lstrcmpA(ptr ptr) strcmp
-0603 stub lstrcmpW
-0604 stub lstrcmpi
-0605 stub lstrcmpiA
-0606 stub lstrcmpiW
-0607    stdcall lstrcpy(ptr ptr) strcpy
-0608 	stdcall lstrcpyA(ptr ptr) strcpy
-0609 stub lstrcpyW
-0610 stub lstrcpyn
-0611 stub lstrcpynA
-0612 stub lstrcpynW
-0613    stdcall lstrlen(ptr) strlen
-0614 	stdcall lstrlenA(ptr) strlen
-0615 stub lstrlenW
+0598 stdcall lstrcat(ptr ptr) lstrcat32A
+0599 stdcall lstrcatA(ptr ptr) lstrcat32A
+0600 stdcall lstrcatW(ptr ptr) lstrcat32W
+0601 stdcall lstrcmp(ptr ptr) lstrcmp32A
+0602 stdcall lstrcmpA(ptr ptr) lstrcmp32A
+0603 stdcall lstrcmpW(ptr ptr) lstrcmp32W
+0604 stdcall lstrcmpi(ptr ptr) lstrcmpi32A
+0605 stdcall lstrcmpiA(ptr ptr) lstrcmpi32A
+0606 stdcall lstrcmpiW(ptr ptr) lstrcmpi32W
+0607 stdcall lstrcpy(ptr ptr) lstrcpy32A
+0608 stdcall lstrcpyA(ptr ptr) lstrcpy32A
+0609 stdcall lstrcpyW(ptr ptr) lstrcpy32W
+0610 stdcall lstrcpyn(ptr ptr long) lstrcpyn32A
+0611 stdcall lstrcpynA(ptr ptr long) lstrcpyn32A
+0612 stdcall lstrcpynW(ptr ptr long) lstrcpyn32W
+0613 stdcall lstrlen(ptr) lstrlen32A
+0614 stdcall lstrlenA(ptr) lstrlen32A
+0615 stdcall lstrlenW(ptr) lstrlen32W
 #late additions
 0616 stub GetPrivateProfileSectionNamesA
 0617 stub GetPrivateProfileSectionNamesW
diff --git a/if1632/lz32.spec b/if1632/lz32.spec
new file mode 100644
index 0000000..6b4b0d4
--- /dev/null
+++ b/if1632/lz32.spec
@@ -0,0 +1,15 @@
+name	lz32
+type	win32
+
+0 stdcall LZCopy(word word) LZCopy
+1 stdcall LZOpenFileA(ptr ptr word) LZOpenFile32A
+2 stdcall LZInit(word) LZInit
+3 stdcall LZSeek(word long word) LZSeek
+4 stdcall LZRead(word ptr long) LZRead32
+5 stdcall LZClose(word) LZClose
+6 stdcall LZStart() LZStart
+7 stdcall CopyLZFile(word word) CopyLZFile
+8 stdcall LZDone() LZDone
+9 stdcall GetExpandedNameA(ptr ptr) GetExpandedName32A
+10 stdcall LZOpenFileW(ptr ptr word) LZOpenFile32W
+11 stdcall GetExpandedNameW(ptr ptr) GetExpandedName32W
diff --git a/if1632/lzexpand.spec b/if1632/lzexpand.spec
index ca0e9d3..e05997a 100644
--- a/if1632/lzexpand.spec
+++ b/if1632/lzexpand.spec
@@ -2,14 +2,14 @@
 type	win16
 
 1  pascal   LZCopy(word word) LZCopy
-2  pascal16 LZOpenFile(ptr ptr word) LZOpenFile
+2  pascal16 LZOpenFile(ptr ptr word) LZOpenFile16
 3  pascal16 LZInit(word) LZInit
 4  pascal   LZSeek(word long word) LZSeek
-5  pascal16 LZRead(word segptr word) LZRead
+5  pascal16 LZRead(word segptr word) LZRead16
 6  pascal16 LZClose(word) LZClose
 7  pascal16 LZStart() LZStart
 8  pascal   CopyLZFile(word word) CopyLZFile
 9  pascal16 LZDone() LZDone
-10 pascal16 GetExpandedName(ptr ptr) GetExpandedName
+10 pascal16 GetExpandedName(ptr ptr) GetExpandedName16
 #11 WEP
 #12 ___EXPORTEDSTUB 
diff --git a/if1632/user.spec b/if1632/user.spec
index 0a3c3bf..9afd4b4 100644
--- a/if1632/user.spec
+++ b/if1632/user.spec
@@ -108,7 +108,7 @@
 106 pascal16 GetKeyState(word) GetKeyState
 107 pascal   DefWindowProc(word word word long) DefWindowProc16
 108 pascal16 GetMessage(segptr word word word) GetMessage
-109 pascal16 PeekMessage(ptr word word word word) PeekMessage
+109 pascal16 PeekMessage(ptr word word word word) PeekMessage16
 110 pascal16 PostMessage(word word word long) PostMessage
 111 pascal   SendMessage(word word word long) SendMessage16
 112 pascal16 WaitMessage() WaitMessage
@@ -184,7 +184,7 @@
 182 pascal16 KillSystemTimer(word word) KillSystemTimer
 183 pascal16 GetCaretPos(ptr) GetCaretPos16
 184 stub QuerySendMessage
-185 pascal16 GrayString(word word ptr ptr word word word word word) GrayString
+185 pascal16 GrayString(word word segptr segptr s_word s_word s_word s_word s_word) GrayString
 186 pascal16 SwapMouseButton(word) SwapMouseButton
 187 pascal16 EndMenu() EndMenu
 188 pascal16 SetSysModalWindow(word) SetSysModalWindow
@@ -372,14 +372,14 @@
 416 pascal16 TrackPopupMenu(word word s_word s_word s_word word ptr) TrackPopupMenu16
 417 pascal   GetMenuCheckMarkDimensions() GetMenuCheckMarkDimensions
 418 pascal16 SetMenuItemBitmaps(word word word word word) SetMenuItemBitmaps
-420 pascal16 wsprintf() wsprintf
-421 pascal16 wvsprintf(ptr ptr ptr) wvsprintf
+420 pascal16 wsprintf() WIN16_wsprintf16
+421 pascal16 wvsprintf(ptr ptr ptr) wvsprintf16
 422 stub DlgDirSelectEx
 423 stub DlgDirSelectComboBoxEx
 427 pascal16 FindWindowEx(word word segptr ptr) FindWindowEx16
 428 stub TileWindows
 429 stub CascadeWindows
-430 pascal16 lstrcmp(ptr ptr) lstrcmp
+430 pascal16 lstrcmp(ptr ptr) lstrcmp16
 431 pascal   AnsiUpper(segptr) WIN16_AnsiUpper
 432 pascal   AnsiLower(segptr) WIN16_AnsiLower
 433 pascal16 IsCharAlpha(byte) IsCharAlpha
@@ -413,7 +413,7 @@
 465 pascal16 DragDetect(word long) DragDetect
 466 pascal16 DrawFocusRect(word ptr) DrawFocusRect16
 470 stub StringFunc
-471 pascal16 lstrcmpi(ptr ptr) lstrcmpi
+471 pascal16 lstrcmpi(ptr ptr) lstrcmpi16
 472 pascal   AnsiNext(segptr) AnsiNext
 473 pascal   AnsiPrev(segptr segptr) AnsiPrev
 475 stub SetScrollInfo
diff --git a/if1632/user32.spec b/if1632/user32.spec
index f764aca..6681bff 100644
--- a/if1632/user32.spec
+++ b/if1632/user32.spec
@@ -208,7 +208,7 @@
 0201 stdcall FlashWindow(long long) FlashWindow
 0202 stdcall FrameRect(long ptr long) FrameRect32
 0203 stub FreeDDElParam
-0204 stub GetActiveWindow
+0204 stdcall GetActiveWindow() GetActiveWindow
 0205 stub GetAppCompatFlags
 0206 stub GetAsyncKeyState
 0207 stub GetCapture
@@ -419,8 +419,8 @@
 0412 stub OpenWindowStationW
 0413 stub PackDDElParam
 0414 stub PaintDesktop
-0415 stub PeekMessageA
-0416 stub PeekMessageW
+0415 stdcall PeekMessageA(ptr long long long long) PeekMessage32A
+0416 stdcall PeekMessageW(ptr long long long long) PeekMessage32W
 0417 stub PlaySoundEvent
 0418 stdcall PostMessageA(long long long long) PostMessage
 0419 stub PostMessageW
@@ -588,10 +588,10 @@
 0581 stdcall WindowFromPoint(long long) WindowFromPoint32
 0582 stub keybd_event
 0583 stub mouse_event
-0584 stdcall wsprintfA() USER32_wsprintfA
-0585 stub wsprintfW
-0586 stub wvsprintfA
-0587 stub wvsprintfW
+0584 stdcall wsprintfA() WIN32_wsprintf32A
+0585 stdcall wsprintfW() WIN32_wsprintf32W
+0586 stdcall wvsprintfA(ptr ptr ptr) wvsprintf32A
+0587 stdcall wvsprintfW(ptr ptr ptr) wvsprintf32W
 #late additions
 0588 stub ChangeDisplaySettingsA
 0588 stub ChangeDisplaySettingsW
diff --git a/if1632/ver.spec b/if1632/ver.spec
index 60cadc8..11aa1e0 100644
--- a/if1632/ver.spec
+++ b/if1632/ver.spec
@@ -5,12 +5,12 @@
 
 2 pascal GetFileResourceSize(ptr segptr segptr ptr) GetFileResourceSize
 3 pascal GetFileResource(ptr segptr segptr long long ptr) GetFileResource
-6 pascal GetFileVersionInfoSize(ptr ptr) GetFileVersionInfoSize
-7 pascal GetFileVersionInfo(ptr long long ptr) GetFileVersionInfo
-8 pascal VerFindFile(word ptr ptr ptr ptr ptr ptr ptr) VerFindFile
-9 pascal VerInstallFile(word ptr ptr ptr ptr ptr ptr ptr) VerInstallFile
-10 pascal VerLanguageName(word ptr word) VerLanguageName
-11 pascal VerQueryValue(segptr ptr ptr ptr) VerQueryValue
+6 pascal GetFileVersionInfoSize(ptr ptr) GetFileVersionInfoSize16
+7 pascal GetFileVersionInfo(ptr long long ptr) GetFileVersionInfo16
+8 pascal VerFindFile(word ptr ptr ptr ptr ptr ptr ptr) VerFindFile16
+9 pascal VerInstallFile(word ptr ptr ptr ptr ptr ptr ptr) VerInstallFile16
+10 pascal VerLanguageName(word ptr word) VerLanguageName16
+11 pascal VerQueryValue(segptr ptr ptr ptr) VerQueryValue16
 20 stub GETFILEVERSIONINFORAW
 #21 VERFTHK_THUNKDATA16
 #22 VERTHKSL_THUNKDATA16
diff --git a/if1632/version.spec b/if1632/version.spec
new file mode 100644
index 0000000..3d8ec38
--- /dev/null
+++ b/if1632/version.spec
@@ -0,0 +1,17 @@
+name version
+type win32
+
+0 stdcall GetFileVersionInfoA(ptr long long ptr) GetFileVersionInfo32A
+1 stdcall GetFileVersionInfoSizeA(ptr ptr) GetFileVersionInfoSize32A
+2 stdcall GetFileVersionInfoSizeW(ptr ptr) GetFileVersionInfoSize32W
+3 stdcall GetFileVersionInfoW(ptr long long ptr) GetFileVersionInfo32W
+#4 stub VerFThk_ThunkData32
+5 stdcall VerFindFileA(word ptr ptr ptr ptr ptr ptr ptr) VerFindFile32A
+6 stdcall VerFindFileW(word ptr ptr ptr ptr ptr ptr ptr) VerFindFile32W
+7 stdcall VerInstallFileA(word ptr ptr ptr ptr ptr ptr ptr) VerInstallFile32A
+8 stdcall VerInstallFileW(word ptr ptr ptr ptr ptr ptr ptr) VerInstallFile32W
+9 stdcall VerLanguageNameA(word ptr word) VerLanguageName32A
+10 stdcall VerLanguageNameW(word ptr word) VerLanguageName32W
+11 stdcall VerQueryValueA(segptr ptr ptr ptr) VerQueryValue32A
+12 stdcall VerQueryValueW(segptr ptr ptr ptr) VerQueryValue32W
+#13 stub VerThkSL_ThunkData32
diff --git a/include/bitmap.h b/include/bitmap.h
index 5f0d360..e9cafb7 100644
--- a/include/bitmap.h
+++ b/include/bitmap.h
@@ -13,7 +13,7 @@
 typedef struct
 {
     GDIOBJHDR   header;
-    BITMAP      bitmap;
+    BITMAP16    bitmap;
     Pixmap      pixmap;
     SIZE16      size;   /* For SetBitmapDimension() */
 } BITMAPOBJ;
@@ -37,7 +37,8 @@
 
   /* objects/bitmap.c */
 extern BOOL BITMAP_Init(void);
-extern int BITMAP_GetObject( BITMAPOBJ * bmp, int count, LPSTR buffer );
+extern INT16 BITMAP_GetObject16( BITMAPOBJ * bmp, INT16 count, LPVOID buffer );
+extern INT32 BITMAP_GetObject32( BITMAPOBJ * bmp, INT32 count, LPVOID buffer );
 extern BOOL BITMAP_DeleteObject( HBITMAP hbitmap, BITMAPOBJ * bitmap );
 extern HBITMAP BITMAP_SelectObject( DC * dc, HBITMAP hbitmap,
                                     BITMAPOBJ * bmp );
diff --git a/include/brush.h b/include/brush.h
index daa2eaa..6803254 100644
--- a/include/brush.h
+++ b/include/brush.h
@@ -17,7 +17,7 @@
 typedef struct
 {
     GDIOBJHDR   header;
-    LOGBRUSH    logbrush WINE_PACKED;
+    LOGBRUSH16  logbrush WINE_PACKED;
 } BRUSHOBJ;
 
 #ifndef WINELIB
diff --git a/include/callback.h b/include/callback.h
index fb07a71..537cfa9 100644
--- a/include/callback.h
+++ b/include/callback.h
@@ -20,28 +20,28 @@
 /* by the build program to generate the file if1632/callto16.S */
 
                                /* func     ds    parameters */
-extern WORD CallTo16_word_     ( FARPROC, WORD );
+extern WORD CallTo16_word_     ( FARPROC16, WORD );
 
 #ifndef WINELIB
 
-extern WORD CallTo16_word_ww   ( FARPROC, WORD, WORD, WORD );
-extern WORD CallTo16_word_wl   ( FARPROC, WORD, WORD, LONG );
-extern WORD CallTo16_word_ll   ( FARPROC, WORD, LONG, LONG );
-extern WORD CallTo16_word_www  ( FARPROC, WORD, WORD, WORD, WORD );
-extern WORD CallTo16_word_wwl  ( FARPROC, WORD, WORD, WORD, LONG );
-extern WORD CallTo16_word_wlw  ( FARPROC, WORD, WORD, LONG, WORD );
-extern LONG CallTo16_long_wwl  ( FARPROC, WORD, WORD, WORD, LONG );
-extern WORD CallTo16_word_llwl ( FARPROC, WORD, LONG, LONG, WORD, LONG );
-extern LONG CallTo16_long_wwwl ( FARPROC, WORD, WORD, WORD, WORD, LONG );
-extern WORD CallTo16_word_lwww ( FARPROC, WORD, LONG, WORD, WORD, WORD );
-extern WORD CallTo16_word_wwll ( FARPROC, WORD, WORD, WORD, LONG, LONG);
-extern WORD CallTo16_word_wllwl( FARPROC, WORD, WORD, LONG, LONG, WORD, LONG );
-extern WORD CallTo16_word_wwlll( FARPROC, WORD, WORD, WORD, LONG, LONG, LONG );
-extern LONG CallTo16_long_lllllllwlwwwl( FARPROC, WORD, LONG, LONG, LONG,
+extern WORD CallTo16_word_ww   (FARPROC16, WORD, WORD, WORD);
+extern WORD CallTo16_word_wl   (FARPROC16, WORD, WORD, LONG);
+extern WORD CallTo16_word_ll   (FARPROC16, WORD, LONG, LONG);
+extern WORD CallTo16_word_www  (FARPROC16, WORD, WORD, WORD, WORD);
+extern WORD CallTo16_word_wwl  (FARPROC16, WORD, WORD, WORD, LONG);
+extern WORD CallTo16_word_wlw  (FARPROC16, WORD, WORD, LONG, WORD);
+extern LONG CallTo16_long_wwl  (FARPROC16, WORD, WORD, WORD, LONG);
+extern WORD CallTo16_word_llwl (FARPROC16, WORD, LONG, LONG, WORD, LONG);
+extern LONG CallTo16_long_wwwl (FARPROC16, WORD, WORD, WORD, WORD, LONG);
+extern WORD CallTo16_word_lwww (FARPROC16, WORD, LONG, WORD, WORD, WORD);
+extern WORD CallTo16_word_wwll (FARPROC16, WORD, WORD, WORD, LONG, LONG);
+extern WORD CallTo16_word_wllwl(FARPROC16, WORD, WORD, LONG, LONG, WORD, LONG);
+extern WORD CallTo16_word_wwlll(FARPROC16, WORD, WORD, WORD, LONG, LONG, LONG);
+extern LONG CallTo16_long_lllllllwlwwwl( FARPROC16, WORD, LONG, LONG, LONG,
                                          LONG, LONG, LONG, LONG, WORD, LONG,
                                          WORD, WORD, WORD, LONG );
 
-extern WORD CallTo16_regs_( FARPROC func, WORD ds, WORD es, WORD bp, WORD ax,
+extern WORD CallTo16_regs_( FARPROC16 func, WORD ds, WORD es, WORD bp, WORD ax,
                             WORD bx, WORD cx, WORD dx, WORD si, WORD di );
 
 #define CallEnumChildProc( func, hwnd, lParam ) \
diff --git a/include/compobj.h b/include/compobj.h
deleted file mode 100644
index d9482dc..0000000
--- a/include/compobj.h
+++ /dev/null
@@ -1,5 +0,0 @@
-/*
- *	compobj.h	-	Declarations for COMPOBJ
- */
-
-typedef	LPVOID	LPUNKNOWN;
diff --git a/include/except.h b/include/except.h
index 1c2ec01..ee93e3e 100644
--- a/include/except.h
+++ b/include/except.h
@@ -6,15 +6,7 @@
 #ifndef __WINE_EXCEPT_H
 #define __WINE_EXCEPT_H
 
-#include"windows.h"
-
-/* 
- * general definitions
- */
- 
-#ifndef PVOID
-#define PVOID void *
-#endif
+#include"wintypes.h"
 
 /*
  * exception codes
@@ -162,7 +154,7 @@
     DWORD    ExceptionFlags;
     struct __EXCEPTION_RECORD *ExceptionRecord;
 
-    PVOID    ExceptionAddress;
+    LPVOID   ExceptionAddress;
     DWORD    NumberParameters;
     DWORD    ExceptionInformation[EXCEPTION_MAXIMUM_PARAMETERS];
 } EXCEPTION_RECORD;
@@ -173,7 +165,7 @@
     DWORD    ExceptionFlags;
     struct __EXCEPTION_RECORD *ExceptionRecord;
 
-    PVOID    ExceptionAddress;
+    LPVOID   ExceptionAddress;
     DWORD    NumberParameters;
     DWORD    ExceptionInformation[0];
 } EXCEPTION_RECORD_MIN;
@@ -203,7 +195,7 @@
 typedef DWORD ( *PEXCEPTION_HANDLER)( PEXCEPTION_RECORD          pexcrec,
                                       struct __EXCEPTION_FRAME  *pestframe,
                                       PCONTEXT                   pcontext,
-                                      PVOID                      pdispatcher);
+                                      LPVOID                     pdispatcher);
 
 /*
  * function pointer to a UnhandledExceptionFilter();
diff --git a/include/file.h b/include/file.h
index 7893a96..8b9de03 100644
--- a/include/file.h
+++ b/include/file.h
@@ -24,7 +24,7 @@
 extern int FILE_RemoveDir( LPCSTR path );
 extern HFILE FILE_Dup( HFILE hFile );
 extern HFILE FILE_Dup2( HFILE hFile1, HFILE hFile2 );
-extern LONG FILE_Read( HFILE hFile, void *buffer, LONG count );
+extern INT32 FILE_Read( HFILE hFile, LPVOID buffer, UINT32 count );
 extern INT _lcreat_uniq( LPCSTR path, INT attr );
 
 #endif  /* __WINE_FILE_H */
diff --git a/include/font.h b/include/font.h
index 8a8dae7..8372ebd 100644
--- a/include/font.h
+++ b/include/font.h
@@ -17,7 +17,7 @@
 typedef struct
 {
     GDIOBJHDR   header;
-    LOGFONT     logfont WINE_PACKED;
+    LOGFONT16   logfont WINE_PACKED;
 } FONTOBJ;
 
 /* may be switched... */
diff --git a/include/gdi.h b/include/gdi.h
index ac9b3a6..398b9c5 100644
--- a/include/gdi.h
+++ b/include/gdi.h
@@ -158,7 +158,7 @@
 typedef struct
 {
     XFontStruct * fstruct;
-    TEXTMETRIC    metrics;
+    TEXTMETRIC16  metrics;
 } X_PHYSFONT;
 
   /* X physical palette information */
@@ -281,9 +281,6 @@
 extern GDIOBJHDR * GDI_GetObjPtr( HANDLE, WORD );
 extern FARPROC16 GDI_GetDefDCHook(void);
 
-#define UpdateDirtyDC(dc) \
-	    DC_CallHookProc(dc, DCHC_INVALIDVISRGN, 0)
-
 extern Display * display;
 extern Screen * screen;
 extern Window rootWindow;
diff --git a/include/global.h b/include/global.h
index 42014fc..dc8c939 100644
--- a/include/global.h
+++ b/include/global.h
@@ -17,12 +17,13 @@
 } SHMDATA;
 
 extern HGLOBAL16 GLOBAL_CreateBlock( UINT16 flags, const void *ptr, DWORD size,
-                                     HGLOBAL16 hOwner, BOOL isCode,
-                                     BOOL is32Bit, BOOL isReadOnly,
+                                     HGLOBAL16 hOwner, BOOL16 isCode,
+                                     BOOL16 is32Bit, BOOL16 isReadOnly,
                                      SHMDATA *shmdata);
-extern BOOL GLOBAL_FreeBlock( HGLOBAL16 handle );
+extern BOOL16 GLOBAL_FreeBlock( HGLOBAL16 handle );
 extern HGLOBAL16 GLOBAL_Alloc( WORD flags, DWORD size, HGLOBAL16 hOwner,
-                               BOOL isCode, BOOL is32Bit, BOOL isReadOnly );
+                               BOOL16 isCode, BOOL16 is32Bit,
+                               BOOL16 isReadOnly );
 extern WORD GlobalHandleToSel( HGLOBAL16 handle );
 
 #endif  /* __WINE_GLOBAL_H */
diff --git a/include/keyboard.h b/include/keyboard.h
deleted file mode 100644
index c9f784f..0000000
--- a/include/keyboard.h
+++ /dev/null
@@ -1,114 +0,0 @@
-#ifndef __WINE_KEYBOARD_H
-#define __WINE_KEYBOARD_H
-
-struct KeyTableEntry {
-	int virtualkey;
-	int ASCII;
-	int scancode;
-	char *name;
-};
-
-struct KeyTableEntry KeyTable[] = {
-	{ 0x3, 0x3, 0x0, "" },
-	{ 0x8, 0x8, 0xe, "Backspace" },
-	{ 0x9, 0x9, 0xf, "Tab" },
-	{ 0xc, 0x0, 0x4c, "Num 5" },
-	{ 0xd, 0xd, 0x1c, "Enter" },
-	{ 0x10, 0x0, 0x2a, "Shift" },
-	{ 0x11, 0x0, 0x1d, "Ctrl" },
-	{ 0x12, 0x0, 0x38, "Alt" },
-	{ 0x14, 0x0, 0x3a, "Caps Lock" },
-	{ 0x1b, 0x1b, 0x1, "Esc" },
-	{ 0x20, 0x20, 0x39, "Space" },
-	{ 0x21, 0x0, 0x49, "Num 9" },
-	{ 0x22, 0x0, 0x51, "Num 3" },
-	{ 0x23, 0x0, 0x4f, "Num 1" },
-	{ 0x24, 0x0, 0x47, "Num 7" },
-	{ 0x25, 0x0, 0x4b, "Num 4" },
-	{ 0x26, 0x0, 0x48, "Num 8" },
-	{ 0x27, 0x0, 0x4d, "Num 6" },
-	{ 0x28, 0x0, 0x50, "Num 2" },
-	{ 0x2d, 0x0, 0x52, "Num 0" },
-	{ 0x2e, 0x0, 0x53, "Num Del" },
-	{ 0x30, 0x30, 0xb, "0" },
-	{ 0x31, 0x31, 0x2, "1" },
-	{ 0x32, 0x32, 0x3, "2" },
-	{ 0x33, 0x33, 0x4, "3" },
-	{ 0x34, 0x34, 0x5, "4" },
-	{ 0x35, 0x35, 0x6, "5" },
-	{ 0x36, 0x36, 0x7, "6" },
-	{ 0x37, 0x37, 0x8, "7" },
-	{ 0x38, 0x38, 0x9, "8" },
-	{ 0x39, 0x39, 0xa, "9" },
-	{ 0x41, 0x41, 0x1e, "A" },
-	{ 0x42, 0x42, 0x30, "B" },
-	{ 0x43, 0x43, 0x2e, "C" },
-	{ 0x44, 0x44, 0x20, "D" },
-	{ 0x45, 0x45, 0x12, "E" },
-	{ 0x46, 0x46, 0x21, "F" },
-	{ 0x47, 0x47, 0x22, "G" },
-	{ 0x48, 0x48, 0x23, "H" },
-	{ 0x49, 0x49, 0x17, "I" },
-	{ 0x4a, 0x4a, 0x24, "J" },
-	{ 0x4b, 0x4b, 0x25, "K" },
-	{ 0x4c, 0x4c, 0x26, "L" },
-	{ 0x4d, 0x4d, 0x32, "M" },
-	{ 0x4e, 0x4e, 0x31, "N" },
-	{ 0x4f, 0x4f, 0x18, "O" },
-	{ 0x50, 0x50, 0x19, "P" },
-	{ 0x51, 0x51, 0x10, "Q" },
-	{ 0x52, 0x52, 0x13, "R" },
-	{ 0x53, 0x53, 0x1f, "S" },
-	{ 0x54, 0x54, 0x14, "T" },
-	{ 0x55, 0x55, 0x16, "U" },
-	{ 0x56, 0x56, 0x2f, "V" },
-	{ 0x57, 0x57, 0x11, "W" },
-	{ 0x58, 0x58, 0x2d, "X" },
-	{ 0x59, 0x59, 0x15, "Y" },
-	{ 0x5a, 0x5a, 0x2c, "Z" },
-	{ 0x60, 0x0, 0x52, "Num 0" },
-	{ 0x61, 0x0, 0x4f, "Num 1" },
-	{ 0x62, 0x0, 0x50, "Num 2" },
-	{ 0x63, 0x0, 0x51, "Num 3" },
-	{ 0x64, 0x0, 0x4b, "Num 4" },
-	{ 0x65, 0x0, 0x4c, "Num 5" },
-	{ 0x66, 0x0, 0x4d, "Num 6" },
-	{ 0x67, 0x0, 0x47, "Num 7" },
-	{ 0x68, 0x0, 0x48, "Num 8" },
-	{ 0x69, 0x0, 0x49, "Num 9" },
-	{ 0x6a, 0x2a, 0x37, "Num *" },
-	{ 0x6b, 0x2b, 0x4e, "Num +" },
-	{ 0x6c, 0x0, 0x0, "" },
-	{ 0x6d, 0x2d, 0x4a, "Num -" },
-	{ 0x6e, 0x2e, 0x53, "Num Del" },
-	{ 0x6f, 0x2f, 0x0, "" },
-	{ 0x70, 0x0, 0x3b, "F1" },
-	{ 0x71, 0x0, 0x3c, "F2" },
-	{ 0x72, 0x0, 0x3d, "F3" },
-	{ 0x73, 0x0, 0x3e, "F4" },
-	{ 0x74, 0x0, 0x3f, "F5" },
-	{ 0x75, 0x0, 0x40, "F6" },
-	{ 0x76, 0x0, 0x41, "F7" },
-	{ 0x77, 0x0, 0x42, "F8" },
-	{ 0x78, 0x0, 0x43, "F9" },
-	{ 0x79, 0x0, 0x44, "F10" },
-	{ 0x7a, 0x0, 0x57, "F11" },
-	{ 0x7b, 0x0, 0x58, "F12" },
-	{ 0x90, 0x0, 0x45, "Pause" },
-	{ 0x91, 0x0, 0x46, "Scroll Lock" },
-	{ 0xba, 0x3b, 0x27, ";" },
-	{ 0xbb, 0x3d, 0xd, "=" },
-	{ 0xbc, 0x2c, 0x33, "," },
-	{ 0xbd, 0x2d, 0xc, "-" },
-	{ 0xbe, 0x2e, 0x34, "." },
-	{ 0xbf, 0x2f, 0x35, "/" },
-	{ 0xc0, 0x60, 0x29, "`" },
-	{ 0xdb, 0x5b, 0x1a, "[" },
-	{ 0xdc, 0x5c, 0x2b, "\\" },
-	{ 0xdd, 0x5d, 0x1b, "]" },
-	{ 0xde, 0x27, 0x28, "\'" },
-	{ 0xe2, 0x5c, 0x56, "\\" },
-};
-#define KeyTableSize	sizeof(KeyTable) / sizeof(struct KeyTableEntry)
-
-#endif /* __WINE_KEYBOARD_H */
diff --git a/include/listbox.h b/include/listbox.h
index 8dfcf65..cdd82cb 100644
--- a/include/listbox.h
+++ b/include/listbox.h
@@ -3,7 +3,7 @@
  */
 
 typedef struct tagLISTSTRUCT {
-        MEASUREITEMSTRUCT mis;
+        MEASUREITEMSTRUCT16 mis;
         UINT            itemState;
         RECT16          itemRect;
 	HANDLE		hData;
diff --git a/include/lzexpand.h b/include/lzexpand.h
index bf58839..380ee98 100644
--- a/include/lzexpand.h
+++ b/include/lzexpand.h
@@ -3,17 +3,25 @@
  * Copyright 1996 Marcus Meissner
  */
 
-LONG	LZCopy(HFILE,HFILE);
-HFILE	LZOpenFile(LPCSTR,LPOFSTRUCT,UINT);
-HFILE	LZInit(HFILE);
-LONG	LZSeek(HFILE,LONG,INT);
-INT	LZRead(HFILE,SEGPTR,WORD); 
-void	LZClose(HFILE);
-INT	LZStart(void);
-LONG	CopyLZFile(HFILE,HFILE);
-void	LZDone(void);
-INT	GetExpandedName(LPCSTR,LPSTR);
+INT16      LZStart(void);
+HFILE      LZInit(HFILE);
+void       LZDone(void);
+LONG       LZSeek(HFILE,LONG,INT32);
+LONG       LZCopy(HFILE,HFILE);
+void       LZClose(HFILE);
+LONG       CopyLZFile(HFILE,HFILE);
 
+INT16      GetExpandedName16(LPCSTR,LPSTR);
+INT32      GetExpandedName32A(LPCSTR,LPSTR);
+INT32      GetExpandedName32W(LPCWSTR,LPWSTR);
+#define    GetExpandedName WINELIB_NAME_AW(GetExpandedName)
+HFILE      LZOpenFile16(LPCSTR,LPOFSTRUCT,UINT16);
+HFILE      LZOpenFile32A(LPCSTR,LPOFSTRUCT,UINT32);
+HFILE      LZOpenFile32W(LPCWSTR,LPOFSTRUCT,UINT32);
+#define    LZOpenFile WINELIB_NAME_AW(LZOpenFile)
+INT16      LZRead16(HFILE,SEGPTR,UINT16); 
+INT32      LZRead32(HFILE,LPVOID,UINT32); 
+#define    LZRead WINELIB_NAME(LZRead)
 
 #define LZERROR_BADINHANDLE	0xFFFF	/* -1 */
 #define LZERROR_BADOUTHANDLE	0xFFFE	/* -2 */
diff --git a/include/message.h b/include/message.h
index 1fc0266..72f64ad 100644
--- a/include/message.h
+++ b/include/message.h
@@ -13,7 +13,7 @@
 extern DWORD MSG_WineStartTicks;  /* Ticks at Wine startup */
 
 /* message.c */
-extern BOOL MSG_GetHardwareMessage( LPMSG msg );
+extern BOOL MSG_GetHardwareMessage( LPMSG16 msg );
 extern BOOL MSG_InternalGetMessage( SEGPTR msg, HWND hwnd, HWND hwndOwner,
 				    short code, WORD flags, BOOL sendIdle );
 
diff --git a/include/metafile.h b/include/metafile.h
index 7951832..0d2c306 100644
--- a/include/metafile.h
+++ b/include/metafile.h
@@ -26,10 +26,10 @@
 BOOL MF_MetaParam8(DC *dc, short func, short param1, short param2, 
 		   short param3, short param4, short param5,
 		   short param6, short param7, short param8);
-BOOL MF_CreateBrushIndirect(DC *dc, HBRUSH hBrush, LOGBRUSH *logbrush);
-BOOL MF_CreatePatternBrush(DC *dc, HBRUSH hBrush, LOGBRUSH *logbrush);
-BOOL MF_CreatePenIndirect(DC *dc, HPEN16 hPen, LOGPEN *logpen);
-BOOL MF_CreateFontIndirect(DC *dc, HFONT hFont, LOGFONT *logfont);
+BOOL MF_CreateBrushIndirect(DC *dc, HBRUSH hBrush, LOGBRUSH16 *logbrush);
+BOOL MF_CreatePatternBrush(DC *dc, HBRUSH hBrush, LOGBRUSH16 *logbrush);
+BOOL MF_CreatePenIndirect(DC *dc, HPEN16 hPen, LOGPEN16 *logpen);
+BOOL MF_CreateFontIndirect(DC *dc, HFONT hFont, LOGFONT16 *logfont);
 BOOL MF_TextOut(DC *dc, short x, short y, LPCSTR str, short count);
 BOOL MF_MetaPoly(DC *dc, short func, LPPOINT16 pt, short count);
 BOOL MF_BitBlt(DC *dcDest, short xDest, short yDest, short width,
diff --git a/include/neexe.h b/include/neexe.h
index 096050b..7cc36e4 100644
--- a/include/neexe.h
+++ b/include/neexe.h
@@ -199,7 +199,7 @@
     unsigned short length;
     unsigned short flags;
     unsigned short id;
-            HANDLE handle;
+    HANDLE16 handle;
     unsigned short usage;
 };
 
diff --git a/include/ole.h b/include/ole.h
index 9cc310a..9e3795d 100644
--- a/include/ole.h
+++ b/include/ole.h
@@ -2,6 +2,12 @@
  *	ole.h	-	Declarations for OLESVR and OLECLI
  */
 
+#ifndef __WINE_OLE_H
+#define __WINE_OLE_H
+
+#include "windows.h"
+
+typedef	LPVOID	LPUNKNOWN;
 typedef LPCSTR	OLE_LPCSTR;
 
 /* object types */
@@ -160,6 +166,7 @@
 	OLESTATUS	(*Close)(LPOLESERVERDOC);
 	OLESTATUS	(*SetHostNames)(LPOLESERVERDOC,OLE_LPCSTR,OLE_LPCSTR);
 	OLESTATUS	(*SetDocDimensions)(LPOLESERVERDOC,LPRECT16);
+#undef GetObject  /* FIXME */
 	OLESTATUS	(*GetObject)(LPOLESERVERDOC,OLE_LPCSTR,LPOLEOBJECT*,LPOLECLIENT);
 	OLESTATUS	(*Release)(LPOLESERVERDOC);
 	OLESTATUS	(*SetColorScheme)(LPOLESERVERDOC,LPLOGPALETTE);
@@ -251,3 +258,5 @@
 OLESTATUS OleRevokeServerDoc(LHSERVERDOC);
 OLESTATUS OleRevokeClientDoc(LHCLIENTDOC);
 OLESTATUS OleRevokeServer(LHSERVER);
+
+#endif  /* __WINE_OLE_H */
diff --git a/include/pen.h b/include/pen.h
index 7016d24..55858ec 100644
--- a/include/pen.h
+++ b/include/pen.h
@@ -17,7 +17,7 @@
 typedef struct
 {
     GDIOBJHDR   header;
-    LOGPEN      logpen WINE_PACKED;
+    LOGPEN16    logpen WINE_PACKED;
 } PENOBJ;
 
 #ifndef WINELIB
diff --git a/include/queue.h b/include/queue.h
index 6230b89..553f7a4 100644
--- a/include/queue.h
+++ b/include/queue.h
@@ -17,7 +17,7 @@
 typedef struct tagQMSG
 {
     DWORD   extraInfo;  /* Only in 3.1 */
-    MSG     msg;
+    MSG16   msg;
 } QMSG;
 
 
@@ -84,7 +84,7 @@
 extern BOOL QUEUE_CreateSysMsgQueue( int size );
 extern BOOL QUEUE_DeleteMsgQueue( HQUEUE hQueue );
 extern HTASK QUEUE_GetQueueTask( HQUEUE hQueue );
-extern BOOL QUEUE_AddMsg( HQUEUE hQueue, MSG * msg, DWORD extraInfo );
+extern BOOL QUEUE_AddMsg( HQUEUE hQueue, MSG16 * msg, DWORD extraInfo );
 extern int QUEUE_FindMsg( MESSAGEQUEUE * msgQueue, HWND hwnd,
                           int first, int last );
 extern void QUEUE_RemoveMsg( MESSAGEQUEUE * msgQueue, int pos );
diff --git a/include/resource.h b/include/resource.h
index 358a43e..e054b4f 100644
--- a/include/resource.h
+++ b/include/resource.h
@@ -7,7 +7,7 @@
 #ifndef __WINE_RESOURCE_H
 #define __WINE_RESOURCE_H
 
-#include "wintypes.h"
+#include "windows.h"
 
 struct resource
 {
diff --git a/include/string32.h b/include/string32.h
index 1431a59..7791411 100644
--- a/include/string32.h
+++ b/include/string32.h
@@ -10,16 +10,10 @@
 
 #include "wintypes.h"
 
-int	STRING32_UniLen(LPCWSTR s);
 void	STRING32_UniToAnsi(LPSTR dest,LPCWSTR src);
 void	STRING32_AnsiToUni(LPWSTR dest,LPCSTR src);
 LPSTR	STRING32_DupUniToAnsi(LPCWSTR src);
 LPWSTR	STRING32_DupAnsiToUni(LPCSTR src);
-LPWSTR  STRING32_lstrcpyW(LPWSTR dst, LPCWSTR src);
-int	STRING32_lstrcmpnW(LPCWSTR a,LPCWSTR b,DWORD len);
-int	STRING32_lstrcmpniW(LPCWSTR a,LPCWSTR b,DWORD len);
-DWORD	STRING32_lstrlenW(LPCWSTR);
 LPWSTR	STRING32_strdupW(LPCWSTR);
-int	STRING32_lstrcmpW(LPCWSTR,LPCWSTR);
 
 #endif
diff --git a/include/struct32.h b/include/struct32.h
index 702b918..0fe7769 100644
--- a/include/struct32.h
+++ b/include/struct32.h
@@ -35,18 +35,8 @@
 	WORD cy WINE_PACKED;
 } DLGTEMPLATE32;
 
-typedef struct tagMSG32
-{
-	DWORD hwnd;
-	DWORD message;
-	DWORD wParam;
-	DWORD lParam;
-	DWORD time;
-	POINT32 pt;
-} MSG32;
-
-void STRUCT32_MSG16to32(MSG *msg16,MSG32 *msg32);
-void STRUCT32_MSG32to16(MSG32 *msg32,MSG *msg16);
+void STRUCT32_MSG16to32(const MSG16 *msg16,MSG32 *msg32);
+void STRUCT32_MSG32to16(const MSG32 *msg32,MSG16 *msg16);
 
 void STRUCT32_CREATESTRUCT32Ato16(const CREATESTRUCT32A*,CREATESTRUCT16*);
 void STRUCT32_CREATESTRUCT16to32A(const CREATESTRUCT16*,CREATESTRUCT32A*);
diff --git a/include/task.h b/include/task.h
index ce56b76..b00f6fb 100644
--- a/include/task.h
+++ b/include/task.h
@@ -119,7 +119,4 @@
                               HANDLE hPrevInstance, HANDLE hEnvironment,
                               char *cmdLine, WORD cmdShow );
 
-  /* TASK_Reschedule() 16-bit entry point */
-extern FARPROC RELAY_RescheduleProcAddr;
-
 #endif /* _WINE_TASK_H */
diff --git a/include/ver.h b/include/ver.h
index 2324603..8672d86 100644
--- a/include/ver.h
+++ b/include/ver.h
@@ -127,6 +127,7 @@
 	DWORD   dwFileDateLS;
 } VS_FIXEDFILEINFO;
 
+/* following two aren't in version.dll */
 DWORD
 GetFileResourceSize(LPCSTR filename,SEGPTR restype,SEGPTR resid,LPDWORD off);
 
@@ -135,34 +136,60 @@
 		DWORD off,DWORD reslen,LPVOID data
 );
 
-DWORD
-GetFileVersionInfoSize(LPCSTR filename,LPDWORD handle);
+DWORD GetFileVersionInfoSize16(LPCSTR filename,LPDWORD handle);
+DWORD GetFileVersionInfoSize32A(LPCSTR filename,LPDWORD handle);
+DWORD GetFileVersionInfoSize32W(LPCWSTR filename,LPDWORD handle);
+#define GetFileVersionInfoSize WINELIB_NAME_AW(GetFileVersionInfoSize)
+
+DWORD GetFileVersionInfo16(LPCSTR filename,DWORD handle,DWORD datasize,LPVOID data);
+DWORD GetFileVersionInfo32A(LPCSTR filename,DWORD handle,DWORD datasize,LPVOID data);
+DWORD GetFileVersionInfo32W(LPCWSTR filename,DWORD handle,DWORD datasize,LPVOID data);
+#define GetFileVersionInfo WINELIB_NAME_AW(GetFileVersionInfo)
 
 DWORD
-GetFileVersionInfo(LPCSTR filename,DWORD handle,DWORD datasize,LPVOID data);
-
-DWORD
-VerFindFile(
-	UINT flags,LPCSTR filename,LPCSTR windir,LPCSTR appdir,
-	LPSTR curdir,UINT *curdirlen,LPSTR destdir,UINT*destdirlen
+VerFindFile16(
+	UINT16 flags,LPCSTR filename,LPCSTR windir,LPCSTR appdir,
+	LPSTR curdir,UINT16 *curdirlen,LPSTR destdir,UINT16 *destdirlen
 );
-
 DWORD
-VerInstallFile(
-	UINT flags,LPCSTR srcfilename,LPCSTR destfilename,LPCSTR srcdir,
-	LPCSTR destdir,LPSTR tmpfile,UINT*tmpfilelen
+VerFindFile32A(
+	UINT32 flags,LPCSTR filename,LPCSTR windir,LPCSTR appdir,
+	LPSTR curdir,UINT32 *curdirlen,LPSTR destdir,UINT32 *destdirlen
 );
+DWORD
+VerFindFile32W(
+	UINT32 flags,LPCWSTR filename,LPCWSTR windir,LPCWSTR appdir,
+	LPWSTR curdir,UINT32 *curdirlen,LPWSTR destdir,UINT32 *destdirlen
+);
+#define VerFindFile WINELIB_NAME_AW(VerFindFile)
 
 DWORD
-VerLanguageName(UINT lang,LPSTR langname,UINT langnamelen);
-
+VerInstallFile16(
+	UINT16 flags,LPCSTR srcfilename,LPCSTR destfilename,LPCSTR srcdir,
+	LPCSTR destdir,LPSTR tmpfile,UINT16 *tmpfilelen
+);
 DWORD
-VerQueryValue(SEGPTR block,LPCSTR subblock,SEGPTR *buffer,UINT *buflen);
+VerInstallFile32A(
+	UINT32 flags,LPCSTR srcfilename,LPCSTR destfilename,LPCSTR srcdir,
+	LPCSTR destdir,LPSTR tmpfile,UINT32 *tmpfilelen
+);
+DWORD
+VerInstallFile32W(
+	UINT32 flags,LPCWSTR srcfilename,LPCWSTR destfilename,LPCWSTR srcdir,
+	LPCWSTR destdir,LPWSTR tmpfile,UINT32 *tmpfilelen
+);
+#define VerInstallFile WINELIB_NAME_AW(VerInstallFile)
 
-/*
-   20 GETFILEVERSIONINFORAW
-   21 VERFTHK_THUNKDATA16
-   22 VERTHKSL_THUNKDATA16
-*/
+DWORD VerLanguageName16(UINT16 lang,LPSTR langname,UINT16 langnamelen);
+DWORD VerLanguageName32A(UINT32 lang,LPSTR langname,UINT32 langnamelen);
+DWORD VerLanguageName32W(UINT32 lang,LPWSTR langname,UINT32 langnamelen);
+#define VerLanguageName WINELIB_NAME_AW(VerLanguageName)
+
+DWORD VerQueryValue16(SEGPTR block,LPCSTR subblock,SEGPTR *buffer,UINT16 *buflen);
+DWORD VerQueryValue32A(LPVOID block,LPCSTR subblock,LPVOID *buffer,UINT32 *buflen);
+DWORD VerQueryValue32W(LPVOID block,LPCWSTR subblock,LPVOID *buffer,UINT32 *buflen);
+#define VerQueryValue WINELIB_NAME_AW(VerQueryValue)
+
+/* 20 GETFILEVERSIONINFORAW */
 
 #endif	/* __WINE_VER_H */
diff --git a/include/winbase.h b/include/winbase.h
index 27ef776..6775098 100644
--- a/include/winbase.h
+++ b/include/winbase.h
@@ -1,7 +1,7 @@
 #ifndef __WINE_WINBASE_H
 #define __WINE_WINBASE_H
 
-
+#include "wintypes.h"
 
 #ifdef UNICODE
 #define LoadAccelerators LoadAcceleratorsW
@@ -112,7 +112,34 @@
 	DWORD Reserved;
 }CRITICAL_SECTION;
 
+typedef struct {
+	DWORD dwOSVersionInfoSize;
+	DWORD dwMajorVersion;
+	DWORD dwMinorVersion;
+	DWORD dwBuildNumber;
+	DWORD dwPlatformId;
+	CHAR szCSDVersion[128];
+} OSVERSIONINFO32A;
+
+typedef struct {
+	DWORD dwOSVersionInfoSize;
+	DWORD dwMajorVersion;
+	DWORD dwMinorVersion;
+	DWORD dwBuildNumber;
+	DWORD dwPlatformId;
+	WCHAR szCSDVersion[128];
+} OSVERSIONINFO32W;
+
+DECL_WINELIB_TYPE_AW(OSVERSIONINFO);
+
+#define VER_PLATFORM_WIN32s             0
+#define VER_PLATFORM_WIN32_WINDOWS      1
+#define VER_PLATFORM_WIN32_NT           2
+
 /*DWORD WINAPI GetVersion( void );*/
+BOOL32 GetVersionEx32A(OSVERSIONINFO32A*);
+BOOL32 GetVersionEx32W(OSVERSIONINFO32W*);
+#define GetVersionEx WINELIB_NAME_AW(GetVersionEx)
 
 int WinMain(HINSTANCE, HINSTANCE prev, char *cmd, int show);
 
diff --git a/include/windows.h b/include/windows.h
index 3a1dcec..64363f0 100644
--- a/include/windows.h
+++ b/include/windows.h
@@ -91,12 +91,22 @@
     ((r16)->left  = (INT16)(r32)->left,  (r16)->top    = (INT16)(r32)->top, \
      (r16)->right = (INT16)(r32)->right, (r16)->bottom = (INT16)(r32)->bottom)
 
+typedef struct
+{
+    WORD   wFirst;
+    WORD   wSecond;
+    INT16  iKernAmount;
+} KERNINGPAIR16, *LPKERNINGPAIR16;
 
-typedef struct tagKERNINGPAIR {
-        WORD wFirst;
-        WORD wSecond;
-        INT  iKernAmount;
-} KERNINGPAIR, *LPKERNINGPAIR;
+typedef struct
+{
+    WORD   wFirst;
+    WORD   wSecond;
+    INT32  iKernAmount;
+} KERNINGPAIR32, *LPKERNINGPAIR32;
+
+DECL_WINELIB_TYPE(KERNINGPAIR);
+DECL_WINELIB_TYPE(LPKERNINGPAIR);
 
 typedef struct
 {
@@ -177,25 +187,64 @@
 
 typedef struct 
 {
-    HMENU     hWindowMenu;
-    WORD      idFirstChild;
-} CLIENTCREATESTRUCT, *LPCLIENTCREATESTRUCT;
+    HMENU16   hWindowMenu;
+    UINT16    idFirstChild;
+} CLIENTCREATESTRUCT16, *LPCLIENTCREATESTRUCT16;
+
+typedef struct 
+{
+    HMENU32   hWindowMenu;
+    UINT32    idFirstChild;
+} CLIENTCREATESTRUCT32, *LPCLIENTCREATESTRUCT32;
+
+DECL_WINELIB_TYPE(CLIENTCREATESTRUCT);
+DECL_WINELIB_TYPE(LPCLIENTCREATESTRUCT);
 
 typedef struct
 {
-    SEGPTR    szClass;
-    SEGPTR    szTitle;
-    HANDLE    hOwner;
-    INT       x;
-    INT       y;
-    INT       cx;
-    INT	      cy;
-    LONG      style WINE_PACKED;
-    LONG      lParam WINE_PACKED;
-} MDICREATESTRUCT, *LPMDICREATESTRUCT;
+    SEGPTR       szClass;
+    SEGPTR       szTitle;
+    HINSTANCE16  hOwner;
+    INT16        x;
+    INT16        y;
+    INT16        cx;
+    INT16        cy;
+    DWORD        style WINE_PACKED;
+    LPARAM       lParam WINE_PACKED;
+} MDICREATESTRUCT16, *LPMDICREATESTRUCT16;
+
+typedef struct
+{
+    LPCSTR       szClass;
+    LPCSTR       szTitle;
+    HINSTANCE32  hOwner;
+    INT32        x;
+    INT32        y;
+    INT32        cx;
+    INT32        cy;
+    DWORD        style;
+    LPARAM       lParam;
+} MDICREATESTRUCT32A, *LPMDICREATESTRUCT32A;
+
+typedef struct
+{
+    LPCWSTR      szClass;
+    LPCWSTR      szTitle;
+    HINSTANCE32  hOwner;
+    INT32        x;
+    INT32        y;
+    INT32        cx;
+    INT32        cy;
+    DWORD        style;
+    LPARAM       lParam;
+} MDICREATESTRUCT32W, *LPMDICREATESTRUCT32W;
+
+DECL_WINELIB_TYPE_AW(MDICREATESTRUCT);
+DECL_WINELIB_TYPE_AW(LPMDICREATESTRUCT);
 
 #define MDITILE_VERTICAL    0    
 #define MDITILE_HORIZONTAL  1
+#define MDIS_ALLCHILDSTYLES 0x0001
 
   /* Offsets for GetWindowLong() and GetWindowWord() */
 #define GWL_USERDATA        (-21)
@@ -429,31 +478,68 @@
 #define MSGF_USER        4096
 
   /* Journalling hook structure */
-typedef struct tagEVENTMSG
+
+typedef struct
 {
-    UINT    message;
-    UINT    paramL;
-    UINT    paramH;
+    UINT16  message;
+    UINT16  paramL;
+    UINT16  paramH;
     DWORD   time WINE_PACKED;
-} EVENTMSG, *LPEVENTMSG;
+} EVENTMSG16, *LPEVENTMSG16;
+
+typedef struct
+{
+    UINT32  message;
+    UINT32  paramL;
+    UINT32  paramH;
+    DWORD   time;
+    HWND32  hwnd;
+} EVENTMSG32, *LPEVENTMSG32;
+
+DECL_WINELIB_TYPE(EVENTMSG);
+DECL_WINELIB_TYPE(LPEVENTMSG);
 
   /* Mouse hook structure */
-typedef struct tagMOUSEHOOKSTRUCT
+
+typedef struct
 {
     POINT16 pt;
     HWND16  hwnd;
-    WORD    wHitTestCode;
+    UINT16  wHitTestCode;
     DWORD   dwExtraInfo;
-} MOUSEHOOKSTRUCT, *LPMOUSEHOOKSTRUCT;
+} MOUSEHOOKSTRUCT16, *LPMOUSEHOOKSTRUCT16;
+
+typedef struct
+{
+    POINT32 pt;
+    HWND32  hwnd;
+    UINT32  wHitTestCode;
+    DWORD   dwExtraInfo;
+} MOUSEHOOKSTRUCT32, *LPMOUSEHOOKSTRUCT32;
+
+DECL_WINELIB_TYPE(MOUSEHOOKSTRUCT);
+DECL_WINELIB_TYPE(LPMOUSEHOOKSTRUCT);
 
   /* Hardware hook structure */
-typedef struct tagHARDWAREHOOKSTRUCT
+
+typedef struct
 {
-    HWND    hWnd;
-    UINT    wMessage;
-    WPARAM  wParam;
-    LPARAM  lParam WINE_PACKED;
-} HARDWAREHOOKSTRUCT;
+    HWND16    hWnd;
+    UINT16    wMessage;
+    WPARAM16  wParam;
+    LPARAM    lParam WINE_PACKED;
+} HARDWAREHOOKSTRUCT16, *LPHARDWAREHOOKSTRUCT16;
+
+typedef struct
+{
+    HWND32    hWnd;
+    UINT32    wMessage;
+    WPARAM32  wParam;
+    LPARAM    lParam;
+} HARDWAREHOOKSTRUCT32, *LPHARDWAREHOOKSTRUCT32;
+
+DECL_WINELIB_TYPE(HARDWAREHOOKSTRUCT);
+DECL_WINELIB_TYPE(LPHARDWAREHOOKSTRUCT);
 
   /* CBT hook values */
 #define HCBT_MOVESIZE	    0
@@ -468,17 +554,41 @@
 #define HCBT_SETFOCUS	    9
 
   /* CBT hook structures */
-typedef struct tagCBT_CREATEWND
-{
-    CREATESTRUCT16 *lpcs;
-    HWND            hwndInsertAfter;
-} CBT_CREATEWND, *LPCBT_CREATEWND;
 
-typedef struct tagCBTACTIVATESTRUCT
+typedef struct
 {
-    BOOL    fMouse;
-    HWND    hWndActive;
-} CBTACTIVATESTRUCT;
+    CREATESTRUCT16  *lpcs;
+    HWND16           hwndInsertAfter;
+} CBT_CREATEWND16, *LPCBT_CREATEWND16;
+
+typedef struct
+{
+    CREATESTRUCT32A *lpcs;
+    HWND32           hwndInsertAfter;
+} CBT_CREATEWND32A, *LPCBT_CREATEWND32A;
+
+typedef struct
+{
+    CREATESTRUCT32W *lpcs;
+    HWND32           hwndInsertAfter;
+} CBT_CREATEWND32W, *LPCBT_CREATEWND32W;
+
+DECL_WINELIB_TYPE_AW(CBT_CREATEWND);
+DECL_WINELIB_TYPE_AW(LPCBT_CREATEWND);
+
+typedef struct
+{
+    BOOL16    fMouse;
+    HWND16    hWndActive;
+} CBTACTIVATESTRUCT16;
+
+typedef struct
+{
+    BOOL32    fMouse;
+    HWND32    hWndActive;
+} CBTACTIVATESTRUCT32;
+
+DECL_WINELIB_TYPE(CBTACTIVATESTRUCT);
 
   /* Shell hook values */
 #define HSHELL_WINDOWCREATED       1
@@ -486,15 +596,27 @@
 #define HSHELL_ACTIVATESHELLWINDOW 3
 
   /* Debug hook structure */
-typedef struct tagDEBUGHOOKINFO
+
+typedef struct
 {
-    HANDLE	hModuleHook;
+    HMODULE16   hModuleHook;
     LPARAM	reserved WINE_PACKED;
     LPARAM	lParam WINE_PACKED;
-    WPARAM	wParam;
-    short       code;
-} DEBUGHOOKINFO, *LPDEBUGHOOKINFO;
+    WPARAM16    wParam;
+    INT16       code;
+} DEBUGHOOKINFO16, *LPDEBUGHOOKINFO16;
 
+typedef struct
+{
+    DWORD       idThread;
+    DWORD       idThreadInstaller;
+    LPARAM      lParam;
+    WPARAM32    wParam;
+    INT32       code;
+} DEBUGHOOKINFO32, *LPDEBUGHOOKINFO32;
+
+DECL_WINELIB_TYPE(DEBUGHOOKINFO);
+DECL_WINELIB_TYPE(LPDEBUGHOOKINFO);
 
 /***** Dialogs *****/
 
@@ -538,15 +660,28 @@
 #define IDNO                7
 
 
-typedef struct tagMSG
+typedef struct
 {
-  HWND16    hwnd;
-  UINT16    message;
-  WPARAM16  wParam;
-  LPARAM    lParam WINE_PACKED;
-  DWORD     time WINE_PACKED;
-  POINT16   pt WINE_PACKED;
-} MSG, *LPMSG;
+    HWND16    hwnd;
+    UINT16    message;
+    WPARAM16  wParam;
+    LPARAM    lParam WINE_PACKED;
+    DWORD     time WINE_PACKED;
+    POINT16   pt WINE_PACKED;
+} MSG16, *LPMSG16;
+
+typedef struct
+{
+    HWND32    hwnd;
+    UINT32    message;
+    WPARAM32  wParam;
+    LPARAM    lParam;
+    DWORD     time;
+    POINT32   pt;
+} MSG32, *LPMSG32;
+
+DECL_WINELIB_TYPE(MSG);
+DECL_WINELIB_TYPE(LPMSG);
 	
   /* Raster operations */
 
@@ -638,29 +773,49 @@
 
   /* Bitmaps */
 
-typedef struct tagBITMAP
+typedef struct
 {
-    INT  bmType;
-    INT  bmWidth;
-    INT  bmHeight;
-    INT  bmWidthBytes;
+    INT16  bmType;
+    INT16  bmWidth;
+    INT16  bmHeight;
+    INT16  bmWidthBytes;
     BYTE   bmPlanes;
     BYTE   bmBitsPixel;
     SEGPTR bmBits WINE_PACKED;
-} BITMAP;
+} BITMAP16, *LPBITMAP16;
 
-typedef BITMAP *PBITMAP;
-typedef BITMAP *NPBITMAP;
-typedef BITMAP *LPBITMAP;
+typedef struct
+{
+    INT32  bmType;
+    INT32  bmWidth;
+    INT32  bmHeight;
+    INT32  bmWidthBytes;
+    WORD   bmPlanes;
+    WORD   bmBitsPixel;
+    LPVOID bmBits WINE_PACKED;
+} BITMAP32, *LPBITMAP32;
+
+DECL_WINELIB_TYPE(BITMAP);
+DECL_WINELIB_TYPE(LPBITMAP);
 
   /* Brushes */
 
-typedef struct tagLOGBRUSH
+typedef struct
 { 
-    WORD       lbStyle; 
+    UINT16     lbStyle; 
     COLORREF   lbColor WINE_PACKED;
-    INT        lbHatch; 
-} LOGBRUSH, *PLOGBRUSH, *NPLOGBRUSH, *LPLOGBRUSH;
+    INT16      lbHatch; 
+} LOGBRUSH16, *LPLOGBRUSH16;
+
+typedef struct
+{ 
+    UINT32     lbStyle; 
+    COLORREF   lbColor;
+    INT32      lbHatch; 
+} LOGBRUSH32, *LPLOGBRUSH32;
+
+DECL_WINELIB_TYPE(LOGBRUSH);
+DECL_WINELIB_TYPE(LPLOGBRUSH);
 
   /* Brush styles */
 #define BS_SOLID	    0
@@ -684,20 +839,86 @@
 #define LF_FACESIZE     32
 #define LF_FULLFACESIZE 64
 
-typedef struct tagLOGFONT
+typedef struct
 {
-    INT lfHeight, lfWidth, lfEscapement, lfOrientation, lfWeight;
-    BYTE lfItalic, lfUnderline, lfStrikeOut, lfCharSet;
-    BYTE lfOutPrecision, lfClipPrecision, lfQuality, lfPitchAndFamily;
-    BYTE lfFaceName[LF_FACESIZE] WINE_PACKED;
-} LOGFONT, *PLOGFONT, *NPLOGFONT, *LPLOGFONT;
+    INT16  lfHeight;
+    INT16  lfWidth;
+    INT16  lfEscapement;
+    INT16  lfOrientation;
+    INT16  lfWeight;
+    BYTE   lfItalic;
+    BYTE   lfUnderline;
+    BYTE   lfStrikeOut;
+    BYTE   lfCharSet;
+    BYTE   lfOutPrecision;
+    BYTE   lfClipPrecision;
+    BYTE   lfQuality;
+    BYTE   lfPitchAndFamily;
+    CHAR   lfFaceName[LF_FACESIZE] WINE_PACKED;
+} LOGFONT16, *LPLOGFONT16;
 
-typedef struct tagENUMLOGFONT
+typedef struct
 {
-  LOGFONT elfLogFont;
-  BYTE elfFullName[LF_FULLFACESIZE] WINE_PACKED;
-  BYTE elfStyle[LF_FACESIZE] WINE_PACKED;
-} ENUMLOGFONT,*PENUMLOGFONT,*NPENUMLOGFONT,*LPENUMLOGFONT;
+    INT32  lfHeight;
+    INT32  lfWidth;
+    INT32  lfEscapement;
+    INT32  lfOrientation;
+    INT32  lfWeight;
+    BYTE   lfItalic;
+    BYTE   lfUnderline;
+    BYTE   lfStrikeOut;
+    BYTE   lfCharSet;
+    BYTE   lfOutPrecision;
+    BYTE   lfClipPrecision;
+    BYTE   lfQuality;
+    BYTE   lfPitchAndFamily;
+    CHAR   lfFaceName[LF_FACESIZE];
+} LOGFONT32A, *LPLOGFONT32A;
+
+typedef struct
+{
+    INT32  lfHeight;
+    INT32  lfWidth;
+    INT32  lfEscapement;
+    INT32  lfOrientation;
+    INT32  lfWeight;
+    BYTE   lfItalic;
+    BYTE   lfUnderline;
+    BYTE   lfStrikeOut;
+    BYTE   lfCharSet;
+    BYTE   lfOutPrecision;
+    BYTE   lfClipPrecision;
+    BYTE   lfQuality;
+    BYTE   lfPitchAndFamily;
+    WCHAR  lfFaceName[LF_FACESIZE];
+} LOGFONT32W, *LPLOGFONT32W;
+
+DECL_WINELIB_TYPE_AW(LOGFONT);
+DECL_WINELIB_TYPE_AW(LPLOGFONT);
+
+typedef struct
+{
+  LOGFONT16  elfLogFont;
+  BYTE       elfFullName[LF_FULLFACESIZE] WINE_PACKED;
+  BYTE       elfStyle[LF_FACESIZE] WINE_PACKED;
+} ENUMLOGFONT16, *LPENUMLOGFONT16;
+
+typedef struct
+{
+  LOGFONT32A elfLogFont;
+  BYTE       elfFullName[LF_FULLFACESIZE] WINE_PACKED;
+  BYTE       elfStyle[LF_FACESIZE] WINE_PACKED;
+} ENUMLOGFONT32A, *LPENUMLOGFONT32A;
+
+typedef struct
+{
+  LOGFONT32W elfLogFont;
+  WCHAR      elfFullName[LF_FULLFACESIZE] WINE_PACKED;
+  WCHAR      elfStyle[LF_FACESIZE] WINE_PACKED;
+} ENUMLOGFONT32W, *LPENUMLOGFONT32W;
+
+DECL_WINELIB_TYPE_AW(ENUMLOGFONT);
+DECL_WINELIB_TYPE_AW(LPENUMLOGFONT);
 
   /* lfWeight values */
 #define FW_DONTCARE	    0
@@ -758,29 +979,80 @@
 #define FF_SCRIPT           0x40
 #define FF_DECORATIVE       0x50
 
-typedef struct tagTEXTMETRIC
+typedef struct
 {
-    INT     tmHeight;
-    INT     tmAscent;
-    INT     tmDescent;
-    INT     tmInternalLeading;
-    INT     tmExternalLeading;
-    INT     tmAveCharWidth;
-    INT     tmMaxCharWidth;
-    INT     tmWeight;
-    BYTE    tmItalic;
-    BYTE    tmUnderlined;
-    BYTE    tmStruckOut;
-    BYTE    tmFirstChar;
-    BYTE    tmLastChar;
-    BYTE    tmDefaultChar;
-    BYTE    tmBreakChar;
-    BYTE    tmPitchAndFamily;
-    BYTE    tmCharSet;
-    INT     tmOverhang WINE_PACKED;
-    INT     tmDigitizedAspectX WINE_PACKED;
-    INT     tmDigitizedAspectY WINE_PACKED;
-} TEXTMETRIC, *PTEXTMETRIC, *NPTEXTMETRIC, *LPTEXTMETRIC;
+    INT16     tmHeight;
+    INT16     tmAscent;
+    INT16     tmDescent;
+    INT16     tmInternalLeading;
+    INT16     tmExternalLeading;
+    INT16     tmAveCharWidth;
+    INT16     tmMaxCharWidth;
+    INT16     tmWeight;
+    BYTE      tmItalic;
+    BYTE      tmUnderlined;
+    BYTE      tmStruckOut;
+    BYTE      tmFirstChar;
+    BYTE      tmLastChar;
+    BYTE      tmDefaultChar;
+    BYTE      tmBreakChar;
+    BYTE      tmPitchAndFamily;
+    BYTE      tmCharSet;
+    INT16     tmOverhang WINE_PACKED;
+    INT16     tmDigitizedAspectX WINE_PACKED;
+    INT16     tmDigitizedAspectY WINE_PACKED;
+} TEXTMETRIC16, *LPTEXTMETRIC16;
+
+typedef struct
+{
+    INT32     tmHeight;
+    INT32     tmAscent;
+    INT32     tmDescent;
+    INT32     tmInternalLeading;
+    INT32     tmExternalLeading;
+    INT32     tmAveCharWidth;
+    INT32     tmMaxCharWidth;
+    INT32     tmWeight;
+    INT32     tmOverhang;
+    INT32     tmDigitizedAspectX;
+    INT32     tmDigitizedAspectY;
+    BYTE      tmFirstChar;
+    BYTE      tmLastChar;
+    BYTE      tmDefaultChar;
+    BYTE      tmBreakChar;
+    BYTE      tmItalic;
+    BYTE      tmUnderlined;
+    BYTE      tmStruckOut;
+    BYTE      tmPitchAndFamily;
+    BYTE      tmCharSet;
+} TEXTMETRIC32A, *LPTEXTMETRIC32A;
+
+typedef struct
+{
+    INT32     tmHeight;
+    INT32     tmAscent;
+    INT32     tmDescent;
+    INT32     tmInternalLeading;
+    INT32     tmExternalLeading;
+    INT32     tmAveCharWidth;
+    INT32     tmMaxCharWidth;
+    INT32     tmWeight;
+    INT32     tmOverhang;
+    INT32     tmDigitizedAspectX;
+    INT32     tmDigitizedAspectY;
+    WCHAR     tmFirstChar;
+    WCHAR     tmLastChar;
+    WCHAR     tmDefaultChar;
+    WCHAR     tmBreakChar;
+    BYTE      tmItalic;
+    BYTE      tmUnderlined;
+    BYTE      tmStruckOut;
+    BYTE      tmPitchAndFamily;
+    BYTE      tmCharSet;
+} TEXTMETRIC32W, *LPTEXTMETRIC32W;
+
+DECL_WINELIB_TYPE_AW(TEXTMETRIC);
+DECL_WINELIB_TYPE_AW(LPTEXTMETRIC);
 
   /* tmPitchAndFamily values */
 #define TMPF_FIXED_PITCH    1
@@ -804,12 +1076,22 @@
 #define ETO_CLIPPED         0x04
 
   /* for GetCharABCWidths() */
-typedef struct tagABC
+typedef struct
 {
-    INT   abcA;
-    UINT  abcB;
-    INT   abcC;
-} ABC, *LPABC;
+    INT16   abcA;
+    UINT16  abcB;
+    INT16   abcC;
+} ABC16, *LPABC16;
+
+typedef struct
+{
+    INT32   abcA;
+    UINT32  abcB;
+    INT32   abcC;
+} ABC32, *LPABC32;
+
+DECL_WINELIB_TYPE(ABC);
+DECL_WINELIB_TYPE(LPABC);
 
   /* Rasterizer status */
 typedef struct
@@ -831,22 +1113,31 @@
 	BYTE peRed, peGreen, peBlue, peFlags;
 } PALETTEENTRY, *LPPALETTEENTRY;
 
-typedef struct tagLOGPALETTE
+typedef struct
 { 
     WORD           palVersion;
     WORD           palNumEntries;
     PALETTEENTRY   palPalEntry[1] WINE_PACKED;
-} LOGPALETTE, *PLOGPALETTE, *NPLOGPALETTE, *LPLOGPALETTE;
-
+} LOGPALETTE, *LPLOGPALETTE;
 
   /* Pens */
 
-typedef struct tagLOGPEN
+typedef struct
 {
-    WORD     lopnStyle; 
+    UINT16   lopnStyle; 
     POINT16  lopnWidth WINE_PACKED;
     COLORREF lopnColor WINE_PACKED;
-} LOGPEN, *PLOGPEN, *NPLOGPEN, *LPLOGPEN;
+} LOGPEN16, *LPLOGPEN16;
+
+typedef struct
+{
+    UINT32   lopnStyle; 
+    POINT32  lopnWidth WINE_PACKED;
+    COLORREF lopnColor WINE_PACKED;
+} LOGPEN32, *LPLOGPEN32;
+
+DECL_WINELIB_TYPE(LOGPEN);
+DECL_WINELIB_TYPE(LPLOGPEN);
 
 #define PS_SOLID	  0
 #define PS_DASH           1
@@ -1079,14 +1370,14 @@
 
 typedef struct
 {
-    UINT    bfType;
+    UINT16  bfType;
     DWORD   bfSize WINE_PACKED;
-    UINT    bfReserved1 WINE_PACKED;
-    UINT    bfReserved2 WINE_PACKED;
+    UINT16  bfReserved1 WINE_PACKED;
+    UINT16  bfReserved2 WINE_PACKED;
     DWORD   bfOffBits WINE_PACKED;
 } BITMAPFILEHEADER;
 
-typedef struct tagBITMAPINFOHEADER
+typedef struct
 {
     DWORD 	biSize;
     DWORD 	biWidth;
@@ -1099,11 +1390,7 @@
     DWORD 	biYPelsPerMeter;
     DWORD 	biClrUsed;
     DWORD 	biClrImportant;
-} BITMAPINFOHEADER;
-
-typedef BITMAPINFOHEADER * LPBITMAPINFOHEADER;
-typedef BITMAPINFOHEADER * NPBITMAPINFOHEADER;
-typedef BITMAPINFOHEADER * PBITMAPINFOHEADER;
+} BITMAPINFOHEADER, *LPBITMAPINFOHEADER;
 
   /* biCompression */
 #define BI_RGB           0
@@ -1120,11 +1407,11 @@
 
 typedef struct
 {
-    DWORD bcSize;
-    UINT bcWidth;
-    UINT bcHeight;
-    UINT bcPlanes;
-    UINT bcBitCount;
+    DWORD   bcSize;
+    UINT16  bcWidth;
+    UINT16  bcHeight;
+    UINT16  bcPlanes;
+    UINT16  bcBitCount;
 } BITMAPCOREHEADER;
 
 typedef struct
@@ -1211,16 +1498,17 @@
 
 /* The security attributes structure 
  */
-typedef struct {
-    DWORD nLength;
-    void *lpSecurityDescriptor;
-    BOOL bInheritHandle;
+typedef struct
+{
+    DWORD   nLength;
+    LPVOID  lpSecurityDescriptor;
+    BOOL32  bInheritHandle;
 } SECURITY_ATTRIBUTES, *LPSECURITY_ATTRIBUTES;
 
 typedef struct
 {
-  int dwLowDateTime;
-  int dwHighDateTime;
+  INT32  dwLowDateTime;
+  INT32  dwHighDateTime;
 } FILETIME;
 
 /* comm */
@@ -1311,47 +1599,47 @@
 
 typedef struct tagDCB
 {
-    BYTE Id;
-    UINT BaudRate WINE_PACKED;
-    BYTE ByteSize;
-    BYTE Parity;
-    BYTE StopBits;
-    UINT RlsTimeout;
-    UINT CtsTimeout;
-    UINT DsrTimeout;
+    BYTE   Id;
+    UINT16 BaudRate WINE_PACKED;
+    BYTE   ByteSize;
+    BYTE   Parity;
+    BYTE   StopBits;
+    UINT16 RlsTimeout;
+    UINT16 CtsTimeout;
+    UINT16 DsrTimeout;
 
-    UINT fBinary        :1;
-    UINT fRtsDisable    :1;
-    UINT fParity        :1;
-    UINT fOutxCtsFlow   :1;
-    UINT fOutxDsrFlow   :1;
-    UINT fDummy         :2;
-    UINT fDtrDisable    :1;
+    UINT16 fBinary        :1;
+    UINT16 fRtsDisable    :1;
+    UINT16 fParity        :1;
+    UINT16 fOutxCtsFlow   :1;
+    UINT16 fOutxDsrFlow   :1;
+    UINT16 fDummy         :2;
+    UINT16 fDtrDisable    :1;
 
-    UINT fOutX          :1;
-    UINT fInX           :1;
-    UINT fPeChar        :1;
-    UINT fNull          :1;
-    UINT fChEvt         :1;
-    UINT fDtrflow       :1;
-    UINT fRtsflow       :1;
-    UINT fDummy2        :1;
+    UINT16 fOutX          :1;
+    UINT16 fInX           :1;
+    UINT16 fPeChar        :1;
+    UINT16 fNull          :1;
+    UINT16 fChEvt         :1;
+    UINT16 fDtrflow       :1;
+    UINT16 fRtsflow       :1;
+    UINT16 fDummy2        :1;
 
-    char XonChar;
-    char XoffChar;
-    UINT XonLim;
-    UINT XoffLim;
-    char PeChar;
-    char EofChar;
-    char EvtChar;
-    UINT TxDelay WINE_PACKED;
+    CHAR   XonChar;
+    CHAR   XoffChar;
+    UINT16 XonLim;
+    UINT16 XoffLim;
+    CHAR   PeChar;
+    CHAR   EofChar;
+    CHAR   EvtChar;
+    UINT16 TxDelay WINE_PACKED;
 } DCB, *LPDCB;
 
 typedef struct tagCOMSTAT
 {
-    BYTE status;
-    UINT cbInQue WINE_PACKED;
-    UINT cbOutQue WINE_PACKED;
+    BYTE   status;
+    UINT16 cbInQue WINE_PACKED;
+    UINT16 cbOutQue WINE_PACKED;
 } COMSTAT;
 
 #define CSTF_CTSHOLD	0x01
@@ -1555,14 +1843,15 @@
 
 /* DragObject stuff */
 
-typedef struct tagDRAGINFO {
-	HWND 	hWnd;
-	HANDLE	hScope;
-	WORD	wFlags;
-	HANDLE  hList;
-	HANDLE  hOfStruct;
-	POINT16 pt WINE_PACKED;
-	LONG	l  WINE_PACKED;
+typedef struct
+{
+    HWND16     hWnd;
+    HANDLE16   hScope;
+    WORD       wFlags;
+    HANDLE16   hList;
+    HANDLE16   hOfStruct;
+    POINT16 pt WINE_PACKED;
+    LONG       l WINE_PACKED;
 } DRAGINFO, *LPDRAGINFO;
 
 #define DRAGOBJ_PROGRAM		0x0001
@@ -2357,33 +2646,74 @@
 
 typedef struct
 {
-    UINT        CtlType;
-    UINT        CtlID;
-    UINT        itemID;
-    UINT        itemWidth;
-    UINT        itemHeight;
+    UINT16      CtlType;
+    UINT16      CtlID;
+    UINT16      itemID;
+    UINT16      itemWidth;
+    UINT16      itemHeight;
     DWORD       itemData WINE_PACKED;
-} MEASUREITEMSTRUCT, *PMEASUREITEMSTRUCT, *LPMEASUREITEMSTRUCT;
+} MEASUREITEMSTRUCT16, *PMEASUREITEMSTRUCT16, *LPMEASUREITEMSTRUCT16;
 
 typedef struct
 {
-    UINT       CtlType;
-    UINT       CtlID;
-    UINT       itemID;
-    HWND       hwndItem;
+    UINT32      CtlType;
+    UINT32      CtlID;
+    UINT32      itemID;
+    UINT32      itemWidth;
+    UINT32      itemHeight;
+    DWORD       itemData;
+} MEASUREITEMSTRUCT32, *PMEASUREITEMSTRUCT32, *LPMEASUREITEMSTRUCT32;
+
+DECL_WINELIB_TYPE(MEASUREITEMSTRUCT);
+DECL_WINELIB_TYPE(PMEASUREITEMSTRUCT);
+DECL_WINELIB_TYPE(LPMEASUREITEMSTRUCT);
+
+typedef struct
+{
+    UINT16     CtlType;
+    UINT16     CtlID;
+    UINT16     itemID;
+    HWND16     hwndItem;
     DWORD      itemData;
-} DELETEITEMSTRUCT, *PDELETEITEMSTRUCT, *LPDELETEITEMSTRUCT;
+} DELETEITEMSTRUCT16, *LPDELETEITEMSTRUCT16;
 
 typedef struct
 {
-    UINT        CtlType;
-    UINT        CtlID;
-    HWND        hwndItem;
-    UINT        itemID1;
+    UINT32     CtlType;
+    UINT32     CtlID;
+    UINT32     itemID;
+    HWND32     hwndItem;
+    DWORD      itemData;
+} DELETEITEMSTRUCT32, *LPDELETEITEMSTRUCT32;
+
+DECL_WINELIB_TYPE(DELETEITEMSTRUCT);
+DECL_WINELIB_TYPE(LPDELETEITEMSTRUCT);
+
+typedef struct
+{
+    UINT16      CtlType;
+    UINT16      CtlID;
+    HWND16      hwndItem;
+    UINT16      itemID1;
     DWORD       itemData1;
-    UINT        itemID2;
+    UINT16      itemID2;
     DWORD       itemData2 WINE_PACKED;
-} COMPAREITEMSTRUCT, *PCOMPAREITEMSTRUCT, *LPCOMPAREITEMSTRUCT;
+} COMPAREITEMSTRUCT16, *LPCOMPAREITEMSTRUCT16;
+
+typedef struct
+{
+    UINT32      CtlType;
+    UINT32      CtlID;
+    HWND32      hwndItem;
+    UINT32      itemID1;
+    DWORD       itemData1;
+    UINT32      itemID2;
+    DWORD       itemData2;
+    DWORD       dwLocaleId;
+} COMPAREITEMSTRUCT32, *LPCOMPAREITEMSTRUCT32;
+
+DECL_WINELIB_TYPE(COMPAREITEMSTRUCT);
+DECL_WINELIB_TYPE(LPCOMPAREITEMSTRUCT);
 
 /* WM_KEYUP/DOWN/CHAR HIWORD(lParam) flags */
 #define KF_EXTENDED         0x0100
@@ -2571,7 +2901,7 @@
 /* Handle table structure */
 typedef struct
 {
-    HANDLE     objectHandle[1];
+    HANDLE16   objectHandle[1];
 } HANDLETABLE;
 typedef HANDLETABLE *PHANDLETABLE;
 typedef HANDLETABLE *LPHANDLETABLE;
@@ -2579,12 +2909,11 @@
 /* Clipboard metafile picture structure */
 typedef struct
 {
-    INT        mm;
-    INT        xExt;
-    INT        yExt;
-    HMETAFILE  hMF;
-} METAFILEPICT;
-typedef METAFILEPICT *LPMETAFILEPICT;
+    INT16        mm;
+    INT16        xExt;
+    INT16        yExt;
+    HMETAFILE16  hMF;
+} METAFILEPICT, *LPMETAFILEPICT;
 
 /* Metafile functions */
 #define META_SETBKCOLOR              0x0201
@@ -2669,10 +2998,10 @@
 /* Debugging support (DEBUG SYSTEM ONLY) */
 typedef struct
 {
-    UINT    flags;
+    UINT16  flags;
     DWORD   dwOptions WINE_PACKED;
     DWORD   dwFilter WINE_PACKED;
-    char    achAllocModule[8] WINE_PACKED;
+    CHAR    achAllocModule[8] WINE_PACKED;
     DWORD   dwAllocBreak WINE_PACKED;
     DWORD   dwAllocCount WINE_PACKED;
 } WINDEBUGINFO, *LPWINDEBUGINFO;
@@ -2737,10 +3066,11 @@
 	WORD ofsData;
 } WINHELP,*LPWINHELP;
 
-typedef struct {
-	UINT mkSize;
-	BYTE mkKeyList;
-	BYTE szKeyPhrase[1];
+typedef struct
+{
+    UINT16  mkSize;
+    BYTE    mkKeyList;
+    BYTE    szKeyPhrase[1];
 } MULTIKEYHELP, *LPMULTIKEYHELP;
 
 typedef struct {
@@ -2799,7 +3129,7 @@
 
 typedef struct _SYSTEM_POWER_STATUS
 {
-  BOOL    ACLineStatus;
+  BOOL16  ACLineStatus;
   BYTE    BatteryFlag;
   BYTE    BatteryLifePercent;
   BYTE    reserved;
@@ -2812,596 +3142,42 @@
 #pragma pack(4)
 #endif
 
+/* Declarations for functions that exist only in Win16 */
 
-INT        AccessResource(HINSTANCE,HRSRC);
-ATOM       AddAtom(SEGPTR);
-INT        AddFontResource(LPCSTR);
-WORD       AllocCStoDSAlias(WORD);
-WORD       AllocDStoCSAlias(WORD);
-HGLOBAL    AllocResource(HINSTANCE,HRSRC,DWORD);
-WORD       AllocSelector(WORD);
-WORD       AllocSelectorArray(WORD);
-BOOL       AnimatePalette(HPALETTE16,UINT,UINT,LPPALETTEENTRY);
-LPSTR      AnsiLower(LPSTR);
-UINT       AnsiLowerBuff(LPSTR,UINT);
-SEGPTR     AnsiNext(SEGPTR);
-SEGPTR     AnsiPrev(SEGPTR,SEGPTR);
-INT        AnsiToOem(LPSTR,LPSTR);
-void       AnsiToOemBuff(LPCSTR,LPSTR,UINT);
-LPSTR      AnsiUpper(LPSTR);
-UINT       AnsiUpperBuff(LPSTR,UINT);
-BOOL       AnyPopup(void);
-BOOL       Arc(HDC,INT,INT,INT,INT,INT,INT,INT,INT);
-UINT       ArrangeIconicWindows(HWND);
-HDWP16     BeginDeferWindowPos(INT);
-BOOL       BitBlt(HDC,INT,INT,INT,INT,HDC,INT,INT,DWORD);
-BOOL       BringWindowToTop(HWND);
-BOOL       BuildCommDCB(LPCSTR,DCB*);
-void       CalcChildScroll(HWND,WORD);
-BOOL       CallMsgFilter(SEGPTR,INT);
-LRESULT    CallNextHookEx(HHOOK,INT,WPARAM,LPARAM);
-INT        Catch(LPCATCHBUF);
-BOOL       ChangeClipboardChain(HWND,HWND);
-WORD       ChangeSelector(WORD,WORD);
-BOOL       CheckDlgButton(HWND,INT,UINT);
-INT        CheckMenuItem(HMENU,UINT,UINT);
-BOOL       CheckRadioButton(HWND,UINT,UINT,UINT);
-BOOL       Chord(HDC,INT,INT,INT,INT,INT,INT,INT,INT);
-int        ClearCommBreak(int);
-BOOL       CloseClipboard(void);
-int        CloseComm(int);
-HMETAFILE  CloseMetaFile(HDC);
-void       CloseSound(void);
-BOOL       CloseWindow(HWND);
-INT16      CombineRgn(HRGN32,HRGN32,HRGN32,INT32);
-int        ConvertRequest(HWND,LPKANJISTRUCT);
-#ifdef WINELIB32
-HCURSOR    CopyCursor(HCURSOR); /* Win32 */
-HICON      CopyIcon(HICON); /* Win32 */
-#else
-HCURSOR    CopyCursor(HINSTANCE,HCURSOR); /* Win16 */
-HICON      CopyIcon(HINSTANCE,HICON); /* Win16 */
-#endif
-HMETAFILE  CopyMetaFile(HMETAFILE,LPCSTR);
-INT        CountClipboardFormats(void);
-INT        CountVoiceNotes(INT);
-HBITMAP    CreateBitmap(INT,INT,UINT,UINT,LPVOID);
-HBITMAP    CreateBitmapIndirect(const BITMAP*);
-HBRUSH     CreateBrushIndirect(const LOGBRUSH*);
-BOOL       CreateCaret(HWND,HBITMAP,INT,INT);
-HBITMAP    CreateCompatibleBitmap(HDC,INT,INT);
-HDC        CreateCompatibleDC(HDC);
-HCURSOR    CreateCursor(HANDLE,INT,INT,INT,INT,const BYTE*,const BYTE*);
-HANDLE     CreateCursorIconIndirect(HANDLE,CURSORICONINFO*,const BYTE*,const BYTE*);
-HDC        CreateDC(LPCSTR,LPCSTR,LPCSTR,const DEVMODE*);
-HBRUSH     CreateDIBPatternBrush(HGLOBAL,UINT);
-HBITMAP    CreateDIBitmap(HDC,BITMAPINFOHEADER*,DWORD,LPVOID,BITMAPINFO*,UINT);
-HBITMAP    CreateDiscardableBitmap(HDC,INT,INT);
-HRGN       CreateEllipticRgn(INT32,INT32,INT32,INT32);
-HFONT      CreateFont(INT,INT,INT,INT,INT,BYTE,BYTE,BYTE,BYTE,BYTE,BYTE,BYTE,BYTE,LPCSTR);
-HFONT      CreateFontIndirect(const LOGFONT*);
-HBRUSH     CreateHatchBrush(INT,COLORREF);
-HDC        CreateIC(LPCSTR,LPCSTR,LPCSTR,const DEVMODE*);
-HICON      CreateIcon(HINSTANCE,INT,INT,BYTE,BYTE,const BYTE*,const BYTE*);
-HMENU      CreateMenu(void);
-HDC        CreateMetaFile(LPCSTR);
-HPALETTE16 CreatePalette(const LOGPALETTE*);
-HBRUSH     CreatePatternBrush(HBITMAP);
-HPEN16     CreatePen(INT,INT,COLORREF);
-HPEN16     CreatePenIndirect(const LOGPEN*);
-HMENU      CreatePopupMenu(void);
-HRGN       CreateRectRgn(INT32,INT32,INT32,INT32);
-HRGN       CreateRoundRectRgn(INT32,INT32,INT32,INT32,INT32,INT32);
-HBRUSH     CreateSolidBrush(COLORREF);
-void       DebugBreak(void);
-DWORD      DefHookProc(short,WORD,DWORD,HHOOK*);
-HDWP16     DeferWindowPos(HDWP16,HWND,HWND,INT,INT,INT,INT,UINT);
-ATOM       DeleteAtom(ATOM);
-BOOL       DeleteDC(HDC);
-BOOL       DeleteMenu(HMENU,UINT,UINT);
-BOOL       DeleteMetaFile(HMETAFILE);
-BOOL       DeleteObject(HGDIOBJ16);
-BOOL       DestroyCaret(void);
-BOOL       DestroyCursor(HCURSOR);
-BOOL       DestroyIcon(HICON);
-BOOL       DestroyMenu(HMENU);
-BOOL       DestroyWindow(HWND);
-HANDLE     DirectResAlloc(HANDLE,WORD,WORD);
-void       DirectedYield(HTASK);
-LONG       DispatchMessage(const MSG*);
-INT        DlgDirList(HWND,SEGPTR,INT,INT,UINT);
-BOOL       DlgDirSelect(HWND,LPSTR,INT);
-BOOL       DlgDirSelectComboBox(HWND,LPSTR,INT);
-BOOL16     DragDetect(HWND16,POINT16);
-DWORD      DragObject(HWND, HWND, WORD, HANDLE, WORD, HCURSOR);
-BOOL       DrawIcon(HDC,INT,INT,HICON);
-void       DrawMenuBar(HWND);
-DWORD      DumpIcon(SEGPTR,WORD*,SEGPTR*,SEGPTR*);
-BOOL       Ellipse(HDC,INT,INT,INT,INT);
-BOOL       EmptyClipboard(void);
-BOOL       EnableHardwareInput(BOOL);
-BOOL       EnableMenuItem(HMENU,UINT,UINT);
-BOOL       EnableScrollBar(HWND,UINT,UINT);
-BOOL       EnableWindow(HWND,BOOL);
-BOOL       EndDeferWindowPos(HDWP16);
-BOOL       EnumChildWindows(HWND,WNDENUMPROC,LPARAM);
-UINT       EnumClipboardFormats(UINT);
-INT        EnumFontFamilies(HDC,LPCSTR,FONTENUMPROC,LPARAM);
-INT        EnumFonts(HDC,LPCSTR,FONTENUMPROC,LPARAM);
-BOOL       EnumMetaFile(HDC,HMETAFILE,MFENUMPROC,LPARAM);
-INT        EnumObjects(HDC,INT,GOBJENUMPROC,LPARAM);
-INT        EnumProps(HWND,PROPENUMPROC);
-BOOL       EnumTaskWindows(HTASK,WNDENUMPROC,LPARAM);
-BOOL       EnumWindows(WNDENUMPROC,LPARAM);
-BOOL       EqualRgn(HRGN32,HRGN32);
-INT        Escape(HDC,INT,INT,LPCSTR,LPVOID);
-LONG       EscapeCommFunction(int,int);
-int        ExcludeClipRect(HDC,short,short,short,short);
-int        ExcludeVisRect(HDC,short,short,short,short);
-BOOL       ExitWindows(DWORD,WORD);
-BOOL       ExtFloodFill(HDC,INT,INT,COLORREF,WORD);
-HICON      ExtractIcon(HINSTANCE,LPCSTR,WORD);
-WORD       FarGetOwner(HANDLE);
-void       FarSetOwner(HANDLE,HANDLE);
-void       FatalAppExit(UINT,LPCSTR);
-void       FatalExit(int);
-BOOL       FillRgn(HDC,HRGN,HBRUSH);
-ATOM       FindAtom(SEGPTR);
-HINSTANCE  FindExecutable(LPCSTR,LPCSTR,LPSTR);
-HRSRC      FindResource(HINSTANCE,SEGPTR,SEGPTR);
-BOOL       FlashWindow(HWND,BOOL);
-BOOL       FloodFill(HDC,INT,INT,COLORREF);
-int        FlushComm(int,int);
-BOOL       FrameRgn(HDC,HRGN,HBRUSH,int,int);
-void       FreeLibrary(HANDLE);
-BOOL       FreeModule(HANDLE);
-void       FreeProcInstance(FARPROC);
-BOOL       FreeResource(HGLOBAL);
-WORD       FreeSelector(WORD);
-UINT       GDIRealizePalette(HDC);
-HPALETTE16 GDISelectPalette(HDC,HPALETTE16);
-HWND       GetActiveWindow(void);
-DWORD      GetAspectRatioFilter(HDC);
-int        GetAsyncKeyState(int);
-HANDLE     GetAtomHandle(ATOM);
-WORD       GetAtomName(ATOM,LPSTR,short);
-LONG       GetBitmapBits(HBITMAP,LONG,LPSTR);
-COLORREF   GetBkColor(HDC);
-WORD       GetBkMode(HDC);
-DWORD      GetBrushOrg(HDC);
-HWND       GetCapture(void);
-WORD       GetCaretBlinkTime(void);
-BOOL       GetCharABCWidths(HDC,UINT,UINT,LPABC);
-BOOL       GetCharWidth(HDC,WORD,WORD,LPINT16);
-HRGN       GetClipRgn(HDC);
-HANDLE     GetClipboardData(WORD);
-int        GetClipboardFormatName(WORD,LPSTR,short);
-HWND       GetClipboardOwner(void);
-HWND       GetClipboardViewer(void);
-HANDLE     GetCodeHandle(FARPROC);
-void       GetCodeInfo(FARPROC,LPVOID);
-int        GetCommError(int,COMSTAT*);
-UINT       GetCommEventMask(int,int);
-int        GetCommState(int,DCB*);
-HBRUSH     GetControlBrush(HWND,HDC,WORD);
-UINT32     GetCurrentDirectory(UINT32,LPSTR);
-HANDLE     GetCurrentPDB(void);
-DWORD      GetCurrentPosition(HDC);
-HANDLE     GetCurrentTask(void);
-DWORD      GetCurrentTime(void);
-HCURSOR    GetCursor(void);
-HDC        GetDC(HWND);
-HDC        GetDCEx(HWND,HRGN,DWORD);
-DWORD      GetDCHook(HDC,FARPROC16*);
-DWORD      GetDCOrg(HDC);
-HDC        GetDCState(HDC);
-int        GetDIBits(HDC,HANDLE,WORD,WORD,LPSTR,LPBITMAPINFO,WORD);
-SEGPTR     GetDOSEnvironment(void);
-HWND       GetDesktopHwnd(void);
-HWND       GetDesktopWindow(void);
-int        GetDeviceCaps(HDC,WORD);
-DWORD      GetDialogBaseUnits(void);
-int        GetDlgCtrlID(HWND);
-HWND       GetDlgItem(HWND,WORD);
-WORD       GetDlgItemInt(HWND,WORD,BOOL*,BOOL);
-WORD       GetDoubleClickTime(void);
-WORD       GetDriveType(INT);
-int        GetEnvironment(LPSTR,LPSTR,WORD);
-HMODULE    GetExePtr(HANDLE);
-HWND       GetFocus(void);
-DWORD      GetFreeSpace(UINT16);
-DWORD      GetHeapSpaces(HMODULE);
-BOOL       GetInputState(void);
-int        GetInstanceData(HANDLE,WORD,int);
-int        GetKBCodePage(void);
-int        GetKerningPairs(HDC,int,LPKERNINGPAIR);
-int        GetKeyNameText(LONG,LPSTR,int);
-INT        GetKeyState(INT);
-void       GetKeyboardState(BYTE*);
-int        GetKeyboardType(int);
-HWND       GetLastActivePopup(HWND);
-VOID       GetLocalTime(LPSYSTEMTIME); /* Win32 */
-WORD       GetMapMode(HDC);
-HMENU      GetMenu(HWND);
-DWORD      GetMenuCheckMarkDimensions(void);
-INT        GetMenuItemCount(HMENU);
-UINT       GetMenuItemID(HMENU,int);
-UINT       GetMenuState(HMENU,UINT,UINT);
-int        GetMenuString(HMENU,UINT,LPSTR,short,UINT);
-BOOL       GetMessage(SEGPTR,HWND,UINT,UINT);
-LONG       GetMessageExtraInfo(void);
-DWORD      GetMessagePos(void);
-LONG       GetMessageTime(void);
-HANDLE     GetMetaFile(LPSTR);
-HANDLE     GetMetaFileBits(HANDLE);
-int        GetModuleFileName(HANDLE,LPSTR,short);
-HANDLE     GetModuleHandle(LPCSTR);
-int        GetModuleUsage(HANDLE);
-FARPROC    GetMouseEventProc(void);
-DWORD      GetNearestColor(HDC,DWORD);
-WORD       GetNearestPaletteIndex(HPALETTE16,DWORD);
-HWND       GetNextDlgGroupItem(HWND,HWND,BOOL);
-HWND       GetNextDlgTabItem(HWND,HWND,BOOL);
-HWND       GetNextWindow(HWND,WORD);
-WORD       GetNumTasks(void);
-int        GetObject(HANDLE,int,LPSTR);
-HWND       GetOpenClipboardWindow(void);
-WORD       GetPaletteEntries(HPALETTE16,WORD,WORD,LPPALETTEENTRY);
-HWND       GetParent(HWND);
-DWORD      GetPixel(HDC,short,short);
-WORD       GetPolyFillMode(HDC);
-int        GetPriorityClipboardFormat(WORD*,short);
-UINT       GetPrivateProfileInt(LPCSTR,LPCSTR,INT,LPCSTR);
-INT        GetPrivateProfileString(LPCSTR,LPCSTR,LPCSTR,LPSTR,INT,LPCSTR);
-FARPROC    GetProcAddress(HANDLE,SEGPTR);
-UINT       GetProfileInt(LPCSTR,LPCSTR,INT);
-INT        GetProfileString(LPCSTR,LPCSTR,LPCSTR,LPSTR,INT);
-HANDLE     GetProp(HWND,SEGPTR);
-DWORD      GetQueueStatus(UINT);
-BOOL       GetRasterizerCaps(LPRASTERIZER_STATUS,UINT);
-WORD       GetROP2(HDC);
-WORD       GetRelAbs(HDC);
-int        GetScrollPos(HWND,int);
-void       GetScrollRange(HWND,int,LPINT16,LPINT16);
-DWORD      GetSelectorBase(WORD);
-DWORD      GetSelectorLimit(WORD);
-HANDLE     GetStockObject(int);
-WORD       GetStretchBltMode(HDC);
-HMENU      GetSubMenu(HMENU,short);
-COLORREF   GetSysColor(short);
-HWND       GetSysModalWindow(void);
-UINT       GetSystemDirectory(LPSTR,UINT);
-HMENU      GetSystemMenu(HWND,BOOL);
-int        GetSystemMetrics(WORD);
-WORD       GetSystemPaletteEntries(HDC,WORD,WORD,LPPALETTEENTRY);
-WORD       GetSystemPaletteUse(HDC);
-BOOL       GetSystemPowerStatus(LPSYSTEM_POWER_STATUS);
-VOID       GetSystemTime(LPSYSTEMTIME); /* Win32 */
-DWORD      GetTabbedTextExtent(HDC,LPSTR,int,int,LPINT16);
-HINSTANCE  GetTaskDS(void);
-HQUEUE     GetTaskQueue(HTASK);
-BYTE       GetTempDrive(BYTE);
-INT        GetTempFileName(BYTE,LPCSTR,UINT,LPSTR);
-WORD       GetTextAlign(HDC);
-short      GetTextCharacterExtra(HDC);
-COLORREF   GetTextColor(HDC);
-DWORD      GetTextExtent(HDC,LPCSTR,short);
-INT        GetTextFace(HDC,INT,LPSTR);
-BOOL       GetTextMetrics(HDC,LPTEXTMETRIC);
-LPINT16    GetThresholdEvent(void);
-int        GetThresholdStatus(void);
-DWORD      GetTickCount(void);
-HWND       GetTopWindow(HWND);
-LONG       GetVersion(void);
-DWORD      GetViewportExt(HDC);
-DWORD      GetViewportOrg(HDC);
-BOOL       GetWinDebugInfo(LPWINDEBUGINFO,UINT);
-LONG       GetWinFlags(void);
-HWND       GetWindow(HWND,WORD);
-HDC        GetWindowDC(HWND);
-DWORD      GetWindowExt(HDC);
-DWORD      GetWindowOrg(HDC);
-HANDLE     GetWindowTask(HWND);
-int        GetWindowTextLength(HWND);
-UINT       GetWindowsDirectory(LPSTR,UINT);
-DWORD      GlobalDOSAlloc(DWORD);
-WORD       GlobalDOSFree(WORD);
-ATOM       GlobalDeleteAtom(ATOM);
-void       GlobalFix(HGLOBAL16);
-void       GlobalFreeAll(HGLOBAL16);
-HGLOBAL16  GlobalLRUNewest(HGLOBAL16);
-HGLOBAL16  GlobalLRUOldest(HGLOBAL16);
-void       GlobalNotify(FARPROC);
-WORD       GlobalPageLock(HGLOBAL16);
-WORD       GlobalPageUnlock(HGLOBAL16);
-BOOL       GlobalUnWire(HGLOBAL16);
-void       GlobalUnfix(HGLOBAL16);
-SEGPTR     GlobalWire(HGLOBAL16);
-BOOL       GrayString(HDC,HBRUSH,FARPROC,LPARAM,INT,INT,INT,INT,INT);
-void       HideCaret(HWND);
-BOOL       HiliteMenuItem(HWND,HMENU,UINT,UINT);
-BOOL       InSendMessage(void);
-WORD       InitAtomTable(WORD);
-HRGN       InquireVisRgn(HDC);
-int        IntersectClipRect(HDC,short,short,short,short);
-int        IntersectVisRect(HDC,short,short,short,short);
-void       InvalidateRgn(HWND32,HRGN32,BOOL32);
-BOOL       InvertRgn(HDC,HRGN);
-BOOL       IsBadCodePtr(SEGPTR);
-BOOL       IsBadHugeReadPtr(SEGPTR,DWORD);
-BOOL       IsBadHugeWritePtr(SEGPTR,DWORD);
-BOOL       IsBadReadPtr(SEGPTR,WORD);
-BOOL       IsBadStringPtr(SEGPTR,WORD);
-BOOL       IsBadWritePtr(SEGPTR,WORD);
-BOOL       IsCharAlpha(char);
-BOOL       IsCharAlphaNumeric(char);
-BOOL       IsCharLower(char);
-BOOL       IsCharUpper(char);
-BOOL       IsChild(HWND,HWND);
-BOOL       IsClipboardFormatAvailable(WORD);
-BOOL       IsDialogMessage(HWND,LPMSG);
-WORD       IsDlgButtonChecked(HWND,WORD);
-BOOL       IsGDIObject(HANDLE);
-BOOL       IsIconic(HWND);
-BOOL       IsMenu(HMENU);
-BOOL       IsTask(HTASK);
-HTASK      IsTaskLocked(void);
-BOOL       IsWindow(HWND);
-BOOL       IsWindowEnabled(HWND);
-BOOL       IsWindowUnicode(HWND);
-BOOL       IsWindowVisible(HWND);
-BOOL       IsZoomed(HWND);
-BOOL       KillSystemTimer(HWND,WORD);
-BOOL       KillTimer(HWND,WORD);
-void       LimitEmsPages(DWORD);
-void       LineDDA(short,short,short,short,FARPROC,long);
-BOOL       LineTo(HDC,short,short);
-HANDLE     LoadAccelerators(HANDLE,SEGPTR);
-HBITMAP    LoadBitmap(HANDLE,SEGPTR);
-HCURSOR    LoadCursor(HANDLE,SEGPTR);
-HICON      LoadIcon(HANDLE,SEGPTR);
-HANDLE     LoadLibrary(LPCSTR);
-HMENU      LoadMenu(HANDLE,SEGPTR);
-HANDLE     LoadModule(LPCSTR,LPVOID);
-HGLOBAL    LoadResource(HINSTANCE,HRSRC);
-int        LoadString(HANDLE,WORD,LPSTR,int);
-BOOL       LocalInit(HANDLE,WORD,WORD);
-FARPROC    LocalNotify(FARPROC);
-LPVOID     LockResource(HGLOBAL);
-HGLOBAL    LockSegment(HGLOBAL);
-HMENU      LookupMenuHandle(HMENU,INT);
-FARPROC    MakeProcInstance(FARPROC,HANDLE);
-WORD       MapVirtualKey(WORD,WORD);
-void       MessageBeep(WORD);
-int        MessageBox(HWND,LPCSTR,LPCSTR,WORD);
-DWORD      MoveTo(HDC,short,short);
-BOOL       MoveWindow(HWND,short,short,short,short,BOOL);
-DWORD      OemKeyScan(WORD);
-BOOL       OemToAnsi(LPSTR,LPSTR);
-void       OemToAnsiBuff(LPSTR,LPSTR,INT);
-int        OffsetClipRgn(HDC,short,short);
-BOOL       OpenClipboard(HWND);
-int        OpenComm(LPCSTR,UINT,UINT);
-HFILE      OpenFile(LPCSTR,OFSTRUCT*,UINT);
-BOOL       OpenIcon(HWND);
-int        OpenSound(void);
-void       OutputDebugString(LPCSTR);
-BOOL       PaintRgn(HDC,HRGN);
-BOOL       PatBlt(HDC,short,short,short,short,DWORD);
-BOOL       PeekMessage(LPMSG,HWND,WORD,WORD,WORD);
-BOOL       Pie(HDC,INT,INT,INT,INT,INT,INT,INT,INT);
-BOOL       PlayMetaFile(HDC,HANDLE);
-void       PlayMetaFileRecord(HDC,LPHANDLETABLE,LPMETARECORD,WORD);
-BOOL       PostAppMessage(HANDLE,WORD,WORD,LONG);
-void       PostEvent(HTASK);
-BOOL       PostMessage(HWND,WORD,WORD,LONG);
-void       PostQuitMessage(INT);
-WORD       PrestoChangoSelector(WORD,WORD);
-void       ProfClear(void);
-void       ProfFinish(void);
-void       ProfFlush(void);
-int        ProfInsChk(void);
-void       ProfSampRate(int,int);
-void       ProfSetup(int,int);
-void       ProfStart(void);
-void       ProfStop(void);
-BOOL       PtInRegion(HRGN32,INT32,INT32);
-BOOL       PtVisible(HDC,short,short);
-int        ReadComm(int,LPSTR,int);
-WORD       RealizeDefaultPalette(HDC);
-UINT       RealizePalette(HDC);
-BOOL       Rectangle(HDC,INT,INT,INT,INT);
-WORD       RegisterClipboardFormat(LPCSTR);
-void       ReleaseCapture(void);
-int        ReleaseDC(HWND,HDC);
-BOOL       RemoveFontResource(LPSTR);
-BOOL       RemoveMenu(HMENU,UINT,UINT);
-HANDLE     RemoveProp(HWND,SEGPTR);
-void       ReplyMessage(LRESULT);
-HDC        ResetDC(HDC,LPVOID);
-BOOL       ResizePalette(HPALETTE16,UINT);
-BOOL       RestoreDC(HDC,short);
-int        RestoreVisRgn(HDC);
-BOOL       RoundRect(HDC,INT,INT,INT,INT,INT,INT);
-int        SaveDC(HDC);
-HRGN       SaveVisRgn(HDC);
-void       ScrollChildren(HWND,UINT,WPARAM,LPARAM);
-BOOL       ScrollDC(HDC,short,short,LPRECT16,LPRECT16,HRGN,LPRECT16);
-void       ScrollWindow(HWND,short,short,LPRECT16,LPRECT16);
-int        ScrollWindowEx(HWND,short,short,LPRECT16,LPRECT16,HRGN,LPRECT16,WORD);
-int        SelectClipRgn(HDC,HRGN);
-HANDLE     SelectObject(HDC,HANDLE);
-HPALETTE16 SelectPalette(HDC,HPALETTE16,BOOL);
-int        SelectVisRgn(HDC,HRGN);
-WORD       SelectorAccessRights(WORD,WORD,WORD);
-HWND       SetActiveWindow(HWND);
-LONG       SetBitmapBits(HBITMAP,LONG,LPSTR);
-DWORD      SetBkColor(HDC,COLORREF);
-WORD       SetBkMode(HDC,WORD);
-DWORD      SetBrushOrg(HDC,short,short);
-HWND       SetCapture(HWND);
-void       SetCaretBlinkTime(WORD);
-void       SetCaretPos(short,short);
-HANDLE     SetClipboardData(WORD,HANDLE);
-HWND       SetClipboardViewer(HWND);
-int        SetCommBreak(int);
-UINT*      SetCommEventMask(int,UINT);
-int        SetCommState(DCB*);
-void       SetConvertHook(BOOL);
-BOOL       SetConvertParams(int,int);
-BOOL32     SetCurrentDirectory(LPCSTR);
-HCURSOR    SetCursor(HCURSOR);
-void       SetCursorPos(short,short);
-BOOL       SetDCHook(HDC,FARPROC16,DWORD);
-void       SetDCState(HDC,HDC);
-int        SetDIBits(HDC,HANDLE,WORD,WORD,LPSTR,LPBITMAPINFO,WORD);
-int        SetDIBitsToDevice(HDC,short,short,WORD,WORD,WORD,WORD,WORD,WORD,LPSTR,LPBITMAPINFO,WORD);
-BOOL       SetDeskPattern(void);
-BOOL       SetDeskWallPaper(LPCSTR);
-void       SetDoubleClickTime(WORD);
-int        SetEnvironment(LPSTR,LPSTR,WORD);
-UINT       SetErrorMode(UINT);
-HWND       SetFocus(HWND);
-WORD       SetHandleCount(WORD);
-WORD       SetHookFlags(HDC,WORD);
-void       SetKeyboardState(BYTE*);
-WORD       SetMapMode(HDC,WORD);
-DWORD      SetMapperFlags(HDC,DWORD);
-BOOL       SetMenu(HWND,HMENU);
-BOOL       SetMenuItemBitmaps(HMENU,UINT,UINT,HBITMAP,HBITMAP);
-BOOL       SetMessageQueue(int);
-HANDLE     SetMetaFileBits(HANDLE);
-WORD       SetPaletteEntries(HPALETTE16,WORD,WORD,LPPALETTEENTRY);
-HWND       SetParent(HWND,HWND);
-COLORREF   SetPixel(HDC,short,short,COLORREF);
-WORD       SetPolyFillMode(HDC,WORD);
-BOOL       SetProp(HWND,SEGPTR,HANDLE);
-WORD       SetROP2(HDC,WORD);
-void       SetRectRgn(HRGN32,INT32,INT32,INT32,INT32);
-WORD       SetRelAbs(HDC,WORD);
-FARPROC    SetResourceHandler(HANDLE,LPSTR,FARPROC);
-int        SetScrollPos(HWND,int,int,BOOL);
-void       SetScrollRange(HWND,int,int,int,BOOL);
-WORD       SetSelectorBase(WORD,DWORD);
-WORD       SetSelectorLimit(WORD,DWORD);
-int        SetSoundNoise(int,int);
-WORD       SetStretchBltMode(HDC,WORD);
-LONG       SetSwapAreaSize(WORD);
-void       SetSysColors(int,LPINT16,COLORREF*);
-HWND       SetSysModalWindow(HWND);
-WORD       SetSystemPaletteUse(HDC,WORD);
-BOOL       SetSystemPowerState(BOOL, BOOL);
-BOOL       SetSystemTime(const SYSTEMTIME*);
-WORD       SetSystemTimer(HWND,WORD,WORD,FARPROC);
-HQUEUE     SetTaskQueue(HTASK,HQUEUE);
-WORD       SetTextAlign(HDC,WORD);
-short      SetTextCharacterExtra(HDC,short);
-DWORD      SetTextColor(HDC,DWORD);
-short      SetTextJustification(HDC,short,short);
-WORD       SetTimer(HWND,WORD,WORD,FARPROC);
-int        SetVoiceAccent(int,int,int,int,int);
-int        SetVoiceEnvelope(int,int,int);
-int        SetVoiceNote(int,int,int,int);
-int        SetVoiceQueueSize(int,int);
-int        SetVoiceSound(int,LONG,int);
-int        SetVoiceThreshold(int,int);
-BOOL       SetWinDebugInfo(LPWINDEBUGINFO);
-BOOL       SetWindowPos(HWND,HWND,INT,INT,INT,INT,WORD);
-FARPROC    SetWindowsHook(short,FARPROC);
-HHOOK      SetWindowsHookEx(short,HOOKPROC,HINSTANCE,HTASK);
-HINSTANCE  ShellExecute(HWND,LPCSTR,LPCSTR,LPSTR,LPCSTR,INT);
-void       ShowCaret(HWND);
-int        ShowCursor(BOOL);
-void       ShowOwnedPopups(HWND,BOOL);
-void       ShowScrollBar(HWND,WORD,BOOL);
-BOOL       ShowWindow(HWND,int);
-DWORD      SizeofResource(HINSTANCE,HRSRC);
-VOID       Sleep(DWORD); /* Win32 */
-int        StartSound(void);
-int        StopSound(void);
-BOOL       StretchBlt(HDC,short,short,short,short,HDC,short,short,short,short,DWORD);
-int        StretchDIBits(HDC,WORD,WORD,WORD,WORD,WORD,WORD,WORD,WORD,LPSTR,LPBITMAPINFO,WORD,DWORD);
-BOOL       SwapMouseButton(BOOL);
-void       SwapRecording(WORD);
-void       SwitchStackBack(void);
-void       SwitchStackTo(WORD,WORD,WORD);
-int        SyncAllVoices(void);
-BOOL       SystemParametersInfo(UINT,UINT,LPVOID,UINT);
-LONG       TabbedTextOut(HDC,short,short,LPSTR,short,short,LPINT16,short);
-int        Throw(LPCATCHBUF,int);
-int        ToAscii(WORD,WORD,LPSTR,LPVOID,WORD);
-int        TranslateAccelerator(HWND,HANDLE,LPMSG);
-BOOL       TranslateMDISysAccel(HWND,LPMSG);
-BOOL       TranslateMessage(LPMSG);
-int        TransmitCommChar(int,char);
-int        UngetCommChar(int,char);
-BOOL       UnhookWindowsHook(short,FARPROC);
-BOOL       UnhookWindowsHookEx(HHOOK);
-void       UnlockSegment(HGLOBAL);
-BOOL       UnrealizeObject(HBRUSH);
-int        UpdateColors(HDC);
-void       UpdateWindow(HWND32);
-void       UserYield(void);
-void       ValidateCodeSegments(void);
-LPSTR      ValidateFreeSpaces(void);
-void       ValidateRgn(HWND32,HRGN32);
-WORD       VkKeyScan(WORD);
-SEGPTR     WIN16_GlobalLock16(HGLOBAL16);
-SEGPTR     WIN16_LockResource(HANDLE);
-SEGPTR     WIN16_lstrcpyn(SEGPTR,SEGPTR,WORD);
-BOOL       WaitEvent(HTASK);
-void       WaitMessage(void);
-int        WaitSoundState(int);
-HANDLE     WinExec(LPSTR,WORD);
-BOOL       WinHelp(HWND,LPSTR,WORD,DWORD);
-int        WriteComm(int,LPSTR,int);
-void       WriteOutProfiles(void);
-BOOL       WritePrivateProfileString(LPCSTR,LPCSTR,LPCSTR,LPCSTR);
-BOOL       WriteProfileString(LPCSTR,LPCSTR,LPCSTR);
-void       Yield(void);
-LONG       _hread(HFILE,SEGPTR,LONG);
-LONG       _hwrite(HFILE,LPCSTR,LONG);
-HFILE      _lclose(HFILE);
-HFILE      _lcreat(LPCSTR,INT);
-LONG       _llseek(HFILE,LONG,INT);
-HFILE      _lopen(LPCSTR,INT);
-INT        _lread(HFILE,SEGPTR,WORD);
-INT        _lwrite(HFILE,LPCSTR,WORD);
-void       hmemcpy(LPVOID,LPCVOID,LONG);
-SEGPTR     lstrcat(SEGPTR,SEGPTR);
-INT        lstrcmp(LPCSTR,LPCSTR);
-INT        lstrcmpi(LPCSTR,LPCSTR);
-INT        lstrncmpi(LPCSTR,LPCSTR,int);
-SEGPTR     lstrcpy(SEGPTR,SEGPTR);
-LPSTR      lstrcpyn(LPSTR,LPCSTR,int);
-INT        lstrlen(LPCSTR);
-int        wsprintf(LPSTR,LPSTR,...);
-int        wvsprintf(LPSTR,LPCSTR,LPCSTR);
-
-/* Declarations for functions that are the same in Win16 and Win32 */
-
-BOOL16     EndDialog(HWND32,INT32);
-INT16      ExcludeUpdateRgn(HDC32,HWND32);
-void       FillWindow(HWND16,HWND16,HDC16,HBRUSH16);
+VOID       FillWindow(HWND16,HWND16,HDC16,HBRUSH16);
 DWORD      GetBitmapDimension(HBITMAP16);
-WORD       GetClassWord(HWND32,INT32);
-DWORD      GetLogicalDrives(void);
-INT16      GetUpdateRgn(HWND32,HRGN32,BOOL32);
-WORD       GetWindowWord(HWND32,INT32);
-INT16      OffsetRgn(HRGN32,INT32,INT32);
 DWORD      OffsetViewportOrg(HDC16,INT16,INT16);
 DWORD      OffsetWindowOrg(HDC16,INT16,INT16);
-void       PaintRect(HWND16,HWND16,HDC16,HBRUSH16,const RECT16*);
-DWORD      RegCloseKey(HKEY);
-DWORD      RegFlushKey(HKEY);
+VOID       PaintRect(HWND16,HWND16,HDC16,HBRUSH16,const RECT16*);
 DWORD      ScaleViewportExt(HDC16,INT16,INT16,INT16,INT16);
 DWORD      ScaleWindowExt(HDC16,INT16,INT16,INT16,INT16);
 DWORD      SetBitmapDimension(HBITMAP16,INT16,INT16);
-WORD       SetClassWord(HWND32,INT32,WORD);
 DWORD      SetViewportExt(HDC16,INT16,INT16);
 DWORD      SetViewportOrg(HDC16,INT16,INT16);
 DWORD      SetWindowExt(HDC16,INT16,INT16);
 DWORD      SetWindowOrg(HDC16,INT16,INT16);
+VOID       hmemcpy(LPVOID,LPCVOID,LONG);
+
+/* Declarations for functions that exist only in Win32 */
+
+DWORD      GetLogicalDrives(void);
+
+/* Declarations for functions that are the same in Win16 and Win32 */
+
+HBITMAP16  CreateBitmap(INT32,INT32,UINT32,UINT32,LPCVOID);
+HBITMAP16  CreateCompatibleBitmap(HDC32,INT32,INT32);
+HBITMAP16  CreateDiscardableBitmap(HDC32,INT32,INT32);
+BOOL16     EndDialog(HWND32,INT32);
+INT16      ExcludeUpdateRgn(HDC32,HWND32);
+LONG       GetBitmapBits(HBITMAP32,LONG,LPVOID);
+WORD       GetClassWord(HWND32,INT32);
+INT16      GetUpdateRgn(HWND32,HRGN32,BOOL32);
+WORD       GetWindowWord(HWND32,INT32);
+INT16      OffsetRgn(HRGN32,INT32,INT32);
+DWORD      RegCloseKey(HKEY);
+DWORD      RegFlushKey(HKEY);
+LONG       SetBitmapBits(HBITMAP32,LONG,LPCVOID);
+WORD       SetClassWord(HWND32,INT32,WORD);
 WORD       SetWindowWord(HWND32,INT32,WORD);
 
 /* Declarations for functions that change between Win16 and Win32 */
@@ -3439,25 +3215,28 @@
 BOOL16     CopyRect16(RECT16*,const RECT16*);
 BOOL32     CopyRect32(RECT32*,const RECT32*);
 #define    CopyRect WINELIB_NAME(CopyRect)
-HWND16     CreateDialog16(HINSTANCE16,SEGPTR,HWND16,DLGPROC);
+HBITMAP16  CreateBitmapIndirect16(const BITMAP16*);
+HBITMAP32  CreateBitmapIndirect32(const BITMAP32*);
+#define    CreateBitmapIndirect WINELIB_NAME(CreateBitmapIndirect)
+HWND16     CreateDialog16(HINSTANCE16,SEGPTR,HWND16,DLGPROC16);
 #define    CreateDialog32A(inst,ptr,hwnd,dlg) \
            CreateDialogParam32A(inst,ptr,hwnd,dlg,0)
 #define    CreateDialog32W(inst,ptr,hwnd,dlg) \
            CreateDialogParam32W(inst,ptr,hwnd,dlg,0)
 #define    CreateDialog WINELIB_NAME_AW(CreateDialog)
-HWND16     CreateDialogIndirect16(HINSTANCE16,LPCVOID,HWND16,DLGPROC);
+HWND16     CreateDialogIndirect16(HINSTANCE16,LPCVOID,HWND16,DLGPROC16);
 #define    CreateDialogIndirect32A(inst,ptr,hwnd,dlg) \
            CreateDialogIndirectParam32A(inst,ptr,hwnd,dlg,0)
 #define    CreateDialogIndirect32W(inst,ptr,hwnd,dlg) \
            CreateDialogIndirectParam32W(inst,ptr,hwnd,dlg,0)
 #define    CreateDialogIndirect WINELIB_NAME_AW(CreateDialogIndirect)
-HWND16     CreateDialogIndirectParam16(HINSTANCE16,LPCVOID,HWND16,DLGPROC,LPARAM);
-HWND32     CreateDialogIndirectParam32A(HINSTANCE32,LPCVOID,HWND32,DLGPROC,LPARAM);
-HWND32     CreateDialogIndirectParam32W(HINSTANCE32,LPCVOID,HWND32,DLGPROC,LPARAM);
+HWND16     CreateDialogIndirectParam16(HINSTANCE16,LPCVOID,HWND16,DLGPROC16,LPARAM);
+HWND32     CreateDialogIndirectParam32A(HINSTANCE32,LPCVOID,HWND32,DLGPROC32,LPARAM);
+HWND32     CreateDialogIndirectParam32W(HINSTANCE32,LPCVOID,HWND32,DLGPROC32,LPARAM);
 #define    CreateDialogIndirectParam WINELIB_NAME_AW(CreateDialogIndirectParam)
-HWND16     CreateDialogParam16(HINSTANCE16,SEGPTR,HWND16,DLGPROC,LPARAM);
-HWND32     CreateDialogParam32A(HINSTANCE32,LPCSTR,HWND32,DLGPROC,LPARAM);
-HWND32     CreateDialogParam32W(HINSTANCE32,LPCWSTR,HWND32,DLGPROC,LPARAM);
+HWND16     CreateDialogParam16(HINSTANCE16,SEGPTR,HWND16,DLGPROC16,LPARAM);
+HWND32     CreateDialogParam32A(HINSTANCE32,LPCSTR,HWND32,DLGPROC32,LPARAM);
+HWND32     CreateDialogParam32W(HINSTANCE32,LPCWSTR,HWND32,DLGPROC32,LPARAM);
 #define    CreateDialogParam WINELIB_NAME_AW(CreateDialogParam)
 HRGN16     CreateEllipticRgnIndirect16(const RECT16 *);
 HRGN32     CreateEllipticRgnIndirect32(const RECT32 *);
@@ -3501,25 +3280,25 @@
 LRESULT    DefWindowProc32A(HWND32,UINT32,WPARAM32,LPARAM);
 LRESULT    DefWindowProc32W(HWND32,UINT32,WPARAM32,LPARAM);
 #define    DefWindowProc WINELIB_NAME_AW(DefWindowProc)
-INT16      DialogBox16(HINSTANCE16,SEGPTR,HWND16,DLGPROC);
+INT16      DialogBox16(HINSTANCE16,SEGPTR,HWND16,DLGPROC16);
 #define    DialogBox32A(inst,template,owner,func) \
            DialogBoxParam32A(inst,template,owner,func,0)
 #define    DialogBox32W(inst,template,owner,func) \
            DialogBoxParam32W(inst,template,owner,func,0)
 #define    DialogBox WINELIB_NAME_AW(DialogBox)
-INT16      DialogBoxIndirect16(HINSTANCE16,HANDLE16,HWND16,DLGPROC);
+INT16      DialogBoxIndirect16(HINSTANCE16,HANDLE16,HWND16,DLGPROC16);
 #define    DialogBoxIndirect32A(inst,template,owner,func) \
            DialogBoxIndirectParam32A(inst,template,owner,func,0)
 #define    DialogBoxIndirect32W(inst,template,owner,func) \
            DialogBoxIndirectParam32W(inst,template,owner,func,0)
 #define    DialogBoxIndirect WINELIB_NAME_AW(DialogBoxIndirect)
-INT16      DialogBoxIndirectParam16(HINSTANCE16,HANDLE16,HWND16,DLGPROC,LPARAM);
-INT32      DialogBoxIndirectParam32A(HINSTANCE32,LPCVOID,HWND32,DLGPROC,LPARAM);
-INT32      DialogBoxIndirectParam32W(HINSTANCE32,LPCVOID,HWND32,DLGPROC,LPARAM);
+INT16      DialogBoxIndirectParam16(HINSTANCE16,HANDLE16,HWND16,DLGPROC16,LPARAM);
+INT32      DialogBoxIndirectParam32A(HINSTANCE32,LPCVOID,HWND32,DLGPROC32,LPARAM);
+INT32      DialogBoxIndirectParam32W(HINSTANCE32,LPCVOID,HWND32,DLGPROC32,LPARAM);
 #define    DialogBoxIndirectParam WINELIB_NAME_AW(DialogBoxIndirectParam)
-INT16      DialogBoxParam16(HINSTANCE16,SEGPTR,HWND16,DLGPROC,LPARAM);
-INT32      DialogBoxParam32A(HINSTANCE32,LPCSTR,HWND32,DLGPROC,LPARAM);
-INT32      DialogBoxParam32W(HINSTANCE32,LPCWSTR,HWND32,DLGPROC,LPARAM);
+INT16      DialogBoxParam16(HINSTANCE16,SEGPTR,HWND16,DLGPROC16,LPARAM);
+INT32      DialogBoxParam32A(HINSTANCE32,LPCSTR,HWND32,DLGPROC32,LPARAM);
+INT32      DialogBoxParam32W(HINSTANCE32,LPCWSTR,HWND32,DLGPROC32,LPARAM);
 #define    DialogBoxParam WINELIB_NAME_AW(DialogBoxParam)
 INT16      DlgDirListComboBox16(HWND16,LPCSTR,INT16,INT16,UINT16);
 INT32      DlgDirListComboBox32A(HWND32,LPCSTR,INT32,INT32,UINT32);
@@ -3548,13 +3327,13 @@
 INT16      FillRect16(HDC16,const RECT16*,HBRUSH16);
 INT32      FillRect32(HDC32,const RECT32*,HBRUSH32);
 #define    FillRect WINELIB_NAME(FillRect)
-HWND       FindWindow16(SEGPTR,LPCSTR);
-HWND       FindWindow32A(LPCSTR,LPCSTR);
-HWND       FindWindow32W(LPCWSTR,LPCWSTR);
+HWND16     FindWindow16(SEGPTR,LPCSTR);
+HWND32     FindWindow32A(LPCSTR,LPCSTR);
+HWND32     FindWindow32W(LPCWSTR,LPCWSTR);
 #define    FindWindow WINELIB_NAME_AW(FindWindow)
-HWND       FindWindowEx16(HWND,HWND,SEGPTR,LPCSTR);
-HWND       FindWindowEx32A(HWND,HWND,LPCSTR,LPCSTR);
-HWND       FindWindowEx32W(HWND,HWND,LPCWSTR,LPCWSTR);
+HWND16     FindWindowEx16(HWND16,HWND16,SEGPTR,LPCSTR);
+HWND32     FindWindowEx32A(HWND32,HWND32,LPCSTR,LPCSTR);
+HWND32     FindWindowEx32W(HWND32,HWND32,LPCWSTR,LPCWSTR);
 #define    FindWindowEx WINELIB_NAME_AW(FindWindowEx)
 INT16      FrameRect16(HDC16,const RECT16*,HBRUSH16);
 INT32      FrameRect32(HDC32,const RECT32*,HBRUSH32);
@@ -3568,21 +3347,21 @@
 void       GetCaretPos16(LPPOINT16);
 void       GetCaretPos32(LPPOINT32);
 #define    GetCaretPos WINELIB_NAME(GetCaretPos)
-BOOL       GetClassInfo16(HINSTANCE16,SEGPTR,WNDCLASS16 *);
-BOOL       GetClassInfo32A(HINSTANCE32,LPCSTR,WNDCLASS32A *);
-BOOL       GetClassInfo32W(HINSTANCE32,LPCWSTR,WNDCLASS32W *);
+BOOL16     GetClassInfo16(HINSTANCE16,SEGPTR,WNDCLASS16 *);
+BOOL32     GetClassInfo32A(HINSTANCE32,LPCSTR,WNDCLASS32A *);
+BOOL32     GetClassInfo32W(HINSTANCE32,LPCWSTR,WNDCLASS32W *);
 #define    GetClassInfo WINELIB_NAME_AW(GetClassInfo)
-BOOL       GetClassInfoEx16(HINSTANCE16,SEGPTR,WNDCLASSEX16 *);
-BOOL       GetClassInfoEx32A(HINSTANCE32,LPCSTR,WNDCLASSEX32A *);
-BOOL       GetClassInfoEx32W(HINSTANCE32,LPCWSTR,WNDCLASSEX32W *);
+BOOL16     GetClassInfoEx16(HINSTANCE16,SEGPTR,WNDCLASSEX16 *);
+BOOL32     GetClassInfoEx32A(HINSTANCE32,LPCSTR,WNDCLASSEX32A *);
+BOOL32     GetClassInfoEx32W(HINSTANCE32,LPCWSTR,WNDCLASSEX32W *);
 #define    GetClassInfoEx WINELIB_NAME_AW(GetClassInfoEx)
-LONG       GetClassLong16(HWND,INT16);
-LONG       GetClassLong32A(HWND,INT32);
-LONG       GetClassLong32W(HWND,INT32);
+LONG       GetClassLong16(HWND16,INT16);
+LONG       GetClassLong32A(HWND32,INT32);
+LONG       GetClassLong32W(HWND32,INT32);
 #define    GetClassLong WINELIB_NAME_AW(GetClassLong)
-INT16      GetClassName16(HWND,LPSTR,INT16);
-INT32      GetClassName32A(HWND,LPSTR,INT32);
-INT32      GetClassName32W(HWND,LPWSTR,INT32);
+INT16      GetClassName16(HWND16,LPSTR,INT16);
+INT32      GetClassName32A(HWND32,LPSTR,INT32);
+INT32      GetClassName32W(HWND32,LPWSTR,INT32);
 #define    GetClassName WINELIB_NAME_AW(GetClassName)
 void       GetClientRect16(HWND16,LPRECT16);
 void       GetClientRect32(HWND32,LPRECT32);
@@ -3609,6 +3388,10 @@
 UINT32     GetLogicalDriveStrings32A(UINT32,LPSTR);
 UINT32     GetLogicalDriveStrings32W(UINT32,LPWSTR);
 #define    GetLogicalDriveStrings WINELIB_NAME(GetLogicalDriveStrings)
+INT16      GetObject16(HANDLE16,INT16,LPVOID);
+INT32      GetObject32A(HANDLE32,INT32,LPVOID);
+INT32      GetObject32W(HANDLE32,INT32,LPVOID);
+#define    GetObject WINELIB_NAME_AW(GetObject)
 INT16      GetRgnBox16(HRGN16,LPRECT16);
 INT32      GetRgnBox32(HRGN32,LPRECT32);
 #define    GetRgnBox WINELIB_NAME(GetRgnBox)
@@ -3765,6 +3548,10 @@
 BOOL16     OffsetWindowOrgEx16(HDC16,INT16,INT16,LPPOINT16);
 BOOL32     OffsetWindowOrgEx32(HDC32,INT32,INT32,LPPOINT32);
 #define    OffsetWindowOrgEx WINELIB_NAME(OffsetWindowOrgEx)
+BOOL16     PeekMessage16(LPMSG16,HWND16,UINT16,UINT16,UINT16);
+BOOL32     PeekMessage32A(LPMSG32,HWND32,UINT32,UINT32,UINT32);
+BOOL32     PeekMessage32W(LPMSG32,HWND32,UINT32,UINT32,UINT32);
+#define    PeekMessage WINELIB_NAME_AW(PeekMessage)
 BOOL16     PolyPolygon16(HDC16,LPPOINT16,LPINT16,UINT16);
 BOOL32     PolyPolygon32(HDC32,LPPOINT32,LPINT32,UINT32);
 #define    PolyPolygon WINELIB_NAME(PolyPolygon)
@@ -3878,9 +3665,9 @@
 BOOL16     SetBitmapDimensionEx16(HBITMAP16,INT16,INT16,LPSIZE16);
 BOOL32     SetBitmapDimensionEx32(HBITMAP32,INT32,INT32,LPSIZE32);
 #define    SetBitmapDimensionEx WINELIB_NAME(SetBitmapDimensionEx)
-LONG       SetClassLong16(HWND,INT16,LONG);
-LONG       SetClassLong32A(HWND,INT32,LONG);
-LONG       SetClassLong32W(HWND,INT32,LONG);
+LONG       SetClassLong16(HWND16,INT16,LONG);
+LONG       SetClassLong32A(HWND32,INT32,LONG);
+LONG       SetClassLong32W(HWND32,INT32,LONG);
 #define    SetClassLong WINELIB_NAME_AW(SetClassLong)
 void       SetDlgItemInt16(HWND16,INT16,UINT16,BOOL16);
 void       SetDlgItemInt32(HWND32,INT32,UINT32,BOOL32);
@@ -3944,6 +3731,669 @@
 HWND16     WindowFromPoint16(POINT16);
 HWND32     WindowFromPoint32(POINT32);
 #define    WindowFromPoint WINELIB_NAME(WindowFromPoint)
+SEGPTR     lstrcat16(SEGPTR,SEGPTR);
+LPSTR      lstrcat32A(LPSTR,LPCSTR);
+LPWSTR     lstrcat32W(LPWSTR,LPCWSTR);
+#define    lstrcat WINELIB_NAME_AW(lstrcat)
+SEGPTR     lstrcatn16(SEGPTR,SEGPTR,INT16);
+LPSTR      lstrcatn32A(LPSTR,LPCSTR,INT32);
+LPWSTR     lstrcatn32W(LPWSTR,LPCWSTR,INT32);
+#define    lstrcatn WINELIB_NAME_AW(lstrcatn)
+INT16      lstrcmp16(LPCSTR,LPCSTR);
+INT32      lstrcmp32A(LPCSTR,LPCSTR);
+INT32      lstrcmp32W(LPCWSTR,LPCWSTR);
+#define    lstrcmp WINELIB_NAME_AW(lstrcmp)
+INT16      lstrcmpi16(LPCSTR,LPCSTR);
+INT32      lstrcmpi32A(LPCSTR,LPCSTR);
+INT32      lstrcmpi32W(LPCWSTR,LPCWSTR);
+#define    lstrcmpi WINELIB_NAME_AW(lstrcmpi)
+SEGPTR     lstrcpy16(SEGPTR,SEGPTR);
+LPSTR      lstrcpy32A(LPSTR,LPCSTR);
+LPWSTR     lstrcpy32W(LPWSTR,LPCWSTR);
+#define    lstrcpy WINELIB_NAME_AW(lstrcpy)
+SEGPTR     lstrcpyn16(SEGPTR,SEGPTR,INT16);
+LPSTR      lstrcpyn32A(LPSTR,LPCSTR,INT32);
+LPWSTR     lstrcpyn32W(LPWSTR,LPCWSTR,INT32);
+#define    lstrcpyn WINELIB_NAME_AW(lstrcpyn)
+INT16      lstrlen16(LPCSTR);
+INT32      lstrlen32A(LPCSTR);
+INT32      lstrlen32W(LPCWSTR);
+#define    lstrlen WINELIB_NAME_AW(lstrlen)
+INT16      lstrncmp16(LPCSTR,LPCSTR,INT16);
+INT32      lstrncmp32A(LPCSTR,LPCSTR,INT32);
+INT32      lstrncmp32W(LPCWSTR,LPCWSTR,INT32);
+#define    lstrncmp WINELIB_NAME_AW(lstrncmp)
+INT16      lstrncmpi16(LPCSTR,LPCSTR,INT16);
+INT32      lstrncmpi32A(LPCSTR,LPCSTR,INT32);
+INT32      lstrncmpi32W(LPCWSTR,LPCWSTR,INT32);
+#define    lstrncmpi WINELIB_NAME_AW(lstrncmpi)
+INT16      wsnprintf16(LPSTR,UINT16,LPCSTR,...);
+INT32      wsnprintf32A(LPSTR,UINT32,LPCSTR,...);
+INT32      wsnprintf32W(LPWSTR,UINT32,LPCWSTR,...);
+#define    wsnprintf WINELIB_NAME_AW(wsnprintf)
+INT16      wsprintf16(LPSTR,LPCSTR,...);
+INT32      wsprintf32A(LPSTR,LPCSTR,...);
+INT32      wsprintf32W(LPWSTR,LPCWSTR,...);
+#define    wsprintf WINELIB_NAME_AW(wsprintf)
+INT16      wvsnprintf16(LPSTR,UINT16,LPCSTR,LPCVOID);
+INT32      wvsnprintf32A(LPSTR,UINT32,LPCSTR,LPCVOID);
+INT32      wvsnprintf32W(LPWSTR,UINT32,LPCWSTR,LPCVOID);
+#define    wvsnprintf WINELIB_NAME_AW(wvsnprintf)
+INT16      wvsprintf16(LPSTR,LPCSTR,LPCVOID);
+INT32      wvsprintf32A(LPSTR,LPCSTR,LPCVOID);
+INT32      wvsprintf32W(LPWSTR,LPCWSTR,LPCVOID);
+#define    wvsprintf WINELIB_NAME_AW(wvsprintf)
+
+/* Library data types defined as a transition aid for the emulator. */
+/* These should _not_ be used in the emulator and will be removed someday. */
+
+#ifndef NO_TRANSITION_TYPES
+
+#ifndef WINELIB
+typedef INT16 INT;
+typedef UINT16 UINT;
+typedef BOOL16 BOOL;
+typedef WPARAM16 WPARAM;
+typedef HANDLE16 HANDLE;
+typedef HANDLE16 HBITMAP;
+typedef HANDLE16 HBRUSH;
+typedef HANDLE16 HCURSOR;
+typedef HANDLE16 HDC;
+typedef HANDLE16 HDRVR;
+typedef HANDLE16 HFONT;
+typedef HANDLE16 HGLOBAL;
+typedef HANDLE16 HICON;
+typedef HANDLE16 HINSTANCE;
+typedef HANDLE16 HMENU;
+typedef HANDLE16 HMETAFILE;
+typedef HANDLE16 HMIDI;
+typedef HANDLE16 HMIDIIN;
+typedef HANDLE16 HMIDIOUT;
+typedef HANDLE16 HMMIO;
+typedef HANDLE16 HMODULE;
+typedef HANDLE16 HQUEUE;
+typedef HANDLE16 HRGN;
+typedef HANDLE16 HRSRC;
+typedef HANDLE16 HTASK;
+typedef HANDLE16 HWAVE;
+typedef HANDLE16 HWAVEIN;
+typedef HANDLE16 HWAVEOUT;
+typedef HANDLE16 HWND;
+typedef FARPROC16 FARPROC;
+#endif  /* WINELIB */
+
+/* Callback function pointers types. */
+
+#ifdef WINELIB
+typedef LONG (*DRIVERPROC)(DWORD, HDRVR, UINT, LPARAM, LPARAM);
+typedef int (*EDITWORDBREAKPROC)(LPSTR lpch, int ichCurrent, int cch,int code);
+/*typedef int (*FONTENUMPROC)(const LOGFONT*,const TEXTMETRIC*,DWORD,LPARAM);*/
+typedef int (*FONTENUMPROC)(const void*,const void*,DWORD,LPARAM);
+typedef int (*GOBJENUMPROC)(LPVOID,LPARAM);
+/*typedef int (*MFENUMPROC)(HDC,HANDLETABLE*,METARECORD*,int,LPARAM);*/
+typedef int (*MFENUMPROC)(HDC,void*,void*,int,LPARAM);
+typedef BOOL (*PROPENUMPROC)(HWND,LPCTSTR,HANDLE);
+typedef LRESULT (*WNDENUMPROC)(HWND,LPARAM);
+#else
+typedef SEGPTR DRIVERPROC;
+typedef SEGPTR EDITWORDBREAKPROC;
+typedef SEGPTR FONTENUMPROC;
+typedef SEGPTR GOBJENUMPROC;
+typedef SEGPTR MFENUMPROC;
+typedef SEGPTR PROPENUMPROC;
+typedef SEGPTR WNDENUMPROC;
+#endif
+typedef FARPROC HOOKPROC;
+
+#endif  /* NO_TRANSITION_TYPES */
+
+
+INT        AccessResource(HINSTANCE,HRSRC);
+ATOM       AddAtom(SEGPTR);
+INT        AddFontResource(LPCSTR);
+WORD       AllocCStoDSAlias(WORD);
+WORD       AllocDStoCSAlias(WORD);
+HGLOBAL    AllocResource(HINSTANCE,HRSRC,DWORD);
+WORD       AllocSelector(WORD);
+WORD       AllocSelectorArray(WORD);
+BOOL       AnimatePalette(HPALETTE16,UINT,UINT,LPPALETTEENTRY);
+LPSTR      AnsiLower(LPSTR);
+UINT       AnsiLowerBuff(LPSTR,UINT);
+SEGPTR     AnsiNext(SEGPTR);
+SEGPTR     AnsiPrev(SEGPTR,SEGPTR);
+INT        AnsiToOem(LPSTR,LPSTR);
+void       AnsiToOemBuff(LPCSTR,LPSTR,UINT);
+LPSTR      AnsiUpper(LPSTR);
+UINT       AnsiUpperBuff(LPSTR,UINT);
+BOOL       AnyPopup(void);
+BOOL       Arc(HDC,INT,INT,INT,INT,INT,INT,INT,INT);
+UINT       ArrangeIconicWindows(HWND);
+HDWP16     BeginDeferWindowPos(INT);
+BOOL       BitBlt(HDC,INT,INT,INT,INT,HDC,INT,INT,DWORD);
+BOOL       BringWindowToTop(HWND);
+BOOL       BuildCommDCB(LPCSTR,DCB*);
+void       CalcChildScroll(HWND,WORD);
+BOOL       CallMsgFilter(SEGPTR,INT);
+LRESULT    CallNextHookEx(HHOOK,INT,WPARAM,LPARAM);
+INT        Catch(LPCATCHBUF);
+BOOL       ChangeClipboardChain(HWND,HWND);
+WORD       ChangeSelector(WORD,WORD);
+BOOL       CheckDlgButton(HWND,INT,UINT);
+INT        CheckMenuItem(HMENU,UINT,UINT);
+BOOL       CheckRadioButton(HWND,UINT,UINT,UINT);
+BOOL       Chord(HDC,INT,INT,INT,INT,INT,INT,INT,INT);
+int        ClearCommBreak(int);
+BOOL       CloseClipboard(void);
+int        CloseComm(int);
+HMETAFILE  CloseMetaFile(HDC);
+void       CloseSound(void);
+BOOL       CloseWindow(HWND);
+INT16      CombineRgn(HRGN32,HRGN32,HRGN32,INT32);
+int        ConvertRequest(HWND,LPKANJISTRUCT);
+#ifdef WINELIB32
+HCURSOR    CopyCursor(HCURSOR); /* Win32 */
+HICON      CopyIcon(HICON); /* Win32 */
+#else
+HCURSOR    CopyCursor(HINSTANCE,HCURSOR); /* Win16 */
+HICON      CopyIcon(HINSTANCE,HICON); /* Win16 */
+#endif
+HMETAFILE  CopyMetaFile(HMETAFILE,LPCSTR);
+INT        CountClipboardFormats(void);
+INT        CountVoiceNotes(INT);
+HBRUSH     CreateBrushIndirect(const LOGBRUSH16*);
+BOOL       CreateCaret(HWND,HBITMAP,INT,INT);
+HDC        CreateCompatibleDC(HDC);
+HCURSOR    CreateCursor(HANDLE,INT,INT,INT,INT,const BYTE*,const BYTE*);
+HANDLE     CreateCursorIconIndirect(HANDLE,CURSORICONINFO*,const BYTE*,const BYTE*);
+HDC        CreateDC(LPCSTR,LPCSTR,LPCSTR,const DEVMODE*);
+HBRUSH     CreateDIBPatternBrush(HGLOBAL,UINT);
+HBITMAP    CreateDIBitmap(HDC,BITMAPINFOHEADER*,DWORD,LPVOID,BITMAPINFO*,UINT);
+HRGN       CreateEllipticRgn(INT32,INT32,INT32,INT32);
+HFONT      CreateFont(INT,INT,INT,INT,INT,BYTE,BYTE,BYTE,BYTE,BYTE,BYTE,BYTE,BYTE,LPCSTR);
+HFONT      CreateFontIndirect(const LOGFONT16*);
+HBRUSH     CreateHatchBrush(INT,COLORREF);
+HDC        CreateIC(LPCSTR,LPCSTR,LPCSTR,const DEVMODE*);
+HICON      CreateIcon(HINSTANCE,INT,INT,BYTE,BYTE,const BYTE*,const BYTE*);
+HMENU      CreateMenu(void);
+HDC        CreateMetaFile(LPCSTR);
+HPALETTE16 CreatePalette(const LOGPALETTE*);
+HBRUSH     CreatePatternBrush(HBITMAP);
+HPEN16     CreatePen(INT,INT,COLORREF);
+HPEN16     CreatePenIndirect(const LOGPEN16*);
+HMENU      CreatePopupMenu(void);
+HRGN       CreateRectRgn(INT32,INT32,INT32,INT32);
+HRGN       CreateRoundRectRgn(INT32,INT32,INT32,INT32,INT32,INT32);
+HBRUSH     CreateSolidBrush(COLORREF);
+void       DebugBreak(void);
+DWORD      DefHookProc(short,WORD,DWORD,HHOOK*);
+HDWP16     DeferWindowPos(HDWP16,HWND,HWND,INT,INT,INT,INT,UINT);
+ATOM       DeleteAtom(ATOM);
+BOOL       DeleteDC(HDC);
+BOOL       DeleteMenu(HMENU,UINT,UINT);
+BOOL       DeleteMetaFile(HMETAFILE);
+BOOL       DeleteObject(HGDIOBJ16);
+BOOL       DestroyCaret(void);
+BOOL       DestroyCursor(HCURSOR);
+BOOL       DestroyIcon(HICON);
+BOOL       DestroyMenu(HMENU);
+BOOL       DestroyWindow(HWND);
+HANDLE     DirectResAlloc(HANDLE,WORD,WORD);
+void       DirectedYield(HTASK);
+LONG       DispatchMessage(const MSG16*);
+INT        DlgDirList(HWND,SEGPTR,INT,INT,UINT);
+BOOL       DlgDirSelect(HWND,LPSTR,INT);
+BOOL       DlgDirSelectComboBox(HWND,LPSTR,INT);
+BOOL16     DragDetect(HWND16,POINT16);
+DWORD      DragObject(HWND, HWND, WORD, HANDLE, WORD, HCURSOR);
+BOOL       DrawIcon(HDC,INT,INT,HICON);
+void       DrawMenuBar(HWND);
+DWORD      DumpIcon(SEGPTR,WORD*,SEGPTR*,SEGPTR*);
+BOOL       Ellipse(HDC,INT,INT,INT,INT);
+BOOL       EmptyClipboard(void);
+BOOL       EnableHardwareInput(BOOL);
+BOOL       EnableMenuItem(HMENU,UINT,UINT);
+BOOL       EnableScrollBar(HWND,UINT,UINT);
+BOOL       EnableWindow(HWND,BOOL);
+BOOL       EndDeferWindowPos(HDWP16);
+BOOL       EnumChildWindows(HWND,WNDENUMPROC,LPARAM);
+UINT       EnumClipboardFormats(UINT);
+INT        EnumFontFamilies(HDC,LPCSTR,FONTENUMPROC,LPARAM);
+INT        EnumFonts(HDC,LPCSTR,FONTENUMPROC,LPARAM);
+BOOL       EnumMetaFile(HDC,HMETAFILE,MFENUMPROC,LPARAM);
+INT        EnumObjects(HDC,INT,GOBJENUMPROC,LPARAM);
+INT        EnumProps(HWND,PROPENUMPROC);
+BOOL       EnumTaskWindows(HTASK,WNDENUMPROC,LPARAM);
+BOOL       EnumWindows(WNDENUMPROC,LPARAM);
+BOOL       EqualRgn(HRGN32,HRGN32);
+INT        Escape(HDC,INT,INT,LPCSTR,LPVOID);
+LONG       EscapeCommFunction(int,int);
+int        ExcludeClipRect(HDC,short,short,short,short);
+int        ExcludeVisRect(HDC,short,short,short,short);
+BOOL       ExitWindows(DWORD,WORD);
+BOOL       ExtFloodFill(HDC,INT,INT,COLORREF,WORD);
+HICON      ExtractIcon(HINSTANCE,LPCSTR,WORD);
+WORD       FarGetOwner(HANDLE);
+void       FarSetOwner(HANDLE,HANDLE);
+void       FatalAppExit(UINT,LPCSTR);
+void       FatalExit(int);
+BOOL       FillRgn(HDC,HRGN,HBRUSH);
+ATOM       FindAtom(SEGPTR);
+HINSTANCE  FindExecutable(LPCSTR,LPCSTR,LPSTR);
+HRSRC      FindResource(HINSTANCE,SEGPTR,SEGPTR);
+BOOL       FlashWindow(HWND,BOOL);
+BOOL       FloodFill(HDC,INT,INT,COLORREF);
+int        FlushComm(int,int);
+BOOL       FrameRgn(HDC,HRGN,HBRUSH,int,int);
+void       FreeLibrary(HANDLE);
+BOOL       FreeModule(HANDLE);
+void       FreeProcInstance(FARPROC);
+BOOL       FreeResource(HGLOBAL);
+WORD       FreeSelector(WORD);
+UINT       GDIRealizePalette(HDC);
+HPALETTE16 GDISelectPalette(HDC,HPALETTE16);
+HWND       GetActiveWindow(void);
+DWORD      GetAspectRatioFilter(HDC);
+int        GetAsyncKeyState(int);
+HANDLE     GetAtomHandle(ATOM);
+WORD       GetAtomName(ATOM,LPSTR,short);
+COLORREF   GetBkColor(HDC);
+WORD       GetBkMode(HDC);
+DWORD      GetBrushOrg(HDC);
+HWND       GetCapture(void);
+WORD       GetCaretBlinkTime(void);
+BOOL       GetCharABCWidths(HDC,UINT,UINT,LPABC16);
+BOOL       GetCharWidth(HDC,WORD,WORD,LPINT16);
+HRGN       GetClipRgn(HDC);
+HANDLE     GetClipboardData(WORD);
+int        GetClipboardFormatName(WORD,LPSTR,short);
+HWND       GetClipboardOwner(void);
+HWND       GetClipboardViewer(void);
+HANDLE     GetCodeHandle(FARPROC);
+void       GetCodeInfo(FARPROC,LPVOID);
+int        GetCommError(int,COMSTAT*);
+UINT       GetCommEventMask(int,int);
+int        GetCommState(int,DCB*);
+HBRUSH     GetControlBrush(HWND,HDC,WORD);
+UINT32     GetCurrentDirectory(UINT32,LPSTR);
+HANDLE     GetCurrentPDB(void);
+DWORD      GetCurrentPosition(HDC);
+HANDLE     GetCurrentTask(void);
+DWORD      GetCurrentTime(void);
+HCURSOR    GetCursor(void);
+HDC        GetDC(HWND);
+HDC        GetDCEx(HWND,HRGN,DWORD);
+DWORD      GetDCHook(HDC,FARPROC16*);
+DWORD      GetDCOrg(HDC);
+HDC        GetDCState(HDC);
+int        GetDIBits(HDC,HANDLE,WORD,WORD,LPSTR,LPBITMAPINFO,WORD);
+SEGPTR     GetDOSEnvironment(void);
+HWND       GetDesktopHwnd(void);
+HWND       GetDesktopWindow(void);
+int        GetDeviceCaps(HDC,WORD);
+DWORD      GetDialogBaseUnits(void);
+int        GetDlgCtrlID(HWND);
+HWND       GetDlgItem(HWND,WORD);
+WORD       GetDlgItemInt(HWND,WORD,BOOL*,BOOL);
+WORD       GetDoubleClickTime(void);
+WORD       GetDriveType(INT);
+int        GetEnvironment(LPSTR,LPSTR,WORD);
+HMODULE    GetExePtr(HANDLE);
+HWND       GetFocus(void);
+DWORD      GetFreeSpace(UINT16);
+DWORD      GetHeapSpaces(HMODULE);
+BOOL       GetInputState(void);
+int        GetInstanceData(HANDLE,WORD,int);
+int        GetKBCodePage(void);
+int        GetKerningPairs(HDC,int,LPKERNINGPAIR16);
+int        GetKeyNameText(LONG,LPSTR,int);
+INT        GetKeyState(INT);
+void       GetKeyboardState(BYTE*);
+int        GetKeyboardType(int);
+HWND       GetLastActivePopup(HWND);
+VOID       GetLocalTime(LPSYSTEMTIME); /* Win32 */
+WORD       GetMapMode(HDC);
+HMENU      GetMenu(HWND);
+DWORD      GetMenuCheckMarkDimensions(void);
+INT        GetMenuItemCount(HMENU);
+UINT       GetMenuItemID(HMENU,int);
+UINT       GetMenuState(HMENU,UINT,UINT);
+int        GetMenuString(HMENU,UINT,LPSTR,short,UINT);
+BOOL       GetMessage(SEGPTR,HWND,UINT,UINT);
+LONG       GetMessageExtraInfo(void);
+DWORD      GetMessagePos(void);
+LONG       GetMessageTime(void);
+HANDLE     GetMetaFile(LPSTR);
+HANDLE     GetMetaFileBits(HANDLE);
+int        GetModuleFileName(HANDLE,LPSTR,short);
+HANDLE     GetModuleHandle(LPCSTR);
+int        GetModuleUsage(HANDLE);
+FARPROC    GetMouseEventProc(void);
+DWORD      GetNearestColor(HDC,DWORD);
+WORD       GetNearestPaletteIndex(HPALETTE16,DWORD);
+HWND       GetNextDlgGroupItem(HWND,HWND,BOOL);
+HWND       GetNextDlgTabItem(HWND,HWND,BOOL);
+HWND       GetNextWindow(HWND,WORD);
+WORD       GetNumTasks(void);
+HWND       GetOpenClipboardWindow(void);
+WORD       GetPaletteEntries(HPALETTE16,WORD,WORD,LPPALETTEENTRY);
+HWND       GetParent(HWND);
+DWORD      GetPixel(HDC,short,short);
+WORD       GetPolyFillMode(HDC);
+int        GetPriorityClipboardFormat(WORD*,short);
+UINT       GetPrivateProfileInt(LPCSTR,LPCSTR,INT,LPCSTR);
+INT        GetPrivateProfileString(LPCSTR,LPCSTR,LPCSTR,LPSTR,INT,LPCSTR);
+FARPROC    GetProcAddress(HANDLE,SEGPTR);
+UINT       GetProfileInt(LPCSTR,LPCSTR,INT);
+INT        GetProfileString(LPCSTR,LPCSTR,LPCSTR,LPSTR,INT);
+HANDLE     GetProp(HWND,SEGPTR);
+DWORD      GetQueueStatus(UINT);
+BOOL       GetRasterizerCaps(LPRASTERIZER_STATUS,UINT);
+WORD       GetROP2(HDC);
+WORD       GetRelAbs(HDC);
+int        GetScrollPos(HWND,int);
+void       GetScrollRange(HWND,int,LPINT16,LPINT16);
+DWORD      GetSelectorBase(WORD);
+DWORD      GetSelectorLimit(WORD);
+HANDLE     GetStockObject(int);
+WORD       GetStretchBltMode(HDC);
+HMENU      GetSubMenu(HMENU,short);
+COLORREF   GetSysColor(short);
+HWND       GetSysModalWindow(void);
+UINT       GetSystemDirectory(LPSTR,UINT);
+HMENU      GetSystemMenu(HWND,BOOL);
+int        GetSystemMetrics(WORD);
+WORD       GetSystemPaletteEntries(HDC,WORD,WORD,LPPALETTEENTRY);
+WORD       GetSystemPaletteUse(HDC);
+BOOL       GetSystemPowerStatus(LPSYSTEM_POWER_STATUS);
+VOID       GetSystemTime(LPSYSTEMTIME); /* Win32 */
+DWORD      GetTabbedTextExtent(HDC,LPSTR,int,int,LPINT16);
+HINSTANCE  GetTaskDS(void);
+HQUEUE     GetTaskQueue(HTASK);
+BYTE       GetTempDrive(BYTE);
+INT        GetTempFileName(BYTE,LPCSTR,UINT,LPSTR);
+WORD       GetTextAlign(HDC);
+short      GetTextCharacterExtra(HDC);
+COLORREF   GetTextColor(HDC);
+DWORD      GetTextExtent(HDC,LPCSTR,short);
+INT        GetTextFace(HDC,INT,LPSTR);
+BOOL       GetTextMetrics(HDC,LPTEXTMETRIC16);
+LPINT16    GetThresholdEvent(void);
+int        GetThresholdStatus(void);
+DWORD      GetTickCount(void);
+HWND       GetTopWindow(HWND);
+LONG       GetVersion(void);
+DWORD      GetViewportExt(HDC);
+DWORD      GetViewportOrg(HDC);
+BOOL       GetWinDebugInfo(LPWINDEBUGINFO,UINT);
+LONG       GetWinFlags(void);
+HWND       GetWindow(HWND,WORD);
+HDC        GetWindowDC(HWND);
+DWORD      GetWindowExt(HDC);
+DWORD      GetWindowOrg(HDC);
+HANDLE     GetWindowTask(HWND);
+int        GetWindowTextLength(HWND);
+UINT       GetWindowsDirectory(LPSTR,UINT);
+DWORD      GlobalDOSAlloc(DWORD);
+WORD       GlobalDOSFree(WORD);
+ATOM       GlobalDeleteAtom(ATOM);
+void       GlobalFix(HGLOBAL16);
+void       GlobalFreeAll(HGLOBAL16);
+HGLOBAL16  GlobalLRUNewest(HGLOBAL16);
+HGLOBAL16  GlobalLRUOldest(HGLOBAL16);
+void       GlobalNotify(FARPROC);
+WORD       GlobalPageLock(HGLOBAL16);
+WORD       GlobalPageUnlock(HGLOBAL16);
+BOOL       GlobalUnWire(HGLOBAL16);
+void       GlobalUnfix(HGLOBAL16);
+SEGPTR     GlobalWire(HGLOBAL16);
+BOOL       GrayString(HDC,HBRUSH,FARPROC,LPARAM,INT,INT,INT,INT,INT);
+void       HideCaret(HWND);
+BOOL       HiliteMenuItem(HWND,HMENU,UINT,UINT);
+BOOL       InSendMessage(void);
+WORD       InitAtomTable(WORD);
+HRGN       InquireVisRgn(HDC);
+int        IntersectClipRect(HDC,short,short,short,short);
+int        IntersectVisRect(HDC,short,short,short,short);
+void       InvalidateRgn(HWND32,HRGN32,BOOL32);
+BOOL       InvertRgn(HDC,HRGN);
+BOOL       IsBadCodePtr(SEGPTR);
+BOOL       IsBadHugeReadPtr(SEGPTR,DWORD);
+BOOL       IsBadHugeWritePtr(SEGPTR,DWORD);
+BOOL       IsBadReadPtr(SEGPTR,WORD);
+BOOL       IsBadStringPtr(SEGPTR,WORD);
+BOOL       IsBadWritePtr(SEGPTR,WORD);
+BOOL       IsCharAlpha(char);
+BOOL       IsCharAlphaNumeric(char);
+BOOL       IsCharLower(char);
+BOOL       IsCharUpper(char);
+BOOL       IsChild(HWND,HWND);
+BOOL       IsClipboardFormatAvailable(WORD);
+BOOL       IsDialogMessage(HWND,LPMSG16);
+WORD       IsDlgButtonChecked(HWND,WORD);
+BOOL       IsGDIObject(HANDLE);
+BOOL       IsIconic(HWND);
+BOOL       IsMenu(HMENU);
+BOOL       IsTask(HTASK);
+HTASK      IsTaskLocked(void);
+BOOL       IsWindow(HWND);
+BOOL       IsWindowEnabled(HWND);
+BOOL       IsWindowUnicode(HWND);
+BOOL       IsWindowVisible(HWND);
+BOOL       IsZoomed(HWND);
+BOOL       KillSystemTimer(HWND,WORD);
+BOOL       KillTimer(HWND,WORD);
+void       LimitEmsPages(DWORD);
+void       LineDDA(short,short,short,short,FARPROC,long);
+BOOL       LineTo(HDC,short,short);
+HANDLE     LoadAccelerators(HANDLE,SEGPTR);
+HBITMAP    LoadBitmap(HANDLE,SEGPTR);
+HCURSOR    LoadCursor(HANDLE,SEGPTR);
+HICON      LoadIcon(HANDLE,SEGPTR);
+HANDLE     LoadLibrary(LPCSTR);
+HMENU      LoadMenu(HANDLE,SEGPTR);
+HANDLE     LoadModule(LPCSTR,LPVOID);
+HGLOBAL    LoadResource(HINSTANCE,HRSRC);
+int        LoadString(HANDLE,WORD,LPSTR,int);
+BOOL       LocalInit(HANDLE,WORD,WORD);
+FARPROC    LocalNotify(FARPROC);
+LPVOID     LockResource(HGLOBAL);
+HGLOBAL    LockSegment(HGLOBAL);
+HMENU      LookupMenuHandle(HMENU,INT);
+FARPROC    MakeProcInstance(FARPROC,HANDLE);
+WORD       MapVirtualKey(WORD,WORD);
+void       MessageBeep(WORD);
+int        MessageBox(HWND,LPCSTR,LPCSTR,WORD);
+DWORD      MoveTo(HDC,short,short);
+BOOL       MoveWindow(HWND,short,short,short,short,BOOL);
+DWORD      OemKeyScan(WORD);
+BOOL       OemToAnsi(LPSTR,LPSTR);
+void       OemToAnsiBuff(LPSTR,LPSTR,INT);
+int        OffsetClipRgn(HDC,short,short);
+BOOL       OpenClipboard(HWND);
+int        OpenComm(LPCSTR,UINT,UINT);
+HFILE      OpenFile(LPCSTR,OFSTRUCT*,UINT);
+BOOL       OpenIcon(HWND);
+int        OpenSound(void);
+void       OutputDebugString(LPCSTR);
+BOOL       PaintRgn(HDC,HRGN);
+BOOL       PatBlt(HDC,short,short,short,short,DWORD);
+BOOL       Pie(HDC,INT,INT,INT,INT,INT,INT,INT,INT);
+BOOL       PlayMetaFile(HDC,HANDLE);
+void       PlayMetaFileRecord(HDC,LPHANDLETABLE,LPMETARECORD,WORD);
+BOOL       PostAppMessage(HANDLE,WORD,WORD,LONG);
+void       PostEvent(HTASK);
+BOOL       PostMessage(HWND,WORD,WORD,LONG);
+void       PostQuitMessage(INT);
+WORD       PrestoChangoSelector(WORD,WORD);
+void       ProfClear(void);
+void       ProfFinish(void);
+void       ProfFlush(void);
+int        ProfInsChk(void);
+void       ProfSampRate(int,int);
+void       ProfSetup(int,int);
+void       ProfStart(void);
+void       ProfStop(void);
+BOOL       PtInRegion(HRGN32,INT32,INT32);
+BOOL       PtVisible(HDC,short,short);
+int        ReadComm(int,LPSTR,int);
+WORD       RealizeDefaultPalette(HDC);
+UINT       RealizePalette(HDC);
+BOOL       Rectangle(HDC,INT,INT,INT,INT);
+WORD       RegisterClipboardFormat(LPCSTR);
+void       ReleaseCapture(void);
+int        ReleaseDC(HWND,HDC);
+BOOL       RemoveFontResource(LPSTR);
+BOOL       RemoveMenu(HMENU,UINT,UINT);
+HANDLE     RemoveProp(HWND,SEGPTR);
+void       ReplyMessage(LRESULT);
+HDC        ResetDC(HDC,LPVOID);
+BOOL       ResizePalette(HPALETTE16,UINT);
+BOOL       RestoreDC(HDC,short);
+int        RestoreVisRgn(HDC);
+BOOL       RoundRect(HDC,INT,INT,INT,INT,INT,INT);
+int        SaveDC(HDC);
+HRGN       SaveVisRgn(HDC);
+void       ScrollChildren(HWND,UINT,WPARAM,LPARAM);
+BOOL       ScrollDC(HDC,short,short,LPRECT16,LPRECT16,HRGN,LPRECT16);
+void       ScrollWindow(HWND,short,short,LPRECT16,LPRECT16);
+int        ScrollWindowEx(HWND,short,short,LPRECT16,LPRECT16,HRGN,LPRECT16,WORD);
+int        SelectClipRgn(HDC,HRGN);
+HANDLE     SelectObject(HDC,HANDLE);
+HPALETTE16 SelectPalette(HDC,HPALETTE16,BOOL);
+int        SelectVisRgn(HDC,HRGN);
+WORD       SelectorAccessRights(WORD,WORD,WORD);
+HWND       SetActiveWindow(HWND);
+DWORD      SetBkColor(HDC,COLORREF);
+WORD       SetBkMode(HDC,WORD);
+DWORD      SetBrushOrg(HDC,short,short);
+HWND       SetCapture(HWND);
+void       SetCaretBlinkTime(WORD);
+void       SetCaretPos(short,short);
+HANDLE     SetClipboardData(WORD,HANDLE);
+HWND       SetClipboardViewer(HWND);
+int        SetCommBreak(int);
+UINT*      SetCommEventMask(int,UINT);
+int        SetCommState(DCB*);
+void       SetConvertHook(BOOL);
+BOOL       SetConvertParams(int,int);
+BOOL32     SetCurrentDirectory(LPCSTR);
+HCURSOR    SetCursor(HCURSOR);
+void       SetCursorPos(short,short);
+BOOL       SetDCHook(HDC,FARPROC16,DWORD);
+void       SetDCState(HDC,HDC);
+int        SetDIBits(HDC,HANDLE,WORD,WORD,LPSTR,LPBITMAPINFO,WORD);
+int        SetDIBitsToDevice(HDC,short,short,WORD,WORD,WORD,WORD,WORD,WORD,LPSTR,LPBITMAPINFO,WORD);
+BOOL       SetDeskPattern(void);
+BOOL       SetDeskWallPaper(LPCSTR);
+void       SetDoubleClickTime(WORD);
+int        SetEnvironment(LPSTR,LPSTR,WORD);
+UINT       SetErrorMode(UINT);
+HWND       SetFocus(HWND);
+WORD       SetHandleCount(WORD);
+WORD       SetHookFlags(HDC,WORD);
+void       SetKeyboardState(BYTE*);
+WORD       SetMapMode(HDC,WORD);
+DWORD      SetMapperFlags(HDC,DWORD);
+BOOL       SetMenu(HWND,HMENU);
+BOOL       SetMenuItemBitmaps(HMENU,UINT,UINT,HBITMAP,HBITMAP);
+BOOL       SetMessageQueue(int);
+HANDLE     SetMetaFileBits(HANDLE);
+WORD       SetPaletteEntries(HPALETTE16,WORD,WORD,LPPALETTEENTRY);
+HWND       SetParent(HWND,HWND);
+COLORREF   SetPixel(HDC,short,short,COLORREF);
+WORD       SetPolyFillMode(HDC,WORD);
+BOOL       SetProp(HWND,SEGPTR,HANDLE);
+WORD       SetROP2(HDC,WORD);
+void       SetRectRgn(HRGN32,INT32,INT32,INT32,INT32);
+WORD       SetRelAbs(HDC,WORD);
+FARPROC    SetResourceHandler(HANDLE,LPSTR,FARPROC);
+int        SetScrollPos(HWND,int,int,BOOL);
+void       SetScrollRange(HWND,int,int,int,BOOL);
+WORD       SetSelectorBase(WORD,DWORD);
+WORD       SetSelectorLimit(WORD,DWORD);
+int        SetSoundNoise(int,int);
+WORD       SetStretchBltMode(HDC,WORD);
+LONG       SetSwapAreaSize(WORD);
+void       SetSysColors(int,LPINT16,COLORREF*);
+HWND       SetSysModalWindow(HWND);
+WORD       SetSystemPaletteUse(HDC,WORD);
+BOOL       SetSystemPowerState(BOOL, BOOL);
+BOOL       SetSystemTime(const SYSTEMTIME*);
+WORD       SetSystemTimer(HWND,WORD,WORD,FARPROC);
+HQUEUE     SetTaskQueue(HTASK,HQUEUE);
+WORD       SetTextAlign(HDC,WORD);
+short      SetTextCharacterExtra(HDC,short);
+DWORD      SetTextColor(HDC,DWORD);
+short      SetTextJustification(HDC,short,short);
+WORD       SetTimer(HWND,WORD,WORD,FARPROC);
+int        SetVoiceAccent(int,int,int,int,int);
+int        SetVoiceEnvelope(int,int,int);
+int        SetVoiceNote(int,int,int,int);
+int        SetVoiceQueueSize(int,int);
+int        SetVoiceSound(int,LONG,int);
+int        SetVoiceThreshold(int,int);
+BOOL       SetWinDebugInfo(LPWINDEBUGINFO);
+BOOL       SetWindowPos(HWND,HWND,INT,INT,INT,INT,WORD);
+FARPROC    SetWindowsHook(short,FARPROC);
+HHOOK      SetWindowsHookEx(short,HOOKPROC,HINSTANCE,HTASK);
+HINSTANCE  ShellExecute(HWND,LPCSTR,LPCSTR,LPSTR,LPCSTR,INT);
+void       ShowCaret(HWND);
+int        ShowCursor(BOOL);
+void       ShowOwnedPopups(HWND,BOOL);
+void       ShowScrollBar(HWND,WORD,BOOL);
+BOOL       ShowWindow(HWND,int);
+DWORD      SizeofResource(HINSTANCE,HRSRC);
+VOID       Sleep(DWORD); /* Win32 */
+int        StartSound(void);
+int        StopSound(void);
+BOOL       StretchBlt(HDC,short,short,short,short,HDC,short,short,short,short,DWORD);
+int        StretchDIBits(HDC,WORD,WORD,WORD,WORD,WORD,WORD,WORD,WORD,LPSTR,LPBITMAPINFO,WORD,DWORD);
+BOOL       SwapMouseButton(BOOL);
+void       SwapRecording(WORD);
+void       SwitchStackBack(void);
+void       SwitchStackTo(WORD,WORD,WORD);
+int        SyncAllVoices(void);
+BOOL       SystemParametersInfo(UINT,UINT,LPVOID,UINT);
+LONG       TabbedTextOut(HDC,short,short,LPSTR,short,short,LPINT16,short);
+int        Throw(LPCATCHBUF,int);
+int        ToAscii(WORD,WORD,LPSTR,LPVOID,WORD);
+int        TranslateAccelerator(HWND,HANDLE,LPMSG16);
+BOOL       TranslateMDISysAccel(HWND,LPMSG16);
+BOOL       TranslateMessage(LPMSG16);
+int        TransmitCommChar(int,char);
+int        UngetCommChar(int,char);
+BOOL       UnhookWindowsHook(short,FARPROC);
+BOOL       UnhookWindowsHookEx(HHOOK);
+void       UnlockSegment(HGLOBAL);
+BOOL       UnrealizeObject(HBRUSH);
+int        UpdateColors(HDC);
+void       UpdateWindow(HWND32);
+void       UserYield(void);
+void       ValidateCodeSegments(void);
+LPSTR      ValidateFreeSpaces(void);
+void       ValidateRgn(HWND32,HRGN32);
+WORD       VkKeyScan(WORD);
+SEGPTR     WIN16_GlobalLock16(HGLOBAL16);
+SEGPTR     WIN16_LockResource(HANDLE);
+BOOL       WaitEvent(HTASK);
+void       WaitMessage(void);
+int        WaitSoundState(int);
+HANDLE     WinExec(LPSTR,WORD);
+BOOL       WinHelp(HWND,LPSTR,WORD,DWORD);
+int        WriteComm(int,LPSTR,int);
+void       WriteOutProfiles(void);
+BOOL       WritePrivateProfileString(LPCSTR,LPCSTR,LPCSTR,LPCSTR);
+BOOL       WriteProfileString(LPCSTR,LPCSTR,LPCSTR);
+void       Yield(void);
+LONG       _hread(HFILE,SEGPTR,LONG);
+LONG       _hwrite(HFILE,LPCSTR,LONG);
+HFILE      _lclose(HFILE);
+HFILE      _lcreat(LPCSTR,INT);
+LONG       _llseek(HFILE,LONG,INT);
+HFILE      _lopen(LPCSTR,INT);
+INT        _lread(HFILE,SEGPTR,WORD);
+INT        _lwrite(HFILE,LPCSTR,WORD);
+
 
 #ifdef WINELIB
 #define WINELIB_UNIMP(x) fprintf (stderr, "WineLib: Unimplemented %s\n", x)
diff --git a/include/winreg.h b/include/winreg.h
index 62c4529..f5954ad 100644
--- a/include/winreg.h
+++ b/include/winreg.h
@@ -1,8 +1,6 @@
 /*
  * 				Shell Library definitions
  */
-#include "wintypes.h"
-
 #ifndef __WINE_WINREG_H
 #define __WINE_WINREG_H
 
@@ -85,27 +83,6 @@
 				 KEY_READ|KEY_WRITE|	\
 				 KEY_CREATE_LINK	\
 				)
-/* one value of a key */
-typedef struct tagKEYVALUE {
-	LPWSTR	name;	/* name of value (UNICODE) or NULL for win31 */
-	DWORD	type;	/* type of value */
-	DWORD	len;	/* length of data */
-	DWORD	lastmodified; /* time of seconds since 1.1.1970 */
-	LPBYTE	data;	/* content, may be strings, binaries, etc. */
-} KEYVALUE,*LPKEYVALUE;
-
-/* a registry key */
-typedef struct tagKEYSTRUCT {
-	LPWSTR			keyname;	/* name of THIS key (UNICODE) */
-	DWORD			flags;		/* flags. */
-	LPWSTR			class;
-	/* values */
-	DWORD			nrofvalues;	/* nr of values in THIS key */
-	LPKEYVALUE		values;		/* values in THIS key */
-	/* key management pointers */
-	struct tagKEYSTRUCT	*next;		/* next key on same hierarchy */
-	struct tagKEYSTRUCT	*nextsub;	/* keys that hang below THIS key */
-} KEYSTRUCT, *LPKEYSTRUCT;
 
 void SHELL_Init();
 void SHELL_SaveRegistry();
diff --git a/include/wintypes.h b/include/wintypes.h
index 97718cc..33bcebd 100644
--- a/include/wintypes.h
+++ b/include/wintypes.h
@@ -152,16 +152,19 @@
 /* Callback function pointers types for Win16. */
 
 #ifdef WINELIB
-typedef LRESULT (*WNDPROC16)(HWND16,UINT16,WPARAM16,LPARAM);
+typedef LRESULT (*DLGPROC16)(HWND16,UINT16,WPARAM16,LPARAM);
 typedef LRESULT (*FARPROC16)();
+typedef LRESULT (*WNDPROC16)(HWND16,UINT16,WPARAM16,LPARAM);
 #else
 /* Function pointers are SEGPTR in Win16 */
+typedef SEGPTR DLGPROC16;
 typedef SEGPTR FARPROC16;
 typedef SEGPTR WNDPROC16;
 #endif
 
 /* Callback function pointers types for Win32. */
 
+typedef LRESULT (*DLGPROC32)(HWND32,UINT32,WPARAM32,LPARAM);
 typedef LRESULT (*FARPROC32)();
 typedef LRESULT (*WNDPROC32)(HWND32,UINT32,WPARAM32,LPARAM);
 
@@ -226,71 +229,6 @@
 DECL_WINELIB_TYPE(FARPROC);
 DECL_WINELIB_TYPE(WNDPROC);
 
-/* Library data types defined as a transition aid for the emulator. */
-/* These should _not_ be used in the emulator and will be removed someday. */
-
-#ifndef NO_TRANSITION_TYPES
-
-#ifndef WINELIB
-typedef INT16 INT;
-typedef UINT16 UINT;
-typedef BOOL16 BOOL;
-typedef WPARAM16 WPARAM;
-typedef HANDLE16 HANDLE;
-typedef HANDLE16 HBITMAP;
-typedef HANDLE16 HBRUSH;
-typedef HANDLE16 HCURSOR;
-typedef HANDLE16 HDC;
-typedef HANDLE16 HDRVR;
-typedef HANDLE16 HFONT;
-typedef HANDLE16 HGLOBAL;
-typedef HANDLE16 HICON;
-typedef HANDLE16 HINSTANCE;
-typedef HANDLE16 HMENU;
-typedef HANDLE16 HMETAFILE;
-typedef HANDLE16 HMIDI;
-typedef HANDLE16 HMIDIIN;
-typedef HANDLE16 HMIDIOUT;
-typedef HANDLE16 HMMIO;
-typedef HANDLE16 HMODULE;
-typedef HANDLE16 HQUEUE;
-typedef HANDLE16 HRGN;
-typedef HANDLE16 HRSRC;
-typedef HANDLE16 HTASK;
-typedef HANDLE16 HWAVE;
-typedef HANDLE16 HWAVEIN;
-typedef HANDLE16 HWAVEOUT;
-typedef HANDLE16 HWND;
-typedef FARPROC16 FARPROC;
-typedef WNDPROC16 WNDPROC;
-#endif  /* WINELIB */
-
-/* Callback function pointers types. */
-
-#ifdef WINELIB
-typedef LONG (*DRIVERPROC)(DWORD, HDRVR, UINT, LPARAM, LPARAM);
-typedef int (*EDITWORDBREAKPROC)(LPSTR lpch, int ichCurrent, int cch,int code);
-/*typedef int (*FONTENUMPROC)(const LOGFONT*,const TEXTMETRIC*,DWORD,LPARAM);*/
-typedef int (*FONTENUMPROC)(const void*,const void*,DWORD,LPARAM);
-typedef int (*GOBJENUMPROC)(LPVOID,LPARAM);
-/*typedef int (*MFENUMPROC)(HDC,HANDLETABLE*,METARECORD*,int,LPARAM);*/
-typedef int (*MFENUMPROC)(HDC,void*,void*,int,LPARAM);
-typedef BOOL (*PROPENUMPROC)(HWND,LPCTSTR,HANDLE);
-typedef LRESULT (*WNDENUMPROC)(HWND,LPARAM);
-#else
-typedef SEGPTR DRIVERPROC;
-typedef SEGPTR EDITWORDBREAKPROC;
-typedef SEGPTR FONTENUMPROC;
-typedef SEGPTR GOBJENUMPROC;
-typedef SEGPTR MFENUMPROC;
-typedef SEGPTR PROPENUMPROC;
-typedef SEGPTR WNDENUMPROC;
-#endif
-typedef FARPROC DLGPROC;
-typedef FARPROC HOOKPROC;
-
-#endif  /* NO_TRANSITION_TYPES */
-
 /* Misc. constants. */
 
 #ifdef FALSE
diff --git a/loader/Makefile.in b/loader/Makefile.in
index 7ae4cf8..166ce95 100644
--- a/loader/Makefile.in
+++ b/loader/Makefile.in
@@ -9,8 +9,8 @@
 	ne_resource.c \
 	pe_image.c \
 	pe_resource.c \
-	signal.c \
 	resource.c \
+	signal.c \
 	task.c
 
 all: $(MODULE).o
diff --git a/loader/builtin.c b/loader/builtin.c
index 76c0d29..7cfb347 100644
--- a/loader/builtin.c
+++ b/loader/builtin.c
@@ -100,9 +100,11 @@
 extern const DLL_DESCRIPTOR OLE32_Descriptor;
 extern const DLL_DESCRIPTOR GDI32_Descriptor;
 extern const DLL_DESCRIPTOR KERNEL32_Descriptor;
+extern const DLL_DESCRIPTOR LZ32_Descriptor;
 extern const DLL_DESCRIPTOR NTDLL_Descriptor;
 extern const DLL_DESCRIPTOR SHELL32_Descriptor;
 extern const DLL_DESCRIPTOR USER32_Descriptor;
+extern const DLL_DESCRIPTOR VERSION_Descriptor;
 extern const DLL_DESCRIPTOR WINSPOOL_Descriptor;
 extern const DLL_DESCRIPTOR WSOCK32_Descriptor;
 
@@ -147,9 +149,11 @@
     { &OLE32_Descriptor,    0 },
     { &GDI32_Descriptor,    0 },
     { &KERNEL32_Descriptor, DLL_FLAG_ALWAYS_USED },
+    { &LZ32_Descriptor,     0 },
     { &NTDLL_Descriptor,    0 },
     { &SHELL32_Descriptor,  0 },
     { &USER32_Descriptor,   0 },
+    { &VERSION_Descriptor,  0 },
     { &WINSPOOL_Descriptor, 0 },
     { &WSOCK32_Descriptor,  0 },
     /* Last entry */
@@ -202,11 +206,11 @@
     /* Fix the name in case we have a full path and extension */
 
     if ((p = strrchr( name, '\\' ))) name = p + 1;
-    lstrcpyn( dllname, name, sizeof(dllname) );
+    lstrcpyn32A( dllname, name, sizeof(dllname) );
     if ((p = strrchr( dllname, '.' ))) *p = '\0';
 
     for (table = BuiltinDLLs; table->descr; table++)
-        if (!lstrcmpi( table->descr->name, dllname )) break;
+        if (!lstrcmpi32A( table->descr->name, dllname )) break;
     if (!table->descr) return 0;
     if ((table->flags & DLL_FLAG_NOT_USED) && !force) return 0;
 
@@ -389,7 +393,7 @@
         if (p == str) return FALSE;
         for (dll = BuiltinDLLs; dll->descr; dll++)
         {
-            if (!lstrncmpi( str, dll->descr->name, (int)(p - str) ))
+            if (!lstrncmpi32A( str, dll->descr->name, (int)(p - str) ))
             {
                 if (str[-1] == '-')
                 {
diff --git a/loader/module.c b/loader/module.c
index 9257c75..d394aa3 100644
--- a/loader/module.c
+++ b/loader/module.c
@@ -827,10 +827,10 @@
         if (!(modulename = strrchr( modulepath, '\\' )))
             modulename = modulepath;
         else modulename++;
-        if (!lstrcmpi( modulename, filename )) return hModule;
+        if (!lstrcmpi32A( modulename, filename )) return hModule;
 
         name_table = (BYTE *)pModule + pModule->name_table;
-        if ((*name_table == len) && !lstrncmpi(filename, name_table+1, len))
+        if ((*name_table == len) && !lstrncmpi32A(filename, name_table+1, len))
             return hModule;
         hModule = pModule->next;
     }
@@ -1193,7 +1193,7 @@
 
     hModule = GetExePtr( hModule );  /* In case we were passed an hInstance */
     if (!(pModule = MODULE_GetPtr( hModule ))) return 0;
-    lstrcpyn( lpFileName, NE_MODULE_NAME(pModule), nSize );
+    lstrcpyn32A( lpFileName, NE_MODULE_NAME(pModule), nSize );
     dprintf_module( stddeb, "GetModuleFilename: %s\n", lpFileName );
     return strlen(lpFileName);
 }
@@ -1221,7 +1221,7 @@
     if (handle == (HANDLE)2)  /* file not found */
     {
         char buffer[256];
-        lstrcpyn( buffer, libname, 252 );
+        lstrcpyn32A( buffer, libname, 252 );
         strcat( buffer, ".dll" );
         handle = LoadModule( buffer, (LPVOID)-1 );
     }
@@ -1253,8 +1253,13 @@
     char *p, *cmdline, filename[256];
     static int use_load_module = 1;
 
-    if (!(cmdShowHandle = GlobalAlloc16( 0, 2 * sizeof(WORD) ))) return 0;
-    if (!(cmdLineHandle = GlobalAlloc16( 0, 256 ))) return 0;
+    if (!(cmdShowHandle = GlobalAlloc16( 0, 2 * sizeof(WORD) )))
+        return 8;  /* Out of memory */
+    if (!(cmdLineHandle = GlobalAlloc16( 0, 256 )))
+    {
+        GlobalFree16( cmdShowHandle );
+        return 8;  /* Out of memory */
+    }
 
       /* Store nCmdShow */
 
@@ -1265,9 +1270,9 @@
       /* Build the filename and command-line */
 
     cmdline = (char *)GlobalLock16( cmdLineHandle );
-    lstrcpyn( filename, lpCmdLine, sizeof(filename) - 4 /* for extension */ );
+    lstrcpyn32A(filename, lpCmdLine, sizeof(filename) - 4 /* for extension */);
     for (p = filename; *p && (*p != ' ') && (*p != '\t'); p++);
-    if (*p) lstrcpyn( cmdline, p + 1, 128 );
+    if (*p) lstrcpyn32A( cmdline, p + 1, 128 );
     else cmdline[0] = '\0';
     *p = '\0';
 
diff --git a/loader/ne_resource.c b/loader/ne_resource.c
index bf88022..fc3081b 100644
--- a/loader/ne_resource.c
+++ b/loader/ne_resource.c
@@ -64,8 +64,8 @@
                 if (p[1] & 0x8000)
                 {
                     if (!HIWORD(typeId)) continue;
-                    if (lstrcmpi( (char *)PTR_SEG_TO_LIN(typeId),
-                                  (char *)(p + 3) )) continue;
+                    if (lstrcmpi32A( (char *)PTR_SEG_TO_LIN(typeId),
+                                     (char *)(p + 3) )) continue;
                 }
                 else if (HIWORD(typeId) || ((typeId & ~0x8000)!= p[1]))
                   continue;
@@ -75,7 +75,7 @@
                 if (p[2] & 0x8000)
                 {
                     if (!HIWORD(resId)) continue;
-                    if (lstrcmpi( (char *)PTR_SEG_TO_LIN(resId),
+                    if (lstrcmpi32A( (char *)PTR_SEG_TO_LIN(resId),
                                (char*)(p+3)+strlen((char*)(p+3))+1 )) continue;
                     
                 }
@@ -116,7 +116,7 @@
         {
             if (pNameInfo->id & 0x8000) continue;
             p = (BYTE *)pModule + pModule->res_table + pNameInfo->id;
-            if ((*p == len) && !lstrncmpi( p+1, str, len ))
+            if ((*p == len) && !lstrncmpi32A( p+1, str, len ))
                 return (HRSRC)((int)pNameInfo - (int)pModule);
         }
     }
@@ -163,7 +163,7 @@
             if (!(pTypeInfo->type_id & 0x8000))
             {
                 BYTE *p = (BYTE*)pModule+pModule->res_table+pTypeInfo->type_id;
-                if ((*p == len) && !lstrncmpi( p+1, str, len ))
+                if ((*p == len) && !lstrncmpi32A( p+1, str, len ))
                 {
                     dprintf_resource( stddeb, "  Found type '%s'\n", str );
                     hRsrc = NE_FindResourceFromType(pModule, pTypeInfo, resId);
diff --git a/loader/resource.c b/loader/resource.c
index 56de36f..9f0aa83 100644
--- a/loader/resource.c
+++ b/loader/resource.c
@@ -304,7 +304,7 @@
 /**********************************************************************
  *			TranslateAccelerator 	[USER.178]
  */
-int TranslateAccelerator(HWND hWnd, HANDLE hAccel, LPMSG msg)
+int TranslateAccelerator(HWND hWnd, HANDLE hAccel, LPMSG16 msg)
 {
     ACCELHEADER	*lpAccelTbl;
     int 	i;
diff --git a/loader/signal.c b/loader/signal.c
index c0f422f..0d200ca 100644
--- a/loader/signal.c
+++ b/loader/signal.c
@@ -70,50 +70,54 @@
 
 
 /**********************************************************************
- *		win_fault
+ *		SIGNAL_trap
+ *
+ * SIGTRAP handler.
+ */
+#ifdef linux
+static void SIGNAL_trap(int signal, struct sigcontext_struct context_struct)
+{
+    struct sigcontext_struct *context = &context_struct;
+#elif defined(__svr4__) || defined(_SCO_DS)
+static void SIGNAL_trap(int signal, void *siginfo, ucontext_t *context)
+{
+#else
+static void SIGNAL_trap(int signal, int code, struct sigcontext *context)
+{
+#endif
+    wine_debug( signal, context );  /* Enter our debugger */
+}
+
+
+/**********************************************************************
+ *		SIGNAL_fault
  *
  * Segfault handler.
  */
 #ifdef linux
-static void win_fault(int signal, struct sigcontext_struct context_struct)
+static void SIGNAL_fault(int signal, struct sigcontext_struct context_struct)
 {
     struct sigcontext_struct *context = &context_struct;
 #elif defined(__svr4__) || defined(_SCO_DS)
-static void win_fault(int signal, void *siginfo, ucontext_t *context)
+static void SIGNAL_fault(int signal, void *siginfo, ucontext_t *context)
 {
 #else
-static void win_fault(int signal, int code, struct sigcontext *context)
+static void SIGNAL_fault(int signal, int code, struct sigcontext *context)
 {
 #endif
-    if (signal == SIGTRAP)
+    if (CS_reg(context) == WINE_CODE_SELECTOR)
     {
-        /* If SIGTRAP not caused by breakpoint or single step 
-           don't jump into the debugger */
-        if (!(EFL_reg(context) & STEP_FLAG))
-        {
-            DBG_ADDR addr;
-            addr.seg = CS_reg(context);
-            addr.off = EIP_reg(context) - 1;
-            if (DEBUG_FindBreakpoint(&addr) == -1) return;
-        }
+        fprintf( stderr, "Segmentation fault in Wine program (%x:%lx)."
+                         "  Please debug.\n",
+                 CS_reg(context), EIP_reg(context) );
     }
-    else if (signal != SIGHUP)
+    else
     {
-        if (CS_reg(context) == WINE_CODE_SELECTOR)
-        {
-            fprintf(stderr, "Segmentation fault in Wine program (%x:%lx)."
-                            "  Please debug.\n",
-                            CS_reg(context), EIP_reg(context) );
-        }
-        else
-        {
-            if (INSTR_EmulateInstruction( context )) return;
-            fprintf( stderr, "Segmentation fault in Windows program %x:%lx.\n",
-                     CS_reg(context), EIP_reg(context) );
-        }
+        if (INSTR_EmulateInstruction( context )) return;
+        fprintf( stderr, "Segmentation fault in Windows program %x:%lx.\n",
+                 CS_reg(context), EIP_reg(context) );
     }
-
-    wine_debug( signal, context );  /* Enter our debugger */
+    wine_debug( signal, context );
 }
 
 
@@ -201,13 +205,13 @@
 #endif  /* __svr4__ || _SCO_DS */
     
     SIGNAL_SetHandler( SIGALRM, (void (*)())wine_timer );
-    SIGNAL_SetHandler( SIGSEGV, (void (*)())win_fault );
-    SIGNAL_SetHandler( SIGILL,  (void (*)())win_fault );
-    SIGNAL_SetHandler( SIGFPE,  (void (*)())win_fault );
-    SIGNAL_SetHandler( SIGTRAP, (void (*)())win_fault ); /* For debugger */
-    SIGNAL_SetHandler( SIGHUP,  (void (*)())win_fault ); /* For forced break */
+    SIGNAL_SetHandler( SIGSEGV, (void (*)())SIGNAL_fault );
+    SIGNAL_SetHandler( SIGILL,  (void (*)())SIGNAL_fault );
+    SIGNAL_SetHandler( SIGFPE,  (void (*)())SIGNAL_fault );
+    SIGNAL_SetHandler( SIGTRAP, (void (*)())SIGNAL_trap ); /* debugger */
+    SIGNAL_SetHandler( SIGHUP,  (void (*)())SIGNAL_trap ); /* forced break */
 #ifdef SIGBUS
-    SIGNAL_SetHandler( SIGBUS,  (void (*)())win_fault );
+    SIGNAL_SetHandler( SIGBUS,  (void (*)())SIGNAL_fault );
 #endif
 #ifdef CONFIG_IPC
     SIGNAL_SetHandler( SIGUSR2, (void (*)())stop_wait ); /* For IPC */
diff --git a/loader/task.c b/loader/task.c
index db91fd0..8132b9d 100644
--- a/loader/task.c
+++ b/loader/task.c
@@ -127,7 +127,7 @@
 
     for (e = environ, size = initial_size; *e; e++)
     {
-	if (lstrncmpi(*e, "path=", 5))
+	if (lstrncmpi32A(*e, "path=", 5))
 	{
             int len = strlen(*e) + 1;
             if (size + len >= 32767)
@@ -149,7 +149,7 @@
 
     for (e = environ, size = initial_size; *e; e++)
     {
-	if (lstrncmpi(*e, "path=", 5))
+	if (lstrncmpi32A(*e, "path=", 5))
 	{
             int len = strlen(*e) + 1;
             if (size + len >= 32767) break;
@@ -478,7 +478,7 @@
     memset( pTask->pdb.fileHandles, 0xff, sizeof(pTask->pdb.fileHandles) );
     pTask->pdb.environment    = hEnvironment;
     pTask->pdb.nbFiles        = 20;
-    lstrcpyn( pTask->pdb.cmdLine + 1, cmdLine, 127 );
+    lstrcpyn32A( pTask->pdb.cmdLine + 1, cmdLine, 127 );
     pTask->pdb.cmdLine[0] = strlen( pTask->pdb.cmdLine + 1 );
 
       /* Get the compatibility flags */
diff --git a/memory/Makefile.in b/memory/Makefile.in
index 4287234..a2e5b36 100644
--- a/memory/Makefile.in
+++ b/memory/Makefile.in
@@ -7,7 +7,8 @@
 	heap.c \
 	ldt.c \
 	local.c \
-	selector.c
+	selector.c \
+	string.c
 
 all: $(MODULE).o
 
diff --git a/memory/atom.c b/memory/atom.c
index bde08be..4d8db56 100644
--- a/memory/atom.c
+++ b/memory/atom.c
@@ -141,7 +141,7 @@
     {
 	entryPtr = ATOM_MakePtr( selector, entry );
 	if ((entryPtr->length == len) && 
-	    (!lstrncmpi( entryPtr->str, str, len )))
+	    (!lstrncmpi32A( entryPtr->str, str, len )))
 	{
 	    entryPtr->refCount++;
 	    return HANDLETOATOM( entry );
@@ -218,7 +218,7 @@
     {
 	ATOMENTRY * entryPtr = ATOM_MakePtr( selector, entry );
 	if ((entryPtr->length == len) && 
-	    (!lstrncmpi( entryPtr->str, str, len )))
+	    (!lstrncmpi32A( entryPtr->str, str, len )))
 	    return HANDLETOATOM( entry );
 	entry = entryPtr->next;
     }
@@ -294,7 +294,7 @@
         /* If the string is in the same data segment as the atom table, make */
         /* a copy of the string to be sure it doesn't move in linear memory. */
         char buffer[256];
-        lstrcpyn( buffer, (char *)PTR_SEG_TO_LIN(str), sizeof(buffer) );
+        lstrcpyn32A( buffer, (char *)PTR_SEG_TO_LIN(str), sizeof(buffer) );
         atom = ATOM_AddAtom( ds, buffer );
     }
     else atom = ATOM_AddAtom( ds, (LPCSTR)PTR_SEG_TO_LIN(str) );
diff --git a/memory/global.c b/memory/global.c
index c8e4d5d..1f58f09 100644
--- a/memory/global.c
+++ b/memory/global.c
@@ -93,8 +93,8 @@
  * Create a global heap block for a fixed range of linear memory.
  */
 HGLOBAL16 GLOBAL_CreateBlock( WORD flags, const void *ptr, DWORD size,
-                              HGLOBAL16 hOwner, BOOL isCode,
-                              BOOL is32Bit, BOOL isReadOnly,
+                              HGLOBAL16 hOwner, BOOL16 isCode,
+                              BOOL16 is32Bit, BOOL16 isReadOnly,
                               SHMDATA *shmdata  )
 {
     WORD sel, selcount;
@@ -156,7 +156,7 @@
  * Free a block allocated by GLOBAL_CreateBlock, without touching
  * the associated linear memory range.
  */
-BOOL GLOBAL_FreeBlock( HGLOBAL16 handle )
+BOOL16 GLOBAL_FreeBlock( HGLOBAL16 handle )
 {
     WORD sel;
 
@@ -174,7 +174,7 @@
  * Implementation of GlobalAlloc16()
  */
 HGLOBAL16 GLOBAL_Alloc( UINT16 flags, DWORD size, HGLOBAL16 hOwner,
-                        BOOL isCode, BOOL is32Bit, BOOL isReadOnly )
+                        BOOL16 isCode, BOOL16 is32Bit, BOOL16 isReadOnly )
 {
     void *ptr;
     HGLOBAL16 handle;
diff --git a/memory/heap.c b/memory/heap.c
index 8ba60e8..462cf77 100644
--- a/memory/heap.c
+++ b/memory/heap.c
@@ -1199,7 +1199,7 @@
  */
 LPSTR HEAP_strdupA( HANDLE32 heap, DWORD flags, LPCSTR str )
 {
-    INT32 len = lstrlen(str) + 1;
+    INT32 len = lstrlen32A(str) + 1;
     LPSTR p = HeapAlloc( heap, flags, len );
     if (p) strcpy( p, str );
     return p;
diff --git a/memory/ldt.c b/memory/ldt.c
index 87323db..5ed3cbfd 100644
--- a/memory/ldt.c
+++ b/memory/ldt.c
@@ -37,8 +37,8 @@
 #endif  /* ifndef WINELIB */
 
 
-ldt_copy_entry ldt_copy[LDT_SIZE] = { {0,0}, };
-unsigned char ldt_flags_copy[LDT_SIZE] = { 0, };
+ldt_copy_entry ldt_copy[LDT_SIZE];
+unsigned char ldt_flags_copy[LDT_SIZE];
 
         
 /***********************************************************************
diff --git a/memory/string.c b/memory/string.c
new file mode 100644
index 0000000..3348ec8
--- /dev/null
+++ b/memory/string.c
@@ -0,0 +1,335 @@
+/*
+ * String functions
+ *
+ * Copyright 1993 Yngvi Sigurjonsson
+ * Copyright 1996 Alexandre Julliard
+ */
+
+#include <ctype.h>
+#include <string.h>
+#include "windows.h"
+#include "ldt.h"
+
+
+/***********************************************************************
+ *           hmemcpy   (KERNEL.348)
+ */
+void hmemcpy( LPVOID dst, LPCVOID src, LONG count )
+{
+    memcpy( dst, src, count );
+}
+
+
+/***********************************************************************
+ *           lstrcat16   (KERNEL.89)
+ */
+SEGPTR lstrcat16( SEGPTR dst, SEGPTR src )
+{
+    lstrcat32A( (LPSTR)PTR_SEG_TO_LIN(dst), (LPCSTR)PTR_SEG_TO_LIN(src) );
+    return dst;
+}
+
+
+/***********************************************************************
+ *           lstrcat32A   (KERNEL32.599)
+ */
+LPSTR lstrcat32A( LPSTR dst, LPCSTR src )
+{
+    strcat( dst, src );
+    return dst;
+}
+
+
+/***********************************************************************
+ *           lstrcat32W   (KERNEL32.600)
+ */
+LPWSTR lstrcat32W( LPWSTR dst, LPCWSTR src )
+{
+    register LPWSTR p = dst;
+    while (*p) p++;
+    while ((*p++ = *src++));
+    return dst;
+}
+
+
+/***********************************************************************
+ *           lstrcatn16   (KERNEL.352)
+ */
+SEGPTR lstrcatn16( SEGPTR dst, SEGPTR src, INT16 n )
+{
+    lstrcatn32A( (LPSTR)PTR_SEG_TO_LIN(dst), (LPCSTR)PTR_SEG_TO_LIN(src), n );
+    return dst;
+}
+
+
+/***********************************************************************
+ *           lstrcatn32A   (Not a Windows API)
+ */
+LPSTR lstrcatn32A( LPSTR dst, LPCSTR src, INT32 n )
+{
+    register LPSTR p = dst;
+    while (*p) p++;
+    if ((n -= (INT32)(p - dst)) <= 0) return dst;
+    lstrcpyn32A( p, src, n );
+    return dst;
+}
+
+
+/***********************************************************************
+ *           lstrcatn32W   (Not a Windows API)
+ */
+LPWSTR lstrcatn32W( LPWSTR dst, LPCWSTR src, INT32 n )
+{
+    register LPWSTR p = dst;
+    while (*p) p++;
+    if ((n -= (INT32)(p - dst)) <= 0) return dst;
+    lstrcpyn32W( p, src, n );
+    return dst;
+}
+
+
+/***********************************************************************
+ *           lstrcmp16   (USER.430)
+ */
+INT16 lstrcmp16( LPCSTR str1, LPCSTR str2 )
+{
+    return (INT16)lstrcmp32A( str1, str2 );
+}
+
+
+/***********************************************************************
+ *           lstrcmp32A   (KERNEL.602)
+ */
+INT32 lstrcmp32A( LPCSTR str1, LPCSTR str2 )
+{
+    return (INT32)strcmp( str1, str2 );
+}
+
+
+/***********************************************************************
+ *           lstrcmp32W   (KERNEL.603)
+ */
+INT32 lstrcmp32W( LPCWSTR str1, LPCWSTR str2 )
+{
+    while (*str1 && (*str1 == *str2)) { str1++; str2++; }
+    return (INT32)(*str1 - *str2);
+}
+
+
+/***********************************************************************
+ *           lstrcmpi16   (USER.471)
+ */
+INT16 lstrcmpi16( LPCSTR str1, LPCSTR str2 )
+{
+    return (INT16)lstrcmpi32A( str1, str2 );
+}
+
+
+/***********************************************************************
+ *           lstrcmpi32A   (KERNEL32.605)
+ */
+INT32 lstrcmpi32A( LPCSTR str1, LPCSTR str2 )
+{
+    INT32 res;
+
+    while (*str1)
+    {
+        if ((res = toupper(*str1) - toupper(*str2)) != 0) return res;
+        str1++;
+        str2++;
+    }
+    return toupper(*str1) - toupper(*str2);
+}
+
+
+/***********************************************************************
+ *           lstrcmpi32W   (KERNEL32.606)
+ */
+INT32 lstrcmpi32W( LPCWSTR str1, LPCWSTR str2 )
+{
+    INT32 res;
+
+    while (*str1)
+    {
+        /* FIXME: Unicode */
+        if ((res = toupper(*str1) - toupper(*str2)) != 0) return res;
+        str1++;
+        str2++;
+    }
+    return toupper(*str1) - toupper(*str2);
+}
+
+
+/***********************************************************************
+ *           lstrcpy16   (KERNEL.88)
+ */
+SEGPTR lstrcpy16( SEGPTR dst, SEGPTR src )
+{
+    lstrcpy32A( (LPSTR)PTR_SEG_TO_LIN(dst), (LPCSTR)PTR_SEG_TO_LIN(src) );
+    return dst;
+}
+
+
+/***********************************************************************
+ *           lstrcpy32A   (KERNEL32.608)
+ */
+LPSTR lstrcpy32A( LPSTR dst, LPCSTR src )
+{
+    strcpy( dst, src );
+    return dst;
+}
+
+
+/***********************************************************************
+ *           lstrcpy32W   (KERNEL32.609)
+ */
+LPWSTR lstrcpy32W( LPWSTR dst, LPCWSTR src )
+{
+    register LPWSTR p = dst;
+    while ((*p++ = *src++));
+    return dst;
+}
+
+
+/***********************************************************************
+ *           lstrcpyn16   (KERNEL.353)
+ */
+SEGPTR lstrcpyn16( SEGPTR dst, SEGPTR src, INT16 n )
+{
+    lstrcpyn32A( (LPSTR)PTR_SEG_TO_LIN(dst), (LPCSTR)PTR_SEG_TO_LIN(src), n );
+    return dst;
+}
+
+
+/***********************************************************************
+ *           lstrcpyn32A   (KERNEL32.611)
+ */
+LPSTR lstrcpyn32A( LPSTR dst, LPCSTR src, INT32 n )
+{
+    LPSTR p = dst;
+    while ((n-- > 1) && *src) *p++ = *src++;
+    *p = 0;
+    return dst;
+}
+
+
+/***********************************************************************
+ *           lstrcpyn32W   (KERNEL32.612)
+ */
+LPWSTR lstrcpyn32W( LPWSTR dst, LPCWSTR src, INT32 n )
+{
+    LPWSTR p = dst;
+    while ((n-- > 1) && *src) *p++ = *src++;
+    *p = 0;
+    return dst;
+}
+
+
+/***********************************************************************
+ *           lstrlen16   (KERNEL.90)
+ */
+INT16 lstrlen16( LPCSTR str )
+{
+    return (INT16)lstrlen32A( str );
+}
+
+
+/***********************************************************************
+ *           lstrlen32A   (KERNEL32.614)
+ */
+INT32 lstrlen32A( LPCSTR str )
+{
+    /* looks weird, but win3.1 KERNEL got a GeneralProtection handler
+     * in lstrlen() ... we check only for NULL pointer reference.
+     * - Marcus Meissner
+     */
+    if (!str) return 0;
+    return (INT32)strlen(str);
+}
+
+
+/***********************************************************************
+ *           lstrlen32W   (KERNEL32.615)
+ */
+INT32 lstrlen32W( LPCWSTR str )
+{
+    INT32 len = 0;
+    if (!str) return 0;
+    while (*str++) len++;
+    return len;
+}
+
+
+/***********************************************************************
+ *           lstrncmp16   (Not a Windows API)
+ */
+INT16 lstrncmp16( LPCSTR str1, LPCSTR str2, INT16 n )
+{
+    return (INT16)lstrncmp32A( str1, str2, n );
+}
+
+
+/***********************************************************************
+ *           lstrncmp32A   (Not a Windows API)
+ */
+INT32 lstrncmp32A( LPCSTR str1, LPCSTR str2, INT32 n )
+{
+    return (INT32)strncmp( str1, str2, n );
+}
+
+
+/***********************************************************************
+ *           lstrncmp32W   (Not a Windows API)
+ */
+INT32 lstrncmp32W( LPCWSTR str1, LPCWSTR str2, INT32 n )
+{
+    if (!n) return 0;
+    while ((--n > 0) && *str1 && (*str1 == *str2)) { str1++; str2++; }
+    return (INT32)(*str1 - *str2);
+}
+
+
+/***********************************************************************
+ *           lstrncmpi16   (Not a Windows API)
+ */
+INT16 lstrncmpi16( LPCSTR str1, LPCSTR str2, INT16 n )
+{
+    return (INT16)lstrncmpi32A( str1, str2, n );
+}
+
+
+/***********************************************************************
+ *           lstrncmpi32A   (Not a Windows API)
+ */
+INT32 lstrncmpi32A( LPCSTR str1, LPCSTR str2, INT32 n )
+{
+    INT32 res;
+
+    if (!n) return 0;
+    while ((--n > 0) && *str1)
+    {
+        if ((res = toupper(*str1) - toupper(*str2)) != 0) return res;
+        str1++;
+        str2++;
+    }
+    return toupper(*str1) - toupper(*str2);
+}
+
+
+/***********************************************************************
+ *           lstrncmpi32W   (Not a Windows API)
+ */
+INT32 lstrncmpi32W( LPCWSTR str1, LPCWSTR str2, INT32 n )
+{
+    INT32 res;
+
+    if (!n) return 0;
+    while ((--n > 0) && *str1)
+    {
+        /* FIXME: Unicode */
+        if ((res = toupper(*str1) - toupper(*str2)) != 0) return res;
+        str1++;
+        str2++;
+    }
+    return toupper(*str1) - toupper(*str2);
+}
diff --git a/misc/Makefile.in b/misc/Makefile.in
index 6ef8e00..45872d9 100644
--- a/misc/Makefile.in
+++ b/misc/Makefile.in
@@ -32,6 +32,7 @@
 	ver.c \
 	w32sys.c \
 	winsocket.c \
+	wsprintf.c \
 	xmalloc.c
 
 all: $(MODULE).o
diff --git a/misc/clipboard.c b/misc/clipboard.c
index a9c01d9..4ff267c 100644
--- a/misc/clipboard.c
+++ b/misc/clipboard.c
@@ -32,8 +32,8 @@
     LPSTR	Name;
     HANDLE	hData;
     DWORD	BufSize;
-    void	*PrevFormat;
-    void	*NextFormat;
+    struct tagCLIPFORMAT *PrevFormat;
+    struct tagCLIPFORMAT *NextFormat;
 } CLIPFORMAT, *LPCLIPFORMAT;
 
 /* *************************************************************************
@@ -50,7 +50,7 @@
 static Bool wait_for_selection = False;
 static Bool wineOwnsSelection = False;
 
-CLIPFORMAT ClipFormats[16]  = {
+static CLIPFORMAT ClipFormats[16]  = {
     { CF_TEXT, 1, 0, "Text", (HANDLE)NULL, 0, NULL, &ClipFormats[1] },
     { CF_BITMAP, 1, 0, "Bitmap", (HANDLE)NULL, 0, &ClipFormats[0], &ClipFormats[2] },
     { CF_METAFILEPICT, 1, 0, "MetaFile Picture", (HANDLE)NULL, 0, &ClipFormats[1], &ClipFormats[3] },
@@ -117,12 +117,16 @@
  */
 BOOL CLIPBOARD_RequestXSelection()
 {
+  HWND hWnd = hWndClipWindow;
+
+  if( !hWnd ) hWnd = GetActiveWindow(); 
+
   wait_for_selection=True;
   dprintf_clipboard(stddeb,"Requesting selection\n");
 
   XConvertSelection(display,XA_PRIMARY,XA_STRING,
                     XInternAtom(display,"PRIMARY_TEXT",False),
-                    WIN_GetXWindow(hWndClipWindow),CurrentTime);
+                    WIN_GetXWindow(hWnd),CurrentTime);
 
   /* TODO: need time-out for broken clients */
   while(wait_for_selection) EVENT_WaitXEvent(-1);
diff --git a/misc/comm.c b/misc/comm.c
index 73811a9..a68542a 100644
--- a/misc/comm.c
+++ b/misc/comm.c
@@ -138,7 +138,7 @@
 		"BuildCommDCB: (%s), ptr %p\n", device, lpdcb);
 	commerror = 0;
 
-	if (!lstrncmpi(device,"COM",3)) {
+	if (!lstrncmpi32A(device,"COM",3)) {
 		port = device[3] - '0';
 	
 
@@ -229,7 +229,7 @@
 		"OpenComm: %s, %d, %d\n", device, cbInQueue, cbOutQueue);
 	commerror = 0;
 
-	if (!lstrncmpi(device,"COM",3)) {
+	if (!lstrncmpi32A(device,"COM",3)) {
 		port = device[3] - '0';
 
 		if (port-- == 0) {
@@ -258,7 +258,7 @@
 		}
 	} 
 	else 
-	if (!lstrncmpi(device,"LPT",3)) {
+	if (!lstrncmpi32A(device,"LPT",3)) {
 		port = device[3] - '0';
 	
 		if (!ValidLPTPort(port)) {
diff --git a/misc/commdlg.c b/misc/commdlg.c
index 95b18f9..4ca2ee7 100644
--- a/misc/commdlg.c
+++ b/misc/commdlg.c
@@ -206,13 +206,13 @@
 /***********************************************************************
  *                              FILEDLG_WMDrawItem              [internal]
  */
-static LONG FILEDLG_WMDrawItem(HWND hWnd, WPARAM wParam, LPARAM lParam)
+static LONG FILEDLG_WMDrawItem(HWND hWnd, WPARAM wParam, LPARAM lParam,int savedlg)
 {
     LPDRAWITEMSTRUCT16 lpdis = (LPDRAWITEMSTRUCT16)PTR_SEG_TO_LIN(lParam);
     char str[512];
     HBRUSH hBrush;
     HBITMAP hBitmap, hPrevBitmap;
-    BITMAP bm;
+    BITMAP16 bm;
     HDC hMemDC;
 
     str[0]=0;
@@ -222,6 +222,14 @@
 	FillRect16(lpdis->hDC, &lpdis->rcItem, hBrush);
 	SendMessage16(lpdis->hwndItem, LB_GETTEXT, lpdis->itemID, 
                       (LPARAM)MAKE_SEGPTR(str));
+
+	if (savedlg)       /* use _gray_ text in FileSaveDlg */
+	  if (!lpdis->itemState)
+	    SetTextColor(lpdis->hDC,GetSysColor(COLOR_GRAYTEXT) );
+	  else  
+	    SetTextColor(lpdis->hDC,GetSysColor(COLOR_WINDOWTEXT) );
+	    /* inversion of gray would be bad readable */	  	  
+
 	TextOut16(lpdis->hDC, lpdis->rcItem.left, lpdis->rcItem.top,
                   str, strlen(str));
 	if (lpdis->itemState != 0) {
@@ -238,7 +246,7 @@
                       (LPARAM)MAKE_SEGPTR(str));
 
 	hBitmap = hFolder;
-	GetObject(hBitmap, sizeof(BITMAP), (LPSTR)&bm);
+	GetObject16( hBitmap, sizeof(bm), &bm );
 	TextOut16(lpdis->hDC, lpdis->rcItem.left + bm.bmWidth, 
                   lpdis->rcItem.top, str, strlen(str));
 	hMemDC = CreateCompatibleDC(lpdis->hDC);
@@ -266,7 +274,7 @@
         case TYPE_NETWORK:
         default:           hBitmap = hHDisk; break;
         }
-	GetObject(hBitmap, sizeof(BITMAP), (LPSTR)&bm);
+	GetObject16( hBitmap, sizeof(bm), &bm );
 	TextOut16(lpdis->hDC, lpdis->rcItem.left + bm.bmWidth, 
                   lpdis->rcItem.top, str, strlen(str));
 	hMemDC = CreateCompatibleDC(lpdis->hDC);
@@ -288,11 +296,11 @@
  */
 static LONG FILEDLG_WMMeasureItem(HWND hWnd, WPARAM wParam, LPARAM lParam) 
 {
-    BITMAP bm;
-    LPMEASUREITEMSTRUCT lpmeasure;
+    BITMAP16 bm;
+    LPMEASUREITEMSTRUCT16 lpmeasure;
     
-    GetObject(hFolder2, sizeof(BITMAP), (LPSTR)&bm);
-    lpmeasure = (LPMEASUREITEMSTRUCT)PTR_SEG_TO_LIN(lParam);
+    GetObject16( hFolder2, sizeof(bm), &bm );
+    lpmeasure = (LPMEASUREITEMSTRUCT16)PTR_SEG_TO_LIN(lParam);
     lpmeasure->itemHeight = bm.bmHeight;
     return TRUE;
 }
@@ -512,7 +520,7 @@
       if (lRet == LB_ERR) return TRUE;
       lpofn->nFilterIndex = lRet + 1;
       dprintf_commdlg(stddeb,"commdlg: lpofn->nFilterIndex=%ld\n", lpofn->nFilterIndex);
-      lstrcpyn(tmpstr2, 
+      lstrcpyn32A(tmpstr2, 
 	     FILEDLG_GetFileType(PTR_SEG_TO_LIN(lpofn->lpstrCustomFilter),
 				 PTR_SEG_TO_LIN(lpofn->lpstrFilter),
 				 lRet), sizeof(tmpstr2));
@@ -526,7 +534,7 @@
 	  /* strip off the pathname */
 	  *pstr = 0;
           SetDlgItemText32A( hWnd, edt1, pstr + 1 );
-	  lstrcpyn(tmpstr2, pstr+1, sizeof(tmpstr2) );
+	  lstrcpyn32A(tmpstr2, pstr+1, sizeof(tmpstr2) );
 	  /* Should we MessageBox() if this fails? */
 	  if (!FILEDLG_ScanDir(hWnd, tmpstr)) return TRUE;
 	  strcpy(tmpstr, tmpstr2);
@@ -607,7 +615,7 @@
     case WM_MEASUREITEM:
       return FILEDLG_WMMeasureItem(hWnd, wParam, lParam);
     case WM_DRAWITEM:
-      return FILEDLG_WMDrawItem(hWnd, wParam, lParam);
+      return FILEDLG_WMDrawItem(hWnd, wParam, lParam, FALSE);
     case WM_COMMAND:
       return FILEDLG_WMCommand(hWnd, wParam, lParam);
 #if 0
@@ -651,7 +659,7 @@
       return FILEDLG_WMMeasureItem(hWnd, wParam, lParam);
     
    case WM_DRAWITEM:
-      return FILEDLG_WMDrawItem(hWnd, wParam, lParam);
+      return FILEDLG_WMDrawItem(hWnd, wParam, lParam, TRUE);
 
    case WM_COMMAND:
       return FILEDLG_WMCommand(hWnd, wParam, lParam);
@@ -1403,7 +1411,7 @@
  long editpos;
  char buffer[30];
  GetWindowText32A(hwnd,buffer,sizeof(buffer));
- m=lstrlen(buffer);
+ m=strlen(buffer);
  result=0;
 
  for (i=0;i<m;i++)
@@ -2228,7 +2236,7 @@
 /***********************************************************************
  *                FontFamilyEnumProc                       (COMMDLG.19)
  */
-int FontFamilyEnumProc(LPLOGFONT lplf ,LPTEXTMETRIC lptm, int nFontType, LPARAM lParam)
+int FontFamilyEnumProc(LPLOGFONT16 lplf, LPTEXTMETRIC16 lptm, int nFontType, LPARAM lParam)
 {
   int i;
   WORD w;
@@ -2265,7 +2273,7 @@
  *
  * Fill font style information into combobox  (without using font.c directly)
  */
-static int SetFontStylesToCombo2(HWND hwnd, HDC hdc, LPLOGFONT lplf ,LPTEXTMETRIC lptm)
+static int SetFontStylesToCombo2(HWND hwnd, HDC hdc, LPLOGFONT16 lplf ,LPTEXTMETRIC16 lptm)
 {
    #define FSTYLES 4
    struct FONTSTYLE
@@ -2304,7 +2312,7 @@
 /*************************************************************************
  *              SetFontSizesToCombo3                           [internal]
  */
-static int SetFontSizesToCombo3(HWND hwnd, LPLOGFONT lplf, LPCHOOSEFONT lpcf)
+static int SetFontSizesToCombo3(HWND hwnd, LPLOGFONT16 lplf, LPCHOOSEFONT lpcf)
 {
   int sizes[]={8,9,10,11,12,14,16,18,20,22,24,26,28,36,48,72,0};
   int h,i,j;
@@ -2335,7 +2343,7 @@
 /***********************************************************************
  *                 FontStyleEnumProc                     (COMMDLG.18)
  */
-int FontStyleEnumProc(LPLOGFONT lplf ,LPTEXTMETRIC lptm, int nFontType, LPARAM lParam)
+int FontStyleEnumProc(LPLOGFONT16 lplf ,LPTEXTMETRIC16 lptm, int nFontType, LPARAM lParam)
 {
   HWND hcmb2=LOWORD(lParam);
   HWND hcmb3=HIWORD(lParam);
@@ -2374,7 +2382,7 @@
   int i,j,res,init=0;
   long l;
   FARPROC enumCallback = MODULE_GetWndProcEntry16("FontFamilyEnumProc");
-  LPLOGFONT lpxx;
+  LPLOGFONT16 lpxx;
   HCURSOR hcursor=SetCursor(LoadCursor(0,IDC_WAIT));
   LPCHOOSEFONT lpcf;
 
@@ -2484,11 +2492,11 @@
  */
 LRESULT CFn_WMMeasureItem(HWND hDlg, WPARAM wParam, LPARAM lParam)
 {
-  BITMAP bm;
-  LPMEASUREITEMSTRUCT lpmi=PTR_SEG_TO_LIN((LPMEASUREITEMSTRUCT)lParam);
+  BITMAP16 bm;
+  LPMEASUREITEMSTRUCT16 lpmi=PTR_SEG_TO_LIN((LPMEASUREITEMSTRUCT16)lParam);
   if (!hBitmapTT)
     hBitmapTT = LoadBitmap(0, MAKEINTRESOURCE(OBM_TRTYPE));
-  GetObject(hBitmapTT, sizeof(BITMAP), (LPSTR)&bm);
+  GetObject16( hBitmapTT, sizeof(bm), &bm );
   lpmi->itemHeight=bm.bmHeight;
   /* FIXME: use MAX of bm.bmHeight and tm.tmHeight .*/
   return 0;
@@ -2502,7 +2510,7 @@
 {
   HBRUSH hBrush;
   char buffer[40];
-  BITMAP bm;
+  BITMAP16 bm;
   COLORREF cr;
   RECT16 rect;
 #if 0  
@@ -2531,9 +2539,9 @@
     case cmb1:	/* dprintf_commdlg(stddeb,"WM_Drawitem cmb1\n"); */
 		SendMessage16(lpdi->hwndItem, CB_GETLBTEXT, lpdi->itemID,
 			(LPARAM)MAKE_SEGPTR(buffer));	          
-		GetObject(hBitmapTT, sizeof(BITMAP), (LPSTR)&bm);
+		GetObject16( hBitmapTT, sizeof(bm), &bm );
 		TextOut16(lpdi->hDC, lpdi->rcItem.left + bm.bmWidth + 10,
-                          lpdi->rcItem.top, buffer, lstrlen(buffer));
+                          lpdi->rcItem.top, buffer, lstrlen16(buffer));
 #if 0
 		nFontType = SendMessage16(lpdi->hwndItem, CB_GETITEMDATA, lpdi->itemID,0L);
 		  /* FIXME: draw bitmap if truetype usage */
@@ -2553,14 +2561,14 @@
 		SendMessage16(lpdi->hwndItem, CB_GETLBTEXT, lpdi->itemID,
 			(LPARAM)MAKE_SEGPTR(buffer));
 		TextOut16(lpdi->hDC, lpdi->rcItem.left,
-                          lpdi->rcItem.top, buffer, lstrlen(buffer));
+                          lpdi->rcItem.top, buffer, lstrlen16(buffer));
 		break;
 
     case cmb4:	/* dprintf_commdlg(stddeb,"WM_DRAWITEM cmb4 (=COLOR)\n"); */
 		SendMessage16(lpdi->hwndItem, CB_GETLBTEXT, lpdi->itemID,
     		    (LPARAM)MAKE_SEGPTR(buffer));
 		TextOut16(lpdi->hDC, lpdi->rcItem.left +  25+5,
-                          lpdi->rcItem.top, buffer, lstrlen(buffer));
+                          lpdi->rcItem.top, buffer, lstrlen16(buffer));
 		cr = SendMessage16(lpdi->hwndItem, CB_GETITEMDATA, lpdi->itemID,0L);
 		hBrush = CreateSolidBrush(cr);
 		if (hBrush)
@@ -2613,7 +2621,7 @@
   long l;
   HDC hdc;
   LPCHOOSEFONT lpcf=(LPCHOOSEFONT)GetWindowLong32A(hDlg, DWL_USER); 
-  LPLOGFONT lpxx=PTR_SEG_TO_LIN(lpcf->lpLogFont);
+  LPLOGFONT16 lpxx=PTR_SEG_TO_LIN(lpcf->lpLogFont);
   
   dprintf_commdlg(stddeb,"FormatCharDlgProc // WM_COMMAND lParam=%08lX\n", lParam);
   switch (wParam)
diff --git a/misc/compobj.c b/misc/compobj.c
index 106aaed..c7c76a2 100644
--- a/misc/compobj.c
+++ b/misc/compobj.c
@@ -7,8 +7,6 @@
 /*	At the moment, these are only empty stubs.
  */
 
-#include "windows.h"
-#include "compobj.h"
 #include "ole.h"
 #include "ole2.h"
 #include "stddebug.h"
diff --git a/misc/keyboard.c b/misc/keyboard.c
index 8f8c31b..750a645 100644
--- a/misc/keyboard.c
+++ b/misc/keyboard.c
@@ -8,11 +8,123 @@
 #include <string.h>
 #include <ctype.h>
 #include "windows.h"
-#include "keyboard.h"
 #include "stddebug.h"
 /* #define DEBUG_KEYBOARD */
 #include "debug.h"
 
+
+struct KeyTableEntry {
+	int virtualkey;
+	int ASCII;
+	int scancode;
+	const char *name;
+};
+
+static const struct KeyTableEntry KeyTable[] =
+{
+	{ 0x3, 0x3, 0x0, "" },
+	{ 0x8, 0x8, 0xe, "Backspace" },
+	{ 0x9, 0x9, 0xf, "Tab" },
+	{ 0xc, 0x0, 0x4c, "Num 5" },
+	{ 0xd, 0xd, 0x1c, "Enter" },
+	{ 0x10, 0x0, 0x2a, "Shift" },
+	{ 0x11, 0x0, 0x1d, "Ctrl" },
+	{ 0x12, 0x0, 0x38, "Alt" },
+	{ 0x14, 0x0, 0x3a, "Caps Lock" },
+	{ 0x1b, 0x1b, 0x1, "Esc" },
+	{ 0x20, 0x20, 0x39, "Space" },
+	{ 0x21, 0x0, 0x49, "Num 9" },
+	{ 0x22, 0x0, 0x51, "Num 3" },
+	{ 0x23, 0x0, 0x4f, "Num 1" },
+	{ 0x24, 0x0, 0x47, "Num 7" },
+	{ 0x25, 0x0, 0x4b, "Num 4" },
+	{ 0x26, 0x0, 0x48, "Num 8" },
+	{ 0x27, 0x0, 0x4d, "Num 6" },
+	{ 0x28, 0x0, 0x50, "Num 2" },
+	{ 0x2d, 0x0, 0x52, "Num 0" },
+	{ 0x2e, 0x0, 0x53, "Num Del" },
+	{ 0x30, 0x30, 0xb, "0" },
+	{ 0x31, 0x31, 0x2, "1" },
+	{ 0x32, 0x32, 0x3, "2" },
+	{ 0x33, 0x33, 0x4, "3" },
+	{ 0x34, 0x34, 0x5, "4" },
+	{ 0x35, 0x35, 0x6, "5" },
+	{ 0x36, 0x36, 0x7, "6" },
+	{ 0x37, 0x37, 0x8, "7" },
+	{ 0x38, 0x38, 0x9, "8" },
+	{ 0x39, 0x39, 0xa, "9" },
+	{ 0x41, 0x41, 0x1e, "A" },
+	{ 0x42, 0x42, 0x30, "B" },
+	{ 0x43, 0x43, 0x2e, "C" },
+	{ 0x44, 0x44, 0x20, "D" },
+	{ 0x45, 0x45, 0x12, "E" },
+	{ 0x46, 0x46, 0x21, "F" },
+	{ 0x47, 0x47, 0x22, "G" },
+	{ 0x48, 0x48, 0x23, "H" },
+	{ 0x49, 0x49, 0x17, "I" },
+	{ 0x4a, 0x4a, 0x24, "J" },
+	{ 0x4b, 0x4b, 0x25, "K" },
+	{ 0x4c, 0x4c, 0x26, "L" },
+	{ 0x4d, 0x4d, 0x32, "M" },
+	{ 0x4e, 0x4e, 0x31, "N" },
+	{ 0x4f, 0x4f, 0x18, "O" },
+	{ 0x50, 0x50, 0x19, "P" },
+	{ 0x51, 0x51, 0x10, "Q" },
+	{ 0x52, 0x52, 0x13, "R" },
+	{ 0x53, 0x53, 0x1f, "S" },
+	{ 0x54, 0x54, 0x14, "T" },
+	{ 0x55, 0x55, 0x16, "U" },
+	{ 0x56, 0x56, 0x2f, "V" },
+	{ 0x57, 0x57, 0x11, "W" },
+	{ 0x58, 0x58, 0x2d, "X" },
+	{ 0x59, 0x59, 0x15, "Y" },
+	{ 0x5a, 0x5a, 0x2c, "Z" },
+	{ 0x60, 0x0, 0x52, "Num 0" },
+	{ 0x61, 0x0, 0x4f, "Num 1" },
+	{ 0x62, 0x0, 0x50, "Num 2" },
+	{ 0x63, 0x0, 0x51, "Num 3" },
+	{ 0x64, 0x0, 0x4b, "Num 4" },
+	{ 0x65, 0x0, 0x4c, "Num 5" },
+	{ 0x66, 0x0, 0x4d, "Num 6" },
+	{ 0x67, 0x0, 0x47, "Num 7" },
+	{ 0x68, 0x0, 0x48, "Num 8" },
+	{ 0x69, 0x0, 0x49, "Num 9" },
+	{ 0x6a, 0x2a, 0x37, "Num *" },
+	{ 0x6b, 0x2b, 0x4e, "Num +" },
+	{ 0x6c, 0x0, 0x0, "" },
+	{ 0x6d, 0x2d, 0x4a, "Num -" },
+	{ 0x6e, 0x2e, 0x53, "Num Del" },
+	{ 0x6f, 0x2f, 0x0, "" },
+	{ 0x70, 0x0, 0x3b, "F1" },
+	{ 0x71, 0x0, 0x3c, "F2" },
+	{ 0x72, 0x0, 0x3d, "F3" },
+	{ 0x73, 0x0, 0x3e, "F4" },
+	{ 0x74, 0x0, 0x3f, "F5" },
+	{ 0x75, 0x0, 0x40, "F6" },
+	{ 0x76, 0x0, 0x41, "F7" },
+	{ 0x77, 0x0, 0x42, "F8" },
+	{ 0x78, 0x0, 0x43, "F9" },
+	{ 0x79, 0x0, 0x44, "F10" },
+	{ 0x7a, 0x0, 0x57, "F11" },
+	{ 0x7b, 0x0, 0x58, "F12" },
+	{ 0x90, 0x0, 0x45, "Pause" },
+	{ 0x91, 0x0, 0x46, "Scroll Lock" },
+	{ 0xba, 0x3b, 0x27, ";" },
+	{ 0xbb, 0x3d, 0xd, "=" },
+	{ 0xbc, 0x2c, 0x33, "," },
+	{ 0xbd, 0x2d, 0xc, "-" },
+	{ 0xbe, 0x2e, 0x34, "." },
+	{ 0xbf, 0x2f, 0x35, "/" },
+	{ 0xc0, 0x60, 0x29, "`" },
+	{ 0xdb, 0x5b, 0x1a, "[" },
+	{ 0xdc, 0x5c, 0x2b, "\\" },
+	{ 0xdd, 0x5d, 0x1b, "]" },
+	{ 0xde, 0x27, 0x28, "\'" },
+	{ 0xe2, 0x5c, 0x56, "\\" },
+};
+
+#define KeyTableSize	sizeof(KeyTable) / sizeof(struct KeyTableEntry)
+
 int ToAscii(WORD wVirtKey, WORD wScanCode, LPSTR lpKeyState, 
 	LPVOID lpChar, WORD wFlags) 
 {
@@ -138,7 +250,7 @@
 
 	for (i = 0 ; i != KeyTableSize ; i++) 
 		if (KeyTable[i].scancode == lParam)  {
-			lstrcpyn(lpBuffer, KeyTable[i].name, nSize);
+			lstrcpyn32A( lpBuffer, KeyTable[i].name, nSize );
 			return strlen(lpBuffer);
 		}
 
diff --git a/misc/lstr.c b/misc/lstr.c
index 5ebd79c..e01fb7f 100644
--- a/misc/lstr.c
+++ b/misc/lstr.c
@@ -60,86 +60,6 @@
 
 /* Funny to divide them between user and kernel. */
 
-/* KERNEL.89 */
-SEGPTR lstrcat( SEGPTR target, SEGPTR source )
-{
-    strcat( (char *)PTR_SEG_TO_LIN(target), (char *)PTR_SEG_TO_LIN(source) );
-    return target;
-}
-
-/* USER.430 */
-INT lstrcmp(LPCSTR str1,LPCSTR str2)
-{
-    return strcmp( str1, str2 );
-}
-
-/* USER.471 */
-INT lstrcmpi( LPCSTR str1, LPCSTR str2 )
-{
-    INT res;
-
-    while (*str1)
-    {
-        if ((res = toupper(*str1) - toupper(*str2)) != 0) return res;
-        str1++;
-        str2++;
-    }
-    return toupper(*str1) - toupper(*str2);
-}
-
-/* Not a Windows API*/
-INT lstrncmpi( LPCSTR str1, LPCSTR str2, int n )
-{
-    INT res;
-
-    if (!n) return 0;
-    while ((--n > 0) && *str1)
-    {
-        if ((res = toupper(*str1) - toupper(*str2)) != 0) return res;
-        str1++;
-        str2++;
-    }
-    return toupper(*str1) - toupper(*str2);
-}
-
-/* KERNEL.88 */
-SEGPTR lstrcpy( SEGPTR target, SEGPTR source )
-{
-    strcpy( (char *)PTR_SEG_TO_LIN(target), (char *)PTR_SEG_TO_LIN(source) );
-    return target;
-}
-
-/* KERNEL.353 32-bit version*/
-LPSTR lstrcpyn( LPSTR dst, LPCSTR src, int n )
-{
-    char *tmp = dst;
-    while(n-- > 1 && *src)
-    	*tmp++ = *src++;
-    *tmp = 0;
-    return dst;
-}
-
-/* KERNEL.353 16-bit version*/
-SEGPTR WIN16_lstrcpyn( SEGPTR target, SEGPTR source, WORD n )
-{
-    lstrcpyn((char *)PTR_SEG_TO_LIN(target), (char *)PTR_SEG_TO_LIN(source),n);
-    return target;
-}
-
-/* KERNEL.90 */
-INT lstrlen(LPCSTR str)
-{
-  /* looks weird, but win3.1 KERNEL got a GeneralProtection handler
-   * in lstrlen() ... we check only for NULL pointer reference.
-   * - Marcus Meissner
-   */
-  if (str==NULL) {
-  	fprintf(stddeb,"lstrlen(NULL) caught, returning 0.\n");
-  	return 0;
-  }
-  return strlen(str);
-}
-
 /* IsCharAlpha USER 433 */
 BOOL IsCharAlpha(char ch)
 {
@@ -335,111 +255,5 @@
     module = MODULE_GetModuleName( GetExePtr(GetCurrentTask()) );
     fprintf( stderr, "OutputDebugString: %s says '%s'\n",
              module ? module : "???", buffer );
-             
-}
-
-
-/***********************************************************************
- *           wsprintf   (USER.420)
- */
-#ifndef WINELIB
-int wsprintf( LPSTR dummy1, LPSTR dummy2, ... )
-{
-    LPSTR lpOutput, lpFormat;
-    DWORD *win_stack = (DWORD *)CURRENT_STACK16->args;
-
-    lpOutput = (LPSTR) PTR_SEG_TO_LIN(*win_stack);
-    win_stack++;
-    lpFormat = (LPSTR) PTR_SEG_TO_LIN(*win_stack);
-    win_stack++;
-
-    return wvsprintf( lpOutput, lpFormat, (LPCSTR)win_stack );
-}
-#else  /* WINELIB */
-int wsprintf(LPSTR lpOutput, LPSTR lpFormat, ...)
-{
-    va_list valist;
-    int ArgCnt;
-
-    va_start(valist, lpFormat);
-    ArgCnt = vsprintf(lpOutput, lpFormat, valist);
-    va_end(valist);
-
-    return ArgCnt;
-}
-#endif  /* WINELIB */
-
-
-/***********************************************************************
- *           wvsprintf   (USER.421)
- */
-int wvsprintf( LPSTR buf, LPCSTR format, LPCSTR args )
-{
-    LPCSTR ptr;
-    DWORD stack[512], *stack_ptr;
-    BOOL fLarge;
-
-    /* Create the 32-bit stack for libc's vsprintf() */
-
-    for (stack_ptr = stack, ptr = format; *ptr; ptr++)
-    {
-        if (*ptr != '%' || *++ptr == '%')
-            continue;
-
-        /* skip width/precision */
-        while (*ptr == '-' || *ptr == '+' || *ptr == '.' ||
-               *ptr == ' ' || isdigit(*ptr) || *ptr == '#')
-            ptr++;
-
-        /* handle modifier */
-        fLarge = ((*ptr == 'l') || (*ptr == 'L'));
-        if (fLarge) ptr++;
-
-        switch (*ptr)
-        {
-        case 's':
-            *stack_ptr++ = (DWORD)PTR_SEG_TO_LIN(*(DWORD*)args);
-            args += sizeof(DWORD);
-            break;
-
-        case 'c':
-/* windows' wsprintf() %c ignores 0's, we replace 0 with SPACE to make sure
-   that the remaining part of the string isn't ignored by the winapp */
-            *stack_ptr++ = (DWORD)(*(WORD*)args ? *(WORD*)args : ' ');
-            args += sizeof(WORD);
-            break;
-
-        case 'd':
-        case 'i':
-            if (!fLarge)
-            {
-                *stack_ptr++ = (DWORD)(INT32)(*(INT16 *)args);
-                args += sizeof(INT16);
-                break;
-            }
-            /* else fall through */
-        case 'u':
-        case 'x':
-        case 'X':
-            if (fLarge)
-            {
-                *stack_ptr++ = *(DWORD*)args;
-                args += sizeof(DWORD);
-            }
-            else
-            {
-                *stack_ptr++ = *(WORD*)args;
-                args += sizeof(WORD);
-            }
-            break;
-
-        default:
-            *stack_ptr++ = 0;
-            args += sizeof(WORD);
-            fprintf( stderr, "wsprintf: oops, unknown format %c!\n", *ptr );
-            break;
-        }
-    }
-
-    return vsprintf( buf, format, stack );
+    free( buffer );
 }
diff --git a/misc/lzexpand.c b/misc/lzexpand.c
index 4b4b500..e907bfd 100644
--- a/misc/lzexpand.c
+++ b/misc/lzexpand.c
@@ -21,6 +21,12 @@
 #include "stddebug.h"
 #include "debug.h"
 #include "xmalloc.h"
+#include "string32.h"
+
+#define strdupW2A(x)	STRING32_DupUniToAnsi(x)
+#define strdupA2W(x)	STRING32_DupAnsiToUni(x)
+#define strcpyWA(a,b)	STRING32_UniToAnsi(a,b)
+#define strcpyAW(a,b)	STRING32_AnsiToUni(a,b)
 
 /* The readahead length of the decompressor. Reading single bytes
  * using _lread() would be SLOW.
@@ -64,7 +70,7 @@
 #define GET(lzs,b)	_lzget(lzs,&b)
 #define GET_FLUSH(lzs)	lzs->getcur=lzs->getlen;
 
-int
+static int
 _lzget(struct lzstate *lzs,BYTE *b) {
 	if (lzs->getcur<lzs->getlen) {
 		*b		= lzs->get[lzs->getcur++];
@@ -113,16 +119,16 @@
 	return 1;
 }
 /* 
- * LZSTART							[LZEXPAND.7] 
+ * LZStart				[LZEXPAND.7] [LZ32.6]
  */
-INT
-LZStart(void) {
-	dprintf_file(stddeb,"LZStart(void)\n");
-	return 1;
+INT16 LZStart(void)
+{
+    dprintf_file(stddeb,"LZStart(void)\n");
+    return 1;
 }
 
 /*
- * LZINIT							[LZEXPAND.3]
+ * LZInit				[LZEXPAND.3] [LZ32.2]
  * 
  * initializes internal decompression buffers, returns lzfiledescriptor.
  * (return value the same as hfSrc, if hfSrc is not compressed)
@@ -166,7 +172,7 @@
 }
 
 /*
- * LZDone					[LZEXPAND.9] 
+ * LZDone				[LZEXPAND.9]  [LZ32.8]
  */
 
 void
@@ -175,7 +181,7 @@
 }
 
 /*
- * GetExpandedName				[LZEXPAND.10]
+ * GetExpandedName			[LZEXPAND.10]
  *
  * gets the full filename of the compressed file 'in' by opening it
  * and reading the header
@@ -185,8 +191,8 @@
  * "FILE.BL_" (with lastchar 'a') is being translated to "FILE.BLA"
  */
 
-INT
-GetExpandedName(LPCSTR in,LPSTR out) {
+INT16
+GetExpandedName16(LPCSTR in,LPSTR out) {
 	struct lzfileheader	head;
 	HFILE		fd;
 	OFSTRUCT	ofs;
@@ -252,27 +258,58 @@
 	return 1;
 }
 
+/* 
+ * GetExpandedNameW			[LZ32.11] 
+ */
+INT32
+GetExpandedName32W(LPCWSTR in,LPWSTR out) {
+	char	*xin,*xout;
+	INT32	ret;
+
+	xout	= malloc(lstrlen32W(in)+3);
+	xin	= strdupW2A(in);
+	ret	= GetExpandedName16(xin,xout);
+	if (ret>0)
+		strcpyAW(out,xout);
+	free(xin);
+	free(xout);
+	return	ret;
+}
+
+/* 
+ * GetExpandedNameA			[LZ32.9] 
+ */
+INT32
+GetExpandedName32A(LPCSTR in,LPSTR out) {
+	return	GetExpandedName16(in,out);
+}
+
 /*
- * LZRead				[LZEXPAND.5]
+ * LZRead				[LZEXPAND.5] [LZ32.4]
  * just as normal read, but reads from LZ special fd and uncompresses.
  */
-INT
-LZRead(HFILE fd,SEGPTR segbuf,WORD toread) {
+INT16
+LZRead16(HFILE fd,SEGPTR segbuf,UINT16 toread) {
+	dprintf_file(stddeb,"LZRead16(%d,%08lx,%d)\n",fd,(DWORD)segbuf,toread);
+	return LZRead32(fd,(LPBYTE)PTR_SEG_TO_LIN(segbuf),toread);
+}
+
+INT32
+LZRead32(HFILE fd,LPVOID vbuf,UINT32 toread) {
 	int	i,howmuch;
-	BYTE	b;
-	BYTE	*buf;
+	BYTE	b,*buf;
 	struct	lzstate	*lzs;
 
-	dprintf_file(stddeb,"LZRead(%d,%08lx,%d)\n",fd,(DWORD)segbuf,toread);
+	buf=(LPBYTE)vbuf;
+	dprintf_file(stddeb,"LZRead32(%d,%p,%d)\n",fd,buf,toread);
 	howmuch=toread;
 	for (i=0;i<nroflzstates;i++)
 		if (lzstates[i].lzfd==fd)
 			break;
 	if (i==nroflzstates)
-		return _lread(fd,segbuf,toread);
+		return FILE_Read(fd,buf,toread);
 	lzs=lzstates+i;
 
-
 /* The decompressor itself is in a define, cause we need it twice
  * in this function. (the decompressed byte will be in b)
  */
@@ -339,7 +376,6 @@
 		}
 	}
 
-	buf=PTR_SEG_TO_LIN(segbuf);
 	while (howmuch) {
 		DECOMPRESS_ONE_BYTE;
 		lzs->realwanted++;
@@ -351,13 +387,13 @@
 }
 
 /* 
- * LZSeek				[LZEXPAND.4]
+ * LZSeek				[LZEXPAND.4] [LZ32.3]
  *
  * works as the usual _llseek
  */
 
 LONG
-LZSeek(HFILE fd,LONG off,INT type) {
+LZSeek(HFILE fd,LONG off,INT32 type) {
 	int	i;
 	struct	lzstate	*lzs;
 	LONG	lastwanted,newwanted;
@@ -392,7 +428,7 @@
 }
 
 /* 
- * LZCopy				[LZEXPAND.1]
+ * LZCopy			[LZEXPAND.1] [LZ32.0]
  *
  * Copies everything from src to dest
  * if src is a LZ compressed file, it will be uncompressed.
@@ -404,7 +440,7 @@
 	LONG	len;
 #define BUFLEN	1000
 	BYTE	buf[BUFLEN];
-	INT	(*xread)(HFILE,SEGPTR,WORD);
+	INT32	(*xread)(HFILE,LPVOID,UINT32);
 
 	dprintf_file(stddeb,"LZCopy(%d,%d)\n",src,dest);
 	for (i=0;i<nroflzstates;i++)
@@ -413,12 +449,12 @@
 
 	/* not compressed? just copy */
 	if (i==nroflzstates)
-		xread=_lread;
+		xread=FILE_Read;
 	else
-		xread=LZRead;
+		xread=LZRead32;
 	len=0;
 	while (1) {
-		ret=xread(src,MAKE_SEGPTR(buf),BUFLEN);
+		ret=xread(src,buf,BUFLEN);
 		if (ret<=0) {
 			if (ret==0)
 				break;
@@ -440,7 +476,7 @@
  * Opens a file. If not compressed, open it as a normal file.
  */
 HFILE
-LZOpenFile(LPCSTR fn,LPOFSTRUCT ofs,UINT mode) {
+LZOpenFile16(LPCSTR fn,LPOFSTRUCT ofs,UINT16 mode) {
 	HFILE	fd,cfd;
 
 	dprintf_file(stddeb,"LZOpenFile(%s,%p,%d)\n",fn,ofs,mode);
@@ -456,8 +492,37 @@
 	return cfd;
 }
 
+/* 
+ * LZOpenFileA				[LZ32.1]
+ */
+HFILE
+LZOpenFile32A(LPCSTR fn,LPOFSTRUCT ofs,UINT32 mode) {
+	return LZOpenFile16(fn,ofs,mode);
+}
+
+/* 
+ * LZOpenFileW				[LZ32.10]
+ */
+HFILE
+LZOpenFile32W(LPCWSTR fn,LPOFSTRUCT ofs,UINT32 mode) {
+	LPSTR	xfn;
+	LPWSTR	yfn;
+	HFILE	ret;
+
+	xfn	= strdupW2A(fn);
+	ret	= LZOpenFile16(xfn,ofs,mode);
+	free(xfn);
+	if (ret!=HFILE_ERROR) {
+		/* ofs->szPathName is an array with the OFSTRUCT */
+		yfn 	= strdupA2W(ofs->szPathName);
+		memcpy(ofs->szPathName,yfn,lstrlen32W(yfn)*2+2);
+		free(yfn);
+	}
+	return	ret;
+}
+
 /*
- * LZClose				[LZEXPAND.6]
+ * LZClose			[LZEXPAND.6] [LZ32.5]
  */
 void
 LZClose(HFILE fd) {
@@ -480,7 +545,7 @@
 }
 
 /*
- * CopyLZFile					[LZEXPAND.8]
+ * CopyLZFile				[LZEXPAND.8] [LZ32.7]
  *
  * Copy src to dest (including uncompressing src).
  * NOTE: Yes. This is exactly the same function as LZCopy.
diff --git a/misc/main.c b/misc/main.c
index 85455f7..adc8255 100644
--- a/misc/main.c
+++ b/misc/main.c
@@ -26,6 +26,8 @@
 #include "options.h"
 #include "desktop.h"
 #include "shell.h"
+#include "winbase.h"
+#include "string32.h"
 #define DEBUG_DEFINE_VARIABLES
 #include "stddebug.h"
 #include "debug.h"
@@ -53,7 +55,7 @@
 "Jan Willamowius, Carl Williams, Karl Guenter Wuensch, Eric Youngdale, "
 "and James Youngman. ";
 
-const char *langNames[] =
+const char * langNames[] =
 {
     "En",  /* LANG_En */
     "Es",  /* LANG_Es */
@@ -87,6 +89,9 @@
 int screenWidth = 0, screenHeight = 0;  /* Desktop window dimensions */
 int screenDepth = 0;  /* Screen depth to use */
 int desktopX = 0, desktopY = 0;  /* Desktop window position (if any) */
+int getVersion16 = 0;
+int getVersion32 = 0;
+OSVERSIONINFO32A getVersionEx;
 
 struct options Options =
 {  /* default options */
@@ -128,7 +133,8 @@
     { "-dll",           ".dll",             XrmoptionSepArg, (caddr_t)NULL },
     { "-allowreadonly", ".allowreadonly",   XrmoptionNoArg,  (caddr_t)"on" },
     { "-mode",          ".mode",            XrmoptionSepArg, (caddr_t)NULL },
-    { "-managed",       ".managed",         XrmoptionNoArg,  (caddr_t)"off"}
+    { "-managed",       ".managed",         XrmoptionNoArg,  (caddr_t)"off"},
+    { "-winver",        ".winver",          XrmoptionSepArg, (caddr_t)NULL }
 };
 
 #define NB_OPTIONS  (sizeof(optionsTable) / sizeof(optionsTable[0]))
@@ -153,7 +159,8 @@
   "    -mode mode      Start Wine in a particular mode (standard or enhanced)\n" \
   "    -name name      Set the application name\n" \
   "    -privatemap     Use a private color map\n" \
-  "    -synchronous    Turn on synchronous display mode\n"
+  "    -synchronous    Turn on synchronous display mode\n" \
+  "    -winver         Version to imitate (one of win31,win95,nt351)\n"
 
 
 
@@ -237,7 +244,7 @@
       l=strchr(options,',')-options;
     else
       l=strlen(options);
-    if (!lstrncmpi(options+1,"all",l-1))
+    if (!lstrncmpi32A(options+1,"all",l-1))
       {
 	int i;
 	for (i=0;i<sizeof(debug_msg_enabled)/sizeof(short);i++)
@@ -247,7 +254,7 @@
       {
 	int i;
 	for (i=0;i<sizeof(debug_msg_enabled)/sizeof(short);i++)
-	  if (debug_msg_name && (!lstrncmpi(options+1,debug_msg_name[i],l-1)))
+	  if (debug_msg_name && (!lstrncmpi32A(options+1,debug_msg_name[i],l-1)))
 	    {
 	      debug_msg_enabled[i]=(*options=='+');
 	      break;
@@ -279,7 +286,7 @@
     Options.language = LANG_En;  /* First language */
     for (p = langNames; *p; p++)
     {
-        if (!lstrcmpi( *p, arg )) return;
+        if (!lstrcmpi32A( *p, arg )) return;
         Options.language++;
     }
     fprintf( stderr, "Invalid language specified '%s'. Supported languages are: ", arg );
@@ -296,8 +303,8 @@
  */
 static void MAIN_ParseModeOption( char *arg )
 {
-    if (!lstrcmpi("enhanced", arg)) Options.mode = MODE_ENHANCED;
-    else if (!lstrcmpi("standard", arg)) Options.mode = MODE_STANDARD;
+    if (!lstrcmpi32A("enhanced", arg)) Options.mode = MODE_ENHANCED;
+    else if (!lstrcmpi32A("standard", arg)) Options.mode = MODE_STANDARD;
     else
     {
         fprintf(stderr, "Invalid mode '%s' specified.\n", arg);
@@ -306,6 +313,47 @@
     }
 }
 
+/**********************************************************************
+ *           MAIN_ParseVersion
+ */
+static void MAIN_ParseVersion( char *arg )
+{
+    /* If you add any other options, 
+       verify the values you return on the real thing */
+    if(strcmp(arg,"win31")==0) 
+    {
+        getVersion16 = 0x06160A03;
+        /* FIXME: My Win32s installation failed to execute the
+           MSVC 4 test program. So check these values */
+        getVersion32 = 0x80000A03;
+        getVersionEx.dwMajorVersion=3;
+        getVersionEx.dwMinorVersion=10;
+        getVersionEx.dwBuildNumber=0;
+        getVersionEx.dwPlatformId=VER_PLATFORM_WIN32s;
+        strcpy(getVersionEx.szCSDVersion,"Win32s 1.3");
+    }
+    else if(strcmp(arg, "win95")==0)
+    {
+        getVersion16 = 0x07005F03;
+        getVersion32 = 0xC0000004;
+        getVersionEx.dwMajorVersion=4;
+        getVersionEx.dwMinorVersion=0;
+        getVersionEx.dwBuildNumber=0x40003B6;
+        getVersionEx.dwPlatformId=VER_PLATFORM_WIN32_WINDOWS;
+        strcpy(getVersionEx.szCSDVersion,"");
+    }
+    else if(strcmp(arg, "nt351")==0)
+    {
+        getVersion16 = 0x05000A03;
+        getVersion32 = 0x04213303;
+        getVersionEx.dwMajorVersion=3;
+        getVersionEx.dwMinorVersion=51;
+        getVersionEx.dwBuildNumber=0x421;
+        getVersionEx.dwPlatformId=VER_PLATFORM_WIN32_NT;
+        strcpy(getVersionEx.szCSDVersion,"Service Pack 2");
+    }
+    else fprintf(stderr, "Unknown winver system code - ignored\n");
+}
 
 /***********************************************************************
  *           MAIN_ParseOptions
@@ -326,7 +374,7 @@
 #ifdef WINELIB
     /* Need to assemble command line and pass it to WinMain */
 #else
-    if (*argc < 2 || lstrcmpi(argv[1], "-h") == 0) 
+    if (*argc < 2 || lstrcmpi32A(argv[1], "-h") == 0) 
     	MAIN_Usage( argv[0] );
 #endif
 
@@ -414,6 +462,9 @@
           fprintf(stderr,"-dll not supported in libwine\n");
 #endif
       }
+
+      if(MAIN_GetResource( db, ".winver", &value))
+          MAIN_ParseVersion( (char*)value.addr );
 }
 
 
@@ -593,6 +644,7 @@
     return ret_val;
 }
 
+
 /***********************************************************************
  *           MessageBeep    (USER.104)
  */
@@ -601,14 +653,77 @@
 	XBell(display, 100);
 }
 
+
 /***********************************************************************
  *      GetVersion (KERNEL.3)
  */
 LONG GetVersion(void)
 {
+    if (getVersion16) return getVersion16;
     return MAKELONG( WINVERSION, WINDOSVER );
 }
 
+
+/***********************************************************************
+ *      GetVersion32
+ */
+LONG GetVersion32(void)
+{
+    if (getVersion32) return getVersion32;
+    return MAKELONG( 4, DOSVERSION);
+}
+
+
+/***********************************************************************
+ *      GetVersionExA
+ */
+BOOL32 GetVersionEx32A(OSVERSIONINFO32A *v)
+{
+    if(v->dwOSVersionInfoSize!=sizeof(OSVERSIONINFO32A))
+    {
+        fprintf(stddeb,"wrong OSVERSIONINFO size from app");
+        return FALSE;
+    }
+    if(!getVersion32)
+    {
+        /* Return something like NT 3.5 */
+        v->dwMajorVersion = 3;
+        v->dwMinorVersion = 5;
+        v->dwBuildNumber = 42;
+        v->dwPlatformId = VER_PLATFORM_WIN32_NT;
+        strcpy(v->szCSDVersion, "Wine is not an emulator");
+        return TRUE;
+    }
+    v->dwMajorVersion = getVersionEx.dwMajorVersion;
+    v->dwMinorVersion = getVersionEx.dwMinorVersion;
+    v->dwBuildNumber = getVersionEx.dwBuildNumber;
+    v->dwPlatformId = getVersionEx.dwPlatformId;
+    strcpy(v->szCSDVersion, getVersionEx.szCSDVersion);
+    return TRUE;
+}
+
+
+/***********************************************************************
+ *     GetVersionExW
+ */
+BOOL32 GetVersionEx32W(OSVERSIONINFO32W *v)
+{
+	OSVERSIONINFO32A v1;
+	if(v->dwOSVersionInfoSize!=sizeof(OSVERSIONINFO32W))
+	{
+		fprintf(stddeb,"wrong OSVERSIONINFO size from app");
+		return FALSE;
+	}
+	v1.dwOSVersionInfoSize=sizeof(v1);
+	GetVersionEx32A(&v1);
+	v->dwMajorVersion = v1.dwMajorVersion;
+	v->dwMinorVersion = v1.dwMinorVersion;
+	v->dwBuildNumber = v1.dwBuildNumber;
+	v->dwPlatformId = v1.dwPlatformId;
+	STRING32_AnsiToUni(v->szCSDVersion, v1.szCSDVersion);
+	return TRUE;
+}
+
 /***********************************************************************
  *	GetWinFlags (KERNEL.132)
  */
@@ -984,7 +1099,7 @@
 	        case SPI_GETICONTITLELOGFONT: 
 	        {
 		    /* FIXME GetProfileString( "?", "?", "?" ) */
-		  LPLOGFONT lpLogFont = (LPLOGFONT)lpvParam;
+		  LPLOGFONT16 lpLogFont = (LPLOGFONT16)lpvParam;
 		  lpLogFont->lfHeight = 10;
 		  lpLogFont->lfWidth = 0;
 		  lpLogFont->lfEscapement = lpLogFont->lfOrientation = 0;
@@ -1015,14 +1130,6 @@
 }
 
 /***********************************************************************
-*	HMEMCPY (KERNEL.348)
-*/
-void hmemcpy(LPVOID hpvDest, LPCVOID hpvSource, LONG cbCopy)
-{
-	memcpy(hpvDest,	hpvSource, cbCopy);
-}
-
-/***********************************************************************
 *	COPY (GDI.250)
 */
 void Copy(LPVOID lpSource, LPVOID lpDest, WORD nBytes)
diff --git a/misc/ole2nls.c b/misc/ole2nls.c
index 3f120a5..110fa55 100644
--- a/misc/ole2nls.c
+++ b/misc/ole2nls.c
@@ -665,7 +665,7 @@
 	}
 
 	if(retLen>len)retLen=len;
-	lstrcpyn(buf,retString,len);
+	lstrcpyn32A(buf,retString,len);
 	return retLen;
 }
 
@@ -690,8 +690,7 @@
 	l2 = (l2==-1)?strlen(s2):l2;
 	len = l1<l2 ? l1:l2;
 	ret = (fdwStyle & NORM_IGNORECASE) ?
-		lstrncmpi(s1,s2,len)	:
-		strncmp(s1,s2,len);
+		lstrncmpi32A(s1,s2,len)	: lstrncmp32A(s1,s2,len);
 	/* not equal, return 1 or 3 */
 	if(ret!=0)return ret+2;
 	/* same len, return 2 */
diff --git a/misc/registry.c b/misc/registry.c
index 9a71264..11fcf67 100644
--- a/misc/registry.c
+++ b/misc/registry.c
@@ -41,6 +41,31 @@
 #define KEY_REGISTRY	"Software\\The WINE team\\WINE\\Registry"
 #define VAL_SAVEUPDATED	"SaveOnlyUpdatedKeys"
 
+/* one value of a key */
+typedef struct tagKEYVALUE
+{
+    LPWSTR   name;          /* name of value (UNICODE) or NULL for win31 */
+    DWORD    type;          /* type of value */
+    DWORD    len;           /* length of data */
+    DWORD    lastmodified;  /* time of seconds since 1.1.1970 */
+    LPBYTE   data;          /* content, may be strings, binaries, etc. */
+} KEYVALUE,*LPKEYVALUE;
+
+/* a registry key */
+typedef struct tagKEYSTRUCT
+{
+    LPWSTR               keyname;       /* name of THIS key (UNICODE) */
+    DWORD                flags;         /* flags. */
+    LPWSTR               class;
+    /* values */
+    DWORD                nrofvalues;    /* nr of values in THIS key */
+    LPKEYVALUE           values;        /* values in THIS key */
+    /* key management pointers */
+    struct tagKEYSTRUCT	*next;          /* next key on same hierarchy */
+    struct tagKEYSTRUCT	*nextsub;       /* keys that hang below THIS key */
+} KEYSTRUCT, *LPKEYSTRUCT;
+
+
 static KEYSTRUCT	*key_classes_root=NULL;	/* windows 3.1 global values */
 static KEYSTRUCT	*key_current_user=NULL;	/* user specific values */
 static KEYSTRUCT	*key_local_machine=NULL;/* machine specific values */
@@ -57,10 +82,10 @@
 #define strdupA2W(x)	STRING32_DupAnsiToUni(x)
 #define strdupW2A(x)	STRING32_DupUniToAnsi(x)
 #define strdupW(x)	STRING32_strdupW(x)
-#define strcmpW(a,b)	STRING32_lstrcmpW(a,b)
+#define strcmpW(a,b)	lstrcmp32W(a,b)
 #define strcmpniW(a,b)	STRING32_lstrcmpniW(a,b)
 #define strchrW(a,c)	STRING32_lstrchrW(a,c)
-#define strlenW(a)	STRING32_UniLen(a)
+#define strlenW(a)	lstrlen32W(a)
 #define strcpyWA(a,b)	STRING32_UniToAnsi(a,b)
 
 static struct openhandle {
diff --git a/misc/shell.c b/misc/shell.c
index 6228161..1eb5f54 100644
--- a/misc/shell.c
+++ b/misc/shell.c
@@ -573,7 +573,7 @@
   UINT 	l = strlen(entry); 
   for( ; *lpEnv ; lpEnv+=strlen(lpEnv)+1 )
      {
-       if( lstrncmpi(lpEnv, entry, l) ) continue;
+       if( lstrncmpi32A(lpEnv, entry, l) ) continue;
        
        if( !*(lpEnv+l) )
          return (lpEnv + l); 		/* empty entry */
diff --git a/misc/spy.c b/misc/spy.c
index f1cbabe..f5fbd4d 100644
--- a/misc/spy.c
+++ b/misc/spy.c
@@ -18,7 +18,7 @@
 #define SPY_MAX_MSGNUM   WM_USER
 #define SPY_INDENT_UNIT  4  /* 4 spaces */
 
-static const char *MessageTypeNames[SPY_MAX_MSGNUM + 1] =
+static const char * const MessageTypeNames[SPY_MAX_MSGNUM + 1] =
 {
     "WM_NULL",			/* 0x00 */
     "WM_CREATE",	
@@ -411,7 +411,7 @@
 };
 
 
-static BOOL SPY_Exclude[SPY_MAX_MSGNUM+1] = { FALSE, };
+static BOOL SPY_Exclude[SPY_MAX_MSGNUM+1];
 static int SPY_IndentLevel  = 0;
 
 #define SPY_EXCLUDE(msg) \
diff --git a/misc/ver.c b/misc/ver.c
index 40308c1..7541a82 100644
--- a/misc/ver.c
+++ b/misc/ver.c
@@ -15,20 +15,23 @@
 #include "lzexpand.h"
 #include "module.h"
 #include "neexe.h"
-#include "stackframe.h"	/* MAKE_SEGPTR */
 #include "stddebug.h"
 #include "debug.h"
 #include "xmalloc.h"
 #include "winreg.h"
+#include "string32.h"
 
-#define LZREAD(what)	if (sizeof(*what)!=LZRead(lzfd,MAKE_SEGPTR(what),sizeof(*what))) return 0;
+#define LZREAD(what)	if (sizeof(*what)!=LZRead32(lzfd,what,sizeof(*what))) return 0;
+
+#define strdupW2A(x)	STRING32_DupUniToAnsi(x)
+#define strdupA2W(x)	STRING32_DupAnsiToUni(x)
 
 int
 read_ne_header(HFILE lzfd,struct ne_header_s *nehd) {
 	struct	mz_header_s	mzh;
 
 	LZSeek(lzfd,0,SEEK_SET);
-	if (sizeof(mzh)!=LZRead(lzfd,MAKE_SEGPTR(&mzh),sizeof(mzh)))
+	if (sizeof(mzh)!=LZRead32(lzfd,&mzh,sizeof(mzh)))
 		return 0;
 	if (mzh.mz_magic!=MZ_SIGNATURE)
 		return 0;
@@ -87,12 +90,12 @@
 				);
 				LZREAD(&len);
 				str=xmalloc(len);
-				if (len!=LZRead(lzfd,MAKE_SEGPTR(str),len))
+				if (len!=LZRead32(lzfd,str,len))
 					return 0;
 				dprintf_resource(stderr,"read %s to compare it with %s\n",
 					str,(char*)PTR_SEG_TO_LIN(typeid)
 				);
-				if (lstrcmpi(str,(char*)PTR_SEG_TO_LIN(typeid)))
+				if (lstrcmpi32A(str,(char*)PTR_SEG_TO_LIN(typeid)))
 					skipflag=1;
 				free(str);
 				LZSeek(lzfd,whereleft,SEEK_SET);
@@ -127,12 +130,12 @@
 					);
 					LZREAD(&len);
 					str=xmalloc(len);
-					if (len!=LZRead(lzfd,MAKE_SEGPTR(str),len))
+					if (len!=LZRead32(lzfd,str,len))
 						return 0;
 					dprintf_resource(stderr,"read %s to compare it with %s\n",
 						str,(char*)PTR_SEG_TO_LIN(typeid)
 					);
-					if (!lstrcmpi(str,(char*)PTR_SEG_TO_LIN(typeid)))
+					if (!lstrcmpi32A(str,(char*)PTR_SEG_TO_LIN(typeid)))
 						skipflag=0;
 					free(str);
 					LZSeek(lzfd,whereleft,SEEK_SET);
@@ -144,7 +147,7 @@
 			*off	= (int)ni.offset<<shiftcount;
 			len	= ni.length<<shiftcount;
 			rdata=(WORD*)xmalloc(len);
-			if (len!=LZRead(lzfd,MAKE_SEGPTR(rdata),len)) {
+			if (len!=LZRead32(lzfd,rdata,len)) {
 				free(rdata);
 				return 0;
 			}
@@ -156,6 +159,7 @@
 	}
 }
 
+/* GetFileResourceSize				[VER.2] */
 DWORD
 GetFileResourceSize(LPCSTR filename,SEGPTR restype,SEGPTR resid,LPDWORD off) {
 	HFILE	lzfd;
@@ -167,7 +171,7 @@
 	fprintf(stderr,"GetFileResourceSize(%s,%lx,%lx,%p)\n",
 		filename,(LONG)restype,(LONG)resid,off
 	);
-	lzfd=LZOpenFile(filename,&ofs,OF_READ);
+	lzfd=LZOpenFile16(filename,&ofs,OF_READ);
 	if (lzfd==0)
 		return 0;
 	if (!read_ne_header(lzfd,&nehd)) {
@@ -183,6 +187,7 @@
 	return reslen;
 }
 
+/* GetFileResourceSize				[VER.3] */
 DWORD
 GetFileResource(LPCSTR filename,SEGPTR restype,SEGPTR resid,
 		DWORD off,DWORD datalen,LPVOID data
@@ -196,7 +201,7 @@
 		filename,(LONG)restype,(LONG)resid,off,datalen,data
 	);
 
-	lzfd=LZOpenFile(filename,&ofs,OF_READ);
+	lzfd=LZOpenFile16(filename,&ofs,OF_READ);
 	if (lzfd==0)
 		return 0;
 	if (!off) {
@@ -213,19 +218,19 @@
 	LZSeek(lzfd,off,SEEK_SET);
 	if (reslen>datalen)
 		reslen=datalen;
-	LZRead(lzfd,MAKE_SEGPTR(data),reslen);
+	LZRead32(lzfd,data,reslen);
 	LZClose(lzfd);
 	return reslen;
 }
 
+/* GetFileVersionInfoSize			[VER.6] */
 DWORD
-GetFileVersionInfoSize(LPCSTR filename,LPDWORD handle) {
+GetFileVersionInfoSize16(LPCSTR filename,LPDWORD handle) {
 	DWORD	len,ret;
 	BYTE	buf[72];
 	VS_FIXEDFILEINFO *vffi;
 
-	fprintf(stderr,"GetFileVersionInfoSize(%s,%p)\n",filename,handle);
-
+	dprintf_resource(stderr,"GetFileVersionInfoSize16(%s,%p)\n",filename,handle);
 	len=GetFileResourceSize(filename,VS_FILE_INFO,VS_VERSION_INFO,handle);
 	if (!len)
 		return 0;
@@ -330,9 +335,29 @@
 	return len;
 }
 
+/* GetFileVersionInfoSize32A			[VERSION.1] */
+DWORD
+GetFileVersionInfoSize32A(LPCSTR filename,LPDWORD handle) {
+	dprintf_resource(stderr,"GetFileVersionInfoSize32A(%s,%p)\n",filename,handle);
+	return GetFileVersionInfoSize16(filename,handle);
+}
+
+/* GetFileVersionInfoSize32W			[VERSION.2] */
+DWORD
+GetFileVersionInfoSize32W(LPCWSTR filename,LPDWORD handle) {
+	LPSTR	xfn;
+	DWORD	ret;
+
+	xfn	= strdupW2A(filename);
+	ret=GetFileVersionInfoSize16(xfn,handle);
+	free(xfn);
+	return	ret;
+}
+
+/* GetFileVersionInfo				[VER.7] */
 DWORD 
-GetFileVersionInfo(LPCSTR filename,DWORD handle,DWORD datasize,LPVOID data) {
-	fprintf(stderr,"GetFileVersionInfo(%s,%ld,%ld,%p)\n->",
+GetFileVersionInfo16(LPCSTR filename,DWORD handle,DWORD datasize,LPVOID data) {
+	dprintf_resource(stderr,"GetFileVersionInfo16(%s,%ld,%ld,%p)\n->",
 		filename,handle,datasize,data
 	);
 	return GetFileResource(
@@ -340,10 +365,29 @@
 	);
 }
 
+/* GetFileVersionInfoA				[VERSION.0] */
 DWORD 
-VerFindFile(
-	UINT flags,LPCSTR filename,LPCSTR windir,LPCSTR appdir,
-	LPSTR curdir,UINT *curdirlen,LPSTR destdir,UINT*destdirlen
+GetFileVersionInfo32A(LPCSTR filename,DWORD handle,DWORD datasize,LPVOID data) {
+	return GetFileVersionInfo16(filename,handle,datasize,data);
+}
+
+/* GetFileVersionInfoW				[VERSION.3] */
+DWORD 
+GetFileVersionInfo32W(LPCWSTR filename,DWORD handle,DWORD datasize,LPVOID data){
+	DWORD	ret;
+	LPSTR	fn;
+
+	fn	= strdupW2A(filename);
+	ret	= GetFileVersionInfo16(fn,handle,datasize,data);
+	free(fn);
+	return	ret;
+}
+
+/* VerFindFile				[VER.8] */
+DWORD
+VerFindFile16(
+	UINT16 flags,LPCSTR filename,LPCSTR windir,LPCSTR appdir,
+	LPSTR curdir,UINT16 *curdirlen,LPSTR destdir,UINT16 *destdirlen
 ) {
 	fprintf(stderr,"VerFindFile(%x,%s,%s,%s,%p,%d,%p,%d)\n",
 		flags,filename,windir,appdir,curdir,*curdirlen,destdir,*destdirlen
@@ -355,21 +399,88 @@
 	return 0;
 }
 
+/* VerFindFileA						[VERSION.5] */
 DWORD
-VerInstallFile(
-	UINT flags,LPCSTR srcfilename,LPCSTR destfilename,LPCSTR srcdir,
-	LPCSTR destdir,LPSTR tmpfile,UINT*tmpfilelen
+VerFindFile32A(
+	UINT32 flags,LPCSTR filename,LPCSTR windir,LPCSTR appdir,
+	LPSTR curdir,UINT32 *curdirlen,LPSTR destdir,UINT32 *destdirlen
+) {
+	return VerFindFile16(flags,filename,windir,appdir,curdir,curdirlen,destdir,destdirlen);
+}
+
+/* VerFindFileW						[VERSION.6] */
+DWORD
+VerFindFile32W(
+	UINT32 flags,LPCWSTR filename,LPCWSTR windir,LPCWSTR appdir,
+	LPWSTR curdir,UINT32 *curdirlen,LPWSTR destdir,UINT32 *destdirlen
+) {
+	LPSTR	wfn,wwd,wad,wdd,wcd;
+	DWORD	ret;
+
+	wfn = strdupW2A(filename);
+	wwd = strdupW2A(windir);
+	wad = strdupW2A(appdir);
+	wcd = (LPSTR)malloc(*curdirlen);
+	wdd = (LPSTR)malloc(*destdirlen);
+	ret=VerFindFile16(flags,wfn,wwd,wad,wcd,curdirlen,wdd,destdirlen);
+	STRING32_AnsiToUni(curdir,wcd);
+	STRING32_AnsiToUni(destdir,wdd);
+	*curdirlen	= strlen(wcd);
+	*destdirlen	= strlen(wdd);
+	return ret;
+}
+
+/* VerInstallFile					[VER.9] */
+DWORD
+VerInstallFile16(
+	UINT16 flags,LPCSTR srcfilename,LPCSTR destfilename,LPCSTR srcdir,
+	LPCSTR destdir,LPSTR tmpfile,UINT16 *tmpfilelen
 ) {
 	fprintf(stderr,"VerInstallFile(%x,%s,%s,%s,%s,%p,%d)\n",
 		flags,srcfilename,destfilename,srcdir,destdir,tmpfile,*tmpfilelen
 	);
+
+	/* FIXME: Implementation still missing .... */
+
 	return VIF_SRCOLD;
 }
 
+/* VerFindFileA					[VERSION.5] */
+DWORD
+VerInstallFile32A(
+	UINT32 flags,LPCSTR srcfilename,LPCSTR destfilename,LPCSTR srcdir,
+	LPCSTR destdir,LPSTR tmpfile,UINT32 *tmpfilelen
+) {
+	return VerInstallFile16(flags,srcfilename,destfilename,srcdir,destdir,tmpfile,tmpfilelen);
+}
+
+/* VerFindFileW					[VERSION.6] */
+DWORD
+VerInstallFile32W(
+	UINT32 flags,LPCWSTR srcfilename,LPCWSTR destfilename,LPCWSTR srcdir,
+	LPCWSTR destdir,LPWSTR tmpfile,UINT32 *tmpfilelen
+) {
+	LPSTR	wsrcf,wsrcd,wdestf,wdestd,wtmpf;
+	DWORD	ret;
+
+	wsrcf	= strdupW2A(srcfilename);
+	wsrcd	= strdupW2A(srcdir);
+	wdestf	= strdupW2A(destfilename);
+	wdestd	= strdupW2A(destdir);
+	wtmpf	= strdupW2A(tmpfile);
+	ret=VerInstallFile32A(flags,wsrcf,wdestf,wsrcd,wdestd,wtmpf,tmpfilelen);
+	free(wsrcf);
+	free(wsrcd);
+	free(wdestf);
+	free(wdestd);
+	free(wtmpf);
+	return ret;
+}
+
 /* FIXME: This table should, of course, be language dependend */
-static struct map_id2str {
+static const struct map_id2str {
 	UINT	langid;
-	char	*langname;
+	const char *langname;
 } languages[]={
 	{0x0401,"Arabisch"},
 	{0x0402,"Bulgarisch"},
@@ -419,12 +530,23 @@
 	{0x0000,"Unbekannt"},
 };
 
-
+/* VerLanguageName				[VER.10] */
 DWORD
-VerLanguageName(UINT langid,LPSTR langname,UINT langnamelen) {
+VerLanguageName16(UINT16 langid,LPSTR langname,UINT16 langnamelen) {
 	int	i;
+	char	*buf;
 
 	fprintf(stderr,"VerLanguageName(%d,%p,%d)\n",langid,langname,langnamelen);
+	/* First, check \System\CurrentControlSet\control\Nls\Locale\<langid>
+	 * from the registry. 
+	 */
+	buf=(char*)malloc(strlen("\\System\\CurrentControlSet\\control\\Nls\\Locale\\")+9);
+	sprintf(buf,"\\System\\CurrentControlSet\\control\\Nls\\Locale\\%08x",langid);
+	if (ERROR_SUCCESS==RegQueryValue16(HKEY_LOCAL_MACHINE,buf,langname,(LPDWORD)&langnamelen)) {
+		langname[langnamelen-1]='\0';
+		return langnamelen;
+	}
+	/* if that fails, use the interal table */
 	for (i=0;languages[i].langid!=0;i++)
 		if (langid==languages[i].langid)
 			break;
@@ -433,6 +555,45 @@
 	return strlen(languages[i].langname);
 }
 
+/* VerLanguageNameA				[VERSION.9] */
+DWORD
+VerLanguageName32A(UINT32 langid,LPSTR langname,UINT32 langnamelen) {
+	return VerLanguageName16(langid,langname,langnamelen);
+}
+
+/* VerLanguageNameW				[VERSION.10] */
+DWORD
+VerLanguageName32W(UINT32 langid,LPWSTR langname,UINT32 langnamelen) {
+	int	i;
+	char	*buf;
+	LPWSTR	keyname,result;
+
+	/* First, check \System\CurrentControlSet\control\Nls\Locale\<langid>
+	 * from the registry. 
+	 */
+	buf=(char*)malloc(strlen("\\System\\CurrentControlSet\\control\\Nls\\Locale\\")+9);
+	sprintf(buf,"\\System\\CurrentControlSet\\control\\Nls\\Locale\\%08x",langid);
+	keyname=strdupA2W(buf);free(buf);
+	if (ERROR_SUCCESS==RegQueryValue32W(HKEY_LOCAL_MACHINE,keyname,langname,(LPDWORD)&langnamelen)) {
+		free(keyname);
+		return langnamelen;
+	}
+	free(keyname);
+	/* if that fails, use the interal table */
+	for (i=0;languages[i].langid!=0;i++)
+		if (langid==languages[i].langid)
+			break;
+	result=strdupA2W(languages[i].langname);
+	i=lstrlen32W(result)*sizeof(WCHAR);
+	if (i>langnamelen)
+		i=langnamelen;
+	memcpy(langname,result,i);
+	langname[langnamelen-1]='\0';
+	free(result);
+	return strlen(languages[i].langname); /* same as strlenW(result); */
+}
+
+/* FIXME: UNICODE? */
 struct db {
 	WORD	nextoff;
 	WORD	datalen;
@@ -484,17 +645,18 @@
 		}
 		block=block+((db->nextoff+3)&~3);
 	}
-
 }
 
+/* VerQueryValue 			[VER.11] */
 /* take care, 'buffer' is NOT a SEGPTR, it just points to one */
 DWORD
-VerQueryValue(SEGPTR segblock,LPCSTR subblock,SEGPTR *buffer,UINT *buflen) {
+VerQueryValue16(SEGPTR segblock,LPCSTR subblock,SEGPTR *buffer,UINT16 *buflen)
+{
 	BYTE	*block=PTR_SEG_TO_LIN(segblock),*b;
 	struct	db	*db;
 	char	*s;
 
-	fprintf(stderr,"VerQueryValue(%p,%s,%p,%d)\n",
+	fprintf(stderr,"VerQueryValue16(%p,%s,%p,%d)\n",
 		block,subblock,buffer,*buflen
 	);
 	s=(char*)xmalloc(strlen("VS_VERSION_INFO")+strlen(subblock)+1);
@@ -516,8 +678,60 @@
 	return 1;
 }
 
-/*
-   20 GETFILEVERSIONINFORAW
-   21 VERFTHK_THUNKDATA16
-   22 VERTHKSL_THUNKDATA16
-*/
+DWORD
+VerQueryValue32A(LPVOID vblock,LPCSTR subblock,LPVOID *vbuffer,UINT32 *buflen)
+{
+	BYTE	*b,*block=(LPBYTE)vblock,**buffer=(LPBYTE*)vbuffer;
+	struct	db	*db;
+	char	*s;
+
+	fprintf(stderr,"VerQueryValue32A(%p,%s,%p,%d)\n",
+		block,subblock,buffer,*buflen
+	);
+	s=(char*)xmalloc(strlen("VS_VERSION_INFO")+strlen(subblock)+1);
+	strcpy(s,"VS_VERSION_INFO");strcat(s,subblock);
+	b=_find_data(block,s);
+	if (b==NULL) {
+		*buflen=0;
+		return 0;
+	}
+	db=(struct db*)b;
+	*buflen	= db->datalen;
+	/* let b point to data area */
+	b	= b+4+((strlen(db->name)+4)&3);
+	*buffer	= b;
+	fprintf(stderr,"	-> %s=%s\n",subblock,b);
+	return 1;
+}
+
+DWORD
+VerQueryValue32W(LPVOID vblock,LPCWSTR subblock,LPVOID *vbuffer,UINT32 *buflen)
+{
+	/* FIXME: hmm, we not only need to convert subblock, but also 
+	 *        the content...or?
+	 * And what about UNICODE version info?
+	 * And the NAMES of the values?
+	 */
+	BYTE		*b,**buffer=(LPBYTE*)vbuffer,*block=(LPBYTE)vblock;
+	struct	db	*db;
+	char		*s,*sb;
+
+	sb=strdupW2A(subblock);
+	s=(char*)xmalloc(strlen("VS_VERSION_INFO")+strlen(sb)+1);
+	strcpy(s,"VS_VERSION_INFO");strcat(s,sb);
+	b=_find_data(block,s);
+	if (b==NULL) {
+		*buflen=0;
+		free(sb);
+		return 0;
+	}
+	db=(struct db*)b;
+	*buflen	= db->datalen;
+	/* let b point to data area */
+	b	= b+4+((strlen(db->name)+4)&3);
+	*buffer	= b;
+	fprintf(stderr,"	-> %s=%s\n",sb,b);
+	free(sb);
+	return 1;
+}
+/* 20 GETFILEVERSIONINFORAW */
diff --git a/misc/wsprintf.c b/misc/wsprintf.c
new file mode 100644
index 0000000..ac3b8bc
--- /dev/null
+++ b/misc/wsprintf.c
@@ -0,0 +1,555 @@
+/*
+ * wsprintf functions
+ *
+ * Copyright 1996 Alexandre Julliard
+ */
+
+#include <stdarg.h>
+#include <stdio.h>
+#include <string.h>
+#include "windows.h"
+#include "ldt.h"
+#include "stackframe.h"
+
+#define WPRINTF_LEFTALIGN   0x0001  /* Align output on the left ('-' prefix) */
+#define WPRINTF_PREFIX_HEX  0x0002  /* Prefix hex with 0x ('#' prefix) */
+#define WPRINTF_ZEROPAD     0x0004  /* Pad with zeros ('0' prefix) */
+#define WPRINTF_LONG        0x0008  /* Long arg ('l' prefix) */
+#define WPRINTF_SHORT       0x0010  /* Short arg ('h' prefix) */
+#define WPRINTF_UPPER_HEX   0x0020  /* Upper-case hex ('X' specifier) */
+
+typedef enum
+{
+    WPR_CHAR,
+    WPR_WCHAR,
+    WPR_STRING,
+    WPR_WSTRING,
+    WPR_SIGNED,
+    WPR_UNSIGNED,
+    WPR_HEXA
+} WPRINTF_TYPE;
+
+typedef struct
+{
+    UINT32         flags;
+    UINT32         width;
+    UINT32         precision;
+    WPRINTF_TYPE   type;
+} WPRINTF_FORMAT;
+
+
+/***********************************************************************
+ *           WPRINTF_ParseFormatA
+ *
+ * Parse a format specification. A format specification has the form:
+ *
+ * [-][#][0][width][.precision]type
+ *
+ * Return value is the length of the format specification in characters.
+ */
+static INT32 WPRINTF_ParseFormatA( LPCSTR format, WPRINTF_FORMAT *res )
+{
+    LPCSTR p = format;
+
+    res->flags = 0;
+    res->width = 0;
+    res->precision = 0;
+    if (*p == '-') { res->flags |= WPRINTF_LEFTALIGN; p++; }
+    if (*p == '#') { res->flags |= WPRINTF_PREFIX_HEX; p++; }
+    if (*p == '0') { res->flags |= WPRINTF_ZEROPAD; p++; }
+    while ((*p >= '0') && (*p <= '9'))  /* width field */
+    {
+        res->width = res->width * 10 + *p - '0';
+        p++;
+    }
+    if (*p == '.')  /* precision field */
+    {
+        p++;
+        while ((*p >= '0') && (*p <= '9'))
+        {
+            res->precision = res->precision * 10 + *p - '0';
+            p++;
+        }
+    }
+    if (*p == 'l') { res->flags |= WPRINTF_LONG; p++; }
+    else if (*p == 'h') { res->flags |= WPRINTF_SHORT; p++; }
+    switch(*p)
+    {
+    case 'c':
+        res->type = (res->flags & WPRINTF_LONG) ? WPR_WCHAR : WPR_CHAR;
+        break;
+    case 'C':
+        res->type = (res->flags & WPRINTF_SHORT) ? WPR_CHAR : WPR_WCHAR;
+        break;
+    case 'd':
+    case 'i':
+        res->type = WPR_SIGNED;
+        break;
+    case 's':
+        res->type = (res->flags & WPRINTF_LONG) ? WPR_WSTRING : WPR_STRING;
+        break;
+    case 'S':
+        res->type = (res->flags & WPRINTF_SHORT) ? WPR_STRING : WPR_WSTRING;
+        break;
+    case 'u':
+        res->type = WPR_UNSIGNED;
+        break;
+    case 'X':
+        res->flags |= WPRINTF_UPPER_HEX;
+        /* fall through */
+    case 'x':
+        res->type = WPR_HEXA;
+        break;
+    default:
+        fprintf( stderr, "wvsprintf32A: unknown format '%c'\n", *p );
+        break;
+    }
+    return (INT32)(p - format) + 1;
+}
+
+
+/***********************************************************************
+ *           WPRINTF_ParseFormatW
+ *
+ * Parse a format specification. A format specification has the form:
+ *
+ * [-][#][0][width][.precision]type
+ *
+ * Return value is the length of the format specification in characters.
+ */
+static INT32 WPRINTF_ParseFormatW( LPCWSTR format, WPRINTF_FORMAT *res )
+{
+    LPCWSTR p = format;
+
+    res->flags = 0;
+    res->width = 0;
+    res->precision = 0;
+    if (*p == '-') { res->flags |= WPRINTF_LEFTALIGN; p++; }
+    if (*p == '#') { res->flags |= WPRINTF_PREFIX_HEX; p++; }
+    if (*p == '0') { res->flags |= WPRINTF_ZEROPAD; p++; }
+    while ((*p >= '0') && (*p <= '9'))  /* width field */
+    {
+        res->width = res->width * 10 + *p - '0';
+        p++;
+    }
+    if (*p == '.')  /* precision field */
+    {
+        p++;
+        while ((*p >= '0') && (*p <= '9'))
+        {
+            res->precision = res->precision * 10 + *p - '0';
+            p++;
+        }
+    }
+    if (*p == 'l') { res->flags |= WPRINTF_LONG; p++; }
+    else if (*p == 'h') { res->flags |= WPRINTF_SHORT; p++; }
+    switch((CHAR)*p)
+    {
+    case 'c':
+        res->type = (res->flags & WPRINTF_SHORT) ? WPR_CHAR : WPR_WCHAR;
+        break;
+    case 'C':
+        res->type = (res->flags & WPRINTF_LONG) ? WPR_WCHAR : WPR_CHAR;
+        break;
+    case 'd':
+    case 'i':
+        res->type = WPR_SIGNED;
+        break;
+    case 's':
+        res->type = (res->flags & WPRINTF_SHORT) ? WPR_STRING : WPR_WSTRING;
+        break;
+    case 'S':
+        res->type = (res->flags & WPRINTF_LONG) ? WPR_WSTRING : WPR_STRING;
+        break;
+    case 'u':
+        res->type = WPR_UNSIGNED;
+        break;
+    case 'X':
+        res->flags |= WPRINTF_UPPER_HEX;
+        /* fall through */
+    case 'x':
+        res->type = WPR_HEXA;
+        break;
+    default:
+        fprintf( stderr, "wvsprintf32W: unknown format '%c'\n", (CHAR)*p );
+        break;
+    }
+    return (INT32)(p - format) + 1;
+}
+
+
+/***********************************************************************
+ *           WPRINTF_GetLen
+ */
+static UINT32 WPRINTF_GetLen( WPRINTF_FORMAT *format, LPCVOID arg,
+                              LPSTR number, UINT32 maxlen )
+{
+    UINT32 len;
+
+    if (format->flags & WPRINTF_LEFTALIGN) format->flags &= ~WPRINTF_ZEROPAD;
+    if (format->width > maxlen) format->width = maxlen;
+    switch(format->type)
+    {
+    case WPR_CHAR:
+    case WPR_WCHAR:
+        return (format->precision = 1);
+    case WPR_STRING:
+        for (len = 0; !format->precision || (len < format->precision); len++)
+            if (!*(*(LPCSTR *)arg + len)) break;
+        if (len > maxlen) len = maxlen;
+        return (format->precision = len);
+    case WPR_WSTRING:
+        for (len = 0; !format->precision || (len < format->precision); len++)
+            if (!*(*(LPCWSTR *)arg + len)) break;
+        if (len > maxlen) len = maxlen;
+        return (format->precision = len);
+    case WPR_SIGNED:
+        len = sprintf( number, "%d", *(INT32 *)arg );
+        break;
+    case WPR_UNSIGNED:
+        len = sprintf( number, "%u", *(UINT32 *)arg );
+        break;
+    case WPR_HEXA:
+        len = sprintf( number,
+                        (format->flags & WPRINTF_UPPER_HEX) ? "%X" : "%x",
+                        *(UINT32 *)arg );
+        if (format->flags & WPRINTF_PREFIX_HEX) len += 2;
+        break;
+    default:
+        return 0;
+    }
+    if (len > maxlen) len = maxlen;
+    if (format->precision < len) format->precision = len;
+    if (format->precision > maxlen) format->precision = maxlen;
+    if ((format->flags & WPRINTF_ZEROPAD) && (format->width > format->precision))
+        format->precision = format->width;
+    return len;
+}
+
+
+/***********************************************************************
+ *           wvsnprintf16   (Not a Windows API)
+ */
+INT16 wvsnprintf16( LPSTR buffer, UINT16 maxlen, LPCSTR spec, LPCVOID args )
+{
+    WPRINTF_FORMAT format;
+    LPSTR p = buffer;
+    UINT32 i, len;
+    CHAR number[20];
+    DWORD cur_arg;
+
+    while (*spec && (maxlen > 1))
+    {
+        if (*spec != '%') { *p++ = *spec++; maxlen--; continue; }
+        spec++;
+        if (*spec == '%') { *p++ = *spec++; maxlen--; continue; }
+        spec += WPRINTF_ParseFormatA( spec, &format );
+        switch(format.type)
+        {
+        case WPR_CHAR:
+            cur_arg = (DWORD)*(CHAR *)args;
+            args = (CHAR *)args + 1;
+            break;
+        case WPR_STRING:
+            cur_arg = (DWORD)PTR_SEG_TO_LIN( *(SEGPTR *)args );
+            args = (SEGPTR *)args + 1;
+            break;
+        case WPR_HEXA:
+        case WPR_SIGNED:
+        case WPR_UNSIGNED:
+            if (format.flags & WPRINTF_LONG)
+            {
+                cur_arg = (DWORD)*(UINT32 *)args;
+                args = (UINT32 *)args + 1;
+            }
+            else
+            {
+                cur_arg = (DWORD)*(UINT16 *)args;
+                args = (UINT16 *)args + 1;
+            }
+            break;
+        case WPR_WCHAR:
+        case WPR_WSTRING:
+            fprintf( stderr, "Unicode not supported in wsprintf16\n" );
+            continue;
+        }
+        len = WPRINTF_GetLen( &format, &cur_arg, number, maxlen - 1 );
+        if (!(format.flags & WPRINTF_LEFTALIGN))
+            for (i = format.precision; i < format.width; i++, maxlen--)
+                *p++ = ' ';
+        switch(format.type)
+        {
+        case WPR_CHAR:
+            if ((*p = (CHAR)cur_arg)) p++;
+            else if (format.width > 1) *p++ = ' ';
+            else len = 0;
+            break;
+        case WPR_STRING:
+            if (len) memcpy( p, (LPCSTR)cur_arg, len );
+            p += len;
+            break;
+        case WPR_HEXA:
+            if ((format.flags & WPRINTF_PREFIX_HEX) && (maxlen > 3))
+            {
+                *p++ = '0';
+                *p++ = (format.flags & WPRINTF_UPPER_HEX) ? 'X' : 'x';
+                maxlen -= 2;
+                len -= 2;
+                format.precision -= 2;
+                format.width -= 2;
+            }
+            /* fall through */
+        case WPR_SIGNED:
+        case WPR_UNSIGNED:
+            for (i = len; i < format.precision; i++, maxlen--) *p++ = '0';
+            if (len) memcpy( p, number, len );
+            p += len;
+            break;
+        case WPR_WCHAR:
+        case WPR_WSTRING:
+            fprintf( stderr, "Unicode not supported in wsprintf16\n" );
+            break;
+        }
+        if (format.flags & WPRINTF_LEFTALIGN)
+            for (i = format.precision; i < format.width; i++, maxlen--)
+                *p++ = ' ';
+        maxlen -= len;
+    }
+    *p = 0;
+    return (maxlen > 1) ? (INT32)(p - buffer) : -1;
+}
+
+
+/***********************************************************************
+ *           wvsnprintf32A   (Not a Windows API)
+ */
+INT32 wvsnprintf32A( LPSTR buffer, UINT32 maxlen, LPCSTR spec, LPCVOID args )
+{
+    WPRINTF_FORMAT format;
+    LPSTR p = buffer;
+    UINT32 i, len;
+    CHAR number[20];
+
+    while (*spec && (maxlen > 1))
+    {
+        if (*spec != '%') { *p++ = *spec++; maxlen--; continue; }
+        spec++;
+        if (*spec == '%') { *p++ = *spec++; maxlen--; continue; }
+        spec += WPRINTF_ParseFormatA( spec, &format );
+        len = WPRINTF_GetLen( &format, args, number, maxlen - 1 );
+        if (!(format.flags & WPRINTF_LEFTALIGN))
+            for (i = format.precision; i < format.width; i++, maxlen--)
+                *p++ = ' ';
+        switch(format.type)
+        {
+        case WPR_WCHAR:
+            if ((*p = (CHAR)*(WCHAR *)args)) p++;
+            else if (format.width > 1) *p++ = ' ';
+            else len = 0;
+            break;
+        case WPR_CHAR:
+            if ((*p = *(CHAR *)args)) p++;
+            else if (format.width > 1) *p++ = ' ';
+            else len = 0;
+            break;
+        case WPR_STRING:
+            if (len) memcpy( p, *(LPCSTR *)args, len );
+            p += len;
+            break;
+        case WPR_WSTRING:
+            for (i = 0; i < len; i++) *p++ = (CHAR)*(*(LPCWSTR *)args + i);
+            break;
+        case WPR_HEXA:
+            if ((format.flags & WPRINTF_PREFIX_HEX) && (maxlen > 3))
+            {
+                *p++ = '0';
+                *p++ = (format.flags & WPRINTF_UPPER_HEX) ? 'X' : 'x';
+                maxlen -= 2;
+                len -= 2;
+                format.precision -= 2;
+                format.width -= 2;
+            }
+            /* fall through */
+        case WPR_SIGNED:
+        case WPR_UNSIGNED:
+            for (i = len; i < format.precision; i++, maxlen--) *p++ = '0';
+            if (len) memcpy( p, number, len );
+            p += len;
+            break;
+        }
+        if (format.flags & WPRINTF_LEFTALIGN)
+            for (i = format.precision; i < format.width; i++, maxlen--)
+                *p++ = ' ';
+        args = (INT32 *)args + 1;
+        maxlen -= len;
+    }
+    *p = 0;
+    return (maxlen > 1) ? (INT32)(p - buffer) : -1;
+}
+
+
+/***********************************************************************
+ *           wvsnprintf32W   (Not a Windows API)
+ */
+INT32 wvsnprintf32W( LPWSTR buffer, UINT32 maxlen, LPCWSTR spec, LPCVOID args )
+{
+    WPRINTF_FORMAT format;
+    LPWSTR p = buffer;
+    UINT32 i, len;
+    CHAR number[20];
+
+    while (*spec && (maxlen > 1))
+    {
+        if (*spec != '%') { *p++ = *spec++; maxlen--; continue; }
+        spec++;
+        if (*spec == '%') { *p++ = *spec++; maxlen--; continue; }
+        spec += WPRINTF_ParseFormatW( spec, &format );
+        len = WPRINTF_GetLen( &format, args, number, maxlen - 1 );
+        if (!(format.flags & WPRINTF_LEFTALIGN))
+            for (i = format.precision; i < format.width; i++, maxlen--)
+                *p++ = ' ';
+        switch(format.type)
+        {
+        case WPR_WCHAR:
+            if ((*p = *(WCHAR *)args)) p++;
+            else if (format.width > 1) *p++ = ' ';
+            else len = 0;
+            break;
+        case WPR_CHAR:
+            if ((*p = (WCHAR)*(CHAR *)args)) p++;
+            else if (format.width > 1) *p++ = ' ';
+            else len = 0;
+            break;
+        case WPR_STRING:
+            for (i = 0; i < len; i++) *p++ = (WCHAR)*(*(LPCSTR *)args + i);
+            break;
+        case WPR_WSTRING:
+            if (len) memcpy( p, *(LPCWSTR *)args, len * sizeof(WCHAR) );
+            p += len;
+            break;
+        case WPR_HEXA:
+            if ((format.flags & WPRINTF_PREFIX_HEX) && (maxlen > 3))
+            {
+                *p++ = '0';
+                *p++ = (format.flags & WPRINTF_UPPER_HEX) ? 'X' : 'x';
+                maxlen -= 2;
+                len -= 2;
+                format.precision -= 2;
+                format.width -= 2;
+            }
+            /* fall through */
+        case WPR_SIGNED:
+        case WPR_UNSIGNED:
+            for (i = len; i < format.precision; i++, maxlen--) *p++ = '0';
+            for (i = 0; i < len; i++) *p++ = (WCHAR)number[i];
+            break;
+        }
+        if (format.flags & WPRINTF_LEFTALIGN)
+            for (i = format.precision; i < format.width; i++, maxlen--)
+                *p++ = ' ';
+        args = (INT32 *)args + 1;
+        maxlen -= len;
+    }
+    *p = 0;
+    return (maxlen > 1) ? (INT32)(p - buffer) : -1;
+}
+
+
+/***********************************************************************
+ *           wvsprintf16   (USER.421)
+ */
+INT16 wvsprintf16( LPSTR buffer, LPCSTR spec, LPCVOID args )
+{
+    return wvsnprintf16( buffer, 0xffff, spec, args );
+}
+
+
+/***********************************************************************
+ *           wvsprintf32A   (USER32.586)
+ */
+INT32 wvsprintf32A( LPSTR buffer, LPCSTR spec, LPCVOID args )
+{
+    return wvsnprintf32A( buffer, 0xffffffff, spec, args );
+}
+
+
+/***********************************************************************
+ *           wvsprintf32W   (USER32.587)
+ */
+INT32 wvsprintf32W( LPWSTR buffer, LPCWSTR spec, LPCVOID args )
+{
+    return wvsnprintf32W( buffer, 0xffffffff, spec, args );
+}
+
+
+/***********************************************************************
+ *           wsprintf16   (USER.420)
+ */
+/* Winelib version */
+INT16 wsprintf16( LPSTR buffer, LPCSTR spec, ... )
+{
+    va_list valist;
+    INT16 res;
+
+    va_start( valist, spec );
+    /* Note: we call the 32-bit version, because the args are 32-bit */
+    res = (INT16)wvsprintf32A( buffer, spec, (LPCVOID)valist );
+    va_end( valist );
+    return res;
+}
+
+/* Emulator version */
+#ifndef WINELIB
+INT16 WIN16_wsprintf16(void)
+{
+    SEGPTR *win_stack = (DWORD *)CURRENT_STACK16->args;
+    LPSTR buffer = (LPSTR)PTR_SEG_TO_LIN(win_stack[0]);
+    LPCSTR spec  = (LPCSTR)PTR_SEG_TO_LIN(win_stack[1]);
+    return wvsprintf16( buffer, spec, &win_stack[2] );
+
+}
+#endif  /* WINELIB */
+
+
+/***********************************************************************
+ *           wsprintf32A   (USER32.584)
+ */
+/* Winelib version */
+INT32 wsprintf32A( LPSTR buffer, LPCSTR spec, ... )
+{
+    va_list valist;
+    INT32 res;
+
+    va_start( valist, spec );
+    res = wvsprintf32A( buffer, spec, (LPCVOID)valist );
+    va_end( valist );
+    return res;
+}
+
+/* Emulator version */
+INT32 WIN32_wsprintf32A( int *args )
+{
+    return wvsprintf32A( (LPSTR)args[0], (LPCSTR)args[1], (LPCVOID)&args[2] );
+}
+
+
+/***********************************************************************
+ *           wsprintf32W   (USER32.585)
+ */
+/* Winelib version */
+INT32 wsprintf32W( LPWSTR buffer, LPCWSTR spec, ... )
+{
+    va_list valist;
+    INT32 res;
+
+    va_start( valist, spec );
+    res = wvsprintf32W( buffer, spec, (LPCVOID)valist );
+    va_end( valist );
+    return res;
+}
+
+/* Emulator version */
+INT32 WIN32_wsprintf32W( int *args )
+{
+    return wvsprintf32W( (LPWSTR)args[0], (LPCWSTR)args[1], (LPCVOID)&args[2]);
+}
diff --git a/miscemu/cpu.c b/miscemu/cpu.c
index a17f635..63211bd 100644
--- a/miscemu/cpu.c
+++ b/miscemu/cpu.c
@@ -24,7 +24,7 @@
 	{
 	  char info[5], value[5];
 	  while (fscanf (f, " %4s%*s : %4s%*s", info, value) == 2)
-	    if (!lstrcmpi (info, "cpu"))
+	    if (!lstrcmpi32A(info, "cpu"))
 	      {
 		if (isdigit (value[0]) && value[1] == '8'
 		    && value[2] == '6' && value[3] == 0)
diff --git a/miscemu/int21.c b/miscemu/int21.c
index 7d00ee2..b698d2c 100644
--- a/miscemu/int21.c
+++ b/miscemu/int21.c
@@ -631,7 +631,7 @@
         return 0;
     }
 
-    lstrcpyn( ptr, DRIVE_GetDosCwd(drive), 64 );
+    lstrcpyn32A( ptr, DRIVE_GetDosCwd(drive), 64 );
     if (!ptr[0]) strcpy( ptr, "\\" );
     return 1;
 }
@@ -1358,8 +1358,10 @@
         break;
 	
     case 0x4b: /* "EXEC" - LOAD AND/OR EXECUTE PROGRAM */
-        WinExec( PTR_SEG_OFF_TO_LIN( DS_reg(&context), DX_reg(&context) ),
-                 SW_NORMAL );
+        AX_reg(&context) = WinExec( PTR_SEG_OFF_TO_LIN( DS_reg(&context),
+                                                        DX_reg(&context) ),
+                                    SW_NORMAL );
+        if (AX_reg(&context) < 32) SET_CFLAG(&context);
         break;		
 	
     case 0x4c: /* "EXIT" - TERMINATE WITH RETURN CODE */
@@ -1507,8 +1509,9 @@
             }
             else
             {
-                lstrcpyn(PTR_SEG_OFF_TO_LIN(ES_reg(&context),DI_reg(&context)),
-                         truename, 128 );
+                lstrcpyn32A( PTR_SEG_OFF_TO_LIN( ES_reg(&context),
+                                                 DI_reg(&context) ),
+                             truename, 128 );
                 AX_reg(&context) = 0;
             }
         }
@@ -1519,6 +1522,7 @@
     case 0x64: /* OS/2 DOS BOX */
     case 0x65: /* GET EXTENDED COUNTRY INFORMATION */
         INT_BARF( &context, 0x21 );
+        SET_CFLAG(&context);
         break;
 	
     case 0x66: /* GLOBAL CODE PAGE TABLE */
diff --git a/multimedia/mcistring.c b/multimedia/mcistring.c
index 4630c7d..c21081a 100644
--- a/multimedia/mcistring.c
+++ b/multimedia/mcistring.c
@@ -52,7 +52,7 @@
 /* The reason why I just don't lowercase the keywords array in 
  * mciSendString is left as an exercise to the reader.
  */
-#define STRCMP(x,y) lstrcmpi(x,y)
+#define STRCMP(x,y) lstrcmpi32A(x,y)
 
 /* standard functionparameters for all functions */
 #define _MCISTR_PROTO_ \
@@ -65,7 +65,7 @@
 #define _MCI_STR(s) do {\
 	dprintf_mci(stddeb,"->returns \"%s\"",s);\
 	if (lpstrReturnString) {\
-	    lstrcpyn(lpstrReturnString,s,uReturnLength);\
+	    lstrcpyn32A(lpstrReturnString,s,uReturnLength);\
 	    dprintf_mci(stddeb,"-->\"%s\"\n",lpstrReturnString);\
 	}\
 } while(0)
diff --git a/multimedia/mmsystem.c b/multimedia/mmsystem.c
index 465f8c1..f2d40f0 100644
--- a/multimedia/mmsystem.c
+++ b/multimedia/mmsystem.c
@@ -526,7 +526,7 @@
 			msgptr = "Unknown MCI Error !\n";
 			break;
 		}
-        lstrcpyn(lpstrBuffer, msgptr, uLength);
+        lstrcpyn32A(lpstrBuffer, msgptr, uLength);
 	return TRUE;
 }
 
@@ -701,7 +701,7 @@
 				}
 			}
 			if (lpParms->dwRetSize < InstalledListLen)
-				lstrcpyn(lpstrReturn, lpInstallNames, lpParms->dwRetSize - 1);
+				lstrcpyn32A(lpstrReturn, lpInstallNames, lpParms->dwRetSize - 1);
 			else
 				strcpy(lpstrReturn, lpInstallNames);
 			return 0;
@@ -888,7 +888,7 @@
 			msgptr = "Unknown MIDI Error !\n";
 			break;
 		}
-	lstrcpyn(lpText, msgptr, uSize);
+	lstrcpyn32A(lpText, msgptr, uSize);
 	return TRUE;
 }
 
@@ -1341,7 +1341,7 @@
 			msgptr = "Unknown MMSYSTEM Error !\n";
 			break;
 		}
-	lstrcpyn(lpText, msgptr, uSize);
+	lstrcpyn32A(lpText, msgptr, uSize);
 	return TRUE;
 }
 
diff --git a/objects/bitmap.c b/objects/bitmap.c
index 870667e..f54cdc7 100644
--- a/objects/bitmap.c
+++ b/objects/bitmap.c
@@ -3,6 +3,7 @@
  *
  * Copyright 1993 Alexandre Julliard
  */
+
 #include <stdio.h>
 #include <stdlib.h>
 #include <X11/Xlib.h>
@@ -12,8 +13,6 @@
 #include "dc.h"
 #include "bitmap.h"
 #include "stddebug.h"
-/* #define DEBUG_GDI    */
-/* #define DEBUG_BITMAP */
 #include "debug.h"
 
   /* GCs used for B&W and color bitmap operations */
@@ -55,7 +54,7 @@
  *
  * Create an XImage pointing to the bitmap data.
  */
-static XImage *BITMAP_BmpToImage( BITMAP * bmp, void * bmpData )
+static XImage *BITMAP_BmpToImage( BITMAP16 * bmp, LPVOID bmpData )
 {
     extern void _XInitImageFuncPtrs( XImage* );
     XImage * image;
@@ -73,12 +72,13 @@
 
 
 /***********************************************************************
- *           CreateBitmap    (GDI.48)
+ *           CreateBitmap    (GDI.48) (GDI32.25)
  */
-HBITMAP CreateBitmap( INT width, INT height, UINT planes, UINT bpp, LPVOID bits )
+HBITMAP16 CreateBitmap( INT32 width, INT32 height, UINT32 planes,
+                        UINT32 bpp, LPCVOID bits )
 {
     BITMAPOBJ * bmpObjPtr;
-    HBITMAP hbitmap;
+    HBITMAP16 hbitmap;
 
     dprintf_gdi( stddeb, "CreateBitmap: %dx%d, %d colors\n", 
                  width, height, 1 << (planes*bpp) );
@@ -97,11 +97,11 @@
     bmpObjPtr->size.cx = 0;
     bmpObjPtr->size.cy = 0;
     bmpObjPtr->bitmap.bmType = 0;
-    bmpObjPtr->bitmap.bmWidth = width;
-    bmpObjPtr->bitmap.bmHeight = height;
-    bmpObjPtr->bitmap.bmPlanes = planes;
-    bmpObjPtr->bitmap.bmBitsPixel = bpp;
-    bmpObjPtr->bitmap.bmWidthBytes = BITMAP_WIDTH_BYTES( width, bpp );
+    bmpObjPtr->bitmap.bmWidth = (INT16)width;
+    bmpObjPtr->bitmap.bmHeight = (INT16)height;
+    bmpObjPtr->bitmap.bmPlanes = (BYTE)planes;
+    bmpObjPtr->bitmap.bmBitsPixel = (BYTE)bpp;
+    bmpObjPtr->bitmap.bmWidthBytes = (INT16)BITMAP_WIDTH_BYTES( width, bpp );
     bmpObjPtr->bitmap.bmBits = NULL;
 
       /* Create the pixmap */
@@ -118,28 +118,27 @@
 
 
 /***********************************************************************
- *           CreateCompatibleBitmap    (GDI.51)
+ *           CreateCompatibleBitmap    (GDI.51) (GDI32.30)
  */
-HBITMAP CreateCompatibleBitmap( HDC hdc, INT width, INT height )
+HBITMAP16 CreateCompatibleBitmap( HDC32 hdc, INT32 width, INT32 height )
 {
-    HBITMAP	hbmpRet = 0;
-    DC * 	dc;
-    dprintf_gdi(stddeb, "CreateCompatibleBitmap(%04x,%d,%d) = \n", 
-		hdc, width, height );
+    HBITMAP hbmpRet = 0;
+    DC *dc;
+
+    dprintf_gdi( stddeb, "CreateCompatibleBitmap(%04x,%d,%d) = \n", 
+                 hdc, width, height );
     if (!(dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC ))) return 0;
     
     hbmpRet = CreateBitmap( width, height, 1, dc->w.bitsPerPixel, NULL );
-
     dprintf_gdi(stddeb,"\t\t%04x\n", hbmpRet);
-
     return hbmpRet;
 }
 
 
 /***********************************************************************
- *           CreateBitmapIndirect    (GDI.49)
+ *           CreateBitmapIndirect16    (GDI.49)
  */
-HBITMAP CreateBitmapIndirect( const BITMAP * bmp )
+HBITMAP16 CreateBitmapIndirect16( const BITMAP16 * bmp )
 {
     return CreateBitmap( bmp->bmWidth, bmp->bmHeight, bmp->bmPlanes,
                          bmp->bmBitsPixel, PTR_SEG_TO_LIN( bmp->bmBits ) );
@@ -147,9 +146,19 @@
 
 
 /***********************************************************************
- *           GetBitmapBits    (GDI.74)
+ *           CreateBitmapIndirect32    (GDI32.26)
  */
-LONG GetBitmapBits( HBITMAP hbitmap, LONG count, LPSTR buffer )
+HBITMAP32 CreateBitmapIndirect32( const BITMAP32 * bmp )
+{
+    return CreateBitmap( bmp->bmWidth, bmp->bmHeight, bmp->bmPlanes,
+                         bmp->bmBitsPixel, bmp->bmBits );
+}
+
+
+/***********************************************************************
+ *           GetBitmapBits    (GDI.74) (GDI32.143)
+ */
+LONG GetBitmapBits( HBITMAP32 hbitmap, LONG count, LPVOID buffer )
 {
     BITMAPOBJ * bmp;
     LONG height;
@@ -182,9 +191,9 @@
 
 
 /***********************************************************************
- *           SetBitmapBits    (GDI.106)
+ *           SetBitmapBits    (GDI.106) (GDI32.303)
  */
-LONG SetBitmapBits( HBITMAP hbitmap, LONG count, LPSTR buffer )
+LONG SetBitmapBits( HBITMAP32 hbitmap, LONG count, LPCVOID buffer )
 {
     BITMAPOBJ * bmp;
     LONG height;
@@ -207,7 +216,7 @@
     if (height > bmp->bitmap.bmHeight) height = bmp->bitmap.bmHeight;
     if (!height) return 0;
     	
-    if (!(image = BITMAP_BmpToImage( &bmp->bitmap, buffer ))) return 0;
+    if (!(image = BITMAP_BmpToImage( &bmp->bitmap, (LPVOID)buffer ))) return 0;
     CallTo32_LargeStack( XPutImage, 10,
                          display, bmp->pixmap, BITMAP_GC(bmp), image, 0, 0,
                          0, 0, bmp->bitmap.bmWidth, height );
@@ -271,17 +280,36 @@
 
 	
 /***********************************************************************
- *           BITMAP_GetObject
+ *           BITMAP_GetObject16
  */
-int BITMAP_GetObject( BITMAPOBJ * bmp, int count, LPSTR buffer )
+INT16 BITMAP_GetObject16( BITMAPOBJ * bmp, INT16 count, LPVOID buffer )
 {
-    if (count > sizeof(BITMAP)) count = sizeof(BITMAP);
+    if (count > sizeof(bmp->bitmap)) count = sizeof(bmp->bitmap);
     memcpy( buffer, &bmp->bitmap, count );
     return count;
 }
     
 
 /***********************************************************************
+ *           BITMAP_GetObject32
+ */
+INT32 BITMAP_GetObject32( BITMAPOBJ * bmp, INT32 count, LPVOID buffer )
+{
+    BITMAP32 bmp32;
+    bmp32.bmType       = bmp->bitmap.bmType;
+    bmp32.bmWidth      = bmp->bitmap.bmWidth;
+    bmp32.bmHeight     = bmp->bitmap.bmHeight;
+    bmp32.bmWidthBytes = bmp->bitmap.bmWidthBytes;
+    bmp32.bmPlanes     = bmp->bitmap.bmPlanes;
+    bmp32.bmBitsPixel  = bmp->bitmap.bmBitsPixel;
+    bmp32.bmBits       = NULL;
+    if (count > sizeof(bmp32)) count = sizeof(bmp32);
+    memcpy( buffer, &bmp32, count );
+    return count;
+}
+    
+
+/***********************************************************************
  *           BITMAP_SelectObject
  */
 HBITMAP BITMAP_SelectObject( DC * dc, HBITMAP hbitmap,
@@ -313,9 +341,9 @@
 }
 
 /***********************************************************************
- *           CreateDiscardableBitmap    (GDI.156)
+ *           CreateDiscardableBitmap    (GDI.156) (GDI32.38)
  */
-HBITMAP CreateDiscardableBitmap(HDC hdc, INT width, INT height)
+HBITMAP16 CreateDiscardableBitmap( HDC32 hdc, INT32 width, INT32 height )
 {
     dprintf_bitmap(stddeb,"CreateDiscardableBitmap(%04x, %d, %d); "
 	   "// call CreateCompatibleBitmap() for now!\n",
@@ -337,7 +365,7 @@
 
 
 /***********************************************************************
- *           GetBitmapDimensionEx32    (GDI.468)
+ *           GetBitmapDimensionEx32    (GDI32.144)
  */
 BOOL32 GetBitmapDimensionEx32( HBITMAP32 hbitmap, LPSIZE32 size )
 {
@@ -376,7 +404,7 @@
 
 
 /***********************************************************************
- *           SetBitmapDimensionEx32    (GDI.478)
+ *           SetBitmapDimensionEx32    (GDI32.304)
  */
 BOOL32 SetBitmapDimensionEx32( HBITMAP32 hbitmap, INT32 x, INT32 y,
                                LPSIZE32 prevSize )
diff --git a/objects/brush.c b/objects/brush.c
index a1780ba..6331df0 100644
--- a/objects/brush.c
+++ b/objects/brush.c
@@ -141,13 +141,13 @@
 /***********************************************************************
  *           CreateBrushIndirect    (GDI.50)
  */
-HBRUSH CreateBrushIndirect( const LOGBRUSH * brush )
+HBRUSH CreateBrushIndirect( const LOGBRUSH16 * brush )
 {
     BRUSHOBJ * brushPtr;
     HBRUSH hbrush = GDI_AllocObject( sizeof(BRUSHOBJ), BRUSH_MAGIC );
     if (!hbrush) return 0;
     brushPtr = (BRUSHOBJ *) GDI_HEAP_LIN_ADDR( hbrush );
-    memcpy( &brushPtr->logbrush, brush, sizeof(LOGBRUSH) );
+    memcpy( &brushPtr->logbrush, brush, sizeof(*brush) );
     return hbrush;
 }
 
@@ -157,7 +157,7 @@
  */
 HBRUSH CreateHatchBrush( INT style, COLORREF color )
 {
-    LOGBRUSH logbrush = { BS_HATCHED, color, style };
+    LOGBRUSH16 logbrush = { BS_HATCHED, color, style };
     dprintf_gdi(stddeb, "CreateHatchBrush: %d %06lx\n", style, color );
     if ((style < 0) || (style >= NB_HATCH_STYLES)) return 0;
     return CreateBrushIndirect( &logbrush );
@@ -169,7 +169,7 @@
  */
 HBRUSH CreatePatternBrush( HBITMAP hbitmap )
 {
-    LOGBRUSH logbrush = { BS_PATTERN, 0, 0 };
+    LOGBRUSH16 logbrush = { BS_PATTERN, 0, 0 };
     BITMAPOBJ *bmp, *newbmp;
 
     dprintf_gdi(stddeb, "CreatePatternBrush: %04x\n", hbitmap );
@@ -178,7 +178,7 @@
 
     if (!(bmp = (BITMAPOBJ *) GDI_GetObjPtr( hbitmap, BITMAP_MAGIC )))
 	return 0;
-    logbrush.lbHatch = (INT)CreateBitmapIndirect( &bmp->bitmap );
+    logbrush.lbHatch = (INT16)CreateBitmapIndirect16( &bmp->bitmap );
     newbmp = (BITMAPOBJ *) GDI_GetObjPtr( (HANDLE)logbrush.lbHatch, BITMAP_MAGIC );
     if (!newbmp) return 0;
     XCopyArea( display, bmp->pixmap, newbmp->pixmap, BITMAP_GC(bmp),
@@ -192,7 +192,7 @@
  */
 HBRUSH CreateDIBPatternBrush( HGLOBAL hbitmap, UINT coloruse )
 {
-    LOGBRUSH logbrush = { BS_DIBPATTERN, coloruse, 0 };
+    LOGBRUSH16 logbrush = { BS_DIBPATTERN, coloruse, 0 };
     BITMAPINFO *info, *newInfo;
     int size;
     
@@ -202,8 +202,9 @@
 
     if (!(info = (BITMAPINFO *) GlobalLock16( hbitmap ))) return 0;
 
-    size = info->bmiHeader.biSizeImage;
-    if (!size)
+    if (info->bmiHeader.biCompression)
+        size = info->bmiHeader.biSizeImage;
+    else
 	size = (info->bmiHeader.biWidth * info->bmiHeader.biBitCount + 31) / 32
 	         * 8 * info->bmiHeader.biHeight;
     size += DIB_BitmapInfoSize( info, coloruse );
@@ -226,7 +227,7 @@
  */
 HBRUSH CreateSolidBrush( COLORREF color )
 {
-    LOGBRUSH logbrush = { BS_SOLID, color, 0 };
+    LOGBRUSH16 logbrush = { BS_SOLID, color, 0 };
     dprintf_gdi(stddeb, "CreateSolidBrush: %06lx\n", color );
     return CreateBrushIndirect( &logbrush );
 }
@@ -277,7 +278,7 @@
  */
 int BRUSH_GetObject( BRUSHOBJ * brush, int count, LPSTR buffer )
 {
-    if (count > sizeof(LOGBRUSH)) count = sizeof(LOGBRUSH);
+    if (count > sizeof(brush->logbrush)) count = sizeof(brush->logbrush);
     memcpy( buffer, &brush->logbrush, count );
     return count;
 }
diff --git a/objects/clipping.c b/objects/clipping.c
index 3683d58..8339a42 100644
--- a/objects/clipping.c
+++ b/objects/clipping.c
@@ -5,12 +5,15 @@
  */
 
 #include <stdio.h>
-#include "region.h"
+#include "dc.h"
 #include "metafile.h"
+#include "region.h"
 #include "stddebug.h"
 /* #define DEBUG_CLIPPING */
 #include "debug.h"
 
+#define UpdateDirtyDC(dc) DC_CallHookProc( dc, DCHC_INVALIDVISRGN, 0 )
+
 /***********************************************************************
  *           CLIPPING_SetDeviceClipping
  *
diff --git a/objects/color.c b/objects/color.c
index 41e612a..6868a22 100644
--- a/objects/color.c
+++ b/objects/color.c
@@ -32,7 +32,7 @@
 #define NB_RESERVED_COLORS  20
 
   /* The first and last eight colors are EGA colors */
-static PALETTEENTRY COLOR_sysPaletteEntries[NB_RESERVED_COLORS] =
+static const PALETTEENTRY COLOR_sysPaletteEntries[NB_RESERVED_COLORS] =
 {
     /* red  green blue  flags */
     { 0x00, 0x00, 0x00, 0 },
@@ -271,7 +271,7 @@
 BOOL COLOR_IsSolid( COLORREF color )
 {
     int i;
-    PALETTEENTRY *pEntry = COLOR_sysPaletteEntries;
+    const PALETTEENTRY *pEntry = COLOR_sysPaletteEntries;
 
     if (color & 0xff000000) return TRUE;
     if (!color || (color == 0xffffff)) return TRUE;
diff --git a/objects/font.c b/objects/font.c
index 8f3b4a1..5cde975 100644
--- a/objects/font.c
+++ b/objects/font.c
@@ -24,7 +24,7 @@
 
 #define FONTCACHE 	32	/* dynamic font cache size */
 #define MAX_FONTS	256
-static LPLOGFONT lpLogFontList[MAX_FONTS] = { NULL };
+static LPLOGFONT16 lpLogFontList[MAX_FONTS];
 
 static int ParseFontParms(LPSTR lpFont, WORD wParmsNo, LPSTR lpRetStr, WORD wMaxSiz);
 
@@ -146,7 +146,7 @@
  *
  * Find a X font matching the logical font.
  */
-static XFontStruct * FONT_MatchFont( LOGFONT * font, DC * dc )
+static XFontStruct * FONT_MatchFont( LOGFONT16 * font, DC * dc )
 {
     char pattern[100];
     const char *family, *weight, *charset;
@@ -276,8 +276,8 @@
 /***********************************************************************
  *           FONT_GetMetrics
  */
-void FONT_GetMetrics( LOGFONT * logfont, XFontStruct * xfont,
-		      TEXTMETRIC * metrics )
+void FONT_GetMetrics( LOGFONT16 * logfont, XFontStruct * xfont,
+		      TEXTMETRIC16 * metrics )
 {    
     int average, i, count;
     unsigned long prop;
@@ -357,7 +357,7 @@
 /***********************************************************************
  *           CreateFontIndirect    (GDI.57)
  */
-HFONT CreateFontIndirect( const LOGFONT * font )
+HFONT CreateFontIndirect( const LOGFONT16 * font )
 {
     FONTOBJ * fontPtr;
     HFONT hfont;
@@ -370,7 +370,7 @@
     hfont = GDI_AllocObject( sizeof(FONTOBJ), FONT_MAGIC );
     if (!hfont) return 0;
     fontPtr = (FONTOBJ *) GDI_HEAP_LIN_ADDR( hfont );
-    memcpy( &fontPtr->logfont, font, sizeof(LOGFONT) );
+    memcpy( &fontPtr->logfont, font, sizeof(LOGFONT16) );
     AnsiLower( fontPtr->logfont.lfFaceName );
     dprintf_font(stddeb,"CreateFontIndirect(%p (%d,%d)); return %04x\n",
 	font, font->lfHeight, font->lfWidth, hfont);
@@ -386,8 +386,8 @@
 		  BYTE outpres, BYTE clippres, BYTE quality, BYTE pitch,
 		  LPCSTR name )
 {
-    LOGFONT logfont = { height, width, esc, orient, weight, italic, underline,
-		    strikeout, charset, outpres, clippres, quality, pitch, };
+    LOGFONT16 logfont = {height, width, esc, orient, weight, italic, underline,
+                      strikeout, charset, outpres, clippres, quality, pitch, };
     dprintf_font(stddeb,"CreateFont(%d,%d)\n", height, width);
     if (name)
 	{
@@ -404,7 +404,7 @@
  */
 int FONT_GetObject( FONTOBJ * font, int count, LPSTR buffer )
 {
-    if (count > sizeof(LOGFONT)) count = sizeof(LOGFONT);
+    if (count > sizeof(LOGFONT16)) count = sizeof(LOGFONT16);
     memcpy( buffer, &font->logfont, count );
     return count;
 }
@@ -419,7 +419,7 @@
 
     static struct {
 		HFONT		id;
-		LOGFONT		logfont;
+		LOGFONT16	logfont;
 		int		access;
 		int		used;
 		X_PHYSFONT	cacheFont; } cacheFonts[FONTCACHE], *cacheFontsMin;
@@ -462,7 +462,7 @@
 		/*
 		 * Check if Handle matches the font 
 		 */
-		if(memcmp(&cacheFonts[i].logfont,&(font->logfont), sizeof(LOGFONT))) {
+		if(memcmp(&cacheFonts[i].logfont,&(font->logfont), sizeof(LOGFONT16))) {
 			/* No: remove handle id from dynamic font cache */
 			cacheFonts[i].access=0;
 			cacheFonts[i].used=0;
@@ -470,7 +470,7 @@
 			/* may be there is an unused handle which contains the font */
 			for(i=0; i<FONTCACHE; i++) {
 				if((cacheFonts[i].used == 0) &&
-				  (memcmp(&cacheFonts[i].logfont,&(font->logfont), sizeof(LOGFONT)))== 0) {
+				  (memcmp(&cacheFonts[i].logfont,&(font->logfont), sizeof(LOGFONT16)))== 0) {
 					/* got it load from cache and set new handle id */
 					stockPtr = &cacheFonts[i].cacheFont;
 					cacheFonts[i].access=1;
@@ -564,7 +564,7 @@
 	cacheFontsMin->used=1;
 	cacheFontsMin->id=hfont;
 	memcpy( &dc->u.x.font, &(cacheFontsMin->cacheFont), sizeof(cacheFontsMin->cacheFont) );
-	memcpy(&cacheFontsMin->logfont,&(font->logfont), sizeof(LOGFONT));
+	memcpy(&cacheFontsMin->logfont,&(font->logfont), sizeof(LOGFONT16));
 
     }
     return prevHandle;
@@ -635,7 +635,7 @@
     if (!dc) return 0;
     if (!(font = (FONTOBJ *) GDI_GetObjPtr( dc->w.hFont, FONT_MAGIC )))
         return 0;
-    lstrcpyn( name, font->logfont.lfFaceName, count );
+    lstrcpyn32A( name, font->logfont.lfFaceName, count );
     return strlen(name);
 }
 
@@ -703,7 +703,7 @@
 /***********************************************************************
  *           GetTextMetrics    (GDI.93)
  */
-BOOL GetTextMetrics( HDC hdc, LPTEXTMETRIC metrics )
+BOOL GetTextMetrics( HDC hdc, LPTEXTMETRIC16 metrics )
 {
     DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC );
     if (!dc) return FALSE;
@@ -783,7 +783,7 @@
 /***********************************************************************
  *           GetCharABCWidths   (GDI.307)
  */
-BOOL GetCharABCWidths(HDC hdc, UINT wFirstChar, UINT wLastChar, LPABC lpABC)
+BOOL GetCharABCWidths(HDC hdc, UINT wFirstChar, UINT wLastChar, LPABC16 lpABC)
 {
 
     /* No TrueType fonts in Wine so far */
@@ -881,7 +881,8 @@
 
 static int logfcmp(const void *a,const void *b) 
 {
-  return strcmp( (*(LPLOGFONT *)a)->lfFaceName, (*(LPLOGFONT *)b)->lfFaceName );
+  return strcmp( (*(LPLOGFONT16 *)a)->lfFaceName,
+                 (*(LPLOGFONT16 *)b)->lfFaceName );
 }
 
 void InitFontsList(void)
@@ -892,7 +893,7 @@
   char 	**names;
   char 	slant, spacing;
   int 	i, count;
-  LPLOGFONT lpNewFont;
+  LPLOGFONT16 lpNewFont;
   weight = "medium";
   slant = 'r';
   spacing = '*';
@@ -904,7 +905,7 @@
   names = XListFonts( display, pattern, MAX_FONTS, &count );
   dprintf_font(stddeb,"InitFontsList // count=%d \n", count);
   for (i = 0; i < count; i++) {
-    lpNewFont = malloc(sizeof(LOGFONT) + LF_FACESIZE);
+    lpNewFont = malloc(sizeof(LOGFONT16) + LF_FACESIZE);
     if (lpNewFont == NULL) {
       dprintf_font(stddeb, "InitFontsList // Error alloc new font structure !\n");
       break;
@@ -969,8 +970,8 @@
   HANDLE       hMet;
   HFONT	       hFont;
   HFONT	       hOldFont;
-  LPLOGFONT    lpLogFont;
-  LPTEXTMETRIC lptm;
+  LPLOGFONT16  lpLogFont;
+  LPTEXTMETRIC16 lptm;
   LPSTR	       lpOldName;
   char	       FaceName[LF_FACESIZE];
   int          nRet = 0;
@@ -979,14 +980,14 @@
   dprintf_font(stddeb,"EnumFonts(%04x, %p='%s', %08lx, %08lx)\n", 
 	       hDC, lpFaceName, lpFaceName, (LONG)lpEnumFunc, lpData);
   if (lpEnumFunc == 0) return 0;
-  hLog = GDI_HEAP_ALLOC( sizeof(LOGFONT) + LF_FACESIZE );
-  lpLogFont = (LPLOGFONT) GDI_HEAP_LIN_ADDR(hLog);
+  hLog = GDI_HEAP_ALLOC( sizeof(LOGFONT16) + LF_FACESIZE );
+  lpLogFont = (LPLOGFONT16) GDI_HEAP_LIN_ADDR(hLog);
   if (lpLogFont == NULL) {
     fprintf(stderr,"EnumFonts // can't alloc LOGFONT struct !\n");
     return 0;
   }
-  hMet = GDI_HEAP_ALLOC( sizeof(TEXTMETRIC) );
-  lptm = (LPTEXTMETRIC) GDI_HEAP_LIN_ADDR(hMet);
+  hMet = GDI_HEAP_ALLOC( sizeof(TEXTMETRIC16) );
+  lptm = (LPTEXTMETRIC16) GDI_HEAP_LIN_ADDR(hMet);
   if (lptm == NULL) {
     GDI_HEAP_FREE(hLog);
     fprintf(stderr, "EnumFonts // can't alloc TEXTMETRIC struct !\n");
@@ -1010,7 +1011,7 @@
     }
     dprintf_font(stddeb,"EnumFonts // enum '%s' !\n", lpLogFontList[i]->lfFaceName);
     dprintf_font(stddeb,"EnumFonts // %p !\n", lpLogFontList[i]);
-    memcpy(lpLogFont, lpLogFontList[i], sizeof(LOGFONT) + LF_FACESIZE);
+    memcpy(lpLogFont, lpLogFontList[i], sizeof(LOGFONT16) + LF_FACESIZE);
     hFont = CreateFontIndirect(lpLogFont);
     hOldFont = SelectObject(hDC, hFont);
     GetTextMetrics(hDC, lptm);
@@ -1039,8 +1040,8 @@
   HANDLE       	hMet;
   HFONT	       	hFont;
   HFONT	       	hOldFont;
-  LPENUMLOGFONT lpEnumLogFont;
-  LPTEXTMETRIC	lptm;
+  LPENUMLOGFONT16 lpEnumLogFont;
+  LPTEXTMETRIC16 lptm;
   LPSTR	       	lpOldName;
   char	       	FaceName[LF_FACESIZE];
   int	       	nRet = 0;
@@ -1049,14 +1050,14 @@
   dprintf_font(stddeb,"EnumFontFamilies(%04x, %p, %08lx, %08lx)\n",
 	       hDC, lpszFamily, (DWORD)lpEnumFunc, lpData);
   if (lpEnumFunc == 0) return 0;
-  hLog = GDI_HEAP_ALLOC( sizeof(ENUMLOGFONT) );
-  lpEnumLogFont = (LPENUMLOGFONT) GDI_HEAP_LIN_ADDR(hLog);
+  hLog = GDI_HEAP_ALLOC( sizeof(ENUMLOGFONT16) );
+  lpEnumLogFont = (LPENUMLOGFONT16) GDI_HEAP_LIN_ADDR(hLog);
   if (lpEnumLogFont == NULL) {
     fprintf(stderr,"EnumFontFamilies // can't alloc LOGFONT struct !\n");
     return 0;
   }
-  hMet = GDI_HEAP_ALLOC( sizeof(TEXTMETRIC) );
-  lptm = (LPTEXTMETRIC) GDI_HEAP_LIN_ADDR(hMet);
+  hMet = GDI_HEAP_ALLOC( sizeof(TEXTMETRIC16) );
+  lptm = (LPTEXTMETRIC16) GDI_HEAP_LIN_ADDR(hMet);
   if (lptm == NULL) {
     GDI_HEAP_FREE(hLog);
     fprintf(stderr,"EnumFontFamilies // can't alloc TEXTMETRIC struct !\n");
@@ -1077,10 +1078,10 @@
     } else {
       if (strcmp(FaceName, lpLogFontList[i]->lfFaceName) != 0) continue;
     }
-    memcpy(lpEnumLogFont, lpLogFontList[i], sizeof(LOGFONT));
+    memcpy(lpEnumLogFont, lpLogFontList[i], sizeof(LOGFONT16));
     strcpy(lpEnumLogFont->elfFullName,"");
     strcpy(lpEnumLogFont->elfStyle,"");
-    hFont = CreateFontIndirect((LPLOGFONT)lpEnumLogFont);
+    hFont = CreateFontIndirect((LPLOGFONT16)lpEnumLogFont);
     hOldFont = SelectObject(hDC, hFont);
     GetTextMetrics(hDC, lptm);
     SelectObject(hDC, hOldFont);
@@ -1119,7 +1120,7 @@
 /*************************************************************************
  *             GetKerningPairs      [GDI.332]
  */
-int GetKerningPairs(HDC hDC,int cBufLen,LPKERNINGPAIR lpKerningPairs)
+int GetKerningPairs(HDC hDC,int cBufLen,LPKERNINGPAIR16 lpKerningPairs)
 {
 	/* Wine fonts are ugly and don't support kerning :) */
 	return 0;
diff --git a/objects/gdiobj.c b/objects/gdiobj.c
index 81c1c16..ddf0a21 100644
--- a/objects/gdiobj.c
+++ b/objects/gdiobj.c
@@ -299,12 +299,12 @@
 
 
 /***********************************************************************
- *           GetObject    (GDI.82)
+ *           GetObject16    (GDI.82)
  */
-int GetObject( HANDLE handle, int count, LPSTR buffer )
+INT16 GetObject16( HANDLE16 handle, INT16 count, LPVOID buffer )
 {
     GDIOBJHDR * ptr = NULL;
-    dprintf_gdi(stddeb, "GetObject: %04x %d %p\n", handle, count, buffer );
+    dprintf_gdi(stddeb, "GetObject16: %04x %d %p\n", handle, count, buffer );
     if (!count) return 0;
 
     if ((handle >= FIRST_STOCK_HANDLE) && (handle <= LAST_STOCK_HANDLE))
@@ -320,7 +320,7 @@
       case BRUSH_MAGIC: 
 	  return BRUSH_GetObject( (BRUSHOBJ *)ptr, count, buffer );
       case BITMAP_MAGIC: 
-	  return BITMAP_GetObject( (BITMAPOBJ *)ptr, count, buffer );
+	  return BITMAP_GetObject16( (BITMAPOBJ *)ptr, count, buffer );
       case FONT_MAGIC:
 	  return FONT_GetObject( (FONTOBJ *)ptr, count, buffer );
       case PALETTE_MAGIC:
@@ -331,6 +331,46 @@
 
 
 /***********************************************************************
+ *           GetObject32A    (GDI32.204)
+ */
+INT32 GetObject32A( HANDLE32 handle, INT32 count, LPVOID buffer )
+{
+    GDIOBJHDR * ptr = NULL;
+    dprintf_gdi(stddeb, "GetObject32A: %08x %d %p\n", handle, count, buffer );
+    if (!count) return 0;
+
+    if ((handle >= FIRST_STOCK_HANDLE) && (handle <= LAST_STOCK_HANDLE))
+      ptr = StockObjects[handle - FIRST_STOCK_HANDLE];
+    else
+      ptr = (GDIOBJHDR *) GDI_HEAP_LIN_ADDR( handle );
+    if (!ptr) return 0;
+    
+    switch(ptr->wMagic)
+    {
+      case BITMAP_MAGIC: 
+	  return BITMAP_GetObject32( (BITMAPOBJ *)ptr, count, buffer );
+      case PEN_MAGIC:
+      case BRUSH_MAGIC: 
+      case FONT_MAGIC:
+      case PALETTE_MAGIC:
+          fprintf( stderr, "GetObject32: magic %04x not implemented\n",
+                   ptr->wMagic );
+          break;
+    }
+    return 0;
+}
+
+
+/***********************************************************************
+ *           GetObject32W    (GDI32.206)
+ */
+INT32 GetObject32W( HANDLE32 handle, INT32 count, LPVOID buffer )
+{
+    return GetObject32A( handle, count, buffer );
+}
+
+
+/***********************************************************************
  *           SelectObject    (GDI.45)
  */
 HANDLE SelectObject( HDC hdc, HANDLE handle )
@@ -397,8 +437,8 @@
     };
     
     int i, retval = 0;
-    LOGPEN *pen;
-    LOGBRUSH *brush = NULL;
+    LOGPEN16 *pen;
+    LOGBRUSH16 *brush = NULL;
 
     dprintf_gdi( stddeb, "EnumObjects: %04x %d %08lx %08lx\n",
                  hdc, nObjType, (DWORD)lpEnumFunc, lParam );
@@ -406,7 +446,7 @@
     {
     case OBJ_PEN:
         /* Enumerate solid pens */
-        if (!(pen = SEGPTR_NEW(LOGPEN))) break;
+        if (!(pen = SEGPTR_NEW(LOGPEN16))) break;
         for (i = 0; i < sizeof(solid_colors)/sizeof(solid_colors[0]); i++)
         {
             pen->lopnStyle   = PS_SOLID;
@@ -424,7 +464,7 @@
 
     case OBJ_BRUSH:
         /* Enumerate solid brushes */
-        if (!(brush = SEGPTR_NEW(LOGBRUSH))) break;
+        if (!(brush = SEGPTR_NEW(LOGBRUSH16))) break;
         for (i = 0; i < sizeof(solid_colors)/sizeof(solid_colors[0]); i++)
         {
             brush->lbStyle = BS_SOLID;
diff --git a/objects/metafile.c b/objects/metafile.c
index 983b419..bbaa8c4 100644
--- a/objects/metafile.c
+++ b/objects/metafile.c
@@ -563,17 +563,17 @@
 	
     case META_CREATEPENINDIRECT:
 	MF_AddHandle(ht, nHandles, 
-		     CreatePenIndirect((LOGPEN *)(&(mr->rdParam))));
+		     CreatePenIndirect((LOGPEN16 *)(&(mr->rdParam))));
 	break;
 
     case META_CREATEFONTINDIRECT:
 	MF_AddHandle(ht, nHandles, 
-		     CreateFontIndirect((LOGFONT *)(&(mr->rdParam))));
+		     CreateFontIndirect((LOGFONT16 *)(&(mr->rdParam))));
 	break;
 
     case META_CREATEBRUSHINDIRECT:
 	MF_AddHandle(ht, nHandles, 
-		     CreateBrushIndirect((LOGBRUSH *)(&(mr->rdParam))));
+		     CreateBrushIndirect((LOGBRUSH16 *)(&(mr->rdParam))));
 	break;
 
     /* W. Magro: Some new metafile operations.  Not all debugged. */
@@ -930,17 +930,17 @@
  *         MF_CreateBrushIndirect
  */
 
-BOOL MF_CreateBrushIndirect(DC *dc, HBRUSH hBrush, LOGBRUSH *logbrush)
+BOOL MF_CreateBrushIndirect(DC *dc, HBRUSH hBrush, LOGBRUSH16 *logbrush)
 {
     int index;
     HMETAFILE handle;
-    char buffer[sizeof(METARECORD) - 2 + sizeof(LOGBRUSH)];
+    char buffer[sizeof(METARECORD) - 2 + sizeof(LOGBRUSH16)];
     METARECORD *mr = (METARECORD *)&buffer;
     METAHEADER *mh;
 
-    mr->rdSize = (sizeof(METARECORD) + sizeof(LOGBRUSH) - 2) / 2;
+    mr->rdSize = (sizeof(METARECORD) + sizeof(LOGBRUSH16) - 2) / 2;
     mr->rdFunction = META_CREATEBRUSHINDIRECT;
-    memcpy(&(mr->rdParam), logbrush, sizeof(LOGBRUSH));
+    memcpy(&(mr->rdParam), logbrush, sizeof(LOGBRUSH16));
     if (!(dc->w.hMetaFile = MF_WriteRecord(dc->w.hMetaFile, 
 					  mr, mr->rdSize * 2)))
 	return FALSE;
@@ -968,7 +968,7 @@
  *         MF_CreatePatternBrush
  */
 
-BOOL MF_CreatePatternBrush(DC *dc, HBRUSH hBrush, LOGBRUSH *logbrush)
+BOOL MF_CreatePatternBrush(DC *dc, HBRUSH hBrush, LOGBRUSH16 *logbrush)
 {
     DWORD len, bmSize, biSize;
     HANDLE hmr;
@@ -1009,8 +1009,9 @@
 
     case BS_DIBPATTERN:
 	info = (BITMAPINFO *)GlobalLock16((HANDLE)logbrush->lbHatch);
-	bmSize = info->bmiHeader.biSizeImage;
-	if (!bmSize)
+	if (info->bmiHeader.biCompression)
+            bmSize = info->bmiHeader.biSizeImage;
+        else
 	    bmSize = (info->bmiHeader.biWidth * info->bmiHeader.biBitCount 
 		    + 31) / 32 * 8 * info->bmiHeader.biHeight;
 	biSize = DIB_BitmapInfoSize(info, LOWORD(logbrush->lbColor)); 
@@ -1058,17 +1059,17 @@
  *         MF_CreatePenIndirect
  */
 
-BOOL MF_CreatePenIndirect(DC *dc, HPEN16 hPen, LOGPEN *logpen)
+BOOL MF_CreatePenIndirect(DC *dc, HPEN16 hPen, LOGPEN16 *logpen)
 {
     int index;
     HMETAFILE handle;
-    char buffer[sizeof(METARECORD) - 2 + sizeof(LOGPEN)];
+    char buffer[sizeof(METARECORD) - 2 + sizeof(LOGPEN16)];
     METARECORD *mr = (METARECORD *)&buffer;
     METAHEADER *mh;
 
-    mr->rdSize = (sizeof(METARECORD) + sizeof(LOGPEN) - 2) / 2;
+    mr->rdSize = (sizeof(METARECORD) + sizeof(LOGPEN16) - 2) / 2;
     mr->rdFunction = META_CREATEPENINDIRECT;
-    memcpy(&(mr->rdParam), logpen, sizeof(LOGPEN));
+    memcpy(&(mr->rdParam), logpen, sizeof(LOGPEN16));
     if (!(dc->w.hMetaFile = MF_WriteRecord(dc->w.hMetaFile, mr, 
 					   mr->rdSize * 2)))
 	return FALSE;
@@ -1095,17 +1096,17 @@
  *         MF_CreateFontIndirect
  */
 
-BOOL MF_CreateFontIndirect(DC *dc, HFONT hFont, LOGFONT *logfont)
+BOOL MF_CreateFontIndirect(DC *dc, HFONT hFont, LOGFONT16 *logfont)
 {
     int index;
     HMETAFILE handle;
-    char buffer[sizeof(METARECORD) - 2 + sizeof(LOGFONT)];
+    char buffer[sizeof(METARECORD) - 2 + sizeof(LOGFONT16)];
     METARECORD *mr = (METARECORD *)&buffer;
     METAHEADER *mh;
 
-    mr->rdSize = (sizeof(METARECORD) + sizeof(LOGFONT) - 2) / 2;
+    mr->rdSize = (sizeof(METARECORD) + sizeof(LOGFONT16) - 2) / 2;
     mr->rdFunction = META_CREATEFONTINDIRECT;
-    memcpy(&(mr->rdParam), logfont, sizeof(LOGFONT));
+    memcpy(&(mr->rdParam), logfont, sizeof(LOGFONT16));
     if (!(dc->w.hMetaFile = MF_WriteRecord(dc->w.hMetaFile, mr, 
 					  mr->rdSize * 2)))
 	return FALSE;
diff --git a/objects/oembitmap.c b/objects/oembitmap.c
index 13f4627..bb5939c 100644
--- a/objects/oembitmap.c
+++ b/objects/oembitmap.c
@@ -149,7 +149,7 @@
 #define OIC_FIRST  OIC_SAMPLE      /* First OEM icon */
 #define OIC_LAST   OIC_WINEICON   /* Last OEM icon */
 
-static char **OBM_Icons_Data[OIC_LAST-OIC_FIRST+1] =
+static char ** const OBM_Icons_Data[OIC_LAST-OIC_FIRST+1] =
 {
     oic_sample,    /* OIC_SAMPLE */
     oic_hand,      /* OIC_HAND */
@@ -216,7 +216,7 @@
 #endif
 };
 
-static HCURSOR OBM_Cursors[NB_CURSORS] = { 0, };
+static HCURSOR OBM_Cursors[NB_CURSORS];
 
 
   /* All the colors used in the xpm files must be included in this   */
diff --git a/objects/pen.c b/objects/pen.c
index f28ce04..c32ca20 100644
--- a/objects/pen.c
+++ b/objects/pen.c
@@ -15,7 +15,7 @@
  */
 HPEN16 CreatePen( INT style, INT width, COLORREF color )
 {
-    LOGPEN logpen = { style, { width, 0 }, color };
+    LOGPEN16 logpen = { style, { width, 0 }, color };
     dprintf_gdi(stddeb, "CreatePen: %d %d %06lx\n", style, width, color );
     return CreatePenIndirect( &logpen );
 }
@@ -24,7 +24,7 @@
 /***********************************************************************
  *           CreatePenIndirect    (GDI.62)
  */
-HPEN16 CreatePenIndirect( const LOGPEN * pen )
+HPEN16 CreatePenIndirect( const LOGPEN16 * pen )
 {
     PENOBJ * penPtr;
     HPEN16 hpen;
@@ -33,7 +33,7 @@
     hpen = GDI_AllocObject( sizeof(PENOBJ), PEN_MAGIC );
     if (!hpen) return 0;
     penPtr = (PENOBJ *) GDI_HEAP_LIN_ADDR( hpen );    
-    memcpy( &penPtr->logpen, pen, sizeof(LOGPEN) );
+    memcpy( &penPtr->logpen, pen, sizeof(*pen) );
     return hpen;
 }
 
@@ -43,7 +43,7 @@
  */
 int PEN_GetObject( PENOBJ * pen, int count, LPSTR buffer )
 {
-    if (count > sizeof(LOGPEN)) count = sizeof(LOGPEN);
+    if (count > sizeof(pen->logpen)) count = sizeof(pen->logpen);
     memcpy( buffer, &pen->logpen, count );
     return count;
 }
diff --git a/objects/text.c b/objects/text.c
index 1d5a5e1..a9a67d3 100644
--- a/objects/text.c
+++ b/objects/text.c
@@ -194,7 +194,7 @@
     int len, lh, count=i_count;
     int prefix_x = 0;
     int prefix_end = 0;
-    TEXTMETRIC tm;
+    TEXTMETRIC16 tm;
     int x = rect->left, y = rect->top;
     int width = rect->right - rect->left;
     int max_width = 0;
@@ -581,20 +581,16 @@
 BOOL GrayString(HDC hdc, HBRUSH hbr, FARPROC gsprc, LPARAM lParam, 
 		INT cch, INT x, INT y, INT cx, INT cy)
 {
-	int s, current_color;
+    BOOL ret;
+    COLORREF current_color;
 
-	if (gsprc) {
-		return CallGrayStringProc(gsprc, hdc, lParam, 
-					cch ? cch : lstrlen((LPCSTR) lParam) );
-	} else {
-		current_color = GetTextColor(hdc);
-		SetTextColor(hdc, GetSysColor(COLOR_GRAYTEXT) );
-		s = TextOut16(hdc, x, y, (LPSTR) lParam, 
-                              cch ? cch : lstrlen((LPCSTR) lParam) );
-		SetTextColor(hdc, current_color);
-		
-		return s;
-	}
+    if (!cch) cch = lstrlen16( (LPCSTR)PTR_SEG_TO_LIN(lParam) );
+    if (gsprc) return CallGrayStringProc( gsprc, hdc, lParam, cch );
+    current_color = GetTextColor( hdc );
+    SetTextColor( hdc, GetSysColor(COLOR_GRAYTEXT) );
+    ret = TextOut16( hdc, x, y, (LPCSTR)PTR_SEG_TO_LIN(lParam), cch );
+    SetTextColor( hdc, current_color );
+    return ret;
 }
 
 
@@ -621,7 +617,7 @@
     }
     else
     {
-        TEXTMETRIC tm;
+        TEXTMETRIC16 tm;
         GetTextMetrics( hdc, &tm );
         defWidth = 8 * tm.tmAveCharWidth;
     }
diff --git a/win32/Makefile.in b/win32/Makefile.in
index 1b36259..452f909 100644
--- a/win32/Makefile.in
+++ b/win32/Makefile.in
@@ -10,7 +10,6 @@
 	error.c \
 	except.c \
 	file.c \
-	gdi32.c \
 	init.c \
 	memory.c \
 	newfns.c \
diff --git a/win32/except.c b/win32/except.c
index e98ce4a..8e42cc4 100644
--- a/win32/except.c
+++ b/win32/except.c
@@ -57,7 +57,7 @@
  *  
  */
 
-void EXC_RtlUnwind(PEXCEPTION_FRAME pEndFrame,PVOID unusedEip, 
+void EXC_RtlUnwind(PEXCEPTION_FRAME pEndFrame,LPVOID unusedEip, 
                    PEXCEPTION_RECORD pRecord, DWORD returnEax,
                    PCONTEXT pcontext)
 {   
@@ -73,7 +73,7 @@
      record.ExceptionCode=   0xC0000026;  /* invalid disposition */ 
      record.ExceptionFlags=  0;
      record.ExceptionRecord= NULL;
-     record.ExceptionAddress=(PVOID) pcontext->Eip; 
+     record.ExceptionAddress=(LPVOID) pcontext->Eip; 
      record.NumberParameters= 0;
      pRecord=&record;     
    }
@@ -99,7 +99,7 @@
                               retval, (int) dispatch);
   
        if(retval==ExceptionCollidedUnwind)
-          TebExceptionFrame=(PVOID) dispatch;
+          TebExceptionFrame=(LPVOID) dispatch;
        else if(TebExceptionFrame!=pEndFrame)
           TebExceptionFrame=TebExceptionFrame->Prev;
        else
@@ -130,7 +130,7 @@
     record.ExceptionFlags      = dwExceptionFlags;
     record.ExceptionRecord     = NULL;
     record.NumberParameters    = cArguments;
-    record.ExceptionAddress    = (PVOID) pcontext->Eip;
+    record.ExceptionAddress    = (LPVOID) pcontext->Eip;
     
     for(i=0;i<cArguments;i++)
        record.ExceptionInformation[i]=lpArguments[i];
diff --git a/win32/gdi32.c b/win32/gdi32.c
deleted file mode 100644
index 782c0b3..0000000
--- a/win32/gdi32.c
+++ /dev/null
@@ -1,74 +0,0 @@
-
-/*
- * Win32 GDI functions
- *
- * Copyright 1996 Thomas Sandford t.d.g.sandford@prds-grn.demon.co.uk
- */
-
-#include <windows.h>
-#include <gdi.h>
-#include <pen.h>
-#include <brush.h>
-#include <bitmap.h>
-#include <font.h>
-#include <palette.h>
-#include <debug.h>
-
-int WIN32_GetObject( HANDLE handle, int count, LPVOID buffer )
-
-/* largely a copy of GetObject, but with size mangling capabilities to
-convert between win16 and win32 objects. Yeuch! */
-
-{
-    void *temp = alloca(count);
-    GDIOBJHDR * ptr = NULL;
-
-    dprintf_win32(stddeb, "WIN32_GetObject: %d %d %p\n", handle, count, buffer);
-
-    if ((!count) || (temp == NULL))
-	return 0;
-
-    ptr = GDI_GetObjPtr(handle, MAGIC_DONTCARE);
-    if (!ptr) return 0;
-
-    /* FIXME: only bitmaps fixed so far */
-
-    switch(ptr->wMagic)
-    {
-      case PEN_MAGIC:
-          return PEN_GetObject( (PENOBJ *)ptr, count, buffer );
-      case BRUSH_MAGIC:
-          return BRUSH_GetObject( (BRUSHOBJ *)ptr, count, buffer );
-      case BITMAP_MAGIC: {
-	BITMAP *pbm = (BITMAP *)temp;
-	int *pdest = (int *)buffer;
-
-	if (buffer == NULL)
-		return 28;
-
-	BITMAP_GetObject( (BITMAPOBJ *)ptr, count, temp );
-	if (count > 3)
-		pdest[0] = pbm->bmType;
-	if (count > 7)
-		pdest[1] = pbm->bmWidth;
-	if (count > 11)
-		pdest[2] = pbm->bmHeight;
-	if (count > 15)
-		pdest[3] = pbm->bmWidthBytes;
-	if (count > 19)
-		pdest[4] = pbm->bmPlanes;
-	if (count > 23)
-		pdest[5] = pbm->bmBitsPixel;
-	if (count > 27)
-		pdest[6] = pbm->bmBits;
-	
-	return (count > 28) ? 28 : count - (count % 4);
-      }
-      case FONT_MAGIC:
-          return FONT_GetObject( (FONTOBJ *)ptr, count, buffer );
-      case PALETTE_MAGIC:
-          return PALETTE_GetObject( (PALETTEOBJ *)ptr, count, buffer );
-    }
-    return 0;
-}
-
diff --git a/win32/process.c b/win32/process.c
index 4ed4c7e..44ec155 100644
--- a/win32/process.c
+++ b/win32/process.c
@@ -119,6 +119,14 @@
 	return handle;
 }
 
+/***********************************************************************
+ *           FreeLibrary
+ */
+BOOL FreeLibrary32(HINSTANCE hLibModule)
+{
+	fprintf(stderr,"FreeLibrary: empty stub\n");
+	return TRUE;
+}
 
 #ifndef WINELIB
 /***********************************************************************
diff --git a/win32/resource.c b/win32/resource.c
index 4b4598d..3252379 100644
--- a/win32/resource.c
+++ b/win32/resource.c
@@ -59,7 +59,7 @@
 	entryTable = (PIMAGE_RESOURCE_DIRECTORY_ENTRY) (
 			(BYTE *) resdirptr + 
                         sizeof(IMAGE_RESOURCE_DIRECTORY));
-	namelen = STRING32_lstrlenW(name);
+	namelen = lstrlen32W(name);
 	for (entrynum = 0; entrynum < resdirptr->NumberOfNamedEntries; entrynum++)
 	{
 		PIMAGE_RESOURCE_DIR_STRING_U str =
@@ -67,7 +67,7 @@
 			(entryTable[entrynum].Name & 0x7fffffff));
 		if(namelen != str->Length)
 			continue;
-		if(STRING32_lstrcmpniW(name,str->NameString,str->Length)==0)
+		if(lstrncmpi32W(name,str->NameString,str->Length)==0)
 			return (PIMAGE_RESOURCE_DIRECTORY) (
 				root +
 				(entryTable[entrynum].OffsetToData & 0x7fffffff));
diff --git a/win32/string32.c b/win32/string32.c
index c888d11..011b445 100644
--- a/win32/string32.c
+++ b/win32/string32.c
@@ -11,18 +11,10 @@
 #include <stdio.h>
 #include <stdlib.h>
 #include <ctype.h>
+#include "windows.h"
 #include "string32.h"
 #include "xmalloc.h"
 
-int
-STRING32_UniLen(LPCWSTR s)
-{
-	int i;
-	for(i=0;*s;s++)
-		i++;
-	return i;
-}
-
 void STRING32_UniToAnsi(LPSTR dest,LPCWSTR src)
 {
 	static int have_warned=0;
@@ -55,7 +47,7 @@
 
 LPSTR STRING32_DupUniToAnsi(LPCWSTR src)
 {
-	LPSTR dest=xmalloc(STRING32_UniLen(src)+1);
+	LPSTR dest=xmalloc(lstrlen32W(src)+1);
 	STRING32_UniToAnsi(dest,src);
 	return dest;
 }
@@ -67,22 +59,6 @@
 	return dest;
 }
 
-LPWSTR STRING32_lstrcpyW(LPWSTR dst, LPCWSTR src)
-{
-    register LPWSTR p = dst;
-    while ((*p++ = *src++));
-    return dst;
-}
-
-
-DWORD STRING32_lstrlenW(LPCWSTR str)
-{
-	int len;
-	for(len=0;*str;str++)
-		len++;
-	return len;
-}
-
 /* not an API function */
 
 WCHAR STRING32_tolowerW(WCHAR c)
@@ -91,39 +67,6 @@
 	return tolower(c);
 }
 
-int STRING32_lstrcmpniW(LPCWSTR a,LPCWSTR b,DWORD len)
-{
-	while(len--)
-	{
-		WCHAR c1,c2;
-		c1 = STRING32_tolowerW(*a);
-		c2 = STRING32_tolowerW(*b);
-		if(c1<c2)return -1;
-		if(c1>c2)return 1;
-		if(c1==0 && c2==0)return 0;
-		if(c1==0)return -1;
-		if(c2==0)return 1;
-		a++;
-		b++;
-	}
-	return 0;
-}
-
-int
-STRING32_lstrcmpW(LPCWSTR a,LPCWSTR b) {
-	WCHAR	diff;
-
-	while(*a && *b) {
-		diff=*a-*b;
-		if (diff) return diff;
-		a++;
-		b++;
-	}
-	if (*a) return *a;
-	if (*b) return -*b;
-	return 0;
-}
-
 LPWSTR
 STRING32_lstrchrW(LPCWSTR a,WCHAR c) {
 	while(*a) {
@@ -139,7 +82,7 @@
 	LPWSTR	b;
 	int	len;
 
-	len=sizeof(WCHAR)*(STRING32_UniLen(a)+1);
+	len=sizeof(WCHAR)*(lstrlen32W(a)+1);
 	b=(LPWSTR)xmalloc(len);
 	memcpy(b,a,len);
 	return b;
diff --git a/win32/struct32.c b/win32/struct32.c
index 2d76d8f..15047e9 100644
--- a/win32/struct32.c
+++ b/win32/struct32.c
@@ -30,7 +30,7 @@
         p32->cy = p16->cy;
 }
 
-void STRUCT32_MSG16to32(MSG *msg16,MSG32 *msg32)
+void STRUCT32_MSG16to32(const MSG16 *msg16,MSG32 *msg32)
 {
 	msg32->hwnd=(DWORD)msg16->hwnd;
 	msg32->message=msg16->message;
@@ -41,7 +41,7 @@
 	msg32->pt.y=msg16->pt.y;
 }
 
-void STRUCT32_MSG32to16(MSG32 *msg32,MSG *msg16)
+void STRUCT32_MSG32to16(const MSG32 *msg32,MSG16 *msg16)
 {
 	msg16->hwnd=(HWND)msg32->hwnd;
 	msg16->message=msg32->message;
diff --git a/win32/thread.c b/win32/thread.c
index b538002..00e5daa 100644
--- a/win32/thread.c
+++ b/win32/thread.c
@@ -79,9 +79,12 @@
 	if(!Tls){
 		TlsCount++;
 		Tls=xmalloc(sizeof(LPVOID));
+		/* Tls needs to be zero initialized */
+		Tls[0]=0;
 		return 0;
 	}
 	Tls=xrealloc(Tls,sizeof(LPVOID)*(++TlsCount));
+	Tls[TlsCount-1]=0;
 	return TlsCount-1;
 }
 
@@ -110,3 +113,59 @@
 	}
 	Tls[index]=value;
 }
+
+/* FIXME: This is required to work cross-addres space as well */
+static CRITICAL_SECTION interlocked;
+static int interlocked_init;
+
+static void get_interlocked()
+{
+	if(!interlocked_init)
+		InitializeCriticalSection(&interlocked);
+	interlocked_init=1;
+	EnterCriticalSection(&interlocked);
+}
+
+static void release_interlocked()
+{
+	LeaveCriticalSection(&interlocked);
+}
+
+/***********************************************************************
+ *           InterlockedIncrement
+ */
+LONG InterlockedIncrement(LPLONG lpAddend)
+{
+	int ret;
+	get_interlocked();
+	(*lpAddend)++;
+	ret=*lpAddend;
+	release_interlocked();
+	return ret;
+}
+
+/***********************************************************************
+ *           InterlockedDecrement
+ */
+LONG InterlockedDecrement(LPLONG lpAddend)
+{
+	int ret;
+	get_interlocked();
+	(*lpAddend)--;
+	ret=*lpAddend;
+	release_interlocked();
+	return ret;
+}
+
+/***********************************************************************
+ *           InterlockedExchange
+ */
+LONG InterlockedExchange(LPLONG target, LONG value)
+{
+	int ret;
+	get_interlocked();
+	ret=*target;
+	*target=value;
+	release_interlocked();
+	return ret;
+}
diff --git a/win32/user32.c b/win32/user32.c
index 290e1cc..39ef0d7 100644
--- a/win32/user32.c
+++ b/win32/user32.c
@@ -29,7 +29,7 @@
 BOOL USER32_GetMessageA(MSG32* lpmsg,DWORD hwnd,DWORD min,DWORD max)
 {
 	BOOL ret;
-	MSG msg;
+	MSG16 msg;
 	ret=GetMessage(MAKE_SEGPTR(&msg),(HWND)hwnd,min,max);
 	STRUCT32_MSG16to32(&msg,lpmsg);
 	return ret;
@@ -40,7 +40,7 @@
  */
 LONG USER32_DispatchMessageA(MSG32* lpmsg)
 {
-	MSG msg;
+	MSG16 msg;
 	LONG ret;
 	STRUCT32_MSG32to16(lpmsg,&msg);
 	ret=DispatchMessage(&msg);
@@ -53,11 +53,34 @@
  */
 BOOL USER32_TranslateMessage(MSG32* lpmsg)
 {
-	MSG msg;
+	MSG16 msg;
 	STRUCT32_MSG32to16(lpmsg,&msg);
 	return TranslateMessage(&msg);
 }
 
+/***********************************************************************
+ *         PeekMessageA
+ */
+BOOL32 PeekMessage32A( LPMSG32 lpmsg, HWND32 hwnd,
+                       UINT32 min,UINT32 max,UINT32 wRemoveMsg)
+{
+	MSG16 msg;
+	BOOL ret;
+	ret=PeekMessage16(&msg,hwnd,min,max,wRemoveMsg);
+        /* FIXME: should translate the message to Win32 */
+	STRUCT32_MSG16to32(&msg,lpmsg);
+	return ret;
+}
+
+/***********************************************************************
+ *         PeekMessageW
+ */
+BOOL32 PeekMessage32W( LPMSG32 lpmsg, HWND32 hwnd,
+                       UINT32 min,UINT32 max,UINT32 wRemoveMsg)
+{
+	/* FIXME: Should perform Unicode translation on specific messages */
+	return PeekMessage32A(lpmsg,hwnd,min,max,wRemoveMsg);
+}
 
 UINT USER32_SetTimer(HWND hwnd, UINT id, UINT timeout, void *proc)
 
@@ -66,9 +89,3 @@
 (LONG)proc );
     return SetTimer( hwnd, id, timeout, MAKE_SEGPTR(proc));
 }   
-
-
-int USER32_wsprintfA( int *args )
-{
-    return vsprintf( (char *)args[0], (char *)args[1], (va_list)&args[2] );
-}
diff --git a/windows/caret.c b/windows/caret.c
index 526ac9b..902d309 100644
--- a/windows/caret.c
+++ b/windows/caret.c
@@ -131,8 +131,8 @@
 
     if (bitmap && (bitmap != 1))
     {
-        BITMAP bmp;
-        if (!GetObject( bitmap, sizeof(bmp), (LPSTR)&bmp )) return FALSE;
+        BITMAP16 bmp;
+        if (!GetObject16( bitmap, sizeof(bmp), &bmp )) return FALSE;
         Caret.width = bmp.bmWidth;
         Caret.height = bmp.bmHeight;
         /* FIXME: we should make a copy of the bitmap instead of a brush */
diff --git a/windows/class.c b/windows/class.c
index 4cf9e11..dc9865c 100644
--- a/windows/class.c
+++ b/windows/class.c
@@ -93,7 +93,7 @@
     {
         /* We need to copy the Unicode string */
         if ((classPtr->menuNameA = SEGPTR_ALLOC(
-                                 STRING32_lstrlenW(classPtr->menuNameW) + 1 )))
+                                        lstrlen32W(classPtr->menuNameW) + 1 )))
             STRING32_UniToAnsi( classPtr->menuNameA, classPtr->menuNameW );
     }
     return classPtr->menuNameA;
@@ -149,8 +149,8 @@
     if (HIWORD(classPtr->menuNameA)) SEGPTR_FREE( classPtr->menuNameA );
     if (classPtr->menuNameW) HeapFree( SystemHeap, 0, classPtr->menuNameW );
     if ((classPtr->menuNameW = HeapAlloc( SystemHeap, 0,
-                                 (STRING32_lstrlenW(name)+1)*sizeof(WCHAR) )))
-        STRING32_lstrcpyW( classPtr->menuNameW, name );
+                                         (lstrlen32W(name)+1)*sizeof(WCHAR) )))
+        lstrcpy32W( classPtr->menuNameW, name );
     classPtr->menuNameA = 0;
 }
 
@@ -619,7 +619,7 @@
 /***********************************************************************
  *           GetClassLong16    (USER.131)
  */
-LONG GetClassLong16( HWND hwnd, INT16 offset )
+LONG GetClassLong16( HWND16 hwnd, INT16 offset )
 {
     LONG ret;
 
@@ -641,7 +641,7 @@
 /***********************************************************************
  *           GetClassLong32A    (USER32.214)
  */
-LONG GetClassLong32A( HWND hwnd, INT32 offset )
+LONG GetClassLong32A( HWND32 hwnd, INT32 offset )
 {
     WND * wndPtr;
     
@@ -675,7 +675,7 @@
 /***********************************************************************
  *           GetClassLong32W    (USER32.215)
  */
-LONG GetClassLong32W( HWND hwnd, INT32 offset )
+LONG GetClassLong32W( HWND32 hwnd, INT32 offset )
 {
     WND * wndPtr;
     
@@ -731,7 +731,7 @@
 /***********************************************************************
  *           SetClassLong16    (USER.132)
  */
-LONG SetClassLong16( HWND hwnd, INT16 offset, LONG newval )
+LONG SetClassLong16( HWND16 hwnd, INT16 offset, LONG newval )
 {
     WND *wndPtr;
 
@@ -752,7 +752,7 @@
 /***********************************************************************
  *           SetClassLong32A    (USER32.466)
  */
-LONG SetClassLong32A( HWND hwnd, INT32 offset, LONG newval )
+LONG SetClassLong32A( HWND32 hwnd, INT32 offset, LONG newval )
 {
     WND * wndPtr;
     LONG retval = 0;
@@ -801,7 +801,7 @@
 /***********************************************************************
  *           SetClassLong32W    (USER32.467)
  */
-LONG SetClassLong32W( HWND hwnd, INT32 offset, LONG newval )
+LONG SetClassLong32W( HWND32 hwnd, INT32 offset, LONG newval )
 {
     WND *wndPtr;
     if (!(wndPtr = WIN_FindWndPtr(hwnd))) return 0;
@@ -823,7 +823,7 @@
 /***********************************************************************
  *           GetClassName16      (USER.58)
  */
-INT16 GetClassName16( HWND hwnd, LPSTR buffer, INT16 count )
+INT16 GetClassName16( HWND16 hwnd, LPSTR buffer, INT16 count )
 {
     WND *wndPtr;
     if (!(wndPtr = WIN_FindWndPtr(hwnd))) return 0;
@@ -834,7 +834,7 @@
 /***********************************************************************
  *           GetClassName32A      (USER32.216)
  */
-INT32 GetClassName32A( HWND hwnd, LPSTR buffer, INT32 count )
+INT32 GetClassName32A( HWND32 hwnd, LPSTR buffer, INT32 count )
 {
     WND *wndPtr;
     if (!(wndPtr = WIN_FindWndPtr(hwnd))) return 0;
@@ -845,7 +845,7 @@
 /***********************************************************************
  *           GetClassName32W      (USER32.217)
  */
-INT32 GetClassName32W( HWND hwnd, LPWSTR buffer, INT32 count )
+INT32 GetClassName32W( HWND32 hwnd, LPWSTR buffer, INT32 count )
 {
     WND *wndPtr;
     if (!(wndPtr = WIN_FindWndPtr(hwnd))) return 0;
@@ -856,7 +856,7 @@
 /***********************************************************************
  *           GetClassInfo16      (USER.404)
  */
-BOOL GetClassInfo16( HINSTANCE16 hInstance, SEGPTR name, WNDCLASS16 *wc )
+BOOL16 GetClassInfo16( HINSTANCE16 hInstance, SEGPTR name, WNDCLASS16 *wc )
 {
     ATOM atom;
     CLASS *classPtr;
@@ -884,7 +884,7 @@
 /***********************************************************************
  *           GetClassInfo32A      (USER32.210)
  */
-BOOL GetClassInfo32A( HINSTANCE32 hInstance, LPCSTR name, WNDCLASS32A *wc )
+BOOL32 GetClassInfo32A( HINSTANCE32 hInstance, LPCSTR name, WNDCLASS32A *wc )
 {
     ATOM atom;
     CLASS *classPtr;
@@ -910,7 +910,7 @@
 /***********************************************************************
  *           GetClassInfo32W      (USER32.213)
  */
-BOOL GetClassInfo32W( HINSTANCE32 hInstance, LPCWSTR name, WNDCLASS32W *wc )
+BOOL32 GetClassInfo32W( HINSTANCE32 hInstance, LPCWSTR name, WNDCLASS32W *wc )
 {
     ATOM atom;
     CLASS *classPtr;
@@ -939,7 +939,7 @@
  * FIXME: this is just a guess, I have no idea if GetClassInfoEx() is the
  * same in Win16 as in Win32. --AJ
  */
-BOOL GetClassInfoEx16( HINSTANCE16 hInstance, SEGPTR name, WNDCLASSEX16 *wc )
+BOOL16 GetClassInfoEx16( HINSTANCE16 hInstance, SEGPTR name, WNDCLASSEX16 *wc )
 {
     ATOM atom;
     CLASS *classPtr;
@@ -968,7 +968,8 @@
 /***********************************************************************
  *           GetClassInfoEx32A      (USER32.211)
  */
-BOOL GetClassInfoEx32A( HINSTANCE32 hInstance, LPCSTR name, WNDCLASSEX32A *wc )
+BOOL32 GetClassInfoEx32A( HINSTANCE32 hInstance, LPCSTR name,
+                          WNDCLASSEX32A *wc )
 {
     ATOM atom;
     CLASS *classPtr;
@@ -995,7 +996,8 @@
 /***********************************************************************
  *           GetClassInfoEx32W      (USER32.212)
  */
-BOOL GetClassInfoEx32W( HINSTANCE32 hInstance, LPCWSTR name, WNDCLASSEX32W *wc)
+BOOL32 GetClassInfoEx32W( HINSTANCE32 hInstance, LPCWSTR name,
+                          WNDCLASSEX32W *wc )
 {
     ATOM atom;
     CLASS *classPtr;
diff --git a/windows/dce.c b/windows/dce.c
index 4ec7624..8a809c9 100644
--- a/windows/dce.c
+++ b/windows/dce.c
@@ -15,6 +15,7 @@
  * DCX_WINDOWPAINT - BeginPaint specific flag
  */
 
+#include "options.h"
 #include "dce.h"
 #include "class.h"
 #include "win.h"
@@ -119,6 +120,9 @@
 
 /***********************************************************************
  *   DCE_InvalidateDCE
+ *
+ * It is called from SetWindowPos - we have to invalidate all busy
+ * DCE's for windows whose client rect intersects with update rectangle 
  */
 BOOL DCE_InvalidateDCE(WND* wndScope, RECT16* pRectUpdate)
 {
@@ -130,6 +134,7 @@
  dprintf_dc(stddeb,"InvalidateDCE: scope hwnd = %04x, (%i,%i - %i,%i)\n",
                     wndScope->hwndSelf, pRectUpdate->left,pRectUpdate->top,
 				        pRectUpdate->right,pRectUpdate->bottom);
+ /* walk all DCE's */
 
  for( hdce = firstDCE; (hdce); hdce=dce->hNext)
   { 
@@ -141,9 +146,11 @@
 
 	wnd = wndCurrent = WIN_FindWndPtr(dce->hwndCurrent);
 
-	/* desktop is not critical */
+	/* desktop is not critical (DC is not owned anyway) */
 
-	if( wnd == WIN_GetDesktop() ) continue;
+	if( wnd == WIN_GetDesktop() ) continue; 
+
+	/* check if DCE window is within z-order scope */
 
 	for( ; wnd ; wnd = wnd->parent )
 	    if( wnd == wndScope )
@@ -152,8 +159,9 @@
 
 	        dprintf_dc(stddeb,"\tgot hwnd %04x\n", wndCurrent->hwndSelf);
   
-	        MapWindowPoints16(wndCurrent->parent->hwndSelf, wndScope->hwndSelf,
-			 				(LPPOINT16)&wndRect, 2);
+	        if( wndCurrent->parent != wndScope )
+	            MapWindowPoints16(wndCurrent->parent->hwndSelf, wndScope->hwndSelf,
+			 				         (LPPOINT16)&wndRect, 2);
 	        if( IntersectRect16(&wndRect,&wndRect,pRectUpdate) )
 	            SetHookFlags(dce->hDC, DCHF_INVALIDATEVISRGN);
 	        break;
@@ -496,8 +504,11 @@
             else OffsetRgn( hrgnVisible, -wndPtr->rectClient.left,
                                          -wndPtr->rectClient.top );
         }
-      else if( hwnd==GetDesktopWindow() ) hrgnVisible = CreateRectRgn( 0, 0, SYSMETRICS_CXSCREEN,
-                                     SYSMETRICS_CYSCREEN);
+           /* optimize away GetVisRgn for desktop if it isn't there */
+
+      else if( hwnd==GetDesktopWindow() && !Options.desktopGeometry ) 
+	       hrgnVisible = CreateRectRgn( 0, 0, SYSMETRICS_CXSCREEN,
+                                                  SYSMETRICS_CYSCREEN);
       else hrgnVisible = DCE_GetVisRgn( hwnd, flags );
 
       dc->w.flags &= ~DC_DIRTY;
@@ -581,11 +592,9 @@
 	if( dce->DCXflags & DCX_KEEPCLIPRGN )
 	    dce->DCXflags &= ~DCX_KEEPCLIPRGN;
 	else
-	  {
 	    if( dce->hClipRgn > 1 )
 	        DeleteObject( dce->hClipRgn );
-	    dce->hClipRgn = 0;
-	  } 
+
         dce->hClipRgn = 0;
 	RestoreVisRgn(dce->hDC);
     }
@@ -593,7 +602,7 @@
     if (dce->DCXflags & DCX_CACHE)
     {
 	SetDCState( dce->hDC, defaultDCstate );
-	dce->DCXflags &= ~DCX_DCEBUSY;
+	dce->DCXflags = DCX_CACHE;
     }
     return 1;
 }
diff --git a/windows/defwnd.c b/windows/defwnd.c
index bed9009..caca49e 100644
--- a/windows/defwnd.c
+++ b/windows/defwnd.c
@@ -1,7 +1,7 @@
 /*
  * Default window procedure
  *
- * Copyright 1993 Alexandre Julliard
+ * Copyright 1993, 1996 Alexandre Julliard
  *	     1995 Alex Korobka
  */
 
@@ -15,7 +15,6 @@
 #include "string32.h"
 #include "syscolor.h"
 #include "stddebug.h"
-/* #define DEBUG_MESSAGE */
 #include "debug.h"
 #include "spy.h"
 
@@ -100,26 +99,24 @@
 static LRESULT DEFWND_DefWinProc( WND *wndPtr, UINT32 msg, WPARAM32 wParam,
                                   LPARAM lParam )
 {
-    HWND16 hwnd = wndPtr->hwndSelf;
-
     switch(msg)
     {
     case WM_PAINTICON: 
     case WM_NCPAINT:
-	return NC_HandleNCPaint( hwnd, (HRGN)wParam );
+	return NC_HandleNCPaint( wndPtr->hwndSelf, (HRGN)wParam );
 
     case WM_NCHITTEST:
-        return NC_HandleNCHitTest( hwnd, MAKEPOINT16(lParam) );
+        return NC_HandleNCHitTest( wndPtr->hwndSelf, MAKEPOINT16(lParam) );
 
     case WM_NCLBUTTONDOWN:
-	return NC_HandleNCLButtonDown( hwnd, wParam, lParam );
+	return NC_HandleNCLButtonDown( wndPtr->hwndSelf, wParam, lParam );
 
     case WM_LBUTTONDBLCLK:
     case WM_NCLBUTTONDBLCLK:
 	return NC_HandleNCLButtonDblClk( wndPtr, wParam, lParam );
 
     case WM_NCACTIVATE:
-	return NC_HandleNCActivate( hwnd, wParam );
+	return NC_HandleNCActivate( wndPtr->hwndSelf, wParam );
 
     case WM_NCDESTROY:
 	if (wndPtr->text) HeapFree( SystemHeap, 0, wndPtr->text );
@@ -132,35 +129,35 @@
     case WM_PAINT:
 	{
 	    PAINTSTRUCT16 paintstruct;
-	    BeginPaint16( hwnd, &paintstruct );
-	    EndPaint16( hwnd, &paintstruct );
+	    BeginPaint16( wndPtr->hwndSelf, &paintstruct );
+	    EndPaint16( wndPtr->hwndSelf, &paintstruct );
 	    return 0;
 	}
 
     case WM_SETREDRAW:
         if (!wParam)
         {
-            ValidateRect32( hwnd, NULL );
+            ValidateRect32( wndPtr->hwndSelf, NULL );
             wndPtr->flags |= WIN_NO_REDRAW;
         }
         else wndPtr->flags &= ~WIN_NO_REDRAW;
         return 0;
 
     case WM_CLOSE:
-	DestroyWindow( hwnd );
+	DestroyWindow( wndPtr->hwndSelf );
 	return 0;
 
     case WM_MOUSEACTIVATE:
 	if (wndPtr->dwStyle & WS_CHILD)
 	{
-	    LONG ret = SendMessage16( wndPtr->parent->hwndSelf, WM_MOUSEACTIVATE,
-				    wParam, lParam );
+	    LONG ret = SendMessage16( wndPtr->parent->hwndSelf,
+                                      WM_MOUSEACTIVATE, wParam, lParam );
 	    if (ret) return ret;
 	}
 	return MA_ACTIVATE;
 
     case WM_ACTIVATE:
-	if (LOWORD(wParam) != WA_INACTIVE) SetFocus( hwnd );
+	if (LOWORD(wParam) != WA_INACTIVE) SetFocus( wndPtr->hwndSelf );
 	break;
 
     case WM_ERASEBKGND:
@@ -172,12 +169,13 @@
                  HBRUSH hbrush;
                  hbrush = CreateSolidBrush(
                      GetSysColor(((DWORD)wndPtr->class->hbrBackground)-1));
-                 FillWindow( GetParent(hwnd), hwnd, (HDC)wParam, hbrush);
+                 FillWindow( GetParent(wndPtr->hwndSelf), wndPtr->hwndSelf,
+                             (HDC)wParam, hbrush);
                  DeleteObject (hbrush);
             }
             else
-	         FillWindow( GetParent(hwnd), hwnd, (HDC)wParam,
-                             wndPtr->class->hbrBackground );
+	         FillWindow( GetParent(wndPtr->hwndSelf), wndPtr->hwndSelf,
+                             (HDC)wParam, wndPtr->class->hbrBackground );
 	    return 1;
 	}
 
@@ -226,10 +224,11 @@
 	    if (SendMessage16(wndPtr->parent->hwndSelf, WM_SETCURSOR,
                             wParam, lParam))
 		return TRUE;
-	return NC_HandleSetCursor( hwnd, wParam, lParam );
+	return NC_HandleSetCursor( wndPtr->hwndSelf, wParam, lParam );
 
     case WM_SYSCOMMAND:
-        return NC_HandleSysCommand( hwnd, wParam, MAKEPOINT16(lParam) );
+        return NC_HandleSysCommand( wndPtr->hwndSelf, wParam,
+                                    MAKEPOINT16(lParam) );
 
     case WM_KEYDOWN:
 	if(wParam == VK_F10) iF10Key = VK_F10;
@@ -251,8 +250,8 @@
 	         iF10Key = 1;
 	     else
 	         if( wParam == VK_ESCAPE && GetKeyState(VK_SHIFT) < 0 )
-		     SendMessage16( hwnd, WM_SYSCOMMAND, (WPARAM)SC_KEYMENU, 
- 						       (LPARAM)VK_SPACE);
+		     SendMessage16( wndPtr->hwndSelf, WM_SYSCOMMAND,
+                                    (WPARAM)SC_KEYMENU, (LPARAM)VK_SPACE);
 	break;
 
     case WM_KEYUP:
@@ -260,8 +259,8 @@
 	/* Press and release F10 or ALT */
 	if (((wParam == VK_MENU) && iMenuSysKey) ||
             ((wParam == VK_F10) && iF10Key))
-	      SendMessage16( WIN_GetTopParent(hwnd), WM_SYSCOMMAND,
-			   SC_KEYMENU, 0L );
+	      SendMessage16( WIN_GetTopParent(wndPtr->hwndSelf),
+                             WM_SYSCOMMAND, SC_KEYMENU, 0L );
 	iMenuSysKey = iF10Key = 0;
         break;
 
@@ -269,7 +268,8 @@
 	iMenuSysKey = 0;
 	if (wParam == VK_RETURN && (wndPtr->dwStyle & WS_MINIMIZE))
         {
-	    PostMessage(hwnd, WM_SYSCOMMAND, (WPARAM)SC_RESTORE, 0L ); 
+	    PostMessage( wndPtr->hwndSelf, WM_SYSCOMMAND,
+                         (WPARAM)SC_RESTORE, 0L ); 
 	    break;
         } 
 	if ((HIWORD(lParam) & KEYDATA_ALT) && wParam)
@@ -278,7 +278,8 @@
 	    if (wParam == VK_SPACE && (wndPtr->dwStyle & WS_CHILD))
                 SendMessage16( wndPtr->parent->hwndSelf, msg, wParam, lParam );
 	    else
-                SendMessage16( hwnd, WM_SYSCOMMAND, (WPARAM)SC_KEYMENU, (LPARAM)(DWORD)wParam );
+                SendMessage16( wndPtr->hwndSelf, WM_SYSCOMMAND,
+                               (WPARAM)SC_KEYMENU, (LPARAM)(DWORD)wParam );
         } 
 	else /* check for Ctrl-Esc */
             if (wParam != VK_ESCAPE) MessageBeep(0);
@@ -289,7 +290,7 @@
         if (!(wndPtr->dwStyle & WS_POPUP) || !wndPtr->owner) return 0;
         if ((wndPtr->dwStyle & WS_VISIBLE) && wParam) return 0;
 	else if (!(wndPtr->dwStyle & WS_VISIBLE) && !wParam) return 0;
-        ShowWindow( hwnd, wParam ? SW_SHOWNOACTIVATE : SW_HIDE );
+        ShowWindow( wndPtr->hwndSelf, wParam ? SW_SHOWNOACTIVATE : SW_HIDE );
 	break; 
 
     case WM_INITMENUPOPUP:
@@ -302,7 +303,7 @@
     case WM_CANCELMODE:
 	/* EndMenu() should be called if in menu state but currently it's
 	   impossible to detect - menu code should be updated*/
-	if (GetCapture() == hwnd) ReleaseCapture();
+	if (GetCapture() == wndPtr->hwndSelf) ReleaseCapture();
 	break;
 
     case WM_VKEYTOITEM:
@@ -344,6 +345,7 @@
     WND * wndPtr = WIN_FindWndPtr( hwnd );
     LRESULT result = 0;
 
+    if (!wndPtr) return 0;
     SPY_EnterMessage( SPY_DEFWNDPROC16, hwnd, msg, wParam, lParam );
 
     switch(msg)
@@ -376,7 +378,7 @@
     case WM_GETTEXT:
         if (wParam && wndPtr->text)
         {
-            lstrcpyn( (LPSTR)PTR_SEG_TO_LIN(lParam), wndPtr->text, wParam );
+            lstrcpyn32A( (LPSTR)PTR_SEG_TO_LIN(lParam), wndPtr->text, wParam );
             result = (LRESULT)strlen( (LPSTR)PTR_SEG_TO_LIN(lParam) ) + 1;
         }
         break;
@@ -405,6 +407,7 @@
     WND * wndPtr = WIN_FindWndPtr( hwnd );
     LRESULT result = 0;
 
+    if (!wndPtr) return 0;
     SPY_EnterMessage( SPY_DEFWNDPROC32, hwnd, msg, wParam, lParam );
 
     switch(msg)
@@ -441,7 +444,7 @@
     case WM_GETTEXT:
         if (wParam && wndPtr->text)
         {
-            lstrcpyn( (LPSTR)lParam, wndPtr->text, wParam );
+            lstrcpyn32A( (LPSTR)lParam, wndPtr->text, wParam );
             result = (LRESULT)strlen( (LPSTR)lParam ) + 1;
         }
         break;
@@ -483,6 +486,7 @@
             }
 	    result = 1;
 	}
+        break;
 
     case WM_GETTEXT:
         {
diff --git a/windows/dialog.c b/windows/dialog.c
index 4e010bc..8d4c82b 100644
--- a/windows/dialog.c
+++ b/windows/dialog.c
@@ -65,7 +65,7 @@
  */
 BOOL DIALOG_Init()
 {
-    TEXTMETRIC tm;
+    TEXTMETRIC16 tm;
     HDC hdc;
     
       /* Calculate the dialog base units */
@@ -154,7 +154,7 @@
         dprintf_dialog(stddeb,"'%s'", info->windowName );
     }
 
-    info->data = (LPVOID)(*p ? p + 1 : NULL);  /* FIXME: is this right? */
+    info->data = (LPVOID)(*p ? p + 1 : NULL);  /* FIXME: should be a segptr */
     p += *p + 1;
 
     dprintf_dialog( stddeb," %d, %d, %d, %d, %d, %08lx, %08lx\n", 
@@ -200,7 +200,7 @@
     else
     {
         info->className = (LPCSTR)p;
-        p += STRING32_lstrlenW( (LPCWSTR)p ) + 1;
+        p += lstrlen32W( (LPCWSTR)p ) + 1;
     }
     dprintf_dialog(stddeb, "   %p ", info->className );
 
@@ -213,7 +213,7 @@
     else
     {
 	info->windowName = (LPCSTR)p;
-        p += STRING32_lstrlenW( (LPCWSTR)p ) + 1;
+        p += lstrlen32W( (LPCWSTR)p ) + 1;
         dprintf_dialog(stddeb,"'%p'", info->windowName );
     }
 
@@ -427,7 +427,7 @@
     default:
         result->menuName = (LPCSTR)p;
         dprintf_dialog( stddeb, " MENU '%p'\n", p );
-        p += STRING32_lstrlenW( (LPCWSTR)p ) + 1;
+        p += lstrlen32W( (LPCWSTR)p ) + 1;
         break;
     }
 
@@ -447,14 +447,14 @@
     default:
         result->className = (LPCSTR)p;
         dprintf_dialog( stddeb, " CLASS '%p'\n", p );
-        p += STRING32_lstrlenW( (LPCWSTR)p ) + 1;
+        p += lstrlen32W( (LPCWSTR)p ) + 1;
         break;
     }
 
     /* Get the window caption */
 
     result->caption = (LPCSTR)p;
-    p += STRING32_lstrlenW( (LPCWSTR)p ) + 1;
+    p += lstrlen32W( (LPCWSTR)p ) + 1;
     dprintf_dialog( stddeb, " CAPTION '%p'\n", result->caption );
 
     /* Get the font name */
@@ -464,7 +464,7 @@
 	result->pointSize = GET_WORD(p);
         p++;
 	result->faceName = (LPCSTR)p;
-        p += STRING32_lstrlenW( (LPCWSTR)p ) + 1;
+        p += lstrlen32W( (LPCWSTR)p ) + 1;
 	dprintf_dialog( stddeb, " FONT %d,'%p'\n",
                         result->pointSize, result->faceName );
     }
@@ -517,7 +517,7 @@
                             template.faceName );  /* FIXME: win32 */
 	if (hFont)
 	{
-	    TEXTMETRIC tm;
+	    TEXTMETRIC16 tm;
 	    HFONT oldFont;
 	    HDC hdc;
 
@@ -577,7 +577,6 @@
       /* Initialise dialog extra data */
 
     dlgInfo = (DIALOGINFO *)wndPtr->wExtra;
-    dlgInfo->dlgProc   = dlgProc;
     dlgInfo->hUserFont = hFont;
     dlgInfo->hMenu     = hMenu;
     dlgInfo->xBaseUnit = xUnit;
@@ -596,6 +595,7 @@
 
     /* Send initialisation messages and set focus */
 
+    dlgInfo->dlgProc   = dlgProc;
     dlgInfo->hwndFocus = DIALOG_GetFirstTabItem( hwnd );
     if (dlgInfo->hUserFont)
 	SendMessage32A( hwnd, WM_SETFONT, (WPARAM)dlgInfo->hUserFont, 0 );
@@ -610,7 +610,7 @@
  *           CreateDialog16   (USER.89)
  */
 HWND16 CreateDialog16( HINSTANCE16 hInst, SEGPTR dlgTemplate,
-                       HWND16 owner, DLGPROC dlgProc )
+                       HWND16 owner, DLGPROC16 dlgProc )
 {
     return CreateDialogParam16( hInst, dlgTemplate, owner, dlgProc, 0 );
 }
@@ -620,7 +620,7 @@
  *           CreateDialogParam16   (USER.241)
  */
 HWND16 CreateDialogParam16( HINSTANCE16 hInst, SEGPTR dlgTemplate,
-                            HWND16 owner, DLGPROC dlgProc, LPARAM param )
+                            HWND16 owner, DLGPROC16 dlgProc, LPARAM param )
 {
     HWND16 hwnd = 0;
     HRSRC hRsrc;
@@ -644,7 +644,7 @@
  *           CreateDialogParam32A   (USER32.72)
  */
 HWND32 CreateDialogParam32A( HINSTANCE32 hInst, LPCSTR name,
-                             HWND32 owner, DLGPROC dlgProc, LPARAM param )
+                             HWND32 owner, DLGPROC32 dlgProc, LPARAM param )
 {
     if (HIWORD(name))
     {
@@ -661,7 +661,7 @@
  *           CreateDialogParam32W   (USER32.73)
  */
 HWND32 CreateDialogParam32W( HINSTANCE32 hInst, LPCWSTR name,
-                             HWND32 owner, DLGPROC dlgProc, LPARAM param )
+                             HWND32 owner, DLGPROC32 dlgProc, LPARAM param )
 {
     HANDLE32 hrsrc = FindResource32( hInst, name, (LPWSTR)RT_DIALOG );
     if (!hrsrc) return 0;
@@ -674,7 +674,7 @@
  *           CreateDialogIndirect16   (USER.219)
  */
 HWND16 CreateDialogIndirect16( HINSTANCE16 hInst, LPCVOID dlgTemplate,
-                               HWND16 owner, DLGPROC dlgProc )
+                               HWND16 owner, DLGPROC16 dlgProc )
 {
     return CreateDialogIndirectParam16( hInst, dlgTemplate, owner, dlgProc, 0);
 }
@@ -684,7 +684,7 @@
  *           CreateDialogIndirectParam16   (USER.242)
  */
 HWND16 CreateDialogIndirectParam16( HINSTANCE16 hInst, LPCVOID dlgTemplate,
-                                    HWND16 owner, DLGPROC dlgProc,
+                                    HWND16 owner, DLGPROC16 dlgProc,
                                     LPARAM param )
 {
     HANDLE32 proc = WINPROC_AllocWinProc( (UINT32)dlgProc, WIN_PROC_16 );
@@ -697,7 +697,7 @@
  *           CreateDialogIndirectParam32A   (USER32.69)
  */
 HWND32 CreateDialogIndirectParam32A( HINSTANCE32 hInst, LPCVOID dlgTemplate,
-                                     HWND32 owner, DLGPROC dlgProc,
+                                     HWND32 owner, DLGPROC32 dlgProc,
                                      LPARAM param )
 {
     HANDLE32 proc = WINPROC_AllocWinProc( (UINT32)dlgProc, WIN_PROC_32A );
@@ -710,7 +710,7 @@
  *           CreateDialogIndirectParam32W   (USER32.71)
  */
 HWND32 CreateDialogIndirectParam32W( HINSTANCE32 hInst, LPCVOID dlgTemplate,
-                                     HWND32 owner, DLGPROC dlgProc,
+                                     HWND32 owner, DLGPROC32 dlgProc,
                                      LPARAM param )
 {
     HANDLE32 proc = WINPROC_AllocWinProc( (UINT32)dlgProc, WIN_PROC_32W );
@@ -727,14 +727,14 @@
     WND * wndPtr;
     DIALOGINFO * dlgInfo;
     HANDLE msgHandle;
-    MSG* lpmsg;
+    MSG16* lpmsg;
     INT32 retval;
 
       /* Owner must be a top-level window */
     owner = WIN_GetTopParent( owner );
     if (!(wndPtr = WIN_FindWndPtr( hwnd ))) return -1;
-    if (!(msgHandle = USER_HEAP_ALLOC( sizeof(MSG) ))) return -1;
-    lpmsg = (MSG *) USER_HEAP_LIN_ADDR( msgHandle );
+    if (!(msgHandle = USER_HEAP_ALLOC( sizeof(MSG16) ))) return -1;
+    lpmsg = (MSG16 *) USER_HEAP_LIN_ADDR( msgHandle );
     dlgInfo = (DIALOGINFO *)wndPtr->wExtra;
     EnableWindow( owner, FALSE );
     ShowWindow( hwnd, SW_SHOW );
@@ -762,7 +762,7 @@
  *           DialogBox16   (USER.87)
  */
 INT16 DialogBox16( HINSTANCE16 hInst, SEGPTR dlgTemplate,
-                   HWND16 owner, DLGPROC dlgProc )
+                   HWND16 owner, DLGPROC16 dlgProc )
 {
     return DialogBoxParam16( hInst, dlgTemplate, owner, dlgProc, 0 );
 }
@@ -772,7 +772,7 @@
  *           DialogBoxParam16   (USER.239)
  */
 INT16 DialogBoxParam16( HINSTANCE16 hInst, SEGPTR template,
-                        HWND16 owner, DLGPROC dlgProc, LPARAM param )
+                        HWND16 owner, DLGPROC16 dlgProc, LPARAM param )
 {
     HWND16 hwnd = CreateDialogParam16( hInst, template, owner, dlgProc, param);
     if (hwnd) return (INT16)DIALOG_DoDialogBox( hwnd, owner );
@@ -784,7 +784,7 @@
  *           DialogBoxParam32A   (USER32.138)
  */
 INT32 DialogBoxParam32A( HINSTANCE32 hInst, LPCSTR name,
-                         HWND32 owner, DLGPROC dlgProc, LPARAM param )
+                         HWND32 owner, DLGPROC32 dlgProc, LPARAM param )
 {
     HWND32 hwnd = CreateDialogParam32A( hInst, name, owner, dlgProc, param );
     if (hwnd) return DIALOG_DoDialogBox( hwnd, owner );
@@ -796,7 +796,7 @@
  *           DialogBoxParam32W   (USER32.139)
  */
 INT32 DialogBoxParam32W( HINSTANCE32 hInst, LPCWSTR name,
-                         HWND32 owner, DLGPROC dlgProc, LPARAM param )
+                         HWND32 owner, DLGPROC32 dlgProc, LPARAM param )
 {
     HWND32 hwnd = CreateDialogParam32W( hInst, name, owner, dlgProc, param );
     if (hwnd) return DIALOG_DoDialogBox( hwnd, owner );
@@ -808,7 +808,7 @@
  *           DialogBoxIndirect16   (USER.218)
  */
 INT16 DialogBoxIndirect16( HINSTANCE16 hInst, HANDLE16 dlgTemplate,
-                           HWND16 owner, DLGPROC dlgProc )
+                           HWND16 owner, DLGPROC16 dlgProc )
 {
     return DialogBoxIndirectParam16( hInst, dlgTemplate, owner, dlgProc, 0 );
 }
@@ -818,7 +818,7 @@
  *           DialogBoxIndirectParam16   (USER.240)
  */
 INT16 DialogBoxIndirectParam16( HINSTANCE16 hInst, HANDLE16 dlgTemplate,
-                                HWND16 owner, DLGPROC dlgProc, LPARAM param )
+                                HWND16 owner, DLGPROC16 dlgProc, LPARAM param )
 {
     HWND16 hwnd;
     LPCVOID ptr;
@@ -835,7 +835,7 @@
  *           DialogBoxIndirectParam32A   (USER32.135)
  */
 INT32 DialogBoxIndirectParam32A( HINSTANCE32 hInstance, LPCVOID template,
-                                 HWND32 owner, DLGPROC dlgProc ,LPARAM param )
+                                 HWND32 owner, DLGPROC32 dlgProc ,LPARAM param)
 {
     HWND32 hwnd = CreateDialogIndirectParam32A( hInstance, template,
                                                 owner, dlgProc, param );
@@ -848,7 +848,7 @@
  *           DialogBoxIndirectParam32W   (USER32.137)
  */
 INT32 DialogBoxIndirectParam32W( HINSTANCE32 hInstance, LPCVOID template,
-                                 HWND32 owner, DLGPROC dlgProc ,LPARAM param )
+                                 HWND32 owner, DLGPROC32 dlgProc ,LPARAM param)
 {
     HWND32 hwnd = CreateDialogIndirectParam32W( hInstance, template,
                                                 owner, dlgProc, param );
@@ -874,7 +874,7 @@
 /***********************************************************************
  *           IsDialogMessage   (USER.90)
  */
-BOOL IsDialogMessage( HWND hwndDlg, LPMSG msg )
+BOOL IsDialogMessage( HWND hwndDlg, LPMSG16 msg )
 {
     WND * wndPtr;
     int dlgCode;
diff --git a/windows/event.c b/windows/event.c
index ce75d90..66fb819 100644
--- a/windows/event.c
+++ b/windows/event.c
@@ -54,8 +54,8 @@
 static XContext winContext = 0;
 
   /* State variables */
-BOOL MouseButtonsStates[NB_BUTTONS] = { FALSE, FALSE, FALSE };
-BOOL AsyncMouseButtonsStates[NB_BUTTONS] = { FALSE, FALSE, FALSE };
+BOOL MouseButtonsStates[NB_BUTTONS];
+BOOL AsyncMouseButtonsStates[NB_BUTTONS];
 BYTE KeyStateTable[256];
 BYTE AsyncKeyStateTable[256];
 
@@ -67,26 +67,26 @@
 static BOOL	InputEnabled = TRUE;
 
 /* Keyboard translation tables */
-static int special_key[] =
+static const int special_key[] =
 {
     VK_BACK, VK_TAB, 0, VK_CLEAR, 0, VK_RETURN, 0, 0,           /* FF08 */
     0, 0, 0, VK_PAUSE, VK_SCROLL, 0, 0, 0,                      /* FF10 */
     0, 0, 0, VK_ESCAPE                                          /* FF18 */
 };
 
-static cursor_key[] =
+static const int cursor_key[] =
 {
     VK_HOME, VK_LEFT, VK_UP, VK_RIGHT, VK_DOWN, VK_PRIOR, 
                                        VK_NEXT, VK_END          /* FF50 */
 };
 
-static misc_key[] =
+static const int misc_key[] =
 {
     VK_SELECT, VK_SNAPSHOT, VK_EXECUTE, VK_INSERT, 0, 0, 0, 0,  /* FF60 */
     VK_CANCEL, VK_HELP, VK_CANCEL, VK_MENU                      /* FF68 */
 };
 
-static keypad_key[] =
+static const int keypad_key[] =
 {
     VK_MENU, VK_NUMLOCK,                                        /* FF7E */
     0, 0, 0, 0, 0, 0, 0, 0,                                     /* FF80 */
@@ -101,14 +101,14 @@
     VK_NUMPAD8, VK_NUMPAD9                                      /* FFB8 */
 };
     
-static function_key[] =
+static const int function_key[] =
 {
     VK_F1, VK_F2,                                               /* FFBE */
     VK_F3, VK_F4, VK_F5, VK_F6, VK_F7, VK_F8, VK_F9, VK_F10,    /* FFC0 */
     VK_F11, VK_F12, VK_F13, VK_F14, VK_F15, VK_F16              /* FFC8 */
 };
 
-static modifier_key[] =
+static const int modifier_key[] =
 {
     VK_SHIFT, VK_SHIFT, VK_CONTROL, VK_CONTROL, VK_CAPITAL,
                                                 0, 0,           /* FFE1 */
@@ -133,7 +133,7 @@
 
 static BOOL KeyDown = FALSE;
 
-static const char *event_names[] =
+static const char * const event_names[] =
 {
     "", "", "KeyPress", "KeyRelease", "ButtonPress", "ButtonRelease",
     "MotionNotify", "EnterNotify", "LeaveNotify", "FocusIn", "FocusOut",
diff --git a/windows/mdi.c b/windows/mdi.c
index a48aea3..01b0fcf 100644
--- a/windows/mdi.c
+++ b/windows/mdi.c
@@ -31,7 +31,6 @@
 #include "stddebug.h"
 #include "debug.h"
 
-#define MDIS_ALLCHILDSTYLES	0x1
 
 static HBITMAP hBmpClose   = 0;
 static HBITMAP hBmpRestore = 0;
@@ -104,7 +103,7 @@
 
  if( !clientInfo->hWindowMenu ) return 0;
 
- if (wndPtr->text) lstrcpyn(buffer + n, wndPtr->text, sizeof(buffer) - n );
+ if (wndPtr->text) lstrcpyn32A(buffer + n, wndPtr->text, sizeof(buffer) - n );
 
  n    = GetMenuState(clientInfo->hWindowMenu,wndPtr->wIDmenu ,MF_BYCOMMAND); 
  bRet = ModifyMenu32A(clientInfo->hWindowMenu , wndPtr->wIDmenu, 
@@ -148,7 +147,7 @@
 
 	n = sprintf(buffer, "%d ",index - clientInfo->idFirstChild);
 	if (wndPtr->text)
-            lstrcpyn(buffer + n, wndPtr->text, sizeof(buffer) - n );	
+            lstrcpyn32A(buffer + n, wndPtr->text, sizeof(buffer) - n );	
 
 	/* change menu */
 	ModifyMenu32A(clientInfo->hWindowMenu ,index ,MF_BYCOMMAND | MF_STRING,
@@ -305,7 +304,7 @@
 HWND MDICreateChild(WND *w, MDICLIENTINFO *ci, HWND parent, LPARAM lParam )
 {
     POINT16          pos[2]; 
-    MDICREATESTRUCT *cs = (MDICREATESTRUCT *)PTR_SEG_TO_LIN(lParam);
+    MDICREATESTRUCT16 *cs = (MDICREATESTRUCT16 *)PTR_SEG_TO_LIN(lParam);
     DWORD	     style = cs->style | (WS_CHILD | WS_CLIPSIBLINGS);
     HWND 	     hwnd, hwndMax = 0;
     WORD	     wIDmenu = ci->idFirstChild + ci->nActiveChildren;
@@ -911,7 +910,7 @@
 	 int	i_frame_text_length = strlen(ci->frameTitle);
 	 int    i_child_text_length = strlen(childWnd->text);
 
-	 lstrcpyn( lpBuffer, ci->frameTitle, MDI_MAXTITLELENGTH);
+	 lstrcpyn32A( lpBuffer, ci->frameTitle, MDI_MAXTITLELENGTH);
 
 	 if( i_frame_text_length + 6 < MDI_MAXTITLELENGTH )
          {
@@ -924,9 +923,9 @@
              }
 	     else
              {
-                 lstrcpyn( lpBuffer + i_frame_text_length + 4, 
-                           childWnd->text,
-                           MDI_MAXTITLELENGTH - i_frame_text_length - 5 );
+                 lstrcpyn32A( lpBuffer + i_frame_text_length + 4, 
+                              childWnd->text,
+                              MDI_MAXTITLELENGTH - i_frame_text_length - 5 );
                  strcat( lpBuffer, "]" );
 		}
 	   }
@@ -958,7 +957,7 @@
 LRESULT MDIClientWndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
 {
     LPCREATESTRUCT16     cs;
-    LPCLIENTCREATESTRUCT ccs;
+    LPCLIENTCREATESTRUCT16 ccs;
     MDICLIENTINFO       *ci;
     RECT16		 rect;
     WND                 *w 	  = WIN_FindWndPtr(hwnd);
@@ -970,7 +969,7 @@
     {
       case WM_CREATE:
 	cs                      = (LPCREATESTRUCT16) PTR_SEG_TO_LIN(lParam);
-	ccs                     = (LPCLIENTCREATESTRUCT) PTR_SEG_TO_LIN(cs->lpCreateParams);
+	ccs                     = (LPCLIENTCREATESTRUCT16) PTR_SEG_TO_LIN(cs->lpCreateParams);
 
 	ci->hWindowMenu         = ccs->hWindowMenu;
 	ci->idFirstChild        = ccs->idFirstChild;
@@ -1501,7 +1500,7 @@
  *					TranslateMDISysAccel (USER.451)
  *
  */
-BOOL TranslateMDISysAccel(HWND hwndClient, LPMSG msg)
+BOOL TranslateMDISysAccel(HWND hwndClient, LPMSG16 msg)
 {
   WND* clientWnd = WIN_FindWndPtr( hwndClient);
   WND* wnd;
diff --git a/windows/message.c b/windows/message.c
index e12db33..8ff4af2 100644
--- a/windows/message.c
+++ b/windows/message.c
@@ -29,7 +29,7 @@
 extern BYTE* 	KeyStateTable;				 /* event.c */
 extern WPARAM	lastEventChar;				 /* event.c */
 
-extern BOOL TIMER_CheckTimer( LONG *next, MSG *msg,
+extern BOOL TIMER_CheckTimer( LONG *next, MSG16 *msg,
 			      HWND hwnd, BOOL remove );  /* timer.c */
 
 DWORD MSG_WineStartTicks;  				 /* Ticks at Wine startup */
@@ -51,7 +51,7 @@
  *   the coordinates to client coordinates.
  * - Send the WM_SETCURSOR message.
  */
-static BOOL MSG_TranslateMouseMsg( MSG *msg, BOOL remove )
+static BOOL MSG_TranslateMouseMsg( MSG16 *msg, BOOL remove )
 {
     WND *pWnd;
     BOOL eatMsg = FALSE;
@@ -60,7 +60,7 @@
     static WORD  lastClickMsg = 0;
     static POINT16 lastClickPos = { 0, 0 };
     POINT16 pt = msg->pt;
-    MOUSEHOOKSTRUCT hook = { msg->pt, 0, HTCLIENT, 0 };
+    MOUSEHOOKSTRUCT16 hook = { msg->pt, 0, HTCLIENT, 0 };
 
     BOOL mouseClick = ((msg->message == WM_LBUTTONDOWN) ||
 		       (msg->message == WM_RBUTTONDOWN) ||
@@ -170,7 +170,7 @@
  * Return value indicates whether the translated message must be passed
  * to the user.
  */
-static BOOL MSG_TranslateKeyboardMsg( MSG *msg, BOOL remove )
+static BOOL MSG_TranslateKeyboardMsg( MSG16 *msg, BOOL remove )
 {
       /* Should check Ctrl-Esc and PrintScreen here */
 
@@ -195,7 +195,7 @@
  *
  * Peek for a hardware message matching the hwnd and message filters.
  */
-static BOOL MSG_PeekHardwareMsg( MSG *msg, HWND hwnd, WORD first, WORD last,
+static BOOL MSG_PeekHardwareMsg( MSG16 *msg, HWND hwnd, WORD first, WORD last,
                                  BOOL remove )
 {
     MESSAGEQUEUE *sysMsgQueue = QUEUE_GetSysQueue();
@@ -221,8 +221,8 @@
         }
         else  /* Non-standard hardware event */
         {
-            HARDWAREHOOKSTRUCT hook = { msg->hwnd, msg->message,
-                                        msg->wParam, msg->lParam };
+            HARDWAREHOOKSTRUCT16 hook = { msg->hwnd, msg->message,
+                                          msg->wParam, msg->lParam };
             if (HOOK_CallHooks( WH_HARDWARE, remove ? HC_ACTION : HC_NOREMOVE,
                                 0, (LPARAM)MAKE_SEGPTR(&hook) )) continue;
         }
@@ -237,7 +237,7 @@
             continue;  /* Not for this task */
         if (remove)
         {
-            MSG tmpMsg = *msg; /* FIXME */
+            MSG16 tmpMsg = *msg; /* FIXME */
             HOOK_CallHooks( WH_JOURNALRECORD, HC_ACTION,
                             0, (LPARAM)MAKE_SEGPTR(&tmpMsg) );
             QUEUE_RemoveMsg( sysMsgQueue, pos );
@@ -274,7 +274,7 @@
  * are not translated.
  * Warning: msg->hwnd is always 0.
  */
-BOOL MSG_GetHardwareMessage( LPMSG msg )
+BOOL MSG_GetHardwareMessage( LPMSG16 msg )
 {
 #if 0
     int pos;
@@ -375,7 +375,7 @@
 /***********************************************************************
  *           MSG_PeekMessage
  */
-static BOOL MSG_PeekMessage( LPMSG msg, HWND hwnd, WORD first, WORD last,
+static BOOL MSG_PeekMessage( LPMSG16 msg, HWND hwnd, WORD first, WORD last,
                              WORD flags, BOOL peek )
 {
     int pos, mask;
@@ -525,37 +525,38 @@
     {
 	if (sendIdle)
 	{
-	    if (!MSG_PeekMessage( (MSG *)PTR_SEG_TO_LIN(msg),
+	    if (!MSG_PeekMessage( (MSG16 *)PTR_SEG_TO_LIN(msg),
                                   0, 0, 0, flags, TRUE ))
 	    {
 		  /* No message present -> send ENTERIDLE and wait */
                 if (IsWindow(hwndOwner))
                     SendMessage16( hwndOwner, WM_ENTERIDLE,
                                    code, (LPARAM)hwnd );
-		MSG_PeekMessage( (MSG *)PTR_SEG_TO_LIN(msg),
+		MSG_PeekMessage( (MSG16 *)PTR_SEG_TO_LIN(msg),
                                  0, 0, 0, flags, FALSE );
 	    }
 	}
 	else  /* Always wait for a message */
-	    MSG_PeekMessage( (MSG *)PTR_SEG_TO_LIN(msg),
+	    MSG_PeekMessage( (MSG16 *)PTR_SEG_TO_LIN(msg),
                              0, 0, 0, flags, FALSE );
 
 	if (!CallMsgFilter( msg, code ))
-            return (((MSG *)PTR_SEG_TO_LIN(msg))->message != WM_QUIT);
+            return (((MSG16 *)PTR_SEG_TO_LIN(msg))->message != WM_QUIT);
 
 	  /* Message filtered -> remove it from the queue */
 	  /* if it's still there. */
 	if (!(flags & PM_REMOVE))
-	    MSG_PeekMessage( (MSG *)PTR_SEG_TO_LIN(msg),
+	    MSG_PeekMessage( (MSG16 *)PTR_SEG_TO_LIN(msg),
                              0, 0, 0, PM_REMOVE, TRUE );
     }
 }
 
 
 /***********************************************************************
- *           PeekMessage   (USER.109)
+ *           PeekMessage16   (USER.109)
  */
-BOOL PeekMessage( LPMSG msg, HWND hwnd, WORD first, WORD last, WORD flags )
+BOOL16 PeekMessage16( LPMSG16 msg, HWND16 hwnd, UINT16 first,
+                      UINT16 last, UINT16 flags )
 {
     return MSG_PeekMessage( msg, hwnd, first, last, flags, TRUE );
 }
@@ -566,7 +567,7 @@
  */
 BOOL GetMessage( SEGPTR msg, HWND hwnd, UINT first, UINT last ) 
 {
-    MSG* lpmsg = (MSG *)PTR_SEG_TO_LIN(msg);
+    MSG16 *lpmsg = (MSG16 *)PTR_SEG_TO_LIN(msg);
     MSG_PeekMessage( lpmsg,
                      hwnd, first, last, PM_REMOVE, FALSE );
 
@@ -582,7 +583,7 @@
  */
 BOOL PostMessage( HWND hwnd, WORD message, WORD wParam, LONG lParam )
 {
-    MSG 	msg;
+    MSG16 	msg;
     WND 	*wndPtr;
 
     msg.hwnd    = hwnd;
@@ -625,7 +626,7 @@
  */
 BOOL PostAppMessage( HTASK hTask, WORD message, WORD wParam, LONG lParam )
 {
-    MSG 	msg;
+    MSG16 msg;
 
     if (GetTaskQueue(hTask) == 0) return FALSE;
     msg.hwnd    = 0;
@@ -791,7 +792,7 @@
  */
 void WaitMessage( void )
 {
-    MSG msg;
+    MSG16 msg;
     MESSAGEQUEUE *queue;
     LONG nextExp = -1;  /* Next timer expiration time */
 
@@ -820,7 +821,7 @@
 
 #define ASCII_CHAR_HACK 0x0800
 
-BOOL TranslateMessage( LPMSG msg )
+BOOL TranslateMessage( LPMSG16 msg )
 {
     UINT message = msg->message;
     /* BYTE wparam[2]; */
@@ -851,7 +852,7 @@
 /***********************************************************************
  *           DispatchMessage   (USER.114)
  */
-LONG DispatchMessage( const MSG* msg )
+LONG DispatchMessage( const MSG16* msg )
 {
     WND * wndPtr;
     LONG retval;
@@ -863,7 +864,7 @@
 	if (msg->lParam)
         {
 /*            HOOK_CallHooks( WH_CALLWNDPROC, HC_ACTION, 0, FIXME ); */
-	    return CallWindowProc16( (WNDPROC)msg->lParam, msg->hwnd,
+	    return CallWindowProc16( (WNDPROC16)msg->lParam, msg->hwnd,
                                    msg->message, msg->wParam, GetTickCount() );
         }
     }
diff --git a/windows/nonclient.c b/windows/nonclient.c
index 37a916f..a51ae71 100644
--- a/windows/nonclient.c
+++ b/windows/nonclient.c
@@ -882,7 +882,7 @@
 {
     LONG hittest = 0;
     POINT16 pt;
-    MSG msg;
+    MSG16 msg;
     WND * wndPtr = WIN_FindWndPtr( hwnd );
 
     if ((wParam & 0xfff0) == SC_MOVE)
@@ -963,7 +963,7 @@
  */
 static void NC_DoSizeMove( HWND hwnd, WORD wParam, POINT16 pt )
 {
-    MSG msg;
+    MSG16 msg;
     LONG hittest;
     RECT16 sizingRect, mouseRect;
     HDC hdc;
@@ -1137,7 +1137,7 @@
  */
 static void NC_TrackMinMaxBox( HWND hwnd, WORD wParam )
 {
-    MSG msg;
+    MSG16 msg;
     HDC hdc = GetWindowDC( hwnd );
     BOOL pressed = TRUE;
 
@@ -1180,7 +1180,7 @@
  */
 static void NC_TrackScrollBar( HWND hwnd, WORD wParam, POINT16 pt )
 {
-    MSG *msg;
+    MSG16 *msg;
     WORD scrollbar;
     WND *wndPtr = WIN_FindWndPtr( hwnd );
 
@@ -1195,7 +1195,7 @@
 	scrollbar = SB_VERT;
     }
 
-    if (!(msg = SEGPTR_NEW(MSG))) return;
+    if (!(msg = SEGPTR_NEW(MSG16))) return;
     pt.x -= wndPtr->rectWindow.left;
     pt.y -= wndPtr->rectWindow.top;
     SetCapture( hwnd );
diff --git a/windows/property.c b/windows/property.c
index 6927be0..9d3a0dc 100644
--- a/windows/property.c
+++ b/windows/property.c
@@ -71,7 +71,7 @@
         PROPERTY *prop = (PROPERTY *)USER_HEAP_LIN_ADDR(hProp);
         if (HIWORD(str))
         {
-            if (!prop->atom && !lstrcmpi( prop->string, PTR_SEG_TO_LIN(str)))
+            if (!prop->atom && !lstrcmpi32A(prop->string, PTR_SEG_TO_LIN(str)))
                 return prop->hData;
         }
         else if (prop->atom && (prop->atom == LOWORD(str))) return prop->hData;
@@ -96,7 +96,7 @@
     {
         PROPERTY *prop = (PROPERTY *)USER_HEAP_LIN_ADDR( *hProp );
         if ((HIWORD(str) && !prop->atom &&
-             !lstrcmpi( prop->string, PTR_SEG_TO_LIN(str))) ||
+             !lstrcmpi32A( prop->string, PTR_SEG_TO_LIN(str))) ||
             (!HIWORD(str) && prop->atom && (prop->atom == LOWORD(str))))
         {
             HANDLE hNext = prop->next;
diff --git a/windows/queue.c b/windows/queue.c
index e465ebb..eb457ed 100644
--- a/windows/queue.c
+++ b/windows/queue.c
@@ -272,7 +272,7 @@
  *
  * Add a message to the queue. Return FALSE if queue is full.
  */
-BOOL QUEUE_AddMsg( HQUEUE hQueue, MSG * msg, DWORD extraInfo )
+BOOL QUEUE_AddMsg( HQUEUE hQueue, MSG16 * msg, DWORD extraInfo )
 {
     int pos;
     MESSAGEQUEUE *msgQueue;
@@ -315,7 +315,7 @@
         
     for (i = 0; i < msgQueue->msgCount; i++)
     {
-	MSG * msg = &msgQueue->messages[pos].msg;
+	MSG16 * msg = &msgQueue->messages[pos].msg;
 
 	if (!hwnd || (msg->hwnd == hwnd))
 	{
@@ -405,7 +405,7 @@
 void hardware_event( WORD message, WORD wParam, LONG lParam,
 		     int xPos, int yPos, DWORD time, DWORD extraInfo )
 {
-    MSG *msg;
+    MSG16 *msg;
     int pos;
 
     if (!sysMsgQueue) return;
diff --git a/windows/syscolor.c b/windows/syscolor.c
index 50e03b8..3c3ddee 100644
--- a/windows/syscolor.c
+++ b/windows/syscolor.c
@@ -14,9 +14,9 @@
 /* #define DEBUG_SYSCOLOR */
 #include "debug.h"
 
-struct SysColorObjects sysColorObjects = { 0, };
+struct SysColorObjects sysColorObjects;
 
-static char * DefSysColors[] =
+static const char * const DefSysColors[] =
 {
     "Scrollbar", "224 224 224",      /* COLOR_SCROLLBAR           */
     "Background", "192 192 192",     /* COLOR_BACKGROUND          */
@@ -132,7 +132,7 @@
 void SYSCOLOR_Init(void)
 {
     int i, r, g, b;
-    char **p;
+    const char * const *p;
     char buffer[100];
 
     for (i = 0, p = DefSysColors; i < NUM_SYS_COLORS; i++, p += 2)
diff --git a/windows/timer.c b/windows/timer.c
index 189fc36..53156d2 100644
--- a/windows/timer.c
+++ b/windows/timer.c
@@ -169,7 +169,7 @@
  * If 'hwnd' is not NULL, only consider timers for this window.
  * If 'remove' is TRUE, remove all expired timers up to the returned one.
  */
-BOOL TIMER_CheckTimer( LONG *next, MSG *msg, HWND hwnd, BOOL remove )
+BOOL TIMER_CheckTimer( LONG *next, MSG16 *msg, HWND hwnd, BOOL remove )
 {
     TIMER * pTimer = pNextTimer;
     DWORD curTime = GetTickCount();
diff --git a/windows/win.c b/windows/win.c
index a59225c..8c23889 100644
--- a/windows/win.c
+++ b/windows/win.c
@@ -1005,7 +1005,7 @@
 /***********************************************************************
  *           FindWindow16   (USER.50)
  */
-HWND FindWindow16( SEGPTR className, LPCSTR title )
+HWND16 FindWindow16( SEGPTR className, LPCSTR title )
 {
     return FindWindowEx16( 0, 0, className, title );
 }
@@ -1014,7 +1014,8 @@
 /***********************************************************************
  *           FindWindowEx16   (USER.427)
  */
-HWND FindWindowEx16( HWND parent, HWND child, SEGPTR className, LPCSTR title )
+HWND16 FindWindowEx16( HWND16 parent, HWND16 child,
+                       SEGPTR className, LPCSTR title )
 {
     ATOM atom;
 
@@ -1026,7 +1027,7 @@
 /***********************************************************************
  *           FindWindow32A   (USER32.197)
  */
-HWND FindWindow32A( LPCSTR className, LPCSTR title )
+HWND32 FindWindow32A( LPCSTR className, LPCSTR title )
 {
     return FindWindowEx32A( 0, 0, className, title );
 }
@@ -1035,7 +1036,8 @@
 /***********************************************************************
  *           FindWindowEx32A   (USER32.198)
  */
-HWND FindWindowEx32A( HWND parent, HWND child, LPCSTR className, LPCSTR title )
+HWND32 FindWindowEx32A( HWND32 parent, HWND32 child,
+                        LPCSTR className, LPCSTR title )
 {
     ATOM atom;
 
@@ -1047,7 +1049,8 @@
 /***********************************************************************
  *           FindWindowEx32W   (USER32.199)
  */
-HWND FindWindowEx32W(HWND parent, HWND child, LPCWSTR className, LPCWSTR title)
+HWND32 FindWindowEx32W( HWND32 parent, HWND32 child,
+                        LPCWSTR className, LPCWSTR title )
 {
     ATOM atom;
     char *buffer;
@@ -1064,7 +1067,7 @@
 /***********************************************************************
  *           FindWindow32W   (USER32.200)
  */
-HWND FindWindow32W( LPCWSTR className, LPCWSTR title )
+HWND32 FindWindow32W( LPCWSTR className, LPCWSTR title )
 {
     return FindWindowEx32W( 0, 0, className, title );
 }
@@ -1838,7 +1841,7 @@
  */
 BOOL16 DragDetect(HWND16 hWnd, POINT16 pt)
 {
-  MSG   msg;
+  MSG16 msg;
   RECT16  rect;
 
   rect.left = pt.x - wDragWidth;
@@ -1851,7 +1854,7 @@
 
   while(1)
    {
-        while(PeekMessage(&msg ,0 ,WM_MOUSEFIRST ,WM_MOUSELAST ,PM_REMOVE))
+        while(PeekMessage16(&msg ,0 ,WM_MOUSEFIRST ,WM_MOUSELAST ,PM_REMOVE))
          {
            if( msg.message == WM_LBUTTONUP )
                 {
@@ -1880,7 +1883,7 @@
 DWORD DragObject(HWND hwndScope, HWND hWnd, WORD wObj, HANDLE hOfStruct,
                 WORD szList , HCURSOR hCursor)
 {
- MSG	 	msg;
+ MSG16	 	msg;
  LPDRAGINFO	lpDragInfo;
  SEGPTR		spDragInfo;
  HCURSOR 	hDragCursor=0, hOldCursor=0, hBummer=0;
@@ -1933,7 +1936,7 @@
   {
     WaitMessage();
 
-    if( !PeekMessage(&msg,0,WM_MOUSEFIRST,WM_MOUSELAST,PM_REMOVE) )
+    if( !PeekMessage16(&msg,0,WM_MOUSEFIRST,WM_MOUSELAST,PM_REMOVE) )
 	 continue;
 
    *(lpDragInfo+1) = *lpDragInfo;
diff --git a/windows/winpos.c b/windows/winpos.c
index 5088673..b1f1de3 100644
--- a/windows/winpos.c
+++ b/windows/winpos.c
@@ -848,7 +848,7 @@
 {
     WND                   *wndPtr          = WIN_FindWndPtr(hWnd);
     WND                   *wndTemp         = WIN_FindWndPtr(hwndActive);
-    CBTACTIVATESTRUCT     *cbtStruct;
+    CBTACTIVATESTRUCT16   *cbtStruct;
     FARPROC                enumCallback    = MODULE_GetWndProcEntry16("ActivateAppProc");
     ACTIVATESTRUCT         actStruct;
     WORD                   wIconized=0;
@@ -872,7 +872,7 @@
 	dprintf_win(stddeb,"WINPOS_ActivateWindow: no current active window.\n");
 
     /* call CBT hook chain */
-    if ((cbtStruct = SEGPTR_NEW(CBTACTIVATESTRUCT)))
+    if ((cbtStruct = SEGPTR_NEW(CBTACTIVATESTRUCT16)))
     {
         LRESULT wRet;
         cbtStruct->fMouse     = fMouse;
diff --git a/windows/winproc.c b/windows/winproc.c
index 05d2a24..f206657 100644
--- a/windows/winproc.c
+++ b/windows/winproc.c
@@ -722,7 +722,7 @@
 	
     case WM_SETTEXT:
         {
-            LPSTR str = SEGPTR_ALLOC( STRING32_lstrlenW( (LPWSTR)lParam ) );
+            LPSTR str = SEGPTR_ALLOC( lstrlen32W( (LPWSTR)lParam ) );
             if (!str) return 0;
             STRING32_UniToAnsi( str, (LPWSTR)lParam );
             result = CallWndProc16( func, ds, hwnd, msg, (WPARAM16)wParam,
