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
