diff --git a/ANNOUNCE b/ANNOUNCE
index 0642a55..2b89c81 100644
--- a/ANNOUNCE
+++ b/ANNOUNCE
@@ -1,13 +1,13 @@
-This is release 970415 of Wine, the MS Windows emulator.  This is still a
+This is release 970509 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-970415: (see ChangeLog for details)
-	- Edit control improvements.
-	- Some files moved around.
+WHAT'S NEW with Wine-970509: (see ChangeLog for details)
+	- Better local heap implementation.
+	- Improvements to -managed mode.
 	- Lots of bug fixes.
 
 See the README file in the distribution for installation instructions.
@@ -16,11 +16,11 @@
 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-970415.tar.gz
-  ftp://tsx-11.mit.edu/pub/linux/ALPHA/Wine/development/Wine-970415.tar.gz
-  ftp://ftp.infomagic.com/pub/mirrors/linux/wine/development/Wine-970415.tar.gz
-  ftp://aris.com/pub/linux/ALPHA/Wine/development/Wine-970415.tar.gz
-  ftp://ftp.progsoc.uts.edu.au/pub/Wine/development/Wine-970415.tar.gz
+  ftp://sunsite.unc.edu/pub/Linux/ALPHA/wine/development/Wine-970509.tar.gz
+  ftp://tsx-11.mit.edu/pub/linux/ALPHA/Wine/development/Wine-970509.tar.gz
+  ftp://ftp.infomagic.com/pub/mirrors/linux/wine/development/Wine-970509.tar.gz
+  ftp://aris.com/pub/linux/ALPHA/Wine/development/Wine-970509.tar.gz
+  ftp://ftp.progsoc.uts.edu.au/pub/Wine/development/Wine-970509.tar.gz
 
 It should also be available from any site that mirrors tsx-11 or sunsite.
 
diff --git a/ChangeLog b/ChangeLog
index dde65a7..45d2aef 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,4 +1,122 @@
 ----------------------------------------------------------------------
