From 2197901989940bfdc052db0e531ba3b06a3c3d24 Mon Sep 17 00:00:00 2001
From: Alexandre Julliard <julliard@winehq.org>
Date: Wed, 5 Mar 1997 08:22:35 +0000
Subject: [PATCH] Release 970305

Sun Mar  2 14:57:37 1997  Alexandre Julliard  <julliard@lrc.epfl.ch>

	* [*/*]
	Completed transition to new Win32 types.

	* [tools/build.c]
	Changed CallTo16_regs to take a CONTEXT argument.

	* [memory/virtual.c]
	Rewrote Virtual* functions. Implemented CreateFileMapping and
	OpenFileMapping. Broke MapViewOfFile ;-)

	* [win32/k32obj.c]
	Implemented named objects.

Sun Mar  2 00:33:21 1997  Mikolaj Zalewski <zmikolaj@free.polbox.pl>

	* [misc/ole2nls.c] [resources/sysres_Pl.c]
	Added Polish language support.

Sat Mar  1 13:31:25 1997  David Faure <david.faure@ifhamy.insa-lyon.fr>

	* [windows/keyboard.c]
	Wrote VkKeyScan and tested with Winword. Works ok except for dead
	chars.

Fri Feb 28 09:34:03 1997  John Harvey <john@division.co.uk>

	* [graphics/win16drv/font.c] [graphics/win16drv/init.c]
	  [graphics/win16drv/obects.c]
	Added start of SelectObject call for printer driver. Write should
	now run with the printer driver enabled.

Wed Feb 26 20:03:32 1997  Marcus Meissner <msmeissn@cip.informatik.uni-erlangen.de>

	* [debugger/*.c]
	Re-added a disassembly command (list serves another functionality
	now).

	* [loader/pe_resource.c]
	Added # support.

	* [misc/ole2nls.c]
	GetStringType* added.

	* [objects/color.c]
	VGA16 fixes.

	* [windows/class.c]
	Look for global widget classes too in GetClassInfo32.

	* [windows/sysmetrics.c] [include/windows.h]
	Added Win32 sysmetrics.

Sat Feb 22 23:56:29 1997  Jukka Iivonen <iivonen@cc.helsinki.fi>

	* [documentation/languages]
	The fourth case updated.

	* [if1632/ntdll.spec]
	Added some is* and to* functions.

Sat Feb 22 23:05:47 1997  Morten Welinder  <terra@diku.dk>

	* [configure.in]
	Add tests for wait4 and waitpid.

	* [loader/signal.c]
	Clean up OS-dependent code.  I hope I got it right, :-)

	* [tools/wineconf]
	Recognise vfat file systems.  Ignore floppy drives specified in
	/etc/fstab.

	* [files/*]
	Fix function names in error messages.

Sat Feb 22 06:15:13 1997  Pablo Saratxaga <srtxg@chanae.stben.be>

	* [windows/keyboard.c] [windows/message.c]
	Support for more latin alphabet dead keys for iso-8859-{1,2,3,4,9}
	characters sets.

Fri Feb 21 20:37:50 1997  Huw D M Davies <h.davies1@physics.oxford.ac.uk>

	* [controls/edit.c]
	Fix incorrect arg order in LOCAL_Alloc() call.

Fri Feb 21 18:19:17 1997  Andrew Taylor  <andrew@riscan.com>

	* [multimedia/mmsystem.c] [multimedia/mcistring.c]
	Fixed bug related to device IDs returned by multimedia
	system.  Implemented mciGetDeviceID.

Sat Feb 15 00:58:19 1997  Jimen Ching  <jching@aloha.com>

	* [debugger/dbg.y]
	Do not dereference invalid expressions.
---
 ANNOUNCE                         |  16 +-
 ChangeLog                        | 100 ++++
 configure                        |   2 +-
 configure.in                     |   2 +-
 controls/button.c                |  18 +-
 controls/combo.c                 |  16 +-
 controls/desktop.c               |   7 +-
 controls/edit.c                  |  42 +-
 controls/listbox.c               |  15 +-
 controls/menu.c                  |  25 +-
 controls/oldlbox.c               |  46 +-
 controls/scroll.c                |   1 -
 controls/static.c                |   9 +-
 controls/status.c                |   1 -
 controls/widgets.c               |   2 +-
 debugger/Makefile.in             |   2 +-
 debugger/dbg.y                   |  10 +-
 debugger/debug.l                 |   3 +-
 debugger/display.c               |   1 -
 debugger/expr.c                  |   1 -
 debugger/info.c                  |  11 +-
 debugger/source.c                |  88 +++
 documentation/debugging          |  86 ++-
 documentation/languages          |   9 +-
 files/Makefile.in                |   2 +-
 files/drive.c                    |   2 +-
 files/file.c                     | 117 ++--
 graphics/Makefile.in             |   2 +-
 graphics/metafiledrv/Makefile.in |   2 +-
 graphics/win16drv/Makefile.in    |   3 +-
 graphics/win16drv/font.c         |   8 +
 graphics/win16drv/init.c         |  11 +-
 graphics/win16drv/objects.c      |  53 ++
 graphics/x11drv/Makefile.in      |   2 +-
 graphics/x11drv/bitmap.c         |   3 +-
 if1632/Makefile.in               |   2 +-
 if1632/builtin.c                 |   8 +-
 if1632/gdi.spec                  |  32 +-
 if1632/gdi32.spec                |  40 +-
 if1632/kernel.spec               |   8 +-
 if1632/kernel32.spec             |  63 +-
 if1632/mmsystem.spec             |   4 +-
 if1632/ntdll.spec                |  18 +-
 if1632/ole2nls.spec              |   2 +-
 if1632/relay.c                   |  28 +-
 if1632/shell.spec                |   6 +-
 if1632/shell32.spec              |   2 +-
 if1632/thunk.c                   |  10 +-
 if1632/user.spec                 |  43 +-
 if1632/user32.spec               |  44 +-
 include/advapi32.h               |   7 -
 include/callback.h               |   6 +-
 include/clipboard.h              |   2 +-
 include/combo.h                  |   4 +-
 include/commdlg.h                |  58 +-
 include/config.h.in              |   6 +
 include/dde_proc.h               |   6 +-
 include/debug.h                  |  41 +-
 include/debugger.h               |   1 +
 include/driver.h                 |   2 +-
 include/file.h                   |  14 +
 include/font.h                   |  20 -
 include/handle32.h               |   3 +
 include/libres.h                 |   4 -
 include/listbox.h                |  28 +-
 include/mdi.h                    |   2 +-
 include/mmsystem.h               | 466 +++++++--------
 include/module.h                 |   2 +-
 include/ole.h                    |  26 +-
 include/options.h                |   3 +-
 include/peexe.h                  |   1 +
 include/selectors.h              |  52 +-
 include/static.h                 |   3 +-
 include/stddebug.h               |   2 +
 include/stress.h                 |  10 +-
 include/toolhelp.h               |   5 +
 include/w32sys.h                 |   8 +-
 include/win16drv.h               |   3 +
 include/winbase.h                |   4 +
 include/windows.h                | 403 ++++++++++---
 include/winerror.h               |   2 +
 include/winsock.h                |   2 +-
 include/wintypes.h               |   7 +
 ipc/dde_proc.c                   |  20 +-
 ipc/generic_hash.c               |  20 +-
 ipc/generic_hash.h               |   8 +-
 library/libres.c                 |  10 +-
 library/miscstubs.c              |  24 +-
 loader/main.c                    |   4 +
 loader/module.c                  |  24 +-
 loader/ne_image.c                |  53 +-
 loader/pe_image.c                |  34 +-
 loader/pe_resource.c             |   8 +-
 loader/resource.c                |  10 +-
 loader/signal.c                  | 101 ++--
 loader/task.c                    |  54 +-
 memory/Makefile.in               |   5 +-
 memory/global.c                  |   2 +-
 memory/heap.c                    |  10 +-
 memory/selector.c                |   1 +
 memory/virtual.c                 | 976 +++++++++++++++++++++++++++++++
 misc/clipboard.c                 |  94 ++-
 misc/commdlg.c                   |  74 +--
 misc/driver.c                    |   6 +-
 misc/escape.c                    |   1 -
 misc/exec.c                      |   5 +-
 misc/lstr.c                      |  34 +-
 misc/lzexpand.c                  |   1 -
 misc/main.c                      |  37 +-
 misc/network.c                   |  28 +-
 misc/ntdll.c                     |   9 +
 misc/ole2nls.c                   | 223 ++++++-
 misc/olecli.c                    |   2 +-
 misc/olesvr.c                    |   2 +-
 misc/shell.c                     |  71 ++-
 misc/spy.c                       |   1 -
 misc/stress.c                    |  10 +-
 misc/system.c                    |   2 +-
 misc/winsock.c                   | 112 ++--
 misc/wsprintf.c                  |   1 -
 miscemu/Makefile.in              |   2 +-
 msdos/Makefile.in                |   2 +-
 msdos/dosmem.c                   |  22 +-
 msdos/dpmi.c                     |   4 +-
 msdos/int21.c                    |   4 +-
 msdos/int2f.c                    |   2 +-
 multimedia/audio.c               | 385 ++++++------
 multimedia/joystick.c            |   2 +-
 multimedia/mcianim.c             | 166 +++---
 multimedia/mcicda.c              | 383 ++++++------
 multimedia/mcistring.c           |  52 +-
 multimedia/midi.c                | 367 ++++++------
 multimedia/mmaux.c               |  31 +-
 multimedia/mmsystem.c            | 572 ++++++++++--------
 multimedia/time.c                |   6 +-
 objects/bitmap.c                 |  97 ++-
 objects/brush.c                  |   1 -
 objects/clipping.c               |   1 -
 objects/color.c                  |  10 +-
 objects/cursoricon.c             |  20 +-
 objects/dc.c                     |  34 +-
 objects/dcvalues.c               |   1 -
 objects/dib.c                    |   5 +-
 objects/font.c                   | 163 +++++-
 objects/gdiobj.c                 |   1 -
 objects/linedda.c                |   1 -
 objects/metafile.c               |  49 +-
 objects/oembitmap.c              |   5 +-
 objects/palette.c                |  15 +-
 objects/pen.c                    |   1 -
 objects/region.c                 |  16 +-
 objects/text.c                   |  15 +-
 rc/Makefile.in                   |   2 +-
 rc/parser.l                      |   2 +-
 rc/parser.y                      |   4 +-
 resources/Makefile.in            |   5 +-
 resources/sysres.c               |   4 +-
 resources/sysres_Pl.rc           | 241 ++++++++
 scheduler/process.c              |  13 +-
 scheduler/thread.c               |   6 +-
 tools/Makefile.in                |   2 +-
 tools/build.c                    |  66 ++-
 tools/make_os2.sh                |   3 +-
 tools/wineconf                   |  16 +-
 win32/Makefile.in                |   1 -
 win32/advapi.c                   |   2 +-
 win32/code_page.c                |   6 +-
 win32/console.c                  |   2 +-
 win32/cursoricon32.c             |  19 +-
 win32/error.c                    |  10 +-
 win32/file.c                     | 102 +---
 win32/init.c                     |   6 +-
 win32/k32obj.c                   | 124 +++-
 win32/memory.c                   | 358 ------------
 win32/process.c                  |  22 +-
 win32/thread.c                   | 277 +++++++--
 win32/user32.c                   |  36 +-
 windows/caret.c                  |  61 +-
 windows/class.c                  |  44 +-
 windows/dce.c                    |  14 +-
 windows/defdlg.c                 |   8 +-
 windows/defwnd.c                 |  20 +-
 windows/dialog.c                 |   4 +-
 windows/event.c                  |   7 +-
 windows/focus.c                  |   3 +-
 windows/graphics.c               |   1 -
 windows/hook.c                   |   3 +-
 windows/keyboard.c               |  98 +++-
 windows/mdi.c                    |  53 +-
 windows/message.c                | 140 ++++-
 windows/msgbox.c                 |   1 -
 windows/nonclient.c              |  26 +-
 windows/painting.c               |  63 +-
 windows/property.c               |   1 -
 windows/queue.c                  |  10 +-
 windows/scroll.c                 |  15 +-
 windows/sysmetrics.c             |  46 +-
 windows/timer.c                  |   1 -
 windows/win.c                    |  75 ++-
 windows/winpos.c                 |  24 +-
 windows/winproc.c                |   1 +
 wine.man                         |   2 +-
 202 files changed, 5708 insertions(+), 3085 deletions(-)
 create mode 100644 graphics/win16drv/objects.c
 delete mode 100644 include/advapi32.h
 create mode 100644 memory/virtual.c
 create mode 100644 resources/sysres_Pl.rc
 delete mode 100644 win32/memory.c

diff --git a/ANNOUNCE b/ANNOUNCE
index 10dc576107c..1c03369ef75 100644
--- a/ANNOUNCE
+++ b/ANNOUNCE
@@ -1,13 +1,13 @@
-This is release 970215 of Wine, the MS Windows emulator.  This is still a
+This is release 970305 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-970215: (see ChangeLog for details)
-	- Many more Win32 functions.
-	- Hungarian language support.
+WHAT'S NEW with Wine-970305: (see ChangeLog for details)
+	- Completed transition to new Win32 types.
+	- Polish language support.
 	- Lots of bug fixes.
 
 See the README file in the distribution for installation instructions.
@@ -16,10 +16,10 @@ Because of lags created by using mirror, this message may reach you before
 the release is available at the ftp sites.  The sources will be available
 from the following locations:
 
-  ftp://sunsite.unc.edu/pub/Linux/ALPHA/wine/development/Wine-970215.tar.gz
-  ftp://tsx-11.mit.edu/pub/linux/ALPHA/Wine/development/Wine-970215.tar.gz
-  ftp://ftp.infomagic.com/pub/mirrors/linux/wine/development/Wine-970215.tar.gz
-  ftp://aris.com/pub/linux/ALPHA/Wine/development/Wine-970215.tar.gz
+  ftp://sunsite.unc.edu/pub/Linux/ALPHA/wine/development/Wine-970305.tar.gz
+  ftp://tsx-11.mit.edu/pub/linux/ALPHA/Wine/development/Wine-970305.tar.gz
+  ftp://ftp.infomagic.com/pub/mirrors/linux/wine/development/Wine-970305.tar.gz
+  ftp://aris.com/pub/linux/ALPHA/Wine/development/Wine-970305.tar.gz
 
 It should also be available from any site that mirrors tsx-11 or sunsite.
 
diff --git a/ChangeLog b/ChangeLog
index 2b492bfd557..3a722b6c536 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,103 @@
+----------------------------------------------------------------------
+Sun Mar  2 14:57:37 1997  Alexandre Julliard  <julliard@lrc.epfl.ch>
+
+	* [*/*]
+	Completed transition to new Win32 types.
+
+	* [tools/build.c]
+	Changed CallTo16_regs to take a CONTEXT argument.
+
+	* [memory/virtual.c]
+	Rewrote Virtual* functions. Implemented CreateFileMapping and
+	OpenFileMapping. Broke MapViewOfFile ;-)
+
+	* [win32/k32obj.c]
+	Implemented named objects.
+
+Sun Mar  2 00:33:21 1997  Mikolaj Zalewski <zmikolaj@free.polbox.pl>
+
+	* [misc/ole2nls.c] [resources/sysres_Pl.c]
+	Added Polish language support.
+
+Sat Mar  1 13:31:25 1997  David Faure <david.faure@ifhamy.insa-lyon.fr>
+
+	* [windows/keyboard.c]
+	Wrote VkKeyScan and tested with Winword. Works ok except for dead
+	chars.
+
+Fri Feb 28 09:34:03 1997  John Harvey <john@division.co.uk>
+
+	* [graphics/win16drv/font.c] [graphics/win16drv/init.c]
+	  [graphics/win16drv/obects.c]
+	Added start of SelectObject call for printer driver. Write should
+	now run with the printer driver enabled.
+
+Wed Feb 26 20:03:32 1997  Marcus Meissner <msmeissn@cip.informatik.uni-erlangen.de>
+
+	* [debugger/*.c]
+	Re-added a disassembly command (list serves another functionality
+	now).
+
+	* [loader/pe_resource.c]
+	Added # support.
+
+	* [misc/ole2nls.c]
+	GetStringType* added.
+
+	* [objects/color.c]
+	VGA16 fixes.
+
+	* [windows/class.c]
+	Look for global widget classes too in GetClassInfo32.
+
+	* [windows/sysmetrics.c] [include/windows.h]
+	Added Win32 sysmetrics.
+
+Sat Feb 22 23:56:29 1997  Jukka Iivonen <iivonen@cc.helsinki.fi>
+
+	* [documentation/languages]
+	The fourth case updated.
+
+	* [if1632/ntdll.spec]
+	Added some is* and to* functions.
+
+Sat Feb 22 23:05:47 1997  Morten Welinder  <terra@diku.dk>
+
+	* [configure.in]
+	Add tests for wait4 and waitpid.
+
+	* [loader/signal.c]
+	Clean up OS-dependent code.  I hope I got it right, :-)
+
+	* [tools/wineconf]
+	Recognise vfat file systems.  Ignore floppy drives specified in
+	/etc/fstab.
+
+	* [files/*]
+	Fix function names in error messages.
+
+Sat Feb 22 06:15:13 1997  Pablo Saratxaga <srtxg@chanae.stben.be>
+
+	* [windows/keyboard.c] [windows/message.c]
+	Support for more latin alphabet dead keys for iso-8859-{1,2,3,4,9}
+	characters sets.
+
+Fri Feb 21 20:37:50 1997  Huw D M Davies <h.davies1@physics.oxford.ac.uk>
+
+	* [controls/edit.c]
+	Fix incorrect arg order in LOCAL_Alloc() call.
+
+Fri Feb 21 18:19:17 1997  Andrew Taylor  <andrew@riscan.com>
+
+	* [multimedia/mmsystem.c] [multimedia/mcistring.c]
+	Fixed bug related to device IDs returned by multimedia
+	system.  Implemented mciGetDeviceID.
+
+Sat Feb 15 00:58:19 1997  Jimen Ching  <jching@aloha.com>
+
+	* [debugger/dbg.y]
+	Do not dereference invalid expressions.
+
 ----------------------------------------------------------------------
 Sat Feb 15 11:59:17 1997  Alexandre Julliard  <julliard@lrc.epfl.ch>
 
diff --git a/configure b/configure
index 13740b5b8cf..9ff371b38ba 100755
--- a/configure
+++ b/configure
@@ -2043,7 +2043,7 @@ echo "$ac_t""$ac_cv_c_dll" 1>&6
 fi
 
 
-for ac_func in memmove tcgetattr usleep
+for ac_func in memmove tcgetattr usleep wait4 waitpid
 do
 echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
 echo "configure:2050: checking for $ac_func" >&5
diff --git a/configure.in b/configure.in
index 18f803c18a6..185a4641d46 100644
--- a/configure.in
+++ b/configure.in
@@ -104,7 +104,7 @@ fi
 
 dnl **** Check for functions and header files ****
 
-AC_CHECK_FUNCS(memmove tcgetattr usleep)
+AC_CHECK_FUNCS(memmove tcgetattr usleep wait4 waitpid)
 AC_HEADER_STAT()
 AC_C_CONST()
 AC_TYPE_SIZE_T()
diff --git a/controls/button.c b/controls/button.c
index 92759b7225e..205888760d9 100644
--- a/controls/button.c
+++ b/controls/button.c
@@ -303,9 +303,9 @@ static void PB_Paint( WND *wndPtr, HDC32 hDC, WORD action )
             PB_PaintGrayOnGray(hDC,infoPtr->hFont,&rc,wndPtr->text);
         else
         {
-            SetTextColor( hDC, (wndPtr->dwStyle & WS_DISABLED) ?
-                                GetSysColor32(COLOR_GRAYTEXT) :
-                                GetSysColor32(COLOR_BTNTEXT) );
+            SetTextColor32( hDC, (wndPtr->dwStyle & WS_DISABLED) ?
+                                 GetSysColor32(COLOR_GRAYTEXT) :
+                                 GetSysColor32(COLOR_BTNTEXT) );
             DrawText32A( hDC, wndPtr->text, -1, &rc,
                          DT_SINGLELINE | DT_CENTER | DT_VCENTER );
             /* do we have the focus? */
@@ -338,10 +338,10 @@ static void PB_Paint( WND *wndPtr, HDC32 hDC, WORD action )
 
 void PB_PaintGrayOnGray(HDC32 hDC,HFONT32 hFont,RECT32 *rc,char *text)
 {
-    static int Pattern[] = {0xAA,0x55,0xAA,0x55,0xAA,0x55,0xAA,0x55};
-    HBITMAP16 hbm  = CreateBitmap(8, 8, 1, 1, Pattern);
+    static const int Pattern[] = {0xAA,0x55,0xAA,0x55,0xAA,0x55,0xAA,0x55};
+    HBITMAP32 hbm  = CreateBitmap32( 8, 8, 1, 1, Pattern );
     HDC32 hdcMem = CreateCompatibleDC32(hDC);
-    HBITMAP16 hbmMem;
+    HBITMAP32 hbmMem;
     HBRUSH16 hBr;
     RECT32 rect,rc2;
 
@@ -350,7 +350,7 @@ void PB_PaintGrayOnGray(HDC32 hDC,HFONT32 hFont,RECT32 *rc,char *text)
     rc2=rect;
     rect.left=(rc->right-rect.right)/2;       /* for centering text bitmap */
     rect.top=(rc->bottom-rect.bottom)/2;
-    hbmMem = CreateCompatibleBitmap( hDC,rect.right,rect.bottom);
+    hbmMem = CreateCompatibleBitmap32( hDC,rect.right,rect.bottom );
     SelectObject32( hdcMem, hbmMem);
     hBr = SelectObject32( hdcMem, CreatePatternBrush32(hbm) );
     DeleteObject32( hbm );
@@ -417,7 +417,7 @@ static void CB_Paint( WND *wndPtr, HDC32 hDC, WORD action )
         if( textlen && action != ODA_SELECT )
         {
             if (wndPtr->dwStyle & WS_DISABLED)
-                SetTextColor( hDC, GetSysColor32(COLOR_GRAYTEXT) );
+                SetTextColor32( hDC, GetSysColor32(COLOR_GRAYTEXT) );
             DrawText16( hDC, wndPtr->text, textlen, &rtext,
                         DT_SINGLELINE | DT_VCENTER );
         }
@@ -486,7 +486,7 @@ static void GB_Paint( WND *wndPtr, HDC32 hDC, WORD action )
 
     if (!wndPtr->text) return;
     if (wndPtr->dwStyle & WS_DISABLED)
-        SetTextColor( hDC, GetSysColor32(COLOR_GRAYTEXT) );
+        SetTextColor32( hDC, GetSysColor32(COLOR_GRAYTEXT) );
     rc.left += 10;
     DrawText16( hDC, wndPtr->text, -1, &rc, DT_SINGLELINE | DT_NOCLIP );
 }
diff --git a/controls/combo.c b/controls/combo.c
index 72aca44321f..f8fccf8ce49 100644
--- a/controls/combo.c
+++ b/controls/combo.c
@@ -38,8 +38,8 @@
 #define CBLMM_EDGE   4    /* distance inside box which is same as moving mouse
 			     outside box, to trigger scrolling of CBL */
 
-static BOOL CBCheckSize(HWND16 hwnd);
-static BOOL CBLCheckSize(HWND16 hwnd);
+static BOOL32 CBCheckSize(HWND16 hwnd);
+static BOOL32 CBLCheckSize(HWND16 hwnd);
 
 static HBITMAP16 hComboBit = 0;
 static WORD CBitHeight, CBitWidth;
@@ -81,7 +81,7 @@ int CreateComboStruct(HWND16 hwnd, LONG style)
   return TRUE;
 }
 
-void ComboUpdateWindow(HWND16 hwnd, LPHEADLIST lphl, LPHEADCOMBO lphc, BOOL repaint)
+void ComboUpdateWindow(HWND16 hwnd, LPHEADLIST lphl, LPHEADCOMBO lphc, BOOL32 repaint)
 {
   WND *wndPtr = WIN_FindWndPtr(hwnd);
 
@@ -628,7 +628,7 @@ static LRESULT CBShowDropDown(HWND16 hwnd, WPARAM16 wParam, LPARAM lParam)
 /***********************************************************************
  *             CBCheckSize
  */
-static BOOL CBCheckSize(HWND16 hwnd)
+static BOOL32 CBCheckSize(HWND16 hwnd)
 {
   LPHEADCOMBO  lphc = ComboGetStorageHeader(hwnd);
   LPHEADLIST   lphl = ComboGetListHeader(hwnd);
@@ -711,7 +711,7 @@ static LRESULT CBCommand(HWND16 hwnd, WPARAM16 wParam, LPARAM lParam)
                  }
                 break;
     case ID_EDIT:                                      /* update LISTBOX window */
-                 id=GetWindowWord(hwnd,GWW_ID);
+                 id = GetWindowWord32(hwnd,GWW_ID);
                  switch (HIWORD(lParam))
                  {
                   case EN_UPDATE:GetWindowText32A(lphc->hWndEdit,buffer,255);
@@ -786,7 +786,7 @@ static LRESULT CBGetText(HWND16 hwnd, WPARAM16 wParam, LPARAM lParam)
 /***********************************************************************
  *           ComboWndProc
  */
-LRESULT ComboBoxWndProc(HWND16 hwnd, UINT message, WPARAM16 wParam, LPARAM lParam)
+LRESULT ComboBoxWndProc(HWND16 hwnd, UINT16 message, WPARAM16 wParam, LPARAM lParam)
 {
     switch(message) {	
      case WM_NCCREATE: return CBNCCreate(hwnd, wParam, lParam);
@@ -1165,7 +1165,7 @@ static LRESULT CBLVScroll( HWND16 hwnd, WPARAM16 wParam, LPARAM lParam )
 /***********************************************************************
  *             CBLCheckSize
  */
-static BOOL CBLCheckSize(HWND16 hwnd)
+static BOOL32 CBLCheckSize(HWND16 hwnd)
 {
   LPHEADCOMBO  lphc = ComboGetStorageHeader(hwnd);
   LPHEADLIST   lphl = ComboGetListHeader(hwnd);
@@ -1218,7 +1218,7 @@ static BOOL CBLCheckSize(HWND16 hwnd)
 /***********************************************************************
  *           ComboLBoxWndProc
  */
-LRESULT ComboLBoxWndProc(HWND16 hwnd, UINT message, WPARAM16 wParam, LPARAM lParam)
+LRESULT ComboLBoxWndProc(HWND16 hwnd, UINT16 message, WPARAM16 wParam, LPARAM lParam)
 {
     switch(message) {	
      case WM_CREATE: return CBLCreate(hwnd, wParam, lParam);
diff --git a/controls/desktop.c b/controls/desktop.c
index db876a87f22..2466ea7b673 100644
--- a/controls/desktop.c
+++ b/controls/desktop.c
@@ -4,7 +4,6 @@
  * Copyright 1994 Alexandre Julliard
  */
 
-#define NO_TRANSITION_TYPES  /* This file is Win32-clean */
 #include <stdio.h>
 #include <string.h>
 #include <unistd.h>
@@ -91,8 +90,8 @@ static LRESULT DESKTOP_DoEraseBkgnd( HWND32 hwnd, HDC32 hdc,
 	 (infoPtr->bitmapSize.cy < rect.bottom))))
     {
 	  /* Set colors in case pattern is a monochrome bitmap */
-	SetBkColor( hdc, RGB(0,0,0) );
-	SetTextColor( hdc, GetSysColor32(COLOR_BACKGROUND) );
+	SetBkColor32( hdc, RGB(0,0,0) );
+	SetTextColor32( hdc, GetSysColor32(COLOR_BACKGROUND) );
 	FillRect32( hdc, &rect, infoPtr->hbrushPattern );
     }
 
@@ -243,7 +242,7 @@ BOOL32 DESKTOP_SetPattern( LPCSTR pattern )
 	int i;
 
 	for (i = 0; i < 8; i++) pattern[i] = pat[i] & 0xffff;
-	hbitmap = CreateBitmap( 8, 8, 1, 1, (LPSTR)pattern );
+	hbitmap = CreateBitmap32( 8, 8, 1, 1, (LPSTR)pattern );
 	infoPtr->hbrushPattern = CreatePatternBrush32( hbitmap );
 	DeleteObject32( hbitmap );
     }
diff --git a/controls/edit.c b/controls/edit.c
index 8e7b59f056f..3187698a9f8 100644
--- a/controls/edit.c
+++ b/controls/edit.c
@@ -13,8 +13,6 @@
  *
  */
 
-
-#define NO_TRANSITION_TYPES	/* This file is Win32-clean */
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
@@ -1778,9 +1776,10 @@ static INT32 EDIT_PaintText(WND *wndPtr, HDC32 hdc, INT32 x, INT32 y, INT32 line
 		return 0;
 	BkColor = GetBkColor32(hdc);
 	TextColor = GetTextColor32(hdc);
-	if (rev) {
-		SetBkColor(hdc, GetSysColor32(COLOR_HIGHLIGHT));
-		SetTextColor(hdc, GetSysColor32(COLOR_HIGHLIGHTTEXT));
+	if (rev)
+        {
+            SetBkColor32(hdc, GetSysColor32(COLOR_HIGHLIGHT));
+            SetTextColor32(hdc, GetSysColor32(COLOR_HIGHLIGHTTEXT));
 	}
 	text = EDIT_GetPasswordPointer(wndPtr);
 	li = (INT32)EDIT_EM_LineIndex(wndPtr, line, 0);
@@ -1788,9 +1787,10 @@ static INT32 EDIT_PaintText(WND *wndPtr, HDC32 hdc, INT32 x, INT32 y, INT32 line
 	ret = (INT32)LOWORD(TabbedTextOut32A(hdc, x, y, text + li + col, count,
 					es->NumTabStops, es->TabStops, -xoff));
 	free(text);
-	if (rev) {
-		SetBkColor(hdc, BkColor);
-		SetTextColor(hdc, TextColor);
+	if (rev)
+        {
+            SetBkColor32(hdc, BkColor);
+            SetTextColor32(hdc, TextColor);
 	}
 	return ret;
 }
@@ -1863,7 +1863,7 @@ static void EDIT_SetSel(WND *wndPtr, INT32 ns, INT32 ne)
 	if (EDIT_GetRedraw(wndPtr)) {
 		if (wndPtr->hwndSelf == GetFocus32()) {
 			pos = EDIT_EM_PosFromChar(wndPtr, ne, 0);
-			SetCaretPos((INT16)LOWORD(pos), (INT16)HIWORD(pos));
+			SetCaretPos16((INT16)LOWORD(pos), (INT16)HIWORD(pos));
 		}
 		ORDER_INT32(s, ns);
 		ORDER_INT32(s, ne);
@@ -2137,9 +2137,9 @@ static LRESULT EDIT_EM_GetHandle16(WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
 		}
 		dprintf_edit(stddeb, "edit: EM_GETHANDLE: local heap initialized\n");
 	}
-	if (!(newBuf = LOCAL_Alloc(wndPtr->hInstance,
-				EDIT_WM_GetTextLength(wndPtr, 0, 0) + 1,
-				LMEM_MOVEABLE))) {
+	if (!(newBuf = LOCAL_Alloc(wndPtr->hInstance, LMEM_MOVEABLE,
+                                   EDIT_WM_GetTextLength(wndPtr, 0, 0) + 1)))
+        {
 		fprintf(stderr, "edit: EM_GETHANDLE: could not allocate new 16 bit buffer\n");
 		return 0;
 	}
@@ -3122,7 +3122,7 @@ static LRESULT EDIT_WM_Copy(WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
 	GlobalUnlock16(hdst);
 	OpenClipboard32(wndPtr->hwndSelf);
 	EmptyClipboard32();
-	SetClipboardData(CF_TEXT, hdst);
+	SetClipboardData16(CF_TEXT, hdst);
 	CloseClipboard32();
 	return -1;
 }
@@ -3530,7 +3530,7 @@ static LRESULT EDIT_WM_KillFocus(WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
 	INT32 s;
 	INT32 e;
 
-	DestroyCaret();
+	DestroyCaret32();
 	if(!(wndPtr->dwStyle & ES_NOHIDESEL)) {
 		EDIT_EM_GetSel(wndPtr, (WPARAM32)&s, (LPARAM)&e);
 		EDIT_InvalidateText(wndPtr, s, e);
@@ -3688,7 +3688,7 @@ static LRESULT EDIT_WM_Paint(WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
 		oldFont = (HFONT32)SelectObject32(hdc, hFont);
 	EDIT_SEND_CTLCOLOR(wndPtr, hdc);
 	if (!IsWindowEnabled32(wndPtr->hwndSelf))
-		SetTextColor(hdc, GetSysColor32(COLOR_GRAYTEXT));
+		SetTextColor32(hdc, GetSysColor32(COLOR_GRAYTEXT));
 	GetClipBox32(hdc, &rcRgn);
 	for (i = fv ; i <= MIN(fv + vlc, fv + lc - 1) ; i++ ) {
 		EDIT_GetLineRect(wndPtr, i, 0, -1, &rcLine);
@@ -3699,7 +3699,7 @@ static LRESULT EDIT_WM_Paint(WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
 	if (wndPtr->hwndSelf == GetFocus32()) {
 		EDIT_GetSel(wndPtr, NULL, &e);
 		pos = EDIT_EM_PosFromChar(wndPtr, e, 0);
-		SetCaretPos((INT16)LOWORD(pos), (INT16)HIWORD(pos));
+		SetCaretPos16( (INT16)LOWORD(pos), (INT16)HIWORD(pos) );
 	}
 	EndPaint32(wndPtr->hwndSelf, &ps);
 	return 0;
@@ -3717,7 +3717,8 @@ static LRESULT EDIT_WM_Paste(WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
 	LPSTR src;
 
 	OpenClipboard32(wndPtr->hwndSelf);
-	if ((hsrc = GetClipboardData(CF_TEXT))) {
+	if ((hsrc = GetClipboardData16(CF_TEXT)))
+        {
 		src = (LPSTR)GlobalLock16(hsrc);
 		EDIT_EM_ReplaceSel(wndPtr, (WPARAM32)TRUE, (LPARAM)src);
 		GlobalUnlock16(hsrc);
@@ -3753,7 +3754,7 @@ static LRESULT EDIT_WM_SetFocus(WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
 	INT32 e;
 
 	EDIT_GetSel(wndPtr, &s, &e);
-	CreateCaret(wndPtr->hwndSelf, 0, 2, EDIT_GetLineHeight(wndPtr));
+	CreateCaret32( wndPtr->hwndSelf, 0, 2, EDIT_GetLineHeight(wndPtr) );
 	EDIT_SetSel(wndPtr, s, e);
 	if(!(wndPtr->dwStyle & ES_NOHIDESEL))
 		EDIT_InvalidateText(wndPtr, s, e);
@@ -3791,8 +3792,9 @@ static LRESULT EDIT_WM_SetFont(WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
 	if ((BOOL32)lParam && EDIT_GetRedraw(wndPtr))
 		InvalidateRect32( wndPtr->hwndSelf, NULL, TRUE );
 	if (wndPtr->hwndSelf == GetFocus32()) {
-		DestroyCaret();
-		CreateCaret(wndPtr->hwndSelf, 0, 2, EDIT_GetLineHeight(wndPtr));
+		DestroyCaret32();
+		CreateCaret32( wndPtr->hwndSelf, 0,
+                               2, EDIT_GetLineHeight(wndPtr) );
 		EDIT_SetSel(wndPtr, s, e);
 		ShowCaret32(wndPtr->hwndSelf);
 	}
diff --git a/controls/listbox.c b/controls/listbox.c
index db00116d3aa..57afcf42446 100644
--- a/controls/listbox.c
+++ b/controls/listbox.c
@@ -4,7 +4,6 @@
  * Copyright 1996 Alexandre Julliard
  */
 
-#define NO_TRANSITION_TYPES  /* This file is Win32-clean */
 #include <string.h>
 #include <stdio.h>
 #include "windows.h"
@@ -470,16 +469,16 @@ static void LISTBOX_PaintItem( WND *wnd, LB_DESCR *descr, HDC32 hdc,
         }
         if (item && item->selected)
         {
-            SetBkColor( hdc, GetSysColor32( COLOR_HIGHLIGHT ) );
-            SetTextColor( hdc, GetSysColor32( COLOR_HIGHLIGHTTEXT ) );
+            SetBkColor32( hdc, GetSysColor32( COLOR_HIGHLIGHT ) );
+            SetTextColor32( hdc, GetSysColor32( COLOR_HIGHLIGHTTEXT ) );
         }
         else
         {
-            SetBkColor( hdc, GetSysColor32( COLOR_WINDOW ) );
+            SetBkColor32( hdc, GetSysColor32( COLOR_WINDOW ) );
             if (wnd->dwStyle & WS_DISABLED)
-                SetTextColor( hdc, GetSysColor32( COLOR_GRAYTEXT ) );
+                SetTextColor32( hdc, GetSysColor32( COLOR_GRAYTEXT ) );
             else
-                SetTextColor( hdc, GetSysColor32( COLOR_WINDOWTEXT ) );
+                SetTextColor32( hdc, GetSysColor32( COLOR_WINDOWTEXT ) );
         }
         dprintf_listbox( stddeb, "Listbox %04x: painting %d (%s) action=%02x "
                          "rect=%d,%d-%d,%d\n",
@@ -856,7 +855,7 @@ static LRESULT LISTBOX_Paint( WND *wnd, LB_DESCR *descr, HDC32 hdc )
             if (!IS_OWNERDRAW(descr))
             {
                 /* Clear the bottom of the column */
-                SetBkColor( hdc, GetSysColor32( COLOR_WINDOW ) );
+                SetBkColor32( hdc, GetSysColor32( COLOR_WINDOW ) );
                 if (rect.top < descr->height)
                 {
                     rect.bottom = descr->height;
@@ -881,7 +880,7 @@ static LRESULT LISTBOX_Paint( WND *wnd, LB_DESCR *descr, HDC32 hdc )
     if (!IS_OWNERDRAW(descr))
     {
         /* Clear the remainder of the client area */
-        SetBkColor( hdc, GetSysColor32( COLOR_WINDOW ) );
+        SetBkColor32( hdc, GetSysColor32( COLOR_WINDOW ) );
         if (rect.top < descr->height)
         {
             rect.bottom = descr->height;
diff --git a/controls/menu.c b/controls/menu.c
index 6f0c0717bb1..29d073c81d1 100644
--- a/controls/menu.c
+++ b/controls/menu.c
@@ -11,7 +11,6 @@
  * This is probably not the meaning this style has in MS-Windows.
  */
 
-#define NO_TRANSITION_TYPES  /* This file is Win32-clean */
 #include <ctype.h>
 #include <stdlib.h>
 #include <stdio.h>
@@ -600,18 +599,18 @@ static void MENU_DrawMenuItem( HWND32 hwnd, HDC32 hdc, MENUITEM *lpitem,
     if (lpitem->item_flags & MF_HILITE)
     {
 	if (lpitem->item_flags & MF_GRAYED)
-	    SetTextColor( hdc, GetSysColor32( COLOR_GRAYTEXT ) );
+	    SetTextColor32( hdc, GetSysColor32( COLOR_GRAYTEXT ) );
 	else
-	    SetTextColor( hdc, GetSysColor32( COLOR_HIGHLIGHTTEXT ) );
-	SetBkColor( hdc, GetSysColor32( COLOR_HIGHLIGHT ) );
+	    SetTextColor32( hdc, GetSysColor32( COLOR_HIGHLIGHTTEXT ) );
+	SetBkColor32( hdc, GetSysColor32( COLOR_HIGHLIGHT ) );
     }
     else
     {
 	if (lpitem->item_flags & MF_GRAYED)
-	    SetTextColor( hdc, GetSysColor32( COLOR_GRAYTEXT ) );
+	    SetTextColor32( hdc, GetSysColor32( COLOR_GRAYTEXT ) );
 	else
-	    SetTextColor( hdc, GetSysColor32( COLOR_MENUTEXT ) );
-	SetBkColor( hdc, GetSysColor32( COLOR_MENU ) );
+	    SetTextColor32( hdc, GetSysColor32( COLOR_MENUTEXT ) );
+	SetBkColor32( hdc, GetSysColor32( COLOR_MENU ) );
     }
 
     if (!menuBar)
@@ -869,8 +868,8 @@ static BOOL32 MENU_ShowPopup( HWND32 hwndOwner, HMENU32 hmenu, UINT32 id,
       /* Display the window */
 
     SetWindowPos32( menu->hWnd, HWND_TOP, 0, 0, 0, 0,
-		    SWP_SHOWWINDOW | SWP_NOSIZE | SWP_NOMOVE | SWP_NOACTIVATE );
-    UpdateWindow( menu->hWnd );
+		    SWP_SHOWWINDOW | SWP_NOSIZE | SWP_NOMOVE | SWP_NOACTIVATE);
+    UpdateWindow32( menu->hWnd );
     return TRUE;
 }
 
@@ -1310,8 +1309,8 @@ static BOOL32 MENU_ExecFocusedItem( HWND32 hwndOwner, HMENU32 hmenu,
     {
 	if (!(item->item_flags & (MF_GRAYED | MF_DISABLED)))
 	{
-	    PostMessage( hwndOwner, (menu->wFlags & MF_SYSMENU) ? 
-			WM_SYSCOMMAND : WM_COMMAND, item->item_id, 0 );
+	    PostMessage16( hwndOwner, (menu->wFlags & MF_SYSMENU) ? 
+                           WM_SYSCOMMAND : WM_COMMAND, item->item_id, 0 );
 	    return FALSE;
 	}
 	else return TRUE;
@@ -1473,7 +1472,7 @@ static LRESULT MENU_DoNextMenu( HWND32* hwndOwner, HMENU32* hmenu,
                                         ? GetSystemMenu32( *hwndOwner, 0) 
                                         : *hmenu));
 
-    if( l == 0 || !IsMenu32(LOWORD(l)) || !IsWindow(HIWORD(l)) ) return 0;
+    if( l == 0 || !IsMenu32(LOWORD(l)) || !IsWindow32(HIWORD(l)) ) return 0;
 
     /* shutdown current menu -
      * all these checks for system popup window are needed
@@ -1938,7 +1937,7 @@ void MENU_TrackKbdMenuBar( WND* wndPtr, UINT32 wParam, INT32 vkey)
 		if( uItem == NO_SELECTED_ITEM )
 		    MENU_SelectItemRel( wndPtr->hwndSelf, hTrackMenu, ITEM_NEXT );
 		else
-		    PostMessage( wndPtr->hwndSelf, WM_KEYDOWN, VK_DOWN, 0L );
+		    PostMessage16( wndPtr->hwndSelf, WM_KEYDOWN, VK_DOWN, 0L );
 
 		MENU_TrackMenu( hTrackMenu, TPM_LEFTALIGN | TPM_LEFTBUTTON,
 				0, 0, wndPtr->hwndSelf, NULL );
diff --git a/controls/oldlbox.c b/controls/oldlbox.c
index 87e6a5a0391..cbecfd90466 100644
--- a/controls/oldlbox.c
+++ b/controls/oldlbox.c
@@ -66,7 +66,7 @@ void CreateListBoxStruct(HWND16 hwnd, WORD CtlType, LONG styles, HWND16 parent)
   SetWindowLong32A(hwnd, 0, (LONG)lphl);
   ListBoxInitialize(lphl);
   lphl->DrawCtlType    = CtlType;
-  lphl->CtlID          = GetWindowWord(hwnd,GWW_ID);
+  lphl->CtlID          = GetWindowWord16(hwnd,GWW_ID);
   lphl->bRedrawFlag    = TRUE;
   lphl->iNumStops      = 0;
   lphl->TabStops       = NULL;
@@ -160,10 +160,10 @@ int ListBoxScrollToFocus(LPHEADLIST lphl)
 }
 
 
-LPLISTSTRUCT ListBoxGetItem(LPHEADLIST lphl, UINT uIndex)
+LPLISTSTRUCT ListBoxGetItem(LPHEADLIST lphl, UINT16 uIndex)
 {
   LPLISTSTRUCT lpls;
-  UINT         Count = 0;
+  UINT16         Count = 0;
 
   if (uIndex >= lphl->ItemsCount) return NULL;
 
@@ -199,7 +199,7 @@ void ListBoxDrawItem(HWND16 hwnd, LPHEADLIST lphl, HDC16 hdc, LPLISTSTRUCT lpls,
       OldBkMode = SetBkMode32(hdc, TRANSPARENT);
 
       if (itemState != 0) {
-	dwOldTextColor = SetTextColor(hdc, 0x00FFFFFFL);
+	dwOldTextColor = SetTextColor32(hdc, 0x00FFFFFFL);
 	FillRect16(hdc, rect, GetStockObject32(BLACK_BRUSH));
       }
 
@@ -213,7 +213,7 @@ void ListBoxDrawItem(HWND16 hwnd, LPHEADLIST lphl, HDC16 hdc, LPLISTSTRUCT lpls,
       }
 
       if (itemState != 0) {
-	SetTextColor(hdc, dwOldTextColor);
+	SetTextColor32(hdc, dwOldTextColor);
       }
       
       SetBkMode32(hdc, OldBkMode);
@@ -303,7 +303,7 @@ static LPLISTSTRUCT ListBoxCreateItem(LPHEADLIST lphl, int id)
   return lplsnew;
 }
 
-static int ListBoxAskCompare(LPHEADLIST lphl, int startItem, SEGPTR matchData, BOOL exactMatch )
+static int ListBoxAskCompare(LPHEADLIST lphl, int startItem, SEGPTR matchData, BOOL32 exactMatch )
 {
  /*  Do binary search for sorted listboxes. Linked list item storage sort of 
   *  defeats the purpose ( forces to traverse item list all the time ) but M$ does it this way...
@@ -401,18 +401,18 @@ static int ListBoxAskCompare(LPHEADLIST lphl, int startItem, SEGPTR matchData, B
  return (exactMatch)? LB_ERR: pos;
 }
 
-int ListBoxInsertString(LPHEADLIST lphl, UINT uIndex, LPCSTR newstr)
+int ListBoxInsertString(LPHEADLIST lphl, UINT16 uIndex, LPCSTR newstr)
 {
   LPLISTSTRUCT *lppls, lplsnew, lpls;
   HANDLE16 hStr;
   LPSTR	str;
-  UINT	Count;
+  UINT16	Count;
     
   dprintf_listbox(stddeb,"ListBoxInsertString(%d, %p);\n", uIndex, newstr);
     
   if (!newstr) return -1;
 
-  if (uIndex == (UINT)-1)
+  if (uIndex == (UINT16)-1)
     uIndex = lphl->ItemsCount;
 
   lppls = &lphl->lpFirst;
@@ -466,7 +466,7 @@ int ListBoxInsertString(LPHEADLIST lphl, UINT uIndex, LPCSTR newstr)
 
 int ListBoxAddString(LPHEADLIST lphl, SEGPTR itemData)
 {
-    UINT 	pos = (UINT) -1;
+    UINT16 	pos = (UINT16) -1;
     LPCSTR	newstr = (lphl->HasStrings)?(LPCSTR)PTR_SEG_TO_LIN(itemData):(LPCSTR)itemData;
 
     if ( lphl->dwStyle & LBS_SORT ) 
@@ -476,7 +476,7 @@ int ListBoxAddString(LPHEADLIST lphl, SEGPTR itemData)
 }
 
 
-int ListBoxGetText(LPHEADLIST lphl, UINT uIndex, LPSTR OutStr)
+int ListBoxGetText(LPHEADLIST lphl, UINT16 uIndex, LPSTR OutStr)
 {
   LPLISTSTRUCT lpls;
 
@@ -498,7 +498,7 @@ int ListBoxGetText(LPHEADLIST lphl, UINT uIndex, LPSTR OutStr)
 }
 
 
-DWORD ListBoxGetItemData(LPHEADLIST lphl, UINT uIndex)
+DWORD ListBoxGetItemData(LPHEADLIST lphl, UINT16 uIndex)
 {
   LPLISTSTRUCT lpls;
 
@@ -508,7 +508,7 @@ DWORD ListBoxGetItemData(LPHEADLIST lphl, UINT uIndex)
 }
 
 
-int ListBoxSetItemData(LPHEADLIST lphl, UINT uIndex, DWORD ItemData)
+int ListBoxSetItemData(LPHEADLIST lphl, UINT16 uIndex, DWORD ItemData)
 {
   LPLISTSTRUCT lpls = ListBoxGetItem(lphl, uIndex);
 
@@ -518,10 +518,10 @@ int ListBoxSetItemData(LPHEADLIST lphl, UINT uIndex, DWORD ItemData)
 }
 
 
-int ListBoxDeleteString(LPHEADLIST lphl, UINT uIndex)
+int ListBoxDeleteString(LPHEADLIST lphl, UINT16 uIndex)
 {
   LPLISTSTRUCT lpls, lpls2;
-  UINT	Count;
+  UINT16	Count;
 
   if (uIndex >= lphl->ItemsCount) return LB_ERR;
 
@@ -561,13 +561,13 @@ int ListBoxDeleteString(LPHEADLIST lphl, UINT uIndex)
   return lphl->ItemsCount;
 }
 
-static int lbFindString(LPHEADLIST lphl, UINT nFirst, SEGPTR MatchStr, BOOL match)
+static int lbFindString(LPHEADLIST lphl, UINT16 nFirst, SEGPTR MatchStr, BOOL32 match)
 {
   /*  match is either MATCH_SUBSTR or MATCH_EXACT */
 
   LPLISTSTRUCT lpls;
-  UINT	       Count;
-  UINT         First      = nFirst + 1;
+  UINT16	       Count;
+  UINT16         First      = nFirst + 1;
   int	       s_length   = 0;
   LPSTR        lpMatchStr = (LPSTR)MatchStr;
 
@@ -624,12 +624,12 @@ static int lbFindString(LPHEADLIST lphl, UINT nFirst, SEGPTR MatchStr, BOOL matc
   return LB_ERR;
 }
 
-int ListBoxFindString(LPHEADLIST lphl, UINT nFirst, SEGPTR MatchStr)
+int ListBoxFindString(LPHEADLIST lphl, UINT16 nFirst, SEGPTR MatchStr)
 {
   return lbFindString(lphl, nFirst, MatchStr, MATCH_SUBSTR );
 }
 
-int ListBoxFindStringExact(LPHEADLIST lphl, UINT nFirst, SEGPTR MatchStr)
+int ListBoxFindStringExact(LPHEADLIST lphl, UINT16 nFirst, SEGPTR MatchStr)
 {
   return lbFindString(lphl, nFirst, MatchStr, MATCH_EXACT );
 }
@@ -676,7 +676,7 @@ int ListBoxSetCurSel(LPHEADLIST lphl, WORD wIndex)
     lpls->itemState = 0;
   }
 
-  if ((wIndex != (UINT)-1) && (wIndex < lphl->ItemsCount))
+  if ((wIndex != (UINT16)-1) && (wIndex < lphl->ItemsCount))
   {
     lphl->ItemFocused = wIndex;
     lpls = ListBoxGetItem(lphl, wIndex);
@@ -693,7 +693,7 @@ int ListBoxSetCurSel(LPHEADLIST lphl, WORD wIndex)
 
 /* ------------------------- dir listing ------------------------ */
 
-LONG ListBoxDirectory(LPHEADLIST lphl, UINT attrib, LPCSTR filespec)
+LONG ListBoxDirectory(LPHEADLIST lphl, UINT16 attrib, LPCSTR filespec)
 {
     return 0;
 }
@@ -745,7 +745,7 @@ int ListBoxSetItemHeight(LPHEADLIST lphl, WORD wIndex, long height)
 int ListBoxFindNextMatch(LPHEADLIST lphl, WORD wChar)
 {
   LPLISTSTRUCT lpls;
-  UINT	       count,first;
+  UINT16 count,first;
 
   if ((char)wChar < ' ') return LB_ERR;
   if (!lphl->HasStrings) return LB_ERR;
diff --git a/controls/scroll.c b/controls/scroll.c
index 14c3f401f0f..819ff5da2f5 100644
--- a/controls/scroll.c
+++ b/controls/scroll.c
@@ -5,7 +5,6 @@
  * Copyright 1994, 1996 Alexandre Julliard
  */
 
-#define NO_TRANSITION_TYPES  /* This file is Win32-clean */
 #include <stdlib.h>
 #include <stdio.h>
 #include <sys/types.h>
diff --git a/controls/static.c b/controls/static.c
index 9842f0626cc..77e6c55b07f 100644
--- a/controls/static.c
+++ b/controls/static.c
@@ -67,7 +67,8 @@ static HICON16 STATIC_SetIcon( WND *wndPtr, HICON16 hicon )
 /***********************************************************************
  *           StaticWndProc
  */
-LRESULT StaticWndProc( HWND16 hWnd, UINT uMsg, WPARAM16 wParam, LPARAM lParam)
+LRESULT StaticWndProc( HWND16 hWnd, UINT16 uMsg, WPARAM16 wParam,
+                       LPARAM lParam )
 {
     LRESULT lResult = 0;
     WND *wndPtr = WIN_FindWndPtr(hWnd);
@@ -140,7 +141,7 @@ LRESULT StaticWndProc( HWND16 hWnd, UINT uMsg, WPARAM16 wParam, LPARAM lParam)
             else
                 DEFWND_SetText( wndPtr, (LPSTR)PTR_SEG_TO_LIN(lParam) );
 	    InvalidateRect32( hWnd, NULL, FALSE );
-	    UpdateWindow( hWnd );
+	    UpdateWindow32( hWnd );
 	    break;
 
         case WM_SETFONT:
@@ -149,7 +150,7 @@ LRESULT StaticWndProc( HWND16 hWnd, UINT uMsg, WPARAM16 wParam, LPARAM lParam)
             if (LOWORD(lParam))
             {
                 InvalidateRect32( hWnd, NULL, FALSE );
-                UpdateWindow( hWnd );
+                UpdateWindow32( hWnd );
             }
             break;
 
@@ -168,7 +169,7 @@ LRESULT StaticWndProc( HWND16 hWnd, UINT uMsg, WPARAM16 wParam, LPARAM lParam)
 	case STM_SETICON:
             lResult = STATIC_SetIcon( wndPtr, (HICON16)wParam );
             InvalidateRect32( hWnd, NULL, FALSE );
-            UpdateWindow( hWnd );
+            UpdateWindow32( hWnd );
 	    break;
 
 	default:
diff --git a/controls/status.c b/controls/status.c
index 17c43722bb4..feef96c8406 100644
--- a/controls/status.c
+++ b/controls/status.c
@@ -4,7 +4,6 @@
  * Copyright 1996 Bruce Milner
  */
 
-#define NO_TRANSITION_TYPES  /* This file is Win32-clean */
 #include <stdio.h>
 #include <stdlib.h>
 #include "windows.h"
diff --git a/controls/widgets.c b/controls/widgets.c
index 0d5e219fa10..ffc2a234b94 100644
--- a/controls/widgets.c
+++ b/controls/widgets.c
@@ -94,7 +94,7 @@ static WNDCLASS32A WIDGETS_CommonControls32[] =
  * 
  * Initialize the built-in window classes.
  */
-BOOL WIDGETS_Init(void)
+BOOL32 WIDGETS_Init(void)
 {
     int i;
     char *name;
diff --git a/debugger/Makefile.in b/debugger/Makefile.in
index 3f5d49d8d7b..2ab72d1bd09 100644
--- a/debugger/Makefile.in
+++ b/debugger/Makefile.in
@@ -1,4 +1,4 @@
-DEFS      = -D__WINE__ -DNO_TRANSITION_TYPES
+DEFS      = -D__WINE__
 TOPSRCDIR = @top_srcdir@
 TOPOBJDIR = ..
 SRCDIR    = @srcdir@
diff --git a/debugger/dbg.y b/debugger/dbg.y
index b87291aa21f..0f0b9fb1ec5 100644
--- a/debugger/dbg.y
+++ b/debugger/dbg.y
@@ -49,7 +49,7 @@ int yyerror(char *);
 %token tENABLE tDISABLE tBREAK tDELETE tSET tMODE tPRINT tEXAM tABORT
 %token tCLASS tMODULE tSTACK tSEGMENTS tREGS tWND tQUEUE tLOCAL
 %token tEOL tSTRING
-%token tFRAME tSHARE tCOND tDISPLAY tUNDISPLAY
+%token tFRAME tSHARE tCOND tDISPLAY tUNDISPLAY tDISASSEMBLE
 %token tSTEPI tNEXTI tFINISH tSHOW tDIR
 %token <string> tPATH
 %token <string> tIDENTIFIER tSTRING
@@ -145,6 +145,7 @@ command:
     | tCOND tNUM tEOL          { DEBUG_AddBPCondition($2, NULL); }
     | tCOND tNUM expr tEOL     { DEBUG_AddBPCondition($2, $3); }
     | list_command
+    | disassemble_command
     | set_command
     | x_command
     | print_command
@@ -162,6 +163,11 @@ pathname:
       tIDENTIFIER                    { $$ = $1; }
     | tPATH			     { $$ = $1; }
 
+disassemble_command:
+      tDISASSEMBLE tEOL              { DEBUG_Disassemble( NULL, NULL, 10 ); }
+    | tDISASSEMBLE expr_addr tEOL    { DEBUG_Disassemble( & $2, NULL, 10 ); }
+    | tDISASSEMBLE expr_addr ',' expr_addr tEOL { DEBUG_Disassemble( & $2, & $4, 0 ); }
+
 list_command:
       tLIST tEOL               { DEBUG_List( NULL, NULL, 10 ); }
     | tLIST '-' tEOL	       { DEBUG_List( NULL, NULL, -10 ); }
@@ -294,7 +300,7 @@ expr_addr:
 
 expr_value:
       expr        { DBG_ADDR addr  = DEBUG_EvalExpr($1);
-		    $$ = *(unsigned int *) addr.off; }
+		    $$ = addr.off ? *(unsigned int *) addr.off : 0; }
 /*
  * The expr rule builds an expression tree.  When we are done, we call
  * EvalExpr to evaluate the value of the expression.  The advantage of
diff --git a/debugger/debug.l b/debugger/debug.l
index d33b4c03713..1322df6e027 100644
--- a/debugger/debug.l
+++ b/debugger/debug.l
@@ -112,7 +112,8 @@ $gs     { yylval.reg = REG_GS;  return tREG; }
 <INITIAL>frame|fram|fra|fr		{ BEGIN(NOCMD); return tFRAME; }
 <INITIAL>list|lis|li|l			{ BEGIN(PATH_EXPECTED); return tLIST; }
 <INITIAL>enable|enabl|enab|ena		{ BEGIN(NOCMD); return tENABLE;}
-<INITIAL>disable|disabl|disab|disa|dis	{ BEGIN(NOCMD); return tDISABLE; }
+<INITIAL>disable|disabl|disab|disa|dis  { BEGIN(NOCMD); return tDISABLE; }
+<INITIAL>disassemble|disassembl|disassemb|disassem|disasse|disass|disas { BEGIN(NOCMD); return tDISASSEMBLE; }
 <INITIAL,INFO_CMD,DEL_CMD>display|displa|displ|disp	{ BEGIN(FORMAT_EXPECTED); return tDISPLAY; }
 <INITIAL>undisplay|undispla|undispl|undisp|undis|undi|und	{ BEGIN(NOCMD); return tUNDISPLAY; }
 <INITIAL>delete|delet|dele|del		{ BEGIN(DEL_CMD); return tDELETE; }
diff --git a/debugger/display.c b/debugger/display.c
index fd7e8c678ed..b3ac40d389c 100644
--- a/debugger/display.c
+++ b/debugger/display.c
@@ -14,7 +14,6 @@
 #include "module.h"
 #include "selectors.h"
 #include "debugger.h"
-#include "toolhelp.h"
 #include "xmalloc.h"
 
 #include <stdarg.h>
diff --git a/debugger/expr.c b/debugger/expr.c
index 6968c066d02..1735eda129f 100644
--- a/debugger/expr.c
+++ b/debugger/expr.c
@@ -14,7 +14,6 @@
 #include "module.h"
 #include "selectors.h"
 #include "debugger.h"
-#include "toolhelp.h"
 #include "xmalloc.h"
 
 #include "expr.h"
diff --git a/debugger/info.c b/debugger/info.c
index dd5b76a3e89..10ffc97d4d2 100644
--- a/debugger/info.c
+++ b/debugger/info.c
@@ -121,7 +121,7 @@ void DEBUG_Help(void)
     static const char * const helptext[] =
 {
 "The commands accepted by the Wine debugger are a reasonable",
-"of the commands that gdb accepts.",
+"subset of the commands that gdb accepts.",
 "The commands currently are:",
 "  break [*<addr>]                        delete break bpnum",
 "  disable bpnum                          enable bpnum",
@@ -134,10 +134,11 @@ void DEBUG_Help(void)
 "  x <addr>                               print <expr>",
 "  set <reg> = <expr>                     set *<addr> = <expr>",
 "  up                                     down",
-"  list <lines>                           frame <n>",
-"  finish                                 show dir",
-"  dir <path>                             display <expr>",
-"  delete display <disnum>                undisplay <disnum>\n",
+"  list <lines>                           disassemble [<addr>][,<addr>]",
+"  frame <n>                              finish",
+"  show dir                               dir <path>",
+"  display <expr>                         undisplay <disnum>",
+"  delete display <disnum>\n",
 
 "Wine-specific commands:",
 "  mode [16,32]                           walk [wnd,class,queue] <handle>",
diff --git a/debugger/source.c b/debugger/source.c
index d9c6412b1b4..2e3f0738549 100644
--- a/debugger/source.c
+++ b/debugger/source.c
@@ -426,6 +426,94 @@ DEBUG_List(struct list_id * source1, struct list_id * source2,
   DEBUG_end_sourceline = end;
 }
 
+DBG_ADDR DEBUG_LastDisassemble={NULL,0,0};
+
+static int
+_disassemble(DBG_ADDR *addr)
+{
+	DEBUG_PrintAddress( addr, dbg_mode, TRUE );
+	fprintf(stderr,": ");
+	if (!DBG_CHECK_READ_PTR( addr, 1 )) return 0;
+	DEBUG_Disasm( addr, TRUE );
+	fprintf(stderr,"\n");
+	return 1;
+}
+
+void
+_disassemble_fixaddr(DBG_ADDR *addr) {
+    DWORD seg2;
+    struct datatype *testtype;
+
+    DBG_FIX_ADDR_SEG(addr,CS_reg(&DEBUG_context));
+    if( addr->type != NULL )
+      {
+        if( addr->type == DEBUG_TypeIntConst )
+          {
+            /*
+             * We know that we have the actual offset stored somewhere
+             * else in 32-bit space.  Grab it, and we
+             * should be all set.
+             */
+            seg2 = addr->seg;
+            addr->seg = 0;
+            addr->off = DEBUG_GetExprValue(addr, NULL);
+            addr->seg = seg2;
+          }
+        else
+          {
+            if (!DBG_CHECK_READ_PTR( addr, 1 )) return;
+            DEBUG_TypeDerefPointer(addr, &testtype);
+            if( testtype != NULL || addr->type == DEBUG_TypeIntConst )
+                addr->off = DEBUG_GetExprValue(addr, NULL);
+          }
+      }
+    else if (!addr->seg && !addr->off)
+    {
+        fprintf(stderr,"Invalid expression\n");
+        return;
+    }
+}
+
+void
+DEBUG_Disassemble(const DBG_ADDR *xstart,const DBG_ADDR *xend,int offset)
+{
+  int i;
+  DBG_ADDR	last;
+  DBG_ADDR	end,start;
+
+
+  if (xstart) {
+    start=*xstart;
+    _disassemble_fixaddr(&start);
+  }
+  if (xend) {
+    end=*xend;
+    _disassemble_fixaddr(&end);
+  }
+  if (!xstart && !xend) {
+    last = DEBUG_LastDisassemble;
+    if (!last.seg && !last.off) {
+      last.seg = (CS_reg(&DEBUG_context)==WINE_CODE_SELECTOR)?0:CS_reg(&DEBUG_context);
+      last.off = EIP_reg(&DEBUG_context);
+    }
+    for (i=0;i<offset;i++)
+      if (!_disassemble(&last)) break;
+    memcpy(&DEBUG_LastDisassemble,&last,sizeof(last));
+    return;
+  }
+  last = start;
+  if (!xend) {
+    for (i=0;i<offset;i++)
+      if (!_disassemble(&last)) break;
+    memcpy(&DEBUG_LastDisassemble,&last,sizeof(last));
+    return;
+  }
+  while (last.off <= end.off)
+    if (!_disassemble(&last)) break;
+  memcpy(&DEBUG_LastDisassemble,&last,sizeof(last));
+  return;
+}
+
 
 
 #if 0
diff --git a/documentation/debugging b/documentation/debugging
index 4b8bead139d..51bd0fcbced 100644
--- a/documentation/debugging
+++ b/documentation/debugging
@@ -8,7 +8,8 @@ Crashes
 
 |Unexpected Windows program segfault - opcode = 8b
 |Segmentation fault in Windows program 1b7:c41.
-|Reading symbols from file /root/wine/wine.sym
+|Loading symbols from ELF file /root/wine/wine...
+|....more Loading symbols from ...
 |In 16 bit mode.
 |Register dump:
 | CS:01b7 SS:016f DS:0287 ES:0000
@@ -22,14 +23,14 @@ Crashes
 |
 |0050: sel=0287 base=40211d30 limit=0b93f (bytes) 16-bit rw-
 |Backtrace:
-|0 0x01b7:0x0c41 (PXSRV.FONGETFACENAME+0x7c)
-|1 0x01b7:0x1e5b (PXSRV.FONPUTCATFONT+0x2cd)
+|0 0x01b7:0x0c41 (PXSRV_FONGETFACENAME+0x7c)
+|1 0x01b7:0x1e5b (PXSRV_FONPUTCATFONT+0x2cd)
 |2 0x01a7:0x05aa
-|3 0x01b7:0x0768 (PXSRV.FONINITFONTS+0x81)
-|4 0x014f:0x03ed (PDOXWIN.@SQLCURCB$Q6CBTYPEULN8CBSCTYPE+0x1b1)
+|3 0x01b7:0x0768 (PXSRV_FONINITFONTS+0x81)
+|4 0x014f:0x03ed (PDOXWIN_@SQLCURCB$Q6CBTYPEULN8CBSCTYPE+0x1b1)
 |5 0x013f:0x00ac
 |
-|0x01b7:0x0c41 (PXSRV.FONGETFACENAME+0x7c):  movw        %es:0x38(%bx),%dx
+|0x01b7:0x0c41 (PXSRV_FONGETFACENAME+0x7c):  movw        %es:0x38(%bx),%dx
 
 Steps to debug a crash. You may stop at any step, but please report the bug
 and provide as much of the information gathered to the newsgroup or the
@@ -67,23 +68,12 @@ relevant developer as feasonable.
  3. If you have found a misbehaving function, try to find out why it
     misbehaves. Find the function in the source code. Try to make sense of
     the arguments passed. Usually there is a
-    "dprintf_xyz(stddeb,"Fnction(...)"...);" at the beginning of the
+    "dprintf_xyz(stddeb,"Function(...)"...);" at the beginning of the
     function. Rerun wine with "-debugmsg +xyz,+relay" added to the
     commandline.
 
- 4. If the crash happened in a function in WINE, find out the exact line using
-    gdb (the sample crash has another reason):
-|... somewhere in the backtrace ...
-|5 0x080e5ad8 (CreateWindowEx32A+0xd8)
-|...
-|$ gdb wine
-|...
-|(gdb) l *0x080e5ad8
-|0x80e5ad8 is in CreateWindowEx32A (win.c:837).
-|...
-|837         return WIN_CreateWindowEx( &cs, classAtom, FALSE );
-|...
-
+ 4. Additional information on how to debug using the internal debugger can be 
+    found in debugger/README.
 
  5. If those information isn't clear enough or if you want to know more about
     what's happening in the function itself, try running wine with "-debugmsg
@@ -96,7 +86,7 @@ relevant developer as feasonable.
   
  7. You can also set a breakpoint for that function. Start wine with the
     "-debug" option added to the commandline. After loading the executable
-    wine will enter the internal debugger. Use "break KERNEL.LSTRLEN"
+    wine will enter the internal debugger. Use "break KERNEL_LSTRLEN"
     (replace by function you want to debug, CASE IS RELEVANT.) to set a
     breakpoint.  Then use "continue" to start normal program-execution. Wine
     will stop if it reaches the breakpoint. If the program isn't yet at the
@@ -123,10 +113,9 @@ Program reports an error with a Messagebox
 
   Since the failure happens usually directly before setting up the Messagebox
   you can start wine with "-debug" added to the commandline, set a breakpoint
-  at "USER.MESSAGEBOX" (win16 programs) "USER32.MessageBox" (win32 Programs)
-  and proceed with "continue". With "-debugmsg +all" Wine will now stop
-  directly directly before setting up the Messagebox.  Proceed as explained
-  above.
+  at "MessageBox32A" (called by win16 and win32 programs) and proceed with
+  "continue". With "-debugmsg +all" Wine will now stop directly directly
+  before setting up the Messagebox.  Proceed as explained above.
 
 
 Disassembling programs:
@@ -187,12 +176,12 @@ Sample debugging session:
 |Call WPROCS.24: TASK_RESCHEDULE() ret=003f:0759 ds=0000
 |Ret  WPROCS.24: TASK_RESCHEDULE() retval=0x0000 ret=003f:0759 ds=08a7
 |CallTo16(func=0157:001a,ds=08a7,0x11d7,0x0000,0x0000,0x3cb4,0x1f40,0x0000,0x0000,0x08a7)
-|Reading symbols from file /root/wine/wine.sym
-|Stopped on breakpoint 1 at 0x0157:0x001a
+|Loading symbols from ELF file /home/marcus/wine/wine...
+|...more Loading symbols ... 
+|Stopped on breakpoint 1 at 0x0157:0x001a (WPROCS_VXD_PAGEFILE+0xffffeeea)
 |In 16 bit mode.
-|0x0157:0x001a:  xorw	%bp,%bp
-|Wine-dbg> break USER.MESSAGEBOX                       <---- Set Breakpoint
-|Breakpoint 2 at 0x0067:0x00000000 (USER.MESSAGEBOX)
+|Wine-dbg>break MessageBox32A                          <---- Set Breakpoint
+|Breakpoint 2 at 0x080e792c (MessageBox32A [msgbox.c:198])
 |Wine-dbg>c                                            <---- Continue
 |Call KERNEL.91: INITTASK() ret=0157:0022 ds=08a7
 |     AX=0000 BX=3cb4 CX=1f40 DX=0000 SI=0000 DI=08a7 ES=11d7 EFL=00000286
@@ -219,9 +208,10 @@ Sample debugging session:
                                    ^
 				   | -1 aka. HFILE_ERROR
 
-|Stopped on breakpoint 2 at 0x0067:0x00000000 (USER.MESSAGEBOX)
+|Call USER.1: MESSAGEBOX(0x0000,08ef:8362,0000:0000,0x1030) ret=05d7:084f ds=08efStopped on breakpoint 2 at 0x080e792c (MessageBox32A [msgbox.c:198])
+|198     {
 |In 32 bit mode.
-|0x0067:0x00000000 (USER.MESSAGEBOX):  pushw	%bp
+|Wine-dbg> _
 
     Now, we see that OPENFILE seem to have returned 0xFFFF (or -1). Checking
     the implementation of OpenFile in files/file.c, this signals an error.
@@ -237,23 +227,29 @@ Sample debugging session:
 |marcus@jet $ wine winword.exe -debugmsg +relay,+file -debug
 |.....much more debugoutput .....
 |
-|Call KERNEL.97: GETTEMPFILENAME(0x00c3,08a7:8350,0x0000,08a7:8234) ret=058f:09b1 ds=08a7
-|FILE_Create: 'C:~docd03d.tmp' 01b6 1
+
+|Call KERNEL.97: GETTEMPFILENAME(0x00c3,08ef:8350,0x0000,08ef:8234) ret=05d7:09b1 ds=08ef
+|FILE_Create: 'C:\~doc8b93.tmp' 01b6 1
 |FILE_SetDosError: errno = 13
-|GetTempFileName: returning C:\~DOCD03D.TMP
-|Ret  KERNEL.97: GETTEMPFILENAME() retval=0xd03d ret=058f:09b1 ds=08a7
-|Call KERNEL.74: OPENFILE(08a7:8234,08a7:82c6,0x1012) ret=058f:09d8 ds=08a7
-|OpenFile: C:\~DOCD03D.TMP 1012
-|FILE_AllocTaskHandle: returning task handle 1, dos_file 0, file 1 of 254
-|FILE_Create: 'C:\~DOCD03D.TMP' 01b6 0
+
+|Warning: GetTempFileName returns 'C:\~doc8b93.tmp', which doesn't seem to be writeable.
+|Please check your configuration file if this generates a failure.
+ ^ Warning message
+
+|GetTempFileName: returning C:\~doc8b93.tmp
+|Ret  KERNEL.97: GETTEMPFILENAME() retval=0x8b93 ret=05d7:09b1 ds=08ef
+|Call KERNEL.74: OPENFILE(08ef:8234,08ef:82c6,0x1012) ret=05d7:09d8 ds=08ef
+|OpenFile: C:\~doc8b93.tmp 1012
+|FILE_Create: 'C:\~doc8b93.tmp' 01b6 0
 |FILE_SetDosError: errno = 13
-|OpenFile(C:\~DOCD03D.TMP): return = HFILE_ERROR
-|FILE_FreeTaskHandle: dos=1 file=0
-|Ret  KERNEL.74: OPENFILE() retval=0xffff ret=058f:09d8 ds=08a7
+|OpenFile(C:\~doc8b93.tmp): return = HFILE_ERROR
+|Ret  KERNEL.74: OPENFILE() retval=0xffff ret=05d7:09d8 ds=08ef
+
 
-    The filename is "C:\~DOCD03D.TMP". Of course, C:\ is writeable for the
+    The filename is "C:\~docd03d.tmp". Of course, C:\ is writeable for the
     superuser only, so the open fails for a normal user and OpenFile returns
-    -1, which in turn generates this messagebox.
+    -1, which in turn generates this messagebox. (As said by the warning
+    message.)
 
 
 Written by Marcus Meissner <msmeissn@cip.informatik.uni-erlangen.de>,
diff --git a/documentation/languages b/documentation/languages
index 71f2d6b2a07..ef4aa6d80c7 100644
--- a/documentation/languages
+++ b/documentation/languages
@@ -1,6 +1,8 @@
 This file documents the necessary procedure for adding a new language
 to the list of languages that Wine can display system menus and forms
-in.
+in. Currently at least the following languages are still missing: 
+Bulgarian, Chinese, Greek, Icelandic, Japanese, Dutch, Polish, Portuguese,
+Romanian, Russian, Croatian, Slovak, Swedish, Turkish, and Slovanian.
 
 To add a new language you need to be able to translate the relatively
 few texts, of course.  You will need very little knowledge of
@@ -22,9 +24,8 @@ you must...
 3.  Edit include/options.h enum "WINE_LANGUAGE" to have a member called
     LANG_XX where XX is the new abbreviation.
 
-4.  Edit misc/ole2nls.c function "GetUserDefaultLCID" to contain an
-    extra case for your language.  The correct return values seem to
-    be a mystery, but don't worry.
+4.  Edit misc/ole2nls.c function "GetUserDefaultLCID" to contain a
+    case for your language by uncommenting the return value of it.
 
 5.  Edit resources/sysrec.c to include "sysres_XX.h" where XX is the
     abbreviation for your language.  (That file will be produced auto-
diff --git a/files/Makefile.in b/files/Makefile.in
index 4a2735efc2c..788ae6d5f21 100644
--- a/files/Makefile.in
+++ b/files/Makefile.in
@@ -1,6 +1,6 @@
 prefix     = @prefix@
 sysconfdir = @sysconfdir@
-DEFS       = -D__WINE__  -DNO_TRANSITION_TYPES -DETCDIR=\"$(sysconfdir)\"
+DEFS       = -D__WINE__ -DETCDIR=\"$(sysconfdir)\"
 TOPSRCDIR  = @top_srcdir@
 TOPOBJDIR  = ..
 SRCDIR     = @srcdir@
diff --git a/files/drive.c b/files/drive.c
index 8b04493ea11..dabebf891f7 100644
--- a/files/drive.c
+++ b/files/drive.c
@@ -582,7 +582,7 @@ BOOL32 GetDiskFreeSpace32W( LPCWSTR root, LPDWORD cluster_sectors,
  */
 UINT16 GetDriveType16( UINT16 drive )
 {
-    dprintf_dosfs( stddeb, "GetDriveType(%c:)\n", 'A' + drive );
+    dprintf_dosfs( stddeb, "GetDriveType16(%c:)\n", 'A' + drive );
     switch(DRIVE_GetType(drive))
     {
     case TYPE_FLOPPY:  return DRIVE_REMOVABLE;
diff --git a/files/file.c b/files/file.c
index 9e8a042aa7f..15b6b1a5c79 100644
--- a/files/file.c
+++ b/files/file.c
@@ -15,6 +15,7 @@
 #include <sys/errno.h>
 #include <sys/types.h>
 #include <sys/stat.h>
+#include <sys/mman.h>
 #include <time.h>
 #include <unistd.h>
 #include <utime.h>
@@ -33,15 +34,9 @@
 #include "stddebug.h"
 #include "debug.h"
 
-
-typedef struct
-{
-    K32OBJ    header;
-    int       unix_handle;
-    int       mode;
-    char     *unix_name;
-    DWORD     type;         /* Type for win32 apps */
-} DOS_FILE;
+#if defined(MAP_ANONYMOUS) && !defined(MAP_ANON)
+#define MAP_ANON MAP_ANONYMOUS
+#endif
 
 
 /***********************************************************************
@@ -49,10 +44,10 @@ typedef struct
  *
  * Allocate a file.
  */
-static HFILE32 FILE_Alloc( DOS_FILE **file )
+static HFILE32 FILE_Alloc( FILE_OBJECT **file )
 {
     HFILE32 handle;
-    *file = HeapAlloc( SystemHeap, 0, sizeof(DOS_FILE) );
+    *file = HeapAlloc( SystemHeap, 0, sizeof(FILE_OBJECT) );
     if (!*file)
     {
         DOS_ERROR( ER_TooManyOpenFiles, EC_ProgramError, SA_Abort, EL_Disk );
@@ -77,7 +72,7 @@ static HFILE32 FILE_Alloc( DOS_FILE **file )
  */
 void FILE_Destroy( K32OBJ *ptr )
 {
-    DOS_FILE *file = (DOS_FILE *)ptr;
+    FILE_OBJECT *file = (FILE_OBJECT *)ptr;
     assert( ptr->type == K32OBJ_FILE );
 
     if (file->unix_handle != -1) close( file->unix_handle );
@@ -93,9 +88,9 @@ void FILE_Destroy( K32OBJ *ptr )
  * Return the DOS file associated to a task file handle. FILE_ReleaseFile must
  * be called to release the file.
  */
-static DOS_FILE *FILE_GetFile( HFILE32 handle )
+static FILE_OBJECT *FILE_GetFile( HFILE32 handle )
 {
-    return (DOS_FILE *)PROCESS_GetObjPtr( handle, K32OBJ_FILE );
+    return (FILE_OBJECT *)PROCESS_GetObjPtr( handle, K32OBJ_FILE );
 }
 
 
@@ -104,7 +99,7 @@ static DOS_FILE *FILE_GetFile( HFILE32 handle )
  *
  * Release a DOS file obtained with FILE_GetFile.
  */
-static void FILE_ReleaseFile( DOS_FILE *file )
+static void FILE_ReleaseFile( FILE_OBJECT *file )
 {
     K32OBJ_DecCount( &file->header );
 }
@@ -117,7 +112,7 @@ static void FILE_ReleaseFile( DOS_FILE *file )
  */
 int FILE_GetUnixHandle( HFILE32 hFile )
 {
-    DOS_FILE *file;
+    FILE_OBJECT *file;
     int ret;
 
     if (!(file = FILE_GetFile( hFile ))) return -1;
@@ -183,7 +178,7 @@ void FILE_SetDosError(void)
 HFILE32 FILE_DupUnixHandle( int fd )
 {
     HFILE32 handle;
-    DOS_FILE *file;
+    FILE_OBJECT *file;
 
     if ((handle = FILE_Alloc( &file )) != INVALID_HANDLE_VALUE32)
     {
@@ -204,7 +199,7 @@ HFILE32 FILE_DupUnixHandle( int fd )
 static HFILE32 FILE_OpenUnixFile( const char *name, int mode )
 {
     HFILE32 handle;
-    DOS_FILE *file;
+    FILE_OBJECT *file;
     struct stat st;
 
     if ((handle = FILE_Alloc( &file )) == INVALID_HANDLE_VALUE32)
@@ -228,7 +223,7 @@ static HFILE32 FILE_OpenUnixFile( const char *name, int mode )
         return INVALID_HANDLE_VALUE32;
     }
 
-    /* File opened OK, now fill the DOS_FILE */
+    /* File opened OK, now fill the FILE_OBJECT */
 
     file->unix_name = HEAP_strdupA( SystemHeap, 0, name );
     return handle;
@@ -270,7 +265,7 @@ HFILE32 FILE_Open( LPCSTR path, INT32 mode )
 static HFILE32 FILE_Create( LPCSTR path, int mode, int unique )
 {
     HFILE32 handle;
-    DOS_FILE *file;
+    FILE_OBJECT *file;
     const char *unixName;
     DOS_FULL_NAME full_name;
 
@@ -300,7 +295,7 @@ static HFILE32 FILE_Create( LPCSTR path, int mode, int unique )
         return INVALID_HANDLE_VALUE32;
     } 
 
-    /* File created OK, now fill the DOS_FILE */
+    /* File created OK, now fill the FILE_OBJECT */
 
     file->unix_name = HEAP_strdupA( SystemHeap, 0, full_name.long_name );
     return handle;
@@ -358,7 +353,7 @@ BOOL32 FILE_Stat( LPCSTR unixName, BY_HANDLE_FILE_INFORMATION *info )
 DWORD GetFileInformationByHandle( HFILE32 hFile,
                                   BY_HANDLE_FILE_INFORMATION *info )
 {
-    DOS_FILE *file;
+    FILE_OBJECT *file;
     DWORD ret = 0;
     struct stat st;
 
@@ -458,7 +453,7 @@ INT32 CompareFileTime( LPFILETIME x, LPFILETIME y )
  */
 HFILE32 FILE_Dup( HFILE32 hFile )
 {
-    DOS_FILE *file;
+    FILE_OBJECT *file;
     HFILE32 handle;
 
     dprintf_file( stddeb, "FILE_Dup for handle %d\n", hFile );
@@ -477,7 +472,7 @@ HFILE32 FILE_Dup( HFILE32 hFile )
  */
 HFILE32 FILE_Dup2( HFILE32 hFile1, HFILE32 hFile2 )
 {
-    DOS_FILE *file;
+    FILE_OBJECT *file;
 
     dprintf_file( stddeb, "FILE_Dup2 for handle %d\n", hFile1 );
     if (!(file = FILE_GetFile( hFile1 ))) return HFILE_ERROR32;
@@ -543,7 +538,8 @@ UINT32 GetTempFileName32A( LPCSTR path, LPCSTR prefix, UINT32 unique,
             HFILE32 handle = FILE_Create( buffer, 0666, TRUE );
             if (handle != INVALID_HANDLE_VALUE32)
             {  /* We created it */
-                dprintf_file( stddeb, "GetTempFileName: created %s\n", buffer);
+                dprintf_file( stddeb, "GetTempFileName32A: created %s\n",
+			      buffer);
                 CloseHandle( handle );
                 break;
             }
@@ -566,7 +562,7 @@ UINT32 GetTempFileName32A( LPCSTR path, LPCSTR prefix, UINT32 unique,
                      "Please check your configuration file if this generates a failure.\n",
                      buffer);
     }
-    dprintf_file( stddeb, "GetTempFileName: returning %s\n", buffer );
+    dprintf_file( stddeb, "GetTempFileName32A: returning %s\n", buffer );
     return unique ? unique : num;
 }
 
@@ -758,7 +754,7 @@ LONG WIN16_hread( HFILE16 hFile, SEGPTR buffer, LONG count )
 {
     LONG maxlen;
 
-    dprintf_file( stddeb, "_hread16: %d %08lx %ld\n",
+    dprintf_file( stddeb, "WIN16_hread: %d %08lx %ld\n",
                   hFile, (DWORD)buffer, count );
 
     /* Some programs pass a count larger than the allocated buffer */
@@ -782,7 +778,7 @@ UINT16 WIN16_lread( HFILE16 hFile, SEGPTR buffer, UINT16 count )
  */
 UINT32 _lread32( HFILE32 hFile, LPVOID buffer, UINT32 count )
 {
-    DOS_FILE *file;
+    FILE_OBJECT *file;
     UINT32 result;
 
     dprintf_file( stddeb, "_lread32: %d %p %d\n", hFile, buffer, count );
@@ -832,7 +828,7 @@ HFILE32 _lcreat32( LPCSTR path, INT32 attr )
 HFILE32 _lcreat_uniq( LPCSTR path, INT32 attr )
 {
     int mode = (attr & 1) ? 0444 : 0666;
-    dprintf_file( stddeb, "_lcreat: %s %02x\n", path, attr );
+    dprintf_file( stddeb, "_lcreat_uniq: %s %02x\n", path, attr );
     return FILE_Create( path, mode, TRUE );
 }
 
@@ -843,7 +839,7 @@ HFILE32 _lcreat_uniq( LPCSTR path, INT32 attr )
 DWORD SetFilePointer( HFILE32 hFile, LONG distance, LONG *highword,
                       DWORD method )
 {
-    DOS_FILE *file;
+    FILE_OBJECT *file;
     int origin, result;
 
     if (highword && *highword)
@@ -858,9 +854,9 @@ DWORD SetFilePointer( HFILE32 hFile, LONG distance, LONG *highword,
     if (!(file = FILE_GetFile( hFile ))) return 0xffffffff;
     switch(method)
     {
-        case 1:  origin = SEEK_CUR; break;
-        case 2:  origin = SEEK_END; break;
-        default: origin = SEEK_SET; break;
+        case FILE_CURRENT: origin = SEEK_CUR; break;
+        case FILE_END:     origin = SEEK_END; break;
+        default:           origin = SEEK_SET; break;
     }
 
     if ((result = lseek( file->unix_handle, distance, origin )) == -1)
@@ -904,7 +900,7 @@ HFILE32 _lopen32( LPCSTR path, INT32 mode )
 {
     INT32 unixMode;
 
-    dprintf_file(stddeb, "_lopen('%s',%04x)\n", path, mode );
+    dprintf_file(stddeb, "_lopen32('%s',%04x)\n", path, mode );
 
     switch(mode & 3)
     {
@@ -972,10 +968,10 @@ LONG _hwrite16( HFILE16 hFile, LPCSTR buffer, LONG count )
  */
 LONG _hwrite32( HFILE32 hFile, LPCSTR buffer, LONG count )
 {
-    DOS_FILE *file;
+    FILE_OBJECT *file;
     LONG result;
 
-    dprintf_file( stddeb, "_hwrite: %d %p %ld\n", hFile, buffer, count );
+    dprintf_file( stddeb, "_hwrite32: %d %p %ld\n", hFile, buffer, count );
 
     if (!(file = FILE_GetFile( hFile ))) return HFILE_ERROR32;
     if (count == 0)  /* Expand or truncate at current position */
@@ -999,7 +995,7 @@ UINT16 SetHandleCount16( UINT16 count )
     PDB *pdb = (PDB *)GlobalLock16( hPDB );
     BYTE *files = PTR_SEG_TO_LIN( pdb->fileHandlesPtr );
 
-    dprintf_file( stddeb, "SetHandleCount(%d)\n", count );
+    dprintf_file( stddeb, "SetHandleCount16(%d)\n", count );
 
     if (count < 20) count = 20;  /* No point in going below 20 */
     else if (count > 254) count = 254;
@@ -1056,7 +1052,7 @@ UINT32 SetHandleCount32( UINT32 count )
  */
 BOOL32 FlushFileBuffers( HFILE32 hFile )
 {
-    DOS_FILE *file;
+    FILE_OBJECT *file;
     BOOL32 ret;
 
     dprintf_file( stddeb, "FlushFileBuffers(%d)\n", hFile );
@@ -1077,7 +1073,7 @@ BOOL32 FlushFileBuffers( HFILE32 hFile )
  */
 BOOL32 SetEndOfFile( HFILE32 hFile )
 {
-    DOS_FILE *file;
+    FILE_OBJECT *file;
     BOOL32 ret = TRUE;
 
     dprintf_file( stddeb, "SetEndOfFile(%d)\n", hFile );
@@ -1146,7 +1142,7 @@ BOOL32 DeleteFile32W( LPCWSTR path )
  */
 BOOL32 FILE_SetFileType( HFILE32 hFile, DWORD type )
 {
-    DOS_FILE *file = FILE_GetFile( hFile );
+    FILE_OBJECT *file = FILE_GetFile( hFile );
     if (!file) return FALSE;
     file->type = type;
     FILE_ReleaseFile( file );
@@ -1154,12 +1150,49 @@ BOOL32 FILE_SetFileType( HFILE32 hFile, DWORD type )
 }
 
 
+/***********************************************************************
+ *           FILE_mmap
+ */
+LPVOID FILE_mmap( FILE_OBJECT *file, LPVOID start,
+                  DWORD size_high, DWORD size_low,
+                  DWORD offset_high, DWORD offset_low,
+                  int prot, int flags )
+{
+    int fd = -1;
+
+    if (size_high || offset_high)
+        fprintf( stderr, "FILE_mmap: offsets larger than 4Gb not supported\n");
+
+    if (!file)
+    {
+#ifdef MAP_ANON
+        flags |= MAP_ANON;
+#else
+        static int fdzero = -1;
+
+        if (fdzero == -1)
+        {
+            if ((fdzero = open( "/dev/zero", O_RDONLY )) == -1)
+            {
+                perror( "/dev/zero: open" );
+                exit(1);
+            }
+        }
+        fd = fdzero;
+#endif  /* MAP_ANON */
+    }
+    else fd = file->unix_handle;
+
+    return mmap( start, size_low, prot, flags, fd, offset_low );
+}
+
+
 /***********************************************************************
  *           GetFileType   (KERNEL32.222)
  */
 DWORD GetFileType( HFILE32 hFile )
 {
-    DOS_FILE *file = FILE_GetFile(hFile);
+    FILE_OBJECT *file = FILE_GetFile(hFile);
     if (!file) return FILE_TYPE_UNKNOWN; /* FIXME: correct? */
     FILE_ReleaseFile( file );
     return file->type;
@@ -1267,7 +1300,7 @@ BOOL32 SetFileTime( HFILE32 hFile,
                     const FILETIME *lpLastAccessTime,
                     const FILETIME *lpLastWriteTime )
 {
-    DOS_FILE *file = FILE_GetFile(hFile);
+    FILE_OBJECT *file = FILE_GetFile(hFile);
     struct utimbuf utimbuf;
     
     if (!file) return FILE_TYPE_UNKNOWN; /* FIXME: correct? */
diff --git a/graphics/Makefile.in b/graphics/Makefile.in
index 53395963c69..ddb1129dd94 100644
--- a/graphics/Makefile.in
+++ b/graphics/Makefile.in
@@ -1,4 +1,4 @@
-DEFS      = -D__WINE__ -DNO_TRANSITION_TYPES
+DEFS      = -D__WINE__
 TOPSRCDIR = @top_srcdir@
 TOPOBJDIR = ..
 SRCDIR    = @srcdir@
diff --git a/graphics/metafiledrv/Makefile.in b/graphics/metafiledrv/Makefile.in
index ff538f29f1e..b0cd835bd98 100644
--- a/graphics/metafiledrv/Makefile.in
+++ b/graphics/metafiledrv/Makefile.in
@@ -1,4 +1,4 @@
-DEFS      = -D__WINE__ -DNO_TRANSITION_TYPES
+DEFS      = -D__WINE__
 TOPSRCDIR = @top_srcdir@
 TOPOBJDIR = ../..
 SRCDIR    = @srcdir@
diff --git a/graphics/win16drv/Makefile.in b/graphics/win16drv/Makefile.in
index ad71b99d283..0c408ad0fa2 100644
--- a/graphics/win16drv/Makefile.in
+++ b/graphics/win16drv/Makefile.in
@@ -1,4 +1,4 @@
-DEFS      = -D__WINE__ -DNO_TRANSITION_TYPES
+DEFS      = -D__WINE__
 TOPSRCDIR = @top_srcdir@
 TOPOBJDIR = ../..
 SRCDIR    = @srcdir@
@@ -8,6 +8,7 @@ MODULE    = win16drv
 C_SRCS = \
 	font.c \
 	init.c \
+	objects.c \
 	text.c
 
 all: $(MODULE).o
diff --git a/graphics/win16drv/font.c b/graphics/win16drv/font.c
index 6edc8dfa8c5..678ed9022fe 100644
--- a/graphics/win16drv/font.c
+++ b/graphics/win16drv/font.c
@@ -8,6 +8,7 @@
 #include "windows.h"
 #include "win16drv.h"
 #include "gdi.h"
+#include "font.h"
 
 
 /***********************************************************************
@@ -71,3 +72,10 @@ BOOL32 WIN16DRV_GetTextMetrics( DC *dc, TEXTMETRIC32A *metrics )
 
     return TRUE;
 }
+
+HFONT32 WIN16DRV_FONT_SelectObject( DC * dc, HFONT32 hfont, FONTOBJ * font)
+{
+    /* TTD */
+    printf("In WIN16DRV_FONT_SelectObject\n");
+    return GetStockObject32(SYSTEM_FIXED_FONT);
+}
diff --git a/graphics/win16drv/init.c b/graphics/win16drv/init.c
index 3a9b7420a79..fec0eb017e1 100644
--- a/graphics/win16drv/init.c
+++ b/graphics/win16drv/init.c
@@ -75,7 +75,7 @@ static const DC_FUNCTIONS WIN16DRV_Funcs =
     NULL,                            /* pScaleViewportExtEx */
     NULL,                            /* pScaleWindowExtEx */
     NULL,                            /* pSelectClipRgn */
-    NULL,                            /* pSelectObject */
+    WIN16DRV_SelectObject,           /* pSelectObject */
     NULL,                            /* pSelectPalette */
     NULL,                            /* pSetBkColor */
     NULL,                            /* pSetBkMode */
@@ -690,8 +690,7 @@ BOOL32 WIN16DRV_CreateDC( DC *dc, LPCSTR driver, LPCSTR device, LPCSTR output,
     /* passing information on the available fonts */
     if (pLPD->paPrinterFonts == NULL)
     {
-	pfnCallback = GetProcAddress16(GetModuleHandle("GDI"), 
-				     (MAKEINTRESOURCE(158)));
+	pfnCallback = MODULE_GetEntryPoint( GetModuleHandle16("GDI"), 158 );
         
 	if (pfnCallback != NULL)
 	{
@@ -813,7 +812,7 @@ DWORD PRTDRV_ExtTextOut(LPPDEVICE lpDestDev, WORD wDestXOrg, WORD wDestYOrg,
     if ((pLPD = FindPrinterDriverFromPDEVICE(lpDestDev)) != NULL)
     {
 	LONG lP1, lP4, lP5, lP7, lP8, lP9, lP10, lP11;  
-	WORD wP2, wP3, wP12;
+	WORD wP2, wP3, wP6, wP12;
         INT16 iP6;
 
 	SEGPTR SegPtr = pLPD->ThunkBufSegPtr;
@@ -945,7 +944,7 @@ int
 ExtractPQ(HPQ hPQ) 
 { 
     struct hpq *queue, *prev, *current, *currentPrev;
-    int key = 0, tag = -1;
+    int key, tag = -1;
     currentPrev = prev = NULL;
     queue = current = hpqueue;
     if (current)
@@ -1146,7 +1145,7 @@ int WriteDialog(HANDLE16 hJob, LPSTR lpMsg, WORD cchMsg)
 
     dprintf_win16drv(stddeb, "WriteDialog: %04x %04x \"%s\"\n", hJob,  cchMsg, lpMsg);
 
-    nRet = MessageBox16( 0, lpMsg, "Printing Error", MB_OKCANCEL);
+    nRet = MessageBox16(NULL, lpMsg, "Printing Error", MB_OKCANCEL);
     return nRet;
 }
 
diff --git a/graphics/win16drv/objects.c b/graphics/win16drv/objects.c
new file mode 100644
index 00000000000..c865790152d
--- /dev/null
+++ b/graphics/win16drv/objects.c
@@ -0,0 +1,53 @@
+/*
+ * GDI objects
+ *
+ * Copyright 1993 Alexandre Julliard
+ */
+
+#include <stdlib.h>
+#include <stdio.h>
+#include "bitmap.h"
+#include "brush.h"
+#include "font.h"
+#include "pen.h"
+#include "stddebug.h"
+#include "debug.h"
+
+
+extern HBITMAP32 WIN16DRV_BITMAP_SelectObject( DC * dc, HBITMAP32 hbitmap,
+                                             BITMAPOBJ * bmp );
+extern HBRUSH32 WIN16DRV_BRUSH_SelectObject( DC * dc, HBRUSH32 hbrush,
+                                           BRUSHOBJ * brush );
+extern HFONT32 WIN16DRV_FONT_SelectObject( DC * dc, HFONT32 hfont,
+                                         FONTOBJ * font );
+extern HPEN32 WIN16DRV_PEN_SelectObject( DC * dc, HPEN32 hpen, PENOBJ * pen );
+
+
+/***********************************************************************
+ *           X11DRV_SelectObject
+ */
+HGDIOBJ32 WIN16DRV_SelectObject( DC *dc, HGDIOBJ32 handle )
+{
+    GDIOBJHDR *ptr = GDI_GetObjPtr( handle, MAGIC_DONTCARE );
+
+    if (!ptr) return 0;
+    dprintf_gdi(stddeb, "SelectObject: hdc=%04x %04x\n", dc->hSelf, handle );
+    
+    switch(ptr->wMagic)
+    {
+    case PEN_MAGIC:
+        fprintf(stderr, "WIN16DRV_SelectObject for PEN not implemented\n");
+        return 0;
+    case BRUSH_MAGIC:
+        fprintf(stderr, "WIN16DRV_SelectObject for BRUSH not implemented\n");
+        return 0;
+    case BITMAP_MAGIC:
+        fprintf(stderr, "WIN16DRV_SelectObject for BITMAP not implemented\n");
+        return 0;
+    case FONT_MAGIC:
+        return WIN16DRV_FONT_SelectObject( dc, handle, (FONTOBJ *)ptr );	  
+    case REGION_MAGIC:
+	  return (HGDIOBJ16)SelectClipRgn16( dc->hSelf, handle );
+    }
+    return 0;
+}
diff --git a/graphics/x11drv/Makefile.in b/graphics/x11drv/Makefile.in
index 9001dad5229..daa860c0168 100644
--- a/graphics/x11drv/Makefile.in
+++ b/graphics/x11drv/Makefile.in
@@ -1,4 +1,4 @@
-DEFS      = -D__WINE__ -DNO_TRANSITION_TYPES
+DEFS      = -D__WINE__
 TOPSRCDIR = @top_srcdir@
 TOPOBJDIR = ../..
 SRCDIR    = @srcdir@
diff --git a/graphics/x11drv/bitmap.c b/graphics/x11drv/bitmap.c
index d0cc8255e78..b302248d3c4 100644
--- a/graphics/x11drv/bitmap.c
+++ b/graphics/x11drv/bitmap.c
@@ -56,7 +56,8 @@ HBITMAP32 X11DRV_BITMAP_SelectObject( DC * dc, HBITMAP32 hbitmap,
     if (!(dc->w.flags & DC_MEMORY)) return 0;
 
     if (dc->w.hVisRgn)
-       SetRectRgn(dc->w.hVisRgn, 0, 0, bmp->bitmap.bmWidth, bmp->bitmap.bmHeight );
+       SetRectRgn32( dc->w.hVisRgn, 0, 0,
+                     bmp->bitmap.bmWidth, bmp->bitmap.bmHeight );
     else
     { 
        hrgn = CreateRectRgn32(0, 0, bmp->bitmap.bmWidth, bmp->bitmap.bmHeight);
diff --git a/if1632/Makefile.in b/if1632/Makefile.in
index 3f16ec4abec..140ca7548a4 100644
--- a/if1632/Makefile.in
+++ b/if1632/Makefile.in
@@ -1,4 +1,4 @@
-DEFS      = -D__WINE__ -DNO_TRANSITION_TYPES
+DEFS      = -D__WINE__
 TOPSRCDIR = @top_srcdir@
 TOPOBJDIR = ..
 SRCDIR    = @srcdir@
diff --git a/if1632/builtin.c b/if1632/builtin.c
index 3a4386cc6d3..44b86eee1f0 100644
--- a/if1632/builtin.c
+++ b/if1632/builtin.c
@@ -187,14 +187,14 @@ BOOL16 BUILTIN_Init(void)
 
     /* Set the USER and GDI heap selectors */
 
-    pModule      = MODULE_GetPtr( GetModuleHandle( "USER" ));
+    pModule      = MODULE_GetPtr( GetModuleHandle16( "USER" ));
     USER_HeapSel = (NE_SEG_TABLE( pModule ) + pModule->dgroup - 1)->selector;
-    pModule      = MODULE_GetPtr( GetModuleHandle( "GDI" ));
+    pModule      = MODULE_GetPtr( GetModuleHandle16( "GDI" ));
     GDI_HeapSel  = (NE_SEG_TABLE( pModule ) + pModule->dgroup - 1)->selector;
 
     /* Initialize KERNEL.178 (__WINFLAGS) with the correct flags value */
 
-    hModule = GetModuleHandle( "KERNEL" );
+    hModule = GetModuleHandle16( "KERNEL" );
     MODULE_SetEntryPoint( hModule, 178, GetWinFlags() );
 
     /* Initialize the real-mode selector entry points */
@@ -203,7 +203,7 @@ BOOL16 BUILTIN_Init(void)
 
     /* Set interrupt vectors from entry points in WPROCS.DLL */
 
-    hModule = GetModuleHandle( "WPROCS" );
+    hModule = GetModuleHandle16( "WPROCS" );
     for (vector = 0; vector < 256; vector++)
     {
         FARPROC16 proc = MODULE_GetEntryPoint( hModule,
diff --git a/if1632/gdi.spec b/if1632/gdi.spec
index af8dc31b3b2..71da3bca8e9 100644
--- a/if1632/gdi.spec
+++ b/if1632/gdi.spec
@@ -2,7 +2,7 @@ name	gdi
 type	win16
 heap	65488  # 65536 - 16 (instance data) - 32 (stock objects)
 
-1   pascal SetBkColor(word long) SetBkColor
+1   pascal   SetBkColor(word long) SetBkColor16
 2   pascal16 SetBkMode(word word) SetBkMode16
 3   pascal16 SetMapMode(word word) SetMapMode16
 4   pascal16 SetROP2(word word) SetROP216
@@ -10,7 +10,7 @@ heap	65488  # 65536 - 16 (instance data) - 32 (stock objects)
 6   pascal16 SetPolyFillMode(word word) SetPolyFillMode16
 7   pascal16 SetStretchBltMode(word word) SetStretchBltMode16
 8   pascal16 SetTextCharacterExtra(word s_word) SetTextCharacterExtra16
-9   pascal SetTextColor(word long) SetTextColor
+9   pascal   SetTextColor(word long) SetTextColor16
 10  pascal16 SetTextJustification(word s_word s_word) SetTextJustification16
 11  pascal SetWindowOrg(word s_word s_word) SetWindowOrg
 12  pascal SetWindowExt(word s_word s_word) SetWindowExt
@@ -54,10 +54,10 @@ heap	65488  # 65536 - 16 (instance data) - 32 (stock objects)
 45  pascal16 SelectObject(word word) SelectObject16
 #46  pascal __GP?
 47  pascal16 CombineRgn(word word word s_word) CombineRgn16
-48  pascal16 CreateBitmap(word word word word ptr) CreateBitmap
+48  pascal16 CreateBitmap(word word word word ptr) CreateBitmap16
 49  pascal16 CreateBitmapIndirect(ptr) CreateBitmapIndirect16
 50  pascal16 CreateBrushIndirect(ptr) CreateBrushIndirect16
-51  pascal16 CreateCompatibleBitmap(word word word) CreateCompatibleBitmap
+51  pascal16 CreateCompatibleBitmap(word word word) CreateCompatibleBitmap16
 52  pascal16 CreateCompatibleDC(word) CreateCompatibleDC16
 53  pascal16 CreateDC(ptr ptr ptr ptr) CreateDC16
 54  pascal16 CreateEllipticRgn(s_word s_word s_word s_word) CreateEllipticRgn16
@@ -80,7 +80,7 @@ heap	65488  # 65536 - 16 (instance data) - 32 (stock objects)
 71  pascal16 EnumObjects(word word segptr long) THUNK_EnumObjects16
 72  pascal16 EqualRgn(word word) EqualRgn16
 73  pascal16 ExcludeVisRect(word s_word s_word s_word s_word) ExcludeVisRect
-74  pascal GetBitmapBits(word long ptr) GetBitmapBits
+74  pascal GetBitmapBits(word long ptr) GetBitmapBits16
 75  pascal   GetBkColor(word) GetBkColor16
 76  pascal16 GetBkMode(word) GetBkMode16
 77  pascal16 GetClipBox(word ptr) GetClipBox16
@@ -113,9 +113,9 @@ heap	65488  # 65536 - 16 (instance data) - 32 (stock objects)
 103 pascal16 PtVisible(word s_word s_word) PtVisible16
 104 pascal16 RectVisibleOld(word ptr) RectVisible16
 105 pascal16 SelectVisRgn(word word) SelectVisRgn
-106 pascal SetBitmapBits(word long ptr) SetBitmapBits
+106 pascal SetBitmapBits(word long ptr) SetBitmapBits16
 117 pascal SetDCOrg(word s_word s_word) SetDCOrg
-119 pascal16 AddFontResource(ptr) AddFontResource
+119 pascal16 AddFontResource(ptr) AddFontResource16
 #121 pascal Death
 #122 pascal ReSurRection
 123 pascal16 PlayMetaFile(word word) PlayMetaFile16
@@ -131,7 +131,7 @@ heap	65488  # 65536 - 16 (instance data) - 32 (stock objects)
 133 pascal16 GetEnvironment(ptr ptr word) GetEnvironment
 134 pascal16 GetRgnBox(word ptr) GetRgnBox16
 #135 pascal ScanLr
-136 pascal16 RemoveFontResource(ptr) RemoveFontResource
+136 pascal16 RemoveFontResource(ptr) RemoveFontResource16
 148 pascal SetBrushOrg(word s_word s_word) SetBrushOrg
 149 pascal GetBrushOrg(word) GetBrushOrg
 150 pascal16 UnrealizeObject(word) UnrealizeObject16
@@ -139,7 +139,7 @@ heap	65488  # 65536 - 16 (instance data) - 32 (stock objects)
 153 pascal16 CreateIC(ptr ptr ptr ptr) CreateIC16
 154 pascal   GetNearestColor(word long) GetNearestColor16
 155 stub QueryAbort
-156 pascal16 CreateDiscardableBitmap(word word word) CreateDiscardableBitmap
+156 pascal16 CreateDiscardableBitmap(word word word) CreateDiscardableBitmap16
 158 pascal16 EnumCallback(ptr ptr word long) WineEnumDFontCallback
 159 pascal16 GetMetaFileBits(word) GetMetaFileBits
 160 pascal16 SetMetaFileBits(word) SetMetaFileBits
@@ -148,10 +148,10 @@ heap	65488  # 65536 - 16 (instance data) - 32 (stock objects)
 163 pascal   SetBitmapDimension(word s_word s_word) SetBitmapDimension
 169 stub IsDCDirty
 170 stub SetDCStatus
-172 pascal16 SetRectRgn(word s_word s_word s_word s_word) SetRectRgn
+172 pascal16 SetRectRgn(word s_word s_word s_word s_word) SetRectRgn16
 173 pascal16 GetClipRgn(word) GetClipRgn16
 175 pascal16 EnumMetaFile(word word segptr long) THUNK_EnumMetaFile16
-176 pascal16 PlayMetaFileRecord(word ptr ptr word) PlayMetaFileRecord
+176 pascal16 PlayMetaFileRecord(word ptr ptr word) PlayMetaFileRecord16
 179 pascal16 GetDCState(word) GetDCState
 180 pascal16 SetDCState(word word) SetDCState
 181 pascal16 RectInRegionOld(word ptr) RectInRegion16
@@ -218,17 +218,17 @@ heap	65488  # 65536 - 16 (instance data) - 32 (stock objects)
 306 stub ENGINEMAKEFONTDIR
 307 pascal16 GetCharABCWidths(word word word ptr) GetCharABCWidths16
 308 stub GetOutLineTextMetrics
-309 pascal   GetGlyphOutLine(word word word ptr long ptr ptr) GetGlyphOutLine
-310 pascal16 CreateScalableFontResource(word ptr ptr ptr) CreateScalableFontResource
+309 pascal   GetGlyphOutline(word word word ptr long ptr ptr) GetGlyphOutline16
+310 pascal16 CreateScalableFontResource(word ptr ptr ptr) CreateScalableFontResource16
 311 stub GetFontData
 312 stub ConvertOutLineFontFile
-313 pascal16 GetRasterizerCaps(ptr word) GetRasterizerCaps
+313 pascal16 GetRasterizerCaps(ptr word) GetRasterizerCaps16
 314 stub EngineExtTextOut
 315 stub EngineRealizeFontExt
 316 stub EngineGetCharWidthStr
 317 stub EngineGetGlyphBmpExt
 330 pascal16 EnumFontFamilies(word ptr segptr long) THUNK_EnumFontFamilies16
-332 pascal16 GetKerningPairs(word word ptr) GetKerningPairs
+332 pascal16 GetKerningPairs(word word ptr) GetKerningPairs16
 345 pascal16 GetTextAlign(word) GetTextAlign16
 346 pascal16 SetTextAlign(word word) SetTextAlign16
 348 pascal16 Chord(word s_word s_word s_word s_word s_word s_word
@@ -246,7 +246,7 @@ heap	65488  # 65536 - 16 (instance data) - 32 (stock objects)
 363 pascal16 GetPaletteEntries(word word word ptr) GetPaletteEntries16
 364 pascal16 SetPaletteEntries(word word word ptr) SetPaletteEntries16
 365 pascal16 RealizeDefaultPalette(word) RealizeDefaultPalette
-366 pascal16 UpdateColors(word) UpdateColors
+366 pascal16 UpdateColors(word) UpdateColors16
 367 pascal16 AnimatePalette(word word word ptr) AnimatePalette16
 368 pascal16 ResizePalette(word word) ResizePalette16
 370 pascal16 GetNearestPaletteIndex(word long) GetNearestPaletteIndex16
diff --git a/if1632/gdi32.spec b/if1632/gdi32.spec
index dd6560313b1..90b502c5380 100644
--- a/if1632/gdi32.spec
+++ b/if1632/gdi32.spec
@@ -4,9 +4,9 @@ base	1
 
 0000 stub AbortDoc
 0001 stub AbortPath
-0002 stdcall AddFontResourceA(ptr) AddFontResource
+0002 stdcall AddFontResourceA(ptr) AddFontResource32A
 0003 stub AddFontResourceTracking
-0004 stub AddFontResourceW
+0004 stdcall AddFontResourceW(ptr) AddFontResource32W
 0005 stub AngleArc
 0006 stdcall AnimatePalette(long long long ptr) AnimatePalette32
 0007 stdcall Arc(long long long long long long long long long) Arc32
@@ -27,12 +27,12 @@ base	1
 0022 stub CopyEnhMetaFileW
 0023 stdcall CopyMetaFileA(long ptr) CopyMetaFile32A
 0024 stdcall CopyMetaFileW(long ptr) CopyMetaFile32W
-0025 stdcall CreateBitmap(long long long long ptr) CreateBitmap
+0025 stdcall CreateBitmap(long long long long ptr) CreateBitmap32
 0026 stdcall CreateBitmapIndirect(ptr) CreateBitmapIndirect32
 0027 stdcall CreateBrushIndirect(ptr) CreateBrushIndirect32
 0028 stub CreateColorSpaceA
 0029 stub CreateColorSpaceW
-0030 stdcall CreateCompatibleBitmap(long long long) CreateCompatibleBitmap
+0030 stdcall CreateCompatibleBitmap(long long long) CreateCompatibleBitmap32
 0031 stdcall CreateCompatibleDC(long) CreateCompatibleDC32
 0032 stdcall CreateDCA(ptr ptr ptr ptr) CreateDC32A
 0033 stdcall CreateDCW(ptr ptr ptr ptr) CreateDC32W
@@ -40,7 +40,7 @@ base	1
 0035 stub CreateDIBPatternBrushPt
 0036 stub CreateDIBSection
 0037 stdcall CreateDIBitmap(long ptr long ptr ptr long) CreateDIBitmap32
-0038 stdcall CreateDiscardableBitmap(long long long) CreateDiscardableBitmap
+0038 stdcall CreateDiscardableBitmap(long long long) CreateDiscardableBitmap32
 0039 stdcall CreateEllipticRgn(long long long long) CreateEllipticRgn32
 0040 stdcall CreateEllipticRgnIndirect(ptr) CreateEllipticRgnIndirect32
 0041 stub CreateEnhMetaFileA
@@ -67,8 +67,8 @@ base	1
 0060 stdcall CreateRectRgnIndirect(ptr) CreateRectRgnIndirect32
 0061 stdcall CreateRoundRectRgn(long long long long long long)
              CreateRoundRectRgn32
-0062 stub CreateScalableFontResourceA
-0063 stub CreateScalableFontResourceW
+0062 stdcall CreateScalableFontResourceA(long ptr ptr ptr) CreateScalableFontResource32A
+0063 stdcall CreateScalableFontResourceW(long ptr ptr ptr) CreateScalableFontResource32W
 0064 stdcall CreateSolidBrush(long) CreateSolidBrush32
 0065 stdcall DPtoLP(long ptr long) DPtoLP32
 0066 stub DeleteColorSpace
@@ -148,7 +148,7 @@ base	1
 0140 stub GdiSetServerAttr
 0141 stub GetArcDirection
 0142 stub GetAspectRatioFilterEx
-0143 stdcall GetBitmapBits(long long ptr) GetBitmapBits
+0143 stdcall GetBitmapBits(long long ptr) GetBitmapBits32
 0144 stdcall GetBitmapDimensionEx(long ptr) GetBitmapDimensionEx32
 0145 stdcall GetBkColor(long) GetBkColor32
 0146 stdcall GetBkMode(long) GetBkMode32
@@ -191,14 +191,14 @@ base	1
 0183 stub GetFontResourceInfo
 0184 stub GetFontResourceInfoW
 0185 stub GetGlyphOutline
-0186 stub GetGlyphOutlineA
-0187 stub GetGlyphOutlineW
+0186 stdcall GetGlyphOutlineA(long long long ptr long ptr ptr) GetGlyphOutline32A
+0187 stdcall GetGlyphOutlineW(long long long ptr long ptr ptr) GetGlyphOutline32W
 0188 stub GetGraphicsMode
 0189 stub GetICMProfileA
 0190 stub GetICMProfileW
 0191 stub GetKerningPairs
-0192 stub GetKerningPairsA
-0193 stub GetKerningPairsW
+0192 stdcall GetKerningPairsA(long long ptr) GetKerningPairs32A
+0193 stdcall GetKerningPairsW(long long ptr) GetKerningPairs32W
 0194 stub GetLogColorSpaceA
 0195 stub GetLogColorSpaceW
 0196 stdcall GetMapMode(long) GetMapMode32
@@ -221,7 +221,7 @@ base	1
 0213 stdcall GetPolyFillMode(long) GetPolyFillMode32
 0214 stdcall GetROP2(long) GetROP232
 0215 stub GetRandomRgn
-0216 stub GetRasterizerCaps
+0216 stdcall GetRasterizerCaps(ptr long) GetRasterizerCaps32
 0217 stub GetRegionData
 0218 stdcall GetRelAbs(long) GetRelAbs32
 0219 stdcall GetRgnBox(long ptr) GetRgnBox32
@@ -289,9 +289,9 @@ base	1
 0281 stdcall RectInRegion(long ptr) RectInRegion32
 0282 stdcall RectVisible(long ptr) RectVisible32
 0283 stdcall Rectangle(long long long long long) Rectangle32
-0284 stub RemoveFontResourceA
+0284 stdcall RemoveFontResourceA(ptr) RemoveFontResource32A
 0285 stub RemoveFontResourceTracking
-0286 stub RemoveFontResourceW
+0286 stdcall RemoveFontResourceW(ptr) RemoveFontResource32W
 0287 stdcall ResetDCA(long ptr) ResetDC32A
 0288 stdcall ResetDCW(long ptr) ResetDC32W
 0289 stdcall ResizePalette(long long) ResizePalette32
@@ -308,9 +308,9 @@ base	1
 0300 stdcall SelectPalette(long long long) SelectPalette32
 0301 stub SetAbortProc
 0302 stub SetArcDirection
-0303 stdcall SetBitmapBits(long long ptr) SetBitmapBits
+0303 stdcall SetBitmapBits(long long ptr) SetBitmapBits32
 0304 stdcall SetBitmapDimensionEx(long long long ptr) SetBitmapDimensionEx32
-0305 stdcall SetBkColor(long long) SetBkColor
+0305 stdcall SetBkColor(long long) SetBkColor32
 0306 stdcall SetBkMode(long long) SetBkMode32
 0307 stub SetBoundsRect
 0308 stdcall SetBrushOrgEx(long long long ptr) SetBrushOrgEx
@@ -338,13 +338,13 @@ base	1
 0329 stub SetPixelV
 0330 stdcall SetPolyFillMode(long long) SetPolyFillMode32
 0331 stdcall SetROP2(long long) SetROP232
-0332 stdcall SetRectRgn(long long long long long) SetRectRgn
+0332 stdcall SetRectRgn(long long long long long) SetRectRgn32
 0333 stdcall SetRelAbs(long long) SetRelAbs32
 0334 stdcall SetStretchBltMode(long long) SetStretchBltMode32
 0335 stdcall SetSystemPaletteUse(long long) SetSystemPaletteUse32
 0336 stdcall SetTextAlign(long long) SetTextAlign32
 0337 stdcall SetTextCharacterExtra(long long) SetTextCharacterExtra32
-0338 stdcall SetTextColor(long long) SetTextColor
+0338 stdcall SetTextColor(long long) SetTextColor32
 0339 stdcall SetTextJustification(long long long) SetTextJustification32
 0340 stdcall SetViewportExtEx(long long long ptr) SetViewportExtEx32
 0341 stdcall SetViewportOrgEx(long long long ptr) SetViewportOrgEx32
@@ -367,7 +367,7 @@ base	1
 0356 stdcall TextOutW(long long long ptr long) TextOut32W
 0357 stub UnloadNetworkFonts
 0358 stdcall UnrealizeObject(long) UnrealizeObject32
-0359 stub UpdateColors
+0359 stdcall UpdateColors(long) UpdateColors32
 0360 stub WidenPath
 0361 stub pstackConnect
 #late additions
diff --git a/if1632/kernel.spec b/if1632/kernel.spec
index 75faa9b8271..422e68e6889 100644
--- a/if1632/kernel.spec
+++ b/if1632/kernel.spec
@@ -41,7 +41,7 @@ type	win16
 38  pascal   SetTaskSignalProc(word segptr) SetTaskSignalProc
 41  return EnableDos 0 0
 42  return DisableDos 0 0
-45  pascal16 LoadModule(ptr ptr) LoadModule
+45  pascal16 LoadModule(ptr ptr) LoadModule16
 46  pascal16 FreeModule(word) FreeModule16
 47  pascal16 GetModuleHandle(segptr) WIN16_GetModuleHandle
 48  pascal16 GetModuleUsage(word) GetModuleUsage
@@ -92,7 +92,7 @@ type	win16
 93  pascal16 GetCodeHandle(segptr) GetCodeHandle
 94  stub DefineHandleTable
 95  pascal16 LoadLibrary(ptr) LoadLibrary16
-96  pascal16 FreeLibrary(word) FreeLibrary
+96  pascal16 FreeLibrary(word) FreeLibrary16
 97  pascal16 GetTempFileName(byte ptr word ptr) GetTempFileName16
 98  return GetLastDiskChange 0 0
 99  stub GetLPErrMode
@@ -111,7 +111,7 @@ type	win16
 112 pascal16 GlobalUnWire(word) GlobalUnWire16
 113 equate __AHSHIFT 3
 114 equate __AHINCR 8
-115 pascal16 OutputDebugString(ptr) OutputDebugString
+115 pascal16 OutputDebugString(ptr) OutputDebugString16
 116 stub InitLib
 117 pascal16 OldYield() OldYield
 118 register GetTaskQueueDS() GetTaskQueueDS
@@ -261,7 +261,7 @@ type	win16
 #351 BUNNY_351
 352 pascal   lstrcatn(segptr segptr word) lstrcatn16
 353 pascal   lstrcpyn(segptr segptr word) lstrcpyn16
-354 pascal   GetAppCompatFlags(word) GetAppCompatFlags
+354 pascal   GetAppCompatFlags(word) GetAppCompatFlags16
 355 pascal16 GetWinDebugInfo(ptr word) GetWinDebugInfo
 356 pascal16 SetWinDebugInfo(ptr) SetWinDebugInfo
 360 stub OpenFileEx
diff --git a/if1632/kernel32.spec b/if1632/kernel32.spec
index 2c51b8fd97c..f8281ee5ab1 100644
--- a/if1632/kernel32.spec
+++ b/if1632/kernel32.spec
@@ -278,10 +278,10 @@ base	1
 0273 stdcall GetStartupInfoA(ptr) GetStartupInfo32A
 0274 stdcall GetStartupInfoW(ptr) GetStartupInfo32W
 0275 stdcall GetStdHandle(long)	GetStdHandle
-0276 stub GetStringTypeA
-0277 stub GetStringTypeExA
-0278 stub GetStringTypeExW
-0279 stub GetStringTypeW
+0276 stdcall GetStringTypeA(long long ptr long ptr) GetStringType32A
+0277 stdcall GetStringTypeExA(long long ptr long ptr) GetStringTypeEx32A
+0278 stdcall GetStringTypeExW(long long ptr long ptr) GetStringTypeEx32W
+0279 stdcall GetStringTypeW(long ptr long ptr) GetStringType32W
 0280 stdcall GetSystemDefaultLCID() GetSystemDefaultLCID
 0281 stdcall GetSystemDefaultLangID() GetSystemDefaultLangID
 0282 stdcall GetSystemDirectoryA(ptr long) GetSystemDirectory32A
@@ -353,13 +353,13 @@ base	1
 0348 stdcall InterlockedExchange(ptr) InterlockedExchange
 0349 stdcall InterlockedIncrement(ptr) InterlockedIncrement
 0350 stub InvalidateConsoleDIBits
-0351 stdcall IsBadCodePtr(ptr long)	WIN32_IsBadCodePtr
-0352 stub IsBadHugeReadPtr
-0353 stub IsBadHugeWritePtr
-0354 stdcall IsBadReadPtr(ptr long)	WIN32_IsBadReadPtr
-0355 stub IsBadStringPtrA
-0356 stub IsBadStringPtrW
-0357 stdcall IsBadWritePtr(ptr long)	WIN32_IsBadWritePtr
+0351 stdcall IsBadCodePtr(ptr long) IsBadCodePtr32
+0352 stdcall IsBadHugeReadPtr(ptr long) IsBadHugeReadPtr32
+0353 stdcall IsBadHugeWritePtr(ptr long) IsBadHugeWritePtr32
+0354 stdcall IsBadReadPtr(ptr long) IsBadReadPtr32
+0355 stdcall IsBadStringPtrA(ptr long) IsBadStringPtr32A
+0356 stdcall IsBadStringPtrW(ptr long) IsBadStringPtr32W
+0357 stdcall IsBadWritePtr(ptr long) IsBadWritePtr32
 0358 stdcall IsDBCSLeadByte(long) IsDBCSLeadByte32
 0359 stdcall IsDBCSLeadByteEx(long long) IsDBCSLeadByteEx
 0360 stub IsValidCodePage
@@ -388,7 +388,7 @@ base	1
 0383 stub LockFileEx
 0384 stdcall LockResource(long) LockResource32
 0385 stdcall MapViewOfFile(long long long long long) MapViewOfFile
-0386 stdcall MapViewOfFileEx(long long long long long long) MapViewOfFileEx
+0386 stdcall MapViewOfFileEx(long long long long long ptr) MapViewOfFileEx
 0387 stdcall MoveFileA(ptr ptr) MoveFile32A
 0388 stub MoveFileExA
 0389 stub MoveFileExW
@@ -399,15 +399,15 @@ base	1
 0394 stub OpenEventA
 0395 stub OpenEventW
 0396 stdcall OpenFile(ptr ptr long) OpenFile32
-0397 stdcall OpenFileMappingA(long long ptr) OpenFileMapping
-0398 stub OpenFileMappingW
+0397 stdcall OpenFileMappingA(long long ptr) OpenFileMapping32A
+0398 stdcall OpenFileMappingW(long long ptr) OpenFileMapping32W
 0399 stub OpenMutexA
 0400 stub OpenMutexW
 0401 stub OpenProcess
 0402 stub OpenProfileUserMapping
 0403 stub OpenSemaphoreA
 0404 stub OpenSemaphoreW
-0405 stdcall OutputDebugStringA(ptr) OutputDebugString
+0405 stdcall OutputDebugStringA(ptr) OutputDebugString32A
 0406 stub OutputDebugStringW
 0407 stub PeekConsoleInputA
 0408 stub PeekConsoleInputW
@@ -550,15 +550,15 @@ base	1
 0545 stub VerLanguageNameA
 0546 stub VerLanguageNameW
 0547 stub VerifyConsoleIoHandle
-0548    stdcall VirtualAlloc(ptr long long long) VirtualAlloc
+0548 stdcall VirtualAlloc(ptr long long long) VirtualAlloc
 0549 stub VirtualBufferExceptionHandler
-0550    stdcall VirtualFree(ptr long long) VirtualFree
-0551 stub VirtualLock
+0550 stdcall VirtualFree(ptr long long) VirtualFree
+0551 stdcall VirtualLock(ptr long) VirtualLock
 0552 stdcall VirtualProtect(ptr long long ptr) VirtualProtect
-0553 stub VirtualProtectEx
+0553 stdcall VirtualProtectEx(long ptr long long ptr) VirtualProtectEx
 0554 stdcall VirtualQuery(ptr ptr long) VirtualQuery
-0555 stub VirtualQueryEx
-0556 stub VirtualUnlock
+0555 stdcall VirtualQueryEx(long ptr ptr long) VirtualQueryEx
+0556 stdcall VirtualUnlock(ptr long) VirtualUnlock
 0557 stub WaitCommEvent
 0558 stub WaitForDebugEvent
 0559 stub WaitForMultipleObjects
@@ -659,3 +659,24 @@ base	1
 0653 stub RegisterServiceProcess
 0654 stub QueueUserAPC
 0655 stub ConvertToGlobalHandle
+0656 stub SMapLS_IP_EBP_8
+0657 stub SMapLS_IP_EBP_16
+0658 stub SMapLS_IP_EBP_20
+0659 stub SUnMapLS_IP_EBP_8
+0660 stub SUnMapLS_IP_EBP_16
+0661 stub SUnMapLS_IP_EBP_20
+0662 stub MapSL
+0663 stub K32Thk1632Epilog
+0664 stub K32Thk1632Prolog
+0665 stub GetProcessFlags
+0666 stub SMapLS_IP_EBP_24
+0667 stub SUnMapLS_IP_EBP_24
+0668 stub SMapLS_IP_EBP_32
+0669 stub SUnMapLS_IP_EBP_32
+0670 stub SMapLS_IP_EBP_28
+0671 stub SUnMapLS_IP_EBP_28
+0672 stub SMapLS_IP_EBP_40
+0673 stub SUnMapLS_IP_EBP_40
+0674 stub FreeSLCallback
+0675 stub AllocSLCallback
+0676 stub Callback28
diff --git a/if1632/mmsystem.spec b/if1632/mmsystem.spec
index 6ec752ca120..482ff50bed9 100644
--- a/if1632/mmsystem.spec
+++ b/if1632/mmsystem.spec
@@ -5,7 +5,7 @@ type	win16
 2      pascal  SNDPLAYSOUND(ptr word) sndPlaySound
 5      pascal  MMSYSTEMGETVERSION() mmsystemGetVersion
 6      pascal  DriverProc(long word word long long) DriverProc
-30     pascal16 OutputDebugStr(ptr) OutputDebugString
+30     pascal16 OutputDebugStr(ptr) OutputDebugString16
 31     pascal  DriverCallback(long word word word long long long)
                DriverCallback
 #32    pascal  STACKENTER
@@ -96,7 +96,7 @@ type	win16
 607    pascal  timeGetTime() timeGetTime
 701    pascal  MCISENDCOMMAND(word word long long) mciSendCommand
 702    pascal  MCISENDSTRING(ptr ptr word word) mciSendString
-703    pascal  MCIGETDEVICEID(ptr) mciSendCommand
+703    pascal  MCIGETDEVICEID(ptr) mciGetDeviceID
 706    pascal  MCIGETERRORSTRING(long ptr word) mciGetErrorString
 #900   pascal  MMTASKCREATE
 #902   pascal  MMTASKBLOCK
diff --git a/if1632/ntdll.spec b/if1632/ntdll.spec
index 2208e91f21a..7ac608f0572 100644
--- a/if1632/ntdll.spec
+++ b/if1632/ntdll.spec
@@ -892,15 +892,15 @@ base	0
 888 stub cos
 889 stub fabs
 890 stub floor
-891 stub isalpha
-892 stub isdigit
-893 stub islower
-894 stub isprint
-895 stub isspace
-896 stub isupper
+891 stdcall isalpha(long) CRTDLL_isalpha
+892 stdcall isdigit(long) CRTDLL_isdigit
+893 stdcall islower(long) CRTDLL_islower
+894 stdcall isprint(long) CRTDLL_isprint
+895 stdcall isspace(long) CRTDLL_isspace
+896 stdcall isupper(long) CRTDLL_isupper
 897 stub iswalpha
 898 stub iswctype
-899 stub isxdigit
+899 stdcall isxdigit(long) CRTDLL_isxdigit
 900 stub labs
 901 stub log
 902 stub mbstowcs
@@ -930,8 +930,8 @@ base	0
 926 stub strstr
 927 stdcall swprintf() CRTDLL_swprintf
 928 stub tan
-929 stub tolower
-930 stub toupper
+929 stdcall tolower(long) CRTDLL_tolower
+930 stdcall toupper(long) CRTDLL_toupper
 931 stub towlower
 932 stub towupper
 933 stub vsprintf
diff --git a/if1632/ole2nls.spec b/if1632/ole2nls.spec
index 49b2b2f55ad..1fb5bc3f1e2 100644
--- a/if1632/ole2nls.spec
+++ b/if1632/ole2nls.spec
@@ -7,7 +7,7 @@ type	win16
 4 pascal GetSystemDefaultLangID()  GetSystemDefaultLangID
 5 pascal GetLocaleInfoA(long long ptr word) GetLocaleInfoA
 6 stub LCMAPSTRINGA
-7 stub GETSTRINGTYPEA
+7 pascal16 GetStringTypeA(long long ptr word ptr) GetStringType16
 8 pascal16 CompareStringA(long long ptr word ptr word) CompareString16
 #9 WEP
 10 stub LIBMAIN
diff --git a/if1632/relay.c b/if1632/relay.c
index 75b4eb8de8b..045bb16dd1c 100644
--- a/if1632/relay.c
+++ b/if1632/relay.c
@@ -190,15 +190,28 @@ void RELAY_Unimplemented32( int nb_args, void *relay_addr,
  * (stack+4)   arg1
  * (stack)     func to call
  */
-void RELAY_DebugCallTo16( int* stack, int nbargs )
+void RELAY_DebugCallTo16( int* stack, int nb_args )
 {
     if (!debugging_relay) return;
 
-    printf( "CallTo16(func=%04x:%04x,ds=%04x",
-            HIWORD(stack[0]), LOWORD(stack[0]), CURRENT_DS );
-    stack++;
-    while (nbargs--) printf( ",0x%04x", *stack++ );
-    printf( ")\n" );
+    if (nb_args == -1)  /* Register function */
+    {
+        CONTEXT *context = *(CONTEXT **)stack;
+        printf( "CallTo16(func=%04lx:%04x,ds=%04lx)\n",
+                CS_reg(context), IP_reg(context), DS_reg(context) );
+        printf( "     AX=%04x BX=%04x CX=%04x DX=%04x SI=%04x DI=%04x BP=%04x ES=%04x\n",
+                AX_reg(context), BX_reg(context), CX_reg(context),
+                DX_reg(context), SI_reg(context), DI_reg(context),
+                BP_reg(context), (WORD)ES_reg(context) );
+    }
+    else
+    {
+        printf( "CallTo16(func=%04x:%04x,ds=%04x",
+                HIWORD(stack[0]), LOWORD(stack[0]), CURRENT_DS );
+        stack++;
+        while (nb_args--) printf( ",0x%04x", *stack++ );
+        printf( ")\n" );
+    }
 }
 
 
@@ -349,7 +362,8 @@ INT16 Throw( LPCATCHBUF lpbuf, INT16 retval )
         static FARPROC16 entryPoint = NULL;
 
         if (!entryPoint)  /* Get entry point for Throw() */
-            entryPoint = MODULE_GetEntryPoint( GetModuleHandle("KERNEL"), 56 );
+            entryPoint = MODULE_GetEntryPoint( GetModuleHandle16("KERNEL"),
+                                               56 );
         pFrame->entry_cs = SELECTOROF(entryPoint);
         pFrame->entry_ip = OFFSETOF(entryPoint);
     }
diff --git a/if1632/shell.spec b/if1632/shell.spec
index c9c907d4e3b..eaf6ec973f6 100644
--- a/if1632/shell.spec
+++ b/if1632/shell.spec
@@ -12,11 +12,11 @@ type	win16
  11 pascal16 DragQueryFile(word s_word ptr s_word) DragQueryFile
  12 pascal16 DragFinish(word) DragFinish
  13 pascal16 DragQueryPoint(word ptr) DragQueryPoint
- 20 pascal16 ShellExecute(word ptr ptr ptr ptr s_word) ShellExecute 
- 21 pascal16 FindExecutable(ptr ptr ptr) FindExecutable
+ 20 pascal16 ShellExecute(word ptr ptr ptr ptr s_word) ShellExecute16
+ 21 pascal16 FindExecutable(ptr ptr ptr) FindExecutable16
  22 pascal16 ShellAbout(word ptr ptr word) ShellAbout16
  33 pascal16 AboutDlgProc(word word word long) AboutDlgProc16
- 34 pascal16 ExtractIcon(word ptr s_word) ExtractIcon
+ 34 pascal16 ExtractIcon(word ptr s_word) ExtractIcon16
  36 pascal16 ExtractAssociatedIcon(word ptr ptr) ExtractAssociatedIcon
  37 pascal   DoEnvironmentSubst(ptr word) DoEnvironmentSubst
  38 pascal   FindEnvironmentString(ptr) FindEnvironmentString
diff --git a/if1632/shell32.spec b/if1632/shell32.spec
index b7c65f70a4b..bef7073e93f 100644
--- a/if1632/shell32.spec
+++ b/if1632/shell32.spec
@@ -86,7 +86,7 @@ base	1
 0081 stub SheShortenPathW
 0082 stdcall ShellAboutA(long ptr ptr long) ShellAbout32A
 0083 stdcall ShellAboutW(long ptr ptr long) ShellAbout32W
-0084 stdcall ShellExecuteA(long ptr ptr ptr ptr long) ShellExecute
+0084 stdcall ShellExecuteA(long ptr ptr ptr ptr long) ShellExecute32A
 0085 stub ShellExecuteEx
 0086 stub ShellExecuteExA
 0087 stub ShellExecuteExW
diff --git a/if1632/thunk.c b/if1632/thunk.c
index 1d33e678be8..f56610310f7 100644
--- a/if1632/thunk.c
+++ b/if1632/thunk.c
@@ -148,7 +148,7 @@ BOOL16 THUNK_EnumMetaFile16( HDC16 hdc, HMETAFILE16 hmf,
                              MFENUMPROC16 func, LPARAM lParam )
 {
     DECL_THUNK( thunk, func, CallTo16_word_wllwl );
-    return EnumMetaFile( hdc, hmf, (MFENUMPROC16)&thunk, lParam );
+    return EnumMetaFile16( hdc, hmf, (MFENUMPROC16)&thunk, lParam );
 }
 
 
@@ -581,7 +581,7 @@ BOOL16 THUNK_SetDCHook( HDC16 hdc, FARPROC16 proc, DWORD dwHookData )
     THUNK *thunk, *oldThunk;
 
     if (!defDCHookProc)  /* Get DCHook Win16 entry point */
-        defDCHookProc = MODULE_GetEntryPoint( GetModuleHandle("USER"), 362 );
+        defDCHookProc = MODULE_GetEntryPoint( GetModuleHandle16("USER"), 362 );
 
     if (proc != defDCHookProc)
     {
@@ -610,8 +610,8 @@ DWORD THUNK_GetDCHook( HDC16 hdc, FARPROC16 *phookProc )
         if (thunk == (THUNK *)DCHook)
         {
             if (!defDCHookProc)  /* Get DCHook Win16 entry point */
-                defDCHookProc = MODULE_GetEntryPoint( GetModuleHandle("USER"),
-                                                      362 );
+                defDCHookProc = MODULE_GetEntryPoint(GetModuleHandle16("USER"),
+                                                     362 );
             *phookProc = defDCHookProc;
         }
         else *phookProc = thunk->proc;
@@ -644,6 +644,6 @@ UINT32 ThunkConnect32( struct thunkstruct *ths, LPSTR thunkfun16,
 	);
 	fprintf(stdnimp,"	x1 = %lx\n",ths->x1);
 	fprintf(stdnimp,"	x2 = %lx\n",ths->x2);
-	hmm=LoadModule(module16,NULL);
+	hmm=LoadModule16(module16,NULL);
 	return TRUE;
 }
diff --git a/if1632/user.spec b/if1632/user.spec
index 1bff1ca96c8..564e790222a 100644
--- a/if1632/user.spec
+++ b/if1632/user.spec
@@ -47,7 +47,7 @@ heap	65520
 44  pascal16 OpenIcon(word) OpenIcon16
 45  pascal16 BringWindowToTop(word) BringWindowToTop16
 46  pascal16 GetParent(word) GetParent16
-47  pascal16 IsWindow(word) IsWindow
+47  pascal16 IsWindow(word) IsWindow16
 48  pascal16 IsChild(word word) IsChild16
 49  pascal16 IsWindowVisible(word) IsWindowVisible16
 50  pascal16 FindWindow(segptr ptr) FindWindow16
@@ -107,14 +107,14 @@ heap	65520
 105 pascal16 FlashWindow(word word) FlashWindow16
 106 pascal16 GetKeyState(word) GetKeyState16
 107 pascal   DefWindowProc(word word word long) DefWindowProc16
-108 pascal16 GetMessage(segptr word word word) GetMessage
+108 pascal16 GetMessage(segptr word word word) GetMessage16
 109 pascal16 PeekMessage(ptr word word word word) PeekMessage16
-110 pascal16 PostMessage(word word word long) PostMessage
+110 pascal16 PostMessage(word word word long) PostMessage16
 111 pascal   SendMessage(word word word long) SendMessage16
 112 pascal16 WaitMessage() WaitMessage
 113 pascal16 TranslateMessage(ptr) TranslateMessage16
 114 pascal   DispatchMessage(ptr) DispatchMessage16
-115 pascal16 ReplyMessage(long) ReplyMessage
+115 pascal16 ReplyMessage(long) ReplyMessage16
 116 pascal16 PostAppMessage(word word word long) PostAppMessage16
 118 pascal16 RegisterWindowMessage(segptr) RegisterWindowMessage16
 117 pascal16 WindowFromDC(word) WindowFromDC16
@@ -123,29 +123,29 @@ heap	65520
 121 pascal   SetWindowsHook(s_word segptr) THUNK_SetWindowsHook16
 122 pascal   CallWindowProc(segptr word word word long) CallWindowProc16
 123 pascal16 CallMsgFilter(segptr s_word) CallMsgFilter16
-124 pascal16 UpdateWindow(word) UpdateWindow
+124 pascal16 UpdateWindow(word) UpdateWindow16
 125 pascal16 InvalidateRect(word ptr word) InvalidateRect16
 126 pascal16 InvalidateRgn(word word word) InvalidateRgn16
 127 pascal16 ValidateRect(word ptr) ValidateRect16
 128 pascal16 ValidateRgn(word word) ValidateRgn16
-129 pascal16 GetClassWord(word s_word) GetClassWord
-130 pascal16 SetClassWord(word s_word word) SetClassWord
+129 pascal16 GetClassWord(word s_word) GetClassWord16
+130 pascal16 SetClassWord(word s_word word) SetClassWord16
 131 pascal   GetClassLong(word s_word) GetClassLong16
 132 pascal   SetClassLong(word s_word long) SetClassLong16
-133 pascal16 GetWindowWord(word s_word) GetWindowWord
-134 pascal16 SetWindowWord(word s_word word) SetWindowWord
+133 pascal16 GetWindowWord(word s_word) GetWindowWord16
+134 pascal16 SetWindowWord(word s_word word) SetWindowWord16
 135 pascal   GetWindowLong(word s_word) GetWindowLong16
 136 pascal   SetWindowLong(word s_word long) SetWindowLong16
 137 pascal16 OpenClipboard(word) OpenClipboard16
 138 pascal16 CloseClipboard() CloseClipboard16
 139 pascal16 EmptyClipboard() EmptyClipboard16
 140 pascal16 GetClipboardOwner() GetClipboardOwner16
-141 pascal16 SetClipboardData(word word) SetClipboardData
-142 pascal16 GetClipboardData(word) GetClipboardData
+141 pascal16 SetClipboardData(word word) SetClipboardData16
+142 pascal16 GetClipboardData(word) GetClipboardData16
 143 pascal16 CountClipboardFormats() CountClipboardFormats16
 144 pascal16 EnumClipboardFormats(word) EnumClipboardFormats16
 145 pascal16 RegisterClipboardFormat(ptr) RegisterClipboardFormat16
-146 pascal16 GetClipboardFormatName(word ptr s_word) GetClipboardFormatName
+146 pascal16 GetClipboardFormatName(word ptr s_word) GetClipboardFormatName16
 147 pascal16 SetClipboardViewer(word) SetClipboardViewer16
 148 pascal16 GetClipboardViewer() GetClipboardViewer16
 149 pascal16 ChangeClipboardChain(word ptr) ChangeClipboardChain16
@@ -162,12 +162,12 @@ heap	65520
 160 pascal16 DrawMenuBar(word) DrawMenuBar16
 161 pascal16 GetMenuString(word word ptr s_word word) GetMenuString16
 162 pascal16 HiliteMenuItem(word word word word) HiliteMenuItem16
-163 pascal16 CreateCaret(word word word word) CreateCaret
-164 pascal16 DestroyCaret() DestroyCaret
-165 pascal16 SetCaretPos(word word) SetCaretPos
+163 pascal16 CreateCaret(word word word word) CreateCaret16
+164 pascal16 DestroyCaret() DestroyCaret16
+165 pascal16 SetCaretPos(word word) SetCaretPos16
 166 pascal16 HideCaret(word) HideCaret16
 167 pascal16 ShowCaret(word) ShowCaret16
-168 pascal16 SetCaretBlinkTime(word) SetCaretBlinkTime
+168 pascal16 SetCaretBlinkTime(word) SetCaretBlinkTime16
 169 pascal16 GetCaretBlinkTime() GetCaretBlinkTime16
 170 pascal16 ArrangeIconicWindows(word) ArrangeIconicWindows16
 171 pascal16 WinHelp(word ptr word long) WinHelp16
@@ -237,8 +237,8 @@ heap	65520
 234 pascal16 UnhookWindowsHook(s_word segptr) THUNK_UnhookWindowsHook16
 235 pascal   DefHookProc(s_word word long ptr) DefHookProc16
 236 pascal16 GetCapture() GetCapture16
-237 pascal16 GetUpdateRgn(word word word) GetUpdateRgn
-238 pascal16 ExcludeUpdateRgn(word word) ExcludeUpdateRgn
+237 pascal16 GetUpdateRgn(word word word) GetUpdateRgn16
+238 pascal16 ExcludeUpdateRgn(word word) ExcludeUpdateRgn16
 239 pascal16 DialogBoxParam(word segptr word segptr long) DialogBoxParam16
 240 pascal16 DialogBoxIndirectParam(word word word segptr long)
              DialogBoxIndirectParam16
@@ -316,7 +316,7 @@ heap	65520
 331 pascal16 EnableHardwareInput(word) EnableHardwareInput
 332 pascal16 UserYield() UserYield
 333 stub IsUserIdle
-334 pascal   GetQueueStatus(word) GetQueueStatus
+334 pascal   GetQueueStatus(word) GetQueueStatus16
 335 pascal16 GetInputState() GetInputState16
 336 stub LoadCursorIconHandler
 337 pascal   GetMouseEventProc() GetMouseEventProc
@@ -353,8 +353,7 @@ heap	65520
 398 pascal16 GetClassInfoEx(word segptr ptr) GetClassInfoEx16
 399 stub ChildWindowFromPointEx
 400 stub FinalUserInit
-402 pascal16 GetPriorityClipboardFormat(word ptr s_word)
-             GetPriorityClipboardFormat
+402 pascal16 GetPriorityClipboardFormat(word ptr s_word) GetPriorityClipboardFormat16
 403 pascal16 UnregisterClass(segptr word) UnregisterClass16
 404 pascal16 GetClassInfo(word segptr ptr) GetClassInfo16
 406 pascal16 CreateCursor(word word word word word ptr ptr) CreateCursor16
@@ -408,7 +407,7 @@ heap	65520
 461 pascal16 SetInternalWindowPos(word word ptr ptr) SetInternalWindowPos16
 462 pascal16 CalcChildScroll(word word) CalcChildScroll
 463 pascal16 ScrollChildren(word word word long) ScrollChildren16
-464 pascal   DragObject(word word word word word word) DragObject
+464 pascal   DragObject(word word word word word word) DragObject16
 465 pascal16 DragDetect(word long) DragDetect16
 466 pascal16 DrawFocusRect(word ptr) DrawFocusRect16
 470 stub StringFunc
diff --git a/if1632/user32.spec b/if1632/user32.spec
index 20ac21493f3..71f7f0b55d2 100644
--- a/if1632/user32.spec
+++ b/if1632/user32.spec
@@ -67,7 +67,7 @@ base	1
 0062 stdcall CountClipboardFormats() CountClipboardFormats32
 0063 stub CreateAcceleratorTableA
 0064 stub CreateAcceleratorTableW
-0065 stdcall CreateCaret(long long long long) CreateCaret
+0065 stdcall CreateCaret(long long long long) CreateCaret32
 0066 stdcall CreateCursor(long long long long long ptr ptr) CreateCursor32
 0067 stub CreateDesktopA
 0068 stub CreateDesktopW
@@ -134,7 +134,7 @@ base	1
 0127 stdcall DeferWindowPos(long long long long long long long long) DeferWindowPos32
 0128 stdcall DeleteMenu(long long long) DeleteMenu32
 0129 stub DestroyAcceleratorTable
-0130 stdcall DestroyCaret() DestroyCaret
+0130 stdcall DestroyCaret() DestroyCaret32
 0131 stdcall DestroyCursor(long) DestroyCursor32
 0132 stdcall DestroyIcon(long) DestroyIcon32
 0133 stdcall DestroyMenu(long) DestroyMenu32
@@ -198,7 +198,7 @@ base	1
 0191 stub EnumWindowStationsW
 0192 stdcall EnumWindows(ptr long) THUNK_EnumWindows32
 0193 stdcall EqualRect(ptr ptr) EqualRect32
-0194 stdcall ExcludeUpdateRgn(long long) ExcludeUpdateRgn
+0194 stdcall ExcludeUpdateRgn(long long) ExcludeUpdateRgn32
 0195 stdcall ExitWindowsEx(long long) ExitWindowsEx
 0196 stdcall FillRect(long ptr long) FillRect32
 0197 stdcall FindWindowA(ptr ptr) FindWindow32A
@@ -209,7 +209,7 @@ base	1
 0202 stdcall FrameRect(long ptr long) FrameRect32
 0203 stub FreeDDElParam
 0204 stdcall GetActiveWindow() GetActiveWindow32
-0205 stdcall GetAppCompatFlags(long) GetAppCompatFlags
+0205 stdcall GetAppCompatFlags(long) GetAppCompatFlags32
 0206 stdcall GetAsyncKeyState(long) GetAsyncKeyState32
 0207 stdcall GetCapture() GetCapture32
 0208 stdcall GetCaretBlinkTime() GetCaretBlinkTime32
@@ -222,12 +222,12 @@ base	1
 0215 stdcall GetClassLongW(long long) GetClassLong32W
 0216 stdcall GetClassNameA(long ptr long) GetClassName32A
 0217 stdcall GetClassNameW(long ptr long) GetClassName32W
-0218 stdcall GetClassWord(long long) GetClassWord
+0218 stdcall GetClassWord(long long) GetClassWord32
 0219 stdcall GetClientRect(long long) GetClientRect32
 0220 stdcall GetClipCursor(ptr) GetClipCursor32
-0221 stdcall GetClipboardData(long) GetClipboardData
-0222 stub GetClipboardFormatNameA
-0223 stub GetClipboardFormatNameW
+0221 stdcall GetClipboardData(long) GetClipboardData32
+0222 stdcall GetClipboardFormatNameA(long ptr long) GetClipboardFormatName32A
+0223 stdcall GetClipboardFormatNameW(long ptr long) GetClipboardFormatName32W
 0224 stdcall GetClipboardOwner() GetClipboardOwner32
 0225 stdcall GetClipboardViewer(long) GetClipboardViewer32
 0226 stdcall GetCursor() GetCursor32
@@ -273,11 +273,11 @@ base	1
 0266 stdcall GetMenuState(long long long) GetMenuState32
 0267 stdcall GetMenuStringA(long long ptr long long) GetMenuString32A
 0268 stdcall GetMenuStringW(long long ptr long long) GetMenuString32W
-0269 stdcall GetMessageA(ptr long long long) USER32_GetMessageA
+0269 stdcall GetMessageA(ptr long long long) GetMessage32A
 0270 stdcall GetMessageExtraInfo() GetMessageExtraInfo
 0271 stdcall GetMessagePos() GetMessagePos
 0272 stdcall GetMessageTime() GetMessageTime
-0273 stdcall GetMessageW(ptr long long long) USER32_GetMessageA
+0273 stdcall GetMessageW(ptr long long long) GetMessage32W
 0274 stdcall GetNextDlgGroupItem(long long long) GetNextDlgGroupItem32
 0275 stdcall GetNextDlgTabItem(long long long) GetNextDlgTabItem32
 0276 stdcall GetOpenClipboardWindow() GetOpenClipboardWindow32
@@ -301,7 +301,7 @@ base	1
 0294 stub GetThreadDesktop
 0295 stdcall GetTopWindow(long) GetTopWindow32
 0296 stdcall GetUpdateRect(long ptr long) GetUpdateRect32
-0297 stdcall GetUpdateRgn(long long long) GetUpdateRgn
+0297 stdcall GetUpdateRgn(long long long) GetUpdateRgn32
 0298 stub GetUserObjectInformationA
 0299 stub GetUserObjectInformationW
 0300 stub GetUserObjectSecurity
@@ -317,7 +317,7 @@ base	1
 0310 stdcall GetWindowTextLengthW(long) GetWindowTextLength32W
 0311 stdcall GetWindowTextW(long ptr long) GetWindowText32W
 0312 stdcall GetWindowThreadProcessId(long ptr) GetWindowThreadProcessId
-0313 stdcall GetWindowWord(long long) GetWindowWord
+0313 stdcall GetWindowWord(long long) GetWindowWord32
 0314 stdcall GrayStringA(long long ptr long long long long long long) THUNK_GrayString32A
 0315 stdcall GrayStringW(long long ptr long long long long long long) THUNK_GrayString32W
 0316 stdcall HideCaret(long) HideCaret32
@@ -351,7 +351,7 @@ base	1
 0344 stdcall IsIconic(long) IsIconic32
 0345 stdcall IsMenu(long) IsMenu32
 0346 stdcall IsRectEmpty(ptr) IsRectEmpty32
-0347 stdcall IsWindow(long) IsWindow
+0347 stdcall IsWindow(long) IsWindow32
 0348 stdcall IsWindowEnabled(long) IsWindowEnabled32
 0349 stdcall IsWindowUnicode(long) IsWindowUnicode
 0350 stdcall IsWindowVisible(long) IsWindowVisible32
@@ -422,8 +422,8 @@ base	1
 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 stdcall PostMessageW(long long long long) PostMessage
+0418 stdcall PostMessageA(long long long long) PostMessage32A
+0419 stdcall PostMessageW(long long long long) PostMessage32W
 0420 stdcall PostQuitMessage(long) PostQuitMessage32
 0421 stub PostThreadMessageA
 0422 stub PostThreadMessageW
@@ -468,12 +468,12 @@ base	1
 0461 stub ServerSetFunctionPointers
 0462 stdcall SetActiveWindow(long) SetActiveWindow32
 0463 stdcall SetCapture(long) SetCapture32
-0464 stdcall SetCaretBlinkTime(long) SetCaretBlinkTime
-0465 stdcall SetCaretPos(long long) SetCaretPos
+0464 stdcall SetCaretBlinkTime(long) SetCaretBlinkTime32
+0465 stdcall SetCaretPos(long long) SetCaretPos32
 0466 stdcall SetClassLongA(long long long) SetClassLong32A
 0467 stdcall SetClassLongW(long long long) SetClassLong32W
-0468 stdcall SetClassWord(long long long) SetClassWord
-0469 stdcall SetClipboardData(long long) SetClipboardData
+0468 stdcall SetClassWord(long long long) SetClassWord32
+0469 stdcall SetClipboardData(long long) SetClipboardData32
 0470 stdcall SetClipboardViewer(long) SetClipboardViewer32
 0471 stdcall SetCursor(long) SetCursor32
 0472 stub SetCursorContents
@@ -527,7 +527,7 @@ base	1
 0520 stub SetWindowStationUser
 0521 stdcall SetWindowTextA(long ptr) SetWindowText32A
 0522 stdcall SetWindowTextW(long ptr) SetWindowText32W
-0523 stdcall SetWindowWord(long long long) SetWindowWord
+0523 stdcall SetWindowWord(long long long) SetWindowWord32
 0524 stdcall SetWindowsHookA(long ptr) SetWindowsHook32A
 0525 stdcall SetWindowsHookExA(long long long long) SetWindowsHookEx32A
 0526 stdcall SetWindowsHookExW(long long long long) SetWindowsHookEx32W
@@ -570,7 +570,7 @@ base	1
 0563 stdcall UnregisterClassW(ptr long) UnregisterClass32W
 0564 stub UnregisterHotKey
 0565 stub UpdatePerUserSystemParameters
-0566 stdcall UpdateWindow(long) UpdateWindow
+0566 stdcall UpdateWindow(long) UpdateWindow32
 0567 stub UserClientDllInitialize
 0568 stub UserRealizePalette
 0569 stub UserRegisterWowHandlers
@@ -603,3 +603,5 @@ base	1
 0595 stub RegisterServicesProcess
 0596 stub SetWindowRgn
 0597 stub ToUnicodeEx
+0598 stub DrawCaptionTempA
+0599 stub RegisterNetworkCapabilities
diff --git a/include/advapi32.h b/include/advapi32.h
deleted file mode 100644
index 3bd8cff4983..00000000000
--- a/include/advapi32.h
+++ /dev/null
@@ -1,7 +0,0 @@
-#ifndef __WINE_ADVAPI32_H
-#define __WINE_ADVAPI32_H
-#include "shell.h"
-
-BOOL GetUserNameA (char * lpBuffer, DWORD  *nSize);
-
-#endif  /* __WINE_ADVAPI32_H */
diff --git a/include/callback.h b/include/callback.h
index 9dcf16542d0..7ef5fb2e760 100644
--- a/include/callback.h
+++ b/include/callback.h
@@ -8,6 +8,7 @@
 #define __WINE_CALLBACK_H
 
 #include "wintypes.h"
+#include "winnt.h"
 
 extern
 int CallTo32_LargeStack( int (*func)(), int nbargs, ... );
@@ -20,6 +21,7 @@ extern WORD CallTo16_word_     ( FARPROC16 );
 
 #ifndef WINELIB
 
+extern void CallTo16_regs_     ( const CONTEXT *context );
 extern WORD CallTo16_word_w    ( FARPROC16, WORD );
 extern WORD CallTo16_word_ww   ( FARPROC16, WORD, WORD );
 extern WORD CallTo16_word_wl   ( FARPROC16, WORD, LONG );
@@ -46,10 +48,6 @@ extern LONG CallTo16_long_lwwllwlllllw( FARPROC16, LONG, WORD, WORD, LONG,
 				       LONG, WORD, LONG, LONG, LONG, LONG, 
 				       LONG, WORD);
 
-
-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 CallDriverProc( func, dwId, msg, hdrvr, lparam1, lparam2 ) \
     CallTo16_long_lwwll( func, dwId, msg, hdrvr, lparam1, lparam2 )
 #define CallTimeFuncProc( func, id, msg, dwUser, dw1, dw2 ) \
diff --git a/include/clipboard.h b/include/clipboard.h
index 34f3bcf89dd..d0070df18b2 100644
--- a/include/clipboard.h
+++ b/include/clipboard.h
@@ -4,6 +4,6 @@
 void CLIPBOARD_ReadSelection(Window w,Atom prop);
 void CLIPBOARD_ReleaseSelection(Window w,HWND32 hwnd);
 void CLIPBOARD_DisOwn(WND* pWnd);
-BOOL CLIPBOARD_IsPresent(WORD wFormat);
+BOOL32 CLIPBOARD_IsPresent(WORD wFormat);
 
 #endif /* __WINE_CLIPBOARD_H */
diff --git a/include/combo.h b/include/combo.h
index 64511e59e36..82fe86cd4b9 100644
--- a/include/combo.h
+++ b/include/combo.h
@@ -17,5 +17,5 @@ typedef struct {
   BOOL16  bRedrawFlag;
 } HEADCOMBO,*LPHEADCOMBO;
 
-LRESULT ComboBoxWndProc(HWND16 hwnd, UINT message, WPARAM16 wParam, LPARAM lParam);
-LRESULT ComboLBoxWndProc(HWND16 hwnd, UINT message, WPARAM16 wParam, LPARAM lParam);
+LRESULT ComboBoxWndProc(HWND16 hwnd, UINT16 message, WPARAM16 wParam, LPARAM lParam);
+LRESULT ComboLBoxWndProc(HWND16 hwnd, UINT16 message, WPARAM16 wParam, LPARAM lParam);
diff --git a/include/commdlg.h b/include/commdlg.h
index 1761991414a..4e85561d1c3 100644
--- a/include/commdlg.h
+++ b/include/commdlg.h
@@ -62,8 +62,8 @@ typedef struct {
 	SEGPTR 		lpstrInitialDir;
 	SEGPTR 		lpstrTitle;
 	DWORD		Flags;
-	UINT		nFileOffset;
-	UINT		nFileExtension;
+	UINT16		nFileOffset;
+	UINT16		nFileExtension;
 	SEGPTR		lpstrDefExt;
 	LPARAM 		lCustData;
         WNDPROC16       lpfnHook;
@@ -101,8 +101,8 @@ typedef struct {
 	DWORD		Flags;                  /* one or more of the FR_?? */
 	SEGPTR		lpstrFindWhat;          /* ptr. to search string    */
 	SEGPTR		lpstrReplaceWith;       /* ptr. to replace string   */
-	UINT		wFindWhatLen;           /* size of find buffer      */
-	UINT 		wReplaceWithLen;        /* size of replace buffer   */
+	UINT16		wFindWhatLen;           /* size of find buffer      */
+	UINT16 		wReplaceWithLen;        /* size of replace buffer   */
 	LPARAM 		lCustData;              /* data passed to hook fn.  */
         WNDPROC16       lpfnHook;
 	SEGPTR 		lpTemplateName;         /* custom template name     */
@@ -145,7 +145,7 @@ typedef struct {
 							/* contains cust. dlg. template  */
 	SEGPTR			lpszStyle WINE_PACKED;  /* return the style field here   */
 							/* must be LF_FACESIZE or bigger */
-	UINT			nFontType;          	/* same value reported to the    */
+	UINT16			nFontType;          	/* same value reported to the    */
 						    	/* EnumFonts callback with the   */
 							/* extra FONTTYPE_ bits added    */
 	short			nSizeMin WINE_PACKED;   /* minimum pt size allowed & */
@@ -210,11 +210,11 @@ typedef struct {
 	HGLOBAL16       hDevNames;
 	HDC16	       	hDC;
 	DWORD 		Flags;
-	UINT		nFromPage;
-	UINT		nToPage;
-	UINT		nMinPage;
-	UINT		nMaxPage;
-	UINT		nCopies;
+	UINT16		nFromPage;
+	UINT16		nToPage;
+	UINT16		nMinPage;
+	UINT16		nMaxPage;
+	UINT16		nCopies;
 	HINSTANCE16 	hInstance;
 	LPARAM 		lCustData;
         WNDPROC16       lpfnPrintHook;
@@ -250,10 +250,10 @@ typedef PRINTDLG * LPPRINTDLG;
 #define PD_HIDEPRINTTOFILE           0x00100000
 
 typedef struct {
-	UINT 	wDriverOffset;
-	UINT 	wDeviceOffset;
-	UINT 	wOutputOffset;
-	UINT 	wDefault;
+	UINT16 	wDriverOffset;
+	UINT16 	wDeviceOffset;
+	UINT16 	wOutputOffset;
+	UINT16 	wDefault;
 	} DEVNAMES;
 typedef DEVNAMES * LPDEVNAMES;
 
@@ -275,24 +275,24 @@ typedef DEVNAMES * LPDEVNAMES;
 #define CDERR_NOHOOK           0x000B
 #define CDERR_REGISTERMSGFAIL  0x000C
 
-BOOL  ChooseColor(LPCHOOSECOLOR lpChCol);
+BOOL16  ChooseColor(LPCHOOSECOLOR lpChCol);
 DWORD CommDlgExtendedError(void);
 HWND16 FindText( SEGPTR find);
-short GetFileTitle(LPCSTR lpFile, LPSTR lpTitle, UINT cbBuf);
-BOOL  GetOpenFileName(SEGPTR ofn);
-BOOL  GetSaveFileName(SEGPTR ofn);
-BOOL  PrintDlg( SEGPTR print);
+short GetFileTitle(LPCSTR lpFile, LPSTR lpTitle, UINT16 cbBuf);
+BOOL16  GetOpenFileName(SEGPTR ofn);
+BOOL16  GetSaveFileName(SEGPTR ofn);
+BOOL16  PrintDlg( SEGPTR print);
 HWND16 ReplaceText( SEGPTR find);
-BOOL  ChooseFont(LPCHOOSEFONT lpChFont);
-
-LRESULT FileOpenDlgProc(HWND16 hWnd, UINT wMsg, WPARAM16 wParam, LPARAM lParam);
-LRESULT FileSaveDlgProc(HWND16 hWnd, UINT wMsg, WPARAM16 wParam, LPARAM lParam);
-LRESULT ColorDlgProc(HWND16 hWnd, UINT wMsg, WPARAM16 wParam, LPARAM lParam);
-LRESULT FindTextDlgProc(HWND16 hWnd, UINT wMsg, WPARAM16 wParam, LPARAM lParam);
-LRESULT ReplaceTextDlgProc(HWND16 hWnd, UINT wMsg, WPARAM16 wParam, LPARAM lParam);
-LRESULT PrintDlgProc(HWND16 hWnd, UINT wMsg, WPARAM16 wParam, LPARAM lParam);
-LRESULT PrintSetupDlgProc(HWND16 hWnd, UINT wMsg, WPARAM16 wParam, LPARAM lParam);
-LRESULT FormatCharDlgProc(HWND16 hWnd, UINT wMsg, WPARAM16 wParam, LPARAM lParam);
+BOOL16  ChooseFont(LPCHOOSEFONT lpChFont);
+
+LRESULT FileOpenDlgProc(HWND16 hWnd, UINT16 wMsg, WPARAM16 wParam, LPARAM lParam);
+LRESULT FileSaveDlgProc(HWND16 hWnd, UINT16 wMsg, WPARAM16 wParam, LPARAM lParam);
+LRESULT ColorDlgProc(HWND16 hWnd, UINT16 wMsg, WPARAM16 wParam, LPARAM lParam);
+LRESULT FindTextDlgProc(HWND16 hWnd, UINT16 wMsg, WPARAM16 wParam, LPARAM lParam);
+LRESULT ReplaceTextDlgProc(HWND16 hWnd, UINT16 wMsg, WPARAM16 wParam, LPARAM lParam);
+LRESULT PrintDlgProc(HWND16 hWnd, UINT16 wMsg, WPARAM16 wParam, LPARAM lParam);
+LRESULT PrintSetupDlgProc(HWND16 hWnd, UINT16 wMsg, WPARAM16 wParam, LPARAM lParam);
+LRESULT FormatCharDlgProc(HWND16 hWnd, UINT16 wMsg, WPARAM16 wParam, LPARAM lParam);
 
 #ifdef __cplusplus
 }
diff --git a/include/config.h.in b/include/config.h.in
index cf00d2821d2..12cd82d44c2 100644
--- a/include/config.h.in
+++ b/include/config.h.in
@@ -26,3 +26,9 @@
 
 /* Define if you have the usleep function.  */
 #undef HAVE_USLEEP
+
+/* Define if you have the wait4 function.  */
+#undef HAVE_WAIT4
+
+/* Define if you have the waitpid function.  */
+#undef HAVE_WAITPID
diff --git a/include/dde_proc.h b/include/dde_proc.h
index 84697cf02f5..e8a7ab1194c 100644
--- a/include/dde_proc.h
+++ b/include/dde_proc.h
@@ -51,9 +51,9 @@ int  dde_reschedule();
 void dde_wnd_setup();		   /* setup Data structure of DDE windows */
 
 /* Send ack. to hnd indicating that posted/sent msg. got to destination*/
-void dde_proc_send_ack(HWND16 wnd, BOOL val);
-BOOL DDE_PostMessage( MSG16 *msg);
-BOOL DDE_SendMessage( MSG16 *msg);
+void dde_proc_send_ack(HWND16 wnd, BOOL32 val);
+BOOL32 DDE_PostMessage( MSG16 *msg);
+BOOL32 DDE_SendMessage( MSG16 *msg);
 int DDE_GetRemoteMessage();
 void DDE_DestroyWindow(HWND16 hwnd); /* delete DDE info regarding hwnd */
 void DDE_TestDDE(HWND16 hwnd);	   /* do we have dde handling in the window ?*/
diff --git a/include/debug.h b/include/debug.h
index 7dc0330a5bc..32bd72cc036 100644
--- a/include/debug.h
+++ b/include/debug.h
@@ -78,6 +78,7 @@
 #undef DEBUG_TIMER
 #undef DEBUG_TOOLHELP
 #undef DEBUG_VER
+#undef DEBUG_VIRTUAL
 #undef DEBUG_VXD
 #undef DEBUG_WIN
 #undef DEBUG_WIN16DRV
@@ -158,6 +159,7 @@
 #define DEBUG_TIMER
 #define DEBUG_TOOLHELP
 #define DEBUG_VER
+#define DEBUG_VIRTUAL
 #define DEBUG_VXD
 #define DEBUG_WIN
 #define DEBUG_WIN16DRV
@@ -528,6 +530,11 @@ short debug_msg_enabled[]={
 #else
     0,
 #endif
+#ifdef DEBUG_VIRTUAL
+    1,
+#else
+    0,
+#endif
 #ifdef DEBUG_VXD
     1,
 #else
@@ -1497,8 +1504,21 @@ extern short debug_msg_enabled[];
 #endif
 
 #ifdef DEBUG_RUNTIME
-#define dprintf_vxd if(!debug_msg_enabled[72]) ; else fprintf
-#define debugging_vxd debug_msg_enabled[72]
+#define dprintf_virtual if(!debug_msg_enabled[72]) ; else fprintf
+#define debugging_virtual debug_msg_enabled[72]
+#else
+#ifdef DEBUG_VIRTUAL
+#define dprintf_virtual fprintf
+#define debugging_virtual 1
+#else
+#define dprintf_virtual while(0) fprintf
+#define debugging_virtual 0
+#endif
+#endif
+
+#ifdef DEBUG_RUNTIME
+#define dprintf_vxd if(!debug_msg_enabled[73]) ; else fprintf
+#define debugging_vxd debug_msg_enabled[73]
 #else
 #ifdef DEBUG_VXD
 #define dprintf_vxd fprintf
@@ -1510,8 +1530,8 @@ extern short debug_msg_enabled[];
 #endif
 
 #ifdef DEBUG_RUNTIME
-#define dprintf_win if(!debug_msg_enabled[73]) ; else fprintf
-#define debugging_win debug_msg_enabled[73]
+#define dprintf_win if(!debug_msg_enabled[74]) ; else fprintf
+#define debugging_win debug_msg_enabled[74]
 #else
 #ifdef DEBUG_WIN
 #define dprintf_win fprintf
@@ -1523,8 +1543,8 @@ extern short debug_msg_enabled[];
 #endif
 
 #ifdef DEBUG_RUNTIME
-#define dprintf_win16drv if(!debug_msg_enabled[74]) ; else fprintf
-#define debugging_win16drv debug_msg_enabled[74]
+#define dprintf_win16drv if(!debug_msg_enabled[75]) ; else fprintf
+#define debugging_win16drv debug_msg_enabled[75]
 #else
 #ifdef DEBUG_WIN16DRV
 #define dprintf_win16drv fprintf
@@ -1536,8 +1556,8 @@ extern short debug_msg_enabled[];
 #endif
 
 #ifdef DEBUG_RUNTIME
-#define dprintf_win32 if(!debug_msg_enabled[75]) ; else fprintf
-#define debugging_win32 debug_msg_enabled[75]
+#define dprintf_win32 if(!debug_msg_enabled[76]) ; else fprintf
+#define debugging_win32 debug_msg_enabled[76]
 #else
 #ifdef DEBUG_WIN32
 #define dprintf_win32 fprintf
@@ -1549,8 +1569,8 @@ extern short debug_msg_enabled[];
 #endif
 
 #ifdef DEBUG_RUNTIME
-#define dprintf_winsock if(!debug_msg_enabled[76]) ; else fprintf
-#define debugging_winsock debug_msg_enabled[76]
+#define dprintf_winsock if(!debug_msg_enabled[77]) ; else fprintf
+#define debugging_winsock debug_msg_enabled[77]
 #else
 #ifdef DEBUG_WINSOCK
 #define dprintf_winsock fprintf
@@ -1637,6 +1657,7 @@ static char *debug_msg_name[] = {
     "timer",
     "toolhelp",
     "ver",
+    "virtual",
     "vxd",
     "win",
     "win16drv",
diff --git a/include/debugger.h b/include/debugger.h
index 1a1f02aa3b7..a6670ce03ba 100644
--- a/include/debugger.h
+++ b/include/debugger.h
@@ -307,6 +307,7 @@ extern void DEBUG_AddPath(const char * path);
 extern void DEBUG_List(struct list_id * line1, struct list_id * line2,  
 		       int delta);
 extern void DEBUG_NukePath(void);
+extern void DEBUG_Disassemble( const DBG_ADDR *, const DBG_ADDR*, int offset );
 
   /* debugger/dbg.y */
 extern void wine_debug( int signal, SIGCONTEXT *regs );
diff --git a/include/driver.h b/include/driver.h
index 16ee0e2fa29..3eb7b7dbf40 100644
--- a/include/driver.h
+++ b/include/driver.h
@@ -54,7 +54,7 @@ typedef struct tagDRIVERITEM
     WORD                  count;
     struct tagDRIVERITEM *lpPrevItem;
     struct tagDRIVERITEM *lpNextItem;
-    DRIVERPROC            lpDrvProc;
+    DRIVERPROC16          lpDrvProc;
 } DRIVERITEM, *LPDRIVERITEM;
 
 LRESULT DefDriverProc(DWORD dwDevID, HDRVR16 hDriv, UINT16 wMsg, 
diff --git a/include/file.h b/include/file.h
index a2bd3764009..bb33157f50a 100644
--- a/include/file.h
+++ b/include/file.h
@@ -13,6 +13,16 @@
 
 #define MAX_PATHNAME_LEN   1024
 
+/* The file object */
+typedef struct
+{
+    K32OBJ    header;
+    int       unix_handle;
+    int       mode;
+    char     *unix_name;
+    DWORD     type;         /* Type for win32 apps */
+} FILE_OBJECT;
+
 /* Definition of a full DOS file name */
 typedef struct
 {
@@ -33,6 +43,10 @@ extern HFILE32 FILE_Dup( HFILE32 hFile );
 extern HFILE32 FILE_Dup2( HFILE32 hFile1, HFILE32 hFile2 );
 extern HFILE32 FILE_Open( LPCSTR path, INT32 mode );
 extern BOOL32 FILE_SetFileType( HFILE32 hFile, DWORD type );
+extern LPVOID FILE_mmap( FILE_OBJECT *file, LPVOID start,
+                         DWORD size_high, DWORD size_low,
+                         DWORD offset_high, DWORD offset_low,
+                         int prot, int flags );
 extern HFILE32 _lcreat_uniq( LPCSTR path, INT32 attr );
 
 /* files/directory.c */
diff --git a/include/font.h b/include/font.h
index 12456adb00a..528fd66f44d 100644
--- a/include/font.h
+++ b/include/font.h
@@ -24,26 +24,6 @@ typedef struct
 #define MAX_FONTS	256
 extern LPLOGFONT16 lpLogFontList[MAX_FONTS+1];
 
-/* may be switched... */
-#define GGO_BITMAP	0x4F4D
-#define GGO_NATIVE	0x4F50
-typedef struct
-{
-	UINT16	gmBlackBoxX;
-	UINT16	gmBlackBoxY;
-	POINT16	gmptGlyphOrigin;
-	int	gmCellIncX;
-	int	gmCellIncY;
-} GLYPHMETRICS,*LPGLYPHMETRICS;
-typedef struct
-{
-	DWORD	eM11; /* all type FIXED in Borlands Handbook */
-	DWORD	eM12; 
-	DWORD	eM21;
-	DWORD	eM22;
-} MAT2,*LPMAT2;
-
-
 extern BOOL32 FONT_Init( void );
 extern INT16 FONT_GetObject16( FONTOBJ * font, INT16 count, LPSTR buffer );
 extern INT32 FONT_GetObject32A( FONTOBJ * font, INT32 count, LPSTR buffer );
diff --git a/include/handle32.h b/include/handle32.h
index 7699eedd93b..9fa3021b429 100644
--- a/include/handle32.h
+++ b/include/handle32.h
@@ -42,5 +42,8 @@ typedef struct
 
 extern void K32OBJ_IncCount( K32OBJ *ptr );
 extern void K32OBJ_DecCount( K32OBJ *ptr );
+extern BOOL32 K32OBJ_AddName( K32OBJ *obj, LPCSTR name );
+extern K32OBJ *K32OBJ_FindName( LPCSTR name );
+extern K32OBJ *K32OBJ_FindNameType( LPCSTR name, K32OBJ_TYPE type );
 
 #endif /* __WINE_HANDLE32_H */
diff --git a/include/libres.h b/include/libres.h
index 6014a3b4765..addeb8448a2 100644
--- a/include/libres.h
+++ b/include/libres.h
@@ -4,8 +4,6 @@
 #ifndef __WINE_LIBRES_H
 #define __WINE_LIBRES_H
 
-#ifdef WINELIB
-
 #include "wintypes.h"
 #include "resource.h"
 
@@ -18,6 +16,4 @@ extern HGLOBAL32 LIBRES_LoadResource( HINSTANCE32 hModule, HRSRC32 hRsrc );
 extern LPVOID LIBRES_LockResource( HGLOBAL32 handle );
 extern DWORD LIBRES_SizeofResource( HINSTANCE32 hModule, HRSRC32 hRsrc );
 
-#endif /* WINELIB */
-
 #endif
diff --git a/include/listbox.h b/include/listbox.h
index d3f97ad57f4..27cee05e0c9 100644
--- a/include/listbox.h
+++ b/include/listbox.h
@@ -4,7 +4,7 @@
 
 typedef struct tagLISTSTRUCT {
         MEASUREITEMSTRUCT16 mis;
-        UINT            itemState;
+        UINT16            itemState;
         RECT16          itemRect;
 	HLOCAL16	hData;
 	char            *itemText;
@@ -28,12 +28,12 @@ typedef struct {
 	DWORD   dwStyle;      /* added for COMBOLBOX style faking */
 	HWND16  hParent;
 	HFONT16 hFont;
-	BOOL    bRedrawFlag;
-        BOOL    HasStrings;
-        BOOL    OwnerDrawn;
+	BOOL32  bRedrawFlag;
+        BOOL32  HasStrings;
+        BOOL32  OwnerDrawn;
 	WORD    iNumStops;
 	LPINT16 TabStops;
-        BOOL    needMeasure;
+        BOOL32  needMeasure;
 	HGLOBAL16 HeapSel;
 /*	MDESC   *Heap; */
 } HEADLIST,*LPHEADLIST;
@@ -44,22 +44,22 @@ extern void DestroyListBoxStruct(LPHEADLIST lphl);
 
 extern void ListBoxSendNotification(LPHEADLIST lphl, WORD code);
 
-extern LPLISTSTRUCT ListBoxGetItem(LPHEADLIST lphl, UINT uIndex);
+extern LPLISTSTRUCT ListBoxGetItem(LPHEADLIST lphl, UINT16 uIndex);
 extern int ListMaxFirstVisible(LPHEADLIST lphl);
 extern int ListBoxScrollToFocus(LPHEADLIST lphl);
 extern int ListBoxAddString(LPHEADLIST lphl, SEGPTR itemData);
-extern int ListBoxInsertString(LPHEADLIST lphl, UINT uIndex, LPCSTR newstr);
-extern int ListBoxGetText(LPHEADLIST lphl, UINT uIndex, LPSTR OutStr);
-extern DWORD ListBoxGetItemData(LPHEADLIST lphl, UINT uIndex);
-extern int ListBoxSetItemData(LPHEADLIST lphl, UINT uIndex, DWORD ItemData);
-extern int ListBoxDeleteString(LPHEADLIST lphl, UINT uIndex);
-extern int ListBoxFindString(LPHEADLIST lphl, UINT nFirst, SEGPTR MatchStr);
-extern int ListBoxFindStringExact(LPHEADLIST lphl, UINT nFirst, SEGPTR MatchStr);
+extern int ListBoxInsertString(LPHEADLIST lphl, UINT16 uIndex, LPCSTR newstr);
+extern int ListBoxGetText(LPHEADLIST lphl, UINT16 uIndex, LPSTR OutStr);
+extern DWORD ListBoxGetItemData(LPHEADLIST lphl, UINT16 uIndex);
+extern int ListBoxSetItemData(LPHEADLIST lphl, UINT16 uIndex, DWORD ItemData);
+extern int ListBoxDeleteString(LPHEADLIST lphl, UINT16 uIndex);
+extern int ListBoxFindString(LPHEADLIST lphl, UINT16 nFirst, SEGPTR MatchStr);
+extern int ListBoxFindStringExact(LPHEADLIST lphl, UINT16 nFirst, SEGPTR MatchStr);
 extern int ListBoxResetContent(LPHEADLIST lphl);
 extern int ListBoxSetCurSel(LPHEADLIST lphl, WORD wIndex);
 extern int ListBoxSetSel(LPHEADLIST lphl, WORD wIndex, WORD state);
 extern int ListBoxGetSel(LPHEADLIST lphl, WORD wIndex);
-extern LONG ListBoxDirectory(LPHEADLIST lphl, UINT attrib, LPCSTR filespec);
+extern LONG ListBoxDirectory(LPHEADLIST lphl, UINT16 attrib, LPCSTR filespec);
 extern int ListBoxGetItemRect(LPHEADLIST lphl, WORD wIndex, LPRECT16 rect);
 extern int ListBoxSetItemHeight(LPHEADLIST lphl, WORD wIndex, long height);
 extern int ListBoxFindNextMatch(LPHEADLIST lphl, WORD wChar);
diff --git a/include/mdi.h b/include/mdi.h
index ee6171f3adc..0ad2700e9d3 100644
--- a/include/mdi.h
+++ b/include/mdi.h
@@ -20,7 +20,7 @@
 
 #define WM_MDICALCCHILDSCROLL   0x10AC /* this is exactly what Windows uses */
 
-extern LRESULT MDIClientWndProc(HWND16 hwnd, UINT message, 
+extern LRESULT MDIClientWndProc(HWND16 hwnd, UINT16 message, 
 				WPARAM16 wParam, LPARAM lParam); /* mdi.c */
 
 typedef struct tagMDIWCL
diff --git a/include/mmsystem.h b/include/mmsystem.h
index 4f9601485db..56bc61119ec 100644
--- a/include/mmsystem.h
+++ b/include/mmsystem.h
@@ -19,7 +19,7 @@ typedef LPCSTR			HPCSTR;         /* a huge version of LPCSTR */
 typedef WORD    VERSION;        /* major (high byte), minor (low byte) */
 
 typedef struct {
-    UINT    wType;              /* indicates the contents of the union */
+    UINT16    wType;              /* indicates the contents of the union */
     union {
         DWORD ms;               /* milliseconds */
         DWORD sample;           /* samples */
@@ -108,7 +108,7 @@ typedef struct {
 #define CALLBACK_TASK       0x00020000l    /* dwCallback is a HTASK */
 #define CALLBACK_FUNCTION   0x00030000l    /* dwCallback is a FARPROC */
 
-typedef void (*LPDRVCALLBACK) (HDRVR16 h, UINT uMessage, DWORD dwUser, DWORD dw1, DWORD dw2);
+typedef void (*LPDRVCALLBACK) (HDRVR16 h, UINT16 uMessage, DWORD dwUser, DWORD dw1, DWORD dw2);
 
 #define MM_MICROSOFT            1       /* Microsoft Corp. */
 
@@ -132,7 +132,7 @@ typedef void (*LPDRVCALLBACK) (HDRVR16 h, UINT uMessage, DWORD dwUser, DWORD dw1
 WORD mmsystemGetVersion(void);
 void OutputDebugStr(LPCSTR);
 
-BOOL sndPlaySound(LPCSTR lpszSoundName, UINT uFlags);
+BOOL16 sndPlaySound(LPCSTR lpszSoundName, UINT16 uFlags);
 
 #define SND_SYNC            0x0000  /* play synchronously (default) */
 #define SND_ASYNC           0x0001  /* play asynchronously */
@@ -182,12 +182,12 @@ typedef struct wavehdr_tag {
 #define WHDR_INQUEUE    0x00000010  /* reserved for driver */
 
 typedef struct {
-    UINT    wMid;                  /* manufacturer ID */
-    UINT    wPid;                  /* product ID */
+    UINT16    wMid;                  /* manufacturer ID */
+    UINT16    wPid;                  /* product ID */
     VERSION vDriverVersion;        /* version of the driver */
     char    szPname[MAXPNAMELEN];  /* product name (NULL terminated string) */
     DWORD   dwFormats;             /* formats supported */
-    UINT    wChannels;             /* number of sources supported */
+    UINT16    wChannels;             /* number of sources supported */
     DWORD   dwSupport;             /* functionality supported by driver */
 } WAVEOUTCAPS, *LPWAVEOUTCAPS;
 
@@ -198,12 +198,12 @@ typedef struct {
 #define WAVECAPS_SYNC           0x0010
 
 typedef struct {
-    UINT    wMid;                    /* manufacturer ID */
-    UINT    wPid;                    /* product ID */
+    UINT16    wMid;                    /* manufacturer ID */
+    UINT16    wPid;                    /* product ID */
     VERSION vDriverVersion;          /* version of the driver */
     char    szPname[MAXPNAMELEN];    /* product name (NULL terminated string) */
     DWORD   dwFormats;               /* formats supported */
-    UINT    wChannels;               /* number of channels supported */
+    UINT16    wChannels;               /* number of channels supported */
 } WAVEINCAPS, *LPWAVEINCAPS;
 
 #define WAVE_INVALIDFORMAT     0x00000000       /* invalid format */
@@ -236,57 +236,57 @@ typedef struct {
     WORD        wBitsPerSample;
 } PCMWAVEFORMAT, *LPPCMWAVEFORMAT;
 
-UINT waveOutGetNumDevs(void);
-UINT waveOutGetDevCaps(UINT uDeviceID, WAVEOUTCAPS * lpCaps,
-    UINT uSize);
-UINT waveOutGetVolume(UINT uDeviceID, DWORD * lpdwVolume);
-UINT waveOutSetVolume(UINT uDeviceID, DWORD dwVolume);
-UINT waveOutGetErrorText(UINT uError, LPSTR lpText, UINT uSize);
-UINT waveGetErrorText(UINT uError, LPSTR lpText, UINT uSize);
-UINT waveOutOpen(HWAVEOUT16 * lphWaveOut, UINT uDeviceID,
+UINT16 waveOutGetNumDevs(void);
+UINT16 waveOutGetDevCaps(UINT16 uDeviceID, WAVEOUTCAPS * lpCaps,
+    UINT16 uSize);
+UINT16 waveOutGetVolume(UINT16 uDeviceID, DWORD * lpdwVolume);
+UINT16 waveOutSetVolume(UINT16 uDeviceID, DWORD dwVolume);
+UINT16 waveOutGetErrorText(UINT16 uError, LPSTR lpText, UINT16 uSize);
+UINT16 waveGetErrorText(UINT16 uError, LPSTR lpText, UINT16 uSize);
+UINT16 waveOutOpen(HWAVEOUT16 * lphWaveOut, UINT16 uDeviceID,
     const LPWAVEFORMAT lpFormat, DWORD dwCallback, DWORD dwInstance, DWORD dwFlags);
-UINT waveOutClose(HWAVEOUT16 hWaveOut);
-UINT waveOutPrepareHeader(HWAVEOUT16 hWaveOut,
-     WAVEHDR * lpWaveOutHdr, UINT uSize);
-UINT waveOutUnprepareHeader(HWAVEOUT16 hWaveOut,
-    WAVEHDR * lpWaveOutHdr, UINT uSize);
-UINT waveOutWrite(HWAVEOUT16 hWaveOut, WAVEHDR * lpWaveOutHdr,
-    UINT uSize);
-UINT waveOutPause(HWAVEOUT16 hWaveOut);
-UINT waveOutRestart(HWAVEOUT16 hWaveOut);
-UINT waveOutReset(HWAVEOUT16 hWaveOut);
-UINT waveOutBreakLoop(HWAVEOUT16 hWaveOut);
-UINT waveOutGetPosition(HWAVEOUT16 hWaveOut, MMTIME * lpInfo,
-    UINT uSize);
-UINT waveOutGetPitch(HWAVEOUT16 hWaveOut, DWORD * lpdwPitch);
-UINT waveOutSetPitch(HWAVEOUT16 hWaveOut, DWORD dwPitch);
-UINT waveOutGetPlaybackRate(HWAVEOUT16 hWaveOut, DWORD * lpdwRate);
-UINT waveOutSetPlaybackRate(HWAVEOUT16 hWaveOut, DWORD dwRate);
-UINT waveOutGetID(HWAVEOUT16 hWaveOut, UINT * lpuDeviceID);
-
-DWORD waveOutMessage(HWAVEOUT16 hWaveOut, UINT uMessage, DWORD dw1, DWORD dw2);
-
-UINT waveInGetNumDevs(void);
-UINT waveInGetDevCaps(UINT uDeviceID, WAVEINCAPS * lpCaps,
-    UINT uSize);
-UINT waveInGetErrorText(UINT uError, LPSTR lpText, UINT uSize);
-UINT waveInOpen(HWAVEIN16 * lphWaveIn, UINT uDeviceID,
+UINT16 waveOutClose(HWAVEOUT16 hWaveOut);
+UINT16 waveOutPrepareHeader(HWAVEOUT16 hWaveOut,
+     WAVEHDR * lpWaveOutHdr, UINT16 uSize);
+UINT16 waveOutUnprepareHeader(HWAVEOUT16 hWaveOut,
+    WAVEHDR * lpWaveOutHdr, UINT16 uSize);
+UINT16 waveOutWrite(HWAVEOUT16 hWaveOut, WAVEHDR * lpWaveOutHdr,
+    UINT16 uSize);
+UINT16 waveOutPause(HWAVEOUT16 hWaveOut);
+UINT16 waveOutRestart(HWAVEOUT16 hWaveOut);
+UINT16 waveOutReset(HWAVEOUT16 hWaveOut);
+UINT16 waveOutBreakLoop(HWAVEOUT16 hWaveOut);
+UINT16 waveOutGetPosition(HWAVEOUT16 hWaveOut, MMTIME * lpInfo,
+    UINT16 uSize);
+UINT16 waveOutGetPitch(HWAVEOUT16 hWaveOut, DWORD * lpdwPitch);
+UINT16 waveOutSetPitch(HWAVEOUT16 hWaveOut, DWORD dwPitch);
+UINT16 waveOutGetPlaybackRate(HWAVEOUT16 hWaveOut, DWORD * lpdwRate);
+UINT16 waveOutSetPlaybackRate(HWAVEOUT16 hWaveOut, DWORD dwRate);
+UINT16 waveOutGetID(HWAVEOUT16 hWaveOut, UINT16 * lpuDeviceID);
+
+DWORD waveOutMessage(HWAVEOUT16 hWaveOut, UINT16 uMessage, DWORD dw1, DWORD dw2);
+
+UINT16 waveInGetNumDevs(void);
+UINT16 waveInGetDevCaps(UINT16 uDeviceID, WAVEINCAPS * lpCaps,
+    UINT16 uSize);
+UINT16 waveInGetErrorText(UINT16 uError, LPSTR lpText, UINT16 uSize);
+UINT16 waveInOpen(HWAVEIN16 * lphWaveIn, UINT16 uDeviceID,
     const LPWAVEFORMAT lpFormat, DWORD dwCallback, DWORD dwInstance, DWORD dwFlags);
-UINT waveInClose(HWAVEIN16 hWaveIn);
-UINT waveInPrepareHeader(HWAVEIN16 hWaveIn,
-    WAVEHDR * lpWaveInHdr, UINT uSize);
-UINT waveInUnprepareHeader(HWAVEIN16 hWaveIn,
-    WAVEHDR * lpWaveInHdr, UINT uSize);
-UINT waveInAddBuffer(HWAVEIN16 hWaveIn,
-    WAVEHDR * lpWaveInHdr, UINT uSize);
-UINT waveInStart(HWAVEIN16 hWaveIn);
-UINT waveInStop(HWAVEIN16 hWaveIn);
-UINT waveInReset(HWAVEIN16 hWaveIn);
-UINT waveInGetPosition(HWAVEIN16 hWaveIn, MMTIME * lpInfo,
-    UINT uSize);
-UINT waveInGetID(HWAVEIN16 hWaveIn, UINT * lpuDeviceID);
-
-DWORD waveInMessage(HWAVEIN16 hWaveIn, UINT uMessage, DWORD dw1, DWORD dw2);
+UINT16 waveInClose(HWAVEIN16 hWaveIn);
+UINT16 waveInPrepareHeader(HWAVEIN16 hWaveIn,
+    WAVEHDR * lpWaveInHdr, UINT16 uSize);
+UINT16 waveInUnprepareHeader(HWAVEIN16 hWaveIn,
+    WAVEHDR * lpWaveInHdr, UINT16 uSize);
+UINT16 waveInAddBuffer(HWAVEIN16 hWaveIn,
+    WAVEHDR * lpWaveInHdr, UINT16 uSize);
+UINT16 waveInStart(HWAVEIN16 hWaveIn);
+UINT16 waveInStop(HWAVEIN16 hWaveIn);
+UINT16 waveInReset(HWAVEIN16 hWaveIn);
+UINT16 waveInGetPosition(HWAVEIN16 hWaveIn, MMTIME * lpInfo,
+    UINT16 uSize);
+UINT16 waveInGetID(HWAVEIN16 hWaveIn, UINT16 * lpuDeviceID);
+
+DWORD waveInMessage(HWAVEIN16 hWaveIn, UINT16 uMessage, DWORD dw1, DWORD dw2);
 
 #define MIDIERR_UNPREPARED    (MIDIERR_BASE + 0)   /* header not prepared */
 #define MIDIERR_STILLPLAYING  (MIDIERR_BASE + 1)   /* still something playing */
@@ -327,14 +327,14 @@ typedef WORD *LPKEYARRAY;
 #define MIDI_UNCACHE        4
 
 typedef struct {
-    UINT    wMid;                  /* manufacturer ID */
-    UINT    wPid;                  /* product ID */
+    UINT16    wMid;                  /* manufacturer ID */
+    UINT16    wPid;                  /* product ID */
     VERSION vDriverVersion;        /* version of the driver */
     char    szPname[MAXPNAMELEN];  /* product name (NULL terminated string) */
-    UINT    wTechnology;           /* type of device */
-    UINT    wVoices;               /* # of voices (internal synth only) */
-    UINT    wNotes;                /* max # of notes (internal synth only) */
-    UINT    wChannelMask;          /* channels used (internal synth only) */
+    UINT16    wTechnology;           /* type of device */
+    UINT16    wVoices;               /* # of voices (internal synth only) */
+    UINT16    wNotes;                /* max # of notes (internal synth only) */
+    UINT16    wChannelMask;          /* channels used (internal synth only) */
     DWORD   dwSupport;             /* functionality supported by driver */
 } MIDIOUTCAPS, *LPMIDIOUTCAPS;
 
@@ -349,8 +349,8 @@ typedef struct {
 #define MIDICAPS_CACHE           0x0004
 
 typedef struct {
-    UINT    wMid;                  /* manufacturer ID */
-    UINT    wPid;                  /* product ID */
+    UINT16    wMid;                  /* manufacturer ID */
+    UINT16    wPid;                  /* product ID */
     VERSION vDriverVersion;        /* version of the driver */
     char    szPname[MAXPNAMELEN];  /* product name (NULL terminated string) */
 } MIDIINCAPS, *LPMIDIINCAPS;
@@ -369,60 +369,60 @@ typedef struct {
 #define MHDR_PREPARED   0x00000002       /* set if header prepared */
 #define MHDR_INQUEUE    0x00000004       /* reserved for driver */
 
-UINT midiOutGetNumDevs(void);
-UINT midiOutGetDevCaps(UINT uDeviceID,
-    MIDIOUTCAPS * lpCaps, UINT uSize);
-UINT midiOutGetVolume(UINT uDeviceID, DWORD * lpdwVolume);
-UINT midiOutSetVolume(UINT uDeviceID, DWORD dwVolume);
-UINT midiOutGetErrorText(UINT uError, LPSTR lpText, UINT uSize);
-UINT midiGetErrorText(UINT uError, LPSTR lpText, UINT uSize);
-UINT midiOutOpen(HMIDIOUT16 * lphMidiOut, UINT uDeviceID,
+UINT16 midiOutGetNumDevs(void);
+UINT16 midiOutGetDevCaps(UINT16 uDeviceID,
+    MIDIOUTCAPS * lpCaps, UINT16 uSize);
+UINT16 midiOutGetVolume(UINT16 uDeviceID, DWORD * lpdwVolume);
+UINT16 midiOutSetVolume(UINT16 uDeviceID, DWORD dwVolume);
+UINT16 midiOutGetErrorText(UINT16 uError, LPSTR lpText, UINT16 uSize);
+UINT16 midiGetErrorText(UINT16 uError, LPSTR lpText, UINT16 uSize);
+UINT16 midiOutOpen(HMIDIOUT16 * lphMidiOut, UINT16 uDeviceID,
     DWORD dwCallback, DWORD dwInstance, DWORD dwFlags);
-UINT midiOutClose(HMIDIOUT16 hMidiOut);
-UINT midiOutPrepareHeader(HMIDIOUT16 hMidiOut,
-    MIDIHDR * lpMidiOutHdr, UINT uSize);
-UINT midiOutUnprepareHeader(HMIDIOUT16 hMidiOut,
-    MIDIHDR * lpMidiOutHdr, UINT uSize);
-UINT midiOutShortMsg(HMIDIOUT16 hMidiOut, DWORD dwMsg);
-UINT midiOutLongMsg(HMIDIOUT16 hMidiOut,
-    MIDIHDR * lpMidiOutHdr, UINT uSize);
-UINT midiOutReset(HMIDIOUT16 hMidiOut);
-UINT midiOutCachePatches(HMIDIOUT16 hMidiOut,
-    UINT uBank, WORD * lpwPatchArray, UINT uFlags);
-UINT midiOutCacheDrumPatches(HMIDIOUT16 hMidiOut,
-    UINT uPatch, WORD * lpwKeyArray, UINT uFlags);
-UINT midiOutGetID(HMIDIOUT16 hMidiOut, UINT * lpuDeviceID);
-
-DWORD midiOutMessage(HMIDIOUT16 hMidiOut, UINT uMessage, DWORD dw1, DWORD dw2);
-
-UINT midiInGetNumDevs(void);
-UINT midiInGetDevCaps(UINT uDeviceID,
-    LPMIDIINCAPS lpCaps, UINT uSize);
-UINT midiInGetErrorText(UINT uError, LPSTR lpText, UINT uSize);
-UINT midiInOpen(HMIDIIN16 * lphMidiIn, UINT uDeviceID,
+UINT16 midiOutClose(HMIDIOUT16 hMidiOut);
+UINT16 midiOutPrepareHeader(HMIDIOUT16 hMidiOut,
+    MIDIHDR * lpMidiOutHdr, UINT16 uSize);
+UINT16 midiOutUnprepareHeader(HMIDIOUT16 hMidiOut,
+    MIDIHDR * lpMidiOutHdr, UINT16 uSize);
+UINT16 midiOutShortMsg(HMIDIOUT16 hMidiOut, DWORD dwMsg);
+UINT16 midiOutLongMsg(HMIDIOUT16 hMidiOut,
+    MIDIHDR * lpMidiOutHdr, UINT16 uSize);
+UINT16 midiOutReset(HMIDIOUT16 hMidiOut);
+UINT16 midiOutCachePatches(HMIDIOUT16 hMidiOut,
+    UINT16 uBank, WORD * lpwPatchArray, UINT16 uFlags);
+UINT16 midiOutCacheDrumPatches(HMIDIOUT16 hMidiOut,
+    UINT16 uPatch, WORD * lpwKeyArray, UINT16 uFlags);
+UINT16 midiOutGetID(HMIDIOUT16 hMidiOut, UINT16 * lpuDeviceID);
+
+DWORD midiOutMessage(HMIDIOUT16 hMidiOut, UINT16 uMessage, DWORD dw1, DWORD dw2);
+
+UINT16 midiInGetNumDevs(void);
+UINT16 midiInGetDevCaps(UINT16 uDeviceID,
+    LPMIDIINCAPS lpCaps, UINT16 uSize);
+UINT16 midiInGetErrorText(UINT16 uError, LPSTR lpText, UINT16 uSize);
+UINT16 midiInOpen(HMIDIIN16 * lphMidiIn, UINT16 uDeviceID,
     DWORD dwCallback, DWORD dwInstance, DWORD dwFlags);
-UINT midiInClose(HMIDIIN16 hMidiIn);
-UINT midiInPrepareHeader(HMIDIIN16 hMidiIn,
-    MIDIHDR * lpMidiInHdr, UINT uSize);
-UINT midiInUnprepareHeader(HMIDIIN16 hMidiIn,
-    MIDIHDR * lpMidiInHdr, UINT uSize);
-UINT midiInAddBuffer(HMIDIIN16 hMidiIn,
-    MIDIHDR * lpMidiInHdr, UINT uSize);
-UINT midiInStart(HMIDIIN16 hMidiIn);
-UINT midiInStop(HMIDIIN16 hMidiIn);
-UINT midiInReset(HMIDIIN16 hMidiIn);
-UINT midiInGetID(HMIDIIN16 hMidiIn, UINT * lpuDeviceID);
-
-DWORD midiInMessage(HMIDIIN16 hMidiIn, UINT uMessage, DWORD dw1, DWORD dw2);
+UINT16 midiInClose(HMIDIIN16 hMidiIn);
+UINT16 midiInPrepareHeader(HMIDIIN16 hMidiIn,
+    MIDIHDR * lpMidiInHdr, UINT16 uSize);
+UINT16 midiInUnprepareHeader(HMIDIIN16 hMidiIn,
+    MIDIHDR * lpMidiInHdr, UINT16 uSize);
+UINT16 midiInAddBuffer(HMIDIIN16 hMidiIn,
+    MIDIHDR * lpMidiInHdr, UINT16 uSize);
+UINT16 midiInStart(HMIDIIN16 hMidiIn);
+UINT16 midiInStop(HMIDIIN16 hMidiIn);
+UINT16 midiInReset(HMIDIIN16 hMidiIn);
+UINT16 midiInGetID(HMIDIIN16 hMidiIn, UINT16 * lpuDeviceID);
+
+DWORD midiInMessage(HMIDIIN16 hMidiIn, UINT16 uMessage, DWORD dw1, DWORD dw2);
 
 #define AUX_MAPPER     (-1)
 
 typedef struct {
-    UINT    wMid;                  /* manufacturer ID */
-    UINT    wPid;                  /* product ID */
+    UINT16    wMid;                  /* manufacturer ID */
+    UINT16    wPid;                  /* product ID */
     VERSION vDriverVersion;        /* version of the driver */
     char    szPname[MAXPNAMELEN];  /* product name (NULL terminated string) */
-    UINT    wTechnology;           /* type of device */
+    UINT16    wTechnology;           /* type of device */
     DWORD   dwSupport;             /* functionality supported by driver */
 } AUXCAPS, *LPAUXCAPS;
 
@@ -432,35 +432,35 @@ typedef struct {
 #define AUXCAPS_VOLUME          0x0001  /* supports volume control */
 #define AUXCAPS_LRVOLUME        0x0002  /* separate left-right volume control */
 
-UINT auxGetNumDevs(void);
-UINT auxGetDevCaps(UINT uDeviceID, AUXCAPS * lpCaps, UINT uSize);
-UINT auxSetVolume(UINT uDeviceID, DWORD dwVolume);
-UINT auxGetVolume(UINT uDeviceID, DWORD * lpdwVolume);
+UINT16 auxGetNumDevs(void);
+UINT16 auxGetDevCaps(UINT16 uDeviceID, AUXCAPS * lpCaps, UINT16 uSize);
+UINT16 auxSetVolume(UINT16 uDeviceID, DWORD dwVolume);
+UINT16 auxGetVolume(UINT16 uDeviceID, DWORD * lpdwVolume);
 
-DWORD auxOutMessage(UINT uDeviceID, UINT uMessage, DWORD dw1, DWORD dw2);
+DWORD auxOutMessage(UINT16 uDeviceID, UINT16 uMessage, DWORD dw1, DWORD dw2);
 
 #define TIMERR_NOERROR        (0)                  /* no error */
 #define TIMERR_NOCANDO        (TIMERR_BASE+1)      /* request not completed */
 #define TIMERR_STRUCT         (TIMERR_BASE+33)     /* time struct size */
 
-typedef void (*LPTIMECALLBACK) (UINT uTimerID, UINT uMessage, DWORD dwUser, DWORD dw1, DWORD dw2);
+typedef void (*LPTIMECALLBACK) (UINT16 uTimerID, UINT16 uMessage, DWORD dwUser, DWORD dw1, DWORD dw2);
 
 #define TIME_ONESHOT    0   /* program timer for single event */
 #define TIME_PERIODIC   1   /* program for continuous periodic event */
 
 typedef struct {
-    UINT    wPeriodMin;     /* minimum period supported  */
-    UINT    wPeriodMax;     /* maximum period supported  */
+    UINT16    wPeriodMin;     /* minimum period supported  */
+    UINT16    wPeriodMax;     /* maximum period supported  */
 } TIMECAPS, *LPTIMECAPS;
 
-UINT timeGetSystemTime(MMTIME * lpTime, UINT uSize);
+UINT16 timeGetSystemTime(MMTIME * lpTime, UINT16 uSize);
 DWORD timeGetTime(void);
-UINT timeSetEvent(UINT uDelay, UINT uResolution,
-    LPTIMECALLBACK lpFunction, DWORD dwUser, UINT uFlags);
-UINT timeKillEvent(UINT uTimerID);
-UINT timeGetDevCaps(TIMECAPS * lpTimeCaps, UINT uSize);
-UINT timeBeginPeriod(UINT uPeriod);
-UINT timeEndPeriod(UINT uPeriod);
+UINT16 timeSetEvent(UINT16 uDelay, UINT16 uResolution,
+    LPTIMECALLBACK lpFunction, DWORD dwUser, UINT16 uFlags);
+UINT16 timeKillEvent(UINT16 uTimerID);
+UINT16 timeGetDevCaps(TIMECAPS * lpTimeCaps, UINT16 uSize);
+UINT16 timeBeginPeriod(UINT16 uPeriod);
+UINT16 timeEndPeriod(UINT16 uPeriod);
 
 #define JOYERR_NOERROR        (0)                  /* no error */
 #define JOYERR_PARMS          (JOYERR_BASE+5)      /* bad parameters */
@@ -480,35 +480,35 @@ UINT timeEndPeriod(UINT uPeriod);
 #define JOYSTICKID2         1
 
 typedef struct {
-    UINT wMid;                  /* manufacturer ID */
-    UINT wPid;                  /* product ID */
+    UINT16 wMid;                  /* manufacturer ID */
+    UINT16 wPid;                  /* product ID */
     char szPname[MAXPNAMELEN];  /* product name (NULL terminated string) */
-    UINT wXmin;                 /* minimum x position value */
-    UINT wXmax;                 /* maximum x position value */
-    UINT wYmin;                 /* minimum y position value */
-    UINT wYmax;                 /* maximum y position value */
-    UINT wZmin;                 /* minimum z position value */
-    UINT wZmax;                 /* maximum z position value */
-    UINT wNumButtons;           /* number of buttons */
-    UINT wPeriodMin;            /* minimum message period when captured */
-    UINT wPeriodMax;            /* maximum message period when captured */
+    UINT16 wXmin;                 /* minimum x position value */
+    UINT16 wXmax;                 /* maximum x position value */
+    UINT16 wYmin;                 /* minimum y position value */
+    UINT16 wYmax;                 /* maximum y position value */
+    UINT16 wZmin;                 /* minimum z position value */
+    UINT16 wZmax;                 /* maximum z position value */
+    UINT16 wNumButtons;           /* number of buttons */
+    UINT16 wPeriodMin;            /* minimum message period when captured */
+    UINT16 wPeriodMax;            /* maximum message period when captured */
 } JOYCAPS, *LPJOYCAPS;
 
 typedef struct {
-    UINT wXpos;                 /* x position */
-    UINT wYpos;                 /* y position */
-    UINT wZpos;                 /* z position */
-    UINT wButtons;              /* button states */
+    UINT16 wXpos;                 /* x position */
+    UINT16 wYpos;                 /* y position */
+    UINT16 wZpos;                 /* z position */
+    UINT16 wButtons;              /* button states */
 } JOYINFO, *LPJOYINFO;
 
-UINT joyGetDevCaps(UINT uJoyID, JOYCAPS * lpCaps, UINT uSize);
-UINT joyGetNumDevs(void);
-UINT joyGetPos(UINT uJoyID, JOYINFO * lpInfo);
-UINT joyGetThreshold(UINT uJoyID, UINT * lpuThreshold);
-UINT joyReleaseCapture(UINT uJoyID);
-UINT joySetCapture(HWND16 hwnd, UINT uJoyID, UINT uPeriod,
-    BOOL bChanged);
-UINT joySetThreshold(UINT uJoyID, UINT uThreshold);
+UINT16 joyGetDevCaps(UINT16 uJoyID, JOYCAPS * lpCaps, UINT16 uSize);
+UINT16 joyGetNumDevs(void);
+UINT16 joyGetPos(UINT16 uJoyID, JOYINFO * lpInfo);
+UINT16 joyGetThreshold(UINT16 uJoyID, UINT16 * lpuThreshold);
+UINT16 joyReleaseCapture(UINT16 uJoyID);
+UINT16 joySetCapture(HWND16 hwnd, UINT16 uJoyID, UINT16 uPeriod,
+    BOOL16 bChanged);
+UINT16 joySetThreshold(UINT16 uJoyID, UINT16 uThreshold);
 
 #define MMIOERR_BASE            256
 #define MMIOERR_FILENOTFOUND    (MMIOERR_BASE + 1)  /* file not found */
@@ -525,14 +525,14 @@ UINT joySetThreshold(UINT uJoyID, UINT uThreshold);
 #define CFSEPCHAR       '+'             /* compound file name separator char. */
 
 typedef DWORD           FOURCC;         /* a four character code */
-typedef LONG (*LPMMIOPROC)(LPSTR lpmmioinfo, UINT uMessage,
+typedef LONG (*LPMMIOPROC)(LPSTR lpmmioinfo, UINT16 uMessage,
             LPARAM lParam1, LPARAM lParam2);
 
 typedef struct {
         DWORD           dwFlags;        /* general status flags */
         FOURCC          fccIOProc;      /* pointer to I/O procedure */
         LPMMIOPROC      pIOProc;        /* pointer to I/O procedure */
-        UINT            wErrorRet;      /* place for error to be returned */
+        UINT16            wErrorRet;      /* place for error to be returned */
         HTASK16         htask;          /* alternate local task */
         /* fields maintained by MMIO functions during buffered I/O */
         LONG            cchBuffer;      /* size of I/O buffer (or 0L) */
@@ -621,48 +621,48 @@ typedef struct _MMCKINFO
                 ( (DWORD)(BYTE)(ch0) | ( (DWORD)(BYTE)(ch1) << 8 ) |    \
                 ( (DWORD)(BYTE)(ch2) << 16 ) | ( (DWORD)(BYTE)(ch3) << 24 ) )
 
-FOURCC mmioStringToFOURCC(LPCSTR sz, UINT uFlags);
+FOURCC mmioStringToFOURCC(LPCSTR sz, UINT16 uFlags);
 LPMMIOPROC mmioInstallIOProc(FOURCC fccIOProc, LPMMIOPROC pIOProc,
     DWORD dwFlags);
 HMMIO16 mmioOpen(LPSTR szFileName, MMIOINFO * lpmmioinfo,
     DWORD dwOpenFlags);
 
-UINT mmioRename(LPCSTR szFileName, LPCSTR szNewFileName,
+UINT16 mmioRename(LPCSTR szFileName, LPCSTR szNewFileName,
      MMIOINFO * lpmmioinfo, DWORD dwRenameFlags);
 
-UINT mmioClose(HMMIO16 hmmio, UINT uFlags);
+UINT16 mmioClose(HMMIO16 hmmio, UINT16 uFlags);
 LONG mmioRead(HMMIO16 hmmio, HPSTR pch, LONG cch);
 LONG mmioWrite(HMMIO16 hmmio, HPCSTR pch, LONG cch);
 LONG mmioSeek(HMMIO16 hmmio, LONG lOffset, int iOrigin);
-UINT mmioGetInfo(HMMIO16 hmmio, MMIOINFO * lpmmioinfo, UINT uFlags);
-UINT mmioSetInfo(HMMIO16 hmmio, const MMIOINFO * lpmmioinfo, UINT uFlags);
-UINT mmioSetBuffer(HMMIO16 hmmio, LPSTR pchBuffer, LONG cchBuffer,
-    UINT uFlags);
-UINT mmioFlush(HMMIO16 hmmio, UINT uFlags);
-UINT mmioAdvance(HMMIO16 hmmio, MMIOINFO * lpmmioinfo, UINT uFlags);
-LONG mmioSendMessage(HMMIO16 hmmio, UINT uMessage,
+UINT16 mmioGetInfo(HMMIO16 hmmio, MMIOINFO * lpmmioinfo, UINT16 uFlags);
+UINT16 mmioSetInfo(HMMIO16 hmmio, const MMIOINFO * lpmmioinfo, UINT16 uFlags);
+UINT16 mmioSetBuffer(HMMIO16 hmmio, LPSTR pchBuffer, LONG cchBuffer,
+    UINT16 uFlags);
+UINT16 mmioFlush(HMMIO16 hmmio, UINT16 uFlags);
+UINT16 mmioAdvance(HMMIO16 hmmio, MMIOINFO * lpmmioinfo, UINT16 uFlags);
+LONG mmioSendMessage(HMMIO16 hmmio, UINT16 uMessage,
     LPARAM lParam1, LPARAM lParam2);
-UINT mmioDescend(HMMIO16 hmmio, MMCKINFO * lpck,
-    const MMCKINFO * lpckParent, UINT uFlags);
-UINT mmioAscend(HMMIO16 hmmio, MMCKINFO * lpck, UINT uFlags);
-UINT mmioCreateChunk(HMMIO16 hmmio, MMCKINFO * lpck, UINT uFlags);
+UINT16 mmioDescend(HMMIO16 hmmio, MMCKINFO * lpck,
+    const MMCKINFO * lpckParent, UINT16 uFlags);
+UINT16 mmioAscend(HMMIO16 hmmio, MMCKINFO * lpck, UINT16 uFlags);
+UINT16 mmioCreateChunk(HMMIO16 hmmio, MMCKINFO * lpck, UINT16 uFlags);
 
-typedef UINT (*YIELDPROC) (UINT uDeviceID, DWORD dwYieldData);
+typedef UINT16 (*YIELDPROC) (UINT16 uDeviceID, DWORD dwYieldData);
 
-DWORD mciSendCommand (UINT uDeviceID, UINT uMessage,
+DWORD mciSendCommand (UINT16 uDeviceID, UINT16 uMessage,
     DWORD dwParam1, DWORD dwParam2);
 DWORD mciSendString (LPCSTR lpstrCommand,
-    LPSTR lpstrReturnString, UINT uReturnLength, HWND16 hwndCallback);
-UINT mciGetDeviceID (LPCSTR lpstrName);
-UINT mciGetDeviceIDFromElementID (DWORD dwElementID,
+    LPSTR lpstrReturnString, UINT16 uReturnLength, HWND16 hwndCallback);
+UINT16 mciGetDeviceID (LPCSTR lpstrName);
+UINT16 mciGetDeviceIDFromElementID (DWORD dwElementID,
     LPCSTR lpstrType);
-BOOL mciGetErrorString (DWORD wError, LPSTR lpstrBuffer,
-    UINT uLength);
-BOOL mciSetYieldProc (UINT uDeviceID, YIELDPROC fpYieldProc,
+BOOL16 mciGetErrorString (DWORD wError, LPSTR lpstrBuffer,
+    UINT16 uLength);
+BOOL16 mciSetYieldProc (UINT16 uDeviceID, YIELDPROC fpYieldProc,
     DWORD dwYieldData);
 
-HTASK16 mciGetCreatorTask(UINT uDeviceID);
-YIELDPROC mciGetYieldProc (UINT uDeviceID, DWORD * lpdwYieldData);
+HTASK16 mciGetCreatorTask(UINT16 uDeviceID);
+YIELDPROC mciGetYieldProc (UINT16 uDeviceID, DWORD * lpdwYieldData);
 
 #define MCIERR_INVALID_DEVICE_ID        (MCIERR_BASE + 1)
 #define MCIERR_UNRECOGNIZED_KEYWORD     (MCIERR_BASE + 3)
@@ -928,11 +928,11 @@ typedef struct {
 
 typedef struct {
 	DWORD   dwCallback;
-	UINT    wDeviceID;
-	UINT    wReserved0;
-	LPCSTR  lpstrDeviceType;
-	LPCSTR  lpstrElementName;
-	LPCSTR  lpstrAlias;
+	UINT16  wDeviceID;
+	UINT16  wReserved0;
+	SEGPTR  lpstrDeviceType;
+	SEGPTR  lpstrElementName;
+	SEGPTR  lpstrAlias;
 } MCI_OPEN_PARMS, *LPMCI_OPEN_PARMS;
 
 typedef struct {
@@ -970,8 +970,8 @@ typedef struct {
 	LPSTR   lpstrReturn;
 	DWORD   dwRetSize;
 	DWORD   dwNumber;
-	UINT    wDeviceType;
-	UINT    wReserved0;
+	UINT16    wDeviceType;
+	UINT16    wReserved0;
 } MCI_SYSINFO_PARMS, *LPMCI_SYSINFO_PARMS;
 
 typedef struct {
@@ -983,9 +983,9 @@ typedef struct {
 typedef struct {
 	DWORD   dwCallback;
 	int     nVirtKey;
-	UINT    wReserved0;
+	UINT16    wReserved0;
 	HWND16  hwndBreak;
-	UINT    wReserved1;
+	UINT16    wReserved1;
 } MCI_BREAK_PARMS, *LPMCI_BREAK_PARMS;
 
 typedef struct {
@@ -1092,11 +1092,11 @@ typedef struct {
 
 typedef struct {
 	DWORD   dwCallback;
-	UINT    wDeviceID;
-	UINT    wReserved0;
-	LPCSTR  lpstrDeviceType;
-	LPCSTR  lpstrElementName;
-	LPCSTR  lpstrAlias;
+	UINT16  wDeviceID;
+	UINT16  wReserved0;
+	SEGPTR  lpstrDeviceType;
+	SEGPTR  lpstrElementName;
+	SEGPTR  lpstrAlias;
 	DWORD   dwBufferSeconds;
 } MCI_WAVE_OPEN_PARMS, *LPMCI_WAVE_OPEN_PARMS;
 
@@ -1110,20 +1110,20 @@ typedef struct {
 	DWORD   dwCallback;
 	DWORD   dwTimeFormat;
 	DWORD   dwAudio;
-	UINT    wInput;
-	UINT    wReserved0;
-	UINT    wOutput;
-	UINT    wReserved1;
-	UINT    wFormatTag;
-	UINT    wReserved2;
-	UINT    nChannels;
-	UINT    wReserved3;
+	UINT16    wInput;
+	UINT16    wReserved0;
+	UINT16    wOutput;
+	UINT16    wReserved1;
+	UINT16    wFormatTag;
+	UINT16    wReserved2;
+	UINT16    nChannels;
+	UINT16    wReserved3;
 	DWORD   nSamplesPerSec;
 	DWORD   nAvgBytesPerSec;
-	UINT    nBlockAlign;
-	UINT    wReserved4;
-	UINT    wBitsPerSample;
-	UINT    wReserved5;
+	UINT16    nBlockAlign;
+	UINT16    wReserved4;
+	UINT16    wBitsPerSample;
+	UINT16    wReserved5;
 } MCI_WAVE_SET_PARMS, * LPMCI_WAVE_SET_PARMS;
 
 #define     MCI_SEQ_DIV_PPQN            (0 + MCI_SEQ_OFFSET)
@@ -1213,14 +1213,14 @@ typedef struct {
 
 typedef struct {
 	DWORD   dwCallback;
-	UINT    wDeviceID;
-	UINT    wReserved0;
-	LPCSTR  lpstrDeviceType;
-	LPCSTR  lpstrElementName;
-	LPCSTR  lpstrAlias;
+	UINT16  wDeviceID;
+	UINT16  wReserved0;
+	SEGPTR  lpstrDeviceType;
+	SEGPTR  lpstrElementName;
+	SEGPTR  lpstrAlias;
 	DWORD   dwStyle;
 	HWND16  hWndParent;
-	UINT    wReserved1;
+	UINT16  wReserved1;
 } MCI_ANIM_OPEN_PARMS, *LPMCI_ANIM_OPEN_PARMS;
 
 typedef struct {
@@ -1238,9 +1238,9 @@ typedef struct {
 typedef struct {
 	DWORD   dwCallback;
 	HWND16  hWnd;
-	UINT    wReserved1;
-	UINT    nCmdShow;
-	UINT    wReserved2;
+	UINT16    wReserved1;
+	UINT16    nCmdShow;
+	UINT16    wReserved2;
 	LPCSTR  lpstrText;
 } MCI_ANIM_WINDOW_PARMS, *LPMCI_ANIM_WINDOW_PARMS;
 
@@ -1293,22 +1293,22 @@ typedef struct {
 
 typedef struct {
 	DWORD   dwCallback;
-	UINT    wDeviceID;
-	UINT    wReserved0;
+	UINT16    wDeviceID;
+	UINT16    wReserved0;
 	LPCSTR  lpstrDeviceType;
 	LPCSTR  lpstrElementName;
 	LPCSTR  lpstrAlias;
 	DWORD   dwStyle;
 	HWND16  hWndParent;
-	UINT    wReserved1;
+	UINT16    wReserved1;
 } MCI_OVLY_OPEN_PARMS, *LPMCI_OVLY_OPEN_PARMS;
 
 typedef struct {
 	DWORD   dwCallback;
 	HWND16  hWnd;
-	UINT    wReserved1;
-	UINT    nCmdShow;
-	UINT    wReserved2;
+	UINT16    wReserved1;
+	UINT16    nCmdShow;
+	UINT16    wReserved2;
 	LPCSTR  lpstrText;
 } MCI_OVLY_WINDOW_PARMS, *LPMCI_OVLY_WINDOW_PARMS;
 
@@ -1494,30 +1494,30 @@ typedef struct {
 } MIDIOPENDESC, *LPMIDIOPENDESC;
 
 typedef struct {
-	UINT			wDelay;
-	UINT			wResolution;
+	UINT16			wDelay;
+	UINT16			wResolution;
 	LPTIMECALLBACK	lpFunction;
 	DWORD			dwUser;
-	UINT			wFlags;
+	UINT16			wFlags;
 } TIMEREVENT, *LPTIMEREVENT;
 
 typedef struct {
-	UINT    wDeviceID;				/* device ID */
+	UINT16    wDeviceID;				/* device ID */
 	LPSTR 	lpstrParams;			/* parameter string for entry in SYSTEM.INI */
-	UINT    wCustomCommandTable;	/* custom command table (0xFFFF if none) */
+	UINT16    wCustomCommandTable;	/* custom command table (0xFFFF if none) */
 									/* filled in by the driver */
-	UINT    wType;					/* driver type */
+	UINT16    wType;					/* driver type */
 									/* filled in by the driver */
 } MCI_OPEN_DRIVER_PARMS, * LPMCI_OPEN_DRIVER_PARMS;
 
-DWORD mciGetDriverData(UINT uDeviceID);
-BOOL  mciSetDriverData(UINT uDeviceID, DWORD dwData);
-UINT  mciDriverYield(UINT uDeviceID);
-BOOL  mciDriverNotify(HWND16 hwndCallback, UINT uDeviceID,
-    UINT uStatus);
-UINT  mciLoadCommandResource(HINSTANCE16 hInstance,
-    LPCSTR lpResName, UINT uType);
-BOOL  mciFreeCommandResource(UINT uTable);
+DWORD mciGetDriverData(UINT16 uDeviceID);
+BOOL16  mciSetDriverData(UINT16 uDeviceID, DWORD dwData);
+UINT16  mciDriverYield(UINT16 uDeviceID);
+BOOL16  mciDriverNotify(HWND16 hwndCallback, UINT16 uDeviceID,
+                        UINT16 uStatus);
+UINT16  mciLoadCommandResource(HINSTANCE16 hInstance,
+                               LPCSTR lpResName, UINT16 uType);
+BOOL16  mciFreeCommandResource(UINT16 uTable);
 
 #define DCB_NULL		0x0000
 #define DCB_WINDOW		0x0001			/* dwCallback is a HWND */
@@ -1526,8 +1526,8 @@ BOOL  mciFreeCommandResource(UINT uTable);
 #define DCB_TYPEMASK	0x0007
 #define DCB_NOSWITCH	0x0008			/* don't switch stacks for callback */
 
-BOOL DriverCallback(DWORD dwCallBack, UINT uFlags, HANDLE16 hDev, 
-		WORD wMsg, DWORD dwUser, DWORD dwParam1, DWORD dwParam2);
+BOOL16 DriverCallback(DWORD dwCallBack, UINT16 uFlags, HANDLE16 hDev, 
+                      WORD wMsg, DWORD dwUser, DWORD dwParam1, DWORD dwParam2);
 DWORD auxMessage(WORD wDevID, WORD wMsg, DWORD dwUser, 
 					DWORD dwParam1, DWORD dwParam2);
 DWORD midMessage(WORD wDevID, WORD wMsg, DWORD dwUser, 
diff --git a/include/module.h b/include/module.h
index 953cdfbf97a..872b498f4b8 100644
--- a/include/module.h
+++ b/include/module.h
@@ -137,7 +137,7 @@ extern BOOL16 BUILTIN_ParseDLLOptions( const char *str );
 extern void BUILTIN_PrintDLLs(void);
 
 /* ne_image.c */
-extern BOOL16 NE_LoadSegment( HMODULE16 hModule, WORD segnum );
+extern BOOL32 NE_LoadSegment( HMODULE16 hModule, WORD segnum );
 extern void NE_FixupPrologs( NE_MODULE *pModule );
 extern void NE_InitializeDLLs( HMODULE16 hModule );
 
diff --git a/include/ole.h b/include/ole.h
index fdff577994f..0692ee05736 100644
--- a/include/ole.h
+++ b/include/ole.h
@@ -139,13 +139,13 @@ typedef enum {
 } OLE_RELEASE_METHOD;
 
 typedef struct _OLETARGETDEVICE {
-	UINT	otdDeviceNameOffset;
-	UINT	otdDriverNameOffset;
-	UINT	otdPortNameOffset;
-	UINT	otdExtDevmodeOffset;
-	UINT	otdExtDevmodeSize;
-	UINT	otdEnvironmentOffset;
-	UINT	otdEnvironmentSize;
+	UINT16	otdDeviceNameOffset;
+	UINT16	otdDriverNameOffset;
+	UINT16	otdPortNameOffset;
+	UINT16	otdExtDevmodeOffset;
+	UINT16	otdExtDevmodeSize;
+	UINT16	otdEnvironmentOffset;
+	UINT16	otdEnvironmentSize;
 	BYTE	otdData[1];
 	/* ... */
 } OLETARGETDEVICE;
@@ -206,8 +206,8 @@ typedef struct _OLECLIENT {
 typedef struct _OLEOBJECTVTBL {
         void *  	(*QueryProtocol)(LPOLEOBJECT,OLE_LPCSTR);
 	OLESTATUS	(*Release)(LPOLEOBJECT);
-	OLESTATUS	(*Show)(LPOLEOBJECT,BOOL);
-	OLESTATUS	(*DoVerb)(LPOLEOBJECT,UINT,BOOL,BOOL);
+	OLESTATUS	(*Show)(LPOLEOBJECT,BOOL16);
+	OLESTATUS	(*DoVerb)(LPOLEOBJECT,UINT16,BOOL16,BOOL16);
 	OLESTATUS	(*GetData)(LPOLEOBJECT,OLECLIPFORMAT,HANDLE16 *);
 	OLESTATUS	(*SetData)(LPOLEOBJECT,OLECLIPFORMAT,HANDLE16);
 	OLESTATUS	(*SetTargetDevice)(LPOLEOBJECT,HGLOBAL16);
@@ -222,8 +222,8 @@ typedef struct _OLEOBJECTVTBL {
 	OLESTATUS	(*Equal)(LPOLEOBJECT,LPOLEOBJECT);
 	OLESTATUS	(*CopyToClipBoard)(LPOLEOBJECT);
 	OLESTATUS	(*Draw)(LPOLEOBJECT,HDC16,LPRECT16,LPRECT16,HDC16);
-	OLESTATUS	(*Activate)(LPOLEOBJECT,UINT,BOOL,BOOL,HWND16,LPRECT16);
-	OLESTATUS	(*Execute)(LPOLEOBJECT,HGLOBAL16,UINT);
+	OLESTATUS	(*Activate)(LPOLEOBJECT,UINT16,BOOL16,BOOL16,HWND16,LPRECT16);
+	OLESTATUS	(*Execute)(LPOLEOBJECT,HGLOBAL16,UINT16);
 	OLESTATUS	(*Close)(LPOLEOBJECT);
 	OLESTATUS	(*Update)(LPOLEOBJECT);
 	OLESTATUS	(*Reconnect)(LPOLEOBJECT);
@@ -241,7 +241,7 @@ typedef struct _OLEOBJECTVTBL {
 	OLESTATUS	(*QueryReleaseError)(LPOLEOBJECT);
 	OLE_RELEASE_METHOD (*QueryReleaseMethod)(LPOLEOBJECT);
 	OLESTATUS	(*RequestData)(LPOLEOBJECT,OLECLIPFORMAT);
-	OLESTATUS	(*ObjectLong)(LPOLEOBJECT,UINT,LPLONG);
+	OLESTATUS	(*ObjectLong)(LPOLEOBJECT,UINT16,LPLONG);
 } OLEOBJECTVTBL;
 typedef OLEOBJECTVTBL*	LPOLEOBJECTVTBL;
 
@@ -251,7 +251,7 @@ typedef struct _OLEOBJECT {
 
 
 OLESTATUS OleRegisterServer(LPCSTR,LPOLESERVER,LHSERVER *,HINSTANCE16,OLE_SERVER_USE);
-OLESTATUS OleUnblockServer(LHSERVER,BOOL *);
+OLESTATUS OleUnblockServer(LHSERVER,BOOL16 *);
 OLESTATUS OleRegisterServerDoc(LHSERVER,LPCSTR,LPOLESERVERDOC,LHSERVERDOC *);
 OLESTATUS OleRegisterClientDoc(LPCSTR,LPCSTR,LONG,LHCLIENTDOC *);
 OLESTATUS OleRenameClientDoc(LHCLIENTDOC,LPCSTR);
diff --git a/include/options.h b/include/options.h
index 421f3e648a4..3f051d6f3d6 100644
--- a/include/options.h
+++ b/include/options.h
@@ -23,7 +23,8 @@ typedef enum
     LANG_Eo,  /* Esperanto */
     LANG_It,  /* Italian */
     LANG_Ko,  /* Korean */
-    LANG_Hu   /* Hungarian */
+    LANG_Hu,  /* Hungarian */
+    LANG_Pl   /* Polish */
 } WINE_LANGUAGE;
 
 typedef struct
diff --git a/include/peexe.h b/include/peexe.h
index c75450cbc89..d60affc973e 100644
--- a/include/peexe.h
+++ b/include/peexe.h
@@ -4,6 +4,7 @@
 #ifndef __WINE_PEEXE_H
 #define __WINE_PEEXE_H
 
+#include "wintypes.h"
 
 typedef struct _IMAGE_FILE_HEADER {
 	WORD	Machine;
diff --git a/include/selectors.h b/include/selectors.h
index 673a2f5e76f..cbb00ee04f8 100644
--- a/include/selectors.h
+++ b/include/selectors.h
@@ -18,38 +18,24 @@ extern WORD SELECTOR_ReallocBlock( WORD sel, const void *base, DWORD size,
                                    BOOL32 readonly );
 extern void SELECTOR_FreeBlock( WORD sel, WORD count );
 
-#ifndef WINELIB
-
-#ifdef linux
-#define WINE_DATA_SELECTOR 0x2b
-#define WINE_CODE_SELECTOR 0x23
-#endif  /* linux */
-
-#ifdef __NetBSD__
-#define WINE_DATA_SELECTOR 0x1f
-#define WINE_CODE_SELECTOR 0x17
-#endif  /* NetBSD */
-
-#ifdef __FreeBSD__
-#define WINE_DATA_SELECTOR 0x27
-#define WINE_CODE_SELECTOR 0x1f
-#endif  /* FreeBSD */
-
-#if defined(__svr4__) || defined(_SCO_DS)
-#define WINE_DATA_SELECTOR 0x1f
-#define WINE_CODE_SELECTOR 0x17
-#endif  /* svr4 || SCO_DS */
-
-#ifdef __EMX__ /* Is this always true? */
-#define WINE_DATA_SELECTOR 0x53
-#define WINE_CODE_SELECTOR 0x5b
-#endif  /* OS/2 */
-
-#else  /* WINELIB */
-
-#define WINE_DATA_SELECTOR 0x00
-#define WINE_CODE_SELECTOR 0x00
-
-#endif  /* WINELIB */
+#if defined(linux)
+# define WINE_DATA_SELECTOR 0x2b
+# define WINE_CODE_SELECTOR 0x23
+#elif defined(__NetBSD__)
+# define WINE_DATA_SELECTOR 0x1f
+# define WINE_CODE_SELECTOR 0x17
+#elif defined(__FreeBSD__)
+# define WINE_DATA_SELECTOR 0x27
+# define WINE_CODE_SELECTOR 0x1f
+#elif defined(__svr4__) || defined(_SCO_DS)
+# define WINE_DATA_SELECTOR 0x1f
+# define WINE_CODE_SELECTOR 0x17
+#elif defined(__EMX__)
+# define WINE_DATA_SELECTOR 0x53 /* Is this always true? */
+# define WINE_CODE_SELECTOR 0x5b
+#else
+# define WINE_DATA_SELECTOR 0x00
+# define WINE_CODE_SELECTOR 0x00
+#endif
 
 #endif /* __WINE_SELECTORS_H */
diff --git a/include/static.h b/include/static.h
index c664cc45ef6..45a8fff02ff 100644
--- a/include/static.h
+++ b/include/static.h
@@ -17,6 +17,7 @@ typedef struct
     HICON16  hIcon;   /* Icon handle for SS_ICON controls */ 
 } STATICINFO;
 
-extern LRESULT StaticWndProc(HWND16 hWnd,UINT uMsg,WPARAM16 wParam,LPARAM lParam );
+extern LRESULT StaticWndProc( HWND16 hWnd, UINT16 uMsg, WPARAM16 wParam,
+                              LPARAM lParam );
 
 #endif  /* __WINE_STATIC_H */
diff --git a/include/stddebug.h b/include/stddebug.h
index d09f25d2116..46c012ce2af 100644
--- a/include/stddebug.h
+++ b/include/stddebug.h
@@ -148,6 +148,7 @@
 #undef DEBUG_TIMER
 #undef DEBUG_TOOLHELP
 #undef DEBUG_VER
+#undef DEBUG_VIRTUAL
 #undef DEBUG_VXD
 #undef DEBUG_WIN
 #undef DEBUG_WIN16DRV
@@ -228,6 +229,7 @@
 #define DEBUG_TIMER
 #define DEBUG_TOOLHELP
 #define DEBUG_VER
+#define DEBUG_VIRTUAL
 #define DEBUG_VXD
 #define DEBUG_WIN
 #define DEBUG_WIN16DRV
diff --git a/include/stress.h b/include/stress.h
index 0d1ef930bcc..86f718c817d 100644
--- a/include/stress.h
+++ b/include/stress.h
@@ -11,16 +11,16 @@ extern "C" {
 #define EDS_CUR		2
 #define EDS_TEMP	3
 
-BOOL	AllocGDIMem(UINT);
-BOOL	AllocMem(DWORD);
-BOOL	AllocUserMem(UINT);
-int	AllocDiskSpace(long, UINT);
+BOOL16	AllocGDIMem(UINT16);
+BOOL16	AllocMem(DWORD);
+BOOL16	AllocUserMem(UINT16);
+int	AllocDiskSpace(long, UINT16);
 int	AllocFileHandles(int);
 int	GetFreeFileHandles(void);
 void	FreeAllGDIMem(void);
 void	FreeAllMem(void);
 void	FreeAllUserMem(void);
-void	UnAllocDiskSpace(UINT);
+void	UnAllocDiskSpace(UINT16);
 void	UnAllocFileHandles(void);
 
 #ifdef __cplusplus
diff --git a/include/toolhelp.h b/include/toolhelp.h
index dbebe8176a5..fbf21a8b529 100644
--- a/include/toolhelp.h
+++ b/include/toolhelp.h
@@ -8,6 +8,8 @@
 #define MAX_PATH	255
 #define MAX_CLASSNAME	255
 
+#pragma pack(1)
+
 /* Global heap */
 
 typedef struct
@@ -343,4 +345,7 @@ struct {
     FARPROC16   lpfnErrorAddr;
     void      **lpBadParam;
 } NFYLOGPARAMERROR;
+
+#pragma pack(4)
+
 #endif /* __WINE_TOOLHELP_H */
diff --git a/include/w32sys.h b/include/w32sys.h
index 6388b6c20d4..94c8d29af78 100644
--- a/include/w32sys.h
+++ b/include/w32sys.h
@@ -8,10 +8,10 @@
 #define __WINE__W32SYS_H
 
 typedef struct _WIN32SINFO {
-    BYTE bMajor;
-    BYTE bMinor;
-    WORD wBuildNumber;
-    BOOL fDebug;
+    BYTE   bMajor;
+    BYTE   bMinor;
+    WORD   wBuildNumber;
+    BOOL16 fDebug;
 } WIN32SINFO, *LPWIN32SINFO;
 
 #endif /* __WINE_W32SYS_H */
diff --git a/include/win16drv.h b/include/win16drv.h
index c6d734937bc..6b2c8a8a65e 100644
--- a/include/win16drv.h
+++ b/include/win16drv.h
@@ -161,4 +161,7 @@ extern BOOL32 WIN16DRV_GetTextMetrics( DC *dc, TEXTMETRIC32A *metrics );
 extern BOOL32 WIN16DRV_ExtTextOut( DC *dc, INT32 x, INT32 y, UINT32 flags,
                                   const RECT32 *lprect, LPCSTR str, UINT32 count,
                                   const INT32 *lpDx );
+extern HGDIOBJ32 WIN16DRV_SelectObject( DC *dc, HGDIOBJ32 handle );
+
+
 #endif  /* __WINE_WIN16DRV_H */
diff --git a/include/winbase.h b/include/winbase.h
index 45ce7548b3a..ed071eb8177 100644
--- a/include/winbase.h
+++ b/include/winbase.h
@@ -29,6 +29,10 @@
 #define MEM_MAPPED              0x00040000
 #define MEM_TOP_DOWN            0x00100000
 
+#define FILE_BEGIN              0
+#define FILE_CURRENT            1
+#define FILE_END                2
+
 #define FILE_CASE_SENSITIVE_SEARCH      0x00000001
 #define FILE_CASE_PRESERVED_NAMES       0x00000002
 #define FILE_UNICODE_ON_DISK            0x00000004
diff --git a/include/windows.h b/include/windows.h
index 3bc9505c36b..6448f636312 100644
--- a/include/windows.h
+++ b/include/windows.h
@@ -1426,6 +1426,45 @@ DECL_WINELIB_TYPE_AW(FONTENUMPROCEX);
 #define ETO_OPAQUE          0x02
 #define ETO_CLIPPED         0x04
 
+typedef struct
+{
+    UINT16	gmBlackBoxX;
+    UINT16	gmBlackBoxY;
+    POINT16	gmptGlyphOrigin;
+    INT16	gmCellIncX;
+    INT16	gmCellIncY;
+} GLYPHMETRICS16, *LPGLYPHMETRICS16;
+
+typedef struct
+{
+    UINT32	gmBlackBoxX;
+    UINT32	gmBlackBoxY;
+    POINT32	gmptGlyphOrigin;
+    INT16	gmCellIncX;
+    INT16	gmCellIncY;
+} GLYPHMETRICS32, *LPGLYPHMETRICS32;
+
+DECL_WINELIB_TYPE(GLYPHMETRICS);
+DECL_WINELIB_TYPE(LPGLYPHMETRICS);
+
+#define GGO_METRICS         0
+#define GGO_BITMAP          1
+#define GGO_NATIVE          2
+
+typedef struct
+{
+    UINT16  fract;
+    INT16   value;
+} FIXED;
+
+typedef struct
+{
+     FIXED  eM11;
+     FIXED  eM12;
+     FIXED  eM21;
+     FIXED  eM22;
+} MAT2, *LPMAT2;
+
   /* for GetCharABCWidths() */
 typedef struct
 {
@@ -1447,9 +1486,9 @@ DECL_WINELIB_TYPE(LPABC);
   /* Rasterizer status */
 typedef struct
 {
-    WORD nSize;
-    WORD wFlags;
-    WORD nLanguageID;
+    INT16 nSize;
+    INT16 wFlags;
+    INT16 nLanguageID;
 } RASTERIZER_STATUS, *LPRASTERIZER_STATUS;
 
 #define TT_AVAILABLE        0x0001
@@ -1716,8 +1755,41 @@ DECL_WINELIB_TYPE(LPLOGPEN);
 #define SM_MENUDROPALIGNMENT  40
 #define SM_PENWINDOWS         41
 #define SM_DBCSENABLED        42
-
-#define SM_CMETRICS           43
+#define SM_CMOUSEBUTTONS      43
+#define SM_CXFIXEDFRAME	      SM_CXDLGFRAME
+#define SM_CYFIXEDFRAME	      SM_CYDLGFRAME
+#define SM_CXSIZEFRAME	      SM_CXFRAME
+#define SM_CYSIZEFRAME	      SM_CYFRAME
+#define SM_SECURE	      44
+#define SM_CXEDGE	      45
+#define SM_CYEDGE	      46
+#define SM_CXMINSPACING	      47
+#define SM_CYMINSPACING	      48
+#define SM_CXSMICON	      49
+#define SM_CYSMICON	      50
+#define SM_CYSMCAPTION	      51
+#define SM_CXSMSIZE	      52
+#define SM_CYSMSIZE	      53
+#define SM_CXMENUSIZE	      54
+#define SM_CYMENUSIZE	      55
+#define SM_ARRANGE	      56
+#define SM_CXMINIMIZED	      57
+#define SM_CYMINIMIZED	      58
+#define SM_CXMAXTRACK	      59
+#define SM_CYMAXTRACK	      60
+#define SM_CXMAXIMIZED	      61
+#define SM_CYMAXIMIZED	      62
+#define SM_NETWORK	      63
+#define SM_CLEANBOOT	      67
+#define SM_CXDRAG	      68
+#define SM_CYDRAG	      69
+#define SM_SHOWSOUNDS	      70
+#define SM_CXMENUCHECK	      71
+#define SM_CYMENUCHECK	      72
+#define SM_SLOWMACHINE	      73
+#define SM_MIDEASTENABLED     74
+
+#define SM_CMETRICS           75
 
   /* Device-independent bitmaps */
 
@@ -2232,6 +2304,7 @@ typedef struct tagCOMSTAT
 #define	WF_SMALLFRAME	0x0200
 #define	WF_80x87	0x0400
 #define	WF_PAGING	0x0800
+#define	WF_WIN32WOW     0x4000	/* undoc */
 #define	WF_WLO          0x8000
 
 #define MAKEINTRESOURCE(i) (SEGPTR)((DWORD)((WORD)(i)))
@@ -4659,6 +4732,52 @@ DECL_WINELIB_TYPE_AW(ENUMRESTYPEPROC);
 DECL_WINELIB_TYPE_AW(ENUMRESNAMEPROC);
 DECL_WINELIB_TYPE_AW(ENUMRESLANGPROC);
 
+/* Character Type Flags */
+#define	CT_CTYPE1		0x00000001	/* usual ctype */
+#define	CT_CTYPE2		0x00000002	/* bidirectional layout info */
+#define	CT_CTYPE3		0x00000004	/* textprocessing info */
+
+/* CType 1 Flag Bits */
+#define C1_UPPER		0x0001
+#define C1_LOWER		0x0002
+#define C1_DIGIT		0x0004
+#define C1_SPACE		0x0008
+#define C1_PUNCT		0x0010
+#define C1_CNTRL		0x0020
+#define C1_BLANK		0x0040
+#define C1_XDIGIT		0x0080
+#define C1_ALPHA		0x0100
+
+/* CType 2 Flag Bits */
+#define	C2_LEFTTORIGHT		0x0001
+#define	C2_RIGHTTOLEFT		0x0002
+#define	C2_EUROPENUMBER		0x0003
+#define	C2_EUROPESEPARATOR	0x0004
+#define	C2_EUROPETERMINATOR	0x0005
+#define	C2_ARABICNUMBER		0x0006
+#define	C2_COMMONSEPARATOR	0x0007
+#define	C2_BLOCKSEPARATOR	0x0008
+#define	C2_SEGMENTSEPARATOR	0x0009
+#define	C2_WHITESPACE		0x000A
+#define	C2_OTHERNEUTRAL		0x000B
+#define	C2_NOTAPPLICABLE	0x0000
+
+/* CType 3 Flag Bits */
+#define	C3_NONSPACING		0x0001
+#define	C3_DIACRITIC		0x0002
+#define	C3_VOWELMARK		0x0004
+#define	C3_SYMBOL		0x0008
+#define	C3_KATAKANA		0x0010
+#define	C3_HIRAGANA		0x0020
+#define	C3_HALFWIDTH		0x0040
+#define	C3_FULLWIDTH		0x0080
+#define	C3_IDEOGRAPH		0x0100
+#define	C3_KASHIDA		0x0200
+#define	C3_LEXICAL		0x0400
+#define	C3_ALPHA		0x8000
+#define	C3_NOTAPPLICABLE	0x0000
+
+
 #pragma pack(4)
 
 /* Declarations for functions that exist only in Win16 */
@@ -4704,6 +4823,7 @@ DWORD      GetDCOrg(HDC16);
 HDC16      GetDCState(HDC16);
 HWND16     GetDesktopHwnd(void);
 SEGPTR     GetDOSEnvironment(void);
+INT16      GetEnvironment(LPCSTR,LPSTR,UINT16);
 HMODULE16  GetExePtr(HANDLE16);
 WORD       GetExeVersion(void);
 DWORD      GetHeapSpaces(HMODULE16);
@@ -4711,6 +4831,7 @@ INT16      GetKbCodePage(VOID);
 INT16      GetInstanceData(HINSTANCE16,WORD,INT16);
 HGLOBAL16  GetMetaFileBits(HMETAFILE16);
 BOOL16     GetModuleName(HINSTANCE16,LPSTR,INT16);
+INT16      GetModuleUsage(HINSTANCE16);
 FARPROC16  GetMouseEventProc(void);
 UINT16     GetNumTasks(void);
 DWORD      GetSelectorBase(WORD);
@@ -4770,6 +4891,7 @@ BOOL16     SetDCHook(HDC16,FARPROC16,DWORD);
 DWORD      SetDCOrg(HDC16,INT16,INT16);
 VOID       SetDCState(HDC16,HDC16);
 BOOL16     SetDeskPattern(void);
+INT16      SetEnvironment(LPCSTR,LPCSTR,UINT16);
 WORD       SetHookFlags(HDC16,WORD);
 HMETAFILE16 SetMetaFileBits(HGLOBAL16);
 VOID       SetPriority(HTASK16,INT16);
@@ -4878,6 +5000,9 @@ DWORD      GetShortPathName32A(LPCSTR,LPSTR,DWORD);
 DWORD      GetShortPathName32W(LPCWSTR,LPWSTR,DWORD);
 #define    GetShortPathName WINELIB_NAME_AW(GetShortPathName)
 HFILE32    GetStdHandle(DWORD);
+BOOL32     GetStringTypeEx32A(LCID,DWORD,LPCSTR,INT32,LPWORD);
+BOOL32     GetStringTypeEx32W(LCID,DWORD,LPCWSTR,INT32,LPWORD);
+#define    GetStringTypeEx WINELIB_NAME_AW(GetStringTypeEx)
 VOID       GetSystemInfo(LPSYSTEM_INFO);
 BOOL32     GetSystemPowerStatus(LPSYSTEM_POWER_STATUS);
 VOID       GetSystemTime(LPSYSTEMTIME);
@@ -4899,13 +5024,17 @@ BOOL32     IsDBCSLeadByteEx(UINT32,BYTE);
 BOOL32     IsWindowUnicode(HWND32);
 BOOL32     IsValidLocale(DWORD,DWORD);
 BOOL32     LocalFileTimeToFileTime(const FILETIME*,LPFILETIME);
-LPVOID     MapViewOfFileEx(HANDLE32,DWORD,DWORD,DWORD,DWORD,DWORD);
+LPVOID     MapViewOfFile(HANDLE32,DWORD,DWORD,DWORD,DWORD);
+LPVOID     MapViewOfFileEx(HANDLE32,DWORD,DWORD,DWORD,DWORD,LPVOID);
 INT32      MessageBoxEx32A(HWND32,LPCSTR,LPCSTR,UINT32,WORD);
 INT32      MessageBoxEx32W(HWND32,LPCWSTR,LPCWSTR,UINT32,WORD);
 #define    MessageBoxEx WINELIB_NAME_AW(MessageBoxEx)
 BOOL32     MoveFile32A(LPCSTR,LPCSTR);
 BOOL32     MoveFile32W(LPCWSTR,LPCWSTR);
 #define    MoveFile WINELIB_NAME_AW(MoveFile)
+HANDLE32   OpenFileMapping32A(DWORD,BOOL32,LPCSTR);
+HANDLE32   OpenFileMapping32W(DWORD,BOOL32,LPCWSTR);
+#define    OpenFileMapping WINELIB_NAME_AW(OpenFileMapping)
 DWORD      QueryDosDevice32A(LPCSTR,LPSTR,DWORD);
 DWORD      QueryDosDevice32W(LPCWSTR,LPWSTR,DWORD);
 #define    QueryDosDevice WINELIB_NAME_AW(QueryDosDevice)
@@ -4962,8 +5091,15 @@ DWORD      TlsAlloc(void);
 BOOL32     TlsFree(DWORD);
 LPVOID     TlsGetValue(DWORD);
 BOOL32     TlsSetValue(DWORD,LPVOID);
+BOOL32     UnmapViewOfFile(LPVOID);
 LPVOID     VirtualAlloc(LPVOID,DWORD,DWORD,DWORD);
 BOOL32     VirtualFree(LPVOID,DWORD,DWORD);
+BOOL32     VirtualLock(LPVOID,DWORD);
+BOOL32     VirtualProtect(LPVOID,DWORD,DWORD,LPDWORD);
+BOOL32     VirtualProtectEx(HANDLE32,LPVOID,DWORD,DWORD,LPDWORD);
+BOOL32     VirtualQuery(LPCVOID,LPMEMORY_BASIC_INFORMATION,DWORD);
+BOOL32     VirtualQueryEx(HANDLE32,LPCVOID,LPMEMORY_BASIC_INFORMATION,DWORD);
+BOOL32     VirtualUnlock(LPVOID,DWORD);
 BOOL32     WriteConsole32A(HANDLE32,LPVOID,DWORD,LPDWORD,LPVOID);
 BOOL32     WriteConsole32W(HANDLE32,LPVOID,DWORD,LPDWORD,LPVOID);
 #define    WriteConsole WINELIB_NAME_AW(WriteConsole)
@@ -4973,15 +5109,6 @@ BOOL32     WriteFile(HFILE32,LPVOID,DWORD,LPDWORD,LPOVERLAPPED);
 /* Declarations for functions that are the same in Win16 and Win32 */
 
 VOID       CloseSound(VOID);
-HBITMAP16  CreateBitmap(INT32,INT32,UINT32,UINT32,LPCVOID);
-BOOL16     CreateCaret(HWND32,HBITMAP32,INT32,INT32);
-HBITMAP16  CreateCompatibleBitmap(HDC32,INT32,INT32);
-HBITMAP16  CreateDiscardableBitmap(HDC32,INT32,INT32);
-BOOL16     DestroyCaret(void);
-INT16      ExcludeUpdateRgn(HDC32,HWND32);
-DWORD      GetAppCompatFlags(HTASK32);
-LONG       GetBitmapBits(HBITMAP32,LONG,LPVOID);
-WORD       GetClassWord(HWND32,INT32);
 DWORD      GetDialogBaseUnits(void);
 VOID       GetKeyboardState(LPBYTE);
 DWORD      GetLastError(void);
@@ -4990,28 +5117,17 @@ LONG       GetMessageExtraInfo(void);
 DWORD      GetMessagePos(void);
 LONG       GetMessageTime(void);
 DWORD      GetTickCount(void);
-INT16      GetUpdateRgn(HWND32,HRGN32,BOOL32);
-WORD       GetWindowWord(HWND32,INT32);
 ATOM       GlobalDeleteAtom(ATOM);
-BOOL16     IsWindow(HWND32);
 VOID       LZDone(void);
 DWORD      OemKeyScan(WORD);
 DWORD      RegCloseKey(HKEY);
 DWORD      RegFlushKey(HKEY);
 VOID       ReleaseCapture(void);
-LONG       SetBitmapBits(HBITMAP32,LONG,LPCVOID);
-COLORREF   SetBkColor(HDC32,COLORREF);
-BOOL16     SetCaretBlinkTime(UINT32);
-BOOL16     SetCaretPos(INT32,INT32);
-WORD       SetClassWord(HWND32,INT32,WORD);
 VOID       SetKeyboardState(LPBYTE);
 VOID       SetLastError(DWORD);
-VOID       SetRectRgn(HRGN32,INT32,INT32,INT32,INT32);
-COLORREF   SetTextColor(HDC32,COLORREF);
-WORD       SetWindowWord(HWND32,INT32,WORD);
-VOID       UpdateWindow(HWND32);
 VOID       WaitMessage(VOID);
 
+
 /* Declarations for functions that change between Win16 and Win32 */
 
 INT16      AccessResource16(HINSTANCE16,HRSRC16);
@@ -5021,6 +5137,10 @@ ATOM       AddAtom16(SEGPTR);
 ATOM       AddAtom32A(LPCSTR);
 ATOM       AddAtom32W(LPCWSTR);
 #define    AddAtom WINELIB_NAME_AW(AddAtom)
+INT16      AddFontResource16(LPCSTR);
+INT32      AddFontResource32A(LPCSTR);
+INT32      AddFontResource32W(LPCWSTR);
+#define    AddFontResource WINELIB_NAME_AW(AddFontResource)
 BOOL16     AdjustWindowRect16(LPRECT16,DWORD,BOOL16);
 BOOL32     AdjustWindowRect32(LPRECT32,DWORD,BOOL32);
 #define    AdjustWindowRect WINELIB_NAME(AdjustWindowRect)
@@ -5207,12 +5327,21 @@ INT32      CountClipboardFormats32(void);
 INT16      CountVoiceNotes16(INT16);
 DWORD      CountVoiceNotes32(DWORD);
 #define    CountVoiceNotes WINELIB_NAME(CountVoiceNotes)
+HBITMAP16  CreateBitmap16(INT16,INT16,UINT16,UINT16,LPCVOID);
+HBITMAP32  CreateBitmap32(INT32,INT32,UINT32,UINT32,LPCVOID);
+#define    CreateBitmap WINELIB_NAME(CreateBitmap)
 HBITMAP16  CreateBitmapIndirect16(const BITMAP16*);
 HBITMAP32  CreateBitmapIndirect32(const BITMAP32*);
 #define    CreateBitmapIndirect WINELIB_NAME(CreateBitmapIndirect)
 HBRUSH16   CreateBrushIndirect16(const LOGBRUSH16*);
 HBRUSH32   CreateBrushIndirect32(const LOGBRUSH32*);
 #define    CreateBrushIndirect WINELIB_NAME(CreateBrushIndirect)
+VOID       CreateCaret16(HWND16,HBITMAP16,INT16,INT16);
+BOOL32     CreateCaret32(HWND32,HBITMAP32,INT32,INT32);
+#define    CreateCaret WINELIB_NAME(CreateCaret)
+HBITMAP16  CreateCompatibleBitmap16(HDC16,INT16,INT16);
+HBITMAP32  CreateCompatibleBitmap32(HDC32,INT32,INT32);
+#define    CreateCompatibleBitmap WINELIB_NAME(CreateCompatibleBitmap)
 HDC16      CreateCompatibleDC16(HDC16);
 HDC32      CreateCompatibleDC32(HDC32);
 #define    CreateCompatibleDC WINELIB_NAME(CreateCompatibleDC)
@@ -5258,6 +5387,9 @@ BOOL32     CreateDirectory32W(LPCWSTR,LPSECURITY_ATTRIBUTES);
 BOOL32     CreateDirectoryEx32A(LPCSTR,LPCSTR,LPSECURITY_ATTRIBUTES);
 BOOL32     CreateDirectoryEx32W(LPCWSTR,LPCWSTR,LPSECURITY_ATTRIBUTES);
 #define    CreateDirectoryEx WINELIB_NAME_AW(CreateDirectoryEx)
+HBITMAP16  CreateDiscardableBitmap16(HDC16,INT16,INT16);
+HBITMAP32  CreateDiscardableBitmap32(HDC32,INT32,INT32);
+#define    CreateDiscardableBitmap WINELIB_NAME(CreateDiscardableBitmap)
 HRGN16     CreateEllipticRgn16(INT16,INT16,INT16,INT16);
 HRGN32     CreateEllipticRgn32(INT32,INT32,INT32,INT32);
 #define    CreateEllipticRgn WINELIB_NAME(CreateEllipticRgn)
@@ -5319,6 +5451,10 @@ HRGN32     CreateRectRgnIndirect32(const RECT32*);
 HRGN16     CreateRoundRectRgn16(INT16,INT16,INT16,INT16,INT16,INT16);
 HRGN32     CreateRoundRectRgn32(INT32,INT32,INT32,INT32,INT32,INT32);
 #define    CreateRoundRectRgn WINELIB_NAME(CreateRoundRectRgn)
+BOOL16     CreateScalableFontResource16(UINT16,LPCSTR,LPCSTR,LPCSTR);
+BOOL32     CreateScalableFontResource32A(DWORD,LPCSTR,LPCSTR,LPCSTR);
+BOOL32     CreateScalableFontResource32W(DWORD,LPCWSTR,LPCWSTR,LPCWSTR);
+#define    CreateScalableFontResource WINELIB_NAME_AW(CreateScalableFontResource)
 HBRUSH16   CreateSolidBrush16(COLORREF);
 HBRUSH32   CreateSolidBrush32(COLORREF);
 #define    CreateSolidBrush WINELIB_NAME(CreateSolidBrush)
@@ -5378,6 +5514,9 @@ BOOL32     DeleteMetaFile32(HMETAFILE32);
 BOOL16     DeleteObject16(HGDIOBJ16);
 BOOL32     DeleteObject32(HGDIOBJ32);
 #define    DeleteObject WINELIB_NAME(DeleteObject)
+VOID       DestroyCaret16(void);
+BOOL32     DestroyCaret32(void);
+#define    DestroyCaret WINELIB_NAME(DestroyCaret)
 BOOL16     DestroyCursor16(HCURSOR16);
 BOOL32     DestroyCursor32(HCURSOR32);
 #define    DestroyCursor WINELIB_NAME(DestroyCursor)
@@ -5436,6 +5575,9 @@ BOOL32     DPtoLP32(HDC32,LPPOINT32,INT32);
 BOOL16     DragDetect16(HWND16,POINT16);
 BOOL32     DragDetect32(HWND32,POINT32);
 #define    DragDetect WINELIB_NAME(DragDetect)
+DWORD      DragObject16(HWND16,HWND16,UINT16,HANDLE16,WORD,HCURSOR16);
+DWORD      DragObject32(HWND32,HWND32,UINT32,DWORD,HCURSOR32);
+#define    DragObject WINELIB_NAME(DragObject)
 BOOL16     DrawEdge16(HDC16,LPRECT16,UINT16,UINT16);
 BOOL32     DrawEdge32(HDC32,LPRECT32,UINT32,UINT32);
 #define    DrawEdge WINELIB_NAME(DrawEdge)
@@ -5497,6 +5639,9 @@ INT16      EnumFonts16(HDC16,LPCSTR,FONTENUMPROC16,LPARAM);
 INT32      EnumFonts32A(HDC32,LPCSTR,FONTENUMPROC32A,LPARAM);
 INT32      EnumFonts32W(HDC32,LPCWSTR,FONTENUMPROC32W,LPARAM);
 #define    EnumFonts WINELIB_NAME_AW(EnumFonts)
+BOOL16     EnumMetaFile16(HDC16,HMETAFILE16,MFENUMPROC16,LPARAM);
+BOOL32     EnumMetaFile32(HDC32,HMETAFILE32,MFENUMPROC32,LPARAM);
+#define    EnumMetaFile WINELIB_NAME(EnumMetaFile)
 INT16      EnumObjects16(HDC16,INT16,GOBJENUMPROC16,LPARAM);
 INT32      EnumObjects32(HDC32,INT32,GOBJENUMPROC32,LPARAM);
 #define    EnumObjects WINELIB_NAME(EnumObjects)
@@ -5526,12 +5671,19 @@ BOOL32     EscapeCommFunction32(INT32,UINT32);
 INT16      ExcludeClipRect16(HDC16,INT16,INT16,INT16,INT16);
 INT32      ExcludeClipRect32(HDC32,INT32,INT32,INT32,INT32);
 #define    ExcludeClipRect WINELIB_NAME(ExcludeClipRect)
+INT16      ExcludeUpdateRgn16(HDC16,HWND16);
+INT32      ExcludeUpdateRgn32(HDC32,HWND32);
+#define    ExcludeUpdateRgn WINELIB_NAME(ExcludeUpdateRgn)
 BOOL16     ExitWindows16(DWORD,UINT16);
 #define    ExitWindows32(a,b) ExitWindowsEx(EWX_LOGOFF,0xffffffff)
 #define    ExitWindows WINELIB_NAME(ExitWindows)
 BOOL16     ExtFloodFill16(HDC16,INT16,INT16,COLORREF,UINT16);
 BOOL32     ExtFloodFill32(HDC32,INT32,INT32,COLORREF,UINT32);
 #define    ExtFloodFill WINELIB_NAME(ExtFloodFill)
+HICON16    ExtractIcon16(HINSTANCE16,LPCSTR,UINT16);
+HICON32    ExtractIcon32A(HINSTANCE32,LPCSTR,UINT32);
+HICON32    ExtractIcon32W(HINSTANCE32,LPCWSTR,UINT32);
+#define    ExtractIcon WINELIB_NAME_AW(ExtractIcon)
 BOOL16     ExtTextOut16(HDC16,INT16,INT16,UINT16,const RECT16*,LPCSTR,UINT16,const INT16*);
 BOOL32     ExtTextOut32A(HDC32,INT32,INT32,UINT32,const RECT32*,LPCSTR,UINT32,const INT32*);
 BOOL32     ExtTextOut32W(HDC32,INT32,INT32,UINT32,const RECT32*,LPCWSTR,UINT32,const INT32*);
@@ -5553,6 +5705,10 @@ ATOM       FindAtom32W(LPCWSTR);
 BOOL16     FindClose16(HANDLE16);
 BOOL32     FindClose32(HANDLE32);
 #define    FindClose WINELIB_NAME(FindClose)
+HINSTANCE16 FindExecutable16(LPCSTR,LPCSTR,LPSTR);
+HINSTANCE32 FindExecutable32A(LPCSTR,LPCSTR,LPSTR);
+HINSTANCE32 FindExecutable32W(LPCWSTR,LPCWSTR,LPWSTR);
+#define    FindExecutable WINELIB_NAME_AW(FindExecutable)
 HANDLE16   FindFirstFile16(LPCSTR,LPWIN32_FIND_DATA32A);
 HANDLE32   FindFirstFile32A(LPCSTR,LPWIN32_FIND_DATA32A);
 HANDLE32   FindFirstFile32W(LPCWSTR,LPWIN32_FIND_DATA32W);
@@ -5585,6 +5741,9 @@ INT32      FrameRect32(HDC32,const RECT32*,HBRUSH32);
 BOOL16     FrameRgn16(HDC16,HRGN16,HBRUSH16,INT16,INT16);
 BOOL32     FrameRgn32(HDC32,HRGN32,HBRUSH32,INT32,INT32);
 #define    FrameRgn WINELIB_NAME(FrameRgn)
+VOID       FreeLibrary16(HINSTANCE16);
+BOOL32     FreeLibrary32(HMODULE32);
+#define    FreeLibrary WINELIB_NAME(FreeLibrary)
 BOOL16     FreeModule16(HMODULE16);
 #define    FreeModule32(handle) FreeLibrary32(handle)
 #define    FreeModule WINELIB_NAME(FreeModule)
@@ -5597,6 +5756,9 @@ BOOL32     FreeResource32(HGLOBAL32);
 HWND16     GetActiveWindow16(void);
 HWND32     GetActiveWindow32(void);
 #define    GetActiveWindow WINELIB_NAME(GetActiveWindow)
+DWORD      GetAppCompatFlags16(HTASK16);
+DWORD      GetAppCompatFlags32(HTASK32);
+#define    GetAppCompatFlags WINELIB_NAME(GetAppCompatFlags)
 WORD       GetAsyncKeyState16(INT16);
 WORD       GetAsyncKeyState32(INT32);
 #define    GetAsyncKeyState WINELIB_NAME(GetAsyncKeyState)
@@ -5604,6 +5766,9 @@ UINT16     GetAtomName16(ATOM,LPSTR,INT16);
 UINT32     GetAtomName32A(ATOM,LPSTR,INT32);
 UINT32     GetAtomName32W(ATOM,LPWSTR,INT32);
 #define    GetAtomName WINELIB_NAME_AW(GetAtomName)
+LONG       GetBitmapBits16(HBITMAP16,LONG,LPVOID);
+LONG       GetBitmapBits32(HBITMAP32,LONG,LPVOID);
+#define    GetBitmapBits WINELIB_NAME(GetBitmapBits)
 BOOL16     GetBitmapDimensionEx16(HBITMAP16,LPSIZE16);
 BOOL32     GetBitmapDimensionEx32(HBITMAP32,LPSIZE32);
 #define    GetBitmapDimensionEx WINELIB_NAME(GetBitmapDimensionEx)
@@ -5649,9 +5814,19 @@ INT16      GetClassName16(HWND16,LPSTR,INT16);
 INT32      GetClassName32A(HWND32,LPSTR,INT32);
 INT32      GetClassName32W(HWND32,LPWSTR,INT32);
 #define    GetClassName WINELIB_NAME_AW(GetClassName)
+WORD       GetClassWord16(HWND16,INT16);
+WORD       GetClassWord32(HWND32,INT32);
+#define    GetClassWord WINELIB_NAME(GetClassWord)
 void       GetClientRect16(HWND16,LPRECT16);
 void       GetClientRect32(HWND32,LPRECT32);
 #define    GetClientRect WINELIB_NAME(GetClientRect)
+HANDLE16   GetClipboardData16(UINT16);
+HANDLE32   GetClipboardData32(UINT32);
+#define    GetClipboardData WINELIB_NAME(GetClipboardData)
+INT16      GetClipboardFormatName16(UINT16,LPSTR,INT16);
+INT32      GetClipboardFormatName32A(UINT32,LPSTR,INT32);
+INT32      GetClipboardFormatName32W(UINT32,LPWSTR,INT32);
+#define    GetClipboardFormatName WINELIB_NAME_AW(GetClipboardFormatName)
 HWND16     GetClipboardOwner16(void);
 HWND32     GetClipboardOwner32(void);
 #define    GetClipboardOwner WINELIB_NAME(GetClipboardOwner)
@@ -5747,6 +5922,10 @@ HWND32     GetFocus32(void);
 DWORD      GetFreeSpace16(UINT16);
 #define    GetFreeSpace32(w) (0x100000L)
 #define    GetFreeSpace WINELIB_NAME(GetFreeSpace)
+DWORD      GetGlyphOutLine16(HDC16,UINT16,UINT16,LPGLYPHMETRICS16,DWORD,LPVOID,const MAT2*);
+DWORD      GetGlyphOutLine32A(HDC32,UINT32,UINT32,LPGLYPHMETRICS32,DWORD,LPVOID,const MAT2*);
+DWORD      GetGlyphOutLine32W(HDC32,UINT32,UINT32,LPGLYPHMETRICS32,DWORD,LPVOID,const MAT2*);
+#define    GetGlyphOutLine WINELIB_NAME_AW(GetGlyphOutLine)
 BOOL16     GetInputState16(void);
 BOOL32     GetInputState32(void);
 #define    GetInputState WINELIB_NAME(GetInputState)
@@ -5756,6 +5935,10 @@ UINT32     GetInternalWindowPos32(HWND32,LPRECT32,LPPOINT32);
 INT16      GetKBCodePage16(void);
 UINT32     GetKBCodePage32(void);
 #define    GetKBCodePage WINELIB_NAME(GetKBCodePage)
+INT16      GetKerningPairs16(HDC16,INT16,LPKERNINGPAIR16);
+DWORD      GetKerningPairs32A(HDC32,DWORD,LPKERNINGPAIR32);
+DWORD      GetKerningPairs32W(HDC32,DWORD,LPKERNINGPAIR32);
+#define    GetKerningPairs WINELIB_NAME_AW(GetKerningPairs)
 INT16      GetKeyboardType16(INT16);
 INT32      GetKeyboardType32(INT32);
 #define    GetKeyboardType WINELIB_NAME(GetKeyboardType)
@@ -5791,6 +5974,10 @@ INT16      GetMenuString16(HMENU16,UINT16,LPSTR,INT16,UINT16);
 INT32      GetMenuString32A(HMENU32,UINT32,LPSTR,INT32,UINT32);
 INT32      GetMenuString32W(HMENU32,UINT32,LPWSTR,INT32,UINT32);
 #define    GetMenuString WINELIB_NAME_AW(GetMenuString)
+BOOL16     GetMessage16(SEGPTR,HWND16,UINT16,UINT16);
+BOOL32     GetMessage32A(LPMSG32,HWND32,UINT32,UINT32);
+BOOL32     GetMessage32W(LPMSG32,HWND32,UINT32,UINT32);
+#define    GetMessage WINELIB_NAME_AW(GetMessage)
 HMETAFILE16 GetMetaFile16(LPCSTR);
 HMETAFILE32 GetMetaFile32A(LPCSTR);
 HMETAFILE32 GetMetaFile32W(LPCWSTR);
@@ -5799,6 +5986,10 @@ INT16      GetModuleFileName16(HINSTANCE16,LPSTR,INT16);
 DWORD      GetModuleFileName32A(HMODULE32,LPSTR,DWORD);
 DWORD      GetModuleFileName32W(HMODULE32,LPWSTR,DWORD);
 #define    GetModuleFileName WINELIB_NAME_AW(GetModuleFileName)
+HMODULE16  GetModuleHandle16(LPCSTR);
+HMODULE32  GetModuleHandle32A(LPCSTR);
+HMODULE32  GetModuleHandle32W(LPCSTR);
+#define    GetModuleHandle WINELIB_NAME_AW(GetModuleHandle)
 DWORD      GetNearestColor16(HDC16,DWORD);
 DWORD      GetNearestColor32(HDC32,DWORD);
 #define    GetNearestColor WINELIB_NAME(GetNearestColor)
@@ -5833,6 +6024,9 @@ COLORREF   GetPixel32(HDC32,INT32,INT32);
 INT16      GetPolyFillMode16(HDC16);
 INT32      GetPolyFillMode32(HDC32);
 #define    GetPolyFillMode WINELIB_NAME(GetPolyFillMode)
+INT16      GetPriorityClipboardFormat16(UINT16*,INT16);
+INT32      GetPriorityClipboardFormat32(UINT32*,INT32);
+#define    GetPriorityClipboardFormat WINELIB_NAME(GetPriorityClipboardFormat)
 UINT16     GetPrivateProfileInt16(LPCSTR,LPCSTR,INT16,LPCSTR);
 UINT32     GetPrivateProfileInt32A(LPCSTR,LPCSTR,INT32,LPCSTR);
 UINT32     GetPrivateProfileInt32W(LPCWSTR,LPCWSTR,INT32,LPCWSTR);
@@ -5856,6 +6050,12 @@ HANDLE16   GetProp16(HWND16,LPCSTR);
 HANDLE32   GetProp32A(HWND32,LPCSTR);
 HANDLE32   GetProp32W(HWND32,LPCWSTR);
 #define    GetProp WINELIB_NAME_AW(GetProp)
+DWORD      GetQueueStatus16(UINT16);
+DWORD      GetQueueStatus32(UINT32);
+#define    GetQueueStatus WINELIB_NAME(GetQueueStatus)
+BOOL16     GetRasterizerCaps16(LPRASTERIZER_STATUS,UINT16);
+BOOL32     GetRasterizerCaps32(LPRASTERIZER_STATUS,UINT32);
+#define    GetRasterizerCaps WINELIB_NAME(GetRasterizerCaps)
 INT16      GetRelAbs16(HDC16);
 INT32      GetRelAbs32(HDC32);
 #define    GetRelAbs WINELIB_NAME(GetRelAbs)
@@ -5880,6 +6080,10 @@ HGDIOBJ32  GetStockObject32(INT32);
 INT16      GetStretchBltMode16(HDC16);
 INT32      GetStretchBltMode32(HDC32);
 #define    GetStretchBltMode WINELIB_NAME(GetStretchBltMode)
+BOOL16     GetStringType16(LCID,DWORD,LPCSTR,INT16,LPWORD);
+BOOL32     GetStringType32A(LCID,DWORD,LPCSTR,INT32,LPWORD);
+BOOL32     GetStringType32W(DWORD,LPCWSTR,INT32,LPWORD);
+#define    GetStringType WINELIB_NAME_AW(GetStringType)
 HMENU16    GetSubMenu16(HMENU16,INT16);
 HMENU32    GetSubMenu32(HMENU32,INT32);
 #define    GetSubMenu WINELIB_NAME(GetSubMenu)
@@ -5952,6 +6156,9 @@ HWND32     GetTopWindow32(HWND32);
 BOOL16     GetUpdateRect16(HWND16,LPRECT16,BOOL16);
 BOOL32     GetUpdateRect32(HWND32,LPRECT32,BOOL32);
 #define    GetUpdateRect WINELIB_NAME(GetUpdateRect)
+INT16      GetUpdateRgn16(HWND16,HRGN16,BOOL16);
+INT32      GetUpdateRgn32(HWND32,HRGN32,BOOL32);
+#define    GetUpdateRgn WINELIB_NAME(GetUpdateRgn)
 LONG       GetVersion16(void);
 LONG       GetVersion32(void);
 #define    GetVersion WINELIB_NAME(GetVersion)
@@ -6001,6 +6208,9 @@ INT16      GetWindowTextLength16(HWND16);
 INT32      GetWindowTextLength32A(HWND32);
 INT32      GetWindowTextLength32W(HWND32);
 #define    GetWindowTextLength WINELIB_NAME_AW(GetWindowTextLength)
+WORD       GetWindowWord16(HWND16,INT16);
+WORD       GetWindowWord32(HWND32,INT32);
+#define    GetWindowWord WINELIB_NAME(GetWindowWord)
 ATOM       GlobalAddAtom16(SEGPTR);
 ATOM       GlobalAddAtom32A(LPCSTR);
 ATOM       GlobalAddAtom32W(LPCWSTR);
@@ -6059,7 +6269,7 @@ BOOL32     GrayString32A(HDC32,HBRUSH32,GRAYSTRINGPROC32,LPARAM,
 BOOL32     GrayString32W(HDC32,HBRUSH32,GRAYSTRINGPROC32,LPARAM,
                          INT32,INT32,INT32,INT32,INT32);
 #define    GrayString WINELIB_NAME_AW(GrayString)
-BOOL16     HideCaret16(HWND16);
+VOID       HideCaret16(HWND16);
 BOOL32     HideCaret32(HWND32);
 #define    HideCaret WINELIB_NAME(HideCaret)
 BOOL16     HiliteMenuItem16(HWND16,HMENU16,UINT16,UINT16);
@@ -6103,7 +6313,7 @@ BOOL16     IsBadHugeReadPtr16(SEGPTR,DWORD);
 BOOL32     IsBadHugeReadPtr32(LPCVOID,UINT32);
 #define    IsBadHugeReadPtr WINELIB_NAME(IsBadHugeReadPtr)
 BOOL16     IsBadHugeWritePtr16(SEGPTR,DWORD);
-BOOL32     IsBadHugeWritePtr32(LPCVOID,UINT32);
+BOOL32     IsBadHugeWritePtr32(LPVOID,UINT32);
 #define    IsBadHugeWritePtr WINELIB_NAME(IsBadHugeWritePtr)
 BOOL16     IsBadReadPtr16(SEGPTR,UINT16);
 BOOL32     IsBadReadPtr32(LPCVOID,UINT32);
@@ -6156,6 +6366,9 @@ BOOL32     IsMenu32(HMENU32);
 BOOL16     IsRectEmpty16(const RECT16*);
 BOOL32     IsRectEmpty32(const RECT32*);
 #define    IsRectEmpty WINELIB_NAME(IsRectEmpty)
+BOOL16     IsWindow16(HWND16);
+BOOL32     IsWindow32(HWND32);
+#define    IsWindow WINELIB_NAME(IsWindow)
 BOOL16     IsWindowEnabled16(HWND16);
 BOOL32     IsWindowEnabled32(HWND32);
 #define    IsWindowEnabled WINELIB_NAME(IsWindowEnabled)
@@ -6215,6 +6428,9 @@ HMENU16    LoadMenuIndirect16(LPCVOID);
 HMENU32    LoadMenuIndirect32A(LPCVOID);
 HMENU32    LoadMenuIndirect32W(LPCVOID);
 #define    LoadMenuIndirect WINELIB_NAME_AW(LoadMenuIndirect)
+HINSTANCE16 LoadModule16(LPCSTR,LPVOID);
+DWORD      LoadModule32(LPCSTR,LPVOID);
+#define    LoadModule WINELIB_NAME(LoadModule)
 HGLOBAL16  LoadResource16(HINSTANCE16,HRSRC16);
 HGLOBAL32  LoadResource32(HINSTANCE32,HRSRC32);
 #define    LoadResource WINELIB_NAME(LoadResource)
@@ -6347,6 +6563,10 @@ BOOL32     OpenIcon32(HWND32);
 INT16      OpenSound16(void);
 VOID       OpenSound32(void);
 #define    OpenSound WINELIB_NAME(OpenSound)
+VOID       OutputDebugString16(LPCSTR);
+VOID       OutputDebugString32A(LPCSTR);
+VOID       OutputDebugString32W(LPCWSTR);
+#define    OutputDebugString WINELIB_NAME_AW(OutputDebugString)
 BOOL16     PaintRgn16(HDC16,HRGN16);
 BOOL32     PaintRgn32(HDC32,HRGN32);
 #define    PaintRgn WINELIB_NAME(PaintRgn)
@@ -6363,6 +6583,9 @@ BOOL32     Pie32(HDC32,INT32,INT32,INT32,INT32,INT32,INT32,INT32,INT32);
 BOOL16     PlayMetaFile16(HDC16,HMETAFILE16);
 BOOL32     PlayMetaFile32(HDC32,HMETAFILE32);
 #define    PlayMetaFile WINELIB_NAME(PlayMetaFile)
+VOID       PlayMetaFileRecord16(HDC16,LPHANDLETABLE16,LPMETARECORD,UINT16);
+BOOL32     PlayMetaFileRecord32(HDC32,LPHANDLETABLE32,LPMETARECORD,UINT32);
+#define    PlayMetaFileRecord WINELIB_NAME(PlayMetaFileRecord)
 BOOL16     PolyPolygon16(HDC16,LPPOINT16,LPINT16,UINT16);
 BOOL32     PolyPolygon32(HDC32,LPPOINT32,LPINT32,UINT32);
 #define    PolyPolygon WINELIB_NAME(PolyPolygon)
@@ -6378,6 +6601,10 @@ BOOL16     PostAppMessage16(HTASK16,UINT16,WPARAM16,LPARAM);
 #define    PostAppMessage32W(thread,msg,wparam,lparam) \
            PostThreadMessage32W((DWORD)(thread),msg,wparam,lparam)
 #define    PostAppMessage WINELIB_NAME_AW(PostAppMessage)
+BOOL16     PostMessage16(HWND16,UINT16,WPARAM16,LPARAM);
+BOOL32     PostMessage32A(HWND32,UINT32,WPARAM32,LPARAM);
+BOOL32     PostMessage32W(HWND32,UINT32,WPARAM32,LPARAM);
+#define    PostMessage WINELIB_NAME_AW(PostMessage)
 void       PostQuitMessage16(INT16);
 void       PostQuitMessage32(INT32);
 #define    PostQuitMessage WINELIB_NAME(PostQuitMessage)
@@ -6464,17 +6691,24 @@ DWORD      RegSetValueEx32W(HKEY,LPWSTR,DWORD,DWORD,LPBYTE,DWORD);
 INT16      ReleaseDC16(HWND16,HDC16);
 INT32      ReleaseDC32(HWND32,HDC32);
 #define    ReleaseDC WINELIB_NAME(ReleaseDC)
-HANDLE16   RemoveProp16(HWND16,LPCSTR);
-HANDLE32   RemoveProp32A(HWND32,LPCSTR);
-HANDLE32   RemoveProp32W(HWND32,LPCWSTR);
-#define    RemoveProp WINELIB_NAME_AW(RemoveProp)
 BOOL16     RemoveDirectory16(LPCSTR);
 BOOL32     RemoveDirectory32A(LPCSTR);
 BOOL32     RemoveDirectory32W(LPCWSTR);
 #define    RemoveDirectory WINELIB_NAME_AW(RemoveDirectory)
+BOOL16     RemoveFontResource16(LPCSTR);
+BOOL32     RemoveFontResource32A(LPCSTR);
+BOOL32     RemoveFontResource32W(LPCWSTR);
+#define    RemoveFontResource WINELIB_NAME_AW(RemoveFontResource)
 BOOL16     RemoveMenu16(HMENU16,UINT16,UINT16);
 BOOL32     RemoveMenu32(HMENU32,UINT32,UINT32);
 #define    RemoveMenu WINELIB_NAME(RemoveMenu)
+HANDLE16   RemoveProp16(HWND16,LPCSTR);
+HANDLE32   RemoveProp32A(HWND32,LPCSTR);
+HANDLE32   RemoveProp32W(HWND32,LPCWSTR);
+#define    RemoveProp WINELIB_NAME_AW(RemoveProp)
+VOID       ReplyMessage16(LRESULT);
+BOOL32     ReplyMessage32(LRESULT);
+#define    ReplyMessage WINELIB_NAME(ReplyMessage)
 HDC16      ResetDC16(HDC16,const DEVMODE16 *);
 HDC32      ResetDC32A(HDC32,const DEVMODE32A *);
 HDC32      ResetDC32W(HDC32,const DEVMODE32W *);
@@ -6536,19 +6770,37 @@ LRESULT    SendMessage32W(HWND32,UINT32,WPARAM32,LPARAM);
 HWND16     SetActiveWindow16(HWND16);
 HWND32     SetActiveWindow32(HWND32);
 #define    SetActiveWindow WINELIB_NAME(SetActiveWindow)
+LONG       SetBitmapBits16(HBITMAP16,LONG,LPCVOID);
+LONG       SetBitmapBits32(HBITMAP32,LONG,LPCVOID);
+#define    SetBitmapBits WINELIB_NAME(SetBitmapBits)
 BOOL16     SetBitmapDimensionEx16(HBITMAP16,INT16,INT16,LPSIZE16);
 BOOL32     SetBitmapDimensionEx32(HBITMAP32,INT32,INT32,LPSIZE32);
 #define    SetBitmapDimensionEx WINELIB_NAME(SetBitmapDimensionEx)
+COLORREF   SetBkColor16(HDC16,COLORREF);
+COLORREF   SetBkColor32(HDC32,COLORREF);
+#define    SetBkColor WINELIB_NAME(SetBkColor)
 INT16      SetBkMode16(HDC16,INT16);
 INT32      SetBkMode32(HDC32,INT32);
 #define    SetBkMode WINELIB_NAME(SetBkMode)
 HWND16     SetCapture16(HWND16);
 HWND32     SetCapture32(HWND32);
 #define    SetCapture WINELIB_NAME(SetCapture)
+VOID       SetCaretBlinkTime16(UINT16);
+BOOL32     SetCaretBlinkTime32(UINT32);
+#define    SetCaretBlinkTime WINELIB_NAME(SetCaretBlinkTime)
+VOID       SetCaretPos16(INT16,INT16);
+BOOL32     SetCaretPos32(INT32,INT32);
+#define    SetCaretPos WINELIB_NAME(SetCaretPos)
 LONG       SetClassLong16(HWND16,INT16,LONG);
 LONG       SetClassLong32A(HWND32,INT32,LONG);
 LONG       SetClassLong32W(HWND32,INT32,LONG);
 #define    SetClassLong WINELIB_NAME_AW(SetClassLong)
+WORD       SetClassWord16(HWND16,INT16,WORD);
+WORD       SetClassWord32(HWND32,INT32,WORD);
+#define    SetClassWord WINELIB_NAME(SetClassWord)
+HANDLE16   SetClipboardData16(UINT16,HANDLE16);
+HANDLE32   SetClipboardData32(UINT32,HANDLE32);
+#define    SetClipboardData WINELIB_NAME(SetClipboardData)
 HWND16     SetClipboardViewer16(HWND16);
 HWND32     SetClipboardViewer32(HWND32);
 #define    SetClipboardViewer WINELIB_NAME(SetClipboardViewer)
@@ -6642,6 +6894,9 @@ void       SetRect32(LPRECT32,INT32,INT32,INT32,INT32);
 void       SetRectEmpty16(LPRECT16);
 void       SetRectEmpty32(LPRECT32);
 #define    SetRectEmpty WINELIB_NAME(SetRectEmpty)
+VOID       SetRectRgn16(HRGN16,INT16,INT16,INT16,INT16);
+VOID       SetRectRgn32(HRGN32,INT32,INT32,INT32,INT32);
+#define    SetRectRgn WINELIB_NAME(SetRectRgn)
 INT16      SetRelAbs16(HDC16,INT16);
 INT32      SetRelAbs32(HDC32,INT32);
 #define    SetRelAbs WINELIB_NAME(SetRelAbs)
@@ -6684,6 +6939,9 @@ UINT32     SetTextAlign32(HDC32,UINT32);
 INT16      SetTextCharacterExtra16(HDC16,INT16);
 INT32      SetTextCharacterExtra32(HDC32,INT32);
 #define    SetTextCharacterExtra WINELIB_NAME(SetTextCharacterExtra)
+COLORREF   SetTextColor16(HDC16,COLORREF);
+COLORREF   SetTextColor32(HDC32,COLORREF);
+#define    SetTextColor WINELIB_NAME(SetTextColor)
 INT16      SetTextJustification16(HDC16,INT16,INT16);
 BOOL32     SetTextJustification32(HDC32,INT32,INT32);
 #define    SetTextJustification WINELIB_NAME(SetTextJustification)
@@ -6742,11 +7000,18 @@ void       SetWindowText16(HWND16,SEGPTR);
 void       SetWindowText32A(HWND32,LPCSTR);
 void       SetWindowText32W(HWND32,LPCWSTR);
 #define    SetWindowText WINELIB_NAME_AW(SetWindowText)
+WORD       SetWindowWord16(HWND16,INT16,WORD);
+WORD       SetWindowWord32(HWND32,INT32,WORD);
+#define    SetWindowWord WINELIB_NAME(SetWindowWord)
 BOOL16     ShellAbout16(HWND16,LPCSTR,LPCSTR,HICON16);
 BOOL32     ShellAbout32A(HWND32,LPCSTR,LPCSTR,HICON32);
 BOOL32     ShellAbout32W(HWND32,LPCWSTR,LPCWSTR,HICON32);
 #define    ShellAbout WINELIB_NAME_AW(ShellAbout)
-BOOL16     ShowCaret16(HWND16);
+HINSTANCE16 ShellExecute16(HWND16,LPCSTR,LPCSTR,LPCSTR,LPCSTR,INT16);
+HINSTANCE32 ShellExecute32A(HWND32,LPCSTR,LPCSTR,LPCSTR,LPCSTR,INT32);
+HINSTANCE32 ShellExecute32W(HWND32,LPCWSTR,LPCWSTR,LPCWSTR,LPCWSTR,INT32);
+#define    ShellExecute WINELIB_NAME_AW(ShellExecute)
+VOID       ShowCaret16(HWND16);
 BOOL32     ShowCaret32(HWND32);
 #define    ShowCaret WINELIB_NAME(ShowCaret)
 INT16      ShowCursor16(BOOL16);
@@ -6838,8 +7103,14 @@ BOOL16     UnregisterClass16(SEGPTR,HINSTANCE16);
 BOOL32     UnregisterClass32A(LPCSTR,HINSTANCE32);
 BOOL32     UnregisterClass32W(LPCWSTR,HINSTANCE32);
 #define    UnregisterClass WINELIB_NAME_AW(UnregisterClass)
-void       ValidateRect16(HWND16,const RECT16*);
-void       ValidateRect32(HWND32,const RECT32*);
+INT16      UpdateColors16(HDC16);
+BOOL32     UpdateColors32(HDC32);
+#define    UpdateColors WINELIB_NAME(UpdateColors)
+VOID       UpdateWindow16(HWND16);
+VOID       UpdateWindow32(HWND32);
+#define    UpdateWindow WINELIB_NAME(UpdateWindow)
+VOID       ValidateRect16(HWND16,const RECT16*);
+VOID       ValidateRect32(HWND32,const RECT32*);
 #define    ValidateRect WINELIB_NAME(ValidateRect)
 VOID       ValidateRgn16(HWND16,HRGN16);
 VOID       ValidateRgn32(HWND32,HRGN32);
@@ -6963,6 +7234,7 @@ INT32      LoadMessage32A(HINSTANCE32,UINT32,WORD,LPSTR,INT32);
 INT32      LoadMessage32W(HINSTANCE32,UINT32,WORD,LPWSTR,INT32);
 SEGPTR     WIN16_GlobalLock16(HGLOBAL16);
 SEGPTR     WIN16_LockResource(HGLOBAL16);
+LONG       WIN16_hread(HFILE16,SEGPTR,LONG);
 INT32      lstrncmp32A(LPCSTR,LPCSTR,INT32);
 INT32      lstrncmp32W(LPCWSTR,LPCWSTR,INT32);
 INT32      lstrncmpi32A(LPCSTR,LPCSTR,INT32);
@@ -6972,65 +7244,6 @@ LPSTR      lstrcpyWtoA(LPSTR,LPCWSTR);
 LPWSTR     lstrcpynAtoW(LPWSTR,LPCSTR,INT32);
 LPSTR      lstrcpynWtoA(LPSTR,LPCWSTR,INT32);
 
-/* 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
-
-#ifdef __WINE__
-# ifdef WINELIB32
-typedef INT32 INT;
-typedef UINT32 UINT;
-typedef BOOL32 BOOL;
-# else  /* WINELIB32 */
-typedef INT16 INT;
-typedef UINT16 UINT;
-typedef BOOL16 BOOL;
-# endif  /* WINELIB32 */
-#endif  /* __WINE__ */
-
-INT        AddFontResource(LPCSTR);
-int        ConvertRequest(HWND16,LPKANJISTRUCT);
-DWORD      DragObject(HWND16, HWND16, WORD, HANDLE16, WORD, HCURSOR16);
-BOOL       EnumMetaFile(HDC16,HMETAFILE16,MFENUMPROC16,LPARAM);
-HICON16    ExtractIcon(HINSTANCE16,LPCSTR,WORD);
-HINSTANCE16 FindExecutable(LPCSTR,LPCSTR,LPSTR);
-void       FreeLibrary(HINSTANCE16);
-HANDLE16   GetClipboardData(WORD);
-int        GetClipboardFormatName(WORD,LPSTR,short);
-int        GetEnvironment(LPSTR,LPSTR,WORD);
-int        GetKerningPairs(HDC16,int,LPKERNINGPAIR16);
-BOOL       GetMessage(SEGPTR,HWND16,UINT,UINT);
-HMODULE16  GetModuleHandle(LPCSTR);
-INT16      GetModuleUsage(HINSTANCE16);
-int        GetPriorityClipboardFormat(WORD*,short);
-DWORD      GetQueueStatus(UINT);
-BOOL       GetRasterizerCaps(LPRASTERIZER_STATUS,UINT);
-HINSTANCE16 LoadModule(LPCSTR,LPVOID);
-void       OutputDebugString(LPCSTR);
-void       PlayMetaFileRecord(HDC16,LPHANDLETABLE16,LPMETARECORD,WORD);
-BOOL       PostMessage(HWND16,WORD,WORD,LONG);
-BOOL       RemoveFontResource(LPSTR);
-void       ReplyMessage(LRESULT);
-HANDLE16   SetClipboardData(WORD,HANDLE16);
-int        SetEnvironment(LPCSTR,LPCSTR,WORD);
-HINSTANCE16 ShellExecute(HWND16,LPCSTR,LPCSTR,LPSTR,LPCSTR,INT);
-int        UpdateColors(HDC16);
-
-/* Callback function pointers types. */
-
-#ifdef WINELIB
-typedef LONG (*DRIVERPROC)(DWORD, HDRVR16, UINT, LPARAM, LPARAM);
-typedef int (*EDITWORDBREAKPROC)(LPSTR lpch, int ichCurrent, int cch,int code);
-#else
-typedef SEGPTR DRIVERPROC;
-typedef SEGPTR EDITWORDBREAKPROC;
-#endif
-
-#endif  /* NO_TRANSITION_TYPES */
-
-#define WINELIB_UNIMP(x) fprintf (stderr, "WineLib: Unimplemented %s\n", x)
-
 #ifdef __cplusplus
 }
 #endif
diff --git a/include/winerror.h b/include/winerror.h
index 28cc005875c..75716bf7525 100644
--- a/include/winerror.h
+++ b/include/winerror.h
@@ -21,6 +21,7 @@ extern int WIN32_LastError;
 #define ERROR_OUTOFMEMORY           14
 #define ERROR_NO_MORE_FILES         18
 #define ERROR_SHARING_VIOLATION     32
+#define ERROR_DUP_NAME              52
 #define ERROR_FILE_EXISTS           80
 #define ERROR_INVALID_PARAMETER     87
 #define ERROR_BROKEN_PIPE           109
@@ -29,6 +30,7 @@ extern int WIN32_LastError;
 #define ERROR_SEEK_ON_DEVICE        132
 #define ERROR_DIR_NOT_EMPTY         145
 #define ERROR_BUSY                  170
+#define ERROR_ALREADY_EXISTS        183
 #define ERROR_FILENAME_EXCED_RANGE  206
 #define ERROR_MORE_DATA             234
 #define ERROR_NO_MORE_ITEMS         259
diff --git a/include/winsock.h b/include/winsock.h
index 0dfe7a3e08f..ed813b7ff7d 100644
--- a/include/winsock.h
+++ b/include/winsock.h
@@ -499,7 +499,7 @@ typedef struct __WSINFO
   struct __WSINFO*      prev,*next;
 
   unsigned		flags;
-  int			errno;
+  int			err;
   INT16			num_startup;
   INT16			num_async_rq;
   INT16			last_free;
diff --git a/include/wintypes.h b/include/wintypes.h
index c6b69ab22c2..05d3869cfd3 100644
--- a/include/wintypes.h
+++ b/include/wintypes.h
@@ -168,6 +168,13 @@ DECLARE_HANDLE(HWND);
 typedef LRESULT (*DLGPROC16)(HWND16,UINT16,WPARAM16,LPARAM);
 typedef LRESULT (*DLGPROC32)(HWND32,UINT32,WPARAM32,LPARAM);
 DECL_WINELIB_TYPE(DLGPROC);
+typedef LRESULT (*DRIVERPROC16)(DWORD,HDRVR16,UINT16,LPARAM,LPARAM);
+typedef LRESULT (*DRIVERPROC32)(DWORD,HDRVR32,UINT32,LPARAM,LPARAM);
+DECL_WINELIB_TYPE(DRIVERPROC);
+typedef INT16   (*EDITWORDBREAKPROC16)(LPSTR,INT16,INT16,INT16);
+typedef INT32   (*EDITWORDBREAKPROC32A)(LPSTR,INT32,INT32,INT32);
+typedef INT32   (*EDITWORDBREAKPROC32W)(LPWSTR,INT32,INT32,INT32);
+DECL_WINELIB_TYPE_AW(EDITWORDBREAKPROC);
 typedef LRESULT (*FARPROC16)();
 typedef LRESULT (*FARPROC32)();
 DECL_WINELIB_TYPE(FARPROC);
diff --git a/ipc/dde_proc.c b/ipc/dde_proc.c
index 59d8942ce83..2f72bc3ec90 100644
--- a/ipc/dde_proc.c
+++ b/ipc/dde_proc.c
@@ -148,7 +148,7 @@ void dde_proc_add(dde_proc procs)
 }
 
 /* wait for dde - acknowledge message - or timout */
-static BOOL get_ack()
+static BOOL32 get_ack()
 {
     struct timeval timeout;
     int size;
@@ -186,7 +186,7 @@ static BOOL get_ack()
 }
 
 /* Transfer one message to a given process */
-static BOOL DDE_DoOneMessage (int proc_idx, int size, struct msgbuf *msgbuf)
+static BOOL32 DDE_DoOneMessage (int proc_idx, int size, struct msgbuf *msgbuf)
 {
   dde_proc proc= &main_block->proc[ proc_idx ];
 
@@ -290,13 +290,13 @@ static HWND HWND_Local2Remote(HWND orig)
   return 0;			
 }
 
-static BOOL DDE_DoMessage( MSG16 *msg, int type )
+static BOOL32 DDE_DoMessage( MSG16 *msg, int type )
 {
   int proc_idx;
 
   MSG16 *remote_message;
   struct msg_dat msg_dat;
-  BOOL success;
+  BOOL32 success;
   
   if (msg->wParam == 0)
       return FALSE;
@@ -346,18 +346,18 @@ static BOOL DDE_DoMessage( MSG16 *msg, int type )
   }
 }
 
-BOOL DDE_SendMessage( MSG16 *msg)
+BOOL32 DDE_SendMessage( MSG16 *msg)
 {
   return DDE_DoMessage(msg, DDE_SEND);
 }
 
-BOOL DDE_PostMessage( MSG16 *msg)
+BOOL32 DDE_PostMessage( MSG16 *msg)
 {
   return DDE_DoMessage(msg, DDE_POST);
 }
 
 
-void dde_proc_send_ack(HWND wnd, BOOL val) {
+void dde_proc_send_ack(HWND wnd, BOOL32 val) {
    int proc,msg;
 
    static struct msgbuf msg_ack={DDE_ACK,{'0'}};
@@ -384,8 +384,8 @@ int DDE_GetRemoteMessage()
   MSG16 *remote_message;
   int size;
   struct msg_dat msg_dat;
-  BOOL was_sent;		   /* sent/received */
-  BOOL passed;
+  BOOL32 was_sent;		   /* sent/received */
+  BOOL32 passed;
   WND *wndPtr;
 
   if (curr_proc_idx==-1)	   /* do we have DDE initialized ? */
@@ -667,7 +667,7 @@ void dde_wnd_setup()
     main_block->windows[i].proc_idx = FREE_WND;
 }
 
-static BOOL DDE_ProcHasWindows(int proc_idx)
+static BOOL32 DDE_ProcHasWindows(int proc_idx)
 {
   WND_DATA *tested;
   int i;
diff --git a/ipc/generic_hash.c b/ipc/generic_hash.c
index df0449b8281..98d4e1728aa 100644
--- a/ipc/generic_hash.c
+++ b/ipc/generic_hash.c
@@ -24,12 +24,12 @@
 	       (i)*(size)) )
 
 static HASH_ITEM *locate_entry(HASH_CONTAINER* hash, DWORD key,
-			       HASH_VAL *seeked_data, BOOL skip_deleted);
+			       HASH_VAL *seeked_data, BOOL32 skip_deleted);
 
 static void copy_hash_items(HASH_CONTAINER *hash, HASH_ITEM *old_items,
 			    int old_n_items);
 
-static BOOL arrays_initialized = FALSE;
+static BOOL32 arrays_initialized = FALSE;
 static int primes[NO_OF_PRIMES];
 static int best_primes[NO_OF_PRIMES];
 static int no_of_primes;
@@ -37,7 +37,7 @@ static int no_of_best_primes;
 static int max_num;
 
 /* binary search for `num' in the `primes' array */
-static BOOL prime_binary_search_found(int num)
+static BOOL32 prime_binary_search_found(int num)
 {
   int min_idx, max_idx, idx;
   
@@ -56,7 +56,7 @@ static BOOL prime_binary_search_found(int num)
   return FALSE;
 }
 
-static BOOL is_prime(int num)
+static BOOL32 is_prime(int num)
 {
   int i;
   if ((num & 0x1) == 0)		   /* can be divided by 2 */
@@ -218,7 +218,7 @@ static void setup_arrays()
 static void static_collect_garbge(HASH_CONTAINER *hash)
 {
    int i;
-   BOOL change;
+   BOOL32 change;
    HASH_ITEM *items;
    HASH_ITEM *located;
    HASH_ITEM *item;
@@ -516,9 +516,9 @@ void detach_hash(HASH_CONTAINER *hash)
 
 
 /********** Hash usage *************/
-static __inline__ BOOL
+static __inline__ BOOL32
 correct_entry(HASH_ITEM *item, int key, HASH_VAL *seeked_data,
-	      HASH_ITEM_TEST *is_correct_item, BOOL skip_deleted)
+	      HASH_ITEM_TEST *is_correct_item, BOOL32 skip_deleted)
 {
    switch(item->key) {
       case FREE_ENTRY:
@@ -549,7 +549,7 @@ correct_entry(HASH_ITEM *item, int key, HASH_VAL *seeked_data,
  */
 
 static HASH_ITEM *locate_entry(HASH_CONTAINER* hash, DWORD key,
-			       HASH_VAL *seeked_data, BOOL skip_deleted)
+			       HASH_VAL *seeked_data, BOOL32 skip_deleted)
 {
    DWORD hash_idx, hash_leaps;
    HASH_ITEM *item;
@@ -619,7 +619,7 @@ HASH_VAL *hash_locate_item(HASH_CONTAINER* hash,
 }
 
 
-BOOL hash_add_item(HASH_CONTAINER* hash, int key, HASH_VAL *data)
+BOOL32 hash_add_item(HASH_CONTAINER* hash, int key, HASH_VAL *data)
 {
     HASH_SHARED *shared;
     HASH_ITEM *item;
@@ -649,7 +649,7 @@ BOOL hash_add_item(HASH_CONTAINER* hash, int key, HASH_VAL *data)
 }
 
 
-BOOL hash_delete_item(HASH_CONTAINER* hash, int key, HASH_VAL *seeked_data)
+BOOL32 hash_delete_item(HASH_CONTAINER* hash, int key, HASH_VAL *seeked_data)
 {
     HASH_ITEM *item;
     
diff --git a/ipc/generic_hash.h b/ipc/generic_hash.h
index 6bd296f35d7..daa3409b50e 100644
--- a/ipc/generic_hash.h
+++ b/ipc/generic_hash.h
@@ -48,7 +48,7 @@ typedef struct hash_share_struct {
 				/* changes to the pointer. */
     HASH_PTR items;		/* pointer to the items */
 } HASH_SHARED;
-typedef BOOL HASH_ITEM_TEST(HASH_VAL *value, HASH_VAL *seeked_data);
+typedef BOOL32 HASH_ITEM_TEST(HASH_VAL *value, HASH_VAL *seeked_data);
 
 /* NOTE:
  * 1. Keys 0 and -1 are reserved.
@@ -62,7 +62,7 @@ typedef struct hash_container_struct {
 				   (Function of maximum_load) */
 
     int last_ptr_update;	/* to be compared with shared.ptr_updates */
-    BOOL shared_was_malloced;	/* Need that to know how to destroy hash */
+    BOOL32 shared_was_malloced;	/* Need that to know how to destroy hash */
     
     /* This is an optional handler.
      * If not NULL, this function is used for distinguishing between
@@ -129,8 +129,8 @@ void detach_hash(HASH_CONTAINER *hash);
  *        2. data to store. (for hash_add_item).
  */
 HASH_VAL *hash_locate_item(HASH_CONTAINER* hash,int key, HASH_VAL* seeked_data);
-BOOL hash_add_item(HASH_CONTAINER*        hash, int key, HASH_VAL* data);
-BOOL hash_delete_item(HASH_CONTAINER*     hash, int key, HASH_VAL* seeked_data);
+BOOL32 hash_add_item(HASH_CONTAINER* hash, int key, HASH_VAL* data);
+BOOL32 hash_delete_item(HASH_CONTAINER* hash, int key, HASH_VAL* seeked_data);
 
 
 void *ret_null();		/* function returning null (used for */
diff --git a/library/libres.c b/library/libres.c
index ebe155d69b8..cc5bd3ad219 100644
--- a/library/libres.c
+++ b/library/libres.c
@@ -58,7 +58,7 @@ HRSRC32 LIBRES_FindResource16( HINSTANCE32 hModule, LPCSTR name, LPCSTR type )
       typeid=atoi(type+1);
     else
     {
-      WINELIB_UNIMP("LIBRES_FindResource16(*,*,type=string)");
+      fprintf(stderr,"LIBRES_FindResource16(*,*,type=string)");
       return 0;
     }
   }
@@ -112,7 +112,7 @@ HRSRC32 LIBRES_FindResource32( HINSTANCE32 hModule, LPCWSTR name, LPCWSTR type )
     }
     else
     {
-      WINELIB_UNIMP("LIBRES_FindResource32(*,*,type=string)");
+      fprintf(stderr,"LIBRES_FindResource32(*,*,type=string)");
       return 0;
     }
   }
@@ -154,7 +154,7 @@ LPVOID LIBRES_LockResource( HGLOBAL32 handle )
 /**********************************************************************
  *	    LIBRES_FreeResource    
  */
-BOOL LIBRES_FreeResource( HGLOBAL32 handle )
+BOOL32 LIBRES_FreeResource( HGLOBAL32 handle )
 {
   return 0; /* Obsolete in Win32 */
 }
@@ -165,7 +165,7 @@ BOOL LIBRES_FreeResource( HGLOBAL32 handle )
  */
 INT32 LIBRES_AccessResource( HINSTANCE32 hModule, HRSRC32 hRsrc )
 {
-  WINELIB_UNIMP("LIBRES_AccessResource()");
+  fprintf(stderr,"LIBRES_AccessResource()");
   return -1; /* Obsolete in Win32 */
 }
 
@@ -184,7 +184,7 @@ DWORD LIBRES_SizeofResource( HINSTANCE32 hModule, HRSRC32 hRsrc )
  */
 HGLOBAL32 LIBRES_AllocResource( HINSTANCE32 hModule, HRSRC32 hRsrc, DWORD size)
 {
-  WINELIB_UNIMP("LIBRES_AllocResource()");
+  fprintf(stderr,"LIBRES_AllocResource()");
   return 0; /* Obsolete in Win32 */
 }
 
diff --git a/library/miscstubs.c b/library/miscstubs.c
index e6177ee4a17..0b021da8c0a 100644
--- a/library/miscstubs.c
+++ b/library/miscstubs.c
@@ -45,18 +45,18 @@ int CallTo32_LargeStack( int (*func)(), int nbargs, ...)
   }
 }
 
-extern LRESULT ColorDlgProc(HWND16,UINT,WPARAM16,LPARAM);
-extern LRESULT ComboBoxWndProc(HWND16,UINT,WPARAM16,LPARAM);
-extern LRESULT ComboLBoxWndProc(HWND16,UINT,WPARAM16,LPARAM);
-extern LRESULT FileOpenDlgProc(HWND16,UINT,WPARAM16,LPARAM);
-extern LRESULT FileSaveDlgProc(HWND16,UINT,WPARAM16,LPARAM);
-extern LRESULT FindTextDlgProc(HWND16,UINT,WPARAM16,LPARAM);
-extern LRESULT MDIClientWndProc(HWND16,UINT,WPARAM16,LPARAM);
-extern LRESULT PrintDlgProc(HWND16,UINT,WPARAM16,LPARAM);
-extern LRESULT PrintSetupDlgProc(HWND16,UINT,WPARAM16,LPARAM);
-extern LRESULT ReplaceTextDlgProc(HWND16,UINT,WPARAM16,LPARAM);
-extern LRESULT ScrollBarWndProc(HWND16,UINT,WPARAM16,LPARAM);
-extern LRESULT StaticWndProc(HWND16,UINT,WPARAM16,LPARAM);
+extern LRESULT ColorDlgProc(HWND16,UINT16,WPARAM16,LPARAM);
+extern LRESULT ComboBoxWndProc(HWND16,UINT16,WPARAM16,LPARAM);
+extern LRESULT ComboLBoxWndProc(HWND16,UINT16,WPARAM16,LPARAM);
+extern LRESULT FileOpenDlgProc(HWND16,UINT16,WPARAM16,LPARAM);
+extern LRESULT FileSaveDlgProc(HWND16,UINT16,WPARAM16,LPARAM);
+extern LRESULT FindTextDlgProc(HWND16,UINT16,WPARAM16,LPARAM);
+extern LRESULT MDIClientWndProc(HWND16,UINT16,WPARAM16,LPARAM);
+extern LRESULT PrintDlgProc(HWND16,UINT16,WPARAM16,LPARAM);
+extern LRESULT PrintSetupDlgProc(HWND16,UINT16,WPARAM16,LPARAM);
+extern LRESULT ReplaceTextDlgProc(HWND16,UINT16,WPARAM16,LPARAM);
+extern LRESULT ScrollBarWndProc(HWND16,UINT16,WPARAM16,LPARAM);
+extern LRESULT StaticWndProc(HWND16,UINT16,WPARAM16,LPARAM);
 extern LRESULT TASK_Reschedule(void);
 
 /***********************************************************************
diff --git a/loader/main.c b/loader/main.c
index 64854d6c1cc..8fd8b5d2544 100644
--- a/loader/main.c
+++ b/loader/main.c
@@ -60,10 +60,14 @@ int MAIN_Init(void)
     extern BOOL32 RELAY_Init(void);
     extern BOOL32 WIN16DRV_Init(void);
     extern BOOL32 SIGNAL_Init(void);
+    extern BOOL32 VIRTUAL_Init(void);
     extern BOOL32 WIDGETS_Init(void);
 
     int queueSize;
 
+    /* Initialize virtual memory management */
+    if (!VIRTUAL_Init()) return 0;
+
     /* Create the system and SEGPTR heaps */
     if (!(SystemHeap = HeapCreate( HEAP_GROWABLE, 0x10000, 0 ))) return 0;
     if (!(SegptrHeap = HeapCreate( HEAP_WINE_SEGPTR, 0, 0 ))) return 0;
diff --git a/loader/module.c b/loader/module.c
index 4f4c1e4656d..b2474894c4b 100644
--- a/loader/module.c
+++ b/loader/module.c
@@ -848,7 +848,7 @@ FARPROC16 MODULE_GetWndProcEntry16( const char *name )
     FARPROC16 ret;
     static HMODULE16 hModule = 0;
 
-    if (!hModule) hModule = GetModuleHandle( "WPROCS" );
+    if (!hModule) hModule = GetModuleHandle16( "WPROCS" );
     ordinal = MODULE_GetOrdinal( hModule, name );
     if (!(ret = MODULE_GetEntryPoint( hModule, ordinal )))
         fprintf( stderr, "GetWndProc16: %s not found, please report\n", name );
@@ -1129,7 +1129,7 @@ HINSTANCE16 MODULE_Load( LPCSTR name, LPVOID paramBlock, BOOL32 first )
 		SEGTABLEENTRY * pSegTable = (SEGTABLEENTRY *) NE_SEG_TABLE(pModule);
 		SELFLOADHEADER *selfloadheader;
                 STACK16FRAME *stack16Top;
-		HMODULE16 hselfload = GetModuleHandle("WPROCS");
+		HMODULE16 hselfload = GetModuleHandle16("WPROCS");
 		WORD oldss, oldsp, saved_dgroup = pSegTable[pModule->dgroup - 1].selector;
 		fprintf (stderr, "Warning:  %*.*s is a self-loading module\n"
                                 "Support for self-loading modules is very experimental\n",
@@ -1142,7 +1142,7 @@ HINSTANCE16 MODULE_Load( LPCSTR name, LPVOID paramBlock, BOOL32 first )
 		selfloadheader->EntryAddrProc = 
                                            MODULE_GetEntryPoint(hselfload,27);
 		selfloadheader->MyAlloc  = MODULE_GetEntryPoint(hselfload,28);
-		selfloadheader->SetOwner = MODULE_GetEntryPoint(GetModuleHandle("KERNEL"),403);
+		selfloadheader->SetOwner = MODULE_GetEntryPoint(GetModuleHandle16("KERNEL"),403);
 		pModule->self_loading_sel = GlobalHandleToSel(
 					GLOBAL_Alloc (GMEM_ZEROINIT,
 					0xFF00, hModule, FALSE, FALSE, FALSE)
@@ -1262,9 +1262,9 @@ HINSTANCE16 MODULE_Load( LPCSTR name, LPVOID paramBlock, BOOL32 first )
 
 
 /**********************************************************************
- *	    LoadModule    (KERNEL.45)
+ *	    LoadModule16    (KERNEL.45)
  */
-HINSTANCE16 LoadModule( LPCSTR name, LPVOID paramBlock )
+HINSTANCE16 LoadModule16( LPCSTR name, LPVOID paramBlock )
 {
     return MODULE_Load( name, paramBlock, TRUE );
 }
@@ -1288,7 +1288,7 @@ BOOL16 FreeModule16( HMODULE16 hModule )
 
 
 /**********************************************************************
- *	    GetModuleHandle    (KERNEL.47)
+ *	    GetModuleHandle16    (KERNEL.47)
  */
 HMODULE16 WIN16_GetModuleHandle( SEGPTR name )
 {
@@ -1296,7 +1296,7 @@ HMODULE16 WIN16_GetModuleHandle( SEGPTR name )
     return MODULE_FindModule( PTR_SEG_TO_LIN(name) );
 }
 
-HMODULE16 GetModuleHandle( LPCSTR name )
+HMODULE16 GetModuleHandle16( LPCSTR name )
 {
     return MODULE_FindModule( name );
 }
@@ -1410,9 +1410,9 @@ HINSTANCE16 LoadLibrary16( LPCSTR libname )
 
 
 /***********************************************************************
- *           FreeLibrary   (KERNEL.96)
+ *           FreeLibrary16   (KERNEL.96)
  */
-void FreeLibrary( HINSTANCE16 handle )
+void FreeLibrary16( HINSTANCE16 handle )
 {
     dprintf_module( stddeb,"FreeLibrary: %04x\n", handle );
     FreeModule16( handle );
@@ -1477,7 +1477,7 @@ HINSTANCE32 WinExec32( LPCSTR lpCmdLine, UINT32 nCmdShow )
 	params.cmdLine  = (SEGPTR)WIN16_GlobalLock16( cmdLineHandle );
 	params.showCmd  = (SEGPTR)WIN16_GlobalLock16( cmdShowHandle );
 	params.reserved = 0;
-	handle = LoadModule( filename, &params );
+	handle = LoadModule16( filename, &params );
 	if (handle == 2)  /* file not found */
 	{
 	    /* Check that the original file name did not have a suffix */
@@ -1487,7 +1487,7 @@ HINSTANCE32 WinExec32( LPCSTR lpCmdLine, UINT32 nCmdShow )
             {
                 p = filename + strlen(filename);
                 strcpy( p, ".exe" );
-                handle = LoadModule( filename, &params );
+                handle = LoadModule16( filename, &params );
                 *p = '\0';  /* Remove extension */
             }
 	}
@@ -1675,7 +1675,7 @@ BOOL16 ModuleNext( MODULEENTRY *lpme )
  */
 BOOL16 ModuleFindName( MODULEENTRY *lpme, LPCSTR name )
 {
-    lpme->wNext = GetModuleHandle( name );
+    lpme->wNext = GetModuleHandle16( name );
     return ModuleNext( lpme );
 }
 
diff --git a/loader/ne_image.c b/loader/ne_image.c
index 9bbdf212c63..f81cf826081 100644
--- a/loader/ne_image.c
+++ b/loader/ne_image.c
@@ -31,7 +31,7 @@
 /***********************************************************************
  *           NE_LoadSegment
  */
-BOOL NE_LoadSegment( HMODULE16 hModule, WORD segnum )
+BOOL32 NE_LoadSegment( HMODULE16 hModule, WORD segnum )
 {
     NE_MODULE *pModule;
     SEGTABLEENTRY *pSegTable, *pSeg;
@@ -62,8 +62,8 @@ BOOL NE_LoadSegment( HMODULE16 hModule, WORD segnum )
     lseek( fd, pSeg->filepos << pModule->alignment, SEEK_SET );
     size = pSeg->size ? pSeg->size : 0x10000;
     mem = GlobalLock16(pSeg->selector);
-    if (pModule->flags & NE_FFLAGS_SELFLOAD && segnum > 1) {	
-#ifndef WINELIB
+    if (pModule->flags & NE_FFLAGS_SELFLOAD && segnum > 1)
+    {
  	/* Implement self loading segments */
  	SELFLOADHEADER *selfloadheader;
         STACK16FRAME *stack16Top;
@@ -110,10 +110,7 @@ BOOL NE_LoadSegment( HMODULE16 hModule, WORD segnum )
  	
  	IF1632_Saved16_ss = oldss;
  	IF1632_Saved16_sp = oldsp;
-#else
-	fprintf(stderr,"JBP: Ignoring self loading segments in NE_LoadSegment.\n");
-#endif
-     }
+    }
     else if (!(pSeg->flags & NE_SEGFLAGS_ITERATED))
       read(fd, mem, size);
     else {
@@ -362,9 +359,6 @@ BOOL NE_LoadSegment( HMODULE16 hModule, WORD segnum )
  */
 void NE_FixupPrologs( NE_MODULE *pModule )
 {
-#ifdef WINELIB
-	fprintf(stderr,"NE_FixupPrologs should not be called for libwine\n");
-#else
     SEGTABLEENTRY *pSegTable;
     WORD dgroup = 0;
     WORD sel;
@@ -443,7 +437,6 @@ void NE_FixupPrologs( NE_MODULE *pModule )
             p += (sel == 0xff) ? 6 : 3;  
         }
     }
-#endif
 }
 
 
@@ -452,12 +445,11 @@ void NE_FixupPrologs( NE_MODULE *pModule )
  *
  * Call the DLL initialization code
  */
-static BOOL NE_InitDLL( HMODULE16 hModule )
+static BOOL32 NE_InitDLL( HMODULE16 hModule )
 {
-#ifndef WINELIB
-    int cs_reg, ds_reg, ip_reg, cx_reg, di_reg, bp_reg;
     NE_MODULE *pModule;
     SEGTABLEENTRY *pSegTable;
+    CONTEXT context;
 
     /* Registers at initialization must be:
      * cx     heap size
@@ -473,6 +465,8 @@ static BOOL NE_InitDLL( HMODULE16 hModule )
         (pModule->flags & NE_FFLAGS_WIN32)) return TRUE; /*not a library*/
     if (!pModule->cs) return TRUE;  /* no initialization code */
 
+    memset( &context, 0, sizeof(context) );
+
     if (!(pModule->flags & NE_FFLAGS_SINGLEDATA))
     {
         if (pModule->flags & NE_FFLAGS_MULTIPLEDATA || pModule->dgroup)
@@ -483,31 +477,28 @@ static BOOL NE_InitDLL( HMODULE16 hModule )
         }
         else  /* DATA NONE DLL */
         {
-            ds_reg = 0;
-            cx_reg = 0;
+            DS_reg(&context)  = 0;
+            ECX_reg(&context) = 0;
         }
     }
     else  /* DATA SINGLE DLL */
     {
-        ds_reg = pSegTable[pModule->dgroup-1].selector;
-        cx_reg = pModule->heap_size;
+        DS_reg(&context)  = pSegTable[pModule->dgroup-1].selector;
+        ECX_reg(&context) = pModule->heap_size;
     }
 
-    cs_reg = pSegTable[pModule->cs-1].selector;
-    ip_reg = pModule->ip;
-    di_reg = ds_reg ? ds_reg : hModule;
-    bp_reg = IF1632_Saved16_sp + ((WORD)&((STACK16FRAME*)1)->bp - 1);
+    CS_reg(&context)  = pSegTable[pModule->cs-1].selector;
+    EIP_reg(&context) = pModule->ip;
+    EBP_reg(&context) = IF1632_Saved16_sp + (WORD)&((STACK16FRAME*)0)->bp;
+    EDI_reg(&context) = DS_reg(&context) ? DS_reg(&context) : hModule;
+
 
     pModule->cs = 0;  /* Don't initialize it twice */
-    dprintf_dll( stddeb, "Calling LibMain, cs:ip=%04x:%04x ds=%04x di=%04x cx=%04x\n", 
-                 cs_reg, ip_reg, ds_reg, di_reg, cx_reg );
-    return CallTo16_regs_( (FARPROC16)(cs_reg << 16 | ip_reg), ds_reg,
-                           0 /*es*/, 0 /*bp*/, 0 /*ax*/, 0 /*bx*/,
-                           cx_reg, 0 /*dx*/, 0 /*si*/, di_reg );
-#else
-    fprintf( stderr,"JBP: Ignoring call to LibMain\n" );
-    return FALSE;
-#endif
+    dprintf_dll( stddeb, "Calling LibMain, cs:ip=%04lx:%04x ds=%04lx di=%04x cx=%04x\n", 
+                 CS_reg(&context), IP_reg(&context), DS_reg(&context),
+                 DI_reg(&context), CX_reg(&context) );
+    CallTo16_regs_( &context );
+    return TRUE;
 }
 
 
diff --git a/loader/pe_image.c b/loader/pe_image.c
index 59d15cb63d7..24cf3e9d0a8 100644
--- a/loader/pe_image.c
+++ b/loader/pe_image.c
@@ -406,9 +406,9 @@ problem needs to be fixed properly at some stage */
 	load_addr = pe->load_addr = (int)xmalloc(pe->vma_size);
 	memset( load_addr, 0, pe->vma_size);
 #else
-	load_addr =  pe->load_addr = VirtualAlloc( NULL, pe->vma_size,
-                                                   MEM_COMMIT,
-                                                   PAGE_EXECUTE_READWRITE );
+	load_addr = (int) VirtualAlloc( NULL, pe->vma_size, MEM_COMMIT,
+                                         PAGE_EXECUTE_READWRITE );
+        pe->load_addr = load_addr;
 #endif
 
 	dprintf_win32(stddeb, "Load addr is really %x, range %x\n",
@@ -510,9 +510,11 @@ problem needs to be fixed properly at some stage */
 		[IMAGE_DIRECTORY_ENTRY_GLOBALPTR].Size)
 		dprintf_win32(stdnimp,"Global Pointer (MIPS) ignored\n");
 
+#ifdef NOT	/* we initialize this later */
 	if(pe->pe_header->OptionalHeader.DataDirectory
 		[IMAGE_DIRECTORY_ENTRY_TLS].Size)
 		 dprintf_win32(stdnimp,"Thread local storage ignored\n");
+#endif
 
 	if(pe->pe_header->OptionalHeader.DataDirectory
 		[IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG].Size)
@@ -647,4 +649,30 @@ void PE_InitializeDLLs(HMODULE16 hModule)
 	}
 	PE_InitDLL( hModule );
 }
+
+void PE_InitTls( PE_MODULE *module )
+{
+   /* FIXME: tls callbacks ??? */
+   DWORD  index;
+   DWORD  datasize;
+   DWORD  size;
+   LPVOID mem;
+   LPIMAGE_TLS_DIRECTORY pdir;
+
+    if (!module->pe_header->OptionalHeader.DataDirectory[IMAGE_FILE_THREAD_LOCAL_STORAGE].VirtualAddress)
+        return;
+
+    pdir = (LPVOID)(module->load_addr + module->pe_header->OptionalHeader.
+               DataDirectory[IMAGE_FILE_THREAD_LOCAL_STORAGE].VirtualAddress);
+    index = TlsAlloc();
+    datasize = pdir->EndAddressOfRawData-pdir->StartAddressOfRawData;
+    size     = datasize + pdir->SizeOfZeroFill;
+        
+    mem = VirtualAlloc(0,size, MEM_RESERVE|MEM_COMMIT, PAGE_READWRITE );
+    
+    memcpy(mem,(LPVOID) pdir->StartAddressOfRawData, datasize);
+    TlsSetValue(index,mem);
+    *(pdir->AddressOfIndex)=index;   
+}
+
 #endif /* WINELIB */
diff --git a/loader/pe_resource.c b/loader/pe_resource.c
index 08655d0ffa8..2d2bbaff921 100644
--- a/loader/pe_resource.c
+++ b/loader/pe_resource.c
@@ -11,6 +11,7 @@
  * Copyright 1997 Marcus Meissner
  */
 
+#include <stdlib.h>
 #include <sys/types.h>
 #include "wintypes.h"
 #include "windows.h"
@@ -54,7 +55,12 @@ LPIMAGE_RESOURCE_DIRECTORY GetResDirEntryW(LPIMAGE_RESOURCE_DIRECTORY resdirptr,
     int namelen;
 
     if (HIWORD(name)) {
-    /* FIXME: what about #xxx names? */
+    	if (name[0]=='#') {
+		char	buf[10];
+
+		lstrcpynWtoA(buf,name+1,10);
+		return GetResDirEntryW(resdirptr,(LPCWSTR)atoi(buf),root);
+	}
 	entryTable = (LPIMAGE_RESOURCE_DIRECTORY_ENTRY) (
 			(BYTE *) resdirptr + 
                         sizeof(IMAGE_RESOURCE_DIRECTORY));
diff --git a/loader/resource.c b/loader/resource.c
index d2f50fe9b76..37dc9c1a58d 100644
--- a/loader/resource.c
+++ b/loader/resource.c
@@ -111,9 +111,15 @@ HRSRC32 FindResourceEx32W(
     if (!hModule) hModule = GetTaskDS();
     hModule = GetExePtr( hModule );  /* In case we were passed an hInstance */
     dprintf_resource(stddeb, "FindResource32W: module=%08x type=", hModule );
-    PrintId( type );
+    if (HIWORD(type))
+    	dprintf_resource(stddeb,"%p",type);
+    else
+	dprintf_resource(stddeb,"#%p",type);
     dprintf_resource( stddeb, " name=" );
-    PrintId( name );
+    if (HIWORD(name))
+    	dprintf_resource(stddeb,"%p",name);
+    else
+	dprintf_resource(stddeb,"#%p",name);
     dprintf_resource( stddeb, "\n" );
     if (!(pModule = MODULE_GetPtr( hModule ))) return 0;
     if (!(pModule->flags & NE_FFLAGS_WIN32)) return 0;
diff --git a/loader/signal.c b/loader/signal.c
index e1fba1f4d54..17739ec1bb5 100644
--- a/loader/signal.c
+++ b/loader/signal.c
@@ -48,6 +48,21 @@ wine_sigaction(int sig,struct sigaction * new, struct sigaction * old)
 	errno = -sig;
 	return -1;
 }
+#endif /* linux */
+
+
+#ifdef linux
+#define HANDLER_DEF(name) void name (int signal, SIGCONTEXT context_struct)
+#define HANDLER_PROLOG SIGCONTEXT *context = &context_struct; (void)context; {
+#define HANDLER_EPILOG }
+#elif defined(__svr4__) || defined(_SCO_DS)
+#define HANDLER_DEF(name) void name (int signal, void *siginfo, SIGCONTEXT *context)
+#define HANDLER_PROLOG  /* nothing */
+#define HANDLER_EPILOG  /* nothing */
+#else
+#define HANDLER_DEF(name) void name (int signal, int code, SIGCONTEXT *context)
+#define HANDLER_PROLOG  /* nothing */
+#define HANDLER_EPILOG  /* nothing */
 #endif
 
 extern BOOL32 INSTR_EmulateInstruction( SIGCONTEXT *context );
@@ -57,19 +72,13 @@ extern BOOL32 INSTR_EmulateInstruction( SIGCONTEXT *context );
  *
  * SIGALRM handler.
  */
-#ifdef linux
-static void wine_timer(int signal, SIGCONTEXT context_struct)
+static
+HANDLER_DEF(wine_timer)
 {
-#elif defined(__svr4__)
-static void wine_timer(int signal, void *siginfo, SIGCONTEXT *context)
-{
-#else
-static void wine_timer(int signal, int code, SIGCONTEXT *context)
-{
-#endif
-    /* Should do real-time timers here */
-
-    DOSMEM_Tick();
+  HANDLER_PROLOG;
+  /* Should do real-time timers here */
+  DOSMEM_Tick();
+  HANDLER_EPILOG;
 }
 
 /**********************************************************************
@@ -77,19 +86,13 @@ static void wine_timer(int signal, int code, SIGCONTEXT *context)
  * 
  * Handle Ctrl-C and such
  */
-#ifdef linux
-static void SIGNAL_break(int signal, SIGCONTEXT context_struct)
+static
+HANDLER_DEF(SIGNAL_break)
 {
-    SIGCONTEXT *context = &context_struct;
-#elif defined(__svr4__) || defined(_SCO_DS)
-static void SIGNAL_break(int signal, void *siginfo, SIGCONTEXT *context)
-{
-#else
-static void SIGNAL_break(int signal, int code, SIGCONTEXT *context)
-{
-#endif
-    if (Options.debug) wine_debug( signal, context );  /* Enter our debugger */
-    exit(0);
+  HANDLER_PROLOG;
+  if (Options.debug) wine_debug( signal, context );  /* Enter our debugger */
+  exit(0);
+  HANDLER_EPILOG;
 }
 
 /**********************************************************************
@@ -97,13 +100,19 @@ static void SIGNAL_break(int signal, int code, SIGCONTEXT *context)
  * 
  * wait4 terminated child processes
  */
-static void SIGNAL_child(void)
+static
+HANDLER_DEF(SIGNAL_child)
 {
-#if defined(__svr4__) || defined(__EMX__)
-    wait(NULL);
+  HANDLER_PROLOG;
+#ifdef HAVE_WAIT4
+  wait4( 0, NULL, WNOHANG, NULL);
+#elif defined (HAVE_WAITPID)
+  /* I am sort-of guessing that this is the same as the wait4 call.  */
+  waitpid (0, NULL, WNOHANG);
 #else
-    wait4( 0, NULL, WNOHANG, NULL);
+  wait(NULL);
 #endif
+  HANDLER_EPILOG;
 }
 
 
@@ -112,18 +121,12 @@ static void SIGNAL_child(void)
  *
  * SIGTRAP handler.
  */
-#ifdef linux
-static void SIGNAL_trap(int signal, SIGCONTEXT context_struct)
-{
-    SIGCONTEXT *context = &context_struct;
-#elif defined(__svr4__) || defined(_SCO_DS)
-static void SIGNAL_trap(int signal, void *siginfo, SIGCONTEXT *context)
-{
-#else
-static void SIGNAL_trap(int signal, int code, SIGCONTEXT *context)
+static
+HANDLER_DEF(SIGNAL_trap)
 {
-#endif
-    wine_debug( signal, context );  /* Enter our debugger */
+  HANDLER_PROLOG;
+  wine_debug( signal, context );  /* Enter our debugger */
+  HANDLER_EPILOG;
 }
 
 
@@ -132,30 +135,24 @@ static void SIGNAL_trap(int signal, int code, SIGCONTEXT *context)
  *
  * Segfault handler.
  */
-#ifdef linux
-static void SIGNAL_fault(int signal, SIGCONTEXT context_struct)
-{
-    SIGCONTEXT *context = &context_struct;
-#elif defined(__svr4__) || defined(_SCO_DS)
-static void SIGNAL_fault(int signal, void *siginfo, SIGCONTEXT *context)
+static
+HANDLER_DEF(SIGNAL_fault)
 {
-#else
-static void SIGNAL_fault(int signal, int code, SIGCONTEXT *context)
-{
-#endif
-    if (CS_sig(context) == WINE_CODE_SELECTOR)
+  HANDLER_PROLOG;
+  if (CS_sig(context) == WINE_CODE_SELECTOR)
     {
         fprintf( stderr, "Segmentation fault in Wine program (%x:%lx)."
                          "  Please debug.\n",
                  CS_sig(context), EIP_sig(context) );
     }
-    else
+  else
     {
         if (INSTR_EmulateInstruction( context )) return;
         fprintf( stderr, "Segmentation fault in Windows program %x:%lx.\n",
                  CS_sig(context), EIP_sig(context) );
     }
-    wine_debug( signal, context );
+  wine_debug( signal, context );
+  HANDLER_EPILOG;
 }
 
 
diff --git a/loader/task.c b/loader/task.c
index d9a666fc9f6..38e602812e8 100644
--- a/loader/task.c
+++ b/loader/task.c
@@ -40,6 +40,7 @@
 #define MIN_THUNKS  32
 
 extern void USER_AppExit( HTASK16, HINSTANCE16, HQUEUE16 );
+extern void PE_InitTls( PE_MODULE *module );
 
   /* Saved 16-bit stack for current process (Win16 only) */
 WORD IF1632_Saved16_ss = 0;
@@ -315,7 +316,7 @@ static SEGPTR TASK_AllocThunk( HTASK16 hTask )
  *
  * Free a MakeProcInstance() thunk.
  */
-static BOOL TASK_FreeThunk( HTASK16 hTask, SEGPTR thunk )
+static BOOL32 TASK_FreeThunk( HTASK16 hTask, SEGPTR thunk )
 {
     TDB *pTask;
     THUNKS *pThunk;
@@ -347,7 +348,6 @@ static BOOL TASK_FreeThunk( HTASK16 hTask, SEGPTR thunk )
 #ifndef WINELIB
 static void TASK_CallToStart(void)
 {
-    int cs_reg, ds_reg, ip_reg;
     int exit_code = 1;
     TDB *pTask = (TDB *)GlobalLock16( hCurrentTask );
     NE_MODULE *pModule = MODULE_GetPtr( pTask->hModule );
@@ -384,19 +384,22 @@ static void TASK_CallToStart(void)
          * ss   stack selector
          * sp   top of the stack
          */
-
-        cs_reg = pSegTable[pModule->cs - 1].selector;
-        ip_reg = pModule->ip;
-        ds_reg = pSegTable[pModule->dgroup - 1].selector;
-
-        dprintf_task( stddeb, "Starting main program: cs:ip=%04x:%04x ds=%04x ss:sp=%04x:%04x\n",
-                      cs_reg, ip_reg, ds_reg,
-                      IF1632_Saved16_ss, IF1632_Saved16_sp);
-
-        CallTo16_regs_( (FARPROC16)(cs_reg << 16 | ip_reg), ds_reg,
-                        pTask->hPDB /*es*/, 0 /*bp*/, 0 /*ax*/,
-                        pModule->stack_size /*bx*/, pModule->heap_size /*cx*/,
-                        0 /*dx*/, 0 /*si*/, ds_reg /*di*/ );
+        CONTEXT context;
+
+        memset( &context, 0, sizeof(context) );
+        CS_reg(&context)  = pSegTable[pModule->cs - 1].selector;
+        DS_reg(&context)  = pSegTable[pModule->dgroup - 1].selector;
+        ES_reg(&context)  = pTask->hPDB;
+        EIP_reg(&context) = pModule->ip;
+        EBX_reg(&context) = pModule->stack_size;
+        ECX_reg(&context) = pModule->heap_size;
+        EDI_reg(&context) = context.SegDs;
+
+        dprintf_task( stddeb, "Starting main program: cs:ip=%04lx:%04x ds=%04lx ss:sp=%04x:%04x\n",
+                      CS_reg(&context), IP_reg(&context), DS_reg(&context),
+                      IF1632_Saved16_ss, IF1632_Saved16_sp );
+
+        CallTo16_regs_( &context );
         /* This should never return */
         fprintf( stderr, "TASK_CallToStart: Main program returned!\n" );
         TASK_KillCurrentTask( 1 );
@@ -498,7 +501,8 @@ HTASK16 TASK_CreateTask( HMODULE16 hModule, HINSTANCE16 hInstance,
     pTask->pdb.int20 = 0x20cd;
     pTask->pdb.dispatcher[0] = 0x9a;  /* ljmp */
 #ifndef WINELIB
-    *(FARPROC16 *)&pTask->pdb.dispatcher[1] = MODULE_GetEntryPoint( GetModuleHandle("KERNEL"), 102 );  /* KERNEL.102 is DOS3Call() */
+    *(FARPROC16 *)&pTask->pdb.dispatcher[1] = MODULE_GetEntryPoint(
+            GetModuleHandle16("KERNEL"), 102 );  /* KERNEL.102 is DOS3Call() */
 #endif
     pTask->pdb.savedint22 = INT_GetHandler( 0x22 );
     pTask->pdb.savedint23 = INT_GetHandler( 0x23 );
@@ -541,6 +545,11 @@ HTASK16 TASK_CreateTask( HMODULE16 hModule, HINSTANCE16 hInstance,
             (LPTHREAD_START_ROUTINE)(pModule->pe_module->load_addr +
             pModule->pe_module->pe_header->OptionalHeader.AddressOfEntryPoint);
         pTask->thdb = THREAD_Create( pdb32, 0, start );
+#ifndef WINELIB
+        /* FIXME: should not be done here */
+        pCurrentThread = pTask->thdb;
+        PE_InitTls( pModule->pe_module );
+#endif
     }
     else
         pTask->thdb = THREAD_Create( pdb32, 0, NULL );
@@ -1501,9 +1510,18 @@ BOOL16 TaskFindHandle( TASKENTRY *lpte, HTASK16 hTask )
 
 
 /***********************************************************************
- *           GetAppCompatFlags   (KERNEL.354) (USER32.205)
+ *           GetAppCompatFlags16   (KERNEL.354)
+ */
+DWORD GetAppCompatFlags16( HTASK16 hTask )
+{
+    return GetAppCompatFlags32( hTask );
+}
+
+
+/***********************************************************************
+ *           GetAppCompatFlags32   (USER32.205)
  */
-DWORD GetAppCompatFlags( HTASK32 hTask )
+DWORD GetAppCompatFlags32( HTASK32 hTask )
 {
     TDB *pTask;
 
diff --git a/memory/Makefile.in b/memory/Makefile.in
index d473cd0b247..0214f918b9d 100644
--- a/memory/Makefile.in
+++ b/memory/Makefile.in
@@ -1,4 +1,4 @@
-DEFS      = -D__WINE__ -DNO_TRANSITION_TYPES
+DEFS      = -D__WINE__
 TOPSRCDIR = @top_srcdir@
 TOPOBJDIR = ..
 SRCDIR    = @srcdir@
@@ -12,7 +12,8 @@ C_SRCS = \
 	ldt.c \
 	local.c \
 	selector.c \
-	string.c
+	string.c \
+	virtual.c
 
 all: $(MODULE).o
 
diff --git a/memory/global.c b/memory/global.c
index 3b15549b340..1a5c12e7f8b 100644
--- a/memory/global.c
+++ b/memory/global.c
@@ -604,7 +604,7 @@ DWORD GlobalDOSAlloc(DWORD size)
    
    if( lpBlock )
    {
-       HMODULE16 hModule = GetModuleHandle("KERNEL");
+       HMODULE16 hModule = GetModuleHandle16("KERNEL");
        WORD	 wSelector;
    
        wSelector = GLOBAL_CreateBlock(GMEM_FIXED, lpBlock, size, 
diff --git a/memory/heap.c b/memory/heap.c
index 494b1154353..75e5adc6a13 100644
--- a/memory/heap.c
+++ b/memory/heap.c
@@ -266,12 +266,12 @@ static BOOL32 HEAP_Decommit( SUBHEAP *subheap, void *ptr )
     DWORD size = (DWORD)((char *)ptr - (char *)subheap);
     size = (size + 0xfff) & 0xfffff000;  /* Align size on a page boundary */
     if (size >= subheap->commitSize) return TRUE;
-    if (!VirtualFree( (char *)subheap + subheap->commitSize,
-                      size - subheap->commitSize, MEM_DECOMMIT ))
+    if (!VirtualFree( (char *)subheap + size,
+                      subheap->commitSize - size, MEM_DECOMMIT ))
     {
         fprintf( stderr, "HEAP_Decommit: could not decommit %08lx bytes at %08lx for heap %08lx\n",
-                 size - subheap->commitSize,
-                 (DWORD)((char *)subheap + subheap->commitSize),
+                 subheap->commitSize - size,
+                 (DWORD)((char *)subheap + size),
                  (DWORD)subheap->heap );
         return FALSE;
     }
@@ -382,7 +382,6 @@ static void HEAP_MakeInUseBlockFree( SUBHEAP *subheap, ARENA_INUSE *pArena )
         /* Free the memory */
         subheap->magic = 0;
         if (subheap->selector) FreeSelector( subheap->selector );
-        VirtualFree( subheap, subheap->size, MEM_DECOMMIT );
         VirtualFree( subheap, 0, MEM_RELEASE );
         return;
     }
@@ -853,7 +852,6 @@ BOOL32 HeapDestroy( HANDLE32 heap )
     {
         SUBHEAP *next = subheap->next;
         if (subheap->selector) FreeSelector( subheap->selector );
-        VirtualFree( subheap, subheap->commitSize, MEM_DECOMMIT );
         VirtualFree( subheap, 0, MEM_RELEASE );
         subheap = next;
     }
diff --git a/memory/selector.c b/memory/selector.c
index bbb25c6072b..1da07686526 100644
--- a/memory/selector.c
+++ b/memory/selector.c
@@ -7,6 +7,7 @@
 #include <string.h>
 #include "windows.h"
 #include "ldt.h"
+#include "miscemu.h"
 #include "selectors.h"
 #include "stackframe.h"
 #include "stddebug.h"
diff --git a/memory/virtual.c b/memory/virtual.c
new file mode 100644
index 00000000000..0cc397a4f3e
--- /dev/null
+++ b/memory/virtual.c
@@ -0,0 +1,976 @@
+/*
+ * Win32 virtual memory functions
+ *
+ * Copyright 1997 Alexandre Julliard
+ */
+
+#include <assert.h>
+#include <fcntl.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/types.h>
+#include <sys/mman.h>
+#include "winbase.h"
+#include "winerror.h"
+#include "file.h"
+#include "heap.h"
+#include "process.h"
+#include "xmalloc.h"
+#include "stddebug.h"
+#include "debug.h"
+
+/* File mapping */
+typedef struct
+{
+    K32OBJ        header;
+    DWORD         size_high;
+    DWORD         size_low;
+    FILE_OBJECT  *file;
+    BYTE          protect;
+} FILE_MAPPING;
+
+/* File view */
+typedef struct _FV
+{
+    struct _FV   *next;     /* Next view */
+    struct _FV   *prev;     /* Prev view */
+    UINT32        base;     /* Base address */
+    UINT32        size;     /* Size in bytes */
+    UINT32        flags;    /* Allocation flags */
+    FILE_MAPPING *mapping;  /* File mapping */
+    BYTE          protect;  /* Protection for all pages at allocation time */
+    BYTE          prot[1];  /* Protection byte for each page */
+} FILE_VIEW;
+
+/* Per-page protection byte values */
+#define VPROT_READ       0x01
+#define VPROT_WRITE      0x02
+#define VPROT_EXEC       0x04
+#define VPROT_WRITECOPY  0x08
+#define VPROT_GUARD      0x10
+#define VPROT_NOCACHE    0x20
+#define VPROT_COMMITTED  0x40
+
+/* Per-view flags */
+#define VFLAG_SYSTEM     0x01
+
+/* Conversion from VPROT_* to Win32 flags */
+static const BYTE VIRTUAL_Win32Flags[16] =
+{
+    PAGE_NOACCESS,              /* 0 */
+    PAGE_READONLY,              /* READ */
+    PAGE_READWRITE,             /* WRITE */
+    PAGE_READWRITE,             /* READ | WRITE */
+    PAGE_EXECUTE,               /* EXEC */
+    PAGE_EXECUTE_READ,          /* READ | EXEC */
+    PAGE_EXECUTE_READWRITE,     /* WRITE | EXEC */
+    PAGE_EXECUTE_READWRITE,     /* READ | WRITE | EXEC */
+    PAGE_WRITECOPY,             /* WRITECOPY */
+    PAGE_WRITECOPY,             /* READ | WRITECOPY */
+    PAGE_WRITECOPY,             /* WRITE | WRITECOPY */
+    PAGE_WRITECOPY,             /* READ | WRITE | WRITECOPY */
+    PAGE_EXECUTE_WRITECOPY,     /* EXEC | WRITECOPY */
+    PAGE_EXECUTE_WRITECOPY,     /* READ | EXEC | WRITECOPY */
+    PAGE_EXECUTE_WRITECOPY,     /* WRITE | EXEC | WRITECOPY */
+    PAGE_EXECUTE_WRITECOPY      /* READ | WRITE | EXEC | WRITECOPY */
+};
+
+
+static FILE_VIEW *VIRTUAL_FirstView;
+
+static UINT32 page_shift;
+static UINT32 page_mask;
+
+#define ROUND_ADDR(addr) \
+   ((UINT32)(addr) & ~page_mask)
+
+#define ROUND_SIZE(addr,size) \
+   (((UINT32)(size) + ((UINT32)(addr) & page_mask) + page_mask) & ~page_mask)
+
+
+/***********************************************************************
+ *           VIRTUAL_DestroyMapping
+ *
+ * Destroy a FILE_MAPPING object.
+ */
+void VIRTUAL_DestroyMapping( K32OBJ *ptr )
+{
+    FILE_MAPPING *mapping = (FILE_MAPPING *)ptr;
+    assert( ptr->type == K32OBJ_MEM_MAPPED_FILE );
+
+    if (mapping->file) K32OBJ_DecCount( &mapping->file->header );
+    ptr->type = K32OBJ_UNKNOWN;
+    HeapFree( SystemHeap, 0, mapping );
+}
+
+
+/***********************************************************************
+ *           VIRTUAL_GetProtStr
+ */
+static const char *VIRTUAL_GetProtStr( BYTE prot )
+{
+    static char buffer[6];
+    buffer[0] = (prot & VPROT_COMMITTED) ? 'c' : '-';
+    buffer[1] = (prot & VPROT_GUARD) ? 'g' : '-';
+    buffer[2] = (prot & VPROT_READ) ? 'r' : '-';
+    buffer[3] = (prot & VPROT_WRITE) ?
+                    ((prot & VPROT_WRITECOPY) ? 'w' : 'W') : '-';
+    buffer[4] = (prot & VPROT_EXEC) ? 'x' : '-';
+    buffer[5] = 0;
+    return buffer;
+}
+
+
+/***********************************************************************
+ *           VIRTUAL_DumpView
+ */
+static void VIRTUAL_DumpView( FILE_VIEW *view )
+{
+    UINT32 i, count;
+    UINT32 addr = view->base;
+    BYTE prot = view->prot[0];
+
+    dprintf_virtual( stddeb, "View: %08x - %08x%s\n",
+                     view->base, view->base + view->size - 1,
+                     (view->flags & VFLAG_SYSTEM) ? " (system)" : "" );
+
+    for (count = i = 1; i < view->size >> page_shift; i++, count++)
+    {
+        if (view->prot[i] == prot) continue;
+        dprintf_virtual( stddeb, "    %08x - %08x %s\n",
+                         addr, addr + (count << page_shift) - 1,
+                         VIRTUAL_GetProtStr(prot) );
+        addr += (count << page_shift);
+        prot = view->prot[i];
+        count = 0;
+    }
+    if (count)
+        dprintf_virtual( stddeb, "    %08x - %08x %s\n",
+                         addr, addr + (count << page_shift) - 1,
+                         VIRTUAL_GetProtStr(prot) );
+}
+
+
+/***********************************************************************
+ *           VIRTUAL_Dump
+ */
+void VIRTUAL_Dump(void)
+{
+    FILE_VIEW *view = VIRTUAL_FirstView;
+    dprintf_virtual( stddeb, "\nDump of all virtual memory views:\n\n" );
+    while (view)
+    {
+        VIRTUAL_DumpView( view );
+        view = view->next;
+    }
+}
+
+
+/***********************************************************************
+ *           VIRTUAL_FindView
+ *
+ * Find the view containing a given address.
+ */
+static FILE_VIEW *VIRTUAL_FindView( UINT32 addr )
+{
+    FILE_VIEW *view = VIRTUAL_FirstView;
+    while (view)
+    {
+        if (view->base > addr) return NULL;
+        if (view->base + view->size > addr) return view;
+        view = view->next;
+    }
+    return NULL;
+}
+
+
+/***********************************************************************
+ *           VIRTUAL_CreateView
+ *
+ * Create a new view and add it in the linked list.
+ */
+static FILE_VIEW *VIRTUAL_CreateView( UINT32 base, UINT32 size,
+                                      UINT32 flags, BYTE vprot )
+{
+    FILE_VIEW *view, *prev;
+
+    /* Create the view structure */
+
+    size >>= page_shift;
+    view = (FILE_VIEW *)xmalloc( sizeof(*view) + size - 1 );
+    view->base    = base;
+    view->size    = size << page_shift;
+    view->flags   = flags;
+    view->protect = vprot;
+    memset( view->prot, vprot, size );
+
+    /* Insert it in the linked list */
+
+    if (!VIRTUAL_FirstView || (VIRTUAL_FirstView->base > base))
+    {
+        view->next = VIRTUAL_FirstView;
+        view->prev = NULL;
+        if (view->next) view->next->prev = view;
+        VIRTUAL_FirstView = view;
+    }
+    else
+    {
+        prev = VIRTUAL_FirstView;
+        while (prev->next && (prev->next->base < base)) prev = prev->next;
+        view->next = prev->next;
+        view->prev = prev;
+        if (view->next) view->next->prev = view;
+        prev->next  = view;
+    }
+    if (debugging_virtual) VIRTUAL_DumpView( view );
+    return view;
+}
+
+
+/***********************************************************************
+ *           VIRTUAL_DeleteView
+ *
+ * Delete an view.
+ */
+static void VIRTUAL_DeleteView( FILE_VIEW *view )
+{
+    munmap( (void *)view->base, view->size );
+    if (view->next) view->next->prev = view->prev;
+    if (view->prev) view->prev->next = view->next;
+    else VIRTUAL_FirstView = view->next;
+    free( view );
+}
+
+
+/***********************************************************************
+ *           VIRTUAL_GetUnixProt
+ *
+ * Convert page protections to protection for mmap/mprotect.
+ */
+static int VIRTUAL_GetUnixProt( BYTE vprot )
+{
+    int prot = 0;
+    if ((vprot & VPROT_COMMITTED) && !(vprot & VPROT_GUARD))
+    {
+        if (vprot & VPROT_READ) prot |= PROT_READ;
+        if (vprot & VPROT_WRITE) prot |= PROT_WRITE;
+        if (vprot & VPROT_EXEC) prot |= PROT_EXEC;
+    }
+    return prot;
+}
+
+
+/***********************************************************************
+ *           VIRTUAL_GetWin32Prot
+ *
+ * Convert page protections to Win32 flags.
+ */
+static void VIRTUAL_GetWin32Prot( BYTE vprot, DWORD *protect, DWORD *state )
+{
+    *protect = VIRTUAL_Win32Flags[vprot & 0x0f];
+    if (vprot & VPROT_GUARD) *protect |= PAGE_GUARD;
+    if (vprot & VPROT_NOCACHE) *protect |= PAGE_NOCACHE;
+
+    if (state) *state = (vprot & VPROT_COMMITTED) ? MEM_COMMIT : MEM_RESERVE;
+}
+
+
+/***********************************************************************
+ *           VIRTUAL_GetProt
+ *
+ * Build page protections from Win32 flags.
+ */
+static BYTE VIRTUAL_GetProt( DWORD protect )
+{
+    BYTE vprot;
+
+    switch(protect & 0xff)
+    {
+    case PAGE_READONLY:
+        vprot = VPROT_READ;
+        break;
+    case PAGE_READWRITE:
+        vprot = VPROT_READ | VPROT_WRITE;
+        break;
+    case PAGE_WRITECOPY:
+        vprot = VPROT_READ | VPROT_WRITE | VPROT_WRITECOPY;
+        break;
+    case PAGE_EXECUTE:
+        vprot = VPROT_EXEC;
+        break;
+    case PAGE_EXECUTE_READ:
+        vprot = VPROT_EXEC | VPROT_READ;
+        break;
+    case PAGE_EXECUTE_READWRITE:
+        vprot = VPROT_EXEC | VPROT_READ | VPROT_WRITE | VPROT_WRITECOPY;
+        break;
+    case PAGE_EXECUTE_WRITECOPY:
+        vprot = VPROT_EXEC | VPROT_READ | VPROT_WRITE;
+        break;
+    case PAGE_NOACCESS:
+    default:
+        vprot = 0;
+        break;
+    }
+    if (protect & PAGE_GUARD) vprot |= VPROT_GUARD;
+    if (protect & PAGE_NOCACHE) vprot |= VPROT_NOCACHE;
+    return vprot;
+}
+
+
+/***********************************************************************
+ *           VIRTUAL_SetProt
+ *
+ * Change the protection of a range of pages.
+ */
+static BOOL32 VIRTUAL_SetProt( FILE_VIEW *view, UINT32 base,
+                               UINT32 size, BYTE vprot )
+{
+    dprintf_virtual( stddeb, "VIRTUAL_SetProt: %08x-%08x %s\n",
+                     base, base + size - 1, VIRTUAL_GetProtStr( vprot ) );
+
+    if (mprotect( (void *)base, size, VIRTUAL_GetUnixProt(vprot) ))
+        return FALSE;  /* FIXME: last error */
+
+    memset( view->prot + ((base - view->base) >> page_shift),
+            vprot, size >> page_shift );
+    if (debugging_virtual) VIRTUAL_DumpView( view );
+    return TRUE;
+}
+
+
+/***********************************************************************
+ *             VIRTUAL_CheckFlags
+ *
+ * Check that all pages in a range have the given flags.
+ */
+static BOOL32 VIRTUAL_CheckFlags( UINT32 base, UINT32 size, BYTE flags )
+{
+    FILE_VIEW *view;
+    UINT32 page;
+
+    if (!size) return TRUE;
+    if (!(view = VIRTUAL_FindView( base ))) return FALSE;
+    if (view->base + view->size < base + size) return FALSE;
+    page = (base - view->base) >> page_shift;
+    size = ROUND_SIZE( base, size ) >> page_shift;
+    while (size--) if ((view->prot[page++] & flags) != flags) return FALSE;
+    return TRUE;
+}
+
+
+/***********************************************************************
+ *           VIRTUAL_Init
+ */
+BOOL32 VIRTUAL_Init(void)
+{
+    SYSTEM_INFO sysinfo;
+    GetSystemInfo( &sysinfo );
+
+    page_mask = sysinfo.dwPageSize - 1;
+    /* Make sure we have a power of 2 */
+    assert( !(sysinfo.dwPageSize & page_mask) );
+    page_shift = 0;
+    while ((1 << page_shift) != sysinfo.dwPageSize) page_shift++;
+
+#ifdef linux
+    {
+	FILE *f = fopen( "/proc/self/maps", "r" );
+        if (f)
+        {
+            char buffer[80];
+            while (fgets( buffer, sizeof(buffer), f ))
+            {
+                int start, end, offset;
+                char r, w, x, p;
+                BYTE vprot = VPROT_COMMITTED;
+
+                sscanf( buffer, "%x-%x %c%c%c%c %x",
+                        &start, &end, &r, &w, &x, &p, &offset );
+                if (r == 'r') vprot |= VPROT_READ;
+                if (w == 'w') vprot |= VPROT_WRITE;
+                if (x == 'x') vprot |= VPROT_EXEC;
+                if (p == 'p') vprot |= VPROT_WRITECOPY;
+                VIRTUAL_CreateView( start, end - start, VFLAG_SYSTEM, vprot );
+            }
+            fclose( f );
+        }
+    }
+#endif  /* linux */
+    return TRUE;
+}
+
+
+/***********************************************************************
+ *             VirtualAlloc   (KERNEL32.548)
+ */
+LPVOID VirtualAlloc( LPVOID addr, DWORD size, DWORD type, DWORD protect )
+{
+    FILE_VIEW *view;
+    UINT32 base, ptr, view_size;
+    BYTE vprot;
+
+    dprintf_virtual( stddeb, "VirtualAlloc: %08x %08lx %lx %08lx\n",
+                     (UINT32)addr, size, type, protect );
+
+    /* Round parameters to a page boundary */
+
+    if (size > 0x7fc00000)  /* 2Gb - 4Mb */
+    {
+        SetLastError( ERROR_OUTOFMEMORY );
+        return NULL;
+    }
+    if (addr)
+    {
+        if (type & MEM_RESERVE) /* Round down to 64k boundary */
+            base = ((UINT32)addr + 0xffff) & ~0xffff;
+        else
+            base = ROUND_ADDR( addr );
+        size = (((UINT32)addr + size + page_mask) & ~page_mask) - base;
+        if (base + size < base)  /* Disallow wrap-around */
+        {
+            SetLastError( ERROR_INVALID_PARAMETER );
+            return NULL;
+        }
+    }
+    else
+    {
+        base = 0;
+        size = (size + page_mask) & ~page_mask;
+    }
+
+    /* Compute the protection flags */
+
+    if (!(type & (MEM_COMMIT | MEM_RESERVE)) ||
+        (type & ~(MEM_COMMIT | MEM_RESERVE)))
+    {
+        SetLastError( ERROR_INVALID_PARAMETER );
+        return NULL;
+    }
+    if (type & MEM_COMMIT)
+        vprot = VIRTUAL_GetProt( protect ) | VPROT_COMMITTED;
+    else vprot = 0;
+
+    /* Reserve the memory */
+
+    if ((type & MEM_RESERVE) || !base)
+    {
+        view_size = size + (base ? 0 : 0x10000);
+        ptr = (UINT32)FILE_mmap( NULL, (LPVOID)base, 0, view_size, 0, 0,
+                                 VIRTUAL_GetUnixProt( vprot ), MAP_PRIVATE );
+        if (ptr == (UINT32)-1)
+        {
+            SetLastError( ERROR_OUTOFMEMORY );
+            return NULL;
+        }
+        if (!base)
+        {
+            /* Release the extra memory while keeping the range */
+            /* starting on a 64k boundary. */
+
+            if (ptr & 0xffff0000)
+            {
+                munmap( (void *)ptr, 0x10000 - (ptr & 0xffff) );
+                view_size -= (ptr & 0xffff);
+                ptr = (ptr + 0x10000) & 0xffff0000;
+            }
+            if (view_size > size)
+                munmap( (void *)(ptr + size), view_size - size );
+        }
+        if (!(view = VIRTUAL_CreateView( ptr, size, 0, vprot )))
+        {
+            munmap( (void *)ptr, size );
+            return NULL;  /* FIXME: last error */
+        }
+        if (debugging_virtual) VIRTUAL_DumpView( view );
+        return (LPVOID)ptr;
+    }
+
+    /* Commit the pages */
+
+    if (!(view = VIRTUAL_FindView( base )) ||
+        (base + size > view->base + view->size))
+    {
+        SetLastError( ERROR_INVALID_PARAMETER );
+        return NULL;
+    }
+
+    if (!VIRTUAL_SetProt( view, base, size, vprot )) return NULL;
+    return (LPVOID)base;
+}
+
+
+/***********************************************************************
+ *             VirtualFree   (KERNEL32.550)
+ */
+BOOL32 VirtualFree( LPVOID addr, DWORD size, DWORD type )
+{
+    FILE_VIEW *view;
+    UINT32 base;
+
+    dprintf_virtual( stddeb, "VirtualFree: %08x %08lx %lx\n",
+                     (UINT32)addr, size, type );
+
+    /* Fix the parameters */
+
+    size = ROUND_SIZE( addr, size );
+    base = ROUND_ADDR( addr );
+
+    if (!(view = VIRTUAL_FindView( base )) ||
+        (base + size > view->base + view->size))
+    {
+        SetLastError( ERROR_INVALID_PARAMETER );
+        return FALSE;
+    }
+
+    /* Compute the protection flags */
+
+    if ((type != MEM_DECOMMIT) && (type != MEM_RELEASE))
+    {
+        SetLastError( ERROR_INVALID_PARAMETER );
+        return FALSE;
+    }
+
+    /* Free the pages */
+
+    if (type == MEM_RELEASE)
+    {
+        if (size || (base != view->base))
+        {
+            SetLastError( ERROR_INVALID_PARAMETER );
+            return FALSE;
+        }
+        VIRTUAL_DeleteView( view );
+        return TRUE;
+    }
+
+    /* Decommit the pages */
+
+    return VIRTUAL_SetProt( view, base, size, 0 );
+}
+
+
+/***********************************************************************
+ *             VirtualLock   (KERNEL32.551)
+ */
+BOOL32 VirtualLock( LPVOID addr, DWORD size )
+{
+    return TRUE;
+}
+
+
+/***********************************************************************
+ *             VirtualUnlock   (KERNEL32.556)
+ */
+BOOL32 VirtualUnlock( LPVOID addr, DWORD size )
+{
+    return TRUE;
+}
+
+
+/***********************************************************************
+ *             VirtualProtect   (KERNEL32.552)
+ */
+BOOL32 VirtualProtect( LPVOID addr, DWORD size, DWORD new_prot,
+                       LPDWORD old_prot )
+{
+    FILE_VIEW *view;
+    UINT32 base, i;
+    BYTE vprot, *p;
+
+    dprintf_virtual( stddeb, "VirtualProtect: %08x %08lx %08lx\n",
+                     (UINT32)addr, size, new_prot );
+
+    /* Fix the parameters */
+
+    size = ROUND_SIZE( addr, size );
+    base = ROUND_ADDR( addr );
+
+    if (!(view = VIRTUAL_FindView( base )) ||
+        (base + size > view->base + view->size))
+    {
+        SetLastError( ERROR_INVALID_PARAMETER );
+        return FALSE;
+    }
+
+    /* Make sure all the pages are committed */
+
+    p = view->prot + ((base - view->base) >> page_shift);
+    for (i = size >> page_shift; i; i--, p++)
+    {
+        if (!(*p & VPROT_COMMITTED))
+        {
+            SetLastError( ERROR_INVALID_PARAMETER );
+            return FALSE;
+        }
+    }
+
+    VIRTUAL_GetWin32Prot( view->prot[0], old_prot, NULL );
+    vprot = VIRTUAL_GetProt( new_prot ) | VPROT_COMMITTED;
+    return VIRTUAL_SetProt( view, base, size, vprot );
+}
+
+
+/***********************************************************************
+ *             VirtualProtectEx   (KERNEL32.553)
+ */
+BOOL32 VirtualProtectEx( HANDLE32 handle, LPVOID addr, DWORD size,
+                         DWORD new_prot, LPDWORD old_prot )
+{
+    BOOL32 ret = FALSE;
+
+    PDB32 *pdb = (PDB32 *)PROCESS_GetObjPtr( handle, K32OBJ_PROCESS );
+    if (pdb)
+    {
+        if (pdb == pCurrentProcess)
+            ret = VirtualProtect( addr, size, new_prot, old_prot );
+        else
+            fprintf(stderr,"Unsupported: VirtualProtectEx on other process\n");
+        K32OBJ_DecCount( &pdb->header );
+    }
+    return ret;
+}
+
+
+/***********************************************************************
+ *             VirtualQuery   (KERNEL32.554)
+ */
+BOOL32 VirtualQuery( LPCVOID addr, LPMEMORY_BASIC_INFORMATION info, DWORD len )
+{
+    FILE_VIEW *view = VIRTUAL_FirstView;
+    UINT32 base = ROUND_ADDR( addr );
+    UINT32 alloc_base = 0;
+    UINT32 size = 0;
+
+    /* Find the view containing the address */
+
+    for (;;)
+    {
+        if (!view)
+        {
+            size = 0xffff0000 - alloc_base;
+            break;
+        }
+        if (view->base > base)
+        {
+            size = view->base - alloc_base;
+            view = NULL;
+            break;
+        }
+        if (view->base + view->size > base)
+        {
+            alloc_base = view->base;
+            size = view->size;
+            break;
+        }
+        alloc_base = view->base + view->size;
+        view = view->next;
+    }
+
+    /* Fill the info structure */
+
+    if (!view)
+    {
+        info->State             = MEM_FREE;
+        info->Protect           = 0;
+        info->AllocationProtect = 0;
+        info->Type              = 0;
+    }
+    else
+    {
+        BYTE vprot = view->prot[(base - alloc_base) >> page_shift];
+        VIRTUAL_GetWin32Prot( vprot, &info->Protect, &info->State );
+        for (size = base - alloc_base; size < view->size; size += page_mask+1)
+            if (view->prot[size >> page_shift] != vprot) break;
+        info->AllocationProtect = view->protect;
+        info->Type              = MEM_PRIVATE;  /* FIXME */
+    }
+
+    info->BaseAddress    = (LPVOID)base;
+    info->AllocationBase = (LPVOID)alloc_base;
+    info->RegionSize     = size - (base - alloc_base);
+    return TRUE;
+}
+
+
+/***********************************************************************
+ *             VirtualQueryEx   (KERNEL32.555)
+ */
+BOOL32 VirtualQueryEx( HANDLE32 handle, LPCVOID addr,
+                       LPMEMORY_BASIC_INFORMATION info, DWORD len )
+{
+    BOOL32 ret = FALSE;
+
+    PDB32 *pdb = (PDB32 *)PROCESS_GetObjPtr( handle, K32OBJ_PROCESS );
+    if (pdb)
+    {
+        if (pdb == pCurrentProcess)
+            ret = VirtualQuery( addr, info, len );
+        else
+            fprintf(stderr,"Unsupported: VirtualQueryEx on other process\n");
+        K32OBJ_DecCount( &pdb->header );
+    }
+    return ret;
+}
+
+
+/***********************************************************************
+ *             IsBadReadPtr32   (KERNEL32.354)
+ */
+BOOL32 IsBadReadPtr32( LPCVOID ptr, UINT32 size )
+{
+    return !VIRTUAL_CheckFlags( (UINT32)ptr, size,
+                                VPROT_READ | VPROT_COMMITTED );
+}
+
+
+/***********************************************************************
+ *             IsBadWritePtr32   (KERNEL32.357)
+ */
+BOOL32 IsBadWritePtr32( LPVOID ptr, UINT32 size )
+{
+    return !VIRTUAL_CheckFlags( (UINT32)ptr, size,
+                                VPROT_WRITE | VPROT_COMMITTED );
+}
+
+
+/***********************************************************************
+ *             IsBadHugeReadPtr32   (KERNEL32.352)
+ */
+BOOL32 IsBadHugeReadPtr32( LPCVOID ptr, UINT32 size )
+{
+    return IsBadReadPtr32( ptr, size );
+}
+
+
+/***********************************************************************
+ *             IsBadHugeWritePtr32   (KERNEL32.353)
+ */
+BOOL32 IsBadHugeWritePtr32( LPVOID ptr, UINT32 size )
+{
+    return IsBadWritePtr32( ptr, size );
+}
+
+
+/***********************************************************************
+ *             IsBadCodePtr32   (KERNEL32.351)
+ */
+BOOL32 IsBadCodePtr32( FARPROC32 ptr )
+{
+    return !VIRTUAL_CheckFlags( (UINT32)ptr, 1, VPROT_EXEC | VPROT_COMMITTED );
+}
+
+
+/***********************************************************************
+ *             IsBadStringPtr32A   (KERNEL32.355)
+ */
+BOOL32 IsBadStringPtr32A( LPCSTR str, UINT32 max )
+{
+    FILE_VIEW *view;
+    UINT32 page, count;
+
+    if (!max) return FALSE;
+    if (!(view = VIRTUAL_FindView( (UINT32)str ))) return TRUE;
+    page  = ((UINT32)str - view->base) >> page_shift;
+    count = page_mask + 1 - ((UINT32)str & page_mask);
+
+    while (max)
+    {
+        if ((view->prot[page] & (VPROT_READ | VPROT_COMMITTED)) != 
+                                                (VPROT_READ | VPROT_COMMITTED))
+            return TRUE;
+        if (count > max) count = max;
+        max -= count;
+        while (count--) if (!*str++) return FALSE;
+        if (++page >= view->size >> page_shift) return TRUE;
+        count = page_mask + 1;
+    }
+    return FALSE;
+}
+
+
+/***********************************************************************
+ *             IsBadStringPtr32W   (KERNEL32.356)
+ */
+BOOL32 IsBadStringPtr32W( LPCWSTR str, UINT32 max )
+{
+    FILE_VIEW *view;
+    UINT32 page, count;
+
+    if (!max) return FALSE;
+    if (!(view = VIRTUAL_FindView( (UINT32)str ))) return TRUE;
+    page  = ((UINT32)str - view->base) >> page_shift;
+    count = (page_mask + 1 - ((UINT32)str & page_mask)) / sizeof(WCHAR);
+
+    while (max)
+    {
+        if ((view->prot[page] & (VPROT_READ | VPROT_COMMITTED)) != 
+                                                (VPROT_READ | VPROT_COMMITTED))
+            return TRUE;
+        if (count > max) count = max;
+        max -= count;
+        while (count--) if (!*str++) return FALSE;
+        if (++page >= view->size >> page_shift) return TRUE;
+        count = (page_mask + 1) / sizeof(WCHAR);
+    }
+    return FALSE;
+}
+
+
+/***********************************************************************
+ *             CreateFileMapping32A   (KERNEL32.46)
+ */
+HANDLE32 CreateFileMapping32A( HFILE32 hFile, LPSECURITY_ATTRIBUTES attr,
+                               DWORD protect, DWORD size_high, DWORD size_low,
+                               LPCSTR name )
+{
+    FILE_MAPPING *mapping = NULL;
+    HANDLE32 handle;
+
+    K32OBJ *obj = K32OBJ_FindName( name );
+    if (obj)
+    {
+        if (obj->type == K32OBJ_MEM_MAPPED_FILE)
+        {
+            SetLastError( ERROR_ALREADY_EXISTS );
+            return PROCESS_AllocHandle( obj, 0 );
+        }
+        SetLastError( ERROR_DUP_NAME );
+        return 0;
+    }
+
+    printf( "CreateFileMapping32A(%x,%p,%08lx,%08lx%08lx,%s)\n",
+            hFile, attr, protect, size_high, size_low, name );
+
+    if (hFile == INVALID_HANDLE_VALUE32)
+    {
+        if (!size_high && !size_low)
+        {
+            SetLastError( ERROR_INVALID_PARAMETER );
+            return 0;
+        }
+        obj = NULL;
+    }
+    else  /* We have a file */
+    {
+        BY_HANDLE_FILE_INFORMATION info;
+        if (!(obj = PROCESS_GetObjPtr( hFile, K32OBJ_FILE ))) goto error;
+        if (!GetFileInformationByHandle( hFile, &info )) goto error;
+        if (!size_high && !size_low)
+        {
+            size_high = info.nFileSizeHigh;
+            size_low  = info.nFileSizeLow;
+        }
+        else if ((size_high > info.nFileSizeHigh) ||
+                 ((size_high == info.nFileSizeHigh) &&
+                  (size_low > info.nFileSizeLow)))
+        {
+            /* We have to grow the file */
+            if (SetFilePointer( hFile, size_low, &size_high,
+                                FILE_BEGIN ) == 0xffffffff) goto error;
+            if (!SetEndOfFile( hFile )) goto error;
+        }
+    }
+
+    if (!(mapping = HeapAlloc( SystemHeap, 0, sizeof(*mapping) ))) goto error;
+    mapping->protect   = VIRTUAL_GetProt( protect ) | VPROT_COMMITTED;
+    mapping->size_high = size_high;
+    mapping->size_low  = size_low;
+    mapping->file      = (FILE_OBJECT *)obj;
+
+    handle = PROCESS_AllocHandle( &mapping->header, 0 );
+    if (handle != INVALID_HANDLE_VALUE32) return handle;
+
+error:
+    if (obj) K32OBJ_DecCount( obj );
+    if (mapping) HeapFree( SystemHeap, 0, mapping );
+    return 0;
+}
+
+
+/***********************************************************************
+ *             CreateFileMapping32W   (KERNEL32.47)
+ */
+HANDLE32 CreateFileMapping32W( HFILE32 hFile, LPSECURITY_ATTRIBUTES attr,
+                               DWORD protect, DWORD size_high, DWORD size_low,
+                               LPCWSTR name )
+{
+    LPSTR nameA = HEAP_strdupWtoA( GetProcessHeap(), 0, name );
+    HANDLE32 ret = CreateFileMapping32A( hFile, attr, protect,
+                                         size_high, size_low, nameA );
+    HeapFree( GetProcessHeap(), 0, nameA );
+    return ret;
+}
+
+
+/***********************************************************************
+ *             OpenFileMapping32A   (KERNEL32.397)
+ */
+HANDLE32 OpenFileMapping32A( DWORD access, BOOL32 inherit, LPCSTR name )
+{
+    K32OBJ *obj = K32OBJ_FindNameType( name, K32OBJ_MEM_MAPPED_FILE );
+    if (!obj) return 0;
+    return PROCESS_AllocHandle( obj, 0 );
+}
+
+
+/***********************************************************************
+ *             OpenFileMapping32W   (KERNEL32.398)
+ */
+HANDLE32 OpenFileMapping32W( DWORD access, BOOL32 inherit, LPCWSTR name )
+{
+    LPSTR nameA = HEAP_strdupWtoA( GetProcessHeap(), 0, name );
+    HANDLE32 ret = OpenFileMapping32A( access, inherit, nameA );
+    HeapFree( GetProcessHeap(), 0, nameA );
+    return ret;
+}
+
+
+/***********************************************************************
+ *             MapViewOfFile   (KERNEL32.385)
+ */
+LPVOID MapViewOfFile( HANDLE32 mapping, DWORD access, DWORD offset_high,
+                      DWORD offset_low, DWORD count )
+{
+    return MapViewOfFileEx( mapping, access, offset_high,
+                            offset_low, count, NULL );
+}
+
+
+/***********************************************************************
+ *             MapViewOfFileEx   (KERNEL32.386)
+ */
+LPVOID MapViewOfFileEx( HANDLE32 handle, DWORD access, DWORD offset_high,
+                        DWORD offset_low, DWORD count, LPVOID addr )
+{
+    FILE_MAPPING *mapping;
+    LPVOID ret;
+
+    if (!(mapping = (FILE_MAPPING *)PROCESS_GetObjPtr( handle,
+                                                     K32OBJ_MEM_MAPPED_FILE )))
+        return NULL;
+
+    ret = FILE_mmap(mapping->file, addr, mapping->size_high, mapping->size_low,
+                    offset_high, offset_low, mapping->protect, MAP_PRIVATE );
+
+    K32OBJ_DecCount( &mapping->header );
+    return ret;
+}
+
+
+/***********************************************************************
+ *             UnmapViewOfFile   (KERNEL32.540)
+ */
+BOOL32 UnmapViewOfFile( LPVOID addr )
+{
+    FILE_VIEW *view;
+    UINT32 base = ROUND_ADDR( addr );
+    if (!(view = VIRTUAL_FindView( base )) || (base != view->base))
+    {
+        SetLastError( ERROR_INVALID_PARAMETER );
+        return FALSE;
+    }
+    VIRTUAL_DeleteView( view );
+    return TRUE;
+}
diff --git a/misc/clipboard.c b/misc/clipboard.c
index bc64aacf590..9282a447b8b 100644
--- a/misc/clipboard.c
+++ b/misc/clipboard.c
@@ -45,7 +45,7 @@ static HWND32 hWndClipOwner  = 0;   /* current clipboard owner */
 static HWND32 hWndClipWindow = 0;   /* window that opened clipboard */
 static HWND32 hWndViewer     = 0;   /* start of viewers chain */
 
-static BOOL bClipChanged  = FALSE;
+static BOOL32 bClipChanged  = FALSE;
 static WORD LastRegFormat = CF_REGFORMATBASE;
 
 static Bool   selectionWait = False;
@@ -158,7 +158,7 @@ void CLIPBOARD_DeleteRecord(LPCLIPFORMAT lpFormat)
 /**************************************************************************
  *			CLIPBOARD_RequestXSelection
  */
-BOOL CLIPBOARD_RequestXSelection()
+BOOL32 CLIPBOARD_RequestXSelection()
 {
   HWND32 hWnd = (hWndClipWindow) ? hWndClipWindow : GetActiveWindow32();
 
@@ -184,13 +184,13 @@ BOOL CLIPBOARD_RequestXSelection()
   dprintf_clipboard(stddeb,"\tgot CF_OEMTEXT = %i\n", 
 		    ClipFormats[CF_OEMTEXT-1].wDataPresent);
 
-  return (BOOL)ClipFormats[CF_OEMTEXT-1].wDataPresent;
+  return (BOOL32)ClipFormats[CF_OEMTEXT-1].wDataPresent;
 }
 
 /**************************************************************************
  *			CLIPBOARD_IsPresent
  */
-BOOL CLIPBOARD_IsPresent(WORD wFormat)
+BOOL32 CLIPBOARD_IsPresent(WORD wFormat)
 {
     LPCLIPFORMAT lpFormat = ClipFormats; 
 
@@ -332,9 +332,9 @@ HWND32 GetClipboardOwner32(void)
 
 
 /**************************************************************************
- *			SetClipboardData	[USER.141]
+ *            SetClipboardData16   (USER.141)
  */
-HANDLE16 SetClipboardData(WORD wFormat, HANDLE16 hData)
+HANDLE16 SetClipboardData16( UINT16 wFormat, HANDLE16 hData )
 {
     LPCLIPFORMAT lpFormat = ClipFormats; 
     Window       owner;
@@ -387,13 +387,24 @@ HANDLE16 SetClipboardData(WORD wFormat, HANDLE16 hData)
     return lpFormat->hData;
 }
 
+
+/**************************************************************************
+ *            SetClipboardData32   (USER32.469)
+ */
+HANDLE32 SetClipboardData32( UINT32 wFormat, HANDLE32 hData )
+{
+    fprintf( stderr, "SetClipboardData: empty stub\n" );
+    return 0;
+}
+
+
 /**************************************************************************
  *                      CLIPBOARD_RenderFormat
  */
 BOOL32 CLIPBOARD_RenderFormat(LPCLIPFORMAT lpFormat)
 {
  if( lpFormat->wDataPresent && !lpFormat->hData )
-   if( IsWindow(hWndClipOwner) )
+   if( IsWindow32(hWndClipOwner) )
        SendMessage16(hWndClipOwner,WM_RENDERFORMAT,
                      (WPARAM16)lpFormat->wFormatID,0L);
    else
@@ -411,7 +422,7 @@ BOOL32 CLIPBOARD_RenderFormat(LPCLIPFORMAT lpFormat)
  */
 BOOL32 CLIPBOARD_RenderText(LPCLIPFORMAT lpTarget, LPCLIPFORMAT lpSource)
 {
-  UINT		size = GlobalSize16( lpSource->hData );
+  UINT16 size = GlobalSize16( lpSource->hData );
   LPCSTR	lpstrS = (LPSTR)GlobalLock16(lpSource->hData);
   LPSTR		lpstrT;
 
@@ -437,9 +448,9 @@ BOOL32 CLIPBOARD_RenderText(LPCLIPFORMAT lpTarget, LPCLIPFORMAT lpSource)
 }
 
 /**************************************************************************
- *			GetClipboardData	[USER.142]
+ *             GetClipboardData16   (USER.142)
  */
-HANDLE16 GetClipboardData(WORD wFormat)
+HANDLE16 GetClipboardData16( UINT16 wFormat )
 {
     LPCLIPFORMAT lpRender = ClipFormats; 
     LPCLIPFORMAT lpUpdate = NULL;
@@ -485,6 +496,15 @@ HANDLE16 GetClipboardData(WORD wFormat)
 }
 
 
+/**************************************************************************
+ *             GetClipboardData32   (USER32.221)
+ */
+HANDLE32 GetClipboardData32( UINT32 wFormat )
+{
+    fprintf( stderr, "GetClipboardData32: empty stub\n" );
+    return 0;
+}
+
 /**************************************************************************
  *           CountClipboardFormats16   (USER.143)
  */
@@ -644,14 +664,23 @@ UINT32 RegisterClipboardFormat32W( LPCWSTR formatName )
 }
 
 /**************************************************************************
- *			GetClipboardFormatName	[USER.146]
+ *            GetClipboardFormatName16   (USER.146)
+ */
+INT16 GetClipboardFormatName16( UINT16 wFormat, LPSTR retStr, INT16 maxlen )
+{
+    return GetClipboardFormatName32A( wFormat, retStr, maxlen );
+}
+
+
+/**************************************************************************
+ *            GetClipboardFormatName32A   (USER32.222)
  */
-int GetClipboardFormatName(WORD wFormat, LPSTR retStr, short maxlen)
+INT32 GetClipboardFormatName32A( UINT32 wFormat, LPSTR retStr, INT32 maxlen )
 {
     LPCLIPFORMAT lpFormat = ClipFormats; 
 
     dprintf_clipboard(stddeb,
-	"GetClipboardFormat(%04X, %p, %d) !\n", wFormat, retStr, maxlen);
+	"GetClipboardFormatName(%04X, %p, %d) !\n", wFormat, retStr, maxlen);
 
     while(TRUE) {
 	if (lpFormat == NULL) return 0;
@@ -665,13 +694,24 @@ int GetClipboardFormatName(WORD wFormat, LPSTR retStr, short maxlen)
     dprintf_clipboard(stddeb,
 		"GetClipboardFormat // Name='%s' !\n", lpFormat->Name);
 
-    strncpy(retStr, lpFormat->Name, maxlen - 1);
-    retStr[maxlen] = 0;
-
+    lstrcpyn32A( retStr, lpFormat->Name, maxlen );
     return strlen(retStr);
 }
 
 
+/**************************************************************************
+ *            GetClipboardFormatName32W   (USER32.223)
+ */
+INT32 GetClipboardFormatName32W( UINT32 wFormat, LPWSTR retStr, INT32 maxlen )
+{
+    LPSTR p = HEAP_xalloc( GetProcessHeap(), 0, maxlen );
+    INT32 ret = GetClipboardFormatName32A( wFormat, p, maxlen );
+    lstrcpynAtoW( retStr, p, maxlen );
+    HeapFree( GetProcessHeap(), 0, p );
+    return ret;
+}
+
+
 /**************************************************************************
  *            SetClipboardViewer16   (USER.147)
  */
@@ -714,7 +754,7 @@ HWND32 GetClipboardViewer32(void)
 
 
 /**************************************************************************
- *			ChangeClipboardChain	[USER.149]
+ *           ChangeClipboardChain16   (USER.149)
  */
 BOOL16 ChangeClipboardChain16(HWND16 hWnd, HWND16 hWndNext)
 {
@@ -722,7 +762,7 @@ BOOL16 ChangeClipboardChain16(HWND16 hWnd, HWND16 hWndNext)
 }
 
 /**************************************************************************
- *			ChangeClipboardChain	[USER32.21]
+ *           ChangeClipboardChain32   (USER32.21)
  */
 BOOL32 ChangeClipboardChain32(HWND32 hWnd, HWND32 hWndNext)
 {
@@ -785,13 +825,23 @@ HWND32 GetOpenClipboardWindow32(void)
 
 
 /**************************************************************************
- *			GetPriorityClipboardFormat	[USER.402]
+ *             GetPriorityClipboardFormat16   (USER.402)
  */
-int GetPriorityClipboardFormat(WORD *lpPriorityList, short nCount)
+INT16 GetPriorityClipboardFormat16( UINT16 *lpPriorityList, INT16 nCount)
 {
-    dprintf_clipboard(stdnimp,
-	"GetPriorityClipboardFormat(%p, %d) !\n", lpPriorityList, nCount);
+    fprintf( stderr, "GetPriorityClipboardFormat16(%p, %d): stub\n",
+             lpPriorityList, nCount );
+    return 0;
+}
 
+
+/**************************************************************************
+ *             GetPriorityClipboardFormat32   (USER32
+ */
+INT32 GetPriorityClipboardFormat32( UINT32 *lpPriorityList, INT32 nCount )
+{
+    fprintf( stderr, "GetPriorityClipboardFormat32(%p, %d): stub\n",
+             lpPriorityList, nCount );
     return 0;
 }
 
diff --git a/misc/commdlg.c b/misc/commdlg.c
index 7ebe94ce64f..07ced791571 100644
--- a/misc/commdlg.c
+++ b/misc/commdlg.c
@@ -32,9 +32,9 @@ static HBITMAP16 hBitmapTT = 0;
 /***********************************************************************
  * 				FileDlg_Init			[internal]
  */
-static BOOL FileDlg_Init()
+static BOOL32 FileDlg_Init()
 {
-    static BOOL initialized = 0;
+    static BOOL32 initialized = 0;
     
     if (!initialized) {
 	if (!hFolder) hFolder = LoadBitmap16(0, MAKEINTRESOURCE(OBM_FOLDER));
@@ -56,7 +56,7 @@ static BOOL FileDlg_Init()
 /***********************************************************************
  *           GetOpenFileName   (COMMDLG.1)
  */
-BOOL GetOpenFileName( SEGPTR ofn )
+BOOL16 GetOpenFileName( SEGPTR ofn )
 {
     HINSTANCE16 hInst;
     HANDLE16 hDlgTmpl = 0, hResInfo;
@@ -114,7 +114,7 @@ BOOL GetOpenFileName( SEGPTR ofn )
 /***********************************************************************
  *           GetSaveFileName   (COMMDLG.2)
  */
-BOOL GetSaveFileName( SEGPTR ofn)
+BOOL16 GetSaveFileName( SEGPTR ofn)
 {
     HINSTANCE16 hInst;
     HANDLE16 hDlgTmpl = 0;
@@ -193,7 +193,7 @@ static void FILEDLG_StripEditControl(HWND16 hwnd)
 /***********************************************************************
  * 				FILEDLG_ScanDir			[internal]
  */
-static BOOL FILEDLG_ScanDir(HWND16 hWnd, LPSTR newPath)
+static BOOL32 FILEDLG_ScanDir(HWND16 hWnd, LPSTR newPath)
 {
     int len;
     char str[512];
@@ -255,9 +255,9 @@ static LONG FILEDLG_WMDrawItem(HWND16 hWnd, WPARAM16 wParam, LPARAM lParam,int s
 
 	if (savedlg)       /* use _gray_ text in FileSaveDlg */
 	  if (!lpdis->itemState)
-	    SetTextColor(lpdis->hDC,GetSysColor32(COLOR_GRAYTEXT) );
+	    SetTextColor32(lpdis->hDC,GetSysColor32(COLOR_GRAYTEXT) );
 	  else  
-	    SetTextColor(lpdis->hDC,GetSysColor32(COLOR_WINDOWTEXT) );
+	    SetTextColor32(lpdis->hDC,GetSysColor32(COLOR_WINDOWTEXT) );
 	    /* inversion of gray would be bad readable */	  	  
 
 	TextOut16(lpdis->hDC, lpdis->rcItem.left, lpdis->rcItem.top,
@@ -431,8 +431,8 @@ static LONG FILEDLG_WMInitDialog(HWND16 hWnd, WPARAM16 wParam, LPARAM lParam)
   if (lpofn->Flags & OFN_HIDEREADONLY)
     ShowWindow32(GetDlgItem32(hWnd, chx1), SW_HIDE); 
   if (FILEDLG_HookCallChk(lpofn))
-     return (BOOL)CallWindowProc16(lpofn->lpfnHook, 
-                                   hWnd,  WM_INITDIALOG, wParam, lParam );
+     return (BOOL16)CallWindowProc16(lpofn->lpfnHook, 
+                                     hWnd,  WM_INITDIALOG, wParam, lParam );
   else  
      return TRUE;
 }
@@ -447,7 +447,7 @@ static LRESULT FILEDLG_WMCommand(HWND16 hWnd, WPARAM16 wParam, LPARAM lParam)
   OPENFILENAME ofn2;
   char tmpstr[512], tmpstr2[512];
   LPSTR pstr, pstr2;
-  UINT control,notification;
+  UINT16 control,notification;
 
   /* Notifications are packaged differently in Win32 */
   control = wParam;
@@ -608,7 +608,7 @@ static LRESULT FILEDLG_WMCommand(HWND16 hWnd, WPARAM16 wParam, LPARAM lParam)
 	}
       if (FILEDLG_HookCallChk(lpofn))
       {
-       lRet= (BOOL)CallWindowProc16(lpofn->lpfnHook,
+       lRet= (BOOL16)CallWindowProc16(lpofn->lpfnHook,
                hWnd, RegisterWindowMessage32A( FILEOKSTRING ), 0, lParam );
        if (lRet)       
        {
@@ -632,14 +632,14 @@ static LRESULT FILEDLG_WMCommand(HWND16 hWnd, WPARAM16 wParam, LPARAM lParam)
 /***********************************************************************
  *           FileOpenDlgProc   (COMMDLG.6)
  */
-LRESULT FileOpenDlgProc(HWND16 hWnd, UINT wMsg, WPARAM16 wParam, LPARAM lParam)
+LRESULT FileOpenDlgProc(HWND16 hWnd, UINT16 wMsg, WPARAM16 wParam, LPARAM lParam)
 {  
  LPOPENFILENAME lpofn = (LPOPENFILENAME)PTR_SEG_TO_LIN(GetWindowLong32A(hWnd, DWL_USER));
  
  if (wMsg!=WM_INITDIALOG)
   if (FILEDLG_HookCallChk(lpofn))
   {
-   LRESULT  lRet=(BOOL)CallWindowProc16(lpofn->lpfnHook, hWnd, wMsg, wParam, lParam);
+   LRESULT  lRet=(BOOL16)CallWindowProc16(lpofn->lpfnHook, hWnd, wMsg, wParam, lParam);
    if (lRet)   
     return lRet;         /* else continue message processing */
   }             
@@ -675,14 +675,14 @@ LRESULT FileOpenDlgProc(HWND16 hWnd, UINT wMsg, WPARAM16 wParam, LPARAM lParam)
 /***********************************************************************
  *           FileSaveDlgProc   (COMMDLG.7)
  */
-LRESULT FileSaveDlgProc(HWND16 hWnd, UINT wMsg, WPARAM16 wParam, LPARAM lParam)
+LRESULT FileSaveDlgProc(HWND16 hWnd, UINT16 wMsg, WPARAM16 wParam, LPARAM lParam)
 {
  LPOPENFILENAME lpofn = (LPOPENFILENAME)PTR_SEG_TO_LIN(GetWindowLong32A(hWnd, DWL_USER));
  
  if (wMsg!=WM_INITDIALOG)
   if (FILEDLG_HookCallChk(lpofn))
   {
-   LRESULT  lRet=(BOOL)CallWindowProc16(lpofn->lpfnHook, hWnd, wMsg, wParam, lParam);
+   LRESULT  lRet=(BOOL16)CallWindowProc16(lpofn->lpfnHook, hWnd, wMsg, wParam, lParam);
    if (lRet)   
     return lRet;         /* else continue message processing */
   }             
@@ -860,7 +860,7 @@ static LRESULT FINDDLG_WMCommand(HWND16 hWnd, WPARAM16 wParam, LPARAM lParam)
 /***********************************************************************
  *           FindTextDlgProc   (COMMDLG.13)
  */
-LRESULT FindTextDlgProc(HWND16 hWnd, UINT wMsg, WPARAM16 wParam, LPARAM lParam)
+LRESULT FindTextDlgProc(HWND16 hWnd, UINT16 wMsg, WPARAM16 wParam, LPARAM lParam)
 {
     switch (wMsg) {
 	case WM_INITDIALOG:
@@ -980,7 +980,7 @@ static LRESULT REPLACEDLG_WMCommand(HWND16 hWnd, WPARAM16 wParam, LPARAM lParam)
 /***********************************************************************
  *           ReplaceTextDlgProc   (COMMDLG.14)
  */
-LRESULT ReplaceTextDlgProc(HWND16 hWnd, UINT wMsg, WPARAM16 wParam, LPARAM lParam)
+LRESULT ReplaceTextDlgProc(HWND16 hWnd, UINT16 wMsg, WPARAM16 wParam, LPARAM lParam)
 {
     switch (wMsg) {
 	case WM_INITDIALOG:
@@ -995,10 +995,10 @@ LRESULT ReplaceTextDlgProc(HWND16 hWnd, UINT wMsg, WPARAM16 wParam, LPARAM lPara
 /***********************************************************************
  *           PrintDlg   (COMMDLG.20)
  */
-BOOL PrintDlg( SEGPTR printdlg )
+BOOL16 PrintDlg( SEGPTR printdlg )
 {
     HANDLE16 hInst;
-    BOOL bRet = FALSE;
+    BOOL16 bRet = FALSE;
     LPCVOID template;
     HWND32 hwndDialog;
     LPPRINTDLG lpPrint = (LPPRINTDLG)PTR_SEG_TO_LIN(printdlg);
@@ -1029,7 +1029,7 @@ BOOL PrintDlg( SEGPTR printdlg )
 /***********************************************************************
  *           PrintDlgProc   (COMMDLG.21)
  */
-LRESULT PrintDlgProc(HWND16 hWnd, UINT wMsg, WPARAM16 wParam, LPARAM lParam)
+LRESULT PrintDlgProc(HWND16 hWnd, UINT16 wMsg, WPARAM16 wParam, LPARAM lParam)
 {
   switch (wMsg)
     {
@@ -1056,7 +1056,7 @@ LRESULT PrintDlgProc(HWND16 hWnd, UINT wMsg, WPARAM16 wParam, LPARAM lParam)
 /***********************************************************************
  *           PrintSetupDlgProc   (COMMDLG.22)
  */
-LRESULT PrintSetupDlgProc(HWND16 hWnd, UINT wMsg, WPARAM16 wParam, LPARAM lParam)
+LRESULT PrintSetupDlgProc(HWND16 hWnd, UINT16 wMsg, WPARAM16 wParam, LPARAM lParam)
 {
   switch (wMsg)
     {
@@ -1091,7 +1091,7 @@ DWORD CommDlgExtendedError(void)
 /***********************************************************************
  *           GetFileTitle   (COMMDLG.27)
  */
-short GetFileTitle(LPCSTR lpFile, LPSTR lpTitle, UINT cbBuf)
+short GetFileTitle(LPCSTR lpFile, LPSTR lpTitle, UINT16 cbBuf)
 {
     int i, len;
     dprintf_commdlg(stddeb,"GetFileTitle(%p %p %d); \n", lpFile, lpTitle, cbBuf);
@@ -1127,11 +1127,11 @@ short GetFileTitle(LPCSTR lpFile, LPSTR lpTitle, UINT cbBuf)
 /***********************************************************************
  *           ChooseColor   (COMMDLG.5)
  */
-BOOL ChooseColor(LPCHOOSECOLOR lpChCol)
+BOOL16 ChooseColor(LPCHOOSECOLOR lpChCol)
 {
     HINSTANCE16 hInst;
     HANDLE16 hDlgTmpl = 0;
-    BOOL bRet = FALSE, win32Format = FALSE;
+    BOOL16 bRet = FALSE, win32Format = FALSE;
     LPCVOID template;
     HWND32 hwndDialog;
 
@@ -1204,10 +1204,10 @@ struct CCPRIVATE
  HDC16 hdcMem;        /* color graph used for BitBlt() */
  HBITMAP16 hbmMem;    /* color graph bitmap */    
  RECT16 fullsize;     /* original dialog window size */
- UINT msetrgb;        /* # of SETRGBSTRING message (today not used)  */
+ UINT16 msetrgb;        /* # of SETRGBSTRING message (today not used)  */
  RECT16 old3angle;    /* last position of l-marker */
  RECT16 oldcross;     /* last position of color/satuation marker */
- BOOL updating;       /* to prevent recursive WM_COMMAND/EN_UPDATE procesing */
+ BOOL32 updating;     /* to prevent recursive WM_COMMAND/EN_UPDATE procesing */
  int h;
  int s;
  int l;               /* for temporary storing of hue,sat,lum */
@@ -1447,7 +1447,7 @@ static int CC_MouseCheckResultWindow(HWND16 hDlg,LPARAM lParam)
  GetWindowRect16(hwnd,&rect);
  if (PtInRect16(&rect,point))
  {
-  PostMessage(hDlg,WM_COMMAND,0x2c9,0);
+  PostMessage16(hDlg,WM_COMMAND,0x2c9,0);
   return 1;
  }
  return 0;
@@ -1632,7 +1632,7 @@ static void CC_PrepareColorGraph(HWND16 hDlg)
  GetClientRect16(hwnd,&client);
  hdc=GetDC32(hwnd);
  lpp->hdcMem = CreateCompatibleDC32(hdc);
- lpp->hbmMem = CreateCompatibleBitmap(hdc,client.right,client.bottom);
+ lpp->hbmMem = CreateCompatibleBitmap32(hdc,client.right,client.bottom);
  SelectObject32(lpp->hdcMem,lpp->hbmMem);
 
  xdif=client.right /XSTEPS;
@@ -1879,7 +1879,7 @@ static void CC_PaintUserColorArray(HWND16 hDlg,int rows,int cols,COLORREF* lpcr)
 /***********************************************************************
  *                             CC_HookCallChk                 [internal]
  */
-static BOOL CC_HookCallChk(LPCHOOSECOLOR lpcc)
+static BOOL32 CC_HookCallChk(LPCHOOSECOLOR lpcc)
 {
  if (lpcc)
   if(lpcc->Flags & CC_ENABLEHOOK)
@@ -1964,7 +1964,7 @@ static LONG CC_WMInitDialog(HWND16 hDlg, WPARAM16 wParam, LPARAM lParam)
 static LRESULT CC_WMCommand(HWND16 hDlg, WPARAM16 wParam, LPARAM lParam) 
 {
     int r,g,b,i,xx;
-    UINT cokmsg;
+    UINT16 cokmsg;
     HDC32 hdc;
     COLORREF *cr;
     struct CCPRIVATE * lpp=(struct CCPRIVATE *)GetWindowLong32A(hDlg, DWL_USER); 
@@ -2163,7 +2163,7 @@ static LRESULT CC_WMLButtonDown(HWND16 hDlg, WPARAM16 wParam, LPARAM lParam)
 /***********************************************************************
  *           ColorDlgProc   (COMMDLG.8)
  */
-LRESULT ColorDlgProc(HWND16 hDlg, UINT message,
+LRESULT ColorDlgProc(HWND16 hDlg, UINT16 message,
                      WPARAM16 wParam, LONG lParam)
 {
  int res;
@@ -2222,11 +2222,11 @@ LRESULT ColorDlgProc(HWND16 hDlg, UINT message,
 /***********************************************************************
  *                        ChooseFont   (COMMDLG.15)     
  */
-BOOL ChooseFont(LPCHOOSEFONT lpChFont)
+BOOL16 ChooseFont(LPCHOOSEFONT lpChFont)
 {
     HINSTANCE16 hInst;
     HANDLE16 hDlgTmpl = 0;
-    BOOL bRet = FALSE, win32Format = FALSE;
+    BOOL16 bRet = FALSE, win32Format = FALSE;
     LPCVOID template;
     HWND32 hwndDialog;
 
@@ -2289,7 +2289,7 @@ static const COLORREF textcolors[TEXT_COLORS]=
 /***********************************************************************
  *                          CFn_HookCallChk                 [internal]
  */
-static BOOL CFn_HookCallChk(LPCHOOSEFONT lpcf)
+static BOOL32 CFn_HookCallChk(LPCHOOSEFONT lpcf)
 {
  if (lpcf)
   if(lpcf->Flags & CF_ENABLEHOOK)
@@ -2479,7 +2479,7 @@ LRESULT CFn_WMInitDialog(HWND16 hDlg, WPARAM16 wParam, LPARAM lParam)
   if (!hBitmapTT)
     hBitmapTT = LoadBitmap16(0, MAKEINTRESOURCE(OBM_TRTYPE));
 			 
-  if (!(lpcf->Flags & CF_SHOWHELP) || !IsWindow(lpcf->hwndOwner))
+  if (!(lpcf->Flags & CF_SHOWHELP) || !IsWindow32(lpcf->hwndOwner))
     ShowWindow32(GetDlgItem32(hDlg,pshHelp),SW_HIDE);
   if (!(lpcf->Flags & CF_APPLY))
     ShowWindow32(GetDlgItem32(hDlg,psh3),SW_HIDE);
@@ -2692,7 +2692,7 @@ LRESULT CFn_WMCtlColor(HWND16 hDlg, WPARAM16 wParam, LPARAM lParam)
   if (lpcf->Flags & CF_EFFECTS)
    if (HIWORD(lParam)==CTLCOLOR_STATIC && GetDlgCtrlID32(LOWORD(lParam))==stc6)
    {
-     SetTextColor(wParam,lpcf->rgbColors);
+     SetTextColor32(wParam,lpcf->rgbColors);
      return GetStockObject32(WHITE_BRUSH);
    }
   return 0;
@@ -2838,7 +2838,7 @@ LRESULT CFn_WMCommand(HWND16 hDlg, WPARAM16 wParam, LPARAM lParam)
                     2. some CF_.. flags are not supported
                     3. some TType extensions
  */
-LRESULT FormatCharDlgProc(HWND16 hDlg, UINT message, WPARAM16 wParam, LPARAM lParam)
+LRESULT FormatCharDlgProc(HWND16 hDlg, UINT16 message, WPARAM16 wParam, LPARAM lParam)
 {
   LPCHOOSEFONT lpcf=(LPCHOOSEFONT)GetWindowLong32A(hDlg, DWL_USER);  
   if (message!=WM_INITDIALOG)
diff --git a/misc/driver.c b/misc/driver.c
index c535ffd5c32..4eb08806515 100644
--- a/misc/driver.c
+++ b/misc/driver.c
@@ -110,7 +110,7 @@ HDRVR16 OpenDriver(LPSTR lpDriverName, LPSTR lpSectionName, LPARAM lParam)
     lpnewdrv = (LPDRIVERITEM)GlobalLock16( hDrvr );
     if (lpnewdrv == NULL) return 0;
     lpnewdrv->dis.length = sizeof( DRIVERINFOSTRUCT16 );
-    lpnewdrv->dis.hModule = LoadModule( DrvName, (LPVOID)-1 );
+    lpnewdrv->dis.hModule = LoadModule16( DrvName, (LPVOID)-1 );
     if (!lpnewdrv->dis.hModule)
     {
 	GlobalUnlock16( hDrvr );
@@ -122,8 +122,8 @@ HDRVR16 OpenDriver(LPSTR lpDriverName, LPSTR lpSectionName, LPARAM lParam)
     lpnewdrv->count = 1;
     ordinal = MODULE_GetOrdinal( lpnewdrv->dis.hModule, "DRIVERPROC" );
     if (!ordinal ||
-        !(lpnewdrv->lpDrvProc = MODULE_GetEntryPoint( lpnewdrv->dis.hModule,
-                                                      ordinal )))
+        !(lpnewdrv->lpDrvProc = (DRIVERPROC16)MODULE_GetEntryPoint(
+                                             lpnewdrv->dis.hModule, ordinal )))
     {
 	FreeModule16( lpnewdrv->dis.hModule );
 	GlobalUnlock16( hDrvr );
diff --git a/misc/escape.c b/misc/escape.c
index a42827cbfb1..d742fc12b4b 100644
--- a/misc/escape.c
+++ b/misc/escape.c
@@ -4,7 +4,6 @@
  * Copyright 1994  Bob Amstadt
  */
 
-#define NO_TRANSITION_TYPES
 #include <stdio.h>
 #include "windows.h"
 #include "gdi.h"
diff --git a/misc/exec.c b/misc/exec.c
index 143dfe3d52b..e793f8b4f9d 100644
--- a/misc/exec.c
+++ b/misc/exec.c
@@ -2,7 +2,6 @@
  *     Windows Exec & Help
  */
 
-#define NO_TRANSITION_TYPES  /* This file is Win32-clean */
 #include <stdlib.h>
 #include <stdio.h>
 #include <string.h>
@@ -61,7 +60,7 @@ BOOL32 ExitWindowsEx( UINT32 flags, DWORD reserved )
     for (ppWnd = list, i = 0; *ppWnd; ppWnd++, i++)
     {
         /* Make sure that the window still exists */
-        if (!IsWindow( (*ppWnd)->hwndSelf )) continue;
+        if (!IsWindow32( (*ppWnd)->hwndSelf )) continue;
 	if (!SendMessage16( (*ppWnd)->hwndSelf, WM_QUERYENDSESSION, 0, 0 ))
             break;
     }
@@ -71,7 +70,7 @@ BOOL32 ExitWindowsEx( UINT32 flags, DWORD reserved )
 
     for (ppWnd = list; i > 0; i--, ppWnd++)
     {
-        if (!IsWindow( (*ppWnd)->hwndSelf )) continue;
+        if (!IsWindow32( (*ppWnd)->hwndSelf )) continue;
 	SendMessage16( (*ppWnd)->hwndSelf, WM_ENDSESSION, result, 0 );
     }
     HeapFree( SystemHeap, 0, list );
diff --git a/misc/lstr.c b/misc/lstr.c
index 735a59e1b7a..29c60ee8f26 100644
--- a/misc/lstr.c
+++ b/misc/lstr.c
@@ -127,9 +127,9 @@ SEGPTR AnsiPrev16( SEGPTR start, SEGPTR current )
 
 
 /***********************************************************************
- *           OutputDebugString   (KERNEL.115)
+ *           OutputDebugString16   (KERNEL.115)
  */
-void OutputDebugString( LPCSTR str )
+void OutputDebugString16( LPCSTR str )
 {
     char *module;
     char *p, *buffer = HeapAlloc( GetProcessHeap(), 0, strlen(str)+1 );
@@ -144,6 +144,28 @@ void OutputDebugString( LPCSTR str )
 }
 
 
+/***********************************************************************
+ *           OutputDebugString32A   (KERNEL32
+ */
+void OutputDebugString32A( LPCSTR str )
+{
+    OutputDebugString16( str );
+}
+
+
+
+/***********************************************************************
+ *           OutputDebugString32W   (KERNEL32
+ */
+void OutputDebugString32W( LPCWSTR str )
+{
+    LPSTR p = HEAP_strdupWtoA( GetProcessHeap(), 0, str );
+    OutputDebugString32A( p );
+    HeapFree( GetProcessHeap(), 0, p );
+}
+
+
+
 /***********************************************************************
  *           CharNext32A   (USER32.28)
  */
@@ -544,6 +566,10 @@ FormatMessage32A(
 							fmtstr=HeapAlloc(GetProcessHeap(),0,strlen(f)+2);
 							sprintf(fmtstr,"%%%s",f);
 							f=x+1;
+						} else {
+							fmtstr=HeapAlloc(GetProcessHeap(),0,strlen(f));
+							sprintf(fmtstr,"%%%s",f);
+							f+=strlen(f); /*at \0*/
 						}
 					} else
 						fmtstr=HEAP_strdupA(GetProcessHeap(),0,"%s");
@@ -734,6 +760,10 @@ FormatMessage32W(
                                                     fmtstr=HeapAlloc( GetProcessHeap(), 0, strlen(f)+2);
 							sprintf(fmtstr,"%%%s",f);
 							f=x+1;
+						} else {
+							fmtstr=HeapAlloc(GetProcessHeap(),0,strlen(f));
+							sprintf(fmtstr,"%%%s",f);
+							f+=strlen(f); /*at \0*/
 						}
 					} else
 						fmtstr=HEAP_strdupA( GetProcessHeap(),0,"%s");
diff --git a/misc/lzexpand.c b/misc/lzexpand.c
index a149b2d57e8..48d67e469ed 100644
--- a/misc/lzexpand.c
+++ b/misc/lzexpand.c
@@ -7,7 +7,6 @@
  * FIXME: return values might be wrong
  */
 
-#define NO_TRANSITION_TYPES  /* This file is Win32-clean */
 #include <stdlib.h>
 #include <stdio.h>
 #include <string.h>
diff --git a/misc/main.c b/misc/main.c
index 1687226cb1b..96a915a59d1 100644
--- a/misc/main.c
+++ b/misc/main.c
@@ -70,6 +70,7 @@ const WINE_LANGUAGE_DEF Languages[] =
     {"It",0x0410},	/* LANG_It */
     {"Ko",0x0412},	/* LANG_Ko */
     {"Hu",0x0436},	/* LANG_Hu */
+    {"Pl",0x0415},      /* LANG_Pl */
     {NULL,0}
 };
 
@@ -162,7 +163,7 @@ static XrmOptionDescRec optionsTable[] =
   "    -fixedmap       Use a \"standard\" color map\n" \
   "    -iconic         Start as an icon\n" \
   "    -ipc            Enable IPC facilities\n" \
-  "    -language xx    Set the language (one of En,Es,De,No,Fr,Fi,Da,Cz,Eo,It,Ko,Hu)\n" \
+  "    -language xx    Set the language (one of En,Es,De,No,Fr,Fi,Da,Cz,Eo,It,Ko,\n                    Hu,Pl)\n" \
   "    -managed        Allow the window manager to manage created windows\n" \
   "    -mode mode      Start Wine in a particular mode (standard or enhanced)\n" \
   "    -name name      Set the application name\n" \
@@ -240,7 +241,7 @@ static int MAIN_GetResource( XrmDatabase db, char *name, XrmValue *value )
  */
 #ifdef DEBUG_RUNTIME
 
-BOOL ParseDebugOptions(char *options)
+BOOL32 ParseDebugOptions(char *options)
 {
   int l;
   if (strlen(options)<3)
@@ -811,14 +812,14 @@ DWORD GetWinFlags(void)
     break;
   }
   if( getVersionEx.dwPlatformId == VER_PLATFORM_WIN32_NT )
-      result |= 0x4000; /* undocumented WF_WINNT */
+      result |= WF_WIN32WOW; /* undocumented WF_WINNT */
   return result;
 }
 
 /***********************************************************************
- *	SetEnvironment (GDI.132)
+ *          SetEnvironment   (GDI.132)
  */
-int SetEnvironment(LPCSTR lpPortName, LPCSTR lpEnviron, WORD nCount)
+INT16 SetEnvironment( LPCSTR lpPortName, LPCSTR lpEnviron, UINT16 nCount )
 {
     LPENVENTRY	lpNewEnv;
     LPENVENTRY	lpEnv = lpEnvList;
@@ -885,9 +886,9 @@ int SetEnvironment(LPCSTR lpPortName, LPCSTR lpEnviron, WORD nCount)
 
 
 /***********************************************************************
- *	GetEnvironment (GDI.134)
+ *           GetEnvironment   (GDI.134)
  */
-int GetEnvironment(LPSTR lpPortName, LPSTR lpEnviron, WORD nMaxSiz)
+INT16 GetEnvironment( LPCSTR lpPortName, LPSTR lpEnviron, UINT16 nMaxSiz )
 {
     WORD       nCount;
     LPENVENTRY lpEnv = lpEnvList;
@@ -944,9 +945,9 @@ BOOL16 SystemParametersInfo16( UINT16 uAction, UINT16 uParam,
 		case SPI_GETBEEP:
 			XGetKeyboardControl(display, &keyboard_state);
 			if (keyboard_state.bell_percent == 0)
-				*(BOOL *) lpvParam = FALSE;
+				*(BOOL16 *) lpvParam = FALSE;
 			else
-				*(BOOL *) lpvParam = TRUE;
+				*(BOOL16 *) lpvParam = TRUE;
 			break;
 		
 		case SPI_GETBORDER:
@@ -955,25 +956,25 @@ BOOL16 SystemParametersInfo16( UINT16 uAction, UINT16 uParam,
 
 		case SPI_GETFASTTASKSWITCH:
 		    if ( GetProfileInt32A( "windows", "CoolSwitch", 1 ) == 1 )
-			  *(BOOL *) lpvParam = TRUE;
+			  *(BOOL16 *) lpvParam = TRUE;
 			else
-			  *(BOOL *) lpvParam = FALSE;
+			  *(BOOL16 *) lpvParam = FALSE;
 			break;
 
 		case SPI_GETGRIDGRANULARITY:
-                    *(INT *) lpvParam = GetProfileInt32A( "desktop", 
+                    *(INT16 *) lpvParam = GetProfileInt32A( "desktop", 
                                                           "GridGranularity",
                                                           1 );
                     break;
 
                 case SPI_GETICONTITLEWRAP:
-                    *(BOOL *) lpvParam = GetProfileInt32A( "desktop",
+                    *(BOOL16 *) lpvParam = GetProfileInt32A( "desktop",
                                                            "IconTitleWrap",
                                                            TRUE );
                     break;
 
                 case SPI_GETKEYBOARDDELAY:
-                    *(INT *) lpvParam = GetProfileInt32A( "keyboard",
+                    *(INT16 *) lpvParam = GetProfileInt32A( "keyboard",
                                                           "KeyboardDelay", 1 );
                     break;
 
@@ -989,15 +990,15 @@ BOOL16 SystemParametersInfo16( UINT16 uAction, UINT16 uParam,
 
 		case SPI_GETSCREENSAVEACTIVE:
                     if ( GetProfileInt32A( "windows", "ScreenSaveActive", 1 ) == 1 )
-                        *(BOOL *) lpvParam = TRUE;
+                        *(BOOL16 *) lpvParam = TRUE;
                     else
-                        *(BOOL *) lpvParam = FALSE;
+                        *(BOOL16 *) lpvParam = FALSE;
                     break;
 
 		case SPI_GETSCREENSAVETIMEOUT:
 			/* FIXME GetProfileInt( "windows", "ScreenSaveTimeout", 300 ); */
 			XGetScreenSaver(display, &timeout, &temp,&temp,&temp);
-			*(INT *) lpvParam = timeout * 1000;
+			*(INT16 *) lpvParam = timeout * 1000;
 			break;
 
 		case SPI_ICONHORIZONTALSPACING:
@@ -1112,7 +1113,7 @@ BOOL32 SystemParametersInfo32W( UINT32 uAction, UINT32 uParam,
         return SetDeskWallPaper32(NULL);
 
     case SPI_SETDESKPATTERN:
-        if ((INT) uParam == -1)
+        if ((INT32) uParam == -1)
         {
             GetProfileString32A("Desktop", "Pattern", 
                                 "170 85 170 85 170 85 170 85", 
diff --git a/misc/network.c b/misc/network.c
index 156db539c47..5c1eacec173 100644
--- a/misc/network.c
+++ b/misc/network.c
@@ -154,7 +154,7 @@ int WNetUnlockQueueData(LPSTR szQueue)
  *				WNetGetConnection	[USER.512]
  */
 int WNetGetConnection(LPSTR lpLocalName, 
-	LPSTR lpRemoteName, UINT *cbRemoteName)
+	LPSTR lpRemoteName, UINT16 *cbRemoteName)
 {
     const char *path;
 
@@ -210,7 +210,7 @@ int WNetBrowseDialog(HWND16 hParent,WORD nType,LPSTR szPath)
 /**************************************************************************
  *				WNetGetUser			[USER.516]
  */
-UINT WNetGetUser(LPSTR lpLocalName, LPSTR lpUserName, DWORD *lpSize)
+UINT16 WNetGetUser(LPSTR lpLocalName, LPSTR lpUserName, DWORD *lpSize)
 {
 	printf("EMPTY STUB !!! WNetGetUser(%p, %p, %p);\n", 
 							lpLocalName, lpUserName, lpSize);
@@ -220,7 +220,7 @@ UINT WNetGetUser(LPSTR lpLocalName, LPSTR lpUserName, DWORD *lpSize)
 /**************************************************************************
  *				WNetAddConnection	[USER.517]
  */
-UINT WNetAddConnection(LPSTR lpNetPath, LPSTR lpPassWord, LPSTR lpLocalName)
+UINT16 WNetAddConnection(LPSTR lpNetPath, LPSTR lpPassWord, LPSTR lpLocalName)
 {
 	printf("EMPTY STUB !!! WNetAddConnection('%s', %p, '%s');\n",
 							lpNetPath, lpPassWord, lpLocalName);
@@ -231,11 +231,11 @@ UINT WNetAddConnection(LPSTR lpNetPath, LPSTR lpPassWord, LPSTR lpLocalName)
 /**************************************************************************
  *				WNetCancelConnection	[USER.518]
  */
-UINT WNetCancelConnection(LPSTR lpName, BOOL bForce)
+UINT16 WNetCancelConnection(LPSTR lpName, BOOL16 bForce)
 {
-	printf("EMPTY STUB !!! WNetCancelConnection('%s', %04X);\n",
-											lpName, bForce);
-	return	WN_NET_ERROR;
+    printf("EMPTY STUB !!! WNetCancelConnection('%s', %04X);\n",
+           lpName, bForce);
+    return WN_NET_ERROR;
 }
 
 /**************************************************************************
@@ -280,7 +280,7 @@ int WNetWriteJob(HANDLE16 hJob,void *lpData,LPWORD lpcbData)
 /**************************************************************************
  *              WnetConnectDialog       [USER.525]
  */
-UINT WNetConnectDialog(HWND16 hWndParent, WORD iType)
+UINT16 WNetConnectDialog(HWND16 hWndParent, WORD iType)
 {
 	printf("EMPTY STUB !!! WNetConnectDialog(%04x, %4X)\n", hWndParent, iType);
 	return WN_SUCCESS;
@@ -299,7 +299,7 @@ int WNetDisconnectDialog(HWND16 hwndOwner, WORD iType)
 /**************************************************************************
  *              WnetConnectionDialog     [USER.527]
  */
-UINT WNetConnectionDialog(HWND16 hWndParent, WORD iType)
+UINT16 WNetConnectionDialog(HWND16 hWndParent, WORD iType)
 {
 	printf("EMPTY STUB !!! WNetConnectionDialog(%04x, %4X)\n", 
 		hWndParent, iType);
@@ -361,7 +361,7 @@ int WNetGetPropertyText(HWND16 hwndParent,WORD iButton,WORD nPropSel,
 /**************************************************************************
  *				WNetAddConnection2	[USER.???]
  */
-UINT WNetAddConnection2(LPSTR lpNetPath, LPSTR lpPassWord, 
+UINT16 WNetAddConnection2(LPSTR lpNetPath, LPSTR lpPassWord, 
 		LPSTR lpLocalName, LPSTR lpUserName)
 {
 	printf("EMPTY STUB !!! WNetAddConnection2('%s', %p, '%s', '%s');\n",
@@ -372,7 +372,7 @@ UINT WNetAddConnection2(LPSTR lpNetPath, LPSTR lpPassWord,
 /**************************************************************************
  *				WNetCloseEnum		[USER.???]
  */
-UINT WNetCloseEnum(HANDLE16 hEnum)
+UINT16 WNetCloseEnum(HANDLE16 hEnum)
 {
 	printf("EMPTY STUB !!! WNetCloseEnum(%04x);\n", hEnum);
 	return WN_NET_ERROR;
@@ -381,7 +381,7 @@ UINT WNetCloseEnum(HANDLE16 hEnum)
 /**************************************************************************
  *				WNetEnumResource	[USER.???]
  */
-UINT WNetEnumResource(HANDLE16 hEnum, DWORD cRequ, 
+UINT16 WNetEnumResource(HANDLE16 hEnum, DWORD cRequ, 
 				DWORD *lpCount, LPVOID lpBuf)
 {
 	printf("EMPTY STUB !!! WNetEnumResource(%04x, %08lX, %p, %p);\n", 
@@ -392,8 +392,8 @@ UINT WNetEnumResource(HANDLE16 hEnum, DWORD cRequ,
 /**************************************************************************
  *				WNetOpenEnum		[USER.???]
  */
-UINT WNetOpenEnum(DWORD dwScope, DWORD dwType, 
-	LPNETRESOURCE lpNet, HANDLE16 *lphEnum)
+UINT16 WNetOpenEnum(DWORD dwScope, DWORD dwType, 
+                    LPNETRESOURCE lpNet, HANDLE16 *lphEnum)
 {
 	printf("EMPTY STUB !!! WNetOpenEnum(%08lX, %08lX, %p, %p);\n",
                dwScope, dwType, lpNet, lphEnum);
diff --git a/misc/ntdll.c b/misc/ntdll.c
index f9d89856d58..a83b049963f 100644
--- a/misc/ntdll.c
+++ b/misc/ntdll.c
@@ -368,6 +368,15 @@ RtlInitUnicodeString(LPUNICODE_STRING target,LPCWSTR source) {
 	target->MaximumLength = target->Length+2;
 }
 
+/**************************************************************************
+ *                 RtlInitUnicodeString			[NTDLL]
+ */
+VOID
+RtlFreeUnicodeString(LPUNICODE_STRING str) {
+	if (str->Buffer)
+		HeapFree(GetProcessHeap(),0,str);
+}
+
 /**************************************************************************
  *                 RtlUnicodeToOemN			[NTDLL]
  */
diff --git a/misc/ole2nls.c b/misc/ole2nls.c
index 6cb3b1d0401..ebbd70deb64 100644
--- a/misc/ole2nls.c
+++ b/misc/ole2nls.c
@@ -5,6 +5,7 @@
  */
 
 #include <string.h>
+#include <ctype.h>
 #include <malloc.h>
 #include "windows.h"
 #include "heap.h"
@@ -150,7 +151,7 @@ DWORD GetUserDefaultLCID()
     case LANG_Ko: return 0x12;         /* Korean */
  /* case LANG_Du: return 0x13; */      /* Dutch */
     case LANG_No: return 0x14;         /* Norwegian */
- /* case LANG_Pl: return 0x15; */      /* Polish */
+    case LANG_Pl: return 0x15;         /* Polish */
  /* case LANG_Po: return 0x16; */      /* Portuguese */
  /* case LANG_Ro: return 0x18; */      /* Romanian */
  /* case LANG_Ru: return 0x19; */      /* Russian */
@@ -1385,6 +1386,129 @@ LOCVAL(LOCALE_INEGSEPBYSPACE)
 	}
     break;  /* LANG(En) */
 
+    case LANG_Pl:
+    	switch (LCType) {
+LOCVAL(LOCALE_ILANGUAGE,"9")
+LOCVAL(LOCALE_SLANGUAGE,"Polski")
+LOCVAL(LOCALE_SENGLANGUAGE,"Polish")
+LOCVAL(LOCALE_SABBREVLANGNAME, "pol")
+LOCVAL(LOCALE_SNATIVELANGNAME,"Polski")
+LOCVAL(LOCALE_ICOUNTRY,"49")
+LOCVAL(LOCALE_SCOUNTRY,"Polska")
+LOCVAL(LOCALE_SENGCOUNTRY,"Poland")
+LOCVAL(LOCALE_SABBREVCTRYNAME,"Pl")
+LOCVAL(LOCALE_SNATIVECTRYNAME,"Polska")
+LOCVAL(LOCALE_IDEFAULTLANGUAGE,"9")
+LOCVAL(LOCALE_IDEFAULTCOUNTRY,"49")
+LOCVAL(LOCALE_IDEFAULTCODEPAGE,"1252")
+LOCVAL(LOCALE_IDEFAULTANSICODEPAGE,"1252")
+LOCVAL(LOCALE_SLIST,";")
+LOCVAL(LOCALE_IMEASURE,"0")
+LOCVAL(LOCALE_SDECIMAL,",")
+LOCVAL(LOCALE_STHOUSAND," ")
+/*
+LOCVAL(LOCALE_SGROUPING)
+*/
+LOCVAL(LOCALE_IDIGITS,"2")
+LOCVAL(LOCALE_ILZERO,"1")
+/*
+LOCVAL(LOCALE_INEGNUMBER)
+Is this "0123456789" ??
+LOCVAL(LOCALE_SNATIVEDIGITS)
+*/
+LOCVAL(LOCALE_SCURRENCY,"z\xB3")
+/*
+LOCVAL(LOCALE_SINTLSYMBOL)
+LOCVAL(LOCALE_SMONDECIMALSEP)
+LOCVAL(LOCALE_SMONTHOUSANDSEP)
+LOCVAL(LOCALE_SMONGROUPING)
+*/
+LOCVAL(LOCALE_ICURRDIGITS,"2")
+/*
+LOCVAL(LOCALE_IINTLCURRDIGITS)
+*/
+LOCVAL(LOCALE_ICURRENCY,"3")
+LOCVAL(LOCALE_INEGCURR,"8")
+LOCVAL(LOCALE_SDATE,".")
+LOCVAL(LOCALE_STIME,":")
+LOCVAL(LOCALE_SSHORTDATE,"dd.MM.yyyy")
+LOCVAL(LOCALE_SLONGDATE,"ddd, d. MMMM yyyy")
+/*
+LOCVAL(LOCALE_STIMEFORMAT)
+*/
+LOCVAL(LOCALE_IDATE,"1")
+/*
+LOCVAL(LOCALE_ILDATE)
+*/
+LOCVAL(LOCALE_ITIME,"1")
+/*
+LOCVAL(LOCALE_ITIMEMARKPOSN)
+LOCVAL(LOCALE_ICENTURY)
+*/
+LOCVAL(LOCALE_ITLZERO,"1")
+/*
+LOCVAL(LOCALE_IDAYLZERO)
+LOCVAL(LOCALE_IMONLZERO)
+LOCVAL(LOCALE_S1159)
+LOCVAL(LOCALE_S2359)
+LOCVAL(LOCALE_ICALENDARTYPE)
+LOCVAL(LOCALE_IOPTIONALCALENDAR)
+LOCVAL(LOCALE_IFIRSTDAYOFWEEK)
+LOCVAL(LOCALE_IFIRSTWEEKOFYEAR)
+*/
+LOCVAL(LOCALE_SDAYNAME1,"Poniedzia\263ek")
+LOCVAL(LOCALE_SDAYNAME2,"Wtorek")
+LOCVAL(LOCALE_SDAYNAME3,"Sroda")
+LOCVAL(LOCALE_SDAYNAME4,"Czwartek")
+LOCVAL(LOCALE_SDAYNAME5,"Pi\xB9tek")
+LOCVAL(LOCALE_SDAYNAME6,"Sobota")
+LOCVAL(LOCALE_SDAYNAME7,"Niedziela")
+LOCVAL(LOCALE_SABBREVDAYNAME1,"Po")
+LOCVAL(LOCALE_SABBREVDAYNAME2,"Wt")
+LOCVAL(LOCALE_SABBREVDAYNAME3,"Sr")
+LOCVAL(LOCALE_SABBREVDAYNAME4,"Cz")
+LOCVAL(LOCALE_SABBREVDAYNAME5,"Pt")
+LOCVAL(LOCALE_SABBREVDAYNAME6,"So")
+LOCVAL(LOCALE_SABBREVDAYNAME7,"Ni")
+LOCVAL(LOCALE_SMONTHNAME1,"Stycze\xF1")
+LOCVAL(LOCALE_SMONTHNAME2,"Luty")
+LOCVAL(LOCALE_SMONTHNAME3,"Marzec")
+LOCVAL(LOCALE_SMONTHNAME4,"Kwiecie\xF1")
+LOCVAL(LOCALE_SMONTHNAME5,"Maj")
+LOCVAL(LOCALE_SMONTHNAME6,"Czerwiec")
+LOCVAL(LOCALE_SMONTHNAME7,"Lipiec")
+LOCVAL(LOCALE_SMONTHNAME8,"Sierpie\xF1")
+LOCVAL(LOCALE_SMONTHNAME9,"Wrzesie\xF1")
+LOCVAL(LOCALE_SMONTHNAME10,"Pa\237dziernik")
+LOCVAL(LOCALE_SMONTHNAME11,"Listapad")
+LOCVAL(LOCALE_SMONTHNAME12,"Grudzie\xF1")
+LOCVAL(LOCALE_SMONTHNAME13,"")
+LOCVAL(LOCALE_SABBREVMONTHNAME1,"Sty")
+LOCVAL(LOCALE_SABBREVMONTHNAME2,"Lut")
+LOCVAL(LOCALE_SABBREVMONTHNAME3,"Mar")
+LOCVAL(LOCALE_SABBREVMONTHNAME4,"Kwi")
+LOCVAL(LOCALE_SABBREVMONTHNAME5,"Maj")
+LOCVAL(LOCALE_SABBREVMONTHNAME6,"Cze")
+LOCVAL(LOCALE_SABBREVMONTHNAME7,"Lip")
+LOCVAL(LOCALE_SABBREVMONTHNAME8,"Sie")
+LOCVAL(LOCALE_SABBREVMONTHNAME9,"Wrz")
+LOCVAL(LOCALE_SABBREVMONTHNAME10,"Pa\x9F")
+LOCVAL(LOCALE_SABBREVMONTHNAME11,"Lis")
+LOCVAL(LOCALE_SABBREVMONTHNAME12,"Gru")
+LOCVAL(LOCALE_SABBREVMONTHNAME13,"")
+/*
+LOCVAL(LOCALE_SPOSITIVESIGN)
+LOCVAL(LOCALE_SNEGATIVESIGN)
+LOCVAL(LOCALE_IPOSSIGNPOSN)
+LOCVAL(LOCALE_INEGSIGNPOSN)
+LOCVAL(LOCALE_IPOSSYMPRECEDES)
+LOCVAL(LOCALE_IPOSSEPBYSPACE)
+LOCVAL(LOCALE_INEGSYMPRECEDES)
+LOCVAL(LOCALE_INEGSEPBYSPACE)
+*/
+	default: found=0;break;
+	}
+    break;  /* LANG(Pl) */
 
 /*Insert other languages here*/
 
@@ -1489,9 +1613,10 @@ UINT32 CompareString32W(DWORD lcid, DWORD fdwStyle,
 /***********************************************************************
  *           SetLocalInfoA       (KERNEL32.499)
  */
-BOOL SetLocaleInfoA(DWORD lcid, DWORD lctype, LPCSTR data) {
-	fprintf(stdnimp,"SetLocaleInfoA(%ld,%ld,%s)\n",lcid,lctype,data);
-	return TRUE;
+BOOL16 SetLocaleInfoA(DWORD lcid, DWORD lctype, LPCSTR data)
+{
+    fprintf(stdnimp,"SetLocaleInfoA(%ld,%ld,%s)\n",lcid,lctype,data);
+    return TRUE;
 }
 
 /***********************************************************************
@@ -1548,3 +1673,93 @@ EnumSystemLocales32A(LOCALE_ENUMPROC32A lpfnLocaleEnum,DWORD flags) {
 	}
 	return TRUE;
 }
+
+/***********************************************************************
+ *              GetStringTypeA                (OLE2NLS.7)
+ */
+BOOL16
+GetStringType16(LCID locale,DWORD dwInfoType,LPCSTR src,INT16 cchSrc,LPWORD chartype) {
+	return GetStringTypeEx32A(locale,dwInfoType,src,cchSrc,chartype);
+}
+/***********************************************************************
+ *              GetStringTypeA                (KERNEL32.277)
+ */
+BOOL32
+GetStringType32A(LCID locale,DWORD dwInfoType,LPCSTR src,INT32 cchSrc,LPWORD chartype) {
+	return GetStringTypeEx32A(locale,dwInfoType,src,cchSrc,chartype);
+}
+/***********************************************************************
+ *              GetStringTypeExA                (KERNEL32.276)
+ */
+BOOL32
+GetStringTypeEx32A(LCID locale,DWORD dwInfoType,LPCSTR src,INT32 cchSrc,LPWORD chartype) {
+	int	i;
+
+	switch (dwInfoType) {
+	case CT_CTYPE2:
+		fprintf(stderr,"GetStringType32A:CT_CTYPE2 not supported.\n");
+		return FALSE;
+	case CT_CTYPE3:
+		fprintf(stderr,"GetStringType32A:CT_CTYPE3 not supported.\n");
+		return FALSE;
+	default:break;
+	}
+	if (cchSrc==-1)
+		cchSrc=lstrlen32A(src);
+	for (i=0;i<cchSrc;i++) {
+		chartype[i] = 0;
+		if (isdigit(src[i])) chartype[i]|=C1_DIGIT;
+		if (isalpha(src[i])) chartype[i]|=C1_ALPHA;
+		if (islower(src[i])) chartype[i]|=C1_LOWER;
+		if (isupper(src[i])) chartype[i]|=C1_UPPER;
+		if (isspace(src[i])) chartype[i]|=C1_SPACE;
+		if (ispunct(src[i])) chartype[i]|=C1_PUNCT;
+		if (iscntrl(src[i])) chartype[i]|=C1_CNTRL;
+		if (isblank(src[i])) chartype[i]|=C1_BLANK;
+		/* C1_XDIGIT */
+	}
+	return TRUE;
+}
+
+/***********************************************************************
+ *              GetStringTypeW                (KERNEL32.279)
+ * Yes, this is missing LCID locale. MS fault.
+ */
+BOOL32
+GetStringType32W(DWORD dwInfoType,LPCWSTR src,INT32 cchSrc,LPWORD chartype) {
+	return GetStringTypeEx32W(0/*defaultlocale*/,dwInfoType,src,cchSrc,chartype);
+}
+
+/***********************************************************************
+ *              GetStringTypeW                (KERNEL32.278)
+ * FIXME: unicode chars are assumed chars
+ */
+BOOL32
+GetStringTypeEx32W(LCID locale,DWORD dwInfoType,LPCWSTR src,INT32 cchSrc,LPWORD chartype) {
+	int	i;
+
+	switch (dwInfoType) {
+	case CT_CTYPE2:
+		fprintf(stderr,"GetStringType32W:CT_CTYPE2 not supported.\n");
+		return FALSE;
+	case CT_CTYPE3:
+		fprintf(stderr,"GetStringType32W:CT_CTYPE3 not supported.\n");
+		return FALSE;
+	default:break;
+	}
+	if (cchSrc==-1)
+		cchSrc=lstrlen32W(src);
+	for (i=0;i<cchSrc;i++) {
+		chartype[i] = 0;
+		if (isdigit(src[i])) chartype[i]|=C1_DIGIT;
+		if (isalpha(src[i])) chartype[i]|=C1_ALPHA;
+		if (islower(src[i])) chartype[i]|=C1_LOWER;
+		if (isupper(src[i])) chartype[i]|=C1_UPPER;
+		if (isspace(src[i])) chartype[i]|=C1_SPACE;
+		if (ispunct(src[i])) chartype[i]|=C1_PUNCT;
+		if (iscntrl(src[i])) chartype[i]|=C1_CNTRL;
+		if (isblank(src[i])) chartype[i]|=C1_BLANK;
+		/* C1_XDIGIT */
+	}
+	return TRUE;
+}
diff --git a/misc/olecli.c b/misc/olecli.c
index 441f7b46866..2c7ab880293 100644
--- a/misc/olecli.c
+++ b/misc/olecli.c
@@ -47,7 +47,7 @@ OLESTATUS OleRevokeClientDoc(LHCLIENTDOC hServerDoc)
 /***********************************************************************
  *           OleIsDcMeta
  */
-BOOL OleIsDcMeta(HDC16 hdc)
+BOOL16 OleIsDcMeta(HDC16 hdc)
 {
 	dprintf_ole(stddeb,"OleIsDCMeta(%04x)\n",hdc);
 	return GDI_GetObjPtr( hdc, METAFILE_DC_MAGIC ) != 0;
diff --git a/misc/olesvr.c b/misc/olesvr.c
index 490ab48a727..b9e41ff29a7 100644
--- a/misc/olesvr.c
+++ b/misc/olesvr.c
@@ -39,7 +39,7 @@ OLESTATUS OleBlockServer(LHSERVER hServer)
 /***********************************************************************
  *           OleUnblockServer
  */
-OLESTATUS OleUnblockServer(LHSERVER hServer, BOOL *block)
+OLESTATUS OleUnblockServer(LHSERVER hServer, BOOL16 *block)
 {
     fprintf(stdnimp,"OleUnblockServer:%ld\n",hServer);
     /* no more blocked messages :) */
diff --git a/misc/shell.c b/misc/shell.c
index 7a1bce9917b..f97f53a211c 100644
--- a/misc/shell.c
+++ b/misc/shell.c
@@ -47,13 +47,13 @@ typedef struct
 
 #pragma pack(4)
 
-extern HGLOBAL16 CURSORICON_LoadHandler( HGLOBAL16, HINSTANCE16, BOOL);
+extern HGLOBAL16 CURSORICON_LoadHandler( HGLOBAL16, HINSTANCE16, BOOL32);
 extern WORD 	GetIconID( HGLOBAL16 hResource, DWORD resType );
 
 /*************************************************************************
  *				DragAcceptFiles		[SHELL.9]
  */
-void DragAcceptFiles(HWND16 hWnd, BOOL b)
+void DragAcceptFiles(HWND16 hWnd, BOOL16 b)
 {
     WND* wnd = WIN_FindWndPtr(hWnd);
 
@@ -66,7 +66,7 @@ void DragAcceptFiles(HWND16 hWnd, BOOL b)
 /*************************************************************************
  *				DragQueryFile		[SHELL.11]
  */
-UINT DragQueryFile(HDROP16 hDrop, WORD wFile, LPSTR lpszFile, WORD wLength)
+UINT16 DragQueryFile(HDROP16 hDrop, WORD wFile, LPSTR lpszFile, WORD wLength)
 {
     /* hDrop is a global memory block allocated with GMEM_SHARE 
      * with DROPFILESTRUCT as a header and filenames following
@@ -116,7 +116,7 @@ void DragFinish(HDROP16 h)
 /*************************************************************************
  *				DragQueryPoint		[SHELL.13]
  */
-BOOL DragQueryPoint(HDROP16 hDrop, POINT16 *p)
+BOOL16 DragQueryPoint(HDROP16 hDrop, POINT16 *p)
 {
     LPDROPFILESTRUCT lpDropFileStruct;  
     BOOL16           bRet;
@@ -281,11 +281,11 @@ static HINSTANCE16 SHELL_FindExecutable( LPCSTR lpFile,
 }
 
 /*************************************************************************
- *				ShellExecute		[SHELL.20]
+ *				ShellExecute16		[SHELL.20]
  */
-HINSTANCE16 ShellExecute(HWND16 hWnd, LPCSTR lpOperation, LPCSTR lpFile,
-                         LPSTR lpParameters, LPCSTR lpDirectory,
-                         INT iShowCmd)
+HINSTANCE16 ShellExecute16( HWND16 hWnd, LPCSTR lpOperation, LPCSTR lpFile,
+                            LPCSTR lpParameters, LPCSTR lpDirectory,
+                            INT16 iShowCmd )
 {
     HINSTANCE16 retval=31;
     char cmd[256];
@@ -316,10 +316,24 @@ HINSTANCE16 ShellExecute(HWND16 hWnd, LPCSTR lpOperation, LPCSTR lpFile,
     return WinExec32(cmd,iShowCmd);
 }
 
+
+/*************************************************************************
+ *             ShellExecute32A   (SHELL32.84)
+ */
+HINSTANCE32 ShellExecute32A( HWND32 hWnd, LPCSTR lpOperation, LPCSTR lpFile,
+                             LPCSTR lpParameters, LPCSTR lpDirectory,
+                             INT32 iShowCmd )
+{
+    return ShellExecute16( hWnd, lpOperation, lpFile, lpParameters,
+                           lpDirectory, iShowCmd );
+}
+
+
 /*************************************************************************
- *				FindExecutable		[SHELL.21]
+ *             FindExecutable16   (SHELL.21)
  */
-HINSTANCE16 FindExecutable(LPCSTR lpFile, LPCSTR lpDirectory, LPSTR lpResult)
+HINSTANCE16 FindExecutable16( LPCSTR lpFile, LPCSTR lpDirectory,
+                              LPSTR lpResult )
 {
     HINSTANCE16 retval=31;    /* default - 'No association was found' */
 
@@ -578,7 +592,7 @@ static HGLOBAL16 ICO_GetIconDirectory(HINSTANCE16 hInst, HFILE32 hFile, LPicoICO
  *
  * This abortion is called directly by Progman
  */
-HGLOBAL16 InternalExtractIcon(HINSTANCE16 hInstance, LPCSTR lpszExeFileName, UINT nIconIndex, WORD n )
+HGLOBAL16 InternalExtractIcon(HINSTANCE16 hInstance, LPCSTR lpszExeFileName, UINT16 nIconIndex, WORD n )
 {
   HGLOBAL16 	hRet = 0;
   HGLOBAL16*	RetPtr = NULL;
@@ -600,9 +614,9 @@ HGLOBAL16 InternalExtractIcon(HINSTANCE16 hInstance, LPCSTR lpszExeFileName, UIN
   if( pData ) 
   {
     HICON16	 hIcon = 0;
-    BOOL	 icoFile = FALSE;
-    UINT         iconDirCount = 0;
-    UINT         iconCount = 0;
+    BOOL32	 icoFile = FALSE;
+    UINT16         iconDirCount = 0;
+    UINT16         iconCount = 0;
     NE_TYPEINFO* pTInfo = (NE_TYPEINFO*)(pData + 2);
     NE_NAMEINFO* pIconStorage = NULL;
     NE_NAMEINFO* pIconDir = NULL;
@@ -638,10 +652,10 @@ HGLOBAL16 InternalExtractIcon(HINSTANCE16 hInstance, LPCSTR lpszExeFileName, UIN
     /* load resources and create icons */
 
     if( (pIconStorage && pIconDir) || icoFile )
-      if( nIconIndex == (UINT)-1 ) RetPtr[0] = iconDirCount;
+      if( nIconIndex == (UINT16)-1 ) RetPtr[0] = iconDirCount;
       else if( nIconIndex < iconDirCount )
         {
-	   UINT   i, icon;
+	   UINT16   i, icon;
 
 	   if( n > iconDirCount - nIconIndex ) n = iconDirCount - nIconIndex;
 
@@ -680,9 +694,10 @@ HGLOBAL16 InternalExtractIcon(HINSTANCE16 hInstance, LPCSTR lpszExeFileName, UIN
 }
 
 /*************************************************************************
- *				ExtractIcon 		[SHELL.34]
+ *             ExtractIcon16   (SHELL.34)
  */
-HICON16 ExtractIcon(HINSTANCE16 hInstance, LPCSTR lpszExeFileName, WORD nIconIndex)
+HICON16 ExtractIcon16( HINSTANCE16 hInstance, LPCSTR lpszExeFileName,
+                       UINT16 nIconIndex )
 {
   HGLOBAL16 handle = InternalExtractIcon(hInstance,lpszExeFileName,nIconIndex, 1);
 
@@ -697,6 +712,18 @@ HICON16 ExtractIcon(HINSTANCE16 hInstance, LPCSTR lpszExeFileName, WORD nIconInd
   return 0;
 }
 
+
+/*************************************************************************
+ *             ExtractIcon32A   (SHELL32.20)
+ */
+HICON32 ExtractIcon32A( HINSTANCE32 hInstance, LPCSTR lpszExeFileName,
+                        UINT32 nIconIndex )
+{
+    /* FIXME */
+    return ExtractIcon16( hInstance, lpszExeFileName, nIconIndex );
+}
+
+
 /*************************************************************************
  *				ExtractAssociatedIcon	[SHELL.36]
  * 
@@ -705,7 +732,7 @@ HICON16 ExtractIcon(HINSTANCE16 hInstance, LPCSTR lpszExeFileName, WORD nIconInd
  */
 HICON16 ExtractAssociatedIcon(HINSTANCE16 hInst,LPSTR lpIconPath,LPWORD lpiIcon)
 {
-    HICON16 hIcon = ExtractIcon(hInst, lpIconPath, *lpiIcon);
+    HICON16 hIcon = ExtractIcon16(hInst, lpIconPath, *lpiIcon);
 
     if( hIcon < 2 )
       {
@@ -713,12 +740,12 @@ HICON16 ExtractAssociatedIcon(HINSTANCE16 hInst,LPSTR lpIconPath,LPWORD lpiIcon)
 	if( hIcon == 1 ) /* no icons found in given file */
 	  {
 	    char  tempPath[0x80];
-	    UINT  uRet = FindExecutable(lpIconPath,NULL,tempPath);
+	    UINT16  uRet = FindExecutable16(lpIconPath,NULL,tempPath);
 
 	    if( uRet > 32 && tempPath[0] )
 	      {
 		strcpy(lpIconPath,tempPath);
-	        hIcon = ExtractIcon(hInst, lpIconPath, *lpiIcon);
+	        hIcon = ExtractIcon16(hInst, lpIconPath, *lpiIcon);
 
 		if( hIcon > 2 ) return hIcon;
 	      }
@@ -744,7 +771,7 @@ HICON16 ExtractAssociatedIcon(HINSTANCE16 hInst,LPSTR lpIconPath,LPWORD lpiIcon)
  */
 LPSTR SHELL_FindString(LPSTR lpEnv, LPCSTR entry)
 {
-  UINT 	l = strlen(entry); 
+  UINT16 	l = strlen(entry); 
   for( ; *lpEnv ; lpEnv+=strlen(lpEnv)+1 )
      {
        if( lstrncmpi32A(lpEnv, entry, l) ) continue;
diff --git a/misc/spy.c b/misc/spy.c
index 7b19a340067..3216f4a855b 100644
--- a/misc/spy.c
+++ b/misc/spy.c
@@ -5,7 +5,6 @@
  *           1995, Alex Korobka  
  */
 
-#define NO_TRANSITION_TYPES  /* This file is Win32-clean */
 #include <stdlib.h>
 #include <stdio.h>
 #include <string.h>
diff --git a/misc/stress.c b/misc/stress.c
index 3223fa7d42e..d8003233edf 100644
--- a/misc/stress.c
+++ b/misc/stress.c
@@ -8,7 +8,7 @@
 #include "debug.h"
 
 
-int AllocDiskSpace(long lLeft, UINT uDrive)
+int AllocDiskSpace(long lLeft, UINT16 uDrive)
 {
 	dprintf_stress(stdnimp, "stress.dll: AllocDiskSpace %d, %ld\n", uDrive, lLeft);
 
@@ -25,21 +25,21 @@ int AllocFileHandles(int Left)
 		return 1;
 }
 
-BOOL AllocGDIMem(UINT uLeft)
+BOOL16 AllocGDIMem(UINT16 uLeft)
 {
 	dprintf_stress(stddeb, "stress.dll: AllocGDIMem %d\n", uLeft);
 
 	return 1;
 }
 
-BOOL AllocMem(DWORD dwLeft)
+BOOL16 AllocMem(DWORD dwLeft)
 {
 	dprintf_stress(stdnimp, "stress.dll: AllocMem %ld\n", dwLeft);
 
 	return 1;
 }
 
-BOOL AllocUserMem(UINT uContig)
+BOOL16 AllocUserMem(UINT16 uContig)
 {
 	dprintf_stress(stddeb, "stress.dll: AllocUserMem %d\n", uContig);
 
@@ -77,7 +77,7 @@ int GetFreeFileHandles(void)
 #endif
 }
 
-void UnAllocDiskSpace(UINT drive)
+void UnAllocDiskSpace(UINT16 drive)
 {
 	dprintf_stress(stddeb, "stress.dll: UnAllocDiskSpace %d\n", drive);
 }
diff --git a/misc/system.c b/misc/system.c
index ee60a031a38..aaeeae55b1c 100644
--- a/misc/system.c
+++ b/misc/system.c
@@ -11,7 +11,7 @@
 /***********************************************************************
  *           InquireSystem   (SYSTEM.1)
  */
-DWORD InquireSystem( WORD code, WORD drive, BOOL enable )
+DWORD InquireSystem( WORD code, WORD drive, BOOL16 enable )
 {
     WORD drivetype;
 
diff --git a/misc/winsock.c b/misc/winsock.c
index b84cf6c098c..6652b8a415e 100644
--- a/misc/winsock.c
+++ b/misc/winsock.c
@@ -360,7 +360,7 @@ INT16 WSAGetLastError(void)
 
   dprintf_winsock(stddeb, "WSAGetLastError(%08x)", (unsigned)pwsi);
 
-  ret = (pwsi) ? pwsi->errno : WSANOTINITIALISED;
+  ret = (pwsi) ? pwsi->err : WSANOTINITIALISED;
 
   dprintf_winsock(stddeb, " = %i\n", (int)ret);
   return ret;
@@ -372,15 +372,15 @@ void WSASetLastError(INT16 iError)
 
   dprintf_winsock(stddeb, "WSASetLastError(%08x): %d\n", (unsigned)pwsi, (int)iError);
 
-  if( pwsi ) pwsi->errno = iError;
+  if( pwsi ) pwsi->err = iError;
 }
 
 int _check_ws(LPWSINFO pwsi, ws_socket* pws)
 {
   if( pwsi )
-    if( pwsi->flags & WSI_BLOCKINGCALL ) pwsi->errno = WSAEINPROGRESS;
+    if( pwsi->flags & WSI_BLOCKINGCALL ) pwsi->err = WSAEINPROGRESS;
     else if( WSI_CHECK_RANGE(pwsi, pws) ) return 1;
-    else pwsi->errno = WSAENOTSOCK;
+    else pwsi->err = WSAENOTSOCK;
   return 0;
 }
 
@@ -426,9 +426,9 @@ SOCKET16 WINSOCK_accept(SOCKET16 s, struct sockaddr *addr, INT16 *addrlen16)
 	  pwsi->flags &= ~WSI_BLOCKINGCALL; 
 	  return (SOCKET16)WS_PTR2HANDLE(pnew);
         } 
-	else pwsi->errno = WSAENOBUFS;
+	else pwsi->err = WSAENOBUFS;
      } 
-     else pwsi->errno = wsaErrno();
+     else pwsi->err = wsaErrno();
 
      pwsi->flags &= ~WSI_BLOCKINGCALL;
   }
@@ -456,14 +456,14 @@ INT16 WINSOCK_bind(SOCKET16 s, struct sockaddr *name, INT16 namelen)
 	     errno = loc_errno;
 	     switch(errno)
 	     {
-		case EBADF: pwsi->errno = WSAENOTSOCK; break;
-		case EADDRNOTAVAIL: pwsi->errno = WSAEINVAL; break;
-		default: pwsi->errno = wsaErrno();
+		case EBADF: pwsi->err = WSAENOTSOCK; break;
+		case EADDRNOTAVAIL: pwsi->err = WSAEINVAL; break;
+		default: pwsi->err = wsaErrno();
 	     }
 	  }
 	  else return 0;
-       else pwsi->errno = WSAEAFNOSUPPORT;
-    else pwsi->errno = WSAEFAULT;
+       else pwsi->err = WSAEAFNOSUPPORT;
+    else pwsi->err = WSAEFAULT;
   return SOCKET_ERROR;
 }
 
@@ -483,7 +483,7 @@ INT16 WINSOCK_closesocket(SOCKET16 s)
     pws->flags = (unsigned)pwsi->last_free;
     pwsi->last_free = pws - &pwsi->sock[0];
     if (close(fd) == 0) return 0;
-    pwsi->errno = (errno == EBADF) ? WSAENOTSOCK : wsaErrno();
+    pwsi->err = (errno == EBADF) ? WSAENOTSOCK : wsaErrno();
   }
   return SOCKET_ERROR;
 }
@@ -512,7 +512,7 @@ INT16 WINSOCK_connect(SOCKET16 s, struct sockaddr *name, INT16 namelen)
         pws->flags &= ~(WS_FD_INACTIVE | WS_FD_CONNECT); 
         return 0; 
     }
-    pwsi->errno = (errno == EINPROGRESS) ? WSAEWOULDBLOCK : wsaErrno();
+    pwsi->err = (errno == EINPROGRESS) ? WSAEWOULDBLOCK : wsaErrno();
   }
   return SOCKET_ERROR;
 }
@@ -535,7 +535,7 @@ INT16 WINSOCK_getpeername(SOCKET16 s, struct sockaddr *name, INT16 *namelen)
        *namelen = (INT16)namelen32; 
         return 0; 
     }
-    pwsi->errno = (h_errno < 0) ? wsaErrno() : wsaHerrno();
+    pwsi->err = (h_errno < 0) ? wsaErrno() : wsaHerrno();
   }
   return SOCKET_ERROR;
 }
@@ -555,7 +555,7 @@ INT16 WINSOCK_getsockname(SOCKET16 s, struct sockaddr *name, INT16 *namelen)
 	*namelen = (INT16)namelen32; 
 	 return 0; 
     }
-    pwsi->errno = (h_errno < 0) ? wsaErrno() : wsaHerrno();
+    pwsi->err = (h_errno < 0) ? wsaErrno() : wsaHerrno();
   }
   return SOCKET_ERROR;
 }
@@ -576,7 +576,7 @@ INT16 WINSOCK_getsockopt(SOCKET16 s, INT16 level,
      convert_sockopt(&level, &optname);
      if (getsockopt(pws->fd, (int) level, optname, optval, &optlen32) == 0 )
      { *optlen = (INT16)optlen32; return 0; }
-     pwsi->errno = (errno == EBADF) ? WSAENOTSOCK : wsaErrno();
+     pwsi->err = (errno == EBADF) ? WSAENOTSOCK : wsaErrno();
   }
   return SOCKET_ERROR;
 }
@@ -604,13 +604,13 @@ SEGPTR WINSOCK_inet_ntoa(struct in_addr in)
 	if( pwsi->dbuffer == NULL )
 	    if((pwsi->dbuffer = (char*) SEGPTR_ALLOC(32)) == NULL )
 	    {
-		pwsi->errno = WSAENOBUFS;
+		pwsi->err = WSAENOBUFS;
 		return (SEGPTR)NULL;
 	    }
 	strncpy(pwsi->dbuffer, s, 32 );
 	return SEGPTR_GET(pwsi->dbuffer); 
     }
-    pwsi->errno = wsaErrno();
+    pwsi->err = wsaErrno();
   }
   return (SEGPTR)NULL;
 }
@@ -632,18 +632,18 @@ INT16 WINSOCK_ioctlsocket(SOCKET16 s, UINT32 cmd, UINT32 *argp)
 	case WS_FIONBIO:    newcmd=FIONBIO;  
 			    if( pws->p_aop && *argp == 0 ) 
 			    { 
-				pwsi->errno = WSAEINVAL; 
+				pwsi->err = WSAEINVAL; 
 				return SOCKET_ERROR; 
 			    }
 			    break;
 	case WS_SIOCATMARK: newcmd=SIOCATMARK; break;
 	case WS_IOW('f',125,u_long): 
 			  fprintf(stderr,"Warning: WS1.1 shouldn't be using async I/O\n");
-			  pwsi->errno = WSAEINVAL; return SOCKET_ERROR;
+			  pwsi->err = WSAEINVAL; return SOCKET_ERROR;
 	default:	  fprintf(stderr,"Warning: Unknown WS_IOCTL cmd (%08x)\n", cmd);
     }
     if( ioctl(pws->fd, newcmd, (char*)argp ) == 0 ) return 0;
-    pwsi->errno = (errno == EBADF) ? WSAENOTSOCK : wsaErrno(); 
+    pwsi->err = (errno == EBADF) ? WSAENOTSOCK : wsaErrno(); 
   }
   return SOCKET_ERROR;
 }
@@ -665,7 +665,7 @@ INT16 WINSOCK_listen(SOCKET16 s, INT16 backlog)
     else notify_client(pws, WS_FD_ACCEPT);
 
     if (listen(pws->fd, backlog) == 0) return 0;
-    pwsi->errno = wsaErrno();
+    pwsi->err = wsaErrno();
   }
   return SOCKET_ERROR;
 }
@@ -686,7 +686,7 @@ INT16 WINSOCK_recv(SOCKET16 s, char *buf, INT16 len, INT16 flags)
 	notify_client(pws, WS_FD_READ);
 	return (INT16)length;
     }
-    pwsi->errno = wsaErrno();
+    pwsi->err = wsaErrno();
   }
   dprintf_winsock(stddeb, " -> ERROR\n");
   return SOCKET_ERROR;
@@ -710,7 +710,7 @@ INT16 WINSOCK_recvfrom(SOCKET16 s, char *buf, INT16 len, INT16 flags,
        notify_client(pws, WS_FD_READ);
        return (INT16)length;
     }
-    pwsi->errno = wsaErrno();
+    pwsi->err = wsaErrno();
   }
   return SOCKET_ERROR;
 }
@@ -744,7 +744,7 @@ INT16 WINSOCK_select(INT16 nfds, ws_fd_set *ws_readfds,
 	  }
 	  return highfd; 
      }
-     pwsi->errno = wsaErrno();
+     pwsi->err = wsaErrno();
   } 
   return SOCKET_ERROR;
 }
@@ -762,7 +762,7 @@ INT16 WINSOCK_send(SOCKET16 s, char *buf, INT16 len, INT16 flags)
     if ((length = send(pws->fd, buf, len, flags)) < 0 ) 
     {  
 	length = SOCKET_ERROR;
-	pwsi->errno = wsaErrno();
+	pwsi->err = wsaErrno();
     }
     notify_client(pws, WS_FD_WRITE);
     return (INT16)length;
@@ -785,7 +785,7 @@ INT16 WINSOCK_sendto(SOCKET16 s, char *buf, INT16 len, INT16 flags,
     if ((length = sendto(pws->fd, buf, len, flags, to, tolen)) < 0 )
     {
 	length = SOCKET_ERROR;
-        pwsi->errno = wsaErrno();
+        pwsi->err = wsaErrno();
     }
     notify_client(pws, WS_FD_WRITE);
     return (INT16)length;
@@ -814,7 +814,7 @@ INT16 WINSOCK_setsockopt(SOCKET16 s, INT16 level, INT16 optname,
 	optlen = sizeof(linger32);
     }
     if (setsockopt(pws->fd, level, optname, optval, optlen) == 0) return 0;
-    pwsi->errno = wsaErrno();
+    pwsi->err = wsaErrno();
   }
   return SOCKET_ERROR;
 }
@@ -832,7 +832,7 @@ INT16 WINSOCK_shutdown(SOCKET16 s, INT16 how)
     cancel_async_select(pws);
 
     if (shutdown(pws->fd, how) == 0) return 0;
-    pwsi->errno = wsaErrno();
+    pwsi->err = wsaErrno();
   }
   return SOCKET_ERROR;
 }
@@ -853,7 +853,7 @@ SOCKET16 WINSOCK_socket(INT16 af, INT16 type, INT16 protocol)
     {
 	case AF_INET:
 	case AF_UNSPEC: break;
-	default:        pwsi->errno = WSAEAFNOSUPPORT; return INVALID_SOCKET;
+	default:        pwsi->err = WSAEAFNOSUPPORT; return INVALID_SOCKET;
     }
 
     /* check the socket type */
@@ -862,12 +862,12 @@ SOCKET16 WINSOCK_socket(INT16 af, INT16 type, INT16 protocol)
 	case SOCK_STREAM:
 	case SOCK_DGRAM:
 	case SOCK_RAW: break;
-	default:       pwsi->errno = WSAESOCKTNOSUPPORT; return INVALID_SOCKET;
+	default:       pwsi->err = WSAESOCKTNOSUPPORT; return INVALID_SOCKET;
     }
 
     /* check the protocol type */
     if ( protocol < 0 )  /* don't support negative values */
-    { pwsi->errno = WSAEPROTONOSUPPORT; return INVALID_SOCKET; }
+    { pwsi->err = WSAEPROTONOSUPPORT; return INVALID_SOCKET; }
 
     if ( af == AF_UNSPEC)  /* did they not specify the address family? */
         switch(protocol) 
@@ -876,7 +876,7 @@ SOCKET16 WINSOCK_socket(INT16 af, INT16 type, INT16 protocol)
              if (type == SOCK_STREAM) { af = AF_INET; break; }
           case IPPROTO_UDP:
              if (type == SOCK_DGRAM)  { af = AF_INET; break; }
-          default: pwsi->errno = WSAEPROTOTYPE; return INVALID_SOCKET;
+          default: pwsi->err = WSAEPROTOTYPE; return INVALID_SOCKET;
         }
 
     if ((sock = socket(af, type, protocol)) >= 0) 
@@ -888,7 +888,7 @@ SOCKET16 WINSOCK_socket(INT16 af, INT16 type, INT16 protocol)
         if( pnew ) return (SOCKET16)WS_PTR2HANDLE(pnew);
 	{
           close(sock);
-          pwsi->errno = WSAENOBUFS;
+          pwsi->err = WSAENOBUFS;
           return INVALID_SOCKET;
 	}
     }
@@ -896,8 +896,8 @@ SOCKET16 WINSOCK_socket(INT16 af, INT16 type, INT16 protocol)
     if (errno == EPERM) /* raw socket denied */
     {
         fprintf(stderr, "WS_SOCKET: not enough privileges\n");
-        pwsi->errno = WSAESOCKTNOSUPPORT;
-    } else pwsi->errno = wsaErrno();
+        pwsi->err = WSAESOCKTNOSUPPORT;
+    } else pwsi->err = wsaErrno();
   }
  
   dprintf_winsock(stddeb, "\t\tfailed!\n");
@@ -927,8 +927,8 @@ SEGPTR WINSOCK_gethostbyaddr(const char *addr, INT16 len, INT16 type)
     if( (host = gethostbyaddr(addr, len, type)) != NULL )
       if( WS_dup_he(pwsi, host, WS_DUP_SEGPTR) )
           return SEGPTR_GET(pwsi->buffer);
-      else pwsi->errno = WSAENOBUFS;
-    else pwsi->errno = (h_errno < 0) ? wsaErrno() : wsaHerrno();
+      else pwsi->err = WSAENOBUFS;
+    else pwsi->err = (h_errno < 0) ? wsaErrno() : wsaHerrno();
   } 
   return NULL;
 }
@@ -948,8 +948,8 @@ SEGPTR WINSOCK_gethostbyname(const char *name)
     if( (host = gethostbyname(name)) != NULL )
       if( WS_dup_he(pwsi, host, WS_DUP_SEGPTR) )
           return SEGPTR_GET(pwsi->buffer);
-      else pwsi->errno = WSAENOBUFS;
-    else pwsi->errno = (h_errno < 0) ? wsaErrno() : wsaHerrno();
+      else pwsi->err = WSAENOBUFS;
+    else pwsi->err = (h_errno < 0) ? wsaErrno() : wsaHerrno();
   }
   return NULL;
 }
@@ -963,7 +963,7 @@ INT16 WINSOCK_gethostname(char *name, INT16 namelen)
   if( pwsi )
   {
     if (gethostname(name, namelen) == 0) return 0;
-    pwsi->errno = (errno == EINVAL) ? WSAEFAULT : wsaErrno();
+    pwsi->err = (errno == EINVAL) ? WSAEFAULT : wsaErrno();
   }
   return SOCKET_ERROR;
 }
@@ -983,8 +983,8 @@ SEGPTR WINSOCK_getprotobyname(char *name)
     if( (proto = getprotobyname(name)) != NULL )
       if( WS_dup_pe(pwsi, proto, WS_DUP_SEGPTR) )
           return SEGPTR_GET(pwsi->buffer);
-      else pwsi->errno = WSAENOBUFS;
-    else pwsi->errno = (h_errno < 0) ? wsaErrno() : wsaHerrno();
+      else pwsi->err = WSAENOBUFS;
+    else pwsi->err = (h_errno < 0) ? wsaErrno() : wsaHerrno();
   }
   return NULL;
 }
@@ -1004,8 +1004,8 @@ SEGPTR WINSOCK_getprotobynumber(INT16 number)
     if( (proto = getprotobynumber(number)) != NULL )
       if( WS_dup_pe(pwsi, proto, WS_DUP_SEGPTR) )
           return SEGPTR_GET(pwsi->buffer);
-      else pwsi->errno = WSAENOBUFS;
-    else pwsi->errno = WSANO_DATA;
+      else pwsi->err = WSAENOBUFS;
+    else pwsi->err = WSANO_DATA;
   }
   return NULL;
 }
@@ -1026,8 +1026,8 @@ SEGPTR WINSOCK_getservbyname(const char *name, const char *proto)
     if( (serv = getservbyname(name, proto)) != NULL )
       if( WS_dup_se(pwsi, serv, WS_DUP_SEGPTR) )
           return SEGPTR_GET(pwsi->buffer);
-      else pwsi->errno = WSAENOBUFS;
-    else pwsi->errno = (h_errno < 0) ? wsaErrno() : wsaHerrno();
+      else pwsi->err = WSAENOBUFS;
+    else pwsi->err = (h_errno < 0) ? wsaErrno() : wsaHerrno();
   }
   return NULL;
 }
@@ -1047,8 +1047,8 @@ SEGPTR WINSOCK_getservbyport(INT16 port, const char *proto)
     if( (serv = getservbyport(port, proto)) != NULL )
       if( WS_dup_se(pwsi, serv, WS_DUP_SEGPTR) )
           return SEGPTR_GET(pwsi->buffer);
-      else pwsi->errno = WSAENOBUFS;
-    else pwsi->errno = (h_errno < 0) ? wsaErrno() : wsaHerrno();
+      else pwsi->err = WSAENOBUFS;
+    else pwsi->err = (h_errno < 0) ? wsaErrno() : wsaHerrno();
   }
   return NULL;
 }
@@ -1091,7 +1091,7 @@ static int aop_control(ws_async_op* p_aop, int flag )
 	 p_aop->hWnd, p_aop->uMsg, (HANDLE16)WS_PTR2HANDLE(p_aop), (LPARAM)lLength);
 #endif
 
-  PostMessage(p_aop->hWnd, p_aop->uMsg, (HANDLE16)WS_PTR2HANDLE(p_aop), (LPARAM)lLength);
+  PostMessage16(p_aop->hWnd, p_aop->uMsg, (HANDLE16)WS_PTR2HANDLE(p_aop), (LPARAM)lLength);
   return AOP_CONTROL_REMOVE;
 }
 
@@ -1154,8 +1154,8 @@ static HANDLE16 __WSAsyncDBQuery(LPWSINFO pwsi, HWND16 hWnd, UINT16 uMsg, LPCSTR
                  }
       }
       WS_FREE(async_ctl.ws_aop);
-      pwsi->errno = wsaErrno();
-  } else pwsi->errno = WSAEWOULDBLOCK;
+      pwsi->err = wsaErrno();
+  } else pwsi->err = WSAEWOULDBLOCK;
   return 0;
 }
 
@@ -1268,7 +1268,7 @@ INT16 WSACancelAsyncRequest(HANDLE16 hAsyncTaskHandle)
 	WS_FREE(p_aop);
 	return 0;
     }
-    else pwsi->errno = WSAEINVAL;
+    else pwsi->err = WSAEINVAL;
   return SOCKET_ERROR;
 }
 
@@ -1311,8 +1311,8 @@ void _sigusr1_handler_parent(int sig)
           printf("async event - hWnd %04x, uMsg %04x [%08x]\n",
                   pws->p_aop->hWnd, pws->p_aop->uMsg, ipack.lParam );
 #endif
-	  PostMessage(pws->p_aop->hWnd, pws->p_aop->uMsg, 
-		     (WPARAM16)ipack.wParam, (LPARAM)ipack.lParam );
+	  PostMessage16(pws->p_aop->hWnd, pws->p_aop->uMsg, 
+                        (WPARAM16)ipack.wParam, (LPARAM)ipack.lParam );
       }
       else fprintf(stderr,"AsyncSelect:stray async_op in socket %04x!\n", ipack.wParam);
     }
@@ -1388,7 +1388,7 @@ INT16 WSAAsyncSelect(SOCKET16 s, HWND16 hWnd, UINT16 uMsg, UINT32 lEvent)
 			  (unsigned)pwsi, s, hWnd, uMsg, (unsigned)lEvent );
   if( _check_ws(pwsi, pws) )
     if( init_async_select(pws, hWnd, uMsg, lEvent) == 0 ) return 0;
-    else pwsi->errno = WSAENOBUFS;
+    else pwsi->err = WSAENOBUFS;
   return SOCKET_ERROR; 
 }
 
diff --git a/misc/wsprintf.c b/misc/wsprintf.c
index bdf63342ce7..bdb67130317 100644
--- a/misc/wsprintf.c
+++ b/misc/wsprintf.c
@@ -4,7 +4,6 @@
  * Copyright 1996 Alexandre Julliard
  */
 
-#define NO_TRANSITION_TYPES  /* This file is Win32-clean */
 #include <stdarg.h>
 #include <stdio.h>
 #include <string.h>
diff --git a/miscemu/Makefile.in b/miscemu/Makefile.in
index 79950ea5cb6..d6c0b52956c 100644
--- a/miscemu/Makefile.in
+++ b/miscemu/Makefile.in
@@ -1,4 +1,4 @@
-DEFS      = -D__WINE__ -DNO_TRANSITION_TYPES
+DEFS      = -D__WINE__
 TOPSRCDIR = @top_srcdir@
 TOPOBJDIR = ..
 SRCDIR    = @srcdir@
diff --git a/msdos/Makefile.in b/msdos/Makefile.in
index 1c7682b3019..c380feb7dec 100644
--- a/msdos/Makefile.in
+++ b/msdos/Makefile.in
@@ -1,4 +1,4 @@
-DEFS      = -D__WINE__ -DNO_TRANSITION_TYPES
+DEFS      = -D__WINE__
 TOPSRCDIR = @top_srcdir@
 TOPOBJDIR = ..
 SRCDIR    = @srcdir@
diff --git a/msdos/dosmem.c b/msdos/dosmem.c
index 07d781fb6ce..ba866a44256 100644
--- a/msdos/dosmem.c
+++ b/msdos/dosmem.c
@@ -204,7 +204,8 @@ BOOL32 DOSMEM_Init(void)
      * - it is mostly wasted but we use can some of it to 
      *   store internal translation tables, etc...
      */
-    DOSMEM_dosmem = VirtualAlloc(NULL,0x100000,MEM_COMMIT,PAGE_EXECUTE_READWRITE);
+    DOSMEM_dosmem = VirtualAlloc( NULL, 0x100000, MEM_COMMIT,
+                                  PAGE_EXECUTE_READWRITE );
     if (!DOSMEM_dosmem)
     {
         fprintf( stderr, "Could not allocate DOS memory.\n" );
@@ -348,6 +349,7 @@ BOOL32 DOSMEM_FreeBlock(void* ptr)
    return FALSE;
 }
 
+
 /***********************************************************************
  *           DOSMEM_MapLinearToDos
  *
@@ -355,14 +357,13 @@ BOOL32 DOSMEM_FreeBlock(void* ptr)
  */
 UINT32 DOSMEM_MapLinearToDos(LPVOID ptr)
 {
-#ifndef WINELIB
-   if (((char*)ptr >= DOSMEM_dosmem) &&
-        ((char*)ptr < DOSMEM_dosmem+0x100000))  
+    if (((char*)ptr >= DOSMEM_dosmem) &&
+        ((char*)ptr < DOSMEM_dosmem + 0x100000))
 	  return (UINT32)ptr - (UINT32)DOSMEM_dosmem;
-#endif
-   return (UINT32)ptr;
+    return (UINT32)ptr;
 }
 
+
 /***********************************************************************
  *           DOSMEM_MapDosToLinear
  *
@@ -370,12 +371,11 @@ UINT32 DOSMEM_MapLinearToDos(LPVOID ptr)
  */
 LPVOID DOSMEM_MapDosToLinear(UINT32 ptr)
 {
-#ifndef WINELIB
-   if ( ptr < 1000000 ) return (LPVOID)(ptr + (UINT32)DOSMEM_dosmem);
-#endif
-   return (LPVOID)ptr;
+    if (ptr < 0x100000) return (LPVOID)(ptr + (UINT32)DOSMEM_dosmem);
+    return (LPVOID)ptr;
 }
 
+
 /***********************************************************************
  *           DOSMEM_MapRealToLinear
  *
@@ -398,7 +398,7 @@ LPVOID DOSMEM_MapRealToLinear(DWORD x)
  */
 WORD DOSMEM_AllocSelector(WORD realsel)
 {
-	HMODULE16 hModule = GetModuleHandle("KERNEL");
+	HMODULE16 hModule = GetModuleHandle16("KERNEL");
 	WORD	sel;
 
 	sel=GLOBAL_CreateBlock(
diff --git a/msdos/dpmi.c b/msdos/dpmi.c
index 5096368904c..4ad248ef45e 100644
--- a/msdos/dpmi.c
+++ b/msdos/dpmi.c
@@ -103,8 +103,8 @@ void INT_Int31Handler( CONTEXT *context )
             }
             if (entryPoint) 
                 AX_reg(context) = LOWORD(MODULE_GetEntryPoint( 
-                                                   GetModuleHandle( "KERNEL" ),
-                                                   entryPoint ));
+                                                 GetModuleHandle16( "KERNEL" ),
+                                                 entryPoint ));
         }
         break;
 
diff --git a/msdos/int21.c b/msdos/int21.c
index 79c0d874862..37dc6f07feb 100644
--- a/msdos/int21.c
+++ b/msdos/int21.c
@@ -428,7 +428,7 @@ void ExtendedOpenCreateFile(CONTEXT *context )
 	  return;
 	}
       if ((action & 0x07)== 2) {
-	/* Truncate it, but first check if opend for write */
+	/* Truncate it, but first check if opened for write */
 	if ((BL_reg(context) & 0x0007)== 0) {
 	  BX_reg(context) = AX_reg(context);
 	  CloseFile(context);
@@ -456,7 +456,7 @@ void ExtendedOpenCreateFile(CONTEXT *context )
 	DX_reg(context) = SI_reg(context);
 	INT21_CreateFile(context);
 	if (EFL_reg(context) & 0x0001) { /*no file open, flags set */
-	  dprintf_int(stddeb, "int21: extended open/create: truncfailed");
+	  dprintf_int(stddeb, "int21: extended open/create: trunc failed");
 	  return;
 	}
 	CX_reg(context) = 3;
diff --git a/msdos/int2f.c b/msdos/int2f.c
index 9cfd796224f..d8dbae1b337 100644
--- a/msdos/int2f.c
+++ b/msdos/int2f.c
@@ -102,7 +102,7 @@ static void do_int2f_16( CONTEXT *context )
 	break;
 
     case 0x84:  /* Get device API entry point */
-        addr = (DWORD)MODULE_GetEntryPoint( GetModuleHandle("WPROCS"),
+        addr = (DWORD)MODULE_GetEntryPoint( GetModuleHandle16("WPROCS"),
                                             VXD_BASE + BX_reg(context) );
         if (!addr)  /* not supported */
         {
diff --git a/multimedia/audio.c b/multimedia/audio.c
index 5a9b45f682a..932d1f9c629 100644
--- a/multimedia/audio.c
+++ b/multimedia/audio.c
@@ -4,12 +4,6 @@
  * Copyright 1994 Martin Ayotte
  */
 
-#ifndef WINELIB
-#define BUILTIN_MMSYSTEM
-#endif 
-
-#ifdef BUILTIN_MMSYSTEM
-
 #define EMULATE_SB16
 
 #include <stdio.h>
@@ -32,6 +26,8 @@
 #include "stddebug.h"
 #include "debug.h"
 
+int MMSYSTEM_DevIDToIndex(UINT16);
+
 #if defined(linux) || defined(__FreeBSD__)
 #define SOUND_DEV "/dev/dsp"
 
@@ -69,7 +65,7 @@ typedef struct {
 
 typedef struct {
     int     nUseCount;          /* Incremented for each shared open */
-    BOOL    fShareable;         /* TRUE if first open was shareable */
+    BOOL16  fShareable;         /* TRUE if first open was shareable */
     WORD    wNotifyDeviceID;    /* MCI device ID with a pending notification */
     HANDLE16 hCallback;          /* Callback handle for pending notification */
 	HMMIO16	hFile;				/* mmio file handle open as Element		*/
@@ -86,13 +82,15 @@ static LINUX_MCIWAVE	MCIWavDev[MAX_MCIWAVDRV];
 /**************************************************************************
 * 				WAVE_NotifyClient			[internal]
 */
-static DWORD WAVE_NotifyClient(UINT wDevID, WORD wMsg, 
+static DWORD WAVE_NotifyClient(UINT16 wDevID, WORD wMsg, 
 				DWORD dwParam1, DWORD dwParam2)
 {
-	if (WInDev[wDevID].wFlags != DCB_NULL && !DriverCallback(
-		WInDev[wDevID].waveDesc.dwCallBack, WInDev[wDevID].wFlags, 
-		WInDev[wDevID].waveDesc.hWave, wMsg, 
-		WInDev[wDevID].waveDesc.dwInstance, dwParam1, dwParam2)) {
+	int index = MMSYSTEM_DevIDToIndex(wDevID);
+
+	if (WInDev[index].wFlags != DCB_NULL && !DriverCallback(
+		WInDev[index].waveDesc.dwCallBack, WInDev[index].wFlags, 
+		WInDev[index].waveDesc.hWave, wMsg, 
+		WInDev[index].waveDesc.dwInstance, dwParam1, dwParam2)) {
 		dprintf_mciwave(stddeb,"WAVE_NotifyClient // can't notify client !\n");
 		return MMSYSERR_NOERROR;
 		}
@@ -102,8 +100,9 @@ static DWORD WAVE_NotifyClient(UINT wDevID, WORD wMsg,
 
 /**************************************************************************
 * 				WAVE_mciOpen	*/
-static DWORD WAVE_mciOpen(UINT wDevID, DWORD dwFlags, LPMCI_WAVE_OPEN_PARMS lpParms)
+static DWORD WAVE_mciOpen(UINT16 wDevID, DWORD dwFlags, LPMCI_WAVE_OPEN_PARMS lpParms)
 {
+	int index = MMSYSTEM_DevIDToIndex(wDevID);
 	HLOCAL16	hFormat;
 	LPPCMWAVEFORMAT	lpWaveFormat;
 	HLOCAL16	hDesc;
@@ -115,19 +114,22 @@ static DWORD WAVE_mciOpen(UINT wDevID, DWORD dwFlags, LPMCI_WAVE_OPEN_PARMS lpPa
 	dprintf_mciwave(stddeb,"WAVE_mciOpen(%04X, %08lX, %p)\n", 
 				wDevID, dwFlags, lpParms);
 	if (lpParms == NULL) return MCIERR_INTERNAL;
-	dprintf_mciwave(stddeb,"WAVE_mciOpen // wDevID=%04X\n", wDevID);
-	if (MCIWavDev[wDevID].nUseCount > 0) {
+
+	wDevID = lpParms->wDeviceID;
+	index = MMSYSTEM_DevIDToIndex(wDevID);
+
+	if (MCIWavDev[index].nUseCount > 0) {
 		/* The driver already open on this channel */
 		/* If the driver was opened shareable before and this open specifies */
 		/* shareable then increment the use count */
-		if (MCIWavDev[wDevID].fShareable && (dwFlags & MCI_OPEN_SHAREABLE))
-			++MCIWavDev[wDevID].nUseCount;
+		if (MCIWavDev[index].fShareable && (dwFlags & MCI_OPEN_SHAREABLE))
+			++MCIWavDev[index].nUseCount;
 		else
 			return MCIERR_MUST_USE_SHAREABLE;
 		}
 	else {
-		MCIWavDev[wDevID].nUseCount = 1;
-		MCIWavDev[wDevID].fShareable = dwFlags & MCI_OPEN_SHAREABLE;
+		MCIWavDev[index].nUseCount = 1;
+		MCIWavDev[index].fShareable = dwFlags & MCI_OPEN_SHAREABLE;
 		}
 	lpParms->wDeviceID = wDevID;
 	dprintf_mciwave(stddeb,"WAVE_mciOpen // wDevID=%04X\n", wDevID);
@@ -139,20 +141,20 @@ static DWORD WAVE_mciOpen(UINT wDevID, DWORD dwFlags, LPMCI_WAVE_OPEN_PARMS lpPa
 		if (strlen(lpstrElementName) > 0) {
 			strcpy(str, lpstrElementName);
 			CharUpper32A(str);
-			MCIWavDev[wDevID].hFile = mmioOpen(str, NULL, 
+			MCIWavDev[index].hFile = mmioOpen(str, NULL, 
 				MMIO_ALLOCBUF | MMIO_READWRITE | MMIO_EXCLUSIVE);
-			if (MCIWavDev[wDevID].hFile == 0) {
+			if (MCIWavDev[index].hFile == 0) {
 				dprintf_mciwave(stddeb,"WAVE_mciOpen // can't find file='%s' !\n", str);
 				return MCIERR_FILE_NOT_FOUND;
 				}
 			}
 		else 
-			MCIWavDev[wDevID].hFile = 0;
+			MCIWavDev[index].hFile = 0;
 		}
-	dprintf_mciwave(stddeb,"WAVE_mciOpen // hFile=%u\n", MCIWavDev[wDevID].hFile);
-	memcpy(&MCIWavDev[wDevID].openParms, lpParms, sizeof(MCI_WAVE_OPEN_PARMS));
-	MCIWavDev[wDevID].wNotifyDeviceID = lpParms->wDeviceID;
-	lpWaveFormat = &MCIWavDev[wDevID].WaveFormat;
+	dprintf_mciwave(stddeb,"WAVE_mciOpen // hFile=%u\n", MCIWavDev[index].hFile);
+	memcpy(&MCIWavDev[index].openParms, lpParms, sizeof(MCI_WAVE_OPEN_PARMS));
+	MCIWavDev[index].wNotifyDeviceID = lpParms->wDeviceID;
+	lpWaveFormat = &MCIWavDev[index].WaveFormat;
 	hDesc = USER_HEAP_ALLOC(sizeof(WAVEOPENDESC));
 	lpDesc = (LPWAVEOPENDESC) USER_HEAP_LIN_ADDR(hDesc);
 	lpDesc->hWave = 0;
@@ -164,10 +166,10 @@ static DWORD WAVE_mciOpen(UINT wDevID, DWORD dwFlags, LPMCI_WAVE_OPEN_PARMS lpPa
 	lpWaveFormat->wf.nAvgBytesPerSec = 11025;
 	lpWaveFormat->wf.nBlockAlign = 1;
 */
-	if (MCIWavDev[wDevID].hFile != 0) {
+	if (MCIWavDev[index].hFile != 0) {
 		MMCKINFO	mmckInfo;
 		MMCKINFO	ckMainRIFF;
-		if (mmioDescend(MCIWavDev[wDevID].hFile, &ckMainRIFF, NULL, 0) != 0) {
+		if (mmioDescend(MCIWavDev[index].hFile, &ckMainRIFF, NULL, 0) != 0) {
 			return MCIERR_INTERNAL;
 			}
 		dprintf_mciwave(stddeb,
@@ -179,19 +181,19 @@ static DWORD WAVE_mciOpen(UINT wDevID, DWORD dwFlags, LPMCI_WAVE_OPEN_PARMS lpPa
 			return MCIERR_INTERNAL;
 			}
 		mmckInfo.ckid = mmioFOURCC('f', 'm', 't', ' ');
-		if (mmioDescend(MCIWavDev[wDevID].hFile, &mmckInfo, &ckMainRIFF, MMIO_FINDCHUNK) != 0) {
+		if (mmioDescend(MCIWavDev[index].hFile, &mmckInfo, &ckMainRIFF, MMIO_FINDCHUNK) != 0) {
 			return MCIERR_INTERNAL;
 			}
 		dprintf_mciwave(stddeb,
 				"WAVE_mciOpen // Chunk Found ckid=%.4s fccType=%.4s cksize=%08lX \n",
 				(LPSTR)&mmckInfo.ckid, (LPSTR)&mmckInfo.fccType,
 				mmckInfo.cksize);
-		if (mmioRead(MCIWavDev[wDevID].hFile, (HPSTR) lpWaveFormat,
+		if (mmioRead(MCIWavDev[index].hFile, (HPSTR) lpWaveFormat,
 		    (long) sizeof(PCMWAVEFORMAT)) != (long) sizeof(PCMWAVEFORMAT)) {
 			return MCIERR_INTERNAL;
 			}
 		mmckInfo.ckid = mmioFOURCC('d', 'a', 't', 'a');
-		if (mmioDescend(MCIWavDev[wDevID].hFile, &mmckInfo, &ckMainRIFF, MMIO_FINDCHUNK) != 0) {
+		if (mmioDescend(MCIWavDev[index].hFile, &mmckInfo, &ckMainRIFF, MMIO_FINDCHUNK) != 0) {
 			return MCIERR_INTERNAL;
 			}
 		dprintf_mciwave(stddeb,
@@ -209,8 +211,8 @@ static DWORD WAVE_mciOpen(UINT wDevID, DWORD dwFlags, LPMCI_WAVE_OPEN_PARMS lpPa
 	lpDesc->lpFormat = (LPWAVEFORMAT) USER_HEAP_LIN_ADDR(hFormat);
 	memcpy(lpDesc->lpFormat, lpWaveFormat, sizeof(PCMWAVEFORMAT));
 	lpDesc = (LPWAVEOPENDESC) USER_HEAP_SEG_ADDR(hDesc);
-	dwRet = wodMessage(0, WODM_OPEN, 0, (DWORD)lpDesc, CALLBACK_NULL);
-	dwRet = widMessage(0, WIDM_OPEN, 0, (DWORD)lpDesc, CALLBACK_NULL);
+	dwRet = wodMessage(wDevID, WODM_OPEN, 0, (DWORD)lpDesc, CALLBACK_NULL);
+	dwRet = widMessage(wDevID, WIDM_OPEN, 0, (DWORD)lpDesc, CALLBACK_NULL);
 	USER_HEAP_FREE(hFormat);
 	USER_HEAP_FREE(hDesc);
 	return 0;
@@ -219,20 +221,21 @@ static DWORD WAVE_mciOpen(UINT wDevID, DWORD dwFlags, LPMCI_WAVE_OPEN_PARMS lpPa
 /**************************************************************************
 * 				WAVE_mciClose		[internal]
 */
-static DWORD WAVE_mciClose(UINT wDevID, DWORD dwParam, LPMCI_GENERIC_PARMS lpParms)
+static DWORD WAVE_mciClose(UINT16 wDevID, DWORD dwParam, LPMCI_GENERIC_PARMS lpParms)
 {
+	int index = MMSYSTEM_DevIDToIndex(wDevID);
 	DWORD		dwRet;
 	dprintf_mciwave(stddeb,
 		"WAVE_mciClose(%u, %08lX, %p);\n", wDevID, dwParam, lpParms);
-	MCIWavDev[wDevID].nUseCount--;
-	if (MCIWavDev[wDevID].nUseCount == 0) {
-		if (MCIWavDev[wDevID].hFile != 0) {
-			mmioClose(MCIWavDev[wDevID].hFile, 0);
-			MCIWavDev[wDevID].hFile = 0;
+	MCIWavDev[index].nUseCount--;
+	if (MCIWavDev[index].nUseCount == 0) {
+		if (MCIWavDev[index].hFile != 0) {
+			mmioClose(MCIWavDev[index].hFile, 0);
+			MCIWavDev[index].hFile = 0;
 			}
-		dwRet = wodMessage(0, WODM_CLOSE, 0, 0L, 0L);
+		dwRet = wodMessage(wDevID, WODM_CLOSE, 0, 0L, 0L);
 		if (dwRet != MMSYSERR_NOERROR) return MCIERR_INTERNAL;
-		dwRet = widMessage(0, WIDM_CLOSE, 0, 0L, 0L);
+		dwRet = widMessage(wDevID, WIDM_CLOSE, 0, 0L, 0L);
 		if (dwRet != MMSYSERR_NOERROR) return MCIERR_INTERNAL;
 		}
 	return 0;
@@ -242,8 +245,9 @@ static DWORD WAVE_mciClose(UINT wDevID, DWORD dwParam, LPMCI_GENERIC_PARMS lpPar
 /**************************************************************************
 * 				WAVE_mciPlay		[internal]
 */
-static DWORD WAVE_mciPlay(UINT wDevID, DWORD dwFlags, LPMCI_PLAY_PARMS lpParms)
+static DWORD WAVE_mciPlay(UINT16 wDevID, DWORD dwFlags, LPMCI_PLAY_PARMS lpParms)
 {
+	int index = MMSYSTEM_DevIDToIndex(wDevID);
 	int				start, end;
 	LONG			bufsize, count;
 	HGLOBAL16		hData;
@@ -253,9 +257,9 @@ static DWORD WAVE_mciPlay(UINT wDevID, DWORD dwFlags, LPMCI_PLAY_PARMS lpParms)
 	DWORD			dwRet;
 	dprintf_mciwave(stddeb,
 		 "WAVE_mciPlay(%u, %08lX, %p);\n", wDevID, dwFlags, lpParms);
-	if (MCIWavDev[wDevID].hFile == 0) {
-        dprintf_mciwave(stddeb,"WAVE_mciPlay // can't find file='%s' !\n",
-				MCIWavDev[wDevID].openParms.lpstrElementName);
+	if (MCIWavDev[index].hFile == 0) {
+        dprintf_mciwave(stddeb,"WAVE_mciPlay // can't find file='%08lx' !\n",
+                        MCIWavDev[index].openParms.lpstrElementName);
 		return MCIERR_FILE_NOT_FOUND;
 		}
 	start = 1; 		end = 99999;
@@ -286,7 +290,7 @@ static DWORD WAVE_mciPlay(UINT wDevID, DWORD dwFlags, LPMCI_PLAY_PARMS lpParms)
 		}
 #endif
 	bufsize = 64000;
-	lpWaveHdr = &MCIWavDev[wDevID].WaveHdr;
+	lpWaveHdr = &MCIWavDev[index].WaveHdr;
 	hData = GlobalAlloc16(GMEM_MOVEABLE, bufsize);
 	lpWaveHdr->lpData = (LPSTR) WIN16_GlobalLock16(hData);
 	lpWaveHdr->dwUser = 0L;
@@ -296,9 +300,9 @@ static DWORD WAVE_mciPlay(UINT wDevID, DWORD dwFlags, LPMCI_PLAY_PARMS lpParms)
 	lp16WaveHdr = (LPWAVEHDR) USER_HEAP_SEG_ADDR(hWaveHdr);
 	memcpy(PTR_SEG_TO_LIN(lp16WaveHdr), lpWaveHdr, sizeof(WAVEHDR));
 	lpWaveHdr = PTR_SEG_TO_LIN(lp16WaveHdr);
-	dwRet = wodMessage(0, WODM_PREPARE, 0, (DWORD)lp16WaveHdr, sizeof(WAVEHDR));
+	dwRet = wodMessage(wDevID, WODM_PREPARE, 0, (DWORD)lp16WaveHdr, sizeof(WAVEHDR));
 	while(TRUE) {
-		count = mmioRead(MCIWavDev[wDevID].hFile, 
+		count = mmioRead(MCIWavDev[index].hFile, 
 			PTR_SEG_TO_LIN(lpWaveHdr->lpData), bufsize);
 		dprintf_mciwave(stddeb,"WAVE_mciPlay // mmioRead bufsize=%ld count=%ld\n", bufsize, count);
 		if (count < 1) break;
@@ -306,9 +310,9 @@ static DWORD WAVE_mciPlay(UINT wDevID, DWORD dwFlags, LPMCI_PLAY_PARMS lpParms)
 /*		lpWaveHdr->dwBytesRecorded = count; */
 		dprintf_mciwave(stddeb,"WAVE_mciPlay // before WODM_WRITE lpWaveHdr=%p dwBufferLength=%lu dwBytesRecorded=%lu\n",
 				lpWaveHdr, lpWaveHdr->dwBufferLength, lpWaveHdr->dwBytesRecorded);
-		dwRet = wodMessage(0, WODM_WRITE, 0, (DWORD)lp16WaveHdr, sizeof(WAVEHDR));
+		dwRet = wodMessage(wDevID, WODM_WRITE, 0, (DWORD)lp16WaveHdr, sizeof(WAVEHDR));
 		}
-	dwRet = wodMessage(0, WODM_UNPREPARE, 0, (DWORD)lp16WaveHdr, sizeof(WAVEHDR));
+	dwRet = wodMessage(wDevID, WODM_UNPREPARE, 0, (DWORD)lp16WaveHdr, sizeof(WAVEHDR));
 	if (lpWaveHdr->lpData != NULL) {
 		GlobalUnlock16(hData);
 		GlobalFree16(hData);
@@ -318,7 +322,7 @@ static DWORD WAVE_mciPlay(UINT wDevID, DWORD dwFlags, LPMCI_PLAY_PARMS lpParms)
 	if (dwFlags & MCI_NOTIFY) {
 		dprintf_mciwave(stddeb,"WAVE_mciPlay // MCI_NOTIFY_SUCCESSFUL %08lX !\n", lpParms->dwCallback);
 		mciDriverNotify((HWND16)LOWORD(lpParms->dwCallback), 
-			MCIWavDev[wDevID].wNotifyDeviceID, MCI_NOTIFY_SUCCESSFUL);
+			MCIWavDev[index].wNotifyDeviceID, MCI_NOTIFY_SUCCESSFUL);
 		}
 	return 0;
 }
@@ -327,8 +331,9 @@ static DWORD WAVE_mciPlay(UINT wDevID, DWORD dwFlags, LPMCI_PLAY_PARMS lpParms)
 /**************************************************************************
 * 				WAVE_mciRecord			[internal]
 */
-static DWORD WAVE_mciRecord(UINT wDevID, DWORD dwFlags, LPMCI_RECORD_PARMS lpParms)
+static DWORD WAVE_mciRecord(UINT16 wDevID, DWORD dwFlags, LPMCI_RECORD_PARMS lpParms)
 {
+	int index = MMSYSTEM_DevIDToIndex(wDevID);
 	int				start, end;
 	LONG			bufsize;
 	HGLOBAL16		hData;
@@ -339,9 +344,9 @@ static DWORD WAVE_mciRecord(UINT wDevID, DWORD dwFlags, LPMCI_RECORD_PARMS lpPar
 
 	dprintf_mciwave(stddeb,
 		"WAVE_mciRecord(%u, %08lX, %p);\n", wDevID, dwFlags, lpParms);
-	if (MCIWavDev[wDevID].hFile == 0) {
-		dprintf_mciwave(stddeb,"WAVE_mciRecord // can't find file='%s' !\n", 
-				MCIWavDev[wDevID].openParms.lpstrElementName);
+	if (MCIWavDev[index].hFile == 0) {
+		dprintf_mciwave(stddeb,"WAVE_mciRecord // can't find file='%08lx' !\n", 
+				MCIWavDev[index].openParms.lpstrElementName);
 		return MCIERR_FILE_NOT_FOUND;
 		}
 	start = 1; 		end = 99999;
@@ -355,7 +360,7 @@ static DWORD WAVE_mciRecord(UINT wDevID, DWORD dwFlags, LPMCI_RECORD_PARMS lpPar
 		dprintf_mciwave(stddeb,"WAVE_mciRecord // MCI_TO=%d \n", end);
 		}
 	bufsize = 64000;
-	lpWaveHdr = &MCIWavDev[wDevID].WaveHdr;
+	lpWaveHdr = &MCIWavDev[index].WaveHdr;
 	hData = GlobalAlloc16(GMEM_MOVEABLE, bufsize);
 	lpWaveHdr->lpData = (LPSTR) WIN16_GlobalLock16(hData);
 	lpWaveHdr->dwBufferLength = bufsize;
@@ -366,18 +371,18 @@ static DWORD WAVE_mciRecord(UINT wDevID, DWORD dwFlags, LPMCI_RECORD_PARMS lpPar
 	lp16WaveHdr = (LPWAVEHDR) USER_HEAP_SEG_ADDR(hWaveHdr);
 	memcpy(PTR_SEG_TO_LIN(lp16WaveHdr), lpWaveHdr, sizeof(WAVEHDR));
 	lpWaveHdr = PTR_SEG_TO_LIN(lp16WaveHdr);
-	dwRet = widMessage(0, WIDM_PREPARE, 0, (DWORD)lp16WaveHdr, sizeof(WAVEHDR));
+	dwRet = widMessage(wDevID, WIDM_PREPARE, 0, (DWORD)lp16WaveHdr, sizeof(WAVEHDR));
     dprintf_mciwave(stddeb,"WAVE_mciRecord // after WIDM_PREPARE \n");
 	while(TRUE) {
 		lpWaveHdr->dwBytesRecorded = 0;
-		dwRet = widMessage(0, WIDM_START, 0, 0L, 0L);
+		dwRet = widMessage(wDevID, WIDM_START, 0, 0L, 0L);
 		dprintf_mciwave(stddeb,
                     "WAVE_mciRecord // after WIDM_START lpWaveHdr=%p dwBytesRecorded=%lu\n",
 					lpWaveHdr, lpWaveHdr->dwBytesRecorded);
 		if (lpWaveHdr->dwBytesRecorded == 0) break;
 		}
 	dprintf_mciwave(stddeb,"WAVE_mciRecord // before WIDM_UNPREPARE \n");
-	dwRet = widMessage(0, WIDM_UNPREPARE, 0, (DWORD)lp16WaveHdr, sizeof(WAVEHDR));
+	dwRet = widMessage(wDevID, WIDM_UNPREPARE, 0, (DWORD)lp16WaveHdr, sizeof(WAVEHDR));
 	dprintf_mciwave(stddeb,"WAVE_mciRecord // after WIDM_UNPREPARE \n");
 	if (lpWaveHdr->lpData != NULL) {
 		GlobalUnlock16(hData);
@@ -388,7 +393,7 @@ static DWORD WAVE_mciRecord(UINT wDevID, DWORD dwFlags, LPMCI_RECORD_PARMS lpPar
 	if (dwFlags & MCI_NOTIFY) {
 	  dprintf_mciwave(stddeb,"WAVE_mciRecord // MCI_NOTIFY_SUCCESSFUL %08lX !\n", lpParms->dwCallback);
 		mciDriverNotify((HWND16)LOWORD(lpParms->dwCallback), 
-			MCIWavDev[wDevID].wNotifyDeviceID, MCI_NOTIFY_SUCCESSFUL);
+			MCIWavDev[index].wNotifyDeviceID, MCI_NOTIFY_SUCCESSFUL);
 		}
 	return 0;
 }
@@ -397,7 +402,7 @@ static DWORD WAVE_mciRecord(UINT wDevID, DWORD dwFlags, LPMCI_RECORD_PARMS lpPar
 /**************************************************************************
 * 				WAVE_mciStop			[internal]
 */
-static DWORD WAVE_mciStop(UINT wDevID, DWORD dwFlags, LPMCI_GENERIC_PARMS lpParms)
+static DWORD WAVE_mciStop(UINT16 wDevID, DWORD dwFlags, LPMCI_GENERIC_PARMS lpParms)
 {
 	dprintf_mciwave(stddeb,
 		"WAVE_mciStop(%u, %08lX, %p);\n", wDevID, dwFlags, lpParms);
@@ -409,7 +414,7 @@ static DWORD WAVE_mciStop(UINT wDevID, DWORD dwFlags, LPMCI_GENERIC_PARMS lpParm
 /**************************************************************************
 * 				WAVE_mciPause			[internal]
 */
-static DWORD WAVE_mciPause(UINT wDevID, DWORD dwFlags, LPMCI_GENERIC_PARMS lpParms)
+static DWORD WAVE_mciPause(UINT16 wDevID, DWORD dwFlags, LPMCI_GENERIC_PARMS lpParms)
 {
 	dprintf_mciwave(stddeb,
 		"WAVE_mciPause(%u, %08lX, %p);\n", wDevID, dwFlags, lpParms);
@@ -421,7 +426,7 @@ static DWORD WAVE_mciPause(UINT wDevID, DWORD dwFlags, LPMCI_GENERIC_PARMS lpPar
 /**************************************************************************
 * 				WAVE_mciResume			[internal]
 */
-static DWORD WAVE_mciResume(UINT wDevID, DWORD dwFlags, LPMCI_GENERIC_PARMS lpParms)
+static DWORD WAVE_mciResume(UINT16 wDevID, DWORD dwFlags, LPMCI_GENERIC_PARMS lpParms)
 {
 	dprintf_mciwave(stddeb,
 		"WAVE_mciResume(%u, %08lX, %p);\n", wDevID, dwFlags, lpParms);
@@ -433,7 +438,7 @@ static DWORD WAVE_mciResume(UINT wDevID, DWORD dwFlags, LPMCI_GENERIC_PARMS lpPa
 /**************************************************************************
 * 				WAVE_mciSet			[internal]
 */
-static DWORD WAVE_mciSet(UINT wDevID, DWORD dwFlags, LPMCI_SET_PARMS lpParms)
+static DWORD WAVE_mciSet(UINT16 wDevID, DWORD dwFlags, LPMCI_SET_PARMS lpParms)
 {
 	dprintf_mciwave(stddeb,
 		"WAVE_mciSet(%u, %08lX, %p);\n", wDevID, dwFlags, lpParms);
@@ -502,8 +507,9 @@ static DWORD WAVE_mciSet(UINT wDevID, DWORD dwFlags, LPMCI_SET_PARMS lpParms)
 /**************************************************************************
 * 				WAVE_mciStatus		[internal]
 */
-static DWORD WAVE_mciStatus(UINT wDevID, DWORD dwFlags, LPMCI_STATUS_PARMS lpParms)
+static DWORD WAVE_mciStatus(UINT16 wDevID, DWORD dwFlags, LPMCI_STATUS_PARMS lpParms)
 {
+	int index = MMSYSTEM_DevIDToIndex(wDevID);
 	dprintf_mciwave(stddeb,
 		"WAVE_mciStatus(%u, %08lX, %p);\n", wDevID, dwFlags, lpParms);
 	if (lpParms == NULL) return MCIERR_INTERNAL;
@@ -591,7 +597,7 @@ static DWORD WAVE_mciStatus(UINT wDevID, DWORD dwFlags, LPMCI_STATUS_PARMS lpPar
 	if (dwFlags & MCI_NOTIFY) {
 		dprintf_mciwave(stddeb,"WAVE_mciStatus // MCI_NOTIFY_SUCCESSFUL %08lX !\n", lpParms->dwCallback);
 		mciDriverNotify((HWND16)LOWORD(lpParms->dwCallback), 
-			MCIWavDev[wDevID].wNotifyDeviceID, MCI_NOTIFY_SUCCESSFUL);
+			MCIWavDev[index].wNotifyDeviceID, MCI_NOTIFY_SUCCESSFUL);
 		}
  	return 0;
 }
@@ -599,7 +605,7 @@ static DWORD WAVE_mciStatus(UINT wDevID, DWORD dwFlags, LPMCI_STATUS_PARMS lpPar
 /**************************************************************************
 * 				WAVE_mciGetDevCaps		[internal]
 */
-static DWORD WAVE_mciGetDevCaps(UINT wDevID, DWORD dwFlags, 
+static DWORD WAVE_mciGetDevCaps(UINT16 wDevID, DWORD dwFlags, 
 					LPMCI_GETDEVCAPS_PARMS lpParms)
 {
 	dprintf_mciwave(stddeb,
@@ -650,8 +656,9 @@ static DWORD WAVE_mciGetDevCaps(UINT wDevID, DWORD dwFlags,
 /**************************************************************************
 * 				WAVE_mciInfo			[internal]
 */
-static DWORD WAVE_mciInfo(UINT wDevID, DWORD dwFlags, LPMCI_INFO_PARMS lpParms)
+static DWORD WAVE_mciInfo(UINT16 wDevID, DWORD dwFlags, LPMCI_INFO_PARMS lpParms)
 {
+	int index = MMSYSTEM_DevIDToIndex(wDevID);
 	dprintf_mciwave(stddeb,
 		"WAVE_mciInfo(%u, %08lX, %p);\n", wDevID, dwFlags, lpParms);
 	if (lpParms == NULL) return MCIERR_INTERNAL;
@@ -662,7 +669,7 @@ static DWORD WAVE_mciInfo(UINT wDevID, DWORD dwFlags, LPMCI_INFO_PARMS lpParms)
 			break;
 		case MCI_INFO_FILE:
 			lpParms->lpstrReturn = 
-				(LPSTR)MCIWavDev[wDevID].openParms.lpstrElementName;
+				(LPSTR)MCIWavDev[index].openParms.lpstrElementName;
 			break;
 		case MCI_WAVE_INPUT:
 			lpParms->lpstrReturn = "Linux Sound System 0.5";
@@ -752,6 +759,7 @@ static DWORD wodGetDevCaps(WORD wDevID, LPWAVEOUTCAPS lpCaps, DWORD dwSize)
 */
 static DWORD wodOpen(WORD wDevID, LPWAVEOPENDESC lpDesc, DWORD dwFlags)
 {
+	int index = MMSYSTEM_DevIDToIndex(wDevID);
 	int 		audio;
 	int			abuf_size;
 	int			smplrate;
@@ -769,7 +777,7 @@ static DWORD wodOpen(WORD wDevID, LPWAVEOPENDESC lpDesc, DWORD dwFlags)
 		dprintf_mciwave(stddeb,"Linux 'wodOpen' // MAX_WAVOUTDRV reached !\n");
 		return MMSYSERR_ALLOCATED;
 		}
-	WOutDev[wDevID].unixdev = 0;
+	WOutDev[index].unixdev = 0;
 	audio = open (SOUND_DEV, O_WRONLY, 0);
 	if (audio == -1) {
 		dprintf_mciwave(stddeb,"Linux 'wodOpen' // can't open !\n");
@@ -783,8 +791,8 @@ static DWORD wodOpen(WORD wDevID, LPWAVEOPENDESC lpDesc, DWORD dwFlags)
 			dprintf_mciwave(stddeb,"Linux 'wodOpen' // SNDCTL_DSP_GETBLKSIZE Invalid bufsize !\n");
 		return MMSYSERR_NOTENABLED;
 		}
-	WOutDev[wDevID].wFlags = HIWORD(dwFlags & CALLBACK_TYPEMASK);
-	switch(WOutDev[wDevID].wFlags) {
+	WOutDev[index].wFlags = HIWORD(dwFlags & CALLBACK_TYPEMASK);
+	switch(WOutDev[index].wFlags) {
 		case DCB_NULL:
 			dprintf_mciwave(stddeb,	"Linux 'wodOpen' // CALLBACK_NULL !\n");
 			break;
@@ -798,11 +806,11 @@ static DWORD wodOpen(WORD wDevID, LPWAVEOPENDESC lpDesc, DWORD dwFlags)
 			dprintf_mciwave(stddeb,	"Linux 'wodOpen' // CALLBACK_FUNCTION !\n");
 			break;
 		}
-	WOutDev[wDevID].lpQueueHdr = NULL;
-	WOutDev[wDevID].unixdev = audio;
-	WOutDev[wDevID].dwTotalPlayed = 0;
-	WOutDev[wDevID].bufsize = abuf_size;
-	memcpy(&WOutDev[wDevID].waveDesc, lpDesc, sizeof(WAVEOPENDESC));
+	WOutDev[index].lpQueueHdr = NULL;
+	WOutDev[index].unixdev = audio;
+	WOutDev[index].dwTotalPlayed = 0;
+	WOutDev[index].bufsize = abuf_size;
+	memcpy(&WOutDev[index].waveDesc, lpDesc, sizeof(WAVEOPENDESC));
 /*	lpFormat = (LPWAVEFORMAT) PTR_SEG_TO_LIN(lpDesc->lpFormat); */
 	lpFormat = lpDesc->lpFormat;
 	if (lpFormat->wFormatTag != WAVE_FORMAT_PCM) {
@@ -814,31 +822,31 @@ static DWORD wodOpen(WORD wDevID, LPWAVEOPENDESC lpDesc, DWORD dwFlags)
 				lpFormat->nSamplesPerSec);
 		return WAVERR_BADFORMAT;
 		}
-	memcpy(&WOutDev[wDevID].Format, lpFormat, sizeof(PCMWAVEFORMAT));
-	if (WOutDev[wDevID].Format.wf.nChannels == 0) return WAVERR_BADFORMAT;
-	if (WOutDev[wDevID].Format.wf.nSamplesPerSec == 0) return WAVERR_BADFORMAT;
+	memcpy(&WOutDev[index].Format, lpFormat, sizeof(PCMWAVEFORMAT));
+	if (WOutDev[index].Format.wf.nChannels == 0) return WAVERR_BADFORMAT;
+	if (WOutDev[index].Format.wf.nSamplesPerSec == 0) return WAVERR_BADFORMAT;
 	dprintf_mciwave(stddeb,"Linux 'wodOpen' // wBitsPerSample=%u !\n",
-				WOutDev[wDevID].Format.wBitsPerSample);
-	if (WOutDev[wDevID].Format.wBitsPerSample == 0) {
-		WOutDev[wDevID].Format.wBitsPerSample = 8 *
-		(WOutDev[wDevID].Format.wf.nAvgBytesPerSec /
-		WOutDev[wDevID].Format.wf.nSamplesPerSec) /
-		WOutDev[wDevID].Format.wf.nChannels;
-		}
-	samplesize = WOutDev[wDevID].Format.wBitsPerSample;
-	smplrate = WOutDev[wDevID].Format.wf.nSamplesPerSec;
-	dsp_stereo = (WOutDev[wDevID].Format.wf.nChannels > 1) ? TRUE : FALSE;
+				WOutDev[index].Format.wBitsPerSample);
+	if (WOutDev[index].Format.wBitsPerSample == 0) {
+		WOutDev[index].Format.wBitsPerSample = 8 *
+		(WOutDev[index].Format.wf.nAvgBytesPerSec /
+		WOutDev[index].Format.wf.nSamplesPerSec) /
+		WOutDev[index].Format.wf.nChannels;
+		}
+	samplesize = WOutDev[index].Format.wBitsPerSample;
+	smplrate = WOutDev[index].Format.wf.nSamplesPerSec;
+	dsp_stereo = (WOutDev[index].Format.wf.nChannels > 1) ? TRUE : FALSE;
 	IOCTL(audio, SNDCTL_DSP_SPEED, smplrate);
 	IOCTL(audio, SNDCTL_DSP_SAMPLESIZE, samplesize);
 	IOCTL(audio, SNDCTL_DSP_STEREO, dsp_stereo);
 	dprintf_mciwave(stddeb,"Linux 'wodOpen' // wBitsPerSample=%u !\n",
-				WOutDev[wDevID].Format.wBitsPerSample);
+				WOutDev[index].Format.wBitsPerSample);
 	dprintf_mciwave(stddeb,"Linux 'wodOpen' // nAvgBytesPerSec=%lu !\n",
-				WOutDev[wDevID].Format.wf.nAvgBytesPerSec);
+				WOutDev[index].Format.wf.nAvgBytesPerSec);
 	dprintf_mciwave(stddeb,"Linux 'wodOpen' // nSamplesPerSec=%lu !\n",
-				WOutDev[wDevID].Format.wf.nSamplesPerSec);
+				WOutDev[index].Format.wf.nSamplesPerSec);
 	dprintf_mciwave(stddeb,"Linux 'wodOpen' // nChannels=%u !\n",
-				WOutDev[wDevID].Format.wf.nChannels);
+				WOutDev[index].Format.wf.nChannels);
 	if (WAVE_NotifyClient(wDevID, WOM_OPEN, 0L, 0L) != MMSYSERR_NOERROR) {
 		dprintf_mciwave(stddeb,"Linux 'wodOpen' // can't notify client !\n");
 		return MMSYSERR_INVALPARAM;
@@ -851,15 +859,16 @@ static DWORD wodOpen(WORD wDevID, LPWAVEOPENDESC lpDesc, DWORD dwFlags)
 */
 static DWORD wodClose(WORD wDevID)
 {
+	int index = MMSYSTEM_DevIDToIndex(wDevID);
 	dprintf_mciwave(stddeb,"wodClose(%u);\n", wDevID);
-	if (WOutDev[wDevID].unixdev == 0) {
+	if (WOutDev[index].unixdev == 0) {
 		dprintf_mciwave(stddeb,"Linux 'wodClose' // can't close !\n");
 		return MMSYSERR_NOTENABLED;
 		}
-	close(WOutDev[wDevID].unixdev);
-	WOutDev[wDevID].unixdev = 0;
-	WOutDev[wDevID].bufsize = 0;
-	WOutDev[wDevID].lpQueueHdr = NULL;
+	close(WOutDev[index].unixdev);
+	WOutDev[index].unixdev = 0;
+	WOutDev[index].bufsize = 0;
+	WOutDev[index].lpQueueHdr = NULL;
 	if (WAVE_NotifyClient(wDevID, WOM_CLOSE, 0L, 0L) != MMSYSERR_NOERROR) {
 		dprintf_mciwave(stddeb,"Linux 'wodClose' // can't notify client !\n");
 		return MMSYSERR_INVALPARAM;
@@ -872,10 +881,11 @@ static DWORD wodClose(WORD wDevID)
 */
 static DWORD wodWrite(WORD wDevID, LPWAVEHDR lpWaveHdr, DWORD dwSize)
 {
+	int index = MMSYSTEM_DevIDToIndex(wDevID);
 	int		count;
 	LPSTR	lpData;
 	dprintf_mciwave(stddeb,"wodWrite(%u, %p, %08lX);\n", wDevID, lpWaveHdr, dwSize);
-	if (WOutDev[wDevID].unixdev == 0) {
+	if (WOutDev[index].unixdev == 0) {
         dprintf_mciwave(stddeb,"Linux 'wodWrite' // can't play !\n");
 		return MMSYSERR_NOTENABLED;
 		}
@@ -887,16 +897,16 @@ static DWORD wodWrite(WORD wDevID, LPWAVEHDR lpWaveHdr, DWORD dwSize)
 	dprintf_mciwave(stddeb,
 		"wodWrite() // dwBufferLength %lu !\n", lpWaveHdr->dwBufferLength);
 	dprintf_mciwave(stddeb,
-		"wodWrite() // WOutDev[%u].unixdev %u !\n", wDevID, WOutDev[wDevID].unixdev);
+		"wodWrite() // WOutDev[%u].unixdev %u !\n", wDevID, WOutDev[index].unixdev);
 	lpData = PTR_SEG_TO_LIN(lpWaveHdr->lpData);
-	count = write (WOutDev[wDevID].unixdev, lpData, lpWaveHdr->dwBufferLength);
+	count = write (WOutDev[index].unixdev, lpData, lpWaveHdr->dwBufferLength);
 	dprintf_mciwave(stddeb,
 		"wodWrite() // write returned count %u !\n", count);
 	if (count != lpWaveHdr->dwBufferLength) {
 		dprintf_mciwave(stddeb,"Linux 'wodWrite' // error writting !\n");
 		return MMSYSERR_NOTENABLED;
 		}
-	WOutDev[wDevID].dwTotalPlayed += count;
+	WOutDev[index].dwTotalPlayed += count;
 	lpWaveHdr->dwFlags &= ~WHDR_INQUEUE;
 	lpWaveHdr->dwFlags |= WHDR_DONE;
 	if (WAVE_NotifyClient(wDevID, WOM_DONE, 0L, 0L) != MMSYSERR_NOERROR) {
@@ -911,21 +921,22 @@ static DWORD wodWrite(WORD wDevID, LPWAVEHDR lpWaveHdr, DWORD dwSize)
 */
 static DWORD wodPrepare(WORD wDevID, LPWAVEHDR lpWaveHdr, DWORD dwSize)
 {
+	int index = MMSYSTEM_DevIDToIndex(wDevID);
 	dprintf_mciwave(stddeb,
 		"wodPrepare(%u, %p, %08lX);\n", wDevID, lpWaveHdr, dwSize);
-	if (WOutDev[wDevID].unixdev == 0) {
+	if (WOutDev[index].unixdev == 0) {
 		dprintf_mciwave(stddeb,"Linux 'wodPrepare' // can't prepare !\n");
 		return MMSYSERR_NOTENABLED;
 		}
 	/* the COOL waveeditor feels much better without this check... 
 	 * someone please have a look at available documentation
-	if (WOutDev[wDevID].lpQueueHdr != NULL) {
+	if (WOutDev[index].lpQueueHdr != NULL) {
 		dprintf_mciwave(stddeb,"Linux 'wodPrepare' // already prepare !\n");
 		return MMSYSERR_NOTENABLED;
 	}
 	*/
-	WOutDev[wDevID].dwTotalPlayed = 0;
-	WOutDev[wDevID].lpQueueHdr = lpWaveHdr;
+	WOutDev[index].dwTotalPlayed = 0;
+	WOutDev[index].lpQueueHdr = lpWaveHdr;
 	if (lpWaveHdr->dwFlags & WHDR_INQUEUE) return WAVERR_STILLPLAYING;
 	lpWaveHdr->dwFlags |= WHDR_PREPARED;
 	lpWaveHdr->dwFlags &= ~WHDR_DONE;
@@ -937,9 +948,10 @@ static DWORD wodPrepare(WORD wDevID, LPWAVEHDR lpWaveHdr, DWORD dwSize)
 */
 static DWORD wodUnprepare(WORD wDevID, LPWAVEHDR lpWaveHdr, DWORD dwSize)
 {
+	int index = MMSYSTEM_DevIDToIndex(wDevID);
 	dprintf_mciwave(stddeb,
 		"wodUnprepare(%u, %p, %08lX);\n", wDevID, lpWaveHdr, dwSize);
-	if (WOutDev[wDevID].unixdev == 0) {
+	if (WOutDev[index].unixdev == 0) {
 		dprintf_mciwave(stddeb,"Linux 'wodUnprepare' // can't unprepare !\n");
 		return MMSYSERR_NOTENABLED;
 		}
@@ -951,8 +963,9 @@ static DWORD wodUnprepare(WORD wDevID, LPWAVEHDR lpWaveHdr, DWORD dwSize)
 */
 static DWORD wodRestart(WORD wDevID)
 {
+	int index = MMSYSTEM_DevIDToIndex(wDevID);
 	dprintf_mciwave(stddeb,"wodRestart(%u);\n", wDevID);
-	if (WOutDev[wDevID].unixdev == 0) {
+	if (WOutDev[index].unixdev == 0) {
 		dprintf_mciwave(stddeb,"Linux 'wodRestart' // can't restart !\n");
 		return MMSYSERR_NOTENABLED;
 		}
@@ -964,8 +977,9 @@ static DWORD wodRestart(WORD wDevID)
 */
 static DWORD wodReset(WORD wDevID)
 {
-    dprintf_mciwave(stddeb,"wodReset(%u);\n", wDevID);
-	if (WOutDev[wDevID].unixdev == 0) {
+	int index = MMSYSTEM_DevIDToIndex(wDevID);
+	dprintf_mciwave(stddeb,"wodReset(%u);\n", wDevID);
+	if (WOutDev[index].unixdev == 0) {
 		dprintf_mciwave(stddeb,"Linux 'wodReset' // can't reset !\n");
 		return MMSYSERR_NOTENABLED;
 		}
@@ -978,30 +992,31 @@ static DWORD wodReset(WORD wDevID)
 */
 static DWORD wodGetPosition(WORD wDevID, LPMMTIME lpTime, DWORD uSize)
 {
+	int index = MMSYSTEM_DevIDToIndex(wDevID);
 	int		time;
 	dprintf_mciwave(stddeb,"wodGetPosition(%u, %p, %lu);\n", wDevID, lpTime, uSize);
-	if (WOutDev[wDevID].unixdev == 0) {
+	if (WOutDev[index].unixdev == 0) {
 		dprintf_mciwave(stddeb,"Linux 'wodGetPosition' // can't get pos !\n");
 		return MMSYSERR_NOTENABLED;
 		}
 	if (lpTime == NULL)	return MMSYSERR_INVALPARAM;
 	switch(lpTime->wType) {
 		case TIME_BYTES:
-			lpTime->u.cb = WOutDev[wDevID].dwTotalPlayed;
+			lpTime->u.cb = WOutDev[index].dwTotalPlayed;
 			dprintf_mciwave(stddeb,"wodGetPosition // TIME_BYTES=%lu\n", lpTime->u.cb);
 			break;
 		case TIME_SAMPLES:
 			dprintf_mciwave(stddeb,"wodGetPosition // dwTotalPlayed=%lu\n", 
-					WOutDev[wDevID].dwTotalPlayed);
+					WOutDev[index].dwTotalPlayed);
 			dprintf_mciwave(stddeb,"wodGetPosition // wBitsPerSample=%u\n", 
-					WOutDev[wDevID].Format.wBitsPerSample);
-			lpTime->u.sample = WOutDev[wDevID].dwTotalPlayed * 8 /
-						WOutDev[wDevID].Format.wBitsPerSample;
+					WOutDev[index].Format.wBitsPerSample);
+			lpTime->u.sample = WOutDev[index].dwTotalPlayed * 8 /
+						WOutDev[index].Format.wBitsPerSample;
 			dprintf_mciwave(stddeb,"wodGetPosition // TIME_SAMPLES=%lu\n", lpTime->u.sample);
 			break;
 		case TIME_SMPTE:
-			time = WOutDev[wDevID].dwTotalPlayed /
-				(WOutDev[wDevID].Format.wf.nAvgBytesPerSec / 1000);
+			time = WOutDev[index].dwTotalPlayed /
+				(WOutDev[index].Format.wf.nAvgBytesPerSec / 1000);
 			lpTime->u.smpte.hour = time / 108000;
 			time -= lpTime->u.smpte.hour * 108000;
 			lpTime->u.smpte.min = time / 1800;
@@ -1019,8 +1034,8 @@ static DWORD wodGetPosition(WORD wDevID, LPMMTIME lpTime, DWORD uSize)
 			dprintf_mciwave(stddeb,"wodGetPosition() format not supported ! use TIME_MS !\n");
 			lpTime->wType = TIME_MS;
 		case TIME_MS:
-			lpTime->u.ms = WOutDev[wDevID].dwTotalPlayed /
-					(WOutDev[wDevID].Format.wf.nAvgBytesPerSec / 1000);
+			lpTime->u.ms = WOutDev[index].dwTotalPlayed /
+					(WOutDev[index].Format.wf.nAvgBytesPerSec / 1000);
 			dprintf_mciwave(stddeb,"wodGetPosition // TIME_MS=%lu\n", lpTime->u.ms);
 			break;
 		}
@@ -1203,6 +1218,7 @@ static DWORD widGetDevCaps(WORD wDevID, LPWAVEINCAPS lpCaps, DWORD dwSize)
 */
 static DWORD widOpen(WORD wDevID, LPWAVEOPENDESC lpDesc, DWORD dwFlags)
 {
+	int index = MMSYSTEM_DevIDToIndex(wDevID);
 	int 		audio;
 	int			abuf_size;
 	int			smplrate;
@@ -1218,7 +1234,7 @@ static DWORD widOpen(WORD wDevID, LPWAVEOPENDESC lpDesc, DWORD dwFlags)
 		dprintf_mciwave(stddeb,"Linux 'widOpen' // MAX_WAVINDRV reached !\n");
 		return MMSYSERR_ALLOCATED;
 		}
-	WInDev[wDevID].unixdev = 0;
+	WInDev[index].unixdev = 0;
 	audio = open (SOUND_DEV, O_RDONLY, 0);
 	if (audio == -1) {
 		dprintf_mciwave(stddeb,"Linux 'widOpen' // can't open !\n");
@@ -1232,8 +1248,8 @@ static DWORD widOpen(WORD wDevID, LPWAVEOPENDESC lpDesc, DWORD dwFlags)
 			dprintf_mciwave(stddeb,"Linux 'widOpen' // SNDCTL_DSP_GETBLKSIZE Invalid bufsize !\n");
 		return MMSYSERR_NOTENABLED;
 		}
-	WInDev[wDevID].wFlags = HIWORD(dwFlags & CALLBACK_TYPEMASK);
-	switch(WInDev[wDevID].wFlags) {
+	WInDev[index].wFlags = HIWORD(dwFlags & CALLBACK_TYPEMASK);
+	switch(WInDev[index].wFlags) {
 		case DCB_NULL:
 			dprintf_mciwave(stddeb,	"Linux 'widOpen' // CALLBACK_NULL !\n");
 			break;
@@ -1247,41 +1263,41 @@ static DWORD widOpen(WORD wDevID, LPWAVEOPENDESC lpDesc, DWORD dwFlags)
 			dprintf_mciwave(stddeb,	"Linux 'widOpen' // CALLBACK_FUNCTION !\n");
 			break;
 		}
-	WInDev[wDevID].lpQueueHdr = NULL;
-	WInDev[wDevID].unixdev = audio;
-	WInDev[wDevID].bufsize = abuf_size;
-	WInDev[wDevID].dwTotalRecorded = 0;
-	memcpy(&WInDev[wDevID].waveDesc, lpDesc, sizeof(WAVEOPENDESC));
+	WInDev[index].lpQueueHdr = NULL;
+	WInDev[index].unixdev = audio;
+	WInDev[index].bufsize = abuf_size;
+	WInDev[index].dwTotalRecorded = 0;
+	memcpy(&WInDev[index].waveDesc, lpDesc, sizeof(WAVEOPENDESC));
         lpFormat = lpDesc->lpFormat;
 	if (lpFormat->wFormatTag != WAVE_FORMAT_PCM) {
 		dprintf_mciwave(stddeb,"Linux 'widOpen' // Bad format %04X !\n",
 					lpFormat->wFormatTag);
 		return WAVERR_BADFORMAT;
 		}
-	memcpy(&WInDev[wDevID].Format, lpFormat, sizeof(PCMWAVEFORMAT));
-	WInDev[wDevID].Format.wBitsPerSample = 8; /* <-------------- */
-	if (WInDev[wDevID].Format.wf.nChannels == 0) return WAVERR_BADFORMAT;
-	if (WInDev[wDevID].Format.wf.nSamplesPerSec == 0) return WAVERR_BADFORMAT;
-	if (WInDev[wDevID].Format.wBitsPerSample == 0) {
-		WInDev[wDevID].Format.wBitsPerSample = 8 *
-		(WInDev[wDevID].Format.wf.nAvgBytesPerSec /
-		WInDev[wDevID].Format.wf.nSamplesPerSec) /
-		WInDev[wDevID].Format.wf.nChannels;
-		}
-	samplesize = WInDev[wDevID].Format.wBitsPerSample;
-	smplrate = WInDev[wDevID].Format.wf.nSamplesPerSec;
-	dsp_stereo = (WInDev[wDevID].Format.wf.nChannels > 1) ? TRUE : FALSE;
+	memcpy(&WInDev[index].Format, lpFormat, sizeof(PCMWAVEFORMAT));
+	WInDev[index].Format.wBitsPerSample = 8; /* <-------------- */
+	if (WInDev[index].Format.wf.nChannels == 0) return WAVERR_BADFORMAT;
+	if (WInDev[index].Format.wf.nSamplesPerSec == 0) return WAVERR_BADFORMAT;
+	if (WInDev[index].Format.wBitsPerSample == 0) {
+		WInDev[index].Format.wBitsPerSample = 8 *
+		(WInDev[index].Format.wf.nAvgBytesPerSec /
+		WInDev[index].Format.wf.nSamplesPerSec) /
+		WInDev[index].Format.wf.nChannels;
+		}
+	samplesize = WInDev[index].Format.wBitsPerSample;
+	smplrate = WInDev[index].Format.wf.nSamplesPerSec;
+	dsp_stereo = (WInDev[index].Format.wf.nChannels > 1) ? TRUE : FALSE;
 	IOCTL(audio, SNDCTL_DSP_SPEED, smplrate);
 	IOCTL(audio, SNDCTL_DSP_SAMPLESIZE, samplesize);
 	IOCTL(audio, SNDCTL_DSP_STEREO, dsp_stereo);
 	dprintf_mciwave(stddeb,"Linux 'widOpen' // wBitsPerSample=%u !\n",
-				WInDev[wDevID].Format.wBitsPerSample);
+				WInDev[index].Format.wBitsPerSample);
 	dprintf_mciwave(stddeb,"Linux 'widOpen' // nSamplesPerSec=%lu !\n",
-				WInDev[wDevID].Format.wf.nSamplesPerSec);
+				WInDev[index].Format.wf.nSamplesPerSec);
 	dprintf_mciwave(stddeb,"Linux 'widOpen' // nChannels=%u !\n",
-				WInDev[wDevID].Format.wf.nChannels);
+				WInDev[index].Format.wf.nChannels);
 	dprintf_mciwave(stddeb,"Linux 'widOpen' // nAvgBytesPerSec=%lu\n",
-			WInDev[wDevID].Format.wf.nAvgBytesPerSec); 
+			WInDev[index].Format.wf.nAvgBytesPerSec); 
 	if (WAVE_NotifyClient(wDevID, WIM_OPEN, 0L, 0L) != MMSYSERR_NOERROR) {
 		dprintf_mciwave(stddeb,"Linux 'widOpen' // can't notify client !\n");
 		return MMSYSERR_INVALPARAM;
@@ -1294,14 +1310,15 @@ static DWORD widOpen(WORD wDevID, LPWAVEOPENDESC lpDesc, DWORD dwFlags)
 */
 static DWORD widClose(WORD wDevID)
 {
+	int index = MMSYSTEM_DevIDToIndex(wDevID);
 	dprintf_mciwave(stddeb,"widClose(%u);\n", wDevID);
-	if (WInDev[wDevID].unixdev == 0) {
+	if (WInDev[index].unixdev == 0) {
 		dprintf_mciwave(stddeb,"Linux 'widClose' // can't close !\n");
 		return MMSYSERR_NOTENABLED;
 		}
-	close(WInDev[wDevID].unixdev);
-	WInDev[wDevID].unixdev = 0;
-	WInDev[wDevID].bufsize = 0;
+	close(WInDev[index].unixdev);
+	WInDev[index].unixdev = 0;
+	WInDev[index].bufsize = 0;
 	if (WAVE_NotifyClient(wDevID, WIM_CLOSE, 0L, 0L) != MMSYSERR_NOERROR) {
 		dprintf_mciwave(stddeb,"Linux 'widClose' // can't notify client !\n");
 		return MMSYSERR_INVALPARAM;
@@ -1314,11 +1331,12 @@ static DWORD widClose(WORD wDevID)
 */
 static DWORD widAddBuffer(WORD wDevID, LPWAVEHDR lpWaveHdr, DWORD dwSize)
 {
+	int index = MMSYSTEM_DevIDToIndex(wDevID);
 	int			count	= 1;
 	LPWAVEHDR 	lpWIHdr;
 	dprintf_mciwave(stddeb,
 		"widAddBuffer(%u, %p, %08lX);\n", wDevID, lpWaveHdr, dwSize);
-	if (WInDev[wDevID].unixdev == 0) {
+	if (WInDev[index].unixdev == 0) {
 		dprintf_mciwave(stddeb,"Linux 'widAddBuffer' // can't do it !\n");
 		return MMSYSERR_NOTENABLED;
 		}
@@ -1334,14 +1352,14 @@ static DWORD widAddBuffer(WORD wDevID, LPWAVEHDR lpWaveHdr, DWORD dwSize)
 	lpWaveHdr->dwFlags |= WHDR_INQUEUE;
 	lpWaveHdr->dwFlags &= ~WHDR_DONE;
 	lpWaveHdr->dwBytesRecorded = 0;
-	if (WInDev[wDevID].lpQueueHdr == NULL) {
+	if (WInDev[index].lpQueueHdr == NULL) {
 		/* begin the queue with a first header ... */
-		WInDev[wDevID].lpQueueHdr = lpWaveHdr;
-		WInDev[wDevID].dwTotalRecorded = 0;
+		WInDev[index].lpQueueHdr = lpWaveHdr;
+		WInDev[index].dwTotalRecorded = 0;
 		}
 	else {
 		/* added to the queue, except if it's the one just prepared ... */
-		lpWIHdr = WInDev[wDevID].lpQueueHdr;
+		lpWIHdr = WInDev[index].lpQueueHdr;
 		while (lpWIHdr->lpNext != NULL) {
 			lpWIHdr = lpWIHdr->lpNext;
 			count++;
@@ -1359,13 +1377,14 @@ static DWORD widAddBuffer(WORD wDevID, LPWAVEHDR lpWaveHdr, DWORD dwSize)
 */
 static DWORD widPrepare(WORD wDevID, LPWAVEHDR lpWaveHdr, DWORD dwSize)
 {
+	int index = MMSYSTEM_DevIDToIndex(wDevID);
 	dprintf_mciwave(stddeb,
 		"widPrepare(%u, %p, %08lX);\n", wDevID, lpWaveHdr, dwSize);
-	if (WInDev[wDevID].unixdev == 0) {
+	if (WInDev[index].unixdev == 0) {
 		dprintf_mciwave(stddeb,"Linux 'widPrepare' // can't prepare !\n");
 		return MMSYSERR_NOTENABLED;
 		}
-	if (WInDev[wDevID].lpQueueHdr != NULL) {
+	if (WInDev[index].lpQueueHdr != NULL) {
 		dprintf_mciwave(stddeb,"Linux 'widPrepare' // already prepare !\n");
 		return WAVERR_BADFORMAT;
 		}
@@ -1383,16 +1402,17 @@ static DWORD widPrepare(WORD wDevID, LPWAVEHDR lpWaveHdr, DWORD dwSize)
 */
 static DWORD widUnprepare(WORD wDevID, LPWAVEHDR lpWaveHdr, DWORD dwSize)
 {
+	int index = MMSYSTEM_DevIDToIndex(wDevID);
 	dprintf_mciwave(stddeb,
 		"widUnprepare(%u, %p, %08lX);\n", wDevID, lpWaveHdr, dwSize);
-	if (WInDev[wDevID].unixdev == 0) {
+	if (WInDev[index].unixdev == 0) {
 		dprintf_mciwave(stddeb,"Linux 'widUnprepare' // can't unprepare !\n");
 		return MMSYSERR_NOTENABLED;
 		}
 	lpWaveHdr->dwFlags &= ~WHDR_PREPARED;
 	lpWaveHdr->dwFlags &= ~WHDR_INQUEUE;
 	lpWaveHdr->dwFlags |= WHDR_DONE;
-	WInDev[wDevID].lpQueueHdr = NULL;
+	WInDev[index].lpQueueHdr = NULL;
 	dprintf_mciwave(stddeb,
 		"Linux 'widUnprepare' // all headers unprepared !\n");
 	return MMSYSERR_NOERROR;
@@ -1403,30 +1423,31 @@ static DWORD widUnprepare(WORD wDevID, LPWAVEHDR lpWaveHdr, DWORD dwSize)
 */
 static DWORD widStart(WORD wDevID)
 {
+	int index = MMSYSTEM_DevIDToIndex(wDevID);
 	int			count	= 1;
 	LPWAVEHDR 	lpWIHdr;
 	dprintf_mciwave(stddeb,"widStart(%u);\n", wDevID);
-	if (WInDev[wDevID].unixdev == 0) {
+	if (WInDev[index].unixdev == 0) {
 		dprintf_mciwave(stddeb,	"Linux 'widStart' // can't start recording !\n");
 		return MMSYSERR_NOTENABLED;
 		}
-	if (WInDev[wDevID].lpQueueHdr == NULL || 
-		WInDev[wDevID].lpQueueHdr->lpData == NULL) {
+	if (WInDev[index].lpQueueHdr == NULL || 
+		WInDev[index].lpQueueHdr->lpData == NULL) {
 		dprintf_mciwave(stddeb,"Linux 'widStart' // never been prepared !\n");
 		return WAVERR_UNPREPARED;
 		}
-	lpWIHdr = WInDev[wDevID].lpQueueHdr;
+	lpWIHdr = WInDev[index].lpQueueHdr;
 	while(lpWIHdr != NULL) {
 		lpWIHdr->dwBufferLength &= 0xFFFF;
 		dprintf_mciwave(stddeb,
 			"widStart // recording buf#%u=%p size=%lu \n",
 			count, lpWIHdr->lpData, lpWIHdr->dwBufferLength);
 		fflush(stddeb);
-		read (WInDev[wDevID].unixdev, 
+		read (WInDev[index].unixdev, 
 			PTR_SEG_TO_LIN(lpWIHdr->lpData),
 			lpWIHdr->dwBufferLength);
 		lpWIHdr->dwBytesRecorded = lpWIHdr->dwBufferLength;
-		WInDev[wDevID].dwTotalRecorded += lpWIHdr->dwBytesRecorded;
+		WInDev[index].dwTotalRecorded += lpWIHdr->dwBytesRecorded;
 		lpWIHdr->dwFlags &= ~WHDR_INQUEUE;
 		lpWIHdr->dwFlags |= WHDR_DONE;
 		if (WAVE_NotifyClient(wDevID, WIM_DATA, (DWORD)lpWIHdr, 0L) != 
@@ -1447,8 +1468,9 @@ static DWORD widStart(WORD wDevID)
 */
 static DWORD widStop(WORD wDevID)
 {
+	int index = MMSYSTEM_DevIDToIndex(wDevID);
 	dprintf_mciwave(stddeb,"widStop(%u);\n", wDevID);
-	if (WInDev[wDevID].unixdev == 0) {
+	if (WInDev[index].unixdev == 0) {
 		dprintf_mciwave(stddeb,"Linux 'widStop' // can't stop !\n");
 		return MMSYSERR_NOTENABLED;
 		}
@@ -1460,8 +1482,9 @@ static DWORD widStop(WORD wDevID)
 */
 static DWORD widReset(WORD wDevID)
 {
+	int index = MMSYSTEM_DevIDToIndex(wDevID);
 	dprintf_mciwave(stddeb,"widReset(%u);\n", wDevID);
-	if (WInDev[wDevID].unixdev == 0) {
+	if (WInDev[index].unixdev == 0) {
 		dprintf_mciwave(stddeb,"Linux 'widReset' // can't reset !\n");
 		return MMSYSERR_NOTENABLED;
 		}
@@ -1473,11 +1496,12 @@ static DWORD widReset(WORD wDevID)
 */
 static DWORD widGetPosition(WORD wDevID, LPMMTIME lpTime, DWORD uSize)
 {
+	int index = MMSYSTEM_DevIDToIndex(wDevID);
 	int		time;
     
 	dprintf_mciwave(stddeb,
 		"widGetPosition(%u, %p, %lu);\n", wDevID, lpTime, uSize);
-	if (WInDev[wDevID].unixdev == 0) {
+	if (WInDev[index].unixdev == 0) {
 		dprintf_mciwave(stddeb,"Linux 'widGetPosition' // can't get pos !\n");
 		return MMSYSERR_NOTENABLED;
 		}
@@ -1485,30 +1509,30 @@ static DWORD widGetPosition(WORD wDevID, LPMMTIME lpTime, DWORD uSize)
 	dprintf_mciwave(stddeb,"widGetPosition // wType=%04X !\n", 
 			lpTime->wType);
 	dprintf_mciwave(stddeb,"widGetPosition // wBitsPerSample=%u\n",
-			WInDev[wDevID].Format.wBitsPerSample); 
+			WInDev[index].Format.wBitsPerSample); 
 	dprintf_mciwave(stddeb,"widGetPosition // nSamplesPerSec=%lu\n",
-			WInDev[wDevID].Format.wf.nSamplesPerSec); 
+			WInDev[index].Format.wf.nSamplesPerSec); 
 	dprintf_mciwave(stddeb,"widGetPosition // nChannels=%u\n",
-			WInDev[wDevID].Format.wf.nChannels); 
+			WInDev[index].Format.wf.nChannels); 
 	dprintf_mciwave(stddeb,"widGetPosition // nAvgBytesPerSec=%lu\n",
-			WInDev[wDevID].Format.wf.nAvgBytesPerSec); 
+			WInDev[index].Format.wf.nAvgBytesPerSec); 
 	fflush(stddeb);
 	switch(lpTime->wType) {
 		case TIME_BYTES:
-			lpTime->u.cb = WInDev[wDevID].dwTotalRecorded;
+			lpTime->u.cb = WInDev[index].dwTotalRecorded;
 			dprintf_mciwave(stddeb,
 			    "widGetPosition // TIME_BYTES=%lu\n", lpTime->u.cb);
 			break;
 		case TIME_SAMPLES:
-			lpTime->u.sample = WInDev[wDevID].dwTotalRecorded * 8 /
-					  WInDev[wDevID].Format.wBitsPerSample;
+			lpTime->u.sample = WInDev[index].dwTotalRecorded * 8 /
+					  WInDev[index].Format.wBitsPerSample;
 			dprintf_mciwave(stddeb,
 					"widGetPosition // TIME_SAMPLES=%lu\n", 
 					lpTime->u.sample);
 			break;
 		case TIME_SMPTE:
-			time = WInDev[wDevID].dwTotalRecorded /
-				(WInDev[wDevID].Format.wf.nAvgBytesPerSec / 1000);
+			time = WInDev[index].dwTotalRecorded /
+				(WInDev[index].Format.wf.nAvgBytesPerSec / 1000);
 			lpTime->u.smpte.hour = time / 108000;
 			time -= lpTime->u.smpte.hour * 108000;
 			lpTime->u.smpte.min = time / 1800;
@@ -1525,8 +1549,8 @@ static DWORD widGetPosition(WORD wDevID, LPMMTIME lpTime, DWORD uSize)
 			dprintf_mciwave(stddeb,"widGetPosition() format not supported ! use TIME_MS !\n");
 			lpTime->wType = TIME_MS;
 		case TIME_MS:
-			lpTime->u.ms = WInDev[wDevID].dwTotalRecorded /
-					(WInDev[wDevID].Format.wf.nAvgBytesPerSec / 1000);
+			lpTime->u.ms = WInDev[index].dwTotalRecorded /
+					(WInDev[index].Format.wf.nAvgBytesPerSec / 1000);
 			dprintf_mciwave(stddeb,
 			      "widGetPosition // TIME_MS=%lu\n", lpTime->u.ms);
 			break;
@@ -1641,6 +1665,3 @@ LONG WAVE_DriverProc(DWORD dwDevID, HDRVR16 hDriv, WORD wMsg,
 	return MMSYSERR_NOTENABLED;
 #endif
 }
-
-
-#endif /* #ifdef BUILTIN_MMSYSTEM */
diff --git a/multimedia/joystick.c b/multimedia/joystick.c
index ab281909ecb..8bc7deb1e27 100644
--- a/multimedia/joystick.c
+++ b/multimedia/joystick.c
@@ -67,7 +67,7 @@ WORD JoyReleaseCapture(WORD wID)
 /**************************************************************************
  * 				JoySetCapture		[MMSYSTEM.106]
  */
-WORD JoySetCapture(HWND16 hWnd, WORD wID, WORD wPeriod, BOOL bChanged)
+WORD JoySetCapture(HWND16 hWnd, WORD wID, WORD wPeriod, BOOL16 bChanged)
 {
     fprintf(stdnimp, "EMPTY STUB !!! JoySetCapture(%04X, %04X, %d, %d);\n",
 	    hWnd, wID, wPeriod, bChanged);
diff --git a/multimedia/mcianim.c b/multimedia/mcianim.c
index e6e84f33ff7..babcf25b507 100644
--- a/multimedia/mcianim.c
+++ b/multimedia/mcianim.c
@@ -4,12 +4,6 @@
  * Copyright 1994 Martin Ayotte
  */
 
-#ifndef WINELIB
-#define BUILTIN_MMSYSTEM
-#endif 
-
-#ifdef BUILTIN_MMSYSTEM
-
 #include <stdio.h>
 #include <stdlib.h>
 #include <unistd.h>
@@ -23,6 +17,8 @@
 #include "stddebug.h"
 #include "debug.h"
 
+int MMSYSTEM_DevIDToIndex(UINT16);
+
 #define MAX_ANIMDRV 		2
 
 #define ANIMFRAMES_PERSEC 	30
@@ -32,15 +28,15 @@
 #if defined(linux) || defined(__FreeBSD__)
 typedef struct {
     int     nUseCount;          /* Incremented for each shared open */
-    BOOL    fShareable;         /* TRUE if first open was shareable */
+    BOOL16  fShareable;         /* TRUE if first open was shareable */
     WORD    wNotifyDeviceID;    /* MCI device ID with a pending notification */
     HANDLE16 hCallback;          /* Callback handle for pending notification */
 	MCI_OPEN_PARMS openParms;
 	DWORD	dwTimeFormat;
 	int		mode;
-	UINT	nCurTrack;
+	UINT16	nCurTrack;
 	DWORD	dwCurFrame;
-	UINT	nTracks;
+	UINT16	nTracks;
 	DWORD	dwTotalLen;
 	LPDWORD	lpdwTrackLen;
 	LPDWORD	lpdwTrackPos;
@@ -55,26 +51,27 @@ static LINUX_ANIM	AnimDev[MAX_ANIMDRV];
 /**************************************************************************
 * 				ANIM_mciOpen			[internal]
 */
-static DWORD ANIM_mciOpen(UINT wDevID, DWORD dwFlags, LPMCI_OPEN_PARMS lpParms)
+static DWORD ANIM_mciOpen(UINT16 wDevID, DWORD dwFlags, LPMCI_OPEN_PARMS lpParms)
 {
 #if defined(linux) || defined(__FreeBSD__)
+	int index = MMSYSTEM_DevIDToIndex(wDevID);
 	LPSTR		lpstrElementName;
 	char		str[128];
 	dprintf_mcianim(stddeb,"ANIM_mciOpen(%04X, %08lX, %p);\n", 
 					wDevID, dwFlags, lpParms);
 	if (lpParms == NULL) return MCIERR_INTERNAL;
-	if (AnimDev[wDevID].nUseCount > 0) {
+	if (AnimDev[index].nUseCount > 0) {
 		/* The driver already open on this channel */
 		/* If the driver was opened shareable before and this open specifies */
 		/* shareable then increment the use count */
-		if (AnimDev[wDevID].fShareable && (dwFlags & MCI_OPEN_SHAREABLE))
-			++AnimDev[wDevID].nUseCount;
+		if (AnimDev[index].fShareable && (dwFlags & MCI_OPEN_SHAREABLE))
+			++AnimDev[index].nUseCount;
 		else
 			return MCIERR_MUST_USE_SHAREABLE;
 		}
 	else {
-		AnimDev[wDevID].nUseCount = 1;
-		AnimDev[wDevID].fShareable = dwFlags & MCI_OPEN_SHAREABLE;
+		AnimDev[index].nUseCount = 1;
+		AnimDev[index].fShareable = dwFlags & MCI_OPEN_SHAREABLE;
 		}
 	dprintf_mcianim(stddeb,"ANIM_mciOpen // wDevID=%04X\n", wDevID);
 	lpParms->wDeviceID = wDevID;
@@ -88,21 +85,21 @@ static DWORD ANIM_mciOpen(UINT wDevID, DWORD dwFlags, LPMCI_OPEN_PARMS lpParms)
 			CharUpper32A(str);
 			}
 		}
-	memcpy(&AnimDev[wDevID].openParms, lpParms, sizeof(MCI_OPEN_PARMS));
-	AnimDev[wDevID].wNotifyDeviceID = lpParms->wDeviceID;
-	AnimDev[wDevID].mode = 0;
-	AnimDev[wDevID].dwTimeFormat = MCI_FORMAT_TMSF;
-	AnimDev[wDevID].nCurTrack = 0;
-	AnimDev[wDevID].nTracks = 0;
-	AnimDev[wDevID].dwTotalLen = 0;
-	AnimDev[wDevID].lpdwTrackLen = NULL;
-	AnimDev[wDevID].lpdwTrackPos = NULL;
+	memcpy(&AnimDev[index].openParms, lpParms, sizeof(MCI_OPEN_PARMS));
+	AnimDev[index].wNotifyDeviceID = lpParms->wDeviceID;
+	AnimDev[index].mode = 0;
+	AnimDev[index].dwTimeFormat = MCI_FORMAT_TMSF;
+	AnimDev[index].nCurTrack = 0;
+	AnimDev[index].nTracks = 0;
+	AnimDev[index].dwTotalLen = 0;
+	AnimDev[index].lpdwTrackLen = NULL;
+	AnimDev[index].lpdwTrackPos = NULL;
 	if (dwFlags & MCI_NOTIFY) {
 		dprintf_mcianim(stddeb,
 			"ANIM_mciOpen // MCI_NOTIFY_SUCCESSFUL %08lX !\n", 
 			lpParms->dwCallback);
 		mciDriverNotify((HWND16)LOWORD(lpParms->dwCallback), 
-			AnimDev[wDevID].wNotifyDeviceID, MCI_NOTIFY_SUCCESSFUL);
+			AnimDev[index].wNotifyDeviceID, MCI_NOTIFY_SUCCESSFUL);
 		}
  	return 0;
 #else
@@ -113,13 +110,14 @@ static DWORD ANIM_mciOpen(UINT wDevID, DWORD dwFlags, LPMCI_OPEN_PARMS lpParms)
 /**************************************************************************
 * 				ANIM_mciClose		[internal]
 */
-static DWORD ANIM_mciClose(UINT wDevID, DWORD dwParam, LPMCI_GENERIC_PARMS lpParms)
+static DWORD ANIM_mciClose(UINT16 wDevID, DWORD dwParam, LPMCI_GENERIC_PARMS lpParms)
 {
 #if defined(linux) || defined(__FreeBSD__)
+	int index = MMSYSTEM_DevIDToIndex(wDevID);
 	dprintf_mcianim(stddeb,"ANIM_mciClose(%u, %08lX, %p);\n", 
 				wDevID, dwParam, lpParms);
-	if (AnimDev[wDevID].lpdwTrackLen != NULL) free(AnimDev[wDevID].lpdwTrackLen);
-	if (AnimDev[wDevID].lpdwTrackPos != NULL) free(AnimDev[wDevID].lpdwTrackPos);
+	if (AnimDev[index].lpdwTrackLen != NULL) free(AnimDev[index].lpdwTrackLen);
+	if (AnimDev[index].lpdwTrackPos != NULL) free(AnimDev[index].lpdwTrackPos);
 #endif
         return 0;
 }
@@ -127,7 +125,7 @@ static DWORD ANIM_mciClose(UINT wDevID, DWORD dwParam, LPMCI_GENERIC_PARMS lpPar
 /**************************************************************************
 * 				ANIM_mciGetDevCaps	[internal]
 */
-static DWORD ANIM_mciGetDevCaps(UINT wDevID, DWORD dwFlags, 
+static DWORD ANIM_mciGetDevCaps(UINT16 wDevID, DWORD dwFlags, 
 						LPMCI_GETDEVCAPS_PARMS lpParms)
 {
 #if defined(linux) || defined(__FreeBSD__)
@@ -183,14 +181,15 @@ static DWORD ANIM_mciGetDevCaps(UINT wDevID, DWORD dwFlags,
 /**************************************************************************
 * 				ANIM_CalcTime			[internal]
 */
-static DWORD ANIM_CalcTime(UINT wDevID, DWORD dwFormatType, DWORD dwFrame)
+static DWORD ANIM_CalcTime(UINT16 wDevID, DWORD dwFormatType, DWORD dwFrame)
 {
 	DWORD	dwTime = 0;
 #if defined(linux) || defined(__FreeBSD__)
-	UINT	wTrack;
-	UINT	wMinutes;
-	UINT	wSeconds;
-	UINT	wFrames;
+	int index = MMSYSTEM_DevIDToIndex(wDevID);
+	UINT16	wTrack;
+	UINT16	wMinutes;
+	UINT16	wSeconds;
+	UINT16	wFrames;
 	dprintf_mcianim(stddeb,"ANIM_CalcTime(%u, %08lX, %lu);\n", 
 			wDevID, dwFormatType, dwFrame);
     
@@ -213,11 +212,11 @@ static DWORD ANIM_CalcTime(UINT wDevID, DWORD dwFormatType, DWORD dwFrame)
 			/* unknown format ! force TMSF ! ... */
 			dwFormatType = MCI_FORMAT_TMSF;
 		case MCI_FORMAT_TMSF:
-			for (wTrack = 0; wTrack < AnimDev[wDevID].nTracks; wTrack++) {
-/*				dwTime += AnimDev[wDevID].lpdwTrackLen[wTrack - 1];
+			for (wTrack = 0; wTrack < AnimDev[index].nTracks; wTrack++) {
+/*				dwTime += AnimDev[index].lpdwTrackLen[wTrack - 1];
 				printf("Adding trk#%u curpos=%u \n", dwTime);
 				if (dwTime >= dwFrame) break; */
-				if (AnimDev[wDevID].lpdwTrackPos[wTrack - 1] >= dwFrame) break;
+				if (AnimDev[index].lpdwTrackPos[wTrack - 1] >= dwFrame) break;
 				}
 			wMinutes = dwFrame / ANIMFRAMES_PERMIN;
 			wSeconds = (dwFrame - ANIMFRAMES_PERMIN * wMinutes) / ANIMFRAMES_PERSEC;
@@ -237,11 +236,12 @@ static DWORD ANIM_CalcTime(UINT wDevID, DWORD dwFormatType, DWORD dwFrame)
 /**************************************************************************
 * 				ANIM_CalcFrame			[internal]
 */
-static DWORD ANIM_CalcFrame(UINT wDevID, DWORD dwFormatType, DWORD dwTime)
+static DWORD ANIM_CalcFrame(UINT16 wDevID, DWORD dwFormatType, DWORD dwTime)
 {
 	DWORD	dwFrame = 0;
 #if defined(linux) || defined(__FreeBSD__)
-	UINT	wTrack;
+	int index = MMSYSTEM_DevIDToIndex(wDevID);
+	UINT16	wTrack;
 	dprintf_mcianim(stddeb,"ANIM_CalcFrame(%u, %08lX, %lu);\n", 
 			wDevID, dwFormatType, dwTime);
 
@@ -271,8 +271,8 @@ static DWORD ANIM_CalcFrame(UINT wDevID, DWORD dwFormatType, DWORD dwTime)
 				MCI_TMSF_SECOND(dwTime), MCI_TMSF_FRAME(dwTime));
 			dprintf_mcianim(stddeb,
 				"ANIM_CalcFrame // TMSF trackpos[%u]=%lu\n",
-				wTrack, AnimDev[wDevID].lpdwTrackPos[wTrack - 1]);
-			dwFrame = AnimDev[wDevID].lpdwTrackPos[wTrack - 1];
+				wTrack, AnimDev[index].lpdwTrackPos[wTrack - 1]);
+			dwFrame = AnimDev[index].lpdwTrackPos[wTrack - 1];
 			dwFrame += ANIMFRAMES_PERMIN * MCI_TMSF_MINUTE(dwTime);
 			dwFrame += ANIMFRAMES_PERSEC * MCI_TMSF_SECOND(dwTime);
 			dwFrame += MCI_TMSF_FRAME(dwTime);
@@ -286,9 +286,10 @@ static DWORD ANIM_CalcFrame(UINT wDevID, DWORD dwFormatType, DWORD dwTime)
 /**************************************************************************
 * 				ANIM_mciInfo			[internal]
 */
-static DWORD ANIM_mciInfo(UINT wDevID, DWORD dwFlags, LPMCI_INFO_PARMS lpParms)
+static DWORD ANIM_mciInfo(UINT16 wDevID, DWORD dwFlags, LPMCI_INFO_PARMS lpParms)
 {
 #if defined(linux) || defined(__FreeBSD__)
+	int index = MMSYSTEM_DevIDToIndex(wDevID);
 	dprintf_mcianim(stddeb,"ANIM_mciInfo(%u, %08lX, %p);\n", 
 		wDevID, dwFlags, lpParms);
 	if (lpParms == NULL) return MCIERR_INTERNAL;
@@ -299,7 +300,7 @@ static DWORD ANIM_mciInfo(UINT wDevID, DWORD dwFlags, LPMCI_INFO_PARMS lpParms)
 			break;
 		case MCI_INFO_FILE:
 			lpParms->lpstrReturn = 
-				(LPSTR)AnimDev[wDevID].openParms.lpstrElementName;
+				(LPSTR)AnimDev[index].openParms.lpstrElementName;
 			break;
 		case MCI_ANIM_INFO_TEXT:
 			lpParms->lpstrReturn = "Animation Window";
@@ -320,9 +321,10 @@ static DWORD ANIM_mciInfo(UINT wDevID, DWORD dwFlags, LPMCI_INFO_PARMS lpParms)
 /**************************************************************************
 * 				ANIM_mciStatus		[internal]
 */
-static DWORD ANIM_mciStatus(UINT wDevID, DWORD dwFlags, LPMCI_STATUS_PARMS lpParms)
+static DWORD ANIM_mciStatus(UINT16 wDevID, DWORD dwFlags, LPMCI_STATUS_PARMS lpParms)
 {
 #if defined(linux) || defined(__FreeBSD__)
+	int index = MMSYSTEM_DevIDToIndex(wDevID);
 	dprintf_mcianim(stddeb,"ANIM_mciStatus(%u, %08lX, %p);\n", 
 			wDevID, dwFlags, lpParms);
 	if (lpParms == NULL) return MCIERR_INTERNAL;
@@ -331,30 +333,30 @@ static DWORD ANIM_mciStatus(UINT wDevID, DWORD dwFlags, LPMCI_STATUS_PARMS lpPar
 			"ANIM_mciStatus // MCI_NOTIFY_SUCCESSFUL %08lX !\n", 
 			lpParms->dwCallback);
 		mciDriverNotify((HWND16)LOWORD(lpParms->dwCallback), 
-			AnimDev[wDevID].wNotifyDeviceID, MCI_NOTIFY_SUCCESSFUL);
+			AnimDev[index].wNotifyDeviceID, MCI_NOTIFY_SUCCESSFUL);
 		}
 	if (dwFlags & MCI_STATUS_ITEM) {
 		switch(lpParms->dwItem) {
 			case MCI_STATUS_CURRENT_TRACK:
-				lpParms->dwReturn = AnimDev[wDevID].nCurTrack;
+				lpParms->dwReturn = AnimDev[index].nCurTrack;
 				dprintf_mcianim(stddeb,"ANIM_mciStatus // CURRENT_TRACK=%lu!\n", lpParms->dwReturn);
 			 	return 0;
 			case MCI_STATUS_LENGTH:
 				if (dwFlags & MCI_TRACK) {
 					dprintf_mcianim(stddeb,"ANIM_mciStatus // MCI_TRACK #%lu LENGTH=??? !\n",
 														lpParms->dwTrack);
-					if (lpParms->dwTrack > AnimDev[wDevID].nTracks)
+					if (lpParms->dwTrack > AnimDev[index].nTracks)
 						return MCIERR_OUTOFRANGE;
-					lpParms->dwReturn = AnimDev[wDevID].lpdwTrackLen[lpParms->dwTrack];
+					lpParms->dwReturn = AnimDev[index].lpdwTrackLen[lpParms->dwTrack];
 					}
 				else
-					lpParms->dwReturn = AnimDev[wDevID].dwTotalLen;
+					lpParms->dwReturn = AnimDev[index].dwTotalLen;
 				lpParms->dwReturn = ANIM_CalcTime(wDevID, 
-					AnimDev[wDevID].dwTimeFormat, lpParms->dwReturn);
+					AnimDev[index].dwTimeFormat, lpParms->dwReturn);
                 		dprintf_mcianim(stddeb,"ANIM_mciStatus // LENGTH=%lu !\n", lpParms->dwReturn);
 			 	return 0;
 			case MCI_STATUS_MODE:
-				lpParms->dwReturn = AnimDev[wDevID].mode;
+				lpParms->dwReturn = AnimDev[index].mode;
 				dprintf_mcianim(stddeb,"ANIM_mciStatus // MCI_STATUS_MODE=%08lX !\n",
 												lpParms->dwReturn);
 			 	return 0;
@@ -369,19 +371,19 @@ static DWORD ANIM_mciStatus(UINT wDevID, DWORD dwFlags, LPMCI_STATUS_PARMS lpPar
 				if (lpParms->dwReturn == (WORD)-1) return MCIERR_INTERNAL;
 			 	return 0;
 			case MCI_STATUS_POSITION:
-				lpParms->dwReturn = AnimDev[wDevID].dwCurFrame;
+				lpParms->dwReturn = AnimDev[index].dwCurFrame;
 				if (dwFlags & MCI_STATUS_START) {
 					lpParms->dwReturn = 0;
 					dprintf_mcianim(stddeb,"CDAUDIO_mciStatus // get MCI_STATUS_START !\n");
 					}
 				if (dwFlags & MCI_TRACK) {
-					if (lpParms->dwTrack > AnimDev[wDevID].nTracks)
+					if (lpParms->dwTrack > AnimDev[index].nTracks)
 						return MCIERR_OUTOFRANGE;
-					lpParms->dwReturn = AnimDev[wDevID].lpdwTrackPos[lpParms->dwTrack - 1];
+					lpParms->dwReturn = AnimDev[index].lpdwTrackPos[lpParms->dwTrack - 1];
 					dprintf_mcianim(stddeb,"ANIM_mciStatus // get MCI_TRACK #%lu !\n", lpParms->dwTrack);
 					}
 				lpParms->dwReturn = ANIM_CalcTime(wDevID, 
-					AnimDev[wDevID].dwTimeFormat, lpParms->dwReturn);
+					AnimDev[index].dwTimeFormat, lpParms->dwReturn);
 					dprintf_mcianim(stddeb,"ANIM_mciStatus // MCI_STATUS_POSITION=%08lX !\n",
 														lpParms->dwReturn);
 			 	return 0;
@@ -409,35 +411,36 @@ static DWORD ANIM_mciStatus(UINT wDevID, DWORD dwFlags, LPMCI_STATUS_PARMS lpPar
 /**************************************************************************
 * 				ANIM_mciPlay			[internal]
 */
-static DWORD ANIM_mciPlay(UINT wDevID, DWORD dwFlags, LPMCI_PLAY_PARMS lpParms)
+static DWORD ANIM_mciPlay(UINT16 wDevID, DWORD dwFlags, LPMCI_PLAY_PARMS lpParms)
 {
 #if defined(linux) || defined(__FreeBSD__)
+	int index = MMSYSTEM_DevIDToIndex(wDevID);
 	int 	start, end;
 	dprintf_mcianim(stddeb,"ANIM_mciPlay(%u, %08lX, %p);\n", 
 		wDevID, dwFlags, lpParms);
 	if (lpParms == NULL) return MCIERR_INTERNAL;
-	start = 0; 		end = AnimDev[wDevID].dwTotalLen;
-	AnimDev[wDevID].nCurTrack = 1;
+	start = 0; 		end = AnimDev[index].dwTotalLen;
+	AnimDev[index].nCurTrack = 1;
 	if (dwFlags & MCI_FROM) {
 		start = ANIM_CalcFrame(wDevID, 
-			AnimDev[wDevID].dwTimeFormat, lpParms->dwFrom); 
+			AnimDev[index].dwTimeFormat, lpParms->dwFrom); 
         dprintf_mcianim(stddeb,"ANIM_mciPlay // MCI_FROM=%08lX -> %u \n",
 				lpParms->dwFrom, start);
 		}
 	if (dwFlags & MCI_TO) {
 		end = ANIM_CalcFrame(wDevID, 
-			AnimDev[wDevID].dwTimeFormat, lpParms->dwTo);
+			AnimDev[index].dwTimeFormat, lpParms->dwTo);
         	dprintf_mcianim(stddeb,
 			"ANIM_mciPlay // MCI_TO=%08lX -> %u \n",
 			lpParms->dwTo, end);
 		}
-	AnimDev[wDevID].mode = MCI_MODE_PLAY;
+	AnimDev[index].mode = MCI_MODE_PLAY;
 	if (dwFlags & MCI_NOTIFY) {
 		dprintf_mcianim(stddeb,
 			"ANIM_mciPlay // MCI_NOTIFY_SUCCESSFUL %08lX !\n", 
 			lpParms->dwCallback);
 		mciDriverNotify((HWND16)LOWORD(lpParms->dwCallback), 
-			AnimDev[wDevID].wNotifyDeviceID, MCI_NOTIFY_SUCCESSFUL);
+			AnimDev[index].wNotifyDeviceID, MCI_NOTIFY_SUCCESSFUL);
 		}
 	return 0;
 #else
@@ -448,19 +451,20 @@ static DWORD ANIM_mciPlay(UINT wDevID, DWORD dwFlags, LPMCI_PLAY_PARMS lpParms)
 /**************************************************************************
 * 				ANIM_mciStop			[internal]
 */
-static DWORD ANIM_mciStop(UINT wDevID, DWORD dwFlags, LPMCI_GENERIC_PARMS lpParms)
+static DWORD ANIM_mciStop(UINT16 wDevID, DWORD dwFlags, LPMCI_GENERIC_PARMS lpParms)
 {
 #if defined(linux) || defined(__FreeBSD__)
+	int index = MMSYSTEM_DevIDToIndex(wDevID);
 	dprintf_mcianim(stddeb,"ANIM_mciStop(%u, %08lX, %p);\n", 
 			wDevID, dwFlags, lpParms);
 	if (lpParms == NULL) return MCIERR_INTERNAL;
-	AnimDev[wDevID].mode = MCI_MODE_STOP;
+	AnimDev[index].mode = MCI_MODE_STOP;
 	if (dwFlags & MCI_NOTIFY) {
 		dprintf_mcianim(stddeb,
 			"ANIM_mciStop // MCI_NOTIFY_SUCCESSFUL %08lX !\n", 
 			lpParms->dwCallback);
 		mciDriverNotify((HWND16)LOWORD(lpParms->dwCallback), 
-			AnimDev[wDevID].wNotifyDeviceID, MCI_NOTIFY_SUCCESSFUL);
+			AnimDev[index].wNotifyDeviceID, MCI_NOTIFY_SUCCESSFUL);
 		}
  	return 0;
 #else
@@ -471,19 +475,20 @@ static DWORD ANIM_mciStop(UINT wDevID, DWORD dwFlags, LPMCI_GENERIC_PARMS lpParm
 /**************************************************************************
 * 				ANIM_mciPause		[internal]
 */
-static DWORD ANIM_mciPause(UINT wDevID, DWORD dwFlags, LPMCI_GENERIC_PARMS lpParms)
+static DWORD ANIM_mciPause(UINT16 wDevID, DWORD dwFlags, LPMCI_GENERIC_PARMS lpParms)
 {
 #if defined(linux) || defined(__FreeBSD__)
+	int index = MMSYSTEM_DevIDToIndex(wDevID);
 	dprintf_mcianim(stddeb,"ANIM_mciPause(%u, %08lX, %p);\n", 
 		wDevID, dwFlags, lpParms);
 	if (lpParms == NULL) return MCIERR_INTERNAL;
-	AnimDev[wDevID].mode = MCI_MODE_PAUSE;
+	AnimDev[index].mode = MCI_MODE_PAUSE;
 	if (dwFlags & MCI_NOTIFY) {
 		dprintf_mcianim(stddeb,
 			"ANIM_mciPause // MCI_NOTIFY_SUCCESSFUL %08lX !\n", 
 			lpParms->dwCallback);
 		mciDriverNotify((HWND16)LOWORD(lpParms->dwCallback), 
-			AnimDev[wDevID].wNotifyDeviceID, MCI_NOTIFY_SUCCESSFUL);
+			AnimDev[index].wNotifyDeviceID, MCI_NOTIFY_SUCCESSFUL);
 		}
 	return 0;
 #else
@@ -494,19 +499,20 @@ static DWORD ANIM_mciPause(UINT wDevID, DWORD dwFlags, LPMCI_GENERIC_PARMS lpPar
 /**************************************************************************
 * 				ANIM_mciResume		[internal]
 */
-static DWORD ANIM_mciResume(UINT wDevID, DWORD dwFlags, LPMCI_GENERIC_PARMS lpParms)
+static DWORD ANIM_mciResume(UINT16 wDevID, DWORD dwFlags, LPMCI_GENERIC_PARMS lpParms)
 {
 #if defined(linux) || defined(__FreeBSD__)
+	int index = MMSYSTEM_DevIDToIndex(wDevID);
 	dprintf_mcianim(stddeb,"ANIM_mciResume(%u, %08lX, %p);\n", 
 		wDevID, dwFlags, lpParms);
 	if (lpParms == NULL) return MCIERR_INTERNAL;
-	AnimDev[wDevID].mode = MCI_MODE_STOP;
+	AnimDev[index].mode = MCI_MODE_STOP;
 	if (dwFlags & MCI_NOTIFY) {
 		dprintf_mcianim(stddeb,
 			"ANIM_mciResume // MCI_NOTIFY_SUCCESSFUL %08lX !\n", 
 			lpParms->dwCallback);
 		mciDriverNotify((HWND16)LOWORD(lpParms->dwCallback), 
-			AnimDev[wDevID].wNotifyDeviceID, MCI_NOTIFY_SUCCESSFUL);
+			AnimDev[index].wNotifyDeviceID, MCI_NOTIFY_SUCCESSFUL);
 		}
 	return 0;
 #else
@@ -517,21 +523,22 @@ static DWORD ANIM_mciResume(UINT wDevID, DWORD dwFlags, LPMCI_GENERIC_PARMS lpPa
 /**************************************************************************
 * 				ANIM_mciSeek			[internal]
 */
-static DWORD ANIM_mciSeek(UINT wDevID, DWORD dwFlags, LPMCI_SEEK_PARMS lpParms)
+static DWORD ANIM_mciSeek(UINT16 wDevID, DWORD dwFlags, LPMCI_SEEK_PARMS lpParms)
 {
 #if defined(linux) || defined(__FreeBSD__)
+	int index = MMSYSTEM_DevIDToIndex(wDevID);
 	DWORD	dwRet;
 	MCI_PLAY_PARMS PlayParms;
 	dprintf_mcianim(stddeb,"ANIM_mciSeek(%u, %08lX, %p);\n", 
 		wDevID, dwFlags, lpParms);
 	if (lpParms == NULL) return MCIERR_INTERNAL;
-	AnimDev[wDevID].mode = MCI_MODE_SEEK;
+	AnimDev[index].mode = MCI_MODE_SEEK;
 	switch(dwFlags) {
 		case MCI_SEEK_TO_START:
 			PlayParms.dwFrom = 0;
 			break;
 		case MCI_SEEK_TO_END:
-			PlayParms.dwFrom = AnimDev[wDevID].dwTotalLen;
+			PlayParms.dwFrom = AnimDev[index].dwTotalLen;
 			break;
 		case MCI_TO:
 			PlayParms.dwFrom = lpParms->dwTo;
@@ -545,7 +552,7 @@ static DWORD ANIM_mciSeek(UINT wDevID, DWORD dwFlags, LPMCI_SEEK_PARMS lpParms)
 			"ANIM_mciSeek // MCI_NOTIFY_SUCCESSFUL %08lX !\n", 
 			lpParms->dwCallback);
 		mciDriverNotify((HWND16)LOWORD(lpParms->dwCallback), 
-			AnimDev[wDevID].wNotifyDeviceID, MCI_NOTIFY_SUCCESSFUL);
+			AnimDev[index].wNotifyDeviceID, MCI_NOTIFY_SUCCESSFUL);
 		}
 	return dwRet;
 #else
@@ -557,9 +564,10 @@ static DWORD ANIM_mciSeek(UINT wDevID, DWORD dwFlags, LPMCI_SEEK_PARMS lpParms)
 /**************************************************************************
 * 				ANIM_mciSet			[internal]
 */
-static DWORD ANIM_mciSet(UINT wDevID, DWORD dwFlags, LPMCI_SET_PARMS lpParms)
+static DWORD ANIM_mciSet(UINT16 wDevID, DWORD dwFlags, LPMCI_SET_PARMS lpParms)
 {
 #if defined(linux) || defined(__FreeBSD__)
+	int index = MMSYSTEM_DevIDToIndex(wDevID);
 	dprintf_mcianim(stddeb,"ANIM_mciSet(%u, %08lX, %p);\n", 
 		wDevID, dwFlags, lpParms);
 	if (lpParms == NULL) return MCIERR_INTERNAL;
@@ -583,7 +591,7 @@ static DWORD ANIM_mciSet(UINT wDevID, DWORD dwFlags, LPMCI_SET_PARMS lpParms)
 				fprintf(stderr,"ANIM_mciSet // bad time format !\n");
 				return MCIERR_BAD_TIME_FORMAT;
 			}
-		AnimDev[wDevID].dwTimeFormat = lpParms->dwTimeFormat;
+		AnimDev[index].dwTimeFormat = lpParms->dwTimeFormat;
 		}
 	if (dwFlags & MCI_SET_VIDEO) return MCIERR_UNSUPPORTED_FUNCTION;
 	if (dwFlags & MCI_SET_ON) return MCIERR_UNSUPPORTED_FUNCTION;
@@ -593,7 +601,7 @@ static DWORD ANIM_mciSet(UINT wDevID, DWORD dwFlags, LPMCI_SET_PARMS lpParms)
 			"ANIM_mciSet // MCI_NOTIFY_SUCCESSFUL %08lX !\n", 
 			lpParms->dwCallback);
 		mciDriverNotify((HWND16)LOWORD(lpParms->dwCallback), 
-			AnimDev[wDevID].wNotifyDeviceID, MCI_NOTIFY_SUCCESSFUL);
+			AnimDev[index].wNotifyDeviceID, MCI_NOTIFY_SUCCESSFUL);
 		}
 	return 0;
 #else
@@ -675,5 +683,3 @@ LONG ANIM_DriverProc(DWORD dwDevID, HDRVR16 hDriv, WORD wMsg,
 
 
 /*-----------------------------------------------------------------------*/
-
-#endif /* #ifdef BUILTIN_MMSYSTEM */
diff --git a/multimedia/mcicda.c b/multimedia/mcicda.c
index febab84e1a3..5c9781db3b1 100644
--- a/multimedia/mcicda.c
+++ b/multimedia/mcicda.c
@@ -4,12 +4,6 @@
  * Copyright 1994 Martin Ayotte
  */
 
-#ifndef WINELIB
-#define BUILTIN_MMSYSTEM
-#endif 
-
-#ifdef BUILTIN_MMSYSTEM
-
 #include <stdio.h>
 #include <stdlib.h>
 #include <unistd.h>
@@ -31,6 +25,8 @@
 #include <sys/cdio.h>
 #endif
 
+int MMSYSTEM_DevIDToIndex(UINT16);
+
 #define SOUND_DEV "/dev/dsp"
 #ifdef __FreeBSD__
 #define CDAUDIO_DEV "/dev/rcd0c"
@@ -54,7 +50,7 @@
 #if defined(linux) || defined(__FreeBSD__)
 typedef struct {
     int     nUseCount;          /* Incremented for each shared open */
-    BOOL    fShareable;         /* TRUE if first open was shareable */
+    BOOL16  fShareable;         /* TRUE if first open was shareable */
     WORD    wNotifyDeviceID;    /* MCI device ID with a pending notification */
     HANDLE16 hCallback;          /* Callback handle for pending notification */
 	MCI_OPEN_PARMS openParms;
@@ -66,9 +62,9 @@ typedef struct {
 	struct cd_sub_channel_info	sc;
 #endif
 	int		mode;
-	UINT	nCurTrack;
+	UINT16	nCurTrack;
 	DWORD	dwCurFrame;
-	UINT	nTracks;
+	UINT16	nTracks;
 	DWORD	dwTotalLen;
 	LPDWORD	lpdwTrackLen;
 	LPDWORD	lpdwTrackPos;
@@ -85,16 +81,17 @@ static LINUX_CDAUDIO	CDADev[MAX_CDAUDIODRV];
 /**************************************************************************
 * 				CDAUDIO_GetNumberOfTracks		[internal]
 */
-static UINT CDAUDIO_GetNumberOfTracks(UINT wDevID)
+static UINT16 CDAUDIO_GetNumberOfTracks(UINT16 wDevID)
 {
 #if defined(linux) || defined(__FreeBSD__)
+	int index = MMSYSTEM_DevIDToIndex(wDevID);
 #ifdef linux
 	struct cdrom_tochdr	hdr;
 #elif __FreeBSD__
 	struct ioc_toc_header	hdr;
 #endif
-	if (CDADev[wDevID].nTracks == 0) {
-		if (ioctl(CDADev[wDevID].unixdev,
+	if (CDADev[index].nTracks == 0) {
+		if (ioctl(CDADev[index].unixdev,
 #ifdef linux
 			  CDROMREADTOCHDR
 #elif __FreeBSD__
@@ -102,17 +99,17 @@ static UINT CDAUDIO_GetNumberOfTracks(UINT wDevID)
 #endif
 			  , &hdr)) {
             		dprintf_cdaudio(stddeb,
-				"GetNumberOfTracks(%u) // Error occured !\n", 
+				"GetNumberOfTracks(%04X) // Error occured !\n", 
 				wDevID);
 			return (WORD)-1;
 			}
 #ifdef linux
-		CDADev[wDevID].nTracks = hdr.cdth_trk1;
+		CDADev[index].nTracks = hdr.cdth_trk1;
 #elif __FreeBSD__
-		CDADev[wDevID].nTracks = hdr.ending_track - hdr.starting_track + 1;
+		CDADev[index].nTracks = hdr.ending_track - hdr.starting_track + 1;
 #endif
 		}
-	return CDADev[wDevID].nTracks;
+	return CDADev[index].nTracks;
 #else
 	return (WORD)-1;
 #endif
@@ -122,9 +119,10 @@ static UINT CDAUDIO_GetNumberOfTracks(UINT wDevID)
 /**************************************************************************
 * 				CDAUDIO_GetTracksInfo			[internal]
 */
-static BOOL CDAUDIO_GetTracksInfo(UINT wDevID)
+static BOOL32 CDAUDIO_GetTracksInfo(UINT16 wDevID)
 {
 #if defined(linux) || defined(__FreeBSD__)
+	int index = MMSYSTEM_DevIDToIndex(wDevID);
 	int		i, length;
 	int		start, last_start = 0;
 	int		total_length = 0;
@@ -134,31 +132,31 @@ static BOOL CDAUDIO_GetTracksInfo(UINT wDevID)
 	struct ioc_read_toc_entry	entry;
 	struct cd_toc_entry             toc_buffer;
 #endif
-	if (CDADev[wDevID].nTracks == 0) {
+	if (CDADev[index].nTracks == 0) {
 		if (CDAUDIO_GetNumberOfTracks(wDevID) == (WORD)-1) return FALSE;
 		}
     	dprintf_cdaudio(stddeb,"CDAUDIO_GetTracksInfo // nTracks=%u\n", 
-		CDADev[wDevID].nTracks);
-	if (CDADev[wDevID].lpdwTrackLen != NULL) 
-		free(CDADev[wDevID].lpdwTrackLen);
-	CDADev[wDevID].lpdwTrackLen = (LPDWORD)malloc(
-		(CDADev[wDevID].nTracks + 1) * sizeof(DWORD));
-	if (CDADev[wDevID].lpdwTrackPos != NULL) 
-		free(CDADev[wDevID].lpdwTrackPos);
-	CDADev[wDevID].lpdwTrackPos = (LPDWORD)malloc(
-		(CDADev[wDevID].nTracks + 1) * sizeof(DWORD));
-	if (CDADev[wDevID].lpdwTrackLen == NULL ||
-		CDADev[wDevID].lpdwTrackPos == NULL) {
+		CDADev[index].nTracks);
+	if (CDADev[index].lpdwTrackLen != NULL) 
+		free(CDADev[index].lpdwTrackLen);
+	CDADev[index].lpdwTrackLen = (LPDWORD)malloc(
+		(CDADev[index].nTracks + 1) * sizeof(DWORD));
+	if (CDADev[index].lpdwTrackPos != NULL) 
+		free(CDADev[index].lpdwTrackPos);
+	CDADev[index].lpdwTrackPos = (LPDWORD)malloc(
+		(CDADev[index].nTracks + 1) * sizeof(DWORD));
+	if (CDADev[index].lpdwTrackLen == NULL ||
+		CDADev[index].lpdwTrackPos == NULL) {
         		dprintf_cdaudio(stddeb,
 				"CDAUDIO_GetTracksInfo // error allocating track table !\n");
 		return FALSE;
 		}
-	memset(CDADev[wDevID].lpdwTrackLen, 0, 
-		(CDADev[wDevID].nTracks + 1) * sizeof(DWORD));
-	memset(CDADev[wDevID].lpdwTrackPos, 0, 
-		(CDADev[wDevID].nTracks + 1) * sizeof(DWORD));
-	for (i = 0; i <= CDADev[wDevID].nTracks; i++) {
-		if (i == CDADev[wDevID].nTracks)
+	memset(CDADev[index].lpdwTrackLen, 0, 
+		(CDADev[index].nTracks + 1) * sizeof(DWORD));
+	memset(CDADev[index].lpdwTrackPos, 0, 
+		(CDADev[index].nTracks + 1) * sizeof(DWORD));
+	for (i = 0; i <= CDADev[index].nTracks; i++) {
+		if (i == CDADev[index].nTracks)
 #ifdef linux
 			entry.cdte_track = CDROM_LEADOUT;
 #elif __FreeBSD__
@@ -179,7 +177,7 @@ static BOOL CDAUDIO_GetTracksInfo(UINT wDevID)
 		entry.data_len = sizeof(toc_buffer);
 	        entry.data = &toc_buffer;
 #endif
-		if (ioctl(CDADev[wDevID].unixdev, 
+		if (ioctl(CDADev[index].unixdev, 
 #ifdef linux
 			  CDROMREADTOCENTRY
 #elif __FreeBSD__
@@ -201,7 +199,7 @@ static BOOL CDAUDIO_GetTracksInfo(UINT wDevID)
 #endif
 		if (i == 0) {
 			last_start = start;
-			CDADev[wDevID].dwFirstOffset = start;
+			CDADev[index].dwFirstOffset = start;
             		dprintf_cdaudio(stddeb,
 				"CDAUDIO_GetTracksInfo // dwFirstOffset=%u\n", 
 				start);
@@ -211,14 +209,14 @@ static BOOL CDAUDIO_GetTracksInfo(UINT wDevID)
 			last_start = start;
 			start = last_start - length;
 			total_length += length;
-			CDADev[wDevID].lpdwTrackLen[i - 1] = length;
-			CDADev[wDevID].lpdwTrackPos[i - 1] = start;
+			CDADev[index].lpdwTrackLen[i - 1] = length;
+			CDADev[index].lpdwTrackPos[i - 1] = start;
             		dprintf_cdaudio(stddeb,
 			"CDAUDIO_GetTracksInfo // track #%u start=%u len=%u\n",
 				i, start, length);
 			}
 		}
-	CDADev[wDevID].dwTotalLen = total_length;
+	CDADev[index].dwTotalLen = total_length;
     	dprintf_cdaudio(stddeb,"CDAUDIO_GetTracksInfo // total_len=%u\n", 
 		total_length);
 	fflush(stdout);
@@ -232,45 +230,49 @@ static BOOL CDAUDIO_GetTracksInfo(UINT wDevID)
 /**************************************************************************
 * 				CDAUDIO_mciOpen			[internal]
 */
-static DWORD CDAUDIO_mciOpen(UINT wDevID, DWORD dwFlags, LPMCI_OPEN_PARMS lpParms)
+static DWORD CDAUDIO_mciOpen(UINT16 wDevID, DWORD dwFlags, LPMCI_OPEN_PARMS lpParms)
 {
 #if defined(linux) || defined(__FreeBSD__)
+	int index;
     	dprintf_cdaudio(stddeb,"CDAUDIO_mciOpen(%04X, %08lX, %p);\n", 
 					wDevID, dwFlags, lpParms);
 	if (lpParms == NULL) return MCIERR_INTERNAL;
+
 	wDevID = lpParms->wDeviceID;
-	if (CDADev[wDevID].nUseCount > 0) {
+	index = MMSYSTEM_DevIDToIndex(wDevID);
+
+	if (CDADev[index].nUseCount > 0) {
 		/* The driver already open on this channel */
 		/* If the driver was opened shareable before and this open specifies */
 		/* shareable then increment the use count */
-		if (CDADev[wDevID].fShareable && (dwFlags & MCI_OPEN_SHAREABLE))
-			++CDADev[wDevID].nUseCount;
+		if (CDADev[index].fShareable && (dwFlags & MCI_OPEN_SHAREABLE))
+			++CDADev[index].nUseCount;
 		else
 			return MCIERR_MUST_USE_SHAREABLE;
 		}
 	else {
-		CDADev[wDevID].nUseCount = 1;
-		CDADev[wDevID].fShareable = dwFlags & MCI_OPEN_SHAREABLE;
+		CDADev[index].nUseCount = 1;
+		CDADev[index].fShareable = dwFlags & MCI_OPEN_SHAREABLE;
 		}
     if (dwFlags & MCI_OPEN_ELEMENT) {
 		dprintf_cdaudio(stddeb,"CDAUDIO_mciOpen // MCI_OPEN_ELEMENT !\n");
 /*		return MCIERR_NO_ELEMENT_ALLOWED; */
 		}
-	memcpy(&CDADev[wDevID].openParms, lpParms, sizeof(MCI_OPEN_PARMS));
-	CDADev[wDevID].wNotifyDeviceID = lpParms->wDeviceID;
-	CDADev[wDevID].unixdev = open (CDAUDIO_DEV, O_RDONLY, 0);
-	if (CDADev[wDevID].unixdev == -1) {
+	memcpy(&CDADev[index].openParms, lpParms, sizeof(MCI_OPEN_PARMS));
+	CDADev[index].wNotifyDeviceID = lpParms->wDeviceID;
+	CDADev[index].unixdev = open (CDAUDIO_DEV, O_RDONLY, 0);
+	if (CDADev[index].unixdev == -1) {
 		dprintf_cdaudio(stddeb,"CDAUDIO_mciOpen // can't open '%s' !\n", CDAUDIO_DEV);
 		return MCIERR_HARDWARE;
 		}
-	CDADev[wDevID].mode = 0;
-	CDADev[wDevID].dwTimeFormat = MCI_FORMAT_TMSF;
-	CDADev[wDevID].nCurTrack = 0;
-	CDADev[wDevID].nTracks = 0;
-	CDADev[wDevID].dwTotalLen = 0;
-	CDADev[wDevID].dwFirstOffset = 0;
-	CDADev[wDevID].lpdwTrackLen = NULL;
-	CDADev[wDevID].lpdwTrackPos = NULL;
+	CDADev[index].mode = 0;
+	CDADev[index].dwTimeFormat = MCI_FORMAT_TMSF;
+	CDADev[index].nCurTrack = 0;
+	CDADev[index].nTracks = 0;
+	CDADev[index].dwTotalLen = 0;
+	CDADev[index].dwFirstOffset = 0;
+	CDADev[index].lpdwTrackLen = NULL;
+	CDADev[index].lpdwTrackPos = NULL;
 	if (!CDAUDIO_GetTracksInfo(wDevID)) {
 		dprintf_cdaudio(stddeb,"CDAUDIO_mciOpen // error reading TracksInfo !\n");
 /*		return MCIERR_INTERNAL; */
@@ -280,7 +282,7 @@ static DWORD CDAUDIO_mciOpen(UINT wDevID, DWORD dwFlags, LPMCI_OPEN_PARMS lpParm
 			"CDAUDIO_mciOpen // MCI_NOTIFY_SUCCESSFUL %08lX !\n", 
 			lpParms->dwCallback);
 		mciDriverNotify((HWND16)LOWORD(lpParms->dwCallback), 
-			CDADev[wDevID].wNotifyDeviceID, MCI_NOTIFY_SUCCESSFUL);
+			CDADev[index].wNotifyDeviceID, MCI_NOTIFY_SUCCESSFUL);
 		}
  	return 0;
 #else
@@ -291,14 +293,15 @@ static DWORD CDAUDIO_mciOpen(UINT wDevID, DWORD dwFlags, LPMCI_OPEN_PARMS lpParm
 /**************************************************************************
 * 				CDAUDIO_mciClose		[internal]
 */
-static DWORD CDAUDIO_mciClose(UINT wDevID, DWORD dwParam, LPMCI_GENERIC_PARMS lpParms)
+static DWORD CDAUDIO_mciClose(UINT16 wDevID, DWORD dwParam, LPMCI_GENERIC_PARMS lpParms)
 {
 #if defined(linux) || defined(__FreeBSD__)
-    	dprintf_cdaudio(stddeb,"CDAUDIO_mciClose(%u, %08lX, %p);\n", 
+	int index = MMSYSTEM_DevIDToIndex(wDevID);
+    	dprintf_cdaudio(stddeb,"CDAUDIO_mciClose(%04X, %08lX, %p);\n", 
 		wDevID, dwParam, lpParms);
-	if (CDADev[wDevID].lpdwTrackLen != NULL) free(CDADev[wDevID].lpdwTrackLen);
-	if (CDADev[wDevID].lpdwTrackPos != NULL) free(CDADev[wDevID].lpdwTrackPos);
-	close(CDADev[wDevID].unixdev);
+	if (CDADev[index].lpdwTrackLen != NULL) free(CDADev[index].lpdwTrackLen);
+	if (CDADev[index].lpdwTrackPos != NULL) free(CDADev[index].lpdwTrackPos);
+	close(CDADev[index].unixdev);
 #endif
         return 0;
 }
@@ -306,11 +309,11 @@ static DWORD CDAUDIO_mciClose(UINT wDevID, DWORD dwParam, LPMCI_GENERIC_PARMS lp
 /**************************************************************************
 * 				CDAUDIO_mciGetDevCaps	[internal]
 */
-static DWORD CDAUDIO_mciGetDevCaps(UINT wDevID, DWORD dwFlags, 
+static DWORD CDAUDIO_mciGetDevCaps(UINT16 wDevID, DWORD dwFlags, 
 						LPMCI_GETDEVCAPS_PARMS lpParms)
 {
 #if defined(linux) || defined(__FreeBSD__)
-    	dprintf_cdaudio(stddeb,"CDAUDIO_mciGetDevCaps(%u, %08lX, %p);\n", 
+    	dprintf_cdaudio(stddeb,"CDAUDIO_mciGetDevCaps(%04X, %08lX, %p);\n", 
 		wDevID, dwFlags, lpParms);
 	if (lpParms == NULL) return MCIERR_INTERNAL;
 	if (dwFlags & MCI_GETDEVCAPS_ITEM) {
@@ -361,10 +364,10 @@ static DWORD CDAUDIO_mciGetDevCaps(UINT wDevID, DWORD dwFlags,
 /**************************************************************************
 * 				CDAUDIO_mciInfo			[internal]
 */
-static DWORD CDAUDIO_mciInfo(UINT wDevID, DWORD dwFlags, LPMCI_INFO_PARMS lpParms)
+static DWORD CDAUDIO_mciInfo(UINT16 wDevID, DWORD dwFlags, LPMCI_INFO_PARMS lpParms)
 {
 #if defined(linux) || defined(__FreeBSD__)
-    	dprintf_cdaudio(stddeb,"CDAUDIO_mciInfo(%u, %08lX, %p);\n", 
+    	dprintf_cdaudio(stddeb,"CDAUDIO_mciInfo(%04X, %08lX, %p);\n", 
 		wDevID, dwFlags, lpParms);
 	if (lpParms == NULL) return MCIERR_INTERNAL;
 	lpParms->lpstrReturn = NULL;
@@ -389,13 +392,14 @@ static DWORD CDAUDIO_mciInfo(UINT wDevID, DWORD dwFlags, LPMCI_INFO_PARMS lpParm
 /**************************************************************************
 * 				CDAUDIO_CalcFrame			[internal]
 */
-static DWORD CDAUDIO_CalcFrame(UINT wDevID, DWORD dwFormatType, DWORD dwTime)
+static DWORD CDAUDIO_CalcFrame(UINT16 wDevID, DWORD dwFormatType, DWORD dwTime)
 {
 	DWORD	dwFrame = 0;
 #if defined(linux) || defined(__FreeBSD__)
-	UINT	wTrack;
+	int index = MMSYSTEM_DevIDToIndex(wDevID);
+	UINT16	wTrack;
     
-    	dprintf_cdaudio(stddeb,"CDAUDIO_CalcFrame(%u, %08lX, %lu);\n", 
+    	dprintf_cdaudio(stddeb,"CDAUDIO_CalcFrame(%04X, %08lX, %lu);\n", 
 		wDevID, dwFormatType, dwTime);
     
 	switch (dwFormatType) {
@@ -425,8 +429,8 @@ static DWORD CDAUDIO_CalcFrame(UINT wDevID, DWORD dwFormatType, DWORD dwTime)
 					MCI_TMSF_SECOND(dwTime), MCI_TMSF_FRAME(dwTime));
             		dprintf_cdaudio(stddeb,
 				"CDAUDIO_CalcFrame // TMSF trackpos[%u]=%lu\n",
-				wTrack, CDADev[wDevID].lpdwTrackPos[wTrack - 1]);
-			dwFrame = CDADev[wDevID].lpdwTrackPos[wTrack - 1];
+				wTrack, CDADev[index].lpdwTrackPos[wTrack - 1]);
+			dwFrame = CDADev[index].lpdwTrackPos[wTrack - 1];
 			dwFrame += CDFRAMES_PERMIN * MCI_TMSF_MINUTE(dwTime);
 			dwFrame += CDFRAMES_PERSEC * MCI_TMSF_SECOND(dwTime);
 			dwFrame += MCI_TMSF_FRAME(dwTime);
@@ -440,37 +444,38 @@ static DWORD CDAUDIO_CalcFrame(UINT wDevID, DWORD dwFormatType, DWORD dwTime)
 /**************************************************************************
 * 				CDAUDIO_GetCDStatus				[internal]
 */
-static BOOL CDAUDIO_GetCDStatus(UINT wDevID)
+static BOOL32 CDAUDIO_GetCDStatus(UINT16 wDevID)
 {
 #if defined(linux) || defined(__FreeBSD__)
-	int		oldmode = CDADev[wDevID].mode;
+	int index = MMSYSTEM_DevIDToIndex(wDevID);
+	int		oldmode = CDADev[index].mode;
 #ifdef __FreeBSD__
 	struct ioc_read_subchannel	read_sc;
 
 	read_sc.address_format = CD_MSF_FORMAT;
 	read_sc.data_format    = CD_CURRENT_POSITION;
 	read_sc.track          = 0;
-	read_sc.data_len       = sizeof(CDADev[wDevID].sc);
-	read_sc.data	       = (struct cd_sub_channel_info *)&CDADev[wDevID].sc;
+	read_sc.data_len       = sizeof(CDADev[index].sc);
+	read_sc.data	       = (struct cd_sub_channel_info *)&CDADev[index].sc;
 #elif linux
-	CDADev[wDevID].sc.cdsc_format = CDROM_MSF;
+	CDADev[index].sc.cdsc_format = CDROM_MSF;
 #endif
-	if (ioctl(CDADev[wDevID].unixdev,
+	if (ioctl(CDADev[index].unixdev,
 #ifdef linux
-		  CDROMSUBCHNL, &CDADev[wDevID].sc
+		  CDROMSUBCHNL, &CDADev[index].sc
 #elif __FreeBSD__
 		  CDIOCREADSUBCHANNEL, &read_sc
 #endif
 		  )) {
         	dprintf_cdaudio(stddeb,"CDAUDIO_GetCDStatus // opened or no_media !\n");
-		CDADev[wDevID].mode = MCI_MODE_NOT_READY;
+		CDADev[index].mode = MCI_MODE_NOT_READY;
 		return TRUE;
 		}
 	switch (
 #ifdef linux
-		CDADev[wDevID].sc.cdsc_audiostatus
+		CDADev[index].sc.cdsc_audiostatus
 #elif __FreeBSD__
-		CDADev[wDevID].sc.header.audio_status
+		CDADev[index].sc.header.audio_status
 #endif
 		) {
 #ifdef linux
@@ -480,9 +485,9 @@ static BOOL CDAUDIO_GetCDStatus(UINT wDevID)
 #endif
             		dprintf_cdaudio(stddeb,"CDAUDIO_GetCDStatus // device doesn't support status, returning NOT_READY.\n");
 #ifdef linux
-			CDADev[wDevID].mode = MCI_MODE_NOT_READY;
+			CDADev[index].mode = MCI_MODE_NOT_READY;
 #elif __FreeBSD__
-			CDADev[wDevID].mode = MCI_MODE_STOP;
+			CDADev[index].mode = MCI_MODE_STOP;
 #endif
 			break;
 #ifdef linux
@@ -490,7 +495,7 @@ static BOOL CDAUDIO_GetCDStatus(UINT wDevID)
 #elif __FreeBSD__
 		case CD_AS_NO_STATUS:
 #endif
-			CDADev[wDevID].mode = MCI_MODE_STOP;
+			CDADev[index].mode = MCI_MODE_STOP;
             		dprintf_cdaudio(stddeb,"CDAUDIO_GetCDStatus // MCI_MODE_STOP !\n");
 			break;
 #ifdef linux
@@ -498,7 +503,7 @@ static BOOL CDAUDIO_GetCDStatus(UINT wDevID)
 #elif __FreeBSD__
 		case CD_AS_PLAY_IN_PROGRESS:
 #endif
-			CDADev[wDevID].mode = MCI_MODE_PLAY;
+			CDADev[index].mode = MCI_MODE_PLAY;
             		dprintf_cdaudio(stddeb,"CDAUDIO_GetCDStatus // MCI_MODE_PLAY !\n");
 			break;
 #ifdef linux
@@ -506,45 +511,45 @@ static BOOL CDAUDIO_GetCDStatus(UINT wDevID)
 #elif __FreeBSD__
 		case CD_AS_PLAY_PAUSED:
 #endif
-			CDADev[wDevID].mode = MCI_MODE_PAUSE;
+			CDADev[index].mode = MCI_MODE_PAUSE;
             		dprintf_cdaudio(stddeb,"CDAUDIO_GetCDStatus // MCI_MODE_PAUSE !\n");
 			break;
 		default:
             		dprintf_cdaudio(stddeb,"CDAUDIO_GetCDStatus // status=%02X !\n",
 #ifdef linux
-					CDADev[wDevID].sc.cdsc_audiostatus
+					CDADev[index].sc.cdsc_audiostatus
 #elif __FreeBSD__
-					CDADev[wDevID].sc.header.audio_status
+					CDADev[index].sc.header.audio_status
 #endif
 					);
 		}
 #ifdef linux
-	CDADev[wDevID].nCurTrack = CDADev[wDevID].sc.cdsc_trk;
-	CDADev[wDevID].dwCurFrame = 
-		CDFRAMES_PERMIN * CDADev[wDevID].sc.cdsc_absaddr.msf.minute +
-		CDFRAMES_PERSEC * CDADev[wDevID].sc.cdsc_absaddr.msf.second +
-		CDADev[wDevID].sc.cdsc_absaddr.msf.frame;
+	CDADev[index].nCurTrack = CDADev[index].sc.cdsc_trk;
+	CDADev[index].dwCurFrame = 
+		CDFRAMES_PERMIN * CDADev[index].sc.cdsc_absaddr.msf.minute +
+		CDFRAMES_PERSEC * CDADev[index].sc.cdsc_absaddr.msf.second +
+		CDADev[index].sc.cdsc_absaddr.msf.frame;
 #elif __FreeBSD__
-	CDADev[wDevID].nCurTrack = CDADev[wDevID].sc.what.position.track_number;
-	CDADev[wDevID].dwCurFrame = 
-		CDFRAMES_PERMIN * CDADev[wDevID].sc.what.position.absaddr.msf.minute +
-		CDFRAMES_PERSEC * CDADev[wDevID].sc.what.position.absaddr.msf.second +
-		CDADev[wDevID].sc.what.position.absaddr.msf.frame;
+	CDADev[index].nCurTrack = CDADev[index].sc.what.position.track_number;
+	CDADev[index].dwCurFrame = 
+		CDFRAMES_PERMIN * CDADev[index].sc.what.position.absaddr.msf.minute +
+		CDFRAMES_PERSEC * CDADev[index].sc.what.position.absaddr.msf.second +
+		CDADev[index].sc.what.position.absaddr.msf.frame;
 #endif
     	dprintf_cdaudio(stddeb,"CDAUDIO_GetCDStatus // %02u-%02u:%02u:%02u \n",
 #ifdef linux
-		CDADev[wDevID].sc.cdsc_trk,
-		CDADev[wDevID].sc.cdsc_absaddr.msf.minute,
-		CDADev[wDevID].sc.cdsc_absaddr.msf.second,
-		CDADev[wDevID].sc.cdsc_absaddr.msf.frame
+		CDADev[index].sc.cdsc_trk,
+		CDADev[index].sc.cdsc_absaddr.msf.minute,
+		CDADev[index].sc.cdsc_absaddr.msf.second,
+		CDADev[index].sc.cdsc_absaddr.msf.frame
 #elif __FreeBSD__
-		CDADev[wDevID].sc.what.position.track_number,
-		CDADev[wDevID].sc.what.position.absaddr.msf.minute,
-		CDADev[wDevID].sc.what.position.absaddr.msf.second,
-		CDADev[wDevID].sc.what.position.absaddr.msf.frame
+		CDADev[index].sc.what.position.track_number,
+		CDADev[index].sc.what.position.absaddr.msf.minute,
+		CDADev[index].sc.what.position.absaddr.msf.second,
+		CDADev[index].sc.what.position.absaddr.msf.frame
 #endif
 			);
-	if (oldmode != CDADev[wDevID].mode && oldmode == MCI_MODE_OPEN) {
+	if (oldmode != CDADev[index].mode && oldmode == MCI_MODE_OPEN) {
 		if (!CDAUDIO_GetTracksInfo(wDevID)) {
             dprintf_cdaudio(stddeb,"CDAUDIO_GetCDStatus // error updating TracksInfo !\n");
 			return MCIERR_INTERNAL;
@@ -560,15 +565,16 @@ static BOOL CDAUDIO_GetCDStatus(UINT wDevID)
 /**************************************************************************
 * 				CDAUDIO_CalcTime			[internal]
 */
-static DWORD CDAUDIO_CalcTime(UINT wDevID, DWORD dwFormatType, DWORD dwFrame)
+static DWORD CDAUDIO_CalcTime(UINT16 wDevID, DWORD dwFormatType, DWORD dwFrame)
 {
 	DWORD	dwTime = 0;
 #if defined(linux) || defined(__FreeBSD__)
-	UINT	wTrack;
-	UINT	wMinutes;
-	UINT	wSeconds;
-	UINT	wFrames;
-    	dprintf_cdaudio(stddeb,"CDAUDIO_CalcTime(%u, %08lX, %lu);\n", 
+	int index = MMSYSTEM_DevIDToIndex(wDevID);
+	UINT16	wTrack;
+	UINT16	wMinutes;
+	UINT16	wSeconds;
+	UINT16	wFrames;
+    	dprintf_cdaudio(stddeb,"CDAUDIO_CalcTime(%04X, %08lX, %lu);\n", 
 		wDevID, dwFormatType, dwFrame);
 
 	switch (dwFormatType) {
@@ -591,11 +597,11 @@ static DWORD CDAUDIO_CalcTime(UINT wDevID, DWORD dwFormatType, DWORD dwFrame)
 			/* unknown format ! force TMSF ! ... */
 			dwFormatType = MCI_FORMAT_TMSF;
 		case MCI_FORMAT_TMSF:
-			for (wTrack = 0; wTrack < CDADev[wDevID].nTracks; wTrack++) {
-/*				dwTime += CDADev[wDevID].lpdwTrackLen[wTrack - 1];
+			for (wTrack = 0; wTrack < CDADev[index].nTracks; wTrack++) {
+/*				dwTime += CDADev[index].lpdwTrackLen[wTrack - 1];
 				printf("Adding trk#%u curpos=%u \n", dwTime);
 				if (dwTime >= dwFrame) break; */
-				if (CDADev[wDevID].lpdwTrackPos[wTrack - 1] >= dwFrame) break;
+				if (CDADev[index].lpdwTrackPos[wTrack - 1] >= dwFrame) break;
 				}
 			wMinutes = dwFrame / CDFRAMES_PERMIN;
 			wSeconds = (dwFrame - CDFRAMES_PERMIN * wMinutes) / CDFRAMES_PERSEC;
@@ -615,29 +621,30 @@ static DWORD CDAUDIO_CalcTime(UINT wDevID, DWORD dwFormatType, DWORD dwFrame)
 /**************************************************************************
 * 				CDAUDIO_mciStatus		[internal]
 */
-static DWORD CDAUDIO_mciStatus(UINT wDevID, DWORD dwFlags, LPMCI_STATUS_PARMS lpParms)
+static DWORD CDAUDIO_mciStatus(UINT16 wDevID, DWORD dwFlags, LPMCI_STATUS_PARMS lpParms)
 {
 #if defined(linux) || defined(__FreeBSD__)
-    	dprintf_cdaudio(stddeb,"CDAUDIO_mciStatus(%u, %08lX, %p);\n", 
+	int index = MMSYSTEM_DevIDToIndex(wDevID);
+    	dprintf_cdaudio(stddeb,"CDAUDIO_mciStatus(%04X, %08lX, %p);\n", 
 		wDevID, dwFlags, lpParms);
 	if (lpParms == NULL) return MCIERR_INTERNAL;
-	if (CDADev[wDevID].unixdev == 0) return MMSYSERR_NOTENABLED;
+	if (CDADev[index].unixdev == 0) return MMSYSERR_NOTENABLED;
 	if (dwFlags & MCI_NOTIFY) {
         	dprintf_cdaudio(stddeb,
 			"CDAUDIO_mciStatus // MCI_NOTIFY_SUCCESSFUL %08lX !\n", 
 			lpParms->dwCallback);
 		mciDriverNotify((HWND16)LOWORD(lpParms->dwCallback), 
-			CDADev[wDevID].wNotifyDeviceID, MCI_NOTIFY_SUCCESSFUL);
+			CDADev[index].wNotifyDeviceID, MCI_NOTIFY_SUCCESSFUL);
 		}
 	if (dwFlags & MCI_STATUS_ITEM) {
 		switch(lpParms->dwItem) {
 			case MCI_STATUS_CURRENT_TRACK:
 				if (!CDAUDIO_GetCDStatus(wDevID)) return MCIERR_INTERNAL;
-				lpParms->dwReturn = CDADev[wDevID].nCurTrack;
+				lpParms->dwReturn = CDADev[index].nCurTrack;
                 		dprintf_cdaudio(stddeb,"CDAUDIO_mciStatus // CURRENT_TRACK=%lu!\n", lpParms->dwReturn);
 			 	return 0;
 			case MCI_STATUS_LENGTH:
-				if (CDADev[wDevID].nTracks == 0) {
+				if (CDADev[index].nTracks == 0) {
 					if (!CDAUDIO_GetTracksInfo(wDevID)) {
                         			dprintf_cdaudio(stddeb,"CDAUDIO_mciStatus // error reading TracksInfo !\n");
 						return MCIERR_INTERNAL;
@@ -646,24 +653,24 @@ static DWORD CDAUDIO_mciStatus(UINT wDevID, DWORD dwFlags, LPMCI_STATUS_PARMS lp
 				if (dwFlags & MCI_TRACK) {
 					dprintf_cdaudio(stddeb,"CDAUDIO_mciStatus // MCI_TRACK #%lu LENGTH=??? !\n",
 							lpParms->dwTrack);
-					if (lpParms->dwTrack > CDADev[wDevID].nTracks)
+					if (lpParms->dwTrack > CDADev[index].nTracks)
 						return MCIERR_OUTOFRANGE;
-					lpParms->dwReturn = CDADev[wDevID].lpdwTrackLen[lpParms->dwTrack];
+					lpParms->dwReturn = CDADev[index].lpdwTrackLen[lpParms->dwTrack];
 					}
 				else
-					lpParms->dwReturn = CDADev[wDevID].dwTotalLen;
+					lpParms->dwReturn = CDADev[index].dwTotalLen;
 				lpParms->dwReturn = CDAUDIO_CalcTime(wDevID, 
-					CDADev[wDevID].dwTimeFormat, lpParms->dwReturn);
+					CDADev[index].dwTimeFormat, lpParms->dwReturn);
                 		dprintf_cdaudio(stddeb,"CDAUDIO_mciStatus // LENGTH=%lu !\n", lpParms->dwReturn);
 			 	return 0;
 			case MCI_STATUS_MODE:
 				if (!CDAUDIO_GetCDStatus(wDevID)) return MCIERR_INTERNAL;
-				lpParms->dwReturn = CDADev[wDevID].mode;
+				lpParms->dwReturn = CDADev[index].mode;
                 		dprintf_cdaudio(stddeb,"CDAUDIO_mciStatus // MCI_STATUS_MODE=%08lX !\n",
 												lpParms->dwReturn);
 			 	return 0;
 			case MCI_STATUS_MEDIA_PRESENT:
-				lpParms->dwReturn = (CDADev[wDevID].nTracks > 0) ? TRUE : FALSE;
+				lpParms->dwReturn = (CDADev[index].nTracks > 0) ? TRUE : FALSE;
 				if (lpParms->dwReturn == FALSE)
                     			dprintf_cdaudio(stddeb,"CDAUDIO_mciStatus // MEDIA_NOT_PRESENT !\n");
 				else
@@ -677,19 +684,19 @@ static DWORD CDAUDIO_mciStatus(UINT wDevID, DWORD dwFlags, LPMCI_STATUS_PARMS lp
 			 	return 0;
 			case MCI_STATUS_POSITION:
 				if (!CDAUDIO_GetCDStatus(wDevID)) return MCIERR_INTERNAL;
-				lpParms->dwReturn = CDADev[wDevID].dwCurFrame;
+				lpParms->dwReturn = CDADev[index].dwCurFrame;
 				if (dwFlags & MCI_STATUS_START) {
-					lpParms->dwReturn = CDADev[wDevID].dwFirstOffset;
+					lpParms->dwReturn = CDADev[index].dwFirstOffset;
                     			dprintf_cdaudio(stddeb,"CDAUDIO_mciStatus // get MCI_STATUS_START !\n");
 					}
 				if (dwFlags & MCI_TRACK) {
-					if (lpParms->dwTrack > CDADev[wDevID].nTracks)
+					if (lpParms->dwTrack > CDADev[index].nTracks)
 						return MCIERR_OUTOFRANGE;
-					lpParms->dwReturn = CDADev[wDevID].lpdwTrackPos[lpParms->dwTrack - 1];
+					lpParms->dwReturn = CDADev[index].lpdwTrackPos[lpParms->dwTrack - 1];
                     			dprintf_cdaudio(stddeb,"CDAUDIO_mciStatus // get MCI_TRACK #%lu !\n", lpParms->dwTrack);
 					}
 				lpParms->dwReturn = CDAUDIO_CalcTime(wDevID,
-					CDADev[wDevID].dwTimeFormat, lpParms->dwReturn);
+					CDADev[index].dwTimeFormat, lpParms->dwReturn);
                 			dprintf_cdaudio(stddeb,"CDAUDIO_mciStatus // MCI_STATUS_POSITION=%08lX !\n",
 														lpParms->dwReturn);
 			 	return 0;
@@ -699,7 +706,7 @@ static DWORD CDAUDIO_mciStatus(UINT wDevID, DWORD dwFlags, LPMCI_STATUS_PARMS lp
 			 	return 0;
 			case MCI_STATUS_TIME_FORMAT:
                 		dprintf_cdaudio(stddeb,"CDAUDIO_mciStatus // MCI_STATUS_TIME_FORMAT !\n");
-				lpParms->dwReturn = CDADev[wDevID].dwTimeFormat;
+				lpParms->dwReturn = CDADev[index].dwTimeFormat;
 			 	return 0;
 			default:
                 		dprintf_cdaudio(stddeb,"CDAUDIO_mciStatus // unknown command %08lX !\n", lpParms->dwItem);
@@ -717,36 +724,37 @@ static DWORD CDAUDIO_mciStatus(UINT wDevID, DWORD dwFlags, LPMCI_STATUS_PARMS lp
 /**************************************************************************
 * 				CDAUDIO_mciPlay			[internal]
 */
-static DWORD CDAUDIO_mciPlay(UINT wDevID, DWORD dwFlags, LPMCI_PLAY_PARMS lpParms)
+static DWORD CDAUDIO_mciPlay(UINT16 wDevID, DWORD dwFlags, LPMCI_PLAY_PARMS lpParms)
 {
 #if defined(linux) || defined(__FreeBSD__)
+	int index = MMSYSTEM_DevIDToIndex(wDevID);
 	int 	start, end;
 #ifdef linux
 	struct 	cdrom_msf	msf;
 #elif __FreeBSD__
 	struct	ioc_play_msf	msf;
 #endif
-    	dprintf_cdaudio(stddeb,"CDAUDIO_mciPlay(%u, %08lX, %p);\n", 
+    	dprintf_cdaudio(stddeb,"CDAUDIO_mciPlay(%04X, %08lX, %p);\n", 
 		wDevID, dwFlags, lpParms);
 	if (lpParms == NULL) return MCIERR_INTERNAL;
-	if (CDADev[wDevID].unixdev == 0) return MMSYSERR_NOTENABLED;
-	start = 0; 		end = CDADev[wDevID].dwTotalLen;
-	CDADev[wDevID].nCurTrack = 1;
+	if (CDADev[index].unixdev == 0) return MMSYSERR_NOTENABLED;
+	start = 0; 		end = CDADev[index].dwTotalLen;
+	CDADev[index].nCurTrack = 1;
 	if (dwFlags & MCI_FROM) {
 		start = CDAUDIO_CalcFrame(wDevID, 
-			CDADev[wDevID].dwTimeFormat, lpParms->dwFrom); 
+			CDADev[index].dwTimeFormat, lpParms->dwFrom); 
         dprintf_cdaudio(stddeb,"CDAUDIO_mciPlay // MCI_FROM=%08lX -> %u \n",
 				lpParms->dwFrom, start);
 		}
 	if (dwFlags & MCI_TO) {
 		end = CDAUDIO_CalcFrame(wDevID, 
-			CDADev[wDevID].dwTimeFormat, lpParms->dwTo);
+			CDADev[index].dwTimeFormat, lpParms->dwTo);
         	dprintf_cdaudio(stddeb,
 			"CDAUDIO_mciPlay // MCI_TO=%08lX -> %u \n",
 			lpParms->dwTo, end);
 		}
-	start += CDADev[wDevID].dwFirstOffset;	
-	end += CDADev[wDevID].dwFirstOffset;
+	start += CDADev[index].dwFirstOffset;	
+	end += CDADev[index].dwFirstOffset;
 #ifdef linux
 	msf.cdmsf_min0 = start / CDFRAMES_PERMIN;
 	msf.cdmsf_sec0 = (start % CDFRAMES_PERMIN) / CDFRAMES_PERSEC;
@@ -762,7 +770,7 @@ static DWORD CDAUDIO_mciPlay(UINT wDevID, DWORD dwFlags, LPMCI_PLAY_PARMS lpParm
         msf.end_s       = (end % CDFRAMES_PERMIN) / CDFRAMES_PERSEC;
         msf.end_f       = end % CDFRAMES_PERSEC;
 #endif
-	if (ioctl(CDADev[wDevID].unixdev,
+	if (ioctl(CDADev[index].unixdev,
 #ifdef linux
 		  CDROMSTART
 #elif __FreeBSD__
@@ -772,7 +780,7 @@ static DWORD CDAUDIO_mciPlay(UINT wDevID, DWORD dwFlags, LPMCI_PLAY_PARMS lpParm
         	dprintf_cdaudio(stddeb,"CDAUDIO_mciPlay // motor doesn't start !\n");
 		return MCIERR_HARDWARE;
 		}
-	if (ioctl(CDADev[wDevID].unixdev, 
+	if (ioctl(CDADev[index].unixdev, 
 #ifdef linux
 		  CDROMPLAYMSF
 #elif __FreeBSD__
@@ -791,14 +799,14 @@ static DWORD CDAUDIO_mciPlay(UINT wDevID, DWORD dwFlags, LPMCI_PLAY_PARMS lpParm
 		msf.end_m,   msf.end_s,   msf.end_f
 #endif
 			);
-	CDADev[wDevID].mode = MCI_MODE_PLAY;
+	CDADev[index].mode = MCI_MODE_PLAY;
 	if (dwFlags & MCI_NOTIFY) {
         	dprintf_cdaudio(stddeb,
 			"CDAUDIO_mciPlay // MCI_NOTIFY_SUCCESSFUL %08lX !\n", 
 			lpParms->dwCallback);
 /*
 		mciDriverNotify((HWND16)LOWORD(lpParms->dwCallback), 
-			CDADev[wDevID].wNotifyDeviceID, MCI_NOTIFY_SUCCESSFUL);
+			CDADev[index].wNotifyDeviceID, MCI_NOTIFY_SUCCESSFUL);
 */
 		}
 	return 0;
@@ -810,26 +818,27 @@ static DWORD CDAUDIO_mciPlay(UINT wDevID, DWORD dwFlags, LPMCI_PLAY_PARMS lpParm
 /**************************************************************************
 * 				CDAUDIO_mciStop			[internal]
 */
-static DWORD CDAUDIO_mciStop(UINT wDevID, DWORD dwFlags, LPMCI_GENERIC_PARMS lpParms)
+static DWORD CDAUDIO_mciStop(UINT16 wDevID, DWORD dwFlags, LPMCI_GENERIC_PARMS lpParms)
 {
 #if defined(linux) || defined(__FreeBSD__)
-    	dprintf_cdaudio(stddeb,"CDAUDIO_mciStop(%u, %08lX, %p);\n", 
+	int index = MMSYSTEM_DevIDToIndex(wDevID);
+    	dprintf_cdaudio(stddeb,"CDAUDIO_mciStop(%04X, %08lX, %p);\n", 
 		wDevID, dwFlags, lpParms);
 	if (lpParms == NULL) return MCIERR_INTERNAL;
-	if (ioctl(CDADev[wDevID].unixdev,
+	if (ioctl(CDADev[index].unixdev,
 #ifdef linux
 		  CDROMSTOP
 #elif __FreeBSD__
 		  CDIOCSTOP
 #endif
 		  )) return MCIERR_HARDWARE;
-	CDADev[wDevID].mode = MCI_MODE_STOP;
+	CDADev[index].mode = MCI_MODE_STOP;
 	if (dwFlags & MCI_NOTIFY) {
         	dprintf_cdaudio(stddeb,
 			"CDAUDIO_mciStop // MCI_NOTIFY_SUCCESSFUL %08lX !\n", 
 			lpParms->dwCallback);
 		mciDriverNotify((HWND16)LOWORD(lpParms->dwCallback), 
-			CDADev[wDevID].wNotifyDeviceID, MCI_NOTIFY_SUCCESSFUL);
+			CDADev[index].wNotifyDeviceID, MCI_NOTIFY_SUCCESSFUL);
 		}
  	return 0;
 #else
@@ -840,26 +849,27 @@ static DWORD CDAUDIO_mciStop(UINT wDevID, DWORD dwFlags, LPMCI_GENERIC_PARMS lpP
 /**************************************************************************
 * 				CDAUDIO_mciPause		[internal]
 */
-static DWORD CDAUDIO_mciPause(UINT wDevID, DWORD dwFlags, LPMCI_GENERIC_PARMS lpParms)
+static DWORD CDAUDIO_mciPause(UINT16 wDevID, DWORD dwFlags, LPMCI_GENERIC_PARMS lpParms)
 {
 #if defined(linux) || defined(__FreeBSD__)
-    	dprintf_cdaudio(stddeb,"CDAUDIO_mciPause(%u, %08lX, %p);\n", 
+	int index = MMSYSTEM_DevIDToIndex(wDevID);
+    	dprintf_cdaudio(stddeb,"CDAUDIO_mciPause(%04X, %08lX, %p);\n", 
 		wDevID, dwFlags, lpParms);
 	if (lpParms == NULL) return MCIERR_INTERNAL;
-	if (ioctl(CDADev[wDevID].unixdev,
+	if (ioctl(CDADev[index].unixdev,
 #ifdef linux
 		  CDROMPAUSE
 #elif __FreeBSD__
 		  CDIOCPAUSE
 #endif
 		  )) return MCIERR_HARDWARE;
-	CDADev[wDevID].mode = MCI_MODE_PAUSE;
+	CDADev[index].mode = MCI_MODE_PAUSE;
 	if (dwFlags & MCI_NOTIFY) {
         dprintf_cdaudio(stddeb,
 		"CDAUDIO_mciPause // MCI_NOTIFY_SUCCESSFUL %08lX !\n", 
 		lpParms->dwCallback);
 		mciDriverNotify((HWND16)LOWORD(lpParms->dwCallback), 
-			CDADev[wDevID].wNotifyDeviceID, MCI_NOTIFY_SUCCESSFUL);
+			CDADev[index].wNotifyDeviceID, MCI_NOTIFY_SUCCESSFUL);
 		}
 	return 0;
 #else
@@ -870,26 +880,27 @@ static DWORD CDAUDIO_mciPause(UINT wDevID, DWORD dwFlags, LPMCI_GENERIC_PARMS lp
 /**************************************************************************
 * 				CDAUDIO_mciResume		[internal]
 */
-static DWORD CDAUDIO_mciResume(UINT wDevID, DWORD dwFlags, LPMCI_GENERIC_PARMS lpParms)
+static DWORD CDAUDIO_mciResume(UINT16 wDevID, DWORD dwFlags, LPMCI_GENERIC_PARMS lpParms)
 {
 #if defined(linux) || defined(__FreeBSD__)
-    	dprintf_cdaudio(stddeb,"CDAUDIO_mciResume(%u, %08lX, %p);\n", 
+	int index = MMSYSTEM_DevIDToIndex(wDevID);
+    	dprintf_cdaudio(stddeb,"CDAUDIO_mciResume(%04X, %08lX, %p);\n", 
 		wDevID, dwFlags, lpParms);
 	if (lpParms == NULL) return MCIERR_INTERNAL;
-	if (ioctl(CDADev[wDevID].unixdev, 
+	if (ioctl(CDADev[index].unixdev, 
 #ifdef linux
 		  CDROMRESUME
 #elif __FreeBSD__
 		  CDIOCRESUME
 #endif
 		  )) return MCIERR_HARDWARE;
-	CDADev[wDevID].mode = MCI_MODE_STOP;
+	CDADev[index].mode = MCI_MODE_STOP;
 	if (dwFlags & MCI_NOTIFY) {
         	dprintf_cdaudio(stddeb,
 			"CDAUDIO_mciResume // MCI_NOTIFY_SUCCESSFUL %08lX !\n", 
 			lpParms->dwCallback);
 		mciDriverNotify((HWND16)LOWORD(lpParms->dwCallback), 
-			CDADev[wDevID].wNotifyDeviceID, MCI_NOTIFY_SUCCESSFUL);
+			CDADev[index].wNotifyDeviceID, MCI_NOTIFY_SUCCESSFUL);
 		}
 	return 0;
 #else
@@ -900,15 +911,16 @@ static DWORD CDAUDIO_mciResume(UINT wDevID, DWORD dwFlags, LPMCI_GENERIC_PARMS l
 /**************************************************************************
 * 				CDAUDIO_mciSeek			[internal]
 */
-static DWORD CDAUDIO_mciSeek(UINT wDevID, DWORD dwFlags, LPMCI_SEEK_PARMS lpParms)
+static DWORD CDAUDIO_mciSeek(UINT16 wDevID, DWORD dwFlags, LPMCI_SEEK_PARMS lpParms)
 {
 #if defined(linux) || defined(__FreeBSD__)
+	int index = MMSYSTEM_DevIDToIndex(wDevID);
 	DWORD	dwRet;
 	MCI_PLAY_PARMS PlayParms;
-    	dprintf_cdaudio(stddeb,"CDAUDIO_mciSeek(%u, %08lX, %p);\n", 
+    	dprintf_cdaudio(stddeb,"CDAUDIO_mciSeek(%04X, %08lX, %p);\n", 
 		wDevID, dwFlags, lpParms);
 	if (lpParms == NULL) return MCIERR_INTERNAL;
-	if (ioctl(CDADev[wDevID].unixdev,
+	if (ioctl(CDADev[index].unixdev,
 #ifdef linux
 		  CDROMRESUME
 #elif __FreeBSD__
@@ -918,13 +930,13 @@ static DWORD CDAUDIO_mciSeek(UINT wDevID, DWORD dwFlags, LPMCI_SEEK_PARMS lpParm
 		perror("ioctl CDROMRESUME");
 		return MCIERR_HARDWARE;
 	}
-	CDADev[wDevID].mode = MCI_MODE_SEEK;
+	CDADev[index].mode = MCI_MODE_SEEK;
 	switch(dwFlags) {
 		case MCI_SEEK_TO_START:
 			PlayParms.dwFrom = 0;
 			break;
 		case MCI_SEEK_TO_END:
-			PlayParms.dwFrom = CDADev[wDevID].dwTotalLen;
+			PlayParms.dwFrom = CDADev[index].dwTotalLen;
 			break;
 		case MCI_TO:
 			PlayParms.dwFrom = lpParms->dwTo;
@@ -938,7 +950,7 @@ static DWORD CDAUDIO_mciSeek(UINT wDevID, DWORD dwFlags, LPMCI_SEEK_PARMS lpParm
 			"CDAUDIO_mciSeek // MCI_NOTIFY_SUCCESSFUL %08lX !\n", 
 			lpParms->dwCallback);
 		mciDriverNotify((HWND16)LOWORD(lpParms->dwCallback), 
-			CDADev[wDevID].wNotifyDeviceID, MCI_NOTIFY_SUCCESSFUL);
+			CDADev[index].wNotifyDeviceID, MCI_NOTIFY_SUCCESSFUL);
 		}
 	return dwRet;
 #else
@@ -950,10 +962,11 @@ static DWORD CDAUDIO_mciSeek(UINT wDevID, DWORD dwFlags, LPMCI_SEEK_PARMS lpParm
 /**************************************************************************
 * 				CDAUDIO_mciSet			[internal]
 */
-static DWORD CDAUDIO_mciSet(UINT wDevID, DWORD dwFlags, LPMCI_SET_PARMS lpParms)
+static DWORD CDAUDIO_mciSet(UINT16 wDevID, DWORD dwFlags, LPMCI_SET_PARMS lpParms)
 {
 #if defined(linux) || defined(__FreeBSD__)
-    	dprintf_cdaudio(stddeb,"CDAUDIO_mciSet(%u, %08lX, %p);\n", 
+	int index = MMSYSTEM_DevIDToIndex(wDevID);
+    	dprintf_cdaudio(stddeb,"CDAUDIO_mciSet(%04X, %08lX, %p);\n", 
 		wDevID, dwFlags, lpParms);
 	if (lpParms == NULL) return MCIERR_INTERNAL;
 /*
@@ -976,32 +989,32 @@ static DWORD CDAUDIO_mciSet(UINT wDevID, DWORD dwFlags, LPMCI_SET_PARMS lpParms)
                 		dprintf_cdaudio(stddeb,"CDAUDIO_mciSet // bad time format !\n");
 				return MCIERR_BAD_TIME_FORMAT;
 			}
-		CDADev[wDevID].dwTimeFormat = lpParms->dwTimeFormat;
+		CDADev[index].dwTimeFormat = lpParms->dwTimeFormat;
 		}
 	if (dwFlags & MCI_SET_DOOR_OPEN) {
         	dprintf_cdaudio(stddeb,
 			"CDAUDIO_mciSet // MCI_SET_DOOR_OPEN !\n");
 #ifdef __FreeBSD__
-		if (ioctl(CDADev[wDevID].unixdev, CDIOCALLOW)) return MCIERR_HARDWARE;
-		if (ioctl(CDADev[wDevID].unixdev, CDIOCEJECT)) return MCIERR_HARDWARE;
-		if (ioctl(CDADev[wDevID].unixdev, CDIOCPREVENT)) return MCIERR_HARDWARE;
+		if (ioctl(CDADev[index].unixdev, CDIOCALLOW)) return MCIERR_HARDWARE;
+		if (ioctl(CDADev[index].unixdev, CDIOCEJECT)) return MCIERR_HARDWARE;
+		if (ioctl(CDADev[index].unixdev, CDIOCPREVENT)) return MCIERR_HARDWARE;
 #elif linux
-		if (ioctl(CDADev[wDevID].unixdev, CDROMEJECT)) return MCIERR_HARDWARE;
+		if (ioctl(CDADev[index].unixdev, CDROMEJECT)) return MCIERR_HARDWARE;
 #endif
-		CDADev[wDevID].nTracks = 0;
+		CDADev[index].nTracks = 0;
 		}
 	if (dwFlags & MCI_SET_DOOR_CLOSED) {
         	dprintf_cdaudio(stddeb,
 			"CDAUDIO_mciSet // MCI_SET_DOOR_CLOSED !\n");
 #ifdef __FreeBSD__
-                if (ioctl(CDADev[wDevID].unixdev, CDIOCALLOW)) return MCIERR_HARDWARE;
-                if (ioctl(CDADev[wDevID].unixdev, CDIOCCLOSE)) return MCIERR_HARDWARE;
-                if (ioctl(CDADev[wDevID].unixdev, CDIOCPREVENT)) return MCIERR_HARDWARE;
+                if (ioctl(CDADev[index].unixdev, CDIOCALLOW)) return MCIERR_HARDWARE;
+                if (ioctl(CDADev[index].unixdev, CDIOCCLOSE)) return MCIERR_HARDWARE;
+                if (ioctl(CDADev[index].unixdev, CDIOCPREVENT)) return MCIERR_HARDWARE;
 #elif linux
-		if (ioctl(CDADev[wDevID].unixdev, CDROMEJECT)) return MCIERR_HARDWARE;
+		if (ioctl(CDADev[index].unixdev, CDROMEJECT)) return MCIERR_HARDWARE;
 			  /* XXX should it be ",1" ??? */
 #endif
-		CDADev[wDevID].nTracks = 0;
+		CDADev[index].nTracks = 0;
 		}
 	if (dwFlags & MCI_SET_VIDEO) return MCIERR_UNSUPPORTED_FUNCTION;
 	if (dwFlags & MCI_SET_ON) return MCIERR_UNSUPPORTED_FUNCTION;
@@ -1011,7 +1024,7 @@ static DWORD CDAUDIO_mciSet(UINT wDevID, DWORD dwFlags, LPMCI_SET_PARMS lpParms)
 			"CDAUDIO_mciSet // MCI_NOTIFY_SUCCESSFUL %08lX !\n", 
 			lpParms->dwCallback);
 		mciDriverNotify((HWND16)LOWORD(lpParms->dwCallback), 
-			CDADev[wDevID].wNotifyDeviceID, MCI_NOTIFY_SUCCESSFUL);
+			CDADev[index].wNotifyDeviceID, MCI_NOTIFY_SUCCESSFUL);
 		}
 	return 0;
 #else
@@ -1114,5 +1127,3 @@ LONG CDAUDIO_DriverProc(DWORD dwDevID, HDRVR16 hDriv, WORD wMsg,
 
 
 /*-----------------------------------------------------------------------*/
-
-#endif /* #ifdef BUILTIN_MMSYSTEM */
diff --git a/multimedia/mcistring.c b/multimedia/mcistring.c
index 91af08dc8a9..f61679cb0d8 100644
--- a/multimedia/mcistring.c
+++ b/multimedia/mcistring.c
@@ -6,8 +6,6 @@
 /* FIXME: special commands of device drivers should be handled by those drivers
  */
 
-#ifndef WINELIB
-
 #include <unistd.h>
 #include <stdio.h>
 #include <stdlib.h>
@@ -32,6 +30,13 @@ extern MCI_OPEN_DRIVER_PARMS	mciDrv[MAXMCIDRIVERS];
  */
 extern MCI_OPEN_PARMS		mciOpenDrv[MAXMCIDRIVERS];
 
+#define GetDrv(wDevID) (&mciDrv[MMSYSTEM_DevIDToIndex(wDevID)])
+#define GetOpenDrv(wDevID) (&mciOpenDrv[MMSYSTEM_DevIDToIndex(wDevID)])
+extern int MMSYSTEM_DevIDToIndex(UINT16 wDevID);
+extern UINT16 MMSYSTEM_FirstDevID(void);
+extern UINT16 MMSYSTEM_NextDevID(UINT16 wDevID);
+extern BOOL32 MMSYSTEM_DevIDValid(UINT16 wDevID);
+
 LONG DrvDefDriverProc(DWORD dwDevID, HDRVR16 hDriv, WORD wMsg, 
 		      DWORD dwParam1, DWORD dwParam2);
 
@@ -51,8 +56,8 @@ LONG ANIM_DriverProc(DWORD dwDevID, HDRVR16 hDriv, WORD wMsg,
 
 /* standard functionparameters for all functions */
 #define _MCISTR_PROTO_ \
-	WORD wDevID,WORD uDevTyp,LPSTR lpstrReturnString,UINT uReturnLength,\
-	LPCSTR dev,LPSTR *keywords,UINT nrofkeywords,DWORD dwFlags
+	WORD wDevID,WORD uDevTyp,LPSTR lpstrReturnString,UINT16 uReturnLength,\
+	LPCSTR dev,LPSTR *keywords,UINT16 nrofkeywords,DWORD dwFlags
 
 /* copy string to return pointer including necessary checks 
  * for use in mciSendString()
@@ -69,16 +74,16 @@ LONG ANIM_DriverProc(DWORD dwDevID, HDRVR16 hDriv, WORD wMsg,
 #define _MCI_CALL_DRIVER(cmd,params) \
 	switch(uDevTyp) {\
 	case MCI_DEVTYPE_CD_AUDIO:\
-		res=CDAUDIO_DriverProc(mciDrv[wDevID].wDeviceID,0,cmd,dwFlags, (DWORD)(params));\
+		res=CDAUDIO_DriverProc(GetDrv(wDevID)->wDeviceID,0,cmd,dwFlags, (DWORD)(params));\
 		break;\
 	case MCI_DEVTYPE_WAVEFORM_AUDIO:\
-		res=WAVE_DriverProc(mciDrv[wDevID].wDeviceID,0,cmd,dwFlags,(DWORD)(params));\
+		res=WAVE_DriverProc(GetDrv(wDevID)->wDeviceID,0,cmd,dwFlags,(DWORD)(params));\
 		break;\
 	case MCI_DEVTYPE_SEQUENCER:\
-		res=MIDI_DriverProc(mciDrv[wDevID].wDeviceID,0,cmd,dwFlags,(DWORD)(params));\
+		res=MIDI_DriverProc(GetDrv(wDevID)->wDeviceID,0,cmd,dwFlags,(DWORD)(params));\
 		break;\
 	case MCI_DEVTYPE_ANIMATION:\
-		res=ANIM_DriverProc(mciDrv[wDevID].wDeviceID,0,cmd,dwFlags,(DWORD)(params));\
+		res=ANIM_DriverProc(GetDrv(wDevID)->wDeviceID,0,cmd,dwFlags,(DWORD)(params));\
 		break;\
 	case MCI_DEVTYPE_DIGITAL_VIDEO:\
 		dprintf_mci(stddeb,"_MCI_CALL_DRIVER //No DIGITAL_VIDEO yet !\n");\
@@ -91,7 +96,7 @@ LONG ANIM_DriverProc(DWORD dwDevID, HDRVR16 hDriv, WORD wMsg,
 	}
 /* print a DWORD in the specified timeformat */
 static void
-_MCISTR_printtf(char *buf,UINT uDevType,DWORD timef,DWORD val) {
+_MCISTR_printtf(char *buf,UINT16 uDevType,DWORD timef,DWORD val) {
 	*buf='\0';
 	switch (timef) {
 	case MCI_FORMAT_MILLISECONDS:
@@ -322,17 +327,18 @@ MCISTR_Open(_MCISTR_PROTO_) {
 		SEGPTR_FREE(pU);
 		return MCIERR_INVALID_DEVICE_NAME;
 	}
-	wDevID=0;
-	while(mciDrv[wDevID].wType) {
-		if (++wDevID>=MAXMCIDRIVERS) {
+	wDevID=MMSYSTEM_FirstDevID();
+	while(GetDrv(wDevID)->wType) {
+		wDevID = MMSYSTEM_NextDevID(wDevID);
+		if (!MMSYSTEM_DevIDValid(wDevID)) {
 			dprintf_mci(stddeb, __FILE__":MCISTR_Open:MAXMCIDRIVERS reached!\n");
 			SEGPTR_FREE(PTR_SEG_TO_LIN(pU->openParams.lpstrElementName));
 			SEGPTR_FREE(pU);
 			return MCIERR_INTERNAL;
 		}
 	}
-	mciDrv[wDevID].wType		= uDevTyp;
-	mciDrv[wDevID].wDeviceID	= wDevID;
+	GetDrv(wDevID)->wType		= uDevTyp;
+	GetDrv(wDevID)->wDeviceID	= wDevID;
 	pU->openParams.dwCallback	= 0;
 	pU->openParams.wDeviceID	= wDevID;
 	pU->ovlyopenParams.dwStyle	= 0; 
@@ -351,7 +357,7 @@ MCISTR_Open(_MCISTR_PROTO_) {
 		}
 		if (!strcmp(keywords[i],"element") && (i+1<nrofkeywords)) {
 			dwFlags |= MCI_OPEN_ELEMENT;
-			pU->openParams.lpstrElementName=SEGPTR_GET(SEGPTR_STRDUP(keywords[i]));
+			pU->openParams.lpstrElementName=SEGPTR_GET(SEGPTR_STRDUP(keywords[i+1]));
 			i+=2;
 			continue;
 		}
@@ -421,7 +427,7 @@ MCISTR_Open(_MCISTR_PROTO_) {
 	}
 	_MCI_CALL_DRIVER( MCI_OPEN, SEGPTR_GET(pU) );
 	if (res==0)
-		memcpy(&mciOpenDrv[wDevID],&pU->openParams,sizeof(MCI_OPEN_PARMS));
+		memcpy(GetOpenDrv(wDevID),&pU->openParams,sizeof(MCI_OPEN_PARMS));
 	else {
 		SEGPTR_FREE(PTR_SEG_TO_LIN(pU->openParams.lpstrElementName));
 		SEGPTR_FREE(PTR_SEG_TO_LIN(pU->openParams.lpstrDeviceType));
@@ -2095,7 +2101,7 @@ struct	_MCISTR_cmdtable {
  * it is used. (imagine "close all"). Not implemented yet.
  */
 DWORD mciSendString (LPCSTR lpstrCommand, LPSTR lpstrReturnString, 
-	UINT uReturnLength, HWND16 hwndCallback)
+	UINT16 uReturnLength, HWND16 hwndCallback)
 {
 	char	*cmd,*dev,*args,**keywords;
 	WORD	uDevTyp=0,wDevID=0;
@@ -2154,22 +2160,23 @@ DWORD mciSendString (LPCSTR lpstrCommand, LPSTR lpstrReturnString,
 
  	/* determine wDevID and uDevTyp for all commands except "open" */
  	if (STRCMP(cmd,"open")!=0) {
-		wDevID=0;
+		wDevID = MMSYSTEM_FirstDevID();
 		while (1) {
 			SEGPTR	dname;
 
-			dname=(SEGPTR)mciOpenDrv[wDevID].lpstrAlias;
+			dname=(SEGPTR)GetOpenDrv(wDevID)->lpstrAlias;
 			if (dname==NULL) 
-				dname=(SEGPTR)mciOpenDrv[wDevID].lpstrDeviceType;
+				dname=(SEGPTR)GetOpenDrv(wDevID)->lpstrDeviceType;
 			if ((dname!=NULL)&&(!STRCMP(PTR_SEG_TO_LIN(dname),dev)))
 				break;
-			if (++wDevID >= MAXMCIDRIVERS) {
+			wDevID = MMSYSTEM_NextDevID(wDevID);
+			if (!MMSYSTEM_DevIDValid(wDevID)) {
 				dprintf_mci(stddeb, __FILE__":mciSendString:MAXMCIDRIVERS reached!\n");
 				free(keywords);free(cmd);
 				return MCIERR_INTERNAL;
 			}
 		}
-		uDevTyp=mciDrv[wDevID].wType;
+		uDevTyp=GetDrv(wDevID)->wType;
 	}
 
  	for (i=0;MCISTR_cmdtable[i].cmd!=NULL;i++) {
@@ -2192,4 +2199,3 @@ DWORD mciSendString (LPCSTR lpstrCommand, LPSTR lpstrReturnString,
 	free(keywords);free(cmd);
 	return MCIERR_MISSING_COMMAND_STRING;
 }
-#endif
diff --git a/multimedia/midi.c b/multimedia/midi.c
index 5d08d7b9dd2..7a52f87f7fb 100644
--- a/multimedia/midi.c
+++ b/multimedia/midi.c
@@ -4,12 +4,6 @@
  * Copyright 1994 Martin Ayotte
  */
 
-#ifndef WINELIB
-#define BUILTIN_MMSYSTEM
-#endif 
-
-#ifdef BUILTIN_MMSYSTEM
-
 #include <stdio.h>
 #include <stdlib.h>
 #include <unistd.h>
@@ -30,6 +24,8 @@
 #include <machine/soundcard.h>
 #endif
 
+int MMSYSTEM_DevIDToIndex(UINT16);
+
 #if defined(linux) || defined(__FreeBSD__)
 #define MIDI_DEV "/dev/sequencer"
 
@@ -65,7 +61,7 @@ typedef struct {
 
 typedef struct {
 	int     nUseCount;          /* Incremented for each shared open */
-	BOOL    fShareable;         /* TRUE if first open was shareable */
+	BOOL16  fShareable;         /* TRUE if first open was shareable */
 	WORD    wNotifyDeviceID;    /* MCI device ID with a pending notification */
 	HANDLE16 hCallback;         /* Callback handle for pending notification */
 	HMMIO16	hFile;				/* mmio file handle open as Element		*/
@@ -88,14 +84,15 @@ static LINUX_MCIMIDI	MCIMidiDev[MAX_MCIMIDIDRV];
 /**************************************************************************
 * 				MIDI_NotifyClient			[internal]
 */
-static DWORD MIDI_NotifyClient(UINT wDevID, WORD wMsg, 
+static DWORD MIDI_NotifyClient(UINT16 wDevID, WORD wMsg, 
 				DWORD dwParam1, DWORD dwParam2)
 {
 #if defined(linux) || defined(__FreeBSD__)
-	if (MidiInDev[wDevID].wFlags != DCB_NULL && !DriverCallback(
-		MidiInDev[wDevID].midiDesc.dwCallback, MidiInDev[wDevID].wFlags, 
-		MidiInDev[wDevID].midiDesc.hMidi, wMsg, 
-		MidiInDev[wDevID].midiDesc.dwInstance, dwParam1, dwParam2)) {
+	int index = MMSYSTEM_DevIDToIndex(wDevID);
+	if (MidiInDev[index].wFlags != DCB_NULL && !DriverCallback(
+		MidiInDev[index].midiDesc.dwCallback, MidiInDev[index].wFlags, 
+		MidiInDev[index].midiDesc.hMidi, wMsg, 
+		MidiInDev[index].midiDesc.dwInstance, dwParam1, dwParam2)) {
 		dprintf_midi(stddeb, "MIDI_NotifyClient // can't notify client !\n");
 		return MMSYSERR_NOERROR;
 		}
@@ -109,16 +106,17 @@ static DWORD MIDI_NotifyClient(UINT wDevID, WORD wMsg,
 /**************************************************************************
 * 				MIDI_ReadByte			[internal]	
 */
-static DWORD MIDI_ReadByte(UINT wDevID, BYTE *lpbyt)
+static DWORD MIDI_ReadByte(UINT16 wDevID, BYTE *lpbyt)
 {
+	int index = MMSYSTEM_DevIDToIndex(wDevID);
 #if defined(linux) || defined(__FreeBSD__)
 	if (lpbyt != NULL) {
-		if (mmioRead(MCIMidiDev[wDevID].hFile, (HPSTR)lpbyt,
+		if (mmioRead(MCIMidiDev[index].hFile, (HPSTR)lpbyt,
 			(long) sizeof(BYTE)) == (long) sizeof(BYTE)) {
 			return 0;
 			}
 		}
-	dprintf_midi(stddeb, "MIDI_ReadByte // error reading wDevID=%d \n", wDevID);
+	dprintf_midi(stddeb, "MIDI_ReadByte // error reading wDevID=%04X\n", wDevID);
 	return MCIERR_INTERNAL;
 
 #else
@@ -130,7 +128,7 @@ static DWORD MIDI_ReadByte(UINT wDevID, BYTE *lpbyt)
 /**************************************************************************
 * 				MIDI_ReadWord			[internal]	
 */
-static DWORD MIDI_ReadWord(UINT wDevID, LPWORD lpw)
+static DWORD MIDI_ReadWord(UINT16 wDevID, LPWORD lpw)
 {
 	BYTE	hibyte, lobyte;
 	if (lpw != NULL) {
@@ -141,7 +139,7 @@ static DWORD MIDI_ReadWord(UINT wDevID, LPWORD lpw)
 				}
 			}
 		}
-	dprintf_midi(stddeb, "MIDI_ReadWord // error reading wDevID=%d \n", wDevID);
+	dprintf_midi(stddeb, "MIDI_ReadWord // error reading wDevID=%04X\n", wDevID);
 	return MCIERR_INTERNAL;
 }
 
@@ -149,7 +147,7 @@ static DWORD MIDI_ReadWord(UINT wDevID, LPWORD lpw)
 /**************************************************************************
 * 				MIDI_ReadLong			[internal]	
 */
-static DWORD MIDI_ReadLong(UINT wDevID, LPDWORD lpdw)
+static DWORD MIDI_ReadLong(UINT16 wDevID, LPDWORD lpdw)
 {
 	WORD	hiword, loword;
 	if (lpdw != NULL) {
@@ -160,7 +158,7 @@ static DWORD MIDI_ReadLong(UINT wDevID, LPDWORD lpdw)
 				}
 			}
 		}
-	dprintf_midi(stddeb, "MIDI_ReadLong // error reading wDevID=%d \n", wDevID);
+	dprintf_midi(stddeb, "MIDI_ReadLong // error reading wDevID=%04X\n", wDevID);
 	return MCIERR_INTERNAL;
 }
 
@@ -168,19 +166,19 @@ static DWORD MIDI_ReadLong(UINT wDevID, LPDWORD lpdw)
 /**************************************************************************
 * 				MIDI_ReadVaryLen		[internal]	
 */
-static DWORD MIDI_ReadVaryLen(UINT wDevID, LPDWORD lpdw)
+static DWORD MIDI_ReadVaryLen(UINT16 wDevID, LPDWORD lpdw)
 {
 	BYTE	byte;
 	DWORD	value;
 	if (lpdw == NULL) return MCIERR_INTERNAL;
 	if (MIDI_ReadByte(wDevID, &byte) != 0) {
-		dprintf_midi(stddeb, "MIDI_ReadVaryLen // error reading wDevID=%d \n", wDevID);
+		dprintf_midi(stddeb, "MIDI_ReadVaryLen // error reading wDevID=%04X\n", wDevID);
 		return MCIERR_INTERNAL;
 		}
 	value = (DWORD)(byte & 0x7F);
 	while (byte & 0x80) {
 		if (MIDI_ReadByte(wDevID, &byte) != 0) {
-			dprintf_midi(stddeb, "MIDI_ReadVaryLen // error reading wDevID=%d \n", wDevID);
+			dprintf_midi(stddeb, "MIDI_ReadVaryLen // error reading wDevID=%04X\n", wDevID);
 			return MCIERR_INTERNAL;
 			}
 		value = (value << 7) + (byte & 0x7F);
@@ -196,36 +194,37 @@ static DWORD MIDI_ReadVaryLen(UINT wDevID, LPDWORD lpdw)
 /**************************************************************************
 * 				MIDI_ReadMThd			[internal]	
 */
-static DWORD MIDI_ReadMThd(UINT wDevID, DWORD dwOffset)
+static DWORD MIDI_ReadMThd(UINT16 wDevID, DWORD dwOffset)
 {
 #if defined(linux) || defined(__FreeBSD__)
+	int index = MMSYSTEM_DevIDToIndex(wDevID);
 	DWORD	toberead;
 	FOURCC	fourcc;
 	dprintf_midi(stddeb, "MIDI_ReadMThd(%04X, %08lX);\n", wDevID, dwOffset);
-	if (mmioSeek(MCIMidiDev[wDevID].hFile, dwOffset, SEEK_SET) != dwOffset) {
+	if (mmioSeek(MCIMidiDev[index].hFile, dwOffset, SEEK_SET) != dwOffset) {
 		dprintf_midi(stddeb, "MIDI_ReadMThd // can't seek at %08lX begin of 'MThd' \n", dwOffset);
 		return MCIERR_INTERNAL;
 		}
-	if (mmioRead(MCIMidiDev[wDevID].hFile, (HPSTR)&fourcc,
+	if (mmioRead(MCIMidiDev[index].hFile, (HPSTR)&fourcc,
 		(long) sizeof(FOURCC)) != (long) sizeof(FOURCC)) {
 		return MCIERR_INTERNAL;
 		}
 	if (MIDI_ReadLong(wDevID, &toberead) != 0) {
 		return MCIERR_INTERNAL;
 		}
-	if (MIDI_ReadWord(wDevID, &MCIMidiDev[wDevID].wFormat) != 0) {
+	if (MIDI_ReadWord(wDevID, &MCIMidiDev[index].wFormat) != 0) {
 		return MCIERR_INTERNAL;
 		}
-	if (MIDI_ReadWord(wDevID, &MCIMidiDev[wDevID].nTracks) != 0) {
+	if (MIDI_ReadWord(wDevID, &MCIMidiDev[index].nTracks) != 0) {
 		return MCIERR_INTERNAL;
 		}
-	if (MIDI_ReadWord(wDevID, &MCIMidiDev[wDevID].nTempo) != 0) {
+	if (MIDI_ReadWord(wDevID, &MCIMidiDev[index].nTempo) != 0) {
 		return MCIERR_INTERNAL;
 		}
 	dprintf_midi(stddeb, "MIDI_ReadMThd // toberead=%08lX, wFormat=%04X nTracks=%04X nTempo=%04X\n",
-		toberead, MCIMidiDev[wDevID].wFormat,
-		MCIMidiDev[wDevID].nTracks,
-		MCIMidiDev[wDevID].nTempo);
+		toberead, MCIMidiDev[index].wFormat,
+		MCIMidiDev[index].nTracks,
+		MCIMidiDev[index].nTempo);
 	toberead -= 3 * sizeof(WORD);
 /*
 		ntrks = read16bit ();
@@ -239,15 +238,16 @@ static DWORD MIDI_ReadMThd(UINT wDevID, DWORD dwOffset)
 }
 
 
-static DWORD MIDI_ReadMTrk(UINT wDevID, DWORD dwOffset)
+static DWORD MIDI_ReadMTrk(UINT16 wDevID, DWORD dwOffset)
 {
 #if defined(linux) || defined(__FreeBSD__)
+	int index = MMSYSTEM_DevIDToIndex(wDevID);
 	DWORD	toberead;
 	FOURCC	fourcc;
-	if (mmioSeek(MCIMidiDev[wDevID].hFile, dwOffset, SEEK_SET) != dwOffset) {
+	if (mmioSeek(MCIMidiDev[index].hFile, dwOffset, SEEK_SET) != dwOffset) {
 		dprintf_midi(stddeb, "MIDI_ReadMTrk // can't seek at %08lX begin of 'MThd' \n", dwOffset);
 		}
-	if (mmioRead(MCIMidiDev[wDevID].hFile, (HPSTR)&fourcc,
+	if (mmioRead(MCIMidiDev[index].hFile, (HPSTR)&fourcc,
 		(long) sizeof(FOURCC)) != (long) sizeof(FOURCC)) {
 		return MCIERR_INTERNAL;
 		}
@@ -256,7 +256,7 @@ static DWORD MIDI_ReadMTrk(UINT wDevID, DWORD dwOffset)
 		}
 	dprintf_midi(stddeb, "MIDI_ReadMTrk // toberead=%08lX\n", toberead);
 	toberead -= 3 * sizeof(WORD);
-	MCIMidiDev[wDevID].dwTotalLen = toberead;
+	MCIMidiDev[index].dwTotalLen = toberead;
 	return 0;
 #else
          return MMSYSERR_NOTENABLED;
@@ -267,9 +267,10 @@ static DWORD MIDI_ReadMTrk(UINT wDevID, DWORD dwOffset)
 /**************************************************************************
 * 				MIDI_mciOpen			[internal]	
 */
-static DWORD MIDI_mciOpen(UINT wDevID, DWORD dwFlags, LPMCI_OPEN_PARMS lpParms)
+static DWORD MIDI_mciOpen(UINT16 wDevID, DWORD dwFlags, LPMCI_OPEN_PARMS lpParms)
 {
 #if defined(linux) || defined(__FreeBSD__)
+	int index;
 	MIDIOPENDESC 	MidiDesc;
 	DWORD		dwRet;
 	DWORD		dwOffset;
@@ -278,49 +279,53 @@ static DWORD MIDI_mciOpen(UINT wDevID, DWORD dwFlags, LPMCI_OPEN_PARMS lpParms)
 
 	dprintf_midi(stddeb, "MIDI_mciOpen(%08lX, %p)\n", dwFlags, lpParms);
 	if (lpParms == NULL) return MCIERR_INTERNAL;
-	if (MCIMidiDev[wDevID].nUseCount > 0) {
+
+	wDevID = lpParms->wDeviceID;
+	index = MMSYSTEM_DevIDToIndex(wDevID);
+
+	if (MCIMidiDev[index].nUseCount > 0) {
 		/* The driver already open on this channel */
 		/* If the driver was opened shareable before and this open specifies */
 		/* shareable then increment the use count */
-		if (MCIMidiDev[wDevID].fShareable && (dwFlags & MCI_OPEN_SHAREABLE))
-			++MCIMidiDev[wDevID].nUseCount;
+		if (MCIMidiDev[index].fShareable && (dwFlags & MCI_OPEN_SHAREABLE))
+			++MCIMidiDev[index].nUseCount;
 		else
 			return MCIERR_MUST_USE_SHAREABLE;
 		}
 	else {
-		MCIMidiDev[wDevID].nUseCount = 1;
-		MCIMidiDev[wDevID].fShareable = dwFlags & MCI_OPEN_SHAREABLE;
+		MCIMidiDev[index].nUseCount = 1;
+		MCIMidiDev[index].fShareable = dwFlags & MCI_OPEN_SHAREABLE;
 		}
 	dprintf_midi(stddeb, "MIDI_mciOpen // wDevID=%04X\n", wDevID);
 	lpParms->wDeviceID = wDevID;
 	dprintf_midi(stddeb, "MIDI_mciOpen // lpParms->wDevID=%04X\n", lpParms->wDeviceID);
 	dprintf_midi(stddeb, "MIDI_mciOpen // before OPEN_ELEMENT\n");
-    if (dwFlags & MCI_OPEN_ELEMENT) {
+	if (dwFlags & MCI_OPEN_ELEMENT) {
 		lpstrElementName = (LPSTR)PTR_SEG_TO_LIN(lpParms->lpstrElementName);
 		dprintf_midi(stddeb, "MIDI_mciOpen // MCI_OPEN_ELEMENT '%s' !\n", lpstrElementName);
 		if (strlen(lpstrElementName) > 0) {
 			strcpy(str, lpstrElementName);
 			CharUpper32A(str);
-			MCIMidiDev[wDevID].hFile = mmioOpen(str, NULL, 
+			MCIMidiDev[index].hFile = mmioOpen(str, NULL, 
 				MMIO_ALLOCBUF | MMIO_READWRITE | MMIO_EXCLUSIVE);
-			if (MCIMidiDev[wDevID].hFile == 0) {
+			if (MCIMidiDev[index].hFile == 0) {
 				dprintf_midi(stddeb, "MIDI_mciOpen // can't find file='%s' !\n", str);
 				return MCIERR_FILE_NOT_FOUND;
 				}
 			}
 		else 
-			MCIMidiDev[wDevID].hFile = 0;
-		}
-	dprintf_midi(stddeb, "MIDI_mciOpen // hFile=%u\n", MCIMidiDev[wDevID].hFile);
-	memcpy(&MCIMidiDev[wDevID].openParms, lpParms, sizeof(MCI_OPEN_PARMS));
-	MCIMidiDev[wDevID].wNotifyDeviceID = lpParms->wDeviceID;
-	MCIMidiDev[wDevID].dwStatus = MCI_MODE_STOP;
-	MCIMidiDev[wDevID].dwBeginData = 0;
-	MCIMidiDev[wDevID].dwTotalLen = 0;
+			MCIMidiDev[index].hFile = 0;
+		}
+	dprintf_midi(stddeb, "MIDI_mciOpen // hFile=%u\n", MCIMidiDev[index].hFile);
+	memcpy(&MCIMidiDev[index].openParms, lpParms, sizeof(MCI_OPEN_PARMS));
+	MCIMidiDev[index].wNotifyDeviceID = lpParms->wDeviceID;
+	MCIMidiDev[index].dwStatus = MCI_MODE_STOP;
+	MCIMidiDev[index].dwBeginData = 0;
+	MCIMidiDev[index].dwTotalLen = 0;
 	MidiDesc.hMidi = 0;
-	if (MCIMidiDev[wDevID].hFile != 0) {
+	if (MCIMidiDev[index].hFile != 0) {
 		MMCKINFO	ckMainRIFF;
-		if (mmioDescend(MCIMidiDev[wDevID].hFile, &ckMainRIFF, NULL, 0) != 0) {
+		if (mmioDescend(MCIMidiDev[index].hFile, &ckMainRIFF, NULL, 0) != 0) {
 			return MCIERR_INTERNAL;
 			}
 		dprintf_midi(stddeb,"MIDI_mciOpen // ParentChunk ckid=%.4s fccType=%.4s cksize=%08lX \n",
@@ -339,19 +344,19 @@ static DWORD MIDI_mciOpen(UINT wDevID, DWORD dwFlags, LPMCI_OPEN_PARMS lpParms)
 			dprintf_midi(stddeb, "MIDI_mciOpen // can't read 'MThd' header \n");
 			return MCIERR_INTERNAL;
 			}
-		dwOffset = mmioSeek(MCIMidiDev[wDevID].hFile, 0, SEEK_CUR);
+		dwOffset = mmioSeek(MCIMidiDev[index].hFile, 0, SEEK_CUR);
 		if (MIDI_ReadMTrk(wDevID, dwOffset) != 0) {
 			dprintf_midi(stddeb, "MIDI_mciOpen // can't read 'MTrk' header \n");
 			return MCIERR_INTERNAL;
 			}
-		dwOffset = mmioSeek(MCIMidiDev[wDevID].hFile, 0, SEEK_CUR);
-		MCIMidiDev[wDevID].dwBeginData = dwOffset;
+		dwOffset = mmioSeek(MCIMidiDev[index].hFile, 0, SEEK_CUR);
+		MCIMidiDev[index].dwBeginData = dwOffset;
 		dprintf_midi(stddeb, "MIDI_mciOpen // Chunk Found ckid=%.4s fccType=%.4s cksize=%08lX \n",
 				(LPSTR)&ckMainRIFF.ckid, (LPSTR)&ckMainRIFF.fccType,
 				ckMainRIFF.cksize);
 		}
-	dwRet = modMessage(0, MODM_OPEN, 0, (DWORD)&MidiDesc, CALLBACK_NULL);
-	dwRet = midMessage(0, MIDM_OPEN, 0, (DWORD)&MidiDesc, CALLBACK_NULL);
+	dwRet = modMessage(wDevID, MODM_OPEN, 0, (DWORD)&MidiDesc, CALLBACK_NULL);
+	dwRet = midMessage(wDevID, MIDM_OPEN, 0, (DWORD)&MidiDesc, CALLBACK_NULL);
 	return 0;
 #else
 	return MMSYSERR_NOTENABLED;
@@ -362,14 +367,15 @@ static DWORD MIDI_mciOpen(UINT wDevID, DWORD dwFlags, LPMCI_OPEN_PARMS lpParms)
 /**************************************************************************
 * 				MIDI_mciStop			[internal]
 */
-static DWORD MIDI_mciStop(UINT wDevID, DWORD dwFlags, LPMCI_GENERIC_PARMS lpParms)
+static DWORD MIDI_mciStop(UINT16 wDevID, DWORD dwFlags, LPMCI_GENERIC_PARMS lpParms)
 {
 #if defined(linux) || defined(__FreeBSD__)
-	dprintf_midi(stddeb, "MIDI_mciStop(%u, %08lX, %p);\n", wDevID, dwFlags, lpParms);
+	int index = MMSYSTEM_DevIDToIndex(wDevID);
+	dprintf_midi(stddeb, "MIDI_mciStop(%04X, %08lX, %p);\n", wDevID, dwFlags, lpParms);
 	if (lpParms == NULL) return MCIERR_INTERNAL;
-	MCIMidiDev[wDevID].dwStatus = MCI_MODE_STOP;
-	dprintf_midi(stddeb, "MIDI_mciStop // MCIMidiDev[wDevID].dwStatus=%p %d\n",
-			&MCIMidiDev[wDevID].dwStatus, MCIMidiDev[wDevID].dwStatus);
+	MCIMidiDev[index].dwStatus = MCI_MODE_STOP;
+	dprintf_midi(stddeb, "MIDI_mciStop // MCIMidiDev[index].dwStatus=%p %d\n",
+			&MCIMidiDev[index].dwStatus, MCIMidiDev[index].dwStatus);
 	return 0;
 #else
 	return MCIERR_INTERNAL;
@@ -380,25 +386,26 @@ static DWORD MIDI_mciStop(UINT wDevID, DWORD dwFlags, LPMCI_GENERIC_PARMS lpParm
 /**************************************************************************
 * 				MIDI_mciClose		[internal]
 */
-static DWORD MIDI_mciClose(UINT wDevID, DWORD dwParam, LPMCI_GENERIC_PARMS lpParms)
+static DWORD MIDI_mciClose(UINT16 wDevID, DWORD dwParam, LPMCI_GENERIC_PARMS lpParms)
 {
 #if defined(linux) || defined(__FreeBSD__)
+	int index = MMSYSTEM_DevIDToIndex(wDevID);
 	DWORD		dwRet;
-	dprintf_midi(stddeb, "MIDI_mciClose(%u, %08lX, %p);\n", wDevID, dwParam, lpParms);
-	if (MCIMidiDev[wDevID].dwStatus != MCI_MODE_STOP) {
+	dprintf_midi(stddeb, "MIDI_mciClose(%04X, %08lX, %p);\n", wDevID, dwParam, lpParms);
+	if (MCIMidiDev[index].dwStatus != MCI_MODE_STOP) {
 		MIDI_mciStop(wDevID, MCI_WAIT, lpParms);
 		}
-	MCIMidiDev[wDevID].dwStatus = MCI_MODE_STOP;
-	MCIMidiDev[wDevID].nUseCount--;
-	if (MCIMidiDev[wDevID].nUseCount == 0) {
-		if (MCIMidiDev[wDevID].hFile != 0) {
-			mmioClose(MCIMidiDev[wDevID].hFile, 0);
-			MCIMidiDev[wDevID].hFile = 0;
+	MCIMidiDev[index].dwStatus = MCI_MODE_STOP;
+	MCIMidiDev[index].nUseCount--;
+	if (MCIMidiDev[index].nUseCount == 0) {
+		if (MCIMidiDev[index].hFile != 0) {
+			mmioClose(MCIMidiDev[index].hFile, 0);
+			MCIMidiDev[index].hFile = 0;
 			dprintf_midi(stddeb, "MIDI_mciClose // hFile closed !\n");
 			}
-		dwRet = modMessage(0, MODM_CLOSE, 0, 0L, 0L);
+		dwRet = modMessage(wDevID, MODM_CLOSE, 0, 0L, 0L);
 		if (dwRet != MMSYSERR_NOERROR) return MCIERR_INTERNAL;
-		dwRet = midMessage(0, MIDM_CLOSE, 0, 0L, 0L);
+		dwRet = midMessage(wDevID, MIDM_CLOSE, 0, 0L, 0L);
 		if (dwRet != MMSYSERR_NOERROR) return MCIERR_INTERNAL;
 		}
 	return 0;
@@ -411,19 +418,20 @@ static DWORD MIDI_mciClose(UINT wDevID, DWORD dwParam, LPMCI_GENERIC_PARMS lpPar
 /**************************************************************************
 * 				MIDI_mciPlay		[internal]
 */
-static DWORD MIDI_mciPlay(UINT wDevID, DWORD dwFlags, LPMCI_PLAY_PARMS lpParms)
+static DWORD MIDI_mciPlay(UINT16 wDevID, DWORD dwFlags, LPMCI_PLAY_PARMS lpParms)
 {
 #if defined(linux) || defined(__FreeBSD__)
+	int index = MMSYSTEM_DevIDToIndex(wDevID);
 	int			count;
 	int			start, end;
 	LPMIDIHDR	lpMidiHdr;
 	DWORD		dwData;
 	LPWORD		ptr;
 	DWORD		dwRet;
-	dprintf_midi(stddeb, "MIDI_mciPlay(%u, %08lX, %p);\n", wDevID, dwFlags, lpParms);
-	if (MCIMidiDev[wDevID].hFile == 0) {
-		dprintf_midi(stddeb, "MIDI_mciPlay // can't find file='%s' !\n", 
-				MCIMidiDev[wDevID].openParms.lpstrElementName);
+	dprintf_midi(stddeb, "MIDI_mciPlay(%04X, %08lX, %p);\n", wDevID, dwFlags, lpParms);
+	if (MCIMidiDev[index].hFile == 0) {
+		dprintf_midi(stddeb, "MIDI_mciPlay // can't find file='%08lx' !\n", 
+				MCIMidiDev[index].openParms.lpstrElementName);
 		return MCIERR_FILE_NOT_FOUND;
 		}
 	start = 1; 		end = 99999;
@@ -451,42 +459,42 @@ static DWORD MIDI_mciPlay(UINT wDevID, DWORD dwFlags, LPMCI_PLAY_PARMS lpParms)
 			}
 		}
 #endif
-	lpMidiHdr = &MCIMidiDev[wDevID].MidiHdr;
+	lpMidiHdr = &MCIMidiDev[index].MidiHdr;
 	lpMidiHdr->lpData = (LPSTR) malloc(1200);
 	if (lpMidiHdr->lpData == NULL) return MCIERR_INTERNAL;
 	lpMidiHdr->dwBufferLength = 1024;
 	lpMidiHdr->dwUser = 0L;
 	lpMidiHdr->dwFlags = 0L;
-	dwRet = modMessage(0, MODM_PREPARE, 0, (DWORD)lpMidiHdr, sizeof(MIDIHDR));
+	dwRet = modMessage(wDevID, MODM_PREPARE, 0, (DWORD)lpMidiHdr, sizeof(MIDIHDR));
 /*	dprintf_midi(stddeb, "MIDI_mciPlay // after MODM_PREPARE \n"); */
-	MCIMidiDev[wDevID].dwStatus = MCI_MODE_PLAY;
-	while(MCIMidiDev[wDevID].dwStatus != MCI_MODE_STOP) {
-		dprintf_midi(stddeb, "MIDI_mciPlay // MCIMidiDev[wDevID].dwStatus=%p %d\n",
-			&MCIMidiDev[wDevID].dwStatus, MCIMidiDev[wDevID].dwStatus);
+	MCIMidiDev[index].dwStatus = MCI_MODE_PLAY;
+	while(MCIMidiDev[index].dwStatus != MCI_MODE_STOP) {
+		dprintf_midi(stddeb, "MIDI_mciPlay // MCIMidiDev[index].dwStatus=%p %d\n",
+			&MCIMidiDev[index].dwStatus, MCIMidiDev[index].dwStatus);
 		ptr = (LPWORD)lpMidiHdr->lpData;
 		for (count = 0; count < lpMidiHdr->dwBufferLength; count++) {
 			if (MIDI_ReadVaryLen(wDevID, &dwData) != 0) break;
 			*ptr = LOWORD(dwData);
 			}
 /*
-		count = mmioRead(MCIMidiDev[wDevID].hFile, lpMidiHdr->lpData, lpMidiHdr->dwBufferLength);
+		count = mmioRead(MCIMidiDev[index].hFile, lpMidiHdr->lpData, lpMidiHdr->dwBufferLength);
 */
 		if (count < 1) break;
 		lpMidiHdr->dwBytesRecorded = count;
 		dprintf_midi(stddeb, "MIDI_mciPlay // before MODM_LONGDATA lpMidiHdr=%p dwBytesRecorded=%lu\n",
 					lpMidiHdr, lpMidiHdr->dwBytesRecorded);
-		dwRet = modMessage(0, MODM_LONGDATA, 0, (DWORD)lpMidiHdr, sizeof(MIDIHDR));
+		dwRet = modMessage(wDevID, MODM_LONGDATA, 0, (DWORD)lpMidiHdr, sizeof(MIDIHDR));
 		}
-	dwRet = modMessage(0, MODM_UNPREPARE, 0, (DWORD)lpMidiHdr, sizeof(MIDIHDR));
+	dwRet = modMessage(wDevID, MODM_UNPREPARE, 0, (DWORD)lpMidiHdr, sizeof(MIDIHDR));
 	if (lpMidiHdr->lpData != NULL) {
 		free(lpMidiHdr->lpData);
 		lpMidiHdr->lpData = NULL;
 		}
-	MCIMidiDev[wDevID].dwStatus = MCI_MODE_STOP;
+	MCIMidiDev[index].dwStatus = MCI_MODE_STOP;
 	if (dwFlags & MCI_NOTIFY) {
 		dprintf_midi(stddeb, "MIDI_mciPlay // MCI_NOTIFY_SUCCESSFUL %08lX !\n", lpParms->dwCallback);
 		mciDriverNotify((HWND16)LOWORD(lpParms->dwCallback), 
-			MCIMidiDev[wDevID].wNotifyDeviceID, MCI_NOTIFY_SUCCESSFUL);
+			MCIMidiDev[index].wNotifyDeviceID, MCI_NOTIFY_SUCCESSFUL);
 #if 0
 		exit(1);
 #endif
@@ -501,17 +509,18 @@ static DWORD MIDI_mciPlay(UINT wDevID, DWORD dwFlags, LPMCI_PLAY_PARMS lpParms)
 /**************************************************************************
 * 				MIDI_mciRecord			[internal]
 */
-static DWORD MIDI_mciRecord(UINT wDevID, DWORD dwFlags, LPMCI_RECORD_PARMS lpParms)
+static DWORD MIDI_mciRecord(UINT16 wDevID, DWORD dwFlags, LPMCI_RECORD_PARMS lpParms)
 {
 #if defined(linux) || defined(__FreeBSD__)
+	int index = MMSYSTEM_DevIDToIndex(wDevID);
 	int			start, end;
 	LPMIDIHDR	lpMidiHdr;
 	DWORD		dwRet;
 
-	dprintf_midi(stddeb, "MIDI_mciRecord(%u, %08lX, %p);\n", wDevID, dwFlags, lpParms);
-	if (MCIMidiDev[wDevID].hFile == 0) {
-		dprintf_midi(stddeb, "MIDI_mciRecord // can't find file='%s' !\n", 
-				MCIMidiDev[wDevID].openParms.lpstrElementName);
+	dprintf_midi(stddeb, "MIDI_mciRecord(%04X, %08lX, %p);\n", wDevID, dwFlags, lpParms);
+	if (MCIMidiDev[index].hFile == 0) {
+		dprintf_midi(stddeb, "MIDI_mciRecord // can't find file='%08lx' !\n", 
+				MCIMidiDev[index].openParms.lpstrElementName);
 		return MCIERR_FILE_NOT_FOUND;
 		}
 	start = 1; 		end = 99999;
@@ -523,35 +532,35 @@ static DWORD MIDI_mciRecord(UINT wDevID, DWORD dwFlags, LPMCI_RECORD_PARMS lpPar
 		end = lpParms->dwTo;
 		dprintf_midi(stddeb, "MIDI_mciRecord // MCI_TO=%d \n", end);
 		}
-	lpMidiHdr = &MCIMidiDev[wDevID].MidiHdr;
+	lpMidiHdr = &MCIMidiDev[index].MidiHdr;
 	lpMidiHdr->lpData = (LPSTR) xmalloc(1200);
 	lpMidiHdr->dwBufferLength = 1024;
 	lpMidiHdr->dwUser = 0L;
 	lpMidiHdr->dwFlags = 0L;
-	dwRet = midMessage(0, MIDM_PREPARE, 0, (DWORD)lpMidiHdr, sizeof(MIDIHDR));
+	dwRet = midMessage(wDevID, MIDM_PREPARE, 0, (DWORD)lpMidiHdr, sizeof(MIDIHDR));
 	dprintf_midi(stddeb, "MIDI_mciRecord // after MIDM_PREPARE \n");
-	MCIMidiDev[wDevID].dwStatus = MCI_MODE_RECORD;
-	while(MCIMidiDev[wDevID].dwStatus != MCI_MODE_STOP) {
-		dprintf_midi(stddeb, "MIDI_mciRecord // MCIMidiDev[wDevID].dwStatus=%p %d\n",
-			&MCIMidiDev[wDevID].dwStatus, MCIMidiDev[wDevID].dwStatus);
+	MCIMidiDev[index].dwStatus = MCI_MODE_RECORD;
+	while(MCIMidiDev[index].dwStatus != MCI_MODE_STOP) {
+		dprintf_midi(stddeb, "MIDI_mciRecord // MCIMidiDev[index].dwStatus=%p %d\n",
+			&MCIMidiDev[index].dwStatus, MCIMidiDev[index].dwStatus);
 		lpMidiHdr->dwBytesRecorded = 0;
-		dwRet = midMessage(0, MIDM_START, 0, 0L, 0L);
+		dwRet = midMessage(wDevID, MIDM_START, 0, 0L, 0L);
 		dprintf_midi(stddeb, "MIDI_mciRecord // after MIDM_START lpMidiHdr=%p dwBytesRecorded=%lu\n",
 					lpMidiHdr, lpMidiHdr->dwBytesRecorded);
 		if (lpMidiHdr->dwBytesRecorded == 0) break;
 		}
 	dprintf_midi(stddeb, "MIDI_mciRecord // before MIDM_UNPREPARE \n");
-	dwRet = midMessage(0, MIDM_UNPREPARE, 0, (DWORD)lpMidiHdr, sizeof(MIDIHDR));
+	dwRet = midMessage(wDevID, MIDM_UNPREPARE, 0, (DWORD)lpMidiHdr, sizeof(MIDIHDR));
 	dprintf_midi(stddeb, "MIDI_mciRecord // after MIDM_UNPREPARE \n");
 	if (lpMidiHdr->lpData != NULL) {
 		free(lpMidiHdr->lpData);
 		lpMidiHdr->lpData = NULL;
 		}
-	MCIMidiDev[wDevID].dwStatus = MCI_MODE_STOP;
+	MCIMidiDev[index].dwStatus = MCI_MODE_STOP;
 	if (dwFlags & MCI_NOTIFY) {
 		dprintf_midi(stddeb, "MIDI_mciRecord // MCI_NOTIFY_SUCCESSFUL %08lX !\n", lpParms->dwCallback);
 		mciDriverNotify((HWND16)LOWORD(lpParms->dwCallback), 
-			MCIMidiDev[wDevID].wNotifyDeviceID, MCI_NOTIFY_SUCCESSFUL);
+			MCIMidiDev[index].wNotifyDeviceID, MCI_NOTIFY_SUCCESSFUL);
 		}
 	return 0;
 #else
@@ -563,10 +572,10 @@ static DWORD MIDI_mciRecord(UINT wDevID, DWORD dwFlags, LPMCI_RECORD_PARMS lpPar
 /**************************************************************************
 * 				MIDI_mciPause			[internal]
 */
-static DWORD MIDI_mciPause(UINT wDevID, DWORD dwFlags, LPMCI_GENERIC_PARMS lpParms)
+static DWORD MIDI_mciPause(UINT16 wDevID, DWORD dwFlags, LPMCI_GENERIC_PARMS lpParms)
 {
 #if defined(linux) || defined(__FreeBSD__)
-	dprintf_midi(stddeb, "MIDI_mciPause(%u, %08lX, %p);\n", wDevID, dwFlags, lpParms);
+	dprintf_midi(stddeb, "MIDI_mciPause(%04X, %08lX, %p);\n", wDevID, dwFlags, lpParms);
 	if (lpParms == NULL) return MCIERR_INTERNAL;
 	return 0;
 #else
@@ -578,10 +587,10 @@ static DWORD MIDI_mciPause(UINT wDevID, DWORD dwFlags, LPMCI_GENERIC_PARMS lpPar
 /**************************************************************************
 * 				MIDI_mciResume			[internal]
 */
-static DWORD MIDI_mciResume(UINT wDevID, DWORD dwFlags, LPMCI_GENERIC_PARMS lpParms)
+static DWORD MIDI_mciResume(UINT16 wDevID, DWORD dwFlags, LPMCI_GENERIC_PARMS lpParms)
 {
 #if defined(linux) || defined(__FreeBSD__)
-	dprintf_midi(stddeb, "MIDI_mciResume(%u, %08lX, %p);\n", wDevID, dwFlags, lpParms);
+	dprintf_midi(stddeb, "MIDI_mciResume(%04X, %08lX, %p);\n", wDevID, dwFlags, lpParms);
 	if (lpParms == NULL) return MCIERR_INTERNAL;
 	return 0;
 #else
@@ -593,10 +602,10 @@ static DWORD MIDI_mciResume(UINT wDevID, DWORD dwFlags, LPMCI_GENERIC_PARMS lpPa
 /**************************************************************************
 * 				MIDI_mciSet			[internal]
 */
-static DWORD MIDI_mciSet(UINT wDevID, DWORD dwFlags, LPMCI_SET_PARMS lpParms)
+static DWORD MIDI_mciSet(UINT16 wDevID, DWORD dwFlags, LPMCI_SET_PARMS lpParms)
 {
 #if defined(linux) || defined(__FreeBSD__)
-	dprintf_midi(stddeb, "MIDI_mciSet(%u, %08lX, %p);\n", wDevID, dwFlags, lpParms);
+	dprintf_midi(stddeb, "MIDI_mciSet(%04X, %08lX, %p);\n", wDevID, dwFlags, lpParms);
 	if (lpParms == NULL) return MCIERR_INTERNAL;
 	dprintf_midi(stddeb, "MIDI_mciSet // dwTimeFormat=%08lX\n", lpParms->dwTimeFormat);
 	dprintf_midi(stddeb, "MIDI_mciSet // dwAudio=%08lX\n", lpParms->dwAudio);
@@ -659,10 +668,11 @@ static DWORD MIDI_mciSet(UINT wDevID, DWORD dwFlags, LPMCI_SET_PARMS lpParms)
 /**************************************************************************
 * 				MIDI_mciStatus		[internal]
 */
-static DWORD MIDI_mciStatus(UINT wDevID, DWORD dwFlags, LPMCI_STATUS_PARMS lpParms)
+static DWORD MIDI_mciStatus(UINT16 wDevID, DWORD dwFlags, LPMCI_STATUS_PARMS lpParms)
 {
 #if defined(linux) || defined(__FreeBSD__)
-	dprintf_midi(stddeb, "MIDI_mciStatus(%u, %08lX, %p);\n", wDevID, dwFlags, lpParms);
+	int index = MMSYSTEM_DevIDToIndex(wDevID);
+	dprintf_midi(stddeb, "MIDI_mciStatus(%04X, %08lX, %p);\n", wDevID, dwFlags, lpParms);
 	if (lpParms == NULL) return MCIERR_INTERNAL;
 	if (dwFlags & MCI_STATUS_ITEM) {
 		switch(lpParms->dwItem) {
@@ -736,7 +746,7 @@ static DWORD MIDI_mciStatus(UINT wDevID, DWORD dwFlags, LPMCI_STATUS_PARMS lpPar
 	if (dwFlags & MCI_NOTIFY) {
 		dprintf_midi(stddeb, "MIDI_mciStatus // MCI_NOTIFY_SUCCESSFUL %08lX !\n", lpParms->dwCallback);
 		mciDriverNotify((HWND16)LOWORD(lpParms->dwCallback), 
-			MCIMidiDev[wDevID].wNotifyDeviceID, MCI_NOTIFY_SUCCESSFUL);
+			MCIMidiDev[index].wNotifyDeviceID, MCI_NOTIFY_SUCCESSFUL);
 		}
  	return 0;
 #else
@@ -747,11 +757,11 @@ static DWORD MIDI_mciStatus(UINT wDevID, DWORD dwFlags, LPMCI_STATUS_PARMS lpPar
 /**************************************************************************
 * 				MIDI_mciGetDevCaps		[internal]
 */
-static DWORD MIDI_mciGetDevCaps(UINT wDevID, DWORD dwFlags, 
+static DWORD MIDI_mciGetDevCaps(UINT16 wDevID, DWORD dwFlags, 
 					LPMCI_GETDEVCAPS_PARMS lpParms)
 {
 #if defined(linux) || defined(__FreeBSD__)
-	dprintf_midi(stddeb, "MIDI_mciGetDevCaps(%u, %08lX, %p);\n", wDevID, dwFlags, lpParms);
+	dprintf_midi(stddeb, "MIDI_mciGetDevCaps(%04X, %08lX, %p);\n", wDevID, dwFlags, lpParms);
 	if (lpParms == NULL) return MCIERR_INTERNAL;
 	if (dwFlags & MCI_GETDEVCAPS_ITEM) {
 		switch(lpParms->dwItem) {
@@ -795,10 +805,10 @@ static DWORD MIDI_mciGetDevCaps(UINT wDevID, DWORD dwFlags,
 /**************************************************************************
 * 				MIDI_mciInfo			[internal]
 */
-static DWORD MIDI_mciInfo(UINT wDevID, DWORD dwFlags, LPMCI_INFO_PARMS lpParms)
+static DWORD MIDI_mciInfo(UINT16 wDevID, DWORD dwFlags, LPMCI_INFO_PARMS lpParms)
 {
 #if defined(linux) || defined(__FreeBSD__)
-	dprintf_midi(stddeb, "MIDI_mciInfo(%u, %08lX, %p);\n", wDevID, dwFlags, lpParms);
+	dprintf_midi(stddeb, "MIDI_mciInfo(%04X, %08lX, %p);\n", wDevID, dwFlags, lpParms);
 	if (lpParms == NULL) return MCIERR_INTERNAL;
 	lpParms->lpstrReturn = NULL;
 	switch(dwFlags) {
@@ -830,7 +840,7 @@ static DWORD MIDI_mciInfo(UINT wDevID, DWORD dwFlags, LPMCI_INFO_PARMS lpParms)
 */
 static DWORD midGetDevCaps(WORD wDevID, LPMIDIINCAPS lpCaps, DWORD dwSize)
 {
-	dprintf_midi(stddeb, "midGetDevCaps(%u, %p, %08lX);\n", wDevID, lpCaps, dwSize);
+	dprintf_midi(stddeb, "midGetDevCaps(%04X, %p, %08lX);\n", wDevID, lpCaps, dwSize);
 	return MMSYSERR_NOTENABLED;
 }
 
@@ -840,25 +850,26 @@ static DWORD midGetDevCaps(WORD wDevID, LPMIDIINCAPS lpCaps, DWORD dwSize)
 static DWORD midOpen(WORD wDevID, LPMIDIOPENDESC lpDesc, DWORD dwFlags)
 {
 #if defined(linux) || defined(__FreeBSD__)
+	int index = MMSYSTEM_DevIDToIndex(wDevID);
 	int		midi;
 	dprintf_midi(stddeb,
-		"midOpen(%u, %p, %08lX);\n", wDevID, lpDesc, dwFlags);
+		"midOpen(%04X, %p, %08lX);\n", wDevID, lpDesc, dwFlags);
 	if (lpDesc == NULL) {
 		dprintf_midi(stddeb,"Linux 'midOpen' // Invalid Parameter !\n");
 		return MMSYSERR_INVALPARAM;
 		}
-	if (wDevID >= MAX_MIDIINDRV) {
+	if (index >= MAX_MIDIINDRV) {
 		dprintf_midi(stddeb,"Linux 'midOpen' // MAX_MIDIINDRV reached !\n");
 		return MMSYSERR_ALLOCATED;
 		}
-	MidiInDev[wDevID].unixdev = 0;
+	MidiInDev[index].unixdev = 0;
 	midi = open (MIDI_DEV, O_RDONLY, 0);
 	if (midi == -1) {
 		dprintf_midi(stddeb,"Linux 'midOpen' // can't open !\n");
 		return MMSYSERR_NOTENABLED;
 		}
-	MidiInDev[wDevID].wFlags = HIWORD(dwFlags & CALLBACK_TYPEMASK);
-	switch(MidiInDev[wDevID].wFlags) {
+	MidiInDev[index].wFlags = HIWORD(dwFlags & CALLBACK_TYPEMASK);
+	switch(MidiInDev[index].wFlags) {
 		case DCB_NULL:
 			dprintf_midi(stddeb,"Linux 'midOpen' // CALLBACK_NULL !\n");
 			break;
@@ -875,10 +886,10 @@ static DWORD midOpen(WORD wDevID, LPMIDIOPENDESC lpDesc, DWORD dwFlags)
 				   "Linux 'midOpen' // CALLBACK_FUNCTION !\n");
 			break;
 		}
-	MidiInDev[wDevID].lpQueueHdr = NULL;
-	MidiInDev[wDevID].unixdev = midi;
-	MidiInDev[wDevID].dwTotalPlayed = 0;
-	MidiInDev[wDevID].bufsize = 0x3FFF;
+	MidiInDev[index].lpQueueHdr = NULL;
+	MidiInDev[index].unixdev = midi;
+	MidiInDev[index].dwTotalPlayed = 0;
+	MidiInDev[index].bufsize = 0x3FFF;
 	if (MIDI_NotifyClient(wDevID, MIM_OPEN, 0L, 0L) != MMSYSERR_NOERROR) {
 		dprintf_midi(stddeb,"Linux 'midOpen' // can't notify client !\n");
 		return MMSYSERR_INVALPARAM;
@@ -895,14 +906,15 @@ static DWORD midOpen(WORD wDevID, LPMIDIOPENDESC lpDesc, DWORD dwFlags)
 static DWORD midClose(WORD wDevID)
 {
 #if defined(linux) || defined(__FreeBSD__)
-	dprintf_midi(stddeb, "midClose(%u);\n", wDevID);
-	if (MidiInDev[wDevID].unixdev == 0) {
+	int index = MMSYSTEM_DevIDToIndex(wDevID);
+	dprintf_midi(stddeb, "midClose(%04X);\n", wDevID);
+	if (MidiInDev[index].unixdev == 0) {
 		dprintf_midi(stddeb,"Linux 'midClose' // can't close !\n");
 		return MMSYSERR_NOTENABLED;
 		}
-	close(MidiInDev[wDevID].unixdev);
-	MidiInDev[wDevID].unixdev = 0;
-	MidiInDev[wDevID].bufsize = 0;
+	close(MidiInDev[index].unixdev);
+	MidiInDev[index].unixdev = 0;
+	MidiInDev[index].bufsize = 0;
 	if (MIDI_NotifyClient(wDevID, MIM_CLOSE, 0L, 0L) != MMSYSERR_NOERROR) {
 		dprintf_midi(stddeb,"Linux 'midClose' // can't notify client !\n");
 		return MMSYSERR_INVALPARAM;
@@ -918,7 +930,7 @@ static DWORD midClose(WORD wDevID)
 */
 static DWORD midAddBuffer(WORD wDevID, LPMIDIHDR lpMidiHdr, DWORD dwSize)
 {
-	dprintf_midi(stddeb, "midAddBuffer(%u, %p, %08lX);\n", wDevID, lpMidiHdr, dwSize);
+	dprintf_midi(stddeb, "midAddBuffer(%04X, %p, %08lX);\n", wDevID, lpMidiHdr, dwSize);
 	return MMSYSERR_NOTENABLED;
 }
 
@@ -927,7 +939,7 @@ static DWORD midAddBuffer(WORD wDevID, LPMIDIHDR lpMidiHdr, DWORD dwSize)
 */
 static DWORD midPrepare(WORD wDevID, LPMIDIHDR lpMidiHdr, DWORD dwSize)
 {
-	dprintf_midi(stddeb, "midPrepare(%u, %p, %08lX);\n", wDevID, lpMidiHdr, dwSize);
+	dprintf_midi(stddeb, "midPrepare(%04X, %p, %08lX);\n", wDevID, lpMidiHdr, dwSize);
 	return MMSYSERR_NOTENABLED;
 }
 
@@ -936,7 +948,7 @@ static DWORD midPrepare(WORD wDevID, LPMIDIHDR lpMidiHdr, DWORD dwSize)
 */
 static DWORD midUnprepare(WORD wDevID, LPMIDIHDR lpMidiHdr, DWORD dwSize)
 {
-	dprintf_midi(stddeb, "midUnprepare(%u, %p, %08lX);\n", wDevID, lpMidiHdr, dwSize);
+	dprintf_midi(stddeb, "midUnprepare(%04X, %p, %08lX);\n", wDevID, lpMidiHdr, dwSize);
 	return MMSYSERR_NOTENABLED;
 }
 
@@ -945,7 +957,7 @@ static DWORD midUnprepare(WORD wDevID, LPMIDIHDR lpMidiHdr, DWORD dwSize)
 */
 static DWORD midReset(WORD wDevID)
 {
-	dprintf_midi(stddeb, "midReset(%u);\n", wDevID);
+	dprintf_midi(stddeb, "midReset(%04X);\n", wDevID);
 	return MMSYSERR_NOTENABLED;
 }
 
@@ -955,7 +967,7 @@ static DWORD midReset(WORD wDevID)
 */
 static DWORD midStart(WORD wDevID)
 {
-	dprintf_midi(stddeb, "midStart(%u);\n", wDevID);
+	dprintf_midi(stddeb, "midStart(%04X);\n", wDevID);
 	return MMSYSERR_NOTENABLED;
 }
 
@@ -965,7 +977,7 @@ static DWORD midStart(WORD wDevID)
 */
 static DWORD midStop(WORD wDevID)
 {
-	dprintf_midi(stddeb, "midStop(%u);\n", wDevID);
+	dprintf_midi(stddeb, "midStop(%04X);\n", wDevID);
 	return MMSYSERR_NOTENABLED;
 }
 
@@ -976,7 +988,7 @@ static DWORD midStop(WORD wDevID)
 DWORD midMessage(WORD wDevID, WORD wMsg, DWORD dwUser, 
 					DWORD dwParam1, DWORD dwParam2)
 {
-	dprintf_midi(stddeb, "midMessage(%u, %04X, %08lX, %08lX, %08lX);\n", 
+	dprintf_midi(stddeb, "midMessage(%04X, %04X, %08lX, %08lX, %08lX);\n", 
 			wDevID, wMsg, dwUser, dwParam1, dwParam2);
 	switch(wMsg) {
 		case MIDM_OPEN:
@@ -1013,7 +1025,7 @@ DWORD midMessage(WORD wDevID, WORD wMsg, DWORD dwUser,
 */
 static DWORD modGetDevCaps(WORD wDevID, LPMIDIOUTCAPS lpCaps, DWORD dwSize)
 {
-	dprintf_midi(stddeb, "modGetDevCaps(%u, %p, %08lX);\n", wDevID, lpCaps, dwSize);
+	dprintf_midi(stddeb, "modGetDevCaps(%04X, %p, %08lX);\n", wDevID, lpCaps, dwSize);
 	return MMSYSERR_NOTENABLED;
 }
 
@@ -1024,25 +1036,26 @@ static DWORD modGetDevCaps(WORD wDevID, LPMIDIOUTCAPS lpCaps, DWORD dwSize)
 static DWORD modOpen(WORD wDevID, LPMIDIOPENDESC lpDesc, DWORD dwFlags)
 {								 
 #if defined(linux) || defined(__FreeBSD__)
+	int index = MMSYSTEM_DevIDToIndex(wDevID);
 	int		midi;
 	dprintf_midi(stddeb,
-		"modOpen(%u, %p, %08lX);\n", wDevID, lpDesc, dwFlags);
+		"modOpen(%04X, %p, %08lX);\n", wDevID, lpDesc, dwFlags);
 	if (lpDesc == NULL) {
 		dprintf_midi(stddeb,"Linux 'modOpen' // Invalid Parameter !\n");
 		return MMSYSERR_INVALPARAM;
 		}
-	if (wDevID >= MAX_MIDIOUTDRV) {
+	if (index >= MAX_MIDIOUTDRV) {
 		dprintf_midi(stddeb,"Linux 'modOpen' // MAX_MIDIOUTDRV reached !\n");
 		return MMSYSERR_ALLOCATED;
 		}
-	MidiOutDev[wDevID].unixdev = 0;
+	MidiOutDev[index].unixdev = 0;
 	midi = open (MIDI_DEV, O_WRONLY, 0);
 	if (midi == -1) {
 		dprintf_midi(stddeb,"Linux 'modOpen' // can't open !\n");
 		return MMSYSERR_NOTENABLED;
 		}
-	MidiOutDev[wDevID].wFlags = HIWORD(dwFlags & CALLBACK_TYPEMASK);
-	switch(MidiOutDev[wDevID].wFlags) {
+	MidiOutDev[index].wFlags = HIWORD(dwFlags & CALLBACK_TYPEMASK);
+	switch(MidiOutDev[index].wFlags) {
 		case DCB_NULL:
 			dprintf_midi(stddeb,"Linux 'modOpen' // CALLBACK_NULL !\n");
 			break;
@@ -1059,10 +1072,10 @@ static DWORD modOpen(WORD wDevID, LPMIDIOPENDESC lpDesc, DWORD dwFlags)
 				"Linux 'modOpen' // CALLBACK_FUNCTION !\n");
 			break;
 		}
-	MidiOutDev[wDevID].lpQueueHdr = NULL;
-	MidiOutDev[wDevID].unixdev = midi;
-	MidiOutDev[wDevID].dwTotalPlayed = 0;
-	MidiOutDev[wDevID].bufsize = 0x3FFF;
+	MidiOutDev[index].lpQueueHdr = NULL;
+	MidiOutDev[index].unixdev = midi;
+	MidiOutDev[index].dwTotalPlayed = 0;
+	MidiOutDev[index].bufsize = 0x3FFF;
 	if (MIDI_NotifyClient(wDevID, MOM_OPEN, 0L, 0L) != MMSYSERR_NOERROR) {
 		dprintf_midi(stddeb,"Linux 'modOpen' // can't notify client !\n");
 		return MMSYSERR_INVALPARAM;
@@ -1082,14 +1095,15 @@ static DWORD modOpen(WORD wDevID, LPMIDIOPENDESC lpDesc, DWORD dwFlags)
 static DWORD modClose(WORD wDevID)
 {
 #if defined(linux) || defined(__FreeBSD__)
-	dprintf_midi(stddeb, "modClose(%u);\n", wDevID);
-	if (MidiOutDev[wDevID].unixdev == 0) {
+	int index = MMSYSTEM_DevIDToIndex(wDevID);
+	dprintf_midi(stddeb, "modClose(%04X);\n", wDevID);
+	if (MidiOutDev[index].unixdev == 0) {
 		dprintf_midi(stddeb,"Linux 'modClose' // can't close !\n");
 		return MMSYSERR_NOTENABLED;
 		}
-	close(MidiOutDev[wDevID].unixdev);
-	MidiOutDev[wDevID].unixdev = 0;
-	MidiOutDev[wDevID].bufsize = 0;
+	close(MidiOutDev[index].unixdev);
+	MidiOutDev[index].unixdev = 0;
+	MidiOutDev[index].bufsize = 0;
 	if (MIDI_NotifyClient(wDevID, MOM_CLOSE, 0L, 0L) != MMSYSERR_NOERROR) {
 		dprintf_midi(stddeb,"Linux 'modClose' // can't notify client !\n");
 		return MMSYSERR_INVALPARAM;
@@ -1106,15 +1120,16 @@ static DWORD modClose(WORD wDevID)
 static DWORD modData(WORD wDevID, DWORD dwParam)
 {
 #if defined(linux) || defined(__FreeBSD__)
+	int index = MMSYSTEM_DevIDToIndex(wDevID);
 	WORD	event;
 	dprintf_midi(stddeb,	
-		"modData(%u, %08lX);\n", wDevID, dwParam);
-	if (MidiOutDev[wDevID].unixdev == 0) {
+		"modData(%04X, %08lX);\n", wDevID, dwParam);
+	if (MidiOutDev[index].unixdev == 0) {
         dprintf_midi(stddeb,"Linux 'modData' // can't play !\n");
 		return MIDIERR_NODEVICE;
 		}
 	event = LOWORD(dwParam);
-	if (write (MidiOutDev[wDevID].unixdev, 
+	if (write (MidiOutDev[index].unixdev, 
 		&event, sizeof(WORD)) != sizeof(WORD)) {
 		dprintf_midi(stddeb,
 			"modData() // error writting unixdev !\n");
@@ -1131,12 +1146,12 @@ static DWORD modData(WORD wDevID, DWORD dwParam)
 static DWORD modLongData(WORD wDevID, LPMIDIHDR lpMidiHdr, DWORD dwSize)
 {
 #if defined(linux) || defined(__FreeBSD__)
+	int index = MMSYSTEM_DevIDToIndex(wDevID);
 	int		count;
 	LPWORD	ptr;
 	dprintf_midi(stddeb,	
-		"modLongData(%u, %p, %08lX);\n", wDevID, lpMidiHdr, dwSize);
-	dprintf_midi(stddeb, "modLongData(%u, %p, %08lX);\n", wDevID, lpMidiHdr, dwSize);
-	if (MidiOutDev[wDevID].unixdev == 0) {
+		"modLongData(%04X, %p, %08lX);\n", wDevID, lpMidiHdr, dwSize);
+	if (MidiOutDev[index].unixdev == 0) {
         dprintf_midi(stddeb,"Linux 'modLongData' // can't play !\n");
 		return MIDIERR_NODEVICE;
 		}
@@ -1148,19 +1163,19 @@ static DWORD modLongData(WORD wDevID, LPMIDIHDR lpMidiHdr, DWORD dwSize)
 	dprintf_midi(stddeb,
 		"modLongData() // dwBytesRecorded %lu !\n", lpMidiHdr->dwBytesRecorded);
 /*
-	count = write (MidiOutDev[wDevID].unixdev, 
+	count = write (MidiOutDev[index].unixdev, 
 		lpMidiHdr->lpData, lpMidiHdr->dwBytesRecorded);
 */
 	ptr = (LPWORD)lpMidiHdr->lpData;
 	for (count = 0; count < lpMidiHdr->dwBytesRecorded; count++) {
-		if (write (MidiOutDev[wDevID].unixdev, ptr, 
+		if (write (MidiOutDev[index].unixdev, ptr, 
 			sizeof(WORD)) != sizeof(WORD)) break;
 		ptr++;
 		}
 	if (count != lpMidiHdr->dwBytesRecorded) {
 		dprintf_midi(stddeb,
 			"modLongData() // error writting unixdev #%d ! (%d != %ld)\n",
-			MidiOutDev[wDevID].unixdev, count, lpMidiHdr->dwBytesRecorded);
+			MidiOutDev[index].unixdev, count, lpMidiHdr->dwBytesRecorded);
 		return MMSYSERR_NOTENABLED;
 		}
 	lpMidiHdr->dwFlags &= ~MHDR_INQUEUE;
@@ -1181,18 +1196,19 @@ static DWORD modLongData(WORD wDevID, LPMIDIHDR lpMidiHdr, DWORD dwSize)
 static DWORD modPrepare(WORD wDevID, LPMIDIHDR lpMidiHdr, DWORD dwSize)
 {
 #if defined(linux) || defined(__FreeBSD__)
+	int index = MMSYSTEM_DevIDToIndex(wDevID);
 	dprintf_midi(stddeb,
-		  "modPrepare(%u, %p, %08lX);\n", wDevID, lpMidiHdr, dwSize);
-	if (MidiOutDev[wDevID].unixdev == 0) {
+		  "modPrepare(%04X, %p, %08lX);\n", wDevID, lpMidiHdr, dwSize);
+	if (MidiOutDev[index].unixdev == 0) {
 		dprintf_midi(stddeb,"Linux 'modPrepare' // can't prepare !\n");
 		return MMSYSERR_NOTENABLED;
 		}
-	if (MidiOutDev[wDevID].lpQueueHdr != NULL) {
+	if (MidiOutDev[index].lpQueueHdr != NULL) {
 		dprintf_midi(stddeb,"Linux 'modPrepare' // already prepare !\n");
 		return MMSYSERR_NOTENABLED;
 		}
-	MidiOutDev[wDevID].dwTotalPlayed = 0;
-	MidiOutDev[wDevID].lpQueueHdr = lpMidiHdr;
+	MidiOutDev[index].dwTotalPlayed = 0;
+	MidiOutDev[index].lpQueueHdr = lpMidiHdr;
 	if (lpMidiHdr->dwFlags & MHDR_INQUEUE) return MIDIERR_STILLPLAYING;
 	lpMidiHdr->dwFlags |= MHDR_PREPARED;
 	lpMidiHdr->dwFlags &= ~MHDR_DONE;
@@ -1208,9 +1224,10 @@ static DWORD modPrepare(WORD wDevID, LPMIDIHDR lpMidiHdr, DWORD dwSize)
 static DWORD modUnprepare(WORD wDevID, LPMIDIHDR lpMidiHdr, DWORD dwSize)
 {
 #if defined(linux) || defined(__FreeBSD__)
+	int index = MMSYSTEM_DevIDToIndex(wDevID);
 	dprintf_midi(stddeb,
-		"modUnprepare(%u, %p, %08lX);\n", wDevID, lpMidiHdr, dwSize);
-	if (MidiOutDev[wDevID].unixdev == 0) {
+		"modUnprepare(%04X, %p, %08lX);\n", wDevID, lpMidiHdr, dwSize);
+	if (MidiOutDev[index].unixdev == 0) {
 		dprintf_midi(stddeb,"Linux 'modUnprepare' // can't unprepare !\n");
 		return MMSYSERR_NOTENABLED;
 		}
@@ -1225,7 +1242,7 @@ static DWORD modUnprepare(WORD wDevID, LPMIDIHDR lpMidiHdr, DWORD dwSize)
 */
 static DWORD modReset(WORD wDevID)
 {
-	dprintf_midi(stddeb, "modReset(%u);\n", wDevID);
+	dprintf_midi(stddeb, "modReset(%04X);\n", wDevID);
 	return MMSYSERR_NOTENABLED;
 }
 
@@ -1236,7 +1253,7 @@ static DWORD modReset(WORD wDevID)
 DWORD modMessage(WORD wDevID, WORD wMsg, DWORD dwUser, 
 					DWORD dwParam1, DWORD dwParam2)
 {
-	dprintf_midi(stddeb, "modMessage(%u, %04X, %08lX, %08lX, %08lX);\n", 
+	dprintf_midi(stddeb, "modMessage(%04X, %04X, %08lX, %08lX, %08lX);\n", 
 			wDevID, wMsg, dwUser, dwParam1, dwParam2);
 	switch(wMsg) {
 		case MODM_OPEN:
@@ -1330,5 +1347,3 @@ LONG MIDI_DriverProc(DWORD dwDevID, HDRVR16 hDriv, WORD wMsg,
 
 
 /*-----------------------------------------------------------------------*/
-
-#endif /* #ifdef BUILTIN_MMSYSTEM */
diff --git a/multimedia/mmaux.c b/multimedia/mmaux.c
index e325fd1f470..470c78da031 100644
--- a/multimedia/mmaux.c
+++ b/multimedia/mmaux.c
@@ -4,12 +4,6 @@
  * Copyright 1994 Martin Ayotte
  */
 
-#ifndef WINELIB
-#define BUILTIN_MMSYSTEM
-#endif 
-
-#ifdef BUILTIN_MMSYSTEM
-
 #define EMULATE_SB16
 
 #include <stdio.h>
@@ -26,6 +20,8 @@
 #include <linux/soundcard.h>
 #endif
 
+int MMSYSTEM_DevIDToIndex(UINT16);
+
 #define SOUND_DEV "/dev/dsp"
 #define MIXER_DEV "/dev/mixer"
 
@@ -49,7 +45,7 @@ static DWORD AUX_GetDevCaps(WORD wDevID, LPAUXCAPS lpCaps, DWORD dwSize)
 #ifdef linux
 	int 	mixer;
 	int		volume;
-	printf("AUX_GetDevCaps(%u, %p, %lu);\n", wDevID, lpCaps, dwSize);
+	printf("AUX_GetDevCaps(%04X, %p, %lu);\n", wDevID, lpCaps, dwSize);
 	if (lpCaps == NULL) return MMSYSERR_NOTENABLED;
 	if ((mixer = open(MIXER_DEV, O_RDWR)) < 0) {
 		printf("AUX_GetDevCaps // mixer device not available !\n");
@@ -65,7 +61,7 @@ static DWORD AUX_GetDevCaps(WORD wDevID, LPAUXCAPS lpCaps, DWORD dwSize)
 	lpCaps->wMid = 0x0002;
 	lpCaps->vDriverVersion = 0x0200;
 	lpCaps->dwSupport = AUXCAPS_VOLUME | AUXCAPS_LRVOLUME;
-	switch (wDevID) {
+	switch (MMSYSTEM_DevIDToIndex(wDevID)) {
 		case 0:
 			lpCaps->wPid = 0x0196;
 			strcpy(lpCaps->szPname, "SB16 Aux: Wave");
@@ -121,13 +117,13 @@ static DWORD AUX_GetVolume(WORD wDevID, LPDWORD lpdwVol)
 	int 	mixer;
 	int		volume, left, right;
 	int		cmd;
-	printf("AUX_GetVolume(%u, %p);\n", wDevID, lpdwVol);
+	printf("AUX_GetVolume(%04X, %p);\n", wDevID, lpdwVol);
 	if (lpdwVol == NULL) return MMSYSERR_NOTENABLED;
 	if ((mixer = open(MIXER_DEV, O_RDWR)) < 0) {
 		printf("Linux 'AUX_GetVolume' // mixer device not available !\n");
 		return MMSYSERR_NOTENABLED;
 		}
-	switch(wDevID) {
+	switch(MMSYSTEM_DevIDToIndex(wDevID)) {
 		case 0:
 			printf("Linux 'AUX_GetVolume' // SOUND_MIXER_READ_PCM !\n");
 			cmd = SOUND_MIXER_READ_PCM;
@@ -153,10 +149,10 @@ static DWORD AUX_GetVolume(WORD wDevID, LPDWORD lpdwVol)
 			cmd = SOUND_MIXER_READ_VOLUME;
 			break;
 		default:
-			fprintf(stderr, "Linux 'AUX_GetVolume' // invalid device id=%d !\n", wDevID);
+			fprintf(stderr, "Linux 'AUX_GetVolume' // invalid device id=%04X !\n", wDevID);
 			return MMSYSERR_NOTENABLED;
 		}
-    if (ioctl(mixer, cmd, &volume) == -1) {
+	if (ioctl(mixer, cmd, &volume) == -1) {
 		printf("Linux 'AUX_GetVolume' // unable read mixer !\n");
 		return MMSYSERR_NOTENABLED;
 		}
@@ -180,14 +176,14 @@ static DWORD AUX_SetVolume(WORD wDevID, DWORD dwParam)
 	int 	mixer;
 	int		volume;
 	int		cmd;
-	printf("AUX_SetVolume(%u (%04X), %08lX);\n", wDevID, wDevID, dwParam);
+	printf("AUX_SetVolume(%04X, %08lX);\n", wDevID, dwParam);
 	volume = (LOWORD(dwParam) >> 9 & 0x7F) + 
 		((HIWORD(dwParam) >> 9  & 0x7F) << 8);
 	if ((mixer = open(MIXER_DEV, O_RDWR)) < 0) {
 		printf("Linux 'AUX_SetVolume' // mixer device not available !\n");
 		return MMSYSERR_NOTENABLED;
 		}
-	switch(wDevID) {
+	switch(MMSYSTEM_DevIDToIndex(wDevID)) {
 		case 0:
 			printf("Linux 'AUX_SetVolume' // SOUND_MIXER_WRITE_PCM !\n");
 			cmd = SOUND_MIXER_WRITE_PCM;
@@ -213,7 +209,7 @@ static DWORD AUX_SetVolume(WORD wDevID, DWORD dwParam)
 			cmd = SOUND_MIXER_WRITE_VOLUME;
 			break;
 		default:
-			fprintf(stderr, "Linux 'AUX_SetVolume' // invalid device id=%d !\n", wDevID);
+			fprintf(stderr, "Linux 'AUX_SetVolume' // invalid device id=%04X !\n", wDevID);
 			return MMSYSERR_NOTENABLED;
 		}
     if (ioctl(mixer, cmd, &volume) == -1) {
@@ -234,7 +230,7 @@ static DWORD AUX_SetVolume(WORD wDevID, DWORD dwParam)
 DWORD auxMessage(WORD wDevID, WORD wMsg, DWORD dwUser, 
 					DWORD dwParam1, DWORD dwParam2)
 {
-	printf("auxMessage(%u, %04X, %08lX, %08lX, %08lX);\n", 
+	printf("auxMessage(%04X, %04X, %08lX, %08lX, %08lX);\n", 
 			wDevID, wMsg, dwUser, dwParam1, dwParam2);
 	switch(wMsg) {
 		case AUXDM_GETDEVCAPS:
@@ -252,6 +248,3 @@ DWORD auxMessage(WORD wDevID, WORD wMsg, DWORD dwUser,
 		}
 	return MMSYSERR_NOTSUPPORTED;
 }
-
-
-#endif /* #ifdef BUILTIN_MMSYSTEM */
diff --git a/multimedia/mmsystem.c b/multimedia/mmsystem.c
index 12337a6ab52..0c232a5c7e0 100644
--- a/multimedia/mmsystem.c
+++ b/multimedia/mmsystem.c
@@ -7,8 +7,6 @@
  *        and long term pointers to 16 bit space in here
  */
 
-#ifndef WINELIB
-
 #include <unistd.h>
 #include <stdio.h>
 #include <stdlib.h>
@@ -16,6 +14,7 @@
 #include <fcntl.h>
 #include <sys/ioctl.h>
 #include "windows.h"
+#include "heap.h"
 #include "ldt.h"
 #include "user.h"
 #include "driver.h"
@@ -35,8 +34,8 @@ MCI_OPEN_DRIVER_PARMS	mciDrv[MAXMCIDRIVERS];
  */
 MCI_OPEN_PARMS		mciOpenDrv[MAXMCIDRIVERS];
 
-UINT midiGetErrorText(UINT uError, LPSTR lpText, UINT uSize);
-UINT waveGetErrorText(UINT uError, LPSTR lpText, UINT uSize);
+UINT16 midiGetErrorText(UINT16 uError, LPSTR lpText, UINT16 uSize);
+UINT16 waveGetErrorText(UINT16 uError, LPSTR lpText, UINT16 uSize);
 LONG DrvDefDriverProc(DWORD dwDevID, HDRVR16 hDriv, WORD wMsg, 
 		      DWORD dwParam1, DWORD dwParam2);
 
@@ -49,6 +48,50 @@ LONG CDAUDIO_DriverProc(DWORD dwDevID, HDRVR16 hDriv, WORD wMsg,
 LONG ANIM_DriverProc(DWORD dwDevID, HDRVR16 hDriv, WORD wMsg, 
 		     DWORD dwParam1, DWORD dwParam2);
 
+
+#define GetDrv(wDevID) (&mciDrv[MMSYSTEM_DevIDToIndex(wDevID)])
+#define GetOpenDrv(wDevID) (&mciOpenDrv[MMSYSTEM_DevIDToIndex(wDevID)])
+
+/* The wDevID's returned by wine were originally in the range 
+ * 0 - (MAXMCIDRIVERS - 1) and used directly as array indices.
+ * Unfortunately, ms-windows uses wDevID of zero to indicate
+ * errors.  Now, multimedia drivers must pass the wDevID through
+ * MMSYSTEM_DevIDToIndex to get an index in that range.  An
+ * aribtrary value, MMSYSTEM_MAGIC is added to the wDevID seen
+ * by the windows programs.
+ */
+
+#define MMSYSTEM_MAGIC 0x0F00
+
+/**************************************************************************
+* 				MMSYSTEM_DevIDToIndex	[internal]
+*/
+int MMSYSTEM_DevIDToIndex(UINT16 wDevID) {
+	return wDevID - MMSYSTEM_MAGIC;
+}
+
+/**************************************************************************
+* 				MMSYSTEM_FirstDevId	[internal]
+*/
+UINT16 MMSYSTEM_FirstDevID(void)
+{
+	return MMSYSTEM_MAGIC;
+}
+
+/**************************************************************************
+* 				MMSYSTEM_NextDevId	[internal]
+*/
+UINT16 MMSYSTEM_NextDevID(UINT16 wDevID) {
+	return wDevID + 1;
+}
+
+/**************************************************************************
+* 				MMSYSTEM_DevIdValid	[internal]
+*/
+BOOL32 MMSYSTEM_DevIDValid(UINT16 wDevID) {
+	return wDevID >= 0x0F00 && wDevID < (0x0F00 + MAXMCIDRIVERS);
+}
+
 /**************************************************************************
 * 				MMSYSTEM_WEP		[MMSYSTEM.1]
 */
@@ -63,7 +106,7 @@ int MMSYSTEM_WEP(HINSTANCE16 hInstance, WORD wDataSeg,
 /**************************************************************************
 * 				sndPlaySound		[MMSYSTEM.2]
 */
-BOOL sndPlaySound(LPCSTR lpszSoundName, UINT uFlags)
+BOOL16 sndPlaySound(LPCSTR lpszSoundName, UINT16 uFlags)
 {
 	HMMIO16			hmmio;
 	MMCKINFO		mmckInfo;
@@ -89,6 +132,12 @@ BOOL sndPlaySound(LPCSTR lpszSoundName, UINT uFlags)
 		}
 	hmmio = mmioOpen((LPSTR)lpszSoundName, NULL, 
 		MMIO_ALLOCBUF | MMIO_READ | MMIO_DENYWRITE);
+
+	if (uFlags & SND_MEMORY) {
+		dprintf_mmsys(stddeb, "sndPlaySound // SND_MEMORY flag not implemented!\n");
+		return FALSE;
+	}
+
 	if (hmmio == 0) {
 		dprintf_mmsys(stddeb, "sndPlaySound // searching in SystemSound List !\n");
 		GetProfileString32A("Sounds", (LPSTR)lpszSoundName, "", str, sizeof(str));
@@ -201,7 +250,7 @@ LRESULT DriverProc(DWORD dwDevID, HDRVR16 hDriv, WORD wMsg,
 /**************************************************************************
 * 				DriverCallback	[MMSYSTEM.31]
 */
-BOOL DriverCallback(DWORD dwCallBack, UINT uFlags, HANDLE16 hDev, 
+BOOL16 DriverCallback(DWORD dwCallBack, UINT16 uFlags, HANDLE16 hDev, 
 		WORD wMsg, DWORD dwUser, DWORD dwParam1, DWORD dwParam2)
 {
 	dprintf_mmsys(stddeb, "DriverCallback(%08lX, %04X, %04X, %04X, %08lX, %08lX, %08lX); !\n",
@@ -226,9 +275,9 @@ BOOL DriverCallback(DWORD dwCallBack, UINT uFlags, HANDLE16 hDev,
 /**************************************************************************
 * 				auxGetNumDevs		[MMSYSTEM.350]
 */
-UINT auxGetNumDevs()
+UINT16 auxGetNumDevs()
 {
-	UINT	count = 0;
+	UINT16	count = 0;
 	dprintf_mmsys(stddeb, "auxGetNumDevs !\n");
 	count += auxMessage(0, AUXDM_GETNUMDEVS, 0L, 0L, 0L);
 	dprintf_mmsys(stddeb, "auxGetNumDevs return %u \n", count);
@@ -238,7 +287,7 @@ UINT auxGetNumDevs()
 /**************************************************************************
 * 				auxGetDevCaps		[MMSYSTEM.351]
 */
-UINT auxGetDevCaps(UINT uDeviceID, AUXCAPS * lpCaps, UINT uSize)
+UINT16 auxGetDevCaps(UINT16 uDeviceID, AUXCAPS * lpCaps, UINT16 uSize)
 {
 	dprintf_mmsys(stddeb, "auxGetDevCaps(%04X, %p, %d) !\n", 
 					uDeviceID, lpCaps, uSize);
@@ -249,7 +298,7 @@ UINT auxGetDevCaps(UINT uDeviceID, AUXCAPS * lpCaps, UINT uSize)
 /**************************************************************************
 * 				auxGetVolume		[MMSYSTEM.352]
 */
-UINT auxGetVolume(UINT uDeviceID, DWORD * lpdwVolume)
+UINT16 auxGetVolume(UINT16 uDeviceID, DWORD * lpdwVolume)
 {
 	dprintf_mmsys(stddeb, "auxGetVolume(%04X, %p) !\n", uDeviceID, lpdwVolume);
 	return auxMessage(uDeviceID, AUXDM_GETVOLUME, 0L, (DWORD)lpdwVolume, 0L);
@@ -258,7 +307,7 @@ UINT auxGetVolume(UINT uDeviceID, DWORD * lpdwVolume)
 /**************************************************************************
 * 				auxSetVolume		[MMSYSTEM.353]
 */
-UINT auxSetVolume(UINT uDeviceID, DWORD dwVolume)
+UINT16 auxSetVolume(UINT16 uDeviceID, DWORD dwVolume)
 {
 	dprintf_mmsys(stddeb, "auxSetVolume(%04X, %08lX) !\n", uDeviceID, dwVolume);
 	return auxMessage(uDeviceID, AUXDM_SETVOLUME, 0L, dwVolume, 0L);
@@ -267,7 +316,7 @@ UINT auxSetVolume(UINT uDeviceID, DWORD dwVolume)
 /**************************************************************************
 * 				auxOutMessage		[MMSYSTEM.354]
 */
-DWORD auxOutMessage(UINT uDeviceID, UINT uMessage, DWORD dw1, DWORD dw2)
+DWORD auxOutMessage(UINT16 uDeviceID, UINT16 uMessage, DWORD dw1, DWORD dw2)
 {
 	dprintf_mmsys(stddeb, "auxOutMessage(%04X, %04X, %08lX, %08lX)\n", 
 				uDeviceID, uMessage, dw1, dw2);
@@ -277,7 +326,7 @@ DWORD auxOutMessage(UINT uDeviceID, UINT uMessage, DWORD dw1, DWORD dw2)
 /**************************************************************************
 * 				mciGetErrorString		[MMSYSTEM.706]
 */
-BOOL mciGetErrorString (DWORD wError, LPSTR lpstrBuffer, UINT uLength)
+BOOL16 mciGetErrorString (DWORD wError, LPSTR lpstrBuffer, UINT16 uLength)
 {
 	LPSTR	msgptr;
 	dprintf_mmsys(stddeb, "mciGetErrorString(%08lX, %p, %d);\n", wError, lpstrBuffer, uLength);
@@ -537,13 +586,13 @@ msg# 543 : tmsf
 /**************************************************************************
 * 				mciDriverNotify			[MMSYSTEM.711]
 */
-BOOL mciDriverNotify(HWND16 hWndCallBack, UINT wDevID, UINT wStatus)
+BOOL16 mciDriverNotify(HWND16 hWndCallBack, UINT16 wDevID, UINT16 wStatus)
 {
 	dprintf_mmsys(stddeb, "mciDriverNotify(%04X, %u, %04X)\n", hWndCallBack, wDevID, wStatus);
-	if (!IsWindow(hWndCallBack)) return FALSE;
+	if (!IsWindow32(hWndCallBack)) return FALSE;
 	dprintf_mmsys(stddeb, "mciDriverNotify // before PostMessage\n");
-	PostMessage(hWndCallBack, MM_MCINOTIFY, wStatus, 
-			MAKELONG(mciDrv[wDevID].wDeviceID, 0));
+	PostMessage16( hWndCallBack, MM_MCINOTIFY, wStatus, 
+                       MAKELONG(GetDrv(wDevID)->wDeviceID, 0));
 	return TRUE;
 }
 
@@ -551,31 +600,25 @@ BOOL mciDriverNotify(HWND16 hWndCallBack, UINT wDevID, UINT wStatus)
 * 				mciOpen					[internal]
 */
 
-#define	_MCI_STRDUP_TO_SEG(dest,source) {\
-	HLOCAL16 x;\
-	x=USER_HEAP_ALLOC(strlen(source)+1);\
-	dest=(LPSTR)MAKELONG(x,USER_HeapSel);\
-	strcpy(PTR_SEG_TO_LIN(dest),source);\
-}
-
 DWORD mciOpen(DWORD dwParam, LPMCI_OPEN_PARMS lp16Parms)
 {
 	char	str[128];
 	LPMCI_OPEN_PARMS lpParms;
-	UINT	uDevTyp = 0;
-	UINT	wDevID = 0;
+	UINT16	uDevTyp = 0;
+	UINT16	wDevID = MMSYSTEM_FirstDevID();
 
 	lpParms = PTR_SEG_TO_LIN(lp16Parms);
 	dprintf_mmsys(stddeb, "mciOpen(%08lX, %p (%p))\n", dwParam, lp16Parms, lpParms);
 	if (lp16Parms == NULL) return MCIERR_INTERNAL;
-	while(mciDrv[wDevID].wType != 0) {
-		if (++wDevID >= MAXMCIDRIVERS) {
+	while(GetDrv(wDevID)->wType != 0) {
+		wDevID = MMSYSTEM_NextDevID(wDevID);
+		if (!MMSYSTEM_DevIDValid(wDevID)) {
 			dprintf_mmsys(stddeb, "MCI_OPEN // MAXMCIDRIVERS reached !\n");
 			return MCIERR_INTERNAL;
 		}
 	}
-	dprintf_mmsys(stddeb, "mciOpen // wDevID=%d \n", wDevID);
-	memcpy(&mciOpenDrv[wDevID],lpParms,sizeof(*lpParms));
+	dprintf_mmsys(stddeb, "mciOpen // wDevID=%04X \n", wDevID);
+	memcpy(GetOpenDrv(wDevID),lpParms,sizeof(*lpParms));
 
 	if (dwParam & MCI_OPEN_ELEMENT) {
 		char	*s,*t;
@@ -616,25 +659,21 @@ DWORD mciOpen(DWORD dwParam, LPMCI_OPEN_PARMS lp16Parms)
 	if (dwParam & MCI_OPEN_ALIAS) {
 		dprintf_mmsys(stddeb, "MCI_OPEN // Alias='%s' !\n",
 			(char*)PTR_SEG_TO_LIN(lpParms->lpstrAlias));
-		_MCI_STRDUP_TO_SEG(
-			mciOpenDrv[wDevID].lpstrAlias,
-			(char*)PTR_SEG_TO_LIN(lpParms->lpstrAlias)
-		);
+                GetOpenDrv(wDevID)->lpstrAlias = SEGPTR_GET(
+                    SEGPTR_STRDUP((char*)PTR_SEG_TO_LIN(lpParms->lpstrAlias)));
 		/* mplayer does allocate alias to CDAUDIO */
 	}
 	if (dwParam & MCI_OPEN_TYPE) {
 		if (dwParam & MCI_OPEN_TYPE_ID) {
-			dprintf_mmsys(stddeb, "MCI_OPEN // Dev=%p !\n", lpParms->lpstrDeviceType);
+			dprintf_mmsys(stddeb, "MCI_OPEN // Dev=%08lx !\n", lpParms->lpstrDeviceType);
 			uDevTyp = LOWORD((DWORD)lpParms->lpstrDeviceType);
-			mciOpenDrv[wDevID].lpstrDeviceType=lpParms->lpstrDeviceType;
+ 			GetOpenDrv(wDevID)->lpstrDeviceType=lpParms->lpstrDeviceType;
 		} else {
 			if (lpParms->lpstrDeviceType == NULL) return MCIERR_INTERNAL;
 			dprintf_mmsys(stddeb, "MCI_OPEN // Dev='%s' !\n",
                               (char*)PTR_SEG_TO_LIN(lpParms->lpstrDeviceType));
-			_MCI_STRDUP_TO_SEG(
-				mciOpenDrv[wDevID].lpstrDeviceType,
-				(char*)PTR_SEG_TO_LIN(lpParms->lpstrDeviceType)
-			);
+                        GetOpenDrv(wDevID)->lpstrDeviceType = SEGPTR_GET(
+              SEGPTR_STRDUP((char*)PTR_SEG_TO_LIN(lpParms->lpstrDeviceType)));
 			strcpy(str, PTR_SEG_TO_LIN(lpParms->lpstrDeviceType));
 			CharUpper32A(str);
 			if (strcmp(str, "CDAUDIO") == 0) {
@@ -654,35 +693,32 @@ DWORD mciOpen(DWORD dwParam, LPMCI_OPEN_PARMS lp16Parms)
 			}
 		}
 	}
-	mciDrv[wDevID].wType = uDevTyp;
-	mciDrv[wDevID].wDeviceID = wDevID;
+	GetDrv(wDevID)->wType = uDevTyp;
+	GetDrv(wDevID)->wDeviceID = wDevID;
 	lpParms->wDeviceID = wDevID;
 	dprintf_mmsys(stddeb, "MCI_OPEN // mcidev=%d, uDevTyp=%04X wDeviceID=%04X !\n", 
 				wDevID, uDevTyp, lpParms->wDeviceID);
-	switch(uDevTyp) {
-		case MCI_DEVTYPE_CD_AUDIO:
-#ifdef WINELIB
-			WINELIB_UNIMP ("CDAUDIO_DriverProc");
-#else
-			return CDAUDIO_DriverProc(0, 0, MCI_OPEN_DRIVER,
-							dwParam, (DWORD)lp16Parms);
-#endif
-		case MCI_DEVTYPE_WAVEFORM_AUDIO:
-			return WAVE_DriverProc(0, 0, MCI_OPEN_DRIVER, 
-								dwParam, (DWORD)lp16Parms);
-		case MCI_DEVTYPE_SEQUENCER:
-			return MIDI_DriverProc(0, 0, MCI_OPEN_DRIVER, 
-								dwParam, (DWORD)lp16Parms);
-		case MCI_DEVTYPE_ANIMATION:
-			return ANIM_DriverProc(0, 0, MCI_OPEN_DRIVER, 
-								dwParam, (DWORD)lp16Parms);
-		case MCI_DEVTYPE_DIGITAL_VIDEO:
-			dprintf_mmsys(stddeb, "MCI_OPEN // No DIGITAL_VIDEO yet !\n");
-			return MCIERR_DEVICE_NOT_INSTALLED;
-		default:
-			dprintf_mmsys(stddeb, "MCI_OPEN // Invalid Device Name '%p' !\n", lpParms->lpstrDeviceType);
-			return MCIERR_INVALID_DEVICE_NAME;
-		}
+	switch(uDevTyp)
+        {
+        case MCI_DEVTYPE_CD_AUDIO:
+            return CDAUDIO_DriverProc( 0, 0, MCI_OPEN_DRIVER,
+                                       dwParam, (DWORD)lp16Parms);
+        case MCI_DEVTYPE_WAVEFORM_AUDIO:
+            return WAVE_DriverProc( 0, 0, MCI_OPEN_DRIVER, 
+                                    dwParam, (DWORD)lp16Parms);
+        case MCI_DEVTYPE_SEQUENCER:
+            return MIDI_DriverProc( 0, 0, MCI_OPEN_DRIVER, 
+                                    dwParam, (DWORD)lp16Parms);
+        case MCI_DEVTYPE_ANIMATION:
+            return ANIM_DriverProc( 0, 0, MCI_OPEN_DRIVER, 
+                                    dwParam, (DWORD)lp16Parms);
+        case MCI_DEVTYPE_DIGITAL_VIDEO:
+            dprintf_mmsys(stddeb, "MCI_OPEN // No DIGITAL_VIDEO yet !\n");
+            return MCIERR_DEVICE_NOT_INSTALLED;
+        default:
+            dprintf_mmsys(stddeb, "MCI_OPEN // Invalid Device Name '%08lx' !\n", lpParms->lpstrDeviceType);
+            return MCIERR_INVALID_DEVICE_NAME;
+        }
 	return MCIERR_INTERNAL;
 }
 
@@ -690,33 +726,34 @@ DWORD mciOpen(DWORD dwParam, LPMCI_OPEN_PARMS lp16Parms)
 /**************************************************************************
 * 				mciClose				[internal]
 */
-DWORD mciClose(UINT wDevID, DWORD dwParam, LPMCI_GENERIC_PARMS lpParms)
+DWORD mciClose(UINT16 wDevID, DWORD dwParam, LPMCI_GENERIC_PARMS lpParms)
 {
 	DWORD	dwRet = MCIERR_INTERNAL;
 	dprintf_mmsys(stddeb, "mciClose(%u, %08lX, %p)\n", wDevID, dwParam, lpParms);
-	switch(mciDrv[wDevID].wType) {
+	switch(GetDrv(wDevID)->wType) {
 		case MCI_DEVTYPE_CD_AUDIO:
-#ifndef WINELIB
-			dwRet = CDAUDIO_DriverProc(mciDrv[wDevID].wDeviceID, 0, 
-						MCI_CLOSE, dwParam, (DWORD)lpParms);
-#endif
+			dwRet = CDAUDIO_DriverProc(GetDrv(wDevID)->wDeviceID,0,
+                                           MCI_CLOSE, dwParam, (DWORD)lpParms);
 			break;
 		case MCI_DEVTYPE_WAVEFORM_AUDIO:
-			dwRet = WAVE_DriverProc(mciDrv[wDevID].wDeviceID, 0, 
-						MCI_CLOSE, dwParam, (DWORD)lpParms);
+			dwRet = WAVE_DriverProc(GetDrv(wDevID)->wDeviceID, 0, 
+						MCI_CLOSE, dwParam,
+                                                (DWORD)lpParms);
 			break;
 		case MCI_DEVTYPE_SEQUENCER:
-			dwRet = MIDI_DriverProc(mciDrv[wDevID].wDeviceID, 0, 
-						MCI_CLOSE, dwParam, (DWORD)lpParms);
+			dwRet = MIDI_DriverProc(GetDrv(wDevID)->wDeviceID, 0, 
+						MCI_CLOSE, dwParam,
+                                                (DWORD)lpParms);
 			break;
 		case MCI_DEVTYPE_ANIMATION:
-			dwRet = ANIM_DriverProc(mciDrv[wDevID].wDeviceID, 0, 
-						MCI_CLOSE, dwParam, (DWORD)lpParms);
+			dwRet = ANIM_DriverProc(GetDrv(wDevID)->wDeviceID, 0, 
+						MCI_CLOSE, dwParam,
+                                                (DWORD)lpParms);
 			break;
 		default:
-			dprintf_mmsys(stddeb, "mciClose() // unknown device type=%04X !\n", mciDrv[wDevID].wType);
+			dprintf_mmsys(stddeb, "mciClose() // unknown device type=%04X !\n", GetDrv(wDevID)->wType);
 		}
-	mciDrv[wDevID].wType = 0;
+	GetDrv(wDevID)->wType = 0;
 	return dwRet;
 }
 
@@ -772,7 +809,7 @@ DWORD mciSysInfo(DWORD dwFlags, LPMCI_SYSINFO_PARMS lpParms)
 /**************************************************************************
 * 				mciSound				[internal]
 */
-DWORD mciSound(UINT wDevID, DWORD dwParam, LPMCI_SOUND_PARMS lpParms)
+DWORD mciSound(UINT16 wDevID, DWORD dwParam, LPMCI_SOUND_PARMS lpParms)
 {
 	if (lpParms == NULL) return MCIERR_INTERNAL;
 	if (dwParam & MCI_SOUND_NAME)
@@ -781,62 +818,127 @@ DWORD mciSound(UINT wDevID, DWORD dwParam, LPMCI_SOUND_PARMS lpParms)
 }
 
 
+static const char *_mciCommandToString(UINT16 wMsg)
+{
+	static char buffer[100];
+
+#define CASE(s) case (s): return #s
+
+	switch (wMsg) {
+		CASE(MCI_OPEN);
+		CASE(MCI_CLOSE);
+		CASE(MCI_ESCAPE);
+		CASE(MCI_PLAY);
+		CASE(MCI_SEEK);
+		CASE(MCI_STOP);
+		CASE(MCI_PAUSE);
+		CASE(MCI_INFO);
+		CASE(MCI_GETDEVCAPS);
+		CASE(MCI_SPIN);
+		CASE(MCI_SET);
+		CASE(MCI_STEP);
+		CASE(MCI_RECORD);
+		CASE(MCI_SYSINFO);
+		CASE(MCI_BREAK);
+		CASE(MCI_SAVE);
+		CASE(MCI_STATUS);
+		CASE(MCI_CUE);
+		CASE(MCI_REALIZE);
+		CASE(MCI_WINDOW);
+		CASE(MCI_PUT);
+		CASE(MCI_WHERE);
+		CASE(MCI_FREEZE);
+		CASE(MCI_UNFREEZE);
+		CASE(MCI_LOAD);
+		CASE(MCI_CUT);
+		CASE(MCI_COPY);
+		CASE(MCI_PASTE);
+		CASE(MCI_UPDATE);
+		CASE(MCI_RESUME);
+		CASE(MCI_DELETE);
+		default:
+			sprintf(buffer, "%04X", wMsg);
+			return buffer;
+
+	}
+}
 
 /**************************************************************************
 * 				mciSendCommand			[MMSYSTEM.701]
 */
-DWORD mciSendCommand(UINT wDevID, UINT wMsg, DWORD dwParam1, DWORD dwParam2)
-{
-	HDRVR16	hDrv = 0;
-	dprintf_mci(stddeb, "mciSendCommand(%04X, %04X, %08lX, %08lX)\n", 
-					wDevID, wMsg, dwParam1, dwParam2);
-	switch(wMsg) {
-		case MCI_OPEN:
-			return mciOpen(dwParam1, (LPMCI_OPEN_PARMS)dwParam2);
-		case MCI_CLOSE:
-			return mciClose(wDevID, dwParam1, (LPMCI_GENERIC_PARMS)PTR_SEG_TO_LIN(dwParam2));
-		case MCI_SYSINFO:
-			return mciSysInfo(dwParam1, (LPMCI_SYSINFO_PARMS)PTR_SEG_TO_LIN(dwParam2));
-		default:
-			switch(mciDrv[wDevID].wType) {
-				case MCI_DEVTYPE_CD_AUDIO:
-#ifndef WINELIB
-					return CDAUDIO_DriverProc(mciDrv[wDevID].wDeviceID, hDrv, 
-											wMsg, dwParam1, dwParam2);
-#endif
-					
-				case MCI_DEVTYPE_WAVEFORM_AUDIO:
-					return WAVE_DriverProc(mciDrv[wDevID].wDeviceID, hDrv, 
-											wMsg, dwParam1, dwParam2);
-				case MCI_DEVTYPE_SEQUENCER:
-					return MIDI_DriverProc(mciDrv[wDevID].wDeviceID, hDrv, 
-											wMsg, dwParam1, dwParam2);
-				case MCI_DEVTYPE_ANIMATION:
-					return ANIM_DriverProc(mciDrv[wDevID].wDeviceID, hDrv, 
-											wMsg, dwParam1, dwParam2);
-				default:
-					dprintf_mci(stddeb, "mciSendCommand() // unknown device type=%04X !\n", 
-											mciDrv[wDevID].wType);
-				}
-		}
-	return MMSYSERR_INVALPARAM;
+DWORD mciSendCommand(UINT16 wDevID, UINT16 wMsg, DWORD dwParam1, DWORD dwParam2)
+{
+    HDRVR16 hDrv = 0;
+    dprintf_mci(stddeb, "mciSendCommand(%04X, %s, %08lX, %08lX)\n", 
+                wDevID, _mciCommandToString(wMsg), dwParam1, dwParam2);
+    switch(wMsg)
+    {
+    case MCI_OPEN:
+        return mciOpen(dwParam1, (LPMCI_OPEN_PARMS)dwParam2);
+    case MCI_CLOSE:
+        return mciClose( wDevID, dwParam1,
+                         (LPMCI_GENERIC_PARMS)PTR_SEG_TO_LIN(dwParam2));
+    case MCI_SYSINFO:
+        return mciSysInfo( dwParam1,
+                           (LPMCI_SYSINFO_PARMS)PTR_SEG_TO_LIN(dwParam2));
+    default:
+        switch(GetDrv(wDevID)->wType)
+        {
+        case MCI_DEVTYPE_CD_AUDIO:
+            return CDAUDIO_DriverProc(GetDrv(wDevID)->wDeviceID, hDrv, 
+                                      wMsg, dwParam1, dwParam2);
+        case MCI_DEVTYPE_WAVEFORM_AUDIO:
+            return WAVE_DriverProc(GetDrv(wDevID)->wDeviceID, hDrv, 
+                                   wMsg, dwParam1, dwParam2);
+        case MCI_DEVTYPE_SEQUENCER:
+            return MIDI_DriverProc(GetDrv(wDevID)->wDeviceID, hDrv, 
+                                   wMsg, dwParam1, dwParam2);
+        case MCI_DEVTYPE_ANIMATION:
+            return ANIM_DriverProc(GetDrv(wDevID)->wDeviceID, hDrv, 
+                                   wMsg, dwParam1, dwParam2);
+        default:
+            dprintf_mci(stddeb,
+                        "mciSendCommand() // unknown device type=%04X !\n", 
+                        GetDrv(wDevID)->wType);
+        }
+    }
+    return MMSYSERR_INVALPARAM;
 }
 
 /**************************************************************************
 * 				mciGetDeviceID	       	[MMSYSTEM.703]
 */
-UINT mciGetDeviceID (LPCSTR lpstrName)
+UINT16 mciGetDeviceID (LPCSTR lpstrName)
 {
-    dprintf_mci(stddeb, "mciGetDeviceID(%s)\n", lpstrName);
+    UINT16 wDevID;
+
+    dprintf_mci(stddeb, "mciGetDeviceID(\"%s\")\n", lpstrName);
     if (lpstrName && !lstrcmpi32A(lpstrName, "ALL"))
         return MCI_ALL_DEVICE_ID;
+
+    if (!lpstrName)
+	return 0;
+
+    wDevID = MMSYSTEM_FirstDevID();
+    while(GetDrv(wDevID)->wType) {
+	if (GetOpenDrv(wDevID)->lpstrDeviceType && 
+            strcmp(PTR_SEG_TO_LIN(GetOpenDrv(wDevID)->lpstrDeviceType), lpstrName) == 0)
+	    return wDevID;
+
+	if (GetOpenDrv(wDevID)->lpstrAlias && 
+            strcmp(PTR_SEG_TO_LIN(GetOpenDrv(wDevID)->lpstrAlias), lpstrName) == 0)
+	    return wDevID;
+
+	wDevID = MMSYSTEM_NextDevID(wDevID);
+    }
+
     return 0;
 }
 
 /**************************************************************************
 * 				mciSetYieldProc		[MMSYSTEM.714]
 */
-BOOL mciSetYieldProc (UINT uDeviceID, 
+BOOL16 mciSetYieldProc (UINT16 uDeviceID, 
 		YIELDPROC fpYieldProc, DWORD dwYieldData)
 {
     return FALSE;
@@ -845,7 +947,7 @@ BOOL mciSetYieldProc (UINT uDeviceID,
 /**************************************************************************
 * 				mciGetDeviceIDFromElementID	[MMSYSTEM.715]
 */
-UINT mciGetDeviceIDFromElementID(DWORD dwElementID, LPCSTR lpstrType)
+UINT16 mciGetDeviceIDFromElementID(DWORD dwElementID, LPCSTR lpstrType)
 {
     return 0;
 }
@@ -853,7 +955,7 @@ UINT mciGetDeviceIDFromElementID(DWORD dwElementID, LPCSTR lpstrType)
 /**************************************************************************
 * 				mciGetYieldProc		[MMSYSTEM.716]
 */
-YIELDPROC mciGetYieldProc(UINT uDeviceID, DWORD * lpdwYieldData)
+YIELDPROC mciGetYieldProc(UINT16 uDeviceID, DWORD * lpdwYieldData)
 {
     return NULL;
 }
@@ -861,7 +963,7 @@ YIELDPROC mciGetYieldProc(UINT uDeviceID, DWORD * lpdwYieldData)
 /**************************************************************************
 * 				mciGetCreatorTask	[MMSYSTEM.717]
 */
-HTASK16 mciGetCreatorTask(UINT uDeviceID)
+HTASK16 mciGetCreatorTask(UINT16 uDeviceID)
 {
     return 0;
 }
@@ -869,9 +971,9 @@ HTASK16 mciGetCreatorTask(UINT uDeviceID)
 /**************************************************************************
 * 				midiOutGetNumDevs	[MMSYSTEM.201]
 */
-UINT midiOutGetNumDevs(void)
+UINT16 midiOutGetNumDevs(void)
 {
-	UINT	count = 0;
+	UINT16	count = 0;
 	dprintf_mmsys(stddeb, "midiOutGetNumDevs\n");
 	count += modMessage(0, MODM_GETNUMDEVS, 0L, 0L, 0L);
 	dprintf_mmsys(stddeb, "midiOutGetNumDevs return %u \n", count);
@@ -881,7 +983,7 @@ UINT midiOutGetNumDevs(void)
 /**************************************************************************
 * 				midiOutGetDevCaps	[MMSYSTEM.202]
 */
-UINT midiOutGetDevCaps(UINT uDeviceID, MIDIOUTCAPS * lpCaps, UINT uSize)
+UINT16 midiOutGetDevCaps(UINT16 uDeviceID, MIDIOUTCAPS * lpCaps, UINT16 uSize)
 {
 	dprintf_mmsys(stddeb, "midiOutGetDevCaps\n");
 	return 0;
@@ -890,7 +992,7 @@ UINT midiOutGetDevCaps(UINT uDeviceID, MIDIOUTCAPS * lpCaps, UINT uSize)
 /**************************************************************************
 * 				midiOutGetErrorText 	[MMSYSTEM.203]
 */
-UINT midiOutGetErrorText(UINT uError, LPSTR lpText, UINT uSize)
+UINT16 midiOutGetErrorText(UINT16 uError, LPSTR lpText, UINT16 uSize)
 {
 	dprintf_mmsys(stddeb, "midiOutGetErrorText\n");
 	return midiGetErrorText(uError, lpText, uSize);
@@ -900,7 +1002,7 @@ UINT midiOutGetErrorText(UINT uError, LPSTR lpText, UINT uSize)
 /**************************************************************************
 * 				midiGetErrorText       	[internal]
 */
-UINT midiGetErrorText(UINT uError, LPSTR lpText, UINT uSize)
+UINT16 midiGetErrorText(UINT16 uError, LPSTR lpText, UINT16 uSize)
 {
 	LPSTR	msgptr;
 	if ((lpText == NULL) || (uSize < 1)) return(FALSE);
@@ -945,18 +1047,18 @@ msg# 343 : There are no MIDI devices installed on the system. Use the Drivers op
 /**************************************************************************
 * 				midiOutOpen    		[MMSYSTEM.204]
 */
-UINT midiOutOpen(HMIDIOUT16 * lphMidiOut, UINT uDeviceID,
+UINT16 midiOutOpen(HMIDIOUT16 * lphMidiOut, UINT16 uDeviceID,
 		 DWORD dwCallback, DWORD dwInstance, DWORD dwFlags)
 {
 	HMIDI16	hMidiOut;
 	LPMIDIOPENDESC	lpDesc;
 	LPMIDIOPENDESC	lp16Desc;
 	DWORD	dwRet = 0;
-	BOOL	bMapperFlg = FALSE;
+	BOOL32	bMapperFlg = FALSE;
 	if (lphMidiOut != NULL) *lphMidiOut = 0;
 	dprintf_mmsys(stddeb, "midiOutOpen(%p, %d, %08lX, %08lX, %08lX);\n", 
 		lphMidiOut, uDeviceID, dwCallback, dwInstance, dwFlags);
-	if (uDeviceID == (UINT)MIDI_MAPPER) {
+	if (uDeviceID == (UINT16)MIDI_MAPPER) {
 		dprintf_mmsys(stddeb, "midiOutOpen	// MIDI_MAPPER mode requested !\n");
 		bMapperFlg = TRUE;
 		uDeviceID = 0;
@@ -983,7 +1085,7 @@ UINT midiOutOpen(HMIDIOUT16 * lphMidiOut, UINT uDeviceID,
 /**************************************************************************
 * 				midiOutClose		[MMSYSTEM.205]
 */
-UINT midiOutClose(HMIDIOUT16 hMidiOut)
+UINT16 midiOutClose(HMIDIOUT16 hMidiOut)
 {
 	LPMIDIOPENDESC	lpDesc;
 	dprintf_mmsys(stddeb, "midiOutClose(%04X)\n", hMidiOut);
@@ -995,8 +1097,8 @@ UINT midiOutClose(HMIDIOUT16 hMidiOut)
 /**************************************************************************
 * 				midiOutPrepareHeader	[MMSYSTEM.206]
 */
-UINT midiOutPrepareHeader(HMIDIOUT16 hMidiOut,
-    MIDIHDR * lpMidiOutHdr, UINT uSize)
+UINT16 midiOutPrepareHeader(HMIDIOUT16 hMidiOut,
+    MIDIHDR * lpMidiOutHdr, UINT16 uSize)
 {
 	LPMIDIOPENDESC	lpDesc;
 	dprintf_mmsys(stddeb, "midiOutPrepareHeader(%04X, %p, %d)\n", 
@@ -1010,8 +1112,8 @@ UINT midiOutPrepareHeader(HMIDIOUT16 hMidiOut,
 /**************************************************************************
 * 				midiOutUnprepareHeader	[MMSYSTEM.207]
 */
-UINT midiOutUnprepareHeader(HMIDIOUT16 hMidiOut,
-    MIDIHDR * lpMidiOutHdr, UINT uSize)
+UINT16 midiOutUnprepareHeader(HMIDIOUT16 hMidiOut,
+    MIDIHDR * lpMidiOutHdr, UINT16 uSize)
 {
 	LPMIDIOPENDESC	lpDesc;
 	dprintf_mmsys(stddeb, "midiOutUnprepareHeader(%04X, %p, %d)\n", 
@@ -1025,7 +1127,7 @@ UINT midiOutUnprepareHeader(HMIDIOUT16 hMidiOut,
 /**************************************************************************
 * 				midiOutShortMsg		[MMSYSTEM.208]
 */
-UINT midiOutShortMsg(HMIDIOUT16 hMidiOut, DWORD dwMsg)
+UINT16 midiOutShortMsg(HMIDIOUT16 hMidiOut, DWORD dwMsg)
 {
 	LPMIDIOPENDESC	lpDesc;
 	dprintf_mmsys(stddeb, "midiOutShortMsg(%04X, %08lX)\n", hMidiOut, dwMsg);
@@ -1037,8 +1139,8 @@ UINT midiOutShortMsg(HMIDIOUT16 hMidiOut, DWORD dwMsg)
 /**************************************************************************
 * 				midiOutLongMsg		[MMSYSTEM.209]
 */
-UINT midiOutLongMsg(HMIDIOUT16 hMidiOut,
-    MIDIHDR * lpMidiOutHdr, UINT uSize)
+UINT16 midiOutLongMsg(HMIDIOUT16 hMidiOut,
+    MIDIHDR * lpMidiOutHdr, UINT16 uSize)
 {
 	LPMIDIOPENDESC	lpDesc;
 	dprintf_mmsys(stddeb, "midiOutLongMsg(%04X, %p, %d)\n", 
@@ -1052,7 +1154,7 @@ UINT midiOutLongMsg(HMIDIOUT16 hMidiOut,
 /**************************************************************************
 * 				midiOutReset		[MMSYSTEM.210]
 */
-UINT midiOutReset(HMIDIOUT16 hMidiOut)
+UINT16 midiOutReset(HMIDIOUT16 hMidiOut)
 {
 	LPMIDIOPENDESC	lpDesc;
 	dprintf_mmsys(stddeb, "midiOutReset(%04X)\n", hMidiOut);
@@ -1064,7 +1166,7 @@ UINT midiOutReset(HMIDIOUT16 hMidiOut)
 /**************************************************************************
 * 				midiOutGetVolume	[MMSYSTEM.211]
 */
-UINT midiOutGetVolume(UINT uDeviceID, DWORD * lpdwVolume)
+UINT16 midiOutGetVolume(UINT16 uDeviceID, DWORD * lpdwVolume)
 {
 	dprintf_mmsys(stddeb, "midiOutGetVolume(%04X, %p);\n", uDeviceID, lpdwVolume);
 	return modMessage(uDeviceID, MODM_GETVOLUME, 0L, (DWORD)lpdwVolume, 0L);
@@ -1074,7 +1176,7 @@ UINT midiOutGetVolume(UINT uDeviceID, DWORD * lpdwVolume)
 /**************************************************************************
 * 				midiOutSetVolume	[MMSYSTEM.212]
 */
-UINT midiOutSetVolume(UINT uDeviceID, DWORD dwVolume)
+UINT16 midiOutSetVolume(UINT16 uDeviceID, DWORD dwVolume)
 {
 	dprintf_mmsys(stddeb, "midiOutSetVolume(%04X, %08lX);\n", uDeviceID, dwVolume);
 	return modMessage(uDeviceID, MODM_SETVOLUME, 0L, dwVolume, 0L);
@@ -1084,8 +1186,8 @@ UINT midiOutSetVolume(UINT uDeviceID, DWORD dwVolume)
 /**************************************************************************
 * 				midiOutCachePatches		[MMSYSTEM.213]
 */
-UINT midiOutCachePatches(HMIDIOUT16 hMidiOut,
-    UINT uBank, WORD * lpwPatchArray, UINT uFlags)
+UINT16 midiOutCachePatches(HMIDIOUT16 hMidiOut,
+    UINT16 uBank, WORD * lpwPatchArray, UINT16 uFlags)
 {
         /* not really necessary to support this */
 	fprintf(stdnimp, "midiOutCachePatches: not supported yet\n");
@@ -1095,8 +1197,8 @@ UINT midiOutCachePatches(HMIDIOUT16 hMidiOut,
 /**************************************************************************
 * 				midiOutCacheDrumPatches	[MMSYSTEM.214]
 */
-UINT midiOutCacheDrumPatches(HMIDIOUT16 hMidiOut,
-    UINT uPatch, WORD * lpwKeyArray, UINT uFlags)
+UINT16 midiOutCacheDrumPatches(HMIDIOUT16 hMidiOut,
+    UINT16 uPatch, WORD * lpwKeyArray, UINT16 uFlags)
 {
 	fprintf(stdnimp, "midiOutCacheDrumPatchesi: not supported yet\n");
 	return MMSYSERR_NOTSUPPORTED;
@@ -1105,7 +1207,7 @@ UINT midiOutCacheDrumPatches(HMIDIOUT16 hMidiOut,
 /**************************************************************************
 * 				midiOutGetID		[MMSYSTEM.215]
 */
-UINT midiOutGetID(HMIDIOUT16 hMidiOut, UINT * lpuDeviceID)
+UINT16 midiOutGetID(HMIDIOUT16 hMidiOut, UINT16 * lpuDeviceID)
 {
 	dprintf_mmsys(stddeb, "midiOutGetID\n");
 	return 0;
@@ -1114,7 +1216,7 @@ UINT midiOutGetID(HMIDIOUT16 hMidiOut, UINT * lpuDeviceID)
 /**************************************************************************
 * 				midiOutMessage		[MMSYSTEM.216]
 */
-DWORD midiOutMessage(HMIDIOUT16 hMidiOut, UINT uMessage, 
+DWORD midiOutMessage(HMIDIOUT16 hMidiOut, UINT16 uMessage, 
 						DWORD dwParam1, DWORD dwParam2)
 {
 	LPMIDIOPENDESC	lpDesc;
@@ -1129,9 +1231,9 @@ DWORD midiOutMessage(HMIDIOUT16 hMidiOut, UINT uMessage,
 /**************************************************************************
 * 				midiInGetNumDevs	[MMSYSTEM.301]
 */
-UINT midiInGetNumDevs(void)
+UINT16 midiInGetNumDevs(void)
 {
-	UINT	count = 0;
+	UINT16	count = 0;
 	dprintf_mmsys(stddeb, "midiInGetNumDevs\n");
 	count += midMessage(0, MIDM_GETNUMDEVS, 0L, 0L, 0L);
 	dprintf_mmsys(stddeb, "midiInGetNumDevs return %u \n", count);
@@ -1141,8 +1243,8 @@ UINT midiInGetNumDevs(void)
 /**************************************************************************
 * 				midiInGetDevCaps	[MMSYSTEM.302]
 */
-UINT midiInGetDevCaps(UINT uDeviceID,
-    LPMIDIINCAPS lpCaps, UINT uSize)
+UINT16 midiInGetDevCaps(UINT16 uDeviceID,
+    LPMIDIINCAPS lpCaps, UINT16 uSize)
 {
 	dprintf_mmsys(stddeb, "midiInGetDevCaps\n");
 	return 0;
@@ -1151,7 +1253,7 @@ UINT midiInGetDevCaps(UINT uDeviceID,
 /**************************************************************************
 * 				midiInGetErrorText 		[MMSYSTEM.303]
 */
-UINT midiInGetErrorText(UINT uError, LPSTR lpText, UINT uSize)
+UINT16 midiInGetErrorText(UINT16 uError, LPSTR lpText, UINT16 uSize)
 {
 	dprintf_mmsys(stddeb, "midiInGetErrorText\n");
 	return (midiGetErrorText(uError, lpText, uSize));
@@ -1160,18 +1262,18 @@ UINT midiInGetErrorText(UINT uError, LPSTR lpText, UINT uSize)
 /**************************************************************************
 * 				midiInOpen		[MMSYSTEM.304]
 */
-UINT midiInOpen(HMIDIIN16 * lphMidiIn, UINT uDeviceID,
+UINT16 midiInOpen(HMIDIIN16 * lphMidiIn, UINT16 uDeviceID,
     DWORD dwCallback, DWORD dwInstance, DWORD dwFlags)
 {
 	HMIDI16	hMidiIn;
 	LPMIDIOPENDESC	lpDesc;
 	LPMIDIOPENDESC	lp16Desc;
 	DWORD	dwRet = 0;
-	BOOL	bMapperFlg = FALSE;
+	BOOL32	bMapperFlg = FALSE;
 	if (lphMidiIn != NULL) *lphMidiIn = 0;
 	dprintf_mmsys(stddeb, "midiInOpen(%p, %d, %08lX, %08lX, %08lX);\n", 
 		lphMidiIn, uDeviceID, dwCallback, dwInstance, dwFlags);
-	if (uDeviceID == (UINT)MIDI_MAPPER) {
+	if (uDeviceID == (UINT16)MIDI_MAPPER) {
 		dprintf_mmsys(stddeb, "midiInOpen	// MIDI_MAPPER mode requested !\n");
 		bMapperFlg = TRUE;
 		uDeviceID = 0;
@@ -1198,7 +1300,7 @@ UINT midiInOpen(HMIDIIN16 * lphMidiIn, UINT uDeviceID,
 /**************************************************************************
 * 				midiInClose		[MMSYSTEM.305]
 */
-UINT midiInClose(HMIDIIN16 hMidiIn)
+UINT16 midiInClose(HMIDIIN16 hMidiIn)
 {
 	LPMIDIOPENDESC	lpDesc;
 	dprintf_mmsys(stddeb, "midiInClose(%04X)\n", hMidiIn);
@@ -1210,8 +1312,8 @@ UINT midiInClose(HMIDIIN16 hMidiIn)
 /**************************************************************************
 * 				midiInPrepareHeader	[MMSYSTEM.306]
 */
-UINT midiInPrepareHeader(HMIDIIN16 hMidiIn,
-    MIDIHDR * lpMidiInHdr, UINT uSize)
+UINT16 midiInPrepareHeader(HMIDIIN16 hMidiIn,
+    MIDIHDR * lpMidiInHdr, UINT16 uSize)
 {
 	LPMIDIOPENDESC	lpDesc;
 	dprintf_mmsys(stddeb, "midiInPrepareHeader(%04X, %p, %d)\n", 
@@ -1225,8 +1327,8 @@ UINT midiInPrepareHeader(HMIDIIN16 hMidiIn,
 /**************************************************************************
 * 				midiInUnprepareHeader	[MMSYSTEM.307]
 */
-UINT midiInUnprepareHeader(HMIDIIN16 hMidiIn,
-    MIDIHDR * lpMidiInHdr, UINT uSize)
+UINT16 midiInUnprepareHeader(HMIDIIN16 hMidiIn,
+    MIDIHDR * lpMidiInHdr, UINT16 uSize)
 {
 	LPMIDIOPENDESC	lpDesc;
 	dprintf_mmsys(stddeb, "midiInUnprepareHeader(%04X, %p, %d)\n", 
@@ -1240,8 +1342,8 @@ UINT midiInUnprepareHeader(HMIDIIN16 hMidiIn,
 /**************************************************************************
 * 				midiInAddBuffer		[MMSYSTEM.308]
 */
-UINT midiInAddBuffer(HMIDIIN16 hMidiIn,
-    MIDIHDR * lpMidiInHdr, UINT uSize)
+UINT16 midiInAddBuffer(HMIDIIN16 hMidiIn,
+    MIDIHDR * lpMidiInHdr, UINT16 uSize)
 {
 	dprintf_mmsys(stddeb, "midiInAddBuffer\n");
 	return 0;
@@ -1250,7 +1352,7 @@ UINT midiInAddBuffer(HMIDIIN16 hMidiIn,
 /**************************************************************************
 * 				midiInStart			[MMSYSTEM.309]
 */
-UINT midiInStart(HMIDIIN16 hMidiIn)
+UINT16 midiInStart(HMIDIIN16 hMidiIn)
 {
 	dprintf_mmsys(stddeb, "midiInStart\n");
 	return 0;
@@ -1259,7 +1361,7 @@ UINT midiInStart(HMIDIIN16 hMidiIn)
 /**************************************************************************
 * 				midiInStop			[MMSYSTEM.310]
 */
-UINT midiInStop(HMIDIIN16 hMidiIn)
+UINT16 midiInStop(HMIDIIN16 hMidiIn)
 {
 	dprintf_mmsys(stddeb, "midiInStop\n");
 	return 0;
@@ -1268,7 +1370,7 @@ UINT midiInStop(HMIDIIN16 hMidiIn)
 /**************************************************************************
 * 				midiInReset			[MMSYSTEM.311]
 */
-UINT midiInReset(HMIDIIN16 hMidiIn)
+UINT16 midiInReset(HMIDIIN16 hMidiIn)
 {
 	dprintf_mmsys(stddeb, "midiInReset\n");
 	return 0;
@@ -1277,7 +1379,7 @@ UINT midiInReset(HMIDIIN16 hMidiIn)
 /**************************************************************************
 * 				midiInGetID			[MMSYSTEM.312]
 */
-UINT midiInGetID(HMIDIIN16 hMidiIn, UINT * lpuDeviceID)
+UINT16 midiInGetID(HMIDIIN16 hMidiIn, UINT16 * lpuDeviceID)
 {
 	dprintf_mmsys(stddeb, "midiInGetID\n");
 	return 0;
@@ -1286,7 +1388,7 @@ UINT midiInGetID(HMIDIIN16 hMidiIn, UINT * lpuDeviceID)
 /**************************************************************************
 * 				midiInMessage		[MMSYSTEM.313]
 */
-DWORD midiInMessage(HMIDIIN16 hMidiIn, UINT uMessage, 
+DWORD midiInMessage(HMIDIIN16 hMidiIn, UINT16 uMessage, 
 							DWORD dwParam1, DWORD dwParam2)
 {
 	LPMIDIOPENDESC	lpDesc;
@@ -1301,9 +1403,9 @@ DWORD midiInMessage(HMIDIIN16 hMidiIn, UINT uMessage,
 /**************************************************************************
 * 				waveOutGetNumDevs		[MMSYSTEM.401]
 */
-UINT waveOutGetNumDevs()
+UINT16 waveOutGetNumDevs()
 {
-	UINT	count = 0;
+	UINT16	count = 0;
 	dprintf_mmsys(stddeb, "waveOutGetNumDevs\n");
 	count += wodMessage(0, WODM_GETNUMDEVS, 0L, 0L, 0L);
 	dprintf_mmsys(stddeb, "waveOutGetNumDevs return %u \n", count);
@@ -1313,7 +1415,7 @@ UINT waveOutGetNumDevs()
 /**************************************************************************
 * 				waveOutGetDevCaps		[MMSYSTEM.402]
 */
-UINT waveOutGetDevCaps(UINT uDeviceID, WAVEOUTCAPS * lpCaps, UINT uSize)
+UINT16 waveOutGetDevCaps(UINT16 uDeviceID, WAVEOUTCAPS * lpCaps, UINT16 uSize)
 {
 	dprintf_mmsys(stddeb, "waveOutGetDevCaps\n");
 	return wodMessage(uDeviceID, WODM_GETDEVCAPS, 0L, (DWORD)lpCaps, uSize);
@@ -1322,7 +1424,7 @@ UINT waveOutGetDevCaps(UINT uDeviceID, WAVEOUTCAPS * lpCaps, UINT uSize)
 /**************************************************************************
 * 				waveOutGetErrorText 	[MMSYSTEM.403]
 */
-UINT waveOutGetErrorText(UINT uError, LPSTR lpText, UINT uSize)
+UINT16 waveOutGetErrorText(UINT16 uError, LPSTR lpText, UINT16 uSize)
 {
    dprintf_mmsys(stddeb, "waveOutGetErrorText\n");
    return(waveGetErrorText(uError, lpText, uSize));
@@ -1332,7 +1434,7 @@ UINT waveOutGetErrorText(UINT uError, LPSTR lpText, UINT uSize)
 /**************************************************************************
 * 				waveGetErrorText 		[internal]
 */
-UINT waveGetErrorText(UINT uError, LPSTR lpText, UINT uSize)
+UINT16 waveGetErrorText(UINT16 uError, LPSTR lpText, UINT16 uSize)
 {
 	LPSTR	msgptr;
 	dprintf_mmsys(stddeb, "waveGetErrorText(%04X, %p, %d);\n", uError, lpText, uSize);
@@ -1398,20 +1500,20 @@ UINT waveGetErrorText(UINT uError, LPSTR lpText, UINT uSize)
 /**************************************************************************
 * 				waveOutOpen			[MMSYSTEM.404]
 */
-UINT waveOutOpen(HWAVEOUT16 * lphWaveOut, UINT uDeviceID,
+UINT16 waveOutOpen(HWAVEOUT16 * lphWaveOut, UINT16 uDeviceID,
     const LPWAVEFORMAT lpFormat, DWORD dwCallback, DWORD dwInstance, DWORD dwFlags)
 {
 	HWAVEOUT16 hWaveOut;
 	LPWAVEOPENDESC	lpDesc;
 	LPWAVEOPENDESC	lp16Desc;
 	DWORD	dwRet = 0;
-	BOOL	bMapperFlg = FALSE;
+	BOOL32	bMapperFlg = FALSE;
 	dprintf_mmsys(stddeb, "waveOutOpen(%p, %d, %p, %08lX, %08lX, %08lX);\n", 
 		lphWaveOut, uDeviceID, lpFormat, dwCallback, dwInstance, dwFlags);
 	if (dwFlags & WAVE_FORMAT_QUERY) {
 		dprintf_mmsys(stddeb, "waveOutOpen	// WAVE_FORMAT_QUERY requested !\n");
 		}
-	if (uDeviceID == (UINT)WAVE_MAPPER) {
+	if (uDeviceID == (UINT16)WAVE_MAPPER) {
 		dprintf_mmsys(stddeb, "waveOutOpen	// WAVE_MAPPER mode requested !\n");
 		bMapperFlg = TRUE;
 		uDeviceID = 0;
@@ -1444,7 +1546,7 @@ UINT waveOutOpen(HWAVEOUT16 * lphWaveOut, UINT uDeviceID,
 /**************************************************************************
 * 				waveOutClose		[MMSYSTEM.405]
 */
-UINT waveOutClose(HWAVEOUT16 hWaveOut)
+UINT16 waveOutClose(HWAVEOUT16 hWaveOut)
 {
 	LPWAVEOPENDESC	lpDesc;
 	dprintf_mmsys(stddeb, "waveOutClose(%04X)\n", hWaveOut);
@@ -1456,8 +1558,8 @@ UINT waveOutClose(HWAVEOUT16 hWaveOut)
 /**************************************************************************
 * 				waveOutPrepareHeader	[MMSYSTEM.406]
 */
-UINT waveOutPrepareHeader(HWAVEOUT16 hWaveOut,
-     WAVEHDR * lpWaveOutHdr, UINT uSize)
+UINT16 waveOutPrepareHeader(HWAVEOUT16 hWaveOut,
+     WAVEHDR * lpWaveOutHdr, UINT16 uSize)
 {
 	LPWAVEOPENDESC	lpDesc;
 	dprintf_mmsys(stddeb, "waveOutPrepareHeader(%04X, %p, %u);\n", 
@@ -1471,8 +1573,8 @@ UINT waveOutPrepareHeader(HWAVEOUT16 hWaveOut,
 /**************************************************************************
 * 				waveOutUnprepareHeader	[MMSYSTEM.407]
 */
-UINT waveOutUnprepareHeader(HWAVEOUT16 hWaveOut,
-    WAVEHDR * lpWaveOutHdr, UINT uSize)
+UINT16 waveOutUnprepareHeader(HWAVEOUT16 hWaveOut,
+    WAVEHDR * lpWaveOutHdr, UINT16 uSize)
 {
 	LPWAVEOPENDESC	lpDesc;
 	dprintf_mmsys(stddeb, "waveOutUnprepareHeader(%04X, %p, %u);\n", 
@@ -1486,7 +1588,7 @@ UINT waveOutUnprepareHeader(HWAVEOUT16 hWaveOut,
 /**************************************************************************
 * 				waveOutWrite		[MMSYSTEM.408]
 */
-UINT waveOutWrite(HWAVEOUT16 hWaveOut, WAVEHDR * lpWaveOutHdr,  UINT uSize)
+UINT16 waveOutWrite(HWAVEOUT16 hWaveOut, WAVEHDR * lpWaveOutHdr,  UINT16 uSize)
 {
 	LPWAVEOPENDESC	lpDesc;
 	dprintf_mmsys(stddeb, "waveOutWrite(%04X, %p, %u);\n", hWaveOut, lpWaveOutHdr, uSize);
@@ -1499,7 +1601,7 @@ UINT waveOutWrite(HWAVEOUT16 hWaveOut, WAVEHDR * lpWaveOutHdr,  UINT uSize)
 /**************************************************************************
 * 				waveOutPause		[MMSYSTEM.409]
 */
-UINT waveOutPause(HWAVEOUT16 hWaveOut)
+UINT16 waveOutPause(HWAVEOUT16 hWaveOut)
 {
 	LPWAVEOPENDESC	lpDesc;
 	dprintf_mmsys(stddeb, "waveOutPause(%04X)\n", hWaveOut);
@@ -1511,7 +1613,7 @@ UINT waveOutPause(HWAVEOUT16 hWaveOut)
 /**************************************************************************
 * 				waveOutRestart		[MMSYSTEM.410]
 */
-UINT waveOutRestart(HWAVEOUT16 hWaveOut)
+UINT16 waveOutRestart(HWAVEOUT16 hWaveOut)
 {
 	LPWAVEOPENDESC	lpDesc;
 	dprintf_mmsys(stddeb, "waveOutRestart(%04X)\n", hWaveOut);
@@ -1523,7 +1625,7 @@ UINT waveOutRestart(HWAVEOUT16 hWaveOut)
 /**************************************************************************
 * 				waveOutReset		[MMSYSTEM.411]
 */
-UINT waveOutReset(HWAVEOUT16 hWaveOut)
+UINT16 waveOutReset(HWAVEOUT16 hWaveOut)
 {
 	LPWAVEOPENDESC	lpDesc;
 	dprintf_mmsys(stddeb, "waveOutReset(%04X)\n", hWaveOut);
@@ -1535,7 +1637,7 @@ UINT waveOutReset(HWAVEOUT16 hWaveOut)
 /**************************************************************************
 * 				waveOutGetPosition	[MMSYSTEM.412]
 */
-UINT waveOutGetPosition(HWAVEOUT16 hWaveOut, MMTIME * lpTime, UINT uSize)
+UINT16 waveOutGetPosition(HWAVEOUT16 hWaveOut, MMTIME * lpTime, UINT16 uSize)
 {
 	LPWAVEOPENDESC	lpDesc;
 	dprintf_mmsys(stddeb, "waveOutGetPosition(%04X, %p, %u);\n", hWaveOut, lpTime, uSize);
@@ -1548,7 +1650,7 @@ UINT waveOutGetPosition(HWAVEOUT16 hWaveOut, MMTIME * lpTime, UINT uSize)
 /**************************************************************************
 * 				waveOutGetPitch		[MMSYSTEM.413]
 */
-UINT waveOutGetPitch(HWAVEOUT16 hWaveOut, DWORD * lpdwPitch)
+UINT16 waveOutGetPitch(HWAVEOUT16 hWaveOut, DWORD * lpdwPitch)
 {
 	LPWAVEOPENDESC	lpDesc;
 	dprintf_mmsys(stddeb, "waveOutGetPitch(%04X, %p);\n", hWaveOut, lpdwPitch);
@@ -1561,7 +1663,7 @@ UINT waveOutGetPitch(HWAVEOUT16 hWaveOut, DWORD * lpdwPitch)
 /**************************************************************************
 * 				waveOutSetPitch		[MMSYSTEM.414]
 */
-UINT waveOutSetPitch(HWAVEOUT16 hWaveOut, DWORD dwPitch)
+UINT16 waveOutSetPitch(HWAVEOUT16 hWaveOut, DWORD dwPitch)
 {
 	LPWAVEOPENDESC	lpDesc;
 	dprintf_mmsys(stddeb, "waveOutSetPitch(%04X, %08lX);\n", hWaveOut, dwPitch);
@@ -1573,7 +1675,7 @@ UINT waveOutSetPitch(HWAVEOUT16 hWaveOut, DWORD dwPitch)
 /**************************************************************************
 * 				waveOutGetVolume	[MMSYSTEM.415]
 */
-UINT waveOutGetVolume(UINT uDeviceID, DWORD * lpdwVolume)
+UINT16 waveOutGetVolume(UINT16 uDeviceID, DWORD * lpdwVolume)
 {
 	dprintf_mmsys(stddeb, "waveOutGetVolume(%04X, %p);\n", uDeviceID, lpdwVolume);
 	return wodMessage(uDeviceID, WODM_GETVOLUME, 0L, (DWORD)lpdwVolume, 0L);
@@ -1582,7 +1684,7 @@ UINT waveOutGetVolume(UINT uDeviceID, DWORD * lpdwVolume)
 /**************************************************************************
 * 				waveOutSetVolume	[MMSYSTEM.416]
 */
-UINT waveOutSetVolume(UINT uDeviceID, DWORD dwVolume)
+UINT16 waveOutSetVolume(UINT16 uDeviceID, DWORD dwVolume)
 {
 	dprintf_mmsys(stddeb, "waveOutSetVolume(%04X, %08lX);\n", uDeviceID, dwVolume);
 	return wodMessage(uDeviceID, WODM_SETVOLUME, 0L, dwVolume, 0L);
@@ -1591,7 +1693,7 @@ UINT waveOutSetVolume(UINT uDeviceID, DWORD dwVolume)
 /**************************************************************************
 * 				waveOutGetPlaybackRate	[MMSYSTEM.417]
 */
-UINT waveOutGetPlaybackRate(HWAVEOUT16 hWaveOut, DWORD * lpdwRate)
+UINT16 waveOutGetPlaybackRate(HWAVEOUT16 hWaveOut, DWORD * lpdwRate)
 {
 	LPWAVEOPENDESC	lpDesc;
 	dprintf_mmsys(stddeb, "waveOutGetPlaybackRate(%04X, %p);\n", hWaveOut, lpdwRate);
@@ -1604,7 +1706,7 @@ UINT waveOutGetPlaybackRate(HWAVEOUT16 hWaveOut, DWORD * lpdwRate)
 /**************************************************************************
 * 				waveOutSetPlaybackRate	[MMSYSTEM.418]
 */
-UINT waveOutSetPlaybackRate(HWAVEOUT16 hWaveOut, DWORD dwRate)
+UINT16 waveOutSetPlaybackRate(HWAVEOUT16 hWaveOut, DWORD dwRate)
 {
 	LPWAVEOPENDESC	lpDesc;
 	dprintf_mmsys(stddeb, "waveOutSetPlaybackRate(%04X, %08lX);\n", hWaveOut, dwRate);
@@ -1617,7 +1719,7 @@ UINT waveOutSetPlaybackRate(HWAVEOUT16 hWaveOut, DWORD dwRate)
 /**************************************************************************
 * 				waveOutBreakLoop 	[MMSYSTEM.419]
 */
-UINT waveOutBreakLoop(HWAVEOUT16 hWaveOut)
+UINT16 waveOutBreakLoop(HWAVEOUT16 hWaveOut)
 {
 	dprintf_mmsys(stddeb, "waveOutBreakLoop(%04X)\n", hWaveOut);
 	return MMSYSERR_INVALHANDLE;
@@ -1626,7 +1728,7 @@ UINT waveOutBreakLoop(HWAVEOUT16 hWaveOut)
 /**************************************************************************
 * 				waveOutGetID	 	[MMSYSTEM.420]
 */
-UINT waveOutGetID(HWAVEOUT16 hWaveOut, UINT * lpuDeviceID)
+UINT16 waveOutGetID(HWAVEOUT16 hWaveOut, UINT16 * lpuDeviceID)
 {
 	LPWAVEOPENDESC	lpDesc;
 	dprintf_mmsys(stddeb, "waveOutGetID(%04X, %p);\n", hWaveOut, lpuDeviceID);
@@ -1642,7 +1744,7 @@ UINT waveOutGetID(HWAVEOUT16 hWaveOut, UINT * lpuDeviceID)
 /**************************************************************************
 * 				waveOutMessage 		[MMSYSTEM.421]
 */
-DWORD waveOutMessage(HWAVEOUT16 hWaveOut, UINT uMessage, 
+DWORD waveOutMessage(HWAVEOUT16 hWaveOut, UINT16 uMessage, 
 							DWORD dwParam1, DWORD dwParam2)
 {
 	LPWAVEOPENDESC	lpDesc;
@@ -1656,9 +1758,9 @@ DWORD waveOutMessage(HWAVEOUT16 hWaveOut, UINT uMessage,
 /**************************************************************************
 * 				waveInGetNumDevs 		[MMSYSTEM.501]
 */
-UINT waveInGetNumDevs()
+UINT16 waveInGetNumDevs()
 {
-	UINT	count = 0;
+	UINT16	count = 0;
 	dprintf_mmsys(stddeb, "waveInGetNumDevs\n");
 	count += widMessage(0, WIDM_GETNUMDEVS, 0L, 0L, 0L);
 	dprintf_mmsys(stddeb, "waveInGetNumDevs return %u \n", count);
@@ -1669,7 +1771,7 @@ UINT waveInGetNumDevs()
 /**************************************************************************
 * 				waveInGetDevCaps 		[MMSYSTEM.502]
 */
-UINT waveInGetDevCaps(UINT uDeviceID, WAVEINCAPS * lpCaps, UINT uSize)
+UINT16 waveInGetDevCaps(UINT16 uDeviceID, WAVEINCAPS * lpCaps, UINT16 uSize)
 {
 	dprintf_mmsys(stddeb, "waveInGetDevCaps\n");
 	return widMessage(uDeviceID, WIDM_GETDEVCAPS, 0L, (DWORD)lpCaps, uSize);
@@ -1679,7 +1781,7 @@ UINT waveInGetDevCaps(UINT uDeviceID, WAVEINCAPS * lpCaps, UINT uSize)
 /**************************************************************************
 * 				waveInGetErrorText 	[MMSYSTEM.503]
 */
-UINT waveInGetErrorText(UINT uError, LPSTR lpText, UINT uSize)
+UINT16 waveInGetErrorText(UINT16 uError, LPSTR lpText, UINT16 uSize)
 {
    dprintf_mmsys(stddeb, "waveInGetErrorText\n");
    return(waveGetErrorText(uError, lpText, uSize));
@@ -1689,20 +1791,20 @@ UINT waveInGetErrorText(UINT uError, LPSTR lpText, UINT uSize)
 /**************************************************************************
 * 				waveInOpen			[MMSYSTEM.504]
 */
-UINT waveInOpen(HWAVEIN16 * lphWaveIn, UINT uDeviceID,
+UINT16 waveInOpen(HWAVEIN16 * lphWaveIn, UINT16 uDeviceID,
     const LPWAVEFORMAT lpFormat, DWORD dwCallback, DWORD dwInstance, DWORD dwFlags)
 {
 	HWAVEIN16 hWaveIn;
 	LPWAVEOPENDESC	lpDesc;
 	LPWAVEOPENDESC	lp16Desc;
 	DWORD	dwRet = 0;
-	BOOL	bMapperFlg = FALSE;
+	BOOL32	bMapperFlg = FALSE;
 	dprintf_mmsys(stddeb, "waveInOpen(%p, %d, %p, %08lX, %08lX, %08lX);\n", 
 		lphWaveIn, uDeviceID, lpFormat, dwCallback, dwInstance, dwFlags);
 	if (dwFlags & WAVE_FORMAT_QUERY) {
 		dprintf_mmsys(stddeb, "waveInOpen // WAVE_FORMAT_QUERY requested !\n");
 		}
-	if (uDeviceID == (UINT)WAVE_MAPPER) {
+	if (uDeviceID == (UINT16)WAVE_MAPPER) {
 		dprintf_mmsys(stddeb, "waveInOpen	// WAVE_MAPPER mode requested !\n");
 		bMapperFlg = TRUE;
 		uDeviceID = 0;
@@ -1736,7 +1838,7 @@ UINT waveInOpen(HWAVEIN16 * lphWaveIn, UINT uDeviceID,
 /**************************************************************************
 * 				waveInClose			[MMSYSTEM.505]
 */
-UINT waveInClose(HWAVEIN16 hWaveIn)
+UINT16 waveInClose(HWAVEIN16 hWaveIn)
 {
 	LPWAVEOPENDESC	lpDesc;
 	dprintf_mmsys(stddeb, "waveInClose(%04X)\n", hWaveIn);
@@ -1749,8 +1851,8 @@ UINT waveInClose(HWAVEIN16 hWaveIn)
 /**************************************************************************
 * 				waveInPrepareHeader		[MMSYSTEM.506]
 */
-UINT waveInPrepareHeader(HWAVEIN16 hWaveIn,
-    WAVEHDR * lpWaveInHdr, UINT uSize)
+UINT16 waveInPrepareHeader(HWAVEIN16 hWaveIn,
+    WAVEHDR * lpWaveInHdr, UINT16 uSize)
 {
 	LPWAVEOPENDESC	lpDesc;
 	LPWAVEHDR 		lp32WaveInHdr;
@@ -1772,8 +1874,8 @@ UINT waveInPrepareHeader(HWAVEIN16 hWaveIn,
 /**************************************************************************
 * 				waveInUnprepareHeader	[MMSYSTEM.507]
 */
-UINT waveInUnprepareHeader(HWAVEIN16 hWaveIn,
-    WAVEHDR * lpWaveInHdr, UINT uSize)
+UINT16 waveInUnprepareHeader(HWAVEIN16 hWaveIn,
+    WAVEHDR * lpWaveInHdr, UINT16 uSize)
 {
 	LPWAVEOPENDESC	lpDesc;
 	LPWAVEHDR 		lp32WaveInHdr;
@@ -1794,8 +1896,8 @@ UINT waveInUnprepareHeader(HWAVEIN16 hWaveIn,
 /**************************************************************************
 * 				waveInAddBuffer		[MMSYSTEM.508]
 */
-UINT waveInAddBuffer(HWAVEIN16 hWaveIn,
-    WAVEHDR * lpWaveInHdr, UINT uSize)
+UINT16 waveInAddBuffer(HWAVEIN16 hWaveIn,
+    WAVEHDR * lpWaveInHdr, UINT16 uSize)
 {
 	LPWAVEOPENDESC	lpDesc;
 	LPWAVEHDR 		lp32WaveInHdr;
@@ -1816,7 +1918,7 @@ UINT waveInAddBuffer(HWAVEIN16 hWaveIn,
 /**************************************************************************
 * 				waveInStart			[MMSYSTEM.509]
 */
-UINT waveInStart(HWAVEIN16 hWaveIn)
+UINT16 waveInStart(HWAVEIN16 hWaveIn)
 {
 	LPWAVEOPENDESC	lpDesc;
 	dprintf_mmsys(stddeb, "waveInStart(%04X)\n", hWaveIn);
@@ -1829,7 +1931,7 @@ UINT waveInStart(HWAVEIN16 hWaveIn)
 /**************************************************************************
 * 				waveInStop			[MMSYSTEM.510]
 */
-UINT waveInStop(HWAVEIN16 hWaveIn)
+UINT16 waveInStop(HWAVEIN16 hWaveIn)
 {
 	LPWAVEOPENDESC	lpDesc;
 	dprintf_mmsys(stddeb, "waveInStop(%04X)\n", hWaveIn);
@@ -1842,7 +1944,7 @@ UINT waveInStop(HWAVEIN16 hWaveIn)
 /**************************************************************************
 * 				waveInReset			[MMSYSTEM.511]
 */
-UINT waveInReset(HWAVEIN16 hWaveIn)
+UINT16 waveInReset(HWAVEIN16 hWaveIn)
 {
 	LPWAVEOPENDESC	lpDesc;
 	dprintf_mmsys(stddeb, "waveInReset(%04X)\n", hWaveIn);
@@ -1855,7 +1957,7 @@ UINT waveInReset(HWAVEIN16 hWaveIn)
 /**************************************************************************
 * 				waveInGetPosition	[MMSYSTEM.512]
 */
-UINT waveInGetPosition(HWAVEIN16 hWaveIn, MMTIME * lpTime, UINT uSize)
+UINT16 waveInGetPosition(HWAVEIN16 hWaveIn, MMTIME * lpTime, UINT16 uSize)
 {
 	LPWAVEOPENDESC	lpDesc;
 	dprintf_mmsys(stddeb, "waveInGetPosition(%04X, %p, %u);\n", hWaveIn, lpTime, uSize);
@@ -1869,7 +1971,7 @@ UINT waveInGetPosition(HWAVEIN16 hWaveIn, MMTIME * lpTime, UINT uSize)
 /**************************************************************************
 * 				waveInGetID			[MMSYSTEM.513]
 */
-UINT waveInGetID(HWAVEIN16 hWaveIn, UINT * lpuDeviceID)
+UINT16 waveInGetID(HWAVEIN16 hWaveIn, UINT16 * lpuDeviceID)
 {
 	dprintf_mmsys(stddeb, "waveInGetID\n");
 	if (lpuDeviceID == NULL) return MMSYSERR_INVALPARAM;
@@ -1880,7 +1982,7 @@ UINT waveInGetID(HWAVEIN16 hWaveIn, UINT * lpuDeviceID)
 /**************************************************************************
 * 				waveInMessage 		[MMSYSTEM.514]
 */
-DWORD waveInMessage(HWAVEIN16 hWaveIn, UINT uMessage,
+DWORD waveInMessage(HWAVEIN16 hWaveIn, UINT16 uMessage,
 		    DWORD dwParam1, DWORD dwParam2)
 {
 	LPWAVEOPENDESC	lpDesc;
@@ -1919,7 +2021,7 @@ HMMIO16 mmioOpen(LPSTR szFileName, MMIOINFO * lpmmioinfo, DWORD dwOpenFlags)
 /**************************************************************************
 * 				mmioClose      		[MMSYSTEM.1211]
 */
-UINT mmioClose(HMMIO16 hmmio, UINT uFlags)
+UINT16 mmioClose(HMMIO16 hmmio, UINT16 uFlags)
 {
 	LPMMIOINFO	lpmminfo;
 	dprintf_mmsys(stddeb, "mmioClose(%04X, %04X);\n", hmmio, uFlags);
@@ -1987,7 +2089,7 @@ LONG mmioSeek(HMMIO16 hmmio, LONG lOffset, int iOrigin)
 /**************************************************************************
 * 				mmioGetInfo	       	[MMSYSTEM.1215]
 */
-UINT mmioGetInfo(HMMIO16 hmmio, MMIOINFO * lpmmioinfo, UINT uFlags)
+UINT16 mmioGetInfo(HMMIO16 hmmio, MMIOINFO * lpmmioinfo, UINT16 uFlags)
 {
 	LPMMIOINFO	lpmminfo;
 	dprintf_mmsys(stddeb, "mmioGetInfo\n");
@@ -2001,7 +2103,7 @@ UINT mmioGetInfo(HMMIO16 hmmio, MMIOINFO * lpmmioinfo, UINT uFlags)
 /**************************************************************************
 * 				mmioSetInfo    		[MMSYSTEM.1216]
 */
-UINT mmioSetInfo(HMMIO16 hmmio, const MMIOINFO * lpmmioinfo, UINT uFlags)
+UINT16 mmioSetInfo(HMMIO16 hmmio, const MMIOINFO * lpmmioinfo, UINT16 uFlags)
 {
 	LPMMIOINFO	lpmminfo;
 	dprintf_mmsys(stddeb, "mmioSetInfo\n");
@@ -2014,8 +2116,8 @@ UINT mmioSetInfo(HMMIO16 hmmio, const MMIOINFO * lpmmioinfo, UINT uFlags)
 /**************************************************************************
 * 				mmioSetBuffer		[MMSYSTEM.1217]
 */
-UINT mmioSetBuffer(HMMIO16 hmmio, LPSTR pchBuffer, 
-						LONG cchBuffer, UINT uFlags)
+UINT16 mmioSetBuffer(HMMIO16 hmmio, LPSTR pchBuffer, 
+						LONG cchBuffer, UINT16 uFlags)
 {
 	dprintf_mmsys(stddeb, "mmioSetBuffer // empty stub \n");
 	return 0;
@@ -2024,7 +2126,7 @@ UINT mmioSetBuffer(HMMIO16 hmmio, LPSTR pchBuffer,
 /**************************************************************************
 * 				mmioFlush      		[MMSYSTEM.1218]
 */
-UINT mmioFlush(HMMIO16 hmmio, UINT uFlags)
+UINT16 mmioFlush(HMMIO16 hmmio, UINT16 uFlags)
 {
 	LPMMIOINFO	lpmminfo;
 	dprintf_mmsys(stddeb, "mmioFlush(%04X, %04X)\n", hmmio, uFlags);
@@ -2037,7 +2139,7 @@ UINT mmioFlush(HMMIO16 hmmio, UINT uFlags)
 /**************************************************************************
 * 				mmioAdvance    		[MMSYSTEM.1219]
 */
-UINT mmioAdvance(HMMIO16 hmmio, MMIOINFO * lpmmioinfo, UINT uFlags)
+UINT16 mmioAdvance(HMMIO16 hmmio, MMIOINFO * lpmmioinfo, UINT16 uFlags)
 {
 	int		count = 0;
 	LPMMIOINFO	lpmminfo;
@@ -2061,7 +2163,7 @@ UINT mmioAdvance(HMMIO16 hmmio, MMIOINFO * lpmmioinfo, UINT uFlags)
 /**************************************************************************
 * 				mmioStringToFOURCC	[MMSYSTEM.1220]
 */
-FOURCC mmioStringToFOURCC(LPCSTR sz, UINT uFlags)
+FOURCC mmioStringToFOURCC(LPCSTR sz, UINT16 uFlags)
 {
 	dprintf_mmsys(stddeb, "mmioStringToFOURCC // empty stub \n");
 	return 0;
@@ -2080,7 +2182,7 @@ LPMMIOPROC mmioInstallIOProc(FOURCC fccIOProc,
 /**************************************************************************
 * 				mmioSendMessage		[MMSYSTEM.1222]
 */
-LRESULT mmioSendMessage(HMMIO16 hmmio, UINT uMessage,
+LRESULT mmioSendMessage(HMMIO16 hmmio, UINT16 uMessage,
 					    LPARAM lParam1, LPARAM lParam2)
 {
 	dprintf_mmsys(stddeb, "mmioSendMessage // empty stub \n");
@@ -2090,8 +2192,8 @@ LRESULT mmioSendMessage(HMMIO16 hmmio, UINT uMessage,
 /**************************************************************************
 * 				mmioDescend	       	[MMSYSTEM.1223]
 */
-UINT mmioDescend(HMMIO16 hmmio, MMCKINFO * lpck,
-		    const MMCKINFO * lpckParent, UINT uFlags)
+UINT16 mmioDescend(HMMIO16 hmmio, MMCKINFO * lpck,
+		    const MMCKINFO * lpckParent, UINT16 uFlags)
 {
 	DWORD	dwfcc, dwOldPos;
 	LPMMIOINFO	lpmminfo;
@@ -2151,7 +2253,7 @@ UINT mmioDescend(HMMIO16 hmmio, MMCKINFO * lpck,
 /**************************************************************************
 * 				mmioAscend     		[MMSYSTEM.1224]
 */
-UINT mmioAscend(HMMIO16 hmmio, MMCKINFO * lpck, UINT uFlags)
+UINT16 mmioAscend(HMMIO16 hmmio, MMCKINFO * lpck, UINT16 uFlags)
 {
 	dprintf_mmsys(stddeb, "mmioAscend // empty stub !\n");
 	return 0;
@@ -2160,7 +2262,7 @@ UINT mmioAscend(HMMIO16 hmmio, MMCKINFO * lpck, UINT uFlags)
 /**************************************************************************
 * 				mmioCreateChunk		[MMSYSTEM.1225]
 */
-UINT mmioCreateChunk(HMMIO16 hmmio, MMCKINFO * lpck, UINT uFlags)
+UINT16 mmioCreateChunk(HMMIO16 hmmio, MMCKINFO * lpck, UINT16 uFlags)
 {
 	dprintf_mmsys(stddeb, "mmioCreateChunk // empty stub \n");
 	return 0;
@@ -2170,7 +2272,7 @@ UINT mmioCreateChunk(HMMIO16 hmmio, MMCKINFO * lpck, UINT uFlags)
 /**************************************************************************
 * 				mmioRename     		[MMSYSTEM.1226]
 */
-UINT mmioRename(LPCSTR szFileName, LPCSTR szNewFileName,
+UINT16 mmioRename(LPCSTR szFileName, LPCSTR szNewFileName,
      MMIOINFO * lpmmioinfo, DWORD dwRenameFlags)
 {
 	dprintf_mmsys(stddeb, "mmioRename('%s', '%s', %p, %08lX); // empty stub \n",
@@ -2204,12 +2306,10 @@ LRESULT DrvClose(HDRVR16 hDrvr, LPARAM lParam1, LPARAM lParam2)
 */
 LRESULT DrvSendMessage(HDRVR16 hDriver, WORD msg, LPARAM lParam1, LPARAM lParam2)
 {
-	DWORD 	dwDevID = 0;
+	DWORD 	dwDriverID = 0;
 	dprintf_mmsys(stddeb, "DrvSendMessage(%04X, %04X, %08lX, %08lX);\n",
 					hDriver, msg, lParam1, lParam2);
-#ifndef WINELIB
-	return CDAUDIO_DriverProc(dwDevID, hDriver, msg, lParam1, lParam2);
-#endif
+	return CDAUDIO_DriverProc(dwDriverID, hDriver, msg, lParam1, lParam2);
 }
 
 /**************************************************************************
@@ -2225,12 +2325,8 @@ HANDLE16 DrvGetModuleHandle(HDRVR16 hDrvr)
 /**************************************************************************
 * 				DrvDefDriverProc	[MMSYSTEM.1104]
 */
-LRESULT DrvDefDriverProc(DWORD dwDevID, HDRVR16 hDriv, WORD wMsg, 
+LRESULT DrvDefDriverProc(DWORD dwDriverID, HDRVR16 hDriv, WORD wMsg, 
 						DWORD dwParam1, DWORD dwParam2)
 {
-	return DefDriverProc(dwDevID, hDriv, wMsg, dwParam1, dwParam2);
+	return DefDriverProc(dwDriverID, hDriv, wMsg, dwParam1, dwParam2);
 }
-
-
-#endif /* #ifdef WINELIB */
-
diff --git a/multimedia/time.c b/multimedia/time.c
index a6b47957035..56e4e4583e2 100644
--- a/multimedia/time.c
+++ b/multimedia/time.c
@@ -4,8 +4,6 @@
  * Copyright 1993 Martin Ayotte
  */
 
-#ifndef WINELIB
-
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
@@ -20,7 +18,7 @@
 #include "stddebug.h"
 #include "debug.h"
 
-static BOOL mmTimeStarted = FALSE;
+static BOOL32 mmTimeStarted = FALSE;
 static MMTIME mmSysTimeMS;
 static MMTIME mmSysTimeSMPTE;
 
@@ -221,5 +219,3 @@ DWORD timeGetTime()
 	StartMMTime();
     return 0;
 }
-
-#endif /* WINELIB */
diff --git a/objects/bitmap.c b/objects/bitmap.c
index 1d81b167147..77147f760b7 100644
--- a/objects/bitmap.c
+++ b/objects/bitmap.c
@@ -52,13 +52,23 @@ static XImage *BITMAP_BmpToImage( BITMAP16 * bmp, LPVOID bmpData )
 
 
 /***********************************************************************
- *           CreateBitmap    (GDI.48) (GDI32.25)
+ *           CreateBitmap16    (GDI.48)
  */
-HBITMAP16 CreateBitmap( INT32 width, INT32 height, UINT32 planes,
-                        UINT32 bpp, LPCVOID bits )
+HBITMAP16 CreateBitmap16( INT16 width, INT16 height, UINT16 planes,
+                          UINT16 bpp, LPCVOID bits )
+{
+    return CreateBitmap32( width, height, planes, bpp, bits );
+}
+
+
+/***********************************************************************
+ *           CreateBitmap32    (GDI32.25)
+ */
+HBITMAP32 CreateBitmap32( INT32 width, INT32 height, UINT32 planes,
+                          UINT32 bpp, LPCVOID bits )
 {
     BITMAPOBJ * bmpObjPtr;
-    HBITMAP16 hbitmap;
+    HBITMAP32 hbitmap;
 
     planes = (BYTE)planes;
     bpp    = (BYTE)bpp;
@@ -95,28 +105,33 @@ HBITMAP16 CreateBitmap( INT32 width, INT32 height, UINT32 planes,
 	hbitmap = 0;
     }
     else if (bits)  /* Set bitmap bits */
-	SetBitmapBits( hbitmap, height * bmpObjPtr->bitmap.bmWidthBytes, bits);
+	SetBitmapBits32( hbitmap, height * bmpObjPtr->bitmap.bmWidthBytes,
+                         bits );
     return hbitmap;
 }
 
 
 /***********************************************************************
- *           CreateCompatibleBitmap    (GDI.51) (GDI32.30)
+ *           CreateCompatibleBitmap16    (GDI.51)
+ */
+HBITMAP16 CreateCompatibleBitmap16( HDC16 hdc, INT16 width, INT16 height )
+{
+    return CreateCompatibleBitmap32( hdc, width, height );
+}
+
+
+/***********************************************************************
+ *           CreateCompatibleBitmap32    (GDI32.30)
  */
-HBITMAP16 CreateCompatibleBitmap( HDC32 hdc, INT32 width, INT32 height )
+HBITMAP32 CreateCompatibleBitmap32( HDC32 hdc, INT32 width, INT32 height )
 {
-    HBITMAP16 hbmpRet = 0;
+    HBITMAP32 hbmpRet = 0;
     DC *dc;
 
     dprintf_gdi( stddeb, "CreateCompatibleBitmap(%04x,%d,%d) = \n", 
                  hdc, width, height );
-    dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC );
-    if (!dc) 
-    {
-	dc = (DC *)GDI_GetObjPtr(hdc, METAFILE_DC_MAGIC);
-	if (!dc) return 0;
-    }
-    hbmpRet = CreateBitmap( width, height, 1, dc->w.bitsPerPixel, NULL );
+    if (!(dc = DC_GetDCPtr( hdc ))) return 0;
+    hbmpRet = CreateBitmap32( width, height, 1, dc->w.bitsPerPixel, NULL );
     dprintf_gdi(stddeb,"\t\t%04x\n", hbmpRet);
     return hbmpRet;
 }
@@ -127,8 +142,8 @@ HBITMAP16 CreateCompatibleBitmap( HDC32 hdc, INT32 width, INT32 height )
  */
 HBITMAP16 CreateBitmapIndirect16( const BITMAP16 * bmp )
 {
-    return CreateBitmap( bmp->bmWidth, bmp->bmHeight, bmp->bmPlanes,
-                         bmp->bmBitsPixel, PTR_SEG_TO_LIN( bmp->bmBits ) );
+    return CreateBitmap16( bmp->bmWidth, bmp->bmHeight, bmp->bmPlanes,
+                           bmp->bmBitsPixel, PTR_SEG_TO_LIN( bmp->bmBits ) );
 }
 
 
@@ -137,15 +152,24 @@ HBITMAP16 CreateBitmapIndirect16( const BITMAP16 * bmp )
  */
 HBITMAP32 CreateBitmapIndirect32( const BITMAP32 * bmp )
 {
-    return CreateBitmap( bmp->bmWidth, bmp->bmHeight, bmp->bmPlanes,
-                         bmp->bmBitsPixel, bmp->bmBits );
+    return CreateBitmap32( bmp->bmWidth, bmp->bmHeight, bmp->bmPlanes,
+                           bmp->bmBitsPixel, bmp->bmBits );
+}
+
+
+/***********************************************************************
+ *           GetBitmapBits16    (GDI.74)
+ */
+LONG GetBitmapBits16( HBITMAP16 hbitmap, LONG count, LPVOID buffer )
+{
+    return GetBitmapBits32( hbitmap, count, buffer );
 }
 
 
 /***********************************************************************
- *           GetBitmapBits    (GDI.74) (GDI32.143)
+ *           GetBitmapBits32    (GDI32.143)
  */
-LONG GetBitmapBits( HBITMAP32 hbitmap, LONG count, LPVOID buffer )
+LONG GetBitmapBits32( HBITMAP32 hbitmap, LONG count, LPVOID buffer )
 {
     BITMAPOBJ * bmp;
     LONG height;
@@ -178,9 +202,18 @@ LONG GetBitmapBits( HBITMAP32 hbitmap, LONG count, LPVOID buffer )
 
 
 /***********************************************************************
- *           SetBitmapBits    (GDI.106) (GDI32.303)
+ *           SetBitmapBits16    (GDI.106)
+ */
+LONG SetBitmapBits16( HBITMAP16 hbitmap, LONG count, LPCVOID buffer )
+{
+    return SetBitmapBits32( hbitmap, count, buffer );
+}
+
+
+/***********************************************************************
+ *           SetBitmapBits32    (GDI32.303)
  */
-LONG SetBitmapBits( HBITMAP32 hbitmap, LONG count, LPCVOID buffer )
+LONG SetBitmapBits32( HBITMAP32 hbitmap, LONG count, LPCVOID buffer )
 {
     BITMAPOBJ * bmp;
     LONG height;
@@ -416,14 +449,20 @@ INT32 BITMAP_GetObject32( BITMAPOBJ * bmp, INT32 count, LPVOID buffer )
 
 
 /***********************************************************************
- *           CreateDiscardableBitmap    (GDI.156) (GDI32.38)
+ *           CreateDiscardableBitmap16    (GDI.156)
+ */
+HBITMAP16 CreateDiscardableBitmap16( HDC16 hdc, INT16 width, INT16 height )
+{
+    return CreateCompatibleBitmap16( hdc, width, height );
+}
+
+
+/***********************************************************************
+ *           CreateDiscardableBitmap32    (GDI32.38)
  */
-HBITMAP16 CreateDiscardableBitmap( HDC32 hdc, INT32 width, INT32 height )
+HBITMAP32 CreateDiscardableBitmap32( HDC32 hdc, INT32 width, INT32 height )
 {
-    dprintf_bitmap(stddeb,"CreateDiscardableBitmap(%04x, %d, %d); "
-	   "// call CreateCompatibleBitmap() for now!\n",
-	   hdc, width, height);
-    return CreateCompatibleBitmap(hdc, width, height);
+    return CreateCompatibleBitmap32( hdc, width, height );
 }
 
 
diff --git a/objects/brush.c b/objects/brush.c
index eb8bca2fd2e..4a0600582ea 100644
--- a/objects/brush.c
+++ b/objects/brush.c
@@ -4,7 +4,6 @@
  * Copyright 1993, 1994  Alexandre Julliard
  */
 
-#define NO_TRANSITION_TYPES  /* This file is Win32-clean */
 #include <stdlib.h>
 #include "brush.h"
 #include "bitmap.h"
diff --git a/objects/clipping.c b/objects/clipping.c
index 7ca30a911fd..e801cb02a0f 100644
--- a/objects/clipping.c
+++ b/objects/clipping.c
@@ -4,7 +4,6 @@
  * Copyright 1993 Alexandre Julliard
  */
 
-#define NO_TRANSITION_TYPES  /* This file is Win32-clean */
 #include <stdio.h>
 #include "dc.h"
 #include "metafile.h"
diff --git a/objects/color.c b/objects/color.c
index 5d1abd90c9d..5b8c76152af 100644
--- a/objects/color.c
+++ b/objects/color.c
@@ -262,7 +262,7 @@ void COLOR_FillDefaultColors(void)
  *
  * Allocate colorcells and initialize mapping tables.
  */
-static BOOL COLOR_BuildPrivateMap(CSPACE* cs)
+static BOOL32 COLOR_BuildPrivateMap(CSPACE* cs)
 {
     /* Private colormap - identity mapping */
 
@@ -313,7 +313,7 @@ static BOOL COLOR_BuildPrivateMap(CSPACE* cs)
     return FALSE;
 }
 
-static BOOL COLOR_BuildSharedMap(CSPACE* cs)
+static BOOL32 COLOR_BuildSharedMap(CSPACE* cs)
 {
    XColor		color;
    unsigned long        sysPixel[NB_RESERVED_COLORS];
@@ -738,7 +738,11 @@ int COLOR_LookupSystemPixel(COLORREF col)
 
  for( i = 0; i < size && diff ; i++ )
     {
-      if( i == NB_RESERVED_COLORS/2 ) i = size - NB_RESERVED_COLORS/2;
+      if( i == NB_RESERVED_COLORS/2 )
+      {
+      	int newi = size - NB_RESERVED_COLORS/2;
+	if (newi>i) i=newi;
+      }
 
       r = COLOR_sysPal[i].peRed - GetRValue(col);
       g = COLOR_sysPal[i].peGreen - GetGValue(col);
diff --git a/objects/cursoricon.c b/objects/cursoricon.c
index 62b48233bea..bdb9f0d7d14 100644
--- a/objects/cursoricon.c
+++ b/objects/cursoricon.c
@@ -22,7 +22,6 @@
  * the bits directly :-(
  */
 
-#define NO_TRANSITION_TYPES  /* This file is Win32-clean */
 #include <string.h>
 #include <stdlib.h>
 #include "windows.h"
@@ -367,8 +366,8 @@ HGLOBAL16 CURSORICON_LoadHandler( HGLOBAL16 handle, HINSTANCE16 hInstance,
 
     /* Transfer the bitmap bits to the CURSORICONINFO structure */
 
-    GetBitmapBits( hAndBits, sizeAnd, (char *)(info + 1) );
-    GetBitmapBits( hXorBits, sizeXor, (char *)(info + 1) + sizeAnd );
+    GetBitmapBits32( hAndBits, sizeAnd, (char *)(info + 1) );
+    GetBitmapBits32( hXorBits, sizeXor, (char *)(info + 1) + sizeAnd );
     DeleteObject32( hXorBits );
     DeleteObject32( hAndBits );
     GlobalUnlock16( handle );
@@ -739,12 +738,13 @@ BOOL32 DrawIcon32( HDC32 hdc, INT32 x, INT32 y, HICON32 hIcon )
 
     if (!(ptr = (CURSORICONINFO *)GlobalLock16( hIcon ))) return FALSE;
     if (!(hMemDC = CreateCompatibleDC32( hdc ))) return FALSE;
-    hAndBits = CreateBitmap( ptr->nWidth, ptr->nHeight, 1, 1, (char *)(ptr+1));
-    hXorBits = CreateBitmap( ptr->nWidth, ptr->nHeight, ptr->bPlanes,
-                             ptr->bBitsPerPixel, (char *)(ptr + 1)
+    hAndBits = CreateBitmap32( ptr->nWidth, ptr->nHeight, 1, 1,
+                               (char *)(ptr+1) );
+    hXorBits = CreateBitmap32( ptr->nWidth, ptr->nHeight, ptr->bPlanes,
+                               ptr->bBitsPerPixel, (char *)(ptr + 1)
                          + ptr->nHeight * BITMAP_WIDTH_BYTES(ptr->nWidth,1) );
-    oldFg = SetTextColor( hdc, RGB(0,0,0) );
-    oldBg = SetBkColor( hdc, RGB(255,255,255) );
+    oldFg = SetTextColor32( hdc, RGB(0,0,0) );
+    oldBg = SetBkColor32( hdc, RGB(255,255,255) );
 
     if (hXorBits && hAndBits)
     {
@@ -758,8 +758,8 @@ BOOL32 DrawIcon32( HDC32 hdc, INT32 x, INT32 y, HICON32 hIcon )
     if (hXorBits) DeleteObject32( hXorBits );
     if (hAndBits) DeleteObject32( hAndBits );
     GlobalUnlock16( hIcon );
-    SetTextColor( hdc, oldFg );
-    SetBkColor( hdc, oldBg );
+    SetTextColor32( hdc, oldFg );
+    SetBkColor32( hdc, oldBg );
     return TRUE;
 }
 
diff --git a/objects/dc.c b/objects/dc.c
index 889518f9c72..6d31cd8d387 100644
--- a/objects/dc.c
+++ b/objects/dc.c
@@ -5,11 +5,9 @@
  *
  */
 
-#define NO_TRANSITION_TYPES  /* This file is Win32-clean */
 #include <stdlib.h>
 #include <string.h>
 #include "gdi.h"
-#include "bitmap.h"
 #include "heap.h"
 #include "metafile.h"
 #include "stddebug.h"
@@ -185,8 +183,8 @@ DC *DC_GetDCPtr( HDC32 hdc )
 void DC_InitDC( DC* dc )
 {
     RealizeDefaultPalette( dc->hSelf );
-    SetTextColor( dc->hSelf, dc->w.textColor );
-    SetBkColor( dc->hSelf, dc->w.backgroundColor );
+    SetTextColor32( dc->hSelf, dc->w.textColor );
+    SetBkColor32( dc->hSelf, dc->w.backgroundColor );
     SelectObject32( dc->hSelf, dc->w.hPen );
     SelectObject32( dc->hSelf, dc->w.hBrush );
     SelectObject32( dc->hSelf, dc->w.hFont );
@@ -690,7 +688,7 @@ HDC32 CreateCompatibleDC32( HDC32 hdc )
                hdc, dc->hSelf );
 
       /* Create default bitmap */
-    if (!(hbitmap = CreateBitmap( 1, 1, 1, 1, NULL )))
+    if (!(hbitmap = CreateBitmap32( 1, 1, 1, 1, NULL )))
     {
 	GDI_HEAP_FREE( dc->hSelf );
 	return 0;
@@ -816,9 +814,18 @@ INT32 GetDeviceCaps32( HDC32 hdc, INT32 cap )
 
 
 /***********************************************************************
- *           SetBkColor    (GDI.1) (GDI32.305)
+ *           SetBkColor16    (GDI.1)
  */
-COLORREF SetBkColor( HDC32 hdc, COLORREF color )
+COLORREF SetBkColor16( HDC16 hdc, COLORREF color )
+{
+    return SetBkColor32( hdc, color );
+}
+
+
+/***********************************************************************
+ *           SetBkColor32    (GDI32.305)
+ */
+COLORREF SetBkColor32( HDC32 hdc, COLORREF color )
 {
     COLORREF oldColor;
     DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC );
@@ -838,9 +845,18 @@ COLORREF SetBkColor( HDC32 hdc, COLORREF color )
 
 
 /***********************************************************************
- *           SetTextColor    (GDI.9) (GDI32.338)
+ *           SetTextColor16    (GDI.9)
+ */
+COLORREF SetTextColor16( HDC16 hdc, COLORREF color )
+{
+    return SetTextColor32( hdc, color );
+}
+
+
+/***********************************************************************
+ *           SetTextColor32    (GDI32.338)
  */
-COLORREF SetTextColor( HDC32 hdc, COLORREF color )
+COLORREF SetTextColor32( HDC32 hdc, COLORREF color )
 {
     COLORREF oldColor;
     DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC );
diff --git a/objects/dcvalues.c b/objects/dcvalues.c
index b90b484ab56..9ea8221ebaa 100644
--- a/objects/dcvalues.c
+++ b/objects/dcvalues.c
@@ -5,7 +5,6 @@
  *
  */
 
-#define NO_TRANSITION_TYPES  /* This file is Win32-clean */
 #include "gdi.h"
 #include "metafile.h"
 
diff --git a/objects/dib.c b/objects/dib.c
index d49b0914a62..29aba34772e 100644
--- a/objects/dib.c
+++ b/objects/dib.c
@@ -4,7 +4,6 @@
  * Copyright 1993,1994  Alexandre Julliard
  */
 
-#define NO_TRANSITION_TYPES  /* This file is Win32-clean */
 #include <stdio.h>
 #include <stdlib.h>
 #include <X11/Xlib.h>
@@ -907,8 +906,8 @@ HBITMAP32 CreateDIBitmap32( HDC32 hdc, const BITMAPINFOHEADER *header,
 
     /* Now create the bitmap */
 
-    handle = fColor ? CreateCompatibleBitmap( hdc, width, height ) :
-                      CreateBitmap( width, height, 1, 1, NULL );
+    handle = fColor ? CreateCompatibleBitmap32( hdc, width, height ) :
+                      CreateBitmap32( width, height, 1, 1, NULL );
     if (!handle) return 0;
 
     if (init == CBM_INIT)
diff --git a/objects/font.c b/objects/font.c
index edf0266248f..7912362485e 100644
--- a/objects/font.c
+++ b/objects/font.c
@@ -202,30 +202,81 @@ void FONT_GetMetrics( LOGFONT16 * logfont, XFontStruct * xfont,
     metrics->tmAveCharWidth = average;
 }
 
+
 /***********************************************************************
- *           GetGlyphOutLine    (GDI.309)
+ *           GetGlyphOutline16    (GDI.309)
  */
-DWORD GetGlyphOutLine( HDC16 hdc, UINT uChar, UINT fuFormat,
-                       LPGLYPHMETRICS lpgm, DWORD cbBuffer, LPSTR lpBuffer,
-                       LPMAT2 lpmat2) 
+DWORD GetGlyphOutline16( HDC16 hdc, UINT16 uChar, UINT16 fuFormat,
+                         LPGLYPHMETRICS16 lpgm, DWORD cbBuffer,
+                         LPVOID lpBuffer, const MAT2 *lpmat2 )
 {
-    fprintf( stdnimp,"GetGlyphOutLine(%04x, '%c', %04x, %p, %ld, %p, %p) // - empty stub!\n",
+    fprintf( stdnimp,"GetGlyphOutLine16(%04x, '%c', %04x, %p, %ld, %p, %p) // - empty stub!\n",
              hdc, uChar, fuFormat, lpgm, cbBuffer, lpBuffer, lpmat2 );
     return (DWORD)-1; /* failure */
 }
 
 
 /***********************************************************************
- *           CreateScalableFontResource    (GDI.310)
+ *           GetGlyphOutline32A    (GDI32.186)
  */
-BOOL CreateScalableFontResource( UINT fHidden,LPSTR lpszResourceFile,
-                                 LPSTR lpszFontFile, LPSTR lpszCurrentPath )
+DWORD GetGlyphOutline32A( HDC32 hdc, UINT32 uChar, UINT32 fuFormat,
+                         LPGLYPHMETRICS32 lpgm, DWORD cbBuffer,
+                         LPVOID lpBuffer, const MAT2 *lpmat2 )
+{
+    fprintf( stdnimp,"GetGlyphOutLine32A(%04x, '%c', %04x, %p, %ld, %p, %p) // - empty stub!\n",
+             hdc, uChar, fuFormat, lpgm, cbBuffer, lpBuffer, lpmat2 );
+    return (DWORD)-1; /* failure */
+}
+
+
+/***********************************************************************
+ *           GetGlyphOutline32W    (GDI32.187)
+ */
+DWORD GetGlyphOutline32W( HDC32 hdc, UINT32 uChar, UINT32 fuFormat,
+                         LPGLYPHMETRICS32 lpgm, DWORD cbBuffer,
+                         LPVOID lpBuffer, const MAT2 *lpmat2 )
+{
+    fprintf( stdnimp,"GetGlyphOutLine32W(%04x, '%c', %04x, %p, %ld, %p, %p) // - empty stub!\n",
+             hdc, uChar, fuFormat, lpgm, cbBuffer, lpBuffer, lpmat2 );
+    return (DWORD)-1; /* failure */
+}
+
+
+/***********************************************************************
+ *           CreateScalableFontResource16   (GDI.310)
+ */
+BOOL16 CreateScalableFontResource16( UINT16 fHidden, LPCSTR lpszResourceFile,
+                                     LPCSTR fontFile, LPCSTR path )
+{
+    return CreateScalableFontResource32A( fHidden, lpszResourceFile,
+                                          fontFile, path );
+}
+
+/***********************************************************************
+ *           CreateScalableFontResource32A   (GDI32.62)
+ */
+BOOL32 CreateScalableFontResource32A( DWORD fHidden, LPCSTR lpszResourceFile,
+                                      LPCSTR lpszFontFile,
+                                      LPCSTR lpszCurrentPath )
 {
     /* fHidden=1 - only visible for the calling app, read-only, not
      * enumbered with EnumFonts/EnumFontFamilies
      * lpszCurrentPath can be NULL
      */
-    fprintf(stdnimp,"CreateScalableFontResource(%d,%s,%s,%s) // empty stub!\n",
+    fprintf(stdnimp,"CreateScalableFontResource(%ld,%s,%s,%s) // empty stub\n",
+            fHidden, lpszResourceFile, lpszFontFile, lpszCurrentPath );
+    return FALSE; /* create failed */
+}
+
+
+/***********************************************************************
+ *           CreateScalableFontResource32W   (GDI32.63)
+ */
+BOOL32 CreateScalableFontResource32W( DWORD fHidden, LPCWSTR lpszResourceFile,
+                                      LPCWSTR lpszFontFile,
+                                      LPCWSTR lpszCurrentPath )
+{
+    fprintf(stdnimp,"CreateScalableFontResource32W(%ld,%p,%p,%p) // empty stub\n",
             fHidden, lpszResourceFile, lpszFontFile, lpszCurrentPath );
     return FALSE; /* create failed */
 }
@@ -890,9 +941,18 @@ BOOL32 GetCharWidth32W( HDC32 hdc, UINT32 firstChar, UINT32 lastChar,
 
 
 /***********************************************************************
- *           AddFontResource    (GDI.119)
+ *           AddFontResource16    (GDI.119)
+ */
+INT16 AddFontResource16( LPCSTR str )
+{
+    return AddFontResource32A( str );
+}
+
+
+/***********************************************************************
+ *           AddFontResource32A    (GDI32.2)
  */
-INT AddFontResource( LPCSTR str )
+INT32 AddFontResource32A( LPCSTR str )
 {
     if (HIWORD(str))
         fprintf( stdnimp, "STUB: AddFontResource('%s')\n", str );
@@ -903,9 +963,28 @@ INT AddFontResource( LPCSTR str )
 
 
 /***********************************************************************
- *           RemoveFontResource    (GDI.136)
+ *           AddFontResource32W    (GDI32.4)
  */
-BOOL RemoveFontResource( LPSTR str )
+INT32 AddFontResource32W( LPCWSTR str )
+{
+    fprintf( stdnimp, "STUB: AddFontResource32W(%p)\n", str );
+    return 1;
+}
+
+
+/***********************************************************************
+ *           RemoveFontResource16    (GDI.136)
+ */
+BOOL16 RemoveFontResource16( LPCSTR str )
+{
+    return RemoveFontResource32A( str );
+}
+
+
+/***********************************************************************
+ *           RemoveFontResource32A    (GDI32.284)
+ */
+BOOL32 RemoveFontResource32A( LPCSTR str )
 {
     if (HIWORD(str))
         fprintf( stdnimp, "STUB: RemoveFontResource('%s')\n", str );
@@ -914,6 +993,17 @@ BOOL RemoveFontResource( LPSTR str )
     return TRUE;
 }
 
+
+/***********************************************************************
+ *           RemoveFontResource32W    (GDI32.286)
+ */
+BOOL32 RemoveFontResource32W( LPCWSTR str )
+{
+    fprintf( stdnimp, "STUB: RemoveFontResource32W(%p)\n", str );
+    return TRUE;
+}
+
+
 /*************************************************************************
  *				FONT_ParseFontParms		[internal]
  */
@@ -1350,10 +1440,18 @@ INT32 EnumFontFamiliesEx32W(HDC32 hDC, LPLOGFONT32W lpLF, FONTENUMPROCEX32W lpEn
 
 
 /*************************************************************************
- *				GetRasterizerCaps	[GDI.313]
+ *             GetRasterizerCaps16   (GDI.313)
  */
+BOOL16 GetRasterizerCaps16( LPRASTERIZER_STATUS lprs, UINT16 cbNumBytes )
+{
+    return GetRasterizerCaps32( lprs, cbNumBytes );
+}
 
-BOOL GetRasterizerCaps(LPRASTERIZER_STATUS lprs, UINT cbNumBytes)
+
+/*************************************************************************
+ *             GetRasterizerCaps32   (GDI32.216)
+ */
+BOOL32 GetRasterizerCaps32( LPRASTERIZER_STATUS lprs, UINT32 cbNumBytes )
 {
   /* This is not much more than a dummy */
   RASTERIZER_STATUS rs;
@@ -1361,22 +1459,49 @@ BOOL GetRasterizerCaps(LPRASTERIZER_STATUS lprs, UINT cbNumBytes)
   rs.nSize = sizeof(rs);
   rs.wFlags = 0;
   rs.nLanguageID = 0;
-  return True;
+  return TRUE;
 }
 
+
 /*************************************************************************
- *             GetKerningPairs      [GDI.332]
+ *             GetKerningPairs16   (GDI.332)
  */
-int GetKerningPairs(HDC16 hDC,int cPairs,LPKERNINGPAIR16 lpKerningPairs)
+INT16 GetKerningPairs16( HDC16 hDC, INT16 cPairs,
+                         LPKERNINGPAIR16 lpKerningPairs )
 {
     /* This has to be dealt with when proper font handling is in place 
      *
      * At this time kerning is ignored (set to 0)
      */
+    int i;
+    fprintf(stdnimp,"GetKerningPairs16: almost empty stub!\n");
+    for (i = 0; i < cPairs; i++) lpKerningPairs[i].iKernAmount = 0;
+    return 0;
+}
+
 
+/*************************************************************************
+ *             GetKerningPairs32A   (GDI32.192)
+ */
+DWORD GetKerningPairs32A( HDC32 hDC, DWORD cPairs,
+                          LPKERNINGPAIR32 lpKerningPairs )
+{
+    /* This has to be dealt with when proper font handling is in place 
+     *
+     * At this time kerning is ignored (set to 0)
+     */
     int i;
-    fprintf(stdnimp,"GetKerningPairs: almost empty stub!\n");
+    fprintf(stdnimp,"GetKerningPairs32: almost empty stub!\n");
     for (i = 0; i < cPairs; i++) lpKerningPairs[i].iKernAmount = 0;
     return 0;
 }
 
+
+/*************************************************************************
+ *             GetKerningPairs32W   (GDI32.193)
+ */
+DWORD GetKerningPairs32W( HDC32 hDC, DWORD cPairs,
+                          LPKERNINGPAIR32 lpKerningPairs )
+{
+    return GetKerningPairs32A( hDC, cPairs, lpKerningPairs );
+}
diff --git a/objects/gdiobj.c b/objects/gdiobj.c
index d8eccaa3cb1..4422ed8215a 100644
--- a/objects/gdiobj.c
+++ b/objects/gdiobj.c
@@ -4,7 +4,6 @@
  * Copyright 1993 Alexandre Julliard
  */
 
-#define NO_TRANSITION_TYPES  /* This file is Win32-clean */
 #include <stdlib.h>
 #include <stdio.h>
 #include "color.h"
diff --git a/objects/linedda.c b/objects/linedda.c
index be9693f8247..d0cf871a033 100644
--- a/objects/linedda.c
+++ b/objects/linedda.c
@@ -4,7 +4,6 @@
  * Copyright 1993 Bob Amstadt
  */
 
-#define NO_TRANSITION_TYPES  /* This file is Win32-clean */
 #include <stdlib.h>
 #include "windows.h"
 
diff --git a/objects/metafile.c b/objects/metafile.c
index d5dcf12e14b..64701e95c15 100644
--- a/objects/metafile.c
+++ b/objects/metafile.c
@@ -217,7 +217,7 @@ HMETAFILE32 CopyMetaFile32W( HMETAFILE32 hSrcMetaFile, LPCWSTR lpFilename )
 
 BOOL16 IsValidMetaFile(HMETAFILE16 hmf)
 {
-    BOOL resu=FALSE;
+    BOOL16 resu=FALSE;
     METAHEADER *mh = (METAHEADER *)GlobalLock16(hmf);
     if (mh) {
       if (mh->mtType == 1 || mh->mtType == 0) 
@@ -276,7 +276,7 @@ BOOL32 PlayMetaFile32( HDC32 hdc, HMETAFILE32 hmf )
 	dprintf_metafile(stddeb,"offset = %04x size = %08lx function = %04x\n",
 			 offset,mr->rdSize,mr->rdFunction);
 	offset += mr->rdSize * 2;
-	PlayMetaFileRecord(hdc, ht, mr, mh->mtNoObjects);
+	PlayMetaFileRecord16( hdc, ht, mr, mh->mtNoObjects );
     }
 
     SelectObject32(hdc, hBrush);
@@ -296,11 +296,11 @@ BOOL32 PlayMetaFile32( HDC32 hdc, HMETAFILE32 hmf )
 
 
 /******************************************************************
- *         EnumMetafile         GDI.175    
+ *            EnumMetaFile16   (GDI.175)
  *                                    Niels de carpentier, april 1996
  */
-
-BOOL EnumMetaFile(HDC16 hdc, HMETAFILE16 hmf, MFENUMPROC16 lpEnumFunc,LPARAM lpData)
+BOOL16 EnumMetaFile16( HDC16 hdc, HMETAFILE16 hmf, MFENUMPROC16 lpEnumFunc,
+                       LPARAM lpData )
 {
     METAHEADER *mh = (METAHEADER *)GlobalLock16(hmf);
     METARECORD *mr;
@@ -341,11 +341,10 @@ BOOL EnumMetaFile(HDC16 hdc, HMETAFILE16 hmf, MFENUMPROC16 lpEnumFunc,LPARAM lpD
 
 
 /******************************************************************
- *         PlayMetaFileRecord      GDI.176
+ *             PlayMetaFileRecord16   (GDI.176)
  */
-
-void PlayMetaFileRecord(HDC16 hdc, HANDLETABLE16 *ht, METARECORD *mr,
-                        WORD nHandles)
+void PlayMetaFileRecord16( HDC16 hdc, HANDLETABLE16 *ht, METARECORD *mr,
+                           UINT16 nHandles )
 {
     short s1;
     HANDLE16 hndl;
@@ -366,7 +365,7 @@ void PlayMetaFileRecord(HDC16 hdc, HANDLETABLE16 *ht, METARECORD *mr,
       break;
 
     case META_SETBKCOLOR:
-	SetBkColor(hdc, MAKELONG(*(mr->rdParam), *(mr->rdParam + 1)));
+	SetBkColor16(hdc, MAKELONG(*(mr->rdParam), *(mr->rdParam + 1)));
 	break;
 
     case META_SETBKMODE:
@@ -393,7 +392,7 @@ void PlayMetaFileRecord(HDC16 hdc, HANDLETABLE16 *ht, METARECORD *mr,
 	SetStretchBltMode16(hdc, *(mr->rdParam));
 	break;
     case META_SETTEXTCOLOR:
-	SetTextColor(hdc, MAKELONG(*(mr->rdParam), *(mr->rdParam + 1)));
+	SetTextColor16(hdc, MAKELONG(*(mr->rdParam), *(mr->rdParam + 1)));
 	break;
 
     case META_SETWINDOWORG:
@@ -543,7 +542,7 @@ void PlayMetaFileRecord(HDC16 hdc, HANDLETABLE16 *ht, METARECORD *mr,
 	case BS_PATTERN:
 	    infohdr = (BITMAPINFOHEADER *)(mr->rdParam + 2);
 	    MF_AddHandle(ht, nHandles,
-			 CreatePatternBrush32(CreateBitmap(infohdr->biWidth, 
+			 CreatePatternBrush32(CreateBitmap32(infohdr->biWidth, 
 				      infohdr->biHeight, 
 				      infohdr->biPlanes, 
 				      infohdr->biBitCount,
@@ -660,11 +659,11 @@ void PlayMetaFileRecord(HDC16 hdc, HANDLETABLE16 *ht, METARECORD *mr,
     case META_STRETCHBLT:
       {
        HDC16 hdcSrc=CreateCompatibleDC16(hdc);
-       HBITMAP16 hbitmap=CreateBitmap(mr->rdParam[10], /*Width */
-                                      mr->rdParam[11], /*Height*/
-                                      mr->rdParam[13], /*Planes*/
-                                      mr->rdParam[14], /*BitsPixel*/
-                                      (LPSTR)&mr->rdParam[15]);  /*bits*/
+       HBITMAP32 hbitmap=CreateBitmap32(mr->rdParam[10], /*Width */
+                                        mr->rdParam[11], /*Height*/
+                                        mr->rdParam[13], /*Planes*/
+                                        mr->rdParam[14], /*BitsPixel*/
+                                        (LPSTR)&mr->rdParam[15]);  /*bits*/
        SelectObject32(hdcSrc,hbitmap);
        StretchBlt16(hdc,mr->rdParam[9],mr->rdParam[8],
                     mr->rdParam[7],mr->rdParam[6],
@@ -678,9 +677,11 @@ void PlayMetaFileRecord(HDC16 hdc, HANDLETABLE16 *ht, METARECORD *mr,
     case META_BITBLT:            /* <-- not yet debugged */
       {
        HDC16 hdcSrc=CreateCompatibleDC16(hdc);
-       HBITMAP16 hbitmap=CreateBitmap(mr->rdParam[7]/*Width */,mr->rdParam[8]/*Height*/,
-                            mr->rdParam[10]/*Planes*/,mr->rdParam[11]/*BitsPixel*/,
-                            (LPSTR)&mr->rdParam[12]/*bits*/);
+       HBITMAP32 hbitmap=CreateBitmap32(mr->rdParam[7]/*Width */,
+                                        mr->rdParam[8]/*Height*/,
+                                        mr->rdParam[10]/*Planes*/,
+                                        mr->rdParam[11]/*BitsPixel*/,
+                                        (LPSTR)&mr->rdParam[12]/*bits*/);
        SelectObject32(hdcSrc,hbitmap);
        BitBlt32(hdc,(INT16)mr->rdParam[6],(INT16)mr->rdParam[5],
                 (INT16)mr->rdParam[4],(INT16)mr->rdParam[3],
@@ -1162,7 +1163,8 @@ BOOL32 MF_BitBlt(DC *dcDest, short xDest, short yDest, short width,
     *(mr->rdParam +10) = BM.bmPlanes;
     *(mr->rdParam +11) = BM.bmBitsPixel;
     dprintf_metafile(stddeb,"MF_StretchBlt->len = %ld  rop=%lx  \n",len,rop);
-    if (GetBitmapBits(dcSrc->w.hBitmap,BM.bmWidthBytes * BM.bmHeight,mr->rdParam +12))
+    if (GetBitmapBits32(dcSrc->w.hBitmap,BM.bmWidthBytes * BM.bmHeight,
+                        mr->rdParam +12))
     {
       mr->rdSize = len / sizeof(INT16);
       *(mr->rdParam) = HIWORD(rop);
@@ -1227,7 +1229,7 @@ BOOL32 MF_StretchBlt(DC *dcDest, short xDest, short yDest, short widthDest,
 
     dprintf_metafile(stddeb,"MF_StretchBltViaDIB->len = %ld  rop=%lx  PixYPM=%ld Caps=%d\n",
                len,rop,lpBMI->biYPelsPerMeter,GetDeviceCaps(hdcSrc,LOGPIXELSY));
-    if (GetDIBits(hdcSrc,dcSrc->w.hBitmap,0,(UINT)lpBMI->biHeight,
+    if (GetDIBits(hdcSrc,dcSrc->w.hBitmap,0,(UINT32)lpBMI->biHeight,
                   (LPSTR)lpBMI + DIB_BitmapInfoSize( (BITMAPINFO *)lpBMI,
                                                      DIB_RGB_COLORS ),
                   (LPBITMAPINFO)lpBMI, DIB_RGB_COLORS))
@@ -1243,7 +1245,8 @@ BOOL32 MF_StretchBlt(DC *dcDest, short xDest, short yDest, short widthDest,
     *(mr->rdParam +13) = BM.bmPlanes;
     *(mr->rdParam +14) = BM.bmBitsPixel;
     dprintf_metafile(stddeb,"MF_StretchBlt->len = %ld  rop=%lx  \n",len,rop);
-    if (GetBitmapBits(dcSrc->w.hBitmap,BM.bmWidthBytes * BM.bmHeight,mr->rdParam +15))
+    if (GetBitmapBits32( dcSrc->w.hBitmap, BM.bmWidthBytes * BM.bmHeight,
+                         mr->rdParam +15))
 #endif    
     {
       mr->rdSize = len / sizeof(INT16);
diff --git a/objects/oembitmap.c b/objects/oembitmap.c
index 224f658acd5..6fb8aabaa95 100644
--- a/objects/oembitmap.c
+++ b/objects/oembitmap.c
@@ -5,7 +5,6 @@
  *
  */
 
-#define NO_TRANSITION_TYPES  /* This file is Win32-clean */
 #include <stdlib.h>
 #include <string.h>
 #include <X11/Xlib.h>
@@ -482,9 +481,9 @@ HGLOBAL16 OBM_LoadCursorIcon( WORD id, BOOL32 fCursor )
         }
     }
 
-    if (hAndBits) GetBitmapBits( hAndBits, sizeAnd, (char *)(pInfo + 1) );
+    if (hAndBits) GetBitmapBits32( hAndBits, sizeAnd, (char *)(pInfo + 1) );
     else memset( (char *)(pInfo + 1), 0xff, sizeAnd );
-    GetBitmapBits( hXorBits, sizeXor, (char *)(pInfo + 1) + sizeAnd );
+    GetBitmapBits32( hXorBits, sizeXor, (char *)(pInfo + 1) + sizeAnd );
 
     DeleteObject32( hXorBits );
     DeleteObject32( hAndBits );
diff --git a/objects/palette.c b/objects/palette.c
index 5c38d23dfba..9faca5f2c33 100644
--- a/objects/palette.c
+++ b/objects/palette.c
@@ -6,7 +6,6 @@
  *
  */
 
-#define NO_TRANSITION_TYPES  /* This file is Win32-clean */
 #include <stdlib.h>
 #include <string.h>
 #include <X11/Xlib.h>
@@ -572,10 +571,9 @@ UINT32 RealizePalette32( HDC32 hDC )
 
 
 /**********************************************************************
- *	    UpdateColors	(GDI.366)
- *
+ *            UpdateColors16   (GDI.366)
  */
-int UpdateColors( HDC16 hDC )
+INT16 UpdateColors16( HDC16 hDC )
 {
     HWND32 hWnd = WindowFromDC32( hDC );
 
@@ -587,3 +585,12 @@ int UpdateColors( HDC16 hDC )
     return 0x666;
 }
 
+
+/**********************************************************************
+ *            UpdateColors32   (GDI32.359)
+ */
+BOOL32 UpdateColors32( HDC32 hDC )
+{
+    UpdateColors16( hDC );
+    return TRUE;
+}
diff --git a/objects/pen.c b/objects/pen.c
index 2cca5764fcd..f33b791eeb3 100644
--- a/objects/pen.c
+++ b/objects/pen.c
@@ -4,7 +4,6 @@
  * Copyright 1993 Alexandre Julliard
  */
 
-#define NO_TRANSITION_TYPES  /* This file is Win32-clean */
 #include "pen.h"
 #include "metafile.h"
 #include "color.h"
diff --git a/objects/region.c b/objects/region.c
index 18e808db6c8..3575132b6a1 100644
--- a/objects/region.c
+++ b/objects/region.c
@@ -4,7 +4,6 @@
  * Copyright 1993, 1994, 1995 Alexandre Julliard
  */
 
-#define NO_TRANSITION_TYPES  /* This file is Win32-clean */
 #include <stdlib.h>
 #include <stdio.h>
 #include "region.h"
@@ -137,9 +136,20 @@ HRGN32 CreateRectRgnIndirect32( const RECT32* rect )
 
 
 /***********************************************************************
- *           SetRectRgn    (GDI.172) (GDI32.332)
+ *           SetRectRgn16    (GDI.172)
  */
-VOID SetRectRgn( HRGN32 hrgn, INT32 left, INT32 top, INT32 right, INT32 bottom)
+VOID SetRectRgn16( HRGN16 hrgn, INT16 left, INT16 top,
+                   INT16 right, INT16 bottom )
+{
+    SetRectRgn32( hrgn, left, top, right, bottom );
+}
+
+
+/***********************************************************************
+ *           SetRectRgn32    (GDI32.332)
+ */
+VOID SetRectRgn32( HRGN32 hrgn, INT32 left, INT32 top,
+                   INT32 right, INT32 bottom )
 {
     RGNOBJ * obj;
 
diff --git a/objects/text.c b/objects/text.c
index 1fcf6227bde..ce7572b47db 100644
--- a/objects/text.c
+++ b/objects/text.c
@@ -401,10 +401,9 @@ BOOL16 GrayString16( HDC16 hdc, HBRUSH16 hbr, GRAYSTRINGPROC16 gsprc,
 
     if (!cch) cch = lstrlen16( (LPCSTR)PTR_SEG_TO_LIN(lParam) );
     if (gsprc) return gsprc( hdc, lParam, cch );
-    current_color = GetTextColor32( hdc );
-    SetTextColor( hdc, GetSysColor32(COLOR_GRAYTEXT) );
+    current_color = SetTextColor32( hdc, GetSysColor32(COLOR_GRAYTEXT) );
     ret = TextOut16( hdc, x, y, (LPCSTR)PTR_SEG_TO_LIN(lParam), cch );
-    SetTextColor( hdc, current_color );
+    SetTextColor32( hdc, current_color );
     return ret;
 }
 
@@ -421,10 +420,9 @@ BOOL32 GrayString32A( HDC32 hdc, HBRUSH32 hbr, GRAYSTRINGPROC32 gsprc,
 
     if (!cch) cch = lstrlen32A( (LPCSTR)lParam );
     if (gsprc) return gsprc( hdc, lParam, cch );
-    current_color = GetTextColor32( hdc );
-    SetTextColor( hdc, GetSysColor32(COLOR_GRAYTEXT) );
+    current_color = SetTextColor32( hdc, GetSysColor32(COLOR_GRAYTEXT) );
     ret = TextOut32A( hdc, x, y, (LPCSTR)lParam, cch );
-    SetTextColor( hdc, current_color );
+    SetTextColor32( hdc, current_color );
     return ret;
 }
 
@@ -441,10 +439,9 @@ BOOL32 GrayString32W( HDC32 hdc, HBRUSH32 hbr, GRAYSTRINGPROC32 gsprc,
 
     if (!cch) cch = lstrlen32W( (LPCWSTR)lParam );
     if (gsprc) return gsprc( hdc, lParam, cch );
-    current_color = GetTextColor32( hdc );
-    SetTextColor( hdc, GetSysColor32(COLOR_GRAYTEXT) );
+    current_color = SetTextColor32( hdc, GetSysColor32(COLOR_GRAYTEXT) );
     ret = TextOut32W( hdc, x, y, (LPCWSTR)lParam, cch );
-    SetTextColor( hdc, current_color );
+    SetTextColor32( hdc, current_color );
     return ret;
 }
 
diff --git a/rc/Makefile.in b/rc/Makefile.in
index 36f04e20fbb..55c6b9e3555 100644
--- a/rc/Makefile.in
+++ b/rc/Makefile.in
@@ -1,4 +1,4 @@
-DEFS      = -D__WINE__ -DNO_TRANSITION_TYPES
+DEFS      = -D__WINE__
 TOPSRCDIR = @top_srcdir@
 TOPOBJDIR = ..
 SRCDIR    = @srcdir@
diff --git a/rc/parser.l b/rc/parser.l
index bfca5cefe18..6b98c8da6b4 100644
--- a/rc/parser.l
+++ b/rc/parser.l
@@ -34,7 +34,7 @@ DIALOG		return DIALOG;
 DISCARDABLE	return DISCARDABLE;
 EDITTEXT	return EDITTEXT;
 END		return tEND;
-FIXED		return FIXED;
+FIXED		return tFIXED;
 FONT		return FONT;
 GRAYED		return GRAYED;
 GROUPBOX	return GROUPBOX;
diff --git a/rc/parser.y b/rc/parser.y
index 53f6bf53ae3..bbf38fa7979 100644
--- a/rc/parser.y
+++ b/rc/parser.y
@@ -23,7 +23,7 @@ int yyerror(const char *s);
 %token <str> tSTRING SINGLE_QUOTED IDENT
 %token ACCELERATORS ALT ASCII tBEGIN tBITMAP CAPTION CHECKBOX CHECKED 
 %token CLASS COMBOBOX CONTROL CTEXT CURSOR DEFPUSHBUTTON DIALOG 
-%token DISCARDABLE EDITTEXT tEND FIXED FONT GRAYED GROUPBOX HELP ICON 
+%token DISCARDABLE EDITTEXT tEND tFIXED FONT GRAYED GROUPBOX HELP ICON 
 %token IDENT INACTIVE LISTBOX LTEXT MENU MENUBARBREAK MENUBREAK MENUITEM 
 %token MOVEABLE LOADONCALL NOINVERT NOT NOT_SUPPORTED POPUP PRELOAD 
 %token PURE PUSHBUTTON RADIOBUTTON RCDATA RTEXT SCROLLBAR SHIFT SEPARATOR 
@@ -93,7 +93,7 @@ bitmap:		tBITMAP load_and_memoption tSTRING {$$=make_bitmap(load_file($3));}
 
 /* load and memory options are ignored */
 load_and_memoption:	| lamo load_and_memoption
-lamo:	PRELOAD | LOADONCALL | FIXED | MOVEABLE | DISCARDABLE | PURE
+lamo:	PRELOAD | LOADONCALL | tFIXED | MOVEABLE | DISCARDABLE | PURE
 
 cursor:		CURSOR load_and_memoption tSTRING {$$=make_cursor(load_file($3));}
 		|CURSOR load_and_memoption raw_data {$$=make_cursor($3);}
diff --git a/resources/Makefile.in b/resources/Makefile.in
index e54a75f5d58..09d0d85d3a7 100644
--- a/resources/Makefile.in
+++ b/resources/Makefile.in
@@ -1,4 +1,4 @@
-DEFS      = -D__WINE__ -DNO_TRANSITION_TYPES
+DEFS      = -D__WINE__
 TOPSRCDIR = @top_srcdir@
 TOPOBJDIR = ..
 SRCDIR    = @srcdir@
@@ -18,7 +18,8 @@ SYSRES_SRCS = \
 	sysres_Hu.c \
 	sysres_It.c \
 	sysres_Ko.c \
-	sysres_No.c
+	sysres_No.c \
+	sysres_Pl.c
 
 C_SRCS = sysres.c
 GEN_C_SRCS = $(SYSRES_SRCS)
diff --git a/resources/sysres.c b/resources/sysres.c
index 0bc35142756..03b41e3fb14 100644
--- a/resources/sysres.c
+++ b/resources/sysres.c
@@ -21,6 +21,7 @@
 #include "sysres_It.h"
 #include "sysres_Ko.h"
 #include "sysres_Hu.h"
+#include "sysres_Pl.h"
 
 static const struct resource * const * SYSRES_Resources[] =
 {
@@ -35,7 +36,8 @@ static const struct resource * const * SYSRES_Resources[] =
     sysres_Eo_Table,  /* LANG_Eo */
     sysres_It_Table,  /* LANG_It */
     sysres_Ko_Table,  /* LANG_Ko */
-    sysres_Hu_Table   /* LANG_Hu */
+    sysres_Hu_Table,  /* LANG_Hu */
+    sysres_Pl_Table   /* LANG_Pl */
 };
 
 
diff --git a/resources/sysres_Pl.rc b/resources/sysres_Pl.rc
new file mode 100644
index 00000000000..1af3dfff167
--- /dev/null
+++ b/resources/sysres_Pl.rc
@@ -0,0 +1,241 @@
+SYSMENU MENU LOADONCALL MOVEABLE DISCARDABLE
+{
+	MENUITEM "&Przywróæ", 61728
+	MENUITEM "Prze&suñ", 61456
+	MENUITEM "&Rozmiar", 61440
+	MENUITEM "Do &ikony", 61472
+	MENUITEM "Pe³ny &ekran", 61488
+	MENUITEM SEPARATOR
+	MENUITEM "&Zamknij\tAlt-F4", 61536
+	MENUITEM SEPARATOR
+	MENUITEM "Prze³¹&cz na...\tCtrl-Esc", 61744
+	MENUITEM SEPARATOR
+	MENUITEM "&O programie WINE...", 61761
+}
+
+EDITMENU MENU LOADONCALL MOVEABLE DISCARDABLE
+{
+	POPUP ""
+	BEGIN
+		MENUITEM "&Cofnij", EM_UNDO32
+		MENUITEM SEPARATOR
+		MENUITEM "W&ytnij", WM_CUT
+		MENUITEM "&Kopiuj", WM_COPY
+		MENUITEM "&Wklej", WM_PASTE
+		MENUITEM "&Usu\xf1", WM_CLEAR
+		MENUITEM SEPARATOR
+		MENUITEM "&Zaznacz wszystko", EM_SETSEL32
+	END
+}
+
+MSGBOX DIALOG 100, 80, 216, 168
+STYLE DS_SYSMODAL | DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
+BEGIN
+	ICON "", 1088, 8, 20, 16, 16, WS_CHILD | WS_VISIBLE
+	LTEXT "", 100, 32, 4, 176, 48, WS_CHILD | WS_VISIBLE | WS_GROUP
+	PUSHBUTTON "Ok", 1, 16, 56, 40, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP
+	PUSHBUTTON "Anuluj", 2, 64, 56, 40, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP
+	PUSHBUTTON "&Zaniechaj", 3, 112, 56, 40, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP
+	PUSHBUTTON "&Ponów próbê", 4, 160, 56, 50, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP
+	PUSHBUTTON "&Ignoruj", 5, 215, 56, 40, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP
+	PUSHBUTTON "&Tak", 6, 263, 56, 40, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP
+	PUSHBUTTON "&Nie", 7, 311, 56, 40, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP
+END
+SHELL_ABOUT_MSGBOX DIALOG 50, 44, 223, 270
+STYLE DS_LOCALEDIT | DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
+CAPTION "O %s"
+FONT 10, "System"
+{
+	DEFPUSHBUTTON "OK", 1, 91, 250, 40, 14
+	CONTROL "", -1, "STATIC", SS_BLACKFRAME | WS_CHILD | WS_VISIBLE | WS_DISABLED, 4, 35, 215, 210
+	CONTROL "Text", 100, "STATIC", SS_NOPREFIX | WS_GROUP, 11, 40, 200, 200
+	ICON "", 1088, 195, 10, 18, 20
+}
+//LTEXT "Wyswietl pliki &typu:", 1089, 6, 104, 90, 9
+OPEN_FILE DIALOG 36, 24, 279, 134
+STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
+CAPTION "Otwórz"
+FONT 8, "Helv"
+BEGIN
+	LTEXT "&Nazwa pliku:", 1090, 6, 6, 76, 9, WS_CHILD | WS_VISIBLE | WS_GROUP
+	EDITTEXT 1152, 6, 16, 90, 12, ES_AUTOHSCROLL | ES_OEMCONVERT | WS_BORDER | WS_TABSTOP
+	LISTBOX 1120, 6, 32, 90, 68, LBS_STANDARD | LBS_OWNERDRAWFIXED | LBS_HASSTRINGS | LBS_DISABLENOSCROLL | WS_TABSTOP
+	LTEXT "&Katalogi:", -1, 110, 6, 92, 9, WS_CHILD | WS_VISIBLE | WS_GROUP
+	CONTROL "", 1088, "STATIC", SS_NOPREFIX | WS_GROUP, 110, 18, 92, 9
+	LISTBOX 1121, 110, 32, 92, 68, LBS_STANDARD | LBS_OWNERDRAWFIXED | LBS_HASSTRINGS | LBS_DISABLENOSCROLL | WS_TABSTOP
+	LTEXT "Wyœwietl pliki &typu:", 1089, 6, 104, 90, 9, WS_CHILD | WS_VISIBLE | WS_GROUP
+	CONTROL "", 1136, "COMBOBOX", CBS_DROPDOWNLIST | CBS_AUTOHSCROLL | WS_BORDER | WS_VSCROLL | WS_TABSTOP, 6, 114, 90, 36
+	LTEXT "&Stacje dysków:", 1091, 110, 104, 92, 9, WS_CHILD | WS_VISIBLE | WS_GROUP
+	CONTROL "", 1137, "COMBOBOX", CBS_DROPDOWNLIST | CBS_OWNERDRAWFIXED | CBS_AUTOHSCROLL | CBS_SORT | CBS_HASSTRINGS | WS_BORDER | WS_VSCROLL | WS_TABSTOP, 110, 114, 92, 68
+	CONTROL "Otwórz", 1, "BUTTON", BS_DEFPUSHBUTTON | WS_CHILD | WS_VISIBLE | WS_GROUP | WS_TABSTOP, 212, 6, 56, 14
+	CONTROL "Anuluj", 2, "BUTTON", BS_PUSHBUTTON | WS_CHILD | WS_VISIBLE | WS_GROUP | WS_TABSTOP, 212, 24, 56, 14
+	CONTROL "&Pomoc", 1038, "BUTTON", BS_PUSHBUTTON | WS_CHILD | WS_VISIBLE | WS_GROUP | WS_TABSTOP, 212, 46, 56, 14
+	CONTROL "Tylko do odczytu", 1040, "BUTTON", BS_AUTOCHECKBOX | WS_CHILD | WS_VISIBLE | WS_GROUP | WS_TABSTOP, 208, 68, 69, 12
+END
+//PRINT DIALOG LOADONCALL MOVEABLE DISCARDABLE 36, 24, 264, 134
+SAVE_FILE DIALOG 36, 24, 278, 134
+STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
+CAPTION "Zapisz jako"
+FONT 8, "Helv"
+BEGIN
+	LTEXT "&Nazwa pliku:", 1090, 6, 6, 76, 9, WS_CHILD | WS_VISIBLE | WS_GROUP
+	EDITTEXT 1152, 6, 16, 90, 12, ES_AUTOHSCROLL | ES_OEMCONVERT | WS_BORDER | WS_TABSTOP
+	LISTBOX 1120, 6, 32, 90, 68, LBS_STANDARD | LBS_OWNERDRAWFIXED | LBS_HASSTRINGS | LBS_DISABLENOSCROLL | WS_TABSTOP
+	LTEXT "&Katalogi:", -1, 110, 6, 92, 9, WS_CHILD | WS_VISIBLE | WS_GROUP
+	CONTROL "", 1088, "STATIC", SS_NOPREFIX | WS_GROUP, 110, 18, 92, 9
+	LISTBOX 1121, 110, 32, 92, 68, LBS_STANDARD | LBS_OWNERDRAWFIXED | LBS_HASSTRINGS | LBS_DISABLENOSCROLL | WS_TABSTOP
+	LTEXT "Pokazuj pliki &typu:", 1089, 6, 104, 90, 9, WS_CHILD | WS_VISIBLE | WS_GROUP
+	CONTROL "", 1136, "COMBOBOX", CBS_DROPDOWNLIST | CBS_AUTOHSCROLL | WS_BORDER | WS_VSCROLL | WS_TABSTOP, 6, 114, 90, 36
+	LTEXT "&Stacje dysków:", 1091, 110, 104, 92, 9, WS_CHILD | WS_VISIBLE | WS_GROUP
+	CONTROL "", 1137, "COMBOBOX", CBS_DROPDOWNLIST | CBS_OWNERDRAWFIXED | CBS_AUTOHSCROLL | CBS_SORT | CBS_HASSTRINGS | WS_BORDER | WS_VSCROLL | WS_TABSTOP, 110, 114, 92, 68
+	CONTROL "Ok", 1, "BUTTON", BS_DEFPUSHBUTTON | WS_CHILD | WS_VISIBLE | WS_GROUP | WS_TABSTOP, 213, 6, 56, 14
+	CONTROL "Anuluj", 2, "BUTTON", BS_PUSHBUTTON | WS_CHILD | WS_VISIBLE | WS_GROUP | WS_TABSTOP, 213, 24, 56, 14
+	CONTROL "&Pomoc", 1038, "BUTTON", BS_PUSHBUTTON | WS_CHILD | WS_VISIBLE | WS_GROUP | WS_TABSTOP, 213, 45, 56, 14
+	CONTROL "&Tylko do odczytu", 1040, "BUTTON", BS_AUTOCHECKBOX | WS_CHILD | WS_VISIBLE | WS_GROUP | WS_TABSTOP, 208, 68, 68, 12
+END
+// DEFPUSHBUTTON "Ok", 1, 206, 6, 56, 14, BS_DEFPUSHBUTTON | WS_GROUP | WS_TABSTOP
+PRINT DIALOG 36, 24, 264, 134
+STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
+CAPTION "Drukuj"
+FONT 8, "Helv"
+BEGIN
+	LTEXT "&Drukarka:", 1088, 6, 6, 40, 9, WS_CHILD | WS_VISIBLE | WS_GROUP
+	LTEXT "", 1089, 60, 6, 150, 9
+	GROUPBOX "Drukuj", 1072, 6, 30, 160, 65, WS_CHILD | WS_VISIBLE | WS_TABSTOP
+	RADIOBUTTON "&Wszystko", 1056, 16, 45, 60, 12, WS_CHILD | WS_VISIBLE | WS_TABSTOP
+	RADIOBUTTON "W&ybór", 1057, 16, 60, 60, 12, WS_CHILD | WS_VISIBLE | WS_TABSTOP
+	RADIOBUTTON "&Strony", 1058, 16, 75, 60, 12, WS_CHILD | WS_VISIBLE | WS_TABSTOP
+	CONTROL "Drukuj", 1, "BUTTON", BS_DEFPUSHBUTTON | WS_CHILD | WS_VISIBLE | WS_GROUP | WS_TABSTOP, 206, 6, 56, 14
+	CONTROL "Anuluj", 2, "BUTTON", BS_PUSHBUTTON | WS_CHILD | WS_VISIBLE | WS_GROUP | WS_TABSTOP, 206, 24, 56, 14
+	CONTROL "&Ustawienia", 1024, "BUTTON", BS_PUSHBUTTON | WS_CHILD | WS_VISIBLE | WS_GROUP | WS_TABSTOP, 206, 46, 56, 14
+	LTEXT "&Od:", 1090, 60, 78, 30, 9, WS_CHILD | WS_VISIBLE | WS_GROUP
+	LTEXT "&Do:", 1091, 120, 78, 30, 9, WS_CHILD | WS_VISIBLE | WS_GROUP
+	LTEXT "JakoϾ &wydruku:", 1092, 6, 100, 76, 9, WS_CHILD | WS_VISIBLE | WS_GROUP
+	CONTROL "", 1136, "COMBOBOX", CBS_DROPDOWNLIST | CBS_OWNERDRAWFIXED | CBS_AUTOHSCROLL | CBS_SORT | CBS_HASSTRINGS | WS_BORDER | WS_VSCROLL | WS_TABSTOP, 71, 98, 92, 68
+	CONTROL "Drukuj do Pli&ku", 1040, "BUTTON", BS_AUTOCHECKBOX | WS_CHILD | WS_VISIBLE | WS_GROUP | WS_TABSTOP, 14, 115, 95, 12
+	CONTROL "Sortuj kopie", 1041, "BUTTON", BS_AUTOCHECKBOX | WS_CHILD | WS_VISIBLE | WS_GROUP | WS_TABSTOP, 182, 102, 59, 12
+END
+//    PUSHBUTTON      "Anuluj",IDCANCEL,218,23,40,14,WS_GROUP
+PRINT_SETUP DIALOG 36, 24, 264, 134
+STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
+CAPTION "Print Setup"
+FONT 8, "Helv"
+BEGIN
+	GROUPBOX "Drukarka", 1072, 6, 10, 180, 65, WS_CHILD | WS_VISIBLE | WS_TABSTOP
+	RADIOBUTTON "&Drukarka domyœlna", 1056, 16, 20, 80, 12, WS_CHILD | WS_VISIBLE | WS_TABSTOP
+	LTEXT "[none]", 1088, 35, 35, 120, 9
+	RADIOBUTTON "&Inna drukarka", 1057, 16, 50, 80, 12, WS_CHILD | WS_VISIBLE | WS_TABSTOP
+	CONTROL "", 1136, "COMBOBOX", CBS_DROPDOWNLIST | CBS_OWNERDRAWFIXED | CBS_AUTOHSCROLL | CBS_SORT | CBS_HASSTRINGS | WS_BORDER | WS_VSCROLL | WS_TABSTOP, 35, 65, 149, 68
+	CONTROL "Ok", 1, "BUTTON", BS_DEFPUSHBUTTON | WS_GROUP | WS_TABSTOP, 206, 6, 56, 14
+	CONTROL "Anuluj", 2, "BUTTON", BS_PUSHBUTTON | WS_CHILD | WS_VISIBLE | WS_GROUP | WS_TABSTOP, 206, 24, 56, 14
+	CONTROL "&Opcje", 1024, "BUTTON", BS_PUSHBUTTON | WS_CHILD | WS_VISIBLE | WS_GROUP | WS_TABSTOP, 206, 46, 56, 14
+	GROUPBOX "Orientacja", 1073, 6, 85, 100, 50, WS_CHILD | WS_VISIBLE | WS_TABSTOP
+	RADIOBUTTON "W p&ionie", 1058, 50, 100, 40, 12, WS_CHILD | WS_VISIBLE | WS_TABSTOP
+	RADIOBUTTON "W po&ziomie", 1059, 50, 115, 40, 12, WS_CHILD | WS_VISIBLE | WS_TABSTOP
+	ICON "LANDSCAP", 1097, 10, 95, 32, 32
+	ICON "PORTRAIT", 1098, 10, 95, 32, 32
+	GROUPBOX "Papier", 1074, 120, 85, 180, 50, WS_CHILD | WS_VISIBLE | WS_TABSTOP
+	LTEXT "&WielkoϾ", 1089, 130, 95, 30, 9, WS_CHILD | WS_VISIBLE | WS_GROUP
+	LTEXT "&ród³o", 1090, 130, 110, 30, 9, WS_CHILD | WS_VISIBLE | WS_GROUP
+	CONTROL "", 1137, "COMBOBOX", CBS_DROPDOWNLIST | CBS_OWNERDRAWFIXED | CBS_AUTOHSCROLL | CBS_SORT | CBS_HASSTRINGS | WS_BORDER | WS_VSCROLL | WS_TABSTOP, 155, 95, 92, 68
+	CONTROL "", 1138, "COMBOBOX", CBS_DROPDOWNLIST | CBS_OWNERDRAWFIXED | CBS_AUTOHSCROLL | CBS_SORT | CBS_HASSTRINGS | WS_BORDER | WS_VSCROLL | WS_TABSTOP, 155, 110, 92, 68
+END
+// CONTROL "" ,710,"STATIC",WS_BORDER|SS_SIMPLE|WS_TABSTOP|WS_GROUP, 152,4,118,116
+CHOOSE_FONT DIALOG 13, 54, 264, 147
+STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
+CAPTION "Font"
+FONT 8, "Helv"
+BEGIN
+	LTEXT "&Czcionka:", 1088, 6,3,40,9, WS_CHILD | WS_VISIBLE | WS_GROUP
+	CONTROL "", 1136, "COMBOBOX", CBS_OWNERDRAWFIXED | CBS_HASSTRINGS | CBS_DISABLENOSCROLL |
+CBS_AUTOHSCROLL | CBS_SORT | WS_VSCROLL | WS_TABSTOP | CBS_SIMPLE, 6,13,94,54
+	LTEXT "St&yl:", 1089, 108,3,44,9, WS_CHILD | WS_VISIBLE | WS_GROUP
+	CONTROL "", 1137, "COMBOBOX", CBS_OWNERDRAWFIXED | CBS_HASSTRINGS | CBS_DISABLENOSCROLL |
+WS_VSCROLL | WS_TABSTOP | CBS_SIMPLE, 108,13,64,54
+	LTEXT "&Rozmiar:", 1090, 179,3,30,9, WS_CHILD | WS_VISIBLE | WS_GROUP
+	CONTROL "", 1138, "COMBOBOX", CBS_OWNERDRAWFIXED | CBS_HASSTRINGS | CBS_DISABLENOSCROLL |
+WS_VSCROLL | WS_TABSTOP | CBS_SIMPLE | CBS_SORT, 179,13,32,54
+	CONTROL "OK", IDOK, "BUTTON", WS_GROUP, 218,6,40,14
+	CONTROL "Anuluj", IDCANCEL, "BUTTON", BS_PUSHBUTTON | WS_CHILD | WS_VISIBLE | WS_GROUP | WS_TABSTOP, 218,23,40,14
+	CONTROL "&Zastosuj", 1026, "BUTTON", WS_GROUP, 218,40,40,14
+	CONTROL "&Pomoc", 1038, "BUTTON", BS_PUSHBUTTON | WS_CHILD | WS_VISIBLE | WS_GROUP | WS_TABSTOP, 218,57,40,14
+	CONTROL "Efekty specialne", 1072, "BUTTON", BS_GROUPBOX | WS_CHILD | WS_VISIBLE | WS_GROUP | WS_TABSTOP, 6,72,84,34
+	CONTROL "Prz&ekreœlona", 1040, "BUTTON", BS_AUTOCHECKBOX | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 10, 82, 58, 10
+	CONTROL "P&odkreœlona", 1041, "BUTTON", BS_AUTOCHECKBOX | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 10,94,50,10
+	LTEXT "&Kolor:", 1091, 6,110,30,9, WS_CHILD | WS_VISIBLE | WS_GROUP
+	CONTROL "", 1139, "COMBOBOX", CBS_DROPDOWNLIST | CBS_OWNERDRAWFIXED | CBS_HASSTRINGS |
+CBS_AUTOHSCROLL | WS_BORDER | WS_VSCROLL | WS_TABSTOP, 6,120,84,100
+	CONTROL "Przyk³ad", 1073, "BUTTON", BS_GROUPBOX | WS_CHILD | WS_VISIBLE | WS_GROUP | WS_TABSTOP, 98,72,160,49
+	CONTROL "AaBbYyZz\xB3", 1093, "STATIC", SS_NOPREFIX | WS_VISIBLE, 104,81,149,37
+END
+// PUSHBUTTON "&Replace", 1024, 174, 21, 50, 14, WS_GROUP | WS_TABSTOP
+// PUSHBUTTON "Replace &All", 1025, 174, 38, 50, 14, WS_GROUP | WS_TABSTOP
+// PUSHBUTTON "Cancel", 2, 174, 55, 50, 14, WS_GROUP | WS_TABSTOP
+// PUSHBUTTON "&Help", 1038, 174, 75, 50, 14, WS_GROUP | WS_TABSTOP
+//}
+FIND_TEXT DIALOG 34, 24, 251, 62
+STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
+CAPTION "ZnajdŸ"
+FONT 8, "Helv"
+BEGIN
+	LTEXT "&ZnajdŸ:", -1, 4, 8, 42, 8, WS_CHILD | WS_VISIBLE | WS_GROUP
+	EDITTEXT 1152, 46, 7, 134, 12, ES_AUTOHSCROLL | WS_BORDER | WS_GROUP | WS_TABSTOP
+	CONTROL "Uwzglêdnij tylko ca³e wyrazy", 1040, "BUTTON", BS_AUTOCHECKBOX | WS_CHILD | WS_VISIBLE | WS_GROUP | WS_TABSTOP, 4, 26, 107, 12
+	CONTROL "&Uwzglêdniaj wielkoœæ liter", 1041, "BUTTON", BS_AUTOCHECKBOX | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 4, 42, 107, 12
+	GROUPBOX "Kierunek", 1072, 113, 26, 68, 28
+	CONTROL "W &g\xF3r\xEA", 1056, "BUTTON", BS_AUTORADIOBUTTON | WS_CHILD | WS_VISIBLE | WS_GROUP | WS_TABSTOP, 117, 38, 20, 12
+	CONTROL "W &d\xF3l", 1057, "BUTTON", BS_AUTORADIOBUTTON | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 144, 38, 30, 12
+	CONTROL "&ZnajdŸ nastêpny", 1, "BUTTON", BS_DEFPUSHBUTTON | WS_CHILD | WS_VISIBLE | WS_GROUP | WS_TABSTOP, 187, 5, 61, 14
+	CONTROL "Anuluj", 2, "BUTTON", BS_PUSHBUTTON | WS_CHILD | WS_VISIBLE | WS_GROUP | WS_TABSTOP, 187, 23, 61, 14
+	CONTROL "&Pomoc", 1038, "BUTTON", BS_PUSHBUTTON | WS_CHILD | WS_VISIBLE | WS_GROUP | WS_TABSTOP, 187, 45, 61, 14
+END
+REPLACE_TEXT DIALOG 36, 24, 245, 94
+STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
+CAPTION "Zamieñ"
+FONT 8, "Helv"
+BEGIN
+	LTEXT "&ZnajdŸ:", -1, 4, 9, 48, 8, WS_CHILD | WS_VISIBLE | WS_GROUP
+	EDITTEXT 1152, 54, 7, 114, 12, ES_AUTOHSCROLL | WS_BORDER | WS_GROUP | WS_TABSTOP
+	LTEXT "Zanieñ &na:", -1, 4, 26, 48, 8, WS_CHILD | WS_VISIBLE | WS_GROUP
+	EDITTEXT 1153, 54, 24, 114, 12, ES_AUTOHSCROLL | WS_BORDER | WS_GROUP | WS_TABSTOP
+	CONTROL "Uwzglêdnij &tylko ca³e wyrazy", 1040, "BUTTON", BS_AUTOCHECKBOX | WS_CHILD | WS_VISIBLE | WS_GROUP | WS_TABSTOP, 5, 46, 104, 12
+	CONTROL "&Uwzglêdnij wielkoœæ liter", 1041, "BUTTON", BS_AUTOCHECKBOX | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 5, 62, 96, 12
+	CONTROL "ZnajdŸ nastêpny", 1, "BUTTON", BS_DEFPUSHBUTTON | WS_CHILD | WS_VISIBLE | WS_GROUP | WS_TABSTOP, 174, 4, 67, 14
+	CONTROL "&Zamieñ", 1024, "BUTTON", BS_PUSHBUTTON | WS_CHILD | WS_VISIBLE | WS_GROUP | WS_TABSTOP, 174, 21, 68, 14
+	CONTROL "Zamieñ &wszystkie", 1025, "BUTTON", BS_PUSHBUTTON | WS_CHILD | WS_VISIBLE | WS_GROUP | WS_TABSTOP, 174, 38, 68, 14
+	CONTROL "Anuluj", 2, "BUTTON", BS_PUSHBUTTON | WS_CHILD | WS_VISIBLE | WS_GROUP | WS_TABSTOP, 174, 56, 68, 14
+	CONTROL "&Pomoc", 1038, "BUTTON", BS_PUSHBUTTON | WS_CHILD | WS_VISIBLE | WS_GROUP | WS_TABSTOP, 174, 75, 68, 14
+END
+   
+CHOOSE_COLOR DIALOG LOADONCALL MOVEABLE DISCARDABLE 36, 24, 300, 200
+STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
+CAPTION "Color"
+FONT 8, "Helv"
+{
+ LTEXT "&Podstawowe kolory:",   1088, 4,    4,  140, 10
+ LTEXT "Dowolne &kolory:",  1089, 4,   106, 140, 10
+ LTEXT "Kolor |  Sol&id",  1090, 150, 151,  48, 10
+ LTEXT   "&Czerwony:", 726 /*1094*/,249,126,24,10
+ EDITTEXT 706, 275,124,18,12, WS_BORDER | WS_GROUP | WS_TABSTOP
+ LTEXT   "&Zielony:",727/*1095*/,249,140,24,10
+ EDITTEXT 707, 275,138,18,12, WS_BORDER | WS_GROUP | WS_TABSTOP
+ LTEXT   "&Niebieski:",728 /*1096*/,249,154,24,10
+ EDITTEXT 708, 275,152,18,12, WS_BORDER | WS_GROUP | WS_TABSTOP
+ LTEXT  "&Hue:" ,723 /*1091*/,202,126,22,10
+ EDITTEXT 703, 226,124,18,12, WS_BORDER | WS_GROUP | WS_TABSTOP
+ LTEXT  "&Sat:" ,724 /*1092*/,202,140,22,10
+ EDITTEXT 704, 226,138,18,12, WS_BORDER | WS_GROUP | WS_TABSTOP
+ LTEXT  "&Lum:" ,725 /*1093*/,202,154,22,10
+ EDITTEXT 705, 226,152,18,12, WS_BORDER | WS_GROUP | WS_TABSTOP
+ CONTROL "" ,720,"STATIC",SS_SIMPLE|WS_TABSTOP|WS_GROUP,4,14,140,86
+ CONTROL "" ,721,"STATIC",SS_SIMPLE|WS_TABSTOP|WS_GROUP,4,116,140,28
+ CONTROL "" ,710,"STATIC",WS_BORDER|SS_SIMPLE|WS_TABSTOP|WS_GROUP, 152,4,118,116
+ CONTROL "" ,702,"STATIC",SS_SIMPLE|WS_TABSTOP|WS_GROUP, 278,4,8,116
+ CONTROL "" ,709,"STATIC",SS_SIMPLE|WS_TABSTOP|WS_GROUP, 152,124,40,26
+ DEFPUSHBUTTON "Ok",  1,  4, 166, 44, 14, BS_DEFPUSHBUTTON | WS_GROUP | WS_TABSTOP
+ PUSHBUTTON "Anuluj", 2, 52, 166, 44, 14, WS_GROUP | WS_TABSTOP
+ PUSHBUTTON "Pomoc", 1038,100,166, 44, 14
+ PUSHBUTTON "&Dodaj do dowolnych",    712/*1024*/, 152, 166, 142, 14, WS_GROUP | WS_TABSTOP
+ PUSHBUTTON "Z&definiuj Kolor >>", 719/*1025*/,   4, 150, 142, 14, WS_GROUP | WS_TABSTOP
+ PUSHBUTTON  "&i",713,300,200,4,14   /* just a dummy:  'i' is  like  &i  in "sol&id"  */
+}
diff --git a/scheduler/process.c b/scheduler/process.c
index c474d54bd61..ab72caf3fda 100644
--- a/scheduler/process.c
+++ b/scheduler/process.c
@@ -166,13 +166,15 @@ K32OBJ *PROCESS_GetObjPtr( HANDLE32 handle, K32OBJ_TYPE type )
     K32OBJ *ptr = NULL;
     if (!pCurrentProcess) return PROCESS_GetBootObjPtr( handle, type );
     EnterCriticalSection( &pCurrentProcess->crit_section );
+
     if ((handle > 0) && (handle <= pCurrentProcess->handle_table->count))
-    {
         ptr = pCurrentProcess->handle_table->entries[handle - 1].ptr;
-        if (ptr && ((type == K32OBJ_UNKNOWN) || (ptr->type == type)))
-            K32OBJ_IncCount( ptr );
-        else ptr = NULL;
-    }
+    else if (handle == 0x7fffffff) ptr = &pCurrentProcess->header;
+
+    if (ptr && ((type == K32OBJ_UNKNOWN) || (ptr->type == type)))
+        K32OBJ_IncCount( ptr );
+    else ptr = NULL;
+
     LeaveCriticalSection( &pCurrentProcess->crit_section );
     if (!ptr) SetLastError( ERROR_INVALID_HANDLE );
     return ptr;
@@ -540,6 +542,7 @@ BOOL32 SetEnvironmentVariable32W( LPCWSTR name, LPCWSTR value )
     return ret;
 }
 
+
 /***********************************************************************
  *           ExpandEnvironmentVariablesA   (KERNEL32.103)
  */
diff --git a/scheduler/thread.c b/scheduler/thread.c
index 0b48efe538e..16f602c3502 100644
--- a/scheduler/thread.c
+++ b/scheduler/thread.c
@@ -40,6 +40,7 @@ static THDB *THREAD_GetPtr( HANDLE32 handle )
 THDB *THREAD_Create( PDB32 *pdb, DWORD stack_size,
                      LPTHREAD_START_ROUTINE start_addr )
 {
+    DWORD old_prot;
     THDB *thdb = HeapAlloc( SystemHeap, HEAP_ZERO_MEMORY, sizeof(THDB) );
     if (!thdb) return NULL;
     thdb->header.type     = K32OBJ_THREAD;
@@ -59,8 +60,9 @@ THDB *THREAD_Create( PDB32 *pdb, DWORD stack_size,
     thdb->stack_base = VirtualAlloc( NULL, stack_size, MEM_COMMIT,
                                      PAGE_EXECUTE_READWRITE );
     if (!thdb->stack_base) goto error;
-    /* Un-commit the first page (FIXME: should use PAGE_GUARD instead) */
-    VirtualFree( thdb->stack_base, 1, MEM_DECOMMIT );
+    /* Set a guard page at the bottom of the stack */
+    VirtualProtect( thdb->stack_base, 1, PAGE_EXECUTE_READWRITE | PAGE_GUARD,
+                    &old_prot );
     thdb->teb.stack_top   = (char *)thdb->stack_base + stack_size;
     thdb->teb.stack_low   = thdb->teb.stack_top;
     thdb->exit_stack      = thdb->teb.stack_top;
diff --git a/tools/Makefile.in b/tools/Makefile.in
index 0116c907c9b..16f7a1e1c89 100644
--- a/tools/Makefile.in
+++ b/tools/Makefile.in
@@ -1,4 +1,4 @@
-DEFS      = -D__WINE__ -DNO_TRANSITION_TYPES
+DEFS      = -D__WINE__
 TOPSRCDIR = @top_srcdir@
 TOPOBJDIR = ..
 SRCDIR    = @srcdir@
diff --git a/tools/build.c b/tools/build.c
index e88e24e8949..6d9008cdd30 100644
--- a/tools/build.c
+++ b/tools/build.c
@@ -5,8 +5,6 @@
  * Copyright 1997 Eric Youngdale
  */
 
-#ifndef WINELIB
-
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
@@ -15,7 +13,6 @@
 
 #include "windows.h"
 #include "winnt.h"
-#include "winerror.h"  /* for ERROR_CALL_NOT_IMPLEMENTED */
 #include "module.h"
 #include "neexe.h"
 #include "selectors.h"
@@ -1016,15 +1013,12 @@ static int BuildSpec32File( char * specfile, FILE *outfile )
             fprintf( outfile, "/* %s.%d (%s) */\n", DLLName, i, odp->name);
 #ifdef USE_STABS
 	    fprintf( outfile, ".stabs \"%s_%d:F1\",36,0,%d,%s_%d\n", 
-		     DLLName, i,
-		     odp->lineno, DLLName, i);
+		     DLLName, i, odp->lineno, DLLName, i);
 #endif
-
             fprintf( outfile, "%s_%d:\n", DLLName, i );
 #ifdef USE_STABS
 	    fprintf( outfile, ".stabn 68,0,%d,0\n", odp->lineno);
 #endif
-
             fprintf( outfile, "\tpushl %%ebp\n" );
             fprintf( outfile, "\tpushl $" PREFIX "%s\n",odp->u.func.link_name);
             fprintf( outfile, "\tcall " PREFIX "CallFrom32_%s_%d\n",
@@ -1036,17 +1030,25 @@ static int BuildSpec32File( char * specfile, FILE *outfile )
 
         case TYPE_RETURN:
             fprintf( outfile, "/* %s.%d (%s) */\n", DLLName, i, odp->name);
+#ifdef USE_STABS
+	    fprintf( outfile, ".stabs \"%s_%d:F1\",36,0,%d,%s_%d\n", 
+		     DLLName, i, odp->lineno, DLLName, i);
+#endif
             fprintf( outfile, "%s_%d:\n", DLLName, i );
-            fprintf( outfile, "\tmovl $%d,%%eax\n",ERROR_CALL_NOT_IMPLEMENTED);
-            fprintf( outfile, "\tmovl %%eax," PREFIX "WIN32_LastError\n" );
+#ifdef USE_STABS
+	    fprintf( outfile, ".stabn 68,0,%d,0\n", odp->lineno);
+#endif
             fprintf( outfile, "\tmovl $%d,%%eax\n", odp->u.ret.ret_value );
             if (odp->u.ret.arg_size)
             {
                 fprintf( outfile, "\tret $%d\n", odp->u.ret.arg_size );
+            }
+            else
+            {
+                fprintf( outfile, "\tret\n" );
                 fprintf( outfile, "\tnop\n" );
                 fprintf( outfile, "\tnop\n" );
             }
-            else fprintf( outfile, "\tret\n" );
             break;
 
         case TYPE_BYTE:
@@ -1807,9 +1809,7 @@ static void BuildCallFrom16Func( FILE *outfile, char *profile )
  * Prototypes for the CallTo16 functions:
  *   extern WORD CallTo16_word_xxx( FARPROC16 func, args... );
  *   extern LONG CallTo16_long_xxx( FARPROC16 func, args... );
- *   extern void CallTo16_regs_( FARPROC16 func, WORD ds, WORD es, WORD bp,
- *                               WORD ax, WORD bx, WORD cx, WORD dx,
- *                               WORD si, WORD di );
+ *   extern void CallTo16_regs_( const CONTEXT *context );
  */
 static void BuildCallTo16Func( FILE *outfile, char *profile )
 {
@@ -1866,7 +1866,7 @@ static void BuildCallTo16Func( FILE *outfile, char *profile )
     {
         /* Push the address of the first argument */
         fprintf( outfile, "\tleal 12(%%ebx),%%eax\n" );
-        fprintf( outfile, "\tpushl $%d\n", reg_func ? 8 : strlen(args) );
+        fprintf( outfile, "\tpushl $%d\n", reg_func ? -1 : strlen(args) );
         fprintf( outfile, "\tpushl %%eax\n" );
         fprintf( outfile, "\tcall " PREFIX "RELAY_DebugCallTo16\n" );
         fprintf( outfile, "\tpopl %%eax\n" );
@@ -1886,14 +1886,15 @@ static void BuildCallTo16Func( FILE *outfile, char *profile )
     if (reg_func)
     {
         /* Get the registers. ebx is handled later on. */
-        fprintf( outfile, "\tpushw 20(%%ebx)\n" );
-        fprintf( outfile, "\tpopw %%es\n" );
-        fprintf( outfile, "\tmovl 24(%%ebx),%%ebp\n" );
-        fprintf( outfile, "\tmovl 28(%%ebx),%%eax\n" );
-        fprintf( outfile, "\tmovl 36(%%ebx),%%ecx\n" );
-        fprintf( outfile, "\tmovl 40(%%ebx),%%edx\n" );
-        fprintf( outfile, "\tmovl 44(%%ebx),%%esi\n" );
-        fprintf( outfile, "\tmovl 48(%%ebx),%%edi\n" );
+        fprintf( outfile, "\tmovl 12(%%ebx),%%ebx\n" );
+        fprintf( outfile, "\tmovl %d(%%ebx),%%eax\n", CONTEXTOFFSET(SegEs) );
+        fprintf( outfile, "\tmovw %%ax,%%es\n" );
+        fprintf( outfile, "\tmovl %d(%%ebx),%%ebp\n", CONTEXTOFFSET(Ebp) );
+        fprintf( outfile, "\tmovl %d(%%ebx),%%eax\n", CONTEXTOFFSET(Eax) );
+        fprintf( outfile, "\tmovl %d(%%ebx),%%ecx\n", CONTEXTOFFSET(Ecx) );
+        fprintf( outfile, "\tmovl %d(%%ebx),%%edx\n", CONTEXTOFFSET(Edx) );
+        fprintf( outfile, "\tmovl %d(%%ebx),%%esi\n", CONTEXTOFFSET(Esi) );
+        fprintf( outfile, "\tmovl %d(%%ebx),%%edi\n", CONTEXTOFFSET(Edi) );
     }
     else  /* not a register function */
     {
@@ -1923,21 +1924,26 @@ static void BuildCallTo16Func( FILE *outfile, char *profile )
     fprintf( outfile, "\tpushl " PREFIX "CALLTO16_RetAddr_%s\n",
              short_ret ? "word" : "long" );
 
-    /* Push the called routine address */
+    if (reg_func)
+    {
+        /* Push the called routine address */
 
-    fprintf( outfile, "\tpushl 12(%%ebx)\n" );
+        fprintf( outfile, "\tpushw %d(%%ebx)\n", CONTEXTOFFSET(SegCs) );
+        fprintf( outfile, "\tpushw %d(%%ebx)\n", CONTEXTOFFSET(Eip) );
 
-    /* Get the 16-bit ds */
+        /* Get the 16-bit ds */
 
-    if (reg_func)
-    {
-        fprintf( outfile, "\tpushw 16(%%ebx)\n" );
+        fprintf( outfile, "\tpushw %d(%%ebx)\n", CONTEXTOFFSET(SegDs) );
         /* Get ebx from the 32-bit stack */
-        fprintf( outfile, "\tmovl 32(%%ebx),%%ebx\n" );
+        fprintf( outfile, "\tmovl %d(%%ebx),%%ebx\n", CONTEXTOFFSET(Ebx) );
         fprintf( outfile, "\tpopw %%ds\n" );
     }
     else
     {
+        /* Push the called routine address */
+
+        fprintf( outfile, "\tpushl 12(%%ebx)\n" );
+
         /* Get previous ds from the 16-bit stack and */
         /* set ax equal to ds for window procedures. */
         fprintf( outfile, "\tmovw -10(%%ebp),%%ax\n" );
@@ -2593,5 +2599,3 @@ int main(int argc, char **argv)
     }
     return 0;
 }
-
-#endif  /* WINELIB */
diff --git a/tools/make_os2.sh b/tools/make_os2.sh
index 7564c5e02e3..10519705d93 100644
--- a/tools/make_os2.sh
+++ b/tools/make_os2.sh
@@ -2,9 +2,10 @@
 # GCCLOAD not needed, but recommended...
 #GCCLOAD=5
 CC=gcc
+CFLAGS="-O2 -Zmtd -D__ST_MT_ERRNO__"
 YACC="bison -y"
 LEX="flex -olex.yy.c"
 RANLIB="ar -s"
 PROGEXT=".exe"
-export CC YACC LEX RANLIB PROGEXT
+export CC CFLAGS YACC LEX RANLIB PROGEXT
 ./configure --x-includes=$X11ROOT/XFree86/include -x-libraries=$X11ROOT/XFree86/lib
diff --git a/tools/wineconf b/tools/wineconf
index 9610366e13b..63b2d4a47ff 100755
--- a/tools/wineconf
+++ b/tools/wineconf
@@ -1,4 +1,4 @@
-#!/usr/bin/perl
+#!/usr/bin/perl -w
 
 # This program generates wine.conf files on STDOUT.
 # (C) 1996 Stephen Simmons
@@ -74,11 +74,13 @@ sub ReadFSTAB {
 	next if /^\s*\#/;
 	next if /^\s*$/;
 	($device, $mntpoint, $type, @rest) = split(' ', $_);
-	if ($type eq "msdos") {
-	    push(@FatDrives, [$device, $mntpoint]);
-	}
-	elsif ($type eq "iso9660") {
-	    push(@CdromDrives, [$device, $mntpoint]);
+	if ($device !~ m"^/dev/fd") {
+	    if ($type eq "msdos" || $type eq "vfat") {
+		push(@FatDrives, [$device, $mntpoint]);
+	    }
+	    elsif ($type eq "iso9660") {
+		push(@CdromDrives, [$device, $mntpoint]);
+	    }
 	}
     }
     if (!@FatDrives) {
@@ -251,7 +253,7 @@ sub ReadAutoexecBat {
     }
     else {
 	# Tested 1.4
-	warn "WARNING: C:\AUTOEXEC.BAT was not found.\n";
+	warn "WARNING: C:\\AUTOEXEC.BAT was not found.\n";
     }
 
     if ($DOSenv{"path"}) {
diff --git a/win32/Makefile.in b/win32/Makefile.in
index dbdae2af8af..0a7891a5a8f 100644
--- a/win32/Makefile.in
+++ b/win32/Makefile.in
@@ -16,7 +16,6 @@ C_SRCS = \
 	file.c \
 	init.c \
 	k32obj.c \
-	memory.c \
 	newfns.c \
 	process.c \
 	security.c \
diff --git a/win32/advapi.c b/win32/advapi.c
index 31a92d26285..2fe54f2bafb 100644
--- a/win32/advapi.c
+++ b/win32/advapi.c
@@ -8,7 +8,7 @@
 #include <unistd.h>
 #include "windows.h"
 #include "winerror.h"
-#include "advapi32.h"
+#include "shell.h"
 #include "stddebug.h"
 #include "debug.h"
 
diff --git a/win32/code_page.c b/win32/code_page.c
index 60673db877c..951874ce2e0 100644
--- a/win32/code_page.c
+++ b/win32/code_page.c
@@ -69,14 +69,14 @@ UINT32 GetOEMCP(void)
 /***********************************************************************
  *              MultiByteToWideChar                (KERNEL32.392)
  */
-int MultiByteToWideChar(UINT page, DWORD flags, char *src, int srclen,
+int MultiByteToWideChar(UINT32 page, DWORD flags, char *src, int srclen,
                         WCHAR *dst, int dstlen)
 {
     return (srclen==-1) ? strlen(src) * 2: srclen*2; 
 }
 
-int WideCharToMultiByte(UINT page, DWORD flags, WCHAR *src, int srclen,
-						char *dst, int dstlen, char* defchar, BOOL *used)
+int WideCharToMultiByte(UINT32 page, DWORD flags, WCHAR *src, int srclen,
+                        char *dst, int dstlen, char* defchar, BOOL32 *used)
 {
 	int count = 0;
 	int dont_copy= (dstlen==0);
diff --git a/win32/console.c b/win32/console.c
index 558b433ad87..63e5fa48365 100644
--- a/win32/console.c
+++ b/win32/console.c
@@ -26,7 +26,7 @@ static CONSOLE_SCREEN_BUFFER_INFO dummyinfo =
 /***********************************************************************
  *           SetConsoleCtrlHandler               (KERNEL32.459)
  */
-BOOL SetConsoleCtrlHandler(HANDLER_ROUTINE * func,  BOOL a)
+BOOL32 SetConsoleCtrlHandler(HANDLER_ROUTINE * func,  BOOL32 a)
 {
 	return 0;
 }
diff --git a/win32/cursoricon32.c b/win32/cursoricon32.c
index 40a3251e4d6..0a22a3882f3 100644
--- a/win32/cursoricon32.c
+++ b/win32/cursoricon32.c
@@ -39,15 +39,16 @@
 #include "xmalloc.h"
 
 /* This dictionary could might eventually become a macro for better reuse */
-struct MAP_DWORD_DWORD{
-	DWORD key;
-	DWORD value;
+struct MAP_DWORD_DWORD
+{
+    DWORD key;
+    HANDLE32 value;
 };
 
 struct MAP_DWORD_DWORD *CURSORICON_map;
 int CURSORICON_count;
 
-BOOL CURSORICON_lookup(DWORD key,DWORD *value)
+BOOL32 CURSORICON_lookup(DWORD key,HANDLE32 *value)
 {
 	int i;
 	for(i=0;i<CURSORICON_count;i++)
@@ -233,9 +234,9 @@ static CURSORDIRENTRY32 *CURSORICON32_FindBestCursor( CURSORICONDIR32 *dir,
  * Load the icon/cursor directory for a given resource name and find the
  * best matching entry.
  */
-static BOOL CURSORICON32_LoadDirEntry(HINSTANCE32 hInstance, LPCWSTR name,
+static BOOL32 CURSORICON32_LoadDirEntry(HINSTANCE32 hInstance, LPCWSTR name,
                                     int width, int height, int colors,
-                                    BOOL fCursor, CURSORICONDIRENTRY32 *dirEntry)
+                                    BOOL32 fCursor, CURSORICONDIRENTRY32 *dirEntry)
 {
     HANDLE32 hRsrc;
     HANDLE32 hMem;
@@ -391,8 +392,8 @@ static HGLOBAL32 CURSORICON32_LoadHandler( HANDLE32 handle,
 
     /* Transfer the bitmap bits to the CURSORICONINFO structure */
 
-    GetBitmapBits( hAndBits, sizeAnd, (char *)(info + 1) );
-    GetBitmapBits( hXorBits, sizeXor, (char *)(info + 1) + sizeAnd );
+    GetBitmapBits32( hAndBits, sizeAnd, (char *)(info + 1) );
+    GetBitmapBits32( hXorBits, sizeXor, (char *)(info + 1) + sizeAnd );
     DeleteObject32( hXorBits );
     DeleteObject32( hAndBits );
     GlobalUnlock16( hRes );
@@ -406,7 +407,7 @@ static HGLOBAL32 CURSORICON32_LoadHandler( HANDLE32 handle,
  */
 static HGLOBAL32 CURSORICON32_Load( HINSTANCE32 hInstance, LPCWSTR name,
                                     int width, int height, int colors,
-                                    BOOL fCursor )
+                                    BOOL32 fCursor )
 {
     HANDLE32 handle;
     HANDLE32 hRet;
diff --git a/win32/error.c b/win32/error.c
index b32eca47433..62c55bfbcb6 100644
--- a/win32/error.c
+++ b/win32/error.c
@@ -19,7 +19,7 @@
  * Windows 95. :-)
  */
 typedef struct {
-    int         errno;
+    int         err;
     DWORD       win32err;
 } ERRNO_XLAT_TABLE;
 
@@ -97,9 +97,9 @@ DWORD ErrnoToLastError(int errno_num)
     DWORD rc = ERROR_UNKNOWN;
     int i = 0;
 
-    while(errno_xlat_table[i].errno != -1)
+    while(errno_xlat_table[i].err != -1)
     {
-        if(errno_xlat_table[i].errno == errno_num)
+        if(errno_xlat_table[i].err == errno_num)
         {
             rc = errno_xlat_table[i].win32err;
             break;
@@ -115,11 +115,11 @@ int LastErrorToErrno(DWORD lasterror)
     int rc = 0; /* no error */
     int i = 0;
 
-    while(errno_xlat_table[i].errno != -1)
+    while(errno_xlat_table[i].err != -1)
     {
         if(errno_xlat_table[i].win32err == lasterror )
         {
-            rc = errno_xlat_table[i].errno;
+            rc = errno_xlat_table[i].err;
             break;
         }
         i++;
diff --git a/win32/file.c b/win32/file.c
index c059531bd94..98b4ffec30c 100644
--- a/win32/file.c
+++ b/win32/file.c
@@ -28,106 +28,6 @@
 
 static int TranslateCreationFlags(DWORD create_flags);
 static int TranslateAccessFlags(DWORD access_flags);
-int TranslateProtectionFlags(DWORD);
-#ifndef MAP_ANON
-#define MAP_ANON 0
-#endif
-
-typedef struct {
-    HFILE32		hfile;
-    int			prot;
-    unsigned long	size;
-} FILEMAP_OBJECT;
-
-/***********************************************************************
- *           OpenFileMappingA             (KERNEL32.397)
- * FIXME: stub
- *
- */
-HANDLE32 OpenFileMapping(DWORD access, BOOL inherit,const char *fname)
-{
-	return 0;
-}
-
-
-/***********************************************************************
- *           CreateFileMapping32A   (KERNEL32.46)
- */
-HANDLE32 CreateFileMapping32A(HANDLE32 h,LPSECURITY_ATTRIBUTES ats,
-  DWORD pot,  DWORD sh,  DWORD hlow,  LPCSTR lpName )
-{
-    FILEMAP_OBJECT *filemap_obj;
-
-    dprintf_win32(stddeb,"CreateFileMapping32A(%08x,%p,%ld,%ld,%ld,%s)\n",
-    	h,ats,pot,sh,hlow,lpName
-    );
-    if (sh) {
-        SetLastError(ErrnoToLastError(errno));
-        return INVALID_HANDLE_VALUE32;
-    }
-    filemap_obj=(FILEMAP_OBJECT *)HeapAlloc( SystemHeap, 0,
-                                             sizeof(FILEMAP_OBJECT) );
-    if(filemap_obj == NULL) {
-        SetLastError(ERROR_UNKNOWN);
-        return 0;
-    }
-    if (h==INVALID_HANDLE_VALUE32)
-    	h=_lcreat32(lpName,1);/*FIXME*/
-
-    filemap_obj->hfile = h;
-    filemap_obj->prot = TranslateProtectionFlags(pot);
-    filemap_obj->size = hlow;
-    return (HANDLE32)filemap_obj;;
-}
-
-/***********************************************************************
- *           CreateFileMapping32W   (KERNEL32.47)
- *
- */
-HANDLE32 CreateFileMapping32W(HANDLE32 h,LPSECURITY_ATTRIBUTES ats,
-  DWORD pot,  DWORD sh,  DWORD hlow,  LPCWSTR lpName)
-{
-    LPSTR aname = HEAP_strdupWtoA( GetProcessHeap(), 0, lpName );
-    HANDLE32 res = CreateFileMapping32A(h,ats,pot,sh,hlow,aname);
-    HeapFree( GetProcessHeap(), 0, aname );
-    return res;
-}
-
-
-/***********************************************************************
- *           MapViewOfFile                  (KERNEL32.385)
- */
-LPVOID MapViewOfFile(HANDLE32 handle, DWORD access, DWORD offhi,
-                      DWORD offlo, DWORD size)
-{
-    return MapViewOfFileEx(handle,access,offhi,offlo,size,0);
-}
-
-/***********************************************************************
- *           MapViewOfFileEx                  (KERNEL32.386)
- *
- */
-LPVOID MapViewOfFileEx(HANDLE32 handle, DWORD access, DWORD offhi,
-                      DWORD offlo, DWORD size, DWORD st)
-{
-    FILEMAP_OBJECT *fmap = (FILEMAP_OBJECT*)handle;
-
-    if (!size) size = fmap->size;
-    if (!size) size = 1;
-    return mmap ((caddr_t)st, size, fmap->prot, 
-                 MAP_ANON|MAP_PRIVATE, 
-		 FILE_GetUnixHandle(fmap->hfile),
-		 offlo);
-}
-
-/***********************************************************************
- *           UnmapViewOfFile                  (KERNEL32.385)
- */
-BOOL32 UnmapViewOfFile(LPVOID address) {
-    munmap(address,/*hmm*/1); /* FIXME: size? */
-    return TRUE;
-}
-
 
 /***********************************************************************
  *             WriteFile               (KERNEL32.578)
@@ -309,7 +209,7 @@ BOOL32 SetFileAttributes32A(LPCSTR lpFileName, DWORD attributes)
         buf.st_mode &= ~0222; /* octal!, clear write permission bits */
         attributes &= ~FILE_ATTRIBUTE_READONLY;
     }
-    attributes &= ~(FILE_ATTRIBUTE_HIDDEN|FILE_ATTRIBUTE_SYSTEM);
+    attributes &= ~(FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_HIDDEN|FILE_ATTRIBUTE_SYSTEM);
     if (attributes)
         fprintf(stdnimp,"SetFileAttributesA(%s):%lx attribute(s) not implemented.\n",lpFileName,attributes);
     if (-1==chmod(full_name.long_name,buf.st_mode))
diff --git a/win32/init.c b/win32/init.c
index 18e14ef9808..6372a413039 100644
--- a/win32/init.c
+++ b/win32/init.c
@@ -18,10 +18,6 @@
 #include "debug.h"
 #include "xmalloc.h"
   
-/* The global error value
- */
-int WIN32_LastError;
-
 /***********************************************************************
  *              GetModuleHandle         (KERNEL32.237)
  */
@@ -36,7 +32,7 @@ all calls to e.g. CreateWindowEx. */
 	TDB *pTask = (TDB *)GlobalLock16( GetCurrentTask() );
 	hModule = pTask->hInstance;
     } else
-	hModule = GetModuleHandle(module);
+	hModule = GetModuleHandle16(module);
     dprintf_win32(stddeb, "GetModuleHandleA: returning %d\n", hModule );
     return hModule;
 }
diff --git a/win32/k32obj.c b/win32/k32obj.c
index 93919c3e72b..bcb056518b8 100644
--- a/win32/k32obj.c
+++ b/win32/k32obj.c
@@ -5,6 +5,7 @@
  */
 
 #include <assert.h>
+#include "winerror.h"
 #include "handle32.h"
 #include "heap.h"
 #include "file.h"
@@ -13,28 +14,40 @@
 
 typedef void (*destroy_object)(K32OBJ *);
 
+extern void VIRTUAL_DestroyMapping( K32OBJ *obj );
+
 static const destroy_object K32OBJ_Destroy[K32OBJ_NBOBJECTS] =
 {
     NULL,
-    NULL,              /* K32OBJ_SEMAPHORE */
-    NULL,              /* K32OBJ_EVENT */
-    NULL,              /* K32OBJ_MUTEX */
-    NULL,              /* K32OBJ_CRITICAL_SECTION */
-    PROCESS_Destroy,   /* K32OBJ_PROCESS */
-    THREAD_Destroy,    /* K32OBJ_THREAD */
-    FILE_Destroy,      /* K32OBJ_FILE */
-    NULL,              /* K32OBJ_CHANGE */
-    NULL,              /* K32OBJ_CONSOLE */
-    NULL,              /* K32OBJ_SCREEN_BUFFER */
-    NULL,              /* K32OBJ_MEM_MAPPED_FILE */
-    NULL,              /* K32OBJ_SERIAL */
-    NULL,              /* K32OBJ_DEVICE_IOCTL */
-    NULL,              /* K32OBJ_PIPE */
-    NULL,              /* K32OBJ_MAILSLOT */
-    NULL,              /* K32OBJ_TOOLHELP_SNAPSHOT */
-    NULL               /* K32OBJ_SOCKET */
+    NULL,                     /* K32OBJ_SEMAPHORE */
+    NULL,                     /* K32OBJ_EVENT */
+    NULL,                     /* K32OBJ_MUTEX */
+    NULL,                     /* K32OBJ_CRITICAL_SECTION */
+    PROCESS_Destroy,          /* K32OBJ_PROCESS */
+    THREAD_Destroy,           /* K32OBJ_THREAD */
+    FILE_Destroy,             /* K32OBJ_FILE */
+    NULL,                     /* K32OBJ_CHANGE */
+    NULL,                     /* K32OBJ_CONSOLE */
+    NULL,                     /* K32OBJ_SCREEN_BUFFER */
+    VIRTUAL_DestroyMapping,   /* K32OBJ_MEM_MAPPED_FILE */
+    NULL,                     /* K32OBJ_SERIAL */
+    NULL,                     /* K32OBJ_DEVICE_IOCTL */
+    NULL,                     /* K32OBJ_PIPE */
+    NULL,                     /* K32OBJ_MAILSLOT */
+    NULL,                     /* K32OBJ_TOOLHELP_SNAPSHOT */
+    NULL                      /* K32OBJ_SOCKET */
 };
 
+typedef struct _NE
+{
+    struct _NE *next;
+    K32OBJ     *obj;
+    UINT32      len;
+    char        name[1];
+} NAME_ENTRY;
+
+static NAME_ENTRY *K32OBJ_FirstEntry = NULL;
+
 
 /***********************************************************************
  *           K32OBJ_IncCount
@@ -52,11 +65,88 @@ void K32OBJ_IncCount( K32OBJ *ptr )
  */
 void K32OBJ_DecCount( K32OBJ *ptr )
 {
+    NAME_ENTRY **pptr;
+
     /* FIXME: not atomic */
     assert( ptr->type && ((unsigned)ptr->type < K32OBJ_NBOBJECTS) );
     assert( ptr->refcount );
     if (--ptr->refcount) return;
+
+    /* Check if the object has a name entry and free it */
+
+    pptr = &K32OBJ_FirstEntry;
+    while (*pptr && ((*pptr)->obj != ptr)) pptr = &(*pptr)->next;
+    if (*pptr)
+    {
+        NAME_ENTRY *entry = *pptr;
+        *pptr = entry->next;
+        HeapFree( SystemHeap, 0, entry );
+    }
+
     /* Free the object */
+
     if (K32OBJ_Destroy[ptr->type]) K32OBJ_Destroy[ptr->type]( ptr );
 }
 
+
+/***********************************************************************
+ *           K32OBJ_AddName
+ *
+ * Add a name entry for an object. We don't check for duplicates here.
+ * FIXME: should use some sort of hashing.
+ */
+BOOL32 K32OBJ_AddName( K32OBJ *obj, LPCSTR name )
+{
+    NAME_ENTRY *entry = K32OBJ_FirstEntry;
+    UINT32 len = strlen( name );
+
+    if (!(entry = HeapAlloc( SystemHeap, 0, sizeof(entry) + len )))
+    {
+        SetLastError( ERROR_OUTOFMEMORY );
+        return FALSE;
+    }
+    entry->next = K32OBJ_FirstEntry;
+    entry->obj = obj;
+    lstrcpy32A( entry->name, name );
+    K32OBJ_FirstEntry = entry;
+    return TRUE;
+}
+
+
+/***********************************************************************
+ *           K32OBJ_FindName
+ *
+ * Find the object referenced by a given name.
+ * The reference count is not incremented.
+ */
+K32OBJ *K32OBJ_FindName( LPCSTR name )
+{
+    NAME_ENTRY *entry = K32OBJ_FirstEntry;
+    UINT32 len;
+
+    if (!name) return NULL;  /* Anonymous object */
+    len = strlen( name );
+    while (entry)
+    {
+        if ((len == entry->len) && !lstrcmp32A( name, entry->name))
+            return entry->obj;
+        entry = entry->next;
+    }
+    return NULL;
+}
+
+
+/***********************************************************************
+ *           K32OBJ_FindNameType
+ *
+ * Find an object by name and check its type.
+ * The reference count is not incremented.
+ */
+K32OBJ *K32OBJ_FindNameType( LPCSTR name, K32OBJ_TYPE type )
+{
+    K32OBJ *obj = K32OBJ_FindName( name );
+    if (!obj) return NULL;
+    if (obj->type == type) return obj;
+    SetLastError( ERROR_DUP_NAME );
+    return NULL;
+}
diff --git a/win32/memory.c b/win32/memory.c
deleted file mode 100644
index 8cb1ae5db5d..00000000000
--- a/win32/memory.c
+++ /dev/null
@@ -1,358 +0,0 @@
-/*
- * Win32 kernel functions
- *
- * Copyright 1995 Martin von Loewis and Cameron Heide
- */
-
-#include <fcntl.h>
-#include <stdio.h>
-#include <string.h>
-#include <sys/time.h>
-#include <unistd.h>
-#include <sys/types.h>
-#include <sys/mman.h>
-#include <string.h>
-#include <stdlib.h>
-#include "windows.h"
-#include "winerror.h"
-#include "winbase.h"
-#include "heap.h"
-#include "stddebug.h"
-#include "debug.h"
-
-#ifndef PROT_NONE  /* FreeBSD doesn't define PROT_NONE */
-#define PROT_NONE 0
-#endif
-
-typedef struct {
-    caddr_t	ptr;
-    long	size;
-} virtual_mem_t;
-
-typedef struct _VRANGE_OBJECT
-{
-	DWORD				start;
-	DWORD				size;
-	struct _VRANGE_OBJECT *next;
-} VRANGE_OBJECT;
-
-virtual_mem_t *mem = 0;
-int mem_count = 0;
-int mem_used = 0;
-
-/*******************************************************************
- *                   VRANGE
- * A VRANGE denotes a contiguous part of the address space. It is used
- * for house keeping, and will be obtained by higher-level memory allocation
- * functions (VirtualAlloc, MapViewOfFile)
- * There can be at most one VRANGE object covering any address at any time.
- * Currently, all VRANGE objects are stored in a sorted list. Wine does not
- * attempt to give a complete list of in-use address ranges, only those
- * allocated via Win32.
- * An exception is IsVrangeFree, which should test the OS specific 
- * mappings, too. As a default, an range not known to be allocated is 
- * considered free.
- *******************************************************************/
-
-VRANGE_OBJECT *MEMORY_ranges=0;
-
-VRANGE_OBJECT *MEMORY_FindVrange(DWORD start)
-{
-	VRANGE_OBJECT *range;
-	for(range=MEMORY_ranges;range && range->start<start;range=range->next)
-	{
-		if(range->start<start && start<range->start+range->size)
-			return range;
-	}
-	return 0;
-}
-
-static int MEMORY_IsVrangeFree(DWORD start,DWORD size)
-{
-	DWORD end;
-	VRANGE_OBJECT *range;
-	if(!size)
-		return 1;
-	/* First, check our lists*/
-	end=start+size;
-	for(range=MEMORY_ranges;range && range->start<start;range=range->next)
-	{
-		if((range->start<start && start<range->start+range->size) ||
-			(range->start<end && end<range->start+range->size))
-		return 0;
-	}
-	/* Now, check the maps that are not under our control */
-#ifdef linux
-	{
-	FILE *f=fopen("/proc/self/maps","r");
-	char line[80];
-	int found=0;
-	while(1)
-	{
-		char *it;
-		int lower,upper;
-		if(!fgets(line,sizeof(line),f))
-			break;
-		it=line;
-		lower=strtoul(it,&it,16);
-		if(*it++!='-')
-			fprintf(stderr,"Format of /proc/self/maps changed\n");
-		upper=strtoul(it,&it,16);
-		if((lower<start && start<upper) || (lower<start+size && start+size<upper))
-		{
-			found=1;
-			break;
-		}
-	}
-	fclose(f);
-	return !found;
-	}
-#else
-	{
-	static int warned=0;
-	if(!warned)
-	{
-		fprintf(stdnimp, "Don't know how to perform MEMORY_IsVrangeFree on "
-			"this system.\n Please fix\n");
-		warned=0;
-	}
-	return 1;
-	}
-#endif
-}
-
-/* FIXME: might need to consolidate ranges */
-void MEMORY_InsertVrange(VRANGE_OBJECT *r)
-{
-	VRANGE_OBJECT *it,*last;
-	if(!MEMORY_ranges || r->start<MEMORY_ranges->start)
-	{
-		r->next=MEMORY_ranges;
-		MEMORY_ranges=r;
-	}
-	for(it=MEMORY_ranges,last=0;it && it->start<r->start;it=it->next)
-		last=it;
-	r->next=last->next;
-	last->next=r;
-}
-	
-
-VRANGE_OBJECT *MEMORY_AllocVrange(int start,int size)
-{
-	VRANGE_OBJECT *ret=HeapAlloc( SystemHeap, 0, sizeof(VRANGE_OBJECT));
-	MEMORY_InsertVrange(ret);
-	return ret;
-}
-
-void MEMORY_ReleaseVrange(VRANGE_OBJECT *r)
-{
-	VRANGE_OBJECT *it;
-	if(MEMORY_ranges==r)
-	{
-		MEMORY_ranges=r->next;
-		HeapFree( SystemHeap, 0, r );
-		return;
-	}
-	for(it=MEMORY_ranges;it;it=it->next)
-		if(it->next==r)break;
-	if(!it)
-	{
-		fprintf(stderr,"VRANGE not found\n");
-		return;
-	}
-	it->next=r->next;
-	HeapFree( SystemHeap, 0, r );
-}
-
-/***********************************************************************
- *           VirtualAlloc             (KERNEL32.548)
- */
-int TranslateProtectionFlags(DWORD);
-LPVOID VirtualAlloc(LPVOID lpvAddress, DWORD cbSize,
-                   DWORD fdwAllocationType, DWORD fdwProtect)
-{
-    caddr_t	ptr;
-    int	i;
-    virtual_mem_t *tmp_mem;
-    int	prot;
-    static int fdzero = -1;
-
-    if (fdzero == -1)
-    {
-        if ((fdzero = open( "/dev/zero", O_RDONLY )) == -1)
-        {
-            perror( "/dev/zero: open" );
-            return (LPVOID)NULL;
-        }
-    }
-
-    dprintf_win32(stddeb, "VirtualAlloc: size = %ld, address=%p\n", cbSize, lpvAddress);
-    if (fdwAllocationType & MEM_RESERVE || !lpvAddress) {
-        ptr = mmap((void *)((((unsigned long)lpvAddress-1) & 0xFFFF0000L) 
-	                + 0x00010000L),
-		   cbSize, PROT_NONE, MAP_PRIVATE, fdzero, 0 );
-	if (ptr == (caddr_t) -1) {
-	    dprintf_win32(stddeb, "VirtualAlloc: returning NULL");
-	    return (LPVOID) NULL;
-	}
-        if (lpvAddress && ((unsigned long)ptr & 0xFFFF0000L)) {
-	    munmap(ptr, cbSize);
-	    cbSize += 65535;
-	    ptr =  mmap(lpvAddress, cbSize, 
-	                PROT_NONE, MAP_PRIVATE, fdzero, 0 );
-	    if (ptr == (caddr_t) -1) {
-		dprintf_win32(stddeb, "VirtualAlloc: returning NULL");
-		return (LPVOID) NULL;
-	    }
-	    ptr = (void *)((((unsigned long)ptr-1) & 0xFFFF0000L)+0x00010000L);
-	}
-	/* remember the size for VirtualFree since it's going to be handed
-	   a zero len */
-	if (ptr) {
-	    if (mem_count == mem_used) {
-	        tmp_mem = realloc(mem,(mem_count+10)*sizeof(virtual_mem_t));
-		if (!tmp_mem) return 0;
-		mem = tmp_mem;
-		memset(mem+mem_count, 0, 10*sizeof(virtual_mem_t));
-		mem_count += 10;
-	    }
-	    for (i=0; i<mem_count; i++) {
-	        if (!(mem+i)->ptr) {
-		    (mem+i)->ptr = ptr;
-		    (mem+i)->size = cbSize;
-		    mem_used++;
-		    break;
-		}
-	    }
-	}
-    } else {
-        ptr = lpvAddress;
-    }
-    if (fdwAllocationType & MEM_COMMIT) {
-        prot = TranslateProtectionFlags(fdwProtect & 
-                                          ~(PAGE_GUARD | PAGE_NOCACHE));
-	mprotect(ptr, cbSize, prot);
-    }
-#if 0
-/* kludge for gnu-win32 */
-    if (fdwAllocationType & MEM_RESERVE) return sbrk(0);
-    ptr = malloc(cbSize + 65536);
-    if(ptr)
-    {
-        /* Round it up to the next 64K boundary and zero it.
-         */
-        ptr = (void *)(((unsigned long)ptr & 0xFFFF0000L) + 0x00010000L);
-        memset(ptr, 0, cbSize);
-    }
-#endif
-    dprintf_win32(stddeb, "VirtualAlloc: got pointer %p\n", ptr);
-    return ptr;
-}
-
-/***********************************************************************
- *           VirtualFree               (KERNEL32.550)
- */
-BOOL32 VirtualFree(LPVOID lpvAddress, DWORD cbSize, DWORD fdwFreeType)
-{
-    int i;
-
-    if (fdwFreeType & MEM_RELEASE) {
-        for (i=0; i<mem_count; i++) {
-            if ((mem+i)->ptr == lpvAddress) {
-    	         munmap(lpvAddress, (mem+i)->size);
-    	         (mem+i)->ptr = 0;
-    	         mem_used--;
-    	         break;
-	    }
-    	}
-    } else {
-        mprotect(lpvAddress, cbSize, PROT_NONE);
-    }
-#if 0
-    if(lpvAddress)
-        free(lpvAddress);
-#endif
-    return 1;
-}
-
-/***********************************************************************
- *           VirtualQuery               (KERNEL32.554)
- */
-BOOL32 VirtualQuery(LPCVOID address,LPMEMORY_BASIC_INFORMATION buf,DWORD len) 
-{
-	/* FIXME: fill out structure  ... */
-	return TRUE;
-}
-
-/***********************************************************************
- *           VirtualProtect               (KERNEL32.552)
- */
-BOOL32 VirtualProtect(LPVOID lpAddress,DWORD dwSize,DWORD flNewProtect,LPDWORD lpflOldProtect) {
-	/* FIXME: do protection ... see mprotect(). */
-	return TRUE;
-}
-
-
-int TranslateProtectionFlags(DWORD protection_flags)
-{
-    int prot;
-
-        switch(protection_flags) {
-	    case PAGE_READONLY:
-	        prot=PROT_READ;
-		break;
-	    case PAGE_READWRITE:
-	        prot=PROT_READ|PROT_WRITE;
-		break;
-	    case PAGE_WRITECOPY:
-	        prot=PROT_WRITE;
-		break;
-	    case PAGE_EXECUTE:
-	        prot=PROT_EXEC;
-		break;
-	    case PAGE_EXECUTE_READ:
-	        prot=PROT_EXEC|PROT_READ;
-		break;
-	    case PAGE_EXECUTE_READWRITE:
-	        prot=PROT_EXEC|PROT_READ|PROT_WRITE;
-		break;
-	    case PAGE_EXECUTE_WRITECOPY:
-	        prot=PROT_EXEC|PROT_WRITE;
-		break;
-	    case PAGE_NOACCESS:
-	    default:
-	        prot=PROT_NONE;
-		break;
-	}
-   return prot;
-}
-
-
-/******************************************************************
- *                   IsBadReadPtr
- */
-BOOL WIN32_IsBadReadPtr(void* ptr, unsigned int bytes)
-{
-	dprintf_global(stddeb,"IsBadReadPtr(%x,%x)\n",(int)ptr,bytes);
-	/* FIXME: Should make check based on actual mappings, here */
-	return FALSE;
-}
-
-/******************************************************************
- *                   IsBadWritePtr
- */
-BOOL WIN32_IsBadWritePtr(void* ptr, unsigned int bytes)
-{
-	dprintf_global(stddeb,"IsBadWritePtr(%x,%x)\n",(int)ptr,bytes);
-	/* FIXME: Should make check based on actual mappings, here */
-	return FALSE;
-}
-/******************************************************************
- *                   IsBadWritePtr
- */
-BOOL WIN32_IsBadCodePtr(void* ptr, unsigned int bytes)
-{
-	dprintf_global(stddeb,"IsBadCodePtr(%x,%x)\n",(int)ptr,bytes);
-	/* FIXME: Should make check based on actual mappings, here */
-	return FALSE;
-}
diff --git a/win32/process.c b/win32/process.c
index e403cdeb507..58f8dc3e7fb 100644
--- a/win32/process.c
+++ b/win32/process.c
@@ -18,7 +18,7 @@
 /***********************************************************************
  *           CreateMutexA    (KERNEL32.52)
  */
-HANDLE32 CreateMutexA (SECURITY_ATTRIBUTES *sa, BOOL on, const char *a)
+HANDLE32 CreateMutexA (SECURITY_ATTRIBUTES *sa, BOOL32 on, const char *a)
 {
 	return 0;
 }
@@ -26,7 +26,7 @@ HANDLE32 CreateMutexA (SECURITY_ATTRIBUTES *sa, BOOL on, const char *a)
 /***********************************************************************
  *           ReleaseMutex    (KERNEL32.435)
  */
-BOOL ReleaseMutex (HANDLE32 h)
+BOOL32 ReleaseMutex (HANDLE32 h)
 {
 	return 0;
 }
@@ -34,7 +34,7 @@ BOOL ReleaseMutex (HANDLE32 h)
 /***********************************************************************
  *           CreateEventA    (KERNEL32.43)
  */
-HANDLE32 CreateEventA (SECURITY_ATTRIBUTES *sa, BOOL au, BOOL on, const char
+HANDLE32 CreateEventA (SECURITY_ATTRIBUTES *sa, BOOL32 au, BOOL32 on, const char
 *name)
 {
 	return 0;
@@ -42,14 +42,14 @@ HANDLE32 CreateEventA (SECURITY_ATTRIBUTES *sa, BOOL au, BOOL on, const char
 /***********************************************************************
  *           SetEvent    (KERNEL32.487)
  */
-BOOL SetEvent (HANDLE32 h)
+BOOL32 SetEvent (HANDLE32 h)
 {
 	return 0;
 }
 /***********************************************************************
  *           ResetEvent    (KERNEL32.439)
  */
-BOOL ResetEvent (HANDLE32 h)
+BOOL32 ResetEvent (HANDLE32 h)
 {
 	return 0;
 }
@@ -63,7 +63,7 @@ DWORD WaitForSingleObject(HANDLE32 h, DWORD a)
 /***********************************************************************
  *           DuplicateHandle    (KERNEL32.78)
  */
-BOOL DuplicateHandle(HANDLE32 a, HANDLE32 b, HANDLE32 c, HANDLE32 * d, DWORD e, BOOL f, DWORD g)
+BOOL32 DuplicateHandle(HANDLE32 a, HANDLE32 b, HANDLE32 c, HANDLE32 * d, DWORD e, BOOL32 f, DWORD g)
 {
 	*d = b;
 	return 1;
@@ -79,13 +79,13 @@ HINSTANCE32 LoadLibrary32A(LPCSTR libname)
 {
 	HINSTANCE32 handle;
 	dprintf_module( stddeb, "LoadLibrary: (%08x) %s\n", (int)libname, libname);
-	handle = LoadModule( libname, (LPVOID)-1 );
+	handle = LoadModule16( libname, (LPVOID)-1 );
 	if (handle == (HINSTANCE32) -1)
 	{
 		char buffer[256];
 		strcpy( buffer, libname );
 		strcat( buffer, ".dll" );
-		handle = LoadModule( buffer, (LPVOID)-1 );
+		handle = LoadModule16( buffer, (LPVOID)-1 );
 	}
 	/* Obtain module handle and call initialization function */
 #ifndef WINELIB
@@ -108,7 +108,7 @@ HINSTANCE32 LoadLibrary32W(LPCWSTR libnameW)
 /***********************************************************************
  *           FreeLibrary
  */
-BOOL FreeLibrary32(HINSTANCE32 hLibModule)
+BOOL32 FreeLibrary32(HINSTANCE32 hLibModule)
 {
 	fprintf(stderr,"FreeLibrary: empty stub\n");
 	return TRUE;
@@ -117,7 +117,7 @@ BOOL FreeLibrary32(HINSTANCE32 hLibModule)
 /**********************************************************************
  *          GetProcessAffinityMask
  */
-BOOL GetProcessAffinityMask(HANDLE32 hProcess, LPDWORD lpProcessAffinityMask,
+BOOL32 GetProcessAffinityMask(HANDLE32 hProcess, LPDWORD lpProcessAffinityMask,
   LPDWORD lpSystemAffinityMask)
 {
 	dprintf_task(stddeb,"GetProcessAffinityMask(%x,%lx,%lx)\n",
@@ -135,7 +135,7 @@ BOOL GetProcessAffinityMask(HANDLE32 hProcess, LPDWORD lpProcessAffinityMask,
 /**********************************************************************
  *           SetThreadAffinityMask
  */
-BOOL SetThreadAffinityMask(HANDLE32 hThread, DWORD dwThreadAffinityMask)
+BOOL32 SetThreadAffinityMask(HANDLE32 hThread, DWORD dwThreadAffinityMask)
 {
 	dprintf_task(stddeb,"SetThreadAffinityMask(%x,%lx)\n",hThread,
 		dwThreadAffinityMask);
diff --git a/win32/thread.c b/win32/thread.c
index 6c0559fe397..2acf856f623 100644
--- a/win32/thread.c
+++ b/win32/thread.c
@@ -2,11 +2,14 @@
  * Win32 kernel functions
  *
  * Copyright 1995 Martin von Loewis
+ * Copyright 1997 Onno Hovers
  */
 
 #include <stdio.h>
 #include <unistd.h>
 #include <string.h>
+#include <sys/ipc.h>
+#include <sys/sem.h>
 #include "windows.h"
 #include "winbase.h"
 #include "winerror.h"
@@ -14,96 +17,246 @@
 #include "debug.h"
 #include "xmalloc.h"
 
-/**********************************************************************
- *          Critical Sections are currently ignored
+
+/*
+ * FIXME: 
+ * The c functions do not protect from non-interlocked accesses
+ * This is no problem as long as we do not have multiple Win32 threads 
+ * or processes. 
+ * The assembly macro's do protect from non-interlocked access,
+ * but they will only work for i386 systems with GCC.  
  */
-void InitializeCriticalSection(CRITICAL_SECTION *lpCrit)
+ 
+/************************************************************************
+*           InterlockedIncrement			[KERNEL32]	*
+*									*
+* InterlockedIncrement adds 1 to a long variable and returns		*
+*  -  a negative number if the result < 0				*
+*  -  zero if the result == 0						*
+*  -  a positive number if the result > 0				*
+*									*
+* The returned number need not be equal to the result!!!!		*
+************************************************************************/
+
+LONG InterlockedIncrement(LPLONG lpAddend)
 {
-	memset(lpCrit,0,sizeof(CRITICAL_SECTION));
+#if defined(__i386__)&&defined(__GNUC__)
+	long ret;
+	__asm__
+	(	  	 
+	   "\tlock\n"	/* for SMP systems */
+	   "\tincl	(%1)\n"
+	   "\tje	2f\n"
+	   "\tjl	1f\n"
+	   "\tincl	%0\n"
+	   "\tjmp	2f\n"
+	   "1:\tdec	%0\n"    	  
+	   "2:\n"
+	   :"=r" (ret):"r" (lpAddend), "0" (0): "memory"
+	);
+	return ret;
+#else      
+	LONG ret;
+	/* StopAllThreadsAndProcesses() */
+	
+	(*lpAddend)++;
+	ret=*lpAddend;
+
+	/* ResumeAllThreadsAndProcesses() */
+	return ret;
+#endif	 
 }
 
-void EnterCriticalSection(CRITICAL_SECTION* lpCrit)
+/************************************************************************
+*           InterlockedDecrement			[KERNEL32]	*
+*									*
+* InterlockedIncrement adds 1 to a long variable and returns		*
+*  -  a negative number if the result < 0				*
+*  -  zero if the result == 0						*
+*  -  a positive number if the result > 0				*
+*									*
+* The returned number need not be equal to the result!!!!		*
+************************************************************************/
+
+LONG InterlockedDecrement(LPLONG lpAddend)
 {
-    if (lpCrit->LockCount)
-        fprintf( stderr, "Error: re-entering critical section %08lx\n",
-                 (DWORD)lpCrit );
-    lpCrit->LockCount++;
+#if defined(__i386__)&&defined(__GNUC__)	
+	LONG ret;
+	__asm__
+	(	  	 
+	   "\tlock\n"	/* for SMP systems */
+	   "\tdecl	(%1)\n"
+	   "\tje	2f\n"
+	   "\tjl	1f\n"
+	   "\tincl	%0\n"
+	   "\tjmp	2f\n"
+	   "1:\tdec	%0\n"    	  
+	   "2:\n"
+	   :"=r" (ret):"r" (lpAddend), "0" (0): "memory"          
+	);
+	return ret;
+#else	
+	LONG ret;
+	/* StopAllThreadsAndProcesses() */
+
+	(*lpAddend)--;
+	ret=*lpAddend;
+
+	/* ResumeAllThreadsAndProcesses() */
+	return ret;
+#endif	
 }
 
-void LeaveCriticalSection(CRITICAL_SECTION* lpCrit)
+/************************************************************************
+*           InterlockedExchange				[KERNEL32]	*
+************************************************************************/
+
+LONG InterlockedExchange(LPLONG target, LONG value)
 {
-    if (!lpCrit->LockCount)
-        fprintf( stderr, "Error: leaving critical section %08lx again\n",
-                 (DWORD)lpCrit );
-    lpCrit->LockCount--;
+#if defined(__i386__)&&defined(__GNUC__)	
+	LONG ret;
+	__asm__
+	(	  	 
+
+           "\tlock\n"	/* for SMP systems */
+	   "\txchgl	%0,(%1)\n"	   	  
+	   :"=r" (ret):"r" (target), "0" (value):"memory"
+	);
+	return ret;
+#else
+	LONG ret;
+	/* StopAllThreadsAndProcesses() */	
+
+	ret=*target;
+	*target=value;
+
+	/* ResumeAllThreadsAndProcesses() */
+	return ret;
+#endif	
 }
 
-void DeleteCriticalSection(CRITICAL_SECTION* lpCrit)
+/* AAARGHH some CriticalSection functions get called before we 
+ * have a threadid
+ */
+ 
+#define GetCurrentThreadId()	(-1)
+
+/************************************************************************
+*           InitializeCriticalSection			[KERNEL32]	*
+************************************************************************/
+
+void InitializeCriticalSection(CRITICAL_SECTION *pcritical)
 {
-	return;
+   pcritical->LockCount=-1;
+   pcritical->RecursionCount=0;
+   pcritical->LockSemaphore=(HANDLE32) semget(IPC_PRIVATE,1,IPC_CREAT);
+   pcritical->OwningThread=(HANDLE32) -1;
+   pcritical->Reserved=0;
 }
 
-void ReinitializeCriticalSection(CRITICAL_SECTION *lpCrit) {
-	/* hmm */
-}
+/************************************************************************
+*           DeleteCriticalSection			[KERNEL32]	*
+************************************************************************/
 
-void MakeCriticalSectionGlobal(CRITICAL_SECTION *lpCrit) {
-	/* hmm */
+void DeleteCriticalSection(CRITICAL_SECTION *pcritical)
+{
+   semctl((int) pcritical->LockSemaphore,0,IPC_RMID,NULL);
+   pcritical->Reserved=-1;
 }
 
+/************************************************************************
+*           EnterCriticalSection			[KERNEL32]	*
+************************************************************************/
 
-/* FIXME: This is required to work cross-addres space as well */
-static CRITICAL_SECTION interlocked;
-static int interlocked_init;
-
-static void get_interlocked()
+void EnterCriticalSection (CRITICAL_SECTION *pcritical)
 {
-	if(!interlocked_init)
-		InitializeCriticalSection(&interlocked);
-	interlocked_init=1;
-	EnterCriticalSection(&interlocked);
+   if( InterlockedIncrement(&(pcritical->LockCount)))
+   {   
+      if( pcritical->OwningThread!= (HANDLE32) GetCurrentThreadId() )
+      {                 
+         struct sembuf sop;
+                                             
+         sop.sem_num=0;
+         sop.sem_op=0;
+         sop.sem_flg=0;            
+         semop((int) pcritical->LockSemaphore,&sop,0);
+            
+         pcritical->OwningThread = (HANDLE32) GetCurrentThreadId();                
+      }
+   }
+   else
+   {      
+      pcritical->OwningThread =(HANDLE32) GetCurrentThreadId();
+   }
+   pcritical->RecursionCount++;             
 }
 
-static void release_interlocked()
+/************************************************************************
+*           TryEnterCriticalSection			[KERNEL32]	*
+************************************************************************/
+
+BOOL32 TryEnterCriticalSection (CRITICAL_SECTION *pcritical)
 {
-	LeaveCriticalSection(&interlocked);
+   if( InterlockedIncrement(&(pcritical->LockCount)))
+   {
+      if( pcritical->OwningThread!= (HANDLE32) GetCurrentThreadId() )
+         return FALSE;
+   }
+   else
+   {      
+      pcritical->OwningThread =(HANDLE32) GetCurrentThreadId();
+   }
+   pcritical->RecursionCount++;             
+   
+   return TRUE;
 }
 
-/***********************************************************************
- *           InterlockedIncrement
- */
-LONG InterlockedIncrement(LPLONG lpAddend)
+/************************************************************************
+*           LeaveCriticalSection			[KERNEL32]	*
+************************************************************************/
+
+void LeaveCriticalSection (CRITICAL_SECTION *pcritical)
 {
-	int ret;
-	get_interlocked();
-	(*lpAddend)++;
-	ret=*lpAddend;
-	release_interlocked();
-	return ret;
+   /* do we actually own this critical section ??? */
+   if( pcritical->OwningThread!= (HANDLE32) GetCurrentThreadId())
+      return;
+       
+   pcritical->RecursionCount--;
+   if( pcritical->RecursionCount==0)
+   {
+      pcritical->OwningThread=(HANDLE32)-1;
+      if(InterlockedDecrement(&(pcritical->LockCount))>=0)
+      {         
+         struct sembuf sop;
+         
+         sop.sem_num=0;
+         sop.sem_op=1;
+         sop.sem_flg=0;
+         semop((int) pcritical->LockSemaphore,&sop,0);
+      }
+   }
+   else
+   {
+       InterlockedDecrement(&(pcritical->LockCount));
+   }  
 }
 
-/***********************************************************************
- *           InterlockedDecrement
- */
-LONG InterlockedDecrement(LPLONG lpAddend)
+/************************************************************************
+*           ReinitializeCriticalSection			[KERNEL32]	*
+************************************************************************/
+
+void ReinitializeCriticalSection(CRITICAL_SECTION *lpCrit)
 {
-	int ret;
-	get_interlocked();
-	(*lpAddend)--;
-	ret=*lpAddend;
-	release_interlocked();
-	return ret;
+   /* hmm ?????? */	
 }
 
-/***********************************************************************
- *           InterlockedExchange
- */
-LONG InterlockedExchange(LPLONG target, LONG value)
+/************************************************************************
+*           MakeCriticalSectionGlobal			[KERNEL32]	*
+************************************************************************/
+
+void MakeCriticalSectionGlobal(CRITICAL_SECTION *lpCrit)
 {
-	int ret;
-	get_interlocked();
-	ret=*target;
-	*target=value;
-	release_interlocked();
-	return ret;
+   /* nothing (SysV Semaphores are already global) */
+   return;	
 }
+
diff --git a/win32/user32.c b/win32/user32.c
index b7dff9cfb58..5a1192ab58b 100644
--- a/win32/user32.c
+++ b/win32/user32.c
@@ -20,17 +20,33 @@
 #include "stddebug.h"
 
 /***********************************************************************
- *          GetMessageA          (USER32.269)
+ *          GetMessage32A   (USER32.269)
  */
-BOOL USER32_GetMessageA(MSG32* lpmsg,HWND32 hwnd,DWORD min,DWORD max)
+BOOL32 GetMessage32A(MSG32* lpmsg,HWND32 hwnd,UINT32 min,UINT32 max)
 {
-	BOOL ret;
-	MSG16 *msg = SEGPTR_NEW(MSG16);
-        if (!msg) return 0;
-        ret=GetMessage(SEGPTR_GET(msg),(HWND16)hwnd,min,max);
-	STRUCT32_MSG16to32(msg,lpmsg);
-        SEGPTR_FREE(msg);
-	return ret;
+    BOOL32 ret;
+    MSG16 *msg = SEGPTR_NEW(MSG16);
+    if (!msg) return 0;
+    ret=GetMessage16(SEGPTR_GET(msg),(HWND16)hwnd,min,max);
+    /* FIXME */
+    STRUCT32_MSG16to32(msg,lpmsg);
+    SEGPTR_FREE(msg);
+    return ret;
+}
+
+/***********************************************************************
+ *          GetMessage32W   (USER32.273)
+ */
+BOOL32 GetMessage32W(MSG32* lpmsg,HWND32 hwnd,UINT32 min,UINT32 max)
+{
+    BOOL32 ret;
+    MSG16 *msg = SEGPTR_NEW(MSG16);
+    if (!msg) return 0;
+    ret=GetMessage16(SEGPTR_GET(msg),(HWND16)hwnd,min,max);
+    /* FIXME */
+    STRUCT32_MSG16to32(msg,lpmsg);
+    SEGPTR_FREE(msg);
+    return ret;
 }
 
 /***********************************************************************
@@ -40,7 +56,7 @@ BOOL32 PeekMessage32A( LPMSG32 lpmsg, HWND32 hwnd,
                        UINT32 min,UINT32 max,UINT32 wRemoveMsg)
 {
 	MSG16 msg;
-	BOOL ret;
+	BOOL32 ret;
 	ret=PeekMessage16(&msg,hwnd,min,max,wRemoveMsg);
         /* FIXME: should translate the message to Win32 */
 	STRUCT32_MSG16to32(&msg,lpmsg);
diff --git a/windows/caret.c b/windows/caret.c
index 0fdc6efa292..00de7ff24f3 100644
--- a/windows/caret.c
+++ b/windows/caret.c
@@ -123,16 +123,25 @@ static void CARET_KillTimer(void)
 
 
 /*****************************************************************
- *           CreateCaret   (USER.163) (USER32.65)
+ *           CreateCaret16   (USER.163)
  */
-BOOL16 CreateCaret( HWND32 hwnd, HBITMAP32 bitmap, INT32 width, INT32 height )
+void CreateCaret16( HWND16 hwnd, HBITMAP16 bitmap, INT16 width, INT16 height )
+{
+    CreateCaret32( hwnd, bitmap, width, height );
+}
+
+/*****************************************************************
+ *           CreateCaret32   (USER32.65)
+ */
+BOOL32 CreateCaret32( HWND32 hwnd, HBITMAP32 bitmap,
+                      INT32 width, INT32 height )
 {
     dprintf_caret(stddeb,"CreateCaret: hwnd=%04x\n", hwnd);
 
     if (!hwnd) return FALSE;
 
     /* if cursor already exists, destroy it */
-    if (Caret.hwnd) DestroyCaret();
+    if (Caret.hwnd) DestroyCaret32();
 
     if (bitmap && (bitmap != 1))
     {
@@ -164,9 +173,18 @@ BOOL16 CreateCaret( HWND32 hwnd, HBITMAP32 bitmap, INT32 width, INT32 height )
    
 
 /*****************************************************************
- *           DestroyCaret   (USER.164) (USER32.130)
+ *           DestroyCaret16   (USER.164)
+ */
+void DestroyCaret16(void)
+{
+    DestroyCaret32();
+}
+
+
+/*****************************************************************
+ *           DestroyCaret32   (USER32.130)
  */
-BOOL16 DestroyCaret(void)
+BOOL32 DestroyCaret32(void)
 {
     if (!Caret.hwnd) return FALSE;
 
@@ -182,9 +200,18 @@ BOOL16 DestroyCaret(void)
 
 
 /*****************************************************************
- *           SetCaretPos   (USER.165) (USER32.465)
+ *           SetCaretPos16   (USER.165)
  */
-BOOL16 SetCaretPos( INT32 x, INT32 y)
+void SetCaretPos16( INT16 x, INT16 y )
+{
+    SetCaretPos32( x, y );
+}
+
+
+/*****************************************************************
+ *           SetCaretPos32   (USER32.465)
+ */
+BOOL32 SetCaretPos32( INT32 x, INT32 y)
 {
     if (!Caret.hwnd) return FALSE;
     if ((x == Caret.x) && (y == Caret.y)) return TRUE;
@@ -207,9 +234,9 @@ BOOL16 SetCaretPos( INT32 x, INT32 y)
 /*****************************************************************
  *           HideCaret16   (USER.166)
  */
-BOOL16 HideCaret16( HWND16 hwnd )
+void HideCaret16( HWND16 hwnd )
 {
-    return HideCaret32( hwnd );
+    HideCaret32( hwnd );
 }
 
 
@@ -234,9 +261,9 @@ BOOL32 HideCaret32( HWND32 hwnd )
 /*****************************************************************
  *           ShowCaret16   (USER.167)
  */
-BOOL16 ShowCaret16( HWND16 hwnd )
+void ShowCaret16( HWND16 hwnd )
 {
-    return ShowCaret32( hwnd );
+    ShowCaret32( hwnd );
 }
 
 
@@ -265,9 +292,17 @@ BOOL32 ShowCaret32( HWND32 hwnd )
 
 
 /*****************************************************************
- *           SetCaretBlinkTime   (USER.168) (USER32.464)
+ *           SetCaretBlinkTime16   (USER.168)
+ */
+void SetCaretBlinkTime16( UINT16 msecs )
+{
+    SetCaretBlinkTime32( msecs );
+}
+
+/*****************************************************************
+ *           SetCaretBlinkTime32   (USER32.464)
  */
-BOOL16 SetCaretBlinkTime( UINT32 msecs )
+BOOL32 SetCaretBlinkTime32( UINT32 msecs )
 {
     if (!Caret.hwnd) return FALSE;
 
diff --git a/windows/class.c b/windows/class.c
index d04e707362e..fa0d470ce8c 100644
--- a/windows/class.c
+++ b/windows/class.c
@@ -2,6 +2,10 @@
  * Window classes functions
  *
  * Copyright 1993, 1996 Alexandre Julliard
+ *
+ * FIXME: In win32 all classes are local. They are registered at 
+ *	  program start. Processes CANNOT share classes. (Source: some
+ *	  win31->NT migration book)
  */
 
 #include <stdlib.h>
@@ -156,7 +160,7 @@ static void CLASS_SetMenuNameW( CLASS *classPtr, LPCWSTR name )
  *
  * Free a class structure.
  */
-static BOOL CLASS_FreeClass( CLASS *classPtr )
+static BOOL32 CLASS_FreeClass( CLASS *classPtr )
 {
     CLASS **ppClass;
 
@@ -556,9 +560,18 @@ BOOL32 UnregisterClass32W( LPCWSTR className, HINSTANCE32 hInstance )
 
 
 /***********************************************************************
- *           GetClassWord    (USER.129) (USER32.218)
+ *           GetClassWord16    (USER.129)
+ */
+WORD GetClassWord16( HWND16 hwnd, INT16 offset )
+{
+    return GetClassWord32( hwnd, offset );
+}
+
+
+/***********************************************************************
+ *           GetClassWord32    (USER32.218)
  */
-WORD GetClassWord( HWND32 hwnd, INT32 offset )
+WORD GetClassWord32( HWND32 hwnd, INT32 offset )
 {
     WND * wndPtr;
     
@@ -635,7 +648,7 @@ LONG GetClassLong32A( HWND32 hwnd, INT32 offset )
         case GCL_HCURSOR:
         case GCL_HICON:
         case GCL_HICONSM:
-            return GetClassWord( hwnd, offset );
+            return GetClassWord32( hwnd, offset );
     }
     fprintf(stderr, "Warning: invalid offset %d for GetClassLong()\n", offset);
     return 0;
@@ -664,9 +677,18 @@ LONG GetClassLong32W( HWND32 hwnd, INT32 offset )
 
 
 /***********************************************************************
- *           SetClassWord    (USER.130) (USER32.468)
+ *           SetClassWord16    (USER.130)
  */
-WORD SetClassWord( HWND32 hwnd, INT32 offset, WORD newval )
+WORD SetClassWord16( HWND16 hwnd, INT16 offset, WORD newval )
+{
+    return SetClassWord32( hwnd, offset, newval );
+}
+
+
+/***********************************************************************
+ *           SetClassWord32    (USER32.468)
+ */
+WORD SetClassWord32( HWND32 hwnd, INT32 offset, WORD newval )
 {
     WND * wndPtr;
     WORD retval = 0;
@@ -767,7 +789,7 @@ LONG SetClassLong32A( HWND32 hwnd, INT32 offset, LONG newval )
         case GCL_HCURSOR:
         case GCL_HICON:
         case GCL_HICONSM:
-            return SetClassWord( hwnd, offset, (WORD)newval );
+            return SetClassWord32( hwnd, offset, (WORD)newval );
         case GCL_STYLE:      ptr = &wndPtr->class->style; break;
         case GCL_CBWNDEXTRA: ptr = &wndPtr->class->cbWndExtra; break;
         case GCL_CBCLSEXTRA: ptr = &wndPtr->class->cbClsExtra; break;
@@ -881,7 +903,9 @@ BOOL32 GetClassInfo32A( HINSTANCE32 hInstance, LPCSTR name, WNDCLASS32A *wc )
     hInstance = GetExePtr( hInstance );  /* FIXME: not needed in Win32 */
     if (!(atom = GlobalFindAtom32A( name )) ||
         !(classPtr = CLASS_FindClassByAtom( atom, hInstance )) ||
-        (hInstance != classPtr->hInstance)) return FALSE;
+	(classPtr->hInstance && (hInstance != classPtr->hInstance)))
+        return FALSE;
+
     wc->style         = classPtr->style;
     wc->lpfnWndProc   = (WNDPROC32)WINPROC_GetProc( classPtr->winproc,
                                                     WIN_PROC_32A );
@@ -908,7 +932,9 @@ BOOL32 GetClassInfo32W( HINSTANCE32 hInstance, LPCWSTR name, WNDCLASS32W *wc )
     hInstance = GetExePtr( hInstance );  /* FIXME: not needed in Win32 */
     if (!(atom = GlobalFindAtom32W( name )) ||
         !(classPtr = CLASS_FindClassByAtom( atom, hInstance )) ||
-        (hInstance != classPtr->hInstance)) return FALSE;
+	(classPtr->hInstance && (hInstance != classPtr->hInstance)))
+        return FALSE;
+
     wc->style         = classPtr->style;
     wc->lpfnWndProc   = (WNDPROC32)WINPROC_GetProc( classPtr->winproc,
                                                     WIN_PROC_32W );
diff --git a/windows/dce.c b/windows/dce.c
index 08c09e19141..cc92e5c1790 100644
--- a/windows/dce.c
+++ b/windows/dce.c
@@ -188,7 +188,7 @@ void DCE_Init()
  * window area clipped by the client area of all ancestors.
  * Return FALSE if the visible region is empty.
  */
-static BOOL DCE_GetVisRect( WND *wndPtr, BOOL clientArea, RECT16 *lprect )
+static BOOL32 DCE_GetVisRect( WND *wndPtr, BOOL32 clientArea, RECT16 *lprect )
 {
     int xoffset, yoffset;
 
@@ -250,10 +250,10 @@ static HRGN32 DCE_ClipWindows( WND *pWndStart, WND *pWndEnd,
     for (; pWndStart != pWndEnd; pWndStart = pWndStart->next)
     {
         if (!(pWndStart->dwStyle & WS_VISIBLE)) continue;
-        SetRectRgn( hrgnNew, pWndStart->rectWindow.left + xoffset,
-                    pWndStart->rectWindow.top + yoffset,
-                    pWndStart->rectWindow.right + xoffset,
-                    pWndStart->rectWindow.bottom + yoffset );
+        SetRectRgn32( hrgnNew, pWndStart->rectWindow.left + xoffset,
+                      pWndStart->rectWindow.top + yoffset,
+                      pWndStart->rectWindow.right + xoffset,
+                      pWndStart->rectWindow.bottom + yoffset );
         if (!CombineRgn32( hrgn, hrgn, hrgnNew, RGN_DIFF )) break;
     }
     DeleteObject32( hrgnNew );
@@ -436,7 +436,7 @@ HDC32 GetDCEx32( HWND32 hwnd, HRGN32 hrgnClip, DWORD flags )
     DC * 	dc;
     WND * 	wndPtr;
     DWORD 	dcx_flags = 0;
-    BOOL	need_update = TRUE;
+    BOOL32	need_update = TRUE;
 
     dprintf_dc(stddeb,"GetDCEx: hwnd %04x, hrgnClip %04x, flags %08x\n", hwnd, hrgnClip, (unsigned)flags);
     
@@ -705,7 +705,7 @@ BOOL16 DCHook( HDC16 hDC, WORD code, DWORD data, LPARAM lParam )
 
                     if( (!dce->hClipRgn && dce->DCXflags & DCX_INTERSECTRGN) ||
                          (dce->hClipRgn == 1 && dce->DCXflags & DCX_EXCLUDERGN) )            
-                         SetRectRgn(hVisRgn,0,0,0,0);
+                         SetRectRgn32(hVisRgn,0,0,0,0);
                     else
                          CombineRgn32(hVisRgn, hVisRgn, dce->hClipRgn, 
                                       (dce->DCXflags & DCX_EXCLUDERGN)? RGN_DIFF:RGN_AND);
diff --git a/windows/defdlg.c b/windows/defdlg.c
index d5d2f337e81..618e3dfc136 100644
--- a/windows/defdlg.c
+++ b/windows/defdlg.c
@@ -52,7 +52,7 @@ static BOOL32 DEFDLG_SaveFocus( HWND32 hwnd, DIALOGINFO *infoPtr )
 static BOOL32 DEFDLG_RestoreFocus( HWND32 hwnd, DIALOGINFO *infoPtr )
 {
     if (!infoPtr->hwndFocus || IsIconic32(hwnd)) return FALSE;
-    if (!IsWindow( infoPtr->hwndFocus )) return FALSE;
+    if (!IsWindow32( infoPtr->hwndFocus )) return FALSE;
     DEFDLG_SetFocus( hwnd, infoPtr->hwndFocus );
     infoPtr->hwndFocus = 0;
     return TRUE;
@@ -238,7 +238,7 @@ LRESULT DefDlgProc16( HWND16 hwnd, UINT16 msg, WPARAM16 wParam, LPARAM lParam )
 
     /* Check if window was destroyed by dialog procedure */
 
-    if( !result && IsWindow(hwnd))
+    if (!result && IsWindow32(hwnd))
     {
         /* callback didn't process this message */
 
@@ -289,7 +289,7 @@ LRESULT DefDlgProc32A( HWND32 hwnd, UINT32 msg, WPARAM32 wParam, LPARAM lParam)
 
     /* Check if window was destroyed by dialog procedure */
 
-    if( !result && IsWindow(hwnd))
+    if (!result && IsWindow32(hwnd))
     {
         /* callback didn't process this message */
 
@@ -340,7 +340,7 @@ LRESULT DefDlgProc32W( HWND32 hwnd, UINT32 msg, WPARAM32 wParam, LPARAM lParam)
 
     /* Check if window was destroyed by dialog procedure */
 
-    if( !result && IsWindow(hwnd))
+    if (!result && IsWindow32(hwnd))
     {
         /* callback didn't process this message */
 
diff --git a/windows/defwnd.c b/windows/defwnd.c
index 5581bf76da2..fec17becbb5 100644
--- a/windows/defwnd.c
+++ b/windows/defwnd.c
@@ -215,13 +215,13 @@ static LRESULT DEFWND_DefWinProc( WND *wndPtr, UINT32 msg, WPARAM32 wParam,
     case WM_CTLCOLORBTN:
     case WM_CTLCOLORDLG:
     case WM_CTLCOLORSTATIC:
-        SetBkColor( (HDC32)wParam, GetSysColor32(COLOR_WINDOW) );
-        SetTextColor( (HDC32)wParam, GetSysColor32(COLOR_WINDOWTEXT) );
+        SetBkColor32( (HDC32)wParam, GetSysColor32(COLOR_WINDOW) );
+        SetTextColor32( (HDC32)wParam, GetSysColor32(COLOR_WINDOWTEXT) );
         return (LRESULT)sysColorObjects.hbrushWindow;
 
     case WM_CTLCOLORSCROLLBAR:
-        SetBkColor( (HDC32)wParam, RGB(255, 255, 255) );
-        SetTextColor( (HDC32)wParam, RGB(0, 0, 0) );
+        SetBkColor32( (HDC32)wParam, RGB(255, 255, 255) );
+        SetTextColor32( (HDC32)wParam, RGB(0, 0, 0) );
         UnrealizeObject32( sysColorObjects.hbrushScrollbar );
         return (LRESULT)sysColorObjects.hbrushScrollbar;
 
@@ -229,15 +229,15 @@ static LRESULT DEFWND_DefWinProc( WND *wndPtr, UINT32 msg, WPARAM32 wParam,
 	{
 	    if (HIWORD(lParam) == CTLCOLOR_SCROLLBAR)
 	    {
-		SetBkColor( (HDC32)wParam, RGB(255, 255, 255) );
-		SetTextColor( (HDC32)wParam, RGB(0, 0, 0) );
+		SetBkColor32( (HDC32)wParam, RGB(255, 255, 255) );
+		SetTextColor32( (HDC32)wParam, RGB(0, 0, 0) );
 		UnrealizeObject32( sysColorObjects.hbrushScrollbar );
 		return (LRESULT)sysColorObjects.hbrushScrollbar;
 	    }
 	    else
 	    {
-		SetBkColor( (HDC32)wParam, GetSysColor32(COLOR_WINDOW) );
-		SetTextColor( (HDC32)wParam, GetSysColor32(COLOR_WINDOWTEXT) );
+		SetBkColor32( (HDC32)wParam, GetSysColor32(COLOR_WINDOW) );
+		SetTextColor32((HDC32)wParam, GetSysColor32(COLOR_WINDOWTEXT));
 		return (LRESULT)sysColorObjects.hbrushWindow;
 	    }
 	}
@@ -295,8 +295,8 @@ static LRESULT DEFWND_DefWinProc( WND *wndPtr, UINT32 msg, WPARAM32 wParam,
 	iMenuSysKey = 0;
 	if (wParam == VK_RETURN && (wndPtr->dwStyle & WS_MINIMIZE))
         {
-	    PostMessage( wndPtr->hwndSelf, WM_SYSCOMMAND,
-                         (WPARAM16)SC_RESTORE, 0L ); 
+	    PostMessage16( wndPtr->hwndSelf, WM_SYSCOMMAND,
+                           (WPARAM16)SC_RESTORE, 0L ); 
 	    break;
         } 
 	if ((HIWORD(lParam) & KEYDATA_ALT) && wParam)
diff --git a/windows/dialog.c b/windows/dialog.c
index 17d1680ffac..366dd8a1ee2 100644
--- a/windows/dialog.c
+++ b/windows/dialog.c
@@ -296,7 +296,7 @@ static BOOL32 DIALOG_CreateControls( WND *pWnd, LPCSTR template, INT32 items,
                 SendMessage32A( hwndDefButton, BM_SETSTYLE32,
                                 BS_PUSHBUTTON,FALSE );
             hwndDefButton = hwndCtrl;
-            dlgInfo->idResult = GetWindowWord( hwndCtrl, GWW_ID );
+            dlgInfo->idResult = GetWindowWord32( hwndCtrl, GWW_ID );
         }
     }    
     dprintf_dialog(stddeb, " END\n" );
@@ -1566,7 +1566,7 @@ static INT32 DIALOG_DlgDirList( HWND32 hDlg, LPCSTR spec, INT32 idLBox,
     HWND32 hwnd;
 
 #define SENDMSG(msg,wparam,lparam) \
-    ((attrib & DDL_POSTMSGS) ? PostMessage( hwnd, msg, wparam, lparam ) \
+    ((attrib & DDL_POSTMSGS) ? PostMessage32A( hwnd, msg, wparam, lparam ) \
                              : SendMessage32A( hwnd, msg, wparam, lparam ))
 
     dprintf_dialog( stddeb, "DlgDirList: %04x '%s' %d %d %04x\n",
diff --git a/windows/event.c b/windows/event.c
index 4800aed01c3..86c31299518 100644
--- a/windows/event.c
+++ b/windows/event.c
@@ -670,7 +670,7 @@ static void EVENT_SelectionRequest( WND *pWnd, XSelectionRequestEvent *event )
 	    BOOL32 couldOpen = OpenClipboard32( pWnd->hwndSelf );
 	    char* lpstr = 0;
 
-	    hText = GetClipboardData(CF_TEXT);
+	    hText = GetClipboardData16(CF_TEXT);
 	    text = GlobalLock16(hText);
 	    size = GlobalSize16(hText);
 
@@ -842,7 +842,8 @@ static void EVENT_ClientMessage( WND *pWnd, XClientMessageEvent *event )
 		      p += strlen(p) + 1;
 		    }
 		    *p_drop = '\0';
-		    PostMessage( pWnd->hwndSelf, WM_DROPFILES, (WPARAM16)hDrop, 0L );
+		    PostMessage16( pWnd->hwndSelf, WM_DROPFILES,
+                                   (WPARAM16)hDrop, 0L );
 		  }
 	        }
 	      }
@@ -983,7 +984,7 @@ HWND32 GetCapture32(void)
  */
 FARPROC16 GetMouseEventProc(void)
 {
-    HMODULE16 hmodule = GetModuleHandle("USER");
+    HMODULE16 hmodule = GetModuleHandle16("USER");
     return MODULE_GetEntryPoint( hmodule,
                                  MODULE_GetOrdinal( hmodule, "Mouse_Event" ) );
 }
diff --git a/windows/focus.c b/windows/focus.c
index 06467a6bf6a..3c28c8e3833 100644
--- a/windows/focus.c
+++ b/windows/focus.c
@@ -7,7 +7,6 @@
  *
  */
 
-#define NO_TRANSITION_TYPES  /* This file is Win32-clean */
 #include "win.h"
 #include "winpos.h"
 #include "hook.h"
@@ -120,7 +119,7 @@ HWND32 SetFocus32( HWND32 hwnd )
 	{
 	    if (!WINPOS_SetActiveWindow(hwndTop, 0, 0)) return 0;
 
-	    if (!IsWindow( hwnd )) return 0;  /* Abort if window destroyed */
+	    if (!IsWindow32( hwnd )) return 0;  /* Abort if window destroyed */
 	}
     }
     else if( HOOK_CallHooks16( WH_CBT, HCBT_SETFOCUS, 0, (LPARAM)hwndFocus ) )
diff --git a/windows/graphics.c b/windows/graphics.c
index 8dd1d65a5bb..6169fa75cf7 100644
--- a/windows/graphics.c
+++ b/windows/graphics.c
@@ -4,7 +4,6 @@
  * Copyright 1993, 1994 Alexandre Julliard
  */
 
-#define NO_TRANSITION_TYPES  /* This file is Win32-clean */
 #include <math.h>
 #include <stdlib.h>
 #include <X11/Xlib.h>
diff --git a/windows/hook.c b/windows/hook.c
index 59ffd20a9dc..e01d3b77a8b 100644
--- a/windows/hook.c
+++ b/windows/hook.c
@@ -14,7 +14,6 @@
  * handle in the low 16 bits and of a HOOK_MAGIC value in the high 16 bits.
  */
 
-#define NO_TRANSITION_TYPES  /* This file is Win32-clean */
 #include "windows.h"
 #include "hook.h"
 #include "queue.h"
@@ -175,8 +174,8 @@ static void HOOK_Map16To32Common(INT32 id, INT32 code, WPARAM32 *pwParam,
                 *plParam = (LPARAM)lprect32;
                 break;
             }
-	    break;
 	  } 
+	  break;
 
 	case WH_MOUSE:
         {
diff --git a/windows/keyboard.c b/windows/keyboard.c
index 8ed9eeb3135..d1c0c989304 100644
--- a/windows/keyboard.c
+++ b/windows/keyboard.c
@@ -6,7 +6,7 @@
  * Copyright 1997 David Faure
  *
  */
-#define NO_TRANSITION_TYPES
+
 #include <stdlib.h>
 #include <stdio.h>
 #include <string.h>
@@ -731,7 +731,7 @@ DWORD OemKeyScan(WORD wOemChar)
  */
 /* VkKeyScan translates an ANSI character to a virtual-key and shift code
  * for the current keyboard.
- * FIXME high-order byte should yield :
+ * high-order byte yields :
  *	0	Unshifted
  *	1	Shift
  *	2	Ctrl
@@ -739,21 +739,53 @@ DWORD OemKeyScan(WORD wOemChar)
  *	6	Ctrl-Alt
  *	7	Ctrl-Alt-Shift
  *	I.e. :	Shift = 1, Ctrl = 2, Alt = 4.
+ * FIXME : works ok except for dead chars :
+ * VkKeyScan '^'(0x5e, 94) ... got keycode 00 ... returning 00
+ * VkKeyScan '`'(0x60, 96) ... got keycode 00 ... returning 00
  */
 
 WORD VkKeyScan32A(CHAR cChar)
 {
 	KeyCode keycode;
-    	dprintf_keyboard(stddeb,"VkKeyScan '%c'(%d) ",cChar,cChar);
+	KeySym keysym;    	
+	int i,index;
+	int highbyte=0;
+
+	/* char->keysym (same for ANSI chars) */
+	keysym=(unsigned char) cChar;/* (!) cChar is signed */
+	if (keysym<=27) keysym+=0xFF00;/*special chars : return, backspace...*/
 	
-/* let's do this : char = keysym (for ANSI chars) -> keyc [ + shift ... (?? how ??)]
-keyc -> (keyc2vkey) vkey */
+	keycode = XKeysymToKeycode(display, keysym);  /* keysym -> keycode */
+	if (!keycode)
+	{ /* It didn't work ... let's try with deadchar code. */
+	  keycode = XKeysymToKeycode(display, keysym | 0xFE00);
+	}
 
-	keycode = XKeysymToKeycode(display, cChar & 0xFF);
+	dprintf_keyboard(stddeb,"VkKeyScan '%c'(%#lx, %lu) : got keycode %#.2x ",
+	    cChar,keysym,keysym,keycode);
 	
-	dprintf_keyboard(stddeb," ... got keycode 0x%x ... returning 0x%x\n",
-			 keycode,keyc2vkey[keycode]);
-	return keyc2vkey[keycode];
+	if (keycode)
+	  {
+	    for (index=-1, i=0; (i<8) && (index<0); i++) /* find shift state */
+	      if (XKeycodeToKeysym(display,keycode,i)==keysym) index=i;
+	    switch (index) {
+	    case -1 :
+	      fprintf(stderr,"Keysym %lx not found while parsing the keycode table\n",keysym); break;
+	    case 0 : break;
+	    case 1 : highbyte = 0x0100; break;
+	    case 2 : highbyte = 0X0600; break;
+	    default : fprintf(stderr,"index %d found by XKeycodeToKeysym. please report! \n",index);
+	    }
+	    /*
+	      index : 0     adds 0x0000
+	      index : 1     adds 0x0100 (shift)
+	      index : ?     adds 0x0200 (ctrl)
+	      index : 2     adds 0x0600 (ctrl+alt)
+	      index : ?     adds 0x0700 (ctrl+alt+shit (used?))
+	     */
+	  }
+	dprintf_keyboard(stddeb," ... returning %#.2x\n", keyc2vkey[keycode]+highbyte);
+	return keyc2vkey[keycode]+highbyte;   /* keycode -> (keyc2vkey) vkey */
 }
 
 /******************************************************************************
@@ -962,7 +994,7 @@ INT32 ToAscii32(
 	  {
 	    if ((e.keycode) && ((virtKey<0x10) || (virtKey>0x12))) 
 		/* it's normal to have 2 shift, control, and alt ! */
-		dprintf_keyboard(stddeb,"ToAscii : The keycodes %X and %X are matching the same vkey %X\n",
+		dprintf_keyboard(stddeb,"ToAscii : The keycodes %d and %d are matching the same vkey %#X\n",
 				 e.keycode,keyc,virtKey);
 	    e.keycode = keyc;
 	  }
@@ -1002,26 +1034,62 @@ INT32 ToAscii32(
 	((char*)lpChar)[1] = '\0';
 	switch (keysym)
 	    {
+	/* symbolic ASCII is the same as defined in rfc1345 */
 	    case XK_dead_tilde :
 	    case 0x1000FE7E : /* Xfree's XK_Dtilde */
-		dead_char = '~';
+		dead_char = '~';	/* '? */
 		break;
 	    case XK_dead_acute :
 	    case 0x1000FE27 : /* Xfree's XK_Dacute_accent */
-		dead_char = 0xb4;
+		dead_char = 0xb4;	/* '' */
 		break;
 	    case XK_dead_circumflex :
 	    case 0x1000FE5E : /* Xfree's XK_Dcircumflex_accent */
-		dead_char = '^';
+		dead_char = '^';	/* '> */
 		break;
 	    case XK_dead_grave :
 	    case 0x1000FE60 : /* Xfree's XK_Dgrave_accent */
-		dead_char = '`';
+		dead_char = '`';	/* '! */
 		break;
 	    case XK_dead_diaeresis :
 	    case 0x1000FE22 : /* Xfree's XK_Ddiaeresis */
-		dead_char = 0xa8;
+		dead_char = 0xa8;	/* ': */
 		break;
+	    case XK_dead_cedilla :
+	        dead_char = 0xb8;	/* ', */
+	        break;
+	    case XK_dead_macron :
+	        dead_char = '-';	/* 'm isn't defined on iso-8859-x */
+	        break;
+	    case XK_dead_breve :
+	        dead_char = 0xa2;	/* '( */
+	        break;
+	    case XK_dead_abovedot :
+	        dead_char = 0xff;	/* '. */
+	        break;
+	    case XK_dead_abovering :
+	        dead_char = '0';	/* '0 isn't defined on iso-8859-x */
+	        break;
+	    case XK_dead_doubleacute :
+	        dead_char = 0xbd;	/* '" */
+	        break;
+	    case XK_dead_caron :
+	        dead_char = 0xb7;	/* '< */
+	        break;
+	    case XK_dead_ogonek :
+	        dead_char = 0xb2;	/* '; */
+	        break;
+/* FIXME: I don't know this three.
+	    case XK_dead_iota :
+	        dead_char = 'i';	 
+	        break;
+	    case XK_dead_voiced_sound :
+	        dead_char = 'v';
+	        break;
+	    case XK_dead_semivoiced_sound :
+	        dead_char = 's';
+	        break;
+*/
 	    }
 	if (dead_char)
 	    {
diff --git a/windows/mdi.c b/windows/mdi.c
index 395a4ea261c..d8bb5a36e64 100644
--- a/windows/mdi.c
+++ b/windows/mdi.c
@@ -60,7 +60,7 @@ static void MDI_PostUpdate(HWND16 hwnd, MDICLIENTINFO* ci, WORD recalc)
  if( !ci->sbNeedUpdate )
    {
       ci->sbNeedUpdate = TRUE;
-      PostMessage( hwnd, WM_MDICALCCHILDSCROLL, 0, 0);
+      PostMessage16( hwnd, WM_MDICALCCHILDSCROLL, 0, 0);
    }
  ci->sbRecalc = recalc;
 }
@@ -69,7 +69,7 @@ static void MDI_PostUpdate(HWND16 hwnd, MDICLIENTINFO* ci, WORD recalc)
  *			MDI_MenuAppendItem
  */
 #ifdef SUPERFLUOUS_FUNCTIONS
-static BOOL MDI_MenuAppendItem(WND *clientWnd, HWND16 hWndChild)
+static BOOL32 MDI_MenuAppendItem(WND *clientWnd, HWND16 hWndChild)
 {
  char buffer[128];
  MDICLIENTINFO  *clientInfo = (MDICLIENTINFO*)clientWnd->wExtra;
@@ -88,14 +88,14 @@ static BOOL MDI_MenuAppendItem(WND *clientWnd, HWND16 hWndChild)
 /**********************************************************************
  *			MDI_MenuModifyItem
  */
-static BOOL MDI_MenuModifyItem(WND* clientWnd, HWND16 hWndChild )
+static BOOL32 MDI_MenuModifyItem(WND* clientWnd, HWND16 hWndChild )
 {
  char            buffer[128];
  MDICLIENTINFO  *clientInfo = (MDICLIENTINFO*)clientWnd->wExtra;
  WND            *wndPtr     = WIN_FindWndPtr(hWndChild);
- UINT		 n          = sprintf(buffer, "%d ",
+ UINT32		 n          = sprintf(buffer, "%d ",
                               wndPtr->wIDmenu - clientInfo->idFirstChild + 1);
- BOOL		 bRet	    = 0;
+ BOOL32		 bRet	    = 0;
 
  if( !clientInfo->hWindowMenu ) return 0;
 
@@ -111,12 +111,12 @@ static BOOL MDI_MenuModifyItem(WND* clientWnd, HWND16 hWndChild )
 /**********************************************************************
  *			MDI_MenuDeleteItem
  */
-static BOOL MDI_MenuDeleteItem(WND* clientWnd, HWND16 hWndChild )
+static BOOL32 MDI_MenuDeleteItem(WND* clientWnd, HWND16 hWndChild )
 {
  char    	 buffer[128];
  MDICLIENTINFO  *clientInfo = (MDICLIENTINFO*)clientWnd->wExtra;
  WND    	*wndPtr     = WIN_FindWndPtr(hWndChild);
- UINT		 index      = 0,id,n;
+ UINT32		 index      = 0,id,n;
 
  if( !clientInfo->nActiveChildren ||
      !clientInfo->hWindowMenu ) return 0;
@@ -194,12 +194,13 @@ static HWND16 MDI_GetWindow(WND  *clientWnd, HWND16 hWnd, WORD wTo )
  *
  *  It seems that default height is 2/3 of client rect
  */
-static void MDI_CalcDefaultChildPos(WND* w, WORD n, LPPOINT16 lpPos, INT delta)
+static void MDI_CalcDefaultChildPos( WND* w, WORD n, LPPOINT16 lpPos,
+                                     INT32 delta)
 {
  RECT16 rect = w->rectClient;
- INT  spacing = GetSystemMetrics32(SM_CYCAPTION) +
-                GetSystemMetrics32(SM_CYFRAME) - 1; 
- INT  nstagger;
+ INT32  spacing = GetSystemMetrics32(SM_CYCAPTION) +
+                  GetSystemMetrics32(SM_CYFRAME) - 1; 
+ INT32  nstagger;
 
  if( rect.bottom - rect.top - delta >= spacing ) 
      rect.bottom -= delta;
@@ -244,9 +245,9 @@ static HMENU16 MDISetMenu(HWND16 hwnd, BOOL32 fRefresh, HMENU16 hmenuFrame,
 
 	    if( ci->nActiveChildren )
 	      {
-	        INT  j = i - ci->nActiveChildren + 1;
+	        INT32 j = i - ci->nActiveChildren + 1;
 		char buffer[100];
-		UINT id,state;
+		UINT32 id,state;
 
 		for( ; i >= j ; i-- )
 		   {
@@ -383,8 +384,8 @@ static HWND16 MDICreateChild( WND *w, MDICLIENTINFO *ci, HWND16 parent,
     {
 	ci->nActiveChildren--;
 	DeleteMenu32(ci->hWindowMenu,wIDmenu,MF_BYCOMMAND);
-	if( IsWindow(hwndMax) )
-	    ShowWindow16(hwndMax, SW_SHOWMAXIMIZED);
+	if( IsWindow32(hwndMax) )
+	    ShowWindow32(hwndMax, SW_SHOWMAXIMIZED);
     }
 	
     return hwnd;
@@ -443,7 +444,7 @@ static void MDI_SwitchActiveChild( HWND16 clientHwnd, HWND16 childHwnd,
 
     if ( hwndTo != hwndPrev )
 	{
-	  BOOL bOptimize = 0;
+	  BOOL32 bOptimize = 0;
 
 	  if( ci->hwndChildMaximized )
 	    {
@@ -520,7 +521,7 @@ static LONG MDI_ChildActivate( WND *clientPtr, HWND16 hWndChild )
     HWND16                 prevActiveWnd = clientInfo->hwndActiveChild;
     WND                 *wndPtr = WIN_FindWndPtr( hWndChild );
     WND			*wndPrev = WIN_FindWndPtr( prevActiveWnd );
-    BOOL		 isActiveFrameWnd = 0;	 
+    BOOL32		 isActiveFrameWnd = 0;	 
 
     if( hWndChild == prevActiveWnd ) return 0L;
 
@@ -670,7 +671,7 @@ static HBITMAP16 CreateMDIMenuBitmap(void)
  HBITMAP16	hbCopy,hb_src,hb_dest;
 
  hb_src = SelectObject32(hDCSrc,hbClose);
- hbCopy = CreateCompatibleBitmap(hDCSrc,SYSMETRICS_CXSIZE, SYSMETRICS_CYSIZE);
+ hbCopy = CreateCompatibleBitmap32(hDCSrc,SYSMETRICS_CXSIZE,SYSMETRICS_CYSIZE);
  hb_dest = SelectObject32(hDCDest,hbCopy);
 
  BitBlt32(hDCDest, 0, 0, SYSMETRICS_CXSIZE, SYSMETRICS_CYSIZE,
@@ -975,7 +976,7 @@ static void MDI_UpdateFrameText( WND *frameWnd, HWND16 hClient,
  *
  * This function is the handler for all MDI requests.
  */
-LRESULT MDIClientWndProc(HWND16 hwnd, UINT message, WPARAM16 wParam, LPARAM lParam)
+LRESULT MDIClientWndProc(HWND16 hwnd, UINT16 message, WPARAM16 wParam, LPARAM lParam)
 {
     LPCREATESTRUCT16     cs;
     LPCLIENTCREATESTRUCT16 ccs;
@@ -983,7 +984,7 @@ LRESULT MDIClientWndProc(HWND16 hwnd, UINT message, WPARAM16 wParam, LPARAM lPar
     RECT16		 rect;
     WND                 *w 	  = WIN_FindWndPtr(hwnd);
     WND			*frameWnd = w->parent;
-    INT			nItems;
+    INT32 nItems;
     
     ci = (MDICLIENTINFO *) w->wExtra;
     
@@ -1460,8 +1461,8 @@ LRESULT DefMDIChildProc16( HWND16 hwnd, UINT16 message,
       case WM_MENUCHAR:
 
 	/* MDI children don't have menu bars */
-	PostMessage( clientWnd->parent->hwndSelf, WM_SYSCOMMAND, 
-                     (WPARAM16)SC_KEYMENU, (LPARAM)wParam);
+	PostMessage16( clientWnd->parent->hwndSelf, WM_SYSCOMMAND, 
+                       (WPARAM16)SC_KEYMENU, (LPARAM)wParam);
 	return 0x00010000L;
 
       case WM_NEXTMENU:
@@ -1514,8 +1515,8 @@ LRESULT DefMDIChildProc32A( HWND32 hwnd, UINT32 message,
       case WM_MENUCHAR:
 
 	/* MDI children don't have menu bars */
-	PostMessage( clientWnd->parent->hwndSelf, WM_SYSCOMMAND, 
-                     (WPARAM16)SC_KEYMENU, (LPARAM)LOWORD(wParam) );
+	PostMessage16( clientWnd->parent->hwndSelf, WM_SYSCOMMAND, 
+                       (WPARAM16)SC_KEYMENU, (LPARAM)LOWORD(wParam) );
 	return 0x00010000L;
 
       case WM_CLOSE:
@@ -1641,8 +1642,8 @@ BOOL16 TranslateMDISysAccel16( HWND16 hwndClient, LPMSG16 msg )
 void CalcChildScroll( HWND16 hwnd, WORD scroll )
 {
     RECT16 childRect, clientRect;
-    INT  vmin, vmax, hmin, hmax, vpos, hpos;
-    BOOL noscroll = FALSE;
+    INT32  vmin, vmax, hmin, hmax, vpos, hpos;
+    BOOL32 noscroll = FALSE;
     WND *pWnd, *Wnd;
 
     if (!(Wnd = pWnd = WIN_FindWndPtr( hwnd ))) return;
diff --git a/windows/message.c b/windows/message.c
index dfce8b0c0ac..ace52001957 100644
--- a/windows/message.c
+++ b/windows/message.c
@@ -404,7 +404,8 @@ static int MSG_JournalPlayBackMsg(void)
  *
  * Peek for a hardware message matching the hwnd and message filters.
  */
-static BOOL32 MSG_PeekHardwareMsg( MSG16 *msg, HWND16 hwnd, DWORD filter, BOOL32 remove )
+static BOOL32 MSG_PeekHardwareMsg( MSG16 *msg, HWND16 hwnd, DWORD filter,
+                                   BOOL32 remove )
 {
     DWORD status = SYSQ_MSG_ACCEPT;
     MESSAGEQUEUE *sysMsgQueue = QUEUE_GetSysQueue();
@@ -543,7 +544,7 @@ UINT32 GetDoubleClickTime32(void)
  *
  * Implementation of an inter-task SendMessage.
  */
-static LRESULT MSG_SendMessage( HQUEUE16 hDestQueue, HWND16 hwnd, UINT msg,
+static LRESULT MSG_SendMessage( HQUEUE16 hDestQueue, HWND16 hwnd, UINT16 msg,
                                 WPARAM16 wParam, LPARAM lParam )
 {
     INT32	  prevSMRL = debugSMRL;
@@ -553,7 +554,7 @@ static LRESULT MSG_SendMessage( HQUEUE16 hDestQueue, HWND16 hwnd, UINT msg,
     if (!(queue = (MESSAGEQUEUE*)GlobalLock16( GetTaskQueue(0) ))) return 0;
     if (!(destQ = (MESSAGEQUEUE*)GlobalLock16( hDestQueue ))) return 0;
 
-    if (IsTaskLocked() || !IsWindow(hwnd)) return 0;
+    if (IsTaskLocked() || !IsWindow32(hwnd)) return 0;
 
     debugSMRL+=4;
     dprintf_sendmsg(stddeb,"%*sSM: %s [%04x] (%04x -> %04x)\n", 
@@ -617,9 +618,9 @@ static LRESULT MSG_SendMessage( HQUEUE16 hDestQueue, HWND16 hwnd, UINT msg,
 
 
 /***********************************************************************
- *           ReplyMessage   (USER.115)
+ *           ReplyMessage16   (USER.115)
  */
-void ReplyMessage( LRESULT result )
+void ReplyMessage16( LRESULT result )
 {
     MESSAGEQUEUE *senderQ;
     MESSAGEQUEUE *queue;
@@ -659,8 +660,8 @@ void ReplyMessage( LRESULT result )
 /***********************************************************************
  *           MSG_PeekMessage
  */
-static BOOL MSG_PeekMessage( LPMSG16 msg, HWND16 hwnd, WORD first, WORD last,
-                             WORD flags, BOOL peek )
+static BOOL32 MSG_PeekMessage( LPMSG16 msg, HWND16 hwnd, WORD first, WORD last,
+                               WORD flags, BOOL32 peek )
 {
     int pos, mask;
     MESSAGEQUEUE *msgQueue;
@@ -843,7 +844,7 @@ BOOL32 MSG_InternalGetMessage( MSG16 *msg, HWND32 hwnd, HWND32 hwndOwner,
 	    if (!MSG_PeekMessage( msg, 0, 0, 0, flags, TRUE ))
 	    {
 		  /* No message present -> send ENTERIDLE and wait */
-                if (IsWindow(hwndOwner))
+                if (IsWindow32(hwndOwner))
                     SendMessage16( hwndOwner, WM_ENTERIDLE,
                                    code, (LPARAM)hwnd );
 		MSG_PeekMessage( msg, 0, 0, 0, flags, FALSE );
@@ -893,9 +894,9 @@ BOOL16 PeekMessage16( LPMSG16 msg, HWND16 hwnd, UINT16 first,
 
 
 /***********************************************************************
- *           GetMessage   (USER.108)
+ *           GetMessage16   (USER.108)
  */
-BOOL GetMessage( SEGPTR msg, HWND16 hwnd, UINT first, UINT last ) 
+BOOL16 GetMessage16( SEGPTR msg, HWND16 hwnd, UINT16 first, UINT16 last ) 
 {
     MSG16 *lpmsg = (MSG16 *)PTR_SEG_TO_LIN(msg);
     MSG_PeekMessage( lpmsg,
@@ -909,9 +910,10 @@ BOOL GetMessage( SEGPTR msg, HWND16 hwnd, UINT first, UINT last )
 
 
 /***********************************************************************
- *           PostMessage   (USER.110)
+ *           PostMessage16   (USER.110)
  */
-BOOL PostMessage( HWND16 hwnd, WORD message, WORD wParam, LONG lParam )
+BOOL16 PostMessage16( HWND16 hwnd, UINT16 message, WPARAM16 wParam,
+                      LPARAM lParam )
 {
     MSG16 	msg;
     WND 	*wndPtr;
@@ -938,7 +940,7 @@ BOOL PostMessage( HWND16 hwnd, WORD message, WORD wParam, LONG lParam )
             {
                 dprintf_msg(stddeb,"BROADCAST Message to hWnd=%04x m=%04X w=%04X l=%08lX !\n",
                             wndPtr->hwndSelf, message, wParam, lParam);
-                PostMessage( wndPtr->hwndSelf, message, wParam, lParam );
+                PostMessage16( wndPtr->hwndSelf, message, wParam, lParam );
             }
         }
         dprintf_msg(stddeb,"PostMessage // End of HWND_BROADCAST !\n");
@@ -951,6 +953,29 @@ BOOL PostMessage( HWND16 hwnd, WORD message, WORD wParam, LONG lParam )
     return QUEUE_AddMsg( wndPtr->hmemTaskQ, &msg, 0 );
 }
 
+
+/***********************************************************************
+ *           PostMessage32A   (USER32.418)
+ */
+BOOL32 PostMessage32A( HWND32 hwnd, UINT32 message, WPARAM32 wParam,
+                       LPARAM lParam )
+{
+    /* FIXME */
+    return PostMessage16( hwnd, message, wParam, lParam );
+}
+
+
+/***********************************************************************
+ *           PostMessage32W   (USER32.419)
+ */
+BOOL32 PostMessage32W( HWND32 hwnd, UINT32 message, WPARAM32 wParam,
+                       LPARAM lParam )
+{
+    /* FIXME */
+    return PostMessage16( hwnd, message, wParam, lParam );
+}
+
+
 /***********************************************************************
  *           PostAppMessage16   (USER.116)
  */
@@ -993,7 +1018,7 @@ LRESULT SendMessage16( HWND16 hwnd, UINT16 msg, WPARAM16 wParam, LPARAM lParam)
         for (ppWnd = list; *ppWnd; ppWnd++)
         {
             wndPtr = *ppWnd;
-            if (!IsWindow(wndPtr->hwndSelf)) continue;
+            if (!IsWindow32(wndPtr->hwndSelf)) continue;
             if (wndPtr->dwStyle & WS_POPUP || wndPtr->dwStyle & WS_CAPTION)
             {
                 dprintf_msg(stddeb,"BROADCAST Message to hWnd=%04x m=%04X w=%04lX l=%08lX !\n",
@@ -1079,7 +1104,7 @@ LRESULT SendMessage32A(HWND32 hwnd, UINT32 msg, WPARAM32 wParam, LPARAM lParam)
         for (ppWnd = list; *ppWnd; ppWnd++)
         {
             wndPtr = *ppWnd;
-            if (!IsWindow(wndPtr->hwndSelf)) continue;
+            if (!IsWindow32(wndPtr->hwndSelf)) continue;
             if (wndPtr->dwStyle & WS_POPUP || wndPtr->dwStyle & WS_CAPTION)
                 SendMessage32A( wndPtr->hwndSelf, msg, wParam, lParam );
         }
@@ -1128,7 +1153,7 @@ LRESULT SendMessage32W(HWND32 hwnd, UINT32 msg, WPARAM32 wParam, LPARAM lParam)
         for (ppWnd = list; *ppWnd; ppWnd++)
         {
             wndPtr = *ppWnd;
-            if (!IsWindow(wndPtr->hwndSelf)) continue;
+            if (!IsWindow32(wndPtr->hwndSelf)) continue;
             if (wndPtr->dwStyle & WS_POPUP || wndPtr->dwStyle & WS_CAPTION)
                 SendMessage32W( wndPtr->hwndSelf, msg, wParam, lParam );
         }
@@ -1178,6 +1203,7 @@ struct accent_char
 
 static const struct accent_char accent_chars[] =
 {
+/* A good idea should be to read /usr/X11/lib/X11/locale/iso8859-x/Compose */
     {'`', 'A', '\300'},  {'`', 'a', '\340'},
     {'\'', 'A', '\301'}, {'\'', 'a', '\341'},
     {'^', 'A', '\302'},  {'^', 'a', '\342'},
@@ -1212,6 +1238,77 @@ static const struct accent_char accent_chars[] =
     {'T', 'H', '\336'},  {'t', 'h', '\376'},
     {'s', 's', '\337'},  {'"', 'y', '\377'},
     {'s', 'z', '\337'},  {'i', 'j', '\377'},
+	/* iso-8859-2 uses this */
+    {'<', 'L', '\245'},  {'<', 'l', '\265'},	/* caron */
+    {'<', 'S', '\251'},  {'<', 's', '\271'},
+    {'<', 'T', '\253'},  {'<', 't', '\273'},
+    {'<', 'Z', '\256'},  {'<', 'z', '\276'},
+    {'<', 'C', '\310'},  {'<', 'c', '\350'},
+    {'<', 'E', '\314'},  {'<', 'e', '\354'},
+    {'<', 'D', '\317'},  {'<', 'd', '\357'},
+    {'<', 'N', '\322'},  {'<', 'n', '\362'},
+    {'<', 'R', '\330'},  {'<', 'r', '\370'},
+    {';', 'A', '\241'},  {';', 'a', '\261'},	/* ogonek */
+    {';', 'E', '\312'},  {';', 'e', '\332'},
+    {'\'', 'Z', '\254'}, {'\'', 'z', '\274'},	/* acute */
+    {'\'', 'R', '\300'}, {'\'', 'r', '\340'},
+    {'\'', 'L', '\305'}, {'\'', 'l', '\345'},
+    {'\'', 'C', '\306'}, {'\'', 'c', '\346'},
+    {'\'', 'N', '\321'}, {'\'', 'n', '\361'},
+/*  collision whith S, from iso-8859-9 !!! */
+    {',', 'S', '\252'},  {',', 's', '\272'},	/* cedilla */
+    {',', 'T', '\336'},  {',', 't', '\376'},
+    {'.', 'Z', '\257'},  {'.', 'z', '\277'},	/* dot above */
+    {'/', 'L', '\243'},  {'/', 'l', '\263'},	/* slash */
+    {'/', 'D', '\320'},  {'/', 'd', '\360'},
+    {'(', 'A', '\303'},  {'(', 'a', '\343'},	/* breve */
+    {'\275', 'O', '\325'}, {'\275', 'o', '\365'},	/* double acute */
+    {'\275', 'U', '\334'}, {'\275', 'u', '\374'},
+    {'0', 'U', '\332'},  {'0', 'u', '\372'},	/* ring above */
+	/* iso-8859-3 uses this */
+    {'/', 'H', '\241'},  {'/', 'h', '\261'},	/* slash */
+    {'>', 'H', '\246'},  {'>', 'h', '\266'},	/* circumflex */
+    {'>', 'J', '\254'},  {'>', 'j', '\274'},
+    {'>', 'C', '\306'},  {'>', 'c', '\346'},
+    {'>', 'G', '\330'},  {'>', 'g', '\370'},
+    {'>', 'S', '\336'},  {'>', 's', '\376'},
+/*  collision whith G( from iso-8859-9 !!!   */
+    {'(', 'G', '\253'},  {'(', 'g', '\273'},	/* breve */
+    {'(', 'U', '\335'},  {'(', 'u', '\375'},
+/*  collision whith I. from iso-8859-3 !!!   */
+    {'.', 'I', '\251'},  {'.', 'i', '\271'},	/* dot above */
+    {'.', 'C', '\305'},  {'.', 'c', '\345'},
+    {'.', 'G', '\325'},  {'.', 'g', '\365'},
+	/* iso-8859-4 uses this */
+    {',', 'R', '\243'},  {',', 'r', '\263'},	/* cedilla */
+    {',', 'L', '\246'},  {',', 'l', '\266'},
+    {',', 'G', '\253'},  {',', 'g', '\273'},
+    {',', 'N', '\321'},  {',', 'n', '\361'},
+    {',', 'K', '\323'},  {',', 'k', '\363'},
+    {'~', 'I', '\245'},  {'~', 'i', '\265'},	/* tilde */
+    {'-', 'E', '\252'},  {'-', 'e', '\272'},	/* macron */
+    {'-', 'A', '\300'},  {'-', 'a', '\340'},
+    {'-', 'I', '\317'},  {'-', 'i', '\357'},
+    {'-', 'O', '\322'},  {'-', 'o', '\362'},
+    {'-', 'U', '\336'},  {'-', 'u', '\376'},
+    {'/', 'T', '\254'},  {'/', 't', '\274'},	/* slash */
+    {'.', 'E', '\314'},  {'.', 'e', '\344'},	/* dot above */
+    {';', 'I', '\307'},  {';', 'i', '\347'},	/* ogonek */
+    {';', 'U', '\331'},  {';', 'u', '\371'},
+	/* iso-8859-9 uses this */
+	/* iso-8859-9 has really bad choosen G( S, and I. as they collide
+	 * whith the same letters on other iso-8859-x (that is they are on
+	 * different places :-( ), if you use turkish uncomment these and
+	 * comment out the lines in iso-8859-2 and iso-8859-3 sections
+	 * FIXME: should be dynamic according to chosen language
+	 *	  if/when Wine has turkish support.  
+	 */ 
+/*  collision whith G( from iso-8859-3 !!!   */
+/*  {'(', 'G', '\320'},  {'(', 'g', '\360'}, */	/* breve */
+/*  collision whith S, from iso-8859-2 !!! */
+/*  {',', 'S', '\336'},  {',', 's', '\376'}, */	/* cedilla */
+/*  collision whith I. from iso-8859-3 !!!   */
+/*  {'.', 'I', '\335'},  {'.', 'i', '\375'}, */	/* dot above */
 };
 
 
@@ -1256,8 +1353,13 @@ static BOOL32 MSG_DoTranslateMessage( UINT32 message, HWND32 hwnd,
             int i;
 
             if (wp[0] == ' ') wp[0] =  dead_char;
-            if (dead_char == 0xa8) dead_char = '"';
+            if (dead_char == 0xa2) dead_char = '(';
+            else if (dead_char == 0xa8) dead_char = '"';
+	    else if (dead_char == 0xb2) dead_char = ';';
             else if (dead_char == 0xb4) dead_char = '\'';
+            else if (dead_char == 0xb7) dead_char = '<';
+            else if (dead_char == 0xb8) dead_char = ',';
+            else if (dead_char == 0xff) dead_char = '.';
             for (i = 0; i < sizeof(accent_chars)/sizeof(accent_chars[0]); i++)
                 if ((accent_chars[i].ac_accent == dead_char) &&
                     (accent_chars[i].ac_char == wp[0]))
@@ -1268,7 +1370,7 @@ static BOOL32 MSG_DoTranslateMessage( UINT32 message, HWND32 hwnd,
             dead_char = 0;
         }
         dprintf_key(stddeb, "1 -> PostMessage(%s)\n", SPY_GetMsgName(message));
-        PostMessage( hwnd, message, wp[0], lParam );
+        PostMessage16( hwnd, message, wp[0], lParam );
         return TRUE;
 
     case -1 :
@@ -1276,7 +1378,7 @@ static BOOL32 MSG_DoTranslateMessage( UINT32 message, HWND32 hwnd,
         dead_char = wp[0];
         dprintf_key( stddeb, "-1 -> PostMessage(%s)\n",
                      SPY_GetMsgName(message));
-        PostMessage( hwnd, message, wp[0], lParam );
+        PostMessage16( hwnd, message, wp[0], lParam );
         return TRUE;
     }
     return FALSE;
diff --git a/windows/msgbox.c b/windows/msgbox.c
index d8a097842c3..27a9793de50 100644
--- a/windows/msgbox.c
+++ b/windows/msgbox.c
@@ -4,7 +4,6 @@
  * Copyright 1995 Bernd Schmidt
  */
 
-#define NO_TRANSITION_TYPES  /* This file is Win32-clean */
 #include <stdio.h>
 #include "windows.h"
 #include "dlgs.h"
diff --git a/windows/nonclient.c b/windows/nonclient.c
index d4001a1d36c..d04d7df8ec5 100644
--- a/windows/nonclient.c
+++ b/windows/nonclient.c
@@ -64,7 +64,8 @@ extern HCURSOR16 CURSORICON_IconToCursor( HICON16, BOOL32 );
  * Compute the size of the window rectangle from the size of the
  * client rectangle.
  */
-static void NC_AdjustRect(LPRECT16 rect, DWORD style, BOOL menu, DWORD exStyle)
+static void NC_AdjustRect( LPRECT16 rect, DWORD style, BOOL32 menu,
+                           DWORD exStyle )
 {
     if(style & WS_ICONIC) return;
     /* Decide if the window will be managed (see CreateWindowEx) */
@@ -457,7 +458,7 @@ void NC_DrawSysButton( HWND32 hwnd, HDC32 hdc, BOOL32 down )
 /***********************************************************************
  *           NC_DrawMaxButton
  */
-static void NC_DrawMaxButton( HWND32 hwnd, HDC16 hdc, BOOL down )
+static void NC_DrawMaxButton( HWND32 hwnd, HDC16 hdc, BOOL32 down )
 {
     RECT32 rect;
     WND *wndPtr = WIN_FindWndPtr( hwnd );
@@ -477,7 +478,7 @@ static void NC_DrawMaxButton( HWND32 hwnd, HDC16 hdc, BOOL down )
 /***********************************************************************
  *           NC_DrawMinButton
  */
-static void NC_DrawMinButton( HWND32 hwnd, HDC16 hdc, BOOL down )
+static void NC_DrawMinButton( HWND32 hwnd, HDC16 hdc, BOOL32 down )
 {
     RECT32 rect;
     WND *wndPtr = WIN_FindWndPtr( hwnd );
@@ -499,7 +500,8 @@ static void NC_DrawMinButton( HWND32 hwnd, HDC16 hdc, BOOL down )
  * Draw a window frame inside the given rectangle, and update the rectangle.
  * The correct pen for the frame must be selected in the DC.
  */
-static void NC_DrawFrame( HDC16 hdc, RECT16 *rect, BOOL dlgFrame, BOOL active )
+static void NC_DrawFrame( HDC16 hdc, RECT16 *rect, BOOL32 dlgFrame,
+                          BOOL32 active )
 {
     short width, height, tmp;
 
@@ -575,7 +577,7 @@ static void NC_DrawFrame( HDC16 hdc, RECT16 *rect, BOOL dlgFrame, BOOL active )
  *
  * Draw the frame used when moving or resizing window.
  */
-static void NC_DrawMovingFrame( HDC16 hdc, RECT16 *rect, BOOL thickframe )
+static void NC_DrawMovingFrame( HDC16 hdc, RECT16 *rect, BOOL32 thickframe )
 {
     if (thickframe) FastWindowFrame( hdc, rect, SYSMETRICS_CXFRAME,
                                      SYSMETRICS_CYFRAME, PATINVERT );
@@ -590,7 +592,7 @@ static void NC_DrawMovingFrame( HDC16 hdc, RECT16 *rect, BOOL thickframe )
  * The correct pen for the window frame must be selected in the DC.
  */
 static void NC_DrawCaption( HDC16 hdc, RECT16 *rect, HWND32 hwnd,
-			    DWORD style, BOOL active )
+			    DWORD style, BOOL32 active )
 {
     RECT16 r = *rect;
     WND * wndPtr = WIN_FindWndPtr( hwnd );
@@ -647,8 +649,8 @@ static void NC_DrawCaption( HDC16 hdc, RECT16 *rect, HWND32 hwnd,
 
     if (GetWindowText32A( hwnd, buffer, sizeof(buffer) ))
     {
-	if (active) SetTextColor( hdc, GetSysColor32( COLOR_CAPTIONTEXT ) );
-	else SetTextColor( hdc, GetSysColor32( COLOR_INACTIVECAPTIONTEXT ) );
+	if (active) SetTextColor32( hdc, GetSysColor32( COLOR_CAPTIONTEXT ) );
+	else SetTextColor32( hdc, GetSysColor32( COLOR_INACTIVECAPTIONTEXT ) );
 	SetBkMode32( hdc, TRANSPARENT );
 	DrawText16( hdc, buffer, -1, &r,
                     DT_SINGLELINE | DT_CENTER | DT_VCENTER | DT_NOPREFIX );
@@ -1230,7 +1232,7 @@ static void NC_TrackMinMaxBox( HWND32 hwnd, WORD wParam )
 {
     MSG16 msg;
     HDC32 hdc = GetWindowDC32( hwnd );
-    BOOL pressed = TRUE;
+    BOOL32 pressed = TRUE;
 
     SetCapture32( hwnd );
     if (wParam == HTMINBUTTON) NC_DrawMinButton( hwnd, hdc, TRUE );
@@ -1238,7 +1240,7 @@ static void NC_TrackMinMaxBox( HWND32 hwnd, WORD wParam )
 
     do
     {
-	BOOL oldstate = pressed;
+	BOOL32 oldstate = pressed;
         MSG_InternalGetMessage( &msg, 0, 0, 0, PM_REMOVE, FALSE );
 
 	pressed = (NC_HandleNCHitTest( hwnd, msg.pt ) == wParam);
@@ -1294,7 +1296,7 @@ static void NC_TrackScrollBar( HWND32 hwnd, WPARAM32 wParam, POINT32 pt )
 
     do
     {
-        GetMessage( SEGPTR_GET(msg), 0, 0, 0 );
+        GetMessage16( SEGPTR_GET(msg), 0, 0, 0 );
 	switch(msg->message)
 	{
 	case WM_LBUTTONUP:
@@ -1311,7 +1313,7 @@ static void NC_TrackScrollBar( HWND32 hwnd, WPARAM32 wParam, POINT32 pt )
             DispatchMessage16( msg );
             break;
 	}
-        if (!IsWindow( hwnd ))
+        if (!IsWindow32( hwnd ))
         {
             ReleaseCapture();
             break;
diff --git a/windows/painting.c b/windows/painting.c
index 2c5e4f9eb31..78f60625d4e 100644
--- a/windows/painting.c
+++ b/windows/painting.c
@@ -23,7 +23,7 @@
  *           WIN_UpdateNCArea
  *
  */
-void WIN_UpdateNCArea(WND* wnd, BOOL bUpdate)
+void WIN_UpdateNCArea(WND* wnd, BOOL32 bUpdate)
 {
     POINT16 pt = {0, 0}; 
     HRGN32 hClip = 1;
@@ -413,13 +413,13 @@ BOOL32 PAINT_RedrawWindow( HWND32 hwnd, const RECT32 *rectUpdate,
            for (ppWnd = list; *ppWnd; ppWnd++)
            {
                wndPtr = *ppWnd;
-               if (!IsWindow(wndPtr->hwndSelf)) continue;
+               if (!IsWindow32(wndPtr->hwndSelf)) continue;
                if (wndPtr->dwStyle & WS_VISIBLE)
 	       {
-                   SetRectRgn( hrgn, wndPtr->rectWindow.left,
-                               wndPtr->rectWindow.top,
-                               wndPtr->rectWindow.right,
-                               wndPtr->rectWindow.bottom );
+                   SetRectRgn32( hrgn, wndPtr->rectWindow.left,
+                                 wndPtr->rectWindow.top,
+                                 wndPtr->rectWindow.right,
+                                 wndPtr->rectWindow.bottom );
                    if (!CombineRgn32( hrgn, hrgn, hrgnUpdate, RGN_AND ))
                        continue;
                    OffsetRgn32( hrgn, -wndPtr->rectClient.left,
@@ -438,7 +438,7 @@ BOOL32 PAINT_RedrawWindow( HWND32 hwnd, const RECT32 *rectUpdate,
            for (ppWnd = list; *ppWnd; ppWnd++)
            {
                wndPtr = *ppWnd;
-               if (IsWindow( wndPtr->hwndSelf ))
+               if (IsWindow32( wndPtr->hwndSelf ))
                    PAINT_RedrawWindow( wndPtr->hwndSelf, NULL, 0, flags, 0 );
 	   }
 	   HeapFree( SystemHeap, 0, list );
@@ -482,9 +482,18 @@ BOOL16 RedrawWindow16( HWND16 hwnd, const RECT16 *rectUpdate,
 
 
 /***********************************************************************
- *           UpdateWindow   (USER.124) (USER32.566)
+ *           UpdateWindow16   (USER.124)
  */
-void UpdateWindow( HWND32 hwnd )
+void UpdateWindow16( HWND16 hwnd )
+{
+    RedrawWindow32( hwnd, NULL, 0, RDW_UPDATENOW | RDW_NOCHILDREN );
+}
+
+
+/***********************************************************************
+ *           UpdateWindow32   (USER32.566)
+ */
+void UpdateWindow32( HWND32 hwnd )
 {
     RedrawWindow32( hwnd, NULL, 0, RDW_UPDATENOW | RDW_NOCHILDREN );
 }
@@ -590,7 +599,7 @@ BOOL32 GetUpdateRect32( HWND32 hwnd, LPRECT32 rect, BOOL32 erase )
 	if (wndPtr->hrgnUpdate > 1)
 	{
 	    HRGN32 hrgn = CreateRectRgn32( 0, 0, 0, 0 );
-	    if (GetUpdateRgn( hwnd, hrgn, erase ) == ERROR) return FALSE;
+	    if (GetUpdateRgn32( hwnd, hrgn, erase ) == ERROR) return FALSE;
 	    GetRgnBox32( hrgn, rect );
 	    DeleteObject32( hrgn );
 	}
@@ -601,9 +610,18 @@ BOOL32 GetUpdateRect32( HWND32 hwnd, LPRECT32 rect, BOOL32 erase )
 
 
 /***********************************************************************
- *           GetUpdateRgn   (USER.237) (USER32.297)
+ *           GetUpdateRgn16   (USER.237)
+ */
+INT16 GetUpdateRgn16( HWND16 hwnd, HRGN16 hrgn, BOOL16 erase )
+{
+    return GetUpdateRgn32( hwnd, hrgn, erase );
+}
+
+
+/***********************************************************************
+ *           GetUpdateRgn32   (USER32.297)
  */
-INT16 GetUpdateRgn( HWND32 hwnd, HRGN32 hrgn, BOOL32 erase )
+INT32 GetUpdateRgn32( HWND32 hwnd, HRGN32 hrgn, BOOL32 erase )
 {
     INT32 retval;
     WND * wndPtr = WIN_FindWndPtr( hwnd );
@@ -611,7 +629,7 @@ INT16 GetUpdateRgn( HWND32 hwnd, HRGN32 hrgn, BOOL32 erase )
 
     if (wndPtr->hrgnUpdate <= 1)
     {
-        SetRectRgn( hrgn, 0, 0, 0, 0 );
+        SetRectRgn32( hrgn, 0, 0, 0, 0 );
         return NULLREGION;
     }
     retval = CombineRgn32( hrgn, wndPtr->hrgnUpdate, 0, RGN_COPY );
@@ -621,18 +639,27 @@ INT16 GetUpdateRgn( HWND32 hwnd, HRGN32 hrgn, BOOL32 erase )
 
 
 /***********************************************************************
- *           ExcludeUpdateRgn   (USER.238) (USER32.194)
+ *           ExcludeUpdateRgn16   (USER.238)
  */
-INT16 ExcludeUpdateRgn( HDC32 hdc, HWND32 hwnd )
+INT16 ExcludeUpdateRgn16( HDC16 hdc, HWND16 hwnd )
 {
-    RECT16 rect;
+    return ExcludeUpdateRgn32( hdc, hwnd );
+}
+
+
+/***********************************************************************
+ *           ExcludeUpdateRgn32   (USER32.194)
+ */
+INT32 ExcludeUpdateRgn32( HDC32 hdc, HWND32 hwnd )
+{
+    RECT32 rect;
     WND * wndPtr;
 
     if (!(wndPtr = WIN_FindWndPtr( hwnd ))) return ERROR;
 
     if (wndPtr->hrgnUpdate)
     {
-	INT16  ret;
+	INT32 ret;
 	HRGN32 hrgn = CreateRectRgn32(wndPtr->rectWindow.left - wndPtr->rectClient.left,
 				      wndPtr->rectWindow.top - wndPtr->rectClient.top,
 				      wndPtr->rectClient.right - wndPtr->rectClient.left,
@@ -646,7 +673,7 @@ INT16 ExcludeUpdateRgn( HDC32 hdc, HWND32 hwnd )
 	DeleteObject32( hrgn );
 	return ret;
     } 
-    return GetClipBox16(hdc, &rect);
+    return GetClipBox32( hdc, &rect );
 }
 
 
diff --git a/windows/property.c b/windows/property.c
index 07625582d4e..ab6daf48ab0 100644
--- a/windows/property.c
+++ b/windows/property.c
@@ -4,7 +4,6 @@
  * Copyright 1995, 1996 Alexandre Julliard
  */
 
-#define NO_TRANSITION_TYPES  /* This file is Win32-clean */
 #include <string.h>
 #include "win.h"
 #include "heap.h"
diff --git a/windows/queue.c b/windows/queue.c
index dc99aed8c70..a74945c0e58 100644
--- a/windows/queue.c
+++ b/windows/queue.c
@@ -328,7 +328,7 @@ void QUEUE_ReceiveMessage( MESSAGEQUEUE *queue )
     dprintf_msg(stddeb, "\trcm: calling wndproc - %04x %04x %04x %08x\n",
             senderQ->hWnd, senderQ->msg, senderQ->wParam, (unsigned)senderQ->lParam );
 
-    if (IsWindow( senderQ->hWnd ))
+    if (IsWindow32( senderQ->hWnd ))
     {
         DWORD extraInfo = queue->GetMessageExtraInfoVal;
         queue->GetMessageExtraInfoVal = senderQ->GetMessageExtraInfoVal;
@@ -342,7 +342,7 @@ void QUEUE_ReceiveMessage( MESSAGEQUEUE *queue )
     else dprintf_msg(stddeb,"\trcm: bad hWnd\n");
 
     /* Return the result to the sender task */
-    ReplyMessage( result );
+    ReplyMessage16( result );
 
     queue->InSendMessageHandle = prevSender;
     queue->smResultCurrent     = prevCtrlPtr;
@@ -488,7 +488,7 @@ void QUEUE_RemoveMsg( MESSAGEQUEUE * msgQueue, int pos )
  *
  * Wake a queue upon reception of a hardware event.
  */
-static void QUEUE_WakeSomeone( UINT message )
+static void QUEUE_WakeSomeone( UINT32 message )
 {
     WND*	  wndPtr = NULL;
     WORD          wakeBit;
@@ -763,9 +763,9 @@ BOOL32 SetMessageQueue32( INT32 size )
 
 
 /***********************************************************************
- *           GetQueueStatus   (USER.334)
+ *           GetQueueStatus16   (USER.334)
  */
-DWORD GetQueueStatus( UINT flags )
+DWORD GetQueueStatus16( UINT16 flags )
 {
     MESSAGEQUEUE *queue;
     DWORD ret;
diff --git a/windows/scroll.c b/windows/scroll.c
index 682b438f983..85371bfaf91 100644
--- a/windows/scroll.c
+++ b/windows/scroll.c
@@ -7,7 +7,6 @@
  *
  */
 
-#define NO_TRANSITION_TYPES  /* This file is Win32-clean */
 #include <stdlib.h>
 #include "windows.h"
 #include "class.h"
@@ -113,7 +112,7 @@ BOOL32 ScrollWindow32( HWND32 hwnd, INT32 dx, INT32 dy, const RECT32 *rect,
 	POINT32	pt;
 	GetCaretPos32(&pt);
 	pt.x += dx; pt.y += dy;
-	SetCaretPos(pt.x, pt.y);
+	SetCaretPos32(pt.x, pt.y);
 	ShowCaret32(hCaretWnd);
     }
     return TRUE;
@@ -204,8 +203,8 @@ BOOL32 ScrollDC32( HDC32 hdc, INT32 dx, INT32 dy, const RECT32 *rc,
         /* change device clipping region directly */
 
         CombineRgn32( hrgnScrollClip, hrgnClip, 0, RGN_COPY );
-        SetRectRgn( hrgnClip, rDClip.left, rDClip.top,
-			      rDClip.right, rDClip.bottom );
+        SetRectRgn32( hrgnClip, rDClip.left, rDClip.top,
+                      rDClip.right, rDClip.bottom );
 
 	CLIPPING_UpdateGCRegion( dc );
       }
@@ -246,8 +245,8 @@ BOOL32 ScrollDC32( HDC32 hdc, INT32 dx, INT32 dy, const RECT32 *rc,
     {
 	CombineRgn32( hrgnClip, hrgnScrollClip, 0, RGN_COPY );
 	CLIPPING_UpdateGCRegion( dc );
-	SetRectRgn( hrgnScrollClip, rDClip.left, rDClip.top, 
-				    rDClip.right, rDClip.bottom );
+	SetRectRgn32( hrgnScrollClip, rDClip.left, rDClip.top, 
+                      rDClip.right, rDClip.bottom );
     }
     else
         SelectClipRgn32( hdc, 0 );
@@ -273,7 +272,7 @@ BOOL32 ScrollDC32( HDC32 hdc, INT32 dx, INT32 dy, const RECT32 *rc,
           if (dx > 0) rect.right = rect.left + dx;
           else if (dx < 0) rect.left = rect.right + dx;
           else SetRectEmpty32( &rect );
-          SetRectRgn( hrgn, rect.left, rect.top, rect.right, rect.bottom );
+          SetRectRgn32( hrgn, rect.left, rect.top, rect.right, rect.bottom );
 
           rect = rDClip;				/* horizontal band */
           if (dy > 0) rect.bottom = rect.top + dy;
@@ -449,7 +448,7 @@ rect?rect->left:0, rect?rect->top:0, rect ?rect->right:0, rect ?rect->bottom:0,
 
 	if( bCaret )
 	{
-	    SetCaretPos( rc.left + dx, rc.top + dy );
+	    SetCaretPos32( rc.left + dx, rc.top + dy );
 	    ShowCaret32(0);
 	}
 
diff --git a/windows/sysmetrics.c b/windows/sysmetrics.c
index 8bbfb5e2ccd..d63753d38db 100644
--- a/windows/sysmetrics.c
+++ b/windows/sysmetrics.c
@@ -3,10 +3,9 @@
  *
  * Copyright 1994 Alexandre Julliard
  *
-static char Copyright[] = "Copyright  Alexandre Julliard, 1994";
-*/
+ */
 
-#include <X11/Xlib.h>
+#include <stdio.h>
 #include "gdi.h"
 #include "sysmetrics.h"
 
@@ -62,7 +61,48 @@ void SYSMETRICS_Init(void)
     sysMetrics[SM_MENUDROPALIGNMENT] = GetProfileInt32A( "windows","MenuDropAlignment", 0 );
     sysMetrics[SM_PENWINDOWS] = 0;
     sysMetrics[SM_DBCSENABLED] = 0;
+    /* Win32 additions */
+    sysMetrics[SM_CMOUSEBUTTONS] = 3; /* FIXME: query X on that one */
+    sysMetrics[SM_SECURE] = 0;
+    sysMetrics[SM_CXEDGE] = SYSMETRICS_CXBORDER;
+    sysMetrics[SM_CYEDGE] = SYSMETRICS_CYBORDER;
+    sysMetrics[SM_CXMINSPACING] = SYSMETRICS_CYBORDER;
+
+/*
+SM_CXEDGE               45
+SM_CYEDGE               46
+SM_CXMINSPACING         47
+SM_CYMINSPACING         48
+SM_CXSMICON             49
+SM_CYSMICON             50
+SM_CYSMCAPTION          51
+SM_CXSMSIZE             52
+SM_CYSMSIZE             53
+SM_CXMENUSIZE           54
+SM_CYMENUSIZE           55
+SM_ARRANGE              56
+SM_CXMINIMIZED          57
+SM_CYMINIMIZED          58
+SM_CXMAXTRACK           59
+SM_CYMAXTRACK           60
+SM_CXMAXIMIZED          61
+SM_CYMAXIMIZED          62
+ */
+    sysMetrics[SM_NETWORK] = 1;
+    sysMetrics[SM_CLEANBOOT] = 0; /* 0 - ok, 1 - failsafe, 2 - failsafe & net */
+ /*
+SM_CXDRAG               68
+SM_CYDRAG               69
+  */
+    sysMetrics[SM_SHOWSOUNDS] = 1;
+ /*
+SM_CXMENUCHECK          71
+SM_CYMENUCHECK          72
+  */
+    sysMetrics[SM_SLOWMACHINE] = 0; /* FIXME: perhaps decide on type of proc */
+    sysMetrics[SM_MIDEASTENABLED] = 0; /* FIXME: 1 if enabled */
     sysMetrics[SM_CMETRICS] = SM_CMETRICS;
+
 }
 
 
diff --git a/windows/timer.c b/windows/timer.c
index 4f4ef67a11a..93f856307eb 100644
--- a/windows/timer.c
+++ b/windows/timer.c
@@ -4,7 +4,6 @@
  * Copyright 1993 Alexandre Julliard
  */
 
-#define NO_TRANSITION_TYPES  /* This file is Win32-clean */
 #include "windows.h"
 #include "queue.h"
 #include "winproc.h"
diff --git a/windows/win.c b/windows/win.c
index da44073e07b..d273b2bbe5d 100644
--- a/windows/win.c
+++ b/windows/win.c
@@ -277,7 +277,7 @@ void WIN_SendParentNotify(HWND32 hwnd, WORD event, WORD idChild, LPARAM lValue)
 {
     LPPOINT16 lppt = (LPPOINT16)&lValue;
     WND     *wndPtr = WIN_FindWndPtr( hwnd );
-    BOOL     bMouse = ((event <= WM_MOUSELAST) && (event >= WM_MOUSEFIRST));
+    BOOL32 bMouse = ((event <= WM_MOUSELAST) && (event >= WM_MOUSEFIRST));
 
     /* if lValue contains cursor coordinates they have to be
      * mapped to the client area of parent window */
@@ -483,7 +483,7 @@ static HWND32 WIN_CreateWindowEx( CREATESTRUCT32A *cs, ATOM classAtom,
     if (cs->hwndParent)
     {
 	/* Make sure parent is valid */
-        if (!IsWindow( cs->hwndParent ))
+        if (!IsWindow32( cs->hwndParent ))
         {
             fprintf( stderr, "CreateWindowEx: bad parent %04x\n", cs->hwndParent );
 	    return 0;
@@ -715,7 +715,7 @@ static HWND32 WIN_CreateWindowEx( CREATESTRUCT32A *cs, ATOM classAtom,
         }
         if (cs->hMenu) SetMenu32( hwnd, cs->hMenu );
     }
-    else wndPtr->wIDmenu = (UINT)cs->hMenu;
+    else wndPtr->wIDmenu = (UINT32)cs->hMenu;
 
     /* Send the WM_CREATE message 
      * Perhaps we shouldn't allow width/height changes as well. 
@@ -746,7 +746,7 @@ static HWND32 WIN_CreateWindowEx( CREATESTRUCT32A *cs, ATOM classAtom,
             }
 
             WIN_SendParentNotify( hwnd, WM_CREATE, wndPtr->wIDmenu, (LPARAM)hwnd );
-            if (!IsWindow(hwnd)) return 0;
+            if (!IsWindow32(hwnd)) return 0;
 
             /* Show the window, maximizing or minimizing if needed */
 
@@ -948,12 +948,12 @@ static void WIN_SendDestroyMsg( WND* pWnd )
 
   WIN_CheckFocus(pWnd);
 
-  if( CARET_GetHwnd() == pWnd->hwndSelf ) DestroyCaret();
+  if( CARET_GetHwnd() == pWnd->hwndSelf ) DestroyCaret32();
   if( !pWnd->window ) CLIPBOARD_DisOwn( pWnd ); 
   
   SendMessage32A( pWnd->hwndSelf, WM_DESTROY, 0, 0);
 
-  if( !IsWindow(pWnd->hwndSelf) )
+  if( !IsWindow32(pWnd->hwndSelf) )
   {
     dprintf_win(stddeb,"\tdestroyed itself while in WM_DESTROY!\n");
     return;
@@ -1003,7 +1003,7 @@ BOOL32 DestroyWindow32( HWND32 hwnd )
 
     if( !QUEUE_IsDoomedQueue(wndPtr->hmemTaskQ) )
 	 WIN_SendParentNotify( hwnd, WM_DESTROY, wndPtr->wIDmenu, (LPARAM)hwnd );
-    if( !IsWindow(hwnd) ) return TRUE;
+    if (!IsWindow32(hwnd)) return TRUE;
 
     if( wndPtr->window ) CLIPBOARD_DisOwn( wndPtr ); /* before window is unmapped */
 
@@ -1014,7 +1014,7 @@ BOOL32 DestroyWindow32( HWND32 hwnd )
         SetWindowPos32( hwnd, 0, 0, 0, 0, 0, SWP_HIDEWINDOW |
 		        SWP_NOACTIVATE|SWP_NOZORDER|SWP_NOMOVE|SWP_NOSIZE|
 		        ((QUEUE_IsDoomedQueue(wndPtr->hmemTaskQ))?SWP_DEFERERASE:0) );
-	if( !IsWindow(hwnd) ) return TRUE;
+	if (!IsWindow32(hwnd)) return TRUE;
     }
 
       /* Recursively destroy owned windows */
@@ -1048,7 +1048,7 @@ BOOL32 DestroyWindow32( HWND32 hwnd )
       /* Send destroy messages */
 
     WIN_SendDestroyMsg( wndPtr );
-    if( !IsWindow(hwnd) ) return TRUE;
+    if (!IsWindow32(hwnd)) return TRUE;
 
       /* Unlink now so we won't bother with the children later on */
 
@@ -1357,9 +1357,18 @@ BOOL32 IsWindowUnicode( HWND32 hwnd )
 
 
 /**********************************************************************
- *	     GetWindowWord    (USER.133) (USER32.313)
+ *	     GetWindowWord16    (USER.133)
  */
-WORD GetWindowWord( HWND32 hwnd, INT32 offset )
+WORD GetWindowWord16( HWND16 hwnd, INT16 offset )
+{
+    return GetWindowWord32( hwnd, offset );
+}
+
+
+/**********************************************************************
+ *	     GetWindowWord32    (USER32.313)
+ */
+WORD GetWindowWord32( HWND32 hwnd, INT32 offset )
 {
     WND * wndPtr = WIN_FindWndPtr( hwnd );
     if (!wndPtr) return 0;
@@ -1396,9 +1405,18 @@ HINSTANCE16 WIN_GetWindowInstance( HWND32 hwnd )
 
 
 /**********************************************************************
- *	     SetWindowWord    (USER.134) (USER32.523)
+ *	     SetWindowWord16    (USER.134)
+ */
+WORD SetWindowWord16( HWND16 hwnd, INT16 offset, WORD newval )
+{
+    return SetWindowWord32( hwnd, offset, newval );
+}
+
+
+/**********************************************************************
+ *	     SetWindowWord32    (USER32.523)
  */
-WORD SetWindowWord( HWND32 hwnd, INT32 offset, WORD newval )
+WORD SetWindowWord32( HWND32 hwnd, INT32 offset, WORD newval )
 {
     WORD *ptr, retval;
     WND * wndPtr = WIN_FindWndPtr( hwnd );
@@ -1499,7 +1517,7 @@ static LONG WIN_SetWindowLong( HWND32 hwnd, INT32 offset, LONG newval,
     {
         case GWL_ID:
         case GWL_HINSTANCE:
-            return SetWindowWord( hwnd, offset, (WORD)newval );
+            return SetWindowWord32( hwnd, offset, (WORD)newval );
 	case GWL_WNDPROC:
             retval = (LONG)WINPROC_GetProc( wndPtr->winproc, type );
             WINPROC_SetProc( &wndPtr->winproc, (WNDPROC16)newval, type );
@@ -1660,10 +1678,20 @@ INT32 GetWindowTextLength32W( HWND32 hwnd )
     return SendMessage32W( hwnd, WM_GETTEXTLENGTH, 0, 0 );
 }
 
+
+/*******************************************************************
+ *         IsWindow16   (USER.47)
+ */
+BOOL16 IsWindow16( HWND16 hwnd )
+{
+    return IsWindow32( hwnd );
+}
+
+
 /*******************************************************************
- *         IsWindow   (USER.47) (USER32.347)
+ *         IsWindow32   (USER32.347)
  */
-BOOL16 IsWindow( HWND32 hwnd )
+BOOL32 IsWindow32( HWND32 hwnd )
 {
     WND * wndPtr = WIN_FindWndPtr( hwnd );
     return ((wndPtr != NULL) && (wndPtr->dwMagic == WND_MAGIC));
@@ -1730,7 +1758,7 @@ HWND32 SetParent32( HWND32 hwndChild, HWND32 hwndNewParent )
     if (hwndNewParent) wndPtr->parent = pWndParent;
     WIN_LinkWindow(hwndChild, HWND_BOTTOM);
     
-    if (IsWindowVisible32(hwndChild)) UpdateWindow(hwndChild);
+    if (IsWindowVisible32(hwndChild)) UpdateWindow32(hwndChild);
     
     return oldParent;
 }
@@ -1981,7 +2009,7 @@ BOOL16 EnumWindows16( WNDENUMPROC16 lpEnumFunc, LPARAM lParam )
     for (ppWnd = list; *ppWnd; ppWnd++)
     {
         /* Make sure that the window still exists */
-        if (!IsWindow((*ppWnd)->hwndSelf)) continue;
+        if (!IsWindow32((*ppWnd)->hwndSelf)) continue;
         if (!lpEnumFunc( (*ppWnd)->hwndSelf, lParam )) break;
     }
     HeapFree( SystemHeap, 0, list );
@@ -2016,7 +2044,7 @@ BOOL16 EnumTaskWindows16( HTASK16 hTask, WNDENUMPROC16 func, LPARAM lParam )
     for (ppWnd = list; *ppWnd; ppWnd++)
     {
         /* Make sure that the window still exists */
-        if (!IsWindow((*ppWnd)->hwndSelf)) continue;
+        if (!IsWindow32((*ppWnd)->hwndSelf)) continue;
         if ((*ppWnd)->hmemTaskQ != hQueue) continue;  /* Check the queue */
         if (!func( (*ppWnd)->hwndSelf, lParam )) break;
     }
@@ -2050,7 +2078,7 @@ static BOOL16 WIN_EnumChildWindows( WND **ppWnd, WNDENUMPROC16 func,
     while (*ppWnd)
     {
         /* Make sure that the window still exists */
-        if (!IsWindow((*ppWnd)->hwndSelf)) continue;
+        if (!IsWindow32((*ppWnd)->hwndSelf)) continue;
         /* Build children list first */
         if (!(childList = WIN_BuildWinArray( *ppWnd ))) return FALSE;
         if (!func( (*ppWnd)->hwndSelf, lParam )) return FALSE;
@@ -2306,11 +2334,10 @@ BOOL32 DragDetect32( HWND32 hWnd, POINT32 pt )
 }
 
 /******************************************************************************
- *                              DragObject ( USER.464 )
- *
+ *             DragObject16   (USER.464)
  */
-DWORD DragObject(HWND16 hwndScope, HWND16 hWnd, WORD wObj, HANDLE16 hOfStruct,
-                WORD szList , HCURSOR16 hCursor)
+DWORD DragObject16( HWND16 hwndScope, HWND16 hWnd, UINT16 wObj,
+                    HANDLE16 hOfStruct, WORD szList, HCURSOR16 hCursor )
 {
  MSG16	 	msg;
  LPDRAGINFO	lpDragInfo;
diff --git a/windows/winpos.c b/windows/winpos.c
index d8029818d92..876e65b40b8 100644
--- a/windows/winpos.c
+++ b/windows/winpos.c
@@ -5,7 +5,6 @@
  *                       1995,1996 Alex Korobka
  */
 
-#define NO_TRANSITION_TYPES
 #include <X11/Xlib.h>
 #include <X11/Xutil.h>
 #include <X11/Xatom.h>
@@ -778,7 +777,7 @@ BOOL32 ShowWindow32( HWND32 hwnd, INT32 cmd )
     if (showFlag != wasVisible)
     {
         SendMessage16( hwnd, WM_SHOWWINDOW, showFlag, 0 );
-        if (!IsWindow( hwnd )) return wasVisible;
+        if (!IsWindow32( hwnd )) return wasVisible;
     }
 
     if ((wndPtr->dwStyle & WS_CHILD) &&
@@ -795,7 +794,7 @@ BOOL32 ShowWindow32( HWND32 hwnd, INT32 cmd )
         if (wndPtr->dwStyle & WS_CHILD)
             swpflags |= SWP_NOACTIVATE | SWP_NOZORDER;
         SetWindowPos32( hwnd, HWND_TOP, x, y, cx, cy, swpflags );
-        if (!IsWindow( hwnd )) return wasVisible;
+        if (!IsWindow32( hwnd )) return wasVisible;
     }
 
     if (wndPtr->flags & WIN_NEED_SIZE)
@@ -1026,7 +1025,7 @@ BOOL32 WINPOS_SetActiveWindow( HWND32 hWnd, BOOL32 fMouse, BOOL32 fChangeFocus)
     }
 
     /* set prev active wnd to current active wnd and send notification */
-    if ((hwndPrevActive = hwndActive) && IsWindow(hwndPrevActive))
+    if ((hwndPrevActive = hwndActive) && IsWindow32(hwndPrevActive))
     {
         if (!SendMessage16( hwndPrevActive, WM_NCACTIVATE, FALSE, 0 ))
         {
@@ -1076,7 +1075,7 @@ BOOL32 WINPOS_SetActiveWindow( HWND32 hWnd, BOOL32 fMouse, BOOL32 fChangeFocus)
 	if( wndTemp != wndPtr )
 	    SetWindowPos32(hWnd, HWND_TOP, 0,0,0,0, 
 			   SWP_NOSIZE | SWP_NOMOVE | SWP_NOACTIVATE );
-        if( !IsWindow(hWnd) ) return 0;
+        if (!IsWindow32(hWnd)) return 0;
     }
 
     hNewActiveQueue = wndPtr ? wndPtr->hmemTaskQ : 0;
@@ -1090,7 +1089,7 @@ BOOL32 WINPOS_SetActiveWindow( HWND32 hWnd, BOOL32 fMouse, BOOL32 fChangeFocus)
         {
             for (ppWnd = list; *ppWnd; ppWnd++)
             {
-                if (!IsWindow( (*ppWnd)->hwndSelf )) continue;
+                if (!IsWindow32( (*ppWnd)->hwndSelf )) continue;
 
                 if ((*ppWnd)->hmemTaskQ == hOldActiveQueue)
                    SendMessage16( (*ppWnd)->hwndSelf, WM_ACTIVATEAPP,
@@ -1106,7 +1105,7 @@ BOOL32 WINPOS_SetActiveWindow( HWND32 hWnd, BOOL32 fMouse, BOOL32 fChangeFocus)
         {
             for (ppWnd = list; *ppWnd; ppWnd++)
             {
-                if (!IsWindow( (*ppWnd)->hwndSelf )) continue;
+                if (!IsWindow32( (*ppWnd)->hwndSelf )) continue;
 
                 if ((*ppWnd)->hmemTaskQ == hNewActiveQueue)
                    SendMessage16( (*ppWnd)->hwndSelf, WM_ACTIVATEAPP,
@@ -1114,7 +1113,7 @@ BOOL32 WINPOS_SetActiveWindow( HWND32 hWnd, BOOL32 fMouse, BOOL32 fChangeFocus)
             }
             HeapFree( SystemHeap, 0, list );
         }
-	if (!IsWindow(hWnd)) return 0;
+	if (!IsWindow32(hWnd)) return 0;
     }
 
     if (hWnd)
@@ -1136,7 +1135,7 @@ BOOL32 WINPOS_SetActiveWindow( HWND32 hWnd, BOOL32 fMouse, BOOL32 fChangeFocus)
                       MAKELPARAM( (HWND16)hwndPrevActive, wIconized) );
 #endif
 
-        if( !IsWindow(hWnd) ) return 0;
+        if( !IsWindow32(hWnd) ) return 0;
     }
 
     /* change focus if possible */
@@ -1519,7 +1518,8 @@ static UINT32 WINPOS_SizeMoveClean(WND* Wnd, HRGN32 oldVisRgn, LPRECT16 lpOldWnd
          width = lpOldClientRect->right - xfrom; height = lpOldClientRect->bottom - yfrom;
 	 updateRgn = CreateRectRgn32( 0, 0, width, height );
 	 CombineRgn32( newVisRgn, newVisRgn, updateRgn, RGN_AND );
-	 SetRectRgn( updateRgn, 0, 0, Wnd->rectClient.right - xto, Wnd->rectClient.bottom - yto );
+	 SetRectRgn32( updateRgn, 0, 0, Wnd->rectClient.right - xto,
+                       Wnd->rectClient.bottom - yto );
        }
      else
        {
@@ -1997,13 +1997,13 @@ BOOL32 SetWindowPos32( HWND32 hwnd, HWND32 hwndInsertAfter, INT32 x, INT32 y,
             /* Revert focus to parent */
             SetFocus32( GetParent32(winpos->hwnd) );
         }
-	if (hwnd == CARET_GetHwnd()) DestroyCaret();
+	if (hwnd == CARET_GetHwnd()) DestroyCaret32();
 
 	if (winpos->hwnd == hwndActive)
 	{
 	      /* Activate previously active window if possible */
 	    HWND32 newActive = hwndPrevActive;
-	    if (!IsWindow(newActive) || (newActive == winpos->hwnd))
+	    if (!IsWindow32(newActive) || (newActive == winpos->hwnd))
 	    {
 		newActive = GetTopWindow32( GetDesktopWindow32() );
 		if (newActive == winpos->hwnd)
diff --git a/windows/winproc.c b/windows/winproc.c
index e8946ee1810..d7a196ad196 100644
--- a/windows/winproc.c
+++ b/windows/winproc.c
@@ -235,6 +235,7 @@ static WINDOWPROC *WINPROC_AllocWinProc( WNDPROC16 func, WINDOWPROCTYPE type )
  */
 WNDPROC16 WINPROC_GetProc( HWINDOWPROC proc, WINDOWPROCTYPE type )
 {
+    if (!proc) return NULL;
     if (type == WIN_PROC_16)  /* We want a 16:16 address */
     {
         if (((WINDOWPROC *)proc)->type == WIN_PROC_16)
diff --git a/wine.man b/wine.man
index 6445a31d50c..fa20fd4c419 100644
--- a/wine.man
+++ b/wine.man
@@ -109,7 +109,7 @@ Start as an icon
 .I -language xx
 Set the language to
 .I xx
-(one of En, Es, De, No, Fr, Fi, Da, Cz, Eo, It, Ko, Hu)
+(one of En, Es, De, No, Fr, Fi, Da, Cz, Eo, It, Ko, Hu, Pl)
 .TP
 .I -managed
 Create each top-level window as a properly managed X window
-- 
GitLab