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.
diff --git a/ANNOUNCE b/ANNOUNCE
index 10dc576..1c03369 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 @@
 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 2b492bf..3a722b6 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,4 +1,104 @@
 ----------------------------------------------------------------------
+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 13740b5..9ff371b 100755
--- a/configure
+++ b/configure
@@ -2043,7 +2043,7 @@
 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 18f803c..185a464 100644
--- a/configure.in
+++ b/configure.in
@@ -104,7 +104,7 @@
 
 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 92759b7..2058887 100644
--- a/controls/button.c
+++ b/controls/button.c
@@ -303,9 +303,9 @@
             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 @@
 
 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 @@
     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 @@
         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 @@
 
     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 72aca44..f8fccf8 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 @@
   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 @@
 /***********************************************************************
  *             CBCheckSize
  */
-static BOOL CBCheckSize(HWND16 hwnd)
+static BOOL32 CBCheckSize(HWND16 hwnd)
 {
   LPHEADCOMBO  lphc = ComboGetStorageHeader(hwnd);
   LPHEADLIST   lphl = ComboGetListHeader(hwnd);
@@ -711,7 +711,7 @@
                  }
                 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 @@
 /***********************************************************************
  *           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 @@
 /***********************************************************************
  *             CBLCheckSize
  */
-static BOOL CBLCheckSize(HWND16 hwnd)
+static BOOL32 CBLCheckSize(HWND16 hwnd)
 {
   LPHEADCOMBO  lphc = ComboGetStorageHeader(hwnd);
   LPHEADLIST   lphl = ComboGetListHeader(hwnd);
@@ -1218,7 +1218,7 @@
 /***********************************************************************
  *           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 db876a8..2466ea7 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 @@
 	 (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 @@
 	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 8e7b59f..3187698 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 @@
 		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 @@
 	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 @@
 	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 @@
 		}
 		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 @@
 	GlobalUnlock16(hdst);
 	OpenClipboard32(wndPtr->hwndSelf);
 	EmptyClipboard32();
-	SetClipboardData(CF_TEXT, hdst);
+	SetClipboardData16(CF_TEXT, hdst);
 	CloseClipboard32();
 	return -1;
 }
@@ -3530,7 +3530,7 @@
 	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 @@
 		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 @@
 	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 @@
 	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 @@
 	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 @@
 	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 db00116..57afcf4 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 @@
         }
         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 @@
             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 @@
     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 6f0c071..29d073c 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 @@
     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 @@
       /* 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 @@
     {
 	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 @@
                                         ? 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 @@
 		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 87e6a5a..cbecfd9 100644
--- a/controls/oldlbox.c
+++ b/controls/oldlbox.c
@@ -66,7 +66,7 @@
   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 @@
 }
 
 
-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 @@
       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 @@
       }
 
       if (itemState != 0) {
-	SetTextColor(hdc, dwOldTextColor);
+	SetTextColor32(hdc, dwOldTextColor);
       }
       
       SetBkMode32(hdc, OldBkMode);
@@ -303,7 +303,7 @@
   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 @@
  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 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 ListBoxGetText(LPHEADLIST lphl, UINT uIndex, LPSTR OutStr)
+int ListBoxGetText(LPHEADLIST lphl, UINT16 uIndex, LPSTR OutStr)
 {
   LPLISTSTRUCT lpls;
 
@@ -498,7 +498,7 @@
 }
 
 
-DWORD ListBoxGetItemData(LPHEADLIST lphl, UINT uIndex)
+DWORD ListBoxGetItemData(LPHEADLIST lphl, UINT16 uIndex)
 {
   LPLISTSTRUCT lpls;
 
@@ -508,7 +508,7 @@
 }
 
 
-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 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 @@
   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 @@
   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 @@
     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 @@
 
 /* ------------------------- 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 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 14c3f40..819ff5d 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 9842f06..77e6c55 100644
--- a/controls/static.c
+++ b/controls/static.c
@@ -67,7 +67,8 @@
 /***********************************************************************
  *           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 @@
             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 @@
             if (LOWORD(lParam))
             {
                 InvalidateRect32( hWnd, NULL, FALSE );
-                UpdateWindow( hWnd );
+                UpdateWindow32( hWnd );
             }
             break;
 
@@ -168,7 +169,7 @@
 	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 17c4372..feef96c 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 0d5e219..ffc2a23 100644
--- a/controls/widgets.c
+++ b/controls/widgets.c
@@ -94,7 +94,7 @@
  * 
  * 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 3f5d49d..2ab72d1 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 b87291a..0f0b9fb 100644
--- a/debugger/dbg.y
+++ b/debugger/dbg.y
@@ -49,7 +49,7 @@
 %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 @@
     | 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 @@
       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_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 d33b4c0..1322df6 100644
--- a/debugger/debug.l
+++ b/debugger/debug.l
@@ -112,7 +112,8 @@
 <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 fd7e8c6..b3ac40d 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 6968c06..1735eda 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 dd5b76a..10ffc97 100644
--- a/debugger/info.c
+++ b/debugger/info.c
@@ -121,7 +121,7 @@
     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 @@
 "  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 d9c6412..2e3f073 100644
--- a/debugger/source.c
+++ b/debugger/source.c
@@ -426,6 +426,94 @@
   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 4b8bead..51bd0fc 100644
--- a/documentation/debugging
+++ b/documentation/debugging
@@ -8,7 +8,8 @@
 
 |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 @@
 |
 |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 @@
  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 @@
   
  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 @@
 
   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 @@
 |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 @@
                                    ^
 				   | -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 @@
 |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
-|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
-|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
 
-    The filename is "C:\~DOCD03D.TMP". Of course, C:\ is writeable for the
+|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
+
+|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:\~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
     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 71f2d6b..ef4aa6d 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 @@
 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 4a2735e..788ae6d 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 8b04493..dabebf8 100644
--- a/files/drive.c
+++ b/files/drive.c
@@ -582,7 +582,7 @@
  */
 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 9e8a042..15b6b1a 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 @@
  *
  * 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 @@
  */
 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 @@
  * 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 @@
  *
  * 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 @@
  */
 int FILE_GetUnixHandle( HFILE32 hFile )
 {
-    DOS_FILE *file;
+    FILE_OBJECT *file;
     int ret;
 
     if (!(file = FILE_GetFile( hFile ))) return -1;
@@ -183,7 +178,7 @@
 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 @@
 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 @@
         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 @@
 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 @@
         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 @@
 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 @@
  */
 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_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 @@
             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 @@
                      "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 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 @@
  */
 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 _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 @@
 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 @@
     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 @@
 {
     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 _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 @@
     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 @@
  */
 BOOL32 FlushFileBuffers( HFILE32 hFile )
 {
-    DOS_FILE *file;
+    FILE_OBJECT *file;
     BOOL32 ret;
 
     dprintf_file( stddeb, "FlushFileBuffers(%d)\n", hFile );
@@ -1077,7 +1073,7 @@
  */
 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 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 );
@@ -1155,11 +1151,48 @@
 
 
 /***********************************************************************
+ *           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 @@
                     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 5339596..ddb1129 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 ff538f2..b0cd835 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 ad71b99..0c408ad 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 @@
 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 6edc8df..678ed90 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 @@
 
     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 3a9b742..fec0eb0 100644
--- a/graphics/win16drv/init.c
+++ b/graphics/win16drv/init.c
@@ -75,7 +75,7 @@
     NULL,                            /* pScaleViewportExtEx */
     NULL,                            /* pScaleWindowExtEx */
     NULL,                            /* pSelectClipRgn */
-    NULL,                            /* pSelectObject */
+    WIN16DRV_SelectObject,           /* pSelectObject */
     NULL,                            /* pSelectPalette */
     NULL,                            /* pSetBkColor */
     NULL,                            /* pSetBkMode */
@@ -690,8 +690,7 @@
     /* 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 @@
     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 @@
 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 @@
 
     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 0000000..c865790
--- /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 9001dad..daa860c 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 d0cc825..b302248 100644
--- a/graphics/x11drv/bitmap.c
+++ b/graphics/x11drv/bitmap.c
@@ -56,7 +56,8 @@
     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 3f16ec4..140ca75 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 3a4386c..44b86ee 100644
--- a/if1632/builtin.c
+++ b/if1632/builtin.c
@@ -187,14 +187,14 @@
 
     /* 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 @@
 
     /* 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 af8dc31..71da3bc 100644
--- a/if1632/gdi.spec
+++ b/if1632/gdi.spec
@@ -2,7 +2,7 @@
 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 @@
 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 @@
 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 @@
 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 @@
 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 @@
 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 @@
 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 @@
 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 @@
 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 @@
 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 dd65603..90b502c 100644
--- a/if1632/gdi32.spec
+++ b/if1632/gdi32.spec
@@ -4,9 +4,9 @@
 
 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 @@
 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 @@
 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 @@
 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 @@
 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 @@
 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 @@
 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 @@
 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 @@
 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 @@
 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 @@
 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 75faa9b..422e68e 100644
--- a/if1632/kernel.spec
+++ b/if1632/kernel.spec
@@ -41,7 +41,7 @@
 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 @@
 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 @@
 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 @@
 #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 2c51b8f..f8281ee 100644
--- a/if1632/kernel32.spec
+++ b/if1632/kernel32.spec
@@ -278,10 +278,10 @@
 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 @@
 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 @@
 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 @@
 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 @@
 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 @@
 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 6ec752c..482ff50 100644
--- a/if1632/mmsystem.spec
+++ b/if1632/mmsystem.spec
@@ -5,7 +5,7 @@
 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 @@
 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 2208e91..7ac608f 100644
--- a/if1632/ntdll.spec
+++ b/if1632/ntdll.spec
@@ -892,15 +892,15 @@
 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 @@
 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 49b2b2f..1fb5bc3 100644
--- a/if1632/ole2nls.spec
+++ b/if1632/ole2nls.spec
@@ -7,7 +7,7 @@
 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 75b4eb8..045bb16 100644
--- a/if1632/relay.c
+++ b/if1632/relay.c
@@ -190,15 +190,28 @@
  * (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 @@
         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 c9c907d..eaf6ec9 100644
--- a/if1632/shell.spec
+++ b/if1632/shell.spec
@@ -12,11 +12,11 @@
  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 b7c65f7..bef7073 100644
--- a/if1632/shell32.spec
+++ b/if1632/shell32.spec
@@ -86,7 +86,7 @@
 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 1d33e67..f566103 100644
--- a/if1632/thunk.c
+++ b/if1632/thunk.c
@@ -148,7 +148,7 @@
                              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 @@
     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 @@
         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 @@
 	);
 	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 1bff1ca..564e790 100644
--- a/if1632/user.spec
+++ b/if1632/user.spec
@@ -47,7 +47,7 @@
 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 @@
 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 @@
 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 @@
 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 @@
 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 @@
 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 @@
 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 @@
 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 20ac214..71f7f0b 100644
--- a/if1632/user32.spec
+++ b/if1632/user32.spec
@@ -67,7 +67,7 @@
 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 @@
 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 @@
 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 @@
 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 @@
 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 @@
 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 @@
 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 @@
 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 @@
 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 @@
 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 @@
 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 @@
 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 @@
 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 @@
 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 3bd8cff..0000000
--- 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 9dcf165..7ef5fb2 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 @@
 
 #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 @@
 				       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 34f3bcf..d0070df 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 64511e5..82fe86c 100644
--- a/include/combo.h
+++ b/include/combo.h
@@ -17,5 +17,5 @@
   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 1761991..4e85561 100644
--- a/include/commdlg.h
+++ b/include/commdlg.h
@@ -62,8 +62,8 @@
 	SEGPTR 		lpstrInitialDir;
 	SEGPTR 		lpstrTitle;
 	DWORD		Flags;
-	UINT		nFileOffset;
-	UINT		nFileExtension;
+	UINT16		nFileOffset;
+	UINT16		nFileExtension;
 	SEGPTR		lpstrDefExt;
 	LPARAM 		lCustData;
         WNDPROC16       lpfnHook;
@@ -101,8 +101,8 @@
 	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 @@
 							/* 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 @@
 	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 @@
 #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 @@
 #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);
+BOOL16  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);
+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 cf00d28..12cd82d 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 84697cf..e8a7ab1 100644
--- a/include/dde_proc.h
+++ b/include/dde_proc.h
@@ -51,9 +51,9 @@
 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 7dc0330..32bd72c 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 @@
 #else
     0,
 #endif
+#ifdef DEBUG_VIRTUAL
+    1,
+#else
+    0,
+#endif
 #ifdef DEBUG_VXD
     1,
 #else
@@ -1497,8 +1504,21 @@
 #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 @@
 #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 @@
 #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 @@
 #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 @@
 #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 @@
     "timer",
     "toolhelp",
     "ver",
+    "virtual",
     "vxd",
     "win",
     "win16drv",
diff --git a/include/debugger.h b/include/debugger.h
index 1a1f02a..a6670ce 100644
--- a/include/debugger.h
+++ b/include/debugger.h
@@ -307,6 +307,7 @@
 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 16ee0e2..3eb7b7d 100644
--- a/include/driver.h
+++ b/include/driver.h
@@ -54,7 +54,7 @@
     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 a2bd376..bb33157 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_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 12456ad..528fd66 100644
--- a/include/font.h
+++ b/include/font.h
@@ -24,26 +24,6 @@
 #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 7699eed..9fa3021 100644
--- a/include/handle32.h
+++ b/include/handle32.h
@@ -42,5 +42,8 @@
 
 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 6014a3b..addeb84 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 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 d3f97ad..27cee05 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 @@
 	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 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 ee6171f..0ad2700 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 4f96014..56bc611 100644
--- a/include/mmsystem.h
+++ b/include/mmsystem.h
@@ -19,7 +19,7 @@
 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 @@
 #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 @@
 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 @@
 #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 @@
 #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 @@
     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);
+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, UINT uMessage, DWORD dw1, DWORD dw2);
+DWORD waveOutMessage(HWAVEOUT16 hWaveOut, UINT16 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 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);
+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, UINT uMessage, DWORD dw1, DWORD dw2);
+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 @@
 #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 @@
 #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 @@
 #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);
+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, UINT uMessage, DWORD dw1, DWORD dw2);
+DWORD midiOutMessage(HMIDIOUT16 hMidiOut, UINT16 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 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);
+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, UINT uMessage, DWORD dw1, DWORD dw2);
+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 @@
 #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 @@
 #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 @@
 #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 @@
                 ( (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 {
 	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 @@
 	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 {
 	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 {
 	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 @@
 	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 {
 	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 {
 	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 {
 	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 @@
 } 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 @@
 #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 953cdfb..872b498 100644
--- a/include/module.h
+++ b/include/module.h
@@ -137,7 +137,7 @@
 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 fdff577..0692ee0 100644
--- a/include/ole.h
+++ b/include/ole.h
@@ -139,13 +139,13 @@
 } 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 _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 @@
 	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 @@
 	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 @@
 
 
 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 421f3e6..3f051d6 100644
--- a/include/options.h
+++ b/include/options.h
@@ -23,7 +23,8 @@
     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 c75450c..d60affc 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 673a2f5..cbb00ee 100644
--- a/include/selectors.h
+++ b/include/selectors.h
@@ -18,38 +18,24 @@
                                    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 c664cc4..45a8fff 100644
--- a/include/static.h
+++ b/include/static.h
@@ -17,6 +17,7 @@
     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 d09f25d..46c012c 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 0d1ef93..86f718c 100644
--- a/include/stress.h
+++ b/include/stress.h
@@ -11,16 +11,16 @@
 #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 dbebe81..fbf21a8 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 @@
     FARPROC16   lpfnErrorAddr;
     void      **lpBadParam;
 } NFYLOGPARAMERROR;
+
+#pragma pack(4)
+
 #endif /* __WINE_TOOLHELP_H */
diff --git a/include/w32sys.h b/include/w32sys.h
index 6388b6c..94c8d29 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 c6d7349..6b2c8a8 100644
--- a/include/win16drv.h
+++ b/include/win16drv.h
@@ -161,4 +161,7 @@
 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 45ce754..ed071eb 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 3bc9505..6448f63 100644
--- a/include/windows.h
+++ b/include/windows.h
@@ -1426,6 +1426,45 @@
 #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 @@
   /* 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 @@
 #define SM_MENUDROPALIGNMENT  40
 #define SM_PENWINDOWS         41
 #define SM_DBCSENABLED        42
+#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           43
+#define SM_CMETRICS           75
 
   /* Device-independent bitmaps */
 
@@ -2232,6 +2304,7 @@
 #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(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 @@
 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      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 @@
 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      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     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 @@
 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 @@
 /* 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 @@
 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       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 @@
 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     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 @@
 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 @@
 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 @@
 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 @@
 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 @@
 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 @@
 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 @@
 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 @@
 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 @@
 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 @@
 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 @@
 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 @@
 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 @@
 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 @@
 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 @@
 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 @@
 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 @@
 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 @@
 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 @@
 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     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 @@
 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 @@
 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 @@
 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 @@
 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 @@
 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 @@
 #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 @@
 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 @@
 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       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 @@
 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       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 @@
 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      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 @@
 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 28cc005..75716bf 100644
--- a/include/winerror.h
+++ b/include/winerror.h
@@ -21,6 +21,7 @@
 #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 @@
 #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 0dfe7a3..ed813b7 100644
--- a/include/winsock.h
+++ b/include/winsock.h
@@ -499,7 +499,7 @@
   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 c6b69ab..05d3869 100644
--- a/include/wintypes.h
+++ b/include/wintypes.h
@@ -168,6 +168,13 @@
 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 59d8942..2f72bc3 100644
--- a/ipc/dde_proc.c
+++ b/ipc/dde_proc.c
@@ -148,7 +148,7 @@
 }
 
 /* wait for dde - acknowledge message - or timout */
-static BOOL get_ack()
+static BOOL32 get_ack()
 {
     struct timeval timeout;
     int size;
@@ -186,7 +186,7 @@
 }
 
 /* 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 @@
   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 @@
   }
 }
 
-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 @@
   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 @@
     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 df0449b..98d4e17 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 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 @@
   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 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 @@
 
 
 /********** 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 @@
  */
 
 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 @@
 }
 
 
-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_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 6bd296f..daa3409 100644
--- a/ipc/generic_hash.h
+++ b/ipc/generic_hash.h
@@ -48,7 +48,7 @@
 				/* 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 @@
 				   (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 @@
  *        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 ebe155d..cc5bd3a 100644
--- a/library/libres.c
+++ b/library/libres.c
@@ -58,7 +58,7 @@
       typeid=atoi(type+1);
     else
     {
-      WINELIB_UNIMP("LIBRES_FindResource16(*,*,type=string)");
+      fprintf(stderr,"LIBRES_FindResource16(*,*,type=string)");
       return 0;
     }
   }
@@ -112,7 +112,7 @@
     }
     else
     {
-      WINELIB_UNIMP("LIBRES_FindResource32(*,*,type=string)");
+      fprintf(stderr,"LIBRES_FindResource32(*,*,type=string)");
       return 0;
     }
   }
@@ -154,7 +154,7 @@
 /**********************************************************************
  *	    LIBRES_FreeResource    
  */
-BOOL LIBRES_FreeResource( HGLOBAL32 handle )
+BOOL32 LIBRES_FreeResource( HGLOBAL32 handle )
 {
   return 0; /* Obsolete in Win32 */
 }
@@ -165,7 +165,7 @@
  */
 INT32 LIBRES_AccessResource( HINSTANCE32 hModule, HRSRC32 hRsrc )
 {
-  WINELIB_UNIMP("LIBRES_AccessResource()");
+  fprintf(stderr,"LIBRES_AccessResource()");
   return -1; /* Obsolete in Win32 */
 }
 
@@ -184,7 +184,7 @@
  */
 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 e6177ee..0b021da 100644
--- a/library/miscstubs.c
+++ b/library/miscstubs.c
@@ -45,18 +45,18 @@
   }
 }
 