+Tue May  6 19:12:20 1997  Alexandre Julliard  <julliard@lrc.epfl.ch>
+
+	* [loader/task.c] [loader/module.c]
+	Fixed command line in LoadModule to already include the length
+	indicator (thanks to Andreas Mohr).
+
+	* [windows/dialog.c]
+	DlgDirList: fixed behavior with DDL_DRIVES | DDL_EXCLUSIVE (thanks
+	to Bruce Milner for this one); correctly update file spec on exit.
+
+	* [windows/winproc.c] [if1632/thunk.c] [include/callback.h]
+	Moved emulator-specific code for calling window procedure to
+	thunk.c.
+
+Mon Apr 28 10:21:59 1997  Huw D M Davies <h.davies1@physics.oxford.ac.uk>
+
+	* [memory/local.c]
+	Better implementation of moveable blocks (first word in block is
+	the handle itself) and discarded blocks. Local(Re)Alloc is much
+	more like the real thing.
+
+Thu Apr 24 19:50:19 1997  Albrecht Kleine <kleine@ak.sax.de>
+
+	* [objects/metafile.c]
+	Added handling of meta record META_DIBCREATEPATTERNBRUSH.
+
+Mon Apr 21 14:03:32 1997  Alex Korobka <alex@trantor.pharm.sunysb.edu>
+
+	* [multimedia/mmsystem.c] [multimedia/audio.c]
+	Fixed leftover problems with masked device IDs.
+
+	* [msdos/int21.c]
+	Removed code duplications, fixed Write.
+
+	* [windows/event.c] [windows/dce.c] [windows/nonclient.c]
+	  [windows/winpos.c]
+	Yet another attempt to make -managed work better.
+
+	* [controls/combo.c]
+	UI fix.
+
+Mon Apr 21 13:10:24 1997  Marcus Meissner <msmeissn@immd4.informatik.uni-erlangen.de>
+
+	* [debugger/*]
+	All "Loading from ..." lines merged into one so important
+	information before the crash doesn't scroll out.
+
+	* [if1632/kernel.spec]
+	Added some ordinal stubs used by win95 OLE and friends.
+
+	* [win32/process.c] [if1632/kernel.spec] [loader/module.c]
+	MsgWaitForMultipleObjects,GetProcessTimes,RtlImageNtHeaders,
+ 	LoadLibraryEx32W and GetProcAddress32W added.
+
+	* [objects/bitmap.c]
+	XImages use another memory layout for depth 4 (and poss. other
+ 	depths) then Windows bitmaps. Replaced speedup hack by generic
+ 	(and better working) code.
+
+	* [objects/dib.c]
+	Another ximage!=bitmap memory layout bug. 
+	All _XinitImageFuncPtrs except one removed.
+
+Sun Apr 20 17:12:30 1997  Andrew Taylor <andrew@riscan.com>
+
+	* [multimedia/audio.c]
+	Fixed some regression bugs.
+
+Sun Apr 20 12:15:09 1997  Andreas Mohr <100.30936@germany.net>
+
+	* [loader/module.c]
+	Fixed MODULE_LoadExeHeader() to use the correct offset for
+	fast-load area.
+
+Sat Apr 19 16:40:00 1997  Chad Fraleigh <chadf@bookcase.com>
+
+	* [controls/*] [debugger/*] [graphics/win16drv/*] [loader/*] [misc/*]
+	  [win32/*]
+	Removed <malloc.h> and added <stdlib.h> where needed.
+	Changed printf formaters to match argument types (%lx instead of %x).
+	Casted some types to make the compiler happy. Mostly pointer<->ulong.
+
+	* [graphics/win16drv/init.c]
+	Fixed uninitialized variable.
+
+	* [include/msdos.h]
+	Added <sys/types.h> needed for <dirent.h>.
+
+	* [include/sigcontext.h]
+	Combined a common NetBSD & FreeBSD #ifdef, and added in OpenBSD.
+	Casted EIP_sig/ESP_sig to be unsigned long (declared as 'int' in *BSD).
+
+	* [misc/crtdll.c] [misc/lstr.c]
+	Casted last argument in v*printf() to be va_list. This code seems to
+	make BIG assumptions about the implementation of va_list.
+
+	* [misc/ver.c]
+	Fixed impossible if() expression (unsigned < 0).
+
+	* [misc/winsock.c]
+	Removed semicolon on the end of an if() statement.
+
+	* [windows/mdi.c]
+	Changed a counter/index to unsigned since it was complaining about
+	signed/unsigned comparison and didn't need to be negative.
+
+Wed Apr 16 17:43:19 1997 Georg Beyerle <gbeyerle@awi-potsdam.de>
+
+	* [scheduler/thread.c]
+	Minor fix in thread database initialization.
+
+Wed Apr 16 17:28:05 1997  Andreas Mohr <100.30936@germany.net>
+
+	* [files/file.c]
+	Fixed FILE_FillInfo() to omit the archive flag when handling a DOS
+	directory entry.
+
+----------------------------------------------------------------------
 Mon Apr 14 11:22:54 1997  John Harvey <john@division.co.uk>
 
 	* [graphics/win16drv/init.c]
diff --git a/Makefile.in b/Makefile.in
index f861a0a..afb9edd 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -111,7 +111,7 @@
 
 install_wine: dummy
 	$(INSTALL_PROGRAM) wine $(bindir)/wine
-	$(INSTALL_DATA) wine.man $(mandir)/wine$(manext)
+	$(INSTALL_DATA) $(TOPSRC)/wine.man $(mandir)/wine$(manext)
 
 libwine.a: $(COMMONSUBDIRS) $(LIBSUBDIRS) dummy
 	$(RM) $@
@@ -139,7 +139,7 @@
 	done
 
 etags:
-	etags `find . -name '*.[chS]' -print`
+	etags `find . -name '*.[chS]' -print | grep -v dbgmain`
 
 clean:
 	for i in $(ALLSUBDIRS); do (cd $$i; $(MAKE) clean) || exit 1; done
diff --git a/controls/combo.c b/controls/combo.c
index 7bfb68d..cd1a6b5 100644
--- a/controls/combo.c
+++ b/controls/combo.c
@@ -395,26 +395,26 @@
  */
 static void CBPaintText(LPHEADCOMBO lphc, HDC16 hdc)
 {
-   INT32	id, size;
+   INT32	id, size = 0;
    LPSTR	pText = NULL;
 
    /* follow Windows combobox that sends a bunch of text 
-    * inquiries to its listbox while processing WM_PAINT.
-    */
+    * inquiries to its listbox while processing WM_PAINT. */
 
-   size = SendMessage32A( lphc->hWndLBox, LB_GETTEXTLEN32,
-	 	(id = SendMessage32A(lphc->hWndLBox, LB_GETCURSEL32, 0, 0)), 0);
-
-   if( !(pText = HeapAlloc( GetProcessHeap(), 0, size + 1)) ) return;
-
-   SendMessage32A( lphc->hWndLBox, LB_GETTEXT32, (WPARAM32)id, (LPARAM)pText );
-   pText[size] = '\0';	/* just in case */
+   if( (id = SendMessage32A(lphc->hWndLBox, LB_GETCURSEL32, 0, 0) ) != LB_ERR )
+   {
+        size = SendMessage32A( lphc->hWndLBox, LB_GETTEXTLEN32, id, 0);
+        if( (pText = HeapAlloc( GetProcessHeap(), 0, size + 1)) )
+	{
+	    SendMessage32A( lphc->hWndLBox, LB_GETTEXT32, (WPARAM32)id, (LPARAM)pText );
+	    pText[size] = '\0';	/* just in case */
+	} else return;
+   }
 
    if( lphc->wState & CBF_EDIT )
    {
-	if( CB_HASSTRINGS(lphc) )
-	    SetWindowText32A( lphc->hWndEdit, (pText) ? pText : "" );
-	if( lphc->wState & CBF_FOCUSED )
+	if( CB_HASSTRINGS(lphc) ) SetWindowText32A( lphc->hWndEdit, pText );
+	if( lphc->wState & CBF_FOCUSED ) 
 	    SendMessage32A( lphc->hWndEdit, EM_SETSEL32, 0, (LPARAM)(-1));
    }
    else /* paint text field ourselves */
@@ -478,8 +478,9 @@
 	    else
 	    {
 		ExtTextOut32A( hDC, rect.left + 1, rect.top + 1,
-			       ETO_OPAQUE | ETO_CLIPPED, &rect, pText, size, NULL );
-		if( lphc->wState & CBF_FOCUSED && !(lphc->wState & CBF_DROPPED) )
+                               ETO_OPAQUE | ETO_CLIPPED, &rect,
+                               (pText) ? pText : "" , size, NULL );
+		if(lphc->wState & CBF_FOCUSED && !(lphc->wState & CBF_DROPPED))
 		    DrawFocusRect32( hDC, &rect );
 	    }
 
@@ -957,7 +958,7 @@
    /* get it from the listbox */
 
    idx = SendMessage32A( lphc->hWndLBox, LB_GETCURSEL32, 0, 0 );
-   if( idx >= 0 )
+   if( idx != LB_ERR )
    {
        LPSTR        lpBuffer;
        INT32	    length = SendMessage32A( lphc->hWndLBox, LB_GETTEXTLEN32,
diff --git a/controls/menu.c b/controls/menu.c
index 6dda2f3..f266e8f 100644
--- a/controls/menu.c
+++ b/controls/menu.c
@@ -2365,7 +2365,7 @@
     LPPOPUPMENU	menu;
 
     if (!(menu = (LPPOPUPMENU) USER_HEAP_LIN_ADDR(hMenu))) return -1;
-    if ((nPos < 0) || (nPos >= menu->nItems)) return -1;
+    if ((nPos < 0) || ((UINT16) nPos >= menu->nItems)) return -1;
     if (menu->items[nPos].item_flags & MF_POPUP) return -1;
     return menu->items[nPos].item_id;
 }
diff --git a/debugger/dbg.y b/debugger/dbg.y
index a4ca4f3..b913c70 100644
--- a/debugger/dbg.y
+++ b/debugger/dbg.y
@@ -433,6 +433,7 @@
 	 * don't grok that yet, and in this case we fall back to using
 	 * the wine.sym file.
 	 */
+	fprintf(stderr,"Loading symbols: ");
 	if( DEBUG_ReadExecutableDbgInfo() == FALSE )
         {
 	    PROFILE_GetWineIniString( "wine", "SymbolTableFile", "wine.sym",
@@ -447,6 +448,7 @@
 	DEBUG_ProcessDeferredDebug();
 
         DEBUG_LoadEntryPoints();
+	fprintf(stderr,"\n");
     }
 
 #if 0
diff --git a/debugger/hash.c b/debugger/hash.c
index ab63c4a..610785f 100644
--- a/debugger/hash.c
+++ b/debugger/hash.c
@@ -755,8 +755,7 @@
 
         name = (unsigned char *)pModule + pModule->name_table;
 
-        fprintf( stderr, "Loading symbols from Win16 module %.*s...\n",
-                 *name, name + 1 );
+        fprintf( stderr, " %.*s",*name, name + 1 );
 
         /* First search the resident names */
 
diff --git a/debugger/msc.c b/debugger/msc.c
index 844e642..3668877 100644
--- a/debugger/msc.c
+++ b/debugger/msc.c
@@ -24,7 +24,6 @@
 #include <limits.h>
 #include <string.h>
 #include <unistd.h>
-#include <malloc.h>
 #ifndef PATH_MAX
 #define PATH_MAX _MAX_PATH
 #endif
@@ -2324,8 +2323,7 @@
 
       if( last_proc != deefer->dbg_index )
 	{
-	  fprintf(stderr, "Loading symbols from Win32 file %s...\n", 
-		  deefer->module_name);
+	  fprintf(stderr, " %s",deefer->module_name);
 	  last_proc = deefer->dbg_index;
 	}
 
diff --git a/debugger/source.c b/debugger/source.c
index 2e3f073..56b686a 100644
--- a/debugger/source.c
+++ b/debugger/source.c
@@ -15,7 +15,6 @@
 #include <limits.h>
 #include <string.h>
 #include <unistd.h>
-#include <malloc.h>
 #ifndef PATH_MAX
 #define PATH_MAX _MAX_PATH
 #endif
diff --git a/debugger/stabs.c b/debugger/stabs.c
index 83e99bf..dcdeaeb 100644
--- a/debugger/stabs.c
+++ b/debugger/stabs.c
@@ -1110,8 +1110,9 @@
 
   /*
    * Give a nice status message here...
+   * Well not, just print the name.
    */
-  fprintf(stderr, "Loading symbols from ELF file %s...\n", filename);
+  fprintf(stderr, " %s", filename);
 
   /*
    * Next, we need to find a few of the internal ELF headers within
@@ -1359,7 +1360,7 @@
   /*
    * Give a nice status message here...
    */
-  fprintf(stderr, "Loading symbols from a.out file %s...\n", exe_name);
+  fprintf(stderr, " %s", exe_name);
 
   rtn = TRUE;
 
diff --git a/debugger/stack.c b/debugger/stack.c
index 8c668ad..ca2bcc7 100644
--- a/debugger/stack.c
+++ b/debugger/stack.c
@@ -6,7 +6,7 @@
  */
 
 #include <stdio.h>
-#include <malloc.h>
+#include <stdlib.h>
 #include "xmalloc.h"
 #include "windows.h"
 #include "debugger.h"
diff --git a/debugger/types.c b/debugger/types.c
index 1bbc6ed..137b662 100644
--- a/debugger/types.c
+++ b/debugger/types.c
@@ -17,7 +17,6 @@
 #include <limits.h>
 #include <string.h>
 #include <unistd.h>
-#include <malloc.h>
 
 #include "win.h"
 #include "pe_image.h"
diff --git a/files/file.c b/files/file.c
index 47e02e8..641957f 100644
--- a/files/file.c
+++ b/files/file.c
@@ -309,9 +309,10 @@
  */
 static void FILE_FillInfo( struct stat *st, BY_HANDLE_FILE_INFORMATION *info )
 {
-    info->dwFileAttributes = FILE_ATTRIBUTE_ARCHIVE;
     if (S_ISDIR(st->st_mode))
-        info->dwFileAttributes |= FILE_ATTRIBUTE_DIRECTORY;
+        info->dwFileAttributes = FILE_ATTRIBUTE_DIRECTORY;
+    else
+        info->dwFileAttributes = FILE_ATTRIBUTE_ARCHIVE;
     if (!(st->st_mode & S_IWUSR))
         info->dwFileAttributes |= FILE_ATTRIBUTE_READONLY;
 
@@ -1168,6 +1169,9 @@
 
     if (!file)
     {
+	/* Linux EINVAL's on us if we don't pass MAP_PRIVATE to an anon mmap */
+	flags &= ~MAP_SHARED;
+	flags |= MAP_PRIVATE;
 #ifdef MAP_ANON
         flags |= MAP_ANON;
 #else
diff --git a/graphics/win16drv/font.c b/graphics/win16drv/font.c
index 09bc7aa..db761f1 100644
--- a/graphics/win16drv/font.c
+++ b/graphics/win16drv/font.c
@@ -39,7 +39,7 @@
 			      NULL, str, 
 			      -count,  physDev->segptrFontInfo, lpDrawMode, 
 			      lpTextXForm, NULL, NULL, 0);
-    printf("LPGDI_GetTextExtPoint: cx=0x%x, cy=0x%x Ret 0x%x\n", size->cx,size->cy,dwRet);
+    printf("LPGDI_GetTextExtPoint: cx=0x%x, cy=0x%x Ret 0x%lx\n", size->cx, size->cy, dwRet);
 
     return TRUE;
 }
diff --git a/graphics/win16drv/init.c b/graphics/win16drv/init.c
index f67c2a2..da9e60b 100644
--- a/graphics/win16drv/init.c
+++ b/graphics/win16drv/init.c
@@ -395,8 +395,8 @@
 	case 0x100:
 	  {
 	    LPEXTTEXTDATA textData =  PTR_SEG_TO_LIN(lpInData);
-	    printf("Got in data 0x%x textData 0x%x\n",lpInData, textData);
-	    printf("size %d in 0x%x:0x%x font 0x%x:0x%x xform 0x%x:0x%x drawm 0x%x:0x%x\n",
+	    printf("Got in data 0x%lx textData 0x%p\n",lpInData, textData);
+	    printf("size %d in 0x%p:0x%p font 0x%p:0x%p xform 0x%p:0x%p drawm 0x%p:0x%p\n",
 		   textData->nSize,
 		   textData->lpindata,PTR_SEG_TO_LIN(textData->lpindata),
 		   textData->lpFont,PTR_SEG_TO_LIN(textData->lpFont),
@@ -450,7 +450,7 @@
 ExtractPQ(HPQ hPQ) 
 { 
     struct hpq *queue, *prev, *current, *currentPrev;
-    int key, tag = -1;
+    int key = 0, tag = -1;
     currentPrev = prev = NULL;
     queue = current = hpqueue;
     if (current)
@@ -651,7 +651,7 @@
 
     dprintf_win16drv(stddeb, "WriteDialog: %04x %04x \"%s\"\n", hJob,  cchMsg, lpMsg);
 
-    nRet = MessageBox16(NULL, lpMsg, "Printing Error", MB_OKCANCEL);
+    nRet = MessageBox16(0, lpMsg, "Printing Error", MB_OKCANCEL);
     return nRet;
 }
 
diff --git a/if1632/comdlg32.spec b/if1632/comdlg32.spec
index 8ca5480..b6fa002 100644
--- a/if1632/comdlg32.spec
+++ b/if1632/comdlg32.spec
@@ -19,8 +19,8 @@
 0014 stub LoadAlterBitmap
 0015 stub PageSetupDlgA
 0016 stub PageSetupDlgW
-0017 stub PrintDlgA
-0018 stub PrintDlgW
+0017 return PrintDlgA 4 0
+0018 return PrintDlgW 4 0
 0019 stub ReplaceTextA
 0020 stub ReplaceTextW
 0021 stub WantArrows
diff --git a/if1632/kernel.spec b/if1632/kernel.spec
index 422e68e..3721737 100644
--- a/if1632/kernel.spec
+++ b/if1632/kernel.spec
@@ -73,8 +73,8 @@
 74  pascal16 OpenFile(ptr ptr word) OpenFile16
 75  stub OpenPathName
 76  stub DeletePathName
-#77 RESERVED1
-#78 RESERVED2
+77 stub KERNEL_77		#RESERVED1
+78 stub KERNEL_78 		#RESERVED2
 #79 RESERVED3
 #80 RESERVED4
 81  pascal16 _lclose(word) _lclose16
@@ -205,6 +205,12 @@
 205 stub CVWBreak
 206 pascal16 AllocSelectorArray(word) AllocSelectorArray
 207 pascal16 IsDBCSLeadByte(word) IsDBCSLeadByte16
+208 stub KERNEL_208
+209 stub KERNEL_209
+210 stub KERNEL_210
+211 stub KERNEL_211
+213 stub KERNEL_213
+214 stub KERNEL_214
 216 pascal   RegEnumKey(long long ptr long) RegEnumKey16
 217 pascal   RegOpenKey(long ptr ptr) RegOpenKey16
 218 pascal   RegCreateKey(long ptr ptr) RegCreateKey16
@@ -217,14 +223,17 @@
 225 pascal   RegQueryValueEx(long ptr ptr ptr ptr ptr) RegQueryValueEx16
 226 pascal   RegSetValueEx(long ptr long long ptr long) RegSetValueEx16
 227 pascal   RegFlushKey(long) RegFlushKey
-#228 K228
-#229 K229
+228 stub K228
+229 stub K229
 230 stub GlobalSmartPageLock
 231 stub GlobalSmartPageUnlock
 232 stub RegLoadKey
 233 stub RegUnloadKey
 234 stub RegSaveKey
 235 stub InvalidateNlsCache
+237 stub KERNEL_237
+262 stub KERNEL_262
+263 stub KERNEL_263
 310 pascal16 LocalHandleDelta(word) LocalHandleDelta
 311 stub GetSetKernelDosProc
 314 stub DebugDefineSegment
@@ -237,7 +246,7 @@
 324 stub LogError
 325 stub LogParamError
 326 return IsRomFile 2 0
-#327 K327
+327 stub KERNEL_327
 328 stub _DebugOutput
 #329 K329
 #332 stub THHOOK
@@ -264,6 +273,9 @@
 354 pascal   GetAppCompatFlags(word) GetAppCompatFlags16
 355 pascal16 GetWinDebugInfo(ptr word) GetWinDebugInfo
 356 pascal16 SetWinDebugInfo(ptr) SetWinDebugInfo
+357 stub KERNEL_357
+358 stub KERNEL_358
+359 stub KERNEL_359
 360 stub OpenFileEx
 #361 PIGLET_361
 403 pascal16 FarSetOwner(word word) FarSetOwner
@@ -282,14 +294,48 @@
 420 pascal   GetFileAttributes(ptr) GetFileAttributes16
 421 pascal16 SetFileAttributes(ptr long) SetFileAttributes16
 422 pascal16 GetDiskFreeSpace(ptr ptr ptr ptr ptr) GetDiskFreeSpace16 
+431 stub KERNEL_431
 432 stub FileTimeToLocalFileTime
+435 stub KERNEL_435
+439 stub KERNEL_439
+440 stub KERNEL_440
+444 stub KERNEL_444
+445 stub KERNEL_445
+446 stub KERNEL_446
+447 stub KERNEL_447
+449 stub KERNEL_449
 450 pascal16 KERNEL_450() stub_KERNEL_450
+454 stub KERNEL_454
+455 stub KERNEL_455
+471 stub KERNEL_471
+472 stub KERNEL_472
+473 stub KERNEL_473
+482 stub KERNEL_482
 491 stub RegisterServiceProcess
-513 stub LoadLibraryEx32W
+500 stub KERNEL_500
+502 stub KERNEL_502
+503 stub KERNEL_503
+511 stub KERNEL_511
+513 pascal LoadLibraryEx32W(ptr long long) LoadLibraryEx32W16
 514 stub FreeLibrary32W
-515 stub GetProcAddress32W
+515 pascal GetProcAddress32W(long ptr) GetProcAddress32
 516 stub GetVDMPointer32W
 517 stub CallProc32W
 518 stub CallProcEx32W
+519 stub KERNEL_519
+522 stub KERNEL_522
+525 stub KERNEL_525
+600 stub KERNEL_600
+601 stub KERNEL_601
+604 stub KERNEL_604
+605 stub KERNEL_605
+612 stub KERNEL_612
+613 stub KERNEL_613
+614 stub KERNEL_614
+619 stub KERNEL_619
+621 stub KERNEL_621
 627 stub IsBadFlatReadWritePtr
+630 stub KERNEL_630
 631 stub FUNC004	# shell hook
+651 stub KERNEL_651
+700 return KERNEL_700 0 1
diff --git a/if1632/kernel32.spec b/if1632/kernel32.spec
index 29ca260..23d4f31 100644
--- a/if1632/kernel32.spec
+++ b/if1632/kernel32.spec
@@ -264,7 +264,7 @@
 0259 stdcall GetProcessHeap() GetProcessHeap
 0260 stub GetProcessHeaps
 0261 stub GetProcessShutdownParameters
-0262 stub GetProcessTimes
+0262 stdcall GetProcessTimes(long ptr ptr ptr ptr) GetProcessTimes
 0263 stub GetProcessWorkingSetSize
 0264 stdcall GetProfileIntA(ptr ptr long) GetProfileInt32A
 0265 stdcall GetProfileIntW(ptr ptr long) GetProfileInt32W
@@ -685,3 +685,4 @@
 0679 stdcall MapLS(ptr) MapLS
 0680 stdcall UnMapLS(long) UnMapLS
 0681 stub OpenVxDHandle
+0682 stub FT_Exit12
diff --git a/if1632/ntdll.spec b/if1632/ntdll.spec
index 0ccee24..42d9ef2 100644
--- a/if1632/ntdll.spec
+++ b/if1632/ntdll.spec
@@ -398,7 +398,7 @@
 394 stub RtlGetUserInfoHeap
 395 stub RtlIdentifierAuthoritySid
 396 stub RtlImageDirectoryEntryToData
-397 stub RtlImageNtHeader
+397 stdcall RtlImageNtHeader(long) RtlImageNtHeader
 398 stub RtlImpersonateSelf
 399 stdcall RtlInitAnsiString(ptr ptr) RtlInitAnsiString
 400 stub RtlInitCodePageTable
@@ -877,7 +877,7 @@
 873 stub _stricmp
 874 stub _strlwr
 875 stub _strnicmp
-876 stub _strupr
+876 stdcall _strupr(ptr) CRTDLL__strupr
 877 stub _ultoa
 878 stub _vsnprintf
 879 stdcall _wcsicmp(ptr ptr) lstrcmpi32W
diff --git a/if1632/relay.c b/if1632/relay.c
index 045bb16..8e8a15f 100644
--- a/if1632/relay.c
+++ b/if1632/relay.c
@@ -26,6 +26,7 @@
 BOOL32 RELAY_Init(void)
 {
     WORD codesel;
+    extern BOOL32 THUNK_Init(void);
 
       /* Allocate the code selector for CallTo16 routines */
 
@@ -44,7 +45,10 @@
                                     codesel );
     CALLTO16_RetAddr_long=MAKELONG( (int)CALLTO16_Ret_long-(int)CALLTO16_Start,
                                     codesel );
-    return TRUE;
+
+    /* Initialize thunking */
+
+    return THUNK_Init();
 }
 
 
diff --git a/if1632/thunk.c b/if1632/thunk.c
index f566103..20f05cd 100644
--- a/if1632/thunk.c
+++ b/if1632/thunk.c
@@ -9,9 +9,11 @@
 #include "heap.h"
 #include "hook.h"
 #include "module.h"
+#include "winproc.h"
+#include "stackframe.h"
+#include "except.h"
 #include "stddebug.h"
 #include "debug.h"
-#include "except.h"
 
 typedef void (*RELAY)();
 
@@ -37,6 +39,21 @@
 
 static THUNK *firstThunk = NULL;
 
+static LRESULT THUNK_CallWndProc16( WNDPROC16 proc, HWND16 hwnd, UINT16 msg,
+                                    WPARAM16 wParam, LPARAM lParam );
+
+/***********************************************************************
+ *           THUNK_Init
+ */
+BOOL32 THUNK_Init(void)
+{
+    /* Set the window proc calling functions */
+    WINPROC_SetCallWndProc16( THUNK_CallWndProc16 );
+    WINPROC_SetCallWndProc32( (WINPROC_CALLWNDPROC32)CallTo32_4 );
+    return TRUE;
+}
+
+
 /***********************************************************************
  *           THUNK_Alloc
  */
@@ -72,7 +89,7 @@
 /***********************************************************************
  *           THUNK_Free
  */
-void THUNK_Free( THUNK *thunk )
+static void THUNK_Free( THUNK *thunk )
 {
     if (HEAP_IsInsideHeap( GetProcessHeap(), 0, thunk ))
     {
@@ -90,6 +107,32 @@
 
 
 /***********************************************************************
+ *           THUNK_CallWndProc16
+ *
+ * Call a 16-bit window procedure
+ */
+static LRESULT THUNK_CallWndProc16( WNDPROC16 proc, HWND16 hwnd, UINT16 msg,
+                                    WPARAM16 wParam, LPARAM lParam )
+{
+    if ((msg == WM_CREATE) || (msg == WM_NCCREATE))
+    {
+        CREATESTRUCT16 *cs = (CREATESTRUCT16 *)PTR_SEG_TO_LIN(lParam);
+        /* Build the CREATESTRUCT on the 16-bit stack. */
+        /* This is really ugly, but some programs (notably the */
+        /* "Undocumented Windows" examples) want it that way.  */
+        return CallTo16_long_lllllllwlwwwl( (FARPROC16)proc,
+                         cs->dwExStyle, cs->lpszClass, cs->lpszName, cs->style,
+                         MAKELONG( cs->y, cs->x ), MAKELONG( cs->cy, cs->cx ),
+                         MAKELONG( cs->hMenu, cs->hwndParent ), cs->hInstance,
+                         (LONG)cs->lpCreateParams, hwnd, msg, wParam,
+                         MAKELONG( IF1632_Saved16_sp-sizeof(CREATESTRUCT16),
+                                   IF1632_Saved16_ss ) );
+    }
+    return CallTo16_long_wwwl( (FARPROC16)proc, hwnd, msg, wParam, lParam );
+}
+
+
+/***********************************************************************
  *           THUNK_EnumObjects16   (GDI.71)
  */
 INT16 THUNK_EnumObjects16( HDC16 hdc, INT16 nObjType,
diff --git a/if1632/user32.spec b/if1632/user32.spec
index f6c3ea4..ff7dd1a 100644
--- a/if1632/user32.spec
+++ b/if1632/user32.spec
@@ -403,7 +403,7 @@
 0396 stdcall ModifyMenuA(long long long long ptr) ModifyMenu32A
 0397 stdcall ModifyMenuW(long long long long ptr) ModifyMenu32W
 0398 stdcall MoveWindow(long long long long long long) MoveWindow32
-0399 stub MsgWaitForMultipleObjects
+0399 stdcall MsgWaitForMultipleObjects(long ptr long long long) MsgWaitForMultipleObjects
 0400 stdcall OemKeyScan(long) OemKeyScan
 0401 stdcall OemToCharA(ptr ptr) OemToChar32A
 0402 stdcall OemToCharBuffA(ptr ptr long) OemToCharBuff32A
diff --git a/include/callback.h b/include/callback.h
index 4c2ed26..d1cb792 100644
--- a/include/callback.h
+++ b/include/callback.h
@@ -16,12 +16,10 @@
 /* List of the 16-bit callback functions. This list is used  */
 /* by the build program to generate the file if1632/callto16.S */
 
-                               /* func     parameters */
-extern WORD CallTo16_word_     ( FARPROC16 );
-
 #ifndef WINELIB
 
 extern void CallTo16_regs_     ( const CONTEXT *context );
+extern WORD CallTo16_word_     ( FARPROC16 );
 extern WORD CallTo16_word_w    ( FARPROC16, WORD );
 extern WORD CallTo16_word_ww   ( FARPROC16, WORD, WORD );
 extern WORD CallTo16_word_wl   ( FARPROC16, WORD, LONG );
@@ -54,17 +52,8 @@
     CallTo16_word_wwlll( func, id, msg, dwUser, dw1, dw2 )
 #define CallWindowsExitProc( func, nExitType ) \
     CallTo16_word_w( func, nExitType )
-#define CallWndProc16( func, hwnd, msg, wParam, lParam ) \
-    CallTo16_long_wwwl( (FARPROC16)(func), hwnd, msg, wParam, lParam )
 #define CallWordBreakProc16( func, lpch, ichCurrent, cch, code ) \
     CallTo16_word_lwww( func, lpch, ichCurrent, cch, code )
-#define CallWndProcNCCREATE16( func, exStyle, clsName, winName, style, \
-                               x, y, cx, cy, hparent, hmenu, instance, \
-                               params, hwnd, msg, wParam, lParam ) \
-    CallTo16_long_lllllllwlwwwl( (FARPROC16)(func), exStyle, clsName, winName,\
-                                 style, MAKELONG(y,x), MAKELONG(cy,cx), \
-                                 MAKELONG(hmenu,hparent), instance, params, \
-                                 hwnd, msg, wParam, lParam )
 
 
 /* List of the 32-bit callback functions. This list is used  */
@@ -81,8 +70,6 @@
     CallTo32_0( func )
 #define CallDLLEntryProc32( func, hmodule, a, b ) \
     CallTo32_3( func, hmodule, a, b )
-#define CallWndProc32( func, hwnd, msg, wParam, lParam ) \
-    CallTo32_4( func, hwnd, msg, wParam, lParam )
 #define CallWordBreakProc32A( func, lpch, ichCurrent, cch, code ) \
     CallTo32_4( func, (DWORD)lpch, ichCurrent, cch, code )
 
@@ -95,10 +82,6 @@
     (*func)( id, msg, dwUser, dw1, dw2 )
 #define CallWindowsExitProc( func, nExitType ) \
     (*func)( nExitType )
-#define CallWndProc16( func, hwnd, msg, wParam, lParam ) \
-    (*func)( hwnd, msg, wParam, lParam )
-#define CallWndProc32( func, hwnd, msg, wParam, lParam ) \
-    (*func)( hwnd, msg, wParam, lParam )
 #define CallWordBreakProc16( func, lpch, ichCurrent, cch, code ) \
     (*func)( lpch, ichCurrent, cch, code )
 #define CallWordBreakProc32A( func, lpch, ichCurrent, cch, code ) \
diff --git a/include/msdos.h b/include/msdos.h
index 111fbc7..3eb18a6 100644
--- a/include/msdos.h
+++ b/include/msdos.h
@@ -1,6 +1,7 @@
 #ifndef __WINE_MSDOS_H
 #define __WINE_MSDOS_H
 
+#include <sys/types.h>
 #include <dirent.h>
 #include "windows.h"
 #include "comm.h"
diff --git a/include/sigcontext.h b/include/sigcontext.h
index 55c60c2..2b4c33e 100644
--- a/include/sigcontext.h
+++ b/include/sigcontext.h
@@ -39,12 +39,7 @@
 } SIGCONTEXT;
 #endif  /* linux */
 
-#ifdef __NetBSD__
-#include <signal.h>
-typedef struct sigcontext SIGCONTEXT;
-#endif  /* NetBSD */
-
-#ifdef __FreeBSD__
+#if defined(__NetBSD__) || defined(__FreeBSD__) || defined(__OpenBSD__)
 #include <signal.h>
 typedef struct sigcontext SIGCONTEXT;
 #endif  /* FreeBSD */
@@ -123,8 +118,8 @@
 #define EFL_sig(context)     ((context)->sc_efl)
 #endif                      
                             
-#define EIP_sig(context)     ((context)->sc_eip)
-#define ESP_sig(context)     ((context)->sc_esp)
+#define EIP_sig(context)     (*((unsigned long*)&(context)->sc_eip))
+#define ESP_sig(context)     (*((unsigned long*)&(context)->sc_esp))
 
 #endif  /* linux || __NetBSD__ || __FreeBSD__ */
 
diff --git a/include/windows.h b/include/windows.h
index c9fe841..dbfb29e 100644
--- a/include/windows.h
+++ b/include/windows.h
@@ -5611,13 +5611,13 @@
 LONG       DispatchMessage32A(const MSG32*);
 LONG       DispatchMessage32W(const MSG32*);
 #define    DispatchMessage WINELIB_NAME_AW(DispatchMessage)
-INT16      DlgDirList16(HWND16,LPCSTR,INT16,INT16,UINT16);
-INT32      DlgDirList32A(HWND32,LPCSTR,INT32,INT32,UINT32);
-INT32      DlgDirList32W(HWND32,LPCWSTR,INT32,INT32,UINT32);
+INT16      DlgDirList16(HWND16,LPSTR,INT16,INT16,UINT16);
+INT32      DlgDirList32A(HWND32,LPSTR,INT32,INT32,UINT32);
+INT32      DlgDirList32W(HWND32,LPWSTR,INT32,INT32,UINT32);
 #define    DlgDirList WINELIB_NAME_AW(DlgDirList)
-INT16      DlgDirListComboBox16(HWND16,LPCSTR,INT16,INT16,UINT16);
-INT32      DlgDirListComboBox32A(HWND32,LPCSTR,INT32,INT32,UINT32);
-INT32      DlgDirListComboBox32W(HWND32,LPCWSTR,INT32,INT32,UINT32);
+INT16      DlgDirListComboBox16(HWND16,LPSTR,INT16,INT16,UINT16);
+INT32      DlgDirListComboBox32A(HWND32,LPSTR,INT32,INT32,UINT32);
+INT32      DlgDirListComboBox32W(HWND32,LPWSTR,INT32,INT32,UINT32);
 #define    DlgDirListComboBox WINELIB_NAME_AW(DlgDirListComboBox)
 BOOL16     DlgDirSelectComboBoxEx16(HWND16,LPSTR,INT16,INT16);
 BOOL32     DlgDirSelectComboBoxEx32A(HWND32,LPSTR,INT32,INT32);
diff --git a/include/winproc.h b/include/winproc.h
index d239dfd..c601898 100644
--- a/include/winproc.h
+++ b/include/winproc.h
@@ -76,4 +76,9 @@
 extern void WINPROC_UnmapMsg32WTo16( UINT32 msg, WPARAM32 wParam,
                                      LPARAM lParam, MSGPARAM16* pm16 );
 
+typedef LRESULT (*WINPROC_CALLWNDPROC16)(WNDPROC16,HWND16,UINT16,WPARAM16,LPARAM);
+typedef LRESULT (*WINPROC_CALLWNDPROC32)(WNDPROC32,HWND32,UINT32,WPARAM32,LPARAM);
+extern void WINPROC_SetCallWndProc16( WINPROC_CALLWNDPROC16 proc );
+extern void WINPROC_SetCallWndProc32( WINPROC_CALLWNDPROC32 proc );
+
 #endif  /* __WINE_WINPROC_H */
diff --git a/library/miscstubs.c b/library/miscstubs.c
index 693fbcc..38094c1 100644
--- a/library/miscstubs.c
+++ b/library/miscstubs.c
@@ -17,6 +17,10 @@
     /* FIXME: signals don't work in the library */
 }
 
+/* for windows/winproc.c */
+void CallFrom16_long_wwwll(void) {}
+void CallFrom32_stdcall_5(void) {}
+
 int CallTo32_LargeStack( int (*func)(), int nbargs, ...)
 {
   va_list arglist;
diff --git a/loader/module.c b/loader/module.c
index d7df2fe..19bb6d0 100644
--- a/loader/module.c
+++ b/loader/module.c
@@ -451,7 +451,7 @@
        ((fastload && ((offset) >= fastload_offset) && \
          ((offset)+(size) <= fastload_offset+fastload_length)) ? \
         (memcpy( buffer, fastload+(offset)-fastload_offset, (size) ), TRUE) : \
-        (_llseek32( hFile, mz_header.ne_offset+(offset), SEEK_SET), \
+        (_llseek32( hFile, (offset), SEEK_SET), \
          _lread32( hFile, (buffer), (size) ) == (size)))
 
     _llseek32( hFile, 0, SEEK_SET );
@@ -509,10 +509,11 @@
                         fastload_offset, fastload_length );
         if ((fastload = HeapAlloc( SystemHeap, 0, fastload_length )) != NULL)
         {
-            _llseek32( hFile, mz_header.ne_offset + fastload_offset, SEEK_SET);
+            _llseek32( hFile, fastload_offset, SEEK_SET);
             if (_lread32(hFile, fastload, fastload_length) != fastload_length)
             {
                 HeapFree( SystemHeap, 0, fastload );
+                fprintf(stderr, "Error reading fast-load area !\n");
                 fastload = NULL;
             }
         }
@@ -536,12 +537,12 @@
         int i;
         struct ne_segment_table_entry_s *pSeg;
 
-        if (!READ( ne_header.segment_tab_offset,
+        if (!READ( mz_header.ne_offset + ne_header.segment_tab_offset,
              ne_header.n_segment_tab * sizeof(struct ne_segment_table_entry_s),
              buffer ))
         {
             HeapFree( SystemHeap, 0, buffer );
-            HeapFree( SystemHeap, 0, fastload );
+            if (fastload) HeapFree( SystemHeap, 0, fastload );
             GlobalFree16( hModule );
             return (HMODULE16)11;  /* invalid exe */
         }
@@ -555,7 +556,7 @@
     }
     else
     {
-        HeapFree( SystemHeap, 0, fastload );
+        if (fastload) HeapFree( SystemHeap, 0, fastload );
         GlobalFree16( hModule );
         return (HMODULE16)11;  /* invalid exe */
     }
@@ -565,7 +566,7 @@
     if (ne_header.resource_tab_offset < ne_header.rname_tab_offset)
     {
         pModule->res_table = (int)pData - (int)pModule;
-        if (!READ(ne_header.resource_tab_offset,
+        if (!READ(mz_header.ne_offset + ne_header.resource_tab_offset,
                   ne_header.rname_tab_offset - ne_header.resource_tab_offset,
                   pData )) return (HMODULE16)11;  /* invalid exe */
         pData += ne_header.rname_tab_offset - ne_header.resource_tab_offset;
@@ -575,11 +576,11 @@
     /* Get the resident names table */
 
     pModule->name_table = (int)pData - (int)pModule;
-    if (!READ( ne_header.rname_tab_offset,
+    if (!READ( mz_header.ne_offset + ne_header.rname_tab_offset,
                ne_header.moduleref_tab_offset - ne_header.rname_tab_offset,
                pData ))
     {
-        HeapFree( SystemHeap, 0, fastload );
+        if (fastload) HeapFree( SystemHeap, 0, fastload );
         GlobalFree16( hModule );
         return (HMODULE16)11;  /* invalid exe */
     }
@@ -590,11 +591,11 @@
     if (ne_header.n_mod_ref_tab > 0)
     {
         pModule->modref_table = (int)pData - (int)pModule;
-        if (!READ( ne_header.moduleref_tab_offset,
+        if (!READ( mz_header.ne_offset + ne_header.moduleref_tab_offset,
                   ne_header.n_mod_ref_tab * sizeof(WORD),
                   pData ))
         {
-            HeapFree( SystemHeap, 0, fastload );
+            if (fastload) HeapFree( SystemHeap, 0, fastload );
             GlobalFree16( hModule );
             return (HMODULE16)11;  /* invalid exe */
         }
@@ -605,11 +606,11 @@
     /* Get the imported names table */
 
     pModule->import_table = (int)pData - (int)pModule;
-    if (!READ( ne_header.iname_tab_offset, 
+    if (!READ( mz_header.ne_offset + ne_header.iname_tab_offset, 
                ne_header.entry_tab_offset - ne_header.iname_tab_offset,
                pData ))
     {
-        HeapFree( SystemHeap, 0, fastload );
+        if (fastload) HeapFree( SystemHeap, 0, fastload );
         GlobalFree16( hModule );
         return (HMODULE16)11;  /* invalid exe */
     }
@@ -618,11 +619,11 @@
     /* Get the entry table */
 
     pModule->entry_table = (int)pData - (int)pModule;
-    if (!READ( ne_header.entry_tab_offset,
+    if (!READ( mz_header.ne_offset + ne_header.entry_tab_offset,
                ne_header.entry_tab_length,
                pData ))
     {
-        HeapFree( SystemHeap, 0, fastload );
+        if (fastload) HeapFree( SystemHeap, 0, fastload );
         GlobalFree16( hModule );
         return (HMODULE16)11;  /* invalid exe */
     }
@@ -631,7 +632,7 @@
     /* Free the fast-load area */
 
 #undef READ
-    HeapFree( SystemHeap, 0, fastload );
+    if (fastload) HeapFree( SystemHeap, 0, fastload );
 
     /* Get the non-resident names table */
 
@@ -1380,6 +1381,17 @@
 
 
 /***********************************************************************
+ *           LoadLibraryEx32W   (KERNEL.513)
+ */
+HINSTANCE16 LoadLibraryEx32W16( LPCSTR libname, HANDLE16 hf, DWORD flags )
+{
+    fprintf(stderr,"LoadLibraryEx32W(%s,%d,%08lx)\n",libname,hf,flags);
+    if (!flags && !hf)
+    	return LoadLibrary32A(libname);
+    return 0;
+}
+
+/***********************************************************************
  *           LoadLibrary   (KERNEL.95)
  */
 HINSTANCE16 LoadLibrary16( LPCSTR libname )
@@ -1459,8 +1471,9 @@
     cmdline = (char *)GlobalLock16( cmdLineHandle );
     lstrcpyn32A(filename, lpCmdLine, sizeof(filename) - 4 /* for extension */);
     for (p = filename; *p && (*p != ' ') && (*p != '\t'); p++);
-    if (*p) lstrcpyn32A( cmdline, p + 1, 128 );
-    else cmdline[0] = '\0';
+    if (*p) lstrcpyn32A( cmdline + 1, p + 1, 127 );
+    else cmdline[1] = '\0';
+    cmdline[0] = strlen( cmdline + 1 ) + 1;
     *p = '\0';
 
       /* Now load the executable file */
@@ -1603,6 +1616,10 @@
 #ifndef WINELIB
     NE_MODULE *pModule;
 
+    if (HIWORD(function))
+	dprintf_win32(stddeb,"GetProcAddress32(%08lx,%s)\n",(DWORD)hModule,function);
+    else
+	dprintf_win32(stddeb,"GetProcAddress32(%08lx,%p)\n",(DWORD)hModule,function);
     hModule = GetExePtr( hModule );
     if (!(pModule = MODULE_GetPtr( hModule )))
         return (FARPROC32)0;
@@ -1616,6 +1633,26 @@
 #endif
 }
 
+/***********************************************************************
+ *           RtlImageNtHeaders   (NTDLL)
+ */
+LPIMAGE_NT_HEADERS
+RtlImageNtHeader(HMODULE32 hModule)
+{
+#ifndef WINELIB
+    NE_MODULE *pModule;
+
+    hModule = GetExePtr( hModule );
+    if (!(pModule = MODULE_GetPtr( hModule )))
+        return (LPIMAGE_NT_HEADERS)0;
+    if (!(pModule->flags & NE_FFLAGS_WIN32) || !pModule->pe_module)
+        return (LPIMAGE_NT_HEADERS)0;
+    return pModule->pe_module->pe_header;
+#else
+    return NULL;
+#endif
+}
+
 
 /**********************************************************************
  *	    GetExpWinVer    (KERNEL.167)
diff --git a/loader/signal.c b/loader/signal.c
index 96281bf..5290f7c7 100644
--- a/loader/signal.c
+++ b/loader/signal.c
@@ -151,15 +151,15 @@
   HANDLER_PROLOG;
   if (CS_sig(context) == WINE_CODE_SELECTOR)
     {
-        fprintf( stderr, "Segmentation fault in Wine program (%x:%lx)."
+        fprintf( stderr, "Segmentation fault in Wine program (%04x:%08lx)."
                          "  Please debug.\n",
-                 CS_sig(context), EIP_sig(context) );
+		(unsigned short) CS_sig(context), EIP_sig(context));
     }
   else
     {
         if (INSTR_EmulateInstruction( context )) return;
-        fprintf( stderr, "Segmentation fault in Windows program %x:%lx.\n",
-                 CS_sig(context), EIP_sig(context) );
+        fprintf( stderr, "Segmentation fault in Windows program %04x:%08lx.\n",
+		(unsigned short) CS_sig(context), EIP_sig(context) );
     }
   wine_debug( signal, context );
   HANDLER_EPILOG;
diff --git a/loader/task.c b/loader/task.c
index 97cf296..8ada240 100644
--- a/loader/task.c
+++ b/loader/task.c
@@ -514,8 +514,7 @@
     memset( pTask->pdb.fileHandles, 0xff, sizeof(pTask->pdb.fileHandles) );
     pTask->pdb.environment    = hEnvironment;
     pTask->pdb.nbFiles        = 20;
-    lstrcpyn32A( pTask->pdb.cmdLine + 1, cmdLine, 127 );
-    pTask->pdb.cmdLine[0] = strlen( pTask->pdb.cmdLine + 1 );
+    lstrcpyn32A( pTask->pdb.cmdLine, cmdLine, 127 );
 
       /* Get the compatibility flags */
 
@@ -539,6 +538,7 @@
     /* Create the Win32 part of the task */
 
     pdb32 = PROCESS_Create( pTask );
+    pdb32->task = hTask;
     if (pModule->flags & NE_FFLAGS_WIN32)
     {
         LPTHREAD_START_ROUTINE start =
diff --git a/memory/local.c b/memory/local.c
index c04fe2d..3baea5d 100644
--- a/memory/local.c
+++ b/memory/local.c
@@ -57,6 +57,18 @@
     BYTE lock;                /* Lock count */
 } LOCALHANDLEENTRY;
 
+/*
+ * We make addr = 4n + 2 and set *((WORD *)addr - 1) = &addr like Windows does
+ * in case something actually relies on this.
+ * Note the ARENA_HEADER(addr) still produces the desired result ie. 4n - 4
+ *
+ * An unused handle has lock = flags = 0xff. In windows addr is that of next
+ * free handle, at the moment in wine we set it to 0.
+ *
+ * A discarded block's handle has lock = addr = 0 and flags = 0x40
+ * (LMEM_DISCARDED >> 8)
+ */
+
 #pragma pack(1)
 
 typedef struct
@@ -564,6 +576,27 @@
 }
 
 
+
+/***********************************************************************
+ *           LOCAL_GrowArenaUpward
+ *
+ * Grow an arena upward by using the next arena (must be free and big
+ * enough). Newsize includes the arena header and must be aligned.
+ */
+static void LOCAL_GrowArenaUpward( WORD ds, WORD arena, WORD newsize )
+{
+    char *ptr = PTR_SEG_OFF_TO_LIN( ds, 0 );
+    LOCALHEAPINFO *pInfo;
+    LOCALARENA *pArena = ARENA_PTR( ptr, arena );
+    WORD nextArena = pArena->next;
+
+    if (!(pInfo = LOCAL_GetHeap( ds ))) return;
+    LOCAL_RemoveBlock( ptr, nextArena );
+    pInfo->items--;
+    LOCAL_ShrinkArena( ds, arena, newsize );
+}
+
+
 /***********************************************************************
  *           LOCAL_GetFreeSpace
  */
@@ -632,8 +665,7 @@
         pEntry = (LOCALHANDLEENTRY *)(ptr + table + sizeof(WORD));
         for(count = *(WORD *)(ptr + table); count > 0; count--, pEntry++)
         {
-            if((pEntry->lock == 0) && !(pEntry->flags &
-                                        (LMEM_DISCARDED >> 8)))
+            if((pEntry->lock == 0) && (pEntry->flags != (LMEM_DISCARDED >> 8)))
             {
                 /* OK we can move this one if we want */
                 dprintf_local(stddeb,
@@ -705,14 +737,14 @@
         pEntry = (LOCALHANDLEENTRY *)(ptr + table + sizeof(WORD));
         for(count = *(WORD *)(ptr + table); count > 0; count--, pEntry++)
         {
-            if((pEntry->flags & (LMEM_DISCARDABLE >> 8)) &&
-               pEntry->lock == 0 && !(pEntry->flags & (LMEM_DISCARDED >> 8)))
-            {
+            if(pEntry->addr && pEntry->lock == 0 &&
+	     (pEntry->flags & (LMEM_DISCARDABLE >> 8)))
+	    {
                 dprintf_local(stddeb, "Discarding handle %04x (block %04x).\n",
                               (char *)pEntry - ptr, pEntry->addr);
-                LOCAL_FreeArena(ds, pEntry->addr);
+                LOCAL_FreeArena(ds, ARENA_HEADER(pEntry->addr));
                 pEntry->addr = 0;
-                pEntry->flags |= (LMEM_DISCARDED >> 8);
+                pEntry->flags = (LMEM_DISCARDED >> 8);
                 /* Call localnotify proc */
             }
         }
@@ -770,7 +802,7 @@
 	LOCAL_PrintHeap(ds);
 	return 0;
     }
-    
+
     size += ARENA_HEADER_SIZE;
     size = LALIGN( MAX( size, sizeof(LOCALARENA) ) );
 
@@ -801,8 +833,8 @@
     LOCAL_RemoveFreeBlock( ptr, arena );
     LOCAL_ShrinkArena( ds, arena, size );
 
-    if (flags & LMEM_ZEROINIT) memset( (char *)pArena + ARENA_HEADER_SIZE, 0,
-                                       size - ARENA_HEADER_SIZE );
+    if (flags & LMEM_ZEROINIT)
+	memset((char *)pArena + ARENA_HEADER_SIZE, 0, size-ARENA_HEADER_SIZE);
     return arena + ARENA_HEADER_SIZE;
 }
 
@@ -838,7 +870,10 @@
 
     *(WORD *)(ptr + handle) = pInfo->hdelta;
     pEntry = (LOCALHANDLEENTRY *)(ptr + handle + sizeof(WORD));
-    for (i = pInfo->hdelta; i > 0; i--) (pEntry++)->lock = 0xff;
+    for (i = pInfo->hdelta; i > 0; i--, pEntry++) {
+	pEntry->lock = pEntry->flags = 0xff;
+	pEntry->addr = 0;
+    }
     *(WORD *)pEntry = pInfo->htable;
     pInfo->htable = handle;
     return TRUE;
@@ -886,6 +921,7 @@
     /* Now allocate this entry */
 
     pEntry->lock = 0;
+    pEntry->flags = 0;
     dprintf_local( stddeb, "LOCAL_GetNewHandleEntry(%04x): %04x\n",
                    ds, ((char *)pEntry - ptr) );
     return (HLOCAL16)((char *)pEntry - ptr);
@@ -928,7 +964,7 @@
 
     pEntry->addr = 0;  /* just in case */
     pEntry->lock = 0xff;
-
+    pEntry->flags = 0xff; 
     /* Now check if all entries in this table are free */
 
     table = *pTable;
@@ -965,7 +1001,7 @@
     else
     {
         LOCALHANDLEENTRY *pEntry = (LOCALHANDLEENTRY *)(ptr + handle);
-        if (!(pEntry->flags & (LMEM_DISCARDED >> 8)))
+        if (pEntry->flags != (LMEM_DISCARDED >> 8))
         {
             dprintf_local( stddeb, "LocalFree: real block at %04x\n",
 			   pEntry->addr );
@@ -982,6 +1018,7 @@
  *           LOCAL_Alloc
  *
  * Implementation of LocalAlloc().
+ *
  */
 HLOCAL16 LOCAL_Alloc( HANDLE16 ds, WORD flags, WORD size )
 {
@@ -990,26 +1027,47 @@
     
     dprintf_local( stddeb, "LocalAlloc: %04x %d ds=%04x\n", flags, size, ds );
 
+    if(size > 0 && size <= 4) size = 5;
     if (flags & LMEM_MOVEABLE)
     {
 	LOCALHANDLEENTRY *plhe;
 	HLOCAL16 hmem;
-	
-	if (!(hmem = LOCAL_GetBlock( ds, size, flags ))) return 0;
+
+	if(size)
+	{
+	    if (!(hmem = LOCAL_GetBlock( ds, size + sizeof(HLOCAL16), flags )))
+		return 0;
+        }
+	else /* We just need to allocate a discarded handle */
+	    hmem = 0;
 	if (!(handle = LOCAL_GetNewHandleEntry( ds )))
         {
 	    fprintf( stderr, "LocalAlloc: couldn't get handle\n");
-	    LOCAL_FreeArena( ds, ARENA_HEADER(hmem) );
+	    if(hmem)
+		LOCAL_FreeArena( ds, ARENA_HEADER(hmem) );
 	    return 0;
 	}
 	ptr = PTR_SEG_OFF_TO_LIN( ds, 0 );
 	plhe = (LOCALHANDLEENTRY *)(ptr + handle);
-	plhe->addr = hmem;
-        plhe->flags = (BYTE)(flags >> 8);
 	plhe->lock = 0;
+	if(hmem)
+	{
+	    plhe->addr = hmem + sizeof(HLOCAL16);
+	    plhe->flags = (BYTE)((flags & 0x0f00) >> 8);
+	    *(HLOCAL16 *)(ptr + hmem) = handle;
+	}
+	else
+	{
+	    plhe->addr = 0;
+	    plhe->flags = LMEM_DISCARDED >> 8;
+        }
     }
-    else handle = LOCAL_GetBlock( ds, size, flags );
-
+    else /* FIXED */
+    {
+	if(!size)
+	    return 0;
+	handle = LOCAL_GetBlock( ds, size, flags );
+    }
     return handle;
 }
 
@@ -1025,88 +1083,106 @@
     LOCALHEAPINFO *pInfo;
     LOCALARENA *pArena, *pNext;
     LOCALHANDLEENTRY *pEntry;
-    WORD arena, newhandle, blockhandle, oldsize;
+    WORD arena, oldsize;
+    HLOCAL16 hmem, blockhandle;
     LONG nextarena;
 
-    if (!handle) return LOCAL_Alloc( ds, size, flags );
+    if (!handle) return 0;
+    if(HANDLE_MOVEABLE(handle) &&
+     ((LOCALHANDLEENTRY *)(ptr + handle))->lock == 0xff) /* An unused handle */
+	return 0;
 
     dprintf_local( stddeb, "LocalReAlloc: %04x %d %04x ds=%04x\n",
                    handle, size, flags, ds );
     if (!(pInfo = LOCAL_GetHeap( ds ))) return 0;
     
-    if (HANDLE_FIXED( handle )) blockhandle = handle;
+    if (HANDLE_FIXED( handle ))
+	blockhandle = handle;
     else
     {
 	pEntry = (LOCALHANDLEENTRY *) (ptr + handle);
-	if(pEntry->flags & (LMEM_DISCARDED >> 8))
+	if(pEntry->flags == (LMEM_DISCARDED >> 8))
         {
+	    HLOCAL16 hl;
+	    if(pEntry->addr)
+		fprintf(stderr,
+			"LOCAL_ReAlloc: Dicarded block has non-zero addr.\n");
 	    dprintf_local(stddeb, "ReAllocating discarded block\n");
-	    if (!(pEntry->addr = LOCAL_GetBlock( ds, size, flags))) return 0;
+	    if(size <= 4) size = 5;
+	    if (!(hl = LOCAL_GetBlock( ds, size + sizeof(HLOCAL16), flags)))
+		return 0;
             ptr = PTR_SEG_OFF_TO_LIN( ds, 0 );  /* Reload ptr */
             pEntry = (LOCALHANDLEENTRY *) (ptr + handle);
-            pEntry->flags = (BYTE) (flags >> 8);
+	    pEntry->addr = hl + sizeof(HLOCAL16);
+            pEntry->flags = 0;
             pEntry->lock = 0;
+	    *(HLOCAL16 *)(ptr + hl) = handle;
             return handle;
-	}    
-	if (!(blockhandle = pEntry->addr))
+	}
+	if (((blockhandle = pEntry->addr) & 3) != 2)
 	{
 	    fprintf( stderr, "Local_ReAlloc(%04x,%04x): invalid handle\n",
                      ds, handle );
 	    return 0;
         }
+	if(*((HLOCAL16 *)(ptr + blockhandle) - 1) != handle) {
+	    fprintf(stderr, "Local_ReAlloc: Back ptr to handle is invalid\n");
+	    return 0;
+        }
+    }
+
+    if (flags & LMEM_MODIFY)
+    {
+        if (HANDLE_MOVEABLE(handle))
+	{
+	    pEntry = (LOCALHANDLEENTRY *)(ptr + handle);
+	    pEntry->flags = (flags & 0x0f00) >> 8;
+	    dprintf_local(stddeb, "Changing flags to %x.\n", pEntry->flags);
+	}
+	return handle;
+    }
+
+    if (!size)
+    {
+        if (flags & LMEM_MOVEABLE)
+        {
+	    if (HANDLE_FIXED(handle))
+	    {
+                dprintf_local(stddeb, "Freeing fixed block.\n");
+                return LOCAL_Free( ds, handle );
+            }
+	    else /* Moveable block */
+	    {
+		pEntry = (LOCALHANDLEENTRY *)(ptr + handle);
+		if (pEntry->lock == 0)
+		{
+		    /* discards moveable blocks */
+                    dprintf_local(stddeb,"Discarding block\n");
+                    LOCAL_FreeArena(ds, ARENA_HEADER(pEntry->addr));
+                    pEntry->addr = 0;
+                    pEntry->flags = (LMEM_DISCARDED >> 8);
+                    return handle;
+	        }
+	    }
+	    return 0;
+        }
+        else if(flags == 0)
+        {
+            pEntry = (LOCALHANDLEENTRY *)(ptr + handle);
+            if (pEntry->lock == 0)
+            {
+		/* Frees block */
+		return LOCAL_Free( ds, handle );
+	    }
+        }
+        return 0;
     }
 
     arena = ARENA_HEADER( blockhandle );
     dprintf_local( stddeb, "LocalReAlloc: arena is %04x\n", arena );
     pArena = ARENA_PTR( ptr, arena );
-    
-    if ((flags & LMEM_MODIFY) && (flags & LMEM_DISCARDABLE))
-    {
-        if (HANDLE_FIXED(handle))
-        {
-            fprintf(stderr,"LocalReAlloc: LMEM_MODIFY & LMEM_DISCARDABLE on a fixed handle.\n");
-            return handle;
-        }
-        dprintf_local( stddeb, "Making block discardable.\n" );
-        pEntry = (LOCALHANDLEENTRY *)(ptr + handle);
-        pEntry->flags |= (LMEM_DISCARDABLE >> 8);
-        return handle;
-    }
 
-    if ((flags & LMEM_MODIFY) || (flags & LMEM_DISCARDABLE))
-    {
-        fprintf(stderr,"LocalReAlloc: flags %04x. MODIFY & DISCARDABLE should both be set\n", flags);
-        return handle;
-    }
-
-    if (!size)
-    {
-        if (HANDLE_FIXED(handle))
-        {
-            if (flags & LMEM_MOVEABLE)
-            {
-                dprintf_local(stddeb, "Freeing fixed block.\n");
-                return LOCAL_Free( ds, handle );
-            }
-            else size = 1;
-        }
-        else
-        {
-            pEntry = (LOCALHANDLEENTRY *)(ptr + handle);
-            if (pEntry->lock == 0)
-            {
-                /* discards moveable blocks is this right? */
-                dprintf_local(stddeb,"Discarding block\n");
-                LOCAL_FreeArena(ds, ARENA_HEADER(pEntry->addr));
-                pEntry->addr = 0;
-                pEntry->flags = (LMEM_DISCARDED >> 8);
-                return 0;
-            }
-            return handle;
-        }
-    }
-
-    size = LALIGN( size );
+    if(size <= 4) size = 5;
     oldsize = pArena->next - arena - ARENA_HEADER_SIZE;
     nextarena = LALIGN(blockhandle + size);
 
@@ -1114,58 +1190,58 @@
 
     if (nextarena <= pArena->next)
     {
-        if (nextarena < pArena->next - LALIGN(sizeof(LOCALARENA)))
-        {
-	    dprintf_local( stddeb, "size reduction, making new free block\n");
-              /* It is worth making a new free block */
-            LOCAL_AddBlock( ptr, arena, nextarena );
-            pInfo->items++;
-            LOCAL_FreeArena( ds, nextarena );
-        }
+	dprintf_local( stddeb, "size reduction, making new free block\n");
+	LOCAL_ShrinkArena(ds, arena, nextarena - arena);
         dprintf_local( stddeb, "LocalReAlloc: returning %04x\n", handle );
         return handle;
     }
 
-      /* Check if the next block is free */
+      /* Check if the next block is free and large enough */
 
     pNext = ARENA_PTR( ptr, pArena->next );
     if (((pNext->prev & 3) == LOCAL_ARENA_FREE) &&
         (nextarena <= pNext->next))
     {
-        LOCAL_RemoveBlock( ptr, pArena->next );
-        if (nextarena < pArena->next - LALIGN(sizeof(LOCALARENA)))
-        {
-	    dprintf_local( stddeb, "size increase, making new free block\n");
-              /* It is worth making a new free block */
-            LOCAL_AddBlock( ptr, arena, nextarena );
-            pInfo->items++;
-            LOCAL_FreeArena( ds, nextarena );
-        }
+	dprintf_local( stddeb, "size increase, making new free block\n");
+        LOCAL_GrowArenaUpward(ds, arena, nextarena - arena);
         dprintf_local( stddeb, "LocalReAlloc: returning %04x\n", handle );
         return handle;
     }
 
-    /* Now we have to allocate a new block, but not if fixed block and no
-       LMEM_MOVEABLE */
+    /* Now we have to allocate a new block, but not if (fixed block or locked
+       block) and no LMEM_MOVEABLE */
 
-    if (HANDLE_FIXED(handle) && !(flags & LMEM_MOVEABLE))
+    if (!(flags & LMEM_MOVEABLE))
     {
-        dprintf_local(stddeb, "Needed to move fixed block, but LMEM_MOVEABLE not specified.\n");
-        return 0;  /* FIXME: should we free it here? */
+	if (HANDLE_FIXED(handle))
+        {
+            dprintf_local(stddeb,
+	     "Needed to move fixed block, but LMEM_MOVEABLE not specified.\n");
+            return 0;
+        }
+	else
+	{
+	    if(((LOCALHANDLEENTRY *)(ptr + handle))->lock != 0)
+	    {
+		dprintf_local(stddeb,
+	"Needed to move locked block, but LMEM_MOVEABLE not specified.\n");
+		return 0;
+	    }
+        }
     }
-
-    newhandle = LOCAL_GetBlock( ds, size, flags );
+    if(HANDLE_MOVEABLE(handle)) size += sizeof(HLOCAL16);
+    hmem = LOCAL_GetBlock( ds, size, flags );
     ptr = PTR_SEG_OFF_TO_LIN( ds, 0 );  /* Reload ptr */
-    if (!newhandle)
+    if (!hmem)
     {
         /* Remove the block from the heap and try again */
         LPSTR buffer = HeapAlloc( SystemHeap, 0, oldsize );
         if (!buffer) return 0;
-        memcpy( buffer, ptr + (arena + ARENA_HEADER_SIZE), oldsize );
+        memcpy( buffer, ptr + arena + ARENA_HEADER_SIZE, oldsize );
         LOCAL_FreeArena( ds, arena );
-        if (!(newhandle = LOCAL_GetBlock( ds, size, flags )))
+        if (!(hmem = LOCAL_GetBlock( ds, size, flags )))
         {
-            if (!(newhandle = LOCAL_GetBlock( ds, oldsize, flags )))
+            if (!(hmem = LOCAL_GetBlock( ds, oldsize, flags )))
             {
                 fprintf( stderr, "LocalRealloc: can't restore saved block\n" );
                 HeapFree( SystemHeap, 0, buffer );
@@ -1174,25 +1250,27 @@
             size = oldsize;
         }
         ptr = PTR_SEG_OFF_TO_LIN( ds, 0 );  /* Reload ptr */
-        memcpy( ptr + newhandle, buffer, oldsize );
+        memcpy( ptr + hmem, buffer, oldsize );
         HeapFree( SystemHeap, 0, buffer );
     }
     else
     {
-        memcpy( ptr + newhandle, ptr + (arena + ARENA_HEADER_SIZE), oldsize );
+        memcpy( ptr + hmem, ptr + (arena + ARENA_HEADER_SIZE), oldsize );
         LOCAL_FreeArena( ds, arena );
     }
     if (HANDLE_MOVEABLE( handle ))
     {
 	dprintf_local( stddeb, "LocalReAlloc: fixing handle\n");
         pEntry = (LOCALHANDLEENTRY *)(ptr + handle);
-        pEntry->addr = newhandle;
-        pEntry->lock = 0;
-	newhandle = handle;
+        pEntry->addr = hmem + sizeof(HLOCAL16);
+	/* Back ptr should still be correct */
+	if(*(HLOCAL16 *)(ptr + hmem) != handle)
+	    fprintf(stderr, "Local_ReAlloc: back ptr is invalid.\n");
+	hmem = handle;
     }
-    if (size == oldsize) newhandle = 0;  /* Realloc failed */
-    dprintf_local( stddeb, "LocalReAlloc: returning %04x\n", newhandle );
-    return newhandle;
+    if (size == oldsize) hmem = 0;  /* Realloc failed */
+    dprintf_local( stddeb, "LocalReAlloc: returning %04x\n", hmem );
+    return hmem;
 }
 
 
@@ -1205,6 +1283,7 @@
     if (HANDLE_MOVEABLE(handle))
     {
         LOCALHANDLEENTRY *pEntry = (LOCALHANDLEENTRY *)(heap + handle);
+	if (pEntry->flags == LMEM_DISCARDED) return 0;
         if (pEntry->lock < 0xfe) pEntry->lock++;
         handle = pEntry->addr;
     }
@@ -1266,6 +1345,7 @@
     dprintf_local( stddeb, "LocalSize: %04x ds=%04x\n", handle, ds );
 
     if (HANDLE_MOVEABLE( handle )) handle = *(WORD *)(ptr + handle);
+    if (!handle) return 0;
     pArena = ARENA_PTR( ptr, ARENA_HEADER(handle) );
     return pArena->next - handle;
 }
@@ -1477,6 +1557,7 @@
 	return 0;
     }
     dprintf_local( stddeb, "LocalNotify(%04x): %08lx\n", ds, (DWORD)func );
+    fprintf(stdnimp, "LocalNotify(): Half implemented\n");
     oldNotify = pInfo->notify;
     pInfo->notify = func;
     return oldNotify;
diff --git a/memory/virtual.c b/memory/virtual.c
index 920ceeb..2e3a6c0 100644
--- a/memory/virtual.c
+++ b/memory/virtual.c
@@ -1019,6 +1019,7 @@
     {
     case FILE_MAP_ALL_ACCESS:
     case FILE_MAP_WRITE:
+    case FILE_MAP_WRITE | FILE_MAP_READ:
         if (!(mapping->protect & VPROT_WRITE))
         {
             SetLastError( ERROR_INVALID_PARAMETER );
@@ -1028,6 +1029,7 @@
         /* fall through */
     case FILE_MAP_READ:
     case FILE_MAP_COPY:
+    case FILE_MAP_COPY | FILE_MAP_READ:
         if (mapping->protect & VPROT_READ) break;
         /* fall through */
     default:
diff --git a/misc/crtdll.c b/misc/crtdll.c
index 563bd39..f9ab8c0 100644
--- a/misc/crtdll.c
+++ b/misc/crtdll.c
@@ -9,6 +9,7 @@
 
 #include <stdio.h>
 #include <stdlib.h>
+#include <stdarg.h>
 #include <string.h>
 #include <unistd.h>
 #include <time.h>
@@ -135,7 +136,8 @@
 int CRTDLL_fprintf(DWORD *args)
 {
 	/* FIXME: use args[0] */
-	return vfprintf(stderr,(LPSTR)(args[1]),args+2);
+	/* CMF - This makes a BIG assumption about va_list */
+	return vfprintf(stderr, (LPSTR) args[1], (va_list) &args[2]);
 }
 
 /*********************************************************************
@@ -143,7 +145,8 @@
  */
 int CRTDLL_printf(DWORD *args)
 {
-	return vfprintf(stdout,(LPSTR)(args[0]),args+1);
+	/* CMF - This makes a BIG assumption about va_list */
+	return vfprintf(stdout, (LPSTR) args[0], (va_list) &args[1]);
 }
 
 /*********************************************************************
@@ -151,7 +154,8 @@
  */
 int CRTDLL_sprintf(DWORD *args)
 {
-	return vsprintf((LPSTR)(args[0]),(LPSTR)(args[1]),args+2);
+	/* CMF - This makes a BIG assumption about va_list */
+	return vsprintf((LPSTR) args[0], (LPSTR) args[1], (va_list) &args[2]);
 }
 
 /*********************************************************************
@@ -577,7 +581,8 @@
  */
 int CRTDLL_vsprintf(DWORD *args)
 {
-    return vsprintf((char *)args[0],(char *)args[1],args+2);
+	/* CMF - This makes a BIG assumption about va_list */
+	return vsprintf((char *) args[0], (char *) args[1], (va_list) &args[2]);
 }
 
 /*********************************************************************
@@ -585,7 +590,8 @@
  */
 int CRTDLL_sscanf(DWORD *args)
 {
-    return vsscanf((char *)args[0],(char *)args[1],args+2);
+	/* CMF - This makes a BIG assumption about va_list */
+	return vsscanf((char *) args[0], (char *) args[1], (va_list) &args[2]);
 }
 
 
diff --git a/misc/lstr.c b/misc/lstr.c
index 29c60ee..7f565ca 100644
--- a/misc/lstr.c
+++ b/misc/lstr.c
@@ -504,8 +504,8 @@
 	if (dwFlags & FORMAT_MESSAGE_FROM_STRING)
 		from = HEAP_strdupA( GetProcessHeap(), 0, (LPSTR)lpSource);
 	if (dwFlags & FORMAT_MESSAGE_FROM_SYSTEM) {
-		/* gather information from system message tables ... */
-		fprintf(stdnimp,"	- FORMAT_MESSAGE_FROM_SYSTEM not implemented.\n");
+		from = HeapAlloc( GetProcessHeap(),0,200 );
+		sprintf(from,"Systemmessage, messageid = 0x%08lx\n",dwMessageId);
 	}
 	if (dwFlags & FORMAT_MESSAGE_FROM_HMODULE) {
 		INT32	bufsize;
@@ -585,7 +585,9 @@
 						sprintfbuf=HeapAlloc(GetProcessHeap(),0,strlen((LPSTR)argliststart[0])+1);
 					else
 						sprintfbuf=HeapAlloc(GetProcessHeap(),0,100);
-					vsprintf(sprintfbuf,fmtstr,argliststart);
+
+					/* CMF - This makes a BIG assumption about va_list */
+					vsprintf(sprintfbuf, fmtstr, (va_list) argliststart);
 					x=sprintfbuf;
 					while (*x) {
 						ADD_TO_T(*x++);
@@ -697,7 +699,8 @@
 		from = HEAP_strdupWtoA(GetProcessHeap(),0,(LPWSTR)lpSource);
 	if (dwFlags & FORMAT_MESSAGE_FROM_SYSTEM) {
 		/* gather information from system message tables ... */
-		fprintf(stdnimp,"	- FORMAT_MESSAGE_FROM_SYSTEM not implemented.\n");
+		from = HeapAlloc( GetProcessHeap(),0,200 );
+		sprintf(from,"Systemmessage, messageid = 0x%08lx\n",dwMessageId);
 	}
 	if (dwFlags & FORMAT_MESSAGE_FROM_HMODULE) {
 		INT32	bufsize;
@@ -783,10 +786,14 @@
 						xarr[1]=*(argliststart+1);
 						xarr[2]=*(argliststart+2);
 						sprintfbuf=HeapAlloc(GetProcessHeap(),0,lstrlen32W((LPWSTR)argliststart[0])*2+1);
-						vsprintf(sprintfbuf,fmtstr,xarr);
+
+						/* CMF - This makes a BIG assumption about va_list */
+						vsprintf(sprintfbuf, fmtstr, (va_list) xarr);
 					} else {
 						sprintfbuf=HeapAlloc(GetProcessHeap(),0,100);
-						vsprintf(sprintfbuf,fmtstr,argliststart);
+
+						/* CMF - This makes a BIG assumption about va_list */
+						vsprintf(sprintfbuf, fmtstr, (va_list) argliststart);
 					}
 					x=sprintfbuf;
 					while (*x) {
diff --git a/misc/ole2nls.c b/misc/ole2nls.c
index 66e2f36..ea6975d 100644
--- a/misc/ole2nls.c
+++ b/misc/ole2nls.c
@@ -6,7 +6,7 @@
 
 #include <string.h>
 #include <ctype.h>
-#include <malloc.h>
+#include <stdlib.h>
 #include "windows.h"
 #include "heap.h"
 #include "ole.h"
diff --git a/misc/registry.c b/misc/registry.c
index 668ebf8..2719bd3 100644
--- a/misc/registry.c
+++ b/misc/registry.c
@@ -7,7 +7,6 @@
 #include <stdlib.h>
 #include <stdio.h>
 #include <string.h>
-#include <malloc.h>
 #include <unistd.h>
 #include <ctype.h>
 #include <errno.h>
@@ -669,7 +668,7 @@
 		else {
 			s++;
 			if (*s=='\\') {
-				*ws+='\\';
+				*ws++='\\';
 				s++;
 				continue;
 			}
diff --git a/misc/ver.c b/misc/ver.c
index b381f35..bd3d0b2 100644
--- a/misc/ver.c
+++ b/misc/ver.c
@@ -545,7 +545,7 @@
 	}
 	ret = LZCopy32(hfsrc,hfdst);
 	_lclose32(hfdst);
-	if (ret<0) {
+	if (((long) ret) < 0) {
 	    /* translate LZ errors into VIF_xxx */
 	    switch (ret) {
 	    case LZERROR_BADINHANDLE:
diff --git a/misc/winsock.c b/misc/winsock.c
index 6652b8a..b250184 100644
--- a/misc/winsock.c
+++ b/misc/winsock.c
@@ -186,7 +186,7 @@
  * sockets set in it that the program never asked for.
  */
 
-static int inline sock_error_p(int s)
+__inline__ static int sock_error_p(int s)
 {
     unsigned int optval, optlen;
 
@@ -704,7 +704,7 @@
   {
     int length, fromlen32 = *fromlen16;
 
-    if ((length = recvfrom(pws->fd, buf, len, flags, from, &fromlen32)) >= 0 );
+    if ((length = recvfrom(pws->fd, buf, len, flags, from, &fromlen32)) >= 0)
     {   
       *fromlen16 = fromlen32; 
        notify_client(pws, WS_FD_READ);
diff --git a/msdos/dpmi.c b/msdos/dpmi.c
index 4ad248e..408e6dc 100644
--- a/msdos/dpmi.c
+++ b/msdos/dpmi.c
@@ -296,6 +296,7 @@
             		SET_CFLAG(context);
 			break;
 		    }
+		    break;
 		default:
             	    SET_CFLAG(context);
 		    break;
diff --git a/msdos/int21.c b/msdos/int21.c
index 08ee577..4af3a53 100644
--- a/msdos/int21.c
+++ b/msdos/int21.c
@@ -227,7 +227,7 @@
     RESET_CFLAG(context);
 }
 
-static void ioctlGenericBlkDevReq( CONTEXT *context )
+static BOOL32 ioctlGenericBlkDevReq( CONTEXT *context )
 {
 	BYTE *dataptr = PTR_SEG_OFF_TO_LIN(DS_reg(context), DX_reg(context));
 	int drive = DOS_GET_DRIVE( BL_reg(context) );
@@ -235,20 +235,21 @@
 	if (!DRIVE_IsValid(drive))
         {
             DOS_ERROR( ER_FileNotFound, EC_NotFound, SA_Abort, EL_Disk );
-            AX_reg(context) = DOS_ExtendedError;
-            SET_CFLAG(context);
-            return;
+            return TRUE;
 	}
 
 	if (CH_reg(context) != 0x08)
         {
             INT_BARF( context, 0x21 );
-            return;
+            return FALSE;
 	}
-	switch (CL_reg(context)) {
+
+	switch (CL_reg(context)) 
+	{
 		case 0x4a: /* lock logical volume */
 			dprintf_int(stddeb,"int21: lock logical volume (%d) level %d mode %d\n",drive,BH_reg(context),DX_reg(context));
-			return;
+			break;
+
 		case 0x60: /* get device parameters */
 			   /* used by w4wgrp's winfile */
 			memset(dataptr, 0, 0x26);
@@ -268,9 +269,11 @@
 			}
 			CreateBPB(drive, &dataptr[7]);			
 			RESET_CFLAG(context);
-			return;
+			break;
+
 		case 0x66:/*  get disk serial number */
-			{	char	label[12],fsname[9],path[4];
+			{	
+				char	label[12],fsname[9],path[4];
 				DWORD	serial;
 
 				strcpy(path,"x:\\");path[0]=drive+'A';
@@ -281,14 +284,17 @@
 				memcpy(dataptr+2,&serial,4);
 				memcpy(dataptr+6,label	,11);
 				memcpy(dataptr+17,fsname,8);
-				return;
 			}
+			break;
+
 		case 0x6a:
 			dprintf_int(stddeb,"int21: logical volume %d unlocked.\n",drive);
-			return;
+			break;
+
 		default:
                         INT_BARF( context, 0x21 );
 	}
+	return FALSE;
 }
 
 static void INT21_GetSystemDate( CONTEXT *context )
@@ -308,15 +314,11 @@
     DX_reg(context) = (systime.wSecond << 8) | (systime.wMilliseconds / 10);
 }
 
-static void INT21_CreateFile( CONTEXT *context )
+static BOOL32 INT21_CreateFile( CONTEXT *context )
 {
     AX_reg(context) = _lcreat16( PTR_SEG_OFF_TO_LIN( DS_reg(context),
                                           DX_reg(context) ), CX_reg(context) );
-    if (AX_reg(context) == (WORD)HFILE_ERROR16)
-    {
-	AX_reg(context) = DOS_ExtendedError;
-	SET_CFLAG(context);
-    }
+    return (AX_reg(context) == (WORD)HFILE_ERROR16);
 }
 
 
@@ -406,92 +408,108 @@
     }
 }
 
-void ExtendedOpenCreateFile(CONTEXT *context )
+static BOOL32 INT21_ExtendedOpenCreateFile(CONTEXT *context )
 {
-  BYTE action=DL_reg(context);
+  BOOL32 bExtendedError = FALSE;
+  BYTE action = DL_reg(context);
+
   /* Shuffle arguments to call OpenExistingFile */
   AL_reg(context) = BL_reg(context);
   DX_reg(context) = SI_reg(context);
   /* BX,CX and DX should be preserved */
   OpenExistingFile(context);
-  if ((EFL_reg(context) & 0x0001)==0) 
-    { /* It exists */
+
+  if ((EFL_reg(context) & 0x0001) == 0) /* File exists */
+  {
+      UINT16	uReturnCX = 0;
+
       /* Now decide what do do */
-      if ((action & 0x07)== 0)
-	{
+
+      if ((action & 0x07) == 0)
+      {
 	  BX_reg(context) = AX_reg(context);
 	  CloseFile(context);
-	  AX_reg(context) = 0x0050;/*File exists*/
-	  CX_reg(context) = 0;
+	  AX_reg(context) = 0x0050;	/*File exists*/
 	  SET_CFLAG(context);
-	  dprintf_int(stddeb, "int21: extended open/create: failed because file exixts \n");
-	  return;
-	}
-      if ((action & 0x07)== 2) {
-	/* Truncate it, but first check if opened for write */
-	if ((BL_reg(context) & 0x0007)== 0) {
-	  BX_reg(context) = AX_reg(context);
-	  CloseFile(context);
-	  dprintf_int(stddeb, "int21: extended open/create: failed, trunc on ro file");
-	  AX_reg(context) = 0x000C;/*Access code invalid*/
-	  CX_reg(context) = 0;
-	  SET_CFLAG(context);
-	  return;
-	}
-	/* Shuffle arguments to call CloseFile */
-	dprintf_int(stddeb, "int21: extended open/create: Closing before truncate\n");
-	BX_reg(context) = AX_reg(context);
-	/* BX and DX should be preserved */
-	CloseFile(context);
-	if (EFL_reg(context) & 0x0001) {
-	  dprintf_int(stddeb, "int21: extended open/create: close before trunc failed");
-	  AX_reg(context) = 0x0019;/*Seek Error*/
-	  CX_reg(context) = 0;
-	  SET_CFLAG(context);
-	}
-	/* Shuffle arguments to call CreateFile */
-	dprintf_int(stddeb, "int21: extended open/create: Truncating\n");
-	AL_reg(context) = BL_reg(context);
-	/* CX is still the same */
-	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: trunc failed");
-	  return;
-	}
-	CX_reg(context) = 3;
-	return;
+	  dprintf_int(stddeb, "int21: extended open/create: failed because file exists \n");
       }
-      CX_reg(context) = 1;
-      return;
-    }
+      else if ((action & 0x07) == 2) 
+      {
+	/* Truncate it, but first check if opened for write */
+	if ((BL_reg(context) & 0x0007)== 0) 
+	{
+		  BX_reg(context) = AX_reg(context);
+		  CloseFile(context);
+		  dprintf_int(stddeb, "int21: extended open/create: failed, trunc on ro file");
+		  AX_reg(context) = 0x000C;	/*Access code invalid*/
+		  SET_CFLAG(context);
+	}
+	else
+	{
+		/* Shuffle arguments to call CloseFile while
+		 * preserving BX and DX */
+
+		dprintf_int(stddeb, "int21: extended open/create: Closing before truncate\n");
+		BX_reg(context) = AX_reg(context);
+		CloseFile(context);
+		if (EFL_reg(context) & 0x0001) 
+		{
+		   dprintf_int(stddeb, "int21: extended open/create: close before trunc failed");
+		   AX_reg(context) = 0x0019;	/*Seek Error*/
+		   CX_reg(context) = 0;
+		   SET_CFLAG(context);
+		}
+		/* Shuffle arguments to call CreateFile */
+
+		dprintf_int(stddeb, "int21: extended open/create: Truncating\n");
+		AL_reg(context) = BL_reg(context);
+		/* CX is still the same */
+		DX_reg(context) = SI_reg(context);
+		bExtendedError = INT21_CreateFile(context);
+
+		if (EFL_reg(context) & 0x0001) 	/*no file open, flags set */
+		{
+		    dprintf_int(stddeb, "int21: extended open/create: trunc failed");
+		    return bExtendedError;
+		}
+		uReturnCX = 0x3;
+	}
+      } 
+      else uReturnCX = 0x1;
+
+      CX_reg(context) = uReturnCX;
+  }
   else /* file does not exist */
-    {
+  {
       RESET_CFLAG(context); /* was set by OpenExistingFile(context) */
       if ((action & 0xF0)== 0)
       {
 	CX_reg(context) = 0;
 	SET_CFLAG(context);
 	dprintf_int(stddeb, "int21: extended open/create: failed, file dosen't exist\n");
-	return;
       }
-      /* Shuffle arguments to call CreateFile */
-      dprintf_int(stddeb, "int21: extended open/create: Creating\n");
-      AL_reg(context) = BL_reg(context);
-      /* CX should still be the same */
-      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: create failed\n");
-	return;
+      else
+      {
+        /* Shuffle arguments to call CreateFile */
+        dprintf_int(stddeb, "int21: extended open/create: Creating\n");
+        AL_reg(context) = BL_reg(context);
+        /* CX should still be the same */
+        DX_reg(context) = SI_reg(context);
+        bExtendedError = INT21_CreateFile(context);
+        if (EFL_reg(context) & 0x0001)  /*no file open, flags set */
+	{
+  	    dprintf_int(stddeb, "int21: extended open/create: create failed\n");
+	    return bExtendedError;
+        }
+        CX_reg(context) = 2;
       }
-      CX_reg(context) = 2;
-      return;
-    }
+  }
+
+  return bExtendedError;
 }
 
 
-static void INT21_ChangeDir( CONTEXT *context )
+static BOOL32 INT21_ChangeDir( CONTEXT *context )
 {
     int drive;
     char *dirname = PTR_SEG_OFF_TO_LIN(DS_reg(context),DX_reg(context));
@@ -503,11 +521,7 @@
         dirname += 2;
     }
     else drive = DRIVE_GetCurrentDrive();
-    if (!DRIVE_Chdir( drive, dirname ))
-    {
-        AX_reg(context) = DOS_ExtendedError;
-        SET_CFLAG(context);
-    }
+    return DRIVE_Chdir( drive, dirname );
 }
 
 
@@ -581,7 +595,7 @@
 }
 
 
-static int INT21_CreateTempFile( CONTEXT *context )
+static BOOL32 INT21_CreateTempFile( CONTEXT *context )
 {
     static int counter = 0;
     char *name = PTR_SEG_OFF_TO_LIN( DS_reg(context), DX_reg(context) );
@@ -595,14 +609,14 @@
         if ((AX_reg(context) = _lcreat_uniq( name, 0 )) != (WORD)HFILE_ERROR16)
         {
             dprintf_int( stddeb, "INT21_CreateTempFile: created %s\n", name );
-            return 1;
+            return TRUE;
         }
-        if (DOS_ExtendedError != ER_FileExists) return 0;
+        if (DOS_ExtendedError != ER_FileExists) return FALSE;
     }
 }
 
 
-static int INT21_GetCurrentDirectory( CONTEXT *context ) 
+static BOOL32 INT21_GetCurrentDirectory( CONTEXT *context ) 
 {
     int drive = DOS_GET_DRIVE( DL_reg(context) );
     char *ptr = (char *)PTR_SEG_OFF_TO_LIN( DS_reg(context), SI_reg(context) );
@@ -610,11 +624,11 @@
     if (!DRIVE_IsValid(drive))
     {
         DOS_ERROR( ER_InvalidDrive, EC_NotFound, SA_Abort, EL_Disk );
-        return 0;
+        return FALSE;
     }
-
     lstrcpyn32A( ptr, DRIVE_GetDosCwd(drive), 64 );
-    return 1;
+    AX_reg(context) = 0x0100;			     /* success return code */
+    return TRUE;
 }
 
 
@@ -885,6 +899,8 @@
  */
 void DOS3Call( CONTEXT *context )
 {
+    BOOL32	bSetDOSExtendedError = FALSE;
+
     dprintf_int( stddeb, "int21: AX=%04x BX=%04x CX=%04x DX=%04x "
                  "SI=%04x DI=%04x DS=%04x ES=%04x EFL=%08lx\n",
                  AX_reg(context), BX_reg(context), CX_reg(context),
@@ -1112,35 +1128,23 @@
         break;
 
     case 0x39: /* "MKDIR" - CREATE SUBDIRECTORY */
-        if (!CreateDirectory16( PTR_SEG_OFF_TO_LIN( DS_reg(context),
-                                                    DX_reg(context) ), NULL))
-        {
-            AX_reg(context) = DOS_ExtendedError;
-            SET_CFLAG(context);
-        }
+        bSetDOSExtendedError = (!CreateDirectory16( PTR_SEG_OFF_TO_LIN( DS_reg(context),
+                                                           DX_reg(context) ), NULL));
         break;
 	
     case 0x3a: /* "RMDIR" - REMOVE SUBDIRECTORY */
-        if (!RemoveDirectory16( PTR_SEG_OFF_TO_LIN( DS_reg(context),
-                                                    DX_reg(context) )))
-        {
-            AX_reg(context) = DOS_ExtendedError;
-            SET_CFLAG(context);
-        }
+        bSetDOSExtendedError = (!RemoveDirectory16( PTR_SEG_OFF_TO_LIN( DS_reg(context),
+                                                                 DX_reg(context) )));
         break;
 
     case 0x3b: /* "CHDIR" - SET CURRENT DIRECTORY */
-        INT21_ChangeDir(context);
+        bSetDOSExtendedError = !INT21_ChangeDir(context);
         break;
 	
     case 0x3c: /* "CREAT" - CREATE OR TRUNCATE FILE */
         AX_reg(context) = _lcreat16( PTR_SEG_OFF_TO_LIN( DS_reg(context),
                                     DX_reg(context) ), CX_reg(context) );
-        if (AX_reg(context) == (WORD)HFILE_ERROR16)
-        {
-            AX_reg(context) = DOS_ExtendedError;
-            SET_CFLAG(context);
-        }
+        bSetDOSExtendedError = (AX_reg(context) == (WORD)HFILE_ERROR16);
         break;
 
     case 0x3d: /* "OPEN" - OPEN EXISTING FILE */
@@ -1148,11 +1152,7 @@
         break;
 
     case 0x3e: /* "CLOSE" - CLOSE FILE */
-        if ((AX_reg(context) = _lclose16( BX_reg(context) )) != 0)
-        {
-            AX_reg(context) = DOS_ExtendedError;
-            SET_CFLAG(context);
-        }
+        bSetDOSExtendedError = ((AX_reg(context) = _lclose16( BX_reg(context) )) != 0);
         break;
 
     case 0x3f: /* "READ" - READ FROM FILE OR DEVICE */
@@ -1161,11 +1161,7 @@
                                        PTR_SEG_OFF_TO_SEGPTR( DS_reg(context),
                                                               DX_reg(context) ),
                                        CX_reg(context) );
-            if (result == -1)
-            {
-                AX_reg(context) = DOS_ExtendedError;
-                SET_CFLAG(context);
-            }
+            if (result == -1) bSetDOSExtendedError = TRUE;
             else AX_reg(context) = (WORD)result;
         }
         break;
@@ -1176,22 +1172,14 @@
                                      PTR_SEG_OFF_TO_LIN( DS_reg(context),
                                                          DX_reg(context) ),
                                      CX_reg(context) );
-            if (result == -1)
-            {
-                AX_reg(context) = DOS_ExtendedError;
-                SET_CFLAG(context);
-            }
+            if (result == -1) bSetDOSExtendedError = TRUE;
             else AX_reg(context) = (WORD)result;
         }
         break;
 
     case 0x41: /* "UNLINK" - DELETE FILE */
-        if (!DeleteFile32A( PTR_SEG_OFF_TO_LIN( DS_reg(context),
-                                                DX_reg(context) )))
-        {
-            AX_reg(context) = DOS_ExtendedError;
-            SET_CFLAG(context);
-        }		
+        bSetDOSExtendedError = (!DeleteFile32A( PTR_SEG_OFF_TO_LIN( DS_reg(context),
+                                                             DX_reg(context) )));
         break;
 
     case 0x42: /* "LSEEK" - SET CURRENT FILE POSITION */
@@ -1199,14 +1187,12 @@
             LONG status = _llseek16( BX_reg(context),
                                      MAKELONG(DX_reg(context),CX_reg(context)),
                                      AL_reg(context) );
-            if (status == -1)
-            {
-                AX_reg(context) = DOS_ExtendedError;
-                SET_CFLAG(context);
-                break;
-            }
-            AX_reg(context) = LOWORD(status);
-            DX_reg(context) = HIWORD(status);
+            if (status == -1) bSetDOSExtendedError = TRUE;
+	    else
+	    {
+            	AX_reg(context) = LOWORD(status);
+           	DX_reg(context) = HIWORD(status);
+	    }
         }
         break;
 
@@ -1217,21 +1203,15 @@
             AX_reg(context) = (WORD)GetFileAttributes32A(
                                           PTR_SEG_OFF_TO_LIN(DS_reg(context),
                                                              DX_reg(context)));
-            if (AX_reg(context) == 0xffff)
-            {
-                AX_reg(context) = DOS_ExtendedError;
-                SET_CFLAG(context);
-            }
+            if (AX_reg(context) == 0xffff) bSetDOSExtendedError = TRUE;
             else CX_reg(context) = AX_reg(context);
             break;
+
         case 0x01:
-            if (!SetFileAttributes32A( PTR_SEG_OFF_TO_LIN(DS_reg(context),
-                                                          DX_reg(context)),
-                                       CX_reg(context) ))
-            {
-                AX_reg(context) = DOS_ExtendedError;
-                SET_CFLAG(context);
-            }
+            bSetDOSExtendedError = 
+		(!SetFileAttributes32A( PTR_SEG_OFF_TO_LIN(DS_reg(context), 
+							   DX_reg(context)),
+                                       			   CX_reg(context) ));
             break;
         }
         break;
@@ -1312,8 +1292,9 @@
             break;
 
         case 0x0d:
-            ioctlGenericBlkDevReq(context);
+            bSetDOSExtendedError = ioctlGenericBlkDevReq(context);
             break;
+
 	case 0x0e: /* get logical drive mapping */
 	    AL_reg(context) = 0; /* drive has no mapping */
 	    break;
@@ -1333,31 +1314,17 @@
         break;
 
     case 0x45: /* "DUP" - DUPLICATE FILE HANDLE */
-        if ((AX_reg(context) = FILE_Dup(BX_reg(context))) == (WORD)HFILE_ERROR16)
-        {
-            AX_reg(context) = DOS_ExtendedError;
-            SET_CFLAG(context);
-        }
+        bSetDOSExtendedError = ((AX_reg(context) = FILE_Dup(BX_reg(context))) == (WORD)HFILE_ERROR16);
         break;
 
     case 0x46: /* "DUP2", "FORCEDUP" - FORCE DUPLICATE FILE HANDLE */
-        if (FILE_Dup2( BX_reg(context), CX_reg(context) ) == HFILE_ERROR32)
-        {
-            AX_reg(context) = DOS_ExtendedError;
-            SET_CFLAG(context);
-        }
-       else AX_reg(context) = 0x0100; 
-        /* intlist: many Microsoft products for Windows rely on this */
+        bSetDOSExtendedError = (FILE_Dup2( BX_reg(context), CX_reg(context) ) == HFILE_ERROR32);
         break;
 
     case 0x47: /* "CWD" - GET CURRENT DIRECTORY */
-        if (!INT21_GetCurrentDirectory(context))
-        {
-            AX_reg(context) = DOS_ExtendedError;
-            SET_CFLAG(context);
-        }
+        bSetDOSExtendedError = !INT21_GetCurrentDirectory(context);
         break;
-	
+
     case 0x48: /* ALLOCATE MEMORY */
     case 0x49: /* FREE MEMORY */
     case 0x4a: /* RESIZE MEMORY BLOCK */
@@ -1406,12 +1373,9 @@
         break;
 
     case 0x56: /* "RENAME" - RENAME FILE */
-        if (!MoveFile32A( PTR_SEG_OFF_TO_LIN(DS_reg(context),DX_reg(context)),
-                          PTR_SEG_OFF_TO_LIN(ES_reg(context),DI_reg(context))))
-        {
-            AX_reg(context) = DOS_ExtendedError;
-            SET_CFLAG(context);
-        }
+        bSetDOSExtendedError = 
+		(!MoveFile32A( PTR_SEG_OFF_TO_LIN(DS_reg(context),DX_reg(context)),
+			       PTR_SEG_OFF_TO_LIN(ES_reg(context),DI_reg(context))));
         break;
 
     case 0x57: /* FILE DATE AND TIME */
@@ -1421,10 +1385,7 @@
             {
                 FILETIME filetime;
                 if (!GetFileTime( BX_reg(context), NULL, NULL, &filetime ))
-                {
-                    AX_reg(context) = DOS_ExtendedError;
-                    SET_CFLAG(context);
-                }
+		     bSetDOSExtendedError = TRUE;
                 else FileTimeToDosDateTime( &filetime, &DX_reg(context),
                                             &CX_reg(context) );
             }
@@ -1435,11 +1396,8 @@
                 FILETIME filetime;
                 DosDateTimeToFileTime( DX_reg(context), CX_reg(context),
                                        &filetime );
-                if (!SetFileTime( BX_reg(context), NULL, NULL, &filetime ))
-                {
-                    AX_reg(context) = DOS_ExtendedError;
-                    SET_CFLAG(context);
-                }
+                bSetDOSExtendedError = 
+			(!SetFileTime( BX_reg(context), NULL, NULL, &filetime ));
             }
             break;
         }
@@ -1462,27 +1420,20 @@
         break;
 
     case 0x5a: /* CREATE TEMPORARY FILE */
-        if (!INT21_CreateTempFile(context))
-        {
-            AX_reg(context) = DOS_ExtendedError;
-            SET_CFLAG(context);
-        }
+        bSetDOSExtendedError = !INT21_CreateTempFile(context);
         break;
 
     case 0x5b: /* CREATE NEW FILE */
-        if ((AX_reg(context) = _lcreat_uniq( PTR_SEG_OFF_TO_LIN(DS_reg(context),DX_reg(context)), 0 )) == (WORD)HFILE_ERROR16)
-        {
-            AX_reg(context) = DOS_ExtendedError;
-            SET_CFLAG(context);
-        }
+        bSetDOSExtendedError = ((AX_reg(context) = 
+		_lcreat_uniq( PTR_SEG_OFF_TO_LIN(DS_reg(context),DX_reg(context)), 0 )) 
+								== (WORD)HFILE_ERROR16);
         break;
 
     case 0x5d: /* NETWORK */
     case 0x5e:
         /* network software not installed */
         DOS_ERROR( ER_NoNetwork, EC_NotFound, SA_Abort, EL_Network );
-        AX_reg(context) = DOS_ExtendedError;
-        SET_CFLAG(context);
+	bSetDOSExtendedError = TRUE;
         break;
 
     case 0x5f: /* NETWORK */
@@ -1492,8 +1443,7 @@
             if (!DRIVE_Enable( DL_reg(context) ))
             {
                 DOS_ERROR( ER_InvalidDrive, EC_MediaError, SA_Abort, EL_Disk );
-                AX_reg(context) = DOS_ExtendedError;
-                SET_CFLAG(context);
+		bSetDOSExtendedError = TRUE;
             }
             break;
 
@@ -1501,16 +1451,14 @@
             if (!DRIVE_Disable( DL_reg(context) ))
             {
                 DOS_ERROR( ER_InvalidDrive, EC_MediaError, SA_Abort, EL_Disk );
-                AX_reg(context) = DOS_ExtendedError;
-                SET_CFLAG(context);
+		bSetDOSExtendedError = TRUE;
             } 
             break;
 
         default:
             /* network software not installed */
             DOS_ERROR( ER_NoNetwork, EC_NotFound, SA_Abort, EL_Network );
-            AX_reg(context) = DOS_ExtendedError;
-            SET_CFLAG(context);
+	    bSetDOSExtendedError = TRUE;
             break;
         }
         break;
@@ -1521,10 +1469,7 @@
                                                         SI_reg(context)), 128,
                                      PTR_SEG_OFF_TO_LIN(ES_reg(context),
                                                         DI_reg(context)),NULL))
-            {
-                AX_reg(context) = DOS_ExtendedError;
-                SET_CFLAG(context);
-            }
+		bSetDOSExtendedError = TRUE;
             else AX_reg(context) = 0;
         }
         break;
@@ -1535,6 +1480,7 @@
         INT_BARF( context, 0x21 );
         SET_CFLAG(context);
     	break;
+
     case 0x65:{/* GET EXTENDED COUNTRY INFORMATION */
     	extern WORD WINE_LanguageId;
 	BYTE    *dataptr=PTR_SEG_OFF_TO_LIN(ES_reg(context),DI_reg(context));;
@@ -1573,66 +1519,45 @@
 
     case 0x67: /* SET HANDLE COUNT */
         SetHandleCount16( BX_reg(context) );
-        if (DOS_ExtendedError)
-        {
-            AX_reg(context) = DOS_ExtendedError;
-            SET_CFLAG(context);
-        }
+        if (DOS_ExtendedError) bSetDOSExtendedError = TRUE;
         break;
 
     case 0x68: /* "FFLUSH" - COMMIT FILE */
     case 0x6a: /* COMMIT FILE */
-        if (!FlushFileBuffers( BX_reg(context) ))
-        {
-            AX_reg(context) = DOS_ExtendedError;
-            SET_CFLAG(context);
-        }
+        bSetDOSExtendedError = (!FlushFileBuffers( BX_reg(context) ));
         break;		
 	
     case 0x69: /* DISK SERIAL NUMBER */
         switch (AL_reg(context))
         {
         case 0x00:
-            if (!INT21_GetDiskSerialNumber(context))
-            {
-                AX_reg(context) = DOS_ExtendedError;
-                SET_CFLAG(context);
-            }
+            if (!INT21_GetDiskSerialNumber(context)) bSetDOSExtendedError = TRUE;
             else AX_reg(context) = 0;
             break;
+
         case 0x01:
-            if (!INT21_SetDiskSerialNumber(context))
-            {
-                AX_reg(context) = DOS_ExtendedError;
-                SET_CFLAG(context);
-            }
+            if (!INT21_SetDiskSerialNumber(context)) bSetDOSExtendedError = TRUE;
             else AX_reg(context) = 1;
             break;
         }
         break;
     
     case 0x6C: /* Extended Open/Create*/
-        ExtendedOpenCreateFile(context);
+        bSetDOSExtendedError = INT21_ExtendedOpenCreateFile(context);
         break;
 	
     case 0x71: /* MS-DOS 7 (Windows95) - LONG FILENAME FUNCTIONS */
         switch(AL_reg(context))
         {
         case 0x39:  /* Create directory */
-            if (!CreateDirectory32A( PTR_SEG_OFF_TO_LIN( DS_reg(context),
-                                                     DX_reg(context) ), NULL))
-            {
-                AX_reg(context) = DOS_ExtendedError;
-                SET_CFLAG(context);
-            }
+            bSetDOSExtendedError = (!CreateDirectory32A( 
+					PTR_SEG_OFF_TO_LIN( DS_reg(context),
+                                                  DX_reg(context) ), NULL));
             break;
         case 0x3a:  /* Remove directory */
-            if (!RemoveDirectory32A( PTR_SEG_OFF_TO_LIN( DS_reg(context),
-                                                         DX_reg(context) )))
-            {
-                AX_reg(context) = DOS_ExtendedError;
-                SET_CFLAG(context);
-            }
+            bSetDOSExtendedError = (!RemoveDirectory32A( 
+					PTR_SEG_OFF_TO_LIN( DS_reg(context),
+                                                        DX_reg(context) )));
             break;
         case 0x43:  /* Get/Set file attributes */
         switch (BL_reg(context))
@@ -1641,20 +1566,13 @@
             CX_reg(context) = (WORD)GetFileAttributes32A(
                                           PTR_SEG_OFF_TO_LIN(DS_reg(context),
                                                              DX_reg(context)));
-            if (CX_reg(context) == 0xffff)
-            {
-                AX_reg(context) = DOS_ExtendedError;
-                SET_CFLAG(context);
-            }
+            if (CX_reg(context) == 0xffff) bSetDOSExtendedError = TRUE;
             break;
         case 0x01:
-            if (!SetFileAttributes32A( PTR_SEG_OFF_TO_LIN(DS_reg(context),
-                                                          DX_reg(context)),
-                                       CX_reg(context) ))
-            {
-                AX_reg(context) = DOS_ExtendedError;
-                SET_CFLAG(context);
-            }
+            bSetDOSExtendedError = (!SetFileAttributes32A( 
+				  	PTR_SEG_OFF_TO_LIN(DS_reg(context),
+                                                           DX_reg(context)),
+                                        CX_reg(context)  ) );
             break;
 	default:
 	  fprintf( stderr, 
@@ -1666,14 +1584,9 @@
 	}
 	break;
         case 0x47:  /* Get current directory */
-	  if (!INT21_GetCurrentDirectory(context))
-	    {
-	      AX_reg(context) = DOS_ExtendedError;
-	      SET_CFLAG(context);
-	    }
-	  else AX_reg(context) = 0x0100; 
-        /* intlist: many Microsoft products for Windows rely on this */
-        break;
+	    bSetDOSExtendedError = !INT21_GetCurrentDirectory(context);
+            break;
+
         case 0x4e:  /* Find first file */
             /* FIXME: use attributes in CX */
             if ((AX_reg(context) = FindFirstFile16(
@@ -1681,42 +1594,29 @@
                    (WIN32_FIND_DATA32A *)PTR_SEG_OFF_TO_LIN(ES_reg(context),
                                                             DI_reg(context))))
 		== INVALID_HANDLE_VALUE16)
-            {
-                AX_reg(context) = DOS_ExtendedError;
-                SET_CFLAG(context);
-            }
+		bSetDOSExtendedError = TRUE;
             break;
         case 0x4f:  /* Find next file */
             if (!FindNextFile16( BX_reg(context),
                     (WIN32_FIND_DATA32A *)PTR_SEG_OFF_TO_LIN(ES_reg(context),
                                                              DI_reg(context))))
-            {
-                AX_reg(context) = DOS_ExtendedError;
-                SET_CFLAG(context);
-            }
+		bSetDOSExtendedError = TRUE;
             break;
         case 0xa1:  /* Find close */
-            if (!FindClose16( BX_reg(context) ))
-            {
-                AX_reg(context) = DOS_ExtendedError;
-                SET_CFLAG(context);
-            }
+            bSetDOSExtendedError = (!FindClose16( BX_reg(context) ));
             break;
 	case 0xa0:
 	    break;
         case 0x60:  
 	  switch(CL_reg(context))
-	    {
+	  {
 	    case 0x02:  /*Get canonical long filename or path */
 	      if (!GetFullPathName32A
 		  ( PTR_SEG_OFF_TO_LIN(DS_reg(context),
 				       SI_reg(context)), 128,
 		    PTR_SEG_OFF_TO_LIN(ES_reg(context),
 				       DI_reg(context)),NULL))
-		{
-		  AX_reg(context) = DOS_ExtendedError;
-		  SET_CFLAG(context);
-		}
+		bSetDOSExtendedError = TRUE;
 	      else AX_reg(context) = 0;
 	      break;
 	    default:
@@ -1726,13 +1626,23 @@
 	      SET_CFLAG(context);
 	      AL_reg(context) = 0;
 	      break;
-	    }
+	  }
 	    break;
         case 0x6c:  /* Create or open file */
 	  /* translate Dos 7 action to Dos 6 action */
-	    ExtendedOpenCreateFile(context);
+	    bSetDOSExtendedError = INT21_ExtendedOpenCreateFile(context);
 	    break;
+
         case 0x3b:  /* Change directory */
+	    if (!SetCurrentDirectory32A(PTR_SEG_OFF_TO_LIN(
+	    					DS_reg(context),
+				        	DX_reg(context)
+					))
+	    ) {
+		SET_CFLAG(context);
+		AL_reg(context) = DOS_ExtendedError;
+	    }
+	    break;
         case 0x41:  /* Delete file */
         case 0x56:  /* Move (rename) file */
         default:
@@ -1761,7 +1671,15 @@
     default:
         INT_BARF( context, 0x21 );
         break;
+
+    } /* END OF SWITCH */
+
+    if( bSetDOSExtendedError )		/* set general error condition */
+    {   
+	AX_reg(context) = DOS_ExtendedError;
+	SET_CFLAG(context);
     }
+
     dprintf_int( stddeb, "ret21: AX=%04x BX=%04x CX=%04x DX=%04x "
                  "SI=%04x DI=%04x DS=%04x ES=%04x EFL=%08lx\n",
                  AX_reg(context), BX_reg(context), CX_reg(context),
@@ -1769,3 +1687,4 @@
                  (WORD)DS_reg(context), (WORD)ES_reg(context),
                  EFL_reg(context));
 }
+
diff --git a/multimedia/audio.c b/multimedia/audio.c
index 932d1f9..558466f 100644
--- a/multimedia/audio.c
+++ b/multimedia/audio.c
@@ -211,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(wDevID, WODM_OPEN, 0, (DWORD)lpDesc, CALLBACK_NULL);
-	dwRet = widMessage(wDevID, WIDM_OPEN, 0, (DWORD)lpDesc, CALLBACK_NULL);
+	dwRet = wodMessage(index, WODM_OPEN, 0, (DWORD)lpDesc, CALLBACK_NULL);
+	dwRet = widMessage(index, WIDM_OPEN, 0, (DWORD)lpDesc, CALLBACK_NULL);
 	USER_HEAP_FREE(hFormat);
 	USER_HEAP_FREE(hDesc);
 	return 0;
@@ -233,9 +233,9 @@
 			mmioClose(MCIWavDev[index].hFile, 0);
 			MCIWavDev[index].hFile = 0;
 			}
-		dwRet = wodMessage(wDevID, WODM_CLOSE, 0, 0L, 0L);
+		dwRet = wodMessage(index, WODM_CLOSE, 0, 0L, 0L);
 		if (dwRet != MMSYSERR_NOERROR) return MCIERR_INTERNAL;
-		dwRet = widMessage(wDevID, WIDM_CLOSE, 0, 0L, 0L);
+		dwRet = widMessage(index, WIDM_CLOSE, 0, 0L, 0L);
 		if (dwRet != MMSYSERR_NOERROR) return MCIERR_INTERNAL;
 		}
 	return 0;
@@ -300,7 +300,7 @@
 	lp16WaveHdr = (LPWAVEHDR) USER_HEAP_SEG_ADDR(hWaveHdr);
 	memcpy(PTR_SEG_TO_LIN(lp16WaveHdr), lpWaveHdr, sizeof(WAVEHDR));
 	lpWaveHdr = PTR_SEG_TO_LIN(lp16WaveHdr);
-	dwRet = wodMessage(wDevID, WODM_PREPARE, 0, (DWORD)lp16WaveHdr, sizeof(WAVEHDR));
+	dwRet = wodMessage(index, WODM_PREPARE, 0, (DWORD)lp16WaveHdr, sizeof(WAVEHDR));
 	while(TRUE) {
 		count = mmioRead(MCIWavDev[index].hFile, 
 			PTR_SEG_TO_LIN(lpWaveHdr->lpData), bufsize);
@@ -310,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(wDevID, WODM_WRITE, 0, (DWORD)lp16WaveHdr, sizeof(WAVEHDR));
+		dwRet = wodMessage(index, WODM_WRITE, 0, (DWORD)lp16WaveHdr, sizeof(WAVEHDR));
 		}
-	dwRet = wodMessage(wDevID, WODM_UNPREPARE, 0, (DWORD)lp16WaveHdr, sizeof(WAVEHDR));
+	dwRet = wodMessage(index, WODM_UNPREPARE, 0, (DWORD)lp16WaveHdr, sizeof(WAVEHDR));
 	if (lpWaveHdr->lpData != NULL) {
 		GlobalUnlock16(hData);
 		GlobalFree16(hData);
@@ -371,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(wDevID, WIDM_PREPARE, 0, (DWORD)lp16WaveHdr, sizeof(WAVEHDR));
+	dwRet = widMessage(index, WIDM_PREPARE, 0, (DWORD)lp16WaveHdr, sizeof(WAVEHDR));
     dprintf_mciwave(stddeb,"WAVE_mciRecord // after WIDM_PREPARE \n");
 	while(TRUE) {
 		lpWaveHdr->dwBytesRecorded = 0;
-		dwRet = widMessage(wDevID, WIDM_START, 0, 0L, 0L);
+		dwRet = widMessage(index, 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(wDevID, WIDM_UNPREPARE, 0, (DWORD)lp16WaveHdr, sizeof(WAVEHDR));
+	dwRet = widMessage(index, WIDM_UNPREPARE, 0, (DWORD)lp16WaveHdr, sizeof(WAVEHDR));
 	dprintf_mciwave(stddeb,"WAVE_mciRecord // after WIDM_UNPREPARE \n");
 	if (lpWaveHdr->lpData != NULL) {
 		GlobalUnlock16(hData);
@@ -759,7 +759,6 @@
 */
 static DWORD wodOpen(WORD wDevID, LPWAVEOPENDESC lpDesc, DWORD dwFlags)
 {
-	int index = MMSYSTEM_DevIDToIndex(wDevID);
 	int 		audio;
 	int			abuf_size;
 	int			smplrate;
@@ -777,7 +776,7 @@
 		dprintf_mciwave(stddeb,"Linux 'wodOpen' // MAX_WAVOUTDRV reached !\n");
 		return MMSYSERR_ALLOCATED;
 		}
-	WOutDev[index].unixdev = 0;
+	WOutDev[wDevID].unixdev = 0;
 	audio = open (SOUND_DEV, O_WRONLY, 0);
 	if (audio == -1) {
 		dprintf_mciwave(stddeb,"Linux 'wodOpen' // can't open !\n");
@@ -791,8 +790,8 @@
 			dprintf_mciwave(stddeb,"Linux 'wodOpen' // SNDCTL_DSP_GETBLKSIZE Invalid bufsize !\n");
 		return MMSYSERR_NOTENABLED;
 		}
-	WOutDev[index].wFlags = HIWORD(dwFlags & CALLBACK_TYPEMASK);
-	switch(WOutDev[index].wFlags) {
+	WOutDev[wDevID].wFlags = HIWORD(dwFlags & CALLBACK_TYPEMASK);
+	switch(WOutDev[wDevID].wFlags) {
 		case DCB_NULL:
 			dprintf_mciwave(stddeb,	"Linux 'wodOpen' // CALLBACK_NULL !\n");
 			break;
@@ -806,13 +805,12 @@
 			dprintf_mciwave(stddeb,	"Linux 'wodOpen' // CALLBACK_FUNCTION !\n");
 			break;
 		}
-	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;
+	WOutDev[wDevID].lpQueueHdr = NULL;
+	WOutDev[wDevID].unixdev = audio;
+	WOutDev[wDevID].dwTotalPlayed = 0;
+	WOutDev[wDevID].bufsize = abuf_size;
+	memcpy(&WOutDev[wDevID].waveDesc, lpDesc, sizeof(WAVEOPENDESC));
+        lpFormat = (LPWAVEFORMAT) PTR_SEG_TO_LIN(lpDesc->lpFormat); 
 	if (lpFormat->wFormatTag != WAVE_FORMAT_PCM) {
 		dprintf_mciwave(stddeb,"Linux 'wodOpen' // Bad format %04X !\n",
 				lpFormat->wFormatTag);
@@ -822,31 +820,31 @@
 				lpFormat->nSamplesPerSec);
 		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;
+	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;
 	dprintf_mciwave(stddeb,"Linux 'wodOpen' // wBitsPerSample=%u !\n",
-				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;
+				WOutDev[wDevID].Format.wBitsPerSample);
+	if (WOutDev[wDevID].Format.wBitsPerSample == 0) {
+		WOutDev[wDevID].Format.wBitsPerSample = 8 *
+		(WOutDev[wDevID].Format.wf.nAvgBytesPerSec /
+		WOutDev[wDevID].Format.wf.nSamplesPerSec) /
+		WOutDev[wDevID].Format.wf.nChannels;
 		}
-	samplesize = WOutDev[index].Format.wBitsPerSample;
-	smplrate = WOutDev[index].Format.wf.nSamplesPerSec;
-	dsp_stereo = (WOutDev[index].Format.wf.nChannels > 1) ? TRUE : FALSE;
+	samplesize = WOutDev[wDevID].Format.wBitsPerSample;
+	smplrate = WOutDev[wDevID].Format.wf.nSamplesPerSec;
+	dsp_stereo = (WOutDev[wDevID].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[index].Format.wBitsPerSample);
+				WOutDev[wDevID].Format.wBitsPerSample);
 	dprintf_mciwave(stddeb,"Linux 'wodOpen' // nAvgBytesPerSec=%lu !\n",
-				WOutDev[index].Format.wf.nAvgBytesPerSec);
+				WOutDev[wDevID].Format.wf.nAvgBytesPerSec);
 	dprintf_mciwave(stddeb,"Linux 'wodOpen' // nSamplesPerSec=%lu !\n",
-				WOutDev[index].Format.wf.nSamplesPerSec);
+				WOutDev[wDevID].Format.wf.nSamplesPerSec);
 	dprintf_mciwave(stddeb,"Linux 'wodOpen' // nChannels=%u !\n",
-				WOutDev[index].Format.wf.nChannels);
+				WOutDev[wDevID].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;
@@ -859,16 +857,15 @@
 */
 static DWORD wodClose(WORD wDevID)
 {
-	int index = MMSYSTEM_DevIDToIndex(wDevID);
 	dprintf_mciwave(stddeb,"wodClose(%u);\n", wDevID);
-	if (WOutDev[index].unixdev == 0) {
+	if (WOutDev[wDevID].unixdev == 0) {
 		dprintf_mciwave(stddeb,"Linux 'wodClose' // can't close !\n");
 		return MMSYSERR_NOTENABLED;
 		}
-	close(WOutDev[index].unixdev);
-	WOutDev[index].unixdev = 0;
-	WOutDev[index].bufsize = 0;
-	WOutDev[index].lpQueueHdr = NULL;
+	close(WOutDev[wDevID].unixdev);
+	WOutDev[wDevID].unixdev = 0;
+	WOutDev[wDevID].bufsize = 0;
+	WOutDev[wDevID].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;
@@ -881,11 +878,10 @@
 */
 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[index].unixdev == 0) {
+	if (WOutDev[wDevID].unixdev == 0) {
         dprintf_mciwave(stddeb,"Linux 'wodWrite' // can't play !\n");
 		return MMSYSERR_NOTENABLED;
 		}
@@ -897,16 +893,16 @@
 	dprintf_mciwave(stddeb,
 		"wodWrite() // dwBufferLength %lu !\n", lpWaveHdr->dwBufferLength);
 	dprintf_mciwave(stddeb,
-		"wodWrite() // WOutDev[%u].unixdev %u !\n", wDevID, WOutDev[index].unixdev);
+		"wodWrite() // WOutDev[%u].unixdev %u !\n", wDevID, WOutDev[wDevID].unixdev);
 	lpData = PTR_SEG_TO_LIN(lpWaveHdr->lpData);
-	count = write (WOutDev[index].unixdev, lpData, lpWaveHdr->dwBufferLength);
+	count = write (WOutDev[wDevID].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[index].dwTotalPlayed += count;
+	WOutDev[wDevID].dwTotalPlayed += count;
 	lpWaveHdr->dwFlags &= ~WHDR_INQUEUE;
 	lpWaveHdr->dwFlags |= WHDR_DONE;
 	if (WAVE_NotifyClient(wDevID, WOM_DONE, 0L, 0L) != MMSYSERR_NOERROR) {
@@ -921,22 +917,21 @@
 */
 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[index].unixdev == 0) {
+	if (WOutDev[wDevID].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[index].lpQueueHdr != NULL) {
+	if (WOutDev[wDevID].lpQueueHdr != NULL) {
 		dprintf_mciwave(stddeb,"Linux 'wodPrepare' // already prepare !\n");
 		return MMSYSERR_NOTENABLED;
 	}
 	*/
-	WOutDev[index].dwTotalPlayed = 0;
-	WOutDev[index].lpQueueHdr = lpWaveHdr;
+	WOutDev[wDevID].dwTotalPlayed = 0;
+	WOutDev[wDevID].lpQueueHdr = lpWaveHdr;
 	if (lpWaveHdr->dwFlags & WHDR_INQUEUE) return WAVERR_STILLPLAYING;
 	lpWaveHdr->dwFlags |= WHDR_PREPARED;
 	lpWaveHdr->dwFlags &= ~WHDR_DONE;
@@ -948,10 +943,9 @@
 */
 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[index].unixdev == 0) {
+	if (WOutDev[wDevID].unixdev == 0) {
 		dprintf_mciwave(stddeb,"Linux 'wodUnprepare' // can't unprepare !\n");
 		return MMSYSERR_NOTENABLED;
 		}
@@ -963,9 +957,8 @@
 */
 static DWORD wodRestart(WORD wDevID)
 {
-	int index = MMSYSTEM_DevIDToIndex(wDevID);
 	dprintf_mciwave(stddeb,"wodRestart(%u);\n", wDevID);
-	if (WOutDev[index].unixdev == 0) {
+	if (WOutDev[wDevID].unixdev == 0) {
 		dprintf_mciwave(stddeb,"Linux 'wodRestart' // can't restart !\n");
 		return MMSYSERR_NOTENABLED;
 		}
@@ -977,9 +970,8 @@
 */
 static DWORD wodReset(WORD wDevID)
 {
-	int index = MMSYSTEM_DevIDToIndex(wDevID);
 	dprintf_mciwave(stddeb,"wodReset(%u);\n", wDevID);
-	if (WOutDev[index].unixdev == 0) {
+	if (WOutDev[wDevID].unixdev == 0) {
 		dprintf_mciwave(stddeb,"Linux 'wodReset' // can't reset !\n");
 		return MMSYSERR_NOTENABLED;
 		}
@@ -992,31 +984,30 @@
 */
 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[index].unixdev == 0) {
+	if (WOutDev[wDevID].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[index].dwTotalPlayed;
+			lpTime->u.cb = WOutDev[wDevID].dwTotalPlayed;
 			dprintf_mciwave(stddeb,"wodGetPosition // TIME_BYTES=%lu\n", lpTime->u.cb);
 			break;
 		case TIME_SAMPLES:
 			dprintf_mciwave(stddeb,"wodGetPosition // dwTotalPlayed=%lu\n", 
-					WOutDev[index].dwTotalPlayed);
+					WOutDev[wDevID].dwTotalPlayed);
 			dprintf_mciwave(stddeb,"wodGetPosition // wBitsPerSample=%u\n", 
-					WOutDev[index].Format.wBitsPerSample);
-			lpTime->u.sample = WOutDev[index].dwTotalPlayed * 8 /
-						WOutDev[index].Format.wBitsPerSample;
+					WOutDev[wDevID].Format.wBitsPerSample);
+			lpTime->u.sample = WOutDev[wDevID].dwTotalPlayed * 8 /
+						WOutDev[wDevID].Format.wBitsPerSample;
 			dprintf_mciwave(stddeb,"wodGetPosition // TIME_SAMPLES=%lu\n", lpTime->u.sample);
 			break;
 		case TIME_SMPTE:
-			time = WOutDev[index].dwTotalPlayed /
-				(WOutDev[index].Format.wf.nAvgBytesPerSec / 1000);
+			time = WOutDev[wDevID].dwTotalPlayed /
+				(WOutDev[wDevID].Format.wf.nAvgBytesPerSec / 1000);
 			lpTime->u.smpte.hour = time / 108000;
 			time -= lpTime->u.smpte.hour * 108000;
 			lpTime->u.smpte.min = time / 1800;
@@ -1034,8 +1025,8 @@
 			dprintf_mciwave(stddeb,"wodGetPosition() format not supported ! use TIME_MS !\n");
 			lpTime->wType = TIME_MS;
 		case TIME_MS:
-			lpTime->u.ms = WOutDev[index].dwTotalPlayed /
-					(WOutDev[index].Format.wf.nAvgBytesPerSec / 1000);
+			lpTime->u.ms = WOutDev[wDevID].dwTotalPlayed /
+					(WOutDev[wDevID].Format.wf.nAvgBytesPerSec / 1000);
 			dprintf_mciwave(stddeb,"wodGetPosition // TIME_MS=%lu\n", lpTime->u.ms);
 			break;
 		}
@@ -1218,7 +1209,6 @@
 */
 static DWORD widOpen(WORD wDevID, LPWAVEOPENDESC lpDesc, DWORD dwFlags)
 {
-	int index = MMSYSTEM_DevIDToIndex(wDevID);
 	int 		audio;
 	int			abuf_size;
 	int			smplrate;
@@ -1234,7 +1224,7 @@
 		dprintf_mciwave(stddeb,"Linux 'widOpen' // MAX_WAVINDRV reached !\n");
 		return MMSYSERR_ALLOCATED;
 		}
-	WInDev[index].unixdev = 0;
+	WInDev[wDevID].unixdev = 0;
 	audio = open (SOUND_DEV, O_RDONLY, 0);
 	if (audio == -1) {
 		dprintf_mciwave(stddeb,"Linux 'widOpen' // can't open !\n");
@@ -1248,8 +1238,8 @@
 			dprintf_mciwave(stddeb,"Linux 'widOpen' // SNDCTL_DSP_GETBLKSIZE Invalid bufsize !\n");
 		return MMSYSERR_NOTENABLED;
 		}
-	WInDev[index].wFlags = HIWORD(dwFlags & CALLBACK_TYPEMASK);
-	switch(WInDev[index].wFlags) {
+	WInDev[wDevID].wFlags = HIWORD(dwFlags & CALLBACK_TYPEMASK);
+	switch(WInDev[wDevID].wFlags) {
 		case DCB_NULL:
 			dprintf_mciwave(stddeb,	"Linux 'widOpen' // CALLBACK_NULL !\n");
 			break;
@@ -1263,41 +1253,41 @@
 			dprintf_mciwave(stddeb,	"Linux 'widOpen' // CALLBACK_FUNCTION !\n");
 			break;
 		}
-	WInDev[index].lpQueueHdr = NULL;
-	WInDev[index].unixdev = audio;
-	WInDev[index].bufsize = abuf_size;
-	WInDev[index].dwTotalRecorded = 0;
-	memcpy(&WInDev[index].waveDesc, lpDesc, sizeof(WAVEOPENDESC));
+	WInDev[wDevID].lpQueueHdr = NULL;
+	WInDev[wDevID].unixdev = audio;
+	WInDev[wDevID].bufsize = abuf_size;
+	WInDev[wDevID].dwTotalRecorded = 0;
+	memcpy(&WInDev[wDevID].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[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;
+	memcpy(&WInDev[wDevID].Format, lpFormat, sizeof(PCMWAVEFORMAT));
+	WInDev[wDevID].Format.wBitsPerSample = 8; /* <-------------- */
+	if (WInDev[wDevID].Format.wf.nChannels == 0) return WAVERR_BADFORMAT;
+	if (WInDev[wDevID].Format.wf.nSamplesPerSec == 0) return WAVERR_BADFORMAT;
+	if (WInDev[wDevID].Format.wBitsPerSample == 0) {
+		WInDev[wDevID].Format.wBitsPerSample = 8 *
+		(WInDev[wDevID].Format.wf.nAvgBytesPerSec /
+		WInDev[wDevID].Format.wf.nSamplesPerSec) /
+		WInDev[wDevID].Format.wf.nChannels;
 		}
-	samplesize = WInDev[index].Format.wBitsPerSample;
-	smplrate = WInDev[index].Format.wf.nSamplesPerSec;
-	dsp_stereo = (WInDev[index].Format.wf.nChannels > 1) ? TRUE : FALSE;
+	samplesize = WInDev[wDevID].Format.wBitsPerSample;
+	smplrate = WInDev[wDevID].Format.wf.nSamplesPerSec;
+	dsp_stereo = (WInDev[wDevID].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[index].Format.wBitsPerSample);
+				WInDev[wDevID].Format.wBitsPerSample);
 	dprintf_mciwave(stddeb,"Linux 'widOpen' // nSamplesPerSec=%lu !\n",
-				WInDev[index].Format.wf.nSamplesPerSec);
+				WInDev[wDevID].Format.wf.nSamplesPerSec);
 	dprintf_mciwave(stddeb,"Linux 'widOpen' // nChannels=%u !\n",
-				WInDev[index].Format.wf.nChannels);
+				WInDev[wDevID].Format.wf.nChannels);
 	dprintf_mciwave(stddeb,"Linux 'widOpen' // nAvgBytesPerSec=%lu\n",
-			WInDev[index].Format.wf.nAvgBytesPerSec); 
+			WInDev[wDevID].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;
@@ -1310,15 +1300,14 @@
 */
 static DWORD widClose(WORD wDevID)
 {
-	int index = MMSYSTEM_DevIDToIndex(wDevID);
 	dprintf_mciwave(stddeb,"widClose(%u);\n", wDevID);
-	if (WInDev[index].unixdev == 0) {
+	if (WInDev[wDevID].unixdev == 0) {
 		dprintf_mciwave(stddeb,"Linux 'widClose' // can't close !\n");
 		return MMSYSERR_NOTENABLED;
 		}
-	close(WInDev[index].unixdev);
-	WInDev[index].unixdev = 0;
-	WInDev[index].bufsize = 0;
+	close(WInDev[wDevID].unixdev);
+	WInDev[wDevID].unixdev = 0;
+	WInDev[wDevID].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;
@@ -1331,12 +1320,11 @@
 */
 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[index].unixdev == 0) {
+	if (WInDev[wDevID].unixdev == 0) {
 		dprintf_mciwave(stddeb,"Linux 'widAddBuffer' // can't do it !\n");
 		return MMSYSERR_NOTENABLED;
 		}
@@ -1352,14 +1340,14 @@
 	lpWaveHdr->dwFlags |= WHDR_INQUEUE;
 	lpWaveHdr->dwFlags &= ~WHDR_DONE;
 	lpWaveHdr->dwBytesRecorded = 0;
-	if (WInDev[index].lpQueueHdr == NULL) {
+	if (WInDev[wDevID].lpQueueHdr == NULL) {
 		/* begin the queue with a first header ... */
-		WInDev[index].lpQueueHdr = lpWaveHdr;
-		WInDev[index].dwTotalRecorded = 0;
+		WInDev[wDevID].lpQueueHdr = lpWaveHdr;
+		WInDev[wDevID].dwTotalRecorded = 0;
 		}
 	else {
 		/* added to the queue, except if it's the one just prepared ... */
-		lpWIHdr = WInDev[index].lpQueueHdr;
+		lpWIHdr = WInDev[wDevID].lpQueueHdr;
 		while (lpWIHdr->lpNext != NULL) {
 			lpWIHdr = lpWIHdr->lpNext;
 			count++;
@@ -1377,14 +1365,13 @@
 */
 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[index].unixdev == 0) {
+	if (WInDev[wDevID].unixdev == 0) {
 		dprintf_mciwave(stddeb,"Linux 'widPrepare' // can't prepare !\n");
 		return MMSYSERR_NOTENABLED;
 		}
-	if (WInDev[index].lpQueueHdr != NULL) {
+	if (WInDev[wDevID].lpQueueHdr != NULL) {
 		dprintf_mciwave(stddeb,"Linux 'widPrepare' // already prepare !\n");
 		return WAVERR_BADFORMAT;
 		}
@@ -1402,17 +1389,16 @@
 */
 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[index].unixdev == 0) {
+	if (WInDev[wDevID].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[index].lpQueueHdr = NULL;
+	WInDev[wDevID].lpQueueHdr = NULL;
 	dprintf_mciwave(stddeb,
 		"Linux 'widUnprepare' // all headers unprepared !\n");
 	return MMSYSERR_NOERROR;
@@ -1423,31 +1409,30 @@
 */
 static DWORD widStart(WORD wDevID)
 {
-	int index = MMSYSTEM_DevIDToIndex(wDevID);
 	int			count	= 1;
 	LPWAVEHDR 	lpWIHdr;
 	dprintf_mciwave(stddeb,"widStart(%u);\n", wDevID);
-	if (WInDev[index].unixdev == 0) {
+	if (WInDev[wDevID].unixdev == 0) {
 		dprintf_mciwave(stddeb,	"Linux 'widStart' // can't start recording !\n");
 		return MMSYSERR_NOTENABLED;
 		}
-	if (WInDev[index].lpQueueHdr == NULL || 
-		WInDev[index].lpQueueHdr->lpData == NULL) {
+	if (WInDev[wDevID].lpQueueHdr == NULL || 
+		WInDev[wDevID].lpQueueHdr->lpData == NULL) {
 		dprintf_mciwave(stddeb,"Linux 'widStart' // never been prepared !\n");
 		return WAVERR_UNPREPARED;
 		}
-	lpWIHdr = WInDev[index].lpQueueHdr;
+	lpWIHdr = WInDev[wDevID].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[index].unixdev, 
+		read (WInDev[wDevID].unixdev, 
 			PTR_SEG_TO_LIN(lpWIHdr->lpData),
 			lpWIHdr->dwBufferLength);
 		lpWIHdr->dwBytesRecorded = lpWIHdr->dwBufferLength;
-		WInDev[index].dwTotalRecorded += lpWIHdr->dwBytesRecorded;
+		WInDev[wDevID].dwTotalRecorded += lpWIHdr->dwBytesRecorded;
 		lpWIHdr->dwFlags &= ~WHDR_INQUEUE;
 		lpWIHdr->dwFlags |= WHDR_DONE;
 		if (WAVE_NotifyClient(wDevID, WIM_DATA, (DWORD)lpWIHdr, 0L) != 
@@ -1468,9 +1453,8 @@
 */
 static DWORD widStop(WORD wDevID)
 {
-	int index = MMSYSTEM_DevIDToIndex(wDevID);
 	dprintf_mciwave(stddeb,"widStop(%u);\n", wDevID);
-	if (WInDev[index].unixdev == 0) {
+	if (WInDev[wDevID].unixdev == 0) {
 		dprintf_mciwave(stddeb,"Linux 'widStop' // can't stop !\n");
 		return MMSYSERR_NOTENABLED;
 		}
@@ -1482,9 +1466,8 @@
 */
 static DWORD widReset(WORD wDevID)
 {
-	int index = MMSYSTEM_DevIDToIndex(wDevID);
 	dprintf_mciwave(stddeb,"widReset(%u);\n", wDevID);
-	if (WInDev[index].unixdev == 0) {
+	if (WInDev[wDevID].unixdev == 0) {
 		dprintf_mciwave(stddeb,"Linux 'widReset' // can't reset !\n");
 		return MMSYSERR_NOTENABLED;
 		}
@@ -1496,12 +1479,11 @@
 */
 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[index].unixdev == 0) {
+	if (WInDev[wDevID].unixdev == 0) {
 		dprintf_mciwave(stddeb,"Linux 'widGetPosition' // can't get pos !\n");
 		return MMSYSERR_NOTENABLED;
 		}
@@ -1509,30 +1491,30 @@
 	dprintf_mciwave(stddeb,"widGetPosition // wType=%04X !\n", 
 			lpTime->wType);
 	dprintf_mciwave(stddeb,"widGetPosition // wBitsPerSample=%u\n",
-			WInDev[index].Format.wBitsPerSample); 
+			WInDev[wDevID].Format.wBitsPerSample); 
 	dprintf_mciwave(stddeb,"widGetPosition // nSamplesPerSec=%lu\n",
-			WInDev[index].Format.wf.nSamplesPerSec); 
+			WInDev[wDevID].Format.wf.nSamplesPerSec); 
 	dprintf_mciwave(stddeb,"widGetPosition // nChannels=%u\n",
-			WInDev[index].Format.wf.nChannels); 
+			WInDev[wDevID].Format.wf.nChannels); 
 	dprintf_mciwave(stddeb,"widGetPosition // nAvgBytesPerSec=%lu\n",
-			WInDev[index].Format.wf.nAvgBytesPerSec); 
+			WInDev[wDevID].Format.wf.nAvgBytesPerSec); 
 	fflush(stddeb);
 	switch(lpTime->wType) {
 		case TIME_BYTES:
-			lpTime->u.cb = WInDev[index].dwTotalRecorded;
+			lpTime->u.cb = WInDev[wDevID].dwTotalRecorded;
 			dprintf_mciwave(stddeb,
 			    "widGetPosition // TIME_BYTES=%lu\n", lpTime->u.cb);
 			break;
 		case TIME_SAMPLES:
-			lpTime->u.sample = WInDev[index].dwTotalRecorded * 8 /
-					  WInDev[index].Format.wBitsPerSample;
+			lpTime->u.sample = WInDev[wDevID].dwTotalRecorded * 8 /
+					  WInDev[wDevID].Format.wBitsPerSample;
 			dprintf_mciwave(stddeb,
 					"widGetPosition // TIME_SAMPLES=%lu\n", 
 					lpTime->u.sample);
 			break;
 		case TIME_SMPTE:
-			time = WInDev[index].dwTotalRecorded /
-				(WInDev[index].Format.wf.nAvgBytesPerSec / 1000);
+			time = WInDev[wDevID].dwTotalRecorded /
+				(WInDev[wDevID].Format.wf.nAvgBytesPerSec / 1000);
 			lpTime->u.smpte.hour = time / 108000;
 			time -= lpTime->u.smpte.hour * 108000;
 			lpTime->u.smpte.min = time / 1800;
@@ -1549,8 +1531,8 @@
 			dprintf_mciwave(stddeb,"widGetPosition() format not supported ! use TIME_MS !\n");
 			lpTime->wType = TIME_MS;
 		case TIME_MS:
-			lpTime->u.ms = WInDev[index].dwTotalRecorded /
-					(WInDev[index].Format.wf.nAvgBytesPerSec / 1000);
+			lpTime->u.ms = WInDev[wDevID].dwTotalRecorded /
+					(WInDev[wDevID].Format.wf.nAvgBytesPerSec / 1000);
 			dprintf_mciwave(stddeb,
 			      "widGetPosition // TIME_MS=%lu\n", lpTime->u.ms);
 			break;
diff --git a/multimedia/mmsystem.c b/multimedia/mmsystem.c
index 0c232a5..10da700 100644
--- a/multimedia/mmsystem.c
+++ b/multimedia/mmsystem.c
@@ -98,8 +98,7 @@
 int MMSYSTEM_WEP(HINSTANCE16 hInstance, WORD wDataSeg,
 		 WORD cbHeapSize, LPSTR lpCmdLine)
 {
-	/* isn't WEP the Windows Exit Procedure ? */
-	printf("MMSYSTEM DLL INIT ... hInst=%04X \n", hInstance);
+	fprintf(stderr, "STUB: Unloading MMSystem DLL ... hInst=%04X \n", hInstance);
 	return(TRUE);
 }
 
@@ -108,22 +107,12 @@
 */
 BOOL16 sndPlaySound(LPCSTR lpszSoundName, UINT16 uFlags)
 {
+	BOOL16			bRet = FALSE;
 	HMMIO16			hmmio;
-	MMCKINFO		mmckInfo;
-	MMCKINFO		ckMainRIFF;
-	HLOCAL16		hFormat;
-	PCMWAVEFORMAT 	pcmWaveFormat;
-	int				count;
-	int				bufsize;
-	HLOCAL16		hDesc;
-	LPWAVEOPENDESC 	lpWaveDesc;
-	HLOCAL16		hWaveHdr;
-	LPWAVEHDR		lpWaveHdr;
-	LPWAVEHDR		lp16WaveHdr;
-	HLOCAL16		hData;
-	DWORD			dwRet;
+	MMCKINFO                ckMainRIFF;
 	char			str[128];
 	LPSTR			ptr;
+
 	dprintf_mmsys(stddeb, "sndPlaySound // SoundName='%s' uFlags=%04X !\n", 
 									lpszSoundName, uFlags);
 	if (lpszSoundName == NULL) {
@@ -138,95 +127,122 @@
 		return FALSE;
 	}
 
-	if (hmmio == 0) {
+	if (hmmio == 0) 
+	{
 		dprintf_mmsys(stddeb, "sndPlaySound // searching in SystemSound List !\n");
 		GetProfileString32A("Sounds", (LPSTR)lpszSoundName, "", str, sizeof(str));
 		if (strlen(str) == 0) return FALSE;
 		if ( (ptr = (LPSTR)strchr(str, ',')) != NULL) *ptr = '\0';
 		hmmio = mmioOpen(str, NULL, MMIO_ALLOCBUF | MMIO_READ | MMIO_DENYWRITE);
-		if (hmmio == 0) {
+		if (hmmio == 0) 
+		{
 			dprintf_mmsys(stddeb, "sndPlaySound // can't find SystemSound='%s' !\n", str);
 			return FALSE;
+		}
+	}
+
+	if (mmioDescend(hmmio, &ckMainRIFF, NULL, 0) == 0) 
+        {
+	    dprintf_mmsys(stddeb, "sndPlaySound // ParentChunk ckid=%.4s fccType=%.4s cksize=%08lX \n",
+				(LPSTR)&ckMainRIFF.ckid, (LPSTR)&ckMainRIFF.fccType, ckMainRIFF.cksize);
+
+	    if ((ckMainRIFF.ckid == FOURCC_RIFF) &&
+	    	(ckMainRIFF.fccType == mmioFOURCC('W', 'A', 'V', 'E')))
+	    {
+		MMCKINFO        mmckInfo;
+
+		mmckInfo.ckid = mmioFOURCC('f', 'm', 't', ' ');
+
+		if (mmioDescend(hmmio, &mmckInfo, &ckMainRIFF, MMIO_FINDCHUNK) == 0)
+		{
+		    PCMWAVEFORMAT           pcmWaveFormat;
+
+		    dprintf_mmsys(stddeb, "sndPlaySound // Chunk Found ckid=%.4s fccType=%.4s cksize=%08lX \n",
+				(LPSTR)&mmckInfo.ckid, (LPSTR)&mmckInfo.fccType, mmckInfo.cksize);
+
+		    if (mmioRead(hmmio, (HPSTR) &pcmWaveFormat,
+			        (long) sizeof(PCMWAVEFORMAT)) == (long) sizeof(PCMWAVEFORMAT))
+		    {
+
+			dprintf_mmsys(stddeb, "sndPlaySound // wFormatTag=%04X !\n", pcmWaveFormat.wf.wFormatTag);
+			dprintf_mmsys(stddeb, "sndPlaySound // nChannels=%d \n", pcmWaveFormat.wf.nChannels);
+			dprintf_mmsys(stddeb, "sndPlaySound // nSamplesPerSec=%ld\n", pcmWaveFormat.wf.nSamplesPerSec);
+			dprintf_mmsys(stddeb, "sndPlaySound // nAvgBytesPerSec=%ld\n", pcmWaveFormat.wf.nAvgBytesPerSec);
+			dprintf_mmsys(stddeb, "sndPlaySound // nBlockAlign=%d \n", pcmWaveFormat.wf.nBlockAlign);
+			dprintf_mmsys(stddeb, "sndPlaySound // wBitsPerSample=%u !\n", pcmWaveFormat.wBitsPerSample);
+
+			mmckInfo.ckid = mmioFOURCC('d', 'a', 't', 'a');
+			if (mmioDescend(hmmio, &mmckInfo, &ckMainRIFF, MMIO_FINDCHUNK) == 0)
+			{
+			    LPWAVEFORMAT     lpFormat	= (LPWAVEFORMAT) SEGPTR_ALLOC(sizeof(PCMWAVEFORMAT));
+			    LPWAVEOPENDESC   lpWaveDesc = (LPWAVEOPENDESC) SEGPTR_ALLOC(sizeof(WAVEOPENDESC));
+			    DWORD            dwRet;
+
+			    dprintf_mmsys(stddeb, "sndPlaySound // Chunk Found \
+ ckid=%.4s fccType=%.4s cksize=%08lX \n", (LPSTR)&mmckInfo.ckid, (LPSTR)&mmckInfo.fccType, mmckInfo.cksize);
+
+			    pcmWaveFormat.wf.nAvgBytesPerSec = pcmWaveFormat.wf.nSamplesPerSec * 
+							   pcmWaveFormat.wf.nBlockAlign;
+			    memcpy(lpFormat, &pcmWaveFormat, sizeof(PCMWAVEFORMAT));
+
+			    lpWaveDesc->hWave    = 0;
+			    lpWaveDesc->lpFormat = (LPWAVEFORMAT) SEGPTR_GET(lpFormat);
+
+			    dwRet = wodMessage( MMSYSTEM_FirstDevID(), 
+						WODM_OPEN, 0, (DWORD)SEGPTR_GET(lpWaveDesc), CALLBACK_NULL);
+			    SEGPTR_FREE(lpFormat);
+			    SEGPTR_FREE(lpWaveDesc);
+
+			    if (dwRet == MMSYSERR_NOERROR) 
+			    {
+				LPWAVEHDR    lpWaveHdr = (LPWAVEHDR) SEGPTR_ALLOC(sizeof(WAVEHDR));
+				SEGPTR       spWaveHdr = SEGPTR_GET(lpWaveHdr);
+				HGLOBAL16    hData;
+				INT32        count, bufsize;
+
+				bufsize = 64000;
+				hData = GlobalAlloc16(GMEM_MOVEABLE, bufsize);
+				lpWaveHdr->lpData = (LPSTR) WIN16_GlobalLock16(hData);
+				lpWaveHdr->dwBufferLength = bufsize;
+				lpWaveHdr->dwUser = 0L;
+				lpWaveHdr->dwFlags = 0L;
+				lpWaveHdr->dwLoops = 0L;
+
+				dwRet = wodMessage( MMSYSTEM_FirstDevID(),
+						    WODM_PREPARE, 0, (DWORD)spWaveHdr, sizeof(WAVEHDR));
+				if (dwRet == MMSYSERR_NOERROR) 
+				{
+				    while( TRUE )
+				    {
+					count = mmioRead(hmmio, PTR_SEG_TO_LIN(lpWaveHdr->lpData), bufsize);
+					if (count < 1) break;
+					lpWaveHdr->dwBufferLength = count;
+				/*	lpWaveHdr->dwBytesRecorded = count; */
+					wodMessage( MMSYSTEM_FirstDevID(), WODM_WRITE, 
+						    0, (DWORD)spWaveHdr, sizeof(WAVEHDR));
+				    }
+				    wodMessage( MMSYSTEM_FirstDevID(), 
+						WODM_UNPREPARE, 0, (DWORD)spWaveHdr, sizeof(WAVEHDR));
+				    wodMessage( MMSYSTEM_FirstDevID(),
+						WODM_CLOSE, 0, 0L, 0L);
+
+				    bRet = TRUE;
+				}
+				else dprintf_mmsys(stddeb, "sndPlaySound // can't prepare WaveOut device !\n");
+
+				GlobalUnlock16(hData);
+				GlobalFree16(hData);
+
+				SEGPTR_FREE(lpWaveHdr);
+			    }
 			}
+		    }
 		}
-	if (mmioDescend(hmmio, &ckMainRIFF, NULL, 0) != 0) {
-ErrSND:	if (hmmio != 0)   mmioClose(hmmio, 0);
-		return FALSE;
-		}
-	dprintf_mmsys(stddeb, "sndPlaySound // ParentChunk ckid=%.4s fccType=%.4s cksize=%08lX \n",
-				(LPSTR)&ckMainRIFF.ckid, (LPSTR)&ckMainRIFF.fccType,
-				ckMainRIFF.cksize);
-	if ((ckMainRIFF.ckid != FOURCC_RIFF) ||
-	    (ckMainRIFF.fccType != mmioFOURCC('W', 'A', 'V', 'E'))) goto ErrSND;
-	mmckInfo.ckid = mmioFOURCC('f', 'm', 't', ' ');
-	if (mmioDescend(hmmio, &mmckInfo, &ckMainRIFF, MMIO_FINDCHUNK) != 0) goto ErrSND;
-	dprintf_mmsys(stddeb, "sndPlaySound // Chunk Found ckid=%.4s fccType=%.4s cksize=%08lX \n",
-			(LPSTR)&mmckInfo.ckid, (LPSTR)&mmckInfo.fccType,
-			mmckInfo.cksize);
-	if (mmioRead(hmmio, (HPSTR) &pcmWaveFormat,
-		(long) sizeof(PCMWAVEFORMAT)) != (long) sizeof(PCMWAVEFORMAT)) goto ErrSND;
+	    }
+	}
 
-	dprintf_mmsys(stddeb, "sndPlaySound // wFormatTag=%04X !\n", pcmWaveFormat.wf.wFormatTag);
-	dprintf_mmsys(stddeb, "sndPlaySound // nChannels=%d \n", pcmWaveFormat.wf.nChannels);
-	dprintf_mmsys(stddeb, "sndPlaySound // nSamplesPerSec=%ld\n", pcmWaveFormat.wf.nSamplesPerSec);
-	dprintf_mmsys(stddeb, "sndPlaySound // nAvgBytesPerSec=%ld\n", pcmWaveFormat.wf.nAvgBytesPerSec);
-	dprintf_mmsys(stddeb, "sndPlaySound // nBlockAlign=%d \n", pcmWaveFormat.wf.nBlockAlign);
-	dprintf_mmsys(stddeb, "sndPlaySound // wBitsPerSample=%u !\n", pcmWaveFormat.wBitsPerSample);
-
-	mmckInfo.ckid = mmioFOURCC('d', 'a', 't', 'a');
-	if (mmioDescend(hmmio, &mmckInfo, &ckMainRIFF, MMIO_FINDCHUNK) != 0) goto ErrSND;
-	dprintf_mmsys(stddeb, "sndPlaySound // Chunk Found ckid=%.4s fccType=%.4s cksize=%08lX \n",
-			(LPSTR)&mmckInfo.ckid, (LPSTR)&mmckInfo.fccType,
-			mmckInfo.cksize);
-	hDesc = USER_HEAP_ALLOC(sizeof(WAVEOPENDESC));
-	lpWaveDesc = (LPWAVEOPENDESC) USER_HEAP_LIN_ADDR(hDesc);
-	lpWaveDesc->hWave = 0;
-	pcmWaveFormat.wf.nAvgBytesPerSec = 
-		pcmWaveFormat.wf.nSamplesPerSec * pcmWaveFormat.wf.nBlockAlign;
-	hFormat = USER_HEAP_ALLOC(sizeof(PCMWAVEFORMAT));
-	lpWaveDesc->lpFormat = (LPWAVEFORMAT) USER_HEAP_LIN_ADDR(hFormat);
-	memcpy(lpWaveDesc->lpFormat, &pcmWaveFormat, sizeof(PCMWAVEFORMAT));
-	lpWaveDesc = (LPWAVEOPENDESC) USER_HEAP_SEG_ADDR(hDesc);
-	dwRet = wodMessage(0, WODM_OPEN, 0, (DWORD)lpWaveDesc, CALLBACK_NULL);
-	if (dwRet != MMSYSERR_NOERROR) {
-		dprintf_mmsys(stddeb, "sndPlaySound // can't open WaveOut device !\n");
-		goto ErrSND;
-		}
-	USER_HEAP_FREE(hFormat);
-	hWaveHdr = USER_HEAP_ALLOC(sizeof(WAVEHDR));
-	lpWaveHdr = (LPWAVEHDR) USER_HEAP_LIN_ADDR(hWaveHdr);
-	lp16WaveHdr = (LPWAVEHDR) USER_HEAP_SEG_ADDR(hWaveHdr);
-	bufsize = 64000;
-	hData = GlobalAlloc16(GMEM_MOVEABLE, bufsize);
-	lpWaveHdr->lpData = (LPSTR) WIN16_GlobalLock16(hData);
-	lpWaveHdr->dwBufferLength = bufsize;
-	lpWaveHdr->dwUser = 0L;
-	lpWaveHdr->dwFlags = 0L;
-	lpWaveHdr->dwLoops = 0L;
-	dwRet = wodMessage(0, WODM_PREPARE, 0, (DWORD)lp16WaveHdr, sizeof(WAVEHDR));
-	if (dwRet != MMSYSERR_NOERROR) {
-		dprintf_mmsys(stddeb, "sndPlaySound // can't prepare WaveOut device !\n");
-		GlobalUnlock16(hData);
-		GlobalFree16(hData);
-		USER_HEAP_FREE(hDesc);
-		USER_HEAP_FREE(hWaveHdr);
-		goto ErrSND;
-		}
-	while(TRUE) {
-		count = mmioRead(hmmio, PTR_SEG_TO_LIN(lpWaveHdr->lpData), bufsize);
-		if (count < 1) break;
-		lpWaveHdr->dwBufferLength = count;
-/*		lpWaveHdr->dwBytesRecorded = count; */
-		wodMessage(0, WODM_WRITE, 0, (DWORD)lp16WaveHdr, sizeof(WAVEHDR));
-		}
-	wodMessage(0, WODM_UNPREPARE, 0, (DWORD)lp16WaveHdr, sizeof(WAVEHDR));
-	wodMessage(0, WODM_CLOSE, 0, 0L, 0L);
-	GlobalUnlock16(hData);
-	GlobalFree16(hData);
-	USER_HEAP_FREE(hDesc);
-	USER_HEAP_FREE(hWaveHdr);
-	if (hmmio != 0)   mmioClose(hmmio, 0);
-	return TRUE;
+	if (hmmio != 0) mmioClose(hmmio, 0);
+	return bRet;
 }
 
 /**************************************************************************
@@ -1407,7 +1423,7 @@
 {
 	UINT16	count = 0;
 	dprintf_mmsys(stddeb, "waveOutGetNumDevs\n");
-	count += wodMessage(0, WODM_GETNUMDEVS, 0L, 0L, 0L);
+	count += wodMessage( MMSYSTEM_FirstDevID(), WODM_GETNUMDEVS, 0L, 0L, 0L);
 	dprintf_mmsys(stddeb, "waveOutGetNumDevs return %u \n", count);
 	return count;
 }
@@ -1552,7 +1568,7 @@
 	dprintf_mmsys(stddeb, "waveOutClose(%04X)\n", hWaveOut);
 	lpDesc = (LPWAVEOPENDESC) USER_HEAP_LIN_ADDR(hWaveOut);
 	if (lpDesc == NULL) return MMSYSERR_INVALHANDLE;
-	return wodMessage(0, WODM_CLOSE, lpDesc->dwInstance, 0L, 0L);
+	return wodMessage( MMSYSTEM_FirstDevID(), WODM_CLOSE, lpDesc->dwInstance, 0L, 0L);
 }
 
 /**************************************************************************
@@ -1566,7 +1582,7 @@
 					hWaveOut, lpWaveOutHdr, uSize);
 	lpDesc = (LPWAVEOPENDESC) USER_HEAP_LIN_ADDR(hWaveOut);
 	if (lpDesc == NULL) return MMSYSERR_INVALHANDLE;
-	return wodMessage(0, WODM_PREPARE, lpDesc->dwInstance, 
+	return wodMessage( MMSYSTEM_FirstDevID(), WODM_PREPARE, lpDesc->dwInstance, 
 							(DWORD)lpWaveOutHdr, uSize);
 }
 
@@ -1581,7 +1597,7 @@
 						hWaveOut, lpWaveOutHdr, uSize);
 	lpDesc = (LPWAVEOPENDESC) USER_HEAP_LIN_ADDR(hWaveOut);
 	if (lpDesc == NULL) return MMSYSERR_INVALHANDLE;
-	return wodMessage(0, WODM_UNPREPARE, lpDesc->dwInstance, 
+	return wodMessage( MMSYSTEM_FirstDevID(), WODM_UNPREPARE, lpDesc->dwInstance, 
 							(DWORD)lpWaveOutHdr, uSize);
 }
 
@@ -1594,7 +1610,7 @@
 	dprintf_mmsys(stddeb, "waveOutWrite(%04X, %p, %u);\n", hWaveOut, lpWaveOutHdr, uSize);
 	lpDesc = (LPWAVEOPENDESC) USER_HEAP_LIN_ADDR(hWaveOut);
 	if (lpDesc == NULL) return MMSYSERR_INVALHANDLE;
-	return wodMessage(0, WODM_WRITE, lpDesc->dwInstance, 
+	return wodMessage( MMSYSTEM_FirstDevID(), WODM_WRITE, lpDesc->dwInstance, 
 							(DWORD)lpWaveOutHdr, uSize);
 }
 
@@ -1607,7 +1623,7 @@
 	dprintf_mmsys(stddeb, "waveOutPause(%04X)\n", hWaveOut);
 	lpDesc = (LPWAVEOPENDESC) USER_HEAP_LIN_ADDR(hWaveOut);
 	if (lpDesc == NULL) return MMSYSERR_INVALHANDLE;
-	return wodMessage(0, WODM_PAUSE, lpDesc->dwInstance, 0L, 0L);
+	return wodMessage( MMSYSTEM_FirstDevID(), WODM_PAUSE, lpDesc->dwInstance, 0L, 0L);
 }
 
 /**************************************************************************
@@ -1619,7 +1635,7 @@
 	dprintf_mmsys(stddeb, "waveOutRestart(%04X)\n", hWaveOut);
 	lpDesc = (LPWAVEOPENDESC) USER_HEAP_LIN_ADDR(hWaveOut);
 	if (lpDesc == NULL) return MMSYSERR_INVALHANDLE;
-	return wodMessage(0, WODM_RESTART, lpDesc->dwInstance, 0L, 0L);
+	return wodMessage( MMSYSTEM_FirstDevID(), WODM_RESTART, lpDesc->dwInstance, 0L, 0L);
 }
 
 /**************************************************************************
@@ -1631,7 +1647,7 @@
 	dprintf_mmsys(stddeb, "waveOutReset(%04X)\n", hWaveOut);
 	lpDesc = (LPWAVEOPENDESC) USER_HEAP_LIN_ADDR(hWaveOut);
 	if (lpDesc == NULL) return MMSYSERR_INVALHANDLE;
-	return wodMessage(0, WODM_RESET, lpDesc->dwInstance, 0L, 0L);
+	return wodMessage( MMSYSTEM_FirstDevID(), WODM_RESET, lpDesc->dwInstance, 0L, 0L);
 }
 
 /**************************************************************************
@@ -1643,7 +1659,7 @@
 	dprintf_mmsys(stddeb, "waveOutGetPosition(%04X, %p, %u);\n", hWaveOut, lpTime, uSize);
 	lpDesc = (LPWAVEOPENDESC) USER_HEAP_LIN_ADDR(hWaveOut);
 	if (lpDesc == NULL) return MMSYSERR_INVALHANDLE;
-	return wodMessage(0, WODM_GETPOS, lpDesc->dwInstance, 
+	return wodMessage( MMSYSTEM_FirstDevID(), WODM_GETPOS, lpDesc->dwInstance, 
 							(DWORD)lpTime, (DWORD)uSize);
 }
 
@@ -1656,7 +1672,7 @@
 	dprintf_mmsys(stddeb, "waveOutGetPitch(%04X, %p);\n", hWaveOut, lpdwPitch);
 	lpDesc = (LPWAVEOPENDESC) USER_HEAP_LIN_ADDR(hWaveOut);
 	if (lpDesc == NULL) return MMSYSERR_INVALHANDLE;
-	return wodMessage(0, WODM_GETPITCH, lpDesc->dwInstance, 
+	return wodMessage( MMSYSTEM_FirstDevID(), WODM_GETPITCH, lpDesc->dwInstance, 
 								(DWORD)lpdwPitch, 0L);
 }
 
@@ -1669,7 +1685,7 @@
 	dprintf_mmsys(stddeb, "waveOutSetPitch(%04X, %08lX);\n", hWaveOut, dwPitch);
 	lpDesc = (LPWAVEOPENDESC) USER_HEAP_LIN_ADDR(hWaveOut);
 	if (lpDesc == NULL) return MMSYSERR_INVALHANDLE;
-	return wodMessage(0, WODM_SETPITCH, lpDesc->dwInstance, (DWORD)dwPitch, 0L);
+	return wodMessage( MMSYSTEM_FirstDevID(), WODM_SETPITCH, lpDesc->dwInstance, (DWORD)dwPitch, 0L);
 }
 
 /**************************************************************************
@@ -1699,7 +1715,7 @@
 	dprintf_mmsys(stddeb, "waveOutGetPlaybackRate(%04X, %p);\n", hWaveOut, lpdwRate);
 	lpDesc = (LPWAVEOPENDESC) USER_HEAP_LIN_ADDR(hWaveOut);
 	if (lpDesc == NULL) return MMSYSERR_INVALHANDLE;
-	return wodMessage(0, WODM_GETPLAYBACKRATE, lpDesc->dwInstance, 
+	return wodMessage( MMSYSTEM_FirstDevID(), WODM_GETPLAYBACKRATE, lpDesc->dwInstance, 
 								(DWORD)lpdwRate, 0L);
 }
 
@@ -1712,7 +1728,7 @@
 	dprintf_mmsys(stddeb, "waveOutSetPlaybackRate(%04X, %08lX);\n", hWaveOut, dwRate);
 	lpDesc = (LPWAVEOPENDESC) USER_HEAP_LIN_ADDR(hWaveOut);
 	if (lpDesc == NULL) return MMSYSERR_INVALHANDLE;
-	return wodMessage(0, WODM_SETPLAYBACKRATE, 
+	return wodMessage( MMSYSTEM_FirstDevID(), WODM_SETPLAYBACKRATE, 
 		lpDesc->dwInstance, (DWORD)dwRate, 0L);
 }
 
@@ -1752,7 +1768,7 @@
 			hWaveOut, uMessage, dwParam1, dwParam2);
 	lpDesc = (LPWAVEOPENDESC) USER_HEAP_LIN_ADDR(hWaveOut);
 	if (lpDesc == NULL) return MMSYSERR_INVALHANDLE;
-	return wodMessage(0, uMessage, lpDesc->dwInstance, dwParam1, dwParam2);
+	return wodMessage( MMSYSTEM_FirstDevID(), uMessage, lpDesc->dwInstance, dwParam1, dwParam2);
 }
 
 /**************************************************************************
diff --git a/objects/bitmap.c b/objects/bitmap.c
index 77147f7..52f3ef4 100644
--- a/objects/bitmap.c
+++ b/objects/bitmap.c
@@ -6,6 +6,7 @@
 
 #include <stdio.h>
 #include <stdlib.h>
+#include <string.h>
 #include <X11/Xlib.h>
 #include <X11/Xutil.h>
 #include "gdi.h"
@@ -28,29 +29,6 @@
 extern void CLIPPING_UpdateGCRegion( DC * dc );  /* objects/clipping.c */
 
 
-
-/***********************************************************************
- *           BITMAP_BmpToImage
- *
- * Create an XImage pointing to the bitmap data.
- */
-static XImage *BITMAP_BmpToImage( BITMAP16 * bmp, LPVOID bmpData )
-{
-    extern void _XInitImageFuncPtrs( XImage* );
-    XImage * image;
-
-    image = XCreateImage( display, DefaultVisualOfScreen(screen),
-			  bmp->bmBitsPixel, ZPixmap, 0, bmpData,
-			  bmp->bmWidth, bmp->bmHeight, 16, bmp->bmWidthBytes );
-    if (!image) return 0;
-    image->byte_order = MSBFirst;
-    image->bitmap_bit_order = MSBFirst;
-    image->bitmap_unit = 16;
-    _XInitImageFuncPtrs(image);
-    return image;
-}
-
-
 /***********************************************************************
  *           CreateBitmap16    (GDI.48)
  */
@@ -172,8 +150,10 @@
 LONG GetBitmapBits32( HBITMAP32 hbitmap, LONG count, LPVOID buffer )
 {
     BITMAPOBJ * bmp;
-    LONG height;
+    LONG height,widthbytes;
     XImage * image;
+    LPBYTE tmpbuffer,tbuf;
+    int	h,w,pad;
     
     /* KLUDGE! */
     if (count < 0) {
@@ -190,13 +170,112 @@
 	    bmp->bitmap.bmWidth, bmp->bitmap.bmHeight,
 	    1 << bmp->bitmap.bmBitsPixel, buffer, height );
     if (!height) return 0;
+
+    switch (bmp->bitmap.bmBitsPixel) {
+    case 1:
+	if (!(bmp->bitmap.bmWidth & 15))
+		pad = 0;
+	else
+		pad = ((16 - (bmp->bitmap.bmWidth & 15)) + 7) / 8;
+    	break;
+    case 4:
+	if (!(bmp->bitmap.bmWidth & 3))
+	    pad = 0;
+	else
+	    pad = ((4 - (bmp->bitmap.bmWidth & 3)) + 1) / 2;
+	break;
+    case 8:
+    	pad = (2 - (bmp->bitmap.bmWidth & 1)) & 1;
+    	break;
+    case 15:
+    case 16:
+    	pad = 0; /* we have 16bit alignment already */
+	break;
+    case 24:
+    	pad = (bmp->bitmap.bmWidth*3) & 1;
+    	break;
+    default:
+	fprintf(stderr,"GetBitMapBits32: unknown depth %d, please report.\n",
+		bmp->bitmap.bmBitsPixel
+	);
+	return 0;
+    }
+
+    widthbytes	= DIB_GetImageWidthBytesX11(bmp->bitmap.bmWidth,bmp->bitmap.bmBitsPixel);
+    tmpbuffer	= (LPBYTE)xmalloc(widthbytes*height);
+    image = XCreateImage( display, DefaultVisualOfScreen(screen),
+		  bmp->bitmap.bmBitsPixel, ZPixmap, 0, tmpbuffer,
+		  bmp->bitmap.bmWidth,height,32,widthbytes
+    );
     
-    if (!(image = BITMAP_BmpToImage( &bmp->bitmap, buffer ))) return 0;
     CallTo32_LargeStack( (int(*)())XGetSubImage, 11,
                          display, bmp->pixmap, 0, 0, bmp->bitmap.bmWidth,
                          height, AllPlanes, ZPixmap, image, 0, 0 );
-    image->data = NULL;
-    XDestroyImage( image );
+
+    /* copy XImage to 16 bit padded image buffer with real bitsperpixel */
+
+    tbuf = buffer;
+    switch (bmp->bitmap.bmBitsPixel)
+    {
+    case 1:
+        for (h=0;h<height;h++)
+        {
+            *tbuf = 0;
+            for (w=0;w<bmp->bitmap.bmWidth;w++)
+            {
+                *tbuf |= XGetPixel(image,w,h)<<(7-(w&7));
+                if ((w&7) == 7) *(++tbuf) = 0;
+            }
+            tbuf += pad;
+        }
+        break;
+    case 4:
+        for (h=0;h<height;h++)
+        {
+            for (w=0;w<bmp->bitmap.bmWidth;w++)
+            {
+                if (!(w & 1)) *tbuf = XGetPixel( image, w, h) << 4;
+	    	else *tbuf++ |= XGetPixel( image, w, h) & 0x0f;
+            }
+            tbuf += pad;
+        }
+        break;
+    case 8:
+        for (h=0;h<height;h++)
+        {
+            for (w=0;w<bmp->bitmap.bmWidth;w++)
+                *tbuf++ = XGetPixel(image,w,h);
+            tbuf += pad;
+        }
+        break;
+    case 15:
+    case 16:
+        for (h=0;h<height;h++)
+        {
+            for (w=0;w<bmp->bitmap.bmWidth;w++)
+            {
+	    	long pixel = XGetPixel(image,w,h);
+
+		*tbuf++ = pixel & 0xff;
+		*tbuf++ = (pixel>>8) & 0xff;
+            }
+        }
+        break;
+    case 24:
+        for (h=0;h<height;h++)
+        {
+            for (w=0;w<bmp->bitmap.bmWidth;w++)
+            {
+	    	long pixel = XGetPixel(image,w,h);
+
+		*tbuf++ = pixel & 0xff;
+		*tbuf++ = (pixel>> 8) & 0xff;
+		*tbuf++ = (pixel>>16) & 0xff;
+	    }
+            tbuf += pad;
+	}
+    }
+    XDestroyImage( image ); /* frees tbuffer too */
     return height * bmp->bitmap.bmWidthBytes;
 }
 
@@ -218,6 +297,8 @@
     BITMAPOBJ * bmp;
     LONG height;
     XImage * image;
+    LPBYTE sbuf,tmpbuffer;
+    int	w,h,pad,widthbytes;
     
     /* KLUDGE! */
     if (count < 0) {
@@ -236,12 +317,107 @@
     if (height > bmp->bitmap.bmHeight) height = bmp->bitmap.bmHeight;
     if (!height) return 0;
     	
-    if (!(image = BITMAP_BmpToImage( &bmp->bitmap, (LPVOID)buffer ))) return 0;
+    switch (bmp->bitmap.bmBitsPixel) {
+    case 1:
+	if (!(bmp->bitmap.bmWidth & 15))
+		pad = 0;
+	else
+		pad = ((16 - (bmp->bitmap.bmWidth & 15)) + 7) / 8;
+    	break;
+    case 4:
+	if (!(bmp->bitmap.bmWidth & 3))
+	    pad = 0;
+	else
+	    pad = ((4 - (bmp->bitmap.bmWidth & 3)) + 1) / 2;
+	break;
+    case 8:
+    	pad = (2 - (bmp->bitmap.bmWidth & 1)) & 1;
+    	break;
+    case 15:
+    case 16:
+    	pad = 0; /* we have 16bit alignment already */
+	break;
+    case 24:
+    	pad = (bmp->bitmap.bmWidth*3) & 1;
+    	break;
+    default:
+	fprintf(stderr,"SetBitMapBits32: unknown depth %d, please report.\n",
+		bmp->bitmap.bmBitsPixel
+	);
+	return 0;
+    }
+    sbuf = (LPBYTE)buffer;
+
+    widthbytes	= DIB_GetImageWidthBytesX11(bmp->bitmap.bmWidth,bmp->bitmap.bmBitsPixel);
+    tmpbuffer	= (LPBYTE)xmalloc(widthbytes*height);
+    image = XCreateImage( display, DefaultVisualOfScreen(screen),
+		  bmp->bitmap.bmBitsPixel, ZPixmap, 0, tmpbuffer,
+		  bmp->bitmap.bmWidth,height,32,widthbytes
+    );
+    
+    /* copy 16 bit padded image buffer with real bitsperpixel to XImage */
+    sbuf = (LPBYTE)buffer;
+    switch (bmp->bitmap.bmBitsPixel)
+    {
+    case 1:
+        for (h=0;h<height;h++)
+        {
+            for (w=0;w<bmp->bitmap.bmWidth;w++)
+            {
+                XPutPixel(image,w,h,(sbuf[0]>>(7-(w&7))) & 1);
+                if ((w&7) == 7)
+                    sbuf++;
+            }
+            sbuf += pad;
+        }
+        break;
+    case 4:
+        for (h=0;h<height;h++)
+        {
+            for (w=0;w<bmp->bitmap.bmWidth;w++)
+            {
+                if (!(w & 1)) XPutPixel( image, w, h, *sbuf >> 4 );
+                else XPutPixel( image, w, h, *sbuf++ & 0xf );
+            }
+            sbuf += pad;
+        }
+        break;
+    case 8:
+        for (h=0;h<height;h++)
+        {
+            for (w=0;w<bmp->bitmap.bmWidth;w++)
+                XPutPixel(image,w,h,*sbuf++);
+            sbuf += pad;
+        }
+        break;
+    case 15:
+    case 16:
+        for (h=0;h<height;h++)
+        {
+            for (w=0;w<bmp->bitmap.bmWidth;w++)
+            {
+                XPutPixel(image,w,h,sbuf[1]*256+sbuf[0]);
+                sbuf+=2;
+            }
+        }
+        break;
+    case 24: 
+        for (h=0;h<height;h++)
+        {
+            for (w=0;w<bmp->bitmap.bmWidth;w++)
+            {
+                XPutPixel(image,w,h,(sbuf[2]<<16)+(sbuf[1]<<8)+sbuf[0]);
+                sbuf += 3;
+            }
+            sbuf += pad;
+        }
+        break;
+    }
+
     CallTo32_LargeStack( XPutImage, 10,
                          display, bmp->pixmap, BITMAP_GC(bmp), image, 0, 0,
                          0, 0, bmp->bitmap.bmWidth, height );
-    image->data = NULL;
-    XDestroyImage( image );
+    XDestroyImage( image ); /* frees tmpbuffer too */
     return height * bmp->bitmap.bmWidthBytes;
 }
 
diff --git a/objects/cursoricon.c b/objects/cursoricon.c
index b4c140a..7212085 100644
--- a/objects/cursoricon.c
+++ b/objects/cursoricon.c
@@ -821,6 +821,11 @@
 
         /* Create a pixmap and transfer all the bits to it */
 
+	/* NOTE: Following hack works, but only because XFree depth
+	 * 	 1 images really use 1 bit/pixel (and so the same layout
+	 *	 as the Windows cursor data). Perhaps use a more generic
+	 *	 algorithm here.
+	 */
         pixmapAll = XCreatePixmap( display, rootWindow,
                                    ptr->nWidth, ptr->nHeight * 2, 1 );
         image = XCreateImage( display, DefaultVisualOfScreen(screen),
diff --git a/objects/dib.c b/objects/dib.c
index e294498..0eb78f0 100644
--- a/objects/dib.c
+++ b/objects/dib.c
@@ -800,7 +800,7 @@
     BITMAPOBJ * bmp;
     PALETTEENTRY * palEntry;
     PALETTEOBJ * palette;
-    XImage * bmpImage, * dibImage;
+    XImage * bmpImage;
     int i, x, y;
         
     if (!lines) return 0;
@@ -864,7 +864,7 @@
 	switch( info->bmiHeader.biBitCount )
 	{
 	   case 8:
-
+		/* pad up to 32 bit (FIXME: not 16? ) */
 		pad += (4 - (info->bmiHeader.biWidth & 3)) & 3;
 		for( y = yend - 1; (int)y >= (int)startscan; y-- )
 		{
@@ -873,32 +873,71 @@
 		   bbits += pad;
 		}
 		break;
-
-/* add more bpp-specific shortcuts here */
-
-	   default:
-
-		dibImage = XCreateImage(display, DefaultVisualOfScreen( screen ),
-			   info->bmiHeader.biBitCount, ZPixmap, 0, bits,
-			   info->bmiHeader.biWidth, info->bmiHeader.biHeight,
-			   32, DIB_GetImageWidthBytesX11(info->bmiHeader.biWidth,
-                                                info->bmiHeader.biBitCount ) );
-		if( dibImage )
+	   case 1:
+	   	pad += ((32 - (info->bmiHeader.biWidth & 31)) / 8) & 3;
+		for( y = yend - 1; (int)y >= (int)startscan; y-- )
 		{
-		    extern void _XInitImageFuncPtrs( XImage* );
-
-		    dibImage->byte_order = MSBFirst;
-		    dibImage->bitmap_bit_order = MSBFirst;
-		    dibImage->bitmap_unit = 16;
-		    _XInitImageFuncPtrs( dibImage );
-
-		    for (y = yend - 1; (int)y >= (int)startscan; y--)
-		        for (x = 0; x < xend; x++)
-			    XPutPixel( dibImage, x, yend - y + 1, 
-				       XGetPixel( bmpImage, x, y ));
-		    dibImage->data = NULL;
-		    XDestroyImage( dibImage );
+		   *bbits = 0;
+		   for( x = 0; x < xend; x++ ) {
+		   	
+			*bbits |= XGetPixel( bmpImage, x, y)<<(7-(x&7));
+			if ((x&7)==7) {
+			    bbits++;
+			    *bbits=0;
+			}
+		   }
+		   bbits += pad;
 		}
+		break;
+	   case 4:
+	   	pad += ((8 - (info->bmiHeader.biWidth & 7)) / 2) & 3;
+		for( y = yend - 1; (int)y >= (int)startscan; y-- )
+		{
+		   *bbits = 0;
+		   for( x = 0; x < xend; x++ ) {
+		   	
+			*bbits |= XGetPixel( bmpImage, x, y)<<(4*(1-(x&1)));
+			if ((x&1)==1) {
+			    bbits++;
+			    *bbits=0;
+			}
+		   }
+		   bbits += pad;
+		}
+		break;
+	   case 15:
+           case 16:
+	   	pad += (4 - ((info->bmiHeader.biWidth*2) & 3)) & 3;
+		for( y = yend - 1; (int)y >= (int)startscan; y-- )
+		{
+		   *bbits = 0;
+		   for( x = 0; x < xend; x++ ) {
+		   	unsigned long pixel=XGetPixel( bmpImage, x, y);
+			*bbits++ = pixel & 0xff;
+			*bbits++ = (pixel >> 8) & 0xff;
+		   }
+		   bbits += pad;
+		}
+		break;
+	   case 24:
+	   	pad += (4 - ((info->bmiHeader.biWidth*3) & 3)) & 3;
+		for( y = yend - 1; (int)y >= (int)startscan; y-- )
+		{
+		   *bbits = 0;
+		   for( x = 0; x < xend; x++ ) {
+		   	unsigned long pixel=XGetPixel( bmpImage, x, y);
+			*bbits++ = (pixel >>16) & 0xff;
+			*bbits++ = (pixel >> 8) & 0xff;
+			*bbits++ =  pixel       & 0xff;
+		   }
+		   bbits += pad;
+		}
+		break;
+	   default:
+	   	fprintf(stderr,"GetDIBits*: unsupported depth %d\n",
+			info->bmiHeader.biBitCount
+		);
+	   	break;
 	}
 
 	XDestroyImage( bmpImage );
diff --git a/objects/metafile.c b/objects/metafile.c
index e74209f..402e0aa 100644
--- a/objects/metafile.c
+++ b/objects/metafile.c
@@ -728,6 +728,18 @@
        	SelectClipRgn32(hdc, *(ht->objectHandle + *(mr->rdParam)));
 	break;
 
+     case META_DIBCREATEPATTERNBRUSH:
+	/*  *(mr->rdParam) may be BS_PATTERN or BS_DIBPATTERN: but there's no difference */
+        dprintf_metafile(stddeb,"META_DIBCREATEPATTERNBRUSH: %d\n",*(mr->rdParam));
+	s1 = mr->rdSize * 2 - sizeof(METARECORD) - 2;
+	hndl = GlobalAlloc16(GMEM_MOVEABLE, s1);
+	ptr = GlobalLock16(hndl);
+	memcpy(ptr, mr->rdParam + 2, s1);
+	GlobalUnlock16(hndl);
+	MF_AddHandle(ht, nHandles,CreateDIBPatternBrush16(hndl, *(mr->rdParam + 1)));
+	GlobalFree16(hndl);
+	break;
+
 #define META_UNIMP(x) case x: fprintf(stderr,"PlayMetaFileRecord:record type "#x" not implemented.\n");break;
     META_UNIMP(META_SETTEXTCHAREXTRA)
     META_UNIMP(META_SETTEXTJUSTIFICATION)
@@ -738,7 +750,6 @@
     META_UNIMP(META_SETPALENTRIES)
     META_UNIMP(META_RESIZEPALETTE)
     META_UNIMP(META_DIBBITBLT)
-    META_UNIMP(META_DIBCREATEPATTERNBRUSH)
     META_UNIMP(META_EXTFLOODFILL)
     META_UNIMP(META_RESETDC)
     META_UNIMP(META_STARTDOC)
diff --git a/scheduler/thread.c b/scheduler/thread.c
index 16f602c..33907ab 100644
--- a/scheduler/thread.c
+++ b/scheduler/thread.c
@@ -63,8 +63,8 @@
     /* 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->teb.stack_top   = (char *)thdb->stack_base + stack_size - 1;
+    thdb->teb.stack_low   = thdb->stack_base;
     thdb->exit_stack      = thdb->teb.stack_top;
 
     /* Allocate the TEB selector (%fs register) */
diff --git a/win32/code_page.c b/win32/code_page.c
index c9b0f9f..508172b 100644
--- a/win32/code_page.c
+++ b/win32/code_page.c
@@ -5,7 +5,7 @@
  */
 
 #include <stdio.h>
-#include <malloc.h>
+#include <stdlib.h>
 #include "windows.h"
 #include "winerror.h"
 #include "winnls.h"
diff --git a/win32/console.c b/win32/console.c
index 6889b5f..d0b25ae 100644
--- a/win32/console.c
+++ b/win32/console.c
@@ -5,7 +5,7 @@
  */
 
 #include <stdio.h>
-#include <malloc.h>
+#include <stdlib.h>
 #include "windows.h"
 #include "winerror.h"
 #include "wincon.h"
diff --git a/win32/init.c b/win32/init.c
index 6372a41..ddd5799 100644
--- a/win32/init.c
+++ b/win32/init.c
@@ -7,7 +7,7 @@
 #include <string.h>
 #include <stdio.h>
 #include <unistd.h>
-#include <malloc.h>
+#include <stdlib.h>
 #include "windows.h"
 #include "winerror.h"
 #include "handle32.h"
diff --git a/win32/process.c b/win32/process.c
index 7178bf7..54baf23 100644
--- a/win32/process.c
+++ b/win32/process.c
@@ -7,12 +7,14 @@
 #include <stdio.h>
 #include <string.h>
 #include <unistd.h>
+#include <sys/times.h>
 #include "windows.h"
 #include "winerror.h"
 #include "heap.h"
 #include "thread.h"
 #include "handle32.h"
 #include "pe_image.h"
+#include "file.h"
 #include "stddebug.h"
 #include "debug.h"
 
@@ -312,6 +314,7 @@
 	fprintf(stderr,"ResetEvent(%d) stub\n",h);
 	return 0;
 }
+
 /***********************************************************************
  *           WaitForSingleObject    (KERNEL32.561)
  */
@@ -320,6 +323,21 @@
 	fprintf(stderr,"WaitForSingleObject(%d,%ld) stub\n",h,timeout);
 	return 0;
 }
+
+/***********************************************************************
+ *           WaitForSingleObject    (USER32.399)
+ */
+DWORD MsgWaitForMultipleObjects(
+	DWORD nCount,HANDLE32 *pHandles,BOOL32 fWaitAll,DWORD dwMilliseconds,
+	DWORD dwWakeMask
+) {
+	int	i;
+	fprintf(stderr,"MsgWaitForMultipleObjects(%ld,[",nCount);
+	for (i=0;i<nCount;i++)
+		fprintf(stderr,"%ld,",(DWORD)pHandles[i]);
+	fprintf(stderr,"],%d,%ld,0x%08lx)\n",fWaitAll,dwMilliseconds,dwWakeMask);
+	return 0;
+}
 /***********************************************************************
  *           DuplicateHandle    (KERNEL32.78)
  */
@@ -425,3 +443,28 @@
 	);
 	return TRUE;
 }
+
+BOOL32
+ContinueDebugEvent(DWORD pid,DWORD tid,DWORD contstatus) {
+	fprintf(stderr,"ContinueDebugEvent(%ld,%ld,%ld), stub\n",pid,tid,contstatus);
+	return TRUE;
+}
+
+/*********************************************************************
+ *	GetProcessTimes				[KERNEL32.262]
+ *
+ * FIXME: implement this better ...
+ */
+BOOL32
+GetProcessTimes(
+	HANDLE32 hprocess,LPFILETIME lpCreationTime,LPFILETIME lpExitTime,
+	LPFILETIME lpKernelTime, LPFILETIME lpUserTime
+) {
+	struct tms tms;
+
+	times(&tms);
+	DOSFS_UnixTimeToFileTime(tms.tms_utime,lpUserTime,0);
+	DOSFS_UnixTimeToFileTime(tms.tms_stime,lpKernelTime,0);
+	return TRUE;
+}
+
diff --git a/windows/dce.c b/windows/dce.c
index 8452147..d259fe0 100644
--- a/windows/dce.c
+++ b/windows/dce.c
@@ -234,29 +234,31 @@
  * removing from the given region the rectangle of each window offset
  * by a given amount.  The new region is returned, and the original one
  * is destroyed.  Used to implement DCX_CLIPSIBLINGS and
- * DCX_CLIPCHILDREN styles.
+ * DCX_CLIPCHILDREN styles. Now it skips managed windows 
+ * because we have no idea about decoration size anyway.
  */
 static HRGN32 DCE_ClipWindows( WND *pWndStart, WND *pWndEnd,
                                HRGN32 hrgn, int xoffset, int yoffset )
 {
     HRGN32 hrgnNew;
 
-    if (!pWndStart) return hrgn;
-    if (!(hrgnNew = CreateRectRgn32( 0, 0, 0, 0 )))
+    if ( pWndStart == NULL ) return hrgn;
+    if ( (hrgnNew = CreateRectRgn32( 0, 0, 0, 0 )) )
     {
-        DeleteObject32( hrgn );
-        return 0;
-    }
-    for (; pWndStart != pWndEnd; pWndStart = pWndStart->next)
-    {
-        if (!(pWndStart->dwStyle & WS_VISIBLE)) continue;
-        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 );
+	for (; pWndStart != pWndEnd; pWndStart = pWndStart->next)
+	{
+	    if ( !(pWndStart->dwStyle & WS_VISIBLE) ||
+		 (pWndStart->flags & WIN_MANAGED) ) continue;
+	    
+            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 );
+    } else pWndEnd = NULL;
+
     if (pWndStart != pWndEnd)  /* something went wrong */
     {
         DeleteObject32( hrgn );
@@ -281,9 +283,6 @@
     WND *wndPtr = WIN_FindWndPtr( hwnd );
 
       /* Get visible rectangle and create a region with it. 
-       * do we really need to calculate vis rgns for X windows? 
-       * - yes, to clip child windows but we should skip 
-       *   siblings in this case.
        */
 
     if (!wndPtr || !DCE_GetVisRect( wndPtr, !(flags & DCX_WINDOW), &rect ))
diff --git a/windows/defwnd.c b/windows/defwnd.c
index 66b8aae..2083d51 100644
--- a/windows/defwnd.c
+++ b/windows/defwnd.c
@@ -412,7 +412,7 @@
 
     case WM_SETTEXT:
 	DEFWND_SetText( wndPtr, (LPSTR)PTR_SEG_TO_LIN(lParam) );
-	NC_HandleNCPaint( hwnd , (HRGN32)1 );  /* Repaint caption */
+	if( wndPtr->dwStyle & WS_CAPTION ) NC_HandleNCPaint( hwnd , (HRGN32)1 );
         break;
 
     default:
diff --git a/windows/dialog.c b/windows/dialog.c
index ca234ad..f59cbd9 100644
--- a/windows/dialog.c
+++ b/windows/dialog.c
@@ -1565,11 +1565,12 @@
  *
  * Helper function for DlgDirList*
  */
-static INT32 DIALOG_DlgDirList( HWND32 hDlg, LPCSTR spec, INT32 idLBox,
+static INT32 DIALOG_DlgDirList( HWND32 hDlg, LPSTR spec, INT32 idLBox,
                                 INT32 idStatic, UINT32 attrib, BOOL32 combo )
 {
     int drive;
     HWND32 hwnd;
+    LPSTR orig_spec = spec;
 
 #define SENDMSG(msg,wparam,lparam) \
     ((attrib & DDL_POSTMSGS) ? PostMessage32A( hwnd, msg, wparam, lparam ) \
@@ -1586,41 +1587,42 @@
     }
     else drive = DRIVE_GetCurrentDrive();
 
+    /* If the path exists and is a directory, chdir to it */
+    if (!spec || !spec[0] || DRIVE_Chdir( drive, spec )) spec = "*.*";
+    else
+    {
+        char *p, *p2;
+        p = spec;
+        if ((p2 = strrchr( p, '\\' ))) p = p2;
+        if ((p2 = strrchr( p, '/' ))) p = p2;
+        if (p != spec)
+        {
+            char sep = *p;
+            *p = 0;
+            if (!DRIVE_Chdir( drive, spec ))
+            {
+                *p = sep;  /* Restore the original spec */
+                return FALSE;
+            }
+            spec = p + 1;
+        }
+    }
+
+    dprintf_dialog( stddeb, "ListBoxDirectory: path=%c:\\%s mask=%s\n",
+                    'A' + drive, DRIVE_GetDosCwd(drive), spec );
+
     if (idLBox && ((hwnd = GetDlgItem32( hDlg, idLBox )) != 0))
     {
-        /* If the path exists and is a directory, chdir to it */
-        if (!spec || !spec[0] || DRIVE_Chdir( drive, spec )) spec = "*.*";
-        else
-        {
-            const char *p, *p2;
-            p = spec;
-            if ((p2 = strrchr( p, '\\' ))) p = p2 + 1;
-            if ((p2 = strrchr( p, '/' ))) p = p2 + 1;
-            if (p != spec)
-            {
-                BOOL32 ret = FALSE;
-                char *dir = HeapAlloc( SystemHeap, 0, p - spec );
-                if (dir)
-                {
-                    lstrcpyn32A( dir, spec, p - spec );
-                    ret = DRIVE_Chdir( drive, dir );
-                    HeapFree( SystemHeap, 0, dir );
-                }
-                if (!ret) return FALSE;
-                spec = p;
-            }
-        }
-        
-        dprintf_dialog( stddeb, "ListBoxDirectory: path=%c:\\%s mask=%s\n",
-                        'A' + drive, DRIVE_GetDosCwd(drive), spec );
-        
         SENDMSG( combo ? CB_RESETCONTENT32 : LB_RESETCONTENT32, 0, 0 );
-        if ((attrib & DDL_DIRECTORY) && !(attrib & DDL_EXCLUSIVE))
+        if (attrib & DDL_DIRECTORY)
         {
-            if (SENDMSG( combo ? CB_DIR32 : LB_DIR32,
-                         attrib & ~(DDL_DIRECTORY | DDL_DRIVES),
-                         (LPARAM)spec ) == LB_ERR)
-                return FALSE;
+            if (!(attrib & DDL_EXCLUSIVE))
+            {
+                if (SENDMSG( combo ? CB_DIR32 : LB_DIR32,
+                             attrib & ~(DDL_DIRECTORY | DDL_DRIVES),
+                             (LPARAM)spec ) == LB_ERR)
+                    return FALSE;
+            }
             if (SENDMSG( combo ? CB_DIR32 : LB_DIR32,
                        (attrib & (DDL_DIRECTORY | DDL_DRIVES)) | DDL_EXCLUSIVE,
                          (LPARAM)"*.*" ) == LB_ERR)
@@ -1645,12 +1647,41 @@
         /* Can't use PostMessage() here, because the string is on the stack */
         SetDlgItemText32A( hDlg, idStatic, temp );
     }
+
+    if (orig_spec && (spec != orig_spec))
+    {
+        /* Update the original file spec */
+        char *p = spec;
+        while ((*orig_spec++ = *p++));
+    }
+
     return TRUE;
 #undef SENDMSG
 }
 
 
 /**********************************************************************
+ *	    DIALOG_DlgDirListW
+ *
+ * Helper function for DlgDirList*32W
+ */
+static INT32 DIALOG_DlgDirListW( HWND32 hDlg, LPWSTR spec, INT32 idLBox,
+                                 INT32 idStatic, UINT32 attrib, BOOL32 combo )
+{
+    if (spec)
+    {
+        LPSTR specA = HEAP_strdupWtoA( GetProcessHeap(), 0, spec );
+        INT32 ret = DIALOG_DlgDirList( hDlg, specA, idLBox, idStatic,
+                                       attrib, combo );
+        lstrcpyAtoW( spec, specA );
+        HeapFree( GetProcessHeap(), 0, specA );
+        return ret;
+    }
+    return DIALOG_DlgDirList( hDlg, NULL, idLBox, idStatic, attrib, combo );
+}
+
+
+/**********************************************************************
  *	    DlgDirSelect    (USER.99)
  */
 BOOL16 DlgDirSelect( HWND16 hwnd, LPSTR str, INT16 id )
@@ -1725,7 +1756,7 @@
 /**********************************************************************
  *	    DlgDirList16    (USER.100)
  */
-INT16 DlgDirList16( HWND16 hDlg, LPCSTR spec, INT16 idLBox, INT16 idStatic,
+INT16 DlgDirList16( HWND16 hDlg, LPSTR spec, INT16 idLBox, INT16 idStatic,
                     UINT16 attrib )
 {
     return DIALOG_DlgDirList( hDlg, spec, idLBox, idStatic, attrib, FALSE );
@@ -1735,7 +1766,7 @@
 /**********************************************************************
  *	    DlgDirList32A    (USER32.142)
  */
-INT32 DlgDirList32A( HWND32 hDlg, LPCSTR spec, INT32 idLBox, INT32 idStatic,
+INT32 DlgDirList32A( HWND32 hDlg, LPSTR spec, INT32 idLBox, INT32 idStatic,
                      UINT32 attrib )
 {
     return DIALOG_DlgDirList( hDlg, spec, idLBox, idStatic, attrib, FALSE );
@@ -1745,21 +1776,17 @@
 /**********************************************************************
  *	    DlgDirList32W    (USER32.145)
  */
-INT32 DlgDirList32W( HWND32 hDlg, LPCWSTR spec, INT32 idLBox, INT32 idStatic,
+INT32 DlgDirList32W( HWND32 hDlg, LPWSTR spec, INT32 idLBox, INT32 idStatic,
                      UINT32 attrib )
 {
-    INT32 ret;
-    LPSTR specA = HEAP_strdupWtoA( GetProcessHeap(), 0, spec );
-    ret = DIALOG_DlgDirList( hDlg, specA, idLBox, idStatic, attrib, FALSE );
-    HeapFree( GetProcessHeap(), 0, specA );
-    return ret;
+    return DIALOG_DlgDirListW( hDlg, spec, idLBox, idStatic, attrib, FALSE );
 }
 
 
 /**********************************************************************
  *	    DlgDirListComboBox16    (USER.195)
  */
-INT16 DlgDirListComboBox16( HWND16 hDlg, LPCSTR spec, INT16 idCBox,
+INT16 DlgDirListComboBox16( HWND16 hDlg, LPSTR spec, INT16 idCBox,
                             INT16 idStatic, UINT16 attrib )
 {
     return DIALOG_DlgDirList( hDlg, spec, idCBox, idStatic, attrib, TRUE );
@@ -1769,7 +1796,7 @@
 /**********************************************************************
  *	    DlgDirListComboBox32A    (USER32.143)
  */
-INT32 DlgDirListComboBox32A( HWND32 hDlg, LPCSTR spec, INT32 idCBox,
+INT32 DlgDirListComboBox32A( HWND32 hDlg, LPSTR spec, INT32 idCBox,
                              INT32 idStatic, UINT32 attrib )
 {
     return DIALOG_DlgDirList( hDlg, spec, idCBox, idStatic, attrib, TRUE );
@@ -1779,12 +1806,8 @@
 /**********************************************************************
  *	    DlgDirListComboBox32W    (USER32.144)
  */
-INT32 DlgDirListComboBox32W( HWND32 hDlg, LPCWSTR spec, INT32 idCBox,
+INT32 DlgDirListComboBox32W( HWND32 hDlg, LPWSTR spec, INT32 idCBox,
                              INT32 idStatic, UINT32 attrib )
 {
-    INT32 ret;
-    LPSTR specA = HEAP_strdupWtoA( GetProcessHeap(), 0, spec );
-    ret = DIALOG_DlgDirList( hDlg, specA, idCBox, idStatic, attrib, FALSE );
-    HeapFree( GetProcessHeap(), 0, specA );
-    return ret;
+    return DIALOG_DlgDirListW( hDlg, spec, idCBox, idStatic, attrib, TRUE );
 }
diff --git a/windows/event.c b/windows/event.c
index 86c3129..fa01908 100644
--- a/windows/event.c
+++ b/windows/event.c
@@ -82,11 +82,11 @@
 
   /* Event handlers */
 static void EVENT_Key( XKeyEvent *event );
-static void EVENT_ButtonPress( XButtonEvent *event );
-static void EVENT_ButtonRelease( XButtonEvent *event );
-static void EVENT_MotionNotify( XMotionEvent *event );
-static void EVENT_FocusIn( HWND32 hwnd, XFocusChangeEvent *event );
-static void EVENT_FocusOut( HWND32 hwnd, XFocusChangeEvent *event );
+static void EVENT_ButtonPress( WND *pWnd, XButtonEvent *event );
+static void EVENT_ButtonRelease( WND *pWnd, XButtonEvent *event );
+static void EVENT_MotionNotify( WND *pWnd, XMotionEvent *event );
+static void EVENT_FocusIn( WND *pWnd, XFocusChangeEvent *event );
+static void EVENT_FocusOut( WND *pWnd, XFocusChangeEvent *event );
 static void EVENT_Expose( WND *pWnd, XExposeEvent *event );
 static void EVENT_GraphicsExpose( WND *pWnd, XGraphicsExposeEvent *event );
 static void EVENT_ConfigureNotify( HWND32 hwnd, XConfigureEvent *event );
@@ -129,12 +129,12 @@
 	
     case ButtonPress:
         if (InputEnabled)
-            EVENT_ButtonPress( (XButtonEvent*)event );
+            EVENT_ButtonPress( pWnd, (XButtonEvent*)event );
 	break;
 
     case ButtonRelease:
         if (InputEnabled)
-            EVENT_ButtonRelease( (XButtonEvent*)event );
+            EVENT_ButtonRelease( pWnd, (XButtonEvent*)event );
 	break;
 
     case MotionNotify:
@@ -150,16 +150,16 @@
 	{
             while (XCheckTypedWindowEvent(display,((XAnyEvent *)event)->window,
                                           MotionNotify, event));    
-            EVENT_MotionNotify( (XMotionEvent*)event );
+            EVENT_MotionNotify( pWnd, (XMotionEvent*)event );
 	}
 	break;
 
     case FocusIn:
-        EVENT_FocusIn( pWnd->hwndSelf, (XFocusChangeEvent*)event );
+        EVENT_FocusIn( pWnd, (XFocusChangeEvent*)event );
 	break;
 
     case FocusOut:
-	EVENT_FocusOut( pWnd->hwndSelf, (XFocusChangeEvent*)event );
+	EVENT_FocusOut( pWnd, (XFocusChangeEvent*)event );
 	break;
 
     case Expose:
@@ -380,6 +380,108 @@
     }    
 }
 
+/***********************************************************************
+ *           EVENT_QueryZOrder
+ *
+ * Try to synchronize internal z-order with the window manager's.
+ */
+static BOOL32 __check_query_condition( WND** pWndA, WND** pWndB )
+{
+    /* return TRUE if we have at least two managed windows */
+
+    for( *pWndB = NULL; *pWndA; *pWndA = (*pWndA)->next )
+        if( (*pWndA)->flags & WIN_MANAGED &&
+            (*pWndA)->dwStyle & WS_VISIBLE ) break;
+    if( *pWndA )
+        for( *pWndB = (*pWndA)->next; *pWndB; *pWndB = (*pWndB)->next )
+            if( (*pWndB)->flags & WIN_MANAGED &&
+                (*pWndB)->dwStyle & WS_VISIBLE ) break;
+     return ((*pWndB) != NULL);
+}
+
+static Window __get_common_ancestor( Window A, Window B,
+                                     Window** children, unsigned* total )
+{
+    /* find the real root window */
+
+    Window      root, *childrenB;
+    unsigned    totalB;
+
+    do
+    {
+        if( *children ) XFree( *children );
+        XQueryTree( display, A, &root, &A, children, total );
+        XQueryTree( display, B, &root, &B, &childrenB, &totalB );
+        if( childrenB ) XFree( childrenB );
+    } while( A != B && A && B );
+    return ( A && B ) ? A : 0 ;
+}
+
+static Window __get_top_decoration( Window w, Window ancestor )
+{
+    Window*     children, root, prev = w, parent = w;
+    unsigned    total;
+
+    do
+    {
+        w = parent;
+        XQueryTree( display, w, &root, &parent, &children, &total );
+        if( children ) XFree( children );
+    } while( parent && parent != ancestor );
+    dprintf_event( stddeb, "\t%08x -> %08x\n", (unsigned)prev, (unsigned)w );
+    return ( parent ) ? w : 0 ;
+}
+
+static unsigned __td_lookup( Window w, Window* list, unsigned max )
+{
+    unsigned    i;
+    for( i = 0; i < max; i++ ) if( list[i] == w ) break;
+    return i;
+}
+
+static BOOL32 EVENT_QueryZOrder( WND* pWndCheck )
+{
+    BOOL32      bRet = FALSE;
+    HWND32      hwndInsertAfter = HWND_TOP;
+    WND*        pWnd, *pWndZ = WIN_GetDesktop()->child;
+    Window      w, parent, *children = NULL;
+    unsigned    total, check, pos, best;
+
+    if( !__check_query_condition(&pWndZ, &pWnd) ) return TRUE;
+
+    parent = __get_common_ancestor( pWndZ->window, pWnd->window,
+                                      &children, &total );
+    if( parent )
+    {
+        w = __get_top_decoration( pWndCheck->window, parent );
+        if( w != children[total - 1] )
+        {
+            check = __td_lookup( w, children, total );
+            best = total;
+            for( pWnd = pWndZ; pWnd; pWnd = pWnd->next )
+            {
+                if( pWnd != pWndCheck )
+                {
+                    if( !(pWnd->flags & WIN_MANAGED) ||
+                        !(w = __get_top_decoration( pWnd->window, parent )) )
+                        continue;
+                    pos = __td_lookup( w, children, total );
+                    if( pos < best && pos > check )
+                    {
+                        best = pos;
+                        hwndInsertAfter = pWnd->hwndSelf;
+                    }
+                    if( check - best == 1 ) break;
+                }
+            }
+            WIN_UnlinkWindow( pWndCheck->hwndSelf );
+            WIN_LinkWindow( pWndCheck->hwndSelf, hwndInsertAfter);
+        }
+    }
+    if( children ) XFree( children );
+    return bRet;
+}
+
 
 /***********************************************************************
  *           EVENT_XStateToKeyState
@@ -455,11 +557,11 @@
 /***********************************************************************
  *           EVENT_MotionNotify
  */
-static void EVENT_MotionNotify( XMotionEvent *event )
+static void EVENT_MotionNotify( WND *pWnd, XMotionEvent *event )
 {
     hardware_event( WM_MOUSEMOVE, EVENT_XStateToKeyState( event->state ), 0L,
 		    event->x_root - desktopX, event->y_root - desktopY,
-		    event->time - MSG_WineStartTicks, 0 );
+		    event->time - MSG_WineStartTicks, (DWORD)pWnd->hwndSelf );
 }
 
 
@@ -486,7 +588,7 @@
 /***********************************************************************
  *           EVENT_ButtonPress
  */
-static void EVENT_ButtonPress( XButtonEvent *event )
+static void EVENT_ButtonPress( WND *pWnd, XButtonEvent *event )
 {
     static WORD messages[NB_BUTTONS] = 
         { WM_LBUTTONDOWN, WM_MBUTTONDOWN, WM_RBUTTONDOWN };
@@ -499,14 +601,14 @@
     hardware_event( messages[buttonNum],
 		    EVENT_XStateToKeyState( event->state ), 0L,
 		    event->x_root - desktopX, event->y_root - desktopY,
-		    event->time - MSG_WineStartTicks, 0 );
+		    event->time - MSG_WineStartTicks, (DWORD)pWnd->hwndSelf );
 }
 
 
 /***********************************************************************
  *           EVENT_ButtonRelease
  */
-static void EVENT_ButtonRelease( XButtonEvent *event )
+static void EVENT_ButtonRelease( WND *pWnd, XButtonEvent *event )
 {
     static const WORD messages[NB_BUTTONS] = 
         { WM_LBUTTONUP, WM_MBUTTONUP, WM_RBUTTONUP };
@@ -518,19 +620,26 @@
     hardware_event( messages[buttonNum],
 		    EVENT_XStateToKeyState( event->state ), 0L,
 		    event->x_root - desktopX, event->y_root - desktopY,
-		    event->time - MSG_WineStartTicks, 0 );
+		    event->time - MSG_WineStartTicks, (DWORD)pWnd->hwndSelf );
 }
 
 
 /**********************************************************************
  *              EVENT_FocusIn
  */
-static void EVENT_FocusIn( HWND32 hwnd, XFocusChangeEvent *event )
+static void EVENT_FocusIn( WND *pWnd, XFocusChangeEvent *event )
 {
-    if (event->detail == NotifyPointer) return;
-    if (hwnd != GetActiveWindow32()) WINPOS_ChangeActiveWindow( hwnd, FALSE );
-    if ((hwnd != GetFocus32()) && !IsChild32( hwnd, GetFocus32()))
-        SetFocus32( hwnd );
+    if (Options.managed) EVENT_QueryZOrder( pWnd );
+
+    if (event->detail != NotifyPointer)
+    { 
+	HWND32	hwnd = pWnd->hwndSelf;
+
+	if (hwnd != GetActiveWindow32()) 
+	    WINPOS_ChangeActiveWindow( hwnd, FALSE );
+	if ((hwnd != GetFocus32()) && !IsChild32( hwnd, GetFocus32()))
+            SetFocus32( hwnd );
+    }
 }
 
 
@@ -539,12 +648,17 @@
  *
  * Note: only top-level override-redirect windows get FocusOut events.
  */
-static void EVENT_FocusOut( HWND32 hwnd, XFocusChangeEvent *event )
+static void EVENT_FocusOut( WND *pWnd, XFocusChangeEvent *event )
 {
-    if (event->detail == NotifyPointer) return;
-    if (hwnd == GetActiveWindow32()) WINPOS_ChangeActiveWindow( 0, FALSE );
-    if ((hwnd == GetFocus32()) || IsChild32( hwnd, GetFocus32()))
-        SetFocus32( 0 );
+    if (event->detail != NotifyPointer)
+    {
+	HWND32	hwnd = pWnd->hwndSelf;
+
+	if (hwnd == GetActiveWindow32()) 
+	    WINPOS_ChangeActiveWindow( 0, FALSE );
+	if ((hwnd == GetFocus32()) || IsChild32( hwnd, GetFocus32()))
+	    SetFocus32( 0 );
+    }
 }
 
 /**********************************************************************
@@ -582,16 +696,14 @@
     }
     else
     {
-        WND *wndPtr;
+        WND *wndPtr = WIN_FindWndPtr( hwnd );
 	WINDOWPOS16 *winpos;
 	RECT16 newWindowRect, newClientRect;
 	HRGN32 hrgnOldPos, hrgnNewPos;
+	Window above = event->above;
 
-	if (!(wndPtr = WIN_FindWndPtr( hwnd )) ||
-	    !(wndPtr->flags & WIN_MANAGED) )
-	    return;
-	
-        if (!(winpos = SEGPTR_NEW(WINDOWPOS16))) return;
+	if (!wndPtr || !(wndPtr->flags & WIN_MANAGED) ||
+            !(winpos = SEGPTR_NEW(WINDOWPOS16))) return;
 
 	/* Fill WINDOWPOS struct */
 	winpos->flags = SWP_NOACTIVATE | SWP_NOZORDER;
@@ -630,12 +742,17 @@
 	wndPtr->rectWindow = newWindowRect;
 	wndPtr->rectClient = newClientRect;
 	SendMessage16( hwnd, WM_WINDOWPOSCHANGED, 0, (LPARAM)SEGPTR_GET(winpos));
+
         SEGPTR_FREE(winpos);
 
-        /* full window drag leaves unrepainted garbage without this */
-        PAINT_RedrawWindow( 0, NULL, hrgnOldPos, RDW_INVALIDATE |
-                            RDW_ALLCHILDREN | RDW_ERASE | RDW_ERASENOW,
-                            RDW_C_USEHRGN );
+	if( IsWindow32( hwnd ) )
+	    if( above == None )			/* absolute bottom */
+	    {
+        	WIN_UnlinkWindow( hwnd );
+        	WIN_LinkWindow( hwnd, HWND_BOTTOM);
+	    }
+	    else EVENT_QueryZOrder( wndPtr );	/* try to outsmart window manager */
+
         DeleteObject32(hrgnOldPos);
         DeleteObject32(hrgnNewPos);
     }
diff --git a/windows/mdi.c b/windows/mdi.c
index d8bb5a3..e08e08d 100644
--- a/windows/mdi.c
+++ b/windows/mdi.c
@@ -609,7 +609,7 @@
  *
  *  iTotal returns number of children available for tiling or cascading
  */
-static MDIWCL* MDI_BuildWCL(WND* clientWnd, INT16* iTotal)
+static MDIWCL* MDI_BuildWCL(WND* clientWnd, UINT16* iTotal)
 {
     MDIWCL *listTop,*listNext;
     WND    *childWnd;
@@ -693,9 +693,10 @@
  */
 static LONG MDICascade(WND* clientWnd, MDICLIENTINFO *ci)
 {
-    MDIWCL	 *listTop,*listPrev;
-    INT16	  delta = 0,iToPosition = 0, n = 0;
-    POINT16       pos[2];
+	MDIWCL	*listTop,*listPrev;
+	INT16	delta = 0, n = 0;
+	UINT16	iToPosition = 0;
+	POINT16	pos[2];
   
     if (ci->hwndChildMaximized)
         ShowWindow16( ci->hwndChildMaximized, SW_NORMAL);
@@ -744,7 +745,7 @@
     int		  rows, columns;
     int           r, c;
     int           i;
-    INT16	  iToPosition = 0;
+    UINT16	  iToPosition = 0;
 
     if (ci->hwndChildMaximized)
 	ShowWindow16(ci->hwndChildMaximized, SW_NORMAL);
diff --git a/windows/message.c b/windows/message.c
index 38deb9e..751212c 100644
--- a/windows/message.c
+++ b/windows/message.c
@@ -23,6 +23,7 @@
 #include "dde.h"
 #include "queue.h"
 #include "winproc.h"
+#include "options.h"
 #include "stddebug.h"
 /* #define DEBUG_MSG */
 #include "debug.h"
@@ -59,8 +60,8 @@
  * to the user, left in the queue, or skipped entirely (in this case
  * HIWORD contains hit test code).
  */
-static DWORD MSG_TranslateMouseMsg( HWND16 hWndScope, DWORD filter, 
-				    MSG16 *msg, BOOL32 remove )
+static DWORD MSG_TranslateMouseMsg( HWND16 hTopWnd, DWORD filter, 
+				    MSG16 *msg, BOOL32 remove, WND* pWndScope )
 {
     static DWORD   dblclk_time_limit = 0;
     static UINT16     clk_message = 0;
@@ -86,10 +87,10 @@
     hWnd = GetCapture16();
     if( !hWnd )
     {
-	sendSC = 1;
-	ht = hittest = WINPOS_WindowFromPoint( WIN_GetDesktop(), msg->pt, &pWnd );
+	ht = hittest = WINPOS_WindowFromPoint( pWndScope, msg->pt, &pWnd );
 	if( !pWnd ) pWnd = WIN_GetDesktop();
 	hWnd = pWnd->hwndSelf;
+	sendSC = 1;
     } 
     else 
     {
@@ -111,8 +112,8 @@
 
 	/* check if hWnd is within hWndScope */
 
-    if( hWndScope && hWnd != hWndScope )
-	if( !IsChild16(hWndScope, hWnd) ) return SYSQ_MSG_CONTINUE;
+    if( hTopWnd && hWnd != hTopWnd )
+	if( !IsChild16(hTopWnd, hWnd) ) return SYSQ_MSG_CONTINUE;
 
     if( mouseClick )
     {
@@ -229,7 +230,7 @@
  *
  * Translate an keyboard hardware event into a real message.
  */
-static DWORD MSG_TranslateKbdMsg( HWND16 hWndScope, DWORD filter,
+static DWORD MSG_TranslateKbdMsg( HWND16 hTopWnd, DWORD filter,
 				  MSG16 *msg, BOOL32 remove )
 {
     WORD message = msg->message;
@@ -260,8 +261,8 @@
         return SYSQ_MSG_ABANDON;
     }
 
-    if (hWndScope && hWnd != hWndScope)
-	if (!IsChild16(hWndScope, hWnd)) return SYSQ_MSG_CONTINUE;
+    if (hTopWnd && hWnd != hTopWnd)
+	if (!IsChild16(hTopWnd, hWnd)) return SYSQ_MSG_CONTINUE;
     if (!MSG_CheckFilter(message, filter)) return SYSQ_MSG_CONTINUE;
 
     msg->hwnd = hWnd;
@@ -424,7 +425,11 @@
 
         if ((msg->message >= WM_MOUSEFIRST) && (msg->message <= WM_MOUSELAST))
         {
-            status = MSG_TranslateMouseMsg(hwnd, filter, msg, remove);
+	    HWND32 hWndScope = (HWND32)sysMsgQueue->messages[pos].extraInfo;
+
+	    status = MSG_TranslateMouseMsg(hwnd, filter, msg, remove, 
+					  (Options.managed && IsWindow32(hWndScope) ) 
+					   ? WIN_FindWndPtr(hWndScope) : WIN_GetDesktop() );
 	    kbd_msg = 0;
         }
         else if ((msg->message >= WM_KEYFIRST) && (msg->message <= WM_KEYLAST))
diff --git a/windows/nonclient.c b/windows/nonclient.c
index 085b817..e0c6412 100644
--- a/windows/nonclient.c
+++ b/windows/nonclient.c
@@ -121,7 +121,7 @@
 
     if (!(style & (WS_POPUP | WS_CHILD)))  /* Overlapped window */
 	style |= WS_CAPTION;
-    style &= (WS_DLGFRAME | WS_BORDER | WS_THICKFRAME);
+    style &= (WS_DLGFRAME | WS_BORDER | WS_THICKFRAME | WS_CHILD);
     exStyle &= WS_EX_DLGMODALFRAME;
     if (exStyle & WS_EX_DLGMODALFRAME) style &= ~WS_THICKFRAME;
 
@@ -277,8 +277,7 @@
     rect->right  = wndPtr->rectWindow.right - wndPtr->rectWindow.left;
     rect->bottom = wndPtr->rectWindow.bottom - wndPtr->rectWindow.top;
 
-    if (wndPtr->dwStyle & WS_ICONIC) return;  /* No border to remove */
-    if (wndPtr->flags & WIN_MANAGED) return;
+    if ((wndPtr->dwStyle & WS_ICONIC) || (wndPtr->flags & WIN_MANAGED)) return;
 
       /* Remove frame from rectangle */
     if (HAS_DLGFRAME( wndPtr->dwStyle, wndPtr->dwExStyle ))
diff --git a/windows/user.c b/windows/user.c
index a5c6ce8..b20670f 100644
--- a/windows/user.c
+++ b/windows/user.c
@@ -22,6 +22,7 @@
 WORD USER_HeapSel = 0;
 
 extern BOOL32 MENU_SwitchTPWndTo(HTASK16);
+extern void QUEUE_FlushMessages(HQUEUE16);
 
 /***********************************************************************
  *           GetFreeSystemResources   (USER.284)
diff --git a/windows/winpos.c b/windows/winpos.c
index 97bbb24..d588de4 100644
--- a/windows/winpos.c
+++ b/windows/winpos.c
@@ -281,12 +281,12 @@
 {
     WND *wndPtr;
     INT16 hittest = HTERROR;
-    INT16 x, y;
+    POINT16 xy = pt;
 
     *ppWnd = NULL;
-    x = pt.x;
-    y = pt.y;
     wndPtr = wndScope->child;
+    MapWindowPoints16( GetDesktopWindow16(), wndScope->hwndSelf, &xy, 1 );
+
     for (;;)
     {
         while (wndPtr)
@@ -298,10 +298,10 @@
             if ((wndPtr->dwStyle & WS_VISIBLE) &&
                 (!(wndPtr->dwStyle & WS_DISABLED) ||
                  ((wndPtr->dwStyle & (WS_POPUP | WS_CHILD)) != WS_CHILD)) &&
-                (x >= wndPtr->rectWindow.left) &&
-                (x < wndPtr->rectWindow.right) &&
-                (y >= wndPtr->rectWindow.top) &&
-                (y < wndPtr->rectWindow.bottom))
+                (xy.x >= wndPtr->rectWindow.left) &&
+                (xy.x < wndPtr->rectWindow.right) &&
+                (xy.y >= wndPtr->rectWindow.top) &&
+                (xy.y < wndPtr->rectWindow.bottom))
             {
                 *ppWnd = wndPtr;  /* Got a suitable window */
 
@@ -310,45 +310,35 @@
                 if (wndPtr->dwStyle & WS_DISABLED) return HTERROR;
 
                 /* If point is not in client area, ignore the children */
-                if ((x < wndPtr->rectClient.left) ||
-                    (x >= wndPtr->rectClient.right) ||
-                    (y < wndPtr->rectClient.top) ||
-                    (y >= wndPtr->rectClient.bottom)) break;
+                if ((xy.x < wndPtr->rectClient.left) ||
+                    (xy.x >= wndPtr->rectClient.right) ||
+                    (xy.y < wndPtr->rectClient.top) ||
+                    (xy.y >= wndPtr->rectClient.bottom)) break;
 
-                x -= wndPtr->rectClient.left;
-                y -= wndPtr->rectClient.top;
+                xy.x -= wndPtr->rectClient.left;
+                xy.y -= wndPtr->rectClient.top;
                 wndPtr = wndPtr->child;
             }
             else wndPtr = wndPtr->next;
         }
 
-        /* If nothing found, return the scope window */
-        if (!*ppWnd)
-        {
-            *ppWnd = wndScope;
-            if( pt.x >= (wndScope->rectClient.left - wndScope->rectWindow.left) &&
-                pt.x >= (wndScope->rectClient.top - wndScope->rectWindow.top ) &&
-                pt.x <= (wndScope->rectClient.right - wndScope->rectWindow.left) &&
-                pt.x <= (wndScope->rectClient.bottom - wndScope->rectWindow.top ) )
-                return HTCLIENT;
-	    if( pt.x < 0 || pt.y < 0 || 
-		pt.x > (wndScope->rectWindow.right - wndScope->rectWindow.left) ||
-		pt.y > (wndScope->rectWindow.bottom - wndScope->rectWindow.top ) )
-		return HTNOWHERE;
-	    return HTCAPTION;	/* doesn't matter in this case */
-        }
+        /* If nothing found, try the scope window */
+        if (!*ppWnd) *ppWnd = wndScope;
 
         /* Send the WM_NCHITTEST message (only if to the same task) */
-        if ((*ppWnd)->hmemTaskQ != GetTaskQueue(0)) return HTCLIENT;
-        hittest = (INT16)SendMessage16( (*ppWnd)->hwndSelf, WM_NCHITTEST, 0,
-                                    MAKELONG( pt.x, pt.y ) );
-        if (hittest != HTTRANSPARENT) return hittest;  /* Found the window */
+        if ((*ppWnd)->hmemTaskQ == GetTaskQueue(0))
+	{
+            hittest = (INT16)SendMessage16( (*ppWnd)->hwndSelf, WM_NCHITTEST, 
+						 0, MAKELONG( pt.x, pt.y ) );
+	    if (hittest != HTTRANSPARENT) return hittest;  /* Found the window */
+	}
+	else return HTCLIENT;
 
-        /* If no children found in last search, make point relative to parent*/
+        /* If no children found in last search, make point relative to parent */
         if (!wndPtr)
         {
-            x += (*ppWnd)->rectClient.left;
-            y += (*ppWnd)->rectClient.top;
+            xy.x += (*ppWnd)->rectClient.left;
+            xy.y += (*ppWnd)->rectClient.top;
         }
 
         /* Restart the search from the next sibling */
diff --git a/windows/winproc.c b/windows/winproc.c
index 4fbde92..9e7e3b3 100644
--- a/windows/winproc.c
+++ b/windows/winproc.c
@@ -7,7 +7,6 @@
 
 #include <stdio.h>
 #include "windows.h"
-#include "callback.h"
 #include "heap.h"
 #include "selectors.h"
 #include "stackframe.h"
@@ -95,16 +94,20 @@
                                         UINT32 msg, WPARAM32 wParam,
                                         LPARAM lParam );
 
-#ifndef WINELIB
 extern void CallFrom16_long_wwwll(void);
 extern void CallFrom32_stdcall_5(void);
-#else
-static void CallFrom16_long_wwwll(void) {}
-static void CallFrom32_stdcall_5(void) {}
-#endif  /* WINELIB */
 
 static HANDLE32 WinProcHeap;
 
+static LRESULT WINPROC_CallWndProc16( WNDPROC16 proc, HWND16 hwnd, UINT16 msg,
+                                      WPARAM16 wParam, LPARAM lParam );
+static LRESULT WINPROC_CallWndProc32( WNDPROC32 proc, HWND32 hwnd, UINT32 msg,
+                                      WPARAM32 wParam, LPARAM lParam );
+
+static WINPROC_CALLWNDPROC16 WINPROC_CallWndProc16Ptr = WINPROC_CallWndProc16;
+static WINPROC_CALLWNDPROC32 WINPROC_CallWndProc32Ptr = WINPROC_CallWndProc32;
+
+
 /**********************************************************************
  *	     WINPROC_Init
  */
@@ -121,6 +124,48 @@
 
 
 /**********************************************************************
+ *	     WINPROC_CallWndProc16
+ *
+ * Call a 16-bit WndProc.
+ */
+static LRESULT WINPROC_CallWndProc16( WNDPROC16 proc, HWND16 hwnd, UINT16 msg,
+                                      WPARAM16 wParam, LPARAM lParam )
+{
+    return proc( hwnd, msg, wParam, lParam );
+}
+
+
+/**********************************************************************
+ *	     WINPROC_CallWndProc32
+ *
+ * Call a 32-bit WndProc.
+ */
+static LRESULT WINPROC_CallWndProc32( WNDPROC32 proc, HWND32 hwnd, UINT32 msg,
+                                      WPARAM32 wParam, LPARAM lParam )
+{
+    return proc( hwnd, msg, wParam, lParam );
+}
+
+
+/**********************************************************************
+ *	     WINPROC_SetCallWndProc16
+ */
+void WINPROC_SetCallWndProc16( WINPROC_CALLWNDPROC16 proc )
+{
+    WINPROC_CallWndProc16Ptr = proc;
+}
+
+
+/**********************************************************************
+ *	     WINPROC_SetCallWndProc32
+ */
+void WINPROC_SetCallWndProc32( WINPROC_CALLWNDPROC32 proc )
+{
+    WINPROC_CallWndProc32Ptr = proc;
+}
+
+
+/**********************************************************************
  *	     WINPROC_GetPtr
  *
  * Return a pointer to the win proc.
@@ -1676,7 +1721,7 @@
     LRESULT result;
 
     if (WINPROC_MapMsg32ATo32W( msg, wParam, &lParam ) == -1) return 0;
-    result = CallWndProc32( func, hwnd, msg, wParam, lParam );
+    result = WINPROC_CallWndProc32Ptr( func, hwnd, msg, wParam, lParam );
     WINPROC_UnmapMsg32ATo32W( msg, wParam, lParam );
     return result;
 }
@@ -1694,7 +1739,7 @@
     LRESULT result;
 
     if (WINPROC_MapMsg32WTo32A( msg, wParam, &lParam ) == -1) return 0;
-    result = CallWndProc32( func, hwnd, msg, wParam, lParam );
+    result = WINPROC_CallWndProc32Ptr( func, hwnd, msg, wParam, lParam );
     WINPROC_UnmapMsg32WTo32A( msg, wParam, lParam );
     return result;
 }
@@ -1715,7 +1760,7 @@
 
     if (WINPROC_MapMsg16To32A( msg, wParam, &msg32, &wParam32, &lParam ) == -1)
         return 0;
-    result = CallWndProc32( func, hwnd, msg32, wParam32, lParam );
+    result = WINPROC_CallWndProc32Ptr( func, hwnd, msg32, wParam32, lParam );
     WINPROC_UnmapMsg16To32A( msg32, wParam32, lParam );
     return result;
 }
@@ -1736,7 +1781,7 @@
 
     if (WINPROC_MapMsg16To32W( msg, wParam, &msg32, &wParam32, &lParam ) == -1)
         return 0;
-    result = CallWndProc32( func, hwnd, msg32, wParam32, lParam );
+    result = WINPROC_CallWndProc32Ptr( func, hwnd, msg32, wParam32, lParam );
     WINPROC_UnmapMsg16To32W( msg32, wParam32, lParam );
     return result;
 }
@@ -1761,7 +1806,8 @@
 			      &msg16, &mp16.wParam, &mp16.lParam ) == -1)
         return 0;
     if (wndPtr) CURRENT_DS = wndPtr->hInstance;
-    mp16.lResult = CallWndProc16( func, hwnd, msg16, mp16.wParam, mp16.lParam );
+    mp16.lResult = WINPROC_CallWndProc16Ptr( func, hwnd, msg16,
+                                             mp16.wParam, mp16.lParam );
     CURRENT_DS = ds;
     WINPROC_UnmapMsg32ATo16( msg, wParam, lParam, &mp16 );
     return mp16.lResult;
@@ -1786,7 +1832,8 @@
     if (WINPROC_MapMsg32WTo16( msg, wParam, &msg16, &mp16.wParam, &mp16.lParam ) == -1)
         return 0;
     if (wndPtr) CURRENT_DS = wndPtr->hInstance;
-    mp16.lResult = CallWndProc16( func, hwnd, msg16, mp16.wParam, mp16.lParam );
+    mp16.lResult = WINPROC_CallWndProc16Ptr( func, hwnd, msg16,
+                                             mp16.wParam, mp16.lParam );
     CURRENT_DS = ds;
     WINPROC_UnmapMsg32WTo16( msg, wParam, lParam, &mp16 );
     return mp16.lResult;
@@ -1808,15 +1855,15 @@
     {
         wndPtr = WIN_FindWndPtr( hwnd );
         if (wndPtr) CURRENT_DS = wndPtr->hInstance;
-        result = CallWndProc16( (FARPROC16)func, hwnd, msg, wParam, lParam );
+        result = WINPROC_CallWndProc16Ptr( func, hwnd, msg, wParam, lParam );
         CURRENT_DS = ds;
         return result;
     }
 #if testing
     wndPtr = WIN_FindWndPtr( hwnd );
     if (wndPtr) CURRENT_DS = wndPtr->hInstance;
-    result = CallWndProc16( WINPROC_GetProc( (HWINDOWPROC)proc, WIN_PROC_16),
-                            hwnd, msg, wParam, lParam );
+    result = WINPROC_CallWndProc16Ptr( WINPROC_GetProc( (HWINDOWPROC)proc, WIN_PROC_16),
+                                       hwnd, msg, wParam, lParam );
     CURRENT_DS = ds;
     return result;
 #endif
@@ -1827,25 +1874,8 @@
         if (!proc->thunk.t_from32.proc) return 0;
         wndPtr = WIN_FindWndPtr( hwnd );
         if (wndPtr) CURRENT_DS = wndPtr->hInstance;
-#ifndef WINELIB
-        if ((msg == WM_CREATE) || (msg == WM_NCCREATE))
-        {
-            CREATESTRUCT16 *cs = (CREATESTRUCT16 *)PTR_SEG_TO_LIN(lParam);
-            /* Build the CREATESTRUCT on the 16-bit stack. */
-            /* This is really ugly, but some programs (notably the */
-            /* "Undocumented Windows" examples) want it that way.  */
-            result = CallWndProcNCCREATE16( proc->thunk.t_from32.proc,
-                    cs->dwExStyle, cs->lpszClass, cs->lpszName, cs->style,
-                    cs->x, cs->y, cs->cx, cs->cy, cs->hwndParent, cs->hMenu,
-                    cs->hInstance, (LONG)cs->lpCreateParams, hwnd, msg, wParam,
-                    MAKELONG( IF1632_Saved16_sp-sizeof(CREATESTRUCT16),
-                              IF1632_Saved16_ss ) );
-            CURRENT_DS = ds;
-            return result;
-        }
-#endif
-        result = CallWndProc16( proc->thunk.t_from32.proc,
-                                hwnd, msg, wParam, lParam );
+        result = WINPROC_CallWndProc16Ptr( proc->thunk.t_from32.proc,
+                                           hwnd, msg, wParam, lParam );
         CURRENT_DS = ds;
         return result;
 
@@ -1872,11 +1902,12 @@
 {
     WINDOWPROC *proc = WINPROC_GetPtr( (WNDPROC16)func );
 
-    if (!proc) return CallWndProc32( func, hwnd, msg, wParam, lParam );
+    if (!proc) return WINPROC_CallWndProc32Ptr( func, hwnd, msg,
+                                                wParam, lParam );
 
 #if testing
     func = WINPROC_GetProc( (HWINDOWPROC)proc, WIN_PROC_32A );
-    return CallWndProc32( func, hwnd, msg, wParam, lParam );
+    return WINPROC_CallWndProc32Ptr( func, hwnd, msg, wParam, lParam );
 #endif
 
     switch(proc->type)
@@ -1887,8 +1918,8 @@
                                         hwnd, msg, wParam, lParam );
     case WIN_PROC_32A:
         if (!proc->thunk.t_from16.proc) return 0;
-        return CallWndProc32( proc->thunk.t_from16.proc,
-                              hwnd, msg, wParam, lParam );
+        return WINPROC_CallWndProc32Ptr( proc->thunk.t_from16.proc,
+                                         hwnd, msg, wParam, lParam );
     case WIN_PROC_32W:
         if (!proc->thunk.t_from16.proc) return 0;
         return WINPROC_CallProc32ATo32W( proc->thunk.t_from16.proc,
@@ -1908,11 +1939,12 @@
 {
     WINDOWPROC *proc = WINPROC_GetPtr( (WNDPROC16)func );
 
-    if (!proc) return CallWndProc32( func, hwnd, msg, wParam, lParam );
+    if (!proc) return WINPROC_CallWndProc32Ptr( func, hwnd, msg,
+                                                wParam, lParam );
 
 #if testing
     func = WINPROC_GetProc( (HWINDOWPROC)proc, WIN_PROC_32W );
-    return CallWndProc32( func, hwnd, msg, wParam, lParam );
+    return WINPROC_CallWndProc32Ptr( func, hwnd, msg, wParam, lParam );
 #endif
 
     switch(proc->type)
@@ -1927,8 +1959,8 @@
                                          hwnd, msg, wParam, lParam );
     case WIN_PROC_32W:
         if (!proc->thunk.t_from16.proc) return 0;
-        return CallWndProc32( proc->thunk.t_from16.proc,
-                              hwnd, msg, wParam, lParam );
+        return WINPROC_CallWndProc32Ptr( proc->thunk.t_from16.proc,
+                                         hwnd, msg, wParam, lParam );
     default:
         fprintf( stderr, "CallWindowProc32W: invalid proc %p\n", proc );
         return 0;
