diff --git a/ChangeLog b/ChangeLog
index a957c33..5533bfc 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,455 @@
+----------------------------------------------------------------------
+Tue Mar  1 11:30:21 1994  Bob Amstadt  (bob@pooh)
+
+	* [Configure] [*/Imakefile]
+	Created configure script to handle different types of Wine builds.
+
+	* [Configure] [tools/build.c] [if1632/Imakefile] [Wine.tmpl]
+	Added ability to compile Wine on systems with 14-char filename limit.
+
+	* [if1632/relay.c] [include/options.h] [misc/main.c]
+	Added -relaydbg option to command line if DEBUG_RELAY is defined.
+
+	* [loader/selector.c]
+	Fixed bug in GetEntryDLLName() that caused Wine to seg fault.
+
+	* [memory/heap.c]
+	Fixed LocalInit() to work correctly.
+
+	* [misc/user.c]
+	Added code to call loaded DLLs' initialization routines.
+
+Tue Mar  1 01:01:17 MET 1994  julliard@di.epfl.ch (Alexandre Julliard)
+
+	* [windows/dce.c]
+	Added clipping of child windows by their parent's client area.
+
+	* [windows/nonclient.c]
+	Bug fix in NC_DoNCPaint().
+
+	* [windows/painting.c]
+	Bug fix in RedrawWindow().
+
+Feb 27, 94 martin2@trgcorp.solucorp.qc.ca (Martin Ayotte)
+
+	* [mem/atom.c]
+	Bug fix again in ATOM_DeleteAtom() : 
+		change LocalFree() by USER_HEAP_FREE().
+	(Previous patch done Feb 13th had been lost)
+
+	* [controls/scroll.c]
+	Move bitmaps loading in AllocScrollBar() instead of in WM_CREATE.
+
+	* [windows/class.c] (sorry Alex ...)
+	There was no bug there "in RegisterClass() : 
+                WNDCLASS->lpszClassName was reset to NULL."
+                              ^^^^^
+
+	* [misc/clipboard.c]	--- New File ---
+	New function EnumClipboardFormats().
+	New function OpenClipboard().
+	New function CloseClipboard().
+	New function EmptyClipboard().
+	New function GetClipboardOwner().
+	New function GetClipboardViewer().
+	New function CountClipboardFormats().
+	New function IsClipboardFormatAvailable().
+	New function OpenClipboard().
+	New function GetClipboardData().
+	New function SetClipboardViewer().
+	New function EnumClipboardFormats().
+	New function RegisterClipboardFormat().
+	New function ChangeClipboardChain().
+	New function SetClipboardData().
+	New function GetOpenClipboardWindow().
+	New function GetPriorityClipboardFormat().
+	New function GetClipboardFormatName().
+
+Tue Mar  1 20:15:45 1994  Erik Bos <erik@trashcan.hacktic.nl>
+
+	* [misc/comm.c]
+	bugfix in OpenComm().
+
+----------------------------------------------------------------------
+Tue Feb 22 18:04:02 1994  Jeffrey Hsu <hsu@freefall.cdrom.com>
+
+	* [include/winsock.h]
+	The sockproto struct is already defined in <sys/socket.h>
+
+	* [misc/winsock.c]
+	Need to include <netinet/in.h> for struct in-addr.
+	Use sys_errlist[] instead of strerror[].
+
+	*[toolkit/heap.c]
+	ANSI C specifies that the malloc functions are defined in stdlib.h,
+	  so we don't need to include malloc.h.
+
+	*[loader/ldtlib.c]
+	Print informative error message about probable cause of i386_set_ldt()
+	  failure and then exit.
+
+	*[Imakefile]
+	For systems that don't use gmake by default, set the MAKE variable
+	  to gmake and propagate it on recursive makes.
+	Take out -li386 for FreeBSD systems and define __FreeBSD__ so Wine
+	  can be built with the FreeBSD 1.0.2 compiler.
+
+Tue Feb 22 02:52:19 EST 1994    jrichard@cs.uml.edu (John Richardson)
+
+        * [objects/bitblt.c]
+        Added in three functions to do stretching and compression
+        for WHITEONBLACK, BLACKONWHITE, and color copies.
+
+Tue Feb 22 15:01:31 EST 1994    jrichard@cs.uml.edu (John Richardson)
+
+        * [windows/graphics.c]
+        Added FloodFill and FloodFill_rec.  FloodFill_rec is pretty
+        inefficent, but should suffice for now.
+
+        * [include/windows.h]
+        Changed the x,y paramaters for the FloodFill prototype 
+        from ints to shorts
+
+Tue Feb 22 00:58:28 MET 1994  julliard@di.epfl.ch (Alexandre Julliard)
+
+	* [windows/widgets.c]
+	Added desktop window class.
+
+	* [windows/painting.c]
+	Bug fix in RedrawWindow().
+	Implemented ExcludeUpdateRgn().
+
+	* [windows/win.c] [windows/winpos.c]
+	Implemented desktop window.
+
+	* [controls/desktop.c]
+	Preliminary desktop window procedure.
+
+Feb 20, 94 martin2@trgcorp.solucorp.qc.ca (Martin Ayotte)
+
+	* [controls/menu.c]
+	New function LoadMenuIndirect().
+	New function GetMenuCheckMarkDimensions().
+
+	* [if1632/user.spec]
+	Entry for DefDlgProc().
+
+	* [windows/class.c]
+	Fix bug in RegisterClass() : 
+		WNDCLASS->lpszMenuName was reset to NULL.
+
+	* [windows/win.c]
+	In CreateWindowEx(), if hMenu == 0 then use 
+		wndclass->lpszMenuName to load Menu from resource;
+
+Mon Feb 21 22:38:28 1994 Erik Bos (erik@trashcan.hacktic.nl)
+
+	* [loader/library.c] [loader/wine.c]
+	Fixed runing DLL's as main executable problem.
+
+	* [misc/dos_fs.c]
+	Added wildcard support in DOS_readdir().
+
+	* [misc/winsocket.c]
+	Added proper error handling of BSD winsocket functions.
+
+	* [miscemu/int21.c]
+	KERNEL_DOS3Call renamed to DOS3Call and modified to use do_int21().
+
+	* [main/main.c]
+	Added functions for GetVersion, GetWinFlags and GetTimerResolution
+	for libwine.a, SystemParametersInfo() partly implemented.
+
+Tue Feb 22 19:00:02 1994  Miguel de Icaza  (miguel@xochitl.nuclecu.unam.mx)
+
+	* [toolkit/winmain.c]
+	Added _WinMain function. Setups the library (calls USER_InitApp).
+
+	* [toolkit/sup.c]
+	Added load_mz_header, load_ne_header, load_type_info and
+	load_name_info functions.
+
+	* [toolkit/heap.c] 
+	Code cleanup. 
+
+	* [misc/user.c]
+	Moved from loader/misc.c. I hope to put back all the loader
+	functions in the ~loader subdirectory in the future. CUrrently is
+	needed since it has USER_InitApp.
+
+	* [misc/resource.c]
+	Since WineLib will probably need DLLs (currently it needs
+	Sysres.dll). WineLib will be using much code of the loader again.
+	So I removed some ifdefs that were used by WineLib.
+
+	Added load_typeinfo and load_nameinfo (and the corresponding
+	functions in [toolkit/sup.c]
+
+	Added integer convertion functions in the needed places.
+
+	Added very ugly patch (includes wine.c). In the next release I
+	plan to move back all the loader routines to ~/loader. In the
+	meantime I needed this patch. It doesn't affect any of the
+	emulator code (its ifdefed for WineLib).
+
+	* [misc/main.c]
+	Cleaned up call to WinMain (now uses [toolkit/winmain.c]
+	Ifdefed argument number checking when compiling the library.
+
+	* [loader/wine.c]
+	Modified to use load_(mz|ne)_header instead of doing a direct
+	read.  When compiling the emulator it still uses the direct read
+	for performance. 
+
+	* [include/wine.h]
+	Prototypes for loading routines.
+
+	* [include/class.h]
+	Added WINE_PACKED macro instead of __attribute__ ((packed))
+
+	* [include/arch.h]
+	Macros for converting integers (Little endian to big-endian).
+	Needed in the Sun to allow loading of DLL files.
+
+----------------------------------------------------------------------
+Mon Feb 14 23:48:09 MET 1994  julliard@di.epfl.ch (Alexandre Julliard)
+
+	* [windows/clipping.c]
+	Moved everything into windows/painting.c and removed this file.
+
+	* [windows/message.c]
+	Removed calls to memmove() in MSG_RemoveMsg().
+
+	* [windows/nonclient.c]
+	Added WM_GETMINMAXINFO support for window resizing.
+
+	* [windows/painting.c]
+	Implemented RedrawWindow().
+
+	* [windows/scroll.c]
+	Bug fix in ScrollWindowEx().
+
+	* [windows/win.c]
+	Moved UpdateWindow() to windows/painting.c.
+
+Fri Feb 11 12:41:28 1994  Erik Bos (erik@trashcan.hacktic.nl)
+	
+	* [loader/wine.c] [misc/dos_fs.c]
+	getenv() eq NULL bugfixes.
+
+	* [misc/comm.c]
+	cfmakeraw changed for SunOS.
+
+Feb 13, 94 martin2@trgcorp.solucorp.qc.ca (Martin Ayotte)
+
+	* [mem/atom.c]
+	Bug fix in ATOM_DeleteAtom() : 
+		change LocalFree() by USER_HEAP_FREE().
+
+	* [misc/message.c]
+	New function FatalAppExit().
+
+	* [objects/font.c]
+	New empty stub SetMapperFlags().
+
+	* [controls/menu.c]
+	Better CheckMark & other bitmaps placement.
+
+	* [windows/graphics.c]
+	New function RoundRect() : calc.exe now working...
+
+Tue Feb 15 14:29:37 1994  John Richardson
+
+        * [objects/bitblt.c]
+        Fixed StretchBlt so it works quicker and faster.  It still doesn't
+        use the StretchMode bits for bitmap compression, but that will
+        come soon.
+
+Mon Feb 14 13:21:04 1994  Miguel de Icaza  (miguel@roxanne.nuclecu.unam.mx)
+
+	* [include/windows.h,dialog.h,gdi.h]
+	Changed __atribute__ ((packed)) for WINE_PACKED. 
+	When compiling the library this is defined as nothing. This gets
+	rid with all the problems compiling under SunOS. Also 
+
+	* [windows/utility.c]
+	Added DebugPrintString.
+
+	* [toolkit/sup.c]
+	Added hSysRes = 1 definition to resolve externals.
+	Added CallLineDDAProc function (toolkit version).
+	Added toy, and hi ineficient memmove until code in message.c get
+	rewritten.
+
+	* [objects/gdiobj.c]
+	Ifdefed linux/emulator-dependent code to allow compilation of
+	WineLib.
+
+	* [misc/winsocket.c]
+	Added ifdef to allow compilation under SunOS.
+
+	* [misc/resource.c]
+	When compiling the library, the resource file is expected to be in
+	a file called $argv[0].Res. Also the information of the resource
+	is expected to be at offset 0 of the .Res file.
+
+	* [misc/main.c]
+	Call WinMain with arguments if compiling WineLib.
+	Call shutdown functions (Comm_DeInit, DOS_DeInitFS).
+	Call sync_profiles to preserve changes to .INI files.
+
+	* [misc/comm.c,dos_fs.c]
+	removed call to atexit(Comm_DeInit)
+	removed call to atexit(DOS_DeInitFS)
+	Shutdown functions are now called from the return of WinMain
+
+	* removed memorylib subdirectory
+
+	* moved memory/atom.c    to misc/atom.c
+	  moved memorylib/heap.c to toolkit/heap.c
+
+	* [loader/wine.c]
+	Moved DebugPrintString to windows/utility.c
+
+	* [include/winsock.h]
+	Define SO_DONTLINGER only if it has not been previously defined.
+
+	* [include/windows.h]
+	added definition for DLGPROC.
+	added definition for LMEM_WINE_ALIGN and other LMEM_* constants.
+	When compiling WineLib WNDPROC is defined with all the parameters
+	to avoid compilation problems.
+
+	* [include/user.h]
+	When compiling WineLib USER_HEAP_(ALLOC|REALLOC|ADDR|FREE) the
+	calls are translated to the library allocation routines.
+
+	* [include/gdi.h,user.h]
+	When compiling WineLib GDI_HEAP_(ALLOC|ADDR|FREE) the calls are
+	translated to the library allocation routines.
+
+	* [include/atom.h]
+	Defined LocalAlign. When compiling the emulator it's translated as
+	a call to LocalAlloc (the original code), when compiling WineLib
+	as a call to LocalAlloc with a WINE-flag called LMEM_WINE_ALIGN
+	(atom.c needs aligned data on a 4 byte boundary).
+
+	* [misc/file.c]
+	Renamed KERNEL_* functions and fixed prototypes.
+
+	* [if1632/kernel.spec]
+	Renamed KERNEL_* functions in order to be used by applications
+	using Wine as a library (OpeFile, _lclose, _lread, _lcreate,
+	_llseek, _lopen, _lwrite).
+
+	* [Makefile]
+	Create library instead of executable when building target
+	libwine.a 
+
+----------------------------------------------------------------------
+Tue Feb  8 13:52:11 1994  Miguel de Icaza  (miguel@roxanne)
+
+	* [Makefiles]
+	Use $(CC) instead of cc.
+	Added libwine target.
+
+	* [include/prototypes]
+	#ifdefed section for WineLib
+
+	* moved loader/cursor.c   to misc/cursor.c
+	  moved loader/resource.c to misc/resource.c
+	  moved misc/emulate.c    to miscemu/emulate.c
+	  moved misc/int1a.c      to miscemu/int1a.c
+	  moved misc/int21.c	  to miscemu/int21.c
+	  moved	misc/kernel.c	  to miscemu/kernel.c
+	  moved misc/user.c       to miscemu/user.c
+
+	* [memorylib/heap.c]
+	Heap management for WineLib
+
+	* [misc/comm.c]
+	Modified to allow compilation under SunOS (#include errno, SunOS
+	doesn't have atexit ()).
+
+	* [misc/dos_fs.c]
+	Modified to allow compilation under SunOS (#include vfs.h)
+
+	* [misc/file.c]
+	Modified to allow compilation under SunOS (OPEN_MAX constant,
+	#include unistd.h)
+
+	* [objects/palette.c]
+	Modified to allow compilation under SunOS (#include limits)
+
+	* [toolkit/sup.c]
+	WineLib version of CallWindowProc.
+
+	* [windows/event.c]
+	Typedef XPointer under X11R4 (OpenWindows).
+
+	* [windows/win.c]
+	When compiling WineLib, use direct callbacks instead of the
+	windows supplied callbacks.
+
+Mon Feb  7 22:37:34 MET 1994  julliard@di.epfl.ch (Alexandre Julliard)
+
+	* [loader/cursor.c]
+	New function CURSOR_SetWinCursor(), for internal use, to set
+	the cursor of a specific window more reliably than with SetCursor().
+
+	* [windows/nonclient.c]
+	Better window management. Moving and resizing from the system
+	menu should work now.
+	Added scroll-bar mouse tracking.
+
+	* [windows/win.c]
+	Moved scroll-bar creation and destruction to defwnd.c.
+
+Feb 5, 94 martin2@trgcorp.solucorp.qc.ca (Martin Ayotte)
+
+	* [windows/nonclient.c]
+	Call to StdDrawMenuBar() during NC's drawing.
+	New NC_TrackMouseMenuBar() function which call 
+		MenuButtonDown(), MenuButtonUp() & MenuMouseMove().
+
+	* [controls/menu.c]
+	New ChangeMenu() function.
+	Remove permanently old Xt menu code.
+	Make common functions MenuButtonDown(), MenuButtonUp()
+		& MenuMouseMove() for both popups & menubar.
+	
+	* [controls/combo.c]
+	Paint OBM_COMBO directly in combo client.
+
+	* [controls/listbox.c]
+	Fix bug in multicolumns calculations.
+
+	* [controls/Makefile]
+	Remove rules for old file 'caption.c'.
+
+	* [misc/kernel.c]
+	Remove empty stub GetModuleFileName().
+
+	* [loader/library.c]
+	New GetModuleHandle() function.
+	New GetModuleUsage() function.
+	New GetModuleFileName() function.
+
+	* [loader/resource.c]
+	Try to find the bug a missing menu loading ... Not found yet !
+
+	* [windows/win.c]
+	Remove old menubar creation.
+
+Thu Feb  3 22:30:11 1994  Erik Bos (erik@trashcan.hacktic.nl)
+
+	* [misc/winsocket.c]
+	More functions added.
+
+	* [if1632/winsock.spec] [misc/winsocket.c]
+	Added John Brezak's winsock.dll stuff.
+
+----------------------------------------------------------------------
 Tue Feb  1 21:14:47 1994  Bob Amstadt  (bob@pooh)
 
 	* [loader/selector.c]
@@ -58,7 +510,7 @@
 	New GetSubMenu() function.
 	Move GetMenu() & SetMenu() functions from 'windows/win.c'.
 
-	* [controls/combo.c]
+	* [controls/listbox.c]
 	Start changes to satisfy recent changes in scrollbars/windows.
 
 	* [loader/resource.c]
diff --git a/Configure b/Configure
new file mode 100755
index 0000000..c6bf097
--- /dev/null
+++ b/Configure
@@ -0,0 +1,30 @@
+#! /bin/sh
+
+ALLDEFINES=''
+
+echo -n 'Build Wine as emulator or library (E/L) [E]? '
+read input
+if [ "$input" = 'l' -o "$input" = 'L' ]
+then
+    WINELIB='#define WineLib -DWINELIB'
+    ALLDEFINES=$ALLDEFINES -DWINELIB
+else
+    WINELIB=''
+fi
+
+echo -n 'Short filenames (Y/N) [N]? '
+read input
+if [ "$input" = 'y' -o "$input" = 'Y' ]
+then
+    SHORTNAMES='#define ShortNames -DSHORTNAMES'
+    ALLDEFINES=$ALLDEFINES -DSHORTNAMES
+else
+    SHORTNAMES=''
+fi
+
+echo '/* autoconf.h generated automatically.  Run Configure. */' > autoconf.h
+echo $WINELIB >> autoconf.h
+echo $SHORTNAMES >> autoconf.h
+echo "#define AutoDefines  $ALLDEFINES" >> autoconf.h
+
+xmkmf -a
diff --git a/Imakefile b/Imakefile
index 05b5b4f..e0662aa 100644
--- a/Imakefile
+++ b/Imakefile
@@ -1,5 +1,13 @@
+#include "autoconf.h"
 #include "Wine.tmpl"
 
+#if defined(i386FreeBsd)
+MAKE = gmake
+CC = gcc -D__FreeBSD__
+#endif
+
+DEFINES = AutoDefines -DUSE_READLINE -DWINESTAT
+
 /*
  * This is the second try at using Imakefiles. There are probably many
  * problems and things I haven't even considered. I do not have a fixed
@@ -12,66 +20,76 @@
  */
 
 #define IHaveSubdirs
-#define	PassCDebugFlags 'CDEBUGFLAGS=$(CDEBUGFLAGS)' 'CC=$(CC)'
+#define	PassCDebugFlags 'CDEBUGFLAGS=$(CDEBUGFLAGS)' 'CC=$(CC)' 'MAKE=$(MAKE)'\
+			'DEFINES=$(DEFINES)'
 
-SUBDIRS = \
-	tools \
+COMMONSUBDIRS = \
 	controls \
 	etc \
-	if1632 \
 	include \
-	loader \
-	memory \
 	misc \
 	objects \
 	test \
 	windows
 
-/*
- * due to me not having the time and resources to test this, debugging
- * has been left out by for now of the Imakefiles. To put it back you have
- * to add:
- *	debugger
- * to the SUBDIRS list and:
- *	debugger
- *	readline.o
- * to the OBJS list.
- *
- * Not doing this will make the build fail in loader/signal.c, with an
- * unresolved reference to wine_debug. Comment out the line for now...
- * sigh. Fixed soon.
- */
+EMUSUBDIRS = \
+	tools \
+	debugger \
+	if1632 \
+	loader \
+	memory \
+	miscemu
+
+LIBSUBDIRS = \
+	toolkit
 
 WINEDIR = $(LIBDIR)/wine
 
-OBJS = \
-	if1632.o \
+COMMONOBJS = \
 	controls.o \
-	loader.o \
-	memory.o \
 	misc.o \
 	objects.o \
 	windows.o
 
-#ifdef i386BsdArchitecture
-SYSLIBS = -ll -lm -li386 -lgnumalloc
+/*
+ * WARNING: if1632.o must be the first object file because its code must be
+ *          linked at the lowest possible addresses.
+ */
+EMUOBJS = \
+	if1632.o \
+	debugger.o \
+	loader.o \
+	memory.o \
+	miscemu.o \
+	readline.o
+
+LIBOBJS = \
+	toolkit.o
+
+#ifndef WINELIB
+SUBDIRS = $(COMMONSUBDIRS) $(EMUSUBDIRS)
+OBJS = $(COMMONOBJS) $(EMUOBJS)
 #else
-#ifdef LinuxArchitecture
-SYSLIBS = -lm
+SUBDIRS = $(COMMONSUBDIRS) $(LIBSUBDIRS)
+OBJS = $(COMMONOBJS) $(LIBOBJS)
 #endif
+
+#if defined(i386BsdArchitecture)
+SYSLIBS = -ll -lm -li386 -lgnumalloc
+#elif defined(i386FreeBsd)
+SYSLIBS = -ll -lm -lgnumalloc
+#elif defined(LinuxArchitecture)
+SYSLIBS = -lm -lg
 #endif
 
 MakeSubdirs($(SUBDIRS))
 DependSubdirs($(SUBDIRS))
-
-#ifdef i386BsdArchitecture
 AllTarget(wine)
-#endif
 
-NormalProgramTarget(wine,$(OBJS),XawClientDepLibs,XawClientLibs,$(SYSLIBS))
-
-#ifdef LinuxArchitecture
-AllTarget(wine)
+#ifndef WINELIB
+NormalProgramTarget(wine,$(EMUOBJS) $(COMMONOBJS),$(DEPXLIB),$(XLIB),$(SYSLIBS))
+#else
+NormalLibraryTarget(wine,$(LIBOBJS) $(COMMONOBJS))
 #endif
 
 depend::
diff --git a/Makefile b/Makefile
deleted file mode 100644
index bbae18a..0000000
--- a/Makefile
+++ /dev/null
@@ -1,43 +0,0 @@
-######################################################################
-# These variables are inherited by the sub-makefiles
-DEBUGOPTS=
-COPTS=-O2 -m486
-INCLUDE_DIR=include
-LDFLAGS=
-
-######################################################################
-# These definitions are for the top level
-TARGET=wine
-LIBS=-L/usr/X386/lib -lX11 -lm
-OBJS=if1632/if1632.o controls/controls.o loader/loader.o \
-	memory/memory.o misc/misc.o objects/objects.o windows/windows.o debugger/debugger.o
-SUBDIRS=if1632 controls loader memory misc objects windows debugger
-TAGFILES=if1632/{*.c,*.S} controls/{*.c,*.S} loader/{*.c,*.S} \
-	memory/{*.c,*.S} misc/{*.c,*.S} objects/{*.c,*.S} \
-	windows/{*.c,*.S} debugger/{*.c,*.S}
-
-all: $(TARGET)
-
-dummy:
-
-tags:
-	etags $(TAGFILES)
-
-clean:
-	rm -f *~ *.o *#
-	@for i in tools $(SUBDIRS); do (cd $$i && $(MAKE) clean) || exit; done
-
-patchclean:
-	rm -f `find . -name '*.orig' -o -name '*.rej'`
-
-$(TARGET): dummy
-	@for i in tools $(SUBDIRS); \
-	do (cd $$i && echo $$i && $(MAKE) INCLUDE_DIR=../$(INCLUDE_DIR) \
-	COPTS="$(COPTS)" DEBUGOPTS="$(DEBUGOPTS)") || exit; done
-	$(CC) $(LDFLAGS) -o $(TARGET) $(OBJS) $(LIBS)
-
-depend:
-	@for i in tools $(SUBDIRS); \
-	     do (cd $$i && echo $$i && \
-	     $(MAKE) INCLUDE_DIR=../$(INCLUDE_DIR) COPTS="$(COPTS)" depend) \
-	     || exit; done
diff --git a/README b/README
index 6b0e42a..c7ff6b4 100644
--- a/README
+++ b/README
@@ -4,23 +4,16 @@
 
 INSTALLATION:
 
-Linux:
+You must have one of:
 
-    Uncompress and untar this archive into the directory of your
-choice.  This release requires a Linux version 0.99 pl13 kernel
-or above.
+	Linux version 0.99.13 or above
+	NetBSD-current
+	FreeBSD-current or FreeBSD 1.1
 
-NetBSD:
-
-    If you use BSD make rather than GNU make, you must apply the patches
-in the file "bsdmake.patch".  This release requires NetBSD-current.
-
-All:
-
-To build Wine, first do a "make depend" and then a "make".  The
+To build Wine, first do a "./Configure" and then a "make".  The
 executable "wine" will be built.  "wine" will load and run Windows'
 executables.  You must have a file "wine.ini" in the current directory,
-your homedirectory, or in the path specified by the environment 
+your home directory, or in the path specified by the environment 
 variable WINEPATH. Multiple directories in WINEPATH should be seperated
 by semi-colons and NOT by colons!
 
@@ -41,6 +34,31 @@
 Have a nice game of solitaire, but be careful.  Emulation isn't perfect.
 So, occassionally it will crash.
 
+WHAT'S NEW with Wine-940301: (see ChangeLog for details)
+	- NEW Configure script to set compile time options!
+	- Support for filesystems with short (less than 14 chars) filenames.
+	- Clipboard functions!
+	- and more...
+
+WHAT'S NEW with Wine-940223: (see ChangeLog for details)
+	- FreeBSD support
+	- FloodFill()
+	- Desktop window support
+	- Menu fixes
+	- and more...
+
+WHAT'S NEW with Wine-940216: (see ChangeLog for details)
+	- Many many bug fixes
+	- Switched to using Imakefile's instead of Makefile's.
+	- Lot's of changes for libwine.a
+
+WHAT'S NEW with Wine-940209: (see ChangeLog for details)
+	- Many many bug fixes
+	- Minor directory structure reorganization
+	- New GetModule*() functions.
+	- WINSOCK DLL
+	- First stab at Wine as a library
+
 WHAT'S NEW with Wine-940201: (see ChangeLog for details)
 	- Support for huge data structures.
 	- FreeBSD support.
diff --git a/Wine.tmpl b/Wine.tmpl
index 3bb9466..7740d32 100644
--- a/Wine.tmpl
+++ b/Wine.tmpl
@@ -6,13 +6,22 @@
 
 XCOMM First, dll description to files etc
 #ifndef MakeDllFromSpec
+#ifndef ShortNames
 #define MakeDllFromSpec(name,objfile)					@@\
 objfile.o: Concat(dll_,name.o) Concat3(dll_,name,_tab.o)		@@\
 									@@\
 Concat(dll_,name.S) Concat3(dll_,name,_tab.c): name.spec $(TOP)/tools/build  @@\
 	$(TOP)/tools/build name.spec					@@\
 
-#endif
+#else
+#define MakeDllFromSpec(name,objfile)					@@\
+objfile.o: Concat(dll_,name.o) Concat(dtb_,name.o)		@@\
+									@@\
+Concat(dll_,name.S) Concat(dtb_,name.c): name.spec $(TOP)/tools/build  @@\
+	$(TOP)/tools/build name.spec					@@\
+
+#endif /* SHORTNAMES */
+#endif /* MakeDllFromSpec */
 
 /*
  * WineRelocatableTarget - generate rules to produce a relocatable object
diff --git a/autoconf.h b/autoconf.h
new file mode 100644
index 0000000..223fbc1
--- /dev/null
+++ b/autoconf.h
@@ -0,0 +1,2 @@
+/* autoconf.h generated automatically.  Run Configure. */
+#error You must run Configure before you can build the makefiles.
diff --git a/bsdmake.patch b/bsdmake.patch
deleted file mode 100644
index 92dc3a5..0000000
--- a/bsdmake.patch
+++ /dev/null
@@ -1,140 +0,0 @@
-*** Makefile.orig	Tue Jan 18 12:36:47 1994
---- Makefile	Mon Jan 24 22:34:06 1994
-***************
-*** 8,14 ****
-  ######################################################################
-  # These definitions are for the top level
-  TARGET=wine
-! LIBS=-L/usr/X386/lib -lX11 -lm
-  OBJS=if1632/if1632.o controls/controls.o loader/loader.o \
-  	memory/memory.o misc/misc.o objects/objects.o windows/windows.o debugger/debugger.o
-  SUBDIRS=if1632 controls loader memory misc objects windows debugger
---- 8,14 ----
-  ######################################################################
-  # These definitions are for the top level
-  TARGET=wine
-! LIBS=-L/usr/X386/lib -lX11 -lm -li386 -lgnumalloc -ll
-  OBJS=if1632/if1632.o controls/controls.o loader/loader.o \
-  	memory/memory.o misc/misc.o objects/objects.o windows/windows.o debugger/debugger.o
-  SUBDIRS=if1632 controls loader memory misc objects windows debugger
-diff -ruN ../Backup//controls/Makefile ./controls/Makefile
---- ../Backup//controls/Makefile	Sat Sep 11 22:13:44 1993
-+++ ./controls/Makefile	Thu Sep 16 10:00:24 1993
-@@ -14,6 +14,7 @@
- depend:
- 	$(CC) $(CFLAGS) -M *.c > .depend
- 
--ifeq (.depend,$(wildcard .depend))
--include .depend
--endif
-+.if exists(.depend)
-+.include ".depend"
-+.endif
-+
-diff -ruN ../Backup//if1632/Makefile ./if1632/Makefile
---- ../Backup//if1632/Makefile	Tue Sep 14 08:56:17 1993
-+++ ./if1632/Makefile	Thu Sep 16 10:00:24 1993
-@@ -45,9 +45,9 @@
- depend:
- 	$(CC) $(CFLAGS) -M *.c > .depend
- 
--ifeq (.depend,$(wildcard .depend))
--include .depend
--endif
-+.if exists(.depend)
-+.include ".depend"
-+.endif
- 
- 
- 
-diff -ruN ../Backup//loader/Makefile ./loader/Makefile
---- ../Backup//loader/Makefile	Sat Sep 11 21:42:05 1993
-+++ ./loader/Makefile	Thu Sep 16 10:00:24 1993
-@@ -13,6 +13,6 @@
- depend:
- 	$(CC) $(CFLAGS) -M *.c > .depend
- 
--ifeq (.depend,$(wildcard .depend))
--include .depend
--endif
-+.if exists(.depend)
-+.include ".depend"
-+.endif
-diff -ruN ../Backup//memory/Makefile ./memory/Makefile
---- ../Backup//memory/Makefile	Sat Sep 11 21:42:05 1993
-+++ ./memory/Makefile	Thu Sep 16 10:00:24 1993
-@@ -13,6 +13,6 @@
- depend:
- 	$(CC) $(CFLAGS) -M *.c > .depend
- 
--ifeq (.depend,$(wildcard .depend))
--include .depend
--endif
-+.if exists(.depend)
-+.include ".depend"
-+.endif
-diff -ruN ../Backup//misc/Makefile ./misc/Makefile
---- ../Backup//misc/Makefile	Tue Sep 14 09:17:00 1993
-+++ ./misc/Makefile	Thu Sep 16 10:00:24 1993
-@@ -14,6 +14,6 @@
- depend:
- 	$(CC) $(CFLAGS) -M *.c > .depend
- 
--ifeq (.depend,$(wildcard .depend))
--include .depend
--endif
-+.if exists(.depend)
-+.include ".depend"
-+.endif
-diff -ruN ../Backup//objects/Makefile ./objects/Makefile
---- ../Backup//objects/Makefile	Tue Sep 14 13:59:04 1993
-+++ ./objects/Makefile	Thu Sep 16 10:00:24 1993
-@@ -14,6 +14,6 @@
- depend:
- 	$(CC) $(CFLAGS) -M *.c > .depend
- 
--ifeq (.depend,$(wildcard .depend))
--include .depend
--endif
-+.if exists(.depend)
-+.include ".depend"
-+.endif
-diff -ruN ../Backup//tools/Makefile ./tools/Makefile
---- ../Backup//tools/Makefile	Tue Sep 14 09:46:40 1993
-+++ ./tools/Makefile	Thu Sep 16 10:00:24 1993
-@@ -14,6 +14,10 @@
- #
- # Dependency lists
- #
--ifeq (.depend,$(wildcard .depend))
--include .depend
--endif
-+.if exists(.depend)
-+.include ".depend"
-+.endif
-+
-+#ifeq (.depend,$(wildcard .depend))
-+#include .depend
-+#endif
-diff -ruN ../Backup//windows/Makefile ./windows/Makefile
---- ../Backup//windows/Makefile	Tue Sep 14 08:39:45 1993
-+++ ./windows/Makefile	Thu Sep 16 10:00:24 1993
-@@ -14,6 +14,6 @@
- depend:
- 	$(CC) $(CFLAGS) -M *.c > .depend
- 
--ifeq (.depend,$(wildcard .depend))
--include .depend
--endif
-+.if exists(.depend)
-+.include ".depend"
-+.endif
---- debugger/Makefile.orig	Thu Sep 30 07:29:39 1993
-+++ debugger/Makefile	Thu Sep 30 07:27:00 1993
-@@ -37,3 +37,6 @@
- depend: dbg.tab.c dbg.tab.h lex.yy.c
- 	$(CC) $(CFLAGS) -M *.c > .depend
- 
-+.if exists(.depend)
-+.include ".depend"
-+.endif
diff --git a/controls/Imakefile b/controls/Imakefile
index 22fb4af..0f76706 100644
--- a/controls/Imakefile
+++ b/controls/Imakefile
@@ -4,23 +4,15 @@
 
 SRCS = \
 	button.c \
-	caption.c \
 	combo.c \
 	listbox.c \
 	menu.c \
 	scroll.c \
 	static.c \
+	desktop.c \
 	widgets.c
 
-OBJS = \
-	button.o \
-	caption.o \
-	combo.o \
-	listbox.o \
-	menu.o \
-	scroll.o \
-	static.o \
-	widgets.o
+OBJS = $(SRCS:.c=.o)
 
 WineRelocatableTarget($(TOP)/$(MODULE),,$(OBJS))
 DependTarget()
diff --git a/controls/Makefile b/controls/Makefile
deleted file mode 100644
index fb915e7..0000000
--- a/controls/Makefile
+++ /dev/null
@@ -1,19 +0,0 @@
-CFLAGS=$(COPTS) $(DEBUGOPTS) -I$(INCLUDE_DIR)
-
-OBJS = menu.o caption.o widgets.o button.o \
-	scroll.o listbox.o combo.o static.o
-
-default: controls.o
-
-controls.o: $(OBJS)
-	$(LD) -r -o controls.o $(OBJS)
-
-clean:
-	rm -f *.o *~ *.s dll_* *.a *#
-
-depend:
-	$(CC) $(CFLAGS) -M *.c > .depend
-
-ifeq (.depend,$(wildcard .depend))
-include .depend
-endif
diff --git a/controls/caption.c b/controls/caption.c
deleted file mode 100644
index 68283a7..0000000
--- a/controls/caption.c
+++ /dev/null
@@ -1,296 +0,0 @@
-/*
- * Interface code to CAPTION widget
- *
- * Copyright  Martin Ayotte, 1994
- *
- */
-
-/*
-#define DEBUG_CAPTION
-*/
-
-static char Copyright[] = "Copyright Martin Ayotte, 1994";
-
-#include <X11/Intrinsic.h>
-#include <X11/StringDefs.h>
-#include "windows.h"
-#include "caption.h"
-#include "heap.h"
-#include "win.h"
-#include <sys/types.h>
-#include <dirent.h>
-#include <sys/stat.h>
-
-HBITMAP hStdClose = (HBITMAP)NULL;
-HBITMAP hStdCloseD = (HBITMAP)NULL;
-HBITMAP hStdMinim = (HBITMAP)NULL;
-HBITMAP hStdMinimD = (HBITMAP)NULL;
-HBITMAP hStdMaxim = (HBITMAP)NULL;
-HBITMAP hStdMaximD = (HBITMAP)NULL;
-HMENU hStdSysMenu = (HMENU)NULL;
-
-LPHEADCAPTION CaptionBarGetWindowAndStorage(HWND hWnd, WND **wndPtr);
-LPHEADCAPTION CaptionBarGetStorageHeader(HWND hWnd);
-void SetMenuLogicalParent(HMENU hMenu, HWND hWnd);
-
-
-/***********************************************************************
- *           CaptionBarWndProc
- */
-LONG CaptionBarWndProc( HWND hWnd, WORD message, WORD wParam, LONG lParam )
-{    
-    WORD	wRet;
-    short	x, y;
-    short	width, height;
-    WND  	*wndPtr;
-    LPHEADCAPTION lphs;
-    PAINTSTRUCT	ps;
-    HDC		hDC;
-    HDC		hMemDC;
-    BITMAP	bm;
-    RECT 	rect;
-    char	str[128];
-    switch(message)
-    {
-    case WM_CREATE:
-	wndPtr = WIN_FindWndPtr(hWnd);
-	lphs = (LPHEADCAPTION)malloc(sizeof(HEADCAPTION));
-	if (lphs == 0) {
-	    printf("Bad Memory Alloc on CAPTIONBAR !\n");
-	    return 0;
-	    }
-	memset(lphs, 0, sizeof(HEADCAPTION));
-#ifdef DEBUG_CAPTION
- 	printf("CreateCaptionBarStruct %lX !\n", lphs);
-#endif
-	*((LPHEADCAPTION *)&wndPtr->wExtra[1]) = lphs;
-	if (hStdClose == (HBITMAP)NULL) 
-	    hStdClose = LoadBitmap((HINSTANCE)NULL, MAKEINTRESOURCE(OBM_CLOSE));
-	lphs->hClose = hStdClose;
-	if (hStdMinim == (HBITMAP)NULL) 
-	    hStdMinim = LoadBitmap((HINSTANCE)NULL, MAKEINTRESOURCE(OBM_REDUCE));
-	lphs->hMinim = hStdMinim;
-	if (hStdMaxim == (HBITMAP)NULL) 
-	    hStdMaxim = LoadBitmap((HINSTANCE)NULL, MAKEINTRESOURCE(OBM_RESTORE));
-	lphs->hMaxim = hStdMaxim;
-	if (hStdCloseD == (HBITMAP)NULL) 
-	    hStdCloseD = LoadBitmap((HINSTANCE)NULL, MAKEINTRESOURCE(OBM_CLOSE));
-	if (hStdMinimD == (HBITMAP)NULL) 
-	    hStdMinimD = LoadBitmap((HINSTANCE)NULL, MAKEINTRESOURCE(OBM_REDUCED));
-	if (hStdMaximD == (HBITMAP)NULL) 
-	    hStdMaximD = LoadBitmap((HINSTANCE)NULL, MAKEINTRESOURCE(OBM_RESTORED));
-	if (hStdSysMenu == (HBITMAP)NULL) 
-	    hStdSysMenu = LoadMenu((HINSTANCE)NULL, "SYSMENU");
-	lphs->hSysMenu = hStdSysMenu;
- 	printf("CaptionBar SYSMENU %04X !\n", lphs->hSysMenu);
-	if (lphs->hSysMenu == 0) lphs->hSysMenu = CreatePopupMenu();
-	AppendMenu(lphs->hSysMenu, MF_STRING, 9999, "About &Wine ...");
-	GetClientRect(hWnd, &rect);
-	CopyRect(&lphs->rectClose, &rect);
-	CopyRect(&lphs->rectMaxim, &rect);
-	lphs->rectClose.right = lphs->rectClose.left +
-		 lphs->rectClose.bottom + lphs->rectClose.top;
-	lphs->rectMaxim.left = lphs->rectMaxim.right -
-		 lphs->rectMaxim.bottom + lphs->rectMaxim.top;
-	CopyRect(&lphs->rectMinim, &lphs->rectMaxim);
-	if (lphs->hMaxim != 0) {
-	    lphs->rectMinim.left = lphs->rectMaxim.bottom + lphs->rectMaxim.top;
-	    lphs->rectMinim.right = lphs->rectMaxim.bottom + lphs->rectMaxim.top;
-	    }
-	if (lphs->hClose == 0) lphs->rectClose.right = lphs->rectClose.left;
-	printf("CAPTION Close.right=%d Maxim.left=%d Minim.left=%d !\n",
-	    lphs->rectClose.right, lphs->rectMaxim.left, lphs->rectMinim.left);
-	return 0;
-    case WM_DESTROY:
-	lphs = CaptionBarGetWindowAndStorage(hWnd, &wndPtr);
-	if (lphs == 0) return 0;
-#ifdef DEBUG_CAPTION
-        printf("CaptionBar WM_DESTROY %lX !\n", lphs);
-#endif
-	DestroyMenu(lphs->hSysMenu);
-	free(lphs);
-	*((LPHEADCAPTION *)&wndPtr->wExtra[1]) = 0;
-	return 0;
-    case WM_COMMAND:
-#ifdef DEBUG_CAPTION
-    	printf("CaptionBar WM_COMMAND %04X %08X !\n", wParam, lParam);
-#endif
-	lphs = CaptionBarGetWindowAndStorage(hWnd, &wndPtr);
-    	if (wParam == 9999) {
-	    printf("CaptionBar Show 'About Wine ...' !\n");
-	    }
-	SendMessage(wndPtr->hwndParent, message, wParam, lParam);
-	break;
-    case WM_SIZE:
-	lphs = CaptionBarGetWindowAndStorage(hWnd, &wndPtr);
-	width  = LOWORD(lParam);
-	height = HIWORD(lParam);
-	if (lphs->hClose != 0)
-	    SetRect(&lphs->rectClose, 0, 0, height, height);
-	if (lphs->hMinim != 0) {
-	    if (lphs->hMaxim != 0)
-		SetRect(&lphs->rectMinim, width - 2 * height, 0, 
-				width - height, height);
-	    else
-		SetRect(&lphs->rectMinim, width - height, 0, width, height);
-	    }
-	if (lphs->hMaxim != 0)
-	    SetRect(&lphs->rectMaxim, width - height, 0, width, height);
-	break;
-    case WM_LBUTTONDOWN:
-	lphs = CaptionBarGetWindowAndStorage(hWnd, &wndPtr);
-	SetCapture(hWnd);
-	x = LOWORD(lParam);
-	y = HIWORD(lParam);
-	hDC = GetDC(hWnd);
-	if (x > lphs->rectClose.left && x < lphs->rectClose.right) {
-	    lphs->hClose = hStdCloseD;
-	    InvalidateRect(hWnd, &lphs->rectClose, TRUE);
-	    UpdateWindow(hWnd);
-	    }
-	if (x > lphs->rectMinim.left && x < lphs->rectMinim.right) {
-	    lphs->hMinim = hStdMinimD;
-	    InvalidateRect(hWnd, &lphs->rectMinim, TRUE);
-	    UpdateWindow(hWnd);
-	    }
-	if (x > lphs->rectMaxim.left && x < lphs->rectMaxim.right &&
-	    lphs->hMaxim != 0) {
-	    lphs->hMaxim = hStdMaximD;
-	    InvalidateRect(hWnd, &lphs->rectMaxim, TRUE);
-	    UpdateWindow(hWnd);
-	    }
-	ReleaseDC(hWnd, hDC);
-	break;
-    case WM_LBUTTONUP:
-	lphs = CaptionBarGetWindowAndStorage(hWnd, &wndPtr);
-	ReleaseCapture();
-#ifdef DEBUG_CAPTION
-        printf("CaptionBar WM_LBUTTONUP %lX !\n", lParam);
-#endif
-	x = LOWORD(lParam);
-	y = HIWORD(lParam);
-	if (x > lphs->rectClose.left && x < lphs->rectClose.right) {
-	    lphs->hClose = hStdClose;
-	    InvalidateRect(hWnd, &lphs->rectClose, TRUE);
-	    UpdateWindow(hWnd);
-	    TrackPopupMenu(lphs->hSysMenu, TPM_LEFTBUTTON, 0, -20, 
-		0, wndPtr->hwndParent, (LPRECT)NULL);
-	    SetMenuLogicalParent(lphs->hSysMenu, hWnd);
-	    printf("CAPTION Pop the SYSMENU !\n");
-	    break;
-	    }
-	if (x > lphs->rectMinim.left && x < lphs->rectMinim.right) {
-	    SendMessage(wndPtr->hwndParent, WM_SYSCOMMAND, SC_MINIMIZE, 0L);
-	    lphs->hMinim = hStdMinim;
-	    InvalidateRect(hWnd, &lphs->rectMinim, TRUE);
-	    UpdateWindow(hWnd);
-	    printf("CAPTION Minimize Window !\n");
-	    break;
-	    }
-	if (x > lphs->rectMaxim.left && x < lphs->rectMaxim.right) {
-	    lphs->hMaxim = hStdMaxim;
-	    InvalidateRect(hWnd, &lphs->rectMaxim, TRUE);
-	    UpdateWindow(hWnd);
-	    SendMessage(wndPtr->hwndParent, WM_SYSCOMMAND, SC_MAXIMIZE, 0L);
-	    printf("CAPTION Maximize Window !\n");
-	    break;
-	    }
-	break;
-
-    case WM_LBUTTONDBLCLK:
-	lphs = CaptionBarGetWindowAndStorage(hWnd, &wndPtr);
-#ifdef DEBUG_CAPTION
-        printf("CaptionBar WM_LBUTTONDBLCLK %lX !\n", lParam);
-#endif
-	x = LOWORD(lParam);
-	y = HIWORD(lParam);
-	if (x > lphs->rectClose.left && x < lphs->rectClose.right) {
-	    SendMessage(wndPtr->hwndParent, WM_SYSCOMMAND, SC_CLOSE, 0L);
-	    printf("CAPTION DoubleClick Close Window !\n");
-	    break;
-	    }
-	break;
-
-    case WM_KEYDOWN:
-    case WM_KEYUP:
-    case WM_CHAR:
-	lphs = CaptionBarGetWindowAndStorage(hWnd, &wndPtr);
-	return(SendMessage(wndPtr->hwndParent, message, wParam, lParam));
-
-    case WM_PAINT:
-	GetWindowRect(hWnd, &rect);
-#ifdef DEBUG_CAPTION
- 	printf("CaptionBar WM_PAINT left=%d top=%d right=%d bottom=%d !\n",
- 		rect.left, rect.top, rect.right, rect.bottom);
-#endif
-	lphs = CaptionBarGetWindowAndStorage(hWnd, &wndPtr);
-	hDC = BeginPaint(hWnd, &ps);
-	hMemDC = CreateCompatibleDC(hDC);
-	if (lphs->hClose != 0) {
-	    GetObject(lphs->hClose, sizeof(BITMAP), (LPSTR)&bm);
-	    SelectObject(hMemDC, lphs->hClose);
-	    BitBlt(hDC, 0, 0, bm.bmWidth, bm.bmHeight, hMemDC, 0, 0, SRCCOPY);
-	    }
-	if (lphs->hMinim != 0) {
-	    GetObject(lphs->hMinim, sizeof(BITMAP), (LPSTR)&bm);
-	    SelectObject(hMemDC, lphs->hMinim);
-	    BitBlt(hDC, lphs->rectMinim.left, 0, bm.bmWidth, bm.bmHeight, hMemDC, 0, 0, SRCCOPY);
-	    }
-	if (lphs->hMaxim != 0) {
-	    GetObject(lphs->hMaxim, sizeof(BITMAP), (LPSTR)&bm);
-	    SelectObject(hMemDC, lphs->hMaxim);
-	    BitBlt(hDC, lphs->rectMaxim.left, 0, bm.bmWidth, bm.bmHeight, hMemDC, 0, 0, SRCCOPY);
-	    }
-	DeleteDC(hMemDC);
-	GetClientRect(hWnd, &rect);
-	FrameRect(hDC, &rect, GetStockObject(BLACK_BRUSH));
-	rect.left = lphs->rectClose.right;
-	rect.right = lphs->rectMinim.left;
-#ifdef DEBUG_CAPTION
- 	printf("CaptionBar WM_PAINT left=%d top=%d right=%d bottom=%d !\n",
- 		rect.left, rect.top, rect.right, rect.bottom);
-#endif
-	FillRect(hDC, &rect, GetStockObject(GRAY_BRUSH));
-	if (GetWindowTextLength(wndPtr->hwndParent) > 0) {
-	    GetWindowText(wndPtr->hwndParent, str, sizeof(str));
-	    width = GetTextExtent(hDC, str, strlen(str));
-	    DrawText(hDC, str, -1, &rect, DT_CENTER | DT_VCENTER | DT_SINGLELINE);
-	    }
-	EndPaint(hWnd, &ps);
-	break;
-    default:
-	return DefWindowProc( hWnd, message, wParam, lParam );
-    }
-return(0);
-}
-
-
-
-LPHEADCAPTION CaptionBarGetWindowAndStorage(HWND hWnd, WND **wndPtr)
-{
-    WND  *Ptr;
-    LPHEADCAPTION lphs;
-    *(wndPtr) = Ptr = WIN_FindWndPtr(hWnd);
-    if (Ptr == 0) {
-    	printf("Bad Window handle on CaptionBar !\n");
-    	return 0;
-    	}
-    lphs = *((LPHEADCAPTION *)&Ptr->wExtra[1]);
-    return lphs;
-}
-
-
-LPHEADCAPTION CaptionBarGetStorageHeader(HWND hWnd)
-{
-    WND  *wndPtr;
-    LPHEADCAPTION lphs;
-    wndPtr = WIN_FindWndPtr(hWnd);
-    if (wndPtr == 0) {
-    	printf("Bad Window handle on CaptionBar !\n");
-    	return 0;
-    	}
-    lphs = *((LPHEADCAPTION *)&wndPtr->wExtra[1]);
-    return lphs;
-}
-
-
diff --git a/controls/combo.c b/controls/combo.c
index 2bcde7f..61b5e20 100644
--- a/controls/combo.c
+++ b/controls/combo.c
@@ -11,8 +11,6 @@
 
 static char Copyright[] = "Copyright Martin Ayotte, 1993";
 
-#include <X11/Intrinsic.h>
-#include <X11/StringDefs.h>
 #include "windows.h"
 #include "combo.h"
 #include "heap.h"
@@ -39,8 +37,7 @@
     int		AltState;
     WND  	*wndPtr;
     LPHEADCOMBO lphc;
-    LPDRAWITEMSTRUCT lpdis;
-    HDC		hMemDC;
+    HDC		hDC, hMemDC;
     BITMAP	bm;
     char	str[128];
     PAINTSTRUCT paintstruct;
@@ -48,47 +45,48 @@
     switch(message)
     {
     case WM_CREATE:
-	ShowScrollBar(hwnd, SB_BOTH, FALSE);
-	GetClientRect(hwnd, &rect);
-	width = rect.right - rect.left;
-	height = rect.bottom - rect.top;
-/*	SetWindowPos(hwnd, 0, 0, 0, width, 16, 
-		SWP_NOMOVE | SWP_NOZORDER); */
-	CreateComboStruct(hwnd);
 	wndPtr = WIN_FindWndPtr(hwnd);
-	lphc = ComboGetStorageHeader(hwnd);
-	if (lphc == NULL) return 0;
+	if (wndPtr == NULL) return 0;
 #ifdef DEBUG_COMBO
         printf("Combo WM_CREATE %lX !\n", lphc);
 #endif
 	if (hComboBit == (HBITMAP)NULL) 
 	    hComboBit = LoadBitmap((HINSTANCE)NULL, MAKEINTRESOURCE(OBM_COMBO));
-	lphc->hWndDrop = CreateWindow("BUTTON", "", 
-        	WS_CHILD | WS_CLIPCHILDREN | WS_VISIBLE | BS_OWNERDRAW,
-        	width - 16, 0, 16, 16, hwnd, 1, wndPtr->hInstance, 0L);
+	GetObject(hComboBit, sizeof(BITMAP), (LPSTR)&bm);
+	wndPtr->dwStyle &= 0xFFFFFFFFL ^ (WS_VSCROLL | WS_HSCROLL);
+	GetWindowRect(hwnd, &rect);
+	width = rect.right - rect.left;
+	height = rect.bottom - rect.top;
+	SetWindowPos(hwnd, 0, 0, 0, width + bm.bmHeight, bm.bmHeight, 
+		SWP_NOMOVE | SWP_NOZORDER); 
+	CreateComboStruct(hwnd);
+	lphc = ComboGetStorageHeader(hwnd);
+	if (lphc == NULL) return 0;
         if (wndPtr->dwStyle & CBS_SIMPLE)
 /*	    lphc->hWndEdit = CreateWindow("EDIT", "", */
 	    lphc->hWndEdit = CreateWindow("STATIC", "", 
 		WS_CHILD | WS_CLIPCHILDREN | WS_VISIBLE | SS_LEFT,
-		0, 0, width - 16, 16, hwnd, 1, wndPtr->hInstance, 0L);
+		0, 0, width - bm.bmHeight, bm.bmHeight, 
+		hwnd, 1, wndPtr->hInstance, 0L);
 	else
 	    lphc->hWndEdit = CreateWindow("STATIC", "", 
 		WS_CHILD | WS_CLIPCHILDREN | WS_VISIBLE | SS_LEFT,
-		0, 0, width - 16, 16, hwnd, 1, wndPtr->hInstance, 0L);
+		0, 0, width - bm.bmHeight, bm.bmHeight, 
+		hwnd, 1, wndPtr->hInstance, 0L);
 	lphc->hWndLBox = CreateWindow("LISTBOX", "", 
         	WS_CHILD | WS_CLIPCHILDREN | WS_BORDER | WS_VSCROLL | LBS_NOTIFY,
-        	wndPtr->rectClient.left, wndPtr->rectClient.top + 16, width, height, 
-        	wndPtr->hwndParent, 1, wndPtr->hInstance, (LPSTR)MAKELONG(0, hwnd));
+        	wndPtr->rectClient.left, wndPtr->rectClient.top + bm.bmHeight, 
+        	width, height, wndPtr->hwndParent, 1, 
+        	wndPtr->hInstance, (LPSTR)MAKELONG(0, hwnd));
         ShowWindow(lphc->hWndLBox, SW_HIDE);
 #ifdef DEBUG_COMBO
-        printf("Combo Creation Drop=%X LBox=%X!\n", lphc->hWndDrop, lphc->hWndLBox);
+        printf("Combo Creation LBox=%X!\n", lphc->hWndLBox);
 #endif
 	return 0;
     case WM_DESTROY:
 	lphc = ComboGetStorageHeader(hwnd);
 	if (lphc == 0) return 0;
 /*
-	DestroyWindow(lphc->hWndDrop);
 	DestroyWindow(lphc->hWndEdit);
 */
 	DestroyWindow(lphc->hWndLBox);
@@ -106,30 +104,6 @@
 	wndPtr = WIN_FindWndPtr(hwnd);
 	lphc = ComboGetStorageHeader(hwnd);
 	if (lphc == NULL) return 0;
-        if (LOWORD(lParam) == lphc->hWndDrop) {
-	    if (HIWORD(lParam) != BN_CLICKED) return 0;
-#ifdef DEBUG_COMBO
-	    printf("CB_SHOWDROPDOWN !\n");
-#endif
-	    lphc->dwState = lphc->dwState ^ CB_SHOWDROPDOWN;
-	    if ((lphc->dwState & CB_SHOWDROPDOWN) == CB_SHOWDROPDOWN) {
-		ShowWindow(lphc->hWndLBox, SW_SHOW);
-/*
-		SetFocus(lphc->hWndLBox);
-*/
-		}
-	    else {
-/*
-		SetFocus(lphc->hWndEdit);
-*/
-		ShowWindow(lphc->hWndLBox, SW_HIDE);
-		y = SendMessage(lphc->hWndLBox, LB_GETCURSEL, 0, 0L);
-		if (y != LB_ERR) {
-		    SendMessage(lphc->hWndLBox, LB_GETTEXT, (WORD)y, (LPARAM)str);
-		    SendMessage(lphc->hWndEdit, WM_SETTEXT, (WORD)y, (LPARAM)str);
-		    }
-		}
-            }
         if (LOWORD(lParam) == lphc->hWndLBox) {
             switch(HIWORD(lParam))
         	{
@@ -153,13 +127,39 @@
 	break;
     case WM_LBUTTONDOWN:
         printf("Combo WM_LBUTTONDOWN wParam=%x lParam=%lX !\n", wParam, lParam);
+	GetClientRect(hwnd, &rect);
+	rect.left = rect.right - (rect.bottom - rect.top); 
+	hDC = GetDC(hwnd);
+	InflateRect(&rect, -1, -1);
+	DrawReliefRect(hDC, rect, 1, 1);
+	ReleaseDC(hwnd, hDC);
 	wndPtr = WIN_FindWndPtr(hwnd);
 	lphc = ComboGetStorageHeader(hwnd);
 	lphc->dwState = lphc->dwState ^ CB_SHOWDROPDOWN;
 	if ((lphc->dwState & CB_SHOWDROPDOWN) == CB_SHOWDROPDOWN)
 	    ShowWindow(lphc->hWndLBox, SW_SHOW);
+	else {
+/*
+	    SetFocus(lphc->hWndEdit);
+*/
+	    ShowWindow(lphc->hWndLBox, SW_HIDE);
+	    y = SendMessage(lphc->hWndLBox, LB_GETCURSEL, 0, 0L);
+	    if (y != LB_ERR) {
+		SendMessage(lphc->hWndLBox, LB_GETTEXT, (WORD)y, (LPARAM)str);
+		SendMessage(lphc->hWndEdit, WM_SETTEXT, (WORD)y, (LPARAM)str);
+		}
+	    }
 	break;
-    case WM_KEYDOWN:
+    case WM_LBUTTONUP:
+        printf("Combo WM_LBUTTONUP wParam=%x lParam=%lX !\n", wParam, lParam);
+	GetClientRect(hwnd, &rect);
+	rect.left = rect.right - (rect.bottom - rect.top); 
+	hDC = GetDC(hwnd);
+	InflateRect(&rect, -1, -1);
+	DrawReliefRect(hDC, rect, 1, 0);
+	ReleaseDC(hwnd, hDC);
+	break;
+   case WM_KEYDOWN:
 	wndPtr = WIN_FindWndPtr(hwnd);
 	lphc = ComboGetStorageHeader(hwnd);
 	y = SendMessage(lphc->hWndLBox, LB_GETCURSEL, 0, 0L);
@@ -206,32 +206,19 @@
 	break;
     case WM_CTLCOLOR:
     	return(SendMessage(GetParent(hwnd), WM_CTLCOLOR, wParam, lParam));
-    case WM_DRAWITEM:
-#ifdef DEBUG_SCROLL
-	    printf("ComboBox WM_DRAWITEM w=%04X l=%08X\n", wParam, lParam);
-#endif
-        lpdis = (LPDRAWITEMSTRUCT)lParam;
-	if (lpdis->CtlType == ODT_BUTTON && lpdis->itemAction == ODA_DRAWENTIRE) {
-	    hMemDC = CreateCompatibleDC(lpdis->hDC);
-	    GetObject(hComboBit, sizeof(BITMAP), (LPSTR)&bm);
-	    SelectObject(hMemDC, hComboBit);
-	    BitBlt(lpdis->hDC, 0, 0, bm.bmWidth, bm.bmHeight, hMemDC, 0, 0, SRCCOPY);
-	    DeleteDC(hMemDC);
-	    }
-	if (lpdis->CtlType == ODT_BUTTON && lpdis->itemAction == ODA_SELECT) {
-	    CopyRect(&rect, &lpdis->rcItem);
-	    InflateRect(&rect, -1, -1);
-	    DrawReliefRect(lpdis->hDC, rect, 1, 1);
-	    }
-	break;
     case WM_PAINT:
-	BeginPaint( hwnd, &paintstruct );
-	EndPaint( hwnd, &paintstruct );
+	GetClientRect(hwnd, &rect);
+	hDC = BeginPaint(hwnd, &paintstruct);
+	hMemDC = CreateCompatibleDC(hDC);
+	GetObject(hComboBit, sizeof(BITMAP), (LPSTR)&bm);
+	SelectObject(hMemDC, hComboBit);
+	BitBlt(hDC, rect.right - bm.bmWidth, 0, 
+		bm.bmWidth, bm.bmHeight, hMemDC, 0, 0, SRCCOPY);
+	DeleteDC(hMemDC);
+	EndPaint(hwnd, &paintstruct);
 	lphc = ComboGetStorageHeader(hwnd);
         InvalidateRect(lphc->hWndEdit, NULL, TRUE);
         UpdateWindow(lphc->hWndEdit);
-        InvalidateRect(lphc->hWndDrop, NULL, TRUE);
-        UpdateWindow(lphc->hWndDrop);
         if ((lphc->dwState & CB_SHOWDROPDOWN) == CB_SHOWDROPDOWN) {
 	    InvalidateRect(lphc->hWndLBox, NULL, TRUE);
 	    UpdateWindow(lphc->hWndLBox);
diff --git a/controls/desktop.c b/controls/desktop.c
new file mode 100644
index 0000000..14bf3c5
--- /dev/null
+++ b/controls/desktop.c
@@ -0,0 +1,21 @@
+/*
+ * Desktop window class.
+ *
+ * Copyright 1994 Alexandre Julliard
+ */
+
+static char Copyright[] = "Copyright  Alexandre Julliard, 1994";
+
+#include "windows.h"
+
+LONG DesktopWndProc ( HWND hwnd, WORD message, WORD wParam, LONG lParam )
+{
+      /* Most messages are ignored (we DON'T call DefWindowProc) */
+
+    switch(message)
+    {
+    }
+    
+    return 0;
+}
+
diff --git a/controls/listbox.c b/controls/listbox.c
index 642d47e..76a3ecd 100644
--- a/controls/listbox.c
+++ b/controls/listbox.c
@@ -12,8 +12,6 @@
 static char Copyright[] = "Copyright Martin Ayotte, 1993";
 
 #include <stdio.h>
-#include <X11/Intrinsic.h>
-#include <X11/StringDefs.h>
 #include <sys/types.h>
 #include <sys/stat.h>
 #include <dirent.h>
@@ -87,14 +85,11 @@
 	    SetScrollRange(hwnd, SB_HORZ, 1, 1, TRUE);
 	    ShowScrollBar(hwnd, SB_HORZ, FALSE);
 	    }
-	if (wndPtr->hCursor == (HCURSOR)NULL)
-	    wndPtr->hCursor = LoadCursor((HINSTANCE)NULL, IDC_ARROW);
 	return 0;
     case WM_DESTROY:
 	lphl = ListBoxGetWindowAndStorage(hwnd, &wndPtr);
         if (lphl == 0) return 0;
 	ListBoxResetContent(hwnd);
-	DestroyCursor(wndPtr->hCursor);
 	free(lphl);
 	*((LPHEADLIST *)&wndPtr->wExtra[1]) = 0;
 #ifdef DEBUG_LISTBOX
@@ -496,6 +491,19 @@
 	lphl->ItemsPerColumn = ipc = 0;
 	for(i = 1; i <= lphl->ItemsCount; i++) {
 	    if (i >= lphl->FirstVisible) {
+	        if (lpls == NULL) break;
+		if ((h + lpls->dis.rcItem.bottom - lpls->dis.rcItem.top) > rect.bottom) {
+		    if ((wndPtr->dwStyle & LBS_MULTICOLUMN) == LBS_MULTICOLUMN) {
+			lphl->ItemsPerColumn = max(lphl->ItemsPerColumn, ipc);
+			ipc = 0;
+			h = 0;
+			rect.left += lphl->ColumnsWidth;
+			rect.right += lphl->ColumnsWidth;
+			if (rect.left > maxwidth) break;
+			}
+		    else 
+			break;
+		    }
 		h2 = lpls->dis.rcItem.bottom - lpls->dis.rcItem.top;
 		lpls->dis.rcItem.top = h;
 		lpls->dis.rcItem.bottom = h + h2;
@@ -512,18 +520,6 @@
 		h += h2;
 		lphl->ItemsVisible++;
 		ipc++;
-		if (h > rect.bottom) {
-		    if ((wndPtr->dwStyle & LBS_MULTICOLUMN) == LBS_MULTICOLUMN) {
-			lphl->ItemsPerColumn = max(lphl->ItemsPerColumn, ipc);
-			ipc = 0;
-			h = 0;
-			rect.left += lphl->ColumnsWidth;
-			rect.right += lphl->ColumnsWidth;
-			if (rect.left > maxwidth) break;
-			}
-		    else 
-			break;
-		    }
 		}
 	    if (lpls->lpNext == NULL) goto EndOfPaint;
 	    lpls = (LPLISTSTRUCT)lpls->lpNext;
@@ -624,7 +620,7 @@
 
 int ListBoxFindMouse(HWND hwnd, int X, int Y)
 {
-	WND 	*wndPtr;
+    WND 		*wndPtr;
     LPHEADLIST 		lphl;
     LPLISTSTRUCT	lpls;
     RECT 		rect;
diff --git a/controls/menu.c b/controls/menu.c
index add8f18..53d9f0d 100644
--- a/controls/menu.c
+++ b/controls/menu.c
@@ -1,22 +1,19 @@
+/*
+ *        Menus functions
+ */
 static char RCSId[] = "$Id$";
-static char Copyright[] = "Copyright  Robert J. Amstadt, 1993";
-static char Copyright2[] = "Copyright  Martin Ayotte, 1993";
+static char Copyright[] = "Copyright  Martin Ayotte, 1993";
 
 /*
 #define DEBUG_MENU
 #define DEBUG_SYSMENU
 */
-#define USE_POPUPMENU
 
-#include <X11/Intrinsic.h>
-#include <X11/StringDefs.h>
 #include "windows.h"
 #include "sysmetrics.h"
 #include "menu.h"
 #include "heap.h"
 #include "win.h"
-#include "bitmaps/check_bitmap"
-#include "bitmaps/nocheck_bitmap"
 
 #define SC_ABOUTWINE     SC_SCREENSAVE+1
 #define SC_SYSMENU	 SC_SCREENSAVE+2
@@ -27,22 +24,17 @@
 HBITMAP hStdCheck = 0;
 HBITMAP hStdMnArrow = 0;
 
-static LPMENUBAR firstMenu = NULL;
-static MENUITEM *parentItem;
-static MENUITEM *siblingItem;
-static int       lastLevel;
-static int       menuId = 0;
-static Pixmap    checkBitmap = XtUnspecifiedPixmap;
-static Pixmap    nocheckBitmap = XtUnspecifiedPixmap;
-
 LPPOPUPMENU PopupMenuGetStorageHeader(HWND hwnd);
 LPPOPUPMENU PopupMenuGetWindowAndStorage(HWND hwnd, WND **wndPtr);
-void StdDrawMenuBar(HWND hwnd);
+void StdDrawMenuBar(HDC hDC, LPRECT lprect, LPPOPUPMENU lppop);
+void MenuButtonDown(HWND hWnd, LPPOPUPMENU lppop, int x, int y);
+void MenuButtonUp(HWND hWnd, LPPOPUPMENU lppop, int x, int y);
+void MenuMouseMove(HWND hWnd, LPPOPUPMENU lppop, WORD wParam, int x, int y);
 void StdDrawPopupMenu(HWND hwnd);
-LPMENUITEM MenuFindItem(HWND hwnd, int x, int y, WORD *lpRet);
-LPMENUITEM MenuFindItemBySelKey(HWND hwnd, WORD key, WORD *lpRet);
+LPMENUITEM MenuFindItem(LPPOPUPMENU lppop, int x, int y, WORD *lpRet);
+LPMENUITEM MenuFindItemBySelKey(LPPOPUPMENU lppop, WORD key, WORD *lpRet);
 void PopupMenuCalcSize(HWND hwnd);
-void MenuBarCalcSize(HWND hwnd);
+void MenuBarCalcSize(HDC hDC, LPRECT lprect, LPPOPUPMENU lppop);
 LPMENUITEM GetMenuItemPtr(LPPOPUPMENU menu, WORD nPos);
 WORD GetSelectionKey(LPSTR str);
 LPSTR GetShortCutString(LPSTR str);
@@ -68,6 +60,7 @@
     HMENU	hSubMenu;
     RECT	rect;
     HDC		hDC;
+    PAINTSTRUCT ps;
     switch(message) 
     {
     case WM_CREATE:
@@ -82,20 +75,6 @@
 #ifdef DEBUG_MENU
         printf("PopupMenu WM_CREATE lppop=%08X !\n", lppop);
 #endif
-/*
-	if (lppop->BarFlags == 0) {
-	    PopupMenuCalcSize(hwnd);
-	    printf("PopupMenu WM_CREATE Width=%d Height=%d !\n", 
-			lppop->Width, lppop->Height);
-	    SetWindowPos(hwnd, 0, 0, 0, lppop->Width + 2, lppop->Height, 
-		SWP_NOZORDER | SWP_NOMOVE);
-	    }
-	else {
-	    MenuBarCalcSize(hwnd);
-	    SetWindowPos(hwnd, 0, 0, -16, lppop->Width, lppop->Height, 
-		SWP_NOZORDER);
-	    }
-*/
 	if (hStdCheck == (HBITMAP)NULL) 
 	    hStdCheck = LoadBitmap((HANDLE)NULL, (LPSTR)OBM_CHECK);
 	if (hStdMnArrow == (HBITMAP)NULL) 
@@ -129,15 +108,18 @@
 		SendMessage(lppop->ownerWnd, WM_SYSCOMMAND, wParam, lParam);
 		}
 	    }
-	if (lppop->BarFlags == 0) ShowWindow(hwnd, SW_HIDE);
+	if (lppop->BarFlags == 0)  ShowWindow(hwnd, SW_HIDE);
     	break;
     case WM_SHOWWINDOW:
 	lppop = PopupMenuGetWindowAndStorage(hwnd, &wndPtr);
-    	if (wParam == 0) {
+    	if (wParam == 0 && lParam == 0L) {
 	    HideAllSubPopupMenu(lppop);
 #ifdef DEBUG_MENU
-    	printf("PopupMenu WM_SHOWWINDOW -> HIDE!\n");
+	    printf("PopupMenu WM_SHOWWINDOW -> HIDE!\n");
 #endif
+/*
+	    UpdateWindow(lppop->ownerWnd);
+*/
 	    break;
 	    }
 	lppop->FocusedItem = (WORD)-1;
@@ -150,167 +132,20 @@
 	    SetWindowPos(hwnd, 0, 0, 0, lppop->Width + 2, lppop->Height, 
 		SWP_NOZORDER | SWP_NOMOVE);
 	    }
-	else {
-	    MenuBarCalcSize(hwnd);
-#ifdef DEBUG_MENU
-	    printf("MenuBarMenu WM_SHOWWINDOW Width=%d Height=%d !\n", 
-			lppop->Width, lppop->Height);
-#endif
-	    SetWindowPos(hwnd, 0, 0, -16, lppop->Width, lppop->Height, 
-		SWP_NOZORDER);
-	    }
     	break;
     case WM_LBUTTONDOWN:
 	lppop = PopupMenuGetWindowAndStorage(hwnd, &wndPtr);
 	SetCapture(hwnd);
-	lpitem = MenuFindItem(hwnd, LOWORD(lParam), HIWORD(lParam), &wRet);
-#ifdef DEBUG_MENU
-	printf("PopupMenu WM_LBUTTONDOWN wRet=%d lpitem=%08X !\n", wRet, lpitem);
-#endif
-	if (lpitem != NULL) {
-	    if (lppop->FocusedItem != (WORD)-1) {
-		HideAllSubPopupMenu(lppop);
-		lpitem2 = GetMenuItemPtr(lppop, lppop->FocusedItem);
-		if (((lpitem2->item_flags & MF_SEPARATOR) != MF_SEPARATOR) &&
-		    ((lpitem2->item_flags & MF_MENUBREAK) != MF_MENUBREAK)) {
-	            hDC = GetDC(hwnd);
-	            InvertRect(hDC, &lpitem2->rect);
-		    ReleaseDC(hwnd, hDC);
-		    }
-		}
-	    lppop->FocusedItem = wRet;
-	    if (((lpitem->item_flags & MF_SEPARATOR) != MF_SEPARATOR) &&
-		((lpitem->item_flags & MF_MENUBREAK) != MF_MENUBREAK)) {
-	        hDC = GetDC(hwnd);
-	        InvertRect(hDC, &lpitem->rect);
-		ReleaseDC(hwnd, hDC);
-		}
-	    if ((lpitem->item_flags & MF_POPUP) == MF_POPUP) {
-		hSubMenu = (HMENU)lpitem->item_id;
-		lppop2 = (LPPOPUPMENU) GlobalLock(hSubMenu);
-		if (lppop2 == NULL) break;
-		lppop2->hWndParent = hwnd;
-		GetClientRect(hwnd, &rect);
-		if (lppop->BarFlags != 0) {
-		    y = rect.bottom - rect.top;
-		    GetWindowRect(hwnd, &rect);
-		    y += rect.top;
-		    TrackPopupMenu(hSubMenu, TPM_LEFTBUTTON, 
-			rect.left + lpitem->rect.left, 
-			y, 0, lppop->ownerWnd, (LPRECT)NULL);
-		    }
-		else {
-		    x = rect.right;
-		    GetWindowRect(hwnd, &rect);
-		    x += rect.left;
-		    TrackPopupMenu(hSubMenu, TPM_LEFTBUTTON, 
-			x, rect.top + lpitem->rect.top,
-			0, lppop->ownerWnd, (LPRECT)NULL);
-		    }
-		break;
-		}
-	    }
+	MenuButtonDown(hwnd, lppop, LOWORD(lParam), HIWORD(lParam));
 	break;
     case WM_LBUTTONUP:
 	lppop = PopupMenuGetStorageHeader(hwnd);
 	ReleaseCapture();
-	lpitem = MenuFindItem(hwnd, LOWORD(lParam), HIWORD(lParam), &wRet);
-#ifdef DEBUG_MENU
-	printf("PopupMenu WM_LBUTTONUP wRet=%d lpitem=%08X !\n", wRet, lpitem);
-#endif
-	if (lpitem != NULL) {
-	    if ((lpitem->item_flags & MF_POPUP) == MF_POPUP) {
-		break;
-		}
-	    if (((lpitem->item_flags & MF_SEPARATOR) != MF_SEPARATOR) &&
-		((lpitem->item_flags & MF_POPUP) != MF_POPUP)) {
-	    	ShowWindow(lppop->hWnd, SW_HIDE);
-		if (lppop->hWndParent != (HWND)NULL) {
-		    SendMessage(lppop->hWndParent, WM_COMMAND, 
-					lpitem->item_id, 0L);
-#ifdef DEBUG_MENU
-		    printf("PopupMenu // WM_COMMAND to ParentMenu wParam=%d !\n", 
-			lpitem->item_id);
-#endif
-		    }
-		else {
-		    if (lppop->SysFlag == 0) {
-#ifdef DEBUG_MENU
-			printf("PopupMenu // WM_COMMAND wParam=%d !\n", 
-				lpitem->item_id);
-#endif
-			SendMessage(lppop->ownerWnd, WM_COMMAND, 
-					lpitem->item_id, 0L);
-			}
-		    else {
-			if (lpitem->item_id == SC_ABOUTWINE) {
-			    printf("SysMenu // Show 'About Wine ...' !\n");
-/*			    DialogBox(hSysRes, MAKEINTRESOURCE(SC_ABOUTWINEDLG), */
-			    DialogBox(hSysRes, MAKEINTRESOURCE(2), 
-				GetParent(hwnd), (FARPROC)AboutWine_Proc);
-			    }
-			else {
-			    SendMessage(lppop->ownerWnd, WM_SYSCOMMAND,
-						 lpitem->item_id, 0L);
-#ifdef DEBUG_SYSMENU
-			    printf("PopupMenu // WM_SYSCOMMAND wParam=%04X !\n", 
-					lpitem->item_id);
-#endif
-			    }
-			}
-		    }
-#ifdef DEBUG_MENU
-		printf("PopupMenu // SendMessage WM_COMMAND wParam=%d !\n", 
-			lpitem->item_id);
-#endif
-	    	break;
-		}
-	    }
-	if (lppop->FocusedItem != (WORD)-1) {
-	    HideAllSubPopupMenu(lppop);
-	    lpitem2 = GetMenuItemPtr(lppop, lppop->FocusedItem);
-	    if (((lpitem2->item_flags & MF_SEPARATOR) != MF_SEPARATOR) &&
-		((lpitem2->item_flags & MF_MENUBREAK) != MF_MENUBREAK)) {
-	        hDC = GetDC(hwnd);
-	        InvertRect(hDC, &lpitem2->rect);
-		ReleaseDC(hwnd, hDC);
-		}
-	    }
+	MenuButtonUp(hwnd, lppop, LOWORD(lParam), HIWORD(lParam));
 	break;
     case WM_MOUSEMOVE:
-        if ((wParam & MK_LBUTTON) != 0) {
-	    lppop = PopupMenuGetStorageHeader(hwnd);
-	    lpitem = MenuFindItem(hwnd, LOWORD(lParam), HIWORD(lParam), &wRet);
-	    if ((lpitem != NULL) && (lppop->FocusedItem != wRet)) {
-		lpitem2 = GetMenuItemPtr(lppop, lppop->FocusedItem);
-		hDC = GetDC(hwnd);
-		if (((lpitem2->item_flags & MF_POPUP) == MF_POPUP) ||
-		    ((lpitem2->item_flags & MF_STRING) == MF_STRING)) {
-		    InvertRect(hDC, &lpitem2->rect);
-		    }
-		if ((lpitem2->item_flags & MF_POPUP) == MF_POPUP) {
-		    HideAllSubPopupMenu(lppop);
-		    }
-		lppop->FocusedItem = wRet;
-		if (((lpitem->item_flags & MF_POPUP) == MF_POPUP) ||
-		    ((lpitem->item_flags & MF_STRING) == MF_STRING)) {
-		    InvertRect(hDC, &lpitem->rect);
-		    }
-		if ((lpitem->item_flags & MF_POPUP) == MF_POPUP) {
-		    hSubMenu = (HMENU)lpitem->item_id;
-		    lppop2 = (LPPOPUPMENU) GlobalLock(hSubMenu);
-		    if (lppop2 == NULL) break;
-		    if (lppop->BarFlags != 0) {
-			lppop2->hWndParent = hwnd;
-			GetWindowRect(hwnd, &rect);
-			TrackPopupMenu(hSubMenu, TPM_LEFTBUTTON, 
-				lpitem->rect.left, rect.top, 
-				0, lppop->ownerWnd, (LPRECT)NULL);
-			}
-		    }
-		ReleaseDC(hwnd, hDC);
-		}
-            }
+	lppop = PopupMenuGetStorageHeader(hwnd);
+	MenuMouseMove(hwnd, lppop, wParam, LOWORD(lParam), HIWORD(lParam));
 	break;
 
     case WM_KEYDOWN:
@@ -441,6 +276,7 @@
 				x, lpitem->rect.top,
 				0, lppop->ownerWnd, (LPRECT)NULL);
 			}
+		    GlobalUnlock(hSubMenu);
 		    break;
 		    }
 		if (((lpitem->item_flags & MF_SEPARATOR) != MF_SEPARATOR) &&
@@ -482,7 +318,7 @@
 		}
 	    }
 	if (wParam >= 'a' && wParam <= 'z') wParam -= 'a' - 'A';
-	lpitem = MenuFindItemBySelKey(hwnd, wParam, &wRet);
+	lpitem = MenuFindItemBySelKey(lppop, wParam, &wRet);
 	if (lpitem != NULL) {
 	    printf("Found  wRet=%d !\n", wRet);
 	    if (lppop->FocusedItem != (WORD)-1) {
@@ -502,13 +338,7 @@
 	break;
     case WM_PAINT:
 	lppop = PopupMenuGetWindowAndStorage(hwnd, &wndPtr);
-	if (lppop->BarFlags != 0) {
-	    MenuBarCalcSize(hwnd);
-	    printf("PopupMenu WM_PAINT Width=%d Height=%d !\n", 
-			lppop->Width, lppop->Height);
-	    StdDrawMenuBar(hwnd);
-	    }
-	else{
+	if (lppop->BarFlags == 0) {
 	    PopupMenuCalcSize(hwnd);
 	    StdDrawPopupMenu(hwnd);
 	    }
@@ -520,6 +350,192 @@
 }
 
 
+void MenuButtonDown(HWND hWnd, LPPOPUPMENU lppop, int x, int y)
+{
+    HDC		hDC;
+    LPMENUITEM	lpitem, lpitem2;
+    RECT	rect;
+    HMENU	hSubMenu;
+    WORD	wRet;
+    LPPOPUPMENU lppop2;
+    lpitem = MenuFindItem(lppop, x, y, &wRet);
+#ifdef DEBUG_MENU
+    printf("MenuButtonDown // x=%d y=%d // wRet=%d lpitem=%08X !\n", 
+					x, y, wRet, lpitem);
+#endif
+    if (lpitem != NULL) {
+	if (lppop->FocusedItem != (WORD)-1) {
+	    HideAllSubPopupMenu(lppop);
+	    lpitem2 = GetMenuItemPtr(lppop, lppop->FocusedItem);
+	    if (((lpitem2->item_flags & MF_SEPARATOR) != MF_SEPARATOR) &&
+		((lpitem2->item_flags & MF_MENUBREAK) != MF_MENUBREAK)) {
+	        hDC = GetWindowDC(hWnd);
+	        InvertRect(hDC, &lpitem2->rect);
+		ReleaseDC(hWnd, hDC);
+		}
+	    }
+	lppop->FocusedItem = wRet;
+	if (((lpitem->item_flags & MF_SEPARATOR) != MF_SEPARATOR) &&
+	    ((lpitem->item_flags & MF_MENUBREAK) != MF_MENUBREAK)) {
+	    hDC = GetWindowDC(hWnd);
+	    InvertRect(hDC, &lpitem->rect);
+	    ReleaseDC(hWnd, hDC);
+	    }
+	if ((lpitem->item_flags & MF_POPUP) == MF_POPUP) {
+	    hSubMenu = (HMENU)lpitem->item_id;
+	    lppop2 = (LPPOPUPMENU) GlobalLock(hSubMenu);
+	    if (lppop2 == NULL) return;
+	    lppop2->hWndParent = hWnd;
+	    if (lppop->BarFlags != 0) {
+		GetWindowRect(hWnd, &rect);
+/*		y = rect.top + lppop->Height; */
+		y = rect.top + lppop->rect.bottom;
+		TrackPopupMenu(hSubMenu, TPM_LEFTBUTTON, 
+			rect.left + lpitem->rect.left, 
+			y, 0, lppop->ownerWnd, (LPRECT)NULL);
+		}
+	    else {
+		x = lppop->rect.right;
+		GetWindowRect(hWnd, &rect);
+		x += rect.left;
+		TrackPopupMenu(hSubMenu, TPM_LEFTBUTTON, 
+			x, rect.top + lpitem->rect.top,
+			0, lppop->ownerWnd, (LPRECT)NULL);
+		}
+	    GlobalUnlock(hSubMenu);
+	    }
+	}
+}
+
+
+
+void MenuButtonUp(HWND hWnd, LPPOPUPMENU lppop, int x, int y)
+{
+    HDC		hDC;
+    LPMENUITEM	lpitem, lpitem2;
+    RECT	rect;
+    HMENU	hSubMenu;
+    WORD	wRet;
+    LPPOPUPMENU lppop2;
+    lpitem = MenuFindItem(lppop, x, y, &wRet);
+#ifdef DEBUG_MENU
+    printf("MenuButtonUp // x=%d y=%d // wRet=%d lpitem=%08X !\n", 
+					x, y, wRet, lpitem);
+#endif
+    if (lpitem != NULL) {
+	if ((lpitem->item_flags & MF_POPUP) == MF_POPUP) {
+	    return;
+	    }
+	if (((lpitem->item_flags & MF_SEPARATOR) != MF_SEPARATOR) &&
+	    ((lpitem->item_flags & MF_POPUP) != MF_POPUP)) {
+	    ShowWindow(lppop->hWnd, SW_HIDE);
+	    if (lppop->hWndParent != (HWND)NULL) {
+		SendMessage(lppop->hWndParent, WM_COMMAND, 
+				lpitem->item_id, 0L);
+#ifdef DEBUG_MENU
+		printf("MenuButtonUp // WM_COMMAND to ParentMenu wParam=%d !\n", 
+			lpitem->item_id);
+#endif
+		}
+	    else {
+		if (lppop->SysFlag == 0) {
+#ifdef DEBUG_MENU
+		    printf("PopupMenu // WM_COMMAND wParam=%d !\n", 
+				lpitem->item_id);
+#endif
+		    SendMessage(lppop->ownerWnd, WM_COMMAND, 
+					lpitem->item_id, 0L);
+		    }
+		else {
+		    if (lpitem->item_id == SC_ABOUTWINE) {
+			printf("SysMenu // Show 'About Wine ...' !\n");
+/*			DialogBox(hSysRes, MAKEINTRESOURCE(SC_ABOUTWINEDLG), */
+			DialogBox(hSysRes, MAKEINTRESOURCE(2), 
+				GetParent(hWnd), (FARPROC)AboutWine_Proc);
+			}
+		    else {
+			SendMessage(lppop->ownerWnd, WM_SYSCOMMAND,
+					 lpitem->item_id, 0L);
+#ifdef DEBUG_SYSMENU
+			printf("MenuButtonUp // WM_SYSCOMMAND wParam=%04X !\n", 
+					lpitem->item_id);
+#endif
+			}
+		    }
+		}
+#ifdef DEBUG_MENU
+	    printf("MenuButtonUp // SendMessage WM_COMMAND wParam=%d !\n", 
+			lpitem->item_id);
+#endif
+	    return;
+	    }
+	}
+    if (lppop->FocusedItem != (WORD)-1) {
+	HideAllSubPopupMenu(lppop); 
+	lpitem2 = GetMenuItemPtr(lppop, lppop->FocusedItem);
+	if (((lpitem2->item_flags & MF_SEPARATOR) != MF_SEPARATOR) &&
+	    ((lpitem2->item_flags & MF_MENUBREAK) != MF_MENUBREAK)) {
+	    hDC = GetWindowDC(hWnd);
+	    InvertRect(hDC, &lpitem2->rect);
+	    ReleaseDC(hWnd, hDC);
+	    }
+	}
+}
+
+
+
+void MenuMouseMove(HWND hWnd, LPPOPUPMENU lppop, WORD wParam, int x, int y)
+{
+    HDC		hDC;
+    LPMENUITEM	lpitem, lpitem2;
+    RECT	rect;
+    HMENU	hSubMenu;
+    WORD	wRet;
+    LPPOPUPMENU lppop2;
+    if ((wParam & MK_LBUTTON) != 0) {
+	lpitem = MenuFindItem(lppop, x, y, &wRet);
+#ifdef DEBUG_MENU
+	printf("MenuMouseMove // x=%d y=%d // wRet=%d lpitem=%08X !\n", 
+					x, y, wRet, lpitem);
+#endif
+	if ((lpitem != NULL) && (lppop->FocusedItem != wRet)) {
+	    lpitem2 = GetMenuItemPtr(lppop, lppop->FocusedItem);
+	    hDC = GetWindowDC(hWnd);
+	    if (((lpitem2->item_flags & MF_POPUP) == MF_POPUP) ||
+		((lpitem2->item_flags & MF_STRING) == MF_STRING)) {
+		InvertRect(hDC, &lpitem2->rect);
+		}
+	    if ((lpitem2->item_flags & MF_POPUP) == MF_POPUP) {
+		HideAllSubPopupMenu(lppop);
+		}
+	    lppop->FocusedItem = wRet;
+	    if (((lpitem->item_flags & MF_POPUP) == MF_POPUP) ||
+		((lpitem->item_flags & MF_STRING) == MF_STRING)) {
+		InvertRect(hDC, &lpitem->rect);
+		}
+	    if ((lpitem->item_flags & MF_POPUP) == MF_POPUP) {
+		hSubMenu = (HMENU)lpitem->item_id;
+		lppop2 = (LPPOPUPMENU) GlobalLock(hSubMenu);
+		if (lppop2 == NULL) {
+		    ReleaseDC(hWnd, hDC);
+		    return;
+		    }
+		if (lppop->BarFlags != 0) {
+		    lppop2->hWndParent = hWnd;
+		    GetWindowRect(hWnd, &rect);
+		    rect.top += lppop->rect.bottom;
+		    TrackPopupMenu(hSubMenu, TPM_LEFTBUTTON, 
+				rect.left + lpitem->rect.left, rect.top, 
+				0, lppop->ownerWnd, (LPRECT)NULL);
+		    }
+		GlobalUnlock(hSubMenu);
+		}
+	    ReleaseDC(hWnd, hDC);
+	    }
+	}
+}
+
+
 
 LPPOPUPMENU PopupMenuGetWindowAndStorage(HWND hwnd, WND **wndPtr)
 {
@@ -554,6 +570,7 @@
     LPPOPUPMENU lppop;
     lppop = (LPPOPUPMENU)GlobalLock(hMenu);
     lppop->hWndParent = hWnd;
+    GlobalUnlock(hMenu);
 }
 
 
@@ -589,16 +606,40 @@
     lpitem = lppop->firstItem;
     if (lpitem == NULL) goto EndOfPaint;
     for(i = 0; i < lppop->nItems; i++) {
+	CopyRect(&rect2, &lpitem->rect);
 	if ((lpitem->item_flags & MF_SEPARATOR) == MF_SEPARATOR) {
-	    CopyRect(&rect2, &lpitem->rect);
     	    hOldPen = SelectObject(hDC, GetStockObject(BLACK_PEN));
 	    MoveTo(hDC, rect2.left, rect2.top + 1);
 	    LineTo(hDC, rect2.right, rect2.top + 1);
 	    SelectObject(hDC, hOldPen);
 	    }
+	if ((lpitem->item_flags & MF_CHECKED) == MF_CHECKED) {
+	    hMemDC = CreateCompatibleDC(hDC);
+	    if (lpitem->hCheckBit == 0) {
+		SelectObject(hMemDC, hStdCheck);
+		GetObject(hStdCheck, sizeof(BITMAP), (LPSTR)&bm);
+		}
+	    else {
+		SelectObject(hMemDC, lpitem->hCheckBit);
+		GetObject(lpitem->hCheckBit, sizeof(BITMAP), (LPSTR)&bm);
+		}
+	    BitBlt(hDC, rect2.left, rect2.top + 1,
+		bm.bmWidth, bm.bmHeight, hMemDC, 0, 0, SRCCOPY);
+	    DeleteDC(hMemDC);
+	    }
+	else {
+	    if (lpitem->hUnCheckBit != 0) {
+		hMemDC = CreateCompatibleDC(hDC);
+		SelectObject(hMemDC, lpitem->hUnCheckBit);
+		GetObject(lpitem->hUnCheckBit, sizeof(BITMAP), (LPSTR)&bm);
+		BitBlt(hDC, rect2.left, rect2.top + 1,
+			bm.bmWidth, bm.bmHeight, hMemDC, 0, 0, SRCCOPY);
+		DeleteDC(hMemDC);
+		}
+	    }
 	if ((lpitem->item_flags & MF_BITMAP) == MF_BITMAP) {
 	    hBitMap = (HBITMAP)LOWORD((LONG)lpitem->item_text);
-	    CopyRect(&rect2, &lpitem->rect);
+	    rect2.left += lppop->CheckWidth;
 	    hMemDC = CreateCompatibleDC(hDC);
 	    SelectObject(hMemDC, hBitMap);
 	    GetObject(hBitMap, sizeof(BITMAP), (LPSTR)&bm);
@@ -616,6 +657,7 @@
 		OldTextColor = SetTextColor(hDC, 0x00000000L);
 	    CopyRect(&rect3, &lpitem->rect);
 	    InflateRect(&rect3, 0, -2);
+	    rect3.left += lppop->CheckWidth;
 	    if ((x = GetShortCutPos(lpitem->item_text)) != (WORD)-1) {
 		DrawText(hDC, lpitem->item_text, x, &rect3, 
 		    DT_LEFT | DT_VCENTER | DT_SINGLELINE);
@@ -629,31 +671,13 @@
 	    SelectObject(hDC, hOldFont);
 	    CopyRect(&rect2, &lpitem->rect);
 	    }
-	if ((lpitem->item_flags & MF_CHECKED) == MF_CHECKED) {
-	    CopyRect(&rect3, &rect2);
-	    rect3.left = rect3.right - rect3.bottom + rect3.top;
-	    hMemDC = CreateCompatibleDC(hDC);
-	    if (lpitem->hCheckBit == 0)
-		SelectObject(hMemDC, hStdCheck);
-	    else
-		SelectObject(hMemDC, lpitem->hCheckBit);
-	    GetObject(hStdCheck, sizeof(BITMAP), (LPSTR)&bm);
-	    BitBlt(hDC, rect3.left, rect3.top,
-		bm.bmWidth, bm.bmHeight, hMemDC, 0, 0, SRCCOPY);
-	    DeleteDC(hMemDC);
-	    printf("StdDrawPopupMenu // MF_CHECKED hStdCheck=%04X !\n", hStdCheck);
-	    }
-	else {
-	    if (lpitem->hUnCheckBit != 0)
-		SelectObject(hMemDC, lpitem->hUnCheckBit);
-	    }
 	if ((lpitem->item_flags & MF_POPUP) == MF_POPUP) {
-	    CopyRect(&rect3, &rect2);
-	    rect3.left = rect3.right - rect3.bottom + rect3.top;
+	    CopyRect(&rect3, &lpitem->rect);
+	    rect3.left = rect3.right - lppop->PopWidth;
 	    hMemDC = CreateCompatibleDC(hDC);
 	    SelectObject(hMemDC, hStdMnArrow);
 	    GetObject(hStdMnArrow, sizeof(BITMAP), (LPSTR)&bm);
-	    BitBlt(hDC, rect3.left, rect3.top,
+	    BitBlt(hDC, rect3.left, rect3.top + 1,
 		bm.bmWidth, bm.bmHeight, hMemDC, 0, 0, SRCCOPY);
 	    DeleteDC(hMemDC);
 	    }
@@ -666,40 +690,59 @@
 
 
 
-void StdDrawMenuBar(HWND hwnd)
+void StdDrawMenuBar(HDC hDC, LPRECT lprect, LPPOPUPMENU lppop)
 {
-    WND 	*wndPtr;
-    LPPOPUPMENU lppop;
     LPMENUITEM 	lpitem;
-    PAINTSTRUCT ps;
     HBRUSH 	hBrush;
     HPEN	hOldPen;
-    HWND	hWndParent;
-    HDC 	hDC, hMemDC;
+    HDC 	hMemDC;
     RECT 	rect, rect2, rect3;
     HFONT	hOldFont;
+    DWORD	OldTextColor;
     HBITMAP	hBitMap;
     BITMAP	bm;
     UINT  	i, textwidth;
-    hDC = BeginPaint( hwnd, &ps );
-    if (!IsWindowVisible(hwnd)) {
-	EndPaint( hwnd, &ps );
-	return;
-	}
+    if (lppop == NULL || lprect == NULL) return;
+#ifdef DEBUG_MENU
+    printf("StdDrawMenuBar(%04X, %08X, %08X); !\n", hDC, lprect, lppop);
+#endif
+    MenuBarCalcSize(hDC, lprect, lppop);
     hOldFont = SelectObject(hDC, GetStockObject(SYSTEM_FONT));
-    lppop = PopupMenuGetWindowAndStorage(hwnd, &wndPtr);
-    if (lppop == NULL) goto EndOfPaint;
     hBrush = GetStockObject(WHITE_BRUSH);
-    GetClientRect(hwnd, &rect);
+    CopyRect(&rect, lprect);
     FillRect(hDC, &rect, hBrush);
     FrameRect(hDC, &rect, GetStockObject(BLACK_BRUSH));
     if (lppop->nItems == 0) goto EndOfPaint;
     lpitem = lppop->firstItem;
     if (lpitem == NULL) goto EndOfPaint;
     for(i = 0; i < lppop->nItems; i++) {
+	CopyRect(&rect2, &lpitem->rect);
+	if ((lpitem->item_flags & MF_CHECKED) == MF_CHECKED) {
+	    hMemDC = CreateCompatibleDC(hDC);
+	    if (lpitem->hCheckBit == 0) {
+		SelectObject(hMemDC, hStdCheck);
+		GetObject(hStdCheck, sizeof(BITMAP), (LPSTR)&bm);
+		}
+	    else {
+		SelectObject(hMemDC, lpitem->hCheckBit);
+		GetObject(lpitem->hCheckBit, sizeof(BITMAP), (LPSTR)&bm);
+		}
+	    BitBlt(hDC, rect2.left, rect2.top + 1,
+		bm.bmWidth, bm.bmHeight, hMemDC, 0, 0, SRCCOPY);
+	    DeleteDC(hMemDC);
+	    }
+	else {
+	    if (lpitem->hUnCheckBit != 0) {
+		hMemDC = CreateCompatibleDC(hDC);
+		SelectObject(hMemDC, lpitem->hUnCheckBit);
+		GetObject(lpitem->hUnCheckBit, sizeof(BITMAP), (LPSTR)&bm);
+		BitBlt(hDC, rect2.left, rect2.top + 1,
+			bm.bmWidth, bm.bmHeight, hMemDC, 0, 0, SRCCOPY);
+		DeleteDC(hMemDC);
+		}
+	    }
 	if ((lpitem->item_flags & MF_BITMAP) == MF_BITMAP) {
 	    hBitMap = (HBITMAP)LOWORD((LONG)lpitem->item_text);
-	    CopyRect(&rect2, &lpitem->rect);
 	    hMemDC = CreateCompatibleDC(hDC);
 	    SelectObject(hMemDC, hBitMap);
 	    GetObject(hBitMap, sizeof(BITMAP), (LPSTR)&bm);
@@ -710,37 +753,30 @@
 	if (((lpitem->item_flags & MF_BITMAP) != MF_BITMAP) &&
 	    ((lpitem->item_flags & MF_SEPARATOR) != MF_SEPARATOR) &&
 	    ((lpitem->item_flags & MF_MENUBREAK) != MF_MENUBREAK)) {
-	    CopyRect(&rect2, &lpitem->rect);
+	    hOldFont = SelectObject(hDC, GetStockObject(SYSTEM_FONT));
+	    if ((lpitem->item_flags & MF_DISABLED) == MF_DISABLED)
+		OldTextColor = SetTextColor(hDC, 0x00C0C0C0L);
+	    else
+		OldTextColor = SetTextColor(hDC, 0x00000000L);
 	    DrawText(hDC, lpitem->item_text, -1, &rect2, 
 	    	DT_LEFT | DT_VCENTER | DT_SINGLELINE);
-	    }
-	if ((lpitem->item_flags & MF_CHECKED) == MF_CHECKED) {
-	    CopyRect(&rect3, &rect2);
-	    rect3.left = rect3.right - rect3.bottom + rect3.top;
-	    hMemDC = CreateCompatibleDC(hDC);
-	    SelectObject(hMemDC, hStdCheck);
-	    GetObject(hBitMap, sizeof(BITMAP), (LPSTR)&bm);
-	    BitBlt(hDC, rect3.left, rect3.top,
-		bm.bmWidth, bm.bmHeight, hMemDC, 0, 0, SRCCOPY);
-	    DeleteDC(hMemDC);
+	    SetTextColor(hDC, OldTextColor);
+	    SelectObject(hDC, hOldFont);
 	    }
 	if (lpitem->next == NULL) goto EndOfPaint;
 	lpitem = (LPMENUITEM)lpitem->next;
     }
 EndOfPaint:
     SelectObject(hDC, hOldFont);
-    EndPaint( hwnd, &ps );
-}
+} 
 
 
 
-LPMENUITEM MenuFindItem(HWND hwnd, int x, int y, WORD *lpRet)
+LPMENUITEM MenuFindItem(LPPOPUPMENU lppop, int x, int y, WORD *lpRet)
 {
-    WND 	*wndPtr;
-    LPPOPUPMENU lppop;
     LPMENUITEM 	lpitem;
     UINT  	i;
-    lppop = PopupMenuGetWindowAndStorage(hwnd, &wndPtr);
+    if (lpRet != NULL) *lpRet = 0;
     if (lppop == NULL) return NULL;
     if (lppop->nItems == 0) return NULL;
     lpitem = lppop->firstItem;
@@ -762,13 +798,10 @@
 }
 
 
-LPMENUITEM MenuFindItemBySelKey(HWND hwnd, WORD key, WORD *lpRet)
+LPMENUITEM MenuFindItemBySelKey(LPPOPUPMENU lppop, WORD key, WORD *lpRet)
 {
-    WND 	*wndPtr;
-    LPPOPUPMENU lppop;
     LPMENUITEM 	lpitem;
     UINT  	i;
-    lppop = PopupMenuGetWindowAndStorage(hwnd, &wndPtr);
     if (lppop == NULL) return NULL;
     if (lppop->nItems == 0) return NULL;
     lpitem = lppop->firstItem;
@@ -808,6 +841,7 @@
     if (lppop->nItems == 0) return;
     hDC = GetDC(hwnd);
     lppop->Width = 20;
+    lppop->CheckWidth = lppop->PopWidth = 0;
     hOldFont = SelectObject(hDC, GetStockObject(SYSTEM_FONT));
 CalcAGAIN:
     OldWidth = lppop->Width;
@@ -819,6 +853,23 @@
 	printf("PopupMenuCalcSize item #%d !\n", i);
 #endif
 	rect.right = rect.left + lppop->Width;
+	if ((lpitem->item_flags & MF_CHECKED) == MF_CHECKED) {
+	    if (lpitem->hCheckBit != 0)
+		GetObject(lpitem->hCheckBit, sizeof(BITMAP), (LPSTR)&bm);
+	    else
+		GetObject(hStdCheck, sizeof(BITMAP), (LPSTR)&bm);
+	    lppop->CheckWidth = max(lppop->CheckWidth, bm.bmWidth);
+	    }
+	else {
+	    if (lpitem->hUnCheckBit != 0) {
+		GetObject(lpitem->hUnCheckBit, sizeof(BITMAP), (LPSTR)&bm);
+		lppop->CheckWidth = max(lppop->CheckWidth, bm.bmWidth);
+		}
+	    }
+	if ((lpitem->item_flags & MF_POPUP) == MF_POPUP) {
+	    GetObject(hStdMnArrow, sizeof(BITMAP), (LPSTR)&bm);
+	    lppop->PopWidth = max(lppop->PopWidth, bm.bmWidth);
+	    }
 	if ((lpitem->item_flags & MF_SEPARATOR) == MF_SEPARATOR) {
 	    rect.bottom = rect.top + 3;
 	    }
@@ -838,6 +889,8 @@
 	    TempWidth = LOWORD(dwRet);
 	    if (GetShortCutPos(lpitem->item_text) != (WORD)-1)
 	        TempWidth += 15;
+	    TempWidth += lppop->CheckWidth;
+	    TempWidth += lppop->PopWidth;
 	    lppop->Width = max(lppop->Width, TempWidth);
 	    }
 	CopyRect(&lpitem->rect, &rect);
@@ -846,6 +899,7 @@
 	}
     if (OldWidth < lppop->Width) goto CalcAGAIN;
     lppop->Height = rect.bottom;
+    SetRect(&lppop->rect, 1, 1, lppop->Width, lppop->Height);
 #ifdef DEBUG_MENUCALC
     printf("PopupMenuCalcSize w=%d h=%d !\n", lppop->Width, lppop->Height);
 #endif
@@ -855,31 +909,33 @@
 
 
 
-void MenuBarCalcSize(HWND hwnd)
+void MenuBarCalcSize(HDC hDC, LPRECT lprect, LPPOPUPMENU lppop)
 {
-    WND 	*wndPtr;
-    LPPOPUPMENU lppop;
     LPMENUITEM 	lpitem;
-    HDC		hDC;
     RECT 	rect;
     HBITMAP	hBitMap;
     BITMAP	bm;
     HFONT	hOldFont;
     UINT  	i, OldHeight;
     DWORD	dwRet;
-    lppop = PopupMenuGetWindowAndStorage(hwnd, &wndPtr);
     if (lppop == NULL) return;
     if (lppop->nItems == 0) return;
-    hDC = GetDC(hwnd);
+#ifdef DEBUG_MENUCALC
+    printf("MenuBarCalcSize left=%d top=%d right=%d bottom=%d !\n", 
+    	lprect->left, lprect->top, lprect->right, lprect->bottom);
+#endif
     hOldFont = SelectObject(hDC, GetStockObject(SYSTEM_FONT));
-    lppop->Height = 10;
+    lppop->Height = lprect->bottom - lprect->top;
 CalcAGAIN:
     OldHeight = lppop->Height;
-    SetRect(&rect, 1, 1, 0, OldHeight);
+    SetRect(&rect, lprect->left, lprect->top, 0, lprect->top + OldHeight);
     lpitem = lppop->firstItem;
     for(i = 0; i < lppop->nItems; i++) {
 	if (lpitem == NULL) break;
-	rect.bottom = rect.top + lppop->Height;
+	rect.bottom = lprect->top + lppop->Height;
+	if (rect.right > lprect->right) 
+	    SetRect(&rect, lprect->left, rect.bottom, 
+		0, rect.bottom + SYSMETRICS_CYMENU);
 	if ((lpitem->item_flags & MF_BITMAP) == MF_BITMAP) {
 	    hBitMap = (HBITMAP)LOWORD((LONG)lpitem->item_text);
 	    GetObject(hBitMap, sizeof(BITMAP), (LPSTR)&bm);
@@ -900,12 +956,13 @@
 	}
     if (OldHeight < lppop->Height) goto CalcAGAIN;
     lppop->Width = rect.right;
+    lprect->bottom =  lprect->top + lppop->Height;
+    CopyRect(&lppop->rect, lprect);
 #ifdef DEBUG_MENUCALC
     printf("MenuBarCalcSize w=%d h=%d !\n", 
     	lppop->Width, lppop->Height);
 #endif
     SelectObject(hDC, hOldFont);
-    ReleaseDC(hwnd, hDC);
 }
 
 
@@ -956,13 +1013,13 @@
 	if (str[i] == '\t' && str[i + 1] != '\t') 
 	    {
 	    str2 = &str[i + 1];
-#ifdef DEBUG_MENU
+#ifdef DEBUG_MENUSHORTCUT
 	    printf("GetShortCutString // '%s' \n", str2);
 #endif
 	    return str2;
 	    }
 	}
-#ifdef DEBUG_MENU
+#ifdef DEBUG_MENUSHORTCUT
     printf("GetShortCutString NULL \n");
 #endif
     return NULL;
@@ -976,13 +1033,13 @@
     for (i = 0; i < strlen(str); i++) {
 	if (str[i] == '\t' && str[i + 1] != '\t') 
 	    {
-#ifdef DEBUG_MENU
+#ifdef DEBUG_MENUSHORTCUT
 	    printf("GetShortCutPos = %d \n", i);
 #endif
 	    return i;
 	    }
 	}
-#ifdef DEBUG_MENU
+#ifdef DEBUG_MENUSHORTCUT
     printf("GetShortCutString NULL \n");
 #endif
     return -1;
@@ -1007,6 +1064,7 @@
 		    ShowWindow(submenu->hWnd, SW_HIDE);
 		    someClosed = TRUE;
 		    }
+		GlobalUnlock((HMENU)lpitem->item_id);
 	    	}
     	    }
     	lpitem = (LPMENUITEM)lpitem->next;
@@ -1015,553 +1073,31 @@
 }
 
 
-#ifdef USE_XTMENU
+
 
 /**********************************************************************
- *					MENU_CheckWidget
+ *			ChangeMenu		[USER.153]
  */
-void
-MENU_CheckWidget(Widget w, Boolean check)
+BOOL ChangeMenu(HMENU hMenu, WORD nPos, LPSTR lpNewItem, 
+			WORD wItemID, WORD wFlags)
 {
-    if (checkBitmap == XtUnspecifiedPixmap)
-    {
-	Display *display = XtDisplayOfObject(w);
-	    
-	checkBitmap = XCreateBitmapFromData(display,
-					    DefaultRootWindow(display),
-					    check_bitmap_bits,
-					    check_bitmap_width,
-					    check_bitmap_height);
-	nocheckBitmap = XCreateBitmapFromData(display,
-					    DefaultRootWindow(display),
-					    nocheck_bitmap_bits,
-					    nocheck_bitmap_width,
-					    nocheck_bitmap_height);
-    }
-	    
-    if (check)
-	XtVaSetValues(w, XtNleftBitmap, checkBitmap, NULL);
-    else
-	XtVaSetValues(w, XtNleftBitmap, nocheckBitmap, NULL);
-}
-
-/**********************************************************************
- *					MENU_ParseMenu
- */
-WORD *
-MENU_ParseMenu(WORD *first_item, 
-	       int level,
-	       int limit,
-	       int (*action)(WORD *item, int level, void *app_data),
-	       void *app_data)
-{
-    WORD *item;
-    WORD *next_item;
-    int   i;
-
-    level++;
-    next_item = first_item;
-    i = 0;
-    do
-    {
-	i++;
-	item = next_item;
-	(*action)(item, level, app_data);
-	if (*item & MF_POPUP)
-	{
-	    MENU_POPUPITEM *popup_item = (MENU_POPUPITEM *) item;
-
-	    next_item = (WORD *) (popup_item->item_text + 
-				  strlen(popup_item->item_text) + 1);
-	    next_item = MENU_ParseMenu(next_item, level, 0, action, app_data);
+    if (wFlags & MF_APPEND) {
+    	return AppendMenu(hMenu, wFlags, wItemID, lpNewItem);
 	}
-	else
-	{
-	    MENU_NORMALITEM *normal_item = (MENU_NORMALITEM *) item;
-
-	    next_item = (WORD *) (normal_item->item_text + 
-				  strlen(normal_item->item_text) + 1);
+    if (wFlags & MF_DELETE) {
+    	return DeleteMenu(hMenu, wItemID, wFlags);
 	}
-    }
-    while (!(*item & MF_END) && i != limit);
-
-    return next_item;
-}
-
-/**********************************************************************
- *					MENU_FindMenuBar
- */
-LPMENUBAR
-MENU_FindMenuBar(MENUITEM *this_item)
-{
-    MENUITEM *root;
-    LPMENUBAR menu;
-
-    /*
-     * Find root item on menu bar.
-     */
-    for (root = this_item; root->parent != NULL; root = root->parent)
-	;
-    for ( ; root->prev != NULL; root = root->prev)
-	;
-
-    /*
-     * Find menu bar for the root item.
-     */
-    for (menu = firstMenu; 
-	 menu != NULL && menu->firstItem != root; 
-	 menu = menu->next)
-	;
-    
-    return menu;
-}
-
-/**********************************************************************
- *					MENU_SelectionCallback
- */
-static void
-MENU_SelectionCallback(Widget w, XtPointer client_data, XtPointer call_data)
-{
-    MENUITEM *this_item = (MENUITEM *) client_data;
-    LPMENUBAR menu;
-    WND	     *wndPtr;
-
-    if (this_item->menu_w != NULL || (this_item->item_flags & MF_DISABLED))
-	return;
-
-    /*
-     * Find menu bar for the root item.
-     */
-    menu = MENU_FindMenuBar(this_item);
-    if (menu != NULL)
-    {
-	wndPtr = WIN_FindWndPtr(menu->ownerWnd);
-	if (wndPtr == NULL)
-	    return;
-
-#ifdef DEBUG_MENU
-	printf("Selected '%s' (%d).\n", 
-	       this_item->item_text, this_item->item_id);
-#endif
-	
-	CallWindowProc(wndPtr->lpfnWndProc, menu->ownerWnd, WM_COMMAND,
-		       this_item->item_id, 0);
-    }
-}
-
-/**********************************************************************
- *					MENU_CreateItems
- */
-int
-MENU_CreateItems(WORD *item, int level, void *app_data)
-{
-    MENU_POPUPITEM     *popup_item;
-    MENU_NORMALITEM    *normal_item;
-    MENUITEM	       *this_item;
-    Arg			this_args[10];
-    int			n_args = 0;
-    LPMENUBAR           menu = (LPMENUBAR) app_data;
-
-    if (menu->nItems == 0)
-	this_item = menu->firstItem;
-    else
-	this_item = (MENUITEM *) GlobalQuickAlloc(sizeof(MENUITEM));
-
-    if (this_item == NULL)
-	return 0;
-
-    if (level > lastLevel)
-    {
-	parentItem  = siblingItem;
-	siblingItem = NULL;
-    }
-
-    while (level < lastLevel)
-    {
-	siblingItem = parentItem;
-	if (siblingItem != NULL)
-	    parentItem = siblingItem->parent;
-	else
-	    parentItem = NULL;
-
-	lastLevel--;
-    }
-    lastLevel = level;
-    
-    this_item->next = NULL;
-    this_item->prev = siblingItem;
-    this_item->child = NULL;
-    this_item->parent = parentItem;
-    
-    if (siblingItem !=  NULL)
-	siblingItem->next = this_item;
-    if (parentItem != NULL && parentItem->child == NULL)
-	parentItem->child = this_item;
-    
-    siblingItem = this_item;
-    
-    if (*item & MF_POPUP)
-    {
-	popup_item = (MENU_POPUPITEM *) item;
-	this_item->item_flags = popup_item->item_flags;
-	this_item->item_id    = -1;
-	this_item->item_text  = popup_item->item_text;
-
-#ifdef DEBUG_MENU
-	printf("%d: popup %s\n", level, this_item->item_text);
-#endif
-    }
-    else
-    {
-	normal_item = (MENU_NORMALITEM *) item;
-	this_item->item_flags = normal_item->item_flags;
-	this_item->item_id    = normal_item->item_id;
-	this_item->item_text  = normal_item->item_text;
-
-#ifdef DEBUG_MENU
-	printf("%d: normal %s (%04x)\n", level, this_item->item_text,
-	       this_item->item_flags);
-#endif
-    }
-
-    if (level == 1)
-    {
-	menu->nItems++;
-
-	if (this_item->prev != NULL)
-	{
-	    XtSetArg(this_args[n_args], XtNhorizDistance, 10); 
-	    n_args++;
-	    XtSetArg(this_args[n_args], XtNfromHoriz, this_item->prev->w); 
-	    n_args++;
+    if (wFlags & MF_INSERT) {
+    	return InsertMenu(hMenu, nPos, wFlags, wItemID, lpNewItem);
 	}
-
-	if (this_item->item_flags & MF_POPUP)
-	{
-	    sprintf(this_item->menu_name, "Menu%d", menuId++);
-	    XtSetArg(this_args[n_args], XtNmenuName, this_item->menu_name);
-	    n_args++;
-	    
-	    this_item->w = XtCreateManagedWidget(this_item->item_text,
-						 winMenuButtonWidgetClass, 
-						 menu->parentWidget,
-						 this_args, n_args);
-	    this_item->menu_w = XtCreatePopupShell(this_item->menu_name,
-						 simpleMenuWidgetClass, 
-						 this_item->w,
-						 NULL, 0);
+    if (wFlags & MF_CHANGE) {
+    	return ModifyMenu(hMenu, nPos, wFlags, wItemID, lpNewItem);
 	}
-	else
-	{
-	    this_item->w = XtCreateManagedWidget(this_item->item_text,
-						 winCommandWidgetClass, 
-						 menu->parentWidget,
-						 this_args, n_args);
-	    this_item->menu_w = NULL;
-	    XtAddCallback(this_item->w, XtNcallback, MENU_SelectionCallback,
-			  (XtPointer) this_item);
+    if (wFlags & MF_REMOVE) {
+    	return RemoveMenu(hMenu, wItemID, wFlags);
 	}
-
-	if (menu->firstItem == NULL)
-	    menu->firstItem = this_item;
-    }
-    else
-    {
-	if ((this_item->item_flags & MF_MENUBREAK) ||
-	    (strlen(this_item->item_text) == 0))
-	{
-	    XtSetArg(this_args[n_args], XtNheight, 10);
-	    n_args++;
-	    this_item->w = XtCreateManagedWidget("separator",
-						 smeLineObjectClass,
-						 this_item->parent->menu_w,
-						 this_args, n_args);
-	}
-	else
-	{
-	    XtSetArg(this_args[n_args], XtNmenuName, this_item->menu_name);
-	    n_args++;
-	    this_item->w = XtCreateManagedWidget(this_item->item_text,
-						 smeMenuButtonObjectClass,
-						 this_item->parent->menu_w,
-						 this_args, n_args);
-
-	    if (this_item->item_flags & MF_POPUP)
-	    {
-		sprintf(this_item->menu_name, "Menu%d", menuId++);
-		this_item->menu_w = XtCreatePopupShell(this_item->menu_name,
-						     simpleMenuWidgetClass, 
-						     this_item->parent->menu_w,
-						     NULL, 0);
-	    }
-	    else
-	    {
-		this_item->menu_w = NULL;
-		XtAddCallback(this_item->w, XtNcallback, 
-			      MENU_SelectionCallback, (XtPointer) this_item);
-	    }
-	}
-    }
-
-    if (this_item->w != NULL)
-    {
-	if (this_item->item_flags & MF_GRAYED)
-	    XtSetSensitive(this_item->w, False);
-	if (this_item->item_flags & MF_DISABLED)
-	    XtVaSetValues(this_item->w, XtNinactive, True, NULL);
-	if (this_item->item_flags & MF_CHECKED)
-	    MENU_CheckWidget(this_item->w, True);
-    }
-
-    return 1;
+    return FALSE;
 }
-
-/**********************************************************************
- *					MENU_UseMenu
- */
-LPMENUBAR
-MENU_UseMenu(Widget parent, HANDLE instance, HWND wnd, HMENU hmenu, int width)
-{
-    LPMENUBAR 		menubar;
-    MENUITEM           *menu;
-    MENU_HEADER        *menu_desc;
-
-    menu  = (MENUITEM *) GlobalLock(hmenu);
-    if (hmenu == 0 || menu == NULL)
-    {
-	return NULL;
-    }
-
-    menubar = MENU_FindMenuBar(menu);
-    if (menubar == NULL)
-    {
-	GlobalUnlock(hmenu);
-	return NULL;
-    }
-
-    menubar->nItems 	     = 0;
-    menubar->parentWidget    = parent;
-    menubar->ownerWnd	     = wnd;
-
-    menu_desc = (MENU_HEADER *) GlobalLock(menubar->menuDescription);
-    
-    parentItem  = NULL;
-    siblingItem = NULL;
-    lastLevel   = 0;
-    MENU_ParseMenu((WORD *) (menu_desc + 1), 0, 0, MENU_CreateItems, menubar);
-
-    menubar->menuBarWidget = menubar->firstItem->w;
-
-    menubar->next = firstMenu;
-    firstMenu = menubar;
-    
-    return menubar;
-}
-
-/**********************************************************************
- *					MENU_CreateMenuBar
- */
-LPMENUBAR
-MENU_CreateMenuBar(Widget parent, HANDLE instance, HWND wnd,
-		   char *menu_name, int width)
-{
-    LPMENUBAR 		menubar;
-    HMENU     		hmenu;
-    MENUITEM           *menu;
-    MENU_HEADER        *menu_desc;
-
-#ifdef DEBUG_MENU
-    printf("CreateMenuBar: instance %02x, menu '%s', width %d\n",
-	   instance, menu_name, width);
-#endif
-
-    hmenu = LoadMenu(instance, menu_name);
-    return MENU_UseMenu(parent, instance, wnd, hmenu, width);
-}
-
-/**********************************************************************
- *					MENU_FindItem
- */
-MENUITEM *
-MENU_FindItem(MENUITEM *menu, WORD item_id, WORD flags)
-{
-    MENUITEM *item;
-    WORD position;
-    
-    if (flags & MF_BYPOSITION)
-    {
-	item = menu;
-	for (position = 0; item != NULL && position != item_id; position++)
-	    item = item->next;
-	
-	if (position == item_id)
-	    return item;
-    }
-    else
-    {
-	for ( ; menu != NULL; menu = menu->next)
-	{
-	    if (menu->item_id == item_id && menu->child == NULL)
-		return menu;
-	    if (menu->child != NULL)
-	    {
-		item = MENU_FindItem(menu->child, item_id, flags);
-		if (item != NULL)
-		    return item;
-	    }
-	}
-    }
-
-    return NULL;
-}
-
-/**********************************************************************
- *					MENU_CollapseMenu
- */
-static void
-MENU_CollapseBranch(MENUITEM *item, Boolean first_flag)
-{
-    MENUITEM *next_item;
-    
-    for ( ; item != NULL; item = next_item)
-    {
-	next_item = item->next;
-	
-	if (item->child != NULL)
-	    MENU_CollapseBranch(item->child, False);
-	    
-	if (item->w != NULL)
-	    XtDestroyWidget(item->w);
-	if (item->menu_w != NULL)
-	    XtDestroyWidget(item->menu_w);
-	
-	if (first_flag)
-	{
-	    item->prev 	     = NULL;
-	    item->child      = NULL;
-	    item->next 	     = NULL;
-	    item->parent     = NULL;
-	    item->item_flags = 0;
-	    item->item_id    = 0;
-	    item->item_text  = NULL;
-	    item->w 	     = NULL;
-	    item->menu_w     = NULL;
-
-	    first_flag = False;
-	}
-	else
-	{
-	    GlobalFree((unsigned int) item);
-	}
-    }
-}
-
-void
-MENU_CollapseMenu(LPMENUBAR menubar)
-{
-    MENU_CollapseBranch(menubar->firstItem, True);
-    
-    menubar->nItems 	     = 0;
-    menubar->parentWidget    = NULL;
-    menubar->ownerWnd	     = 0;
-    menubar->menuBarWidget   = NULL;
-}
-
-
-/**********************************************************************
- *					CheckMenu
- */
-BOOL
-CheckMenu(HMENU hmenu, WORD item_id, WORD check_flags)
-{
-    MENUITEM *item;
-    Pixmap left_bitmap;
-
-    if ((item = (MENUITEM *) GlobalLock(hmenu)) == NULL)
-	return -1;
-    
-    item = MENU_FindItem(item, item_id, check_flags);
-    if (item == NULL)
-    {
-	GlobalUnlock(hmenu);
-	return -1;
-    }
-
-    XtVaGetValues(item->w, XtNleftBitmap, &left_bitmap, NULL);
-    MENU_CheckWidget(item->w, (check_flags & MF_CHECKED));
-
-    if (left_bitmap == XtUnspecifiedPixmap)
-	return MF_UNCHECKED;
-    else
-	return MF_CHECKED;
-}
-
-
-/**********************************************************************
- *					LoadMenu
- */
-HMENU
-LoadMenu(HINSTANCE instance, char *menu_name)
-{
-    HANDLE		hmenubar;
-    LPMENUBAR 		menu;
-    HANDLE		hmenu_desc;
-    HMENU     		hmenu;
-    MENU_HEADER        *menu_desc;
-
-#ifdef DEBUG_MENU
-    printf("LoadMenu: instance %02x, menu '%s'\n",
-	   instance, menu_name);
-#endif
-
-    if (menu_name == NULL || 
-	(hmenu_desc = RSC_LoadMenu(instance, menu_name)) == 0 ||
-	(menu_desc = (MENU_HEADER *) GlobalLock(hmenu_desc)) == NULL)
-    {
-	return 0;
-    }
-
-    hmenubar = GlobalAlloc(GMEM_MOVEABLE, sizeof(MENUBAR));
-    menu = (LPMENUBAR) GlobalLock(hmenubar);
-    if (menu == NULL)
-    {
-	GlobalFree(hmenu_desc);
-	GlobalFree(hmenubar);
-	return 0;
-    }
-
-    hmenu = GlobalAlloc(GMEM_MOVEABLE, sizeof(MENUITEM));
-    if (hmenu == 0)
-    {
-	GlobalFree(hmenu_desc);
-	GlobalFree(hmenubar);
-	return 0;
-    }
-
-    menu->menuDescription = hmenu_desc;
-    menu->nItems 	  = 0;
-    menu->parentWidget    = NULL;
-    menu->firstItem       = (MENUITEM *) GlobalLock(hmenu);
-    menu->ownerWnd	  = 0;
-    menu->menuBarWidget   = NULL;
-
-    menu->firstItem->next 	= NULL;
-    menu->firstItem->prev 	= NULL;
-    menu->firstItem->child 	= NULL;
-    menu->firstItem->parent 	= NULL;
-    menu->firstItem->item_flags	= 0;
-    menu->firstItem->item_id 	= 0;
-    menu->firstItem->item_text 	= NULL;
-    menu->firstItem->w 		= NULL;
-    menu->firstItem->menu_w 	= NULL;
-
-    menu->next = firstMenu;
-    firstMenu  = menu;
-    
-    return GlobalHandleFromPointer(menu->firstItem);
-}
-
-#endif
 
 
 /**********************************************************************
@@ -1586,10 +1122,12 @@
 		lpitem->item_flags |= MF_CHECKED;
 	    else
 		lpitem->item_flags &= ((WORD)-1 ^ MF_CHECKED);
+	    GlobalUnlock(hMenu);
 	    return(TRUE);
 	    }
     	lpitem = (LPMENUITEM)lpitem->next;
     	}
+    GlobalUnlock(hMenu);
     return FALSE;
 }
 
@@ -1616,10 +1154,12 @@
 		lpitem->item_flags |= MF_DISABLED;
 	    else
 		lpitem->item_flags &= ((WORD)-1 ^ MF_DISABLED);
+	    GlobalUnlock(hMenu);
 	    return(TRUE);
 	    }
     	lpitem = (LPMENUITEM)lpitem->next;
     	}
+    GlobalUnlock(hMenu);
     return FALSE;
 }
 
@@ -1635,8 +1175,12 @@
     LPMENUITEM 	lpitem, lpitem2;
     int		i;
 #ifdef DEBUG_MENU
-    printf("InsertMenu (%04X, %04X, %04X, %04X, %08X) !\n",
-	hMenu, nPos, wFlags, wItemID, lpNewItem);
+    if (wFlags & MF_STRING) 
+	printf("InsertMenu (%04X, %04X, %04X, '%s') !\n",
+		hMenu, wFlags, wItemID, lpNewItem);
+    else
+	printf("InsertMenu (%04X, %04X, %04X, %04X, %08X) !\n",
+		hMenu, nPos, wFlags, wItemID, lpNewItem);
 #endif
     menu = (LPPOPUPMENU) GlobalLock(hMenu);
     if (menu == NULL) return FALSE;
@@ -1649,10 +1193,14 @@
     	}
     printf("InsertMenu // after loop items !\n");
     hNewItem = GlobalAlloc(GMEM_MOVEABLE, sizeof(MENUITEM));
-    if (hNewItem == 0) return FALSE;
+    if (hNewItem == 0) {
+	GlobalUnlock(hMenu);
+    	return FALSE;
+    	}
     lpitem2 = (LPMENUITEM)GlobalLock(hNewItem);
     if (lpitem2 == NULL) {
 	GlobalFree(hNewItem);
+	GlobalUnlock(hMenu);
 	return FALSE;
 	}
     lpitem2->item_flags = wFlags;
@@ -1673,9 +1221,8 @@
     lpitem->next = lpitem2;
     lpitem2->child = NULL;
     lpitem2->parent = NULL;
-    lpitem2->w = NULL;
-    lpitem2->menu_w = NULL;
     menu->nItems++;
+    GlobalUnlock(hMenu);
     return TRUE;
 }
 
@@ -1690,8 +1237,12 @@
     HANDLE	hNewItem;
     LPMENUITEM 	lpitem, lpitem2;
 #ifdef DEBUG_MENU
-    printf("AppendMenu (%04X, %04X, %04X, %08X) !\n",
-	hMenu, wFlags, wItemID, lpNewItem);
+    if ((wFlags & (MF_BITMAP | MF_SEPARATOR | MF_MENUBREAK | MF_OWNERDRAW)) == 0)
+	printf("AppendMenu (%04X, %04X, %04X, '%s') !\n",
+		hMenu, wFlags, wItemID, lpNewItem);
+    else
+	printf("AppendMenu (%04X, %04X, %04X, %08X) !\n",
+		hMenu, wFlags, wItemID, lpNewItem);
 #endif
     menu = (LPPOPUPMENU) GlobalLock(hMenu);
     if (menu == NULL) return FALSE;
@@ -1702,10 +1253,14 @@
 	    }
 	}
     hNewItem = GlobalAlloc(GMEM_MOVEABLE, sizeof(MENUITEM));
-    if (hNewItem == 0) return FALSE;
+    if (hNewItem == 0) {
+	GlobalUnlock(hMenu);
+	return FALSE;
+	}
     lpitem2 = (LPMENUITEM)GlobalLock(hNewItem);
     if (lpitem2 == NULL) {
 	GlobalFree(hNewItem);
+	GlobalUnlock(hMenu);
 	return FALSE;
 	}
     lpitem2->item_flags = wFlags;
@@ -1727,11 +1282,10 @@
     lpitem2->next = NULL;
     lpitem2->child = NULL;
     lpitem2->parent = NULL;
-    lpitem2->w = NULL;
-    lpitem2->menu_w = NULL;
     lpitem2->hCheckBit = (HBITMAP)NULL;
     lpitem2->hUnCheckBit = (HBITMAP)NULL;
     menu->nItems++;
+    GlobalUnlock(hMenu);
     return TRUE;
 }
 
@@ -1757,12 +1311,14 @@
     	    lpitem->prev->next = lpitem->next;
     	    lpitem->next->prev = lpitem->prev;
     	    GlobalFree(HIWORD(lpitem));
+	    GlobalUnlock(hMenu);
     	    return(TRUE);
 	    }
     	lpitem = (LPMENUITEM)lpitem->next;
 	printf("RemoveMenu // during loop items !\n");
     	}
     printf("RemoveMenu // after loop items !\n");
+    GlobalUnlock(hMenu);
     return FALSE;
 }
 
@@ -1801,10 +1357,12 @@
     	    lpitem->item_flags = wFlags;
     	    lpitem->item_id    = wItemID;
     	    lpitem->item_text  = lpNewItem;
+	    GlobalUnlock(hMenu);
     	    return(TRUE);
 	    }
     	lpitem = (LPMENUITEM)lpitem->next;
     	}
+    GlobalUnlock(hMenu);
     return FALSE;
 }
 
@@ -1836,6 +1394,7 @@
     menu->SysFlag	  = FALSE;
     menu->Width = 100;
     menu->Height = 0;
+    GlobalUnlock(hMenu);
     return hMenu;
 }
 
@@ -1848,6 +1407,7 @@
 {
     WND		*wndPtr;
     LPPOPUPMENU	lppop;
+    RECT	rect;
 #ifdef DEBUG_MENU
     printf("TrackPopupMenu (%04X, %04X, %d, %d, %04X, %04X, %08X) !\n",
 	hMenu, wFlags, x, y, nReserved, hWnd, lpRect);
@@ -1873,15 +1433,7 @@
 	SetWindowPos(lppop->hWnd, 0, x, y, lppop->Width + 2, lppop->Height, 
 		SWP_NOZORDER);
 	}
-    else {
-	MenuBarCalcSize(lppop->hWnd);
-#ifdef DEBUG_MENU
-	printf("TrackMenuBar // x=%d y=%d Width=%d Height=%d\n", 
-		x, y, lppop->Width, lppop->Height); 
-#endif
-	SetWindowPos(lppop->hWnd, 0, 0, -16, lppop->Width, lppop->Height, 
-		SWP_NOZORDER);
-	}
+    GlobalUnlock(hMenu);
     return TRUE;
 }
 
@@ -1889,7 +1441,7 @@
 /**********************************************************************
  *			NC_TrackSysMenu		[Internal]
  */
-void NC_TrackSysMenu(hWnd)
+void NC_TrackSysMenu(HWND hWnd)
 {
     RECT	rect;
     LPPOPUPMENU	lpsys;
@@ -1920,6 +1472,20 @@
     else {
 	ShowWindow(lpsys->hWnd, SW_HIDE);
 	}
+    GlobalUnlock(wndPtr->hSysMenu);
+}
+
+
+/**********************************************************************
+ *			GetMenuCheckMarkDimensions	[USER.417]
+ */
+DWORD GetMenuCheckMarkDimensions()
+{
+    BITMAP	bm;
+    if (hStdCheck == (HBITMAP)NULL) 
+	hStdCheck = LoadBitmap((HANDLE)NULL, (LPSTR)OBM_CHECK);
+    GetObject(hStdCheck, sizeof(BITMAP), (LPSTR)&bm);
+    return MAKELONG(bm.bmWidth, bm.bmHeight);
 }
 
 
@@ -1945,10 +1511,12 @@
     	if (i == nPos) {
     	    lpitem->hCheckBit   = hNewCheck;
      	    lpitem->hUnCheckBit = hNewUnCheck;
-    	    return(TRUE);
+	    GlobalUnlock(hMenu);
+    	    return TRUE;
 	    }
     	lpitem = (LPMENUITEM)lpitem->next;
     	}
+    GlobalUnlock(hMenu);
     return FALSE;
 }
 
@@ -1980,6 +1548,7 @@
     menu->SysFlag	  = FALSE;
     menu->Width = 100;
     menu->Height = 0;
+    GlobalUnlock(hMenu);
     return hMenu;
 }
 
@@ -2008,6 +1577,7 @@
 	    }
     	lpitem = (LPMENUITEM)lpitem->next;
     	}
+    GlobalUnlock(hMenu);
     GlobalFree(hMenu);
 #ifdef DEBUG_MENU
     printf("DestroyMenu (%04X) // End !\n", hMenu);
@@ -2016,9 +1586,6 @@
 }
 
 
-#ifdef USE_POPUPMENU
-
-
 /**********************************************************************
  *			LoadMenu		[USER.150]
  */
@@ -2027,7 +1594,6 @@
     HMENU     		hMenu;
     HANDLE		hMenu_desc;
     MENU_HEADER 	*menu_desc;
-
 #ifdef DEBUG_MENU
     if ((LONG)menu_name & 0xFFFF0000L)
 	printf("LoadMenu: instance %02x, menu '%s'\n", instance, menu_name);
@@ -2037,12 +1603,16 @@
     if (instance == (HANDLE)NULL)  instance = hSysRes;
     if (menu_name == NULL || 
 	(hMenu_desc = RSC_LoadMenu(instance, menu_name)) == 0 ||
-	(menu_desc = (MENU_HEADER *) GlobalLock(hMenu_desc)) == NULL)
-    {
+	(menu_desc = (MENU_HEADER *) GlobalLock(hMenu_desc)) == NULL) {
 	return 0;
-    }
+        }
+    hMenu = LoadMenuIndirect((LPSTR)menu_desc);
+/*
     hMenu = CreateMenu();
     ParseMenuResource((WORD *) (menu_desc + 1), 0, hMenu);
+    GlobalUnlock(hMenu_desc);
+    GlobalFree(hMenu_desc);
+*/
     return hMenu;
 }
 
@@ -2080,9 +1650,18 @@
  */
 BOOL SetMenu(HWND hWnd, HMENU hMenu)
 {
+    LPPOPUPMENU lppop;
     WND * wndPtr = WIN_FindWndPtr(hWnd);
     if (wndPtr == NULL) return FALSE;
+#ifdef DEBUG_MENU
+    printf("SetMenu(%04X, %04X);\n", hWnd, hMenu);
+#endif
     wndPtr->wIDmenu = hMenu;
+    if (hMenu == 0) return TRUE;
+    lppop = (LPPOPUPMENU) GlobalLock(hMenu);
+    if (lppop == NULL) return FALSE;
+    lppop->ownerWnd = hWnd;
+    GlobalUnlock(hMenu);
     return TRUE;
 }
 
@@ -2127,14 +1706,33 @@
     printf("DrawMenuBar (%04X)\n", hWnd);
 #endif
     wndPtr = WIN_FindWndPtr(hWnd);
-    if (wndPtr != NULL && wndPtr->hWndMenuBar != 0) {
-	InvalidateRect(wndPtr->hWndMenuBar, NULL, TRUE);
-	UpdateWindow(wndPtr->hWndMenuBar);
+    if (wndPtr != NULL && wndPtr->wIDmenu != 0) {
+#ifdef DEBUG_MENU
+	printf("DrawMenuBar wIDmenu=%04X \n", wndPtr->wIDmenu);
+#endif
+	SendMessage(hWnd, WM_NCPAINT, 1, 0L);
 	}
 }
 
 
 /**********************************************************************
+ *			LoadMenuIndirect	[USER.220]
+ */
+HMENU LoadMenuIndirect(LPSTR menu_template)
+{
+    HMENU     		hMenu;
+    MENU_HEADER 	*menu_desc;
+#ifdef DEBUG_MENU
+    printf("LoadMenuIndirect: menu_template '%08X'\n", menu_template);
+#endif
+    hMenu = CreateMenu();
+    menu_desc = (MENU_HEADER *)menu_template;
+    ParseMenuResource((WORD *)(menu_desc + 1), 0, hMenu); 
+    return hMenu;
+}
+
+
+/**********************************************************************
  *			CopySysMenu (Internal)
  */
 HMENU CopySysMenu()
@@ -2175,12 +1773,15 @@
 	}
     GlobalUnlock(hMenu);
     GlobalUnlock(hSysMenu);
+#ifdef DEBUG_MENU
+    printf("CopySysMenu hMenu=%04X !\n", hMenu);
+#endif
     return hMenu;
 }
 
 
 /**********************************************************************
- *			ParseMenuResource (for Xlib version)
+ *			ParseMenuResource (from Resource or Template)
  */
 WORD * ParseMenuResource(WORD *first_item, int level, HMENU hMenu)
 {
@@ -2205,7 +1806,7 @@
 	    	hSubMenu, popup_item->item_text);
 	    }
 	else {
-	    MENU_NORMALITEM *normal_item = (MENU_NORMALITEM *) item;
+	    MENUITEMTEMPLATE *normal_item = (MENUITEMTEMPLATE *) item;
 	    next_item = (WORD *) (normal_item->item_text + 
 				  strlen(normal_item->item_text) + 1);
 	    AppendMenu(hMenu, normal_item->item_flags, 
@@ -2217,5 +1818,3 @@
 }
 
 
-#endif
-
diff --git a/controls/scroll.c b/controls/scroll.c
index 0f2aa84..2894b21 100644
--- a/controls/scroll.c
+++ b/controls/scroll.c
@@ -10,8 +10,6 @@
 */
 static char Copyright[] = "Copyright Martin Ayotte, 1993";
 
-#include <X11/Intrinsic.h>
-#include <X11/StringDefs.h>
 #include "windows.h"
 #include "sysmetrics.h"
 #include "scroll.h"
@@ -32,7 +30,7 @@
 
 LPHEADSCROLL ScrollBarGetWindowAndStorage(HWND hWnd, WND **wndPtr);
 LPHEADSCROLL ScrollBarGetStorageHeader(HWND hWnd);
-LPHEADSCROLL GetScrollObjectHandle(HWND hWnd, int nBar);
+LPHEADSCROLL GetScrollObjectStruct(HWND hWnd, int nBar);
 void ScrollBarButtonDown(HWND hWnd, int nBar, int x, int y);
 void ScrollBarButtonUp(HWND hWnd, int nBar, int x, int y);
 void ScrollBarMouseMove(HWND hWnd, int nBar, WORD wParam, int x, int y);
@@ -64,22 +62,6 @@
 #ifdef DEBUG_SCROLL
         printf("ScrollBar Creation !\n");
 #endif
-	if (hUpArrow == (HBITMAP)NULL) 
-	    hUpArrow = LoadBitmap((HINSTANCE)NULL, MAKEINTRESOURCE(OBM_UPARROWI));
-	if (hDnArrow == (HBITMAP)NULL) 
-	    hDnArrow = LoadBitmap((HINSTANCE)NULL, MAKEINTRESOURCE(OBM_DNARROWI));
-	if (hLfArrow == (HBITMAP)NULL) 
-	    hLfArrow = LoadBitmap((HINSTANCE)NULL, MAKEINTRESOURCE(OBM_LFARROWI));
-	if (hRgArrow == (HBITMAP)NULL) 
-	    hRgArrow = LoadBitmap((HINSTANCE)NULL, MAKEINTRESOURCE(OBM_RGARROWI));
-	if (hUpArrowD == (HBITMAP)NULL) 
-	    hUpArrowD = LoadBitmap((HINSTANCE)NULL, MAKEINTRESOURCE(OBM_UPARROWD));
-	if (hDnArrowD == (HBITMAP)NULL) 
-	    hDnArrowD = LoadBitmap((HINSTANCE)NULL, MAKEINTRESOURCE(OBM_DNARROWD));
-	if (hLfArrowD == (HBITMAP)NULL) 
-	    hLfArrowD = LoadBitmap((HINSTANCE)NULL, MAKEINTRESOURCE(OBM_LFARROWD));
-	if (hRgArrowD == (HBITMAP)NULL) 
-	    hRgArrowD = LoadBitmap((HINSTANCE)NULL, MAKEINTRESOURCE(OBM_RGARROWD));
 	return 0;
     case WM_DESTROY:
 	lphs = ScrollBarGetWindowAndStorage(hWnd, &wndPtr);
@@ -165,10 +147,9 @@
     RECT	rect, rect2;
     int		width, height;
     LONG	dwOwner;
-    lphs = GetScrollObjectHandle(hWnd, nBar);
-	    printf("ScrollBarButtonDown // x=%d y=%d\n", x, y);
+    lphs = GetScrollObjectStruct(hWnd, nBar);
 #ifdef DEBUG_SCROLL
-	    printf("ScrollBarButtonDown // x=%d y=%d\n", x, y);
+    printf("ScrollBarButtonDown // x=%d y=%d\n", x, y);
 #endif
     if (nBar == SB_CTL) {
 	hWndParent = GetParent(hWnd);
@@ -181,16 +162,12 @@
 /*
     SetFocus(lphs->hWndOwner);
 */
-    if (nBar != SB_CTL) {
-	GetWindowRect(lphs->hWndOwner, &rect);
-	x -= rect.left;
-	y -= rect.top;
-	}
     CopyRect(&rect, &lphs->rect);
+#ifdef DEBUG_SCROLL
     printf("ScrollDown / x=%d y=%d left=%d top=%d right=%d bottom=%d \n",
     	x, y, rect.left, rect.top, rect.right, rect.bottom);
+#endif
     if (lphs->Direction == WM_VSCROLL) {
-	y -= rect.top;
 	width = rect.right - rect.left;
 	if (y < (lphs->CurPix + width)) {
 	    if (y < width) {
@@ -198,30 +175,26 @@
 		CopyRect(&rect2, &rect);
 		rect2.bottom = rect2.top + width;
 		InvalidateRect(lphs->hWndOwner, &rect2, TRUE);
-	    printf("ScrollBarButtonDown // SB_LINEUP \n");
 	        SendMessage(hWndParent, lphs->Direction, 
 				SB_LINEUP, dwOwner);
 		}
 	    else {
 		lphs->ButtonDown = 5;
-	    printf("ScrollBarButtonDown // SB_PAGEUP \n");
 		SendMessage(hWndParent, lphs->Direction, 
 				SB_PAGEUP, dwOwner);
 		}
 	    }
 	if (y > (lphs->CurPix + (width << 1))) {
-	    if (y > (rect.bottom - width)) {
+	    if (y > (rect.bottom - rect.top - width)) {
 		lphs->ButtonDown = 2;
 		CopyRect(&rect2, &rect);
 		rect2.top = rect2.bottom - width;
 		InvalidateRect(lphs->hWndOwner, &rect2, TRUE);
-	    printf("ScrollBarButtonDown // SB_LINEDOWN \n");
 	        SendMessage(hWndParent, lphs->Direction, 
 				SB_LINEDOWN, dwOwner);
 		}
 	    else {
 		lphs->ButtonDown = 6;
-	    printf("ScrollBarButtonDown // SB_PAGEDOWN \n");
 		SendMessage(hWndParent, lphs->Direction, 
 				SB_PAGEDOWN, dwOwner);
 		}
@@ -235,7 +208,6 @@
 	    }
 	}
     else {
-	x -= rect.left;
 	height = rect.bottom - rect.top;
 	if (x < (lphs->CurPix + height)) {
 	    if (x < height) {
@@ -289,11 +261,10 @@
 {
     LPHEADSCROLL lphs;
     RECT	rect, rect2;
-    printf("ScrollBarButtonUp // x=%d y=%d\n", x, y); 
 #ifdef DEBUG_SCROLL
     printf("ScrollBarButtonUp // x=%d y=%d\n", x, y); 
 #endif
-    lphs = GetScrollObjectHandle(hWnd, nBar);
+    lphs = GetScrollObjectStruct(hWnd, nBar);
     lphs->ThumbActive = FALSE;
     if (lphs->ButtonDown != 0) {
 	lphs->ButtonDown = 0;
@@ -314,7 +285,7 @@
 #ifdef DEBUG_SCROLL
     printf("ScrollBarButtonMove // w=%04X x=%d y=%d \n", wParam, x, y);
 #endif
-    lphs = GetScrollObjectHandle(hWnd, nBar);
+    lphs = GetScrollObjectStruct(hWnd, nBar);
     if (lphs->ThumbActive == 0) return;
     if (nBar == SB_CTL) {
 	hWndParent = GetParent(hWnd);
@@ -399,6 +370,14 @@
     CopyRect(&rect, lprect);
     w = rect.right - rect.left;
     h = rect.bottom - rect.top;
+    if (lphs->Direction == WM_VSCROLL)
+	lphs->MaxPix = h - 3 * w;
+    else
+	lphs->MaxPix = w - 3 * h;
+    if (lphs->MaxVal != lphs->MinVal)
+	lphs->CurPix = lphs->MaxPix * (abs((short)lphs->CurVal) - abs(lphs->MinVal)) / 
+    		(abs(lphs->MaxVal) - abs(lphs->MinVal));
+    if (lphs->CurPix > lphs->MaxPix)  lphs->CurPix = lphs->MaxPix;
     hMemDC = CreateCompatibleDC(hDC);
     if (lphs->Direction == WM_VSCROLL) {
 	GetObject(hUpArrow, sizeof(BITMAP), (LPSTR)&bm);
@@ -473,39 +452,18 @@
     WND  *wndPtr;
     LPHEADSCROLL lphs;
     wndPtr = WIN_FindWndPtr(hWnd);
-    lphs = (LPHEADSCROLL)malloc(sizeof(HEADSCROLL));
-    if (lphs == 0) {
-    	printf("Bad Memory Alloc on ScrollBar !\n");
-    	return 0;
-    	}
+    width = wndPtr->rectClient.right - wndPtr->rectClient.left;
+    height = wndPtr->rectClient.bottom - wndPtr->rectClient.top;
+    if (width <= height)
+	lphs = AllocScrollBar(WS_VSCROLL, width, height);
+    else
+	lphs = AllocScrollBar(WS_HSCROLL, width, height);
 #ifdef DEBUG_SCROLL
         printf("CreateScrollBarStruct %lX !\n", lphs);
 #endif
     *((LPHEADSCROLL *)&wndPtr->wExtra[1]) = lphs;
     lphs->hWndOwner = hWnd;
-    lphs->ThumbActive = FALSE;
-    lphs->TimerPending = FALSE;
-    lphs->ButtonDown = 0;
-    lphs->MinVal = 0;
-    lphs->MaxVal = 100;
-    lphs->CurVal = 0;
-    lphs->CurPix = 0;
-    width = wndPtr->rectClient.right - wndPtr->rectClient.left;
-    height = wndPtr->rectClient.bottom - wndPtr->rectClient.top;
     CopyRect(&lphs->rect, &wndPtr->rectClient);
-    if (width <= height)
-	{
-	lphs->MaxPix = height - 3 * width;
-	lphs->Direction = WM_VSCROLL;
-	}
-    else
-	{
-	lphs->MaxPix = width - 3 * height;
-	lphs->Direction = WM_HSCROLL;
-	}
-    if (lphs->MaxPix < 1)  lphs->MaxPix = 1;
-    if (wndPtr->hCursor == (HCURSOR)NULL)
-	wndPtr->hCursor = LoadCursor((HINSTANCE)NULL, IDC_ARROW);
     return TRUE;
 }
 
@@ -514,6 +472,22 @@
 LPHEADSCROLL AllocScrollBar(DWORD dwStyle, int width, int height)
 {
     LPHEADSCROLL lphs;
+    if (hUpArrow == (HBITMAP)NULL) 
+	hUpArrow = LoadBitmap((HINSTANCE)NULL, MAKEINTRESOURCE(OBM_UPARROWI));
+    if (hDnArrow == (HBITMAP)NULL) 
+	hDnArrow = LoadBitmap((HINSTANCE)NULL, MAKEINTRESOURCE(OBM_DNARROWI));
+    if (hLfArrow == (HBITMAP)NULL) 
+	hLfArrow = LoadBitmap((HINSTANCE)NULL, MAKEINTRESOURCE(OBM_LFARROWI));
+    if (hRgArrow == (HBITMAP)NULL) 
+	hRgArrow = LoadBitmap((HINSTANCE)NULL, MAKEINTRESOURCE(OBM_RGARROWI));
+    if (hUpArrowD == (HBITMAP)NULL) 
+	hUpArrowD = LoadBitmap((HINSTANCE)NULL, MAKEINTRESOURCE(OBM_UPARROWD));
+    if (hDnArrowD == (HBITMAP)NULL) 
+	hDnArrowD = LoadBitmap((HINSTANCE)NULL, MAKEINTRESOURCE(OBM_DNARROWD));
+    if (hLfArrowD == (HBITMAP)NULL) 
+	hLfArrowD = LoadBitmap((HINSTANCE)NULL, MAKEINTRESOURCE(OBM_LFARROWD));
+    if (hRgArrowD == (HBITMAP)NULL) 
+	hRgArrowD = LoadBitmap((HINSTANCE)NULL, MAKEINTRESOURCE(OBM_RGARROWD));
     lphs = (LPHEADSCROLL)malloc(sizeof(HEADSCROLL));
     if (lphs == 0) {
     	printf("Bad Memory Alloc on ScrollBar !\n");
@@ -570,9 +544,9 @@
 
 
 /*************************************************************************
- *			GetScrollObjectHandle
+ *			GetScrollObjectStruct [internal]
  */
-LPHEADSCROLL GetScrollObjectHandle(HWND hWnd, int nBar)
+LPHEADSCROLL GetScrollObjectStruct(HWND hWnd, int nBar)
 {
     WND *wndPtr;
     LPHEADSCROLL lphs;
@@ -593,7 +567,7 @@
 {
     int nRet;
     LPHEADSCROLL lphs;
-    lphs = GetScrollObjectHandle(hWnd, nBar);
+    lphs = GetScrollObjectStruct(hWnd, nBar);
     if (lphs == NULL) return 0;
     nRet = lphs->CurVal;
     lphs->CurVal = (short)nPos;
@@ -622,7 +596,7 @@
 int GetScrollPos(HWND hWnd, int nBar)
 {
     LPHEADSCROLL lphs;
-    lphs = GetScrollObjectHandle(hWnd, nBar);
+    lphs = GetScrollObjectStruct(hWnd, nBar);
     if (lphs == NULL) return 0;
     return lphs->CurVal;
 }
@@ -635,7 +609,7 @@
 void SetScrollRange(HWND hWnd, int nBar, int MinPos, int MaxPos, BOOL bRedraw)
 {
     LPHEADSCROLL lphs;
-    lphs = GetScrollObjectHandle(hWnd, nBar);
+    lphs = GetScrollObjectStruct(hWnd, nBar);
     if (lphs == NULL) return;
     lphs->MinVal = (short)MinPos;
     lphs->MaxVal = (short)MaxPos;
@@ -661,7 +635,7 @@
 void GetScrollRange(HWND hWnd, int nBar, LPINT lpMin, LPINT lpMax)
 {
     LPHEADSCROLL lphs;
-    lphs = GetScrollObjectHandle(hWnd, nBar);
+    lphs = GetScrollObjectStruct(hWnd, nBar);
     if (lphs == NULL) return;
     *lpMin = lphs->MinVal;
     *lpMax = lphs->MaxVal;
@@ -686,22 +660,20 @@
 	return;
 	}
     wndPtr = WIN_FindWndPtr(hWnd);
-    if ((wBar == SB_VERT) || (wBar == SB_BOTH)) {
 /*
+    if ((wBar == SB_VERT) || (wBar == SB_BOTH)) {
     	if (bFlag)
-	    ShowWindow(wndPtr->hWndVScroll, SW_SHOW);
+	    wndPtr->dwStyle |= WS_VSCROLL;
 	else
-	    ShowWindow(wndPtr->hWndVScroll, SW_HIDE);
-*/
+	    wndPtr->dwStyle &= 0xFFFFFFFFL ^ WS_VSCROLL;
 	}
     if ((wBar == SB_HORZ) || (wBar == SB_BOTH)) {
-/*
     	if (bFlag)
-	    ShowWindow(wndPtr->hWndHScroll, SW_SHOW);
+	    wndPtr->dwStyle |= WS_HSCROLL;
 	else
-	    ShowWindow(wndPtr->hWndHScroll, SW_HIDE);
-*/
+	    wndPtr->dwStyle &= 0xFFFFFFFFL ^ WS_HSCROLL;
 	}
+*/
 }
 
 
diff --git a/controls/widgets.c b/controls/widgets.c
index 37b74f1..1ad506d 100644
--- a/controls/widgets.c
+++ b/controls/widgets.c
@@ -6,8 +6,7 @@
 
 static char Copyright[] = "Copyright  Alexandre Julliard, 1993";
 
-#include "windows.h"
-#include "dialog.h"
+#include "win.h"
 
 
 LONG ButtonWndProc( HWND hwnd, WORD message, WORD wParam, LONG lParam );
@@ -16,6 +15,7 @@
 LONG ListBoxWndProc  ( HWND hwnd, WORD message, WORD wParam, LONG lParam );
 LONG ComboBoxWndProc ( HWND hwnd, WORD message, WORD wParam, LONG lParam );
 LONG PopupMenuWndProc ( HWND hwnd, WORD message, WORD wParam, LONG lParam );
+LONG DesktopWndProc ( HWND hwnd, WORD message, WORD wParam, LONG lParam );
 
 
 static WNDCLASS WIDGETS_BuiltinClasses[] =
@@ -32,6 +32,8 @@
       0, 0, 0, 0, NULL, "COMBOBOX" },
     { CS_GLOBALCLASS, (LONG(*)())PopupMenuWndProc, 0, 8,
       0, 0, 0, 0, NULL, "POPUPMENU" },
+    { CS_GLOBALCLASS, (LONG(*)())DesktopWndProc, 0, 0,
+      0, 0, 0, 0, NULL, DESKTOP_CLASS_NAME },
     { CS_GLOBALCLASS, (LONG(*)())DefDlgProc, 0, DLGWINDOWEXTRA,
       0, 0, 0, 0, NULL, DIALOG_CLASS_NAME }
 };
diff --git a/debugger/Imakefile b/debugger/Imakefile
index 4b4ed04..2e481f0 100644
--- a/debugger/Imakefile
+++ b/debugger/Imakefile
@@ -5,8 +5,6 @@
 
 MODULE = debugger
 
-DEFINES = -DUSE_READLINE
-
 SUBDIRS = readline
 
 /* Quick and dirt hack, since i386 is defined as 1. sigh */
diff --git a/debugger/Makefile b/debugger/Makefile
deleted file mode 100644
index 6a27140..0000000
--- a/debugger/Makefile
+++ /dev/null
@@ -1,39 +0,0 @@
-CFLAGS=-g -I../include -DUSE_READLINE ${COPTS}
-LIBS= readline/libedit.a
-OBJS=dbg.tab.o hash.o lex.yy.o info.o i386-pinsn.o
-#YACC=bison -v -d
-YACC=yacc -b dbg -d
-#LEX=flex
-LEX=lex
-
-debugger.o: ${OBJS} readline/libedit.a
-	(cd readline; make)
-	ld -r -o debugger.o ${OBJS} $(LIBS)
-
-
-readline/libedit.a:
-	(cd readline; make)
-
-dbg.tab.o: dbg.tab.c
-	gcc  $(CFLAGS) -DYYDEBUG=1 -c dbg.tab.c
-
-lex.yy.o: lex.yy.c
-	gcc $(CFLAGS) -I. -c lex.yy.c
-
-
-lex.yy.c: debug.l
-	${LEX} -I debug.l
-
-dbg.tab.c dbg.tab.h: dbg.y
-	${YACC} dbg.y
-
-dtest: dtest.o debugger.o
-	gcc -o dtest dtest.o debugger.o
-
-clean:
-	rm -f *.o main dbg.tab.* lex.yy.* *.output *~ *# dtest
-	(cd readline; make clean)
-
-depend: dbg.tab.c dbg.tab.h lex.yy.c
-	$(CC) $(CFLAGS) -M *.c > .depend
-
diff --git a/debugger/debug.l b/debugger/debug.l
index 6de63a4..005c556 100644
--- a/debugger/debug.l
+++ b/debugger/debug.l
@@ -113,6 +113,10 @@
 
 %%
 
+#ifndef yywrap
+int yywrap(void) { return 1; }
+#endif
+
 #ifdef USE_READLINE
 #ifndef whitespace
 #define whitespace(c) (((c) == ' ') || ((c) == '\t'))
diff --git a/debugger/readline/Makefile b/debugger/readline/Makefile
deleted file mode 100644
index 0ec3889..0000000
--- a/debugger/readline/Makefile
+++ /dev/null
@@ -1,66 +0,0 @@
-##  $Revision: 1.3 $
-##
-##  Unix makefile for editline library.
-##
-
-##  Set your options:
-##	-DANSI_ARROWS		ANSI arrows keys work like emacs.
-##	-DHAVE_STDLIB		Have <stdlib.h>.
-##	-DHAVE_TCGETATTR	Have tcgetattr(), tcsetattr().
-##	-DHIDE			Make static functions static (non debug).
-##	-DHIST_SIZE=n		History size.
-##	-DNEED_STRDUP		Don't have strdup().
-##	-DUNIQUE_HISTORY	Don't save command if same as last one.
-##	-DUSE_DIRENT		Use <dirent.h>, not <sys/dir.h>?
-##	-DUSE_TERMCAP		Use the termcap library for terminal size
-##				see LDFLAGS, below, if you set this.
-##	-DNEED_PERROR		Don't have perror() (used in testit)
-DEFS	= -DANSI_ARROWS -DHAVE_TCGETATTR -DHIDE -DUSE_DIRENT -DSYS_UNIX
-
-##  Set your C compiler:
-WARN	= -Wall -Wshadow -Wpointer-arith -Wcast-qual -Wwrite-strings \
-	-Wunused -Wcomment -Wswitch
-CC	= gcc -ansi $(WARN)
-#CC	= cc
-CFLAGS	= $(DEFS) -O -g
-
-##  If you have -DUSE_TERMCAP, set this as appropriate:
-#LDFLAGS = -ltermlib
-#LDFLAGS = -ltermcap
-
-##  Set ranlib as appropriate:
-RANLIB	= ranlib
-#RANLIB	= echo
-
-##  End of configuration.
-
-SOURCES	= editline.c complete.c sysunix.c
-OBJECTS	= editline.o complete.o sysunix.o
-SHARFILES =	README Makefile editline.3 editline.h unix.h editline.c \
-		complete.c sysunix.c testit.c \
-		Make.os9 os9.h sysos9.c
-
-all:		libedit.a
-
-testit:		testit.c libedit.a
-	$(CC) $(CFLAGS) -o testit testit.c libedit.a $(LDFLAGS)
-
-shar:		$(SHARFILES)
-	shar $(SHARFILES) >shar
-
-clean:
-	rm -f *.[oa] testit foo core tags lint lint.all a.out shar *# *~
-
-lint:		testit
-	lint -a -b -u -x $(DEFS) $(SOURCES) testit.c >lint.all
-	sed -e '/warning: function prototype not in scope/d' \
-		-e '/warning: old style argument declaration/'d \
-		-e '/mix of old and new style function declaration/'d \
-		<lint.all >lint
-
-libedit.a:	$(OBJECTS)
-	@rm -f $@
-	ar r $@ $(OBJECTS)
-	$(RANLIB) $@
-
-$(OBJECTS):	editline.h
diff --git a/etc/Makefile b/etc/Makefile
deleted file mode 100644
index 87948b0..0000000
--- a/etc/Makefile
+++ /dev/null
@@ -1,358 +0,0 @@
-# Makefile generated by imake - do not edit!
-# $XConsortium: imake.c,v 1.65 91/07/25 17:50:17 rws Exp $
-
-# -------------------------------------------------------------------------
-# Makefile generated from "Imake.tmpl" and <Imakefile>
-# $XFree86: mit/config/Imake.tmpl,v 1.17 1993/06/03 15:26:36 dawes Exp $
-# $XConsortium: Imake.tmpl,v 1.139 91/09/16 08:52:48 rws Exp $
-#
-# Platform-specific parameters may be set in the appropriate <vendor>.cf
-# configuration files.  Site-specific parameters should be set in the file
-# site.def.  Full rebuilds are recommended if any parameters are changed.
-#
-# If your C preprocessor does not define any unique symbols, you will need
-# to set BOOTSTRAPCFLAGS when rebuilding imake (usually when doing
-# "make World" the first time).
-#
-
-# -------------------------------------------------------------------------
-# site-specific configuration parameters that need to come before
-# the platform-specific parameters - edit site.def to change
-
-# $XFree86: mit/config/site.def,v 1.65 1993/06/04 16:02:47 dawes Exp $
-# site:  $XConsortium: site.def,v 1.2 91/07/30 20:26:44 rws Exp $
-
-# obz: changes for making Linux distribution
-
-# -------------------------------------------------------------------------
-# platform-specific configuration parameters - edit x386.cf to change
-
-# $XFree86: mit/config/x386.cf,v 1.90 1993/06/04 16:02:50 dawes Exp $
-# platform:  $XConsortium: x386.cf,v 1.7 91/08/16 19:30:10 gildea Exp $
-
-# -------------------------------------------------------------------------
-# XFree86 version definition
-# $XFree86: mit/config/xf86_vers.def,v 1.5 1993/06/01 09:12:47 dawes Exp $
-
-# -------------------------------------------------------------------------
-# XFree86 version: 1300
-# -------------------------------------------------------------------------
-
-# $XFree86: mit/config/lnuxLib.rules,v 1.2 1993/06/02 13:48:12 dawes Exp $
-
-DLL_BINDIR = /usr/dll/bin
-
-# operating system:  		Linux
-
-# -------------------------------------------------------------------------
-# site-specific configuration parameters that go after
-# the platform-specific parameters - edit site.def to change
-
-# $XFree86: mit/config/site.def,v 1.65 1993/06/04 16:02:47 dawes Exp $
-# site:  $XConsortium: site.def,v 1.2 91/07/30 20:26:44 rws Exp $
-
-# obz: changes for making Linux distribution
-
-            SHELL = 	/bin/sh
-
-              TOP = ../.
-      CURRENT_DIR = ./etc
-
-               AR = ar clq
-  BOOTSTRAPCFLAGS =
-               CC = 		gcc
-               AS = as
-
-              LEX = 		flex
-
-             YACC = 		bison -y
-
-         COMPRESS = compress
-              CPP = 		/lib/cpp $(STD_CPP_DEFINES)
-    PREPROCESSCMD = 	/lib/cpp $(STD_CPP_DEFINES)
-          INSTALL = install
-               LD = ld
-             LINT = lint
-      LINTLIBFLAG = -C
-         LINTOPTS = -axz
-               LN = ln -s
-             MAKE = make
-               MV = mv
-               CP = cp
-
-           RANLIB = ranlib
-  RANLIBINSTFLAGS =
-
-               RM = rm -f
-            TROFF = psroff
-         MSMACROS = -ms
-              TBL = tbl
-              EQN = eqn
-     STD_INCLUDES =
-  STD_CPP_DEFINES = -traditional 		-D_POSIX_SOURCE -D_BSD_SOURCE -D_GNU_SOURCE 	-Dlinux
-      STD_DEFINES = 		-D_POSIX_SOURCE -D_BSD_SOURCE -D_GNU_SOURCE 	-Dlinux
- EXTRA_LOAD_FLAGS =
-  EXTRA_LIBRARIES =
-     OS_LIBRARIES =
-             TAGS = ctags
-
-    SHAREDCODEDEF =
-         SHLIBDEF =
-
-    PROTO_DEFINES = -DFUNCPROTO=11 -DNARROWPROTO
-
-     INSTPGMFLAGS = -s
-
-     INSTBINFLAGS = -m 0755
-     INSTUIDFLAGS = -s -m 4755
-     INSTLIBFLAGS = -m 0644
-     INSTINCFLAGS = -m 0444
-     INSTMANFLAGS = -m 0444
-     INSTDATFLAGS = -m 0444
-    INSTKMEMFLAGS = -s -m 4755
-
-      PROJECTROOT = 	/usr/X386
-
-     TOP_INCLUDES = -I$(INCROOT)
-
-      CDEBUGFLAGS = -O2
-        CCOPTIONS = -m486 -DNO_ASM -fwritable-strings
-    ANSICCOPTIONS =
-
-      ALLINCLUDES = $(INCLUDES) $(EXTRA_INCLUDES) $(TOP_INCLUDES) $(STD_INCLUDES)
-       ALLDEFINES = $(ALLINCLUDES) $(STD_DEFINES) $(EXTRA_DEFINES) $(PROTO_DEFINES) $(DEFINES)
-           CFLAGS = $(ANSICCOPTIONS) $(CDEBUGFLAGS) $(CCOPTIONS) $(ALLDEFINES)
-        LINTFLAGS = $(LINTOPTS) -DLINT $(ALLDEFINES)
-
-           LDLIBS = $(OS_LIBRARIES) $(SYS_LIBRARIES) $(EXTRA_LIBRARIES)
-
-        LDOPTIONS = $(ANSICCOPTIONS) $(CDEBUGFLAGS) $(CCOPTIONS) $(LOCAL_LDFLAGS) -L$(USRLIBDIR)
-
-   LDCOMBINEFLAGS = 	-r
-      DEPENDFLAGS =
-
-        MACROFILE = x386.cf
-           RM_CMD = $(RM) *.CKP *.ln *.BAK *.bak *.o core errs ,* *~ *.a .emacs_* tags TAGS make.log MakeOut
-
-    IMAKE_DEFINES =
-
-         IRULESRC = $(CONFIGDIR)
-        IMAKE_CMD = $(IMAKE) -DUseInstalled -I$(IRULESRC) $(IMAKE_DEFINES)
-
-     ICONFIGFILES = $(IRULESRC)/Imake.tmpl $(IRULESRC)/Imake.rules 			$(IRULESRC)/Project.tmpl $(IRULESRC)/site.def 			$(IRULESRC)/$(MACROFILE) $(EXTRA_ICONFIGFILES)
-
-# -------------------------------------------------------------------------
-# X Window System Build Parameters
-# $XFree86: mit/config/Project.tmpl,v 1.13 1993/03/27 03:32:45 dawes Exp $
-# $XConsortium: Project.tmpl,v 1.138.1.1 92/11/11 09:49:19 rws Exp $
-
-_percentC_ = %C
-
-# -------------------------------------------------------------------------
-# X Window System make variables; this need to be coordinated with rules
-
-          PATHSEP = /
-        USRLIBDIR = 	/usr/X386/lib
-           BINDIR = 	/usr/X386/bin
-          INCROOT = 	/usr/X386/include
-     BUILDINCROOT = $(TOP)
-      BUILDINCDIR = $(BUILDINCROOT)/X11
-      BUILDINCTOP = ..
-           INCDIR = $(INCROOT)/X11
-           ADMDIR = /usr/adm
-           LIBDIR = $(USRLIBDIR)/X11
-        CONFIGDIR = $(LIBDIR)/config
-       LINTLIBDIR = $(USRLIBDIR)/lint
-
-          FONTDIR = $(LIBDIR)/fonts
-         XINITDIR = $(LIBDIR)/xinit
-           XDMDIR = $(LIBDIR)/xdm
-           TWMDIR = $(LIBDIR)/twm
-          MANPATH = 	/usr/X386/man
-    MANSOURCEPATH = $(MANPATH)/man
-        MANSUFFIX = 1x
-     LIBMANSUFFIX = 3x
-           MANDIR = 	$(MANSOURCEPATH)1
-        LIBMANDIR = $(MANSOURCEPATH)3
-           NLSDIR = $(LIBDIR)/nls
-        PEXAPIDIR = $(LIBDIR)/PEX
-      XAPPLOADDIR = $(LIBDIR)/app-defaults
-       FONTCFLAGS = -t
-       LINKKITDIR = 	$(USRLIBDIR)/Server
-
-     INSTAPPFLAGS = $(INSTDATFLAGS)
-
-            IMAKE = imake
-           DEPEND = makedepend
-              RGB = rgb
-
-            FONTC = bdftopcf
-
-        MKFONTDIR = mkfontdir
-        MKDIRHIER = 	/bin/sh $(BINDIR)/mkdirhier
-
-        CONFIGSRC = $(TOP)/config
-       DOCUTILSRC = $(TOP)/doc/util
-        CLIENTSRC = $(TOP)/clients
-          DEMOSRC = $(TOP)/demos
-           LIBSRC = $(TOP)/lib
-          FONTSRC = $(TOP)/fonts
-       INCLUDESRC = $(TOP)/X11
-        SERVERSRC = $(TOP)/server
-          UTILSRC = $(TOP)/util
-        SCRIPTSRC = $(UTILSRC)/scripts
-       EXAMPLESRC = $(TOP)/examples
-       CONTRIBSRC = $(TOP)/../contrib
-           DOCSRC = $(TOP)/doc
-           RGBSRC = $(TOP)/rgb
-        DEPENDSRC = $(UTILSRC)/makedepend
-         IMAKESRC = $(CONFIGSRC)
-         XAUTHSRC = $(LIBSRC)/Xau
-          XLIBSRC = $(LIBSRC)/X
-           XMUSRC = $(LIBSRC)/Xmu
-       TOOLKITSRC = $(LIBSRC)/Xt
-       AWIDGETSRC = $(LIBSRC)/Xaw
-       OLDXLIBSRC = $(LIBSRC)/oldX
-      XDMCPLIBSRC = $(LIBSRC)/Xdmcp
-      BDFTOSNFSRC = $(FONTSRC)/bdftosnf
-      BDFTOSNFSRC = $(FONTSRC)/clients/bdftosnf
-      BDFTOPCFSRC = $(FONTSRC)/clients/bdftopcf
-     MKFONTDIRSRC = $(FONTSRC)/clients/mkfontdir
-         FSLIBSRC = $(FONTSRC)/lib/fs
-    FONTSERVERSRC = $(FONTSRC)/server
-     EXTENSIONSRC = $(TOP)/extensions
-         XILIBSRC = $(EXTENSIONSRC)/lib/xinput
-        PEXLIBSRC = $(EXTENSIONSRC)/lib/PEXlib
-      PHIGSLIBSRC = $(EXTENSIONSRC)/lib/PEX
-
-# $XFree86: mit/config/lnuxLib.tmpl,v 1.1 1993/04/16 14:06:06 dawes Exp $
-
-SHLIBLDFLAGS =
-PICFLAGS = -B/usr/dll/jump/
-
-  DEPEXTENSIONLIB =
-     EXTENSIONLIB = -lXext
-
-          DEPXLIB = $(DEPEXTENSIONLIB)
-             XLIB = $(EXTENSIONLIB) -lX11
-
-        DEPXMULIB =
-           XMULIB = -lXmu
-
-      DEPXTOOLLIB =
-         XTOOLLIB = -lXt
-
-        DEPXAWLIB =
-           XAWLIB = -lXaw
-
-        DEPXILIB =
-           XILIB = -lXi
-
-    DEPXTESTLIB =
-       XTESTLIB = -lXtst
-
-        DEPPEXLIB =
-         PEXLIB = -lPEX5
-
-        SOXLIBREV = 3.0.1
-          SOXTREV = 3.0.1
-         SOXAWREV = 3.0.1
-        SOOLDXREV = 3.0.1
-         SOXMUREV = 3.0.1
-        SOXEXTREV = 3.0.1
-      SOXINPUTREV = 3.0.1
-         SOPEXREV = 1.0.1
-
-      DEPXAUTHLIB = $(USRLIBDIR)/libXau.a
-         XAUTHLIB = 			 -lXau
-      DEPXDMCPLIB = $(USRLIBDIR)/libXdmcp.a
-         XDMCPLIB = 			 -lXdmcp
-
-       DEPOLDXLIB = $(USRLIBDIR)/liboldX.a
-          OLDXLIB = 			 -loldX
-
-        DEPPHIGSLIB = $(USRLIBDIR)/libphigs.a
-           PHIGSLIB = 			 -lphigs
-
-       DEPXBSDLIB = $(USRLIBDIR)/libXbsd.a
-          XBSDLIB = 			 -lXbsd
-
- LINTEXTENSIONLIB = $(LINTLIBDIR)/llib-lXext.ln
-         LINTXLIB = $(LINTLIBDIR)/llib-lX11.ln
-          LINTXMU = $(LINTLIBDIR)/llib-lXmu.ln
-        LINTXTOOL = $(LINTLIBDIR)/llib-lXt.ln
-          LINTXAW = $(LINTLIBDIR)/llib-lXaw.ln
-           LINTXI = $(LINTLIBDIR)/llib-lXi.ln
-          LINTPEX = $(LINTLIBDIR)/llib-lPEX5.ln
-        LINTPHIGS = $(LINTLIBDIR)/llib-lphigs.ln
-
-          DEPLIBS = $(DEPXAWLIB) $(DEPXMULIB) $(DEPXTOOLLIB) $(DEPXLIB)
-
-         DEPLIBS1 = $(DEPLIBS)
-         DEPLIBS2 = $(DEPLIBS)
-         DEPLIBS3 = $(DEPLIBS)
-
-# -------------------------------------------------------------------------
-# Imake rules for building libraries, programs, scripts, and data files
-# $XFree86: mit/config/Imake.rules,v 1.9 1993/03/23 12:56:27 dawes Exp $
-# rules:  $XConsortium: Imake.rules,v 1.123 91/09/16 20:12:16 rws Exp $
-
-# -------------------------------------------------------------------------
-# start of Imakefile
-
-# $Id$
-
-INCLUDES = -I$(TOP)/include
-
-# Imake rules go here
-
-# First, dll description to files etc
-
-MODULE = etc
-
-all::
-
-depend::
-
-clean::
-	$(RM_CMD) "#"*
-
-includes::
-
-# -------------------------------------------------------------------------
-# common rules for all Makefiles - do not edit
-
-emptyrule::
-
-clean::
-	$(RM_CMD) "#"*
-
-Makefile::
-	-@if [ -f Makefile ]; then set -x; \
-	$(RM) Makefile.bak; $(MV) Makefile Makefile.bak; \
-	else exit 0; fi
-	$(IMAKE_CMD) -DTOPDIR=$(TOP) -DCURDIR=$(CURRENT_DIR)
-
-tags::
-	$(TAGS) -w *.[ch]
-	$(TAGS) -xw *.[ch] > TAGS
-
-# -------------------------------------------------------------------------
-# empty rules for directories that do not have SUBDIRS - do not edit
-
-install::
-	@echo "install in $(CURRENT_DIR) done"
-
-install.man::
-	@echo "install.man in $(CURRENT_DIR) done"
-
-install.linkkit::
-	@echo "install.linkkit in $(CURRENT_DIR) done"
-
-Makefiles::
-
-includes::
-
-# -------------------------------------------------------------------------
-# dependencies generated by makedepend
-
diff --git a/if1632/Imakefile b/if1632/Imakefile
index 4c36d99..6803aaa 100644
--- a/if1632/Imakefile
+++ b/if1632/Imakefile
@@ -1,3 +1,4 @@
+#include "../autoconf.h"
 #include "../Wine.tmpl"
 
 MODULE = if1632
@@ -28,6 +29,7 @@
 MakeDllFromSpec(unixlib,$(TOP)/$(MODULE))
 MakeDllFromSpec(user,$(TOP)/$(MODULE))
 MakeDllFromSpec(win87em,$(TOP)/$(MODULE))
+MakeDllFromSpec(winsock,$(TOP)/$(MODULE))
 
 /*
  * Yes I know *.o is not very clever, but can you do it cleaner ?
@@ -37,7 +39,7 @@
 $(TOP)/$(MODULE).o: $(OBJS)
 
 clean::
-	$(RM) dll*
+	$(RM) dll* dtb*
 
 depend::
 
diff --git a/if1632/Makefile b/if1632/Makefile
deleted file mode 100644
index 3607324..0000000
--- a/if1632/Makefile
+++ /dev/null
@@ -1,58 +0,0 @@
-CFLAGS=$(COPTS) $(DEBUGOPTS) -I$(INCLUDE_DIR)
-
-BUILDOBJS=dll_kernel.o dll_user.o dll_gdi.o dll_unixlib.o \
-	  dll_win87em.o dll_shell.o dll_sound.o dll_keyboard.o\
-	  dll_kernel_tab.o dll_user_tab.o dll_gdi_tab.o dll_unixlib_tab.o \
-	  dll_win87em_tab.o dll_shell_tab.o \
-	  dll_sound_tab.o dll_keyboard_tab.o
-
-MUST_BE_LINKED_FIRST=call.o $(BUILDOBJS)
-
-OBJS=$(MUST_BE_LINKED_FIRST) callback.o relay.o
-
-# Uncomment the following 2 lines for use with FreeBSD
-# %.o: %.S
-#	$(CC) $(ASFLAGS) $(CPPFLAGS) $(TARGET_MACH) $(COPTS) -c -o $@ $<
-
-default: if1632.o
-
-if1632.o: $(OBJS)
-	$(LD) -r -o if1632.o $(OBJS)
-
-clean:
-	rm -f *.o *~ *.s dll_* *.a *#
-
-dll_kernel.S dll_kernel_tab.c: ../tools/build kernel.spec
-	../tools/build kernel.spec
-
-dll_user.S dll_user_tab.c: ../tools/build user.spec
-	../tools/build user.spec
-
-dll_gdi.S dll_gdi_tab.c: ../tools/build gdi.spec
-	../tools/build gdi.spec
-
-dll_unixlib.S dll_unixlib_tab.c: ../tools/build unixlib.spec
-	../tools/build unixlib.spec
-
-dll_win87em.S dll_win87em_tab.c: ../tools/build win87em.spec
-	../tools/build win87em.spec
-
-dll_shell.S dll_shell_tab.c: ../tools/build shell.spec
-	../tools/build shell.spec
-
-dll_sound.S dll_sound_tab.c: ../tools/build sound.spec
-	../tools/build sound.spec
-
-dll_keyboard.S dll_keyboard_tab.c: ../tools/build keyboard.spec
-	../tools/build keyboard.spec
-
-depend:
-	$(CC) $(CFLAGS) -M *.c > .depend
-
-ifeq (.depend,$(wildcard .depend))
-include .depend
-endif
-
-
-
-
diff --git a/if1632/call.S b/if1632/call.S
index 8853496..5b49777 100644
--- a/if1632/call.S
+++ b/if1632/call.S
@@ -102,11 +102,11 @@
 	movw	%ax,%ss
 	movl	%esp,%eax
 	movl	%eax,%ebp
-#if 1
 	movw	$UDATASEL,%ax
 	movw	%ax,%fs
 	movw	%ax,%gs
-#endif	
+	movw	%ds,%ax
+
 	/*
 	 * Call entry point
 	 */
diff --git a/if1632/gdi.spec b/if1632/gdi.spec
index 16a5548..144e0df 100644
--- a/if1632/gdi.spec
+++ b/if1632/gdi.spec
@@ -33,9 +33,12 @@
 23  pascal Arc(word s_word s_word s_word s_word s_word s_word s_word s_word)
 	   Arc(1 2 3 4 5 6 7 8 9)
 24  pascal Ellipse(word s_word s_word s_word s_word) Ellipse(1 2 3 4 5)
+25  pascal FloodFill(word word word long) FloodFill(1 2 3 4)
 26  pascal Pie(word s_word s_word s_word s_word s_word s_word s_word s_word)
 	   Pie(1 2 3 4 5 6 7 8 9)
 27  pascal Rectangle(word s_word s_word s_word s_word) Rectangle(1 2 3 4 5)
+28  pascal RoundRect(word s_word s_word s_word s_word s_word s_word)
+	   RoundRect(1 2 3 4 5 6 7)
 29  pascal PatBlt(word s_word s_word s_word s_word long) PatBlt(1 2 3 4 5 6)
 30  pascal SaveDC(word) SaveDC(1)
 31  pascal SetPixel(word s_word s_word long) SetPixel(1 2 3 4)
@@ -135,6 +138,7 @@
 346 pascal SetTextAlign(word word) SetTextAlign(1 2)
 348 pascal Chord(word s_word s_word s_word s_word s_word s_word s_word s_word)
 	   Chord(1 2 3 4 5 6 7 8 9)
+349 pascal SetMapperFlags(word word) SetMapperFlags(1 2)
 350 pascal GetCharWidth(word word word ptr) GetCharWidth(1 2 3 4)
 360 pascal CreatePalette(ptr) CreatePalette(1)
 363 pascal GetPaletteEntries(word word word ptr) GetPaletteEntries(1 2 3 4)
diff --git a/if1632/kernel.spec b/if1632/kernel.spec
index 15021aa..a3f9dd2 100644
--- a/if1632/kernel.spec
+++ b/if1632/kernel.spec
@@ -4,7 +4,8 @@
 id	1
 length	415
 
-3   return GetVersion 0 0x301
+3   pascal GetVersion() GetVersion()
+#return GetVersion 0 0x301
 4   pascal LocalInit(word word word) LocalInit(1 2 3)
 5   pascal LocalAlloc(word word) LocalAlloc(1 2)
 6   pascal LocalReAlloc(word word word) LocalReAlloc(1 2 3)
@@ -30,7 +31,10 @@
 30  pascal WaitEvent(word) KERNEL_WaitEvent(1)
 34  pascal SetTaskQueue(word word) SetTaskQueue(1 2)
 35  pascal GetTaskQueue(word) GetTaskQueue(1)
-49  pascal GetModuleFileName(word ptr s_word) KERNEL_GetModuleFileName(1 2 3)
+36  pascal GetCurrentTask() GetCurrentTask()
+47  pascal GetModuleHandle(ptr) GetModuleHandle(1)
+48  pascal GetModuleUsage(word) GetModuleUsage(1)
+49  pascal GetModuleFileName(word ptr s_word) GetModuleFileName(1 2 3)
 50  pascal GetProcAddress(word ptr) GetProcAddress(1 2)
 51  pascal MakeProcInstance(ptr word) CALLBACK_MakeProcInstance(1 2)
 52  pascal FreeProcInstance(ptr) FreeProcInstance(1)
@@ -42,13 +46,13 @@
 62  pascal LockResource(word) LockResource(1)
 63  pascal FreeResource(word) FreeResource(1)
 64  pascal AccessResource(word word) AccessResource(1 2)
-74  pascal OpenFile(ptr ptr word) KERNEL_OpenFile(1 2 3)
-81  pascal _lclose(word) KERNEL__lclose(1)
-82  pascal _lread(word ptr word) KERNEL__lread(1 2 3)
-83  pascal _lcreate(ptr word) KERNEL__lcreate(1 2)
-84  pascal _llseek(word long word) KERNEL__llseek(1 2 3)
-85  pascal _lopen(ptr word) KERNEL__lopen(1 2)
-86  pascal _lwrite(word ptr word) KERNEL__lwrite(1 2 3)
+74  pascal OpenFile(ptr ptr word) OpenFile(1 2 3)
+81  pascal _lclose(word) _lclose(1)
+82  pascal _lread(word ptr word) _lread(1 2 3)
+83  pascal _lcreate(ptr word) _lcreate(1 2)
+84  pascal _llseek(word long word) _llseek(1 2 3)
+85  pascal _lopen(ptr word) _lopen(1 2)
+86  pascal _lwrite(word ptr word) _lwrite(1 2 3)
 88  pascal lstrcpy(ptr ptr) lstrcpy(1 2)
 89  pascal lstrcat(ptr ptr) lstrcat(1 2)
 90  pascal lstrlen(ptr) lstrlen(1)
@@ -58,10 +62,10 @@
 92  pascal GetTempDrive(byte) GetTempDrive(1)
 95  pascal LoadLibrary(ptr) LoadLibrary(1)
 96  pascal FreeLibrary(word) FreeLibrary(1)
-97  pascal GetTempFileName(byte ptr word ptr) GetTempDrive(1 2 3 4)
+97  pascal GetTempFileName(byte ptr word ptr) GetTempFileName(1 2 3 4)
 102 register DOS3Call(word word word word word
 		      word word word word word) 
-	     KERNEL_DOS3Call()
+	     DOS3Call()
 107 pascal SetErrorMode(word) SetErrorMode(1)
 111 pascal GlobalWire(word) GlobalLock(1)
 112 pascal GlobalUnWire(word) GlobalUnlock(1)
@@ -74,10 +78,12 @@
 129 pascal WritePrivateProfileString(ptr ptr ptr ptr)
 	   WritePrivateProfileString(1 2 3 4)
 131 pascal GetDOSEnvironment() GetDOSEnvironment()
-132 return GetWinFlags 0 0x413
+132 pascal GetWinFlags() GetWinFlags()
+#132 return GetWinFlags 0 0x413
 134 pascal GetWindowsDirectory(ptr word) GetWindowsDirectory(1 2)
 135 pascal GetSystemDirectory(ptr word) GetSystemDirectory(1 2)
 136 pascal GetDriveType(byte) GetWindowsDirectory(1)
+137 pascal FatalAppExit(word ptr) FatalAppExit(1 2)
 152 return GetNumTasks 0 1
 154 return GlobalNotify 4 0
 163 pascal GlobalLRUOldest(word) ReturnArg(1)
diff --git a/if1632/relay.c b/if1632/relay.c
index 52f7d42..92d5622 100644
--- a/if1632/relay.c
+++ b/if1632/relay.c
@@ -18,10 +18,11 @@
 #include "segmem.h"
 #include "prototypes.h"
 #include "dlls.h"
+#include "options.h"
 
-/* #define DEBUG_RELAY /* */
+#define DEBUG_RELAY /* */
 
-#define N_BUILTINS	8
+#define N_BUILTINS	9
 
 struct dll_name_table_entry_s dll_builtin_table[N_BUILTINS] =
 {
@@ -33,6 +34,7 @@
     { "SHELL",   SHELL_table,   256, 6 },
     { "SOUND",   SOUND_table,    20, 7 },
     { "KEYBOARD",KEYBOARD_table,137, 8 },
+    { "WINSOCK", WINSOCK_table, 155, 9 },
 };
 
 unsigned short *Stack16Frame;
@@ -87,6 +89,7 @@
     dll_p   = &dll_builtin_table[dll_id].dll_table[ordinal];
 
 #ifdef DEBUG_RELAY
+    if (Options.relay_debug)
     {
 	unsigned int *ret_addr;
 	unsigned short *stack_p;
@@ -185,10 +188,13 @@
 			  arg_table[15]);
 
 #ifdef DEBUG_RELAY
-    printf("Returning %08.8x from %s (%s.%d)\n",
-	   ret_val,
-	   dll_p->export_name,
-	   dll_builtin_table[dll_id].dll_name, ordinal);
+    if (Options.relay_debug)
+    {
+	printf("Returning %08.8x from %s (%s.%d)\n",
+	       ret_val,
+	       dll_p->export_name,
+	       dll_builtin_table[dll_id].dll_name, ordinal);
+    }
 #endif
 
     return ret_val;
diff --git a/if1632/user.spec b/if1632/user.spec
index 5303a75..d6f213a 100644
--- a/if1632/user.spec
+++ b/if1632/user.spec
@@ -11,7 +11,7 @@
 11  pascal SetSystemTimer(word word word ptr) SetSystemTimer(1 2 3 4)
 12  pascal KillTimer(word word) KillTimer(1 2)
 13  pascal GetTickCount() GetTickCount()
-14  return GetTimerResolution 0 1000
+14  pascal GetTimerResolution() GetTimerResolution()
 15  pascal GetCurrentTime() GetTickCount()
 16  pascal ClipCursor(ptr) ClipCursor(1)
 17  pascal GetCursorPos(ptr) GetCursorPos(1)
@@ -121,9 +121,23 @@
 134 pascal SetWindowWord(word s_word word) SetWindowWord(1 2 3)
 135 pascal GetWindowLong(word s_word) GetWindowLong(1 2)
 136 pascal SetWindowLong(word s_word long) SetWindowLong(1 2 3)
+137 pascal OpenClipboard(word) OpenClipboard(1)
+138 pascal CloseClipboard() CloseClipboard()
+139 pascal EmptyClipboard() EmptyClipboard()
+140 pascal GetClipboardOwner() GetClipboardOwner()
+141 pascal SetClipboardData(word word) SetClipboardData(1 2)
+142 pascal GetClipboardData(word) GetClipboardData(1)
+143 pascal CountClipboardFormats() CountClipboardFormats()
+144 pascal EnumClipboardFormats(word) EnumClipboardFormats(1)
+145 pascal RegisterClipboardFormat(ptr) RegisterClipboardFormat(1)
+146 pascal GetClipboardFormatName(word ptr s_word) GetClipboardFormatName(1 2 3)
+147 pascal SetClipboardViewer(word) SetClipboardViewer(1)
+148 pascal GetClipboardViewer() GetClipboardViewer()
+149 pascal ChangeClipboardChain(word ptr) ChangeClipboardChain(1 2)
 150 pascal LoadMenu(word ptr) LoadMenu(1 2)
 151 pascal CreateMenu() CreateMenu()
 152 pascal DestroyMenu(word) DestroyMenu(1)
+153 pascal ChangeMenu(word word ptr word word) ChangeMenu(1 2 3 4 5)
 154 pascal CheckMenuItem(word word word) CheckMenuItem(1 2 3)
 155 pascal EnableMenuItem(word word word) EnableMenuItem(1 2 3)
 156 pascal GetSystemMenu(word word) GetSystemMenu(1 2)
@@ -136,7 +150,7 @@
 165 pascal SetCaretPos(word word) SetCaretPos(1 2)
 166 pascal HideCaret(word) HideCaret(1)
 167 pascal ShowCaret(word) ShowCaret(1)
-166 pascal SetCaretBlinkTime(word) SetCaretBlinkTime(1)
+168 pascal SetCaretBlinkTime(word) SetCaretBlinkTime(1)
 169 pascal GetCaretBlinkTime() GetCaretBlinkTime()
 171 pascal WinHelp(word word long) WinHelp(1 2 3)
 173 pascal LoadCursor(word ptr) LoadCursor(1 2)
@@ -152,6 +166,7 @@
 183 pascal GetCaretPos(ptr) GetCaretPos(1)
 190 pascal GetUpdateRect(word ptr word) GetUpdateRect(1 2 3)
 191 pascal ChildWindowFromPoint(word long) ChildWindowFromPoint(1 2)
+193 pascal IsClipboardFormatAvailable(word) IsClipboardFormatAvailable(1)
 200 pascal OpenComm(ptr word word) OpenComm(1 2 3)
 201 pascal SetCommState(ptr) SetCommState(1)
 202 pascal GetCommState(word ptr) GetCommState(1 2)
@@ -171,6 +186,7 @@
 218 pascal DialogBoxIndirect(word word word ptr) DialogBoxIndirect(1 2 3 4)
 219 pascal CreateDialogIndirect(word ptr word ptr)
 	   CreateDialogIndirect(1 2 3 4)
+220 pascal LoadMenuIndirect(ptr) LoadMenuIndirect(1)
 221 pascal ScrollDC(word s_word s_word ptr ptr word ptr) 
 	   ScrollDC(1 2 3 4 5 6 7)
 227 pascal GetNextDlgGroupItem(word word word) GetNextDlgGroupItem(1 2 3)
@@ -181,6 +197,7 @@
            SetWindowPos(1 2 3 4 5 6 7)
 236 pascal GetCapture() GetCapture()
 237 pascal GetUpdateRgn(word word word) GetUpdateRgn(1 2 3)
+238 pascal ExcludeUpdateRgn(word word) ExcludeUpdateRgn(1 2)
 239 pascal DialogBoxParam(word ptr word ptr long) DialogBoxParam(1 2 3 4 5)
 240 pascal DialogBoxIndirectParam(word word word ptr long)
 	   DialogBoxIndirectParam(1 2 3 4 5)
@@ -189,6 +206,7 @@
 242 pascal CreateDialogIndirectParam(word ptr word ptr long)
 	   CreateDialogIndirectParam(1 2 3 4 5)
 244 pascal EqualRect(ptr ptr) EqualRect(1 2)
+248 pascal GetOpenClipboardWindow() GetOpenClipboardWindow()
 258 pascal MapWindowPoints(word word ptr word) MapWindowPoints(1 2 3 4)
 262 pascal GetWindow(word word) GetWindow(1 2)
 266 pascal SetMessageQueue(word) SetMessageQueue(1)
@@ -199,6 +217,8 @@
 283 pascal RealizePalette(word) RealizePalette(1)
 286 pascal GetDesktopWindow() GetDesktopWindow()
 288 pascal GetMessageExtraInfo() GetMessageExtraInfo()
+290 pascal RedrawWindow(word ptr word word) RedrawWindow(1 2 3 4)
+308 pascal DefDlgProc(word word word long) DefDlgProc(1 2 3 4)
 319 pascal ScrollWindowEx(word s_word s_word ptr ptr word ptr word) 
 	   ScrollWindowEx(1 2 3 4 5 6 7 8)
 324 pascal FillWindow(word word word word) FillWindow(1 2 3 4)
@@ -209,6 +229,8 @@
 370 pascal GetWindowPlacement(word ptr) GetWindowPlacement(1 2)
 371 pascal SetWindowPlacement(word ptr) SetWindowPlacement(1 2)
 373 pascal SubtractRect(ptr ptr ptr) SubtractRect(1 2 3)
+402 pascal GetPriorityClipboardFormat(word ptr s_word) 
+	GetPriorityClipboardFormat(1 2 3)
 403 pascal UnregisterClass(ptr word) UnregisterClass(1 2)
 404 pascal GetClassInfo(word ptr ptr) GetClassInfo(1 2 3)
 406 pascal CreateCursor(word word word word word ptr ptr) 
@@ -221,6 +243,7 @@
 415 pascal CreatePopupMenu() CreatePopupMenu()
 416 pascal TrackPopupMenu(word word word word word word ptr) 
 	   TrackPopupMenu(1 2 3 4 5 6 7)
+417 pascal GetMenuCheckMarkDimensions() GetMenuCheckMarkDimensions()
 418 pascal SetMenuItemBitmaps(word word word word word) 
 	   SetMenuItemBitmaps(1 2 3 4 5)
 420 pascal wsprintf(ptr ptr) wsprintf(1 2)
@@ -246,3 +269,4 @@
 471 pascal lstrcmpi(ptr ptr) lstrcmpi(1 2)
 472 pascal AnsiNext(ptr) AnsiNext(1 )
 473 pascal AnsiPrev(ptr ptr) AnsiPrev(1 2)
+483 pascal SystemParametersInfo(word word ptr word) SystemParametersInfo(1 2 3 4)
diff --git a/if1632/winsock.spec b/if1632/winsock.spec
new file mode 100644
index 0000000..ba0e5fb
--- /dev/null
+++ b/if1632/winsock.spec
@@ -0,0 +1,71 @@
+#  
+#         File: winsock.def 
+#       System: MS-Windows 3.x 
+#      Summary: Module definition file for Windows Sockets DLL.  
+#  
+name	winsock
+id	9
+length	155
+
+1   pascal accept(long ptr ptr) Winsock_accept(1 2 3)
+2   pascal bind(long ptr word) Winsock_bind(1 2 3)
+3   pascal closesocket(long) Winsock_closesocket(1)
+4   pascal connect(long ptr word) Winsock_connect(1 2 3)
+5   pascal getpeername(long ptr ptr) Winsock_getpeername(1 2 3)
+6   pascal getsockname(long ptr ptr) Winsock_getsockname(1 2 3)
+7   pascal getsockopt(long word word ptr ptr)
+           Winsock_getsockopt(1 2 3 4 5)
+8   pascal htonl(long) Winsock_htonl(1)
+9   pascal htons(word) Winsock_htons(1)
+10  pascal inet_addr(ptr) Winsock_inet_addr(1)
+11  pascal inet_ntoa(long) Winsock_inet_ntoa(1)
+12  pascal ioctlsocket(long long ptr) Winsock_ioctlsocket(1 2 3)
+13  pascal listen(long word) Winsock_listen(1 2)
+14  pascal ntohl(long) Winsock_ntohl(1)
+15  pascal ntohs(word) Winsock_ntohs(1)
+16  pascal recv(long ptr word word) Winsock_recv(1 2 3 4)
+17  pascal recvfrom(long ptr word word ptr ptr)
+           Winsock_recvfrom(1 2 3 4 5 6)
+18  pascal select(word ptr ptr ptr ptr word)
+           Winsock_select(1 2 3 4 5 6)
+19  pascal send(long ptr word word) Winsock_send(1 2 3 4)
+20  pascal sendto(long ptr word word ptr ptr)
+           Winsock_sendto(1 2 3 4 5 6)
+21  pascal setsockopt(long word word ptr word)
+           Winsock_setsockopt(1 2 3 4 5)
+22  pascal shutdown(long word) Winsock_shutdown(1 2)
+23  pascal socket(word word word) Winsock_socket(1 2 3)
+
+51  pascal gethostbyaddr(ptr word word) Winsock_gethostbyaddr(1 2 3)
+52  pascal gethostbyname(ptr) Winsock_gethostbyname(1)
+53  pascal getprotobyname(ptr) Winsock_getprotobyname(1)
+54  pascal getprotobynumber(word) Winsock_getprotobynumber(1)
+55  pascal getservbyname(ptr) Winsock_getservbyname(1)
+56  pascal getservbyport(word ptr) Winsock_getservbyport(1 2)
+57  pascal gethostname(ptr word) Winsock_gethostname(1 2)
+
+101 pascal WSAAsyncSelect(long word word long)
+           WSAAsyncSelect(1 2 3 4)
+102 pascal WSAAsyncGetHostByAddr(word word ptr word word ptr word)
+           WSAAsyncGetHostByAddr(1 2 3 4 5 6 7)
+103 pascal WSAAsyncGetHostByName(word word ptr ptr word)
+           WSAAsyncGetHostByName(1 2 3 4 5)
+104 pascal WSAAsyncGetProtoByNumber(word word word ptr word)
+           WSAAsyncGetProtoByNumber(1 2 3 4 5)
+105 pascal WSAAsyncGetProtoByName(word word ptr ptr word)
+           WSAAsyncGetProtoByName(1 2 3 4 5)
+106 pascal WSAAsyncGetServByPort(word word word ptr ptr word)
+           WSAAsyncGetServByPort(1 2 3 4 5 6)
+107 pascal WSAAsyncGetServByName(word word ptr ptr ptr word)
+           WSAAsyncGetServByName(1 2 3 4 5 6)
+108 pascal WSACancelAsyncRequest(word) WSACancelAsyncRequest(1)
+109 pascal WSASetBlockingHook() WSASetBlockingHook()
+110 pascal WSAUnhookBlockingHook() WSAUnhookBlockingHook()
+111 pascal WSAGetLastError() WSAGetLastError()
+112 pascal WSASetLastError(word) WSASetLastError(1)
+113 pascal WSACancelBlockingCall() WSACancelBlockingCall()
+114 pascal WSAIsBlocking() WSAIsBlocking()
+115 pascal WSAStartup(word ptr) WSAStartup(1 2)
+116 pascal WSACleanup() WSACleanup()
+
+151 pascal __WSAFDIsSet(long ptr) WSAFDIsSet(1 2)
diff --git a/include/Makefile b/include/Makefile
deleted file mode 100644
index 97bc6f4..0000000
--- a/include/Makefile
+++ /dev/null
@@ -1,360 +0,0 @@
-# Makefile generated by imake - do not edit!
-# $XConsortium: imake.c,v 1.65 91/07/25 17:50:17 rws Exp $
-
-# -------------------------------------------------------------------------
-# Makefile generated from "Imake.tmpl" and <Imakefile>
-# $XFree86: mit/config/Imake.tmpl,v 1.17 1993/06/03 15:26:36 dawes Exp $
-# $XConsortium: Imake.tmpl,v 1.139 91/09/16 08:52:48 rws Exp $
-#
-# Platform-specific parameters may be set in the appropriate <vendor>.cf
-# configuration files.  Site-specific parameters should be set in the file
-# site.def.  Full rebuilds are recommended if any parameters are changed.
-#
-# If your C preprocessor does not define any unique symbols, you will need
-# to set BOOTSTRAPCFLAGS when rebuilding imake (usually when doing
-# "make World" the first time).
-#
-
-# -------------------------------------------------------------------------
-# site-specific configuration parameters that need to come before
-# the platform-specific parameters - edit site.def to change
-
-# $XFree86: mit/config/site.def,v 1.65 1993/06/04 16:02:47 dawes Exp $
-# site:  $XConsortium: site.def,v 1.2 91/07/30 20:26:44 rws Exp $
-
-# obz: changes for making Linux distribution
-
-# -------------------------------------------------------------------------
-# platform-specific configuration parameters - edit x386.cf to change
-
-# $XFree86: mit/config/x386.cf,v 1.90 1993/06/04 16:02:50 dawes Exp $
-# platform:  $XConsortium: x386.cf,v 1.7 91/08/16 19:30:10 gildea Exp $
-
-# -------------------------------------------------------------------------
-# XFree86 version definition
-# $XFree86: mit/config/xf86_vers.def,v 1.5 1993/06/01 09:12:47 dawes Exp $
-
-# -------------------------------------------------------------------------
-# XFree86 version: 1300
-# -------------------------------------------------------------------------
-
-# $XFree86: mit/config/lnuxLib.rules,v 1.2 1993/06/02 13:48:12 dawes Exp $
-
-DLL_BINDIR = /usr/dll/bin
-
-# operating system:  		Linux
-
-# -------------------------------------------------------------------------
-# site-specific configuration parameters that go after
-# the platform-specific parameters - edit site.def to change
-
-# $XFree86: mit/config/site.def,v 1.65 1993/06/04 16:02:47 dawes Exp $
-# site:  $XConsortium: site.def,v 1.2 91/07/30 20:26:44 rws Exp $
-
-# obz: changes for making Linux distribution
-
-            SHELL = 	/bin/sh
-
-              TOP = ../.
-      CURRENT_DIR = ./include
-
-               AR = ar clq
-  BOOTSTRAPCFLAGS =
-               CC = 		gcc
-               AS = as
-
-              LEX = 		flex
-
-             YACC = 		bison -y
-
-         COMPRESS = compress
-              CPP = 		/lib/cpp $(STD_CPP_DEFINES)
-    PREPROCESSCMD = 	/lib/cpp $(STD_CPP_DEFINES)
-          INSTALL = install
-               LD = ld
-             LINT = lint
-      LINTLIBFLAG = -C
-         LINTOPTS = -axz
-               LN = ln -s
-             MAKE = make
-               MV = mv
-               CP = cp
-
-           RANLIB = ranlib
-  RANLIBINSTFLAGS =
-
-               RM = rm -f
-            TROFF = psroff
-         MSMACROS = -ms
-              TBL = tbl
-              EQN = eqn
-     STD_INCLUDES =
-  STD_CPP_DEFINES = -traditional 		-D_POSIX_SOURCE -D_BSD_SOURCE -D_GNU_SOURCE 	-Dlinux
-      STD_DEFINES = 		-D_POSIX_SOURCE -D_BSD_SOURCE -D_GNU_SOURCE 	-Dlinux
- EXTRA_LOAD_FLAGS =
-  EXTRA_LIBRARIES =
-     OS_LIBRARIES =
-             TAGS = ctags
-
-    SHAREDCODEDEF =
-         SHLIBDEF =
-
-    PROTO_DEFINES = -DFUNCPROTO=11 -DNARROWPROTO
-
-     INSTPGMFLAGS = -s
-
-     INSTBINFLAGS = -m 0755
-     INSTUIDFLAGS = -s -m 4755
-     INSTLIBFLAGS = -m 0644
-     INSTINCFLAGS = -m 0444
-     INSTMANFLAGS = -m 0444
-     INSTDATFLAGS = -m 0444
-    INSTKMEMFLAGS = -s -m 4755
-
-      PROJECTROOT = 	/usr/X386
-
-     TOP_INCLUDES = -I$(INCROOT)
-
-      CDEBUGFLAGS = -O2
-        CCOPTIONS = -m486 -DNO_ASM -fwritable-strings
-    ANSICCOPTIONS =
-
-      ALLINCLUDES = $(INCLUDES) $(EXTRA_INCLUDES) $(TOP_INCLUDES) $(STD_INCLUDES)
-       ALLDEFINES = $(ALLINCLUDES) $(STD_DEFINES) $(EXTRA_DEFINES) $(PROTO_DEFINES) $(DEFINES)
-           CFLAGS = $(ANSICCOPTIONS) $(CDEBUGFLAGS) $(CCOPTIONS) $(ALLDEFINES)
-        LINTFLAGS = $(LINTOPTS) -DLINT $(ALLDEFINES)
-
-           LDLIBS = $(OS_LIBRARIES) $(SYS_LIBRARIES) $(EXTRA_LIBRARIES)
-
-        LDOPTIONS = $(ANSICCOPTIONS) $(CDEBUGFLAGS) $(CCOPTIONS) $(LOCAL_LDFLAGS) -L$(USRLIBDIR)
-
-   LDCOMBINEFLAGS = 	-r
-      DEPENDFLAGS =
-
-        MACROFILE = x386.cf
-           RM_CMD = $(RM) *.CKP *.ln *.BAK *.bak *.o core errs ,* *~ *.a .emacs_* tags TAGS make.log MakeOut
-
-    IMAKE_DEFINES =
-
-         IRULESRC = $(CONFIGDIR)
-        IMAKE_CMD = $(IMAKE) -DUseInstalled -I$(IRULESRC) $(IMAKE_DEFINES)
-
-     ICONFIGFILES = $(IRULESRC)/Imake.tmpl $(IRULESRC)/Imake.rules 			$(IRULESRC)/Project.tmpl $(IRULESRC)/site.def 			$(IRULESRC)/$(MACROFILE) $(EXTRA_ICONFIGFILES)
-
-# -------------------------------------------------------------------------
-# X Window System Build Parameters
-# $XFree86: mit/config/Project.tmpl,v 1.13 1993/03/27 03:32:45 dawes Exp $
-# $XConsortium: Project.tmpl,v 1.138.1.1 92/11/11 09:49:19 rws Exp $
-
-_percentC_ = %C
-
-# -------------------------------------------------------------------------
-# X Window System make variables; this need to be coordinated with rules
-
-          PATHSEP = /
-        USRLIBDIR = 	/usr/X386/lib
-           BINDIR = 	/usr/X386/bin
-          INCROOT = 	/usr/X386/include
-     BUILDINCROOT = $(TOP)
-      BUILDINCDIR = $(BUILDINCROOT)/X11
-      BUILDINCTOP = ..
-           INCDIR = $(INCROOT)/X11
-           ADMDIR = /usr/adm
-           LIBDIR = $(USRLIBDIR)/X11
-        CONFIGDIR = $(LIBDIR)/config
-       LINTLIBDIR = $(USRLIBDIR)/lint
-
-          FONTDIR = $(LIBDIR)/fonts
-         XINITDIR = $(LIBDIR)/xinit
-           XDMDIR = $(LIBDIR)/xdm
-           TWMDIR = $(LIBDIR)/twm
-          MANPATH = 	/usr/X386/man
-    MANSOURCEPATH = $(MANPATH)/man
-        MANSUFFIX = 1x
-     LIBMANSUFFIX = 3x
-           MANDIR = 	$(MANSOURCEPATH)1
-        LIBMANDIR = $(MANSOURCEPATH)3
-           NLSDIR = $(LIBDIR)/nls
-        PEXAPIDIR = $(LIBDIR)/PEX
-      XAPPLOADDIR = $(LIBDIR)/app-defaults
-       FONTCFLAGS = -t
-       LINKKITDIR = 	$(USRLIBDIR)/Server
-
-     INSTAPPFLAGS = $(INSTDATFLAGS)
-
-            IMAKE = imake
-           DEPEND = makedepend
-              RGB = rgb
-
-            FONTC = bdftopcf
-
-        MKFONTDIR = mkfontdir
-        MKDIRHIER = 	/bin/sh $(BINDIR)/mkdirhier
-
-        CONFIGSRC = $(TOP)/config
-       DOCUTILSRC = $(TOP)/doc/util
-        CLIENTSRC = $(TOP)/clients
-          DEMOSRC = $(TOP)/demos
-           LIBSRC = $(TOP)/lib
-          FONTSRC = $(TOP)/fonts
-       INCLUDESRC = $(TOP)/X11
-        SERVERSRC = $(TOP)/server
-          UTILSRC = $(TOP)/util
-        SCRIPTSRC = $(UTILSRC)/scripts
-       EXAMPLESRC = $(TOP)/examples
-       CONTRIBSRC = $(TOP)/../contrib
-           DOCSRC = $(TOP)/doc
-           RGBSRC = $(TOP)/rgb
-        DEPENDSRC = $(UTILSRC)/makedepend
-         IMAKESRC = $(CONFIGSRC)
-         XAUTHSRC = $(LIBSRC)/Xau
-          XLIBSRC = $(LIBSRC)/X
-           XMUSRC = $(LIBSRC)/Xmu
-       TOOLKITSRC = $(LIBSRC)/Xt
-       AWIDGETSRC = $(LIBSRC)/Xaw
-       OLDXLIBSRC = $(LIBSRC)/oldX
-      XDMCPLIBSRC = $(LIBSRC)/Xdmcp
-      BDFTOSNFSRC = $(FONTSRC)/bdftosnf
-      BDFTOSNFSRC = $(FONTSRC)/clients/bdftosnf
-      BDFTOPCFSRC = $(FONTSRC)/clients/bdftopcf
-     MKFONTDIRSRC = $(FONTSRC)/clients/mkfontdir
-         FSLIBSRC = $(FONTSRC)/lib/fs
-    FONTSERVERSRC = $(FONTSRC)/server
-     EXTENSIONSRC = $(TOP)/extensions
-         XILIBSRC = $(EXTENSIONSRC)/lib/xinput
-        PEXLIBSRC = $(EXTENSIONSRC)/lib/PEXlib
-      PHIGSLIBSRC = $(EXTENSIONSRC)/lib/PEX
-
-# $XFree86: mit/config/lnuxLib.tmpl,v 1.1 1993/04/16 14:06:06 dawes Exp $
-
-SHLIBLDFLAGS =
-PICFLAGS = -B/usr/dll/jump/
-
-  DEPEXTENSIONLIB =
-     EXTENSIONLIB = -lXext
-
-          DEPXLIB = $(DEPEXTENSIONLIB)
-             XLIB = $(EXTENSIONLIB) -lX11
-
-        DEPXMULIB =
-           XMULIB = -lXmu
-
-      DEPXTOOLLIB =
-         XTOOLLIB = -lXt
-
-        DEPXAWLIB =
-           XAWLIB = -lXaw
-
-        DEPXILIB =
-           XILIB = -lXi
-
-    DEPXTESTLIB =
-       XTESTLIB = -lXtst
-
-        DEPPEXLIB =
-         PEXLIB = -lPEX5
-
-        SOXLIBREV = 3.0.1
-          SOXTREV = 3.0.1
-         SOXAWREV = 3.0.1
-        SOOLDXREV = 3.0.1
-         SOXMUREV = 3.0.1
-        SOXEXTREV = 3.0.1
-      SOXINPUTREV = 3.0.1
-         SOPEXREV = 1.0.1
-
-      DEPXAUTHLIB = $(USRLIBDIR)/libXau.a
-         XAUTHLIB = 			 -lXau
-      DEPXDMCPLIB = $(USRLIBDIR)/libXdmcp.a
-         XDMCPLIB = 			 -lXdmcp
-
-       DEPOLDXLIB = $(USRLIBDIR)/liboldX.a
-          OLDXLIB = 			 -loldX
-
-        DEPPHIGSLIB = $(USRLIBDIR)/libphigs.a
-           PHIGSLIB = 			 -lphigs
-
-       DEPXBSDLIB = $(USRLIBDIR)/libXbsd.a
-          XBSDLIB = 			 -lXbsd
-
- LINTEXTENSIONLIB = $(LINTLIBDIR)/llib-lXext.ln
-         LINTXLIB = $(LINTLIBDIR)/llib-lX11.ln
-          LINTXMU = $(LINTLIBDIR)/llib-lXmu.ln
-        LINTXTOOL = $(LINTLIBDIR)/llib-lXt.ln
-          LINTXAW = $(LINTLIBDIR)/llib-lXaw.ln
-           LINTXI = $(LINTLIBDIR)/llib-lXi.ln
-          LINTPEX = $(LINTLIBDIR)/llib-lPEX5.ln
-        LINTPHIGS = $(LINTLIBDIR)/llib-lphigs.ln
-
-          DEPLIBS = $(DEPXAWLIB) $(DEPXMULIB) $(DEPXTOOLLIB) $(DEPXLIB)
-
-         DEPLIBS1 = $(DEPLIBS)
-         DEPLIBS2 = $(DEPLIBS)
-         DEPLIBS3 = $(DEPLIBS)
-
-# -------------------------------------------------------------------------
-# Imake rules for building libraries, programs, scripts, and data files
-# $XFree86: mit/config/Imake.rules,v 1.9 1993/03/23 12:56:27 dawes Exp $
-# rules:  $XConsortium: Imake.rules,v 1.123 91/09/16 20:12:16 rws Exp $
-
-# -------------------------------------------------------------------------
-# start of Imakefile
-
-# $Id$
-
-INCLUDES = -I$(TOP)/include
-
-# Imake rules go here
-
-# First, dll description to files etc
-
-MODULE = include
-
-HEADERS = 	atom.h 	callback.h 	class.h 	combo.h 	cursor.h 	dce.h 	dialog.h 	dlls.h 	files.h 	gdi.h 	heap.h 	icon.h 	int21.h 	listbox.h 	menu.h 	message.h 	neexe.h 	prototypes.h 	regfunc.h 	scroll.h 	segmem.h 	user.h 	win.h 	windows.h 	wine.h
-
-all::
-
-depend::
-
-clean::
-	$(RM_CMD) "#"*
-
-includes::
-
-# -------------------------------------------------------------------------
-# common rules for all Makefiles - do not edit
-
-emptyrule::
-
-clean::
-	$(RM_CMD) "#"*
-
-Makefile::
-	-@if [ -f Makefile ]; then set -x; \
-	$(RM) Makefile.bak; $(MV) Makefile Makefile.bak; \
-	else exit 0; fi
-	$(IMAKE_CMD) -DTOPDIR=$(TOP) -DCURDIR=$(CURRENT_DIR)
-
-tags::
-	$(TAGS) -w *.[ch]
-	$(TAGS) -xw *.[ch] > TAGS
-
-# -------------------------------------------------------------------------
-# empty rules for directories that do not have SUBDIRS - do not edit
-
-install::
-	@echo "install in $(CURRENT_DIR) done"
-
-install.man::
-	@echo "install.man in $(CURRENT_DIR) done"
-
-install.linkkit::
-	@echo "install.linkkit in $(CURRENT_DIR) done"
-
-Makefiles::
-
-includes::
-
-# -------------------------------------------------------------------------
-# dependencies generated by makedepend
-
diff --git a/include/arch.h b/include/arch.h
new file mode 100644
index 0000000..50e8255
--- /dev/null
+++ b/include/arch.h
@@ -0,0 +1,17 @@
+/*
+ * Machine dependent integer conversions
+ *
+ * Copyright Miguel de Icaza, 1994
+*/
+
+#if defined (mc68000) || defined (sparc)
+#define CONV_LONG(a) (((a)&0xFF) << 24) | (((a) & 0xFF00) << 8) | (((a) & 0xFF0000) >> 8) | ((a)&0xFF000000 >> 24)
+#define CONV_SHORT(a) (((a) & 0xFF) << 8) | (((a) & 0xFF00) >> 8)
+#define CONV_CHAR_TO_LONG(x) ((x) >> 24)
+#define CONV_SHORT_TO_LONG(x) ((x) >> 16)
+#else
+#define CONV_LONG(a) (a)
+#define CONV_SHORT(a) (a)
+#define CONV_CHAR_TO_LONG(a) (a)
+#define CONV_SHORT_TO_LONG(a) (a)
+#endif
diff --git a/include/atom.h b/include/atom.h
index 61cf6b1..c6234f4 100644
--- a/include/atom.h
+++ b/include/atom.h
@@ -24,4 +24,10 @@
     HANDLE      entries[1];
 } ATOMTABLE;
 
+#ifdef WINELIB
+#define LocalAlign(flags,bytes) LocalAlloc (flags|LMEM_WINE_ALIGN,bytes)
+#else
+#define LocalAlign(flags,bytes) LocalAlloc (flags,bytes)
+#endif
+
 #endif  /* ATOM_H */
diff --git a/include/class.h b/include/class.h
index 285e81b..3812122 100644
--- a/include/class.h
+++ b/include/class.h
@@ -19,7 +19,7 @@
     ATOM         atomName;      /* Name of the class */
     HANDLE       hdce;          /* Class DCE (if CS_CLASSDC) */
     WORD         cWindows;      /* Count of existing windows of this class */
-    WNDCLASS     wc __attribute__ ((packed));  /* Class information */
+    WNDCLASS     wc WINE_PACKED;  /* Class information */
     WORD         wExtra[1];     /* Class extra bytes */
 } CLASS;
 
diff --git a/include/combo.h b/include/combo.h
index b6ea1d8..0162664 100644
--- a/include/combo.h
+++ b/include/combo.h
@@ -6,7 +6,6 @@
 typedef struct tagHEADCOMBO {
     DWORD	dwStyle;
     DWORD	dwState;
-    HWND	hWndDrop;
     HWND	hWndEdit;
     HWND	hWndLBox;
 } HEADCOMBO;
diff --git a/include/dialog.h b/include/dialog.h
index 4cfddba..b6fe1b3 100644
--- a/include/dialog.h
+++ b/include/dialog.h
@@ -9,8 +9,6 @@
 
 #include "windows.h"
 
-#define DIALOG_CLASS_NAME    "#32770"  /* Integer atom */
-
 
   /* Dialog info structure.
    * This structure is stored into the window extra bytes (cbWndExtra).
@@ -34,11 +32,11 @@
 typedef struct
 {
     DWORD     style;    
-    BYTE      nbItems __attribute__ ((packed));
-    WORD      x __attribute__ ((packed));
-    WORD      y __attribute__ ((packed));
-    WORD      cx __attribute__ ((packed));
-    WORD      cy __attribute__ ((packed));
+    BYTE      nbItems WINE_PACKED;
+    WORD      x WINE_PACKED;
+    WORD      y WINE_PACKED;
+    WORD      cx WINE_PACKED;
+    WORD      cy WINE_PACKED;
 } DLGTEMPLATEHEADER;
 
 
@@ -50,7 +48,7 @@
     WORD       cx;
     WORD       cy;
     WORD       id;
-    DWORD      style __attribute__ ((packed));
+    DWORD      style WINE_PACKED;
 } DLGCONTROLHEADER;
 
 
diff --git a/include/dlls.h b/include/dlls.h
index a0af4b0..f82ae94 100644
--- a/include/dlls.h
+++ b/include/dlls.h
@@ -13,6 +13,9 @@
     unsigned char src_type;	/* Argument type			*/
 } DLL_ARG;
 
+#define DLL	0
+#define EXE	1
+
 #define DLL_ARGTYPE_SIGNEDWORD	0
 #define DLL_ARGTYPE_WORD	1
 #define DLL_ARGTYPE_LONG	2
@@ -59,5 +62,6 @@
 extern struct dll_table_entry_s SHELL_table[];
 extern struct dll_table_entry_s SOUND_table[];
 extern struct dll_table_entry_s KEYBOARD_table[];
+extern struct dll_table_entry_s WINSOCK_table[];
 
 #endif /* DLLS_H */
diff --git a/include/gdi.h b/include/gdi.h
index b077135..c1a5671 100644
--- a/include/gdi.h
+++ b/include/gdi.h
@@ -45,25 +45,25 @@
 typedef struct tagBRUSHOBJ
 {
     GDIOBJHDR   header;
-    LOGBRUSH    logbrush __attribute__ ((packed));
+    LOGBRUSH    logbrush WINE_PACKED;
 } BRUSHOBJ;
 
 typedef struct tagPENOBJ
 {
     GDIOBJHDR   header;
-    LOGPEN      logpen __attribute__ ((packed));
+    LOGPEN      logpen WINE_PACKED;
 } PENOBJ;
 
 typedef struct tagPALETTEOBJ
 {
     GDIOBJHDR   header;
-    LOGPALETTE  logpalette __attribute__ ((packed));
+    LOGPALETTE  logpalette WINE_PACKED;
 } PALETTEOBJ;
 
 typedef struct tagFONTOBJ
 {
     GDIOBJHDR   header;
-    LOGFONT     logfont __attribute__ ((packed));
+    LOGFONT     logfont WINE_PACKED;
 } FONTOBJ;
 
 typedef struct tagBITMAPOBJ
@@ -271,12 +271,21 @@
 
   /* GDI local heap */
 
+#ifdef WINELIB
+
+#define GDI_HEAP_ALLOC(f,size) LocalAlloc (f,size)
+#define GDI_HEAP_ADDR(handle)  LocalLock (handle)
+#define GDI_HEAP_FREE(handle)  LocalFree (handle)
+
+#else
+
 extern MDESC *GDI_Heap;
 
 #define GDI_HEAP_ALLOC(f,size) ((int)HEAP_Alloc(&GDI_Heap,f,size) & 0xffff)
 #define GDI_HEAP_ADDR(handle) ((void *)(handle | ((int)GDI_Heap & 0xffff0000)))
 #define GDI_HEAP_FREE(handle) (HEAP_Free(&GDI_Heap,GDI_HEAP_ADDR(handle)))
 
+#endif
 
 extern HANDLE GDI_AllocObject( WORD, WORD );
 extern BOOL GDI_FreeObject( HANDLE );
diff --git a/include/int21.h b/include/int21.h
index f44c9a4..2d3d221 100644
--- a/include/int21.h
+++ b/include/int21.h
@@ -7,6 +7,7 @@
 	DIR *ds;
 	char unixpath[256];
 	char filename[256];
+	char filemask[12];
 	char attribute;
 	long filesize;
 	long filetime;
@@ -35,17 +36,21 @@
 #define CX (context->sc_ecx & 0x0000ffffL)
 #define DX (context->sc_edx & 0x0000ffffL)
 
-#define ES context->sc_es
+#define CS context->sc_cs
 #define DS context->sc_ds
+#define ES context->sc_es
+
 #define DI context->sc_edi
 #define SI context->sc_esi
 
+#define EFL context->sc_efl
+
 #define pointer(a,b) 	(((unsigned int) a << 16) | b)
 #define segment(a) 	(a >> 16)
 #define offset(a)	(a & 0xffff)
 
-#define SetCflag	(context->sc_efl |= 0x00000001L)
-#define ResetCflag	(context->sc_efl &= 0xfffffffeL)
+#define SetCflag	(EFL |= 0x00000001L)
+#define ResetCflag	(EFL &= 0xfffffffeL)
 
 /* extended error codes */
 
diff --git a/include/menu.h b/include/menu.h
index 34cdb2c..315ef2e 100644
--- a/include/menu.h
+++ b/include/menu.h
@@ -6,12 +6,6 @@
 #ifndef MENU_H
 #define MENU_H
 
-#include <X11/Intrinsic.h>
-#include <X11/StringDefs.h>
-#include <X11/Core.h>
-#include <X11/Xaw/Form.h>
-#include <X11/Xaw/Command.h>
-#include <X11/Xaw/Box.h>
 
 
 typedef struct tagMENUITEM
@@ -25,24 +19,12 @@
     WORD	sel_key;
     char	*shortcut;
     char	*item_text;
-    Widget	w;
-    Widget	menu_w;
     char	menu_name[10];
     RECT	rect;
     HBITMAP	hCheckBit;
     HBITMAP	hUnCheckBit;
 } MENUITEM, *LPMENUITEM;
 
-typedef struct tagMENUBAR
-{
-    struct tagMENUBAR *next;
-    HANDLE	menuDescription;	/* Memory containing menu desc.   */
-    HWND	ownerWnd;		/* Owner window			  */
-    int		nItems;    		/* Number of items on menu	  */
-    Widget	parentWidget;		/* Parent of menu widget	  */
-    Widget	menuBarWidget;		/* Widget to contain menu options */
-    MENUITEM   *firstItem;
-} MENUBAR, *LPMENUBAR;
 
 typedef struct tagPOPUPMENU
 {
@@ -57,6 +39,9 @@
     BOOL	SysFlag;
     WORD	Width;
     WORD	Height;
+    WORD	CheckWidth;
+    WORD	PopWidth;
+    RECT	rect;
 } POPUPMENU, *LPPOPUPMENU;
 
 typedef struct
@@ -76,11 +61,12 @@
     WORD	item_flags;		/* See windows.h		  */
     WORD	item_id;		/* Control Id for menu item	  */
     char	item_text[1];		/* Text for menu item		  */
-} MENU_NORMALITEM;
+} MENUITEMTEMPLATE;
 
-extern LPMENUBAR MENU_CreateMenuBar(Widget parent, HANDLE instance, 
-				    HWND wnd, char *menu_name, int width);
-extern LPMENUBAR MENU_UseMenu(Widget parent, HANDLE instance, 
-			      HWND wnd, HMENU hmenu, int width);
+void StdDrawMenuBar(HDC hDC, LPRECT lprect, LPPOPUPMENU lppop);
+void MenuButtonDown(HWND hWnd, LPPOPUPMENU lppop, int x, int y);
+void MenuButtonUp(HWND hWnd, LPPOPUPMENU lppop, int x, int y);
+void MenuMouseMove(HWND hWnd, LPPOPUPMENU lppop, WORD wParam, int x, int y);
+extern void NC_TrackSysMenu(HWND hwnd);
 
 #endif /* MENU_H */
diff --git a/include/neexe.h b/include/neexe.h
index 58e67cc..cf2700d 100644
--- a/include/neexe.h
+++ b/include/neexe.h
@@ -27,9 +27,9 @@
     u_char  linker_version;	/* Linker version number		*/
     u_char  linker_revision;	/* Linker revision number		*/
     u_short entry_tab_offset;	/* Offset to entry table relative to NE */
-    u_short entry_tab_length;	/* Length of etnry table in bytes	*/
+    u_short entry_tab_length;	/* Length of entry table in bytes	*/
     u_long  reserved1;		/* Reserved by Microsoft		*/
-    u_short format_flags;	/* Flags that segments in this file	*/
+    u_short format_flags;	/* Flags about segments in this file	*/
     u_short auto_data_seg;	/* Automatic data segment number	*/
     u_short local_heap_length;	/* Initial size of local heap		*/
     u_short stack_length;	/* Initial size of stack		*/
diff --git a/include/options.h b/include/options.h
index a783b32..e313305 100644
--- a/include/options.h
+++ b/include/options.h
@@ -13,6 +13,7 @@
     int    usePrivateMap;
     int    synchronous;
     short  cmdShow;
+    int    relay_debug;
 };
 
 extern struct options Options;
diff --git a/include/prototypes.h b/include/prototypes.h
index 8bd189d..d8a3195 100644
--- a/include/prototypes.h
+++ b/include/prototypes.h
@@ -7,11 +7,13 @@
 #define PROTOTYPES_H
 
 #include <sys/types.h>
+
 #include "neexe.h"
 #include "segmem.h"
 #include "wine.h"
 #include "int21.h"
 
+#ifndef WINELIB
 extern struct segment_descriptor_s *
     CreateSelectors(struct w_files *);
 
@@ -49,4 +51,6 @@
 extern struct dosdirent *DOS_readdir(struct dosdirent *de);
 extern void DOS_closedir(struct dosdirent *de);
 
+#endif /* WINELIB */
+
 #endif /* PROTOTYPES_H */
diff --git a/include/segmem.h b/include/segmem.h
index f2bf2d6..b0f38f7 100644
--- a/include/segmem.h
+++ b/include/segmem.h
@@ -12,6 +12,15 @@
 #include <sys/shm.h>
 #endif
 
+#if defined(__NetBSD__) || defined(__FreeBSD__)
+#define HAVE_IPC
+#include <sys/types.h>
+#include <sys/ipc.h>
+#include <sys/shm.h>
+#define SHMSEG 32     /* XXX SEMMNI /usr/src/sys/conf/param.h */
+#define SHM_RANGE_START       0x40000000
+#endif
+
 /*
  * Array to track selector allocation.
  */
diff --git a/include/user.h b/include/user.h
index 3b9867d..d702023 100644
--- a/include/user.h
+++ b/include/user.h
@@ -10,7 +10,15 @@
 #include "segmem.h"
 #include "heap.h"
 
-  /* USER local heap */
+/* USER local heap */
+
+#ifdef WINELIB
+
+#define USER_HEAP_ALLOC(f,size) LocalAlloc (f, size)
+#define USER_HEAP_REALLOC(handle,size,f) LocalReAlloc (handle,size,f)
+#define USER_HEAP_ADDR(handle) LocalLock (handle)
+#define USER_HEAP_FREE(handle) LocalFree (handle)
+#else
 
 extern MDESC *USER_Heap;
 
@@ -20,4 +28,6 @@
 #define USER_HEAP_ADDR(handle) ((void *)(handle|((int)USER_Heap & 0xffff0000)))
 #define USER_HEAP_FREE(handle) (HEAP_Free(&USER_Heap,USER_HEAP_ADDR(handle)))
 
+#endif  /* WINELIB */
+
 #endif  /* USER_H */
diff --git a/include/win.h b/include/win.h
index 371b036..706deec 100644
--- a/include/win.h
+++ b/include/win.h
@@ -10,10 +10,15 @@
 #include <X11/Xlib.h>
 
 #include "windows.h"
-#include "menu.h"
 
 #define WND_MAGIC     0x444e4957  /* 'WIND' */
 
+  /* Built-in class names (see _Undocumented_Windows_ p.418) */
+#define POPUPMENU_CLASS_NAME "#32768"  /* PopupMenu */
+#define DESKTOP_CLASS_NAME   "#32769"  /* Desktop */
+#define DIALOG_CLASS_NAME    "#32770"  /* Dialog */
+#define WINSWITCH_CLASS_NAME "#32771"  /* WinSwitch */
+#define ICONTITLE_CLASS_NAME "#32772"  /* IconTitle */
 
 typedef struct tagWND
 {
@@ -37,16 +42,13 @@
     DWORD        dwExStyle;      /* Extended style (from CreateWindowEx) */
     HANDLE       hdce;           /* Window DCE (if CS_OWNDC or CS_CLASSDC) */
     HMENU        hmenuSystem;    /* System menu */
-    HCURSOR      hCursor;    	 /* Window Current Cursor */
     void	 *VScroll;	 /* Vertical ScrollBar Struct Pointer */
     void	 *HScroll;	 /* Horizontal ScrollBar Struct Pointer */
     WORD         wIDmenu;        /* ID or hmenu (from CreateWindow) */
     HANDLE       hText;          /* Handle of window text */
-    WORD         flags;          /* Misc. flags */
+    WORD         flags;          /* Misc. flags (see below) */
     Window       window;         /* X window */
-    LPMENUBAR	 menuBarPtr;	 /* Menu bar */
     HMENU	 hSysMenu;	 /* window's copy of System Menu */
-    HWND	 hWndMenuBar;	 /* Menu bar */
     WORD         wExtra[1];      /* Window extra bytes */
 } WND;
 
@@ -58,9 +60,7 @@
 #define WIN_CLASS_DC            0x10  /* Win class has style CS_CLASSDC */
 #define WIN_DOUBLE_CLICKS       0x20  /* Win class has style CS_DBLCLKS */
 #define WIN_RESTORE_MAX         0x40  /* Maximize when restoring */
-
-  /* First top-level window */
-extern HWND firstWindow;
+#define WIN_INTERNAL_PAINT      0x80  /* Internal WM_PAINT message pending */
 
   /* Window functions */
 WND *WIN_FindWndPtr( HWND hwnd );
@@ -68,5 +68,7 @@
 BOOL WIN_LinkWindow( HWND hwnd, HWND hwndInsertAfter );
 HWND WIN_FindWinToRepaint( HWND hwnd );
 
+extern Display * display;
+extern Screen * screen;
 
 #endif  /* WIN_H */
diff --git a/include/windows.h b/include/windows.h
index a6f8c98..4bd0205 100644
--- a/include/windows.h
+++ b/include/windows.h
@@ -42,6 +42,7 @@
 typedef short *LPINT;
 typedef void *LPVOID;
 typedef long (*FARPROC)();
+typedef FARPROC DLGPROC;
 typedef int CATCHBUF[9];
 typedef int *LPCATCHBUF;
 
@@ -144,22 +145,36 @@
 typedef PAINTSTRUCT *NPPAINTSTRUCT;
 typedef PAINTSTRUCT *LPPAINTSTRUCT;
 
+#ifdef WINELIB
+#define WINE_PACKED
+#else
+#define WINE_PACKED __attribute__ ((packed))
+#endif
+
   /* Window classes */
 
+#ifdef WINELIB
+typedef LONG (*WNDPROC)(HWND, UINT, WPARAM, LPARAM);
+#else
+typedef LONG	(* WNDPROC)() WINE_PACKED;
+#endif
+
 typedef struct {
 	WORD	style;
-	LONG	(*lpfnWndProc)() __attribute__ ((packed));
+#ifdef WINELIB
+	WNDPROC lpfnWndProc;
+#else
+	LONG	(*lpfnWndProc)() WINE_PACKED;
+#endif
 	short	cbClsExtra, cbWndExtra;
 	HANDLE	hInstance;
 	HICON	hIcon;
 	HCURSOR	hCursor;
 	HBRUSH	hbrBackground;
-	LPSTR	lpszMenuName __attribute__ ((packed));
-	LPSTR   lpszClassName __attribute__ ((packed));
+	LPSTR	lpszMenuName WINE_PACKED;
+	LPSTR   lpszClassName WINE_PACKED;
 } WNDCLASS, *LPWNDCLASS;
 
-typedef LONG	(* WNDPROC)() __attribute__ ((packed));
-
 #define CS_VREDRAW          0x0001
 #define CS_HREDRAW          0x0002
 #define CS_KEYCVTWINDOW     0x0004
@@ -197,10 +212,10 @@
     short     cx;
     short     y;
     short     x;
-    LONG      style __attribute__ ((packed));
-    char *    lpszName __attribute__ ((packed));
-    char *    lpszClass __attribute__ ((packed));
-    DWORD     dwExStyle __attribute__ ((packed));
+    LONG      style WINE_PACKED;
+    char *    lpszName WINE_PACKED;
+    char *    lpszClass WINE_PACKED;
+    DWORD     dwExStyle WINE_PACKED;
 } CREATESTRUCT, *LPCREATESTRUCT;
 
   /* Offsets for GetWindowLong() and GetWindowWord() */
@@ -232,6 +247,19 @@
     POINT   ptMaxTrackSize;
 } MINMAXINFO;
 
+  /* RedrawWindow() flags */
+#define RDW_INVALIDATE       0x0001
+#define RDW_INTERNALPAINT    0x0002
+#define RDW_ERASE            0x0004
+#define RDW_VALIDATE         0x0008
+#define RDW_NOINTERNALPAINT  0x0010
+#define RDW_NOERASE          0x0020
+#define RDW_NOCHILDREN       0x0040
+#define RDW_ALLCHILDREN      0x0080
+#define RDW_UPDATENOW        0x0100
+#define RDW_ERASENOW         0x0200
+#define RDW_FRAME            0x0400
+#define RDW_NOFRAME          0x0800
 
   /* WM_WINDOWPOSCHANGING/CHANGED struct */
 typedef struct
@@ -251,9 +279,9 @@
     UINT   length;
     UINT   flags;
     UINT   showCmd;
-    POINT  ptMinPosition __attribute__ ((packed));
-    POINT  ptMaxPosition __attribute__ ((packed));
-    RECT   rcNormalPosition __attribute__ ((packed));
+    POINT  ptMinPosition WINE_PACKED;
+    POINT  ptMaxPosition WINE_PACKED;
+    RECT   rcNormalPosition WINE_PACKED;
 } WINDOWPLACEMENT, *LPWINDOWPLACEMENT;
 
   /* WINDOWPLACEMENT flags */
@@ -379,9 +407,9 @@
   HWND    hwnd;
   WORD    message;
   WORD    wParam;
-  DWORD   lParam __attribute__ ((packed));
-  DWORD   time __attribute__ ((packed));
-  POINT	  pt __attribute__ ((packed));
+  DWORD   lParam WINE_PACKED;
+  DWORD   time WINE_PACKED;
+  POINT	  pt WINE_PACKED;
 } MSG, *LPMSG;
 	
 typedef WORD ATOM;
@@ -485,7 +513,7 @@
     short  bmWidthBytes;
     BYTE   bmPlanes;
     BYTE   bmBitsPixel;
-    void * bmBits __attribute__ ((packed));
+    void * bmBits WINE_PACKED;
 } BITMAP;
 
 typedef BITMAP *PBITMAP;
@@ -497,7 +525,7 @@
 typedef struct tagLOGBRUSH
 { 
     WORD       lbStyle; 
-    COLORREF   lbColor __attribute__ ((packed));
+    COLORREF   lbColor WINE_PACKED;
     short      lbHatch; 
 } LOGBRUSH, *PLOGBRUSH, *NPLOGBRUSH, *LPLOGBRUSH;
 
@@ -526,7 +554,7 @@
     short lfHeight, lfWidth, lfEscapement, lfOrientation, lfWeight;
     BYTE lfItalic, lfUnderline, lfStrikeOut, lfCharSet;
     BYTE lfOutPrecision, lfClipPrecision, lfQuality, lfPitchAndFamily;
-    BYTE lfFaceName[LF_FACESIZE] __attribute__ ((packed));
+    BYTE lfFaceName[LF_FACESIZE] WINE_PACKED;
 } LOGFONT, *PLOGFONT, *NPLOGFONT, *LPLOGFONT;
 
   /* lfWeight values */
@@ -638,7 +666,7 @@
 { 
     WORD           palVersion;
     WORD           palNumEntries;
-    PALETTEENTRY   palPalEntry[1] __attribute__ ((packed));
+    PALETTEENTRY   palPalEntry[1] WINE_PACKED;
 } LOGPALETTE, *PLOGPALETTE, *NPLOGPALETTE, *LPLOGPALETTE;
 
 
@@ -647,8 +675,8 @@
 typedef struct tagLOGPEN
 {
     WORD     lopnStyle; 
-    POINT    lopnWidth __attribute__ ((packed));
-    COLORREF lopnColor __attribute__ ((packed));
+    POINT    lopnWidth WINE_PACKED;
+    COLORREF lopnColor WINE_PACKED;
 } LOGPEN, *PLOGPEN, *NPLOGPEN, *LPLOGPEN;
 
 #define PS_SOLID	  0
@@ -1112,7 +1140,64 @@
 #define CSTF_EOF	0x20
 #define CSTF_TXIM	0x40
 
-/* */
+/* SystemParametersInfo */
+
+#define	SPI_GETBEEP			1
+#define	SPI_SETBEEP			2
+#define	SPI_GETMOUSE			3
+#define	SPI_SETMOUSE			4
+#define	SPI_GETBORDER			5
+#define	SPI_SETBORDER			6
+#define	SPI_GETKEYBOARDSPEED		10
+#define	SPI_SETKEYBOARDSPEED		11
+#define	SPI_LANGDRIVER			12
+#define SPI_ICONHORIZONTALSPACING	13
+#define SPI_GETSCREENSAVETIMEOUT	14
+#define SPI_SETSCREENSAVETIMEOUT	15
+#define SPI_GETSCREENSAVEACTIVE		16
+#define SPI_SETSCREENSAVEACTIVE		17
+#define SPI_GETGRIDGRANULARITY		18
+#define SPI_SETGRIDGRANULARITY		19
+#define SPI_SETDESKWALLPAPER		20
+#define SPI_SETDESKPATTERN		21
+#define SPI_GETKEYBOARDDELAY		22
+#define SPI_SETKEYBOARDDELAY		23
+#define SPI_ICONVERTICALSPACING		24
+#define SPI_GETICONTITLEWRAP		25
+#define SPI_SETICONTITLEWRAP		26
+#define SPI_GETMENUDROPALIGNMENT	27
+#define SPI_SETMENUDROPALIGNMENT	28
+#define SPI_SETDOUBLECLKWIDTH		29
+#define SPI_SETDOUBLECLKHEIGHT		30
+#define SPI_GETICONTITLELOGFONT		31
+#define SPI_SETDOUBLECLICKTIME		32
+#define SPI_SETMOUSEBUTTONSWAP		33
+#define SPI_SETICONTITLELOGFONT		34
+#define SPI_GETFASTTASKSWITCH		35
+#define SPI_SETFASTTASKSWITCH		36
+
+/* SystemParametersInfo flags */
+
+#define SPIF_UPDATEINIFILE		1
+#define SPIF_SENDWININICHANGE		2
+
+/* GetWinFlags */
+
+#define WF_PMODE 	0x0001
+#define WF_CPU286 	0x0002
+#define	WF_CPU386	0x0004
+#define	WF_CPU486 	0x0008
+#define	WF_STANDARD	0x0010
+#define	WF_WIN286 	0x0010
+#define	WF_ENHANCED	0x0020
+#define	WF_WIN386	0x0020
+#define	WF_CPU086	0x0040
+#define	WF_CPU186	0x0080
+#define	WF_LARGEFRAME	0x0100
+#define	WF_SMALLFRAME	0x0200
+#define	WF_80x87	0x0400
+#define	WF_PAGING	0x0800
+#define	WF_WLO          0x8000
 
 typedef struct 
 {
@@ -1937,7 +2022,11 @@
 #define VK_SCROLL           0x91
 
   
-#define LMEM_MOVEABLE   0x0002
+#define LMEM_FIXED          0   
+#define LMEM_MOVEABLE       0x0002
+#define LMEM_ZEROINIT       0x0040
+#define LMEM_DISCARDABLE    0x0F00
+#define LMEM_WINE_ALIGN     0x1000
 
 #define GMEM_FIXED          0x0000
 #define GMEM_MOVEABLE       0x0002
@@ -1956,6 +2045,55 @@
 #define GPTR                (GMEM_FIXED | GMEM_ZEROINIT)
 
 
+/* Predefined Clipboard Formats */
+#define CF_TEXT              1
+#define CF_BITMAP            2
+#define CF_METAFILEPICT      3
+#define CF_SYLK              4
+#define CF_DIF               5
+#define CF_TIFF              6
+#define CF_OEMTEXT           7
+#define CF_DIB               8
+#define CF_PALETTE           9
+#define CF_PENDATA          10
+#define CF_RIFF             11
+#define CF_WAVE             12
+
+#define CF_OWNERDISPLAY     0x0080
+#define CF_DSPTEXT          0x0081
+#define CF_DSPBITMAP        0x0082
+#define CF_DSPMETAFILEPICT  0x0083
+
+/* "Private" formats don't get GlobalFree()'d */
+#define CF_PRIVATEFIRST     0x0200
+#define CF_PRIVATELAST      0x02FF
+
+/* "GDIOBJ" formats do get DeleteObject()'d */
+#define CF_GDIOBJFIRST      0x0300
+#define CF_GDIOBJLAST       0x03FF
+
+/* Clipboard command messages */
+#define WM_CUT              0x0300
+#define WM_COPY             0x0301
+#define WM_PASTE            0x0302
+#define WM_CLEAR            0x0303
+#define WM_UNDO             0x0304
+
+/* Clipboard owner messages */
+#define WM_RENDERFORMAT     0x0305
+#define WM_RENDERALLFORMATS 0x0306
+#define WM_DESTROYCLIPBOARD 0x0307
+
+/* Clipboard viewer messages */
+#define WM_DRAWCLIPBOARD    0x0308
+#define WM_PAINTCLIPBOARD   0x0309
+#define WM_SIZECLIPBOARD    0x030B
+#define WM_VSCROLLCLIPBOARD 0x030A
+#define WM_HSCROLLCLIPBOARD 0x030E
+#define WM_ASKCBFORMATNAME  0x030C
+#define WM_CHANGECBCHAIN    0x030D
+
+
 #define F(ret,name) ret name(void);
 #define Fa(ret,name,t1,a1) ret name(t1 a1);
 #define Fb(ret,name,t1,a1,t2,a2) ret name(t1 a1,t2 a2);
@@ -1995,12 +2133,13 @@
 F(HWND,GetActiveWindow)
 F(HWND,GetCapture)
 F(HWND,GetClipboardOwner)
+F(HWND,GetOpenClipboardWindow)
 F(HWND,GetClipboardViewer)
 F(HWND,GetDesktopHwnd)
 F(HWND,GetDesktopWindow)
 F(HWND,GetFocus)
 F(HWND,GetSysModalWindow)
-F(LONG,GetMenuCheckMarkDimensions)
+F(DWORD,GetMenuCheckMarkDimensions)
 F(LONG,GetWinFlags)
 F(LPINT,GetThresholdEvent)
 F(LPSTR,ValidateFreeSpaces)
@@ -2009,7 +2148,7 @@
 F(WORD,GetCurrentPDB)
 F(WORD,GetDoubleClickTime)
 F(WORD,GetNumTasks)
-F(WORD,GetVersion)
+F(LONG,GetVersion)
 F(int,CountClipboardFormats)
 F(int,GetKBCodePage)
 F(int,GetThresholdStatus)
@@ -2342,7 +2481,7 @@
 Fb(int,GetCommError,int,a,COMSTAT*,b)
 Fb(int,GetCommState,int,a,DCB*,b)
 Fb(int,GetDeviceCaps,HDC,a,WORD,b)
-Fb(int,GetPriorityClipboardFormat,WORD FAR*,a,int,b)
+Fb(int,GetPriorityClipboardFormat,WORD FAR*,a,short,b)
 Fb(int,GetRgnBox,HRGN,a,LPRECT,b)
 Fb(int,GetScrollPos,HWND,a,int,b)
 Fb(int,ReleaseDC,HWND,a,HDC,b)
@@ -2436,11 +2575,11 @@
 Fc(WORD,SetWindowWord,HWND,a,short,b,WORD,c)
 Fc(int,FrameRect,HDC,a,LPRECT,b,HBRUSH,c)
 Fc(int,GetClassName,HWND,a,LPSTR,b,short,c)
-Fc(int,GetClipboardFormatName,WORD,a,LPSTR,b,int,c)
+Fc(int,GetClipboardFormatName,WORD,a,LPSTR,b,short,c)
 Fc(int,GetEnvironment,LPSTR,a,LPSTR,b,WORD,c)
 Fc(int,GetInstanceData,HANDLE,a,NPSTR,b,int,c)
 Fc(int,GetKeyNameText,LONG,a,LPSTR,b,int,c)
-Fc(int,GetModuleFileName,HANDLE,a,LPSTR,b,int,c)
+Fc(int,GetModuleFileName,HANDLE,a,LPSTR,b,short,c)
 Fc(int,GetObject,HANDLE,a,int,b,LPSTR,c)
 Fc(int,GetTextFace,HDC,a,int,b,LPSTR,c)
 Fc(int,GetUpdateRgn,HWND,a,HRGN,b,BOOL,c)
@@ -2477,12 +2616,13 @@
 Fd(BOOL,GetTextExtentPoint,HDC,a,LPSTR,b,short,c,LPSIZE,d)
 Fd(BOOL,DrawIcon,HDC,a,short,b,short,c,HICON,d)
 Fd(BOOL,EnumMetaFile,HDC,a,LOCALHANDLE,b,FARPROC,c,BYTE FAR*,d)
-Fd(BOOL,FloodFill,HDC,a,int,b,int,c,DWORD,d)
+Fd(BOOL,FloodFill,HDC,a,short,b,short,c,DWORD,d)
 Fd(BOOL,GetCharWidth,HDC,a,WORD,b,WORD,c,LPINT,d)
 Fd(BOOL,HiliteMenuItem,HWND,a,HMENU,b,WORD,c,WORD,d)
 Fd(BOOL,MoveToEx,HDC,a,short,b,short,c,LPPOINT,d)
 Fd(BOOL,PolyPolygon,HDC,a,LPPOINT,b,LPINT,c,int,d)
 Fd(BOOL,PostAppMessage,HANDLE,a,WORD,b,WORD,c,LONG,d)
+Fd(BOOL,RedrawWindow,HWND,a,LPRECT,b,HRGN,c,UINT,d)
 Fd(BOOL,SetBitmapDimensionEx,HBITMAP,a,short,b,short,c,LPSIZE,d)
 Fd(BOOL,WinHelp,HWND,hwndMain,LPSTR,lpszHelp,WORD,usCommand,DWORD,ulData)
 Fd(BOOL,WritePrivateProfileString,LPSTR,a,LPSTR,b,LPSTR,c,LPSTR,d)
diff --git a/include/wine.h b/include/wine.h
index 7931c48..13eee61 100644
--- a/include/wine.h
+++ b/include/wine.h
@@ -63,4 +63,9 @@
 #define HZ 100
 #endif
 
+void load_mz_header (int, struct mz_header_s *);
+void load_ne_header (int, struct ne_header_s *);
+int  load_typeinfo  (int, struct resource_typeinfo_s *);
+int  load_nameinfo  (int, struct resource_nameinfo_s *);
+
 #endif /* WINE_H */
diff --git a/include/winsock.h b/include/winsock.h
new file mode 100644
index 0000000..6b83e52
--- /dev/null
+++ b/include/winsock.h
@@ -0,0 +1,367 @@
+/* WINSOCK.H--definitions to be used with the WINSOCK.DLL
+ *
+ * This header file corresponds to version 1.1 of the Windows Sockets
+ * specification.
+ */
+
+#ifndef _WINSOCKAPI_
+#define _WINSOCKAPI_
+
+#include <windows.h>
+#include <sys/types.h>
+#include <sys/time.h>
+#include <fcntl.h>
+#include <netdb.h>
+#include <netinet/in.h>
+#include <sys/socket.h>
+
+/*
+ * The new type to be used in all
+ * instances which refer to sockets.
+ */
+typedef u_int	SOCKET;
+
+extern int PASCAL FAR __WSAFDIsSet(SOCKET, fd_set FAR *);
+
+/*
+ * Internet address (old style... should be updated)
+ */
+#define s_addr  S_un.S_addr	/* can be used for most tcp & ip code */
+#define s_host  S_un.S_un_b.s_b2	/* host on imp */
+#define s_net   S_un.S_un_b.s_b1	/* network */
+#define s_imp   S_un.S_un_w.s_w2	/* imp */
+#define s_impno S_un.S_un_b.s_b4	/* imp # */
+#define s_lh    S_un.S_un_b.s_b3	/* logical host */
+
+#define WSADESCRIPTION_LEN      256
+#define WSASYS_STATUS_LEN       128
+
+typedef struct WSAData {
+        WORD                    wVersion;
+        WORD                    wHighVersion;
+        char                    szDescription[WSADESCRIPTION_LEN+1];
+        char                    szSystemStatus[WSASYS_STATUS_LEN+1];
+        unsigned short          iMaxSockets;
+        unsigned short          iMaxUdpDg;
+        char FAR *              lpVendorInfo;
+} WSADATA;
+
+typedef WSADATA FAR *LPWSADATA;
+
+/*
+ * This is used instead of -1, since the
+ * SOCKET type is unsigned.
+ */
+#define INVALID_SOCKET  (SOCKET)(~0)
+#define SOCKET_ERROR            (-1)
+
+/*
+ * Option flags per-socket.
+ */
+#ifndef SO_DONTLINGER
+#define SO_DONTLINGER   (u_int)(~SO_LINGER)
+#endif
+
+#ifndef _SYS_SOCKET_H_
+/*
+ * Structure used by kernel to pass protocol
+ * information in raw sockets.
+ */
+struct sockproto {
+        u_short sp_family;              /* address family */
+        u_short sp_protocol;            /* protocol */
+};
+#endif
+
+/*
+ * Maximum queue length specifiable by listen.
+ */
+#define SOMAXCONN       5
+#define MSG_DONTROUTE   0x4             /* send without using routing tables */
+#define MSG_MAXIOVLEN   16
+
+/*
+ * Define constant based on rfc883, used by gethostbyxxxx() calls.
+ */
+#define MAXGETHOSTSTRUCT        1024
+
+/*
+ * Define flags to be used with the WSAAsyncSelect() call.
+ */
+#define FD_READ         0x01
+#define FD_WRITE        0x02
+#define FD_OOB          0x04
+#define FD_ACCEPT       0x08
+#define FD_CONNECT      0x10
+#define FD_CLOSE        0x20
+
+/*
+ * All Windows Sockets error constants are biased by WSABASEERR from
+ * the "normal"
+ */
+#define WSABASEERR              10000
+/*
+ * Windows Sockets definitions of regular Microsoft C error constants
+ */
+#define WSAEINTR                (WSABASEERR+4)
+#define WSAEBADF                (WSABASEERR+9)
+#define WSAEACCES               (WSABASEERR+13)
+#define WSAEFAULT               (WSABASEERR+14)
+#define WSAEINVAL               (WSABASEERR+22)
+#define WSAEMFILE               (WSABASEERR+24)
+
+/*
+ * Windows Sockets definitions of regular Berkeley error constants
+ */
+#define WSAEWOULDBLOCK          (WSABASEERR+35)
+#define WSAEINPROGRESS          (WSABASEERR+36)
+#define WSAEALREADY             (WSABASEERR+37)
+#define WSAENOTSOCK             (WSABASEERR+38)
+#define WSAEDESTADDRREQ         (WSABASEERR+39)
+#define WSAEMSGSIZE             (WSABASEERR+40)
+#define WSAEPROTOTYPE           (WSABASEERR+41)
+#define WSAENOPROTOOPT          (WSABASEERR+42)
+#define WSAEPROTONOSUPPORT      (WSABASEERR+43)
+#define WSAESOCKTNOSUPPORT      (WSABASEERR+44)
+#define WSAEOPNOTSUPP           (WSABASEERR+45)
+#define WSAEPFNOSUPPORT         (WSABASEERR+46)
+#define WSAEAFNOSUPPORT         (WSABASEERR+47)
+#define WSAEADDRINUSE           (WSABASEERR+48)
+#define WSAEADDRNOTAVAIL        (WSABASEERR+49)
+#define WSAENETDOWN             (WSABASEERR+50)
+#define WSAENETUNREACH          (WSABASEERR+51)
+#define WSAENETRESET            (WSABASEERR+52)
+#define WSAECONNABORTED         (WSABASEERR+53)
+#define WSAECONNRESET           (WSABASEERR+54)
+#define WSAENOBUFS              (WSABASEERR+55)
+#define WSAEISCONN              (WSABASEERR+56)
+#define WSAENOTCONN             (WSABASEERR+57)
+#define WSAESHUTDOWN            (WSABASEERR+58)
+#define WSAETOOMANYREFS         (WSABASEERR+59)
+#define WSAETIMEDOUT            (WSABASEERR+60)
+#define WSAECONNREFUSED         (WSABASEERR+61)
+#define WSAELOOP                (WSABASEERR+62)
+#define WSAENAMETOOLONG         (WSABASEERR+63)
+#define WSAEHOSTDOWN            (WSABASEERR+64)
+#define WSAEHOSTUNREACH         (WSABASEERR+65)
+#define WSAENOTEMPTY            (WSABASEERR+66)
+#define WSAEPROCLIM             (WSABASEERR+67)
+#define WSAEUSERS               (WSABASEERR+68)
+#define WSAEDQUOT               (WSABASEERR+69)
+#define WSAESTALE               (WSABASEERR+70)
+#define WSAEREMOTE              (WSABASEERR+71)
+
+/*
+ * Extended Windows Sockets error constant definitions
+ */
+#define WSASYSNOTREADY          (WSABASEERR+91)
+#define WSAVERNOTSUPPORTED      (WSABASEERR+92)
+#define WSANOTINITIALISED       (WSABASEERR+93)
+
+/*
+ * Error return codes from gethostbyname() and gethostbyaddr()
+ * (when using the resolver). Note that these errors are
+ * retrieved via WSAGetLastError() and must therefore follow
+ * the rules for avoiding clashes with error numbers from
+ * specific implementations or language run-time systems.
+ * For this reason the codes are based at WSABASEERR+1001.
+ * Note also that [WSA]NO_ADDRESS is defined only for
+ * compatibility purposes.
+ */
+
+#define h_errno         WSAGetLastError()
+
+/* Authoritative Answer: Host not found */
+#define WSAHOST_NOT_FOUND       (WSABASEERR+1001)
+
+/* Non-Authoritative: Host not found, or SERVERFAIL */
+#define WSATRY_AGAIN            (WSABASEERR+1002)
+
+/* Non recoverable errors, FORMERR, REFUSED, NOTIMP */
+#define WSANO_RECOVERY          (WSABASEERR+1003)
+
+/* Valid name, no data record of requested type */
+#define WSANO_DATA              (WSABASEERR+1004)
+
+/* no address, look for MX record */
+#define WSANO_ADDRESS           WSANO_DATA
+
+/*
+ * Windows Sockets errors redefined as regular Berkeley error constants
+
+	* AAARGH! *
+
+#define EWOULDBLOCK             WSAEWOULDBLOCK
+#define EINPROGRESS             WSAEINPROGRESS
+#define EALREADY                WSAEALREADY
+#define ENOTSOCK                WSAENOTSOCK
+#define EDESTADDRREQ            WSAEDESTADDRREQ
+#define EMSGSIZE                WSAEMSGSIZE
+#define EPROTOTYPE              WSAEPROTOTYPE
+#define ENOPROTOOPT             WSAENOPROTOOPT
+#define EPROTONOSUPPORT         WSAEPROTONOSUPPORT
+#define ESOCKTNOSUPPORT         WSAESOCKTNOSUPPORT
+#define EOPNOTSUPP              WSAEOPNOTSUPP
+#define EPFNOSUPPORT            WSAEPFNOSUPPORT
+#define EAFNOSUPPORT            WSAEAFNOSUPPORT
+#define EADDRINUSE              WSAEADDRINUSE
+#define EADDRNOTAVAIL           WSAEADDRNOTAVAIL
+#define ENETDOWN                WSAENETDOWN
+#define ENETUNREACH             WSAENETUNREACH
+#define ENETRESET               WSAENETRESET
+#define ECONNABORTED            WSAECONNABORTED
+#define ECONNRESET              WSAECONNRESET
+#define ENOBUFS                 WSAENOBUFS
+#define EISCONN                 WSAEISCONN
+#define ENOTCONN                WSAENOTCONN
+#define ESHUTDOWN               WSAESHUTDOWN
+#define ETOOMANYREFS            WSAETOOMANYREFS
+#define ETIMEDOUT               WSAETIMEDOUT
+#define ECONNREFUSED            WSAECONNREFUSED
+#define ELOOP                   WSAELOOP
+#define ENAMETOOLONG            WSAENAMETOOLONG
+#define EHOSTDOWN               WSAEHOSTDOWN
+#define EHOSTUNREACH            WSAEHOSTUNREACH
+#define ENOTEMPTY               WSAENOTEMPTY
+#define EPROCLIM                WSAEPROCLIM
+#define EUSERS                  WSAEUSERS
+#define EDQUOT                  WSAEDQUOT
+#define ESTALE                  WSAESTALE
+#define EREMOTE                 WSAEREMOTE
+
+*/
+
+/* Socket function prototypes */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Microsoft Windows Extension function prototypes */
+
+int PASCAL FAR WSAStartup(WORD wVersionRequired, LPWSADATA lpWSAData);
+
+int PASCAL FAR WSACleanup(void);
+
+void PASCAL FAR WSASetLastError(int iError);
+
+int PASCAL FAR WSAGetLastError(void);
+
+BOOL PASCAL FAR WSAIsBlocking(void);
+
+int PASCAL FAR WSAUnhookBlockingHook(void);
+
+FARPROC PASCAL FAR WSASetBlockingHook(FARPROC lpBlockFunc);
+
+int PASCAL FAR WSACancelBlockingCall(void);
+
+HANDLE PASCAL FAR WSAAsyncGetServByName(HWND hWnd, u_int wMsg,
+                                        const char FAR * name, 
+                                        const char FAR * proto,
+                                        char FAR * buf, int buflen);
+
+HANDLE PASCAL FAR WSAAsyncGetServByPort(HWND hWnd, u_int wMsg, int port,
+                                        const char FAR * proto, char FAR * buf,
+                                        int buflen);
+
+HANDLE PASCAL FAR WSAAsyncGetProtoByName(HWND hWnd, u_int wMsg,
+                                         const char FAR * name, char FAR * buf,
+                                         int buflen);
+
+HANDLE PASCAL FAR WSAAsyncGetProtoByNumber(HWND hWnd, u_int wMsg,
+                                           int number, char FAR * buf,
+                                           int buflen);
+
+HANDLE PASCAL FAR WSAAsyncGetHostByName(HWND hWnd, u_int wMsg,
+                                        const char FAR * name, char FAR * buf,
+                                        int buflen);
+
+HANDLE PASCAL FAR WSAAsyncGetHostByAddr(HWND hWnd, u_int wMsg,
+                                        const char FAR * addr, int len, int type,
+                                        const char FAR * buf, int buflen);
+
+int PASCAL FAR WSACancelAsyncRequest(HANDLE hAsyncTaskHandle);
+
+int PASCAL FAR WSAAsyncSelect(SOCKET s, HWND hWnd, u_int wMsg,
+                               long lEvent);
+
+#ifdef __cplusplus
+}
+#endif
+
+/* Microsoft Windows Extended data types */
+typedef struct sockaddr SOCKADDR;
+typedef struct sockaddr *PSOCKADDR;
+typedef struct sockaddr FAR *LPSOCKADDR;
+
+typedef struct sockaddr_in SOCKADDR_IN;
+typedef struct sockaddr_in *PSOCKADDR_IN;
+typedef struct sockaddr_in FAR *LPSOCKADDR_IN;
+
+typedef struct linger LINGER;
+typedef struct linger *PLINGER;
+typedef struct linger FAR *LPLINGER;
+
+typedef struct in_addr IN_ADDR;
+typedef struct in_addr *PIN_ADDR;
+typedef struct in_addr FAR *LPIN_ADDR;
+
+typedef struct fd_set FD_SET;
+typedef struct fd_set *PFD_SET;
+typedef struct fd_set FAR *LPFD_SET;
+
+typedef struct hostent HOSTENT;
+typedef struct hostent *PHOSTENT;
+typedef struct hostent FAR *LPHOSTENT;
+
+typedef struct servent SERVENT;
+typedef struct servent *PSERVENT;
+typedef struct servent FAR *LPSERVENT;
+
+typedef struct protoent PROTOENT;
+typedef struct protoent *PPROTOENT;
+typedef struct protoent FAR *LPPROTOENT;
+
+typedef struct timeval TIMEVAL;
+typedef struct timeval *PTIMEVAL;
+typedef struct timeval FAR *LPTIMEVAL;
+
+/*
+ * Windows message parameter composition and decomposition
+ * macros.
+ *
+ * WSAMAKEASYNCREPLY is intended for use by the Windows Sockets implementation
+ * when constructing the response to a WSAAsyncGetXByY() routine.
+ */
+#define WSAMAKEASYNCREPLY(buflen,error)     MAKELONG(buflen,error)
+/*
+ * WSAMAKESELECTREPLY is intended for use by the Windows Sockets implementation
+ * when constructing the response to WSAAsyncSelect().
+ */
+#define WSAMAKESELECTREPLY(event,error)     MAKELONG(event,error)
+/*
+ * WSAGETASYNCBUFLEN is intended for use by the Windows Sockets application
+ * to extract the buffer length from the lParam in the response
+ * to a WSAGetXByY().
+ */
+#define WSAGETASYNCBUFLEN(lParam)           LOWORD(lParam)
+/*
+ * WSAGETASYNCERROR is intended for use by the Windows Sockets application
+ * to extract the error code from the lParam in the response
+ * to a WSAGetXByY().
+ */
+#define WSAGETASYNCERROR(lParam)            HIWORD(lParam)
+/*
+ * WSAGETSELECTEVENT is intended for use by the Windows Sockets application
+ * to extract the event code from the lParam in the response
+ * to a WSAAsyncSelect().
+ */
+#define WSAGETSELECTEVENT(lParam)           LOWORD(lParam)
+/*
+ * WSAGETSELECTERROR is intended for use by the Windows Sockets application
+ * to extract the error code from the lParam in the response
+ * to a WSAAsyncSelect().
+ */
+#define WSAGETSELECTERROR(lParam)           HIWORD(lParam)
+
+#endif  /* _WINSOCKAPI_ */
diff --git a/loader/Imakefile b/loader/Imakefile
index f831435..7c9ddeb 100644
--- a/loader/Imakefile
+++ b/loader/Imakefile
@@ -3,32 +3,15 @@
 MODULE = loader
 
 SRCS = \
-	int1a.c \
-	int21.c \
 	dump.c \
-	files.c \
 	ldt.c \
 	ldtlib.c \
-	resource.c \
 	selector.c \
 	signal.c \
 	library.c \
-	wine.c \
-	cursor.c
+	wine.c
 
-OBJS = \
-	int1a.o \
-	int21.o \
-	dump.o \
-	files.o \
-	ldt.o \
-	ldtlib.o \
-	resource.o \
-	selector.o \
-	signal.o \
-	library.o \
-	wine.o \
-	cursor.o
+OBJS = $(SRCS:.c=.o)
 
 WineRelocatableTarget($(TOP)/$(MODULE),,$(OBJS))
 DependTarget()
diff --git a/loader/Makefile b/loader/Makefile
deleted file mode 100644
index 083d8f6..0000000
--- a/loader/Makefile
+++ /dev/null
@@ -1,19 +0,0 @@
-CFLAGS=$(COPTS) $(DEBUGOPTS) -I../include
-
-OBJS=dump.o ldt.o ldtlib.o resource.o selector.o signal.o library.o \
-     wine.o cursor.o
-
-default: loader.o
-
-loader.o: $(OBJS)
-	$(LD) -r -o loader.o $(OBJS)
-
-clean:
-	rm -f *.o *~ *.s dll_* *.a *#
-
-depend:
-	$(CC) $(CFLAGS) -M *.c > .depend
-
-ifeq (.depend,$(wildcard .depend))
-include .depend
-endif
diff --git a/loader/ldtlib.c b/loader/ldtlib.c
index 76924fe..d361040 100644
--- a/loader/ldtlib.c
+++ b/loader/ldtlib.c
@@ -79,9 +79,13 @@
 
     sd = make_sd(base, limit, contents, read_only_flag, seg_32bit_flag, limit_in_pages_flag);
     ret = i386_set_ldt(entry, (union descriptor *)sd, 1);
-    if (ret < 0)
+    if (ret < 0) {
             perror("i386_set_ldt");
-    
+            fprintf(stderr,
+		"Did you reconfigure the kernel with \"options USER_LDT\"?\n");
+    	    exit(1);
+    }
+
     return ret;
     
 #endif
diff --git a/loader/library.c b/loader/library.c
index fe7813e..ebb91fe 100644
--- a/loader/library.c
+++ b/loader/library.c
@@ -1,4 +1,3 @@
-
 #include <stdio.h>
 #include <stdlib.h>
 #include <sys/types.h>
@@ -7,10 +6,72 @@
 #include <unistd.h>
 #include "prototypes.h"
 #include "windows.h"
-#include "win.h"
-#include "gdi.h"
 #include "wine.h"
+#include "dlls.h"
 
+extern struct  w_files * wine_files;
+
+
+/**********************************************************************
+ *				GetCurrentTask	[KERNEL.36]
+ */
+HTASK GetCurrentTask()
+{
+    int pid = getpid();
+    printf("GetCurrentTask() returned %d !\n", pid);
+    return pid;
+}
+
+
+/**********************************************************************
+ *				GetModuleHandle	[KERNEL.47]
+ */
+HANDLE GetModuleHandle(LPSTR lpModuleName)
+{
+    register struct w_files *w = wine_files;
+    printf("GetModuleHandle('%s');\n", lpModuleName);
+    while (w) {
+	printf("GetModuleHandle // '%s' \n", w->name); 
+	if (strcmp(w->name, lpModuleName) == 0) {
+	    printf("GetModuleHandle('%s') return %04X \n", 
+		lpModuleName, w->hinstance);
+	    return w->hinstance;
+	    }
+	w = w->next;
+	}
+    printf("GetModuleHandle('%s') not found !\n", lpModuleName);
+    return 0;
+}
+
+
+/**********************************************************************
+ *				GetModuleUsage	[KERNEL.48]
+ */
+int GetModuleUsage(HANDLE hModule)
+{
+    struct w_files *w;
+    printf("GetModuleUsage(%04X);\n", hModule);
+    w = GetFileInfo(hModule);
+/*    return w->Usage; */
+    return 1;
+}
+
+
+/**********************************************************************
+ *				GetModuleFilename [KERNEL.49]
+ */
+int GetModuleFileName(HANDLE hModule, LPSTR lpFileName, short nSize)
+{
+    struct w_files *w;
+    printf("GetModuleFileName(%04X, %08X, %d);\n", hModule, lpFileName, nSize);
+    if (lpFileName == NULL) return 0;
+    w = GetFileInfo(hModule);
+    if (w == NULL) return 0;
+    if (nSize > strlen(w->name)) nSize = strlen(w->name) + 1;
+    strncpy(lpFileName, w->name, nSize);
+    printf("GetModuleFileName copied '%s' return %d \n", lpFileName, nSize);
+    return nSize - 1;
+}
 
 
 /**********************************************************************
@@ -20,7 +81,7 @@
 {
     HANDLE hRet;
     printf("LoadLibrary '%s'\n", libname);
-    hRet = LoadImage(libname);
+    hRet = LoadImage(libname, DLL);
     printf("after LoadLibrary hRet=%04X\n", hRet);
     return hRet;
 }
@@ -35,3 +96,4 @@
     if (hLib != (HANDLE)NULL) GlobalFree(hLib);
 }
 
+
diff --git a/loader/selector.c b/loader/selector.c
index 76c66ba..bea1886 100644
--- a/loader/selector.c
+++ b/loader/selector.c
@@ -585,7 +585,7 @@
 		j = GetEntryPointFromOrdinal(wpnt, ordinal);		
 		*addr  = j & 0xffff;
 		j = j >> 16;
-		*sel = wpnt->selector_table[j].selector;
+		*sel = j;
 		return 0;
 	};
 	return 1;
@@ -615,12 +615,7 @@
 		j = GetEntryPointFromOrdinal(wpnt, ordinal);
 		*addr  = j & 0xffff;
 		j = j >> 16;
-#if 0
-		/* This seems like it would never work */
-		*sel = wpnt->selector_table[j].selector;
-#else
-		*sel = j;  /* Is there any reason this will ever fail?? */
-#endif
+		*sel = j;
 		return 0;
 	};
 	return 1;
diff --git a/loader/wine.c b/loader/wine.c
index 11aed62..26936da 100644
--- a/loader/wine.c
+++ b/loader/wine.c
@@ -22,6 +22,7 @@
 #include "wine.h"
 #include "windows.h"
 #include "wineopts.h"
+#include "arch.h"
 
 /* #define DEBUG_FIXUP */
 
@@ -46,22 +47,13 @@
 int CurrentNEFile;
 HINSTANCE hSysRes;
 
-static char *Extensions[] = { "dll", "exe", NULL };
+static char *DLL_Extensions[] = { "dll", "exe", NULL };
+static char *EXE_Extensions[] = { "exe", NULL };
 static char *WinePath = NULL;
 
 FILE *SpyFp = NULL;
 
 /**********************************************************************
- *					DebugPrintString
- */
-int
-DebugPrintString(char *str)
-{
-    printf("%s", str);
-    return 0;
-}
-
-/**********************************************************************
  *					myerror
  */
 void
@@ -103,11 +95,35 @@
     return w;
 }
 
+#ifndef WINELIB
+/**********************************************************************
+ *
+ * Load MZ Header
+ */
+void load_mz_header(int fd, struct mz_header_s *mz_header)
+{
+    if (read(fd, mz_header, sizeof(struct mz_header_s)) !=
+	sizeof(struct mz_header_s))
+    {
+	myerror("Unable to read MZ header from file");
+    }
+}
+
+void load_ne_header (int fd, struct ne_header_s *ne_header)
+{
+    if (read(fd, ne_header, sizeof(struct ne_header_s)) 
+	!= sizeof(struct ne_header_s))
+    {
+	myerror("Unable to read NE header from file");
+    }
+}
+#endif
+
 /**********************************************************************
  *					LoadImage
  * Load one NE format executable into memory
  */
-HINSTANCE LoadImage(char *modulename)
+HINSTANCE LoadImage(char *modulename, int filetype)
 {
     unsigned int read_size;
     int i;
@@ -118,11 +134,9 @@
     /*
      * search file
      */
-    if (FindFile(buffer, sizeof(buffer), modulename, Extensions, WindowsPath)
-    	==NULL)
+    if (FindFile(buffer, sizeof(buffer), modulename, (filetype == EXE ? 
+    	EXE_Extensions : DLL_Extensions), WindowsPath) ==NULL)
     {
-	
-
     	fprintf(stderr,"LoadImage: I can't find %s !\n",modulename);
 	return (HINSTANCE) NULL;
     }
@@ -159,21 +173,13 @@
 
     wpnt->mz_header = (struct mz_header_s *) malloc(sizeof(struct mz_header_s));;
     status = lseek(wpnt->fd, 0, SEEK_SET);
-    if (read(wpnt->fd, wpnt->mz_header, sizeof(struct mz_header_s)) !=
-	sizeof(struct mz_header_s))
-    {
-	myerror("Unable to read MZ header from file");
-    }
+    load_mz_header (wpnt->fd, wpnt->mz_header);
     if (wpnt->mz_header->must_be_0x40 != 0x40)
 	myerror("This is not a Windows program");
     
     wpnt->ne_header = (struct ne_header_s *) malloc(sizeof(struct ne_header_s));
     status = lseek(wpnt->fd, wpnt->mz_header->ne_offset, SEEK_SET);
-    if (read(wpnt->fd, wpnt->ne_header, sizeof(struct ne_header_s)) 
-	!= sizeof(struct ne_header_s))
-    {
-	myerror("Unable to read NE header from file");
-    }
+    load_ne_header (wpnt->fd, wpnt->ne_header);
     if (wpnt->ne_header->header_type[0] != 'N' || 
 	wpnt->ne_header->header_type[1] != 'E')
       myerror("This is not a Windows program");
@@ -190,6 +196,7 @@
     /*
      * Create segment selectors.
      */
+#ifndef WINELIB
     status = lseek(wpnt->fd, wpnt->mz_header->ne_offset + 
 		   wpnt->ne_header->segment_tab_offset,
 		   SEEK_SET);
@@ -235,7 +242,7 @@
     wpnt->name  = (char*) malloc(*wpnt->rname_table + 1);
     memcpy(wpnt->name, wpnt->rname_table+1, *wpnt->rname_table);
     wpnt->name[*wpnt->rname_table] =  0;
-
+#endif
     /*
      * Now load any DLLs that  this module refers to.
      */
@@ -245,9 +252,11 @@
       int  fd, j;
       GetModuleName(wpnt, i + 1, buff);
       
+#ifndef WINELIB
       if(FindDLLTable(buff)) continue;  /* This module already loaded */
+#endif
 
-      LoadImage(buff);
+      LoadImage(buff, DLL);
 /*
       fprintf(stderr,"Unable to load:%s\n",  buff);
 */
@@ -255,31 +264,6 @@
 return(wpnt->hinstance);
 }
 
-/**********************************************************************
- *					ParseArgs
- */
-void
-ParseArgs(int argc, char **argv)
-{
-    if (argc < 2)
-    {
-	fprintf(stderr, "usage: %s [-spy FILENAME] FILENAME\n", argv[0]);
-	exit(1);
-    }
-
-    Argc = argc - 1;
-    
-    for (Argv = argv + 1; **Argv == '-' && Argc > 0; Argv++)
-    {
-	if (strcmp(*Argv, "-spy") == 0)
-	{
-	    if (strcmp(*(++Argv), "-") == 0)
-		SpyFp = stdout;
-	    else
-		SpyFp = fopen(*Argv, "a");
-	}
-    }
-}
 
 /**********************************************************************
  *					main
@@ -300,22 +284,29 @@
 	int i;
 	int rv;
 
-	ParseArgs(argc, argv);
-
-	p = getenv("WINEPATH");
-	WinePath = malloc(256 + strlen(p));
-	getcwd(WinePath, 256);
-	strcat(WinePath, ";");
-	strcat(WinePath, p);
-
-	LoadImage(Argv[0]);
+	Argc = argc - 1;
+	Argv = argv + 1;
+	
+	WinePath = malloc(1024);
+	
+	getcwd(WinePath, 512);
+	
+	if ((p = getenv("WINEPATH")) != NULL) { 
+		strcat(WinePath, ";");
+		strcat(WinePath, p);
+	}
+	
+	if (LoadImage(Argv[0], EXE) == (HINSTANCE) NULL ) {
+		fprintf(stderr, "wine: can't find %s!.\n", Argv[0]);
+		exit(1);
+	}
 
 	GetPrivateProfileString("wine", "SystemResources", "sysres.dll", 
-				filename, sizeof(filename),
-				WINE_INI);
-	hSysRes = LoadImage(filename);
+				filename, sizeof(filename), WINE_INI);
+
+	hSysRes = LoadImage(filename, DLL);
 	if (hSysRes == (HINSTANCE)NULL)
- 	    printf("Error Loading System Resources !!!\n");
+		fprintf(stderr, "wine: can't find %s!.\n", filename);
  	else
  	    printf("System Resources Loaded // hSysRes='%04X'\n", hSysRes);
 	
@@ -324,22 +315,15 @@
      */
     wpnt = wine_files;
     for(wpnt = wine_files; wpnt; wpnt = wpnt->next)
-      for (segment = 0; segment < wpnt->ne_header->n_segment_tab; segment++)
+    {
+	for (segment = 0; segment < wpnt->ne_header->n_segment_tab; segment++)
 	{
-	  if (FixupSegment(wpnt, segment) < 0)
+	    if (FixupSegment(wpnt, segment) < 0)
 	    {
-	      myerror("fixup failed.");
+		myerror("fixup failed.");
 	    }
 	}
-
-    /*
-     * Fixup stack and jump to start.
-     */
-    ds_reg = wine_files->selector_table[wine_files->ne_header->auto_data_seg-1].selector;
-    cs_reg = wine_files->selector_table[wine_files->ne_header->cs-1].selector;
-    ip_reg = wine_files->ne_header->ip;
-    ss_reg = wine_files->selector_table[wine_files->ne_header->ss-1].selector;
-    sp_reg = wine_files->ne_header->sp;
+    }
 
 #ifdef WINESTAT
     cp = strrchr(argv[0], '/');
@@ -351,27 +335,65 @@
     };
 #endif
 
+    /*
+     * Initialize signal handling.
+     */
     init_wine_signals();
 
-    if (WineForceFail)
-    {
-	p = (char *) ((cs_reg << 16) | ip_reg);
-	
-	*p++ = 0xcd;
-	*p++ = 0x20;
-    }
-
-    if (ss_reg == 0)
-    {
-	fprintf(stderr, "SS is 0\n");
-    }
-
-    LinearTest();
+    /*
+     * Fixup stack and jump to start.
+     */
+    ds_reg = (wine_files->
+	      selector_table[wine_files->ne_header->auto_data_seg-1].selector);
+    cs_reg = wine_files->selector_table[wine_files->ne_header->cs-1].selector;
+    ip_reg = wine_files->ne_header->ip;
+    ss_reg = wine_files->selector_table[wine_files->ne_header->ss-1].selector;
+    sp_reg = wine_files->ne_header->sp;
 
     rv = CallToInit16(cs_reg << 16 | ip_reg, ss_reg << 16 | sp_reg, ds_reg);
     printf ("rv = %x\n", rv);
 }
 
+void InitializeLoadedDLLs()
+{
+    struct w_files * wpnt;
+    int cs_reg, ds_reg, ip_reg;
+    int rv;
+
+    fprintf(stderr, "Initializing DLLs\n");
+
+    /*
+     * Initialize libraries
+     */
+    wpnt = wine_files;
+    for(wpnt = wine_files; wpnt; wpnt = wpnt->next)
+    {
+	/* 
+	 * Is this a library? 
+	 */
+	if (wpnt->ne_header->format_flags & 0x8000)
+	{
+	    if (!(wpnt->ne_header->format_flags & 0x0001))
+	    {
+		/* Not SINGLEDATA */
+		fprintf(stderr, "Library is not marked SINGLEDATA\n");
+		exit(1);
+	    }
+
+	    ds_reg = wpnt->selector_table[wpnt->
+					  ne_header->auto_data_seg-1].selector;
+	    cs_reg = wpnt->selector_table[wpnt->ne_header->cs-1].selector;
+	    ip_reg = wpnt->ne_header->ip;
+
+	    fprintf(stderr, "Initializing %s, cs:ip %04x:%04x, ds %04x\n", 
+		    wpnt->name, cs_reg, ip_reg, ds_reg);
+
+	    rv = CallTo16(cs_reg << 16 | ip_reg, ds_reg);
+	    printf ("rv = %x\n", rv);
+	}
+    }
+}
+
 
 /**********************************************************************
  *					GetImportedName
@@ -389,6 +411,7 @@
 		   name_offset, SEEK_SET);
     length = 0;
     read(fd, &length, 1);  /* Get the length byte */
+    length = CONV_CHAR_TO_LONG (length);
     read(fd, buffer, length);
     buffer[length] = 0;
     return buffer;
@@ -405,17 +428,19 @@
     struct ne_header_s *ne_header = wpnt->ne_header;
     char *p;
     int length;
-    int name_offset, status;
+    WORD name_offset, status;
     int i;
     
     status = lseek(fd, mz_header->ne_offset + ne_header->moduleref_tab_offset +
 		   2*(index - 1), SEEK_SET);
     name_offset = 0;
     read(fd, &name_offset, 2);
+    name_offset = CONV_SHORT (name_offset);
     status = lseek(fd, mz_header->ne_offset + ne_header->iname_tab_offset +
 		   name_offset, SEEK_SET);
     length = 0;
     read(fd, &length, 1);  /* Get the length byte */
+    length = CONV_CHAR_TO_LONG (length);
     read(fd, buffer, length);
     buffer[length] = 0;
 
@@ -427,6 +452,7 @@
 }
 
 
+#ifndef WINELIB
 /**********************************************************************
  *					FixupSegment
  */
@@ -700,3 +726,4 @@
 
     return NULL;
 }
+#endif
diff --git a/memory/Imakefile b/memory/Imakefile
index edf4b6d..57b61f2 100644
--- a/memory/Imakefile
+++ b/memory/Imakefile
@@ -5,12 +5,9 @@
 SRCS = \
 	global.c \
 	heap.c \
-	atom.c
+	linear.c
 
-OBJS = \
-	global.o \
-	heap.o \
-	atom.o
+OBJS = $(SRCS:.c=.o)
 
 WineRelocatableTarget($(TOP)/$(MODULE),,$(OBJS))
 DependTarget()
diff --git a/memory/Makefile b/memory/Makefile
deleted file mode 100644
index d9abf4c..0000000
--- a/memory/Makefile
+++ /dev/null
@@ -1,18 +0,0 @@
-CFLAGS=$(COPTS) $(DEBUGOPTS) -I$(INCLUDE_DIR)
-
-OBJS=global.o heap.o atom.o linear.o
-
-default: memory.o
-
-memory.o: $(OBJS)
-	$(LD) -r -o memory.o $(OBJS)
-
-clean:
-	rm -f *.o *~ *.s dll_* *.a *#
-
-depend:
-	$(CC) $(CFLAGS) -M *.c > .depend
-
-ifeq (.depend,$(wildcard .depend))
-include .depend
-endif
diff --git a/memory/heap.c b/memory/heap.c
index 252f5fb..18f50a4 100644
--- a/memory/heap.c
+++ b/memory/heap.c
@@ -138,8 +138,8 @@
     if (new_size > m->length)
     {
 	m_free = m + 1 + m->length / sizeof(MDESC);
-	if (m_free->next != m_free || 
-	    m_free->prev != m_free ||
+	if (m_free->next == m_free || 
+	    m_free->prev == m_free ||
 	    m_free->length + sizeof(MDESC) < new_size)
 	{
 	    void *new_p = HEAP_Alloc(free_list, flags, new_size);
@@ -284,7 +284,7 @@
 /**********************************************************************
  *					HEAP_LocalFindHeap
  */
-MDESC **
+LHEAP *
 HEAP_LocalFindHeap(unsigned short owner)
 {
     LHEAP *lh;
@@ -296,13 +296,13 @@
     for (lh = LocalHeaps; lh != NULL; lh = lh->next)
     {
 	if (lh->selector == owner)
-	    return &lh->free_list;
+	    return lh;
     }
 
     return NULL;
 }
 
-#define LOCALHEAP() HEAP_LocalFindHeap(Segments[Stack16Frame[11] >> 3].owner)
+#define LOCALHEAP() (&HEAP_LocalFindHeap(Segments[Stack16Frame[11] >> 3].owner)->free_list)
 
 /**********************************************************************
  *					HEAP_LocalInit
@@ -402,8 +402,25 @@
 unsigned int
 LocalInit(unsigned int segment, unsigned int start, unsigned int end)
 {
-    HEAP_Init(LOCALHEAP(), 
-	      (void *) ((segment << 16) | start), end - start + 1);
+    unsigned short owner = Segments[Stack16Frame[11] >> 3].owner;
+    LHEAP *lh = HEAP_LocalFindHeap(owner);
+    
+    if (segment == 0)
+    {
+	/* Get current DS */
+	segment = Stack16Frame[6];
+    }
+
+    if (lh == NULL)
+    {
+	HEAP_LocalInit(owner, 
+		       (void *) ((segment << 16) | start), end - start + 1);
+    }
+    else
+    {
+	HEAP_Init(&lh->free_list,
+		  (void *) ((segment << 16) | start), end - start + 1);
+    }
 
     return segment;
 }
diff --git a/misc/Imakefile b/misc/Imakefile
index b628e2e..43ee484 100644
--- a/misc/Imakefile
+++ b/misc/Imakefile
@@ -3,46 +3,26 @@
 MODULE = misc
 
 SRCS = \
+	atom.c \
+	clipboard.c \
 	comm.c \
-	dos.c \
+	cursor.c \
 	dos_fs.c \
-	emulate.c \
 	exec.c \
 	file.c \
-	int1a.c \
-	int21.c \
-	kernel.c \
 	keyboard.c \
 	lstr.c \
 	main.c \
 	message.c \
 	profile.c \
 	rect.c \
+	resource.c \
 	sound.c \
 	spy.c \
 	user.c \
-	xt.c
+	winsocket.c
 
-OBJS = \
-	comm.o \
-	dos.o \
-	dos_fs.o \
-	emulate.o \
-	exec.o \
-	file.o \
-	int1a.o \
-	int21.o \
-	kernel.o \
-	keyboard.o \
-	lstr.o \
-	main.o \
-	message.o \
-	profile.o \
-	rect.o \
-	sound.o \
-	spy.o \
-	user.o \
-	xt.o
+OBJS = $(SRCS:.c=.o)
 
 WineRelocatableTarget($(TOP)/$(MODULE),,$(OBJS))
 DependTarget()
diff --git a/misc/Makefile b/misc/Makefile
deleted file mode 100644
index f72ab80..0000000
--- a/misc/Makefile
+++ /dev/null
@@ -1,20 +0,0 @@
-CFLAGS=$(COPTS) $(DEBUGOPTS) -I../include
-
-OBJS=main.o kernel.o user.o rect.o file.o sound.o emulate.o \
-     keyboard.o profile.o lstr.o exec.o message.o int1a.o int21.o \
-     dos_fs.o comm.o spy.o
-
-default: misc.o
-
-misc.o: $(OBJS)
-	$(LD) -r -o misc.o $(OBJS)
-
-clean:
-	rm -f *.o *~ *.s dll_* *.a *#
-
-depend:
-	$(CC) $(CFLAGS) -M *.c > .depend
-
-ifeq (.depend,$(wildcard .depend))
-include .depend
-endif
diff --git a/memory/atom.c b/misc/atom.c
similarity index 94%
rename from memory/atom.c
rename to misc/atom.c
index ad0345e..79db3b9 100644
--- a/memory/atom.c
+++ b/misc/atom.c
@@ -22,12 +22,19 @@
  * because they can't generally be differentiated from string constants
  * located below 0x10000 in the emulation library.  If you need
  * integer atoms, use the "#1234" form.
+ *
+ * 13/Feb, miguel
+ * Changed the calls to LocalAlloc to LocalAlign. When compiling WINELIB
+ * you call a special version of LocalAlloc that would do the alignement.
+ * When compiling the emulator we depend on LocalAlloc returning the
+ * aligned block. Needed to test the Library.
  */
 
 #include <ctype.h>
 #include <stdlib.h>
 #include <string.h>
 
+#include "user.h"
 #include "atom.h"
 
 
@@ -50,7 +57,7 @@
     int i;
     HANDLE handle;
     
-    handle = LocalAlloc( LMEM_MOVEABLE, sizeof(ATOMTABLE) +
+    handle = LocalAlign ( LMEM_MOVEABLE, sizeof(ATOMTABLE) +
 			 (entries-1) * sizeof(HANDLE) );
     if (!handle) return FALSE;
     *table = (ATOMTABLE *) LocalLock( handle );
@@ -126,7 +133,7 @@
 	entry = entryPtr->next;
     }
     
-    entry = (int)LocalAlloc( LMEM_MOVEABLE, sizeof(ATOMENTRY)+len-1 ) & 0xffff;
+    entry = (int)LocalAlign( LMEM_MOVEABLE, sizeof(ATOMENTRY)+len-1 ) & 0xffff;
     if (!entry) return 0;
     entryPtr = ATOM_MakePtr( table, entry );
     entryPtr->next = table->entries[hash];
@@ -166,7 +173,7 @@
     if (--entryPtr->refCount == 0)
     {
 	*prevEntry = entryPtr->next;	
-	LocalFree( entry );
+	USER_HEAP_FREE( entry );
     }    
     return 0;
 }
diff --git a/misc/clipboard.c b/misc/clipboard.c
new file mode 100644
index 0000000..f62d083
--- /dev/null
+++ b/misc/clipboard.c
@@ -0,0 +1,350 @@
+/*
+ * 'Wine' Clipboard function handling
+ *
+ * Copyright 1994 Martin Ayotte
+ */
+
+static char Copyright[] = "Copyright Martin Ayotte, 1994";
+
+/*
+#define DEBUG_CLIPBOARD
+*/
+
+#include <windows.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include "prototypes.h"
+#include "heap.h"
+#include "win.h"
+
+typedef struct tagCLIPFORMAT {
+    WORD	wFormatID;
+    WORD	wRefCount;
+    LPSTR	Name;
+    HANDLE	hData;
+    DWORD	BufSize;
+    void	*PrevFormat;
+    void	*NextFormat;
+} CLIPFORMAT;
+typedef CLIPFORMAT FAR* LPCLIPFORMAT;
+
+static HWND hWndClipboardOwner = 0;
+static HWND hWndViewer = 0;
+static WORD LastRegFormat = 0xC000;
+
+CLIPFORMAT ClipFormats[12]  = {
+    { CF_TEXT, 1, "Text", (HANDLE)NULL, 0, NULL, &ClipFormats[1] },
+    { CF_BITMAP, 1, "Bitmap", (HANDLE)NULL, 0, &ClipFormats[0], &ClipFormats[2] },
+    { CF_METAFILEPICT, 1, "MetaFile Picture", (HANDLE)NULL, 0, &ClipFormats[1], &ClipFormats[3] },
+    { CF_SYLK, 1, "Sylk", (HANDLE)NULL, 0, &ClipFormats[2], &ClipFormats[4] },
+    { CF_DIF, 1, "DIF", (HANDLE)NULL, 0, &ClipFormats[3], &ClipFormats[5] },
+    { CF_TIFF, 1, "TIFF", (HANDLE)NULL, 0, &ClipFormats[4], &ClipFormats[6] },
+    { CF_OEMTEXT, 1, "OEM Text", (HANDLE)NULL, 0, &ClipFormats[5], &ClipFormats[7] },
+    { CF_DIB, 1, "DIB", (HANDLE)NULL, 0, &ClipFormats[6], &ClipFormats[8] },
+    { CF_PALETTE, 1, "Palette", (HANDLE)NULL, 0, &ClipFormats[7], &ClipFormats[9] },
+    { CF_PENDATA, 1, "PenData", (HANDLE)NULL, 0, &ClipFormats[8], &ClipFormats[10] },
+    { CF_RIFF, 1, "RIFF", (HANDLE)NULL, 0, &ClipFormats[9], &ClipFormats[11] },
+    { CF_WAVE, 1, "Wave", (HANDLE)NULL, 0, &ClipFormats[10], NULL }
+    };
+
+/**************************************************************************
+ *			OpenClipboard		[USER.137]
+ */
+BOOL OpenClipboard(HWND hWnd)
+{
+    if (hWndClipboardOwner != 0) return FALSE;
+    hWndClipboardOwner = hWnd;
+#ifdef DEBUG_CLIPBOARD
+    printf("OpenClipboard(%04X); !\n", hWnd);
+#endif
+    return TRUE;
+}
+
+
+/**************************************************************************
+ *			CloseClipboard		[USER.138]
+ */
+BOOL CloseClipboard()
+{
+    if (hWndClipboardOwner == 0) return FALSE;
+    hWndClipboardOwner = 0;
+#ifdef DEBUG_CLIPBOARD
+    printf("CloseClipboard(); !\n");
+#endif
+    return TRUE;
+}
+
+
+/**************************************************************************
+ *			EmptyClipboard		[USER.139]
+ */
+BOOL EmptyClipboard()
+{
+    LPCLIPFORMAT lpFormat = ClipFormats; 
+    if (hWndClipboardOwner == 0) return FALSE;
+#ifdef DEBUG_CLIPBOARD
+    printf("EmptyClipboard(); !\n");
+#endif
+    while(TRUE) {
+	if (lpFormat == NULL) break;
+	if (lpFormat->hData != 0) {
+	    GlobalFree(lpFormat->hData);
+	    lpFormat->hData = 0;
+	    }
+	lpFormat = lpFormat->NextFormat;
+	}
+    return TRUE;
+}
+
+
+/**************************************************************************
+ *			GetClipboardOwner	[USER.140]
+ */
+HWND GetClipboardOwner()
+{
+#ifdef DEBUG_CLIPBOARD
+    printf("GetClipboardOwner() = %04X !\n", hWndClipboardOwner);
+#endif
+    return hWndClipboardOwner;
+}
+
+
+/**************************************************************************
+ *			SetClipboardData	[USER.141]
+ */
+HANDLE SetClipboardData(WORD wFormat, HANDLE hData)
+{
+    LPCLIPFORMAT lpFormat = ClipFormats; 
+#ifdef DEBUG_CLIPBOARD
+    printf("SetClipboardDate(%04X, %04X) !\n", wFormat, hData);
+#endif
+    while(TRUE) {
+	if (lpFormat == NULL) return 0;
+	if (lpFormat->wFormatID == wFormat) break;
+	lpFormat = lpFormat->NextFormat;
+	}
+    if (lpFormat->hData != 0) GlobalFree(lpFormat->hData);
+    lpFormat->hData = hData;
+    return lpFormat->hData;
+}
+
+
+/**************************************************************************
+ *			GetClipboardData	[USER.142]
+ */
+HANDLE GetClipboardData(WORD wFormat)
+{
+    LPCLIPFORMAT lpFormat = ClipFormats; 
+#ifdef DEBUG_CLIPBOARD
+    printf("GetClipboardData(%04X) !\n", wFormat);
+#endif
+    while(TRUE) {
+	if (lpFormat == NULL) return 0;
+	if (lpFormat->wFormatID == wFormat) break;
+	lpFormat = lpFormat->NextFormat;
+	}
+    return lpFormat->hData;
+}
+
+
+/**************************************************************************
+ *			CountClipboardFormats	[USER.143]
+ */
+int CountClipboardFormats()
+{
+    int FormatCount = 0;
+    LPCLIPFORMAT lpFormat = ClipFormats; 
+    while(TRUE) {
+	if (lpFormat == NULL) break;
+	if (lpFormat->hData != 0) {
+#ifdef DEBUG_CLIPBOARD
+	    printf("CountClipboardFormats // Find Not Empty (%04X) !\n", 
+					lpFormat->hData);
+#endif
+	    FormatCount++;
+	    }
+	lpFormat = lpFormat->NextFormat;
+	}
+#ifdef DEBUG_CLIPBOARD
+    printf("CountClipboardFormats() = %d !\n", FormatCount);
+#endif
+    return FormatCount;
+}
+
+
+/**************************************************************************
+ *			EnumClipboardFormats	[USER.144]
+ */
+WORD EnumClipboardFormats(WORD wFormat)
+{
+    LPCLIPFORMAT lpFormat = ClipFormats; 
+#ifdef DEBUG_CLIPBOARD
+    printf("EnumClipboardFormats(%04X) !\n", wFormat);
+#endif
+    if (wFormat == 0) {
+	if (lpFormat->hData != 0) 
+	    return lpFormat->wFormatID;
+	else 
+	    wFormat = lpFormat->wFormatID;
+	}
+    while(TRUE) {
+	if (lpFormat == NULL) return 0;
+	if (lpFormat->wFormatID == wFormat) break;
+	lpFormat = lpFormat->NextFormat;
+	}
+#ifdef DEBUG_CLIPBOARD
+    printf("EnumClipboardFormats // Find Last (%04X) !\n", 
+				lpFormat->wFormatID);
+#endif
+    lpFormat = lpFormat->NextFormat;
+    while(TRUE) {
+	if (lpFormat == NULL) return 0;
+	if (lpFormat->hData != 0) break;
+	lpFormat = lpFormat->NextFormat;
+	}
+#ifdef DEBUG_CLIPBOARD
+    printf("EnumClipboardFormats // Find Not Empty Id=%04X hData=%04X !\n",
+				lpFormat->wFormatID, lpFormat->hData);
+#endif
+    return lpFormat->wFormatID;
+}
+
+
+/**************************************************************************
+ *			RegisterClipboardFormat	[USER.145]
+ */
+WORD RegisterClipboardFormat(LPCSTR FormatName)
+{
+    LPCLIPFORMAT lpNewFormat; 
+    LPCLIPFORMAT lpFormat = ClipFormats; 
+    if (FormatName == NULL) return 0;
+    while(TRUE) {
+	if (lpFormat->NextFormat == NULL) break;
+	lpFormat = lpFormat->NextFormat;
+	}
+    lpNewFormat = (LPCLIPFORMAT)malloc(sizeof(CLIPFORMAT));
+    if (lpNewFormat == NULL) return 0;
+    lpFormat->NextFormat = lpNewFormat;
+#ifdef DEBUG_CLIPBOARD
+    printf("RegisterClipboardFormat('%s') !\n", FormatName);
+#endif
+    lpNewFormat->wFormatID = LastRegFormat;
+    lpNewFormat->wRefCount = 1;
+    lpNewFormat->Name = (LPSTR)malloc(strlen(FormatName) + 1);
+    if (lpNewFormat->Name == NULL) {
+	free(lpNewFormat);
+    	return 0;
+    	}
+    strcpy(lpNewFormat->Name, FormatName);
+    lpNewFormat->hData = 0;
+    lpNewFormat->BufSize = 0;
+    lpNewFormat->PrevFormat = lpFormat;
+    lpNewFormat->NextFormat = NULL;
+    return LastRegFormat++;
+}
+
+
+/**************************************************************************
+ *			GetClipboardFormatName	[USER.146]
+ */
+int GetClipboardFormatName(WORD wFormat, LPSTR retStr, short maxlen)
+{
+    LPCLIPFORMAT lpFormat = ClipFormats; 
+#ifdef DEBUG_CLIPBOARD
+    printf("GetClipboardFormat(%04X, %08X, %d) !\n", wFormat, retStr, maxlen);
+#endif
+    while(TRUE) {
+	if (lpFormat == NULL) return 0;
+	if (lpFormat->wFormatID == wFormat) break;
+	lpFormat = lpFormat->NextFormat;
+	}
+    if (lpFormat->Name == NULL) return 0;
+#ifdef DEBUG_CLIPBOARD
+    printf("GetClipboardFormat // Name='%s' !\n", lpFormat->Name);
+#endif
+    maxlen = min(maxlen - 1, strlen(lpFormat->Name));
+    printf("GetClipboardFormat // maxlen=%d !\n", maxlen);
+    memcpy(retStr, lpFormat->Name, maxlen);
+    retStr[maxlen] = 0;
+    return maxlen;
+}
+
+
+/**************************************************************************
+ *			SetClipboardViewer	[USER.147]
+ */
+HWND SetClipboardViewer(HWND hWnd)
+{
+#ifdef DEBUG_CLIPBOARD
+    printf("SetClipboardFormat(%04X) !\n", hWnd);
+#endif
+    hWndViewer = hWnd;
+}
+
+
+/**************************************************************************
+ *			GetClipboardViewer	[USER.148]
+ */
+HWND GetClipboardViewer()
+{
+#ifdef DEBUG_CLIPBOARD
+    printf("GetClipboardFormat() = %04X !\n", hWndViewer);
+#endif
+}
+
+
+/**************************************************************************
+ *			ChangeClipboardChain	[USER.149]
+ */
+BOOL ChangeClipboardChain(HWND hWnd, HWND hWndNext)
+{
+#ifdef DEBUG_CLIPBOARD
+    printf("ChangeClipboardChain(%04X, %04X) !\n", hWnd, hWndNext);
+#endif
+}
+
+
+/**************************************************************************
+ *			IsClipboardFormatAvailable	[USER.193]
+ */
+BOOL IsClipboardFormatAvailable(WORD wFormat)
+{
+    LPCLIPFORMAT lpFormat = ClipFormats; 
+#ifdef DEBUG_CLIPBOARD
+    printf("IsClipboardFormatAvailable(%04X) !\n", wFormat);
+#endif
+    while(TRUE) {
+	if (lpFormat == NULL) return FALSE;
+	if (lpFormat->wFormatID == wFormat) break;
+	lpFormat = lpFormat->NextFormat;
+	}
+    return (lpFormat->hData != 0);
+}
+
+
+/**************************************************************************
+ *			GetOpenClipboardWindow	[USER.248]
+ */
+HWND GetOpenClipboardWindow()
+{
+#ifdef DEBUG_CLIPBOARD
+    printf("GetOpenClipboardWindow() = %04X !\n", hWndClipboardOwner);
+#endif
+    return hWndClipboardOwner;
+}
+
+
+/**************************************************************************
+ *			GetPriorityClipboardFormat	[USER.402]
+ */
+int GetPriorityClipboardFormat(WORD FAR *lpPriorityList, short nCount)
+{
+#ifdef DEBUG_CLIPBOARD
+    printf("GetPriorityClipboardFormat(%08X, %d) !\n", lpPriorityList, nCount);
+#endif
+}
+
+
+
diff --git a/misc/comm.c b/misc/comm.c
index d9f5344..84cc620 100644
--- a/misc/comm.c
+++ b/misc/comm.c
@@ -7,6 +7,7 @@
 #include <termios.h>
 #include <fcntl.h>
 #include <string.h>
+#include <errno.h>
 #include <sys/stat.h>
 #if defined(__NetBSD__) || defined(__FreeBSD__)
 #include <errno.h>
@@ -53,12 +54,12 @@
 			if (!S_ISCHR(st.st_mode)) 
 				fprintf(stderr,"comm: can 't use `%s' as COM%d !\n", temp, x);
 			else
-				if ((ptr = malloc(strlen(temp)+1)) == NULL) 
+				if ((COM[serial].devicename = malloc(strlen(temp)+1)) == NULL) 
 					fprintf(stderr,"comm: can't malloc for device info!\n");
 				else {
 					COM[serial].fd = 0;
-					COM[serial].devicename = ptr;
-					strcpy(COM[serial++].devicename, temp);
+					strcpy(COM[serial].devicename, temp);
+					serial++;
 				}
 		}
 
@@ -74,17 +75,16 @@
 			if (!S_ISCHR(st.st_mode)) 
 				fprintf(stderr,"comm: can 't use `%s' as LPT%d !\n", temp, x);
 			else 
-				if ((ptr = malloc(strlen(temp)+1)) == NULL) 
+				if ((LPT[parallel].devicename = malloc(strlen(temp)+1)) == NULL) 
 					fprintf(stderr,"comm: can't malloc for device info!\n");
 				else {
-					LPT[serial].fd = 0;
-					LPT[serial].devicename = ptr;
-					strcpy(LPT[serial++].devicename, temp);
+					LPT[parallel].fd = 0;
+					strcpy(LPT[parallel].devicename, temp);
+					parallel++;
 				}
 		}
 
 	}
-	atexit(Comm_DeInit);
 }
 
 void Comm_DeInit(void)
@@ -155,6 +155,12 @@
 	if (!strncmp(device,"COM",3)) {
 		port = device[3] - '0';
 	
+
+		if (port-- == 0) {
+			fprintf(stderr, "comm: BUG ! COM0 can't exists!.\n");
+			commerror = IE_BADID;
+		}
+
 		if (!ValidCOMPort(port)) {
 			commerror = IE_BADID;
 			return -1;
@@ -240,6 +246,11 @@
 	if (!strncmp(device,"COM",3)) {
 		port = device[3] - '0';
 
+		if (port-- == 0) {
+			fprintf(stderr, "comm: BUG ! COM0 doesn't exists!.\n");
+			commerror = IE_BADID;
+		}
+
 		if (!ValidCOMPort(port)) {
 			commerror = IE_BADID;
 			return -1;
@@ -252,7 +263,7 @@
 		fd = open(COM[port].devicename, O_RDWR | O_NONBLOCK, 0);
 		if (fd == -1) {
 			commerror = WinError();
-			return -1;	
+			return -1;
 		} else {
 			COM[port].fd = fd;	
 			return fd;
@@ -473,9 +484,20 @@
 		commerror = WinError();	
 		return -1;
 	}
-	cfmakeraw(&port);
+
 	port.c_cc[VMIN] = 0;
-	port.c_cc[VTIME] = 0;
+	port.c_cc[VTIME] = 1;
+
+	port.c_iflag &= ~(ISTRIP|BRKINT|IGNCR|ICRNL|INLCR|IMAXBEL);
+	port.c_iflag |= (IGNBRK);
+
+	port.c_oflag &= ~(OPOST);
+
+	port.c_cflag &= ~(HUPCL);
+	port.c_cflag |= CLOCAL | CREAD;
+
+	port.c_lflag &= ~(ICANON|ECHO|ISIG);
+	port.c_lflag |= NOFLSH;
 
 	fprintf(stderr,"SetCommState: baudrate %d\n",lpdcb->BaudRate);
 #ifdef CBAUD
diff --git a/loader/cursor.c b/misc/cursor.c
similarity index 94%
rename from loader/cursor.c
rename to misc/cursor.c
index ff8c7bd..931d538 100644
--- a/loader/cursor.c
+++ b/misc/cursor.c
@@ -7,7 +7,6 @@
 #define DEBUG_CURSOR
 */
 
-#include <X11/Intrinsic.h>
 #include <X11/cursorfont.h>
 #include <X11/Xlib.h>
 #include <stdio.h>
@@ -293,6 +292,30 @@
 
 
 /**********************************************************************
+ *			CURSOR_SetWinCursor
+ *
+ * Set the cursor for a given window. To be used instead of SetCursor()
+ * wherever possible.
+ */
+HCURSOR CURSOR_SetWinCursor( HWND hwnd, HCURSOR hCursor )
+{
+    CURSORALLOC	*lpcur;
+    HCURSOR	hOldCursor;
+    WND * wndPtr = WIN_FindWndPtr( hwnd );
+
+    if (!wndPtr || !hCursor) return 0;
+    lpcur = (CURSORALLOC *)GlobalLock(hCursor);
+    hOldCursor = hActiveCursor;
+    if (hActiveCursor != hCursor) ShowCursCount = 0;
+    if (ShowCursCount >= 0)
+	XDefineCursor( display, wndPtr->window, lpcur->xcursor );
+    GlobalUnlock(hCursor);
+    hActiveCursor = hCursor;
+    return hOldCursor;
+}
+
+
+/**********************************************************************
  *			SetCursor [USER.69]
  */
 HCURSOR SetCursor(HCURSOR hCursor)
diff --git a/misc/dos_fs.c b/misc/dos_fs.c
index 3840972..cc220c4 100644
--- a/misc/dos_fs.c
+++ b/misc/dos_fs.c
@@ -10,7 +10,7 @@
 #include <stdlib.h>
 #include <string.h>
 #include <sys/stat.h>
-#ifdef __linux__
+#if defined(__linux__) || defined(sun)
 #include <sys/vfs.h>
 #endif
 #if defined(__NetBSD__) || defined(__FreeBSD__)
@@ -73,15 +73,6 @@
 	ToDos(TempDirectory);
 	ToDos(WindowsPath);
 
-#ifdef DEBUG
-	fprintf(stderr,"wine.ini = %s\n",WINE_INI);
-	fprintf(stderr,"win.ini = %s\n",WIN_INI);
-	fprintf(stderr,"windir = %s\n",WindowsDirectory);
-	fprintf(stderr,"sysdir = %s\n",SystemDirectory);
-	fprintf(stderr,"tempdir = %s\n",TempDirectory);
-	fprintf(stderr,"path = %s\n",WindowsPath);
-#endif
-
 	for (x=0; x!=MAX_DOS_DRIVES; x++) {
 		DosDrives[x].serialnumber = (0xEB0500L | x);
 		
@@ -104,14 +95,11 @@
 				temp[strlen(temp)] = '\0';
 			DosDrives[x].rootdir = ptr;
 			strcpy(DosDrives[x].rootdir, temp);
-			strcpy(DosDrives[x].cwd, "/windows/");
+			strcpy(DosDrives[x].cwd, "/");
 			strcpy(DosDrives[x].label, "DRIVE-");
 			strcat(DosDrives[x].label, drive);
 			DosDrives[x].disabled = 0;
 	}
-
-	atexit(DOS_DeInitFS);
-
 	DOS_SetDefaultDrive(2);
 
 	for (x=0; x!=MAX_DOS_DRIVES; x++) {
@@ -132,6 +120,14 @@
 	for (x=0; x!=MAX_OPEN_DIRS ; x++)
 		DosDirs[x].inuse = 0;
 
+#ifdef DEBUG
+	fprintf(stderr,"wine.ini = %s\n",WINE_INI);
+	fprintf(stderr,"win.ini = %s\n",WIN_INI);
+	fprintf(stderr,"windir = %s\n",WindowsDirectory);
+	fprintf(stderr,"sysdir = %s\n",SystemDirectory);
+	fprintf(stderr,"tempdir = %s\n",TempDirectory);
+	fprintf(stderr,"path = %s\n",WindowsPath);
+#endif
 }
 
 void DOS_DeInitFS(void)
@@ -187,7 +183,7 @@
 	if (diskdrives)
 		diskdrives--;
 
-	equipment = diskdrives << 6;
+	equipment = (diskdrives << 6) || 0x02;
 
 	return (equipment);
 }
@@ -633,17 +629,23 @@
  */
 char *WineIniFileName(void)
 {
-    static char *IniName = NULL;
+    static char *IniName = NULL, *env;
+
     char inipath[256];
     
     if (IniName)
 	return IniName;
 
     getcwd(inipath, 256);
-    strcat(inipath, ";");
-    strcat(inipath, getenv("HOME"));
-    strcat(inipath, ";");
-    strcat(inipath, getenv("WINEPATH"));
+    
+    if ((env = getenv("HOME")) !=NULL) {
+	    strcat(inipath, ";");
+	    strcat(inipath, env);
+    }
+    if ((env = getenv("WINEPATH")) !=NULL) {
+	    strcat(inipath, ";");
+	    strcat(inipath, env);
+    }
 
     IniName = malloc(1024);
     if (FindFile(IniName, 1024, "wine.ini", NULL, inipath) == NULL)
@@ -672,6 +674,43 @@
 	return name;
 }
 
+int match(char *filename, char *filemask)
+{
+	int x, masklength = strlen(filemask);
+
+#ifdef DEBUG
+	fprintf(stderr, "match: %s, %s\n", filename, filemask);
+#endif
+
+	for (x = 0; x != masklength ; x++) {
+#ifdef DEBUG
+		printf("(%c%c) ", *filename, filemask[x]); 
+#endif
+
+		if (!*filename)
+			/* stop if EOFname */
+			return 1;
+
+		if (filemask[x] == '?') {
+			/* skip the next char */
+			filename++;
+			continue;
+		}
+
+		if (filemask[x] == '*') {
+			/* skip each char until '.' or EOFname */
+			while (*filename && *filename !='.')
+				filename++;
+			continue;
+		}
+		if (filemask[x] != *filename)
+			return 0;
+
+		filename++;
+	}
+	return 1;
+}
+
 struct dosdirent *DOS_opendir(char *dosdirname)
 {
 	int x,y;
@@ -687,21 +726,24 @@
 	if ((unixdirname = GetDirectUnixFileName(dosdirname)) == NULL)
 		return NULL;
 
-	strcpy(temp,unixdirname);
+	strcpy(temp, unixdirname);
 
 
 	y = strlen(temp);
-
 	while (y--)
 	{
 		if (temp[y] == '/') 
 		{
-			temp[y] = '\0';
+			temp[y++] = '\0';
+			strcpy(DosDirs[x].filemask, temp +y);
+			ToDos(DosDirs[x].filemask);
 			break;
 		}
 	}
 
-	fprintf(stderr,"%s -> %s\n",unixdirname,temp);
+#ifdef DEBUG
+	fprintf(stderr,"DOS_opendir: %s -> %s\n", unixdirname, temp);
+#endif
 
 	DosDirs[x].inuse = 1;
 	strcpy(DosDirs[x].unixpath, temp);
@@ -722,17 +764,20 @@
 	if (!de->inuse)
 		return NULL;
 	
-	if ((d = readdir(de->ds)) == NULL) 
-	{
-		closedir(de->ds);
-		de->inuse = 0;
-		return de;
-	}
+	do {
+		if ((d = readdir(de->ds)) == NULL) 
+		{
+			closedir(de->ds);
+			de->inuse = 0;
+			return de;
+		}
 
-	strcpy(de->filename, d->d_name);
-	if (d->d_reclen > 12)
-		de->filename[12] = '\0';
-	ToDos (de->filename);
+		strcpy(de->filename, d->d_name);
+		if (d->d_reclen > 12)
+			de->filename[12] = '\0';
+		
+		ToDos(de->filename);
+	} while ( !match(de->filename, de->filemask) );
 
 	de->attribute = 0x0;
 
diff --git a/misc/exec.c b/misc/exec.c
index e20e53a..a41a95c 100644
--- a/misc/exec.c
+++ b/misc/exec.c
@@ -3,7 +3,7 @@
 *
 */
 
-#include "win.h"
+#include "windows.h"
 
 #define HELP_CONTEXT      0x0001
 #define HELP_QUIT         0x0002
@@ -25,7 +25,7 @@
 {
    int X, X2, C;
    char *ArgV[20];
-   printf("WinExec(%s, %u)\n", lpCmdLine, nCmdShow);
+   printf("WinExec('%s', %04X)\n", lpCmdLine, nCmdShow);
    for (X = X2 = C = 0; X < strlen(lpCmdLine) + 1; X++) {
       if ((lpCmdLine[X] == ' ') || (lpCmdLine[X] == '\0')) {
           ArgV[C] = (char *)malloc(X - X2 + 1);
diff --git a/misc/file.c b/misc/file.c
index adc4368..de8a7e2 100644
--- a/misc/file.c
+++ b/misc/file.c
@@ -23,6 +23,7 @@
 #include <stdio.h>
 #include <fcntl.h>
 #include <limits.h>
+#include <unistd.h>
 #include "prototypes.h"
 
 char WindowsDirectory[256], SystemDirectory[256], TempDirectory[256];
@@ -33,7 +34,7 @@
 
  Emulate the _lopen windows call
  ***************************************************************************/
-WORD KERNEL__lopen (LPSTR lpPathName, WORD iReadWrite)
+int _lopen (LPSTR lpPathName, int iReadWrite)
 {
   int  handle;
   char *UnixFileName;
@@ -60,7 +61,7 @@
 /***************************************************************************
  _lread
  ***************************************************************************/
-WORD KERNEL__lread (WORD hFile, LPSTR lpBuffer, WORD wBytes)
+WORD _lread (int hFile, LPSTR lpBuffer, int wBytes)
 {
   int result;
 
@@ -80,7 +81,7 @@
 /****************************************************************************
  _lwrite
 ****************************************************************************/
-WORD KERNEL__lwrite (WORD hFile, LPSTR lpBuffer, WORD wBytes)
+WORD _lwrite (int hFile, LPSTR lpBuffer, int wBytes)
 {
 	int result;
 
@@ -99,7 +100,7 @@
 /***************************************************************************
  _lclose
  ***************************************************************************/
-WORD KERNEL__lclose (WORD hFile)
+int _lclose (int hFile)
 {
 #ifdef DEBUG_FILE
   fprintf(stderr, "_lclose: handle %d\n", hFile);
@@ -114,7 +115,7 @@
  Warning:  This is nearly totally untested.  It compiles, that's it...
                                             -SL 9/13/93
  **************************************************************************/
-WORD KERNEL_OpenFile (LPSTR lpFileName, LPOFSTRUCT ofs, WORD wStyle)
+int OpenFile (LPSTR lpFileName, LPOFSTRUCT ofs, WORD wStyle)
 {
   int base,flags;
 
@@ -141,7 +142,7 @@
     }
   else
     {
-      return KERNEL__lopen (lpFileName, wStyle);
+      return _lopen (lpFileName, wStyle);
    }
 }
 
@@ -152,6 +153,10 @@
  Linux isn't limited to 20 files, this one's easy. - SL
  **************************************************************************/
 
+#if !defined (OPEN_MAX)
+/* This one is for the Sun */
+#define OPEN_MAX _POSIX_OPEN_MAX
+#endif
 WORD SetHandleCount (WORD wNumber)
 {
   printf("SetHandleCount(%d)\n",wNumber);
@@ -161,7 +166,7 @@
 /***************************************************************************
  _llseek
  ***************************************************************************/
-LONG KERNEL__llseek (WORD hFile, LONG lOffset, int nOrigin)
+LONG _llseek (int hFile, LONG lOffset, int nOrigin)
 {
 	int origin;
 	
@@ -184,7 +189,7 @@
 /***************************************************************************
  _lcreate
  ***************************************************************************/
-LONG KERNEL__lcreate (LPSTR lpszFilename, int fnAttribute)
+LONG _lcreate (LPSTR lpszFilename, int fnAttribute)
 {
 	int handle;
 	char *UnixFileName;
diff --git a/misc/main.c b/misc/main.c
index c371d01..59bd197 100644
--- a/misc/main.c
+++ b/misc/main.c
@@ -20,13 +20,15 @@
 Display * display;
 Screen * screen;
 
+char *ProgramName;		/* Used by resource.c with WINELIB */
 
 struct options Options =
 {  /* default options */
     NULL,           /* spyFilename */
     FALSE,          /* usePrivateMap */
     FALSE,          /* synchronous */
-    SW_SHOWNORMAL   /* cmdShow */
+    SW_SHOWNORMAL,  /* cmdShow */
+    FALSE
 };
 
 
@@ -36,7 +38,8 @@
     { "-iconic",      ".iconic",      XrmoptionNoArg,  (caddr_t)"on" },
     { "-privatemap",  ".privatemap",  XrmoptionNoArg,  (caddr_t)"on" },
     { "-synchronous", ".synchronous", XrmoptionNoArg,  (caddr_t)"on" },
-    { "-spy",         ".spy",         XrmoptionSepArg, (caddr_t)NULL }
+    { "-spy",         ".spy",         XrmoptionSepArg, (caddr_t)NULL },
+    { "-relaydbg",    ".relaydbg",    XrmoptionNoArg,  (caddr_t)"on" }
 };
 
 #define NB_OPTIONS  (sizeof(optionsTable) / sizeof(optionsTable[0]))
@@ -66,8 +69,11 @@
     XrmDatabase db = NULL;
 
     XrmParseCommand( &db, optionsTable, NB_OPTIONS, "wine", argc, argv );
+#ifdef WINELIB
+    /* Need to assemble command line and pass it to WinMain */
+#else
     if (*argc < 2) MAIN_Usage( argv[0] );
-
+#endif
     if (XrmGetResource( db, "wine.display", "Wine.display", &dummy, &value ))
 	display_name = value.addr;
     else display_name = NULL;
@@ -85,6 +91,8 @@
 	Options.usePrivateMap = TRUE;
     if (XrmGetResource(db,"wine.synchronous","Wine.synchronous",&dummy,&value))
 	Options.synchronous = TRUE;
+    if (XrmGetResource(db,"wine.relaydbg","Wine.relaydbg",&dummy,&value))
+	Options.relay_debug = TRUE;
     if (XrmGetResource(db,"wine.spy","Wine.spy",&dummy,&value))
 	Options.spyFilename = value.addr;
 }
@@ -95,7 +103,10 @@
  */
 int main( int argc, char *argv[] )
 {    
-
+    int ret_val;
+    XKeyboardState keyboard_state;
+    XKeyboardControl keyboard_value;
+    
     XrmInitialize();
     
     MAIN_ParseOptions( &argc, argv );
@@ -105,16 +116,171 @@
     XT_screen = screen;
     if (Options.synchronous) XSynchronize( display, True );
 
+    XGetKeyboardControl(display, &keyboard_state);
+
+    ProgramName = argv [0];
     DOS_InitFS();
     Comm_Init();
-    return _WinMain( argc, argv );
-}
 
+    ret_val = _WinMain( argc, argv );
+    
+    Comm_DeInit ();
+    DOS_DeInitFS ();
+    sync_profiles ();
+
+    /* restore sounds/keyboard settings */
+
+    keyboard_value.key_click_percent	= keyboard_state.key_click_percent;
+    keyboard_value.bell_percent 	= keyboard_state.bell_percent;
+    keyboard_value.bell_pitch		= keyboard_state.bell_pitch;
+    keyboard_value.bell_duration	= keyboard_state.bell_duration;
+    keyboard_value.auto_repeat_mode	= keyboard_state.global_auto_repeat;
+
+    XChangeKeyboardControl(display, KBKeyClickPercent | KBBellPercent | 
+    	KBBellPitch | KBBellDuration | KBAutoRepeatMode, &keyboard_value);
+
+    return ret_val;
+}
 
 /***********************************************************************
  *           MessageBeep    (USER.104)
  */
 void MessageBeep( WORD i )
 {
-    XBell( display, 100 );
+	XBell(display, 100);
+}
+
+/***********************************************************************
+ *      GetVersion (KERNEL.3)
+ */
+LONG GetVersion(void)
+{
+	return (0x04001003); /* dos version 4.00, win ver 3.1 */
+}
+
+/***********************************************************************
+ *	GetWinFlags (KERNEL.132)
+ */
+LONG GetWinFlags(void)
+{
+	return (WF_STANDARD | WF_CPU286 | WF_PMODE | WF_80x87);
+}
+
+/***********************************************************************
+ *	GetTimerResolution (USER.14)
+ */
+LONG GetTimerResolution(void)
+{
+	return (1000);
+}
+
+/***********************************************************************
+ *	SystemParametersInfo (USER.483)
+ */
+BOOL SystemParametersInfo (UINT uAction, UINT uParam, void FAR *lpvParam, UINT fuWinIni)
+{
+	XKeyboardState		keyboard_state;
+	XKeyboardControl	keyboard_value;
+
+	fprintf(stderr, "SystemParametersInfo: action %d, param %x, flag %x\n", 
+			uAction, uParam, fuWinIni);
+
+	switch (uAction) {
+		case SPI_GETBEEP:
+			XGetKeyboardControl(display, &keyboard_state);
+			if (keyboard_state.bell_percent == 0)
+				*(BOOL *) lpvParam = FALSE;
+			else
+				*(BOOL *) lpvParam = TRUE;
+			break;
+		
+		case SPI_GETBORDER:
+			*(int *) lpvParam = 1;
+			break;
+
+		case SPI_GETFASTTASKSWITCH:
+			*(BOOL *) lpvParam = FALSE;
+			break;
+
+		case SPI_GETGRIDGRANULARITY:
+			*(int *) lpvParam = 1;
+			break;
+
+		case SPI_GETICONTITLEWRAP:
+			*(BOOL *) lpvParam = FALSE;
+			break;
+
+		case SPI_GETKEYBOARDDELAY:
+			*(int *) lpvParam = 1;
+			break;
+
+		case SPI_GETKEYBOARDSPEED:
+			*(WORD *) lpvParam = 30;
+			break;
+
+		case SPI_GETMENUDROPALIGNMENT:
+			*(BOOL *) lpvParam = FALSE;
+			break;
+
+		case SPI_GETSCREENSAVEACTIVE:
+			*(WORD *) lpvParam = FALSE;
+			break;
+
+		case SPI_GETSCREENSAVETIMEOUT:
+			*(int *) lpvParam = 0;
+			break;
+
+		case SPI_ICONHORIZONTALSPACING:
+			if (lpvParam == NULL)
+				fprintf(stderr, "SystemParametersInfo: Horizontal icon spacing set to %d\n.", uParam);
+			else
+				*(int *) lpvParam = 50;
+			break;
+
+		case SPI_ICONVERTICALSPACING:
+			if (lpvParam == NULL)
+				fprintf(stderr, "SystemParametersInfo: Vertical icon spacing set to %d\n.", uParam);
+			else
+				*(int *) lpvParam = 50;
+			break;
+
+		case SPI_SETBEEP:
+			if (uParam == TRUE)
+				keyboard_value.bell_percent = -1;
+			else
+				keyboard_value.bell_percent = 0;			
+   			XChangeKeyboardControl(display, KBBellPercent, 
+   							&keyboard_value);
+			break;
+
+		case SPI_SETSCREENSAVEACTIVE:
+			if (uParam == TRUE)
+				XActivateScreenSaver(display);
+			else
+				XResetScreenSaver(display);
+			break;
+
+		case SPI_SETSCREENSAVETIMEOUT:
+			XSetScreenSaver(display, uParam, 60, DefaultBlanking, 
+						DefaultExposures);
+			break;
+
+		case SPI_LANGDRIVER:
+		case SPI_SETBORDER:
+		case SPI_SETDESKPATTERN:
+		case SPI_SETDESKWALLPAPER:
+		case SPI_SETDOUBLECLKHEIGHT:
+		case SPI_SETDOUBLECLICKTIME:
+		case SPI_SETDOUBLECLKWIDTH:
+		case SPI_SETFASTTASKSWITCH:
+		case SPI_SETKEYBOARDDELAY:
+		case SPI_SETKEYBOARDSPEED:
+			fprintf(stderr, "SystemParametersInfo: option %d ignored.\n", uParam);
+			break;
+
+		default:
+			fprintf(stderr, "SystemParametersInfo: unknown option %d.\n", uParam);
+			break;		
+	}
+	return 1;
 }
diff --git a/misc/message.c b/misc/message.c
index 364b460..79a49f7 100644
--- a/misc/message.c
+++ b/misc/message.c
@@ -17,6 +17,8 @@
 #include "heap.h"
 #include "win.h"
 
+extern HINSTANCE hSysRes;
+extern HBITMAP hUpArrow;
 
 typedef struct tagMSGBOX {
     LPSTR	Title;
@@ -39,7 +41,7 @@
  *			MessageBox  [USER.1]
  */
 
-int MessageBox( HWND hWnd, LPSTR str, LPSTR title, WORD type )
+int MessageBox(HWND hWnd, LPSTR str, LPSTR title, WORD type)
 {
     HWND    	hDlg;
     WND	    	*wndPtr;
@@ -47,15 +49,20 @@
     MSG	    	msg;
     MSGBOX	mb;
     DWORD	dwStyle;
+    HINSTANCE	hInst;
     wndPtr = WIN_FindWndPtr(hWnd);
 #ifdef DEBUG_MSGBOX
     printf( "MessageBox: '%s'\n", str );
 #endif
+    if (wndPtr == NULL)
+	hInst = hSysRes;
+    else
+	hInst = wndPtr->hInstance;
     wndClass.style           = CS_HREDRAW | CS_VREDRAW ;
     wndClass.lpfnWndProc     = (WNDPROC)SystemMessageBoxProc;
     wndClass.cbClsExtra      = 0;
     wndClass.cbWndExtra      = 0;
-    wndClass.hInstance       = wndPtr->hInstance;
+    wndClass.hInstance       = hInst;
     wndClass.hIcon           = (HICON)NULL;
     wndClass.hCursor         = LoadCursor((HANDLE)NULL, IDC_ARROW); 
     wndClass.hbrBackground   = GetStockObject(WHITE_BRUSH);
@@ -70,7 +77,7 @@
     dwStyle = WS_POPUP | WS_DLGFRAME | WS_VISIBLE;
     if ((type & (MB_SYSTEMMODAL | MB_TASKMODAL)) == 0) dwStyle |= WS_CAPTION;
     hDlg = CreateWindow("MESSAGEBOX", title, dwStyle, 100, 150, 400, 120,
-    	(HWND)NULL, (HMENU)NULL, wndPtr->hInstance, (LPSTR)&mb);
+    	(HWND)NULL, (HMENU)NULL, hInst, (LPSTR)&mb);
     if (hDlg == 0) return 0;
     while(TRUE) {
 	if (!mb.ActiveFlg) break;
@@ -78,15 +85,13 @@
 	TranslateMessage(&msg);
 	DispatchMessage(&msg);
 	}
-    if (!UnregisterClass("MESSAGEBOX", wndPtr->hInstance)) return 0;
+    if (!UnregisterClass("MESSAGEBOX", hInst)) return 0;
 #ifdef DEBUG_MSGBOX
     printf( "MessageBox return %04X !\n", mb.wRetVal);
 #endif
     return(mb.wRetVal);
 }
 
-
-
 LPMSGBOX MsgBoxGetStorageHeader(HWND hwnd)
 {
     WND  *wndPtr;
@@ -286,17 +291,13 @@
 	CreditMode = FALSE;
 	strcpy(str, "WINELOGO");
 	hBitMap = LoadBitmap((HINSTANCE)NULL, (LPSTR)str);
-/*	getcwd(str, 256);
-	strcat(str, ";");
-	strcat(str, getenv("HOME"));
-	strcat(str, ";");
-	strcat(str, getenv("WINEPATH")); */
+
 	strcpy(str, "PROPOSED_LICENSE");
 	printf("str = '%s'\n", str);
-	hFile = KERNEL_OpenFile((LPSTR)str, &ofstruct, OF_READ);
+	hFile = OpenFile((LPSTR)str, &ofstruct, OF_READ);
 	ptr = (LPSTR)malloc(2048);
 	lseek(hFile, 0L, SEEK_SET);
-	KERNEL__lread(hFile, ptr, 2000L);
+	_lread(hFile, ptr, 2000L);
 	close(hFile);
 	return TRUE;
     case WM_PAINT:
@@ -353,3 +354,12 @@
 }
 
 
+/**************************************************************************
+ *			FatalAppExit  [USER.137]
+ */
+
+void FatalAppExit(WORD wAction, LPSTR str)
+{
+MessageBox((HWND)NULL, str, NULL, MB_SYSTEMMODAL | MB_OK);
+exit(1);
+}
diff --git a/misc/rect.c b/misc/rect.c
index 6adc0a5..cbb2281 100644
--- a/misc/rect.c
+++ b/misc/rect.c
@@ -90,7 +90,8 @@
  */
 BOOL IntersectRect( LPRECT dest, LPRECT src1, LPRECT src2 )
 {
-    if ((src1->left >= src2->right) || (src2->left >= src1->right) ||
+    if (IsRectEmpty(src1) || IsRectEmpty(src2) ||
+	(src1->left >= src2->right) || (src2->left >= src1->right) ||
 	(src1->top >= src2->bottom) || (src2->top >= src1->bottom))
     {
 	SetRectEmpty( dest );
diff --git a/loader/resource.c b/misc/resource.c
similarity index 89%
rename from loader/resource.c
rename to misc/resource.c
index bf2d185..680b61f1 100644
--- a/loader/resource.c
+++ b/misc/resource.c
@@ -1,16 +1,17 @@
+#ifndef WINELIB
 static char RCSId[] = "$Id: resource.c,v 1.4 1993/07/04 04:04:21 root Exp root $";
 static char Copyright[] = "Copyright  Robert J. Amstadt, 1993";
+#endif
 
-#include <X11/Intrinsic.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <sys/types.h>
 #include <sys/stat.h>
 #include <fcntl.h>
 #include <unistd.h>
+#include "arch.h"
 #include "prototypes.h"
 #include "windows.h"
-#include "win.h"
 #include "gdi.h"
 #include "wine.h"
 #include "icon.h"
@@ -35,6 +36,16 @@
 
 HANDLE RSC_LoadResource(int instance, char *rsc_name, int type, int *image_size_ret);
 
+extern char *ProgramName;
+
+/*****************************************************************************
+  * Super Patch, I promise to arrange things as soon as I can.
+  *
+******************************************************************************/
+#ifdef WINELIB
+#include "../loader/wine.c"
+#endif
+
 
 /**********************************************************************
  *					OpenResourceFile
@@ -43,21 +54,28 @@
 OpenResourceFile(HANDLE instance)
 {
     struct w_files *w;
+    char   *res_file;
     
     if (ResourceInst == instance)
 	return ResourceFd;
-    
+
     w = GetFileInfo(instance);
     if (w == NULL)
 	return -1;
+    ResourceFileInfo = w;
+    res_file = w->filename;
     
     if (ResourceFd >= 0)
 	close(ResourceFd);
     
     ResourceInst = instance;
-    ResourceFileInfo = w;
-    ResourceFd = open(w->filename, O_RDONLY);
-    
+
+    ResourceFd = open (res_file, O_RDONLY);
+
+#ifdef DEBUG_RESOURCE
+    printf("OpenResourceFile(%04X) // file='%s' hFile=%04X !\n", 
+		instance, w->filename, ResourceFd);
+#endif
     return ResourceFd;
 }
 
@@ -128,6 +146,12 @@
 			   bits, image, DIB_RGB_COLORS );
 } 
 
+#ifndef WINELIB
+load_typeinfo (int fd, struct resource_typeinfo_s *typeinfo)
+{
+    return read (fd, typeinfo, sizeof (*typeinfo)) == sizeof (*typeinfo);
+}
+#endif
 /**********************************************************************
  *					FindResourceByNumber
  */
@@ -157,26 +181,30 @@
     	printf("FindResourceByNumber (%s) bad block size !\n", resource_id);
 	return -1;
     }
-    
+    size_shift = CONV_SHORT(size_shift);
     /*
      * Find resource.
      */
     typeinfo.type_id = 0xffff;
     while (typeinfo.type_id != 0) {
-	if (read(ResourceFd, &typeinfo, sizeof(typeinfo)) !=
-	    sizeof(typeinfo)) {
+	if (!load_typeinfo (ResourceFd, &typeinfo)){
 	    printf("FindResourceByNumber (%X) bad typeinfo size !\n", resource_id);
 	    return -1;
 	    }
 #ifdef DEBUG_RESOURCE
-	printf("FindResourceByNumber type=%X count=%d\n", 
-			typeinfo.type_id, typeinfo.count);
+	printf("FindResourceByNumber type=%X count=%d searched=%d \n", 
+			typeinfo.type_id, typeinfo.count, type_id);
 #endif
 	if (typeinfo.type_id == 0) break;
 	if (typeinfo.type_id == type_id || type_id == -1) {
 	    for (i = 0; i < typeinfo.count; i++) {
+#ifndef WINELIB
 		if (read(ResourceFd, &nameinfo, sizeof(nameinfo)) != 
-		    sizeof(nameinfo)) {
+		    sizeof(nameinfo))
+#else
+		if (!load_nameinfo (ResourceFd, &nameinfo))
+#endif
+		{
 		    printf("FindResourceByNumber (%X) bad nameinfo size !\n", resource_id);
 		    return -1;
 		    }
@@ -229,6 +257,7 @@
     	printf("FindResourceByName (%s) bad block size !\n", resource_name);
 	return -1;
     }
+    size_shift = CONV_SHORT (size_shift);
     
     /*
      * Find resource.
@@ -236,43 +265,55 @@
     typeinfo.type_id = 0xffff;
     while (typeinfo.type_id != 0)
     {
-	if (read(ResourceFd, &typeinfo, sizeof(typeinfo)) !=
-	    sizeof(typeinfo))
+	if (!load_typeinfo (ResourceFd, &typeinfo))
 	{
 	    printf("FindResourceByName (%s) bad typeinfo size !\n", resource_name);
 	    return -1;
 	}
 #ifdef DEBUG_RESOURCE
-	printf("FindResourceByName typeinfo.type_id=%X type_id=%X\n",
-			typeinfo.type_id, type_id);
+	printf("FindResourceByName typeinfo.type_id=%X count=%d type_id=%X\n",
+			typeinfo.type_id, typeinfo.count, type_id);
 #endif
 	if (typeinfo.type_id == 0) break;
 	if (typeinfo.type_id == type_id || type_id == -1)
 	{
 	    for (i = 0; i < typeinfo.count; i++)
 	    {
+#ifndef WINELIB
 		if (read(ResourceFd, &nameinfo, sizeof(nameinfo)) != 
 		    sizeof(nameinfo))
+#else
+		if (!load_nameinfo (ResourceFd, &nameinfo))
+#endif
 		{
 		    printf("FindResourceByName (%s) bad nameinfo size !\n", resource_name);
 		    return -1;
 		}
-
-		if (nameinfo.id & 0x8000)
-		    continue;
-		
+/*
+		if ((nameinfo.id & 0x8000) != 0) continue;
+*/		
+#ifdef DEBUG_RESOURCE
+		printf("FindResourceByName // nameinfo.id=%04X !\n", nameinfo.id);
+#endif
 		old_pos = lseek(ResourceFd, 0, SEEK_CUR);
 		new_pos = rtoff + nameinfo.id;
 		lseek(ResourceFd, new_pos, SEEK_SET);
 		read(ResourceFd, &nbytes, 1);
+#ifdef DEBUG_RESOURCE
+		printf("FindResourceByName // namesize=%d !\n", nbytes);
+#endif
+ 		nbytes = CONV_CHAR_TO_LONG (nbytes);
 		read(ResourceFd, name, nbytes);
 		lseek(ResourceFd, old_pos, SEEK_SET);
 		name[nbytes] = '\0';
 #ifdef DEBUG_RESOURCE
-		printf("FindResourceByName type_id=%X name='%s' resource_name='%s'\n", 
-				typeinfo.type_id, name, resource_name);
+		printf("FindResourceByName type_id=%X (%d of %d) name='%s' resource_name='%s'\n", 
+			typeinfo.type_id, i + 1, typeinfo.count, 
+			name, resource_name);
 #endif
-		if (strcasecmp(name, resource_name) == 0)
+/*		if (strcasecmp(name, resource_name) == 0) */
+		if (strcasecmp(name, resource_name) == 0 ||
+		(nameinfo.id == 0x8001 && type_id == NE_RSCTYPE_MENU))
 		{
 		    memcpy(result_p, &nameinfo, sizeof(nameinfo));
 		    return size_shift;
@@ -333,7 +374,6 @@
 	ReleaseDC(GetDesktopWindow(), hdc); 
 	return 0;
 	}
-    printf("LoadIcon Alloc hIcon=%X\n", hIcon);
     lpico = (ICONALLOC *)GlobalLock(hIcon);
     lpico->descriptor = *lpicodesc;
     width = lpicodesc->Width;
@@ -390,6 +430,9 @@
     DeleteDC(hMemDC2);
     ReleaseDC(GetDesktopWindow(), hdc);
     GlobalUnlock(hIcon);
+#ifdef DEBUG_RESOURCE
+    printf("LoadIcon Alloc hIcon=%X\n", hIcon);
+#endif
     return hIcon;
 }
 
@@ -679,7 +722,10 @@
 	size_shift = FindResourceByName(&nameinfo, type, rsc_name);
     }
     if (size_shift == -1) {
-    	printf("RSC_LoadResource / Resource '%X' not Found !\n", rsc_name);
+    	if ((LONG)rsc_name >= 0x00010000L)
+	    printf("RSC_LoadResource / Resource '%s' not Found !\n", rsc_name);
+	else
+	    printf("RSC_LoadResource / Resource '%X' not Found !\n", rsc_name);
 	return 0;
 	}
     /*
diff --git a/misc/user.c b/misc/user.c
index d8e0596..51b94af 100644
--- a/misc/user.c
+++ b/misc/user.c
@@ -18,6 +18,7 @@
 extern BOOL GDI_Init();
 extern void SYSMETRICS_Init();
 
+#ifndef WINELIB
 /***********************************************************************
  *           USER_HeapInit
  */
@@ -29,7 +30,7 @@
     HEAP_Init( &USER_Heap, s->base_addr, USER_HEAP_SIZE );
     return TRUE;
 }
-
+#endif
 
 /**********************************************************************
  *					USER_InitApp
@@ -52,9 +53,11 @@
       /* Initialize system colors and metrics*/
     SYSMETRICS_Init();
     SYSCOLOR_Init();
-    
+
+#ifndef WINELIB    
       /* Create USER heap */
     if (!USER_HeapInit()) return 0;
+#endif
     
       /* Create the DCEs */
     DCE_Init();
@@ -72,6 +75,11 @@
       /* Create task message queue */
     queueSize = GetProfileInt( "windows", "DefaultQueueSize", 8 );
     if (!SetMessageQueue( queueSize )) return 0;
+
+#ifndef WINELIB
+    /* Initialize DLLs */
+    InitializeLoadedDLLs();
+#endif
         
     return 1;
 }
diff --git a/misc/winsocket.c b/misc/winsocket.c
new file mode 100644
index 0000000..d5483f9
--- /dev/null
+++ b/misc/winsocket.c
@@ -0,0 +1,470 @@
+/*
+ * based on Windows Sockets 1.1 specs
+ * (ftp.microsoft.com:/Advsys/winsock/spec11/WINSOCK.TXT)
+ */
+ 
+#include <netdb.h>
+#include <stdio.h>
+#include <sys/types.h>
+#include <sys/socket.h>
+#if defined(__FreeBSD__)
+#include <netinet/in.h>
+#endif
+#include <arpa/inet.h>
+#include <errno.h>
+#include <netdb.h>
+#include "winsock.h"
+
+#define DEBUG_WINSOCK
+
+/* XXX per task */
+WORD wsa_errno;
+int  wsa_initted;
+
+WORD errno_to_wsaerrno(int errno)
+{
+        switch(errno) {
+        case ENETDOWN:
+                return WSAENETDOWN;
+        case EAFNOSUPPORT:
+                return WSAEAFNOSUPPORT;
+        case EMFILE:
+                return WSAEMFILE;
+        case ENOBUFS:
+                return WSAENOBUFS;
+        case EPROTONOSUPPORT:
+                return EPROTONOSUPPORT;
+        case EPROTOTYPE:
+                return WSAEPROTOTYPE;
+	case EBADF:
+	case ENOTSOCK:
+		return WSAENOTSOCK;
+
+        default:
+#ifndef sun
+#if defined(__FreeBSD__)
+                fprintf(stderr, "winsock: errno_to_wsaerrno translation failure.\n\t: %s (%d)\n",
+                        sys_errlist[errno], errno);
+#else
+                fprintf(stderr, "winsock: errno_to_wsaerrno translation failure.\n\t: %s (%d)\n",
+                        strerror [errno], errno);
+#endif
+#else
+		fprintf (stderr, "winsock: errno_to_wsaerrno translation failure.\n");
+#endif
+                break;
+        }
+}
+ 
+SOCKET Winsock_accept(SOCKET s, struct sockaddr FAR *addr, int FAR *addrlen)
+{
+	int sock;
+
+	if ((sock = accept(s, addr, addrlen)) < 0) {
+        	wsa_errno = errno_to_wsaerrno(errno);
+        	return INVALID_SOCKET;
+	}
+	return sock;
+}
+
+int Winsock_bind(SOCKET s, struct sockaddr FAR *name, int namelen)
+{
+	if (bind(s, name, namelen) < 0) {
+        	wsa_errno = errno_to_wsaerrno(errno);
+        	return SOCKET_ERROR;
+	}
+	return 0;
+}
+
+int Winsock_closesocket(SOCKET s)
+{
+	if (close(s) < 0) {
+        	wsa_errno = errno_to_wsaerrno(errno);
+        	return SOCKET_ERROR;
+	}
+	return 0;
+}
+
+int Winsock_connect(SOCKET s, struct sockaddr FAR *name, int namelen)
+{
+	if (connect(s, name, namelen) < 0) {
+        	wsa_errno = errno_to_wsaerrno(errno);
+        	return SOCKET_ERROR;
+	}
+	return 0;
+}
+
+int Winsock_getpeername(SOCKET s, struct sockaddr FAR *name, int FAR *namelen)
+{
+	if (getpeername(s, name, namelen) < 0) {
+        	wsa_errno = errno_to_wsaerrno(errno);
+        	return SOCKET_ERROR;
+	}
+	return 0;
+}
+
+int Winsock_getsockname(SOCKET s, struct sockaddr FAR *name, int FAR *namelen)
+{
+	if (getsockname(s, name, namelen) < 0) {
+        	wsa_errno = errno_to_wsaerrno(errno);
+        	return SOCKET_ERROR;
+	}
+	return 0;
+}
+
+int Winsock_getsockopt(SOCKET s, int loptname, char FAR *optval, int FAR *optlen)
+{
+	if (getsockopt(s, 0, loptname, optval, optlen) < 0) {
+        	wsa_errno = errno_to_wsaerrno(errno);
+        	return SOCKET_ERROR;
+	}
+	return 0;
+}
+
+u_long Winsock_htonl(u_long hostlong)
+{
+	return( htonl(hostlong) );
+}         
+
+u_short Winsock_htons(u_short hostshort)
+{
+	return( htons(hostshort) );
+}
+
+u_long Winsock_inet_addr(char FAR *cp)
+{
+	return( inet_addr(cp) );
+}
+
+char *Winsock_inet_ntoa(struct in_addr in)
+{
+	char *s;
+
+	if ((s = inet_ntoa(in)) == NULL) {
+        	wsa_errno = errno_to_wsaerrno(errno);
+        	return NULL;
+	}
+	return s;
+}
+
+int Winsock_ioctlsocket(SOCKET s, long cmd, u_long FAR *argp)
+{
+	if (ioctl(s, cmd, argp) < 0) {
+        	wsa_errno = errno_to_wsaerrno(errno);
+        	return SOCKET_ERROR;
+	}
+	return 0;
+}
+
+int Winsock_listen(SOCKET s, int backlog)
+{
+	if (listen(s, backlog) < 0) {
+        	wsa_errno = errno_to_wsaerrno(errno);
+        	return SOCKET_ERROR;
+	}
+	return 0;
+}
+
+u_long Winsock_ntohl(u_long netlong)
+{
+	return( ntohl(netlong) );
+}
+
+u_short Winsock_ntohs(u_short netshort)
+{
+	return( ntohs(netshort) );
+}
+
+int Winsock_recv(SOCKET s, char FAR *buf, int len, int flags)
+{
+	int length;
+
+	if ((length = recv(s, buf, len, flags)) < 0) {
+        	wsa_errno = errno_to_wsaerrno(errno);
+        	return SOCKET_ERROR;
+	}
+	return length;
+}
+
+int Winsock_recvfrom(SOCKET s, char FAR *buf, int len, int flags, 
+		struct sockaddr FAR *from, int FAR *fromlen)
+{
+	int length;
+
+	if ((length = recvfrom(s, buf, len, flags, from, fromlen)) < 0) {
+        	wsa_errno = errno_to_wsaerrno(errno);
+        	return SOCKET_ERROR;
+	}
+	return length;
+}
+
+int Winsock_select(int nfds, fd_set FAR *readfds, fd_set FAR *writefds,
+	fd_set FAR *exceptfds, struct timeval FAR *timeout)
+{
+	return(select(nfds, readfds, writefds, exceptfds, timeout));
+}
+
+int Winsock_send(SOCKET s, char FAR *buf, int len, int flags)
+{
+	int length;
+
+	if ((length = send(s, buf, len, flags)) < 0) {
+        	wsa_errno = errno_to_wsaerrno(errno);
+        	return SOCKET_ERROR;
+	}
+	return length;
+}
+
+int Winsock_sendto(SOCKET s, char FAR *buf, int len, int flags,
+		struct sockaddr FAR *to, int tolen)
+{
+	int length;
+
+	if ((length = sendto(s, buf, len, flags, to, tolen)) < 0) {
+        	wsa_errno = errno_to_wsaerrno(errno);
+        	return SOCKET_ERROR;
+	}
+	return length;
+}
+
+int Winsock_setsockopt(SOCKET s, int level, int optname, const char FAR *optval, 
+		int optlen)
+{
+	if (setsockopt(s, level, optname, optval, optlen) < 0) {
+        	wsa_errno = errno_to_wsaerrno(errno);
+        	return SOCKET_ERROR;
+	}
+	return 0;
+}                                         
+
+int Winsock_shutdown(SOCKET s, int how)
+{
+	if (shutdown(s, how) < 0) {
+        	wsa_errno = errno_to_wsaerrno(errno);
+        	return SOCKET_ERROR;
+	}
+	return 0;
+}
+
+SOCKET Winsock_socket(WORD af, WORD type, WORD protocol)
+{
+    int sock;
+
+#ifdef DEBUG_WINSOCK
+    printf("Winsock_socket: af=%d type=%d protocol=%d\n", af, type, protocol);
+#endif
+
+/*  let the kernel do the dirty work..
+
+    if (!wsa_initted) {
+            wsa_errno = WSANOTINITIALISED;
+            return INVALID_SOCKET;
+    }
+*/
+    if ((sock = socket(af, type, protocol)) < 0) {
+            wsa_errno = errno_to_wsaerrno(errno);
+            return INVALID_SOCKET;
+    }
+    return sock;
+}
+
+struct hostent *Winsock_gethostbyaddr(const char FAR *addr, int len,  int type)
+{
+	struct hostent *host;
+
+	if ((host = gethostbyaddr(addr, len, type)) == NULL) {
+        	wsa_errno = errno_to_wsaerrno(errno);
+        	return NULL;
+	}
+	return host;
+}
+
+struct hostent *Winsock_gethostbyname(const char FAR *name)
+{
+	struct hostent *host;
+
+	if ((host = gethostbyname(name)) == NULL) {
+        	wsa_errno = errno_to_wsaerrno(errno);
+        	return NULL;
+	}
+	return host;
+}
+
+int Winsock_gethostname(char FAR *name, int namelen)
+{
+	if (gethostname(name, namelen) < 0) {
+        	wsa_errno = errno_to_wsaerrno(errno);
+        	return SOCKET_ERROR;
+	}
+	return 0;
+}          
+
+struct protoent *Winsock_getprotobyname(char FAR *name)
+{
+	struct protoent *proto;
+
+	if ((proto = getprotobyname(name)) == NULL) {
+        	wsa_errno = errno_to_wsaerrno(errno);
+        	return NULL;
+	}
+	return proto;
+}
+
+struct protoent *Winsock_getprotobynumber(int number)
+{
+	struct protoent *proto;
+
+	if ((proto = getprotobynumber(number)) == NULL) {
+        	wsa_errno = errno_to_wsaerrno(errno);
+        	return NULL;
+	}
+	return proto;
+}
+
+struct servent *Winsock_getservbyname(const char FAR *name, const char FAR *proto)
+{
+	struct servent *service;
+
+	if ((service = getservbyname(name, proto)) == NULL) {
+        	wsa_errno = errno_to_wsaerrno(errno);
+        	return NULL;
+	}
+	return service;
+}
+
+struct servent *Winsock_getservbyport(int port, const char FAR *proto)
+{
+	struct servent *service;
+
+	if ((service = getservbyport(port, proto)) == NULL) {
+        	wsa_errno = errno_to_wsaerrno(errno);
+        	return NULL;
+	}
+	return service;
+}
+
+HANDLE WSAAsyncGetHostByAddr(HWND hWnd, u_int wMsg, const char FAR *addr,
+		 int len, int type, const char FAR *buf, int buflen)
+{
+
+}                    
+
+HANDLE WSAAsyncGetHostByName(HWND hWnd, u_int wMsg, const char FAR *name, 
+			char FAR *buf, int buflen)
+{
+
+}                     
+
+HANDLE WSAAsyncGetProtoByName(HWND hWnd, u_int wMsg, const char FAR *name, 
+			char FAR *buf, int buflen)
+{
+
+}
+
+HANDLE WSAAsyncGetProtoByNumber(HWND hWnd, u_int wMsg, int number, 
+			char FAR *buf, int buflen)
+{
+
+}
+
+HANDLE WSAAsyncGetServByName(HWND hWnd, u_int wMsg, const char FAR *name, 
+			const char FAR *proto, char FAR *buf, int buflen)
+{
+
+}
+
+HANDLE WSAAsyncGetServByPort(HWND hWnd, u_int wMsg, int port, const char FAR 
+			*proto, char FAR *buf, int buflen)
+{
+
+}
+
+int WSAAsyncSelect(SOCKET s, HWND hWnd, u_int wMsg, long lEvent)
+{
+
+}
+
+int WSAFDIsSet(int fd, fd_set *set)
+{
+	return( FD_ISSET(fd, set) );
+}
+
+WSACancelAsyncRequest(HANDLE hAsyncTaskHandle)
+{
+
+}
+
+WSACancelBlockingCall ( void )
+{
+
+}
+          
+int WSAGetLastError(void)
+{
+    return wsa_errno;
+}
+
+void WSASetLastError(int iError)
+{
+    wsa_errno = iError;
+}
+
+BOOL WSAIsBlocking (void)
+{
+
+}
+
+FARPROC WSASetBlockingHook(FARPROC lpBlockFunc)
+{
+
+}
+
+int WSAUnhookBlockingHook(void)
+{
+
+}
+
+WSADATA Winsock_data = {
+        0x0101,
+        0x0101,
+        "WINE Sockets",
+#ifdef linux
+        "LINUX/i386",
+#endif
+#ifdef __NetBSD__
+        "NetBSD/i386",
+#endif
+#ifdef sunos
+	"SunOS",
+#endif
+        128,
+	1024,
+        NULL
+};
+
+int WSAStartup(WORD wVersionRequested, LPWSADATA lpWSAData)
+{
+#ifdef DEBUG_WINSOCK
+    fprintf(stderr, "WSAStartup: verReq=%x\n", wVersionRequested);
+#endif
+
+    if (LOBYTE(wVersionRequested) < 1 ||
+        (LOBYTE(wVersionRequested) == 1 &&
+         HIBYTE(wVersionRequested) < 1))
+        return WSAVERNOTSUPPORTED;
+
+    if (!lpWSAData)
+        return WSAEINVAL;
+    
+    bcopy(&Winsock_data, lpWSAData, sizeof(Winsock_data));
+
+    wsa_initted = 1;
+    
+    return(0);
+}
+
+int WSACleanup(void)
+{
+    wsa_initted = 0;
+    return 0;
+}
diff --git a/miscemu/Imakefile b/miscemu/Imakefile
new file mode 100644
index 0000000..dca1f1d
--- /dev/null
+++ b/miscemu/Imakefile
@@ -0,0 +1,19 @@
+#include "../Wine.tmpl"
+
+MODULE = miscemu
+
+SRCS = \
+	emulate.c \
+	int1a.c \
+	int21.c \
+	kernel.c
+
+OBJS = $(SRCS:.c=.o)
+
+WineRelocatableTarget($(TOP)/$(MODULE),,$(OBJS))
+DependTarget()
+CleanTarget()
+
+includes::
+
+install::
diff --git a/misc/emulate.c b/miscemu/emulate.c
similarity index 100%
rename from misc/emulate.c
rename to miscemu/emulate.c
diff --git a/misc/int1a.c b/miscemu/int1a.c
similarity index 100%
rename from misc/int1a.c
rename to miscemu/int1a.c
diff --git a/misc/int21.c b/miscemu/int21.c
similarity index 94%
rename from misc/int21.c
rename to miscemu/int21.c
index 6caaa7c..47368e1 100644
--- a/misc/int21.c
+++ b/miscemu/int21.c
@@ -22,7 +22,7 @@
 WORD ExtendedError, CodePage = 437;
 BYTE ErrorClass, Action, ErrorLocus;
 
-extern char *TempDirectory;
+extern char TempDirectory[];
 
 void Error(int e, int class, int el)
 {
@@ -749,11 +749,12 @@
 
 /************************************************************************/
 
-int do_int21(struct sigcontext_struct * context){
+int do_int21(struct sigcontext_struct * context)
+{
 	int ah;
 
-	fprintf(stderr,"int21: doing AX=%04x BX=%04x CX=%04x DX=%04x\n",
-		EAX & 0xffffL,EBX & 0xffffL,ECX & 0xffffL,EDX & 0xffffL);
+	fprintf(stderr, "int21: AX %04x, BX %04x, CX %04x, DX %04x, SI %04x, DI %04x, DS %04x, ES %04x\n",
+				AX, BX, CX, DX, SI, DI, DS, ES);
 
 	ah = (EAX >> 8) & 0xffL;
 
@@ -834,7 +835,7 @@
 	case 0x19: /* GET CURRENT DEFAULT DRIVE */
 		GetDefaultDrive(context);
 		break;
-		
+
 	case 0x1b: /* GET ALLOCATION INFORMATION FOR DEFAULT DRIVE */
 		GetDefDriveAllocInfo(context);
 		break;
@@ -1159,71 +1160,42 @@
 	return 1;
 }
 
-/********************************************************************/
-
-static void
-GetTimeDate(int time_flag)
-{
-    struct tm *now;
-    time_t ltime;
-    
-    ltime = time(NULL);
-    now = localtime(&ltime);
-    if (time_flag)
-    {
-	_CX = (now->tm_hour << 8) | now->tm_min;
-	_DX = now->tm_sec << 8;
-    }
-    else
-    {
-	_CX = now->tm_year + 1900;
-	_DX = ((now->tm_mon + 1) << 8) | now->tm_mday;
-	_AX &= 0xff00;
-	_AX |= now->tm_wday;
-    }
-#ifdef DEBUG_DOS
-    printf("GetTimeDate: AX = %04x, CX = %04x, DX = %04x\n", _AX, _CX, _DX);
-#endif
-    
-    ReturnFromRegisterFunc();
-    /* Function does not return */
-}
-
 /**********************************************************************
- *					KERNEL_DOS3Call
+ *			DOS3Call
  */
-int KERNEL_DOS3Call()
+int DOS3Call()
 {
-    switch ((_AX >> 8) & 0xff)
-    {
-      case 0x30:
-	_AX = 0x0303;
-	ReturnFromRegisterFunc();
-	/* Function does not return */
+	static struct sigcontext_struct *context = NULL;
 	
-      case 0x25:
-      case 0x35:
+	if (!context) 
+		context = malloc(sizeof(struct sigcontext_struct));
+
+/*	fprintf(stderr, "DOS3: AX %04x, BX %04x, CX %04x, DX %04x, SI %04x, DI %04x, DS %04x, ES %04x\n",
+				_AX, _BX, _CX, _DX, _SI, _DI, _DS, _ES);
+*/
+	EAX = _AX;
+	EBX = _BX;
+	ECX = _CX;
+	EDX = _DX;
+	DS = _DS;
+	ES = _ES;
+	DI = _DI;
+	SI = _SI;
+/*	EFL = _FL;
+*/
+	do_int21(context);
+
+	_AX = AX;
+	_BX = BX;
+	_CX = CX;
+	_DX = DX;
+	
+	_DS = DS;
+	_ES = ES;
+
+	_DI = DI;
+	_SI = SI;
+/*	_FL = EFL;
+ */
 	return 0;
-
-      case 0x2a:
-	GetTimeDate(0);
-	/* Function does not return */
-	
-      case 0x2c:
-	GetTimeDate(1);
-	/* Function does not return */
-
-      case 0x4c:
-	exit(_AX & 0xff);
-
-      default:
-	fprintf(stderr, "DOS: AX %04x, BX %04x, CX %04x, DX %04x\n",
-		_AX, _BX, _CX, _DX);
-	fprintf(stderr, "     SP %04x, BP %04x, SI %04x, DI %04x\n",
-		_SP, _BP, _SI, _DI);
-	fprintf(stderr, "     DS %04x, ES %04x\n",
-		_DS, _ES);
-    }
-    
-    return 0;
 }
diff --git a/misc/kernel.c b/miscemu/kernel.c
similarity index 78%
rename from misc/kernel.c
rename to miscemu/kernel.c
index 3cdd950..d257b16 100644
--- a/misc/kernel.c
+++ b/miscemu/kernel.c
@@ -66,18 +66,3 @@
 #endif
     return 0;
 }
-/**********************************************************************
- *					KERNEL_GetModuleFileName
- */
-int
-KERNEL_GetModuleFileName(int module, char *filename, int bytes)
-{
-#ifdef DEBUG_RELAY
-    printf("GetModuleFileName: module %d, filename %x, bytes %d\n", 
-	    module, filename, bytes);
-#endif
-    
-    strcpy(filename, "TEST.EXE");
-    
-    return strlen(filename);
-}
diff --git a/objects/Makefile b/objects/Makefile
deleted file mode 100644
index cb70d89..0000000
--- a/objects/Makefile
+++ /dev/null
@@ -1,19 +0,0 @@
-CFLAGS=$(COPTS) $(DEBUGOPTS) -I$(INCLUDE_DIR)
-
-OBJS=bitmap.o brush.o font.o gdiobj.o palette.o pen.o dib.o region.o \
-	text.o dcvalues.o clipping.o bitblt.o linedda.o color.o
-
-default: objects.o
-
-objects.o: $(OBJS)
-	$(LD) -r -o objects.o $(OBJS)
-
-clean:
-	rm -f *.o *~ *.s dll_* *.a *#
-
-depend:
-	$(CC) $(CFLAGS) -M *.c > .depend
-
-ifeq (.depend,$(wildcard .depend))
-include .depend
-endif
diff --git a/objects/bitblt.c b/objects/bitblt.c
index 7b0d4ae..bbfa3bd 100644
--- a/objects/bitblt.c
+++ b/objects/bitblt.c
@@ -9,6 +9,7 @@
 #include <stdio.h>
 #include <stdlib.h>
 #include <X11/Xlib.h>
+#include <X11/Intrinsic.h>
 
 #include "gdi.h"
 
@@ -113,7 +114,147 @@
 
 
 /***********************************************************************
+ *           black on white stretch -- favors color pixels over white
+ * 
+ */
+static void bonw_stretch(XImage *sxi, XImage *dxi, 
+	short widthSrc, short heightSrc, short widthDest, short heightDest)
+{
+    float deltax, deltay, sourcex, sourcey, oldsourcex, oldsourcey;
+    register int x, y;
+    Pixel whitep;
+    int totalx, totaly, xavgwhite, yavgwhite;
+    register int i;
+    int endx, endy;
+    
+    deltax = (float)widthSrc/widthDest;
+    deltay = (float)heightSrc/heightDest;
+    whitep  = WhitePixel(display, DefaultScreen(display));
+
+    oldsourcex = 0;
+    for (x=0, sourcex=0.0; x<widthDest; 
+			x++, oldsourcex=sourcex, sourcex+=deltax) {
+        xavgwhite = 0;
+	if (deltax > 1.0) {
+            totalx = 0;
+	    endx = (int)sourcex;
+	    for (i=(int)oldsourcex; i<=endx; i++)
+	        if (XGetPixel(sxi, i, (int)sourcey) == whitep)
+	            totalx++;
+  	    xavgwhite = (totalx > (int)(deltax / 2.0));
+	} else {
+	    xavgwhite = 0;
+	}
+
+        oldsourcey = 0;
+        for (y=0, sourcey=0.0; y<heightDest; 
+				y++, oldsourcey=sourcey, sourcey+=deltay) {
+	    yavgwhite = 0;
+	    if (deltay > 1.0) {
+	        totaly = 0;
+	        endy = (int)sourcey;
+	        for (i=(int)oldsourcey; i<=endy; i++) 
+	            if (XGetPixel(sxi, (int)sourcex, i) == whitep)
+		        totaly++;
+	        yavgwhite = (totaly > ((int)deltay / 2));
+	    } else {
+		yavgwhite = 0;
+	    }
+	    if (xavgwhite && yavgwhite)
+	        XPutPixel(dxi, x, y, whitep);
+	    else
+	        XPutPixel(dxi, x, y, XGetPixel(sxi, (int)sourcex, (int)sourcey));
+
+	} /* for all y in dest */
+    } /* for all x in dest */
+
+}
+
+/***********************************************************************
+ *           white on black stretch -- favors color pixels over black
+ * 
+ */
+static void wonb_stretch(XImage *sxi, XImage *dxi, 
+	short widthSrc, short heightSrc, short widthDest, short heightDest)
+{
+    float deltax, deltay, sourcex, sourcey, oldsourcex, oldsourcey;
+    register int x, y;
+    Pixel blackp;
+    int totalx, totaly, xavgblack, yavgblack;
+    register int i;
+    int endx, endy;
+    
+    deltax = (float)widthSrc/widthDest;
+    deltay = (float)heightSrc/heightDest;
+    blackp  = WhitePixel(display, DefaultScreen(display));
+
+    oldsourcex = 0;
+    for (x=0, sourcex=0.0; x<widthDest; 
+			x++, oldsourcex=sourcex, sourcex+=deltax) {
+        xavgblack = 0;
+	if (deltax > 1.0) {
+            totalx = 0;
+	    endx = (int)sourcex;
+	    for (i=(int)oldsourcex; i<=endx; i++)
+	        if (XGetPixel(sxi, i, (int)sourcey) == blackp)
+	            totalx++;
+  	    xavgblack = (totalx > (int)(deltax / 2.0));
+	} else {
+	    xavgblack = 0;
+	}
+
+        oldsourcey = 0;
+        for (y=0, sourcey=0.0; y<heightDest; 
+				y++, oldsourcey=sourcey, sourcey+=deltay) {
+	    yavgblack = 0;
+	    if (deltay > 1.0) {
+	        totaly = 0;
+	        endy = (int)sourcey;
+	        for (i=(int)oldsourcey; i<=endy; i++) 
+	            if (XGetPixel(sxi, (int)sourcex, i) == blackp)
+		        totaly++;
+	        yavgblack = (totaly > ((int)deltay / 2));
+	    } else {
+		yavgblack = 0;
+	    }
+	    if (xavgblack && yavgblack)
+	        XPutPixel(dxi, x, y, blackp);
+	    else
+	        XPutPixel(dxi, x, y, XGetPixel(sxi, (int)sourcex, (int)sourcey));
+
+	} /* for all y in dest */
+    } /* for all x in dest */
+}
+
+/***********************************************************************
+ *          color stretch -- deletes unused pixels
+ * 
+ */
+static void color_stretch(XImage *sxi, XImage *dxi, 
+	short widthSrc, short heightSrc, short widthDest, short heightDest)
+{
+    float deltax, deltay, sourcex, sourcey;
+    register int x, y;
+
+    deltax = (float)widthSrc/widthDest;
+    deltay = (float)heightSrc/heightDest;
+
+    for (x=0, sourcex=0.0; x<widthDest; x++, sourcex+=deltax)
+        for (y=0, sourcey=0.0; y<heightDest; y++, sourcey+=deltay)
+            XPutPixel(dxi, x, y, XGetPixel(sxi, (int)sourcex, (int)sourcey));
+
+}
+
+/***********************************************************************
  *           StretchBlt    (GDI.35)
+ * 
+ * 	o StretchBlt is CPU intensive so we only call it if we have
+ *        to.  Checks are made to see if we can call BitBlt instead.
+ *
+ * 	o the stretching is slowish, some integer interpolation would
+ *        speed it up.
+ *
+ *      o only black on white and color copy have been tested
  */
 BOOL StretchBlt( HDC hdcDest, short xDest, short yDest, short widthDest, short heightDest,
                HDC hdcSrc, short xSrc, short ySrc, short widthSrc, short heightSrc, DWORD rop )
@@ -121,66 +262,100 @@
     int xs1, xs2, ys1, ys2;
     int xd1, xd2, yd1, yd2;
     DC *dcDest, *dcSrc;
+    XImage *sxi, *dxi;
+    WORD stretchmode;
 
-/*#ifdef DEBUG_GDI     */
-
+#ifdef DEBUG_GDI     
     printf( "StretchBlt: %d %d,%d %dx%d %d %d,%d %dx%d %08x\n",
            hdcDest, xDest, yDest, widthDest, heightDest, hdcSrc, xSrc, 
            ySrc, widthSrc, heightSrc, rop );
-/*#endif */
-
-
+    printf("StretchMode is %x\n", 
+           ((DC *)GDI_GetObjPtr(hdcDest, DC_MAGIC))->w.stretchBltMode);	
+#endif 
 
     if ((rop & 0xcc0000) == ((rop & 0x330000) << 2))
         return PatBlt( hdcDest, xDest, yDest, widthDest, heightDest, rop );
 
-    printf("here\n");
+    /* don't stretch the bitmap unless we have to; if we don't,
+     * call BitBlt for a performance boost
+     */
+
+    if (widthSrc == widthDest && heightSrc == heightDest) {
+	return BitBlt(hdcDest, xDest, yDest, widthSrc, heightSrc,
+               hdcSrc, xSrc, ySrc, rop);
+    }
 
     rop >>= 16;
     if ((rop & 0x0f) != (rop >> 4))
     {
-        printf( "BitBlt: Unimplemented ROP %02x\n", rop );
+        printf( "StretchBlt: Unimplemented ROP %02x\n", rop );
         return FALSE;
     }
 
-    printf("here2\n");
-    
     dcDest = (DC *) GDI_GetObjPtr( hdcDest, DC_MAGIC );
     if (!dcDest) return FALSE;
     dcSrc = (DC *) GDI_GetObjPtr( hdcSrc, DC_MAGIC );
     if (!dcSrc) return FALSE;
 
-    xs1 = XLPTODP( dcSrc, xSrc );
-    xs2 = XLPTODP( dcSrc, xSrc + widthSrc );
-    ys1 = YLPTODP( dcSrc, ySrc );
-    ys2 = YLPTODP( dcSrc, ySrc + heightSrc );
-    xd1 = XLPTODP( dcDest, xDest );
-    xd2 = XLPTODP( dcDest, xDest + widthDest );
-    yd1 = YLPTODP( dcDest, yDest );
-    yd2 = YLPTODP( dcDest, yDest + heightDest );
+    xs1 = dcSrc->w.DCOrgX + XLPTODP( dcSrc, xSrc );
+    xs2 = dcSrc->w.DCOrgX + XLPTODP( dcSrc, xSrc + widthSrc );
+    ys1 = dcSrc->w.DCOrgY + YLPTODP( dcSrc, ySrc );
+    ys2 = dcSrc->w.DCOrgY + YLPTODP( dcSrc, ySrc + heightSrc );
+    xd1 = dcDest->w.DCOrgX + XLPTODP( dcDest, xDest );
+    xd2 = dcDest->w.DCOrgX + XLPTODP( dcDest, xDest + widthDest );
+    yd1 = dcDest->w.DCOrgY + YLPTODP( dcDest, yDest );
+    yd2 = dcDest->w.DCOrgY + YLPTODP( dcDest, yDest + heightDest );
 
-    DC_SetupGCForText( dcDest );
-    XSetFunction( XT_display, dcDest->u.x.gc, DC_XROPfunction[rop & 0x0f] );
 
-    if (dcSrc->w.bitsPerPixel == dcDest->w.bitsPerPixel)
-    {
-            printf("XCopyArea\n");
-        XCopyArea( XT_display, dcSrc->u.x.drawable,
-                   dcDest->u.x.drawable, dcDest->u.x.gc,
-                   MIN(xs1,xs2), MIN(ys1,ys2), abs(xd2-xd1), abs(yd2-yd1),
-                   MIN(xd1,xd2), MIN(yd1,yd2) );
+    /* get a source and destination image so we can manipulate
+     * the pixels
+     */
+
+    sxi = XGetImage(display, dcSrc->u.x.drawable, xs1, ys1, 
+	     widthSrc, heightSrc, AllPlanes, ZPixmap);
+    dxi = XCreateImage(display, DefaultVisualOfScreen(screen),
+	  		    DefaultDepthOfScreen(screen), ZPixmap, 
+			    0, NULL, widthDest, heightDest,
+			    32, 0);
+    dxi->data = malloc(dxi->bytes_per_line * heightDest);
+
+    stretchmode = ((DC *)GDI_GetObjPtr(hdcDest, DC_MAGIC))->w.stretchBltMode;
+
+     /* the actual stretching is done here, we'll try to use
+      * some interolation to get some speed out of it in
+      * the future
+      */
+
+    switch (stretchmode) {
+	case BLACKONWHITE:
+		bonw_stretch(sxi, dxi, widthSrc, heightSrc,
+				widthDest, heightDest);
+		break;
+	case WHITEONBLACK:
+		wonb_stretch(sxi, dxi, widthSrc, heightSrc, 
+				widthDest, heightDest);
+		break;
+	case COLORONCOLOR:
+		color_stretch(sxi, dxi, widthSrc, heightSrc, 
+				widthDest, heightDest);
+		break;
+	default:
+		fprintf(stderr, "StretchBlt: unknown stretchmode '%d'\n",
+			stretchmode);
+		break;
     }
-    else
-    {
-            printf("XCopyPlane\n");
-        if (dcSrc->w.bitsPerPixel != 1) return FALSE;
-        XCopyPlane( XT_display, dcSrc->u.x.drawable,
-                    dcDest->u.x.drawable, dcDest->u.x.gc,
-                    MIN(xs1,xs2), MIN(ys1,ys2), abs(xd2-xd1), abs(yd2-yd1),
-                    MIN(xd1,xd2), MIN(yd1,yd2), 1 );
-    }
+
+    DC_SetupGCForText(dcDest);
+    XSetFunction(display, dcDest->u.x.gc, DC_XROPfunction[rop & 0x0f]);
+    XPutImage(display, dcDest->u.x.drawable, dcDest->u.x.gc,
+	 	dxi, 0, 0, MIN(xd1,xd2), MIN(yd1,yd2), 
+		widthDest, heightDest);
+
+    /* now free the images we created */
+
+    XDestroyImage(sxi);
+    XDestroyImage(dxi);
+
     return TRUE;
-
-
 }
 
diff --git a/objects/font.c b/objects/font.c
index 8345e0b..883e699 100644
--- a/objects/font.c
+++ b/objects/font.c
@@ -359,6 +359,16 @@
 
 
 /***********************************************************************
+ *           SetMapperFlags    (GDI.349)
+ */
+DWORD SetMapperFlags(HDC hDC, DWORD dwFlag)
+{
+    printf("SetmapperFlags(%04X, %08X) // Empty Stub !\n", hDC, dwFlag); 
+    return 0L;
+}
+
+ 
+/***********************************************************************
  *           GetCharWidth    (GDI.350)
  */
 BOOL GetCharWidth(HDC hdc, WORD wFirstChar, WORD wLastChar, LPINT lpBuffer)
diff --git a/objects/gdiobj.c b/objects/gdiobj.c
index 1b98fc8..bc59d86 100644
--- a/objects/gdiobj.c
+++ b/objects/gdiobj.c
@@ -146,12 +146,14 @@
 {
     struct segment_descriptor_s * s;
 
-      /* Create GDI heap */
+#ifndef WINELIB
+    /* Create GDI heap */
 
     s = (struct segment_descriptor_s *)GetNextSegment( 0, 0x10000 );
     if (s == NULL) return FALSE;
     HEAP_Init( &GDI_Heap, s->base_addr, GDI_HEAP_SIZE );
-
+#endif
+    
       /* Create default palette */
 
     COLOR_Init();
diff --git a/objects/palette.c b/objects/palette.c
index 0ff149e..03300c4 100644
--- a/objects/palette.c
+++ b/objects/palette.c
@@ -10,10 +10,11 @@
 #ifdef linux
 #include <values.h>
 #endif
-#if defined(__NetBSD__) || defined(__FreeBSD__)
+#if !defined  (MAXINT)
 #include <limits.h>
 #define MAXINT INT_MAX
 #endif
+
 #include <X11/Xlib.h>
 
 #include "gdi.h"
diff --git a/test/Makefile b/test/Makefile
deleted file mode 100644
index 535cc47..0000000
--- a/test/Makefile
+++ /dev/null
@@ -1,347 +0,0 @@
-# Makefile generated by imake - do not edit!
-# $XConsortium: imake.c,v 1.65 91/07/25 17:50:17 rws Exp $
-
-# -------------------------------------------------------------------------
-# Makefile generated from "Imake.tmpl" and <Imakefile>
-# $XFree86: mit/config/Imake.tmpl,v 1.17 1993/06/03 15:26:36 dawes Exp $
-# $XConsortium: Imake.tmpl,v 1.139 91/09/16 08:52:48 rws Exp $
-#
-# Platform-specific parameters may be set in the appropriate <vendor>.cf
-# configuration files.  Site-specific parameters should be set in the file
-# site.def.  Full rebuilds are recommended if any parameters are changed.
-#
-# If your C preprocessor does not define any unique symbols, you will need
-# to set BOOTSTRAPCFLAGS when rebuilding imake (usually when doing
-# "make World" the first time).
-#
-
-# -------------------------------------------------------------------------
-# site-specific configuration parameters that need to come before
-# the platform-specific parameters - edit site.def to change
-
-# $XFree86: mit/config/site.def,v 1.65 1993/06/04 16:02:47 dawes Exp $
-# site:  $XConsortium: site.def,v 1.2 91/07/30 20:26:44 rws Exp $
-
-# obz: changes for making Linux distribution
-
-# -------------------------------------------------------------------------
-# platform-specific configuration parameters - edit x386.cf to change
-
-# $XFree86: mit/config/x386.cf,v 1.90 1993/06/04 16:02:50 dawes Exp $
-# platform:  $XConsortium: x386.cf,v 1.7 91/08/16 19:30:10 gildea Exp $
-
-# -------------------------------------------------------------------------
-# XFree86 version definition
-# $XFree86: mit/config/xf86_vers.def,v 1.5 1993/06/01 09:12:47 dawes Exp $
-
-# -------------------------------------------------------------------------
-# XFree86 version: 1300
-# -------------------------------------------------------------------------
-
-# $XFree86: mit/config/lnuxLib.rules,v 1.2 1993/06/02 13:48:12 dawes Exp $
-
-DLL_BINDIR = /usr/dll/bin
-
-# operating system:  		Linux
-
-# -------------------------------------------------------------------------
-# site-specific configuration parameters that go after
-# the platform-specific parameters - edit site.def to change
-
-# $XFree86: mit/config/site.def,v 1.65 1993/06/04 16:02:47 dawes Exp $
-# site:  $XConsortium: site.def,v 1.2 91/07/30 20:26:44 rws Exp $
-
-# obz: changes for making Linux distribution
-
-            SHELL = 	/bin/sh
-
-              TOP = ../.
-      CURRENT_DIR = ./test
-
-               AR = ar clq
-  BOOTSTRAPCFLAGS =
-               CC = 		gcc
-               AS = as
-
-              LEX = 		flex
-
-             YACC = 		bison -y
-
-         COMPRESS = compress
-              CPP = 		/lib/cpp $(STD_CPP_DEFINES)
-    PREPROCESSCMD = 	/lib/cpp $(STD_CPP_DEFINES)
-          INSTALL = install
-               LD = ld
-             LINT = lint
-      LINTLIBFLAG = -C
-         LINTOPTS = -axz
-               LN = ln -s
-             MAKE = make
-               MV = mv
-               CP = cp
-
-           RANLIB = ranlib
-  RANLIBINSTFLAGS =
-
-               RM = rm -f
-            TROFF = psroff
-         MSMACROS = -ms
-              TBL = tbl
-              EQN = eqn
-     STD_INCLUDES =
-  STD_CPP_DEFINES = -traditional 		-D_POSIX_SOURCE -D_BSD_SOURCE -D_GNU_SOURCE 	-Dlinux
-      STD_DEFINES = 		-D_POSIX_SOURCE -D_BSD_SOURCE -D_GNU_SOURCE 	-Dlinux
- EXTRA_LOAD_FLAGS =
-  EXTRA_LIBRARIES =
-     OS_LIBRARIES =
-             TAGS = ctags
-
-    SHAREDCODEDEF =
-         SHLIBDEF =
-
-    PROTO_DEFINES = -DFUNCPROTO=11 -DNARROWPROTO
-
-     INSTPGMFLAGS = -s
-
-     INSTBINFLAGS = -m 0755
-     INSTUIDFLAGS = -s -m 4755
-     INSTLIBFLAGS = -m 0644
-     INSTINCFLAGS = -m 0444
-     INSTMANFLAGS = -m 0444
-     INSTDATFLAGS = -m 0444
-    INSTKMEMFLAGS = -s -m 4755
-
-      PROJECTROOT = 	/usr/X386
-
-     TOP_INCLUDES = -I$(INCROOT)
-
-      CDEBUGFLAGS = -O2
-        CCOPTIONS = -m486 -DNO_ASM -fwritable-strings
-    ANSICCOPTIONS =
-
-      ALLINCLUDES = $(INCLUDES) $(EXTRA_INCLUDES) $(TOP_INCLUDES) $(STD_INCLUDES)
-       ALLDEFINES = $(ALLINCLUDES) $(STD_DEFINES) $(EXTRA_DEFINES) $(PROTO_DEFINES) $(DEFINES)
-           CFLAGS = $(ANSICCOPTIONS) $(CDEBUGFLAGS) $(CCOPTIONS) $(ALLDEFINES)
-        LINTFLAGS = $(LINTOPTS) -DLINT $(ALLDEFINES)
-
-           LDLIBS = $(OS_LIBRARIES) $(SYS_LIBRARIES) $(EXTRA_LIBRARIES)
-
-        LDOPTIONS = $(ANSICCOPTIONS) $(CDEBUGFLAGS) $(CCOPTIONS) $(LOCAL_LDFLAGS) -L$(USRLIBDIR)
-
-   LDCOMBINEFLAGS = 	-r
-      DEPENDFLAGS =
-
-        MACROFILE = x386.cf
-           RM_CMD = $(RM) *.CKP *.ln *.BAK *.bak *.o core errs ,* *~ *.a .emacs_* tags TAGS make.log MakeOut
-
-    IMAKE_DEFINES =
-
-         IRULESRC = $(CONFIGDIR)
-        IMAKE_CMD = $(IMAKE) -DUseInstalled -I$(IRULESRC) $(IMAKE_DEFINES)
-
-     ICONFIGFILES = $(IRULESRC)/Imake.tmpl $(IRULESRC)/Imake.rules 			$(IRULESRC)/Project.tmpl $(IRULESRC)/site.def 			$(IRULESRC)/$(MACROFILE) $(EXTRA_ICONFIGFILES)
-
-# -------------------------------------------------------------------------
-# X Window System Build Parameters
-# $XFree86: mit/config/Project.tmpl,v 1.13 1993/03/27 03:32:45 dawes Exp $
-# $XConsortium: Project.tmpl,v 1.138.1.1 92/11/11 09:49:19 rws Exp $
-
-_percentC_ = %C
-
-# -------------------------------------------------------------------------
-# X Window System make variables; this need to be coordinated with rules
-
-          PATHSEP = /
-        USRLIBDIR = 	/usr/X386/lib
-           BINDIR = 	/usr/X386/bin
-          INCROOT = 	/usr/X386/include
-     BUILDINCROOT = $(TOP)
-      BUILDINCDIR = $(BUILDINCROOT)/X11
-      BUILDINCTOP = ..
-           INCDIR = $(INCROOT)/X11
-           ADMDIR = /usr/adm
-           LIBDIR = $(USRLIBDIR)/X11
-        CONFIGDIR = $(LIBDIR)/config
-       LINTLIBDIR = $(USRLIBDIR)/lint
-
-          FONTDIR = $(LIBDIR)/fonts
-         XINITDIR = $(LIBDIR)/xinit
-           XDMDIR = $(LIBDIR)/xdm
-           TWMDIR = $(LIBDIR)/twm
-          MANPATH = 	/usr/X386/man
-    MANSOURCEPATH = $(MANPATH)/man
-        MANSUFFIX = 1x
-     LIBMANSUFFIX = 3x
-           MANDIR = 	$(MANSOURCEPATH)1
-        LIBMANDIR = $(MANSOURCEPATH)3
-           NLSDIR = $(LIBDIR)/nls
-        PEXAPIDIR = $(LIBDIR)/PEX
-      XAPPLOADDIR = $(LIBDIR)/app-defaults
-       FONTCFLAGS = -t
-       LINKKITDIR = 	$(USRLIBDIR)/Server
-
-     INSTAPPFLAGS = $(INSTDATFLAGS)
-
-            IMAKE = imake
-           DEPEND = makedepend
-              RGB = rgb
-
-            FONTC = bdftopcf
-
-        MKFONTDIR = mkfontdir
-        MKDIRHIER = 	/bin/sh $(BINDIR)/mkdirhier
-
-        CONFIGSRC = $(TOP)/config
-       DOCUTILSRC = $(TOP)/doc/util
-        CLIENTSRC = $(TOP)/clients
-          DEMOSRC = $(TOP)/demos
-           LIBSRC = $(TOP)/lib
-          FONTSRC = $(TOP)/fonts
-       INCLUDESRC = $(TOP)/X11
-        SERVERSRC = $(TOP)/server
-          UTILSRC = $(TOP)/util
-        SCRIPTSRC = $(UTILSRC)/scripts
-       EXAMPLESRC = $(TOP)/examples
-       CONTRIBSRC = $(TOP)/../contrib
-           DOCSRC = $(TOP)/doc
-           RGBSRC = $(TOP)/rgb
-        DEPENDSRC = $(UTILSRC)/makedepend
-         IMAKESRC = $(CONFIGSRC)
-         XAUTHSRC = $(LIBSRC)/Xau
-          XLIBSRC = $(LIBSRC)/X
-           XMUSRC = $(LIBSRC)/Xmu
-       TOOLKITSRC = $(LIBSRC)/Xt
-       AWIDGETSRC = $(LIBSRC)/Xaw
-       OLDXLIBSRC = $(LIBSRC)/oldX
-      XDMCPLIBSRC = $(LIBSRC)/Xdmcp
-      BDFTOSNFSRC = $(FONTSRC)/bdftosnf
-      BDFTOSNFSRC = $(FONTSRC)/clients/bdftosnf
-      BDFTOPCFSRC = $(FONTSRC)/clients/bdftopcf
-     MKFONTDIRSRC = $(FONTSRC)/clients/mkfontdir
-         FSLIBSRC = $(FONTSRC)/lib/fs
-    FONTSERVERSRC = $(FONTSRC)/server
-     EXTENSIONSRC = $(TOP)/extensions
-         XILIBSRC = $(EXTENSIONSRC)/lib/xinput
-        PEXLIBSRC = $(EXTENSIONSRC)/lib/PEXlib
-      PHIGSLIBSRC = $(EXTENSIONSRC)/lib/PEX
-
-# $XFree86: mit/config/lnuxLib.tmpl,v 1.1 1993/04/16 14:06:06 dawes Exp $
-
-SHLIBLDFLAGS =
-PICFLAGS = -B/usr/dll/jump/
-
-  DEPEXTENSIONLIB =
-     EXTENSIONLIB = -lXext
-
-          DEPXLIB = $(DEPEXTENSIONLIB)
-             XLIB = $(EXTENSIONLIB) -lX11
-
-        DEPXMULIB =
-           XMULIB = -lXmu
-
-      DEPXTOOLLIB =
-         XTOOLLIB = -lXt
-
-        DEPXAWLIB =
-           XAWLIB = -lXaw
-
-        DEPXILIB =
-           XILIB = -lXi
-
-    DEPXTESTLIB =
-       XTESTLIB = -lXtst
-
-        DEPPEXLIB =
-         PEXLIB = -lPEX5
-
-        SOXLIBREV = 3.0.1
-          SOXTREV = 3.0.1
-         SOXAWREV = 3.0.1
-        SOOLDXREV = 3.0.1
-         SOXMUREV = 3.0.1
-        SOXEXTREV = 3.0.1
-      SOXINPUTREV = 3.0.1
-         SOPEXREV = 1.0.1
-
-      DEPXAUTHLIB = $(USRLIBDIR)/libXau.a
-         XAUTHLIB = 			 -lXau
-      DEPXDMCPLIB = $(USRLIBDIR)/libXdmcp.a
-         XDMCPLIB = 			 -lXdmcp
-
-       DEPOLDXLIB = $(USRLIBDIR)/liboldX.a
-          OLDXLIB = 			 -loldX
-
-        DEPPHIGSLIB = $(USRLIBDIR)/libphigs.a
-           PHIGSLIB = 			 -lphigs
-
-       DEPXBSDLIB = $(USRLIBDIR)/libXbsd.a
-          XBSDLIB = 			 -lXbsd
-
- LINTEXTENSIONLIB = $(LINTLIBDIR)/llib-lXext.ln
-         LINTXLIB = $(LINTLIBDIR)/llib-lX11.ln
-          LINTXMU = $(LINTLIBDIR)/llib-lXmu.ln
-        LINTXTOOL = $(LINTLIBDIR)/llib-lXt.ln
-          LINTXAW = $(LINTLIBDIR)/llib-lXaw.ln
-           LINTXI = $(LINTLIBDIR)/llib-lXi.ln
-          LINTPEX = $(LINTLIBDIR)/llib-lPEX5.ln
-        LINTPHIGS = $(LINTLIBDIR)/llib-lphigs.ln
-
-          DEPLIBS = $(DEPXAWLIB) $(DEPXMULIB) $(DEPXTOOLLIB) $(DEPXLIB)
-
-         DEPLIBS1 = $(DEPLIBS)
-         DEPLIBS2 = $(DEPLIBS)
-         DEPLIBS3 = $(DEPLIBS)
-
-# -------------------------------------------------------------------------
-# Imake rules for building libraries, programs, scripts, and data files
-# $XFree86: mit/config/Imake.rules,v 1.9 1993/03/23 12:56:27 dawes Exp $
-# rules:  $XConsortium: Imake.rules,v 1.123 91/09/16 20:12:16 rws Exp $
-
-# -------------------------------------------------------------------------
-# start of Imakefile
-
-all::
-
-depend::
-
-clean::
-
-includes::
-
-# -------------------------------------------------------------------------
-# common rules for all Makefiles - do not edit
-
-emptyrule::
-
-clean::
-	$(RM_CMD) "#"*
-
-Makefile::
-	-@if [ -f Makefile ]; then set -x; \
-	$(RM) Makefile.bak; $(MV) Makefile Makefile.bak; \
-	else exit 0; fi
-	$(IMAKE_CMD) -DTOPDIR=$(TOP) -DCURDIR=$(CURRENT_DIR)
-
-tags::
-	$(TAGS) -w *.[ch]
-	$(TAGS) -xw *.[ch] > TAGS
-
-# -------------------------------------------------------------------------
-# empty rules for directories that do not have SUBDIRS - do not edit
-
-install::
-	@echo "install in $(CURRENT_DIR) done"
-
-install.man::
-	@echo "install.man in $(CURRENT_DIR) done"
-
-install.linkkit::
-	@echo "install.linkkit in $(CURRENT_DIR) done"
-
-Makefiles::
-
-includes::
-
-# -------------------------------------------------------------------------
-# dependencies generated by makedepend
-
diff --git a/test/hyperoid.exe b/test/hyperoid.exe
new file mode 100644
index 0000000..4e689f0
--- /dev/null
+++ b/test/hyperoid.exe
Binary files differ
diff --git a/test/widget.exe b/test/widget.exe
index 42d1465..6d8fb2f 100755
--- a/test/widget.exe
+++ b/test/widget.exe
Binary files differ
diff --git a/toolkit/Imakefile b/toolkit/Imakefile
new file mode 100644
index 0000000..53a7da3
--- /dev/null
+++ b/toolkit/Imakefile
@@ -0,0 +1,18 @@
+#include "../Wine.tmpl"
+
+MODULE = toolkit
+
+SRCS = \
+	heap.c \
+	sup.c \
+	winmain.c
+
+OBJS = $(SRCS:.c=.o)
+
+WineRelocatableTarget($(TOP)/$(MODULE),,$(OBJS))
+DependTarget()
+CleanTarget()
+
+includes::
+
+install::
diff --git a/toolkit/heap.c b/toolkit/heap.c
new file mode 100644
index 0000000..9307156
--- /dev/null
+++ b/toolkit/heap.c
@@ -0,0 +1,202 @@
+/*
+ * Memory alllocation for the Wine Library toolkit
+ *
+ * Copyright (C) 1994 Miguel de Icaza
+ *
+ * All the memory management is being done by the libc malloc and friends.
+ */
+
+#ifndef __STDC__
+#include <malloc.h>
+#endif
+#include "windows.h"
+
+/* Controls the blocks per handle table */
+#define MAXBLOCKS 512
+
+static char Copyright [] = "Copyright (C) 1994 Miguel de Icaza";
+
+typedef struct handle_table {
+    struct handle_table *next;
+    void *blocks [MAXBLOCKS];
+} handle_table_t;
+
+static handle_table_t handle_table;
+
+static void **HEAP_GetFreeSlot (HANDLE *hNum)
+{
+    handle_table_t *table, *last;
+    int i, j;
+
+    for (table = &handle_table, j = 0; table; table = table->next, j++){
+	for (i = 0; i < MAXBLOCKS; i++)
+	    if (!table->blocks [i])
+		goto AssignBlock;
+	last = table;
+    }
+
+    /* No free slots */
+    last->next = malloc (sizeof (handle_table_t));
+    table = last->next;
+    memset (table, 0, sizeof (handle_table_t));
+    i = 0;
+    
+ AssignBlock:
+    *hNum = j*MAXBLOCKS+i;
+    return &table->blocks [i];
+}
+
+static void HEAP_Handle_is_Zero ()
+{
+    printf ("Warning: Handle is Zero, segmentation fault comming\n");
+}
+
+static void **HEAP_FindSlot (HANDLE hNum)
+{
+    handle_table_t *table = &handle_table;
+    int i, j;
+
+    if (!hNum)
+	HEAP_Handle_is_Zero ();
+
+    hNum--;
+    for (j = hNum; j > MAXBLOCKS; j -= MAXBLOCKS){
+	table = table->next;
+	if (!table) return 0;
+    }
+    return &table->blocks [hNum%MAXBLOCKS];
+}
+
+HANDLE LocalAlloc (WORD flags, WORD bytes)
+{
+    void *m;
+    void **slot;
+    HANDLE hMem;
+
+    slot = HEAP_GetFreeSlot (&hMem);
+    if (flags & LMEM_WINE_ALIGN)
+	m = memalign (4, bytes);
+    else
+	m = malloc (bytes);
+    if (m){
+	*slot = m;
+	if (flags & LMEM_ZEROINIT)
+	    bzero (m, bytes);
+
+#ifdef DEBUG_HEAP
+	printf ("Handle %d [%d] = %p\n", hMem+1, bytes, m);
+#endif
+	return hMem+1;
+    }
+    return 0;
+}
+
+WORD LocalCompact (WORD min_free)
+{
+    return min_free;
+}
+
+WORD LocalFlags (HANDLE hMem)
+{
+    return 0;
+}
+
+HANDLE LocalFree (HANDLE hMem)
+{
+    void **m = HEAP_FindSlot (hMem);
+
+    free (*m);
+    *m = 0;
+    return 0;
+}
+
+BOOL LocalInit (WORD segment, WORD start, WORD end)
+{
+    return 1;
+}
+
+char *LocalLock (HANDLE hMem)
+{
+    void **m = HEAP_FindSlot (hMem);
+#ifdef DEBUG_HEAP
+    printf (">%d->%p\n", hMem, *m);
+#endif
+    return *m;
+}
+
+HANDLE LocalReAlloc (HANDLE hMem, WORD flags, WORD bytes)
+{
+    void **m = HEAP_FindSlot (hMem);
+
+    realloc (*m, bytes);
+}
+
+WORD LocalSize (HANDLE hMem)
+{
+    /* Not implemented yet */
+}
+
+
+BOOL LocalUnLock (HANDLE hMem)
+{
+    return 0;
+}
+
+HANDLE GlobalAlloc (WORD flags, DWORD size)
+{
+    return LocalAlloc (flags, size);
+}
+
+HANDLE GlobalFree (HANDLE hMem)
+{
+    return LocalFree (hMem);
+}
+
+char *GlobalLock (HANDLE hMem)
+{
+    return LocalLock (hMem);
+}
+
+BOOL GlobalUnlock (HANDLE hMem)
+{
+    return LocalUnLock (hMem);
+}
+
+WORD GlobalFlags (HANDLE hMem)
+{
+    return LocalFlags (hMem);
+}
+
+DWORD GlobalSize (HANDLE hMem)
+{
+    return LocalSize (hMem);
+}
+
+DWORD GlobalCompact(DWORD desired)
+{
+    if (desired)
+	return desired;
+    else
+	return 0x01000000;	/* Should check the available core. */
+}
+
+HANDLE GlobalReAlloc(HANDLE hMem, DWORD new_size, WORD flags)
+{
+    if (!(flags & GMEM_MODIFY))
+	return LocalReAlloc (hMem, new_size, flags);
+}
+
+#ifdef UNIMPLEMENTED
+void *GlobalQuickAlloc(int size)
+{
+}
+
+DWORD int GlobalHandle(WORD selector)
+{
+}
+
+unsigned int GlobalHandleFromPointer(void *block)
+{
+}
+
+#endif
diff --git a/toolkit/sup.c b/toolkit/sup.c
new file mode 100644
index 0000000..e1c4c0e
--- /dev/null
+++ b/toolkit/sup.c
@@ -0,0 +1,102 @@
+#include <stdio.h>
+#include "prototypes.h"
+#include "windows.h"
+#include "callback.h"
+#include "wine.h"
+#include "arch.h"
+
+/* HANDLE hSysRes = 1; */
+
+LONG CallWindowProc (FARPROC func, HWND hwnd, WORD message,
+		     WORD wParam, LONG lParam)
+{
+    (*func)(hwnd, message, wParam, lParam);
+}
+
+CallLineDDAProc (FARPROC back, int x, int y, long lParam)
+{
+    (*back)(x, y, lParam);
+}
+
+/*
+ * Header loading routines for WineLib.
+ */
+
+/* LOADSHORT Calls LOAD and swaps the high and the low bytes */
+
+#define LOAD(x)  read (fd, &TAB->x, sizeof (TAB->x))
+#define LOADSHORT(x) LOAD(x); TAB->x = CONV_SHORT (TAB->x);
+#define LOADLONG(x) LOAD(x);  TAB->x = CONV_LONG (TAB->x);
+
+void load_mz_header (int fd, struct mz_header_s *mz_header)
+{
+#define TAB mz_header
+    LOAD (dont_care1);
+    LOAD (must_be_0x40);
+    LOAD (dont_care2);
+    LOADSHORT (ne_offset);
+}
+
+void load_ne_header (int fd, struct ne_header_s *ne_header)
+{
+#undef TAB
+#define TAB ne_header
+    LOAD (header_type);
+    LOADSHORT (linker_version);
+    LOADSHORT (linker_revision);
+    LOADSHORT (entry_tab_offset);
+    LOADSHORT (entry_tab_length);
+    LOAD (reserved1);
+    LOADSHORT (format_flags);
+    LOADSHORT (auto_data_seg);
+    LOADSHORT (local_heap_length);
+    LOADSHORT (stack_length);
+    LOADSHORT (ip);
+    LOADSHORT (cs);
+    LOADSHORT (sp);
+    LOADSHORT (ss);
+    LOADSHORT (n_segment_tab);
+    LOADSHORT (n_mod_ref_tab);
+    LOADSHORT (nrname_tab_length);
+    LOADSHORT (segment_tab_offset);
+    LOADSHORT (resource_tab_offset);
+    LOADSHORT (rname_tab_offset);
+    LOADSHORT (moduleref_tab_offset);
+    LOADSHORT (iname_tab_offset);
+    LOADLONG (nrname_tab_offset);
+    LOADSHORT (n_mov_entry_points);
+    LOADSHORT (align_shift_count);
+    LOADSHORT (n_resource_seg);
+    LOAD (operating_system);
+    LOAD (additional_flags);
+    LOADSHORT (fastload_offset);
+    LOADSHORT (fastload_length);
+    LOADSHORT (reserved2);
+    LOADSHORT (expect_version);
+}
+
+/*
+ * Typeinfo loading routines for non PC-architectures.
+ */
+
+int load_typeinfo (int fd, struct resource_typeinfo_s *typeinfo)
+{
+#undef TAB
+#define TAB typeinfo
+    LOADSHORT (type_id);
+    LOADSHORT (count);
+    LOADLONG  (reserved);
+    return 1;
+}
+
+int load_nameinfo (int fd, struct resource_nameinfo_s *nameinfo)
+{
+#undef TAB
+#define TAB nameinfo
+    LOADSHORT (offset);
+    LOADSHORT (length);
+    LOADSHORT (flags);
+    LOADSHORT (id);
+    LOADSHORT (handle);
+    LOADSHORT (usage);
+}
diff --git a/toolkit/winmain.c b/toolkit/winmain.c
new file mode 100644
index 0000000..3f68eb7
--- /dev/null
+++ b/toolkit/winmain.c
@@ -0,0 +1,26 @@
+#include <stdio.h>
+#include "windows.h"
+#include "wine.h"
+
+extern HINSTANCE hSysRes;
+
+_WinMain (int argc, char *argv [])
+{
+    int ret_val;
+    char filename [4096];
+    
+    GetPrivateProfileString("wine", "SystemResources", "sysres.dll", 
+			    filename, sizeof(filename), WINE_INI);
+    hSysRes = LoadImage(filename);
+    if (hSysRes == (HINSTANCE)NULL)
+	printf("Error Loading System Resources !!!\n");
+    else
+	printf("System Resources Loaded // hSysRes='%04X'\n", hSysRes);
+
+    USER_InitApp (hSysRes);
+    ret_val = WinMain (1,		/* hInstance */
+		       0,		/* hPrevInstance */
+		       "",		/* lpszCmdParam */
+		       SW_NORMAL); 	/* nCmdShow */
+    return ret_val;
+}
diff --git a/tools/Makefile b/tools/Makefile
deleted file mode 100644
index f74628e..0000000
--- a/tools/Makefile
+++ /dev/null
@@ -1,19 +0,0 @@
-CFLAGS=$(COPTS) $(DEBUGOPTS) -I$(INCLUDE_DIR)
-
-build: build.c
-	cc $(CFLAGS) -o build build.c
-
-clean:
-	rm -f *.o *~ build *#
-
-depend:
-	$(CC) $(CFLAGS) -M *.c > .depend
-
-dummy:
-
-#
-# Dependency lists
-#
-ifeq (.depend,$(wildcard .depend))
-include .depend
-endif
diff --git a/tools/build.c b/tools/build.c
index 7343b76..9b0eada 100644
--- a/tools/build.c
+++ b/tools/build.c
@@ -744,7 +744,11 @@
 
     fclose(fp);
 
+#ifndef SHORTNAMES
     sprintf(filename, "dll_%s_tab.c", LowerDLLName);
+#else
+    sprintf(filename, "dtb_%s.c", LowerDLLName);
+#endif
     fp = fopen(filename, "w");
 
     fprintf(fp, "#include <stdio.h>\n");
diff --git a/windows/Imakefile b/windows/Imakefile
index 5aa561e..947968a 100644
--- a/windows/Imakefile
+++ b/windows/Imakefile
@@ -5,7 +5,6 @@
 SRCS = \
 	caret.c \
 	class.c \
-	clipping.c \
 	dc.c \
 	dce.c \
 	defdlg.c \
@@ -27,30 +26,7 @@
 	win.c \
 	winpos.c
 
-OBJS = \
-	caret.o \
-	class.o \
-	clipping.o \
-	dc.o \
-	dce.o \
-	defdlg.o \
-	defwnd.o \
-	dialog.o \
-	event.o \
-	focus.o \
-	graphics.o \
-	keyboard.o \
-	mapping.o \
-	message.o \
-	nonclient.o \
-	painting.o \
-	scroll.o \
-	syscolor.o \
-	sysmetrics.o \
-	timer.o \
-	utility.o \
-	win.o \
-	winpos.o
+OBJS = $(SRCS:.c=.o)
 
 WineRelocatableTarget($(TOP)/$(MODULE),,$(OBJS))
 DependTarget()
diff --git a/windows/Makefile b/windows/Makefile
deleted file mode 100644
index 8ac8efa..0000000
--- a/windows/Makefile
+++ /dev/null
@@ -1,21 +0,0 @@
-CFLAGS=$(COPTS) $(DEBUGOPTS) -I$(INCLUDE_DIR)
-
-OBJS=class.o dc.o dce.o event.o message.o win.o timer.o graphics.o \
-    	clipping.o mapping.o painting.o keyboard.o utility.o syscolor.o \
-	defwnd.o defdlg.o dialog.o focus.o scroll.o caret.o winpos.o \
-	sysmetrics.o nonclient.o
-
-default: windows.o
-
-windows.o: $(OBJS)
-	$(LD) -r -o windows.o $(OBJS)
-
-clean:
-	rm -f *.o *~ *.s dll_* *.a *#
-
-depend:
-	$(CC) $(CFLAGS) -M *.c > .depend
-
-ifeq (.depend,$(wildcard .depend))
-include .depend
-endif
diff --git a/windows/caret.c b/windows/caret.c
index 566e321..1d85120 100644
--- a/windows/caret.c
+++ b/windows/caret.c
@@ -18,6 +18,7 @@
     short         width;
     short         height;
     COLORREF      color;
+    HBITMAP       bitmap;
     WORD          timeout;
     WORD          timerid;
 } CARET;
@@ -47,7 +48,10 @@
     {
 	Caret.on = (Caret.on ? FALSE : TRUE);
 	hdc = GetDC(Caret.hwnd);
-	hBrush = CreateSolidBrush(Caret.color);
+	if (Caret.bitmap == 0 || Caret.bitmap == 1)
+	    hBrush = CreateSolidBrush(Caret.color);
+	else
+	    hBrush = CreatePatternBrush(Caret.bitmap);
 	SelectObject(hdc, (HANDLE)hBrush);
 	SetROP2(hdc, R2_XORPEN);
 	rgn = CreateRectRgn(Caret.x, Caret.y, 
@@ -74,7 +78,10 @@
 
     Caret.on = FALSE;
     hdc = GetDC(Caret.hwnd);
-    hBrush = CreateSolidBrush(Caret.color);
+    if (Caret.bitmap == 0 || Caret.bitmap == 1)
+	hBrush = CreateSolidBrush(Caret.color);
+    else
+	hBrush = CreatePatternBrush(Caret.bitmap);
     SelectObject(hdc, (HANDLE)hBrush);
     SetROP2(hdc, R2_XORPEN);
     rgn = CreateRectRgn(Caret.x, Caret.y, 
@@ -100,28 +107,28 @@
 /*    if (Caret.hwnd)
 	DestroyCaret();
 */
-    if (bitmap)
-    {
-	printf("CreateCaret: Bitmaps are currently not supported\n");
-	return;
-    }
+    if (bitmap && bitmap != 1)
+	Caret.bitmap = bitmap;
 
     if (width)
 	Caret.width = width;
     else
-	Caret.width = 3;              /* should be SM_CXBORDER */
+	Caret.width = GetSystemMetrics(SM_CXBORDER);
 
     if (height)
 	Caret.height = height;
     else
-	Caret.height = 3;             /* should be SM_CYBORDER */
+	Caret.height = GetSystemMetrics(SM_CYBORDER);
 
     Caret.hwnd = hwnd;
     Caret.hidden = 1;
     Caret.on = FALSE;
     Caret.x = 0;
     Caret.y = 0;
-    Caret.color = GetSysColor(COLOR_WINDOWTEXT);
+    if (bitmap == 1)
+	Caret.color = GetSysColor(COLOR_GRAYTEXT);
+    else
+	Caret.color = GetSysColor(COLOR_WINDOWTEXT);
     Caret.timeout = 750;
     LockCaret = FALSE;
 
diff --git a/windows/class.c b/windows/class.c
index 4ca2d9f..fbec0a1 100644
--- a/windows/class.c
+++ b/windows/class.c
@@ -123,7 +123,7 @@
     else newClass->hdce = 0;
 
       /* Menu name should also be set to zero. */
-    newClass->wc.lpszClassName = NULL;
+    newClass->wc.lpszClassName = NULL; 
     
     if (class->cbClsExtra) memset( newClass->wExtra, 0, class->cbClsExtra );
     firstClass = handle;
diff --git a/windows/clipping.c b/windows/clipping.c
deleted file mode 100644
index 28d0da9..0000000
--- a/windows/clipping.c
+++ /dev/null
@@ -1,175 +0,0 @@
-/*
- * Window clipping functions
- *
- * Copyright 1993 Alexandre Julliard
- */
-
-static char Copyright[] = "Copyright  Alexandre Julliard, 1993";
-
-#include <stdio.h>
-
-#include "windows.h"
-#include "win.h"
-#include "message.h"
-
-
-/***********************************************************************
- *           InvalidateRgn   (USER.126)
- */
-void InvalidateRgn( HWND hwnd, HRGN hrgn, BOOL erase )
-{
-    HRGN newRgn;
-    WND * wndPtr = WIN_FindWndPtr( hwnd );
-    if (!wndPtr) return;
-    
-    if (!hrgn)
-    {
-	newRgn = CreateRectRgn(0, 0, 
-		   wndPtr->rectClient.right-wndPtr->rectClient.left,
-		   wndPtr->rectClient.bottom-wndPtr->rectClient.top );
-    }
-    else 
-    {
-	if (!(newRgn = CreateRectRgn( 0, 0, 0, 0 ))) return;
-	if (!wndPtr->hrgnUpdate) CombineRgn( newRgn, hrgn, 0, RGN_COPY );
-	else CombineRgn( newRgn, wndPtr->hrgnUpdate, hrgn, RGN_OR );
-    }
-    if (wndPtr->hrgnUpdate) DeleteObject( wndPtr->hrgnUpdate );
-    else MSG_IncPaintCount( wndPtr->hmemTaskQ );
-    wndPtr->hrgnUpdate = newRgn;
-    if (erase) wndPtr->flags |= WIN_ERASE_UPDATERGN;
-
-      /* Invalidate the children overlapping the region */
-
-    if (wndPtr->dwStyle & WS_CLIPCHILDREN) return;
-    for (hwnd = wndPtr->hwndChild; (hwnd); hwnd = wndPtr->hwndNext)
-    {
-	if (!(wndPtr = WIN_FindWndPtr( hwnd ))) break;
-	if (hrgn && !RectInRegion( hrgn, &wndPtr->rectWindow )) continue;
-	InvalidateRgn( hwnd, hrgn, erase );
-    }
-}
-
-
-/***********************************************************************
- *           InvalidateRect   (USER.125)
- */
-void InvalidateRect( HWND hwnd, LPRECT rect, BOOL erase )
-{
-    HRGN hrgn = 0;
-
-    WND * wndPtr = WIN_FindWndPtr( hwnd );
-    if (!wndPtr) return;
-
-#ifdef DEBUG_WIN
-    if (rect) printf( "InvalidateRect: %d %d,%d-%d,%d\n", hwnd,
-		     rect->left, rect->top, rect->right, rect->bottom );
-    else printf( "InvalidateRect: %d NULL\n", hwnd );
-#endif
-    if (rect) hrgn = CreateRectRgnIndirect( rect );
-    InvalidateRgn( hwnd, hrgn, erase );
-    if (hrgn) DeleteObject( hrgn );
-}
-
-
-/***********************************************************************
- *           ValidateRgn   (USER.128)
- */
-void ValidateRgn( HWND hwnd, HRGN hrgn )
-{
-    HRGN newRgn;
-    WND * wndPtr = WIN_FindWndPtr( hwnd );
-    if (!wndPtr) return;
-
-    if (!wndPtr->hrgnUpdate) return;
-    if (!hrgn) newRgn = 0;
-    else
-    {
-	if (!(newRgn = CreateRectRgn( 0, 0, 0, 0 ))) return;
-	if (CombineRgn( newRgn, wndPtr->hrgnUpdate, hrgn, RGN_DIFF ) == NULLREGION)
-	{
-	    DeleteObject( newRgn );
-	    newRgn = 0;
-	}
-    }
-    DeleteObject( wndPtr->hrgnUpdate );
-    wndPtr->hrgnUpdate = newRgn;
-    if (!wndPtr->hrgnUpdate) wndPtr->flags &= ~WIN_ERASE_UPDATERGN;
-}
-
-
-/***********************************************************************
- *           ValidateRect   (USER.127)
- */
-void ValidateRect( HWND hwnd, LPRECT rect )
-{
-    HRGN hrgn = 0;
-
-    WND * wndPtr = WIN_FindWndPtr( hwnd );
-    if (!wndPtr) return;
-
-    if (rect) hrgn = CreateRectRgnIndirect( rect );
-    ValidateRgn( hwnd, hrgn );
-    if (hrgn) DeleteObject( hrgn );
-}
-
-
-/***********************************************************************
- *           GetUpdateRect   (USER.190)
- */
-BOOL GetUpdateRect( HWND hwnd, LPRECT rect, BOOL erase )
-{
-    WND * wndPtr = WIN_FindWndPtr( hwnd );
-    if (!wndPtr) return FALSE;
-
-    if (rect)
-    {
-	if (wndPtr->hrgnUpdate)
-	{
-	    HRGN hrgn = CreateRectRgn( 0, 0, 0, 0 );
-	    if (GetUpdateRgn( hwnd, hrgn, erase ) == ERROR) return FALSE;
-	    GetRgnBox( hrgn, rect );
-	    DeleteObject( hrgn );
-	}
-	else SetRectEmpty( rect );
-    }
-    return (wndPtr->hrgnUpdate != 0);
-}
-
-
-/***********************************************************************
- *           GetUpdateRgn   (USER.237)
- */
-int GetUpdateRgn( HWND hwnd, HRGN hrgn, BOOL erase )
-{
-    HRGN hrgnClip;
-    int retval;
-    WND * wndPtr = WIN_FindWndPtr( hwnd );
-    if (!wndPtr) return ERROR;
-
-    if (!wndPtr->hrgnUpdate)
-    {
-	if (!(hrgnClip = CreateRectRgn( 0, 0, 0, 0 ))) return ERROR;
-	retval = CombineRgn( hrgn, hrgnClip, 0, RGN_COPY );
-    }
-    else
-    {
-	hrgnClip = CreateRectRgn( 0, 0,
-			   wndPtr->rectClient.right-wndPtr->rectClient.left,
-			   wndPtr->rectClient.bottom-wndPtr->rectClient.top );
-	if (!hrgnClip) return ERROR;
-	retval = CombineRgn( hrgn, wndPtr->hrgnUpdate, hrgnClip, RGN_AND );
-	if (erase)
-	{
-	    HDC hdc = GetDCEx( hwnd, wndPtr->hrgnUpdate,
-			      DCX_INTERSECTRGN | DCX_USESTYLE );
-	    if (hdc)
-	    {
-		SendMessage( hwnd, WM_ERASEBKGND, hdc, 0 );
-		ReleaseDC( hwnd, hdc );
-	    }
-	}	
-    }
-    DeleteObject( hrgnClip );
-    return retval;
-}
diff --git a/windows/dce.c b/windows/dce.c
index 5aef283..6df7ccd 100644
--- a/windows/dce.c
+++ b/windows/dce.c
@@ -87,6 +87,37 @@
 
 
 /***********************************************************************
+ *           DCE_GetVisRect
+ *
+ * Return the visible rectangle of a window, i.e. the client or
+ * window area clipped by the client area of all ancestors.
+ */
+static void DCE_GetVisRect( WND *wndPtr, BOOL clientArea, RECT *lprect )
+{
+    int xoffset, yoffset;
+
+    *lprect = clientArea ? wndPtr->rectClient : wndPtr->rectWindow;
+    xoffset = lprect->left;
+    yoffset = lprect->top;
+
+    while (wndPtr->dwStyle & WS_CHILD)
+    {
+	WND *parentPtr = WIN_FindWndPtr( wndPtr->hwndParent );
+	xoffset += parentPtr->rectClient.left;
+	yoffset += parentPtr->rectClient.top;
+	OffsetRect( lprect, parentPtr->rectClient.left,
+		    parentPtr->rectClient.top );
+
+	  /* Warning!! we assume that IntersectRect() handles the case */
+	  /* where the destination is the same as one of the sources.  */
+	IntersectRect( lprect, lprect, &parentPtr->rectClient );
+	wndPtr = parentPtr;
+    }
+    OffsetRect( lprect, -xoffset, -yoffset );
+}
+
+
+/***********************************************************************
  *           GetDCEx    (USER.359)
  */
 /* Unimplemented flags: DCX_CLIPSIBLINGS, DCX_LOCKWINDOWUPDATE, DCX_PARENTCLIP
@@ -94,6 +125,7 @@
 HDC GetDCEx( HWND hwnd, HRGN hrgnClip, DWORD flags )
 {
     HANDLE hdce;
+    RECT clipRect;
     HDC hdc = 0;
     DCE * dce;
     DC * dc;
@@ -155,8 +187,11 @@
 	    dc->w.DCOrgY  = wndPtr->rectClient.top - wndPtr->rectWindow.top;
 	    dc->w.DCSizeX = wndPtr->rectClient.right - wndPtr->rectClient.left;
 	    dc->w.DCSizeY = wndPtr->rectClient.bottom - wndPtr->rectClient.top;
-	    IntersectVisRect( hdc, 0, 0, dc->w.DCSizeX, dc->w.DCSizeY );
 	}	
+
+	DCE_GetVisRect( wndPtr, !(flags & DCX_WINDOW), &clipRect );
+	IntersectVisRect( hdc, clipRect.left, clipRect.top,
+			  clipRect.right, clipRect.bottom );
     }
     else dc->u.x.drawable = DefaultRootWindow( display );
 
diff --git a/windows/defwnd.c b/windows/defwnd.c
index 62f9f50..a495d08 100644
--- a/windows/defwnd.c
+++ b/windows/defwnd.c
@@ -64,6 +64,8 @@
 	    CREATESTRUCT * createStruct = (CREATESTRUCT *)lParam;
 	    if (createStruct->lpszName)
 		DEFWND_SetText( hwnd, createStruct->lpszName );
+	    if ((createStruct->style & WS_VSCROLL) ||
+		(createStruct->style & WS_HSCROLL)) NC_CreateScrollBars(hwnd);
 	    return 1;
 	}
 
@@ -86,11 +88,11 @@
 	return NC_HandleNCActivate( hwnd, wParam );
 
     case WM_NCDESTROY:
-	{
-	    if (wndPtr->hText) USER_HEAP_FREE(wndPtr->hText);
-	    wndPtr->hText = 0;
-	    return 0;
-	}
+	if (wndPtr->hText) USER_HEAP_FREE(wndPtr->hText);
+	wndPtr->hText = 0;
+	if (wndPtr->VScroll) free(wndPtr->VScroll);
+	if (wndPtr->HScroll) free(wndPtr->HScroll);
+	return 0;
 	
     case WM_PAINT:
 	{
diff --git a/windows/event.c b/windows/event.c
index 155c66f..87c0229 100644
--- a/windows/event.c
+++ b/windows/event.c
@@ -7,12 +7,17 @@
 static char Copyright[] = "Copyright  Alexandre Julliard, 1993";
 
 #include <X11/Xlib.h>
+#include <X11/Xresource.h>
+#include <X11/Xutil.h>
 
 #include "windows.h"
 #include "win.h"
 #include "class.h"
 #include "message.h"
 
+#ifndef FamilyAmoeba
+typedef char *XPointer;
+#endif
 
 #define NB_BUTTONS      3     /* Windows can handle 3 buttons */
 
@@ -228,8 +233,9 @@
     rect.right  = rect.left + event->width;
     rect.bottom = rect.top + event->height;
     winHasCursor = event->window;
-    
-    InvalidateRect( hwnd, &rect, TRUE );
+
+    RedrawWindow( hwnd, &rect, 0,
+		  RDW_INVALIDATE | RDW_ERASE | RDW_FRAME | RDW_NOCHILDREN );
 }
 
 
diff --git a/windows/focus.c b/windows/focus.c
index 0e88138..a3ac280 100644
--- a/windows/focus.c
+++ b/windows/focus.c
@@ -6,10 +6,7 @@
 
 static char Copyright[] = "Copyright  David Metcalfe, 1993";
 
-#include <X11/Intrinsic.h>
-#include <X11/StringDefs.h>
 #include "win.h"
-#include "gdi.h"
 
 HWND hWndFocus = 0;
 
diff --git a/windows/graphics.c b/windows/graphics.c
index 1160d3f..b37da40 100644
--- a/windows/graphics.c
+++ b/windows/graphics.c
@@ -10,6 +10,7 @@
 #include <stdlib.h>
 #include <X11/Xlib.h>
 #include <X11/Xutil.h>
+#include <X11/Intrinsic.h>
 #ifndef PI
 #define PI M_PI
 #endif
@@ -208,6 +209,75 @@
 
 
 /***********************************************************************
+ *           RoundRect    (GDI.28)
+ */
+BOOL RoundRect( HDC hDC, short left, short top, short right, short bottom,
+					short ell_width, short ell_height)
+{
+    int		x1, y1, x2, y2;
+    DC * dc = (DC *) GDI_GetObjPtr(hDC, DC_MAGIC);
+    if (!dc) return FALSE;
+/*
+    printf("RoundRect(%d %d %d %d  %d %d\n", 
+    	left, top, right, bottom, ell_width, ell_height);
+*/
+    x1 = XLPTODP(dc, left);
+    y1 = YLPTODP(dc, top);
+    x2 = XLPTODP(dc, right - ell_width);
+    y2 = YLPTODP(dc, bottom - ell_height);
+    if (DC_SetupGCForBrush(dc)) {
+	XFillArc(XT_display, dc->u.x.drawable, dc->u.x.gc,
+		        dc->w.DCOrgX + x1, dc->w.DCOrgY + y1,
+		        ell_width, ell_height, 90 * 64, 90 * 64);
+	XFillArc(XT_display, dc->u.x.drawable, dc->u.x.gc,
+		        dc->w.DCOrgX + x1, dc->w.DCOrgY + y2,
+		        ell_width, ell_height, 180 * 64, 90 * 64);
+	XFillArc(XT_display, dc->u.x.drawable, dc->u.x.gc,
+		        dc->w.DCOrgX + x2, dc->w.DCOrgY + y2,
+		        ell_width, ell_height, 270 * 64, 90 * 64);
+	XFillArc(XT_display, dc->u.x.drawable, dc->u.x.gc,
+		        dc->w.DCOrgX + x2, dc->w.DCOrgY + y1,
+		        ell_width, ell_height, 0, 90 * 64);
+	ell_width /= 2;  ell_height /= 2;
+	XFillRectangle(XT_display, dc->u.x.drawable, dc->u.x.gc,
+		dc->w.DCOrgX + left + ell_width, dc->w.DCOrgY + top,
+		right - left - 2 * ell_width, bottom - top);
+	XFillRectangle(XT_display, dc->u.x.drawable, dc->u.x.gc,
+		dc->w.DCOrgX + left, dc->w.DCOrgY + top + ell_height,
+		ell_width, bottom - top - 2 * ell_height);
+	XFillRectangle(XT_display, dc->u.x.drawable, dc->u.x.gc,
+		dc->w.DCOrgX + right - ell_width, dc->w.DCOrgY + top + ell_height,
+		ell_width, bottom - top - 2 * ell_height);
+	ell_width *= 2;  ell_height *= 2;
+	}    	
+    if (DC_SetupGCForPen(dc)) {
+	XDrawArc(XT_display, dc->u.x.drawable, dc->u.x.gc,
+		        dc->w.DCOrgX + x1, dc->w.DCOrgY + y1,
+		        ell_width, ell_height, 90 * 64, 90 * 64);
+	XDrawArc(XT_display, dc->u.x.drawable, dc->u.x.gc,
+		        dc->w.DCOrgX + x1, dc->w.DCOrgY + y2,
+		        ell_width, ell_height, 180 * 64, 90 * 64);
+	XDrawArc(XT_display, dc->u.x.drawable, dc->u.x.gc,
+		        dc->w.DCOrgX + x2, dc->w.DCOrgY + y2,
+		        ell_width, ell_height, 270 * 64, 90 * 64);
+	XDrawArc(XT_display, dc->u.x.drawable, dc->u.x.gc,
+		        dc->w.DCOrgX + x2, dc->w.DCOrgY + y1,
+		        ell_width, ell_height, 0, 90 * 64);
+	}
+    ell_width /= 2;  ell_height /= 2;
+    MoveTo(hDC, left, top + ell_height);
+    LineTo(hDC, left, bottom - ell_height);
+    MoveTo(hDC, left + ell_width, bottom);
+    LineTo(hDC, right - ell_width, bottom);
+    MoveTo(hDC, right, bottom - ell_height);
+    LineTo(hDC, right, top + ell_height);
+    MoveTo(hDC, right - ell_width, top);
+    LineTo(hDC, left + ell_width, top);
+    return TRUE;
+}
+
+
+/***********************************************************************
  *           FillRect    (USER.81)
  */
 int FillRect( HDC hdc, LPRECT rect, HBRUSH hbrush )
@@ -511,5 +581,95 @@
     	free ((void *) points);
 	return (TRUE);
 }
+
+/**********************************************************************
+ *          FloodFill_rec -- FloodFill helper function
+ *
+ * Just does a recursive flood fill:
+ * this is /not/ efficent -- a better way would be to draw
+ * an entire line at a time, but this will do for now.
+ */
+static BOOL FloodFill_rec(XImage *image, int x, int y, 
+		int orgx, int orgy, int endx, int endy, 
+		Pixel borderp, Pixel fillp)
+{
+	Pixel testp;
+
+	if (x > endx || x < orgx || y > endy || y < orgy)
+		return FALSE;
+	XPutPixel(image, x, y, fillp);
+
+	testp = XGetPixel(image, x+1, y+1);
+	if (testp != borderp && testp != fillp)
+		FloodFill_rec(image, x+1, y+1, orgx, orgy, 
+				endx, endy, borderp, fillp);
+
+	testp = XGetPixel(image, x+1, y-1);
+	if (testp != borderp && testp != fillp)
+		FloodFill_rec(image, x+1, y-1, orgx, orgy, 
+				endx, endy, borderp, fillp);
+	testp = XGetPixel(image, x-1, y+1); 
+	if (testp != borderp && testp != fillp)
+		FloodFill_rec(image, x-1, y+1, orgx, orgy,
+				endx, endy, borderp, fillp);
+	testp = XGetPixel(image, x-1, y-1);
+ 	if (testp != borderp && testp != fillp) 
+		FloodFill_rec(image, x-1, y-1, orgx, orgy, 
+				endx, endy, borderp, fillp);
+	return TRUE;
+}
+
  
+/**********************************************************************
+ *          FloodFill (GDI.25)
+ */
+BOOL FloodFill(HDC hdc, short x, short y, DWORD crColor)
+{
+	Pixel boundrypixel;
+	int imagex, imagey;
+	XImage *image;
+    	DC *dc;
+
+#ifdef DEBUG_GRAPHICS
+	printf("FloodFill %x %d,%d %x\n", hdc, x, y, crColor);
+#endif
+    	dc = (DC *) GDI_GetObjPtr(hdc, DC_MAGIC);
+
+	if (!dc) return 0;
+
+	x = dc->w.DCOrgX + XLPTODP(dc, x);
+	y = dc->w.DCOrgY + YLPTODP(dc, y);
+
+	if (x < dc->w.DCOrgX || x > dc->w.DCOrgX + dc->w.DCSizeX ||
+	    y < dc->w.DCOrgY || y > dc->w.DCOrgY + dc->w.DCSizeY)
+		return 0;
+
+    	if (!DC_SetupGCForBrush(dc)) 
+		return FALSE;
+
+	boundrypixel = GetNearestPaletteIndex( dc->w.hPalette, crColor );	
+
+	image = XGetImage(display, dc->u.x.drawable,  
+			dc->w.DCOrgX, dc->w.DCOrgY,
+			dc->w.DCSizeX, dc->w.DCSizeY, AllPlanes, ZPixmap);
+	if (XGetPixel(image, x, y) == boundrypixel) 
+		return FALSE;
+	if (!FloodFill_rec(image, x, y, 
+				0,0, 
+				dc->w.DCOrgX + dc->w.DCSizeX, 
+				dc->w.DCOrgY + dc->w.DCSizeY, 
+				boundrypixel, dc->u.x.brush.pixel)) {
+		XDestroyImage(image);
+		return 0;
+	}
+
+	XPutImage(display, dc->u.x.drawable, dc->u.x.gc, image,
+			0, 0,
+			dc->w.DCOrgX, dc->w.DCOrgY,
+                        dc->w.DCSizeX, dc->w.DCSizeY);
+	XDestroyImage(image);
+
+	return TRUE;
+}
+
 
diff --git a/windows/keyboard.c b/windows/keyboard.c
index 888fd27..e3afb20 100644
--- a/windows/keyboard.c
+++ b/windows/keyboard.c
@@ -6,8 +6,6 @@
 
 static char Copyright[] = "Copyright  Bob Amstadt, 1993";
 
-#include <X11/Intrinsic.h>
-#include <X11/StringDefs.h>
 #include "win.h"
 
 /**********************************************************************
diff --git a/windows/message.c b/windows/message.c
index de06f28..910f7a4 100644
--- a/windows/message.c
+++ b/windows/message.c
@@ -163,26 +163,18 @@
  */
 static void MSG_RemoveMsg( MESSAGEQUEUE * msgQueue, int pos )
 {
-    QMSG * qmsg;
-    
-    if (!msgQueue) return;
-    qmsg = &msgQueue->messages[pos];
-
     if (pos >= msgQueue->nextMessage)
     {
-	int count = pos - msgQueue->nextMessage;
-	if (count) memmove( &msgQueue->messages[msgQueue->nextMessage+1],
-			    &msgQueue->messages[msgQueue->nextMessage],
-			    count * sizeof(QMSG) );
+	for ( ; pos > msgQueue->nextMessage; pos--)
+	    msgQueue->messages[pos] = msgQueue->messages[pos-1];
 	msgQueue->nextMessage++;
 	if (msgQueue->nextMessage >= msgQueue->queueSize)
 	    msgQueue->nextMessage = 0;
     }
     else
     {
-	int count = msgQueue->nextFreeMessage - pos;
-	if (count) memmove( &msgQueue->messages[pos],
-			    &msgQueue->messages[pos+1], count * sizeof(QMSG) );
+	for ( ; pos < msgQueue->nextFreeMessage; pos++)
+	    msgQueue->messages[pos] = msgQueue->messages[pos+1];
 	if (msgQueue->nextFreeMessage) msgQueue->nextFreeMessage--;
 	else msgQueue->nextFreeMessage = msgQueue->queueSize-1;
     }
diff --git a/windows/nonclient.c b/windows/nonclient.c
index 8f84802..5456b08 100644
--- a/windows/nonclient.c
+++ b/windows/nonclient.c
@@ -7,11 +7,12 @@
 static char Copyright[] = "Copyright  Alexandre Julliard, 1994";
 
 #include "win.h"
+#include "class.h"
 #include "message.h"
 #include "sysmetrics.h"
 #include "user.h"
 #include "scroll.h"
-
+#include "menu.h"
 
 static HBITMAP hbitmapClose = 0;
 static HBITMAP hbitmapMinimize = 0;
@@ -21,11 +22,9 @@
 static HBITMAP hbitmapRestore = 0;
 static HBITMAP hbitmapRestoreD = 0;
 
-extern void NC_TrackSysMenu( HWND hwnd ); /* menu.c */
 extern void WINPOS_GetMinMaxInfo( HWND hwnd, POINT *maxSize, POINT *maxPos,
 			    POINT *minTrack, POINT *maxTrack );  /* winpos.c */
-
-extern Display * display;
+extern void CURSOR_SetWinCursor( HWND hwnd, HCURSOR hcursor );   /* cursor.c */
 
 
   /* Some useful macros */
@@ -39,6 +38,15 @@
 
 #define HAS_MENU(w)  (!((w)->dwStyle & WS_CHILD) && ((w)->wIDmenu != 0))
 
+#define ON_LEFT_BORDER(hit) \
+ (((hit) == HTLEFT) || ((hit) == HTTOPLEFT) || ((hit) == HTBOTTOMLEFT))
+#define ON_RIGHT_BORDER(hit) \
+ (((hit) == HTRIGHT) || ((hit) == HTTOPRIGHT) || ((hit) == HTBOTTOMRIGHT))
+#define ON_TOP_BORDER(hit) \
+ (((hit) == HTTOP) || ((hit) == HTTOPLEFT) || ((hit) == HTTOPRIGHT))
+#define ON_BOTTOM_BORDER(hit) \
+ (((hit) == HTBOTTOM) || ((hit) == HTBOTTOMLEFT) || ((hit) == HTBOTTOMRIGHT))
+
 /***********************************************************************
  *           NC_AdjustRect
  *
@@ -512,6 +520,7 @@
  *           NC_DoNCPaint
  *
  * Paint the non-client area.
+ * 'hrgn' is the update rgn to use (in client coords) or 1 if no update rgn.
  */
 static void NC_DoNCPaint( HWND hwnd, HRGN hrgn, BOOL active )
 {
@@ -531,7 +540,15 @@
 	return;  /* Nothing to do! */
 
     if (hrgn == 1) hdc = GetDCEx( hwnd, 0, DCX_CACHE | DCX_WINDOW );
-    else hdc = GetDCEx( hwnd, hrgn, DCX_CACHE | DCX_WINDOW | DCX_INTERSECTRGN);
+    else
+    {
+	  /* Make region relative to window area */
+	int xoffset = wndPtr->rectWindow.left - wndPtr->rectClient.left;
+	int yoffset = wndPtr->rectWindow.top - wndPtr->rectClient.top;
+	OffsetRgn( hrgn, -xoffset, -yoffset );
+	hdc = GetDCEx( hwnd, hrgn, DCX_CACHE | DCX_WINDOW | DCX_INTERSECTRGN);
+	OffsetRgn( hrgn, xoffset, yoffset );  /* Restore region */
+    }
     if (!hdc) return;
     if (ExcludeVisRect( hdc, wndPtr->rectClient.left-wndPtr->rectWindow.left,
 		        wndPtr->rectClient.top-wndPtr->rectWindow.top,
@@ -577,15 +594,29 @@
 	NC_DrawCaption( hdc, &r, hwnd, wndPtr->dwStyle, active );
     }
 
-    if (wndPtr->dwStyle & (WS_VSCROLL | WS_HSCROLL))
-    {
-	if (wndPtr->dwStyle & WS_VSCROLL) {
-	    int bottom = rect.bottom;
-	    if (wndPtr->dwStyle & WS_HSCROLL) bottom -= SYSMETRICS_CYHSCROLL;
-	    SetRect(&rect2, rect.right - SYSMETRICS_CXVSCROLL, rect.top,
-		    rect.right, bottom); 
-	    StdDrawScrollBar(hwnd, hdc, SB_VERT, &rect2, (LPHEADSCROLL)wndPtr->VScroll);
-	    }
+    if (wndPtr->wIDmenu != 0 &&
+	(wndPtr->dwStyle & WS_CHILD) != WS_CHILD) {
+	int oldbottom;
+	CopyRect(&rect2, &rect);
+	/* Default MenuBar height */
+	oldbottom = rect2.bottom = rect2.top + SYSMETRICS_CYMENU; 
+	StdDrawMenuBar(hdc, &rect2, (LPPOPUPMENU)GlobalLock(wndPtr->wIDmenu));
+	GlobalUnlock(wndPtr->wIDmenu);
+	/* Reduce ClientRect according to MenuBar height */
+	rect.top += rect2.bottom - oldbottom;
+	}
+
+    if (wndPtr->dwStyle & (WS_VSCROLL | WS_HSCROLL)) {
+ 	if (wndPtr->dwStyle & WS_VSCROLL) {
+ 	    int bottom = rect.bottom;
+ 	    if (wndPtr->dwStyle & WS_HSCROLL) bottom -= SYSMETRICS_CYHSCROLL;
+	    SetRect(&rect2, rect.right - SYSMETRICS_CXVSCROLL, 
+	    	rect.top, rect.right, bottom); 
+	    if (wndPtr->dwStyle & WS_CAPTION) rect.top += SYSMETRICS_CYSIZE;
+	    if (wndPtr->wIDmenu != 0 && (wndPtr->dwStyle & WS_CHILD) != WS_CHILD) 
+	    	rect2.top += SYSMETRICS_CYMENU;
+ 	    StdDrawScrollBar(hwnd, hdc, SB_VERT, &rect2, (LPHEADSCROLL)wndPtr->VScroll);
+ 	    }
 	if (wndPtr->dwStyle & WS_HSCROLL) {
 	    int right = rect.right;
 	    if (wndPtr->dwStyle & WS_VSCROLL) right -= SYSMETRICS_CYVSCROLL;
@@ -593,18 +624,15 @@
 		    right, rect.bottom);
 	    StdDrawScrollBar(hwnd, hdc, SB_HORZ, &rect2, (LPHEADSCROLL)wndPtr->HScroll);
 	    }
-/*
-	HBRUSH hbrushScroll = CreateSolidBrush( GetSysColor(COLOR_SCROLLBAR) );
-	HBRUSH hbrushOld = SelectObject( hdc, hbrushScroll );
-	if (wndPtr->dwStyle & WS_VSCROLL)
-	    PatBlt( hdc, rect.right - SYSMETRICS_CXVSCROLL, rect.top,
-		    SYSMETRICS_CXVSCROLL, rect.bottom-rect.top, PATCOPY );
-	if (wndPtr->dwStyle & WS_HSCROLL)
-	    PatBlt( hdc, rect.left, rect.bottom - SYSMETRICS_CYHSCROLL,
-		    rect.right-rect.left, SYSMETRICS_CYHSCROLL, PATCOPY );
-	SelectObject( hdc, hbrushOld );
-	DeleteObject( hbrushScroll );
-*/
+
+	if ((wndPtr->dwStyle & WS_VSCROLL) && (wndPtr->dwStyle & WS_HSCROLL))
+	{
+	    HBRUSH hbrushScroll = CreateSolidBrush( GetSysColor(COLOR_SCROLLBAR) );
+	    RECT r = rect;
+	    r.left = r.right - SYSMETRICS_CXVSCROLL;
+	    r.top  = r.bottom - SYSMETRICS_CYHSCROLL;
+	    FillRect( hdc, &r, hbrushScroll );
+	}
     }    
 
     ReleaseDC( hwnd, hdc );
@@ -638,6 +666,151 @@
 
 
 /***********************************************************************
+ *           NC_HandleSetCursor
+ *
+ * Handle a WM_SETCURSOR message. Called from DefWindowProc().
+ */
+LONG NC_HandleSetCursor( HWND hwnd, WORD wParam, LONG lParam )
+{
+    if (hwnd != wParam) return 0;  /* Don't set the cursor for child windows */
+
+    switch(LOWORD(lParam))
+    {
+    case HTERROR:
+	{
+	    WORD msg = HIWORD( lParam );
+	    if ((msg == WM_LBUTTONDOWN) || (msg == WM_MBUTTONDOWN) ||
+		(msg == WM_RBUTTONDOWN))
+		MessageBeep(0);
+	}
+	break;
+
+    case HTCLIENT:
+	{
+	    WND *wndPtr;
+	    CLASS *classPtr;
+	    if (!(wndPtr = WIN_FindWndPtr( hwnd ))) break;
+	    if (!(classPtr = CLASS_FindClassPtr( wndPtr->hClass ))) break;
+	    if (classPtr->wc.hCursor)
+	    {
+		CURSOR_SetWinCursor( hwnd, classPtr->wc.hCursor );
+		return TRUE;
+	    }
+	}
+	break;
+
+    case HTLEFT:
+    case HTRIGHT:
+	CURSOR_SetWinCursor( hwnd, LoadCursor( 0, IDC_SIZEWE ) );
+	return TRUE;
+
+    case HTTOP:
+    case HTBOTTOM:
+	CURSOR_SetWinCursor( hwnd, LoadCursor( 0, IDC_SIZENS ) );
+	return TRUE;
+
+    case HTTOPLEFT:
+    case HTBOTTOMRIGHT:	
+	CURSOR_SetWinCursor( hwnd, LoadCursor( 0, IDC_SIZENWSE ) );
+	return TRUE;
+
+    case HTTOPRIGHT:
+    case HTBOTTOMLEFT:
+	CURSOR_SetWinCursor( hwnd, LoadCursor( 0, IDC_SIZENESW ) );
+	return TRUE;
+    }
+
+    /* Default cursor: arrow */
+    CURSOR_SetWinCursor( hwnd, LoadCursor( 0, IDC_ARROW ) );
+    return TRUE;
+}
+
+
+/***********************************************************************
+ *           NC_StartSizeMove
+ *
+ * Initialisation of a move or resize, when initiatied from a menu choice.
+ * Return hit test code for caption or sizing border.
+ */
+static LONG NC_StartSizeMove( HWND hwnd, WORD wParam, POINT *capturePoint )
+{
+    LONG hittest = 0;
+    POINT pt;
+    MSG msg;
+    WND * wndPtr = WIN_FindWndPtr( hwnd );
+
+    if ((wParam & 0xfff0) == SC_MOVE)
+    {
+	  /* Move pointer at the center of the caption */
+	RECT rect;
+	NC_GetInsideRect( hwnd, &rect );
+	if (wndPtr->dwStyle & WS_SYSMENU)
+	    rect.left += SYSMETRICS_CXSIZE + 1;
+	if (wndPtr->dwStyle & WS_MINIMIZEBOX)
+	    rect.right -= SYSMETRICS_CXSIZE + 1;
+	if (wndPtr->dwStyle & WS_MAXIMIZEBOX)
+	    rect.right -= SYSMETRICS_CXSIZE + 1;
+	pt.x = wndPtr->rectWindow.left + (rect.right - rect.left) / 2;
+	pt.y = wndPtr->rectWindow.top + rect.top + SYSMETRICS_CYSIZE/2;
+	if (wndPtr->dwStyle & WS_CHILD)
+	    ClientToScreen( wndPtr->hwndParent, &pt );
+	hittest = HTCAPTION;
+    }
+    else  /* SC_SIZE */
+    {
+	SetCapture(hwnd);
+	while(!hittest)
+	{
+	    MSG_GetHardwareMessage( &msg );
+	    switch(msg.message)
+	    {
+	    case WM_MOUSEMOVE:
+		hittest = NC_InternalNCHitTest( hwnd, msg.pt );
+		pt = msg.pt;
+		if ((hittest < HTLEFT) || (hittest > HTBOTTOMRIGHT))
+		    hittest = 0;
+		break;
+
+	    case WM_LBUTTONUP:
+		return 0;
+
+	    case WM_KEYDOWN:
+		switch(msg.wParam)
+		{
+		case VK_UP:
+		    hittest = HTTOP;
+		    pt.x =(wndPtr->rectWindow.left+wndPtr->rectWindow.right)/2;
+		    pt.y = wndPtr->rectWindow.top + SYSMETRICS_CYFRAME / 2;
+		    break;
+		case VK_DOWN:
+		    hittest = HTBOTTOM;
+		    pt.x =(wndPtr->rectWindow.left+wndPtr->rectWindow.right)/2;
+		    pt.y = wndPtr->rectWindow.bottom - SYSMETRICS_CYFRAME / 2;
+		    break;
+		case VK_LEFT:
+		    hittest = HTLEFT;
+		    pt.x = wndPtr->rectWindow.left + SYSMETRICS_CXFRAME / 2;
+		    pt.y =(wndPtr->rectWindow.top+wndPtr->rectWindow.bottom)/2;
+		    break;
+		case VK_RIGHT:
+		    hittest = HTRIGHT;
+		    pt.x = wndPtr->rectWindow.right - SYSMETRICS_CXFRAME / 2;
+		    pt.y =(wndPtr->rectWindow.top+wndPtr->rectWindow.bottom)/2;
+		    break;
+		case VK_RETURN:
+		case VK_ESCAPE: return 0;
+		}
+	    }
+	}
+    }
+    *capturePoint = pt;
+    SetCursorPos( capturePoint->x, capturePoint->y );
+    NC_HandleSetCursor( hwnd, hwnd, MAKELONG( hittest, WM_MOUSEMOVE ));
+    return hittest;
+}
+
+
+/***********************************************************************
  *           NC_DoSizeMove
  *
  * Perform SC_MOVE and SC_SIZE commands.
@@ -645,8 +818,8 @@
 static void NC_DoSizeMove( HWND hwnd, WORD wParam, POINT pt )
 {
     MSG msg;
-    WORD hittest;
-    RECT sizingRect;
+    LONG hittest;
+    RECT sizingRect, mouseRect;
     HDC hdc;
     BOOL thickframe;
     POINT minTrack, maxTrack, capturePoint = pt;
@@ -659,44 +832,62 @@
     if ((wParam & 0xfff0) == SC_MOVE)
     {
 	if (!(wndPtr->dwStyle & WS_CAPTION)) return;
-	if (!hittest)
-	{
-	      /* Move pointer at the center of the caption */
-	    RECT rect;
-	    POINT point;
-	    NC_GetInsideRect( hwnd, &rect );
-	    if (wndPtr->dwStyle & WS_SYSMENU)
-		rect.left += SYSMETRICS_CXSIZE + 1;
-	    if (wndPtr->dwStyle & WS_MINIMIZEBOX)
-		rect.right -= SYSMETRICS_CXSIZE + 1;
-	    if (wndPtr->dwStyle & WS_MAXIMIZEBOX)
-		rect.right -= SYSMETRICS_CXSIZE + 1;
-	    point.x = wndPtr->rectWindow.left + (rect.right - rect.left) / 2;
-	    point.y = wndPtr->rectWindow.top + rect.top + SYSMETRICS_CYSIZE/2;
-	    if (wndPtr->dwStyle & WS_CHILD)
-		ClientToScreen( wndPtr->hwndParent, &point );
-	    SetCursorPos( point.x, point.y );
-	    hittest = HTCAPTION;
-	    capturePoint = point;
-	}
+	if (!hittest) hittest = NC_StartSizeMove( hwnd, wParam, &capturePoint );
+	if (!hittest) return;
     }
     else  /* SC_SIZE */
     {
 	if (!thickframe) return;
 	if (hittest) hittest += HTLEFT-1;
+	else
+	{
+	    SetCapture(hwnd);
+	    hittest = NC_StartSizeMove( hwnd, wParam, &capturePoint );
+	    if (!hittest)
+	    {
+		ReleaseCapture();
+		return;
+	    }
+	}
     }
 
+      /* Get min/max info */
+
     WINPOS_GetMinMaxInfo( hwnd, NULL, NULL, &minTrack, &maxTrack );
+    sizingRect = wndPtr->rectWindow;
+    if (wndPtr->dwStyle & WS_CHILD)
+	GetClientRect( wndPtr->hwndParent, &mouseRect );
+    else SetRect( &mouseRect, 0, 0, SYSMETRICS_CXSCREEN, SYSMETRICS_CYSCREEN );
+    if (ON_LEFT_BORDER(hittest))
+    {
+	mouseRect.left  = max( mouseRect.left, sizingRect.right-maxTrack.x );
+	mouseRect.right = min( mouseRect.right, sizingRect.right-minTrack.x );
+    }
+    else if (ON_RIGHT_BORDER(hittest))
+    {
+	mouseRect.left  = max( mouseRect.left, sizingRect.left+minTrack.x );
+	mouseRect.right = min( mouseRect.right, sizingRect.left+maxTrack.x );
+    }
+    if (ON_TOP_BORDER(hittest))
+    {
+	mouseRect.top    = max( mouseRect.top, sizingRect.bottom-maxTrack.y );
+	mouseRect.bottom = min( mouseRect.bottom,sizingRect.bottom-minTrack.y);
+    }
+    else if (ON_BOTTOM_BORDER(hittest))
+    {
+	mouseRect.top    = max( mouseRect.top, sizingRect.top+minTrack.y );
+	mouseRect.bottom = min( mouseRect.bottom, sizingRect.top+maxTrack.y );
+    }
     SendMessage( hwnd, WM_ENTERSIZEMOVE, 0, 0 );
 
+    if (GetCapture() != hwnd) SetCapture( hwnd );    
+
     if (wndPtr->dwStyle & WS_CHILD) hdc = GetDC( wndPtr->hwndParent );
     else
     {  /* Grab the server only when moving top-level windows */
 	hdc = GetDC( 0 );
 	XGrabServer( display );
     }
-    SetCapture( hwnd );    
-    sizingRect = wndPtr->rectWindow;
     NC_DrawMovingFrame( hdc, &sizingRect, thickframe );
 
     while(1)
@@ -710,69 +901,47 @@
 	    ((msg.message == WM_KEYDOWN) && 
 	     ((msg.wParam == VK_RETURN) || (msg.wParam == VK_ESCAPE)))) break;
 
+	if ((msg.message != WM_KEYDOWN) && (msg.message != WM_MOUSEMOVE))
+	    continue;  /* We are not interested in other messages */
+
+	pt = msg.pt;
 	if (wndPtr->dwStyle & WS_CHILD)
-	    ScreenToClient( wndPtr->hwndParent, &msg.pt );
+	    ScreenToClient( wndPtr->hwndParent, &pt );
 
-	switch(msg.message)
+	
+	if (msg.message == WM_KEYDOWN) switch(msg.wParam)
 	{
-	case WM_MOUSEMOVE:
-	    dx = msg.pt.x - capturePoint.x;
-	    dy = msg.pt.y - capturePoint.y;
-	    break;
+	    case VK_UP:    pt.y -= 8; break;
+	    case VK_DOWN:  pt.y += 8; break;
+	    case VK_LEFT:  pt.x -= 8; break;
+	    case VK_RIGHT: pt.x += 8; break;		
+	}
 
-	case WM_KEYDOWN:
-	    switch(msg.wParam)
-	    {
-	        case VK_UP:    msg.pt.y -= 8; break;
-		case VK_DOWN:  msg.pt.y += 8; break;
-		case VK_LEFT:  msg.pt.x -= 8; break;
-		case VK_RIGHT: msg.pt.x += 8; break;		
-	    }
-	    SetCursorPos( msg.pt.x, msg.pt.y );
-	    break;
-	}	
+	pt.x = max( pt.x, mouseRect.left );
+	pt.x = min( pt.x, mouseRect.right );
+	pt.y = max( pt.y, mouseRect.top );
+	pt.y = min( pt.y, mouseRect.bottom );
+
+	dx = pt.x - capturePoint.x;
+	dy = pt.y - capturePoint.y;
 
 	if (dx || dy)
 	{
-	    RECT newRect = sizingRect;
-	    switch(hittest)
+	    if (msg.message == WM_KEYDOWN) SetCursorPos( pt.x, pt.y );
+	    else
 	    {
-	    case HTCAPTION:
-		OffsetRect( &newRect, dx, dy );
-		break;
-	    case HTLEFT:
-		newRect.left += dx;
-		break;
-	    case HTRIGHT:
-		newRect.right += dx;
-		break;
-	    case HTTOP:
-		newRect.top += dy;
-		break;
-	    case HTTOPLEFT:
-		newRect.left += dx;
-		newRect.top  += dy;
-		break;
-	    case HTTOPRIGHT:
-		newRect.right += dx;
-		newRect.top   += dy;
-		break;
-	    case HTBOTTOM:
-		newRect.bottom += dy;
-		break;
-	    case HTBOTTOMLEFT:
-		newRect.left   += dx;
-		newRect.bottom += dy;
-		break;
-	    case HTBOTTOMRIGHT:
-		newRect.right  += dx;
-		newRect.bottom += dy;
-		break; 
-	    }	    
-	    NC_DrawMovingFrame( hdc, &sizingRect, thickframe );
-	    NC_DrawMovingFrame( hdc, &newRect, thickframe );
-	    capturePoint = msg.pt;
-	    sizingRect = newRect;
+		RECT newRect = sizingRect;
+
+		if (hittest == HTCAPTION) OffsetRect( &newRect, dx, dy );
+		if (ON_LEFT_BORDER(hittest)) newRect.left += dx;
+		else if (ON_RIGHT_BORDER(hittest)) newRect.right += dx;
+		if (ON_TOP_BORDER(hittest)) newRect.top += dy;
+		else if (ON_BOTTOM_BORDER(hittest)) newRect.bottom += dy;
+		NC_DrawMovingFrame( hdc, &sizingRect, thickframe );
+		NC_DrawMovingFrame( hdc, &newRect, thickframe );
+		capturePoint = pt;
+		sizingRect = newRect;
+	    }
 	}
     }
 
@@ -843,6 +1012,90 @@
 
 
 /***********************************************************************
+ *           NC_TrackScrollBar
+ *
+ * Track a mouse button press on the horizontal or vertical scroll-bar.
+ */
+static void NC_TrackScrollBar( HWND hwnd, WORD wParam, POINT pt )
+{
+    MSG msg;
+    WORD scrollbar;
+
+    if ((wParam & 0xfff0) == SC_HSCROLL)
+    {
+	if ((wParam & 0x0f) != HTHSCROLL) return;
+	scrollbar = SB_HORZ;
+    }
+    else  /* SC_VSCROLL */
+    {
+	if ((wParam & 0x0f) != HTVSCROLL) return;
+	scrollbar = SB_VERT;
+    }
+
+    ScreenToClient( hwnd, &pt );
+    ScrollBarButtonDown( hwnd, scrollbar, pt.x, pt.y );
+    SetCapture( hwnd );
+
+    do
+    {
+	MSG_GetHardwareMessage( &msg );
+	ScreenToClient( msg.hwnd, &msg.pt );
+	switch(msg.message)
+	{
+	case WM_LBUTTONUP:
+	    ScrollBarButtonUp( hwnd, scrollbar, msg.pt.x, msg.pt.y );
+	    break;
+	case WM_MOUSEMOVE:
+	    ScrollBarMouseMove(hwnd, scrollbar, msg.wParam, msg.pt.x,msg.pt.y);
+	    break;
+	}
+    } while (msg.message != WM_LBUTTONUP);
+    ReleaseCapture();
+}
+
+
+/***********************************************************************
+ *           NC_TrackMouseMenuBar
+ *
+ * Track a mouse events for the MenuBar.
+ */
+static void NC_TrackMouseMenuBar( HWND hwnd, WORD wParam, POINT pt )
+{
+    WND		*wndPtr;
+    LPPOPUPMENU lppop;
+    MSG 	msg;
+    wndPtr = WIN_FindWndPtr(hwnd);
+    lppop = (LPPOPUPMENU)GlobalLock(wndPtr->wIDmenu);
+#ifdef DEBUG_MENU
+    printf("NC_TrackMouseMenuBar // wndPtr=%08X lppop=%08X !\n", wndPtr, lppop);
+#endif
+    ScreenToClient(hwnd, &pt);
+    pt.y += lppop->rect.bottom;
+    MenuButtonDown(hwnd, lppop, pt.x, pt.y);
+    SetCapture(hwnd);
+    do {
+	if (!GetMessage(&msg, (HWND)NULL, 0, 0)) break;
+	ScreenToClient(hwnd, &msg.pt);
+	msg.pt.y += lppop->rect.bottom;
+	switch(msg.message) {
+	case WM_LBUTTONUP:
+	    MenuButtonUp(hwnd, lppop, msg.pt.x, msg.pt.y);
+	    break;
+	case WM_MOUSEMOVE:
+	    MenuMouseMove(hwnd, lppop, msg.wParam, msg.pt.x, msg.pt.y);
+	    break;
+	default:
+	    TranslateMessage(&msg);
+	    DispatchMessage(&msg);
+	    break;
+	}
+    } while (msg.message != WM_LBUTTONUP);
+    ReleaseCapture();
+    GlobalUnlock(wndPtr->wIDmenu);
+}
+
+
+/***********************************************************************
  *           NC_HandleNCLButtonDown
  *
  * Handle a WM_NCLBUTTONDOWN message. Called from DefWindowProc().
@@ -863,14 +1116,15 @@
 	break;
 
     case HTMENU:
+	SendMessage( hwnd, WM_SYSCOMMAND, SC_MOUSEMENU, lParam );
 	break;
 
     case HTHSCROLL:
-	SendMessage( hwnd, WM_SYSCOMMAND, SC_HSCROLL, lParam );
+	SendMessage( hwnd, WM_SYSCOMMAND, SC_HSCROLL + HTHSCROLL, lParam );
 	break;
 
     case HTVSCROLL:
-	SendMessage( hwnd, WM_SYSCOMMAND, SC_VSCROLL, lParam );
+	SendMessage( hwnd, WM_SYSCOMMAND, SC_VSCROLL + HTVSCROLL, lParam );
 	break;
 
     case HTMINBUTTON:
@@ -962,9 +1216,17 @@
 
     case SC_VSCROLL:
     case SC_HSCROLL:
+	NC_TrackScrollBar( hwnd, wParam, pt );
 	break;
+
     case SC_MOUSEMENU:
+	NC_TrackMouseMenuBar( hwnd, wParam, pt );
+	break;
+
     case SC_KEYMENU:
+/*	NC_KeyMenuBar( hwnd, wParam, pt ); */
+	break;
+	
     case SC_ARRANGE:
 	break;
 
@@ -977,61 +1239,3 @@
 }
 
 
-/***********************************************************************
- *           NC_HandleSetCursor
- *
- * Handle a WM_SETCURSOR message. Called from DefWindowProc().
- */
-LONG NC_HandleSetCursor( HWND hwnd, WORD wParam, LONG lParam )
-{
-    if (hwnd != wParam) return 0;  /* Don't set the cursor for child windows */
-
-    switch(LOWORD(lParam))
-    {
-    case HTERROR:
-	{
-	    WORD msg = HIWORD( lParam );
-	    if ((msg == WM_LBUTTONDOWN) || (msg == WM_MBUTTONDOWN) ||
-		(msg == WM_RBUTTONDOWN))
-		MessageBeep(0);
-	}
-	break;
-
-    case HTCLIENT:
-	{
-	    WND *wndPtr = WIN_FindWndPtr( hwnd );
-	    if (wndPtr && wndPtr->hCursor)
-	    {
-		SetCursor( wndPtr->hCursor );
-		return TRUE;
-	    }
-	}
-	break;
-
-    case HTLEFT:
-    case HTRIGHT:
-	SetCursor( LoadCursor( 0, IDC_SIZEWE ) );
-	return TRUE;
-
-    case HTTOP:
-    case HTBOTTOM:
-	SetCursor( LoadCursor( 0, IDC_SIZENS ) );
-	return TRUE;
-
-    case HTTOPLEFT:
-    case HTBOTTOMRIGHT:	
-	SetCursor( LoadCursor( 0, IDC_SIZENWSE ) );
-	return TRUE;
-
-    case HTTOPRIGHT:
-    case HTBOTTOMLEFT:
-	SetCursor( LoadCursor( 0, IDC_SIZENESW ) );
-	return TRUE;
-    }
-
-    /* Default cursor: arrow */
-    SetCursor( LoadCursor( 0, IDC_ARROW ) );
-    return TRUE;
-}
-
-
diff --git a/windows/painting.c b/windows/painting.c
index c218e23..0090d91 100644
--- a/windows/painting.c
+++ b/windows/painting.c
@@ -6,7 +6,6 @@
 
 static char Copyright[] = "Copyright  Alexandre Julliard, 1993";
 
-#include <math.h>
 #include <X11/Xlib.h>
 
 #include "win.h"
@@ -31,12 +30,11 @@
 			      DCX_INTERSECTRGN | DCX_USESTYLE ))) return 0;
     GetRgnBox( InquireVisRgn(lps->hdc), &lps->rcPaint );
 
-    if (wndPtr->hrgnUpdate)
-    {
-	wndPtr->hrgnUpdate = 0;
+    if (wndPtr->hrgnUpdate || (wndPtr->flags & WIN_INTERNAL_PAINT))
 	MSG_DecPaintCount( wndPtr->hmemTaskQ );
-    }
-    wndPtr->flags &= ~WIN_NEEDS_BEGINPAINT;
+
+    wndPtr->hrgnUpdate = 0;
+    wndPtr->flags &= ~(WIN_NEEDS_BEGINPAINT | WIN_INTERNAL_PAINT);
 
     SendMessage( hwnd, WM_NCPAINT, hrgnUpdate, 0 );
     if (hrgnUpdate) DeleteObject( hrgnUpdate );
@@ -83,3 +81,323 @@
     }
     if (hbrush) FillRect( hdc, rect, hbrush );
 }
+
+
+/***********************************************************************
+ *           RedrawWindow    (USER.290)
+ */
+BOOL RedrawWindow( HWND hwnd, LPRECT rectUpdate, HRGN hrgnUpdate, UINT flags )
+{
+    HRGN tmpRgn, hrgn = 0;
+    RECT rectClient, rectWindow;
+    WND * wndPtr;
+
+    if (!hwnd) hwnd = GetDesktopWindow();
+    if (!(wndPtr = WIN_FindWndPtr( hwnd ))) return FALSE;
+
+    GetClientRect( hwnd, &rectClient );
+    rectWindow = wndPtr->rectWindow;
+    OffsetRect(&rectWindow, -wndPtr->rectClient.left, -wndPtr->rectClient.top);
+
+    if (flags & RDW_INVALIDATE)  /* Invalidate */
+    {
+	if (flags & RDW_ERASE) wndPtr->flags |= WIN_ERASE_UPDATERGN;
+
+	if (hrgnUpdate)  /* Invalidate a region */
+	{
+	    if (flags & RDW_FRAME) tmpRgn = CreateRectRgnIndirect(&rectWindow);
+	    else tmpRgn = CreateRectRgnIndirect( &rectClient );
+	    if (!tmpRgn) return FALSE;
+	    hrgn = CreateRectRgn( 0, 0, 0, 0 );
+	    if (CombineRgn( hrgn, hrgnUpdate, tmpRgn, RGN_AND ) == NULLREGION)
+	    {
+		DeleteObject( hrgn );
+		hrgn = 0;
+	    }
+	    DeleteObject( tmpRgn );
+	}
+	else  /* Invalidate a rectangle */
+	{
+	    RECT rect;
+	    if (flags & RDW_FRAME)
+	    {
+		if (rectUpdate) IntersectRect( &rect, rectUpdate, &rectWindow);
+		else rect = rectWindow;
+	    }
+	    else
+	    {
+		if (rectUpdate) IntersectRect( &rect, rectUpdate, &rectClient);
+		else rect = rectClient;
+	    }
+	    if (!IsRectEmpty(&rect)) hrgn = CreateRectRgnIndirect( &rect );
+	}
+
+	  /* Set update region */
+
+	if (hrgn)
+	{
+	    if (!wndPtr->hrgnUpdate)
+	    {
+		wndPtr->hrgnUpdate = hrgn;
+		if (!(wndPtr->flags & WIN_INTERNAL_PAINT))
+		    MSG_IncPaintCount( wndPtr->hmemTaskQ );
+	    }
+	    else
+	    {
+		tmpRgn = CreateRectRgn( 0, 0, 0, 0 );
+		CombineRgn( tmpRgn, wndPtr->hrgnUpdate, hrgn, RGN_OR );
+		DeleteObject( wndPtr->hrgnUpdate );
+		DeleteObject( hrgn );
+		wndPtr->hrgnUpdate = tmpRgn;
+	    }
+	}
+	flags |= RDW_FRAME;  /* Force invalidating the frame of children */
+    }
+    else if (flags & RDW_VALIDATE)  /* Validate */
+    {
+	if (flags & RDW_NOERASE) wndPtr->flags &= ~WIN_ERASE_UPDATERGN;
+	if (!(hrgn = CreateRectRgn( 0, 0, 0, 0 ))) return FALSE;
+
+	  /* Remove frame from update region */
+
+	if (wndPtr->hrgnUpdate && (flags & RDW_NOFRAME))
+	{
+	    if (!(tmpRgn = CreateRectRgnIndirect( &rectClient )))
+		return FALSE;
+	    if (CombineRgn(hrgn,tmpRgn,wndPtr->hrgnUpdate,RGN_AND) == NULLREGION)
+	    {
+		DeleteObject( hrgn );
+		hrgn = 0;
+	    }
+	    DeleteObject( tmpRgn );
+	    DeleteObject( wndPtr->hrgnUpdate );
+	    wndPtr->hrgnUpdate = hrgn;
+	    hrgn = CreateRectRgn( 0, 0, 0, 0 );
+	}
+
+	  /* Set update region */
+
+	if (wndPtr->hrgnUpdate)
+	{
+	    int res;
+	    if (hrgnUpdate)  /* Validate a region */
+	    {
+		res = CombineRgn(hrgn,wndPtr->hrgnUpdate,hrgnUpdate,RGN_DIFF);
+	    }
+	    else  /* Validate a rectangle */
+	    {
+		if (rectUpdate) tmpRgn = CreateRectRgnIndirect( rectUpdate );
+		else tmpRgn = CreateRectRgnIndirect( &rectWindow );
+		res = CombineRgn( hrgn, wndPtr->hrgnUpdate, tmpRgn, RGN_DIFF );
+		DeleteObject( tmpRgn );
+	    }
+	    DeleteObject( wndPtr->hrgnUpdate );
+	    if (res == NULLREGION)
+	    {
+		DeleteObject( hrgn );
+		wndPtr->hrgnUpdate = 0;
+		if (!(wndPtr->flags & WIN_INTERNAL_PAINT))
+		    MSG_DecPaintCount( wndPtr->hmemTaskQ );
+	    }
+	    else wndPtr->hrgnUpdate = hrgn;
+	}
+    }
+
+      /* Set/clear internal paint flag */
+
+    if (flags & RDW_INTERNALPAINT)
+    {
+	if (!wndPtr->hrgnUpdate && !(wndPtr->flags & WIN_INTERNAL_PAINT))
+	    MSG_IncPaintCount( wndPtr->hmemTaskQ );
+	wndPtr->flags |= WIN_INTERNAL_PAINT;	    
+    }
+    else if (flags & RDW_NOINTERNALPAINT)
+    {
+	if (!wndPtr->hrgnUpdate && (wndPtr->flags & WIN_INTERNAL_PAINT))
+	    MSG_DecPaintCount( wndPtr->hmemTaskQ );
+	wndPtr->flags &= ~WIN_INTERNAL_PAINT;
+    }
+
+      /* Erase/update window */
+
+    if (flags & RDW_UPDATENOW) UpdateWindow( hwnd );
+    else if (flags & RDW_ERASENOW)
+    {
+	HDC hdc = GetDCEx( hwnd, wndPtr->hrgnUpdate,
+			   DCX_INTERSECTRGN | DCX_USESTYLE );
+	if (hdc)
+	{
+	    SendMessage( hwnd, WM_NCPAINT, wndPtr->hrgnUpdate, 0 );
+	    SendMessage( hwnd, WM_ERASEBKGND, hdc, 0 );
+	    ReleaseDC( hwnd, hdc );
+	}
+    }
+
+      /* Recursively process children */
+
+    if (!(flags & RDW_NOCHILDREN) &&
+	((flags && RDW_ALLCHILDREN) || (wndPtr->dwStyle & WS_CLIPCHILDREN)))
+    {
+	if (hrgnUpdate)
+	{
+	    HRGN hrgn = CreateRectRgn( 0, 0, 0, 0 );
+	    if (!hrgn) return TRUE;
+	    for (hwnd = wndPtr->hwndChild; (hwnd); hwnd = wndPtr->hwndNext)
+	    {
+		if (!(wndPtr = WIN_FindWndPtr( hwnd ))) break;
+		CombineRgn( hrgn, hrgnUpdate, 0, RGN_COPY );
+		OffsetRgn( hrgn, -wndPtr->rectClient.left,
+			         -wndPtr->rectClient.top );
+		RedrawWindow( hwnd, NULL, hrgn, flags );
+	    }
+	    DeleteObject( hrgn );
+	}
+	else
+	{
+	    RECT rect;		
+	    for (hwnd = wndPtr->hwndChild; (hwnd); hwnd = wndPtr->hwndNext)
+	    {
+		if (!(wndPtr = WIN_FindWndPtr( hwnd ))) break;
+		if (rectUpdate)
+		{
+		    rect = *rectUpdate;
+		    OffsetRect( &rect, -wndPtr->rectClient.left,
+			               -wndPtr->rectClient.top );
+		    RedrawWindow( hwnd, &rect, 0, flags );
+		}
+		else RedrawWindow( hwnd, NULL, 0, flags );
+	    }
+	}
+    }
+    return TRUE;
+}
+
+
+/***********************************************************************
+ *           UpdateWindow   (USER.124)
+ */
+void UpdateWindow( HWND hwnd )
+{
+    if (GetUpdateRect( hwnd, NULL, FALSE )) 
+    {
+	if (IsWindowVisible( hwnd )) SendMessage( hwnd, WM_PAINT, 0, 0 );
+    }
+}
+
+
+/***********************************************************************
+ *           InvalidateRgn   (USER.126)
+ */
+void InvalidateRgn( HWND hwnd, HRGN hrgn, BOOL erase )
+{
+    RedrawWindow( hwnd, NULL, hrgn, RDW_INVALIDATE | (erase ? RDW_ERASE : 0) );
+}
+
+
+/***********************************************************************
+ *           InvalidateRect   (USER.125)
+ */
+void InvalidateRect( HWND hwnd, LPRECT rect, BOOL erase )
+{
+    RedrawWindow( hwnd, rect, 0, RDW_INVALIDATE | (erase ? RDW_ERASE : 0) );
+}
+
+
+/***********************************************************************
+ *           ValidateRgn   (USER.128)
+ */
+void ValidateRgn( HWND hwnd, HRGN hrgn )
+{
+    RedrawWindow( hwnd, NULL, hrgn, RDW_VALIDATE | RDW_NOCHILDREN );
+}
+
+
+/***********************************************************************
+ *           ValidateRect   (USER.127)
+ */
+void ValidateRect( HWND hwnd, LPRECT rect )
+{
+    RedrawWindow( hwnd, rect, 0, RDW_VALIDATE | RDW_NOCHILDREN );
+}
+
+
+/***********************************************************************
+ *           GetUpdateRect   (USER.190)
+ */
+BOOL GetUpdateRect( HWND hwnd, LPRECT rect, BOOL erase )
+{
+    WND * wndPtr = WIN_FindWndPtr( hwnd );
+    if (!wndPtr) return FALSE;
+
+    if (rect)
+    {
+	if (wndPtr->hrgnUpdate)
+	{
+	    HRGN hrgn = CreateRectRgn( 0, 0, 0, 0 );
+	    if (GetUpdateRgn( hwnd, hrgn, erase ) == ERROR) return FALSE;
+	    GetRgnBox( hrgn, rect );
+	    DeleteObject( hrgn );
+	}
+	else SetRectEmpty( rect );
+    }
+    return (wndPtr->hrgnUpdate != 0);
+}
+
+
+/***********************************************************************
+ *           GetUpdateRgn   (USER.237)
+ */
+int GetUpdateRgn( HWND hwnd, HRGN hrgn, BOOL erase )
+{
+    HRGN hrgnClip;
+    int retval;
+    WND * wndPtr = WIN_FindWndPtr( hwnd );
+    if (!wndPtr) return ERROR;
+
+    if (!wndPtr->hrgnUpdate)
+    {
+	if (!(hrgnClip = CreateRectRgn( 0, 0, 0, 0 ))) return ERROR;
+	retval = CombineRgn( hrgn, hrgnClip, 0, RGN_COPY );
+    }
+    else
+    {
+	hrgnClip = CreateRectRgn( 0, 0,
+			   wndPtr->rectClient.right-wndPtr->rectClient.left,
+			   wndPtr->rectClient.bottom-wndPtr->rectClient.top );
+	if (!hrgnClip) return ERROR;
+	retval = CombineRgn( hrgn, wndPtr->hrgnUpdate, hrgnClip, RGN_AND );
+	if (erase)
+	{
+	    HDC hdc = GetDCEx( hwnd, wndPtr->hrgnUpdate,
+			      DCX_INTERSECTRGN | DCX_USESTYLE );
+	    if (hdc)
+	    {
+		SendMessage( hwnd, WM_ERASEBKGND, hdc, 0 );
+		ReleaseDC( hwnd, hdc );
+	    }
+	}	
+    }
+    DeleteObject( hrgnClip );
+    return retval;
+}
+
+
+/***********************************************************************
+ *           ExcludeUpdateRgn   (USER.238)
+ */
+int ExcludeUpdateRgn( HDC hdc, HWND hwnd )
+{
+    int retval;
+    HRGN hrgn;
+    WND * wndPtr;
+
+    if (!(wndPtr = WIN_FindWndPtr( hwnd ))) return ERROR;
+    if ((hrgn = CreateRectRgn( 0, 0, 0, 0 )) != 0)
+    {
+	retval = CombineRgn( hrgn, InquireVisRgn(hdc),
+			     wndPtr->hrgnUpdate, RGN_DIFF );
+	if (retval) SelectVisRgn( hdc, hrgn );
+	DeleteObject( hrgn );
+    }
+    return retval;
+}
diff --git a/windows/scroll.c b/windows/scroll.c
index 34d43fd..29dbe7c 100644
--- a/windows/scroll.c
+++ b/windows/scroll.c
@@ -160,10 +160,8 @@
 
     if (flags | SW_INVALIDATE)
     {
-	InvalidateRgn(hwnd, hrgnUpdate, FALSE);
-
-	if (flags | SW_ERASE)
-	    SendMessage(hwnd, WM_ERASEBKGND, (WORD)hdc, (LONG)NULL);
+	RedrawWindow(hwnd, NULL, hrgnUpdate,
+		     RDW_INVALIDATE | ((flags & SW_ERASE) ? RDW_ERASENOW : 0));
     }
 
     ReleaseDC(hwnd, hdc);
diff --git a/windows/utility.c b/windows/utility.c
index ab189a0..00e1683 100644
--- a/windows/utility.c
+++ b/windows/utility.c
@@ -11,6 +11,7 @@
 #include <stdio.h>
 #include <stdarg.h>
 #include <ctype.h>
+#include <stdlib.h>
 #include "windows.h"
 
 static char Copyright[] = "Copyright Andrew C. Bulhak, 1993";
@@ -45,6 +46,16 @@
 	*dest = '\0';	/* Add null terminator */
 };
 
+/**********************************************************************
+ *					DebugPrintString
+ */
+int
+DebugPrintString(char *str)
+{
+    printf("%s", str);
+    return 0;
+}
+
 /*
  *	OutputDebugString strips CRs from its (string) parameter and
  *	calls DebugPrintString(), which was written by someone else. 
diff --git a/windows/win.c b/windows/win.c
index 5cef378..45157f9 100644
--- a/windows/win.c
+++ b/windows/win.c
@@ -6,10 +6,7 @@
 
 static char Copyright[] = "Copyright  Alexandre Julliard, 1993";
 
-#include <X11/Intrinsic.h>
-#include <X11/StringDefs.h>
-#include <X11/Core.h>
-#include <X11/Shell.h>
+#include <string.h>
 
 #include "class.h"
 #include "win.h"
@@ -18,13 +15,13 @@
 #include "sysmetrics.h"
 #include "scroll.h"
 
-extern Display * display;
 extern Colormap COLOR_WinColormap;
 
 extern void EVENT_RegisterWindow( Window w, HWND hwnd );  /* event.c */
+extern void CURSOR_SetWinCursor( HWND hwnd, HCURSOR hcursor );  /* cursor.c */
 extern HMENU CopySysMenu(); /* menu.c */
 
-HWND firstWindow = 0;
+static HWND hwndDesktop = 0;
 
 /***********************************************************************
  *           WIN_FindWndPtr
@@ -50,15 +47,12 @@
 BOOL WIN_UnlinkWindow( HWND hwnd )
 {    
     HWND * curWndPtr;
-    WND * wndPtr = WIN_FindWndPtr( hwnd );
+    WND *parentPtr, *wndPtr;
 
-    if (!wndPtr) return FALSE;
-    if (wndPtr->hwndParent)
-    {
-	WND * parentPtr = WIN_FindWndPtr( wndPtr->hwndParent );
-	curWndPtr = &parentPtr->hwndChild;
-    }    
-    else curWndPtr = &firstWindow;
+    if (!(wndPtr = WIN_FindWndPtr( hwnd ))) return FALSE;
+    if (!(parentPtr = WIN_FindWndPtr( wndPtr->hwndParent ))) return FALSE;
+
+    curWndPtr = &parentPtr->hwndChild;
 
     while (*curWndPtr != hwnd)
     {
@@ -80,19 +74,14 @@
 BOOL WIN_LinkWindow( HWND hwnd, HWND hwndInsertAfter )
 {    
     HWND * hwndPtr = NULL;  /* pointer to hwnd to change */
+    WND *wndPtr, *parentPtr;
 
-    WND * wndPtr = WIN_FindWndPtr( hwnd );
-    if (!wndPtr) return FALSE;
-    
+    if (!(wndPtr = WIN_FindWndPtr( hwnd ))) return FALSE;
+    if (!(parentPtr = WIN_FindWndPtr( wndPtr->hwndParent ))) return FALSE;
+
     if ((hwndInsertAfter == HWND_TOP) || (hwndInsertAfter == HWND_BOTTOM))
     {
-	  /* Make hwndPtr point to the first sibling hwnd */
-	if (wndPtr->hwndParent)
-	{
-	    WND * parentPtr = WIN_FindWndPtr( wndPtr->hwndParent );
-	    if (parentPtr) hwndPtr = &parentPtr->hwndChild;
-	}
-	else hwndPtr = &firstWindow;
+	hwndPtr = &parentPtr->hwndChild;  /* Point to first sibling hwnd */
 	if (hwndInsertAfter == HWND_BOTTOM)  /* Find last sibling hwnd */
 	    while (*hwndPtr)
 	    {
@@ -121,11 +110,12 @@
 {
     WND * wndPtr;
     
-    if (!hwnd) hwnd = firstWindow;
+    if (!hwnd) hwnd = GetTopWindow( hwndDesktop );
     for ( ; hwnd != 0; hwnd = wndPtr->hwndNext )
     {
 	if (!(wndPtr = WIN_FindWndPtr( hwnd ))) return 0;
-	if (wndPtr->hrgnUpdate) return hwnd;
+	if (wndPtr->hrgnUpdate || (wndPtr->flags & WIN_INTERNAL_PAINT))
+	    return hwnd;
 	if (wndPtr->hwndChild)
 	{
 	    HWND child;
@@ -145,7 +135,7 @@
  */
 static void WIN_SendParentNotify( HWND hwnd, WND * wndPtr, WORD event )
 {
-    HWND current = wndPtr->hwndParent;
+    HWND current = GetParent( hwnd );
 
     if (wndPtr->dwExStyle & WS_EX_NOPARENTNOTIFY) return;
     while (current)
@@ -158,6 +148,61 @@
 
 
 /***********************************************************************
+ *           WIN_CreateDesktopWindow
+ *
+ * Create the desktop window.
+ */
+static HWND WIN_CreateDesktopWindow()
+{
+    HWND hwnd;
+    WND *wndPtr;
+    HCLASS hclass;
+    CLASS *classPtr;
+
+    if (!(hclass = CLASS_FindClassByName( DESKTOP_CLASS_NAME, &classPtr )))
+	return 0;
+
+    hwnd = USER_HEAP_ALLOC(GMEM_MOVEABLE, sizeof(WND)+classPtr->wc.cbWndExtra);
+    if (!hwnd) return 0;
+    wndPtr = (WND *) USER_HEAP_ADDR( hwnd );
+
+    wndPtr->hwndNext          = 0;
+    wndPtr->hwndChild         = 0;
+    wndPtr->dwMagic           = WND_MAGIC;
+    wndPtr->hwndParent        = 0;
+    wndPtr->hwndOwner         = 0;
+    wndPtr->hClass            = hclass;
+    wndPtr->hInstance         = 0;
+    wndPtr->rectWindow.left   = 0;
+    wndPtr->rectWindow.top    = 0;
+    wndPtr->rectWindow.right  = SYSMETRICS_CXSCREEN;
+    wndPtr->rectWindow.bottom = SYSMETRICS_CYSCREEN;
+    wndPtr->rectClient        = wndPtr->rectWindow;
+    wndPtr->rectNormal        = wndPtr->rectWindow;
+    wndPtr->ptIconPos.x       = -1;
+    wndPtr->ptIconPos.y       = -1;
+    wndPtr->ptMaxPos.x        = -1;
+    wndPtr->ptMaxPos.y        = -1;
+    wndPtr->hmemTaskQ         = 0;  /* Desktop does not belong to a task */
+    wndPtr->hrgnUpdate        = 0;
+    wndPtr->hwndLastActive    = 0;
+    wndPtr->lpfnWndProc       = classPtr->wc.lpfnWndProc;
+    wndPtr->dwStyle           = WS_VISIBLE | WS_CLIPCHILDREN;
+    wndPtr->dwExStyle         = 0;
+    wndPtr->hdce              = 0;
+    wndPtr->hmenuSystem       = 0;
+    wndPtr->VScroll           = NULL;
+    wndPtr->HScroll           = NULL;
+    wndPtr->wIDmenu           = 0;
+    wndPtr->hText             = 0;
+    wndPtr->flags             = 0;
+    wndPtr->window            = DefaultRootWindow( display );
+    wndPtr->hSysMenu          = 0;
+    return hwnd;
+}
+
+
+/***********************************************************************
  *           CreateWindow   (USER.41)
  */
 HWND CreateWindow( LPSTR className, LPSTR windowName,
@@ -185,13 +230,16 @@
     XSetWindowAttributes win_attr;
     Window parentWindow;
     int x_rel, y_rel;
-    LPPOPUPMENU lpbar;
 
 #ifdef DEBUG_WIN
     printf( "CreateWindowEx: %d '%s' '%s' %d,%d %dx%d %08x %x\n",
 	   exStyle, className, windowName, x, y, width, height, style, parent);
 #endif
 
+      /* Before anything, create the desktop window */
+    if (!hwndDesktop)
+	if (!(hwndDesktop = WIN_CreateDesktopWindow())) return 0;
+
     if (x == CW_USEDEFAULT) x = y = 0;
     if (width == CW_USEDEFAULT)
     {
@@ -203,11 +251,10 @@
 
       /* Find the parent and class */
 
-    if (parent) 
+    if (parent)
     {
 	  /* Check if parent is valid */
-	parentPtr = WIN_FindWndPtr( parent );
-	if (!parent) return 0;
+	if (!(parentPtr = WIN_FindWndPtr( parent ))) return 0;
     }
     else if (style & WS_CHILD) return 0;  /* WS_CHILD needs a parent */
     
@@ -233,7 +280,7 @@
     wndPtr->hwndNext   = 0;
     wndPtr->hwndChild  = 0;
     wndPtr->dwMagic    = WND_MAGIC;
-    wndPtr->hwndParent = (style & WS_CHILD) ? parent : 0;
+    wndPtr->hwndParent = (style & WS_CHILD) ? parent : hwndDesktop;
     wndPtr->hwndOwner  = (style & WS_CHILD) ? 0 : parent;
     wndPtr->hClass     = class;
     wndPtr->hInstance  = instance;
@@ -254,14 +301,23 @@
     wndPtr->dwStyle           = style;
     wndPtr->dwExStyle         = exStyle;
     wndPtr->hmenuSystem       = 0;
-    wndPtr->wIDmenu           = menu;
+#ifdef DEBUG_MENU
+    printf("CreateWindowEx // menu=%04X instance=%04X classmenu=%08X !\n", 
+    	menu, instance, classPtr->wc.lpszMenuName); 
+#endif
+    if (menu != 0)
+	wndPtr->wIDmenu       = menu;
+    else {
+	if (classPtr->wc.lpszMenuName != NULL)
+	    wndPtr->wIDmenu   = LoadMenu(instance, classPtr->wc.lpszMenuName);
+	else
+	    wndPtr->wIDmenu   = 0;
+	}
     wndPtr->hText             = 0;
     wndPtr->flags             = 0;
-    wndPtr->hCursor           = 0;
     wndPtr->VScroll           = NULL;
     wndPtr->HScroll           = NULL;
     wndPtr->hSysMenu          = 0;
-    wndPtr->hWndMenuBar       = 0;
 
     if (classPtr->wc.cbWndExtra)
 	memset( wndPtr->wExtra, 0, classPtr->wc.cbWndExtra );
@@ -362,25 +418,13 @@
 	return 0;
     }
 
-      /* Create scrollbars */
+      /* Create a copy of SysMenu */
+    if (style & WS_SYSMENU) wndPtr->hSysMenu = CopySysMenu();
 
-    if ((style & WS_SYSMENU) == WS_SYSMENU) {
-	wndPtr->hSysMenu = CopySysMenu();
-	}
-    if (((style & WS_CHILD) != WS_CHILD) && (wndPtr->wIDmenu != 0)) {
-	lpbar = (LPPOPUPMENU) GlobalLock(wndPtr->wIDmenu);
-	if (lpbar != NULL) {
-	    lpbar->ownerWnd = hwnd;
-	    wndPtr->hWndMenuBar = CreateWindow("POPUPMENU", "",
-		WS_CHILD | WS_CLIPSIBLINGS | WS_VISIBLE,
-		0, 0, width, 20, hwnd, 2, instance, (LPSTR)lpbar);
-	    }
-	}
-      /* Create scrollbars */
-    if ((style & WS_VSCROLL) == WS_VSCROLL ||
-	(style & WS_HSCROLL) == WS_HSCROLL) {
-    	NC_CreateScrollBars(hwnd);
-	}
+      /* Set window cursor */
+    if (classPtr->wc.hCursor) CURSOR_SetWinCursor( hwnd, classPtr->wc.hCursor);
+    else CURSOR_SetWinCursor( hwnd, LoadCursor( 0, IDC_ARROW ));
+
     EVENT_RegisterWindow( wndPtr->window, hwnd );
 
     WIN_SendParentNotify( hwnd, wndPtr, WM_CREATE );
@@ -403,17 +447,12 @@
     if (!(classPtr = CLASS_FindClassPtr( wndPtr->hClass ))) return FALSE;
     WIN_SendParentNotify( hwnd, wndPtr, WM_DESTROY );
 
-      /* Send destroy messages */
+      /* Send destroy messages and destroy children */
 
     SendMessage( hwnd, WM_DESTROY, 0, 0 );
-    SendMessage( hwnd, WM_NCDESTROY, 0, 0 );
-    
-      /* Destroy all children */
-
-    if (wndPtr->VScroll) free(wndPtr->VScroll);
-    if (wndPtr->HScroll) free(wndPtr->HScroll);
     while (wndPtr->hwndChild)  /* The child removes itself from the list */
 	DestroyWindow( wndPtr->hwndChild );
+    SendMessage( hwnd, WM_NCDESTROY, 0, 0 );
 
       /* Remove the window from the linked list */
 
@@ -466,24 +505,12 @@
 }
  
  
-/***********************************************************************
- *           UpdateWindow   (USER.124)
- */
-void UpdateWindow( HWND hwnd )
-{
-    if (GetUpdateRect( hwnd, NULL, FALSE )) 
-    {
-	if (IsWindowVisible( hwnd )) SendMessage( hwnd, WM_PAINT, 0, 0 );
-    }
-}
-
-
 /**********************************************************************
  *           GetDesktopWindow        (USER.286)
  */
 HWND GetDesktopWindow()
 {
-    return 0;
+    return hwndDesktop;
 }
 
 
@@ -690,7 +717,7 @@
 HWND GetParent(HWND hwnd)
 {
     WND *wndPtr = WIN_FindWndPtr(hwnd);
-    if (!wndPtr) return 0;
+    if (!wndPtr || !(wndPtr->dwStyle & WS_CHILD)) return 0;
     return wndPtr->hwndParent;
 }
 
@@ -700,20 +727,12 @@
  */
 BOOL IsChild( HWND parent, HWND child )
 {
-    HWND curChild;
-    WND * parentPtr;
-    WND * childPtr;
-
-    if (!(parentPtr = WIN_FindWndPtr( parent ))) return FALSE;
-    curChild = parentPtr->hwndChild;
-
-    while (curChild)
+    WND * wndPtr = WIN_FindWndPtr( child );
+    while (wndPtr && (wndPtr->dwStyle & WS_CHILD))
     {
-	if (curChild == child) return TRUE;
-	if (IsChild( curChild, child )) return TRUE;
-	if (!(childPtr = WIN_FindWndPtr( curChild ))) return FALSE;
-	curChild = childPtr->hwndNext;
-    }    
+	if (wndPtr->hwndParent == parent) return TRUE;
+        wndPtr = WIN_FindWndPtr( wndPtr->hwndParent );
+    }
     return FALSE;
 }
 
@@ -756,9 +775,10 @@
 	    WND * parentPtr = WIN_FindWndPtr( wndPtr->hwndParent );
 	    return parentPtr->hwndChild;
 	}
-	else return firstWindow;
+	else return 0;
 	
     case GW_HWNDLAST:
+	if (!wndPtr->hwndParent) return 0;  /* Desktop window */
 	while (wndPtr->hwndNext)
 	{
 	    hwnd = wndPtr->hwndNext;
@@ -778,7 +798,7 @@
 		WND * parentPtr = WIN_FindWndPtr( wndPtr->hwndParent );
 		hwndPrev = parentPtr->hwndChild;
 	    }
-	    else hwndPrev = firstWindow;
+	    else return 0;  /* Desktop window */
 	    if (hwndPrev == hwnd) return 0;
 	    while (hwndPrev)
 	    {
@@ -825,25 +845,16 @@
  *
  *  o if wndenumprc returns 0 exit
  * 
- *  * remove the HAS_DESKTOP_WINDOW ifdef when the GetDesktopWindow() call
- *    is fixed to actually return the desktop window
- * 
  */
 BOOL EnumWindows(FARPROC wndenumprc, LPARAM lParam)
 {
-    HWND hwnd = GetDesktopWindow(); 
+    HWND hwnd = GetTopWindow( GetDesktopWindow() );
     WND *wndPtr;
     int result;
 
 #ifdef DEBUG_ENUM
     printf("EnumWindows\n");
 #endif 
-#ifdef HAS_DESKTOP_WINDOW 
-    if (!(wndPtr = WIN_FindWndPtr(hwnd))) return 0;
-    hwnd = wndPtr->hwndChild;
-#else
-    hwnd = firstWindow;
-#endif
 
     while (hwnd) {
       char *ptr;
@@ -856,8 +867,12 @@
               printf("found a window (%s)\n", ptr);
       else 
               printf("found nameless parent window\n");
-#endif 
+#endif
+#ifdef WINELIB
+      (*wndenumprc)(hwnd, lParam);
+#else
       result = CallBack16(wndenumprc, 2, lParam, (int) hwnd);
+#endif
       if ( ! result )  {
               return 0;
       }
@@ -899,7 +914,11 @@
            return 0;
       }
 #endif
+#ifdef WINELIB
+        if (!(*wndenumprc, 2, lParam, (int) hwnd)) {
+#else
         if (!CallBack16(wndenumprc, 2, lParam, (int) hwnd)) {
+#endif
                 return 0;
       }
       if (!WIN_EnumChildWin(wndPtr->hwndChild, wndenumprc, lParam)) {
diff --git a/windows/winpos.c b/windows/winpos.c
index 49d091f..ee37ecb 100644
--- a/windows/winpos.c
+++ b/windows/winpos.c
@@ -24,7 +24,7 @@
     if (!wndPtr) return;
     
     *rect = wndPtr->rectWindow;
-    if (wndPtr->hwndParent)
+    if (wndPtr->dwStyle & WS_CHILD)
 	MapWindowPoints( wndPtr->hwndParent, 0, (POINT *)rect, 2 );
 }
 
@@ -69,7 +69,7 @@
 HWND WindowFromPoint( POINT pt )
 {
     RECT rect;
-    HWND hwnd = firstWindow;
+    HWND hwnd = GetTopWindow( GetDesktopWindow() );
     while (hwnd)
     {
 	GetWindowRect( hwnd, &rect );
@@ -117,7 +117,7 @@
 	wndPtr = WIN_FindWndPtr( hwndFrom );
 	origin.x += wndPtr->rectClient.left;
 	origin.y += wndPtr->rectClient.top;
-	hwndFrom = wndPtr->hwndParent;
+	hwndFrom = (wndPtr->dwStyle & WS_CHILD) ? wndPtr->hwndParent : 0;
     }
 
       /* Translate origin to destination window coords */
@@ -126,7 +126,7 @@
 	wndPtr = WIN_FindWndPtr( hwndTo );
 	origin.x -= wndPtr->rectClient.left;
 	origin.y -= wndPtr->rectClient.top;
-	hwndTo = wndPtr->hwndParent;
+	hwndTo = (wndPtr->dwStyle & WS_CHILD) ? wndPtr->hwndParent : 0;
     }    
 
       /* Translate points */
@@ -375,6 +375,13 @@
     }
     else pMinMax = &MinMax;
 
+      /* Some sanity checks */
+
+    pMinMax->ptMaxTrackSize.x = max( pMinMax->ptMaxTrackSize.x,
+				     pMinMax->ptMinTrackSize.x );
+    pMinMax->ptMaxTrackSize.y = max( pMinMax->ptMaxTrackSize.y,
+				     pMinMax->ptMinTrackSize.y );
+    
     if (maxSize) *maxSize = pMinMax->ptMaxSize;
     if (maxPos) *maxPos = pMinMax->ptMaxPosition;
     if (minTrack) *minTrack = pMinMax->ptMinTrackSize;
@@ -486,7 +493,7 @@
 
 	  /* Make sure hwndInsertAfter is a sibling of hwnd */
 	if ((hwndInsertAfter != HWND_TOP) && (hwndInsertAfter != HWND_BOTTOM))
-	    if (wndPtr->hwndParent != GetParent(hwndInsertAfter)) goto Abort;
+	    if (GetParent(hwnd) != GetParent(hwndInsertAfter)) goto Abort;
 
 	WIN_UnlinkWindow( hwnd );
 	WIN_LinkWindow( hwnd, hwndInsertAfter );
@@ -531,7 +538,7 @@
 	WND * parentPtr;
 	winChanges.x = newWindowRect.left;
 	winChanges.y = newWindowRect.top;
-	if (wndPtr->hwndParent)
+	if (wndPtr->dwStyle & WS_CHILD)
 	{
 	    parentPtr = WIN_FindWndPtr(wndPtr->hwndParent);
 	    winChanges.x += parentPtr->rectClient.left-parentPtr->rectWindow.left;