-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 64854d6..8fd8b5d 100644
--- a/loader/main.c
+++ b/loader/main.c
@@ -60,10 +60,14 @@
     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 4f4c1e4..b247489 100644
--- a/loader/module.c
+++ b/loader/module.c
@@ -848,7 +848,7 @@
     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 @@
 		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 @@
 		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 @@
 
 
 /**********************************************************************
- *	    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 @@
 
 
 /**********************************************************************
- *	    GetModuleHandle    (KERNEL.47)
+ *	    GetModuleHandle16    (KERNEL.47)
  */
 HMODULE16 WIN16_GetModuleHandle( SEGPTR name )
 {
@@ -1296,7 +1296,7 @@
     return MODULE_FindModule( PTR_SEG_TO_LIN(name) );
 }
 
-HMODULE16 GetModuleHandle( LPCSTR name )
+HMODULE16 GetModuleHandle16( LPCSTR name )
 {
     return MODULE_FindModule( name );
 }
@@ -1410,9 +1410,9 @@
 
 
 /***********************************************************************
- *           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 @@
 	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 @@
             {
                 p = filename + strlen(filename);
                 strcpy( p, ".exe" );
-                handle = LoadModule( filename, &params );
+                handle = LoadModule16( filename, &params );
                 *p = '\0';  /* Remove extension */
             }
 	}
@@ -1675,7 +1675,7 @@
  */
 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 9bbdf21..f81cf82 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 @@
     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 @@
  	
  	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 @@
  */
 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 @@
             p += (sel == 0xff) ? 6 : 3;  
         }
     }
-#endif
 }
 
 
@@ -452,12 +445,11 @@
  *
  * 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 @@
         (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 @@
         }
         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 59d15cb..24cf3e9 100644
