diff --git a/ANNOUNCE b/ANNOUNCE
index a486e16..3b5dff6 100644
--- a/ANNOUNCE
+++ b/ANNOUNCE
@@ -1,14 +1,13 @@
-This is release 951124 of Wine the MS Windows emulator.  This is still a
+This is release 951212 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.
 
 Patches should be submitted to "wine-new@amscons.com".  Please don't forget
 to include a ChangeLog entry.  I'll make a new release every other week.
 
-WHAT'S NEW with Wine-951124: (see ChangeLog for details)
-	- Drag and drop implemented.
-	- Unixware is now fully supported.
-	- Many Win32 improvements.
+WHAT'S NEW with Wine-951212: (see ChangeLog for details)
+	- Many more Winelib and Win32 fixes.
+	- Window management and MDI improvements.
 	- Lots of bug fixes.
 
 See the README file in the distribution for installation instructions.
@@ -17,11 +16,10 @@
 the release is available at the ftp sites.  The sources will be available
 from the following locations:
 
-    sunsite.unc.edu:/pub/Linux/ALPHA/wine/Wine-951124.tar.gz
-    tsx-11.mit.edu:/pub/linux/ALPHA/Wine/development/Wine-951124.tar.gz
-    ftp.infomagic.com:/pub/mirrors/linux/wine/development/Wine-951124.tar.gz
-    ftp.funet.fi:/pub/OS/Linux/ALPHA/Wine/Wine-951124.tar.gz
-    aris.com:/pub/linux/ALPHA/Wine/development/Wine-951124.tar.gz
+    sunsite.unc.edu:/pub/Linux/ALPHA/wine/Wine-951212.tar.gz
+    tsx-11.mit.edu:/pub/linux/ALPHA/Wine/development/Wine-951212.tar.gz
+    ftp.infomagic.com:/pub/mirrors/linux/wine/development/Wine-951212.tar.gz
+    aris.com:/pub/linux/ALPHA/Wine/development/Wine-951212.tar.gz
 
 It should also be available from any site that mirrors tsx-11 or sunsite.
 
diff --git a/ChangeLog b/ChangeLog
index 9fcdf03..efd9fa4 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,4 +1,183 @@
 ----------------------------------------------------------------------
