Release 960717

Wed Jul 17 16:10:16 1996  Alexandre Julliard  <julliard@lrc.epfl.ch>

	* [configure.in]
	Generate include/config.h instead of putting everything on the
	command-line.
	Removed -with-malloc-debug option (not useful for end users
	anyway).
	Added check for memmove().

	* [include/wintypes.h] [*/Makefile.in]
	Added definition of __WINE__ symbol when compiling Wine code
	(emulator or library) as opposed to user programs.

	* [debugger/editline.c] [debugger/readline/*]
	Moved all the readline code into debugger/editline.c. Removed the
	readline subdirectory.

	* [files/profile.c]
	Added PROFILE_GetWineIniInt().

	* [include/stackframe.h] [loader/task.c]
	The 16-bit stackframe now also exists for Winelib (even though it
	only ever contains one frame).

	* [loader/module.c]
	Added function MODULE_CreateDummyModule() to create a dummy Win16
	module for Winelib and Win32.

	* [memory/ldt.c]
	Make sure the ldt entry contents will be acceptable for the Linux
	kernel.

	* [memory/selector.c]
	Fixed SetSelectorLimit() when the limit is in pages.

	* [misc/port.c]
	Added memmove().

	* [miscemu/dpmi.c]
	Clear the segment registers that contain the selector being freed
	in int31/ax=0001.
	Added missing break after SelectorAccessRights call.

	* [win32/struct32.c]
	Added conversions for MDICREATESTRUCT.

	* [windows/winproc.c]
	Added message conversions for WM_MDICREATE.

Tue Jul 16 19:46:24 1996  Pavel Kankovsky <KAN@frode.dcit.cz>

	* [windows/class.c]
	Added GetExePtr() call in CLASS_FindClassByAtom().

Mon Jul 15 17:49:38 1996  Marcus Meissner <msmeissn@cip.informatik.uni-erlangen.de>

	* [if1632/*.spec]
	Some more trivial specs added.

	* [if1632/gdi32.spec] [objects/font.c][windows/dialog.c]
	CreateFont32* added, changed to new naming std.

	* [include/windows.h] [include/mmsystem.h] [include/wintypes.h]
	Some defines/types added.

	* [win32/thread.c]
	TlsSetValue() returns boolean.

	* [win32/resource.c] [loader/pe_resource.c] [loader/resource.c]
 	  [controls/menu.c] [objects/bitmap.c]
	Cleanup of the resource functions, mostly changes to new naming
 	standard and fixing of argument types so that they agree with the
 	win16/win32 API.

Thu Jul 11 15:00:00 1996  Alex Korobka <alex@phm30.pharm.sunysb.edu>

	* [windows/winpos.c]
	ShowWindow() fixes.

	* [windows/mdi.c]
	Fix reversed LPARAM in WM_MDIACTIVATE.

	* [wine.ini]
	New option AllocSystemColors tells Wine how many colors to grab
	from the system colormap.

	* [objects/bitblt.c] [objects/dc.c]
	Fixed pink garbage over Word buttons in PseudoColor. Added
	optional DSTINVERT shortcut for faster text selection.

	* [misc/wsprintf.c]
	Skip bogus segmented pointers in wsvnprintf16(). 

	* [objects/gdiobj.c]
	Added palette handling to UnrealizeObject(). 

	* [objects/color.c] [objects/palette.c] [windows/dce.c]
	Wine gets palette manager with support for more than 20 colors. 
	Only PseudoColor and TrueColor visuals tested so far.

	* [windows/winpos.c] [windows/win.c] 
	Set X size hints for WS_EX_DLGMODALFRAME windows (no resize) and
	use XReconfigureWMWindows() instead of XConfigureWindow() in
	managed mode.

	* [memory/global.c]
	Do not allocate more than 640K of DOS memory.

	* [misc/main.c]
	Do not allow -desktop and -managed together.
diff --git a/ANNOUNCE b/ANNOUNCE
index b90a4db..2c43984 100644
--- a/ANNOUNCE
+++ b/ANNOUNCE
@@ -1,13 +1,13 @@
-This is release 960712 of Wine, the MS Windows emulator.  This is still a
+This is release 960717 of Wine, the MS Windows emulator.  This is still a
 developer's only release.  There are many bugs and many unimplemented API
 features.  Most applications still do not work correctly.
 
 Patches should be submitted to "julliard@lrc.epfl.ch".  Please don't
 forget to include a ChangeLog entry.
 
-WHAT'S NEW with Wine-960712: (see ChangeLog for details)
-	- Many built-in debugger improvements.
-	- Some more Win32 functions.
+WHAT'S NEW with Wine-960717: (see ChangeLog for details)
+	- New palette management.
+	- Changes to the configuration process.
 	- Lots of bug fixes.
 
 See the README file in the distribution for installation instructions.
@@ -16,10 +16,10 @@
 the release is available at the ftp sites.  The sources will be available
 from the following locations:
 
-    sunsite.unc.edu:/pub/Linux/ALPHA/wine/development/Wine-960712.tar.gz
-    tsx-11.mit.edu:/pub/linux/ALPHA/Wine/development/Wine-960712.tar.gz
-    ftp.infomagic.com:/pub/mirrors/linux/wine/development/Wine-960712.tar.gz
-    aris.com:/pub/linux/ALPHA/Wine/development/Wine-960712.tar.gz
+    sunsite.unc.edu:/pub/Linux/ALPHA/wine/development/Wine-960717.tar.gz
+    tsx-11.mit.edu:/pub/linux/ALPHA/Wine/development/Wine-960717.tar.gz
+    ftp.infomagic.com:/pub/mirrors/linux/wine/development/Wine-960717.tar.gz
+    aris.com:/pub/linux/ALPHA/Wine/development/Wine-960717.tar.gz
 
 It should also be available from any site that mirrors tsx-11 or sunsite.
 
diff --git a/BUGS b/BUGS
index 19f3c08..1148443 100644
--- a/BUGS
+++ b/BUGS
@@ -1,26 +1,19 @@
-1. 32-bit/16-bit call translation:
-
-- EBP and ESP are sometimes corrupted while running 16-bit code.
-
-2. Messaging:
+1. Messaging:
 
 - Message flow is not correct for multiple tasks
 - Dialog Boxes created by WM_CREATE handler aren't visible
 - MDI does not send WM_GETMINMAX message.
 - resizing of MDI child windows sometimes leaves them unrepainted
 
-3. Controls:
+2. Controls:
 
 - Some features are missing (like VK_SHIFT aided multiple selection in listboxes)
 
-4. Miscellaneous:
+3. Miscellaneous:
 
-- InitializeLoadedDLLs() can't init LZEXPAND.DLL. (cs:ip => 0:0)
-- LoadCursor does not correctly handle bitmap cursors
 - AllocCSToDSAlias() shouldn't alloc alias for the same segment multiple times.
-- Dialogs don't support resources which are referred to as integers.
 
-5. Where to look in source files:
+4. Where to look in source files:
 
 - grep for FIXME in the source files.
 
diff --git a/ChangeLog b/ChangeLog
index 5139957..09c335f 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,4 +1,116 @@
 ----------------------------------------------------------------------
+Wed Jul 17 16:10:16 1996  Alexandre Julliard  <julliard@lrc.epfl.ch>
+
+	* [configure.in]
+	Generate include/config.h instead of putting everything on the
+	command-line.
+	Removed -with-malloc-debug option (not useful for end users
+	anyway).
+	Added check for memmove().
+
+	* [include/wintypes.h] [*/Makefile.in]
+	Added definition of __WINE__ symbol when compiling Wine code
+	(emulator or library) as opposed to user programs.
+
+	* [debugger/editline.c] [debugger/readline/*]
+	Moved all the readline code into debugger/editline.c. Removed the
+	readline subdirectory.
+
+	* [files/profile.c]
+	Added PROFILE_GetWineIniInt().
+
+	* [include/stackframe.h] [loader/task.c]
+	The 16-bit stackframe now also exists for Winelib (even though it
+	only ever contains one frame).
+
+	* [loader/module.c]
+	Added function MODULE_CreateDummyModule() to create a dummy Win16
+	module for Winelib and Win32.
+
+	* [memory/ldt.c]
+	Make sure the ldt entry contents will be acceptable for the Linux
+	kernel.
+
+	* [memory/selector.c]
+	Fixed SetSelectorLimit() when the limit is in pages.
+
+	* [misc/port.c]
+	Added memmove().
+
+	* [miscemu/dpmi.c]
+	Clear the segment registers that contain the selector being freed
+	in int31/ax=0001.
+	Added missing break after SelectorAccessRights call.
+
+	* [win32/struct32.c]
+	Added conversions for MDICREATESTRUCT.
+
+	* [windows/winproc.c]
+	Added message conversions for WM_MDICREATE.
+
+Tue Jul 16 19:46:24 1996  Pavel Kankovsky <KAN@frode.dcit.cz>
+
+	* [windows/class.c]
+	Added GetExePtr() call in CLASS_FindClassByAtom().
+
+Mon Jul 15 17:49:38 1996  Marcus Meissner <msmeissn@cip.informatik.uni-erlangen.de>
+
+	* [if1632/*.spec]
+	Some more trivial specs added.
+
+	* [if1632/gdi32.spec] [objects/font.c][windows/dialog.c]
+	CreateFont32* added, changed to new naming std.
+
+	* [include/windows.h] [include/mmsystem.h] [include/wintypes.h]
+	Some defines/types added.
+
+	* [win32/thread.c]
+	TlsSetValue() returns boolean.
+
+	* [win32/resource.c] [loader/pe_resource.c] [loader/resource.c]
+ 	  [controls/menu.c] [objects/bitmap.c]
+	Cleanup of the resource functions, mostly changes to new naming
+ 	standard and fixing of argument types so that they agree with the
+ 	win16/win32 API.
+
+Thu Jul 11 15:00:00 1996  Alex Korobka <alex@phm30.pharm.sunysb.edu>
+
+	* [windows/winpos.c]
+	ShowWindow() fixes.
+
+	* [windows/mdi.c]
+	Fix reversed LPARAM in WM_MDIACTIVATE.
+
+	* [wine.ini]
+	New option AllocSystemColors tells Wine how many colors to grab
+	from the system colormap.
+
+	* [objects/bitblt.c] [objects/dc.c]
+	Fixed pink garbage over Word buttons in PseudoColor. Added
+	optional DSTINVERT shortcut for faster text selection.
+
+	* [misc/wsprintf.c]
+	Skip bogus segmented pointers in wsvnprintf16(). 
+
+	* [objects/gdiobj.c]
+	Added palette handling to UnrealizeObject(). 
+
+	* [objects/color.c] [objects/palette.c] [windows/dce.c]
+	Wine gets palette manager with support for more than 20 colors. 
+	Only PseudoColor and TrueColor visuals tested so far.
+
+	* [windows/winpos.c] [windows/win.c] 
+	Set X size hints for WS_EX_DLGMODALFRAME windows (no resize) and
+	use XReconfigureWMWindows() instead of XConfigureWindow() in
+	managed mode.
+
+	* [memory/global.c]
+	Do not allocate more than 640K of DOS memory.
+
+	* [misc/main.c]
+	Do not allow -desktop and -managed together.
+
+----------------------------------------------------------------------
 Fri Jul 12 17:43:05 1996  Alexandre Julliard  <julliard@lrc.epfl.ch>
 
 	* [controls/scroll.c]
diff --git a/Make.rules.in b/Make.rules.in
index bb56d51..d659872 100644
--- a/Make.rules.in
+++ b/Make.rules.in
@@ -6,8 +6,8 @@
 SHELL     = /bin/sh
 CC        = @CC@
 CPP       = @CPP@
-CFLAGS 	  = @CFLAGS@
-DEFS      = @DEFS@
+CFLAGS    = @CFLAGS@
+OPTIONS   = @OPTIONS@
 X_CFLAGS  = @X_CFLAGS@
 X_LIBS    = @X_LIBS@
 XPM_LIB	  = -lXpm
@@ -17,13 +17,13 @@
 LEX       = @LEX@
 LEXLIB    = @LEXLIB@
 DIVINCL   = -I$(TOPSRC)/include
-ALLCFLAGS = $(CFLAGS) $(DEFS) $(DIVINCL) $(X_CFLAGS) $(EXTRA_DEFS)
+ALLCFLAGS = $(CFLAGS) $(DEFS) $(OPTIONS) $(DIVINCL) $(X_CFLAGS)
 LDCOMBINE = ld -r
 RM        = rm -f
 BUILD     = $(TOPSRC)/tools/build
 WINERC    = $(TOPSRC)/rc/winerc
 WINELIB   = $(TOPSRC)/libwine.a
-SUBMAKE   = $(MAKE) 'CC=$(CC)' 'CFLAGS=$(CFLAGS)' 'DEFS=$(DEFS)'
+SUBMAKE   = $(MAKE) 'CC=$(CC)' 'CFLAGS=$(CFLAGS)' 'OPTIONS=$(OPTIONS)'
 @SET_MAKE@
 
 OBJS = $(C_SRCS:.c=.o) $(ASM_SRCS:.S=.o) $(EXTRA_OBJS)
@@ -43,14 +43,14 @@
 	echo "#include \"windows.h\"" >winerctmp.c
 	echo WINDOWS_H_ENDS_HERE >>winerctmp.c
 	cat $< >>winerctmp.c
-	$(CPP) $(DEFS) $(DIVINCL) -DRC_INVOKED -P winerctmp.c | sed -e '1,/^WINDOWS_H_ENDS_HERE/d' | $(WINERC) -c -o $* -p $*
+	$(CPP) $(OPTIONS) $(DIVINCL) -DRC_INVOKED -P winerctmp.c | sed -e '1,/^WINDOWS_H_ENDS_HERE/d' | $(WINERC) -c -o $* -p $*
 	$(RM) winerctmp.c
 
 .rc.h:
 	echo "#include \"windows.h\"" >winerctmp.c
 	echo WINDOWS_H_ENDS_HERE >>winerctmp.c
 	cat $< >>winerctmp.c
-	$(CPP) $(DEFS) $(DIVINCL) -P winerctmp.c | sed -e '1,/^WINDOWS_H_ENDS_HERE/d' | $(WINERC) -c -o $* -p $*
+	$(CPP) $(OPTIONS) $(DIVINCL) -DRC_INVOKED -P winerctmp.c | sed -e '1,/^WINDOWS_H_ENDS_HERE/d' | $(WINERC) -c -o $* -p $*
 	$(RM) winerctmp.c
 
 
diff --git a/Makefile.in b/Makefile.in
index f8f6205..89031f3 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -13,20 +13,17 @@
 
 SHELL     = /bin/sh
 CC        = @CC@
-CPP       = @CPP@
-CFLAGS 	  = @CFLAGS@
-DEFS      = @DEFS@ -DWINE_INI_GLOBAL=\"$(WINE_INI_GLOBAL)\"
-X_CFLAGS  = @X_CFLAGS@
+CFLAGS    = @CFLAGS@
+OPTIONS   = @OPTIONS@
 X_LIBS    = @X_LIBS@
 TOPSRC    = @top_srcdir@
-DIVINCL   = -I$(TOPSRC)/include
-XPM_LIB	  = -lXpm
-XLIB	  = @X_PRE_LIBS@ -lXext -lX11 @X_EXTRA_LIBS@
-LDLIBS	  = @LDLIBS@
+XPM_LIB   = -lXpm
+XLIB      = @X_PRE_LIBS@ -lXext -lX11 @X_EXTRA_LIBS@
+LDLIBS    = @LDLIBS@
 AR        = ar rc
 RANLIB    = @RANLIB@
 RM        = rm -f
-SUBMAKE   = $(MAKE) 'CC=$(CC)' 'CFLAGS=$(CFLAGS)' 'DEFS=$(DEFS)'
+SUBMAKE   = $(MAKE) 'CC=$(CC)' 'CFLAGS=$(CFLAGS)' 'OPTIONS=$(OPTIONS)'
 @SET_MAKE@
 
 # Installation infos
@@ -38,10 +35,8 @@
 exec_prefix     = @exec_prefix@
 bindir          = @bindir@
 libdir          = @libdir@
-sysconfdir      = @sysconfdir@
 mandir          = @mandir@/man1
 manext          = .1
-WINE_INI_GLOBAL = $(sysconfdir)/wine.conf
 
 # Main target to build
 
@@ -64,7 +59,6 @@
 EMUSUBDIRS = \
 	tools \
 	debugger \
-	debugger/readline \
 	if1632 \
 	miscemu
 
@@ -89,7 +83,6 @@
 
 EMUOBJS = \
 	debugger/debugger.o \
-	debugger/readline/readline.o \
 	if1632/if1632.o \
 	miscemu/miscemu.o
 
@@ -141,7 +134,7 @@
 	(cd include; $(RM) *.o \#*\# *~ *.bak *.orig *.rej *.flc)
 
 distclean: clean
-	$(RM) config.* Make.rules
+	$(RM) config.* Make.rules include/config.h
 	$(RM) `find . \( -name Makefile -o -size 0 \) -print`
 
 dummy:
diff --git a/configure b/configure
index 72b3143..49f45df 100755
--- a/configure
+++ b/configure
@@ -19,8 +19,6 @@
 ac_help="$ac_help
   --with-ipc              use inter-process communication for DDE"
 ac_help="$ac_help
-  --with-malloc-debug     enable malloc() debugging"
-ac_help="$ac_help
   --with-x                use the X Window System"
 
 # Initialize some variables set by options.
@@ -523,6 +521,7 @@
 fi
 
 		
+
 ac_aux_dir=
 for ac_dir in tools $srcdir/tools; do
   if test -f $ac_dir/install-sh; then
@@ -552,48 +551,27 @@
 # Check whether --with-library or --without-library was given.
 if test "${with_library+set}" = set; then
   withval="$with_library"
-  cat >> confdefs.h <<\EOF
-#define WINELIB 1
-EOF
- MAIN_TARGET="libwine.a"
+  OPTIONS="-DWINELIB" MAIN_TARGET="libwine.a"
 else
-  MAIN_TARGET="wine"
+  OPTIONS="" MAIN_TARGET="wine"
 fi
 
 
 # Check whether --with-dll or --without-dll was given.
 if test "${with_dll+set}" = set; then
   withval="$with_dll"
-  cat >> confdefs.h <<\EOF
-#define WINELIB 1
-EOF
- cat >> confdefs.h <<\EOF
-#define WINELIBDLL 1
-EOF
-
- MAIN_TARGET="libwine.so.1.0" CFLAGS="$CFLAGS -fPIC"
+  OPTIONS="-DWINELIB -DWINELIBDLL" MAIN_TARGET="libwine.so.1.0" CFLAGS="$CFLAGS -fPIC"
 fi
 
 
-
 # Check whether --with-ipc or --without-ipc was given.
 if test "${with_ipc+set}" = set; then
   withval="$with_ipc"
-  cat >> confdefs.h <<\EOF
-#define CONFIG_IPC 1
-EOF
-
+  OPTIONS="$OPTIONS -DCONFIG_IPC"
 fi
 
 
-# Check whether --with-malloc-debug or --without-malloc-debug was given.
-if test "${with_malloc_debug+set}" = set; then
-  withval="$with_malloc_debug"
-  cat >> confdefs.h <<\EOF
-#define MALLOC_DEBUGGING 1
-EOF
 
-fi
 
 
 
@@ -709,7 +687,7 @@
   yes;
 #endif
 EOF
-if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:713: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then
+if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:691: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then
   ac_cv_prog_gcc=yes
 else
   ac_cv_prog_gcc=no
@@ -761,13 +739,13 @@
   # On the NeXT, cc -E runs the code through the compiler's parser,
   # not just through cpp.
   cat > conftest.$ac_ext <<EOF
-#line 765 "configure"
+#line 743 "configure"
 #include "confdefs.h"
 #include <assert.h>
 Syntax Error
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:771: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:749: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out`
 if test -z "$ac_err"; then
   :
@@ -776,13 +754,13 @@
   rm -rf conftest*
   CPP="${CC-cc} -E -traditional-cpp"
   cat > conftest.$ac_ext <<EOF
-#line 780 "configure"
+#line 758 "configure"
 #include "confdefs.h"
 #include <assert.h>
 Syntax Error
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:786: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:764: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out`
 if test -z "$ac_err"; then
   :
@@ -886,12 +864,12 @@
 
   # First, try using that file with no special directory specified.
 cat > conftest.$ac_ext <<EOF
-#line 890 "configure"
+#line 868 "configure"
 #include "confdefs.h"
 #include <$x_direct_test_include>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:895: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:873: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out`
 if test -z "$ac_err"; then
   rm -rf conftest*
@@ -958,7 +936,7 @@
   ac_save_LIBS="$LIBS"
   LIBS="-l$x_direct_test_library $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 962 "configure"
+#line 940 "configure"
 #include "confdefs.h"
 
 int main() { return 0; }
@@ -966,7 +944,7 @@
 ${x_direct_test_function}()
 ; return 0; }
 EOF
-if { (eval echo configure:970: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then
+if { (eval echo configure:948: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then
   rm -rf conftest*
   LIBS="$ac_save_LIBS"
 # We can link X programs with no special library path.
@@ -1087,7 +1065,7 @@
   ac_save_LIBS="$LIBS"
 LIBS="-lICE  $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 1091 "configure"
+#line 1069 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -1099,7 +1077,7 @@
 IceConnectionNumber()
 ; return 0; }
 EOF
-if { (eval echo configure:1103: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then
+if { (eval echo configure:1081: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -1135,7 +1113,7 @@
   ac_save_LIBS="$LIBS"
 LIBS="-ldnet  $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 1139 "configure"
+#line 1117 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -1147,7 +1125,7 @@
 dnet_ntoa()
 ; return 0; }
 EOF
-if { (eval echo configure:1151: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then
+if { (eval echo configure:1129: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -1174,7 +1152,7 @@
   ac_save_LIBS="$LIBS"
 LIBS="-ldnet_stub  $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 1178 "configure"
+#line 1156 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -1186,7 +1164,7 @@
 dnet_ntoa()
 ; return 0; }
 EOF
-if { (eval echo configure:1190: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then
+if { (eval echo configure:1168: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -1218,7 +1196,7 @@
   ac_save_LIBS="$LIBS"
 LIBS="-lnsl  $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 1222 "configure"
+#line 1200 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -1230,7 +1208,7 @@
 t_accept()
 ; return 0; }
 EOF
-if { (eval echo configure:1234: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then
+if { (eval echo configure:1212: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -1262,7 +1240,7 @@
   ac_save_LIBS="$LIBS"
 LIBS="-lsocket  $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 1266 "configure"
+#line 1244 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -1274,7 +1252,7 @@
 socket()
 ; return 0; }
 EOF
-if { (eval echo configure:1278: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then
+if { (eval echo configure:1256: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -1302,7 +1280,7 @@
   ac_save_LIBS="$LIBS"
 LIBS="-lsocket -lnsl $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 1306 "configure"
+#line 1284 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -1314,7 +1292,7 @@
 socket()
 ; return 0; }
 EOF
-if { (eval echo configure:1318: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then
+if { (eval echo configure:1296: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -1412,7 +1390,7 @@
   ac_save_LIBS="$LIBS"
 LIBS="-l$ac_lib  $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 1416 "configure"
+#line 1394 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -1424,7 +1402,7 @@
 yywrap()
 ; return 0; }
 EOF
-if { (eval echo configure:1428: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then
+if { (eval echo configure:1406: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -1539,7 +1517,7 @@
   ac_save_LIBS="$LIBS"
 LIBS="-li386  $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 1543 "configure"
+#line 1521 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -1551,7 +1529,7 @@
 i386_set_ldt()
 ; return 0; }
 EOF
-if { (eval echo configure:1555: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then
+if { (eval echo configure:1533: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -1583,11 +1561,11 @@
   ac_cv_c_cross=yes
 else
 cat > conftest.$ac_ext <<EOF
-#line 1587 "configure"
+#line 1565 "configure"
 #include "confdefs.h"
 main(){return(0);}
 EOF
-{ (eval echo configure:1591: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }
+{ (eval echo configure:1569: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }
 if test -s conftest && (./conftest; exit) 2>/dev/null; then
   ac_cv_c_cross=no
 else
@@ -1608,7 +1586,7 @@
   ac_cv_c_gcc_strength_bug="yes"
 else
 cat > conftest.$ac_ext <<EOF
-#line 1612 "configure"
+#line 1590 "configure"
 #include "confdefs.h"
 
 int main(void) {
@@ -1619,7 +1597,7 @@
   exit( Array[1] != -2 );
 }
 EOF
-{ (eval echo configure:1623: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }
+{ (eval echo configure:1601: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }
 if test -s conftest && (./conftest; exit) 2>/dev/null; then
   ac_cv_c_gcc_strength_bug="no"
 else
@@ -1637,14 +1615,14 @@
 fi
 
 
-for ac_func in tcgetattr usleep
+for ac_func in memmove tcgetattr usleep
 do
 echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
 if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 1648 "configure"
+#line 1626 "configure"
 #include "confdefs.h"
 /* System header to define __stub macros and hopefully few prototypes,
     which can conflict with char $ac_func(); below.  */
@@ -1668,7 +1646,7 @@
 
 ; return 0; }
 EOF
-if { (eval echo configure:1672: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then
+if { (eval echo configure:1650: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then
   rm -rf conftest*
   eval "ac_cv_func_$ac_func=yes"
 else
@@ -1690,49 +1668,12 @@
 fi
 done
 
-for ac_hdr in stdlib.h
-do
-ac_safe=`echo "$ac_hdr" | tr './\055' '___'`
-echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
-if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
-  echo $ac_n "(cached) $ac_c" 1>&6
-else
-  cat > conftest.$ac_ext <<EOF
-#line 1702 "configure"
-#include "confdefs.h"
-#include <$ac_hdr>
-EOF
-ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:1707: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
-ac_err=`grep -v '^ *+' conftest.out`
-if test -z "$ac_err"; then
-  rm -rf conftest*
-  eval "ac_cv_header_$ac_safe=yes"
-else
-  echo "$ac_err" >&5
-  rm -rf conftest*
-  eval "ac_cv_header_$ac_safe=no"
-fi
-rm -f conftest*
-fi
-if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
-  echo "$ac_t""yes" 1>&6
-    ac_tr_hdr=HAVE_`echo $ac_hdr | tr 'abcdefghijklmnopqrstuvwxyz./\055' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ___'`
-  cat >> confdefs.h <<EOF
-#define $ac_tr_hdr 1
-EOF
- 
-else
-  echo "$ac_t""no" 1>&6
-fi
-done
-
 echo $ac_n "checking whether stat file-mode macros are broken""... $ac_c" 1>&6
 if eval "test \"`echo '$''{'ac_cv_header_stat_broken'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 1736 "configure"
+#line 1677 "configure"
 #include "confdefs.h"
 #include <sys/types.h>
 #include <sys/stat.h>
@@ -1787,7 +1728,7 @@
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 1791 "configure"
+#line 1732 "configure"
 #include "confdefs.h"
 
 int main() { return 0; }
@@ -1837,7 +1778,7 @@
 
 ; return 0; }
 EOF
-if { (eval echo configure:1841: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:1782: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   ac_cv_c_const=yes
 else
@@ -1861,7 +1802,7 @@
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 1865 "configure"
+#line 1806 "configure"
 #include "confdefs.h"
 #include <stdlib.h>
 #include <stdarg.h>
@@ -1869,7 +1810,7 @@
 #include <float.h>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:1873: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:1814: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out`
 if test -z "$ac_err"; then
   rm -rf conftest*
@@ -1884,7 +1825,7 @@
 if test $ac_cv_header_stdc = yes; then
   # SunOS 4.x string.h does not declare mem*, contrary to ANSI.
 cat > conftest.$ac_ext <<EOF
-#line 1888 "configure"
+#line 1829 "configure"
 #include "confdefs.h"
 #include <string.h>
 EOF
@@ -1902,7 +1843,7 @@
 if test $ac_cv_header_stdc = yes; then
   # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
 cat > conftest.$ac_ext <<EOF
-#line 1906 "configure"
+#line 1847 "configure"
 #include "confdefs.h"
 #include <stdlib.h>
 EOF
@@ -1923,7 +1864,7 @@
   :
 else
 cat > conftest.$ac_ext <<EOF
-#line 1927 "configure"
+#line 1868 "configure"
 #include "confdefs.h"
 #include <ctype.h>
 #define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
@@ -1934,7 +1875,7 @@
 exit (0); }
 
 EOF
-{ (eval echo configure:1938: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }
+{ (eval echo configure:1879: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }
 if test -s conftest && (./conftest; exit) 2>/dev/null; then
   :
 else
@@ -1958,7 +1899,7 @@
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 1962 "configure"
+#line 1903 "configure"
 #include "confdefs.h"
 #include <sys/types.h>
 #if STDC_HEADERS
@@ -2038,19 +1979,7 @@
 
 trap 'rm -f $CONFIG_STATUS conftest*; exit 1' 1 2 15
 
-# Transform confdefs.h into DEFS.
-# Protect against shell expansion while executing Makefile rules.
-# Protect against Makefile macro expansion.
-cat > conftest.defs <<\EOF
-s%#define \([A-Za-z_][A-Za-z0-9_]*\) *\(.*\)%-D\1=\2%g
-s%[ 	`~#$^&*(){}\\|;'"<>?]%\\&%g
-s%\[%\\&%g
-s%\]%\\&%g
-s%\$%$$%g
-EOF
-DEFS=`sed -f conftest.defs confdefs.h | tr '\012' ' '`
-rm -f conftest.defs
-
+DEFS=-DHAVE_CONFIG_H
 
 # Without the "./", some shells look in PATH for config.status.
 : ${CONFIG_STATUS=./config.status}
@@ -2093,7 +2022,6 @@
 Makefile
 controls/Makefile
 debugger/Makefile
-debugger/readline/Makefile
 files/Makefile
 if1632/Makefile
 ipc/Makefile
@@ -2112,7 +2040,7 @@
 resources/Makefile
 tools/Makefile
 win32/Makefile
-windows/Makefile " | sed "s/:[^ ]*//g"` conftest*; exit 1' 1 2 15
+windows/Makefile  include/config.h" | sed "s/:[^ ]*//g"` conftest*; exit 1' 1 2 15
 EOF
 cat >> $CONFIG_STATUS <<EOF
 
@@ -2144,6 +2072,7 @@
 s%@mandir@%$mandir%g
 s%@LDLIBS@%$LDLIBS%g
 s%@MAIN_TARGET@%$MAIN_TARGET%g
+s%@OPTIONS@%$OPTIONS%g
 s%@SET_MAKE@%$SET_MAKE%g
 s%@CC@%$CC%g
 s%@CPP@%$CPP%g
@@ -2168,7 +2097,6 @@
 Makefile
 controls/Makefile
 debugger/Makefile
-debugger/readline/Makefile
 files/Makefile
 if1632/Makefile
 ipc/Makefile
@@ -2243,6 +2171,108 @@
 fi; done
 rm -f conftest.subs
 
+# These sed commands are passed to sed as "A NAME B NAME C VALUE D", where
+# NAME is the cpp macro being defined and VALUE is the value it is being given.
+#
+# ac_d sets the value in "#define NAME VALUE" lines.
+ac_dA='s%^\([ 	]*\)#\([ 	]*define[ 	][ 	]*\)'
+ac_dB='\([ 	][ 	]*\)[^ 	]*%\1#\2'
+ac_dC='\3'
+ac_dD='%g'
+# ac_u turns "#undef NAME" with trailing blanks into "#define NAME VALUE".
+ac_uA='s%^\([ 	]*\)#\([ 	]*\)undef\([ 	][ 	]*\)'
+ac_uB='\([ 	]\)%\1#\2define\3'
+ac_uC=' '
+ac_uD='\4%g'
+# ac_e turns "#undef NAME" without trailing blanks into "#define NAME VALUE".
+ac_eA='s%^\([ 	]*\)#\([ 	]*\)undef\([ 	][ 	]*\)'
+ac_eB='$%\1#\2define\3'
+ac_eC=' '
+ac_eD='%g'
+
+CONFIG_HEADERS=${CONFIG_HEADERS-"include/config.h"}
+for ac_file in .. $CONFIG_HEADERS; do if test "x$ac_file" != x..; then
+  # Support "outfile[:infile]", defaulting infile="outfile.in".
+  case "$ac_file" in
+  *:*) ac_file_in=`echo "$ac_file"|sed 's%.*:%%'`
+       ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;;
+  *) ac_file_in="${ac_file}.in" ;;
+  esac
+
+  echo creating $ac_file
+
+  rm -f conftest.frag conftest.in conftest.out
+  cp $ac_given_srcdir/$ac_file_in conftest.in
+
+EOF
+
+# Transform confdefs.h into a sed script conftest.vals that substitutes
+# the proper values into config.h.in to produce config.h.  And first:
+# Protect against being on the right side of a sed subst in config.status.
+# Protect against being in an unquoted here document in config.status.
+rm -f conftest.vals
+cat > conftest.hdr <<\EOF
+s/[\\&%]/\\&/g
+s%[\\$`]%\\&%g
+s%#define \([A-Za-z_][A-Za-z0-9_]*\) *\(.*\)%${ac_dA}\1${ac_dB}\1${ac_dC}\2${ac_dD}%gp
+s%ac_d%ac_u%gp
+s%ac_u%ac_e%gp
+EOF
+sed -n -f conftest.hdr confdefs.h > conftest.vals
+rm -f conftest.hdr
+
+# This sed command replaces #undef with comments.  This is necessary, for
+# example, in the case of _POSIX_SOURCE, which is predefined and required
+# on some systems where configure will not decide to define it.
+cat >> conftest.vals <<\EOF
+s%^[ 	]*#[ 	]*undef[ 	][ 	]*[a-zA-Z_][a-zA-Z_0-9]*%/* & */%
+EOF
+
+# Break up conftest.vals because some shells have a limit on
+# the size of here documents, and old seds have small limits too.
+# Maximum number of lines to put in a single here document.
+ac_max_here_lines=12
+
+rm -f conftest.tail
+while :
+do
+  ac_lines=`grep -c . conftest.vals`
+  # grep -c gives empty output for an empty file on some AIX systems.
+  if test -z "$ac_lines" || test "$ac_lines" -eq 0; then break; fi
+  # Write a limited-size here document to conftest.frag.
+  echo '  cat > conftest.frag <<CEOF' >> $CONFIG_STATUS
+  sed ${ac_max_here_lines}q conftest.vals >> $CONFIG_STATUS
+  echo 'CEOF
+  sed -f conftest.frag conftest.in > conftest.out
+  rm -f conftest.in
+  mv conftest.out conftest.in
+' >> $CONFIG_STATUS
+  sed 1,${ac_max_here_lines}d conftest.vals > conftest.tail
+  rm -f conftest.vals
+  mv conftest.tail conftest.vals
+done
+rm -f conftest.vals
+
+cat >> $CONFIG_STATUS <<\EOF
+  rm -f conftest.frag conftest.h
+  echo "/* $ac_file.  Generated automatically by configure.  */" > conftest.h
+  cat conftest.in >> conftest.h
+  rm -f conftest.in
+  if cmp -s $ac_file conftest.h 2>/dev/null; then
+    echo "$ac_file is unchanged"
+    rm -f conftest.h
+  else
+    # Remove last slash and all that follows it.  Not all systems have dirname.
+      ac_dir=`echo $ac_file|sed 's%/[^/][^/]*$%%'`
+      if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then
+      # The file is in a subdirectory.
+      test ! -d "$ac_dir" && mkdir "$ac_dir"
+    fi
+    rm -f $ac_file
+    mv conftest.h $ac_file
+  fi
+fi; done
+
 
 
 exit 0
diff --git a/configure.in b/configure.in
index 55a417c..97f991e 100644
--- a/configure.in
+++ b/configure.in
@@ -3,6 +3,7 @@
 dnl                         <patra@itp1.physik.tu-berlin.de>
 AC_REVISION([configure.in 1.00])
 AC_INIT(controls/edit.c)		
+AC_CONFIG_HEADER(include/config.h)
 AC_CONFIG_AUX_DIR(tools)
 
 # We want these before the checks, so the checks can modify their values.
@@ -14,21 +15,19 @@
 
 AC_ARG_WITH(library,
 [  --with-library          build Wine as a library instead of an emulator],
-[AC_DEFINE(WINELIB) MAIN_TARGET="libwine.a"],[MAIN_TARGET="wine"])
+[OPTIONS="-DWINELIB" MAIN_TARGET="libwine.a"],
+[OPTIONS="" MAIN_TARGET="wine"])
 
 AC_ARG_WITH(dll,
 [  --with-dll              build Wine as a DLL instead of an emulator],
-[AC_DEFINE(WINELIB) AC_DEFINE(WINELIBDLL)
- MAIN_TARGET="libwine.so.1.0" CFLAGS="$CFLAGS -fPIC"])
-AC_SUBST(MAIN_TARGET)
+[OPTIONS="-DWINELIB -DWINELIBDLL" MAIN_TARGET="libwine.so.1.0" CFLAGS="$CFLAGS -fPIC"])
 
 AC_ARG_WITH(ipc,
 [  --with-ipc              use inter-process communication for DDE],
-[AC_DEFINE(CONFIG_IPC)])
+[OPTIONS="$OPTIONS -DCONFIG_IPC"])
 
-AC_ARG_WITH(malloc-debug,
-[  --with-malloc-debug     enable malloc() debugging],
-[AC_DEFINE(MALLOC_DEBUGGING)])
+AC_SUBST(MAIN_TARGET)
+AC_SUBST(OPTIONS)
 
 dnl **** Check for some programs and libraries ****
 
@@ -69,8 +68,7 @@
 
 dnl **** Check for functions and header files ****
 
-AC_CHECK_FUNCS(tcgetattr usleep)
-AC_CHECK_HEADERS(stdlib.h)
+AC_CHECK_FUNCS(memmove tcgetattr usleep)
 AC_HEADER_STAT()
 AC_C_CONST()
 AC_TYPE_SIZE_T()
@@ -85,7 +83,6 @@
 Makefile
 controls/Makefile
 debugger/Makefile
-debugger/readline/Makefile
 files/Makefile
 if1632/Makefile
 ipc/Makefile
diff --git a/controls/Makefile.in b/controls/Makefile.in
index 3b018a4..6dde058 100644
--- a/controls/Makefile.in
+++ b/controls/Makefile.in
@@ -1,6 +1,6 @@
-TOPSRC  = @top_srcdir@
-
-MODULE 	= controls
+DEFS   = -D__WINE__
+TOPSRC = @top_srcdir@
+MODULE = controls
 
 C_SRCS = \
 	button.c \
diff --git a/controls/button.c b/controls/button.c
index 620f288..c0aca7e 100644
--- a/controls/button.c
+++ b/controls/button.c
@@ -98,7 +98,7 @@
         if (!hbitmapCheckBoxes)
         {
             BITMAP16 bmp;
-            hbitmapCheckBoxes = LoadBitmap(0, MAKEINTRESOURCE(OBM_CHECKBOXES));
+            hbitmapCheckBoxes = LoadBitmap16(0, MAKEINTRESOURCE(OBM_CHECKBOXES));
             GetObject16( hbitmapCheckBoxes, sizeof(bmp), &bmp );
             checkBoxWidth  = bmp.bmWidth / 4;
             checkBoxHeight = bmp.bmHeight / 3;
diff --git a/controls/combo.c b/controls/combo.c
index 7006776..989c0b2 100644
--- a/controls/combo.c
+++ b/controls/combo.c
@@ -51,7 +51,7 @@
   BITMAP16 bm;
   
   dprintf_combo(stddeb, "COMBO_Init\n");
-  hComboBit = LoadBitmap(0, MAKEINTRESOURCE(OBM_COMBO));
+  hComboBit = LoadBitmap16(0, MAKEINTRESOURCE(OBM_COMBO));
   GetObject16( hComboBit, sizeof(bm), &bm );
   CBitHeight = bm.bmHeight;
   CBitWidth = bm.bmWidth;
diff --git a/controls/desktop.c b/controls/desktop.c
index 9b01ae7..b9fa9dd 100644
--- a/controls/desktop.c
+++ b/controls/desktop.c
@@ -154,7 +154,7 @@
 	ExitWindows( 0, 0 ); 
 
     case WM_SETCURSOR:
-        return (LRESULT)SetCursor( LoadCursor( 0, IDC_ARROW ) );
+        return (LRESULT)SetCursor( LoadCursor16( 0, IDC_ARROW ) );
     }
     
     return 0;
diff --git a/controls/edit.c b/controls/edit.c
index f96c3c1..5dae7f9 100644
--- a/controls/edit.c
+++ b/controls/edit.c
@@ -617,7 +617,7 @@
 	EDITWORDBREAKPROC wbp = (EDITWORDBREAKPROC)EDIT_EM_GetWordBreakProc(wndPtr, 0, 0L);
 
 	if (wbp) {
-		return CallWordBreakProc((FARPROC)wbp,
+		return CallWordBreakProc((FARPROC16)wbp,
 				(LONG)MAKE_SEGPTR(s), index, count, action);
 	} else
 		return EDIT_WordBreakProc(s, index, count, action);
@@ -2107,7 +2107,7 @@
 static LRESULT EDIT_WM_Char(WND *wndPtr, WPARAM wParam, LPARAM lParam)
 {
 	char str[2];
-	char c = (char)wParam;
+	unsigned char c = (unsigned char)wParam;
 
 	switch (c) {
 	case '\r':
@@ -2739,7 +2739,7 @@
 static LRESULT EDIT_WM_SetCursor(WND *wndPtr, WPARAM wParam, LPARAM lParam)
 {
 	if (LOWORD(lParam) == HTCLIENT) {
-		SetCursor(LoadCursor(0, IDC_IBEAM));
+		SetCursor(LoadCursor16(0, IDC_IBEAM));
 		return -1L;
 	} else
 		return 0L;
diff --git a/controls/menu.c b/controls/menu.c
index 49bd762..c880829 100644
--- a/controls/menu.c
+++ b/controls/menu.c
@@ -136,12 +136,12 @@
 
       /* Load bitmaps */
 
-    if (!(hStdCheck = LoadBitmap( 0, MAKEINTRESOURCE(OBM_CHECK) )))
+    if (!(hStdCheck = LoadBitmap16( 0, MAKEINTRESOURCE(OBM_CHECK) )))
 	return FALSE;
     GetObject16( hStdCheck, sizeof(bm), &bm );
     check_bitmap_width = bm.bmWidth;
     check_bitmap_height = bm.bmHeight;
-    if (!(hStdMnArrow = LoadBitmap( 0, MAKEINTRESOURCE(OBM_MNARROW) )))
+    if (!(hStdMnArrow = LoadBitmap16( 0, MAKEINTRESOURCE(OBM_MNARROW) )))
 	return FALSE;
     GetObject16( hStdMnArrow, sizeof(bm), &bm );
     arrow_bitmap_width = bm.bmWidth;
@@ -2514,11 +2514,11 @@
 /**********************************************************************
  *	    LoadMenu    (USER.150)
  */
-HMENU LoadMenu( HINSTANCE instance, SEGPTR name )
+HMENU16 LoadMenu16( HINSTANCE16 instance, SEGPTR name )
 {
-    HRSRC hRsrc;
-    HGLOBAL handle;
-    HMENU hMenu;
+    HRSRC16 hRsrc;
+    HGLOBAL16 handle;
+    HMENU16 hMenu;
 
     if (HIWORD(name))
     {
@@ -2534,16 +2534,38 @@
     /* check for Win32 module */
     instance = GetExePtr( instance );
     if (MODULE_GetPtr(instance)->flags & NE_FFLAGS_WIN32)
-        return WIN32_LoadMenuA(instance,PTR_SEG_TO_LIN(name));
+        return LoadMenu32A(instance,PTR_SEG_TO_LIN(name));
 
-    if (!(hRsrc = FindResource( instance, name, RT_MENU ))) return 0;
-    if (!(handle = LoadResource( instance, hRsrc ))) return 0;
-    hMenu = LoadMenuIndirect16( LockResource(handle) );
-    FreeResource( handle );
+    if (!(hRsrc = FindResource16( instance, name, RT_MENU ))) return 0;
+    if (!(handle = LoadResource16( instance, hRsrc ))) return 0;
+    hMenu = LoadMenuIndirect16(LockResource16(handle));
+    FreeResource16( handle );
     return hMenu;
 }
 
 
+/*****************************************************************
+ *        LoadMenu32A   (USER32.370)
+ */
+HMENU32 LoadMenu32A( HINSTANCE32 instance, LPCSTR name )
+{
+    HRSRC32 hrsrc = FindResource32A( instance, name, (LPSTR)RT_MENU );
+    if (!hrsrc) return 0;
+    return LoadMenuIndirect32A( (LPCVOID)LoadResource32( instance, hrsrc ));
+}
+
+
+/*****************************************************************
+ *        LoadMenu32W   (USER32.372)
+ */
+HMENU32 LoadMenu32W( HINSTANCE32 instance, LPCWSTR name )
+{
+    HRSRC32 hrsrc = FindResource32W( instance, name, (LPWSTR)RT_MENU );
+    if (!hrsrc) return 0;
+    return LoadMenuIndirect32W( (LPCVOID)LoadResource32( instance, hrsrc ));
+}
+
+
 /**********************************************************************
  *	    LoadMenuIndirect16    (USER.220)
  */
diff --git a/controls/scroll.c b/controls/scroll.c
index 04321df..649c81f 100644
--- a/controls/scroll.c
+++ b/controls/scroll.c
@@ -79,18 +79,18 @@
  */
 static void SCROLL_LoadBitmaps(void)
 {
-    hUpArrow  = LoadBitmap((HINSTANCE)NULL, MAKEINTRESOURCE(OBM_UPARROW));
-    hDnArrow  = LoadBitmap((HINSTANCE)NULL, MAKEINTRESOURCE(OBM_DNARROW));
-    hLfArrow  = LoadBitmap((HINSTANCE)NULL, MAKEINTRESOURCE(OBM_LFARROW));
-    hRgArrow  = LoadBitmap((HINSTANCE)NULL, MAKEINTRESOURCE(OBM_RGARROW));
-    hUpArrowD = LoadBitmap((HINSTANCE)NULL, MAKEINTRESOURCE(OBM_UPARROWD));
-    hDnArrowD = LoadBitmap((HINSTANCE)NULL, MAKEINTRESOURCE(OBM_DNARROWD));
-    hLfArrowD = LoadBitmap((HINSTANCE)NULL, MAKEINTRESOURCE(OBM_LFARROWD));
-    hRgArrowD = LoadBitmap((HINSTANCE)NULL, MAKEINTRESOURCE(OBM_RGARROWD));
-    hUpArrowI = LoadBitmap((HINSTANCE)NULL, MAKEINTRESOURCE(OBM_UPARROWI));
-    hDnArrowI = LoadBitmap((HINSTANCE)NULL, MAKEINTRESOURCE(OBM_DNARROWI));
-    hLfArrowI = LoadBitmap((HINSTANCE)NULL, MAKEINTRESOURCE(OBM_LFARROWI));
-    hRgArrowI = LoadBitmap((HINSTANCE)NULL, MAKEINTRESOURCE(OBM_RGARROWI));
+    hUpArrow  = LoadBitmap16((HINSTANCE)NULL, MAKEINTRESOURCE(OBM_UPARROW));
+    hDnArrow  = LoadBitmap16((HINSTANCE)NULL, MAKEINTRESOURCE(OBM_DNARROW));
+    hLfArrow  = LoadBitmap16((HINSTANCE)NULL, MAKEINTRESOURCE(OBM_LFARROW));
+    hRgArrow  = LoadBitmap16((HINSTANCE)NULL, MAKEINTRESOURCE(OBM_RGARROW));
+    hUpArrowD = LoadBitmap16((HINSTANCE)NULL, MAKEINTRESOURCE(OBM_UPARROWD));
+    hDnArrowD = LoadBitmap16((HINSTANCE)NULL, MAKEINTRESOURCE(OBM_DNARROWD));
+    hLfArrowD = LoadBitmap16((HINSTANCE)NULL, MAKEINTRESOURCE(OBM_LFARROWD));
+    hRgArrowD = LoadBitmap16((HINSTANCE)NULL, MAKEINTRESOURCE(OBM_RGARROWD));
+    hUpArrowI = LoadBitmap16((HINSTANCE)NULL, MAKEINTRESOURCE(OBM_UPARROWI));
+    hDnArrowI = LoadBitmap16((HINSTANCE)NULL, MAKEINTRESOURCE(OBM_DNARROWI));
+    hLfArrowI = LoadBitmap16((HINSTANCE)NULL, MAKEINTRESOURCE(OBM_LFARROWI));
+    hRgArrowI = LoadBitmap16((HINSTANCE)NULL, MAKEINTRESOURCE(OBM_RGARROWI));
 }
 
 
diff --git a/controls/static.c b/controls/static.c
index aa8e1a7..72ded64 100644
--- a/controls/static.c
+++ b/controls/static.c
@@ -87,9 +87,9 @@
 		CREATESTRUCT16 *cs = (CREATESTRUCT16 *)PTR_SEG_TO_LIN(lParam);
 		if (cs->lpszName)
                 {
-                    HICON hicon = LoadIcon( cs->hInstance, cs->lpszName );
+                    HICON16 hicon = LoadIcon16( cs->hInstance, cs->lpszName );
                     if (!hicon)  /* Try OEM icon (FIXME: is this right?) */
-                        hicon = LoadIcon( 0, cs->lpszName );
+                        hicon = LoadIcon16( 0, cs->lpszName );
                     STATIC_SetIcon( wndPtr, hicon );
                 }
                 return 1;
@@ -136,7 +136,7 @@
 	case WM_SETTEXT:
 	    if (style == SS_ICON)
 	        /* FIXME : should we also return the previous hIcon here ??? */
-                STATIC_SetIcon( wndPtr, LoadIcon( wndPtr->hInstance,
+                STATIC_SetIcon( wndPtr, LoadIcon16( wndPtr->hInstance,
                                                   (SEGPTR)lParam ));
             else
                 DEFWND_SetText( wndPtr, (LPSTR)PTR_SEG_TO_LIN(lParam) );
diff --git a/controls/widgets.c b/controls/widgets.c
index 7205bc0..4f8a78c 100644
--- a/controls/widgets.c
+++ b/controls/widgets.c
@@ -15,32 +15,35 @@
 #include "module.h"
 #include "heap.h"
 
-static WNDCLASS16 WIDGETS_BuiltinClasses16[] =
+typedef struct
+{
+    UINT16     style;
+    INT16      wndExtra;
+    HBRUSH16   background;
+    LPCSTR     procName;
+    LPCSTR     className;
+} BUILTIN_CLASS_INFO16;
+
+static const BUILTIN_CLASS_INFO16 WIDGETS_BuiltinClasses16[] =
 {
     { CS_GLOBALCLASS | CS_PARENTDC,
-          (WNDPROC16)"StaticWndProc", 0, sizeof(STATICINFO),
-          0, 0, 0, 0, 0, (SEGPTR)"STATIC" },
+       sizeof(STATICINFO), 0, "StaticWndProc", "STATIC" },
     { CS_GLOBALCLASS | CS_DBLCLKS | CS_VREDRAW | CS_HREDRAW | CS_PARENTDC,
-          (WNDPROC16)"ScrollBarWndProc", 0, sizeof(SCROLLINFO),
-          0, 0, 0, 0, 0, (SEGPTR)"SCROLLBAR" },
+      sizeof(SCROLLINFO), 0, "ScrollBarWndProc", "SCROLLBAR" },
     { CS_GLOBALCLASS | CS_PARENTDC | CS_DBLCLKS,
-          (WNDPROC16)"ListBoxWndProc", 0, 8,
-          0, 0, 0, 0, 0, (SEGPTR)"LISTBOX" },
+      8, 0, "ListBoxWndProc", "LISTBOX" },
     { CS_GLOBALCLASS | CS_PARENTDC | CS_DBLCLKS,
-          (WNDPROC16)"ComboBoxWndProc", 0, 8,
-          0, 0, 0, 0, 0, (SEGPTR)"COMBOBOX" },
+      8, 0, "ComboBoxWndProc", "COMBOBOX" },
     { CS_GLOBALCLASS | CS_DBLCLKS | CS_SAVEBITS,
-          (WNDPROC16)"ComboLBoxWndProc", 0, 8,
-          0, 0, 0, 0, 0, (SEGPTR)"COMBOLBOX" },
+      8, 0, "ComboLBoxWndProc", "COMBOLBOX" },
     { CS_GLOBALCLASS | CS_PARENTDC | CS_DBLCLKS,
-          (WNDPROC16)"EditWndProc", 0, sizeof(DWORD),
-          0, 0, 0, 0, 0, (SEGPTR)"EDIT" },
-    { CS_GLOBALCLASS | CS_SAVEBITS, (WNDPROC16)"PopupMenuWndProc", 0, 8,
-          0, 0, 0, 0, 0, (SEGPTR)POPUPMENU_CLASS_NAME },
-    { CS_GLOBALCLASS | CS_SAVEBITS, (WNDPROC16)"DefDlgProc", 0, DLGWINDOWEXTRA,
-          0, 0, 0, 0, 0, (SEGPTR)DIALOG_CLASS_NAME },
-    { CS_GLOBALCLASS, (WNDPROC16)"MDIClientWndProc", 0, sizeof(MDICLIENTINFO),
-          0, 0, 0, STOCK_LTGRAY_BRUSH, 0, (SEGPTR)"MDICLIENT" }
+      sizeof(DWORD), 0, "EditWndProc", "EDIT" },
+    { CS_GLOBALCLASS | CS_SAVEBITS,
+      sizeof(HMENU32), 0, "PopupMenuWndProc", POPUPMENU_CLASS_NAME },
+    { CS_GLOBALCLASS | CS_SAVEBITS,
+      DLGWINDOWEXTRA, 0, "DefDlgProc", DIALOG_CLASS_NAME },
+    { CS_GLOBALCLASS, sizeof(MDICLIENTINFO),
+      STOCK_LTGRAY_BRUSH, "MDIClientWndProc", "MDICLIENT" }
 };
 
 #define NB_BUILTIN_CLASSES16 \
@@ -67,20 +70,28 @@
 {
     int i;
     char *name;
-    WNDCLASS16 *class16  = WIDGETS_BuiltinClasses16;
+    const BUILTIN_CLASS_INFO16 *info16 = WIDGETS_BuiltinClasses16;
+    WNDCLASS16 class16;
     WNDCLASS32A *class32 = WIDGETS_BuiltinClasses32;
 
     if (!(name = SEGPTR_ALLOC( 20 * sizeof(char) ))) return FALSE;
 
     /* Create 16-bit classes */
 
-    for (i = 0; i < NB_BUILTIN_CLASSES16; i++, class16++)
+    class16.cbClsExtra    = 0;
+    class16.hInstance     = 0;
+    class16.hIcon         = 0;
+    class16.hCursor       = LoadCursor16( 0, IDC_ARROW );
+    class16.lpszMenuName  = (SEGPTR)0;
+    class16.lpszClassName = SEGPTR_GET(name);
+    for (i = 0; i < NB_BUILTIN_CLASSES16; i++, info16++)
     {
-        strcpy( name, (char *)class16->lpszClassName );
-        class16->lpszClassName = SEGPTR_GET(name);
-        class16->hCursor = LoadCursor( 0, IDC_ARROW );
-        class16->lpfnWndProc = MODULE_GetWndProcEntry16( (char *)class16->lpfnWndProc );
-        if (!RegisterClass16( class16 )) return FALSE;
+        class16.style         = info16->style;
+        class16.lpfnWndProc   = (WNDPROC16)MODULE_GetWndProcEntry16( info16->procName );
+        class16.cbWndExtra    = info16->wndExtra;
+        class16.hbrBackground = info16->background;
+        strcpy( name, info16->className );
+        if (!RegisterClass16( &class16 )) return FALSE;
     }
 
     /* Create 32-bit classes */
@@ -90,7 +101,7 @@
         /* Just to make sure the string is > 0x10000 */
         strcpy( name, (char *)class32->lpszClassName );
         class32->lpszClassName = name;
-        class32->hCursor = LoadCursor( 0, IDC_ARROW );
+        class32->hCursor = LoadCursor16( 0, IDC_ARROW );
         if (!RegisterClass32A( class32 )) return FALSE;
     }
 
diff --git a/debugger/Makefile.in b/debugger/Makefile.in
index 3962061..640932e 100644
--- a/debugger/Makefile.in
+++ b/debugger/Makefile.in
@@ -1,11 +1,11 @@
-TOPSRC     = @top_srcdir@
-EXTRA_DEFS = -DUSE_READLINE
-
+DEFS   = -D__WINE__
+TOPSRC = @top_srcdir@
 MODULE = debugger
 
 C_SRCS = \
 	break.c \
 	db_disasm.c \
+	editline.c \
 	hash.c \
 	info.c \
 	memory.c \
diff --git a/debugger/dbg.y b/debugger/dbg.y
index 9a006a2..b94dee9 100644
--- a/debugger/dbg.y
+++ b/debugger/dbg.y
@@ -205,7 +205,7 @@
 
 void 
 issue_prompt(){
-#ifndef USE_READLINE
+#ifdef DONT_USE_READLINE
 	fprintf(stderr,"Wine-dbg>");
 #endif
 }
diff --git a/debugger/debug.l b/debugger/debug.l
index abd10bf..71b2215 100644
--- a/debugger/debug.l
+++ b/debugger/debug.l
@@ -1,8 +1,7 @@
-/* Lexical scanner for command line parsing in the Wine debugger
+/*
+ * Lexical scanner for command line parsing
  *
- * Version 1.0
- * Eric Youngdale
- * 9/93
+ * Copyright 1993 Eric Youngdale
  */
 
 %{
@@ -13,18 +12,20 @@
 #include "xmalloc.h"
 #include "y.tab.h"
 
-#ifdef USE_READLINE
+#ifndef DONT_USE_READLINE
 #undef YY_INPUT
 #define YY_INPUT(buf,result,max_size) \
 	if ( (result = dbg_read((char *) buf, max_size )) < 0 ) \
 	    YY_FATAL_ERROR( "read() in flex scanner failed" );
-#endif
 
 extern char * readline(char *);
 extern void add_history(char *);
 static int dbg_read(char * buf, int size);
 static char * make_symbol(char *);
 void flush_symbols();
+
+#endif  /* DONT_USE_READLINE */
+
 static int syntax_error;
 %}
 
@@ -136,7 +137,8 @@
 int yywrap(void) { return 1; }
 #endif
 
-#ifdef USE_READLINE
+#ifndef DONT_USE_READLINE
+
 #ifndef whitespace
 #define whitespace(c) (((c) == ' ') || ((c) == '\t'))
 #endif
@@ -216,10 +218,10 @@
         return local_symbols[next_symbol++] = xstrdup(symbol);
 }
 
-void
-flush_symbols(){
+void flush_symbols()
+{
 	while(--next_symbol>= 0) free(local_symbols[next_symbol]);
 	next_symbol = 0;
 }
 
-#endif
+#endif  /* DONT_USE_READLINE */
diff --git a/debugger/readline/editline.c b/debugger/editline.c
similarity index 79%
rename from debugger/readline/editline.c
rename to debugger/editline.c
index eea22d7..51e7046 100644
--- a/debugger/readline/editline.c
+++ b/debugger/editline.c
@@ -1,10 +1,38 @@
-/*  $Revision: 1.4 $
-**
-**  Main editing routines for editline library.
-*/
-#include "editline.h"
+/*
+ * Line-editing routines
+ *
+ * Copyright 1992 Simmule Turner and Rich Salz.  All rights reserved.
+ *
+ *  
+ *  This software is not subject to any license of the American Telephone
+ *  and Telegraph Company or of the Regents of the University of California.
+ *  
+ *  Permission is granted to anyone to use this software for any purpose on
+ *  any computer system, and to alter it and redistribute it freely, subject
+ *  to the following restrictions:
+ *  1. The authors are not responsible for the consequences of use of this
+ *     software, no matter how awful, even if they arise from flaws in it.
+ *  2. The origin of this software must not be misrepresented, either by
+ *     explicit claim or by omission.  Since few users ever read sources,
+ *     credits must appear in the documentation.
+ *  3. Altered versions must be plainly marked as such, and must not be
+ *     misrepresented as being the original software.  Since few users
+ *     ever read sources, credits must appear in the documentation.
+ *  4. This notice may not be removed or altered.
+ *
+ * The code was heavily simplified for inclusion in Wine. -- AJ
+ */
+
+#include "config.h"
 #include <ctype.h>
+#include <stdio.h>
 #include <stdlib.h>
+#include <string.h>
+#include <sys/ioctl.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+
+typedef unsigned char	CHAR;
 
 /*
 **  Manifest constants.
@@ -22,6 +50,17 @@
 #if	!defined(HIST_SIZE)
 #define HIST_SIZE	20
 #endif	/* !defined(HIST_SIZE) */
+#define CRLF   "\r\n"
+#define MEM_INC		64
+#define SCREEN_INC	256
+
+#define DISPOSE(p)	free((char *)(p))
+#define NEW(T, c)	\
+	((T *)malloc((unsigned int)(sizeof (T) * (c))))
+#define RENEW(p, T, c)	\
+	(p = (T *)realloc((char *)(p), (unsigned int)(sizeof (T) * (c))))
+#define COPYFROMTO(new, p, len)	\
+	(void)memcpy((char *)(new), (char *)(p), (int)(len))
 
 /*
 **  Command status codes.
@@ -57,35 +96,35 @@
 /*
 **  Globals.
 */
-int		rl_eof;
-int		rl_erase;
-int		rl_intr;
-int		rl_kill;
+static int		rl_eof;
+static int		rl_erase;
+static int		rl_intr;
+static int		rl_kill;
 
-STATIC CHAR		NIL[] = "";
-STATIC CONST CHAR	*Input = NIL;
-STATIC CHAR		*Line;
-STATIC CONST char	*Prompt;
-STATIC CHAR		*Yanked;
-STATIC char		*Screen;
-STATIC char		NEWLINE[]= CRLF;
-STATIC HISTORY		H;
-int		rl_quit;
-STATIC int		Repeat;
-STATIC int		End;
-STATIC int		Mark;
-STATIC int		OldPoint;
-STATIC int		Point;
-STATIC int		PushBack;
-STATIC int		Pushed;
-STATIC KEYMAP		Map[33];
-STATIC KEYMAP		MetaMap[16];
-STATIC SIZE_T		Length;
-STATIC SIZE_T		ScreenCount;
-STATIC SIZE_T		ScreenSize;
-STATIC char		*backspace;
-STATIC int		TTYwidth;
-STATIC int		TTYrows;
+static CHAR		NIL[] = "";
+static const CHAR	*Input = NIL;
+static CHAR		*Line;
+static const char	*Prompt;
+static CHAR		*Yanked;
+static char		*Screen;
+static char		NEWLINE[]= CRLF;
+static HISTORY		H;
+static int		rl_quit;
+static int		Repeat;
+static int		End;
+static int		Mark;
+static int		OldPoint;
+static int		Point;
+static int		PushBack;
+static int		Pushed;
+static KEYMAP		Map[33];
+static KEYMAP		MetaMap[16];
+static size_t		Length;
+static size_t		ScreenCount;
+static size_t		ScreenSize;
+static char		*backspace;
+static int		TTYwidth;
+static int		TTYrows;
 
 /* Display print 8-bit chars as `M-x' or as the actual 8-bit char? */
 int		rl_meta_chars = 1;
@@ -93,7 +132,7 @@
 /*
 **  Declarations.
 */
-STATIC CHAR	*editinput();
+static CHAR	*editinput();
 extern int	read();
 extern int	write();
 #if	defined(USE_TERMCAP)
@@ -106,7 +145,80 @@
 **  TTY input/output functions.
 */
 
-STATIC void
+#ifdef HAVE_TCGETATTR
+#include <termios.h>
+
+static void
+rl_ttyset(Reset)
+    int				Reset;
+{
+    static struct termios	old;
+    struct termios		new;
+
+    if (Reset == 0) {
+	(void)tcgetattr(0, &old);
+	rl_erase = old.c_cc[VERASE];
+	rl_kill = old.c_cc[VKILL];
+	rl_eof = old.c_cc[VEOF];
+	rl_intr = old.c_cc[VINTR];
+	rl_quit = old.c_cc[VQUIT];
+
+	new = old;
+	new.c_cc[VINTR] = -1;
+	new.c_cc[VQUIT] = -1;
+	new.c_lflag &= ~(ECHO | ICANON);
+	new.c_iflag &= ~(ISTRIP | INPCK);
+	new.c_cc[VMIN] = 1;
+	new.c_cc[VTIME] = 0;
+	(void)tcsetattr(0, TCSANOW, &new);
+    }
+    else
+	(void)tcsetattr(0, TCSANOW, &old);
+}
+
+#else  /* HAVE_TCGETATTR */
+
+static void
+rl_ttyset(Reset)
+    int				Reset;
+{
+    static struct sgttyb	old_sgttyb;
+    static struct tchars	old_tchars;
+    struct sgttyb		new_sgttyb;
+    struct tchars		new_tchars;
+
+    if (Reset == 0) {
+	(void)ioctl(0, TIOCGETP, &old_sgttyb);
+	rl_erase = old_sgttyb.sg_erase;
+	rl_kill = old_sgttyb.sg_kill;
+
+	(void)ioctl(0, TIOCGETC, &old_tchars);
+	rl_eof = old_tchars.t_eofc;
+	rl_intr = old_tchars.t_intrc;
+	rl_quit = old_tchars.t_quitc;
+
+	new_sgttyb = old_sgttyb;
+	new_sgttyb.sg_flags &= ~ECHO;
+	new_sgttyb.sg_flags |= RAW;
+#if	defined(PASS8)
+	new_sgttyb.sg_flags |= PASS8;
+#endif	/* defined(PASS8) */
+	(void)ioctl(0, TIOCSETP, &new_sgttyb);
+
+	new_tchars = old_tchars;
+	new_tchars.t_intrc = -1;
+	new_tchars.t_quitc = -1;
+	(void)ioctl(0, TIOCSETC, &new_tchars);
+    }
+    else {
+	(void)ioctl(0, TIOCSETP, &old_sgttyb);
+	(void)ioctl(0, TIOCSETC, &old_tchars);
+    }
+}
+
+#endif	/* HAVE_TCGETATTR */
+
+static void
 TTYflush()
 {
     if (ScreenCount) {
@@ -115,7 +227,7 @@
     }
 }
 
-STATIC void
+static void
 TTYput(c)
     CHAR	c;
 {
@@ -126,7 +238,7 @@
     }
 }
 
-STATIC void
+static void
 TTYputs(p)
     CHAR	*p;
 {
@@ -134,7 +246,7 @@
 	TTYput(*p++);
 }
 
-STATIC void
+static void
 TTYshow(c)
     CHAR	c;
 {
@@ -155,7 +267,7 @@
 	TTYput(c);
 }
 
-STATIC void
+static void
 TTYstring(p)
     CHAR	*p;
 {
@@ -163,7 +275,7 @@
 	TTYshow(*p++);
 }
 
-STATIC unsigned int
+static unsigned int
 TTYget()
 {
     CHAR	c;
@@ -175,12 +287,12 @@
     }
     if (*Input)
 	return *Input++;
-    return read(0, &c, (SIZE_T)1) == 1 ? c : EOF;
+    return read(0, &c, (size_t)1) == 1 ? c : EOF;
 }
 
 #define TTYback()	(backspace ? TTYputs((CHAR *)backspace) : TTYput('\b'))
 
-STATIC void
+static void
 TTYbackn(n)
     int		n;
 {
@@ -188,7 +300,7 @@
 	TTYback();
 }
 
-STATIC void
+static void
 TTYinfo()
 {
     static int		init;
@@ -244,7 +356,7 @@
 
 
 
-STATIC void
+static void
 reposition()
 {
     int		i;
@@ -256,7 +368,7 @@
 	TTYshow(*p);
 }
 
-STATIC void
+static void
 left(Change)
     STATUS	Change;
 {
@@ -273,7 +385,7 @@
 	Point--;
 }
 
-STATIC void
+static void
 right(Change)
     STATUS	Change;
 {
@@ -282,7 +394,7 @@
 	Point++;
 }
 
-STATIC STATUS
+static STATUS
 ring_bell()
 {
     TTYput('\07');
@@ -290,7 +402,7 @@
     return CSstay;
 }
 
-STATIC STATUS
+static STATUS
 do_macro(c)
     unsigned int	c;
 {
@@ -308,7 +420,7 @@
     return CSstay;
 }
 
-STATIC STATUS
+static STATUS
 do_forward(move)
     STATUS	move;
 {
@@ -333,7 +445,7 @@
     return CSstay;
 }
 
-STATIC STATUS
+static STATUS
 do_case(type)
     CASE	type;
 {
@@ -362,19 +474,19 @@
     return CSstay;
 }
 
-STATIC STATUS
+static STATUS
 case_down_word()
 {
     return do_case(TOlower);
 }
 
-STATIC STATUS
+static STATUS
 case_up_word()
 {
     return do_case(TOupper);
 }
 
-STATIC void
+static void
 ceol()
 {
     int		extras;
@@ -398,7 +510,7 @@
 	TTYback();
 }
 
-STATIC void
+static void
 clear_line()
 {
     Point = -strlen(Prompt);
@@ -409,11 +521,11 @@
     Line[0] = '\0';
 }
 
-STATIC STATUS
+static STATUS
 insert_string(p)
     CHAR	*p;
 {
-    SIZE_T	len;
+    size_t	len;
     int		i;
     CHAR	*new;
     CHAR	*q;
@@ -442,19 +554,19 @@
 }
 
 
-STATIC CHAR *
+static CHAR *
 next_hist()
 {
     return H.Pos >= H.Size - 1 ? NULL : H.Lines[++H.Pos];
 }
 
-STATIC CHAR *
+static CHAR *
 prev_hist()
 {
     return H.Pos == 0 ? NULL : H.Lines[--H.Pos];
 }
 
-STATIC STATUS
+static STATUS
 do_insert_hist(p)
     CHAR	*p;
 {
@@ -467,7 +579,7 @@
     return insert_string(p);
 }
 
-STATIC STATUS
+static STATUS
 do_hist(move)
     CHAR	*(*move)();
 {
@@ -482,25 +594,25 @@
     return do_insert_hist(p);
 }
 
-STATIC STATUS
+static STATUS
 h_next()
 {
     return do_hist(next_hist);
 }
 
-STATIC STATUS
+static STATUS
 h_prev()
 {
     return do_hist(prev_hist);
 }
 
-STATIC STATUS
+static STATUS
 h_first()
 {
     return do_insert_hist(H.Lines[H.Pos = 0]);
 }
 
-STATIC STATUS
+static STATUS
 h_last()
 {
     return do_insert_hist(H.Lines[H.Pos = H.Size - 1]);
@@ -509,7 +621,7 @@
 /*
 **  Return zero if pat appears as a substring in text.
 */
-STATIC int
+static int
 substrcmp(text, pat, len)
     char	*text;
     char	*pat;
@@ -525,7 +637,7 @@
     return 1;
 }
 
-STATIC CHAR *
+static CHAR *
 search_hist(search, move)
     CHAR	*search;
     CHAR	*(*move)();
@@ -566,11 +678,11 @@
     return NULL;
 }
 
-STATIC STATUS
+static STATUS
 h_search()
 {
     static int	Searching;
-    CONST char	*old_prompt;
+    const char	*old_prompt;
     CHAR	*(*move)();
     CHAR	*p;
 
@@ -592,7 +704,7 @@
     return do_insert_hist(p);
 }
 
-STATIC STATUS
+static STATUS
 fd_char()
 {
     int		i;
@@ -606,7 +718,7 @@
     return CSstay;
 }
 
-STATIC void
+static void
 save_yank(begin, i)
     int		begin;
     int		i;
@@ -619,13 +731,13 @@
     if (i < 1)
 	return;
 
-    if ((Yanked = NEW(CHAR, (SIZE_T)i + 1)) != NULL) {
+    if ((Yanked = NEW(CHAR, (size_t)i + 1)) != NULL) {
 	COPYFROMTO(Yanked, &Line[begin], i);
 	Yanked[i] = '\0';
     }
 }
 
-STATIC STATUS
+static STATUS
 delete_string(count)
     int		count;
 {
@@ -668,7 +780,7 @@
     return CSmove;
 }
 
-STATIC STATUS
+static STATUS
 bk_char()
 {
     int		i;
@@ -683,7 +795,7 @@
     return CSstay;
 }
 
-STATIC STATUS
+static STATUS
 bk_del_char()
 {
     int		i;
@@ -698,7 +810,7 @@
     return delete_string(i);
 }
 
-STATIC STATUS
+static STATUS
 redisplay()
 {
     TTYputs((CHAR *)NEWLINE);
@@ -707,7 +819,7 @@
     return CSmove;
 }
 
-STATIC STATUS
+static STATUS
 kill_line()
 {
     int		i;
@@ -733,7 +845,7 @@
     return CSstay;
 }
 
-STATIC STATUS
+static STATUS
 insert_char(c)
     int		c;
 {
@@ -760,7 +872,7 @@
     return s;
 }
 
-STATIC STATUS
+static STATUS
 meta()
 {
     unsigned int	c;
@@ -768,7 +880,6 @@
 
     if ((c = TTYget()) == EOF)
 	return CSeof;
-#if	defined(ANSI_ARROWS)
     /* Also include VT-100 arrows. */
     if (c == '[' || c == 'O')
 	switch (c = TTYget()) {
@@ -779,7 +890,6 @@
 	case 'C':	return fd_char();
 	case 'D':	return bk_char();
 	}
-#endif	/* defined(ANSI_ARROWS) */
 
     if (isdigit(c)) {
 	for (Repeat = c - '0'; (c = TTYget()) != EOF && isdigit(c); )
@@ -798,7 +908,7 @@
     return ring_bell();
 }
 
-STATIC STATUS
+static STATUS
 emacs(c)
     unsigned int	c;
 {
@@ -820,7 +930,7 @@
     return s;
 }
 
-STATIC STATUS
+static STATUS
 TTYspecial(c)
     unsigned int	c;
 {
@@ -848,7 +958,7 @@
     return CSdispatch;
 }
 
-STATIC CHAR *
+static CHAR *
 editinput()
 {
     unsigned int	c;
@@ -886,7 +996,7 @@
     return NULL;
 }
 
-STATIC void
+static void
 hist_add(p)
     CHAR	*p;
 {
@@ -905,24 +1015,9 @@
     H.Pos = H.Size - 1;
 }
 
-/*
-**  For compatibility with FSF readline.
-*/
-/* ARGSUSED0 */
-void
-rl_reset_terminal(p)
-    char	*p;
-{
-}
-
-void
-rl_initialize()
-{
-}
-
 char *
 readline(prompt)
-    CONST char	*prompt;
+    const char	*prompt;
 {
     CHAR	*line;
 
@@ -965,7 +1060,7 @@
 }
 
 
-STATIC STATUS
+static STATUS
 beg_line()
 {
     if (Point) {
@@ -975,13 +1070,13 @@
     return CSstay;
 }
 
-STATIC STATUS
+static STATUS
 del_char()
 {
     return delete_string(Repeat == NO_ARG ? 1 : Repeat);
 }
 
-STATIC STATUS
+static STATUS
 end_line()
 {
     if (Point != End) {
@@ -991,14 +1086,14 @@
     return CSstay;
 }
 
-STATIC STATUS
+static STATUS
 accept_line()
 {
     Line[End] = '\0';
     return CSdone;
 }
 
-STATIC STATUS
+static STATUS
 transpose()
 {
     CHAR	c;
@@ -1016,7 +1111,7 @@
     return CSstay;
 }
 
-STATIC STATUS
+static STATUS
 quote()
 {
     unsigned int	c;
@@ -1024,7 +1119,7 @@
     return (c = TTYget()) == EOF ? CSeof : insert_char((int)c);
 }
 
-STATIC STATUS
+static STATUS
 wipe()
 {
     int		i;
@@ -1042,14 +1137,14 @@
     return delete_string(Mark - Point);
 }
 
-STATIC STATUS
+static STATUS
 mk_set()
 {
     Mark = Point;
     return CSstay;
 }
 
-STATIC STATUS
+static STATUS
 exchange()
 {
     unsigned int	c;
@@ -1065,7 +1160,7 @@
     return CSstay;
 }
 
-STATIC STATUS
+static STATUS
 yank()
 {
     if (Yanked && *Yanked)
@@ -1073,7 +1168,7 @@
     return CSstay;
 }
 
-STATIC STATUS
+static STATUS
 copy_region()
 {
     if (Mark > End)
@@ -1087,7 +1182,7 @@
     return CSstay;
 }
 
-STATIC STATUS
+static STATUS
 move_to_char()
 {
     unsigned int	c;
@@ -1104,13 +1199,13 @@
     return CSstay;
 }
 
-STATIC STATUS
+static STATUS
 fd_word()
 {
     return do_forward(CSmove);
 }
 
-STATIC STATUS
+static STATUS
 fd_kill_word()
 {
     int		i;
@@ -1124,7 +1219,7 @@
     return CSstay;
 }
 
-STATIC STATUS
+static STATUS
 bk_word()
 {
     int		i;
@@ -1145,7 +1240,7 @@
     return CSstay;
 }
 
-STATIC STATUS
+static STATUS
 bk_kill_word()
 {
     (void)bk_word();
@@ -1154,7 +1249,7 @@
     return CSstay;
 }
 
-STATIC int
+static int
 argify(line, avp)
     CHAR	*line;
     CHAR	***avp;
@@ -1200,7 +1295,7 @@
     return ac;
 }
 
-STATIC STATUS
+static STATUS
 last_argument()
 {
     CHAR	**av;
@@ -1226,7 +1321,7 @@
     return s;
 }
 
-STATIC KEYMAP	Map[33] = {
+static KEYMAP	Map[33] = {
     {	CTL('@'),	ring_bell	},
     {	CTL('A'),	beg_line	},
     {	CTL('B'),	bk_char		},
@@ -1260,7 +1355,7 @@
     {	0,		NULL		}
 };
 
-STATIC KEYMAP	MetaMap[16]= {
+static KEYMAP	MetaMap[16]= {
     {	CTL('H'),	bk_kill_word	},
     {	DEL,		bk_kill_word	},
     {	' ',		mk_set	},
diff --git a/debugger/readline/Makefile.in b/debugger/readline/Makefile.in
deleted file mode 100644
index d3b0cad..0000000
--- a/debugger/readline/Makefile.in
+++ /dev/null
@@ -1,12 +0,0 @@
-TOPSRC     = @top_srcdir@
-EXTRA_DEFS = -DHIDE -DANSI_ARROWS
-
-MODULE = readline
-
-C_SRCS = editline.c sysunix.c
-
-all: $(MODULE).o
-
-@MAKE_RULES@
-
-### Dependencies:
diff --git a/debugger/readline/README b/debugger/readline/README
deleted file mode 100644
index c609789..0000000
--- a/debugger/readline/README
+++ /dev/null
@@ -1,45 +0,0 @@
-$Revision: 1.5 $
-
-This is a line-editing library.  It can be linked into almost any
-program to provide command-line editing and recall.
-
-It is call-compatible with the FSF readline library, but it is a
-fraction of the size (and offers fewer features).  It does not use
-standard I/O.  It is distributed under a "C News-like" copyright.
-
-Configuration is done in the Makefile.  Type "make testit" to get
-a small slow shell for testing.
-
-An earlier version was distributed with Byron's rc.  Principal
-changes over that version include:
-	Faster.
-	Is eight-bit clean (thanks to brendan@cs.widener.edu)
-	Written in K&R C, but ANSI compliant (gcc all warnings)
-	Propagates EOF properly; rc trip test now passes
-	Doesn't need or use or provide memmove.
-	More robust
-	Calling sequence changed to be compatible with readline.
-	Test program, new manpage, better configuration
-	More system-independant; includes Unix and OS-9 support.
-
-Enjoy,
-	Rich $alz
-	<rsalz@osf.org>
-
- Copyright 1992 Simmule Turner and Rich Salz.  All rights reserved.
-
- This software is not subject to any license of the American Telephone
- and Telegraph Company or of the Regents of the University of California.
-
- Permission is granted to anyone to use this software for any purpose on
- any computer system, and to alter it and redistribute it freely, subject
- to the following restrictions:
- 1. The authors are not responsible for the consequences of use of this
-    software, no matter how awful, even if they arise from flaws in it.
- 2. The origin of this software must not be misrepresented, either by
-    explicit claim or by omission.  Since few users ever read sources,
-    credits must appear in the documentation.
- 3. Altered versions must be plainly marked as such, and must not be
-    misrepresented as being the original software.  Since few users
-    ever read sources, credits must appear in the documentation.
- 4. This notice may not be removed or altered.
diff --git a/debugger/readline/editline.3 b/debugger/readline/editline.3
deleted file mode 100644
index 1d851ed..0000000
--- a/debugger/readline/editline.3
+++ /dev/null
@@ -1,175 +0,0 @@
-.\" $Revision: 1.1 $
-.TH EDITLINE 3
-.SH NAME
-editline \- command-line editing library with history
-.SH SYNOPSIS
-.nf
-.B "char *"
-.B "readline(prompt)"
-.B "     char	*prompt;"
-
-.B "void"
-.B "add_history(line)"
-.B "    char	*line;"
-.fi
-.SH DESCRIPTION
-.I Editline
-is a library that provides an line-editing interface with text recall.
-It is intended to be compatible with the
-.I readline
-library provided by the Free Software Foundation, but much smaller.
-The bulk of this manual page describes the user interface.
-.PP
-The
-.I readline
-routine returns a line of text with the trailing newline removed.
-The data is returned in a buffer allocated with
-.IR malloc (3),
-so the space should be released with
-.IR free (3)
-when the calling program is done with it.
-Before accepting input from the user, the specified
-.I prompt
-is displayed on the terminal.
-.PP
-The
-.I add_history
-routine makes a copy of the specified
-.I line
-and adds it to the internal history list.
-.SS "User Interface"
-A program that uses this library provides a simple emacs-like editing
-interface to its users.
-A line may be edited before it is sent to the calling program by typing either
-control characters or escape sequences.
-A control character, shown as a caret followed by a letter, is typed by
-holding down the ``control'' key while the letter is typed.
-For example, ``^A'' is a control-A.
-An escape sequence is entered by typing the ``escape'' key followed by one or
-more characters.
-The escape key is abbreviated as ``ESC.''
-Note that unlike control keys, case matters in escape sequences; ``ESC\ F''
-is not the same as ``ESC\ f''.
-.PP
-An editing command may be typed anywhere on the line, not just at the
-beginning.
-In addition, a return may also be typed anywhere on the line, not just at
-the end.
-.PP
-Most editing commands may be given a repeat count,
-.IR n ,
-where
-.I n
-is a number.
-To enter a repeat count, type the escape key, the number, and then
-the command to execute.
-For example, ``ESC\ 4\ ^f'' moves forward four characters.
-If a command may be given a repeat count then the text ``[n]'' is given at the
-end of its description.
-.PP
-The following control characters are accepted:
-.RS
-.nf
-.ta \w'ESC DEL  'u
-^A	Move to the beginning of the line
-^B	Move left (backwards) [n]
-^D	Delete character [n]
-^E	Move to end of line
-^F	Move right (forwards) [n]
-^G	Ring the bell
-^H	Delete character before cursor (backspace key) [n]
-^I	Complete filename (tab key); see below
-^J	Done with line (return key)
-^K	Kill to end of line (or column [n])
-^L	Redisplay line
-^M	Done with line (alternate return key)
-^N	Get next line from history [n]
-^P	Get previous line from history [n]
-^R	Search backward (forward if [n]) through history for text;
-\&	must start line if text begins with an uparrow
-^T	Transpose characters
-^V	Insert next character, even if it is an edit command
-^W	Wipe to the mark
-^X^X	Exchange current location and mark
-^Y	Yank back last killed text
-^[	Start an escape sequence (escape key)
-^]c	Move forward to next character ``c''
-^?	Delete character before cursor (delete key) [n]
-.fi
-.RE
-.PP
-The following escape sequences are provided.
-.RS
-.nf
-.ta \w'ESC DEL  'u
-ESC\ ^H	Delete previous word (backspace key) [n]
-ESC\ DEL	Delete previous word (delete key) [n]
-ESC\ SP	Set the mark (space key); see ^X^X and ^Y above
-ESC\ \.	Get the last (or [n]'th) word from previous line
-ESC\ \?	Show possible completions; see below
-ESC\ <	Move to start of history
-ESC\ >	Move to end of history
-ESC\ b	Move backward a word [n]
-ESC\ d	Delete word under cursor [n]
-ESC\ f	Move forward a word [n]
-ESC\ l	Make word lowercase [n]
-ESC\ u	Make word uppercase [n]
-ESC\ y	Yank back last killed text
-ESC\ v	Show library version
-ESC\ w	Make area up to mark yankable
-ESC\ nn	Set repeat count to the number nn
-ESC\ C	Read from environment variable ``_C_'', where C is
-\&	an uppercase letter
-.fi
-.RE
-.PP
-The
-.I editline
-library has a small macro facility.
-If you type the escape key followed by an uppercase letter,
-.IR C ,
-then the contents of the environment variable
-.I _C_
-are read in as if you had typed them at the keyboard.
-For example, if the variable
-.I _L_
-contains the following:
-.RS
-^A^Kecho '^V^[[H^V^[[2J'^M
-.RE
-Then typing ``ESC L'' will move to the beginning of the line, kill the
-entire line, enter the echo command needed to clear the terminal (if your
-terminal is like a VT-100), and send the line back to the shell.
-.PP
-The
-.I editline
-library also does filename completion.
-Suppose the root directory has the following files in it:
-.RS
-.nf
-.ta \w'core   'u
-bin	vmunix
-core	vmunix.old
-.fi
-.RE
-If you type ``rm\ /v'' and then the tab key.
-.I Editline
-will then finish off as much of the name as possible by adding ``munix''.
-Because the name is not unique, it will then beep.
-If you type the escape key and a question mark, it will display the
-two choices.
-If you then type a period and a tab, the library will finish off the filename
-for you:
-.RS
-.nf
-.RI "rm /v[TAB]" munix .TAB old
-.fi
-.RE
-The tab key is shown by ``[TAB]'' and the automatically-entered text
-is shown in italics.
-.SH "BUGS AND LIMITATIONS"
-Cannot handle lines more than 80 columns.
-.SH AUTHORS
-Simmule R. Turner <uunet.uu.net!capitol!sysgo!simmy>
-and Rich $alz <rsalz@osf.org>.
-Original manual page by DaviD W. Sanderson <dws@ssec.wisc.edu>.
diff --git a/debugger/readline/editline.h b/debugger/readline/editline.h
deleted file mode 100644
index fa16f3b..0000000
--- a/debugger/readline/editline.h
+++ /dev/null
@@ -1,49 +0,0 @@
-/*  $Revision: 1.3 $
-**
-**  Internal header file for editline library.
-*/
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-
-
-#define CRLF   "\r\n"
-
-
-#define SIZE_T	size_t
-#define CONST	const
-
-typedef unsigned char	CHAR;
-
-#if	defined(HIDE)
-#define STATIC	static
-#else
-#define STATIC	/* NULL */
-#endif	/* !defined(HIDE) */
-
-#define MEM_INC		64
-#define SCREEN_INC	256
-
-#define DISPOSE(p)	free((char *)(p))
-#define NEW(T, c)	\
-	((T *)malloc((unsigned int)(sizeof (T) * (c))))
-#define RENEW(p, T, c)	\
-	(p = (T *)realloc((char *)(p), (unsigned int)(sizeof (T) * (c))))
-#define COPYFROMTO(new, p, len)	\
-	(void)memcpy((char *)(new), (char *)(p), (int)(len))
-
-
-/*
-**  Variables and routines internal to this package.
-*/
-extern int	rl_eof;
-extern int	rl_erase;
-extern int	rl_intr;
-extern int	rl_kill;
-extern int	rl_quit;
-extern char	*rl_complete();
-extern int	rl_list_possib();
-extern void	rl_ttyset();
-extern void	rl_add_slash();
diff --git a/debugger/readline/sysunix.c b/debugger/readline/sysunix.c
deleted file mode 100644
index 010744e1..0000000
--- a/debugger/readline/sysunix.c
+++ /dev/null
@@ -1,89 +0,0 @@
-/*  $Revision: 1.1 $
-**
-**  Unix system-dependant routines for editline library.
-*/
-#include "editline.h"
-
-#if	defined(HAVE_TCGETATTR)
-#include <termios.h>
-
-void
-rl_ttyset(Reset)
-    int				Reset;
-{
-    static struct termios	old;
-    struct termios		new;
-
-    if (Reset == 0) {
-	(void)tcgetattr(0, &old);
-	rl_erase = old.c_cc[VERASE];
-	rl_kill = old.c_cc[VKILL];
-	rl_eof = old.c_cc[VEOF];
-	rl_intr = old.c_cc[VINTR];
-	rl_quit = old.c_cc[VQUIT];
-
-	new = old;
-	new.c_cc[VINTR] = -1;
-	new.c_cc[VQUIT] = -1;
-	new.c_lflag &= ~(ECHO | ICANON);
-	new.c_iflag &= ~(ISTRIP | INPCK);
-	new.c_cc[VMIN] = 1;
-	new.c_cc[VTIME] = 0;
-	(void)tcsetattr(0, TCSANOW, &new);
-    }
-    else
-	(void)tcsetattr(0, TCSANOW, &old);
-}
-
-#else
-#include <sgtty.h>
-
-void
-rl_ttyset(Reset)
-    int				Reset;
-{
-    static struct sgttyb	old_sgttyb;
-    static struct tchars	old_tchars;
-    struct sgttyb		new_sgttyb;
-    struct tchars		new_tchars;
-
-    if (Reset == 0) {
-	(void)ioctl(0, TIOCGETP, &old_sgttyb);
-	rl_erase = old_sgttyb.sg_erase;
-	rl_kill = old_sgttyb.sg_kill;
-
-	(void)ioctl(0, TIOCGETC, &old_tchars);
-	rl_eof = old_tchars.t_eofc;
-	rl_intr = old_tchars.t_intrc;
-	rl_quit = old_tchars.t_quitc;
-
-	new_sgttyb = old_sgttyb;
-	new_sgttyb.sg_flags &= ~ECHO;
-	new_sgttyb.sg_flags |= RAW;
-#if	defined(PASS8)
-	new_sgttyb.sg_flags |= PASS8;
-#endif	/* defined(PASS8) */
-	(void)ioctl(0, TIOCSETP, &new_sgttyb);
-
-	new_tchars = old_tchars;
-	new_tchars.t_intrc = -1;
-	new_tchars.t_quitc = -1;
-	(void)ioctl(0, TIOCSETC, &new_tchars);
-    }
-    else {
-	(void)ioctl(0, TIOCSETP, &old_sgttyb);
-	(void)ioctl(0, TIOCSETC, &old_tchars);
-    }
-}
-#endif	/* defined(HAVE_TCGETATTR) */
-
-void
-rl_add_slash(path, p)
-    char	*path;
-    char	*p;
-{
-    struct stat	Sb;
-
-    if (stat(path, &Sb) >= 0)
-	(void)strcat(p, S_ISDIR(Sb.st_mode) ? "/" : " ");
-}
diff --git a/files/Makefile.in b/files/Makefile.in
index cf17c1c..ae0a951 100644
--- a/files/Makefile.in
+++ b/files/Makefile.in
@@ -1,5 +1,8 @@
-TOPSRC = @top_srcdir@
-MODULE = files
+prefix     = @prefix@
+sysconfdir = @sysconfdir@
+DEFS       = -D__WINE__  -DETCDIR=\"$(sysconfdir)\"
+TOPSRC     = @top_srcdir@
+MODULE     = files
 
 C_SRCS = \
 	directory.c \
diff --git a/files/file.c b/files/file.c
index 3264c08..7d30397 100644
--- a/files/file.c
+++ b/files/file.c
@@ -848,7 +848,7 @@
 /***********************************************************************
  *           _lcreat_uniq   (Not a Windows API)
  */
-HFILE _lcreat_uniq( LPCSTR path, INT attr )
+HFILE _lcreat_uniq( LPCSTR path, INT32 attr )
 {
     DOS_FILE *file;
     HFILE handle;
diff --git a/files/profile.c b/files/profile.c
index ec45261..63a3028 100644
--- a/files/profile.c
+++ b/files/profile.c
@@ -53,6 +53,7 @@
 /* Check for comments in profile */
 #define IS_ENTRY_COMMENT(str)  ((str)[0] == ';')
 
+#define WINE_INI_GLOBAL ETCDIR "/wine.conf"
 
 /***********************************************************************
  *           PROFILE_CopyEntry
@@ -562,6 +563,26 @@
 
 
 /***********************************************************************
+ *           PROFILE_GetWineIniInt
+ *
+ * Get a config integer from the wine.ini file.
+ */
+int PROFILE_GetWineIniInt( const char *section, const char *key_name, int def )
+{
+    char buffer[20];
+    char *p;
+    long result;
+
+    PROFILEKEY *key = PROFILE_Find( &WineProfile, section, key_name, FALSE );
+    if (!key || !key->value) return def;
+    PROFILE_CopyEntry( buffer, key->value, sizeof(buffer), TRUE );
+    result = strtol( buffer, &p, 0 );
+    if (p == buffer) return 0;  /* No digits at all */
+    return (int)result;
+}
+
+
+/***********************************************************************
  *           PROFILE_LoadWineIni
  *
  * Load the wine.ini file.
diff --git a/if1632/Makefile.in b/if1632/Makefile.in
index 1158685..3774434 100644
--- a/if1632/Makefile.in
+++ b/if1632/Makefile.in
@@ -1,5 +1,5 @@
+DEFS   = -D__WINE__ -DNO_TRANSITION_TYPES
 TOPSRC = @top_srcdir@
-
 MODULE = if1632
 
 DLLS	= \
diff --git a/if1632/comctl32.spec b/if1632/comctl32.spec
index 668d7a9..f6b93fa 100644
--- a/if1632/comctl32.spec
+++ b/if1632/comctl32.spec
@@ -17,7 +17,7 @@
 12 stub LBItemFromPt
 13 stub DrawInsert
 14 stub CreateUpDownControl
-15 stub InitCommonControls
+15 return InitCommonControls 4 0
 16 stub CreateStatusWindowW
 17 stub CreateToolbarEx
 18 stub DestroyPropertySheetPage
diff --git a/if1632/gdi.spec b/if1632/gdi.spec
index 92186e3..24b13b8 100644
--- a/if1632/gdi.spec
+++ b/if1632/gdi.spec
@@ -64,7 +64,7 @@
 54  pascal16 CreateEllipticRgn(s_word s_word s_word s_word) CreateEllipticRgn
 55  pascal16 CreateEllipticRgnIndirect(ptr) CreateEllipticRgnIndirect16
 56  pascal16 CreateFont(s_word s_word s_word s_word s_word word word word
-                        word word word word word ptr) CreateFont
+                        word word word word word ptr) CreateFont16
 57  pascal16 CreateFontIndirect(ptr) CreateFontIndirect16
 58  pascal16 CreateHatchBrush(word long) CreateHatchBrush
 60  pascal16 CreatePatternBrush(word) CreatePatternBrush
@@ -241,12 +241,12 @@
 354 stub ShrinkGDIHeap
 355 stub FTrapping0
 360 pascal16 CreatePalette(ptr) CreatePalette
-361 pascal16 GDISelectPalette(word word) GDISelectPalette
+361 pascal16 GDISelectPalette(word word word) GDISelectPalette
 362 pascal16 GDIRealizePalette(word) GDIRealizePalette
 363 pascal16 GetPaletteEntries(word word word ptr) GetPaletteEntries
 364 pascal16 SetPaletteEntries(word word word ptr) SetPaletteEntries
 365 pascal16 RealizeDefaultPalette(word) RealizeDefaultPalette
-366 stub UpdateColors
+366 pascal16 UpdateColors(word) UpdateColors
 367 pascal16 AnimatePalette(word word word ptr) AnimatePalette
 368 pascal16 ResizePalette(word word) ResizePalette
 370 pascal16 GetNearestPaletteIndex(word long) GetNearestPaletteIndex
@@ -271,7 +271,7 @@
 409 stub CREATEUSERDISCARDABLEBITMAP
 410 stub ISVALIDMETAFILE
 411 pascal16 GetCurLogFont(word) GetCurLogFont
-412 stub IsDCCurrentPalette
+412 pascal16 IsDCCurrentPalette(word) IsDCCurrentPalette
 439 pascal16 StretchDIBits (word s_word s_word word word word word
                                word word ptr ptr word long) StretchDIBits
 440 pascal16 SetDIBits(word word word word ptr ptr word) SetDIBits
diff --git a/if1632/gdi32.spec b/if1632/gdi32.spec
index bf606d2..f145907 100644
--- a/if1632/gdi32.spec
+++ b/if1632/gdi32.spec
@@ -45,17 +45,19 @@
 0040 stdcall CreateEllipticRgnIndirect(ptr) CreateEllipticRgnIndirect32
 0041 stub CreateEnhMetaFileA
 0042 stub CreateEnhMetaFileW
-0043 stub CreateFontA
+0043 stdcall CreateFontA(long long long long long long long long
+                        long long long long long ptr) CreateFont32A
 0044 stdcall CreateFontIndirectA(ptr) CreateFontIndirect32A
 0045 stdcall CreateFontIndirectW(ptr) CreateFontIndirect32W
-0046 stub CreateFontW
+0046 stdcall CreateFontW(long long long long long long long long
+                        long long long long long ptr) CreateFont32W
 0047 stub CreateHalftonePalette
 0048 stub CreateHatchBrush
 0049 stdcall CreateICA(ptr ptr ptr ptr) CreateIC
 0050 stub CreateICW
 0051 stub CreateMetaFileA
 0052 stub CreateMetaFileW
-0053 stub CreatePalette
+0053 stdcall CreatePalette(ptr) CreatePalette
 0054 stub CreatePatternBrush
 0055 stdcall CreatePen(long long long) CreatePen
 0056 stub CreatePenIndirect
@@ -282,7 +284,7 @@
 0277 stub PolylineTo
 0278 stdcall PtInRegion(long long long) PtInRegion
 0279 stub PtVisible
-0280 stdcall RealizePalette(long) RealizePalette32
+0280 stdcall RealizePalette(long) RealizePalette
 0281 stdcall RectInRegion(long ptr) RectInRegion32
 0282 stdcall RectVisible(long ptr) RectVisible32
 0283 stdcall Rectangle(long long long long long) Rectangle
@@ -302,7 +304,7 @@
 0297 stub SelectClipRgn
 0298 stub SelectFontLocal
 0299 stdcall SelectObject(long long) SelectObject
-0300 stdcall SelectPalette(long long long) SelectPalette32
+0300 stdcall SelectPalette(long long long) SelectPalette
 0301 stub SetAbortProc
 0302 stub SetArcDirection
 0303 stdcall SetBitmapBits(long long ptr) SetBitmapBits
@@ -334,7 +336,7 @@
 0328 stub SetPixelFormat
 0329 stub SetPixelV
 0330 stub SetPolyFillMode
-0331 stub SetROP2
+0331 stdcall SetROP2(long long) SetROP2
 0332 stdcall SetRectRgn(long long long long long) SetRectRgn
 0333 stub SetRelAbs
 0334 stub SetStretchBltMode
diff --git a/if1632/kernel.spec b/if1632/kernel.spec
index 4111ce2..a607a33 100644
--- a/if1632/kernel.spec
+++ b/if1632/kernel.spec
@@ -56,13 +56,13 @@
 57  pascal16 GetProfileInt(ptr ptr s_word) GetProfileInt
 58  pascal16 GetProfileString(ptr ptr ptr ptr word) GetProfileString
 59  pascal16 WriteProfileString(ptr ptr ptr) WriteProfileString
-60  pascal16 FindResource(word segptr segptr) FindResource
-61  pascal16 LoadResource(word word) LoadResource
-62  pascal LockResource(word) WIN16_LockResource
-63  pascal16 FreeResource(word) FreeResource
-64  pascal16 AccessResource(word word) AccessResource
-65  pascal SizeofResource(word word) SizeofResource
-66  pascal16 AllocResource(word word long) AllocResource
+60  pascal16 FindResource(word segptr segptr) FindResource16
+61  pascal16 LoadResource(word word) LoadResource16
+62  pascal LockResource(word) WIN16_LockResource16
+63  pascal16 FreeResource(word) FreeResource16
+64  pascal16 AccessResource(word word) AccessResource16
+65  pascal SizeofResource(word word) SizeofResource16
+66  pascal16 AllocResource(word word long) AllocResource16
 67  stub SetResourceHandler
 68  pascal16 InitAtomTable(word) InitAtomTable
 69  pascal16 FindAtom(segptr) FindAtom
diff --git a/if1632/kernel32.spec b/if1632/kernel32.spec
index eb8dfff..7378cce 100644
--- a/if1632/kernel32.spec
+++ b/if1632/kernel32.spec
@@ -524,7 +524,7 @@
 0519 stub SetVolumeLabelW
 0520 stub SetupComm
 0521 stub ShowConsoleCursor
-0522 stdcall SizeofResource(long long) SizeofResource
+0522 stdcall SizeofResource(long long) SizeofResource32
 0523 	stdcall Sleep(long) Sleep
 0524 stub SleepEx
 0525 stub SuspendThread
diff --git a/if1632/relay.c b/if1632/relay.c
index 9ecb6da..8401948 100644
--- a/if1632/relay.c
+++ b/if1632/relay.c
@@ -19,22 +19,11 @@
 dprintf_relay
 #endif
 
-  /* Saved 16-bit stack for current process (Win16 only) */
-WORD IF1632_Saved16_ss = 0;
-WORD IF1632_Saved16_sp = 0;
-
-  /* Saved 32-bit stack for current process (Win16 only) */
-DWORD IF1632_Saved32_esp = 0;
-SEGPTR IF1632_Stack32_base = 0;
-
-  /* Original Unix stack */
-DWORD IF1632_Original32_esp;
-
 
 /***********************************************************************
  *           RELAY_Init
  */
-BOOL RELAY_Init(void)
+BOOL32 RELAY_Init(void)
 {
     WORD codesel;
 
@@ -127,7 +116,7 @@
 /***********************************************************************
  *           RELAY_DebugCallFrom16Ret
  */
-void RELAY_DebugCallFrom16Ret( int func_type, int ret_val, int args32 )
+void RELAY_DebugCallFrom16Ret( int func_type, int ret_val, SIGCONTEXT *context)
 {
     STACK16FRAME *frame;
     WORD ordinal;
@@ -156,13 +145,10 @@
     case 2: /* regs */
         printf( "retval=none ret=%04x:%04x ds=%04x\n",
                 frame->cs, frame->ip, frame->ds );
-        {
-            SIGCONTEXT *context = (SIGCONTEXT *)&args32;
-            printf( "     AX=%04x BX=%04x CX=%04x DX=%04x SI=%04x DI=%04x ES=%04x EFL=%08lx\n",
-                    AX_reg(context), BX_reg(context), CX_reg(context),
-                    DX_reg(context), SI_reg(context), DI_reg(context),
-                    ES_reg(context), EFL_reg(context) );
-        }
+        printf( "     AX=%04x BX=%04x CX=%04x DX=%04x SI=%04x DI=%04x ES=%04x EFL=%08lx\n",
+                AX_reg(context), BX_reg(context), CX_reg(context),
+                DX_reg(context), SI_reg(context), DI_reg(context),
+                ES_reg(context), EFL_reg(context) );
         break;
     }
 }
@@ -274,7 +260,7 @@
 /**********************************************************************
  *	     Catch    (KERNEL.55)
  */
-INT Catch( LPCATCHBUF lpbuf )
+INT16 Catch( LPCATCHBUF lpbuf )
 {
     STACK16FRAME *pFrame = CURRENT_STACK16;
 
@@ -298,7 +284,7 @@
 /**********************************************************************
  *	     Throw    (KERNEL.56)
  */
-int Throw( LPCATCHBUF lpbuf, int retval )
+INT16 Throw( LPCATCHBUF lpbuf, INT16 retval )
 {
     STACK16FRAME *pFrame;
 
diff --git a/if1632/shell32.spec b/if1632/shell32.spec
index 1f836b7..33a458d 100644
--- a/if1632/shell32.spec
+++ b/if1632/shell32.spec
@@ -10,7 +10,7 @@
 0005 stub DllGetClassObject
 0006 stub DoEnvironmentSubstA
 0007 stub DoEnvironmentSubstW
-0008 stub DragAcceptFiles
+0008 stdcall DragAcceptFiles(long long) DragAcceptFiles
 0009 stub DragFinish
 0010 stub DragQueryFile
 0011 stub DragQueryFileA
diff --git a/if1632/user.spec b/if1632/user.spec
index fbe9fb1..52ff7e7 100644
--- a/if1632/user.spec
+++ b/if1632/user.spec
@@ -149,7 +149,7 @@
 147 pascal16 SetClipboardViewer(word) SetClipboardViewer
 148 pascal16 GetClipboardViewer() GetClipboardViewer
 149 pascal16 ChangeClipboardChain(word ptr) ChangeClipboardChain
-150 pascal16 LoadMenu(word segptr) LoadMenu
+150 pascal16 LoadMenu(word segptr) LoadMenu16
 151 pascal16 CreateMenu() CreateMenu
 152 pascal16 DestroyMenu(word) DestroyMenu
 153 pascal16 ChangeMenu(word word segptr word word) ChangeMenu16
@@ -172,11 +172,11 @@
 170 pascal16 ArrangeIconicWindows(word) ArrangeIconicWindows
 171 pascal16 WinHelp(word ptr word long) WinHelp
 172 stub SwitchToThisWindow
-173 pascal16 LoadCursor(word segptr) LoadCursor
-174 pascal16 LoadIcon(word segptr) LoadIcon
-175 pascal16 LoadBitmap(word segptr) LoadBitmap
-176 pascal16 LoadString(word word ptr s_word) LoadString
-177 pascal16 LoadAccelerators(word segptr) LoadAccelerators
+173 pascal16 LoadCursor(word segptr) LoadCursor16
+174 pascal16 LoadIcon(word segptr) LoadIcon16
+175 pascal16 LoadBitmap(word segptr) LoadBitmap16
+176 pascal16 LoadString(word word ptr s_word) LoadString16
+177 pascal16 LoadAccelerators(word segptr) LoadAccelerators16
 178 pascal16 TranslateAccelerator(word word ptr) TranslateAccelerator
 179 pascal16 GetSystemMetrics(word) GetSystemMetrics
 180 pascal   GetSysColor(word) GetSysColor
@@ -187,8 +187,8 @@
 185 pascal16 GrayString(word word segptr segptr s_word s_word s_word s_word s_word) GrayString
 186 pascal16 SwapMouseButton(word) SwapMouseButton
 187 pascal16 EndMenu() EndMenu
-188 pascal16 SetSysModalWindow(word) SetSysModalWindow
-189 pascal16 GetSysModalWindow() GetSysModalWindow
+188 pascal16 SetSysModalWindow(word) SetSysModalWindow16
+189 pascal16 GetSysModalWindow() GetSysModalWindow16
 190 pascal16 GetUpdateRect(word ptr word) GetUpdateRect16
 191 pascal16 ChildWindowFromPoint(word long) ChildWindowFromPoint16
 192 pascal16 InSendMessage() InSendMessage
diff --git a/if1632/user32.spec b/if1632/user32.spec
index ce2432c..ef4b733 100644
--- a/if1632/user32.spec
+++ b/if1632/user32.spec
@@ -137,7 +137,7 @@
 0130 stdcall DestroyCaret() DestroyCaret
 0131 stub DestroyCursor
 0132 stub DestroyIcon
-0133 stub DestroyMenu
+0133 stdcall DestroyMenu(long) DestroyMenu
 0134 stdcall DestroyWindow(long) DestroyWindow
 0135 stdcall DialogBoxIndirectParamA(long ptr long ptr long) DialogBoxIndirectParam32A
 0136 stub DialogBoxIndirectParamAorW
@@ -358,28 +358,28 @@
 0351 stub IsZoomed
 0352 stdcall KillSystemTimer(long long) KillSystemTimer32
 0353 stdcall KillTimer(long long) KillTimer32
-0354 	stdcall LoadAcceleratorsA(long ptr) WIN32_LoadAcceleratorsA
-0355 stdcall LoadAcceleratorsW(long ptr)	WIN32_LoadAcceleratorsW
-0356 	stdcall LoadBitmapA(long ptr) WIN32_LoadBitmapA
-0357 	stdcall LoadBitmapW(long ptr) WIN32_LoadBitmapW
-0358 	stdcall LoadCursorA(long ptr) WIN32_LoadCursorA
+0354 stdcall LoadAcceleratorsA(long ptr) LoadAccelerators32A
+0355 stdcall LoadAcceleratorsW(long ptr) LoadAccelerators32W
+0356 stdcall LoadBitmapA(long ptr) LoadBitmap32A
+0357 stdcall LoadBitmapW(long ptr) LoadBitmap32W
+0358 stdcall LoadCursorA(long ptr) LoadCursor32A
 0359 stub LoadCursorFromFileA
 0360 stub LoadCursorFromFileW
-0361	stdcall LoadCursorW(long ptr) WIN32_LoadCursorW
-0362	stdcall LoadIconA(long ptr) WIN32_LoadIconA
-0363 	stdcall LoadIconW(long ptr) WIN32_LoadIconW
+0361 stdcall LoadCursorW(long ptr) LoadCursor32W
+0362 stdcall LoadIconA(long ptr) LoadIcon32A
+0363 stdcall LoadIconW(long ptr) LoadIcon32W
 0364 stub LoadImageA
 0365 stub LoadImageW
 0366 stub LoadKeyboardLayoutA
 0367 stub LoadKeyboardLayoutW
 0368 stub LoadLocalFonts
-0369 stdcall LoadMenuA(long ptr) WIN32_LoadMenuA
+0369 stdcall LoadMenuA(long ptr) LoadMenu32A
 0370 stdcall LoadMenuIndirectA(ptr) LoadMenuIndirect32A
 0371 stdcall LoadMenuIndirectW(ptr) LoadMenuIndirect32W
-0372 stdcall LoadMenuW(long ptr) WIN32_LoadMenuW
+0372 stdcall LoadMenuW(long ptr) LoadMenu32W
 0373 stub LoadRemoteFonts
-0374 	stdcall LoadStringA(long long ptr long) WIN32_LoadStringA
-0375 	stdcall LoadStringW(long long ptr long) WIN32_LoadStringW
+0374 stdcall LoadStringA(long long ptr long) LoadString32A
+0375 stdcall LoadStringW(long long ptr long) LoadString32W
 0376 stub LockWindowStation
 0377 stub LockWindowUpdate
 0378 stub LookupIconIdFromDirectory
@@ -434,7 +434,7 @@
 0427 stdcall RegisterClassExA(ptr) RegisterClassEx32A
 0428 stdcall RegisterClassExW(ptr) RegisterClassEx32W
 0429 stdcall RegisterClassW(ptr) RegisterClass32W
-0430 stub RegisterClipboardFormatA
+0430 stdcall RegisterClipboardFormatA(ptr) RegisterClipboardFormat
 0431 stub RegisterClipboardFormatW
 0432 stub RegisterHotKey
 0433 stub RegisterLogonProcess
diff --git a/if1632/winmm.spec b/if1632/winmm.spec
index b5c47c4..8254403 100644
--- a/if1632/winmm.spec
+++ b/if1632/winmm.spec
@@ -49,7 +49,7 @@
 0048 stub mciLoadCommandResource
 0049 stub mciSendCommandA
 0050 stub mciSendCommandW
-0051 stub mciSendStringA
+0051 stdcall mciSendStringA(ptr ptr long long) mciSendString
 0052 stub mciSendStringW
 0053 stub mciSetDriverData
 0054 stub mciSetYieldProc
diff --git a/include/callback.h b/include/callback.h
index 89d231a..6d2d7aa 100644
--- a/include/callback.h
+++ b/include/callback.h
@@ -123,7 +123,7 @@
 #define CallEnumObjectsProc( func, lpobj, lParam ) \
     (*func)( lpobj, lParam )
 #define CallEnumPropProc( func, hwnd, lpstr, data ) \
-    (*func)( hwnd, (LPCTSTR)(lpstr), data )
+    (*func)( hwnd, lpstr, data )
 #define CallEnumTaskWndProc( func, hwnd, lParam ) \
     (*func)( hwnd, lParam )
 #define CallEnumWindowsProc16( func, hwnd, lParam ) \
diff --git a/include/color.h b/include/color.h
index 61486d3..03a658b 100644
--- a/include/color.h
+++ b/include/color.h
@@ -1,17 +1,29 @@
 #ifndef __WINE_COLOR_H
 #define __WINE_COLOR_H
 
+#include "palette.h"
 #include "gdi.h"
 
-extern HPALETTE16 COLOR_Init(void);
-extern int COLOR_ToPhysical( DC *dc, COLORREF color );
-extern void COLOR_SetMapping( DC *dc, HANDLE map, HANDLE revMap, WORD size );
-extern BOOL COLOR_IsSolid( COLORREF color );
+#define COLOR_FIXED     0x0001          /* read-only colormap - have to use XAllocColor (if not virtual)*/
+#define COLOR_VIRTUAL   0x0002          /* no mapping needed - pixel == pixel color */
 
-extern Colormap COLOR_WinColormap;
-extern int COLOR_mapEGAPixel[16];
-extern int* COLOR_PaletteToPixel;
-extern int* COLOR_PixelToPalette;
-extern int COLOR_ColormapSize;
+#define COLOR_PRIVATE   0x1000          /* private colormap, identity mapping */
+
+#define PC_SYS_USED     0x80		/* system peFlags */
+#define PC_SYS_RESERVED 0x40
+
+extern HPALETTE16 	COLOR_Init(void);
+extern COLORREF		COLOR_ToLogical(int pixel);
+extern int 		COLOR_ToPhysical( DC *dc, COLORREF color );
+extern int 		COLOR_SetMapping( PALETTEOBJ* pal, BOOL mapOnly );
+extern BOOL 		COLOR_IsSolid( COLORREF color );
+extern Colormap		COLOR_GetColormap();
+extern UINT16		COLOR_GetSystemPaletteSize();
+extern UINT16		COLOR_GetSystemPaletteFlags();
+
+extern int 	COLOR_mapEGAPixel[16];
+extern int* 	COLOR_PaletteToPixel;
+extern int* 	COLOR_PixelToPalette;
+extern int 	COLOR_ColormapSize;
 
 #endif /* __WINE_COLOR_H */
diff --git a/include/config.h.in b/include/config.h.in
new file mode 100644
index 0000000..0bbdd70
--- /dev/null
+++ b/include/config.h.in
@@ -0,0 +1,25 @@
+/* include/config.h.in.  Generated automatically from configure.in by autoheader.  */
+
+/* Define to empty if the keyword does not work.  */
+#undef const
+
+/* Define if you need to in order for stat and other things to work.  */
+#undef _POSIX_SOURCE
+
+/* Define to `unsigned' if <sys/types.h> doesn't define.  */
+#undef size_t
+
+/* Define if the `S_IS*' macros in <sys/stat.h> do not work properly.  */
+#undef STAT_MACROS_BROKEN
+
+/* Define if you have the ANSI C header files.  */
+#undef STDC_HEADERS
+
+/* Define if you have the memmove function.  */
+#undef HAVE_MEMMOVE
+
+/* Define if you have the tcgetattr function.  */
+#undef HAVE_TCGETATTR
+
+/* Define if you have the usleep function.  */
+#undef HAVE_USLEEP
diff --git a/include/file.h b/include/file.h
index 8a63e3d..634ca76 100644
--- a/include/file.h
+++ b/include/file.h
@@ -21,6 +21,6 @@
 extern HFILE FILE_Dup( HFILE hFile );
 extern HFILE FILE_Dup2( HFILE hFile1, HFILE hFile2 );
 extern INT32 FILE_Read( HFILE hFile, LPVOID buffer, UINT32 count );
-extern INT _lcreat_uniq( LPCSTR path, INT attr );
+extern HFILE _lcreat_uniq( LPCSTR path, INT32 attr );
 
 #endif  /* __WINE_FILE_H */
diff --git a/include/gdi.h b/include/gdi.h
index 8a1ef42..86b68e9 100644
--- a/include/gdi.h
+++ b/include/gdi.h
@@ -152,14 +152,6 @@
     TEXTMETRIC16  metrics;
 } X_PHYSFONT;
 
-  /* X physical palette information */
-typedef struct
-{
-    HANDLE16  hMapping;     /* Color mapping table (or 0 for identity) */
-    HANDLE16  hRevMapping;  /* Reverse color mapping table */
-    WORD      mappingSize;
-} X_PHYSPALETTE;
-
   /* X-specific DC information */
 typedef struct
 {
@@ -168,7 +160,6 @@
     X_PHYSFONT    font;
     X_PHYSPEN     pen;
     X_PHYSBRUSH   brush;
-    X_PHYSPALETTE pal;
 } X_DC_INFO;
 
 
diff --git a/include/hook.h b/include/hook.h
index 3a4284a..4dcd375 100644
--- a/include/hook.h
+++ b/include/hook.h
@@ -17,8 +17,8 @@
 typedef struct
 {
     HANDLE16   next;               /* 00 Next hook in chain */
-    HOOKPROC   proc WINE_PACKED;   /* 02 Hook procedure */
-    short      id;                 /* 06 Hook id (WH_xxx) */
+    HOOKPROC16 proc WINE_PACKED;   /* 02 Hook procedure */
+    INT16      id;                 /* 06 Hook id (WH_xxx) */
     HQUEUE16   ownerQueue;         /* 08 Owner queue (0 for system hook) */
     HMODULE16  ownerModule;        /* 0a Owner module */
     WORD       inHookProc;         /* 0c TRUE if in this->proc */
@@ -28,9 +28,9 @@
 
 #define HOOK_MAGIC  ((int)'H' | (int)'K' << 8)  /* 'HK' */
 
-extern HANDLE HOOK_GetHook( short id , HQUEUE hQueue );
-extern DWORD HOOK_CallHooks( short id, short code,
-                             WPARAM wParam, LPARAM lParam );
+extern HANDLE16 HOOK_GetHook( INT16 id , HQUEUE16 hQueue );
+extern LRESULT HOOK_CallHooks( INT16 id, INT16 code,
+                               WPARAM16 wParam, LPARAM lParam );
 extern void HOOK_FreeModuleHooks( HMODULE16 hModule );
 extern void HOOK_FreeQueueHooks( HQUEUE16 hQueue );
 
diff --git a/include/ldt.h b/include/ldt.h
index 0daaade..78ab156 100644
--- a/include/ldt.h
+++ b/include/ldt.h
@@ -19,7 +19,7 @@
 typedef struct
 {
     unsigned long base;            /* base address */
-    unsigned long limit;           /* segment limit */
+    unsigned long limit;           /* segment limit (in pages or bytes) */
     int           seg_32bit;       /* is segment 32-bit? */
     int           read_only;       /* is segment read-only? */
     int           limit_in_pages;  /* is the limit in pages or bytes? */
diff --git a/include/libres.h b/include/libres.h
index a719692..b7e9dcd 100644
--- a/include/libres.h
+++ b/include/libres.h
@@ -11,11 +11,11 @@
 
 extern INT     LIBRES_AccessResource( HINSTANCE hModule, HRSRC hRsrc );
 extern HGLOBAL LIBRES_AllocResource( HINSTANCE hModule, HRSRC hRsrc, DWORD size );
-extern HRSRC   LIBRES_FindResource( HINSTANCE hModule, LPCSTR name, LPCSTR type );
+extern HRSRC32 LIBRES_FindResource( HINSTANCE hModule, LPCSTR name, LPCSTR type );
 extern BOOL    LIBRES_FreeResource( HGLOBAL handle );
-extern HGLOBAL LIBRES_LoadResource( HINSTANCE hModule, HRSRC hRsrc );
-extern LPVOID  LIBRES_LockResource( HGLOBAL handle );
-extern DWORD   LIBRES_SizeofResource( HINSTANCE hModule, HRSRC hRsrc );
+extern HGLOBAL32 LIBRES_LoadResource( HINSTANCE hModule, HRSRC32 hRsrc );
+extern LPVOID  LIBRES_LockResource( HGLOBAL32 handle );
+extern DWORD   LIBRES_SizeofResource( HINSTANCE hModule, HRSRC32 hRsrc );
 
 #endif /* WINELIB */
 
diff --git a/include/mmsystem.h b/include/mmsystem.h
index 45fb92c..063e995 100644
--- a/include/mmsystem.h
+++ b/include/mmsystem.h
@@ -1457,6 +1457,20 @@
 #define MCI_CONSTANT            8
 #define MCI_END_CONSTANT        9
 
+/* Mixer flags */
+#define MIXER_OBJECTF_HANDLE	0x80000000L
+#define MIXER_OBJECTF_MIXER	0x00000000L
+#define MIXER_OBJECTF_HMIXER	(MIXER_OBJECTF_HANDLE|MIXER_OBJECTF_MIXER)
+#define MIXER_OBJECTF_WAVEOUT	0x10000000L
+#define MIXER_OBJECTF_HWAVEOUT	(MIXER_OBJECTF_HANDLE|MIXER_OBJECTF_WAVEOUT)
+#define MIXER_OBJECTF_WAVEIN	0x20000000L
+#define MIXER_OBJECTF_HWAVEIN	(MIXER_OBJECTF_HANDLE|MIXER_OBJECTF_WAVEIN)
+#define MIXER_OBJECTF_MIDIOUT	0x30000000L
+#define MIXER_OBJECTF_HMIDIOUT	(MIXER_OBJECTF_HANDLE|MIXER_OBJECTF_MIDIOUT)
+#define MIXER_OBJECTF_MIDIIN	0x40000000L
+#define MIXER_OBJECTF_HMIDIIN	(MIXER_OBJECTF_HANDLE|MIXER_OBJECTF_MIDIIN)
+#define MIXER_OBJECTF_AUX	0x50000000L
+
 #define MAKEMCIRESOURCE(wRet, wRes) MAKELRESULT((wRet), (wRes))
 
 typedef struct {
diff --git a/include/options.h b/include/options.h
index 1bbbdd4..fffbbee 100644
--- a/include/options.h
+++ b/include/options.h
@@ -49,6 +49,7 @@
     int    ipc;             /* Use IPC mechanisms */
     WINE_LANGUAGE language; /* Current language */
     int    managed;	    /* Managed windows */
+    int    perfectGraphics; /* Favor correctness over speed for graphics */
 };
 
 extern struct options Options;
@@ -58,5 +59,7 @@
 extern int PROFILE_LoadWineIni(void);
 extern int PROFILE_GetWineIniString( const char *section, const char *key_name,
                                      const char *def, char *buffer, int len );
+extern int PROFILE_GetWineIniInt( const char *section, const char *key_name,
+                                  int def );
 
 #endif
diff --git a/include/palette.h b/include/palette.h
index 6345d7b..ce4519b 100644
--- a/include/palette.h
+++ b/include/palette.h
@@ -16,10 +16,13 @@
 {
     GDIOBJHDR   header;
     LOGPALETTE  logpalette WINE_PACKED;
+    int        *mapping;
 } PALETTEOBJ;
 
 #pragma pack(4)
 
 extern int PALETTE_GetObject( PALETTEOBJ * palette, int count, LPSTR buffer );
+extern BOOL PALETTE_DeleteObject( HPALETTE16 hpalette, PALETTEOBJ *palette );
+extern BOOL PALETTE_UnrealizeObject( HPALETTE16 hpalette, PALETTEOBJ *palette);
      
 #endif /* __WINE_PALETTE_H */
diff --git a/include/pe_image.h b/include/pe_image.h
index c174fa4..1336fff 100644
--- a/include/pe_image.h
+++ b/include/pe_image.h
@@ -14,7 +14,6 @@
 	int base_addr;
 	int load_addr;
 	int vma_size;
-	int resource_offset; /* offset to resource typedirectory in file */
 };
 
 typedef struct pe_data PE_MODULE;
diff --git a/include/resource.h b/include/resource.h
index e054b4f..7f202c0 100644
--- a/include/resource.h
+++ b/include/resource.h
@@ -43,13 +43,13 @@
 #define WINE_CONSTRUCTOR
 #endif
 
-extern int NE_AccessResource( HMODULE hModule, HRSRC hRsrc );
-extern BOOL NE_FreeResource( HMODULE hModule, HGLOBAL handle );
-extern HRSRC NE_FindResource( HMODULE hModule, SEGPTR typeId, SEGPTR resId );
-extern DWORD NE_SizeofResource( HMODULE hModule, HRSRC hRsrc );
-extern SEGPTR NE_LockResource( HMODULE hModule, HGLOBAL handle );
-extern HGLOBAL NE_AllocResource( HMODULE hModule, HRSRC hRsrc, DWORD size );
-extern HGLOBAL NE_LoadResource( HMODULE hModule,  HRSRC hRsrc );
+extern int NE_AccessResource( HMODULE16 hModule, HRSRC hRsrc );
+extern BOOL NE_FreeResource( HMODULE16 hModule, HGLOBAL handle );
+extern HRSRC NE_FindResource( HMODULE16 hModule, SEGPTR typeId, SEGPTR resId );
+extern DWORD NE_SizeofResource( HMODULE16 hModule, HRSRC hRsrc );
+extern SEGPTR NE_LockResource( HMODULE16 hModule, HGLOBAL handle );
+extern HGLOBAL NE_AllocResource( HMODULE16 hModule, HRSRC hRsrc, DWORD size );
+extern HGLOBAL NE_LoadResource( HMODULE16 hModule,  HRSRC hRsrc );
 
 extern HANDLE SYSRES_LoadResource( SYSTEM_RESOURCE id );
 extern void SYSRES_FreeResource( HANDLE handle );
diff --git a/include/resource32.h b/include/resource32.h
index 81d97d6..644b6ae 100644
--- a/include/resource32.h
+++ b/include/resource32.h
@@ -10,16 +10,6 @@
 
 #include <stddef.h>
 
-HANDLE32 FindResource32A( HINSTANCE hModule, LPCSTR name, LPCSTR type );
-HANDLE32 FindResource32W( HINSTANCE hModule, LPCWSTR name, LPCWSTR type );
-HANDLE32 LoadResource32( HINSTANCE hModule, HANDLE32 hRsrc );
-LPVOID LockResource32( HANDLE32 handle );
-BOOL FreeResource32( HANDLE32 handle );
-INT AccessResource32( HINSTANCE hModule, HRSRC hRsrc );
-DWORD SizeofResource32( HINSTANCE hModule, HRSRC hRsrc );
-int WIN32_LoadStringW(HINSTANCE instance, DWORD resource_id, LPWSTR buffer, int buflen);
-int WIN32_LoadStringA(HINSTANCE instance, DWORD resource_id, LPSTR buffer, int buflen);
-
 typedef struct _IMAGE_RESOURCE_DIRECTORY {
 	DWORD Characteristics;
 	DWORD TimeDateStamp;
@@ -46,9 +36,4 @@
 	WCHAR NameString[1];
 } IMAGE_RESOURCE_DIR_STRING_U, *PIMAGE_RESOURCE_DIR_STRING_U;
 
-HMENU WIN32_LoadMenuIndirectW(void *menu);
-HMENU WIN32_LoadMenuW(HANDLE instance, LPCWSTR name);
-HMENU WIN32_LoadMenuIndirectA(void *menu);
-HMENU WIN32_LoadMenuA(HANDLE instance,LPCSTR name);
-
 #endif  /* __WINE_RESOURCE32_H */
diff --git a/include/stackframe.h b/include/stackframe.h
index 77bb0e0..359e288 100644
--- a/include/stackframe.h
+++ b/include/stackframe.h
@@ -56,12 +56,12 @@
   /* Original Unix stack */
 extern DWORD IF1632_Original32_esp;
 
-#ifndef WINELIB
 #define CURRENT_STACK16 \
     ((STACK16FRAME *)PTR_SEG_OFF_TO_LIN(IF1632_Saved16_ss,IF1632_Saved16_sp))
 
 #define CURRENT_DS   (CURRENT_STACK16->ds)
 
+#ifndef WINELIB
   /* Make a segmented pointer from a pointer to a variable located */
   /* on the 32-bit stack for the current task. */
 #if 0
@@ -71,8 +71,6 @@
 #endif
 SEGPTR MAKE_SEGPTR(void *ptr);
 #else
-#define CURRENT_STACK16	   error.error
-#define CURRENT_DS         ((WORD)GetTaskDS())
 #define MAKE_SEGPTR(ptr)   ((SEGPTR)ptr)
 #endif
 
diff --git a/include/struct32.h b/include/struct32.h
index 0e43982..c0e88ce 100644
--- a/include/struct32.h
+++ b/include/struct32.h
@@ -25,6 +25,10 @@
 
 void STRUCT32_CREATESTRUCT32Ato16(const CREATESTRUCT32A*,CREATESTRUCT16*);
 void STRUCT32_CREATESTRUCT16to32A(const CREATESTRUCT16*,CREATESTRUCT32A*);
+void STRUCT32_MDICREATESTRUCT32Ato16( const MDICREATESTRUCT32A*,
+                                      MDICREATESTRUCT16*);
+void STRUCT32_MDICREATESTRUCT16to32A( const MDICREATESTRUCT16*,
+                                      MDICREATESTRUCT32A*);
 
 #pragma pack(1)
 
diff --git a/include/task.h b/include/task.h
index 307dd8e..2881c70 100644
--- a/include/task.h
+++ b/include/task.h
@@ -51,51 +51,51 @@
   /* Task database. See 'Windows Internals' p. 226 */
 typedef struct
 {
-    HTASK   hNext;                      /* Selector of next TDB */
-    WORD    sp;                         /* Stack pointer of task */
-    WORD    ss;                         /* Stack segment of task */
-    WORD    nEvents;                    /* Events for this task */
-    char    priority;                   /* Task priority, between -32 and 15 */
-    BYTE    unused1;
-    HGLOBAL hStack32;                   /* Handle to 32-bit stack */
-    HTASK   hSelf;                      /* Selector of this TDB */
-    HANDLE  hPrevInstance;              /* Previous instance of the module */
-    DWORD   esp;                        /* 32-bit stack pointer */
-    WORD    ctrlword8087;               /* 80x87 control word */
-    WORD    flags;                      /* Task flags */
-    UINT    error_mode;                 /* Error mode (see SetErrorMode) */
-    WORD    version;                    /* Expected Windows version */
-    HANDLE  hInstance;                  /* Instance handle for this task */
-    HMODULE hModule;                    /* Module handle */
-    HQUEUE  hQueue;                     /* Selector of task message queue */
-    HTASK   hParent;                    /* Selector of TDB of parent task */
-    WORD    signal_flags;               /* Flags related to signal handler */
-    DWORD   sighandler WINE_PACKED;     /* Signal handler */
-    DWORD   userhandler WINE_PACKED;    /* USER signal handler */
-    DWORD   discardhandler WINE_PACKED; /* Handler for GlobalDiscard() */
-    DWORD   int0 WINE_PACKED;           /* int 0 (divide by zero) handler */
-    DWORD   int2 WINE_PACKED;           /* int 2 (NMI) handler */
-    DWORD   int4 WINE_PACKED;           /* int 4 (INTO) handler */
-    DWORD   int6 WINE_PACKED;           /* int 6 (invalid opcode) handler */
-    DWORD   int7 WINE_PACKED;           /* int 7 (coprocessor) handler */
-    DWORD   int3e WINE_PACKED;          /* int 3e (80x87 emulator) handler */
-    DWORD   int75 WINE_PACKED;          /* int 75 (80x87 error) handler */
-    DWORD   compat_flags WINE_PACKED;   /* Compatibility flags */
-    BYTE    unused4[14];
-    HANDLE  hPDB;                       /* Selector of PDB (i.e. PSP) */
-    SEGPTR  dta WINE_PACKED;            /* Current DTA */
-    BYTE    curdrive;                   /* Current drive */
-    BYTE    curdir[65];                 /* Current directory */
-    WORD    nCmdShow;                   /* cmdShow parameter to WinMain */
-    HTASK   hYieldTo;                   /* Next task to schedule */
-    DWORD   dlls_to_init;               /* Ptr to list of DLL to initialize */
-    HANDLE  hCSAlias;                   /* Code segment alias for this TDB */
-    THUNKS  thunks WINE_PACKED;         /* Make proc instance thunks */
-    WORD    more_thunks[6*4];           /* Space for 6 more thunks */
-    BYTE    module_name[8];             /* Module name for task */
-    WORD    magic;                      /* TDB signature */
-    DWORD   unused7;
-    PDB     pdb;                        /* PDB for this task */
+    HTASK16   hNext;                      /* 00 Selector of next TDB */
+    WORD      sp;                         /* 02 Stack pointer of task */
+    WORD      ss;                         /* 04 Stack segment of task */
+    WORD      nEvents;                    /* 06 Events for this task */
+    char      priority;                   /* 08 Task priority, -32..15 */
+    BYTE      unused1;                    /* 09 */
+    HGLOBAL16 hStack32;                   /* 0a Handle to 32-bit stack */
+    HTASK16   hSelf;                      /* 0c Selector of this TDB */
+    HANDLE16  hPrevInstance;              /* 0e Previous instance of module */
+    DWORD     esp;                        /* 10 32-bit stack pointer */
+    WORD      ctrlword8087;               /* 14 80x87 control word */
+    WORD      flags;                      /* 16 Task flags */
+    UINT16    error_mode;                 /* 18 Error mode (see SetErrorMode)*/
+    WORD      version;                    /* 1a Expected Windows version */
+    HANDLE16  hInstance;                  /* 1c Instance handle for task */
+    HMODULE16 hModule;                    /* 1e Module handle */
+    HQUEUE16  hQueue;                     /* 20 Selector of task queue */
+    HTASK16   hParent;                    /* 22 Selector of TDB of parent */
+    WORD      signal_flags;               /* 24 Flags for signal handler */
+    DWORD     sighandler WINE_PACKED;     /* 26 Signal handler */
+    DWORD     userhandler WINE_PACKED;    /* 2a USER signal handler */
+    DWORD     discardhandler WINE_PACKED; /* 2e Handler for GlobalDiscard() */
+    DWORD     int0 WINE_PACKED;           /* 32 int 0 (divide by 0) handler */
+    DWORD     int2 WINE_PACKED;           /* 36 int 2 (NMI) handler */
+    DWORD     int4 WINE_PACKED;           /* 3a int 4 (INTO) handler */
+    DWORD     int6 WINE_PACKED;           /* 3e int 6 (invalid opc) handler */
+    DWORD     int7 WINE_PACKED;           /* 42 int 7 (coprocessor) handler */
+    DWORD     int3e WINE_PACKED;          /* 46 int 3e (80x87 emu) handler */
+    DWORD     int75 WINE_PACKED;          /* 4a int 75 (80x87 error) handler */
+    DWORD     compat_flags WINE_PACKED;   /* 4e Compatibility flags */
+    BYTE      unused4[14];                /* 52 */
+    HANDLE16  hPDB;                       /* 60 Selector of PDB (i.e. PSP) */
+    SEGPTR    dta WINE_PACKED;            /* 62 Current DTA */
+    BYTE      curdrive;                   /* 66 Current drive */
+    BYTE      curdir[65];                 /* 67 Current directory */
+    WORD      nCmdShow;                   /* a8 cmdShow parameter to WinMain */
+    HTASK16   hYieldTo;                   /* aa Next task to schedule */
+    DWORD     dlls_to_init;               /* ac Ptr to DLLs to initialize */
+    HANDLE16  hCSAlias;                   /* b0 Code segment for this TDB */
+    THUNKS    thunks WINE_PACKED;         /* b2 Make proc instance thunks */
+    WORD      more_thunks[6*4];           /* c2 Space for 6 more thunks */
+    BYTE      module_name[8];             /* f2 Module name for task */
+    WORD      magic;                      /* fa TDB signature */
+    DWORD     unused7;                    /* fc */
+    PDB       pdb;                        /* 100 PDB for this task */
 } TDB;
 
 #define TDB_MAGIC    ('T' | ('D' << 8))
@@ -107,10 +107,11 @@
 
 #pragma pack(4)
 
-extern BOOL TASK_Init(void);
-extern HTASK TASK_CreateTask( HMODULE hModule, HANDLE hInstance,
-                              HANDLE hPrevInstance, HANDLE hEnvironment,
-                              char *cmdLine, WORD cmdShow );
-extern void TASK_KillCurrentTask( int exitCode );
+extern BOOL32 TASK_Init(void);
+extern HTASK16 TASK_CreateTask( HMODULE16 hModule, HINSTANCE16 hInstance,
+                                HINSTANCE16 hPrevInstance,
+                                HANDLE16 hEnvironment, LPCSTR cmdLine,
+                                UINT16 cmdShow );
+extern void TASK_KillCurrentTask( INT16 exitCode );
 
 #endif /* _WINE_TASK_H */
diff --git a/include/windows.h b/include/windows.h
index 72fea65..396942a 100644
--- a/include/windows.h
+++ b/include/windows.h
@@ -8,9 +8,7 @@
 #include "wintypes.h"
 #include "winuser.h"
 
-#ifndef WINELIB
 #pragma pack(1)
-#endif
 
 /* The SIZE structure */
 
@@ -57,9 +55,7 @@
             ((p16)->x = (INT16)(p32)->x, (p16)->y = (INT16)(p32)->y)
 
 #define MAKEPOINT16(l) (*((POINT16 *)&(l)))
-#ifdef WINELIB16
-#define MAKEPOINT(l)  MAKEPOINT16(l)
-#endif
+#define MAKEPOINT WINELIB_NAME(MAKEPOINT)
 
 /* The RECT structure */
 
@@ -1116,6 +1112,11 @@
 	BYTE peRed, peGreen, peBlue, peFlags;
 } PALETTEENTRY, *LPPALETTEENTRY;
 
+/* Logical palette entry flags */
+#define PC_RESERVED     0x01
+#define PC_EXPLICIT     0x02
+#define PC_NOCOLLAPSE   0x04
+
 typedef struct
 { 
     WORD           palVersion;
@@ -1538,12 +1539,11 @@
 #define ONESTOPBIT	0
 #define ONE5STOPBITS	1
 #define TWOSTOPBITS	2
+
 #define IGNORE		0
-#ifdef WINELIB32
-#define INFINITE        0xFFFFFFFF
-#else
-#define INFINITE	0xFFFF
-#endif
+#define INFINITE16      0xFFFF
+#define INFINITE32      0xFFFFFFFF
+#define INFINITE WINELIB_NAME(INFINITE)
 
 #define CE_RXOVER	0x0001
 #define CE_OVERRUN	0x0002
@@ -2157,6 +2157,8 @@
 #define SWP_NOSENDCHANGING  0x0400
 #define SWP_DEFERERASE      0x2000
 
+#define HWND_BROADCAST	    ((HWND)0xffff)
+
 /* SetWindowPos() hwndInsertAfter field values */
 #define HWND_TOP            ((HWND)0)
 #define HWND_BOTTOM         ((HWND)1)
@@ -3177,19 +3179,20 @@
   DWORD   BatteryFullLifeTime;
 } SYSTEM_POWER_STATUS, *LPSYSTEM_POWER_STATUS;
 
-
-#ifndef WINELIB
 #pragma pack(4)
-#endif
 
 /* Declarations for functions that exist only in Win16 */
 
 WORD       AllocSelector(WORD);
 WORD       AllocSelectorArray(WORD);
+INT16      Catch(LPCATCHBUF);
+HANDLE16   FarGetOwner(HGLOBAL16);
+VOID       FarSetOwner(HGLOBAL16,HANDLE16);
 VOID       FillWindow(HWND16,HWND16,HDC16,HBRUSH16);
 WORD       FreeSelector(WORD);
 DWORD      GetBitmapDimension(HBITMAP16);
 HTASK16    GetCurrentTask(void);
+HMODULE16  GetExePtr(HANDLE16);
 HINSTANCE16 GetTaskDS(void);
 HQUEUE16   GetTaskQueue(HTASK16);
 BOOL16     LocalInit(HANDLE16,WORD,WORD);
@@ -3203,6 +3206,7 @@
 DWORD      SetViewportOrg(HDC16,INT16,INT16);
 DWORD      SetWindowExt(HDC16,INT16,INT16);
 DWORD      SetWindowOrg(HDC16,INT16,INT16);
+INT16      Throw(LPCATCHBUF,INT16);
 VOID       hmemcpy(LPVOID,LPCVOID,LONG);
 
 /* Declarations for functions that exist only in Win32 */
@@ -3266,6 +3270,7 @@
 INT16      OffsetRgn(HRGN32,INT32,INT32);
 HFILE      OpenFile(LPCSTR,OFSTRUCT*,UINT32);
 BOOL16     PtInRegion(HRGN32,INT32,INT32);
+UINT16     RealizePalette(HDC32);
 DWORD      RegCloseKey(HKEY);
 DWORD      RegFlushKey(HKEY);
 LONG       SetBitmapBits(HBITMAP32,LONG,LPCVOID);
@@ -3283,12 +3288,18 @@
 
 /* Declarations for functions that change between Win16 and Win32 */
 
+INT16      AccessResource16(HINSTANCE16,HRSRC16);
+INT32      AccessResource32(HINSTANCE32,HRSRC32);
+#define    AccessResource WINELIB_NAME(AccessResource)
 BOOL16     AdjustWindowRect16(LPRECT16,DWORD,BOOL16);
 BOOL32     AdjustWindowRect32(LPRECT32,DWORD,BOOL32);
 #define    AdjustWindowRect WINELIB_NAME(AdjustWindowRect)
 BOOL16     AdjustWindowRectEx16(LPRECT16,DWORD,BOOL16,DWORD);
 BOOL32     AdjustWindowRectEx32(LPRECT32,DWORD,BOOL32,DWORD);
 #define    AdjustWindowRectEx WINELIB_NAME(AdjustWindowRectEx)
+HGLOBAL16  AllocResource16(HINSTANCE16,HRSRC16,DWORD);
+HGLOBAL32  AllocResource32(HINSTANCE32,HRSRC32,DWORD);
+#define    AllocResource WINELIB_NAME(AllocResource)
 BOOL16     AppendMenu16(HMENU16,UINT16,UINT16,SEGPTR);
 BOOL32     AppendMenu32A(HMENU32,UINT32,UINT32,LPCSTR);
 BOOL32     AppendMenu32W(HMENU32,UINT32,UINT32,LPCWSTR);
@@ -3386,6 +3397,10 @@
 HRGN16     CreateEllipticRgnIndirect16(const RECT16 *);
 HRGN32     CreateEllipticRgnIndirect32(const RECT32 *);
 #define    CreateEllipticRgnIndirect WINELIB_NAME(CreateEllipticRgnIndirect)
+HFONT16    CreateFont16(INT16,INT16,INT16,INT16,INT16,BYTE,BYTE,BYTE,BYTE,BYTE,BYTE,BYTE,BYTE,LPCSTR);
+HFONT32    CreateFont32A(INT32,INT32,INT32,INT32,INT32,DWORD,DWORD,DWORD,DWORD,DWORD,DWORD,DWORD,DWORD,LPCSTR);
+HFONT32    CreateFont32W(INT32,INT32,INT32,INT32,INT32,DWORD,DWORD,DWORD,DWORD,DWORD,DWORD,DWORD,DWORD,LPCWSTR);
+#define    CreateFont WINELIB_NAME_AW(CreateFont)
 HFONT16    CreateFontIndirect16(const LOGFONT16*);
 HFONT32    CreateFontIndirect32A(const LOGFONT32A*);
 HFONT32    CreateFontIndirect32W(const LOGFONT32W*);
@@ -3496,6 +3511,10 @@
 INT16      FillRect16(HDC16,const RECT16*,HBRUSH16);
 INT32      FillRect32(HDC32,const RECT32*,HBRUSH32);
 #define    FillRect WINELIB_NAME(FillRect)
+HRSRC16    FindResource16(HINSTANCE16,SEGPTR,SEGPTR);
+HRSRC32    FindResource32A(HINSTANCE32,LPCSTR,LPCSTR);
+HRSRC32    FindResource32W(HINSTANCE32,LPCWSTR,LPCWSTR);
+#define    FindResource WINELIB_NAME_AW(FindResource)
 HWND16     FindWindow16(SEGPTR,LPCSTR);
 HWND32     FindWindow32A(LPCSTR,LPCSTR);
 HWND32     FindWindow32W(LPCWSTR,LPCWSTR);
@@ -3513,6 +3532,9 @@
 void       FreeProcInstance16(FARPROC16);
 #define    FreeProcInstance32(proc) /*nothing*/
 #define    FreeProcInstance WINELIB_NAME(FreeProcInstance)
+BOOL16     FreeResource16(HGLOBAL16);
+BOOL32     FreeResource32(HGLOBAL32);
+#define    FreeResource WINELIB_NAME(FreeResource)
 BOOL16     GetBitmapDimensionEx16(HBITMAP16,LPSIZE16);
 BOOL32     GetBitmapDimensionEx32(HBITMAP32,LPSIZE32);
 #define    GetBitmapDimensionEx WINELIB_NAME(GetBitmapDimensionEx)
@@ -3603,6 +3625,9 @@
 DWORD      GetShortPathName32A(LPCSTR,LPSTR,DWORD);
 DWORD      GetShortPathName32W(LPCWSTR,LPWSTR,DWORD);
 #define    GetShortPathName WINELIB_NAME_AW(GetShortPathName)
+HWND16     GetSysModalWindow16(void);
+#define    GetSysModalWindow32() ((HWND32)0)
+#define    GetSysModalWindow WINELIB_NAME(GetSysModalWindow)
 UINT16     GetSystemDirectory16(LPSTR,UINT16);
 UINT32     GetSystemDirectory32A(LPSTR,UINT32);
 UINT32     GetSystemDirectory32W(LPWSTR,UINT32);
@@ -3744,10 +3769,37 @@
 INT16      LZRead16(HFILE,SEGPTR,UINT16); 
 INT32      LZRead32(HFILE,LPVOID,UINT32); 
 #define    LZRead WINELIB_NAME(LZRead)
+HACCEL16   LoadAccelerators16(HINSTANCE16,SEGPTR);
+HACCEL32   LoadAccelerators32A(HINSTANCE32,LPCSTR);
+HACCEL32   LoadAccelerators32W(HINSTANCE32,LPCWSTR);
+#define    LoadAccelerators WINELIB_NAME_AW(LoadAccelerators)
+HBITMAP16  LoadBitmap16(HANDLE16,SEGPTR);
+HBITMAP32  LoadBitmap32A(HANDLE32,LPCSTR);
+HBITMAP32  LoadBitmap32W(HANDLE32,LPCWSTR);
+#define    LoadBitmap WINELIB_NAME(LoadBitmap)
+HCURSOR16  LoadCursor16(HINSTANCE16,SEGPTR);
+HCURSOR32  LoadCursor32A(HINSTANCE32,LPCSTR);
+HCURSOR32  LoadCursor32W(HINSTANCE32,LPCWSTR);
+#define    LoadCursor WINELIB_NAME_AW(LoadCursor)
+HICON16    LoadIcon16(HINSTANCE16,SEGPTR);
+HICON32    LoadIcon32A(HINSTANCE32,LPCSTR);
+HICON32    LoadIcon32W(HINSTANCE32,LPCWSTR);
+#define    LoadIcon WINELIB_NAME_AW(LoadIcon)
+HMENU16    LoadMenu16(HINSTANCE16,SEGPTR);
+HMENU32    LoadMenu32A(HINSTANCE32,LPCSTR);
+HMENU32    LoadMenu32W(HINSTANCE32,LPCWSTR);
+#define    LoadMenu WINELIB_NAME_AW(LoadMenu)
 HMENU16    LoadMenuIndirect16(LPCVOID);
 HMENU32    LoadMenuIndirect32A(LPCVOID);
 HMENU32    LoadMenuIndirect32W(LPCVOID);
 #define    LoadMenuIndirect WINELIB_NAME_AW(LoadMenuIndirect)
+HGLOBAL16  LoadResource16(HINSTANCE16,HRSRC16);
+HGLOBAL32  LoadResource32(HINSTANCE32,HRSRC32);
+#define    LoadResource WINELIB_NAME(LoadResource)
+INT16      LoadString16(HINSTANCE16,UINT16,LPSTR,INT16);
+INT32      LoadString32A(HINSTANCE32,UINT32,LPSTR,INT32);
+INT32      LoadString32W(HINSTANCE32,UINT32,LPWSTR,INT32);
+#define    LoadString WINELIB_NAME_AW(LoadString)
 HLOCAL16   LocalAlloc16(UINT16,WORD);
 HLOCAL32   LocalAlloc32(UINT32,DWORD);
 #define    LocalAlloc WINELIB_NAME(LocalAlloc)
@@ -3778,6 +3830,9 @@
 BOOL16     LocalUnlock16(HLOCAL16);
 BOOL32     LocalUnlock32(HLOCAL32);
 #define    LocalUnlock WINELIB_NAME(LocalUnlock)
+LPVOID     LockResource16(HGLOBAL16);
+LPVOID     LockResource32(HGLOBAL32);
+#define    LockResource WINELIB_NAME(LockResource)
 HGLOBAL16  LockSegment16(HGLOBAL16);
 #define    LockSegment32(handle) GlobalFix((HANDLE32)(handle))
 #define    LockSegment WINELIB_NAME(LockSegment)
@@ -3962,6 +4017,9 @@
 void       SetRectEmpty16(LPRECT16);
 void       SetRectEmpty32(LPRECT32);
 #define    SetRectEmpty WINELIB_NAME(SetRectEmpty)
+HWND16     SetSysModalWindow16(HWND16);
+#define    SetSysModalWindow32(hwnd) ((HWND32)0)
+#define    SetSysModalWindow WINELIB_NAME(SetSysModalWindow)
 UINT16     SetSystemTimer16(HWND16,UINT16,UINT16,TIMERPROC16);
 UINT32     SetSystemTimer32(HWND32,UINT32,UINT32,TIMERPROC32);
 #define    SetSystemTimer WINELIB_NAME(SetSystemTimer)
@@ -4092,7 +4150,37 @@
 
 #ifndef NO_TRANSITION_TYPES
 
-#ifndef WINELIB
+#ifdef __WINE__
+# ifdef WINELIB32
+typedef INT32 INT;
+typedef UINT32 UINT;
+typedef BOOL32 BOOL;
+typedef WPARAM32 WPARAM;
+typedef HANDLE32 HANDLE;
+typedef HANDLE32 HBITMAP;
+typedef HANDLE32 HBRUSH;
+typedef HANDLE32 HCURSOR;
+typedef HANDLE32 HDC;
+typedef HANDLE32 HDRVR;
+typedef HANDLE32 HFONT;
+typedef HANDLE32 HGLOBAL;
+typedef HANDLE32 HICON;
+typedef HANDLE32 HINSTANCE;
+typedef HANDLE32 HMENU;
+typedef HANDLE32 HMETAFILE;
+typedef HANDLE32 HMIDI;
+typedef HANDLE32 HMIDIIN;
+typedef HANDLE32 HMIDIOUT;
+typedef HANDLE32 HMMIO;
+typedef HANDLE32 HQUEUE;
+typedef HANDLE32 HRGN;
+typedef HANDLE32 HRSRC;
+typedef HANDLE32 HTASK;
+typedef HANDLE32 HWAVE;
+typedef HANDLE32 HWAVEIN;
+typedef HANDLE32 HWAVEOUT;
+typedef HANDLE32 HWND;
+# else  /* WINELIB32 */
 typedef INT16 INT;
 typedef UINT16 UINT;
 typedef BOOL16 BOOL;
@@ -4113,7 +4201,6 @@
 typedef HANDLE16 HMIDIIN;
 typedef HANDLE16 HMIDIOUT;
 typedef HANDLE16 HMMIO;
-typedef HANDLE16 HMODULE;
 typedef HANDLE16 HQUEUE;
 typedef HANDLE16 HRGN;
 typedef HANDLE16 HRSRC;
@@ -4122,8 +4209,8 @@
 typedef HANDLE16 HWAVEIN;
 typedef HANDLE16 HWAVEOUT;
 typedef HANDLE16 HWND;
-typedef FARPROC16 FARPROC;
-#endif  /* WINELIB */
+# endif  /* WINELIB32 */
+#endif  /* __WINE__ */
 
 /* Callback function pointers types. */
 
@@ -4135,7 +4222,7 @@
 typedef int (*GOBJENUMPROC)(LPVOID,LPARAM);
 /*typedef int (*MFENUMPROC)(HDC,HANDLETABLE*,METARECORD*,int,LPARAM);*/
 typedef int (*MFENUMPROC)(HDC,void*,void*,int,LPARAM);
-typedef BOOL (*PROPENUMPROC)(HWND,LPCTSTR,HANDLE);
+typedef BOOL (*PROPENUMPROC)(HWND,LPCSTR,HANDLE);
 #else
 typedef SEGPTR DRIVERPROC;
 typedef SEGPTR EDITWORDBREAKPROC;
@@ -4144,15 +4231,11 @@
 typedef SEGPTR MFENUMPROC;
 typedef SEGPTR PROPENUMPROC;
 #endif
-typedef FARPROC HOOKPROC;
 
-
-INT        AccessResource(HINSTANCE,HRSRC);
 ATOM       AddAtom(SEGPTR);
 INT        AddFontResource(LPCSTR);
 WORD       AllocCStoDSAlias(WORD);
 WORD       AllocDStoCSAlias(WORD);
-HGLOBAL    AllocResource(HINSTANCE,HRSRC,DWORD);
 BOOL       AnimatePalette(HPALETTE16,UINT,UINT,LPPALETTEENTRY);
 LPSTR      AnsiLower(LPSTR);
 UINT       AnsiLowerBuff(LPSTR,UINT);
@@ -4172,7 +4255,6 @@
 void       CalcChildScroll(HWND,WORD);
 BOOL       CallMsgFilter(SEGPTR,INT);
 LRESULT    CallNextHookEx(HHOOK,INT,WPARAM,LPARAM);
-INT        Catch(LPCATCHBUF);
 BOOL       ChangeClipboardChain(HWND,HWND);
 WORD       ChangeSelector(WORD,WORD);
 INT        CheckMenuItem(HMENU,UINT,UINT);
@@ -4194,7 +4276,6 @@
 HDC        CreateDC(LPCSTR,LPCSTR,LPCSTR,const DEVMODE*);
 HBRUSH     CreateDIBPatternBrush(HGLOBAL,UINT);
 HBITMAP    CreateDIBitmap(HDC,BITMAPINFOHEADER*,DWORD,LPVOID,BITMAPINFO*,UINT);
-HFONT      CreateFont(INT,INT,INT,INT,INT,BYTE,BYTE,BYTE,BYTE,BYTE,BYTE,BYTE,BYTE,LPCSTR);
 HBRUSH     CreateHatchBrush(INT,COLORREF);
 HDC        CreateIC(LPCSTR,LPCSTR,LPCSTR,const DEVMODE*);
 HICON      CreateIcon(HINSTANCE,INT,INT,BYTE,BYTE,const BYTE*,const BYTE*);
@@ -4248,21 +4329,17 @@
 int        ExcludeVisRect(HDC,short,short,short,short);
 BOOL       ExitWindows(DWORD,WORD);
 HICON      ExtractIcon(HINSTANCE,LPCSTR,WORD);
-HANDLE16   FarGetOwner(HANDLE16);
-void       FarSetOwner(HANDLE16,HANDLE16);
 void       FatalAppExit(UINT,LPCSTR);
 void       FatalExit(int);
 BOOL       FillRgn(HDC,HRGN,HBRUSH);
 ATOM       FindAtom(SEGPTR);
 HINSTANCE  FindExecutable(LPCSTR,LPCSTR,LPSTR);
-HRSRC      FindResource(HINSTANCE,SEGPTR,SEGPTR);
 BOOL       FlashWindow(HWND,BOOL);
 int        FlushComm(int,int);
 BOOL       FrameRgn(HDC,HRGN,HBRUSH,int,int);
 void       FreeLibrary(HANDLE);
-BOOL       FreeResource(HGLOBAL);
 UINT       GDIRealizePalette(HDC);
-HPALETTE16 GDISelectPalette(HDC,HPALETTE16);
+HPALETTE16 GDISelectPalette(HDC,HPALETTE16,WORD);
 HWND       GetActiveWindow(void);
 DWORD      GetAspectRatioFilter(HDC);
 int        GetAsyncKeyState(int);
@@ -4279,8 +4356,8 @@
 int        GetClipboardFormatName(WORD,LPSTR,short);
 HWND       GetClipboardOwner(void);
 HWND       GetClipboardViewer(void);
-HANDLE     GetCodeHandle(FARPROC);
-void       GetCodeInfo(FARPROC,LPVOID);
+HANDLE     GetCodeHandle(FARPROC16);
+void       GetCodeInfo(FARPROC16,LPVOID);
 int        GetCommError(int,COMSTAT*);
 UINT       GetCommEventMask(int,int);
 int        GetCommState(int,DCB*);
@@ -4304,7 +4381,6 @@
 WORD       GetDlgItemInt(HWND,WORD,BOOL*,BOOL);
 WORD       GetDoubleClickTime(void);
 int        GetEnvironment(LPSTR,LPSTR,WORD);
-HMODULE    GetExePtr(HANDLE);
 HWND       GetFocus(void);
 DWORD      GetFreeSpace(UINT16);
 DWORD      GetHeapSpaces(HMODULE16);
@@ -4334,7 +4410,7 @@
 int        GetModuleFileName(HANDLE,LPSTR,short);
 HMODULE16  GetModuleHandle(LPCSTR);
 int        GetModuleUsage(HANDLE);
-FARPROC    GetMouseEventProc(void);
+FARPROC16  GetMouseEventProc(void);
 DWORD      GetNearestColor(HDC,DWORD);
 WORD       GetNearestPaletteIndex(HPALETTE16,DWORD);
 HWND       GetNextDlgGroupItem(HWND,HWND,BOOL);
@@ -4364,7 +4440,6 @@
 WORD       GetStretchBltMode(HDC);
 HMENU      GetSubMenu(HMENU,short);
 COLORREF   GetSysColor(short);
-HWND       GetSysModalWindow(void);
 HMENU      GetSystemMenu(HWND,BOOL);
 int        GetSystemMetrics(WORD);
 WORD       GetSystemPaletteEntries(HDC,WORD,WORD,LPPALETTEENTRY);
@@ -4399,13 +4474,13 @@
 void       GlobalFreeAll(HGLOBAL16);
 HGLOBAL16  GlobalLRUNewest(HGLOBAL16);
 HGLOBAL16  GlobalLRUOldest(HGLOBAL16);
-void       GlobalNotify(FARPROC);
+void       GlobalNotify(FARPROC16);
 WORD       GlobalPageLock(HGLOBAL16);
 WORD       GlobalPageUnlock(HGLOBAL16);
 BOOL16     GlobalUnWire(HGLOBAL16);
 void       GlobalUnfix(HGLOBAL16);
 SEGPTR     GlobalWire(HGLOBAL16);
-BOOL       GrayString(HDC,HBRUSH,FARPROC,LPARAM,INT,INT,INT,INT,INT);
+BOOL       GrayString(HDC,HBRUSH,FARPROC16,LPARAM,INT,INT,INT,INT,INT);
 BOOL       HiliteMenuItem(HWND,HMENU,UINT,UINT);
 BOOL       InSendMessage(void);
 WORD       InitAtomTable(WORD);
@@ -4433,19 +4508,11 @@
 BOOL       IsWindowVisible(HWND);
 BOOL       IsZoomed(HWND);
 void       LimitEmsPages(DWORD);
-void       LineDDA(short,short,short,short,FARPROC,long);
+void       LineDDA(short,short,short,short,FARPROC16,long);
 BOOL       LineTo(HDC,short,short);
-HANDLE     LoadAccelerators(HANDLE,SEGPTR);
-HBITMAP    LoadBitmap(HANDLE,SEGPTR);
-HCURSOR    LoadCursor(HANDLE,SEGPTR);
-HICON      LoadIcon(HANDLE,SEGPTR);
 HANDLE     LoadLibrary(LPCSTR);
-HMENU      LoadMenu(HANDLE,SEGPTR);
 HANDLE     LoadModule(LPCSTR,LPVOID);
-HGLOBAL    LoadResource(HINSTANCE,HRSRC);
-int        LoadString(HANDLE,WORD,LPSTR,int);
-FARPROC    LocalNotify(FARPROC);
-LPVOID     LockResource(HGLOBAL);
+FARPROC16  LocalNotify(FARPROC16);
 HMENU      LookupMenuHandle(HMENU,INT);
 WORD       MapVirtualKey(WORD,WORD);
 void       MessageBeep(WORD);
@@ -4482,7 +4549,6 @@
 BOOL       PtVisible(HDC,short,short);
 int        ReadComm(int,LPSTR,int);
 WORD       RealizeDefaultPalette(HDC);
-UINT       RealizePalette(HDC);
 BOOL       Rectangle(HDC,INT,INT,INT,INT);
 WORD       RegisterClipboardFormat(LPCSTR);
 void       ReleaseCapture(void);
@@ -4546,7 +4612,7 @@
 BOOL       SetProp(HWND,SEGPTR,HANDLE);
 WORD       SetROP2(HDC,WORD);
 WORD       SetRelAbs(HDC,WORD);
-FARPROC    SetResourceHandler(HANDLE,LPSTR,FARPROC);
+FARPROC16  SetResourceHandler(HANDLE,LPSTR,FARPROC16);
 int        SetScrollPos(HWND,int,int,BOOL);
 void       SetScrollRange(HWND,int,int,int,BOOL);
 WORD       SetSelectorBase(WORD,DWORD);
@@ -4555,7 +4621,6 @@
 WORD       SetStretchBltMode(HDC,WORD);
 LONG       SetSwapAreaSize(WORD);
 void       SetSysColors(int,LPINT16,COLORREF*);
-HWND       SetSysModalWindow(HWND);
 WORD       SetSystemPaletteUse(HDC,WORD);
 BOOL       SetSystemPowerState(BOOL, BOOL);
 BOOL       SetSystemTime(const SYSTEMTIME*);
@@ -4572,14 +4637,14 @@
 int        SetVoiceThreshold(int,int);
 BOOL       SetWinDebugInfo(LPWINDEBUGINFO);
 BOOL       SetWindowPos(HWND,HWND,INT,INT,INT,INT,WORD);
-FARPROC    SetWindowsHook(short,FARPROC);
-HHOOK      SetWindowsHookEx(short,HOOKPROC,HINSTANCE,HTASK);
+FARPROC16  SetWindowsHook(short,HOOKPROC16);
+HHOOK      SetWindowsHookEx(INT16,HOOKPROC16,HINSTANCE,HTASK);
 HINSTANCE  ShellExecute(HWND,LPCSTR,LPCSTR,LPSTR,LPCSTR,INT);
 int        ShowCursor(BOOL);
 void       ShowOwnedPopups(HWND,BOOL);
 void       ShowScrollBar(HWND,WORD,BOOL);
 BOOL       ShowWindow(HWND,int);
-DWORD      SizeofResource(HINSTANCE,HRSRC);
+DWORD      SizeofResource(HMODULE16,HRSRC);
 VOID       Sleep(DWORD); /* Win32 */
 int        StartSound(void);
 int        StopSound(void);
@@ -4592,14 +4657,13 @@
 int        SyncAllVoices(void);
 BOOL       SystemParametersInfo(UINT,UINT,LPVOID,UINT);
 LONG       TabbedTextOut(HDC,short,short,LPSTR,short,short,LPINT16,short);
-int        Throw(LPCATCHBUF,int);
 int        ToAscii(WORD,WORD,LPSTR,LPVOID,WORD);
 int        TranslateAccelerator(HWND,HANDLE,LPMSG16);
 BOOL       TranslateMDISysAccel(HWND,LPMSG16);
 BOOL       TranslateMessage(LPMSG16);
 int        TransmitCommChar(int,char);
 int        UngetCommChar(int,char);
-BOOL       UnhookWindowsHook(short,FARPROC);
+BOOL       UnhookWindowsHook(short,HOOKPROC16);
 BOOL       UnhookWindowsHookEx(HHOOK);
 BOOL       UnrealizeObject(HBRUSH);
 int        UpdateColors(HDC);
diff --git a/include/winsock.h b/include/winsock.h
index c22e2e1..0fb3202 100644
--- a/include/winsock.h
+++ b/include/winsock.h
@@ -196,7 +196,7 @@
 INT WSAGetLastError(void);
 BOOL WSAIsBlocking(void);
 INT WSAUnhookBlockingHook(void);
-FARPROC WSASetBlockingHook(FARPROC lpBlockFunc);
+FARPROC16 WSASetBlockingHook(FARPROC16 lpBlockFunc);
 INT WSACancelBlockingCall(void);
 HANDLE WSAAsyncGetServByName(HWND hWnd, u_int wMsg,
                              LPCSTR name, LPCSTR proto,
diff --git a/include/wintypes.h b/include/wintypes.h
index 9fe61f2..5a61ec9 100644
--- a/include/wintypes.h
+++ b/include/wintypes.h
@@ -7,6 +7,15 @@
 #ifndef __WINE_WINTYPES_H
 #define __WINE_WINTYPES_H
 
+#ifdef __WINE__
+#include "config.h"
+#endif
+
+#if !defined(__WINE__) && !defined(WINELIB)
+/* If we are not compiling Wine, then we are using Winelib */
+#define WINELIB
+#endif
+
 #ifdef WINELIB
 # ifdef WINELIB16
 #  undef WINELIB32
@@ -28,7 +37,10 @@
 /* Macros to map Winelib names to the correct implementation name */
 /* depending on WINELIB16, WINELIB32 and UNICODE macros.          */
 
-#ifdef WINELIB
+#ifdef __WINE__
+# define WINELIB_NAME(func)      this is a syntax error
+# define WINELIB_NAME_AW(func)   this is a syntax error
+#else  /* __WINE__ */
 # ifdef WINELIB32
 #  define WINELIB_NAME(func)     func##32
 #  ifdef UNICODE
@@ -40,18 +52,15 @@
 #  define WINELIB_NAME(func)     func##16
 #  define WINELIB_NAME_AW(func)  func##16
 # endif  /* WINELIB32 */
-#else   /* WINELIB */
-# define WINELIB_NAME(func)      this is a syntax error
-# define WINELIB_NAME_AW(func)   this is a syntax error
-#endif  /* WINELIB */
+#endif  /* __WINE__ */
 
-#ifdef WINELIB
-# define DECL_WINELIB_TYPE(type)     typedef WINELIB_NAME(type) type
-# define DECL_WINELIB_TYPE_AW(type)  typedef WINELIB_NAME_AW(type) type
-#else   /* WINELIB */
+#ifdef __WINE__
 # define DECL_WINELIB_TYPE(type)     /* nothing */
 # define DECL_WINELIB_TYPE_AW(type)  /* nothing */
-#endif  /* WINELIB */
+#else   /* __WINE__ */
+# define DECL_WINELIB_TYPE(type)     typedef WINELIB_NAME(type) type
+# define DECL_WINELIB_TYPE_AW(type)  typedef WINELIB_NAME_AW(type) type
+#endif  /* __WINE__ */
 
 /* Standard data types. These are the same for emulator and library. */
 
@@ -86,6 +95,7 @@
 typedef INT16           HFILE;
 typedef HANDLE32        HHOOK;
 typedef HANDLE32        HKEY;
+typedef HANDLE32        HMIXEROBJ;
 
 /* Pointers types. These are the same for emulator and library. */
 
@@ -104,6 +114,7 @@
 typedef INT32          *LPINT32;
 typedef UINT32         *LPUINT32;
 typedef HKEY           *LPHKEY;
+typedef HMIXEROBJ      *LPHMIXEROBJ;
 
 /* Special case: a segmented pointer is just a pointer in the library. */
 
@@ -153,6 +164,7 @@
 
 typedef LRESULT (*DLGPROC16)(HWND16,UINT16,WPARAM16,LPARAM);
 typedef LRESULT (*FARPROC16)();
+typedef LRESULT (*HOOKPROC16)(INT16,WPARAM16,LPARAM);
 typedef VOID (*TIMERPROC16)(HWND16,UINT16,UINT16,DWORD);
 typedef LRESULT (*WNDENUMPROC16)(HWND16,LPARAM);
 typedef LRESULT (*WNDPROC16)(HWND16,UINT16,WPARAM16,LPARAM);
@@ -161,6 +173,7 @@
 
 typedef LRESULT (*DLGPROC32)(HWND32,UINT32,WPARAM32,LPARAM);
 typedef LRESULT (*FARPROC32)();
+typedef LRESULT (*HOOKPROC32)(INT32,WPARAM32,LPARAM);
 typedef VOID (*TIMERPROC32)(HWND32,UINT32,UINT32,DWORD);
 typedef LRESULT (*WNDENUMPROC32)(HWND32,LPARAM);
 typedef LRESULT (*WNDPROC32)(HWND32,UINT32,WPARAM32,LPARAM);
@@ -169,7 +182,7 @@
 /* These types are _not_ defined for the emulator, because they */
 /* depend on the UNICODE macro that only exists in user's code. */
 
-#ifdef WINELIB
+#ifndef __WINE__
 # if defined(WINELIB32) && defined(UNICODE)
 typedef WCHAR TCHAR;
 typedef LPWSTR LPTSTR;
@@ -179,7 +192,7 @@
 typedef LPSTR LPTSTR;
 typedef LPCSTR LPCTSTR;
 # endif /* WINELIB32 && UNICODE */
-#endif   /* WINELIB */
+#endif   /* __WINE__ */
 
 /* Data types specific to the library. These do _not_ exist in the emulator. */
 
@@ -247,7 +260,7 @@
 
 /* Define some empty macros for compatibility with Windows code. */
 
-#ifdef WINELIB
+#ifndef __WINE__
 #define CALLBACK
 #define NEAR
 #define FAR
@@ -257,15 +270,15 @@
 #define _near
 #define _pascal
 #define __export
-#endif  /* WINELIB */
+#endif  /* __WINE__ */
 
 /* Macro for structure packing. */
 
-#ifdef WINELIB
-#define WINE_PACKED
-#else
+#ifdef __GNUC__
 #define WINE_PACKED __attribute__ ((packed))
-#endif  /* WINELIB */
+#else
+#define WINE_PACKED  /* nothing */
+#endif
 
 /* Macros to split words and longs. */
 
@@ -289,7 +302,7 @@
 
 /* Macros to access unaligned or wrong-endian WORDs and DWORDs. */
 
-#if !defined(WINELIB) || defined(__i386__)
+#ifdef __i386__
 #define PUT_WORD(ptr,w)   (*(WORD *)(ptr) = (w))
 #define GET_WORD(ptr)     (*(WORD *)(ptr))
 #define PUT_DWORD(ptr,dw) (*(DWORD *)(ptr) = (dw))
@@ -303,7 +316,7 @@
                            PUT_WORD((WORD *)(ptr)+1,HIWORD(dw)))
 #define GET_DWORD(ptr)    ((DWORD)(GET_WORD(ptr) | \
                                    ((DWORD)GET_WORD((WORD *)(ptr)+1) << 16)))
-#endif  /* !WINELIB || __i386__ */
+#endif  /* __i386__ */
 
 /* MIN and MAX macros */
 
diff --git a/include/winuser.h b/include/winuser.h
index 4cba875..9cd6041 100644
--- a/include/winuser.h
+++ b/include/winuser.h
@@ -40,6 +40,8 @@
     LPCWSTR     lpszClassName;
 } WNDCLASS32W, *LPWNDCLASS32W;
 
+#pragma pack(1)
+
 typedef struct
 {
     UINT16      style;
@@ -54,6 +56,8 @@
     SEGPTR      lpszClassName WINE_PACKED;
 } WNDCLASS16, *LPWNDCLASS16;
 
+#pragma pack(4)
+
 typedef struct
 {
     UINT32      cbSize;
diff --git a/ipc/Makefile.in b/ipc/Makefile.in
index a2c368b..cd5ec96 100644
--- a/ipc/Makefile.in
+++ b/ipc/Makefile.in
@@ -1,3 +1,4 @@
+DEFS   = -D__WINE__
 TOPSRC = @top_srcdir@
 MODULE = ipc
 
diff --git a/library/Makefile.in b/library/Makefile.in
index 22e8a1e..ed3aade 100644
--- a/library/Makefile.in
+++ b/library/Makefile.in
@@ -1,3 +1,4 @@
+DEFS   = -D__WINE__
 TOPSRC = @top_srcdir@
 MODULE = library
 
diff --git a/library/libres.c b/library/libres.c
index f3c4e5a..f7b450e 100644
--- a/library/libres.c
+++ b/library/libres.c
@@ -32,7 +32,7 @@
 /**********************************************************************
  *	    LIBRES_FindResource    
  */
-HRSRC LIBRES_FindResource( HINSTANCE hModule, LPCSTR name, LPCSTR type )
+HRSRC32 LIBRES_FindResource( HINSTANCE hModule, LPCSTR name, LPCSTR type )
 {
   int nameid=0,typeid;
   ResListE* ResBlock;
@@ -68,12 +68,12 @@
     for(Res=ResBlock->Resources; *Res; Res++)
       if(name)
       {
-	if((*Res)->type==typeid && !lstrcmpi((*Res)->name,name))
-	  return (HRSRC)*Res;
+	if((*Res)->type==typeid && !lstrcmpi32A((*Res)->name,name))
+	  return (HRSRC32)*Res;
       }
       else
 	if((*Res)->type==typeid && (*Res)->id==nameid)
-	  return (HRSRC)*Res;
+	  return (HRSRC32)*Res;
   return 0;
 }
 
@@ -81,16 +81,16 @@
 /**********************************************************************
  *	    LIBRES_LoadResource    
  */
-HGLOBAL LIBRES_LoadResource( HINSTANCE hModule, HRSRC hRsrc )
+HGLOBAL32 LIBRES_LoadResource( HINSTANCE hModule, HRSRC32 hRsrc )
 {
-  return (HGLOBAL)(((struct resource*)hRsrc)->bytes);
+  return (HGLOBAL32)(((struct resource*)hRsrc)->bytes);
 }
 
 
 /**********************************************************************
  *	    LIBRES_LockResource    
  */
-LPVOID LIBRES_LockResource( HGLOBAL handle )
+LPVOID LIBRES_LockResource( HGLOBAL32 handle )
 {
   return (LPVOID)handle;
 }
@@ -118,7 +118,7 @@
 /**********************************************************************
  *	    LIBRES_SizeofResource    
  */
-DWORD LIBRES_SizeofResource( HINSTANCE hModule, HRSRC hRsrc )
+DWORD LIBRES_SizeofResource( HINSTANCE hModule, HRSRC32 hRsrc )
 {
   return (DWORD)(((struct resource*)hRsrc)->size);
 }
diff --git a/library/miscstubs.c b/library/miscstubs.c
index ca70c35..0f3d9a0 100644
--- a/library/miscstubs.c
+++ b/library/miscstubs.c
@@ -41,7 +41,7 @@
   }
 }
 
-WORD CallTo16_word_ ( FARPROC func, WORD arg ) { return func(arg); }
+WORD CallTo16_word_ ( FARPROC16 func, WORD arg ) { return func(arg); }
 
 extern LRESULT AboutDlgProc(HWND,UINT,WPARAM,LPARAM);
 extern LRESULT ColorDlgProc(HWND,UINT,WPARAM,LPARAM);
@@ -60,22 +60,16 @@
 extern LRESULT ScrollBarWndProc(HWND,UINT,WPARAM,LPARAM);
 extern LRESULT StaticWndProc(HWND,UINT,WPARAM,LPARAM);
 extern LRESULT SystemMessageBoxProc(HWND,UINT,WPARAM,LPARAM);
-extern LRESULT TASK_Reschedule(HWND,UINT,WPARAM,LPARAM);
-
-LRESULT ErrorProc(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam)
-{
-  fprintf(stderr,"ERROR: ErrorProc() called!\n");
-  return 0;
-}
+extern LRESULT TASK_Reschedule(void);
 
 /***********************************************************************
  *           MODULE_GetWndProcEntry16 (not a Windows API function)
  *
  * Return an entry point from the WPROCS dll.
  */
-WNDPROC MODULE_GetWndProcEntry16( char *name )
+FARPROC16 MODULE_GetWndProcEntry16( char *name )
 {
-#define MAP_STR_TO_PROC(str,proc) if(!strcmp(name,str))return proc
+#define MAP_STR_TO_PROC(str,proc) if(!strcmp(name,str))return (FARPROC16)proc
   MAP_STR_TO_PROC("AboutDlgProc",AboutDlgProc);
   MAP_STR_TO_PROC("ColorDlgProc",ColorDlgProc);
   MAP_STR_TO_PROC("ComboBoxWndProc",ComboBoxWndProc);
@@ -96,7 +90,7 @@
   MAP_STR_TO_PROC("SystemMessageBoxProc",SystemMessageBoxProc);
   MAP_STR_TO_PROC("TASK_Reschedule",TASK_Reschedule);
   fprintf(stderr,"warning: No mapping for %s(), add one in library/miscstubs.c\n",name);
-  return ErrorProc;
+  return NULL;
 }
 
 void DEBUG_EnterDebugger(void)
diff --git a/loader/Makefile.in b/loader/Makefile.in
index 166ce95..ba99e39 100644
--- a/loader/Makefile.in
+++ b/loader/Makefile.in
@@ -1,3 +1,4 @@
+DEFS   = -D__WINE__
 TOPSRC = @top_srcdir@
 MODULE = loader
 
diff --git a/loader/builtin.c b/loader/builtin.c
index 73ebcd5..4717f66 100644
--- a/loader/builtin.c
+++ b/loader/builtin.c
@@ -199,7 +199,7 @@
  */
 HMODULE16 BUILTIN_LoadModule( LPCSTR name, BOOL16 force )
 {
-    HMODULE hModule;
+    HMODULE16 hModule;
     NE_MODULE *pModule;
     BUILTIN_DLL *table;
     char dllname[16], *p;
diff --git a/loader/module.c b/loader/module.c
index 63c44e2..31a998b 100644
--- a/loader/module.c
+++ b/loader/module.c
@@ -194,7 +194,7 @@
  */
 void MODULE_WalkModules(void)
 {
-    HMODULE hModule = hFirstModule;
+    HMODULE16 hModule = hFirstModule;
     fprintf( stderr, "Module Flags Name\n" );
     while (hModule)
     {
@@ -369,6 +369,84 @@
 
 
 /***********************************************************************
+ *           MODULE_CreateDummyModule
+ *
+ * Create a dummy NE module for Win32 or Winelib.
+ */
+HMODULE16 MODULE_CreateDummyModule( const OFSTRUCT *ofs )
+{
+    HMODULE16 hModule;
+    NE_MODULE *pModule;
+    SEGTABLEENTRY *pSegment;
+    char *pStr;
+
+    INT32 of_size = sizeof(OFSTRUCT) - sizeof(ofs->szPathName)
+                    + strlen(ofs->szPathName) + 1;
+    INT32 size = sizeof(NE_MODULE) +
+                 /* loaded file info */
+                 of_size +
+                 /* segment table: DS,CS */
+                 2 * sizeof(SEGTABLEENTRY) +
+                 /* name table */
+                 9 +
+                 /* several empty tables */
+                 8;
+
+    hModule = GlobalAlloc16( GMEM_MOVEABLE | GMEM_ZEROINIT, size );
+    if (!hModule) return (HMODULE16)11;  /* invalid exe */
+
+    FarSetOwner( hModule, hModule );
+    pModule = (NE_MODULE *)GlobalLock16( hModule );
+
+    /* Set all used entries */
+    pModule->magic            = NE_SIGNATURE;
+    pModule->count            = 1;
+    pModule->next             = 0;
+    pModule->flags            = 0;
+    pModule->dgroup           = 1;
+    pModule->ss               = 1;
+    pModule->cs               = 2;
+    pModule->heap_size        = 0xe000;
+    pModule->stack_size       = 0x1000;
+    pModule->seg_count        = 2;
+    pModule->modref_count     = 0;
+    pModule->nrname_size      = 0;
+    pModule->fileinfo         = sizeof(NE_MODULE);
+    pModule->os_flags         = NE_OSFLAGS_WINDOWS;
+    pModule->expected_version = 0x030a;
+    pModule->self             = hModule;
+
+    /* Set loaded file information */
+    memcpy( pModule + 1, ofs, of_size );
+    ((OFSTRUCT *)(pModule+1))->cBytes = of_size - 1;
+
+    pSegment = (SEGTABLEENTRY*)((char*)(pModule + 1) + of_size);
+    pModule->seg_table = pModule->dgroup_entry = (int)pSegment - (int)pModule;
+    /* Data segment */
+    pSegment->size    = 0;
+    pSegment->flags   = NE_SEGFLAGS_DATA;
+    pSegment->minsize = 0x1000;
+    pSegment++;
+    /* Code segment */
+    pSegment->flags   = 0;
+    pSegment++;
+
+    /* Module name */
+    pStr = (char *)pSegment;
+    pModule->name_table = (int)pStr - (int)pModule;
+    strcpy( pStr, "\x08W32SXXXX" );
+    pStr += 9;
+
+    /* All tables zero terminated */
+    pModule->res_table = pModule->import_table = pModule->entry_table =
+		(int)pStr - (int)pModule;
+
+    MODULE_RegisterModule( pModule );
+    return hModule;
+}
+
+
+/***********************************************************************
  *           MODULE_LoadExeHeader
  */
 static HMODULE16 MODULE_LoadExeHeader( HFILE hFile, OFSTRUCT *ofs )
@@ -932,6 +1010,7 @@
     HANDLE hInstance, hPrevInstance;
     NE_MODULE *pModule;
     LOADPARAMS *params = (LOADPARAMS *)paramBlock;
+    OFSTRUCT ofs;
 #ifndef WINELIB
     WORD *pModRef, *pDLLs;
     HFILE hFile;
@@ -941,8 +1020,6 @@
 
     if (!hModule)  /* We have to load the module */
     {
-        OFSTRUCT ofs;
-
         /* Try to load the built-in first if not disabled */
         if ((hModule = BUILTIN_LoadModule( name, FALSE ))) return hModule;
 
@@ -1134,13 +1211,11 @@
         pModule->count++;
     }
 #else
-    hModule = GlobalAlloc16( GMEM_MOVEABLE | GMEM_ZEROINIT, sizeof(NE_MODULE));
+    lstrcpyn32A( ofs.szPathName, name, sizeof(ofs.szPathName) );
+    if ((hModule = MODULE_CreateDummyModule( &ofs )) < 32) return hModule;
     pModule = (NE_MODULE *)GlobalLock16( hModule );
-    pModule->count = 1;
-    pModule->magic = NE_SIGNATURE;
-    pModule->self = hModule;
     hPrevInstance = 0;
-    hInstance = MODULE_CreateInstance( hModule, (LOADPARAMS*)paramBlock );
+    hInstance = MODULE_CreateInstance( hModule, params );
 #endif /* WINELIB */
 
       /* Create a task for this instance */
diff --git a/loader/ne_image.c b/loader/ne_image.c
index 359242b..ad5af2f 100644
--- a/loader/ne_image.c
+++ b/loader/ne_image.c
@@ -30,13 +30,13 @@
 /***********************************************************************
  *           NE_LoadSegment
  */
-BOOL NE_LoadSegment( HMODULE hModule, WORD segnum )
+BOOL NE_LoadSegment( HMODULE16 hModule, WORD segnum )
 {
     NE_MODULE *pModule;
     SEGTABLEENTRY *pSegTable, *pSeg;
     WORD *pModuleTable;
     WORD count, i, offset;
-    HMODULE module;
+    HMODULE16 module;
     FARPROC16 address;
     int fd;
     struct relocation_entry_s *rep, *reloc_entries;
@@ -449,7 +449,7 @@
  *
  * Call the DLL initialization code
  */
-static BOOL NE_InitDLL( HMODULE hModule )
+static BOOL NE_InitDLL( HMODULE16 hModule )
 {
 #ifndef WINELIB
     int cs_reg, ds_reg, ip_reg, cx_reg, di_reg, bp_reg;
@@ -498,7 +498,7 @@
     pModule->cs = 0;  /* Don't initialize it twice */
     dprintf_dll( stddeb, "Calling LibMain, cs:ip=%04x:%04x ds=%04x di=%04x cx=%04x\n", 
                  cs_reg, ip_reg, ds_reg, di_reg, cx_reg );
-    return CallTo16_regs_( (FARPROC)(cs_reg << 16 | ip_reg), ds_reg,
+    return CallTo16_regs_( (FARPROC16)(cs_reg << 16 | ip_reg), ds_reg,
                            0 /*es*/, 0 /*bp*/, 0 /*ax*/, 0 /*bx*/,
                            cx_reg, 0 /*dx*/, 0 /*si*/, di_reg );
 #else
@@ -513,10 +513,10 @@
  *
  * Initialize the loaded DLLs.
  */
-void NE_InitializeDLLs( HMODULE hModule )
+void NE_InitializeDLLs( HMODULE16 hModule )
 {
     NE_MODULE *pModule;
-    HMODULE *pDLL;
+    HMODULE16 *pDLL;
 
     if (!(pModule = MODULE_GetPtr( hModule ))) return;
     if (pModule->flags & NE_FFLAGS_WIN32)
@@ -528,7 +528,7 @@
     {
 	HANDLE to_init = pModule->dlls_to_init;
 	pModule->dlls_to_init = 0;
-        for (pDLL = (HMODULE *)GlobalLock16( to_init ); *pDLL; pDLL++)
+        for (pDLL = (HMODULE16 *)GlobalLock16( to_init ); *pDLL; pDLL++)
         {
             NE_InitializeDLLs( *pDLL );
             NE_InitDLL( *pDLL );
diff --git a/loader/ne_resource.c b/loader/ne_resource.c
index 289e346..bd74e65 100644
--- a/loader/ne_resource.c
+++ b/loader/ne_resource.c
@@ -30,7 +30,7 @@
  * Find the type and resource id from their names.
  * Return value is MAKELONG( typeId, resId ), or 0 if not found.
  */
-static DWORD NE_FindNameTableId( HMODULE hModule, SEGPTR typeId, SEGPTR resId )
+static DWORD NE_FindNameTableId( HMODULE16 hModule, SEGPTR typeId, SEGPTR resId )
 {
     NE_MODULE *pModule;
     NE_TYPEINFO *pTypeInfo;
@@ -52,9 +52,9 @@
         {
             dprintf_resource( stddeb, "NameTable entry: type=%04x id=%04x\n",
                               pTypeInfo->type_id, pNameInfo->id );
-            handle = LoadResource( hModule, 
+            handle = LoadResource16( hModule, 
 				   (HANDLE)((int)pNameInfo - (int)pModule) );
-            for(p = (WORD*)LockResource(handle); p && *p; p = (WORD *)((char*)p+*p))
+            for(p = (WORD*)LockResource16(handle); p && *p; p = (WORD *)((char*)p+*p))
             {
                 dprintf_resource( stddeb,"  type=%04x '%s' id=%04x '%s'\n",
                                   p[1], (char *)(p+3), p[2],
@@ -88,7 +88,7 @@
                 ret = MAKELONG( p[1], p[2] );
                 break;
             }
-            FreeResource( handle );
+            FreeResource16( handle );
             if (ret) return ret;
         }
     }
@@ -134,7 +134,7 @@
 /***********************************************************************
  *           NE_FindResource
  */
-HRSRC NE_FindResource( HMODULE hModule, SEGPTR typeId, SEGPTR resId )
+HRSRC NE_FindResource( HMODULE16 hModule, SEGPTR typeId, SEGPTR resId )
 {
     NE_TYPEINFO *pTypeInfo;
     HRSRC hRsrc;
@@ -211,7 +211,7 @@
 /***********************************************************************
  *           NE_AllocResource
  */
-HGLOBAL NE_AllocResource( HMODULE hModule, HRSRC hRsrc, DWORD size )
+HGLOBAL NE_AllocResource( HMODULE16 hModule, HRSRC hRsrc, DWORD size )
 {
     NE_NAMEINFO *pNameInfo=NULL;
     WORD sizeShift;
@@ -231,7 +231,7 @@
 /***********************************************************************
  *           NE_AccessResource
  */
-int NE_AccessResource( HMODULE hModule, HRSRC hRsrc )
+int NE_AccessResource( HMODULE16 hModule, HRSRC hRsrc )
 {
     NE_NAMEINFO *pNameInfo=NULL;
     int fd;
@@ -254,7 +254,7 @@
 /***********************************************************************
  *           NE_SizeofResource
  */
-DWORD NE_SizeofResource( HMODULE hModule, HRSRC hRsrc )
+DWORD NE_SizeofResource( HMODULE16 hModule, HRSRC hRsrc )
 {
     NE_NAMEINFO *pNameInfo=NULL;
     WORD sizeShift;
@@ -272,7 +272,7 @@
 /***********************************************************************
  *           NE_LoadResource
  */
-HGLOBAL NE_LoadResource( HMODULE hModule,  HRSRC hRsrc )
+HGLOBAL NE_LoadResource( HMODULE16 hModule,  HRSRC hRsrc )
 {
     NE_NAMEINFO *pNameInfo=NULL;
     WORD sizeShift;
@@ -307,7 +307,7 @@
 /***********************************************************************
  *           NE_LockResource
  */
-SEGPTR NE_LockResource( HMODULE hModule, HGLOBAL handle )
+SEGPTR NE_LockResource( HMODULE16 hModule, HGLOBAL handle )
 {
     /* May need to reload the resource if discarded */
 
@@ -318,7 +318,7 @@
 /***********************************************************************
  *           NE_FreeResource
  */
-BOOL NE_FreeResource( HMODULE hModule, HGLOBAL handle )
+BOOL NE_FreeResource( HMODULE16 hModule, HGLOBAL handle )
 {
     NE_TYPEINFO *pTypeInfo;
     NE_NAMEINFO *pNameInfo;
@@ -346,7 +346,7 @@
         }
         pTypeInfo = (NE_TYPEINFO *)pNameInfo;
     }
-    fprintf( stderr, "FreeResource: %04x %04x not found!\n", hModule, handle );
+    fprintf( stderr, "NE_FreeResource: %04x %04x not found!\n", hModule, handle );
     return handle;
 }
 #endif /* WINELIB */
diff --git a/loader/pe_image.c b/loader/pe_image.c
index e95c39f..4dad04b 100644
--- a/loader/pe_image.c
+++ b/loader/pe_image.c
@@ -122,7 +122,7 @@
 			if(strcmp(ename,funcName)==0)
 				return (FARPROC32)(load_addr + *function);
 		}else{
-			if(funcName == (int)*ordinal + exports->Base)
+			if((int)funcName == (int)*ordinal + exports->Base)
 				return (FARPROC32)(load_addr + *function);
 		}
 		function++;
@@ -132,14 +132,14 @@
 	return NULL;
 }
 
-void fixup_imports(struct pe_data *pe, HMODULE hModule)
+void fixup_imports(struct pe_data *pe, HMODULE16 hModule)
 { 
   struct PE_Import_Directory * pe_imp;
   int fixup_failed=0;
   unsigned int load_addr = pe->load_addr;
   int i;
   NE_MODULE *ne_mod;
-  HMODULE *mod_ptr;
+  HMODULE16 *mod_ptr;
 
  /* OK, now dump the import list */
   dprintf_win32(stddeb, "\nDumping imports list\n");
@@ -151,7 +151,7 @@
 
   /* Now, allocate memory for dlls_to_init */
   ne_mod = GlobalLock16(hModule);
-  ne_mod->dlls_to_init = GLOBAL_Alloc(GMEM_ZEROINIT,(i+1) * sizeof(HMODULE),
+  ne_mod->dlls_to_init = GLOBAL_Alloc(GMEM_ZEROINIT,(i+1) * sizeof(HMODULE16),
                                       hModule, FALSE, FALSE, FALSE );
   mod_ptr = GlobalLock16(ne_mod->dlls_to_init);
   /* load the modules and put their handles into the list */
@@ -159,7 +159,7 @@
   {
   	char *name = (char*)load_addr+pe_imp->ModuleName;
 	mod_ptr[i] = LoadModule(name,(LPVOID)-1);
-	if(mod_ptr[i]<=(HMODULE)32)
+	if(mod_ptr[i]<=(HMODULE16)32)
         {
             char *p, buffer[256];
 
@@ -169,7 +169,7 @@
             strcpy( p + 1, name );
             mod_ptr[i] = LoadModule( buffer, (LPVOID)-1 );
         }
-	if(mod_ptr[i]<=(HMODULE)32)
+	if(mod_ptr[i]<=(HMODULE16)32)
 	{
 		fprintf(stderr,"Module %s not found\n",name);
 		exit(0);
@@ -349,7 +349,7 @@
  *			PE_LoadImage
  * Load one PE format executable into memory
  */
-static struct pe_data *PE_LoadImage( int fd, HMODULE hModule, WORD offset )
+static struct pe_data *PE_LoadImage( int fd, HMODULE16 hModule, WORD offset )
 {
     struct pe_data *pe;
     int i, result;
@@ -433,16 +433,9 @@
 	if(strcmp(pe->pe_seg[i].Name, ".edata") == 0)
 		pe->pe_export = (struct PE_Export_Directory *) result;
 
-	if(strcmp(pe->pe_seg[i].Name, ".rsrc") == 0) {
+	if(strcmp(pe->pe_seg[i].Name, ".rsrc") == 0)
 	    pe->pe_resource = (struct PE_Resource_Directory *) result;
-#if 0
-/* FIXME pe->resource_offset should be deleted from structure if this
- ifdef doesn't break anything */
-	    /* save offset for PE_FindResource */
-	    pe->resource_offset = pe->pe_seg[i].Virtual_Address - 
-					pe->pe_seg[i].PointerToRawData;
-#endif	
-	    }
+
 	if(strcmp(pe->pe_seg[i].Name, ".reloc") == 0)
 		pe->pe_reloc = (struct PE_Reloc_Block *) result;
 
@@ -522,113 +515,45 @@
         return pe;
 }
 
-HINSTANCE MODULE_CreateInstance(HMODULE hModule,LOADPARAMS *params);
+HINSTANCE MODULE_CreateInstance(HMODULE16 hModule,LOADPARAMS *params);
 void InitTask( SIGCONTEXT *context );
 
 HINSTANCE PE_LoadModule( int fd, OFSTRUCT *ofs, LOADPARAMS* params )
 {
-        PE_MODULE *pe;
-	int size, of_size;
-	NE_MODULE *pModule;
-	SEGTABLEENTRY *pSegment;
-	char *pStr;
-	DWORD cts;
-	HMODULE hModule;
-	HINSTANCE hInstance;
-        struct mz_header_s mz_header;
+    HMODULE16 hModule;
+    HINSTANCE16 hInstance;
+    NE_MODULE *pModule;
+    SEGTABLEENTRY *pSegment;
+    FARPROC16 startup;
+    struct mz_header_s mz_header;
 
-	lseek(fd,0,SEEK_SET);
-	read( fd, &mz_header, sizeof(mz_header) );
+    if ((hModule = MODULE_CreateDummyModule( ofs )) < 32) return hModule;
+    pModule = (NE_MODULE *)GlobalLock16( hModule );
+    pModule->flags = NE_FFLAGS_WIN32;
 
-        of_size = sizeof(OFSTRUCT) - sizeof(ofs->szPathName)
-                  + strlen(ofs->szPathName) + 1;
-	size = sizeof(NE_MODULE) +
-               /* loaded file info */
-               of_size +
-               /* segment table: DS,CS */
-               2 * sizeof(SEGTABLEENTRY) +
-               /* name table */
-               9 +
-               /* several empty tables */
-               8;
+    lseek( fd, 0, SEEK_SET );
+    read( fd, &mz_header, sizeof(mz_header) );
 
-	hModule = GlobalAlloc16( GMEM_MOVEABLE | GMEM_ZEROINIT, size );
-	if (!hModule) return (HINSTANCE)11;  /* invalid exe */
+    /* Set the startup address */
 
-	FarSetOwner( hModule, hModule );
-	
-	pModule = (NE_MODULE*)GlobalLock16(hModule);
+    startup = MODULE_GetWndProcEntry16("Win32CallToStart");
+    pSegment = NE_SEG_TABLE(pModule) + pModule->cs - 1;
+    pSegment->selector = SELECTOROF(startup); /* FIXME */
+    pModule->ip = OFFSETOF(startup);
 
-	/* Set all used entries */
-	pModule->magic=NE_SIGNATURE;
-	pModule->count=1;
-	pModule->next=0;
-	pModule->flags=NE_FFLAGS_WIN32;
-	pModule->dgroup=1;
-	pModule->ss=1;
-	pModule->cs=2;
-	/* Who wants to LocalAlloc for a PE Module? */
-	pModule->heap_size=0x1000;
-	pModule->stack_size=0xF000;
-	pModule->seg_count=1;
-	pModule->modref_count=0;
-	pModule->nrname_size=0;
-	pModule->fileinfo=sizeof(NE_MODULE);
-	pModule->os_flags=NE_OSFLAGS_WINDOWS;
-	pModule->expected_version=0x30A;
-        pModule->self = hModule;
+    pModule->pe_module = PE_LoadImage( fd, hModule, mz_header.ne_offset );
 
-        /* Set loaded file information */
-        memcpy( pModule + 1, ofs, of_size );
-        ((OFSTRUCT *)(pModule+1))->cBytes = of_size - 1;
+    hInstance = MODULE_CreateInstance( hModule, params );
 
-	pSegment=(SEGTABLEENTRY*)((char*)(pModule + 1) + of_size);
-	pModule->seg_table=pModule->dgroup_entry=(int)pSegment-(int)pModule;
-	pSegment->size=0;
-	pSegment->flags=NE_SEGFLAGS_DATA;
-	pSegment->minsize=0x1000;
-	pSegment++;
-
-	cts=(DWORD)MODULE_GetWndProcEntry16("Win32CallToStart");
-#ifdef WINELIB32
-	pSegment->selector=(void*)cts;
-	pModule->ip=0;
-#else
-	pSegment->selector=cts>>16;  /* FIXME!! */
-	pModule->ip=cts & 0xFFFF;
-#endif
-	pSegment++;
-
-	pStr=(char*)pSegment;
-	pModule->name_table=(int)pStr-(int)pModule;
-	strcpy(pStr,"\x08W32SXXXX");
-	pStr+=9;
-
-	/* All tables zero terminated */
-	pModule->res_table=pModule->import_table=pModule->entry_table=
-		(int)pStr-(int)pModule;
-
-        MODULE_RegisterModule( pModule );
-
-	pe = PE_LoadImage( fd, hModule, mz_header.ne_offset );
-
-        pModule->pe_module = pe;
-	pModule->heap_size=0x1000;
-	pModule->stack_size=0xE000;
-
-	/* CreateInstance allocates now 64KB */
-	hInstance=MODULE_CreateInstance(hModule,NULL /* FIX: NULL? really? */);
-
-        /* FIXME: Is this really the correct place to initialise the DLL? */
-	if ((pe->pe_header->coff.Characteristics & IMAGE_FILE_DLL)) {
-/*            PE_InitDLL(hModule); */
-        } else {
-            TASK_CreateTask(hModule,hInstance,0,
-		params->hEnvironment,(LPSTR)PTR_SEG_TO_LIN(params->cmdLine),
-		*((WORD*)PTR_SEG_TO_LIN(params->showCmd)+1));
-            PE_InitializeDLLs(hModule);
-	}
-	return hInstance;
+    if (!(pModule->pe_module->pe_header->coff.Characteristics & IMAGE_FILE_DLL))
+    {
+        TASK_CreateTask( hModule, hInstance, 0,
+                         params->hEnvironment,
+                         (LPSTR)PTR_SEG_TO_LIN( params->cmdLine ),
+                         *((WORD*)PTR_SEG_TO_LIN(params->showCmd) + 1) );
+        PE_InitializeDLLs( hModule );
+    }
+    return hInstance;
 }
 
 int USER_InitApp(HINSTANCE hInstance);
@@ -637,29 +562,29 @@
 void PE_Win32CallToStart( SIGCONTEXT *context )
 {
     int fs;
-    HMODULE hModule;
+    HMODULE16 hModule;
     NE_MODULE *pModule;
 
     dprintf_win32(stddeb,"Going to start Win32 program\n");	
-    InitTask( &context );
+    InitTask( context );
     hModule = GetExePtr( GetCurrentTask() );
     pModule = MODULE_GetPtr( hModule );
     USER_InitApp( hModule );
     fs=(int)GlobalAlloc16( GMEM_FIXED | GMEM_ZEROINIT, 0x10000 );
     PE_InitTEB(fs);
     __asm__ __volatile__("movw %w0,%%fs"::"r" (fs));
-    CallTaskStart32( (FARPROC)(pModule->pe_module->load_addr + 
+    CallTaskStart32( (FARPROC32)(pModule->pe_module->load_addr + 
                                pModule->pe_module->pe_header->opt_coff.AddressOfEntryPoint) );
 }
 
-int PE_UnloadImage( HMODULE hModule )
+int PE_UnloadImage( HMODULE16 hModule )
 {
 	printf("PEunloadImage() called!\n");
 	/* free resources, image, unmap */
 	return 1;
 }
 
-static void PE_InitDLL(HMODULE hModule)
+static void PE_InitDLL(HMODULE16 hModule)
 {
     NE_MODULE *pModule;
     PE_MODULE *pe;
@@ -675,7 +600,7 @@
     if (pe->pe_header->coff.Characteristics & IMAGE_FILE_DLL)
     {
         printf("InitPEDLL() called!\n");
-        CallDLLEntryProc32( (FARPROC)(pe->load_addr + 
+        CallDLLEntryProc32( (FARPROC32)(pe->load_addr + 
                                   pe->pe_header->opt_coff.AddressOfEntryPoint),
                             hModule, 0, 0 );
     }
@@ -708,16 +633,16 @@
     pTEB->taskid = getpid();
 }
 
-void PE_InitializeDLLs(HMODULE hModule)
+void PE_InitializeDLLs(HMODULE16 hModule)
 {
 	NE_MODULE *pModule;
-	HMODULE *pDLL;
+	HMODULE16 *pDLL;
 	pModule = MODULE_GetPtr( GetExePtr(hModule) );
 	if (pModule->dlls_to_init)
 	{
 		HANDLE to_init = pModule->dlls_to_init;
 		pModule->dlls_to_init = 0;
-		for (pDLL = (HMODULE *)GlobalLock16( to_init ); *pDLL; pDLL++)
+		for (pDLL = (HMODULE16 *)GlobalLock16( to_init ); *pDLL; pDLL++)
 		{
 			PE_InitializeDLLs( *pDLL );
 			PE_InitDLL( *pDLL );
diff --git a/loader/pe_resource.c b/loader/pe_resource.c
index da19a65..9178772 100644
--- a/loader/pe_resource.c
+++ b/loader/pe_resource.c
@@ -1,154 +1,167 @@
 #ifndef WINELIB
 /*
- *	(c) 1994	Erik Bos	<erik@xs4all.nl>
+ * PE (Portable Execute) File Resources
  *
- *	based on Eric Youndale's pe-test and:
+ * Copyright 1995 Thomas Sandford
+ * Copyright 1996 Martin von Loewis
  *
- *	ftp.microsoft.com:/pub/developer/MSDN/CD8/PEFILE.ZIP
+ * Based on the Win16 resource handling code in loader/resource.c
+ * Copyright 1993 Robert J. Amstadt
+ * Copyright 1995 Alexandre Julliard
+ *
+ * This is not even at ALPHA level yet. Don't expect it to work!
  */
 
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
 #include <sys/types.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-#include <unistd.h>
+#include "wintypes.h"
 #include "windows.h"
-#include "ldt.h"
-#include "neexe.h"
-#include "peexe.h"
+#include "kernel32.h"
 #include "pe_image.h"
-#include "resource.h"
+#include "module.h"
+#include "handle32.h"
+#include "libres.h"
+#include "resource32.h"
+#include "stackframe.h"
+#include "neexe.h"
+#include "accel.h"
+#include "xmalloc.h"
+#include "string32.h"
 #include "stddebug.h"
-/* #define DEBUG_RESOURCE */
 #include "debug.h"
 
-#if 0
+int language = 0x0409;
 
-static int
-find_lang(char *root, struct PE_Resource_Directory *resource, RESOURCE *r)
+#define PrintIdA(name) \
+    if (HIWORD((DWORD)name)) \
+        dprintf_resource( stddeb, "'%s'", name); \
+    else \
+        dprintf_resource( stddeb, "#%04x", LOWORD(name)); 
+#define PrintIdW(name)
+#define PrintId(name)
+
+/**********************************************************************
+ *	    GetResDirEntryW
+ *
+ *	Helper function - goes down one level of PE resource tree
+ *
+ */
+PIMAGE_RESOURCE_DIRECTORY GetResDirEntryW(PIMAGE_RESOURCE_DIRECTORY resdirptr,
+					 LPCWSTR name,
+					 DWORD root)
 {
-	struct PE_Directory_Entry *type_dir;
-	struct PE_Resource_Leaf_Entry *leaf;
+    int entrynum;
+    PIMAGE_RESOURCE_DIRECTORY_ENTRY entryTable;
+	int namelen;
 
-	type_dir = (struct PE_Directory_Entry *)(resource + 1);
-	type_dir += resource->NumberOfNamedEntries;
-
-	/* grab the 1st resource available */
-	leaf = (struct PE_Resource_Leaf_Entry *) (root + type_dir->OffsetToData);
-		dprintf_resource(stddeb, "\t\tPE_findlang: id %8x\n", (int) type_dir->Name);
-		dprintf_resource(stddeb, "\t\taddress %ld, size %ld, language id %ld\n", leaf->OffsetToData, leaf->Size, leaf->CodePage);
-	r->offset = leaf->OffsetToData - r->wpnt->pe->resource_offset;
-	r->size = leaf->Size;
-	printf("\t\toffset %d, size %d\n", r->offset, r->size);
-	return 1;
-
-/*	for(i=0; i< resource->NumberOfIdEntries; i++) {
-		leaf = (root + (type_dir->OffsetToData & ~IMAGE_RESOURCE_DATA_IS_DIRECTORY));
-		dprintf_resource(stddeb, "\t\tPE_findlang: id %8x\n", 
-			(int) type_dir->Name);
-		dprintf_resource(stddeb, "\t\t%x %x %x\n", leaf->OffsetToData, 
-			leaf->Size, leaf->CodePage);
-		type_dir++;
-	} */
-}
-
-static int 
-find_resource(char *root, struct PE_Resource_Directory *resource, 
-		LPSTR resource_name, RESOURCE *r)
-{
-	int i;
-	char res_name[256];
-	struct PE_Directory_Entry *type_dir;
-	struct PE_Directory_Name_String_U *name;
-	
-	type_dir = (struct PE_Directory_Entry *)(resource + 1);
-
-	if (HIWORD((DWORD)resource_name)) {
-		for(i=0; i< resource->NumberOfNamedEntries; i++) {
-			name = (struct PE_Directory_Name_String_U *)(root + (type_dir->Name & ~IMAGE_RESOURCE_NAME_IS_STRING));
-			memset(res_name, 0, sizeof(res_name));
-			my_wcstombs(res_name, name->NameString, name->Length);
-			dprintf_resource(stddeb, "\tPE_findresource: name %s\n", res_name);
-			if (lstrcmpi(res_name, resource_name) == 0) 
-				return find_lang(root, (struct PE_Resource_Directory *) (root + (type_dir->OffsetToData & ~IMAGE_RESOURCE_DATA_IS_DIRECTORY)), r);
-			type_dir++;
-		}
-	} else {
-		type_dir += resource->NumberOfNamedEntries;
-		for(i=0; i< resource->NumberOfIdEntries; i++) {
-			dprintf_resource(stddeb, "\tPE_findresource: name %8x\n", (int) type_dir->Name);
-			if (type_dir->Name == ((int) resource_name & 0xff))
-				return find_lang(root, (struct PE_Resource_Directory *) (root + (type_dir->OffsetToData & ~IMAGE_RESOURCE_DATA_IS_DIRECTORY)), r);
-			type_dir++;
-		}
+    if (HIWORD(name)) {
+    /* FIXME: what about #xxx names? */
+	entryTable = (PIMAGE_RESOURCE_DIRECTORY_ENTRY) (
+			(BYTE *) resdirptr + 
+                        sizeof(IMAGE_RESOURCE_DIRECTORY));
+	namelen = lstrlen32W(name);
+	for (entrynum = 0; entrynum < resdirptr->NumberOfNamedEntries; entrynum++)
+	{
+		PIMAGE_RESOURCE_DIR_STRING_U str =
+		(PIMAGE_RESOURCE_DIR_STRING_U) (root + 
+			(entryTable[entrynum].Name & 0x7fffffff));
+		if(namelen != str->Length)
+			continue;
+		if(lstrncmpi32W(name,str->NameString,str->Length)==0)
+			return (PIMAGE_RESOURCE_DIRECTORY) (
+				root +
+				(entryTable[entrynum].OffsetToData & 0x7fffffff));
 	}
-	return 0;
-}
-
-static int 
-find_type(struct PE_Resource_Directory *resource, LPSTR resource_name,
-		LPSTR type_name)
-{
-	int i;
-	char *root, res_name[256];
-	struct PE_Directory_Entry *type_dir;
-	struct PE_Directory_Name_String_U *name;
-	
-	root = (char *) resource;
-	type_dir = (struct PE_Directory_Entry *)(resource + 1);
-
-	if (HIWORD((DWORD)type_name)) {
-		for(i=0; i< resource->NumberOfNamedEntries; i++) {
-			name = (struct PE_Directory_Name_String_U *)(root + (type_dir->Name & ~IMAGE_RESOURCE_NAME_IS_STRING));
-			memset(res_name, 0, sizeof(res_name));
-			my_wcstombs(res_name, name->NameString, name->Length);
-			dprintf_resource(stddeb, "PE_findtype: type %s\n", 
-				res_name);
-			if (lstrcmpi(res_name, type_name) == 0) 
-				return find_resource(root, (struct PE_Resource_Directory *) (root + (type_dir->OffsetToData & ~IMAGE_RESOURCE_DATA_IS_DIRECTORY)), resource_name, r);
-			type_dir++;
-		}
-	} else {
-		type_dir += resource->NumberOfNamedEntries;
-		for(i=0; i< resource->NumberOfIdEntries; i++) {
-			dprintf_resource(stddeb, "PE_findtype: type %8x\n", (int) type_dir->Name);
-			if (type_dir->Name == ((int) type_name & 0xff))
-				return find_resource(root, (struct PE_Resource_Directory *) (root + (type_dir->OffsetToData & ~IMAGE_RESOURCE_DATA_IS_DIRECTORY)), resource_name, r);
-			type_dir++;
-		}
-	}
-	return 0;
+	return NULL;
+    } else {
+	entryTable = (PIMAGE_RESOURCE_DIRECTORY_ENTRY) (
+			(BYTE *) resdirptr + 
+                        sizeof(IMAGE_RESOURCE_DIRECTORY) +
+			resdirptr->NumberOfNamedEntries * sizeof(IMAGE_RESOURCE_DIRECTORY_ENTRY));
+	for (entrynum = 0; entrynum < resdirptr->NumberOfIdEntries; entrynum++)
+	    if ((DWORD)entryTable[entrynum].Name == (DWORD)name)
+		return (PIMAGE_RESOURCE_DIRECTORY) (
+			root +
+			(entryTable[entrynum].OffsetToData & 0x7fffffff));
+	return NULL;
+    }
 }
 
 /**********************************************************************
- *			PE_FindResource	[KERNEL.60]
+ *	    GetResDirEntryA
+ *
+ *	Helper function - goes down one level of PE resource tree
+ *
  */
-int
-PE_FindResource(HANDLE instance, SEGPTR resource_name, SEGPTR type_name,
-		RESOURCE *r)
+PIMAGE_RESOURCE_DIRECTORY GetResDirEntryA(PIMAGE_RESOURCE_DIRECTORY resdirptr,
+					 LPCSTR name,
+					 DWORD root)
 {
-	dprintf_resource(stddeb, "PE_FindResource hInst=%04X typename=%08X resname=%08X\n", 
-		instance, (int) type_name, (int) resource_name);
-	if (HIWORD(resource_name))
-        {
-                char *resource_name_ptr = PTR_SEG_TO_LIN( resource_name );
-		if (resource_name_ptr[0] == '#')
-			resource_name = (SEGPTR) atoi(resource_name_ptr + 1);
-                else
-                    resource_name = (SEGPTR)resource_name_ptr;
-        }
-	if (HIWORD(type_name)) 
-        {
-                char *type_name_ptr = PTR_SEG_TO_LIN( type_name );
-		if (type_name_ptr[0] == '#')
-			type_name = (SEGPTR) atoi(type_name_ptr + 1);
-                else
-                        type_name = (SEGPTR) type_name_ptr;
-        }
-	return find_type(r->wpnt->pe->pe_resource, resource_name, type_name);
+	LPWSTR				xname;
+	PIMAGE_RESOURCE_DIRECTORY	ret;
+
+	if (HIWORD((DWORD)name))
+		xname	= STRING32_DupAnsiToUni(name);
+	else
+		xname	= (LPWSTR)name;
+
+	ret=GetResDirEntryW(resdirptr,xname,root);
+	if (HIWORD((DWORD)name))
+		free(xname);
+	return ret;
+}
+
+/**********************************************************************
+ *	    PE_FindResource32W
+ */
+HANDLE32 PE_FindResource32W( HINSTANCE hModule, LPCWSTR name, LPCWSTR type )
+{
+    PE_MODULE *pe;
+    NE_MODULE *pModule;
+    PIMAGE_RESOURCE_DIRECTORY resdirptr;
+    DWORD root;
+    HANDLE32 result;
+
+    hModule = GetExePtr( hModule );  /* In case we were passed an hInstance */
+    dprintf_resource(stddeb, "FindResource: module=%08x type=", hModule );
+    PrintId( type );
+    dprintf_resource( stddeb, " name=" );
+    PrintId( name );
+    dprintf_resource( stddeb, "\n" );
+    if (!(pModule = MODULE_GetPtr( hModule ))) return 0;
+    if (!(pModule->flags & NE_FFLAGS_WIN32)) return 0;  /* FIXME? */
+    if (!(pe = pModule->pe_module) || !pe->pe_resource) return 0;
+
+    resdirptr = (PIMAGE_RESOURCE_DIRECTORY) pe->pe_resource;
+    root = (DWORD) resdirptr;
+    if ((resdirptr = GetResDirEntryW(resdirptr, type, root)) == NULL)
+	return 0;
+    if ((resdirptr = GetResDirEntryW(resdirptr, name, root)) == NULL)
+	return 0;
+    result = (HANDLE32)GetResDirEntryW(resdirptr, (LPCWSTR)language, root);
+	/* Try LANG_NEUTRAL, too */
+    if(!result)
+        return (HANDLE32)GetResDirEntryW(resdirptr, (LPCWSTR)0, root);
+    return result;
+}
+
+
+/**********************************************************************
+ *	    PE_LoadResource32
+ */
+HANDLE32 PE_LoadResource32( HINSTANCE hModule, HANDLE32 hRsrc )
+{
+    NE_MODULE *pModule;
+    PE_MODULE *pe;
+
+    if (!hModule) hModule = GetTaskDS(); /* FIXME: see FindResource32W */
+    hModule = GetExePtr( hModule );  /* In case we were passed an hInstance */
+    dprintf_resource(stddeb, "PE_LoadResource32: module=%04x res=%04x\n",
+                     hModule, hRsrc );
+    if (!hRsrc) return 0;
+
+    if (!(pModule = MODULE_GetPtr( hModule ))) return 0;
+    if (!(pModule->flags & NE_FFLAGS_WIN32)) return 0;  /* FIXME? */
+    if (!(pe = pModule->pe_module) || !pe->pe_resource) return 0;
+    return (HANDLE32) (pe->load_addr+((PIMAGE_RESOURCE_DATA_ENTRY)hRsrc)->OffsetToData);
 }
 #endif
-
-#endif /* WINELIB */
diff --git a/loader/resource.c b/loader/resource.c
index 9f0aa83..cea0057 100644
--- a/loader/resource.c
+++ b/loader/resource.c
@@ -23,6 +23,8 @@
 #include "stddebug.h"
 #include "debug.h"
 #include "libres.h"
+#include "string32.h"
+#include "xmalloc.h"
 
 #define PrintId(name) \
     if (HIWORD((DWORD)name)) \
@@ -32,14 +34,14 @@
 
 
 /**********************************************************************
- *	    FindResource    (KERNEL.60)
+ *	    FindResource16    (KERNEL.60)
  */
-HRSRC FindResource( HMODULE hModule, SEGPTR name, SEGPTR type )
+HRSRC16 FindResource16( HMODULE16 hModule, SEGPTR name, SEGPTR type )
 {
     NE_MODULE *pModule;
 
     hModule = GetExePtr( hModule );  /* In case we were passed an hInstance */
-    dprintf_resource(stddeb, "FindResource: module=%04x type=", hModule );
+    dprintf_resource(stddeb, "FindResource16: module=%04x type=", hModule );
     PrintId( type );
     if (HIWORD(name))  /* Check for '#xxx' name */
     {
@@ -55,7 +57,7 @@
 #ifndef WINELIB
     if (pModule->flags & NE_FFLAGS_WIN32)
     {
-        fprintf(stderr,"Don't know how to FindResource() for Win32 module\n");
+        fprintf(stderr,"Don't know how to FindResource16() for Win32 module\n");
         return 0;
     }
     return NE_FindResource( hModule, type, name );
@@ -66,21 +68,67 @@
 
 
 /**********************************************************************
- *	    LoadResource    (KERNEL.61)
+ *	    FindResource32A    (KERNEL32.128)
  */
-HGLOBAL LoadResource( HMODULE hModule, HRSRC hRsrc )
+HANDLE32 FindResource32A( HINSTANCE32 hModule, LPCSTR name, LPCSTR type )
+{
+    LPWSTR xname,xtype;
+    HANDLE32 ret;
+
+    if (HIWORD((DWORD)name)) xname = STRING32_DupAnsiToUni(name);
+    else xname = (LPWSTR)name;
+    if (HIWORD((DWORD)type)) xtype = STRING32_DupAnsiToUni(type);
+    else xtype = (LPWSTR)type;
+    ret = FindResource32W(hModule,xname,xtype);
+    if (HIWORD((DWORD)name)) free(xname);
+    if (HIWORD((DWORD)type)) free(xtype);
+    return ret;
+}
+
+
+/**********************************************************************
+ *	    FindResource32W    (KERNEL32.131)
+ */
+HRSRC32 FindResource32W( HINSTANCE32 hModule, LPCWSTR name, LPCWSTR type )
+{
+#ifndef WINELIB
+    NE_MODULE *pModule;
+
+    /* Sometimes we get passed hModule = 0x00000000. FIXME: is GetTaskDS()
+     * ok?
+     */
+    if (!hModule) hModule = GetTaskDS();
+    hModule = GetExePtr( hModule );  /* In case we were passed an hInstance */
+    dprintf_resource(stddeb, "FindResource32W: module=%08x type=", hModule );
+    PrintId( type );
+    dprintf_resource( stddeb, " name=" );
+    PrintId( name );
+    dprintf_resource( stddeb, "\n" );
+    if (!(pModule = MODULE_GetPtr( hModule ))) return 0;
+    if (!(pModule->flags & NE_FFLAGS_WIN32)) return 0;
+    return PE_FindResource32W(hModule,name,type);
+#else
+    return LIBRES_FindResource( hModule, name, type );
+#endif
+}
+
+
+/**********************************************************************
+ *	    LoadResource16    (KERNEL.61)
+ */
+HGLOBAL16 LoadResource16( HMODULE16 hModule, HRSRC16 hRsrc )
 {
     NE_MODULE *pModule;
 
     hModule = GetExePtr( hModule );  /* In case we were passed an hInstance */
-    dprintf_resource(stddeb, "LoadResource: module=%04x res=%04x\n",
+    dprintf_resource(stddeb, "LoadResource16: module=%04x res=%04x\n",
                      hModule, hRsrc );
     if (!hRsrc) return 0;
     if (!(pModule = MODULE_GetPtr( hModule ))) return 0;
 #ifndef WINELIB
     if (pModule->flags & NE_FFLAGS_WIN32)
     {
-        fprintf(stderr,"Don't know how to LoadResource() for Win32 module\n");
+        fprintf(stderr,"Don't know how to LoadResource16() for Win32 module\n");
         return 0;
     }
     return NE_LoadResource( hModule, hRsrc );
@@ -89,15 +137,41 @@
 #endif
 }
 
+/**********************************************************************
+ *	    LoadResource32    (KERNEL32.370)
+ */
+HGLOBAL32 LoadResource32( HINSTANCE32 hModule, HRSRC32 hRsrc )
+{
+#ifndef WINELIB
+    NE_MODULE *pModule;
+
+    if (!hModule) hModule = GetTaskDS(); /* FIXME: see FindResource32W */
+    hModule = GetExePtr( hModule );  /* In case we were passed an hInstance */
+    dprintf_resource(stddeb, "LoadResource32: module=%04x res=%04x\n",
+                     hModule, hRsrc );
+    if (!hRsrc) return 0;
+
+    if (!(pModule = MODULE_GetPtr( hModule ))) return 0;
+    if (!(pModule->flags & NE_FFLAGS_WIN32))
+    {
+    	fprintf(stderr,"LoadResource32: tried to load a non win32 resource.\n");
+   	return 0;  /* FIXME? */
+    }
+    return PE_LoadResource32(hModule,hRsrc);
+#else
+    return LIBRES_LoadResource( hModule, hRsrc );
+#endif
+}
+
 
 /**********************************************************************
  *	    LockResource    (KERNEL.62)
  */
 /* 16-bit version */
-SEGPTR WIN16_LockResource( HGLOBAL handle )
+SEGPTR WIN16_LockResource16(HGLOBAL16 handle)
 {
 #ifndef WINELIB
-    HMODULE hModule;
+    HMODULE16 hModule;
     NE_MODULE *pModule;
 
     dprintf_resource(stddeb, "LockResource: handle=%04x\n", handle );
@@ -115,11 +189,11 @@
 #endif
 }
 
-/* 32-bit version */
-LPVOID LockResource( HGLOBAL handle )
+/* WINELIB 16-bit version */
+LPVOID LockResource16( HGLOBAL16 handle )
 {
 #ifndef WINELIB
-    HMODULE hModule;
+    HMODULE16 hModule;
     NE_MODULE *pModule;
 
     dprintf_resource(stddeb, "LockResource: handle=%04x\n", handle );
@@ -128,7 +202,7 @@
     if (!(pModule = MODULE_GetPtr( hModule ))) return 0;
     if (pModule->flags & NE_FFLAGS_WIN32)
     {
-        fprintf(stderr,"Don't know how to LockResource() for Win32 module\n");
+        fprintf(stderr,"Don't know how to LockResource16() for Win32 module\n");
         return 0;
     }
     return (LPSTR)PTR_SEG_TO_LIN( NE_LockResource( hModule, handle ) );
@@ -139,21 +213,30 @@
 
 
 /**********************************************************************
- *	    FreeResource    (KERNEL.63)
+ *	    LockResource32    (KERNEL32.384)
  */
-BOOL FreeResource( HGLOBAL handle )
+LPVOID LockResource32( HGLOBAL32 handle )
+{
+    return (LPVOID)handle;
+}
+
+
+/**********************************************************************
+ *	    FreeResource16    (KERNEL.63)
+ */
+BOOL16 FreeResource16( HGLOBAL16 handle )
 {
 #ifndef WINELIB
-    HMODULE hModule;
+    HMODULE16 hModule;
     NE_MODULE *pModule;
 
-    dprintf_resource(stddeb, "FreeResource: handle=%04x\n", handle );
+    dprintf_resource(stddeb, "FreeResource16: handle=%04x\n", handle );
     if (!handle) return FALSE;
     hModule = GetExePtr( handle );
     if (!(pModule = MODULE_GetPtr( hModule ))) return 0;
     if (pModule->flags & NE_FFLAGS_WIN32)
     {
-        fprintf(stderr,"Don't know how to FreeResource() for Win32 module\n");
+        fprintf(stderr,"Don't know how to FreeResource16() for Win32 module\n");
         return 0;
     }
     return NE_FreeResource( hModule, handle );
@@ -162,23 +245,32 @@
 #endif
 }
 
+/**********************************************************************
+ *	    FreeResource32    (KERNEL32.145)
+ */
+BOOL32 FreeResource32( HGLOBAL32 handle )
+{
+    /* no longer used in Win32 */
+    return TRUE;
+}
+
 
 /**********************************************************************
- *	    AccessResource    (KERNEL.64)
+ *	    AccessResource16    (KERNEL.64)
  */
-INT AccessResource( HINSTANCE hModule, HRSRC hRsrc )
+INT16 AccessResource16( HINSTANCE16 hModule, HRSRC16 hRsrc )
 {
     NE_MODULE *pModule;
 
     hModule = GetExePtr( hModule );  /* In case we were passed an hInstance */
-    dprintf_resource(stddeb, "AccessResource: module=%04x res=%04x\n",
+    dprintf_resource(stddeb, "AccessResource16: module=%04x res=%04x\n",
                      hModule, hRsrc );
     if (!hRsrc) return 0;
     if (!(pModule = MODULE_GetPtr( hModule ))) return 0;
 #ifndef WINELIB
     if (pModule->flags & NE_FFLAGS_WIN32)
     {
-        fprintf(stderr,"Don't know how to AccessResource() for Win32 module\n");
+        fprintf(stderr,"Don't know how to AccessResource16() for Win32 module\n");
         return 0;
     }
     return NE_AccessResource( hModule, hRsrc );
@@ -189,20 +281,34 @@
 
 
 /**********************************************************************
- *	    SizeofResource    (KERNEL.65)
+ *	    AccessResource32    (KERNEL32.64)
  */
-DWORD SizeofResource( HMODULE hModule, HRSRC hRsrc )
+INT32 AccessResource32( HINSTANCE32 hModule, HRSRC32 hRsrc )
+{
+    hModule = GetExePtr( hModule );  /* In case we were passed an hInstance */
+    dprintf_resource(stddeb, "AccessResource: module=%04x res=%04x\n",
+                     hModule, hRsrc );
+    if (!hRsrc) return 0;
+    fprintf(stderr,"AccessResource32: not implemented\n");
+    return 0;
+}
+
+
+/**********************************************************************
+ *	    SizeofResource16    (KERNEL.65)
+ */
+DWORD SizeofResource16( HMODULE16 hModule, HRSRC16 hRsrc )
 {
     NE_MODULE *pModule;
 
     hModule = GetExePtr( hModule );  /* In case we were passed an hInstance */
-    dprintf_resource(stddeb, "SizeofResource: module=%04x res=%04x\n",
+    dprintf_resource(stddeb, "SizeofResource16: module=%04x res=%04x\n",
                      hModule, hRsrc );
     if (!(pModule = MODULE_GetPtr( hModule ))) return 0;
 #ifndef WINELIB
     if (pModule->flags & NE_FFLAGS_WIN32)
     {
-        fprintf(stderr,"Don't know how to SizeOfResource() for Win32 module\n");
+        fprintf(stderr,"Don't know how to SizeOfResource16() for Win32 module\n");
         return 0;
     }
     return NE_SizeofResource( hModule, hRsrc );
@@ -213,9 +319,22 @@
 
 
 /**********************************************************************
- *	    AllocResource    (KERNEL.66)
+ *	    SizeofResource32    (KERNEL32.522)
  */
-HGLOBAL AllocResource( HMODULE hModule, HRSRC hRsrc, DWORD size )
+DWORD SizeofResource32( HINSTANCE32 hModule, HRSRC32 hRsrc )
+{
+    hModule = GetExePtr( hModule );  /* In case we were passed an hInstance */
+    dprintf_resource(stddeb, "SizeofResource32: module=%04x res=%04x\n",
+                     hModule, hRsrc );
+    fprintf(stderr,"SizeofResource32: not implemented\n");
+    return 0;
+}
+
+
+/**********************************************************************
+ *	    AllocResource16    (KERNEL.66)
+ */
+HGLOBAL16 AllocResource16( HMODULE16 hModule, HRSRC16 hRsrc, DWORD size )
 {
     NE_MODULE *pModule;
 
@@ -255,13 +374,13 @@
 
 
 /**********************************************************************
- *			LoadAccelerators	[USER.177]
+ *			LoadAccelerators16	[USER.177]
  */
-HANDLE LoadAccelerators(HANDLE instance, SEGPTR lpTableName)
+HACCEL16 LoadAccelerators16(HINSTANCE16 instance, SEGPTR lpTableName)
 {
-    HANDLE 	hAccel;
-    HANDLE 	rsc_mem;
-    HRSRC hRsrc;
+    HACCEL16 	hAccel;
+    HGLOBAL16 	rsc_mem;
+    HRSRC16 hRsrc;
     BYTE 	*lp;
     ACCELHEADER	*lpAccelTbl;
     int 	i, n;
@@ -273,12 +392,12 @@
         dprintf_accel( stddeb, "LoadAccelerators: %04x %04x\n",
                        instance, LOWORD(lpTableName) );
 
-    if (!(hRsrc = FindResource( instance, lpTableName, RT_ACCELERATOR )))
+    if (!(hRsrc = FindResource16( instance, lpTableName, RT_ACCELERATOR )))
       return 0;
-    if (!(rsc_mem = LoadResource( instance, hRsrc ))) return 0;
+    if (!(rsc_mem = LoadResource16( instance, hRsrc ))) return 0;
 
-    lp = (BYTE *)LockResource(rsc_mem);
-    n = SizeofResource( instance, hRsrc ) / sizeof(ACCELENTRY);
+    lp = (BYTE *)LockResource16(rsc_mem);
+    n = SizeofResource16(instance,hRsrc)/sizeof(ACCELENTRY);
     hAccel = GlobalAlloc16(GMEM_MOVEABLE, 
     	sizeof(ACCELHEADER) + (n + 1)*sizeof(ACCELENTRY));
     lpAccelTbl = (LPACCELHEADER)GlobalLock16(hAccel);
@@ -297,10 +416,78 @@
 	lpAccelTbl->wCount++;
  	}
     GlobalUnlock16(hAccel);
-    FreeResource( rsc_mem );
+    FreeResource16( rsc_mem );
     return hAccel;
 }
-
+
+/**********************************************************************
+ *			LoadAccelerators32W	[USER.177]
+ */
+HACCEL32 LoadAccelerators32W(HINSTANCE32 instance,LPCWSTR lpTableName)
+{
+#if 0
+    HACCEL32 	hAccel;
+    HGLOBAL32 	rsc_mem;
+    HRSRC32 hRsrc;
+    BYTE 	*lp;
+    ACCELHEADER	*lpAccelTbl;
+    int 	i, n;
+
+    if (HIWORD(lpTableName))
+        dprintf_accel( stddeb, "LoadAccelerators: %04x '%s'\n",
+                      instance, (char *)( lpTableName ) );
+    else
+        dprintf_accel( stddeb, "LoadAccelerators: %04x %04x\n",
+                       instance, LOWORD(lpTableName) );
+
+    if (!(hRsrc = FindResource32W( instance, lpTableName, 
+		(LPCWSTR)RT_ACCELERATOR )))
+      return 0;
+    if (!(rsc_mem = LoadResource32( instance, hRsrc ))) return 0;
+
+    lp = (BYTE *)LockResource32(rsc_mem);
+    n = SizeofResource32(instance,hRsrc)/sizeof(ACCELENTRY);
+    hAccel = GlobalAlloc16(GMEM_MOVEABLE, 
+    	sizeof(ACCELHEADER) + (n + 1)*sizeof(ACCELENTRY));
+    lpAccelTbl = (LPACCELHEADER)GlobalLock16(hAccel);
+    lpAccelTbl->wCount = 0;
+    for (i = 0; i < n; i++) {
+	lpAccelTbl->tbl[i].type = *(lp++);
+	lpAccelTbl->tbl[i].wEvent = *((WORD *)lp);
+	lp += 2;
+	lpAccelTbl->tbl[i].wIDval = *((WORD *)lp);
+	lp += 2;
+    	if (lpAccelTbl->tbl[i].wEvent == 0) break;
+	dprintf_accel(stddeb,
+		"Accelerator #%u / event=%04X id=%04X type=%02X \n", 
+		i, lpAccelTbl->tbl[i].wEvent, lpAccelTbl->tbl[i].wIDval, 
+		lpAccelTbl->tbl[i].type);
+	lpAccelTbl->wCount++;
+ 	}
+    GlobalUnlock16(hAccel);
+    FreeResource32(rsc_mem);
+    return hAccel;
+#else
+	fprintf(stderr,"LoadAcceleratorsW: not implemented\n");
+	return 0x100;  /* Return something anyway */
+#endif
+}
+
+HACCEL32 LoadAccelerators32A(HINSTANCE32 instance,LPCSTR lpTableName)
+{
+	LPWSTR	 uni;
+	HACCEL32 result;
+	if (HIWORD(lpTableName))
+		uni=STRING32_DupAnsiToUni(lpTableName);
+	else
+		uni=(LPWSTR)lpTableName;
+	result=LoadAccelerators32W(instance,uni);
+	if (HIWORD(uni))
+		free(uni);
+	return result;
+}
+
+
 /**********************************************************************
  *			TranslateAccelerator 	[USER.178]
  */
@@ -351,14 +538,15 @@
     GlobalUnlock16(hAccel);
     return 0;
 }
-
+
 /**********************************************************************
- *					LoadString
+ *					LoadString16
  */
-int
-LoadString(HANDLE instance, WORD resource_id, LPSTR buffer, int buflen)
+INT16
+LoadString16(HINSTANCE16 instance,UINT16 resource_id,LPSTR buffer,INT16 buflen)
 {
-    HANDLE hmem, hrsrc;
+    HGLOBAL16 hmem;
+    HRSRC16 hrsrc;
     unsigned char *p;
     int string_num;
     int i;
@@ -366,12 +554,12 @@
     dprintf_resource(stddeb,"LoadString: inst=%04x id=%04x buff=%08x len=%d\n",
                      instance, resource_id, (int) buffer, buflen);
 
-    hrsrc = FindResource( instance, (SEGPTR)((resource_id>>4)+1), RT_STRING );
+    hrsrc = FindResource16( instance, (SEGPTR)((resource_id>>4)+1), RT_STRING );
     if (!hrsrc) return 0;
-    hmem = LoadResource( instance, hrsrc );
+    hmem = LoadResource16( instance, hrsrc );
     if (!hmem) return 0;
     
-    p = LockResource(hmem);
+    p = LockResource16(hmem);
     string_num = resource_id & 0x000f;
     for (i = 0; i < string_num; i++)
 	p += *p + 1;
@@ -392,11 +580,73 @@
 	fprintf(stderr,"LoadString // I dont know why , but caller give buflen=%d *p=%d !\n", buflen, *p);
 	fprintf(stderr,"LoadString // and try to obtain string '%s'\n", p + 1);
     }
-    FreeResource( hmem );
+    FreeResource16( hmem );
 
     dprintf_resource(stddeb,"LoadString // '%s' copied !\n", buffer);
     return i;
 }
 
+/**********************************************************************
+ *	LoadString32W		(USER32.375)
+ */
+INT32
+LoadString32W(HINSTANCE32 instance,UINT32 resource_id,LPWSTR buffer,int buflen)
+{
+    HGLOBAL32 hmem;
+    HRSRC32 hrsrc;
+    WCHAR *p;
+    int string_num;
+    int i;
 
+    dprintf_resource(stddeb, "LoadString: instance = %04x, id = %04x, buffer = %08x, "
+	   "length = %d\n", instance, (int)resource_id, (int) buffer, buflen);
+
+    hrsrc = FindResource32W( instance, (LPCWSTR)((resource_id>>4)+1), 
+		(LPCWSTR)RT_STRING );
+    if (!hrsrc) return 0;
+    hmem = LoadResource32( instance, hrsrc );
+    if (!hmem) return 0;
+    
+    p = LockResource32(hmem);
+    string_num = resource_id & 0x000f;
+    for (i = 0; i < string_num; i++)
+	p += *p + 1;
+    
+    dprintf_resource( stddeb, "strlen = %d\n", (int)*p );
+    
+    i = MIN(buflen - 1, *p);
+    if (buffer == NULL)
+	return i;
+    if (i > 0) {
+	memcpy(buffer, p + 1, i * sizeof (WCHAR));
+	buffer[i] = (WCHAR) 0;
+    } else {
+	if (buflen > 1) {
+	    buffer[0] = (WCHAR) 0;
+	    return 0;
+	}
+#if 0
+	fprintf(stderr,"LoadString // I dont know why , but caller give buflen=%d *p=%d !\n", buflen, *p);
+	fprintf(stderr,"LoadString // and try to obtain string '%s'\n", p + 1);
+#endif
+    }
+#if 0
+    dprintf_resource(stddeb,"LoadString // '%s' copied !\n", buffer);
+#endif
+    return i;
+}
+
+/**********************************************************************
+ *	LoadString32A	(USER32.374)
+ */
+INT32
+LoadString32A(HINSTANCE32 instance,UINT32 resource_id,LPSTR buffer,int buflen)
+{
+    LPWSTR buffer2 = (LPWSTR)xmalloc(buflen*2);
+    INT32 retval = LoadString32W(instance,resource_id,buffer2,buflen);
+
+    STRING32_UniToAnsi(buffer,buffer2);
+    free(buffer2);
+    return retval;
+}
 
diff --git a/loader/task.c b/loader/task.c
index 1cfeb3a..ef862d2 100644
--- a/loader/task.c
+++ b/loader/task.c
@@ -38,19 +38,27 @@
 #define STACK32_SIZE 0x10000
 
 extern void USER_AppExit(HTASK, HINSTANCE, HQUEUE );
-/* ------ Internal variables ------ */
 
-static HTASK hFirstTask = 0;
-static HTASK hCurrentTask = 0;
-static HTASK hTaskToKill = 0;
-static HTASK hLockedTask = 0;
+  /* Saved 16-bit stack for current process (Win16 only) */
+WORD IF1632_Saved16_ss = 0;
+WORD IF1632_Saved16_sp = 0;
+
+  /* Saved 32-bit stack for current process (Win16 only) */
+DWORD IF1632_Saved32_esp = 0;
+SEGPTR IF1632_Stack32_base = 0;
+
+  /* Original Unix stack */
+DWORD IF1632_Original32_esp;
+
+static HTASK16 hFirstTask = 0;
+static HTASK16 hCurrentTask = 0;
+static HTASK16 hTaskToKill = 0;
+static HTASK16 hLockedTask = 0;
 static WORD nTaskCount = 0;
 static HANDLE hDOSEnvironment = 0;
 
-/* ------ Internal declarations ------ */
-
   /* TASK_Reschedule() 16-bit entry point */
-static FARPROC TASK_RescheduleProc;
+static FARPROC16 TASK_RescheduleProc;
 
 #ifdef WINELIB
 #define TASK_SCHEDULE()  TASK_Reschedule();
@@ -63,7 +71,7 @@
 /***********************************************************************
  *           TASK_Init
  */
-BOOL TASK_Init(void)
+BOOL32 TASK_Init(void)
 {
     TASK_RescheduleProc = MODULE_GetWndProcEntry16( "TASK_Reschedule" );
     if (!(hDOSEnvironment = TASK_CreateDOSEnvironment()))
@@ -196,9 +204,9 @@
 /***********************************************************************
  *           TASK_LinkTask
  */
-static void TASK_LinkTask( HTASK hTask )
+static void TASK_LinkTask( HTASK16 hTask )
 {
-    HTASK *prevTask;
+    HTASK16 *prevTask;
     TDB *pTask;
 
     if (!(pTask = (TDB *)GlobalLock16( hTask ))) return;
@@ -218,9 +226,9 @@
 /***********************************************************************
  *           TASK_UnlinkTask
  */
-static void TASK_UnlinkTask( HTASK hTask )
+static void TASK_UnlinkTask( HTASK16 hTask )
 {
-    HTASK *prevTask;
+    HTASK16 *prevTask;
     TDB *pTask;
 
     prevTask = &hFirstTask;
@@ -369,7 +377,7 @@
                  cs_reg, ip_reg, ds_reg,
                  IF1632_Saved16_ss, IF1632_Saved16_sp);
 
-    CallTo16_regs_( (FARPROC)(cs_reg << 16 | ip_reg), ds_reg,
+    CallTo16_regs_( (FARPROC16)(cs_reg << 16 | ip_reg), ds_reg,
                    pTask->hPDB /*es*/, 0 /*bp*/, 0 /*ax*/,
                    pModule->stack_size /*bx*/, pModule->heap_size /*cx*/,
                    0 /*dx*/, 0 /*si*/, ds_reg /*di*/ );
@@ -384,8 +392,9 @@
 /***********************************************************************
  *           TASK_CreateTask
  */
-HTASK TASK_CreateTask( HMODULE hModule, HANDLE hInstance, HANDLE hPrevInstance,
-                       HANDLE hEnvironment, char *cmdLine, WORD cmdShow )
+HTASK16 TASK_CreateTask( HMODULE16 hModule, HINSTANCE16 hInstance,
+                         HINSTANCE16 hPrevInstance, HANDLE16 hEnvironment,
+                         LPCSTR cmdLine, UINT16 cmdShow )
 {
     HTASK hTask;
     TDB *pTask;
@@ -394,10 +403,10 @@
     SEGTABLEENTRY *pSegTable;
     LPSTR name;
     char filename[256];
-#ifndef WINELIB32
     char *stack16Top, *stack32Top;
     STACK16FRAME *frame16;
     STACK32FRAME *frame32;
+#ifndef WINELIB32
     extern DWORD CALLTO16_RetAddr_word;
 #endif
     
@@ -466,17 +475,16 @@
       /* Fill the PDB */
 
     pTask->pdb.int20 = 0x20cd;
-#ifndef WINELIB
     pTask->pdb.dispatcher[0] = 0x9a;  /* ljmp */
+#ifndef WINELIB
     *(FARPROC16 *)&pTask->pdb.dispatcher[1] = MODULE_GetEntryPoint( GetModuleHandle("KERNEL"), 102 );  /* KERNEL.102 is DOS3Call() */
     pTask->pdb.savedint22 = INT_GetHandler( 0x22 );
     pTask->pdb.savedint23 = INT_GetHandler( 0x23 );
     pTask->pdb.savedint24 = INT_GetHandler( 0x24 );
-    pTask->pdb.fileHandlesPtr = (SEGPTR)MAKELONG( 0x18,
-                                              GlobalHandleToSel(pTask->hPDB) );
-#else
-    pTask->pdb.fileHandlesPtr = pTask->pdb.fileHandles;
 #endif
+    pTask->pdb.fileHandlesPtr =
+        PTR_SEG_OFF_TO_SEGPTR( GlobalHandleToSel(pTask->hPDB),
+                               (int)&((PDB *)0)->fileHandles );
     memset( pTask->pdb.fileHandles, 0xff, sizeof(pTask->pdb.fileHandles) );
     pTask->pdb.environment    = hEnvironment;
     pTask->pdb.nbFiles        = 20;
@@ -504,7 +512,6 @@
 
       /* Allocate the 32-bit stack */
 
-#ifndef WINELIB
     pTask->hStack32 = GLOBAL_Alloc( GMEM_FIXED, STACK32_SIZE, pTask->hPDB,
                                     FALSE, FALSE, FALSE );
 
@@ -520,8 +527,10 @@
     frame32->ecx = 0;
     frame32->ebx = 0;
     frame32->ebp = 0;
+#ifndef WINELIB
     frame32->retaddr = (DWORD)TASK_CallToStart;
     frame32->codeselector = WINE_CODE_SELECTOR;
+#endif
     pTask->esp = (DWORD)frame32;
 
       /* Create the 16-bit stack frame */
@@ -531,15 +540,17 @@
                  pSegTable[pModule->ss-1].minsize + pModule->stack_size) & ~1;
     stack16Top = (char *)PTR_SEG_OFF_TO_LIN( pTask->ss, pTask->sp );
     frame16 = (STACK16FRAME *)stack16Top - 1;
-    frame16->saved_ss = 0; /*pTask->ss;*/
-    frame16->saved_sp = 0; /*pTask->sp;*/
+    frame16->saved_ss = 0;
+    frame16->saved_sp = 0;
     frame16->ds = frame16->es = pTask->hInstance;
     frame16->entry_point = 0;
     frame16->entry_ip = OFFSETOF(TASK_RescheduleProc) + 14;
     frame16->entry_cs = SELECTOROF(TASK_RescheduleProc);
     frame16->bp = 0;
+#ifndef WINELIB
     frame16->ip = LOWORD( CALLTO16_RetAddr_word );
     frame16->cs = HIWORD( CALLTO16_RetAddr_word );
+#endif  /* WINELIB */
     pTask->sp -= sizeof(STACK16FRAME);
 
       /* If there's no 16-bit stack yet, use a part of the new task stack */
@@ -554,6 +565,7 @@
 
       /* Add a breakpoint at the start of the task */
 
+#ifndef WINELIB
     if (Options.debug)
     {
         if (pModule->flags & NE_FFLAGS_WIN32)
@@ -570,7 +582,7 @@
             DEBUG_AddBreakpoint( &addr );
         }
     }
-#endif
+#endif  /* WINELIB */
 
       /* Add the task to the linked list */
 
@@ -626,7 +638,7 @@
  * be killed when either TASK_Reschedule or this function is called again 
  * in the context of another task.
  */
-void TASK_KillCurrentTask( int exitCode )
+void TASK_KillCurrentTask( INT16 exitCode )
 {
     extern void EXEC_ExitWindows( int retCode );
 
@@ -731,7 +743,6 @@
 
       /* Save the stacks of the previous task (if any) */
 
-#ifndef WINELIB /* FIXME: JBP: IF1632 not allowed in libwine.a */
     if (pOldTask)
     {
         pOldTask->ss  = IF1632_Saved16_ss;
@@ -739,7 +750,6 @@
         pOldTask->esp = IF1632_Saved32_esp;
     }
     else IF1632_Original32_esp = IF1632_Saved32_esp;
-#endif
 
      /* Make the task the last in the linked list (round-robin scheduling) */
 
@@ -751,12 +761,10 @@
       /* Switch to the new stack */
 
     hCurrentTask = hTask;
-#ifndef WINELIB /* FIXME: JBP: IF1632 not allowed in libwine.a */
     IF1632_Saved16_ss   = pNewTask->ss;
     IF1632_Saved16_sp   = pNewTask->sp;
     IF1632_Saved32_esp  = pNewTask->esp;
     IF1632_Stack32_base = WIN16_GlobalLock16( pNewTask->hStack32 );
-#endif
 }
 
 
@@ -965,7 +973,7 @@
     SEGPTR thunkaddr;
     
     thunkaddr = TASK_AllocThunk( hCurrentTask );
-    if (!thunkaddr) return (FARPROC)0;
+    if (!thunkaddr) return (FARPROC16)0;
     thunk = PTR_SEG_TO_LIN( thunkaddr );
 
     dprintf_task( stddeb, "MakeProcInstance(%08lx,%04x): got thunk %08lx\n",
@@ -976,7 +984,7 @@
     *thunk++ = (BYTE)(hInstance >> 8);
     *thunk++ = 0xea;    /* ljmp func */
     *(DWORD *)thunk = (DWORD)func;
-    return (FARPROC)thunkaddr;
+    return (FARPROC16)thunkaddr;
 #endif
 }
 
@@ -996,7 +1004,7 @@
 /**********************************************************************
  *	    GetCodeHandle    (KERNEL.93)
  */
-HANDLE GetCodeHandle( FARPROC proc )
+HANDLE GetCodeHandle( FARPROC16 proc )
 {
 #ifndef WINELIB32
     HANDLE handle;
@@ -1109,7 +1117,7 @@
     char *ptr = (char *)GlobalLock16( instance );
     if (!ptr || !len) return 0;
     if ((int)buffer + len >= 0x10000) len = 0x10000 - buffer;
-    memcpy( ptr + buffer, (char *)GlobalLock16( CURRENT_DS ) + buffer, len );
+    memcpy( (char *)GlobalLock16(CURRENT_DS) + buffer, ptr + buffer, len );
     return len;
 }
 
@@ -1178,11 +1186,11 @@
 /***********************************************************************
  *           GetExePtr   (KERNEL.133)
  */
-HMODULE GetExePtr( HANDLE handle )
+HMODULE16 GetExePtr( HANDLE16 handle )
 {
     char *ptr;
-    HTASK hTask;
-    HANDLE owner;
+    HTASK16 hTask;
+    HANDLE16 owner;
 
       /* Check for module handle */
 
diff --git a/memory/Makefile.in b/memory/Makefile.in
index a2e5b36..c0e1c98 100644
--- a/memory/Makefile.in
+++ b/memory/Makefile.in
@@ -1,3 +1,4 @@
+DEFS   = -D__WINE__
 TOPSRC = @top_srcdir@
 MODULE = memory
 
diff --git a/memory/global.c b/memory/global.c
index c21f5ce..c3d66a7 100644
--- a/memory/global.c
+++ b/memory/global.c
@@ -46,6 +46,8 @@
 static GLOBALARENA *pGlobalArena = NULL;
 static int globalArenaSize = 0;
 
+static DWORD globalDOSfree = 655350;
+
 #define GLOBAL_MAX_ALLOC_SIZE 0x00ff0000  /* Largest allocation is 16M - 64K */
 
 #define GET_ARENA_PTR(handle)  (pGlobalArena + ((handle) >> __AHSHIFT))
@@ -550,11 +552,21 @@
 
 /***********************************************************************
  *           GlobalDOSAlloc   (KERNEL.184)
+ *
+ * Some programs rely on failure to allocate > 640K total with this function
  */
 DWORD GlobalDOSAlloc( DWORD size )
 {
-    WORD sel = GlobalAlloc16( GMEM_FIXED, size );
+    WORD sel;
+
+    if (size > globalDOSfree) return 0;
+    sel = GlobalAlloc16( GMEM_FIXED, size );
+
+    dprintf_global( stddeb, "GlobalDOSAlloc: %08lx -> returning %04x\n",
+                    size, sel );
     if (!sel) return 0;
+
+    globalDOSfree -= size;
     return MAKELONG( sel, sel /* this one ought to be a real-mode segment */ );
 }
 
@@ -564,7 +576,12 @@
  */
 WORD GlobalDOSFree( WORD sel )
 {
-    return GlobalFree16( GlobalHandle16(sel) ) ? sel : 0;
+    GLOBALARENA *pArena = GET_ARENA_PTR(sel);
+
+    if (!pArena) return sel;
+    globalDOSfree += pArena->size;
+    GlobalFree16( pArena->handle );
+    return 0;
 }
 
 
@@ -652,7 +669,7 @@
 /***********************************************************************
  *           FarSetOwner   (KERNEL.403)
  */
-void FarSetOwner( HANDLE16 handle, HANDLE16 hOwner )
+void FarSetOwner( HGLOBAL16 handle, HANDLE16 hOwner )
 {
     GET_ARENA_PTR(handle)->hOwner = hOwner;
 }
@@ -661,7 +678,7 @@
 /***********************************************************************
  *           FarGetOwner   (KERNEL.404)
  */
-HANDLE16 FarGetOwner( HANDLE16 handle )
+HANDLE16 FarGetOwner( HGLOBAL16 handle )
 {
     return GET_ARENA_PTR(handle)->hOwner;
 }
diff --git a/memory/ldt.c b/memory/ldt.c
index 20ba25e..3511637 100644
--- a/memory/ldt.c
+++ b/memory/ldt.c
@@ -95,6 +95,7 @@
     content->seg_32bit      = (ldt_flags_copy[entry] & LDT_FLAGS_32BIT) != 0;
     content->read_only      = (ldt_flags_copy[entry] & LDT_FLAGS_READONLY) !=0;
     content->limit_in_pages = (ldt_flags_copy[entry] & LDT_FLAGS_BIG) !=0;
+    if (content->limit_in_pages) content->limit >>= 12;
     return ret;
 }
 
@@ -134,7 +135,34 @@
         ldt_info.contents       = content->type;
         ldt_info.read_exec_only = content->read_only != 0;
         ldt_info.limit_in_pages = content->limit_in_pages != 0;
-        ret = modify_ldt(1, &ldt_info, sizeof(ldt_info));
+        /* Make sure the info will be accepted by the kernel */
+        /* This is ugly, but what can I do? */
+        if (content->type == SEGMENT_STACK)
+        {
+            /* FIXME */
+        }
+        else
+        {
+            if (ldt_info.base_addr >= 0xc0000000)
+            {
+                fprintf( stderr, "LDT_SetEntry: invalid base addr %08lx\n",
+                         ldt_info.base_addr );
+                return -1;
+            }
+            if (content->limit_in_pages)
+            {
+                if ((ldt_info.limit << 12) + 0xfff >
+                                               0xc0000000 - ldt_info.base_addr)
+                    ldt_info.limit = (0xc0000000 - 0xfff - ldt_info.base_addr) >> 12;
+            }
+            else
+            {
+                if (ldt_info.limit > 0xc0000000 - ldt_info.base_addr)
+                    ldt_info.limit = 0xc0000000 - ldt_info.base_addr;
+            }
+        }
+        if ((ret = modify_ldt(1, &ldt_info, sizeof(ldt_info))) < 0)
+            perror( "modify_ldt" );
     }
 #endif  /* linux */
 
@@ -223,10 +251,9 @@
             flags[1] = (ldt_flags_copy[i] & LDT_FLAGS_READONLY) ? '-' : 'w';
             flags[2] = '-';
         }
-        printf("%04x: sel=%04x base=%08lx limit=%05lx %s %d-bit %c%c%c\n",
+        printf("%04x: sel=%04x base=%08lx limit=%08lx %d-bit %c%c%c\n",
                 i, ENTRY_TO_SELECTOR(i),
                 ldt_copy[i].base, ldt_copy[i].limit,
-                ldt_flags_copy[i] & LDT_FLAGS_BIG ? "(pages)" : "(bytes)",
                 ldt_flags_copy[i] & LDT_FLAGS_32BIT ? 32 : 16,
                 flags[0], flags[1], flags[2] );
     }
diff --git a/memory/local.c b/memory/local.c
index 502d738..9f5c762 100644
--- a/memory/local.c
+++ b/memory/local.c
@@ -26,10 +26,6 @@
 #include "stddebug.h"
 #include "debug.h"
 
-#ifndef WINELIB
-#pragma pack(1)
-#endif
-
 typedef struct
 {
 /* Arena header */
@@ -61,6 +57,8 @@
     BYTE lock;                /* Lock count */
 } LOCALHANDLEENTRY;
 
+#pragma pack(1)
+
 typedef struct
 {
     WORD check;                 /* 00 Heap checking flag */
@@ -85,9 +83,7 @@
     WORD magic;                 /* 28 Magic number */
 } LOCALHEAPINFO;
 
-#ifndef WINELIB
 #pragma pack(4)
-#endif
 
 #define LOCAL_HEAP_MAGIC  0x484c  /* 'LH' */
 
diff --git a/memory/selector.c b/memory/selector.c
index b0ddc79..a38a0d1 100644
--- a/memory/selector.c
+++ b/memory/selector.c
@@ -82,7 +82,6 @@
     }
 
     /* Clear the saved 16-bit selector */
-#ifndef WINELIB
     frame = CURRENT_STACK16;
     while (frame)
     {
@@ -90,7 +89,6 @@
         if ((frame->es >= sel) && (frame->es < nextsel)) frame->es = 0;
 	frame = PTR_SEG_OFF_TO_LIN(frame->saved_ss, frame->saved_sp);
     }
-#endif
     return 0;
 }
 
@@ -297,7 +295,9 @@
 {
     ldt_entry entry;
     LDT_GetEntry( SELECTOR_TO_ENTRY(sel), &entry );
-    entry.limit = limit;
+    entry.limit_in_pages = (limit >= 0x100000);
+    if (entry.limit_in_pages) entry.limit = limit >> 12;
+    else entry.limit = limit;
     LDT_SetEntry( SELECTOR_TO_ENTRY(sel), &entry );
     return sel;
 }
diff --git a/memory/string.c b/memory/string.c
index 399eb06..8dd57a2 100644
--- a/memory/string.c
+++ b/memory/string.c
@@ -357,25 +357,7 @@
  */
 VOID RtlMoveMemory( LPVOID dst, LPCVOID src, UINT32 len )
 {
-    /* memcpy does not support overlapped copies, */
-    /* and memmove is not portable. */
-    if (((BYTE *)dst + len <= (BYTE *)src) ||
-        ((BYTE *)src + len <= (BYTE *)dst))
-    {
-        memcpy( dst, src, len );
-        return;
-    }
-    /* do it the hard way (FIXME: could do better than this) */
-    if (dst < src)
-    {
-        while (len--) *((BYTE *)dst)++ = *((BYTE *)src)++;
-    }
-    else
-    {
-        dst = (BYTE *)dst + len - 1;
-        src = (BYTE *)src + len - 1;
-        while (len--) *((BYTE *)dst)-- = *((BYTE *)src)--;
-    }
+    memmove( dst, src, len );
 }
 
 
diff --git a/misc/Makefile.in b/misc/Makefile.in
index 45872d9..a3acb9e 100644
--- a/misc/Makefile.in
+++ b/misc/Makefile.in
@@ -1,3 +1,4 @@
+DEFS   = -D__WINE__
 TOPSRC = @top_srcdir@
 MODULE = misc
 
diff --git a/misc/commdlg.c b/misc/commdlg.c
index 3745eaf..dda9e25 100644
--- a/misc/commdlg.c
+++ b/misc/commdlg.c
@@ -38,11 +38,11 @@
     static BOOL initialized = 0;
     
     if (!initialized) {
-	if (!hFolder) hFolder = LoadBitmap(0, MAKEINTRESOURCE(OBM_FOLDER));
-	if (!hFolder2) hFolder2 = LoadBitmap(0, MAKEINTRESOURCE(OBM_FOLDER2));
-	if (!hFloppy) hFloppy = LoadBitmap(0, MAKEINTRESOURCE(OBM_FLOPPY));
-	if (!hHDisk) hHDisk = LoadBitmap(0, MAKEINTRESOURCE(OBM_HDISK));
-	if (!hCDRom) hCDRom = LoadBitmap(0, MAKEINTRESOURCE(OBM_CDROM));
+	if (!hFolder) hFolder = LoadBitmap16(0, MAKEINTRESOURCE(OBM_FOLDER));
+	if (!hFolder2) hFolder2 = LoadBitmap16(0, MAKEINTRESOURCE(OBM_FOLDER2));
+	if (!hFloppy) hFloppy = LoadBitmap16(0, MAKEINTRESOURCE(OBM_FLOPPY));
+	if (!hHDisk) hHDisk = LoadBitmap16(0, MAKEINTRESOURCE(OBM_HDISK));
+	if (!hCDRom) hCDRom = LoadBitmap16(0, MAKEINTRESOURCE(OBM_CDROM));
 	if (hFolder == 0 || hFolder2 == 0 || hFloppy == 0 || 
 	    hHDisk == 0 || hCDRom == 0)
 	{	
@@ -68,13 +68,13 @@
     if (lpofn->Flags & OFN_ENABLETEMPLATEHANDLE) hDlgTmpl = lpofn->hInstance;
     else if (lpofn->Flags & OFN_ENABLETEMPLATE)
     {
-        if (!(hResInfo = FindResource( lpofn->hInstance,
-                                       lpofn->lpTemplateName, RT_DIALOG)))
+        if (!(hResInfo = FindResource16(lpofn->hInstance,
+                                        lpofn->lpTemplateName, RT_DIALOG)))
         {
             CommDlgLastError = CDERR_FINDRESFAILURE;
             return FALSE;
         }
-        hDlgTmpl = LoadResource( lpofn->hInstance, hResInfo );
+        hDlgTmpl = LoadResource16( lpofn->hInstance, hResInfo );
     }
     else hDlgTmpl = SYSRES_LoadResource( SYSRES_DIALOG_OPEN_FILE );
     if (!hDlgTmpl)
@@ -90,7 +90,7 @@
 
     if (!(lpofn->Flags & OFN_ENABLETEMPLATEHANDLE))
     {
-        if (lpofn->Flags & OFN_ENABLETEMPLATE) FreeResource( hDlgTmpl );
+        if (lpofn->Flags & OFN_ENABLETEMPLATE) FreeResource16( hDlgTmpl );
         else SYSRES_FreeResource( hDlgTmpl );
     }
 
@@ -115,13 +115,13 @@
     else if (lpofn->Flags & OFN_ENABLETEMPLATE)
     {
         hInst = lpofn->hInstance;
-        if (!(hResInfo = FindResource( lpofn->hInstance,
-                                       lpofn->lpTemplateName, RT_DIALOG )))
+        if (!(hResInfo = FindResource16(lpofn->hInstance,
+                                        lpofn->lpTemplateName, RT_DIALOG )))
         {
             CommDlgLastError = CDERR_FINDRESFAILURE;
             return FALSE;
         }
-        hDlgTmpl = LoadResource( lpofn->hInstance, hResInfo );
+        hDlgTmpl = LoadResource16( lpofn->hInstance, hResInfo );
     }
     else hDlgTmpl = SYSRES_LoadResource( SYSRES_DIALOG_SAVE_FILE );
 
@@ -131,7 +131,7 @@
                         (DWORD)lpofn); 
     if (!(lpofn->Flags & OFN_ENABLETEMPLATEHANDLE))
     {
-        if (lpofn->Flags & OFN_ENABLETEMPLATE) FreeResource( hDlgTmpl );
+        if (lpofn->Flags & OFN_ENABLETEMPLATE) FreeResource16( hDlgTmpl );
         else SYSRES_FreeResource( hDlgTmpl );
     }
 
@@ -375,7 +375,7 @@
   SetDlgItemText32A( hWnd, edt1, tmpstr );
   /* get drive list */
   *tmpstr = 0;
-  DlgDirListComboBox16(hWnd, tmpstr, cmb2, 0, 0xC000);
+  DlgDirListComboBox16(hWnd, (LPSTR)MAKE_SEGPTR(tmpstr), cmb2, 0, 0xC000);
   /* read initial directory */
   if (PTR_SEG_TO_LIN(lpofn->lpstrInitialDir) != NULL) 
     {
@@ -1101,13 +1101,13 @@
     if (lpChCol->Flags & CC_ENABLETEMPLATEHANDLE) hDlgTmpl = lpChCol->hInstance;
     else if (lpChCol->Flags & CC_ENABLETEMPLATE)
     {
-        if (!(hResInfo = FindResource( lpChCol->hInstance,
-                                       lpChCol->lpTemplateName, RT_DIALOG)))
+        if (!(hResInfo = FindResource16(lpChCol->hInstance,
+                                        lpChCol->lpTemplateName, RT_DIALOG)))
         {
             CommDlgLastError = CDERR_FINDRESFAILURE;
             return FALSE;
         }
-        hDlgTmpl = LoadResource( lpChCol->hInstance, hResInfo );
+        hDlgTmpl = LoadResource16( lpChCol->hInstance, hResInfo );
     }
     else hDlgTmpl = SYSRES_LoadResource( SYSRES_DIALOG_CHOOSE_COLOR );
     if (!hDlgTmpl)
@@ -1121,7 +1121,7 @@
                            (DWORD)lpChCol );
     if (!(lpChCol->Flags & CC_ENABLETEMPLATEHANDLE))
     {
-        if (lpChCol->Flags & CC_ENABLETEMPLATE) FreeResource( hDlgTmpl );
+        if (lpChCol->Flags & CC_ENABLETEMPLATE) FreeResource16( hDlgTmpl );
         else SYSRES_FreeResource( hDlgTmpl );
     }
     return bRet;
@@ -1576,7 +1576,7 @@
  HBRUSH hbrush;
  HDC hdc ;
  RECT16 rect,client;
- HCURSOR hcursor=SetCursor(LoadCursor(0,IDC_WAIT));
+ HCURSOR hcursor=SetCursor(LoadCursor16(0,IDC_WAIT));
 
  GetClientRect16(hwnd,&client);
  hdc=GetDC(hwnd);
@@ -2182,13 +2182,13 @@
     if (lpChFont->Flags & CF_ENABLETEMPLATEHANDLE) hDlgTmpl = lpChFont->hInstance;
     else if (lpChFont->Flags & CF_ENABLETEMPLATE)
     {
-        if (!(hResInfo = FindResource( lpChFont->hInstance,
-                                       lpChFont->lpTemplateName, RT_DIALOG)))
+        if (!(hResInfo = FindResource16(lpChFont->hInstance,
+                                        lpChFont->lpTemplateName, RT_DIALOG)))
         {
             CommDlgLastError = CDERR_FINDRESFAILURE;
             return FALSE;
         }
-        hDlgTmpl = LoadResource( lpChFont->hInstance, hResInfo );
+        hDlgTmpl = LoadResource16( lpChFont->hInstance, hResInfo );
     }
     else hDlgTmpl = SYSRES_LoadResource( SYSRES_DIALOG_CHOOSE_FONT );
     if (!hDlgTmpl)
@@ -2202,7 +2202,7 @@
                       (DWORD)lpChFont );
     if (!(lpChFont->Flags & CF_ENABLETEMPLATEHANDLE))
     {
-        if (lpChFont->Flags & CF_ENABLETEMPLATE) FreeResource( hDlgTmpl );
+        if (lpChFont->Flags & CF_ENABLETEMPLATE) FreeResource16( hDlgTmpl );
         else SYSRES_FreeResource( hDlgTmpl );
     }
     return bRet;
@@ -2381,9 +2381,9 @@
   HDC hdc;
   int i,j,res,init=0;
   long l;
-  FARPROC enumCallback = MODULE_GetWndProcEntry16("FontFamilyEnumProc");
+  FARPROC16 enumCallback = MODULE_GetWndProcEntry16("FontFamilyEnumProc");
   LPLOGFONT16 lpxx;
-  HCURSOR hcursor=SetCursor(LoadCursor(0,IDC_WAIT));
+  HCURSOR hcursor=SetCursor(LoadCursor16(0,IDC_WAIT));
   LPCHOOSEFONT lpcf;
 
   SetWindowLong32A(hDlg, DWL_USER, lParam); 
@@ -2398,7 +2398,7 @@
     return FALSE;
   }
   if (!hBitmapTT)
-    hBitmapTT = LoadBitmap(0, MAKEINTRESOURCE(OBM_TRTYPE));
+    hBitmapTT = LoadBitmap16(0, MAKEINTRESOURCE(OBM_TRTYPE));
 			 
   if (!(lpcf->Flags & CF_SHOWHELP) || !IsWindow(lpcf->hwndOwner))
     ShowWindow(GetDlgItem(hDlg,pshHelp),SW_HIDE);
@@ -2495,7 +2495,7 @@
   BITMAP16 bm;
   LPMEASUREITEMSTRUCT16 lpmi=PTR_SEG_TO_LIN((LPMEASUREITEMSTRUCT16)lParam);
   if (!hBitmapTT)
-    hBitmapTT = LoadBitmap(0, MAKEINTRESOURCE(OBM_TRTYPE));
+    hBitmapTT = LoadBitmap16(0, MAKEINTRESOURCE(OBM_TRTYPE));
   GetObject16( hBitmapTT, sizeof(bm), &bm );
   lpmi->itemHeight=bm.bmHeight;
   /* FIXME: use MAX of bm.bmHeight and tm.tmHeight .*/
@@ -2615,7 +2615,7 @@
 LRESULT CFn_WMCommand(HWND hDlg, WPARAM wParam, LPARAM lParam)
 {
   char buffer[200];
-  FARPROC enumCallback;
+  FARPROC16 enumCallback;
   HFONT hFont/*,hFontOld*/;
   int i,j;
   long l;
@@ -2636,7 +2636,7 @@
 		      i=SendDlgItemMessage16(hDlg,cmb1,CB_GETCURSEL,0,0);
 		      if (i!=CB_ERR)
 		      {
-		        HCURSOR hcursor=SetCursor(LoadCursor(0,IDC_WAIT));
+		        HCURSOR hcursor=SetCursor(LoadCursor16(0,IDC_WAIT));
                         SendDlgItemMessage16(hDlg,cmb1,CB_GETLBTEXT,i,(LPARAM)MAKE_SEGPTR(buffer));
 	                dprintf_commdlg(stddeb,"WM_COMMAND/cmb1 =>%s\n",buffer);
 		        enumCallback = MODULE_GetWndProcEntry16("FontStyleEnumProc");
diff --git a/misc/driver.c b/misc/driver.c
index 6277f8a..4cc9043 100644
--- a/misc/driver.c
+++ b/misc/driver.c
@@ -195,7 +195,7 @@
 HMODULE16 GetDriverModuleHandle(HDRVR16 hDrvr)
 {
     LPDRIVERITEM lpdrv;
-    HMODULE hModule = 0;
+    HMODULE16 hModule = 0;
 
     dprintf_driver( stddeb, "GetDriverModuleHandle(%04x);\n", hDrvr);
 
diff --git a/misc/main.c b/misc/main.c
index 34dbccc..690775e 100644
--- a/misc/main.c
+++ b/misc/main.c
@@ -111,7 +111,8 @@
 #else
     LANG_En,
 #endif
-    FALSE	    /* Managed windows */
+    FALSE,          /* Managed windows */
+    FALSE           /* Perfect graphics */
 };
 
 
@@ -125,6 +126,7 @@
     { "-ipc",           ".ipc",             XrmoptionNoArg,  (caddr_t)"off"},
     { "-language",      ".language",        XrmoptionSepArg, (caddr_t)"En" },
     { "-name",          ".name",            XrmoptionSepArg, (caddr_t)NULL },
+    { "-perfect",       ".perfect",         XrmoptionNoArg,  (caddr_t)"on" },
     { "-privatemap",    ".privatemap",      XrmoptionNoArg,  (caddr_t)"on" },
     { "-fixedmap",      ".fixedmap",        XrmoptionNoArg,  (caddr_t)"on" },
     { "-synchronous",   ".synchronous",     XrmoptionNoArg,  (caddr_t)"on" },
@@ -158,6 +160,7 @@
   "    -managed        Allow the window manager to manage created windows\n" \
   "    -mode mode      Start Wine in a particular mode (standard or enhanced)\n" \
   "    -name name      Set the application name\n" \
+  "    -perfect        Favor correctness over speed for graphical operations\n" \
   "    -privatemap     Use a private color map\n" \
   "    -synchronous    Turn on synchronous display mode\n" \
   "    -winver         Version to imitate (one of win31,win95,nt351)\n"
@@ -407,6 +410,8 @@
         Options.allowReadOnly = TRUE;
     if (MAIN_GetResource( db, ".ipc", &value ))
         Options.ipc = TRUE;
+    if (MAIN_GetResource( db, ".perfect", &value ))
+	Options.perfectGraphics = TRUE;
     if (MAIN_GetResource( db, ".depth", &value))
 	screenDepth = atoi( value.addr );
     if (MAIN_GetResource( db, ".desktop", &value))
@@ -615,6 +620,13 @@
     
     MAIN_ParseOptions( &argc, argv );
 
+    if (Options.desktopGeometry && Options.managed)
+    {
+        fprintf( stderr, "%s: -managed and -desktop options cannot be used together\n",
+                 Options.programName );
+        exit(1);
+    }
+
     screen       = DefaultScreenOfDisplay( display );
     screenWidth  = WidthOfScreen( screen );
     screenHeight = HeightOfScreen( screen );
@@ -1175,7 +1187,7 @@
 /***********************************************************************
 *	FileCDR (KERNEL.130)
 */
-void FileCDR(FARPROC x)
+void FileCDR(FARPROC16 x)
 {
 	printf("FileCDR(%8x)\n", (int) x);
 }
diff --git a/misc/port.c b/misc/port.c
index ef3b3d7..33866f1 100644
--- a/misc/port.c
+++ b/misc/port.c
@@ -1,8 +1,14 @@
+/*
+ * Misc. functions for systems that don't have them
+ *
+ * Copyright 1996 Alexandre Julliard
+ */
+
+#include "config.h"
 #include <sys/types.h>
 #include <sys/time.h>
 
 #ifndef HAVE_USLEEP
-
 unsigned int usleep (unsigned int useconds)
 {
     struct timeval delay;
@@ -13,8 +19,28 @@
     select( 0, 0, 0, 0, &delay );
     return 0;
 }
-
 #endif /* HAVE_USLEEP */
 
-
-
+#ifndef HAVE_MEMMOVE
+void *memmove( void *dst, const void *src, unsigned int len )
+{
+    /* Use memcpy if not overlapping */
+    if (((char *)dst + len <= (char *)src) ||
+        ((char *)src + len <= (char *)dst))
+    {
+        memcpy( dst, src, len );
+    }
+    /* Otherwise do it the hard way (FIXME: could do better than this) */
+    else if (dst < src)
+    {
+        while (len--) *((char *)dst)++ = *((char *)src)++;
+    }
+    else
+    {
+        dst = (char *)dst + len - 1;
+        src = (char *)src + len - 1;
+        while (len--) *((char *)dst)-- = *((char *)src)--;
+    }
+    return dst;
+}
+#endif  /* HAVE_MEMMOVE */
diff --git a/misc/shell.c b/misc/shell.c
index 1025acb..e9dbbcb 100644
--- a/misc/shell.c
+++ b/misc/shell.c
@@ -359,7 +359,7 @@
     else *AppMisc = 0;
     AppMisc[sizeof(AppMisc)-1]=0;
 
-    if (!hIcon) hIcon = LoadIcon(0,MAKEINTRESOURCE(OIC_WINEICON));
+    if (!hIcon) hIcon = LoadIcon16(0,MAKEINTRESOURCE(OIC_WINEICON));
     handle = SYSRES_LoadResource( SYSRES_DIALOG_SHELL_ABOUT_MSGBOX );
     if (!handle) return FALSE;
     bRet = DialogBoxIndirectParam16( WIN_GetWindowInstance( hWnd ),
@@ -552,9 +552,9 @@
  * Return icon for given file (either from file itself or from associated
  * executable) and patch parameters if needed.
  */
-HICON ExtractAssociatedIcon(HINSTANCE hInst,LPSTR lpIconPath, LPWORD lpiIcon)
+HICON16 ExtractAssociatedIcon(HINSTANCE16 hInst,LPSTR lpIconPath,LPWORD lpiIcon)
 {
-    HICON hIcon = ExtractIcon(hInst, lpIconPath, *lpiIcon);
+    HICON16 hIcon = ExtractIcon(hInst, lpIconPath, *lpiIcon);
 
     if( hIcon < 2 )
       {
@@ -580,7 +580,7 @@
 	  *lpiIcon = 6;   /* generic icon - found nothing */
 
         GetModuleFileName(hInst, lpIconPath, 0x80);
-	hIcon = LoadIcon( hInst, MAKEINTRESOURCE(*lpiIcon));
+	hIcon = LoadIcon16( hInst, MAKEINTRESOURCE(*lpiIcon));
       }
 
     return hIcon;
diff --git a/misc/toolhelp.c b/misc/toolhelp.c
index 551078c..ff4c04b 100644
--- a/misc/toolhelp.c
+++ b/misc/toolhelp.c
@@ -23,7 +23,7 @@
 static struct notify
 {
     HTASK    htask;
-    FARPROC  lpfnCallback;
+    FARPROC16 lpfnCallback;
     WORD     wFlags;
 } *notifys = NULL;
 
diff --git a/misc/winsocket.c b/misc/winsocket.c
index dfa5fe0..d90ff82 100644
--- a/misc/winsocket.c
+++ b/misc/winsocket.c
@@ -37,7 +37,7 @@
 static WORD wsa_errno;
 static int wsa_initted;
 static key_t wine_key = 0;
-static FARPROC BlockFunction;
+static FARPROC16 BlockFunction;
 static fd_set fd_in_use;
 
 extern int h_errno;
@@ -1423,7 +1423,7 @@
 	return 0;
 }
 
-FARPROC WSASetBlockingHook(FARPROC lpBlockFunc)
+FARPROC16 WSASetBlockingHook(FARPROC16 lpBlockFunc)
 {
 	dprintf_winsock(stddeb, "WSA_SetBlockHook %8lx, STUB!\n", (unsigned long) lpBlockFunc);
 
@@ -1434,7 +1434,7 @@
 
 	BlockFunction = lpBlockFunc;
 
-	return (FARPROC) lpBlockFunc;
+	return (FARPROC16) lpBlockFunc;
 }
 
 INT WSAUnhookBlockingHook(void)
diff --git a/misc/wsprintf.c b/misc/wsprintf.c
index a57d23f..0eb9a2d 100644
--- a/misc/wsprintf.c
+++ b/misc/wsprintf.c
@@ -254,7 +254,8 @@
             break;
         case WPR_WSTRING:  /* No Unicode in Win16 */
         case WPR_STRING:
-            cur_arg = (DWORD)PTR_SEG_TO_LIN( *(SEGPTR *)args );
+            if (IsBadReadPtr( *(SEGPTR *)args, 1 )) cur_arg = (DWORD)"";
+            else cur_arg = (DWORD)PTR_SEG_TO_LIN( *(SEGPTR *)args );
             args = (SEGPTR *)args + 1;
             break;
         case WPR_HEXA:
@@ -498,16 +499,14 @@
 }
 
 /* Emulator version */
-#ifndef WINELIB
 INT16 WIN16_wsprintf16(void)
 {
-    SEGPTR *win_stack = (DWORD *)CURRENT_STACK16->args;
+    SEGPTR *win_stack = (SEGPTR *)CURRENT_STACK16->args;
     LPSTR buffer = (LPSTR)PTR_SEG_TO_LIN(win_stack[0]);
     LPCSTR spec  = (LPCSTR)PTR_SEG_TO_LIN(win_stack[1]);
     return wvsprintf16( buffer, spec, &win_stack[2] );
 
 }
-#endif  /* WINELIB */
 
 
 /***********************************************************************
diff --git a/miscemu/Makefile.in b/miscemu/Makefile.in
index f1f67ea..b786d45 100644
--- a/miscemu/Makefile.in
+++ b/miscemu/Makefile.in
@@ -1,3 +1,4 @@
+DEFS   = -D__WINE__
 TOPSRC = @top_srcdir@
 MODULE = miscemu
 
diff --git a/miscemu/dpmi.c b/miscemu/dpmi.c
index 788f70b..738c413 100644
--- a/miscemu/dpmi.c
+++ b/miscemu/dpmi.c
@@ -6,9 +6,9 @@
 
 #include <stdio.h>
 #include <unistd.h>
-#include <stdlib.h>
 #include <string.h>
 #include "windows.h"
+#include "heap.h"
 #include "ldt.h"
 #include "module.h"
 #include "miscemu.h"
@@ -68,6 +68,19 @@
             AX_reg(context) = 0x8022;  /* invalid selector */
             SET_CFLAG(context);
         }
+        else
+        {
+            /* If a segment register contains the selector being freed, */
+            /* set it to zero. */
+            if (!((DS_reg(context)^BX_reg(context)) & ~3)) DS_reg(context) = 0;
+            if (!((ES_reg(context)^BX_reg(context)) & ~3)) ES_reg(context) = 0;
+#ifdef FS_reg
+            if (!((FS_reg(context)^BX_reg(context)) & ~3)) FS_reg(context) = 0;
+#endif
+#ifdef GS_reg
+            if (!((GS_reg(context)^BX_reg(context)) & ~3)) GS_reg(context) = 0;
+#endif
+        }
         break;
 
     case 0x0002:  /* Real mode segment to descriptor */
@@ -135,6 +148,7 @@
 
     case 0x0009:  /* Set selector access rights */
         SelectorAccessRights( BX_reg(context), 1, CX_reg(context) );
+        break;
 
     case 0x000a:  /* Allocate selector alias */
         if (!(AX_reg(context) = AllocCStoDSAlias( BX_reg(context) )))
@@ -199,8 +213,9 @@
             if ((BL_reg(context) == 0x2f) && ((p->eax & 0xFF00) == 0x1500))
             {
                 do_mscdex( context );
+		break;
             }
-            else SET_CFLAG(context);
+            SET_CFLAG(context);
         }
         break;
 
@@ -242,8 +257,8 @@
         break;
 
     case 0x0501:  /* Allocate memory block */
-        if (!(ptr = (BYTE *)malloc( MAKELONG( CX_reg(context),
-                                              BX_reg(context) ) )))
+        if (!(ptr = (BYTE *)HeapAlloc( SystemHeap, 0,MAKELONG( CX_reg(context),
+                                                           BX_reg(context) ))))
         {
             AX_reg(context) = 0x8012;  /* linear memory not available */
             SET_CFLAG(context);
@@ -256,12 +271,14 @@
         break;
 
     case 0x0502:  /* Free memory block */
-        free( (void *)MAKELONG( DI_reg(context), SI_reg(context) ) );
+        HeapFree( SystemHeap, 0,
+                  (void *)MAKELONG( DI_reg(context), SI_reg(context) ) );
         break;
 
     case 0x0503:  /* Resize memory block */
-        if (!(ptr = (BYTE *)realloc( (void *)MAKELONG(DI_reg(context),SI_reg(context)),
-                                     MAKELONG(CX_reg(context),BX_reg(context)))))
+        if (!(ptr = (BYTE *)HeapReAlloc( SystemHeap, 0,
+                           (void *)MAKELONG(DI_reg(context),SI_reg(context)),
+                                   MAKELONG(CX_reg(context),BX_reg(context)))))
         {
             AX_reg(context) = 0x8012;  /* linear memory not available */
             SET_CFLAG(context);
diff --git a/multimedia/Makefile.in b/multimedia/Makefile.in
index 1e943af..d6e1c1c 100644
--- a/multimedia/Makefile.in
+++ b/multimedia/Makefile.in
@@ -1,3 +1,4 @@
+DEFS   = -D__WINE__
 TOPSRC = @top_srcdir@
 MODULE = multimedia
 
diff --git a/multimedia/time.c b/multimedia/time.c
index 78e306c..cd2d86b 100644
--- a/multimedia/time.c
+++ b/multimedia/time.c
@@ -27,7 +27,7 @@
 typedef struct tagTIMERENTRY {
     WORD wDelay;
     WORD wResol;
-    FARPROC lpFunc;
+    FARPROC16 lpFunc;
     HINSTANCE hInstance;
     DWORD dwUser;
     WORD wFlags;
@@ -52,7 +52,7 @@
 	lpTimer->wCurTime--;
 	if (lpTimer->wCurTime == 0) {
 	    lpTimer->wCurTime = lpTimer->wDelay;
-	    if (lpTimer->lpFunc != (FARPROC) NULL) {
+	    if (lpTimer->lpFunc != (FARPROC16) NULL) {
 		dprintf_mmtime(stddeb, "MMSysTimeCallback // before CallBack16 !\n");
 		dprintf_mmtime(stddeb, "MMSysTimeCallback // lpFunc=%p wTimerID=%04X dwUser=%08lX !\n",
 			lpTimer->lpFunc, lpTimer->wTimerID, lpTimer->dwUser);
@@ -151,7 +151,7 @@
     lpNewTimer->wCurTime = wDelay;
     lpNewTimer->wDelay = wDelay;
     lpNewTimer->wResol = wResol;
-    lpNewTimer->lpFunc = (FARPROC) lpFunc;
+    lpNewTimer->lpFunc = (FARPROC16) lpFunc;
     lpNewTimer->hInstance = GetTaskDS();
 	dprintf_mmtime(stddeb, "timeSetEvent // hInstance=%04X !\n", lpNewTimer->hInstance);
 	dprintf_mmtime(stddeb, "timeSetEvent // PTR_SEG_TO_LIN(lpFunc)=%p !\n", 
diff --git a/objects/Makefile.in b/objects/Makefile.in
index eb31162..0829312 100644
--- a/objects/Makefile.in
+++ b/objects/Makefile.in
@@ -1,3 +1,4 @@
+DEFS   = -D__WINE__
 TOPSRC = @top_srcdir@
 MODULE = objects
 
diff --git a/objects/bitblt.c b/objects/bitblt.c
index 9db1ceb..4eba5db 100644
--- a/objects/bitblt.c
+++ b/objects/bitblt.c
@@ -1106,15 +1106,25 @@
                         visRectDst.left, visRectDst.top, width, height );
         return TRUE;
 
+    case DSTINVERT:  /* 0x55 */
+        if ((dcDst->w.bitsPerPixel == 1) || !COLOR_PaletteToPixel ||
+            !Options.perfectGraphics)
+        {
+            XSetFunction( display, dcDst->u.x.gc, GXinvert );
+            XFillRectangle( display, dcDst->u.x.drawable, dcDst->u.x.gc,
+                            visRectDst.left, visRectDst.top, width, height ); 
+            return TRUE;
+        }
+        break;
+
     case PATINVERT:  /* 0x5a */
-          /* FIXME: This is not really correct, but for now PATINVERT is */
-          /* used to draw the window moving frame, so it has to be fast. */
+	if (Options.perfectGraphics) break;
         if (!DC_SetupGCForBrush( dcDst )) return TRUE;
         XSetFunction( display, dcDst->u.x.gc, GXxor );
         XFillRectangle( display, dcDst->u.x.drawable, dcDst->u.x.gc,
                         visRectDst.left, visRectDst.top, width, height );
         return TRUE;
-        
+
     case SRCCOPY:  /* 0xcc */
         if (dcSrc->w.bitsPerPixel == dcDst->w.bitsPerPixel)
         {
@@ -1155,8 +1165,8 @@
         else
         {
             XSetFunction( display, dcDst->u.x.gc, GXcopy );
-            XSetForeground( display, dcDst->u.x.gc,
-                            COLOR_PaletteToPixel[COLOR_ColormapSize-1] );
+            XSetForeground( display, dcDst->u.x.gc, 
+                            COLOR_PaletteToPixel[COLOR_GetSystemPaletteSize() - 1]);
             XSetFillStyle( display, dcDst->u.x.gc, FillSolid );
         }
         XFillRectangle( display, dcDst->u.x.drawable, dcDst->u.x.gc,
diff --git a/objects/bitmap.c b/objects/bitmap.c
index f54cdc7..5680581 100644
--- a/objects/bitmap.c
+++ b/objects/bitmap.c
@@ -12,6 +12,8 @@
 #include "callback.h"
 #include "dc.h"
 #include "bitmap.h"
+#include "heap.h"
+#include "string32.h"
 #include "stddebug.h"
 #include "debug.h"
 
@@ -227,24 +229,24 @@
 
 
 /**********************************************************************
- *	    LoadBitmap    (USER.175)
+ *	    LoadBitmap16    (USER.175)
  */
-HBITMAP LoadBitmap( HANDLE instance, SEGPTR name )
+HBITMAP16 LoadBitmap16( HINSTANCE16 instance, SEGPTR name )
 {
-    HBITMAP hbitmap = 0;
+    HBITMAP16 hbitmap = 0;
     HDC hdc;
-    HRSRC hRsrc;
-    HGLOBAL handle;
+    HRSRC16 hRsrc;
+    HGLOBAL16 handle;
     BITMAPINFO *info;
 
     if (HIWORD(name))
     {
         char *str = (char *)PTR_SEG_TO_LIN( name );
-        dprintf_bitmap( stddeb, "LoadBitmap(%04x,'%s')\n", instance, str );
+        dprintf_bitmap( stddeb, "LoadBitmap16(%04x,'%s')\n", instance, str );
         if (str[0] == '#') name = (SEGPTR)(DWORD)(WORD)atoi( str + 1 );
     }
     else
-        dprintf_bitmap( stddeb, "LoadBitmap(%04x,%04x)\n",
+        dprintf_bitmap( stddeb, "LoadBitmap16(%04x,%04x)\n",
                         instance, LOWORD(name) );
 
     if (!instance)  /* OEM bitmap */
@@ -253,10 +255,10 @@
         return OBM_LoadBitmap( LOWORD((int)name) );
     }
 
-    if (!(hRsrc = FindResource( instance, name, RT_BITMAP ))) return 0;
-    if (!(handle = LoadResource( instance, hRsrc ))) return 0;
+    if (!(hRsrc = FindResource16( instance, name, RT_BITMAP ))) return 0;
+    if (!(handle = LoadResource16( instance, hRsrc ))) return 0;
 
-    info = (BITMAPINFO *)LockResource( handle );
+    info = (BITMAPINFO *)LockResource16( handle );
     if ((hdc = GetDC(0)) != 0)
     {
         char *bits = (char *)info + DIB_BitmapInfoSize( info, DIB_RGB_COLORS );
@@ -264,10 +266,59 @@
                                   bits, info, DIB_RGB_COLORS );
         ReleaseDC( 0, hdc );
     }
-    FreeResource( handle );
+    FreeResource16( handle );
     return hbitmap;
 }
 
+/**********************************************************************
+ *	    LoadBitmap32W   (USER32.357)
+ */
+HBITMAP32 LoadBitmap32W( HINSTANCE32 instance, LPCWSTR name )
+{
+    HBITMAP32 hbitmap = 0;
+    HDC hdc;
+    HRSRC32 hRsrc;
+    HGLOBAL32 handle;
+    BITMAPINFO *info;
+
+    if (!instance)  /* OEM bitmap */
+    {
+        if (HIWORD((int)name)) return 0;
+        return OBM_LoadBitmap( LOWORD((int)name) );
+    }
+
+    if (!(hRsrc = FindResource32W( instance, name,
+		(LPWSTR)RT_BITMAP ))) return 0;
+    if (!(handle = LoadResource32( instance, hRsrc ))) return 0;
+
+    info = (BITMAPINFO *)LockResource32( handle );
+    if ((hdc = GetDC(0)) != 0)
+    {
+        char *bits = (char *)info + DIB_BitmapInfoSize( info, DIB_RGB_COLORS );
+        hbitmap = CreateDIBitmap( hdc, &info->bmiHeader, CBM_INIT,
+                                  bits, info, DIB_RGB_COLORS );
+        ReleaseDC( 0, hdc );
+    }
+    return hbitmap;
+}
+
+
+/**********************************************************************
+ *	    LoadBitmap32A   (USER32.356)
+ */
+HBITMAP32 LoadBitmap32A( HINSTANCE32 instance, LPCSTR name )
+{
+    HBITMAP32 res;
+    if (!HIWORD(name)) res = LoadBitmap32W(instance,(LPWSTR)name);
+    else
+    {
+        LPWSTR uni = STRING32_DupAnsiToUni(name);
+        res = LoadBitmap32W(instance,uni);
+        free(uni);
+    }
+    return res;
+}
+
 
 /***********************************************************************
  *           BITMAP_DeleteObject
diff --git a/objects/color.c b/objects/color.c
index 6868a22..e92adea 100644
--- a/objects/color.c
+++ b/objects/color.c
@@ -2,202 +2,437 @@
  * Color functions
  *
  * Copyright 1993 Alexandre Julliard
+ * Copyright 1996 Alex Korobka
  */
 
 #include <stdlib.h>
 #include <X11/Xlib.h>
 #include <stdio.h>
+#include <string.h>
 #include "windows.h"
 #include "options.h"
 #include "gdi.h"
 #include "color.h"
-#include "palette.h"
 #include "stddebug.h"
 #include "debug.h"
 #include "xmalloc.h"
 
-Colormap COLOR_WinColormap = 0;
-static int COLOR_FixedMap = 0;
+/* Palette indexed mode:
 
-static int COLOR_Redshift = 0;
-static int COLOR_Redmax = 0;
+ *	logical palette -> mapping -> pixel
+ *				     
+ *
+ * Windows needs contiguous color space ( from 0 to n ) but 
+ * it is possible only with private colormap. Otherwise we
+ * have to map DC palette indices to real pixel values.
+ * With private colormap it boils down to identity mapping. The
+ * other special case is when we have fixed color visual with 
+ * screendepth > 8 - we abandon mapping altogether (pixel
+ * values can be calculated without X server assistance).
+ *
+ * For info about general Windows palette management read
+ * http://198.105.232.5/MSDN/LIBRARY/TECHNOTE/CH3.HTM 
+ */
+
+extern void BITBLT_SetAccelMode( int ); /* speed up INVERT raster ops whenever possible 
+					 * parameter is a speedup level (see bitblt.c)
+					 */
+
+typedef struct
+{ 
+    Colormap    colorMap;
+    UINT16      size;
+    UINT16      flags;
+} CSPACE;
+
+static CSPACE cSpace = {0, 0, 0};
+
+static int COLOR_Redshift   = 0; /* to handle abortive COLOR_VIRTUAL visuals */
+static int COLOR_Redmax     = 0;
 static int COLOR_Greenshift = 0;
-static int COLOR_Greenmax = 0;
-static int COLOR_Blueshift = 0;
-static int COLOR_Bluemax = 0;
-static int COLOR_Graymax = 0;
+static int COLOR_Greenmax   = 0;
+static int COLOR_Blueshift  = 0;
+static int COLOR_Bluemax    = 0;
+static int COLOR_Graymax    = 0;
 
-  /* System palette static colors */
+/* System color space. 
+ *
+ * First 10 and last 10 colors in COLOR_sysPalette are
+ * "guarded". RealizePalette changes only the rest of colorcells. For
+ * currently inactive window it changes only DC palette mappings.
+ */
 
-#define NB_RESERVED_COLORS  20
+#define NB_RESERVED_COLORS  20 /* number of fixed colors in system palette */
 
-  /* The first and last eight colors are EGA colors */
-static const PALETTEENTRY COLOR_sysPaletteEntries[NB_RESERVED_COLORS] =
+Visual* 		visual = NULL;
+
+static PALETTEENTRY* COLOR_sysPal = NULL;    /* current system palette */
+static int COLOR_gapStart = 256;
+static int COLOR_gapEnd = -1;
+
+  /* First free dynamic color cell, 0 = full palette, -1 = fixed palette */
+static int COLOR_firstFree = 0; 
+
+  /* Maps entry in the system palette to X pixel value */
+int* COLOR_PaletteToPixel = NULL;
+
+  /* Maps pixel to the entry in the system palette */
+int* COLOR_PixelToPalette = NULL;
+
+static const PALETTEENTRY __sysPalTemplate[NB_RESERVED_COLORS] = 
 {
+    /* first 10 entries in the system palette */
     /* red  green blue  flags */
-    { 0x00, 0x00, 0x00, 0 },
-    { 0x80, 0x00, 0x00, 0 },
-    { 0x00, 0x80, 0x00, 0 },
-    { 0x80, 0x80, 0x00, 0 },
-    { 0x00, 0x00, 0x80, 0 },
-    { 0x80, 0x00, 0x80, 0 },
-    { 0x00, 0x80, 0x80, 0 },
-    { 0xc0, 0xc0, 0xc0, 0 },
-    { 0xc0, 0xdc, 0xc0, 0 },
-    { 0xa6, 0xca, 0xf0, 0 },
+    { 0x00, 0x00, 0x00, PC_SYS_USED },
+    { 0x80, 0x00, 0x00, PC_SYS_USED },
+    { 0x00, 0x80, 0x00, PC_SYS_USED },
+    { 0x80, 0x80, 0x00, PC_SYS_USED },
+    { 0x00, 0x00, 0x80, PC_SYS_USED },
+    { 0x80, 0x00, 0x80, PC_SYS_USED },
+    { 0x00, 0x80, 0x80, PC_SYS_USED },
+    { 0xc0, 0xc0, 0xc0, PC_SYS_USED },
+    { 0xc0, 0xdc, 0xc0, PC_SYS_USED },
+    { 0xa6, 0xca, 0xf0, PC_SYS_USED },
 
-    { 0xff, 0xfb, 0xf0, 0 },
-    { 0xa0, 0xa0, 0xa4, 0 },
-    { 0x80, 0x80, 0x80, 0 },
-    { 0xff, 0x00, 0x00, 0 },
-    { 0x00, 0xff, 0x00, 0 },
-    { 0xff, 0xff, 0x00, 0 },
-    { 0x00, 0x00, 0xff, 0 },
-    { 0xff, 0x00, 0xff, 0 },
-    { 0x00, 0xff, 0xff, 0 },
-    { 0xff, 0xff, 0xff, 0 }
+    /* ... c_min/2 dynamic colorcells */
+
+    /* ... gap (for sparse palettes) */
+
+    /* ... c_min/2 dynamic colorcells */
+
+    { 0xff, 0xfb, 0xf0, PC_SYS_USED },
+    { 0xa0, 0xa0, 0xa4, PC_SYS_USED },
+    { 0x80, 0x80, 0x80, PC_SYS_USED },
+    { 0xff, 0x00, 0x00, PC_SYS_USED },
+    { 0x00, 0xff, 0x00, PC_SYS_USED },
+    { 0xff, 0xff, 0x00, PC_SYS_USED },
+    { 0x00, 0x00, 0xff, PC_SYS_USED },
+    { 0xff, 0x00, 0xff, PC_SYS_USED },
+    { 0x00, 0xff, 0xff, PC_SYS_USED },
+    { 0xff, 0xff, 0xff, PC_SYS_USED }     /* last 10 */
 };
 
-static HANDLE hSysColorTranslation = 0;
-static HANDLE hRevSysColorTranslation = 0;
+   /* Map an EGA index (0..15) to a pixel value in the system color space.  */
 
-   /* Map an EGA index (0..15) to a pixel value. Used for dithering. */
 int COLOR_mapEGAPixel[16];
 
-int* COLOR_PaletteToPixel = NULL;
-int* COLOR_PixelToPalette = NULL;
-int COLOR_ColormapSize = 0;
+/***********************************************************************
+ *	Misc auxiliary functions
+ */
+Colormap COLOR_GetColormap(void)
+{
+    return cSpace.colorMap;
+}
+
+UINT16 COLOR_GetSystemPaletteSize(void)
+{
+    return (cSpace.flags & COLOR_PRIVATE) ? cSpace.size : 256;
+}
+
+UINT16 COLOR_GetSystemPaletteFlags(void)
+{
+    return cSpace.flags;
+}
+
+void COLOR_FormatSystemPalette(void)
+{
+    int i, j = COLOR_firstFree = NB_RESERVED_COLORS/2;
+
+    COLOR_sysPal[j].peFlags = 0;
+    for( i = NB_RESERVED_COLORS/2 + 1 ; i < 256 - NB_RESERVED_COLORS/2 ; i++ )
+        if( i < COLOR_gapStart || i > COLOR_gapEnd )
+        {
+            COLOR_sysPal[i].peFlags = 0;       /* unused tag */
+            COLOR_sysPal[j].peRed = i;         /* next */
+            j = i;
+        }
+    COLOR_sysPal[j].peRed = 0;		 /* terminal */
+}
+
 
 /***********************************************************************
- *           COLOR_BuildMap
+ *           COLOR_BuildPrivateMap/COLOR_BuildSharedMap
  *
- * Fill the private colormap.
+ * Executed only one time so we don't care about sloppiness,
+ * the rest have to be very tight though...
  */
-static BOOL COLOR_BuildMap( Colormap map, int depth, int size )
+static BOOL COLOR_BuildPrivateMap(CSPACE* cs)
 {
+    /* Private colormap - identity mapping */
+
     XColor color;
-    int r, g, b, red_incr, green_incr, blue_incr;
-    int index = 0;
+    int i; 
 
-      /* Fill the whole map with a range of colors */
+    COLOR_sysPal = (PALETTEENTRY*)xmalloc(sizeof(PALETTEENTRY)*cs->size);
 
-    blue_incr  = 0x10000 >> (depth / 3);
-    red_incr   = 0x10000 >> ((depth + 1) / 3);
-    green_incr = 0x10000 >> ((depth + 2) / 3);
+    dprintf_palette(stddeb,"\tbuilding private map - %i palette entries\n", cs->size);
 
-    for (r = red_incr - 1; r < 0x10000; r += red_incr)
-	for (g = green_incr - 1; g < 0x10000; g += green_incr)
-	    for (b = blue_incr - 1; b < 0x10000; b += blue_incr)
+      /* Allocate system palette colors */ 
+
+    for( i=0; i < cs->size; i++ )
+    {
+       if( i < NB_RESERVED_COLORS/2 )
+       {
+         color.red   = __sysPalTemplate[i].peRed * 65535 / 255;
+         color.green = __sysPalTemplate[i].peGreen * 65535 / 255;
+         color.blue  = __sysPalTemplate[i].peBlue * 65535 / 255;
+	 COLOR_sysPal[i] = __sysPalTemplate[i];
+       }
+       else if( i >= cs->size - NB_RESERVED_COLORS/2 )
+       {
+	 int j = NB_RESERVED_COLORS + i - cs->size;
+         color.red   = __sysPalTemplate[j].peRed * 65535 / 255;
+         color.green = __sysPalTemplate[j].peGreen * 65535 / 255;
+         color.blue  = __sysPalTemplate[j].peBlue * 65535 / 255;
+	 COLOR_sysPal[i] = __sysPalTemplate[j];
+       }
+
+       color.flags = DoRed | DoGreen | DoBlue;
+       color.pixel = i;
+       XStoreColor(display, cs->colorMap, &color);
+
+       /* Set EGA mapping if color in the first or last eight */
+
+       if (i < 8)
+           COLOR_mapEGAPixel[i] = color.pixel;
+       else if (i >= cs->size - 8 )
+           COLOR_mapEGAPixel[i - (cs->size - 16)] = color.pixel;
+    }
+
+    COLOR_PixelToPalette = COLOR_PaletteToPixel = NULL;
+
+    COLOR_gapStart = 256; COLOR_gapEnd = -1;
+
+    COLOR_firstFree = (cs->size > NB_RESERVED_COLORS)?NB_RESERVED_COLORS/2 : -1;
+    return FALSE;
+}
+
+static BOOL COLOR_BuildSharedMap(CSPACE* cs)
+{
+   XColor		color;
+   unsigned long        sysPixel[NB_RESERVED_COLORS];
+   unsigned long*	pixDynMapping = NULL;
+   unsigned long	plane_masks[1];
+   int			i, j;
+   int			color_ini_max = 256;
+
+   /* read "AllocSystemColors" from wine.conf */
+
+   color_ini_max = PROFILE_GetWineIniInt( "options", "AllocSystemColors", 256);
+   if (color_ini_max > 256) color_ini_max = 256;
+   if (color_ini_max < 20) color_ini_max = 20;
+   dprintf_palette(stddeb,"COLOR_Init: %d colors configured.\n",color_ini_max);
+   
+   dprintf_palette(stddeb,"\tbuilding shared map - %i palette entries\n", cs->size);
+
+   /* Be nice and allocate system colors as read-only */
+
+   for( i = 0; i < NB_RESERVED_COLORS; i++ )
+     { 
+        color.red   = __sysPalTemplate[i].peRed * 65535 / 255;
+        color.green = __sysPalTemplate[i].peGreen * 65535 / 255;
+        color.blue  = __sysPalTemplate[i].peBlue * 65535 / 255;
+        color.flags = DoRed | DoGreen | DoBlue;
+
+        if (!XAllocColor( display, cSpace.colorMap, &color ))
+           { 
+             fprintf(stderr, "Warning: Not enough free colors for system palette.\n" );
+             color.pixel = color.red = color.green = color.blue = 0;
+           }
+
+        sysPixel[i] = color.pixel;
+
+        dprintf_palette(stddeb,"\tsyscolor(%lx) -> pixel %i\n",
+		      *(COLORREF*)(__sysPalTemplate+i), (int)color.pixel);
+
+        /* Set EGA mapping if color in the first or last eight */
+
+        if (i < 8)
+            COLOR_mapEGAPixel[i] = color.pixel;
+        else if (i >= NB_RESERVED_COLORS - 8 )
+            COLOR_mapEGAPixel[i - (NB_RESERVED_COLORS-16)] = color.pixel;
+     }
+
+   if( !(cSpace.flags & COLOR_FIXED) )  
+     {
+	int c_min = 0, c_max = cs->size, c_val;
+
+	dprintf_palette(stddeb,"\tdynamic colormap... ");
+
+	/* comment this out if you want to debug palette init */
+
+	XGrabServer(display);
+
+	/* let's become the first client that actually follows 
+	 * X guidelines and does binary search...
+	 */
+
+	pixDynMapping = (unsigned long*)xmalloc(sizeof(long)*cs->size);
+        while( c_max - c_min > 0 )
+          {
+             c_val = (c_max + c_min)/2 + (c_max + c_min)%2;
+
+             if( !XAllocColorCells(display, cs->colorMap, False,
+                                   plane_masks, 0, pixDynMapping, c_val) )
+                 c_max = c_val - 1;
+             else
+               {
+                 XFreeColors(display, cs->colorMap, pixDynMapping, c_val, 0);
+                 c_min = c_val;
+               }
+          }
+
+	if( c_min > color_ini_max - NB_RESERVED_COLORS) 
+	    c_min = color_ini_max - NB_RESERVED_COLORS;
+
+	c_min = (c_min/2) + (c_min/2);		/* need even set for split palette */
+
+	if( c_min > 0 )
+	  if( !XAllocColorCells(display, cs->colorMap, False,
+                                plane_masks, 0, pixDynMapping, c_min) )
 	    {
-		if (index >= size) break;
-		color.pixel = index++;
-		color.red   = r;
-		color.green = g;
-		color.blue  = b;
-		XStoreColor( display, map, &color );
+	      fprintf(stderr,"Inexplicable failure during colorcell allocation.\n");
+	      c_min = 0;
 	    }
 
-    return TRUE;
+        cs->size = c_min + NB_RESERVED_COLORS;
+
+	COLOR_gapStart = cs->size/2;
+	COLOR_gapEnd = 256 - cs->size/2;
+
+	XUngrabServer(display);
+
+	dprintf_palette(stddeb,"adjusted size %i colorcells\n", cs->size);
+     }
+   else if( cSpace.flags & COLOR_VIRTUAL ) 
+	{
+          /* virtual colorspace - ToPhysical takes care of 
+           * color translations but we have to allocate full palette 
+	   * to maintain compatibility
+	   */
+	  dprintf_palette(stddeb,"\tvirtual colorspace - screendepth %i\n", screenDepth);
+	}
+   else cs->size = NB_RESERVED_COLORS;	/* system palette only - however we can alloc a bunch
+			                 * of colors and map to them */
+
+   dprintf_palette(stddeb,"Shared system palette uses %i colors.\n", cs->size);
+
+   /* Set gap to account for pixel shortage. It has to be right in the center
+    * of the system palette because otherwise raster ops get screwed.
+    * ( if we have 100 color palette and application does invert for pixel 1
+    *   it gets pixel 254 - far beyond our pathetic palette unless these 100
+    *   colors are mapped with the gap in the middle )
+    */
+
+   if( cs->size >= 256 )
+     { COLOR_gapStart = 256; COLOR_gapEnd = -1; }
+   else
+     { COLOR_gapStart = cs->size/2; COLOR_gapEnd = 255 - cs->size/2; }
+
+   COLOR_firstFree = ( cs->size > NB_RESERVED_COLORS && 
+		      (cs->flags & COLOR_VIRTUAL || !(cs->flags & COLOR_FIXED)) ) 
+		     ? NB_RESERVED_COLORS/2 : -1;
+
+   COLOR_sysPal = (PALETTEENTRY*)xmalloc(sizeof(PALETTEENTRY)*256);
+
+   /* Setup system palette entry <-> pixel mappings and fill in 20 fixed entries */
+
+   if( screenDepth <= 8 )
+   {
+       COLOR_PixelToPalette = (int*)xmalloc(sizeof(int)*256);
+       COLOR_PaletteToPixel = (int*)xmalloc(sizeof(int)*256);
+
+       for( i = j = 0; i < 256; i++ )
+       {
+           if( i >= COLOR_gapStart && i <= COLOR_gapEnd ) 
+           {
+               COLOR_PaletteToPixel[i] = 0;
+               COLOR_sysPal[i].peFlags = 0;	/* mark as unused */
+               continue;
+           }
+
+           if( i < NB_RESERVED_COLORS/2 )
+           {
+               COLOR_PaletteToPixel[i] = sysPixel[i];
+               COLOR_sysPal[i] = __sysPalTemplate[i];
+           }
+           else if( i >= 256 - NB_RESERVED_COLORS/2 )
+           {
+               COLOR_PaletteToPixel[i] = sysPixel[(i + NB_RESERVED_COLORS) - 256]; 
+               COLOR_sysPal[i] = __sysPalTemplate[(i + NB_RESERVED_COLORS) - 256];
+           }
+           else if( pixDynMapping )
+               COLOR_PaletteToPixel[i] = pixDynMapping[j++];
+           else
+               COLOR_PaletteToPixel[i] = i;
+
+           dprintf_palette(stddeb,"\tindex %i -> pixel %i\n", i, COLOR_PaletteToPixel[i]);
+
+           memset( COLOR_PixelToPalette, 0, 256*sizeof(int) );
+           COLOR_PixelToPalette[COLOR_PaletteToPixel[i]] = i;
+       }
+   }
+   if( pixDynMapping ) free(pixDynMapping);
+   return TRUE;
 }
 
 
 /***********************************************************************
  *           COLOR_InitPalette
  *
- * Create the system palette.
+ * Create the system palette and initialize mapping tables.
  */
 static HPALETTE16 COLOR_InitPalette(void)
 {
-    int i, size, pixel;
-    XColor color;
-    HPALETTE16 hpalette;
-    LOGPALETTE * palPtr;
-    WORD *colorTranslation, *revTranslation;
+    int 		i;
+    HPALETTE16 		hpalette;
+    LOGPALETTE * 	palPtr;
 
-    size = DefaultVisual( display, DefaultScreen(display) )->map_entries;
-    COLOR_ColormapSize = size;
-    if (screenDepth <= 8)
-    {
-        if (!(hSysColorTranslation = GDI_HEAP_ALLOC(sizeof(WORD)*NB_RESERVED_COLORS )))
-            return FALSE;
-        if (!(hRevSysColorTranslation = GDI_HEAP_ALLOC( sizeof(WORD)*size )))
-            return FALSE;
-        colorTranslation = (WORD *) GDI_HEAP_LIN_ADDR( hSysColorTranslation );
-        revTranslation   = (WORD *) GDI_HEAP_LIN_ADDR( hRevSysColorTranslation );
-    }
-    else colorTranslation = revTranslation = NULL;
+    /* calculate max palette size */
 
-    if ((COLOR_WinColormap == DefaultColormapOfScreen(screen)) && (screenDepth <= 8))
-    {
-        COLOR_PaletteToPixel = (int *)xmalloc( sizeof(int) * size );
-        COLOR_PixelToPalette = (int *)xmalloc( sizeof(int) * size );
-        for (i = 0; i < size; i++)  /* Set the default mapping */
-            COLOR_PaletteToPixel[i] = COLOR_PixelToPalette[i] = i;
-    }
+    cSpace.size = visual->map_entries;
 
-    for (i = 0; i < NB_RESERVED_COLORS; i++)
-    {
-	color.red   = COLOR_sysPaletteEntries[i].peRed * 65535 / 255;
-	color.green = COLOR_sysPaletteEntries[i].peGreen * 65535 / 255;
-	color.blue  = COLOR_sysPaletteEntries[i].peBlue * 65535 / 255;
-	color.flags = DoRed | DoGreen | DoBlue;
+    if (cSpace.flags & COLOR_PRIVATE)
+	COLOR_BuildPrivateMap( &cSpace );
+    else
+	COLOR_BuildSharedMap( &cSpace );
 
-        if (i < NB_RESERVED_COLORS/2)
-        {
-            /* Bottom half of the colormap */
-            pixel = i;
-            if (pixel >= size/2) continue;
-        }
-        else
-        {
-            /* Top half of the colormap */
-            pixel = size - NB_RESERVED_COLORS + i;
-            if (pixel < size/2) continue;
-        }
-	if (COLOR_WinColormap != DefaultColormapOfScreen(screen))
-	{
-            color.pixel = pixel;
-	    XStoreColor( display, COLOR_WinColormap, &color );
-	}
-	else
-        {
-            if (!XAllocColor( display, COLOR_WinColormap, &color ))
-            {
-                fprintf(stderr, "Warning: Not enough free colors. Try using the -privatemap option.\n" );
-                color.pixel = color.red = color.green = color.blue = 0;
-            }
-            else if (COLOR_PaletteToPixel)
-            {
-                COLOR_PaletteToPixel[pixel] = color.pixel;
-                COLOR_PixelToPalette[color.pixel] = pixel;
-            }
-        }
-        if (colorTranslation) colorTranslation[i] = color.pixel;
-        if (revTranslation) revTranslation[color.pixel] = i;
-	  /* Set EGA mapping if color in the first or last eight */
-	if (i < 8)
-	    COLOR_mapEGAPixel[i] = color.pixel;
-	else if (i >= NB_RESERVED_COLORS-8)
-	    COLOR_mapEGAPixel[i - (NB_RESERVED_COLORS-16)] = color.pixel;
-    }
+    /* Build free list ( use peRed as "next" ) */
 
-    palPtr = malloc( sizeof(LOGPALETTE) + (NB_RESERVED_COLORS-1)*sizeof(PALETTEENTRY) );
+    if( COLOR_firstFree != -1 )
+	COLOR_FormatSystemPalette();
+
+    /* create default palette (20 system colors) */
+
+    palPtr = xmalloc( sizeof(LOGPALETTE) + (NB_RESERVED_COLORS-1)*sizeof(PALETTEENTRY) );
     if (!palPtr) return FALSE;
+
     palPtr->palVersion = 0x300;
     palPtr->palNumEntries = NB_RESERVED_COLORS;
-    memcpy( palPtr->palPalEntry, COLOR_sysPaletteEntries,
-	    sizeof(COLOR_sysPaletteEntries) );
+    for( i = 0; i < NB_RESERVED_COLORS; i ++ )
+    {
+        palPtr->palPalEntry[i].peRed = __sysPalTemplate[i].peRed;
+        palPtr->palPalEntry[i].peGreen = __sysPalTemplate[i].peGreen;
+        palPtr->palPalEntry[i].peBlue = __sysPalTemplate[i].peBlue;
+        palPtr->palPalEntry[i].peFlags = 0;  
+    }
     hpalette = CreatePalette( palPtr );
     free( palPtr );
     return hpalette;
 }
 
-void
-COLOR_Computeshifts(unsigned long maskbits, int *shift, int *max)
+
+/***********************************************************************
+ *	     COLOR_Computeshifts
+ *
+ * Calculate conversion parameters for direct mapped visuals
+ */
+void COLOR_Computeshifts(unsigned long maskbits, int *shift, int *max)
 {
     int i;
 
-    if(maskbits==0) {
+    if (maskbits==0)
+    {
         *shift=0;
         *max=0;
         return;
@@ -210,55 +445,65 @@
     *max = maskbits;
 }
 
+
 /***********************************************************************
  *           COLOR_Init
  *
  * Initialize color map and system palette.
+ *
  */
 HPALETTE16 COLOR_Init(void)
 {
-    Visual * visual = DefaultVisual( display, DefaultScreen(display) );
+    visual = DefaultVisual( display, DefaultScreen(display) );
+
+    dprintf_palette(stddeb,"COLOR_Init: initializing palette manager...");
 
     switch(visual->class)
     {
+    case DirectColor:
+	cSpace.flags |= COLOR_VIRTUAL;
     case GrayScale:
     case PseudoColor:
-    case DirectColor:
-        COLOR_FixedMap = 0;
 	if (Options.usePrivateMap)
 	{
-	    COLOR_WinColormap = XCreateColormap( display, rootWindow,
+	    XSetWindowAttributes win_attr;
+
+	    cSpace.flags |= COLOR_PRIVATE;
+	    cSpace.colorMap = XCreateColormap( display, rootWindow,
 						 visual, AllocAll );
-	    if (COLOR_WinColormap)
+	    if (cSpace.colorMap)
 	    {
-		COLOR_BuildMap( COLOR_WinColormap, screenDepth,
-			        visual->map_entries );
-		if (rootWindow != DefaultRootWindow(display))
-		{
-		    XSetWindowAttributes win_attr;
-		    win_attr.colormap = COLOR_WinColormap;
+	       if( rootWindow != DefaultRootWindow(display) )
+	         {
+		    win_attr.colormap = cSpace.colorMap;
 		    XChangeWindowAttributes( display, rootWindow,
-					     CWColormap, &win_attr );
-		}
-		break;
+					 CWColormap, &win_attr );
+		 }
+	       break;
 	    }
 	}
-	COLOR_WinColormap = DefaultColormapOfScreen( screen );
+	cSpace.colorMap = DefaultColormapOfScreen( screen );
         break;
+
     case StaticGray:
-	COLOR_WinColormap = DefaultColormapOfScreen( screen );
-	COLOR_FixedMap = 1;
+	cSpace.colorMap = DefaultColormapOfScreen( screen );
+	cSpace.flags |= COLOR_FIXED;
         COLOR_Graymax = (1<<screenDepth)-1;
         break;
-    case StaticColor:
+
     case TrueColor:
-	COLOR_WinColormap = DefaultColormapOfScreen( screen );
-	COLOR_FixedMap = 1;
+	cSpace.flags |= COLOR_VIRTUAL;
+    case StaticColor:
+        cSpace.colorMap = DefaultColormapOfScreen( screen );
+        cSpace.flags |= COLOR_FIXED;
         COLOR_Computeshifts(visual->red_mask, &COLOR_Redshift, &COLOR_Redmax);
         COLOR_Computeshifts(visual->green_mask, &COLOR_Greenshift, &COLOR_Greenmax);
         COLOR_Computeshifts(visual->blue_mask, &COLOR_Blueshift, &COLOR_Bluemax);
 	break;	
     }
+
+    dprintf_palette(stddeb," visual class %i\n", visual->class);
+
     return COLOR_InitPalette();
 }
 
@@ -271,12 +516,15 @@
 BOOL COLOR_IsSolid( COLORREF color )
 {
     int i;
-    const PALETTEENTRY *pEntry = COLOR_sysPaletteEntries;
+    const PALETTEENTRY *pEntry = COLOR_sysPal;
 
-    if (color & 0xff000000) return TRUE;
-    if (!color || (color == 0xffffff)) return TRUE;
-    for (i = NB_RESERVED_COLORS; i > 0; i--, pEntry++)
+    if (color & 0xff000000) return TRUE;		/* indexed color */
+
+    if (!color || (color == 0xffffff)) return TRUE;	/* black or white */
+
+    for (i = 0; i < 256 ; i++, pEntry++)
     {
+      if( i < COLOR_gapStart || i > COLOR_gapEnd )
 	if ((GetRValue(color) == pEntry->peRed) &&
 	    (GetGValue(color) == pEntry->peGreen) &&
 	    (GetBValue(color) == pEntry->peBlue)) return TRUE;
@@ -286,72 +534,147 @@
 
 
 /***********************************************************************
+ *	     COLOR_PaletteLookup
+ *
+ */
+int COLOR_PaletteLookupPixel( PALETTEENTRY* palPalEntry, int size,
+                              int* mapping, COLORREF col, BOOL skipReserved )
+{
+    int i, best = 0, diff = 0x7fffffff;
+    int r,g,b;
+
+    for( i = 0; i < size; i++ )
+    {
+        if( !(palPalEntry[i].peFlags & PC_SYS_USED) ||
+            (skipReserved && palPalEntry[i].peFlags  & PC_SYS_RESERVED) )
+            continue;
+
+        r = palPalEntry[i].peRed - GetRValue(col);
+        g = palPalEntry[i].peGreen - GetGValue(col);
+        b = palPalEntry[i].peBlue - GetBValue(col);
+
+        r = r*r + g*g + b*b;
+
+        if( r < diff ) { best = i; diff = r; }
+    }
+    return (mapping) ? mapping[best] : best;
+}
+
+
+/***********************************************************************
+ *	     COLOR_PaletteLookupExactIndex
+ *
+ */
+int COLOR_PaletteLookupExactIndex( PALETTEENTRY* palPalEntry, int size,
+                                   COLORREF col )
+{
+    int i;
+    BYTE r = GetRValue(col), g = GetGValue(col), b = GetBValue(col);
+    for( i = 0; i < size; i++ )
+    {
+        if( palPalEntry[i].peFlags & PC_SYS_USED ) 	/* skip gap */
+            if( palPalEntry[i].peRed == r &&
+                palPalEntry[i].peGreen == g &&
+                palPalEntry[i].peBlue == b )
+                return i;
+    }
+    return -1;
+}
+
+
+/***********************************************************************
+ *           COLOR_ToLogical
+ *
+ * Return RGB color for given X pixel.
+ */
+COLORREF COLOR_ToLogical(int pixel)
+{
+    XColor color;
+  
+    if (screenDepth > 8) return pixel;
+    if ((screenDepth <= 8) && (pixel < 256) && !(cSpace.flags & COLOR_VIRTUAL))
+        return  ( *(COLORREF*)(COLOR_sysPal + ((COLOR_PixelToPalette)?COLOR_PixelToPalette[pixel]:pixel)) ) & 0x00ffffff;
+
+    color.pixel = pixel;
+    XQueryColor(display, cSpace.colorMap, &color);
+
+    return RGB((color.red * 255)/COLOR_Redmax,
+               (color.green * 255)/COLOR_Greenmax,
+               (color.blue * 255)/COLOR_Bluemax);
+}
+
+
+/***********************************************************************
  *           COLOR_ToPhysical
  *
  * Return the physical color closest to 'color'.
- *
- * ESW: This still needs a lot of work; in particular, what happens when
- * we have really large (> 8 bit) DirectColor boards?
- * But it should work better in 16 and 24 bit modes now.
- * (At least it pays attention to the X server's description
- * in TrueColor mode, instead of blindly passing through the
- * color spec and swapping red to blue or losing blue and part of the
- * green entirely, depending on what mode one is in!)
- *
  */
 int COLOR_ToPhysical( DC *dc, COLORREF color )
 {
-    WORD index = 0;
-    WORD *mapping;
-    unsigned char	spec_type;
+    WORD 		 index = 0;
+    unsigned char	 spec_type;
+    HPALETTE16		 hPal = (dc)? dc->w.hPalette: STOCK_DEFAULT_PALETTE;
 
     spec_type = color >> 24;
-    if (spec_type == 0xff)
-	{
+
+    if( spec_type == 0xff )
+    {
 	spec_type = 0; /* 'write' seems to need that for 'Page 1' text */
 	color &= 0xffffff;
-	}
-    if (spec_type > 2)
-	fprintf(stderr, "COLOR_ToPhysical : color >> 24 not in {-1,0,1,2} : %08lx\n",
-	    color);
+    }
+
+    if( spec_type > 2 )
+    {  
+	fprintf(stderr, "COLOR_ToPhysical : invalid RGB specifier for: %08lx\n", color);
+	spec_type = 0;
+    }
+
     if (dc && (dc->w.bitsPerPixel == 1) && (spec_type == 0))
     {
 	/* monochrome */
         if (((color >> 16) & 0xff) +
             ((color >> 8) & 0xff) + (color & 0xff) > 255*3/2)
-            return 1;  /* white */
-        else return 0;  /* black */
+             return 1;   /* white */
+        else return 0;   /* black */
     }
 
-    if (COLOR_FixedMap)
+    if ( cSpace.flags & COLOR_FIXED )
     {
-        /* there is no colormap possible; we are going to have to compute
-           the pixel value from the visual information stored earlier */
+        /* there is no colormap limitation; we are going to have to compute
+         * the pixel value from the visual information stored earlier 
+	 */
 
-	unsigned long red, green, blue;
-	unsigned idx;
-	PALETTEOBJ * palPtr;
+	unsigned 	long red, green, blue;
+	unsigned 	idx = 0;
+	PALETTEOBJ * 	palPtr = (PALETTEOBJ *) GDI_GetObjPtr( hPal, PALETTE_MAGIC );
 
 	switch(spec_type)
         {
-        case 0: /* RGB */
-        case 2: /* PALETTERGB -- needs some work, but why bother; we've got a REALLY LARGE number of colors...? */
-        default:
+	  default: 
+          case 0: /* RGB */
+
             red = GetRValue(color);
             green = GetGValue(color);
             blue = GetBValue(color);
             break;
 
-        case 1: /* PALETTEIDX -- hmm, get the real color from the stock palette */
-            palPtr = (PALETTEOBJ *) GDI_GetObjPtr( STOCK_DEFAULT_PALETTE, PALETTE_MAGIC);
-            idx = color & 0xffff;
+          case 2: /* PALETTERGB - not sure if we really need to search palette */
+	
+	    idx = COLOR_PaletteLookupPixel( palPtr->logpalette.palPalEntry,
+					    palPtr->logpalette.palNumEntries,
+					    NULL, color, FALSE);
+          case 1: /* PALETTEINDEX */
+
+            idx = ((spec_type == 1)?color:idx) & 0xffff;
+
             if (idx >= palPtr->logpalette.palNumEntries)
             {
-                fprintf(stderr, "COLOR_ToPhysical(%lx) : idx %d is out of bounds, assuming black\n", color, idx);
+                fprintf(stderr, "\tRGB(%lx) : idx %d is out of bounds, assuming black\n", color, idx);
                 /* out of bounds */
                 red = green = blue = 0;
             }
-            else
+            else if( palPtr->mapping ) return palPtr->mapping[idx];
+	    else
             {
                 red = palPtr->logpalette.palPalEntry[idx].peRed;
                 green = palPtr->logpalette.palPalEntry[idx].peGreen;
@@ -374,88 +697,139 @@
 	    return (red << COLOR_Redshift) | (green << COLOR_Greenshift) | (blue << COLOR_Blueshift);
         }
     }
-    else switch(spec_type)
+    else 
     {
-    default:
-    case 0:  /* RGB */
-	index = GetNearestPaletteIndex( STOCK_DEFAULT_PALETTE, color );
-	break;
-    case 1:  /* PALETTEINDEX */
-	index = color & 0xffff;
-	break;
-    case 2:  /* PALETTERGB */
-	if (dc) index = GetNearestPaletteIndex( dc->w.hPalette, color );
-        else index = 0;
-	break;
+	PALETTEOBJ* palPtr = (PALETTEOBJ *) GDI_GetObjPtr( hPal, PALETTE_MAGIC);
+
+	/* palPtr can be NULL when DC is being destroyed */
+
+	if( !palPtr ) return 0;
+	else if( !palPtr->mapping ) 
+            dprintf_palette(stddeb,"\tpalette %04x is not realized\n", dc->w.hPalette);
+
+	switch(spec_type)	/* we have to peruse DC and system palette */
+    	{
+	    default:
+       	    case 0:  /* RGB */
+	    	index = COLOR_PaletteLookupPixel( COLOR_sysPal, 256, 
+						  COLOR_PaletteToPixel, color, FALSE);
+
+		/* dprintf_palette(stddeb,"\tRGB(%lx) -> pixel %i\n", color, index);
+		 */
+	    	break;
+       	    case 1:  /* PALETTEINDEX */
+		index = color & 0xffff;
+
+	        if( index >= palPtr->logpalette.palNumEntries )
+		    fprintf(stderr, "\tRGB(%lx) : index %i is out of bounds\n", color, index); 
+		else if( palPtr->mapping ) index = palPtr->mapping[index];
+
+		/*  dprintf_palette(stddeb,"\tPALETTEINDEX(%04x) -> pixel %i\n", (WORD)color, index);
+		 */
+		break;
+            case 2:  /* PALETTERGB */
+		index = COLOR_PaletteLookupPixel( palPtr->logpalette.palPalEntry, 
+                                             palPtr->logpalette.palNumEntries,
+                                             palPtr->mapping, color, FALSE);
+		/* dprintf_palette(stddeb,"\tPALETTERGB(%lx) -> pixel %i\n", color, index);
+		 */
+		break;
+	}
     }
-    if (dc&&dc->u.x.pal.mappingSize)
-    {
-        if (index >= dc->u.x.pal.mappingSize)
-        {
-            fprintf(stderr, "COLOR_ToPhysical(%lx) : idx %d is >= dc->u.x.pal.mappingSize, assuming pixel 0\n", color, index);
-            return 0;
-        }
-        mapping = (WORD *) GDI_HEAP_LIN_ADDR( dc->u.x.pal.hMapping );
-    }
-    else
-    {
-        if (index >= NB_RESERVED_COLORS)
-        {
-            fprintf(stderr, "COLOR_ToPhysical(%lx) : idx %d is >= NB_RESERVED_COLORS, assuming pixel 0\n", color, index);
-	    return 0;
-        }
-        mapping = (WORD *) GDI_HEAP_LIN_ADDR( hSysColorTranslation );
-    }
-    if (mapping) return mapping[index];
-    else return index;  /* Identity mapping */
+
+    return index;
 }
 
 
 /***********************************************************************
  *           COLOR_SetMapping
  *
- * Set the color-mapping table in a DC.
+ * Set the color-mapping table for selected palette. 
+ * Return number of entries which mapping has changed.
  */
-void COLOR_SetMapping( DC *dc, HANDLE map, HANDLE revMap, WORD size )
+int COLOR_SetMapping( PALETTEOBJ* palPtr, BOOL mapOnly )
 {
-    WORD *pmap, *pnewmap;
-    WORD i;
+    int  i, index;
+    char flag;
+    int  prevMapping = (palPtr->mapping) ? 1 : 0;
+    int  iRemapped = 0;
 
-    if (dc->u.x.pal.hMapping && (dc->u.x.pal.hMapping != hSysColorTranslation))
-	GDI_HEAP_FREE( dc->u.x.pal.hMapping );
-    if (dc->u.x.pal.hRevMapping &&
-        (dc->u.x.pal.hRevMapping != hRevSysColorTranslation))
-	GDI_HEAP_FREE( dc->u.x.pal.hRevMapping );
-    if (map && (map != hSysColorTranslation))
+    /* free dynamic colors in system palette - 
+     * certain optimization is to free them only when they are needed */
+
+    if( !mapOnly && COLOR_firstFree != -1)
+        COLOR_FormatSystemPalette();
+
+    /* initialize palette mapping table */
+ 
+    palPtr->mapping = (int*)xrealloc(palPtr->mapping, sizeof(int)*
+                                     palPtr->logpalette.palNumEntries);
+
+    for( i = 0; i < palPtr->logpalette.palNumEntries; i++ )
     {
-	  /* Copy mapping table */
-	dc->u.x.pal.hMapping = GDI_HEAP_ALLOC( sizeof(WORD) * size );
-	pmap = (WORD *) GDI_HEAP_LIN_ADDR( map );
-	pnewmap = (WORD *) GDI_HEAP_LIN_ADDR( dc->u.x.pal.hMapping );
-	memcpy( pnewmap, pmap, sizeof(WORD)*size );
-          /* Build reverse table */
-        dc->u.x.pal.hRevMapping = GDI_HEAP_ALLOC(sizeof(WORD)*COLOR_ColormapSize);
-        pmap = (WORD *) GDI_HEAP_LIN_ADDR( dc->u.x.pal.hRevMapping );
-        for (i = 0; i < size; i++) pmap[pnewmap[i]] = i;
-    }
-    else
-    {
-        dc->u.x.pal.hMapping = map;
-        dc->u.x.pal.hRevMapping = map ? hRevSysColorTranslation : 0;
-    }
-    dc->u.x.pal.mappingSize = size;
-}
+        index = -1;
+        flag = PC_SYS_USED;
 
+        switch( palPtr->logpalette.palPalEntry[i].peFlags & 0x07 )
+        {
+	case PC_EXPLICIT:   /* palette entries are indices into system palette */
+            index = *(WORD*)(palPtr->logpalette.palPalEntry + i);
+            if( index > 255 || (index >= COLOR_gapStart && index <= COLOR_gapEnd) ) 
+            {
+                fprintf(stderr,"PC_EXPLICIT: idx %d out of system palette, assuming black.\n", index); 
+                index = 0;
+            }
+            break;
 
-/***********************************************************************
- *           RealizeDefaultPalette    (GDI.365)
- */
-WORD RealizeDefaultPalette( HDC hdc )
-{
-    DC *dc;
-    if (!(dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC ))) return 0;
-    dc->w.hPalette = STOCK_DEFAULT_PALETTE;
-    COLOR_SetMapping( dc, hSysColorTranslation,
-                      hRevSysColorTranslation, NB_RESERVED_COLORS );
-    return NB_RESERVED_COLORS;
+	case PC_RESERVED:   /* forbid future mappings to this entry */
+            flag |= PC_SYS_RESERVED;
+            /* fall through */
+	default:	    /* try to collapse identical colors */
+            index = COLOR_PaletteLookupExactIndex(COLOR_sysPal, 256,  
+                             *(COLORREF*)(palPtr->logpalette.palPalEntry + i));
+            /* fall through */
+	case PC_NOCOLLAPSE: 
+            if( index < 0 )
+            {
+                if( COLOR_firstFree > 0 && !(cSpace.flags & COLOR_FIXED) && !mapOnly )
+                {
+                    XColor color;
+                    index = COLOR_firstFree;  /* ought to be available */
+                    COLOR_firstFree = COLOR_sysPal[index].peRed;
+                    color.pixel = (COLOR_PaletteToPixel) ? COLOR_PaletteToPixel[index] : index;
+                    color.red = palPtr->logpalette.palPalEntry[i].peRed * 65535 / 255;
+                    color.green = palPtr->logpalette.palPalEntry[i].peGreen * 65535 / 255;
+                    color.blue = palPtr->logpalette.palPalEntry[i].peBlue * 65535 / 255;
+                    color.flags = DoRed | DoGreen | DoBlue;
+                    XStoreColor(display, cSpace.colorMap, &color);
+                    COLOR_sysPal[index] = palPtr->logpalette.palPalEntry[i];
+                    COLOR_sysPal[index].peFlags = flag;
+                    if( COLOR_PaletteToPixel ) index = COLOR_PaletteToPixel[index];
+                    break;
+                }
+                else if ( cSpace.flags & COLOR_VIRTUAL ) 
+                {
+                    index = COLOR_ToPhysical( NULL, 0x00ffffff &
+                             *(COLORREF*)(palPtr->logpalette.palPalEntry + i));
+                    break;     
+                }
+
+                /* we have to map to existing entry in the system palette */
+
+                index = COLOR_PaletteLookupPixel(COLOR_sysPal, 256, NULL, 
+                       *(COLORREF*)(palPtr->logpalette.palPalEntry + i), TRUE);
+            }
+
+            if( COLOR_PaletteToPixel ) index = COLOR_PaletteToPixel[index];
+            break;
+        }
+
+        if( !prevMapping || palPtr->mapping[i] != index ) iRemapped++;
+        palPtr->mapping[i] = index;
+
+        /* dprintf_palette(stddeb,"\tentry %i (%lx) -> pixel %i\n", i, 
+				*(COLORREF*)(palPtr->logpalette.palPalEntry + i), index);
+	*/
+    }
+    return iRemapped;
 }
diff --git a/objects/cursoricon.c b/objects/cursoricon.c
index 3a003a1..c750d61 100644
--- a/objects/cursoricon.c
+++ b/objects/cursoricon.c
@@ -198,20 +198,20 @@
  * Load the icon/cursor directory for a given resource name and find the
  * best matching entry.
  */
-static BOOL CURSORICON_LoadDirEntry(HANDLE hInstance, SEGPTR name,
+static BOOL CURSORICON_LoadDirEntry(HINSTANCE32 hInstance, SEGPTR name,
                                     int width, int height, int colors,
                                     BOOL fCursor, CURSORICONDIRENTRY *dirEntry)
 {
-    HRSRC hRsrc;
-    HANDLE hMem;
+    HRSRC16 hRsrc;
+    HGLOBAL16 hMem;
     CURSORICONDIR *dir;
     CURSORICONDIRENTRY *entry = NULL;
 
-    if (!(hRsrc = FindResource( hInstance, name,
+    if (!(hRsrc = FindResource16( hInstance, name,
                                 fCursor ? RT_GROUP_CURSOR : RT_GROUP_ICON )))
         return FALSE;
-    if (!(hMem = LoadResource( hInstance, hRsrc ))) return FALSE;
-    if ((dir = (CURSORICONDIR *)LockResource( hMem )))
+    if (!(hMem = LoadResource16( hInstance, hRsrc ))) return FALSE;
+    if ((dir = (CURSORICONDIR *)LockResource16( hMem )))
     {
         if (fCursor)
             entry = (CURSORICONDIRENTRY *)CURSORICON_FindBestCursor( dir,
@@ -221,7 +221,7 @@
                                                        width, height, colors );
         if (entry) *dirEntry = *entry;
     }
-    FreeResource( hMem );
+    FreeResource16( hMem );
     return (entry != NULL);
 }
 
@@ -245,11 +245,11 @@
 
     if (fCursor)  /* If cursor, get the hotspot */
     {
-        POINT16 *pt = (POINT16 *)LockResource( handle );
+        POINT16 *pt = (POINT16 *)LockResource16( handle );
         hotspot = *pt;
         bmi = (BITMAPINFO *)(pt + 1);
     }
-    else bmi = (BITMAPINFO *)LockResource( handle );
+    else bmi = (BITMAPINFO *)LockResource16( handle );
 
     /* Create a copy of the bitmap header */
 
@@ -391,13 +391,13 @@
 
     /* Load the resource */
 
-    if (!(hRsrc = FindResource( hInstance,
+    if (!(hRsrc = FindResource16( hInstance,
                                 MAKEINTRESOURCE( dirEntry.icon.wResId ),
                                 fCursor ? RT_CURSOR : RT_ICON ))) return 0;
-    if (!(handle = LoadResource( hInstance, hRsrc ))) return 0;
+    if (!(handle = LoadResource16( hInstance, hRsrc ))) return 0;
 
     hRet = CURSORICON_LoadHandler( handle, hInstance, fCursor );
-    FreeResource(handle);
+    FreeResource16(handle);
     return hRet;
 }
 
@@ -463,13 +463,13 @@
 /***********************************************************************
  *           LoadCursor    (USER.173)
  */
-HCURSOR LoadCursor( HANDLE hInstance, SEGPTR name )
+HCURSOR16 LoadCursor16( HINSTANCE16 hInstance, SEGPTR name )
 {
     if (HIWORD(name))
-        dprintf_cursor( stddeb, "LoadCursor: %04x '%s'\n",
+        dprintf_cursor( stddeb, "LoadCursor16: %04x '%s'\n",
                         hInstance, (char *)PTR_SEG_TO_LIN( name ) );
     else
-        dprintf_cursor( stddeb, "LoadCursor: %04x %04x\n",
+        dprintf_cursor( stddeb, "LoadCursor16: %04x %04x\n",
                         hInstance, LOWORD(name) );
 
     return CURSORICON_Load( hInstance, name,
@@ -480,7 +480,7 @@
 /***********************************************************************
  *           LoadIcon    (USER.174)
  */
-HICON LoadIcon( HANDLE hInstance, SEGPTR name )
+HICON16 LoadIcon16(HINSTANCE16 hInstance,SEGPTR name)
 {
     if (HIWORD(name))
         dprintf_icon( stddeb, "LoadIcon: %04x '%s'\n",
@@ -935,7 +935,7 @@
  */
 WORD GetIconID( HANDLE hResource, DWORD resType )
 {
-    CURSORICONDIR *lpDir = LockResource(hResource);
+    CURSORICONDIR *lpDir = LockResource16(hResource);
 
     if (!lpDir || lpDir->idReserved ||
         ((lpDir->idType != 1) && (lpDir->idType != 2)))
diff --git a/objects/dc.c b/objects/dc.c
index d305001..5e3eff9 100644
--- a/objects/dc.c
+++ b/objects/dc.c
@@ -334,8 +334,8 @@
  */
 BOOL DC_CallHookProc(DC* dc, WORD code, LPARAM lParam)
 {
-  BOOL   bRet = 0;
-  FARPROC ptr = GDI_GetDefDCHook();
+  BOOL bRet = FALSE;
+  FARPROC16 ptr = GDI_GetDefDCHook();
 
   dprintf_dc(stddeb,"CallDCHook: code %04x\n", code);
 
@@ -379,8 +379,6 @@
 	newdc->w.hClipRgn = CreateRectRgn( 0, 0, 0, 0 );
 	CombineRgn( newdc->w.hClipRgn, dc->w.hClipRgn, 0, RGN_COPY );
     }
-    COLOR_SetMapping( newdc, dc->u.x.pal.hMapping,
-                      dc->u.x.pal.hRevMapping, dc->u.x.pal.mappingSize );
     return handle;
 }
 
@@ -421,8 +419,6 @@
 
     SelectObject( hdc, dcs->w.hBrush );
     SelectObject( hdc, dcs->w.hFont );
-    COLOR_SetMapping( dc, dcs->u.x.pal.hMapping,
-                      dcs->u.x.pal.hRevMapping, dcs->u.x.pal.mappingSize );
 }
 
 
diff --git a/objects/font.c b/objects/font.c
index 29a7602..fb4e234 100644
--- a/objects/font.c
+++ b/objects/font.c
@@ -430,22 +430,56 @@
 
 
 /***********************************************************************
- *           CreateFont    (GDI.56)
+ *           CreateFont16    (GDI.56)
  */
-HFONT CreateFont( INT height, INT width, INT esc, INT orient, INT weight,
-		  BYTE italic, BYTE underline, BYTE strikeout, BYTE charset,
-		  BYTE outpres, BYTE clippres, BYTE quality, BYTE pitch,
-		  LPCSTR name )
+HFONT16 CreateFont16( INT16 height, INT16 width, INT16 esc, INT16 orient,
+                      INT16 weight, BYTE italic, BYTE underline,
+                      BYTE strikeout, BYTE charset, BYTE outpres,
+                      BYTE clippres, BYTE quality, BYTE pitch, LPCSTR name )
 {
     LOGFONT16 logfont = {height, width, esc, orient, weight, italic, underline,
                       strikeout, charset, outpres, clippres, quality, pitch, };
-    dprintf_font(stddeb,"CreateFont(%d,%d)\n", height, width);
+    dprintf_font(stddeb,"CreateFont16(%d,%d)\n", height, width);
     if (name) lstrcpyn32A(logfont.lfFaceName,name,sizeof(logfont.lfFaceName));
     else logfont.lfFaceName[0] = '\0';
     return CreateFontIndirect16( &logfont );
 }
 
 
+
+/*************************************************************************
+ *           CreateFont32A    (GDI32.43)
+ */
+HFONT32 CreateFont32A( INT32 height, INT32 width, INT32 esc, INT32 orient,
+                       INT32 weight, DWORD italic, DWORD underline,
+                       DWORD strikeout, DWORD charset, DWORD outpres,
+                       DWORD clippres, DWORD quality, DWORD pitch, LPCSTR name)
+{
+    return (HFONT32)CreateFont16( height, width, esc, orient, weight, italic,
+                                  underline, strikeout, charset, outpres,
+                                  clippres, quality, pitch, name );
+}
+
+
+/*************************************************************************
+ *           CreateFont32W    (GDI32.46)
+ */
+HFONT32 CreateFont32W( INT32 height, INT32 width, INT32 esc, INT32 orient,
+                       INT32 weight, DWORD italic, DWORD underline,
+                       DWORD strikeout, DWORD charset, DWORD outpres,
+                       DWORD clippres, DWORD quality, DWORD pitch,
+                       LPCWSTR name )
+{
+    LPSTR namea = name ? STRING32_DupUniToAnsi(name) : NULL;
+    HFONT32 ret = (HFONT32)CreateFont16( height, width, esc, orient, weight,
+                                         italic, underline, strikeout, charset,
+                                         outpres, clippres, quality, pitch,
+                                         namea );
+    free(namea);
+    return ret;
+}
+
+
 /***********************************************************************
  *           FONT_GetObject
  */
@@ -483,7 +517,7 @@
     {
 	HFONT hnewfont;
 
-	hnewfont = CreateFont(10, 7, 0, 0, FW_DONTCARE,
+	hnewfont = CreateFont16(10, 7, 0, 0, FW_DONTCARE,
 			      FALSE, FALSE, FALSE, DEFAULT_CHARSET, 0, 0,
 			      DEFAULT_QUALITY, FF_DONTCARE, "*" );
 	font = (FONTOBJ *) GDI_HEAP_LIN_ADDR( hnewfont );
diff --git a/objects/gdiobj.c b/objects/gdiobj.c
index 7568e63..1dffd30 100644
--- a/objects/gdiobj.c
+++ b/objects/gdiobj.c
@@ -27,10 +27,6 @@
 #define OBJ_PEN             1
 #define OBJ_BRUSH           2
 
-#define MAX_OBJ 			1024
-HANDLE *lpPenBrushList = NULL;
-
-
 /***********************************************************************
  *          GDI stock objects 
  */
@@ -277,7 +273,7 @@
       case PEN_MAGIC:     return GDI_FreeObject( obj );
       case BRUSH_MAGIC:   return BRUSH_DeleteObject( obj, (BRUSHOBJ*)header );
       case FONT_MAGIC:    return GDI_FreeObject( obj );
-      case PALETTE_MAGIC: return GDI_FreeObject( obj );
+      case PALETTE_MAGIC: return PALETTE_DeleteObject(obj,(PALETTEOBJ*)header);
       case BITMAP_MAGIC:  return BITMAP_DeleteObject( obj, (BITMAPOBJ*)header);
       case REGION_MAGIC:  return REGION_DeleteObject( obj, (RGNOBJ*)header );
     }
@@ -412,9 +408,26 @@
 /***********************************************************************
  *           UnrealizeObject    (GDI.150)
  */
-BOOL UnrealizeObject( HANDLE handle )
+BOOL UnrealizeObject( HANDLE obj )
 {
-    dprintf_gdi(stdnimp, "UnrealizeObject: %04x\n", handle );
+      /* Check if object is valid */
+
+    GDIOBJHDR * header = (GDIOBJHDR *) GDI_HEAP_LIN_ADDR( obj );
+    if (!header) return FALSE;
+
+    dprintf_gdi( stddeb, "UnrealizeObject: %04x\n", obj );
+
+      /* Unrealize object */
+
+    switch(header->wMagic)
+    {
+    case PALETTE_MAGIC: 
+        return PALETTE_UnrealizeObject( obj, (PALETTEOBJ *)header );
+
+    case BRUSH_MAGIC:
+        /* Windows resets the brush origin. We don't need to. */
+        break;
+    }
     return TRUE;
 }
 
diff --git a/objects/linedda.c b/objects/linedda.c
index a6b1296..5ef10f2 100644
--- a/objects/linedda.c
+++ b/objects/linedda.c
@@ -13,7 +13,7 @@
  *		LineDDA		(GDI.100)
  */
 void LineDDA(short nXStart, short nYStart, short nXEnd, short nYEnd,
-	     FARPROC callback, long lParam)
+	     FARPROC16 callback, long lParam)
 {
     int xadd = 1, yadd = 1;
     int err,erradd;
diff --git a/objects/oembitmap.c b/objects/oembitmap.c
index bb5939c..3de567fa 100644
--- a/objects/oembitmap.c
+++ b/objects/oembitmap.c
@@ -339,7 +339,7 @@
 
     attrs = (XpmAttributes *)xmalloc( XpmAttributesSize() );
     attrs->valuemask    = XpmColormap | XpmDepth | XpmColorSymbols |XpmHotspot;
-    attrs->colormap     = COLOR_WinColormap;
+    attrs->colormap     = COLOR_GetColormap();
     attrs->depth        = color ? screenDepth : 1;
     attrs->colorsymbols = (attrs->depth > 1) ? OBM_Colors : OBM_BlackAndWhite;
     attrs->numsymbols   = (attrs->depth > 1) ? NB_COLOR_SYMBOLS : 2;
diff --git a/objects/palette.c b/objects/palette.c
index d0cf94e..c287be8 100644
--- a/objects/palette.c
+++ b/objects/palette.c
@@ -2,6 +2,7 @@
  * GDI palette objects
  *
  * Copyright 1993,1994 Alexandre Julliard
+ * Copyright 1996 Alex Korobka
  *
  */
 #include <stdlib.h>
@@ -14,13 +15,20 @@
 /* #define DEBUG_PALETTE */
 #include "debug.h"
 
+extern HWND 		DCE_hDC2hWnd( HDC );			/* get associated window by 
+								 * walking DCE list */
+
 static WORD SystemPaletteUse = SYSPAL_STATIC;	/* currently not considered */
 
+static HPALETTE16 hPrimaryPalette = 0; /* used for WM_PALETTECHANGED */
+static HPALETTE16 hLastRealizedPalette = 0; /* UnrealizeObject() needs it */
+
 
 /***********************************************************************
  *           PALETTE_GetNearestIndexAndColor
  */
-static WORD PALETTE_GetNearestIndexAndColor(HPALETTE16 hpalette, COLORREF *color)
+static WORD PALETTE_GetNearestIndexAndColor( HPALETTE16 hpalette,
+                                             COLORREF *color)
 {
     int i, minDist, dist;
     WORD index = 0;
@@ -31,14 +39,13 @@
     palPtr = (PALETTEOBJ *) GDI_GetObjPtr( hpalette, PALETTE_MAGIC );
     if (!palPtr) return 0;
 
-    if ((COLOR_WinColormap != DefaultColormapOfScreen(screen)) &&
-	(hpalette == STOCK_DEFAULT_PALETTE))
+    if ( hpalette == STOCK_DEFAULT_PALETTE )
     {
 	if ((*color & 0xffffff) == 0) return 0;  /* Entry 0 is black */
 	if ((*color & 0xffffff) == 0xffffff)     /* Max entry is white */
 	    return palPtr->logpalette.palNumEntries - 1;
     }
-    
+
     r = GetRValue(*color);
     g = GetGValue(*color);
     b = GetBValue(*color);
@@ -60,6 +67,7 @@
 	}
 	entry++;
     }
+
     entry = &palPtr->logpalette.palPalEntry[index];
     *color = RGB( entry->peRed, entry->peGreen, entry->peBlue );
     return index;
@@ -67,19 +75,39 @@
 
 
 /***********************************************************************
+ *           PALETTE_ValidateFlags
+ */
+void PALETTE_ValidateFlags(PALETTEENTRY* lpPalE, int size)
+{
+    int i = 0;
+    for( ; i<size ; i++ )
+        lpPalE[i].peFlags = PC_SYS_USED | (lpPalE[i].peFlags & 0x07);
+}
+
+
+/***********************************************************************
  *           CreatePalette    (GDI.360)
  */
 HPALETTE16 CreatePalette( const LOGPALETTE* palette )
 {
     PALETTEOBJ * palettePtr;
     HPALETTE16 hpalette;
-    int size;
+    int size = sizeof(LOGPALETTE) + (palette->palNumEntries - 1) * sizeof(PALETTEENTRY);
 
-    size = sizeof(LOGPALETTE) + (palette->palNumEntries - 1) * sizeof(PALETTEENTRY);
-    hpalette = GDI_AllocObject( sizeof(GDIOBJHDR) + size, PALETTE_MAGIC );
+    dprintf_palette(stddeb,"CreatePalette: ");
+
+    dprintf_palette(stddeb,"%i entries, ", palette->palNumEntries);
+
+    hpalette = GDI_AllocObject( size + sizeof(int*) +sizeof(GDIOBJHDR) , PALETTE_MAGIC );
     if (!hpalette) return 0;
+
     palettePtr = (PALETTEOBJ *) GDI_HEAP_LIN_ADDR( hpalette );
     memcpy( &palettePtr->logpalette, palette, size );
+    PALETTE_ValidateFlags(palettePtr->logpalette.palPalEntry, 
+			  palettePtr->logpalette.palNumEntries);
+    palettePtr->mapping = NULL;
+
+    dprintf_palette(stddeb,"returning %04x\n", hpalette);
     return hpalette;
 }
 
@@ -92,14 +120,19 @@
 {
     PALETTEOBJ * palPtr;
     int numEntries;
+
+    dprintf_palette(stddeb,"GetPaletteEntries: hpal = %04x, %i entries\n", hpalette, count);
         
     palPtr = (PALETTEOBJ *) GDI_GetObjPtr( hpalette, PALETTE_MAGIC );
     if (!palPtr) return 0;
+
     numEntries = palPtr->logpalette.palNumEntries;
     if (start >= numEntries) return 0;
     if (start+count > numEntries) count = numEntries - start;
     memcpy( entries, &palPtr->logpalette.palPalEntry[start],
 	    count * sizeof(PALETTEENTRY) );
+    for( numEntries = 0; numEntries < count ; numEntries++ )
+         if( entries[numEntries].peFlags & 0xF0 ) entries[numEntries].peFlags = 0;
     return count;
 }
 
@@ -112,14 +145,19 @@
 {
     PALETTEOBJ * palPtr;
     int numEntries;
-        
+
+    dprintf_palette(stddeb,"SetPaletteEntries: hpal = %04x, %i entries\n", hpalette, count);
+
     palPtr = (PALETTEOBJ *) GDI_GetObjPtr( hpalette, PALETTE_MAGIC );
     if (!palPtr) return 0;
+
     numEntries = palPtr->logpalette.palNumEntries;
     if (start >= numEntries) return 0;
     if (start+count > numEntries) count = numEntries - start;
     memcpy( &palPtr->logpalette.palPalEntry[start], entries,
 	    count * sizeof(PALETTEENTRY) );
+    PALETTE_ValidateFlags(palPtr->logpalette.palPalEntry, 
+			  palPtr->logpalette.palNumEntries);
     return count;
 }
 
@@ -128,6 +166,10 @@
  */
 BOOL ResizePalette(HPALETTE16 hPal, UINT cEntries)
 {
+
+    /* should simply realloc memory and zero out
+     * added entries, if any */
+
     fprintf(stdnimp,"ResizePalette: empty stub! \n");
     return FALSE;
 }
@@ -144,14 +186,11 @@
 
 /***********************************************************************
  *           SetSystemPaletteUse    (GDI.373)
- *	Should this be per DC rather than system wide?
- *  Currently, it does not matter as the use is only set and returned,
- *  but not taken into account
  */
 WORD SetSystemPaletteUse( HDC hdc, WORD use)
 {
 	 WORD old=SystemPaletteUse;
-	 printf("SetSystemPaletteUse(%04x,%04x) // empty stub !!!\n", hdc, use);
+	 fprintf(stdnimp,"SetSystemPaletteUse(%04x,%04x) // empty stub !!!\n", hdc, use);
 	 SystemPaletteUse=use;
 	 return old;
 }
@@ -161,7 +200,7 @@
  */
 WORD GetSystemPaletteUse( HDC hdc )
 {
-	printf("GetSystemPaletteUse(%04x) // empty stub !!!\n", hdc);
+	fprintf(stdnimp,"GetSystemPaletteUse(%04x) // empty stub !!!\n", hdc);
 	return SystemPaletteUse;
 }
 
@@ -182,8 +221,10 @@
 	count = dc->w.devCaps->sizePalette - start;
     for (i = 0; i < count; i++)
     {
-	color.pixel = start + i;
-	XQueryColor( display, COLOR_WinColormap, &color );
+	color.pixel = (COLOR_PaletteToPixel)
+		      ? COLOR_PaletteToPixel[start + i]
+		      : start + i;
+	XQueryColor( display, COLOR_GetColormap(), &color );
 	entries[i].peRed   = color.red >> 8;
 	entries[i].peGreen = color.green >> 8;
 	entries[i].peBlue  = color.blue >> 8;
@@ -233,9 +274,34 @@
 
 
 /***********************************************************************
+ *           PALETTE_UnrealizeObject
+ */
+BOOL PALETTE_UnrealizeObject( HPALETTE16 hpalette, PALETTEOBJ *palette )
+{
+    if (palette->mapping)
+    {
+        free( palette->mapping );
+        palette->mapping = NULL;
+    }
+    if (hLastRealizedPalette == hpalette) hLastRealizedPalette = 0;
+    return TRUE;
+}
+
+
+/***********************************************************************
+ *           PALETTE_DeleteObject
+ */
+BOOL PALETTE_DeleteObject( HPALETTE16 hpalette, PALETTEOBJ *palette )
+{
+    free( palette->mapping );
+    return GDI_FreeObject( hpalette );
+}
+
+
+/***********************************************************************
  *           GDISelectPalette    (GDI.361)
  */
-HPALETTE16 GDISelectPalette( HDC hdc, HPALETTE16 hpal )
+HPALETTE16 GDISelectPalette( HDC hdc, HPALETTE16 hpal, WORD wBkg)
 {
     HPALETTE16 prev;
     DC *dc;
@@ -244,88 +310,127 @@
     if (!(dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC ))) return 0;
     prev = dc->w.hPalette;
     dc->w.hPalette = hpal;
-    if (hpal != STOCK_DEFAULT_PALETTE) COLOR_SetMapping( dc, 0, 0, 0 );
-    else RealizeDefaultPalette( hdc );  /* Always realize default palette */
+    if (!wBkg) hPrimaryPalette = hpal; 
     return prev;
 }
 
 
 /***********************************************************************
  *           GDIRealizePalette    (GDI.362)
+ *
  */
 UINT GDIRealizePalette( HDC hdc )
 {
-    UINT        realized = 0;
-    COLORREF    color;
     DC*         dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC ) ;
     PALETTEOBJ* palPtr;
+    int		realized = 0;
 
-    dprintf_palette(stdnimp, "GDIRealizePalette: %04x...", hdc );
-
-    if( dc )
-      {
+    dprintf_palette(stddeb, "GDIRealizePalette: %04x...", hdc );
+    
+    if( dc &&  dc->w.hPalette != hLastRealizedPalette )
+    {
         palPtr = (PALETTEOBJ *) GDI_GetObjPtr( dc->w.hPalette, PALETTE_MAGIC );
-
-        if( palPtr )
-          {
-            WORD        index, i;
-            HANDLE      hMap;
-            WORD*       pMap;
-
-            hMap = GDI_HEAP_ALLOC(sizeof(WORD)*palPtr->logpalette.palNumEntries);
-            pMap = (WORD*)GDI_HEAP_LIN_ADDR( hMap );
-
-            if( pMap )
-            {
-              for (i = 0; i < palPtr->logpalette.palNumEntries ; i++)
-              {
-                color = *(COLORREF*)(palPtr->logpalette.palPalEntry + i);
-                index = PALETTE_GetNearestIndexAndColor( STOCK_DEFAULT_PALETTE, &color);
-                if( index != i ) realized++;
-                pMap[i] = index;
-              }
-              COLOR_SetMapping(dc, hMap, 0, i);
-              GDI_HEAP_FREE(hMap);
-            }
-          }
-      }
+        
+	realized = COLOR_SetMapping(palPtr, dc->w.hPalette != hPrimaryPalette 
+                                  || dc->w.hPalette == STOCK_DEFAULT_PALETTE );
+	hLastRealizedPalette = dc->w.hPalette;
+    }
+    else dprintf_palette(stddeb, " skipping ");
+    
     dprintf_palette(stdnimp, " realized %i colors\n", realized );
-    return realized;
+    return (UINT)realized;
 }
 
 
 /***********************************************************************
+ *           RealizeDefaultPalette    (GDI.365)
+ */
+WORD RealizeDefaultPalette( HDC hdc )
+{
+    DC *dc;
+
+    dprintf_palette(stddeb,"RealizeDefaultPalette: %04x\n", hdc );
+
+    if (!(dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC ))) return 0;
+    if ( dc->w.flags & DC_MEMORY ) return 0;
+
+    hPrimaryPalette = STOCK_DEFAULT_PALETTE;
+    hLastRealizedPalette = STOCK_DEFAULT_PALETTE;
+    return COLOR_SetMapping( (PALETTEOBJ*)GDI_GetObjPtr(STOCK_DEFAULT_PALETTE, PALETTE_MAGIC ), TRUE);
+}
+
+
+/***********************************************************************
+ *           IsDCCurrentPalette   (GDI.412)
+ */
+BOOL IsDCCurrentPalette(HDC hDC)
+{
+    DC* dc = (DC *)GDI_GetObjPtr( hDC, DC_MAGIC );
+    return (dc->w.hPalette == hPrimaryPalette);
+}
+
+/***********************************************************************
  *           SelectPalette    (USER.282)
  */
-HPALETTE16 SelectPalette(HDC hDC, HPALETTE16 hPal, BOOL bForceBackground)
+HPALETTE16 SelectPalette( HDC hDC, HPALETTE16 hPal, BOOL bForceBackground )
 {
-    return GDISelectPalette( hDC, hPal );
+    WORD	wBkgPalette = 1;
+    PALETTEOBJ* lpt = (PALETTEOBJ*) GDI_GetObjPtr( hPal, PALETTE_MAGIC );
+
+    dprintf_palette(stddeb,"SelectPalette: dc %04x pal %04x, force=%i ", 
+			    hDC, hPal, bForceBackground);
+    if( !lpt ) return 0;
+
+    dprintf_palette(stddeb," entries = %d\n", 
+			    lpt->logpalette.palNumEntries);
+
+    if( hPal != STOCK_DEFAULT_PALETTE )
+    {
+	HWND hWnd = DCE_hDC2hWnd( hDC );
+	HWND hActive = GetActiveWindow();
+	
+	/* set primary palette if it's related to current active */
+
+	if( hWnd && (hActive == hWnd || IsChild(hActive,hWnd)) &&
+            !bForceBackground )
+	    wBkgPalette = 0;
+    }
+    return GDISelectPalette( hDC, hPal, wBkgPalette);
 }
 
 
 /***********************************************************************
- *           SelectPalette32    (GDI32.300)
+ *           RealizePalette    (USER.283) (GDI32.280)
  */
-HPALETTE16 SelectPalette32(HDC hDC, HPALETTE16 hPal, BOOL bForceBackground)
+UINT16 RealizePalette( HDC32 hDC )
 {
-    return GDISelectPalette( hDC, hPal );
+    UINT16 realized = GDIRealizePalette( hDC );
+
+    /* do not send anything if no colors were changed */
+
+    if( IsDCCurrentPalette( hDC ) && realized )
+    {
+	/* Send palette change notification */
+
+	HWND hWnd;
+ 	if( (hWnd = DCE_hDC2hWnd( hDC )) )
+            SendMessage16( HWND_BROADCAST, WM_PALETTECHANGED, hWnd, 0L);
+    }
+    return realized;
 }
 
 
-/***********************************************************************
- *           RealizePalette    (USER.283)
+/**********************************************************************
+ *	    UpdateColors	(GDI.366)
+ *
  */
-UINT RealizePalette(HDC hDC)
+int UpdateColors( HDC hDC )
 {
-    return GDIRealizePalette( hDC );
+    HWND hWnd = DCE_hDC2hWnd( hDC );
+
+    /* Docs say that we have to remap current drawable pixel by pixel
+     * but it would take forever given the speed of XGet/PutPixel.
+     */
+    if (hWnd) InvalidateRect16( hWnd, NULL, FALSE );
+    return 0x666;
 }
-
-
-/***********************************************************************
- *           RealizePalette32    (GDI32.280)
- */
-UINT RealizePalette32(HDC hDC)
-{
-    return GDIRealizePalette( hDC );
-}
-
diff --git a/objects/text.c b/objects/text.c
index f8f8258..5c892d8 100644
--- a/objects/text.c
+++ b/objects/text.c
@@ -618,7 +618,7 @@
 /***********************************************************************
  *		GrayString (USER.185)
  */
-BOOL GrayString(HDC hdc, HBRUSH hbr, FARPROC gsprc, LPARAM lParam, 
+BOOL GrayString(HDC hdc, HBRUSH hbr, FARPROC16 gsprc, LPARAM lParam, 
 		INT cch, INT x, INT y, INT cx, INT cy)
 {
     BOOL ret;
diff --git a/programs/winhelp/hlp2sgml.c b/programs/winhelp/hlp2sgml.c
index 717b876..699be73 100644
--- a/programs/winhelp/hlp2sgml.c
+++ b/programs/winhelp/hlp2sgml.c
@@ -314,10 +314,11 @@
   return strlen(str);
 }
 
-SEGPTR lstrcpy( SEGPTR target, SEGPTR source )
+LPSTR lstrcpy32A( LPSTR dst, LPCSTR src )
 {
-  strcpy( (char *)target, (char *)source );
-  return target;
+    if (!src || !dst) return NULL;
+    strcpy( dst, src );
+    return dst;
 }
 
 void hmemcpy(LPVOID hpvDest, LPCVOID hpvSource, LONG cbCopy)
diff --git a/programs/winhelp/hlpfile.c b/programs/winhelp/hlpfile.c
index 0c7bcd8..2a6c36a 100644
--- a/programs/winhelp/hlpfile.c
+++ b/programs/winhelp/hlpfile.c
@@ -183,7 +183,7 @@
 
   hlpfile->lpszPath   = GlobalLock(hHlpFile);
   hlpfile->lpszPath  += sizeof(HLPFILE);
-  lstrcpy(hlpfile->lpszPath, (SEGPTR) lpszPath);
+  strcpy(hlpfile->lpszPath, lpszPath);
 
   phrases.hBuffer = topic.hBuffer = hFileBuffer = 0;
 
diff --git a/programs/winhelp/winhelp.c b/programs/winhelp/winhelp.c
index a709473..594efe0 100644
--- a/programs/winhelp/winhelp.c
+++ b/programs/winhelp/winhelp.c
@@ -322,11 +322,11 @@
   /* Create main Window */
   if (!page) LoadString(Globals.hInstance, IDS_WINE_HELP, szCaption, sizeof(szCaption));
   hWnd = CreateWindow (bPopup ? TEXT_WIN_CLASS_NAME : MAIN_WIN_CLASS_NAME,
-		       page ? (SEGPTR) page->file->lpszTitle : (SEGPTR) szCaption,
+		       page ? page->file->lpszTitle : szCaption,
 		       bPopup ? WS_POPUPWINDOW | WS_BORDER : WS_OVERLAPPEDWINDOW,
 		       origin.x, origin.y, size.cx, size.cy,
 		       0, bPrimary ? LoadMenu(Globals.hInstance, STRING_MENU_Xx) : 0,
-		       Globals.hInstance, (SEGPTR) win);
+		       Globals.hInstance, win);
 
   ShowWindow (hWnd, nCmdShow);
   UpdateWindow (hWnd);
@@ -359,10 +359,10 @@
 
       /* Create button box and text Window */
       CreateWindow(BUTTON_BOX_WIN_CLASS_NAME, "", WS_CHILD | WS_VISIBLE,
-		   0, 0, 0, 0, hWnd, 0, Globals.hInstance, (SEGPTR) win);
+		   0, 0, 0, 0, hWnd, 0, Globals.hInstance, win);
 
       CreateWindow(TEXT_WIN_CLASS_NAME, "", WS_CHILD | WS_VISIBLE,
-		   0, 0, 0, 0, hWnd, 0, Globals.hInstance, (SEGPTR) win);
+		   0, 0, 0, 0, hWnd, 0, Globals.hInstance, win);
 
       /* Fall through */
     case WM_USER:
diff --git a/rc/Makefile.in b/rc/Makefile.in
index 6778692..d4d178a 100644
--- a/rc/Makefile.in
+++ b/rc/Makefile.in
@@ -1,3 +1,4 @@
+DEFS   = -D__WINE__
 TOPSRC = @top_srcdir@
 
 PROGRAM = winerc
diff --git a/resources/Makefile.in b/resources/Makefile.in
index d6e2d9b..153df2c 100644
--- a/resources/Makefile.in
+++ b/resources/Makefile.in
@@ -1,5 +1,5 @@
+DEFS   = -D__WINE__
 TOPSRC = @top_srcdir@
-
 MODULE = resources
 
 LANGUAGES = En Es De No Fr Fi Da Cz Eo It Ko
diff --git a/tools/Makefile.in b/tools/Makefile.in
index 507f691..3ff5e74 100644
--- a/tools/Makefile.in
+++ b/tools/Makefile.in
@@ -1,4 +1,5 @@
-TOPSRC  = @top_srcdir@
+DEFS   = -D__WINE__
+TOPSRC = @top_srcdir@
 
 PROGRAM = build
 MODULE  = none
diff --git a/tools/build.c b/tools/build.c
index 6a44683..1e0d7b6 100644
--- a/tools/build.c
+++ b/tools/build.c
@@ -1661,9 +1661,9 @@
  * (ebp)    previous ebp
  *
  * Prototypes for the CallTo16 functions:
- *   extern WORD CallTo16_word_xxx( FARPROC func, WORD ds, args... );
- *   extern LONG CallTo16_long_xxx( FARPROC func, WORD ds, args... );
- *   extern void CallTo16_regs_( FARPROC func, WORD ds, WORD es, WORD bp,
+ *   extern WORD CallTo16_word_xxx( FARPROC16 func, WORD ds, args... );
+ *   extern LONG CallTo16_long_xxx( FARPROC16 func, WORD ds, args... );
+ *   extern void CallTo16_regs_( FARPROC16 func, WORD ds, WORD es, WORD bp,
  *                               WORD ax, WORD bx, WORD cx, WORD dx,
  *                               WORD si, WORD di );
  */
@@ -1981,7 +1981,7 @@
  * (ebp)    previous ebp
  *
  * Prototype for the CallTo32 functions:
- *   extern LONG CallTo32_nn( FARPROC func, args... );
+ *   extern LONG CallTo32_nn( FARPROC32 func, args... );
  */
 static void BuildCallTo32Func( int args )
 {
diff --git a/win32/Makefile.in b/win32/Makefile.in
index 452f909..634e87b 100644
--- a/win32/Makefile.in
+++ b/win32/Makefile.in
@@ -1,3 +1,4 @@
+DEFS   = -D__WINE__
 TOPSRC = @top_srcdir@
 MODULE = win32
 
@@ -15,7 +16,6 @@
 	newfns.c \
 	object_mgt.c \
 	process.c \
-	resource.c \
 	string32.c \
 	struct32.c \
 	thread.c \
diff --git a/win32/cursoricon32.c b/win32/cursoricon32.c
index e09b635..0e256a4 100644
--- a/win32/cursoricon32.c
+++ b/win32/cursoricon32.c
@@ -33,7 +33,6 @@
 #include "win.h"
 #include "struct32.h"
 #include "string32.h"
-#include "resource32.h"
 #include "stddebug.h"
 #include "debug.h"
 #include "xmalloc.h"
@@ -456,22 +455,25 @@
 
 
 /***********************************************************************
- *           LoadCursor
+ *           LoadCursorW		(USER32.361)
  */
-HCURSOR WIN32_LoadCursorW( HANDLE hInstance, LPCWSTR name )
+HCURSOR32 LoadCursor32W(HINSTANCE32 hInstance,LPCWSTR name)
 {
     return CURSORICON32_Load( hInstance, name,
                             SYSMETRICS_CXCURSOR, SYSMETRICS_CYCURSOR, 1, TRUE);
 }
 
-HCURSOR WIN32_LoadCursorA(HANDLE hInstance, LPCSTR name)
+/***********************************************************************
+ *           LoadCursorA		(USER32.358)
+ */
+HCURSOR32 LoadCursor32A(HINSTANCE32 hInstance,LPCSTR name)
 {
-	HCURSOR res=0;
+	HCURSOR32 res=0;
 	if(!HIWORD(name))
-		return WIN32_LoadCursorW(hInstance, name);
+		return LoadCursor32W(hInstance,(LPCWSTR)name);
 	else {
 		LPWSTR uni = STRING32_DupAnsiToUni(name);
-		res = WIN32_LoadCursorW(hInstance, uni);
+		res = LoadCursor32W(hInstance, uni);
 		free(uni);
 	}
 	return res;
@@ -479,25 +481,28 @@
 
 
 /***********************************************************************
- *           LoadIcon
+ *           LoadIconW		(USER32.363)
  */
-HICON WIN32_LoadIconW( HANDLE hInstance, LPCWSTR name )
+HICON32 LoadIcon32W(HINSTANCE32 hInstance,LPCWSTR name)
 {
     return CURSORICON32_Load( hInstance, name,
                             SYSMETRICS_CXICON, SYSMETRICS_CYICON,
                             MIN( 16, 1 << screenDepth ), FALSE );
 }
 
-HICON WIN32_LoadIconA( HANDLE hInstance, LPCSTR name)
+/***********************************************************************
+ *           LoadIconA		(USER32.362)
+ */
+HICON32 LoadIcon32A(HINSTANCE32 hInstance,LPCSTR name)
 {
-	HICON res=0;
+	HICON32 res=0;
 	if(!HIWORD(name))
-		return WIN32_LoadIconW(hInstance, name);
+		return LoadIcon32W(hInstance, (LPCWSTR)name);
 	else {
 		LPWSTR uni = STRING32_DupAnsiToUni(name);
-		res = WIN32_LoadIconW(hInstance, uni);
+		res = LoadIcon32W(hInstance, uni);
 		free(uni);
 	}
 	return res;
 }
-	
+
diff --git a/win32/environment.c b/win32/environment.c
index 54267c1..3ea2385 100644
--- a/win32/environment.c
+++ b/win32/environment.c
@@ -25,14 +25,14 @@
     char *cp;
     PDB *pdb = (PDB *)GlobalLock16( GetCurrentPDB() );
 
-#ifndef WINELIB
-    strcpy(buffer, MODULE_GetModuleName( GetExePtr(GetCurrentTask()) ) );
-    cp = buffer+strlen(buffer);
-    *cp++ = ' ';
-#else
-    cp = buffer;
-#endif;
-    memcpy( cp, &pdb->cmdLine[1], pdb->cmdLine[0] );
+    lstrcpyn32A( buffer, MODULE_GetModuleName( GetExePtr(GetCurrentTask()) ),
+                 sizeof(buffer) - 1 );
+    cp = buffer + strlen(buffer);
+    if (pdb->cmdLine[0])
+    {
+        *cp++ = ' ';
+        memcpy( cp, &pdb->cmdLine[1], pdb->cmdLine[0] );
+    }
     dprintf_win32(stddeb,"CommandLine = %s\n", buffer );
     return buffer;
 }
diff --git a/win32/init.c b/win32/init.c
index 0957822..91f0128 100644
--- a/win32/init.c
+++ b/win32/init.c
@@ -63,7 +63,7 @@
 /***********************************************************************
  *              GetModuleFileNameA      (KERNEL32.235)
  */
-DWORD GetModuleFileNameA(HMODULE hModule, LPSTR lpFilename, DWORD nSize)
+DWORD GetModuleFileNameA(HMODULE32 hModule, LPSTR lpFilename, DWORD nSize)
 {
     strcpy(lpFilename, "c:\\dummy");
     return 8;
@@ -72,9 +72,9 @@
 /***********************************************************************
  *              GetModuleHandle         (KERNEL32.237)
  */
-HMODULE WIN32_GetModuleHandle(char *module)
+HMODULE32 WIN32_GetModuleHandle(char *module)
 {
-    HMODULE hModule;
+    HMODULE32 hModule;
 
     dprintf_win32(stddeb, "GetModuleHandle: %s\n", module ? module : "NULL");
 /* Freecell uses the result of GetModuleHandleA(0) as the hInstance in
diff --git a/win32/newfns.c b/win32/newfns.c
index a226e16..805ed2e 100644
--- a/win32/newfns.c
+++ b/win32/newfns.c
@@ -24,7 +24,7 @@
 	return WinHelp(hWnd,lpszHelp,uCommand,dwData);
 }
 
-HHOOK SetWindowsHookEx32A(int HookId, HOOKPROC hookfn, HINSTANCE hModule,
+HHOOK SetWindowsHookEx32A(int HookId, HOOKPROC32 hookfn, HINSTANCE hModule,
 				DWORD ThreadId)
 
 {
diff --git a/win32/process.c b/win32/process.c
index 2a41875..47c2873 100644
--- a/win32/process.c
+++ b/win32/process.c
@@ -135,7 +135,7 @@
 BOOL GetProcessAffinityMask(HANDLE32 hProcess, LPDWORD lpProcessAffinityMask,
   LPDWORD lpSystemAffinityMask)
 {
-	dprintf_task(stddeb,"GetProcessAffinityMask(%x,%x,%x)\n",
+	dprintf_task(stddeb,"GetProcessAffinityMask(%x,%lx,%lx)\n",
 		hProcess,(lpProcessAffinityMask?*lpProcessAffinityMask:0),
 		(lpSystemAffinityMask?*lpSystemAffinityMask:0));
 	/* It is definitely important for a process to know on what processor
@@ -152,7 +152,7 @@
  */
 BOOL SetThreadAffinityMask(HANDLE32 hThread, DWORD dwThreadAffinityMask)
 {
-	dprintf_task(stddeb,"SetThreadAffinityMask(%x,%x)\n",hThread,
+	dprintf_task(stddeb,"SetThreadAffinityMask(%x,%lx)\n",hThread,
 		dwThreadAffinityMask);
 	/* FIXME: We let it fail */
 	return 1;
diff --git a/win32/resource.c b/win32/resource.c
deleted file mode 100644
index 2b852bc..0000000
--- a/win32/resource.c
+++ /dev/null
@@ -1,459 +0,0 @@
-/*
- * Win32 Resources
- *
- * Copyright 1995 Thomas Sandford
- * Copyright 1996 Martin von Loewis
- *
- * Based on the Win16 resource handling code in loader/resource.c
- * Copyright 1993 Robert J. Amstadt
- * Copyright 1995 Alexandre Julliard
- *
- * This is not even at ALPHA level yet. Don't expect it to work!
- */
-
-#include <sys/types.h>
-#include "wintypes.h"
-#include "windows.h"
-#include "kernel32.h"
-#include "pe_image.h"
-#include "module.h"
-#include "handle32.h"
-#include "libres.h"
-#include "resource32.h"
-#include "stackframe.h"
-#include "neexe.h"
-#include "accel.h"
-#include "xmalloc.h"
-#include "string32.h"
-#include "stddebug.h"
-#include "debug.h"
-
-int language = 0x0409;
-
-#define PrintIdA(name) \
-    if (HIWORD((DWORD)name)) \
-        dprintf_resource( stddeb, "'%s'", name); \
-    else \
-        dprintf_resource( stddeb, "#%04x", LOWORD(name)); 
-#define PrintIdW(name)
-#define PrintId(name)
-
-/**********************************************************************
- *	    GetResDirEntryW
- *
- *	Helper function - goes down one level of PE resource tree
- *
- */
-PIMAGE_RESOURCE_DIRECTORY GetResDirEntryW(PIMAGE_RESOURCE_DIRECTORY resdirptr,
-					 LPCWSTR name,
-					 DWORD root)
-{
-    int entrynum;
-    PIMAGE_RESOURCE_DIRECTORY_ENTRY entryTable;
-	int namelen;
-
-    if (HIWORD(name)) {
-    /* FIXME: what about #xxx names? */
-	entryTable = (PIMAGE_RESOURCE_DIRECTORY_ENTRY) (
-			(BYTE *) resdirptr + 
-                        sizeof(IMAGE_RESOURCE_DIRECTORY));
-	namelen = lstrlen32W(name);
-	for (entrynum = 0; entrynum < resdirptr->NumberOfNamedEntries; entrynum++)
-	{
-		PIMAGE_RESOURCE_DIR_STRING_U str =
-		(PIMAGE_RESOURCE_DIR_STRING_U) (root + 
-			(entryTable[entrynum].Name & 0x7fffffff));
-		if(namelen != str->Length)
-			continue;
-		if(lstrncmpi32W(name,str->NameString,str->Length)==0)
-			return (PIMAGE_RESOURCE_DIRECTORY) (
-				root +
-				(entryTable[entrynum].OffsetToData & 0x7fffffff));
-	}
-	return NULL;
-    } else {
-	entryTable = (PIMAGE_RESOURCE_DIRECTORY_ENTRY) (
-			(BYTE *) resdirptr + 
-                        sizeof(IMAGE_RESOURCE_DIRECTORY) +
-			resdirptr->NumberOfNamedEntries * sizeof(IMAGE_RESOURCE_DIRECTORY_ENTRY));
-	for (entrynum = 0; entrynum < resdirptr->NumberOfIdEntries; entrynum++)
-	    if ((DWORD)entryTable[entrynum].Name == (DWORD)name)
-		return (PIMAGE_RESOURCE_DIRECTORY) (
-			root +
-			(entryTable[entrynum].OffsetToData & 0x7fffffff));
-	return NULL;
-    }
-}
-
-/**********************************************************************
- *	    GetResDirEntryA
- *
- *	Helper function - goes down one level of PE resource tree
- *
- */
-PIMAGE_RESOURCE_DIRECTORY GetResDirEntryA(PIMAGE_RESOURCE_DIRECTORY resdirptr,
-					 LPCSTR name,
-					 DWORD root)
-{
-	LPWSTR				xname;
-	PIMAGE_RESOURCE_DIRECTORY	ret;
-
-	if (HIWORD((DWORD)name))
-		xname	= STRING32_DupAnsiToUni(name);
-	else
-		xname	= (LPWSTR)name;
-
-	ret=GetResDirEntryW(resdirptr,xname,root);
-	if (HIWORD((DWORD)name))
-		free(xname);
-	return ret;
-}
-
-/**********************************************************************
- *	    FindResourceA    (KERNEL32.128)
- */
-HANDLE32 FindResource32A( HINSTANCE hModule, LPCSTR name, LPCSTR type ) {
-	LPWSTR		xname,xtype;
-	HANDLE32	ret;
-
-	if (HIWORD((DWORD)name))
-		xname = STRING32_DupAnsiToUni(name);
-	else
-		xname = (LPWSTR)name;
-	if (HIWORD((DWORD)type))
-		xtype = STRING32_DupAnsiToUni(type);
-	else
-		xtype = (LPWSTR)type;
-	ret=FindResource32W(hModule,xname,xtype);
-	if (HIWORD((DWORD)name))
-		free(xname);
-	if (HIWORD((DWORD)type))
-		free(xtype);
-	return ret;
-}
-
-/**********************************************************************
- *	    FindResourceW    (KERNEL32.131)
- */
-HANDLE32 FindResource32W( HINSTANCE hModule, LPCWSTR name, LPCWSTR type )
-{
-#ifndef WINELIB
-    PE_MODULE *pe;
-    NE_MODULE *pModule;
-    PIMAGE_RESOURCE_DIRECTORY resdirptr;
-    DWORD root;
-	HANDLE32 result;
-
-    /* Sometimes we get passed hModule = 0x00000000. FIXME: is GetTaskDS()
-     * ok?
-     */
-    if (!hModule) hModule = GetTaskDS();
-    hModule = GetExePtr( hModule );  /* In case we were passed an hInstance */
-    dprintf_resource(stddeb, "FindResource: module=%08x type=", hModule );
-    PrintId( type );
-    dprintf_resource( stddeb, " name=" );
-    PrintId( name );
-    dprintf_resource( stddeb, "\n" );
-    if (!(pModule = MODULE_GetPtr( hModule ))) return 0;
-    if (!(pModule->flags & NE_FFLAGS_WIN32)) return 0;  /* FIXME? */
-    if (!(pe = pModule->pe_module) || !pe->pe_resource) return 0;
-
-    resdirptr = (PIMAGE_RESOURCE_DIRECTORY) pe->pe_resource;
-    root = (DWORD) resdirptr;
-    if ((resdirptr = GetResDirEntryW(resdirptr, type, root)) == NULL)
-	return 0;
-    if ((resdirptr = GetResDirEntryW(resdirptr, name, root)) == NULL)
-	return 0;
-    result = (HANDLE32)GetResDirEntryW(resdirptr, (LPCWSTR)language, root);
-	/* Try LANG_NEUTRAL, too */
-    if(!result)
-        return (HANDLE32)GetResDirEntryW(resdirptr, (LPCWSTR)0, root);
-    return result;
-    
-#else
-    return LIBRES_FindResource( hModule, name, type );
-#endif
-}
-
-
-/**********************************************************************
- *	    LoadResource    (KERNEL32.370)
- */
-HANDLE32 LoadResource32( HINSTANCE hModule, HANDLE32 hRsrc )
-{
-#ifndef WINELIB
-    NE_MODULE *pModule;
-    PE_MODULE *pe;
-
-    if (!hModule) hModule = GetTaskDS(); /* FIXME: see FindResource32W */
-    hModule = GetExePtr( hModule );  /* In case we were passed an hInstance */
-    dprintf_resource(stddeb, "LoadResource: module=%04x res=%04x\n",
-                     hModule, hRsrc );
-    if (!hRsrc) return 0;
-
-    if (!(pModule = MODULE_GetPtr( hModule ))) return 0;
-    if (!(pModule->flags & NE_FFLAGS_WIN32)) return 0;  /* FIXME? */
-    if (!(pe = pModule->pe_module) || !pe->pe_resource) return 0;
-    return (HANDLE32) (pe->load_addr+((PIMAGE_RESOURCE_DATA_ENTRY)hRsrc)->OffsetToData);
-#else
-    return LIBRES_LoadResource( hModule, hRsrc );
-#endif
-}
-
-
-/**********************************************************************
- *	    LockResource    (KERNEL.62)
- */
-LPVOID LockResource32( HANDLE32 handle )
-{
-	return (LPVOID) handle;
-}
-
-/**********************************************************************
- *	    FreeResource    (KERNEL.63)
- */
-BOOL FreeResource32( HANDLE32 handle )
-{
-    /* no longer used in Win32 */
-    return TRUE;
-}
-
-/**********************************************************************
- *	    AccessResource    (KERNEL.64)
- */
-INT AccessResource32( HINSTANCE hModule, HRSRC hRsrc )
-{
-    hModule = GetExePtr( hModule );  /* In case we were passed an hInstance */
-    dprintf_resource(stddeb, "AccessResource: module=%04x res=%04x\n",
-                     hModule, hRsrc );
-    if (!hRsrc) return 0;
-	fprintf(stderr,"AccessResource32: not implemented\n");
-	return 0;
-}
-
-
-/**********************************************************************
- *	    SizeofResource    (KERNEL.65)
- */
-DWORD SizeofResource32( HINSTANCE hModule, HRSRC hRsrc )
-{
-    hModule = GetExePtr( hModule );  /* In case we were passed an hInstance */
-    dprintf_resource(stddeb, "SizeofResource: module=%04x res=%04x\n",
-                     hModule, hRsrc );
-	fprintf(stderr,"SizeofResource32: not implemented\n");
-	return 0;
-}
-
-/**********************************************************************
- *			LoadAccelerators	[USER.177]
-*/
-HANDLE32 WIN32_LoadAcceleratorsW(HINSTANCE instance, LPCWSTR lpTableName)
-{
-#if 0
-    HANDLE32 	hAccel;
-    HANDLE32 	rsc_mem;
-    HANDLE32 hRsrc;
-    BYTE 	*lp;
-    ACCELHEADER	*lpAccelTbl;
-    int 	i, n;
-
-    if (HIWORD(lpTableName))
-        dprintf_accel( stddeb, "LoadAccelerators: %04x '%s'\n",
-                      instance, (char *)( lpTableName ) );
-    else
-        dprintf_accel( stddeb, "LoadAccelerators: %04x %04x\n",
-                       instance, LOWORD(lpTableName) );
-
-    if (!(hRsrc = FindResource32( instance, lpTableName, 
-		(LPCWSTR)RT_ACCELERATOR )))
-      return 0;
-    if (!(rsc_mem = LoadResource32( instance, hRsrc ))) return 0;
-
-    lp = (BYTE *)LockResource32(rsc_mem);
-    n = SizeofResource( instance, hRsrc ) / sizeof(ACCELENTRY);
-    hAccel = GlobalAlloc16(GMEM_MOVEABLE, 
-    	sizeof(ACCELHEADER) + (n + 1)*sizeof(ACCELENTRY));
-    lpAccelTbl = (LPACCELHEADER)GlobalLock16(hAccel);
-    lpAccelTbl->wCount = 0;
-    for (i = 0; i < n; i++) {
-	lpAccelTbl->tbl[i].type = *(lp++);
-	lpAccelTbl->tbl[i].wEvent = *((WORD *)lp);
-	lp += 2;
-	lpAccelTbl->tbl[i].wIDval = *((WORD *)lp);
-	lp += 2;
-    	if (lpAccelTbl->tbl[i].wEvent == 0) break;
-	dprintf_accel(stddeb,
-		"Accelerator #%u / event=%04X id=%04X type=%02X \n", 
-		i, lpAccelTbl->tbl[i].wEvent, lpAccelTbl->tbl[i].wIDval, 
-		lpAccelTbl->tbl[i].type);
-	lpAccelTbl->wCount++;
- 	}
-    GlobalUnlock16(hAccel);
-    FreeResource( rsc_mem );
-    return hAccel;
-#else
-	fprintf(stderr,"LoadAcceleratorsW: not implemented\n");
-	return 0x100;  /* Return something anyway */
-#endif
-}
-
-HANDLE32 WIN32_LoadAcceleratorsA(HINSTANCE instance, LPCSTR lpTableName)
-{
-	LPWSTR		uni;
-	HANDLE32	result;
-	if (HIWORD(lpTableName))
-		uni=STRING32_DupAnsiToUni(lpTableName);
-	else
-		uni=(LPWSTR)lpTableName;
-	result=WIN32_LoadAcceleratorsW(instance,uni);
-	if (HIWORD(uni))
-		free(uni);
-	return result;
-}
-
-/**********************************************************************
- *					LoadString
- */
-int
-WIN32_LoadStringW(HINSTANCE instance, DWORD resource_id, LPWSTR buffer, int buflen)
-{
-    HANDLE32 hmem, hrsrc;
-    WCHAR *p;
-    int string_num;
-    int i;
-
-    dprintf_resource(stddeb, "LoadString: instance = %04x, id = %04x, buffer = %08x, "
-	   "length = %d\n", instance, (int)resource_id, (int) buffer, buflen);
-
-    hrsrc = FindResource32W( instance, (LPCWSTR)((resource_id>>4)+1), 
-		(LPCWSTR)RT_STRING );
-    if (!hrsrc) return 0;
-    hmem = LoadResource32( instance, hrsrc );
-    if (!hmem) return 0;
-    
-    p = LockResource32(hmem);
-    string_num = resource_id & 0x000f;
-    for (i = 0; i < string_num; i++)
-	p += *p + 1;
-    
-    dprintf_resource( stddeb, "strlen = %d\n", (int)*p );
-    
-    i = MIN(buflen - 1, *p);
-    if (buffer == NULL)
-	return i;
-    if (i > 0) {
-	memcpy(buffer, p + 1, i * sizeof (WCHAR));
-	buffer[i] = (WCHAR) 0;
-    } else {
-	if (buflen > 1) {
-	    buffer[0] = (WCHAR) 0;
-	    return 0;
-	}
-#if 0
-	fprintf(stderr,"LoadString // I dont know why , but caller give buflen=%d *p=%d !\n", buflen, *p);
-	fprintf(stderr,"LoadString // and try to obtain string '%s'\n", p + 1);
-#endif
-    }
-    dprintf_resource(stddeb,"LoadString // '%s' copied !\n", buffer);
-    return i;
-}
-
-/**********************************************************************
- *					LoadStringA
- */
-int
-WIN32_LoadStringA(HINSTANCE instance, DWORD resource_id, LPSTR buffer, int buflen)
-{
-    WCHAR *buffer2 = xmalloc(buflen*2);
-    int retval = WIN32_LoadStringW(instance, resource_id, buffer2, buflen);
-
-    while (*buffer2) 
-	*buffer++ = (char) *buffer2++;
-    *buffer = 0;
-    return retval;
-}
-
-HICON LoadIconW32(HINSTANCE hisnt, LPCWSTR lpszIcon)
-
-{
-	return LoadIcon(0, IDI_APPLICATION);
-}
-
-HICON LoadIconA32(HINSTANCE hinst, LPCSTR lpszIcon)
-
-{
-	return LoadIconW32(hinst, lpszIcon);
-}
-/**********************************************************************
- *	    LoadBitmapW
- */
-HBITMAP WIN32_LoadBitmapW( HANDLE instance, LPCWSTR name )
-{
-    HBITMAP hbitmap = 0;
-    HDC hdc;
-    HANDLE32 hRsrc;
-    HANDLE32 handle;
-    BITMAPINFO *info;
-
-    if (!instance)  /* OEM bitmap */
-    {
-        if (HIWORD((int)name)) return 0;
-        return OBM_LoadBitmap( LOWORD((int)name) );
-    }
-
-    if (!(hRsrc = FindResource32W( instance, name, 
-		(LPWSTR)RT_BITMAP ))) return 0;
-    if (!(handle = LoadResource32( instance, hRsrc ))) return 0;
-
-    info = (BITMAPINFO *)LockResource32( handle );
-    if ((hdc = GetDC(0)) != 0)
-    {
-        char *bits = (char *)info + DIB_BitmapInfoSize( info, DIB_RGB_COLORS );
-        hbitmap = CreateDIBitmap( hdc, &info->bmiHeader, CBM_INIT,
-                                  bits, info, DIB_RGB_COLORS );
-        ReleaseDC( 0, hdc );
-    }
-    return hbitmap;
-}
-/**********************************************************************
- *	    LoadBitmapA
- */
-HBITMAP WIN32_LoadBitmapA( HANDLE instance, LPCSTR name )
-{
-    HBITMAP res;
-    if(!HIWORD(name))
-        res = WIN32_LoadBitmapW(instance,(LPWSTR)name);
-    else{
-        LPWSTR uni=STRING32_DupAnsiToUni(name);
-        res=WIN32_LoadBitmapW(instance,uni);
-        free(uni);
-    }
-    return res;
-}
-
-/*****************************************************************
- *        LoadMenuW                 (USER32.372)
- */
-HMENU WIN32_LoadMenuW(HANDLE instance, LPCWSTR name)
-{
-	HANDLE32 hrsrc;
-	hrsrc=FindResource32W(instance,name,(LPWSTR)RT_MENU);
-	if(!hrsrc)return 0;
-        return LoadMenuIndirect32W( LoadResource32(instance, hrsrc) );
-}
-
-/*****************************************************************
- *        LoadMenuA                 (USER32.370)
- */
-HMENU WIN32_LoadMenuA(HANDLE instance,LPCSTR name)
-{
-	HMENU res;
-	if(!HIWORD(name))
-		res = WIN32_LoadMenuW(instance,(LPWSTR)name);
-	else{
-		LPWSTR uni=STRING32_DupAnsiToUni(name);
-		res=WIN32_LoadMenuW(instance,uni);
-		free(uni);
-	}
-	return res;
-}
diff --git a/win32/struct32.c b/win32/struct32.c
index 15047e9..629a75a 100644
--- a/win32/struct32.c
+++ b/win32/struct32.c
@@ -160,3 +160,29 @@
     to->style          = from->style;
     to->dwExStyle      = from->dwExStyle;
 }
+
+/* The strings are not copied */
+void STRUCT32_MDICREATESTRUCT32Ato16( const MDICREATESTRUCT32A* from,
+                                      MDICREATESTRUCT16* to )
+{
+    to->hOwner = (HINSTANCE16)from->hOwner;
+    to->x      = (INT16)from->x;     
+    to->y      = (INT16)from->y;     
+    to->cx     = (INT16)from->cx;    
+    to->cy     = (INT16)from->cy;    
+    to->style  = from->style; 
+    to->lParam = from->lParam;
+}
+
+void STRUCT32_MDICREATESTRUCT16to32A( const MDICREATESTRUCT16* from,
+                                      MDICREATESTRUCT32A *to )
+{
+    to->hOwner = (HINSTANCE32)from->hOwner;
+    to->x      = (INT32)from->x;     
+    to->y      = (INT32)from->y;     
+    to->cx     = (INT32)from->cx;    
+    to->cy     = (INT32)from->cy;    
+    to->style  = from->style; 
+    to->lParam = from->lParam;
+}
+
diff --git a/win32/thread.c b/win32/thread.c
index 00e5daa..1d539dc 100644
--- a/win32/thread.c
+++ b/win32/thread.c
@@ -70,6 +70,7 @@
 
 /***********************************************************************
  *           Tls is available only for the single thread
+ * (BTW: TLS means Thread Local Storage)
  */
 static LPVOID* Tls=0;
 static int TlsCount=0;
@@ -104,14 +105,15 @@
 	return Tls[index];
 }
 
-void TlsSetValue(DWORD index,LPVOID value)
+BOOL32 TlsSetValue(DWORD index,LPVOID value)
 {
 	if(index>=TlsCount)
 	{
 		/* FIXME: Set last error*/
-		return;
+		return FALSE;
 	}
 	Tls[index]=value;
+	return TRUE;
 }
 
 /* FIXME: This is required to work cross-addres space as well */
diff --git a/win32/time.c b/win32/time.c
index 4756a31..3ac2e9c 100644
--- a/win32/time.c
+++ b/win32/time.c
@@ -134,7 +134,7 @@
  */
 VOID Sleep(DWORD cMilliseconds)
 {
-    if(cMilliseconds == INFINITE)
+    if(cMilliseconds == INFINITE32)
         while(1) sleep(1000); /* Spin forever */
     usleep(cMilliseconds*1000);
 }
diff --git a/win32/user32.c b/win32/user32.c
index 6b1e455..4451e2a 100644
--- a/win32/user32.c
+++ b/win32/user32.c
@@ -16,7 +16,6 @@
 #include "xmalloc.h"
 #include "handle32.h"
 #include "struct32.h"
-#include "resource32.h"
 #include "string32.h"
 #include "win.h"
 #include "debug.h"
diff --git a/windows/Makefile.in b/windows/Makefile.in
index 9cb6607..af47d45 100644
--- a/windows/Makefile.in
+++ b/windows/Makefile.in
@@ -1,3 +1,4 @@
+DEFS   = -D__WINE__
 TOPSRC = @top_srcdir@
 MODULE = windows
 
diff --git a/windows/class.c b/windows/class.c
index ae75f00..80b6cc9 100644
--- a/windows/class.c
+++ b/windows/class.c
@@ -215,13 +215,15 @@
 {
     CLASS * class;
 
+    if (hinstance != 0xffff) hinstance = GetExePtr(hinstance);
+
       /* First search task-specific classes */
 
     for (class = firstClass; (class); class = class->next)
     {
         if (class->style & CS_GLOBALCLASS) continue;
         if ((class->atomName == atom) && 
-            ((hinstance==(HINSTANCE16)0xffff) ||
+            ((hinstance == 0xffff) ||
              (hinstance == class->hInstance))) return class;
     }
     
diff --git a/windows/dce.c b/windows/dce.c
index f334bb9..97fc7f5 100644
--- a/windows/dce.c
+++ b/windows/dce.c
@@ -15,7 +15,6 @@
  * DCX_WINDOWPAINT - BeginPaint specific flag
  */
 
-#include "options.h"
 #include "dce.h"
 #include "class.h"
 #include "win.h"
@@ -118,6 +117,22 @@
  return hdce;
 }
 
+/**********************************************************************
+ *	    DCE_hDC2hWnd
+ */
+HWND DCE_hDC2hWnd(HDC hDC)
+{
+ HANDLE hdce = DCE_FindDCE(hDC); 
+
+ if( hdce )
+   {
+     DCE* dce = (DCE *) USER_HEAP_LIN_ADDR(hdce);
+     return dce->hwndCurrent;
+   }
+
+ return 0;
+}
+
 /***********************************************************************
  *   DCE_InvalidateDCE
  *
@@ -505,7 +520,8 @@
         }
            /* optimize away GetVisRgn for desktop if it isn't there */
 
-      else if( hwnd==GetDesktopWindow() && !Options.desktopGeometry ) 
+      else if ((hwnd == GetDesktopWindow()) &&
+               (rootWindow == DefaultRootWindow(display)))
 	       hrgnVisible = CreateRectRgn( 0, 0, SYSMETRICS_CXSCREEN,
                                                   SYSMETRICS_CYSCREEN);
       else hrgnVisible = DCE_GetVisRgn( hwnd, flags );
@@ -602,6 +618,7 @@
     {
 	SetDCState( dce->hDC, defaultDCstate );
 	dce->DCXflags = DCX_CACHE;
+	dce->hwndCurrent = 0;
     }
     return 1;
 }
diff --git a/windows/defwnd.c b/windows/defwnd.c
index 7d63ce1..87dc7d4 100644
--- a/windows/defwnd.c
+++ b/windows/defwnd.c
@@ -322,7 +322,7 @@
             HICON hI = 0;
             UINT16 len = 1;
             while(len < 64)
-		if( (hI = LoadIcon(wndPtr->hInstance,MAKEINTRESOURCE(len))) )
+		if( (hI = LoadIcon16(wndPtr->hInstance,MAKEINTRESOURCE(len))) )
                     return (LRESULT)hI;
         }
         break;
diff --git a/windows/dialog.c b/windows/dialog.c
index 7e86721..bdd46a3 100644
--- a/windows/dialog.c
+++ b/windows/dialog.c
@@ -12,7 +12,6 @@
 #include "heap.h"
 #include "win.h"
 #include "ldt.h"
-#include "resource32.h"
 #include "stackframe.h"
 #include "string32.h"
 #include "user.h"
@@ -498,7 +497,7 @@
     if (template.menuName)
     {
         LPSTR str = SEGPTR_STRDUP( template.menuName );  /* FIXME: win32 */
-        hMenu = LoadMenu( hInst, SEGPTR_GET(str) );
+        hMenu = LoadMenu16( hInst, SEGPTR_GET(str) );
         SEGPTR_FREE( str );
     }
 
@@ -508,7 +507,7 @@
     {
           /* The font height must be negative as it is a point size */
           /* (see CreateFont() documentation in the Windows SDK).   */
-	hFont = CreateFont( -template.pointSize, 0, 0, 0, FW_DONTCARE,
+	hFont = CreateFont16( -template.pointSize, 0, 0, 0, FW_DONTCARE,
 			    FALSE, FALSE, FALSE, DEFAULT_CHARSET, 0, 0,
 			    DEFAULT_QUALITY, FF_DONTCARE,
                             template.faceName );  /* FIXME: win32 */
@@ -631,12 +630,12 @@
     dprintf_dialog(stddeb, "CreateDialogParam16: %04x,%08lx,%04x,%08lx,%ld\n",
                    hInst, (DWORD)dlgTemplate, owner, (DWORD)dlgProc, param );
 
-    if (!(hRsrc = FindResource( hInst, dlgTemplate, RT_DIALOG ))) return 0;
-    if (!(hmem = LoadResource( hInst, hRsrc ))) return 0;
-    if (!(data = LockResource( hmem ))) hwnd = 0;
+    if (!(hRsrc = FindResource16( hInst, dlgTemplate, RT_DIALOG ))) return 0;
+    if (!(hmem = LoadResource16( hInst, hRsrc ))) return 0;
+    if (!(data = LockResource16( hmem ))) hwnd = 0;
     else hwnd = CreateDialogIndirectParam16( hInst, data, owner,
                                              dlgProc, param );
-    FreeResource( hmem );
+    FreeResource16( hmem );
     return hwnd;
 }
 
@@ -666,7 +665,8 @@
 {
     HANDLE32 hrsrc = FindResource32W( hInst, name, (LPWSTR)RT_DIALOG );
     if (!hrsrc) return 0;
-    return CreateDialogIndirectParam32W( hInst, LoadResource32( hInst, hrsrc ),
+    return CreateDialogIndirectParam32W( hInst,
+                                         (LPVOID)LoadResource32(hInst, hrsrc),
                                          owner, dlgProc, param );
 }
 
diff --git a/windows/event.c b/windows/event.c
index cf14d07..e6a053b 100644
--- a/windows/event.c
+++ b/windows/event.c
@@ -8,6 +8,7 @@
 #include <ctype.h>
 #include <stdlib.h>
 #include <stdio.h>
+#include <string.h>
 #include <unistd.h>
 #include <sys/time.h>
 #include <sys/types.h>
@@ -872,7 +873,7 @@
 /***********************************************************************
  *           GetMouseEventProc   (USER.337)
  */
-FARPROC GetMouseEventProc(void)
+FARPROC16 GetMouseEventProc(void)
 {
     HMODULE16 hmodule = GetModuleHandle("USER");
     return MODULE_GetEntryPoint( hmodule,
diff --git a/windows/focus.c b/windows/focus.c
index f31f73e..1c28025 100644
--- a/windows/focus.c
+++ b/windows/focus.c
@@ -19,6 +19,7 @@
  *               FOCUS_SetXFocus
  *
  * Set the X focus.
+ * Explicit colormap management seems to work only with OLVWM.
  */
 static void FOCUS_SetXFocus( HWND hwnd )
 {
@@ -31,8 +32,8 @@
 
     if (!hwnd)	/* If setting the focus to 0, uninstall the colormap */
     {
-	if (COLOR_WinColormap != DefaultColormapOfScreen(screen))
-	    XUninstallColormap( display, COLOR_WinColormap );
+	if (COLOR_GetSystemPaletteFlags() & COLOR_PRIVATE)
+	    XUninstallColormap( display, COLOR_GetColormap() );
 	return;
     }
 
@@ -42,9 +43,10 @@
     if (!XGetWindowAttributes( display, win, &win_attr ) ||
         (win_attr.map_state != IsViewable))
         return;  /* If window is not viewable, don't change anything */
+
     XSetInputFocus( display, win, RevertToParent, CurrentTime );
-    if (COLOR_WinColormap != DefaultColormapOfScreen(screen))
-	XInstallColormap( display, COLOR_WinColormap );
+    if (COLOR_GetSystemPaletteFlags() & COLOR_PRIVATE)
+        XInstallColormap( display, COLOR_GetColormap() );
 }
 
 /*****************************************************************
diff --git a/windows/graphics.c b/windows/graphics.c
index f1cb9e7..ef7806d 100644
--- a/windows/graphics.c
+++ b/windows/graphics.c
@@ -18,6 +18,7 @@
 #include "metafile.h"
 #include "syscolor.h"
 #include "stddebug.h"
+#include "palette.h"
 #include "color.h"
 #include "region.h"
 #include "debug.h"
@@ -551,7 +552,6 @@
 COLORREF SetPixel( HDC hdc, short x, short y, COLORREF color )
 {
     Pixel pixel;
-    PALETTEENTRY entry;
     
     DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC );
     if (!dc) 
@@ -570,12 +570,9 @@
     XSetFunction( display, dc->u.x.gc, GXcopy );
     XDrawPoint( display, dc->u.x.drawable, dc->u.x.gc, x, y );
 
-    if (screenDepth <= 8)
-    {
-        GetPaletteEntries( dc->w.hPalette, pixel, 1, &entry );
-        return RGB( entry.peRed, entry.peGreen, entry.peBlue );
-    }
-    else return (COLORREF)pixel;
+    /* inefficient but simple... */
+
+    return COLOR_ToLogical(pixel);
 }
 
 
@@ -584,9 +581,7 @@
  */
 COLORREF GetPixel( HDC hdc, short x, short y )
 {
-    PALETTEENTRY entry;
     XImage * image;
-    WORD * mapping;
     int pixel;
 
     DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC );
@@ -605,11 +600,7 @@
     pixel = XGetPixel( image, 0, 0 );
     XDestroyImage( image );
     
-    if (screenDepth > 8) return pixel;
-    mapping = (WORD *) GDI_HEAP_LIN_ADDR( dc->u.x.pal.hRevMapping );
-    if (mapping) pixel = mapping[pixel];
-    GetPaletteEntries( dc->w.hPalette, pixel, 1, &entry );
-    return RGB( entry.peRed, entry.peGreen, entry.peBlue );
+    return COLOR_ToLogical(pixel);
 }
 
 
diff --git a/windows/hook.c b/windows/hook.c
index 9ea7c9e..aa616c5 100644
--- a/windows/hook.c
+++ b/windows/hook.c
@@ -10,10 +10,10 @@
  * Warning!
  * A HHOOK is a 32-bit handle for compatibility with Windows 3.0 where it was
  * a pointer to the next function. Now it is in fact composed of a USER heap
- * handle in the low 16 bits and of a HOOK_MAGIC value in the high 16 bits
- * (except for WINELIB32 where it is a 32-bit handle).  -- AJ
+ * handle in the low 16 bits and of a HOOK_MAGIC value in the high 16 bits.
  */
 
+#define NO_TRANSITION_TYPES  /* This file is Win32-clean */
 #include "hook.h"
 #include "queue.h"
 #include "user.h"
@@ -29,7 +29,7 @@
  *
  * Get the next hook of a given hook.
  */
-static HANDLE HOOK_GetNextHook( HANDLE hook )
+static HANDLE16 HOOK_GetNextHook( HANDLE16 hook )
 {
     HOOKDATA *data = (HOOKDATA *)USER_HEAP_LIN_ADDR( hook );
     if (!data || !hook) return 0;
@@ -45,10 +45,10 @@
  *
  * Get the first hook for a given type.
  */
-HANDLE HOOK_GetHook( short id , HQUEUE hQueue )
+HANDLE16 HOOK_GetHook( INT16 id , HQUEUE16 hQueue )
 {
     MESSAGEQUEUE *queue;
-    HANDLE hook = 0;
+    HANDLE16 hook = 0;
 
     if ((queue = (MESSAGEQUEUE *)GlobalLock16( GetTaskQueue(hQueue) )) != NULL)
         hook = queue->hooks[id - WH_FIRST_HOOK];
@@ -62,17 +62,18 @@
  *
  * Install a given hook.
  */
-HANDLE HOOK_SetHook( short id, HOOKPROC proc, HINSTANCE hInst, HTASK hTask )
+static HANDLE16 HOOK_SetHook( INT16 id, HOOKPROC16 proc, HINSTANCE16 hInst,
+                              HTASK16 hTask )
 {
     HOOKDATA *data;
-    HANDLE handle;
-    HQUEUE hQueue = 0;
+    HANDLE16 handle;
+    HQUEUE16 hQueue = 0;
 
     if ((id < WH_FIRST_HOOK) || (id > WH_LAST_HOOK)) return 0;
     if (!(hInst = GetExePtr( hInst ))) return 0;
 
-    dprintf_hook( stddeb, "Setting hook %d: %08lx %04x %04x\n",
-                  id, (DWORD)proc, hInst, hTask );
+    dprintf_hook( stddeb, "Setting hook %d: %08x %04x %04x\n",
+                  id, (UINT32)proc, hInst, hTask );
 
     if (hTask)  /* Task-specific hook */
     {
@@ -90,7 +91,7 @@
 
     /* Create the hook structure */
 
-    if (!(handle = (HANDLE)USER_HEAP_ALLOC( sizeof(HOOKDATA) ))) return 0;
+    if (!(handle = USER_HEAP_ALLOC( sizeof(HOOKDATA) ))) return 0;
     data = (HOOKDATA *) USER_HEAP_LIN_ADDR( handle );
     data->proc        = proc;
     data->id          = id;
@@ -121,7 +122,7 @@
  *
  * Remove a hook from the list.
  */
-static BOOL HOOK_RemoveHook( HANDLE hook )
+static BOOL32 HOOK_RemoveHook( HANDLE16 hook )
 {
     HOOKDATA *data;
     HANDLE16 *prevHook;
@@ -133,7 +134,7 @@
     {
         /* Mark it for deletion later on */
         dprintf_hook( stddeb, "Hook still running, deletion delayed\n" );
-        data->proc = (FARPROC)0;
+        data->proc = (HOOKPROC16)0;
         return TRUE;
     }
 
@@ -162,13 +163,13 @@
  *
  * Call a hook procedure.
  */
-static DWORD HOOK_CallHook( HANDLE hook, short code,
-                            WPARAM wParam, LPARAM lParam )
+static LRESULT HOOK_CallHook( HANDLE16 hook, INT16 code,
+                              WPARAM16 wParam, LPARAM lParam )
 {
     HOOKDATA *data;
     MESSAGEQUEUE *queue;
-    HANDLE prevHook;
-    DWORD ret;
+    HANDLE16 prevHook;
+    LRESULT ret;
 
     /* Find the first hook with a valid proc */
 
@@ -204,9 +205,9 @@
  *
  * Call a hook chain.
  */
-DWORD HOOK_CallHooks( short id, short code, WPARAM wParam, LPARAM lParam )
+LRESULT HOOK_CallHooks( INT16 id, INT16 code, WPARAM16 wParam, LPARAM lParam )
 {
-    HANDLE hook = HOOK_GetHook( id , 0 );
+    HANDLE16 hook = HOOK_GetHook( id , 0 );
     if (!hook) return 0;
     return HOOK_CallHook( hook, code, wParam, lParam );
 }
@@ -273,35 +274,31 @@
 /***********************************************************************
  *           SetWindowsHook   (USER.121)
  */
-FARPROC SetWindowsHook( short id, HOOKPROC proc )
+FARPROC16 SetWindowsHook( INT16 id, HOOKPROC16 proc )
 {
 #ifdef WINELIB
-    HINSTANCE hInst = 0;
+    HINSTANCE16 hInst = 0;
 #else
-    HINSTANCE hInst = FarGetOwner( HIWORD(proc) );
+    HINSTANCE16 hInst = FarGetOwner( HIWORD(proc) );
 #endif
     /* WH_MSGFILTER is the only task-specific hook for SetWindowsHook() */
-    HTASK hTask = (id == WH_MSGFILTER) ? GetCurrentTask() : 0;
+    HTASK16 hTask = (id == WH_MSGFILTER) ? GetCurrentTask() : 0;
 
-    HANDLE handle = HOOK_SetHook( id, proc, hInst, hTask );
-    if (!handle) return (FARPROC)-1;
+    HANDLE16 handle = HOOK_SetHook( id, proc, hInst, hTask );
+    if (!handle) return (FARPROC16)-1;
     if (!((HOOKDATA *)USER_HEAP_LIN_ADDR( handle ))->next) return 0;
     /* Not sure if the return value is correct; should not matter much
      * since it's never used (see DefHookProc). -- AJ */
-#ifdef WINELIB32
-    return (FARPROC)handle;
-#else
-    return (FARPROC)MAKELONG( handle, HOOK_MAGIC );
-#endif
+    return (FARPROC16)MAKELONG( handle, HOOK_MAGIC );
 }
 
 
 /***********************************************************************
  *           UnhookWindowsHook   (USER.234)
  */
-BOOL UnhookWindowsHook( short id, HOOKPROC proc )
+BOOL16 UnhookWindowsHook( INT16 id, HOOKPROC16 proc )
 {
-    HANDLE hook = HOOK_GetHook( id , 0 );
+    HANDLE16 hook = HOOK_GetHook( id , 0 );
 
     dprintf_hook( stddeb, "UnhookWindowsHook: %d %08lx\n", id, (DWORD)proc );
 
@@ -319,12 +316,12 @@
 /***********************************************************************
  *           DefHookProc   (USER.235)
  */
-DWORD DefHookProc( short code, WORD wParam, DWORD lParam, HHOOK *hhook )
+LRESULT DefHookProc( INT16 code, WPARAM16 wParam, LPARAM lParam, HHOOK *hhook )
 {
     /* Note: the *hhook parameter is never used, since we rely on the
      * current hook value from the task queue to find the next hook. */
     MESSAGEQUEUE *queue;
-    HANDLE next;
+    HANDLE16 next;
 
     if (!(queue = (MESSAGEQUEUE *)GlobalLock16( GetTaskQueue(0) ))) return 0;
     if (!(next = HOOK_GetNextHook( queue->hCurHook ))) return 0;
@@ -335,9 +332,9 @@
 /***********************************************************************
  *           CallMsgFilter   (USER.123)
  */
-BOOL CallMsgFilter( SEGPTR msg, INT code )
+BOOL16 CallMsgFilter( SEGPTR msg, INT16 code )
 {
-    if (GetSysModalWindow()) return FALSE;
+    if (GetSysModalWindow16()) return FALSE;
     if (HOOK_CallHooks( WH_SYSMSGFILTER, code, 0, (LPARAM)msg )) return TRUE;
     return HOOK_CallHooks( WH_MSGFILTER, code, 0, (LPARAM)msg );
 }
@@ -346,42 +343,31 @@
 /***********************************************************************
  *           SetWindowsHookEx   (USER.291)
  */
-HHOOK SetWindowsHookEx( short id, HOOKPROC proc, HINSTANCE hInst, HTASK hTask )
+HHOOK SetWindowsHookEx( INT16 id, HOOKPROC16 proc, HINSTANCE16 hInst,
+                        HTASK16 hTask )
 {
-    HANDLE handle = HOOK_SetHook( id, proc, hInst, hTask );
-#ifdef WINELIB32
-    return (HHOOK)handle;
-#else
+    HANDLE16 handle = HOOK_SetHook( id, proc, hInst, hTask );
     return MAKELONG( handle, HOOK_MAGIC );
-#endif
 }
 
 
 /***********************************************************************
  *           UnhookWindowHookEx   (USER.292)
  */
-BOOL UnhookWindowsHookEx( HHOOK hhook )
+BOOL16 UnhookWindowsHookEx( HHOOK hhook )
 {
-#ifdef WINELIB32
-    return HOOK_RemoveHook( (HANDLE)hhook );
-#else
     if (HIWORD(hhook) != HOOK_MAGIC) return FALSE;  /* Not a new format hook */
     return HOOK_RemoveHook( LOWORD(hhook) );
-#endif
 }
 
 
 /***********************************************************************
  *           CallNextHookEx   (USER.293)
  */
-LRESULT CallNextHookEx( HHOOK hhook, INT code, WPARAM wParam, LPARAM lParam )
+LRESULT CallNextHookEx(HHOOK hhook, INT16 code, WPARAM16 wParam, LPARAM lParam)
 {
-    HANDLE next;
-#ifdef WINELIB32
-    if (!(next = HOOK_GetNextHook( (HANDLE)hhook ))) return 0;
-#else
+    HANDLE16 next;
     if (HIWORD(hhook) != HOOK_MAGIC) return 0;  /* Not a new format hook */
     if (!(next = HOOK_GetNextHook( LOWORD(hhook) ))) return 0;
-#endif
     return HOOK_CallHook( next, code, wParam, lParam );
 }
diff --git a/windows/mdi.c b/windows/mdi.c
index 01b0fcf..5f53691 100644
--- a/windows/mdi.c
+++ b/windows/mdi.c
@@ -354,16 +354,31 @@
                   WS_CLIPCHILDREN | WS_DISABLED | WS_VSCROLL | WS_HSCROLL );
         style |= (WS_VISIBLE | WS_OVERLAPPEDWINDOW);
       }
- 
+
     hwnd = CreateWindow16( (LPCSTR)PTR_SEG_TO_LIN(cs->szClass),
                            (LPCSTR)PTR_SEG_TO_LIN(cs->szTitle), style, 
 			  cs->x, cs->y, cs->cx, cs->cy, parent, 
                          (HMENU)(DWORD)(WORD)wIDmenu, w->hInstance, 
 			 (LPVOID)lParam);
 
+    /* MDI windows are WS_CHILD so they won't be activated by CreateWindow */
+
     if (hwnd)
     {
+	WND* wnd = WIN_FindWndPtr( hwnd );
+
 	MDI_MenuModifyItem(w ,hwnd); 
+	if( wnd->dwStyle & WS_MINIMIZE && ci->hwndActiveChild )
+	    ShowWindow( hwnd, SW_SHOWMINNOACTIVE );
+	else
+	  {
+	    SetWindowPos( hwnd, 0, 0, 0, 0, 0, SWP_SHOWWINDOW | SWP_NOSIZE | SWP_NOMOVE );
+	    if( wnd->dwStyle & WS_MAXIMIZE )
+	      {
+                MDI_AugmentFrameMenu( ci, w->parent, hwnd );
+                MDI_UpdateFrameText( w->parent, ci->self, MDI_REPAINTFRAME, NULL ); 
+	      }
+	  }
         dprintf_mdi(stddeb, "MDICreateChild: created child - %04x\n",hwnd);
     }
     else
@@ -517,13 +532,15 @@
     if( wndPrev )
     {
 	SendMessage16( prevActiveWnd, WM_NCACTIVATE, FALSE, 0L );
+
 #ifdef WINELIB32
         SendMessage32A( prevActiveWnd, WM_MDIACTIVATE, (WPARAM)prevActiveWnd, 
                         (LPARAM)hWndChild);
-#else
+#else 
+
         SendMessage16( prevActiveWnd, WM_MDIACTIVATE, FALSE,
                        MAKELONG(hWndChild,prevActiveWnd));
-#endif
+#endif 
         /* uncheck menu item */
        	if( clientInfo->hWindowMenu )
        	        CheckMenuItem( clientInfo->hWindowMenu,
@@ -575,7 +592,7 @@
                     (LPARAM)prevActiveWnd );
 #else
     SendMessage16( hWndChild, WM_MDIACTIVATE, TRUE,
-                   MAKELONG(prevActiveWnd,hWndChild) );
+                   MAKELONG(hWndChild,prevActiveWnd));
 #endif
 
     return 1;
@@ -641,8 +658,8 @@
 {
  HDC 		hDCSrc  = CreateCompatibleDC(0);
  HDC		hDCDest	= CreateCompatibleDC(hDCSrc);
- HBITMAP	hbClose = LoadBitmap(0, MAKEINTRESOURCE(OBM_CLOSE) );
- HBITMAP	hbCopy,hb_src,hb_dest;
+ HBITMAP16	hbClose = LoadBitmap16(0, MAKEINTRESOURCE(OBM_CLOSE) );
+ HBITMAP16	hbCopy,hb_src,hb_dest;
 
  hb_src = SelectObject(hDCSrc,hbClose);
  hbCopy = CreateCompatibleBitmap(hDCSrc,SYSMETRICS_CXSIZE, SYSMETRICS_CYSIZE);
@@ -984,7 +1001,7 @@
 	if (!hBmpClose)
         {
             hBmpClose = CreateMDIMenuBitmap();
-            hBmpRestore = LoadBitmap( 0, MAKEINTRESOURCE(OBM_RESTORE) );
+            hBmpRestore = LoadBitmap16( 0, MAKEINTRESOURCE(OBM_RESTORE) );
         }
 	MDI_UpdateFrameText(frameWnd, hwnd, MDI_NOFRAMEREPAINT,frameWnd->text);
 
@@ -1371,6 +1388,8 @@
 	       SendMessage16( hMaxChild, WM_SETREDRAW, TRUE, 0L );
 	      }
 
+	    dprintf_mdi(stddeb,"\tMDI: maximizing child %04x\n", hwnd );
+
 	    ci->hwndChildMaximized = hwnd; /* !!! */
 
 	    MDI_AugmentFrameMenu( ci, clientWnd->parent, hwnd);
diff --git a/windows/msgbox.c b/windows/msgbox.c
index ca18764..bc73985 100644
--- a/windows/msgbox.c
+++ b/windows/msgbox.c
@@ -65,20 +65,20 @@
     switch(lpmb->type & MB_ICONMASK) {
      case MB_ICONEXCLAMATION:
       SendDlgItemMessage16(hwnd, stc1, STM_SETICON, 
-                           (WPARAM)LoadIcon(0, IDI_EXCLAMATION), 0);
+                           (WPARAM)LoadIcon16(0, IDI_EXCLAMATION), 0);
       break;
      case MB_ICONQUESTION:
       SendDlgItemMessage16(hwnd, stc1, STM_SETICON, 
-                           (WPARAM)LoadIcon(0, IDI_QUESTION), 0);
+                           (WPARAM)LoadIcon16(0, IDI_QUESTION), 0);
       break;
      case MB_ICONASTERISK:
       SendDlgItemMessage16(hwnd, stc1, STM_SETICON, 
-                           (WPARAM)LoadIcon(0, IDI_ASTERISK), 0);
+                           (WPARAM)LoadIcon16(0, IDI_ASTERISK), 0);
       break;
      case MB_ICONHAND:
      default:
       SendDlgItemMessage16(hwnd, stc1, STM_SETICON, 
-                           (WPARAM)LoadIcon(0, IDI_HAND), 0);
+                           (WPARAM)LoadIcon16(0, IDI_HAND), 0);
       break;
     }
     
diff --git a/windows/nonclient.c b/windows/nonclient.c
index 4d4751d..0846325 100644
--- a/windows/nonclient.c
+++ b/windows/nonclient.c
@@ -589,14 +589,14 @@
 
     if (!hbitmapClose)
     {
-	if (!(hbitmapClose = LoadBitmap( 0, MAKEINTRESOURCE(OBM_CLOSE) )))
+	if (!(hbitmapClose = LoadBitmap16( 0, MAKEINTRESOURCE(OBM_CLOSE) )))
 	    return;
-	hbitmapMinimize  = LoadBitmap( 0, MAKEINTRESOURCE(OBM_REDUCE) );
-	hbitmapMinimizeD = LoadBitmap( 0, MAKEINTRESOURCE(OBM_REDUCED) );
-	hbitmapMaximize  = LoadBitmap( 0, MAKEINTRESOURCE(OBM_ZOOM) );
-	hbitmapMaximizeD = LoadBitmap( 0, MAKEINTRESOURCE(OBM_ZOOMD) );
-	hbitmapRestore   = LoadBitmap( 0, MAKEINTRESOURCE(OBM_RESTORE) );
-	hbitmapRestoreD  = LoadBitmap( 0, MAKEINTRESOURCE(OBM_RESTORED) );
+	hbitmapMinimize  = LoadBitmap16( 0, MAKEINTRESOURCE(OBM_REDUCE) );
+	hbitmapMinimizeD = LoadBitmap16( 0, MAKEINTRESOURCE(OBM_REDUCED) );
+	hbitmapMaximize  = LoadBitmap16( 0, MAKEINTRESOURCE(OBM_ZOOM) );
+	hbitmapMaximizeD = LoadBitmap16( 0, MAKEINTRESOURCE(OBM_ZOOMD) );
+	hbitmapRestore   = LoadBitmap16( 0, MAKEINTRESOURCE(OBM_RESTORE) );
+	hbitmapRestoreD  = LoadBitmap16( 0, MAKEINTRESOURCE(OBM_RESTORED) );
     }
     
     if (wndPtr->dwExStyle & WS_EX_DLGMODALFRAME)
@@ -822,23 +822,23 @@
 
     case HTLEFT:
     case HTRIGHT:
-	return (LONG)SetCursor( LoadCursor( 0, IDC_SIZEWE ) );
+	return (LONG)SetCursor( LoadCursor16( 0, IDC_SIZEWE ) );
 
     case HTTOP:
     case HTBOTTOM:
-	return (LONG)SetCursor( LoadCursor( 0, IDC_SIZENS ) );
+	return (LONG)SetCursor( LoadCursor16( 0, IDC_SIZENS ) );
 
     case HTTOPLEFT:
     case HTBOTTOMRIGHT:	
-	return (LONG)SetCursor( LoadCursor( 0, IDC_SIZENWSE ) );
+	return (LONG)SetCursor( LoadCursor16( 0, IDC_SIZENWSE ) );
 
     case HTTOPRIGHT:
     case HTBOTTOMLEFT:
-	return (LONG)SetCursor( LoadCursor( 0, IDC_SIZENESW ) );
+	return (LONG)SetCursor( LoadCursor16( 0, IDC_SIZENESW ) );
     }
 
     /* Default cursor: arrow */
-    return (LONG)SetCursor( LoadCursor( 0, IDC_ARROW ) );
+    return (LONG)SetCursor( LoadCursor16( 0, IDC_ARROW ) );
 }
 
 
diff --git a/windows/queue.c b/windows/queue.c
index 85ebc17..1d3437e 100644
--- a/windows/queue.c
+++ b/windows/queue.c
@@ -14,11 +14,11 @@
 
 #define MAX_QUEUE_SIZE   120  /* Max. size of a message queue */
 
-static HQUEUE hFirstQueue = 0;
-static HQUEUE hmemSysMsgQueue = 0;
+static HQUEUE16 hFirstQueue = 0;
+static HQUEUE16 hmemSysMsgQueue = 0;
 static MESSAGEQUEUE *pMouseQueue = NULL;  /* Queue for last mouse message */
 static MESSAGEQUEUE *pKbdQueue = NULL;    /* Queue for last kbd message */
-static HQUEUE hDoomedQueue = 0;
+static HQUEUE16 hDoomedQueue = 0;
 static MESSAGEQUEUE *sysMsgQueue = NULL;
 
 /***********************************************************************
@@ -130,7 +130,7 @@
 BOOL32 QUEUE_DeleteMsgQueue( HQUEUE16 hQueue )
 {
     MESSAGEQUEUE * msgQueue = (MESSAGEQUEUE*)GlobalLock16(hQueue);
-    HQUEUE *pPrev;
+    HQUEUE16 *pPrev;
 
     dprintf_msg(stddeb,"Deleting message queue %04x\n", hQueue);
 
@@ -401,7 +401,7 @@
     if ((message >= WM_KEYFIRST) && (message <= WM_KEYLAST)) wakeBit = QS_KEY;
     else wakeBit = (message == WM_MOUSEMOVE) ? QS_MOUSEMOVE : QS_MOUSEBUTTON;
 
-    if (!(hwnd = GetSysModalWindow()))
+    if (!(hwnd = GetSysModalWindow16()))
     {
         if (wakeBit == QS_KEY)
         {
diff --git a/windows/win.c b/windows/win.c
index 83a8c36..25ccc7f 100644
--- a/windows/win.c
+++ b/windows/win.c
@@ -7,6 +7,7 @@
 #include <stdlib.h>
 #include <stdio.h>
 #include <string.h>
+#include <X11/Xatom.h>
 
 #include "options.h"
 #include "class.h"
@@ -601,7 +602,7 @@
 	                          FocusChangeMask;
             win_attr.override_redirect = TRUE;
 	}
-        win_attr.colormap      = COLOR_WinColormap;
+        win_attr.colormap      = COLOR_GetColormap();
         win_attr.backing_store = Options.backingstore ? WhenMapped : NotUseful;
         win_attr.save_under    = ((classPtr->style & CS_SAVEBITS) != 0);
         win_attr.cursor        = CURSORICON_XCursor;
@@ -614,6 +615,23 @@
 	XA_WM_DELETE_WINDOW = XInternAtom( display, "WM_DELETE_WINDOW",
 					   False );
 	XSetWMProtocols( display, wndPtr->window, &XA_WM_DELETE_WINDOW, 1 );
+
+        if ((wndPtr->flags & WIN_MANAGED) &&
+            (cs->dwExStyle & WS_EX_DLGMODALFRAME))
+        {
+            XSizeHints* size_hints = XAllocSizeHints();
+
+            if (size_hints)
+            {
+                size_hints->min_width = size_hints->max_width = cs->cx;
+                size_hints->min_height = size_hints->max_height = cs->cy;
+                size_hints->flags = (PSize | PMinSize | PMaxSize);
+                XSetWMSizeHints( display, wndPtr->window, size_hints,
+                                 XA_WM_NORMAL_HINTS );
+                XFree(size_hints);
+            }
+        }
+
 	if (cs->hwndParent)  /* Get window owner */
 	{
             Window win = WIN_GetXWindow( cs->hwndParent );
@@ -636,7 +654,7 @@
                        LoadMenu(cs->hInstance,(SEGPTR)classPtr->menuNameA);
 #else
             SEGPTR menuName = (SEGPTR)GetClassLong16( hwnd, GCL_MENUNAME );
-            if (menuName) cs->hMenu = LoadMenu( cs->hInstance, menuName );
+            if (menuName) cs->hMenu = LoadMenu16( cs->hInstance, menuName );
 #endif
         }
         if (cs->hMenu) SetMenu( hwnd, cs->hMenu );
@@ -1892,9 +1910,9 @@
 
 
 /*******************************************************************
- *			SetSysModalWindow		[USER.188]
+ *           SetSysModalWindow16   (USER.188)
  */
-HWND SetSysModalWindow(HWND hWnd)
+HWND16 SetSysModalWindow16( HWND16 hWnd )
 {
     HWND hWndOldModal = hwndSysModal;
     hwndSysModal = hWnd;
@@ -1904,13 +1922,14 @@
 
 
 /*******************************************************************
- *			GetSysModalWindow		[USER.189]
+ *           GetSysModalWindow16   (USER.52)
  */
-HWND GetSysModalWindow(void)
+HWND16 GetSysModalWindow16(void)
 {
     return hwndSysModal;
 }
 
+
 /*******************************************************************
  *			DRAG_QueryUpdate
  *
@@ -2046,7 +2065,7 @@
 
  if( !lpDragInfo || !spDragInfo ) return 0L;
 
- hBummer = LoadCursor(0,IDC_BUMMER);
+ hBummer = LoadCursor16(0,IDC_BUMMER);
 
  if( !hBummer || !wndPtr )
    {
diff --git a/windows/winpos.c b/windows/winpos.c
index fcf56ba..db6e82b 100644
--- a/windows/winpos.c
+++ b/windows/winpos.c
@@ -5,6 +5,9 @@
  *                       1995,1996 Alex Korobka
  */
 
+#include <X11/Xlib.h>
+#include <X11/Xutil.h>
+#include <X11/Xatom.h>
 #include "sysmetrics.h"
 #include "heap.h"
 #include "module.h"
@@ -14,6 +17,7 @@
 #include "message.h"
 #include "queue.h"
 #include "stackframe.h"
+#include "options.h"
 #include "winpos.h"
 #include "dce.h"
 #include "nonclient.h"
@@ -21,7 +25,12 @@
 /* #define DEBUG_WIN */
 #include "debug.h"
 
-#define  SWP_NOPOSCHANGE	(SWP_NOSIZE | SWP_NOMOVE | SWP_NOCLIENTSIZE | SWP_NOCLIENTMOVE)
+#define  SWP_AGG_NOGEOMETRYCHANGE \
+    (SWP_NOSIZE | SWP_NOMOVE | SWP_NOCLIENTSIZE | SWP_NOCLIENTMOVE)
+#define  SWP_AGG_NOPOSCHANGE \
+    (SWP_AGG_NOGEOMETRYCHANGE | SWP_NOZORDER)
+#define  SWP_AGG_STATUSFLAGS \
+    (SWP_AGG_NOPOSCHANGE | SWP_FRAMECHANGED | SWP_HIDEWINDOW | SWP_SHOWWINDOW)
 
 /* ----- external functions ----- */
 
@@ -520,7 +529,7 @@
 BOOL ShowWindow( HWND hwnd, int cmd ) 
 {    
     WND * wndPtr = WIN_FindWndPtr( hwnd );
-    BOOL wasVisible;
+    BOOL32 wasVisible, showFlag;
     POINT16 maxSize;
     int swpflags = 0;
     short x = 0, y = 0, cx = 0, cy = 0;
@@ -585,7 +594,7 @@
 		if( wndPtr->dwStyle & WS_MINIMIZE )
 		    if( !SendMessage16( hwnd, WM_QUERYOPEN, 0, 0L ) )
 			{
-		         swpflags |= SWP_NOSIZE;
+		         swpflags |= SWP_NOSIZE | SWP_NOMOVE;
 			 break;
 			}
 
@@ -617,7 +626,7 @@
             {
                 if( !SendMessage16( hwnd, WM_QUERYOPEN, 0, 0L) )
                   {
-                    swpflags |= SWP_NOSIZE;
+                    swpflags |= SWP_NOSIZE | SWP_NOMOVE;
                     break;
                   }
                 wndPtr->ptIconPos.x = wndPtr->rectWindow.left;
@@ -656,13 +665,21 @@
 	    break;
     }
 
+    showFlag = (cmd != SW_HIDE);
+    if (showFlag != wasVisible)
+    {
+        SendMessage16( hwnd, WM_SHOWWINDOW, showFlag, 0 );
+        if (!IsWindow( hwnd )) return wasVisible;
+    }
+
     /* We can't activate a child window */
     if (wndPtr->dwStyle & WS_CHILD) swpflags |= SWP_NOACTIVATE | SWP_NOZORDER;
-    SendMessage16( hwnd, WM_SHOWWINDOW, (cmd != SW_HIDE), 0 );
     SetWindowPos( hwnd, HWND_TOP, x, y, cx, cy, swpflags );
+    if (!IsWindow( hwnd )) return wasVisible;
 
     if (wndPtr->flags & WIN_NEED_SIZE)
     {
+        /* should happen only in CreateWindowEx() */
 	int wParam = SIZE_RESTORED;
 
 	wndPtr->flags &= ~WIN_NEED_SIZE;
@@ -873,7 +890,7 @@
     {
         if (!SendMessage16( hwndPrevActive, WM_NCACTIVATE, FALSE, 0 ))
         {
-	    if (GetSysModalWindow() != hWnd) return 0;
+	    if (GetSysModalWindow16() != hWnd) return 0;
 	    /* disregard refusal if hWnd is sysmodal */
         }
 
@@ -1364,6 +1381,46 @@
  DeleteObject(newVisRgn);
 }
 
+
+/***********************************************************************
+ *           WINPOS_ForceXWindowRaise
+ */
+void WINPOS_ForceXWindowRaise( WND* pWnd )
+{
+    XWindowChanges winChanges;
+    WND *wndStop, *wndLast;
+
+    if (!pWnd->window) return;
+        
+    wndLast = wndStop = pWnd;
+    winChanges.stack_mode = Above;
+    XReconfigureWMWindow( display, pWnd->window, 0, CWStackMode, &winChanges );
+
+    /* Recursively raise owned popups according to their z-order 
+     * (it would be easier with sibling-related Below but it doesn't
+     * work very well with SGI mwm for instance)
+     */
+    while (wndLast)
+    {
+        WND *wnd = WIN_GetDesktop()->child;
+        wndLast = NULL;
+        while (wnd != wndStop)
+        {
+            if (wnd->owner == pWnd &&
+                (wnd->dwStyle & WS_POPUP) &&
+                (wnd->dwStyle & WS_VISIBLE))
+                wndLast = wnd;
+            wnd = wnd->next;
+        }
+        if (wndLast)
+        {
+            WINPOS_ForceXWindowRaise( wndLast );
+            wndStop = wndLast;
+        }
+    }
+}
+
+
 /***********************************************************************
  *           WINPOS_SetXWindowPos
  *
@@ -1380,6 +1437,27 @@
         winChanges.width     = winpos->cx;
         winChanges.height    = winpos->cy;
         changeMask |= CWWidth | CWHeight;
+
+        /* Tweak dialog window size hints */
+
+        if ((wndPtr->flags & WIN_MANAGED) &&
+            (wndPtr->dwExStyle & WS_EX_DLGMODALFRAME))
+        {
+            XSizeHints *size_hints = XAllocSizeHints();
+
+            if (size_hints)
+            {
+                long supplied_return;
+
+                XGetWMSizeHints( display, wndPtr->window, size_hints,
+                                 &supplied_return, XA_WM_NORMAL_HINTS);
+                size_hints->min_width = size_hints->max_width = winpos->cx;
+                size_hints->min_height = size_hints->max_height = winpos->cy;
+                XSetWMSizeHints( display, wndPtr->window, size_hints,
+                                 XA_WM_NORMAL_HINTS );
+                XFree(size_hints);
+            }
+        }
     }
     if (!(winpos->flags & SWP_NOMOVE))
     {
@@ -1400,8 +1478,11 @@
         }
         changeMask |= CWStackMode;
     }
-    if (changeMask)
-        XConfigureWindow( display, wndPtr->window, changeMask, &winChanges );
+    if (!changeMask) return;
+    if (wndPtr->flags & WIN_MANAGED)
+        XReconfigureWMWindow( display, wndPtr->window, 0,
+                              changeMask, &winChanges );
+    else XConfigureWindow( display, wndPtr->window, changeMask, &winChanges );
 }
 
 
@@ -1417,17 +1498,24 @@
     HRGN	visRgn = 0;
     int 	result = 0;
 
-    dprintf_win(stddeb,"SetWindowPos: hwnd %04x, flags %08x\n", hwnd, flags);  
-
+    dprintf_win(stddeb,"SetWindowPos: hwnd %04x, (%i,%i)-(%i,%i) flags %08x\n", 
+						 hwnd, x, y, x+cx, y+cy, flags);  
       /* Check window handle */
 
     if (hwnd == GetDesktopWindow()) return FALSE;
     if (!(wndPtr = WIN_FindWndPtr( hwnd ))) return FALSE;
 
-    /* Check for windows that may not be resized 
-       FIXME: this should be done only for Windows 3.0 programs */
-    if (flags ==(SWP_SHOWWINDOW) || flags ==(SWP_HIDEWINDOW ) )
-       flags |= SWP_NOSIZE | SWP_NOMOVE;
+    if (wndPtr->dwStyle & WS_VISIBLE) flags &= ~SWP_SHOWWINDOW;
+    else
+    {
+	flags &= ~SWP_HIDEWINDOW;
+	if (!(flags & SWP_SHOWWINDOW)) flags |= SWP_NOREDRAW;
+    }
+
+/*     Check for windows that may not be resized 
+       FIXME: this should be done only for Windows 3.0 programs 
+ */    if (flags & (SWP_SHOWWINDOW | SWP_HIDEWINDOW ) )
+           flags |= SWP_NOSIZE | SWP_NOMOVE;
 
       /* Check dimensions */
 
@@ -1631,7 +1719,7 @@
 	    BOOL bNoCopy = (flags & SWP_NOCOPYBITS) || 
 			   (result >= WVR_HREDRAW && result < WVR_VALIDRECTS);
 
-	    if( (winpos.flags & SWP_NOPOSCHANGE) != SWP_NOPOSCHANGE )
+	    if( (winpos.flags & SWP_AGG_NOGEOMETRYCHANGE) != SWP_AGG_NOGEOMETRYCHANGE )
 	        /* optimize cleanup by BitBlt'ing where possible */
 
 	        WINPOS_SizeMoveClean(wndPtr, visRgn, &oldWindowRect, &oldClientRect, bNoCopy);
@@ -1706,7 +1794,10 @@
 
       /* And last, send the WM_WINDOWPOSCHANGED message */
 
-    if (!(winpos.flags & SWP_NOSENDCHANGING))
+    dprintf_win(stddeb,"\tstatus flags = %04x\n", winpos.flags & SWP_AGG_STATUSFLAGS);
+
+    if ( ((winpos.flags & SWP_AGG_STATUSFLAGS) != SWP_AGG_NOPOSCHANGE) && 
+	!(winpos.flags & SWP_NOSENDCHANGING))
         SendMessage16( winpos.hwnd, WM_WINDOWPOSCHANGED,
                        0, (LPARAM)MAKE_SEGPTR(&winpos) );
 
diff --git a/windows/winproc.c b/windows/winproc.c
index 501acfe..f52a6d2 100644
--- a/windows/winproc.c
+++ b/windows/winproc.c
@@ -100,48 +100,6 @@
 static void CallFrom32_stdcall_5(void) {}
 #endif  /* WINELIB */
 
-/* Reference 16->32A thunk */
-static const WINPROC_THUNK_FROM16 WINPROC_ThunkRef16To32A =
-{
-    0x58,                                       /* popl  %eax */
-    0x68, 0x00000000,                           /* pushl $proc32 */
-    0x50,                                       /* pushl %eax */
-    0x5566,                                     /* pushw %bp */
-    0x68, (void (*)())WINPROC_CallProc16To32A,  /* pushl $thunk32 */
-    0x9a, CallFrom16_long_wwwll,                /* lcall cs:relay */
-    WINE_CODE_SELECTOR
-};
-
-/* Reference 16->32W thunk */
-static const WINPROC_THUNK_FROM16 WINPROC_ThunkRef16To32W =
-{
-    0x58,                                       /* popl  %eax */
-    0x68, 0x00000000,                           /* pushl $proc32 */
-    0x50,                                       /* pushl %eax */
-    0x5566,                                     /* pushw %bp */
-    0x68, (void (*)())WINPROC_CallProc16To32W,  /* pushl $thunk32 */
-    0x9a, CallFrom16_long_wwwll,                /* lcall cs:relay */
-    WINE_CODE_SELECTOR
-};
-
-/* Reference 32->16 thunk */
-static const WINPROC_THUNK_FROM32 WINPROC_ThunkRef32To16 =
-{
-    0x58,                                       /* popl  %eax */
-    0x68, 0x00000000,                           /* pushl $proc16 */
-    0x50,                                       /* pushl %eax */
-    0x55,                                       /* pushl %ebp */
-    0x68, "WINPROC_CallProc32ATo16",            /* pushl $name */
-    0x68, (void (*)())WINPROC_CallProc32ATo16,  /* pushl $thunk32 */
-    0xe9, CallFrom32_stdcall_5                  /* jmp   relay */
-};
-
-/* Reference 32->32 jump */
-static const WINPROC_JUMP WINPROC_JumpRef =
-{
-    0xe9, 0x00000000                            /* jmp   proc (relative) */
-};
-
 static HANDLE32 WinProcHeap;
 
 /**********************************************************************
@@ -175,12 +133,10 @@
     {
         ptr = (BYTE *)handle;
         /* First check if it is the jmp address */
-        if (*ptr == WINPROC_JumpRef.jmp)
-            ptr -= (int)&((WINDOWPROC *)0)->jmp -
-                   (int)&((WINDOWPROC *)0)->thunk;
+        if (*ptr == 0xe9 /* jmp */) ptr -= (int)&((WINDOWPROC *)0)->jmp -
+                                           (int)&((WINDOWPROC *)0)->thunk;
         /* Now it must be the thunk address */
-        if (*ptr == WINPROC_ThunkRef16To32A.popl_eax)
-            ptr -= (int)&((WINDOWPROC *)0)->thunk;
+        if (*ptr == 0x58 /* popl eax */) ptr -= (int)&((WINDOWPROC *)0)->thunk;
         /* Now we have a pointer to the WINDOWPROC struct */
         if (((WINDOWPROC *)ptr)->magic == WINPROC_MAGIC)
             return (WINDOWPROC *)ptr;
@@ -192,8 +148,7 @@
     {
         ptr = (BYTE *)PTR_SEG_TO_LIN(handle);
         /* It must be the thunk address */
-        if (*ptr == WINPROC_ThunkRef32To16.popl_eax)
-            ptr -= (int)&((WINDOWPROC *)0)->thunk;
+        if (*ptr == 0x58 /* popl eax */) ptr -= (int)&((WINDOWPROC *)0)->thunk;
         /* Now we have a pointer to the WINDOWPROC struct */
         if (((WINDOWPROC *)ptr)->magic == WINPROC_MAGIC)
             return (WINDOWPROC *)ptr;
@@ -227,24 +182,35 @@
         switch(type)
         {
         case WIN_PROC_16:
-            proc->thunk.t_from32 = WINPROC_ThunkRef32To16;
-            proc->thunk.t_from32.proc = func;
-            /* We need to fix the relative jump target */
-            proc->thunk.t_from32.relay = (void (*)())((DWORD)proc->thunk.t_from32.relay -
+            proc->thunk.t_from32.popl_eax    = 0x58;   /* popl  %eax */
+            proc->thunk.t_from32.pushl_func  = 0x68;   /* pushl $proc */
+            proc->thunk.t_from32.proc        = func;
+            proc->thunk.t_from32.pushl_eax   = 0x50;   /* pushl %eax */
+            proc->thunk.t_from32.pushl_ebp   = 0x55;   /* pushl %ebp */
+            proc->thunk.t_from32.pushl_name  = 0x68;   /* pushl $name */
+            proc->thunk.t_from32.name        = "WINPROC_CallProc32ATo16";
+            proc->thunk.t_from32.pushl_thunk = 0x68;   /* pushl $thunkfrom32 */
+            proc->thunk.t_from32.thunk32     = (void(*)())WINPROC_CallProc32ATo16;
+            proc->thunk.t_from32.jmp         = 0xe9;   /* jmp   relay*/
+            proc->thunk.t_from32.relay =  /* relative jump */
+                (void (*)())((DWORD)CallFrom32_stdcall_5 -
                                      (DWORD)(&proc->thunk.t_from32.relay + 1));
             break;
         case WIN_PROC_32A:
-            proc->thunk.t_from16 = WINPROC_ThunkRef16To32A;
-            proc->thunk.t_from16.proc = (FARPROC32)func;
-            proc->jmp = WINPROC_JumpRef;
-            /* Fixup relative jump */
-            proc->jmp.proc = (WNDPROC32)((DWORD)func -
-                                                 (DWORD)(&proc->jmp.proc + 1));
-            break;
         case WIN_PROC_32W:
-            proc->thunk.t_from16 = WINPROC_ThunkRef16To32W;
-            proc->thunk.t_from16.proc = (WNDPROC32)func;
-            proc->jmp = WINPROC_JumpRef;
+            proc->thunk.t_from16.popl_eax    = 0x58;   /* popl  %eax */
+            proc->thunk.t_from16.pushl_func  = 0x68;   /* pushl $proc */
+            proc->thunk.t_from16.proc        = (FARPROC32)func;
+            proc->thunk.t_from16.pushl_eax   = 0x50;   /* pushl %eax */
+            proc->thunk.t_from16.pushw_bp    = 0x5566; /* pushw %bp */
+            proc->thunk.t_from16.pushl_thunk = 0x68;   /* pushl $thunkfrom16 */
+            proc->thunk.t_from16.thunk32     = (type == WIN_PROC_32A) ?
+                                           (void(*)())WINPROC_CallProc16To32A :
+                                           (void(*)())WINPROC_CallProc16To32W;
+            proc->thunk.t_from16.lcall       = 0x9a;   /* lcall cs:relay */
+            proc->thunk.t_from16.relay       = CallFrom16_long_wwwll;
+            proc->thunk.t_from16.cs          = WINE_CODE_SELECTOR;
+            proc->jmp.jmp  = 0xe9;
             /* Fixup relative jump */
             proc->jmp.proc = (WNDPROC32)((DWORD)func -
                                                  (DWORD)(&proc->jmp.proc + 1));
@@ -409,6 +375,31 @@
             *plparam = (LPARAM)cs;
         }
         return 1;
+    case WM_MDICREATE:
+        {
+            MDICREATESTRUCT32W *cs =
+                (MDICREATESTRUCT32W *)HeapAlloc( SystemHeap, 0, sizeof(*cs) );
+            if (!cs) return -1;
+            *cs = *(MDICREATESTRUCT32W *)*plparam;
+            if (HIWORD(cs->szClass))
+                cs->szClass = STRING32_DupAnsiToUni( (LPCSTR)cs->szClass );
+            if (HIWORD(cs->szTitle))
+                cs->szTitle = STRING32_DupAnsiToUni( (LPCSTR)cs->szTitle );
+            *plparam = (LPARAM)cs;
+        }
+        return 1;
+    case WM_ASKCBFORMATNAME:
+    case WM_COMPAREITEM:
+    case WM_DELETEITEM:
+    case WM_DEVMODECHANGE:
+    case WM_MDIACTIVATE:
+    case WM_MEASUREITEM:
+    case WM_PAINTCLIPBOARD:
+    case WM_SIZECLIPBOARD:
+    case WM_WININICHANGE:
+        fprintf( stderr, "MapMsg32ATo32W: message %04x needs translation\n",
+                 msg );
+        return -1;
     default:  /* No translation needed */
         return 0;
     }
@@ -443,6 +434,14 @@
             HeapFree( SystemHeap, 0, cs );
         }
         break;
+    case WM_MDICREATE:
+        {
+            MDICREATESTRUCT32W *cs = (MDICREATESTRUCT32W *)lParam;
+            if (HIWORD(cs->szTitle)) free( (LPVOID)cs->szTitle );
+            if (HIWORD(cs->szClass)) free( (LPVOID)cs->szClass );
+            HeapFree( SystemHeap, 0, cs );
+        }
+        break;
     }
 }
 
@@ -483,6 +482,31 @@
             *plparam = (LPARAM)cs;
         }
         return 1;
+    case WM_MDICREATE:
+        {
+            MDICREATESTRUCT32A *cs =
+                (MDICREATESTRUCT32A *)HeapAlloc( SystemHeap, 0, sizeof(*cs) );
+            if (!cs) return -1;
+            *cs = *(MDICREATESTRUCT32A *)*plparam;
+            if (HIWORD(cs->szTitle))
+                cs->szTitle = STRING32_DupUniToAnsi( (LPCWSTR)cs->szTitle );
+            if (HIWORD(cs->szClass))
+                cs->szClass = STRING32_DupUniToAnsi( (LPCWSTR)cs->szClass );
+            *plparam = (LPARAM)cs;
+        }
+        return 1;
+    case WM_ASKCBFORMATNAME:
+    case WM_COMPAREITEM:
+    case WM_DELETEITEM:
+    case WM_DEVMODECHANGE:
+    case WM_MDIACTIVATE:
+    case WM_MEASUREITEM:
+    case WM_PAINTCLIPBOARD:
+    case WM_SIZECLIPBOARD:
+    case WM_WININICHANGE:
+        fprintf( stderr, "MapMsg32WTo32A: message %04x needs translation\n",
+                 msg );
+        return -1;
     default:  /* No translation needed */
         return 0;
     }
@@ -517,6 +541,14 @@
             HeapFree( SystemHeap, 0, cs );
         }
         break;
+    case WM_MDICREATE:
+        {
+            MDICREATESTRUCT32A *cs = (MDICREATESTRUCT32A *)lParam;
+            if (HIWORD(cs->szTitle)) free( (LPVOID)cs->szTitle );
+            if (HIWORD(cs->szClass)) free( (LPVOID)cs->szClass );
+            HeapFree( SystemHeap, 0, cs );
+        }
+        break;
     }
 }
 
@@ -580,6 +612,21 @@
     case WM_GETTEXT:
         *plparam = (LPARAM)PTR_SEG_TO_LIN(*plparam);
         return 0;
+    case WM_MDICREATE:
+        {
+            MDICREATESTRUCT16 *cs16 =
+                (MDICREATESTRUCT16 *)PTR_SEG_TO_LIN(*plparam);
+            MDICREATESTRUCT32A *cs =
+                (MDICREATESTRUCT32A *)HeapAlloc( SystemHeap, 0,
+                                                sizeof(*cs) + sizeof(LPARAM) );
+            if (!cs) return -1;
+            STRUCT32_MDICREATESTRUCT16to32A( cs16, cs );
+            cs->szTitle = (LPCSTR)PTR_SEG_TO_LIN(cs16->szTitle);
+            cs->szClass = (LPCSTR)PTR_SEG_TO_LIN(cs16->szClass);
+            *(LPARAM *)(cs + 1) = *plparam;  /* Store the previous lParam */
+            *plparam = (LPARAM)cs;
+        }
+        return 1;
     case WM_MDISETMENU:
         *pwparam32 = (WPARAM32)(HMENU32)LOWORD(*plparam);
         *plparam   = (LPARAM)(HMENU32)HIWORD(*plparam);
@@ -656,7 +703,6 @@
     case WM_DELETEITEM:
     case WM_DEVMODECHANGE:
     case WM_MDIACTIVATE:
-    case WM_MDICREATE:
     case WM_MEASUREITEM:
     case WM_PAINTCLIPBOARD:
     case WM_SIZECLIPBOARD:
@@ -692,6 +738,15 @@
             HeapFree( SystemHeap, 0, mmi );
         }
         break;
+    case WM_MDICREATE:
+        {
+            MDICREATESTRUCT32A *cs = (MDICREATESTRUCT32A *)lParam;
+            lParam = *(LPARAM *)(cs + 1);
+            STRUCT32_MDICREATESTRUCT32Ato16( cs,
+                                 (MDICREATESTRUCT16 *)PTR_SEG_TO_LIN(lParam) );
+            HeapFree( SystemHeap, 0, cs );
+        }
+        break;
     case WM_NCCALCSIZE:
         {
             NCCALCSIZE_PARAMS16 *nc16;
@@ -769,6 +824,25 @@
             *plparam = (LPARAM)cs;
         }
         return 1;
+    case WM_MDICREATE:
+        {
+            MDICREATESTRUCT16 *cs16 =
+                (MDICREATESTRUCT16 *)PTR_SEG_TO_LIN(*plparam);
+            MDICREATESTRUCT32W *cs =
+                (MDICREATESTRUCT32W *)HeapAlloc( SystemHeap, 0,
+                                                sizeof(*cs) + sizeof(LPARAM) );
+            if (!cs) return -1;
+            STRUCT32_MDICREATESTRUCT16to32A( cs16, (MDICREATESTRUCT32A *)cs );
+            cs->szTitle = (LPCWSTR)PTR_SEG_TO_LIN(cs16->szTitle);
+            cs->szClass = (LPCWSTR)PTR_SEG_TO_LIN(cs16->szClass);
+            if (HIWORD(cs->szTitle))
+                cs->szTitle = STRING32_DupAnsiToUni( (LPCSTR)cs->szTitle );
+            if (HIWORD(cs->szClass))
+                cs->szClass = STRING32_DupAnsiToUni( (LPCSTR)cs->szClass );
+            *(LPARAM *)(cs + 1) = *plparam;  /* Store the previous lParam */
+            *plparam = (LPARAM)cs;
+        }
+        return 1;
     default:  /* No Unicode translation needed */
         return WINPROC_MapMsg16To32A( msg16, wParam16, pmsg32,
                                       pwparam32, plparam );
@@ -801,6 +875,17 @@
             HeapFree( SystemHeap, 0, cs );
         }
         break;
+    case WM_MDICREATE:
+        {
+            MDICREATESTRUCT32W *cs = (MDICREATESTRUCT32W *)lParam;
+            lParam = *(LPARAM *)(cs + 1);
+            STRUCT32_MDICREATESTRUCT32Ato16( (MDICREATESTRUCT32A *)cs,
+                                 (MDICREATESTRUCT16 *)PTR_SEG_TO_LIN(lParam) );
+            if (HIWORD(cs->szTitle)) free( (LPVOID)cs->szTitle );
+            if (HIWORD(cs->szClass)) free( (LPVOID)cs->szClass );
+            HeapFree( SystemHeap, 0, cs );
+        }
+        break;
     default:
         WINPROC_UnmapMsg16To32A( msg, wParam, lParam );
         break;
@@ -878,6 +963,21 @@
             *plparam = (LPARAM)SEGPTR_GET(str);
         }
         return 1;
+    case WM_MDICREATE:
+        {
+            MDICREATESTRUCT16 *cs;
+            MDICREATESTRUCT32A *cs32 = (MDICREATESTRUCT32A *)*plparam;
+            LPSTR name, cls;
+
+            if (!(cs = SEGPTR_NEW(MDICREATESTRUCT16))) return -1;
+            STRUCT32_MDICREATESTRUCT32Ato16( cs32, cs );
+            name = SEGPTR_STRDUP( cs32->szTitle );
+            cls  = SEGPTR_STRDUP( cs32->szClass );
+            cs->szTitle = SEGPTR_GET(name);
+            cs->szClass = SEGPTR_GET(cls);
+            *plparam = (LPARAM)SEGPTR_GET(cs);
+        }
+        return 1;
     case WM_MDISETMENU:
         *pwparam16 = TRUE;  /* FIXME? */
         *plparam   = MAKELPARAM( (HMENU16)LOWORD(wParam32),
@@ -955,7 +1055,6 @@
     case WM_DELETEITEM:
     case WM_DEVMODECHANGE:
     case WM_MDIACTIVATE:
-    case WM_MDICREATE:
     case WM_MEASUREITEM:
     case WM_PAINTCLIPBOARD:
     case WM_SIZECLIPBOARD:
@@ -998,6 +1097,14 @@
             SEGPTR_FREE( (LPARAM *)str - 1 );
         }
         break;
+    case WM_MDICREATE:
+        {
+            MDICREATESTRUCT16 *cs = (MDICREATESTRUCT16*)PTR_SEG_TO_LIN(lParam);
+            SEGPTR_FREE( PTR_SEG_TO_LIN(cs->szTitle) );
+            SEGPTR_FREE( PTR_SEG_TO_LIN(cs->szClass) );
+            SEGPTR_FREE( cs );
+        }
+        break;
     case WM_NCCALCSIZE:
         {
             NCCALCSIZE_PARAMS32 *nc32;
@@ -1079,6 +1186,32 @@
             *plparam   = (LPARAM)SEGPTR_GET(cs);
         }
         return 1;
+    case WM_MDICREATE:
+        {
+            MDICREATESTRUCT16 *cs;
+            MDICREATESTRUCT32W *cs32 = (MDICREATESTRUCT32W *)*plparam;
+
+            if (!(cs = SEGPTR_NEW(MDICREATESTRUCT16))) return -1;
+            STRUCT32_MDICREATESTRUCT32Ato16( (MDICREATESTRUCT32A *)cs32, cs );
+            if (HIWORD(cs32->szTitle))
+            {
+                LPSTR name = SEGPTR_ALLOC( lstrlen32W(cs32->szTitle) + 1 );
+                STRING32_UniToAnsi( name, cs32->szTitle );
+                cs->szTitle = SEGPTR_GET(name);
+            }
+            else cs->szTitle = (SEGPTR)cs32->szTitle;
+            if (HIWORD(cs32->szClass))
+            {
+                LPSTR name = SEGPTR_ALLOC( lstrlen32W(cs32->szClass) + 1 );
+                STRING32_UniToAnsi( name, cs32->szClass );
+                cs->szClass = SEGPTR_GET(name);
+            }
+            else cs->szClass = (SEGPTR)cs32->szClass;
+            *pmsg16    = (UINT16)msg32;
+            *pwparam16 = (WPARAM16)LOWORD(wParam32);
+            *plparam   = (LPARAM)SEGPTR_GET(cs);
+        }
+        return 1;
     case WM_SETTEXT:
         {
             LPSTR str = SEGPTR_ALLOC( lstrlen32W((LPWSTR)*plparam) + 1 );
diff --git a/wine.ini b/wine.ini
index f0690ec..28ffd4d 100644
--- a/wine.ini
+++ b/wine.ini
@@ -36,6 +36,9 @@
 Path=c:\windows;c:\windows\system;e:\;e:\test;f:\
 SymbolTableFile=./wine.sym
 
+[options]
+AllocSystemColors=100
+
 [fonts]
 system=*-helvetica
 mssansserif=*-helvetica
diff --git a/wine.man b/wine.man
index 8d5f17c..9220dc0 100644
--- a/wine.man
+++ b/wine.man
@@ -1,7 +1,7 @@
 .\" -*- nroff -*-
 .TH WINE 1 "September 1, 1995" "Version 9/1/95" "Windows Emulation"
 .SH NAME
-wine \- run Windows 3.x programs under Linux
+wine \- run Windows programs under Unix
 .SH SYNOPSIS
 .B wine
 [
@@ -13,7 +13,7 @@
 ]
 .SH DESCRIPTION
 .B wine
-invokes the Linux Windows emulator.
+invokes the Windows emulator.
 .PP
 .B wine 
 currently runs a number of games and small applications (approximately