--- a/loader/pe_image.c
+++ b/loader/pe_image.c
@@ -406,9 +406,9 @@
 	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 @@
 		[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 @@
 	}
 	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 08655d0..2d2bbaf 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 @@
     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 d2f50fe..37dc9c1 100644
--- a/loader/resource.c
+++ b/loader/resource.c
@@ -111,9 +111,15 @@
     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 e1fba1f..17739ec 100644
--- a/loader/signal.c
+++ b/loader/signal.c
@@ -48,6 +48,21 @@
 	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 @@
  *
  * 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 @@
  * 
  * 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 @@
  * 
  * 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 @@
  *
  * SIGTRAP handler.
  */
-#ifdef linux
-static void SIGNAL_trap(int signal, SIGCONTEXT context_struct)
+static
+HANDLER_DEF(SIGNAL_trap)
 {
-    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)
-{
-#endif
-    wine_debug( signal, context );  /* Enter our debugger */
+  HANDLER_PROLOG;
+  wine_debug( signal, context );  /* Enter our debugger */
+  HANDLER_EPILOG;
 }
 
 
@@ -132,30 +135,24 @@
  *
  * Segfault handler.
  */
-#ifdef linux
-static void SIGNAL_fault(int signal, SIGCONTEXT context_struct)
+static
+HANDLER_DEF(SIGNAL_fault)
 {
-    SIGCONTEXT *context = &context_struct;
-#elif defined(__svr4__) || defined(_SCO_DS)
-static void SIGNAL_fault(int signal, void *siginfo, SIGCONTEXT *context)
-{
-#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 d9a666f..38e6028 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 @@
  *
  * 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 @@
 #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 @@
          * ss   stack selector
          * sp   top of the stack
          */
+        CONTEXT context;
 
-        cs_reg = pSegTable[pModule->cs - 1].selector;
-        ip_reg = pModule->ip;
-        ds_reg = pSegTable[pModule->dgroup - 1].selector;
+        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=%04x:%04x ds=%04x ss:sp=%04x:%04x\n",
-                      cs_reg, ip_reg, ds_reg,
-                      IF1632_Saved16_ss, IF1632_Saved16_sp);
+        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_( (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*/ );
+        CallTo16_regs_( &context );
         /* This should never return */
         fprintf( stderr, "TASK_CallToStart: Main program returned!\n" );
         TASK_KillCurrentTask( 1 );
@@ -498,7 +501,8 @@
     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 @@
             (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 @@
 
 
 /***********************************************************************
- *           GetAppCompatFlags   (KERNEL.354) (USER32.205)
+ *           GetAppCompatFlags16   (KERNEL.354)
  */
-DWORD GetAppCompatFlags( HTASK32 hTask )
+DWORD GetAppCompatFlags16( HTASK16 hTask )
+{
+    return GetAppCompatFlags32( hTask );
+}
+
+
+/***********************************************************************
+ *           GetAppCompatFlags32   (USER32.205)
+ */
+DWORD GetAppCompatFlags32( HTASK32 hTask )
 {
     TDB *pTask;
 
diff --git a/memory/Makefile.in b/memory/Makefile.in
index d473cd0..0214f91 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 @@
 	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 3b15549..1a5c12e 100644
--- a/memory/global.c
+++ b/memory/global.c
@@ -604,7 +604,7 @@
    
    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 494b115..75e5adc 100644
--- a/memory/heap.c
+++ b/memory/heap.c
@@ -266,12 +266,12 @@
     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 @@
         /* 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 @@
     {
         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 bbb25c6..1da0768 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 0000000..0cc397a
--- /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 bc64aac..9282a44 100644
--- a/misc/clipboard.c
+++ b/misc/clipboard.c
@@ -45,7 +45,7 @@
 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 @@
 /**************************************************************************
  *			CLIPBOARD_RequestXSelection
  */
-BOOL CLIPBOARD_RequestXSelection()
+BOOL32 CLIPBOARD_RequestXSelection()
 {
   HWND32 hWnd = (hWndClipWindow) ? hWndClipWindow : GetActiveWindow32();
 
@@ -184,13 +184,13 @@
   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 @@
 
 
 /**************************************************************************
- *			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 @@
     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_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 @@
 }
 
 /**************************************************************************
- *			GetClipboardData	[USER.142]
+ *             GetClipboardData16   (USER.142)
  */
-HANDLE16 GetClipboardData(WORD wFormat)
+HANDLE16 GetClipboardData16( UINT16 wFormat )
 {
     LPCLIPFORMAT lpRender = ClipFormats; 
     LPCLIPFORMAT lpUpdate = NULL;
@@ -486,6 +497,15 @@
 
 
 /**************************************************************************
+ *             GetClipboardData32   (USER32.221)
+ */
+HANDLE32 GetClipboardData32( UINT32 wFormat )
+{
+    fprintf( stderr, "GetClipboardData32: empty stub\n" );
+    return 0;
+}
+
+/**************************************************************************
  *           CountClipboardFormats16   (USER.143)
  */
 INT16 CountClipboardFormats16(void)
@@ -644,14 +664,23 @@
 }
 
 /**************************************************************************
- *			GetClipboardFormatName	[USER.146]
+ *            GetClipboardFormatName16   (USER.146)
  */
-int GetClipboardFormatName(WORD wFormat, LPSTR retStr, short maxlen)
+INT16 GetClipboardFormatName16( UINT16 wFormat, LPSTR retStr, INT16 maxlen )
+{
+    return GetClipboardFormatName32A( wFormat, retStr, maxlen );
+}
+
+
+/**************************************************************************
+ *            GetClipboardFormatName32A   (USER32.222)
+ */
+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,14 +694,25 @@
     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)
  */
 HWND16 SetClipboardViewer16( HWND16 hWnd )
@@ -714,7 +754,7 @@
 
 
 /**************************************************************************
- *			ChangeClipboardChain	[USER.149]
+ *           ChangeClipboardChain16   (USER.149)
  */
 BOOL16 ChangeClipboardChain16(HWND16 hWnd, HWND16 hWndNext)
 {
@@ -722,7 +762,7 @@
 }
 
 /**************************************************************************
- *			ChangeClipboardChain	[USER32.21]
+ *           ChangeClipboardChain32   (USER32.21)
  */
 BOOL32 ChangeClipboardChain32(HWND32 hWnd, HWND32 hWndNext)
 {
@@ -785,13 +825,23 @@
 
 
 /**************************************************************************
- *			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 7ebe94c..07ced79 100644
--- a/misc/commdlg.c
+++ b/misc/commdlg.c
@@ -32,9 +32,9 @@
 /***********************************************************************
  * 				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 @@
 /***********************************************************************
  *           GetOpenFileName   (COMMDLG.1)
  */
-BOOL GetOpenFileName( SEGPTR ofn )
+BOOL16 GetOpenFileName( SEGPTR ofn )
 {
     HINSTANCE16 hInst;
     HANDLE16 hDlgTmpl = 0, hResInfo;
@@ -114,7 +114,7 @@
 /***********************************************************************
  *           GetSaveFileName   (COMMDLG.2)
  */
-BOOL GetSaveFileName( SEGPTR ofn)
+BOOL16 GetSaveFileName( SEGPTR ofn)
 {
     HINSTANCE16 hInst;
     HANDLE16 hDlgTmpl = 0;
@@ -193,7 +193,7 @@
 /***********************************************************************
  * 				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 @@
 
 	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 @@
   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 @@
   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 @@
 	}
       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 @@
 /***********************************************************************
  *           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 @@
 /***********************************************************************
  *           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 @@
 /***********************************************************************
  *           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 @@
 /***********************************************************************
  *           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 @@
 /***********************************************************************
  *           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 @@
 /***********************************************************************
  *           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 @@
 /***********************************************************************
  *           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 @@
 /***********************************************************************
  *           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 @@
 /***********************************************************************
  *           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 @@
  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 @@
  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 @@
  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 @@
 /***********************************************************************
  *                             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 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 @@
 /***********************************************************************
  *           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 @@
 /***********************************************************************
  *                        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 @@
 /***********************************************************************
  *                          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 @@
   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 @@
   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 @@
                     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 c535ffd..4eb0880 100644
--- a/misc/driver.c
+++ b/misc/driver.c
@@ -110,7 +110,7 @@
     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 @@
     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 a42827c..d742fc1 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 143dfe3..e793f8b 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 @@
     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 @@
 
     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 735a59e..29c60ee 100644
--- a/misc/lstr.c
+++ b/misc/lstr.c
@@ -127,9 +127,9 @@
 
 
 /***********************************************************************
- *           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 );
@@ -145,6 +145,28 @@
 
 
 /***********************************************************************
+ *           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)
  */
 LPSTR CharNext32A( LPCSTR ptr )
@@ -544,6 +566,10 @@
 							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 @@
                                                     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 a149b2d..48d67e4 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 1687226..96a915a 100644
--- a/misc/main.c
+++ b/misc/main.c
@@ -70,6 +70,7 @@
     {"It",0x0410},	/* LANG_It */
     {"Ko",0x0412},	/* LANG_Ko */
     {"Hu",0x0436},	/* LANG_Hu */
+    {"Pl",0x0415},      /* LANG_Pl */
     {NULL,0}
 };
 
@@ -162,7 +163,7 @@
   "    -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 @@
  */
 #ifdef DEBUG_RUNTIME
 
-BOOL ParseDebugOptions(char *options)
+BOOL32 ParseDebugOptions(char *options)
 {
   int l;
   if (strlen(options)<3)
@@ -811,14 +812,14 @@
     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 @@
 
 
 /***********************************************************************
- *	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 @@
 		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 @@
 
 		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 @@
 
 		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 @@
         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 156db53..5c1eace 100644
--- a/misc/network.c
+++ b/misc/network.c
@@ -154,7 +154,7 @@
  *				WNetGetConnection	[USER.512]
  */
 int WNetGetConnection(LPSTR lpLocalName, 
-	LPSTR lpRemoteName, UINT *cbRemoteName)
+	LPSTR lpRemoteName, UINT16 *cbRemoteName)
 {
     const char *path;
 
@@ -210,7 +210,7 @@
 /**************************************************************************
  *				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 @@
 /**************************************************************************
  *				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 @@
 /**************************************************************************
  *				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 @@
 /**************************************************************************
  *              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 @@
 /**************************************************************************
  *              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 @@
 /**************************************************************************
  *				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 @@
 /**************************************************************************
  *				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 @@
 /**************************************************************************
  *				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 @@
 /**************************************************************************
  *				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 f9d8985..a83b049 100644
--- a/misc/ntdll.c
+++ b/misc/ntdll.c
@@ -369,6 +369,15 @@
 }
 
 /**************************************************************************
+ *                 RtlInitUnicodeString			[NTDLL]
+ */
+VOID
+RtlFreeUnicodeString(LPUNICODE_STRING str) {
+	if (str->Buffer)
+		HeapFree(GetProcessHeap(),0,str);
+}
+
+/**************************************************************************
  *                 RtlUnicodeToOemN			[NTDLL]
  */
 DWORD /* NTSTATUS */
diff --git a/misc/ole2nls.c b/misc/ole2nls.c
index 6cb3b1d..ebbd70d 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 @@
     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 @@
 	}
     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 @@
 /***********************************************************************
  *           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 @@
 	}
 	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 441f7b4..2c7ab88 100644
--- a/misc/olecli.c
+++ b/misc/olecli.c
@@ -47,7 +47,7 @@
 /***********************************************************************
  *           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 490ab48..b9e41ff 100644
--- a/misc/olesvr.c
+++ b/misc/olesvr.c
@@ -39,7 +39,7 @@
 /***********************************************************************
  *           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 7a1bce9..f97f53a 100644
--- a/misc/shell.c
+++ b/misc/shell.c
@@ -47,13 +47,13 @@
 
 #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 @@
 /*************************************************************************
  *				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 @@
 /*************************************************************************
  *				DragQueryPoint		[SHELL.13]
  */
-BOOL DragQueryPoint(HDROP16 hDrop, POINT16 *p)
+BOOL16 DragQueryPoint(HDROP16 hDrop, POINT16 *p)
 {
     LPDROPFILESTRUCT lpDropFileStruct;  
     BOOL16           bRet;
@@ -281,11 +281,11 @@
 }
 
 /*************************************************************************
- *				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 @@
     return WinExec32(cmd,iShowCmd);
 }
 
+
 /*************************************************************************
- *				FindExecutable		[SHELL.21]
+ *             ShellExecute32A   (SHELL32.84)
  */
-HINSTANCE16 FindExecutable(LPCSTR lpFile, LPCSTR lpDirectory, LPSTR lpResult)
+HINSTANCE32 ShellExecute32A( HWND32 hWnd, LPCSTR lpOperation, LPCSTR lpFile,
+                             LPCSTR lpParameters, LPCSTR lpDirectory,
+                             INT32 iShowCmd )
+{
+    return ShellExecute16( hWnd, lpOperation, lpFile, lpParameters,
+                           lpDirectory, iShowCmd );
+}
+
+
+/*************************************************************************
+ *             FindExecutable16   (SHELL.21)
+ */
+HINSTANCE16 FindExecutable16( LPCSTR lpFile, LPCSTR lpDirectory,
+                              LPSTR lpResult )
 {
     HINSTANCE16 retval=31;    /* default - 'No association was found' */
 
@@ -578,7 +592,7 @@
  *
  * 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 @@
   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 @@
     /* 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 @@
 }
 
 /*************************************************************************
- *				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 @@
   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 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 @@
 	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 @@
  */
 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 7b19a34..3216f4a 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 3223fa7..d800323 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 @@
 		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 @@
 #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 ee60a03..aaeeae5 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 b84cf6c..6652b8a 100644
--- a/misc/winsock.c
+++ b/misc/winsock.c
@@ -360,7 +360,7 @@
 
   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 @@
 
   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 @@
 	  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 @@
 	     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 @@
     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 @@
         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 @@
        *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 @@
 	*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 @@
      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 @@
 	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 @@
 	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 @@
     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 @@
 	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 @@
        notify_client(pws, WS_FD_READ);
        return (INT16)length;
     }
-    pwsi->errno = wsaErrno();
+    pwsi->err = wsaErrno();
   }
   return SOCKET_ERROR;
 }
@@ -744,7 +744,7 @@
 	  }
 	  return highfd; 
      }
-     pwsi->errno = wsaErrno();
+     pwsi->err = wsaErrno();
   } 
   return SOCKET_ERROR;
 }