+Mon Dec 11 19:08:55 1995  Alexandre Julliard  <julliard@sunsite.unc.edu>
+
+	* [misc/lstr.c]
+	Replaced wine_strncpy() by a 32-bit version of lstrcpyn(), since
+ 	they do the same job.
+
+	* [tools/build.c]
+	Fixed __attribute__((stdcall)) to make it compile with gcc
+	versions under 2.7. Doesn't mean it will run OK though...
+
+Sat Dec 09 13:22:58 1995  Cameron Heide  <heide@ee.ualberta.ca>
+
+	* [include/kernel32.h] [include/winerror.h]
+	Added file attribute definitions and more error codes.
+
+	* [win32/error.c]
+	Added some rudimentary errno-to-Win32 error conversion
+	code.
+
+	* [win32/file.c]
+	Added to GetFileInformationByHandle, filled in some known
+	error codes, and switched to dprintf_win32.
+
+	* [win32/time.c]
+	Added GetLocalTime.
+
+Fri Dec  8 14:37:39 1995  Jim Peterson <jspeter@birch.ee.vt.edu>
+
+	* [controls/combo.c]
+	Converted functions of the type LONG _(HWND,WORD,LONG) to the type
+	LRESULT _(HWND,WPARAM,LPARAM) where needed.
+
+	* [include/libres.h]
+	Restructured libres prototypes to closer match the windows API.
+
+	* [include/windows.h]
+	Changed several API prototypes' parameter types from 'short' to INT,
+	which is #defined as short in the emulator, but is a normal int in
+	WINELIB32.  Also changed SEGPTR from DWORD to void* when WINELIB32.
+	(This creates a lot of warnings at library-compile time, but less
+	warnings at app-compile time.  I'll remove the warnings soon.)
+
+	* [loader/resource.c]
+	Fixed parameter mismatch in call to LIBRES_FindResource().  Changed
+	various implementations of the LIBRES_* API functions.
+
+	* [loader/signal.c]
+	Deleted local 'i' from win_fault(), since it was unused.
+
+	* [objects/bitblt.c]
+	Mirrored changes to include/windows.h mentioned above.
+
+	* [toolkit/hello3.c]
+	Changed LoadMenuIndirect() call to LoadMenu() to test the new
+	resource registration technique.
+
+	* [toolkit/libres.c]
+	Removed definition of 'struct resource' and fixed bugs in the resource
+	implementation.  Implemented LIBRES_FindResource.
+
+	* [windows/graphics.c]
+	Mirrored changes to include/windows.h mentioned above.
+
+Thu Dec  7 23:15:56 1995     Martin von Loewis <loewis@informatik.hu-berlin.de>
+
+	* [controls/edit.c]
+	LOCAL_HeapExists: Changed parameter to HANDLE. For WineLib, return true
+
+	* [controls/listbox.c]
+	CreateListBoxStruct: Initialize HeapSel to 0 for WineLib
+
+	* [include/listbox.h]
+	change HeapSel from WORD to HANDLE
+
+	* [include/resource.h][rc/winerc.c]
+	struct ResourceTable: removed
+	struct resource: moved to header file
+	autoregister resources if supported by compiler
+
+	* [memory/local.h]
+	LOCAL_GetHeap: expect HANDLE rather than WORD
+	
+	* [toolkit/Makefile.in]
+	Add ALLCFLAGS to make hello3
+
+	* [toolkit/heap.c]
+	LocalFree, HEAP_Free: handle 0 parameter gracefully
+
+Wed Dec 06 15:34:23 1995  Greg Cooper <cooper@ima-inc.com>
+
+	* [misc/winsocket.c]
+	Fixed the msgsnd and msgrcv errors that winsock programs get.
+
+Wed Dec 06 12:47:23 MET 1995 Sven Verdoolaege <skimo@dns.ufsia.ac.be>
+	
+	* [if1632/kernel.spec]
+	Fixed _hread and _hwrite return type
+
+	* [if1632/relay32.c] [loader/pe_image.c]
+	Hacked loading of PE-dll's in
+
+	* [win32/advapi.c]
+	Added stubs for RegCreateKeyEx, RegSetValueEx, RegQueryValueEx
+
+	* [win32/file.c]
+	Added stubs for OpenFileMapping, CreateFileMapping, MapViewOfFileEx
+
+	* [win32/process.c]
+	Added stubs for CreateMutexA, ReleaseMutex, CreateEventA,
+	WaitForSingleObject, DuplicateHandle, GetCurrentProcess
+	
+Mon Dec 04 13:06:37 1995   Bernd Schmidt <crux@pool.informatik.rwth-aachen.de>
+
+	* [include/wine.h] [misc/lstr.c]
+	Define wine_strncpy(). This function does not pad the buffer with 
+	zeroes like GNU strncpy(), which might break some Windows programs
+	that pass bogus size arguments.
+
+	* [loader/module.c]: GetModuleFileName(),
+	[misc/commdlg.c]: GetFileTitle(),
+	[misc/keyboard.c], [misc/lstr.c]: lstrcpyn(),
+	[misc/ole2nls.c], [misc/profile.c], [multimedia/mcistring.c],
+	[multimedia/mmsystem.c], [objects/font.c]:
+	Use wine_strncpy() where strings are returned to Windows programs.
+	
+	* [objects/metafile.c]
+	PlayMetafile(): Clear the handle table before using it.
+
+	* [misc/shell.c] [misc/main.c]
+	Rename SHELL_RegCheckForRoot() to SHELL_Init() and call it from main().
+	
+	* [misc/profile.c]
+	load(): Need to handle comments.
+	
+	* [toolkit/libres.c]
+	Make it compile.
+	
+	* [windows/nonclient.c]
+	Use MAKE_SEGPTR macro in two places where a user heap block used
+	to be allocated instead.
+
+Sat Dec 02 16:43:43 1995 Ramon Garcia <ramon@ie3.clubs.etsit.upm.es>
+
+	* [windows/winpos.c]
+	In function SetWindowPos: do not redraw the parent of
+	a window if the specified window is placed on the top.
+	This avoids that ShowWindow(hwnd,1) hides hwnd instead
+	of showing it.
+
+Sat Dec 02 11:00:00 1995 Alex Korobka <alex@phm30.pharm.sunysb.edu>
+
+	* [windows/scroll.c]
+	Now it can scroll children along with the client region of parent 
+        window. Tried to optimize update region calculation. 
+
+	* [windows/mdi.c]
+	ScrollChildren function, more other features added. Basically
+	a rewrite.
+
+	* [windows/winpos.c] [windows/focus.c]
+	Reimplemented window activation and focus handling.
+
+	* [windows/nonclient.c]
+	Added new flag WIN_NCACTIVATED.
+
+	* [windows/message.c] [loader/task.c]
+	Small changes (to maintain linked list of message queues).
+
+Wed Nov 29 15:51:48 1995  Daniel Schepler  <daniel@shep13.wustl.edu>
+
+	* [include/options.h] [misc/main.c] [windows/defwnd.c]
+	  [windows/event.c] [windows/nonclient.c] [windows/win.c] [Wine.man]
+	Implemented a -managed option to replace the standard Windows
+	frame of top-level windows with the window manager's decorations.
+	If a top-level window makes its own frame, this will still show
+	up, inside the window manager decorations (I believe ctl3dv2.dll
+	would do this, although I can't test this).
+
+----------------------------------------------------------------------
 Tue Nov 21 18:49:10 1995  Alexandre Julliard  <julliard@sunsite.unc.edu>
 
 	* [configure.in] [Makefile] [misc/dos_fs.c]
diff --git a/Wine.man b/Wine.man
index 789a503..f585a53 100644
--- a/Wine.man
+++ b/Wine.man
@@ -67,6 +67,14 @@
 .I -debug
 Enter the debugger before starting application
 .TP
+.I -language xx
+Set the language to
+.I xx
+(one of En, Es, De, No, Fr, Fi, Da)
+.TP
+.I -managed
+Create each top-level window as a properly managed X window
+.TP
 .I -name name
 Set the application name
 .TP
diff --git a/controls/combo.c b/controls/combo.c
index bed192e..e82deaa 100644
--- a/controls/combo.c
+++ b/controls/combo.c
@@ -82,7 +82,7 @@
 /***********************************************************************
  *           CBNCCreate
  */
-static LONG CBNCCreate(HWND hwnd, WORD wParam, LONG lParam)
+static LRESULT CBNCCreate(HWND hwnd, WPARAM wParam, LPARAM lParam)
 {
   CREATESTRUCT *createStruct;
 
@@ -100,7 +100,7 @@
 /***********************************************************************
  *           CBCreate
  */
-static LONG CBCreate(HWND hwnd, WORD wParam, LONG lParam)
+static LRESULT CBCreate(HWND hwnd, WPARAM wParam, LPARAM lParam)
 {
   LPHEADLIST   lphl;
   LPHEADCOMBO  lphc;
@@ -178,7 +178,7 @@
 /***********************************************************************
  *           CBDestroy
  */
-static LONG CBDestroy(HWND hwnd, WORD wParam, LONG lParam)
+static LRESULT CBDestroy(HWND hwnd, WPARAM wParam, LPARAM lParam)
 {
   LPHEADLIST lphl = ComboGetListHeader(hwnd);
 
@@ -191,7 +191,7 @@
 /***********************************************************************
  *           CBPaint
  */
-static LONG CBPaint(HWND hwnd, WORD wParam, LONG lParam)
+static LRESULT CBPaint(HWND hwnd, WPARAM wParam, LPARAM lParam)
 {
   LPHEADLIST lphl = ComboGetListHeader(hwnd);
   LPHEADCOMBO lphc = ComboGetStorageHeader(hwnd);
@@ -255,7 +255,7 @@
 /***********************************************************************
  *           CBGetDlgCode
  */
-static LONG CBGetDlgCode(HWND hwnd, WORD wParam, LONG lParam)
+static LRESULT CBGetDlgCode(HWND hwnd, WPARAM wParam, LPARAM lParam)
 {
   return DLGC_WANTARROWS | DLGC_WANTCHARS;
 }
@@ -263,7 +263,7 @@
 /***********************************************************************
  *           CBLButtonDown
  */
-static LONG CBLButtonDown(HWND hwnd, WORD wParam, LONG lParam)
+static LRESULT CBLButtonDown(HWND hwnd, WPARAM wParam, LPARAM lParam)
 {
   LPHEADCOMBO lphc = ComboGetStorageHeader(hwnd);
   SendMessage(hwnd,CB_SHOWDROPDOWN,!lphc->DropDownVisible,0);
@@ -273,7 +273,7 @@
 /***********************************************************************
  *           CBKeyDown
  */
-static LONG CBKeyDown(HWND hwnd, WORD wParam, LONG lParam)
+static LRESULT CBKeyDown(HWND hwnd, WPARAM wParam, LPARAM lParam)
 {
   LPHEADLIST lphl = ComboGetListHeader(hwnd);
   WORD       newFocused = lphl->ItemFocused;
@@ -312,7 +312,7 @@
 /***********************************************************************
  *           CBChar
  */
-static LONG CBChar(HWND hwnd, WORD wParam, LONG lParam)
+static LRESULT CBChar(HWND hwnd, WPARAM wParam, LPARAM lParam)
 {
   LPHEADLIST lphl = ComboGetListHeader(hwnd);
   WORD       newFocused;
@@ -337,7 +337,7 @@
 /***********************************************************************
  *           CBKillFocus
  */
-static LONG CBKillFocus(HWND hwnd, WORD wParam, LONG lParam)
+static LRESULT CBKillFocus(HWND hwnd, WPARAM wParam, LPARAM lParam)
 {
   return 0;
 }
@@ -345,7 +345,7 @@
 /***********************************************************************
  *           CBSetFocus
  */
-static LONG CBSetFocus(HWND hwnd, WORD wParam, LONG lParam)
+static LRESULT CBSetFocus(HWND hwnd, WPARAM wParam, LPARAM lParam)
 {
   return 0;
 }
@@ -353,7 +353,7 @@
 /***********************************************************************
  *           CBResetContent
  */
-static LONG CBResetContent(HWND hwnd, WORD wParam, LONG lParam)
+static LRESULT CBResetContent(HWND hwnd, WPARAM wParam, LPARAM lParam)
 {
   LPHEADLIST lphl = ComboGetListHeader(hwnd);
   LPHEADCOMBO lphc = ComboGetStorageHeader(hwnd);
@@ -366,7 +366,7 @@
 /***********************************************************************
  *           CBDir
  */
-static LONG CBDir(HWND hwnd, WORD wParam, LONG lParam)
+static LRESULT CBDir(HWND hwnd, WPARAM wParam, LPARAM lParam)
 {
   WORD wRet;
   LPHEADLIST lphl = ComboGetListHeader(hwnd);
@@ -380,7 +380,7 @@
 /***********************************************************************
  *           CBInsertString
  */
-static LONG CBInsertString(HWND hwnd, WORD wParam, LONG lParam)
+static LRESULT CBInsertString(HWND hwnd, WPARAM wParam, LPARAM lParam)
 {
   WORD  wRet;
   LPHEADLIST lphl = ComboGetListHeader(hwnd);
@@ -398,7 +398,7 @@
 /***********************************************************************
  *           CBAddString
  */
-static LONG CBAddString(HWND hwnd, WORD wParam, LONG lParam)
+static LRESULT CBAddString(HWND hwnd, WPARAM wParam, LPARAM lParam)
 {
   WORD  wRet;
   LPHEADLIST lphl = ComboGetListHeader(hwnd);
@@ -416,7 +416,7 @@
 /***********************************************************************
  *           CBDeleteString
  */
-static LONG CBDeleteString(HWND hwnd, WORD wParam, LONG lParam)
+static LRESULT CBDeleteString(HWND hwnd, WPARAM wParam, LPARAM lParam)
 {
   LPHEADLIST lphl = ComboGetListHeader(hwnd);
   LPHEADCOMBO lphc = ComboGetStorageHeader(hwnd);
@@ -429,7 +429,7 @@
 /***********************************************************************
  *           CBSelectString
  */
-static LONG CBSelectString(HWND hwnd, WORD wParam, LONG lParam)
+static LRESULT CBSelectString(HWND hwnd, WPARAM wParam, LPARAM lParam)
 {
   LPHEADLIST lphl = ComboGetListHeader(hwnd);
   WORD  wRet;
@@ -444,7 +444,7 @@
 /***********************************************************************
  *           CBFindString
  */
-static LONG CBFindString(HWND hwnd, WORD wParam, LONG lParam)
+static LRESULT CBFindString(HWND hwnd, WPARAM wParam, LPARAM lParam)
 {
   LPHEADLIST lphl = ComboGetListHeader(hwnd);
   return ListBoxFindString(lphl, wParam, lParam);
@@ -453,7 +453,7 @@
 /***********************************************************************
  *           CBGetCount
  */
-static LONG CBGetCount(HWND hwnd, WORD wParam, LONG lParam)
+static LRESULT CBGetCount(HWND hwnd, WPARAM wParam, LPARAM lParam)
 {
   LPHEADLIST lphl = ComboGetListHeader(hwnd);
   return lphl->ItemsCount;
@@ -462,7 +462,7 @@
 /***********************************************************************
  *           CBSetCurSel
  */
-static LONG CBSetCurSel(HWND hwnd, WORD wParam, LONG lParam)
+static LRESULT CBSetCurSel(HWND hwnd, WPARAM wParam, LPARAM lParam)
 {
   LPHEADLIST lphl = ComboGetListHeader(hwnd);
   WORD  wRet;
@@ -478,7 +478,7 @@
 /***********************************************************************
  *           CBGetCurSel
  */
-static LONG CBGetCurSel(HWND hwnd, WORD wParam, LONG lParam)
+static LRESULT CBGetCurSel(HWND hwnd, WPARAM wParam, LPARAM lParam)
 {
   LPHEADLIST lphl = ComboGetListHeader(hwnd);
   return lphl->ItemFocused;
@@ -487,7 +487,7 @@
 /***********************************************************************
  *           CBGetItemHeight
  */
-static LONG CBGetItemHeight(HWND hwnd, WORD wParam, LONG lParam)
+static LRESULT CBGetItemHeight(HWND hwnd, WPARAM wParam, LPARAM lParam)
 {
   LPHEADLIST lphl = ComboGetListHeader(hwnd);
   LPLISTSTRUCT lpls = ListBoxGetItem (lphl, wParam);
@@ -499,7 +499,7 @@
 /***********************************************************************
  *           CBSetItemHeight
  */
-static LONG CBSetItemHeight(HWND hwnd, WORD wParam, LONG lParam)
+static LRESULT CBSetItemHeight(HWND hwnd, WPARAM wParam, LPARAM lParam)
 {
   LPHEADLIST lphl = ComboGetListHeader(hwnd);
   return ListBoxSetItemHeight(lphl, wParam, lParam);
@@ -508,7 +508,7 @@
 /***********************************************************************
  *           CBSetRedraw
  */
-static LONG CBSetRedraw(HWND hwnd, WORD wParam, LONG lParam)
+static LRESULT CBSetRedraw(HWND hwnd, WPARAM wParam, LPARAM lParam)
 {
   LPHEADLIST lphl = ComboGetListHeader(hwnd);
   lphl->bRedrawFlag = wParam;
@@ -518,7 +518,7 @@
 /***********************************************************************
  *           CBSetFont
  */
-static LONG CBSetFont(HWND hwnd, WPARAM wParam, LPARAM lParam)
+static LRESULT CBSetFont(HWND hwnd, WPARAM wParam, LPARAM lParam)
 {
   LPHEADLIST  lphl = ComboGetListHeader(hwnd);
 
@@ -533,7 +533,7 @@
 /***********************************************************************
  *           CBGetLBTextLen
  */
-static LONG CBGetLBTextLen(HWND hwnd, WORD wParam, LONG lParam)
+static LRESULT CBGetLBTextLen(HWND hwnd, WPARAM wParam, LPARAM lParam)
 {
   LPHEADLIST   lphl = ComboGetListHeader(hwnd);
   LPLISTSTRUCT lpls = ListBoxGetItem(lphl,wParam);
@@ -545,7 +545,7 @@
 /***********************************************************************
  *           CBGetLBText
  */
-static LONG CBGetLBText(HWND hwnd, WORD wParam, LONG lParam)
+static LRESULT CBGetLBText(HWND hwnd, WPARAM wParam, LPARAM lParam)
 {
   LPHEADLIST lphl = ComboGetListHeader(hwnd);
   return ListBoxGetText(lphl, wParam, (LPSTR)PTR_SEG_TO_LIN(lParam));
@@ -554,7 +554,7 @@
 /***********************************************************************
  *           CBGetItemData
  */
-static LONG CBGetItemData(HWND hwnd, WORD wParam, LONG lParam)
+static LRESULT CBGetItemData(HWND hwnd, WPARAM wParam, LPARAM lParam)
 {
   LPHEADLIST lphl = ComboGetListHeader(hwnd);
   return ListBoxGetItemData(lphl, wParam);
@@ -563,7 +563,7 @@
 /***********************************************************************
  *           CBSetItemData
  */
-static LONG CBSetItemData(HWND hwnd, WORD wParam, LONG lParam)
+static LRESULT CBSetItemData(HWND hwnd, WPARAM wParam, LPARAM lParam)
 {
   LPHEADLIST lphl = ComboGetListHeader(hwnd);
   return ListBoxSetItemData(lphl, wParam, lParam);
@@ -572,7 +572,7 @@
 /***********************************************************************
  *           CBShowDropDown
  */
-static LONG CBShowDropDown(HWND hwnd, WORD wParam, LONG lParam)
+static LRESULT CBShowDropDown(HWND hwnd, WPARAM wParam, LPARAM lParam)
 {
   LPHEADCOMBO lphc = ComboGetStorageHeader(hwnd);
   RECT rect;
@@ -650,7 +650,7 @@
 /***********************************************************************
  *           CBLCreate
  */
-static LONG CBLCreate( HWND hwnd, WORD wParam, LONG lParam )
+static LRESULT CBLCreate( HWND hwnd, WPARAM wParam, LPARAM lParam )
 {
   CREATESTRUCT *createStruct = (CREATESTRUCT *)PTR_SEG_TO_LIN(lParam);
 #ifdef WINELIB32
@@ -664,7 +664,7 @@
 /***********************************************************************
  *           CBLGetDlgCode
  */
-static LONG CBLGetDlgCode( HWND hwnd, WORD wParam, LONG lParam )
+static LRESULT CBLGetDlgCode( HWND hwnd, WPARAM wParam, LPARAM lParam )
 {
   return DLGC_WANTARROWS | DLGC_WANTCHARS;
 }
@@ -672,7 +672,7 @@
 /***********************************************************************
  *           CBLKeyDown
  */
-static LONG CBLKeyDown( HWND hwnd, WORD wParam, LONG lParam ) 
+static LRESULT CBLKeyDown( HWND hwnd, WPARAM wParam, LPARAM lParam ) 
 {
   LPHEADLIST lphl = CLBoxGetListHeader(hwnd);
   WORD newFocused = lphl->ItemFocused;
@@ -720,7 +720,7 @@
 /***********************************************************************
  *           CBLChar
  */
-static LONG CBLChar( HWND hwnd, WORD wParam, LONG lParam )
+static LRESULT CBLChar( HWND hwnd, WPARAM wParam, LPARAM lParam )
 {
   return 0;
 }
@@ -728,7 +728,7 @@
 /***********************************************************************
  *           CBLPaint
  */
-static LONG CBLPaint( HWND hwnd, WORD wParam, LONG lParam )
+static LRESULT CBLPaint( HWND hwnd, WPARAM wParam, LPARAM lParam )
 {
   LPHEADLIST   lphl = CLBoxGetListHeader(hwnd);
   LPLISTSTRUCT lpls;
@@ -805,7 +805,7 @@
 /***********************************************************************
  *           CBLKillFocus
  */
-static LONG CBLKillFocus( HWND hwnd, WORD wParam, LONG lParam )
+static LRESULT CBLKillFocus( HWND hwnd, WPARAM wParam, LPARAM lParam )
 {
 /*  SendMessage(CLBoxGetCombo(hwnd),CB_SHOWDROPDOWN,0,0);*/
   return 0;
@@ -814,7 +814,7 @@
 /***********************************************************************
  *           CBLActivate
  */
-static LONG CBLActivate( HWND hwnd, WORD wParam, LONG lParam )
+static LRESULT CBLActivate( HWND hwnd, WPARAM wParam, LPARAM lParam )
 {
   if (wParam == WA_INACTIVE)
     SendMessage(CLBoxGetCombo(hwnd),CB_SHOWDROPDOWN,0,0);
@@ -824,7 +824,7 @@
 /***********************************************************************
  *           CBLLButtonDown
  */
-static LONG CBLLButtonDown( HWND hwnd, WORD wParam, LONG lParam )
+static LRESULT CBLLButtonDown( HWND hwnd, WPARAM wParam, LPARAM lParam )
 {
   LPHEADLIST lphl = CLBoxGetListHeader(hwnd);
   int        y;
@@ -849,7 +849,7 @@
 /***********************************************************************
  *           CBLLButtonUp
  */
-static LONG CBLLButtonUp( HWND hwnd, WORD wParam, LONG lParam )
+static LRESULT CBLLButtonUp( HWND hwnd, WPARAM wParam, LPARAM lParam )
 {
   LPHEADLIST lphl = CLBoxGetListHeader(hwnd);
 
@@ -873,7 +873,7 @@
 /***********************************************************************
  *           CBLMouseMove
  */
-static LONG CBLMouseMove( HWND hwnd, WORD wParam, LONG lParam )
+static LRESULT CBLMouseMove( HWND hwnd, WPARAM wParam, LPARAM lParam )
 {
   LPHEADLIST lphl = CLBoxGetListHeader(hwnd);
   int  y;
@@ -916,7 +916,7 @@
 /***********************************************************************
  *           CBLVScroll
  */
-static LONG CBLVScroll( HWND hwnd, WORD wParam, LONG lParam )
+static LRESULT CBLVScroll( HWND hwnd, WPARAM wParam, LPARAM lParam )
 {
   LPHEADLIST lphl = CLBoxGetListHeader(hwnd);
   int  y;
diff --git a/controls/edit.c b/controls/edit.c
index 04383fb..8663d40 100644
--- a/controls/edit.c
+++ b/controls/edit.c
@@ -2210,10 +2210,13 @@
     EndPaint(hwnd, &ps);
 }
 
-static BOOL LOCAL_HeapExists(WORD ds)
+static BOOL LOCAL_HeapExists(HANDLE ds)
 {
+/* There is always a local heap in WineLib */
+#ifndef WINELIB
     INSTANCEDATA *ptr = (INSTANCEDATA *)PTR_SEG_OFF_TO_LIN( ds, 0 );
     if (!ptr->heap) return 0;
+#endif
     return 1;
 }
 
@@ -2249,7 +2252,7 @@
     {
         DWORD globalSize;
         globalSize = GlobalSize(ds);
-        printf("No local heap allocated global size is %d 0x%x\n",globalSize, globalSize);
+        dprintf_edit(stddeb, "No local heap allocated global size is %ld 0x%lx\n",globalSize, globalSize);
         /*
          * I assume the local heap should start at 0 
          */
diff --git a/controls/listbox.c b/controls/listbox.c
index a215ec3..0beca3e 100644
--- a/controls/listbox.c
+++ b/controls/listbox.c
@@ -111,8 +111,13 @@
   HeapBase = GlobalLock(HeapHandle);
   HEAP_Init(&lphl->Heap, HeapBase, LIST_HEAP_SIZE);
 #endif
+/* WINELIBS list boxes do not operate on local heaps */
+#ifndef WINELIB
   lphl->HeapSel = GlobalAlloc(GMEM_FIXED,LIST_HEAP_SIZE);
   LocalInit( lphl->HeapSel, 0, LIST_HEAP_SIZE-1);
+#else
+  lphl->HeapSel = 0;
+#endif
 }
 
 void DestroyListBoxStruct(LPHEADLIST lphl)
@@ -896,6 +901,8 @@
   int        y;
   RECT       rectsel;
   LONG	     dwStyle = GetWindowLong(lphl->hSelf,GWL_STYLE);
+  POINT      tmpPOINT;
+  tmpPOINT.x = LOWORD(lParam); tmpPOINT.y = HIWORD(lParam);
 
   SetFocus(hwnd);
   SetCapture(hwnd);
@@ -928,11 +935,11 @@
 
   if (dwStyle & LBS_NOTIFY)
     SendMessage(lphl->hParent, WM_LBTRACKPOINT, y, lParam);
-
+#ifndef WINELIB
   if (GetWindowLong(lphl->hSelf,GWL_EXSTYLE) & WS_EX_DRAGDETECT)
-     if( DragDetect(lphl->hSelf,MAKEPOINT(lParam)) )
+     if( DragDetect(lphl->hSelf,tmpPOINT) )
          SendMessage(lphl->hParent, WM_BEGINDRAG,0,0L);
-
+#endif
   return 0;
 }
 
diff --git a/if1632/advapi32.spec b/if1632/advapi32.spec
index 2676a5c..b5de7d9 100644
--- a/if1632/advapi32.spec
+++ b/if1632/advapi32.spec
@@ -127,11 +127,11 @@
 0123 stub QueryServiceStatus
 0124 stub ReadEventLogA
 0125 stub ReadEventLogW
-0126 stub RegCloseKey
+0126 	stdcall RegCloseKey(long) RegCloseKey
 0127 stub RegConnectRegistryA
 0128 stub RegConnectRegistryW
 0129 stub RegCreateKeyA
-0130 stub RegCreateKeyExA
+0130 	stdcall RegCreateKeyExA(long ptr long ptr long long ptr ptr ptr) RegCreateKeyEx
 0131 stub RegCreateKeyExW
 0132 stub RegCreateKeyW
 0133 stub RegDeleteKeyA
@@ -158,7 +158,7 @@
 0154 stub RegQueryMultipleValuesA
 0155 stub RegQueryMultipleValuesW
 0156 stub RegQueryValueA
-0157 stub RegQueryValueExA
+0157 	stdcall RegQueryValueExA(long ptr long long ptr ptr) RegQueryValueEx
 0158 stub RegQueryValueExW
 0159 stub RegQueryValueW
 0160 stub RegRemapPreDefKey
@@ -170,7 +170,7 @@
 0166 stub RegSaveKeyW
 0167 stub RegSetKeySecurity
 0168 stub RegSetValueA
-0169 stub RegSetValueExA
+0169 	stdcall RegSetValueExA(long ptr long long ptr long) RegSetValueEx
 0170 stub RegSetValueExW
 0171 stub RegSetValueW
 0172 stub RegUnLoadKeyA
diff --git a/if1632/kernel.spec b/if1632/kernel.spec
index 7f9b7c6..2899a60 100644
--- a/if1632/kernel.spec
+++ b/if1632/kernel.spec
@@ -256,11 +256,11 @@
 346 pascal16 IsBadHugeReadPtr(segptr long) IsBadHugeReadPtr
 347 pascal16 IsBadHugeWritePtr(segptr long) IsBadHugeWritePtr
 348 pascal hmemcpy(ptr ptr long) hmemcpy
-349 pascal16 _hread(word ptr long) _hread
-350 pascal16 _hwrite(word ptr long) _hwrite
+349 pascal _hread(word ptr long) _hread
+350 pascal _hwrite(word ptr long) _hwrite
 #351 BUNNY_351
 352 stub lstrcatn
-353 pascal lstrcpyn(segptr segptr word) lstrcpyn
+353 pascal lstrcpyn(segptr segptr word) WIN16_lstrcpyn
 354 stub GetAppCompatFlags
 355 pascal16 GetWinDebugInfo(ptr word) GetWinDebugInfo
 356 pascal16 SetWinDebugInfo(ptr) SetWinDebugInfo
diff --git a/if1632/kernel32.spec b/if1632/kernel32.spec
index e9e9abf..bb122a0 100644
--- a/if1632/kernel32.spec
+++ b/if1632/kernel32.spec
@@ -44,16 +44,16 @@
 0040 stub CreateDirectoryExA
 0041 stub CreateDirectoryExW
 0042 stub CreateDirectoryW
-0043 stub CreateEventA
+0043 	stdcall CreateEventA(ptr long long ptr) CreateEventA
 0044 stub CreateEventW
 0045   stdcall CreateFileA(ptr long long ptr long long long) CreateFileA
-0046 stub CreateFileMappingA
+0046 	stdcall CreateFileMappingA(long ptr long long long ptr) CreateFileMapping
 0047 stub CreateFileMappingW
 0048 stub CreateFileW
 0049 stub CreateIoCompletionPort
 0050 stub CreateMailslotA
 0051 stub CreateMailslotW
-0052 stub CreateMutexA
+0052 	stdcall CreateMutexA(ptr long ptr) CreateMutexA
 0053 stub CreateMutexW
 0054 stub CreateNamedPipeA
 0055 stub CreateNamedPipeW
@@ -79,7 +79,7 @@
 0075 stub DisconnectNamedPipe
 0076 stub DosDateTimeToFileTime
 0077 stub DuplicateConsoleHandle
-0078 stub DuplicateHandle
+0078 	stdcall DuplicateHandle(long long long ptr long long long) DuplicateHandle
 0079 stub EndUpdateResourceA
 0080 stub EndUpdateResourceW
 0081 stub EnterCriticalSection
@@ -199,9 +199,9 @@
 0195 stub GetCurrentConsoleFont
 0196 stub GetCurrentDirectoryA
 0197 stub GetCurrentDirectoryW
-0198 stub GetCurrentProcess
+0198 	stdcall GetCurrentProcess() GetCurrentProcess
 0199 stdcall GetCurrentProcessId() GetCurrentThreadId
-0200 stub GetCurrentThread
+0200 	stdcall GetCurrentThread() GetCurrentThread
 0201	stdcall GetCurrentThreadId()	GetCurrentThreadId
 0202 stub GetDateFormatA
 0203 stub GetDateFormatW
@@ -229,7 +229,7 @@
 0225 stub GetHandleInformation
 0226 stub GetLargestConsoleWindowSize
 0227    stdcall GetLastError() GetLastError
-0228 stub GetLocalTime
+0228    stdcall GetLocalTime(ptr) GetLocalTime
 0229 stub GetLocaleInfoA
 0230 stub GetLocaleInfoW
 0231 stub GetLogicalDriveStringsA
@@ -388,7 +388,7 @@
 0383 stub LockFileEx
 0384 stub LockResource
 0385 stub MapViewOfFile
-0386 stub MapViewOfFileEx
+0386 	stdcall MapViewOfFileEx(long long long long long long) MapViewOfFileEx
 0387 stub MoveFileA
 0388 stub MoveFileExA
 0389 stub MoveFileExW
@@ -399,7 +399,7 @@
 0394 stub OpenEventA
 0395 stub OpenEventW
 0396 stub OpenFile
-0397 stub OpenFileMappingA
+0397 	stdcall OpenFileMappingA(long long ptr) OpenFileMapping
 0398 stub OpenFileMappingW
 0399 stub OpenMutexA
 0400 stub OpenMutexW
@@ -437,11 +437,11 @@
 0432 stub RegisterWaitForInputIdle
 0433 stub RegisterWowBaseHandlers
 0434 stub RegisterWowExec
-0435 stub ReleaseMutex
+0435 	stdcall ReleaseMutex(long) ReleaseMutex
 0436 stub ReleaseSemaphore
 0437 stub RemoveDirectoryA
 0438 stub RemoveDirectoryW
-0439 stub ResetEvent
+0439 	stdcall ResetEvent(long) ResetEvent
 0440 stub ResumeThread
 0441 stub RtlFillMemory
 0442 stub RtlMoveMemory
@@ -489,7 +489,7 @@
 0484    stdcall SetEnvironmentVariableA(ptr ptr) SetEnvironmentVariableA
 0485 stub SetEnvironmentVariableW
 0486 stub SetErrorMode
-0487 stub SetEvent
+0487 	stdcall	SetEvent(long) SetEvent
 0488 stub SetFileApisToANSI
 0489 stub SetFileApisToOEM
 0490 stub SetFileAttributesA
@@ -563,7 +563,7 @@
 0558 stub WaitForDebugEvent
 0559 stub WaitForMultipleObjects
 0560 stub WaitForMultipleObjectsEx
-0561 stub WaitForSingleObject
+0561 	stdcall WaitForSingleObject(long long) WaitForSingleObject
 0562 stub WaitForSingleObjectEx
 0563 stub WaitNamedPipeA
 0564 stub WaitNamedPipeW
diff --git a/if1632/relay32.c b/if1632/relay32.c
index 0d906d4..67c6461 100644
--- a/if1632/relay32.c
+++ b/if1632/relay32.c
@@ -13,6 +13,7 @@
 #include "windows.h"
 #include "dlls.h"
 #include "pe_image.h"
+#include "peexe.h"
 #include "relay32.h"
 #include "stddebug.h"
 /* #define DEBUG_RELAY */
@@ -48,8 +49,12 @@
 WIN32_builtin *RELAY32_GetBuiltinDLL(char *name)
 {
 	WIN32_builtin *it;
+	size_t len;
+	char *cp;
+
+	len = (cp=strchr(name,'.')) ? (cp-name) : strlen(name);
 	for(it=WIN32_builtin_list;it;it=it->next)
-	if(strcasecmp(name,it->name)==0)
+	if(strncasecmp(name,it->name,len)==0)
 		return it;
 	return NULL;
 }
@@ -71,10 +76,57 @@
 {
 	WIN32_builtin *dll;
 	int i;
+  	u_short * ordinal;
+  	u_long * function;
+  	u_char ** name, *ename;
+	struct PE_Export_Directory * pe_exports;
+	unsigned int load_addr;
+
 	dprintf_module(stddeb, "Looking for %s in %s, hint %x\n",
 		item ? item: "(no name)", dll_name, hint);
 	dll=RELAY32_GetBuiltinDLL(dll_name);
-	if(!dll)return 0;
+	if(!dll) {
+		if(!wine_files || !wine_files->name ||
+		   strcasecmp(dll_name, wine_files->name)) {
+			LoadModule(dll_name, (LPVOID) -1);
+			if(!wine_files || !wine_files->name ||
+		   	   strcasecmp(dll_name, wine_files->name)) 
+				return 0;
+		}
+		load_addr = wine_files->load_addr;
+		pe_exports = wine_files->pe->pe_export;
+  		ordinal = (u_short *) (((char *) load_addr) + (int) pe_exports->Address_Of_Name_Ordinals);
+  		function = (u_long *)  (((char *) load_addr) + (int) pe_exports->AddressOfFunctions);
+  		name = (u_char **)  (((char *) load_addr) + (int) pe_exports->AddressOfNames);
+		/* import by ordinal */
+		if(!item){
+			return 0;
+		}
+		/* hint is correct */
+		#if 0
+		if(hint && hint<dll->size && 
+			dll->functions[hint].name &&
+			strcmp(item,dll->functions[hint].name)==0)
+			return dll->functions[hint].definition;
+		#endif
+		/* hint is incorrect, search for name */
+		for(i=0;i<pe_exports->Number_Of_Functions;i++)
+	            if (name[i] && !strcmp(item,name[i]+load_addr))
+	                return function[i]+(char *)load_addr;
+	
+		/* function at hint has no name (unimplemented) */
+		#if 0
+		if(hint && hint<dll->size && !dll->functions[hint].name)
+		{
+			dll->functions[hint].name=strdup(item);
+			dprintf_module(stddeb, "Returning unimplemented function %s.%d\n",
+				dll_name,hint);
+			return dll->functions[hint].definition;
+		}
+		#endif
+		printf("Not found\n");
+		return 0;
+	}
 	/* import by ordinal */
 	if(!item){
 		if(hint && hint<dll->size)return dll->functions[hint].definition;
diff --git a/if1632/user.spec b/if1632/user.spec
index fae1cc0..240daa5 100644
--- a/if1632/user.spec
+++ b/if1632/user.spec
@@ -409,7 +409,7 @@
 460 pascal16 GetInternalWindowPos(word ptr ptr) GetInternalWindowPos
 461 pascal16 SetInternalWindowPos(word word ptr ptr) SetInternalWindowPos
 462 pascal16 CalcChildScroll(word word) CalcChildScroll
-463 stub ScrollChildren
+463 pascal16 ScrollChildren(word word word long) ScrollChildren
 464 pascal   DragObject(word word word word word word) DragObject
 465 pascal16 DragDetect(word long) DragDetect
 466 pascal16 DrawFocusRect(word ptr) DrawFocusRect
diff --git a/if1632/winprocs.spec b/if1632/winprocs.spec
index b770e4d..e564fa5 100644
--- a/if1632/winprocs.spec
+++ b/if1632/winprocs.spec
@@ -29,6 +29,7 @@
 26 register Win32CallToStart() PE_Win32CallToStart
 27 pascal EntryAddrProc(word word) MODULE_GetEntryPoint
 28 pascal MyAlloc(word word word) MODULE_AllocateSegment
+29 pascal16 ActivateAppProc(word long) ACTIVATEAPP_callback
 
 # Interrupt vectors 0-255 are ordinals 100-355
 # The 'word' parameter are the flags pushed on the stack by the interrupt
diff --git a/include/advapi32.h b/include/advapi32.h
new file mode 100644
index 0000000..634c3f4
--- /dev/null
+++ b/include/advapi32.h
@@ -0,0 +1,31 @@
+#ifndef __WINE_ADVAPI32_H
+#define __WINE_ADVAPI32_H
+#include "shell.h"
+#include "kernel32.h"
+#define REGSAM long
+BOOL WINAPI GetUserNameA (char * lpBuffer, DWORD  *nSize);
+WINAPI LONG RegCreateKeyEx(HKEY key,
+                            const char *subkey,
+                            long dontuse,
+                            const char *keyclass,
+                            DWORD options,
+                            REGSAM sam,
+                            SECURITY_ATTRIBUTES *atts,
+                            HKEY *res,
+                            DWORD *disp);
+WINAPI LONG RegSetValueExA (HKEY key,
+                const char *name,
+                DWORD dontuse,
+                DWORD type,
+                const void* data,
+                DWORD len
+                );
+WINAPI LONG RegQueryValueExA(HKEY key,
+                             const char *subkey,
+                             DWORD dontuse,
+                             DWORD *type,
+                             void *ptr,
+                             DWORD *len);
+
+
+#endif  /* __WINE_ADVAPI32_H */
diff --git a/include/dlls.h b/include/dlls.h
index 4b4b606..89c434a 100644
--- a/include/dlls.h
+++ b/include/dlls.h
@@ -12,10 +12,6 @@
 #define MAX_NAME_LENGTH		64
 
 
-#define DLL	0
-#define EXE	1
-
-
 struct dll_table_s
 {
     char *  name;          /* DLL name */
diff --git a/include/handle32.h b/include/handle32.h
index f4e0d9e..e6d07a7 100644
--- a/include/handle32.h
+++ b/include/handle32.h
@@ -41,6 +41,13 @@
 } FILE_OBJECT;
 
 typedef struct {
+    KERNEL_OBJECT	common;
+    FILE_OBJECT	       *file_obj;
+    int			prot;
+    unsigned long	size;
+} FILEMAP_OBJECT;
+
+typedef struct {
     KERNEL_OBJECT       common;
 } SEMAPHORE_OBJECT;
 
@@ -65,6 +72,7 @@
 #define KERNEL_OBJECT_SEMAPHORE (KERNEL_OBJECT_UNUSED + 4)
 #define KERNEL_OBJECT_EVENT     (KERNEL_OBJECT_UNUSED + 5)
 #define KERNEL_OBJECT_REGKEY    (KERNEL_OBJECT_UNUSED + 6)
+#define KERNEL_OBJECT_FILEMAP   (KERNEL_OBJECT_UNUSED + 7)
 
 /* Define the invalid handle value
  */
diff --git a/include/kernel32.h b/include/kernel32.h
index dd38cdc..501e8d8 100644
--- a/include/kernel32.h
+++ b/include/kernel32.h
@@ -106,11 +106,14 @@
 #define STD_OUTPUT_HANDLE       ((DWORD) -11)
 #define STD_ERROR_HANDLE        ((DWORD) -12)
 
-/* The security attributes structure (not filled in yet)
+/* The security attributes structure 
  */
 typedef struct {
-    void *junk;
+    DWORD nLength;
+    void *lpSecurityDescriptor;
+    BOOL bInheritHandle;
 } SECURITY_ATTRIBUTES, *LPSECURITY_ATTRIBUTES;
+
 typedef struct
 {
   int dwLowDateTime;
@@ -131,4 +134,17 @@
   int nFileIndexLow;
 } BY_HANDLE_FILE_INFORMATION ;
 
+/* File attribute flags
+ */
+#define FILE_ATTRIBUTE_ARCHIVE          0x0020
+#define FILE_ATTRIBUTE_COMPRESSED       0x0800
+#define FILE_ATTRIBUTE_DIRECTORY        0x0010
+#define FILE_ATTRIBUTE_HIDDEN           0x0002
+#define FILE_ATTRIBUTE_NORMAL           0x0080
+#define FILE_ATTRIBUTE_READONLY         0x0001
+#define FILE_ATTRIBUTE_SYSTEM           0x0004
+#define FILE_ATTRIBUTE_TEMPORARY        0x0100
+#define FILE_ATTRIBUTE_ATOMIC_WRITE     0x0200
+#define FILE_ATTRIBUTE_XACTION_WRITE    0x0400
+
 #endif  /* __WINE_KERNEL32_H */
diff --git a/include/libres.h b/include/libres.h
index 68ada6f..918f042 100644
--- a/include/libres.h
+++ b/include/libres.h
@@ -4,16 +4,21 @@
 #ifndef __WINE_LIBRES_H
 #define __WINE_LIBRES_H
 
-#include "windows.h"
-
 #ifdef WINELIB
-HRSRC LIBRES_FindResource( HMODULE hModule, SEGPTR name, SEGPTR type );
-HGLOBAL LIBRES_LoadResource( HMODULE hModule, HRSRC hRsrc );
-LPSTR LIBRES_LockResource( HMODULE hModule, HGLOBAL handle );
-BOOL LIBRES_FreeResource( HMODULE hModule, HGLOBAL handle );
-INT LIBRES_AccessResource( HINSTANCE hModule, HRSRC hRsrc );
-DWORD LIBRES_SizeofResource( HMODULE hModule, HRSRC hRsrc );
-HGLOBAL LIBRES_AllocResource( HMODULE hModule, HRSRC hRsrc, DWORD size );
-#endif
+
+#include "windows.h"
+#include "resource.h"
+
+void    LIBRES_RegisterResources(struct resource** Res);
+
+INT     LIBRES_AccessResource( HINSTANCE hModule, HRSRC hRsrc );
+HGLOBAL LIBRES_AllocResource( HINSTANCE hModule, HRSRC hRsrc, DWORD size );
+HRSRC   LIBRES_FindResource( HINSTANCE hModule, LPCSTR name, LPCSTR type );
+BOOL    LIBRES_FreeResource( HGLOBAL handle );
+HGLOBAL LIBRES_LoadResource( HINSTANCE hModule, HRSRC hRsrc );
+LPVOID  LIBRES_LockResource( HGLOBAL handle );
+DWORD   LIBRES_SizeofResource( HINSTANCE hModule, HRSRC hRsrc );
+
+#endif /* WINELIB */
 
 #endif
diff --git a/include/listbox.h b/include/listbox.h
index 1ca0891..e266b8a 100644
--- a/include/listbox.h
+++ b/include/listbox.h
@@ -34,7 +34,7 @@
 	LPINT   TabStops;
 	HANDLE  hDrawItemStruct;
         BOOL    needMeasure;
-	WORD	HeapSel;
+	HANDLE	HeapSel;
 /*	MDESC   *Heap; */
 } HEADLIST,*LPHEADLIST;
 
diff --git a/include/mdi.h b/include/mdi.h
index d2d1434..e7c2573 100644
--- a/include/mdi.h
+++ b/include/mdi.h
@@ -1,6 +1,7 @@
 /* MDI.H
  *
  * Copyright 1994, Bob Amstadt
+ *           1995  Alex Korobka
  *
  * MDI structure definitions.
  */
@@ -10,29 +11,32 @@
 
 #include "windows.h"
 
-#define MDI_MAXLISTLENGTH	64
+#define MDI_MAXLISTLENGTH	0x40
+
+#define WM_MDICALCCHILDSCROLL   0x10AC /* this is exactly what Windows uses */
+
 extern LRESULT MDIClientWndProc(HWND hwnd, UINT message, 
 				WPARAM wParam, LPARAM lParam); /* mdi.c */
 
-
-typedef struct
+typedef struct tagMDIWCL
 {
-    HLOCAL next, prev;
-    HWND hwnd;
-} MDICHILDINFO;
+  HWND		 	 hChild;
+  struct tagMDIWCL	*prev;
+} MDIWCL;
 
 typedef struct 
 {
-    HMENU  hWindowMenu;
-    HLOCAL infoActiveChildren;
     WORD   nActiveChildren;
-    WORD   idFirstChild;
+    HWND   flagChildMaximized;
     HWND   hwndActiveChild;
+    HMENU  hWindowMenu;
+    WORD   idFirstChild;       /* order is 3.1-like up to this point */
+    WORD   sbStop;
+    WORD   sbRecalc;
     HWND   hwndHitTest;
-    BOOL   flagMenuAltered;
-    BOOL   flagChildMaximized;
     RECT   rectMaximize;
     RECT   rectRestore;
 } MDICLIENTINFO;
 
+
 #endif /* MDI_H */
diff --git a/include/message.h b/include/message.h
index e604a41..8956faf 100644
--- a/include/message.h
+++ b/include/message.h
@@ -70,6 +70,8 @@
 extern void MSG_Synchronize();
 extern BOOL MSG_WaitXEvent( LONG maxWait );
 extern BOOL MSG_CreateSysMsgQueue( int size );
+extern BOOL MSG_DeleteMsgQueue( HANDLE hQueue );
+extern HTASK MSG_GetQueueTask( HANDLE hQueue );
 extern void hardware_event( WORD message, WORD wParam, LONG lParam,
 			    int xPos, int yPos, DWORD time, DWORD extraInfo );
 extern BOOL MSG_GetHardwareMessage( LPMSG msg );
diff --git a/include/msdos.h b/include/msdos.h
index 5ee696a..5964d82 100644
--- a/include/msdos.h
+++ b/include/msdos.h
@@ -16,7 +16,6 @@
 	char search_attribute;
 	long filesize;
 	long filetime;
-        int telldirnum;
         short entnum;           /* Directory entry number */
         struct dosdirent *next;
 };
diff --git a/include/options.h b/include/options.h
index 834713c..7d3bbf1 100644
--- a/include/options.h
+++ b/include/options.h
@@ -34,6 +34,7 @@
     int    enhanced;        /* Start Wine in enhanced mode */
     int    ipc;             /* Use IPC mechanisms */
     WINE_LANGUAGE language; /* Current language */
+    int    managed;	    /* Managed windows */
 };
 
 extern struct options Options;
diff --git a/include/pe_image.h b/include/pe_image.h
index a65c756..b83e651 100644
--- a/include/pe_image.h
+++ b/include/pe_image.h
@@ -25,6 +25,7 @@
     struct mz_header_s *mz_header;
     struct pe_data *pe;
 	OFSTRUCT ofs;
+    unsigned int load_addr;
 };
 
 
@@ -33,6 +34,7 @@
 extern void PE_InitDLL(struct w_files *wpnt);
 extern HINSTANCE PE_LoadImage(struct w_files *wpnt);
 extern void my_wcstombs(char * result, u_short * source, int len);
+extern struct w_files *wine_files;
 
 typedef struct _WIN32_function{
     char *name;
diff --git a/include/peexe.h b/include/peexe.h
index 6f54811..43aa48a 100644
--- a/include/peexe.h
+++ b/include/peexe.h
@@ -167,6 +167,7 @@
   u_long * AddressOfFunctions;
   u_long * AddressOfNames;
   u_short * Address_Of_Name_Ordinals;
+  u_char ModuleName[1];
 };
 
 /*
diff --git a/include/resource.h b/include/resource.h
index d389ce4..26d5897 100644
--- a/include/resource.h
+++ b/include/resource.h
@@ -17,12 +17,19 @@
 extern HGLOBAL NE_AllocResource( HMODULE hModule, HRSRC hRsrc, DWORD size );
 extern HGLOBAL NE_LoadResource( HMODULE hModule,  HRSRC hRsrc );
 
-struct ResourceTable
+struct resource
 {
         int id,type;
         char *name;
-        unsigned char* value;
+        unsigned char* bytes;
         unsigned size;
 };
 
+#if defined(__GNUC__) && (__GNUC__ == 2) && (__GNUC_MINOR__ >= 7)
+#define WINE_CONSTRUCTOR  __attribute__((constructor))
+#define HAVE_WINE_CONSTRUCTOR
+#else
+#define WINE_CONSTRUCTOR
+#endif
+
 #endif /* __WINE_RESOURCE_H */
diff --git a/include/shell.h b/include/shell.h
index 5a546ec..652f481 100644
--- a/include/shell.h
+++ b/include/shell.h
@@ -3,6 +3,9 @@
  */
 
 extern INT ShellAbout(HWND hWnd, LPCSTR szApp, LPCSTR szOtherStuff, HICON hIcon);
+extern void SHELL_LoadRegistry();
+extern void SHELL_SaveRegistry();
+extern BOOL SHELL_Init();
 
 #define ERROR_SUCCESS           0L
 #define ERROR_BADDB             1L
@@ -33,15 +36,14 @@
 	struct tagKEYSTRUCT *lpPrevKey;
 	struct tagKEYSTRUCT *lpNextKey;
 	struct tagKEYSTRUCT *lpSubLvl;
-	} KEYSTRUCT;
-typedef KEYSTRUCT *LPKEYSTRUCT;
+} KEYSTRUCT, *LPKEYSTRUCT;
 
-typedef struct tagDROPFILESTRUCT { 	   /* structure for dropped files */ 
+typedef struct { 	   /* structure for dropped files */ 
 	WORD		wSize;
 	POINT		ptMousePos;   
 	BOOL		fInNonClientArea;
 	/* memory block with filenames follows */     
-        } DROPFILESTRUCT,FAR *LPDROPFILESTRUCT; 
+} DROPFILESTRUCT, *LPDROPFILESTRUCT; 
 
 #define SE_ERR_SHARE            26
 #define SE_ERR_ASSOCINCOMPLETE  27
diff --git a/include/win.h b/include/win.h
index 49491a2..f5f7ba1 100644
--- a/include/win.h
+++ b/include/win.h
@@ -43,7 +43,6 @@
     POINT        ptMaxPos;       /* Maximized window position */
     HGLOBAL      hmemTaskQ;      /* Task queue global memory handle */
     HRGN         hrgnUpdate;     /* Update region */
-    HWND         hwndPrevActive; /* Previous active top-level window */
     HWND         hwndLastActive; /* Last active popup hwnd */
     WNDPROC      lpfnWndProc;    /* Window procedure */
     DWORD        dwStyle;        /* Window style (from CreateWindow) */
@@ -68,6 +67,7 @@
 #define WIN_INTERNAL_PAINT      0x10  /* Internal WM_PAINT message pending */
 #define WIN_NO_REDRAW           0x20  /* WM_SETREDRAW called for this window */
 #define WIN_GOT_SIZEMSG         0x40  /* WM_SIZE has been sent to the window */
+#define WIN_NCACTIVATED		0x80  /* last WM_NCACTIVATE was positive */
 
 #define WIN_CLASS_INFO(wndPtr)   (CLASS_FindClassPtr((wndPtr)->hClass)->wc)
 #define WIN_CLASS_STYLE(wndPtr)  (WIN_CLASS_INFO(wndPtr).style)
diff --git a/include/windows.h b/include/windows.h
index 02542d0..e0430aa 100644
--- a/include/windows.h
+++ b/include/windows.h
@@ -1428,22 +1428,69 @@
 
 /* Messages */
 
-enum {  WM_NULL, WM_CREATE, WM_DESTROY, WM_MOVE, WM_UNUSED0, WM_SIZE, WM_ACTIVATE,
-	WM_SETFOCUS, WM_KILLFOCUS, WM_SETVISIBLE, WM_ENABLE, WM_SETREDRAW, 
-	WM_SETTEXT, WM_GETTEXT, WM_GETTEXTLENGTH, WM_PAINT, WM_CLOSE, 
-	WM_QUERYENDSESSION, WM_QUIT, WM_QUERYOPEN, WM_ERASEBKGND, 
-	WM_SYSCOLORCHANGE, WM_ENDSESSION, WM_SYSTEMERROR,
-	WM_SHOWWINDOW, WM_CTLCOLOR, WM_WININICHANGE, WM_DEVMODECHANGE,
-	WM_ACTIVATEAPP, WM_FONTCHANGE, WM_TIMECHANGE, WM_CANCELMODE, WM_SETCURSOR,
-	WM_MOUSEACTIVATE, WM_CHILDACTIVATE, WM_QUEUESYNC, WM_GETMINMAXINFO,
-	WM_UNUSED3, WM_PAINTICON, WM_ICONERASEBKGND, WM_NEXTDLGCTL, 
-	WM_UNUSED4, WM_SPOOLERSTATUS, WM_DRAWITEM, WM_MEASUREITEM, 
-	WM_DELETEITEM, WM_VKEYTOITEM,
-	WM_CHARTOITEM, WM_SETFONT, WM_GETFONT };
+#define WM_NULL                 0x0000
+#define WM_CREATE               0x0001
+#define WM_DESTROY              0x0002
+#define WM_MOVE                 0x0003
+#define WM_SIZEWAIT             0x0004
+#define WM_SIZE                 0x0005
+#define WM_ACTIVATE             0x0006
+#define WM_SETFOCUS             0x0007
+#define WM_KILLFOCUS            0x0008
+#define WM_SETVISIBLE           0x0009
+#define WM_ENABLE               0x000a
+#define WM_SETREDRAW            0x000b
+#define WM_SETTEXT              0x000c
+#define WM_GETTEXT              0x000d
+#define WM_GETTEXTLENGTH        0x000e
+#define WM_PAINT                0x000f
+#define WM_CLOSE                0x0010
+#define WM_QUERYENDSESSION      0x0011
+#define WM_QUIT                 0x0012
+#define WM_QUERYOPEN            0x0013
+#define WM_ERASEBKGND           0x0014
+#define WM_SYSCOLORCHANGE       0x0015
+#define WM_ENDSESSION           0x0016
+#define WM_SYSTEMERROR          0x0017
+#define WM_SHOWWINDOW           0x0018
+#define WM_CTLCOLOR             0x0019
+#define WM_WININICHANGE         0x001a
+#define WM_DEVMODECHANGE        0x001b
+#define WM_ACTIVATEAPP          0x001c
+#define WM_FONTCHANGE           0x001d
+#define WM_TIMECHANGE           0x001e
+#define WM_CANCELMODE           0x001f
+#define WM_SETCURSOR            0x0020
+#define WM_MOUSEACTIVATE        0x0021
+#define WM_CHILDACTIVATE        0x0022
+#define WM_QUEUESYNC            0x0023
+#define WM_GETMINMAXINFO        0x0024
 
-#define WM_QUERYDRAGICON    0x0037
+#define WM_PAINTICON            0x0026
+#define WM_ICONERASEBKGND       0x0027
+#define WM_NEXTDLGCTL           0x0028
+#define WM_ALTTABACTIVE         0x0029
+#define WM_SPOOLERSTATUS        0x002a
+#define WM_DRAWITEM             0x002b
+#define WM_MEASUREITEM          0x002c
+#define WM_DELETEITEM           0x002d
+#define WM_VKEYTOITEM           0x002e
+#define WM_CHARTOITEM           0x002f
+#define WM_SETFONT              0x0030
+#define WM_GETFONT              0x0031
+#define WM_SETHOTKEY            0x0032
+#define WM_GETHOTKEY            0x0033
+#define WM_FILESYSCHANGE        0x0034
+#define WM_ISACTIVEICON         0x0035
+#define WM_QUERYPARKICON        0x0036
+#define WM_QUERYDRAGICON        0x0037
+#define WM_QUERYSAVESTATE       0x0038
+#define WM_COMPAREITEM          0x0039
+#define WM_TESTING              0x003a
 
-#define WM_COMPAREITEM	    0x0039
+#define WM_OTHERWINDOWCREATED	0x003c
+#define WM_OTHERWINDOWDESTROYED	0x003d
+#define WM_ACTIVATESHELLWINDOW	0x003e
 
 #define WM_COMPACTING	    0x0041
 
@@ -1461,6 +1508,7 @@
 
 #define WM_GETDLGCODE	    0x0087
 #define WM_SYNCPAINT	    0x0088
+#define WM_SYNCTASK	    0x0089
 
   /* Non-client mouse messages */
 #define WM_NCMOUSEMOVE      0x00a0
@@ -1532,6 +1580,7 @@
 #define WM_PARENTNOTIFY     0x0210
 #define WM_ENTERMENULOOP    0x0211
 #define WM_EXITMENULOOP     0x0212
+#define WM_NEXTMENU	    0x0213
 
 #define WM_MDICREATE	    0x0220
 #define WM_MDIDESTROY	    0x0221
@@ -1943,10 +1992,6 @@
 #define LBN_SETFOCUS        4
 #define LBN_KILLFOCUS       5
 
-/* Listbox notification messages */
-#define WM_VKEYTOITEM       0x002E
-#define WM_CHARTOITEM       0x002F
-
 /* Listbox message return values */
 #define LB_OKAY             0
 #define LB_ERR              (-1)
@@ -2095,8 +2140,6 @@
 #define EN_VSCROLL      0x0602
 
 
-#define WM_DRAWITEM         0x002B
-
 typedef struct
 {
     UINT        CtlType;
@@ -2112,8 +2155,6 @@
 typedef DRAWITEMSTRUCT NEAR* PDRAWITEMSTRUCT;
 typedef DRAWITEMSTRUCT FAR* LPDRAWITEMSTRUCT;
 
-#define WM_MEASUREITEM      0x002C
-
 typedef struct
 {
     UINT        CtlType;
@@ -2126,8 +2167,6 @@
 typedef MEASUREITEMSTRUCT NEAR* PMEASUREITEMSTRUCT;
 typedef MEASUREITEMSTRUCT FAR* LPMEASUREITEMSTRUCT;
 
-#define WM_DELETEITEM       0x002D
-
 typedef struct
 {
     UINT       CtlType;
@@ -2139,8 +2178,6 @@
 typedef DELETEITEMSTRUCT NEAR* PDELETEITEMSTRUCT;
 typedef DELETEITEMSTRUCT FAR* LPDELETEITEMSTRUCT;
 
-#define WM_COMPAREITEM      0x0039
-
 typedef struct
 {
     UINT        CtlType;
@@ -2499,13 +2536,14 @@
 UINT       AnsiUpperBuff(LPSTR,UINT);
 BOOL       AnyPopup(void);
 BOOL       AppendMenu(HMENU,UINT,UINT,LPSTR);
-BOOL       Arc(HDC,int,int,int,int,int,int,int,int);
+BOOL       Arc(HDC,INT,INT,INT,INT,INT,INT,INT,INT);
 WORD       ArrangeIconicWindows(HWND);
 HDWP       BeginDeferWindowPos(INT);
 HDC        BeginPaint(HWND,LPPAINTSTRUCT);
-BOOL       BitBlt(HDC,short,short,short,short,HDC,short,short,DWORD);
+BOOL       BitBlt(HDC,INT,INT,INT,INT,HDC,INT,INT,DWORD);
 BOOL       BringWindowToTop(HWND);
 int        BuildCommDCB(LPSTR,DCB*);
+void       CalcChildScroll(HWND,WORD);
 BOOL       CallMsgFilter(SEGPTR,short);
 DWORD      CallNextHookEx(HHOOK,short,WPARAM,LPARAM);
 LONG       CallWindowProc(WNDPROC,HWND,UINT,WPARAM,LPARAM);
@@ -2517,7 +2555,7 @@
 BOOL       CheckMenuItem(HMENU,UINT,UINT);
 void       CheckRadioButton(HWND,WORD,WORD,WORD);
 HWND       ChildWindowFromPoint(HWND,POINT);
-BOOL       Chord(HDC,int,int,int,int,int,int,int,int);
+BOOL       Chord(HDC,INT,INT,INT,INT,INT,INT,INT,INT);
 int        ClearCommBreak(int);
 void       ClientToScreen(HWND,LPPOINT);
 void       ClipCursor(LPRECT);
@@ -2600,13 +2638,13 @@
 BOOL       DlgDirSelect(HWND,LPSTR,int);
 BOOL       DlgDirSelectComboBox(HWND,LPSTR,int);
 BOOL       DragDetect(HWND,POINT);
-DWORD      DragObject(HWND, HWND, WORD, WORD, WORD, HCURSOR);
+DWORD      DragObject(HWND, HWND, WORD, HANDLE, WORD, HCURSOR);
 void       DrawFocusRect(HDC,LPRECT);
 BOOL       DrawIcon(HDC,short,short,HICON);
 void       DrawMenuBar(HWND);
 int        DrawText(HDC,LPSTR,int,LPRECT,WORD);
 DWORD      DumpIcon(SEGPTR,WORD*,SEGPTR*,SEGPTR*);
-BOOL       Ellipse(HDC,int,int,int,int);
+BOOL       Ellipse(HDC,INT,INT,INT,INT);
 BOOL       EmptyClipboard(void);
 BOOL       EnableHardwareInput(BOOL);
 BOOL       EnableMenuItem(HMENU,UINT,UINT);
@@ -2640,7 +2678,7 @@
 BOOL       FillRgn(HDC,HRGN,HBRUSH);
 void       FillWindow(HWND,HWND,HDC,HBRUSH);
 ATOM       FindAtom(SEGPTR);
-HANDLE     FindResource(HANDLE,SEGPTR,SEGPTR);
+HRSRC      FindResource(HINSTANCE,SEGPTR,SEGPTR);
 HWND       FindWindow(SEGPTR,LPSTR);
 BOOL       FlashWindow(HWND,BOOL);
 BOOL       FloodFill(HDC,INT,INT,COLORREF);
@@ -2650,7 +2688,7 @@
 void       FreeLibrary(HANDLE);
 BOOL       FreeModule(HANDLE);
 void       FreeProcInstance(FARPROC);
-BOOL       FreeResource(HANDLE);
+BOOL       FreeResource(HGLOBAL);
 WORD       FreeSelector(WORD);
 UINT       GDIRealizePalette(HDC);
 HPALETTE   GDISelectPalette(HDC,HPALETTE);
@@ -2897,7 +2935,7 @@
 HMENU      LoadMenu(HANDLE,SEGPTR);
 HMENU      LoadMenuIndirect(LPSTR);
 HANDLE     LoadModule(LPCSTR,LPVOID);
-HANDLE     LoadResource(HANDLE,HANDLE);
+HGLOBAL    LoadResource(HINSTANCE,HRSRC);
 int        LoadString(HANDLE,WORD,LPSTR,int);
 HANDLE     LocalAlloc(WORD,WORD);
 #ifndef WINELIB32 /* Obsolete in Win32 */
@@ -2915,7 +2953,7 @@
 #endif
 UINT       LocalSize(HLOCAL);
 BOOL       LocalUnlock(HANDLE);
-LPSTR      LockResource(HANDLE);
+LPVOID     LockResource(HGLOBAL);
 HGLOBAL    LockSegment(HGLOBAL);
 HMENU      LookupMenuHandle(HMENU,INT);
 FARPROC    MakeProcInstance(FARPROC,HANDLE);
@@ -2949,7 +2987,7 @@
 BOOL       PaintRgn(HDC,HRGN);
 BOOL       PatBlt(HDC,short,short,short,short,DWORD);
 BOOL       PeekMessage(LPMSG,HWND,WORD,WORD,WORD);
-BOOL       Pie(HDC,int,int,int,int,int,int,int,int);
+BOOL       Pie(HDC,INT,INT,INT,INT,INT,INT,INT,INT);
 BOOL       PlayMetaFile(HDC,HANDLE);
 void       PlayMetaFileRecord(HDC,LPHANDLETABLE,LPMETARECORD,WORD);
 BOOL       PolyPolygon(HDC,LPPOINT,LPINT,WORD);
@@ -2975,7 +3013,7 @@
 UINT       RealizePalette(HDC);
 BOOL       RectInRegion(HRGN,LPRECT);
 BOOL       RectVisible(HDC,LPRECT);
-BOOL       Rectangle(HDC,int,int,int,int);
+BOOL       Rectangle(HDC,INT,INT,INT,INT);
 BOOL       RedrawWindow(HWND,LPRECT,HRGN,UINT);
 ATOM       RegisterClass(LPWNDCLASS);
 WORD       RegisterClipboardFormat(LPCSTR);
@@ -2989,7 +3027,7 @@
 BOOL       ResizePalette(HPALETTE,UINT);
 BOOL       RestoreDC(HDC,short);
 int        RestoreVisRgn(HDC);
-BOOL       RoundRect(HDC,short,short,short,short,short,short);
+BOOL       RoundRect(HDC,INT,INT,INT,INT,INT,INT);
 int        SaveDC(HDC);
 HRGN       SaveVisRgn(HDC);
 DWORD      ScaleViewportExt(HDC,short,short,short,short);
@@ -2997,6 +3035,7 @@
 DWORD      ScaleWindowExt(HDC,short,short,short,short);
 BOOL       ScaleWindowExtEx(HDC,short,short,short,short,LPSIZE);
 void       ScreenToClient(HWND,LPPOINT);
+void       ScrollChildren(HWND,UINT,WPARAM,LPARAM);
 BOOL       ScrollDC(HDC,short,short,LPRECT,LPRECT,HRGN,LPRECT);
 void       ScrollWindow(HWND,short,short,LPRECT,LPRECT);
 int        ScrollWindowEx(HWND,short,short,LPRECT,LPRECT,HRGN,LPRECT,WORD);
@@ -3103,7 +3142,7 @@
 void       ShowOwnedPopups(HWND,BOOL);
 void       ShowScrollBar(HWND,WORD,BOOL);
 BOOL       ShowWindow(HWND,int);
-DWORD      SizeofResource(HANDLE,HRSRC);
+DWORD      SizeofResource(HINSTANCE,HRSRC);
 int        StartSound(void);
 int        StopSound(void);
 BOOL       StretchBlt(HDC,short,short,short,short,HDC,short,short,short,short,DWORD);
@@ -3139,6 +3178,7 @@
 WORD       VkKeyScan(WORD);
 SEGPTR     WIN16_GlobalLock(HGLOBAL);
 SEGPTR     WIN16_LockResource(HANDLE);
+SEGPTR     WIN16_lstrcpyn(SEGPTR,SEGPTR,WORD);
 void       WaitMessage(void);
 int        WaitSoundState(int);
 HANDLE     WinExec(LPSTR,WORD);
@@ -3160,7 +3200,7 @@
 INT        lstrcmp(LPCSTR,LPCSTR);
 INT        lstrcmpi(LPCSTR,LPCSTR);
 SEGPTR     lstrcpy(SEGPTR,SEGPTR);
-SEGPTR     lstrcpyn(SEGPTR,SEGPTR,WORD);
+char *     lstrcpyn(char *,char *,int);
 INT        lstrlen(LPCSTR);
 int        wvsprintf(LPSTR,LPSTR,LPSTR);
 
diff --git a/include/winerror.h b/include/winerror.h
index ec4ba25..67e8d71 100644
--- a/include/winerror.h
+++ b/include/winerror.h
@@ -7,6 +7,21 @@
  */
 #define     ERROR_UNKNOWN               99999
 
+#define     ERROR_FILE_NOT_FOUND        2
+#define     ERROR_TOO_MANY_OPEN_FILES   4
+#define     ERROR_ACCESS_DENIED         5
 #define     ERROR_INVALID_HANDLE        6
+#define     ERROR_BAD_FORMAT            11
+#define     ERROR_OUTOFMEMORY           14
+#define     ERROR_FILE_EXISTS           80
 #define     ERROR_INVALID_PARAMETER     87
+#define     ERROR_BROKEN_PIPE           109
+#define     ERROR_DISK_FULL             112
 #define     ERROR_CALL_NOT_IMPLEMENTED  120
+#define     ERROR_SEEK_ON_DEVICE        132
+#define     ERROR_DIR_NOT_EMPTY         145
+#define     ERROR_BUSY                  170
+#define     ERROR_FILENAME_EXCED_RANGE  206
+#define     ERROR_IO_DEVICE             1117
+#define     ERROR_POSSIBLE_DEADLOCK     1131
+#define     ERROR_BAD_DEVICE            1200
diff --git a/include/winpos.h b/include/winpos.h
index 68edbd8..56cabb7 100644
--- a/include/winpos.h
+++ b/include/winpos.h
@@ -19,8 +19,15 @@
     WINDOWPOS   winPos[1];
 } DWP;
 
+typedef struct
+{
+  HTASK        hWindowTask;
+  HTASK        hTaskSendTo;
+  BOOL         wFlag;
+} ACTIVATESTRUCT, *LPACTIVATESTRUCT;
 
 extern void WINPOS_FindIconPos( HWND hwnd );
+extern BOOL WINPOS_SetActiveWindow( HWND hWnd, BOOL fMouse, BOOL fChangeFocus);
 extern HWND WINPOS_ChangeActiveWindow( HWND hwnd, BOOL mouseMsg );
 extern LONG WINPOS_SendNCCalcSize( HWND hwnd, BOOL calcValidRect,
 				   RECT *newWindowRect, RECT *oldWindowRect,
diff --git a/include/wintypes.h b/include/wintypes.h
index eb917b5..0d7689a 100644
--- a/include/wintypes.h
+++ b/include/wintypes.h
@@ -31,6 +31,7 @@
 typedef LONG WPARAM;
 typedef void* HANDLE;
 typedef void* NPVOID;
+typedef void* SEGPTR;
 #define UIFMT "%u"
 #define NPFMT "%p"
 #else
@@ -39,13 +40,13 @@
 typedef UINT WPARAM;
 typedef WORD HANDLE;
 typedef WORD NPVOID;
+typedef DWORD SEGPTR;
 #define UIFMT "%hu"
 #define NPFMT "%04X"
 #endif
 typedef LONG LPARAM;
 typedef LONG LRESULT;
 typedef DWORD HHOOK;
-typedef DWORD SEGPTR;
 typedef char *LPSTR;
 typedef const char *LPCSTR;
 typedef char *NPSTR;
diff --git a/loader/module.c b/loader/module.c
index 2a95c4a..1137f3d 100644
--- a/loader/module.c
+++ b/loader/module.c
@@ -1184,8 +1184,7 @@
     hModule = GetExePtr( hModule );  /* In case we were passed an hInstance */
     if (!(pModule = (NE_MODULE *)GlobalLock( hModule ))) return 0;
     name = ((LOADEDFILEINFO*)((char*)pModule + pModule->fileinfo))->filename;
-    strncpy( lpFileName, name, nSize );
-    lpFileName[nSize-1] = '\0';
+    lstrcpyn( lpFileName, name, nSize );
     dprintf_module( stddeb, "GetModuleFilename: %s\n", lpFileName );
     return strlen(lpFileName);
 }
diff --git a/loader/pe_image.c b/loader/pe_image.c
index cfd9e08..8a05457 100644
--- a/loader/pe_image.c
+++ b/loader/pe_image.c
@@ -5,6 +5,8 @@
  *	based on Eric Youndale's pe-test and:
  *
  *	ftp.microsoft.com:/pub/developer/MSDN/CD8/PEFILE.ZIP
+ * make that:
+ *	ftp.microsoft.com:/developr/MSDN/OctCD/PEFILE.ZIP
  */
 
 #include <ctype.h>
@@ -35,8 +37,6 @@
 
 struct w_files *wine_files = NULL;
 
-unsigned int load_addr;
-
 void my_wcstombs(char * result, u_short * source, int len)
 {
   while(len--) {
@@ -76,7 +76,7 @@
   return vaddr;
 };
 
-void dump_exports(struct PE_Export_Directory * pe_exports)
+void dump_exports(struct PE_Export_Directory * pe_exports, unsigned int load_addr)
 { 
   char * Module;
   int i;
@@ -85,7 +85,7 @@
   u_char ** name, *ename;
 
   Module = ((char *) load_addr) + pe_exports->Name;
-  printf("\n*******EXPORT DATA*******\nModule name is %s, %ld functions, %ld names\n", 
+  dprintf_win32(stddeb,"\n*******EXPORT DATA*******\nModule name is %s, %ld functions, %ld names\n", 
 	 Module,
 	 pe_exports->Number_Of_Functions,
 	 pe_exports->Number_Of_Names);
@@ -94,15 +94,15 @@
   function = (u_long *)  (((char *) load_addr) + (int) pe_exports->AddressOfFunctions);
   name = (u_char **)  (((char *) load_addr) + (int) pe_exports->AddressOfNames);
 
-  printf("%-32s Ordinal Virt Addr\n", "Function Name");
+  dprintf_win32(stddeb,"%-32s Ordinal Virt Addr\n", "Function Name");
   for(i=0; i< pe_exports->Number_Of_Functions; i++)
     {
       ename =  (char *) (((char *) load_addr) + (int) *name++);
-      printf("%-32s %4d    %8.8lx\n", ename, *ordinal++, *function++);
+      dprintf_win32(stddeb,"%-32s %4d    %8.8lx\n", ename, *ordinal++, *function++);
     }
 }
 
-void fixup_imports(struct PE_Import_Directory *pe_imports)
+void fixup_imports(struct PE_Import_Directory *pe_imports,unsigned int load_addr)
 { 
   struct PE_Import_Directory * pe_imp;
   int fixup_failed=0;
@@ -115,12 +115,16 @@
       char * Module;
       struct pe_import_name * pe_name;
       unsigned int * import_list, *thunk_list;
+#if 0
       char * c;
+#endif
 
       Module = ((char *) load_addr) + pe_imp->ModuleName;
       dprintf_win32(stddeb, "%s\n", Module);
+#if 0
       c = strchr(Module, '.');
       if (c) *c = 0;
+#endif
 
       import_list = (unsigned int *) 
 	(((unsigned int) load_addr) + pe_imp->Import_List);
@@ -185,6 +189,7 @@
 HINSTANCE PE_LoadImage(struct w_files *wpnt)
 {
 	int i, result;
+        unsigned int load_addr;
 
 	wpnt->pe = xmalloc(sizeof(struct pe_data));
 	memset(wpnt->pe,0,sizeof(struct pe_data));
@@ -239,10 +244,11 @@
 	    }
 	}
 
-	if(wpnt->pe->pe_import) fixup_imports(wpnt->pe->pe_import);
-	if(wpnt->pe->pe_export) dump_exports(wpnt->pe->pe_export);
+	if(wpnt->pe->pe_import) fixup_imports(wpnt->pe->pe_import,load_addr);
+	if(wpnt->pe->pe_export) dump_exports(wpnt->pe->pe_export,load_addr);
   
 	wpnt->hinstance = (HINSTANCE)0x8000;
+	wpnt->load_addr = load_addr;
 	return (wpnt->hinstance);
 }
 
@@ -264,8 +270,6 @@
 	ALIAS_UseAliases=1;
 
 	wpnt=xmalloc(sizeof(struct w_files));
-	wpnt->next=wine_files;
-	wine_files=wpnt;
 	wpnt->ofs=*ofs;
 	wpnt->fd=fd;
 	wpnt->type=0;
@@ -295,7 +299,7 @@
 	pModule = (NE_MODULE*)GlobalLock(hModule);
 
 	/* Set all used entries */
-	pModule->magic=NE_SIGNATURE;
+	pModule->magic=PE_SIGNATURE;
 	pModule->count=1;
 	pModule->next=0;
 	pModule->flags=0;
@@ -353,6 +357,18 @@
 	hInstance=MODULE_CreateInstance(hModule,NULL /* FIX: NULL? really? */);
 	wpnt->hinstance=hInstance;
 
+	if (wpnt->pe->pe_export) {
+		wpnt->name = xmalloc(strlen(wpnt->pe->pe_export->ModuleName)+1);
+		strcpy(wpnt->name, wpnt->pe->pe_export->ModuleName);
+	} else {
+		wpnt->name = xmalloc(strlen(ofs->szPathName)+1);
+		strcpy(wpnt->name, ofs->szPathName);
+	}
+
+	wpnt->next=wine_files;
+	wine_files=wpnt;
+
+	if (!(wpnt->pe->pe_header->coff.Characteristics & IMAGE_FILE_DLL))
 	TASK_CreateTask(hModule,hInstance,0,
 		params->hEnvironment,(LPSTR)PTR_SEG_TO_LIN(params->cmdLine),
 		*((WORD*)PTR_SEG_TO_LIN(params->showCmd)+1));
@@ -371,7 +387,7 @@
 	InitTask(context);
 	USER_InitApp(wpnt->hModule);
 	__asm__ __volatile__("movw %w0,%%fs"::"r" (fs));
-	((void(*)())(load_addr+wpnt->pe->pe_header->opt_coff.AddressOfEntryPoint))();
+	((void(*)())(wpnt->load_addr+wpnt->pe->pe_header->opt_coff.AddressOfEntryPoint))();
 }
 
 int PE_UnloadImage(struct w_files *wpnt)
diff --git a/loader/resource.c b/loader/resource.c
index 42b45cc..4ded636 100644
--- a/loader/resource.c
+++ b/loader/resource.c
@@ -64,7 +64,7 @@
         return 0;
     }
 #else
-    return LIBRES_FindResource( hModule, type, name );
+    return LIBRES_FindResource( hModule, name, type );
 #endif
 }
 
@@ -103,6 +103,7 @@
 /* 16-bit version */
 SEGPTR WIN16_LockResource( HGLOBAL handle )
 {
+#ifndef WINELIB
     HMODULE hModule;
     WORD *pModule;
 
@@ -110,7 +111,6 @@
     if (!handle) return (SEGPTR)0;
     hModule = GetExePtr( handle );
     if (!(pModule = (WORD *)GlobalLock( hModule ))) return 0;
-#ifndef WINELIB
     switch(*pModule)
     {
       case NE_SIGNATURE:
@@ -121,13 +121,14 @@
         return 0;
     }
 #else
-    return LIBRES_LockResource( hModule, handle );
+    return LIBRES_LockResource( handle );
 #endif
 }
 
 /* 32-bit version */
-LPSTR LockResource( HGLOBAL handle )
+LPVOID LockResource( HGLOBAL handle )
 {
+#ifndef WINELIB
     HMODULE hModule;
     WORD *pModule;
 
@@ -135,7 +136,6 @@
     if (!handle) return NULL;
     hModule = GetExePtr( handle );
     if (!(pModule = (WORD *)GlobalLock( hModule ))) return 0;
-#ifndef WINELIB
     switch(*pModule)
     {
       case NE_SIGNATURE:
@@ -146,7 +146,7 @@
         return 0;
     }
 #else
-    return LIBRES_LockResource( hModule, handle );
+    return LIBRES_LockResource( handle );
 #endif
 }
 
@@ -156,6 +156,7 @@
  */
 BOOL FreeResource( HGLOBAL handle )
 {
+#ifndef WINELIB
     HMODULE hModule;
     WORD *pModule;
 
@@ -163,7 +164,6 @@
     if (!handle) return FALSE;
     hModule = GetExePtr( handle );
     if (!(pModule = (WORD *)GlobalLock( hModule ))) return 0;
-#ifndef WINELIB
     switch(*pModule)
     {
       case NE_SIGNATURE:
@@ -174,7 +174,7 @@
         return FALSE;
     }
 #else
-    return LIBRES_FreeResource( hModule, handle );
+    return LIBRES_FreeResource( handle );
 #endif
 }
 
diff --git a/loader/signal.c b/loader/signal.c
index 6150f72..1968046 100644
--- a/loader/signal.c
+++ b/loader/signal.c
@@ -56,8 +56,6 @@
 static void win_fault(int signal, int code, struct sigcontext *context)
 {
 #endif
-    int i;
-    
     if (signal != SIGTRAP)
     {
         if (CS_reg(context) == WINE_CODE_SELECTOR)
diff --git a/loader/task.c b/loader/task.c
index bf383cd..345b9f7 100644
--- a/loader/task.c
+++ b/loader/task.c
@@ -14,6 +14,7 @@
 #include "debugger.h"
 #include "global.h"
 #include "instance.h"
+#include "message.h"
 #include "miscemu.h"
 #include "module.h"
 #include "neexe.h"
@@ -31,6 +32,7 @@
   /* Must not be greater than 64k, or MAKE_SEGPTR won't work */
 #define STACK32_SIZE 0x10000
 
+/* ------ Internal variables ------ */
 
 static HTASK hFirstTask = 0;
 static HTASK hCurrentTask = 0;
@@ -39,6 +41,8 @@
 static WORD nTaskCount = 0;
 static HANDLE hDOSEnvironment = 0;
 
+/* ------ Internal declarations ------ */
+
   /* TASK_Reschedule() 16-bit entry point */
 static FARPROC TASK_RescheduleProc;
 
@@ -48,7 +52,6 @@
 #define TASK_SCHEDULE()  CallTo16_word_(TASK_RescheduleProc,0)
 #endif
 
-
 static HANDLE TASK_CreateDOSEnvironment(void);
 
 /***********************************************************************
@@ -565,6 +568,10 @@
 
     GlobalFreeAll( pTask->hPDB );
 
+      /* Free message queue */
+
+    MSG_DeleteMsgQueue( pTask->hQueue );
+
       /* Free the selector aliases */
 
     GLOBAL_FreeBlock( pTask->hCSAlias );
@@ -604,8 +611,12 @@
     
     hTaskToKill = hCurrentTask;
     hLockedTask = 0;
+
     Yield();
-    /* We never return from Yield() */
+    /* We should never return from this Yield() */
+
+    fprintf(stderr,"It's alive! Alive!!!\n");
+    exit(1);
 }
 
 
diff --git a/misc/Makefile.in b/misc/Makefile.in
index 26ac02d..f4c201e 100644
--- a/misc/Makefile.in
+++ b/misc/Makefile.in
@@ -14,12 +14,12 @@
 	keyboard.c \
 	lstr.c \
 	main.c \
+	network.c \
 	ole2.c \
 	ole2disp.c \
 	ole2nls.c \
 	olecli.c \
 	olesvr.c \
-	network.c \
 	profile.c \
 	rect.c \
 	shell.c \
diff --git a/misc/commdlg.c b/misc/commdlg.c
index 73df1d1..d6c8815 100644
--- a/misc/commdlg.c
+++ b/misc/commdlg.c
@@ -858,29 +858,30 @@
  */
 int GetFileTitle(LPCSTR lpFile, LPSTR lpTitle, UINT cbBuf)
 {
-  int i, len;
-  printf("GetFileTitle(%p %p %d); \n", lpFile, lpTitle, cbBuf);
-  if (lpFile == NULL || lpTitle == NULL)
-    return -1;
-  len = strlen(lpFile);
-  if (len == 0)
-    return -1;
-  if (strpbrk(lpFile, "*[]"))
-    return -1;
-  len--;
-  if (lpFile[len] == '/' || lpFile[len] == '\\' || lpFile[len] == ':')
-    return -1;
-  for (i = len; i >= 0; i--)
-    if (lpFile[i] == '/' ||  lpFile[i] == '\\' ||  lpFile[i] == ':')
-      {
+    int i, len;
+    printf("GetFileTitle(%p %p %d); \n", lpFile, lpTitle, cbBuf);
+    if (lpFile == NULL || lpTitle == NULL)
+    	return -1;
+    len = strlen(lpFile);
+    if (len == 0)
+    	return -1;
+    if (strpbrk(lpFile, "*[]"))
+    	return -1;
+    len--;
+    if (lpFile[len] == '/' || lpFile[len] == '\\' || lpFile[len] == ':')
+    	return -1;
+    for (i = len; i >= 0; i--)
+    	if (lpFile[i] == '/' ||  lpFile[i] == '\\' ||  lpFile[i] == ':')
+    {
 	i++;
 	break;
-      }
-  printf("\n---> '%s' ", &lpFile[i]);
-  len = MIN(cbBuf, strlen(&lpFile[i]) + 1);
-  strncpy(lpTitle, &lpFile[i], len + 1);
-  if (len != cbBuf)
-    return len;
-  else
+    }
+    printf("\n---> '%s' ", &lpFile[i]);
+    
+    len = strlen(lpFile+i)+1;
+    if (cbBuf < len);
+    	return len;
+
+    strncpy(lpTitle, &lpFile[i], len);
     return 0;
 }
diff --git a/misc/dos_fs.c b/misc/dos_fs.c
index 28cdf30..0d88d8f 100644
--- a/misc/dos_fs.c
+++ b/misc/dos_fs.c
@@ -885,12 +885,6 @@
     strcpy(dp->unixpath, dirname);
     dp->entnum = 0;
 
-    if ((dp->telldirnum=telldir(ds)) == -1)
-    {
-        dp->inuse = 0;
-	closedir(ds);
-	return NULL;
-    }
     if (closedir(ds) == -1) 
     {
         dp->inuse = 0;
@@ -906,11 +900,16 @@
 	struct dirent *d;
 	struct stat st;
 	DIR	*ds;
+	int	i;
 
 	if (!de->inuse)
 		return NULL;
 	if (!(ds=opendir(de->unixpath))) return NULL;
-	seekdir(ds,de->telldirnum); /* returns no error value. strange */
+	/* skip all already read directory entries. 
+	 * the dir has hopefully not been modified in the meantime
+	 */
+	for (i=de->entnum;i--;)
+		readdir(ds);
    
         if (de->search_attribute & FA_LABEL)  {	
 	    int drive;
@@ -927,13 +926,11 @@
 	}
     
 	do {
+	    de->entnum++;   /* Increment the directory entry number */
 	    if ((d = readdir(ds)) == NULL)  {
-		de->telldirnum=telldir(ds);
 		closedir(ds);
 		return NULL;
 	    }
-
-	    de->entnum++;   /* Increment the directory entry number */
 	    strcpy(de->filename, d->d_name);
 	    if (d->d_reclen > 12)
 	    de->filename[12] = '\0';
@@ -954,7 +951,6 @@
 	de->filesize = st.st_size;
 	de->filetime = st.st_mtime;
 
-	de->telldirnum = telldir(ds);
 	closedir(ds);
 	return de;
 }
diff --git a/misc/keyboard.c b/misc/keyboard.c
index ce2c0ec..8058a7c 100644
--- a/misc/keyboard.c
+++ b/misc/keyboard.c
@@ -124,7 +124,7 @@
 
 	for (i = 0 ; i != KeyTableSize ; i++) 
 		if (KeyTable[i].scancode == lParam)  {
-			strncpy(lpBuffer, KeyTable[i].name, nSize);
+			lstrcpyn(lpBuffer, KeyTable[i].name, nSize);
 			return strlen(lpBuffer);
 		}
 
diff --git a/misc/lstr.c b/misc/lstr.c
index b79c3b3..5d03363 100644
--- a/misc/lstr.c
+++ b/misc/lstr.c
@@ -54,7 +54,6 @@
 "\205\240\203\141\204\206\221\207\212\202\210\211\215\241\214\213"
 "\144\244\225\242\223\157\224\366\157\227\243\226\201\171\137\230";
 
-
 /* Funny to divide them between user and kernel. */
 
 /* KERNEL.89 */
@@ -87,10 +86,20 @@
     return target;
 }
 
-/* KERNEL.353 */
-SEGPTR lstrcpyn( SEGPTR target, SEGPTR source, WORD n )
+/* KERNEL.353 32-bit version*/
+char *lstrcpyn(char *dst, char *src, int n)
 {
-    strncpy((char *)PTR_SEG_TO_LIN(target), (char *)PTR_SEG_TO_LIN(source), n);
+    char *tmp = dst;
+    while(n-- > 1 && *src)
+    	*dst++ = *src++;
+    *dst = 0;
+    return tmp;
+}
+
+/* KERNEL.353 16-bit version*/
+SEGPTR WIN16_lstrcpyn( SEGPTR target, SEGPTR source, WORD n )
+{
+    lstrcpyn((char *)PTR_SEG_TO_LIN(target), (char *)PTR_SEG_TO_LIN(source),n);
     return target;
 }
 
diff --git a/misc/main.c b/misc/main.c
index 8f2a426..9226c08 100644
--- a/misc/main.c
+++ b/misc/main.c
@@ -23,6 +23,7 @@
 #include "winsock.h"
 #include "options.h"
 #include "desktop.h"
+#include "shell.h"
 #include "dlls.h"
 #define DEBUG_DEFINE_VARIABLES
 #include "stddebug.h"
@@ -89,11 +90,11 @@
     FALSE,          /* Enhanced mode */
     FALSE,          /* IPC enabled */
 #ifdef DEFAULT_LANG
-    DEFAULT_LANG    /* Default language */
+    DEFAULT_LANG,   /* Default language */
 #else
-    LANG_En
+    LANG_En,
 #endif
-
+    FALSE	    /* Managed windows */
 };
 
 
@@ -114,7 +115,8 @@
     { "-debugmsg",      ".debugmsg",        XrmoptionSepArg, (caddr_t)NULL },
     { "-dll",           ".dll",             XrmoptionSepArg, (caddr_t)NULL },
     { "-allowreadonly", ".allowreadonly",   XrmoptionNoArg,  (caddr_t)"on" },
-    { "-enhanced",      ".enhanced",        XrmoptionNoArg,  (caddr_t)"off"}
+    { "-enhanced",      ".enhanced",        XrmoptionNoArg,  (caddr_t)"off"},
+    { "-managed",       ".managed",         XrmoptionNoArg,  (caddr_t)"off"}
 };
 
 #define NB_OPTIONS  (sizeof(optionsTable) / sizeof(optionsTable[0]))
@@ -130,6 +132,7 @@
   "    -ipc            Enable IPC facilities\n" \
   "    -debug          Enter debugger before starting application\n" \
   "    -language xx    Set the language (one of En,Es,De,No,Fr,Fi,Da)\n" \
+  "    -managed        Allow the window manager to manage created windows\n" \
   "    -name name      Set the application name\n" \
   "    -privatemap     Use a private color map\n" \
   "    -fixedmap       Use a \"standard\" color map\n" \
@@ -373,6 +376,8 @@
 	Options.desktopGeometry = value.addr;
     if (MAIN_GetResource( db, ".language", &value))
         MAIN_ParseLanguageOption( (char *)value.addr );
+    if (MAIN_GetResource( db, ".managed", &value))
+        Options.managed = TRUE;
 #ifdef DEBUG_RUNTIME
     if (MAIN_GetResource( db, ".debugoptions", &value))
 	ParseDebugOptions((char*)value.addr);
@@ -530,7 +535,6 @@
 static void called_at_exit(void)
 {
     extern void sync_profiles(void);
-    extern void SHELL_SaveRegistry(void);
 
     sync_profiles();
     MAIN_RestoreSetup();
@@ -548,7 +552,6 @@
     int *depth_list;
 
     extern int _WinMain(int argc, char **argv);
-    extern void SHELL_LoadRegistry(void);
 
     setbuf(stdout,NULL);
     setbuf(stderr,NULL);
@@ -575,6 +578,7 @@
     }
 #endif
 
+    SHELL_Init();
     SHELL_LoadRegistry();
 
     screen       = DefaultScreenOfDisplay( display );
@@ -652,66 +656,67 @@
  */
 int SetEnvironment(LPSTR lpPortName, LPSTR lpEnviron, WORD nCount)
 {
-	LPENVENTRY	lpNewEnv;
-	LPENVENTRY	lpEnv = lpEnvList;
-	dprintf_env(stddeb, "SetEnvironnement('%s', '%s', %d) !\n", 
-				lpPortName, lpEnviron, nCount);
-	if (lpPortName == NULL) return -1;
-	while (lpEnv != NULL) {
-		if (lpEnv->Name != NULL && strcmp(lpEnv->Name, lpPortName) == 0) {
-			if (nCount == 0 || lpEnviron == NULL) {
-				if (lpEnv->Prev != NULL) lpEnv->Prev->Next = lpEnv->Next;
-				if (lpEnv->Next != NULL) lpEnv->Next->Prev = lpEnv->Prev;
-				free(lpEnv->Value);
-				free(lpEnv->Name);
-				free(lpEnv);
-				dprintf_env(stddeb, "SetEnvironnement() // entry deleted !\n");
-				return -1;
-				}
-			free(lpEnv->Value);
-			lpEnv->Value = malloc(nCount);
-			if (lpEnv->Value == NULL) {
-				dprintf_env(stddeb, "SetEnvironment() // Error allocating entry value !\n");
-				return 0;
-			}
-			memcpy(lpEnv->Value, lpEnviron, nCount);
-			lpEnv->wSize = nCount;
-			dprintf_env(stddeb, "SetEnvironnement() // entry modified !\n");
-			return nCount;
-			}
-		if (lpEnv->Next == NULL) break;
-		lpEnv = lpEnv->Next;
-		}
-	if (nCount == 0 || lpEnviron == NULL) return -1;
-	dprintf_env(stddeb, "SetEnvironnement() // new entry !\n");
-	lpNewEnv = malloc(sizeof(ENVENTRY));
-	if (lpNewEnv == NULL) {
-		dprintf_env(stddeb, "SetEnvironment() // Error allocating new entry !\n");
-		return 0;
-		}
-	if (lpEnvList == NULL) {
-		lpEnvList = lpNewEnv;
-		lpNewEnv->Prev = NULL;
-		}
-	else {
-		lpEnv->Next = lpNewEnv;
-		lpNewEnv->Prev = lpEnv;
-		}
-	lpNewEnv->Next = NULL;
-	lpNewEnv->Name = malloc(strlen(lpPortName) + 1);
-	if (lpNewEnv->Name == NULL) {
-		dprintf_env(stddeb, "SetEnvironment() // Error allocating entry name !\n");
-		return 0;
-		}
-	strcpy(lpNewEnv->Name, lpPortName);
-	lpNewEnv->Value = malloc(nCount);
-	if (lpNewEnv->Value == NULL) {
+    LPENVENTRY	lpNewEnv;
+    LPENVENTRY	lpEnv = lpEnvList;
+    dprintf_env(stddeb, "SetEnvironment('%s', '%s', %d) !\n", 
+		lpPortName, lpEnviron, nCount);
+    if (lpPortName == NULL) return -1;
+    while (lpEnv != NULL) {
+	if (lpEnv->Name != NULL && strcmp(lpEnv->Name, lpPortName) == 0) {
+	    if (nCount == 0 || lpEnviron == NULL) {
+		if (lpEnv->Prev != NULL) lpEnv->Prev->Next = lpEnv->Next;
+		if (lpEnv->Next != NULL) lpEnv->Next->Prev = lpEnv->Prev;
+		free(lpEnv->Value);
+		free(lpEnv->Name);
+		free(lpEnv);
+		dprintf_env(stddeb, "SetEnvironment() // entry deleted !\n");
+		return -1;
+	    }
+	    free(lpEnv->Value);
+	    lpEnv->Value = malloc(nCount);
+	    if (lpEnv->Value == NULL) {
 		dprintf_env(stddeb, "SetEnvironment() // Error allocating entry value !\n");
 		return 0;
-		}
-	memcpy(lpNewEnv->Value, lpEnviron, nCount);
-	lpNewEnv->wSize = nCount;
-	return nCount;
+	    }
+	    memcpy(lpEnv->Value, lpEnviron, nCount);
+	    lpEnv->wSize = nCount;
+	    dprintf_env(stddeb, "SetEnvironment() // entry modified !\n");
+	    return nCount;
+	}
+	if (lpEnv->Next == NULL) break;
+	lpEnv = lpEnv->Next;
+    }
+    if (nCount == 0 || lpEnviron == NULL) return -1;
+    dprintf_env(stddeb, "SetEnvironment() // new entry !\n");
+    lpNewEnv = malloc(sizeof(ENVENTRY));
+    if (lpNewEnv == NULL) {
+	dprintf_env(stddeb, "SetEnvironment() // Error allocating new entry !\n");
+	return 0;
+    }
+    if (lpEnvList == NULL) {
+	lpEnvList = lpNewEnv;
+	lpNewEnv->Prev = NULL;
+    }
+    else 
+    {
+	lpEnv->Next = lpNewEnv;
+	lpNewEnv->Prev = lpEnv;
+    }
+    lpNewEnv->Next = NULL;
+    lpNewEnv->Name = malloc(strlen(lpPortName) + 1);
+    if (lpNewEnv->Name == NULL) {
+	dprintf_env(stddeb, "SetEnvironment() // Error allocating entry name !\n");
+	return 0;
+    }
+    strcpy(lpNewEnv->Name, lpPortName);
+    lpNewEnv->Value = malloc(nCount);
+    if (lpNewEnv->Value == NULL) {
+	dprintf_env(stddeb, "SetEnvironment() // Error allocating entry value !\n");
+	return 0;
+    }
+    memcpy(lpNewEnv->Value, lpEnviron, nCount);
+    lpNewEnv->wSize = nCount;
+    return nCount;
 }
 
 /***********************************************************************
@@ -730,21 +735,21 @@
  */
 int GetEnvironment(LPSTR lpPortName, LPSTR lpEnviron, WORD nMaxSiz)
 {
-	WORD		nCount;
-	LPENVENTRY	lpEnv = lpEnvList;
-	dprintf_env(stddeb, "GetEnvironnement('%s', '%s', %d) !\n",
-					lpPortName, lpEnviron, nMaxSiz);
-	while (lpEnv != NULL) {
-		if (lpEnv->Name != NULL && strcmp(lpEnv->Name, lpPortName) == 0) {
-			nCount = MIN(nMaxSiz, lpEnv->wSize);
-			memcpy(lpEnviron, lpEnv->Value, nCount);
-			dprintf_env(stddeb, "GetEnvironnement() // found '%s' !\n", lpEnviron);
-			return nCount;
-			}
-		lpEnv = lpEnv->Next;
-		}
-	dprintf_env(stddeb, "GetEnvironnement() // not found !\n");
-	return 0;
+    WORD       nCount;
+    LPENVENTRY lpEnv = lpEnvList;
+    dprintf_env(stddeb, "GetEnvironment('%s', '%s', %d) !\n",
+		lpPortName, lpEnviron, nMaxSiz);
+    while (lpEnv != NULL) {
+	if (lpEnv->Name != NULL && strcmp(lpEnv->Name, lpPortName) == 0) {
+	    nCount = MIN(nMaxSiz, lpEnv->wSize);
+	    memcpy(lpEnviron, lpEnv->Value, nCount);
+	    dprintf_env(stddeb, "GetEnvironment() // found '%s' !\n", lpEnviron);
+	    return nCount;
+	}
+	lpEnv = lpEnv->Next;
+    }
+    dprintf_env(stddeb, "GetEnvironment() // not found !\n");
+    return 0;
 }
 
 /***********************************************************************
diff --git a/misc/ole2nls.c b/misc/ole2nls.c
index f0dc52f..0a20cf9 100644
--- a/misc/ole2nls.c
+++ b/misc/ole2nls.c
@@ -432,7 +432,7 @@
 	}
 
 	if(retLen>len)retLen=len;
-	strncpy(buf,retString,len);
+	lstrcpyn(buf,retString,len);
 	return retLen;
 }
 
diff --git a/misc/profile.c b/misc/profile.c
index 080c3dc..043eb28 100644
--- a/misc/profile.c
+++ b/misc/profile.c
@@ -14,9 +14,7 @@
  *         has a NULL KeyValue returning a list of KeyNames, and a NULL
  *         AppName undefined.  I changed GetSetProfile to match.  This makes
  *         PROGMAN.EXE do the right thing.
- *
-static char Copyright [] = "Copyright (C) 1993 Miguel de Icaza";
-*/
+ */
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
@@ -25,15 +23,12 @@
 #include "wine.h"
 #include "windows.h"
 #include "dos_fs.h"
-#include "module.h"
 #include "toolhelp.h"
 #include "stddebug.h"
-/* #define DEBUG_PROFILE */
 #include "debug.h"
 #include "xmalloc.h"
 
 #define STRSIZE 255
-#define overflow (next == &CharBuffer [STRSIZE-1])
 
 typedef struct TKeys {
     char *KeyName;
@@ -143,7 +138,12 @@
 	
 	if (isspace(c))
 	    continue;
-	
+	if (c == ';') {
+	    do {
+		c = fgetc(f);
+	    } while (!(c == EOF || c == '\n'));
+	    if (c == EOF) goto finished;
+	}
 	if (c == '[') {
 	    TSecHeader *temp = SecHeader;
 	    
@@ -206,23 +206,26 @@
 	    skipspc = TRUE;
 	    do {
 		c = fgetc(f);
-		if (c == EOF) break;
-		if (c != '\n') {
-		    if (!isspace(c) || !skipspc) {
-			skipspc = FALSE;
-			bufsize++;
-			*bufptr++ = c;
-			if (!isspace(c))
-		    	    lastnonspc = bufptr;
-		    }
-		} else
-		    break;
+		if (c == EOF || c == '\n' || c == ';') break;
+		if (!isspace(c) || !skipspc) {
+		    skipspc = FALSE;
+		    bufsize++;
+		    *bufptr++ = c;
+		    if (!isspace(c))
+		    	lastnonspc = bufptr;
+		}
 	    } while(bufsize < STRSIZE-1);
 	    *lastnonspc = 0;
 	    SecHeader->Keys->Value = strdup (CharBuffer);
 	    dprintf_profile (stddeb, "[%s] (%s)=%s\n", SecHeader->AppName,
 			     SecHeader->Keys->KeyName, SecHeader->Keys->Value);
-	    
+	    if (c == ';') {
+		do {
+		    c = fgetc(f);
+		} while (!(c == EOF || c == '\n'));
+		if (c == EOF)
+		    goto finished;
+	    }
 	}
 
     }
@@ -266,6 +269,7 @@
 	section = New->Section;
 	Current = New;
     }
+
     /* Start search */
     for (; section; section = section->link){
 	if (strcasecmp (section->AppName, AppName))
@@ -280,20 +284,17 @@
 	    dprintf_profile(stddeb,"GetSetProfile // KeyName == NULL, Enumeration !\n");
 	    for (key = section->Keys; key; key = key->link){
 		if (left < 1) {
-			dprintf_profile(stddeb,"GetSetProfile // No more storage for enum !\n");
-			return (Size - 2);
+		    dprintf_profile(stddeb,"GetSetProfile // No more storage for enum !\n");
+		    return Size - 2;
 		}
 		slen = MIN(strlen(key->KeyName) + 1, left);
-		dprintf_profile(stddeb,"GetSetProfile // strncpy(%p, %p, %d);\n", 
-				ReturnedString, key->Value, slen);
-		strncpy (p, key->KeyName, slen);
+		lstrcpyn(p, key->KeyName, slen);
 		dprintf_profile(stddeb,"GetSetProfile // enum '%s' !\n", p);
 		left -= slen;
 		p += slen;
 	    }
-		*p = '\0';
-		dprintf_profile(stddeb,"GetSetProfile // normal end of enum !\n");
-	    return (Size - 2 - left);
+	    *p = '\0';
+	    return Size - 2 - left;
 	}
 	for (key = section->Keys; key; key = key->link){
 	    int slen;
@@ -305,9 +306,8 @@
 		Current->changed=TRUE;
 		return 1;
 	    }
-	    slen = MIN(strlen(key->Value), Size - 1);
-	    ReturnedString[slen] = 0;
-	    strncpy (ReturnedString, key->Value, slen);
+	    slen = MIN(strlen(key->Value)+1, Size);
+	    lstrcpyn(ReturnedString, key->Value, slen);
 	    dprintf_profile(stddeb,"GetSetProfile // Return ``%s''\n", ReturnedString);
 	    return 1; 
 	}
@@ -317,13 +317,13 @@
 	if (set) {
 	    new_key (section, KeyName, Default);
         } else {
-	    int slen = MIN(strlen(Default), Size - 1);
-            ReturnedString[slen] = 0;
-            strncpy(ReturnedString, Default, slen);
+	    int slen = MIN(strlen(Default)+1, Size);
+            lstrcpyn(ReturnedString, Default, slen);
 	    dprintf_profile(stddeb,"GetSetProfile // Key not found\n");
 	}
 	return 1;
     }
+
     /* Non existent section */
     if (set){
 	section = (TSecHeader *) xmalloc (sizeof (TSecHeader));
@@ -334,9 +334,8 @@
 	Current->Section = section;
 	Current->changed = TRUE;
     } else {
-	int slen = MIN(strlen(Default), Size - 1);
-	ReturnedString[slen] = 0;
-	strncpy(ReturnedString, Default, slen);
+	int slen = MIN(strlen(Default)+1, Size);
+	lstrcpyn(ReturnedString, Default, slen);
 	dprintf_profile(stddeb,"GetSetProfile // Section not found\n");
     }
     return 1;
diff --git a/misc/shell.c b/misc/shell.c
index 86d60ee..5e1911c 100644
--- a/misc/shell.c
+++ b/misc/shell.c
@@ -25,48 +25,48 @@
 static char RootKeyName[]=".classes", TopKeyName[] = "[top-null]";
 
 /*************************************************************************
- *                        SHELL_RegCheckForRoot()     internal use only
+ *                        SHELL_Init()
  */
-static LONG SHELL_RegCheckForRoot()
+BOOL SHELL_Init()
 {
     HKEY hNewKey;
-
-    if (lphRootKey == NULL){
-      hNewKey = GlobalAlloc(GMEM_MOVEABLE,sizeof(KEYSTRUCT));
-      lphRootKey = (LPKEYSTRUCT) GlobalLock(hNewKey);
-      if (lphRootKey == NULL) {
+    
+    hNewKey = GlobalAlloc(GMEM_MOVEABLE,sizeof(KEYSTRUCT));
+    lphRootKey = (LPKEYSTRUCT) GlobalLock(hNewKey);
+    if (lphRootKey == NULL) {
         printf("SHELL_RegCheckForRoot: Couldn't allocate root key!\n");
-        return ERROR_OUTOFMEMORY;
-      }
-      lphRootKey->hKey = (HKEY)1;
-      lphRootKey->lpSubKey = RootKeyName;
-      lphRootKey->dwType = 0;
-      lphRootKey->lpValue = NULL;
-      lphRootKey->lpSubLvl = lphRootKey->lpNextKey = lphRootKey->lpPrevKey = NULL;
-
-      hNewKey = GlobalAlloc(GMEM_MOVEABLE,sizeof(KEYSTRUCT));
-      lphTopKey = (LPKEYSTRUCT) GlobalLock(hNewKey);
-      if (lphTopKey == NULL) {
-        printf("SHELL_RegCheckForRoot: Couldn't allocate top key!\n");
-        return ERROR_OUTOFMEMORY;
-      }
-      lphTopKey->hKey = 0;
-      lphTopKey->lpSubKey = TopKeyName;
-      lphTopKey->dwType = 0;
-      lphTopKey->lpValue = NULL;
-      lphTopKey->lpSubLvl = lphRootKey;
-      lphTopKey->lpNextKey = lphTopKey->lpPrevKey = NULL;
-
-      dprintf_reg(stddeb,"SHELL_RegCheckForRoot: Root/Top created\n");
+        return FALSE;
     }
-    return ERROR_SUCCESS;
+    lphRootKey->hKey = (HKEY)1;
+    lphRootKey->lpSubKey = RootKeyName;
+    lphRootKey->dwType = 0;
+    lphRootKey->lpValue = NULL;
+    lphRootKey->lpSubLvl = lphRootKey->lpNextKey = lphRootKey->lpPrevKey = NULL;
+    
+    hNewKey = GlobalAlloc(GMEM_MOVEABLE,sizeof(KEYSTRUCT));
+    lphTopKey = (LPKEYSTRUCT) GlobalLock(hNewKey);
+    if (lphTopKey == NULL) {
+        printf("SHELL_RegCheckForRoot: Couldn't allocate top key!\n");
+        return FALSE;
+    }
+    lphTopKey->hKey = 0;
+    lphTopKey->lpSubKey = TopKeyName;
+    lphTopKey->dwType = 0;
+    lphTopKey->lpValue = NULL;
+    lphTopKey->lpSubLvl = lphRootKey;
+    lphTopKey->lpNextKey = lphTopKey->lpPrevKey = NULL;
+
+    dprintf_reg(stddeb,"SHELL_RegCheckForRoot: Root/Top created\n");
+
+    return TRUE;
 }
 
 /* FIXME: the loading and saving of the registry database is rather messy.
  * bad input (while reading) may crash wine.
  */
 void
-_DumpLevel(FILE *f,LPKEYSTRUCT lpTKey,int tabs) {
+_DumpLevel(FILE *f,LPKEYSTRUCT lpTKey,int tabs)
+{
 	LPKEYSTRUCT	lpKey;
 
 	lpKey=lpTKey->lpSubLvl;
@@ -86,7 +86,8 @@
 }
 
 static void
-_SaveKey(HKEY hKey,char *where) {
+_SaveKey(HKEY hKey,char *where)
+{
 	FILE		*f;
 	LPKEYSTRUCT	lpKey;
 
@@ -106,7 +107,8 @@
 }
 
 void
-SHELL_SaveRegistry(void) {
+SHELL_SaveRegistry(void)
+{
 	/* FIXME: 
 	 * -implement win95 additional keytypes here
 	 * (HKEY_LOCAL_MACHINE,HKEY_CURRENT_USER or whatever)
@@ -117,7 +119,8 @@
 
 #define BUFSIZE	256
 void
-_LoadLevel(FILE *f,LPKEYSTRUCT lpKey,int tabsexp,char *buf) {
+_LoadLevel(FILE *f,LPKEYSTRUCT lpKey,int tabsexp,char *buf)
+{
 	int		i;
 	char		*s,*t;
 	HKEY		hNewKey;
@@ -184,7 +187,8 @@
 }
 
 void
-_LoadKey(HKEY hKey,char *from) {
+_LoadKey(HKEY hKey,char *from) 
+{
 	FILE		*f;
 	LPKEYSTRUCT	lpKey;
 	char		buf[BUFSIZE]; /* FIXME: long enough? */
@@ -204,12 +208,8 @@
 }
 
 void
-SHELL_LoadRegistry(void) {
-	DWORD	dwRet;
-
-	dwRet=SHELL_RegCheckForRoot();
-	if (dwRet!=ERROR_SUCCESS) 
-		return;/*very bad magic, if we can't even allocate the rootkeys*/
+SHELL_LoadRegistry(void) 
+{
 	_LoadKey((HKEY)HKEY_CLASSES_ROOT,"/tmp/winereg");
 }
 
@@ -221,10 +221,7 @@
 	LPKEYSTRUCT	lpKey,lpNextKey;
 	LPCSTR		ptr;
 	char		str[128];
-	LONG            dwRet;
 
-        dwRet = SHELL_RegCheckForRoot();
-        if (dwRet != ERROR_SUCCESS) return dwRet;
 	dprintf_reg(stddeb, "RegOpenKey(%08lX, %p='%s', %p)\n",
 				       (DWORD)hKey, lpSubKey, lpSubKey, lphKey);
 	if (lphKey == NULL) return ERROR_INVALID_PARAMETER;
@@ -274,12 +271,9 @@
 	LPKEYSTRUCT	lpNewKey;
 	LPKEYSTRUCT	lpKey;
 	LPKEYSTRUCT	lpPrevKey;
-	LONG		dwRet;
 	LPCSTR		ptr;
 	char		str[128];
 
-	dwRet = SHELL_RegCheckForRoot();
-        if (dwRet != ERROR_SUCCESS) return dwRet;
 	dprintf_reg(stddeb, "RegCreateKey(%08lX, '%s', %p)\n",	(DWORD)hKey, lpSubKey, lphKey);
 	if (lphKey == NULL) return ERROR_INVALID_PARAMETER;
         switch((DWORD)hKey) {
@@ -439,11 +433,8 @@
 LONG RegEnumKey(HKEY hKey, DWORD dwSubKey, LPSTR lpBuf, DWORD dwSize)
 {
 	LPKEYSTRUCT	lpKey;
-	LONG		dwRet;
 	LONG            len;
 
-	dwRet = SHELL_RegCheckForRoot();
-        if (dwRet != ERROR_SUCCESS) return dwRet;
 	dprintf_reg(stddeb, "RegEnumKey(%08lX, %ld)\n", (DWORD)hKey, dwSubKey);
 	if (lpBuf == NULL) return ERROR_INVALID_PARAMETER;
         switch((DWORD)hKey) {
@@ -478,11 +469,12 @@
  */
 void DragAcceptFiles(HWND hWnd, BOOL b)
 {
- /* flips WS_EX_ACCEPTFILES bit according to the value of b (TRUE or FALSE) */
+    /* flips WS_EX_ACCEPTFILES bit according to the value of b */
+    dprintf_reg(stddeb,"DragAcceptFiles("NPFMT", %u) old exStyle %08lx\n",
+		hWnd,b,GetWindowLong(hWnd,GWL_EXSTYLE));
 
- dprintf_reg(stddeb,"DragAcceptFiles("NPFMT", %u) old exStyle %08lx\n",hWnd,b,GetWindowLong(hWnd,GWL_EXSTYLE));
-
- SetWindowLong(hWnd,GWL_EXSTYLE,GetWindowLong(hWnd,GWL_EXSTYLE) | b*(LONG)WS_EX_ACCEPTFILES); 
+    SetWindowLong(hWnd,GWL_EXSTYLE,
+		  GetWindowLong(hWnd,GWL_EXSTYLE) | b*(LONG)WS_EX_ACCEPTFILES);
 }
 
 
@@ -491,42 +483,42 @@
  */
 UINT DragQueryFile(HDROP hDrop, WORD wFile, LPSTR lpszFile, WORD wLength)
 {
- /* hDrop is a global memory block allocated with GMEM_SHARE 
-    with DROPFILESTRUCT as a header and filenames following
-    it, zero length filename is in the end */       
-
- LPDROPFILESTRUCT lpDropFileStruct;
- LPSTR		  lpCurrent;
- WORD		  i;
-
- dprintf_reg(stddeb,"DragQueryFile("NPFMT", %i, %p, %u)\n",
-                           hDrop,wFile,lpszFile,wLength);
-
- lpDropFileStruct = (LPDROPFILESTRUCT) GlobalLock(hDrop); 
- if(!lpDropFileStruct)
+    /* hDrop is a global memory block allocated with GMEM_SHARE 
+     * with DROPFILESTRUCT as a header and filenames following
+     * it, zero length filename is in the end */       
+    
+    LPDROPFILESTRUCT lpDropFileStruct;
+    LPSTR lpCurrent;
+    WORD  i;
+    
+    dprintf_reg(stddeb,"DragQueryFile("NPFMT", %i, %p, %u)\n",
+		hDrop,wFile,lpszFile,wLength);
+    
+    lpDropFileStruct = (LPDROPFILESTRUCT) GlobalLock(hDrop); 
+    if(!lpDropFileStruct)
     {
-       dprintf_reg(stddeb,"DragQueryFile: unable to lock handle!\n");
-       return 0;
+	dprintf_reg(stddeb,"DragQueryFile: unable to lock handle!\n");
+	return 0;
     } 
- lpCurrent = (LPSTR) lpDropFileStruct + lpDropFileStruct->wSize;
-
- i = 0;
- while(i++ < wFile)
+    lpCurrent = (LPSTR) lpDropFileStruct + lpDropFileStruct->wSize;
+    
+    i = 0;
+    while (i++ < wFile)
     {
-       while(*lpCurrent++);  /* skip filename */
-       if(!*lpCurrent) 
-          return (wFile == 0xFFFF)? i : 0;  
+	while (*lpCurrent++);  /* skip filename */
+	if (!*lpCurrent) 
+	    return (wFile == 0xFFFF) ? i : 0;  
     }
-
- i = strlen(lpCurrent); 
- if(!lpszFile) return i+1;   /* needed buffer size */
-
- i = ( wLength > i)? i : wLength-1;
- strncpy(lpszFile,lpCurrent,i);
- lpszFile[i]='\0';
-
- GlobalUnlock(hDrop);
- return i;
+    
+    i = strlen(lpCurrent); 
+    if (!lpszFile) return i+1;   /* needed buffer size */
+    
+    i = (wLength > i) ? i : wLength-1;
+    strncpy(lpszFile, lpCurrent, i);
+    lpszFile[i] = '\0';
+    
+    GlobalUnlock(hDrop);
+    return i;
 }
 
 
@@ -535,7 +527,7 @@
  */
 void DragFinish(HDROP h)
 {
- GlobalFree((HGLOBAL)h);
+    GlobalFree((HGLOBAL)h);
 }
 
 
@@ -544,16 +536,16 @@
  */
 BOOL DragQueryPoint(HDROP hDrop, POINT FAR *p)
 {
- LPDROPFILESTRUCT lpDropFileStruct;  
- BOOL             bRet;
+    LPDROPFILESTRUCT lpDropFileStruct;  
+    BOOL             bRet;
 
- lpDropFileStruct = (LPDROPFILESTRUCT) GlobalLock(hDrop);
+    lpDropFileStruct = (LPDROPFILESTRUCT) GlobalLock(hDrop);
 
- memcpy(p,&lpDropFileStruct->ptMousePos,sizeof(POINT));
- bRet = lpDropFileStruct->fInNonClientArea;
+    memcpy(p,&lpDropFileStruct->ptMousePos,sizeof(POINT));
+    bRet = lpDropFileStruct->fInNonClientArea;
 
- GlobalUnlock(hDrop);
- return bRet; 
+    GlobalUnlock(hDrop);
+    return bRet;
 }
 
 
diff --git a/misc/spy.c b/misc/spy.c
index 6c9692a..e547e1c 100644
--- a/misc/spy.c
+++ b/misc/spy.c
@@ -25,7 +25,7 @@
     "WM_CREATE",	
     "WM_DESTROY",    
     "WM_MOVE",
-    "WM_UNUSED0",
+    "WM_SIZEWAIT",
     "WM_SIZE",
     "WM_ACTIVATE",
     "WM_SETFOCUS",
@@ -62,7 +62,7 @@
     "WM_PAINTICON",
     "WM_ICONERASEBKGND",
     "WM_NEXTDLGCTL",
-    "WM_UNUSED4",
+    "WM_ALTTABACTIVE",
     "WM_SPOOLERSTATUS",
     "WM_DRAWITEM",
     "WM_MEASUREITEM",
@@ -70,9 +70,19 @@
     "WM_VKEYTOITEM",
     "WM_CHARTOITEM",
     "WM_SETFONT",		/* 0x30 */
-    "WM_GETFONT", NULL, NULL, NULL, NULL, NULL, 
-    "WM_QUERYDRAGICON", NULL, 
-    "WM_COMPAREITEM", NULL, NULL, NULL, NULL, NULL, NULL,
+    "WM_GETFONT",
+    "WM_SETHOTKEY", 
+    "WM_GETHOTKEY", 
+    "WM_FILESYSCHANGE", 
+    "WM_ISACTIVEICON",
+    "WM_QUERYPARKICON",
+    "WM_QUERYDRAGICON",
+    "WM_QUERYSAVESTATE",
+    "WM_COMPAREITEM", 
+    "WM_TESTING", NULL, 
+    "WM_OTHERWINDOWCREATED", 
+    "WM_OTHERWINDOWDESTROYED", 
+    "WM_ACTIVATESHELLWINDOW", NULL,
 
     NULL, 		        /* 0x40 */
     "WM_COMPACTING", NULL, NULL, 
@@ -101,7 +111,8 @@
     "WM_NCPAINT",          	/* 0x0085 */
     "WM_NCACTIVATE",       	/* 0x0086 */
     "WM_GETDLGCODE",		/* 0x0087 */
-    "WM_SYNCPAINT", NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+    "WM_SYNCPAINT", 
+    "WM_SYNCTASK", NULL, NULL, NULL, NULL, NULL, NULL,
 
     /* 0x0090 */
     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
@@ -149,7 +160,10 @@
     "WM_SYSCHAR",		/* 0x0106 */
     "WM_SYSDEADCHAR",		/* 0x0107 */
     "WM_KEYLAST",		/* 0x0108 */
-    NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+    NULL, 
+    "WM_CONVERTREQUEST",
+    "WM_CONVERTRESULT", 
+    "WM_INTERIM", NULL, NULL, NULL,
 
     "WM_INITDIALOG",		/* 0x0110 */
     "WM_COMMAND",		/* 0x0111 */
@@ -169,8 +183,7 @@
     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
 
     /* 0x0130 */
-    NULL, 
-    "wm_lbtrackpoint", 
+    NULL, "wm_lbtrackpoint", 
     NULL, NULL, NULL, NULL, NULL, NULL,
     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
 
@@ -237,7 +250,8 @@
     "WM_PARENTNOTIFY",		/* 0x0210 */
     "WM_ENTERMENULOOP",         /* 0x0211 */
     "WM_EXITMENULOOP",          /* 0x0212 */
-    NULL, NULL, NULL, NULL, NULL,
+    "WM_NEXTMENU", 		/* 0x0213 */
+                            NULL, NULL, NULL, NULL,
     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
 
     "WM_MDICREATE",             /* 0x0220 */
@@ -344,10 +358,11 @@
     /* 0x0380 */
     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+
     "WM_COALESCE_FIRST", 
+          NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+    NULL, NULL, NULL, NULL, NULL, NULL, NULL, 
     "WM_COALESCE_LAST", 
-                NULL, NULL, NULL, NULL, NULL, NULL,
-    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
 
     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
diff --git a/misc/winsocket.c b/misc/winsocket.c
index 318c38e..536e5db 100644
--- a/misc/winsocket.c
+++ b/misc/winsocket.c
@@ -35,6 +35,10 @@
 static FARPROC BlockFunction;
 static fd_set fd_in_use;
 
+#ifdef __FreeBSD__
+extern int h_errno;
+#endif /* __FreeBSD__ */
+
 struct ipc_packet {
 	long	mtype;
 	HANDLE	handle;
@@ -48,7 +52,8 @@
 #endif
 
 #define IPC_PACKET_SIZE (sizeof(struct ipc_packet) - sizeof(long))
-#define MTYPE 0xb0b0eb05
+/*#define MTYPE 0xb0b0eb05*/
+#define MTYPE 0x30b0eb05
 
 /* These structures are Win16 only */
 
@@ -831,23 +836,32 @@
 
 static void recv_message(int sig)
 {
-	struct ipc_packet message;
+	static struct ipc_packet message;
+	static int message_is_valid = 0;
+	BOOL result;
 
-/* FIXME: something about no message of desired type */
-	if (msgrcv(wine_key, (struct msgbuf*)&(message), 
-		   IPC_PACKET_SIZE, MTYPE, IPC_NOWAIT) == -1)
-		perror("wine: msgrcv");
-
-	fprintf(stderr, 
-		"WSA: PostMessage (hwnd "NPFMT", wMsg %d, wParam "NPFMT", lParam %ld)\n",
-		message.hWnd,
-		message.wMsg,
-		message.handle,
-		message.lParam);
-
-	PostMessage(message.hWnd, message.wMsg, (WPARAM)message.handle, message.lParam);
-		
 	signal(SIGUSR1, recv_message);
+	while (1) {
+
+		if (!message_is_valid) {
+			if (msgrcv(wine_key, (struct msgbuf*)&(message), 
+				   IPC_PACKET_SIZE, MTYPE, IPC_NOWAIT) == -1) {
+				perror("wine: msgrcv");
+				break;
+			}
+		}
+
+		result = PostMessage(message.hWnd, message.wMsg,
+				     (WPARAM)message.handle, message.lParam);
+		if (result == FALSE) {
+			message_is_valid = 1;
+			break;
+		}
+		else
+			message_is_valid = 0;
+		
+	}
+		
 }
 
 
@@ -861,13 +875,8 @@
 	message.wMsg = wMsg;
 	message.lParam = lParam;
 
-	fprintf(stderr, 
-		"WSA: send (hwnd "NPFMT", wMsg %d, handle "NPFMT", lParam %ld)\n",
-		hWnd, wMsg, handle, lParam);
-	
-/* FIXME: something about invalid argument */
 	if (msgsnd(wine_key, (struct msgbuf*)&(message),  
-		   IPC_PACKET_SIZE, IPC_NOWAIT) == -1)
+		   IPC_PACKET_SIZE, 0/*IPC_NOWAIT*/) == -1)
 		perror("wine: msgsnd");
 		
 	kill(getppid(), SIGUSR1);
@@ -1136,12 +1145,14 @@
         "WINE Sockets",
 #ifdef linux
         "LINUX/i386",
-#endif
-#ifdef __NetBSD__
+#elif defined(__NetBSD__)
         "NetBSD/i386",
-#endif
-#ifdef sunos
+#elif defined(sunos)
 	"SunOS",
+#elif defined(__FreeBSD__)
+	"FreeBSD",
+#else
+	"Unknown",
 #endif
         128,
 	1024,
diff --git a/multimedia/mcistring.c b/multimedia/mcistring.c
index 3ea208f..dc99c2a 100644
--- a/multimedia/mcistring.c
+++ b/multimedia/mcistring.c
@@ -57,16 +57,10 @@
  * for use in mciSendString()
  */
 #define _MCI_STR(s) do {\
-	int __l__;\
 	dprintf_mci(stddeb,"->returns \"%s\"",s);\
 	if (lpstrReturnString) {\
-		__l__=strlen(s);\
-		if(__l__>uReturnLength) {\
-			strncpy(lpstrReturnString,s,uReturnLength-1);\
-			lpstrReturnString[uReturnLength-1]='\0';\
-		} else\
-			strcpy(lpstrReturnString,s);\
-		dprintf_mci(stddeb,"-->\"%s\"\n",lpstrReturnString);\
+	    lstrcpyn(lpstrReturnString,s,uReturnLength);\
+	    dprintf_mci(stddeb,"-->\"%s\"\n",lpstrReturnString);\
 	}\
 } while(0)
 
diff --git a/multimedia/mmsystem.c b/multimedia/mmsystem.c
index 81f1c1b..152ee9a 100644
--- a/multimedia/mmsystem.c
+++ b/multimedia/mmsystem.c
@@ -284,7 +284,6 @@
 BOOL mciGetErrorString (DWORD wError, LPSTR lpstrBuffer, UINT uLength)
 {
 	LPSTR	msgptr;
-	int		maxbuf;
 	dprintf_mmsys(stddeb, "mciGetErrorString(%08lX, %p, %d);\n", wError, lpstrBuffer, uLength);
 	if ((lpstrBuffer == NULL) || (uLength < 1)) return(FALSE);
 	lpstrBuffer[0] = '\0';
@@ -534,10 +533,8 @@
 			msgptr = "Unknown MCI Error !\n";
 			break;
 		}
-	maxbuf = MIN(uLength - 1, strlen(msgptr));
-	if (maxbuf > 0) strncpy(lpstrBuffer, msgptr, maxbuf);
-	lpstrBuffer[maxbuf + 1] = '\0';
-	return(TRUE);
+        lstrcpyn(lpstrBuffer, msgptr, uLength);
+	return TRUE;
 }
 
 
@@ -708,12 +705,10 @@
 					ptr += len;
 					InstalledListLen += len;
 					InstalledCount++;
-					}
 				}
-			if (lpParms->dwRetSize < InstalledListLen) {
-				strncpy(lpstrReturn, lpInstallNames, lpParms->dwRetSize - 2);
-				lpstrReturn[lpParms->dwRetSize - 1] = '\0';
-				}
+			}
+			if (lpParms->dwRetSize < InstalledListLen)
+				lstrcpyn(lpstrReturn, lpInstallNames, lpParms->dwRetSize - 1);
 			else
 				strcpy(lpstrReturn, lpInstallNames);
 			return 0;
@@ -781,7 +776,7 @@
 }
 
 /**************************************************************************
-* 				mciGetDeviceID			[MMSYSTEM.703]
+* 				mciGetDeviceID	       	[MMSYSTEM.703]
 */
 UINT mciGetDeviceID (LPCSTR lpstrName)
 {
@@ -860,12 +855,11 @@
 
 
 /**************************************************************************
-* 				midiGetErrorText 		[internal]
+* 				midiGetErrorText       	[internal]
 */
 UINT midiGetErrorText(UINT uError, LPSTR lpText, UINT uSize)
 {
 	LPSTR	msgptr;
-	int		maxbuf;
 	if ((lpText == NULL) || (uSize < 1)) return(FALSE);
 	lpText[0] = '\0';
 	switch(uError) {
@@ -901,17 +895,15 @@
 			msgptr = "Unknown MIDI Error !\n";
 			break;
 		}
-	maxbuf = MIN(uSize - 1, strlen(msgptr));
-	if (maxbuf > 0) strncpy(lpText, msgptr, maxbuf);
-	lpText[maxbuf + 1] = '\0';
-	return(TRUE);
+	lstrcpyn(lpText, msgptr, uSize);
+	return TRUE;
 }
 
 /**************************************************************************
-* 				midiOutOpen			[MMSYSTEM.204]
+* 				midiOutOpen    		[MMSYSTEM.204]
 */
 UINT midiOutOpen(HMIDIOUT FAR* lphMidiOut, UINT uDeviceID,
-    DWORD dwCallback, DWORD dwInstance, DWORD dwFlags)
+		 DWORD dwCallback, DWORD dwInstance, DWORD dwFlags)
 {
 	HMIDI	hMidiOut;
 	LPMIDIOPENDESC	lpDesc;
@@ -925,7 +917,7 @@
 		dprintf_mmsys(stddeb, "midiOutOpen	// MIDI_MAPPER mode requested !\n");
 		bMapperFlg = TRUE;
 		uDeviceID = 0;
-		}
+	}
 	hMidiOut = USER_HEAP_ALLOC(sizeof(MIDIOPENDESC));
 	if (lphMidiOut != NULL) *lphMidiOut = hMidiOut;
 	lp16Desc = (LPMIDIOPENDESC) USER_HEAP_SEG_ADDR(hMidiOut);
@@ -1300,7 +1292,6 @@
 UINT waveGetErrorText(UINT uError, LPSTR lpText, UINT uSize)
 {
 	LPSTR	msgptr;
-	int		maxbuf;
 	dprintf_mmsys(stddeb, "waveGetErrorText(%04X, %p, %d);\n", uError, lpText, uSize);
 	if ((lpText == NULL) || (uSize < 1)) return(FALSE);
 	lpText[0] = '\0';
@@ -1357,10 +1348,8 @@
 			msgptr = "Unknown MMSYSTEM Error !\n";
 			break;
 		}
-	maxbuf = MIN(uSize - 1, strlen(msgptr));
-	if (maxbuf > 0) strncpy(lpText, msgptr, maxbuf);
-	lpText[maxbuf + 1] = '\0';
-	return(TRUE);
+	lstrcpyn(lpText, msgptr, uSize);
+	return TRUE;
 }
 
 /**************************************************************************
diff --git a/objects/bitblt.c b/objects/bitblt.c
index 89ae404..d6e182c 100644
--- a/objects/bitblt.c
+++ b/objects/bitblt.c
@@ -1249,8 +1249,8 @@
 /***********************************************************************
  *           BitBlt    (GDI.34)
  */
-BOOL BitBlt( HDC hdcDst, short xDst, short yDst, short width, short height,
-	     HDC hdcSrc, short xSrc, short ySrc, DWORD rop )
+BOOL BitBlt( HDC hdcDst, INT xDst, INT yDst, INT width, INT height,
+	     HDC hdcSrc, INT xSrc, INT ySrc, DWORD rop )
 {
     DC *dcDst, *dcSrc;
 
diff --git a/objects/font.c b/objects/font.c
index be7ac76..407d15e 100644
--- a/objects/font.c
+++ b/objects/font.c
@@ -484,8 +484,7 @@
     if (!dc) return 0;
     if (!(font = (FONTOBJ *) GDI_GetObjPtr( dc->w.hFont, FONT_MAGIC )))
         return 0;
-    strncpy( name, font->logfont.lfFaceName, count );
-    name[count-1] = '\0';
+    lstrcpyn( name, font->logfont.lfFaceName, count );
     return strlen(name);
 }
 
diff --git a/objects/gdiobj.c b/objects/gdiobj.c
index 7f0e6a3..bde259b 100644
--- a/objects/gdiobj.c
+++ b/objects/gdiobj.c
@@ -417,7 +417,7 @@
   HANDLE       	hLog;
   int	       	nRet = 0;
   
-  if (lpEnumFunc == NULL) {
+  if (lpEnumFunc == 0) {
     fprintf(stderr,"EnumObjects // Bad EnumProc callback address !\n");
     return 0;
   }
diff --git a/objects/metafile.c b/objects/metafile.c
index 6cc68b6..297f514 100644
--- a/objects/metafile.c
+++ b/objects/metafile.c
@@ -245,7 +245,8 @@
 	return FALSE;
 
     /* create the handle table */
-    hHT = GlobalAlloc(GMEM_MOVEABLE, sizeof(HANDLETABLE) * mh->mtNoObjects);
+    hHT = GlobalAlloc(GMEM_MOVEABLE|GMEM_ZEROINIT,
+		      sizeof(HANDLETABLE) * mh->mtNoObjects);
     ht = (HANDLETABLE *)GlobalLock(hHT);
 
     /* loop through metafile playing records */
diff --git a/rc/winerc.c b/rc/winerc.c
index 4e1aa52..c01227f 100644
--- a/rc/winerc.c
+++ b/rc/winerc.c
@@ -12,7 +12,7 @@
 #include <unistd.h>
 #include <string.h>
 #include <windows.h>
-#include <neexe.h>
+/* #include <neexe.h> */
 #include "parser.h"
 #include "y.tab.h"
 
@@ -539,16 +539,7 @@
     fprintf( header, "/* %s\n"
                      " * This file is automatically generated. Do not edit!\n"
                      " */\n\n"
-                     "#ifndef __RESOURCE_DEFINED__\n"
-                     "#define __RESOURCE_DEFINED__\n"
-                     "struct resource\n"
-                     "{\n"
-                     "    int id, type;\n"
-                     "    char *name;\n"
-                     "    unsigned char *bytes;\n"
-                     "    unsigned int size;\n"
-                     "};\n"
-                     "#endif\n", hname );
+                     "#include \"resource.h\"\n", hname );
 
     /* Declare the resources */
 
@@ -583,15 +574,15 @@
         int type;
         switch(it->type)
         {
-        case acc:type=NE_RSCTYPE_ACCELERATOR;break;
-        case bmp:type=NE_RSCTYPE_BITMAP;break;
-        case cur:type=NE_RSCTYPE_CURSOR;break;
-        case dlg:type=NE_RSCTYPE_DIALOG;break;
-        case fnt:type=NE_RSCTYPE_FONT;break;
-        case ico:type=NE_RSCTYPE_ICON;break;
-        case men:type=NE_RSCTYPE_MENU;break;
-        case rdt:type=NE_RSCTYPE_RCDATA;break;
-        case str:type=NE_RSCTYPE_STRING;break;
+        case acc:type=RT_ACCELERATOR;break;
+        case bmp:type=RT_BITMAP;break;
+        case cur:type=RT_CURSOR;break;
+        case dlg:type=RT_DIALOG;break;
+        case fnt:type=RT_FONT;break;
+        case ico:type=RT_ICON;break;
+        case men:type=RT_MENU;break;
+        case rdt:type=RT_RCDATA;break;
+        case str:type=RT_STRING;break;
         default:fprintf(stderr,"Unknown restype\n");type=-1;break;
         }
         if(it->n_type)
@@ -610,6 +601,22 @@
     for (it=top;it;it=it->next)
         fprintf( code, "  &%s,\n", get_resource_name(it) );
     fprintf( code, "  0\n};\n" );
+
+        /* Perform autoregistration */
+        fprintf( code, 
+                "#ifdef WINELIB\n"
+                "static void DoIt() WINE_CONSTRUCTOR;\n"
+                "static void DoIt()\n"
+                "{\n"
+                "\tLIBRES_RegisterResources(%sTable);\n"
+                "}\n\n"
+                "#ifndef HAVE_WINE_CONSTRUCTOR\n"
+                "void LIBWINE_Register_%s(){\n"
+                "\tDoIt();\n"
+                "}\n"
+                "#endif\n"
+                "#endif /*WINELIB*/\n"
+                ,prefix,prefix);
 }
 
 gen_res* make_font(gen_res* res)
diff --git a/toolkit/Makefile.in b/toolkit/Makefile.in
index a1e6cb0..46befbf 100644
--- a/toolkit/Makefile.in
+++ b/toolkit/Makefile.in
@@ -30,7 +30,7 @@
 	echo WINDOWS_H_ENDS_HERE >>hello3res.rct
 	cat hello3res.rc  >>hello3res.rct
 	$(CC) $(ALLCFLAGS) -E -x c -P hello3res.rct | sed -e '1,/^WINDOWS_H_ENDS_HERE/d' | ../rc/winerc -o hello3res -v -p hello3
-	gcc -c hello3res.c
+	gcc -c $(ALLCFLAGS) hello3res.c
 
 @MAKE_RULES@
 
diff --git a/toolkit/heap.c b/toolkit/heap.c
index 40e52cb..7bb3afd 100644
--- a/toolkit/heap.c
+++ b/toolkit/heap.c
@@ -108,7 +108,10 @@
 
 HANDLE LocalFree (HANDLE hMem)
 {
-    void **m = HEAP_FindSlot (hMem);
+    void **m;
+  if(!hMem)
+    return 0;
+  m = HEAP_FindSlot (hMem);
 
     free (*m);
     *m = 0;
@@ -232,7 +235,10 @@
 
 HANDLE HEAP_Free (HANDLE hMem)
 {
-  HeapData* m=(HeapData*)hMem;
+  HeapData* m;
+  if(!hMem)
+    return 0;
+  m=(HeapData*)hMem;
   free(m-1);
   return 0;
 }
@@ -296,7 +302,6 @@
   return HEAP_Size(hMem);
 }
 
-
 BOOL LocalUnlock (HANDLE hMem)
 {
   return 0;
diff --git a/toolkit/hello3.c b/toolkit/hello3.c
index 90fadb1..5b9cd51 100644
--- a/toolkit/hello3.c
+++ b/toolkit/hello3.c
@@ -87,7 +87,7 @@
 
     wnd = CreateWindow ("class", "Test app", WS_OVERLAPPEDWINDOW,
 			CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, 0, 
-			LoadMenuIndirect(hello3_MENU_MAIN.bytes), inst, 0);
+			LoadMenu(inst,"MAIN"), inst, 0);
     ShowWindow (wnd, show);
     UpdateWindow (wnd);
 
diff --git a/toolkit/libres.c b/toolkit/libres.c
index c983ff6..ae23b41 100644
--- a/toolkit/libres.c
+++ b/toolkit/libres.c
@@ -5,19 +5,12 @@
  */
 
 #include <stdio.h>
-#include "windows.h"
-
-struct resource /* This needs to coincide with what winerc generates. */
-{               /* It should really only appear in one place.         */
-  int id, type;
-  char *name;
-  unsigned char *bytes;
-  unsigned int size;
-};
+#include <stdlib.h>
+#include "libres.h"
 
 typedef struct RLE
 {
-  struct resource** Resources  /* NULL-terminated array of pointers */
+  struct resource** Resources;  /* NULL-terminated array of pointers */
   struct RLE* next;
 } ResListE;
 
@@ -28,11 +21,11 @@
   ResListE** Curr;
   ResListE* n;
   for(Curr=&ResourceList; *Curr; Curr=&((*Curr)->next)) { }
-  n=malloc(sizeof(ResListE));
+  n=xmalloc(sizeof(ResListE));
   if(n)
   {
-    n.Resources=Res;
-    n.next=NULL;
+    n->Resources=Res;
+    n->next=NULL;
     *Curr=n;
   }
   else
@@ -42,9 +35,48 @@
 /**********************************************************************
  *	    LIBRES_FindResource    
  */
-HRSRC LIBRES_FindResource( HMODULE hModule, SEGPTR name, SEGPTR type )
+HRSRC LIBRES_FindResource( HINSTANCE hModule, LPCSTR name, LPCSTR type )
 {
-  WINELIB_UNIMP("LIBRES_FindResource()");
+  int nameid=0,typeid;
+  ResListE* ResBlock;
+  struct resource** Res;
+
+  if(HIWORD(name))
+  {
+    if(*name=='#')
+    {
+      nameid=atoi(name+1);
+      name=NULL;
+    }
+  }
+  else
+  {
+    nameid=LOWORD(name);
+    name=NULL;
+  }
+  if(HIWORD(type))
+  {
+    if(*type=='#')
+      typeid=atoi(type+1);
+    else
+    {
+      WINELIB_UNIMP("LIBRES_FindResource(*,*,type=string)");
+      return 0;
+    }
+  }
+  else
+    typeid=LOWORD(type);
+  
+  for(ResBlock=ResourceList; ResBlock; ResBlock=ResBlock->next)
+    for(Res=ResBlock->Resources; *Res; Res++)
+      if(name)
+      {
+	if((*Res)->type==typeid && !strcmp((*Res)->name,name))
+	  return (HRSRC)*Res;
+      }
+      else
+	if((*Res)->type==typeid && (*Res)->id==nameid)
+	  return (HRSRC)*Res;
   return 0;
 }
 
@@ -52,7 +84,7 @@
 /**********************************************************************
  *	    LIBRES_LoadResource    
  */
-HGLOBAL LIBRES_LoadResource( HMODULE hModule, HRSRC hRsrc )
+HGLOBAL LIBRES_LoadResource( HINSTANCE hModule, HRSRC hRsrc )
 {
   return (HGLOBAL)(((struct resource*)hRsrc)->bytes);
 }
@@ -61,7 +93,7 @@
 /**********************************************************************
  *	    LIBRES_LockResource    
  */
-LPVOID LIBRES_LockResource( HMODULE hModule, HGLOBAL handle )
+LPVOID LIBRES_LockResource( HGLOBAL handle )
 {
   return handle;
 }
@@ -70,9 +102,10 @@
 /**********************************************************************
  *	    LIBRES_FreeResource    
  */
-BOOL LIBRES_FreeResource( HMODULE hModule, HGLOBAL handle )
+BOOL LIBRES_FreeResource( HGLOBAL handle )
 {
-  return 0;
+  WINELIB_UNIMP("LIBRES_FreeResource()");
+  return 0; /* Obsolete in Win32 */
 }
 
 
@@ -82,25 +115,25 @@
 INT LIBRES_AccessResource( HINSTANCE hModule, HRSRC hRsrc )
 {
   WINELIB_UNIMP("LIBRES_AccessResource()");
-  return -1;
+  return -1; /* Obsolete in Win32 */
 }
 
 
 /**********************************************************************
  *	    LIBRES_SizeofResource    
  */
-DWORD LIBRES_SizeofResource( HMODULE hModule, HRSRC hRsrc )
+DWORD LIBRES_SizeofResource( HINSTANCE hModule, HRSRC hRsrc )
 {
-  return (HGLOBAL)(((struct resource*)hRsrc)->size);
+  return (DWORD)(((struct resource*)hRsrc)->size);
 }
 
 
 /**********************************************************************
  *	    LIBRES_AllocResource    
  */
-HGLOBAL LIBRES_AllocResource( HMODULE hModule, HRSRC hRsrc, DWORD size )
+HGLOBAL LIBRES_AllocResource( HINSTANCE hModule, HRSRC hRsrc, DWORD size )
 {
   WINELIB_UNIMP("LIBRES_AllocResource()");
-  return 0;
+  return 0; /* Obsolete in Win32 */
 }
 
diff --git a/tools/build.c b/tools/build.c
index 499f688..53a0150 100644
--- a/tools/build.c
+++ b/tools/build.c
@@ -789,7 +789,29 @@
         case TYPE_CDECL:
 	    varargs=0;
             argc=strlen(fdp->arg_types);
-	    printf( "void %s_%d(", UpperDLLName, i);
+	    if(odp->type == TYPE_STDCALL)
+	    {
+		/* Output a function prototype with stdcall attribute */
+		printf( "void %s_%d(", UpperDLLName, i);
+		for(argno=0;argno<argc;argno++)
+		{
+		    switch(fdp->arg_types[argno])
+		    {
+		    case 'p': printf( "void *");break;
+		    case 'l': printf( "int ");break;
+		    case '.': printf( "... ");varargs=argno;break;
+		    default:
+			fprintf(stderr, "Not supported argument type %c\n",
+				fdp->arg_types[argno]);
+			exit(1);
+		    }
+		    if(fdp->arg_types[argno]!='.') putchar( 'a'+argno );
+		    if (argno!=argc-1) putchar( ',' );
+		}
+		printf( ") __attribute((stdcall));" );
+	    }
+
+            printf( "void %s_%d(", UpperDLLName, i);
             for(argno=0;argno<argc;argno++)
             {
                 switch(fdp->arg_types[argno])
@@ -806,7 +828,6 @@
                 if (argno!=argc-1) putchar( ',' );
             }
             printf( ")" );
-	    if(odp->type == TYPE_STDCALL) printf(" /*__attribute__ ((stdcall))*/");
             printf( "\n{\n" );
 	    if (varargs) printf( "\tva_list valist;\n\n\tva_start(valist, %c);",
 	    			 'a'+varargs-1 );
diff --git a/win32/advapi.c b/win32/advapi.c
index be633d8..7c9baf2 100644
--- a/win32/advapi.c
+++ b/win32/advapi.c
@@ -1,14 +1,14 @@
 /*
  * Win32 advapi functions
  *
- * Copyright 1995 Martin von Loewis
+ * Copyright 1995 Sven Verdoolaege
  */
 
 #include <stdio.h>
 #include <unistd.h>
 #include "windows.h"
 #include "winerror.h"
-/*#include "kernel32.h"*/
+#include "advapi32.h"
 #include "stddebug.h"
 #include "debug.h"
 
@@ -16,7 +16,7 @@
  *           GetUserNameA   (ADVAPI32.67)
  */
 
-int GetUserNameA(LPSTR lpszName, LPDWORD lpSize)
+BOOL WINAPI GetUserNameA(LPSTR lpszName, LPDWORD lpSize)
 {
   size_t len;
   char *name;
@@ -32,3 +32,49 @@
   return 1;
 }
 
+/***********************************************************************
+ *           RegCreateKeyEx   (ADVAPI32.130)
+ */
+WINAPI LONG RegCreateKeyEx(HKEY key,
+                            const char *subkey,
+                            long dontuse,
+                            const char *keyclass,
+                            DWORD options,
+                            REGSAM sam,
+                            SECURITY_ATTRIBUTES *atts,
+                            HKEY *res,
+                            DWORD *disp)
+{
+	/* ahum */
+	return RegCreateKey(key, subkey, res);
+}
+
+/***********************************************************************
+ *           RegSetValueEx   (ADVAPI32.169)
+ */
+
+WINAPI LONG RegSetValueEx (HKEY key,
+                const char *name,
+                DWORD dontuse,
+                DWORD type,
+                const void* data,
+                DWORD len
+                )
+{
+	return 0;
+}
+
+/***********************************************************************
+ *           RegQueryValueEx   (ADVAPI32.157)
+ */
+
+WINAPI LONG RegQueryValueEx(HKEY key,
+                             const char *subkey,
+                             DWORD dontuse,
+                             DWORD *type,
+                             void *ptr,
+                             DWORD *len)
+{
+	return 0;
+}
+
diff --git a/win32/environment.c b/win32/environment.c
index 17e2966..e754f41 100644
--- a/win32/environment.c
+++ b/win32/environment.c
@@ -6,10 +6,12 @@
 
 #include <stdio.h>
 #include <string.h>
+#include <unistd.h>
 #include "windows.h"
 #include "winerror.h"
 #include "kernel32.h"
 #include "task.h"
+#include "pe_image.h"
 #include "stddebug.h"
 #include "debug.h"
 
@@ -20,8 +22,13 @@
 LPSTR GetCommandLineA(void)
 {
     static char buffer[256];
+    char *cp;
     PDB *pdb = (PDB *)GlobalLock( GetCurrentPDB() );
-    memcpy( buffer, &pdb->cmdLine[1], pdb->cmdLine[0] );
+
+    strcpy(buffer, wine_files->name);
+    cp = buffer+strlen(buffer);
+    *cp++ = ' ';
+    memcpy( cp, &pdb->cmdLine[1], pdb->cmdLine[0] );
     dprintf_win32(stddeb,"CommandLine = %s\n", buffer );
     return buffer;
 }
diff --git a/win32/error.c b/win32/error.c
index 7204884..242bcc0 100644
--- a/win32/error.c
+++ b/win32/error.c
@@ -5,14 +5,100 @@
  */
 
 #include <stdio.h>
+#include <errno.h>
 #include "windows.h"
 #include "winerror.h"
 #include "kernel32.h"
 #include "stddebug.h"
 #include "debug.h"
 
+/* WIN32_LastError contains the last error that occurred in the
+ * Win32 API.  This value should be stored separately for each
+ * thread, when we eventually get thread support.
+ */
 static int WIN32_LastError;
 
+/* The errno_xlat_table contains the errno-to-Win32 error
+ * mapping.  Since this is a single table, it can't easily
+ * take into account function-specific differences, so there
+ * will probably be quite a few points where we don't exactly
+ * match what NT would return.  Then again, neither does
+ * Windows 95. :-)
+ */
+typedef struct {
+    int         errno;
+    DWORD       win32err;
+} ERRNO_XLAT_TABLE;
+
+/* The table looks pretty ugly due to the preprocessor stuff,
+ * but I honestly have no idea how many of these values are
+ * portable.  I'm not even sure how many of them are even
+ * used at all. :-)
+ */
+static ERRNO_XLAT_TABLE errno_xlat_table[] = {
+#if defined(EPERM)
+    {   EPERM,          ERROR_ACCESS_DENIED             },
+#endif
+#if defined(ENOENT)
+    {   ENOENT,         ERROR_FILE_NOT_FOUND            },
+#endif
+#if defined(ESRCH)
+    {   ESRCH,          ERROR_INVALID_PARAMETER         },
+#endif
+#if defined(EIO)
+    {   EIO,            ERROR_IO_DEVICE                 },
+#endif
+#if defined(ENOEXEC)
+    {   ENOEXEC,        ERROR_BAD_FORMAT                },
+#endif
+#if defined(EBADF)
+    {   EBADF,          ERROR_INVALID_HANDLE            },
+#endif
+#if defined(ENOMEM)
+    {   ENOMEM,         ERROR_OUTOFMEMORY               },
+#endif
+#if defined(EACCES)
+    {   EACCES,         ERROR_ACCESS_DENIED             },
+#endif
+#if defined(EBUSY)
+    {   EBUSY,          ERROR_BUSY                      },
+#endif
+#if defined(EEXIST)
+    {   EEXIST,         ERROR_FILE_EXISTS               },
+#endif
+#if defined(ENODEV)
+    {   ENODEV,         ERROR_BAD_DEVICE                },
+#endif
+#if defined(EINVAL)
+    {   EINVAL,         ERROR_INVALID_PARAMETER         },
+#endif
+#if defined(EMFILE)
+    {   EMFILE,         ERROR_TOO_MANY_OPEN_FILES       },
+#endif
+#if defined(ETXTBSY)
+    {   ETXTBSY,        ERROR_BUSY,                     },
+#endif
+#if defined(ENOSPC)
+    {   ENOSPC,         ERROR_DISK_FULL                 },
+#endif
+#if defined(ESPIPE)
+    {   ESPIPE,         ERROR_SEEK_ON_DEVICE            },
+#endif
+#if defined(EPIPE)
+    {   EPIPE,          ERROR_BROKEN_PIPE               },
+#endif
+#if defined(EDEADLK)
+    {   EDEADLK,        ERROR_POSSIBLE_DEADLOCK         },
+#endif
+#if defined(ENAMETOOLONG)
+    {   ENAMETOOLONG,   ERROR_FILENAME_EXCED_RANGE      },
+#endif
+#if defined(ENOTEMPTY)
+    {   ENOTEMPTY,      ERROR_DIR_NOT_EMPTY             },
+#endif
+    {   -1,             0                               }
+};
+
 /**********************************************************************
  *              GetLastError            (KERNEL32.227)
  */
@@ -34,5 +120,18 @@
 
 DWORD ErrnoToLastError(int errno_num)
 {
-    return errno_num;   /* Obviously not finished yet. :-) */
+    DWORD rc = ERROR_UNKNOWN;
+    int i = 0;
+
+    while(errno_xlat_table[i].errno != -1)
+    {
+        if(errno_xlat_table[i].errno == errno_num)
+        {
+            rc = errno_xlat_table[i].win32err;
+            break;
+        }
+        i++;
+    }
+
+    return rc;
 }
diff --git a/win32/file.c b/win32/file.c
index a914e23..9146964 100644
--- a/win32/file.c
+++ b/win32/file.c
@@ -1,7 +1,7 @@
 /*
  * Win32 kernel functions
  *
- * Copyright 1995 Martin von Loewis and Cameron Heide
+ * Copyright 1995 Martin von Loewis, Sven Verdoolaege, and Cameron Heide
  */
 
 #include <errno.h>
@@ -9,8 +9,10 @@
 #include <unistd.h>
 #include <sys/types.h>
 #include <sys/stat.h>
+#include <sys/mman.h>
 #include <fcntl.h>
 #include <string.h>
+#include <time.h>
 #include "windows.h"
 #include "winerror.h"
 #include "kernel32.h"
@@ -25,31 +27,151 @@
 extern FILE_OBJECT *hstdout;
 extern FILE_OBJECT *hstderr;
 
+static void UnixTimeToFileTime(time_t unix_time, FILETIME *filetime);
 static int TranslateCreationFlags(DWORD create_flags);
 static int TranslateAccessFlags(DWORD access_flags);
 
 /***********************************************************************
- *           GetFileInformationByHandle       (KERNEL32.219)
+ *           OpenFileMappingA             (KERNEL32.397)
  *
  */
-HANDLE WINAPI  CreateFileA(const char * filename, DWORD a, DWORD b, void * c,
-                           DWORD d, DWORD e, DWORD f)
+WINAPI HANDLE32 OpenFileMapping(DWORD access, BOOL inherit,const char *fname)
 {
-   dprintf_win32(stderr, "CreateFileA: %s\n", filename);
-   return -1;
+	return 0;
+}
+/***********************************************************************
+ *           CreateFileMappingA		(KERNEL32.46)
+ *
+ */
+WINAPI HANDLE32 CreateFileMapping(HANDLE32 h,SECURITY_ATTRIBUTES *ats,
+  DWORD pot,  DWORD sh,  DWORD hlow,  const char * lpName )
+{
+    FILE_OBJECT *file_obj;
+    FILEMAP_OBJECT *filemap_obj;
+    int fd;
+
+    if (sh)
+    {
+        SetLastError(ErrnoToLastError(errno));
+        return INVALID_HANDLE_VALUE;
+    }
+    fd = open(lpName, O_CREAT, 0666);
+    #if 0
+    fd = open(DOS_GetUnixFileName(lpName), 0, 0666);
+    #endif
+    if(fd == -1)
+    {
+        SetLastError(ErrnoToLastError(errno));
+        return INVALID_HANDLE_VALUE;
+    }
+    file_obj = (FILE_OBJECT *)
+	                 CreateKernelObject(sizeof(FILE_OBJECT));
+    if(file_obj == NULL)
+    {
+        SetLastError(ERROR_UNKNOWN);
+        return 0;
+    }
+    filemap_obj = (FILEMAP_OBJECT *)
+	                 CreateKernelObject(sizeof(FILEMAP_OBJECT));
+    if(filemap_obj == NULL)
+    {
+	ReleaseKernelObject(file_obj);
+        SetLastError(ERROR_UNKNOWN);
+        return 0;
+    }
+    file_obj->common.magic = KERNEL_OBJECT_FILE;
+    file_obj->fd = fd;
+    file_obj->type = FILE_TYPE_DISK;
+    filemap_obj->common.magic = KERNEL_OBJECT_FILEMAP;
+    filemap_obj->file_obj = file_obj;
+    filemap_obj->prot = TranslateProtectionFlags(pot);
+    filemap_obj->size = hlow;
+    return (HANDLE32)filemap_obj;;
+}
+
+/***********************************************************************
+ *           MapViewOfFileEx                  (KERNEL32.386)
+ *
+ */
+WINAPI void *MapViewOfFileEx(HANDLE32 handle, DWORD access, DWORD offhi,
+                             DWORD offlo, DWORD size, DWORD st)
+{
+    if (!size) size = ((FILEMAP_OBJECT *)handle)->size;
+    return mmap (st, size, ((FILEMAP_OBJECT *)handle)->prot, 
+                 MAP_ANON|MAP_PRIVATE, 
+		 ((FILEMAP_OBJECT *)handle)->file_obj->fd,
+		 offlo);
 }
 
 /***********************************************************************
  *           GetFileInformationByHandle       (KERNEL32.219)
  *
  */
-DWORD WINAPI GetFileInformationByHandle(HANDLE hFile, 
+DWORD WINAPI GetFileInformationByHandle(FILE_OBJECT *hFile, 
                                         BY_HANDLE_FILE_INFORMATION *lpfi)
 {
-    memset(lpfi, 0, sizeof(BY_HANDLE_FILE_INFORMATION));
+  struct stat file_stat;
+    int rc;
+
+    if(ValidateKernelObject((HANDLE32)hFile) != 0)
+    {
+        SetLastError(ERROR_INVALID_HANDLE);
+        return 0;
+    }
+    if(hFile->common.magic != KERNEL_OBJECT_FILE)
+    {
+        SetLastError(ERROR_INVALID_HANDLE);
+        return 0;
+    }
+
+    rc = fstat(hFile->fd, &file_stat);
+    if(rc == -1)
+    {
+        SetLastError(ErrnoToLastError(errno));
+        return 0;
+    }
+
+    /* Translate the file attributes.
+     */
+    lpfi->dwFileAttributes = 0;
+    if(file_stat.st_mode & S_IFREG)
+        lpfi->dwFileAttributes |= FILE_ATTRIBUTE_NORMAL;
+    if(file_stat.st_mode & S_IFDIR)
+        lpfi->dwFileAttributes |= FILE_ATTRIBUTE_DIRECTORY;
+    if(file_stat.st_mode & S_IWRITE == 0)
+        lpfi->dwFileAttributes |= FILE_ATTRIBUTE_READONLY;
+
+    /* Translate the file times.  Use the last modification time
+     * for both the creation time and write time.
+     */
+    UnixTimeToFileTime(file_stat.st_mtime, &(lpfi->ftCreationTime));
+    UnixTimeToFileTime(file_stat.st_mtime, &(lpfi->ftLastWriteTime));
+    UnixTimeToFileTime(file_stat.st_atime, &(lpfi->ftLastAccessTime));
+
+    lpfi->nFileSizeLow = file_stat.st_size;
+    lpfi->nNumberOfLinks = file_stat.st_nlink;
+    lpfi->nFileIndexLow = file_stat.st_ino;
+
+    /* Zero out currently unused fields.
+     */
+    lpfi->dwVolumeSerialNumber = 0;
+    lpfi->nFileSizeHigh = 0;
+    lpfi->nFileIndexHigh = 0;
+
     return 1;
 }
 
+
+static void UnixTimeToFileTime(time_t unix_time, FILETIME *filetime)
+{
+    /* This isn't anywhere close to being correct, but should
+     * work for now.
+     */
+    filetime->dwLowDateTime  = (unix_time & 0x0000FFFF) << 16;
+    filetime->dwHighDateTime = (unix_time & 0xFFFF0000) >> 16;
+}
+
+
 /***********************************************************************
  *           GetFileType              (KERNEL32.222)
  *
@@ -95,7 +217,7 @@
 
         default:
             rc = INVALID_HANDLE_VALUE;
-            SetLastError(ERROR_UNKNOWN);
+            SetLastError(ERROR_INVALID_HANDLE);
             break;
     }
 
@@ -115,12 +237,12 @@
 
     if(ValidateKernelObject((HANDLE32)hFile) != 0)
     {
-        SetLastError(ERROR_UNKNOWN);
+        SetLastError(ERROR_INVALID_HANDLE);
         return ((DWORD)0xFFFFFFFF);
     }
     if(hFile->common.magic != KERNEL_OBJECT_FILE)
     {
-        SetLastError(ERROR_UNKNOWN);
+        SetLastError(ERROR_INVALID_HANDLE);
         return ((DWORD)0xFFFFFFFF);
     }
 
@@ -149,12 +271,12 @@
 
     if(ValidateKernelObject((HANDLE32)hFile) != 0)
     {
-        SetLastError(ERROR_UNKNOWN);
+        SetLastError(ERROR_INVALID_HANDLE);
         return 0;
     }
     if(hFile->common.magic != KERNEL_OBJECT_FILE)
     {
-        SetLastError(ERROR_UNKNOWN);
+        SetLastError(ERROR_INVALID_HANDLE);
         return 0;
     }
 
@@ -175,12 +297,12 @@
 
     if(ValidateKernelObject((HANDLE32)hFile) != 0)
     {
-        SetLastError(ERROR_UNKNOWN);
+        SetLastError(ERROR_INVALID_HANDLE);
         return 0;
     }
     if(hFile->common.magic != KERNEL_OBJECT_FILE)
     {
-        SetLastError(ERROR_UNKNOWN);
+        SetLastError(ERROR_INVALID_HANDLE);
         return 0;
     }
 
@@ -199,11 +321,12 @@
 /*************************************************************************
  *              CreateFile              (KERNEL32.45)
  *
- * Doesn't support character devices or pipes yet.
+ * Doesn't support character devices, pipes, template files, or a
+ * lot of the 'attributes' flags yet.
  */
-HANDLE32 CreateFile(LPSTR filename, DWORD access, DWORD sharing,
-                    LPSECURITY_ATTRIBUTES security, DWORD creation,
-                    DWORD attributes, HANDLE32 template)
+HANDLE32 CreateFileA(LPSTR filename, DWORD access, DWORD sharing,
+                     LPSECURITY_ATTRIBUTES security, DWORD creation,
+                     DWORD attributes, HANDLE32 template)
 {
     int access_flags, create_flags;
     int fd;
@@ -216,7 +339,7 @@
     create_flags = TranslateCreationFlags(creation);
 
     if(template)
-        printf("CreateFile: template handles not supported.\n");
+        dprintf_win32(stddeb, "CreateFile: template handles not supported.\n");
 
     /* If the name starts with '\\?' or '\\.', ignore the first 3 chars.
      */
@@ -227,7 +350,7 @@
      */
     if(!strncmp(filename, "\\\\", 2))
     {
-        printf("CreateFile: UNC names not supported.\n");
+        dprintf_win32(stddeb, "CreateFile: UNC names not supported.\n");
         SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
         return INVALID_HANDLE_VALUE;
     }
@@ -266,7 +389,7 @@
     file_obj = (FILE_OBJECT *)CreateKernelObject(sizeof(FILE_OBJECT));
     if(file_obj == NULL)
     {
-        SetLastError(ERROR_UNKNOWN);
+        SetLastError(ERROR_INVALID_HANDLE);
         return INVALID_HANDLE_VALUE;
     }
     file_obj->common.magic = KERNEL_OBJECT_FILE;
diff --git a/win32/init.c b/win32/init.c
index b4d3f0d..d2e8936 100644
--- a/win32/init.c
+++ b/win32/init.c
@@ -12,6 +12,7 @@
 #include "kernel32.h"
 #include "handle32.h"
 #include "stddebug.h"
+#define DEBUG_WIN32
 #include "debug.h"
   
 /* The global error value
@@ -48,7 +49,7 @@
             break;
 
         default:
-            printf("CloseHandle: type %ld not implemented yet.\n",
+            dprintf_win32(stddeb, "CloseHandle: type %ld not implemented yet.\n",
                    handle->magic);
             break;
     }
diff --git a/win32/memory.c b/win32/memory.c
index 2ee8eb5..78b04fe 100644
--- a/win32/memory.c
+++ b/win32/memory.c
@@ -17,6 +17,10 @@
 #include "stddebug.h"
 #include "debug.h"
 
+#ifndef PROT_NONE  /* FreeBSD doesn't define PROT_NONE */
+#define PROT_NONE 0
+#endif
+
 typedef struct {
     caddr_t	ptr;
     long	size;
@@ -72,33 +76,8 @@
         ptr = lpvAddress;
     }
     if (fdwAllocationType & MEM_COMMIT) {
-        switch(fdwProtect & ~(PAGE_GUARD | PAGE_NOCACHE)) {
-	    case PAGE_READONLY:
-	        prot=PROT_READ;
-		break;
-	    case PAGE_READWRITE:
-	        prot=PROT_READ|PROT_WRITE;
-		break;
-	    case PAGE_WRITECOPY:
-	        prot=PROT_WRITE;
-		break;
-	    case PAGE_EXECUTE:
-	        prot=PROT_EXEC;
-		break;
-	    case PAGE_EXECUTE_READ:
-	        prot=PROT_EXEC|PROT_READ;
-		break;
-	    case PAGE_EXECUTE_READWRITE:
-	        prot=PROT_EXEC|PROT_READ|PROT_WRITE;
-		break;
-	    case PAGE_EXECUTE_WRITECOPY:
-	        prot=PROT_EXEC|PROT_WRITE;
-		break;
-	    case PAGE_NOACCESS:
-	    default:
-	        prot=PROT_NONE;
-		break;
-	}
+        prot = TranslateProtectionFlags(fdwProtect & 
+                                          ~(PAGE_GUARD | PAGE_NOCACHE));
 	mprotect(ptr, cbSize, prot);
     }
     return ptr;
@@ -144,3 +123,36 @@
     return 1;
 }
 
+int TranslateProtectionFlags(DWORD protection_flags)
+{
+    int prot;
+
+        switch(protection_flags) {
+	    case PAGE_READONLY:
+	        prot=PROT_READ;
+		break;
+	    case PAGE_READWRITE:
+	        prot=PROT_READ|PROT_WRITE;
+		break;
+	    case PAGE_WRITECOPY:
+	        prot=PROT_WRITE;
+		break;
+	    case PAGE_EXECUTE:
+	        prot=PROT_EXEC;
+		break;
+	    case PAGE_EXECUTE_READ:
+	        prot=PROT_EXEC|PROT_READ;
+		break;
+	    case PAGE_EXECUTE_READWRITE:
+	        prot=PROT_EXEC|PROT_READ|PROT_WRITE;
+		break;
+	    case PAGE_EXECUTE_WRITECOPY:
+	        prot=PROT_EXEC|PROT_WRITE;
+		break;
+	    case PAGE_NOACCESS:
+	    default:
+	        prot=PROT_NONE;
+		break;
+	}
+   return prot;
+}
diff --git a/win32/object_mgt.c b/win32/object_mgt.c
index 668a13a..07a6ed4 100644
--- a/win32/object_mgt.c
+++ b/win32/object_mgt.c
@@ -14,6 +14,6 @@
 
 int ValidateKernelObject(KERNEL_OBJECT *ptr)
 {
-    return 0;
+  return (!ptr || (short int)ptr==-1);
 }
 
diff --git a/win32/process.c b/win32/process.c
index 3773dbb..8fb8fe4 100644
--- a/win32/process.c
+++ b/win32/process.c
@@ -9,6 +9,7 @@
 #include "windows.h"
 #include "winerror.h"
 #include "kernel32.h"
+#include "handle32.h"
 #include "stddebug.h"
 #include "debug.h"
 
@@ -21,3 +22,63 @@
         exit(status);
 }
 
+/***********************************************************************
+ *           CreateMutexA    (KERNEL32.52)
+ */
+WINAPI HANDLE32 CreateMutexA (SECURITY_ATTRIBUTES *sa, BOOL on, const char *a)
+{
+	return 0;
+}
+
+/***********************************************************************
+ *           ReleaseMutex    (KERNEL32.435)
+ */
+WINAPI BOOL ReleaseMutex (HANDLE32 h)
+{
+	return 0;
+}
+
+/***********************************************************************
+ *           CreateEventA    (KERNEL32.43)
+ */
+WINAPI HANDLE32 CreateEventA (SECURITY_ATTRIBUTES *sa, BOOL au, BOOL on, const char
+*name)
+{
+	return 0;
+}
+/***********************************************************************
+ *           SetEvent    (KERNEL32.487)
+ */
+WINAPI BOOL SetEvent (HANDLE32 h)
+{
+	return 0;
+}
+/***********************************************************************
+ *           ResetEvent    (KERNEL32.439)
+ */
+WINAPI BOOL ResetEvent (HANDLE32 h)
+{
+	return 0;
+}
+/***********************************************************************
+ *           WaitForSingleObject    (KERNEL32.561)
+ */
+DWORD WINAPI WaitForSingleObject(HANDLE32 h, DWORD a)
+{
+	return 0;
+}
+/***********************************************************************
+ *           DuplicateHandle    (KERNEL32.78)
+ */
+BOOL WINAPI DuplicateHandle(HANDLE32 a, HANDLE32 b, HANDLE32 c, HANDLE32 * d, DWORD e, BOOL f, DWORD g)
+{
+	*d = b;
+	return 1;
+}
+/***********************************************************************
+ *           GetCurrentProcess    (KERNEL32.198)
+ */
+HANDLE32 WINAPI GetCurrentProcess(void)
+{
+	return 0;
+}
diff --git a/win32/thread.c b/win32/thread.c
index ec77af5..c88dda4 100644
--- a/win32/thread.c
+++ b/win32/thread.c
@@ -28,4 +28,11 @@
 {
         return FALSE;
 }
+/***********************************************************************
+ *           GetCurrentThread    (KERNEL32.200)
+ */
+HANDLE WINAPI GetCurrentThread(void)
+{
+	return 0;
+}
 
diff --git a/win32/time.c b/win32/time.c
index 29b20ba..04d6780 100644
--- a/win32/time.c
+++ b/win32/time.c
@@ -6,6 +6,7 @@
 
 #include <string.h>
 #include <time.h>
+#include <sys/time.h>
 #include <unistd.h>
 #include "windows.h"
 #include "winerror.h"
@@ -14,6 +15,29 @@
 #include "debug.h"
 
 /***********************************************************************
+ *              GetLocalTime            (KERNEL32.228)
+ */
+VOID GetLocalTime(LPSYSTEMTIME systime)
+{
+    time_t local_time;
+    struct tm *local_tm;
+    struct timeval tv;
+
+    time(&local_time);
+    local_tm = localtime(&local_time);
+    gettimeofday(&tv, NULL);
+
+    systime->wYear = local_tm->tm_year + 1900;
+    systime->wMonth = local_tm->tm_mon + 1;
+    systime->wDayOfWeek = local_tm->tm_wday;
+    systime->wDay = local_tm->tm_mday;
+    systime->wHour = local_tm->tm_hour;
+    systime->wMinute = local_tm->tm_min;
+    systime->wSecond = local_tm->tm_sec;
+    systime->wMilliseconds = (tv.tv_usec / 1000) % 1000;
+}
+
+/***********************************************************************
  *              GetTimeZoneInformation  (KERNEL32.302)
  */
 DWORD GetTimeZoneInformation(LPTIME_ZONE_INFORMATION tzinfo)
diff --git a/windows/dce.c b/windows/dce.c
index 7cb9df3..15ea232 100644
--- a/windows/dce.c
+++ b/windows/dce.c
@@ -184,7 +184,7 @@
  * clipped by the client area of all ancestors, and then optionally
  * by siblings and children.
  */
-static HRGN DCE_GetVisRgn( HWND hwnd, WORD flags )
+HRGN DCE_GetVisRgn( HWND hwnd, WORD flags )
 {
     RECT rect;
     HRGN hrgn;
diff --git a/windows/defwnd.c b/windows/defwnd.c
index 786c0a7..bc901b0 100644
--- a/windows/defwnd.c
+++ b/windows/defwnd.c
@@ -39,6 +39,8 @@
     wndPtr->hText = USER_HEAP_ALLOC( strlen(text) + 1 );
     textPtr = (LPSTR) USER_HEAP_LIN_ADDR( wndPtr->hText );
     strcpy( textPtr, text );
+    if (wndPtr->window)
+        XStoreName( display, wndPtr->window, text );
 }
 
 
diff --git a/windows/event.c b/windows/event.c
index 28f21e1..301e91f 100644
--- a/windows/event.c
+++ b/windows/event.c
@@ -18,6 +18,7 @@
 #include "class.h"
 #include "message.h"
 #include "clipboard.h"
+#include "options.h"
 #include "winpos.h"
 #include "registers.h"
 #include "stackframe.h"
@@ -137,6 +138,7 @@
 static void EVENT_ButtonPress( XButtonEvent *event );
 static void EVENT_ButtonRelease( XButtonEvent *event );
 static void EVENT_MotionNotify( XMotionEvent *event );
+static void EVENT_FocusIn( HWND hwnd, XFocusChangeEvent *event );
 static void EVENT_FocusOut( HWND hwnd, XFocusChangeEvent *event );
 static void EVENT_Expose( HWND hwnd, XExposeEvent *event );
 static void EVENT_ConfigureNotify( HWND hwnd, XConfigureEvent *event );
@@ -190,6 +192,10 @@
 	EVENT_MotionNotify( (XMotionEvent*)event );
 	break;
 
+    case FocusIn:
+        EVENT_FocusIn( hwnd, (XFocusChangeEvent*)event );
+	break;
+
     case FocusOut:
 	EVENT_FocusOut( hwnd, (XFocusChangeEvent*)event );
 	break;
@@ -455,6 +461,17 @@
 
 
 /**********************************************************************
+ *              EVENT_FocusIn
+ */
+static void EVENT_FocusIn (HWND hwnd, XFocusChangeEvent *event )
+{
+    if (event->detail == NotifyPointer) return;
+    if (hwnd != GetActiveWindow()) WINPOS_ChangeActiveWindow( hwnd, FALSE );
+    if ((hwnd != GetFocus()) && ! IsChild( hwnd, GetFocus())) SetFocus( hwnd );
+}
+
+
+/**********************************************************************
  *              EVENT_FocusOut
  *
  * Note: only top-level override-redirect windows get FocusOut events.
@@ -470,12 +487,70 @@
 /**********************************************************************
  *              EVENT_ConfigureNotify
  *
- * The ConfigureNotify event is only selected on the desktop window.
+ * The ConfigureNotify event is only selected on the desktop window
+ * and on top-level windows when the -managed flag is used.
  */
 static void EVENT_ConfigureNotify( HWND hwnd, XConfigureEvent *event )
 {
-    desktopX = event->x;
-    desktopY = event->y;
+    if (hwnd == GetDesktopWindow())
+    {
+        desktopX = event->x;
+	desktopY = event->y;
+    }
+    else
+    {
+      /* A managed window; most of this code is shamelessly
+       * stolen from SetWindowPos
+       */
+      
+        WND *wndPtr;
+	WINDOWPOS winpos;
+	RECT newWindowRect, newClientRect;
+
+	if (!(wndPtr = WIN_FindWndPtr( hwnd )))
+	{
+	    dprintf_event(stddeb, "ConfigureNotify: invalid HWND "NPFMT"\n", hwnd);
+	    return;
+	}
+	
+	/* Artificial messages */
+	SendMessage(hwnd, WM_ENTERSIZEMOVE, 0, 0);
+	SendMessage(hwnd, WM_EXITSIZEMOVE, 0, 0);
+
+	/* Fill WINDOWPOS struct */
+	winpos.flags = SWP_NOACTIVATE | SWP_NOZORDER;
+	winpos.hwnd = hwnd;
+	winpos.x = event->x;
+	winpos.y = event->y;
+	winpos.cx = event->width;
+	winpos.cy = event->height;
+
+	/* Check for unchanged attributes */
+	if(winpos.x == wndPtr->rectWindow.left &&
+	   winpos.y == wndPtr->rectWindow.top)
+	    winpos.flags |= SWP_NOMOVE;
+	if(winpos.cx == wndPtr->rectWindow.right - wndPtr->rectWindow.left &&
+	   winpos.cy == wndPtr->rectWindow.bottom - wndPtr->rectWindow.top)
+	    winpos.flags |= SWP_NOSIZE;
+
+	/* Send WM_WINDOWPOSCHANGING */
+	SendMessage(hwnd, WM_WINDOWPOSCHANGING, 0, MAKE_SEGPTR(&winpos));
+
+	/* Calculate new position and size */
+	newWindowRect.left = event->x;
+	newWindowRect.right = event->x + event->width;
+	newWindowRect.top = event->y;
+	newWindowRect.bottom = event->y + event->height;
+
+	WINPOS_SendNCCalcSize( winpos.hwnd, TRUE, &newWindowRect,
+			       &wndPtr->rectWindow, &wndPtr->rectClient,
+			       &winpos, &newClientRect );
+
+	/* Set new size and position */
+	wndPtr->rectWindow = newWindowRect;
+	wndPtr->rectClient = newClientRect;
+	SendMessage(hwnd, WM_WINDOWPOSCHANGED, 0, MAKE_SEGPTR(&winpos));
+    }
 }
 
 
diff --git a/windows/focus.c b/windows/focus.c
index 141bede..6e8e46a 100644
--- a/windows/focus.c
+++ b/windows/focus.c
@@ -2,16 +2,18 @@
  * Focus functions
  *
  * Copyright 1993 David Metcalfe
- * Copyright 1994 Alexandre Julliard
+ *           1994 Alexandre Julliard
+ * 	     1995 Alex Korobka
  *
-static char Copyright[] = "Copyright  David Metcalfe, 1993";
-static char Copyright2[] = "Copyright  Alexandre Julliard, 1994";
-*/
+ */
 
 #include "win.h"
+#include "winpos.h"
+#include "hook.h"
 #include "color.h"
 
-static HWND hWndFocus = 0;
+
+static HWND hwndFocus = 0;
 
 /*****************************************************************
  *               FOCUS_SetXFocus
@@ -44,53 +46,67 @@
 	XInstallColormap( display, COLOR_WinColormap );
 }
 
+/*****************************************************************
+ *	         FOCUS_SwitchFocus 
+ */
+void FOCUS_SwitchFocus(HWND hFocusFrom, HWND hFocusTo)
+{
+    hwndFocus = hFocusTo;
+
+    if (hFocusFrom) SendMessage( hFocusFrom, WM_KILLFOCUS, hFocusTo, 0L);
+    if( !hFocusTo || hFocusTo != hwndFocus )
+	return;
+
+    SendMessage( hFocusTo, WM_SETFOCUS, hFocusFrom, 0L);
+    FOCUS_SetXFocus( hFocusTo );
+}
+
 
 /*****************************************************************
  *               SetFocus            (USER.22)
  */
-
 HWND SetFocus(HWND hwnd)
 {
-    HWND hWndPrevFocus, hwndParent;
-    WND *wndPtr;
+    HWND hWndPrevFocus, hwndTop;
+    WND *wndPtr = WIN_FindWndPtr( hwndTop = hwnd );
 
-    if (hwnd == hWndFocus) return hWndFocus;  /* Nothing to do! */    
-
-    if (hwnd)
+    if (wndPtr)
     {
 	  /* Check if we can set the focus to this window */
 
-	hwndParent = hwnd;
-	while ((wndPtr = WIN_FindWndPtr( hwndParent )) != NULL)
+	while ( (wndPtr->dwStyle & (WS_CHILD | WS_POPUP)) == WS_CHILD  )
 	{
-	    if ((wndPtr->dwStyle & WS_MINIMIZE) ||
-		(wndPtr->dwStyle & WS_DISABLED)) return 0;
-	    if (!(wndPtr->dwStyle & WS_CHILD)) break;
-	    hwndParent = wndPtr->hwndParent;
+	    if ( wndPtr->dwStyle & ( WS_MINIMIZE | WS_DISABLED) )
+		 return 0;
+
+	    hwndTop = wndPtr->hwndParent;
+	    wndPtr  = WIN_FindWndPtr( hwndTop );
+	    if ( !wndPtr )
+	         return 0;
 	}
 
-	  /* Now hwndParent is the top-level ancestor. Activate it. */
+	if( hwnd == hwndFocus ) return hwnd;
 
-	if (hwndParent != GetActiveWindow())
+	/* call hooks */
+	if( HOOK_CallHooks( WH_CBT, HCBT_SETFOCUS, hwnd, hwndFocus) )
+	    return 0;
+
+        /* activate hwndTop if needed. */
+	if (hwndTop != GetActiveWindow())
 	{
-	    SetWindowPos( hwndParent, HWND_TOP, 0, 0, 0, 0,
-			  SWP_NOSIZE | SWP_NOMOVE );
+	    if (!WINPOS_SetActiveWindow(hwndTop, 0, 0)) return 0;
+
 	    if (!IsWindow( hwnd )) return 0;  /* Abort if window destroyed */
 	}
     }
+    else if( HOOK_CallHooks( WH_CBT, HCBT_SETFOCUS, 0, hwndFocus ) )
+             return 0;
 
       /* Change focus and send messages */
+    hWndPrevFocus = hwndFocus;
 
-    hWndPrevFocus = hWndFocus;
-    hWndFocus = hwnd;    
-    if (hWndPrevFocus) SendMessage( hWndPrevFocus, WM_KILLFOCUS, 
-				    (WPARAM)hwnd, 0 );
-    if (hwnd == hWndFocus)  /* Maybe already changed during WM_KILLFOCUS */
-    {
-	if (hwnd) SendMessage( hWndFocus, WM_SETFOCUS, 
-			       (WPARAM)hWndPrevFocus, 0 );
-	FOCUS_SetXFocus( hwnd );
-    }
+    FOCUS_SwitchFocus( hwndFocus , hwnd );
+
     return hWndPrevFocus;
 }
 
@@ -98,10 +114,9 @@
 /*****************************************************************
  *               GetFocus            (USER.23)
  */
-
 HWND GetFocus(void)
 {
-    return hWndFocus;
+    return hwndFocus;
 }
 
 
diff --git a/windows/graphics.c b/windows/graphics.c
index d4475ba..517d74b 100644
--- a/windows/graphics.c
+++ b/windows/graphics.c
@@ -23,15 +23,6 @@
 #include "debug.h"
 #include "xmalloc.h"
 
-static __inline__ void swap_int(int *a, int *b)
-{
-	int c;
-	
-	c = *a;
-	*a = *b;
-	*b = c;
-}
-
 /***********************************************************************
  *           LineTo    (GDI.19)
  */
@@ -108,7 +99,7 @@
 static BOOL GRAPH_DrawArc( HDC hdc, int left, int top, int right, int bottom,
 		    int xstart, int ystart, int xend, int yend, int lines )
 {
-    int xcenter, ycenter, istart_angle, idiff_angle;
+    int xcenter, ycenter, istart_angle, idiff_angle, tmp;
     double start_angle, end_angle;
     XPoint points[3];
     DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC );
@@ -155,8 +146,8 @@
     istart_angle = (int)(start_angle * 180 * 64 / PI);
     idiff_angle  = (int)((end_angle - start_angle) * 180 * 64 / PI );
     if (idiff_angle <= 0) idiff_angle += 360 * 64;
-    if (left > right) swap_int( &left, &right );
-    if (top > bottom) swap_int( &top, &bottom );
+    if (left > right) { tmp=left; left=right; right=tmp; }
+    if (top > bottom) { tmp=top; top=bottom; bottom=tmp; }
 
       /* Fill arc with brush if Chord() or Pie() */
 
@@ -195,8 +186,8 @@
 /***********************************************************************
  *           Arc    (GDI.23)
  */
-BOOL Arc( HDC hdc, int left, int top, int right, int bottom,
-	  int xstart, int ystart, int xend, int yend )
+BOOL Arc( HDC hdc, INT left, INT top, INT right, INT bottom,
+	  INT xstart, INT ystart, INT xend, INT yend )
 {
     return GRAPH_DrawArc( hdc, left, top, right, bottom,
 			  xstart, ystart, xend, yend, 0 );
@@ -206,8 +197,8 @@
 /***********************************************************************
  *           Pie    (GDI.26)
  */
-BOOL Pie( HDC hdc, int left, int top, int right, int bottom,
-	  int xstart, int ystart, int xend, int yend )
+BOOL Pie( HDC hdc, INT left, INT top, INT right, INT bottom,
+	  INT xstart, INT ystart, INT xend, INT yend )
 {
     return GRAPH_DrawArc( hdc, left, top, right, bottom,
 			  xstart, ystart, xend, yend, 2 );
@@ -217,8 +208,8 @@
 /***********************************************************************
  *           Chord    (GDI.348)
  */
-BOOL Chord( HDC hdc, int left, int top, int right, int bottom,
-	    int xstart, int ystart, int xend, int yend )
+BOOL Chord( HDC hdc, INT left, INT top, INT right, INT bottom,
+	    INT xstart, INT ystart, INT xend, INT yend )
 {
     return GRAPH_DrawArc( hdc, left, top, right, bottom,
 			  xstart, ystart, xend, yend, 1 );
@@ -228,7 +219,7 @@
 /***********************************************************************
  *           Ellipse    (GDI.24)
  */
-BOOL Ellipse( HDC hdc, int left, int top, int right, int bottom )
+BOOL Ellipse( HDC hdc, INT left, INT top, INT right, INT bottom )
 {
     DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC );
     if (!dc) 
@@ -245,11 +236,8 @@
     bottom = YLPTODP( dc, bottom );
     if ((left == right) || (top == bottom)) return FALSE;
 
-    if (right < left)
-    	swap_int(&right, &left);
-
-    if (bottom < top)
-    	swap_int(&bottom, &top);
+    if (right < left) { INT tmp = right; right = left; left = tmp; }
+    if (bottom < top) { INT tmp = bottom; bottom = top; top = tmp; }
     
     if ((dc->u.x.pen.style == PS_INSIDEFRAME) &&
         (dc->u.x.pen.width < right-left-1) &&
@@ -276,7 +264,7 @@
 /***********************************************************************
  *           Rectangle    (GDI.27)
  */
-BOOL Rectangle( HDC hdc, int left, int top, int right, int bottom )
+BOOL Rectangle( HDC hdc, INT left, INT top, INT right, INT bottom )
 {
     DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC );
     if (!dc) 
@@ -291,11 +279,8 @@
     right  = XLPTODP( dc, right );
     bottom = YLPTODP( dc, bottom );
 
-    if (right < left)
-    	swap_int(&right, &left);
-
-    if (bottom < top)
-    	swap_int(&bottom, &top);
+    if (right < left) { INT tmp = right; right = left; left = tmp; }
+    if (bottom < top) { INT tmp = bottom; bottom = top; top = tmp; }
 
     if ((left == right) || (top == bottom))
     {
@@ -333,8 +318,8 @@
 /***********************************************************************
  *           RoundRect    (GDI.28)
  */
-BOOL RoundRect( HDC hDC, short left, short top, short right, short bottom,
-                short ell_width, short ell_height )
+BOOL RoundRect( HDC hDC, INT left, INT top, INT right, INT bottom,
+                INT ell_width, INT ell_height )
 {
     DC * dc = (DC *) GDI_GetObjPtr(hDC, DC_MAGIC);
     if (!dc) 
@@ -357,8 +342,8 @@
 
     /* Fix the coordinates */
 
-    if (left > right) { short t = left; left = right; right = t; }
-    if (top > bottom) { short t = top; top = bottom; bottom = t; }
+    if (right < left) { INT tmp = right; right = left; left = tmp; }
+    if (bottom < top) { INT tmp = bottom; bottom = top; top = tmp; }
     if (ell_width > right - left) ell_width = right - left;
     if (ell_height > bottom - top) ell_height = bottom - top;
 
diff --git a/windows/keyboard.c b/windows/keyboard.c
index 7610ae9..c8c0e53 100644
--- a/windows/keyboard.c
+++ b/windows/keyboard.c
@@ -17,16 +17,16 @@
  */
 int GetKeyState(int keycode)
 {
-	switch(keycode) {
-		case VK_LBUTTON:
-		    return MouseButtonsStates[0];
-		case VK_MBUTTON:
-		    return MouseButtonsStates[1];
-		case VK_RBUTTON:
-		    return MouseButtonsStates[2];
-		default:
-		    return KeyStateTable[keycode];
-		}
+    switch(keycode) {
+     case VK_LBUTTON:
+	return MouseButtonsStates[0];
+     case VK_MBUTTON:
+	return MouseButtonsStates[1];
+     case VK_RBUTTON:
+	return MouseButtonsStates[2];
+     default:
+	return KeyStateTable[keycode];
+    }
 }
 
 /**********************************************************************
@@ -47,13 +47,14 @@
  */
 void SetKeyboardState(BYTE FAR *lpKeyState)
 {
-	if (lpKeyState != NULL) {
+    if (lpKeyState != NULL) {
 	memcpy(KeyStateTable, lpKeyState, 256);
 	MouseButtonsStates[0] = KeyStateTable[VK_LBUTTON];
 	MouseButtonsStates[1] = KeyStateTable[VK_MBUTTON];
 	MouseButtonsStates[2] = KeyStateTable[VK_RBUTTON];
-	}
+    }
 }
+
 /**********************************************************************
  *            GetAsyncKeyState        (USER.249)
  *
@@ -69,31 +70,30 @@
  */
 int GetAsyncKeyState(int nKey)
 {
-	short 	retval;	
+    short retval;	
 
-	switch (nKey) {
+    switch (nKey) {
+     case VK_LBUTTON:
+	retval = AsyncMouseButtonsStates[0] | 
+	(MouseButtonsStates[0] << 8);
+	break;
+     case VK_MBUTTON:
+	retval = AsyncMouseButtonsStates[1] |
+	(MouseButtonsStates[1] << 8);
+	break;
+     case VK_RBUTTON:
+	retval = AsyncMouseButtonsStates[2] |
+	(MouseButtonsStates[2] << 8);
+	break;
+     default:
+	retval = AsyncKeyStateTable[nKey] | 
+	(KeyStateTable[nKey] << 8);
+	break;
+    }
 
-           case VK_LBUTTON:
-		retval = AsyncMouseButtonsStates[0] | 
-                              (MouseButtonsStates[0] << 8);
-		break;
-           case VK_MBUTTON:
-                retval = AsyncMouseButtonsStates[1] |
-                              (MouseButtonsStates[1] << 8);
-		break;
-           case VK_RBUTTON:
-                retval = AsyncMouseButtonsStates[2] |
-                              (MouseButtonsStates[2] << 8);
-		break;
-           default:
-                retval = AsyncKeyStateTable[nKey] | 
-		              (KeyStateTable[nKey] << 8);
-		break;
-        }
+    bzero(AsyncMouseButtonsStates, 3);	/* all states to false */
+    bzero(AsyncKeyStateTable, 256);
 
-	bzero(AsyncMouseButtonsStates, 3);	/* all states to false */
-	bzero(AsyncKeyStateTable, 256);
-
-	return retval;
+    return retval;
 }
 
diff --git a/windows/mdi.c b/windows/mdi.c
index e1a3ddf..0fe19aa 100644
--- a/windows/mdi.c
+++ b/windows/mdi.c
@@ -1,10 +1,20 @@
 /* MDI.C
  *
  * Copyright 1994, Bob Amstadt
+ *           1995, Alex Korobka
  *
  * This file contains routines to support MDI features.
+ *
+ * Notes: Windows keeps ID of MDI menu item in the wIDenu field
+ *        of corresponding MDI child.
+ *
+ *	  Basic child activation routine is MDI_ChildActivate and 
+ *        SetWindowPos(childHwnd,...) implicitly calls it if SWP_NOACTIVATE i
+ *        is not used.
  */
+
 #include <stdlib.h>
+#include <string.h>
 #include <stdio.h>
 #include <math.h>
 #include "windows.h"
@@ -17,50 +27,168 @@
 #include "stddebug.h"
 #include "debug.h"
 
-/**********************************************************************
- *					MDIRecreateMenuList
+void ScrollChildren(HWND , UINT , WPARAM , LPARAM );
+void CalcChildScroll(HWND, WORD);
+
+/* ----------------- declarations ----------------- */
+
+static LONG MDI_ChildActivate(WND* ,HWND );
+
+/* -------- Miscellaneous service functions ----------
+ *
+ *			MDI_GetChildByID
  */
-void MDIRecreateMenuList(MDICLIENTINFO *ci)
+
+static HWND MDI_GetChildByID(WND* mdiClient,int id)
 {
-    HLOCAL hinfo;
+ HWND	hWnd   = mdiClient->hwndChild;
+ WND* 	wndPtr = WIN_FindWndPtr( hWnd );
     
-    char buffer[128];
-    int id, n, index;
+ if( !wndPtr ) return 0;
 
-    dprintf_mdi(stddeb, "MDIRecreateMenuList: hWindowMenu "NPFMT"\n", 
-	    ci->hWindowMenu);
-    
-    id = ci->idFirstChild; 
-    while (DeleteMenu(ci->hWindowMenu, id, MF_BYCOMMAND))
-	id++;
+ while( wndPtr )
+  {
+	if( wndPtr->wIDmenu == id ) return hWnd;
+ 	wndPtr = WIN_FindWndPtr(hWnd = wndPtr->hwndNext);
+  }
 
-    dprintf_mdi(stddeb, "MDIRecreateMenuList: id %04x, idFirstChild %04x\n", 
-	    id, ci->idFirstChild);
-
-    if (!ci->flagMenuAltered)
-    {
-	ci->flagMenuAltered = TRUE;
-	AppendMenu(ci->hWindowMenu, MF_SEPARATOR, 0, NULL);
-    }
-    
-    id = ci->idFirstChild;
-    index = 1;
-    for (hinfo = ci->infoActiveChildren; hinfo != 0;)
-    {
-	MDICHILDINFO *chi = USER_HEAP_LIN_ADDR(hinfo);
-	
-	n = sprintf(buffer, "%d ", index++);
-	GetWindowText(chi->hwnd, buffer + n, sizeof(buffer) - n - 1);
-
-	dprintf_mdi(stddeb, "MDIRecreateMenuList: id %04x, '%s'\n",
-		id, buffer);
-
-	AppendMenu(ci->hWindowMenu, MF_STRING, id++, buffer);
-	hinfo = chi->next;
-    }
+ return 0;
 }
 
 /**********************************************************************
+ *			MDI_MenuAppendItem
+ */
+static BOOL MDI_MenuAppendItem(WND *clientWnd, HWND hWndChild)
+{
+    char buffer[128];
+ MDICLIENTINFO  *clientInfo = (MDICLIENTINFO*)clientWnd->wExtra;
+ WND		*wndPtr     = WIN_FindWndPtr(hWndChild);
+ LPSTR		 lpWndText  = (LPSTR) USER_HEAP_LIN_ADDR(wndPtr->hText);
+ int 		 n          = sprintf(buffer, "%d ", 
+				      clientInfo->nActiveChildren);
+
+ if( !clientInfo->hWindowMenu ) return 0; 
+    
+ if( lpWndText )
+     strncpy(buffer + n, lpWndText, sizeof(buffer) - n - 1);
+ return AppendMenu(clientInfo->hWindowMenu,MF_STRING,
+                       wndPtr->wIDmenu,(LPSTR)buffer);
+}
+
+/**********************************************************************
+ *			MDI_MenuModifyItem
+ */
+static BOOL MDI_MenuModifyItem(WND* clientWnd, HWND hWndChild )
+{
+ char            buffer[128];
+ MDICLIENTINFO  *clientInfo = (MDICLIENTINFO*)clientWnd->wExtra;
+ WND            *wndPtr     = WIN_FindWndPtr(hWndChild);
+ LPSTR           lpWndText  = (LPSTR) USER_HEAP_LIN_ADDR(wndPtr->hText);
+ UINT		 n          = sprintf(buffer, "%d ",
+                              wndPtr->wIDmenu - clientInfo->idFirstChild + 1);
+ BOOL		 bRet	    = 0;
+
+ if( !clientInfo->hWindowMenu ) return 0;
+
+ if( lpWndText )
+     strncpy(buffer + n, lpWndText, sizeof(buffer) - n - 1);
+
+ n    = GetMenuState(clientInfo->hWindowMenu,wndPtr->wIDmenu ,MF_BYCOMMAND); 
+ bRet = ModifyMenu(clientInfo->hWindowMenu , wndPtr->wIDmenu , 
+                   MF_BYCOMMAND | MF_STRING, wndPtr->wIDmenu ,(LPSTR)buffer );
+        CheckMenuItem(clientInfo->hWindowMenu ,wndPtr->wIDmenu , n & MF_CHECKED);
+ return bRet;
+}
+
+/**********************************************************************
+ *			MDI_MenuDeleteItem
+ */
+static BOOL MDI_MenuDeleteItem(WND* clientWnd, HWND hWndChild )
+{
+ char    	 buffer[128];
+ MDICLIENTINFO  *clientInfo = (MDICLIENTINFO*)clientWnd->wExtra;
+ WND    	*wndPtr     = WIN_FindWndPtr(hWndChild);
+ LPSTR		 lpWndText;
+ INT		 index      = 0,id,n;
+
+ if( !clientInfo->nActiveChildren ||
+     !clientInfo->hWindowMenu ) return 0;
+
+ id = wndPtr->wIDmenu;
+ DeleteMenu(clientInfo->hWindowMenu,id,MF_BYCOMMAND);
+
+ /* walk the rest of MDI children to prevent gaps in the id 
+  * sequence and in the menu child list 
+  */
+
+ for( index = id+1; index <= clientInfo->nActiveChildren + 
+                             clientInfo->idFirstChild; index++ )
+    {
+	wndPtr = WIN_FindWndPtr(MDI_GetChildByID(clientWnd,index));
+	if( !wndPtr )
+	     {
+	      dprintf_mdi(stddeb,"MDIMenuDeleteItem: no window for id=%i\n",index);
+	      continue;
+    }
+    
+	/* set correct id */
+	wndPtr->wIDmenu--;
+
+	n          = sprintf(buffer, "%d ",index - clientInfo->idFirstChild);
+	lpWndText  = (LPSTR) USER_HEAP_LIN_ADDR(wndPtr->hText);
+
+	if( lpWndText )
+	    strncpy(buffer + n, lpWndText, sizeof(buffer) - n - 1);	
+
+	/* change menu */
+	ModifyMenu(clientInfo->hWindowMenu ,index ,MF_BYCOMMAND | MF_STRING,
+		   index - 1 ,(LPSTR)buffer ); 
+    }
+ return 1;
+}
+
+/**********************************************************************
+ * 			MDI_GetWindow
+ *
+ * returns "activateable" child  or zero
+ */
+HWND MDI_GetWindow(WND  *clientWnd, HWND hWnd, WORD wTo )
+{
+ HWND            hWndNext;
+ MDICLIENTINFO  *clientInfo = (MDICLIENTINFO*)clientWnd->wExtra;
+ WND            *wndPtr;
+
+ if( !hWnd ) hWnd = clientInfo->hwndActiveChild;
+
+ if( !(wndPtr = WIN_FindWndPtr(hWnd)) ) return 0;
+
+ hWndNext = hWnd;
+ wTo      = wTo ? GW_HWNDPREV : GW_HWNDNEXT;
+
+ while( hWndNext )
+    {
+        if( clientWnd->hwndChild == hWndNext && wTo == GW_HWNDPREV )
+             hWndNext = GetWindow( hWndNext, GW_HWNDLAST);
+        else if( wndPtr->hwndNext == 0 && wTo == GW_HWNDNEXT )
+                 hWndNext = clientWnd->hwndChild;
+             else
+                 hWndNext = GetWindow( hWndNext, wTo );
+	
+        wndPtr = WIN_FindWndPtr( hWndNext );
+
+        if( (wndPtr->dwStyle & WS_VISIBLE) &&
+           !(wndPtr->dwStyle & WS_DISABLED) )
+             break;
+
+        /* check if all windows were iterated through */
+        if( hWndNext == hWnd ) break;
+    }
+
+ return ( hWnd == hWndNext )? 0 : hWndNext;
+}
+
+
+/**********************************************************************
  *					MDISetMenu
  * FIXME: This is not complete.
  */
@@ -94,7 +222,9 @@
 {
     MDICREATESTRUCT *cs = (MDICREATESTRUCT *)PTR_SEG_TO_LIN(lParam);
     HWND hwnd;
+    WORD	     wIDmenu = ci->idFirstChild + ci->nActiveChildren;
     int spacing;
+    char	     chDef = '\0';
 
     /*
      * Create child window
@@ -107,133 +237,68 @@
     cs->x = ci->nActiveChildren * spacing;  
     cs->y = ci->nActiveChildren * spacing;
 
+    /* this menu is needed to set a check mark in MDI_ChildActivate */
+    AppendMenu(ci->hWindowMenu ,MF_STRING ,wIDmenu, (LPSTR)&chDef);
+
     hwnd = CreateWindow( cs->szClass, cs->szTitle,
 			  WS_CHILD | WS_BORDER | WS_CAPTION | WS_CLIPSIBLINGS |
 			  WS_MAXIMIZEBOX | WS_MINIMIZEBOX | WS_SYSMENU |
 			  WS_THICKFRAME | WS_VISIBLE | cs->style,
-			  cs->x, cs->y, cs->cx, cs->cy, parent, (HMENU) 0,
-			  w->hInstance, (SEGPTR)lParam);
+			  cs->x, cs->y, cs->cx, cs->cy, parent, 
+                         (HMENU) wIDmenu, w->hInstance, (SEGPTR)lParam);
 
     if (hwnd)
     {
-	HANDLE h = USER_HEAP_ALLOC( sizeof(MDICHILDINFO) );
-	MDICHILDINFO *child_info = USER_HEAP_LIN_ADDR(h);
-	
-	if (!h)
-	{
-	    DestroyWindow(hwnd);
-	    return 0;
-	}
-
 	ci->nActiveChildren++;
+	MDI_MenuModifyItem(w ,hwnd); 
 
-	child_info->next = ci->infoActiveChildren;
-	child_info->prev = 0;
-	child_info->hwnd = hwnd;
-
-	if (ci->infoActiveChildren) {
-	    MDICHILDINFO *nextinfo = USER_HEAP_LIN_ADDR(ci->infoActiveChildren);
-	    nextinfo->prev = h;
-	}
-
-	ci->infoActiveChildren = h;
-
-	SendMessage(parent, WM_CHILDACTIVATE, 0, 0);
+	/* FIXME: at this point NC area of hwnd stays inactive */
     }
+    else
+	DeleteMenu(ci->hWindowMenu,wIDmenu,MF_BYCOMMAND);
 	
     return hwnd;
 }
 
 /**********************************************************************
- *					MDIDestroyChild
+ *			MDI_SwitchActiveChild
+ * 
+ * Notes: SetWindowPos sends WM_CHILDACTIVATE to the child window that is
+ *        being activated 
+ *
+ *        Ideally consecutive SetWindowPos should be replaced by 
+ *        BeginDeferWindowPos/EndDeferWindowPos but currently it doesn't
+ *        matter.
+ *
+ *	  wTo is basically lParam of WM_MDINEXT message
  */
-HWND MDIDestroyChild(WND *w_parent, MDICLIENTINFO *ci, HWND parent,
-		     HWND child, BOOL flagDestroy)
+void MDI_SwitchActiveChild(HWND clientHwnd, HWND childHwnd, WORD wTo )
 {
-    MDICHILDINFO  *chi;
-    HLOCAL hinfo;
-    
-    hinfo = ci->infoActiveChildren;
-    while (hinfo != 0) {
-	chi = (MDICHILDINFO *)USER_HEAP_LIN_ADDR(hinfo);
-	if (chi->hwnd == child) break;
-	hinfo = chi->next;
-    }
-    
-    if (hinfo != 0)
-    {
-	if (chi->prev)
-	    ((MDICHILDINFO *)USER_HEAP_LIN_ADDR(chi->prev))->next = chi->next;
-	if (chi->next)
-	    ((MDICHILDINFO *)USER_HEAP_LIN_ADDR(chi->next))->prev = chi->prev;
-	if (ci->infoActiveChildren == hinfo)
-	    ci->infoActiveChildren = chi->next;
-
-	ci->nActiveChildren--;
-	
-	if (chi->hwnd == ci->hwndActiveChild)
-	    SendMessage(parent, WM_CHILDACTIVATE, 0, 0);
-
-	USER_HEAP_FREE(hinfo);
-	
-	if (flagDestroy)
-	    DestroyWindow(child);
-    }
-    
-    return 0;
-}
-
-/**********************************************************************
- *					MDIBringChildToTop
- */
-void MDIBringChildToTop(HWND parent, WORD id, WORD by_id, BOOL send_to_bottom)
-{
-    HLOCAL hinfo;
-    MDICHILDINFO  *chi;
+    WND		  *w	     = WIN_FindWndPtr(clientHwnd);
+    HWND	   hwndTo    = MDI_GetWindow(w,childHwnd,wTo);
+    HWND	   hwndPrev;
     MDICLIENTINFO *ci;
-    WND           *w;
-    int            i;
 
-    w  = WIN_FindWndPtr(parent);
-    ci = (MDICLIENTINFO *) w->wExtra;
     
-    dprintf_mdi(stddeb, "MDIBringToTop: id %04x, by_id %d\n", id, by_id);
+    ci = (MDICLIENTINFO *) w->wExtra;
 
-    if (by_id)
-	id -= ci->idFirstChild;
-    if (!by_id || id < ci->nActiveChildren)
-    {
-	hinfo = ci->infoActiveChildren;
+    dprintf_mdi(stddeb, "MDI_SwitchActiveChild: "NPFMT", %i\n",childHwnd,wTo);
 
-	if (by_id)
-	{
-	    for (i = 0; i < id; i++)
-		hinfo = ((MDICHILDINFO *)USER_HEAP_LIN_ADDR(hinfo))->next;
-	    chi = USER_HEAP_LIN_ADDR(hinfo);
-	}
-	else
-	{
-	    while (hinfo != 0) {
-		chi = (MDICHILDINFO *)USER_HEAP_LIN_ADDR(hinfo);
-		if (chi->hwnd == (HWND)id) break;
-	        hinfo = chi->next;
-	    }
-	}
+    if ( !childHwnd || !hwndTo ) return; 
 
-	if (hinfo == 0)
-	    return;
+    hwndPrev = ci->hwndActiveChild;
 
-	dprintf_mdi(stddeb, "MDIBringToTop: child "NPFMT"\n", chi->hwnd);
-	if (hinfo != ci->infoActiveChildren)
+    if ( hwndTo != hwndPrev )
 	{
 	    if (ci->flagChildMaximized)
 	    {
 		RECT rectOldRestore, rect;
 
-		w = WIN_FindWndPtr(chi->hwnd);
+		w = WIN_FindWndPtr(hwndTo);
 		
+		/* save old window dimensions */
 		rectOldRestore = ci->rectRestore;
-		GetWindowRect(chi->hwnd, &ci->rectRestore);
+		GetWindowRect(hwndTo, &ci->rectRestore);
 
 		rect.top    = (ci->rectMaximize.top -
 			       (w->rectClient.top - w->rectWindow.top));
@@ -244,61 +309,99 @@
 		rect.right  = (ci->rectMaximize.right +
 			       (w->rectWindow.right - w->rectClient.right));
 		w->dwStyle |= WS_MAXIMIZE;
-		SetWindowPos(chi->hwnd, HWND_TOP, rect.left, rect.top, 
+
+		/* maximize it */
+		ci->flagChildMaximized = childHwnd; /* prevent maximization
+						     * in MDI_ChildActivate
+						     */
+
+		SetWindowPos( hwndTo, HWND_TOP, rect.left, rect.top, 
 			     rect.right - rect.left + 1,
 			     rect.bottom - rect.top + 1, 0);
-		SendMessage(chi->hwnd, WM_SIZE, SIZE_MAXIMIZED,
+
+		SendMessage( hwndTo, WM_SIZE, SIZE_MAXIMIZED,
 			    MAKELONG(w->rectClient.right-w->rectClient.left,
 				     w->rectClient.bottom-w->rectClient.top));
 
-		w = WIN_FindWndPtr(ci->hwndActiveChild);
+		w = WIN_FindWndPtr(hwndPrev);
+
+	        if( w )
+		  {
 		w->dwStyle &= ~WS_MAXIMIZE;
-		SetWindowPos(ci->hwndActiveChild, HWND_BOTTOM, 
+
+		     /* push hwndPrev to the bottom if needed */
+		     if( !wTo )
+		         SetWindowPos(hwndPrev, HWND_BOTTOM, 
 			     rectOldRestore.left, rectOldRestore.top, 
 			     rectOldRestore.right - rectOldRestore.left + 1, 
 			     rectOldRestore.bottom - rectOldRestore.top + 1,
-			     SWP_NOACTIVATE | 
-			     (send_to_bottom ? 0 : SWP_NOZORDER));
+			          SWP_NOACTIVATE );
+	          }
 	    }
 	    else
 	    {
-		SetWindowPos(chi->hwnd, HWND_TOP, 0, 0, 0, 0, 
+		SetWindowPos( hwndTo, HWND_TOP, 0, 0, 0, 0, 
 			     SWP_NOMOVE | SWP_NOSIZE );
-		if (send_to_bottom)
+		if( !wTo && hwndPrev )
 		{
-		    SetWindowPos(ci->hwndActiveChild, HWND_BOTTOM, 0, 0, 0, 0, 
+		    SetWindowPos( hwndPrev, HWND_BOTTOM, 0, 0, 0, 0, 
 				 SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE);
 		}
 	    }
+    }
 		
-	    if (chi->next)
-		((MDICHILDINFO *)USER_HEAP_LIN_ADDR(chi->next))->prev = chi->prev;
+}
 
-	    if (chi->prev)
-		((MDICHILDINFO *)USER_HEAP_LIN_ADDR(chi->prev))->next = chi->next;
 	    
-	    chi->prev              = 0;
-	    chi->next              = ci->infoActiveChildren;
-	    ((MDICHILDINFO *)USER_HEAP_LIN_ADDR(chi->next))->prev = hinfo;
-	    ci->infoActiveChildren = hinfo;
+/**********************************************************************
+ *                                      MDIDestroyChild
+ */
+HWND MDIDestroyChild(WND *w_parent, MDICLIENTINFO *ci, HWND parent,
+                     HWND child, BOOL flagDestroy)
+{
+    WND         *childPtr = WIN_FindWndPtr(child);
 
-	    SendMessage(parent, WM_CHILDACTIVATE, 0, 0);
+    if( childPtr )
+    {
+        if( child == ci->hwndActiveChild )
+          {
+	    MDI_SwitchActiveChild(parent,child,0);
+
+	    if( child == ci->hwndActiveChild )
+                MDI_ChildActivate(w_parent,0);
+
+	    MDI_MenuDeleteItem(w_parent, child);
 	}
 	
-	dprintf_mdi(stddeb, "MDIBringToTop: pos %04x, hwnd "NPFMT"\n", 
-		id, chi->hwnd);
+        ci->nActiveChildren--;
+
+        if( ci->flagChildMaximized == child )
+            ci->flagChildMaximized = 1;
+
+        if (flagDestroy)
+	   {
+            DestroyWindow(child);
+	    PostMessage(parent,WM_MDICALCCHILDSCROLL,0,0L);
+	    ci->sbRecalc |= (SB_BOTH+1);
+	   }
     }
+
+    return 0;
 }
 
+
 /**********************************************************************
  *					MDIMaximizeChild
  */
 LONG MDIMaximizeChild(HWND parent, HWND child, MDICLIENTINFO *ci)
 {
+
     WND *w = WIN_FindWndPtr(child);
     RECT rect;
     
-    MDIBringChildToTop(parent, child, FALSE, FALSE);
+    if( !SendMessage( child, WM_QUERYOPEN, 0, 0L) )
+	 return 0;
+    
     ci->rectRestore = w->rectWindow;
 
     rect.top    = (ci->rectMaximize.top -
@@ -310,15 +413,16 @@
     rect.right  = (ci->rectMaximize.right +
 		   (w->rectWindow.right - w->rectClient.right));
     w->dwStyle |= WS_MAXIMIZE;
+
     SetWindowPos(child, 0, rect.left, rect.top, 
-		 rect.right - rect.left + 1, rect.bottom - rect.top + 1,
-		 SWP_NOACTIVATE | SWP_NOZORDER);
+		 rect.right - rect.left + 1, rect.bottom - rect.top + 1, 0);
     
-    ci->flagChildMaximized = TRUE;
+    ci->flagChildMaximized = child;
     
     SendMessage(child, WM_SIZE, SIZE_MAXIMIZED,
 		MAKELONG(w->rectClient.right-w->rectClient.left,
 			 w->rectClient.bottom-w->rectClient.top));
+
     SendMessage(GetParent(parent), WM_NCPAINT, 0, 0);
 
     return 0;
@@ -329,64 +433,163 @@
  */
 LONG MDIRestoreChild(HWND parent, MDICLIENTINFO *ci)
 {
-    HWND    child;
+    HWND    hWnd;
 
-    dprintf_mdi(stddeb,"restoring mdi child\n");
+    hWnd = ci->hwndActiveChild;
 
-    child = ci->hwndActiveChild;
+    dprintf_mdi(stddeb,"MDIRestoreChild: restore "NPFMT"\n", hWnd);
+
     ci->flagChildMaximized = FALSE;
 
-    ShowWindow(child, SW_RESTORE);		/* display the window */
-    MDIBringChildToTop(parent, child, FALSE, FALSE);
-    SendMessage(GetParent(parent), WM_NCPAINT, 0, 0);
+    ShowWindow(hWnd, SW_RESTORE);		/* display the window */
+
+    hWnd = GetParent(parent);
+
+    SendMessage(hWnd,WM_NCPAINT , 0, 0);
 
     return 0;
 }
 
 /**********************************************************************
- *					MDIChildActivated
+ *					MDI_ChildActivate
+ *
+ * Note: hWndChild is NULL when last child is being destroyed
  */
-LONG MDIChildActivated(WND *w, MDICLIENTINFO *ci, HWND parent)
+LONG MDI_ChildActivate(WND *clientPtr, HWND hWndChild)
 {
-    HLOCAL hinfo;
-    MDICHILDINFO *chi;
-    HWND          deact_hwnd;
-    HWND          act_hwnd;
-    LONG          lParam;
+    MDICLIENTINFO       *clientInfo = (MDICLIENTINFO*)clientPtr->wExtra; 
+    HWND                 prevActiveWnd = clientInfo->hwndActiveChild;
+    WND                 *wndPtr = WIN_FindWndPtr( hWndChild );
+    WND			*wndPrev = WIN_FindWndPtr( prevActiveWnd );
+    BOOL		 isActiveFrameWnd = 0;	 
 
-    dprintf_mdi(stddeb, "MDIChildActivate: top "NPFMT"\n", w->hwndChild);
+    if( hWndChild == prevActiveWnd ) return 0L;
 
-    hinfo = ci->infoActiveChildren;
-    if (hinfo)
+    if( wndPtr )
+        if( wndPtr->dwStyle & WS_DISABLED ) return 0L;
+
+    dprintf_mdi(stddeb,"MDI_ChildActivate: "NPFMT"\n", hWndChild);
+
+    if( GetActiveWindow() == clientPtr->hwndParent )
+        isActiveFrameWnd = TRUE;
+	
+    /* deactivate prev. active child */
+    if( wndPrev )
     {
-	chi = (MDICHILDINFO *)USER_HEAP_LIN_ADDR(hinfo);
-	deact_hwnd = ci->hwndActiveChild;
-	act_hwnd   = chi->hwnd;                /* FIX: Hack */
-	lParam     = ((LONG) deact_hwnd << 16) | (LONG)act_hwnd;
+	SendMessage( prevActiveWnd, WM_NCACTIVATE, FALSE, 0L );
+        SendMessage( prevActiveWnd, WM_MDIACTIVATE, FALSE,
+					    MAKELONG(hWndChild,prevActiveWnd));
+        /* uncheck menu item */
+       	if( clientInfo->hWindowMenu )
+       	        CheckMenuItem( clientInfo->hWindowMenu,
+       	                       wndPrev->wIDmenu, 0);
+      }
 
-	dprintf_mdi(stddeb, "MDIChildActivate: deact "NPFMT", act "NPFMT"\n",
-	       deact_hwnd, act_hwnd);
+    /* set appearance */
+    if( clientInfo->flagChildMaximized )
+      if( clientInfo->flagChildMaximized != hWndChild )
+        if( hWndChild )
+	        {
+		  clientInfo->hwndActiveChild = hWndChild;
+		  MDIMaximizeChild(GetParent(hWndChild),hWndChild,clientInfo);
+	        }
 
-	ci->hwndActiveChild = act_hwnd;
+    clientInfo->hwndActiveChild = hWndChild;
 
-	if (deact_hwnd != act_hwnd)
+    /* check if we have any children left */
+    if( !hWndChild )
 	{
-	    MDIRecreateMenuList(ci);
-	    SendMessage(deact_hwnd,  WM_NCACTIVATE, FALSE, 0);
-	    SendMessage(deact_hwnd, WM_MDIACTIVATE, FALSE, lParam);
+	    if( isActiveFrameWnd )
+		SetFocus( GetParent(hWndChild) );
+	    return 0;
 	}
 	
-	SendMessage(act_hwnd,  WM_NCACTIVATE, TRUE, 0);
-	SendMessage(act_hwnd, WM_MDIACTIVATE, TRUE, lParam);
+    /* check menu item */
+    if( clientInfo->hWindowMenu )
+              CheckMenuItem( clientInfo->hWindowMenu,
+                             wndPtr->wIDmenu, MF_CHECKED);
+
+    /* bring active child to the top */
+    SetWindowPos( hWndChild, 0,0,0,0,0, SWP_NOSIZE | SWP_NOMOVE | SWP_NOACTIVATE);
+
+    if( isActiveFrameWnd )
+	  {
+	    SendMessage( hWndChild, WM_NCACTIVATE, TRUE, 0L);
+	    if( GetFocus() == GetParent(hWndChild) )
+		SendMessage( GetParent(hWndChild), WM_SETFOCUS, 
+			     GetParent(hWndChild), 0L );
+	    else
+		SetFocus( GetParent(hWndChild) );
     }
 
-    if (hinfo || ci->nActiveChildren == 0)
+    SendMessage( hWndChild, WM_MDIACTIVATE, TRUE,
+				       MAKELONG(prevActiveWnd,hWndChild) );
+
+    return 1;
+}
+
+/**********************************************************************
+ *			MDI_BuildWCL
+ *
+ *  iTotal returns number of children available for tiling or cascading
+ */
+MDIWCL* MDI_BuildWCL(WND* clientWnd, int* iTotal)
+{
+    MDIWCL *listTop,*listNext;
+    WND    *childWnd;
+
+    if (!(listTop = (MDIWCL*)malloc( sizeof(MDIWCL) ))) return NULL;
+
+    listTop->hChild = clientWnd->hwndChild;
+    listTop->prev   = NULL;
+    *iTotal 	    = 1;
+
+    /* build linked list from top child to bottom */
+
+    childWnd  =  WIN_FindWndPtr( listTop->hChild );
+    while( childWnd && childWnd->hwndNext )
     {
-	MDIRecreateMenuList(ci);
-	SendMessage(GetParent(parent), WM_NCPAINT, 0, 0);
-    }
+	listNext = (MDIWCL*)malloc(sizeof(MDIWCL));
+	
+	if( !listNext )
+	{
+	    /* quit gracefully */
+	    listNext = listTop->prev;
+	    while( listTop )
+	    {
+                listNext = listTop->prev;
+                free(listTop);
+                listTop  = listNext;
+	    }
+	    fprintf(stdnimp,"MDICascade: allocation failed\n");
+	    return NULL;
+	}
     
-    return 0;
+	if( (childWnd->dwStyle & WS_DISABLED) ||
+	    (childWnd->dwStyle & WS_MINIMIZE) ||
+	    !(childWnd->dwStyle & WS_VISIBLE)   )
+	{
+	    listTop->hChild = 0;
+	    (*iTotal)--;
+	}
+
+	listNext->hChild = childWnd->hwndNext;
+	listNext->prev   = listTop;
+	listTop          = listNext;
+	(*iTotal)++;
+
+	childWnd  =  WIN_FindWndPtr( childWnd->hwndNext );
+    }
+
+    if( (childWnd->dwStyle & WS_DISABLED) ||
+	(childWnd->dwStyle & WS_MINIMIZE) ||
+	!(childWnd->dwStyle & WS_VISIBLE)   )
+    {
+	listTop->hChild = 0;
+	(*iTotal)--;
+    }
+ 
+    return listTop;
 }
 
 /**********************************************************************
@@ -394,19 +597,17 @@
  */
 LONG MDICascade(HWND parent, MDICLIENTINFO *ci)
 {
-    HLOCAL hinfo;
-    MDICHILDINFO *chi;
+    WND		 *clientWnd;
+    MDIWCL	 *listTop,*listPrev;
     RECT          rect;
     int           spacing, xsize, ysize;
     int		  x, y;
+    int		  iToPosition = 0;
 
     if (ci->flagChildMaximized)
 	MDIRestoreChild(parent, ci);
 
-    /* If there aren't any children, don't even bother.
-     */
-    if (ci->nActiveChildren == 0)
-        return 0;
+    if (ci->nActiveChildren == 0) return 0;
 
     GetClientRect(parent, &rect);
     spacing = GetSystemMetrics(SM_CYCAPTION) + GetSystemMetrics(SM_CYFRAME);
@@ -417,30 +618,34 @@
       "MDICascade: Client wnd at (%ld,%ld) - (%ld,%ld), spacing %d\n", 
       (LONG)rect.left, (LONG)rect.top, (LONG)rect.right, (LONG)rect.bottom,
       spacing);
-    dprintf_mdi(stddeb, "MDICascade: searching for last child\n");
-    hinfo = ci->infoActiveChildren;
-    while(1) {
-	chi = USER_HEAP_LIN_ADDR(hinfo);
-	if (chi->next == 0) break;
-	hinfo = chi->next;
-    }
     
-    dprintf_mdi(stddeb, "MDICascade: last child is "NPFMT"\n", chi->hwnd);
+    clientWnd =  WIN_FindWndPtr( parent );
+
+    listTop   =  MDI_BuildWCL(clientWnd,&iToPosition); 
+
+    if( !listTop ) return 0;
+
     x = 0;
     y = 0;
-    while (hinfo != 0)
+
+    /* walk list and move windows */
+    while ( listTop )
     {
-	chi = USER_HEAP_LIN_ADDR(hinfo);
 	dprintf_mdi(stddeb, "MDICascade: move "NPFMT" to (%d,%d) size [%d,%d]\n", 
-		chi->hwnd, x, y, xsize, ysize);
-        if (IsIconic(chi->hwnd)) continue;
-	SetWindowPos(chi->hwnd, 0, x, y, xsize, ysize, 
+		listTop->hChild, x, y, xsize, ysize);
+
+	if( listTop->hChild )
+          {
+	   SetWindowPos(listTop->hChild, 0, x, y, xsize, ysize, 
 		     SWP_DRAWFRAME | SWP_NOACTIVATE | SWP_NOZORDER);
 
 	x += spacing;
 	y += spacing;
+	  }
 	
-	hinfo = chi->prev;
+	listPrev = listTop->prev;
+	free(listTop);
+	listTop = listPrev;
     }
 
     return 0;
@@ -448,57 +653,84 @@
 
 /**********************************************************************
  *					MDITile
+ *
  */
 LONG MDITile(HWND parent, MDICLIENTINFO *ci)
 {
-    HLOCAL hinfo;
-    MDICHILDINFO *chi;
+    WND		 *wndClient = WIN_FindWndPtr(parent);
+    MDIWCL       *listTop,*listPrev;
     RECT          rect;
     int           xsize, ysize;
     int		  x, y;
     int		  rows, columns;
     int           r, c;
     int           i;
+    int		  iToPosition = 0;
 
     if (ci->flagChildMaximized)
 	MDIRestoreChild(parent, ci);
 
-    /* If there aren't any children, don't even bother.
-     */
-    if (ci->nActiveChildren == 0)
-        return 0;
+    if (ci->nActiveChildren == 0) return 0;
+
+    listTop = MDI_BuildWCL(wndClient, &iToPosition);
+
+    dprintf_mdi(stddeb,"MDITile: %i windows to tile\n",iToPosition);
+
+    if( !listTop ) return 0;
 
     GetClientRect(parent, &rect);
-    rows    = (int) sqrt((double) ci->nActiveChildren);
-    columns = ci->nActiveChildren / rows;
+
+    rows    = (int) sqrt((double) iToPosition);
+    columns = iToPosition / rows;
+
+    /* hack */
+    if( iToPosition != ci->nActiveChildren)
+        {
+           y = rect.bottom - 2 * SYSMETRICS_CYICONSPACING - SYSMETRICS_CYICON;
+           rect.bottom = ( y - SYSMETRICS_CYICON < rect.top )? rect.bottom: y;
+	}
+
     ysize   = rect.bottom / rows;
     xsize   = rect.right  / columns;
     
-    hinfo   = ci->infoActiveChildren;
     x       = 0;
     i       = 0;
+
     for (c = 1; c <= columns; c++)
     {
 	if (c == columns)
 	{
-	    rows  = ci->nActiveChildren - i;
+	    rows  = iToPosition - i;
 	    ysize = rect.bottom / rows;
 	}
 
 	y = 0;
 	for (r = 1; r <= rows; r++, i++)
 	{
-	    chi = (MDICHILDINFO *)USER_HEAP_LIN_ADDR(hinfo);
-	    SetWindowPos(chi->hwnd, 0, x, y, xsize, ysize, 
-			 SWP_DRAWFRAME | SWP_NOACTIVATE | SWP_NOZORDER);
+	    /* shouldn't happen but... */
+	    if( !listTop )
+		 break;
 
+	    if( listTop->hChild )
+		{
+	            SetWindowPos(listTop->hChild, 0, x, y, xsize, ysize, 
+			 SWP_DRAWFRAME | SWP_NOACTIVATE | SWP_NOZORDER);
 	    y += ysize;
-	    hinfo = chi->next;
+		}
+
+            listPrev = listTop->prev;
+            free(listTop);
+            listTop = listPrev;
 	}
 
 	x += xsize;
     }
     
+    /* free the rest if any */
+    while( listTop ) {
+	 listPrev = listTop->prev;
+	 free(listTop);
+	 listTop = listPrev; }
 
     return 0;
 }
@@ -630,19 +862,18 @@
     
     switch (message)
     {
-      case WM_CHILDACTIVATE:
-	return MDIChildActivated(w, ci, hwnd);
-
       case WM_CREATE:
 	cs                      = (LPCREATESTRUCT) PTR_SEG_TO_LIN(lParam);
 	ccs                     = (LPCLIENTCREATESTRUCT) PTR_SEG_TO_LIN(cs->lpCreateParams);
 	ci->hWindowMenu         = ccs->hWindowMenu;
 	ci->idFirstChild        = ccs->idFirstChild;
-	ci->infoActiveChildren  = 0;
-	ci->flagMenuAltered     = FALSE;
 	ci->flagChildMaximized  = FALSE;
+	ci->sbStop		= 0;
+
 	w->dwStyle             |= WS_CLIPCHILDREN;
 
+	AppendMenu(ccs->hWindowMenu,MF_SEPARATOR,0,NULL);
+
 	GetClientRect(w->hwndParent, &ci->rectMaximize);
 	MoveWindow(hwnd, 0, 0, 
 		   ci->rectMaximize.right, ci->rectMaximize.bottom, 1);
@@ -650,7 +881,7 @@
 	return 0;
 
       case WM_MDIACTIVATE:
-	MDIBringChildToTop(hwnd, wParam, FALSE, FALSE);
+	SetWindowPos(wParam,0,0,0,0,0, SWP_NOSIZE | SWP_NOMOVE );
 	return 0;
 
       case WM_MDICASCADE:
@@ -664,16 +895,20 @@
 
       case WM_MDIGETACTIVE:
 	return ((LONG) ci->hwndActiveChild | 
-		((LONG) ci->flagChildMaximized << 16));
+		((LONG) (ci->flagChildMaximized>0) << 16));
 
       case WM_MDIICONARRANGE:
-	return MDIIconArrange(hwnd);
+	       ci->sbStop = TRUE;
+	       MDIIconArrange(hwnd);
+	       ci->sbStop = FALSE;
+	       SendMessage(hwnd,WM_MDICALCCHILDSCROLL,0,0L);
+	       return 0;
 	
       case WM_MDIMAXIMIZE:
 	return MDIMaximizeChild(hwnd, wParam, ci);
 
       case WM_MDINEXT:
-	MDIBringChildToTop(hwnd, wParam, FALSE, TRUE);
+	MDI_SwitchActiveChild(hwnd, (HWND)wParam, lParam);
 	break;
 	
       case WM_MDIRESTORE:
@@ -683,27 +918,55 @@
 	return MDISetMenu(hwnd, wParam, LOWORD(lParam), HIWORD(lParam));
 	
       case WM_MDITILE:
-	return MDITile(hwnd, ci);
+	ci->sbStop = TRUE;
+	ShowScrollBar(hwnd,SB_BOTH,FALSE);
+	MDITile(hwnd, ci);
+        ci->sbStop = FALSE;
+        return 0;
+
+      case WM_VSCROLL:
+      case WM_HSCROLL:
+	ci->sbStop = TRUE;
+        ScrollChildren(hwnd,message,wParam,lParam);
+	ci->sbStop = FALSE;
+        return 0;
+
+      case WM_SETFOCUS:
+	if( ci->hwndActiveChild )
+	  {
+	   w = WIN_FindWndPtr( ci->hwndActiveChild );
+	   if( !(w->dwStyle & WS_MINIMIZE) )
+	       SetFocus( ci->hwndActiveChild );
+	  } 
+	return 0;
 	
       case WM_NCACTIVATE:
+        if( ci->hwndActiveChild )
 	SendMessage(ci->hwndActiveChild, message, wParam, lParam);
 	break;
 	
       case WM_PARENTNOTIFY:
-	if (wParam == WM_DESTROY)
-#ifdef WINELIB32
-	    return MDIDestroyChild(w, ci, hwnd, lParam, FALSE);
-#else
-	    return MDIDestroyChild(w, ci, hwnd, LOWORD(lParam), FALSE);
-#endif
-	else if (wParam == WM_LBUTTONDOWN)
-	    MDIBringChildToTop(hwnd, ci->hwndHitTest, FALSE, FALSE);
+	if (wParam == WM_LBUTTONDOWN)
+	     SetWindowPos(ci->hwndHitTest, 0,0,0,0,0, SWP_NOSIZE | SWP_NOMOVE );
 	break;
 
       case WM_SIZE:
 	GetClientRect(w->hwndParent, &ci->rectMaximize);
+	if( !ci->hwndActiveChild )
+	  {
+	     PostMessage(hwnd,WM_MDICALCCHILDSCROLL,0,0L);
+	     ci->sbRecalc |= (SB_BOTH+1);
+	  }
 	break;
 
+      case WM_MDICALCCHILDSCROLL:
+	if( !ci->sbStop )
+	  if( ci->sbRecalc )
+	    {
+	      CalcChildScroll(hwnd, ci->sbRecalc-1);
+	      ci->sbRecalc = 0;
+	    }
+	return 0;
     }
     
     return DefWindowProc(hwnd, message, wParam, lParam);
@@ -716,12 +979,17 @@
 LRESULT DefFrameProc(HWND hwnd, HWND hwndMDIClient, UINT message, 
 		     WPARAM wParam, LPARAM lParam)
 {
+    HWND	childHwnd;
+
     if (hwndMDIClient)
     {
 	switch (message)
 	{
 	  case WM_COMMAND:
-	    MDIBringChildToTop(hwndMDIClient, wParam, TRUE, FALSE);
+	    childHwnd = MDI_GetChildByID( WIN_FindWndPtr(hwndMDIClient),
+                                          wParam );
+ 	    if( childHwnd )
+	        SendMessage(hwndMDIClient, WM_MDIACTIVATE, childHwnd , 0L);
 	    break;
 
 	  case WM_NCLBUTTONDOWN:
@@ -739,7 +1007,7 @@
 				     message, wParam, lParam);
 	
 	  case WM_SETFOCUS:
-	    SendMessage(hwndMDIClient, WM_SETFOCUS, wParam, lParam);
+	    SetFocus(hwndMDIClient);
 	    break;
 
 	  case WM_SIZE:
@@ -763,10 +1031,10 @@
 #endif
 {
     MDICLIENTINFO       *ci;
-    WND                 *w;
+    WND                 *clientWnd;
 
-    w  = WIN_FindWndPtr(GetParent(hwnd));
-    ci = (MDICLIENTINFO *) w->wExtra;
+    clientWnd  = WIN_FindWndPtr(GetParent(hwnd));
+    ci         = (MDICLIENTINFO *) clientWnd->wExtra;
     
     switch (message)
     {
@@ -774,10 +1042,29 @@
 	ci->hwndHitTest = hwnd;
 	break;
 	
-      case WM_NCPAINT:
-	NC_DoNCPaint( hwnd, hwnd == ci->hwndActiveChild, FALSE );
+      case WM_SETTEXT:
+	DefWindowProc(hwnd, message, wParam, lParam);
+	MDI_MenuModifyItem(clientWnd,hwnd);
         return 0;
 
+      case WM_CLOSE:
+	SendMessage(GetParent(hwnd),WM_MDIDESTROY,hwnd,0L);
+	return 0;
+
+      case WM_SIZE:
+	if( ci->hwndActiveChild != hwnd )
+	    MDI_ChildActivate(clientWnd, hwnd);
+	break;
+
+      case WM_CHILDACTIVATE:
+	MDI_ChildActivate(clientWnd, hwnd);
+	return 0;
+
+      case WM_NCPAINT:
+	dprintf_mdi(stddeb,"DefMDIChildProc: WM_NCPAINT for "NPFMT", active "NPFMT"\n",
+					     hwnd, ci->hwndActiveChild );
+	break;
+
       case WM_SYSCOMMAND:
 	switch (wParam)
 	{
@@ -789,6 +1076,34 @@
 	}
 	break;
 	
+      /* should also handle following messages */
+      case WM_GETMINMAXINFO:
+	   /* should return rect of MDI client 
+	    * so that normal ShowWindow will be able to handle
+	    * actions that are handled by MDIMaximize and MDIRestore */
+
+      case WM_SETVISIBLE:
+         if( !ci->sbStop )
+          {
+            PostMessage(GetParent(hwnd),WM_MDICALCCHILDSCROLL,0,0L);
+            ci->sbRecalc |= (SB_BOTH+1);
+          }
+	break;
+      case WM_SETFOCUS:
+	if( IsChild( GetActiveWindow(), GetParent(hwnd)) )
+	    SendMessage(clientWnd->hwndChild,WM_CHILDACTIVATE,0,0L);
+        if( !ci->sbStop )
+          {
+            PostMessage(GetParent(hwnd),WM_MDICALCCHILDSCROLL,0,0L);
+            ci->sbRecalc |= (SB_BOTH+1);
+          }
+	break;
+
+      case WM_MENUCHAR:
+      case WM_NEXTMENU:
+	   /* set current menu to child system menu */
+
+	break;	
     }
 	
     return DefWindowProc(hwnd, message, wParam, lParam);
@@ -836,3 +1151,81 @@
         SetScrollPos( hwnd, SB_HORZ, clientRect.top - childRect.top, TRUE );
     }
 }
+
+/***********************************************************************
+ *           ScrollChildren   (USER.463)
+ */
+void ScrollChildren(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
+{
+ WND	*wndPtr = WIN_FindWndPtr(hWnd);
+ short 	 newPos;
+ short 	 curPos;
+ short 	 length;
+ short 	 minPos;
+ short 	 maxPos;
+ short   shift;
+
+ if( !wndPtr ) return;
+
+ if( uMsg == WM_HSCROLL )
+   {
+     GetScrollRange(hWnd,SB_HORZ,&minPos,&maxPos);
+     curPos = GetScrollPos(hWnd,SB_HORZ);
+     length = (wndPtr->rectClient.right - wndPtr->rectClient.left)/2;
+     shift = SYSMETRICS_CYHSCROLL;
+   }
+ else if( uMsg == WM_VSCROLL )
+	{
+	  GetScrollRange(hWnd,SB_VERT,&minPos,&maxPos);
+	  curPos = GetScrollPos(hWnd,SB_VERT);
+	  length = (wndPtr->rectClient.bottom - wndPtr->rectClient.top)/2;
+	  shift = SYSMETRICS_CXVSCROLL;
+	}
+      else return;
+
+ switch( wParam )
+   {
+	case SB_LINEUP:	
+		        newPos = curPos - shift;
+			break;
+	case SB_LINEDOWN:    
+			newPos = curPos + shift;
+			break;
+	case SB_PAGEUP:	
+			newPos = curPos - length;
+			break;
+	case SB_PAGEDOWN:    
+			newPos = curPos + length;
+			break;
+
+	case SB_THUMBPOSITION: 
+			newPos = LOWORD(lParam);
+			break;
+
+	case SB_THUMBTRACK:  
+			return;
+
+	case SB_TOP:		
+			newPos = minPos;
+			break;
+	case SB_BOTTOM:	
+			newPos = maxPos;
+			break;
+	case SB_ENDSCROLL:
+			CalcChildScroll(hWnd,(uMsg == WM_VSCROLL)?SB_VERT:SB_HORZ);
+			return;
+   }
+
+ if( newPos > maxPos )
+     newPos = maxPos;
+ else if( newPos < minPos )
+	  newPos = minPos;
+
+ SetScrollPos(hWnd, (uMsg == WM_VSCROLL)?SB_VERT:SB_HORZ , newPos, TRUE);
+
+ if( uMsg == WM_VSCROLL )
+     ScrollWindow(hWnd ,0 ,curPos - newPos, NULL, NULL);
+ else
+     ScrollWindow(hWnd ,curPos - newPos, 0, NULL, NULL);
+}
+
diff --git a/windows/message.c b/windows/message.c
index 8360974..23afe53 100644
--- a/windows/message.c
+++ b/windows/message.c
@@ -23,20 +23,22 @@
 /* #define DEBUG_MSG */
 #include "debug.h"
 
-
 #define HWND_BROADCAST  ((HWND)0xffff)
-
 #define MAX_QUEUE_SIZE   120  /* Max. size of a message queue */
 
 
 extern BOOL TIMER_CheckTimer( LONG *next, MSG *msg,
 			      HWND hwnd, BOOL remove );  /* timer.c */
 
-  /* System message queue (for hardware events) */
-static HANDLE hmemSysMsgQueue = 0;
-static MESSAGEQUEUE * sysMsgQueue = NULL;
+/* ------- Internal Queues ------ */
 
-  /* Double-click time */
+static HANDLE hmemSysMsgQueue = 0;
+static MESSAGEQUEUE *sysMsgQueue = NULL;
+
+HANDLE hActiveQ_G      = 0;
+static HANDLE hFirstQueue = 0;
+
+/* ------- Miscellaneous ------ */
 static int doubleClickSpeed = 452;
 
 
@@ -62,6 +64,43 @@
     return hQueue;
 }
 
+/***********************************************************************
+ *	     MSG_DeleteMsgQueue
+ */
+BOOL MSG_DeleteMsgQueue( HANDLE hQueue )
+{
+ MESSAGEQUEUE * msgQueue = (MESSAGEQUEUE*)GlobalLock(hQueue);
+
+ if( !hQueue )
+   {
+	dprintf_msg(stddeb,"DeleteMsgQueue: invalid argument.\n");
+	return 0;
+   }
+
+ if( !msgQueue ) return 0;
+
+ if( hQueue == hFirstQueue )
+	hFirstQueue = msgQueue->next;
+ else if( hFirstQueue )
+	{
+	  MESSAGEQUEUE *msgQ = (MESSAGEQUEUE*)GlobalLock(hFirstQueue);
+
+	  /* walk up queue list and relink if needed */
+	  while( msgQ->next )
+	    {
+		if( msgQ->next == hQueue )
+		    msgQ->next = msgQueue->next;
+
+		/* should check for intertask sendmessages here */
+
+
+	        msgQ = (MESSAGEQUEUE*)GlobalLock(msgQ->next);
+	    }
+	}
+
+ GlobalFree( hQueue );
+ return 1;
+}
 
 /***********************************************************************
  *           MSG_CreateSysMsgQueue
@@ -169,6 +208,15 @@
     msgQueue->tempStatus = 0;
 }
 
+/***********************************************************************
+ *	     MSG_GetQueueTask
+ */
+HTASK MSG_GetQueueTask( HANDLE hQueue )
+{
+    MESSAGEQUEUE *msgQ = GlobalLock( hQueue );
+
+    return (msgQ) ? msgQ->hTask : 0 ;
+}
 
 /***********************************************************************
  *           MSG_GetWindowForEvent
@@ -624,7 +672,9 @@
  */
 BOOL SetMessageQueue( int size )
 {
-    HGLOBAL hQueue;
+    HGLOBAL  	  hQueue    = 0;
+    HGLOBAL  	  hNextQueue= hFirstQueue;
+    MESSAGEQUEUE *queuePrev = NULL;
     MESSAGEQUEUE *queuePtr;
 
     if ((size > MAX_QUEUE_SIZE) || (size <= 0)) return TRUE;
@@ -632,13 +682,47 @@
       /* Free the old message queue */
     if ((hQueue = GetTaskQueue(0)) != 0)
     {
-	GlobalUnlock( hQueue );
-	GlobalFree( hQueue );
+	MESSAGEQUEUE *queuePtr = (MESSAGEQUEUE *)GlobalLock( hQueue );
+	
+	if( queuePtr )
+	{
+	    MESSAGEQUEUE *msgQ = (MESSAGEQUEUE*)GlobalLock(hFirstQueue);
+
+	    hNextQueue = queuePtr->next;
+
+            if( msgQ )
+		if( hQueue != hFirstQueue )
+		    while( msgQ->next )
+		    { 
+			if( msgQ->next == hQueue )
+			{ 
+			    queuePrev = msgQ;
+			    break;
+			} 
+			msgQ = (MESSAGEQUEUE*)GlobalLock(msgQ->next);
+		    }
+	    GlobalUnlock( hQueue );
+	    MSG_DeleteMsgQueue( hQueue );
+	}
     }
   
-    if (!(hQueue = MSG_CreateMsgQueue( size ))) return FALSE;
+    if( !(hQueue = MSG_CreateMsgQueue( size ))) 
+    {
+	if(queuePrev) 
+	    /* it did have a queue */
+	    queuePrev->next = hNextQueue;
+	return FALSE;
+    }
+  
     queuePtr = (MESSAGEQUEUE *)GlobalLock( hQueue );
     queuePtr->hTask = GetCurrentTask();
+    queuePtr->next  = hNextQueue;
+
+    if( !queuePrev )  
+         hFirstQueue = hQueue;
+    else
+	 queuePrev->next = hQueue;
+
     SetTaskQueue( 0, hQueue );
     return TRUE;
 }
diff --git a/windows/nonclient.c b/windows/nonclient.c
index 086dc18..9df7ae5 100644
--- a/windows/nonclient.c
+++ b/windows/nonclient.c
@@ -19,9 +19,11 @@
 #include "nonclient.h"
 #include "graphics.h"
 #include "selectors.h"
+#include "stackframe.h"
 #include "stddebug.h"
 /* #define DEBUG_NONCLIENT */
 #include "debug.h"
+#include "options.h"
 
 
 static HBITMAP hbitmapClose = 0;
@@ -35,12 +37,17 @@
 #define SC_ABOUTWINE    	(SC_SCREENSAVE+1)
 
   /* Some useful macros */
+#define IS_MANAGED(style) \
+    (Options.managed && !((style) & WS_CHILD))
+
 #define HAS_DLGFRAME(style,exStyle) \
-    (((exStyle) & WS_EX_DLGMODALFRAME) || \
-     (((style) & WS_DLGFRAME) && !((style) & WS_BORDER)))
+    (!(IS_MANAGED(style)) && \
+     (((exStyle) & WS_EX_DLGMODALFRAME) || \
+      (((style) & WS_DLGFRAME) && !((style) & WS_BORDER))))
 
 #define HAS_THICKFRAME(style) \
-    (((style) & WS_THICKFRAME) && \
+    (!(IS_MANAGED(style)) && \
+     ((style) & WS_THICKFRAME) && \
      !(((style) & (WS_DLGFRAME|WS_BORDER)) == WS_DLGFRAME))
 
 #define HAS_MENU(w)  (!((w)->dwStyle & WS_CHILD) && ((w)->wIDmenu != 0))
@@ -63,6 +70,7 @@
 static void NC_AdjustRect( LPRECT rect, DWORD style, BOOL menu, DWORD exStyle )
 {
     if (style & WS_ICONIC) return;  /* Nothing to change for an icon */
+    if (IS_MANAGED(style)) return;
     if (HAS_DLGFRAME( style, exStyle ))
 	InflateRect( rect, SYSMETRICS_CXDLGFRAME, SYSMETRICS_CYDLGFRAME );
     else
@@ -118,8 +126,7 @@
 void NC_GetMinMaxInfo( HWND hwnd, POINT *maxSize, POINT *maxPos,
                        POINT *minTrack, POINT *maxTrack )
 {
-    HANDLE minmaxHandle;
-    MINMAXINFO MinMax, *pMinMax;
+    MINMAXINFO MinMax;
     short xinc, yinc;
     WND *wndPtr = WIN_FindWndPtr( hwnd );
 
@@ -132,7 +139,9 @@
     MinMax.ptMaxTrackSize.x = SYSMETRICS_CXSCREEN;
     MinMax.ptMaxTrackSize.y = SYSMETRICS_CYSCREEN;
 
-    if (HAS_DLGFRAME( wndPtr->dwStyle, wndPtr->dwExStyle ))
+    if (IS_MANAGED(wndPtr->dwStyle))
+	xinc = yinc = 0;
+    else if (HAS_DLGFRAME( wndPtr->dwStyle, wndPtr->dwExStyle ))
     {
         xinc = SYSMETRICS_CXDLGFRAME;
         yinc = SYSMETRICS_CYDLGFRAME;
@@ -165,28 +174,25 @@
         MinMax.ptMaxPosition.y = -yinc;
     }
 
-    minmaxHandle = USER_HEAP_ALLOC( sizeof(MINMAXINFO) );
-    if (minmaxHandle)
-    {
-	pMinMax = (MINMAXINFO *) USER_HEAP_LIN_ADDR( minmaxHandle );
-	memcpy( pMinMax, &MinMax, sizeof(MinMax) );	
-	SendMessage( hwnd, WM_GETMINMAXINFO, 0,
-                     (LPARAM)USER_HEAP_SEG_ADDR(minmaxHandle) );
-    }
-    else pMinMax = &MinMax;
+    SendMessage( hwnd, WM_GETMINMAXINFO, 0, MAKE_SEGPTR(&MinMax) );
 
       /* Some sanity checks */
 
-    pMinMax->ptMaxTrackSize.x = MAX( pMinMax->ptMaxTrackSize.x,
-				     pMinMax->ptMinTrackSize.x );
-    pMinMax->ptMaxTrackSize.y = MAX( pMinMax->ptMaxTrackSize.y,
-				     pMinMax->ptMinTrackSize.y );
+    dprintf_nonclient(stddeb, 
+		      "NC_GetMinMaxInfo: %d %d / %d %d / %d %d / %d %d\n",
+		      MinMax.ptMaxSize.x,MinMax.ptMaxSize.y,
+		      MinMax.ptMaxPosition.x,MinMax.ptMaxPosition.y,
+		      MinMax.ptMaxTrackSize.x,MinMax.ptMaxTrackSize.y,
+		      MinMax.ptMinTrackSize.x,MinMax.ptMinTrackSize.y);
+    MinMax.ptMaxTrackSize.x = MAX( MinMax.ptMaxTrackSize.x,
+				   MinMax.ptMinTrackSize.x );
+    MinMax.ptMaxTrackSize.y = MAX( MinMax.ptMaxTrackSize.y,
+				   MinMax.ptMinTrackSize.y );
     
-    if (maxSize) *maxSize = pMinMax->ptMaxSize;
-    if (maxPos) *maxPos = pMinMax->ptMaxPosition;
-    if (minTrack) *minTrack = pMinMax->ptMinTrackSize;
-    if (maxTrack) *maxTrack = pMinMax->ptMaxTrackSize;
-    if (minmaxHandle) USER_HEAP_FREE( minmaxHandle );
+    if (maxSize) *maxSize = MinMax.ptMaxSize;
+    if (maxPos) *maxPos = MinMax.ptMaxPosition;
+    if (minTrack) *minTrack = MinMax.ptMinTrackSize;
+    if (maxTrack) *maxTrack = MinMax.ptMaxTrackSize;
 }
 
 
@@ -233,6 +239,7 @@
     rect->bottom = wndPtr->rectWindow.bottom - wndPtr->rectWindow.top;
 
     if (wndPtr->dwStyle & WS_ICONIC) return;  /* No border to remove */
+    if (IS_MANAGED(wndPtr->dwStyle)) return;
 
       /* Remove frame from rectangle */
     if (HAS_DLGFRAME( wndPtr->dwStyle, wndPtr->dwExStyle ))
@@ -319,14 +326,16 @@
     {
 	if (HAS_DLGFRAME( wndPtr->dwStyle, wndPtr->dwExStyle ))
 	    InflateRect(&rect, -SYSMETRICS_CXDLGFRAME, -SYSMETRICS_CYDLGFRAME);
-	else if (wndPtr->dwStyle & WS_BORDER)
+	else if (!(IS_MANAGED(wndPtr->dwStyle)) &&
+		 (wndPtr->dwStyle & WS_BORDER))
 	    InflateRect(&rect, -SYSMETRICS_CXBORDER, -SYSMETRICS_CYBORDER);
 	if (!PtInRect( &rect, pt )) return HTBORDER;
     }
 
       /* Check caption */
 
-    if ((wndPtr->dwStyle & WS_CAPTION) == WS_CAPTION)
+    if (!(IS_MANAGED(wndPtr->dwStyle)) &&
+	((wndPtr->dwStyle & WS_CAPTION) == WS_CAPTION))
     {
 	rect.top += SYSMETRICS_CYCAPTION - 1;
 	if (!PtInRect( &rect, pt ))
@@ -663,8 +672,9 @@
 
     SelectObject( hdc, sysColorObjects.hpenWindowFrame );
 
-    if ((wndPtr->dwStyle & WS_BORDER) || (wndPtr->dwStyle & WS_DLGFRAME) ||
-        (wndPtr->dwExStyle & WS_EX_DLGMODALFRAME))
+    if (((wndPtr->dwStyle & WS_BORDER) || (wndPtr->dwStyle & WS_DLGFRAME) ||
+	 (wndPtr->dwExStyle & WS_EX_DLGMODALFRAME)) &&
+	!(IS_MANAGED(wndPtr->dwStyle)))
     {
 	MoveTo( hdc, 0, 0 );
 	LineTo( hdc, rect.right-1, 0 );
@@ -676,10 +686,12 @@
 
     if (HAS_DLGFRAME( wndPtr->dwStyle, wndPtr->dwExStyle )) 
 	NC_DrawFrame( hdc, &rect, TRUE, active );
-    else if (wndPtr->dwStyle & WS_THICKFRAME)
+    else if ((wndPtr->dwStyle & WS_THICKFRAME) &&
+	     !(IS_MANAGED(wndPtr->dwStyle)))
 	NC_DrawFrame(hdc, &rect, FALSE, active );
 
-    if ((wndPtr->dwStyle & WS_CAPTION) == WS_CAPTION)
+    if (((wndPtr->dwStyle & WS_CAPTION) == WS_CAPTION) &&
+	!(IS_MANAGED(wndPtr->dwStyle)))
     {
 	RECT r = rect;
 	r.bottom = rect.top + SYSMETRICS_CYSIZE;
@@ -721,7 +733,9 @@
  */
 LONG NC_HandleNCPaint( HWND hwnd )
 {
-    NC_DoNCPaint( hwnd, hwnd == GetActiveWindow(), FALSE );
+    WND *wndPtr = WIN_FindWndPtr(hwnd);
+
+    NC_DoNCPaint( hwnd, wndPtr->flags & WIN_NCACTIVATED, FALSE );
     return 0;
 }
 
@@ -733,6 +747,11 @@
  */
 LONG NC_HandleNCActivate( HWND hwnd, WPARAM wParam )
 {
+    WND *wndPtr = WIN_FindWndPtr(hwnd);
+
+    if (wParam != 0) wndPtr->flags |= WIN_NCACTIVATED;
+    else wndPtr->flags &= ~WIN_NCACTIVATED;
+
     NC_DoNCPaint( hwnd, (wParam != 0), FALSE );
     return TRUE;
 }
@@ -1026,6 +1045,7 @@
 	if (rootWindow == DefaultRootWindow(display)) XUngrabServer( display );
     }
     SendMessage( hwnd, WM_EXITSIZEMOVE, 0, 0 );
+    SendMessage( hwnd, WM_SETVISIBLE, !IsIconic(hwnd), 0L);
 
       /* If Esc key, don't move the window */
     if ((msg.message == WM_KEYDOWN) && (msg.wParam == VK_ESCAPE)) return;
@@ -1090,8 +1110,7 @@
  */
 static void NC_TrackScrollBar( HWND hwnd, WORD wParam, POINT pt )
 {
-    MSG *msg;
-    HLOCAL hMsg;
+    MSG msg;
     WORD scrollbar;
     WND *wndPtr = WIN_FindWndPtr( hwnd );
 
@@ -1106,8 +1125,6 @@
 	scrollbar = SB_VERT;
     }
 
-    hMsg = USER_HEAP_ALLOC( sizeof(MSG) );
-    msg  = (MSG *) USER_HEAP_LIN_ADDR( hMsg );
     pt.x -= wndPtr->rectWindow.left;
     pt.y -= wndPtr->rectWindow.top;
     SetCapture( hwnd );
@@ -1115,21 +1132,21 @@
 
     do
     {
-        GetMessage( (SEGPTR)USER_HEAP_SEG_ADDR(hMsg), 0, 0, 0 );
-	switch(msg->message)
+        GetMessage( MAKE_SEGPTR(&msg), 0, 0, 0 );
+	switch(msg.message)
 	{
 	case WM_LBUTTONUP:
 	case WM_MOUSEMOVE:
         case WM_SYSTIMER:
-            pt.x = LOWORD(msg->lParam) + wndPtr->rectClient.left - 
+            pt.x = LOWORD(msg.lParam) + wndPtr->rectClient.left - 
 	      wndPtr->rectWindow.left;
-            pt.y = HIWORD(msg->lParam) + wndPtr->rectClient.top - 
+            pt.y = HIWORD(msg.lParam) + wndPtr->rectClient.top - 
 	      wndPtr->rectWindow.top;
-            SCROLL_HandleScrollEvent( hwnd, scrollbar, msg->message, pt );
+            SCROLL_HandleScrollEvent( hwnd, scrollbar, msg.message, pt );
 	    break;
         default:
-            TranslateMessage( msg );
-            DispatchMessage( msg );
+            TranslateMessage( &msg );
+            DispatchMessage( &msg );
             break;
 	}
         if (!IsWindow( hwnd ))
@@ -1137,8 +1154,7 @@
             ReleaseCapture();
             break;
         }
-    } while (msg->message != WM_LBUTTONUP);
-    USER_HEAP_FREE( hMsg );
+    } while (msg.message != WM_LBUTTONUP);
 }
 
 /***********************************************************************
diff --git a/windows/scroll.c b/windows/scroll.c
index b24fcbf..e8652cf 100644
--- a/windows/scroll.c
+++ b/windows/scroll.c
@@ -2,40 +2,157 @@
  * Scroll windows and DCs
  *
  * Copyright  David W. Metcalfe, 1993
+ *	      Alex Korobka       1995
+ *
  *
  */
 
 #include <stdlib.h>
-#include "windows.h"
+#include "wintypes.h"
+#include "class.h"
+#include "win.h"
 #include "gdi.h"
-#include "scroll.h"
+#include "sysmetrics.h"
 #include "stddebug.h"
 /* #define DEBUG_SCROLL */
 #include "debug.h"
 
 
+
+extern DCE_GetVisRgn(HWND, WORD);
+
 static int RgnType;
 
 
+/* -----------------------------------------------------------------------
+ *	       SCROLL_TraceChildren
+ * 
+ * Returns a region invalidated by children, siblings, and/or ansectors
+ * in the window rectangle or client rectangle
+ *
+ * dcx can have DCX_WINDOW, DCX_CLIPCHILDREN, DCX_CLIPSIBLINGS set
+ */
+
+HRGN	SCROLL_TraceChildren( HWND hScroll, short dx, short dy, WORD dcx)
+{
+ WND	       *wndScroll = WIN_FindWndPtr( hScroll ); 
+ HRGN		hRgnWnd;
+ HRGN		hUpdateRgn,hCombineRgn;
+
+ if( !wndScroll || ( !dx && !dy) ) return 0;
+
+ if( dcx & DCX_WINDOW )
+	 hRgnWnd   = CreateRectRgnIndirect(&wndScroll->rectWindow);
+ else
+	{
+	 RECT rect;
+
+	 GetClientRect(hScroll,&rect);
+ 	 hRgnWnd   = CreateRectRgnIndirect(&rect);
+	}
+
+ hUpdateRgn  = DCE_GetVisRgn( hScroll, dcx );
+ hCombineRgn = CreateRectRgn(0,0,0,0);
+
+ if( !hUpdateRgn || !hCombineRgn )
+      {
+	DeleteObject( hUpdateRgn? hUpdateRgn : hCombineRgn);
+	DeleteObject(hRgnWnd);
+	return 0;
+      }
+
+ OffsetRgn( hUpdateRgn, dx, dy);
+ CombineRgn(hCombineRgn, hRgnWnd, hUpdateRgn, RGN_DIFF);
+ 
+ DeleteObject(hRgnWnd);
+ DeleteObject(hUpdateRgn);
+
+ return hCombineRgn;
+}
+
+
+/* ----------------------------------------------------------------------
+ *	       SCROLL_ScrollChildren
+ */
+BOOL	SCROLL_ScrollChildren( HWND hScroll, short dx, short dy)
+{
+ WND           *wndPtr = WIN_FindWndPtr(hScroll);
+ HWND		hWnd   = wndPtr->hwndChild;
+ HRGN		hUpdateRgn;
+ BOOL		b = 0;
+
+ if( !wndPtr || ( !dx && !dy )) return 0;
+
+ dprintf_scroll(stddeb,"SCROLL_ScrollChildren: hwnd "NPFMT" dx=%i dy=%i\n",hScroll,dx,dy);
+
+ /* get a region in client rect invalidated by siblings and ansectors */
+ hUpdateRgn = SCROLL_TraceChildren(hScroll, dx , dy, DCX_CLIPSIBLINGS);
+
+ /* update children coordinates */
+ while( hWnd )
+  {
+	wndPtr = WIN_FindWndPtr( hWnd );
+
+	/* we can check if window intersects with clipRect parameter
+	 * and do not move it if not - just a thought.     - AK
+	 */
+
+	SetWindowPos(hWnd,0,wndPtr->rectWindow.left + dx,
+			    wndPtr->rectWindow.top  + dy, 0,0, SWP_NOZORDER |
+			    SWP_NOSIZE | SWP_NOACTIVATE | SWP_NOREDRAW |
+			    SWP_DEFERERASE );
+
+	hWnd = wndPtr->hwndNext;
+  } 
+
+ /* invalidate uncovered region and paint frames */
+ b = RedrawWindow( hScroll, NULL, hUpdateRgn, RDW_INVALIDATE | RDW_FRAME | RDW_ERASE |
+				              RDW_ERASENOW | RDW_ALLCHILDREN ); 
+
+ DeleteObject( hUpdateRgn);
+ return b;
+}
+
+
 /*************************************************************************
  *             ScrollWindow         (USER.61)
+ *
+ * FIXME: a bit broken
  */
 
 void ScrollWindow(HWND hwnd, short dx, short dy, LPRECT rect, LPRECT clipRect)
 {
     HDC hdc;
-    HRGN hrgnUpdate;
+    HRGN hrgnUpdate,hrgnClip;
     RECT rc, cliprc;
 
-    dprintf_scroll(stddeb,"ScrollWindow: dx=%d, dy=%d, rect=%ld,%ld,%ld,%ld\n", 
-	   dx, dy, (LONG)rect->left, (LONG)rect->top, (LONG)rect->right, (LONG)rect->bottom);
+    dprintf_scroll(stddeb,"ScrollWindow: dx=%d, dy=%d, lpRect =%08lx clipRect=%i,%i,%i,%i\n", 
+	    dx, dy, (LONG)rect, (clipRect)?clipRect->left:0,
+                                (clipRect)?clipRect->top:0,
+                                (clipRect)?clipRect->right:0, 
+                                (clipRect)?clipRect->bottom:0);
 
-    hdc = GetDC(hwnd);
-
-    if (rect == NULL)
+    /* if rect is NULL children have to be moved */
+    if ( !rect )
+       {
 	GetClientRect(hwnd, &rc);
+	  hrgnClip = CreateRectRgnIndirect( &rc );
+
+	  /* children will be Blt'ed too */
+	  hdc      = GetDCEx(hwnd, hrgnClip, DCX_CACHE | DCX_CLIPSIBLINGS);
+          DeleteObject(hrgnClip);
+       }
     else
+       {
+	  GetClientRect(hwnd,&rc);
+	  dprintf_scroll(stddeb,"\trect=%i %i %i %i client=%i %i %i %i\n",
+			 rect->left,rect->top,rect->right,rect->bottom,rc.left,rc.top,
+			 rc.right,rc.bottom);
+
 	CopyRect(&rc, rect);
+	  hdc = GetDC(hwnd);
+       }
+
     if (clipRect == NULL)
 	GetClientRect(hwnd, &cliprc);
     else
@@ -43,13 +160,41 @@
 
     hrgnUpdate = CreateRectRgn(0, 0, 0, 0);
     ScrollDC(hdc, dx, dy, &rc, &cliprc, hrgnUpdate, NULL);
-    InvalidateRgn(hwnd, hrgnUpdate, TRUE);
     ReleaseDC(hwnd, hdc);
+
+    if( !rect )
+      {
+         /* FIXME: this doesn't take into account hrgnUpdate */
+         if( !SCROLL_ScrollChildren(hwnd,dx,dy) )
+	     InvalidateRgn(hwnd, hrgnUpdate, TRUE);
+      }
+    else
+      {
+        HRGN hrgnInv = SCROLL_TraceChildren(hwnd,dx,dy,DCX_CLIPCHILDREN |
+						       DCX_CLIPSIBLINGS );
+        if( hrgnInv )
+ 	  {
+	    HRGN hrgnCombine = CreateRectRgn(0,0,0,0);
+
+	    CombineRgn(hrgnCombine,hrgnInv,hrgnUpdate,RGN_OR);
+	    dprintf_scroll(stddeb,"ScrollWindow: hrgnComb="NPFMT" hrgnInv="NPFMT" hrgnUpd="NPFMT"\n",
+	 					           hrgnCombine,hrgnInv,hrgnUpdate);
+
+	    DeleteObject(hrgnUpdate); DeleteObject(hrgnInv);
+	    hrgnUpdate = hrgnCombine;
+	  }
+
+        RedrawWindow( hwnd, NULL, hrgnUpdate, RDW_INVALIDATE | RDW_ERASE | RDW_ERASENOW);
+      }
+
+    DeleteObject(hrgnUpdate);
 }
 
 
 /*************************************************************************
  *             ScrollDC         (USER.221)
+ *
+ * FIXME: half-broken
  */
 
 BOOL ScrollDC(HDC hdc, short dx, short dy, LPRECT rc, LPRECT cliprc,
@@ -60,8 +205,11 @@
     short width, height;
     DC *dc = (DC *)GDI_GetObjPtr(hdc, DC_MAGIC);
 
-    dprintf_scroll(stddeb, "ScrollDC: dx=%d, dy=%d, rc=%ld,%ld,%ld,%ld\n", dx, dy,
-	   (LONG)rc->left, (LONG)rc->top, (LONG)rc->right, (LONG)rc->bottom);
+    dprintf_scroll(stddeb,"ScrollDC: dx=%d dy=%d, hrgnUpdate="NPFMT" rc=%i %i %i %i\n",
+                                     dx,dy,hrgnUpdate,(rc)?rc->left:0,
+				                      (rc)?rc->top:0,
+				                      (rc)?rc->right:0,
+				                      (rc)?rc->bottom:0); 
 
     if (rc == NULL)
 	return FALSE;
@@ -128,6 +276,10 @@
 
 /*************************************************************************
  *             ScrollWindowEx       (USER.319)
+ *
+ * FIXME: broken
+ *
+ * SCROLL_TraceChildren can help
  */
 
 int ScrollWindowEx(HWND hwnd, short dx, short dy, LPRECT rect, LPRECT clipRect,
@@ -136,9 +288,7 @@
     HDC hdc;
     RECT rc, cliprc;
 
-    dprintf_scroll(stddeb,"ScrollWindowEx: dx=%d, dy=%d, rect=%ld,%ld,%ld,%ld\n", 
-	   dx, dy, (LONG)rect->left, (LONG)rect->top, (LONG)rect->right,
-           (LONG)rect->bottom);
+    dprintf_scroll(stddeb,"ScrollWindowEx: dx=%d, dy=%d, wFlags="NPFMT"\n",dx, dy, flags);
 
     hdc = GetDC(hwnd);
 
diff --git a/windows/win.c b/windows/win.c
index 7153ee6..1848a3b 100644
--- a/windows/win.c
+++ b/windows/win.c
@@ -28,11 +28,11 @@
 /* #define DEBUG_MENU */
 #include "debug.h"
 
-static HWND hwndDesktop = 0;
-static HWND hWndSysModal = 0;
+static HWND hwndDesktop  = 0;
+static HWND hwndSysModal = 0;
 
-static WORD wDragWidth = 8;
-static WORD wDragHeight= 6;
+static WORD wDragWidth = 4;
+static WORD wDragHeight= 3;
 
 extern HCURSOR CURSORICON_IconToCursor(HICON);
 
@@ -395,7 +395,6 @@
     wndPtr->ptMaxPos.y     = -1;
     wndPtr->hmemTaskQ      = GetTaskQueue(0);
     wndPtr->hrgnUpdate     = 0;
-    wndPtr->hwndPrevActive = 0;
     wndPtr->hwndLastActive = hwnd;
     wndPtr->lpfnWndProc    = classPtr->wc.lpfnWndProc;
     wndPtr->dwStyle        = style & ~WS_VISIBLE;
@@ -446,10 +445,20 @@
 
     if (!(style & WS_CHILD) && (rootWindow == DefaultRootWindow(display)))
     {
-        win_attr.event_mask = ExposureMask | KeyPressMask | KeyReleaseMask |
-                              PointerMotionMask | ButtonPressMask |
-                              ButtonReleaseMask | FocusChangeMask;
-        win_attr.override_redirect = TRUE;
+	if(Options.managed && className != POPUPMENU_CLASS_ATOM) {
+	    win_attr.event_mask = ExposureMask | KeyPressMask |
+	                          KeyReleaseMask | PointerMotionMask |
+	                          ButtonPressMask | ButtonReleaseMask |
+	                          FocusChangeMask | StructureNotifyMask;
+	    win_attr.override_redirect = FALSE;
+	}
+	else {
+	    win_attr.event_mask = ExposureMask | KeyPressMask |
+	                          KeyReleaseMask | PointerMotionMask |
+	                          ButtonPressMask | ButtonReleaseMask |
+	                          FocusChangeMask;
+            win_attr.override_redirect = TRUE;
+	}
         win_attr.colormap      = COLOR_WinColormap;
         win_attr.backing_store = Options.backingstore ? WhenMapped : NotUseful;
         win_attr.save_under    = ((classPtr->wc.style & CS_SAVEBITS) != 0);
@@ -1238,10 +1247,10 @@
  */
 HWND SetSysModalWindow(HWND hWnd)
 {
-	HWND hWndOldModal = hWndSysModal;
-	hWndSysModal = hWnd;
-	dprintf_win(stdnimp,"EMPTY STUB !! SetSysModalWindow("NPFMT") !\n", hWnd);
-	return hWndOldModal;
+    HWND hWndOldModal = hwndSysModal;
+    hwndSysModal = hWnd;
+    dprintf_win(stdnimp,"EMPTY STUB !! SetSysModalWindow("NPFMT") !\n", hWnd);
+    return hWndOldModal;
 }
 
 
@@ -1250,7 +1259,7 @@
  */
 HWND GetSysModalWindow(void)
 {
-	return hWndSysModal;
+    return hwndSysModal;
 }
 
 /*******************************************************************
diff --git a/windows/winpos.c b/windows/winpos.c
index 08a499c..97109b7 100644
--- a/windows/winpos.c
+++ b/windows/winpos.c
@@ -2,12 +2,15 @@
  * Window position related functions.
  *
  * Copyright 1993, 1994, 1995 Alexandre Julliard
+ *                       1995 Alex Korobka
  */
 
 #include "sysmetrics.h"
+#include "selectors.h"
 #include "user.h"
 #include "win.h"
 #include "event.h"
+#include "hook.h"
 #include "message.h"
 #include "stackframe.h"
 #include "winpos.h"
@@ -16,7 +19,16 @@
 /* #define DEBUG_WIN */
 #include "debug.h"
 
-static HWND hwndActive = 0;  /* Currently active window */
+/* ----- external functions ----- */
+
+void 	FOCUS_SwitchFocus( HWND , HWND );
+
+/* ----- internal variables ----- */
+
+static HWND hwndActive      = 0;  /* Currently active window */
+static HWND hwndPrevActive  = 0;  /* Previously active window */
+
+extern HANDLE hActiveQ_G;		/* from message.c */
 
 
 /***********************************************************************
@@ -226,7 +238,12 @@
       /* Translate source window origin to screen coords */
     while(hwndFrom)
     {
-	wndPtr = WIN_FindWndPtr( hwndFrom );
+	if (!(wndPtr = WIN_FindWndPtr( hwndFrom )))
+	{
+	    fprintf( stderr, "MapWindowPoints: bad hwndFrom = "NPFMT"\n",
+		     hwndFrom); 
+	    return;
+	}
 	origin.x += wndPtr->rectClient.left;
 	origin.y += wndPtr->rectClient.top;
 	hwndFrom = (wndPtr->dwStyle & WS_CHILD) ? wndPtr->hwndParent : 0;
@@ -235,7 +252,11 @@
       /* Translate origin to destination window coords */
     while(hwndTo)
     {
-	wndPtr = WIN_FindWndPtr( hwndTo );
+	if (!(wndPtr = WIN_FindWndPtr( hwndTo )))
+	{
+	    fprintf(stderr,"MapWindowPoints: bad hwndTo = "NPFMT"\n", hwndTo );
+	    return;
+	}
 	origin.x -= wndPtr->rectClient.left;
 	origin.y -= wndPtr->rectClient.top;
 	hwndTo = (wndPtr->dwStyle & WS_CHILD) ? wndPtr->hwndParent : 0;
@@ -288,8 +309,11 @@
 {
     HWND prev = hwndActive;
     WND *wndPtr = WIN_FindWndPtr( hwnd );
-    if (!wndPtr || (wndPtr->dwStyle & WS_CHILD)) return 0;
-    SetWindowPos( hwnd, HWND_TOP, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE );
+
+    if (!wndPtr || (wndPtr->dwStyle & WS_DISABLED) ||
+	!(wndPtr->dwStyle & WS_VISIBLE)) return 0;
+
+    WINPOS_SetActiveWindow( hwnd, 0, 0 );
     return prev;
 }
 
@@ -377,10 +401,19 @@
                   /* Store the current position and find the maximized size */
                 if (!(wndPtr->dwStyle & WS_MINIMIZE))
                     wndPtr->rectNormal = wndPtr->rectWindow; 
+
                 NC_GetMinMaxInfo( hwnd, &maxSize,
                                   &wndPtr->ptMaxPos, NULL, NULL );
                 x  = wndPtr->ptMaxPos.x;
                 y  = wndPtr->ptMaxPos.y;
+
+		if( wndPtr->dwStyle & WS_MINIMIZE )
+		    if( !SendMessage( hwnd, WM_QUERYOPEN, 0, 0L ) )
+			{
+		         swpflags |= SWP_NOSIZE;
+			 break;
+			}
+
                 cx = maxSize.x;
                 cy = maxSize.y;
                 wndPtr->dwStyle &= ~WS_MINIMIZE;
@@ -403,8 +436,14 @@
 	case SW_SHOWNORMAL:  /* same as SW_NORMAL: */
 	case SW_RESTORE:
 	    swpflags |= SWP_SHOWWINDOW | SWP_FRAMECHANGED;
+
             if (wndPtr->dwStyle & WS_MINIMIZE)
             {
+                if( !SendMessage( hwnd, WM_QUERYOPEN, 0, 0L) )
+                  {
+                    swpflags |= SWP_NOSIZE;
+                    break;
+                  }
                 wndPtr->ptIconPos.x = wndPtr->rectWindow.left;
                 wndPtr->ptIconPos.y = wndPtr->rectWindow.top;
                 wndPtr->dwStyle &= ~WS_MINIMIZE;
@@ -530,49 +569,210 @@
     return TRUE;
 }
 
+/*******************************************************************
+ *	   ACTIVATEAPP_callback
+ */
+BOOL ACTIVATEAPP_callback(HWND hWnd, LPARAM lParam)
+{
+    ACTIVATESTRUCT  *lpActStruct = (ACTIVATESTRUCT*)lParam;
+    WND             *wndPtr = WIN_FindWndPtr( hWnd );
+
+    if( !wndPtr || hWnd == GetDesktopWindow()) return 1;
+ 
+    if( MSG_GetQueueTask(wndPtr->hmemTaskQ) != lpActStruct->hTaskSendTo ) 
+	return 1;
+
+    SendMessage( hWnd, WM_ACTIVATEAPP, lpActStruct->wFlag,
+		(LPARAM)(lpActStruct->hWindowTask)?lpActStruct->hWindowTask:0);
+    return 1;
+}
+
 
 /*******************************************************************
- *         WINPOS_ChangeActiveWindow
+ *	   WINPOS_SetActiveWindow
  *
- * Change the active window and send the corresponding messages.
+ * back-end to SetActiveWindow
  */
-HWND WINPOS_ChangeActiveWindow( HWND hwnd, BOOL mouseMsg )
+BOOL WINPOS_SetActiveWindow( HWND hWnd, BOOL fMouse, BOOL fChangeFocus )
 {
-    HWND prevActive = hwndActive;
-    if (hwnd == hwndActive) return 0;
-    if (hwndActive)
+    WND                   *wndPtr          = WIN_FindWndPtr(hWnd);
+    WND                   *wndTemp         = WIN_FindWndPtr(hwndActive);
+    CBTACTIVATESTRUCT      cbtStruct       = { fMouse , hwndActive };
+    FARPROC                enumCallback    = (FARPROC)GetWndProcEntry16("ActivateAppProc");
+    ACTIVATESTRUCT         actStruct;
+    WORD                   wIconized=0,wRet= 0;
+
+    /* paranoid checks */
+    if( !hWnd || hWnd == GetDesktopWindow() || hWnd == hwndActive )
+	return 0;
+
+    if( GetTaskQueue(0) != wndPtr->hmemTaskQ )
+	return 0;
+
+    if( wndTemp )
+	wIconized = HIWORD(wndTemp->dwStyle & WS_MINIMIZE);
+    else
+	dprintf_win(stddeb,"WINPOS_ActivateWindow: no current active window.\n");
+
+    /* call CBT hook chain */
+    wRet = HOOK_CallHooks(WH_CBT, HCBT_ACTIVATE, hWnd,
+			  (LPARAM)MAKE_SEGPTR(&cbtStruct));
+
+    if( wRet ) return wRet;
+
+    /* set prev active wnd to current active wnd and send notification */
+    if( (hwndPrevActive = hwndActive) )
     {
-	if (!SendMessage( hwndActive, WM_NCACTIVATE, FALSE, 0 )) return 0;
+	if( !SendMessage(hwndPrevActive, WM_NCACTIVATE, 0, MAKELONG(hWnd,wIconized)) )
+        {
+	    if (GetSysModalWindow() != hWnd) return 0;
+	    /* disregard refusal if hWnd is sysmodal */
+        }
+
 #ifdef WINELIB32
 	SendMessage( hwndActive, WM_ACTIVATE,
-		     MAKEWPARAM( WA_INACTIVE, IsIconic(hwndActive) ),
-		     (LPARAM)hwnd );
+		     MAKEWPARAM( WA_INACTIVE, wIconized ),
+		     (LPARAM)hWnd );
 #else
-	SendMessage( hwndActive, WM_ACTIVATE, WA_INACTIVE,
-		     MAKELONG( IsIconic(hwndActive), hwnd ) );
+	SendMessage(hwndPrevActive, WM_ACTIVATE, WA_INACTIVE, 
+		    MAKELONG(hWnd,wIconized));
 #endif
-	/* Send WM_ACTIVATEAPP here */
+
+	/* check if something happened during message processing */
+	if( hwndPrevActive != hwndActive ) return 0;
     }
 
-    hwndActive = hwnd;
-    if (hwndActive)
+    /* set active wnd */
+    hwndActive = hWnd;
+
+    /* send palette messages */
+    if( SendMessage( hWnd, WM_QUERYNEWPALETTE, 0, 0L) )
+	SendMessage((HWND)-1, WM_PALETTEISCHANGING, hWnd, 0L );
+
+    /* if prev wnd is minimized redraw icon title 
+  if( hwndPrevActive )
     {
-	WND *wndPtr = WIN_FindWndPtr( hwndActive );
-	wndPtr->hwndPrevActive = prevActive;
+        wndTemp = WIN_FindWndPtr( WIN_GetTopParent( hwndPrevActive ) );
+        if(wndTemp)
+          if(wndTemp->dwStyle & WS_MINIMIZE)
+            RedrawIconTitle(hwndPrevActive); 
+      } 
+  */
+    if (!(wndPtr->dwStyle & WS_CHILD) )
+    {
+	/* check Z-order and bring hWnd to the top */
+	wndTemp = WIN_FindWndPtr( GetDesktopWindow() );
 
-	/* Send WM_ACTIVATEAPP here */
-	SendMessage( hwnd, WM_NCACTIVATE, TRUE, 0 );
-#ifdef WINELIB32
-	SendMessage( hwnd, WM_ACTIVATE,
-		     MAKEWPARAM( mouseMsg ? WA_CLICKACTIVE : WA_ACTIVE, 
-				 IsIconic(hwnd) )
-		     , (LPARAM)prevActive );
-#else
-	SendMessage( hwnd, WM_ACTIVATE, mouseMsg ? WA_CLICKACTIVE : WA_ACTIVE,
-		     MAKELONG( IsIconic(hwnd), prevActive ) );
-#endif
+	for( ; wndTemp; wndTemp = WIN_FindWndPtr( wndTemp->hwndNext ))
+	    if( wndTemp->dwStyle & WS_VISIBLE )
+		break;
+
+	if( wndTemp != wndPtr )
+	    SetWindowPos(hWnd, HWND_TOP, 0,0,0,0, 
+			 SWP_NOSIZE | SWP_NOMOVE | SWP_NOACTIVATE );
     }
-    return prevActive;
+
+    if( !IsWindow(hWnd) ) return 0;
+
+    /* send WM_ACTIVATEAPP if necessary */
+    if( hActiveQ_G != wndPtr->hmemTaskQ )
+    {
+	HTASK hT = MSG_GetQueueTask( hActiveQ_G );
+
+	actStruct.wFlag = 0;                  /* deactivate */
+	actStruct.hWindowTask = MSG_GetQueueTask(wndPtr->hmemTaskQ);
+	actStruct.hTaskSendTo = hT;
+
+	/* send WM_ACTIVATEAPP to top-level windows
+	 * that belong to the actStruct.hTaskSendTo task
+	 */
+	EnumWindows( enumCallback , (LPARAM)&actStruct );
+
+	/* change active queue */
+	hActiveQ_G = wndPtr->hmemTaskQ;
+
+	actStruct.wFlag = 1;                  /* activate */
+	actStruct.hWindowTask = hT;
+	actStruct.hTaskSendTo = MSG_GetQueueTask( hActiveQ_G );
+
+	EnumWindows( enumCallback , (LPARAM)&actStruct );
+
+	if( !IsWindow(hWnd) ) return 0;
+    }
+
+    /* walk up to the first unowned window */
+    wndTemp = wndPtr;
+
+    while(wndTemp->hwndOwner)
+    {
+	wndTemp = WIN_FindWndPtr(wndTemp->hwndOwner);
+	if( !wndTemp)
+        {
+	    /* there must be an unowned window in hierarchy */
+	    dprintf_win(stddeb,"WINPOS_ActivateWindow: broken owner list\n");
+	    wndTemp = wndPtr;
+	    break;
+        }
+    }
+    /* and set last active owned popup */
+    wndTemp->hwndLastActive = hWnd;
+
+    wIconized = HIWORD(wndTemp->dwStyle & WS_MINIMIZE);
+    SendMessage( hWnd, WM_NCACTIVATE, 1,
+		 MAKELONG(hwndPrevActive,wIconized));
+#ifdef WINELIB32
+    SendMessage( hWnd, WM_ACTIVATE,
+		 MAKEWPARAM( (fMouse)?WA_CLICKACTIVE:WA_ACTIVE, wIconized),
+		 (LPARAM)hwndPrevActive );
+#else
+    SendMessage( hWnd, WM_ACTIVATE, (fMouse)? WA_CLICKACTIVE : WA_ACTIVE,
+		 MAKELONG(hwndPrevActive,wIconized));
+#endif
+
+    if( !IsWindow(hWnd) ) return 0;
+
+    /* change focus if possible */
+    if( fChangeFocus && GetFocus() )
+	if( WIN_GetTopParent(GetFocus()) != hwndActive )
+	    FOCUS_SwitchFocus( GetFocus(),
+			       (wndPtr->dwStyle & WS_MINIMIZE)? 0: hwndActive);
+
+    /* if active wnd is minimized redraw icon title 
+  if( hwndActive )
+      {
+        wndPtr = WIN_FindWndPtr(hwndActive);
+        if(wndPtr->dwStyle & WS_MINIMIZE)
+           RedrawIconTitle(hwndActive);
+    }
+  */
+    return (hWnd == hwndActive);
+}
+
+
+/*******************************************************************
+ *	   WINPOS_ChangeActiveWindow
+ *
+ */
+HWND WINPOS_ChangeActiveWindow( HWND hWnd, BOOL mouseMsg )
+{
+    WND *wndPtr = WIN_FindWndPtr(hWnd);
+
+    if( !wndPtr ) return  0;
+
+    /* minors are not allowed */
+    if( (wndPtr->dwStyle & WS_CHILD) && !( wndPtr->dwStyle & WS_POPUP))
+	return SendMessage(hWnd, WM_CHILDACTIVATE, 0, 0L);
+
+    if( hWnd == hwndActive ) return 0;     
+
+    if( !WINPOS_SetActiveWindow(hWnd ,mouseMsg ,TRUE) )
+	return 0;
+
+    /* switch desktop queue to current active here */
+    if( wndPtr->hwndParent == GetDesktopWindow())
+    { }
+
+    return 1;
 }
 
 
@@ -600,6 +800,9 @@
     }
     result = SendMessage( hwnd, WM_NCCALCSIZE, calcValidRect,
                           MAKE_SEGPTR( &params ) );
+    dprintf_win(stddeb, "WINPOS_SendNCCalcSize: %d %d %d %d\n",
+		params.rgrc[0].top,    params.rgrc[0].left,
+		params.rgrc[0].bottom, params.rgrc[0].right);
     *newClientRect = params.rgrc[0];
     return result;
 }
@@ -859,7 +1062,7 @@
 
         if (!(flags & SWP_NOREDRAW) &&
             (!(flags & SWP_NOSIZE) || !(flags & SWP_NOMOVE) ||
-             !(flags & SWP_NOZORDER)))
+	     (!(flags & SWP_NOZORDER) && (hwndInsertAfter != HWND_TOP))))
         {
             HRGN hrgn1 = CreateRectRgnIndirect( &oldWindowRect );
             HRGN hrgn2 = CreateRectRgnIndirect( &wndPtr->rectWindow );
@@ -867,12 +1070,22 @@
             CombineRgn( hrgn3, hrgn1, hrgn2, RGN_DIFF );
             RedrawWindow( wndPtr->hwndParent, NULL, hrgn3,
                           RDW_INVALIDATE | RDW_ALLCHILDREN | RDW_ERASE );
+
+	    /* DCE_GetVisRgn should be called for old coordinates
+	     * and for new, then OffsetRgn and CombineRgn -
+	     * voila, a nice update region to use here - AK.
+	     */ 
             if ((oldWindowRect.left != wndPtr->rectWindow.left) ||
                 (oldWindowRect.top != wndPtr->rectWindow.top))
             {
                 RedrawWindow( winpos.hwnd, NULL, 0, RDW_INVALIDATE |
                               RDW_FRAME | RDW_ALLCHILDREN | RDW_ERASE );
             }
+ 	    else
+		if( CombineRgn( hrgn3, hrgn2, hrgn1, RGN_DIFF) != NULLREGION )
+		    RedrawWindow( winpos.hwnd, NULL, hrgn3, RDW_INVALIDATE |
+				  RDW_FRAME | RDW_ALLCHILDREN | RDW_ERASE );
+
             DeleteObject( hrgn1 );
             DeleteObject( hrgn2 );
             DeleteObject( hrgn3 );
@@ -890,7 +1103,8 @@
         {
             if (!(flags & SWP_NOREDRAW))
                 RedrawWindow( winpos.hwnd, NULL, 0,
-                              RDW_INVALIDATE | RDW_FRAME | RDW_ERASE );
+                              RDW_INVALIDATE | RDW_ALLCHILDREN |
+			      RDW_FRAME | RDW_ERASE );
         }
     }
     else if (flags & SWP_HIDEWINDOW)
@@ -907,15 +1121,17 @@
                               RDW_INVALIDATE | RDW_FRAME |
                               RDW_ALLCHILDREN | RDW_ERASE );
         }
+
         if ((winpos.hwnd == GetFocus()) || IsChild(winpos.hwnd, GetFocus()))
             SetFocus( GetParent(winpos.hwnd) );  /* Revert focus to parent */
+
 	if (winpos.hwnd == hwndActive)
 	{
 	      /* Activate previously active window if possible */
-	    HWND newActive = wndPtr->hwndPrevActive;
+	    HWND newActive = hwndPrevActive;
 	    if (!IsWindow(newActive) || (newActive == winpos.hwnd))
 	    {
-		newActive = GetTopWindow(GetDesktopWindow());
+		newActive = GetTopWindow( GetDesktopWindow() );
 		if (newActive == winpos.hwnd) newActive = wndPtr->hwndNext;
 	    }	    
 	    WINPOS_ChangeActiveWindow( newActive, FALSE );
@@ -925,15 +1141,14 @@
       /* Activate the window */
 
     if (!(flags & SWP_NOACTIVATE))
-    {
-	if (!(wndPtr->dwStyle & WS_CHILD))
 	    WINPOS_ChangeActiveWindow( winpos.hwnd, FALSE );
-    }
     
       /* Repaint the window */
 
     if (wndPtr->window) MSG_Synchronize();  /* Wait for all expose events */
+
     EVENT_DummyMotionNotify(); /* Simulate a mouse event to set the cursor */
+
     if ((flags & SWP_FRAMECHANGED) && !(flags & SWP_NOREDRAW))
         RedrawWindow( winpos.hwnd, NULL, 0,
                       RDW_INVALIDATE | RDW_FRAME | RDW_ERASE );