@@ -762,7 +762,7 @@
     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 @@
     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 @@
 	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 @@
     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 @@
     {
 	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 @@
 	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 @@
              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 @@
         if( pnew ) return (SOCKET16)WS_PTR2HANDLE(pnew);
 	{
           close(sock);
-          pwsi->errno = WSAENOBUFS;
+          pwsi->err = WSAENOBUFS;
           return INVALID_SOCKET;
 	}
     }
@@ -896,8 +896,8 @@
     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 @@
     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 @@
     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 @@
   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 @@
     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 @@
     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 @@
     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 @@
     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 @@
 	 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 @@
                  }
       }
       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 @@
 	WS_FREE(p_aop);
 	return 0;
     }
-    else pwsi->errno = WSAEINVAL;
+    else pwsi->err = WSAEINVAL;
   return SOCKET_ERROR;
 }
 
@@ -1311,8 +1311,8 @@
           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 @@
 			  (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 bdf6334..bdb6713 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 79950ea..d6c0b52 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 1c7682b..c380feb 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 07d781f..ba866a4 100644
--- a/msdos/dosmem.c
+++ b/msdos/dosmem.c
@@ -204,7 +204,8 @@
      * - 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 @@
    return FALSE;
 }
 
+
 /***********************************************************************
  *           DOSMEM_MapLinearToDos
  *
@@ -355,14 +357,13 @@
  */
 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 @@
  */
 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 @@
  */
 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 5096368..4ad248e 100644
--- a/msdos/dpmi.c
+++ b/msdos/dpmi.c
@@ -103,8 +103,8 @@
             }
             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 79c0d87..37dc6f0 100644
--- a/msdos/int21.c
+++ b/msdos/int21.c
@@ -428,7 +428,7 @@
 	  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 @@
 	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 9cfd796..d8dbae1 100644
--- a/msdos/int2f.c
+++ b/msdos/int2f.c
@@ -102,7 +102,7 @@
 	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 5a9b45f..932d1f9 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 {
     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 @@
 /**************************************************************************
 * 				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 @@
 
 /**************************************************************************
 * 				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 @@
 	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 @@
 		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 @@
 	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 @@
 			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 @@
 	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 @@
 /**************************************************************************
 * 				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 @@
 /**************************************************************************
 * 				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 @@
 	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 @@
 		}
 #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 @@
 	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 @@
 /*		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 @@
 	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 @@
 /**************************************************************************
 * 				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 @@
 
 	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 @@
 		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 @@
 	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 @@
 	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 @@
 /**************************************************************************
 * 				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 @@
 /**************************************************************************
 * 				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 @@
 /**************************************************************************
 * 				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 @@
 /**************************************************************************
 * 				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 @@
 /**************************************************************************
 * 				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 @@
 	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 @@
 /**************************************************************************
 * 				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 @@
 /**************************************************************************
 * 				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 @@
 			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 wodOpen(WORD wDevID, LPWAVEOPENDESC lpDesc, DWORD dwFlags)
 {
+	int index = MMSYSTEM_DevIDToIndex(wDevID);
 	int 		audio;
 	int			abuf_size;
 	int			smplrate;
@@ -769,7 +777,7 @@
 		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 @@
 			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 @@
 			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 @@
 				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;
+				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[wDevID].Format.wBitsPerSample;
-	smplrate = WOutDev[wDevID].Format.wf.nSamplesPerSec;
-	dsp_stereo = (WOutDev[wDevID].Format.wf.nChannels > 1) ? TRUE : FALSE;
+	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 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 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 @@
 	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 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 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 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 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 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 @@
 			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 widOpen(WORD wDevID, LPWAVEOPENDESC lpDesc, DWORD dwFlags)
 {
+	int index = MMSYSTEM_DevIDToIndex(wDevID);
 	int 		audio;
 	int			abuf_size;
 	int			smplrate;
@@ -1218,7 +1234,7 @@
 		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 @@
 			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 @@
 			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;
+	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[wDevID].Format.wBitsPerSample;
-	smplrate = WInDev[wDevID].Format.wf.nSamplesPerSec;
-	dsp_stereo = (WInDev[wDevID].Format.wf.nChannels > 1) ? TRUE : FALSE;
+	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 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 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 @@
 	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 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 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 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 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 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 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 @@
 	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 @@
 			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 @@
 	return MMSYSERR_NOTENABLED;
 #endif
 }
-
-
-#endif /* #ifdef BUILTIN_MMSYSTEM */
diff --git a/multimedia/joystick.c b/multimedia/joystick.c
index ab28190..8bc7deb 100644
--- a/multimedia/joystick.c
+++ b/multimedia/joystick.c
@@ -67,7 +67,7 @@
 /**************************************************************************
  * 				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 e6e84f3..babcf25 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 @@
 /**************************************************************************
 * 				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 @@
 			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 @@
 /**************************************************************************
 * 				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 @@
 /**************************************************************************
 * 				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 @@
 /**************************************************************************
 * 				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 @@
 			/* 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 @@
 /**************************************************************************
 * 				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 @@
 				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 @@
 /**************************************************************************
 * 				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 @@
 			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 @@
 /**************************************************************************
 * 				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 @@
 			"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 @@
 				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 @@
 /**************************************************************************
 * 				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 @@
 /**************************************************************************
 * 				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 @@
 /**************************************************************************
 * 				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 @@
 /**************************************************************************
 * 				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 @@
 /**************************************************************************
 * 				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 @@
 			"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 @@
 /**************************************************************************
 * 				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 @@
 				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 @@
 			"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 @@
 
 
 /*-----------------------------------------------------------------------*/
-
-#endif /* #ifdef BUILTIN_MMSYSTEM */
diff --git a/multimedia/mcicda.c b/multimedia/mcicda.c
index febab84..5c9781d 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 @@
 	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 @@
 /**************************************************************************
 * 				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 @@
 #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 @@
 /**************************************************************************
 * 				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 @@
 	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 @@
 		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 @@
 #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 @@
 			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 @@
 /**************************************************************************
 * 				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 @@
 			"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 @@
 /**************************************************************************
 * 				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 @@
 /**************************************************************************
 * 				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 @@
 /**************************************************************************
 * 				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 @@
 /**************************************************************************
 * 				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 @@
 					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 @@
 /**************************************************************************
 * 				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 @@
 #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 @@
 #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 @@
 #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 @@
 #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 @@
 /**************************************************************************
 * 				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 @@
 			/* 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 @@
 /**************************************************************************
 * 				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 @@
 				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 @@
 			 	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 @@
 			 	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 @@
 /**************************************************************************
 * 				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 @@
         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 @@
         	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 @@
 		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 @@
 /**************************************************************************
 * 				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 @@
 /**************************************************************************
 * 				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 @@
 /**************************************************************************
 * 				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 @@
 /**************************************************************************
 * 				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 @@
 		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 @@
 			"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 @@
 /**************************************************************************
 * 				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 @@
                 		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 @@
 			"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 @@
 
 
 /*-----------------------------------------------------------------------*/
-
-#endif /* #ifdef BUILTIN_MMSYSTEM */
diff --git a/multimedia/mcistring.c b/multimedia/mcistring.c
index 91af08d..f61679c 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_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 @@
 
 /* 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 @@
 #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 @@
 	}
 /* 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 @@
 		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 @@
 		}
 		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 @@
 	}
 	_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 @@
  * 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 @@
 
  	/* 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 @@
 	free(keywords);free(cmd);
 	return MCIERR_MISSING_COMMAND_STRING;
 }
-#endif
diff --git a/multimedia/midi.c b/multimedia/midi.c
index 5d08d7b..7a52f87 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 {
 	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 @@
 /**************************************************************************
 * 				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 @@
 /**************************************************************************
 * 				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 @@
 /**************************************************************************
 * 				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 @@
 				}
 			}
 		}
-	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 @@
 /**************************************************************************
 * 				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 @@
 				}
 			}
 		}
-	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 @@
 /**************************************************************************
 * 				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 @@
 /**************************************************************************
 * 				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_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 @@
 		}
 	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 @@
 /**************************************************************************
 * 				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 @@
 
 	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;
+			MCIMidiDev[index].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;
+	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 @@
 			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 @@
 /**************************************************************************
 * 				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 @@
 /**************************************************************************
 * 				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 @@
 /**************************************************************************
 * 				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 @@
 			}
 		}
 #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 @@
 /**************************************************************************
 * 				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 @@
 		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 @@
 /**************************************************************************
 * 				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 @@
 /**************************************************************************
 * 				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 @@
 /**************************************************************************
 * 				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 @@
 /**************************************************************************
 * 				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 @@
 	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 @@
 /**************************************************************************
 * 				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 @@
 /**************************************************************************
 * 				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 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 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 @@
 				   "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 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 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 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 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 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 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 midStop(WORD wDevID)
 {
-	dprintf_midi(stddeb, "midStop(%u);\n", wDevID);
+	dprintf_midi(stddeb, "midStop(%04X);\n", wDevID);
 	return MMSYSERR_NOTENABLED;
 }
 
@@ -976,7 +988,7 @@
 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 @@
 */
 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 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 @@
 				"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 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 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 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 @@
 	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 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 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 modReset(WORD wDevID)
 {
-	dprintf_midi(stddeb, "modReset(%u);\n", wDevID);
+	dprintf_midi(stddeb, "modReset(%04X);\n", wDevID);
 	return MMSYSERR_NOTENABLED;
 }
 
@@ -1236,7 +1253,7 @@
 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 @@
 
 
 /*-----------------------------------------------------------------------*/
-
-#endif /* #ifdef BUILTIN_MMSYSTEM */
diff --git a/multimedia/mmaux.c b/multimedia/mmaux.c
index e325fd1..470c78d 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 @@
 #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 @@
 	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 @@
 	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 @@
 			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 @@
 	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 @@
 			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 @@
 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 @@
 		}
 	return MMSYSERR_NOTSUPPORTED;
 }
-
-
-#endif /* #ifdef BUILTIN_MMSYSTEM */
diff --git a/multimedia/mmsystem.c b/multimedia/mmsystem.c
index 12337a6..0c232a5 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_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 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 @@
 /**************************************************************************
 * 				sndPlaySound		[MMSYSTEM.2]
 */
-BOOL sndPlaySound(LPCSTR lpszSoundName, UINT uFlags)
+BOOL16 sndPlaySound(LPCSTR lpszSoundName, UINT16 uFlags)
 {
 	HMMIO16			hmmio;
 	MMCKINFO		mmckInfo;
@@ -89,6 +132,12 @@
 		}
 	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 @@
 /**************************************************************************
 * 				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 @@
 /**************************************************************************
 * 				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 @@
 /**************************************************************************
 * 				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 @@
 /**************************************************************************
 * 				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 @@
 /**************************************************************************
 * 				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 @@
 /**************************************************************************
 * 				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 @@
 /**************************************************************************
 * 				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 @@
 /**************************************************************************
 * 				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 @@
 * 				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 @@
 	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 @@
 			}
 		}
 	}
-	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 @@
 /**************************************************************************
 * 				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 @@
 /**************************************************************************
 * 				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 @@
 }
 
 
+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)
+DWORD mciSendCommand(UINT16 wDevID, UINT16 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;
+    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 @@
 /**************************************************************************
 * 				mciGetDeviceIDFromElementID	[MMSYSTEM.715]
 */
-UINT mciGetDeviceIDFromElementID(DWORD dwElementID, LPCSTR lpstrType)
+UINT16 mciGetDeviceIDFromElementID(DWORD dwElementID, LPCSTR lpstrType)
 {
     return 0;
 }
@@ -853,7 +955,7 @@
 /**************************************************************************
 * 				mciGetYieldProc		[MMSYSTEM.716]
 */
-YIELDPROC mciGetYieldProc(UINT uDeviceID, DWORD * lpdwYieldData)
+YIELDPROC mciGetYieldProc(UINT16 uDeviceID, DWORD * lpdwYieldData)
 {
     return NULL;
 }
@@ -861,7 +963,7 @@
 /**************************************************************************
 * 				mciGetCreatorTask	[MMSYSTEM.717]
 */
-HTASK16 mciGetCreatorTask(UINT uDeviceID)
+HTASK16 mciGetCreatorTask(UINT16 uDeviceID)
 {
     return 0;
 }
@@ -869,9 +971,9 @@
 /**************************************************************************
 * 				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 @@
 /**************************************************************************
 * 				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 @@
 /**************************************************************************
 * 				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 @@
 /**************************************************************************
 * 				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 @@
 /**************************************************************************
 * 				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 @@
 /**************************************************************************
 * 				midiOutClose		[MMSYSTEM.205]
 */
-UINT midiOutClose(HMIDIOUT16 hMidiOut)
+UINT16 midiOutClose(HMIDIOUT16 hMidiOut)
 {
 	LPMIDIOPENDESC	lpDesc;
 	dprintf_mmsys(stddeb, "midiOutClose(%04X)\n", hMidiOut);
@@ -995,8 +1097,8 @@
 /**************************************************************************
 * 				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 @@
 /**************************************************************************
 * 				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 @@
 /**************************************************************************
 * 				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 @@
 /**************************************************************************
 * 				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 @@
 /**************************************************************************
 * 				midiOutReset		[MMSYSTEM.210]
 */
-UINT midiOutReset(HMIDIOUT16 hMidiOut)
+UINT16 midiOutReset(HMIDIOUT16 hMidiOut)
 {
 	LPMIDIOPENDESC	lpDesc;
 	dprintf_mmsys(stddeb, "midiOutReset(%04X)\n", hMidiOut);
@@ -1064,7 +1166,7 @@
 /**************************************************************************
 * 				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 @@
 /**************************************************************************
 * 				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 @@
 /**************************************************************************
 * 				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 @@
 /**************************************************************************
 * 				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 @@
 /**************************************************************************
 * 				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 @@
 /**************************************************************************
 * 				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 @@
 /**************************************************************************
 * 				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 @@
 /**************************************************************************
 * 				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 @@
 /**************************************************************************
 * 				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 @@
 /**************************************************************************
 * 				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 @@
 /**************************************************************************
 * 				midiInClose		[MMSYSTEM.305]
 */
-UINT midiInClose(HMIDIIN16 hMidiIn)
+UINT16 midiInClose(HMIDIIN16 hMidiIn)
 {
 	LPMIDIOPENDESC	lpDesc;
 	dprintf_mmsys(stddeb, "midiInClose(%04X)\n", hMidiIn);
@@ -1210,8 +1312,8 @@
 /**************************************************************************
 * 				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 @@
 /**************************************************************************
 * 				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 @@
 /**************************************************************************
 * 				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 @@
 /**************************************************************************
 * 				midiInStart			[MMSYSTEM.309]
 */
-UINT midiInStart(HMIDIIN16 hMidiIn)
+UINT16 midiInStart(HMIDIIN16 hMidiIn)
 {
 	dprintf_mmsys(stddeb, "midiInStart\n");
 	return 0;
@@ -1259,7 +1361,7 @@
 /**************************************************************************
 * 				midiInStop			[MMSYSTEM.310]
 */
-UINT midiInStop(HMIDIIN16 hMidiIn)
+UINT16 midiInStop(HMIDIIN16 hMidiIn)
 {
 	dprintf_mmsys(stddeb, "midiInStop\n");
 	return 0;
@@ -1268,7 +1370,7 @@
 /**************************************************************************
 * 				midiInReset			[MMSYSTEM.311]
 */
-UINT midiInReset(HMIDIIN16 hMidiIn)
+UINT16 midiInReset(HMIDIIN16 hMidiIn)
 {
 	dprintf_mmsys(stddeb, "midiInReset\n");
 	return 0;
@@ -1277,7 +1379,7 @@
 /**************************************************************************
 * 				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 @@
 /**************************************************************************
 * 				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 @@
 /**************************************************************************
 * 				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 @@
 /**************************************************************************
 * 				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 @@
 /**************************************************************************
 * 				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 @@
 /**************************************************************************
 * 				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 @@
 /**************************************************************************
 * 				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 @@
 /**************************************************************************
 * 				waveOutClose		[MMSYSTEM.405]
 */
-UINT waveOutClose(HWAVEOUT16 hWaveOut)
+UINT16 waveOutClose(HWAVEOUT16 hWaveOut)
 {
 	LPWAVEOPENDESC	lpDesc;
 	dprintf_mmsys(stddeb, "waveOutClose(%04X)\n", hWaveOut);
@@ -1456,8 +1558,8 @@
 /**************************************************************************
 * 				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 @@
 /**************************************************************************
 * 				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 @@
 /**************************************************************************
 * 				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 @@
 /**************************************************************************
 * 				waveOutPause		[MMSYSTEM.409]
 */
-UINT waveOutPause(HWAVEOUT16 hWaveOut)
+UINT16 waveOutPause(HWAVEOUT16 hWaveOut)
 {
 	LPWAVEOPENDESC	lpDesc;
 	dprintf_mmsys(stddeb, "waveOutPause(%04X)\n", hWaveOut);
@@ -1511,7 +1613,7 @@
 /**************************************************************************
 * 				waveOutRestart		[MMSYSTEM.410]
 */
-UINT waveOutRestart(HWAVEOUT16 hWaveOut)
+UINT16 waveOutRestart(HWAVEOUT16 hWaveOut)
 {
 	LPWAVEOPENDESC	lpDesc;
 	dprintf_mmsys(stddeb, "waveOutRestart(%04X)\n", hWaveOut);
@@ -1523,7 +1625,7 @@
 /**************************************************************************
 * 				waveOutReset		[MMSYSTEM.411]
 */
-UINT waveOutReset(HWAVEOUT16 hWaveOut)
+UINT16 waveOutReset(HWAVEOUT16 hWaveOut)
 {
 	LPWAVEOPENDESC	lpDesc;
 	dprintf_mmsys(stddeb, "waveOutReset(%04X)\n", hWaveOut);
@@ -1535,7 +1637,7 @@
 /**************************************************************************
 * 				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 @@
 /**************************************************************************
 * 				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 @@
 /**************************************************************************
 * 				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 @@
 /**************************************************************************
 * 				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 @@
 /**************************************************************************
 * 				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 @@
 /**************************************************************************
 * 				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 @@
 /**************************************************************************
 * 				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 @@
 /**************************************************************************
 * 				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 @@
 /**************************************************************************
 * 				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 @@
 /**************************************************************************
 * 				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 @@
 /**************************************************************************
 * 				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 @@
 /**************************************************************************
 * 				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 @@
 /**************************************************************************
 * 				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 @@
 /**************************************************************************
 * 				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 @@
 /**************************************************************************
 * 				waveInClose			[MMSYSTEM.505]
 */
-UINT waveInClose(HWAVEIN16 hWaveIn)
+UINT16 waveInClose(HWAVEIN16 hWaveIn)
 {
 	LPWAVEOPENDESC	lpDesc;
 	dprintf_mmsys(stddeb, "waveInClose(%04X)\n", hWaveIn);
@@ -1749,8 +1851,8 @@
 /**************************************************************************
 * 				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 @@
 /**************************************************************************
 * 				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 @@
 /**************************************************************************
 * 				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 @@
 /**************************************************************************
 * 				waveInStart			[MMSYSTEM.509]
 */
-UINT waveInStart(HWAVEIN16 hWaveIn)
+UINT16 waveInStart(HWAVEIN16 hWaveIn)
 {
 	LPWAVEOPENDESC	lpDesc;
 	dprintf_mmsys(stddeb, "waveInStart(%04X)\n", hWaveIn);
@@ -1829,7 +1931,7 @@
 /**************************************************************************
 * 				waveInStop			[MMSYSTEM.510]
 */
-UINT waveInStop(HWAVEIN16 hWaveIn)
+UINT16 waveInStop(HWAVEIN16 hWaveIn)
 {
 	LPWAVEOPENDESC	lpDesc;
 	dprintf_mmsys(stddeb, "waveInStop(%04X)\n", hWaveIn);
@@ -1842,7 +1944,7 @@
 /**************************************************************************
 * 				waveInReset			[MMSYSTEM.511]
 */
-UINT waveInReset(HWAVEIN16 hWaveIn)
+UINT16 waveInReset(HWAVEIN16 hWaveIn)
 {
 	LPWAVEOPENDESC	lpDesc;
 	dprintf_mmsys(stddeb, "waveInReset(%04X)\n", hWaveIn);
@@ -1855,7 +1957,7 @@
 /**************************************************************************
 * 				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 @@
 /**************************************************************************
 * 				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 @@
 /**************************************************************************
 * 				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 @@
 /**************************************************************************
 * 				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 @@
 /**************************************************************************
 * 				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 @@
 /**************************************************************************
 * 				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 @@
 /**************************************************************************
 * 				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 @@
 /**************************************************************************
 * 				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 @@
 /**************************************************************************
 * 				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 @@
 /**************************************************************************
 * 				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 @@
 /**************************************************************************
 * 				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 @@
 /**************************************************************************
 * 				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 @@
 /**************************************************************************
 * 				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 @@
 /**************************************************************************
 * 				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 @@
 /**************************************************************************
 * 				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 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 @@
 /**************************************************************************
 * 				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 a6b4795..56e4e45 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 @@
 	StartMMTime();
     return 0;
 }
-
-#endif /* WINELIB */
diff --git a/objects/bitmap.c b/objects/bitmap.c
index 1d81b16..77147f7 100644
--- a/objects/bitmap.c
+++ b/objects/bitmap.c
@@ -52,13 +52,23 @@
 
 
 /***********************************************************************
- *           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 @@
 	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 CreateCompatibleBitmap( HDC32 hdc, INT32 width, INT32 height )
+HBITMAP16 CreateCompatibleBitmap16( HDC16 hdc, INT16 width, INT16 height )
 {
-    HBITMAP16 hbmpRet = 0;
+    return CreateCompatibleBitmap32( hdc, width, height );
+}
+
+
+/***********************************************************************
+ *           CreateCompatibleBitmap32    (GDI32.30)
+ */
+HBITMAP32 CreateCompatibleBitmap32( HDC32 hdc, INT32 width, INT32 height )
+{
+    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 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 @@
  */
 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 );
 }
 
 
 /***********************************************************************
- *           GetBitmapBits    (GDI.74) (GDI32.143)
+ *           GetBitmapBits16    (GDI.74)
  */
-LONG GetBitmapBits( HBITMAP32 hbitmap, LONG count, LPVOID buffer )
+LONG GetBitmapBits16( HBITMAP16 hbitmap, LONG count, LPVOID buffer )
+{
+    return GetBitmapBits32( hbitmap, count, buffer );
+}
+
+
+/***********************************************************************
+ *           GetBitmapBits32    (GDI32.143)
+ */
+LONG GetBitmapBits32( HBITMAP32 hbitmap, LONG count, LPVOID buffer )
 {
     BITMAPOBJ * bmp;
     LONG height;
@@ -178,9 +202,18 @@
 
 
 /***********************************************************************
- *           SetBitmapBits    (GDI.106) (GDI32.303)
+ *           SetBitmapBits16    (GDI.106)
  */
-LONG SetBitmapBits( HBITMAP32 hbitmap, LONG count, LPCVOID buffer )
+LONG SetBitmapBits16( HBITMAP16 hbitmap, LONG count, LPCVOID buffer )
+{
+    return SetBitmapBits32( hbitmap, count, buffer );
+}
+
+
+/***********************************************************************
+ *           SetBitmapBits32    (GDI32.303)
+ */
+LONG SetBitmapBits32( HBITMAP32 hbitmap, LONG count, LPCVOID buffer )
 {
     BITMAPOBJ * bmp;
     LONG height;
@@ -416,14 +449,20 @@
 
 
 /***********************************************************************
- *           CreateDiscardableBitmap    (GDI.156) (GDI32.38)
+ *           CreateDiscardableBitmap16    (GDI.156)
  */
-HBITMAP16 CreateDiscardableBitmap( HDC32 hdc, INT32 width, INT32 height )
+HBITMAP16 CreateDiscardableBitmap16( HDC16 hdc, INT16 width, INT16 height )
 {
-    dprintf_bitmap(stddeb,"CreateDiscardableBitmap(%04x, %d, %d); "
-	   "// call CreateCompatibleBitmap() for now!\n",
-	   hdc, width, height);
-    return CreateCompatibleBitmap(hdc, width, height);
+    return CreateCompatibleBitmap16( hdc, width, height );
+}
+
+
+/***********************************************************************
+ *           CreateDiscardableBitmap32    (GDI32.38)
+ */
+HBITMAP32 CreateDiscardableBitmap32( HDC32 hdc, INT32 width, INT32 height )
+{
+    return CreateCompatibleBitmap32( hdc, width, height );
 }
 
 
diff --git a/objects/brush.c b/objects/brush.c
index eb8bca2..4a06005 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 7ca30a9..e801cb0 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 5d1abd9..5b8c761 100644
--- a/objects/color.c
+++ b/objects/color.c
@@ -262,7 +262,7 @@
  *
  * 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 @@
     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 @@
 
  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 62b4823..bdb9f0d 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 @@
 
     /* 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 @@
 
     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 @@
     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 889518f..6d31cd8 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 @@
 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 @@
                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 @@
 
 
 /***********************************************************************
- *           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 @@
 
 
 /***********************************************************************
- *           SetTextColor    (GDI.9) (GDI32.338)
+ *           SetTextColor16    (GDI.9)
  */
-COLORREF SetTextColor( HDC32 hdc, COLORREF color )
+COLORREF SetTextColor16( HDC16 hdc, COLORREF color )
+{
+    return SetTextColor32( hdc, color );
+}
+
+
+/***********************************************************************
+ *           SetTextColor32    (GDI32.338)
+ */
+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 b90b484..9ea8221 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 d49b091..29aba34 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 @@
 
     /* 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 edf0266..7912362 100644
--- a/objects/font.c
+++ b/objects/font.c
@@ -202,30 +202,81 @@
     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 @@
 
 
 /***********************************************************************
- *           AddFontResource    (GDI.119)
+ *           AddFontResource16    (GDI.119)
  */
-INT AddFontResource( LPCSTR str )
+INT16 AddFontResource16( LPCSTR str )
+{
+    return AddFontResource32A( str );
+}
+
+
+/***********************************************************************
+ *           AddFontResource32A    (GDI32.2)
+ */
+INT32 AddFontResource32A( LPCSTR str )
 {
     if (HIWORD(str))
         fprintf( stdnimp, "STUB: AddFontResource('%s')\n", str );
@@ -903,9 +963,28 @@
 
 
 /***********************************************************************
- *           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 @@
     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 @@
 
 
 /*************************************************************************
- *				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 @@
   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,"GetKerningPairs: almost empty stub!\n");
+    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,"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 d8eccaa..4422ed8 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 be9693f..d0cf871 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 d5dcf12..64701e9 100644
--- a/objects/metafile.c
+++ b/objects/metafile.c
@@ -217,7 +217,7 @@
 
 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 @@
 	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 @@
 
 
 /******************************************************************
- *         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 @@
 
 
 /******************************************************************
- *         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 @@
       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 @@
 	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 @@
 	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 @@
     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 @@
     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 @@
     *(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 @@
 
     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 @@
     *(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 224f658..6fb8aab 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 @@
         }
     }
 
-    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 5c38d23..9faca5f 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 @@
 
 
 /**********************************************************************
- *	    UpdateColors	(GDI.366)
- *
+ *            UpdateColors16   (GDI.366)
  */
-int UpdateColors( HDC16 hDC )
+INT16 UpdateColors16( HDC16 hDC )
 {
     HWND32 hWnd = WindowFromDC32( hDC );
 
@@ -587,3 +585,12 @@
     return 0x666;
 }
 
+
+/**********************************************************************
+ *            UpdateColors32   (GDI32.359)
+ */
+BOOL32 UpdateColors32( HDC32 hDC )
+{
+    UpdateColors16( hDC );
+    return TRUE;
+}
diff --git a/objects/pen.c b/objects/pen.c
index 2cca576..f33b791 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 18e808d..3575132 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 @@
 
 
 /***********************************************************************
- *           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 1fcf622..ce7572b 100644
--- a/objects/text.c
+++ b/objects/text.c
@@ -401,10 +401,9 @@
 
     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 @@
 
     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 @@
 
     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 36f04e2..55c6b9e 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 bfca5ce..6b98c8d 100644
--- a/rc/parser.l
+++ b/rc/parser.l
@@ -34,7 +34,7 @@
 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 53f6bf5..bbf38fa 100644
--- a/rc/parser.y
+++ b/rc/parser.y
@@ -23,7 +23,7 @@
 %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 @@
 
 /* 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 e54a75f..09d0d85 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_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 0bc3514..03b41e3 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 @@
     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 0000000..1af3dff
--- /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 c474d54..ab72caf 100644
--- a/scheduler/process.c
+++ b/scheduler/process.c
@@ -166,13 +166,15 @@
     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 @@
     return ret;
 }
 
+
 /***********************************************************************
  *           ExpandEnvironmentVariablesA   (KERNEL32.103)
  */
diff --git a/scheduler/thread.c b/scheduler/thread.c
index 0b48efe..16f602c 100644
--- a/scheduler/thread.c
+++ b/scheduler/thread.c
@@ -40,6 +40,7 @@
 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->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 0116c90..16f7a1e 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 e88e24e..6d9008c 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 @@
             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 @@
 
         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 @@
  * 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 @@
     {
         /* 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 @@
     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 @@
     fprintf( outfile, "\tpushl " PREFIX "CALLTO16_RetAddr_%s\n",
              short_ret ? "word" : "long" );
 
-    /* Push the called routine address */
-
-    fprintf( outfile, "\tpushl 12(%%ebx)\n" );
-
-    /* Get the 16-bit ds */
-
     if (reg_func)
     {
-        fprintf( outfile, "\tpushw 16(%%ebx)\n" );
+        /* Push the called routine address */
+
+        fprintf( outfile, "\tpushw %d(%%ebx)\n", CONTEXTOFFSET(SegCs) );
+        fprintf( outfile, "\tpushw %d(%%ebx)\n", CONTEXTOFFSET(Eip) );
+
+        /* Get the 16-bit ds */
+
+        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 @@
     }
     return 0;
 }
-
-#endif  /* WINELIB */
diff --git a/tools/make_os2.sh b/tools/make_os2.sh
index 7564c5e..1051970 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 9610366..63b2d4a 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 @@
 	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 @@
     }
     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 dbdae2a..0a7891a 100644
--- a/win32/Makefile.in
+++ b/win32/Makefile.in
@@ -16,7 +16,6 @@
 	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 31a92d2..2fe54f2 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 60673db..951874c 100644
--- a/win32/code_page.c
+++ b/win32/code_page.c
@@ -69,14 +69,14 @@
 /***********************************************************************
  *              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 558b433..63e5fa4 100644
--- a/win32/console.c
+++ b/win32/console.c
@@ -26,7 +26,7 @@
 /***********************************************************************
  *           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 40a3251..0a22a38 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 @@
  * 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 @@
 
     /* 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_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 b32eca4..62c55bf 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 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 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 c059531..98b4ffe 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 @@
         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 18e14ef..6372a41 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 @@
 	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 93919c3..bcb0565 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_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 8cb1ae5..0000000
--- 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 e403cde..58f8dc3 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 @@
 /***********************************************************************
  *           ReleaseMutex    (KERNEL32.435)
  */
-BOOL ReleaseMutex (HANDLE32 h)
+BOOL32 ReleaseMutex (HANDLE32 h)
 {
 	return 0;
 }
@@ -34,7 +34,7 @@
 /***********************************************************************
  *           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 @@
 /***********************************************************************
  *           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 @@
 /***********************************************************************
  *           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 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 @@
 /***********************************************************************
  *           FreeLibrary
  */
-BOOL FreeLibrary32(HINSTANCE32 hLibModule)
+BOOL32 FreeLibrary32(HINSTANCE32 hLibModule)
 {
 	fprintf(stderr,"FreeLibrary: empty stub\n");
 	return TRUE;
@@ -117,7 +117,7 @@
 /**********************************************************************
  *          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 @@
 /**********************************************************************
  *           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 6c0559f..2acf856 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)
-{
-	memset(lpCrit,0,sizeof(CRITICAL_SECTION));
-}
+ 
+/************************************************************************
+*           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!!!!		*
+************************************************************************/
 
-void EnterCriticalSection(CRITICAL_SECTION* lpCrit)
-{
-    if (lpCrit->LockCount)
-        fprintf( stderr, "Error: re-entering critical section %08lx\n",
-                 (DWORD)lpCrit );
-    lpCrit->LockCount++;
-}
-
-void LeaveCriticalSection(CRITICAL_SECTION* lpCrit)
-{
-    if (!lpCrit->LockCount)
-        fprintf( stderr, "Error: leaving critical section %08lx again\n",
-                 (DWORD)lpCrit );
-    lpCrit->LockCount--;
-}
-
-void DeleteCriticalSection(CRITICAL_SECTION* lpCrit)
-{
-	return;
-}
-
-void ReinitializeCriticalSection(CRITICAL_SECTION *lpCrit) {
-	/* hmm */
-}
-
-void MakeCriticalSectionGlobal(CRITICAL_SECTION *lpCrit) {
-	/* hmm */
-}
-
-
-/* FIXME: This is required to work cross-addres space as well */
-static CRITICAL_SECTION interlocked;
-static int interlocked_init;
-
-static void get_interlocked()
-{
-	if(!interlocked_init)
-		InitializeCriticalSection(&interlocked);
-	interlocked_init=1;
-	EnterCriticalSection(&interlocked);
-}
-
-static void release_interlocked()
-{
-	LeaveCriticalSection(&interlocked);
-}
-
-/***********************************************************************
- *           InterlockedIncrement
- */
 LONG InterlockedIncrement(LPLONG lpAddend)
 {
-	int ret;
-	get_interlocked();
+#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;
-	release_interlocked();
+
+	/* ResumeAllThreadsAndProcesses() */
 	return ret;
+#endif	 
 }
 
-/***********************************************************************
- *           InterlockedDecrement
- */
+/************************************************************************
+*           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)
 {
-	int ret;
-	get_interlocked();
+#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;
-	release_interlocked();
+
+	/* ResumeAllThreadsAndProcesses() */
 	return ret;
+#endif	
 }
 
-/***********************************************************************
- *           InterlockedExchange
- */
+/************************************************************************
+*           InterlockedExchange				[KERNEL32]	*
+************************************************************************/
+
 LONG InterlockedExchange(LPLONG target, LONG value)
 {
-	int ret;
-	get_interlocked();
+#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;
-	release_interlocked();
+
+	/* ResumeAllThreadsAndProcesses() */
 	return ret;
+#endif	
 }
+
+/* AAARGHH some CriticalSection functions get called before we 
+ * have a threadid
+ */
+ 
+#define GetCurrentThreadId()	(-1)
+
+/************************************************************************
+*           InitializeCriticalSection			[KERNEL32]	*
+************************************************************************/
+
+void InitializeCriticalSection(CRITICAL_SECTION *pcritical)
+{
+   pcritical->LockCount=-1;
+   pcritical->RecursionCount=0;
+   pcritical->LockSemaphore=(HANDLE32) semget(IPC_PRIVATE,1,IPC_CREAT);
+   pcritical->OwningThread=(HANDLE32) -1;
+   pcritical->Reserved=0;
+}
+
+/************************************************************************
+*           DeleteCriticalSection			[KERNEL32]	*
+************************************************************************/
+
+void DeleteCriticalSection(CRITICAL_SECTION *pcritical)
+{
+   semctl((int) pcritical->LockSemaphore,0,IPC_RMID,NULL);
+   pcritical->Reserved=-1;
+}
+
+/************************************************************************
+*           EnterCriticalSection			[KERNEL32]	*
+************************************************************************/
+
+void EnterCriticalSection (CRITICAL_SECTION *pcritical)
+{
+   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++;             
+}
+
+/************************************************************************
+*           TryEnterCriticalSection			[KERNEL32]	*
+************************************************************************/
+
+BOOL32 TryEnterCriticalSection (CRITICAL_SECTION *pcritical)
+{
+   if( InterlockedIncrement(&(pcritical->LockCount)))
+   {
+      if( pcritical->OwningThread!= (HANDLE32) GetCurrentThreadId() )
+         return FALSE;
+   }
+   else
+   {      
+      pcritical->OwningThread =(HANDLE32) GetCurrentThreadId();
+   }
+   pcritical->RecursionCount++;             
+   
+   return TRUE;
+}
+
+/************************************************************************
+*           LeaveCriticalSection			[KERNEL32]	*
+************************************************************************/
+
+void LeaveCriticalSection (CRITICAL_SECTION *pcritical)
+{
+   /* 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));
+   }  
+}
+
+/************************************************************************
+*           ReinitializeCriticalSection			[KERNEL32]	*
+************************************************************************/
+
+void ReinitializeCriticalSection(CRITICAL_SECTION *lpCrit)
+{
+   /* hmm ?????? */	
+}
+
+/************************************************************************
+*           MakeCriticalSectionGlobal			[KERNEL32]	*
+************************************************************************/
+
+void MakeCriticalSectionGlobal(CRITICAL_SECTION *lpCrit)
+{
+   /* nothing (SysV Semaphores are already global) */
+   return;	
+}
+
diff --git a/win32/user32.c b/win32/user32.c
index b7dff9c..5a1192a 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 @@
                        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 0fdc6ef..00de7ff 100644
--- a/windows/caret.c
+++ b/windows/caret.c
@@ -123,16 +123,25 @@
 
 
 /*****************************************************************
- *           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 @@
    
 
 /*****************************************************************
- *           DestroyCaret   (USER.164) (USER32.130)
+ *           DestroyCaret16   (USER.164)
  */
-BOOL16 DestroyCaret(void)
+void DestroyCaret16(void)
+{
+    DestroyCaret32();
+}
+
+
+/*****************************************************************
+ *           DestroyCaret32   (USER32.130)
+ */
+BOOL32 DestroyCaret32(void)
 {
     if (!Caret.hwnd) return FALSE;
 
@@ -182,9 +200,18 @@
 
 
 /*****************************************************************
- *           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 @@
 /*****************************************************************
  *           HideCaret16   (USER.166)
  */
-BOOL16 HideCaret16( HWND16 hwnd )
+void HideCaret16( HWND16 hwnd )
 {
-    return HideCaret32( hwnd );
+    HideCaret32( hwnd );
 }
 
 
@@ -234,9 +261,9 @@
 /*****************************************************************
  *           ShowCaret16   (USER.167)
  */
-BOOL16 ShowCaret16( HWND16 hwnd )
+void ShowCaret16( HWND16 hwnd )
 {
-    return ShowCaret32( hwnd );
+    ShowCaret32( hwnd );
 }
 
 
@@ -265,9 +292,17 @@
 
 
 /*****************************************************************
- *           SetCaretBlinkTime   (USER.168) (USER32.464)
+ *           SetCaretBlinkTime16   (USER.168)
  */
-BOOL16 SetCaretBlinkTime( UINT32 msecs )
+void SetCaretBlinkTime16( UINT16 msecs )
+{
+    SetCaretBlinkTime32( msecs );
+}
+
+/*****************************************************************
+ *           SetCaretBlinkTime32   (USER32.464)
+ */
+BOOL32 SetCaretBlinkTime32( UINT32 msecs )
 {
     if (!Caret.hwnd) return FALSE;
 
diff --git a/windows/class.c b/windows/class.c
index d04e707..fa0d470 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 @@
  *
  * Free a class structure.
  */
-static BOOL CLASS_FreeClass( CLASS *classPtr )
+static BOOL32 CLASS_FreeClass( CLASS *classPtr )
 {
     CLASS **ppClass;
 
@@ -556,9 +560,18 @@
 
 
 /***********************************************************************
- *           GetClassWord    (USER.129) (USER32.218)
+ *           GetClassWord16    (USER.129)
  */
-WORD GetClassWord( HWND32 hwnd, INT32 offset )
+WORD GetClassWord16( HWND16 hwnd, INT16 offset )
+{
+    return GetClassWord32( hwnd, offset );
+}
+
+
+/***********************************************************************
+ *           GetClassWord32    (USER32.218)
+ */
+WORD GetClassWord32( HWND32 hwnd, INT32 offset )
 {
     WND * wndPtr;
     
@@ -635,7 +648,7 @@
         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 @@
 
 
 /***********************************************************************
- *           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 @@
         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 @@
     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 @@
     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 08c09e1..cc92e5c 100644
--- a/windows/dce.c
+++ b/windows/dce.c
@@ -188,7 +188,7 @@
  * 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 @@
     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 @@
     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 @@
 
                     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 d5d2f33..618e3df 100644
--- a/windows/defdlg.c
+++ b/windows/defdlg.c
@@ -52,7 +52,7 @@
 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 @@
 
     /* 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 @@
 
     /* 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 @@
 
     /* 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 5581bf7..fec17be 100644
--- a/windows/defwnd.c
+++ b/windows/defwnd.c
@@ -215,13 +215,13 @@
     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 @@
 	{
 	    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 @@
 	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 17d1680..366dd8a 100644
--- a/windows/dialog.c
+++ b/windows/dialog.c
@@ -296,7 +296,7 @@
                 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 @@
     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 4800aed..86c3129 100644
--- a/windows/event.c
+++ b/windows/event.c
@@ -670,7 +670,7 @@
 	    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 @@
 		      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 @@
  */
 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 06467a6..3c28c8e 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 @@
 	{
 	    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 8dd1d65..6169fa7 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 59ffd20..e01d3b7 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 @@
                 *plParam = (LPARAM)lprect32;
                 break;
             }
-	    break;
 	  } 
+	  break;
 
 	case WH_MOUSE:
         {
diff --git a/windows/keyboard.c b/windows/keyboard.c
index 8ed9eeb..d1c0c98 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 @@
  */
 /* 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 @@
  *	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);
-	
-/* let's do this : char = keysym (for ANSI chars) -> keyc [ + shift ... (?? how ??)]
-keyc -> (keyc2vkey) vkey */
+	KeySym keysym;    	
+	int i,index;
+	int highbyte=0;
 
-	keycode = XKeysymToKeycode(display, cChar & 0xFF);
+	/* char->keysym (same for ANSI chars) */
+	keysym=(unsigned char) cChar;/* (!) cChar is signed */
+	if (keysym<=27) keysym+=0xFF00;/*special chars : return, backspace...*/
 	
-	dprintf_keyboard(stddeb," ... got keycode 0x%x ... returning 0x%x\n",
-			 keycode,keyc2vkey[keycode]);
-	return keyc2vkey[keycode];
+	keycode = XKeysymToKeycode(display, keysym);  /* keysym -> keycode */
+	if (!keycode)
+	{ /* It didn't work ... let's try with deadchar code. */
+	  keycode = XKeysymToKeycode(display, keysym | 0xFE00);
+	}
+
+	dprintf_keyboard(stddeb,"VkKeyScan '%c'(%#lx, %lu) : got keycode %#.2x ",
+	    cChar,keysym,keysym,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 @@
 	  {
 	    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 @@
 	((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 395a4ea..d8bb5a3 100644
--- a/windows/mdi.c
+++ b/windows/mdi.c
@@ -60,7 +60,7 @@
  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 @@
  *			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 @@
 /**********************************************************************
  *			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 @@
 /**********************************************************************
  *			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 @@
  *
  *  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 @@
 
 	    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 @@
     {
 	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 @@
 
     if ( hwndTo != hwndPrev )
 	{
-	  BOOL bOptimize = 0;
+	  BOOL32 bOptimize = 0;
 
 	  if( ci->hwndChildMaximized )
 	    {
@@ -520,7 +521,7 @@
     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 @@
  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 @@
  *
  * 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 @@
     RECT16		 rect;
     WND                 *w 	  = WIN_FindWndPtr(hwnd);
     WND			*frameWnd = w->parent;
-    INT			nItems;
+    INT32 nItems;
     
     ci = (MDICLIENTINFO *) w->wExtra;
     
@@ -1460,8 +1461,8 @@
       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 @@
       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 @@
 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 dfce8b0..ace5200 100644
--- a/windows/message.c
+++ b/windows/message.c
@@ -404,7 +404,8 @@
  *
  * 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 @@
  *
  * 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 @@
     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 @@
 
 
 /***********************************************************************
- *           ReplyMessage   (USER.115)
+ *           ReplyMessage16   (USER.115)
  */
-void ReplyMessage( LRESULT result )
+void ReplyMessage16( LRESULT result )
 {
     MESSAGEQUEUE *senderQ;
     MESSAGEQUEUE *queue;
@@ -659,8 +660,8 @@
 /***********************************************************************
  *           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 @@
 	    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 @@
 
 
 /***********************************************************************
- *           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 @@
 
 
 /***********************************************************************
- *           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 @@
             {
                 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 @@
     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 @@
         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 @@
         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 @@
         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 @@
 
 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 @@
     {'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 @@
             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 @@
             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 @@
         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 d8a0978..27a9793 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 d4001a1..d04d7df 100644
--- a/windows/nonclient.c
+++ b/windows/nonclient.c
@@ -64,7 +64,8 @@
  * 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 @@
 /***********************************************************************
  *           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 @@
 /***********************************************************************
  *           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 @@
  * 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 @@
  *
  * 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 @@
  * 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 @@
 
     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 @@
 {
     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 @@
 
     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 @@
 
     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 @@
             DispatchMessage16( msg );
             break;
 	}
-        if (!IsWindow( hwnd ))
+        if (!IsWindow32( hwnd ))
         {
             ReleaseCapture();
             break;
diff --git a/windows/painting.c b/windows/painting.c
index 2c5e4f9..78f6062 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 @@
            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 @@
            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 @@
 
 
 /***********************************************************************
- *           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 @@
 	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 @@
 
 
 /***********************************************************************
- *           GetUpdateRgn   (USER.237) (USER32.297)
+ *           GetUpdateRgn16   (USER.237)
  */
-INT16 GetUpdateRgn( HWND32 hwnd, HRGN32 hrgn, BOOL32 erase )
+INT16 GetUpdateRgn16( HWND16 hwnd, HRGN16 hrgn, BOOL16 erase )
+{
+    return GetUpdateRgn32( hwnd, hrgn, erase );
+}
+
+
+/***********************************************************************
+ *           GetUpdateRgn32   (USER32.297)
+ */
+INT32 GetUpdateRgn32( HWND32 hwnd, HRGN32 hrgn, BOOL32 erase )
 {
     INT32 retval;
     WND * wndPtr = WIN_FindWndPtr( hwnd );
@@ -611,7 +629,7 @@
 
     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 @@
 
 
 /***********************************************************************
- *           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 @@
 	DeleteObject32( hrgn );
 	return ret;
     } 
-    return GetClipBox16(hdc, &rect);
+    return GetClipBox32( hdc, &rect );
 }
 
 
diff --git a/windows/property.c b/windows/property.c
index 0762558..ab6daf4 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 dc99aed..a74945c 100644
--- a/windows/queue.c
+++ b/windows/queue.c
@@ -328,7 +328,7 @@
     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 @@
     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 @@
  *
  * 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 @@
 
 
 /***********************************************************************
- *           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 682b438..85371bf 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 @@
 	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 @@
         /* 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 @@
     {
 	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 @@
           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 @@
 
 	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 8bbfb5e..d63753d 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 @@
     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 4f4ef67..93f8563 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 da44073..d273b2b 100644
--- a/windows/win.c
+++ b/windows/win.c
@@ -277,7 +277,7 @@
 {
     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 @@
     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 @@
         }
         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 @@
             }
 
             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 @@
 
   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 @@
 
     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 @@
         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 @@
       /* 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 @@
 
 
 /**********************************************************************
- *	     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 @@
 
 
 /**********************************************************************
- *	     SetWindowWord    (USER.134) (USER32.523)
+ *	     SetWindowWord16    (USER.134)
  */
-WORD SetWindowWord( HWND32 hwnd, INT32 offset, WORD newval )
+WORD SetWindowWord16( HWND16 hwnd, INT16 offset, WORD newval )
+{
+    return SetWindowWord32( hwnd, offset, newval );
+}
+
+
+/**********************************************************************
+ *	     SetWindowWord32    (USER32.523)
+ */
+WORD SetWindowWord32( HWND32 hwnd, INT32 offset, WORD newval )
 {
     WORD *ptr, retval;
     WND * wndPtr = WIN_FindWndPtr( hwnd );
@@ -1499,7 +1517,7 @@
     {
         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 @@
     return SendMessage32W( hwnd, WM_GETTEXTLENGTH, 0, 0 );
 }
 
+
 /*******************************************************************
- *         IsWindow   (USER.47) (USER32.347)
+ *         IsWindow16   (USER.47)
  */
-BOOL16 IsWindow( HWND32 hwnd )
+BOOL16 IsWindow16( HWND16 hwnd )
+{
+    return IsWindow32( hwnd );
+}
+
+
+/*******************************************************************
+ *         IsWindow32   (USER32.347)
+ */
+BOOL32 IsWindow32( HWND32 hwnd )
 {
     WND * wndPtr = WIN_FindWndPtr( hwnd );
     return ((wndPtr != NULL) && (wndPtr->dwMagic == WND_MAGIC));
@@ -1730,7 +1758,7 @@
     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 @@
     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 @@
     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 @@
     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 @@
 }
 
 /******************************************************************************
- *                              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 d802981..876e65b 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 @@
     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 @@
         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 @@
     }
 
     /* 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 @@
 	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 @@
         {
             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 @@
         {
             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 @@
             }
             HeapFree( SystemHeap, 0, list );
         }
-	if (!IsWindow(hWnd)) return 0;
+	if (!IsWindow32(hWnd)) return 0;
     }
 
     if (hWnd)
@@ -1136,7 +1135,7 @@
                       MAKELPARAM( (HWND16)hwndPrevActive, wIconized) );
 #endif
 
-        if( !IsWindow(hWnd) ) return 0;
+        if( !IsWindow32(hWnd) ) return 0;
     }
 
     /* change focus if possible */
@@ -1519,7 +1518,8 @@
          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 @@
             /* 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 e8946ee..d7a196a 100644
--- a/windows/winproc.c
+++ b/windows/winproc.c
@@ -235,6 +235,7 @@
  */
 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 6445a31..fa20fd4 100644
--- a/wine.man
+++ b/wine.man
@@ -109,7 +109,7 @@
 .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