From af0bae587349890a7826746fa1808adba2d6b2af Mon Sep 17 00:00:00 2001
From: Alexandre Julliard <julliard@winehq.org>
Date: Tue, 3 Oct 1995 17:06:08 +0000
Subject: [PATCH] Release 951003

Sun Oct  1 15:48:34 1995  Alexandre Julliard  <julliard@sunsite.unc>

	* [controls/menu.c]
	Fixed GetMenuString() for non-string items.

	* [debugger/*.c]
	First attempt to check validity of pointers before memory
	accesses. For now only segmented pointers are checked.

	* [debugger/dbg.y] [memory/ldt.c]
	Added possibility to dump only one segment with 'info segment'.

	* [include/bitmaps/ocr_*]
	Added all OEM cursors as XPM bitmaps.

	* [include/cursoricon.h] [objects/cursoricon.c]
	Rewrote all cursor and icon management to use the same memory
 	layout as Windows, and to factor common code between icons and
	cursors. Implemented icon directory lookup to find the best
	matching icon (i.e. the color one).
  	Implemented CopyCursor() and DumpIcon().

	* [loader/module.c]
	For disabled built-in modules, we now try to load the Windows DLL
	first, and if this fails we fall back to using the built-in module
	anyway.

	* [memory/global.c]
	Fixed GlobalHandle() to return the correct selector in the high
	word even if we are passed a handle in the first place.

	* [miscemu/instr.c]
	Take into account the size of the operand and of the stack segment
	when incrementing the stack pointer.
	Avoid referencing FS_reg and GS_reg on *BSD.

	* [objects/dib.c]
	All DIB functions now accept a BITMAPCOREHEADER format bitmap.
	Monochrome DIBs are created as monochrome bitmap iff they are
	black and white.

	* [objects/oembitmap.c]
	Added support for OEM cursors, changed OBM_LoadIcon to use the new
	icon memory layout.

	* [rc/sysres_Fr.rc]
	Added French [Fr] language support.

	* [win32/environment.c]
	Fixed GetCommandLineA() to use current PDB.

	* [windows/event.c] [windows/winpos.c]
	Simulate a mouse motion event upon SetWindowPos() to force the
	cursor to be set correctly.

Sat Sep 30 17:49:32  Cameron Heide  (heide@ee.ualberta.ca)

	* [win32/*]
        New Win32 kernel functions: GetACP, GetCPInfo,
 	GetEnvironmentVariableA, GetFileType, GetLastError, GetOEMCP,
 	GetStartupInfoA, GetTimeZoneInformation, SetEnvironmentVariable,
 	SetFilePointer, SetLastError, VirtualAlloc, VirtualFree,
 	WriteFile.  Completed implementations of GetCommandLineA.

	* [include/kernel32.h]
        New file.

	* [loader/main.c]
        Call initialization function for Win32 data (doesn't currently do
 	anything).

	* [misc/main.c]
	Implemented GetEnvironmentVariableA, SetEnvironmentVariableA.

Sat Sep 30 00:26:56 1995  Niels de Carpentier  <niels@cindy.et.tudelft.nl>

	* [windows/winpos.c][miscemu/emulate.c][loader/module.c]
	  [misc/commdlg.c]
	Misc. bug fixes

Fri Sep 29 16:16:13 1995  Jim Peterson <jspeter@birch.ee.vt.edu>

	* [*/*]
	For Winelib, explicit casts have been placed where warnings were
 	usually generated.
	printf formats which give the format for printing a handle as
 	"%04x" or something similar have been changed to use the NPFMT
 	macro defined in include/wintypes.h.  Some times, explicit casts
 	were also necessary.
     	Parameter, field, and variable declarations have been made more
 	exact, such as converting 'WORD wParam' to 'WPARAM wParam' or
 	'WORD hFont' to 'HFONT hFont'.
     	Any call of the form GetWindowWord(hwnd,GWW_HINSTANCE) has been
 	replaced with a call to WIN_GetWindowInstance(hwnd).

	* [controls/combo.c]
	Added WINELIB32 support in CLBoxGetCombo().

	* [include/dialog.h]
	Commented out the '#ifndef WINELIB' around the '#pragma pack(1)'.
	winelib needs the packing as well (e.g. when accessing resources
	like sysres_DIALOG_SHELL_ABOUT_MSGBOX).

	* [include/windows.h]
	Got rid of the F[a-k] macros, which were cluttering up the global
	namespace.

	* [include/windows.h] [windows/defwnd.c]
	Added Win32 messages WM_CTLCOLOR*.

	* [include/wintypes.h]
	Put in preprocessor '#define WINELIB32' if appropriate and changed
	the types of some typedefs (WPARAM, HANDLE) based on this.

	* [loader/module.c] [toolkit/miscstubs.c]
	Added #ifdef'd portion in LoadModule to handle loading a WINElib
	module (already loaded, just init values).  '#ifdef'ed out the
	definition for GetWndProcEntry16 and added a new version to
	toolkit/miscstubs.c.

	* [misc/shell.c]
	Adjusted the lengths of AppName and AppMisc from 512,512 to 128,906.
	Same amount of total storage, but much more reasonable.  Also, changed
	calls to strcpy() in ShellAbout() to calls to strncpy() instead.
	This was a difficult bug to track down, but the AppMisc field was
	being initialized with the contributers text, which was much larger
	than 512 characters.

	* [toolkit/atom.c]
	New file for atom-handling functions.  Copied from memory/atom.c and
	then heavily modified.  Right now, it's just a linked list of atoms.
	Consider it as a hash table with just one entry.  It's easily changed
	later.

	* [toolkit/heap.c]
	Commented out the heap functions with a "#ifdef WINELIB16" and put in
	a Win32 version (which is basically a modified copy).

	* [toolkit/sup.c] [toolkit/miscstubs.c]
	Moved the stuff I put in toolkit/sup.c into toolkit/miscstubs.c and
	added quite a few more stubs.

	* [toolkit/winmain.c]
	Rearranged startup code in _WinMain.  I think this will work.

	* [toolkit/Makefile.in]
	Added targets for 'hello' and 'hello2' in case anyone cares to try
	out the sample programs.

Wed Sep 27 23:13:43 1995  Anand Kumria <akumria@ozemail.com.au>

	* [miscemu/int2f.c] [miscemu/vxd.c] [if1632/winprocs.spec]
	First attempt at support for some VxDs. Comm, Shell and Pagefile.

Tue Sep 26 21:34:45 1995  Hans de Graaff  <graaff@twi72.twi.tudelft.nl>

	* [misc/dos_fs.c]
	DOS_SimplifyPath: Also remove "/./" from path. (Happens when
 	starting applications like 'wine ./excel.exe')

Sat Sep 23 23:32:40 1995  Morten Welinder  <terra@diku.dk>

	* [configure.in]
	Avoid relative path for wine.ini.

	* [rc/sysres_Da.rc]
	Support for Danish [Da] language.

	* [misc/main.c] [miscemu/cpu.c]
	Return the processor we're running on correctly.

	* [miscemu/int2f.c]
	Minor stuff in int 0x2f, function 0x16.

Sat Sep 23 1995 17:58:04  Marcus Meissner  <msmeissn@faui01.informatik.uni-erlangen.de>

	* [misc/shell.c] [misc/main.c]
	Implement saving and loading of the registry database (needed for
	OLE). Very experimental. Fixed ShellExecute().

	* [miscemu/int21.c]
	EEXIST is not a critical error condition for mkdir().

Fri Sep 22 01:33:34 1995  Alex Korobka  <alex@phm6.pharm.sunysb.edu>

	* [include/shell.h] [misc/shell.c]
	Implemented 4 drag/drop functions with documented functionality.

        * [multimedia/time.c]
        "Fixed" MMSysTimeCallback kludge so Excel5 loads up without crashing.

	* [*/*]
        Added new files, more message definitions, structures, debug info,
 	etc.  Rewrote message logging functions to produce output similar
 	to WinSight.  Check out -debugmsg +message option.

	* [misc/file.c]
        Fixed GetDriveType return value.

        * [windows/message.c]
        Hooks are invoked in normal order.

        * [miscemu/*]
        Added some functions and interrupts.

        * [misc/shell.c]
        Implemented Drag... functions.

Thu Sep 21 23:50:12 1995  Jukka Iivonen <iivonen@cc.helsinki.fi>

	* [rc/sysres_Fi.rc] [rc/sysres.rc]
	First attempt at Finnish [Fi] language support.
---
 ANNOUNCE                     |   24 +-
 BUGS                         |    1 +
 ChangeLog                    |  214 +++++
 Configure.old                |  221 -----
 DEVELOPERS-HINTS             |    7 -
 Imakefile                    |  119 ---
 Make.rules.in                |    2 +-
 Makefile.in                  |    7 +-
 README                       |   15 +-
 Wine.man                     |    4 +-
 configure                    |   12 +-
 configure.in                 |   10 +-
 controls/Imakefile           |   23 -
 controls/button.c            |   39 +-
 controls/combo.c             |   58 +-
 controls/desktop.c           |    2 +-
 controls/edit.c              |   63 +-
 controls/listbox.c           |   35 +-
 controls/menu.c              |  148 ++--
 controls/scroll.c            |   57 +-
 controls/static.c            |   26 +-
 controls/widgets.c           |    2 +-
 debugger/Imakefile           |   54 --
 debugger/break.c             |   12 +-
 debugger/dbg.y               |   38 +-
 debugger/debug.l             |    2 +-
 debugger/memory.c            |  138 +++-
 debugger/readline/Imakefile  |   18 -
 debugger/stack.c             |   52 +-
 if1632/Imakefile             |  120 ---
 if1632/callback.c            |    1 -
 if1632/gdi.spec              |    2 +-
 if1632/kernel32.spec         |   32 +-
 if1632/mmsystem.spec         |    4 +-
 if1632/relay.c               |    6 +-
 if1632/relay32.c             |    4 +-
 if1632/user.spec             |    8 +-
 if1632/winprocs.spec         |   11 +-
 include/bitmap.h             |    2 +-
 include/bitmaps/ocr_cross    |   37 +
 include/bitmaps/ocr_ibeam    |   37 +
 include/bitmaps/ocr_icon     |   38 +
 include/bitmaps/ocr_normal   |   38 +
 include/bitmaps/ocr_size     |   38 +
 include/bitmaps/ocr_sizenesw |   38 +
 include/bitmaps/ocr_sizens   |   38 +
 include/bitmaps/ocr_sizenwse |   38 +
 include/bitmaps/ocr_sizewe   |   38 +
 include/bitmaps/ocr_up       |   38 +
 include/bitmaps/ocr_wait     |   38 +
 include/button.h             |    3 +-
 include/callback.h           |    5 +-
 include/class.h              |    2 +-
 include/combo.h              |    3 +
 include/commdlg.h            |    8 +-
 include/cursor.h             |   41 -
 include/cursoricon.h         |   59 ++
 include/debug.h              |  107 +--
 include/debugger.h           |   14 +
 include/desktop.h            |    2 +
 include/dialog.h             |    4 -
 include/dos_fs.h             |    3 +-
 include/event.h              |    1 +
 include/gdi.h                |   53 +-
 include/icon.h               |   26 -
 include/kernel32.h           |   80 ++
 include/ldt.h                |    4 +-
 include/listbox.h            |    2 +
 include/local.h              |   18 +-
 include/mdi.h                |    4 +-
 include/menu.h               |    1 +
 include/message.h            |   10 +-
 include/miscemu.h            |    1 -
 include/module.h             |    4 +-
 include/msdos.h              |    1 +
 include/neexe.h              |    3 +-
 include/nonclient.h          |   10 +-
 include/pe_image.h           |    4 +-
 include/registers.h          |    8 +-
 include/relay32.h            |    2 +
 include/resource.h           |    3 -
 include/shell.h              |   12 +
 include/spy.h                |   19 +
 include/stackframe.h         |    2 +-
 include/static.h             |    2 +-
 include/stddebug.h           |    6 +-
 include/task.h               |    2 +-
 include/toolhelp.h           |    8 +-
 include/win.h                |    4 +-
 include/windows.h            | 1477 ++++++++++++++++++----------------
 include/wine.h               |   20 +-
 include/winsock.h            |    5 +
 include/wintypes.h           |   42 +-
 ipc/Imakefile                |   37 -
 loader/Imakefile             |   23 -
 loader/main.c                |   11 +
 loader/module.c              |  194 +++--
 loader/ne_image.c            |   30 +-
 loader/ne_resource.c         |   28 +-
 loader/pe_image.c            |   38 +-
 loader/resource.c            |  293 +------
 loader/signal.c              |    4 +-
 loader/task.c                |   61 +-
 memory/Imakefile             |   19 -
 memory/global.c              |    4 +-
 memory/ldt.c                 |   42 +-
 memory/local.c               |   12 +-
 memory/selector.c            |    6 +-
 misc/Imakefile               |   42 -
 misc/Makefile.in             |    1 -
 misc/clipboard.c             |   18 +-
 misc/comm.c                  |    6 +
 misc/commdlg.c               |   38 +-
 misc/dos_fs.c                |   73 +-
 misc/driver.c                |   20 +-
 misc/file.c                  |   13 +-
 misc/kernel32.c              |   62 --
 misc/main.c                  |   83 +-
 misc/network.c               |   30 +-
 misc/ole2disp.c              |    8 +
 misc/ole2nls.c               |    2 +
 misc/olecli.c                |    2 +-
 misc/shell.c                 |  280 ++++++-
 misc/spy.c                   |  252 ++++--
 misc/user.c                  |    2 +-
 misc/user32.c                |   24 +-
 misc/winsocket.c             |   24 +-
 miscemu/Imakefile            |   29 -
 miscemu/Makefile.in          |    5 +-
 miscemu/cpu.c                |   43 +
 miscemu/dpmi.c               |   16 +-
 miscemu/emulate.c            |    3 +-
 miscemu/instr.c              |   58 +-
 miscemu/int1a.c              |    4 +-
 miscemu/int21.c              |   72 +-
 miscemu/int2f.c              |   95 ++-
 miscemu/int4b.c              |   34 +
 miscemu/int5c.c              |   14 +-
 miscemu/vxd.c                |  141 ++++
 multimedia/Imakefile         |   23 -
 multimedia/mcistring.c       |   28 +-
 multimedia/mmsystem.c        |    9 +-
 multimedia/time.c            |   27 +-
 objects/Imakefile            |   31 -
 objects/Makefile.in          |    1 +
 objects/bitblt.c             |    6 +-
 objects/bitmap.c             |   26 +-
 objects/brush.c              |   42 +-
 objects/clipping.c           |   26 +-
 objects/color.c              |   75 +-
 objects/cursoricon.c         |  853 ++++++++++++++++++++
 objects/dc.c                 |   26 +-
 objects/dib.c                |  343 +++++---
 objects/font.c               |   30 +-
 objects/gdiobj.c             |   64 +-
 objects/metafile.c           |    4 +-
 objects/oembitmap.c          |  174 +++-
 objects/palette.c            |   18 +-
 objects/pen.c                |    5 +-
 objects/region.c             |   16 +-
 objects/text.c               |    4 +-
 rc/Imakefile                 |   65 --
 rc/Makefile.in               |    4 +-
 rc/parser.h                  |    3 +
 rc/parser.y                  |    1 +
 rc/sysres.rc                 |    6 +
 rc/sysres_Da.rc              |  200 +++++
 rc/sysres_Fi.rc              |  200 +++++
 rc/sysres_Fr.rc              |  201 +++++
 rc/winerc.c                  |   13 +-
 toolkit/Imakefile            |   18 -
 toolkit/Makefile.in          |   13 +
 toolkit/atom.c               |  340 ++++++++
 toolkit/heap.c               |  115 ++-
 toolkit/hello.c              |    5 +-
 toolkit/hello2.c             |    9 +
 toolkit/miscstubs.c          |  324 ++++++++
 toolkit/sup.c                |    6 +-
 toolkit/winmain.c            |   46 +-
 tools/Imakefile              |   15 -
 tools/build.c                |   26 +-
 win32/Makefile.in            |   18 +
 win32/code_page.c            |   38 +
 win32/environment.c          |   26 +
 win32/error.c                |   36 +
 win32/file.c                 |   96 +++
 win32/init.c                 |   44 +
 win32/memory.c               |   46 ++
 win32/thread.c               |   29 +
 win32/time.c                 |   31 +
 windows/Imakefile            |   41 -
 windows/Makefile.in          |    1 -
 windows/caret.c              |   15 +-
 windows/class.c              |   17 +-
 windows/cursor.c             |  427 ----------
 windows/dce.c                |    4 +-
 windows/defdlg.c             |    8 +-
 windows/defwnd.c             |   36 +-
 windows/dialog.c             |   42 +-
 windows/event.c              |   29 +-
 windows/focus.c              |    6 +-
 windows/graphics.c           |   10 +-
 windows/hook.c               |   22 +-
 windows/mapping.c            |    2 +-
 windows/mdi.c                |   50 +-
 windows/message.c            |   56 +-
 windows/msgbox.c             |   17 +-
 windows/nonclient.c          |   40 +-
 windows/painting.c           |   23 +-
 windows/property.c           |   18 +-
 windows/timer.c              |   16 +-
 windows/utility.c            |   22 +
 windows/win.c                |   86 +-
 windows/winpos.c             |   25 +-
 214 files changed, 7347 insertions(+), 3861 deletions(-)
 delete mode 100644 Configure.old
 delete mode 100644 Imakefile
 delete mode 100644 controls/Imakefile
 delete mode 100644 debugger/Imakefile
 delete mode 100644 debugger/readline/Imakefile
 delete mode 100644 if1632/Imakefile
 create mode 100644 include/bitmaps/ocr_cross
 create mode 100644 include/bitmaps/ocr_ibeam
 create mode 100644 include/bitmaps/ocr_icon
 create mode 100644 include/bitmaps/ocr_normal
 create mode 100644 include/bitmaps/ocr_size
 create mode 100644 include/bitmaps/ocr_sizenesw
 create mode 100644 include/bitmaps/ocr_sizens
 create mode 100644 include/bitmaps/ocr_sizenwse
 create mode 100644 include/bitmaps/ocr_sizewe
 create mode 100644 include/bitmaps/ocr_up
 create mode 100644 include/bitmaps/ocr_wait
 delete mode 100644 include/cursor.h
 create mode 100644 include/cursoricon.h
 delete mode 100644 include/icon.h
 create mode 100644 include/kernel32.h
 create mode 100644 include/spy.h
 delete mode 100644 ipc/Imakefile
 delete mode 100644 loader/Imakefile
 delete mode 100644 memory/Imakefile
 delete mode 100644 misc/Imakefile
 delete mode 100644 misc/kernel32.c
 delete mode 100644 miscemu/Imakefile
 create mode 100644 miscemu/cpu.c
 create mode 100644 miscemu/int4b.c
 create mode 100644 miscemu/vxd.c
 delete mode 100644 multimedia/Imakefile
 delete mode 100644 objects/Imakefile
 create mode 100644 objects/cursoricon.c
 delete mode 100644 rc/Imakefile
 create mode 100644 rc/sysres_Da.rc
 create mode 100644 rc/sysres_Fi.rc
 create mode 100644 rc/sysres_Fr.rc
 delete mode 100644 toolkit/Imakefile
 create mode 100644 toolkit/atom.c
 create mode 100644 toolkit/hello2.c
 create mode 100644 toolkit/miscstubs.c
 delete mode 100644 tools/Imakefile
 create mode 100644 win32/Makefile.in
 create mode 100644 win32/code_page.c
 create mode 100644 win32/environment.c
 create mode 100644 win32/error.c
 create mode 100644 win32/file.c
 create mode 100644 win32/init.c
 create mode 100644 win32/memory.c
 create mode 100644 win32/thread.c
 create mode 100644 win32/time.c
 delete mode 100644 windows/Imakefile
 delete mode 100644 windows/cursor.c

diff --git a/ANNOUNCE b/ANNOUNCE
index 04036c4778d..5a10f8b2e07 100644
--- a/ANNOUNCE
+++ b/ANNOUNCE
@@ -1,15 +1,15 @@
-This is release 950918 of Wine the MS Windows emulator.  This is still a
+This is release 951003 of Wine the MS Windows emulator.  This is still a
 developer's only release.  There are many bugs and many unimplemented API
 features.  Most applications still do not work.
 
 Patches should be submitted to "wine-new@amscons.com".  Please don't forget
 to include a ChangeLog entry.  I'll make a new release every other week.
 
-WHAT'S NEW with Wine-950918: (see ChangeLog for details)
-	- Support for self-loading modules.
-	- Win32 support should begin to work again.
-	- Cursor fixes.
-	- New configure script should be useable now.
+WHAT'S NEW with Wine-951003: (see ChangeLog for details)
+	- New cursor handling.
+	- French, Danish and Finnish language support.
+	- Lots of Winelib improvements.
+	- Preliminary VxD support.
 	- Lots of bug fixes.
 
 See the README file in the distribution for installation instructions.
@@ -18,11 +18,11 @@ Because of lags created by using mirror, this message may reach you before
 the release is available at the ftp sites.  The sources will be available
 from the following locations:
 
-    sunsite.unc.edu:/pub/Linux/ALPHA/wine/Wine-950918.tar.gz
-    tsx-11.mit.edu:/pub/linux/ALPHA/Wine/development/Wine-950918.tar.gz
-    ftp.infomagic.com:/pub/mirrors/linux/wine/development/Wine-950918.tar.gz
-    ftp.funet.fi:/pub/OS/Linux/ALPHA/Wine/Wine-950918.tar.gz
-    aris.com:/pub/linux/ALPHA/Wine/development/Wine-950918.tar.gz
+    sunsite.unc.edu:/pub/Linux/ALPHA/wine/Wine-951003.tar.gz
+    tsx-11.mit.edu:/pub/linux/ALPHA/Wine/development/Wine-951003.tar.gz
+    ftp.infomagic.com:/pub/mirrors/linux/wine/development/Wine-951003.tar.gz
+    ftp.funet.fi:/pub/OS/Linux/ALPHA/Wine/Wine-951003.tar.gz
+    aris.com:/pub/linux/ALPHA/Wine/development/Wine-951003.tar.gz
 
 It should also be available from any site that mirrors tsx-11 or sunsite.
 
@@ -36,7 +36,7 @@ reading for new developers.
 Wine is available thanks to the work of Bob Amstadt, Dag Asheim,
 Martin Ayotte, Ross Biro, Erik Bos, Fons Botman, John Brezak,
 Andrew Bulhak, John Burton, Paul Falstad, Olaf Flebbe, Peter Galbavy,
-Ramon Garcia, Hans de Graaf, Charles M. Hannum, Cameron Heide,
+Ramon Garcia, Hans de Graaff, Charles M. Hannum, Cameron Heide,
 Jochen Hoenicke, Jeffrey Hsu, Miguel de Icaza, Alexandre Julliard,
 Jon Konrath, Scott A. Laird, Martin von Loewis, Kenneth MacDonald,
 Peter MacDonald, William Magro, Marcus Meissner, Graham Menhennitt,
diff --git a/BUGS b/BUGS
index 5ec13e3a53a..d0f6e47710c 100644
--- a/BUGS
+++ b/BUGS
@@ -1,4 +1,5 @@
 - EBP and ESP are sometimes corrupted while running 16-bit code.
+- Message flow is not correct for multiple tasks, some messages are not supported.
 - Dialog Boxes created by WM_CREATE handler aren't visible
 - MDI does not send WM_GETMINMAX message.
 - InitializeLoadedDLLs() can't init LZEXPAND.DLL. (cs:ip => 0:0)
diff --git a/ChangeLog b/ChangeLog
index 13a6e9edfe6..3ddda8eff90 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,4 +1,218 @@
 ----------------------------------------------------------------------
+Sun Oct  1 15:48:34 1995  Alexandre Julliard  <julliard@sunsite.unc>
+
+	* [controls/menu.c]
+	Fixed GetMenuString() for non-string items.
+
+	* [debugger/*.c]
+	First attempt to check validity of pointers before memory
+	accesses. For now only segmented pointers are checked.
+
+	* [debugger/dbg.y] [memory/ldt.c]
+	Added possibility to dump only one segment with 'info segment'.
+
+	* [include/bitmaps/ocr_*]
+	Added all OEM cursors as XPM bitmaps.
+
+	* [include/cursoricon.h] [objects/cursoricon.c]
+	Rewrote all cursor and icon management to use the same memory
+ 	layout as Windows, and to factor common code between icons and
+	cursors. Implemented icon directory lookup to find the best
+	matching icon (i.e. the color one).
+  	Implemented CopyCursor() and DumpIcon().
+
+	* [loader/module.c]
+	For disabled built-in modules, we now try to load the Windows DLL
+	first, and if this fails we fall back to using the built-in module
+	anyway.
+
+	* [memory/global.c]
+	Fixed GlobalHandle() to return the correct selector in the high
+	word even if we are passed a handle in the first place.
+
+	* [miscemu/instr.c]
+	Take into account the size of the operand and of the stack segment
+	when incrementing the stack pointer.
+	Avoid referencing FS_reg and GS_reg on *BSD.
+
+	* [objects/dib.c]
+	All DIB functions now accept a BITMAPCOREHEADER format bitmap.
+	Monochrome DIBs are created as monochrome bitmap iff they are
+	black and white.
+
+	* [objects/oembitmap.c]
+	Added support for OEM cursors, changed OBM_LoadIcon to use the new
+	icon memory layout.
+
+	* [rc/sysres_Fr.rc]
+	Added French [Fr] language support.
+
+	* [win32/environment.c]
+	Fixed GetCommandLineA() to use current PDB.
+
+	* [windows/event.c] [windows/winpos.c]
+	Simulate a mouse motion event upon SetWindowPos() to force the
+	cursor to be set correctly.
+
+Sat Sep 30 17:49:32  Cameron Heide  (heide@ee.ualberta.ca)
+
+	* [win32/*]
+        New Win32 kernel functions: GetACP, GetCPInfo,
+ 	GetEnvironmentVariableA, GetFileType, GetLastError, GetOEMCP,
+ 	GetStartupInfoA, GetTimeZoneInformation, SetEnvironmentVariable,
+ 	SetFilePointer, SetLastError, VirtualAlloc, VirtualFree,
+ 	WriteFile.  Completed implementations of GetCommandLineA.
+
+	* [include/kernel32.h]
+        New file.
+
+	* [loader/main.c]
+        Call initialization function for Win32 data (doesn't currently do
+ 	anything).
+
+	* [misc/main.c]
+	Implemented GetEnvironmentVariableA, SetEnvironmentVariableA.
+
+Sat Sep 30 00:26:56 1995  Niels de Carpentier  <niels@cindy.et.tudelft.nl>
+
+	* [windows/winpos.c][miscemu/emulate.c][loader/module.c]
+	  [misc/commdlg.c]
+	Misc. bug fixes
+
+Fri Sep 29 16:16:13 1995  Jim Peterson <jspeter@birch.ee.vt.edu>
+
+	* [*/*]
+	For Winelib, explicit casts have been placed where warnings were
+ 	usually generated.
+	printf formats which give the format for printing a handle as
+ 	"%04x" or something similar have been changed to use the NPFMT
+ 	macro defined in include/wintypes.h.  Some times, explicit casts
+ 	were also necessary.
+     	Parameter, field, and variable declarations have been made more
+ 	exact, such as converting 'WORD wParam' to 'WPARAM wParam' or
+ 	'WORD hFont' to 'HFONT hFont'.
+     	Any call of the form GetWindowWord(hwnd,GWW_HINSTANCE) has been
+ 	replaced with a call to WIN_GetWindowInstance(hwnd).
+
+	* [controls/combo.c]
+	Added WINELIB32 support in CLBoxGetCombo().
+
+	* [include/dialog.h]
+	Commented out the '#ifndef WINELIB' around the '#pragma pack(1)'.
+	winelib needs the packing as well (e.g. when accessing resources
+	like sysres_DIALOG_SHELL_ABOUT_MSGBOX).
+
+	* [include/windows.h]
+	Got rid of the F[a-k] macros, which were cluttering up the global
+	namespace.
+
+	* [include/windows.h] [windows/defwnd.c]
+	Added Win32 messages WM_CTLCOLOR*.
+
+	* [include/wintypes.h]
+	Put in preprocessor '#define WINELIB32' if appropriate and changed
+	the types of some typedefs (WPARAM, HANDLE) based on this.
+	
+	* [loader/module.c] [toolkit/miscstubs.c]
+	Added #ifdef'd portion in LoadModule to handle loading a WINElib
+	module (already loaded, just init values).  '#ifdef'ed out the
+	definition for GetWndProcEntry16 and added a new version to
+	toolkit/miscstubs.c.
+
+	* [misc/shell.c]
+	Adjusted the lengths of AppName and AppMisc from 512,512 to 128,906.
+	Same amount of total storage, but much more reasonable.  Also, changed
+	calls to strcpy() in ShellAbout() to calls to strncpy() instead.
+	This was a difficult bug to track down, but the AppMisc field was
+	being initialized with the contributers text, which was much larger
+	than 512 characters.
+
+	* [toolkit/atom.c]
+	New file for atom-handling functions.  Copied from memory/atom.c and
+	then heavily modified.  Right now, it's just a linked list of atoms.
+	Consider it as a hash table with just one entry.  It's easily changed
+	later.
+
+	* [toolkit/heap.c]
+	Commented out the heap functions with a "#ifdef WINELIB16" and put in
+	a Win32 version (which is basically a modified copy).
+
+	* [toolkit/sup.c] [toolkit/miscstubs.c]
+	Moved the stuff I put in toolkit/sup.c into toolkit/miscstubs.c and
+	added quite a few more stubs.
+
+	* [toolkit/winmain.c]
+	Rearranged startup code in _WinMain.  I think this will work.
+
+	* [toolkit/Makefile.in]
+	Added targets for 'hello' and 'hello2' in case anyone cares to try
+	out the sample programs.
+
+Wed Sep 27 23:13:43 1995  Anand Kumria <akumria@ozemail.com.au>
+	
+	* [miscemu/int2f.c] [miscemu/vxd.c] [if1632/winprocs.spec]
+	First attempt at support for some VxDs. Comm, Shell and Pagefile.
+
+Tue Sep 26 21:34:45 1995  Hans de Graaff  <graaff@twi72.twi.tudelft.nl>
+
+	* [misc/dos_fs.c]
+	DOS_SimplifyPath: Also remove "/./" from path. (Happens when
+ 	starting applications like 'wine ./excel.exe')
+
+Sat Sep 23 23:32:40 1995  Morten Welinder  <terra@diku.dk>
+
+	* [configure.in]
+	Avoid relative path for wine.ini.
+
+	* [rc/sysres_Da.rc]
+	Support for Danish [Da] language.
+
+	* [misc/main.c] [miscemu/cpu.c]
+	Return the processor we're running on correctly.
+
+	* [miscemu/int2f.c]
+	Minor stuff in int 0x2f, function 0x16.
+
+Sat Sep 23 1995 17:58:04  Marcus Meissner  <msmeissn@faui01.informatik.uni-erlangen.de>
+
+	* [misc/shell.c] [misc/main.c]
+	Implement saving and loading of the registry database (needed for
+	OLE). Very experimental. Fixed ShellExecute().
+	
+	* [miscemu/int21.c]
+	EEXIST is not a critical error condition for mkdir().
+
+Fri Sep 22 01:33:34 1995  Alex Korobka  <alex@phm6.pharm.sunysb.edu>
+
+	* [include/shell.h] [misc/shell.c]
+	Implemented 4 drag/drop functions with documented functionality.
+
+        * [multimedia/time.c]
+        "Fixed" MMSysTimeCallback kludge so Excel5 loads up without crashing.
+
+	* [*/*] 
+        Added new files, more message definitions, structures, debug info,
+ 	etc.  Rewrote message logging functions to produce output similar
+ 	to WinSight.  Check out -debugmsg +message option.
+
+	* [misc/file.c]
+        Fixed GetDriveType return value.  
+
+        * [windows/message.c] 
+        Hooks are invoked in normal order.
+
+        * [miscemu/*]
+        Added some functions and interrupts.
+
+        * [misc/shell.c]
+        Implemented Drag... functions.
+
+Thu Sep 21 23:50:12 1995  Jukka Iivonen <iivonen@cc.helsinki.fi>
+
+	* [rc/sysres_Fi.rc] [rc/sysres.rc]
+	First attempt at Finnish [Fi] language support.
+
+----------------------------------------------------------------------------
 Sun Sep 17 16:47:49 1995  Alexandre Julliard  <julliard@sunsite.unc.edu>
 
 	* [configure.in] [*/Makefile.in] [Make.rules.in]
diff --git a/Configure.old b/Configure.old
deleted file mode 100644
index 7e7f4a0a592..00000000000
--- a/Configure.old
+++ /dev/null
@@ -1,221 +0,0 @@
-#! /bin/sh
-#
-# Configure script for wine
-
-: ${EDITOR:=vi}
-: ${PAGER:=more}
-
-WINELIB=''
-LANGUAGE=not_matching
-ALLDEFINES=''
-
-# Ask question 'str' and set 'var' to reply (defaulting to 'def' on CR)
-prompt ()
-{
-	str="$1"
-	var="$2"
-	def="$3"
-
-	eval $var='$def'
-	echo
-	echo -n "$str [$def]? "
-	input=`head -1`  #  When using read, user must double all backslashes
-	if [ -n "$input" ]
-	then
-		eval $var='$input'
-	fi
-}
-
-echo
-echo Read the RELEASE-NOTES for an explanation of the various flags
-echo
-
-echo -n 'Build Wine as emulator or library (E/L) [E]? '
-read input
-if [ "$input" = 'l' -o "$input" = 'L' ]
-then
-	WINELIB='#define WINELIB -DWINELIB'
-	ALLDEFINES="$ALLDEFINES -DWINELIB"
-fi
-
-LANGS=`echo En rc/sysres_*.rc | sed -e 's/rc\/sysres_//g' -e 's/\.rc//g' -e 's/ /\//g;'`
-while	expr "$LANGS" : ".*$LANGUAGE" = 0 > /dev/null
-do
-	prompt "Language ($LANGS)" LANGUAGE En
-	if	expr "$LANGS" : ".*$LANGUAGE" = 0 > /dev/null
-	then
-		echo "\"$LANGUAGE\" is not a supported language."
-	fi
-done
-ALLDEFINES="$ALLDEFINES -ALANG\($LANGUAGE\)"
-
-prompt "Inter-process communication" CONFIG_IPC N
-if [ CONFIG_IPC = 'Y' -o $CONFIG_IPC = 'y' ]
-then
-       ALLDEFINES="$ALLDEFINES -DCONFIG_IPC"
-fi
-
-prompt "Malloc debugging" MALLOC_DEBUGGING N
-if [ MALLOC_DEBUGGING = 'Y' -o $MALLOC_DEBUGGING = 'y' ]
-then
-       MALLOC_DEBUGGING="#define MALLOC_DEBUGGING"
-       ALLDEFINES="$ALLDEFINES -DMALLOC_DEBUGGING"
-else
-       MALLOC_DEBUGGING=''
-fi
-
-prompt "Global configfile name" WINE_CONFIGFILE /usr/local/etc/wine.conf
-
-if [ -r $WINE_CONFIGFILE ]
-then
-	DEFAULT_ANS=N
-else
-	DEFAULT_ANS=Y
-fi
-
-echo
-echo -n "Do you want to make a config file now (Y/N) [$DEFAULT_ANS]? "
-read input
-if [ "$input" = '' ]
-then
-	input="$DEFAULT_ANS"
-fi
-if [ "$input" = 'y' -o "$input" = 'Y' ]
-then
-	if [ -r $WINE_CONFIGFILE ]
-	then
-		echo "Backing up the old file to ${WINE_CONFIGFILE}.old."
-		if cp $WINE_CONFIGFILE ${WINE_CONFIGFILE}.old
-		then	:
-		else
-			echo "Error while creating backup file.  Fix it and run Configure again"
-			exit 1
-		fi
-	fi
-
-	CF_A=`mount | awk '/^\/dev\/fd/ {print $3;exit} END {print "/a"}'`
-	prompt "Which directory do you want to use as A:" CF_A $CF_A
-	CF_C=`awk '{if ($3=="msdos") {print $2;exit}} END {print "/c"}' /etc/fstab`
-	prompt "Which directory do you want to use as C:" CF_C $CF_C
-	prompt "Where is the Windows directory" CF_Windows 'c:\windows'
-	prompt "Where is the System directory" CF_System 'c:\windows\system'
-	if [ -r "$CF_C/autoexec.bat" ]
-	then
-		CF_Temp=`tr A-Z a-z < "$CF_C/autoexec.batX" | sed -n 's/^ *set *temp= *\(c:.*[a-z]\).*/\1/p'`
-	fi
-	if [ -z "$CF_Temp" ]
-	then
-		CF_Temp='c:\temp'
-	fi
-	prompt "Where should Windows apps store temp files" CF_Temp $CF_Temp
-	prompt "Which path should be used to find progs/DLL's" CF_Path "$CF_Windows;$CF_System"
-	prompt "Where is COM1" CF_Com1 '/dev/cua0'
-	prompt "Where is COM2" CF_Com2 '/dev/cua1'
-	prompt "Where is LPT1" CF_Lpt1 '/dev/lp0'
-
-	echo
-	sed -n -e 's/^ *\"\(WM_[A-Z0-9]*\)\".*/\1/p' < misc/spy.c | \
-		sort | pr -ta4w83 | sed '1 i\
-Here is the list of messages:\
-\
-' | $PAGER
-
-	prompt "Exclude which messages from the log" CF_Exclude 'WM_SIZE;WM_TIMER'
-
-	cat >  $WINE_CONFIGFILE << EOF
-[drives]
-A=$CF_A
-C=$CF_C
-
-[wine]
-Windows=$CF_Windows
-System=$CF_System
-Temp=$CF_Temp
-Path=$CF_Path
-SystemResources=$CF_SystemResources
-
-[fonts]
-system=*-helvetica
-mssansserif=*-helvetica
-msserif=*-times
-fixedsys=*-fixed
-arial=*-helvetica
-helv=*-helvetica
-roman=*-times
-default=*-*
-
-[serialports]
-Com1=$CF_Com1
-Com2=$CF_Com2
-
-[parallelports]
-Lpt1=$CF_Lpt1
-
-[spy]
-Exclude=$CF_Exclude
-EOF
-
-	echo
-	sed '1 i\
-The config file '"$WINE_CONFIGFILE"' now looks like this:\
-\
-' < $WINE_CONFIGFILE | $PAGER
-
-	echo
-	echo -n "Do you want to edit it using $EDITOR (Y/N) [N]? "
-	read input
-	if [ "$input" = 'y' -o "$input" = 'Y' ]
-	then
-		$EDITOR $WINE_CONFIGFILE
-	fi
-else
-	if [ ! -r $WINE_CONFIGFILE ]
-	then
-		echo 'Ok, remember to make it yourself later.'
-	fi
-fi
-
-cat > autoconf.h << EOF
-/* autoconf.h generated automatically.  Run Configure. */
-$WINELIB
-$MALLOC_DEBUGGING
-#define WINE_INI_GLOBAL "$WINE_CONFIGFILE"
-#define AutoDefines $ALLDEFINES
-EOF
-
-echo
-echo "Creating Makefiles.  This may take a while."
-if xmkmf -a
-then :
-else	cat << EOF
-
-WARNING:  The exit status of the command 'xmkmf -a' indicates an error.
-Maybe the Wine directory is incomplete, or Imake (see 'man xmkmf imake')
-is incorrectly configured?  In the latter case, it might be easiest to
-reinstall X11 to get a new copy of Imake.
-EOF
-fi
-
-if [ 0 -lt `find . -name "*.rej" -print | wc -l` ]
-then
-	cat << EOF
-
-WARNING:  You have some files named '*.rej', which usually indicates
-rejected patch files.  Maybe you tried to upgrade Wine with 'patch',
-and that some of the patches failed?  If something doesn't work, this
-might be the reason.  See 'man patch' (especially the '-p' option).
-
-List of "*.rej" files:
-
-EOF
-	find . -name "*.rej" -print
-fi
-
-if [ -f ./Makefile ]
-then
-	echo
-	echo "Configure finished.  Do 'make' to compile Wine."
-else
-	echo
-	echo "*** There was a problem with 'imake': the main Makefile has not be created."
-fi
diff --git a/DEVELOPERS-HINTS b/DEVELOPERS-HINTS
index 96e1713011d..a661276eddf 100644
--- a/DEVELOPERS-HINTS
+++ b/DEVELOPERS-HINTS
@@ -57,13 +57,6 @@ files contain tables used by relay.c to translate arguments and transfer
 control to the proper handler.  The format of the *.spec files is
 documented in the file "tools/build-spec.txt".
 
-REGISTER FUNCTIONS:
-
-Some functions are defined as type "register" in the DLL specification files.
-In order to return values in the registers to the WIN16 program, the handler
-function must exit by calling ReturnFromRegisterFunc().  Look at the function
-DOS3Call() for an example of how this works.
-
 DEBUG MESSAGES:
 
 To display a message only during debugging, you normally write something
diff --git a/Imakefile b/Imakefile
deleted file mode 100644
index 47ffac606e4..00000000000
--- a/Imakefile
+++ /dev/null
@@ -1,119 +0,0 @@
-#include "autoconf.h"
-#include "Wine.tmpl"
-
-#if defined(i386FreeBsd) || defined(FreeBSDArchitecture)
-MAKE = gmake
-#endif
-
-DEFINES = AutoDefines -DUSE_READLINE
-
-/*
- * This is the second try at using Imakefiles. There are probably many
- * problems and things I haven't even considered. I do not have a fixed
- * Linux system to test them on, but thanks to Thomas Michlmayr
- * <tmichl@cosy.sbg.ac.at> for use of one of his boxes. 
- *
- * SEE BELOW ABOUT DEBUGGING AND LINUX
- *
- * Peter Galbavy, 31st Jan 1994: peter@wonderland.org
- */
-
-#define IHaveSubdirs
-#define	PassCDebugFlags 'CDEBUGFLAGS=$(CDEBUGFLAGS)' 'CC=$(CC)' 'MAKE=$(MAKE)'\
-			'DEFINES=$(DEFINES)' 'LD=$(LD)' 'ASFLAGS=$(ASFLAGS)'
-
-COMMONSUBDIRS = \
-	controls \
-	rc \
-	ipc \
-	loader \
-	misc \
-	multimedia \
-	objects \
-	windows
-
-EMUSUBDIRS = \
-	tools \
-	debugger \
-	if1632 \
-	memory \
-	miscemu
-
-LIBSUBDIRS = \
-	toolkit
-
-WINEDIR = $(LIBDIR)/wine
-
-COMMONOBJS = \
-	controls/controls.o \
-	ipc/ipc.o \
-	loader/loader.o \
-	misc/misc.o \
-	multimedia/multimedia.o \
-	objects/objects.o \
-	rc/rc.o \
-	windows/windows.o
-
-EMUOBJS = \
-	debugger/debugger.o \
-	if1632/if1632.o \
-	memory/memory.o \
-	miscemu/miscemu.o
-
-LIBOBJS = \
-	toolkit/toolkit.o
-
-#ifndef WINELIB
-SUBDIRS = $(COMMONSUBDIRS) $(EMUSUBDIRS)
-OBJS = $(EMUOBJS) $(COMMONOBJS)
-#else
-SUBDIRS = $(COMMONSUBDIRS) $(LIBSUBDIRS)
-OBJS = $(LIBOBJS) $(COMMONOBJS)
-#endif
-
-#ifdef i386BsdArchitecture
-SYSLIBS = -ll -lm -li386 -lgnumalloc
-#endif
-#if defined(i386FreeBsd) || defined(FreeBSDArchitecture)
-SYSLIBS = -ll -lm -lgnumalloc
-#endif
-#ifdef LinuxArchitecture
-SYSLIBS = -lm -lg
-#endif
-
-/* You may need to add the full path of your libXpm here */
-XPM_LIB = -lXpm
-
-#ifdef MALLOC_DEBUGGING
-MALLOCLIB = -lmcheck
-#else
-MALLOCLIB =
-#endif
-
-MakeSubdirs($(SUBDIRS))
-DependSubdirs($(SUBDIRS))
-
-#ifndef WINELIB
-NormalProgramTarget(wine,$(OBJS),$(DEPXLIB),$(XPM_LIB) $(XLIB),$(MALLOCLIB) $(SYSLIBS))
-AllTarget(wine.sym)
-#else
-NormalLibraryTarget(wine,$(OBJS))
-#endif
-
-wine.sym: wine
-	nm wine|grep -v _compiled|sort >wine.sym
-
-clean::
-	$(RM) wine.sym
-
-depend::
-
-install::
-
-etags::
-	etags `find . -name '*.[chS]' -print`
-
-distclean: clean
-	echo "/* autoconf.h generated automatically.  Run Configure */" >autoconf.h
-	echo "#error You must run Configure before you can build the makefiles." >>autoconf.h
-	$(RM) config.* `find . -name Makefile -print`
diff --git a/Make.rules.in b/Make.rules.in
index c618c50c3dc..7894d2b5755 100644
--- a/Make.rules.in
+++ b/Make.rules.in
@@ -10,7 +10,7 @@ YACC      = @YACC@
 LEX       = @LEX@
 LEXLIB    = @LEXLIB@
 DIVINCL   = -I$(TOPSRC)/include
-ALLCFLAGS = $(CFLAGS) $(DEFS) $(LANG) $(X_CFLAGS) $(DIVINCL) $(EXTRA_DEFS)
+ALLCFLAGS = $(CFLAGS) $(DEFS) -ALANG\($(LANG)\) $(X_CFLAGS) $(DIVINCL) $(EXTRA_DEFS)
 LDCOMBINE = ld -r
 RM        = rm -f
 @SET_MAKE@
diff --git a/Makefile.in b/Makefile.in
index 5559dd93b41..130f12fc024 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -28,12 +28,12 @@ RM        = rm -f
 
 MAIN_TARGET = @MAIN_TARGET@
 
-COMMONSUBDIRS = rc controls ipc loader misc multimedia objects windows
+COMMONSUBDIRS = rc controls ipc loader misc multimedia objects win32 windows
 
 EMUSUBDIRS = tools debugger debugger/readline if1632 memory miscemu
 
 LIBSUBDIRS = toolkit
- 
+
 ALLSUBDIRS = $(COMMONSUBDIRS) $(EMUSUBDIRS) $(LIBSUBDIRS)
 
 COMMONOBJS = \
@@ -44,6 +44,7 @@ COMMONOBJS = \
 	multimedia/multimedia.o \
 	objects/objects.o \
 	rc/rc.o \
+	win32/win32.o \
 	windows/windows.o
 
 EMUOBJS = \
@@ -90,5 +91,5 @@ distclean:
 langclean:
 	for i in $(ALLSUBDIRS); do (cd $$i; $(MAKE) langclean); done
 	$(RM) wine wine.sym winelib.a
-	
+
 dummy:
diff --git a/README b/README
index 6dc6d642a9e..e00a1776415 100644
--- a/README
+++ b/README
@@ -22,7 +22,7 @@ it are probably available on the ftp site where you got Wine. They can
 also be found on ftp.x.org and all its mirror sites.
 
 To build Wine, first do a "./configure" and then a "make depend; make".
- The executable "wine" will be built.  "wine" will load and run 16-bit
+The executable "wine" will be built.  "wine" will load and run 16-bit
 Windows executables.
 
 To upgrade to a new release by using a patch file, first cd to the
@@ -104,20 +104,15 @@ Used to specify the devices which are used as lpt1 - lpt8.
 
 * [spy]
 
-format: file = <filename or CON when logging to stdout>
+format: exclude = <message names and/or EXCLUDEALL separated by commas >
 default: none
 
-used to specify the file which will be used as logfile.
+Used to specify which messages will be excluded from the message logging.
 
-format: exclude = <message names separated by semicolons>
+format: include = <message names and/or INCLUDEALL separated by commas >
 default: none
 
-Used to specify which messages will be excluded from the logfile.
-
-format: include = <message names separated by semicolons>
-default: none
-
-Used to specify which messages will be included in the logfile.
+Used to specify which messages will be included in the message logging.
 
 
 4. RUNNING PROGRAMS
diff --git a/Wine.man b/Wine.man
index aeb14634e6a..789a5035e15 100644
--- a/Wine.man
+++ b/Wine.man
@@ -319,8 +319,8 @@ Main configuration file for wine.
 Changes in Wine, since the beginning (most recent changes first)
 .TP
 .I configure
-Shell script to automatically generate Makefiles.  Usually followed by make 
-(or gmake on *BSD systems) to compile wine.
+Shell script to automatically generate Makefiles.  Usually followed by
+make to compile wine.
 .TP
 .I Wine newsgroup
 Subscribe to comp.emulators.ms-windows.wine
diff --git a/configure b/configure
index e3760c84096..73944bc8798 100755
--- a/configure
+++ b/configure
@@ -15,7 +15,7 @@ ac_default_prefix=/usr/local
 ac_help="$ac_help
   --with-library          build Wine as a library instead of an emulator"
 ac_help="$ac_help
-  --with-language=LANG    change the default language (LANG=En/De/No/Es)"
+  --with-language=LANG    change the language (LANG=En/De/Fr/Es/No/Fi/Da)"
 ac_help="$ac_help
   --with-ipc              use inter-process communication for DDE"
 ac_help="$ac_help
@@ -431,9 +431,9 @@ fi
 # Check whether --with-language or --without-language was given.
 withval="$with_language"
 if test -n "$withval"; then
-  LANG="-ALANG\($withval\)"
+  LANG="$withval"
 else
-  LANG="-ALANG\(En\)"
+  LANG=En
 fi
 
 
@@ -1556,7 +1556,7 @@ fi
 
 
 if test -z "${top_srcdir}"; then
-TOP_SRCDIR="."
+TOP_SRCDIR=`pwd`
 else
 TOP_SRCDIR="${top_srcdir}"
 fi
@@ -1689,7 +1689,7 @@ done
 
 ac_given_srcdir=$srcdir
 
-trap 'rm -fr `echo "Make.rules controls/Makefile ipc/Makefile loader/Makefile memory/Makefile misc/Makefile miscemu/Makefile multimedia/Makefile objects/Makefile windows/Makefile rc/Makefile debugger/Makefile debugger/readline/Makefile tools/Makefile if1632/Makefile toolkit/Makefile Makefile" | sed "s/:[^ ]*//g"` conftest*; exit 1' 1 2 15
+trap 'rm -fr `echo "Make.rules controls/Makefile ipc/Makefile loader/Makefile memory/Makefile misc/Makefile miscemu/Makefile multimedia/Makefile objects/Makefile win32/Makefile windows/Makefile rc/Makefile debugger/Makefile debugger/readline/Makefile tools/Makefile if1632/Makefile toolkit/Makefile Makefile" | sed "s/:[^ ]*//g"` conftest*; exit 1' 1 2 15
 
 # Protect against being on the right side of a sed subst in config.status. 
 sed 's/%@/@@/; s/@%/@@/; s/%g$/@g/; /@g$/s/[\\\\&%]/\\\\&/g; 
@@ -1726,7 +1726,7 @@ CEOF
 EOF
 cat >> $CONFIG_STATUS <<EOF
 
-CONFIG_FILES=\${CONFIG_FILES-"Make.rules controls/Makefile ipc/Makefile loader/Makefile memory/Makefile misc/Makefile miscemu/Makefile multimedia/Makefile objects/Makefile windows/Makefile rc/Makefile debugger/Makefile debugger/readline/Makefile tools/Makefile if1632/Makefile toolkit/Makefile Makefile"}
+CONFIG_FILES=\${CONFIG_FILES-"Make.rules controls/Makefile ipc/Makefile loader/Makefile memory/Makefile misc/Makefile miscemu/Makefile multimedia/Makefile objects/Makefile win32/Makefile windows/Makefile rc/Makefile debugger/Makefile debugger/readline/Makefile tools/Makefile if1632/Makefile toolkit/Makefile Makefile"}
 EOF
 cat >> $CONFIG_STATUS <<\EOF
 for ac_file in .. $CONFIG_FILES; do if test "x$ac_file" != x..; then
diff --git a/configure.in b/configure.in
index 5154cd76b7f..8460d1d836d 100644
--- a/configure.in
+++ b/configure.in
@@ -16,9 +16,9 @@ AC_ARG_WITH(library,
 AC_SUBST(MAIN_TARGET)
 
 AC_ARG_WITH(language,
-[  --with-language=LANG    change the default language (LANG=En/De/No/Es)],
-[LANG="-ALANG\($withval\)"],
-[LANG="-ALANG\(En\)"],)
+[  --with-language=LANG    change the language (LANG=En/De/Fr/Es/No/Fi/Da)],
+[LANG="$withval"],
+[LANG=En],)
 AC_SUBST(LANG)
 
 AC_ARG_WITH(ipc,
@@ -45,7 +45,7 @@ AC_C_CONST()
 AC_TYPE_SIZE_T()
 
 if test -z "${top_srcdir}"; then
-TOP_SRCDIR="."
+TOP_SRCDIR=`pwd`
 else
 TOP_SRCDIR="${top_srcdir}"
 fi
@@ -77,7 +77,7 @@ AC_DEFINE_UNQUOTED(WINE_INI_GLOBAL,$WINE_INI_GLOBAL)
 MAKE_RULES=$TOP_SRCDIR/Make.rules
 AC_SUBST_FILE(MAKE_RULES)
 
-AC_OUTPUT(Make.rules controls/Makefile ipc/Makefile loader/Makefile memory/Makefile misc/Makefile miscemu/Makefile multimedia/Makefile objects/Makefile windows/Makefile rc/Makefile debugger/Makefile debugger/readline/Makefile tools/Makefile if1632/Makefile toolkit/Makefile Makefile)
+AC_OUTPUT(Make.rules controls/Makefile ipc/Makefile loader/Makefile memory/Makefile misc/Makefile miscemu/Makefile multimedia/Makefile objects/Makefile win32/Makefile windows/Makefile rc/Makefile debugger/Makefile debugger/readline/Makefile tools/Makefile if1632/Makefile toolkit/Makefile Makefile)
 
 echo
 echo "Configure finished.  Do 'make depend; make' to compile Wine."
diff --git a/controls/Imakefile b/controls/Imakefile
deleted file mode 100644
index 582965b3f38..00000000000
--- a/controls/Imakefile
+++ /dev/null
@@ -1,23 +0,0 @@
-#include "../Wine.tmpl"
-
-MODULE = controls
-
-SRCS = \
-	button.c \
-	combo.c \
-	desktop.c \
-	edit.c \
-	listbox.c \
-	menu.c \
-	scroll.c \
-	static.c \
-	widgets.c
-
-OBJS = $(SRCS:.c=.o)
-
-WineRelocatableTarget($(MODULE),,$(OBJS))
-DependTarget()
-
-includes::
-
-install::
diff --git a/controls/button.c b/controls/button.c
index b33900afaf0..087a7d726d5 100644
--- a/controls/button.c
+++ b/controls/button.c
@@ -68,7 +68,7 @@ static HBITMAP hbitmapCheckBoxes = 0;
 static WORD checkBoxWidth = 0, checkBoxHeight = 0;
 
 
-LONG ButtonWndProc(HWND hWnd, WORD uMsg, WORD wParam, LONG lParam)
+LRESULT ButtonWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
 {
         RECT rect;
 	LONG lResult = 0;
@@ -156,8 +156,14 @@ LONG ButtonWndProc(HWND hWnd, WORD uMsg, WORD wParam, LONG lParam)
                                      ((infoPtr->state & 3) + 1), 0 );
                         break;
                     }
+#ifdef WINELIB32
+                    SendMessage( GetParent(hWnd), WM_COMMAND,
+                                 MAKEWPARAM(wndPtr->wIDmenu,BN_CLICKED),
+				 (LPARAM) hWnd );
+#else
                     SendMessage( GetParent(hWnd), WM_COMMAND,
                                  wndPtr->wIDmenu, MAKELPARAM(hWnd,BN_CLICKED));
+#endif
                 }
 		break;
 
@@ -182,13 +188,13 @@ LONG ButtonWndProc(HWND hWnd, WORD uMsg, WORD wParam, LONG lParam)
 		return 0;
 
         case WM_SETFONT:
-                infoPtr->hFont = wParam;
+                infoPtr->hFont = (HFONT) wParam;
                 if (lParam)
                     PAINT_BUTTON( hWnd, style, ODA_DRAWENTIRE );
                 break;
 
         case WM_GETFONT:
-                return infoPtr->hFont;
+                return (LONG) infoPtr->hFont;
 
 	case WM_SETFOCUS:
                 infoPtr->state |= BUTTON_HASFOCUS;
@@ -269,8 +275,13 @@ static void PB_Paint( HWND hButton, HDC hDC, WORD action )
 
       /* Send WM_CTLCOLOR to allow changing the font (the colors are fixed) */
     if (infoPtr->hFont) SelectObject( hDC, infoPtr->hFont );
+#ifdef WINELIB32
+    SendMessage( GetParent(hButton), WM_CTLCOLORBTN,
+		 (WPARAM)hDC, (LPARAM)hButton );
+#else
     SendMessage( GetParent(hButton), WM_CTLCOLOR, (WORD)hDC,
                  MAKELPARAM(hButton, CTLCOLOR_BTN) );
+#endif
     hOldPen = (HPEN)SelectObject(hDC, sysColorObjects.hpenWindowFrame);
     hOldBrush = (HBRUSH)SelectObject(hDC, sysColorObjects.hbrushBtnFace);
     SetBkMode(hDC, TRANSPARENT);
@@ -302,7 +313,7 @@ static void PB_Paint( HWND hButton, HDC hDC, WORD action )
     else GRAPH_DrawReliefRect( hDC, &rc, 2, 2, FALSE );
     
     /* draw button label, if any: */
-    text = USER_HEAP_LIN_ADDR( wndPtr->hText );
+    text = (char*) USER_HEAP_LIN_ADDR( wndPtr->hText );
     if (text[0])
     {
         SetTextColor( hDC, (wndPtr->dwStyle & WS_DISABLED) ?
@@ -347,13 +358,18 @@ static void CB_Paint( HWND hWnd, HDC hDC, WORD action )
     GetClientRect(hWnd, &rc);
 
     if (infoPtr->hFont) SelectObject( hDC, infoPtr->hFont );
+#ifdef WINELIB32 /* JBP: Different in Win32 */
+    hBrush = (HBRUSH) SendMessage(GetParent(hWnd), WM_CTLCOLORBTN, (WPARAM)hDC,
+				  (LPARAM)hWnd);
+#else
     hBrush = SendMessage(GetParent(hWnd), WM_CTLCOLOR, (WORD)hDC,
 			 MAKELPARAM(hWnd, CTLCOLOR_BTN));
+#endif
     if (action == ODA_DRAWENTIRE) FillRect(hDC, &rc, hBrush);
 
     GetTextMetrics(hDC, &tm);
     delta = (rc.bottom - rc.top - tm.tmHeight) >> 1;
-    text = USER_HEAP_LIN_ADDR( wndPtr->hText );
+    text = (char*) USER_HEAP_LIN_ADDR( wndPtr->hText );
     textlen = strlen( text );
 
       /* Draw the check-box bitmap */
@@ -421,8 +437,12 @@ static void GB_Paint( HWND hWnd, HDC hDC, WORD action )
     if (action != ODA_DRAWENTIRE) return;
 
     if (infoPtr->hFont) SelectObject( hDC, infoPtr->hFont );
+#ifdef WINELIB32
+    SendMessage( GetParent(hWnd), WM_CTLCOLORBTN, (WPARAM)hDC, (LPARAM)hWnd );
+#else
     SendMessage( GetParent(hWnd), WM_CTLCOLOR, (WORD)hDC,
 		 MAKELPARAM(hWnd, CTLCOLOR_BTN));
+#endif
     SelectObject( hDC, sysColorObjects.hpenWindowFrame );
 
     GetClientRect(hWnd, &rc);
@@ -433,7 +453,7 @@ static void GB_Paint( HWND hWnd, HDC hDC, WORD action )
     LineTo( hDC, rc.left, rc.bottom-1 );
     LineTo( hDC, rc.left, rc.top+2 );
 
-    text = USER_HEAP_LIN_ADDR( wndPtr->hText );
+    text = (char*) USER_HEAP_LIN_ADDR( wndPtr->hText );
     GetTextExtentPoint(hDC, text, strlen(text), &size);
     rc.left  += 10;
     rc.right  = rc.left + size.cx + 1;
@@ -460,8 +480,13 @@ static void UB_Paint( HWND hWnd, HDC hDC, WORD action )
     GetClientRect(hWnd, &rc);
 
     if (infoPtr->hFont) SelectObject( hDC, infoPtr->hFont );
+#ifdef WINELIB32
+    hBrush = (HBRUSH) SendMessage(GetParent(hWnd), WM_CTLCOLORBTN, (WPARAM)hDC,
+				  (LPARAM)hWnd);
+#else
     hBrush = SendMessage(GetParent(hWnd), WM_CTLCOLOR, (WORD)hDC,
 			 MAKELPARAM(hWnd, CTLCOLOR_BTN));
+#endif
     FillRect(hDC, &rc, hBrush);
 
     if ((action == ODA_FOCUS) ||
@@ -491,5 +516,5 @@ static void OB_Paint( HWND hWnd, HDC hDC, WORD action )
     dis.hDC        = hDC;
     GetClientRect( hWnd, &dis.rcItem );
     dis.itemData   = 0;
-    SendMessage(GetParent(hWnd), WM_DRAWITEM, 1, MAKE_SEGPTR(&dis) );
+    SendMessage(GetParent(hWnd), WM_DRAWITEM, 1, (LPARAM) MAKE_SEGPTR(&dis) );
 }
diff --git a/controls/combo.c b/controls/combo.c
index 77374cd82be..aab97f53932 100644
--- a/controls/combo.c
+++ b/controls/combo.c
@@ -131,7 +131,7 @@ static LONG CBCreate(HWND hwnd, WORD wParam, LONG lParam)
     lphc->hWndEdit = CreateWindow(MAKE_SEGPTR(editName), (SEGPTR)0, 
 				  WS_CHILD | WS_CLIPCHILDREN | WS_VISIBLE | SS_LEFT,
 				  0, 0, rect.right, lphl->StdItemHeight,
-				  hwnd, 1, GetWindowWord(hwnd,GWW_HINSTANCE), 0L);
+				  hwnd, (HMENU)1, WIN_GetWindowInstance(hwnd), 0L);
     break;
    case CBS_DROPDOWN:          /* edit control, dropdown listbox     */
     dprintf_combo(stddeb,"CBS_DROPDOWN\n");
@@ -145,7 +145,7 @@ static LONG CBCreate(HWND hwnd, WORD wParam, LONG lParam)
     lphc->hWndEdit = CreateWindow(MAKE_SEGPTR(editName), (SEGPTR)0,
 				  WS_CHILD | WS_CLIPCHILDREN | WS_VISIBLE | SS_LEFT,
 				  0, 0, lphc->RectButton.left, lphl->StdItemHeight,
-				  hwnd, 1, GetWindowWord(hwnd,GWW_HINSTANCE), 0L);
+				  hwnd, (HMENU)1, WIN_GetWindowInstance(hwnd), 0L);
     break;
    case CBS_DROPDOWNLIST:      /* static control, downdown listbox   */
     dprintf_combo(stddeb,"CBS_DROPDOWNLIST\n");
@@ -167,10 +167,10 @@ static LONG CBCreate(HWND hwnd, WORD wParam, LONG lParam)
 				lboxrect.left, lboxrect.top,
 				lboxrect.right - lboxrect.left, 
 				lboxrect.bottom - lboxrect.top,
-				0, 0, GetWindowWord(hwnd,GWW_HINSTANCE),
-				(SEGPTR)MAKELONG(hwnd, hwnd));
+				0, 0, WIN_GetWindowInstance(hwnd),
+				(SEGPTR)hwnd );
   ShowWindow(lphc->hWndLBox, SW_HIDE);
-  dprintf_combo(stddeb,"Combo Creation LBox=%X!\n", lphc->hWndLBox);
+  dprintf_combo(stddeb,"Combo Creation LBox="NPFMT"!\n", lphc->hWndLBox);
   return 0;
 }
 
@@ -220,8 +220,13 @@ static LONG CBPaint(HWND hwnd, WORD wParam, LONG lParam)
 
   hOldFont = SelectObject(hdc, lphl->hFont);
 
+#ifdef WINELIB32
+  hBrush = (HBRUSH) SendMessage(lphl->hParent, WM_CTLCOLORLISTBOX, (WPARAM)hdc,
+				(LPARAM)hwnd);
+#else
   hBrush = SendMessage(lphl->hParent, WM_CTLCOLOR, hdc,
 		       MAKELONG(hwnd, CTLCOLOR_LISTBOX));
+#endif
   if (hBrush == 0) hBrush = GetStockObject(WHITE_BRUSH);
 
   GetClientRect(hwnd, &rect);
@@ -512,14 +517,14 @@ static LONG CBSetRedraw(HWND hwnd, WORD wParam, LONG lParam)
 /***********************************************************************
  *           CBSetFont
  */
-static LONG CBSetFont(HWND hwnd, WORD wParam, LONG lParam)
+static LONG CBSetFont(HWND hwnd, WPARAM wParam, LPARAM lParam)
 {
   LPHEADLIST  lphl = ComboGetListHeader(hwnd);
 
   if (wParam == 0)
     lphl->hFont = GetStockObject(SYSTEM_FONT);
   else
-    lphl->hFont = wParam;
+    lphl->hFont = (HFONT)wParam;
 
   return 0;
 }
@@ -588,7 +593,7 @@ static LONG CBShowDropDown(HWND hwnd, WORD wParam, LONG lParam)
 /***********************************************************************
  *           ComboWndProc
  */
-LONG ComboBoxWndProc(HWND hwnd, WORD message, WORD wParam, LONG lParam)
+LRESULT ComboBoxWndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
 {
     switch(message) {	
      case WM_NCCREATE: return CBNCCreate(hwnd, wParam, lParam);
@@ -629,7 +634,11 @@ LONG ComboBoxWndProc(HWND hwnd, WORD message, WORD wParam, LONG lParam)
 
 HWND CLBoxGetCombo(HWND hwnd)
 {
-  return GetWindowWord(hwnd,0);
+#ifdef WINELIB32
+  return (HWND)GetWindowLong(hwnd,0);
+#else
+  return (HWND)GetWindowWord(hwnd,0);
+#endif
 }
 
 LPHEADLIST CLBoxGetListHeader(HWND hwnd)
@@ -735,8 +744,13 @@ static LONG CBLPaint( HWND hwnd, WORD wParam, LONG lParam )
   }
 
   hOldFont = SelectObject(hdc, lphl->hFont);
+#ifdef WINELIB32
+  hBrush = (HBRUSH) SendMessage(lphl->hParent, WM_CTLCOLORLISTBOX, (WPARAM)hdc,
+				(LPARAM)hwnd);
+#else
   hBrush = SendMessage(lphl->hParent, WM_CTLCOLOR, hdc,
 		       MAKELONG(hwnd, CTLCOLOR_LISTBOX));
+#endif
 
   if (hBrush == 0) hBrush = GetStockObject(WHITE_BRUSH);
 
@@ -835,10 +849,16 @@ static LONG CBLLButtonUp( HWND hwnd, WORD wParam, LONG lParam )
 
   if (GetCapture() == hwnd) ReleaseCapture();
 
-  if (lphl->PrevFocused != lphl->ItemFocused) {
-    SendMessage(CLBoxGetCombo(hwnd),CB_SETCURSEL,lphl->ItemFocused,0);
-    ListBoxSendNotification(lphl, CLBoxGetCombo(hwnd), CBN_SELCHANGE);
-  }
+  if(!lphl)
+     {
+      fprintf(stdnimp,"CBLLButtonUp: CLBoxGetListHeader returned NULL!\n");
+     }
+  else if (lphl->PrevFocused != lphl->ItemFocused) 
+          {
+      		SendMessage(CLBoxGetCombo(hwnd),CB_SETCURSEL,lphl->ItemFocused,0);
+      		ListBoxSendNotification(lphl, CLBoxGetCombo(hwnd), CBN_SELCHANGE);
+     	  }
+
   SendMessage(CLBoxGetCombo(hwnd),CB_SHOWDROPDOWN,0,0);
 
   return 0;
@@ -938,7 +958,7 @@ static LONG CBLVScroll( HWND hwnd, WORD wParam, LONG lParam )
 /***********************************************************************
  *           ComboLBoxWndProc
  */
-LONG ComboLBoxWndProc(HWND hwnd, WORD message, WORD wParam, LONG lParam)
+LRESULT ComboLBoxWndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
 {
     switch(message) {	
      case WM_CREATE: return CBLCreate(hwnd, wParam, lParam);
@@ -961,7 +981,7 @@ LONG ComboLBoxWndProc(HWND hwnd, WORD message, WORD wParam, LONG lParam)
  */
 BOOL DlgDirSelectComboBox(HWND hDlg, LPSTR lpStr, int nIDLBox)
 {
-	fprintf(stdnimp,"DlgDirSelectComboBox(%04X, '%s', %d) \n",	
+	fprintf(stdnimp,"DlgDirSelectComboBox("NPFMT", '%s', %d) \n",
 				hDlg, lpStr, nIDLBox);
 	return TRUE;
 }
@@ -976,8 +996,8 @@ int DlgDirListComboBox(HWND hDlg, SEGPTR PathSpec,
   HWND	hWnd;
   int ret;
   LPSTR lpPathSpec = PTR_SEG_TO_LIN(PathSpec);
-  
-  dprintf_combo(stddeb,"DlgDirListComboBox(%04X, '%s', %d, %d, %04X) \n",
+
+  dprintf_combo(stddeb,"DlgDirListComboBox("NPFMT", '%s', %d, %d, %04X) \n",
 		  hDlg, lpPathSpec, nIDLBox, nIDStat, wType);
   if (nIDLBox) {
     LPHEADLIST lphl;
@@ -1003,13 +1023,13 @@ int DlgDirListComboBox(HWND hDlg, SEGPTR PathSpec,
 	temp[1] = 'A'+drive;
 	temp[2] = ':';
 	SendDlgItemMessage( hDlg, nIDStat, WM_SETTEXT, 0,
-                            USER_HEAP_SEG_ADDR(hTemp) + 1 );
+                            (LPARAM)(USER_HEAP_SEG_ADDR(hTemp) + 1) );
       } else {
 	temp[0] = 'A'+drive;
 	temp[1] = ':';
 	temp[2] = '\\';
 	SendDlgItemMessage( hDlg, nIDStat, WM_SETTEXT, 0,
-                            USER_HEAP_SEG_ADDR(hTemp) );
+                            (LPARAM)USER_HEAP_SEG_ADDR(hTemp) );
       }
       USER_HEAP_FREE( hTemp );
   } 
diff --git a/controls/desktop.c b/controls/desktop.c
index 096092e0107..ef9377b9aa8 100644
--- a/controls/desktop.c
+++ b/controls/desktop.c
@@ -118,7 +118,7 @@ static LONG DESKTOP_DoEraseBkgnd( HWND hwnd, HDC hdc, DESKTOPINFO *infoPtr )
  *
  * Window procedure for the desktop window.
  */
-LONG DesktopWndProc ( HWND hwnd, WORD message, WORD wParam, LONG lParam )
+LRESULT DesktopWndProc ( HWND hwnd, WORD message, WPARAM wParam, LPARAM lParam )
 {
     WND *wndPtr = WIN_FindWndPtr( hwnd );
     DESKTOPINFO *infoPtr = (DESKTOPINFO *)wndPtr->wExtra;
diff --git a/controls/edit.c b/controls/edit.c
index 943321f5c47..957c8707c7d 100644
--- a/controls/edit.c
+++ b/controls/edit.c
@@ -20,9 +20,16 @@
 #include "debug.h"
 
 
+#ifdef WINELIB32
+#define NOTIFY_PARENT(hWndCntrl, wNotifyCode) \
+	SendMessage(GetParent(hWndCntrl), WM_COMMAND, \
+		    MAKEWPARAM(GetDlgCtrlID(hWndCntrl),wNotifyCode), \
+		    (LPARAM)hWndCntrl );
+#else
 #define NOTIFY_PARENT(hWndCntrl, wNotifyCode) \
 	SendMessage(GetParent(hWndCntrl), WM_COMMAND, \
 		 GetDlgCtrlID(hWndCntrl), MAKELPARAM(hWndCntrl, wNotifyCode));
+#endif
 
 #define MAXTEXTLEN 30000   /* maximum text buffer length */
 #define EDITLEN     1024   /* starting length for multi-line control */
@@ -95,12 +102,12 @@ static int ButtonCol;              /* col in text buffer when button pressed */
  *
  *  Allocate the specified number of bytes on the specified local heap.
  */
-static unsigned int EDIT_HeapAlloc(HWND hwnd, int bytes, WORD flags)
+static HLOCAL EDIT_HeapAlloc(HWND hwnd, int bytes, WORD flags)
 {
-    unsigned int ret;
+    HLOCAL ret;
 
-    ret = LOCAL_Alloc( GetWindowWord(hwnd,GWW_HINSTANCE), flags, bytes );
-    if (ret == 0)
+    ret = LOCAL_Alloc( WIN_GetWindowInstance(hwnd), flags, bytes );
+    if (!ret)
         printf("EDIT_HeapAlloc: Out of heap-memory\n");
     return ret;
 }
@@ -110,10 +117,10 @@ static unsigned int EDIT_HeapAlloc(HWND hwnd, int bytes, WORD flags)
  *
  *  Return the address of the memory pointed to by the handle.
  */
-static void *EDIT_HeapLock(HWND hwnd, unsigned int handle)
+static void *EDIT_HeapLock(HWND hwnd, HANDLE handle)
 {
-    WORD hinstance = GetWindowWord( hwnd, GWW_HINSTANCE );
-    WORD offs;
+    HINSTANCE hinstance = WIN_GetWindowInstance( hwnd );
+    HANDLE offs;
     
     if (handle == 0) return 0;
     offs = LOCAL_Lock( hinstance, handle );
@@ -123,10 +130,10 @@ static void *EDIT_HeapLock(HWND hwnd, unsigned int handle)
 /*********************************************************************
  *  EDIT_HeapUnlock
  */
-static void EDIT_HeapUnlock(HWND hwnd, unsigned int handle)
+static void EDIT_HeapUnlock(HWND hwnd, HANDLE handle)
 {
     if (handle == 0) return;
-    LOCAL_Unlock( GetWindowWord( hwnd, GWW_HINSTANCE ), handle );
+    LOCAL_Unlock( WIN_GetWindowInstance( hwnd ), handle );
 }
 
 /*********************************************************************
@@ -134,9 +141,9 @@ static void EDIT_HeapUnlock(HWND hwnd, unsigned int handle)
  *
  *  Reallocate the memory pointed to by the handle.
  */
-static unsigned int EDIT_HeapReAlloc(HWND hwnd, unsigned int handle, int bytes)
+static HLOCAL EDIT_HeapReAlloc(HWND hwnd, HANDLE handle, int bytes)
 {
-    return LOCAL_ReAlloc( GetWindowWord(hwnd,GWW_HINSTANCE), handle, bytes, 
+    return LOCAL_ReAlloc( WIN_GetWindowInstance(hwnd), handle, bytes, 
 			  LMEM_FIXED );
 }
 
@@ -146,9 +153,9 @@ static unsigned int EDIT_HeapReAlloc(HWND hwnd, unsigned int handle, int bytes)
  *
  *  Frees the memory pointed to by the handle.
  */
-static void EDIT_HeapFree(HWND hwnd, unsigned int handle)
+static void EDIT_HeapFree(HWND hwnd, HANDLE handle)
 {
-    LOCAL_Free( GetWindowWord(hwnd,GWW_HINSTANCE), handle );
+    LOCAL_Free( WIN_GetWindowInstance(hwnd), handle );
 }
 
 
@@ -157,9 +164,9 @@ static void EDIT_HeapFree(HWND hwnd, unsigned int handle)
  *
  *  Return the size of the given object on the local heap.
  */
-static unsigned int EDIT_HeapSize(HWND hwnd, unsigned int handle)
+static unsigned int EDIT_HeapSize(HWND hwnd, HANDLE handle)
 {
-    return LOCAL_Size( GetWindowWord(hwnd,GWW_HINSTANCE), handle );
+    return LOCAL_Size( WIN_GetWindowInstance(hwnd), handle );
 }
 
 /********************************************************************
@@ -470,8 +477,12 @@ static void EDIT_WriteText(HWND hwnd, char *lp, int off, int len, int row,
     else
         oldfont = 0;		/* -Wall does not see the use of if */
 
-    SendMessage(GetParent(hwnd), WM_CTLCOLOR, (WORD)hdc,
+#ifdef WINELIB32
+    SendMessage(GetParent(hwnd), WM_CTLCOLOREDIT, (WPARAM)hdc, (LPARAM)hwnd);
+#else
+    SendMessage(GetParent(hwnd), WM_CTLCOLOR, (WPARAM)hdc,
 		MAKELPARAM(hwnd, CTLCOLOR_EDIT));
+#endif
 
     if (reverse)
     {
@@ -1840,13 +1851,13 @@ static LONG EDIT_UndoMsg(HWND hwnd)
 /*********************************************************************
  *  EM_SETHANDLE message function
  */
-static void EDIT_SetHandleMsg(HWND hwnd, WORD wParam)
+static void EDIT_SetHandleMsg(HWND hwnd, WPARAM wParam)
 {
     EDITSTATE *es = EDIT_GetEditState(hwnd);
 
     if (IsMultiLine(hwnd))
     {
-	es->hText = wParam;
+	es->hText = (HANDLE)wParam;
 	es->textlen = EDIT_HeapSize(hwnd, es->hText);
 	es->wlines = 0;
 	es->wtop = es->wleft = 0;
@@ -1856,8 +1867,8 @@ static void EDIT_SetHandleMsg(HWND hwnd, WORD wParam)
 	es->textwidth = 0;
 	es->SelBegLine = es->SelBegCol = 0;
 	es->SelEndLine = es->SelEndCol = 0;
-	dprintf_edit(stddeb, "EDIT_SetHandleMsg: handle %04x, textlen=%d\n",
-		     wParam, es->textlen);
+	dprintf_edit(stddeb, "EDIT_SetHandleMsg: handle %04lx, textlen=%d\n",
+		     (DWORD)wParam, es->textlen);
 
 	EDIT_BuildTextPointers(hwnd);
 	es->PaintBkgd = TRUE;
@@ -2107,14 +2118,14 @@ static void EDIT_SetSelMsg(HWND hwnd, WORD wParam, LONG lParam)
 /*********************************************************************
  *  WM_SETFONT
  */
-static void EDIT_WM_SetFont(HWND hwnd, WORD wParam, LONG lParam)
+static void EDIT_WM_SetFont(HWND hwnd, WPARAM wParam, LPARAM lParam)
 {
     HDC hdc;
     TEXTMETRIC tm;
     HFONT oldfont;
     EDITSTATE *es = EDIT_GetEditState(hwnd);
 
-    es->hFont = wParam;
+    es->hFont = (HANDLE)wParam;
     hdc = GetDC(hwnd);
     oldfont = (HFONT)SelectObject(hdc, (HANDLE)es->hFont);
     GetCharWidth(hdc, 0, 255, es->CharWidths);
@@ -2174,7 +2185,7 @@ static void EDIT_WM_Paint(HWND hwnd)
 	   rc.right, rc.bottom);
 
     if (es->PaintBkgd)
-	FillWindow(GetParent(hwnd), hwnd, hdc, CTLCOLOR_EDIT);
+	FillWindow(GetParent(hwnd), hwnd, hdc, (HBRUSH)CTLCOLOR_EDIT);
 
     for (y = (rc.top / es->txtht); y <= (rc.bottom / es->txtht); y++)
     {
@@ -2607,7 +2618,7 @@ static LONG EDIT_WM_SetText(HWND hwnd, LONG lParam)
 /*********************************************************************
  * EditWndProc()
  */
-LONG EditWndProc(HWND hwnd, WORD uMsg, WORD wParam, LONG lParam)
+LRESULT EditWndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
 {
     LONG lResult = 0;
     char *textPtr;
@@ -2616,7 +2627,7 @@ LONG EditWndProc(HWND hwnd, WORD uMsg, WORD wParam, LONG lParam)
 
     switch (uMsg) {
     case EM_CANUNDO:
-	lResult = es->hDeletedText;
+	lResult = (LONG)es->hDeletedText;
 	break;
 	
     case EM_EMPTYUNDOBUFFER:
@@ -2636,7 +2647,7 @@ LONG EditWndProc(HWND hwnd, WORD uMsg, WORD wParam, LONG lParam)
 	break;
 
     case EM_GETHANDLE:
-	lResult = es->hText;
+	lResult = (LONG)es->hText;
 	break;
 
     case EM_GETLINE:
diff --git a/controls/listbox.c b/controls/listbox.c
index 1a081f02f90..393f497c06a 100644
--- a/controls/listbox.c
+++ b/controls/listbox.c
@@ -118,8 +118,13 @@ static LPHEADLIST ListBoxGetStorageHeader(HWND hwnd)
 void ListBoxSendNotification(LPHEADLIST lphl, HWND hwnd, WORD code)
 {
   if (lphl->dwStyle & LBS_NOTIFY)
+#ifdef WINELIB32
+    SendMessage(lphl->hParent, WM_COMMAND,
+		MAKEWPARAM(lphl->CtlID,code), (LPARAM)hwnd);
+#else
     SendMessage(lphl->hParent, WM_COMMAND,
 		lphl->CtlID, MAKELONG(hwnd, code));
+#endif
 }
 
 
@@ -274,7 +279,7 @@ void ListBoxAskMeasure(LPHEADLIST lphl, LPLISTSTRUCT lpls)
  
   *lpmeasure = lpls->mis;
   lpmeasure->itemHeight = lphl->StdItemHeight;
-  SendMessage(lphl->hParent, WM_MEASUREITEM, 0, USER_HEAP_SEG_ADDR(hTemp));
+  SendMessage(lphl->hParent, WM_MEASUREITEM, 0, (LPARAM)USER_HEAP_SEG_ADDR(hTemp));
 
   if (lphl->dwStyle & LBS_OWNERDRAWFIXED) {
     lphl->StdItemHeight = lpmeasure->itemHeight;
@@ -898,8 +903,14 @@ static LONG LBRButtonUp(HWND hwnd, WORD wParam, LONG lParam)
 {
   LPHEADLIST lphl = ListBoxGetStorageHeader(hwnd);
 
+#ifdef WINELIB32
+  SendMessage(lphl->hParent, WM_COMMAND, 
+	      MAKEWPARAM(GetWindowWord(hwnd,GWW_ID),LBN_DBLCLK),
+	      (LPARAM)hwnd);
+#else
   SendMessage(lphl->hParent, WM_COMMAND, GetWindowWord(hwnd,GWW_ID),
 		MAKELONG(hwnd, LBN_DBLCLK));
+#endif
 
   return 0;
 }
@@ -1060,7 +1071,8 @@ static LONG LBSetRedraw(HWND hwnd, WORD wParam, LONG lParam)
 {
   LPHEADLIST  lphl = ListBoxGetStorageHeader(hwnd);
 
-  dprintf_listbox(stddeb,"ListBox WM_SETREDRAW hWnd=%04X w=%04X !\n", hwnd, wParam);
+  dprintf_listbox(stddeb,"ListBox WM_SETREDRAW hWnd="NPFMT" w=%04X !\n",
+		  hwnd, wParam);
   lphl->bRedrawFlag = wParam;
 
   return 0;
@@ -1069,14 +1081,14 @@ static LONG LBSetRedraw(HWND hwnd, WORD wParam, LONG lParam)
 /***********************************************************************
  *           LBSetFont
  */
-static LONG LBSetFont(HWND hwnd, WORD wParam, LONG lParam)
+static LONG LBSetFont(HWND hwnd, WPARAM wParam, LPARAM lParam)
 {
   LPHEADLIST  lphl = ListBoxGetStorageHeader(hwnd);
 
   if (wParam == 0)
     lphl->hFont = GetStockObject(SYSTEM_FONT);
   else
-    lphl->hFont = wParam;
+    lphl->hFont = (HFONT) wParam;
 
   return 0;
 }
@@ -1105,8 +1117,13 @@ static LONG LBPaint(HWND hwnd, WORD wParam, LONG lParam)
 
   hOldFont = SelectObject(hdc, lphl->hFont);
 
+#ifdef WINELIB32
+  hBrush = (HBRUSH) SendMessage(lphl->hParent, WM_CTLCOLORLISTBOX, (WPARAM)hdc,
+				(LPARAM)hwnd);
+#else
   hBrush = SendMessage(lphl->hParent, WM_CTLCOLOR, hdc,
 		       MAKELONG(hwnd, CTLCOLOR_LISTBOX));
+#endif
 
   if (hBrush == 0) hBrush = GetStockObject(WHITE_BRUSH);
 
@@ -1638,7 +1655,7 @@ static LONG LBSetItemHeight(HWND hwnd, WORD wParam, LONG lParam)
 /***********************************************************************
  *           ListBoxWndProc 
  */
-LONG ListBoxWndProc(HWND hwnd, WORD message, WORD wParam, LONG lParam)
+LRESULT ListBoxWndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
 { 
     switch (message) {
      case WM_CREATE: return LBCreate(hwnd, wParam, lParam);
@@ -1702,7 +1719,7 @@ BOOL DlgDirSelect(HWND hDlg, LPSTR lpStr, int nIDLBox)
   LPHEADLIST lphl;
   char s[130];
 
-  dprintf_listbox( stddeb, "DlgDirSelect(%04X, '%s', %d) \n", hDlg, lpStr, 
+  dprintf_listbox( stddeb, "DlgDirSelect("NPFMT", '%s', %d) \n", hDlg, lpStr, 
 		  nIDLBox );
 
   hwnd = GetDlgItem(hDlg, nIDLBox);
@@ -1743,7 +1760,7 @@ int DlgDirList(HWND hDlg, LPSTR lpPathSpec,
   HWND	hWnd;
   int ret;
   
-  dprintf_listbox(stddeb,"DlgDirList(%04X, '%s', %d, %d, %04X) \n",
+  dprintf_listbox(stddeb,"DlgDirList("NPFMT", '%s', %d, %d, %04X) \n",
 		  hDlg, lpPathSpec, nIDLBox, nIDStat, wType);
   if (nIDLBox)  {
     LPHEADLIST lphl;
@@ -1767,13 +1784,13 @@ int DlgDirList(HWND hDlg, LPSTR lpPathSpec,
 	temp[1] = 'A'+drive;
 	temp[2] = ':';
 	SendDlgItemMessage( hDlg, nIDStat, WM_SETTEXT, 0,
-                            USER_HEAP_SEG_ADDR(hTemp) + 1 );
+                            (LPARAM)(USER_HEAP_SEG_ADDR(hTemp) + 1) );
       } else {
 	temp[0] = 'A'+drive;
 	temp[1] = ':';
 	temp[2] = '\\';
 	SendDlgItemMessage( hDlg, nIDStat, WM_SETTEXT, 0,
-                            USER_HEAP_SEG_ADDR(hTemp) );
+                            (LPARAM)USER_HEAP_SEG_ADDR(hTemp) );
       }
       USER_HEAP_FREE( hTemp );
   } 
diff --git a/controls/menu.c b/controls/menu.c
index 250f424d9fa..90db99cb636 100644
--- a/controls/menu.c
+++ b/controls/menu.c
@@ -225,8 +225,13 @@ static WORD MENU_FindItemByKey( HWND hwndOwner, HMENU hmenu, WORD key )
 	    if (p && (p[1] != '&') && (toupper(p[1]) == key)) return i;
 	}
     }
+#ifdef WINELIB32
+    menuchar = SendMessage( hwndOwner, WM_MENUCHAR, 
+			    MAKEWPARAM(key,menu->wFlags), (LPARAM)hmenu );
+#else
     menuchar = SendMessage( hwndOwner, WM_MENUCHAR, key,
 			    MAKELONG( menu->wFlags, hmenu ) );
+#endif
     if (HIWORD(menuchar) == 2) return LOWORD(menuchar);
     if (HIWORD(menuchar) == 1) return -2;
     return -1;
@@ -252,7 +257,7 @@ static void MENU_CalcItemSize( HDC hdc, LPMENUITEM lpitem, HWND hwndOwner,
       static LPMEASUREITEMSTRUCT mistruct=NULL;
       if (mistruct == NULL)  {
 	mistrh = GlobalAlloc(0,sizeof(MEASUREITEMSTRUCT));
-	mistrsegp = WIN16_GlobalLock(mistrh);
+	mistrsegp = (SEGPTR)WIN16_GlobalLock(mistrh);
 	mistruct = PTR_SEG_TO_LIN(mistrsegp);
       }
       mistruct->CtlType = ODT_MENU;
@@ -455,7 +460,7 @@ static void MENU_DrawMenuItem( HWND hwnd, HDC hdc, LPMENUITEM lpitem,
       static LPDRAWITEMSTRUCT distruct=NULL;
       if (distruct == NULL)  {
 	distrh = GlobalAlloc(0,sizeof(DRAWITEMSTRUCT));
-	distrsegp = WIN16_GlobalLock(distrh);
+	distrsegp = (SEGPTR)WIN16_GlobalLock(distrh);
 	distruct = PTR_SEG_TO_LIN(distrsegp);
       }
       dprintf_menu(stddeb,"DrawMenuItem: Ownerdraw!\n");
@@ -630,7 +635,7 @@ WORD MENU_DrawMenuBar(HDC hDC, LPRECT lprect, HWND hwnd, BOOL suppress_draw)
     
     lppop = (LPPOPUPMENU) USER_HEAP_LIN_ADDR( wndPtr->wIDmenu );
     if (lppop == NULL || lprect == NULL) return SYSMETRICS_CYMENU;
-    dprintf_menu(stddeb,"MENU_DrawMenuBar(%04X, %p, %p); !\n", 
+    dprintf_menu(stddeb,"MENU_DrawMenuBar("NPFMT", %p, %p); !\n", 
 		 hDC, lprect, lppop);
     if (lppop->Height == 0) MENU_MenuBarCalcSize(hDC, lprect, lppop, hwnd);
     lprect->bottom = lprect->top + lppop->Height;
@@ -667,7 +672,7 @@ static BOOL MENU_ShowPopup(HWND hwndOwner, HMENU hmenu, WORD id, int x, int y)
 	item[menu->FocusedItem].item_flags &= ~(MF_HILITE | MF_MOUSESELECT);
 	menu->FocusedItem = NO_SELECTED_ITEM;
     }
-    SendMessage( hwndOwner, WM_INITMENUPOPUP, hmenu,
+    SendMessage( hwndOwner, WM_INITMENUPOPUP, (WPARAM)hmenu,
 		 MAKELONG( id, (menu->wFlags & MF_SYSMENU) ? 1 : 0 ));
     MENU_PopupMenuCalcSize( menu, hwndOwner );
     if (!menu->hWnd)
@@ -735,22 +740,43 @@ static void MENU_SelectItem( HWND hwndOwner, HMENU hmenu, WORD wIndex )
 	if (lppop->FocusedItem == SYSMENU_SELECTED)
         {
 	    NC_DrawSysButton( lppop->hWnd, hdc, TRUE );
+#ifdef WINELIB32
+            SendMessage( hwndOwner, WM_MENUSELECT,
+                         MAKEWPARAM( GetSystemMenu( lppop->hWnd, FALSE ),
+				     lppop->wFlags | MF_MOUSESELECT ),
+			 (LPARAM)hmenu );
+#else
             SendMessage( hwndOwner, WM_MENUSELECT,
                          GetSystemMenu( lppop->hWnd, FALSE ),
                          MAKELONG( lppop->wFlags | MF_MOUSESELECT, hmenu ) );
+#endif
         }
 	else
 	{
 	    items[lppop->FocusedItem].item_flags |= MF_HILITE;
 	    MENU_DrawMenuItem( lppop->hWnd, hdc, &items[lppop->FocusedItem], lppop->Height,
 			       !(lppop->wFlags & MF_POPUP) );
+#ifdef WINELIB32
+	    SendMessage( hwndOwner, WM_MENUSELECT,
+                         MAKEWPARAM( items[lppop->FocusedItem].item_id,
+				     items[lppop->FocusedItem].item_flags | 
+				     MF_MOUSESELECT ),
+			 (LPARAM) hmenu );
+#else
 	    SendMessage( hwndOwner, WM_MENUSELECT,
                          items[lppop->FocusedItem].item_id,
 		         MAKELONG( items[lppop->FocusedItem].item_flags | MF_MOUSESELECT, hmenu));
+#endif
 	}
     }
+#ifdef WINELIB32
+    else SendMessage( hwndOwner, WM_MENUSELECT, 
+		      MAKEWPARAM( hmenu, lppop->wFlags | MF_MOUSESELECT),
+		      (LPARAM)hmenu );
+#else
     else SendMessage( hwndOwner, WM_MENUSELECT, hmenu,
                       MAKELONG( lppop->wFlags | MF_MOUSESELECT, hmenu ) );
+#endif
 
     ReleaseDC( lppop->hWnd, hdc );
 }
@@ -858,7 +884,7 @@ static HMENU MENU_GetSubPopup( HMENU hmenu )
     item = ((MENUITEM *)USER_HEAP_LIN_ADDR(menu->hItems)) + menu->FocusedItem;
     if (!(item->item_flags & MF_POPUP) || !(item->item_flags & MF_MOUSESELECT))
 	return 0;
-    return item->item_id;
+    return (HMENU)item->item_id;
 }
 
 
@@ -885,7 +911,7 @@ static void MENU_HideSubPopups( HWND hwndOwner, HMENU hmenu )
 	if (!(item->item_flags & MF_POPUP) ||
 	    !(item->item_flags & MF_MOUSESELECT)) return;
 	item->item_flags &= ~MF_MOUSESELECT;
-	hsubmenu = item->item_id;
+	hsubmenu = (HMENU)item->item_id;
     }
     submenu = (POPUPMENU *) USER_HEAP_LIN_ADDR( hsubmenu );
     MENU_HideSubPopups( hwndOwner, hsubmenu );
@@ -1089,7 +1115,7 @@ static BOOL MENU_ButtonUp( HWND hwndOwner, HMENU hmenu, HMENU *hmenuCurrent,
 	{
 	    return MENU_ExecFocusedItem( hwndOwner, hmenu, hmenuCurrent );
 	}
-	hsubmenu = item->item_id;
+	hsubmenu = (HMENU)item->item_id;
     }
       /* Select first item of sub-popup */
     MENU_SelectItem( hwndOwner, hsubmenu, NO_SELECTED_ITEM );
@@ -1448,15 +1474,20 @@ BOOL TrackPopupMenu( HMENU hMenu, WORD wFlags, short x, short y,
 /***********************************************************************
  *           PopupMenuWndProc
  */
-LONG PopupMenuWndProc( HWND hwnd, WORD message, WORD wParam, LONG lParam )
+LRESULT PopupMenuWndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
 {    
     switch(message)
     {
     case WM_CREATE:
 	{
 	    CREATESTRUCT *createStruct = (CREATESTRUCT*)PTR_SEG_TO_LIN(lParam);
+#ifdef WINELIB32
+	    HMENU hmenu = (HMENU) (createStruct->lpCreateParams);
+	    SetWindowLong( hwnd, 0, hmenu );
+#else
 	    HMENU hmenu = (HMENU) ((int)createStruct->lpCreateParams & 0xffff);
 	    SetWindowWord( hwnd, 0, hmenu );
+#endif
 	    return 0;
 	}
 
@@ -1468,7 +1499,12 @@ LONG PopupMenuWndProc( HWND hwnd, WORD message, WORD wParam, LONG lParam )
 	    PAINTSTRUCT ps;
 	    BeginPaint( hwnd, &ps );
 	    MENU_DrawPopupMenu( hwnd, ps.hdc,
-			        (HMENU)GetWindowWord( hwnd, 0 ) );
+#ifdef WINELIB32
+			        (HMENU)GetWindowLong( hwnd, 0 )
+#else
+			        (HMENU)GetWindowWord( hwnd, 0 )
+#endif
+ 			       );
 	    EndPaint( hwnd, &ps );
 	    return 0;
 	}
@@ -1508,7 +1544,7 @@ WORD MENU_GetMenuBarHeight( HWND hwnd, WORD menubarWidth, int orgX, int orgY )
 BOOL ChangeMenu(HMENU hMenu, WORD nPos, LPSTR lpNewItem, 
 			WORD wItemID, WORD wFlags)
 {
-  dprintf_menu(stddeb,"ChangeMenu(%04X, %X, '%s', %X, %X)\n",
+  dprintf_menu(stddeb,"ChangeMenu: menu="NPFMT" pos=%d ptr=%p item=%04x flags=%04x\n",
 	       hMenu, nPos, lpNewItem, wItemID, wFlags);
   if (wFlags & MF_APPEND)  {
     return AppendMenu(hMenu, wFlags & ~MF_APPEND, wItemID, lpNewItem);
@@ -1535,7 +1571,7 @@ BOOL ChangeMenu(HMENU hMenu, WORD nPos, LPSTR lpNewItem,
 BOOL CheckMenuItem(HMENU hMenu, WORD wItemID, WORD wFlags)
 {
 	LPMENUITEM 	lpitem;
-	dprintf_menu(stddeb,"CheckMenuItem (%04X, %04X, %04X) !\n", 
+	dprintf_menu(stddeb,"CheckMenuItem ("NPFMT", %04X, %04X) !\n", 
 		     hMenu, wItemID, wFlags);
 	if (!(lpitem = MENU_FindItem(&hMenu, &wItemID, wFlags))) return FALSE;
 	if (wFlags & MF_CHECKED) lpitem->item_flags |= MF_CHECKED;
@@ -1550,7 +1586,7 @@ BOOL CheckMenuItem(HMENU hMenu, WORD wItemID, WORD wFlags)
 BOOL EnableMenuItem(HMENU hMenu, WORD wItemID, WORD wFlags)
 {
     LPMENUITEM 	lpitem;
-    dprintf_menu(stddeb,"EnableMenuItem (%04X, %04X, %04X) !\n", 
+    dprintf_menu(stddeb,"EnableMenuItem ("NPFMT", %04X, %04X) !\n", 
 		 hMenu, wItemID, wFlags);
     if (!(lpitem = MENU_FindItem( &hMenu, &wItemID, wFlags ))) return FALSE;
 
@@ -1571,29 +1607,25 @@ BOOL EnableMenuItem(HMENU hMenu, WORD wItemID, WORD wFlags)
 }
 
 
-/**********************************************************************
- *			GetMenuString		[USER.161]
+/*******************************************************************
+ *         GetMenuString    (USER.161)
  */
-int GetMenuString(HMENU hMenu, WORD wItemID, 
-		  LPSTR str, short nMaxSiz, WORD wFlags)
+int GetMenuString( HMENU hMenu, WORD wItemID,
+                   LPSTR str, short nMaxSiz, WORD wFlags )
 {
-	LPMENUITEM 	lpitem;
-	int		maxsiz;
-	dprintf_menu(stddeb,"GetMenuString(%04X, %04X, %p, %d, %04X);\n",
-					hMenu, wItemID, str, nMaxSiz, wFlags);
-	if (str == NULL) return FALSE;
-	lpitem = MENU_FindItem( &hMenu, &wItemID, wFlags );
-	if (lpitem != NULL) {
-		if (lpitem->item_text != NULL) {
-			maxsiz = min(nMaxSiz - 1, strlen(lpitem->item_text));
-			strncpy(str, lpitem->item_text, maxsiz + 1);
-			}
-		else
-			maxsiz = 0;
-		dprintf_menu(stddeb,"GetMenuString // Found !\n");
-		return maxsiz;
-		}
-	return 0;
+    LPMENUITEM lpitem;
+
+    dprintf_menu( stddeb, "GetMenuString: menu="NPFMT" item=%04x ptr=%p len=%d flags=%04x\n",
+                 hMenu, wItemID, str, nMaxSiz, wFlags );
+    if (!str || !nMaxSiz) return 0;
+    str[0] = '\0';
+    if (!(lpitem = MENU_FindItem( &hMenu, &wItemID, wFlags ))) return 0;
+    if (!lpitem->item_text || !IS_STRING_ITEM(lpitem->item_flags)) return 0;
+    nMaxSiz = min( nMaxSiz-1, strlen(lpitem->item_text) );
+    strncpy( str, lpitem->item_text, nMaxSiz );
+    str[nMaxSiz] = '\0';
+    dprintf_menu( stddeb, "GetMenuString: returning '%s'\n", str );
+    return nMaxSiz;
 }
 
 
@@ -1604,7 +1636,7 @@ BOOL HiliteMenuItem(HWND hWnd, HMENU hMenu, WORD wItemID, WORD wHilite)
 {
     LPPOPUPMENU menu;
     LPMENUITEM  lpitem;
-    dprintf_menu(stddeb,"HiliteMenuItem(%04X, %04X, %04X, %04X);\n", 
+    dprintf_menu(stddeb,"HiliteMenuItem("NPFMT", "NPFMT", %04X, %04X);\n", 
 						hWnd, hMenu, wItemID, wHilite);
     if (!(lpitem = MENU_FindItem( &hMenu, &wItemID, wHilite ))) return FALSE;
     if (!(menu = (LPPOPUPMENU) USER_HEAP_LIN_ADDR(hMenu))) return FALSE;
@@ -1621,7 +1653,7 @@ BOOL HiliteMenuItem(HWND hWnd, HMENU hMenu, WORD wItemID, WORD wHilite)
 WORD GetMenuState(HMENU hMenu, WORD wItemID, WORD wFlags)
 {
     LPMENUITEM lpitem;
-    dprintf_menu(stddeb,"GetMenuState(%04X, %04X, %04X);\n", 
+    dprintf_menu(stddeb,"GetMenuState("NPFMT", %04X, %04X);\n", 
 		 hMenu, wItemID, wFlags);
     if (!(lpitem = MENU_FindItem( &hMenu, &wItemID, wFlags ))) return -1;
     if (lpitem->item_flags & MF_POPUP)
@@ -1640,10 +1672,10 @@ WORD GetMenuState(HMENU hMenu, WORD wItemID, WORD wFlags)
 WORD GetMenuItemCount(HMENU hMenu)
 {
 	LPPOPUPMENU	menu;
-	dprintf_menu(stddeb,"GetMenuItemCount(%04X);\n", hMenu);
+	dprintf_menu(stddeb,"GetMenuItemCount("NPFMT");\n", hMenu);
 	menu = (LPPOPUPMENU) USER_HEAP_LIN_ADDR(hMenu);
 	if (menu == NULL) return (WORD)-1;
-	dprintf_menu(stddeb,"GetMenuItemCount(%04X) return %d \n", 
+	dprintf_menu(stddeb,"GetMenuItemCount("NPFMT") return %d \n", 
 		     hMenu, menu->nItems);
 	return menu->nItems;
 }
@@ -1657,7 +1689,7 @@ WORD GetMenuItemID(HMENU hMenu, int nPos)
     LPPOPUPMENU	menu;
     MENUITEM *item;
 
-    dprintf_menu(stddeb,"GetMenuItemID(%04X, %d);\n", hMenu, nPos);
+    dprintf_menu(stddeb,"GetMenuItemID("NPFMT", %d);\n", hMenu, nPos);
     if (!(menu = (LPPOPUPMENU) USER_HEAP_LIN_ADDR(hMenu))) return -1;
     if ((nPos < 0) || (nPos >= menu->nItems)) return -1;
     item = (MENUITEM *) USER_HEAP_LIN_ADDR( menu->hItems );
@@ -1677,13 +1709,13 @@ BOOL InsertMenu(HMENU hMenu, WORD nPos, WORD wFlags, WORD wItemID, LPSTR lpNewIt
 
     if (IS_STRING_ITEM(wFlags))
     {
-        dprintf_menu(stddeb,"InsertMenu (%04X, %04X, %04X, %04X, '%s') !\n",
+        dprintf_menu(stddeb,"InsertMenu ("NPFMT", %04X, %04X, %04X, '%s') !\n",
                      hMenu, nPos, wFlags, wItemID,
                      lpNewItem ? lpNewItem : "(null)");
         if (!lpNewItem) return FALSE;
     }
     else
-        dprintf_menu(stddeb,"InsertMenu (%04X, %04X, %04X, %04X, %p) !\n",
+        dprintf_menu(stddeb,"InsertMenu ("NPFMT", %04X, %04X, %04X, %p) !\n",
                      hMenu, nPos, wFlags, wItemID, lpNewItem);
 
       /* Find where to insert new item */
@@ -1695,7 +1727,7 @@ BOOL InsertMenu(HMENU hMenu, WORD nPos, WORD wFlags, WORD wItemID, LPSTR lpNewIt
              Some programs specify the menu length to do that */
         if (!(menu = (LPPOPUPMENU) USER_HEAP_LIN_ADDR(hMenu))) 
         {
-            dprintf_menu(stddeb,"InsertMenu: %04X not a menu handle\n", hMenu);
+            dprintf_menu(stddeb,"InsertMenu: "NPFMT" not a menu handle\n", hMenu);
             return FALSE;
         }
         nPos = menu->nItems;
@@ -1709,7 +1741,7 @@ BOOL InsertMenu(HMENU hMenu, WORD nPos, WORD wFlags, WORD wItemID, LPSTR lpNewIt
         }
         if (!(menu = (LPPOPUPMENU) USER_HEAP_LIN_ADDR(hMenu)))
         {
-            dprintf_menu(stddeb,"InsertMenu: %04X not a menu handle\n", hMenu);
+            dprintf_menu(stddeb,"InsertMenu: "NPFMT" not a menu handle\n", hMenu);
             return FALSE;
         }
     }
@@ -1783,7 +1815,7 @@ BOOL RemoveMenu(HMENU hMenu, WORD nPos, WORD wFlags)
 {
     LPPOPUPMENU	menu;
     LPMENUITEM 	lpitem;
-	dprintf_menu(stddeb,"RemoveMenu (%04X, %04X, %04X) !\n", 
+	dprintf_menu(stddeb,"RemoveMenu ("NPFMT", %04X, %04X) !\n", 
 		     hMenu, nPos, wFlags);
     if (!(lpitem = MENU_FindItem( &hMenu, &nPos, wFlags ))) return FALSE;
     if (!(menu = (LPPOPUPMENU) USER_HEAP_LIN_ADDR(hMenu))) return FALSE;
@@ -1833,12 +1865,12 @@ BOOL ModifyMenu(HMENU hMenu, WORD nPos, WORD wFlags, WORD wItemID, LPSTR lpNewIt
     LPMENUITEM 	lpitem;
     if (IS_STRING_ITEM(wFlags))
     {
-	dprintf_menu(stddeb,"ModifyMenu (%04X, %04X, %04X, %04X, '%s') !\n",
+	dprintf_menu(stddeb,"ModifyMenu ("NPFMT", %04X, %04X, %04X, '%s') !\n",
 	       hMenu, nPos, wFlags, wItemID, lpNewItem ? lpNewItem : "(null)");
         if (!lpNewItem) return FALSE;
     }
     else
-	dprintf_menu(stddeb,"ModifyMenu (%04X, %04X, %04X, %04X, %p) !\n",
+	dprintf_menu(stddeb,"ModifyMenu ("NPFMT", %04X, %04X, %04X, %p) !\n",
 	       hMenu, nPos, wFlags, wItemID, lpNewItem);
     if (!(lpitem = MENU_FindItem( &hMenu, &nPos, wFlags ))) return FALSE;
     
@@ -1890,8 +1922,8 @@ BOOL SetMenuItemBitmaps(HMENU hMenu, WORD nPos, WORD wFlags,
 		HBITMAP hNewCheck, HBITMAP hNewUnCheck)
 {
     LPMENUITEM lpitem;
-   dprintf_menu(stddeb,"SetMenuItemBitmaps (%04X, %04X, %04X, %04X, %08X) !\n",
-	    hMenu, nPos, wFlags, hNewCheck, hNewUnCheck);
+   dprintf_menu(stddeb,"SetMenuItemBitmaps ("NPFMT", %04X, %04X, "NPFMT", %08lX) !\n",
+	    hMenu, nPos, wFlags, hNewCheck, (DWORD)hNewUnCheck);
     if (!(lpitem = MENU_FindItem( &hMenu, &nPos, wFlags ))) return FALSE;
 
     if (!hNewCheck && !hNewUnCheck)
@@ -1932,7 +1964,7 @@ HMENU CreateMenu()
     menu->hWnd   = 0;
     menu->hItems = 0;
     menu->FocusedItem = NO_SELECTED_ITEM;
-    dprintf_menu(stddeb,"CreateMenu // return %04X\n", hMenu);
+    dprintf_menu(stddeb,"CreateMenu // return "NPFMT"\n", hMenu);
     return hMenu;
 }
 
@@ -1943,7 +1975,7 @@ HMENU CreateMenu()
 BOOL DestroyMenu(HMENU hMenu)
 {
     LPPOPUPMENU lppop;
-    dprintf_menu(stddeb,"DestroyMenu (%04X) !\n", hMenu);
+    dprintf_menu(stddeb,"DestroyMenu ("NPFMT") !\n", hMenu);
     if (hMenu == 0) return FALSE;
     lppop = (LPPOPUPMENU) USER_HEAP_LIN_ADDR(hMenu);
     if (!lppop || (lppop->wMagic != MENU_MAGIC)) return FALSE;
@@ -1963,7 +1995,7 @@ BOOL DestroyMenu(HMENU hMenu)
         USER_HEAP_FREE( lppop->hItems );
     }
     USER_HEAP_FREE( hMenu );
-    dprintf_menu(stddeb,"DestroyMenu (%04X) // End !\n", hMenu);
+    dprintf_menu(stddeb,"DestroyMenu ("NPFMT") // End !\n", hMenu);
     return TRUE;
 }
 
@@ -2012,18 +2044,18 @@ BOOL SetMenu(HWND hWnd, HMENU hMenu)
 	LPPOPUPMENU lpmenu;
 	WND * wndPtr = WIN_FindWndPtr(hWnd);
 	if (wndPtr == NULL) {
-		fprintf(stderr,"SetMenu(%04X, %04X) // Bad window handle !\n",
+		fprintf(stderr,"SetMenu("NPFMT", "NPFMT") // Bad window handle !\n",
 			hWnd, hMenu);
 		return FALSE;
 		}
-	dprintf_menu(stddeb,"SetMenu(%04X, %04X);\n", hWnd, hMenu);
+	dprintf_menu(stddeb,"SetMenu("NPFMT", "NPFMT");\n", hWnd, hMenu);
 	if (GetCapture() == hWnd) ReleaseCapture();
 	wndPtr->wIDmenu = hMenu;
 	if (hMenu != 0)
 	{
 	    lpmenu = (LPPOPUPMENU) USER_HEAP_LIN_ADDR(hMenu);
 	    if (lpmenu == NULL) {
-		fprintf(stderr,"SetMenu(%04X, %04X) // Bad menu handle !\n", 
+		fprintf(stderr,"SetMenu("NPFMT", "NPFMT") // Bad menu handle !\n", 
 			hWnd, hMenu);
 		return FALSE;
 		}
@@ -2045,7 +2077,7 @@ HMENU GetSubMenu(HMENU hMenu, short nPos)
 {
     LPPOPUPMENU lppop;
     LPMENUITEM 	lpitem;
-    dprintf_menu(stddeb,"GetSubMenu (%04X, %04X) !\n", hMenu, nPos);
+    dprintf_menu(stddeb,"GetSubMenu ("NPFMT", %04X) !\n", hMenu, nPos);
     if (!(lppop = (LPPOPUPMENU) USER_HEAP_LIN_ADDR(hMenu))) return 0;
     if ((WORD)nPos >= lppop->nItems) return 0;
     lpitem = (MENUITEM *) USER_HEAP_LIN_ADDR( lppop->hItems );
@@ -2061,7 +2093,7 @@ void DrawMenuBar(HWND hWnd)
 {
 	WND		*wndPtr;
 	LPPOPUPMENU lppop;
-	dprintf_menu(stddeb,"DrawMenuBar (%04X)\n", hWnd);
+	dprintf_menu(stddeb,"DrawMenuBar ("NPFMT")\n", hWnd);
 	wndPtr = WIN_FindWndPtr(hWnd);
 	if (wndPtr != NULL && (wndPtr->dwStyle & WS_CHILD) == 0 && 
 		wndPtr->wIDmenu != 0) {
@@ -2109,11 +2141,11 @@ HMENU LoadMenu( HINSTANCE instance, SEGPTR name )
     if (HIWORD(name))
     {
         char *str = (char *)PTR_SEG_TO_LIN( name );
-        dprintf_menu( stddeb, "LoadMenu(%04x,'%s')\n", instance, str );
+        dprintf_menu( stddeb, "LoadMenu("NPFMT",'%s')\n", instance, str );
         if (str[0] == '#') name = (SEGPTR)atoi( str + 1 );
     }
     else
-        dprintf_resource(stddeb,"LoadMenu(%04x,%04x)\n",instance,LOWORD(name));
+        dprintf_resource(stddeb,"LoadMenu("NPFMT",%04x)\n",instance,LOWORD(name));
 
     if (!name) return 0;
 
@@ -2157,7 +2189,7 @@ HMENU CopySysMenu()
     }
     menu = (POPUPMENU*) USER_HEAP_LIN_ADDR(hMenu);
     menu->wFlags |= MF_SYSMENU|MF_POPUP;
-    dprintf_menu(stddeb,"CopySysMenu hMenu=%04X !\n", hMenu);
+    dprintf_menu(stddeb,"CopySysMenu hMenu="NPFMT" !\n", hMenu);
     return hMenu;
 }
 
diff --git a/controls/scroll.c b/controls/scroll.c
index 230b7b4fa82..507c8971f00 100644
--- a/controls/scroll.c
+++ b/controls/scroll.c
@@ -353,8 +353,14 @@ static void SCROLL_DrawInterior( HWND hwnd, HDC hdc, int nBar, RECT *rect,
     {
         if (nBar == SB_CTL)  /* Only scrollbar controls send WM_CTLCOLOR */
         {
+#ifdef WINELIB32
+            HBRUSH hbrush = (HBRUSH)SendMessage( GetParent(hwnd), 
+						 WM_CTLCOLORSCROLLBAR,
+						 (WPARAM)hdc, (LPARAM)hwnd );
+#else
             HBRUSH hbrush = SendMessage( GetParent(hwnd), WM_CTLCOLOR, hdc,
                                          MAKELONG(hwnd, CTLCOLOR_SCROLLBAR) );
+#endif
             SelectObject( hdc, hbrush );
         }
         else SelectObject( hdc, sysColorObjects.hbrushScrollbar );
@@ -506,9 +512,15 @@ static void SCROLL_HandleKbdEvent( HWND hwnd, WORD wParam )
     default:
         return;
     }
+#ifdef WINELIB32
+    SendMessage( GetParent(hwnd),
+                 (wndPtr->dwStyle & SBS_VERT) ? WM_VSCROLL : WM_HSCROLL,
+                 (WPARAM)msg, (LPARAM)hwnd );
+#else
     SendMessage( GetParent(hwnd),
                  (wndPtr->dwStyle & SBS_VERT) ? WM_VSCROLL : WM_HSCROLL,
                  msg, MAKELONG( 0, hwnd ));
+#endif
 }
 
 
@@ -580,7 +592,7 @@ void SCROLL_HandleScrollEvent( HWND hwnd, int nBar, WORD msg, POINT pt )
           return;  /* Should never happen */
     }
 
-    dprintf_scroll( stddeb, "ScrollBar Event: hwnd=%x bar=%d msg=%x pt=%d,%d hit=%d\n",
+    dprintf_scroll( stddeb, "ScrollBar Event: hwnd="NPFMT" bar=%d msg=%x pt=%d,%d hit=%d\n",
                     hwnd, nBar, msg, pt.x, pt.y, hittest );
 
     switch(trackHitTest)
@@ -598,8 +610,13 @@ void SCROLL_HandleScrollEvent( HWND hwnd, int nBar, WORD msg, POINT pt )
                 SetSystemTimer( hwnd, SCROLL_TIMER, (msg == WM_LBUTTONDOWN) ?
                                 SCROLL_FIRST_DELAY : SCROLL_REPEAT_DELAY,
                                 (FARPROC)0 );
+#ifdef WINELIB32
+                SendMessage( hwndOwner, vertical ? WM_VSCROLL : WM_HSCROLL,
+                             (WPARAM)SB_LINEUP, (LPARAM)hwndCtl );
+#else
                 SendMessage( hwndOwner, vertical ? WM_VSCROLL : WM_HSCROLL,
                              SB_LINEUP, MAKELONG( 0, hwndCtl ));
+#endif
             }
         }
         else KillSystemTimer( hwnd, SCROLL_TIMER );
@@ -616,8 +633,13 @@ void SCROLL_HandleScrollEvent( HWND hwnd, int nBar, WORD msg, POINT pt )
                 SetSystemTimer( hwnd, SCROLL_TIMER, (msg == WM_LBUTTONDOWN) ?
                                 SCROLL_FIRST_DELAY : SCROLL_REPEAT_DELAY,
                                 (FARPROC)0 );
+#ifdef WINELIB32
+                SendMessage( hwndOwner, vertical ? WM_VSCROLL : WM_HSCROLL,
+                             (WPARAM)SB_PAGEUP, (LPARAM)hwndCtl );
+#else
                 SendMessage( hwndOwner, vertical ? WM_VSCROLL : WM_HSCROLL,
                              SB_PAGEUP, MAKELONG( 0, hwndCtl ));
+#endif
             }
         }
         else KillSystemTimer( hwnd, SCROLL_TIMER );
@@ -645,8 +667,13 @@ void SCROLL_HandleScrollEvent( HWND hwnd, int nBar, WORD msg, POINT pt )
                 lastMousePos = pos;
                 val = SCROLL_GetThumbVal( infoPtr, &rect, vertical,
                                  trackThumbPos + lastMousePos - lastClickPos );
+#ifdef WINELIB32
+                SendMessage( hwndOwner, vertical ? WM_VSCROLL : WM_HSCROLL,
+                             MAKEWPARAM(SB_THUMBTRACK,val), (LPARAM)hwndCtl );
+#else
                 SendMessage( hwndOwner, vertical ? WM_VSCROLL : WM_HSCROLL,
                              SB_THUMBTRACK, MAKELONG( val, hwndCtl ));
+#endif
             }
         }
         break;
@@ -662,8 +689,13 @@ void SCROLL_HandleScrollEvent( HWND hwnd, int nBar, WORD msg, POINT pt )
                 SetSystemTimer( hwnd, SCROLL_TIMER, (msg == WM_LBUTTONDOWN) ?
                                 SCROLL_FIRST_DELAY : SCROLL_REPEAT_DELAY,
                                 (FARPROC)0 );
+#ifdef WINELIB32
+                SendMessage( hwndOwner, vertical ? WM_VSCROLL : WM_HSCROLL,
+                             (WPARAM)SB_PAGEDOWN, (LPARAM)hwndCtl );
+#else
                 SendMessage( hwndOwner, vertical ? WM_VSCROLL : WM_HSCROLL,
                              SB_PAGEDOWN, MAKELONG( 0, hwndCtl ));
+#endif
             }
         }
         else KillSystemTimer( hwnd, SCROLL_TIMER );
@@ -679,8 +711,13 @@ void SCROLL_HandleScrollEvent( HWND hwnd, int nBar, WORD msg, POINT pt )
                 SetSystemTimer( hwnd, SCROLL_TIMER, (msg == WM_LBUTTONDOWN) ?
                                 SCROLL_FIRST_DELAY : SCROLL_REPEAT_DELAY,
                                 (FARPROC)0 );
+#ifdef WINELIB32
+                SendMessage( hwndOwner, vertical ? WM_VSCROLL : WM_HSCROLL,
+                             (WPARAM)SB_LINEDOWN, (LPARAM)hwndCtl );
+#else
                 SendMessage( hwndOwner, vertical ? WM_VSCROLL : WM_HSCROLL,
                              SB_LINEDOWN, MAKELONG( 0, hwndCtl ));
+#endif
             }
         }
         else KillSystemTimer( hwnd, SCROLL_TIMER );
@@ -693,12 +730,22 @@ void SCROLL_HandleScrollEvent( HWND hwnd, int nBar, WORD msg, POINT pt )
         {
             UINT val = SCROLL_GetThumbVal( infoPtr, &rect, vertical,
                                  trackThumbPos + lastMousePos - lastClickPos );
+#ifdef WINELIB32
+            SendMessage( hwndOwner, vertical ? WM_VSCROLL : WM_HSCROLL,
+                         MAKEWPARAM(SB_THUMBPOSITION,val), (LPARAM)hwndCtl );
+#else
             SendMessage( hwndOwner, vertical ? WM_VSCROLL : WM_HSCROLL,
                          SB_THUMBPOSITION, MAKELONG( val, hwndCtl ) );
+#endif
         }
         else
+#ifdef WINELIB32
+            SendMessage( hwndOwner, vertical ? WM_VSCROLL : WM_HSCROLL,
+                         (WPARAM)SB_ENDSCROLL, (LPARAM)hwndCtl );
+#else
             SendMessage( hwndOwner, vertical ? WM_VSCROLL : WM_HSCROLL,
                          SB_ENDSCROLL, MAKELONG( 0, hwndCtl ) );
+#endif
         trackHitTest = SCROLL_NOWHERE;  /* Terminate tracking */
     }
 
@@ -746,7 +793,7 @@ LONG ScrollBarWndProc( HWND hwnd, WORD message, WORD wParam, LONG lParam )
             }
         }
         if (!hUpArrow) SCROLL_LoadBitmaps();
-        dprintf_scroll( stddeb, "ScrollBar creation, hwnd=%d\n", hwnd );
+        dprintf_scroll( stddeb, "ScrollBar creation, hwnd="NPFMT"\n", hwnd );
         return 0;
 	
     case WM_LBUTTONDOWN:
@@ -822,7 +869,7 @@ void SetScrollRange(HWND hwnd, int nBar, int MinVal, int MaxVal, BOOL bRedraw)
 
     if (!(infoPtr = SCROLL_GetScrollInfo( hwnd, nBar ))) return;
 
-    dprintf_scroll( stddeb,"SetScrollRange hwnd=%x bar=%d min=%d max=%d\n",
+    dprintf_scroll( stddeb,"SetScrollRange hwnd="NPFMT" bar=%d min=%d max=%d\n",
                     hwnd, nBar, MinVal, MaxVal );
 
       /* Invalid range -> range is set to (0,0) */
@@ -860,7 +907,7 @@ void ShowScrollBar( HWND hwnd, WORD wBar, BOOL fShow )
     WND *wndPtr = WIN_FindWndPtr( hwnd );
 
     if (!wndPtr) return;
-    dprintf_scroll( stddeb, "ShowScrollBar: hwnd=%x bar=%d on=%d\n", hwnd, wBar, fShow );
+    dprintf_scroll( stddeb, "ShowScrollBar: hwnd="NPFMT" bar=%d on=%d\n", hwnd, wBar, fShow );
 
     switch(wBar)
     {
@@ -926,7 +973,7 @@ BOOL EnableScrollBar( HWND hwnd, INT nBar, UINT flags )
     HDC hdc;
 
     if (!(infoPtr = SCROLL_GetScrollInfo( hwnd, nBar ))) return FALSE;
-    dprintf_scroll( stddeb, "EnableScrollBar: %x %d %d\n", hwnd, nBar, flags );
+    dprintf_scroll( stddeb, "EnableScrollBar: "NPFMT" %d %d\n", hwnd, nBar, flags );
     flags &= ESB_DISABLE_BOTH;
     if (infoPtr->flags == flags) return FALSE;
     infoPtr->flags = flags;
diff --git a/controls/static.c b/controls/static.c
index b0c37ec38bb..b88dd2ff638 100644
--- a/controls/static.c
+++ b/controls/static.c
@@ -11,7 +11,6 @@ static char Copyright[] = "Copyright  David W. Metcalfe, 1993";
 #include "win.h"
 #include "user.h"
 #include "static.h"
-#include "icon.h"
 
 extern void DEFWND_SetText( HWND hwnd, LPSTR text );  /* windows/defwnd.c */
 
@@ -60,9 +59,8 @@ static void STATIC_SetIcon( HWND hwnd, HICON hicon )
     infoPtr->hIcon = hicon;
     if (hicon)
     {
-        ICONALLOC *icon = (ICONALLOC *) GlobalLock( hicon );
-        SetWindowPos( hwnd, 0, 0, 0,
-                     icon->descriptor.Width, icon->descriptor.Height,
+        CURSORICONINFO *info = (CURSORICONINFO *) GlobalLock( hicon );
+        SetWindowPos( hwnd, 0, 0, 0, info->nWidth, info->nHeight,
                      SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOZORDER );
         GlobalUnlock( hicon );
     }
@@ -72,7 +70,7 @@ static void STATIC_SetIcon( HWND hwnd, HICON hicon )
 /***********************************************************************
  *           StaticWndProc
  */
-LONG StaticWndProc(HWND hWnd, WORD uMsg, WORD wParam, LONG lParam)
+LONG StaticWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
 {
 	LONG lResult = 0;
 	WND *wndPtr = WIN_FindWndPtr(hWnd);
@@ -144,7 +142,7 @@ LONG StaticWndProc(HWND hWnd, WORD uMsg, WORD wParam, LONG lParam)
 
         case WM_SETFONT:
             if (style == SS_ICON) return 0;
-            infoPtr->hFont = wParam;
+            infoPtr->hFont = (HFONT)wParam;
             if (LOWORD(lParam))
             {
                 InvalidateRect( hWnd, NULL, FALSE );
@@ -153,7 +151,7 @@ LONG StaticWndProc(HWND hWnd, WORD uMsg, WORD wParam, LONG lParam)
             break;
 
         case WM_GETFONT:
-            return infoPtr->hFont;
+            return (LONG)infoPtr->hFont;
 
 	case WM_NCHITTEST:
 	    return HTTRANSPARENT;
@@ -162,10 +160,10 @@ LONG StaticWndProc(HWND hWnd, WORD uMsg, WORD wParam, LONG lParam)
             return DLGC_STATIC;
 
 	case STM_GETICON:
-	    return infoPtr->hIcon;
+	    return (LONG)infoPtr->hIcon;
 
 	case STM_SETICON:
-            STATIC_SetIcon( hWnd, wParam );
+            STATIC_SetIcon( hWnd, (HICON)wParam );
             InvalidateRect( hWnd, NULL, FALSE );
             UpdateWindow( hWnd );
 	    return 0;
@@ -223,8 +221,13 @@ static void PaintTextfn( HWND hwnd, HDC hdc )
 	wFormat |= DT_NOPREFIX;
 
     if (infoPtr->hFont) SelectObject( hdc, infoPtr->hFont );
+#ifdef WINELIB32
+    hBrush = (HBRUSH)SendMessage( wndPtr->hwndParent, WM_CTLCOLORSTATIC,
+				  (WPARAM)hdc, (LPARAM)hwnd );
+#else
     hBrush = SendMessage( wndPtr->hwndParent, WM_CTLCOLOR, (WORD)hdc,
                           MAKELONG(hwnd, CTLCOLOR_STATIC));
+#endif
     if (hBrush == (HBRUSH)NULL) hBrush = GetStockObject(WHITE_BRUSH);
     FillRect(hdc, &rc, hBrush);
     if (text)
@@ -281,8 +284,13 @@ static void PaintIconfn( HWND hwnd, HDC hdc )
     STATICINFO *infoPtr = (STATICINFO *)wndPtr->wExtra;
 
     GetClientRect(hwnd, &rc);
+#ifdef WINELIB32
+    hbrush = (HBRUSH)SendMessage( wndPtr->hwndParent, WM_CTLCOLORSTATIC, 
+				  (WPARAM)hdc, (LPARAM)hwnd );
+#else
     hbrush = SendMessage( wndPtr->hwndParent, WM_CTLCOLOR, hdc,
                           MAKELONG(hwnd, CTLCOLOR_STATIC));
+#endif
     FillRect( hdc, &rc, hbrush );
     if (infoPtr->hIcon) DrawIcon( hdc, rc.left, rc.top, infoPtr->hIcon );
 }
diff --git a/controls/widgets.c b/controls/widgets.c
index 34d678ada4f..5559dd1c223 100644
--- a/controls/widgets.c
+++ b/controls/widgets.c
@@ -63,7 +63,7 @@ BOOL WIDGETS_Init(void)
         DWORD WineProc,Win16Proc,Win32Proc;
         /* currently, there is no way to get the 'real' pointer at run time */
         WineProc=0;
-        Win16Proc = GetWndProcEntry16( (char *)class->lpfnWndProc );
+        Win16Proc = (DWORD)GetWndProcEntry16( (char *)class->lpfnWndProc );
         Win32Proc = (DWORD)RELAY32_GetEntryPoint(
              "WINPROCS32",(char *)class->lpfnWndProc, 0);
         /* Register the alias so we don't pass Win16 pointers to Win32 apps */
diff --git a/debugger/Imakefile b/debugger/Imakefile
deleted file mode 100644
index 766a9c74ffe..00000000000
--- a/debugger/Imakefile
+++ /dev/null
@@ -1,54 +0,0 @@
-#include "../Wine.tmpl"
-
-#define IHaveSubdirs
-#define	PassCDebugFlags 'CDEBUGFLAGS=$(CDEBUGFLAGS)' 'CC=$(CC)' 'MAKE=$(MAKE)'\
-			'LD=$(LD)'
-
-MODULE = debugger
-
-SUBDIRS = readline
-
-DEFINES = -DUSE_READLINE
-
-SRCS = \
-	break.c \
-	db_disasm.c \
-	dbg.tab.c \
-	hash.c \
-	info.c \
-	lex.yy.c \
-	memory.c \
-	registers.c \
-	stack.c
-
-SUBDIRS_OBJS = readline/readline.o
-
-OBJS = $(SRCS:.c=.o) $(SUBDIRS_OBJS)
-
-/*
- * All the SUBDIR stuff
- */
-MakeSubdirs($(SUBDIRS))
-DependSubdirs($(SUBDIRS))
-
-/*
- * The main act
- */
-WineRelocatableTarget($(MODULE),,$(OBJS))
-
-depend:: dbg.tab.c dbg.tab.h lex.yy.c
-
-DependTarget()
-
-includes::
-
-install::
-
-clean::
-	$(RM) lex.yy.c dbg.tab* y.tab.c
-
-dbg.tab.c dbg.tab.h: dbg.y
-	$(YACC) -b dbg -d dbg.y
-
-lex.yy.c: debug.l
-	$(LEX) -I debug.l
diff --git a/debugger/break.c b/debugger/break.c
index 4406b2fdd6e..8e9fbb865ca 100644
--- a/debugger/break.c
+++ b/debugger/break.c
@@ -142,8 +142,15 @@ void DEBUG_SetBreakpoints( BOOL set )
     for (i = 0; i < MAX_BREAKPOINTS; i++)
     {
         if (breakpoints[i].in_use && breakpoints[i].enabled)
-            DEBUG_SetOpcode( &breakpoints[i].addr,
-                             set ? INT3 : breakpoints[i].opcode );
+        {
+            if (DEBUG_IsBadWritePtr( &breakpoints[i].addr, 1 ))
+            {
+                fprintf( stderr, "Invalid address for breakpoint %d, disabling it\n", i );
+                breakpoints[i].enabled = FALSE;
+            }
+            else DEBUG_SetOpcode( &breakpoints[i].addr,
+                                  set ? INT3 : breakpoints[i].opcode );
+        }
     }
 }
 
@@ -193,6 +200,7 @@ void DEBUG_AddBreakpoint( const DBG_ADDR *address )
             return;
         }
     }
+    if (!DBG_CHECK_READ_PTR( &addr, 1 )) return;
     p = DBG_ADDR_TO_LIN( &addr );
     breakpoints[num].addr    = addr;
     breakpoints[num].addrlen = !addr.seg ? 32 :
diff --git a/debugger/dbg.y b/debugger/dbg.y
index 5aa67809f71..7eb5a58c0da 100644
--- a/debugger/dbg.y
+++ b/debugger/dbg.y
@@ -51,7 +51,6 @@ int yyerror(char *);
 	| input line  { issue_prompt(); }
 
  line:		'\n'
-	| infocmd '\n'
 	| error '\n'       { yyerrok; }
 	| QUIT  '\n'       { exit(0); }
 	| HELP  '\n'       { DEBUG_Help(); }
@@ -72,6 +71,7 @@ int yyerror(char *);
                                 }
         | DELETE BREAK NUM '\n' { DEBUG_DelBreakpoint( $3 ); }
 	| BACKTRACE '\n'        { DEBUG_BackTrace(); }
+	| infocmd
 	| x_command
 	| print_command
 	| deposit_command
@@ -113,10 +113,11 @@ x_command:
 	| '(' expr ')'		{ $$ = $2; }
 	| '*' addr		{ $$ = DEBUG_ReadMemory( &$2 ); }
 	
- infocmd: INFO REGS     { DEBUG_InfoRegisters(); }
-	| INFO STACK    { DEBUG_InfoStack(); }
-	| INFO BREAK    { DEBUG_InfoBreakpoints(); }
-	| INFO SEGMENTS { LDT_Print(); }
+ infocmd: INFO REGS '\n'          { DEBUG_InfoRegisters(); }
+	| INFO STACK '\n'         { DEBUG_InfoStack(); }
+	| INFO BREAK '\n'         { DEBUG_InfoBreakpoints(); }
+	| INFO SEGMENTS '\n'      { LDT_Print( 0, -1 ); }
+        | INFO SEGMENTS expr '\n' { LDT_Print( SELECTOR_TO_ENTRY($3), 1 ); }
 
 
 %%
@@ -162,9 +163,9 @@ void wine_debug( int signal, struct sigcontext_struct *regs )
     {
         DBG_ADDR addr;
 
-        addr.seg = (CS_reg(DEBUG_context) == WINE_CODE_SELECTOR) ?
-                    0 : CS_reg(DEBUG_context);
+        addr.seg = CS_reg(DEBUG_context);
         addr.off = EIP_reg(DEBUG_context);
+        DBG_FIX_ADDR_SEG( &addr, 0 );
 
         if (!addr.seg) newmode = 32;
         else newmode = (GET_SEL_FLAGS(addr.seg) & LDT_FLAGS_32BIT) ? 32 : 16;
@@ -175,13 +176,22 @@ void wine_debug( int signal, struct sigcontext_struct *regs )
         /* Show where we crashed */
         DEBUG_PrintAddress( &addr, dbg_mode );
         fprintf(stderr,":  ");
-        DEBUG_Disasm( &addr );
-        fprintf(stderr,"\n");
-        instr_len = addr.off - EIP_reg(DEBUG_context);
-        
-        issue_prompt();
-        yyparse();
-        flush_symbols();
+        if (DBG_CHECK_READ_PTR( &addr, 1 ))
+        {
+            DEBUG_Disasm( &addr );
+            fprintf(stderr,"\n");
+            instr_len = addr.off - EIP_reg(DEBUG_context);
+        }
+
+        do
+        {
+            issue_prompt();
+            yyparse();
+            flush_symbols();
+            addr.seg = CS_reg(DEBUG_context);
+            addr.off = EIP_reg(DEBUG_context);
+            DBG_FIX_ADDR_SEG( &addr, 0 );
+        } while (!DBG_CHECK_READ_PTR( &addr, 1 ));
     }
 
     DEBUG_RestartExecution( regs, dbg_exec_mode, instr_len );
diff --git a/debugger/debug.l b/debugger/debug.l
index 29321e74238..ef142ed8926 100644
--- a/debugger/debug.l
+++ b/debugger/debug.l
@@ -73,7 +73,7 @@ $cs     { yylval.reg = REG_CS;  return REG; }
 $ss     { yylval.reg = REG_SS;  return REG; }
 
 info|inf|in		      { return INFO; }
-segments|segm                 { return SEGMENTS; }
+segments|segment|segm|seg|se  { return SEGMENTS; }
 break|brea|bre|br|b           { return BREAK; }
 enable|enabl|enab|ena         { return ENABLE;}
 disable|disabl|disab|disa|dis { return DISABLE; }
diff --git a/debugger/memory.c b/debugger/memory.c
index 206e587f0ef..49108c29de7 100644
--- a/debugger/memory.c
+++ b/debugger/memory.c
@@ -10,6 +10,40 @@
 #include "debugger.h"
 
 
+/***********************************************************************
+ *           DEBUG_IsBadReadPtr
+ *
+ * Check if we are allowed to read memory at 'address'.
+ */
+BOOL DEBUG_IsBadReadPtr( const DBG_ADDR *address, int size )
+{
+    if (address->seg)  /* segmented addr */
+        return IsBadReadPtr( (SEGPTR)MAKELONG( (WORD)address->off,
+                                               (WORD)address->seg ), size );
+        /* FIXME: should check if resulting linear addr is readable */
+    else  /* linear address */
+        return FALSE;  /* FIXME: should do some checks here */
+}
+
+
+/***********************************************************************
+ *           DEBUG_IsBadWritePtr
+ *
+ * Check if we are allowed to write memory at 'address'.
+ */
+BOOL DEBUG_IsBadWritePtr( const DBG_ADDR *address, int size )
+{
+    if (address->seg)  /* segmented addr */
+        /* Note: we use IsBadReadPtr here because we are */
+        /* always allowed to write to read-only segments */
+        return IsBadReadPtr( (SEGPTR)MAKELONG( (WORD)address->off,
+                                               (WORD)address->seg ), size );
+        /* FIXME: should check if resulting linear addr is writable */
+    else  /* linear address */
+        return FALSE;  /* FIXME: should do some checks here */
+}
+
+
 /***********************************************************************
  *           DEBUG_ReadMemory
  *
@@ -20,6 +54,7 @@ int DEBUG_ReadMemory( const DBG_ADDR *address )
     DBG_ADDR addr = *address;
 
     DBG_FIX_ADDR_SEG( &addr, DS_reg(DEBUG_context) );
+    if (!DBG_CHECK_READ_PTR( &addr, sizeof(int) )) return 0;
     return *(int *)DBG_ADDR_TO_LIN( &addr );
 }
 
@@ -34,6 +69,7 @@ void DEBUG_WriteMemory( const DBG_ADDR *address, int value )
     DBG_ADDR addr = *address;
 
     DBG_FIX_ADDR_SEG( &addr, DS_reg(DEBUG_context) );
+    if (!DBG_CHECK_WRITE_PTR( &addr, sizeof(int) )) return;
     *(int *)DBG_ADDR_TO_LIN( &addr ) = value;
 }
 
@@ -57,7 +93,7 @@ void DEBUG_ExamineMemory( const DBG_ADDR *address, int count, char format )
     if (format != 'i' && count > 1)
     {
         DEBUG_PrintAddress( &addr, dbg_mode );
-        fprintf(stderr,":  ");
+        fprintf(stderr,": ");
     }
 
     pnt = DBG_ADDR_TO_LIN( &addr );
@@ -66,7 +102,13 @@ void DEBUG_ExamineMemory( const DBG_ADDR *address, int count, char format )
     {
 	case 's':
 		if (count == 1) count = 256;
-	        while(*pnt && count--) fputc( *pnt++, stderr );
+                while (count--)
+                {
+                    if (!DBG_CHECK_READ_PTR( &addr, sizeof(char) )) return;
+                    if (!*pnt) break;
+                    addr.off++;
+                    fputc( *pnt++, stderr );
+                }
 		fprintf(stderr,"\n");
 		return;
 
@@ -74,7 +116,8 @@ void DEBUG_ExamineMemory( const DBG_ADDR *address, int count, char format )
 		while (count--)
                 {
                     DEBUG_PrintAddress( &addr, dbg_mode );
-                    fprintf(stderr,":  ");
+                    fprintf(stderr,": ");
+                    if (!DBG_CHECK_READ_PTR( &addr, 1 )) return;
                     DEBUG_Disasm( &addr );
                     fprintf(stderr,"\n");
 		}
@@ -83,13 +126,15 @@ void DEBUG_ExamineMemory( const DBG_ADDR *address, int count, char format )
 		dump = (unsigned int *)pnt;
 		for(i=0; i<count; i++) 
 		{
-			fprintf(stderr," %8.8x", *dump++);
-                        addr.off += 4;
-			if ((i % 8) == 7) {
-				fprintf(stderr,"\n");
-				DEBUG_PrintAddress( &addr, dbg_mode );
-				fprintf(stderr,":  ");
-			};
+                    if (!DBG_CHECK_READ_PTR( &addr, sizeof(int) )) return;
+                    fprintf(stderr," %8.8x", *dump++);
+                    addr.off += sizeof(int);
+                    if ((i % 8) == 7)
+                    {
+                        fprintf(stderr,"\n");
+                        DEBUG_PrintAddress( &addr, dbg_mode );
+                        fprintf(stderr,": ");
+                    }
 		}
 		fprintf(stderr,"\n");
 		return;
@@ -98,13 +143,15 @@ void DEBUG_ExamineMemory( const DBG_ADDR *address, int count, char format )
 		dump = (unsigned int *)pnt;
 		for(i=0; i<count; i++) 
 		{
-			fprintf(stderr," %d", *dump++);
-                        addr.off += 4;
-			if ((i % 8) == 7) {
-				fprintf(stderr,"\n");
-				DEBUG_PrintAddress( &addr, dbg_mode );
-				fprintf(stderr,":  ");
-			};
+                    if (!DBG_CHECK_READ_PTR( &addr, sizeof(int) )) return;
+                    fprintf(stderr," %d", *dump++);
+                    addr.off += sizeof(int);
+                    if ((i % 8) == 7)
+                    {
+                        fprintf(stderr,"\n");
+                        DEBUG_PrintAddress( &addr, dbg_mode );
+                        fprintf(stderr,": ");
+                    }
 		}
 		fprintf(stderr,"\n");
 		return;
@@ -113,13 +160,15 @@ void DEBUG_ExamineMemory( const DBG_ADDR *address, int count, char format )
 		wdump = (unsigned short *)pnt;
 		for(i=0; i<count; i++) 
 		{
-			fprintf(stderr," %04x", *wdump++);
-                        addr.off += 2;
-			if ((i % 8) == 7) {
-				fprintf(stderr,"\n");
-				DEBUG_PrintAddress( &addr, dbg_mode );
-				fprintf(stderr,":  ");
-			};
+                    if (!DBG_CHECK_READ_PTR( &addr, sizeof(short) )) return;
+                    fprintf(stderr," %04x", *wdump++);
+                    addr.off += sizeof(short);
+                    if ((i % 8) == 7)
+                    {
+                        fprintf(stderr,"\n");
+                        DEBUG_PrintAddress( &addr, dbg_mode );
+                        fprintf(stderr,": ");
+                    }
 		}
 		fprintf(stderr,"\n");
 		return;
@@ -127,17 +176,20 @@ void DEBUG_ExamineMemory( const DBG_ADDR *address, int count, char format )
 	case 'c':
 		for(i=0; i<count; i++) 
 		{
-			if(*pnt < 0x20) {
-				fprintf(stderr,"  ");
-				pnt++;
-			} else
-				fprintf(stderr," %c", *pnt++);
-                        addr.off++;
-			if ((i % 32) == 31) {
-				fprintf(stderr,"\n");
-				DEBUG_PrintAddress( &addr, dbg_mode );
-				fprintf(stderr,":  ");
-			};
+                    if (!DBG_CHECK_READ_PTR( &addr, sizeof(char) )) return;
+                    if(*pnt < 0x20)
+                    {
+                        fprintf(stderr,"  ");
+                        pnt++;
+                    }
+                    else fprintf(stderr," %c", *pnt++);
+                    addr.off++;
+                    if ((i % 32) == 31)
+                    {
+                        fprintf(stderr,"\n");
+                        DEBUG_PrintAddress( &addr, dbg_mode );
+                        fprintf(stderr,": ");
+                    }
 		}
 		fprintf(stderr,"\n");
 		return;
@@ -145,13 +197,15 @@ void DEBUG_ExamineMemory( const DBG_ADDR *address, int count, char format )
 	case 'b':
 		for(i=0; i<count; i++) 
 		{
-			fprintf(stderr," %02x", (*pnt++) & 0xff);
-                        addr.off++;
-			if ((i % 16) == 15) {
-				fprintf(stderr,"\n");
-				DEBUG_PrintAddress( &addr, dbg_mode );
-				fprintf(stderr,":  ");
-			};
+                    if (!DBG_CHECK_READ_PTR( &addr, sizeof(char) )) return;
+                    fprintf(stderr," %02x", (*pnt++) & 0xff);
+                    addr.off++;
+                    if ((i % 16) == 15)
+                    {
+                        fprintf(stderr,"\n");
+                        DEBUG_PrintAddress( &addr, dbg_mode );
+                        fprintf(stderr,": ");
+                    }
 		}
 		fprintf(stderr,"\n");
 		return;
diff --git a/debugger/readline/Imakefile b/debugger/readline/Imakefile
deleted file mode 100644
index 6678bcb7ed7..00000000000
--- a/debugger/readline/Imakefile
+++ /dev/null
@@ -1,18 +0,0 @@
-#include "../../Wine.tmpl"
-
-MODULE = readline
-
-EXTRA_DEFINES= -DANSI_ARROWS -DHAVE_TCGETATTR -DHIDE
-
-SRCS = \
-	editline.c \
-	sysunix.c
-
-OBJS = $(SRCS:.c=.o)
-
-WineRelocatableTarget($(MODULE),,$(OBJS))
-DependTarget()
-
-includes::
-
-install::
diff --git a/debugger/stack.c b/debugger/stack.c
index 73fcacf4c64..be7fb9b1037 100644
--- a/debugger/stack.c
+++ b/debugger/stack.c
@@ -62,40 +62,46 @@ void DEBUG_BackTrace(void)
     DBG_ADDR addr;
     int frameno = 0;
 
-  fprintf(stderr,"Backtrace:\n");
-  if (SS_reg(DEBUG_context) == WINE_DATA_SELECTOR)  /* 32-bit mode */
-  {
-      FRAME32 *frame = (FRAME32 *)EBP_reg(DEBUG_context);
-      addr.seg = 0;
-      while (frame->ip)
-      {
-          fprintf(stderr,"%d ",frameno++);
-          addr.off = frame->ip;
-          DEBUG_PrintAddress( &addr, 32 );
-          fprintf( stderr, "\n" );
-          frame = (FRAME32 *)frame->bp;
-      }
-  }
-  else  /* 16-bit mode */
-  {
-      FRAME16 *frame = (FRAME16 *)PTR_SEG_OFF_TO_LIN( SS_reg(DEBUG_context),
-                                                  BP_reg(DEBUG_context) & ~1 );
-      WORD cs = CS_reg(DEBUG_context);
-      if (GET_SEL_FLAGS(SS_reg(DEBUG_context)) & LDT_FLAGS_32BIT)
+    fprintf(stderr,"Backtrace:\n");
+    if (SS_reg(DEBUG_context) == WINE_DATA_SELECTOR)  /* 32-bit mode */
+    {
+        addr.seg = 0;
+        addr.off = EBP_reg(DEBUG_context);
+        for (;;)
+        {
+            FRAME32 *frame = (FRAME32 *)addr.off;
+            if (!DBG_CHECK_READ_PTR( &addr, sizeof(FRAME32) )) return;
+            if (!frame->ip) break;
+            fprintf(stderr,"%d ",frameno++);
+            addr.off = frame->ip;
+            DEBUG_PrintAddress( &addr, 32 );
+            fprintf( stderr, "\n" );
+            addr.off = frame->bp;
+        }
+    }
+    else  /* 16-bit mode */
+    {
+      WORD ss = SS_reg(DEBUG_context), cs = CS_reg(DEBUG_context);
+      if (GET_SEL_FLAGS(ss) & LDT_FLAGS_32BIT)
       {
           fprintf( stderr, "Not implemented: 32-bit backtrace on a different stack segment.\n" );
           return;
       }
-      while (frame->bp)
+      addr.seg = SS_reg(DEBUG_context);
+      addr.off = BP_reg(DEBUG_context) & ~1;
+      for (;;)
       {
+          FRAME16 *frame = (FRAME16 *)DBG_ADDR_TO_LIN(&addr);
+          if (!DBG_CHECK_READ_PTR( &addr, sizeof(FRAME16) )) return;
+          if (!frame->bp) break;
           if (frame->bp & 1) cs = frame->cs;
           fprintf( stderr,"%d ", frameno++ );
           addr.seg = cs;
           addr.off = frame->ip;
           DEBUG_PrintAddress( &addr, 16 );
           fprintf( stderr, "\n" );
-          frame = (FRAME16 *)PTR_SEG_OFF_TO_LIN( SS_reg(DEBUG_context),
-                                                 frame->bp & ~1 );
+          addr.seg = ss;
+          addr.off = frame->bp & ~1;
       }
   }
   fprintf( stderr, "\n" );
diff --git a/if1632/Imakefile b/if1632/Imakefile
deleted file mode 100644
index 8eb6c1e159c..00000000000
--- a/if1632/Imakefile
+++ /dev/null
@@ -1,120 +0,0 @@
-#include "../autoconf.h"
-#include "../Wine.tmpl"
-
-MODULE = if1632
-
-SRCS = \
-	callback.c \
-	relay.c \
-	relay32.c
-
-#ifdef WINELIB
-CALLOBJS =
-DLLS16 =
-DLLS32 =
-#else
-CALLOBJS = \
-	call16.o \
-	call32.o
-DLLS16 = \
-	commdlg.spec \
-	compobj.spec \
-	ddeml.spec \
-	gdi.spec \
-	kernel.spec \
-	keyboard.spec \
-	mmsystem.spec \
-	mouse.spec \
-	ole2.spec \
-	ole2conv.spec \
-	ole2disp.spec \
-	ole2nls.spec \
-	ole2prox.spec \
-	olecli.spec \
-	olesvr.spec \
-	shell.spec \
-	sound.spec \
-	storage.spec \
-	stress.spec \
-	system.spec \
-	toolhelp.spec \
-	user.spec \
-	win87em.spec \
-	winprocs.spec \
-	winsock.spec
-DLLS32 = \
-	advapi32.spec \
-	comdlg32.spec \
-	gdi32.spec \
-	kernel32.spec \
-	shell32.spec \
-	user32.spec \
-	winprocs32.spec
-#endif
-
-OBJS = $(SRCS:.c=.o) $(CALLOBJS) $(DLLS16:.spec=.o) $(DLLS32:.spec=.o)
-
-BUILD = $(TOP)/tools/build
-
-#define MakeDll16FromSpec(name)			@@\
-name.S : name.spec $(BUILD)			@@\
-	$(BUILD) -spec16 name.spec > name.S	@@\
-
-#define MakeDll32FromSpec(name)			@@\
-name.c : name.spec $(BUILD)			@@\
-	$(BUILD) -spec32 name.spec > name.c	@@\
-
-/*
- * If you add a new spec file, copy one of these lines
- */
-MakeDll16FromSpec(commdlg)
-MakeDll16FromSpec(compobj)
-MakeDll16FromSpec(ddeml)
-MakeDll16FromSpec(gdi)
-MakeDll16FromSpec(kernel)
-MakeDll16FromSpec(keyboard)
-MakeDll16FromSpec(shell)
-MakeDll16FromSpec(mmsystem)
-MakeDll16FromSpec(mouse)
-MakeDll16FromSpec(ole2)
-MakeDll16FromSpec(ole2conv)
-MakeDll16FromSpec(ole2disp)
-MakeDll16FromSpec(ole2nls)
-MakeDll16FromSpec(ole2prox)
-MakeDll16FromSpec(olecli)
-MakeDll16FromSpec(olesvr)
-MakeDll16FromSpec(sound)
-MakeDll16FromSpec(storage)
-MakeDll16FromSpec(stress)
-MakeDll16FromSpec(system)
-MakeDll16FromSpec(toolhelp)
-MakeDll16FromSpec(user)
-MakeDll16FromSpec(win87em)
-MakeDll16FromSpec(winprocs)
-MakeDll16FromSpec(winsock)
-
-MakeDll32FromSpec(gdi32)
-MakeDll32FromSpec(kernel32)
-MakeDll32FromSpec(shell32)
-MakeDll32FromSpec(user32)
-MakeDll32FromSpec(winprocs32)
-
-WineRelocatableTarget($(MODULE),,$(OBJS))
-DependTarget()
-
-#ifndef WINELIB
-
-call32.S: $(BUILD) $(DLLS16:.spec=.S)
-	$(BUILD) -call32 `cat $(DLLS16:.spec=.S) | grep CallTo32_ | sed 's/.*CallTo32_\(.*\)/\1/' | sort | uniq` > call32.S
-
-call16.S: $(BUILD) $(TOP)/include/callback.h
-	$(BUILD) -call16 `cat $(TOP)/include/callback.h | grep "extern.*CallTo16_" | sed 's/.*CallTo16_\(.*\)(.*/\1/' | sort | uniq` > call16.S
-
-#endif  /* WINELIB */
-
-includes::
-
-install::
-
-clean::
-	$(RM) $(DLLS16:.spec=.S) $(DLLS32:.spec=.c) call32.S call16.S
diff --git a/if1632/callback.c b/if1632/callback.c
index 1cc1fde1835..2d6a742d150 100644
--- a/if1632/callback.c
+++ b/if1632/callback.c
@@ -26,7 +26,6 @@ LONG CallWindowProc( WNDPROC func, HWND hwnd, WORD message,
     WND *wndPtr = WIN_FindWndPtr( hwnd );
 
     if (!wndPtr) return 0;
-    SpyMessage(hwnd, message, wParam, lParam);
 
     /* check if we have something better than 16 bit relays */
     if(!ALIAS_UseAliases || !(a=ALIAS_LookupAlias((DWORD)func)) ||
diff --git a/if1632/gdi.spec b/if1632/gdi.spec
index 2ea33f16032..f9600079f5c 100644
--- a/if1632/gdi.spec
+++ b/if1632/gdi.spec
@@ -254,7 +254,7 @@ id	3
 374 pascal16 GetSystemPaletteUse(word) GetSystemPaletteUse
 375 pascal16 GetSystemPaletteEntries(word word word ptr)
              GetSystemPaletteEntries
-376 stub ResetDC
+376 pascal16 ResetDC(word ptr) ResetDC
 377 stub STARTDOC
 378 stub ENDDOC
 379 stub STARTPAGE
diff --git a/if1632/kernel32.spec b/if1632/kernel32.spec
index 9f0ceee664f..1987061652e 100644
--- a/if1632/kernel32.spec
+++ b/if1632/kernel32.spec
@@ -149,13 +149,13 @@ base	1
 0145 stub FreeResource
 0146 stub FreeVirtualBuffer
 0147 stub GenerateConsoleCtrlEvent
-0148 stub GetACP
+0148    stdcall GetACP() GetACP
 0149 stub GetAtomNameA
 0150 stub GetAtomNameW
 0151 stub GetBinaryType
 0152 stub GetBinaryTypeA
 0153 stub GetBinaryTypeW
-0154 stub GetCPInfo
+0154    stdcall GetCPInfo(long ptr) GetCPInfo
 0155 stub GetCommConfig
 0156 stub GetCommMask
 0157 stub GetCommModemStatus
@@ -214,7 +214,7 @@ base	1
 0210	stdcall GetEnvironmentStrings()	GetEnvironmentStrings
 0211 stub GetEnvironmentStringsA
 0212 stub GetEnvironmentStringsW
-0213 stub GetEnvironmentVariableA
+0213    stdcall GetEnvironmentVariableA(ptr ptr long) GetEnvironmentVariableA
 0214 stub GetEnvironmentVariableW
 0215 stub GetExitCodeProcess
 0216 stub GetExitCodeThread
@@ -223,12 +223,12 @@ base	1
 0219 stub GetFileInformationByHandle
 0220 stub GetFileSize
 0221 stub GetFileTime
-0222 stub GetFileType
+0222    stdcall GetFileType(long) GetFileType
 0223 stub GetFullPathNameA
 0224 stub GetFullPathNameW
 0225 stub GetHandleInformation
 0226 stub GetLargestConsoleWindowSize
-0227 stub GetLastError
+0227    stdcall GetLastError() GetLastError
 0228 stub GetLocalTime
 0229 stub GetLocaleInfoA
 0230 stub GetLocaleInfoW
@@ -236,7 +236,7 @@ base	1
 0232 stub GetLogicalDriveStringsW
 0233 stub GetLogicalDrives
 0234 stub GetMailslotInfo
-0235	return GetModuleFileNameA 12 0
+0235	stdcall GetModuleFileNameA(long ptr long) GetModuleFileNameA
 0236 stub GetModuleFileNameW
 0237	stdcall GetModuleHandleA(ptr)	GetModuleHandle
 0238 stub GetModuleHandleW
@@ -249,7 +249,7 @@ base	1
 0245 stub GetNumberOfConsoleFonts
 0246 stub GetNumberOfConsoleInputEvents
 0247 stub GetNumberOfConsoleMouseButtons
-0248 stub GetOEMCP
+0248    stdcall GetOEMCP() GetOEMCP
 0249 stub GetOverlappedResult
 0250 stub GetPriorityClass
 0251 stub GetPrivateProfileIntA
@@ -274,7 +274,7 @@ base	1
 0270 stub GetQueuedCompletionStatus
 0271 stub GetShortPathNameA
 0272 stub GetShortPathNameW
-0273	return GetStartupInfoA 4 0
+0273	stdcall GetStartupInfoA(ptr) GetStartupInfoA
 0274 stub GetStartupInfoW
 0275	stdcall GetStdHandle(long)	GetStdHandle
 0276 stub GetStringTypeA
@@ -300,10 +300,10 @@ base	1
 0296 stub GetThreadPriority
 0297 stub GetThreadSelectorEntry
 0298 stub GetThreadTimes
-0299 stub GetTickCount
+0299    stdcall GetTickCount() GetTickCount
 0300 stub GetTimeFormatA
 0301 stub GetTimeFormatW
-0302 stub GetTimeZoneInformation
+0302    stdcall GetTimeZoneInformation(ptr) GetTimeZoneInformation
 0303 stub GetUserDefaultLCID
 0304 stub GetUserDefaultLangID
 0305 stub GetVDMCurrentDirectories
@@ -486,7 +486,7 @@ base	1
 0481 stub SetDefaultCommConfigA
 0482 stub SetDefaultCommConfigW
 0483 stub SetEndOfFile
-0484 stub SetEnvironmentVariableA
+0484    stdcall SetEnvironmentVariableA(ptr ptr) SetEnvironmentVariableA
 0485 stub SetEnvironmentVariableW
 0486 stub SetErrorMode
 0487 stub SetEvent
@@ -494,12 +494,12 @@ base	1
 0489 stub SetFileApisToOEM
 0490 stub SetFileAttributesA
 0491 stub SetFileAttributesW
-0492 stub SetFilePointer
+0492    stdcall SetFilePointer(long long ptr long) SetFilePointer
 0493 stub SetFileTime
 0494 stub SetHandleCount
 0495 stub SetHandleInformation
 0496 stub SetLastConsoleEventActive
-0497 stub SetLastError
+0497    stdcall SetLastError(long) SetLastError
 0498 stub SetLocalTime
 0499 stub SetLocaleInfoA
 0500 stub SetLocaleInfoW
@@ -550,9 +550,9 @@ base	1
 0545 stub VerLanguageNameA
 0546 stub VerLanguageNameW
 0547 stub VerifyConsoleIoHandle
-0548 stub VirtualAlloc
+0548    stdcall VirtualAlloc(ptr long long long) VirtualAlloc
 0549 stub VirtualBufferExceptionHandler
-0550 stub VirtualFree
+0550    stdcall VirtualFree(ptr long long) VirtualFree
 0551 stub VirtualLock
 0552 stub VirtualProtect
 0553 stub VirtualProtectEx
@@ -580,7 +580,7 @@ base	1
 0575 stub WriteConsoleOutputCharacterW
 0576 stub WriteConsoleOutputW
 0577 stub WriteConsoleW
-0578 stub WriteFile
+0578    stdcall WriteFile(long ptr long ptr ptr) WriteFile
 0579 stub WriteFileEx
 0580 stub WritePrivateProfileSectionA
 0581 stub WritePrivateProfileSectionW
diff --git a/if1632/mmsystem.spec b/if1632/mmsystem.spec
index d4e0b28d5e9..14171d49242 100644
--- a/if1632/mmsystem.spec
+++ b/if1632/mmsystem.spec
@@ -31,6 +31,8 @@ id	10
 210    pascal  MIDIOUTRESET(word) midiOutReset
 211    pascal  MIDIOUTGETVOLUME(word segptr) midiOutGetVolume
 212    pascal  MIDIOUTSETVOLUME(word long) midiOutSetVolume
+213    pascal  MIDIOUTCACHEPATCHES(word word segptr word) midiOutCachePatches
+214    pascal  MIDIOUTCACHEDRUMPATCHES(word word segptr word) midiOutCacheDrumPatches
 215    pascal  MIDIOUTGETID(word ptr) midiOutGetID
 216    pascal  MIDIOUTMESSAGE(word word long long) midiOutMessage
 301    pascal  MIDIINGETNUMDEVS() midiInGetNumDevs
@@ -86,7 +88,7 @@ id	10
 513    pascal  WAVEINGETID(word ptr) waveInGetID
 514    pascal  WAVEINMESSAGE(word word long long) waveInMessage
 601    pascal  timeGetSystemTime(ptr word) timeGetSystemTime
-602    pascal  timeSetEvent(word word ptr long word) timeSetEvent
+602    pascal  timeSetEvent(word word segptr long word) timeSetEvent
 603    pascal  timeKillEvent(word) timeKillEvent
 604    pascal  timeGetDevCaps(ptr word) timeGetDevCaps
 605    pascal  timeBeginPeriod(word) timeBeginPeriod
diff --git a/if1632/relay.c b/if1632/relay.c
index d325ce8f3b5..df41747e415 100644
--- a/if1632/relay.c
+++ b/if1632/relay.c
@@ -31,8 +31,8 @@ struct dll_table_s dll_builtin_table[N_BUILTINS] =
     DLL_ENTRY(KERNEL),
     DLL_ENTRY(USER),
     DLL_ENTRY(GDI),
-    DLL_ENTRY(WIN87EM),
-    DLL_ENTRY(SHELL),
+    DLL_ENTRY_NOTUSED(WIN87EM),
+    DLL_ENTRY_NOTUSED(SHELL),
     DLL_ENTRY(SOUND),
     DLL_ENTRY(KEYBOARD),
     DLL_ENTRY(WINSOCK),
@@ -41,7 +41,7 @@ struct dll_table_s dll_builtin_table[N_BUILTINS] =
     DLL_ENTRY(SYSTEM),
     DLL_ENTRY(TOOLHELP),
     DLL_ENTRY(MOUSE),
-    DLL_ENTRY(COMMDLG),
+    DLL_ENTRY_NOTUSED(COMMDLG),
     DLL_ENTRY_NOTUSED(OLE2),
     DLL_ENTRY_NOTUSED(OLE2CONV),
     DLL_ENTRY_NOTUSED(OLE2DISP),
diff --git a/if1632/relay32.c b/if1632/relay32.c
index 0d0630d6dfa..0d906d4daed 100644
--- a/if1632/relay32.c
+++ b/if1632/relay32.c
@@ -13,6 +13,7 @@
 #include "windows.h"
 #include "dlls.h"
 #include "pe_image.h"
+#include "relay32.h"
 #include "stddebug.h"
 /* #define DEBUG_RELAY */
 #include "debug.h"
@@ -110,8 +111,7 @@ LONG RELAY32_CallWindowProc( WNDPROC func, int hwnd, int message,
              int wParam, int lParam )
 {
 	int ret;
-	SpyMessage(hwnd, message, wParam, lParam);
-	__asm__ (
+__asm__ (
 		"push %1;"
 		"push %2;"
 		"push %3;"
diff --git a/if1632/user.spec b/if1632/user.spec
index dd82aee3351..63b7a9df2bb 100644
--- a/if1632/user.spec
+++ b/if1632/user.spec
@@ -329,7 +329,7 @@ id	2
 362 stub DCHook
 364 stub LookupIconIDFromDirectoryEx
 368 pascal16 CopyIcon(word word) CopyIcon
-369 stub CopyCursor
+369 pascal16 CopyCursor(word word) CopyCursor
 370 pascal16 GetWindowPlacement(word ptr) GetWindowPlacement
 371 pascal16 SetWindowPlacement(word ptr) SetWindowPlacement
 372 stub GetInternalIconHeader
@@ -358,7 +358,7 @@ id	2
 403 pascal16 UnregisterClass(segptr word) UnregisterClass
 404 pascal16 GetClassInfo(word segptr ptr) GetClassInfo
 406 pascal16 CreateCursor(word word word word word ptr ptr) CreateCursor
-407 pascal16 CreateIcon(word word word byte byte ptr ptr) CreateIcon
+407 pascal16 CreateIcon(word word word word word ptr ptr) CreateIcon
 408 pascal16 CreateCursorIconIndirect(word ptr ptr ptr)
 	     CreateCursorIconIndirect
 409 stub InitThreadInput
@@ -401,7 +401,7 @@ id	2
 452 pascal16 CreateWindowEx(long segptr segptr long s_word s_word s_word s_word
                             word word word segptr) CreateWindowEx
 454 pascal16 AdjustWindowRectEx(ptr long word long) AdjustWindowRectEx
-455 stub GetIconId
+455 pascal16 GetIconID(word long) GetIconID
 456 pascal16 LoadIconHandler(word word) LoadIconHandler
 457 pascal16 DestroyIcon(word) DestroyIcon
 458 pascal16 DestroyCursor(word) DestroyCursor
@@ -410,7 +410,7 @@ id	2
 461 pascal16 SetInternalWindowPos(word word ptr ptr) SetInternalWindowPos
 462 pascal16 CalcChildScroll(word word) CalcChildScroll
 463 stub ScrollChildren
-464 stub DragObject
+464 pascal16 DragObject(word word word word word word) DragObject
 465 stub DragDetect
 466 pascal16 DrawFocusRect(word ptr) DrawFocusRect
 470 stub StringFunc
diff --git a/if1632/winprocs.spec b/if1632/winprocs.spec
index 27fd50fc37e..b770e4dd26b 100644
--- a/if1632/winprocs.spec
+++ b/if1632/winprocs.spec
@@ -108,7 +108,7 @@ id	24
 172 register INT_Int48Handler(word) INT_DummyHandler
 173 register INT_Int49Handler(word) INT_DummyHandler
 174 register INT_Int4aHandler(word) INT_DummyHandler
-175 register INT_Int4bHandler(word) INT_DummyHandler
+175 register INT_Int4bHandler(word) INT_Int4bHandler
 176 register INT_Int4cHandler(word) INT_DummyHandler
 177 register INT_Int4dHandler(word) INT_DummyHandler
 178 register INT_Int4eHandler(word) INT_DummyHandler
@@ -289,3 +289,12 @@ id	24
 353 register INT_IntfdHandler(word) INT_DummyHandler
 354 register INT_IntfeHandler(word) INT_DummyHandler
 355 register INT_IntffHandler(word) INT_DummyHandler
+
+# VxDs. The first Vxd is at 400
+#
+#400+VXD_ID register <VxD handler>(word) <VxD handler>
+#
+414 register VXD_Comm(word) VXD_Comm
+#415 register VXD_Printer(word) VXD_Printer
+423 register VXD_Shell(word) VXD_Shell
+433 register VXD_PageFile(word) VXD_PageFile
diff --git a/include/bitmap.h b/include/bitmap.h
index dda2d553a96..c236cdcd3ec 100644
--- a/include/bitmap.h
+++ b/include/bitmap.h
@@ -45,6 +45,6 @@ extern int DIB_BitmapInfoSize( BITMAPINFO * info, WORD coloruse );
 
   /* objects/oembitmap.c */
 extern HBITMAP OBM_LoadBitmap( WORD id );
-extern HICON OBM_LoadIcon( WORD id );
+extern HANDLE OBM_LoadCursorIcon( WORD id, BOOL fCursor );
 
 #endif  /* __WINE_BITMAP_H */
diff --git a/include/bitmaps/ocr_cross b/include/bitmaps/ocr_cross
new file mode 100644
index 00000000000..c13793fdf97
--- /dev/null
+++ b/include/bitmaps/ocr_cross
@@ -0,0 +1,37 @@
+/* XPM */
+static char * ocr_cross[] = {
+"32 32 2 1 9 9",
+" 	s None	c None",
+".	s black c black",
+"         .                      ",
+"         .                      ",
+"         .                      ",
+"         .                      ",
+"         .                      ",
+"         .                      ",
+"         .                      ",
+"         .                      ",
+"         .                      ",
+"...................             ",
+"         .                      ",
+"         .                      ",
+"         .                      ",
+"         .                      ",
+"         .                      ",
+"         .                      ",
+"         .                      ",
+"         .                      ",
+"         .                      ",
+"                                ",
+"                                ",
+"                                ",
+"                                ",
+"                                ",
+"                                ",
+"                                ",
+"                                ",
+"                                ",
+"                                ",
+"                                ",
+"                                ",
+"                                "};
diff --git a/include/bitmaps/ocr_ibeam b/include/bitmaps/ocr_ibeam
new file mode 100644
index 00000000000..e372a1eab6a
--- /dev/null
+++ b/include/bitmaps/ocr_ibeam
@@ -0,0 +1,37 @@
+/* XPM */
+static char * ocr_ibeam[] = {
+"32 32 2 1 3 8",
+" 	s black c black",
+".	s None	c None",
+"   .   .........................",
+"... ............................",
+"... ............................",
+"... ............................",
+"... ............................",
+"... ............................",
+"... ............................",
+"... ............................",
+"... ............................",
+"... ............................",
+"... ............................",
+"... ............................",
+"... ............................",
+"... ............................",
+"... ............................",
+"... ............................",
+"   .   .........................",
+"................................",
+"................................",
+"................................",
+"................................",
+"................................",
+"................................",
+"................................",
+"................................",
+"................................",
+"................................",
+"................................",
+"................................",
+"................................",
+"................................",
+"................................"};
diff --git a/include/bitmaps/ocr_icon b/include/bitmaps/ocr_icon
new file mode 100644
index 00000000000..351f744c15b
--- /dev/null
+++ b/include/bitmaps/ocr_icon
@@ -0,0 +1,38 @@
+/* XPM */
+static char * ocr_icon[] = {
+"32 32 3 1 8 6",
+" 	s black c black",
+".	s None	c None",
+"X	s white c white",
+"                 ...............",
+"                 ...............",
+"   XXXXXXXXXXX   ...............",
+"   XX       XX   ...............",
+"   XX       XX   ...............",
+"   XX       XX   ...............",
+"   XX       XX   ...............",
+"   XX       XX   ...............",
+"   XX       XX   ...............",
+"   XX       XX   ...............",
+"   XXXXXXXXXXX   ...............",
+"                 ...............",
+"                 ...............",
+"................................",
+"................................",
+"................................",
+"................................",
+"................................",
+"................................",
+"................................",
+"................................",
+"................................",
+"................................",
+"................................",
+"................................",
+"................................",
+"................................",
+"................................",
+"................................",
+"................................",
+"................................",
+"................................"};
diff --git a/include/bitmaps/ocr_normal b/include/bitmaps/ocr_normal
new file mode 100644
index 00000000000..47e7409df2f
--- /dev/null
+++ b/include/bitmaps/ocr_normal
@@ -0,0 +1,38 @@
+/* XPM */
+static char * ocr_normal[] = {
+"32 32 3 1 0 0",
+" 	s black c black",
+".	s None	c None",
+"X	s white c white",
+"  ..............................",
+" X .............................",
+" XX ............................",
+" XXX ...........................",
+" XXXX ..........................",
+" XXXXX .........................",
+" XXXXXX ........................",
+" XXXXXXX .......................",
+" XXXXXXXX ......................",
+" XXXXXXXXX .....................",
+" XXXXXX     ....................",
+" XXX XX ........................",
+" XX  XX ........................",
+" X .  XX .......................",
+"  ... XX .......................",
+" ..... XX ......................",
+"...... XX ......................",
+"....... XX .....................",
+"....... XX .....................",
+"........  ......................",
+"................................",
+"................................",
+"................................",
+"................................",
+"................................",
+"................................",
+"................................",
+"................................",
+"................................",
+"................................",
+"................................",
+"................................"};
diff --git a/include/bitmaps/ocr_size b/include/bitmaps/ocr_size
new file mode 100644
index 00000000000..f33f604587b
--- /dev/null
+++ b/include/bitmaps/ocr_size
@@ -0,0 +1,38 @@
+/* XPM */
+static char * ocr_size[] = {
+"32 32 3 1 11 11",
+" 	s None	c None",
+".	s black c black",
+"X	s white c white",
+"           ..                   ",
+"          .XX.                  ",
+"         .XXXX.                 ",
+"        .XXXXXX.                ",
+"       .XXXXXXXX.               ",
+"       ....XX....               ",
+"          .XX.                  ",
+"    ..    .XX.    ..            ",
+"   .X.    .XX.    .X.           ",
+"  .XX.    .XX.    .XX.          ",
+" .XXX......XX......XXX.         ",
+".XXXXXXXXXXXXXXXXXXXXXX.        ",
+".XXXXXXXXXXXXXXXXXXXXXX.        ",
+" .XXX......XX......XXX.         ",
+"  .XX.    .XX.    .XX.          ",
+"   .X.    .XX.    .X.           ",
+"    ..    .XX.    ..            ",
+"          .XX.                  ",
+"       ....XX....               ",
+"       .XXXXXXXX.               ",
+"        .XXXXXX.                ",
+"         .XXXX.                 ",
+"          .XX.                  ",
+"           ..                   ",
+"                                ",
+"                                ",
+"                                ",
+"                                ",
+"                                ",
+"                                ",
+"                                ",
+"                                "};
diff --git a/include/bitmaps/ocr_sizenesw b/include/bitmaps/ocr_sizenesw
new file mode 100644
index 00000000000..4159a7ff215
--- /dev/null
+++ b/include/bitmaps/ocr_sizenesw
@@ -0,0 +1,38 @@
+/* XPM */
+static char * ocr_sizenesw[] = {
+"32 32 3 1 6 6",
+" 	s None	c None",
+".	s black c black",
+"X	s white c white",
+"     .......                    ",
+"     .XXXXXX.                   ",
+"      .XXXXX.                   ",
+"       .XXXX.                   ",
+"      .XXXXX.                   ",
+"..   .XXX.XX.                   ",
+".X. .XXX. .X.                   ",
+".XX.XXX.   ..                   ",
+".XXXXX.                         ",
+".XXXX.                          ",
+".XXXXX.                         ",
+".XXXXXX.                        ",
+" .......                        ",
+"                                ",
+"                                ",
+"                                ",
+"                                ",
+"                                ",
+"                                ",
+"                                ",
+"                                ",
+"                                ",
+"                                ",
+"                                ",
+"                                ",
+"                                ",
+"                                ",
+"                                ",
+"                                ",
+"                                ",
+"                                ",
+"                                "};
diff --git a/include/bitmaps/ocr_sizens b/include/bitmaps/ocr_sizens
new file mode 100644
index 00000000000..39fc6801d0b
--- /dev/null
+++ b/include/bitmaps/ocr_sizens
@@ -0,0 +1,38 @@
+/* XPM */
+static char * ocr_sizens[] = {
+"32 32 3 1 4 7",
+" 	s None	c None",
+".	s black c black",
+"X	s white c white",
+"    ..                          ",
+"   .XX.                         ",
+"  .XXXX.                        ",
+" .XXXXXX.                       ",
+".XXXXXXXX.                      ",
+"....XX....                      ",
+"   .XX.                         ",
+"   .XX.                         ",
+"   .XX.                         ",
+"   .XX.                         ",
+"....XX....                      ",
+".XXXXXXXX.                      ",
+" .XXXXXX.                       ",
+"  .XXXX.                        ",
+"   .XX.                         ",
+"    ..                          ",
+"                                ",
+"                                ",
+"                                ",
+"                                ",
+"                                ",
+"                                ",
+"                                ",
+"                                ",
+"                                ",
+"                                ",
+"                                ",
+"                                ",
+"                                ",
+"                                ",
+"                                ",
+"                                "};
diff --git a/include/bitmaps/ocr_sizenwse b/include/bitmaps/ocr_sizenwse
new file mode 100644
index 00000000000..6f6491f7f19
--- /dev/null
+++ b/include/bitmaps/ocr_sizenwse
@@ -0,0 +1,38 @@
+/* XPM */
+static char * ocr_sizenwse[] = {
+"32 32 3 1 6 6",
+" 	s None	c None",
+".	s black c black",
+"X	s white c white",
+" .......                        ",
+".XXXXXX.                        ",
+".XXXXX.                         ",
+".XXXX.                          ",
+".XXXXX.                         ",
+".XX.XXX.   ..                   ",
+".X. .XXX. .X.                   ",
+"..   .XXX.XX.                   ",
+"      .XXXXX.                   ",
+"       .XXXX.                   ",
+"      .XXXXX.                   ",
+"     .XXXXXX.                   ",
+"     .......                    ",
+"                                ",
+"                                ",
+"                                ",
+"                                ",
+"                                ",
+"                                ",
+"                                ",
+"                                ",
+"                                ",
+"                                ",
+"                                ",
+"                                ",
+"                                ",
+"                                ",
+"                                ",
+"                                ",
+"                                ",
+"                                ",
+"                                "};
diff --git a/include/bitmaps/ocr_sizewe b/include/bitmaps/ocr_sizewe
new file mode 100644
index 00000000000..281a9a07d5b
--- /dev/null
+++ b/include/bitmaps/ocr_sizewe
@@ -0,0 +1,38 @@
+/* XPM */
+static char * ocr_sizewe[] = {
+"32 32 3 1 7 4",
+" 	s None	c None",
+".	s black c black",
+"X	s white c white",
+"    ..    ..                    ",
+"   .X.    .X.                   ",
+"  .XX.    .XX.                  ",
+" .XXX......XXX.                 ",
+".XXXXXXXXXXXXXX.                ",
+".XXXXXXXXXXXXXX.                ",
+" .XXX......XXX.                 ",
+"  .XX.    .XX.                  ",
+"   .X.    .X.                   ",
+"    ..    ..                    ",
+"                                ",
+"                                ",
+"                                ",
+"                                ",
+"                                ",
+"                                ",
+"                                ",
+"                                ",
+"                                ",
+"                                ",
+"                                ",
+"                                ",
+"                                ",
+"                                ",
+"                                ",
+"                                ",
+"                                ",
+"                                ",
+"                                ",
+"                                ",
+"                                ",
+"                                "};
diff --git a/include/bitmaps/ocr_up b/include/bitmaps/ocr_up
new file mode 100644
index 00000000000..ee5726fdbe3
--- /dev/null
+++ b/include/bitmaps/ocr_up
@@ -0,0 +1,38 @@
+/* XPM */
+static char * ocr_up[] = {
+"32 32 3 1 6 0",
+" 	s None	c None",
+".	s black c black",
+"X	s white c white",
+"      ..                        ",
+"      ..                        ",
+"     ....                       ",
+"     ....                       ",
+"    ..XX..                      ",
+"    ..XX..                      ",
+"   ..XXXX..                     ",
+"   ..XXXX..                     ",
+"  ..XXXXXX..                    ",
+"  ..XXXXXX..                    ",
+" ..XXXXXXXX..                   ",
+" ..XXXXXXXX..                   ",
+"..XXXXXXXXXX..                  ",
+"..XXXXXXXXXX..                  ",
+".....XXXX.....                  ",
+".....XXXX.....                  ",
+"   ..XXXX..                     ",
+"   ..XXXX..                     ",
+"   ..XXXX..                     ",
+"   ..XXXX..                     ",
+"   ..XXXX..                     ",
+"   ..XXXX..                     ",
+"   ..XXXX..                     ",
+"   ..XXXX..                     ",
+"   ..XXXX..                     ",
+"   ..XXXX..                     ",
+"   ........                     ",
+"   ........                     ",
+"                                ",
+"                                ",
+"                                ",
+"                                "};
diff --git a/include/bitmaps/ocr_wait b/include/bitmaps/ocr_wait
new file mode 100644
index 00000000000..4c9d73d942b
--- /dev/null
+++ b/include/bitmaps/ocr_wait
@@ -0,0 +1,38 @@
+/* XPM */
+static char * ocr_wait[] = {
+"32 32 3 1 7 13",
+" 	s black c black",
+".	s None	c None",
+"X	s white c white",
+"               .................",
+"               .................",
+"  XXXXXXXXXXX  .................",
+".             ..................",
+".  XXXXXXXXX  ..................",
+".  XXXXXXXXX  ..................",
+".  XXXXXX XX  ..................",
+".  X X X X X  ..................",
+".  XX X X XX  ..................",
+"..  XX X XX  ...................",
+"...  XX XX  ....................",
+"....  XXX  .....................",
+".....  X  ......................",
+".....  X  ......................",
+".....  X  ......................",
+"....  XXX  .....................",
+"...  XXXXX  ....................",
+"..  XXX XXX  ...................",
+".  XXXXXXXXX  ..................",
+".  XXXX XXXX  ..................",
+".  XXX X XXX  ..................",
+".  XX X X XX  ..................",
+".  X X X X X  ..................",
+".             ..................",
+"  XXXXXXXXXXX  .................",
+"               .................",
+"               .................",
+"................................",
+"................................",
+"................................",
+"................................",
+"................................"};
diff --git a/include/button.h b/include/button.h
index b9b0565970a..28fdd821dd5 100644
--- a/include/button.h
+++ b/include/button.h
@@ -28,6 +28,7 @@ typedef struct
 
 #define BUTTON_STATE(hwnd)     ((WIN_FindWndPtr(hwnd))->wExtra[0])
 
-extern LONG ButtonWndProc( HWND hWnd, WORD uMsg, WORD wParam, LONG lParam );
+extern LRESULT ButtonWndProc( HWND hWnd, UINT uMsg,
+                              WPARAM wParam, LPARAM lParam );
 
 #endif  /* BUTTON_H */
diff --git a/include/callback.h b/include/callback.h
index b1a0e586e8c..1e5649c1ee9 100644
--- a/include/callback.h
+++ b/include/callback.h
@@ -12,8 +12,6 @@
 
 #include "stackframe.h"
 
-#ifndef WINELIB
-
 extern int CallTo32_LargeStack( int (*func)(), int nbargs, ... );
 
 
@@ -22,6 +20,9 @@ extern int CallTo32_LargeStack( int (*func)(), int nbargs, ... );
 
                                /* func     ds    parameters */
 extern WORD CallTo16_word_     ( FARPROC, WORD );
+
+#ifndef WINELIB
+
 extern WORD CallTo16_word_ww   ( FARPROC, WORD, WORD, WORD );
 extern WORD CallTo16_word_wl   ( FARPROC, WORD, WORD, LONG );
 extern WORD CallTo16_word_ll   ( FARPROC, WORD, LONG, LONG );
diff --git a/include/class.h b/include/class.h
index 8e27cd38d66..90c3a3c9ab8 100644
--- a/include/class.h
+++ b/include/class.h
@@ -32,7 +32,7 @@ typedef struct tagCLASS
 #endif
 
 
-HCLASS CLASS_FindClassByName( SEGPTR name, WORD hinstance, CLASS **ptr );
+HCLASS CLASS_FindClassByName( SEGPTR name, HINSTANCE hinstance, CLASS **ptr );
 CLASS * CLASS_FindClassPtr( HCLASS hclass );
 
 
diff --git a/include/combo.h b/include/combo.h
index cf301f0b86f..d89bd6e01b9 100644
--- a/include/combo.h
+++ b/include/combo.h
@@ -15,3 +15,6 @@ typedef struct {
   RECT  RectButton;
   BOOL  bRedrawFlag;
 } HEADCOMBO,*LPHEADCOMBO;
+
+LRESULT ComboBoxWndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam);
+LRESULT ComboLBoxWndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam);
diff --git a/include/commdlg.h b/include/commdlg.h
index 2161a6cdadf..dcc96b99fb3 100644
--- a/include/commdlg.h
+++ b/include/commdlg.h
@@ -290,7 +290,13 @@ typedef DEVNAMES * LPDEVNAMES;
 #define FINDDLG		       		9
 #define REPLACEDLG	       		10
 
-
+LRESULT FileOpenDlgProc(HWND hWnd, UINT wMsg, WPARAM wParam, LPARAM lParam);
+LRESULT FileSaveDlgProc(HWND hWnd, UINT wMsg, WPARAM wParam, LPARAM lParam);
+LRESULT ColorDlgProc(HWND hWnd, UINT wMsg, WPARAM wParam, LPARAM lParam);
+LRESULT FindTextDlgProc(HWND hWnd, UINT wMsg, WPARAM wParam, LPARAM lParam);
+LRESULT ReplaceTextDlgProc(HWND hWnd, UINT wMsg, WPARAM wParam, LPARAM lParam);
+LRESULT PrintDlgProc(HWND hWnd, UINT wMsg, WPARAM wParam, LPARAM lParam);
+LRESULT PrintSetupDlgProc(HWND hWnd, UINT wMsg, WPARAM wParam, LPARAM lParam);
 
 #endif 		/* #ifdef COMMDLG_H */
 
diff --git a/include/cursor.h b/include/cursor.h
deleted file mode 100644
index 85c5c8c5d22..00000000000
--- a/include/cursor.h
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * structure definitions for CURSOR
- *
- * Copyright  Martin Ayotte, 1993
- *
- */
-#ifndef __WINE_CURSOR_H
-#define __WINE_CURSOR_H
-
-
-typedef struct {
-        POINT           pntHotSpot;     /* cursor hot spot */
-        WORD            nWidth;         /* width of bitmap in pixels */
-        WORD            nHeight;
-        WORD            nWidthBytes;
-        BYTE            byPlanes;       /* number of bit planes */
-        BYTE            byBitsPix;      /* bits per pixel */
-        } CURSORICONINFO, FAR *LPCURSORICONINFO;
-
-typedef struct  {
-	WORD	cdReserved;
-	WORD	cdType;
-	WORD	cdCount;
-        } CURSORDIR;
- 
-typedef struct {
-	WORD	Width;
-	WORD	Height;
-	WORD	Planes;
-	WORD	BitCount;
-	DWORD	curDIBSize;
-	WORD	curDIBOffset;
-	} CURSORDESCRIP;
-
-typedef struct  {
-	Cursor	xcursor;
-	} CURSORALLOC;
-
-extern void CURSOR_SetWinCursor( HWND hwnd, HCURSOR hcursor );   /* cursor.c */
-
-#endif /* __WINE_CURSOR_H */
diff --git a/include/cursoricon.h b/include/cursoricon.h
new file mode 100644
index 00000000000..214ddbf07b7
--- /dev/null
+++ b/include/cursoricon.h
@@ -0,0 +1,59 @@
+/*
+ * Cursor and icon definitions
+ *
+ * Copyright 1995 Alexandre Julliard
+ */
+
+#ifndef __WINE_CURSORICON_H
+#define __WINE_CURSORICON_H
+
+#include <X11/Xlib.h>
+#include "windows.h"
+
+#ifndef WINELIB
+#pragma pack(1)
+#endif
+
+typedef struct
+{
+    BYTE   bWidth;
+    BYTE   bHeight;
+    BYTE   bColorCount;
+    BYTE   bReserved;
+    WORD   wPlanes;
+    WORD   wBitCount;
+    DWORD  dwBytesInRes;
+    WORD   wResId;
+} ICONDIRENTRY;
+
+typedef struct
+{
+    WORD   wWidth;
+    WORD   wHeight;
+    WORD   wPlanes;
+    WORD   wBitCount;
+    DWORD  dwBytesInRes;
+    WORD   wResId;
+} CURSORDIRENTRY;
+
+typedef union
+{
+    ICONDIRENTRY    icon;
+    CURSORDIRENTRY  cursor;
+} CURSORICONDIRENTRY;
+
+typedef struct
+{
+    WORD                idReserved;
+    WORD                idType;
+    WORD                idCount;
+    CURSORICONDIRENTRY  idEntries[1] WINE_PACKED;
+} CURSORICONDIR;
+
+#ifndef WINELIB
+#pragma pack(4)
+#endif
+
+extern Cursor CURSORICON_XCursor;  /* Current X cursor */
+
+#endif /* __WINE_CURSORICON_H */
diff --git a/include/debug.h b/include/debug.h
index 8d746158440..a67f7220d24 100644
--- a/include/debug.h
+++ b/include/debug.h
@@ -78,10 +78,8 @@
 #undef DEBUG_RESOURCE
 #undef DEBUG_SCROLL
 #undef DEBUG_SELECTOR
-#undef DEBUG_SELECTORS
 #undef DEBUG_SEM
 #undef DEBUG_SHM
-#undef DEBUG_SPY
 #undef DEBUG_STRESS
 #undef DEBUG_SYSCOLOR
 #undef DEBUG_TASK
@@ -89,6 +87,7 @@
 #undef DEBUG_TIMER
 #undef DEBUG_TOOLHELP
 #undef DEBUG_UTILITY
+#undef DEBUG_VXD
 #undef DEBUG_WIN
 #undef DEBUG_WINSOCK
 #endif
@@ -156,10 +155,8 @@
 #define DEBUG_RESOURCE
 #define DEBUG_SCROLL
 #define DEBUG_SELECTOR
-#define DEBUG_SELECTORS
 #define DEBUG_SEM
 #define DEBUG_SHM
-#define DEBUG_SPY
 #define DEBUG_STRESS
 #define DEBUG_SYSCOLOR
 #define DEBUG_TASK
@@ -167,6 +164,7 @@
 #define DEBUG_TIMER
 #define DEBUG_TOOLHELP
 #define DEBUG_UTILITY
+#define DEBUG_VXD
 #define DEBUG_WIN
 #define DEBUG_WINSOCK
 #endif
@@ -484,11 +482,6 @@ short debug_msg_enabled[]={
 #else
     0,
 #endif
-#ifdef DEBUG_SELECTORS
-    1,
-#else
-    0,
-#endif
 #ifdef DEBUG_SEM
     1,
 #else
@@ -499,11 +492,6 @@ short debug_msg_enabled[]={
 #else
     0,
 #endif
-#ifdef DEBUG_SPY
-    1,
-#else
-    0,
-#endif
 #ifdef DEBUG_STRESS
     1,
 #else
@@ -539,6 +527,11 @@ short debug_msg_enabled[]={
 #else
     0,
 #endif
+#ifdef DEBUG_VXD
+    1,
+#else
+    0,
+#endif
 #ifdef DEBUG_WIN
     1,
 #else
@@ -1363,21 +1356,8 @@ extern short debug_msg_enabled[];
 #endif
 
 #ifdef DEBUG_RUNTIME
-#define dprintf_selectors if(!debug_msg_enabled[62]) ; else fprintf
-#define debugging_selectors debug_msg_enabled[62]
-#else
-#ifdef DEBUG_SELECTORS
-#define dprintf_selectors fprintf
-#define debugging_selectors 1
-#else
-#define dprintf_selectors while(0) fprintf
-#define debugging_selectors 0
-#endif
-#endif
-
-#ifdef DEBUG_RUNTIME
-#define dprintf_sem if(!debug_msg_enabled[63]) ; else fprintf
-#define debugging_sem debug_msg_enabled[63]
+#define dprintf_sem if(!debug_msg_enabled[62]) ; else fprintf
+#define debugging_sem debug_msg_enabled[62]
 #else
 #ifdef DEBUG_SEM
 #define dprintf_sem fprintf
@@ -1389,8 +1369,8 @@ extern short debug_msg_enabled[];
 #endif
 
 #ifdef DEBUG_RUNTIME
-#define dprintf_shm if(!debug_msg_enabled[64]) ; else fprintf
-#define debugging_shm debug_msg_enabled[64]
+#define dprintf_shm if(!debug_msg_enabled[63]) ; else fprintf
+#define debugging_shm debug_msg_enabled[63]
 #else
 #ifdef DEBUG_SHM
 #define dprintf_shm fprintf
@@ -1402,21 +1382,8 @@ extern short debug_msg_enabled[];
 #endif
 
 #ifdef DEBUG_RUNTIME
-#define dprintf_spy if(!debug_msg_enabled[65]) ; else fprintf
-#define debugging_spy debug_msg_enabled[65]
-#else
-#ifdef DEBUG_SPY
-#define dprintf_spy fprintf
-#define debugging_spy 1
-#else
-#define dprintf_spy while(0) fprintf
-#define debugging_spy 0
-#endif
-#endif
-
-#ifdef DEBUG_RUNTIME
-#define dprintf_stress if(!debug_msg_enabled[66]) ; else fprintf
-#define debugging_stress debug_msg_enabled[66]
+#define dprintf_stress if(!debug_msg_enabled[64]) ; else fprintf
+#define debugging_stress debug_msg_enabled[64]
 #else
 #ifdef DEBUG_STRESS
 #define dprintf_stress fprintf
@@ -1428,8 +1395,8 @@ extern short debug_msg_enabled[];
 #endif
 
 #ifdef DEBUG_RUNTIME
-#define dprintf_syscolor if(!debug_msg_enabled[67]) ; else fprintf
-#define debugging_syscolor debug_msg_enabled[67]
+#define dprintf_syscolor if(!debug_msg_enabled[65]) ; else fprintf
+#define debugging_syscolor debug_msg_enabled[65]
 #else
 #ifdef DEBUG_SYSCOLOR
 #define dprintf_syscolor fprintf
@@ -1441,8 +1408,8 @@ extern short debug_msg_enabled[];
 #endif
 
 #ifdef DEBUG_RUNTIME
-#define dprintf_task if(!debug_msg_enabled[68]) ; else fprintf
-#define debugging_task debug_msg_enabled[68]
+#define dprintf_task if(!debug_msg_enabled[66]) ; else fprintf
+#define debugging_task debug_msg_enabled[66]
 #else
 #ifdef DEBUG_TASK
 #define dprintf_task fprintf
@@ -1454,8 +1421,8 @@ extern short debug_msg_enabled[];
 #endif
 
 #ifdef DEBUG_RUNTIME
-#define dprintf_text if(!debug_msg_enabled[69]) ; else fprintf
-#define debugging_text debug_msg_enabled[69]
+#define dprintf_text if(!debug_msg_enabled[67]) ; else fprintf
+#define debugging_text debug_msg_enabled[67]
 #else
 #ifdef DEBUG_TEXT
 #define dprintf_text fprintf
@@ -1467,8 +1434,8 @@ extern short debug_msg_enabled[];
 #endif
 
 #ifdef DEBUG_RUNTIME
-#define dprintf_timer if(!debug_msg_enabled[70]) ; else fprintf
-#define debugging_timer debug_msg_enabled[70]
+#define dprintf_timer if(!debug_msg_enabled[68]) ; else fprintf
+#define debugging_timer debug_msg_enabled[68]
 #else
 #ifdef DEBUG_TIMER
 #define dprintf_timer fprintf
@@ -1480,8 +1447,8 @@ extern short debug_msg_enabled[];
 #endif
 
 #ifdef DEBUG_RUNTIME
-#define dprintf_toolhelp if(!debug_msg_enabled[71]) ; else fprintf
-#define debugging_toolhelp debug_msg_enabled[71]
+#define dprintf_toolhelp if(!debug_msg_enabled[69]) ; else fprintf
+#define debugging_toolhelp debug_msg_enabled[69]
 #else
 #ifdef DEBUG_TOOLHELP
 #define dprintf_toolhelp fprintf
@@ -1493,8 +1460,8 @@ extern short debug_msg_enabled[];
 #endif
 
 #ifdef DEBUG_RUNTIME
-#define dprintf_utility if(!debug_msg_enabled[72]) ; else fprintf
-#define debugging_utility debug_msg_enabled[72]
+#define dprintf_utility if(!debug_msg_enabled[70]) ; else fprintf
+#define debugging_utility debug_msg_enabled[70]
 #else
 #ifdef DEBUG_UTILITY
 #define dprintf_utility fprintf
@@ -1506,8 +1473,21 @@ extern short debug_msg_enabled[];
 #endif
 
 #ifdef DEBUG_RUNTIME
-#define dprintf_win if(!debug_msg_enabled[73]) ; else fprintf
-#define debugging_win debug_msg_enabled[73]
+#define dprintf_vxd if(!debug_msg_enabled[71]) ; else fprintf
+#define debugging_vxd debug_msg_enabled[71]
+#else
+#ifdef DEBUG_VXD
+#define dprintf_vxd fprintf
+#define debugging_vxd 1
+#else
+#define dprintf_vxd while(0) fprintf
+#define debugging_vxd 0
+#endif
+#endif
+
+#ifdef DEBUG_RUNTIME
+#define dprintf_win if(!debug_msg_enabled[72]) ; else fprintf
+#define debugging_win debug_msg_enabled[72]
 #else
 #ifdef DEBUG_WIN
 #define dprintf_win fprintf
@@ -1519,8 +1499,8 @@ extern short debug_msg_enabled[];
 #endif
 
 #ifdef DEBUG_RUNTIME
-#define dprintf_winsock if(!debug_msg_enabled[74]) ; else fprintf
-#define debugging_winsock debug_msg_enabled[74]
+#define dprintf_winsock if(!debug_msg_enabled[73]) ; else fprintf
+#define debugging_winsock debug_msg_enabled[73]
 #else
 #ifdef DEBUG_WINSOCK
 #define dprintf_winsock fprintf
@@ -1597,10 +1577,8 @@ static char *debug_msg_name[] = {
     "resource",
     "scroll",
     "selector",
-    "selectors",
     "sem",
     "shm",
-    "spy",
     "stress",
     "syscolor",
     "task",
@@ -1608,6 +1586,7 @@ static char *debug_msg_name[] = {
     "timer",
     "toolhelp",
     "utility",
+    "vxd",
     "win",
     "winsock",
     ""
diff --git a/include/debugger.h b/include/debugger.h
index 331182520d6..9190ff1c5e2 100644
--- a/include/debugger.h
+++ b/include/debugger.h
@@ -26,6 +26,18 @@ typedef struct
     ((addr)->seg ? (char *)PTR_SEG_OFF_TO_LIN((addr)->seg,(addr)->off) \
                  : (char *)(addr)->off)
 
+#define DBG_CHECK_READ_PTR(addr,len) \
+    (!DEBUG_IsBadReadPtr((addr),(len)) || \
+     (fprintf(stderr,"*** Invalid address "), \
+      DEBUG_PrintAddress((addr),dbg_mode), \
+      fprintf(stderr,"\n"),0))
+
+#define DBG_CHECK_WRITE_PTR(addr,len) \
+    (!DEBUG_IsBadWritePtr((addr),(len)) || \
+     (fprintf(stderr,"*** Invalid address "), \
+      DEBUG_PrintAddress(addr,dbg_mode), \
+      fprintf(stderr,"\n"),0))
+
 enum debug_regs
 {
     REG_EAX, REG_EBX, REG_ECX, REG_EDX, REG_ESI,
@@ -76,6 +88,8 @@ extern void DEBUG_PrintAddress( const DBG_ADDR *addr, int addrlen );
 extern void DEBUG_Help(void);
 
   /* debugger/memory.c */
+extern BOOL DEBUG_IsBadReadPtr( const DBG_ADDR *address, int size );
+extern BOOL DEBUG_IsBadWritePtr( const DBG_ADDR *address, int size );
 extern int DEBUG_ReadMemory( const DBG_ADDR *address );
 extern void DEBUG_WriteMemory( const DBG_ADDR *address, int value );
 extern void DEBUG_ExamineMemory( const DBG_ADDR *addr, int count, char format);
diff --git a/include/desktop.h b/include/desktop.h
index 024dfb4724b..ba9876c2ad1 100644
--- a/include/desktop.h
+++ b/include/desktop.h
@@ -20,4 +20,6 @@ typedef struct
 extern BOOL DESKTOP_Init();
 extern BOOL DESKTOP_SetPattern(char *pattern );
 
+extern LRESULT DesktopWndProc ( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam );
+
 #endif  /* DESKTOP_H */
diff --git a/include/dialog.h b/include/dialog.h
index aca9adc8ab9..772074e2eb0 100644
--- a/include/dialog.h
+++ b/include/dialog.h
@@ -12,9 +12,7 @@
 extern BOOL DIALOG_Init(void);
 extern HWND DIALOG_GetFirstTabItem( HWND hwndDlg );
 
-#ifndef WINELIB
 #pragma pack(1)
-#endif
 
   /* Dialog info structure.
    * This structure is stored into the window extra bytes (cbWndExtra).
@@ -70,8 +68,6 @@ typedef struct
     SEGPTR             faceName;
 } DLGTEMPLATE;
 
-#ifndef WINELIB
 #pragma pack(4)
-#endif
 
 #endif  /* DIALOG_H */
diff --git a/include/dos_fs.h b/include/dos_fs.h
index a6a91a34c43..1200dfd52d9 100644
--- a/include/dos_fs.h
+++ b/include/dos_fs.h
@@ -22,7 +22,7 @@ extern int DOS_SetSerialNumber(int drive, unsigned long serialnumber);
 extern char *DOS_GetVolumeLabel(int drive);
 extern int DOS_SetVolumeLabel(int drive, char *label);
 extern int DOS_GetFreeSpace(int drive, long *size, long *available);
-extern char *DOS_FindFile(char *buffer, int buflen, char *rootname, char **extensions, char *path);
+extern char *DOS_FindFile(char *buffer, int buflen, const char *rootname, char **extensions, char *path);
 extern char *WineIniFileName(void);
 extern char *WinIniFileName(void); 
 extern struct dosdirent *DOS_opendir(char *dosdirname); 
@@ -30,6 +30,7 @@ extern struct dosdirent *DOS_readdir(struct dosdirent *de);
 extern void DOS_closedir(struct dosdirent *de);
 extern char *DOS_GetRedirectedDir(int drive);
 extern void errno_to_doserr(void);
+extern int DOS_Error(int extended, int class, int locus);
 
 extern char WindowsPath[256];
 
diff --git a/include/event.h b/include/event.h
index 0d1689f5b26..4019f1d0c9e 100644
--- a/include/event.h
+++ b/include/event.h
@@ -3,5 +3,6 @@
 
 extern void EVENT_ProcessEvent( XEvent *event );  /* event.c */
 extern void EVENT_RegisterWindow( Window w, HWND hwnd );  /* event.c */
+extern void EVENT_DummyMotionNotify(void);  /* event.c */
 
 #endif /* __WINE_EVENT_H */
diff --git a/include/gdi.h b/include/gdi.h
index 04a21852c86..a8f1899808d 100644
--- a/include/gdi.h
+++ b/include/gdi.h
@@ -197,37 +197,42 @@ typedef struct tagDC
 #define DC_SAVED      2   /* It is a saved DC */
 
   /* Last 32 bytes are reserved for stock object handles */
+#ifdef WINELIB32
+/* Stupid overloading (see DefWindowProc, case WM_ERASEBKGND) */
+#define GDI_HEAP_SIZE               (COLOR_BTNHIGHLIGHT+1)
+#else
 #define GDI_HEAP_SIZE               0xffe0  
+#endif
 
   /* First handle possible for stock objects (must be >= GDI_HEAP_SIZE) */
 #define FIRST_STOCK_HANDLE          GDI_HEAP_SIZE
 
   /* Stock objects handles */
 
-#define STOCK_WHITE_BRUSH	    (FIRST_STOCK_HANDLE + WHITE_BRUSH)
-#define STOCK_LTGRAY_BRUSH	    (FIRST_STOCK_HANDLE + LTGRAY_BRUSH)
-#define STOCK_GRAY_BRUSH	    (FIRST_STOCK_HANDLE + GRAY_BRUSH)
-#define STOCK_DKGRAY_BRUSH	    (FIRST_STOCK_HANDLE + DKGRAY_BRUSH)
-#define STOCK_BLACK_BRUSH	    (FIRST_STOCK_HANDLE + BLACK_BRUSH)
-#define STOCK_NULL_BRUSH	    (FIRST_STOCK_HANDLE + NULL_BRUSH)
-#define STOCK_HOLLOW_BRUSH	    (FIRST_STOCK_HANDLE + HOLLOW_BRUSH)
-#define STOCK_WHITE_PEN	            (FIRST_STOCK_HANDLE + WHITE_PEN)
-#define STOCK_BLACK_PEN	            (FIRST_STOCK_HANDLE + BLACK_PEN)
-#define STOCK_NULL_PEN	            (FIRST_STOCK_HANDLE + NULL_PEN)
-#define STOCK_OEM_FIXED_FONT	    (FIRST_STOCK_HANDLE + OEM_FIXED_FONT)
-#define STOCK_ANSI_FIXED_FONT       (FIRST_STOCK_HANDLE + ANSI_FIXED_FONT)
-#define STOCK_ANSI_VAR_FONT	    (FIRST_STOCK_HANDLE + ANSI_VAR_FONT)
-#define STOCK_SYSTEM_FONT	    (FIRST_STOCK_HANDLE + SYSTEM_FONT)
-#define STOCK_DEVICE_DEFAULT_FONT   (FIRST_STOCK_HANDLE + DEVICE_DEFAULT_FONT)
-#define STOCK_DEFAULT_PALETTE       (FIRST_STOCK_HANDLE + DEFAULT_PALETTE)
-#define STOCK_SYSTEM_FIXED_FONT     (FIRST_STOCK_HANDLE + SYSTEM_FIXED_FONT)
-
-#define NB_STOCK_OBJECTS            (SYSTEM_FIXED_FONT + 1)
-
-#define FIRST_STOCK_FONT            STOCK_OEM_FIXED_FONT
-#define LAST_STOCK_FONT             STOCK_SYSTEM_FIXED_FONT
-
-
+#define NB_STOCK_OBJECTS          (SYSTEM_FIXED_FONT + 1)
+
+#define STOCK_WHITE_BRUSH         ((HBRUSH)(FIRST_STOCK_HANDLE+WHITE_BRUSH))
+#define STOCK_LTGRAY_BRUSH        ((HBRUSH)(FIRST_STOCK_HANDLE+LTGRAY_BRUSH))
+#define STOCK_GRAY_BRUSH          ((HBRUSH)(FIRST_STOCK_HANDLE+GRAY_BRUSH))
+#define STOCK_DKGRAY_BRUSH        ((HBRUSH)(FIRST_STOCK_HANDLE+DKGRAY_BRUSH))
+#define STOCK_BLACK_BRUSH         ((HBRUSH)(FIRST_STOCK_HANDLE+BLACK_BRUSH))
+#define STOCK_NULL_BRUSH          ((HBRUSH)(FIRST_STOCK_HANDLE+NULL_BRUSH))
+#define STOCK_HOLLOW_BRUSH        ((HBRUSH)(FIRST_STOCK_HANDLE+HOLLOW_BRUSH))
+#define STOCK_WHITE_PEN	          ((HPEN)(FIRST_STOCK_HANDLE+WHITE_PEN))
+#define STOCK_BLACK_PEN	          ((HPEN)(FIRST_STOCK_HANDLE+BLACK_PEN))
+#define STOCK_NULL_PEN	          ((HPEN)(FIRST_STOCK_HANDLE+NULL_PEN))
+#define STOCK_OEM_FIXED_FONT      ((HFONT)(FIRST_STOCK_HANDLE+OEM_FIXED_FONT))
+#define STOCK_ANSI_FIXED_FONT     ((HFONT)(FIRST_STOCK_HANDLE+ANSI_FIXED_FONT))
+#define STOCK_ANSI_VAR_FONT       ((HFONT)(FIRST_STOCK_HANDLE+ANSI_VAR_FONT))
+#define STOCK_SYSTEM_FONT         ((HFONT)(FIRST_STOCK_HANDLE+SYSTEM_FONT))
+#define STOCK_DEVICE_DEFAULT_FONT ((HFONT)(FIRST_STOCK_HANDLE+DEVICE_DEFAULT_FONT))
+#define STOCK_DEFAULT_PALETTE     ((HPALETTE)(FIRST_STOCK_HANDLE+DEFAULT_PALETTE))
+#define STOCK_SYSTEM_FIXED_FONT   ((HFONT)(FIRST_STOCK_HANDLE+SYSTEM_FIXED_FONT))
+
+#define FIRST_STOCK_FONT          STOCK_OEM_FIXED_FONT
+#define LAST_STOCK_FONT           STOCK_SYSTEM_FIXED_FONT
+
+#define LAST_STOCK_HANDLE         ((DWORD)STOCK_SYSTEM_FIXED_FONT)
 
   /* Device <-> logical coords conversion */
 
diff --git a/include/icon.h b/include/icon.h
deleted file mode 100644
index 4a38a60f5bf..00000000000
--- a/include/icon.h
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * structure definitions for ICON
- *
- * Copyright  Martin Ayotte, 1993
- *
- */
-
-
-typedef struct {
-	BYTE	Width;
-	BYTE	Height;
-	BYTE	ColorCount;
-	BYTE	Reserved1;
-	WORD	Reserved2;
-	WORD	Reserved3;
-	DWORD	icoDIBSize;
-	DWORD	icoDIBOffset;
-	} ICONDESCRIP;
-
-typedef struct {
-	ICONDESCRIP	descriptor;
-	HBITMAP		hBitmap;
-	HBITMAP		hBitMask;
-	} ICONALLOC;
-
-
diff --git a/include/kernel32.h b/include/kernel32.h
new file mode 100644
index 00000000000..5fb595f8334
--- /dev/null
+++ b/include/kernel32.h
@@ -0,0 +1,80 @@
+/* kernel32.h - 95-09-14  Cameron Heide
+ *
+ * Win32 functions, structures, and types related to kernel functions
+ */
+#include <stddef.h>
+
+int KERN32_Init(void);
+void SetLastError(DWORD error);
+DWORD ErrnoToLastError(int errno_num);
+
+/* Linux's wchar_t is unsigned long but Win32 wants unsigned short
+ */
+typedef unsigned short WCHAR;
+
+/* Code page information.
+ */
+typedef struct {
+        DWORD MaxCharSize;
+        BYTE DefaultChar[2];
+        BYTE LeadBytes[5];
+} CPINFO, *LPCPINFO;
+
+/* The 'overlapped' data structure used by async I/O functions.
+ */
+typedef struct {
+        DWORD Internal;
+        DWORD InternalHigh;
+        DWORD Offset;
+        DWORD OffsetHigh;
+        HANDLE hEvent;
+} OVERLAPPED, *LPOVERLAPPED;
+
+/* Process startup information.
+ */
+typedef struct {
+        DWORD cb;
+        LPSTR lpReserved;
+        LPSTR lpDesktop;
+        LPSTR lpTitle;
+        DWORD dwX;
+        DWORD dwY;
+        DWORD dwXSize;
+        DWORD dwYSize;
+        DWORD dwXCountChars;
+        DWORD dwYCountChars;
+        DWORD dwFillAttribute;
+        DWORD dwFlags;
+        WORD wShowWindow;
+        WORD cbReserved2;
+        BYTE *lpReserved2;
+        HANDLE hStdInput;
+        HANDLE hStdOutput;
+        HANDLE hStdError;
+} STARTUPINFO, *LPSTARTUPINFO;
+
+typedef struct {
+        WORD wYear;
+        WORD wMonth;
+        WORD wDayOfWeek;
+        WORD wDay;
+        WORD wHour;
+        WORD wMinute;
+        WORD wSecond;
+        WORD wMilliseconds;
+} SYSTEMTIME, *LPSYSTEMTIME;
+
+typedef struct {
+        LONG Bias;
+        WCHAR StandardName[32];
+        SYSTEMTIME StandardDate;
+        LONG StandardBias;
+        WCHAR DaylightName[32];
+        SYSTEMTIME DaylightDate;
+        LONG DaylightBias;
+} TIME_ZONE_INFORMATION, *LPTIME_ZONE_INFORMATION;
+
+#define TIME_ZONE_ID_UNKNOWN    0
+#define TIME_ZONE_ID_STANDARD   1
+#define TIME_ZONE_ID_DAYLIGHT   2
+
diff --git a/include/ldt.h b/include/ldt.h
index 76f9ca0eee3..b02b2cde708 100644
--- a/include/ldt.h
+++ b/include/ldt.h
@@ -30,7 +30,7 @@ extern void LDT_BytesToEntry( const unsigned long *buffer, ldt_entry *content);
 extern void LDT_EntryToBytes( unsigned long *buffer, const ldt_entry *content);
 extern int LDT_GetEntry( int entry, ldt_entry *content );
 extern int LDT_SetEntry( int entry, const ldt_entry *content );
-extern void LDT_Print();
+extern void LDT_Print( int start, int length );
 
 
   /* This structure is used to build the local copy of the LDT. */
@@ -73,7 +73,7 @@ extern ldt_copy_entry ldt_copy[LDT_SIZE];
            ((void*)(GET_SEL_BASE(seg) + (unsigned int)(off)))
 #else
 #define PTR_SEG_TO_LIN(ptr)	((void*)(ptr))
-#define PTR_SEG_OFF_TO_LIN(seg,off)	((void*)(off))
+#define PTR_SEG_OFF_TO_LIN(seg,off)	((void*)((char*)(seg)+(int)(off)))
 #endif
 
 
diff --git a/include/listbox.h b/include/listbox.h
index 491ed20e60e..405a110a4e1 100644
--- a/include/listbox.h
+++ b/include/listbox.h
@@ -67,3 +67,5 @@ extern void ListBoxDrawItem (HWND hwnd, LPHEADLIST lphl, HDC hdc,
 			     WORD itemState);
 extern int ListBoxFindMouse(LPHEADLIST lphl, int X, int Y);
 extern void ListBoxAskMeasure(LPHEADLIST lphl, LPLISTSTRUCT lpls);
+
+extern LRESULT ListBoxWndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam);
diff --git a/include/local.h b/include/local.h
index de58d4f1429..93b4cbeb102 100644
--- a/include/local.h
+++ b/include/local.h
@@ -13,14 +13,14 @@
   /* excepted that they need DS as the first parameter. This    */
   /* allows managing several heaps from the emulation library.  */
 
-extern HLOCAL LOCAL_Alloc( WORD ds, WORD flags, WORD size );
-extern HLOCAL LOCAL_ReAlloc( WORD ds, HLOCAL handle, WORD size, WORD flags );
-extern HLOCAL LOCAL_Free( WORD ds, HLOCAL handle );
-extern HLOCAL LOCAL_Handle( WORD ds, WORD addr );
-extern WORD LOCAL_Size( WORD ds, HLOCAL handle );
-extern WORD LOCAL_Flags( WORD ds, HLOCAL handle );
-extern WORD LOCAL_HeapSize( WORD ds );
-extern WORD LOCAL_Lock( WORD ds, HLOCAL handle );
-extern BOOL LOCAL_Unlock( WORD ds, HLOCAL handle );
+extern HLOCAL LOCAL_Alloc( HANDLE ds, WORD flags, WORD size );
+extern HLOCAL LOCAL_ReAlloc( HANDLE ds, HLOCAL handle, WORD size, WORD flags );
+extern HLOCAL LOCAL_Free( HANDLE ds, HLOCAL handle );
+extern HLOCAL LOCAL_Handle( HANDLE ds, WORD addr );
+extern WORD LOCAL_Size( HANDLE ds, HLOCAL handle );
+extern WORD LOCAL_Flags( HANDLE ds, HLOCAL handle );
+extern WORD LOCAL_HeapSize( HANDLE ds );
+extern NPVOID LOCAL_Lock( HANDLE ds, HLOCAL handle );
+extern BOOL LOCAL_Unlock( HANDLE ds, HLOCAL handle );
 
 #endif  /* __WINE_LOCAL_H */
diff --git a/include/mdi.h b/include/mdi.h
index 6891c3daac8..d2d1434ac03 100644
--- a/include/mdi.h
+++ b/include/mdi.h
@@ -11,8 +11,8 @@
 #include "windows.h"
 
 #define MDI_MAXLISTLENGTH	64
-extern LONG MDIClientWndProc(HWND hwnd, WORD message, 
-			     WORD wParam, LONG lParam); /* mdi.c */
+extern LRESULT MDIClientWndProc(HWND hwnd, UINT message, 
+				WPARAM wParam, LPARAM lParam); /* mdi.c */
 
 
 typedef struct
diff --git a/include/menu.h b/include/menu.h
index d471eec163c..d2fae7c1e0e 100644
--- a/include/menu.h
+++ b/include/menu.h
@@ -17,6 +17,7 @@ extern WORD MENU_DrawMenuBar( HDC hDC, LPRECT lprect,
 			      HWND hwnd, BOOL suppress_draw );   /* menu.c */
 extern HMENU CopySysMenu(); /* menu.c */
 
+extern LRESULT PopupMenuWndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam );
 
 typedef struct tagMENUITEM
 {
diff --git a/include/message.h b/include/message.h
index c8a14294f30..10832ef6c17 100644
--- a/include/message.h
+++ b/include/message.h
@@ -20,7 +20,7 @@ typedef struct tagQMSG
 typedef struct tagMESSAGEQUEUE
 {
   WORD      next;
-  WORD      hTask;                  /* hTask owning the queue                */
+  HTASK     hTask;                  /* hTask owning the queue                */
   WORD      msgSize;                /* Size of messages in the queue         */
   WORD      msgCount;               /* Number of waiting messages            */
   WORD      nextMessage;            /* Next message to be retrieved          */
@@ -29,10 +29,10 @@ typedef struct tagMESSAGEQUEUE
   DWORD     GetMessageTimeVal;      /* Value returned by GetMessageTime      */
   DWORD     GetMessagePosVal;       /* Value returned by GetMessagePos       */
   DWORD     GetMessageExtraInfoVal; /* Value returned by GetMessageExtraInfo */
-  DWORD     lParam;                 /* Next four values set by SendMessage   */
-  WORD      wParam;
-  WORD      msg;
-  WORD      hWnd;
+  LPARAM    lParam;                 /* Next four values set by SendMessage   */
+  WPARAM    wParam;
+  UINT      msg;
+  HWND      hWnd;
   WORD      wPostQMsg;              /* PostQuitMessage flag                  */
   WORD      wExitCode;              /* PostQuitMessage exit code             */
   WORD      InSendMessageHandle;    /* Handle of task that sent a message    */
diff --git a/include/miscemu.h b/include/miscemu.h
index bf2b007625d..99186e760d6 100644
--- a/include/miscemu.h
+++ b/include/miscemu.h
@@ -10,7 +10,6 @@
 #include "wintypes.h"
 #include "registers.h"
 
-
   /* miscemu/dosmem.c */
 extern BOOL DOSMEM_Init(void);
 extern void DOSMEM_FillBiosSegment(void);
diff --git a/include/module.h b/include/module.h
index 5ca5a595752..5ab729f3bb1 100644
--- a/include/module.h
+++ b/include/module.h
@@ -19,7 +19,7 @@ typedef struct
     WORD    magic;            /* 'NE' signature */
     WORD    count;            /* Usage count */
     WORD    entry_table;      /* Near ptr to entry table */
-    WORD    next;             /* Selector to next module */
+    HMODULE next;             /* Selector to next module */
     WORD    dgroup_entry;     /* Near ptr to segment entry for DGROUP */
     WORD    fileinfo;         /* Near ptr to file info (LOADEDFILEINFO) */
     WORD    flags;            /* Module flags */
@@ -69,7 +69,7 @@ typedef struct
     WORD    size;      /* Segment size on disk */
     WORD    flags;     /* Segment flags */
     WORD    minsize;   /* Min. size of segment in memory */
-    WORD    selector;  /* Selector of segment in memory */
+    HANDLE  selector;  /* Selector of segment in memory */
 } SEGTABLEENTRY;
 
   /* Self-loading modules contain this structure in their first segment */
diff --git a/include/msdos.h b/include/msdos.h
index 2922d13fa2d..6861971ce97 100644
--- a/include/msdos.h
+++ b/include/msdos.h
@@ -39,6 +39,7 @@ struct fcb {
 #define MAX_DOS_DRIVES	26
 
 extern WORD ExtendedError;
+extern BYTE ErrorClass, Action, ErrorLocus;
 extern struct DosDeviceStruct COM[MAX_PORTS];
 extern struct DosDeviceStruct LPT[MAX_PORTS];
 
diff --git a/include/neexe.h b/include/neexe.h
index c24f2f615bc..e8c460cc8df 100644
--- a/include/neexe.h
+++ b/include/neexe.h
@@ -68,6 +68,7 @@ struct ne_header_s
  */
 #define NE_FFLAGS_SINGLEDATA	0x0001
 #define NE_FFLAGS_MULTIPLEDATA	0x0002
+#define NE_FFLAGS_BUILTIN       0x0010  /* Wine built-in module */
 #define NE_FFLAGS_SELFLOAD	0x0800
 #define NE_FFLAGS_LINKERROR	0x2000
 #define NE_FFLAGS_LIBMODULE	0x8000
@@ -196,7 +197,7 @@ struct resource_nameinfo_s
     unsigned short length;
     unsigned short flags;
     unsigned short id;
-    unsigned short handle;
+            HANDLE handle;
     unsigned short usage;
 };
 
diff --git a/include/nonclient.h b/include/nonclient.h
index 0a34d9085c5..d2ca8abdfd3 100644
--- a/include/nonclient.h
+++ b/include/nonclient.h
@@ -14,12 +14,12 @@ extern void NC_GetMinMaxInfo( HWND hwnd, POINT *maxSize, POINT *maxPos,
                               POINT *minTrack, POINT *maxTrack );
 extern void NC_DoNCPaint( HWND hwnd, BOOL active, BOOL suppress_menupaint );
 extern LONG NC_HandleNCPaint( HWND hwnd );
-extern LONG NC_HandleNCActivate( HWND hwnd, WORD wParam );
+extern LONG NC_HandleNCActivate( HWND hwnd, WPARAM wParam );
 extern LONG NC_HandleNCCalcSize( HWND hwnd, NCCALCSIZE_PARAMS *params );
 extern LONG NC_HandleNCHitTest( HWND hwnd, POINT pt );
-extern LONG NC_HandleNCLButtonDown( HWND hwnd, WORD wParam, LONG lParam );
-extern LONG NC_HandleNCLButtonDblClk( HWND hwnd, WORD wParam, LONG lParam );
-extern LONG NC_HandleSysCommand( HWND hwnd, WORD wParam, POINT pt );
-extern LONG NC_HandleSetCursor( HWND hwnd, WORD wParam, LONG lParam );
+extern LONG NC_HandleNCLButtonDown( HWND hwnd, WPARAM wParam, LPARAM lParam );
+extern LONG NC_HandleNCLButtonDblClk( HWND hwnd, WPARAM wParam, LPARAM lParam );
+extern LONG NC_HandleSysCommand( HWND hwnd, WPARAM wParam, POINT pt );
+extern LONG NC_HandleSetCursor( HWND hwnd, WPARAM wParam, LPARAM lParam );
 
 #endif /* __WINE_NONCLIENT_H */
diff --git a/include/pe_image.h b/include/pe_image.h
index cdadb66924f..a65c7566f92 100644
--- a/include/pe_image.h
+++ b/include/pe_image.h
@@ -19,8 +19,8 @@ struct w_files
     char * filename; /* Actual name of the unix file that satisfies this */
     int type;        /* DLL or EXE */
     int fd;
-    unsigned short hinstance;
-    HANDLE hModule;
+    HINSTANCE hinstance;
+    HMODULE hModule;
     int initialised;
     struct mz_header_s *mz_header;
     struct pe_data *pe;
diff --git a/include/registers.h b/include/registers.h
index 7e2e4e4cd1b..777522d9ab0 100644
--- a/include/registers.h
+++ b/include/registers.h
@@ -40,13 +40,11 @@
 #define ES_reg(context)      ((context)->sc_es)
 #define SS_reg(context)      ((context)->sc_ss)
                             
-#ifdef linux                
+#ifdef linux
+/* fs and gs are not supported on *BSD. Hopefully we won't need them. */
 #define FS_reg(context)      ((context)->sc_fs)
 #define GS_reg(context)      ((context)->sc_gs)
-#else  /* FIXME: are fs and gs supported under *BSD? */
-#define FS_reg(context)      0
-#define GS_reg(context)      0
-#endif                      
+#endif
                             
 #ifndef __FreeBSD__         
 #define EFL_reg(context)     ((context)->sc_eflags)
diff --git a/include/relay32.h b/include/relay32.h
index 7ebf6886f80..2736089d3d0 100644
--- a/include/relay32.h
+++ b/include/relay32.h
@@ -4,8 +4,10 @@
  * Copyright 1995 Martin von Loewis
  */
 
+void RELAY32_Unimplemented(char *dll, int item);
 void *RELAY32_GetEntryPoint(char *dll_name, char *item, int hint);
 LONG RELAY32_CallWindowProc(WNDPROC,int,int,int,int);
+void RELAY32_DebugEnter(char *dll,char *name);
 
 typedef struct tagWNDCLASSA{
 	UINT	style;
diff --git a/include/resource.h b/include/resource.h
index 6a5eeb253f1..d389ce4d714 100644
--- a/include/resource.h
+++ b/include/resource.h
@@ -17,9 +17,6 @@ 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 HBITMAP ConvertCoreBitmap( HDC hdc, BITMAPCOREHEADER * image );
-extern HBITMAP ConvertInfoBitmap( HDC hdc, BITMAPINFO * image );
-
 struct ResourceTable
 {
         int id,type;
diff --git a/include/shell.h b/include/shell.h
index b222e7efb36..5a546ec8b14 100644
--- a/include/shell.h
+++ b/include/shell.h
@@ -18,7 +18,11 @@ extern INT ShellAbout(HWND hWnd, LPCSTR szApp, LPCSTR szOtherStuff, HICON hIcon)
 
 #define HKEY_CLASSES_ROOT       1
 
+#ifdef WINELIB32
+typedef void* HKEY;
+#else
 typedef DWORD HKEY;
+#endif
 typedef HKEY FAR* LPHKEY;
 
 typedef struct tagKEYSTRUCT {
@@ -32,6 +36,13 @@ typedef struct tagKEYSTRUCT {
 	} KEYSTRUCT;
 typedef KEYSTRUCT *LPKEYSTRUCT;
 
+typedef struct tagDROPFILESTRUCT { 	   /* structure for dropped files */ 
+	WORD		wSize;
+	POINT		ptMousePos;   
+	BOOL		fInNonClientArea;
+	/* memory block with filenames follows */     
+        } DROPFILESTRUCT,FAR *LPDROPFILESTRUCT; 
+
 #define SE_ERR_SHARE            26
 #define SE_ERR_ASSOCINCOMPLETE  27
 #define SE_ERR_DDETIMEOUT       28
@@ -39,4 +50,5 @@ typedef KEYSTRUCT *LPKEYSTRUCT;
 #define SE_ERR_DDEBUSY          30
 #define SE_ERR_NOASSOC          31
 
+LRESULT AboutDlgProc(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam);
 
diff --git a/include/spy.h b/include/spy.h
new file mode 100644
index 00000000000..7fa75fb7495
--- /dev/null
+++ b/include/spy.h
@@ -0,0 +1,19 @@
+/*
+ * 			     Message Logging functions
+ */
+
+#ifndef __WINE_SPY_H
+#define __WINE_SPY_H
+
+#define SPY_DISPATCHMESSAGE     0x0099
+#define SPY_SENDMESSAGE         0x0100
+#define SPY_DEFWNDPROC          0x0101
+
+#define SPY_RESULT_OK           0x0000
+#define SPY_RESULT_INVALIDHWND  0x0001
+
+extern void EnterSpyMessage( int, HWND, WORD, WORD, LONG);
+extern void  ExitSpyMessage( int, HWND, WORD, LONG);
+extern void         SpyInit( void);
+
+#endif /* __WINE_SPY_H */
diff --git a/include/stackframe.h b/include/stackframe.h
index 81fcf8ee333..cf4358bbdf4 100644
--- a/include/stackframe.h
+++ b/include/stackframe.h
@@ -72,7 +72,7 @@ extern DWORD IF1632_Original32_esp;
 #else
 #define CURRENT_STACK16	error.error
 #define CURRENT_DS		0
-#define MAKE_SEGPTR(ptr)	(ptr)
+#define MAKE_SEGPTR(ptr)	((SEGPTR)ptr)
 #endif
 
 #endif /* WINE_STACKFRAME_H */
diff --git a/include/static.h b/include/static.h
index 8dcd00037ef..dfe71483b18 100644
--- a/include/static.h
+++ b/include/static.h
@@ -17,6 +17,6 @@ typedef struct
     HICON  hIcon;   /* Icon handle for SS_ICON controls */ 
 } STATICINFO;
 
-extern LONG StaticWndProc( HWND hWnd, WORD uMsg, WORD wParam, LONG lParam );
+extern LRESULT StaticWndProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam );
 
 #endif  /* STATIC_H */
diff --git a/include/stddebug.h b/include/stddebug.h
index b2620207255..0b5a5c4fc28 100644
--- a/include/stddebug.h
+++ b/include/stddebug.h
@@ -138,10 +138,8 @@
 #undef DEBUG_RESOURCE
 #undef DEBUG_SCROLL
 #undef DEBUG_SELECTOR
-#undef DEBUG_SELECTORS
 #undef DEBUG_SEM
 #undef DEBUG_SHM
-#undef DEBUG_SPY
 #undef DEBUG_STRESS
 #undef DEBUG_SYSCOLOR
 #undef DEBUG_TASK
@@ -149,6 +147,7 @@
 #undef DEBUG_TIMER
 #undef DEBUG_TOOLHELP
 #undef DEBUG_UTILITY
+#undef DEBUG_VXD
 #undef DEBUG_WIN
 #undef DEBUG_WINSOCK
 #endif
@@ -216,10 +215,8 @@
 #define DEBUG_RESOURCE
 #define DEBUG_SCROLL
 #define DEBUG_SELECTOR
-#define DEBUG_SELECTORS
 #define DEBUG_SEM
 #define DEBUG_SHM
-#define DEBUG_SPY
 #define DEBUG_STRESS
 #define DEBUG_SYSCOLOR
 #define DEBUG_TASK
@@ -227,6 +224,7 @@
 #define DEBUG_TIMER
 #define DEBUG_TOOLHELP
 #define DEBUG_UTILITY
+#define DEBUG_VXD
 #define DEBUG_WIN
 #define DEBUG_WINSOCK
 #endif
diff --git a/include/task.h b/include/task.h
index dd7e9e81d31..fd5604db0f3 100644
--- a/include/task.h
+++ b/include/task.h
@@ -61,7 +61,7 @@ typedef struct
     char    priority;                   /* Task priority, between -32 and 15 */
     BYTE    unused1;
     HGLOBAL hStack32;                   /* Handle to 32-bit stack */
-    WORD    hSelf;                      /* Selector of this TDB */
+    HTASK   hSelf;                      /* Selector of this TDB */
     HANDLE  hPrevInstance;              /* Previous instance of the module */
     DWORD   esp;                        /* 32-bit stack pointer */
     WORD    ctrlword8087;               /* 80x87 control word */
diff --git a/include/toolhelp.h b/include/toolhelp.h
index ba1a05a8afd..5ffb1b4b784 100644
--- a/include/toolhelp.h
+++ b/include/toolhelp.h
@@ -166,14 +166,14 @@ typedef struct {
     HMODULE hModule;
     WORD wcUsage;
     char szExePath[MAX_PATH + 1];
-    WORD wNext;
+    HANDLE wNext;
 } MODULEENTRY;
 typedef MODULEENTRY *LPMODULEENTRY;
 
 BOOL	ModuleFirst(MODULEENTRY *lpModule);
 BOOL	ModuleNext(MODULEENTRY *lpModule);
-HMODULE ModuleFindName(MODULEENTRY *lpModule, LPCSTR lpstrName);
-HMODULE ModuleFindHandle(MODULEENTRY *lpModule, HMODULE hModule);
+BOOL    ModuleFindName(MODULEENTRY *lpModule, LPCSTR lpstrName);
+BOOL    ModuleFindHandle(MODULEENTRY *lpModule, HMODULE hModule);
 
 /* tasks */
 
@@ -240,7 +240,7 @@ typedef struct
     DWORD     dwSize;
     HMODULE   hInst;              /* This is really an hModule */
     char      szClassName[MAX_CLASSNAME + 1];
-    WORD      wNext;
+    HANDLE    wNext;
 } CLASSENTRY;
 
 BOOL ClassFirst( CLASSENTRY *pClassEntry );
diff --git a/include/win.h b/include/win.h
index 6b614aa5ae2..f40937d2681 100644
--- a/include/win.h
+++ b/include/win.h
@@ -78,9 +78,11 @@ extern Window WIN_GetXWindow( HWND hwnd );
 extern BOOL WIN_UnlinkWindow( HWND hwnd );
 extern BOOL WIN_LinkWindow( HWND hwnd, HWND hwndInsertAfter );
 extern HWND WIN_FindWinToRepaint( HWND hwnd );
-extern void WIN_SendParentNotify( HWND hwnd, WORD event, LONG lParam );
+extern void WIN_SendParentNotify( HWND hwnd, WORD event,
+                                  WORD idChild, LONG lValue );
 extern BOOL WIN_CreateDesktopWindow(void);
 extern HWND WIN_GetTopParent( HWND hwnd );
+extern HINSTANCE WIN_GetWindowInstance( HWND hwnd );
 
 extern Display * display;
 extern Screen * screen;
diff --git a/include/windows.h b/include/windows.h
index 7f657488b1c..e151ebf1999 100644
--- a/include/windows.h
+++ b/include/windows.h
@@ -25,6 +25,11 @@ typedef struct
 
 #define MAKEPOINT(l) (*((POINT *)&(l)))
 
+#ifdef WINELIB32
+#define MAKEWPARAM(low, high) ((LONG)(((WORD)(low)) | \
+			      (((DWORD)((WORD)(high))) << 16)))
+#endif
+
 #define MAKELPARAM(low, high) ((LONG)(((WORD)(low)) | \
 			      (((DWORD)((WORD)(high))) << 16)))
 
@@ -89,7 +94,7 @@ typedef struct {
   /* Windows */
 
 typedef struct {
-    void *    lpCreateParams;
+    LPVOID    lpCreateParams;
     HINSTANCE hInstance;
     HMENU     hMenu;
     HWND      hwndParent;
@@ -542,7 +547,11 @@ typedef struct tagLOGBRUSH
 { 
     WORD       lbStyle; 
     COLORREF   lbColor WINE_PACKED;
+#ifdef WINELIB32
+    LONG       lbHatch; 
+#else
     INT      lbHatch; 
+#endif
 } LOGBRUSH, *PLOGBRUSH, *NPLOGBRUSH, *LPLOGBRUSH;
 
   /* Brush styles */
@@ -990,7 +999,7 @@ typedef BITMAPINFO *LPBITMAPINFO;
 typedef BITMAPINFO *NPBITMAPINFO;
 typedef BITMAPINFO *PBITMAPINFO;
 
-typedef struct tagBITMAPCOREHEADER
+typedef struct
 {
     unsigned long bcSize;
     UINT bcWidth;
@@ -999,10 +1008,31 @@ typedef struct tagBITMAPCOREHEADER
     UINT bcBitCount;
 } BITMAPCOREHEADER;
 
+typedef struct
+{
+    BITMAPCOREHEADER bmciHeader;
+    RGBTRIPLE        bmciColors[1];
+} BITMAPCOREINFO, *LPBITMAPCOREINFO;
+
 #define DIB_RGB_COLORS   0
 #define DIB_PAL_COLORS   1
 #define CBM_INIT         4
 
+
+  /* Cursors / Icons */
+
+typedef struct
+{
+    POINT   ptHotSpot;
+    WORD    nWidth;
+    WORD    nHeight;
+    WORD    nWidthBytes;
+    BYTE    bPlanes;
+    BYTE    bBitsPerPixel;
+} CURSORICONINFO;
+
+
+
 typedef struct {
 	BYTE i;  /* much more .... */
 } KANJISTRUCT;
@@ -1284,12 +1314,12 @@ typedef struct tagCOMSTAT
 #define IDC_WAIT         MAKEINTRESOURCE(32514)
 #define IDC_CROSS        MAKEINTRESOURCE(32515)
 #define IDC_UPARROW      MAKEINTRESOURCE(32516)
-#define IDC_SIZE         MAKEINTRESOURCE(32540)
-#define IDC_ICON         MAKEINTRESOURCE(32541)
-#define IDC_SIZENWSE     MAKEINTRESOURCE(32542)
-#define IDC_SIZENESW     MAKEINTRESOURCE(32543)
-#define IDC_SIZEWE       MAKEINTRESOURCE(32544)
-#define IDC_SIZENS       MAKEINTRESOURCE(32545)
+#define IDC_SIZE         MAKEINTRESOURCE(32640)
+#define IDC_ICON         MAKEINTRESOURCE(32641)
+#define IDC_SIZENWSE     MAKEINTRESOURCE(32642)
+#define IDC_SIZENESW     MAKEINTRESOURCE(32643)
+#define IDC_SIZEWE       MAKEINTRESOURCE(32644)
+#define IDC_SIZENS       MAKEINTRESOURCE(32645)
 
 /* OEM Resource Ordinal Numbers */
 #define OBM_CLOSE           32754
@@ -1378,11 +1408,11 @@ typedef struct tagCOMSTAT
 #define SYSTEM_FIXED_FONT   16
 
 
-enum { WM_NULL, WM_CREATE, WM_DESTROY, WM_MOVE, WM_UNUSED0, WM_SIZE, WM_ACTIVATE,
-	WM_SETFOCUS, WM_KILLFOCUS, WM_UNUSED1, WM_ENABLE, WM_SETREDRAW, 
+enum {  WM_NULL, WM_CREATE, WM_DESTROY, WM_MOVE, WM_UNUSED0, WM_SIZE, WM_ACTIVATE,
+	WM_SETFOCUS, WM_KILLFOCUS, WM_SETVISIBLE, WM_ENABLE, WM_SETREDRAW, 
 	WM_SETTEXT, WM_GETTEXT, WM_GETTEXTLENGTH, WM_PAINT, WM_CLOSE, 
 	WM_QUERYENDSESSION, WM_QUIT, WM_QUERYOPEN, WM_ERASEBKGND, 
-	WM_SYSCOLORCHANGE, WM_ENDSESSION, WM_UNUSED2,
+	WM_SYSCOLORCHANGE, WM_ENDSESSION, WM_SYSTEMERROR,
 	WM_SHOWWINDOW, WM_CTLCOLOR, WM_WININICHANGE, WM_DEVMODECHANGE,
 	WM_ACTIVATEAPP, WM_FONTCHANGE, WM_TIMECHANGE, WM_CANCELMODE, WM_SETCURSOR,
 	WM_MOUSEACTIVATE, WM_CHILDACTIVATE, WM_QUEUESYNC, WM_GETMINMAXINFO,
@@ -1391,8 +1421,16 @@ enum { WM_NULL, WM_CREATE, WM_DESTROY, WM_MOVE, WM_UNUSED0, WM_SIZE, WM_ACTIVATE
 	WM_DELETEITEM, WM_VKEYTOITEM,
 	WM_CHARTOITEM, WM_SETFONT, WM_GETFONT };
 
+#define WM_QUERYDRAGICON    0x0037
+
+#define WM_COMPAREITEM	    0x0039
+
+#define WM_COMPACTING	    0x0041
+
+#define WM_COMMNOTIFY	    0x0044
 #define WM_WINDOWPOSCHANGING 0x0046
-#define WM_WINDOWPOSCHANGED 0x0047
+#define WM_WINDOWPOSCHANGED  0x0047
+#define WM_POWER	    0x0048
 
 #define WM_NCCREATE         0x0081
 #define WM_NCDESTROY        0x0082
@@ -1402,6 +1440,7 @@ enum { WM_NULL, WM_CREATE, WM_DESTROY, WM_MOVE, WM_UNUSED0, WM_SIZE, WM_ACTIVATE
 #define WM_NCACTIVATE       0x0086
 
 #define WM_GETDLGCODE	    0x0087
+#define WM_SYNCPAINT	    0x0088
 
   /* Non-client mouse messages */
 #define WM_NCMOUSEMOVE      0x00a0
@@ -1437,8 +1476,25 @@ enum { WM_NULL, WM_CREATE, WM_DESTROY, WM_MOVE, WM_UNUSED0, WM_SIZE, WM_ACTIVATE
 #define WM_HSCROLL          0x0114
 #define WM_VSCROLL          0x0115
 
+/* Menu messages */
+#define WM_INITMENU         0x0116
+#define WM_INITMENUPOPUP    0x0117
+
+#define WM_MENUSELECT       0x011F
+#define WM_MENUCHAR         0x0120
 #define WM_ENTERIDLE        0x0121
 
+#define WM_LBTRACKPOINT     0x0131
+
+  /* Win32 CTLCOLOR messages */
+#define WM_CTLCOLORMSGBOX    0x0132
+#define WM_CTLCOLOREDIT      0x0133
+#define WM_CTLCOLORLISTBOX   0x0134
+#define WM_CTLCOLORBTN       0x0135
+#define WM_CTLCOLORDLG       0x0136
+#define WM_CTLCOLORSCROLLBAR 0x0137
+#define WM_CTLCOLORSTATIC    0x0138
+
   /* Mouse messages */
 #define WM_MOUSEMOVE	    0x0200
 #define WM_LBUTTONDOWN	    0x0201
@@ -1467,15 +1523,44 @@ enum { WM_NULL, WM_CREATE, WM_DESTROY, WM_MOVE, WM_UNUSED0, WM_SIZE, WM_ACTIVATE
 #define WM_MDICASCADE	    0x0227
 #define WM_MDIICONARRANGE   0x0228
 #define WM_MDIGETACTIVE     0x0229
+#define WM_DROPOBJECT	    0x022A
+#define WM_QUERYDROPOBJECT  0x022B
+#define WM_DRAGLOOP	    0x022D
+#define WM_DRAGSELECT	    0x022E
+#define WM_DRAGMOVE	    0x022F
 #define WM_MDISETMENU	    0x0230
 
 #define WM_ENTERSIZEMOVE    0x0231
 #define WM_EXITSIZEMOVE     0x0232
+#define WM_DROPFILES	    0x0233
+
+#define WM_CUT               0x0300
+#define WM_COPY              0x0301
+#define WM_PASTE             0x0302
+#define WM_CLEAR             0x0303
+#define WM_UNDO              0x0304
+#define WM_RENDERFORMAT      0x0305
+#define WM_RENDERALLFORMATS  0x0306
+#define WM_DESTROYCLIPBOARD  0x0307
+#define WM_DRAWCLIPBOARD     0x0308
+#define WM_PAINTCLIPBOARD    0x0309
+#define WM_VSCROLLCLIPBOARD  0x030A
+#define WM_SIZECLIPBOARD     0x030B
+#define WM_ASKCBFORMATNAME   0x030C
+#define WM_CHANGECBCHAIN     0x030D
+#define WM_HSCROLLCLIPBOARD  0x030E
+#define WM_QUERYNEWPALETTE   0x030F
+#define WM_PALETTEISCHANGING 0x0310
+#define WM_PALETTECHANGED    0x0311
+
+#define WM_COALESCE_FIRST    0x0390
+#define WM_COALESCE_LAST     0x039F
 
   /* misc messages */
 #define WM_NULL             0x0000
 #define WM_USER             0x0400
-
+#define WM_CPL_LAUNCH       (WM_USER + 1000)
+#define WM_CPL_LAUNCHED     (WM_USER + 1001)
 
   /* Key status flags for mouse events */
 #define MK_LBUTTON	    0x0001
@@ -1560,13 +1645,6 @@ enum { WM_NULL, WM_CREATE, WM_DESTROY, WM_MOVE, WM_UNUSED0, WM_SIZE, WM_ACTIVATE
 #define TPM_CENTERALIGN 0x0004
 #define TPM_RIGHTALIGN  0x0008
 
-/* Menu messages */
-#define WM_INITMENU         0x0116
-#define WM_INITMENUPOPUP    0x0117
-
-#define WM_MENUSELECT       0x011F
-#define WM_MENUCHAR         0x0120
-
 #define MF_INSERT 0
 #define MF_CHANGE 0x0080
 #define MF_APPEND 0x0100
@@ -2372,694 +2450,677 @@ typedef WINDEBUGINFO FAR* LPWINDEBUGINFO;
 #pragma pack(4)
 #endif
 
-
-#define F(ret,name) ret name(void);
-#define Fa(ret,name,t1,a1) ret name(t1);
-#define Fb(ret,name,t1,a1,t2,a2) ret name(t1,t2);
-#define Fc(ret,name,t1,a1,t2,a2,t3,a3) ret name(t1,t2,t3);
-#define Fd(ret,name,t1,a1,t2,a2,t3,a3,t4,a4) ret name(t1,t2,t3,t4);
-#define Fe(ret,name,t1,a1,t2,a2,t3,a3,t4,a4,t5,a5) ret name(t1,t2,t3,t4,t5);
-#define Ff(ret,name,t1,a1,t2,a2,t3,a3,t4,a4,t5,a5,t6,a6) ret name(t1,t2,t3,t4,t5,t6);
-#define Fg(ret,name,t1,a1,t2,a2,t3,a3,t4,a4,t5,a5,t6,a6,t7,a7) ret name(t1,t2,t3,t4,t5,t6,t7);
-#define Fh(ret,name,t1,a1,t2,a2,t3,a3,t4,a4,t5,a5,t6,a6,t7,a7,t8,a8) ret name(t1,t2,t3,t4,t5,t6,t7,t8);
-#define Fi(ret,name,t1,a1,t2,a2,t3,a3,t4,a4,t5,a5,t6,a6,t7,a7,t8,a8,t9,a9) ret name(t1,t2,t3,t4,t5,t6,t7,t8,t9);
-#define Fj(ret,name,t1,a1,t2,a2,t3,a3,t4,a4,t5,a5,t6,a6,t7,a7,t8,a8,t9,a9,t10,a10) ret name(t1,t2,t3,t4,t5,t6,t7,t8,t9,t10);
-#define Fk(ret,name,t1,a1,t2,a2,t3,a3,t4,a4,t5,a5,t6,a6,t7,a7,t8,a8,t9,a9,t10,a10,t11,a11) ret name(t1,t2,t3,t4,t5,t6,t7,t8,t9,t10,t11);
-#define Fl(ret,name,t1,a1,t2,a2,t3,a3,t4,a4,t5,a5,t6,a6,t7,a7,t8,a8,t9,a9,t10,a10,t11,a11,t12,a12) ret name(t1,t2,t3,t4,t5,t6,t7,t8,t9,t10,t11,t12);
-#define Fm(ret,name,t1,a1,t2,a2,t3,a3,t4,a4,t5,a5,t6,a6,t7,a7,t8,a8,t9,a9,t10,a10,t11,a11,t12,a12,t13,a13) ret name(t1,t2,t3,t4,t5,t6,t7,t8,t9,t10,t11,t12,t13);
-#define Fn(ret,name,t1,a1,t2,a2,t3,a3,t4,a4,t5,a5,t6,a6,t7,a7,t8,a8,t9,a9,t10,a10,t11,a11,t12,a12,t13,a13,t14,a14) ret name(t1,t2,t3,t4,t5,t6,t7,t8,t9,t10,t11,t12,t13,t14);
-
-int wsprintf(LPSTR a,LPSTR b,...);
-
-/* Implemented functions */
-
-F(BOOL,AnyPopup)
-F(BOOL,CloseClipboard)
-F(BOOL,EmptyClipboard)
-F(BOOL,GetInputState)
-F(BOOL,InSendMessage)
-F(BOOL,SetDeskPattern)
-F(DWORD,GetCurrentTime)
-F(DWORD,GetDialogBaseUnits)
-F(DWORD,GetMenuCheckMarkDimensions)
-F(DWORD,GetMessagePos)
-F(DWORD,GetTickCount)
-F(HANDLE,GetCurrentTask)
-F(HMENU,CreateMenu)
-F(HMENU,CreatePopupMenu)
-F(HWND,GetActiveWindow)
-F(HWND,GetCapture)
-F(HWND,GetClipboardOwner)
-F(HWND,GetClipboardViewer)
-F(HWND,GetDesktopHwnd)
-F(HWND,GetDesktopWindow)
-F(HWND,GetFocus)
-F(HWND,GetOpenClipboardWindow)
-F(HWND,GetSysModalWindow)
-F(LONG,GetMessageExtraInfo)
-F(LONG,GetMessageTime)
-F(LONG,GetVersion)
-F(LONG,GetWinFlags)
-F(LPINT,GetThresholdEvent)
-F(LPSTR,ValidateFreeSpaces)
-F(SEGPTR,GetDOSEnvironment)
-F(WORD,GetCaretBlinkTime)
-F(WORD,GetCurrentPDB)
-F(WORD,GetDoubleClickTime)
-F(WORD,GetNumTasks)
-F(WORD,GetTaskDS)
-F(int,CountClipboardFormats)
-F(int,GetKBCodePage)
-F(int,GetThresholdStatus)
-F(int,OpenSound)
-F(int,ProfInsChk)
-F(int,StartSound)
-F(int,StopSound)
-F(int,SyncAllVoices)
-F(void,CloseSound)
-F(void,DebugBreak)
-F(void,DestroyCaret)
-F(void,ProfClear)
-F(void,ProfFinish)
-F(void,ProfFlush)
-F(void,ProfStart)
-F(void,ProfStop)
-F(void,ReleaseCapture)
-F(void,SwitchStackBack)
-F(void,ValidateCodeSegments)
-F(void,WaitMessage)
-F(void,Yield)
-Fa(ATOM,AddAtom,SEGPTR,a)
-Fa(ATOM,DeleteAtom,ATOM,a)
-Fa(ATOM,FindAtom,SEGPTR,a)
-Fa(ATOM,GlobalAddAtom,SEGPTR,a)
-Fa(ATOM,GlobalDeleteAtom,ATOM,a)
-Fa(ATOM,GlobalFindAtom,SEGPTR,a)
-Fa(ATOM,RegisterClass,LPWNDCLASS,a) 
-Fa(BOOL,BringWindowToTop,HWND,a)
-Fa(BOOL,DeleteDC,HDC,a)
-Fa(BOOL,DeleteMetaFile,HMETAFILE,a)
-Fa(BOOL,DeleteObject,HANDLE,a)
-Fa(BOOL,DestroyCursor,HCURSOR,a)
-Fa(BOOL,DestroyIcon,HICON,a)
-Fa(BOOL,DestroyMenu,HMENU,a)
-Fa(BOOL,DestroyWindow,HWND,a)
-Fa(BOOL,EnableHardwareInput,BOOL,a)
-Fa(BOOL,EndDeferWindowPos,HDWP,hWinPosInfo)
-Fa(BOOL,FreeModule,HANDLE,a)
-Fa(BOOL,FreeResource,HANDLE,a)
-Fa(BOOL,GlobalUnWire,HGLOBAL,a)
-Fa(BOOL,GlobalUnlock,HGLOBAL,a)
-Fa(BOOL,IsBadCodePtr,SEGPTR,a)
-Fa(BOOL,IsCharAlpha,char,ch)
-Fa(BOOL,IsCharAlphaNumeric,char,ch)
-Fa(BOOL,IsCharLower,char,ch)
-Fa(BOOL,IsCharUpper,char,ch)
-Fa(BOOL,IsClipboardFormatAvailable,WORD,a)
-Fa(BOOL,IsIconic,HWND,a)
-Fa(BOOL,IsRectEmpty,LPRECT,a)
-Fa(BOOL,IsTwoByteCharPrefix,char,a)
-Fa(BOOL,IsWindow,HWND,a)
-Fa(BOOL,IsWindowEnabled,HWND,a)
-Fa(BOOL,IsWindowVisible,HWND,a)
-Fa(BOOL,IsZoomed,HWND,a)
-Fa(BOOL,LocalUnlock,HANDLE,a)
-Fa(BOOL,OpenClipboard,HWND,a)
-Fa(BOOL,OpenIcon,HWND,a)
-Fa(BOOL,RemoveFontResource,LPSTR,a)
-Fa(BOOL,SetDeskWallPaper,LPSTR,a)
-Fa(BOOL,SetErrorMode,WORD,a)
-Fa(BOOL,SetMessageQueue,int,a)
-Fa(BOOL,SetWinDebugInfo,LPWINDEBUGINFO,a)
-Fa(BOOL,SwapMouseButton,BOOL,a)
-Fa(BOOL,TranslateMessage,LPMSG,a)
-Fa(BOOL,UnhookWindowsHookEx,HHOOK,a)
-Fa(BOOL,UnrealizeObject,HBRUSH,a)
-Fa(BYTE,GetTempDrive,BYTE,a)
-Fa(COLORREF,GetBkColor,HDC,a)
-Fa(COLORREF,GetSysColor,short,a)
-Fa(COLORREF,GetTextColor,HDC,a)
-Fa(DWORD,GetAspectRatioFilter,HDC,a)
-Fa(DWORD,GetBitmapDimension,HBITMAP,a)
-Fa(DWORD,GetBrushOrg,HDC,a)
-Fa(DWORD,GetCurrentPosition,HDC,a)
-Fa(DWORD,GetDCOrg,HDC,a)
-Fa(DWORD,GetFreeSpace,WORD,a)
-Fa(DWORD,GetHeapSpaces,HMODULE,a)
-Fa(DWORD,GetSelectorBase,WORD,a)
-Fa(DWORD,GetSelectorLimit,WORD,a)
-Fa(DWORD,GetViewportExt,HDC,a)
-Fa(DWORD,GetViewportOrg,HDC,a)
-Fa(DWORD,GetWindowExt,HDC,a)
-Fa(DWORD,GetWindowOrg,HDC,a)
-Fa(DWORD,GlobalCompact,DWORD,a)
-Fa(DWORD,GlobalDOSAlloc,DWORD,a)
-Fa(DWORD,GlobalHandle,WORD,a)
-Fa(DWORD,GlobalSize,HGLOBAL,a)
-Fa(DWORD,OemKeyScan,WORD,a)
-Fa(FARPROC,LocalNotify,FARPROC,a)
-Fa(HANDLE,CreateMetaFile,LPSTR,a)
-Fa(HANDLE,GetAtomHandle,ATOM,a)
-Fa(HANDLE,GetClipboardData,WORD,a)
-Fa(HANDLE,GetCodeHandle,FARPROC,a)
-Fa(HANDLE,GetMetaFile,LPSTR,a)
-Fa(HANDLE,GetMetaFileBits,HANDLE,a)
-Fa(HANDLE,GetModuleHandle,LPCSTR,a)
-Fa(HANDLE,GetStockObject,int,a)
-Fa(HANDLE,GetWindowTask,HWND,a)
-Fa(HANDLE,LoadLibrary,LPCSTR,a)
-Fa(HANDLE,LocalFree,HANDLE,a)
-Fa(HANDLE,LocalHandle,WORD,a)
-Fa(HANDLE,SetMetaFileBits,HANDLE,a)
-Fa(HBITMAP,CreateBitmapIndirect,BITMAP FAR*,a)
-Fa(HBRUSH,CreateBrushIndirect,LOGBRUSH FAR*,a)
-Fa(HBRUSH,CreatePatternBrush,HBITMAP,a)
-Fa(HBRUSH,CreateSolidBrush,DWORD,a)
-Fa(HCURSOR,SetCursor,HCURSOR,a)
-Fa(HDC,CreateCompatibleDC,HDC,a)
-Fa(HDC,GetDC,HWND,a)
-Fa(HDC,GetDCState,HDC,a)
-Fa(HDC,GetWindowDC,HWND,a)
-Fa(HDWP,BeginDeferWindowPos,INT,nNumWindows)
-Fa(HFONT,CreateFontIndirect,LOGFONT FAR*,a)
-Fa(HGLOBAL,GetTaskQueue,HTASK,a)
-Fa(HGLOBAL,GlobalFree,HGLOBAL,a)
-Fa(HGLOBAL,GlobalLRUNewest,HGLOBAL,a)
-Fa(HGLOBAL,GlobalLRUOldest,HGLOBAL,a)
-Fa(HGLOBAL,LockSegment,HGLOBAL,a)
-Fa(HMENU,GetMenu,HWND,a)
-Fa(HMENU,LoadMenuIndirect,LPSTR,a)
-Fa(HMETAFILE,CloseMetaFile,HANDLE,a)
-Fa(HMODULE, GetExePtr,HANDLE,a)
-Fa(HPALETTE,CreatePalette,LPLOGPALETTE,a)
-Fa(HPEN,CreatePenIndirect,LOGPEN FAR*,a)
-Fa(HRGN,CreateEllipticRgnIndirect,LPRECT,a)
-Fa(HRGN,CreateRectRgnIndirect,LPRECT,a)
-Fa(HRGN,GetClipRgn,HDC,a)
-Fa(HRGN,InquireVisRgn,HDC,a)
-Fa(HRGN,SaveVisRgn,HDC,a)
-Fa(HWND,GetLastActivePopup,HWND,a)
-Fa(HWND,GetParent,HWND,a)
-Fa(HWND,GetTopWindow,HWND,a)
-Fa(HWND,SetActiveWindow,HWND,a)
-Fa(HWND,SetCapture,HWND,a)
-Fa(HWND,SetClipboardViewer,HWND,a)
-Fa(HWND,SetFocus,HWND,a)
-Fa(HWND,SetSysModalWindow,HWND,a)
-Fa(HWND,WindowFromPoint,POINT,a)
-Fa(INT,_lclose,INT,a)
-Fa(INT,lstrlen,LPCSTR,a)
-Fa(LONG,DispatchMessage,LPMSG,msg)
-Fa(LONG,SetSwapAreaSize,WORD,a)
-Fa(LPSTR,AnsiLower,LPSTR,a)
-Fa(LPSTR,AnsiUpper,LPSTR,a)
-Fa(LPSTR,GlobalLock,HGLOBAL,a)
-Fa(LPSTR,LockResource,HANDLE,a)
-Fa(SEGPTR,AnsiNext,SEGPTR,a)
-Fa(SEGPTR,GlobalWire,HGLOBAL,a)
-Fa(SEGPTR,WIN16_GlobalLock,HGLOBAL,a)
-Fa(SEGPTR,WIN16_LockResource,HANDLE,a)
-Fa(UINT,GDIRealizePalette,HDC,a)
-Fa(UINT,RealizePalette,HDC,a)
-Fa(WORD,AllocCStoDSAlias,WORD,a)
-Fa(WORD,AllocDStoCSAlias,WORD,a)
-Fa(WORD,AllocSelector,WORD,a)
-Fa(WORD,AllocSelectorArray,WORD,a)
-Fa(WORD,ArrangeIconicWindows,HWND,a)
-Fa(WORD,EnumClipboardFormats,WORD,a)
-Fa(WORD,FarGetOwner,HANDLE,a)
-Fa(WORD,FreeSelector,WORD,a)
-Fa(WORD,GetBkMode,HDC,a)
-Fa(WORD,GetDriveType,INT,a)
-Fa(WORD,GetMapMode,HDC,a)
-Fa(WORD,GetMenuItemCount,HMENU,a)
-Fa(WORD,GetPolyFillMode,HDC,a)
-Fa(WORD,GetROP2,HDC,a)
-Fa(WORD,GetRelAbs,HDC,a)
-Fa(WORD,GetStretchBltMode,HDC,a)
-Fa(WORD,GetSystemPaletteUse,HDC,a)
-Fa(WORD,GetTextAlign,HDC,a)
-Fa(WORD,GlobalDOSFree,WORD,a)
-Fa(WORD,GlobalFlags,HGLOBAL,a)
-Fa(WORD,GlobalPageLock,HGLOBAL,a)
-Fa(WORD,GlobalPageUnlock,HGLOBAL,a)
-Fa(WORD,InitAtomTable,WORD,a)
-Fa(WORD,LocalCompact,WORD,a)
-Fa(WORD,LocalFlags,HLOCAL,a)
-Fa(WORD,LocalLock,HLOCAL,a)
-Fa(WORD,LocalSize,HLOCAL,a)
-Fa(WORD,RealizeDefaultPalette,HDC,a)
-Fa(WORD,RegisterClipboardFormat,LPCSTR,a)
-Fa(WORD,RegisterWindowMessage,SEGPTR,a)
-Fa(WORD,SetHandleCount,WORD,a)
-Fa(WORD,VkKeyScan,WORD,a)
-Fa(int,AddFontResource,LPSTR,a)
-Fa(int,Catch,LPCATCHBUF,a)
-Fa(int,ClearCommBreak,int,a)
-Fa(int,CloseComm,int,a)
-Fa(int,CountVoiceNotes,int,a)
-Fa(int,GetAsyncKeyState,int,a)
-Fa(int,GetDlgCtrlID,HWND,a)
-Fa(int,GetKeyState,int,a)
-Fa(int,GetKeyboardType,int,a)
-Fa(int,GetModuleUsage,HANDLE,a)
-Fa(int,GetSystemMetrics,WORD,a)
-Fa(int,GetWindowTextLength,HWND,a)
-Fa(int,RestoreVisRgn,HDC,a)
-Fa(int,SaveDC,HDC,a)
-Fa(int,SetCommBreak,int,a)
-Fa(int,SetCommState,DCB*,a)
-Fa(int,ShowCursor,BOOL,a)
-Fa(int,UpdateColors,HDC,a)
-Fa(int,WaitSoundState,int,a)
-Fa(short,GetTextCharacterExtra,HDC,a)
-Fa(void,ClipCursor,LPRECT,a)
-Fa(void,CloseWindow,HWND,a)
-Fa(void,DrawMenuBar,HWND,a)
-Fa(void,FatalExit,int,a)
-Fa(void,FreeLibrary,HANDLE,a)
-Fa(void,FreeProcInstance,FARPROC,a)
-Fa(void,GetCaretPos,LPPOINT,a)
-Fa(void,GetCursorPos,LPPOINT,a)
-Fa(void,GetKeyboardState,BYTE FAR*,a)
-Fa(void,GlobalFix,HGLOBAL,a)
-Fa(void,GlobalFreeAll,HANDLE,a)
-Fa(void,GlobalNotify,FARPROC,a)
-Fa(void,GlobalUnfix,HGLOBAL,a)
-Fa(void,HideCaret,HWND,a)
-Fa(void,LimitEmsPages,DWORD,a)
-Fa(void,MessageBeep,WORD,a)
-Fa(void,OutputDebugString,LPSTR,a)
-Fa(void,PostQuitMessage,int,a)
-Fa(void,ReplyMessage,LONG,a)
-Fa(void,SetCaretBlinkTime,WORD,a)
-Fa(void,SetConvertHook,BOOL,a)
-Fa(void,SetDoubleClickTime,WORD,a)
-Fa(void,SetKeyboardState,BYTE FAR*,a)
-Fa(void,SetRectEmpty,LPRECT,a)
-Fa(void,ShowCaret,HWND,a)
-Fa(void,SwapRecording,WORD,a)
-Fa(void,UnlockSegment,HGLOBAL,a)
-Fa(void,UpdateWindow,HWND,a)
-Fb(BOOL,CallMsgFilter,SEGPTR,a,short,b)
-Fb(BOOL,ChangeClipboardChain,HWND,a,HWND,b)
-Fb(BOOL,EnableWindow,HWND,a,BOOL,b)
-Fb(BOOL,EnumWindows,FARPROC,a,LONG,b)
-Fb(BOOL,EqualRect,LPRECT,a,LPRECT,b)
-Fb(BOOL,EqualRgn,HRGN,a,HRGN,b)
-Fb(BOOL,ExitWindows,DWORD,dwReserved,WORD,wReturnCode)
-Fb(BOOL,FlashWindow,HWND,a,BOOL,b)
-Fb(BOOL,GetBitmapDimensionEx,HBITMAP,a,LPSIZE,b)
-Fb(BOOL,GetBrushOrgEx,HDC,a,LPPOINT,b)
-Fb(BOOL,GetCurrentPositionEx,HDC,a,LPPOINT,b)
-Fb(BOOL,GetTextMetrics,HDC,a,LPTEXTMETRIC,b)
-Fb(BOOL,GetViewportExtEx,HDC,a,LPPOINT,b)
-Fb(BOOL,GetViewportOrgEx,HDC,a,LPPOINT,b)
-Fb(BOOL,GetWinDebugInfo,LPWINDEBUGINFO,a,UINT,b)
-Fb(BOOL,GetWindowExtEx,HDC,a,LPPOINT,b)
-Fb(BOOL,GetWindowOrgEx,HDC,a,LPPOINT,b)
-Fb(BOOL,GetWindowPlacement,HWND,a,LPWINDOWPLACEMENT,b)
-Fb(BOOL,InvertRgn,HDC,a,HRGN,b)
-Fb(BOOL,IsBadHugeReadPtr,SEGPTR,a,DWORD,b)
-Fb(BOOL,IsBadHugeWritePtr,SEGPTR,a,DWORD,b)
-Fb(BOOL,IsBadReadPtr,SEGPTR,a,WORD,b)
-Fb(BOOL,IsBadStringPtr,SEGPTR,a,WORD,b)
-Fb(BOOL,IsBadWritePtr,SEGPTR,a,WORD,b)
-Fb(BOOL,IsChild,HWND,a,HWND,b)
-Fb(BOOL,IsDialogMessage,HWND,a,LPMSG,b)
-Fb(BOOL,KillSystemTimer,HWND,a,WORD,b)
-Fb(BOOL,KillTimer,HWND,a,WORD,b)
-Fb(BOOL,OemToAnsi,LPSTR,a,LPSTR,b)
-Fb(BOOL,PaintRgn,HDC,a,HRGN,b)
-Fb(BOOL,PlayMetaFile,HDC,a,HANDLE,b)
-Fb(BOOL,PtInRect,LPRECT,a,POINT,b)
-Fb(BOOL,RectInRegion,HRGN,a,LPRECT,b)
-Fb(BOOL,RectVisible,HDC,a,LPRECT,b)
-Fb(BOOL,ResizePalette,HPALETTE,a,WORD,b)
-Fb(BOOL,RestoreDC,HDC,a,short,b)
-Fb(BOOL,SetConvertParams,int,a,int,b)
-Fb(BOOL,SetMenu,HWND,a,HMENU,b)
-Fb(BOOL,SetWindowPlacement,HWND,a,LPWINDOWPLACEMENT,b)
-Fb(BOOL,ShowWindow,HWND,a,int,b) 
-Fb(BOOL,TranslateMDISysAccel,HWND,a,LPMSG,b)
-Fb(BOOL,UnhookWindowsHook,short,a,FARPROC,b)
-Fb(BOOL,UnregisterClass,SEGPTR,a,HANDLE,b)
-Fb(DWORD,GetNearestColor,HDC,a,DWORD,b)
-Fb(DWORD,SetBkColor,HDC,a,COLORREF,b)
-Fb(DWORD,SetMapperFlags,HDC,a,DWORD,b)
-Fb(DWORD,SetTextColor,HDC,a,DWORD,b)
-Fb(DWORD,SizeofResource,HANDLE,a,HRSRC,b)
-Fb(FARPROC,GetProcAddress,HANDLE,a,SEGPTR,b)
-Fb(FARPROC,MakeProcInstance,FARPROC,a,HANDLE,b)
-Fb(FARPROC,SetWindowsHook,short,a,FARPROC,b)
-Fb(HANDLE,CopyMetaFile,HANDLE,a,LPSTR,b)
-Fb(HANDLE,GetProp,HWND,a,SEGPTR,b)
-Fb(HANDLE,LoadAccelerators,HANDLE,a,SEGPTR,b)
-Fb(HANDLE,LoadModule,LPCSTR,a,LPVOID,b)
-Fb(HANDLE,LoadResource,HANDLE,a,HANDLE,b)
-Fb(HANDLE,LocalAlloc,WORD,a,WORD,b)
-Fb(HANDLE,RemoveProp,HWND,a,SEGPTR,b)
-Fb(HANDLE,SelectObject,HDC,a,HANDLE,b)
-Fb(HANDLE,SetClipboardData,WORD,a,HANDLE,b)
-Fb(HBITMAP,LoadBitmap,HANDLE,a,SEGPTR,b)
-Fb(HBRUSH,CreateDIBPatternBrush,HANDLE,a,WORD,b)
-Fb(HBRUSH,CreateHatchBrush,short,a,COLORREF,b)
-Fb(HCURSOR,LoadCursor,HANDLE,a,SEGPTR,b)
-Fb(HDC,BeginPaint,HWND,a,LPPAINTSTRUCT,b) 
-Fb(HGLOBAL,GlobalAlloc,WORD,a,DWORD,b)
-Fb(HGLOBAL,SetTaskQueue,HTASK,a,HGLOBAL,b)
-Fb(HICON,LoadIcon,HANDLE,a,SEGPTR,b)
-Fb(HMENU,GetSubMenu,HMENU,a,short,b)
-Fb(HMENU,GetSystemMenu,HWND,a,BOOL,b)
-Fb(HMENU,LoadMenu,HANDLE,a,SEGPTR,b)
-Fb(HMENU,LookupMenuHandle,HMENU,a,INT,b)
-Fb(HPALETTE,GDISelectPalette,HDC,a,HPALETTE,b)
-Fb(HWND,ChildWindowFromPoint,HWND,a,POINT,b)
-Fb(HWND,FindWindow,SEGPTR,a,LPSTR,b)
-Fb(HWND,GetDlgItem,HWND,a,WORD,b)
-Fb(HWND,GetNextWindow,HWND,a,WORD,b)
-Fb(HWND,GetWindow,HWND,a,WORD,b)
-Fb(HWND,SetParent,HWND,a,HWND,b)
-Fb(INT,AnsiToOem,LPSTR,a,LPSTR,b)
-Fb(INT,_lcreat,LPSTR,a,INT,b)
-Fb(INT,_lopen,LPSTR,a,INT,b)
-Fb(INT,lstrcmp,LPCSTR,a,LPCSTR,b )
-Fb(INT,lstrcmpi,LPCSTR,a,LPCSTR,b )
-Fb(LONG,EscapeCommFunction,int,a,int,b)
-Fb(LONG,GetClassLong,HWND,a,short,b)
-Fb(LONG,GetWindowLong,HWND,a,short,b)
-Fb(SEGPTR,AnsiPrev,SEGPTR,a,SEGPTR,b)
-Fb(SEGPTR,lstrcat,SEGPTR,a,SEGPTR,b)
-Fb(SEGPTR,lstrcpy,SEGPTR,a,SEGPTR,b)
-Fb(WORD FAR*,SetCommEventMask,int,a,WORD,b)
-Fb(WORD,AnsiLowerBuff,LPSTR,a,WORD,b)
-Fb(WORD,AnsiUpperBuff,LPSTR,a,WORD,b)
-Fb(WORD,ChangeSelector,WORD,a,WORD,b)
-Fb(WORD,GetClassWord,HWND,a,short,b)
-Fb(WORD,GetCommEventMask,int,a,int,b)
-Fb(WORD,GetMenuItemID,HMENU,a,int,b)
-Fb(WORD,GetNearestPaletteIndex,HPALETTE,a,DWORD,b)
-Fb(WORD,GetSystemDirectory,LPSTR,a,WORD,b)
-Fb(WORD,GetWindowWord,HWND,a,short,b)
-Fb(WORD,GetWindowsDirectory,LPSTR,a,WORD,b)
-Fb(WORD,IsDlgButtonChecked,HWND,a,WORD,b)
-Fb(WORD,LocalShrink,HANDLE,a,WORD,b)
-Fb(WORD,MapVirtualKey,WORD,a,WORD,b)
-Fb(WORD,PrestoChangoSelector,WORD,a,WORD,b)
-Fb(WORD,SetBkMode,HDC,a,WORD,b)
-Fb(WORD,SetMapMode,HDC,a,WORD,b)
-Fb(WORD,SetPolyFillMode,HDC,a,WORD,b)
-Fb(WORD,SetROP2,HDC,a,WORD,b)
-Fb(WORD,SetRelAbs,HDC,a,WORD,b)
-Fb(WORD,SetSelectorBase,WORD,a,DWORD,b)
-Fb(WORD,SetSelectorLimit,WORD,a,DWORD,b)
-Fb(WORD,SetStretchBltMode,HDC,a,WORD,b)
-Fb(WORD,SetSystemPaletteUse,HDC,a,WORD,b)
-Fb(WORD,SetTextAlign,HDC,a,WORD,b)
-Fb(WORD,WinExec,LPSTR,a,WORD,b)
-Fb(int,AccessResource,HANDLE,a,HANDLE,b)
-Fb(int,BuildCommDCB,LPSTR,a,DCB*,b)
-Fb(int,ConvertRequest,HWND,a,LPKANJISTRUCT,b)
-Fb(int,EnumProps,HWND,a,FARPROC,b)
-Fb(int,ExcludeUpdateRgn,HDC,a,HWND,b)
-Fb(int,FlushComm,int,a,int,b)
-Fb(int,GetClipBox,HDC,a,LPRECT,b)
-Fb(int,GetCommError,int,a,COMSTAT*,b)
-Fb(int,GetCommState,int,a,DCB*,b)
-Fb(int,GetDeviceCaps,HDC,a,WORD,b)
-Fb(int,GetPriorityClipboardFormat,WORD FAR*,a,short,b)
-Fb(int,GetRgnBox,HRGN,a,LPRECT,b)
-Fb(int,GetScrollPos,HWND,a,int,b)
-Fb(int,ReleaseDC,HWND,a,HDC,b)
-Fb(int,SelectClipRgn,HDC,a,HRGN,b)
-Fb(int,SelectVisRgn,HDC,a,HRGN,b)
-Fb(int,SetSoundNoise,int,a,int,b)
-Fb(int,SetVoiceQueueSize,int,a,int,b)
-Fb(int,SetVoiceThreshold,int,a,int,b)
-Fb(int,Throw,LPCATCHBUF,a,int,b)
-Fb(int,TransmitCommChar,int,a,char,b)
-Fb(int,UngetCommChar,int,a,char,b)
-Fb(short,SetTextCharacterExtra,HDC,a,short,b)
-Fb(void,ClientToScreen,HWND,a,LPPOINT,b)
-Fb(void,CopyRect,LPRECT,a,LPRECT,b)
-Fb(void,DrawFocusRect,HDC,a,LPRECT,b)
-Fb(void,EndDialog,HWND,a,short,b)
-Fb(void,EndPaint,HWND,a,LPPAINTSTRUCT,b)
-Fb(void,FarSetOwner,HANDLE,a,WORD,b)
-Fb(void,GetClientRect,HWND,a,LPRECT,b)
-Fb(void,GetCodeInfo,FARPROC,lpProc,LPVOID,lpSegInfo)
-Fb(void,GetWindowRect,HWND,a,LPRECT,b)
-Fb(void,InvertRect,HDC,a,LPRECT,b)
-Fb(void,MapDialogRect,HWND,a,LPRECT,b)
-Fb(void,ProfSampRate,int,a,int,b)
-Fb(void,ProfSetup,int,a,int,b)
-Fb(void,ScreenToClient,HWND,a,LPPOINT,b)
-Fb(void,SetCaretPos,short,a,short,b)
-Fb(void,SetCursorPos,short,a,short,b)
-Fb(void,SetDCState,HDC,a,HDC,b)
-Fb(void,SetWindowText,HWND,a,LPSTR,b)
-Fb(void,ShowOwnedPopups,HWND,a,BOOL,b)
-Fb(void,ValidateRect,HWND,a,LPRECT,b)
-Fb(void,ValidateRgn,HWND,a,HRGN,b)
-Fc(BOOL,CheckMenuItem,HMENU,a,WORD,b,WORD,c)
-Fc(BOOL,DPtoLP,HDC,a,LPPOINT,b,int,c)
-Fc(BOOL,DeleteMenu,HMENU,a,WORD,b,WORD,c)
-Fc(BOOL,DlgDirSelect,HWND,a,LPSTR,b,int,c)
-Fc(BOOL,DlgDirSelectComboBox,HWND,a,LPSTR,b,int,c)
-Fc(BOOL,EnableMenuItem,HMENU,a,WORD,b,WORD,c)
-Fc(BOOL,EnableScrollBar,HWND,a,INT,b,UINT,c)
-Fc(BOOL,EnumChildWindows,HWND,a,FARPROC,b,LONG,c)
-Fc(BOOL,EnumTaskWindows,HANDLE,a,FARPROC,b,LONG,c)
-Fc(BOOL,FillRgn,HDC,a,HRGN,b,HBRUSH,c)
-Fc(BOOL,GetClassInfo,HANDLE,a,SEGPTR,b,LPWNDCLASS,c)
-Fc(BOOL,GetUpdateRect,HWND,a,LPRECT,b,BOOL,c)
-Fc(BOOL,IntersectRect,LPRECT,a,LPRECT,b,LPRECT,c)
-Fc(BOOL,LPtoDP,HDC,a,LPPOINT,b,int,c)
-Fc(BOOL,LineTo,HDC,a,short,b,short,c)
-Fc(BOOL,LocalInit,WORD,a,WORD,b,WORD,c)
-Fc(BOOL,Polygon,HDC,a,LPPOINT,b,int,c)
-Fc(BOOL,Polyline,HDC,a,LPPOINT,b,int,c)
-Fc(BOOL,PtInRegion,HRGN,a,short,b,short,c)
-Fc(BOOL,PtVisible,HDC,a,short,b,short,c)
-Fc(BOOL,RemoveMenu,HMENU,a,WORD,b,WORD,c)
-Fc(BOOL,SetProp,HWND,a,SEGPTR,b,HANDLE,c)
-Fc(BOOL,SubtractRect,LPRECT,a,LPRECT,b,LPRECT,c)
-Fc(BOOL,UnionRect,LPRECT,a,LPRECT,b,LPRECT,c)
-Fc(BOOL,WriteProfileString,LPSTR,a,LPSTR,b,LPSTR,c)
-Fc(DWORD,GetPixel,HDC,a,short,b,short,c)
-Fc(DWORD,GetTextExtent,HDC,a,LPSTR,b,short,c)
-Fc(DWORD,MoveTo,HDC,a,short,b,short,c)
-Fc(DWORD,OffsetViewportOrg,HDC,a,short,b,short,c)
-Fc(DWORD,OffsetWindowOrg,HDC,a,short,b,short,c)
-Fc(DWORD,SetBitmapDimension,HBITMAP,a,short,b,short,c)
-Fc(DWORD,SetBrushOrg,HDC,a,short,b,short,c)
-Fc(DWORD,SetViewportExt,HDC,a,short,b,short,c)
-Fc(DWORD,SetViewportOrg,HDC,a,short,b,short,c)
-Fc(DWORD,SetWindowExt,HDC,a,short,b,short,c)
-Fc(DWORD,SetWindowOrg,HDC,a,short,b,short,c)
-Fc(FARPROC,SetResourceHandler,HANDLE,a,LPSTR,b,FARPROC,c)
-Fc(HANDLE,AllocResource,HANDLE,a,HANDLE,b,DWORD,c)
-Fc(HANDLE,FindResource,HANDLE,a,SEGPTR,b,SEGPTR,c)
-Fc(HANDLE,LocalReAlloc,HANDLE,a,WORD,b,WORD,c)
-Fc(HBITMAP,CreateCompatibleBitmap,HDC,a,short,b,short,c)
-Fc(HBITMAP,CreateDiscardableBitmap,HDC,a,short,b,short,c)
-Fc(HBRUSH,GetControlBrush,HWND,a,HDC,b,WORD,c)
-Fc(HDC,GetDCEx,HWND,a,HRGN,b,DWORD,c)
-Fc(HGLOBAL,GlobalReAlloc,HGLOBAL,a,DWORD,b,WORD,c)
-Fc(HPALETTE,SelectPalette,HDC,a,HPALETTE,b,BOOL,c)
-Fc(HPEN,CreatePen,short,a,short,b,COLORREF,c)
-Fc(HRGN,CreatePolygonRgn,LPPOINT,a,short,b,short,c)
-Fc(HWND,GetNextDlgGroupItem,HWND,a,HWND,b,BOOL,c)
-Fc(HWND,GetNextDlgTabItem,HWND,a,HWND,b,BOOL,c)
-Fc(INT,GetTextFace,HDC,a,INT,b,LPSTR,c)
-Fc(INT,OpenFile,LPSTR,a,LPOFSTRUCT,b,WORD,c)
-Fc(INT,_lread,INT,a,LPSTR,b,WORD,c)
-Fc(INT,_lwrite,INT,a,LPCSTR,b,WORD,c)
-Fc(LONG,GetBitmapBits,HBITMAP,a,LONG,b,LPSTR,c)
-Fc(LONG,SetBitmapBits,HBITMAP,a,LONG,b,LPSTR,c)
-Fc(LONG,SetClassLong,HWND,a,short,b,LONG,c)
-Fc(LONG,SetWindowLong,HWND,a,short,b,LONG,c)
-Fc(LONG,_hread,INT,a,LPSTR,b,LONG,c)
-Fc(LONG,_hwrite,INT,a,LPCSTR,b,LONG,c)
-Fc(LONG,_llseek,INT,a,LONG,b,INT,c)
-Fc(SEGPTR,lstrcpyn,SEGPTR,a,SEGPTR,b,WORD,c)
-Fc(WORD,GetAtomName,ATOM,a,LPSTR,b,short,c)
-Fc(WORD,GetInternalWindowPos,HWND,a,LPRECT,b,LPPOINT,c)
-Fc(WORD,GetMenuState,HMENU,a,WORD,b,WORD,c)
-Fc(WORD,GetProfileInt,LPSTR,a,LPSTR,b,int,c)
-Fc(WORD,GlobalGetAtomName,ATOM,a,LPSTR,b,short,c)
-Fc(WORD,SelectorAccessRights,WORD,a,WORD,b,WORD,c)
-Fc(WORD,SetClassWord,HWND,a,short,b,WORD,c)
-Fc(WORD,SetWindowWord,HWND,a,short,b,WORD,c)
-Fc(int,FillRect,HDC,a,LPRECT,b,HBRUSH,c)
-Fc(int,FrameRect,HDC,a,LPRECT,b,HBRUSH,c)
-Fc(int,GetClassName,HWND,a,LPSTR,b,short,c)
-Fc(int,GetClipboardFormatName,WORD,a,LPSTR,b,short,c)
-Fc(int,GetEnvironment,LPSTR,a,LPSTR,b,WORD,c)
-Fc(int,GetInstanceData,HANDLE,a,WORD,b,int,c)
-Fc(int,GetKeyNameText,LONG,a,LPSTR,b,int,c)
-Fc(int,GetModuleFileName,HANDLE,a,LPSTR,b,short,c)
-Fc(int,GetObject,HANDLE,a,int,b,LPSTR,c)
-Fc(int,GetUpdateRgn,HWND,a,HRGN,b,BOOL,c)
-Fc(int,GetWindowText,HWND,a,LPSTR,b,int,c)
-Fc(int,MulDiv,int,a,int,b,int,c)
-Fc(int,OffsetClipRgn,HDC,a,short,b,short,c)
-Fc(int,OffsetRgn,HRGN,a,short,b,short,c)
-Fc(int,OpenComm,LPSTR,a,WORD,b,WORD,c)
-Fc(int,ReadComm,int,a,LPSTR,b,int,c)
-Fc(int,SetEnvironment,LPSTR,a,LPSTR,b,WORD,c)
-Fc(int,SetVoiceEnvelope,int,a,int,b,int,c)
-Fc(int,SetVoiceSound,int,a,LONG,b,int,c)
-Fc(int,TranslateAccelerator,HWND,a,HANDLE,b,LPMSG,c)
-Fc(int,WriteComm,int,a,LPSTR,b,int,c)
-Fc(int,wvsprintf,LPSTR,a,LPSTR,b,LPSTR,c)
-Fc(short,SetTextJustification,HDC,a,short,b,short,c)
-Fc(void,AdjustWindowRect,LPRECT,a,DWORD,b,BOOL,c)
-Fc(void,AnsiToOemBuff,LPSTR,a,LPSTR,b,INT,c)
-Fc(void,CheckDlgButton,HWND,a,WORD,b,WORD,c)
-Fc(void,InflateRect,LPRECT,a,short,b,short,c)
-Fc(void,InvalidateRect,HWND,a,LPRECT,b,BOOL,c)
-Fc(void,InvalidateRgn,HWND,a,HRGN,b,BOOL,c)
-Fc(void,OemToAnsiBuff,LPSTR,a,LPSTR,b,INT,c)
-Fc(void,OffsetRect,LPRECT,a,short,b,short,c)
-Fc(void,SetDlgItemText,HWND,a,WORD,b,SEGPTR,c)
-Fc(void,SetSysColors,int,a,LPINT,b,COLORREF*,c)
-Fc(void,ShowScrollBar,HWND,a,WORD,b,BOOL,c)
-Fc(void,SwitchStackTo,WORD,a,WORD,b,WORD,c)
-Fd(BOOL,AppendMenu,HMENU,a,WORD,b,WORD,c,LPSTR,d)
-Fd(BOOL,DrawIcon,HDC,a,short,b,short,c,HICON,d)
-Fd(BOOL,EnumMetaFile,HDC,a,LOCALHANDLE,b,FARPROC,c,BYTE FAR*,d)
-Fd(BOOL,FloodFill,HDC,a,INT,b,INT,c,COLORREF,d)
-Fd(BOOL,GetCharWidth,HDC,a,WORD,b,WORD,c,LPINT,d)
-Fd(BOOL,GetMessage,SEGPTR,msg,HWND,b,WORD,c,WORD,d)
-Fd(BOOL,GetTextExtentPoint,HDC,a,LPSTR,b,short,c,LPSIZE,d)
-Fd(BOOL,HiliteMenuItem,HWND,a,HMENU,b,WORD,c,WORD,d)
-Fd(BOOL,MoveToEx,HDC,a,short,b,short,c,LPPOINT,d)
-Fd(BOOL,OffsetViewportOrgEx,HDC,a,short,b,short,c,LPPOINT,d)
-Fd(BOOL,OffsetWindowOrgEx,HDC,a,short,b,short,c,LPPOINT,d)
-Fd(BOOL,PolyPolygon,HDC,a,LPPOINT,b,LPINT,c,WORD,d)
-Fd(BOOL,PostAppMessage,HANDLE,a,WORD,b,WORD,c,LONG,d)
-Fd(BOOL,PostMessage,HWND,a,WORD,b,WORD,c,LONG,d)
-Fd(BOOL,RedrawWindow,HWND,a,LPRECT,b,HRGN,c,UINT,d)
-Fd(BOOL,SetBitmapDimensionEx,HBITMAP,a,short,b,short,c,LPSIZE,d)
-Fd(BOOL,SetViewportExtEx,HDC,a,short,b,short,c,LPSIZE,d)
-Fd(BOOL,SetViewportOrgEx,HDC,a,short,b,short,c,LPPOINT,d)
-Fd(BOOL,SetWindowExtEx,HDC,a,short,b,short,c,LPSIZE,d)
-Fd(BOOL,SetWindowOrgEx,HDC,a,short,b,short,c,LPPOINT,d)
-Fd(BOOL,WinHelp,HWND,hwndMain,LPSTR,lpszHelp,WORD,usCommand,DWORD,ulData)
-Fd(BOOL,WritePrivateProfileString,LPSTR,a,LPSTR,b,LPSTR,c,LPSTR,d)
-Fd(COLORREF,SetPixel,HDC,a,short,b,short,c,COLORREF,d)
-Fd(DWORD,CallNextHookEx,HHOOK,a,short,b,WPARAM,c,LPARAM,d)
-Fd(DWORD,DefHookProc,short,a,WORD,b,DWORD,c,HHOOK FAR*,d)
-Fd(HDC,CreateDC,LPSTR,a,LPSTR,b,LPSTR,c,LPSTR,d)
-Fd(HDC,CreateIC,LPSTR,a,LPSTR,b,LPSTR,c,LPSTR,d)
-Fd(HHOOK,SetWindowsHookEx,short,a,HOOKPROC,b,HINSTANCE,c,HTASK,d)
-Fd(HRGN,CreateEllipticRgn,short,a,short,b,short,c,short,d)
-Fd(HRGN,CreatePolyPolygonRgn,LPPOINT,a,LPINT,b,short,c,short,d)
-Fd(HRGN,CreateRectRgn,short,a,short,b,short,c,short,d)
-Fd(HWND,CreateDialog,HANDLE,a,SEGPTR,b,HWND,c,WNDPROC,d)
-Fd(HWND,CreateDialogIndirect,HANDLE,a,SEGPTR,b,HWND,c,WNDPROC,d)
-Fd(INT,GetTempFileName,BYTE,a,LPCSTR,b,UINT,c,LPSTR,d)
-Fd(LONG,DefDlgProc,HWND,a,WORD,b,WORD,c,LONG,d)
-Fd(LONG,DefMDIChildProc,HWND,a,WORD,b,WORD,c,LONG,d)
-Fd(LONG,DefWindowProc,HWND,a,WORD,b,WORD,c,LONG,d)
-Fd(LONG,SendMessage,HWND,a,WORD,b,WORD,c,LONG,d)
-Fd(WORD,GetDlgItemInt,HWND,a,WORD,b,BOOL FAR*,c,BOOL,d)
-Fd(WORD,GetPaletteEntries,HPALETTE,a,WORD,b,WORD,c,LPPALETTEENTRY,d)
-Fd(WORD,GetPrivateProfileInt,LPSTR,a,LPSTR,b,short,c,LPSTR,d)
-Fd(WORD,GetSystemPaletteEntries,HDC,a,WORD,b,WORD,c,LPPALETTEENTRY,d)
-Fd(WORD,SetPaletteEntries,HPALETTE,a,WORD,b,WORD,c,LPPALETTEENTRY,d)
-Fd(WORD,SetSystemTimer,HWND,a,WORD,d,WORD,b,FARPROC,c)
-Fd(WORD,SetTimer,HWND,a,WORD,d,WORD,b,FARPROC,c)
-Fd(int,CombineRgn,HRGN,a,HRGN,b,HRGN,c,short,d)
-Fd(int,DialogBox,HINSTANCE,a,SEGPTR,b,HWND,c,WNDPROC,d)
-Fd(int,DialogBoxIndirect,HANDLE,a,HANDLE,b,HWND,c,WNDPROC,d)
-Fd(int,EnumFonts,HDC,a,LPSTR,b,FARPROC,c,LPSTR,d)
-Fd(int,EnumObjects,HDC,a,int,b,FARPROC,c,LPSTR,d)
-Fd(int,GetDlgItemText,HWND,a,WORD,b,SEGPTR,c,WORD,d)
-Fd(int,LoadString,HANDLE,a,WORD,b,LPSTR,c,int,d)
-Fd(int,MessageBox,HWND,a,LPSTR,b,LPSTR,c,WORD,d)
-Fd(int,SetScrollPos,HWND,a,int,b,int,c,BOOL,d)
-Fd(int,SetVoiceNote,int,a,int,b,int,c,int,d)
-Fd(void,AdjustWindowRectEx,LPRECT,a,DWORD,b,BOOL,c,DWORD,d)
-Fd(void,AnimatePalette,HPALETTE,a,WORD,b,WORD,c,LPPALETTEENTRY,d)
-Fd(void,CheckRadioButton,HWND,a,WORD,b,WORD,c,WORD,d)
-Fd(void,CreateCaret,HWND,a,HBITMAP,b,short,c,short,d)
-Fd(void,FillWindow,HWND,a,HWND,b,HDC,c,HBRUSH,d)
-Fd(void,GetScrollRange,HWND,a,int,b,LPINT,c,LPINT,d)
-Fd(void,MapWindowPoints,HWND,a,HWND,b,LPPOINT,c,WORD,d)
-Fd(void,PlayMetaFileRecord,HDC,a,LPHANDLETABLE,b,LPMETARECORD,c,WORD,d)
-Fd(void,SetDlgItemInt,HWND,a,WORD,b,WORD,c,BOOL,d)
-Fd(void,SetInternalWindowPos,HWND,a,WORD,b,LPRECT,c,LPPOINT,d)
-Fe(BOOL,ChangeMenu,HMENU,a,WORD,b,LPSTR,c,WORD,d,WORD,e)
-Fe(BOOL,Ellipse,HDC,a,int,b,int,c,int,d,int,e)
-Fe(BOOL,ExtFloodFill,HDC,a,INT,b,INT,c,COLORREF,d,WORD,e)
-Fe(BOOL,FrameRgn,HDC,a,HRGN,b,HBRUSH,e,int,c,int,d)
-Fe(BOOL,InsertMenu,HMENU,a,WORD,b,WORD,c,WORD,d,LPSTR,e)
-Fe(BOOL,ModifyMenu,HMENU,a,WORD,b,WORD,c,WORD,d,LPSTR,e)
-Fe(BOOL,PeekMessage,LPMSG,a,HWND,b,WORD,c,WORD,d,WORD,e)
-Fe(BOOL,Rectangle,HDC,a,int,xLeft,int,yTop,int,xRight,int,yBottom)
-Fe(BOOL,SetMenuItemBitmaps,HMENU,a,WORD,b,WORD,c,HBITMAP,d,HBITMAP,e)
-Fe(BOOL,TextOut,HDC,a,short,b,short,c,LPSTR,d,short,e)
-Fe(DWORD,GetTabbedTextExtent,HDC,a,LPSTR,b,int,c,int,d,LPINT,e)
-Fe(DWORD,ScaleViewportExt,HDC,a,short,b,short,c,short,d,short,e)
-Fe(DWORD,ScaleWindowExt,HDC,a,short,b,short,c,short,d,short,e)
-Fe(HBITMAP,CreateBitmap,short,a,short,b,BYTE,c,BYTE,d,LPSTR,e)
-Fe(HWND,CreateDialogIndirectParam,HANDLE,a,SEGPTR,b,HWND,c,WNDPROC,d,LPARAM,e)
-Fe(HWND,CreateDialogParam,HANDLE,a,SEGPTR,b,HWND,c,WNDPROC,d,LPARAM,e)
-Fe(LONG,CallWindowProc,WNDPROC,a,HWND,b,WORD,c,WORD,d,LONG,e)
-Fe(LONG,DefFrameProc,HWND,a,HWND,b,WORD,c,WORD,d,LONG,e)
-Fe(LONG,SendDlgItemMessage,HWND,a,WORD,b,WORD,c,WORD,d,LONG,e)
-Fe(int,DialogBoxIndirectParam,HANDLE,a,HANDLE,b,HWND,c,WNDPROC,d,LONG,e)
-Fe(int,DialogBoxParam,HANDLE,a,SEGPTR,b,HWND,c,WNDPROC,d,LONG,e)
-Fe(int,DlgDirList,HWND,a,LPSTR,b,int,c,int,d,WORD,e)
-Fe(int,DlgDirListComboBox,HWND,a,SEGPTR,b,int,c,int,d,WORD,e)
-Fe(int,DrawText,HDC,a,LPSTR,str,int,c,LPRECT,d,WORD,flag)
-Fe(int,Escape,HDC,a,int,b,int,c,LPSTR,d,LPSTR,e)
-Fe(int,ExcludeClipRect,HDC,a,short,b,short,c,short,d,short,e)
-Fe(int,ExcludeVisRect,HDC,a,short,b,short,c,short,d,short,e)
-Fe(int,GetMenuString,HMENU,a,WORD,b,LPSTR,c,short,d,WORD,e)
-Fe(int,GetProfileString,LPSTR,a,LPSTR,b,LPSTR,c,LPSTR,d,int,e)
-Fe(int,IntersectClipRect,HDC,a,short,b,short,c,short,d,short,e)
-Fe(int,IntersectVisRect,HDC,a,short,b,short,c,short,d,short,e)
-Fe(int,SetVoiceAccent,int,a,int,b,int,c,int,d,int,e)
-Fe(int,ToAscii,WORD,wVirtKey,WORD,wScanCode,LPSTR,lpKeyState,LPVOID,lpChar,WORD,wFlags)
-Fe(void,PaintRect,HWND,a,HWND,b,HDC,c,HBRUSH,d,LPRECT,e)
-Fe(void,ScrollWindow,HWND,a,short,b,short,c,LPRECT,d,LPRECT,e)
-Fe(void,SetRect,LPRECT,a,short,b,short,c,short,d,short,e)
-Fe(void,SetRectRgn,HRGN,a,short,b,short,c,short,d,short,e)
-Fe(void,SetScrollRange,HWND,a,int,b,int,c,int,d,BOOL,e)
-Ff(BOOL,MoveWindow,HWND,a,short,b,short,c,short,d,short,e,BOOL,f)
-Ff(BOOL,PatBlt,HDC,a,short,b,short,c,short,d,short,e,DWORD,f)
-Ff(BOOL,ScaleViewportExtEx,HDC,a,short,b,short,c,short,d,short,e,LPSIZE,f)
-Ff(BOOL,ScaleWindowExtEx,HDC,a,short,b,short,c,short,d,short,e,LPSIZE,f)
-Ff(HBITMAP,CreateDIBitmap,HDC,a,LPBITMAPINFOHEADER,b,DWORD,c,LPSTR,d,LPBITMAPINFO,e,WORD,f)
-Ff(HRGN,CreateRoundRectRgn,short,a,short,b,short,c,short,d,short,e,short,f)
-Ff(short,GetPrivateProfileString,LPSTR,a,LPSTR,b,LPSTR,c,LPSTR,d,short,e,LPSTR,f)
-Ff(void,LineDDA,short,a,short,b,short,c,short,d,FARPROC,e,long,f)
-Fg(BOOL,RoundRect,HDC,a,short,b,short,c,short,d,short,e,short,f,short,g)
-Fg(BOOL,ScrollDC,HDC,a,short,b,short,c,LPRECT,d,LPRECT,e,HRGN,f,LPRECT,g)
-Fg(BOOL,SetWindowPos,HWND,a,HWND,b,short,c,short,d,short,e,short,f,WORD,g)
-Fg(BOOL,TrackPopupMenu,HMENU,a,WORD,b,short,c,short,d,short,e,HWND,f,LPRECT,g)
-Fg(HCURSOR,CreateCursor,HANDLE,a,short,b,short,c,short,d,short,e,LPSTR,f,LPSTR,g)
-Fg(HICON,CreateIcon,HANDLE,a,int,b,int,c,BYTE,d,BYTE,e,LPSTR,f,LPSTR,g)
-Fg(int,GetDIBits,HDC,a,HANDLE,a2,WORD,b,WORD,c,LPSTR,d,LPBITMAPINFO,e,WORD,f)
-Fg(int,SetDIBits,HDC,a,HANDLE,a2,WORD,b,WORD,c,LPSTR,d,LPBITMAPINFO,e,WORD,f)
-Fh(BOOL,ExtTextOut,HDC,a,short,b,short,c,WORD,d,LPRECT,e,LPSTR,f,WORD,g,LPINT,h)
-Fh(HDWP,DeferWindowPos,HDWP,hWinPosInfo,HWND,hWnd,HWND,hWndInsertAfter,INT,x,INT,y,INT,cx,INT,cy,WORD,wFlags)
-Fh(LONG,TabbedTextOut,HDC,a,short,b,short,c,LPSTR,d,short,e,short,f,LPINT,g,short,h)
-Fh(int,ScrollWindowEx,HWND,a,short,b,short,c,LPRECT,d,LPRECT,e,HRGN,f,LPRECT,g,WORD,h)
-Fi(BOOL,Arc,HDC,a,int,xLeft,int,yTop,int,xRight,int,yBottom,int,xStart,int,yStart,int,xEnd,int,yEnd)
-Fi(BOOL,BitBlt,HDC,a,short,b,short,c,short,d,short,e,HDC,f,short,g,short,h,DWORD,i)
-Fi(BOOL,Chord,HDC,a,int,xLeft,int,yTop,int,xRight,int,yBottom,int,xStart,int,yStart,int,xEnd,int,yEnd)
-Fi(BOOL,GrayString,HDC,a,HBRUSH,b,FARPROC,gsprc,LPARAM,lParam,INT,cch,INT,x,INT,y,INT,cx,INT,cy)
-Fi(BOOL,Pie,HDC,a,int,xLeft,int,yTop,int,xRight,int,yBottom,int,xStart,int,yStart,int,xEnd,int,yEnd)
-Fk(BOOL,StretchBlt,HDC,a,short,b,short,c,short,d,short,e,HDC,f,short,g,short,h,short,i,short,j,DWORD,k)
-Fk(HWND,CreateWindow,SEGPTR,a,SEGPTR,b,DWORD,c,short,d,short,e,short,f,short,g,HWND,h,HMENU,i,HANDLE,j,SEGPTR,k)
-Fl(HWND,CreateWindowEx,DWORD,a,SEGPTR,b,SEGPTR,c,DWORD,d,short,e,short,f,short,g,short,h,HWND,i,HMENU,j,HANDLE,k,SEGPTR,l)
-Fl(int,SetDIBitsToDevice,HDC,a,short,b,short,c,WORD,d,WORD,e,WORD,f,WORD,g,WORD,h,WORD,i,LPSTR,j,LPBITMAPINFO,k,WORD,l)
-Fm(int,StretchDIBits,HDC,a,WORD,b,WORD,c,WORD,d,WORD,e,WORD,f,WORD,g,WORD,h,WORD,i,LPSTR,j,LPBITMAPINFO,k,WORD,l,DWORD,m)
-Fn(HFONT,CreateFont,int,a,int,b,int,c,int,d,int,e,BYTE,f,BYTE,g,BYTE,h,BYTE,i,BYTE,j,BYTE,k,BYTE,l,BYTE,m,LPSTR,n)
+ATOM AddAtom(SEGPTR);
+ATOM DeleteAtom(ATOM);
+ATOM FindAtom(SEGPTR);
+ATOM GlobalAddAtom(SEGPTR);
+ATOM GlobalDeleteAtom(ATOM);
+ATOM GlobalFindAtom(SEGPTR);
+ATOM RegisterClass(LPWNDCLASS);
+BOOL AnyPopup(void);
+BOOL AppendMenu(HMENU,WORD,WORD,LPSTR);
+BOOL Arc(HDC,int,int,int,int,int,int,int,int);
+BOOL BitBlt(HDC,short,short,short,short,HDC,short,short,DWORD);
+BOOL BringWindowToTop(HWND);
+BOOL CallMsgFilter(SEGPTR,short);
+BOOL ChangeClipboardChain(HWND,HWND);
+BOOL ChangeMenu(HMENU,WORD,LPSTR,WORD,WORD);
+BOOL CheckMenuItem(HMENU,WORD,WORD);
+BOOL Chord(HDC,int,int,int,int,int,int,int,int);
+BOOL CloseClipboard(void);
+BOOL DPtoLP(HDC,LPPOINT,int);
+BOOL DeleteDC(HDC);
+BOOL DeleteMenu(HMENU,WORD,WORD);
+BOOL DeleteMetaFile(HMETAFILE);
+BOOL DeleteObject(HANDLE);
+BOOL DestroyCursor(HCURSOR);
+BOOL DestroyIcon(HICON);
+BOOL DestroyMenu(HMENU);
+BOOL DestroyWindow(HWND);
+BOOL DlgDirSelect(HWND,LPSTR,int);
+BOOL DlgDirSelectComboBox(HWND,LPSTR,int);
+BOOL DrawIcon(HDC,short,short,HICON);
+BOOL Ellipse(HDC,int,int,int,int);
+BOOL EmptyClipboard(void);
+BOOL EnableHardwareInput(BOOL);
+BOOL EnableMenuItem(HMENU,WORD,WORD);
+BOOL EnableScrollBar(HWND,INT,UINT);
+BOOL EnableWindow(HWND,BOOL);
+BOOL EndDeferWindowPos(HDWP);
+BOOL EnumChildWindows(HWND,FARPROC,LONG);
+BOOL EnumMetaFile(HDC,LOCALHANDLE,FARPROC,BYTE*);
+BOOL EnumTaskWindows(HANDLE,FARPROC,LONG);
+BOOL EnumWindows(FARPROC,LONG);
+BOOL EqualRect(LPRECT,LPRECT);
+BOOL EqualRgn(HRGN,HRGN);
+BOOL ExitWindows(DWORD,WORD);
+BOOL ExtFloodFill(HDC,INT,INT,COLORREF,WORD);
+BOOL ExtTextOut(HDC,short,short,WORD,LPRECT,LPSTR,WORD,LPINT);
+BOOL FillRgn(HDC,HRGN,HBRUSH);
+BOOL FlashWindow(HWND,BOOL);
+BOOL FloodFill(HDC,INT,INT,COLORREF);
+BOOL FrameRgn(HDC,HRGN,HBRUSH,int,int);
+BOOL FreeModule(HANDLE);
+BOOL FreeResource(HANDLE);
+BOOL GetBitmapDimensionEx(HBITMAP,LPSIZE);
+BOOL GetBrushOrgEx(HDC,LPPOINT);
+BOOL GetCharWidth(HDC,WORD,WORD,LPINT);
+BOOL GetClassInfo(HANDLE,SEGPTR,LPWNDCLASS);
+BOOL GetCurrentPositionEx(HDC,LPPOINT);
+BOOL GetInputState(void);
+BOOL GetMessage(SEGPTR,HWND,UINT,UINT);
+BOOL GetTextExtentPoint(HDC,LPSTR,short,LPSIZE);
+BOOL GetTextMetrics(HDC,LPTEXTMETRIC);
+BOOL GetUpdateRect(HWND,LPRECT,BOOL);
+BOOL GetViewportExtEx(HDC,LPPOINT);
+BOOL GetViewportOrgEx(HDC,LPPOINT);
+BOOL GetWinDebugInfo(LPWINDEBUGINFO,UINT);
+BOOL GetWindowExtEx(HDC,LPPOINT);
+BOOL GetWindowOrgEx(HDC,LPPOINT);
+BOOL GetWindowPlacement(HWND,LPWINDOWPLACEMENT);
+BOOL GlobalUnWire(HGLOBAL);
+BOOL GlobalUnlock(HGLOBAL);
+BOOL GrayString(HDC,HBRUSH,FARPROC,LPARAM,INT,INT,INT,INT,INT);
+BOOL HiliteMenuItem(HWND,HMENU,WORD,WORD);
+BOOL InSendMessage(void);
+BOOL InsertMenu(HMENU,WORD,WORD,WORD,LPSTR);
+BOOL IntersectRect(LPRECT,LPRECT,LPRECT);
+BOOL InvertRgn(HDC,HRGN);
+BOOL IsBadCodePtr(SEGPTR);
+BOOL IsBadHugeReadPtr(SEGPTR,DWORD);
+BOOL IsBadHugeWritePtr(SEGPTR,DWORD);
+BOOL IsBadReadPtr(SEGPTR,WORD);
+BOOL IsBadStringPtr(SEGPTR,WORD);
+BOOL IsBadWritePtr(SEGPTR,WORD);
+BOOL IsCharAlpha(char);
+BOOL IsCharAlphaNumeric(char);
+BOOL IsCharLower(char);
+BOOL IsCharUpper(char);
+BOOL IsChild(HWND,HWND);
+BOOL IsClipboardFormatAvailable(WORD);
+BOOL IsDialogMessage(HWND,LPMSG);
+BOOL IsIconic(HWND);
+BOOL IsRectEmpty(LPRECT);
+BOOL IsTwoByteCharPrefix(char);
+BOOL IsWindow(HWND);
+BOOL IsWindowEnabled(HWND);
+BOOL IsWindowVisible(HWND);
+BOOL IsZoomed(HWND);
+BOOL KillSystemTimer(HWND,WORD);
+BOOL KillTimer(HWND,WORD);
+BOOL LPtoDP(HDC,LPPOINT,int);
+BOOL LineTo(HDC,short,short);
+BOOL LocalInit(HANDLE,WORD,WORD);
+BOOL LocalUnlock(HANDLE);
+BOOL ModifyMenu(HMENU,WORD,WORD,WORD,LPSTR);
+BOOL MoveToEx(HDC,short,short,LPPOINT);
+BOOL MoveWindow(HWND,short,short,short,short,BOOL);
+BOOL OemToAnsi(LPSTR,LPSTR);
+BOOL OffsetViewportOrgEx(HDC,short,short,LPPOINT);
+BOOL OffsetWindowOrgEx(HDC,short,short,LPPOINT);
+BOOL OpenClipboard(HWND);
+BOOL OpenIcon(HWND);
+BOOL PaintRgn(HDC,HRGN);
+BOOL PatBlt(HDC,short,short,short,short,DWORD);
+BOOL PeekMessage(LPMSG,HWND,WORD,WORD,WORD);
+BOOL Pie(HDC,int,int,int,int,int,int,int,int);
+BOOL PlayMetaFile(HDC,HANDLE);
+BOOL PolyPolygon(HDC,LPPOINT,LPINT,WORD);
+BOOL Polygon(HDC,LPPOINT,int);
+BOOL Polyline(HDC,LPPOINT,int);
+BOOL PostAppMessage(HANDLE,WORD,WORD,LONG);
+BOOL PostMessage(HWND,WORD,WORD,LONG);
+BOOL PtInRect(LPRECT,POINT);
+BOOL PtInRegion(HRGN,short,short);
+BOOL PtVisible(HDC,short,short);
+BOOL RectInRegion(HRGN,LPRECT);
+BOOL RectVisible(HDC,LPRECT);
+BOOL Rectangle(HDC,int,int,int,int);
+BOOL RedrawWindow(HWND,LPRECT,HRGN,UINT);
+BOOL RemoveFontResource(LPSTR);
+BOOL RemoveMenu(HMENU,WORD,WORD);
+BOOL ResizePalette(HPALETTE,WORD);
+BOOL RestoreDC(HDC,short);
+BOOL RoundRect(HDC,short,short,short,short,short,short);
+BOOL ScaleViewportExtEx(HDC,short,short,short,short,LPSIZE);
+BOOL ScaleWindowExtEx(HDC,short,short,short,short,LPSIZE);
+BOOL ScrollDC(HDC,short,short,LPRECT,LPRECT,HRGN,LPRECT);
+BOOL SetBitmapDimensionEx(HBITMAP,short,short,LPSIZE);
+BOOL SetConvertParams(int,int);
+BOOL SetDeskPattern(void);
+BOOL SetDeskWallPaper(LPSTR);
+BOOL SetErrorMode(WORD);
+BOOL SetMenu(HWND,HMENU);
+BOOL SetMenuItemBitmaps(HMENU,WORD,WORD,HBITMAP,HBITMAP);
+BOOL SetMessageQueue(int);
+BOOL SetProp(HWND,SEGPTR,HANDLE);
+BOOL SetViewportExtEx(HDC,short,short,LPSIZE);
+BOOL SetViewportOrgEx(HDC,short,short,LPPOINT);
+BOOL SetWinDebugInfo(LPWINDEBUGINFO);
+BOOL SetWindowExtEx(HDC,short,short,LPSIZE);
+BOOL SetWindowOrgEx(HDC,short,short,LPPOINT);
+BOOL SetWindowPlacement(HWND,LPWINDOWPLACEMENT);
+BOOL SetWindowPos(HWND,HWND,short,short,short,short,WORD);
+BOOL ShowWindow(HWND,int);
+BOOL StretchBlt(HDC,short,short,short,short,HDC,short,short,short,short,DWORD);
+BOOL SubtractRect(LPRECT,LPRECT,LPRECT);
+BOOL SwapMouseButton(BOOL);
+BOOL TextOut(HDC,short,short,LPSTR,short);
+BOOL TrackPopupMenu(HMENU,WORD,short,short,short,HWND,LPRECT);
+BOOL TranslateMDISysAccel(HWND,LPMSG);
+BOOL TranslateMessage(LPMSG);
+BOOL UnhookWindowsHook(short,FARPROC);
+BOOL UnhookWindowsHookEx(HHOOK);
+BOOL UnionRect(LPRECT,LPRECT,LPRECT);
+BOOL UnrealizeObject(HBRUSH);
+BOOL UnregisterClass(SEGPTR,HANDLE);
+BOOL WinHelp(HWND,LPSTR,WORD,DWORD);
+BOOL WritePrivateProfileString(LPSTR,LPSTR,LPSTR,LPSTR);
+BOOL WriteProfileString(LPSTR,LPSTR,LPSTR);
+BYTE GetTempDrive(BYTE);
+COLORREF GetBkColor(HDC);
+COLORREF GetSysColor(short);
+COLORREF GetTextColor(HDC);
+COLORREF SetPixel(HDC,short,short,COLORREF);
+DWORD CallNextHookEx(HHOOK,short,WPARAM,LPARAM);
+DWORD DefHookProc(short,WORD,DWORD,HHOOK*);
+DWORD GetAspectRatioFilter(HDC);
+DWORD GetBitmapDimension(HBITMAP);
+DWORD GetBrushOrg(HDC);
+DWORD GetCurrentPosition(HDC);
+DWORD GetCurrentTime(void);
+DWORD GetDCOrg(HDC);
+DWORD GetDialogBaseUnits(void);
+DWORD GetFreeSpace(WORD);
+DWORD GetHeapSpaces(HMODULE);
+DWORD GetMenuCheckMarkDimensions(void);
+DWORD GetMessagePos(void);
+DWORD GetNearestColor(HDC,DWORD);
+DWORD GetPixel(HDC,short,short);
+DWORD GetSelectorBase(WORD);
+DWORD GetSelectorLimit(WORD);
+DWORD GetTabbedTextExtent(HDC,LPSTR,int,int,LPINT);
+DWORD GetTextExtent(HDC,LPSTR,short);
+DWORD GetTickCount(void);
+DWORD GetViewportExt(HDC);
+DWORD GetViewportOrg(HDC);
+DWORD GetWindowExt(HDC);
+DWORD GetWindowOrg(HDC);
+DWORD GlobalCompact(DWORD);
+DWORD GlobalDOSAlloc(DWORD);
+DWORD GlobalHandle(WORD);
+DWORD GlobalSize(HGLOBAL);
+DWORD MoveTo(HDC,short,short);
+DWORD OemKeyScan(WORD);
+DWORD OffsetViewportOrg(HDC,short,short);
+DWORD OffsetWindowOrg(HDC,short,short);
+DWORD ScaleViewportExt(HDC,short,short,short,short);
+DWORD ScaleWindowExt(HDC,short,short,short,short);
+DWORD SetBitmapDimension(HBITMAP,short,short);
+DWORD SetBkColor(HDC,COLORREF);
+DWORD SetBrushOrg(HDC,short,short);
+DWORD SetMapperFlags(HDC,DWORD);
+DWORD SetTextColor(HDC,DWORD);
+DWORD SetViewportExt(HDC,short,short);
+DWORD SetViewportOrg(HDC,short,short);
+DWORD SetWindowExt(HDC,short,short);
+DWORD SetWindowOrg(HDC,short,short);
+DWORD SizeofResource(HANDLE,HRSRC);
+FARPROC GetProcAddress(HANDLE,SEGPTR);
+FARPROC LocalNotify(FARPROC);
+FARPROC MakeProcInstance(FARPROC,HANDLE);
+FARPROC SetResourceHandler(HANDLE,LPSTR,FARPROC);
+FARPROC SetWindowsHook(short,FARPROC);
+HANDLE CopyMetaFile(HANDLE,LPSTR);
+HANDLE CreateCursorIconIndirect(HANDLE,CURSORICONINFO*,LPSTR,LPSTR);
+HANDLE CreateMetaFile(LPSTR);
+HANDLE DirectResAlloc(HANDLE,WORD,WORD);
+HANDLE FindResource(HANDLE,SEGPTR,SEGPTR);
+HANDLE GetAtomHandle(ATOM);
+HANDLE GetClipboardData(WORD);
+HANDLE GetCodeHandle(FARPROC);
+HANDLE GetCurrentPDB(void);
+HANDLE GetCurrentTask(void);
+HANDLE GetMetaFile(LPSTR);
+HANDLE GetMetaFileBits(HANDLE);
+HANDLE GetModuleHandle(LPCSTR);
+HANDLE GetProp(HWND,SEGPTR);
+HANDLE GetStockObject(int);
+HANDLE GetWindowTask(HWND);
+HANDLE LoadAccelerators(HANDLE,SEGPTR);
+HANDLE LoadLibrary(LPCSTR);
+HANDLE LoadModule(LPCSTR,LPVOID);
+HANDLE LoadResource(HANDLE,HANDLE);
+HANDLE LocalAlloc(WORD,WORD);
+HANDLE LocalFree(HANDLE);
+HANDLE LocalHandle(WORD);
+HANDLE LocalReAlloc(HANDLE,WORD,WORD);
+HANDLE RemoveProp(HWND,SEGPTR);
+HANDLE SelectObject(HDC,HANDLE);
+HANDLE SetClipboardData(WORD,HANDLE);
+HANDLE SetMetaFileBits(HANDLE);
+HANDLE WinExec(LPSTR,WORD);
+HBITMAP CreateBitmap(short,short,BYTE,BYTE,LPSTR);
+HBITMAP CreateBitmapIndirect(BITMAP*);
+HBITMAP CreateCompatibleBitmap(HDC,short,short);
+HBITMAP CreateDIBitmap(HDC,LPBITMAPINFOHEADER,DWORD,LPSTR,LPBITMAPINFO,WORD);
+HBITMAP CreateDiscardableBitmap(HDC,short,short);
+HBITMAP LoadBitmap(HANDLE,SEGPTR);
+HBRUSH CreateBrushIndirect(LOGBRUSH*);
+HBRUSH CreateDIBPatternBrush(HANDLE,WORD);
+HBRUSH CreateHatchBrush(short,COLORREF);
+HBRUSH CreatePatternBrush(HBITMAP);
+HBRUSH CreateSolidBrush(DWORD);
+HBRUSH GetControlBrush(HWND,HDC,WORD);
+HCURSOR CreateCursor(HANDLE,INT,INT,INT,INT,LPSTR,LPSTR);
+HCURSOR GetCursor(void);
+HCURSOR LoadCursor(HANDLE,SEGPTR);
+HCURSOR SetCursor(HCURSOR);
+HDC BeginPaint(HWND,LPPAINTSTRUCT);
+HDC CreateCompatibleDC(HDC);
+HDC CreateDC(LPSTR,LPSTR,LPSTR,LPSTR);
+HDC CreateIC(LPSTR,LPSTR,LPSTR,LPSTR);
+HDC GetDC(HWND);
+HDC GetDCEx(HWND,HRGN,DWORD);
+HDC GetDCState(HDC);
+HDC GetWindowDC(HWND);
+HDWP BeginDeferWindowPos(INT);
+HDWP DeferWindowPos(HDWP,HWND,HWND,INT,INT,INT,INT,WORD);
+HFONT CreateFont(int,int,int,int,int,BYTE,BYTE,BYTE,BYTE,BYTE,BYTE,BYTE,BYTE,LPSTR);
+HFONT CreateFontIndirect(LOGFONT*);
+HGLOBAL AllocResource(HINSTANCE,HRSRC,DWORD);
+HGLOBAL GetTaskQueue(HTASK);
+HGLOBAL GlobalAlloc(WORD,DWORD);
+HGLOBAL GlobalFree(HGLOBAL);
+HGLOBAL GlobalLRUNewest(HGLOBAL);
+HGLOBAL GlobalLRUOldest(HGLOBAL);
+HGLOBAL GlobalReAlloc(HGLOBAL,DWORD,WORD);
+HGLOBAL LockSegment(HGLOBAL);
+HGLOBAL SetTaskQueue(HTASK,HGLOBAL);
+HHOOK SetWindowsHookEx(short,HOOKPROC,HINSTANCE,HTASK);
+HICON CreateIcon(HANDLE,INT,INT,BYTE,BYTE,LPSTR,LPSTR);
+HICON LoadIcon(HANDLE,SEGPTR);
+HINSTANCE GetTaskDS(void);
+HMENU CreateMenu(void);
+HMENU CreatePopupMenu(void);
+HMENU GetMenu(HWND);
+HMENU GetSubMenu(HMENU,short);
+HMENU GetSystemMenu(HWND,BOOL);
+HMENU LoadMenu(HANDLE,SEGPTR);
+HMENU LoadMenuIndirect(LPSTR);
+HMENU LookupMenuHandle(HMENU,INT);
+HMETAFILE CloseMetaFile(HANDLE);
+HMODULE GetExePtr(HANDLE);
+HPALETTE CreatePalette(LPLOGPALETTE);
+HPALETTE GDISelectPalette(HDC,HPALETTE);
+HPALETTE SelectPalette(HDC,HPALETTE,BOOL);
+HPEN CreatePen(short,short,COLORREF);
+HPEN CreatePenIndirect(LOGPEN*);
+HRGN CreateEllipticRgn(short,short,short,short);
+HRGN CreateEllipticRgnIndirect(LPRECT);
+HRGN CreatePolyPolygonRgn(LPPOINT,LPINT,short,short);
+HRGN CreatePolygonRgn(LPPOINT,short,short);
+HRGN CreateRectRgn(short,short,short,short);
+HRGN CreateRectRgnIndirect(LPRECT);
+HRGN CreateRoundRectRgn(short,short,short,short,short,short);
+HRGN GetClipRgn(HDC);
+HRGN InquireVisRgn(HDC);
+HRGN SaveVisRgn(HDC);
+HWND ChildWindowFromPoint(HWND,POINT);
+HWND CreateDialog(HANDLE,SEGPTR,HWND,WNDPROC);
+HWND CreateDialogIndirect(HANDLE,SEGPTR,HWND,WNDPROC);
+HWND CreateDialogIndirectParam(HANDLE,SEGPTR,HWND,WNDPROC,LPARAM);
+HWND CreateDialogParam(HANDLE,SEGPTR,HWND,WNDPROC,LPARAM);
+HWND CreateWindow(SEGPTR,SEGPTR,DWORD,INT,INT,INT,INT,HWND,HMENU,HINSTANCE,SEGPTR);
+HWND CreateWindowEx(DWORD,SEGPTR,SEGPTR,DWORD,INT,INT,INT,INT,HWND,HMENU,HINSTANCE,SEGPTR);
+HWND FindWindow(SEGPTR,LPSTR);
+HWND GetActiveWindow(void);
+HWND GetCapture(void);
+HWND GetClipboardOwner(void);
+HWND GetClipboardViewer(void);
+HWND GetDesktopHwnd(void);
+HWND GetDesktopWindow(void);
+HWND GetDlgItem(HWND,WORD);
+HWND GetFocus(void);
+HWND GetLastActivePopup(HWND);
+HWND GetNextDlgGroupItem(HWND,HWND,BOOL);
+HWND GetNextDlgTabItem(HWND,HWND,BOOL);
+HWND GetNextWindow(HWND,WORD);
+HWND GetOpenClipboardWindow(void);
+HWND GetParent(HWND);
+HWND GetSysModalWindow(void);
+HWND GetTopWindow(HWND);
+HWND GetWindow(HWND,WORD);
+HWND SetActiveWindow(HWND);
+HWND SetCapture(HWND);
+HWND SetClipboardViewer(HWND);
+HWND SetFocus(HWND);
+HWND SetParent(HWND,HWND);
+HWND SetSysModalWindow(HWND);
+HWND WindowFromPoint(POINT);
+INT AccessResource(HINSTANCE,HRSRC);
+INT AddFontResource(LPCSTR);
+INT AnsiToOem(LPSTR,LPSTR);
+INT GetTempFileName(BYTE,LPCSTR,UINT,LPSTR);
+INT GetTextFace(HDC,INT,LPSTR);
+INT OpenFile(LPCSTR,LPOFSTRUCT,UINT);
+INT _lclose(INT);
+INT _lcreat(LPSTR,INT);
+INT _lopen(LPSTR,INT);
+INT _lread(INT,LPSTR,WORD);
+INT _lwrite(INT,LPCSTR,WORD);
+INT lstrcmp(LPCSTR,LPCSTR);
+INT lstrcmpi(LPCSTR,LPCSTR);
+INT lstrlen(LPCSTR);
+LONG CallWindowProc(WNDPROC,HWND,UINT,WPARAM,LPARAM);
+LONG DefDlgProc(HWND,UINT,WPARAM,LPARAM);
+LONG DefFrameProc(HWND,HWND,UINT,WPARAM,LPARAM);
+LONG DefMDIChildProc(HWND,UINT,WPARAM,LPARAM);
+LONG DispatchMessage(LPMSG);
+LONG EscapeCommFunction(int,int);
+LONG GetBitmapBits(HBITMAP,LONG,LPSTR);
+LONG GetClassLong(HWND,short);
+LONG GetMessageExtraInfo(void);
+LONG GetMessageTime(void);
+LONG GetVersion(void);
+LONG GetWinFlags(void);
+LONG GetWindowLong(HWND,short);
+LONG SendDlgItemMessage(HWND,INT,UINT,WPARAM,LPARAM);
+LONG SetBitmapBits(HBITMAP,LONG,LPSTR);
+LONG SetClassLong(HWND,short,LONG);
+LONG SetSwapAreaSize(WORD);
+LONG SetWindowLong(HWND,short,LONG);
+LONG TabbedTextOut(HDC,short,short,LPSTR,short,short,LPINT,short);
+LONG _hread(INT,LPSTR,LONG);
+LONG _hwrite(INT,LPCSTR,LONG);
+LONG _llseek(INT,LONG,INT);
+LPINT GetThresholdEvent(void);
+LPSTR AnsiLower(LPSTR);
+LPSTR AnsiUpper(LPSTR);
+LPSTR LockResource(HANDLE);
+LPSTR ValidateFreeSpaces(void);
+LPVOID GlobalLock(HGLOBAL);
+LRESULT DefWindowProc(HWND,UINT,WPARAM,LPARAM);
+LRESULT SendMessage(HWND,UINT,WPARAM,LPARAM);
+NPVOID LocalLock(HLOCAL);
+SEGPTR AnsiNext(SEGPTR);
+SEGPTR AnsiPrev(SEGPTR,SEGPTR);
+SEGPTR GetDOSEnvironment(void);
+SEGPTR GlobalWire(HGLOBAL);
+SEGPTR WIN16_GlobalLock(HGLOBAL);
+SEGPTR WIN16_LockResource(HANDLE);
+SEGPTR lstrcat(SEGPTR,SEGPTR);
+SEGPTR lstrcpy(SEGPTR,SEGPTR);
+SEGPTR lstrcpyn(SEGPTR,SEGPTR,WORD);
+UINT AnsiLowerBuff(LPSTR,UINT);
+UINT AnsiUpperBuff(LPSTR,UINT);
+UINT GDIRealizePalette(HDC);
+UINT RealizePalette(HDC);
+WORD AllocCStoDSAlias(WORD);
+WORD AllocDStoCSAlias(WORD);
+WORD AllocSelector(WORD);
+WORD AllocSelectorArray(WORD);
+WORD ArrangeIconicWindows(HWND);
+WORD ChangeSelector(WORD,WORD);
+WORD EnumClipboardFormats(WORD);
+WORD FarGetOwner(HANDLE);
+WORD FreeSelector(WORD);
+WORD GetAtomName(ATOM,LPSTR,short);
+WORD GetBkMode(HDC);
+WORD GetCaretBlinkTime(void);
+WORD GetClassWord(HWND,short);
+WORD GetCommEventMask(int,int);
+WORD GetDlgItemInt(HWND,WORD,BOOL*,BOOL);
+WORD GetDoubleClickTime(void);
+WORD GetDriveType(INT);
+WORD GetInternalWindowPos(HWND,LPRECT,LPPOINT);
+WORD GetMapMode(HDC);
+WORD GetMenuItemCount(HMENU);
+WORD GetMenuItemID(HMENU,int);
+WORD GetMenuState(HMENU,WORD,WORD);
+WORD GetNearestPaletteIndex(HPALETTE,DWORD);
+WORD GetNumTasks(void);
+WORD GetPaletteEntries(HPALETTE,WORD,WORD,LPPALETTEENTRY);
+WORD GetPolyFillMode(HDC);
+WORD GetPrivateProfileInt(LPSTR,LPSTR,short,LPSTR);
+WORD GetProfileInt(LPSTR,LPSTR,int);
+WORD GetROP2(HDC);
+WORD GetRelAbs(HDC);
+WORD GetStretchBltMode(HDC);
+WORD GetSystemDirectory(LPSTR,WORD);
+WORD GetSystemPaletteEntries(HDC,WORD,WORD,LPPALETTEENTRY);
+WORD GetSystemPaletteUse(HDC);
+WORD GetTextAlign(HDC);
+WORD GetWindowWord(HWND,short);
+WORD GetWindowsDirectory(LPSTR,WORD);
+WORD GlobalDOSFree(WORD);
+WORD GlobalFlags(HGLOBAL);
+WORD GlobalGetAtomName(ATOM,LPSTR,short);
+WORD GlobalPageLock(HGLOBAL);
+WORD GlobalPageUnlock(HGLOBAL);
+WORD InitAtomTable(WORD);
+WORD IsDlgButtonChecked(HWND,WORD);
+WORD LocalCompact(WORD);
+WORD LocalFlags(HLOCAL);
+WORD LocalShrink(HANDLE,WORD);
+WORD LocalSize(HLOCAL);
+WORD MapVirtualKey(WORD,WORD);
+WORD PrestoChangoSelector(WORD,WORD);
+WORD RealizeDefaultPalette(HDC);
+WORD RegisterClipboardFormat(LPCSTR);
+WORD RegisterWindowMessage(SEGPTR);
+WORD SelectorAccessRights(WORD,WORD,WORD);
+WORD SetBkMode(HDC,WORD);
+WORD SetClassWord(HWND,short,WORD);
+WORD SetHandleCount(WORD);
+WORD SetMapMode(HDC,WORD);
+WORD SetPaletteEntries(HPALETTE,WORD,WORD,LPPALETTEENTRY);
+WORD SetPolyFillMode(HDC,WORD);
+WORD SetROP2(HDC,WORD);
+WORD SetRelAbs(HDC,WORD);
+WORD SetSelectorBase(WORD,DWORD);
+WORD SetSelectorLimit(WORD,DWORD);
+WORD SetStretchBltMode(HDC,WORD);
+WORD SetSystemPaletteUse(HDC,WORD);
+WORD SetSystemTimer(HWND,WORD,WORD,FARPROC);
+WORD SetTextAlign(HDC,WORD);
+WORD SetTimer(HWND,WORD,WORD,FARPROC);
+WORD SetWindowWord(HWND,short,WORD);
+WORD VkKeyScan(WORD);
+WORD* SetCommEventMask(int,WORD);
+int BuildCommDCB(LPSTR,DCB*);
+int Catch(LPCATCHBUF);
+int ClearCommBreak(int);
+int CloseComm(int);
+int CombineRgn(HRGN,HRGN,HRGN,short);
+int ConvertRequest(HWND,LPKANJISTRUCT);
+int CountClipboardFormats(void);
+int CountVoiceNotes(int);
+int DialogBox(HINSTANCE,SEGPTR,HWND,WNDPROC);
+int DialogBoxIndirect(HANDLE,HANDLE,HWND,WNDPROC);
+int DialogBoxIndirectParam(HANDLE,HANDLE,HWND,WNDPROC,LONG);
+int DialogBoxParam(HANDLE,SEGPTR,HWND,WNDPROC,LONG);
+int DlgDirList(HWND,LPSTR,int,int,WORD);
+int DlgDirListComboBox(HWND,SEGPTR,int,int,WORD);
+int DrawText(HDC,LPSTR,int,LPRECT,WORD);
+int EnumFonts(HDC,LPSTR,FARPROC,LPSTR);
+int EnumObjects(HDC,int,FARPROC,LPSTR);
+int EnumProps(HWND,FARPROC);
+int Escape(HDC,int,int,LPSTR,LPSTR);
+int ExcludeClipRect(HDC,short,short,short,short);
+int ExcludeUpdateRgn(HDC,HWND);
+int ExcludeVisRect(HDC,short,short,short,short);
+int FillRect(HDC,LPRECT,HBRUSH);
+int FlushComm(int,int);
+int FrameRect(HDC,LPRECT,HBRUSH);
+int GetAsyncKeyState(int);
+int GetClassName(HWND,LPSTR,short);
+int GetClipBox(HDC,LPRECT);
+int GetClipboardFormatName(WORD,LPSTR,short);
+int GetCommError(int,COMSTAT*);
+int GetCommState(int,DCB*);
+int GetDIBits(HDC,HANDLE,WORD,WORD,LPSTR,LPBITMAPINFO,WORD);
+int GetDeviceCaps(HDC,WORD);
+int GetDlgCtrlID(HWND);
+int GetDlgItemText(HWND,WORD,SEGPTR,WORD);
+int GetEnvironment(LPSTR,LPSTR,WORD);
+int GetInstanceData(HANDLE,WORD,int);
+int GetKBCodePage(void);
+int GetKeyNameText(LONG,LPSTR,int);
+int GetKeyState(int);
+int GetKeyboardType(int);
+int GetMenuString(HMENU,WORD,LPSTR,short,WORD);
+int GetModuleFileName(HANDLE,LPSTR,short);
+int GetModuleUsage(HANDLE);
+int GetObject(HANDLE,int,LPSTR);
+int GetPriorityClipboardFormat(WORD*,short);
+int GetProfileString(LPSTR,LPSTR,LPSTR,LPSTR,int);
+int GetRgnBox(HRGN,LPRECT);
+int GetScrollPos(HWND,int);
+int GetSystemMetrics(WORD);
+int GetThresholdStatus(void);
+int GetUpdateRgn(HWND,HRGN,BOOL);
+int GetWindowText(HWND,LPSTR,int);
+int GetWindowTextLength(HWND);
+int IntersectClipRect(HDC,short,short,short,short);
+int IntersectVisRect(HDC,short,short,short,short);
+int LoadString(HANDLE,WORD,LPSTR,int);
+int MessageBox(HWND,LPSTR,LPSTR,WORD);
+int MulDiv(int,int,int);
+int OffsetClipRgn(HDC,short,short);
+int OffsetRgn(HRGN,short,short);
+int OpenComm(LPSTR,WORD,WORD);
+int OpenSound(void);
+int ProfInsChk(void);
+int ReadComm(int,LPSTR,int);
+int ReleaseDC(HWND,HDC);
+int RestoreVisRgn(HDC);
+int SaveDC(HDC);
+int ScrollWindowEx(HWND,short,short,LPRECT,LPRECT,HRGN,LPRECT,WORD);
+int SelectClipRgn(HDC,HRGN);
+int SelectVisRgn(HDC,HRGN);
+int SetCommBreak(int);
+int SetCommState(DCB*);
+int SetDIBits(HDC,HANDLE,WORD,WORD,LPSTR,LPBITMAPINFO,WORD);
+int SetDIBitsToDevice(HDC,short,short,WORD,WORD,WORD,WORD,WORD,WORD,LPSTR,LPBITMAPINFO,WORD);
+int SetEnvironment(LPSTR,LPSTR,WORD);
+int SetScrollPos(HWND,int,int,BOOL);
+int SetSoundNoise(int,int);
+int SetVoiceAccent(int,int,int,int,int);
+int SetVoiceEnvelope(int,int,int);
+int SetVoiceNote(int,int,int,int);
+int SetVoiceQueueSize(int,int);
+int SetVoiceSound(int,LONG,int);
+int SetVoiceThreshold(int,int);
+int ShowCursor(BOOL);
+int StartSound(void);
+int StopSound(void);
+int StretchDIBits(HDC,WORD,WORD,WORD,WORD,WORD,WORD,WORD,WORD,LPSTR,LPBITMAPINFO,WORD,DWORD);
+int SyncAllVoices(void);
+int Throw(LPCATCHBUF,int);
+int ToAscii(WORD,WORD,LPSTR,LPVOID,WORD);
+int TranslateAccelerator(HWND,HANDLE,LPMSG);
+int TransmitCommChar(int,char);
+int UngetCommChar(int,char);
+int UpdateColors(HDC);
+int WaitSoundState(int);
+int WriteComm(int,LPSTR,int);
+int wvsprintf(LPSTR,LPSTR,LPSTR);
+short GetPrivateProfileString(LPSTR,LPSTR,LPSTR,LPSTR,short,LPSTR);
+short GetTextCharacterExtra(HDC);
+short SetTextCharacterExtra(HDC,short);
+short SetTextJustification(HDC,short,short);
+void AdjustWindowRect(LPRECT,DWORD,BOOL);
+void AdjustWindowRectEx(LPRECT,DWORD,BOOL,DWORD);
+void AnimatePalette(HPALETTE,UINT,UINT,LPPALETTEENTRY);
+void AnsiToOemBuff(LPSTR,LPSTR,INT);
+void CheckDlgButton(HWND,WORD,WORD);
+void CheckRadioButton(HWND,WORD,WORD,WORD);
+void ClientToScreen(HWND,LPPOINT);
+void ClipCursor(LPRECT);
+void CloseSound(void);
+void CloseWindow(HWND);
+void CopyRect(LPRECT,LPRECT);
+void CreateCaret(HWND,HBITMAP,short,short);
+void DebugBreak(void);
+void DestroyCaret(void);
+void DirectedYield(HTASK);
+void DrawFocusRect(HDC,LPRECT);
+void DrawMenuBar(HWND);
+void EndDialog(HWND,short);
+void EndPaint(HWND,LPPAINTSTRUCT);
+void FarSetOwner(HANDLE,WORD);
+void FatalExit(int);
+void FillWindow(HWND,HWND,HDC,HBRUSH);
+void FreeLibrary(HANDLE);
+void FreeProcInstance(FARPROC);
+void GetCaretPos(LPPOINT);
+void GetClientRect(HWND,LPRECT);
+void GetCodeInfo(FARPROC,LPVOID);
+void GetCursorPos(LPPOINT);
+void GetKeyboardState(BYTE*);
+void GetScrollRange(HWND,int,LPINT,LPINT);
+void GetWindowRect(HWND,LPRECT);
+void GlobalFix(HGLOBAL);
+void GlobalFreeAll(HANDLE);
+void GlobalNotify(FARPROC);
+void GlobalUnfix(HGLOBAL);
+void HideCaret(HWND);
+void InflateRect(LPRECT,short,short);
+void InvalidateRect(HWND,LPRECT,BOOL);
+void InvalidateRgn(HWND,HRGN,BOOL);
+void InvertRect(HDC,LPRECT);
+void LimitEmsPages(DWORD);
+void LineDDA(short,short,short,short,FARPROC,long);
+void MapDialogRect(HWND,LPRECT);
+void MapWindowPoints(HWND,HWND,LPPOINT,WORD);
+void MessageBeep(WORD);
+void OemToAnsiBuff(LPSTR,LPSTR,INT);
+void OffsetRect(LPRECT,short,short);
+void OutputDebugString(LPSTR);
+void PaintRect(HWND,HWND,HDC,HBRUSH,LPRECT);
+void PlayMetaFileRecord(HDC,LPHANDLETABLE,LPMETARECORD,WORD);
+void PostQuitMessage(int);
+void ProfClear(void);
+void ProfFinish(void);
+void ProfFlush(void);
+void ProfSampRate(int,int);
+void ProfSetup(int,int);
+void ProfStart(void);
+void ProfStop(void);
+void ReleaseCapture(void);
+void ReplyMessage(LONG);
+void ScreenToClient(HWND,LPPOINT);
+void ScrollWindow(HWND,short,short,LPRECT,LPRECT);
+void SetCaretBlinkTime(WORD);
+void SetCaretPos(short,short);
+void SetConvertHook(BOOL);
+void SetCursorPos(short,short);
+void SetDCState(HDC,HDC);
+void SetDlgItemInt(HWND,WORD,WORD,BOOL);
+void SetDlgItemText(HWND,WORD,SEGPTR);
+void SetDoubleClickTime(WORD);
+void SetInternalWindowPos(HWND,WORD,LPRECT,LPPOINT);
+void SetKeyboardState(BYTE*);
+void SetRect(LPRECT,short,short,short,short);
+void SetRectEmpty(LPRECT);
+void SetRectRgn(HRGN,short,short,short,short);
+void SetScrollRange(HWND,int,int,int,BOOL);
+void SetSysColors(int,LPINT,COLORREF*);
+void SetWindowText(HWND,LPSTR);
+void ShowCaret(HWND);
+void ShowOwnedPopups(HWND,BOOL);
+void ShowScrollBar(HWND,WORD,BOOL);
+void SwapRecording(WORD);
+void SwitchStackBack(void);
+void SwitchStackTo(WORD,WORD,WORD);
+void UnlockSegment(HGLOBAL);
+void UpdateWindow(HWND);
+void ValidateCodeSegments(void);
+void ValidateRect(HWND,LPRECT);
+void ValidateRgn(HWND,HRGN);
+void WaitMessage(void);
+void Yield(void);
 
 #ifdef WINELIB
 #define WINELIB_UNIMP(x) fprintf (stderr, "WineLib: Unimplemented %s\n", x)
diff --git a/include/wine.h b/include/wine.h
index 5dee98a9b74..f6748e0b6be 100644
--- a/include/wine.h
+++ b/include/wine.h
@@ -7,7 +7,19 @@ extern char *WinIniFileName(void);
 #define WINE_INI WineIniFileName()
 #define WIN_INI WinIniFileName()
 
-#ifdef linux
+#ifdef i386
+extern int runtime_cpu (void);
+#else
+static inline int runtime_cpu(void) { return 3; }
+#endif
+
+
+#if defined ( linux) || defined(__svr4__)
+/*
+ * SVR4 NOTE:
+ * This is not correct but gets it through the compiler
+ * Must come back and look at this again
+ */
 struct sigcontext_struct {
 	unsigned short sc_gs, __gsh;
 	unsigned short sc_fs, __fsh;
@@ -32,8 +44,14 @@ struct sigcontext_struct {
 	unsigned long oldmask;
 	unsigned long cr2;
 };
+#ifdef linux
 #define WINE_DATA_SELECTOR 0x2b
 #define WINE_CODE_SELECTOR 0x23
+#endif
+#ifdef __svr4__
+#define WINE_DATA_SELECTOR 0x1f
+#define WINE_CODE_SELECTOR 0x17
+#endif
 #endif  /* linux */
 
 #ifdef __NetBSD__
diff --git a/include/winsock.h b/include/winsock.h
index 63e92bba84c..46471ac6205 100644
--- a/include/winsock.h
+++ b/include/winsock.h
@@ -64,6 +64,7 @@ typedef WSADATA FAR *LPWSADATA;
 
 #ifndef _SYS_SOCKET_H_
 #ifndef _sys_socket_h
+#ifndef _NET_TRANSPORT_SOCKET_H
 /*
  * Structure used by kernel to pass protocol
  * information in raw sockets.
@@ -74,10 +75,14 @@ struct sockproto {
 };
 #endif
 #endif
+#endif
 
 /*
  * Maximum queue length specifiable by listen.
  */
+#ifdef SOMAXCONN
+#undef SOMAXCONN
+#endif
 #define SOMAXCONN       5
 
 #ifndef MSG_DONTROUTE
diff --git a/include/wintypes.h b/include/wintypes.h
index 74e3feb4dfe..348af36c13b 100644
--- a/include/wintypes.h
+++ b/include/wintypes.h
@@ -1,17 +1,40 @@
 #ifndef __WINE_WINTYPES_H
 #define __WINE_WINTYPES_H
 
+#ifdef WINELIB
+# ifdef WINELIB16
+#  undef WINELIB32
+# else
+#  ifndef WINELIB32
+#   define WINELIB32
+#  endif
+# endif
+#endif
+
 typedef short	INT;
 typedef unsigned short UINT;
+#define UIFMT "%hu"
 typedef unsigned short WORD;
 typedef unsigned long DWORD;
 typedef unsigned short BOOL;
 typedef unsigned char BYTE;
 typedef long LONG;
+#ifdef WINELIB32
+typedef LONG WPARAM;
+#else
 typedef UINT WPARAM;
+#endif
 typedef LONG LPARAM;
 typedef LONG LRESULT;
+#ifdef WINELIB32
+typedef void* HANDLE;
+typedef void* NPVOID;
+#define NPFMT "%p"
+#else
 typedef WORD HANDLE;
+typedef WORD NPVOID;
+#define NPFMT "%04X"
+#endif
 typedef DWORD HHOOK;
 typedef DWORD SEGPTR;
 typedef char *LPSTR;
@@ -23,17 +46,8 @@ typedef WORD *LPWORD;
 typedef DWORD *LPDWORD;
 typedef LONG *LPLONG;
 typedef void *LPVOID;
-#ifdef WINELIB
-typedef long (*FARPROC)();
-typedef LONG (*WNDPROC)(WORD,WORD,WORD,LONG);
-#else
-typedef SEGPTR FARPROC;
-typedef SEGPTR WNDPROC;
-#endif
-typedef FARPROC DLGPROC;
 typedef WORD CATCHBUF[9];
 typedef WORD *LPCATCHBUF;
-typedef FARPROC HOOKPROC;
 
 #define DECLARE_HANDLE(a) typedef HANDLE a;
 
@@ -61,6 +75,16 @@ DECLARE_HANDLE(HTASK);
 DECLARE_HANDLE(HWND);
 DECLARE_HANDLE(LOCALHANDLE);
 
+#ifdef WINELIB
+typedef long (*FARPROC)();
+typedef LRESULT (*WNDPROC)(HWND,UINT,WPARAM,LPARAM);
+#else
+typedef SEGPTR FARPROC;
+typedef SEGPTR WNDPROC;
+#endif
+typedef FARPROC DLGPROC;
+typedef FARPROC HOOKPROC;
+
 #define TRUE 1
 #define FALSE 0
 #define CW_USEDEFAULT ((INT)0x8000)
diff --git a/ipc/Imakefile b/ipc/Imakefile
deleted file mode 100644
index e9e82a1f829..00000000000
--- a/ipc/Imakefile
+++ /dev/null
@@ -1,37 +0,0 @@
-#include "../Wine.tmpl"
-
-MODULE = ipc
-
-SRCS =    bit_array.c \
-          dde_proc.c  \
-          shm_main_blk.c \
-	  dde_atom.c  \
-          shm_semaph.c \
-	  dde_mem.c \
-          shm_block.c \
-          shm_fragment.c
-
-OBJS = $(SRCS:.c=.o)
-
-SHM_OBJ=shm_block.o shm_semaph.o shm_main_blk.o dde_proc.o \
-               	   dde_mem.o bit_array.o shm_fragment.o wine_test_stub.o
-
-
-WineRelocatableTarget($(MODULE),,$(OBJS))
-
-DependTarget()
-
-tests:: dde_mem_test dde_proc_test dde_atom_test shm_fragment_test \
-        shm_semaph_test
-
-NormalProgramTarget(bit_array_test, bit_array.o bit_array_test.o,,,)
-NormalProgramTarget(shm_semaph_test, shm_semaph_test.o shm_semaph.o,,,)
-NormalProgramTarget(shm_fragment_test, shm_fragment_test.o shm_fragment.o,,,)
-NormalProgramTarget(dde_atom_test, dde_atom_test.o dde_atom.o $(SHM_OBJ),,,)
-NormalProgramTarget(dde_mem_test, dde_mem_test.o $(SHM_OBJ),,,)
-NormalProgramTarget(dde_proc_test, dde_proc_test.o $(SHM_OBJ) ,,,)
-
-
-includes::
-
-install::
diff --git a/loader/Imakefile b/loader/Imakefile
deleted file mode 100644
index 848d1379162..00000000000
--- a/loader/Imakefile
+++ /dev/null
@@ -1,23 +0,0 @@
-#include "../Wine.tmpl"
-
-MODULE = loader
-
-SRCS = \
-	main.c \
-	module.c \
-	ne_image.c \
-	ne_resource.c \
-	pe_image.c \
-	pe_resource.c \
-	signal.c \
-	resource.c \
-	task.c 
-
-OBJS = $(SRCS:.c=.o)
-
-WineRelocatableTarget($(MODULE),,$(OBJS))
-DependTarget()
-
-includes::
-
-install::
diff --git a/loader/main.c b/loader/main.c
index 9bb0185188e..de7df1efb32 100644
--- a/loader/main.c
+++ b/loader/main.c
@@ -17,6 +17,7 @@ static char Copyright[] = "Copyright  Robert J. Amstadt, 1993";
 #include "comm.h"
 #include "user.h"
 #include "menu.h"
+#include "kernel32.h"
 #include "atom.h"
 #include "dialog.h"
 #include "message.h"
@@ -29,12 +30,15 @@ static char Copyright[] = "Copyright  Robert J. Amstadt, 1993";
 #include "miscemu.h"
 #include "neexe.h"
 #include "options.h"
+#include "spy.h"
 #include "task.h"
 #include "dce.h"
 #include "pe_image.h"
 #include "stddebug.h"
 #include "debug.h"
 
+void init_wine_signals(void);
+
 
 /***********************************************************************
  *           Main initialisation routine
@@ -48,11 +52,13 @@ int MAIN_Init(void)
 
     SpyInit();
 
+#ifndef WINELIB
       /* Initialize relay code */
     if (!RELAY_Init()) return 0;
 
       /* Initialize Win32 relay code */
     if (!RELAY32_Init()) return 0;
+#endif
 
       /* Create built-in modules */
     if (!MODULE_Init()) return 0;
@@ -63,6 +69,7 @@ int MAIN_Init(void)
       /* Initialize tasks */
     if (!TASK_Init()) return 0;
 
+#ifndef WINELIB
       /* Initialize interrupt vectors */
     if (!INT_Init()) return 0;
 
@@ -71,6 +78,7 @@ int MAIN_Init(void)
 
       /* Initialize signal handling */
     init_wine_signals();
+#endif
 
       /* Initialize communications */
     COMM_Init();
@@ -102,6 +110,9 @@ int MAIN_Init(void)
       /* Initialize menus */
     if (!MENU_Init()) return 0;
 
+      /* Initialize Win32 data structures */
+    if (!KERN32_Init()) return 0;
+
       /* Create system message queue */
     queueSize = GetProfileInt( "windows", "TypeAhead", 120 );
     if (!MSG_CreateSysMsgQueue( queueSize )) return 0;
diff --git a/loader/module.c b/loader/module.c
index 928b6474cb8..e48ed033699 100644
--- a/loader/module.c
+++ b/loader/module.c
@@ -30,62 +30,89 @@ static HMODULE hCachedModule = 0;  /* Module cached by MODULE_OpenFile */
 
 
 /***********************************************************************
- *           MODULE_Init
+ *           MODULE_LoadBuiltin
  *
- * Create the built-in modules.
+ * Load a built-in module. If the 'force' parameter is FALSE, we only
+ * load the module if it has not been disabled via the -dll option.
  */
-BOOL MODULE_Init(void)
+static HMODULE MODULE_LoadBuiltin( LPCSTR name, BOOL force )
 {
+#ifndef WINELIB /* JBP: Not really allowed in libwine.a (FIXME:?) */
     HMODULE hModule;
     NE_MODULE *pModule;
     SEGTABLEENTRY *pSegTable;
     struct dll_table_s *table;
     int i;
+    char dllname[16], *p;
 
-      /* Create the built-in modules */
+    /* Fix the name in case we have a full path and extension */
+
+    if ((p = strrchr( name, '\\' ))) name = p + 1;
+    strncpy( dllname, name, 15 );
+    dllname[15] = '\0';
+    if ((p = strrchr( dllname, '.' ))) *p = '\0';
 
     for (i = 0, table = dll_builtin_table; i < N_BUILTINS; i++, table++)
-    {
-        if (!table->used) continue;
+        if (!strcasecmp( table->name, dllname )) break;
+    if (i >= N_BUILTINS) return 0;
+    if (!table->used && !force) return 0;
+
+    hModule = GLOBAL_CreateBlock( GMEM_MOVEABLE, table->module_start,
+                                  table->module_end - table->module_start,
+                                  0, FALSE, FALSE, FALSE, NULL );
+    if (!hModule) return 0;
+    FarSetOwner( hModule, hModule );
 
-        hModule = GLOBAL_CreateBlock( GMEM_MOVEABLE, table->module_start,
-                                      table->module_end - table->module_start,
-                                      0, FALSE, FALSE, FALSE, NULL );
-        if (!hModule) return FALSE;
-        FarSetOwner( hModule, hModule );
+    table->hModule = hModule;
 
-        table->hModule = hModule;
+    dprintf_module( stddeb, "Built-in %s: hmodule=%04x\n",
+                    table->name, hModule );
 
-        dprintf_module( stddeb, "Built-in %s: hmodule=%04x\n",
-                        table->name, hModule );
+    /* Allocate the code segment */
 
-          /* Allocate the code segment */
+    pModule = (NE_MODULE *)GlobalLock( hModule );
+    pSegTable = NE_SEG_TABLE( pModule );
 
-        pModule = (NE_MODULE *)GlobalLock( hModule );
-        pSegTable = NE_SEG_TABLE( pModule );
+    pSegTable->selector = GLOBAL_CreateBlock( GMEM_FIXED, table->code_start,
+                                              pSegTable->minsize, hModule,
+                                              TRUE, TRUE, FALSE, NULL );
+    if (!pSegTable->selector) return 0;
+    pSegTable++;
 
-        pSegTable->selector = GLOBAL_CreateBlock(GMEM_FIXED, table->code_start,
-                                                 pSegTable->minsize, hModule,
-                                                 TRUE, TRUE, FALSE, NULL );
-        if (!pSegTable->selector) return FALSE;
-        pSegTable++;
+    /* Allocate the data segment */
 
-          /* Allocate the data segment */
+    pSegTable->selector = GLOBAL_Alloc( GMEM_FIXED, pSegTable->minsize,
+                                        hModule, FALSE, FALSE, FALSE );
+    if (!pSegTable->selector) return 0;
+    memcpy( GlobalLock( pSegTable->selector ),
+            table->data_start, pSegTable->minsize );
 
-        pSegTable->selector = GLOBAL_Alloc( GMEM_FIXED, pSegTable->minsize,
-                                            hModule, FALSE, FALSE, FALSE );
-        if (!pSegTable->selector) return FALSE;
-        memcpy( GlobalLock( pSegTable->selector ), table->data_start,
-                pSegTable->minsize );
+    pModule->next = hFirstModule;
+    hFirstModule = hModule;
+    return hModule;
+}
 
-        pModule->next = hFirstModule;
-        hFirstModule = hModule;
-    }
 
+/***********************************************************************
+ *           MODULE_Init
+ *
+ * Create the built-in modules.
+ */
+BOOL MODULE_Init(void)
+{
+    /* For these, built-in modules are always used */
+
+    if (!MODULE_LoadBuiltin( "KERNEL", TRUE ) ||
+        !MODULE_LoadBuiltin( "GDI", TRUE ) ||
+        !MODULE_LoadBuiltin( "USER", TRUE ) ||
+        !MODULE_LoadBuiltin( "WINPROCS", TRUE )) return FALSE;
+
+#else
+    fprintf(stderr, "JBP: MODULE_Init() ignored.\n");
+#endif
     /* Initialize KERNEL.178 (__WINFLAGS) with the correct flags value */
 
     MODULE_SetEntryPoint( GetModuleHandle( "KERNEL" ), 178, GetWinFlags() );
-
     return TRUE;
 }
 
@@ -103,7 +130,7 @@ void MODULE_PrintModule( HMODULE hmodule )
 
       /* Dump the module info */
 
-    printf( "Module %04x:\n", hmodule );
+    printf( "Module "NPFMT":\n", hmodule );
     printf( "count=%d flags=%04x heap=%d stack=%d\n",
             pModule->count, pModule->flags,
             pModule->heap_size, pModule->stack_size );
@@ -124,7 +151,7 @@ void MODULE_PrintModule( HMODULE hmodule )
     printf( "\nSegment table:\n" );
     pSeg = NE_SEG_TABLE( pModule );
     for (i = 0; i < pModule->seg_count; i++, pSeg++)
-        printf( "%02x: pos=%d size=%d flags=%04x minsize=%d sel=%04x\n",
+        printf( "%02x: pos=%d size=%d flags=%04x minsize=%d sel="NPFMT"\n",
                 i + 1, pSeg->filepos, pSeg->size, pSeg->flags,
                 pSeg->minsize, pSeg->selector );
 
@@ -233,7 +260,7 @@ int MODULE_OpenFile( HMODULE hModule )
     static int cachedfd = -1;
 
     hModule = GetExePtr( hModule );  /* In case we were passed an hInstance */
-    dprintf_module( stddeb, "MODULE_OpenFile(%04x) cache: mod=%04x fd=%d\n",
+    dprintf_module( stddeb, "MODULE_OpenFile("NPFMT") cache: mod="NPFMT" fd=%d\n",
                     hModule, hCachedModule, cachedfd );
     if (!(pModule = (NE_MODULE *)GlobalLock( hModule ))) return -1;
     if (hCachedModule == hModule) return cachedfd;
@@ -278,9 +305,13 @@ static WORD MODULE_Ne2MemFlags(WORD flags)
 DWORD MODULE_AllocateSegment(WORD wFlags, WORD wSize, WORD wElem)
 {
     WORD size = wSize << wElem;
-    WORD hMem = GlobalAlloc( MODULE_Ne2MemFlags(wFlags), size);
+    HANDLE hMem = GlobalAlloc( MODULE_Ne2MemFlags(wFlags), size);
+#ifdef WINELIB32
+    return (DWORD)GlobalLock(hMem);
+#else
     WORD selector = HIWORD(GlobalLock(hMem));
     return MAKELONG(hMem, selector);
+#endif
 }
 
 /***********************************************************************
@@ -389,14 +420,14 @@ HMODULE MODULE_LoadExeHeader( int fd, OFSTRUCT *ofs )
 
     lseek( fd, 0, SEEK_SET );
     if ((read( fd, &mz_header, sizeof(mz_header) ) != sizeof(mz_header)) ||
-        (mz_header.mz_magic != MZ_SIGNATURE)) return 11;  /* invalid exe */
+        (mz_header.mz_magic != MZ_SIGNATURE)) return (HMODULE)11;  /* invalid exe */
 
     lseek( fd, mz_header.ne_offset, SEEK_SET );
     if (read( fd, &ne_header, sizeof(ne_header) ) != sizeof(ne_header))
-        return 11;  /* invalid exe */
+        return (HMODULE)11;  /* invalid exe */
 
-    if (ne_header.ne_magic == PE_SIGNATURE) return 21;  /* win32 exe */
-    if (ne_header.ne_magic != NE_SIGNATURE) return 11;  /* invalid exe */
+    if (ne_header.ne_magic == PE_SIGNATURE) return (HMODULE)21;  /* win32 exe */
+    if (ne_header.ne_magic != NE_SIGNATURE) return (HMODULE)11;  /* invalid exe */
 
     /* We now have a valid NE header */
 
@@ -417,7 +448,7 @@ HMODULE MODULE_LoadExeHeader( int fd, OFSTRUCT *ofs )
            ne_header.entry_tab_length;
 
     hModule = GlobalAlloc( GMEM_MOVEABLE | GMEM_ZEROINIT, size );
-    if (!hModule) return 11;  /* invalid exe */
+    if (!hModule) return (HMODULE)11;  /* invalid exe */
     FarSetOwner( hModule, hModule );
     pModule = (NE_MODULE *)GlobalLock( hModule );
     memcpy( pModule, &ne_header, sizeof(NE_MODULE) );
@@ -465,7 +496,7 @@ HMODULE MODULE_LoadExeHeader( int fd, OFSTRUCT *ofs )
 
         if (!READ( ne_header.segment_tab_offset,
              ne_header.n_segment_tab * sizeof(struct ne_segment_table_entry_s),
-             buffer )) return 11;  /* invalid exe */
+             buffer )) return (HMODULE)11;  /* invalid exe */
         pSeg = (struct ne_segment_table_entry_s *)buffer;
         for (i = ne_header.n_segment_tab; i > 0; i--, pSeg++)
         {
@@ -474,7 +505,7 @@ HMODULE MODULE_LoadExeHeader( int fd, OFSTRUCT *ofs )
         }
         free( buffer );
     }
-    else return 11;  /* invalid exe */
+    else return (HMODULE)11;  /* invalid exe */
 
     /* Get the resource table */
 
@@ -483,7 +514,7 @@ HMODULE MODULE_LoadExeHeader( int fd, OFSTRUCT *ofs )
         pModule->res_table = (int)pData - (int)pModule;
         if (!READ(ne_header.resource_tab_offset,
                   ne_header.rname_tab_offset - ne_header.resource_tab_offset,
-                  pData )) return 11;  /* invalid exe */
+                  pData )) return (HMODULE)11;  /* invalid exe */
         pData += ne_header.rname_tab_offset - ne_header.resource_tab_offset;
     }
     else pModule->res_table = 0;  /* No resource table */
@@ -493,7 +524,7 @@ HMODULE MODULE_LoadExeHeader( int fd, OFSTRUCT *ofs )
     pModule->name_table = (int)pData - (int)pModule;
     if (!READ( ne_header.rname_tab_offset,
                ne_header.moduleref_tab_offset - ne_header.rname_tab_offset,
-               pData )) return 11;  /* invalid exe */
+               pData )) return (HMODULE)11;  /* invalid exe */
     pData += ne_header.moduleref_tab_offset - ne_header.rname_tab_offset;
 
     /* Get the module references table */
@@ -503,7 +534,7 @@ HMODULE MODULE_LoadExeHeader( int fd, OFSTRUCT *ofs )
         pModule->modref_table = (int)pData - (int)pModule;
         if (!READ( ne_header.moduleref_tab_offset,
                   ne_header.n_mod_ref_tab * sizeof(WORD),
-                  pData )) return 11;  /* invalid exe */
+                  pData )) return (HMODULE)11;  /* invalid exe */
         pData += ne_header.n_mod_ref_tab * sizeof(WORD);
     }
     else pModule->modref_table = 0;  /* No module references */
@@ -513,7 +544,7 @@ HMODULE MODULE_LoadExeHeader( int fd, OFSTRUCT *ofs )
     pModule->import_table = (int)pData - (int)pModule;
     if (!READ( ne_header.iname_tab_offset, 
                ne_header.entry_tab_offset - ne_header.iname_tab_offset,
-               pData )) return 11;  /* invalid exe */
+               pData )) return (HMODULE)11;  /* invalid exe */
     pData += ne_header.entry_tab_offset - ne_header.iname_tab_offset;
 
     /* Get the entry table */
@@ -521,7 +552,7 @@ HMODULE MODULE_LoadExeHeader( int fd, OFSTRUCT *ofs )
     pModule->entry_table = (int)pData - (int)pModule;
     if (!READ( ne_header.entry_tab_offset,
                ne_header.entry_tab_length,
-               pData )) return 11;  /* invalid exe */
+               pData )) return (HMODULE)11;  /* invalid exe */
     pData += ne_header.entry_tab_length;
 
     /* Get the non-resident names table */
@@ -530,11 +561,11 @@ HMODULE MODULE_LoadExeHeader( int fd, OFSTRUCT *ofs )
     {
         pModule->nrname_handle = GLOBAL_Alloc( 0, ne_header.nrname_tab_length,
                                                hModule, FALSE, FALSE, FALSE );
-        if (!pModule->nrname_handle) return 11;  /* invalid exe */
+        if (!pModule->nrname_handle) return (HMODULE)11;  /* invalid exe */
         buffer = GlobalLock( pModule->nrname_handle );
         lseek( fd, ne_header.nrname_tab_offset, SEEK_SET );
         if (read( fd, buffer, ne_header.nrname_tab_length )
-              != ne_header.nrname_tab_length) return 11;  /* invalid exe */
+              != ne_header.nrname_tab_length) return (HMODULE)11;  /* invalid exe */
     }
     else pModule->nrname_handle = 0;
 
@@ -545,7 +576,7 @@ HMODULE MODULE_LoadExeHeader( int fd, OFSTRUCT *ofs )
         pModule->dlls_to_init = GLOBAL_Alloc(GMEM_ZEROINIT,
                                     (pModule->modref_count+1)*sizeof(HMODULE),
                                     hModule, FALSE, FALSE, FALSE );
-        if (!pModule->dlls_to_init) return 11;  /* invalid exe */
+        if (!pModule->dlls_to_init) return (HMODULE)11;  /* invalid exe */
     }
     else pModule->dlls_to_init = 0;
 
@@ -569,7 +600,7 @@ WORD MODULE_GetOrdinal( HMODULE hModule, char *name )
 
     if (!(pModule = (NE_MODULE *)GlobalLock( hModule ))) return 0;
 
-    dprintf_module( stddeb, "MODULE_GetOrdinal(%04x,'%s')\n",
+    dprintf_module( stddeb, "MODULE_GetOrdinal("NPFMT",'%s')\n",
                     hModule, name );
 
       /* First handle names of the form '#xxxx' */
@@ -817,10 +848,12 @@ static void MODULE_FreeModule( HMODULE hModule )
     HMODULE *hPrevModule;
     NE_MODULE *pModule;
     SEGTABLEENTRY *pSegment;
-    WORD *pModRef;
+    HMODULE *pModRef;
     int i;
 
     if (!(pModule = (NE_MODULE *)GlobalLock( hModule ))) return;
+    if (pModule->flags & NE_FFLAGS_BUILTIN)
+        return;  /* Can't free built-in module */
 
     /* FIXME: should call the exit code for the library here */
 
@@ -861,6 +894,8 @@ static void MODULE_FreeModule( HMODULE hModule )
 }
 
 
+HINSTANCE PE_LoadModule(int fd, OFSTRUCT *ofs, LOADPARAMS* params);
+
 /**********************************************************************
  *	    LoadModule    (KERNEL.45)
  */
@@ -870,16 +905,30 @@ HINSTANCE LoadModule( LPCSTR name, LPVOID paramBlock )
     HANDLE hInstance, hPrevInstance;
     NE_MODULE *pModule;
     LOADPARAMS *params = (LOADPARAMS *)paramBlock;
+#ifndef WINELIB /* JBP: Disabled for now in winelib.a */
     WORD *pModRef, *pDLLs;
     int i, fd;
 
     hModule = MODULE_FindModule( name );
+
     if (!hModule)  /* We have to load the module */
     {
         OFSTRUCT ofs;
+
+        /* Try to load the built-in first if not disabled */
+        if ((hModule = MODULE_LoadBuiltin( name, FALSE ))) return hModule;
+
         if (strchr( name, '/' )) name = DOS_GetDosFileName( name );
         if ((fd = OpenFile( name, &ofs, OF_READ )) == -1)
+        {
+            /* Now try the built-in even if disabled */
+            if ((hModule = MODULE_LoadBuiltin( name, TRUE )))
+            {
+                fprintf( stderr, "Warning: could not load Windows DLL '%s', using built-in module.\n", name );
+                return hModule;
+            }
             return 2;  /* File not found */
+        }
 
           /* Create the module structure */
 
@@ -996,6 +1045,10 @@ HINSTANCE LoadModule( LPCSTR name, LPVOID paramBlock )
           /* the module, even if it contains circular DLL references */
 
         pModule->count = 1;
+
+          /* Clear built-in flag in case it was set in the EXE file */
+
+        pModule->flags &= ~NE_FFLAGS_BUILTIN;
     }
     else
     {
@@ -1006,6 +1059,14 @@ HINSTANCE LoadModule( LPCSTR name, LPVOID paramBlock )
             NE_LoadSegment( hModule, pModule->dgroup );
         pModule->count++;
     }
+#else
+    hModule = GlobalAlloc( GMEM_MOVEABLE | GMEM_ZEROINIT, sizeof(NE_MODULE) );
+    pModule = (NE_MODULE *)GlobalLock( hModule );
+    pModule->count = 1;
+    pModule->magic = 0x454e;
+    hPrevInstance = 0;
+    hInstance = MODULE_CreateInstance( hModule, (LOADPARAMS*)paramBlock );
+#endif /* WINELIB */
 
       /* Create a task for this instance */
 
@@ -1043,7 +1104,11 @@ BOOL FreeModule( HANDLE hModule )
  */
 HMODULE WIN16_GetModuleHandle( SEGPTR name )
 {
+#ifdef WINELIB32
+    if (HIWORD(name) == 0) return GetExePtr( name );
+#else
     if (HIWORD(name) == 0) return GetExePtr( LOWORD(name) );
+#endif
     return MODULE_FindModule( PTR_SEG_TO_LIN(name) );
 }
 
@@ -1062,7 +1127,7 @@ int GetModuleUsage( HANDLE hModule )
 
     hModule = GetExePtr( hModule );  /* In case we were passed an hInstance */
     if (!(pModule = (NE_MODULE *)GlobalLock( hModule ))) return 0;
-    dprintf_module( stddeb, "GetModuleUsage(%04x): returning %d\n",
+    dprintf_module( stddeb, "GetModuleUsage("NPFMT"): returning %d\n",
                     hModule, pModule->count );
     return pModule->count;
 }
@@ -1099,14 +1164,14 @@ HANDLE LoadLibrary( LPCSTR libname )
     if ((handle = MODULE_FindModule( libname )) != 0) return handle;
      */
     handle = LoadModule( libname, (LPVOID)-1 );
-    if (handle == 2)  /* file not found */
+    if (handle == (HANDLE)2)  /* file not found */
     {
         char buffer[256];
         strcpy( buffer, libname );
         strcat( buffer, ".dll" );
         handle = LoadModule( buffer, (LPVOID)-1 );
     }
-    if (handle >= 32) NE_InitializeDLLs( GetExePtr(handle) );
+    if (handle >= (HANDLE)32) NE_InitializeDLLs( GetExePtr(handle) );
     return handle;
 }
 
@@ -1116,7 +1181,7 @@ HANDLE LoadLibrary( LPCSTR libname )
  */
 void FreeLibrary( HANDLE handle )
 {
-    dprintf_module( stddeb,"FreeLibrary: %04x\n", handle );
+    dprintf_module( stddeb,"FreeLibrary: "NPFMT"\n", handle );
     FreeModule( handle );
 }
 
@@ -1157,12 +1222,12 @@ HANDLE WinExec( LPSTR lpCmdLine, WORD nCmdShow )
 
       /* Now load the executable file */
 
-    params.hEnvironment = SELECTOROF( GetDOSEnvironment() );
-    params.cmdLine  = WIN16_GlobalLock( cmdLineHandle );
-    params.showCmd  = WIN16_GlobalLock( cmdShowHandle );
+    params.hEnvironment = (HANDLE)SELECTOROF( GetDOSEnvironment() );
+    params.cmdLine  = (SEGPTR)WIN16_GlobalLock( cmdLineHandle );
+    params.showCmd  = (SEGPTR)WIN16_GlobalLock( cmdShowHandle );
     params.reserved = 0;
     handle = LoadModule( filename, &params );
-    if (handle == 2)  /* file not found */
+    if (handle == (HANDLE)2)  /* file not found */
     {
         strcat( filename, ".exe" );
         handle = LoadModule( filename, &params );
@@ -1170,6 +1235,7 @@ HANDLE WinExec( LPSTR lpCmdLine, WORD nCmdShow )
 
     GlobalFree( cmdShowHandle );
     GlobalFree( cmdLineHandle );
+    Yield();	/* program is executed immediatly ....needed for word */
     return handle;
 }
 
@@ -1188,13 +1254,13 @@ FARPROC GetProcAddress( HANDLE hModule, SEGPTR name )
     if (HIWORD(name) != 0)
     {
         ordinal = MODULE_GetOrdinal( hModule, (LPSTR)PTR_SEG_TO_LIN(name) );
-        dprintf_module( stddeb, "GetProcAddress: %04x '%s'\n",
+        dprintf_module( stddeb, "GetProcAddress: "NPFMT" '%s'\n",
                         hModule, (LPSTR)PTR_SEG_TO_LIN(name) );
     }
     else
     {
         ordinal = LOWORD(name);
-        dprintf_module( stddeb, "GetProcAddress: %04x %04x\n",
+        dprintf_module( stddeb, "GetProcAddress: "NPFMT" %04x\n",
                         hModule, ordinal );
     }
     if (!ordinal) return (FARPROC)0;
@@ -1206,6 +1272,7 @@ FARPROC GetProcAddress( HANDLE hModule, SEGPTR name )
 }
 
 
+#ifndef WINELIB
 /***********************************************************************
  *           GetWndProcEntry16 (not a Windows API function)
  *
@@ -1220,6 +1287,7 @@ WNDPROC GetWndProcEntry16( char *name )
     ordinal = MODULE_GetOrdinal( hModule, name );
     return MODULE_GetEntryPoint( hModule, ordinal );
 }
+#endif
 
 
 /**********************************************************************
diff --git a/loader/ne_image.c b/loader/ne_image.c
index b05e65eb889..9167a999d74 100644
--- a/loader/ne_image.c
+++ b/loader/ne_image.c
@@ -34,7 +34,8 @@ BOOL NE_LoadSegment( HMODULE hModule, WORD segnum )
     NE_MODULE *pModule;
     SEGTABLEENTRY *pSegTable, *pSeg;
     WORD *pModuleTable;
-    WORD count, i, module, offset;
+    WORD count, i, offset;
+    HMODULE module;
     DWORD address;
     int fd;
     struct relocation_entry_s *rep, *reloc_entries;
@@ -54,12 +55,13 @@ BOOL NE_LoadSegment( HMODULE hModule, WORD segnum )
     if (!pSeg->filepos) return TRUE;  /* No file image, just return */
 	
     fd = MODULE_OpenFile( hModule );
-    dprintf_module( stddeb, "Loading segment %d, selector=%04x\n",
+    dprintf_module( stddeb, "Loading segment %d, selector="NPFMT"\n",
                     segnum, pSeg->selector );
     lseek( fd, pSeg->filepos << pModule->alignment, SEEK_SET );
     size = pSeg->size ? pSeg->size : 0x10000;
     mem = GlobalLock(pSeg->selector);
     if (pModule->flags & NE_FFLAGS_SELFLOAD && segnum > 1) {	
+#ifndef WINELIB
  	/* Implement self loading segments */
  	SELFLOADHEADER *selfloadheader;
  	WORD oldss, oldsp, oldselector, newselector;
@@ -92,6 +94,9 @@ BOOL NE_LoadSegment( HMODULE hModule, WORD segnum )
  	
  	IF1632_Saved16_ss = oldss;
  	IF1632_Saved16_sp = oldsp;
+#else
+	fprintf(stderr,"JBP: Ignoring self loading segments in NE_LoadSegment.\n");
+#endif
      }
     else if (!(pSeg->flags & NE_SEGFLAGS_ITERATED))
       read(fd, mem, size);
@@ -126,7 +131,7 @@ BOOL NE_LoadSegment( HMODULE hModule, WORD segnum )
     read( fd, &count, sizeof(count) );
     if (!count) return TRUE;
 
-    dprintf_fixup( stddeb, "Fixups for %*.*s, segment %d, selector %04x\n",
+    dprintf_fixup( stddeb, "Fixups for %*.*s, segment %d, selector "NPFMT"\n",
                    *((BYTE *)pModule + pModule->name_table),
                    *((BYTE *)pModule + pModule->name_table),
                    (char *)pModule + pModule->name_table + 1,
@@ -165,7 +170,7 @@ BOOL NE_LoadSegment( HMODULE hModule, WORD segnum )
             {
                 NE_MODULE *pTarget = (NE_MODULE *)GlobalLock( module );
                 if (!pTarget)
-                    fprintf( stderr, "Module not found: %04x, reference %d of module %*.*s\n",
+                    fprintf( stderr, "Module not found: "NPFMT", reference %d of module %*.*s\n",
                              module, rep->target1, 
                              *((BYTE *)pModule + pModule->name_table),
                              *((BYTE *)pModule + pModule->name_table),
@@ -266,7 +271,7 @@ BOOL NE_LoadSegment( HMODULE hModule, WORD segnum )
 	  case NE_RADDR_LOWBYTE:
             do {
                 sp = PTR_SEG_OFF_TO_LIN( pSeg->selector, offset );
-                dprintf_fixup(stddeb,"    %04x:%04x:%04x BYTE%s\n",
+                dprintf_fixup(stddeb,"    "NPFMT":%04x:%04x BYTE%s\n",
                               pSeg->selector, offset, *sp, additive ? " additive":"");
                 offset = *sp;
 		if(additive)
@@ -280,7 +285,7 @@ BOOL NE_LoadSegment( HMODULE hModule, WORD segnum )
 	  case NE_RADDR_OFFSET16:
 	    do {
                 sp = PTR_SEG_OFF_TO_LIN( pSeg->selector, offset );
-		dprintf_fixup(stddeb,"    %04x:%04x:%04x OFFSET16%s\n",
+		dprintf_fixup(stddeb,"    "NPFMT":%04x:%04x OFFSET16%s\n",
                               pSeg->selector, offset, *sp, additive ? " additive" : "" );
 		offset = *sp;
 		*sp = LOWORD(address);
@@ -292,7 +297,7 @@ BOOL NE_LoadSegment( HMODULE hModule, WORD segnum )
 	  case NE_RADDR_POINTER32:
 	    do {
                 sp = PTR_SEG_OFF_TO_LIN( pSeg->selector, offset );
-		dprintf_fixup(stddeb,"    %04x:%04x:%04x POINTER32%s\n",
+		dprintf_fixup(stddeb,"    "NPFMT":%04x:%04x POINTER32%s\n",
                               pSeg->selector, offset, *sp, additive ? " additive" : "" );
 		offset = *sp;
 		*sp    = LOWORD(address);
@@ -305,7 +310,7 @@ BOOL NE_LoadSegment( HMODULE hModule, WORD segnum )
 	  case NE_RADDR_SELECTOR:
 	    do {
                 sp = PTR_SEG_OFF_TO_LIN( pSeg->selector, offset );
-		dprintf_fixup(stddeb,"    %04x:%04x:%04x SELECTOR%s\n",
+		dprintf_fixup(stddeb,"    "NPFMT":%04x:%04x SELECTOR%s\n",
                               pSeg->selector, offset, *sp, additive ? " additive" : "" );
 		offset = *sp;
 		*sp    = HIWORD(address);
@@ -434,6 +439,7 @@ void NE_FixupPrologs( HMODULE hModule )
  */
 static BOOL NE_InitDLL( HMODULE hModule )
 {
+#ifndef WINELIB
     int cs_reg, ds_reg, ip_reg, cx_reg, di_reg, bp_reg;
     NE_MODULE *pModule;
     SEGTABLEENTRY *pSegTable;
@@ -482,6 +488,10 @@ static BOOL NE_InitDLL( HMODULE hModule )
     return CallTo16_regs_( (FARPROC)(cs_reg << 16 | ip_reg), ds_reg,
                            0 /*es*/, 0 /*bp*/, 0 /*ax*/, 0 /*bx*/,
                            cx_reg, 0 /*dx*/, 0 /*si*/, di_reg );
+#else
+    fprintf( stderr,"JBP: Ignoring call to LibMain\n" );
+    return FALSE;
+#endif
 }
 
 
@@ -493,14 +503,14 @@ static BOOL NE_InitDLL( HMODULE hModule )
 void NE_InitializeDLLs( HMODULE hModule )
 {
     NE_MODULE *pModule;
-    WORD *pDLL;
+    HMODULE *pDLL;
 
     pModule = (NE_MODULE *)GlobalLock( hModule );
     if (pModule->dlls_to_init)
     {
 	HANDLE to_init = pModule->dlls_to_init;
 	pModule->dlls_to_init = 0;
-        for (pDLL = (WORD *)GlobalLock( to_init ); *pDLL; pDLL++)
+        for (pDLL = (HMODULE *)GlobalLock( to_init ); *pDLL; pDLL++)
         {
             NE_InitializeDLLs( *pDLL );
             NE_InitDLL( *pDLL );
diff --git a/loader/ne_resource.c b/loader/ne_resource.c
index ab9b089fc35..a83f639be69 100644
--- a/loader/ne_resource.c
+++ b/loader/ne_resource.c
@@ -54,7 +54,8 @@ static DWORD NE_FindNameTableId( HMODULE hModule, SEGPTR typeId, SEGPTR resId )
         {
             dprintf_resource( stddeb, "NameTable entry: type=%04x id=%04x\n",
                               pTypeInfo->type_id, pNameInfo->id );
-            handle = LoadResource( hModule, (int)pNameInfo - (int)pModule );
+            handle = LoadResource( hModule, 
+				   (HANDLE)((int)pNameInfo - (int)pModule) );
             for(p = (WORD*)LockResource(handle); *p; p = (WORD *)((char*)p+*p))
             {
                 dprintf_resource( stddeb,"  type=%04x '%s' id=%04x '%s'\n",
@@ -118,14 +119,15 @@ static HRSRC NE_FindResourceFromType( NE_MODULE *pModule,
             if (pNameInfo->id & 0x8000) continue;
             p = (BYTE *)pModule + pModule->res_table + pNameInfo->id;
             if ((*p == len) && !strncasecmp( p+1, str, len ))
-                return (int)pNameInfo - (int)pModule;
+                return (HRSRC)((int)pNameInfo - (int)pModule);
         }
     }
     else  /* Numeric resource id */
     {
         WORD id = LOWORD(resId) | 0x8000;
         for (count = pTypeInfo->count; count > 0; count--, pNameInfo++)
-            if (pNameInfo->id == id) return (int)pNameInfo - (int)pModule;
+            if (pNameInfo->id == id) 
+	      return (HRSRC)((int)pNameInfo - (int)pModule);
     }
     return 0;
 }
@@ -219,13 +221,15 @@ HRSRC NE_FindResource( HMODULE hModule, SEGPTR typeId, SEGPTR resId )
 HGLOBAL NE_AllocResource( HMODULE hModule, HRSRC hRsrc, DWORD size )
 {
     NE_MODULE *pModule;
-    NE_NAMEINFO *pNameInfo;
+    NE_NAMEINFO *pNameInfo=NULL;
     WORD sizeShift;
 
     pModule = (NE_MODULE *)GlobalLock( hModule );
     if (!pModule || !pModule->res_table) return 0;
     sizeShift = *(WORD *)((char *)pModule + pModule->res_table);
+#ifndef WINELIB
     pNameInfo = (NE_NAMEINFO*)((char*)pModule + hRsrc);
+#endif
     if (size < (DWORD)pNameInfo->length << sizeShift)
         size = (DWORD)pNameInfo->length << sizeShift;
     return GLOBAL_Alloc( GMEM_FIXED, size, hModule, FALSE, FALSE, FALSE );
@@ -238,14 +242,16 @@ HGLOBAL NE_AllocResource( HMODULE hModule, HRSRC hRsrc, DWORD size )
 int NE_AccessResource( HMODULE hModule, HRSRC hRsrc )
 {
     NE_MODULE *pModule;
-    NE_NAMEINFO *pNameInfo;
+    NE_NAMEINFO *pNameInfo=NULL;
     WORD sizeShift;
     char *name;
     int fd;
 
     pModule = (NE_MODULE *)GlobalLock( hModule );
     if (!pModule || !pModule->res_table) return 0;
+#ifndef WINELIB
     pNameInfo = (NE_NAMEINFO*)((char*)pModule + hRsrc);
+#endif
 
     name = ((LOADEDFILEINFO*)((char*)pModule + pModule->fileinfo))->filename;
     fd = open( DOS_GetUnixFileName(name), O_RDONLY );
@@ -261,13 +267,15 @@ int NE_AccessResource( HMODULE hModule, HRSRC hRsrc )
 DWORD NE_SizeofResource( HMODULE hModule, HRSRC hRsrc )
 {
     NE_MODULE *pModule;
-    NE_NAMEINFO *pNameInfo;
+    NE_NAMEINFO *pNameInfo=NULL;
     WORD sizeShift;
 
     pModule = (NE_MODULE *)GlobalLock( hModule );
     if (!pModule || !pModule->res_table) return 0;
     sizeShift = *(WORD *)((char *)pModule + pModule->res_table);
+#ifndef WINELIB
     pNameInfo = (NE_NAMEINFO*)((char*)pModule + hRsrc);
+#endif
     return (DWORD)pNameInfo->length << sizeShift;
 }
 
@@ -278,13 +286,15 @@ DWORD NE_SizeofResource( HMODULE hModule, HRSRC hRsrc )
 HGLOBAL NE_LoadResource( HMODULE hModule,  HRSRC hRsrc )
 {
     NE_MODULE *pModule;
-    NE_NAMEINFO *pNameInfo;
+    NE_NAMEINFO *pNameInfo=NULL;
     WORD sizeShift;
     int fd;
 
     pModule = (NE_MODULE *)GlobalLock( hModule );
     if (!pModule || !pModule->res_table) return 0;
+#ifndef WINELIB
     pNameInfo = (NE_NAMEINFO*)((char*)pModule + hRsrc);
+#endif
     if (pNameInfo->handle)
     {
         pNameInfo->usage++;
@@ -313,7 +323,7 @@ SEGPTR NE_LockResource( HMODULE hModule, HGLOBAL handle )
 {
     /* May need to reload the resource if discarded */
 
-    return WIN16_GlobalLock( handle );
+    return (SEGPTR)WIN16_GlobalLock( handle );
 }
 
 
@@ -349,6 +359,6 @@ BOOL NE_FreeResource( HMODULE hModule, HGLOBAL handle )
         }
         pTypeInfo = (NE_TYPEINFO *)pNameInfo;
     }
-    fprintf( stderr, "FreeResource: %04x %04x not found!\n", hModule, handle );
+    fprintf( stderr, "FreeResource: "NPFMT" "NPFMT" not found!\n", hModule, handle );
     return FALSE;
 }
diff --git a/loader/pe_image.c b/loader/pe_image.c
index 493de0fd3af..18117cd3eef 100644
--- a/loader/pe_image.c
+++ b/loader/pe_image.c
@@ -25,7 +25,7 @@
 #include "task.h"
 #include "ldt.h"
 #include "registers.h"
-
+#include "selectors.h"
 #include "stddebug.h"
 #include "debug.h"
 
@@ -54,7 +54,11 @@ char * xmmap(char * vaddr, unsigned int v_size, unsigned int r_size,
   if(r_size)
     v_size=r_size;
   else
+#ifdef __svr4__
+    fprintf(stderr,"xmmap: %s line %d doesn't support MAP_ANON\n",__FILE__, __LINE__);
+#else
     flags |= MAP_ANON;
+#endif
   result = mmap(vaddr, v_size, prot, flags, fd, file_offset);
   if((unsigned int) result != 0xffffffff) return result;
 
@@ -131,7 +135,11 @@ void fixup_imports(struct PE_Import_Directory *pe_imports)
 		exit(0);
 	  }
 	  printf("--- %s %s.%d\n", pe_name->Name, Module, pe_name->Hint);
-	  *thunk_list=RELAY32_GetEntryPoint(Module,pe_name->Name,pe_name->Hint);
+#ifndef WINELIB /* FIXME: JBP: Should this happen in libwine.a? */
+	  *thunk_list=(unsigned int)RELAY32_GetEntryPoint(Module,pe_name->Name,pe_name->Hint);
+#else
+	  fprintf(stderr,"JBP: Call to RELAY32_GetEntryPoint being ignored.\n");
+#endif
 	  if(!*thunk_list)
 	  {
 	  	fprintf(stderr,"No implementation for %s.%d\n",Module, pe_name->Hint);
@@ -197,12 +205,12 @@ HINSTANCE PE_LoadImage(struct w_files *wpnt)
 	for(i=0; i < wpnt->pe->pe_header->coff.NumberOfSections; i++)
 	{
 	if(!load_addr) {
-		result = xmmap((char *)0, wpnt->pe->pe_seg[i].Virtual_Size,
+		result = (int)xmmap((char *)0, wpnt->pe->pe_seg[i].Virtual_Size,
 			wpnt->pe->pe_seg[i].Size_Of_Raw_Data, 7,
 			MAP_PRIVATE, wpnt->fd, wpnt->pe->pe_seg[i].PointerToRawData);
 		load_addr = (unsigned int) result -  wpnt->pe->pe_seg[i].Virtual_Address;
 	} else {
-		result = xmmap((char *) load_addr + wpnt->pe->pe_seg[i].Virtual_Address, 
+		result = (int)xmmap((char *) load_addr + wpnt->pe->pe_seg[i].Virtual_Address, 
 			  wpnt->pe->pe_seg[i].Virtual_Size,
 		      wpnt->pe->pe_seg[i].Size_Of_Raw_Data, 7, MAP_PRIVATE | MAP_FIXED, 
 		      wpnt->fd, wpnt->pe->pe_seg[i].PointerToRawData);
@@ -232,10 +240,13 @@ HINSTANCE PE_LoadImage(struct w_files *wpnt)
 	if(wpnt->pe->pe_import) fixup_imports(wpnt->pe->pe_import);
 	if(wpnt->pe->pe_export) dump_exports(wpnt->pe->pe_export);
   
-	wpnt->hinstance = 0x8000;
+	wpnt->hinstance = (HINSTANCE)0x8000;
 	return (wpnt->hinstance);
 }
 
+HINSTANCE MODULE_CreateInstance(HMODULE hModule,LOADPARAMS *params);
+void InitTask(struct sigcontext_struct context);
+
 HINSTANCE PE_LoadModule(int fd, OFSTRUCT *ofs, LOADPARAMS* params)
 {
 	struct w_files *wpnt;
@@ -275,11 +286,11 @@ HINSTANCE PE_LoadModule(int fd, OFSTRUCT *ofs, LOADPARAMS* params)
 
 	hModule = GlobalAlloc( GMEM_MOVEABLE | GMEM_ZEROINIT, size );
 	wpnt->hModule=hModule;
-	if (!hModule) return 11;  /* invalid exe */
+	if (!hModule) return (HINSTANCE)11;  /* invalid exe */
 
 	FarSetOwner( hModule, hModule );
 	
-	pModule = GlobalLock(hModule);
+	pModule = (NE_MODULE*)GlobalLock(hModule);
 
 	/* Set all used entries */
 	pModule->magic=NE_SIGNATURE;
@@ -312,9 +323,14 @@ HINSTANCE PE_LoadModule(int fd, OFSTRUCT *ofs, LOADPARAMS* params)
 	pSegment->minsize=0x1000;
 	pSegment++;
 
-	cts=GetWndProcEntry16("Win32CallToStart");
+	cts=(DWORD)GetWndProcEntry16("Win32CallToStart");
+#ifdef WINELIB32
+	pSegment->selector=(void*)cts;
+	pModule->ip=0;
+#else
 	pSegment->selector=cts>>16;
 	pModule->ip=cts & 0xFFFF;
+#endif
 	pSegment++;
 
 	pStr=(char*)pSegment;
@@ -332,7 +348,7 @@ HINSTANCE PE_LoadModule(int fd, OFSTRUCT *ofs, LOADPARAMS* params)
 	pModule->stack_size=0xE000;
 
 	/* CreateInstance allocates now 64KB */
-	hInstance=MODULE_CreateInstance(hModule);
+	hInstance=MODULE_CreateInstance(hModule,NULL /* FIX: NULL? really? */);
 	wpnt->hinstance=hInstance;
 
 	TASK_CreateTask(hModule,hInstance,0,
@@ -342,11 +358,13 @@ HINSTANCE PE_LoadModule(int fd, OFSTRUCT *ofs, LOADPARAMS* params)
 	return hInstance;
 }
 
+int USER_InitApp(HINSTANCE hInstance);
+
 void PE_Win32CallToStart(struct sigcontext_struct context)
 {
 	int fs;
 	struct w_files *wpnt=wine_files;
-	fs=GlobalAlloc(GHND,0x10000);
+	fs=(int)GlobalAlloc(GHND,0x10000);
 	fprintf(stddeb,"Going to start Win32 program\n");	
 	InitTask(context);
 	USER_InitApp(wpnt->hModule);
diff --git a/loader/resource.c b/loader/resource.c
index 90e9216c8f8..7a5b4b171d1 100644
--- a/loader/resource.c
+++ b/loader/resource.c
@@ -15,10 +15,8 @@
 #include "arch.h"
 #include "windows.h"
 #include "gdi.h"
-#include "bitmap.h"
 #include "global.h"
 #include "neexe.h"
-#include "icon.h"
 #include "accel.h"
 #include "dlls.h"
 #include "module.h"
@@ -33,15 +31,6 @@
         dprintf_resource( stddeb, "#%04x", LOWORD(name)); 
 
 
-/**********************************************************************
- *	    LoadIconHandler    (USER.456)
- */
-HICON LoadIconHandler( HANDLE hResource, BOOL bNew )
-{
-  return 0;
-}
-
-
 /**********************************************************************
  *	    FindResource    (KERNEL.60)
  */
@@ -50,7 +39,7 @@ HRSRC FindResource( HMODULE hModule, SEGPTR name, SEGPTR type )
     WORD *pModule;
 
     hModule = GetExePtr( hModule );  /* In case we were passed an hInstance */
-    dprintf_resource(stddeb, "FindResource: module=%04x type=", hModule );
+    dprintf_resource(stddeb, "FindResource: module="NPFMT" type=", hModule );
     PrintId( type );
     dprintf_resource( stddeb, " name=" );
     PrintId( name );
@@ -76,7 +65,7 @@ HGLOBAL LoadResource( HMODULE hModule, HRSRC hRsrc )
     WORD *pModule;
 
     hModule = GetExePtr( hModule );  /* In case we were passed an hInstance */
-    dprintf_resource(stddeb, "LoadResource: module=%04x res=%04x\n",
+    dprintf_resource(stddeb, "LoadResource: module="NPFMT" res="NPFMT"\n",
                      hModule, hRsrc );
     if (!hRsrc) return 0;
     if (!(pModule = (WORD *)GlobalLock( hModule ))) return 0;
@@ -101,7 +90,7 @@ SEGPTR WIN16_LockResource( HGLOBAL handle )
     HMODULE hModule;
     WORD *pModule;
 
-    dprintf_resource(stddeb, "LockResource: handle=%04x\n", handle );
+    dprintf_resource(stddeb, "LockResource: handle="NPFMT"\n", handle );
     if (!handle) return (SEGPTR)0;
     hModule = GetExePtr( handle );
     if (!(pModule = (WORD *)GlobalLock( hModule ))) return 0;
@@ -122,7 +111,7 @@ LPSTR LockResource( HGLOBAL handle )
     HMODULE hModule;
     WORD *pModule;
 
-    dprintf_resource(stddeb, "LockResource: handle=%04x\n", handle );
+    dprintf_resource(stddeb, "LockResource: handle="NPFMT"\n", handle );
     if (!handle) return NULL;
     hModule = GetExePtr( handle );
     if (!(pModule = (WORD *)GlobalLock( hModule ))) return 0;
@@ -146,7 +135,7 @@ BOOL FreeResource( HGLOBAL handle )
     HMODULE hModule;
     WORD *pModule;
 
-    dprintf_resource(stddeb, "FreeResource: handle=%04x\n", handle );
+    dprintf_resource(stddeb, "FreeResource: handle="NPFMT"\n", handle );
     if (!handle) return FALSE;
     hModule = GetExePtr( handle );
     if (!(pModule = (WORD *)GlobalLock( hModule ))) return 0;
@@ -165,12 +154,12 @@ BOOL FreeResource( HGLOBAL handle )
 /**********************************************************************
  *	    AccessResource    (KERNEL.64)
  */
-int AccessResource( HMODULE hModule, HRSRC hRsrc )
+INT AccessResource( HINSTANCE hModule, HRSRC hRsrc )
 {
     WORD *pModule;
 
     hModule = GetExePtr( hModule );  /* In case we were passed an hInstance */
-    dprintf_resource(stddeb, "AccessResource: module=%04x res=%04x\n",
+    dprintf_resource(stddeb, "AccessResource: module="NPFMT" res="NPFMT"\n",
                      hModule, hRsrc );
     if (!hRsrc) return 0;
     if (!(pModule = (WORD *)GlobalLock( hModule ))) return 0;
@@ -194,7 +183,7 @@ DWORD SizeofResource( HMODULE hModule, HRSRC hRsrc )
     WORD *pModule;
 
     hModule = GetExePtr( hModule );  /* In case we were passed an hInstance */
-    dprintf_resource(stddeb, "SizeofResource: module=%04x res=%04x\n",
+    dprintf_resource(stddeb, "SizeofResource: module="NPFMT" res="NPFMT"\n",
                      hModule, hRsrc );
     if (!(pModule = (WORD *)GlobalLock( hModule ))) return 0;
     switch(*pModule)
@@ -217,7 +206,7 @@ HGLOBAL AllocResource( HMODULE hModule, HRSRC hRsrc, DWORD size )
     WORD *pModule;
 
     hModule = GetExePtr( hModule );  /* In case we were passed an hInstance */
-    dprintf_resource(stddeb, "AllocResource: module=%04x res=%04x size=%ld\n",
+    dprintf_resource(stddeb, "AllocResource: module="NPFMT" res="NPFMT" size=%ld\n",
                      hModule, hRsrc, size );
     if (!hRsrc) return 0;
     if (!(pModule = (WORD *)GlobalLock( hModule ))) return 0;
@@ -234,263 +223,21 @@ HGLOBAL AllocResource( HMODULE hModule, HRSRC hRsrc, DWORD size )
 
 /**********************************************************************
  *      DirectResAlloc    (KERNEL.168)
+ *
  * Check Schulman, p. 232 for details
  */
 HANDLE DirectResAlloc(HANDLE hInstance, WORD wType, WORD wSize)
 {
-	HANDLE hModule;
-	dprintf_resource(stddeb,"DirectResAlloc(%x,%x,%x)\n",hInstance,wType,wSize);
-	hModule = GetExePtr(hInstance);
-	if(!hModule)return 0;
-	if(wType != 0x10)	/* 0x10 is the only observed value, passed from
+    dprintf_resource(stddeb,"DirectResAlloc("NPFMT",%x,%x)\n",hInstance,wType,wSize);
+    hInstance = GetExePtr(hInstance);
+    if(!hInstance)return 0;
+    if(wType != 0x10)	/* 0x10 is the only observed value, passed from
                            CreateCursorIndirect. */
-		fprintf(stderr, "DirectResAlloc: wType = %x\n", wType);
-	/* This hopefully does per-module allocation rather than per-instance */
-	return GLOBAL_Alloc(GMEM_FIXED, wSize, hModule, FALSE, FALSE, FALSE);
-}
-
-
-/**********************************************************************
- *			ConvertCoreBitmap
- */
-HBITMAP ConvertCoreBitmap( HDC hdc, BITMAPCOREHEADER * image )
-{
-    BITMAPINFO * bmpInfo;
-    HBITMAP hbitmap;
-    char * bits;
-    int i, size, n_colors;
-   
-    n_colors = 1 << image->bcBitCount;
-    if (image->bcBitCount < 24)
-    {
-	size = sizeof(BITMAPINFOHEADER) + n_colors * sizeof(RGBQUAD);	
-	bits = (char *) (image + 1) + (n_colors * sizeof(RGBTRIPLE));
-    }
-    else
-    {
-	size = sizeof(BITMAPINFOHEADER);
-	bits = (char *) (image + 1);
-    }
-    bmpInfo = (BITMAPINFO *) malloc( size );
-
-    bmpInfo->bmiHeader.biSize          = sizeof(BITMAPINFOHEADER);
-    bmpInfo->bmiHeader.biWidth         = image->bcWidth;
-    bmpInfo->bmiHeader.biHeight        = image->bcHeight;
-    bmpInfo->bmiHeader.biPlanes        = image->bcPlanes;
-    bmpInfo->bmiHeader.biBitCount      = image->bcBitCount;
-    bmpInfo->bmiHeader.biCompression   = 0;
-    bmpInfo->bmiHeader.biSizeImage     = 0;
-    bmpInfo->bmiHeader.biXPelsPerMeter = 0;
-    bmpInfo->bmiHeader.biYPelsPerMeter = 0;
-    bmpInfo->bmiHeader.biClrUsed       = 0;
-    bmpInfo->bmiHeader.biClrImportant  = 0;
-
-    if (image->bcBitCount < 24)
-    {
-	RGBTRIPLE * oldMap = (RGBTRIPLE *)(image + 1);
-	RGBQUAD * newMap = bmpInfo->bmiColors;
-	for (i = 0; i < n_colors; i++, oldMap++, newMap++)
-	{
-	    newMap->rgbRed      = oldMap->rgbtRed;
-	    newMap->rgbGreen    = oldMap->rgbtGreen;
-	    newMap->rgbBlue     = oldMap->rgbtBlue;
-	    newMap->rgbReserved = 0;
-	}
-    }
-
-    hbitmap = CreateDIBitmap( hdc, &bmpInfo->bmiHeader, CBM_INIT,
-			      bits, bmpInfo, DIB_RGB_COLORS );
-    free( bmpInfo );
-    return hbitmap;
-}
-
-/**********************************************************************
- *			ConvertInfoBitmap
- */
-HBITMAP	ConvertInfoBitmap( HDC hdc, BITMAPINFO * image )
-{
-    char * bits = ((char *)image) + DIB_BitmapInfoSize(image, DIB_RGB_COLORS);
-    return CreateDIBitmap( hdc, &image->bmiHeader, CBM_INIT,
-			   bits, image, DIB_RGB_COLORS );
-} 
-
-
-/**********************************************************************
- *			LoadIcon [USER.174]
- */
-HICON LoadIcon( HANDLE instance, SEGPTR icon_name )
-{
-    HICON 	hIcon;
-    HRSRC       hRsrc;
-    HANDLE 	rsc_mem;
-    WORD 	*lp;
-    ICONDESCRIP *lpicodesc;
-    ICONALLOC	*lpico;
-    int		width, height;
-    BITMAPINFO 	*bmi;
-    BITMAPINFOHEADER 	*bih;
-    RGBQUAD	*rgbq;
-    HDC 	hdc;
-    BITMAPINFO *pInfo;
-    char *bits;
-    int size;
-
-    if (HIWORD(icon_name))
-        dprintf_resource( stddeb, "LoadIcon: %04x '%s'\n",
-                          instance, (char *)PTR_SEG_TO_LIN( icon_name ) );
-    else
-        dprintf_resource( stddeb, "LoadIcon: %04x %04x\n",
-                          instance, LOWORD(icon_name) );
-    
-    if (!instance)
-    {
-        if (HIWORD((int)icon_name)) return 0; /* FIXME: should handle '#xxx' */
-        return OBM_LoadIcon( LOWORD((int)icon_name) );
-    }
-
-    if (!(hRsrc = FindResource( instance, icon_name, RT_GROUP_ICON))) return 0;
-    rsc_mem = LoadResource( instance, hRsrc );
-    if (rsc_mem == (HANDLE)NULL) {
-	printf("LoadIcon / Icon %08x not Found !\n", (int) icon_name);
-	return 0;
-    }
-    lp = (WORD *)LockResource(rsc_mem);
-    lpicodesc = (ICONDESCRIP *)(lp + 3);
-    hIcon = GlobalAlloc(GMEM_MOVEABLE, sizeof(ICONALLOC) + 1024);
-    if (hIcon == (HICON)NULL) {
-        FreeResource( rsc_mem );
-	return 0;
-    }
-    lpico = (ICONALLOC *)GlobalLock(hIcon);
-    lpico->descriptor = *lpicodesc;
-    width = lpicodesc->Width;
-    height = lpicodesc->Height;
-    FreeResource( rsc_mem );
-    if (!(hRsrc = FindResource( instance,
-                              MAKEINTRESOURCE(lpico->descriptor.icoDIBOffset), 
-                              RT_ICON ))) return 0;
-    if (!(rsc_mem = LoadResource( instance, hRsrc ))) return 0;
-
-    bmi = (BITMAPINFO *)LockResource(rsc_mem);
-    size = DIB_BitmapInfoSize( bmi, DIB_RGB_COLORS );
-    pInfo = (BITMAPINFO *)malloc( size );
-    memcpy( pInfo, bmi, size );
-    bih = &pInfo->bmiHeader;
-    bih->biHeight /= 2;
-
-    if (!(hdc = GetDC( 0 ))) return 0;
-    if (bih->biSize != sizeof(BITMAPINFOHEADER)) return 0;
-    lpico->hBitmap = CreateDIBitmap( hdc, &pInfo->bmiHeader, CBM_INIT,
-                                    (char*)bmi + size, pInfo, DIB_RGB_COLORS );
-
-    if (bih->biCompression != BI_RGB)
-    {
-	fprintf(stderr,"Unknown size for compressed Icon bitmap.\n");
-	FreeResource( rsc_mem );
-	ReleaseDC( 0, hdc); 
-	return 0;
-    }
-    bits = (char *)bmi + size +
-      DIB_GetImageWidthBytes(bih->biWidth,bih->biBitCount) * bih->biHeight;
-    bih->biBitCount = 1;
-    bih->biClrUsed = bih->biClrImportant = 2;
-    rgbq = &pInfo->bmiColors[0];
-    rgbq[0].rgbBlue = rgbq[0].rgbGreen = rgbq[0].rgbRed = 0x00;
-    rgbq[1].rgbBlue = rgbq[1].rgbGreen = rgbq[1].rgbRed = 0xff;
-    rgbq[0].rgbReserved = rgbq[1].rgbReserved = 0;
-    lpico->hBitMask = CreateDIBitmap(hdc, &pInfo->bmiHeader, CBM_INIT,
-                                     bits, pInfo, DIB_RGB_COLORS );
-    FreeResource( rsc_mem );
-    ReleaseDC( 0, hdc);
-    free( pInfo );
-    GlobalUnlock(hIcon);
-    dprintf_resource(stddeb,"LoadIcon Alloc hIcon=%X\n", hIcon);
-    return hIcon;
+        fprintf(stderr, "DirectResAlloc: wType = %x\n", wType);
+    return GLOBAL_Alloc(GMEM_MOVEABLE, wSize, hInstance, FALSE, FALSE, FALSE);
 }
 
 
-/**********************************************************************
- *			CreateIcon [USER.407]
- */
-HICON CreateIcon(HANDLE hInstance, int nWidth, int nHeight, 
-                 BYTE nPlanes, BYTE nBitsPixel, LPSTR lpANDbits, 
-                 LPSTR lpXORbits)
-{
-    HICON 	hIcon;
-    ICONALLOC	*lpico;
-
-    dprintf_resource(stddeb, "CreateIcon: hInstance = %04x, nWidth = %08x, nHeight = %08x \n",
-	    hInstance, nWidth, nHeight);
-    dprintf_resource(stddeb, "  nPlanes = %04x, nBitsPixel = %04x,",nPlanes, nBitsPixel);
-    dprintf_resource(stddeb, " lpANDbits= %04x, lpXORbits = %04x, \n", (int)lpANDbits,
-    		(int)lpXORbits);
-
-    if (hInstance == (HANDLE)NULL) { 
-        printf("CreateIcon / hInstance %04x not Found!\n",hInstance);
-        return 0;
-	}
-    hIcon = GlobalAlloc(GMEM_MOVEABLE, sizeof(ICONALLOC) + 1024);
-    if (hIcon == (HICON)NULL) {
-	printf("Can't allocate memory for Icon in CreateIcon\n");
-	return 0;
-	}
-    lpico= (ICONALLOC *)GlobalLock(hIcon);
-
-    lpico->descriptor.Width=nWidth;
-    lpico->descriptor.Height=nHeight;
-    lpico->descriptor.ColorCount=16; /* Dummy Value */ 
-    lpico->descriptor.Reserved1=0;
-    lpico->descriptor.Reserved2=nPlanes;
-    lpico->descriptor.Reserved3=nWidth*nHeight;
-
-    /* either nPlanes and/or nBitCount is set to one */
-    lpico->descriptor.icoDIBSize=nWidth*nHeight*nPlanes*nBitsPixel; 
-    lpico->descriptor.icoDIBOffset=0; 
-
-    if( !(lpico->hBitmap=CreateBitmap(nWidth, nHeight, nPlanes, nBitsPixel, 
-                                 lpXORbits)) ) {
-      printf("CreateIcon: couldn't create the XOR bitmap\n");
-      return(0);
-    }
-    
-    /* the AND BitMask is always monochrome */
-    if( !(lpico->hBitMask=CreateBitmap(nWidth, nHeight, 1, 1, lpANDbits)) ) {
-      printf("CreateIcon: couldn't create the AND bitmap\n");
-      return(0);
-    }
-
-    GlobalUnlock(hIcon);
-    dprintf_resource(stddeb, "CreateIcon Alloc hIcon=%X\n", hIcon);
-    return hIcon;
-}
-
-/**********************************************************************
- *			DestroyIcon [USER.457]
- */
-BOOL DestroyIcon(HICON hIcon)
-{
-    ICONALLOC	*lpico;
-    
-    if (hIcon == (HICON)NULL)
-    	return FALSE;
-    lpico = (ICONALLOC *)GlobalLock(hIcon);
-    if (lpico->hBitmap != (HBITMAP)NULL) 
-    	DeleteObject(lpico->hBitmap);
-    GlobalFree(hIcon);
-    return TRUE;
-}
-
-/**********************************************************************
- *          DumpIcon [USER.459]
- */
-DWORD DumpIcon(void* cursorIconInfo, WORD FAR *lpLen, LPSTR FAR *lpXorBits,
-	LPSTR FAR *lpAndMask)
-{
-	dprintf_resource(stdnimp,"DumpIcon: Empty Stub!!!\n");
-	return 0;
-}
-
-
 /**********************************************************************
  *			LoadAccelerators	[USER.177]
  */
@@ -504,10 +251,10 @@ HANDLE LoadAccelerators(HANDLE instance, SEGPTR lpTableName)
     int 	i, n;
 
     if (HIWORD(lpTableName))
-        dprintf_accel( stddeb, "LoadAccelerators: %04x '%s'\n",
+        dprintf_accel( stddeb, "LoadAccelerators: "NPFMT" '%s'\n",
                       instance, (char *)PTR_SEG_TO_LIN( lpTableName ) );
     else
-        dprintf_accel( stddeb, "LoadAccelerators: %04x %04x\n",
+        dprintf_accel( stddeb, "LoadAccelerators: "NPFMT" %04x\n",
                        instance, LOWORD(lpTableName) );
 
     if (!(hRsrc = FindResource( instance, lpTableName, RT_ACCELERATOR )))
@@ -553,7 +300,7 @@ int TranslateAccelerator(HWND hWnd, HANDLE hAccel, LPMSG msg)
 	msg->message != WM_SYSKEYUP &&
     	msg->message != WM_CHAR) return 0;
 
-    dprintf_accel(stddeb, "TranslateAccelerators hAccel=%04X !\n", hAccel);
+    dprintf_accel(stddeb, "TranslateAccelerators hAccel="NPFMT" !\n", hAccel);
 
     lpAccelTbl = (LPACCELHEADER)GlobalLock(hAccel);
     for (i = 0; i < lpAccelTbl->wCount; i++) {
@@ -600,7 +347,7 @@ LoadString(HANDLE instance, WORD resource_id, LPSTR buffer, int buflen)
     int string_num;
     int i;
 
-    dprintf_resource(stddeb, "LoadString: instance = %04x, id = %d, buffer = %08x, "
+    dprintf_resource(stddeb, "LoadString: instance = "NPFMT", id = %04x, buffer = %08x, "
 	   "length = %d\n", instance, resource_id, (int) buffer, buflen);
 
     hrsrc = FindResource( instance, (SEGPTR)((resource_id>>4)+1), RT_STRING );
diff --git a/loader/signal.c b/loader/signal.c
index d943bc5cb26..3a560c5c78b 100644
--- a/loader/signal.c
+++ b/loader/signal.c
@@ -7,7 +7,7 @@
 #include <time.h>
 #include <setjmp.h>
 
-#if defined(__NetBSD__) || defined(__FreeBSD__)
+#if defined(__NetBSD__) || defined(__FreeBSD__) || defined(__svr4__)
 #include <sys/syscall.h>
 #include <sys/param.h>
 #else
@@ -45,7 +45,7 @@ wine_sigaction(int sig,struct sigaction * new, struct sigaction * old)
 #endif
 
 
-#ifdef linux
+#if defined(linux) || defined(__svr4__)
 static void win_fault(int signal, struct sigcontext_struct context_struct)
 {
     struct sigcontext_struct *context = &context_struct;
diff --git a/loader/task.c b/loader/task.c
index b2180f43889..ae8e2d54ad2 100644
--- a/loader/task.c
+++ b/loader/task.c
@@ -42,12 +42,15 @@ static HANDLE hDOSEnvironment = 0;
   /* TASK_Reschedule() 16-bit entry point */
 static FARPROC TASK_RescheduleProc;
 
+#ifdef WINELIB
+#define TASK_SCHEDULE()  TASK_Reschedule();
+#else
 #define TASK_SCHEDULE()  CallTo16_word_(TASK_RescheduleProc,0)
+#endif
 
 
 static HANDLE TASK_CreateDOSEnvironment(void);
 
-
 /***********************************************************************
  *           TASK_Init
  */
@@ -328,6 +331,10 @@ static void TASK_CallToStart(void)
     cs_reg = pSegTable[pModule->cs - 1].selector;
     ip_reg = pModule->ip;
     ds_reg = pSegTable[pModule->dgroup - 1].selector;
+#ifndef WINELIB
+/* JBP: I doubt a CallTo16_regs_ is possible in libwine.a, and IF1632 is not
+ *      allowed.
+ */
     IF1632_Saved16_ss = pTask->ss;
     IF1632_Saved16_sp = pTask->sp;
     dprintf_task( stddeb, "Starting main program: cs:ip=%04x:%04x ds=%04x ss:sp=%04x:%04x\n",
@@ -338,6 +345,11 @@ static void TASK_CallToStart(void)
                    pTask->hPDB /*es*/, 0 /*bp*/, 0 /*ax*/,
                    pModule->stack_size /*bx*/, pModule->heap_size /*cx*/,
                    0 /*dx*/, 0 /*si*/, ds_reg /*di*/ );
+#else
+    fprintf(stderr, "JBP: Ignoring main program: cs:ip=%04x:%04x ds=%04x ss:sp=%04x:%04x\n",
+                 cs_reg, ip_reg, ds_reg,
+                 pTask->ss, pTask->sp);
+#endif
     /* This should never return */
     fprintf( stderr, "TASK_CallToStart: Main program returned!\n" );
     TASK_KillCurrentTask( 1 );
@@ -356,11 +368,13 @@ HTASK TASK_CreateTask( HMODULE hModule, HANDLE hInstance, HANDLE hPrevInstance,
     NE_MODULE *pModule;
     SEGTABLEENTRY *pSegTable;
     LPSTR name;
+    char filename[256];
+#ifndef WINELIB32
     char *stack16Top, *stack32Top;
     STACK16FRAME *frame16;
     STACK32FRAME *frame32;
     extern DWORD CALL16_RetAddr_word;
-    char filename[256];
+#endif
     
     if (!(pModule = (NE_MODULE *)GlobalLock( hModule ))) return 0;
     pSegTable = NE_SEG_TABLE( pModule );
@@ -424,9 +438,11 @@ HTASK TASK_CreateTask( HMODULE hModule, HANDLE hInstance, HANDLE hPrevInstance,
     pTask->pdb.int20 = 0x20cd;
     pTask->pdb.dispatcher[0] = 0x9a;  /* ljmp */
     *(DWORD *)&pTask->pdb.dispatcher[1] = MODULE_GetEntryPoint( GetModuleHandle("KERNEL"), 102 );  /* KERNEL.102 is DOS3Call() */
+#ifndef WINELIB
     pTask->pdb.savedint22 = INT_GetHandler( 0x22 );
     pTask->pdb.savedint23 = INT_GetHandler( 0x23 );
     pTask->pdb.savedint24 = INT_GetHandler( 0x24 );
+#endif
     pTask->pdb.environment = hEnvironment;
     strncpy( pTask->pdb.cmdLine + 1, cmdLine, 126 );
     pTask->pdb.cmdLine[127] = '\0';
@@ -458,6 +474,7 @@ HTASK TASK_CreateTask( HMODULE hModule, HANDLE hInstance, HANDLE hPrevInstance,
 
       /* Allocate the 32-bit stack */
 
+#ifndef WINELIB
     pTask->hStack32 = GLOBAL_Alloc( GMEM_FIXED, STACK32_SIZE, pTask->hPDB,
                                     FALSE, FALSE, FALSE );
 
@@ -513,12 +530,13 @@ HTASK TASK_CreateTask( HMODULE hModule, HANDLE hInstance, HANDLE hPrevInstance,
         fprintf( stderr, "Task '%s': ", name );
         DEBUG_AddBreakpoint( &addr );
     }
+#endif
 
       /* Add the task to the linked list */
 
     TASK_LinkTask( hTask );
 
-    dprintf_task( stddeb, "CreateTask: module='%s' cmdline='%s' task=%04x\n",
+    dprintf_task( stddeb, "CreateTask: module='%s' cmdline='%s' task="NPFMT"\n",
                   name, cmdLine, hTask );
 
     return hTask;
@@ -646,11 +664,12 @@ void TASK_Reschedule(void)
     if (!hTask) return;  /* Do nothing */
 
     pNewTask = (TDB *)GlobalLock( hTask );
-    dprintf_task( stddeb, "Switching to task %04x (%.8s)\n",
+    dprintf_task( stddeb, "Switching to task "NPFMT" (%.8s)\n",
                   hTask, pNewTask->module_name );
 
       /* 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;
@@ -658,6 +677,7 @@ void TASK_Reschedule(void)
         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) */
 
@@ -669,10 +689,12 @@ void TASK_Reschedule(void)
       /* 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_GlobalLock( pNewTask->hStack32 );
+#endif
 }
 
 
@@ -722,9 +744,9 @@ void InitTask( struct sigcontext_struct context )
     context.sc_ebx = 0x81;
     context.sc_ecx = pModule->stack_size;
     context.sc_edx = pTask->nCmdShow;
-    context.sc_esi = pTask->hPrevInstance;
-    context.sc_edi = pTask->hInstance;
-    context.sc_es  = pTask->hPDB;
+    context.sc_esi = (DWORD)pTask->hPrevInstance;
+    context.sc_edi = (DWORD)pTask->hInstance;
+    context.sc_es  = (WORD)pTask->hPDB;
 
     /* Initialize the local heap */
     if ( pModule->heap_size )
@@ -741,7 +763,9 @@ void InitTask( struct sigcontext_struct context )
     pinstance = (INSTANCEDATA *)PTR_SEG_OFF_TO_LIN(CURRENT_DS, 0);
     pinstance->stackbottom = stackhi; /* yup, that's right. Confused me too. */
     pinstance->stacktop    = stacklow; 
+#ifndef WINELIB /* FIXME: JBP: IF1632 not allowed in libwine.a */
     pinstance->stackmin    = IF1632_Saved16_sp;
+#endif
 }
 
 
@@ -869,12 +893,14 @@ FARPROC MakeProcInstance( FARPROC func, HANDLE hInstance )
     if (!thunkaddr) return (FARPROC)0;
     thunk = PTR_SEG_TO_LIN( thunkaddr );
 
-    dprintf_task( stddeb, "MakeProcInstance(%08lx,%04x): got thunk %08lx\n",
+    dprintf_task( stddeb, "MakeProcInstance(%08lx,"NPFMT"): got thunk %08lx\n",
                   (SEGPTR)func, hInstance, (SEGPTR)thunkaddr );
     
     *thunk++ = 0xb8;    /* movw instance, %ax */
+#ifndef WINELIB
     *thunk++ = (BYTE)(hInstance & 0xff);
     *thunk++ = (BYTE)(hInstance >> 8);
+#endif
     *thunk++ = 0xea;    /* ljmp func */
     *(DWORD *)thunk = (DWORD)func;
     return (FARPROC)thunkaddr;
@@ -908,7 +934,7 @@ HANDLE GetCodeHandle( FARPROC proc )
     else
         handle = GlobalHandle( HIWORD(proc) );
 
-    printf( "STUB: GetCodeHandle(%08lx) returning %04x\n",
+    printf( "STUB: GetCodeHandle(%08lx) returning "NPFMT"\n",
             (DWORD)proc, handle );
     return handle;
 }
@@ -949,14 +975,18 @@ HGLOBAL GetTaskQueue( HANDLE hTask )
 HTASK GetCurrentTask(void)
 {
       /* Undocumented: first task is returned in high word */
+#ifdef WINELIB32
+    return hCurrentTask;
+#else
     return MAKELONG( hCurrentTask, hFirstTask );
+#endif
 }
 
 
 /***********************************************************************
  *           GetCurrentPDB   (KERNEL.37)
  */
-WORD GetCurrentPDB(void)
+HANDLE GetCurrentPDB(void)
 {
     TDB *pTask;
 
@@ -986,7 +1016,7 @@ SEGPTR GetDOSEnvironment(void)
     TDB *pTask;
 
     if (!(pTask = (TDB *)GlobalLock( hCurrentTask ))) return 0;
-    return WIN16_GlobalLock( pTask->pdb.environment );
+    return (SEGPTR)WIN16_GlobalLock( pTask->pdb.environment );
 }
 
 
@@ -1002,7 +1032,7 @@ WORD GetNumTasks(void)
 /***********************************************************************
  *           GetTaskDS   (KERNEL.155)
  */
-WORD GetTaskDS(void)
+HINSTANCE GetTaskDS(void)
 {
     TDB *pTask;
 
@@ -1040,7 +1070,12 @@ HMODULE GetExePtr( HANDLE handle )
 
       /* Check the owner for module handle */
 
+#ifndef WINELIB
     owner = FarGetOwner( handle );
+#else
+    owner = NULL;
+    fprintf(stderr,"JBP: FarGetOwner() ignored.\n");
+#endif
     if (!(ptr = GlobalLock( owner ))) return 0;
     if (((NE_MODULE *)ptr)->magic == NE_SIGNATURE) return owner;
 
@@ -1082,7 +1117,7 @@ BOOL TaskNext( TASKENTRY *lpte )
     TDB *pTask;
     INSTANCEDATA *pInstData;
 
-    dprintf_toolhelp( stddeb, "TaskNext(%p): task=%04x\n", lpte, lpte->hNext );
+    dprintf_toolhelp( stddeb, "TaskNext(%p): task="NPFMT"\n", lpte, lpte->hNext );
     if (!lpte->hNext) return FALSE;
     pTask = (TDB *)GlobalLock( lpte->hNext );
     if (!pTask || pTask->magic != TDB_MAGIC) return FALSE;
diff --git a/memory/Imakefile b/memory/Imakefile
deleted file mode 100644
index 5d738d1f69b..00000000000
--- a/memory/Imakefile
+++ /dev/null
@@ -1,19 +0,0 @@
-#include "../Wine.tmpl"
-
-MODULE = memory
-
-SRCS = \
-	atom.c \
-	global.c \
-	ldt.c \
-	local.c \
-	selector.c
-
-OBJS = $(SRCS:.c=.o)
-
-WineRelocatableTarget($(MODULE),,$(OBJS))
-DependTarget()
-
-includes::
-
-install::
diff --git a/memory/global.c b/memory/global.c
index 83f0dda282f..0689c88faff 100644
--- a/memory/global.c
+++ b/memory/global.c
@@ -409,7 +409,7 @@ SEGPTR WIN16_GlobalLock( HGLOBAL handle )
  *
  * This is the GlobalLock() function used by 32-bit code.
  */
-LPSTR GlobalLock( HGLOBAL handle )
+LPVOID GlobalLock( HGLOBAL handle )
 {
     if (!handle) return 0;
 #ifdef CONFIG_IPC
@@ -446,7 +446,7 @@ DWORD GlobalSize( HGLOBAL handle )
 DWORD GlobalHandle( WORD sel )
 {
     dprintf_global( stddeb, "GlobalHandle: %04x\n", sel );
-    return MAKELONG( GET_ARENA_PTR(sel)->handle, sel );
+    return MAKELONG( GET_ARENA_PTR(sel)->handle, GlobalHandleToSel(sel) );
 }
 
 
diff --git a/memory/ldt.c b/memory/ldt.c
index 2b07893656e..9500f2bd51f 100644
--- a/memory/ldt.c
+++ b/memory/ldt.c
@@ -7,7 +7,11 @@
 
 #include <stdio.h>
 #include <stdlib.h>
+#ifdef __svr4__
+#include <string.h>
+#else
 #include <strings.h>
+#endif
 #include <errno.h>
 #include "ldt.h"
 #include "stddebug.h"
@@ -22,6 +26,10 @@
 
 _syscall3(int, modify_ldt, int, func, void *, ptr, unsigned long, bytecount)
 #endif  /* linux */
+#ifdef __svr4__
+#include <sys/sysi86.h>
+#include <sys/seg.h>
+#endif
 
 #if defined(__NetBSD__) || defined(__FreeBSD__)
 #include <machine/segments.h>
@@ -148,6 +156,35 @@ int LDT_SetEntry( int entry, const ldt_entry *content )
         }
     }
 #endif  /* __NetBSD__ || __FreeBSD__ */
+#ifdef __svr4__
+{
+    struct ssd ldt_mod;
+    int i;
+    ldt_mod.sel = ENTRY_TO_SELECTOR(entry) | 4;
+    ldt_mod.bo = content->base;
+    ldt_mod.ls = content->limit;
+    i =   (content->limit & 0xf0000) |
+        (content->type << 10) |
+            (((content->read_only != 0) ^ 1) << 9) |
+                ((content->seg_32bit != 0) << 22) |
+                    ((content->limit_in_pages != 0)<< 23) |
+                        (1<<15) |
+                            0x7000;
+
+    ldt_mod.acc1 = (i & 0xff00) >> 8;
+    ldt_mod.acc2 = (i & 0xf00000) >> 20;
+    
+    
+    if (content->base == 0)
+    {
+        ldt_mod.acc1 =  0;
+        ldt_mod.acc2 = 0;
+    }    
+    if ((i = sysi86(SI86DSCR, &ldt_mod)) == -1)
+        perror("sysi86");
+    
+}    
+#endif
 #endif  /* ifndef WINELIB */
 
     if (ret < 0) return ret;
@@ -168,12 +205,13 @@ int LDT_SetEntry( int entry, const ldt_entry *content )
  *
  * Print the content of the LDT on stdout.
  */
-void LDT_Print()
+void LDT_Print( int start, int length )
 {
     int i;
     char flags[3];
 
-    for (i = 0; i < LDT_SIZE; i++)
+    if (length == -1) length = LDT_SIZE - start;
+    for (i = start; i < start + length; i++)
     {
         if (!ldt_copy[i].base && !ldt_copy[i].limit) continue; /* Free entry */
         if ((ldt_flags_copy[i] & LDT_FLAGS_TYPE) == SEGMENT_CODE)
diff --git a/memory/local.c b/memory/local.c
index fa5845b56ef..9f215af5359 100644
--- a/memory/local.c
+++ b/memory/local.c
@@ -285,7 +285,7 @@ static void LOCAL_PrintHeap( WORD ds )
 /***********************************************************************
  *           LocalInit   (KERNEL.4)
  */
-HLOCAL LocalInit( WORD selector, WORD start, WORD end )
+BOOL LocalInit( HANDLE selector, WORD start, WORD end )
 {
     char *ptr;
     WORD heapInfoArena, freeArena, lastArena;
@@ -672,7 +672,7 @@ static HLOCAL LOCAL_FreeArena( WORD ds, WORD arena )
  *
  * Implementation of LocalFree().
  */
-HLOCAL LOCAL_Free( WORD ds, HLOCAL handle )
+HLOCAL LOCAL_Free( HANDLE ds, HLOCAL handle )
 {
     char *ptr = PTR_SEG_OFF_TO_LIN( ds, 0 );
     WORD arena;
@@ -696,7 +696,7 @@ HLOCAL LOCAL_Free( WORD ds, HLOCAL handle )
  *
  * Implementation of LocalAlloc().
  */
-HLOCAL LOCAL_Alloc( WORD ds, WORD flags, WORD size )
+HLOCAL LOCAL_Alloc( HANDLE ds, WORD flags, WORD size )
 {
     char *ptr;
     HLOCAL handle;
@@ -732,7 +732,7 @@ HLOCAL LOCAL_Alloc( WORD ds, WORD flags, WORD size )
  *
  * Implementation of LocalReAlloc().
  */
-HLOCAL LOCAL_ReAlloc( WORD ds, HLOCAL handle, WORD size, WORD flags )
+HLOCAL LOCAL_ReAlloc( HANDLE ds, HLOCAL handle, WORD size, WORD flags )
 {
     char *ptr = PTR_SEG_OFF_TO_LIN( ds, 0 );
     LOCALHEAPINFO *pInfo;
@@ -820,7 +820,7 @@ HLOCAL LOCAL_ReAlloc( WORD ds, HLOCAL handle, WORD size, WORD flags )
 /***********************************************************************
  *           LOCAL_Lock
  */
-WORD LOCAL_Lock( WORD ds, HLOCAL handle )
+HANDLE LOCAL_Lock( HANDLE ds, HLOCAL handle )
 {
     char *ptr = PTR_SEG_OFF_TO_LIN( ds, 0 );
 
@@ -922,7 +922,7 @@ HLOCAL LocalFree( HLOCAL handle )
 /***********************************************************************
  *           LocalLock   (KERNEL.8)
  */
-WORD LocalLock( HLOCAL handle )
+NPVOID LocalLock( HLOCAL handle )
 {
     return LOCAL_Lock( CURRENT_DS, handle );
 }
diff --git a/memory/selector.c b/memory/selector.c
index fed873d1908..8ca361a359b 100644
--- a/memory/selector.c
+++ b/memory/selector.c
@@ -358,7 +358,7 @@ BOOL IsBadStringPtr( SEGPTR ptr, WORD size )
     LDT_GetEntry( SELECTOR_TO_ENTRY(sel), &entry );
     if ((entry.type == SEGMENT_CODE) && entry.read_only) return TRUE;
     if (strlen(PTR_SEG_TO_LIN(ptr)) < size) size = strlen(PTR_SEG_TO_LIN(ptr));
-    if (OFFSETOF(ptr) + size > entry.limit) return TRUE;
+    if (OFFSETOF(ptr) + size - 1 > entry.limit) return TRUE;
     return FALSE;
 }
 
@@ -376,7 +376,7 @@ BOOL IsBadHugeReadPtr( SEGPTR ptr, DWORD size )
     if (IS_SELECTOR_FREE(sel)) return TRUE;
     LDT_GetEntry( SELECTOR_TO_ENTRY(sel), &entry );
     if ((entry.type == SEGMENT_CODE) && entry.read_only) return TRUE;
-    if (OFFSETOF(ptr) + size > entry.limit) return TRUE;
+    if (OFFSETOF(ptr) + size - 1 > entry.limit) return TRUE;
     return FALSE;
 }
 
@@ -394,7 +394,7 @@ BOOL IsBadHugeWritePtr( SEGPTR ptr, DWORD size )
     if (IS_SELECTOR_FREE(sel)) return TRUE;
     LDT_GetEntry( SELECTOR_TO_ENTRY(sel), &entry );
     if ((entry.type == SEGMENT_CODE) || entry.read_only) return TRUE;
-    if (OFFSETOF(ptr) + size > entry.limit) return TRUE;
+    if (OFFSETOF(ptr) + size - 1 > entry.limit) return TRUE;
     return FALSE;
 }
 
diff --git a/misc/Imakefile b/misc/Imakefile
deleted file mode 100644
index 2b89bd7419f..00000000000
--- a/misc/Imakefile
+++ /dev/null
@@ -1,42 +0,0 @@
-#include "../Wine.tmpl"
-
-MODULE = misc
-
-SRCS = \
-	clipboard.c \
-	comm.c \
-	commdlg.c \
-	compobj.c \
-	dos_fs.c \
-	driver.c \
-	exec.c \
-	escape.c \
-	file.c \
-	keyboard.c \
-	kernel32.c \
-	lstr.c \
-	main.c \
-	ole2.c \
-	ole2disp.c \
-	ole2nls.c \
-	olecli.c \
-	olesvr.c \
-	network.c \
-	profile.c \
-	rect.c \
-	shell.c \
-	sound.c \
-	spy.c \
-	stress.c \
-	user.c \
-	user32.c \
-	winsocket.c
-
-OBJS = $(SRCS:.c=.o)
-
-WineRelocatableTarget($(MODULE),,$(OBJS))
-DependTarget()
-
-includes::
-
-install::
diff --git a/misc/Makefile.in b/misc/Makefile.in
index c606b940759..778e331cd61 100644
--- a/misc/Makefile.in
+++ b/misc/Makefile.in
@@ -12,7 +12,6 @@ C_SRCS = \
 	escape.c \
 	file.c \
 	keyboard.c \
-	kernel32.c \
 	lstr.c \
 	main.c \
 	ole2.c \
diff --git a/misc/clipboard.c b/misc/clipboard.c
index fef309d569c..d3df59d0ecb 100644
--- a/misc/clipboard.c
+++ b/misc/clipboard.c
@@ -59,7 +59,7 @@ BOOL OpenClipboard(HWND hWnd)
 {
     if (hWndClipboardOwner != 0) return FALSE;
     hWndClipboardOwner = hWnd;
-    dprintf_clipboard(stddeb,"OpenClipboard(%04X); !\n", hWnd);
+    dprintf_clipboard(stddeb,"OpenClipboard("NPFMT"); !\n", hWnd);
     return TRUE;
 }
 
@@ -107,7 +107,7 @@ BOOL EmptyClipboard()
 HWND GetClipboardOwner()
 {
     dprintf_clipboard(stddeb,
-		"GetClipboardOwner() = %04X !\n", hWndClipboardOwner);
+		"GetClipboardOwner() = "NPFMT" !\n", hWndClipboardOwner);
     return hWndClipboardOwner;
 }
 
@@ -119,7 +119,7 @@ HANDLE SetClipboardData(WORD wFormat, HANDLE hData)
 {
     LPCLIPFORMAT lpFormat = ClipFormats; 
     dprintf_clipboard(stddeb,
-		"SetClipboardDate(%04X, %04X) !\n", wFormat, hData);
+		"SetClipboardDate(%04X, "NPFMT") !\n", wFormat, hData);
     while(TRUE) {
 	if (lpFormat == NULL) return 0;
 	if (lpFormat->wFormatID == wFormat) break;
@@ -173,7 +173,7 @@ int CountClipboardFormats()
 	if (lpFormat == NULL) break;
 	if (lpFormat->hData != 0) {
         dprintf_clipboard(stddeb,
-		"CountClipboardFormats // Find Not Empty (%04X) !\n",
+		"CountClipboardFormats // Find Not Empty ("NPFMT") !\n",
 					lpFormat->hData);
 	    FormatCount++;
 	    }
@@ -211,7 +211,7 @@ WORD EnumClipboardFormats(WORD wFormat)
 	lpFormat = lpFormat->NextFormat;
 	}
     dprintf_clipboard(stddeb,
-		"EnumClipboardFormats // Find Not Empty Id=%04X hData=%04X !\n",
+		"EnumClipboardFormats // Find Not Empty Id=%04X hData="NPFMT" !\n",
 				lpFormat->wFormatID, lpFormat->hData);
     return lpFormat->wFormatID;
 }
@@ -279,7 +279,7 @@ int GetClipboardFormatName(WORD wFormat, LPSTR retStr, short maxlen)
 HWND SetClipboardViewer(HWND hWnd)
 {
     HWND hwndPrev = hWndViewer;
-    dprintf_clipboard(stddeb,"SetClipboardViewer(%04X) !\n", hWnd);
+    dprintf_clipboard(stddeb,"SetClipboardViewer("NPFMT") !\n", hWnd);
     hWndViewer = hWnd;
     return hwndPrev;
 }
@@ -290,7 +290,7 @@ HWND SetClipboardViewer(HWND hWnd)
  */
 HWND GetClipboardViewer()
 {
-    dprintf_clipboard(stddeb,"GetClipboardFormat() = %04X !\n", hWndViewer);
+    dprintf_clipboard(stddeb,"GetClipboardFormat() = "NPFMT" !\n", hWndViewer);
     return hWndViewer;
 }
 
@@ -301,7 +301,7 @@ HWND GetClipboardViewer()
 BOOL ChangeClipboardChain(HWND hWnd, HWND hWndNext)
 {
     dprintf_clipboard(stdnimp,
-		"ChangeClipboardChain(%04X, %04X) !\n", hWnd, hWndNext);
+		"ChangeClipboardChain("NPFMT", "NPFMT") !\n", hWnd, hWndNext);
 
      return 0;
 }
@@ -331,7 +331,7 @@ BOOL IsClipboardFormatAvailable(WORD wFormat)
 HWND GetOpenClipboardWindow()
 {
     dprintf_clipboard(stddeb,
-		"GetOpenClipboardWindow() = %04X !\n", hWndClipboardOwner);
+		"GetOpenClipboardWindow() = "NPFMT" !\n", hWndClipboardOwner);
     return hWndClipboardOwner;
 }
 
diff --git a/misc/comm.c b/misc/comm.c
index 4da7e7e4c41..bce491c8bff 100644
--- a/misc/comm.c
+++ b/misc/comm.c
@@ -358,6 +358,7 @@ LONG EscapeCommFunction(int fd, int nFunction)
 			port.c_cflag &= TIOCM_RTS;
 			break;
 	
+#ifndef __svr4__
 		case SETDTR:
 			port.c_cflag |= CRTSCTS;
 			break;
@@ -365,6 +366,7 @@ LONG EscapeCommFunction(int fd, int nFunction)
 		case SETRTS:
 			port.c_cflag |= CRTSCTS;
 			break;
+#endif
 
 		case SETXOFF:
 			port.c_iflag |= IXOFF;
@@ -618,11 +620,13 @@ int SetCommState(DCB FAR *lpdcb)
 			commerror = IE_BYTESIZE;
 			return -1;
 	}
+#ifndef __svr4__
 
 	if (lpdcb->fDtrflow || lpdcb->fRtsflow || lpdcb->fOutxCtsFlow)
 		port.c_cflag |= CRTSCTS;
 
 	if (lpdcb->fDtrDisable) 
+#endif
 		port.c_cflag &= ~CRTSCTS;
 	
 	if (lpdcb->fInX)
@@ -724,12 +728,14 @@ int GetCommState(int fd, DCB FAR *lpdcb)
 	lpdcb->fChEvt = 0;
 	lpdcb->fBinary = 1;
 
+#ifndef __svr4__
 	lpdcb->fDtrDisable = 0;
 	if (port.c_cflag & CRTSCTS) {
 		lpdcb->fDtrflow = 1;
 		lpdcb->fRtsflow = 1;
 		lpdcb->fOutxCtsFlow = 1;
 		lpdcb->fOutxDsrFlow = 1;
+#endif
 	} else 
 		lpdcb->fDtrDisable = 1;
 
diff --git a/misc/commdlg.c b/misc/commdlg.c
index 774cc84fb62..f85624fb61c 100644
--- a/misc/commdlg.c
+++ b/misc/commdlg.c
@@ -83,7 +83,7 @@ BOOL GetOpenFileName(LPOPENFILENAME lpofn)
         return FALSE;
     }
 
-    hInst = GetWindowWord( lpofn->hwndOwner, GWW_HINSTANCE );
+    hInst = WIN_GetWindowInstance( lpofn->hwndOwner );
     bRet = DialogBoxIndirectParam( hInst, hDlgTmpl, lpofn->hwndOwner,
                                    GetWndProcEntry16("FileOpenDlgProc"),
                                    (DWORD)lpofn );
@@ -130,7 +130,7 @@ BOOL GetSaveFileName(LPOPENFILENAME lpofn)
                                         TRUE, NULL );
 
 
-    hInst = GetWindowWord( lpofn->hwndOwner, GWW_HINSTANCE );
+    hInst = WIN_GetWindowInstance( lpofn->hwndOwner );
     bRet = DialogBoxIndirectParam( hInst, hDlgTmpl, lpofn->hwndOwner,
                                    GetWndProcEntry16("FileSaveDlgProc"),
                                    (DWORD)lpofn); 
@@ -513,7 +513,13 @@ static LONG FILEDLG_WMCommand(HWND hWnd, WORD wParam, LONG lParam)
 	strcpy(PTR_SEG_TO_LIN(lpofn->lpstrFile), tmpstr2);
       }
       lpofn->nFileOffset = 0;
-      lpofn->nFileExtension = strlen(PTR_SEG_TO_LIN(lpofn->lpstrFile)) - 3;
+      lpofn->nFileExtension = 0;
+      while(tmpstr2[lpofn->nFileExtension] != '.' && tmpstr2[lpofn->nFileExtension] != '\0')
+        lpofn->nFileExtension++;
+      if (lpofn->nFileExtension == '\0')
+	lpofn->nFileExtension = 0;
+      else
+	lpofn->nFileExtension++;
       if (PTR_SEG_TO_LIN(lpofn->lpstrFileTitle) != NULL) 
 	{
 	  lRet = SendDlgItemMessage(hWnd, lst1, LB_GETCURSEL, 0, 0);
@@ -534,7 +540,7 @@ static LONG FILEDLG_WMCommand(HWND hWnd, WORD wParam, LONG lParam)
 /***********************************************************************
  *           FileOpenDlgProc   (COMMDLG.6)
  */
-BOOL FileOpenDlgProc(HWND hWnd, WORD wMsg, WORD wParam, LONG lParam)
+LRESULT FileOpenDlgProc(HWND hWnd, UINT wMsg, WPARAM wParam, LPARAM lParam)
 {  
   switch (wMsg)
     {
@@ -568,7 +574,7 @@ BOOL FileOpenDlgProc(HWND hWnd, WORD wMsg, WORD wParam, LONG lParam)
 /***********************************************************************
  *           FileSaveDlgProc   (COMMDLG.7)
  */
-BOOL FileSaveDlgProc(HWND hWnd, WORD wMsg, WORD wParam, LONG lParam)
+LRESULT FileSaveDlgProc(HWND hWnd, UINT wMsg, WPARAM wParam, LPARAM lParam)
 {
   switch (wMsg) {
    case WM_INITDIALOG:
@@ -614,7 +620,7 @@ BOOL ChooseColor(LPCHOOSECOLOR lpChCol)
     hDlgTmpl = GLOBAL_CreateBlock(GMEM_FIXED, sysres_DIALOG_CHOOSE_COLOR.bytes,
                                   sysres_DIALOG_CHOOSE_COLOR.size,
                                   GetCurrentPDB(), FALSE, FALSE, TRUE, NULL );
-    hInst = GetWindowWord( lpChCol->hwndOwner, GWW_HINSTANCE );
+    hInst = WIN_GetWindowInstance( lpChCol->hwndOwner );
     bRet = DialogBoxIndirectParam( hInst, hDlgTmpl, lpChCol->hwndOwner,
                                    GetWndProcEntry16("ColorDlgProc"), 
                                    (DWORD)lpChCol );
@@ -626,7 +632,7 @@ BOOL ChooseColor(LPCHOOSECOLOR lpChCol)
 /***********************************************************************
  *           ColorDlgProc   (COMMDLG.8)
  */
-BOOL ColorDlgProc(HWND hWnd, WORD wMsg, WORD wParam, LONG lParam)
+LRESULT ColorDlgProc(HWND hWnd, UINT wMsg, WPARAM wParam, LPARAM lParam)
 {
   switch (wMsg) 
     {
@@ -661,7 +667,7 @@ BOOL FindText(LPFINDREPLACE lpFind)
     hDlgTmpl = GLOBAL_CreateBlock(GMEM_FIXED, sysres_DIALOG_FIND_TEXT.bytes,
                                   sysres_DIALOG_FIND_TEXT.size,
                                   GetCurrentPDB(), FALSE, FALSE, TRUE, NULL );
-    hInst = GetWindowWord( lpFind->hwndOwner, GWW_HINSTANCE );
+    hInst = WIN_GetWindowInstance( lpFind->hwndOwner );
     bRet = DialogBoxIndirectParam( hInst, hDlgTmpl, lpFind->hwndOwner,
                                    GetWndProcEntry16("FindTextDlgProc"), 
                                    (DWORD)lpFind );
@@ -681,7 +687,7 @@ BOOL ReplaceText(LPFINDREPLACE lpFind)
     hDlgTmpl = GLOBAL_CreateBlock(GMEM_FIXED, sysres_DIALOG_REPLACE_TEXT.bytes,
                                   sysres_DIALOG_REPLACE_TEXT.size,
                                   GetCurrentPDB(), FALSE, FALSE, TRUE, NULL );
-    hInst = GetWindowWord( lpFind->hwndOwner, GWW_HINSTANCE );
+    hInst = WIN_GetWindowInstance( lpFind->hwndOwner );
     bRet = DialogBoxIndirectParam( hInst, hDlgTmpl, lpFind->hwndOwner,
                                    GetWndProcEntry16("ReplaceTextDlgProc"), 
                                    (DWORD)lpFind );
@@ -693,7 +699,7 @@ BOOL ReplaceText(LPFINDREPLACE lpFind)
 /***********************************************************************
  *           FindTextDlgProc   (COMMDLG.13)
  */
-BOOL FindTextDlgProc(HWND hWnd, WORD wMsg, WORD wParam, LONG lParam)
+LRESULT FindTextDlgProc(HWND hWnd, UINT wMsg, WPARAM wParam, LPARAM lParam)
 {
   switch (wMsg)
     {
@@ -720,7 +726,7 @@ BOOL FindTextDlgProc(HWND hWnd, WORD wMsg, WORD wParam, LONG lParam)
 /***********************************************************************
  *           ReplaceTextDlgProc   (COMMDLG.14)
  */
-BOOL ReplaceTextDlgProc(HWND hWnd, WORD wMsg, WORD wParam, LONG lParam)
+LRESULT ReplaceTextDlgProc(HWND hWnd, UINT wMsg, WPARAM wParam, LPARAM lParam)
 {
   switch (wMsg)
     {
@@ -754,6 +760,10 @@ BOOL PrintDlg(LPPRINTDLG lpPrint)
 
     printf("PrintDlg(%p) // Flags=%08lX\n", lpPrint, lpPrint->Flags );
 
+    if (lpPrint->Flags & PD_RETURNDEFAULT)
+        /* FIXME: should fill lpPrint->hDevMode and lpPrint->hDevNames here */
+        return TRUE;
+
     if (lpPrint->Flags & PD_PRINTSETUP)
         hDlgTmpl = GLOBAL_CreateBlock( GMEM_FIXED,
                                        sysres_DIALOG_PRINT_SETUP.bytes,
@@ -766,7 +776,7 @@ BOOL PrintDlg(LPPRINTDLG lpPrint)
                                        GetCurrentPDB(), FALSE,
                                        FALSE, TRUE, NULL );
 
-    hInst = GetWindowWord( lpPrint->hwndOwner, GWW_HINSTANCE );
+    hInst = WIN_GetWindowInstance( lpPrint->hwndOwner );
     bRet = DialogBoxIndirectParam( hInst, hDlgTmpl, lpPrint->hwndOwner,
                                    (lpPrint->Flags & PD_PRINTSETUP) ?
                                        GetWndProcEntry16("PrintSetupDlgProc") :
@@ -780,7 +790,7 @@ BOOL PrintDlg(LPPRINTDLG lpPrint)
 /***********************************************************************
  *           PrintDlgProc   (COMMDLG.21)
  */
-BOOL PrintDlgProc(HWND hWnd, WORD wMsg, WORD wParam, LONG lParam)
+LRESULT PrintDlgProc(HWND hWnd, UINT wMsg, WPARAM wParam, LPARAM lParam)
 {
   switch (wMsg)
     {
@@ -807,7 +817,7 @@ BOOL PrintDlgProc(HWND hWnd, WORD wMsg, WORD wParam, LONG lParam)
 /***********************************************************************
  *           PrintSetupDlgProc   (COMMDLG.22)
  */
-BOOL PrintSetupDlgProc(HWND hWnd, WORD wMsg, WORD wParam, LONG lParam)
+LRESULT PrintSetupDlgProc(HWND hWnd, UINT wMsg, WPARAM wParam, LPARAM lParam)
 {
   switch (wMsg)
     {
diff --git a/misc/dos_fs.c b/misc/dos_fs.c
index a141798fa04..66670589a85 100644
--- a/misc/dos_fs.c
+++ b/misc/dos_fs.c
@@ -24,7 +24,9 @@
 #include <sys/param.h>
 #include <sys/mount.h>
 #endif
-
+#ifdef __svr4__
+#include <sys/statfs.h>
+#endif
 #include "wine.h"
 #include "windows.h"
 #include "msdos.h"
@@ -60,6 +62,60 @@ struct DosDriveStruct {			/*  eg: */
 static struct DosDriveStruct DosDrives[MAX_DOS_DRIVES];
 static struct dosdirent *DosDirs=NULL;
 
+WORD ExtendedError;
+BYTE ErrorClass, Action, ErrorLocus;
+
+int DOS_Error(int e, int class, int el)
+{
+	ErrorClass = class;
+	Action = SA_Ask4Retry;
+	ErrorLocus = el;
+	ExtendedError = e;
+
+	return e;
+}
+
+void errno_to_doserr(void)
+{
+	switch (errno) {
+		case EAGAIN:
+			DOS_Error (ShareViolation, EC_Temporary, EL_Unknown);
+			break;
+		case EBADF:
+			DOS_Error (InvalidHandle, EC_AppError, EL_Unknown);
+			break;
+		case ENOSPC:
+			DOS_Error (DiskFull, EC_MediaError, EL_Disk);
+			break;				
+		case EACCES:
+		case EPERM:
+		case EROFS:
+			DOS_Error (WriteProtected, EC_AccessDenied, EL_Unknown);
+			break;
+		case EBUSY:
+			DOS_Error (LockViolation, EC_AccessDenied, EL_Unknown);
+			break;		
+		case ENOENT:
+			DOS_Error (FileNotFound, EC_NotFound, EL_Unknown);
+			break;				
+		case EISDIR:
+			DOS_Error (CanNotMakeDir, EC_AccessDenied, EL_Unknown);
+			break;
+		case ENFILE:
+		case EMFILE:
+			DOS_Error (NoMoreFiles, EC_MediaError, EL_Unknown);
+			break;
+		case EEXIST:
+			DOS_Error (FileExists, EC_Exists, EL_Disk);
+			break;				
+		default:
+			dprintf_int(stddeb, "int21: unknown errno %d!\n", errno);
+			DOS_Error (GeneralFailure, EC_SystemFailure, EL_Unknown);
+			break;
+	}
+}
+
+
 static void ExpandTildeString(char *s)
 {
     struct passwd *entry;
@@ -88,7 +144,7 @@ static void ExpandTildeString(char *s)
     *s = 0;
 }
 
-/* Simplify the path in "name" by removing  "//"'s and
+/* Simplify the path in "name" by removing  "//"'s, "/./"'s, and
    ".."'s in names like "/usr/bin/../lib/test" */
 static void DOS_SimplifyPath(char *name)
 {
@@ -108,6 +164,9 @@ static void DOS_SimplifyPath(char *name)
       strcpy(p,l+3);
       changed = TRUE;
     }
+    while ((l = strstr(name, "/./"))) {
+      strcpy(l, l+2); changed = TRUE;
+    }
   } while (changed);
   dprintf_dosfs(stddeb,"SimplifyPath: After %s\n",name);
 }
@@ -569,19 +628,27 @@ int DOS_GetFreeSpace(int drive, long *size, long *available)
 	if (!DOS_ValidDrive(drive))
 		return 0;
 
+#ifdef __svr4__
+	if (statfs(DosDrives[drive].rootdir, &info, 0, 0) < 0) {
+#else
 	if (statfs(DosDrives[drive].rootdir, &info) < 0) {
+#endif
 		fprintf(stderr,"dosfs: cannot do statfs(%s)\n",
 			DosDrives[drive].rootdir);
 		return 0;
 	}
 
 	*size = info.f_bsize * info.f_blocks;
+#ifdef __svr4__
+	*available = info.f_bfree * info.f_bsize;
+#else
 	*available = info.f_bavail * info.f_bsize;
+#endif
 
 	return 1;
 }
 
-char *DOS_FindFile(char *buffer, int buflen, char *filename, char **extensions, 
+char *DOS_FindFile(char *buffer, int buflen, const char *filename, char **extensions, 
 		char *path)
 {
     char *workingpath, *dirname, *rootname, **e;
diff --git a/misc/driver.c b/misc/driver.c
index e9f5f40ac87..7da499089b4 100644
--- a/misc/driver.c
+++ b/misc/driver.c
@@ -33,7 +33,7 @@ void LoadStartupDrivers(void)
         	dprintf_driver(stddeb,"LoadStartupDrivers // str='%s'\n", ptr);
 		hDrv = OpenDriver(ptr, "drivers", 0L);
         	dprintf_driver(stddeb,
-			"LoadStartupDrivers // hDrv=%04X\n", hDrv);
+			"LoadStartupDrivers // hDrv="NPFMT"\n", hDrv);
 		ptr += strlen(ptr) + 1;
 		}
     	dprintf_driver(stddeb,"LoadStartupDrivers // end of list !\n");
@@ -44,7 +44,7 @@ void LoadStartupDrivers(void)
  */
 LRESULT WINAPI SendDriverMessage(HDRVR hDriver, WORD msg, LPARAM lParam1, LPARAM lParam2)
 {
-	dprintf_driver(stdnimp,"SendDriverMessage(%04X, %04X, %08lX, %08lX);\n",
+	dprintf_driver(stdnimp,"SendDriverMessage("NPFMT", %04X, %08lX, %08lX);\n",
 						hDriver, msg, lParam1, lParam2);
         return 0;
 }
@@ -93,7 +93,7 @@ HDRVR OpenDriver(LPSTR lpDriverName, LPSTR lpSectionName, LPARAM lParam)
 		lpnewdrv->lpPrevItem = lpdrv;
 		}
 	lpnewdrv->lpDrvProc = NULL;
-    	dprintf_driver(stddeb,"OpenDriver // hDrvr=%04X loaded !\n", hDrvr);
+    	dprintf_driver(stddeb,"OpenDriver // hDrvr="NPFMT" loaded !\n", hDrvr);
 	return hDrvr;
 }
 
@@ -104,7 +104,7 @@ LRESULT CloseDriver(HDRVR hDrvr, LPARAM lParam1, LPARAM lParam2)
 {
 	LPDRIVERITEM	lpdrv;
     	dprintf_driver(stddeb,
-		"CloseDriver(%04X, %08lX, %08lX);\n", hDrvr, lParam1, lParam2);
+		"CloseDriver("NPFMT", %08lX, %08lX);\n", hDrvr, lParam1, lParam2);
 	lpdrv = (LPDRIVERITEM) GlobalLock(hDrvr);
 	if (lpdrv != NULL && lpdrv->dis.hDriver == hDrvr) {
 		if (lpdrv->lpPrevItem)
@@ -113,7 +113,7 @@ LRESULT CloseDriver(HDRVR hDrvr, LPARAM lParam1, LPARAM lParam2)
 			((LPDRIVERITEM)lpdrv->lpNextItem)->lpPrevItem = lpdrv->lpPrevItem;
 		GlobalUnlock(hDrvr);
 		GlobalFree(hDrvr);
-        dprintf_driver(stddeb,"CloseDriver // hDrvr=%04X closed !\n", hDrvr);
+        dprintf_driver(stddeb,"CloseDriver // hDrvr="NPFMT" closed !\n", hDrvr);
 		return TRUE;
 		}
 	return FALSE;
@@ -126,7 +126,7 @@ HANDLE GetDriverModuleHandle(HDRVR hDrvr)
 {
 	LPDRIVERITEM	lpdrv;
 	HANDLE			hModule = 0;
-    	dprintf_driver(stddeb,"GetDriverModuleHandle(%04X);\n", hDrvr);
+    	dprintf_driver(stddeb,"GetDriverModuleHandle("NPFMT");\n", hDrvr);
 	lpdrv = (LPDRIVERITEM) GlobalLock(hDrvr);
 	if (lpdrv != NULL) {
 		hModule = lpdrv->dis.hModule;
@@ -175,7 +175,7 @@ LRESULT DefDriverProc(DWORD dwDevID, HDRVR hDriv, WORD wMsg,
 BOOL GetDriverInfo(HDRVR hDrvr, LPDRIVERINFOSTRUCT lpDrvInfo)
 {
 	LPDRIVERITEM	lpdrv;
-    	dprintf_driver(stddeb,"GetDriverInfo(%04X, %p);\n", hDrvr, lpDrvInfo);
+    	dprintf_driver(stddeb,"GetDriverInfo("NPFMT", %p);\n", hDrvr, lpDrvInfo);
 	if (lpDrvInfo == NULL) return FALSE;
 	lpdrv = (LPDRIVERITEM) GlobalLock(hDrvr);
 	if (lpdrv == NULL) return FALSE;
@@ -191,7 +191,7 @@ HDRVR GetNextDriver(HDRVR hDrvr, DWORD dwFlags)
 {
 	LPDRIVERITEM	lpdrv;
 	HDRVR			hRetDrv = 0;
-    	dprintf_driver(stddeb,"GetNextDriver(%04X, %08lX);\n", hDrvr, dwFlags);
+    	dprintf_driver(stddeb,"GetNextDriver("NPFMT", %08lX);\n", hDrvr, dwFlags);
 	if (hDrvr == 0) {
 		if (lpDrvItemList == NULL) {
             		dprintf_driver(stddeb,
@@ -199,7 +199,7 @@ HDRVR GetNextDriver(HDRVR hDrvr, DWORD dwFlags)
 			LoadStartupDrivers();
 			if (lpDrvItemList == NULL) return 0;
 			}
-        	dprintf_driver(stddeb,"GetNextDriver // return first %04X !\n",
+        	dprintf_driver(stddeb,"GetNextDriver // return first "NPFMT" !\n",
 					lpDrvItemList->dis.hDriver);
 		return lpDrvItemList->dis.hDriver;
 		}
@@ -215,7 +215,7 @@ HDRVR GetNextDriver(HDRVR hDrvr, DWORD dwFlags)
 			}
 		GlobalUnlock(hDrvr);
 		}
-    	dprintf_driver(stddeb,"GetNextDriver // return %04X !\n", hRetDrv);
+    	dprintf_driver(stddeb,"GetNextDriver // return "NPFMT" !\n", hRetDrv);
 	return hRetDrv;
 }
 
diff --git a/misc/file.c b/misc/file.c
index 2488c6388f9..b9bcc062903 100644
--- a/misc/file.c
+++ b/misc/file.c
@@ -139,7 +139,7 @@ INT _lclose (INT hFile)
 /**************************************************************************
  OpenFile
  **************************************************************************/
-INT OpenFile (LPSTR lpFileName, LPOFSTRUCT ofs, WORD wStyle)
+INT OpenFile (LPCSTR lpFileName, LPOFSTRUCT ofs, UINT wStyle)
 {
     char         filename[MAX_PATH+1];
     int          action;
@@ -149,10 +149,9 @@ INT OpenFile (LPSTR lpFileName, LPOFSTRUCT ofs, WORD wStyle)
     int          verify_time = 0;
   
     dprintf_file(stddeb,"Openfile(%s,<struct>,%d)\n",lpFileName,wStyle);
-  
+ 
     action = wStyle & 0xff00;
   
-  
     /* OF_CREATE is completly different from all other options, so
        handle it first */
 
@@ -251,7 +250,7 @@ INT OpenFile (LPSTR lpFileName, LPOFSTRUCT ofs, WORD wStyle)
     
 
     if (action & OF_PARSE)
-      return 0;
+        return 0;
 
     if (action & OF_DELETE)
       return unlink(ofs->szPathName);
@@ -355,9 +354,13 @@ UINT GetDriveType(INT drive)
 {
 
     	dprintf_file(stddeb,"GetDriveType %c:\n",'A'+drive);
+ 
+        /* File Damager thinks that only return code 0 is bad enough 
+	 * -Al K
+	 */
 
 	if (!DOS_ValidDrive(drive))
-		return DRIVE_DOESNOTEXIST;
+		return DRIVE_CANNOTDETERMINE;
 
 	if (drive == 0 || drive == 1)
 		return DRIVE_REMOVABLE;
diff --git a/misc/kernel32.c b/misc/kernel32.c
deleted file mode 100644
index df6a5ba1217..00000000000
--- a/misc/kernel32.c
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * Win32 kernel functions
- *
- * Copyright 1995 Martin von Loewis
- */
-
-/* This file contains only wrappers to existing Wine functions or trivial
-   stubs. 'Real' implementations go into context specific files */
-
-#include "windows.h"
-#include "winerror.h"
-#include <unistd.h>
-
-int WIN32_LastError;
-
-/***********************************************************************
- *           GetCommandLineA      (KERNEL32.161)
- */
-LPSTR GetCommandLineA(void)
-{
-	return 0;
-}
-
-/***********************************************************************
- *           GetCurrentThreadId   (KERNEL32.200)
- */
-
-int GetCurrentThreadId(void)
-{
-	return getpid();
-}
-
-
-/***********************************************************************
- *           GetEnvironmentStrings    (KERNEL32.210)
- */
-LPSTR GetEnvironmentStrings(void)
-{
-	return 0;
-}
-
-/***********************************************************************
- *           GetStdHandle             (KERNEL32.276)
- */
-HANDLE GetStdHandle(DWORD nStdHandle)
-{
-	switch(nStdHandle)
-	{
-		case -10/*STD_INPUT_HANDLE*/:return 0;
-		case -11/*STD_OUTPUT_HANDLE*/:return 1;
-		case -12/*STD_ERROR_HANDLE*/:return 2;
-	}
-	return -1;
-}
-
-/***********************************************************************
- *           GetThreadContext         (KERNEL32.294)
- */
-BOOL GetThreadContext(HANDLE hThread, void *lpContext)
-{
-	return FALSE;
-}
diff --git a/misc/main.c b/misc/main.c
index 2a70dc4afca..d8876a199a2 100644
--- a/misc/main.c
+++ b/misc/main.c
@@ -31,7 +31,7 @@
 const char people[] = "Wine is available thanks to the work of "
 "Bob Amstadt, Dag Asheim, Martin Ayotte, Ross Biro, Erik Bos, "
 "Fons Botman, John Brezak, Andrew Bulhak, John Burton, Paul Falstad, "
-"Olaf Flebbe, Peter Galbavy, Ramon Garcia, Hans de Graaf, "
+"Olaf Flebbe, Peter Galbavy, Ramon Garcia, Hans de Graaff, "
 "Charles M. Hannum, Cameron Heide, Jochen Hoenicke, Jeffrey Hsu, "
 "Miguel de Icaza, Alexandre Julliard, Jon Konrath, Scott A. Laird, "
 "Martin von Loewis, Kenneth MacDonald, Peter MacDonald, William Magro, "
@@ -114,7 +114,7 @@ static XrmOptionDescRec optionsTable[] =
   "    -fixedmap       Use a \"standard\" color map\n" \
   "    -synchronous    Turn on synchronous display mode\n" \
   "    -backingstore   Turn on backing store\n" \
-  "    -spy file       Obsolete. Use -debugmsg +spy for Spy messages\n" \
+  "    -spy file       Obsolete. Use -debugmsg +message for messages\n" \
   "    -debugmsg name  Turn debugging-messages on or off\n" \
   "    -dll name       Enable or disable built-in DLLs\n" \
   "    -allowreadonly  Read only files may be opened in write mode\n" \
@@ -483,10 +483,12 @@ static void malloc_error()
 static void called_at_exit(void)
 {
     extern void sync_profiles(void);
+    extern void SHELL_SaveRegistry(void);
 
     sync_profiles();
     MAIN_RestoreSetup();
     WSACleanup();
+    SHELL_SaveRegistry();
 }
 
 /***********************************************************************
@@ -499,6 +501,7 @@ int main( int argc, char *argv[] )
     int *depth_list;
 
     extern int _WinMain(int argc, char **argv);
+    extern void SHELL_LoadRegistry(void);
 
     setbuf(stdout,NULL);
     setbuf(stderr,NULL);
@@ -525,6 +528,8 @@ int main( int argc, char *argv[] )
     }
 #endif
 
+    SHELL_LoadRegistry();
+
     screen       = DefaultScreenOfDisplay( display );
     screenWidth  = WidthOfScreen( screen );
     screenHeight = HeightOfScreen( screen );
@@ -579,10 +584,16 @@ LONG GetVersion(void)
  */
 LONG GetWinFlags(void)
 {
+  static const long cpuflags[5] =
+    { WF_CPU086, WF_CPU186, WF_CPU286, WF_CPU386, WF_CPU486 };
+
+  /* There doesn't seem to be any Pentium flag.  */
+  long cpuflag = cpuflags[min (runtime_cpu (), 4)];
+
   if (Options.enhanced)
-    return (WF_ENHANCED | WF_CPU386 | WF_PMODE | WF_80x87 | WF_PAGING);
+    return (WF_ENHANCED | cpuflag | WF_PMODE | WF_80x87 | WF_PAGING);
   else
-    return (WF_STANDARD | WF_CPU386 | WF_PMODE | WF_80x87);
+    return (WF_STANDARD | cpuflag | WF_PMODE | WF_80x87);
 }
 
 /***********************************************************************
@@ -652,6 +663,17 @@ int SetEnvironment(LPSTR lpPortName, LPSTR lpEnviron, WORD nCount)
 	return nCount;
 }
 
+/***********************************************************************
+ *      SetEnvironmentVariableA (KERNEL32.484)
+ */
+BOOL SetEnvironmentVariableA(LPSTR lpName, LPSTR lpValue)
+{
+    int rc;
+
+    rc = SetEnvironment(lpName, lpValue, strlen(lpValue) + 1);
+    return (rc > 0) ? 1 : 0;
+}
+
 /***********************************************************************
  *	GetEnvironment (GDI.134)
  */
@@ -674,6 +696,59 @@ int GetEnvironment(LPSTR lpPortName, LPSTR lpEnviron, WORD nMaxSiz)
 	return 0;
 }
 
+/***********************************************************************
+ *      GetEnvironmentVariableA (KERNEL32.213)
+ */
+DWORD GetEnvironmentVariableA(LPSTR lpName, LPSTR lpValue, DWORD size)
+{
+    return GetEnvironment(lpName, lpValue, size);
+}
+
+/***********************************************************************
+ *      GetEnvironmentStrings (KERNEL32.210)
+ */
+LPVOID GetEnvironmentStrings(void)
+{
+    int count;
+    LPENVENTRY lpEnv;
+    char *envtable, *envptr;
+
+    /* Count the total number of bytes we'll need for the string
+     * table.  Include the trailing nuls and the final double nul.
+     */
+    count = 1;
+    lpEnv = lpEnvList;
+    while(lpEnv != NULL)
+    {
+        if(lpEnv->Name != NULL)
+        {
+            count += strlen(lpEnv->Name) + 1;
+            count += strlen(lpEnv->Value) + 1;
+        }
+        lpEnv = lpEnv->Next;
+    }
+
+    envtable = malloc(count);
+    if(envtable)
+    {
+        lpEnv = lpEnvList;
+        envptr = envtable;
+
+        while(lpEnv != NULL)
+        {
+            if(lpEnv->Name != NULL)
+            {
+                count = sprintf(envptr, "%s=%s", lpEnv->Name, lpEnv->Value);
+                envptr += count + 1;
+            }
+            lpEnv = lpEnv->Next;
+        }
+        *envptr = '\0';
+    }
+
+    return envtable;
+}
+
 /***********************************************************************
  *	GetTimerResolution (USER.14)
  */
diff --git a/misc/network.c b/misc/network.c
index abf7e1b881b..b798a5e44c5 100644
--- a/misc/network.c
+++ b/misc/network.c
@@ -119,7 +119,7 @@ int WNetSetJobCopies(LPSTR szQueue,WORD wJobId,WORD nCopies)
  */
 int WNetWatchQueue(HWND hWnd,LPSTR szLocal,LPSTR szUser,WORD nQueue)
 {
-	printf("EMPTY STUB !!! WNetWatchQueue(%x,'%s','%s',%x)\n",
+	printf("EMPTY STUB !!! WNetWatchQueue("NPFMT",'%s','%s',%x)\n",
 		hWnd,szLocal,szUser,nQueue);
 	return WN_NET_ERROR;
 }
@@ -196,7 +196,7 @@ int WNetGetCaps(WORD capability)
  */
 int WNetDeviceMode(HWND hWndOwner)
 {
-	printf("EMPTY STUB !!! WNetDeviceMode(%x)\n",hWndOwner);
+	printf("EMPTY STUB !!! WNetDeviceMode("NPFMT")\n",hWndOwner);
 	return WN_NET_ERROR;
 }
 
@@ -205,7 +205,7 @@ int WNetDeviceMode(HWND hWndOwner)
  */
 int WNetBrowseDialog(HWND hParent,WORD nType,LPSTR szPath)
 {
-	printf("EMPTY STUB !!! WNetBrowseDialog(%x,%x,'%s')\n",
+	printf("EMPTY STUB !!! WNetBrowseDialog("NPFMT",%x,'%s')\n",
 		hParent,nType,szPath);
 	return WN_NET_ERROR;
 }
@@ -265,7 +265,7 @@ int WNetGetErrorText(WORD nError, LPSTR lpBuffer, LPWORD nBufferSize)
  */
 int WNetRestoreConnection(HWND hwndOwner,LPSTR lpszDevice)
 {
-	printf("EMPTY STUB !!! WNetRestoreConnection(%x,'%s')\n",
+	printf("EMPTY STUB !!! WNetRestoreConnection("NPFMT",'%s')\n",
 		hwndOwner,lpszDevice);
 	return WN_NET_ERROR;
 }
@@ -273,9 +273,9 @@ int WNetRestoreConnection(HWND hwndOwner,LPSTR lpszDevice)
 /**************************************************************************
  *              WNetWriteJob       [USER.524]
  */
-int WNetWriteJob(WORD hJob,void *lpData,LPWORD lpcbData)
+int WNetWriteJob(HANDLE hJob,void *lpData,LPWORD lpcbData)
 {
-	printf("EMPTY STUB !!! WNetWriteJob(%x,%p,%p)\n",
+	printf("EMPTY STUB !!! WNetWriteJob("NPFMT",%p,%p)\n",
 		hJob,lpData,lpcbData);
 	return WN_NET_ERROR;
 }
@@ -285,7 +285,7 @@ int WNetWriteJob(WORD hJob,void *lpData,LPWORD lpcbData)
  */
 UINT WNetConnectDialog(HWND hWndParent, WORD iType)
 {
-	printf("EMPTY STUB !!! WNetConnectDialog(%4X, %4X)\n", hWndParent, iType);
+	printf("EMPTY STUB !!! WNetConnectDialog("NPFMT", %4X)\n", hWndParent, iType);
 	return WN_SUCCESS;
 }
 
@@ -294,7 +294,7 @@ UINT WNetConnectDialog(HWND hWndParent, WORD iType)
  */
 int WNetDisconnectDialog(HWND hwndOwner, WORD iType)
 {
-	printf("EMPTY STUB !!! WNetDisconnectDialog(%x,%x)\n",
+	printf("EMPTY STUB !!! WNetDisconnectDialog("NPFMT",%x)\n",
 		hwndOwner,iType);
 	return WN_NET_ERROR;
 }
@@ -304,7 +304,7 @@ int WNetDisconnectDialog(HWND hwndOwner, WORD iType)
  */
 UINT WNetConnectionDialog(HWND hWndParent, WORD iType)
 {
-	printf("EMPTY STUB !!! WNetConnectionDialog(%4X, %4X)\n", 
+	printf("EMPTY STUB !!! WNetConnectionDialog("NPFMT", %4X)\n", 
 		hWndParent, iType);
 	return WN_SUCCESS;
 }
@@ -314,7 +314,7 @@ UINT WNetConnectionDialog(HWND hWndParent, WORD iType)
  */
 int WNetViewQueueDialog(HWND hwndOwner,LPSTR lpszQueue)
 {
-	printf("EMPTY STUB !!! WNetViewQueueDialog(%x,'%s')\n",
+	printf("EMPTY STUB !!! WNetViewQueueDialog("NPFMT",'%s')\n",
 		hwndOwner,lpszQueue);
 	return WN_NET_ERROR;
 }
@@ -325,7 +325,7 @@ int WNetViewQueueDialog(HWND hwndOwner,LPSTR lpszQueue)
 int WNetPropertyDialog(HWND hwndParent,WORD iButton,
 	WORD nPropSel,LPSTR lpszName,WORD nType)
 {
-	printf("EMPTY STUB !!! WNetPropertyDialog(%x,%x,%x,'%s',%x)\n",
+	printf("EMPTY STUB !!! WNetPropertyDialog("NPFMT",%x,%x,'%s',%x)\n",
 		hwndParent,iButton,nPropSel,lpszName,nType);
 	return WN_NET_ERROR;
 }
@@ -345,7 +345,7 @@ int WNetGetDirectoryType(LPSTR lpName,void *lpType)
  */
 int WNetDirectoryNotify(HWND hwndOwner,void *lpDir,WORD wOper)
 {
-	printf("EMPTY STUB !!! WNetDirectoryNotify(%x,%p,%x)\n",
+	printf("EMPTY STUB !!! WNetDirectoryNotify("NPFMT",%p,%x)\n",
 		hwndOwner,lpDir,wOper);
 	return WN_NET_ERROR;
 }
@@ -356,7 +356,7 @@ int WNetDirectoryNotify(HWND hwndOwner,void *lpDir,WORD wOper)
 int WNetGetPropertyText(HWND hwndParent,WORD iButton,WORD nPropSel,
 	LPSTR lpszName,WORD nType)
 {
-	printf("EMPTY STUB !!! WNetGetPropertyText(%x,%x,%x,'%s',%x)\n",
+	printf("EMPTY STUB !!! WNetGetPropertyText("NPFMT",%x,%x,'%s',%x)\n",
 		hwndParent,iButton,nPropSel,lpszName,nType);
 	return WN_NET_ERROR;
 }
@@ -377,7 +377,7 @@ UINT WNetAddConnection2(LPSTR lpNetPath, LPSTR lpPassWord,
  */
 UINT WNetCloseEnum(HANDLE hEnum)
 {
-	printf("EMPTY STUB !!! WNetCloseEnum(%04X);\n", hEnum);
+	printf("EMPTY STUB !!! WNetCloseEnum("NPFMT");\n", hEnum);
 	return WN_NET_ERROR;
 }
 
@@ -387,7 +387,7 @@ UINT WNetCloseEnum(HANDLE hEnum)
 UINT WNetEnumResource(HANDLE hEnum, DWORD cRequ, 
 				DWORD *lpCount, LPVOID lpBuf)
 {
-	printf("EMPTY STUB !!! WNetEnumResource(%04X, %08lX, %p, %p);\n", 
+	printf("EMPTY STUB !!! WNetEnumResource("NPFMT", %08lX, %p, %p);\n", 
 							hEnum, cRequ, lpCount, lpBuf);
 	return WN_NET_ERROR;
 }
diff --git a/misc/ole2disp.c b/misc/ole2disp.c
index 92dba485dca..edb461ccb68 100644
--- a/misc/ole2disp.c
+++ b/misc/ole2disp.c
@@ -31,12 +31,20 @@ static BSTR BSTR_AllocBytes(int n)
 	if(!BSTRheapsel)
 		return 0;
 	mem=LOCAL_Alloc(BSTRheapsel,LMEM_FIXED,n);
+#ifdef WINELIB32
+	return (BSTR)mem;
+#else
 	return mem ? MAKELONG(mem,BSTRheapsel) : 0;
+#endif
 }
 
 static void BSTR_Free(BSTR in)
 {
+#ifdef WINELIB32
+	LOCAL_Free(BSTRheapsel, (HANDLE)in);
+#else
 	LOCAL_Free(BSTRheapsel, LOWORD(in));
+#endif
 }
 
 static void* BSTR_GetAddr(BSTR in)
diff --git a/misc/ole2nls.c b/misc/ole2nls.c
index fbec3d7f436..5915ce8d828 100644
--- a/misc/ole2nls.c
+++ b/misc/ole2nls.c
@@ -26,6 +26,8 @@ DWORD WINAPI GetUserDefaultLCID()
 	return 7;
 #elif #LANG(Es)
 	return 7; /* Just a Guess :-) */
+#elif #LANG(Fr)
+	return 7; /* ditto :-) */
 #elif #LANG(No)
 	return 0x14;
 #else
diff --git a/misc/olecli.c b/misc/olecli.c
index 0dadd1ad701..ca5ca9ddde7 100644
--- a/misc/olecli.c
+++ b/misc/olecli.c
@@ -52,6 +52,6 @@ OLESTATUS WINAPI OleRevokeClientDoc(LHCLIENTDOC hServerDoc)
  */
 BOOL WINAPI OleIsDcMeta(HDC hdc)
 {
-	dprintf_ole(stddeb,"OleIsDCMeta(%04X)\n",hdc);
+	dprintf_ole(stddeb,"OleIsDCMeta("NPFMT")\n",hdc);
 	return GDI_GetObjPtr( hdc, METAFILE_DC_MAGIC ) != 0;
 }
diff --git a/misc/shell.c b/misc/shell.c
index 7588a5745b0..12822f1f464 100644
--- a/misc/shell.c
+++ b/misc/shell.c
@@ -15,6 +15,7 @@
 #include "relay32.h"
 #include "../rc/sysres.h"
 #include "dlgs.h"
+#include "win.h"
 #include "stddebug.h"
 #include "debug.h"
 
@@ -36,7 +37,7 @@ static LONG SHELL_RegCheckForRoot()
         printf("SHELL_RegCheckForRoot: Couldn't allocate root key!\n");
         return ERROR_OUTOFMEMORY;
       }
-      lphRootKey->hKey = 1;
+      lphRootKey->hKey = (HKEY)1;
       lphRootKey->lpSubKey = RootKeyName;
       lphRootKey->dwType = 0;
       lphRootKey->lpValue = NULL;
@@ -60,6 +61,157 @@ static LONG SHELL_RegCheckForRoot()
     return ERROR_SUCCESS;
 }
 
+/* FIXME: the loading and saving of the registry database is rather messy.
+ * bad input (while reading) may crash wine.
+ */
+void
+_DumpLevel(FILE *f,LPKEYSTRUCT lpTKey,int tabs) {
+	LPKEYSTRUCT	lpKey;
+
+	lpKey=lpTKey->lpSubLvl;
+	while (lpKey) {
+		int	i;
+		for (i=0;i<tabs;i++) fprintf(f,"\t");
+		/* implement different dwTypes ... */
+		if (lpKey->lpValue)
+			fprintf(f,"%s=%s\n",lpKey->lpSubKey,lpKey->lpValue);
+		else
+			fprintf(f,"%s\n",lpKey->lpSubKey);
+
+		if (lpKey->lpSubLvl)
+			_DumpLevel(f,lpKey,tabs+1);
+		lpKey=lpKey->lpNextKey;
+	}
+}
+
+static void
+_SaveKey(HKEY hKey,char *where) {
+	FILE		*f;
+	LPKEYSTRUCT	lpKey;
+
+	f=fopen(where,"w");
+	if (f==NULL) {
+		perror("registry-fopen");
+		return;
+	}
+	switch ((DWORD)hKey) {
+	case HKEY_CLASSES_ROOT:
+		lpKey=lphRootKey;
+		break;
+	default:return;
+	}
+	_DumpLevel(f,lpKey,0);
+	fclose(f);
+}
+
+void
+SHELL_SaveRegistry(void) {
+	/* FIXME: 
+	 * -implement win95 additional keytypes here
+	 * (HKEY_LOCAL_MACHINE,HKEY_CURRENT_USER or whatever)
+	 * -choose better filename(s)
+	 */
+	_SaveKey(HKEY_CLASSES_ROOT,"/tmp/winereg");
+}
+
+#define BUFSIZE	256
+void
+_LoadLevel(FILE *f,LPKEYSTRUCT lpKey,int tabsexp,char *buf) {
+	int		i;
+	char		*s,*t;
+	HKEY		hNewKey;
+	LPKEYSTRUCT	lpNewKey;
+
+	while (1) {
+		if (NULL==fgets(buf,BUFSIZE,f)) {
+			buf[0]=0;
+			return;
+		}
+		for (i=0;buf[i]=='\t';i++) /*empty*/;
+		s=buf+i;
+		if (NULL!=(t=strchr(s,'\n'))) *t='\0';
+		if (NULL!=(t=strchr(s,'\r'))) *t='\0';
+
+		if (i<tabsexp) return;
+
+		if (i>tabsexp) {
+			hNewKey=GlobalAlloc(GMEM_MOVEABLE,sizeof(KEYSTRUCT));
+			lpNewKey=lpKey->lpSubLvl=(LPKEYSTRUCT)GlobalLock(hNewKey);
+			lpNewKey->hKey		= hNewKey;
+			lpNewKey->dwType	= 0;
+			lpNewKey->lpSubKey	=
+			lpNewKey->lpValue	=
+			lpNewKey->lpSubLvl	=
+			lpNewKey->lpNextKey	=
+			lpNewKey->lpPrevKey	= NULL;
+			if (NULL!=(t=strchr(s,'='))) {
+				*t='\0';t++;
+				lpNewKey->dwType	= REG_SZ;
+				lpNewKey->lpSubKey	= strdup(s);
+				lpNewKey->lpValue	= strdup(t);
+			} else {
+				lpNewKey->dwType	= REG_SZ;
+				lpNewKey->lpSubKey	= strdup(s);
+			}
+			_LoadLevel(f,lpNewKey,tabsexp+1,buf);
+		}
+		for (i=0;buf[i]=='\t';i++) /*empty*/;
+		s=buf+i;
+		if (i<tabsexp) return;
+		if (buf[0]=='\0') break; /* marks end of file */
+		/* we have a buf now. even when returning from _LoadLevel */
+		hNewKey		= GlobalAlloc(GMEM_MOVEABLE,sizeof(KEYSTRUCT));
+		lpNewKey	= lpKey->lpNextKey=(LPKEYSTRUCT)GlobalLock(hNewKey);
+		lpNewKey->lpPrevKey	= lpKey;
+		lpNewKey->hKey		= hNewKey;
+		lpNewKey->dwType	= 0;
+		lpNewKey->lpSubKey	=
+		lpNewKey->lpValue	=
+		lpNewKey->lpSubLvl	=
+		lpNewKey->lpNextKey	= NULL;
+		if (NULL!=(t=strchr(s,'='))) {
+			*t='\0';t++;
+			lpNewKey->dwType	= REG_SZ;
+			lpNewKey->lpSubKey	= strdup(s);
+			lpNewKey->lpValue	= strdup(t);
+		} else {
+			lpNewKey->dwType	= REG_SZ;
+			lpNewKey->lpSubKey	= strdup(s);
+		}
+		lpKey=lpNewKey;
+	}
+}
+
+void
+_LoadKey(HKEY hKey,char *from) {
+	FILE		*f;
+	LPKEYSTRUCT	lpKey;
+	char		buf[BUFSIZE]; /* FIXME: long enough? */
+
+	f=fopen(from,"r");
+	if (f==NULL) {
+		perror("fopen-registry-read");
+		return;
+	}
+	switch ((DWORD)hKey) {
+	case HKEY_CLASSES_ROOT:
+		lpKey=lphRootKey;
+		break;
+	default:return;
+	}
+	_LoadLevel(f,lpKey,-1,buf);
+}
+
+void
+SHELL_LoadRegistry(void) {
+	DWORD	dwRet;
+
+	dwRet=SHELL_RegCheckForRoot();
+	if (dwRet!=ERROR_SUCCESS) 
+		return;/*very bad magic, if we can't even allocate the rootkeys*/
+	_LoadKey(HKEY_CLASSES_ROOT,"/tmp/winereg");
+}
+
 /*************************************************************************
  *				RegOpenKey		[SHELL.1]
  */
@@ -73,16 +225,16 @@ LONG RegOpenKey(HKEY hKey, LPCSTR lpSubKey, HKEY FAR *lphKey)
         dwRet = SHELL_RegCheckForRoot();
         if (dwRet != ERROR_SUCCESS) return dwRet;
 	dprintf_reg(stddeb, "RegOpenKey(%08lX, %p='%s', %p)\n",
-						hKey, lpSubKey, lpSubKey, lphKey);
+				       (DWORD)hKey, lpSubKey, lpSubKey, lphKey);
 	if (lphKey == NULL) return ERROR_INVALID_PARAMETER;
-        switch(hKey) {
+        switch((DWORD)hKey) {
 	case 0: 
 	  lpKey = lphTopKey; break;
         case HKEY_CLASSES_ROOT: /* == 1 */
         case 0x80000000:
           lpKey = lphRootKey; break;
         default: 
-	  dprintf_reg(stddeb,"RegOpenKey // specific key = %08lX !\n", hKey);
+	  dprintf_reg(stddeb,"RegOpenKey // specific key = %08lX !\n", (DWORD)hKey);
 	  lpKey = (LPKEYSTRUCT)GlobalLock(hKey);
         }
 	if (lpSubKey == NULL || !*lpSubKey)  { 
@@ -127,16 +279,16 @@ LONG RegCreateKey(HKEY hKey, LPCSTR lpSubKey, HKEY FAR *lphKey)
 
 	dwRet = SHELL_RegCheckForRoot();
         if (dwRet != ERROR_SUCCESS) return dwRet;
-	dprintf_reg(stddeb, "RegCreateKey(%08lX, '%s', %p)\n",	hKey, lpSubKey, lphKey);
+	dprintf_reg(stddeb, "RegCreateKey(%08lX, '%s', %p)\n",	(DWORD)hKey, lpSubKey, lphKey);
 	if (lphKey == NULL) return ERROR_INVALID_PARAMETER;
-        switch(hKey) {
+        switch((DWORD)hKey) {
 	case 0: 
 	  lpKey = lphTopKey; break;
         case HKEY_CLASSES_ROOT: /* == 1 */
         case 0x80000000:
           lpKey = lphRootKey; break;
         default: 
-	  dprintf_reg(stddeb,"RegCreateKey // specific key = %08lX !\n", hKey);
+	  dprintf_reg(stddeb,"RegCreateKey // specific key = %08lX !\n", (DWORD)hKey);
 	  lpKey = (LPKEYSTRUCT)GlobalLock(hKey);
         }
 	if (lpSubKey == NULL || !*lpSubKey)  { 
@@ -179,11 +331,11 @@ LONG RegCreateKey(HKEY hKey, LPCSTR lpSubKey, HKEY FAR *lphKey)
 	    lpNewKey->lpValue = NULL;
 	    lpNewKey->lpSubLvl = NULL;
 	    *lphKey = hNewKey;
-	    dprintf_reg(stddeb,"RegCreateKey // successful '%s' key=%08lX !\n", str, hNewKey);
+	    dprintf_reg(stddeb,"RegCreateKey // successful '%s' key=%08lX !\n", str, (DWORD)hNewKey);
 	    lpKey = lpNewKey;
 	  } else {
             *lphKey = lpKey->hKey;
-	    dprintf_reg(stddeb,"RegCreateKey // found '%s', key=%08lX\n", str, *lphKey);
+	    dprintf_reg(stddeb,"RegCreateKey // found '%s', key=%08lX\n", str, (DWORD)*lphKey);
 	  }
 	}
 	return ERROR_SUCCESS;
@@ -195,7 +347,7 @@ LONG RegCreateKey(HKEY hKey, LPCSTR lpSubKey, HKEY FAR *lphKey)
  */
 LONG RegCloseKey(HKEY hKey)
 {
-	dprintf_reg(stdnimp, "EMPTY STUB !!! RegCloseKey(%08lX);\n", hKey);
+	dprintf_reg(stdnimp, "EMPTY STUB !!! RegCloseKey(%08lX);\n", (DWORD)hKey);
 	return ERROR_SUCCESS;
 }
 
@@ -205,8 +357,8 @@ LONG RegCloseKey(HKEY hKey)
  */
 LONG RegDeleteKey(HKEY hKey, LPCSTR lpSubKey)
 {
-	dprintf_reg(stdnimp, "EMPTY STUB !!! RegDeleteKey(%08lX, '%s');\n", 
-												hKey, lpSubKey);
+	dprintf_reg(stdnimp, "EMPTY STUB !!! RegDeleteKey(%08lX, '%s');\n",
+                     (DWORD)hKey, lpSubKey);
 	return ERROR_SUCCESS;
 }
 
@@ -221,7 +373,7 @@ LONG RegSetValue(HKEY hKey, LPCSTR lpSubKey, DWORD dwType,
     LPKEYSTRUCT	lpKey;
     LONG       	dwRet;
     dprintf_reg(stddeb, "RegSetValue(%08lX, '%s', %08lX, '%s', %08lX);\n",
-		hKey, lpSubKey, dwType, lpVal, dwIgnored);
+		(DWORD)hKey, lpSubKey, dwType, lpVal, dwIgnored);
     /*if (lpSubKey == NULL) return ERROR_INVALID_PARAMETER;*/
     if (lpVal == NULL) return ERROR_INVALID_PARAMETER;
     if ((dwRet = RegOpenKey(hKey, lpSubKey, &hRetKey)) != ERROR_SUCCESS) {
@@ -251,7 +403,7 @@ LONG RegQueryValue(HKEY hKey, LPCSTR lpSubKey, LPSTR lpVal, LONG FAR *lpcb)
 	LONG		dwRet;
 	int			size;
 	dprintf_reg(stddeb, "RegQueryValue(%08lX, '%s', %p, %p);\n",
-							hKey, lpSubKey, lpVal, lpcb);
+                    (DWORD)hKey, lpSubKey, lpVal, lpcb);
 	/*if (lpSubKey == NULL) return ERROR_INVALID_PARAMETER;*/
 	if (lpVal == NULL) return ERROR_INVALID_PARAMETER;
 	if (lpcb == NULL) return ERROR_INVALID_PARAMETER;
@@ -291,16 +443,16 @@ LONG RegEnumKey(HKEY hKey, DWORD dwSubKey, LPSTR lpBuf, DWORD dwSize)
 
 	dwRet = SHELL_RegCheckForRoot();
         if (dwRet != ERROR_SUCCESS) return dwRet;
-	dprintf_reg(stddeb, "RegEnumKey(%08lX, %ld)\n", hKey, dwSubKey);
+	dprintf_reg(stddeb, "RegEnumKey(%08lX, %ld)\n", (DWORD)hKey, dwSubKey);
 	if (lpBuf == NULL) return ERROR_INVALID_PARAMETER;
-        switch(hKey) {
+        switch((DWORD)hKey) {
 	case 0: 
 	  lpKey = lphTopKey; break;
         case HKEY_CLASSES_ROOT: /* == 1 */
         case 0x80000000:
           lpKey = lphRootKey; break;
         default: 
-	  dprintf_reg(stddeb,"RegEnumKey // specific key = %08lX !\n", hKey);
+	  dprintf_reg(stddeb,"RegEnumKey // specific key = %08lX !\n", (DWORD)hKey);
 	  lpKey = (LPKEYSTRUCT)GlobalLock(hKey);
         }
         lpKey = lpKey->lpSubLvl;
@@ -319,22 +471,61 @@ LONG RegEnumKey(HKEY hKey, DWORD dwSubKey, LPSTR lpBuf, DWORD dwSize)
 	return ERROR_INVALID_PARAMETER;
 }
 
+
 /*************************************************************************
  *				DragAcceptFiles		[SHELL.9]
  */
 void DragAcceptFiles(HWND hWnd, BOOL b)
 {
-	fprintf(stdnimp, "DragAcceptFiles : Empty Stub !!!\n");
+ /* flips WS_EX_ACCEPTFILES bit according to the value of b (TRUE or FALSE) */
+
+ dprintf_reg(stddeb,"DragAcceptFiles(%04x, %u) old exStyle %08lx\n",hWnd,b,GetWindowLong(hWnd,GWL_EXSTYLE));
+
+ SetWindowLong(hWnd,GWL_EXSTYLE,GetWindowLong(hWnd,GWL_EXSTYLE) | b*(LONG)WS_EX_ACCEPTFILES); 
 }
 
 
 /*************************************************************************
  *				DragQueryFile		[SHELL.11]
  */
-void DragQueryFile(HDROP h, UINT u, LPSTR u2, UINT u3)
+UINT DragQueryFile(HDROP hDrop, WORD wFile, LPSTR lpszFile, WORD wLength)
 {
-	fprintf(stdnimp, "DragQueryFile : Empty Stub !!!\n");
+ /* hDrop is a global memory block allocated with GMEM_SHARE 
+    with DROPFILESTRUCT as a header and filenames following
+    it, zero length filename is in the end */       
+
+ LPDROPFILESTRUCT lpDropFileStruct;
+ LPSTR		  lpCurrent;
+ WORD		  i;
+
+ dprintf_reg(stddeb,"DragQueryFile(%04x, %i, %p, %u)\n",
+                           hDrop,wFile,lpszFile,wLength);
 
+ lpDropFileStruct = (LPDROPFILESTRUCT) GlobalLock(hDrop); 
+ if(!lpDropFileStruct)
+    {
+       dprintf_reg(stddeb,"DragQueryFile: unable to lock handle!\n");
+       return 0;
+    } 
+ lpCurrent = (LPSTR) lpDropFileStruct + lpDropFileStruct->wSize;
+
+ i = 0;
+ while(i++ < wFile)
+    {
+       while(*lpCurrent++);  /* skip filename */
+       if(!*lpCurrent) 
+          return (wFile == 0xFFFF)? i : 0;  
+    }
+
+ i = strlen(lpCurrent); 
+ if(!lpszFile) return i+1;   /* needed buffer size */
+
+ i = ( wLength > i)? i : wLength-1;
+ strncpy(lpszFile,lpCurrent,i);
+ lpszFile[i]='\0';
+
+ GlobalUnlock(hDrop);
+ return i;
 }
 
 
@@ -343,17 +534,25 @@ void DragQueryFile(HDROP h, UINT u, LPSTR u2, UINT u3)
  */
 void DragFinish(HDROP h)
 {
-	fprintf(stdnimp, "DragFinish : Empty Stub !!!\n");
+ GlobalFree((HGLOBAL)h);
 }
 
 
 /*************************************************************************
  *				DragQueryPoint		[SHELL.13]
  */
-BOOL DragQueryPoint(HDROP h, POINT FAR *p)
+BOOL DragQueryPoint(HDROP hDrop, POINT FAR *p)
 {
-	fprintf(stdnimp, "DragQueryPoint : Empty Stub !!!\n");
-        return FALSE;
+ LPDROPFILESTRUCT lpDropFileStruct;  
+ BOOL             bRet;
+
+ lpDropFileStruct = (LPDROPFILESTRUCT) GlobalLock(hDrop);
+
+ memcpy(p,&lpDropFileStruct->ptMousePos,sizeof(POINT));
+ bRet = lpDropFileStruct->fInNonClientArea;
+
+ GlobalUnlock(hDrop);
+ return bRet; 
 }
 
 
@@ -371,7 +570,7 @@ HINSTANCE ShellExecute(HWND hWnd, LPCSTR lpOperation, LPCSTR lpFile, LPCSTR lpPa
      * we have to pass the parameters. If an instance is already running,
      * we might have to send DDE commands.
      */
-    dprintf_exec(stddeb, "ShellExecute(%4X,'%s','%s','%s','%s',%x)\n",
+    dprintf_exec(stddeb, "ShellExecute("NPFMT",'%s','%s','%s','%s',%x)\n",
 		hWnd, lpOperation ? lpOperation:"<null>", lpFile ? lpFile:"<null>",
 		lpParameters ? lpParameters : "<null>", 
 		lpDirectory ? lpDirectory : "<null>", iShowCmd);
@@ -392,7 +591,7 @@ HINSTANCE ShellExecute(HWND hWnd, LPCSTR lpOperation, LPCSTR lpFile, LPCSTR lpPa
       }
     } else {
       len=200;
-      if (RegQueryValue(HKEY_CLASSES_ROOT,p,subclass,&len)==ERROR_SUCCESS) {
+      if (RegQueryValue((HKEY)HKEY_CLASSES_ROOT,p,subclass,&len)==ERROR_SUCCESS) {
 	if (len>20)
 	  fprintf(stddeb,"ShellExecute:subclass with len %ld? (%s), please report.\n",len,subclass);
 	subclass[len]='\0';
@@ -401,7 +600,7 @@ HINSTANCE ShellExecute(HWND hWnd, LPCSTR lpOperation, LPCSTR lpFile, LPCSTR lpPa
 	strcat(subclass,"\\command");
 	dprintf_exec(stddeb,"ShellExecute:looking for %s.\n",subclass);
 	len=400;
-	if (RegQueryValue(HKEY_CLASSES_ROOT,subclass,cmd,&len)==ERROR_SUCCESS) {
+	if (RegQueryValue((HKEY)HKEY_CLASSES_ROOT,subclass,cmd,&len)==ERROR_SUCCESS) {
 	  char *t;
 	  dprintf_exec(stddeb,"ShellExecute:...got %s\n",cmd);
 	  cmd[len]='\0';
@@ -413,6 +612,7 @@ HINSTANCE ShellExecute(HWND hWnd, LPCSTR lpOperation, LPCSTR lpFile, LPCSTR lpPa
 	    char *s;
 	    s=malloc(len+strlen(lpFile)+10);
 	    strncpy(s,cmd,t-cmd);
+	    s[t-cmd]='\0';
 	    strcat(s,lpFile);
 	    strcat(s,t+2);
 	    strcpy(cmd,s);
@@ -425,13 +625,14 @@ HINSTANCE ShellExecute(HWND hWnd, LPCSTR lpOperation, LPCSTR lpFile, LPCSTR lpPa
 	  }
 	} else {
 	  fprintf(stddeb,"ShellExecute: No %s\\shell\\%s\\command found for \"%s\" suffix.\n",subclass,lpOperation,p);
-	  return 14; /* unknown type */
+	  return (HINSTANCE)14; /* unknown type */
 	}
       } else {
 	fprintf(stddeb,"ShellExecute: No operation found for \"%s\" suffix.\n",p);
-	return 14; /* file not found */
+	return (HINSTANCE)14; /* file not found */
       }
     }
+    dprintf_exec(stddeb,"ShellExecute:starting %s\n",cmd);
     return WinExec(cmd,iShowCmd);
 }
 
@@ -445,18 +646,22 @@ HINSTANCE FindExecutable(LPCSTR lpFile, LPCSTR lpDirectory, LPSTR lpResult)
         return 0;
 }
 
-static char AppName[512], AppMisc[512];
+static char AppName[128], AppMisc[906];
 
 /*************************************************************************
  *				AboutDlgProc		[SHELL.33]
  */
-INT AboutDlgProc(HWND hWnd, WORD msg, WORD wParam, LONG lParam)
+LRESULT AboutDlgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
 {
   char Template[512], AppTitle[512];
  
   switch(msg) {
    case WM_INITDIALOG:
+#ifdef WINELIB32
+    SendDlgItemMessage(hWnd,stc1,STM_SETICON,lParam,0);
+#else
     SendDlgItemMessage(hWnd,stc1,STM_SETICON,LOWORD(lParam),0);
+#endif
     GetWindowText(hWnd, Template, 511);
     sprintf(AppTitle, Template, AppName);
     SetWindowText(hWnd, AppTitle);
@@ -484,11 +689,13 @@ INT ShellAbout(HWND hWnd, LPCSTR szApp, LPCSTR szOtherStuff, HICON hIcon)
     DWORD WineProc,Win16Proc,Win32Proc;
     static int initialized=0;
 
-    if (szApp) strcpy(AppName, szApp);
+    if (szApp) strncpy(AppName, szApp, sizeof(AppName));
     else *AppName = 0;
+    AppName[sizeof(AppName)-1]=0;
 
-    if (szOtherStuff) strcpy(AppMisc, szOtherStuff);
+    if (szOtherStuff) strncpy(AppMisc, szOtherStuff, sizeof(AppMisc));
     else *AppMisc = 0;
+    AppMisc[sizeof(AppMisc)-1]=0;
 
     if (!hIcon) hIcon = LoadIcon(0,MAKEINTRESOURCE(OIC_WINEICON));
     
@@ -507,9 +714,10 @@ INT ShellAbout(HWND hWnd, LPCSTR szApp, LPCSTR szOtherStuff, HICON hIcon)
                                  GetCurrentPDB(), FALSE, FALSE,
                                  TRUE, NULL );
     if (!handle) return FALSE;
-    bRet = DialogBoxIndirectParam( GetWindowWord( hWnd, GWW_HINSTANCE ),
+    bRet = DialogBoxIndirectParam( WIN_GetWindowInstance( hWnd ),
                                    handle, hWnd,
-                                   GetWndProcEntry16("AboutDlgProc"), hIcon );
+                                   GetWndProcEntry16("AboutDlgProc"), 
+				   (LONG)hIcon );
     GLOBAL_FreeBlock( handle );
     return bRet;
 }
@@ -521,7 +729,7 @@ HICON ExtractIcon(HINSTANCE hInst, LPCSTR lpszExeFileName, UINT nIconIndex)
 {
 	HICON	hIcon = 0;
 	HINSTANCE hInst2 = hInst;
-	dprintf_reg(stddeb, "ExtractIcon(%04X, '%s', %d\n", 
+	dprintf_reg(stddeb, "ExtractIcon("NPFMT", '%s', %d\n", 
 			hInst, lpszExeFileName, nIconIndex);
         return 0;
 	if (lpszExeFileName != NULL) {
diff --git a/misc/spy.c b/misc/spy.c
index 835f8c64023..eba14fe49ea 100644
--- a/misc/spy.c
+++ b/misc/spy.c
@@ -1,6 +1,7 @@
 /* SPY.C
  *
  * Copyright 1994, Bob Amstadt
+ *           1995, Alex Korobka  
  */
 
 #include <stdlib.h>
@@ -13,8 +14,10 @@
 #include "options.h"
 #include "stddebug.h"
 #include "debug.h"
+#include "spy.h"
 
-#define SPY_MAX_MSGNUM		0x03e8
+#define SPY_MAX_MSGNUM		WM_USER
+#define SPY_MAX_INDENTLEVEL     64
 
 const char *MessageTypeNames[SPY_MAX_MSGNUM + 1] =
 {
@@ -27,7 +30,7 @@ const char *MessageTypeNames[SPY_MAX_MSGNUM + 1] =
     "WM_ACTIVATE",
     "WM_SETFOCUS",
     "WM_KILLFOCUS",
-    "WM_UNUSED1",
+    "WM_SETVISIBLE",
     "WM_ENABLE",
     "WM_SETREDRAW",
     "WM_SETTEXT",
@@ -41,7 +44,7 @@ const char *MessageTypeNames[SPY_MAX_MSGNUM + 1] =
     "WM_ERASEBKGND",
     "WM_SYSCOLORCHANGE",
     "WM_ENDSESSION",
-    "WM_UNUSED2",
+    "WM_SYSTEMERROR",
     "WM_SHOWWINDOW",
     "WM_CTLCOLOR",
     "WM_WININICHANGE",
@@ -67,17 +70,19 @@ const char *MessageTypeNames[SPY_MAX_MSGNUM + 1] =
     "WM_VKEYTOITEM",
     "WM_CHARTOITEM",
     "WM_SETFONT",		/* 0x30 */
-    "WM_GETFONT", NULL, NULL, NULL, NULL, NULL, NULL,
-    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+    "WM_GETFONT", NULL, NULL, NULL, NULL, NULL, 
+    "WM_QUERYDRAGICON", NULL, 
+    "WM_COMPAREITEM", NULL, NULL, NULL, NULL, NULL, NULL,
 
-    /* 0x40 */
-    NULL, NULL, NULL, NULL, NULL, NULL,
+    NULL, 		        /* 0x40 */
+    "WM_COMPACTING", NULL, NULL, 
+    "WM_COMMNOTIFY", NULL, 
     "WM_WINDOWPOSCHANGING",	/* 0x0046 */
     "WM_WINDOWPOSCHANGED",	/* 0x0047 */
-    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+    "WM_POWER", NULL, NULL, NULL, NULL, NULL, NULL, NULL,
 
-    /* 0x0050 */
-    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+    NULL, 		        /* 0x0050 */
+    NULL, NULL, NULL, NULL, NULL, NULL, NULL, 
     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
 
     /* 0x0060 */
@@ -96,7 +101,7 @@ const char *MessageTypeNames[SPY_MAX_MSGNUM + 1] =
     "WM_NCPAINT",          	/* 0x0085 */
     "WM_NCACTIVATE",       	/* 0x0086 */
     "WM_GETDLGCODE",		/* 0x0087 */
-    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+    "WM_SYNCPAINT", NULL, NULL, NULL, NULL, NULL, NULL, NULL,
 
     /* 0x0090 */
     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
@@ -164,7 +169,9 @@ const char *MessageTypeNames[SPY_MAX_MSGNUM + 1] =
     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
 
     /* 0x0130 */
-    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+    NULL, 
+    "WM_LBTRACKPOINT", 
+    NULL, NULL, NULL, NULL, NULL, NULL,
     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
 
     /* 0x0140 */
@@ -244,12 +251,19 @@ const char *MessageTypeNames[SPY_MAX_MSGNUM + 1] =
     "WM_MDIICONARRANGE",        /* 0x0228 */
     "WM_MDIGETACTIVE",          /* 0x0229 */
 
-    NULL, NULL, NULL, NULL, NULL, NULL,
+    "WM_DROPOBJECT", 
+    "WM_QUERYDROPOBJECT", 
+    NULL,
+    "WM_DRAGLOOP",
+    "WM_DRAGSELECT",
+    "WM_DRAGMOVE",
+     
     /* 0x0230*/
     "WM_MDISETMENU",            /* 0x0230 */
     "WM_ENTERSIZEMOVE",		/* 0x0231 */
     "WM_EXITSIZEMOVE",		/* 0x0232 */
-    NULL, NULL, NULL, NULL, NULL, 
+    "WM_DROPFILES", 		/* 0x0233 */
+    NULL, NULL, NULL, NULL, 
     /* 0x0238*/
     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
     
@@ -289,11 +303,27 @@ const char *MessageTypeNames[SPY_MAX_MSGNUM + 1] =
     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
 
-    /* 0x0300 */
-    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
-    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
-    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
-    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+    "WM_CUT", 			/* 0x0300 */
+    "WM_COPY", 
+    "WM_PASTE", 
+    "WM_CLEAR", 
+    "WM_UNDO", 
+    "WM_RENDERFORMAT", 
+    "WM_RENDERALLFORMATS", 
+    "WM_DESTROYCLIPBOARD",
+    "WM_DRAWCLIPBOARD", 
+    "WM_PAINTCLIPBOARD", 
+    "WM_VSCROLLCLIPBOARD", 
+    "WM_SIZECLIPBOARD", 
+    "WM_ASKCBFORMATNAME", 
+    "WM_CHANGECBCHAIN",
+    "WM_HSCROLLCLIPBOARD",
+    "WM_QUERYNEWPALETTE",	/* 0x030f*/
+
+    "WM_PALETTEISCHANGING",
+    "WM_PALETTECHANGED", 	/* 0x0311 */
+    NULL, NULL, NULL, NULL, NULL, NULL, NULL, 
+    NULL, NULL, NULL, NULL, NULL, NULL, NULL, 
 
     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
@@ -314,7 +344,9 @@ const char *MessageTypeNames[SPY_MAX_MSGNUM + 1] =
     /* 0x0380 */
     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
-    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+    "WM_COALESCE_FIRST", 
+    "WM_COALESCE_LAST", 
+                NULL, NULL, NULL, NULL, NULL, NULL,
     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
 
     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
@@ -337,35 +369,138 @@ const char *MessageTypeNames[SPY_MAX_MSGNUM + 1] =
     "WM_DDE_DATA",	/* 0x3E5 */
     "WM_DDE_REQUEST",	/* 0x3E6 */
     "WM_DDE_POKE",	/* 0x3E7 */
-    "WM_DDE_EXECUTE"	/* 0x3E8 */
+    "WM_DDE_EXECUTE",	/* 0x3E8 */
+    NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+
+    
+    /* 0x03f0 */
+    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+
+    "WM_USER"
 };
 
-char SpyFilters[256+1];
-char SpyIncludes[256+1];
+static BOOL  	SpyFilters [SPY_MAX_MSGNUM+1];
+static BOOL 	SpyIncludes[SPY_MAX_MSGNUM+1];
+
+static int      iSpyMessageIndentLevel  = 0;
+static char     lpstrSpyMessageIndent[SPY_MAX_INDENTLEVEL];
+static char    *lpstrSpyMessageFromWine = "Wine";
+static char     lpstrSpyMessageFromTask[10]; 
+static char    *lpstrSpyMessageFromSelf = "self";
+static char    *lpstrSpyMessageFrom     =  NULL;
+
 
 /**********************************************************************
- *					SpyMessage
+ *			      EnterSpyMessage
  */
-void SpyMessage(HWND hwnd, WORD msg, WORD wParam, LONG lParam)
+void EnterSpyMessage(int iFlag, HWND hWnd, WORD msg, WORD wParam, LONG lParam)
 {
-    char msg_name[80];
-    
-	if(!debugging_spy)
-		return;
+  HTASK	hTask     = GetWindowTask(hWnd);
+  WORD 	wCheckMsg = (msg > WM_USER)? WM_USER: msg;
+
+  if( !SpyIncludes[wCheckMsg] || SpyFilters[wCheckMsg]) return;
+
+  /* each SPY_SENDMESSAGE must be complemented by call to ExitSpyMessage */
+  switch(iFlag)
+   {
+	case SPY_DISPATCHMESSAGE:
+		    if(msg <= WM_USER)
+		      {
+		       if(MessageTypeNames[msg])
+		          dprintf_message(stddeb,"(%04x) message [%04x] %s dispatched  wp=%04x lp=%08lx\n",
+		                          hWnd, msg, MessageTypeNames[msg], wParam, lParam);
+		       else
+		          dprintf_message(stddeb,"(%04x) message [%04x] dispatched  wp=%04x lp=%08lx\n",
+		                          hWnd, msg, wParam, lParam);
+		      }
+		    else
+		          dprintf_message(stddeb,"(%04x) message [%04x] WM_USER+%04d dispatched  wp=%04x lp=%08lx\n",
+		                          hWnd, msg, msg-WM_USER ,wParam ,lParam);
+		    break;
+	case SPY_SENDMESSAGE:
+		    if(hTask == GetCurrentTask())
+ 		      lpstrSpyMessageFrom = lpstrSpyMessageFromSelf;
+		    else if(hTask == NULL)
+  		      	   lpstrSpyMessageFrom = lpstrSpyMessageFromWine;
+  		    	 else
+  				{
+  				   sprintf(lpstrSpyMessageFromTask, "task %04x", hTask);	
+  				   lpstrSpyMessageFrom = lpstrSpyMessageFromTask;
+  				}
+		     
+	            if(msg <= WM_USER)
+	                {
+	                  if(MessageTypeNames[msg])
+			      dprintf_message(stddeb,"%s(%04x) message [%04x] %s sent from %s wp=%04x lp=%08lx\n",
+                                   	      lpstrSpyMessageIndent,
+                                   	      hWnd, msg, MessageTypeNames[msg],
+                                   	      lpstrSpyMessageFrom,
+                                   	      wParam, lParam);
+	                  else
+	                      dprintf_message(stddeb,"%s(%04x) message [%04x] sent from %s wp=%04x lp=%08lx\n",
+                                   	      lpstrSpyMessageIndent,
+                                   	      hWnd, msg,
+                                   	      lpstrSpyMessageFrom,
+                                   	      wParam, lParam);
+          		}
+        	    else
+             		  dprintf_message(stddeb,"%s(%04x) message [%04x] WM_USER+%04x sent from %s wp=%04x lp=%08lx\n",
+                               		  lpstrSpyMessageIndent,
+                               		  hWnd, msg, msg-WM_USER,
+                               		  lpstrSpyMessageFrom,
+                             		  wParam, lParam);
+
+	            if(SPY_MAX_INDENTLEVEL > iSpyMessageIndentLevel ) 
+		    	{
+			  iSpyMessageIndentLevel++;
+			  lpstrSpyMessageIndent[iSpyMessageIndentLevel]='\0';
+			  lpstrSpyMessageIndent[iSpyMessageIndentLevel-1]  ='\t';
+		      	}
+		    break;   
+	case SPY_DEFWNDPROC:
+		    if(msg <= WM_USER)
+		        if(MessageTypeNames[msg])
+		           dprintf_message(stddeb, "%s(%04x) DefWindowProc: %s [%04x]  wp=%04x lp=%08lx\n",
+		                           lpstrSpyMessageIndent,
+		                           hWnd, MessageTypeNames[msg], msg, wParam, lParam );
+		        else
+		           dprintf_message(stddeb, "%s(%04x) DefWindowProc: [%04x]  wp=%04x lp=%08lx\n",
+		                           lpstrSpyMessageIndent,
+		                           hWnd, msg, wParam, lParam );
+		    else
+		        dprintf_message(stddeb, "%s(%04x) DefWindowProc: WM_USER+%d [%04x] wp=%04x lp=%08lx\n",
+		                        lpstrSpyMessageIndent,
+		                        hWnd, msg - WM_USER, msg, wParam, lParam );
+		    break;
+	default:		    
+   }  
 
-    if (msg > SPY_MAX_MSGNUM || MessageTypeNames[msg] == NULL)
-	sprintf(msg_name, "%04x", msg);
-    else
-	strcpy(msg_name, MessageTypeNames[msg]);
-    
-    strcat(msg_name, ";");
-    
-    if ((strlen(SpyIncludes) == 0 || strstr(SpyIncludes, msg_name) != NULL) &&
-	strstr(SpyFilters, msg_name) == NULL)
+}
+
+/**********************************************************************
+ *			      ExitSpyMessage
+ */
+void ExitSpyMessage(int iFlag, HWND hWnd, WORD msg, LONG lReturn)
+{
+  WORD wCheckMsg = (msg > WM_USER)? WM_USER: msg;
+
+  if( !SpyIncludes[wCheckMsg] || SpyFilters[wCheckMsg]) return;
+
+  iSpyMessageIndentLevel--;
+  lpstrSpyMessageIndent[iSpyMessageIndentLevel]='\0';
+
+  switch(iFlag)
     {
-	msg_name[strlen(msg_name) - 1] = '\0';
-	dprintf_spy(stddeb, "%04x  %20.20s  %04x  %04x  %08lx\n",
-		hwnd, msg_name, msg, wParam, lParam);
+	case SPY_RESULT_INVALIDHWND: 
+		dprintf_message(stddeb,"%s(%04x) message [%04x] HAS INVALID HWND\n",
+                                lpstrSpyMessageIndent, hWnd, msg);
+	        break;
+	case SPY_RESULT_OK:
+		dprintf_message(stddeb,"%s(%04x) message [%04x] returned %08lx\n",
+	                        lpstrSpyMessageIndent, hWnd, msg, lReturn);
+		break;
+	default:
     }
 }
 
@@ -374,15 +509,30 @@ void SpyMessage(HWND hwnd, WORD msg, WORD wParam, LONG lParam)
  */
 void SpyInit(void)
 {
-    GetPrivateProfileString("spy", "exclude", "", SpyFilters, 
-			    sizeof(SpyFilters)-1, WINE_INI);
-    GetPrivateProfileString("spy", "include", "", SpyIncludes, 
-			    sizeof(SpyIncludes)-1, WINE_INI);
+    int      i;
+    char     lpstrBuffer[512];
+
+    for(i=0; i <= SPY_MAX_MSGNUM; i++) SpyFilters[i] = SpyIncludes[i] = FALSE;
+
+    GetPrivateProfileString("spy", "Exclude", "",lpstrBuffer ,511 , WINE_INI);
+    dprintf_message(stddeb,"SpyInit: Exclude=%s\n",lpstrBuffer);
+    if( *lpstrBuffer != 0 )
+      if(strstr(lpstrBuffer,"EXCLUDEALL"))
+	for(i=0; i <= SPY_MAX_MSGNUM; i++) SpyFilters[i] = TRUE;
+      else
+        for(i=0; i <= SPY_MAX_MSGNUM; i++)
+	    if(MessageTypeNames[i])
+	       if(strstr(lpstrBuffer,MessageTypeNames[i])) SpyFilters[i] = TRUE; 
+
+    GetPrivateProfileString("spy", "Include", "",lpstrBuffer ,511 , WINE_INI);
+    dprintf_message(stddeb,"SpyInit: Include=%s\n",lpstrBuffer);
+    if( *lpstrBuffer != 0 )
+      if(strstr(lpstrBuffer,"INCLUDEALL"))
+        for(i=0; i <= SPY_MAX_MSGNUM; i++) SpyIncludes[i] = TRUE;
+      else 
+        for(i=0; i <= SPY_MAX_MSGNUM; i++)
+            if(MessageTypeNames[i])
+               if(strstr(lpstrBuffer,MessageTypeNames[i])) SpyIncludes[i] = TRUE;
 
-    if (*SpyIncludes != 0) {
-      strcat(SpyIncludes, ";");
-    }
-    if (*SpyFilters != 0) {
-      strcat(SpyFilters, ";");
-    }
 }
+
diff --git a/misc/user.c b/misc/user.c
index 98b7b1b5ce2..1005ffd154e 100644
--- a/misc/user.c
+++ b/misc/user.c
@@ -89,7 +89,7 @@ BOOL USER_HeapInit(void)
 /**********************************************************************
  *					USER_InitApp
  */
-int USER_InitApp(int hInstance)
+int USER_InitApp(HINSTANCE hInstance)
 {
     int queueSize;
 
diff --git a/misc/user32.c b/misc/user32.c
index f5b280f305f..5a4c02f9853 100644
--- a/misc/user32.c
+++ b/misc/user32.c
@@ -17,7 +17,7 @@
 /* Structure copy functions */
 static void MSG16to32(MSG *msg16,struct WIN32_MSG *msg32)
 {
-	msg32->hwnd=msg16->hwnd;
+	msg32->hwnd=(DWORD)msg16->hwnd;
 	msg32->message=msg16->message;
 	msg32->wParam=msg16->wParam;
 	msg32->lParam=msg16->lParam;
@@ -28,7 +28,7 @@ static void MSG16to32(MSG *msg16,struct WIN32_MSG *msg32)
 
 static void MSG32to16(struct WIN32_MSG *msg32,MSG *msg16)
 {
-	msg16->hwnd=msg32->hwnd;
+	msg16->hwnd=(HWND)msg32->hwnd;
 	msg16->message=msg32->message;
 	msg16->wParam=msg32->wParam;
 	msg16->lParam=msg32->lParam;
@@ -45,14 +45,14 @@ ATOM USER32_RegisterClassA(WNDCLASSA* wndclass)
 	WNDCLASS copy;
 	char *s1,*s2;
 	copy.style=wndclass->style;
-	ALIAS_RegisterAlias(0,0,wndclass->lpfnWndProc);
+	ALIAS_RegisterAlias(0,0,(DWORD)wndclass->lpfnWndProc);
 	copy.lpfnWndProc=wndclass->lpfnWndProc;
 	copy.cbClsExtra=wndclass->cbClsExtra;
 	copy.cbWndExtra=wndclass->cbWndExtra;
-	copy.hInstance=wndclass->hInstance;
-	copy.hIcon=wndclass->hIcon;
-	copy.hCursor=wndclass->hCursor;
-	copy.hbrBackground=wndclass->hbrBackground;
+	copy.hInstance=(HINSTANCE)wndclass->hInstance;
+	copy.hIcon=(HICON)wndclass->hIcon;
+	copy.hCursor=(HCURSOR)wndclass->hCursor;
+	copy.hbrBackground=(HBRUSH)wndclass->hbrBackground;
 	if(wndclass->lpszMenuName)
 	{
 		s1=alloca(strlen(wndclass->lpszMenuName)+1);
@@ -75,7 +75,7 @@ ATOM USER32_RegisterClassA(WNDCLASSA* wndclass)
 LRESULT USER32_DefWindowProcA(DWORD hwnd,DWORD msg,DWORD wParam,DWORD lParam)
 {
 	/* some messages certainly need special casing. We come to that later */
-	return DefWindowProc(hwnd,msg,wParam,lParam);
+	return DefWindowProc((HWND)hwnd,msg,wParam,lParam);
 }
 
 /***********************************************************************
@@ -85,7 +85,7 @@ BOOL USER32_GetMessageA(struct WIN32_MSG* lpmsg,DWORD hwnd,DWORD min,DWORD max)
 {
 	BOOL ret;
 	MSG msg;
-	ret=GetMessage(MAKE_SEGPTR(&msg),hwnd,min,max);
+	ret=GetMessage(MAKE_SEGPTR(&msg),(HWND)hwnd,min,max);
 	MSG16to32(&msg,lpmsg);
 	return ret;
 }
@@ -97,8 +97,8 @@ HDC USER32_BeginPaint(DWORD hwnd,struct WIN32_PAINTSTRUCT *lpps)
 {
 	PAINTSTRUCT ps;
 	HDC ret;
-	ret=BeginPaint(hwnd,&ps);
-	lpps->hdc=ps.hdc;
+	ret=BeginPaint((HWND)hwnd,&ps);
+	lpps->hdc=(DWORD)ps.hdc;
 	lpps->fErase=ps.fErase;
 	lpps->rcPaint.top=ps.rcPaint.top;
 	lpps->rcPaint.left=ps.rcPaint.left;
@@ -123,7 +123,7 @@ BOOL USER32_EndPaint(DWORD hwnd,struct WIN32_PAINTSTRUCT *lpps)
 	ps.rcPaint.bottom=lpps->rcPaint.bottom;
 	ps.fRestore=lpps->fRestore;
 	ps.fIncUpdate=lpps->fIncUpdate;
-	EndPaint(hwnd,&ps);
+	EndPaint((HWND)hwnd,&ps);
 	return TRUE;
 }
 
diff --git a/misc/winsocket.c b/misc/winsocket.c
index 2fdd5a6c595..23675a1c9de 100644
--- a/misc/winsocket.c
+++ b/misc/winsocket.c
@@ -90,14 +90,14 @@ struct WinSockHeap {
 	char scratch[8192];
 };
 static struct WinSockHeap *Heap;
-static int HeapHandle;
+static HANDLE HeapHandle;
 static int ScratchPtr;
 
 #ifndef WINELIB
 #define GET_SEG_PTR(x)	MAKELONG((int)((char*)(x)-(char*)Heap),	\
 							GlobalHandleToSel(HeapHandle))
 #else
-#define GET_SEG_PTR(x)	(x)
+#define GET_SEG_PTR(x)	((SEGPTR)x)
 #endif
 
 #ifndef WINELIB
@@ -196,7 +196,9 @@ static WORD wsaerrno(void)
 	case ESTALE:		return WSAESTALE;
 	case EREMOTE:		return WSAEREMOTE;
 
+#ifdef EDQUOT
         default:
+#endif
 		fprintf(stderr, "winsock: unknown errorno %d!\n", errno);
 		return WSAEOPNOTSUPP;
 	}
@@ -283,7 +285,7 @@ static void CONVERT_HOSTENT(struct WIN_hostent *heapent, struct hostent *host)
 	for(i=0;host->h_addr_list[i];i++)
 		;
 	addr_list=scratch_alloc(sizeof(SEGPTR)*(i+1));
-	heapent->h_addr_list = GET_SEG_PTR(addr_list);
+	heapent->h_addr_list = (char**)GET_SEG_PTR(addr_list);
 	for(i=0;host->h_addr_list[i];i++)
 	{
 		void *addr=scratch_alloc(host->h_length);
@@ -740,17 +742,18 @@ static void recv_message(int sig)
 {
 	struct ipc_packet message;
 
-	if (msgrcv(wine_key, &message, IPC_PACKET_SIZE, MTYPE, IPC_NOWAIT) == -1)
+	if (msgrcv(wine_key, (struct msgbuf*)&message, 
+		   IPC_PACKET_SIZE, MTYPE, IPC_NOWAIT) == -1)
 		perror("wine: msgrcv");
 
 	fprintf(stderr, 
-		"WSA: PostMessage (hwnd %d, wMsg %d, wParam %d, lParam %ld)\n",
+		"WSA: PostMessage (hwnd "NPFMT", wMsg %d, wParam "NPFMT", lParam %ld)\n",
 		message.hWnd,
 		message.wMsg,
 		message.handle,
 		message.lParam);
 
-	PostMessage(message.hWnd, message.wMsg, message.handle, message.lParam);
+	PostMessage(message.hWnd, message.wMsg, (WPARAM)message.handle, message.lParam);
 		
 	signal(SIGUSR1, recv_message);
 }
@@ -767,10 +770,11 @@ static void send_message(HANDLE handle, HWND hWnd, u_int wMsg, long lParam)
 	message.lParam = lParam;
 
 	fprintf(stderr, 
-		"WSA: send (hwnd %d, wMsg %d, handle %d, lParam %ld)\n",
+		"WSA: send (hwnd "NPFMT", wMsg %d, handle "NPFMT", lParam %ld)\n",
 		hWnd, wMsg, handle, lParam);
 	
-	if (msgsnd(wine_key, &message,  IPC_PACKET_SIZE, IPC_NOWAIT) == -1)
+	if (msgsnd(wine_key, (struct msgbuf*)&message,  
+		   IPC_PACKET_SIZE, IPC_NOWAIT) == -1)
 		perror("wine: msgsnd");
 		
 	kill(getppid(), SIGUSR1);
@@ -913,7 +917,7 @@ INT WSAAsyncSelect(SOCKET s, HWND hWnd, u_int wMsg, long lEvent)
 	long event;
 	fd_set read_fds, write_fds, except_fds;
 
-	dprintf_winsock(stddeb, "WSA_AsyncSelect: socket %d, HWND %d, wMsg %d, event %ld\n", s, hWnd, wMsg, lEvent);
+	dprintf_winsock(stddeb, "WSA_AsyncSelect: socket %d, HWND "NPFMT", wMsg %d, event %ld\n", s, hWnd, wMsg, lEvent);
 
 	/* remove outstanding asyncselect() processes */
 	/* kill */
@@ -955,7 +959,7 @@ INT WSAFDIsSet(INT fd, fd_set *set)
 
 INT WSACancelAsyncRequest(HANDLE hAsyncTaskHandle)
 {
-	dprintf_winsock(stddeb, "WSA_AsyncRequest: handle %d\n", hAsyncTaskHandle);
+	dprintf_winsock(stddeb, "WSA_AsyncRequest: handle "NPFMT"\n", hAsyncTaskHandle);
 
 	return 0;
 }
diff --git a/miscemu/Imakefile b/miscemu/Imakefile
deleted file mode 100644
index 60adb1ad09d..00000000000
--- a/miscemu/Imakefile
+++ /dev/null
@@ -1,29 +0,0 @@
-#include "../Wine.tmpl"
-
-MODULE = miscemu
-
-SRCS = \
-	dosmem.c \
-	dpmi.c \
-	emulate.c \
-	instr.c \
-	int10.c \
-	int13.c \
-	int1a.c \
-	int21.c \
-	int25.c \
-	int26.c \
-	int2a.c \
-	int2f.c \
-	int5c.c \
-	interrupts.c \
-	ioports.c
-
-OBJS = $(SRCS:.c=.o)
-
-WineRelocatableTarget($(MODULE),,$(OBJS))
-DependTarget()
-
-includes::
-
-install::
diff --git a/miscemu/Makefile.in b/miscemu/Makefile.in
index 6df68b0aa6d..f1f67ea88dc 100644
--- a/miscemu/Makefile.in
+++ b/miscemu/Makefile.in
@@ -2,6 +2,7 @@ TOPSRC = @top_srcdir@
 MODULE = miscemu
 
 C_SRCS = \
+	cpu.c \
 	dosmem.c \
 	dpmi.c \
 	emulate.c \
@@ -14,9 +15,11 @@ C_SRCS = \
 	int26.c \
 	int2a.c \
 	int2f.c \
+	int4b.c \
 	int5c.c \
 	interrupts.c \
-	ioports.c
+	ioports.c \
+	vxd.c
 
 all: $(MODULE).o
 
diff --git a/miscemu/cpu.c b/miscemu/cpu.c
new file mode 100644
index 00000000000..436c35b44e9
--- /dev/null
+++ b/miscemu/cpu.c
@@ -0,0 +1,43 @@
+/*
+ * What processor?
+ *
+ * Copyright 1995 Morten Welinder
+ */
+
+#include <stdio.h>
+#include <ctype.h>
+#include <string.h>
+
+int runtime_cpu (void)
+{
+  static int cache = 0;
+
+#ifdef linux
+  if (!cache)
+    {
+      FILE *f = fopen ("/proc/cpuinfo", "r");
+
+      cache = 3;  /* Default.  */
+
+      if (f)
+	{
+	  char info[5], value[5];
+	  while (fscanf (f, " %4s%*s : %4s%*s", info, value) == 2)
+	    if (!strcasecmp (info, "cpu"))
+	      {
+		if (isdigit (value[0]) && value[1] == '8'
+		    && value[2] == '6' && value[3] == 0)
+		  {
+		    cache = value[0] - '0';
+		    break;
+		  }
+	      }
+	  fclose (f);
+	}
+    }
+  return cache;
+#else
+  /* FIXME: how do we do this on other systems? */
+  return 3;
+#endif
+}
diff --git a/miscemu/dpmi.c b/miscemu/dpmi.c
index 1c787e97b64..73893966a33 100644
--- a/miscemu/dpmi.c
+++ b/miscemu/dpmi.c
@@ -127,10 +127,24 @@ void INT_Int31Handler( struct sigcontext_struct context )
                        (SEGPTR)MAKELONG( DX_reg(&context), CX_reg(&context) ));
 	break;
 
+    case 0x0300:  /* Simulate real mode interrupt 
+        *  Interrupt number is in BL, flags are in BH
+        *  ES:DI points to real-mode call structure  
+        *  Currently we just print it out and return error.
+        */
+        ptr = (BYTE *)PTR_SEG_OFF_TO_LIN( ES_reg(&context), DI_reg(&context) );
+        fprintf(stdnimp,
+               "RealModeInt %02x: AX=%04x BX=%04x CX=%04x DX=%04x SI=%04x DI=%04x ES=%04x DS=%04x\n",
+                BL_reg(&context),
+              *(WORD*)(ptr+0x1c),*(WORD*)(ptr+0x10),*(WORD*)(ptr+0x18),*(WORD*)(ptr+0x14),
+              *(WORD*)(ptr+0x04),*(WORD*)(ptr+0x00),*(WORD*)(ptr+0x22),*(WORD*)(ptr+0x24));
+        SET_CFLAG(&context);
+        break;
+
     case 0x0400:  /* Get DPMI version */
         AX_reg(&context) = 0x005a;  /* DPMI version 0.90 */
         BX_reg(&context) = 0x0005;  /* Flags: 32-bit, virtual memory */
-        CL_reg(&context) = 3;       /* CPU type: 386 */
+        CL_reg(&context) = runtime_cpu ();
         DX_reg(&context) = 0x0102;  /* Master/slave interrupt controller base*/
         break;
 
diff --git a/miscemu/emulate.c b/miscemu/emulate.c
index afa61e7fd04..d31ccb73d58 100644
--- a/miscemu/emulate.c
+++ b/miscemu/emulate.c
@@ -72,7 +72,7 @@ void WIN87_fpmath( struct sigcontext_struct context )
         /* IN: AX&0x0C00 rounding protocol */
         /* OUT: DX:AX variable popped */
         {
-            DWORD dw;
+            DWORD dw=0;
             /* I don't know much about asm() programming. This could be 
              * wrong. 
              */
@@ -91,6 +91,7 @@ void WIN87_fpmath( struct sigcontext_struct context )
         break;
 
     case 10: /* dunno. but looks like returning nr. of things on stack in AX */
+	AX_reg(&context) = 0;
         break;
 
     case 11: /* just returns the installed flag in DX:AX */
diff --git a/miscemu/instr.c b/miscemu/instr.c
index e5d89d858e9..83f7cefafe4 100644
--- a/miscemu/instr.c
+++ b/miscemu/instr.c
@@ -11,10 +11,12 @@
 #include "registers.h"
 
 
+#define STACK_reg(context) \
+   ((GET_SEL_FLAGS(SS_reg(context)) & LDT_FLAGS_32BIT) ? \
+                   ESP_reg(context) : SP_reg(context))
+
 #define STACK_PTR(context) \
-    (PTR_SEG_OFF_TO_LIN( SS_reg(context), \
-        ((GET_SEL_FLAGS(SS_reg(context)) & LDT_FLAGS_32BIT) ? \
-            ESP_reg(context) : SP_reg(context))))
+    (PTR_SEG_OFF_TO_LIN(SS_reg(context),STACK_reg(context)))
 
 /***********************************************************************
  *           INSTR_ReplaceSelector
@@ -250,8 +252,12 @@ static BOOL INSTR_EmulateLDS( struct sigcontext_struct *context,
     case 0x0f: switch(instr[1])
                {
                case 0xb2: SS_reg(context) = seg; break;  /* lss */
+#ifdef FS_reg
                case 0xb4: FS_reg(context) = seg; break;  /* lfs */
+#endif
+#ifdef GS_reg
                case 0xb5: GS_reg(context) = seg; break;  /* lgs */
+#endif
                }
                break;
     }
@@ -298,12 +304,16 @@ BOOL INSTR_EmulateInstruction( struct sigcontext_struct *context )
         case 0x26:
             segprefix = ES_reg(context);
             break;
+#ifdef FS_reg
         case 0x64:
             segprefix = FS_reg(context);
             break;
+#endif
+#ifdef GS_reg
         case 0x65:
             segprefix = GS_reg(context);
             break;
+#endif
         case 0x66:
             long_op = !long_op;  /* opcode size prefix */
             break;
@@ -346,7 +356,7 @@ BOOL INSTR_EmulateInstruction( struct sigcontext_struct *context )
                     case 0x17: SS_reg(context) = seg; break;
                     case 0x1f: DS_reg(context) = seg; break;
                     }
-                    SP_reg(context) += sizeof(WORD);
+                    STACK_reg(context) += long_op ? 4 : 2;
                     EIP_reg(context) += prefixlen + 1;
                     return TRUE;
                 }
@@ -356,27 +366,43 @@ BOOL INSTR_EmulateInstruction( struct sigcontext_struct *context )
         case 0x0f: /* extended instruction */
             switch(instr[1])
             {
+#ifdef FS_reg
             case 0xa1: /* pop fs */
+                {
+                    WORD seg = *(WORD *)STACK_PTR( context );
+                    if ((seg = INSTR_ReplaceSelector( context, seg )) != 0)
+                    {
+                        FS_reg(context) = seg;
+                        STACK_reg(context) += long_op ? 4 : 2;
+                        EIP_reg(context) += prefixlen + 2;
+                        return TRUE;
+                    }
+                }
+                break;
+#endif  /* FS_reg */
+
+#ifdef GS_reg
             case 0xa9: /* pop gs */
                 {
                     WORD seg = *(WORD *)STACK_PTR( context );
                     if ((seg = INSTR_ReplaceSelector( context, seg )) != 0)
                     {
-                        switch(instr[1])
-                        {
-                        case 0xa1: FS_reg(context) = seg; break;
-                        case 0xa9: GS_reg(context) = seg; break;
-                        }
-                        SP_reg(context) += sizeof(WORD);
+                        GS_reg(context) = seg;
+                        STACK_reg(context) += long_op ? 4 : 2;
                         EIP_reg(context) += prefixlen + 2;
                         return TRUE;
                     }
                 }
                 break;
+#endif  /* GS_reg */
 
             case 0xb2: /* lss addr,reg */
+#ifdef FS_reg
             case 0xb4: /* lfs addr,reg */
+#endif
+#ifdef GS_reg
             case 0xb5: /* lgs addr,reg */
+#endif
                 if (INSTR_EmulateLDS( context, instr, long_op,
                                       long_addr, segprefix, &len ))
                 {
@@ -458,7 +484,7 @@ BOOL INSTR_EmulateInstruction( struct sigcontext_struct *context )
 	    }
             return TRUE;
 
-        case 0x8e: /* mov reg,segment_reg */
+        case 0x8e: /* mov XX,segment_reg */
             {
                 WORD seg = *(WORD *)INSTR_GetOperandAddr( context, instr + 1,
                                                   long_addr, segprefix, &len );
@@ -482,13 +508,17 @@ BOOL INSTR_EmulateInstruction( struct sigcontext_struct *context )
                     EIP_reg(context) += prefixlen + len + 1;
                     return TRUE;
                 case 4:
+#ifdef FS_reg
                     FS_reg(context) = seg;
                     EIP_reg(context) += prefixlen + len + 1;
                     return TRUE;
+#endif
                 case 5:
+#ifdef GS_reg
                     GS_reg(context) = seg;
                     EIP_reg(context) += prefixlen + len + 1;
                     return TRUE;
+#endif
                 case 6:  /* unused */
                 case 7:  /* unused */
                     break;
@@ -520,7 +550,7 @@ BOOL INSTR_EmulateInstruction( struct sigcontext_struct *context )
                 *(--stack) = FL_reg(context);
                 *(--stack) = CS_reg(context);
                 *(--stack) = IP_reg(context) + prefixlen + 2;
-                SP_reg(context) -= 3 * sizeof(WORD);
+                STACK_reg(context) -= 3 * sizeof(WORD);
                 /* Jump to the interrupt handler */
                 CS_reg(context)  = HIWORD(addr);
                 EIP_reg(context) = LOWORD(addr);
@@ -534,7 +564,7 @@ BOOL INSTR_EmulateInstruction( struct sigcontext_struct *context )
                 EIP_reg(context) = *stack++;
                 CS_reg(context)  = *stack++;
                 EFL_reg(context) = *stack;
-                SP_reg(context) += 3*sizeof(DWORD);  /* Pop the return address and flags */
+                STACK_reg(context) += 3*sizeof(DWORD);  /* Pop the return address and flags */
             }
             else
             {
@@ -542,7 +572,7 @@ BOOL INSTR_EmulateInstruction( struct sigcontext_struct *context )
                 EIP_reg(context) = *stack++;
                 CS_reg(context)  = *stack++;
                 FL_reg(context)  = *stack;
-                SP_reg(context) += 3*sizeof(WORD);  /* Pop the return address and flags */
+                STACK_reg(context) += 3*sizeof(WORD);  /* Pop the return address and flags */
             }
             return TRUE;
 
diff --git a/miscemu/int1a.c b/miscemu/int1a.c
index 69386c0967e..738029c923c 100644
--- a/miscemu/int1a.c
+++ b/miscemu/int1a.c
@@ -23,12 +23,14 @@ DWORD INT1A_GetTicksSinceMidnight(void)
 {
     struct tm *bdtime;
     struct timeval tvs;
+    time_t seconds;
 
     /* This should give us the (approximately) correct
      * 18.206 clock ticks per second since midnight.
      */
     gettimeofday( &tvs, NULL );
-    bdtime = localtime( &tvs.tv_sec );
+    seconds = tvs.tv_sec;
+    bdtime = localtime( &seconds );
     return (((bdtime->tm_hour * 3600 + bdtime->tm_min * 60 +
               bdtime->tm_sec) * 18206) / 1000) +
                   (tvs.tv_usec / 54927);
diff --git a/miscemu/int21.c b/miscemu/int21.c
index d580ec5cb48..30862a6470e 100644
--- a/miscemu/int21.c
+++ b/miscemu/int21.c
@@ -25,7 +25,12 @@
 #include "miscemu.h"
 #include "stddebug.h"
 #include "debug.h"
-
+#ifdef __svr4__
+/* SVR4 DOESNTdo locking the same way must implement properly */
+#define LOCK_EX 0
+#define LOCK_SH  1
+#define LOCK_NB  8
+#endif
 /* Define the drive parameter block, as used by int21/1F
  * and int21/32.  This table can be accessed through the
  * global 'dpb' pointer, which points into the local dos
@@ -53,8 +58,7 @@ struct DPB
     WORD free_clusters;     /* Number of free clusters (0xFFFF=unknown) */
 };
 
-WORD ExtendedError, CodePage = 437;
-BYTE ErrorClass, Action, ErrorLocus;
+WORD CodePage = 437;
 struct DPB *dpb;
 DWORD dpbsegptr;
 
@@ -74,53 +78,9 @@ extern char TempDirectory[];
 
 static int Error(int e, int class, int el)
 {
-	ErrorClass = class;
-	Action = SA_Ask4Retry;
-	ErrorLocus = el;
-	ExtendedError = e;
-
-	return e;
+  return DOS_Error(e,class,el);
 }
 
-void errno_to_doserr(void)
-{
-	switch (errno) {
-		case EAGAIN:
-			Error (ShareViolation, EC_Temporary, EL_Unknown);
-			break;
-		case EBADF:
-			Error (InvalidHandle, EC_AppError, EL_Unknown);
-			break;
-		case ENOSPC:
-			Error (DiskFull, EC_MediaError, EL_Disk);
-			break;				
-		case EACCES:
-		case EPERM:
-		case EROFS:
-			Error (WriteProtected, EC_AccessDenied, EL_Unknown);
-			break;
-		case EBUSY:
-			Error (LockViolation, EC_AccessDenied, EL_Unknown);
-			break;		
-		case ENOENT:
-			Error (FileNotFound, EC_NotFound, EL_Unknown);
-			break;				
-		case EISDIR:
-			Error (CanNotMakeDir, EC_AccessDenied, EL_Unknown);
-			break;
-		case ENFILE:
-		case EMFILE:
-			Error (NoMoreFiles, EC_MediaError, EL_Unknown);
-			break;
-		case EEXIST:
-			Error (FileExists, EC_Exists, EL_Disk);
-			break;				
-		default:
-			dprintf_int(stddeb, "int21: unknown errno %d!\n", errno);
-			Error (GeneralFailure, EC_SystemFailure, EL_Unknown);
-			break;
-	}
-}
 
 BYTE *GetCurrentDTA(void)
 {
@@ -488,9 +448,11 @@ static void GetSystemTime(struct sigcontext_struct *context)
 {
 	struct tm *now;
 	struct timeval tv;
+	time_t seconds;
 
 	gettimeofday(&tv,NULL);		/* Note use of gettimeofday(), instead of time() */
-	now = localtime(&tv.tv_sec);
+	seconds = tv.tv_sec;
+	now = localtime(&seconds);
 	 
 	CX_reg(context) = (now->tm_hour<<8) | now->tm_min;
 	DX_reg(context) = (now->tm_sec<<8) | tv.tv_usec/10000;
@@ -591,7 +553,11 @@ void OpenExistingFile(struct sigcontext_struct *context)
 
 	  int result,retries=sharing_retries;
 	  {
+#ifdef __svr4__
+              printf("Should call flock and needs porting to lockf\n");
+#else
 	    result = flock(handle, lock | LOCK_NB);
+#endif
 	    if ( retries && (!result) )
 	    {
               int i;
@@ -668,8 +634,7 @@ static void MakeDir(struct sigcontext_struct *context)
             return;
 	}
 
-	if (mkdir(dirname,0) == -1)
-        {
+	if ((mkdir(dirname,0) == -1)  && errno!=EEXIST) {
             Error( CanNotMakeDir, EC_AccessDenied, EL_Disk );
             AX_reg(context) = CanNotMakeDir;
             SET_CFLAG(context);
@@ -1553,6 +1518,7 @@ void DOS3Call( struct sigcontext_struct context )
               case 0x0F:   /* Set logical drive mapping */
                 /* FIXME: Not implemented at the moment, always returns error
                  */
+		fprintf(stdnimp,"Attempt to map drive %02x\n",BL_reg(&context));
                 AX_reg(&context) = 0x0001; /* invalid function */
                 SET_CFLAG(&context);
                 break;
@@ -1763,8 +1729,8 @@ void DOS3Call( struct sigcontext_struct context )
 	    }
 	    break;
     
-      case 0xdc: /* CONNECTION SERVICES - GET CONNECTION NUMBER */
-        break;
+          case 0xdc: /* CONNECTION SERVICES - GET CONNECTION NUMBER */
+            break;
 
 	  case 0xea: /* NOVELL NETWARE - RETURN SHELL VERSION */
 	    break;
diff --git a/miscemu/int2f.c b/miscemu/int2f.c
index 66a7a0177b0..779f6b787aa 100644
--- a/miscemu/int2f.c
+++ b/miscemu/int2f.c
@@ -1,14 +1,19 @@
 #include <stdio.h>
 #include <stdlib.h>
+#include <unistd.h>
 #include "registers.h"
 #include "wine.h"
 #include "msdos.h"
 #include "miscemu.h"
+#include "module.h"
 #include "options.h"
 #include "stddebug.h"
 /* #define DEBUG_INT */
 #include "debug.h"
 
+  /* base WINPROC module number for VxDs */
+#define VXD_BASE 400
+
 static void do_int2f_16(struct sigcontext_struct *context);
 
 /**********************************************************************
@@ -20,25 +25,41 @@ void INT_Int2fHandler( struct sigcontext_struct context )
 {
     switch(AH_reg(&context))
     {
-	case 0x10:
-                AL_reg(&context) = 0xff; /* share is installed */
-		break;
-
-	case 0x15: /* mscdex */
-		/* ignore requests */
-		break;
-
-	case 0x16:
-		do_int2f_16( &context );
-                break;
-	default:
-		INT_BARF( &context, 0x2f );
-            }
+    case 0x10:
+        AL_reg(&context) = 0xff; /* share is installed */
+        break;
+
+    case 0x15: /* mscdex */
+        /* ignore requests */
+        break;
+
+    case 0x16:
+        do_int2f_16( &context );
+        break;
+
+    case 0x4a:
+        switch(AL_reg(&context))
+        {
+        case 0x12:  /* realtime compression interface */
+            break;  /* not installed */
+        default:
+            INT_BARF( &context, 0x2f );
+        }
+        break;
+    default:
+        INT_BARF( &context, 0x2f );
+        break;
+    }
 }
 
 
+/**********************************************************************
+ *	    do_int2f_16
+ */
 static void do_int2f_16(struct sigcontext_struct *context)
 {
+    DWORD addr;
+
     switch(AL_reg(context))
     {
     case 0x00:  /* Windows enhanced mode installation check */
@@ -52,34 +73,56 @@ static void do_int2f_16(struct sigcontext_struct *context)
         break;
 
     case 0x80:  /* Release time-slice */
-        break;  /* nothing to do */
+	AL_reg(context) = 0;
+	/* FIXME: We need to do something that lets some other process run
+	   here.  */
+	sleep(0);
+        break;
 
-	case 0x84:  /* Get device API entry point */
-	    fprintf(stderr,"Application attempted to access VxD %4X\n",
-			BX_reg(context));
-		fprintf(stderr,"This device is not known to Wine.");
-		fprintf(stderr,"Expect a failure now\n");
-		ES_reg(context)=0;
-		DI_reg(context)=0;
-		break;
+    case 0x83:  /* Return Current Virtual Machine ID */
+        /* Virtual Machines are usually created/destroyed when Windows runs
+         * DOS programs. Since we never do, we are always in the System VM.
+         * According to Ralf Brown's Interrupt List, never return 0. But it
+         * seems to work okay (returning 0), just to be sure we return 1.
+         */
+	BX_reg(context) = 1; /* VM 1 is probably the System VM */
+	break;
+
+    case 0x84:  /* Get device API entry point */
+        addr = MODULE_GetEntryPoint( GetModuleHandle("WINPROCS"),
+                                     VXD_BASE + BX_reg(context) );
+        if (!addr)  /* not supported */
+        {
+	    fprintf( stderr,"Application attempted to access VxD %04x\n",
+                     BX_reg(context) );
+	    fprintf( stderr,"This device is not known to Wine.");
+	    fprintf( stderr,"Expect a failure now\n");
+        }
+	ES_reg(context) = SELECTOROF(addr);
+	DI_reg(context) = OFFSETOF(addr);
+	break;
 
     case 0x86:  /* DPMI detect mode */
         AX_reg(context) = 0;  /* Running under DPMI */
         break;
 
+    /* FIXME: is this right?  Specs say that this should only be callable
+       in real (v86) mode which we never enter.  */
     case 0x87:  /* DPMI installation check */
         AX_reg(context) = 0x0000; /* DPMI Installed */
         BX_reg(context) = 0x0001; /* 32bits available */
-        CL_reg(context) = 0x03;   /* processor 386 */
+        CL_reg(context) = runtime_cpu();
         DX_reg(context) = 0x005a; /* DPMI major/minor 0.90 */
         SI_reg(context) = 0;      /* # of para. of DOS extended private data */
         ES_reg(context) = 0;      /* ES:DI is DPMI switch entry point */
         DI_reg(context) = 0;
         break;
 
+    case 0x8a:  /* DPMI get vendor-specific API entry point. */
+	/* The 1.0 specs say this should work with all 0.9 hosts.  */
+	break;
+
     default:
         INT_BARF( context, 0x2f );
     }
 }
-
-
diff --git a/miscemu/int4b.c b/miscemu/int4b.c
new file mode 100644
index 00000000000..16cf0b6d8c2
--- /dev/null
+++ b/miscemu/int4b.c
@@ -0,0 +1,34 @@
+/*
+ * Int 4B handling
+ *
+ */
+
+#include "wine.h"
+#include "miscemu.h"
+#include "stddebug.h"
+/* #define DEBUG_INT */
+#include "debug.h"
+#include "registers.h"
+
+
+/***********************************************************************
+ *           INT_Int4bHandler
+ *
+ */
+void INT_Int4bHandler( struct sigcontext_struct context )
+{
+
+  switch(AH_reg(&context))
+   {
+	case 0x81: /* Virtual DMA Spec (IBM SCSI interface) */   
+             if(AL_reg(&context) != 0x02) /* if not install check */
+		{
+		 SET_CFLAG(&context);		 
+		 AL_reg(&context) = 0x0f; /* function is not implemented */
+		}
+	     break;
+        default:
+	     INT_BARF(&context, 0x4b);
+    }
+}
+
diff --git a/miscemu/int5c.c b/miscemu/int5c.c
index f2794b70bbc..28540f285ec 100644
--- a/miscemu/int5c.c
+++ b/miscemu/int5c.c
@@ -1,9 +1,10 @@
 /*
  * NetBIOS interrupt handling
  *
- * Copyright 1995 Alexandre Julliard
+ * Copyright 1995 Alexandre Julliard, Alex Korobka
  */
 
+#include "ldt.h"
 #include "wine.h"
 #include "miscemu.h"
 #include "stddebug.h"
@@ -15,9 +16,16 @@
 /***********************************************************************
  *           NetBIOSCall  (KERNEL.103)
  *
- * Also handler for interrupt 5c.
+ * Also handler for interrupt 5c. 
  */
 void NetBIOSCall( struct sigcontext_struct context )
 {
-    INT_BARF( &context, 0x5c );
+  BYTE* ptr;
+
+  ptr = (BYTE*) PTR_SEG_OFF_TO_LIN(ES_reg(&context),BX_reg(&context));
+
+  fprintf(stdnimp,"NetBIOSCall: command code %02x (ignored)\n",*ptr);
+  
+  AL_reg(&context) = *(ptr+0x01) = 0xFB; /* NetBIOS emulator not found */
 }
+
diff --git a/miscemu/vxd.c b/miscemu/vxd.c
new file mode 100644
index 00000000000..95712f47b03
--- /dev/null
+++ b/miscemu/vxd.c
@@ -0,0 +1,141 @@
+/*
+ * VxD emulation
+ *
+ * Copyright 1995 Anand Kumria
+ */
+
+#include <stdio.h>
+#include "windows.h"
+#include "msdos.h"
+#include "miscemu.h"
+#include "wine.h"
+#include "stddebug.h"
+/* #define DEBUG_VXD */
+#include "debug.h"
+
+
+/***********************************************************************
+ *           VXD_PageFile
+ */
+void VXD_PageFile( struct sigcontext_struct context )
+{
+    /* taken from Ralf Brown's Interrupt List */
+
+    dprintf_vxd(stddeb,"VxD PageFile called ...\n");
+
+    switch(AX_reg(&context)) 
+    {
+    case 0x00: /* get version, is this windows version? */
+	dprintf_vxd(stddeb,"VxD PageFile: returning version\n");
+        AX_reg(&context) = (WINVERSION >> 8) | ((WINVERSION << 8) & 0xff00);
+	RESET_CFLAG(&context);
+	break;
+
+    case 0x01: /* get swap file info */
+	dprintf_vxd(stddeb,"VxD PageFile: returning swap file info\n");
+	AX_reg(&context) = 0x00; /* paging disabled */
+	ECX_reg(&context) = 0;   /* maximum size of paging file */	
+	/* FIXME: do I touch DS:SI or DS:DI? */
+	RESET_CFLAG(&context);
+	break;
+
+    case 0x02: /* delete permanent swap on exit */
+	dprintf_vxd(stddeb,"VxD PageFile: supposed to delete swap\n");
+	RESET_CFLAG(&context);
+	break;
+
+    case 0x03: /* current temporary swap file size */
+	dprintf_vxd(stddeb,"VxD PageFile: what is current temp. swap size\n");
+	RESET_CFLAG(&context);
+	break;
+
+    case 0x04: /* read or write?? INTERRUP.D */
+    case 0x05: /* cancel?? INTERRUP.D */
+    case 0x06: /* test I/O valid INTERRUP.D */
+    default:
+	INT_BARF( &context, 0x2f);
+	break;
+    }
+}
+
+
+/***********************************************************************
+ *           VXD_Shell
+ */
+void VXD_Shell( struct sigcontext_struct context )
+{
+    dprintf_vxd(stddeb,"VxD Shell called ...\n");
+
+    switch (DX_reg(&context)) /* Ralf Brown says EDX, but I use DX instead */
+    {
+    case 0x0000:
+	dprintf_vxd(stddeb,"VxD Shell: returning version\n");
+        AX_reg(&context) = (WINVERSION >> 8) | ((WINVERSION << 8) & 0xff00);
+	EBX_reg(&context) = 1; /* system VM Handle */
+	break;
+
+    case 0x0001:
+    case 0x0002:
+    case 0x0003:
+    case 0x0004:
+    case 0x0005:
+	dprintf_vxd(stddeb,"VxD Shell: EDX = %08lx\n",EDX_reg(&context));
+	INT_BARF( &context, 0x2f);
+	break;
+
+    case 0x0006: /* SHELL_Get_VM_State */
+	dprintf_vxd(stddeb,"VxD Shell: returning VM state\n");
+	/* Actually we don't, not yet. We have to return a structure
+         * and I am not to sure how to set it up and return it yet,
+         * so for now let's do nothing. I can (hopefully) get this
+         * by the next release
+         */
+	/* RESET_CFLAG(&context); */
+	break;
+
+    case 0x0007:
+    case 0x0008:
+    case 0x0009:
+    case 0x000A:
+    case 0x000B:
+    case 0x000C:
+    case 0x000D:
+    case 0x000E:
+    case 0x000F:
+    case 0x0010:
+    case 0x0011:
+    case 0x0012:
+    case 0x0013:
+    case 0x0014:
+    case 0x0015:
+    case 0x0016:
+    default:
+ 	dprintf_vxd(stddeb,"VxD Shell: EDX = %08lx\n",EDX_reg(&context)); 
+	INT_BARF( &context, 0x2f);
+	break;
+    }
+}
+
+
+/***********************************************************************
+ *           VXD_Comm
+ */
+void VXD_Comm( struct sigcontext_struct context )
+{
+    dprintf_vxd(stddeb,"VxD Comm called ...\n");
+
+    switch (AX_reg(&context))
+    {
+    case 0x0000: /* get version */
+	dprintf_vxd(stddeb,"VxD Comm: returning version\n");
+        AX_reg(&context) = (WINVERSION >> 8) | ((WINVERSION << 8) & 0xff00);
+	RESET_CFLAG(&context);
+	break;
+
+    case 0x0001: /* set port global */
+    case 0x0002: /* get focus */
+    case 0x0003: /* virtualise port */
+    default:
+        INT_BARF( &context, 0x2f);
+    }
+}
diff --git a/multimedia/Imakefile b/multimedia/Imakefile
deleted file mode 100644
index 51ea94fb8b3..00000000000
--- a/multimedia/Imakefile
+++ /dev/null
@@ -1,23 +0,0 @@
-#include "../Wine.tmpl"
-
-MODULE = multimedia
-
-SRCS = \
-	audio.c \
-	joystick.c \
-	mcianim.c \
-	mcicda.c \
-	mcistring.c \
-	midi.c \
-	mmaux.c \
-	mmsystem.c \
-	time.c
-
-OBJS = $(SRCS:.c=.o)
-
-WineRelocatableTarget($(MODULE),,$(OBJS))
-DependTarget()
-
-includes::
-
-install::
diff --git a/multimedia/mcistring.c b/multimedia/mcistring.c
index f860563e355..79fe669813e 100644
--- a/multimedia/mcistring.c
+++ b/multimedia/mcistring.c
@@ -753,21 +753,21 @@ MCISTR_Set(_MCISTR_PROTO_) {
 			}
 
 			/* <keyword> <integer> */
-#define WII(str,flag,element) \
+#define WII(str,flag,fmt,element) \
 			if (!STRCMP(keywords[i],str) && (i+1<nrofkeywords)) {\
-				sscanf(keywords[i+1],"%d",&(U.wavesetParams. element ));\
+				sscanf(keywords[i+1],fmt,&(U.wavesetParams. element ));\
 				dwFlags |= flag;\
 				i+=2;\
 				continue;\
 			}
-			WII("formattag",MCI_WAVE_SET_FORMATTAG,wFormatTag);
-			WII("channels",MCI_WAVE_SET_CHANNELS,nChannels);
-			WII("bytespersec",MCI_WAVE_SET_AVGBYTESPERSEC,nAvgBytesPerSec);
-			WII("samplespersec",MCI_WAVE_SET_SAMPLESPERSEC,nSamplesPerSec);
-			WII("alignment",MCI_WAVE_SET_BLOCKALIGN,nBlockAlign);
-			WII("bitspersample",MCI_WAVE_SET_BITSPERSAMPLE,wBitsPerSample);
-			WII("input",MCI_WAVE_INPUT,wInput);
-			WII("output",MCI_WAVE_OUTPUT,wOutput);
+			WII("formattag",MCI_WAVE_SET_FORMATTAG,UIFMT,wFormatTag);
+			WII("channels",MCI_WAVE_SET_CHANNELS,UIFMT,nChannels);
+			WII("bytespersec",MCI_WAVE_SET_AVGBYTESPERSEC,"%lu",nAvgBytesPerSec);
+			WII("samplespersec",MCI_WAVE_SET_SAMPLESPERSEC,"%lu",nSamplesPerSec);
+			WII("alignment",MCI_WAVE_SET_BLOCKALIGN,UIFMT,nBlockAlign);
+			WII("bitspersample",MCI_WAVE_SET_BITSPERSAMPLE,UIFMT,wBitsPerSample);
+			WII("input",MCI_WAVE_INPUT,UIFMT,wInput);
+			WII("output",MCI_WAVE_OUTPUT,UIFMT,wOutput);
 #undef WII
 			break;
 		case MCI_DEVTYPE_SEQUENCER:
@@ -921,7 +921,7 @@ MCISTR_Break(_MCISTR_PROTO_) {
 static DWORD
 MCISTR_Capability(_MCISTR_PROTO_) {
 	MCI_GETDEVCAPS_PARMS	gdcParams;
-	int	type,i,res;
+	int	type=0,i,res;
 
 	gdcParams.dwCallback = 0;
 	if (!nrofkeywords)
@@ -1317,6 +1317,8 @@ MCISTR_Info(_MCISTR_PROTO_) {
 	return res;
 }
 
+DWORD mciSysInfo(DWORD dwFlags,LPMCI_SYSINFO_PARMS lpParms);
+
 /* query MCI driver itself for information
  * Arguments:
  *	"installname"	return install name of <device> (system.ini)
@@ -2080,9 +2082,9 @@ DWORD mciSendString (LPCSTR lpstrCommand, LPSTR lpstrReturnString,
 	UINT uReturnLength, HWND hwndCallback)
 {
 	char	*cmd,*dev,*args,**keywords;
-	WORD	uDevTyp,wDevID;
+	WORD	uDevTyp=0,wDevID=0;
 	DWORD	dwFlags;
-	int	res,i,nrofkeywords;
+	int	res=0,i,nrofkeywords;
 
 	dprintf_mci(stdnimp,"mciSendString('%s', %p, %d, %X)\n", lpstrCommand, 
 		lpstrReturnString, uReturnLength, hwndCallback
diff --git a/multimedia/mmsystem.c b/multimedia/mmsystem.c
index b2bc0e19e09..db3e707e066 100644
--- a/multimedia/mmsystem.c
+++ b/multimedia/mmsystem.c
@@ -1051,8 +1051,9 @@ UINT midiOutSetVolume(UINT uDeviceID, DWORD dwVolume)
 UINT midiOutCachePatches(HMIDIOUT hMidiOut,
     UINT uBank, WORD FAR* lpwPatchArray, UINT uFlags)
 {
-	dprintf_mmsys(stddeb, "midiOutCachePatches\n");
-	return 0;
+        /* not really necessary to support this */
+	fprintf(stdnimp, "midiOutCachePatches: not supported yet\n");
+	return MMSYSERR_NOTSUPPORTED;
 }
 
 /**************************************************************************
@@ -1061,8 +1062,8 @@ UINT midiOutCachePatches(HMIDIOUT hMidiOut,
 UINT midiOutCacheDrumPatches(HMIDIOUT hMidiOut,
     UINT uPatch, WORD FAR* lpwKeyArray, UINT uFlags)
 {
-	dprintf_mmsys(stddeb, "midiOutCacheDrumPatches\n");
-	return 0;
+	fprintf(stdnimp, "midiOutCacheDrumPatchesi: not supported yet\n");
+	return MMSYSERR_NOTSUPPORTED;
 }
 
 /**************************************************************************
diff --git a/multimedia/time.c b/multimedia/time.c
index 00bffc448d9..5193abde7ca 100644
--- a/multimedia/time.c
+++ b/multimedia/time.c
@@ -45,7 +45,6 @@ static LPTIMERENTRY lpTimerList = NULL;
  */
 WORD MMSysTimeCallback(HWND hWnd, WORD wMsg, INT nID, DWORD dwTime)
 {
-    FARPROC	lpFunc;
     LPTIMERENTRY lpTimer = lpTimerList;
     mmSysTimeMS.u.ms += 33;
     mmSysTimeSMPTE.u.smpte.frame++;
@@ -58,23 +57,25 @@ WORD MMSysTimeCallback(HWND hWnd, WORD wMsg, INT nID, DWORD dwTime)
 		dprintf_mmtime(stddeb, "MMSysTimeCallback // lpFunc=%08lx wTimerID=%04X dwUser=%08lX !\n",
 			lpTimer->lpFunc, lpTimer->wTimerID, lpTimer->dwUser);
 		dprintf_mmtime(stddeb, "MMSysTimeCallback // hInstance=%04X !\n", lpTimer->hInstance);
-/*
-		lpFunc = MakeProcInstance(lpTimer->hInstance, lpTimer->lpFunc);
-		dprintf_mmtime(stddeb, "MMSysTimeCallback // MakeProcInstance(lpFunc)=%p %p !\n", 
-			lpFunc, PTR_SEG_TO_LIN(lpFunc));
-*/
-		lpFunc = MODULE_GetEntryPoint( lpTimer->hInstance,
-                      MODULE_GetOrdinal(lpTimer->hInstance,"TimerCallBack" ));
+
+/* This is wrong (lpFunc is NULL all the time)
+
+   	        lpFunc = MODULE_GetEntryPoint( lpTimer->hInstance,
+                         MODULE_GetOrdinal(lpTimer->hInstance,"TimerCallBack" ));
 		dprintf_mmtime(stddeb, "MMSysTimeCallback // lpFunc=%08lx !\n", lpFunc);
-		
+*/
+
+
+/*        - TimeProc callback that is called here is something strange, under Windows 3.1x it is called 
+ *          during interrupt time,  is allowed to execute very limited number of API calls (like
+ *	    PostMessage), and must reside in DLL (therefore uses stack of active application). So I 
+ *          guess current implementation via SetTimer has to be improved upon.		
+ */
+
 		CallTo16_word_wwlll(lpTimer->lpFunc,
 			lpTimer->hInstance, lpTimer->wTimerID, 
 			0, lpTimer->dwUser, 0, 0);
 
-/*
-		CallTimeFuncProc(lpTimer->lpFunc, lpTimer->wTimerID, 
-				0, lpTimer->dwUser, 0, 0);
-*/
 		dprintf_mmtime(stddeb, "MMSysTimeCallback // after CallBack16 !\n");
 		fflush(stdout);
 	    }
diff --git a/objects/Imakefile b/objects/Imakefile
deleted file mode 100644
index 6ba4f821a03..00000000000
--- a/objects/Imakefile
+++ /dev/null
@@ -1,31 +0,0 @@
-#include "../Wine.tmpl"
-
-MODULE = objects
-
-SRCS = \
-	bitblt.c \
-	bitmap.c \
-	brush.c \
-	clipping.c \
-	color.c \
-	dc.c \
-	dcvalues.c \
-	dib.c \
-	font.c \
-	gdiobj.c \
-	linedda.c \
-	metafile.c \
-	oembitmap.c \
-	palette.c \
-	pen.c \
-	region.c \
-	text.c
-
-OBJS = $(SRCS:.c=.o)
-
-WineRelocatableTarget($(MODULE),,$(OBJS))
-DependTarget()
-
-includes::
-
-install::
diff --git a/objects/Makefile.in b/objects/Makefile.in
index f88bb216e5b..eb31162d596 100644
--- a/objects/Makefile.in
+++ b/objects/Makefile.in
@@ -7,6 +7,7 @@ C_SRCS = \
 	brush.c \
 	clipping.c \
 	color.c \
+	cursoricon.c \
 	dc.c \
 	dcvalues.c \
 	dib.c \
diff --git a/objects/bitblt.c b/objects/bitblt.c
index ab8daf9a807..ae7dd30e309 100644
--- a/objects/bitblt.c
+++ b/objects/bitblt.c
@@ -1236,7 +1236,7 @@ BOOL PatBlt( HDC hdc, short left, short top,
 	return TRUE;
     }
 
-    dprintf_bitblt(stddeb, "PatBlt: %d %d,%d %dx%d %06lx\n",
+    dprintf_bitblt(stddeb, "PatBlt: "NPFMT" %d,%d %dx%d %06lx\n",
 	    hdc, left, top, width, height, rop );
 
     return CallTo32_LargeStack( (int(*)())BITBLT_InternalStretchBlt, 11,
@@ -1263,7 +1263,7 @@ BOOL BitBlt( HDC hdcDst, short xDst, short yDst, short width, short height,
     dcSrc = (DC *) GDI_GetObjPtr( hdcSrc, DC_MAGIC );
 
     dprintf_bitblt(stddeb,
-                "BitBlt: %04x %d,%d %d bpp -> %04x %d,%d %dx%dx%d rop=%06lx\n",
+                "BitBlt: "NPFMT" %d,%d %d bpp -> "NPFMT" %d,%d %dx%dx%d rop=%06lx\n",
                 hdcSrc, xSrc, ySrc, dcSrc ? dcSrc->w.bitsPerPixel : 0,
                 hdcDst, xDst, yDst, width, height, dcDst->w.bitsPerPixel, rop);
 
@@ -1293,7 +1293,7 @@ BOOL StretchBlt( HDC hdcDst, short xDst, short yDst,
 
     dcSrc = (DC *) GDI_GetObjPtr( hdcSrc, DC_MAGIC );
     dprintf_bitblt(stddeb,
-          "StretchBlt: %04x %d,%d %dx%dx%d -> %04x %d,%d %dx%dx%d rop=%06lx\n",
+          "StretchBlt: "NPFMT" %d,%d %dx%dx%d -> "NPFMT" %d,%d %dx%dx%d rop=%06lx\n",
                    hdcSrc, xSrc, ySrc, widthSrc, heightSrc,
                    dcSrc ? dcSrc->w.bitsPerPixel : 0, hdcDst, xDst, yDst,
                    widthDst, heightDst, dcDst->w.bitsPerPixel, rop );
diff --git a/objects/bitmap.c b/objects/bitmap.c
index 179d16d7541..dde4d94a04e 100644
--- a/objects/bitmap.c
+++ b/objects/bitmap.c
@@ -8,11 +8,9 @@
 #include <X11/Xlib.h>
 #include <X11/Xutil.h>
 #include "gdi.h"
-#include "arch.h"
 #include "callback.h"
 #include "dc.h"
 #include "bitmap.h"
-#include "resource.h"  /* for ConvertCore/InfoBitmap */
 #include "stddebug.h"
 /* #define DEBUG_GDI    */
 /* #define DEBUG_BITMAP */
@@ -126,7 +124,7 @@ HBITMAP CreateBitmap( short width, short height,
 HBITMAP CreateCompatibleBitmap( HDC hdc, short width, short height )
 {
     DC * dc;
-    dprintf_gdi(stddeb, "CreateCompatibleBitmap: %d %dx%d\n", 
+    dprintf_gdi(stddeb, "CreateCompatibleBitmap: "NPFMT" %dx%d\n", 
 		hdc, width, height );
     if (!(dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC ))) return 0;
     return CreateBitmap( width, height, 1, dc->w.bitsPerPixel, NULL );
@@ -213,17 +211,17 @@ HBITMAP LoadBitmap( HANDLE instance, SEGPTR name )
     HDC hdc;
     HRSRC hRsrc;
     HGLOBAL handle;
-    int size;
-    long *lp;
+    BITMAPINFO *info;
 
     if (HIWORD(name))
     {
         char *str = (char *)PTR_SEG_TO_LIN( name );
-        dprintf_bitmap( stddeb, "LoadBitmap(%04x,'%s')\n", instance, str );
-        if (str[0] == '#') name = (SEGPTR)atoi( str + 1 );
+        dprintf_bitmap( stddeb, "LoadBitmap("NPFMT",'%s')\n", instance, str );
+        if (str[0] == '#') name = (SEGPTR)(WORD)atoi( str + 1 );
     }
     else
-        dprintf_bitmap(stddeb,"LoadBitmap(%04x,%04x)\n",instance,LOWORD(name));
+        dprintf_bitmap( stddeb, "LoadBitmap("NPFMT",%04x)\n",
+                        instance, LOWORD(name) );
 
     if (!instance)  /* OEM bitmap */
     {
@@ -234,14 +232,12 @@ HBITMAP LoadBitmap( HANDLE instance, SEGPTR name )
     if (!(hRsrc = FindResource( instance, name, RT_BITMAP ))) return 0;
     if (!(handle = LoadResource( instance, hRsrc ))) return 0;
 
-    lp = (long *)LockResource( handle );
-    size = CONV_LONG(*lp);
+    info = (BITMAPINFO *)LockResource( handle );
     if ((hdc = GetDC(0)) != 0)
     {
-        if (size == sizeof(BITMAPCOREHEADER))
-            hbitmap = ConvertCoreBitmap( hdc, (BITMAPCOREHEADER *) lp );
-        else if (size == sizeof(BITMAPINFOHEADER))
-            hbitmap = ConvertInfoBitmap( hdc, (BITMAPINFO *) lp );
+        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 );
     }
     FreeResource( handle );
@@ -306,7 +302,7 @@ HBITMAP BITMAP_SelectObject( HDC hdc, DC * dc, HBITMAP hbitmap,
  */
 HBITMAP CreateDiscardableBitmap(HDC hdc, short width, short height)
 {
-    dprintf_bitmap(stddeb,"CreateDiscardableBitmap(%04X, %d, %d); "
+    dprintf_bitmap(stddeb,"CreateDiscardableBitmap("NPFMT", %d, %d); "
 	   "// call CreateCompatibleBitmap() for now!\n",
 	   hdc, width, height);
     return CreateCompatibleBitmap(hdc, width, height);
diff --git a/objects/brush.c b/objects/brush.c
index de64274d616..982920abbe1 100644
--- a/objects/brush.c
+++ b/objects/brush.c
@@ -171,14 +171,18 @@ HBRUSH CreatePatternBrush( HBITMAP hbitmap )
     LOGBRUSH logbrush = { BS_PATTERN, 0, 0 };
     BITMAPOBJ *bmp, *newbmp;
 
-    dprintf_gdi(stddeb, "CreatePatternBrush: %d\n", hbitmap );
+    dprintf_gdi(stddeb, "CreatePatternBrush: "NPFMT"\n", hbitmap );
 
       /* Make a copy of the bitmap */
 
     if (!(bmp = (BITMAPOBJ *) GDI_GetObjPtr( hbitmap, BITMAP_MAGIC )))
 	return 0;
-    logbrush.lbHatch = CreateBitmapIndirect( &bmp->bitmap );
-    newbmp = (BITMAPOBJ *) GDI_GetObjPtr( logbrush.lbHatch, BITMAP_MAGIC );
+#ifdef WINELIB32
+    logbrush.lbHatch = (LONG)CreateBitmapIndirect( &bmp->bitmap );
+#else
+    logbrush.lbHatch = (INT)CreateBitmapIndirect( &bmp->bitmap );
+#endif
+    newbmp = (BITMAPOBJ *) GDI_GetObjPtr( (HANDLE)logbrush.lbHatch, BITMAP_MAGIC );
     if (!newbmp) return 0;
     XCopyArea( display, bmp->pixmap, newbmp->pixmap, BITMAP_GC(bmp),
 	       0, 0, bmp->bitmap.bmWidth, bmp->bitmap.bmHeight, 0, 0 );
@@ -195,7 +199,7 @@ HBRUSH CreateDIBPatternBrush( HANDLE hbitmap, WORD coloruse )
     BITMAPINFO *info, *newInfo;
     int size;
     
-    dprintf_gdi(stddeb, "CreateDIBPatternBrush: %d\n", hbitmap );
+    dprintf_gdi(stddeb, "CreateDIBPatternBrush: "NPFMT"\n", hbitmap );
 
       /* Make a copy of the bitmap */
 
@@ -207,14 +211,18 @@ HBRUSH CreateDIBPatternBrush( HANDLE hbitmap, WORD coloruse )
 	         * 8 * info->bmiHeader.biHeight;
     size += DIB_BitmapInfoSize( info, coloruse );
 
-    if (!(logbrush.lbHatch = GlobalAlloc( GMEM_MOVEABLE, size )))
+#ifdef WINELIB32
+    if (!(logbrush.lbHatch = (LONG)GlobalAlloc( GMEM_MOVEABLE, size )))
+#else
+    if (!(logbrush.lbHatch = (INT)GlobalAlloc( GMEM_MOVEABLE, size )))
+#endif
     {
 	GlobalUnlock( hbitmap );
 	return 0;
     }
-    newInfo = (BITMAPINFO *) GlobalLock( logbrush.lbHatch );
+    newInfo = (BITMAPINFO *) GlobalLock( (HANDLE)logbrush.lbHatch );
     memcpy( newInfo, info, size );
-    GlobalUnlock( logbrush.lbHatch );
+    GlobalUnlock( (HANDLE)logbrush.lbHatch );
     GlobalUnlock( hbitmap );
     return CreateBrushIndirect( &logbrush );
 }
@@ -248,7 +256,7 @@ DWORD SetBrushOrg( HDC hdc, short x, short y )
 /***********************************************************************
  *           GetSysColorBrush    (USER.281)
  */
-WORD GetSysColorBrush(WORD x)
+HBRUSH GetSysColorBrush(WORD x)
 {
 	return GetStockObject(GRAY_BRUSH);
 }
@@ -261,10 +269,10 @@ BOOL BRUSH_DeleteObject( HBRUSH hbrush, BRUSHOBJ * brush )
     switch(brush->logbrush.lbStyle)
     {
       case BS_PATTERN:
-	  DeleteObject( brush->logbrush.lbHatch );
+	  DeleteObject( (HANDLE)brush->logbrush.lbHatch );
 	  break;
       case BS_DIBPATTERN:
-	  GlobalFree( brush->logbrush.lbHatch );
+	  GlobalFree( (HANDLE)brush->logbrush.lbHatch );
 	  break;
     }
     return GDI_FreeObject( hbrush );
@@ -339,7 +347,7 @@ HBRUSH BRUSH_SelectObject( HDC hdc, DC * dc, HBRUSH hbrush, BRUSHOBJ * brush )
     BITMAPINFO * bmpInfo;
     HBRUSH prevHandle = dc->w.hBrush;
 
-    dprintf_gdi(stddeb, "Brush_SelectObject   hdc=%04x  hbrush=%04x\n",
+    dprintf_gdi(stddeb, "Brush_SelectObject   hdc="NPFMT"  hbrush="NPFMT"\n",
 		hdc,hbrush);
     if (dc->header.wMagic == METAFILE_DC_MAGIC)
     {
@@ -349,16 +357,16 @@ HBRUSH BRUSH_SelectObject( HDC hdc, DC * dc, HBRUSH hbrush, BRUSHOBJ * brush )
 	case BS_HATCHED:
 	case BS_HOLLOW:
 	    if (!MF_CreateBrushIndirect(dc, hbrush, &(brush->logbrush)))
-		return 0;
+		return (HBRUSH)0;
 	    break;
 
 	case BS_PATTERN:
 	case BS_DIBPATTERN:
 	    if (!MF_CreatePatternBrush(dc, hbrush, &(brush->logbrush)))
-		return 0;
+		return (HBRUSH)0;
 	    break;
 	}
-	return 1;
+	return (HBRUSH)1;
     }
     
     dc->w.hBrush = hbrush;
@@ -391,12 +399,12 @@ HBRUSH BRUSH_SelectObject( HDC hdc, DC * dc, HBRUSH hbrush, BRUSHOBJ * brush )
 	
       case BS_PATTERN:
 	dprintf_gdi( stddeb, "BS_PATTERN\n");
-	BRUSH_SelectPatternBrush( dc, brush->logbrush.lbHatch );
+	BRUSH_SelectPatternBrush( dc, (HBRUSH)brush->logbrush.lbHatch );
 	break;
 
       case BS_DIBPATTERN:
 	dprintf_gdi( stddeb, "BS_DIBPATTERN\n");
-	if ((bmpInfo = (BITMAPINFO *) GlobalLock( brush->logbrush.lbHatch )))
+	if ((bmpInfo = (BITMAPINFO *) GlobalLock( (HANDLE)brush->logbrush.lbHatch )))
 	{
 	    int size = DIB_BitmapInfoSize( bmpInfo, brush->logbrush.lbColor );
 	    hBitmap = CreateDIBitmap( hdc, &bmpInfo->bmiHeader, CBM_INIT,
@@ -404,7 +412,7 @@ HBRUSH BRUSH_SelectObject( HDC hdc, DC * dc, HBRUSH hbrush, BRUSHOBJ * brush )
 				      (WORD) brush->logbrush.lbColor );
 	    BRUSH_SelectPatternBrush( dc, hBitmap );
 	    DeleteObject( hBitmap );
-	    GlobalUnlock( brush->logbrush.lbHatch );	    
+	    GlobalUnlock( (HANDLE)brush->logbrush.lbHatch );	    
 	}
 	
 	break;
diff --git a/objects/clipping.c b/objects/clipping.c
index 003a6aec886..e6a3335884c 100644
--- a/objects/clipping.c
+++ b/objects/clipping.c
@@ -67,7 +67,7 @@ int SelectClipRgn( HDC hdc, HRGN hrgn )
     DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC );
     if (!dc) return ERROR;
 
-    dprintf_clipping(stddeb, "SelectClipRgn: %x %x\n", hdc, hrgn );
+    dprintf_clipping(stddeb, "SelectClipRgn: "NPFMT" "NPFMT"\n", hdc, hrgn );
 
     if (hrgn)
     {
@@ -94,7 +94,7 @@ int SelectVisRgn( HDC hdc, HRGN hrgn )
     DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC );
     if (!dc || !hrgn) return ERROR;
 
-    dprintf_clipping(stddeb, "SelectVisRgn: %x %x\n", hdc, hrgn );
+    dprintf_clipping(stddeb, "SelectVisRgn: "NPFMT" "NPFMT"\n", hdc, hrgn );
 
     retval = CombineRgn( dc->w.hVisRgn, hrgn, 0, RGN_COPY );
     CLIPPING_UpdateGCRegion( dc );
@@ -116,7 +116,7 @@ int OffsetClipRgn( HDC hdc, short x, short y )
 	return NULLREGION;   /* ?? */
     }
 
-    dprintf_clipping(stddeb, "OffsetClipRgn: %x %d,%d\n", hdc, x, y );
+    dprintf_clipping(stddeb, "OffsetClipRgn: "NPFMT" %d,%d\n", hdc, x, y );
 
     if (dc->w.hClipRgn)
     {
@@ -136,7 +136,7 @@ int OffsetVisRgn( HDC hdc, short x, short y )
     int retval;
     DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC );
     if (!dc) return ERROR;    
-    dprintf_clipping(stddeb, "OffsetVisRgn: %x %d,%d\n", hdc, x, y );
+    dprintf_clipping(stddeb, "OffsetVisRgn: "NPFMT" %d,%d\n", hdc, x, y );
     retval = OffsetRgn( dc->w.hVisRgn, x, y );
     CLIPPING_UpdateGCRegion( dc );
     return retval;
@@ -195,7 +195,7 @@ int ExcludeClipRect( HDC hdc, short left, short top,
 	return NULLREGION;   /* ?? */
     }
 
-    dprintf_clipping(stddeb, "ExcludeClipRect: %x %dx%d,%dx%d\n",
+    dprintf_clipping(stddeb, "ExcludeClipRect: "NPFMT" %dx%d,%dx%d\n",
 	    hdc, left, top, right, bottom );
     return CLIPPING_IntersectClipRect( dc, left, top, right, bottom, TRUE );
 }
@@ -216,7 +216,7 @@ int IntersectClipRect( HDC hdc, short left, short top,
 	return NULLREGION;   /* ?? */
     }
 
-    dprintf_clipping(stddeb, "IntersectClipRect: %x %dx%d,%dx%d\n",
+    dprintf_clipping(stddeb, "IntersectClipRect: "NPFMT" %dx%d,%dx%d\n",
 	    hdc, left, top, right, bottom );
     return CLIPPING_IntersectClipRect( dc, left, top, right, bottom, FALSE );
 }
@@ -269,7 +269,7 @@ int ExcludeVisRect( HDC hdc, short left, short top, short right, short bottom )
 {
     DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC );
     if (!dc) return ERROR;    
-    dprintf_clipping(stddeb, "ExcludeVisRect: %x %dx%d,%dx%d\n",
+    dprintf_clipping(stddeb, "ExcludeVisRect: "NPFMT" %dx%d,%dx%d\n",
 	    hdc, left, top, right, bottom );
     return CLIPPING_IntersectVisRect( dc, left, top, right, bottom, TRUE );
 }
@@ -283,7 +283,7 @@ int IntersectVisRect( HDC hdc, short left, short top,
 {
     DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC );
     if (!dc) return ERROR;    
-    dprintf_clipping(stddeb, "IntersectVisRect: %x %dx%d,%dx%d\n",
+    dprintf_clipping(stddeb, "IntersectVisRect: "NPFMT" %dx%d,%dx%d\n",
 	    hdc, left, top, right, bottom );
     return CLIPPING_IntersectVisRect( dc, left, top, right, bottom, FALSE );
 }
@@ -297,7 +297,7 @@ BOOL PtVisible( HDC hdc, short x, short y )
     DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC );
     if (!dc) return ERROR;    
 
-    dprintf_clipping(stddeb, "PtVisible: %x %d,%d\n", hdc, x, y );
+    dprintf_clipping(stddeb, "PtVisible: "NPFMT" %d,%d\n", hdc, x, y );
     if (!dc->w.hGCClipRgn) return FALSE;
     return PtInRegion( dc->w.hGCClipRgn, XLPTODP(dc,x), YLPTODP(dc,y) );
 }
@@ -311,7 +311,7 @@ BOOL RectVisible( HDC hdc, LPRECT rect )
     RECT tmpRect;
     DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC );
     if (!dc) return FALSE;
-    dprintf_clipping(stddeb,"RectVisible: %x %d,%dx%d,%d\n",
+    dprintf_clipping(stddeb,"RectVisible: "NPFMT" %d,%dx%d,%d\n",
                      hdc, rect->left, rect->top, rect->right, rect->bottom );
     if (!dc->w.hGCClipRgn) return FALSE;
     /* copy rectangle to avoid overwriting by LPtoDP */
@@ -329,7 +329,7 @@ int GetClipBox( HDC hdc, LPRECT rect )
     int ret;
     DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC );
     if (!dc) return ERROR;    
-    dprintf_clipping(stddeb, "GetClipBox: %x %p\n", hdc, rect );
+    dprintf_clipping(stddeb, "GetClipBox: "NPFMT" %p\n", hdc, rect );
     ret = GetRgnBox( dc->w.hGCClipRgn, rect );
     DPtoLP( hdc, (LPPOINT)rect, 2 );
     return ret;
@@ -345,7 +345,7 @@ HRGN SaveVisRgn( HDC hdc )
     RGNOBJ *obj, *copyObj;
     DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC );
     if (!dc) return 0;
-    dprintf_clipping(stddeb, "SaveVisRgn: %x\n", hdc );
+    dprintf_clipping(stddeb, "SaveVisRgn: "NPFMT"\n", hdc );
     if (!dc->w.hVisRgn)
     {
         fprintf( stderr, "SaveVisRgn: hVisRgn is zero. Please report this.\n" );
@@ -372,7 +372,7 @@ int RestoreVisRgn( HDC hdc )
     RGNOBJ *obj, *savedObj;
     DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC );
     if (!dc || !dc->w.hVisRgn) return ERROR;    
-    dprintf_clipping(stddeb, "RestoreVisRgn: %x\n", hdc );
+    dprintf_clipping(stddeb, "RestoreVisRgn: "NPFMT"\n", hdc );
     if (!(obj = (RGNOBJ *) GDI_GetObjPtr( dc->w.hVisRgn, REGION_MAGIC )))
 	return ERROR;
     if (!(saved = obj->header.hNext)) return ERROR;
diff --git a/objects/color.c b/objects/color.c
index bde033b7000..5941340a61b 100644
--- a/objects/color.c
+++ b/objects/color.c
@@ -2,9 +2,8 @@
  * Color functions
  *
  * Copyright 1993 Alexandre Julliard
- *
-static char Copyright[] = "Copyright  Alexandre Julliard, 1993";
-*/
+ */
+
 #include <stdlib.h>
 #include <X11/Xlib.h>
 #include <stdio.h>
@@ -243,7 +242,6 @@ HPALETTE COLOR_Init(void)
 	}
 	COLOR_WinColormap = DefaultColormapOfScreen( screen );
         break;
-	/* Fall through */
     case StaticGray:
 	COLOR_WinColormap = DefaultColormapOfScreen( screen );
 	COLOR_FixedMap = 1;
@@ -303,8 +301,6 @@ int COLOR_ToPhysical( DC *dc, COLORREF color )
     WORD index = 0;
     WORD *mapping;
 
-    /* if (screenDepth > 8) return color; */
-
     if (dc && (dc->w.bitsPerPixel == 1) && ((color >> 24) == 0))
     {
 	/* monochrome */
@@ -314,53 +310,52 @@ int COLOR_ToPhysical( DC *dc, COLORREF color )
         else return 0;  /* black */
     }
 
-    if(COLOR_FixedMap) {
-
+    if (COLOR_FixedMap)
+    {
         /* there is no colormap possible; we are going to have to compute
            the pixel value from the visual information stored earlier */
 
-	unsigned long which = color >> 24;
-
 	unsigned long red, green, blue;
 	unsigned idx;
 	PALETTEOBJ * palPtr;
 
-	switch(which) {
-		case 0: /* RGB */
-		case 2: /* PALETTERGB -- needs some work, but why bother; we've got a REALLY LARGE number of colors...? */
-		default:
-
-		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;
-		if(idx >= palPtr->logpalette.palNumEntries) {
-			/* out of bounds */
-			red = green = blue = 0;
-		}
-		else {
-			red = palPtr->logpalette.palPalEntry[idx].peRed;
-			green = palPtr->logpalette.palPalEntry[idx].peGreen;
-			blue = palPtr->logpalette.palPalEntry[idx].peBlue;
-		}
+	switch(color >> 24)
+        {
+        case 0: /* RGB */
+        case 2: /* PALETTERGB -- needs some work, but why bother; we've got a REALLY LARGE number of colors...? */
+        default:
+            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;
+            if (idx >= palPtr->logpalette.palNumEntries)
+            {
+                /* out of bounds */
+                red = green = blue = 0;
+            }
+            else
+            {
+                red = palPtr->logpalette.palPalEntry[idx].peRed;
+                green = palPtr->logpalette.palPalEntry[idx].peGreen;
+                blue = palPtr->logpalette.palPalEntry[idx].peBlue;
+            }
 	}
 
-	if(COLOR_Graymax) {
+	if (COLOR_Graymax)
+        {
 	    /* grayscale only; return scaled value */
             return ( (red * 30 + green * 69 + blue * 11) * COLOR_Graymax) / 25500;
 	}
-	else {
+	else
+        {
 	    /* scale each individually and construct the TrueColor pixel value */
-	    if(COLOR_Redmax != 255)
-                red = (red * COLOR_Redmax) / 255;
-	    if(COLOR_Greenmax != 255)
-                green = (green * COLOR_Greenmax) / 255;
-	    if(COLOR_Bluemax != 255)
-                blue = (blue * COLOR_Bluemax) / 255;
+	    if (COLOR_Redmax != 255) red = (red * COLOR_Redmax) / 255;
+            if (COLOR_Greenmax != 255) green = (green * COLOR_Greenmax) / 255;
+	    if (COLOR_Bluemax != 255) blue = (blue * COLOR_Bluemax) / 255;
 
 	    return (red << COLOR_Redshift) | (green << COLOR_Greenshift) | (blue << COLOR_Blueshift);
         }
diff --git a/objects/cursoricon.c b/objects/cursoricon.c
new file mode 100644
index 00000000000..6cc3f2a24e2
--- /dev/null
+++ b/objects/cursoricon.c
@@ -0,0 +1,853 @@
+/*
+ * Cursor and icon support
+ *
+ * Copyright 1995 Alexandre Julliard
+ */
+
+/*
+ * Theory:
+ *
+ * Cursors and icons are stored in a global heap block, with the
+ * following layout:
+ *
+ * CURSORICONINFO info;
+ * BYTE[]         ANDbits;
+ * BYTE[]         XORbits;
+ *
+ * The bits structures are in the format of a device-dependent bitmap.
+ *
+ * This layout is very sub-optimal, as the bitmap bits are stored in
+ * the X client instead of in the server like other bitmaps; however,
+ * some programs (notably Paint Brush) expect to be able to manipulate
+ * the bits directly :-(
+ */
+
+#include <string.h>
+#include <stdlib.h>
+#include "windows.h"
+#include "bitmap.h"
+#include "callback.h"
+#include "cursoricon.h"
+#include "sysmetrics.h"
+#include "win.h"
+#include "stddebug.h"
+#include "debug.h"
+
+
+Cursor CURSORICON_XCursor = None;  /* Current X cursor */
+static HCURSOR hActiveCursor = 0;  /* Active cursor */
+static int CURSOR_ShowCount = 0;   /* Cursor display count */
+static RECT CURSOR_ClipRect;       /* Cursor clipping rect */
+
+/**********************************************************************
+ *	    CURSORICON_FindBestIcon
+ *
+ * Find the icon closest to the requested size and number of colors.
+ */
+static ICONDIRENTRY *CURSORICON_FindBestIcon( CURSORICONDIR *dir, int width,
+                                              int height, int colors )
+{
+    int i, maxcolors, maxwidth, maxheight;
+    ICONDIRENTRY *entry, *bestEntry = NULL;
+
+    if (dir->idCount < 1)
+    {
+        fprintf( stderr, "Icon: empty directory!\n" );
+        return NULL;
+    }
+    if (dir->idCount == 1) return &dir->idEntries[0].icon;  /* No choice... */
+
+    /* First find the exact size with less colors */
+
+    maxcolors = 0;
+    for (i = 0, entry = &dir->idEntries[0].icon; i < dir->idCount; i++,entry++)
+        if ((entry->bWidth == width) && (entry->bHeight == height) &&
+            (entry->bColorCount <= colors) && (entry->bColorCount > maxcolors))
+        {
+            bestEntry = entry;
+            maxcolors = entry->bColorCount;
+        }
+    if (bestEntry) return bestEntry;
+
+    /* First find the exact size with more colors */
+
+    maxcolors = 255;
+    for (i = 0, entry = &dir->idEntries[0].icon; i < dir->idCount; i++,entry++)
+        if ((entry->bWidth == width) && (entry->bHeight == height) &&
+            (entry->bColorCount > colors) && (entry->bColorCount <= maxcolors))
+        {
+            bestEntry = entry;
+            maxcolors = entry->bColorCount;
+        }
+    if (bestEntry) return bestEntry;
+
+    /* Now find a smaller one with less colors */
+
+    maxcolors = maxwidth = maxheight = 0;
+    for (i = 0, entry = &dir->idEntries[0].icon; i < dir->idCount; i++,entry++)
+        if ((entry->bWidth <= width) && (entry->bHeight <= height) &&
+            (entry->bWidth >= maxwidth) && (entry->bHeight >= maxheight) &&
+            (entry->bColorCount <= colors) && (entry->bColorCount > maxcolors))
+        {
+            bestEntry = entry;
+            maxwidth  = entry->bWidth;
+            maxheight = entry->bHeight;
+            maxcolors = entry->bColorCount;
+        }
+    if (bestEntry) return bestEntry;
+
+    /* Now find a smaller one with more colors */
+
+    maxcolors = 255;
+    maxwidth = maxheight = 0;
+    for (i = 0, entry = &dir->idEntries[0].icon; i < dir->idCount; i++,entry++)
+        if ((entry->bWidth <= width) && (entry->bHeight <= height) &&
+            (entry->bWidth >= maxwidth) && (entry->bHeight >= maxheight) &&
+            (entry->bColorCount > colors) && (entry->bColorCount <= maxcolors))
+        {
+            bestEntry = entry;
+            maxwidth  = entry->bWidth;
+            maxheight = entry->bHeight;
+            maxcolors = entry->bColorCount;
+        }
+    if (bestEntry) return bestEntry;
+
+    /* Now find a larger one with less colors */
+
+    maxcolors = 0;
+    maxwidth = maxheight = 255;
+    for (i = 0, entry = &dir->idEntries[0].icon; i < dir->idCount; i++,entry++)
+        if ((entry->bWidth <= maxwidth) && (entry->bHeight <= maxheight) &&
+            (entry->bColorCount <= colors) && (entry->bColorCount > maxcolors))
+        {
+            bestEntry = entry;
+            maxwidth  = entry->bWidth;
+            maxheight = entry->bHeight;
+            maxcolors = entry->bColorCount;
+        }
+    if (bestEntry) return bestEntry;
+
+    /* Now find a larger one with more colors */
+
+    maxcolors = maxwidth = maxheight = 255;
+    for (i = 0, entry = &dir->idEntries[0].icon; i < dir->idCount; i++,entry++)
+        if ((entry->bWidth <= maxwidth) && (entry->bHeight <= maxheight) &&
+            (entry->bColorCount > colors) && (entry->bColorCount <= maxcolors))
+        {
+            bestEntry = entry;
+            maxwidth  = entry->bWidth;
+            maxheight = entry->bHeight;
+            maxcolors = entry->bColorCount;
+        }
+
+    return bestEntry;
+}
+
+
+/**********************************************************************
+ *	    CURSORICON_FindBestCursor
+ *
+ * Find the cursor closest to the requested size.
+ */
+static CURSORDIRENTRY *CURSORICON_FindBestCursor( CURSORICONDIR *dir,
+                                                  int width, int height )
+{
+    int i, maxwidth, maxheight;
+    CURSORDIRENTRY *entry, *bestEntry = NULL;
+
+    if (dir->idCount < 1)
+    {
+        fprintf( stderr, "Cursor: empty directory!\n" );
+        return NULL;
+    }
+    if (dir->idCount == 1) return &dir->idEntries[0].cursor; /* No choice... */
+
+    /* First find the largest one smaller than or equal to the requested size*/
+
+    maxwidth = maxheight = 0;
+    for(i = 0,entry = &dir->idEntries[0].cursor; i < dir->idCount; i++,entry++)
+        if ((entry->wWidth <= width) && (entry->wHeight <= height) &&
+            (entry->wWidth > maxwidth) && (entry->wHeight > maxheight))
+        {
+            bestEntry = entry;
+            maxwidth  = entry->wWidth;
+            maxheight = entry->wHeight;
+        }
+    if (bestEntry) return bestEntry;
+
+    /* Now find the smallest one larger than the requested size */
+
+    maxwidth = maxheight = 255;
+    for(i = 0,entry = &dir->idEntries[0].cursor; i < dir->idCount; i++,entry++)
+        if ((entry->wWidth < maxwidth) && (entry->wHeight < maxheight))
+        {
+            bestEntry = entry;
+            maxwidth  = entry->wWidth;
+            maxheight = entry->wHeight;
+        }
+
+    return bestEntry;
+}
+
+
+/**********************************************************************
+ *	    CURSORICON_LoadDirEntry
+ *
+ * Load the icon/cursor directory for a given resource name and find the
+ * best matching entry.
+ */
+static BOOL CURSORICON_LoadDirEntry(HANDLE hInstance, SEGPTR name,
+                                    int width, int height, int colors,
+                                    BOOL fCursor, CURSORICONDIRENTRY *dirEntry)
+{
+    HRSRC hRsrc;
+    HANDLE hMem;
+    CURSORICONDIR *dir;
+    CURSORICONDIRENTRY *entry = NULL;
+
+    if (!(hRsrc = FindResource( hInstance, name,
+                                fCursor ? RT_GROUP_CURSOR : RT_GROUP_ICON )))
+        return FALSE;
+    if (!(hMem = LoadResource( hInstance, hRsrc ))) return FALSE;
+    if ((dir = (CURSORICONDIR *)LockResource( hMem )))
+    {
+        if (fCursor)
+            entry = (CURSORICONDIRENTRY *)CURSORICON_FindBestCursor( dir,
+                                                               width, height );
+        else
+            entry = (CURSORICONDIRENTRY *)CURSORICON_FindBestIcon( dir,
+                                                       width, height, colors );
+        if (entry) *dirEntry = *entry;
+    }
+    FreeResource( hMem );
+    return (entry != NULL);
+}
+
+
+/**********************************************************************
+ *	    CURSORICON_Load
+ *
+ * Load a cursor or icon.
+ */
+static HANDLE CURSORICON_Load( HANDLE hInstance, SEGPTR name, int width,
+                               int height, int colors, BOOL fCursor )
+{
+    HANDLE handle, hAndBits, hXorBits;
+    HRSRC hRsrc;
+    HDC hdc;
+    int size, sizeAnd, sizeXor;
+    POINT hotspot = { 0 ,0 };
+    BITMAPOBJ *bmpXor, *bmpAnd;
+    BITMAPINFO *bmi, *pInfo;
+    CURSORICONINFO *info;
+    CURSORICONDIRENTRY dirEntry;
+    char *bits;
+
+    if (!hInstance)  /* OEM cursor/icon */
+    {
+        if (HIWORD(name))  /* Check for '#xxx' name */
+        {
+            char *ptr = PTR_SEG_TO_LIN( name );
+            if (ptr[0] != '#') return 0;
+            if (!(name = (SEGPTR)atoi( ptr + 1 ))) return 0;
+        }
+        return OBM_LoadCursorIcon( LOWORD(name), fCursor );
+    }
+
+    /* Find the best entry in the directory */
+
+    if (!CURSORICON_LoadDirEntry( hInstance, name, width, height,
+                                  colors, fCursor, &dirEntry )) return 0;
+
+    /* Load the resource */
+
+    if (!(hRsrc = FindResource( hInstance,
+                                MAKEINTRESOURCE( dirEntry.icon.wResId ),
+                                fCursor ? RT_CURSOR : RT_ICON ))) return 0;
+    if (!(handle = LoadResource( hInstance, hRsrc ))) return 0;
+
+    if (fCursor)  /* If cursor, get the hotspot */
+    {
+        POINT *pt = (POINT *)LockResource( handle );
+        hotspot = *pt;
+        bmi = (BITMAPINFO *)(pt + 1);
+    }
+    else bmi = (BITMAPINFO *)LockResource( handle );
+
+    /* Create a copy of the bitmap header */
+
+    size = DIB_BitmapInfoSize( bmi, DIB_RGB_COLORS );
+    /* Make sure we have room for the monochrome bitmap later on */
+    size = max( size, sizeof(BITMAPINFOHEADER) + 2*sizeof(RGBQUAD) );
+    pInfo = (BITMAPINFO *)malloc( size );
+    memcpy( pInfo, bmi, size );
+
+    if (pInfo->bmiHeader.biSize == sizeof(BITMAPINFOHEADER))
+    {
+        if (pInfo->bmiHeader.biCompression != BI_RGB)
+        {
+            fprintf(stderr,"Unknown size for compressed icon bitmap.\n");
+            FreeResource( handle );
+            free( pInfo );
+            return 0;
+        }
+        pInfo->bmiHeader.biHeight /= 2;
+    }
+    else if (pInfo->bmiHeader.biSize == sizeof(BITMAPCOREHEADER))
+    {
+        BITMAPCOREHEADER *core = (BITMAPCOREHEADER *)pInfo;
+        core->bcHeight /= 2;
+    }
+    else
+    {
+        fprintf( stderr, "CURSORICON_Load: Unknown bitmap length %ld!\n",
+                 pInfo->bmiHeader.biSize );
+        FreeResource( handle );
+        free( pInfo );
+        return 0;
+    }
+
+    /* Create the XOR bitmap */
+
+    if (!(hdc = GetDC( 0 )))
+    {
+        FreeResource( handle );
+        free( pInfo );
+        return 0;
+    }
+
+    hXorBits = CreateDIBitmap( hdc, &pInfo->bmiHeader, CBM_INIT,
+                               (char*)bmi + size, pInfo, DIB_RGB_COLORS );
+
+    /* Fix the bitmap header to load the monochrome mask */
+
+    if (pInfo->bmiHeader.biSize == sizeof(BITMAPINFOHEADER))
+    {
+        BITMAPINFOHEADER *bih = &pInfo->bmiHeader;
+        RGBQUAD *rgb = pInfo->bmiColors;
+        bits = (char *)bmi + size +
+            DIB_GetImageWidthBytes(bih->biWidth,bih->biBitCount)*bih->biHeight;
+        bih->biBitCount = 1;
+        bih->biClrUsed = bih->biClrImportant = 2;
+        rgb[0].rgbBlue = rgb[0].rgbGreen = rgb[0].rgbRed = 0x00;
+        rgb[1].rgbBlue = rgb[1].rgbGreen = rgb[1].rgbRed = 0xff;
+        rgb[0].rgbReserved = rgb[1].rgbReserved = 0;
+    }
+    else
+    {
+        BITMAPCOREHEADER *bch = (BITMAPCOREHEADER *)pInfo;
+        RGBTRIPLE *rgb = (RGBTRIPLE *)(bch + 1);
+        bits = (char *)bmi + size +
+            DIB_GetImageWidthBytes(bch->bcWidth,bch->bcBitCount)*bch->bcHeight;
+        bch->bcBitCount = 1;
+        rgb[0].rgbtBlue = rgb[0].rgbtGreen = rgb[0].rgbtRed = 0x00;
+        rgb[1].rgbtBlue = rgb[1].rgbtGreen = rgb[1].rgbtRed = 0xff;
+    }
+
+    /* Create the AND bitmap */
+
+    hAndBits = CreateDIBitmap( hdc, &pInfo->bmiHeader, CBM_INIT,
+                               bits, pInfo, DIB_RGB_COLORS );
+    ReleaseDC( 0, hdc );
+    FreeResource( handle );
+
+    /* Now create the CURSORICONINFO structure */
+
+    bmpXor = (BITMAPOBJ *) GDI_GetObjPtr( hXorBits, BITMAP_MAGIC );
+    bmpAnd = (BITMAPOBJ *) GDI_GetObjPtr( hAndBits, BITMAP_MAGIC );
+    sizeXor = bmpXor->bitmap.bmHeight * bmpXor->bitmap.bmWidthBytes;
+    sizeAnd = bmpAnd->bitmap.bmHeight * bmpAnd->bitmap.bmWidthBytes;
+
+    if (!(handle = GlobalAlloc( GMEM_MOVEABLE,
+                                sizeof(CURSORICONINFO) + sizeXor + sizeAnd)))
+    {
+        DeleteObject( hXorBits );
+        DeleteObject( hAndBits );
+        return 0;
+    }
+    /* Make it owned by the module */
+    FarSetOwner( handle, GetExePtr( hInstance ) );
+    info = (CURSORICONINFO *)GlobalLock( handle );
+    info->ptHotSpot.x   = hotspot.x;
+    info->ptHotSpot.y   = hotspot.y;
+    info->nWidth        = bmpXor->bitmap.bmWidth;
+    info->nHeight       = bmpXor->bitmap.bmHeight;
+    info->nWidthBytes   = bmpXor->bitmap.bmWidthBytes;
+    info->bPlanes       = bmpXor->bitmap.bmPlanes;
+    info->bBitsPerPixel = bmpXor->bitmap.bmBitsPixel;
+
+    /* Transfer the bitmap bits to the CURSORICONINFO structure */
+
+    GetBitmapBits( hAndBits, sizeAnd, (char *)(info + 1) );
+    GetBitmapBits( hXorBits, sizeXor, (char *)(info + 1) + sizeAnd );
+    DeleteObject( hXorBits );
+    DeleteObject( hAndBits );
+    GlobalUnlock( handle );
+    return handle;
+}
+
+
+/***********************************************************************
+ *           CURSORICON_Copy
+ *
+ * Make a copy of a cursor or icon.
+ */
+static HANDLE CURSORICON_Copy( HANDLE hInstance, HANDLE handle )
+{
+    char *ptrOld, *ptrNew;
+    int size;
+    HANDLE hNew;
+
+    if (!(ptrOld = (char *)GlobalLock( handle ))) return 0;
+    if (!(hInstance = GetExePtr( hInstance ))) return 0;
+    size = GlobalSize( handle );
+    hNew = GlobalAlloc( GMEM_MOVEABLE, size );
+    FarSetOwner( hNew, hInstance );
+    ptrNew = (char *)GlobalLock( hNew );
+    memcpy( ptrNew, ptrOld, size );
+    GlobalUnlock( handle );
+    GlobalUnlock( hNew );
+    return hNew;
+}
+
+
+/***********************************************************************
+ *           LoadCursor    (USER.173)
+ */
+HCURSOR LoadCursor( HANDLE hInstance, SEGPTR name )
+{
+    if (HIWORD(name))
+        dprintf_cursor( stddeb, "LoadCursor: "NPFMT" '%s'\n",
+                        hInstance, (char *)PTR_SEG_TO_LIN( name ) );
+    else
+        dprintf_cursor( stddeb, "LoadCursor: "NPFMT" %04x\n",
+                        hInstance, LOWORD(name) );
+
+    return CURSORICON_Load( hInstance, name,
+                            SYSMETRICS_CXCURSOR, SYSMETRICS_CYCURSOR, 1, TRUE);
+}
+
+
+/***********************************************************************
+ *           LoadIcon    (USER.174)
+ */
+HICON LoadIcon( HANDLE hInstance, SEGPTR name )
+{
+    if (HIWORD(name))
+        dprintf_icon( stddeb, "LoadIcon: "NPFMT" '%s'\n",
+                      hInstance, (char *)PTR_SEG_TO_LIN( name ) );
+    else
+        dprintf_icon( stddeb, "LoadIcon: "NPFMT" %04x\n",
+                      hInstance, LOWORD(name) );
+
+    return CURSORICON_Load( hInstance, name,
+                            SYSMETRICS_CXICON, SYSMETRICS_CYICON,
+                            min( 16, 1 << screenDepth ), FALSE );
+}
+
+
+/***********************************************************************
+ *           CreateCursor    (USER.406)
+ */
+HICON CreateCursor( HANDLE hInstance, INT xHotSpot, INT yHotSpot,
+                    INT nWidth, INT nHeight, LPSTR lpANDbits, LPSTR lpXORbits)
+{
+    CURSORICONINFO info = { { xHotSpot, yHotSpot }, nWidth, nHeight, 1, 1 };
+
+    dprintf_cursor( stddeb, "CreateCursor: %dx%d spot=%d,%d xor=%p and=%p\n",
+                    nWidth, nHeight, xHotSpot, yHotSpot, lpXORbits, lpANDbits);
+    return CreateCursorIconIndirect( hInstance, &info, lpANDbits, lpXORbits );
+}
+
+
+/***********************************************************************
+ *           CreateIcon    (USER.407)
+ */
+HICON CreateIcon( HANDLE hInstance, INT nWidth, INT nHeight, BYTE bPlanes,
+                  BYTE bBitsPixel, LPSTR lpANDbits, LPSTR lpXORbits)
+{
+    CURSORICONINFO info = { { 0, 0 }, nWidth, nHeight, bPlanes, bBitsPixel };
+
+    dprintf_icon( stddeb, "CreateIcon: %dx%dx%d, xor=%p, and=%p\n",
+                  nWidth, nHeight, bPlanes * bBitsPixel, lpXORbits, lpANDbits);
+    return CreateCursorIconIndirect( hInstance, &info, lpANDbits, lpXORbits );
+}
+
+
+/***********************************************************************
+ *           CreateCursorIconIndirect    (USER.408)
+ */
+HANDLE CreateCursorIconIndirect( HANDLE hInstance, CURSORICONINFO *info,
+                                 LPSTR lpANDbits, LPSTR lpXORbits )
+{
+    HANDLE handle;
+    char *ptr;
+    int sizeAnd, sizeXor;
+
+    hInstance = GetExePtr( hInstance );  /* Make it a module handle */
+    if (!hInstance || !lpXORbits || !lpANDbits || info->bPlanes != 1) return 0;
+    info->nWidthBytes = (info->nWidth * info->bBitsPerPixel + 15) / 16 * 2;
+    sizeXor = info->nHeight * info->nWidthBytes;
+    sizeAnd = info->nHeight * ((info->nWidth + 15) / 16 * 2);
+    if (!(handle = DirectResAlloc(hInstance, 0x10,
+                                  sizeof(CURSORICONINFO) + sizeXor + sizeAnd)))
+        return 0;
+    ptr = (char *)GlobalLock( handle );
+    memcpy( ptr, info, sizeof(*info) );
+    memcpy( ptr + sizeof(CURSORICONINFO), lpANDbits, sizeAnd );
+    memcpy( ptr + sizeof(CURSORICONINFO) + sizeAnd, lpXORbits, sizeXor );
+    GlobalUnlock( handle );
+    return handle;
+}
+
+
+/***********************************************************************
+ *           CopyIcon    (USER.368)
+ */
+HICON CopyIcon( HANDLE hInstance, HICON hIcon )
+{
+    dprintf_icon( stddeb, "CopyIcon: %04x %04x\n", hInstance, hIcon );
+    return CURSORICON_Copy( hInstance, hIcon );
+}
+
+
+/***********************************************************************
+ *           CopyCursor    (USER.369)
+ */
+HCURSOR CopyCursor( HANDLE hInstance, HCURSOR hCursor )
+{
+    dprintf_cursor( stddeb, "CopyCursor: %04x %04x\n", hInstance, hCursor );
+    return CURSORICON_Copy( hInstance, hCursor );
+}
+
+
+/***********************************************************************
+ *           DestroyIcon    (USER.457)
+ */
+BOOL DestroyIcon( HICON hIcon )
+{
+    dprintf_icon( stddeb, "DestroyIcon: %04x\n", hIcon );
+    return GlobalFree( hIcon );
+}
+
+
+/***********************************************************************
+ *           DestroyCursor    (USER.458)
+ */
+BOOL DestroyCursor( HCURSOR hCursor )
+{
+    dprintf_cursor( stddeb, "DestroyCursor: %04x\n", hCursor );
+    return GlobalFree( hCursor );
+}
+
+
+/***********************************************************************
+ *           DrawIcon    (USER.84)
+ */
+BOOL DrawIcon( HDC hdc, short x, short y, HICON hIcon )
+{
+    CURSORICONINFO *ptr;
+    HDC hMemDC;
+    HBITMAP hXorBits, hAndBits;
+    COLORREF oldFg, oldBg;
+
+    if (!(ptr = (CURSORICONINFO *)GlobalLock( hIcon ))) return FALSE;
+    if (!(hMemDC = CreateCompatibleDC( hdc ))) return FALSE;
+    hAndBits = CreateBitmap( ptr->nWidth, ptr->nHeight, 1, 1, (char *)(ptr+1));
+    hXorBits = CreateBitmap( ptr->nWidth, ptr->nHeight, ptr->bPlanes,
+                             ptr->bBitsPerPixel, (char *)(ptr + 1)
+                              + ptr->nHeight * ((ptr->nWidth + 15) / 16 * 2) );
+    oldFg = SetTextColor( hdc, RGB(0,0,0) );
+    oldBg = SetBkColor( hdc, RGB(255,255,255) );
+
+    if (hXorBits && hAndBits)
+    {
+        HBITMAP hBitTemp = SelectObject( hMemDC, hAndBits );
+        BitBlt( hdc, x, y, ptr->nWidth, ptr->nHeight, hMemDC, 0, 0, SRCAND );
+        SelectObject( hMemDC, hXorBits );
+        BitBlt( hdc, x, y, ptr->nWidth, ptr->nHeight, hMemDC, 0, 0, SRCINVERT);
+        SelectObject( hMemDC, hBitTemp );
+    }
+    DeleteDC( hMemDC );
+    if (hXorBits) DeleteObject( hXorBits );
+    if (hAndBits) DeleteObject( hAndBits );
+    GlobalUnlock( hIcon );
+    SetTextColor( hdc, oldFg );
+    SetBkColor( hdc, oldBg );
+    return TRUE;
+}
+
+
+/***********************************************************************
+ *           DumpIcon    (USER.459)
+ */
+DWORD DumpIcon( CURSORICONINFO *info, WORD *lpLen,
+                LPSTR *lpXorBits, LPSTR *lpAndBits )
+{
+    int sizeAnd, sizeXor;
+
+    if (!info) return 0;
+    sizeXor = info->nHeight * info->nWidthBytes;
+    sizeAnd = info->nHeight * ((info->nWidth + 15) / 16 * 2);
+    if (lpAndBits) *lpAndBits = (LPSTR)(info + 1);
+    if (lpXorBits) *lpXorBits = (LPSTR)(info + 1) + sizeAnd;
+    if (lpLen) *lpLen = sizeof(CURSORICONINFO) + sizeAnd + sizeXor;
+    return MAKELONG( sizeXor, sizeXor );
+}
+
+
+/***********************************************************************
+ *           CURSORICON_SetCursor
+ *
+ * Change the X cursor. Helper function for SetCursor() and ShowCursor().
+ */
+static BOOL CURSORICON_SetCursor( HCURSOR hCursor )
+{
+    Pixmap pixmapBits, pixmapMask, pixmapAll;
+    XColor fg, bg;
+    Cursor cursor = None;
+
+    if (!hCursor)  /* Create an empty cursor */
+    {
+        static const char data[] = { 0 };
+
+        bg.red = bg.green = bg.blue = 0x0000;
+        pixmapBits = XCreateBitmapFromData( display, rootWindow, data, 1, 1 );
+        if (pixmapBits)
+        {
+            cursor = XCreatePixmapCursor( display, pixmapBits, pixmapBits,
+                                          &bg, &bg, 0, 0 );
+            XFreePixmap( display, pixmapBits );
+        }
+    }
+    else  /* Create the X cursor from the bits */
+    {
+        CURSORICONINFO *ptr;
+        XImage *image;
+
+        if (!(ptr = (CURSORICONINFO*)GlobalLock( hCursor ))) return FALSE;
+        if (ptr->bPlanes * ptr->bBitsPerPixel != 1)
+        {
+            fprintf( stderr, "Cursor %04x has more than 1 bpp!\n", hCursor );
+            return FALSE;
+        }
+
+        /* Create a pixmap and transfer all the bits to it */
+
+        pixmapAll = XCreatePixmap( display, rootWindow,
+                                   ptr->nWidth, ptr->nHeight * 2, 1 );
+        image = XCreateImage( display, DefaultVisualOfScreen(screen),
+                              1, ZPixmap, 0, (char *)(ptr + 1), ptr->nWidth,
+                              ptr->nHeight * 2, 16, ptr->nWidthBytes);
+        if (image)
+        {
+            extern void _XInitImageFuncPtrs( XImage* );
+            image->byte_order = MSBFirst;
+            image->bitmap_bit_order = MSBFirst;
+            image->bitmap_unit = 16;
+            _XInitImageFuncPtrs(image);
+            if (pixmapAll)
+                CallTo32_LargeStack( XPutImage, 10,
+                                     display, pixmapAll, BITMAP_monoGC, image,
+                                     0, 0, 0, 0, ptr->nWidth, ptr->nHeight*2 );
+            image->data = NULL;
+            XDestroyImage( image );
+        }
+
+        /* Now create the 2 pixmaps for bits and mask */
+
+        pixmapBits = XCreatePixmap( display, rootWindow,
+                                    ptr->nWidth, ptr->nHeight, 1 );
+        pixmapMask = XCreatePixmap( display, rootWindow,
+                                    ptr->nWidth, ptr->nHeight, 1 );
+
+        /* Make sure everything went OK so far */
+
+        if (pixmapBits && pixmapMask && pixmapAll)
+        {
+            /* We have to do some magic here, as cursors are not fully
+             * compatible between Windows and X11. Under X11, there
+             * are only 3 possible color cursor: black, white and
+             * masked. So we map the 4th Windows color (invert the
+             * bits on the screen) to black. This require some boolean
+             * arithmetic:
+             *
+             *   Windows                        X11
+             * Xor    And      Result      Bits     Mask
+             *  0      0     black          0        1
+             *  0      1     no change      X        0
+             *  1      0     white          1        1
+             *  1      1     inverted       0        1  (=black)
+             *
+             * which gives:
+             *  Bits = 'Xor' xor 'And'
+             *  Mask = 'Xor' or not 'And'
+             */
+            XCopyArea( display, pixmapAll, pixmapBits, BITMAP_monoGC,
+                       0, 0, ptr->nWidth, ptr->nHeight, 0, 0 );
+            XCopyArea( display, pixmapAll, pixmapMask, BITMAP_monoGC,
+                       0, 0, ptr->nWidth, ptr->nHeight, 0, 0 );
+            XSetFunction( display, BITMAP_monoGC, GXxor );
+            XCopyArea( display, pixmapAll, pixmapBits, BITMAP_monoGC,
+                       0, ptr->nHeight, ptr->nWidth, ptr->nHeight, 0, 0 );
+            XSetFunction( display, BITMAP_monoGC, GXorReverse );
+            XCopyArea( display, pixmapAll, pixmapMask, BITMAP_monoGC,
+                       0, ptr->nHeight, ptr->nWidth, ptr->nHeight, 0, 0 );
+            XSetFunction( display, BITMAP_monoGC, GXcopy );
+            fg.red = fg.green = fg.blue = 0xffff;
+            bg.red = bg.green = bg.blue = 0x0000;
+            cursor = XCreatePixmapCursor( display, pixmapBits, pixmapMask,
+                                &fg, &bg, ptr->ptHotSpot.x, ptr->ptHotSpot.y );
+        }
+
+        /* Now free everything */
+
+        if (pixmapAll) XFreePixmap( display, pixmapAll );
+        if (pixmapBits) XFreePixmap( display, pixmapBits );
+        if (pixmapMask) XFreePixmap( display, pixmapMask );
+        GlobalUnlock( hCursor );
+    }
+
+    if (cursor == None) return FALSE;
+    if (CURSORICON_XCursor != None) XFreeCursor( display, CURSORICON_XCursor );
+    CURSORICON_XCursor = cursor;
+
+    if (rootWindow != DefaultRootWindow(display))
+    {
+        /* Set the cursor on the desktop window */
+        XDefineCursor( display, rootWindow, cursor );
+    }
+    else
+    {
+        /* Set the same cursor for all top-level windows */
+        HWND hwnd = GetWindow( GetDesktopWindow(), GW_CHILD );
+        while(hwnd)
+        {
+            Window win = WIN_GetXWindow( hwnd );
+            if (win) XDefineCursor( display, win, cursor );
+            hwnd = GetWindow( hwnd, GW_HWNDNEXT );
+        }
+    }
+    return TRUE;
+}
+
+
+/***********************************************************************
+ *           SetCursor    (USER.69)
+ */
+HCURSOR SetCursor( HCURSOR hCursor )
+{
+    HCURSOR hOldCursor;
+
+    if (hCursor == hActiveCursor) return hActiveCursor;  /* No change */
+    dprintf_cursor( stddeb, "SetCursor: %04x\n", hCursor );
+    hOldCursor = hActiveCursor;
+    hActiveCursor = hCursor;
+    /* Change the cursor shape only if it is visible */
+    if (CURSOR_ShowCount >= 0) CURSORICON_SetCursor( hActiveCursor );
+    return hOldCursor;
+}
+
+
+/***********************************************************************
+ *           SetCursorPos    (USER.70)
+ */
+void SetCursorPos( short x, short y )
+{
+    dprintf_cursor( stddeb, "SetCursorPos: x=%d y=%d\n", x, y );
+    XWarpPointer( display, None, rootWindow, 0, 0, 0, 0, x, y );
+}
+
+
+/***********************************************************************
+ *           ShowCursor    (USER.71)
+ */
+int ShowCursor( BOOL bShow )
+{
+    dprintf_cursor( stddeb, "ShowCursor: %d, count=%d\n",
+                    bShow, CURSOR_ShowCount );
+
+    if (bShow)
+    {
+        if (++CURSOR_ShowCount == 0)
+            CURSORICON_SetCursor( hActiveCursor );  /* Show it */
+    }
+    else
+    {
+        if (--CURSOR_ShowCount == -1)
+            CURSORICON_SetCursor( 0 );  /* Hide it */
+    }
+    return CURSOR_ShowCount;
+}
+
+
+/***********************************************************************
+ *           GetCursor    (USER.247)
+ */
+HCURSOR GetCursor(void)
+{
+    return hActiveCursor;
+}
+
+
+/***********************************************************************
+ *           ClipCursor    (USER.16)
+ */
+void ClipCursor( RECT *rect )
+{
+    if (!rect) SetRectEmpty( &CURSOR_ClipRect );
+    else CopyRect( &CURSOR_ClipRect, rect );
+}
+
+
+/***********************************************************************
+ *           GetCursorPos    (USER.17)
+ */
+void GetCursorPos( POINT *pt )
+{
+    Window root, child;
+    int rootX, rootY, childX, childY;
+    unsigned int mousebut;
+
+    if (!pt) return;
+    if (!XQueryPointer( display, rootWindow, &root, &child,
+		        &rootX, &rootY, &childX, &childY, &mousebut ))
+	pt->x = pt->y = 0;
+    else
+    {
+	pt->x = rootX + desktopX;
+	pt->y = rootY + desktopY;
+    }
+    dprintf_cursor(stddeb, "GetCursorPos: ret=%d,%d\n", pt->x, pt->y );
+}
+
+
+/***********************************************************************
+ *           GetClipCursor    (USER.309)
+ */
+void GetClipCursor( RECT *rect )
+{
+    if (rect) CopyRect( rect, &CURSOR_ClipRect );
+}
+
+
+/**********************************************************************
+ *	    GetIconID    (USER.455)
+ */
+WORD GetIconID( HANDLE hResource, DWORD resType )
+{
+    fprintf( stderr, "GetIconId(%04x,%ld): empty stub!\n",
+             hResource, resType );
+    return 0;
+}
+
+
+/**********************************************************************
+ *	    LoadIconHandler    (USER.456)
+ */
+HICON LoadIconHandler( HANDLE hResource, BOOL bNew )
+{
+    fprintf( stderr, "LoadIconHandle(%04x,%d): empty stub!\n",
+             hResource, bNew );
+    return 0;
+}
diff --git a/objects/dc.c b/objects/dc.c
index 5a74ad26abc..7dbd68e7b4c 100644
--- a/objects/dc.c
+++ b/objects/dc.c
@@ -332,7 +332,7 @@ HDC GetDCState( HDC hdc )
     if (!(handle = GDI_AllocObject( sizeof(DC), DC_MAGIC ))) return 0;
     newdc = (DC *) GDI_HEAP_LIN_ADDR( handle );
 
-    dprintf_dc(stddeb, "GetDCState(%d): returning %d\n", hdc, handle );
+    dprintf_dc(stddeb, "GetDCState("NPFMT"): returning "NPFMT"\n", hdc, handle );
 
     memset( &newdc->u.x, 0, sizeof(newdc->u.x) );
     memcpy( &newdc->w, &dc->w, sizeof(dc->w) );
@@ -365,7 +365,7 @@ void SetDCState( HDC hdc, HDC hdcs )
     if (!(dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC ))) return;
     if (!(dcs = (DC *) GDI_GetObjPtr( hdcs, DC_MAGIC ))) return;
     if (!dcs->w.flags & DC_SAVED) return;
-    dprintf_dc(stddeb, "SetDCState: %d %d\n", hdc, hdcs );
+    dprintf_dc(stddeb, "SetDCState: "NPFMT" "NPFMT"\n", hdc, hdcs );
 
       /* Save the regions before overwriting everything */
     hVisRgn    = dc->w.hVisRgn;
@@ -409,7 +409,7 @@ int SaveDC( HDC hdc )
     dcs = (DC *) GDI_HEAP_LIN_ADDR( hdcs );
     dcs->header.hNext = dc->header.hNext;
     dc->header.hNext = hdcs;
-    dprintf_dc(stddeb, "SaveDC(%d): returning %d\n", hdc, dc->saveLevel+1 );
+    dprintf_dc(stddeb, "SaveDC("NPFMT"): returning %d\n", hdc, dc->saveLevel+1 );
     return ++dc->saveLevel;
 }
 
@@ -421,7 +421,7 @@ BOOL RestoreDC( HDC hdc, short level )
 {
     DC * dc, * dcs;
 
-    dprintf_dc(stddeb, "RestoreDC: %d %d\n", hdc, level );
+    dprintf_dc(stddeb, "RestoreDC: "NPFMT" %d\n", hdc, level );
     dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC );
     if (!dc) 
     {
@@ -458,7 +458,7 @@ HDC CreateDC( LPSTR driver, LPSTR device, LPSTR output, LPSTR initData )
     if (!handle) return 0;
     dc = (DC *) GDI_HEAP_LIN_ADDR( handle );
 
-    dprintf_dc(stddeb, "CreateDC(%s %s %s): returning %d\n", 
+    dprintf_dc(stddeb, "CreateDC(%s %s %s): returning "NPFMT"\n",
 	    driver, device, output, handle );
 
     if (!displayDevCaps)
@@ -514,7 +514,7 @@ HDC CreateCompatibleDC( HDC hdc )
     if (!handle) return 0;
     dc = (DC *) GDI_HEAP_LIN_ADDR( handle );
 
-    dprintf_dc(stddeb, "CreateCompatibleDC(%d): returning %d\n", hdc, handle );
+    dprintf_dc(stddeb, "CreateCompatibleDC("NPFMT"): returning "NPFMT"\n", hdc, handle );
 
       /* Create default bitmap */
     if (!(hbitmap = CreateBitmap( 1, 1, 1, 1, NULL )))
@@ -558,7 +558,7 @@ BOOL DeleteDC( HDC hdc )
     DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC );
     if (!dc) return FALSE;
 
-    dprintf_dc(stddeb, "DeleteDC: %d\n", hdc );
+    dprintf_dc(stddeb, "DeleteDC: "NPFMT"\n", hdc );
 
     while (dc->saveLevel)
     {
@@ -587,6 +587,16 @@ BOOL DeleteDC( HDC hdc )
 }
 
 
+/***********************************************************************
+ *           ResetDC    (GDI.376)
+ */
+HDC ResetDC( HDC hdc, /* DEVMODE */ void *devmode )
+{
+    fprintf( stderr, "ResetDC: empty stub!\n" );
+    return hdc;
+}
+
+
 /***********************************************************************
  *           GetDeviceCaps    (GDI.80)
  */
@@ -597,7 +607,7 @@ int GetDeviceCaps( HDC hdc, WORD cap )
 
     if (cap > sizeof(DeviceCaps)-sizeof(WORD)) return 0;
     
-    dprintf_dc(stddeb, "GetDeviceCaps(%d,%d): returning %d\n",
+    dprintf_dc(stddeb, "GetDeviceCaps("NPFMT",%d): returning %d\n",
 	    hdc, cap, *(WORD *)(((char *)dc->w.devCaps) + cap) );
     return *(WORD *)(((char *)dc->w.devCaps) + cap);
 }
diff --git a/objects/dib.c b/objects/dib.c
index c976180a81b..1082b743b84 100644
--- a/objects/dib.c
+++ b/objects/dib.c
@@ -12,7 +12,6 @@
 #include "bitmap.h"
 #include "callback.h"
 #include "palette.h"
-#include "icon.h"
 #include "stackframe.h"
 #include "stddebug.h"
 #include "color.h"
@@ -51,14 +50,23 @@ int DIB_GetImageWidthBytes( int width, int depth )
  */
 int DIB_BitmapInfoSize( BITMAPINFO * info, WORD coloruse )
 {
-    int size = info->bmiHeader.biClrUsed;
-    if (!size && (info->bmiHeader.biBitCount != 24))
-	size = 1 << info->bmiHeader.biBitCount;
-    if (coloruse == DIB_RGB_COLORS) 
-	size = info->bmiHeader.biSize + size * sizeof(RGBQUAD);
-    else
-	size = info->bmiHeader.biSize + size * sizeof(WORD);
-    return size;
+    int colors;
+
+    if (info->bmiHeader.biSize == sizeof(BITMAPCOREHEADER))
+    {
+        BITMAPCOREHEADER *core = (BITMAPCOREHEADER *)info;
+        colors = (core->bcBitCount != 24) ? 1 << core->bcBitCount : 0;
+        return sizeof(BITMAPCOREHEADER) + colors *
+             ((coloruse == DIB_RGB_COLORS) ? sizeof(RGBTRIPLE) : sizeof(WORD));
+    }
+    else  /* assume BITMAPINFOHEADER */
+    {
+        colors = info->bmiHeader.biClrUsed;
+        if (!colors && (info->bmiHeader.biBitCount != 24))
+            colors = 1 << info->bmiHeader.biBitCount;
+        return sizeof(BITMAPINFOHEADER) + colors *
+               ((coloruse == DIB_RGB_COLORS) ? sizeof(RGBQUAD) : sizeof(WORD));
+    }
 }
 
 
@@ -85,6 +93,103 @@ static XImage *DIB_DIBmpToImage( BITMAPINFOHEADER * bmp, void * bmpData )
 }
 
 
+/***********************************************************************
+ *           DIB_GetBitmapInfo
+ *
+ * Get the info from a bitmap header.
+ * Return 1 for INFOHEADER, 0 for COREHEADER, -1 for error.
+ */
+static int DIB_GetBitmapInfo( BITMAPINFOHEADER *header, DWORD *width,
+                              DWORD *height, WORD *bpp )
+{
+    if (header->biSize == sizeof(BITMAPINFOHEADER))
+    {
+        *width  = header->biWidth;
+        *height = header->biHeight;
+        *bpp    = header->biBitCount;
+        return 1;
+    }
+    if (header->biSize == sizeof(BITMAPCOREHEADER))
+    {
+        BITMAPCOREHEADER *core = (BITMAPCOREHEADER *)header;
+        *width  = core->bcWidth;
+        *height = core->bcHeight;
+        *bpp    = core->bcBitCount;
+        return 0;
+    }
+    fprintf( stderr, "DIB_GetBitmapInfo: wrong size (%ld) for header\n",
+             header->biSize );
+    return -1;
+}
+
+
+/***********************************************************************
+ *           DIB_BuildColorMap
+ *
+ * Build the color map from the bitmap palette. Should not be called
+ * for a 24-bit deep bitmap.
+ */
+static int *DIB_BuildColorMap( DC *dc, WORD coloruse, WORD depth,
+                               BITMAPINFO *info )
+{
+    int i, colors;
+    BOOL isInfo;
+    WORD *colorPtr;
+    int *colorMapping;
+
+    if ((isInfo = (info->bmiHeader.biSize == sizeof(BITMAPINFOHEADER))))
+    {
+        colors = info->bmiHeader.biClrUsed;
+        if (!colors) colors = 1 << info->bmiHeader.biBitCount;
+        colorPtr = (WORD *)info->bmiColors;
+    }
+    else  /* assume BITMAPCOREINFO */
+    {
+        colors = 1 << ((BITMAPCOREHEADER *)&info->bmiHeader)->bcBitCount;
+        colorPtr = (WORD *)((BITMAPCOREINFO *)info)->bmciColors;
+    }
+    if (!(colorMapping = (int *)malloc( colors * sizeof(int) ))) return NULL;
+
+    if (coloruse == DIB_RGB_COLORS)
+    {
+        if (isInfo)
+        {
+            RGBQUAD * rgb = (RGBQUAD *)colorPtr;
+        
+            if (depth == 1)  /* Monochrome */
+                for (i = 0; i < colors; i++, rgb++)
+                    colorMapping[i] = (rgb->rgbRed + rgb->rgbGreen + 
+                                       rgb->rgbBlue > 255*3/2);
+            else
+                for (i = 0; i < colors; i++, rgb++)
+                    colorMapping[i] = COLOR_ToPhysical( dc, RGB(rgb->rgbRed,
+                                                                rgb->rgbGreen,
+                                                                rgb->rgbBlue));
+        }
+        else
+        {
+            RGBTRIPLE * rgb = (RGBTRIPLE *)colorPtr;
+        
+            if (depth == 1)  /* Monochrome */
+                for (i = 0; i < colors; i++, rgb++)
+                    colorMapping[i] = (rgb->rgbtRed + rgb->rgbtGreen + 
+                                       rgb->rgbtBlue > 255*3/2);
+            else
+                for (i = 0; i < colors; i++, rgb++)
+                    colorMapping[i] = COLOR_ToPhysical( dc, RGB(rgb->rgbtRed,
+                                                               rgb->rgbtGreen,
+                                                               rgb->rgbtBlue));
+        }
+    }
+    else  /* DIB_PAL_COLORS */
+    {
+        for (i = 0; i < colors; i++, colorPtr++)
+            colorMapping[i] = COLOR_ToPhysical( dc, PALETTEINDEX(*colorPtr) );
+    }
+    return colorMapping;
+}
+
+
 /***********************************************************************
  *           DIB_SetImageBits_1
  *
@@ -454,68 +559,48 @@ static void DIB_SetImageBits_24( WORD lines, BYTE *bits, WORD width,
  * Helper function for SetDIBits() and SetDIBitsToDevice().
  */
 static int DIB_SetImageBits( DC *dc, WORD lines, WORD depth, LPSTR bits,
-			     BITMAPINFO *info, WORD coloruse,
+                             DWORD infoWidth, WORD infoBpp, DWORD compression,
+                             BITMAPINFO *info, WORD coloruse,
 			     Drawable drawable, GC gc, int xSrc, int ySrc,
 			     int xDest, int yDest, int width, int height )
 {
     int *colorMapping;
     XImage *bmpImage;
-    int i, colors;
 
       /* Build the color mapping table */
 
-    if (info->bmiHeader.biBitCount == 24) colorMapping = NULL;
+    if (infoBpp == 24) colorMapping = NULL;
     else
-    {
-	colors = info->bmiHeader.biClrUsed;
-	if (!colors) colors = 1 << info->bmiHeader.biBitCount;
-	if (!(colorMapping = (int *)malloc( colors * sizeof(int) )))
-	    return 0;
-	if (coloruse == DIB_RGB_COLORS)
-	{
-	    RGBQUAD * rgbPtr = info->bmiColors;
-            for (i = 0; i < colors; i++, rgbPtr++)
-                colorMapping[i] = COLOR_ToPhysical( dc, RGB(rgbPtr->rgbRed,
-							    rgbPtr->rgbGreen,
-							    rgbPtr->rgbBlue) );
-	}
-	else
-	{
-	    WORD * index = (WORD *)info->bmiColors;
-	    for (i = 0; i < colors; i++, index++)
-		colorMapping[i] = COLOR_ToPhysical( dc, PALETTEINDEX(*index) );
-	}
-    }
+        if (!(colorMapping = DIB_BuildColorMap( dc, coloruse, depth, info )))
+            return 0;
 
       /* Transfer the pixels */
-    XCREATEIMAGE(bmpImage, info->bmiHeader.biWidth, lines, depth );
+    XCREATEIMAGE(bmpImage, infoWidth, lines, depth );
 
-    switch(info->bmiHeader.biBitCount)
+    switch(infoBpp)
     {
     case 1:
-	DIB_SetImageBits_1( lines, bits, info->bmiHeader.biWidth,
+	DIB_SetImageBits_1( lines, bits, infoWidth,
 			    colorMapping, bmpImage );
 	break;
     case 4:
-	if (info->bmiHeader.biCompression)
-		DIB_SetImageBits_RLE4( lines, bits, info->bmiHeader.biWidth,
-			    colorMapping, bmpImage );
-	else	
-		DIB_SetImageBits_4( lines, bits, info->bmiHeader.biWidth,
-			    colorMapping, bmpImage );
+	if (compression) DIB_SetImageBits_RLE4( lines, bits, infoWidth,
+                                                colorMapping, bmpImage );
+	else DIB_SetImageBits_4( lines, bits, infoWidth,
+                                 colorMapping, bmpImage );
 	break;
     case 8:
-	if (info->bmiHeader.biCompression)
-		DIB_SetImageBits_RLE8( lines, bits, info->bmiHeader.biWidth,
-			    colorMapping, bmpImage );
-	else
-		DIB_SetImageBits_8( lines, bits, info->bmiHeader.biWidth,
-			    colorMapping, bmpImage );
+	if (compression) DIB_SetImageBits_RLE8( lines, bits, infoWidth,
+                                                colorMapping, bmpImage );
+	else DIB_SetImageBits_8( lines, bits, infoWidth,
+                                 colorMapping, bmpImage );
 	break;
     case 24:
-	DIB_SetImageBits_24( lines, bits, info->bmiHeader.biWidth,
-			     dc, bmpImage );
+	DIB_SetImageBits_24( lines, bits, infoWidth, dc, bmpImage );
 	break;
+    default:
+        fprintf( stderr, "Invalid depth %d for SetDIBits!\n", infoBpp );
+        break;
     }
     if (colorMapping) free(colorMapping);
     XPutImage( display, drawable, gc, bmpImage, xSrc, ySrc,
@@ -548,6 +633,7 @@ int StretchDIBits( HDC hdc,
     return wSrcHeight;
 }
 
+
 /***********************************************************************
  *           SetDIBits    (GDI.440)
  */
@@ -556,21 +642,26 @@ int SetDIBits( HDC hdc, HBITMAP hbitmap, WORD startscan, WORD lines,
 {
     DC * dc;
     BITMAPOBJ * bmp;
+    DWORD width, height, compression = 0;
+    WORD bpp;
 
       /* Check parameters */
 
     if (!(dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC ))) return 0;
     if (!(bmp = (BITMAPOBJ *)GDI_GetObjPtr( hbitmap, BITMAP_MAGIC )))
 	return 0;
-    if (!lines || (startscan >= (WORD)info->bmiHeader.biHeight)) return 0;
-    if (startscan+lines > info->bmiHeader.biHeight)
-	lines = info->bmiHeader.biHeight - startscan;
-
-    return CallTo32_LargeStack( (int(*)())DIB_SetImageBits, 14,
+    if (DIB_GetBitmapInfo( &info->bmiHeader, &width, &height, &bpp ) == -1)
+        return 0;
+    if (info->bmiHeader.biSize == sizeof(BITMAPINFOHEADER))
+        compression = info->bmiHeader.biCompression;
+    if (!lines || (startscan >= (WORD)height)) return 0;
+    if (startscan + lines > height) lines = height - startscan;
+
+    return CallTo32_LargeStack( (int(*)())DIB_SetImageBits, 17,
                                 dc, lines, bmp->bitmap.bmBitsPixel,
-                                bits, info, coloruse, bmp->pixmap,
-                                BITMAP_GC(bmp), 0, 0, 0, startscan,
-                                bmp->bitmap.bmWidth, lines );
+                                bits, width, bpp, compression, info,
+                                coloruse, bmp->pixmap, BITMAP_GC(bmp), 0, 0, 0,
+                                startscan, bmp->bitmap.bmWidth, lines );
 }
 
 
@@ -582,25 +673,31 @@ int SetDIBitsToDevice( HDC hdc, short xDest, short yDest, WORD cx, WORD cy,
 		       LPSTR bits, BITMAPINFO * info, WORD coloruse )
 {
     DC * dc;
+    DWORD width, height, compression = 0;
+    WORD bpp;
 
       /* Check parameters */
 
     if (!(dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC ))) return 0;
-    if (!lines || (startscan >= info->bmiHeader.biHeight)) return 0;
-    if (startscan+lines > info->bmiHeader.biHeight)
-	lines = info->bmiHeader.biHeight - startscan;
+    if (DIB_GetBitmapInfo( &info->bmiHeader, &width, &height, &bpp ) == -1)
+        return 0;
+    if (info->bmiHeader.biSize == sizeof(BITMAPINFOHEADER))
+        compression = info->bmiHeader.biCompression;
+    if (!lines || (startscan >= height)) return 0;
+    if (startscan + lines > height) lines = height - startscan;
     if (ySrc < startscan) ySrc = startscan;
-    else if (ySrc >= startscan+lines) return 0;
-    if (xSrc >= info->bmiHeader.biWidth) return 0;
-    if (ySrc+cy >= startscan+lines) cy = startscan + lines - ySrc;
-    if (xSrc+cx >= info->bmiHeader.biWidth) cx = info->bmiHeader.biWidth-xSrc;
+    else if (ySrc >= startscan + lines) return 0;
+    if (xSrc >= width) return 0;
+    if (ySrc + cy >= startscan + lines) cy = startscan + lines - ySrc;
+    if (xSrc + cx >= width) cx = width - xSrc;
     if (!cx || !cy) return 0;
 
     DC_SetupGCForText( dc );  /* To have the correct colors */
     XSetFunction( display, dc->u.x.gc, DC_XROPfunction[dc->w.ROPmode-1] );
-    return CallTo32_LargeStack( (int(*)())DIB_SetImageBits, 14,
-                                dc, lines, dc->w.bitsPerPixel, bits, info,
-                                coloruse, dc->u.x.drawable, dc->u.x.gc,
+    return CallTo32_LargeStack( (int(*)())DIB_SetImageBits, 17,
+                                dc, lines, dc->w.bitsPerPixel, bits, width,
+                                bpp, compression, info, coloruse,
+                                dc->u.x.drawable, dc->u.x.gc,
                                 xSrc, ySrc - startscan,
                                 dc->w.DCOrgX + XLPTODP( dc, xDest ),
                                 dc->w.DCOrgY + YLPTODP( dc, yDest ),
@@ -679,65 +776,61 @@ HBITMAP CreateDIBitmap( HDC hdc, BITMAPINFOHEADER * header, DWORD init,
 		        LPSTR bits, BITMAPINFO * data, WORD coloruse )
 {
     HBITMAP handle;
-    
-	if(header->biSize!=sizeof(BITMAPINFOHEADER))
-	{
-		fprintf(stderr,"CreateDIBitmap: wrong size (%ld) for header\n",
-			header->biSize);
-		return 0;
-	}
-    handle = CreateCompatibleBitmap( hdc, header->biWidth, header->biHeight );
-/*    handle = CreateBitmap( header->biWidth, header->biHeight,
-                           1, header->biBitCount, NULL );
-*/
-    if (!handle) return 0;
-    if (init == CBM_INIT) SetDIBits( hdc, handle, 0, header->biHeight,
-				    bits, data, coloruse );
-    return handle;
-}
+    BOOL fColor;
+    DWORD width, height;
+    WORD bpp;
 
-/***********************************************************************
- *           DrawIcon    (USER.84)
- */
-BOOL DrawIcon(HDC hDC, short x, short y, HICON hIcon)
-{
-    ICONALLOC	*lpico;
-    BITMAP	bm;
-    HBITMAP	hBitTemp;
-    HDC		hMemDC;
-    COLORREF    oldFg, oldBg;
-
-    oldFg = SetTextColor( hDC, RGB(0,0,0) );
-    oldBg = SetBkColor( hDC, RGB(255,255,255) );
-    dprintf_icon(stddeb,"DrawIcon(%04X, %d, %d, %04X) \n", hDC, x, y, hIcon);
-    if (hIcon == (HICON)NULL) return FALSE;
-    lpico = (ICONALLOC *)GlobalLock(hIcon);
-    GetObject(lpico->hBitmap, sizeof(BITMAP), (LPSTR)&bm);
-    hMemDC = CreateCompatibleDC(hDC);
-    if (lpico->hBitMask)
-    {
-        hBitTemp = SelectObject(hMemDC, lpico->hBitMask);
-        BitBlt(hDC, x, y, bm.bmWidth, bm.bmHeight, hMemDC, 0, 0, SRCAND);
-        SelectObject(hMemDC, lpico->hBitmap);
-        BitBlt(hDC, x, y, bm.bmWidth, bm.bmHeight, hMemDC, 0, 0, SRCINVERT);
-    }
-    else  /* no mask -> everything is masked; so use SRCCOPY as it's faster */
+    if (DIB_GetBitmapInfo( header, &width, &height, &bpp ) == -1) return 0;
+
+    /* Check if we should create a monochrome or color bitmap. */
+    /* We create a monochrome bitmap only if it has exactly 2  */
+    /* colors, which are either black or white, nothing else.  */
+    /* In all other cases, we create a color bitmap.           */
+
+    if (bpp != 1) fColor = TRUE;
+    else if ((coloruse != DIB_RGB_COLORS) ||
+             (init != CBM_INIT) || !data) fColor = FALSE;
+    else
     {
-        hBitTemp = SelectObject(hMemDC, lpico->hBitmap);
-        BitBlt(hDC, x, y, bm.bmWidth, bm.bmHeight, hMemDC, 0, 0, SRCCOPY);
+        if (data->bmiHeader.biSize == sizeof(BITMAPINFOHEADER))
+        {
+            RGBQUAD *rgb = data->bmiColors;
+            DWORD col = RGB( rgb->rgbRed, rgb->rgbGreen, rgb->rgbBlue );
+            if ((col == RGB(0,0,0)) || (col == RGB(0xff,0xff,0xff)))
+            {
+                rgb++;
+                col = RGB( rgb->rgbRed, rgb->rgbGreen, rgb->rgbBlue );
+                fColor = ((col != RGB(0,0,0)) && (col != RGB(0xff,0xff,0xff)));
+            }
+            else fColor = TRUE;
+        }
+        else if (data->bmiHeader.biSize == sizeof(BITMAPCOREHEADER))
+        {
+            RGBTRIPLE *rgb = ((BITMAPCOREINFO *)data)->bmciColors;
+            DWORD col = RGB( rgb->rgbtRed, rgb->rgbtGreen, rgb->rgbtBlue );
+            if ((col == RGB(0,0,0)) || (col == RGB(0xff,0xff,0xff)))
+            {
+                rgb++;
+                col = RGB( rgb->rgbtRed, rgb->rgbtGreen, rgb->rgbtBlue );
+                fColor = ((col != RGB(0,0,0)) && (col != RGB(0xff,0xff,0xff)));
+            }
+            else fColor = TRUE;
+        }
+        else
+        {
+            fprintf( stderr, "CreateDIBitmap: wrong size (%ld) for data\n",
+                     data->bmiHeader.biSize );
+            return 0;
+        }
     }
-    SelectObject( hMemDC, hBitTemp );
-    DeleteDC(hMemDC);
-    GlobalUnlock( hIcon );
-    SetTextColor( hDC, oldFg );
-    SetBkColor( hDC, oldBg );
-    return TRUE;
-}
-/***********************************************************************
- *           CopyIcon    (USER.368)
- */
-BOOL CopyIcon(HANDLE handle, HICON hIcon)
-{
-    printf("STUB !!! CopyIcon: %x %x\n",handle,hIcon);
-    return TRUE;
+
+    /* Now create the bitmap */
+
+    handle = fColor ? CreateCompatibleBitmap( hdc, width, height ) :
+                      CreateBitmap( width, height, 1, 1, NULL );
+    if (!handle) return 0;
+
+    if (init == CBM_INIT)
+        SetDIBits( hdc, handle, 0, height, bits, data, coloruse );
+    return handle;
 }
diff --git a/objects/font.c b/objects/font.c
index bbeb6342492..b1a89a896cd 100644
--- a/objects/font.c
+++ b/objects/font.c
@@ -265,7 +265,7 @@ void FONT_GetMetrics( LOGFONT * logfont, XFontStruct * xfont,
 DWORD GetGlyphOutLine(HDC hdc, UINT uChar, UINT fuFormat, LPGLYPHMETRICS lpgm, 
                       DWORD cbBuffer, LPSTR lpBuffer, LPMAT2 lpmat2) 
 {
-    fprintf( stdnimp,"GetGlyphOutLine(%04x, '%c', %04x, %p, %ld, %p, %p) // - empty stub!\n",
+    fprintf( stdnimp,"GetGlyphOutLine("NPFMT", '%c', %04x, %p, %ld, %p, %p) // - empty stub!\n",
              hdc, uChar, fuFormat, lpgm, cbBuffer, lpBuffer, lpmat2 );
     return (DWORD)-1; /* failure */
 }
@@ -298,7 +298,7 @@ HFONT CreateFontIndirect( LOGFONT * font )
     fontPtr = (FONTOBJ *) GDI_HEAP_LIN_ADDR( hfont );
     memcpy( &fontPtr->logfont, font, sizeof(LOGFONT) );
     AnsiLower( fontPtr->logfont.lfFaceName );
-    dprintf_font(stddeb,"CreateFontIndirect(%p); return %04x\n",font,hfont);
+    dprintf_font(stddeb,"CreateFontIndirect(%p); return "NPFMT"\n",font,hfont);
     return hfont;
 }
 
@@ -339,7 +339,7 @@ HFONT FONT_SelectObject( DC * dc, HFONT hfont, FONTOBJ * font )
     X_PHYSFONT * stockPtr;
     HFONT prevHandle = dc->w.hFont;
     XFontStruct * fontStruct;
-    dprintf_font(stddeb,"FONT_SelectObject(%p, %04x, %p)\n", 
+    dprintf_font(stddeb,"FONT_SelectObject(%p, "NPFMT", %p)\n", 
 		     dc, hfont, font);
       /* Load font if necessary */
 
@@ -354,10 +354,14 @@ HFONT FONT_SelectObject( DC * dc, HFONT hfont, FONTOBJ * font )
     }
 
     if (dc->header.wMagic == METAFILE_DC_MAGIC)
-	return MF_CreateFontIndirect(dc, hfont, &(font->logfont));
+      if (MF_CreateFontIndirect(dc, hfont, &(font->logfont)))
+	return prevHandle;
+      else
+	return 0;
 
+      /*  Must be DWORD for WINELIB32 support  */
     if ((hfont >= FIRST_STOCK_FONT) && (hfont <= LAST_STOCK_FONT))
-	stockPtr = &stockFonts[hfont - FIRST_STOCK_FONT];
+	stockPtr = &stockFonts[(DWORD)hfont - (DWORD)FIRST_STOCK_FONT];
     else 
 	stockPtr = NULL;
     
@@ -368,7 +372,7 @@ HFONT FONT_SelectObject( DC * dc, HFONT hfont, FONTOBJ * font )
               /* If it is not a stock font, we can simply return 0 */
             if (!stockPtr) return 0;
               /* Otherwise we must try to find a substitute */
-            dprintf_font(stddeb,"Loading font 'fixed' for %x\n", hfont );
+            dprintf_font(stddeb,"Loading font 'fixed' for "NPFMT"\n", hfont );
             font->logfont.lfPitchAndFamily &= ~VARIABLE_PITCH;
             font->logfont.lfPitchAndFamily |= FIXED_PITCH;
             fontStruct = XLoadQueryFont( display, "fixed" );
@@ -383,7 +387,7 @@ HFONT FONT_SelectObject( DC * dc, HFONT hfont, FONTOBJ * font )
     {
 	fontStruct = stockPtr->fstruct;
 	dprintf_font(stddeb,
-                     "FONT_SelectObject: Loaded font from cache %x %p\n",
+                     "FONT_SelectObject: Loaded font from cache "NPFMT" %p\n",
 		     hfont, fontStruct );
     }	
 
@@ -514,7 +518,7 @@ BOOL GetTextExtentPoint( HDC hdc, LPSTR str, short count, LPSIZE size )
     size->cy = abs((dc->u.x.font.fstruct->ascent+dc->u.x.font.fstruct->descent)
 		    * dc->w.WndExtY / dc->w.VportExtY);
 
-    dprintf_font(stddeb,"GetTextExtentPoint(%d '%*.*s' %d %p): returning %d,%d\n",
+    dprintf_font(stddeb,"GetTextExtentPoint("NPFMT" '%*.*s' %d %p): returning %d,%d\n",
 	    hdc, count, count, str, count, size, size->cx, size->cy );
     return TRUE;
 }
@@ -551,7 +555,7 @@ BOOL GetTextMetrics( HDC hdc, LPTEXTMETRIC metrics )
  */
 DWORD SetMapperFlags(HDC hDC, DWORD dwFlag)
 {
-    dprintf_font(stdnimp,"SetmapperFlags(%04X, %08lX) // Empty Stub !\n", 
+    dprintf_font(stdnimp,"SetmapperFlags("NPFMT", %08lX) // Empty Stub !\n", 
 		 hDC, dwFlag); 
     return 0L;
 }
@@ -597,7 +601,7 @@ BOOL GetCharWidth(HDC hdc, WORD wFirstChar, WORD wLastChar, LPINT lpBuffer)
 /***********************************************************************
  *           AddFontResource    (GDI.119)
  */
-int AddFontResource( LPSTR str )
+INT AddFontResource( LPCSTR str )
 {
     fprintf( stdnimp, "STUB: AddFontResource('%s')\n", str );
     return 1;
@@ -740,7 +744,7 @@ int EnumFonts(HDC hDC, LPSTR lpFaceName, FARPROC lpEnumFunc, LPSTR lpData)
   int          nRet = 0;
   int          i;
   
-  dprintf_font(stddeb,"EnumFonts(%04X, %p='%s', %08lx, %p)\n", 
+  dprintf_font(stddeb,"EnumFonts("NPFMT", %p='%s', %08lx, %p)\n", 
 	       hDC, lpFaceName, lpFaceName, (LONG)lpEnumFunc, lpData);
   if (lpEnumFunc == 0) return 0;
   hLog = GDI_HEAP_ALLOC( sizeof(LOGFONT) + LF_FACESIZE );
@@ -810,8 +814,8 @@ int EnumFontFamilies(HDC hDC, LPSTR lpszFamily, FARPROC lpEnumFunc, LPSTR lpData
   int	       	nRet = 0;
   int	       	i;
   
-  dprintf_font(stddeb,"EnumFontFamilies(%04X, %p, %08lx, %p)\n",
-	       hDC, lpszFamily, lpEnumFunc, lpData);
+  dprintf_font(stddeb,"EnumFontFamilies("NPFMT", %p, %08lx, %p)\n",
+	       hDC, lpszFamily, (DWORD)lpEnumFunc, lpData);
   if (lpEnumFunc == 0) return 0;
   hLog = GDI_HEAP_ALLOC( sizeof(ENUMLOGFONT) );
   lpEnumLogFont = (LPENUMLOGFONT) GDI_HEAP_LIN_ADDR(hLog);
diff --git a/objects/gdiobj.c b/objects/gdiobj.c
index af7cccceccd..b2434125125 100644
--- a/objects/gdiobj.c
+++ b/objects/gdiobj.c
@@ -208,7 +208,7 @@ BOOL GDI_AppendToPenBrushList(HANDLE hNewObj)
 		if (*lphObj == 0) {
 			*lphObj = hNewObj;
 			*(lphObj + 1) = 0;
-			dprintf_gdi(stddeb,"GDI_AppendToPenBrushList(%04X) appended (count=%d)\n", hNewObj, i);
+			dprintf_gdi(stddeb,"GDI_AppendToPenBrushList("NPFMT") appended (count=%d)\n", hNewObj, i);
 			return TRUE;
 		}
 		lphObj++;
@@ -245,7 +245,8 @@ BOOL GDI_FreeObject( HANDLE handle )
     GDIOBJHDR * object;
 
       /* Can't free stock objects */
-    if (handle >= FIRST_STOCK_HANDLE) return TRUE;
+    if ((DWORD)handle >= FIRST_STOCK_HANDLE &&
+	(DWORD)handle <= LAST_STOCK_HANDLE   ) return TRUE;
     
     object = (GDIOBJHDR *) GDI_HEAP_LIN_ADDR( handle );
     if (!object) return FALSE;
@@ -267,12 +268,11 @@ GDIOBJHDR * GDI_GetObjPtr( HANDLE handle, WORD magic )
 {
     GDIOBJHDR * ptr = NULL;
 
-    if (handle >= FIRST_STOCK_HANDLE)
-    {
-	if (handle < FIRST_STOCK_HANDLE + NB_STOCK_OBJECTS)
-	    ptr = StockObjects[handle - FIRST_STOCK_HANDLE];
-    }
-    else ptr = (GDIOBJHDR *) GDI_HEAP_LIN_ADDR( handle );
+    if ((DWORD)handle >= FIRST_STOCK_HANDLE &&
+	(DWORD)handle <= LAST_STOCK_HANDLE   )
+      ptr = StockObjects[(DWORD)handle - FIRST_STOCK_HANDLE];
+    else 
+      ptr = (GDIOBJHDR *) GDI_HEAP_LIN_ADDR( handle );
     if (!ptr) return NULL;
     if (ptr->wMagic != magic) return NULL;
     return ptr;
@@ -289,7 +289,7 @@ BOOL DeleteObject( HANDLE obj )
     GDIOBJHDR * header = (GDIOBJHDR *) GDI_HEAP_LIN_ADDR( obj );
     if (!header) return FALSE;
 
-    dprintf_gdi(stddeb, "DeleteObject: %d\n", obj );
+    dprintf_gdi(stddeb, "DeleteObject: "NPFMT"\n", obj );
 
       /* Delete object */
 
@@ -313,9 +313,9 @@ HANDLE GetStockObject( int obj )
 {
     if ((obj < 0) || (obj >= NB_STOCK_OBJECTS)) return 0;
     if (!StockObjects[obj]) return 0;
-    dprintf_gdi(stddeb, "GetStockObject: returning %04x\n", 
-		FIRST_STOCK_HANDLE + obj );
-    return FIRST_STOCK_HANDLE + obj;
+    dprintf_gdi(stddeb, "GetStockObject: returning %ld\n",
+		(DWORD)FIRST_STOCK_HANDLE + obj );
+    return (HANDLE)((DWORD)FIRST_STOCK_HANDLE + obj);
 }
 
 
@@ -325,15 +325,14 @@ HANDLE GetStockObject( int obj )
 int GetObject( HANDLE handle, int count, LPSTR buffer )
 {
     GDIOBJHDR * ptr = NULL;
-    dprintf_gdi(stddeb, "GetObject: %04x %d %p\n", handle, count, buffer );
+    dprintf_gdi(stddeb, "GetObject: "NPFMT" %d %p\n", handle, count, buffer );
     if (!count) return 0;
 
-    if (handle >= FIRST_STOCK_HANDLE)
-    {
-	if (handle < FIRST_STOCK_HANDLE + NB_STOCK_OBJECTS)
-	    ptr = StockObjects[handle - FIRST_STOCK_HANDLE];
-    }
-    else ptr = (GDIOBJHDR *) GDI_HEAP_LIN_ADDR( handle );
+    if ((DWORD)handle >= FIRST_STOCK_HANDLE &&
+	(DWORD)handle <= LAST_STOCK_HANDLE   )
+      ptr = StockObjects[(DWORD)handle - FIRST_STOCK_HANDLE];
+    else
+      ptr = (GDIOBJHDR *) GDI_HEAP_LIN_ADDR( handle );
     if (!ptr) return 0;
     
     switch(ptr->wMagic)
@@ -361,13 +360,12 @@ HANDLE SelectObject( HDC hdc, HANDLE handle )
     GDIOBJHDR * ptr = NULL;
     DC * dc;
     
-    dprintf_gdi(stddeb, "SelectObject: %d %04x\n", hdc, handle );
-    if (handle >= FIRST_STOCK_HANDLE)
-    {
-	if (handle < FIRST_STOCK_HANDLE + NB_STOCK_OBJECTS)
-	    ptr = StockObjects[handle - FIRST_STOCK_HANDLE];
-    }
-    else ptr = (GDIOBJHDR *) GDI_HEAP_LIN_ADDR( handle );
+    dprintf_gdi(stddeb, "SelectObject: "NPFMT" "NPFMT"\n", hdc, handle );
+    if ((DWORD)handle >= FIRST_STOCK_HANDLE &&
+	(DWORD)handle <= LAST_STOCK_HANDLE   )
+      ptr = StockObjects[(DWORD)handle - FIRST_STOCK_HANDLE];
+    else 
+      ptr = (GDIOBJHDR *) GDI_HEAP_LIN_ADDR( handle );
     if (!ptr) return 0;
     
     dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC );
@@ -388,7 +386,7 @@ HANDLE SelectObject( HDC hdc, HANDLE handle )
       case FONT_MAGIC:
 	  return FONT_SelectObject( dc, handle, (FONTOBJ *)ptr );	  
       case REGION_MAGIC:
-	  return SelectClipRgn( hdc, handle );
+	  return (HANDLE)SelectClipRgn( hdc, handle );
     }
     return 0;
 }
@@ -399,7 +397,7 @@ HANDLE SelectObject( HDC hdc, HANDLE handle )
  */
 BOOL UnrealizeObject( HANDLE handle )
 {
-    dprintf_gdi(stdnimp, "UnrealizeObject: %04x\n", handle );
+    dprintf_gdi(stdnimp, "UnrealizeObject: "NPFMT"\n", handle );
     return TRUE;
 }
 
@@ -425,7 +423,7 @@ int EnumObjects(HDC hDC, int nObjType, FARPROC lpEnumFunc, LPSTR lpData)
   switch (nObjType) {
    case OBJ_PEN:
     wMagic = PEN_MAGIC;
-    dprintf_gdi(stddeb,"EnumObjects(%04X, OBJ_PEN, %08lx, %p);\n",
+    dprintf_gdi(stddeb,"EnumObjects("NPFMT", OBJ_PEN, %08lx, %p);\n",
 		hDC, (LONG)lpEnumFunc, lpData);
     hLog = GDI_HEAP_ALLOC( sizeof(LOGPEN) );
     lpLog = (LPSTR) GDI_HEAP_LIN_ADDR(hLog);
@@ -436,7 +434,7 @@ int EnumObjects(HDC hDC, int nObjType, FARPROC lpEnumFunc, LPSTR lpData)
     break;
    case OBJ_BRUSH:
     wMagic = BRUSH_MAGIC;
-    dprintf_gdi(stddeb,"EnumObjects(%04X, OBJ_BRUSH, %08lx, %p);\n",
+    dprintf_gdi(stddeb,"EnumObjects("NPFMT", OBJ_BRUSH, %08lx, %p);\n",
 		hDC, (LONG)lpEnumFunc, lpData);
     hLog = GDI_HEAP_ALLOC( sizeof(LOGBRUSH) );
     lpLog = (LPSTR) GDI_HEAP_LIN_ADDR(hLog);
@@ -446,7 +444,7 @@ int EnumObjects(HDC hDC, int nObjType, FARPROC lpEnumFunc, LPSTR lpData)
     }
     break;
    default:
-    fprintf(stderr,"EnumObjects(%04X, %04X, %08lx, %p); // Unknown OBJ type !\n", 
+    fprintf(stderr,"EnumObjects("NPFMT", %04X, %08lx, %p); // Unknown OBJ type !\n", 
 	    hDC, nObjType, (LONG)lpEnumFunc, lpData);
     return 0;
   }
@@ -484,7 +482,7 @@ int EnumObjects(HDC hDC, int nObjType, FARPROC lpEnumFunc, LPSTR lpData)
   
   if (lpPenBrushList == NULL) return 0;
   for (lphObj = lpPenBrushList; *lphObj != 0; ) {
-    dprintf_gdi(stddeb,"EnumObjects // *lphObj=%04X\n", *lphObj);
+    dprintf_gdi(stddeb,"EnumObjects // *lphObj="NPFMT"\n", *lphObj);
     header = (GDIOBJHDR *) GDI_HEAP_LIN_ADDR(*lphObj++);
     if (header->wMagic == wMagic) {
       dprintf_gdi(stddeb,"EnumObjects // DC_Obj lpLog=%p lpData=%p\n", lpLog, lpData);
@@ -492,7 +490,7 @@ int EnumObjects(HDC hDC, int nObjType, FARPROC lpEnumFunc, LPSTR lpData)
 	BRUSH_GetObject( (BRUSHOBJ *)header, sizeof(LOGBRUSH), lpLog);
 	dprintf_gdi(stddeb,"EnumObjects // DC_Brush lbStyle=%04X\n", ((LPLOGBRUSH)lpLog)->lbStyle);
 	dprintf_gdi(stddeb,"EnumObjects // DC_Brush lbColor=%08lX\n", ((LPLOGBRUSH)lpLog)->lbColor);
-	dprintf_gdi(stddeb,"EnumObjects // DC_Brush lbHatch=%04X\n", ((LPLOGBRUSH)lpLog)->lbHatch);
+	dprintf_gdi(stddeb,"EnumObjects // DC_Brush lbHatch=%04lX\n", (LONG)((LPLOGBRUSH)lpLog)->lbHatch);
       }
       if (header->wMagic == PEN_MAGIC) {
 	PEN_GetObject( (PENOBJ *)header, sizeof(LOGPEN), lpLog);
diff --git a/objects/metafile.c b/objects/metafile.c
index 846964e54f8..9628e99306c 100644
--- a/objects/metafile.c
+++ b/objects/metafile.c
@@ -759,7 +759,7 @@ BOOL MF_CreatePatternBrush(DC *dc, HBRUSH hBrush, LOGBRUSH *logbrush)
     switch (logbrush->lbStyle)
     {
     case BS_PATTERN:
-	bmp = (BITMAPOBJ *)GDI_GetObjPtr(logbrush->lbHatch, BITMAP_MAGIC);
+	bmp = (BITMAPOBJ *)GDI_GetObjPtr((HANDLE)logbrush->lbHatch, BITMAP_MAGIC);
 	if (!bmp) return FALSE;
 	len = sizeof(METARECORD) + sizeof(BITMAPINFOHEADER) + 
 	      (bmp->bitmap.bmHeight * bmp->bitmap.bmWidthBytes) + 6;
@@ -783,7 +783,7 @@ BOOL MF_CreatePatternBrush(DC *dc, HBRUSH hBrush, LOGBRUSH *logbrush)
 	break;
 
     case BS_DIBPATTERN:
-	info = (BITMAPINFO *)GlobalLock(logbrush->lbHatch);
+	info = (BITMAPINFO *)GlobalLock((HANDLE)logbrush->lbHatch);
 	bmSize = info->bmiHeader.biSizeImage;
 	if (!bmSize)
 	    bmSize = (info->bmiHeader.biWidth * info->bmiHeader.biBitCount 
diff --git a/objects/oembitmap.c b/objects/oembitmap.c
index ecd40b48eda..c850994c0ff 100644
--- a/objects/oembitmap.c
+++ b/objects/oembitmap.c
@@ -6,6 +6,7 @@
  */
 
 #include <stdlib.h>
+#include <string.h>
 #include <X11/Xlib.h>
 #include <X11/Xutil.h>
 #include <X11/xpm.h>
@@ -13,7 +14,7 @@
 #include "bitmap.h"
 #include "callback.h"
 #include "color.h"
-#include "icon.h"
+#include "cursoricon.h"
 #include "stddebug.h"
 #include "debug.h"
 
@@ -154,6 +155,51 @@ static char **OBM_Icons_Data[OIC_LAST-OIC_FIRST+1] =
 };
 
 
+  /* Include OEM cursors */
+#include "bitmaps/ocr_normal"
+#include "bitmaps/ocr_ibeam"
+#include "bitmaps/ocr_wait"
+#include "bitmaps/ocr_cross"
+#include "bitmaps/ocr_up"
+#include "bitmaps/ocr_size"
+#include "bitmaps/ocr_icon"
+#include "bitmaps/ocr_sizenwse"
+#include "bitmaps/ocr_sizenesw"
+#include "bitmaps/ocr_sizewe"
+#include "bitmaps/ocr_sizens"
+#if 0
+#include "bitmaps/ocr_sizeall"
+#include "bitmaps/ocr_icocur"
+#endif
+
+/* Cursor are not all contiguous (go figure...) */
+#define OCR_FIRST1 OCR_NORMAL
+#define OCR_LAST1  OCR_UP
+#define OCR_FIRST2 OCR_SIZE
+#define OCR_LAST2  OCR_SIZENS  /* OCR_ICOCUR */
+#define NB_CURSORS (OCR_LAST2 - OCR_FIRST2 + 1 + OCR_LAST1 - OCR_FIRST1 + 1)
+static char **OBM_Cursors_Data[NB_CURSORS] = 
+{
+    ocr_normal,    /* OCR_NORMAL */
+    ocr_ibeam,     /* OCR_IBEAM */
+    ocr_wait,      /* OCR_WAIT */
+    ocr_cross,     /* OCR_CROSS */
+    ocr_up,        /* OCR_UP */
+    ocr_size,      /* OCR_SIZE */
+    ocr_icon,      /* OCR_ICON */
+    ocr_sizenwse,  /* OCR_SIZENWSE */
+    ocr_sizenesw,  /* OCR_SIZENESW */
+    ocr_sizewe,    /* OCR_SIZEWE */
+    ocr_sizens     /* OCR_SIZENS */
+#if 0
+    ocr_sizeall,   /* OCR_SIZEALL */
+    ocr_icocur     /* OCR_ICOCUR */
+#endif
+};
+
+static HCURSOR OBM_Cursors[NB_CURSORS] = { 0, };
+
+
   /* All the colors used in the xpm files must be included in this   */
   /* list, to make sure that the loaded bitmaps only use colors from */
   /* the Windows colormap. Note: the PALETTEINDEX() are not really   */
@@ -166,7 +212,6 @@ static const struct
     COLORREF color;
 } OBM_SymbolicColors[] =
 {
-      /* Black & white must always be the first 2 colors */
     { "black",            RGB(0,0,0) },
     { "white",            RGB(255,255,255) },
     { "red",              RGB(255,0,0) },
@@ -190,6 +235,16 @@ static const struct
 #define NB_COLOR_SYMBOLS \
             (sizeof(OBM_SymbolicColors)/sizeof(OBM_SymbolicColors[0]))
 
+  /* These are the symbolic colors for monochrome bitmaps   */
+  /* This is needed to make sure that black is always 0 and */
+  /* white always 1, as required by Windows.                */
+
+static XpmColorSymbol OBM_BlackAndWhite[2] =
+{
+    { "black", NULL, 0 },
+    { "white", NULL, 0xffffffff }
+};
+
 static XpmColorSymbol *OBM_Colors = NULL;
 
 
@@ -243,7 +298,7 @@ static HBITMAP OBM_MakeBitmap( WORD width, WORD height,
     bmpObjPtr->bitmap.bmType       = 0;
     bmpObjPtr->bitmap.bmWidth      = width;
     bmpObjPtr->bitmap.bmHeight     = height;
-    bmpObjPtr->bitmap.bmWidthBytes = (width + 15) / 16 * 2;
+    bmpObjPtr->bitmap.bmWidthBytes = (width * bpp + 15) / 16 * 2;
     bmpObjPtr->bitmap.bmPlanes     = 1;
     bmpObjPtr->bitmap.bmBitsPixel  = bpp;
     bmpObjPtr->bitmap.bmBits       = NULL;
@@ -257,22 +312,28 @@ static HBITMAP OBM_MakeBitmap( WORD width, WORD height,
  * Create the 2 bitmaps from XPM data.
  */
 static BOOL OBM_CreateBitmaps( char **data, BOOL color, BOOL mask,
-                               HBITMAP *hBitmap, HBITMAP *hBitmapMask )
+                               HBITMAP *hBitmap, HBITMAP *hBitmapMask,
+                               POINT *hotspot )
 {
     Pixmap pixmap, pixmask;
     XpmAttributes attrs;
     int err;
 
-    attrs.valuemask    = XpmColormap | XpmDepth | XpmColorSymbols;
+    attrs.valuemask    = XpmColormap | XpmDepth | XpmColorSymbols | XpmHotspot;
     attrs.colormap     = COLOR_WinColormap;
     attrs.depth        = color ? screenDepth : 1;
-    attrs.colorsymbols = OBM_Colors;
+    attrs.colorsymbols = (attrs.depth > 1) ? OBM_Colors : OBM_BlackAndWhite;
     attrs.numsymbols   = (attrs.depth > 1) ? NB_COLOR_SYMBOLS : 2;
         
     err = XpmCreatePixmapFromData( display, rootWindow, data,
                                    &pixmap, &pixmask, &attrs );
 
     if (err != XpmSuccess) return FALSE;
+    if (hotspot)
+    {
+        hotspot->x = attrs.x_hotspot;
+        hotspot->y = attrs.y_hotspot;
+    }
     *hBitmap = OBM_MakeBitmap( attrs.width, attrs.height,
                                attrs.depth, pixmap );
     if (mask) *hBitmapMask = OBM_MakeBitmap( attrs.width, attrs.height,
@@ -301,10 +362,10 @@ HBITMAP OBM_LoadBitmap( WORD id )
 
     if (!OBM_InitColorSymbols()) return 0;
     
-    if (!CallTo32_LargeStack( (int(*)())OBM_CreateBitmaps, 5,
+    if (!CallTo32_LargeStack( (int(*)())OBM_CreateBitmaps, 6,
                               OBM_Pixmaps_Data[id].data,
                               OBM_Pixmaps_Data[id].color,
-                              FALSE, &hbitmap, &hbitmask ))
+                              FALSE, &hbitmap, &hbitmask, NULL, NULL ))
     {
         fprintf( stderr, "Error creating OEM bitmap %d\n", OBM_FIRST+id );
         return 0;
@@ -314,60 +375,95 @@ HBITMAP OBM_LoadBitmap( WORD id )
 
 
 /***********************************************************************
- *           OBM_LoadIcon
+ *           OBM_LoadCursorIcon
  */
-HICON OBM_LoadIcon( WORD id )
+HANDLE OBM_LoadCursorIcon( WORD id, BOOL fCursor )
 {
-    HICON hicon;
-    ICONALLOC *pIcon;
-    BITMAPOBJ *bmp;
-
-    if ((id < OIC_FIRST) || (id > OIC_LAST)) return 0;
-    id -= OIC_FIRST;
+    HANDLE handle;
+    CURSORICONINFO *pInfo;
+    BITMAPOBJ *bmpXor, *bmpAnd;
+    HBITMAP hXorBits, hAndBits;
+    POINT hotspot;
+    int sizeXor, sizeAnd;
+
+    if (fCursor)
+    {
+        if ((id >= OCR_FIRST1) && (id <= OCR_LAST1))
+            id -= OCR_FIRST1;
+        else if ((id >= OCR_FIRST2) && (id <= OCR_LAST2))
+            id += (OCR_LAST1 - OCR_FIRST1 + 1) - OCR_FIRST2;
+        else return 0;
+        if (OBM_Cursors[id]) return OBM_Cursors[id];
+    }
+    else
+    {
+        if ((id < OIC_FIRST) || (id > OIC_LAST)) return 0;
+        id -= OIC_FIRST;
+    }
 
     if (!OBM_InitColorSymbols()) return 0;
     
-    if (!(hicon = GlobalAlloc( GMEM_MOVEABLE, sizeof(ICONALLOC) ))) return 0;
-    pIcon = (ICONALLOC *)GlobalLock( hicon );
-
-    if (!CallTo32_LargeStack( (int(*)())OBM_CreateBitmaps, 5,
-                              OBM_Icons_Data[id], TRUE, TRUE,
-                              &pIcon->hBitmap, &pIcon->hBitMask ))
+    if (!CallTo32_LargeStack( (int(*)())OBM_CreateBitmaps, 6,
+                           fCursor ? OBM_Cursors_Data[id] : OBM_Icons_Data[id],
+                           !fCursor, TRUE, &hXorBits, &hAndBits, &hotspot ))
     {
-        fprintf( stderr, "Error creating OEM icon %d\n", OIC_FIRST+id );
-        GlobalFree( hicon );
+        fprintf( stderr, "Error creating OEM cursor/icon %d\n", id );
         return 0;
     }
 
-    bmp = (BITMAPOBJ *) GDI_GetObjPtr( pIcon->hBitmap, BITMAP_MAGIC );
-    pIcon->descriptor.Width = bmp->bitmap.bmWidth;
-    pIcon->descriptor.Height = bmp->bitmap.bmHeight;
-    pIcon->descriptor.ColorCount = bmp->bitmap.bmBitsPixel;
+    bmpXor = (BITMAPOBJ *) GDI_GetObjPtr( hXorBits, BITMAP_MAGIC );
+    bmpAnd = (BITMAPOBJ *) GDI_GetObjPtr( hAndBits, BITMAP_MAGIC );
+    sizeXor = bmpXor->bitmap.bmHeight * bmpXor->bitmap.bmWidthBytes;
+    sizeAnd = bmpXor->bitmap.bmHeight * ((bmpXor->bitmap.bmWidth+15) / 16 * 2);
 
-    if (pIcon->hBitMask)
+    if (!(handle = GlobalAlloc( GMEM_MOVEABLE,
+                                sizeof(CURSORICONINFO) + sizeXor + sizeAnd)))
     {
-        BITMAPOBJ *bmpMask;
+        DeleteObject( hXorBits );
+        DeleteObject( hAndBits );
+        return 0;
+    }
+
+    pInfo = (CURSORICONINFO *)GlobalLock( handle );
+    pInfo->ptHotSpot.x   = hotspot.x;
+    pInfo->ptHotSpot.y   = hotspot.y;
+    pInfo->nWidth        = bmpXor->bitmap.bmWidth;
+    pInfo->nHeight       = bmpXor->bitmap.bmHeight;
+    pInfo->nWidthBytes   = bmpXor->bitmap.bmWidthBytes;
+    pInfo->bPlanes       = bmpXor->bitmap.bmPlanes;
+    pInfo->bBitsPerPixel = bmpXor->bitmap.bmBitsPixel;
 
+    if (hAndBits)
+    {
           /* Invert the mask */
-        bmpMask = (BITMAPOBJ *) GDI_GetObjPtr( pIcon->hBitMask, BITMAP_MAGIC );
+
         XSetFunction( display, BITMAP_monoGC, GXinvert );
-        XFillRectangle( display, bmpMask->pixmap, BITMAP_monoGC, 0, 0,
-                        bmpMask->bitmap.bmWidth, bmpMask->bitmap.bmHeight );
+        XFillRectangle( display, bmpAnd->pixmap, BITMAP_monoGC, 0, 0,
+                        bmpAnd->bitmap.bmWidth, bmpAnd->bitmap.bmHeight );
+        XSetFunction( display, BITMAP_monoGC, GXcopy );
 
           /* Set the masked pixels to black */
-        if (bmp->bitmap.bmBitsPixel != 1)
+
+        if (bmpXor->bitmap.bmBitsPixel != 1)
         {
             XSetForeground( display, BITMAP_colorGC,
                             COLOR_ToPhysical( NULL, RGB(0,0,0) ));
             XSetBackground( display, BITMAP_colorGC, 0 );
             XSetFunction( display, BITMAP_colorGC, GXor );
-            XCopyPlane( display, bmpMask->pixmap, bmp->pixmap, BITMAP_colorGC,
-                        0, 0, bmp->bitmap.bmWidth, bmp->bitmap.bmHeight,
-                        0, 0, 1 );
+            XCopyPlane(display, bmpAnd->pixmap, bmpXor->pixmap, BITMAP_colorGC,
+                       0, 0, bmpXor->bitmap.bmWidth, bmpXor->bitmap.bmHeight,
+                       0, 0, 1 );
             XSetFunction( display, BITMAP_colorGC, GXcopy );
         }
-        XSetFunction( display, BITMAP_monoGC, GXcopy );
     }
 
-    return hicon;
+    if (hAndBits) GetBitmapBits( hAndBits, sizeAnd, (char *)(pInfo + 1) );
+    else memset( (char *)(pInfo + 1), 0xff, sizeAnd );
+    GetBitmapBits( hXorBits, sizeXor, (char *)(pInfo + 1) + sizeAnd );
+
+    DeleteObject( hXorBits );
+    DeleteObject( hAndBits );
+
+    if (fCursor) OBM_Cursors[id] = handle;
+    return handle;
 }
diff --git a/objects/palette.c b/objects/palette.c
index dd925ceaa75..7fa2cfe10e7 100644
--- a/objects/palette.c
+++ b/objects/palette.c
@@ -80,6 +80,14 @@ WORD SetPaletteEntries( HPALETTE hpalette, WORD start, WORD count,
     return count;
 }
 
+/***********************************************************************
+ *           ResizePalette          (GDI.368)
+ */
+BOOL ResizePalette(HPALETTE hPal, UINT cEntries)
+{
+ fprintf(stdnimp,"ResizePalette: empty stub! \n");
+ return FALSE;
+}
 
 /***********************************************************************
  *           SetSystemPaletteUse    (GDI.373)
@@ -90,7 +98,7 @@ WORD SetPaletteEntries( HPALETTE hpalette, WORD start, WORD count,
 WORD SetSystemPaletteUse( HDC hdc, WORD use)
 {
 	 WORD old=SystemPaletteUse;
-	 printf("SetSystemPaletteUse(%04X,%04X) // empty stub !!!\n", hdc, use);
+	 printf("SetSystemPaletteUse("NPFMT",%04X) // empty stub !!!\n", hdc, use);
 	 SystemPaletteUse=use;
 	 return old;
 }
@@ -100,7 +108,7 @@ WORD SetSystemPaletteUse( HDC hdc, WORD use)
  */
 WORD GetSystemPaletteUse( HDC hdc )
 {
-	printf("GetSystemPaletteUse(%04X) // empty stub !!!\n", hdc);
+	printf("GetSystemPaletteUse("NPFMT") // empty stub !!!\n", hdc);
 	return SystemPaletteUse;
 }
 
@@ -175,7 +183,7 @@ WORD GetNearestPaletteIndex( HPALETTE hpalette, COLORREF color )
 	}
 	entry++;
     }
-    dprintf_palette(stddeb,"GetNearestPaletteIndex(%x,%06lx): returning %d\n", 
+    dprintf_palette(stddeb,"GetNearestPaletteIndex("NPFMT",%06lx): returning %d\n", 
 	     hpalette, color, index );
     return index;
 }
@@ -200,7 +208,7 @@ HPALETTE GDISelectPalette( HDC hdc, HPALETTE hpal )
     HPALETTE prev;
     DC *dc;
 
-    dprintf_palette(stddeb, "GDISelectPalette: %d %d\n", hdc, hpal );
+    dprintf_palette(stddeb, "GDISelectPalette: "NPFMT" "NPFMT"\n", hdc, hpal );
     if (!(dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC ))) return 0;
     prev = dc->w.hPalette;
     dc->w.hPalette = hpal;
@@ -215,7 +223,7 @@ HPALETTE GDISelectPalette( HDC hdc, HPALETTE hpal )
  */
 UINT GDIRealizePalette( HDC hdc )
 {
-    dprintf_palette(stdnimp, "GDIRealizePalette: %d\n", hdc );
+    dprintf_palette(stdnimp, "GDIRealizePalette: "NPFMT"\n", hdc );
     return 0;
 }
 
diff --git a/objects/pen.c b/objects/pen.c
index 131667a4021..adf02e62f5e 100644
--- a/objects/pen.c
+++ b/objects/pen.c
@@ -61,7 +61,10 @@ HPEN PEN_SelectObject( DC * dc, HPEN hpen, PENOBJ * pen )
     HPEN prevHandle = dc->w.hPen;
 
     if (dc->header.wMagic == METAFILE_DC_MAGIC)
-	return MF_CreatePenIndirect(dc, hpen, &(pen->logpen));
+      if (MF_CreatePenIndirect(dc, hpen, &(pen->logpen)))
+	return prevHandle;
+      else
+	return 0;
 
     dc->w.hPen = hpen;
 
diff --git a/objects/region.c b/objects/region.c
index 02a10d71935..5be23ffc539 100644
--- a/objects/region.c
+++ b/objects/region.c
@@ -19,7 +19,7 @@
  */
 BOOL REGION_DeleteObject( HRGN hrgn, RGNOBJ * obj )
 {
-    dprintf_region(stddeb, "DeleteRegion: %x\n", hrgn );
+    dprintf_region(stddeb, "DeleteRegion: "NPFMT"\n", hrgn );
     if (obj->xrgn) XDestroyRegion( obj->xrgn );
     return GDI_FreeObject( hrgn );
 }
@@ -32,7 +32,7 @@ int OffsetRgn( HRGN hrgn, short x, short y )
 {
     RGNOBJ * obj = (RGNOBJ *) GDI_GetObjPtr( hrgn, REGION_MAGIC );
     if (!obj) return ERROR;
-    dprintf_region(stddeb, "OffsetRgn: %d %d,%d\n", hrgn, x, y );
+    dprintf_region(stddeb, "OffsetRgn: "NPFMT" %d,%d\n", hrgn, x, y );
     if (!obj->xrgn) return NULLREGION;
     XOffsetRegion( obj->xrgn, x, y );
     return COMPLEXREGION;
@@ -46,7 +46,7 @@ int GetRgnBox( HRGN hrgn, LPRECT rect )
 {
     RGNOBJ * obj = (RGNOBJ *) GDI_GetObjPtr( hrgn, REGION_MAGIC );
     if (!obj) return ERROR;
-    dprintf_region(stddeb, "GetRgnBox: %d\n", hrgn );
+    dprintf_region(stddeb, "GetRgnBox: "NPFMT"\n", hrgn );
     if (!obj->xrgn)
     {
         SetRectEmpty( rect );
@@ -84,7 +84,7 @@ HRGN CreateRectRgn( short left, short top, short right, short bottom )
         XUnionRectWithRegion( &rect, obj->xrgn, obj->xrgn );
     }
     else obj->xrgn = 0;
-    dprintf_region( stddeb, "CreateRectRgn(%d,%d-%d,%d): returning %x\n",
+    dprintf_region( stddeb, "CreateRectRgn(%d,%d-%d,%d): returning "NPFMT"\n",
                     left, top, right, bottom, hrgn );
     return hrgn;
 }
@@ -106,7 +106,7 @@ void SetRectRgn( HRGN hrgn, short left, short top, short right, short bottom )
 {
     RGNOBJ * obj;
 
-    dprintf_region(stddeb, "SetRectRgn: %x %d,%d-%d,%d\n", 
+    dprintf_region(stddeb, "SetRectRgn: "NPFMT" %d,%d-%d,%d\n", 
 		   hrgn, left, top, right, bottom );
     
     if (!(obj = (RGNOBJ *) GDI_GetObjPtr( hrgn, REGION_MAGIC ))) return;
@@ -143,7 +143,7 @@ HRGN CreateRoundRectRgn( short left, short top, short right, short bottom,
     if (!(hrgn = GDI_AllocObject( sizeof(RGNOBJ), REGION_MAGIC ))) return 0;
     obj = (RGNOBJ *) GDI_HEAP_LIN_ADDR( hrgn );
     obj->xrgn = XCreateRegion();
-    dprintf_region(stddeb,"CreateRoundRectRgn(%d,%d-%d,%d %dx%d): return=%x\n",
+    dprintf_region(stddeb,"CreateRoundRectRgn(%d,%d-%d,%d %dx%d): return="NPFMT"\n",
                left, top, right, bottom, ellipse_width, ellipse_height, hrgn );
 
       /* Check parameters */
@@ -276,7 +276,7 @@ HRGN CreatePolyPolygonRgn( POINT * points, short * count,
     }
     obj = (RGNOBJ *) GDI_HEAP_LIN_ADDR( hrgn );
     obj->xrgn = 0;
-    dprintf_region(stddeb, "CreatePolyPolygonRgn: %d polygons, returning %x\n",
+    dprintf_region(stddeb, "CreatePolyPolygonRgn: %d polygons, returning "NPFMT"\n",
                    nbpolygons, hrgn );
 
       /* Create X region */
@@ -406,7 +406,7 @@ int CombineRgn( HRGN hDest, HRGN hSrc1, HRGN hSrc2, short mode )
 {
     RGNOBJ *destObj, *src1Obj, *src2Obj;
     
-    dprintf_region(stddeb, "CombineRgn: %x,%x -> %x mode=%x\n", 
+    dprintf_region(stddeb, "CombineRgn: "NPFMT","NPFMT" -> "NPFMT" mode=%x\n", 
 		   hSrc1, hSrc2, hDest, mode );
     
     if (!(destObj = (RGNOBJ *) GDI_GetObjPtr( hDest, REGION_MAGIC )))
diff --git a/objects/text.c b/objects/text.c
index 1ee64d0fe7a..fd94b1041de 100644
--- a/objects/text.c
+++ b/objects/text.c
@@ -571,7 +571,7 @@ LONG TEXT_TabbedTextOut( HDC hdc, int x, int y, LPSTR lpstr, int count,
 LONG TabbedTextOut( HDC hdc, short x, short y, LPSTR lpstr, short count, 
                     short cTabStops, LPINT lpTabPos, short nTabOrg )
 {
-    dprintf_text( stddeb, "TabbedTextOut: %x %d,%d '%*.*s' %d\n",
+    dprintf_text( stddeb, "TabbedTextOut: "NPFMT" %d,%d '%*.*s' %d\n",
                   hdc, x, y, count, count, lpstr, count );
     return TEXT_TabbedTextOut( hdc, x, y, lpstr, count, cTabStops,
                                lpTabPos, nTabOrg, TRUE );
@@ -584,7 +584,7 @@ LONG TabbedTextOut( HDC hdc, short x, short y, LPSTR lpstr, short count,
 DWORD GetTabbedTextExtent( HDC hdc, LPSTR lpstr, int count, 
                           int cTabStops, LPINT lpTabPos )
 {
-    dprintf_text( stddeb, "GetTabbedTextExtent: %x '%*.*s' %d\n",
+    dprintf_text( stddeb, "GetTabbedTextExtent: "NPFMT" '%*.*s' %d\n",
                   hdc, count, count, lpstr, count );
     return TEXT_TabbedTextOut( hdc, 0, 0, lpstr, count, cTabStops,
                                lpTabPos, 0, FALSE );
diff --git a/rc/Imakefile b/rc/Imakefile
deleted file mode 100644
index 571cb8f39ed..00000000000
--- a/rc/Imakefile
+++ /dev/null
@@ -1,65 +0,0 @@
-#include "../Wine.tmpl"
-
-MODULE = rc
-
-.SUFFIXES: .rc
-
-.rc.c:
-	echo "#include \"windows.h\"" >$*.rct
-	echo WINDOWS_H_ENDS_HERE >>$*.rct
-	cat $< >>$*.rct
-	$(CC) -E -x c -P $(CFLAGS) $*.rct | sed -e '1,/^WINDOWS_H_ENDS_HERE/d' | ./winerc -o $* -v -p $*
-	$(RM) $*.rct
-
-XCOMM This would be nicer, but it breaks gcc (2.5.8 on Linux)  --AJ
-XCOMM gcc -E -x c -P $(CFLAGS) -imacros ../include/windows.h $*.rc | ./winerc -o $* -v -p $*
-
-RCSRCS = sysres.rc
-
-RCOBJS = $(RCSRCS:.rc=.o)
-
-WineRelocatableTarget($(MODULE),,$(RCOBJS))
-
-$(RCOBJS): winerc $(TOP)/include/windows.h
-
-includes::
-	touch $(RCSRCS:.rc=.h)
-
-clean::
-	$(RM) $(RCSRCS:.rc=.c) $(RCSRCS:.rc=.h) $(RCSRCS:.rc=.rct)
-
-
-XCOMM Rules to build the winerc program
-
-SRCS = \
-	lex.yy.c \
-	winerc.c \
-	y.tab.c
-
-OBJS = $(SRCS:.c=.o)
-
-#ifdef SunArchitecture
-YACC=bison -y
-LEX=flex
-LOCAL_LIBRARIES = -ly -ll
-#endif
-#if defined(i386BsdArchitecture) || defined(i386FreeBsd) || defined(FreeBSDArchitecture)
-LOCAL_LIBRARIES = -ll
-#endif
-
-NormalProgramTarget(winerc,$(OBJS),$(DEPLIBS),$(LOCAL_LIBRARIES),)
-
-depend:: y.tab.c y.tab.h lex.yy.c
-
-DependTarget()
-
-clean::
-	$(RM) lex.yy.c y.tab.*
-
-y.tab.c y.tab.h: parser.y
-	$(YACC) -d -t parser.y
-
-lex.yy.c: parser.l y.tab.h
-	$(LEX) -8 -I parser.l
- 
-
diff --git a/rc/Makefile.in b/rc/Makefile.in
index aec8d022f64..0f558c6fbcc 100644
--- a/rc/Makefile.in
+++ b/rc/Makefile.in
@@ -4,6 +4,8 @@ MODULE = rc
 
 C_SRCS = sysres.c
 
+LANGUAGES = En Es De No Fr Fi Da
+
 all: $(MODULE).o
 
 @MAKE_RULES@
@@ -17,7 +19,7 @@ lex.yy.c: parser.l
 winerc: lex.yy.o winerc.o y.tab.o
 	$(CC) $(ALLCFLAGS) lex.yy.o winerc.o y.tab.o -o winerc $(LEXLIB)
 
-sysres.rct: sysres.rc sysres_En.rc sysres_Es.rc sysres_De.rc sysres_No.rc
+sysres.rct: sysres.rc $(LANGUAGES:%=sysres_%.rc)
 	echo "#include \"windows.h\"" >sysres.rct
 	echo WINDOWS_H_ENDS_HERE >>sysres.rct
 	cat sysres.rc >>sysres.rct
diff --git a/rc/parser.h b/rc/parser.h
index 5064c6037dd..dc667bab134 100644
--- a/rc/parser.h
+++ b/rc/parser.h
@@ -77,6 +77,9 @@ gen_res* add_generic_control(gen_res*,gen_res*);
 gen_res* make_dialog(gen_res*,int,int,int,int,gen_res*);
 
 gen_res *hex_to_raw(char*,gen_res*);
+gen_res *int_to_raw(int,gen_res*);
+gen_res *make_font(gen_res*);
+gen_res *make_raw(gen_res*);
 gen_res *make_bitmap(gen_res*);
 gen_res *make_icon(gen_res*);
 gen_res *make_cursor(gen_res*);
diff --git a/rc/parser.y b/rc/parser.y
index d8d7004d997..121c508c929 100644
--- a/rc/parser.y
+++ b/rc/parser.y
@@ -204,5 +204,6 @@ style:		NUMBER {$$=new_style();$$->or=$1;}
 int yyerror(char *s)
 {
 	puts(s);
+	return 0;
 }
 
diff --git a/rc/sysres.rc b/rc/sysres.rc
index 4cd2efd080a..52e3749c9b7 100644
--- a/rc/sysres.rc
+++ b/rc/sysres.rc
@@ -6,6 +6,12 @@
 #include "sysres_No.rc"
 #elif #LANG(Es)
 #include "sysres_Es.rc"
+#elif #LANG(Fr)
+#include "sysres_Fr.rc"
+#elif #LANG(Fi)
+#include "sysres_Fi.rc"
+#elif #LANG(Da)
+#include "sysres_Da.rc"
 #else
 #error LANG not set to an implemented language.
 #endif
diff --git a/rc/sysres_Da.rc b/rc/sysres_Da.rc
new file mode 100644
index 00000000000..df9c11f8f54
--- /dev/null
+++ b/rc/sysres_Da.rc
@@ -0,0 +1,200 @@
+SYSMENU MENU LOADONCALL MOVEABLE DISCARDABLE
+{
+ MENUITEM "&Genopret", 61728
+ MENUITEM "&Flyt", 61456
+ MENUITEM "&Størrelse", 61440
+ MENUITEM "Mi&nimer", 61472
+ MENUITEM "Ma&ximer", 61488
+ MENUITEM SEPARATOR
+ MENUITEM "&Luk\tAlt-F4", 61536
+ MENUITEM SEPARATOR
+ MENUITEM "&Skift til ...\tCtrl-Esc", 61744
+ MENUITEM SEPARATOR
+ MENUITEM "&Om WINE ...", 61761
+}
+
+MSGBOX DIALOG 100, 80, 216, 168
+STYLE DS_SYSMODAL | DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
+BEGIN
+        ICON "", 1088, 8, 20, 16, 16, WS_CHILD | WS_VISIBLE
+        LTEXT "", 100, 32, 4, 176, 48, WS_CHILD | WS_VISIBLE | WS_GROUP
+        PUSHBUTTON "&Ok", 1, 16, 56, 40, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP
+        PUSHBUTTON "&Annuller", 2, 64, 56, 40, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP
+        PUSHBUTTON "&Afbryd", 3, 112, 56, 40, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP
+        PUSHBUTTON "&Gentag", 4, 160, 56, 40, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP
+        PUSHBUTTON "&Ignorer", 5, 208, 56, 40, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP
+        PUSHBUTTON "&Ja", 6, 256, 56, 40, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP
+        PUSHBUTTON "&Nej", 7, 304, 56, 40, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP
+END
+
+SHELL_ABOUT_MSGBOX DIALOG LOADONCALL MOVEABLE DISCARDABLE 50, 44, 223, 200
+STYLE DS_LOCALEDIT | DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
+CAPTION "Om %s"
+FONT 10, "System"
+{
+ DEFPUSHBUTTON "Ok", 1, 91, 180, 40, 14
+ CONTROL "", -1, "STATIC", SS_BLACKFRAME | WS_CHILD | WS_VISIBLE | WS_DISABLED, 4, 35, 215, 140
+ LTEXT "Tekst", 100, 11, 40, 200, 130, SS_NOPREFIX | WS_GROUP
+ ICON "", 1088, 195, 10, 18, 20
+}
+
+
+OPEN_FILE DIALOG LOADONCALL MOVEABLE DISCARDABLE 36, 24, 275, 134
+STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
+CAPTION "Ã…bn"
+FONT 8, "Helv"
+{
+ LTEXT "&Filnavn:", 1090, 6, 6, 76, 9
+ EDITTEXT 1152, 6, 16, 90, 12, ES_AUTOHSCROLL | ES_OEMCONVERT | WS_BORDER | WS_TABSTOP
+ LISTBOX 1120, 6, 32, 90, 68, LBS_STANDARD | LBS_OWNERDRAWFIXED | LBS_HASSTRINGS | LBS_DISABLENOSCROLL | WS_TABSTOP
+ LTEXT "&Kataloger:", -1, 110, 6, 92, 9
+ LTEXT "", 1088, 110, 18, 92, 9, SS_NOPREFIX | WS_GROUP
+ LISTBOX 1121, 110, 32, 92, 68, LBS_STANDARD | LBS_OWNERDRAWFIXED | LBS_HASSTRINGS | LBS_DISABLENOSCROLL | WS_TABSTOP
+ LTEXT "&Oversigt over filer af type:", 1089, 6, 104, 90, 9
+ COMBOBOX 1136, 6, 114, 90, 36, CBS_DROPDOWNLIST | CBS_AUTOHSCROLL | WS_BORDER | WS_VSCROLL | WS_TABSTOP
+ LTEXT "&Drev:", 1091, 110, 104, 92, 9
+ COMBOBOX 1137, 110, 114, 92, 68, CBS_DROPDOWNLIST | CBS_OWNERDRAWFIXED | CBS_AUTOHSCROLL | CBS_SORT | CBS_HASSTRINGS | WS_BORDER | WS_VSCROLL | WS_TABSTOP
+ DEFPUSHBUTTON "Ã…&bn", 1, 208, 6, 56, 14, BS_DEFPUSHBUTTON | WS_GROUP | WS_TABSTOP
+ PUSHBUTTON "Annuler", 2, 208, 24, 56, 14, WS_GROUP | WS_TABSTOP
+ PUSHBUTTON "&Hjælp", 1038, 208, 46, 56, 14, WS_GROUP | WS_TABSTOP
+ CHECKBOX "&Skrivebeskyttet", 1040, 208, 68, 50, 12, BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP
+}
+
+
+SAVE_FILE DIALOG LOADONCALL MOVEABLE DISCARDABLE 36, 24, 275, 134
+STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
+CAPTION "Gem som ..."
+FONT 8, "Helv"
+{
+ LTEXT "&Filnavn:", 1090, 6, 6, 76, 9
+ EDITTEXT 1152, 6, 16, 90, 12, ES_AUTOHSCROLL | ES_OEMCONVERT | WS_BORDER | WS_TABSTOP
+ LISTBOX 1120, 6, 32, 90, 68, LBS_STANDARD | LBS_OWNERDRAWFIXED | LBS_HASSTRINGS | LBS_DISABLENOSCROLL | WS_TABSTOP
+ LTEXT "&Kataloger:", -1, 110, 6, 92, 9
+ LTEXT "", 1088, 110, 18, 92, 9, SS_NOPREFIX | WS_GROUP
+ LISTBOX 1121, 110, 32, 92, 68, LBS_STANDARD | LBS_OWNERDRAWFIXED | LBS_HASSTRINGS | LBS_DISABLENOSCROLL | WS_TABSTOP
+ LTEXT "&Oversigt over filer af type:", 1089, 6, 104, 90, 9
+ COMBOBOX 1136, 6, 114, 90, 36, CBS_DROPDOWNLIST | CBS_AUTOHSCROLL | WS_BORDER | WS_VSCROLL | WS_TABSTOP
+ LTEXT "&Drev:", 1091, 110, 104, 92, 9
+ COMBOBOX 1137, 110, 114, 92, 68, CBS_DROPDOWNLIST | CBS_OWNERDRAWFIXED | CBS_AUTOHSCROLL | CBS_SORT | CBS_HASSTRINGS | WS_BORDER | WS_VSCROLL | WS_TABSTOP
+ DEFPUSHBUTTON "&Gem som", 1, 208, 6, 56, 14, BS_DEFPUSHBUTTON | WS_GROUP | WS_TABSTOP
+ PUSHBUTTON "Annuller", 2, 208, 24, 56, 14, WS_GROUP | WS_TABSTOP
+ PUSHBUTTON "&Hjælp", 1038, 208, 46, 56, 14, WS_GROUP | WS_TABSTOP
+ CHECKBOX "&Skrivebeskyttet", 1040, 208, 68, 50, 12, BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP
+}
+
+
+PRINT DIALOG LOADONCALL MOVEABLE DISCARDABLE 36, 24, 264, 134
+STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
+CAPTION "Udskriv"
+FONT 8, "Helv"
+{
+ LTEXT "Printer:", 1088, 6, 6, 40, 9
+ LTEXT "", 1089, 60, 6, 150, 9
+ GROUPBOX "Udskriv område", 1072, 6, 30, 160, 65, BS_GROUPBOX
+ RADIOBUTTON "&Alt", 1056, 16, 45, 60, 12
+ RADIOBUTTON "&Markeret", 1057, 16, 60, 60, 12
+ RADIOBUTTON "&Sider", 1058, 16, 75, 60, 12
+ DEFPUSHBUTTON "Udskriv", 1, 206, 6, 56, 14, BS_DEFPUSHBUTTON | WS_GROUP | WS_TABSTOP
+ PUSHBUTTON "Annuller", 2, 206, 24, 56, 14, WS_GROUP | WS_TABSTOP
+ PUSHBUTTON "&Indstilling", 1024, 206, 46, 56, 14, WS_GROUP | WS_TABSTOP
+ LTEXT "&Fra:", 1090, 60, 80, 30, 9
+ LTEXT "&Til:", 1091, 120, 80, 30, 9
+ LTEXT "Udskrifts&kvalitet:", 1092, 6, 100, 76, 9
+ COMBOBOX 1136, 80, 100, 92, 68, CBS_DROPDOWNLIST | CBS_OWNERDRAWFIXED | CBS_AUTOHSCROLL | CBS_SORT | CBS_HASSTRINGS | WS_BORDER | WS_VSCROLL | WS_TABSTOP
+ CHECKBOX "Udskriv til fi&l", 1040, 20, 100, 50, 12, BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP
+ CHECKBOX "Sammentrykket", 1041, 160, 100, 50, 12, BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP
+}
+
+
+PRINT_SETUP DIALOG LOADONCALL MOVEABLE DISCARDABLE 36, 24, 264, 134
+STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
+CAPTION "Udskriftsindstilling"
+FONT 8, "Helv"
+{
+ GROUPBOX "Printer", 1072, 6, 10, 180, 65, BS_GROUPBOX
+ RADIOBUTTON "&Standardprinter", 1056, 16, 20, 80, 12
+ LTEXT "[none]", 1088, 35, 35, 120, 9
+ RADIOBUTTON "Specifik &printer", 1057, 16, 50, 80, 12
+ COMBOBOX 1136, 35, 65, 149, 68, CBS_DROPDOWNLIST | CBS_OWNERDRAWFIXED | CBS_AUTOHSCROLL | CBS_SORT | CBS_HASSTRINGS | WS_BORDER | WS_VSCROLL | WS_TABSTOP
+ DEFPUSHBUTTON "Ok", 1, 206, 6, 56, 14, BS_DEFPUSHBUTTON | WS_GROUP | WS_TABSTOP
+ PUSHBUTTON "Annuller", 2, 206, 24, 56, 14, WS_GROUP | WS_TABSTOP
+ PUSHBUTTON "&Indstilling", 1024, 206, 46, 56, 14, WS_GROUP | WS_TABSTOP
+ GROUPBOX "Orientering", 1073, 6, 85, 100, 50, BS_GROUPBOX
+ RADIOBUTTON "Po&rtræt", 1058, 50, 100, 40, 12
+ RADIOBUTTON "&Landskab", 1059, 50, 115, 40, 12
+ ICON "LANDSCAP", 1097, 10, 95, 32, 32
+ ICON "PORTRAIT", 1098, 10, 95, 32, 32
+ GROUPBOX "Papir", 1074, 120, 85, 180, 50, BS_GROUPBOX
+ LTEXT "Størrelse", 1089, 130, 95, 30, 9
+ LTEXT "&Kilde", 1090, 130, 110, 30, 9
+ COMBOBOX 1137, 155, 95, 92, 68, CBS_DROPDOWNLIST | CBS_OWNERDRAWFIXED | CBS_AUTOHSCROLL | CBS_SORT | CBS_HASSTRINGS | WS_BORDER | WS_VSCROLL | WS_TABSTOP
+ COMBOBOX 1138, 155, 110, 92, 68, CBS_DROPDOWNLIST | CBS_OWNERDRAWFIXED | CBS_AUTOHSCROLL | CBS_SORT | CBS_HASSTRINGS | WS_BORDER | WS_VSCROLL | WS_TABSTOP
+}
+
+
+CHOOSE_FONT DIALOG LOADONCALL MOVEABLE DISCARDABLE 36, 24, 264, 134
+STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
+CAPTION "Skriftsnit"
+FONT 8, "Helv"
+{
+ LTEXT "Skriftsnit:", 1088, 6, 6, 40, 9
+ LTEXT "", 1089, 60, 6, 150, 9
+ DEFPUSHBUTTON "Ok", 1, 206, 6, 56, 14, BS_DEFPUSHBUTTON | WS_GROUP | WS_TABSTOP
+ PUSHBUTTON "Annuller", 2, 206, 24, 56, 14, WS_GROUP | WS_TABSTOP
+}
+
+
+CHOOSE_COLOR DIALOG LOADONCALL MOVEABLE DISCARDABLE 36, 24, 264, 200
+STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
+CAPTION "Farve"
+FONT 8, "Helv"
+{
+ LTEXT "&Grundlæggende farver:", 1088, 6, 6, 40, 9
+ LTEXT "&Selvvalgte farver:", 1089, 6, 126, 40, 9
+ LTEXT "&Ensfarvet", 1090, 100, 146, 40, 9
+ LTEXT "&Intensitet:", 1091, 150, 126, 40, 9
+ LTEXT "&Farvemætning:", 1092, 150, 146, 40, 9
+ LTEXT "&Lysstyrke:", 1093, 150, 166, 40, 9
+ LTEXT "&Rød:", 1094, 150, 126, 40, 9
+ LTEXT "&Grøn:", 1095, 150, 146, 40, 9
+ LTEXT "&Blå:", 1096, 150, 166, 40, 9
+ DEFPUSHBUTTON "Ok", 1, 6, 182, 56, 14, BS_DEFPUSHBUTTON | WS_GROUP | WS_TABSTOP
+ PUSHBUTTON "&Tilføj til selvvalgte farver", 1024, 120, 182, 100, 14, WS_GROUP | WS_TABSTOP
+ PUSHBUTTON "&Slet selvvalgte farver", 1025, 6, 164, 56, 14, WS_GROUP | WS_TABSTOP
+ PUSHBUTTON "Annuller", 2, 76, 182, 56, 14, WS_GROUP | WS_TABSTOP
+}
+
+
+FIND_TEXT DIALOG LOADONCALL MOVEABLE DISCARDABLE 36, 24, 264, 84
+STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
+CAPTION "Find"
+FONT 8, "Helv"
+{
+ LTEXT "&Find hvad:", 1088, 6, 6, 40, 9
+ LTEXT "", 1089, 60, 6, 150, 9
+ CHECKBOX "Kun &hele ord", 1040, 20, 30, 50, 12, BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP
+ CHECKBOX "Forskel på store/små &bogstaver", 1041, 20, 50, 50, 12, BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP
+ GROUPBOX "Retning", 1072, 90, 40, 80, 40, BS_GROUPBOX
+ RADIOBUTTON "&Op", 1056, 100, 50, 50, 12
+ RADIOBUTTON "&Ned", 1057, 150, 50, 50, 12
+ DEFPUSHBUTTON "&Find næste", 1, 206, 6, 56, 14, BS_DEFPUSHBUTTON | WS_GROUP | WS_TABSTOP
+ PUSHBUTTON "Annuller", 2, 206, 24, 56, 14, WS_GROUP | WS_TABSTOP
+}
+
+
+REPLACE_TEXT DIALOG LOADONCALL MOVEABLE DISCARDABLE 36, 24, 264, 114
+STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
+CAPTION "Erstat"
+FONT 8, "Helv"
+{
+ LTEXT "&Find hvad:", 1088, 6, 6, 40, 9
+ LTEXT "", 1089, 60, 6, 150, 9
+ LTEXT "&Erstat med:", 1090, 6, 26, 40, 9
+ LTEXT "", 1091, 60, 26, 150, 9
+ CHECKBOX "Kun &hele ord", 1040, 20, 40, 50, 12, BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP
+ CHECKBOX "Forskel på store/små &bogstaver", 1041, 20, 60, 50, 12, BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP
+ DEFPUSHBUTTON "&Find næste", 1, 206, 6, 56, 14, BS_DEFPUSHBUTTON | WS_GROUP | WS_TABSTOP
+ PUSHBUTTON "&Erstat", 1024, 206, 24, 56, 14, WS_GROUP | WS_TABSTOP
+ PUSHBUTTON "Erstat &alle", 1025, 206, 44, 56, 14, WS_GROUP | WS_TABSTOP
+ PUSHBUTTON "Afbryd", 2, 206, 64, 56, 14, WS_GROUP | WS_TABSTOP
+}
diff --git a/rc/sysres_Fi.rc b/rc/sysres_Fi.rc
new file mode 100644
index 00000000000..9a9f7a239d9
--- /dev/null
+++ b/rc/sysres_Fi.rc
@@ -0,0 +1,200 @@
+SYSMENU MENU LOADONCALL MOVEABLE DISCARDABLE
+{
+ MENUITEM "&Palauta", 61728
+ MENUITEM "Sii&rrä", 61456
+ MENUITEM "&Muuta kokoa", 61440
+ MENUITEM "P&ienennä", 61472
+ MENUITEM "S&uurenna", 61488
+ MENUITEM SEPARATOR
+ MENUITEM "&Sulje\tAlt+F4", 61536
+ MENUITEM SEPARATOR
+ MENUITEM "&Vaihda...\tCtrl+Esc", 61744
+ MENUITEM SEPARATOR
+ MENUITEM "&Tietoja WINEista...", 61761
+}
+
+MSGBOX DIALOG 100, 80, 216, 168
+STYLE DS_SYSMODAL | DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
+BEGIN
+        ICON "", 1088, 8, 20, 16, 16, WS_CHILD | WS_VISIBLE
+        LTEXT "", 100, 32, 4, 176, 48, WS_CHILD | WS_VISIBLE | WS_GROUP
+        PUSHBUTTON "&OK", 1, 16, 56, 40, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP
+        PUSHBUTTON "&Peruuta", 2, 64, 56, 40, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP
+        PUSHBUTTON "&Keskeytä", 3, 112, 56, 40, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP
+        PUSHBUTTON "&Yritä uudelleen", 4, 160, 56, 40, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP
+        PUSHBUTTON "&Hylkää", 5, 208, 56, 40, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP
+        PUSHBUTTON "&Kyllä", 6, 256, 56, 40, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP
+        PUSHBUTTON "&Ei", 7, 304, 56, 40, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP
+END
+
+SHELL_ABOUT_MSGBOX DIALOG LOADONCALL MOVEABLE DISCARDABLE 50, 44, 223, 200
+STYLE DS_LOCALEDIT | DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
+CAPTION "Tietoja: %s"
+FONT 10, "System"
+{
+ DEFPUSHBUTTON "OK", 1, 91, 180, 40, 14
+ CONTROL "", -1, "STATIC", SS_BLACKFRAME | WS_CHILD | WS_VISIBLE | WS_DISABLED, 4, 35, 215, 140
+ LTEXT "Teksti", 100, 11, 40, 200, 130, SS_NOPREFIX | WS_GROUP
+ ICON "", 1088, 195, 10, 18, 20
+}
+
+
+OPEN_FILE DIALOG LOADONCALL MOVEABLE DISCARDABLE 36, 24, 275, 134
+STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
+CAPTION "Avaa"
+FONT 8, "Helv"
+{
+ LTEXT "Tiedosto&nimi:", 1090, 6, 6, 76, 9
+ EDITTEXT 1152, 6, 16, 90, 12, ES_AUTOHSCROLL | ES_OEMCONVERT | WS_BORDER | WS_TABSTOP
+ LISTBOX 1120, 6, 32, 90, 68, LBS_STANDARD | LBS_OWNERDRAWFIXED | LBS_HASSTRINGS | LBS_DISABLENOSCROLL | WS_TABSTOP
+ LTEXT "&Hakemistot:", -1, 110, 6, 92, 9
+ LTEXT "", 1088, 110, 18, 92, 9, SS_NOPREFIX | WS_GROUP
+ LISTBOX 1121, 110, 32, 92, 68, LBS_STANDARD | LBS_OWNERDRAWFIXED | LBS_HASSTRINGS | LBS_DISABLENOSCROLL | WS_TABSTOP
+ LTEXT "&Luettele tiedostot tyypeittäin:", 1089, 6, 104, 90, 9
+ COMBOBOX 1136, 6, 114, 90, 36, CBS_DROPDOWNLIST | CBS_AUTOHSCROLL | WS_BORDER | WS_VSCROLL | WS_TABSTOP
+ LTEXT "&Asemat:", 1091, 110, 104, 92, 9
+ COMBOBOX 1137, 110, 114, 92, 68, CBS_DROPDOWNLIST | CBS_OWNERDRAWFIXED | CBS_AUTOHSCROLL | CBS_SORT | CBS_HASSTRINGS | WS_BORDER | WS_VSCROLL | WS_TABSTOP
+ DEFPUSHBUTTON "Avaa", 1, 208, 6, 56, 14, BS_DEFPUSHBUTTON | WS_GROUP | WS_TABSTOP
+ PUSHBUTTON "Peruuta", 2, 208, 24, 56, 14, WS_GROUP | WS_TABSTOP
+ PUSHBUTTON "&Ohje", 1038, 208, 46, 56, 14, WS_GROUP | WS_TABSTOP
+ CHECKBOX "&Vain luku", 1040, 208, 68, 50, 12, BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP
+}
+
+
+SAVE_FILE DIALOG LOADONCALL MOVEABLE DISCARDABLE 36, 24, 275, 134
+STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
+CAPTION "Tallenna nimellä"
+FONT 8, "Helv"
+{
+ LTEXT "Tiedosto&nimi:", 1090, 6, 6, 76, 9
+ EDITTEXT 1152, 6, 16, 90, 12, ES_AUTOHSCROLL | ES_OEMCONVERT | WS_BORDER | WS_TABSTOP
+ LISTBOX 1120, 6, 32, 90, 68, LBS_STANDARD | LBS_OWNERDRAWFIXED | LBS_HASSTRINGS | LBS_DISABLENOSCROLL | WS_TABSTOP
+ LTEXT "&Hakemistot:", -1, 110, 6, 92, 9
+ LTEXT "", 1088, 110, 18, 92, 9, SS_NOPREFIX | WS_GROUP
+ LISTBOX 1121, 110, 32, 92, 68, LBS_STANDARD | LBS_OWNERDRAWFIXED | LBS_HASSTRINGS | LBS_DISABLENOSCROLL | WS_TABSTOP
+ LTEXT "Tallenna tiedosto &muodossa:", 1089, 6, 104, 90, 9
+ COMBOBOX 1136, 6, 114, 90, 36, CBS_DROPDOWNLIST | CBS_AUTOHSCROLL | WS_BORDER | WS_VSCROLL | WS_TABSTOP
+ LTEXT "&Asemat:", 1091, 110, 104, 92, 9
+ COMBOBOX 1137, 110, 114, 92, 68, CBS_DROPDOWNLIST | CBS_OWNERDRAWFIXED | CBS_AUTOHSCROLL | CBS_SORT | CBS_HASSTRINGS | WS_BORDER | WS_VSCROLL | WS_TABSTOP
+ DEFPUSHBUTTON "Tallenna", 1, 208, 6, 56, 14, BS_DEFPUSHBUTTON | WS_GROUP | WS_TABSTOP
+ PUSHBUTTON "Peruuta", 2, 208, 24, 56, 14, WS_GROUP | WS_TABSTOP
+ PUSHBUTTON "&Ohje", 1038, 208, 46, 56, 14, WS_GROUP | WS_TABSTOP
+ CHECKBOX "&Vain luku", 1040, 208, 68, 50, 12, BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP
+}
+
+
+PRINT DIALOG LOADONCALL MOVEABLE DISCARDABLE 36, 24, 264, 134
+STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
+CAPTION "Tulosta"
+FONT 8, "Helv"
+{
+ LTEXT "Kirjoitin:", 1088, 6, 6, 40, 9
+ LTEXT "", 1089, 60, 6, 150, 9
+ GROUPBOX "Tulostusalue", 1072, 6, 30, 160, 65, BS_GROUPBOX
+ RADIOBUTTON "&Kaikki", 1056, 16, 45, 60, 12
+ RADIOBUTTON "&Valinta", 1057, 16, 60, 60, 12
+ RADIOBUTTON "&Sivut", 1058, 16, 75, 60, 12
+ DEFPUSHBUTTON "Tulosta", 1, 206, 6, 56, 14, BS_DEFPUSHBUTTON | WS_GROUP | WS_TABSTOP
+ PUSHBUTTON "Peruuta", 2, 206, 24, 56, 14, WS_GROUP | WS_TABSTOP
+ PUSHBUTTON "&Asetukset", 1024, 206, 46, 56, 14, WS_GROUP | WS_TABSTOP
+ LTEXT "&Mistä:", 1090, 60, 80, 30, 9
+ LTEXT "Mi&hin:", 1091, 120, 80, 30, 9
+ LTEXT "&Tulostustarkkuus:", 1092, 6, 100, 76, 9
+ COMBOBOX 1136, 80, 100, 92, 68, CBS_DROPDOWNLIST | CBS_OWNERDRAWFIXED | CBS_AUTOHSCROLL | CBS_SORT | CBS_HASSTRINGS | WS_BORDER | WS_VSCROLL | WS_TABSTOP
+ CHECKBOX "Tulosta t&iedostoon", 1040, 20, 100, 50, 12, BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP
+ CHECKBOX "Tiivistetty", 1041, 160, 100, 50, 12, BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP
+}
+
+
+PRINT_SETUP DIALOG LOADONCALL MOVEABLE DISCARDABLE 36, 24, 264, 134
+STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
+CAPTION "Kirjoittimen asetukset"
+FONT 8, "Helv"
+{
+ GROUPBOX "Kirjoitin", 1072, 6, 10, 180, 65, BS_GROUPBOX
+ RADIOBUTTON "O&letuskirjoitin", 1056, 16, 20, 80, 12
+ LTEXT "[ei valittu]", 1088, 35, 35, 120, 9
+ RADIOBUTTON "&Erityinen kirjoitin", 1057, 16, 50, 80, 12
+ COMBOBOX 1136, 35, 65, 149, 68, CBS_DROPDOWNLIST | CBS_OWNERDRAWFIXED | CBS_AUTOHSCROLL | CBS_SORT | CBS_HASSTRINGS | WS_BORDER | WS_VSCROLL | WS_TABSTOP
+ DEFPUSHBUTTON "OK", 1, 206, 6, 56, 14, BS_DEFPUSHBUTTON | WS_GROUP | WS_TABSTOP
+ PUSHBUTTON "Peruuta", 2, 206, 24, 56, 14, WS_GROUP | WS_TABSTOP
+ PUSHBUTTON "&Asetukset...", 1024, 206, 46, 56, 14, WS_GROUP | WS_TABSTOP
+ GROUPBOX "Suunta", 1073, 6, 85, 100, 50, BS_GROUPBOX
+ RADIOBUTTON "&Pysty", 1058, 50, 100, 40, 12
+ RADIOBUTTON "&Vaaka", 1059, 50, 115, 40, 12
+ ICON "LANDSCAP", 1097, 10, 95, 32, 32
+ ICON "PORTRAIT", 1098, 10, 95, 32, 32
+ GROUPBOX "Paperi", 1074, 120, 85, 180, 50, BS_GROUPBOX
+ LTEXT "&Koko:", 1089, 130, 95, 30, 9
+ LTEXT "Lä&hde:", 1090, 130, 110, 30, 9
+ COMBOBOX 1137, 155, 95, 92, 68, CBS_DROPDOWNLIST | CBS_OWNERDRAWFIXED | CBS_AUTOHSCROLL | CBS_SORT | CBS_HASSTRINGS | WS_BORDER | WS_VSCROLL | WS_TABSTOP
+ COMBOBOX 1138, 155, 110, 92, 68, CBS_DROPDOWNLIST | CBS_OWNERDRAWFIXED | CBS_AUTOHSCROLL | CBS_SORT | CBS_HASSTRINGS | WS_BORDER | WS_VSCROLL | WS_TABSTOP
+}
+
+
+CHOOSE_FONT DIALOG LOADONCALL MOVEABLE DISCARDABLE 36, 24, 264, 134
+STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
+CAPTION "Fontit"
+FONT 8, "Helv"
+{
+ LTEXT "Fontti:", 1088, 6, 6, 40, 9
+ LTEXT "", 1089, 60, 6, 150, 9
+ DEFPUSHBUTTON "OK", 1, 206, 6, 56, 14, BS_DEFPUSHBUTTON | WS_GROUP | WS_TABSTOP
+ PUSHBUTTON "Peruuta", 2, 206, 24, 56, 14, WS_GROUP | WS_TABSTOP
+}
+
+
+CHOOSE_COLOR DIALOG LOADONCALL MOVEABLE DISCARDABLE 36, 24, 264, 200
+STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
+CAPTION "Väri"
+FONT 8, "Helv"
+{
+ LTEXT "Pe&rusvärit:", 1088, 6, 6, 40, 9
+ LTEXT "&Muokatut värit:", 1089, 6, 126, 40, 9
+ LTEXT "Väri|&Tasainen", 1090, 100, 146, 40, 9
+ LTEXT "&Sävy:", 1091, 150, 126, 40, 9
+ LTEXT "&Kyll:", 1092, 150, 146, 40, 9
+ LTEXT "K&irkk:", 1093, 150, 166, 40, 9
+ LTEXT "&Pun:", 1094, 150, 126, 40, 9
+ LTEXT "&Vihr:", 1095, 150, 146, 40, 9
+ LTEXT "Si&n:", 1096, 150, 166, 40, 9
+ DEFPUSHBUTTON "OK", 1, 6, 182, 56, 14, BS_DEFPUSHBUTTON | WS_GROUP | WS_TABSTOP
+ PUSHBUTTON "&Lisää väri", 1024, 120, 182, 100, 14, WS_GROUP | WS_TABSTOP
+ PUSHBUTTON "Pois&ta väri", 1025, 6, 164, 56, 14, WS_GROUP | WS_TABSTOP
+ PUSHBUTTON "S&ulje", 2, 76, 182, 56, 14, WS_GROUP | WS_TABSTOP
+}
+
+
+FIND_TEXT DIALOG LOADONCALL MOVEABLE DISCARDABLE 36, 24, 264, 84
+STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
+CAPTION "Etsi"
+FONT 8, "Helv"
+{
+ LTEXT "&Etsittävä:", 1088, 6, 6, 40, 9
+ LTEXT "", 1089, 60, 6, 150, 9
+ CHECKBOX "&Koko sana", 1040, 20, 30, 50, 12, BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP
+ CHECKBOX "Kirjaink&oko", 1041, 20, 50, 50, 12, BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP
+ GROUPBOX "Suunta", 1072, 90, 40, 80, 40, BS_GROUPBOX
+ RADIOBUTTON "&Ylös", 1056, 100, 50, 50, 12
+ RADIOBUTTON "&Alas", 1057, 150, 50, 50, 12
+ DEFPUSHBUTTON "Etsi &seuraava", 1, 206, 6, 56, 14, BS_DEFPUSHBUTTON | WS_GROUP | WS_TABSTOP
+ PUSHBUTTON "Peruuta", 2, 206, 24, 56, 14, WS_GROUP | WS_TABSTOP
+}
+
+
+REPLACE_TEXT DIALOG LOADONCALL MOVEABLE DISCARDABLE 36, 24, 264, 114
+STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
+CAPTION "Korvaa"
+FONT 8, "Helv"
+{
+ LTEXT "&Etsittävä:", 1088, 6, 6, 40, 9
+ LTEXT "", 1089, 60, 6, 150, 9
+ LTEXT "Ko&rvattava:", 1090, 6, 26, 40, 9
+ LTEXT "", 1091, 60, 26, 150, 9
+ CHECKBOX "&Koko sana", 1040, 20, 40, 50, 12, BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP
+ CHECKBOX "Kirjaink&oko", 1041, 20, 60, 50, 12, BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP
+ DEFPUSHBUTTON "Etsi &seuraava", 1, 206, 6, 56, 14, BS_DEFPUSHBUTTON | WS_GROUP | WS_TABSTOP
+ PUSHBUTTON "Korv&aa", 1024, 206, 24, 56, 14, WS_GROUP | WS_TABSTOP
+ PUSHBUTTON "Korvaa ka&ikki", 1025, 206, 44, 56, 14, WS_GROUP | WS_TABSTOP
+ PUSHBUTTON "S&ulje", 2, 206, 64, 56, 14, WS_GROUP | WS_TABSTOP
+}
diff --git a/rc/sysres_Fr.rc b/rc/sysres_Fr.rc
new file mode 100644
index 00000000000..723ea2dd919
--- /dev/null
+++ b/rc/sysres_Fr.rc
@@ -0,0 +1,201 @@
+
+SYSMENU MENU LOADONCALL MOVEABLE DISCARDABLE
+{
+ MENUITEM "&Restauration", 61728
+ MENUITEM "&Déplacement", 61456
+ MENUITEM "Di&mension", 61440
+ MENUITEM "Réduct&ion", 61472
+ MENUITEM "&Agrandissement", 61488
+ MENUITEM SEPARATOR
+ MENUITEM "&Fermeture\tAlt-F4", 61536
+ MENUITEM SEPARATOR
+ MENUITEM "&Basculer vers ...\tCtrl-Echap", 61744
+ MENUITEM SEPARATOR
+ MENUITEM "A propos de &Wine ...", 61761
+}
+
+MSGBOX DIALOG 100, 80, 216, 168
+STYLE DS_SYSMODAL | DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
+BEGIN
+        ICON "", 1088, 8, 20, 16, 16, WS_CHILD | WS_VISIBLE
+        LTEXT "", 100, 32, 4, 176, 48, WS_CHILD | WS_VISIBLE | WS_GROUP
+        PUSHBUTTON "&Ok", 1, 16, 56, 40, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP
+        PUSHBUTTON "&Annuler", 2, 64, 56, 40, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP
+        PUSHBUTTON "&Annuler", 3, 112, 56, 40, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP
+        PUSHBUTTON "&Répéter", 4, 160, 56, 40, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP
+        PUSHBUTTON "&Ignorer", 5, 208, 56, 40, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP
+        PUSHBUTTON "&Oui", 6, 256, 56, 40, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP
+        PUSHBUTTON "&Non", 7, 304, 56, 40, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP
+END
+
+SHELL_ABOUT_MSGBOX DIALOG LOADONCALL MOVEABLE DISCARDABLE 50, 44, 213, 179
+STYLE DS_LOCALEDIT | DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
+CAPTION "A propos de %s"
+FONT 10, "System"
+{
+ DEFPUSHBUTTON "OK", 1, 86, 160, 40, 14
+ CONTROL "", -1, "STATIC", SS_BLACKFRAME | WS_CHILD | WS_VISIBLE | WS_DISABLED, 4, 35, 205, 120
+ LTEXT "Text", 100, 11, 40, 190, 110, SS_NOPREFIX | WS_GROUP
+ ICON "", 1088, 185, 10, 18, 20
+}
+
+
+OPEN_FILE DIALOG LOADONCALL MOVEABLE DISCARDABLE 36, 24, 275, 134
+STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
+CAPTION "Ouvrir"
+FONT 8, "Helv"
+{
+ LTEXT "&Nom de fichier:", 1090, 6, 6, 76, 9
+ EDITTEXT 1152, 6, 16, 90, 12, ES_AUTOHSCROLL | ES_OEMCONVERT | WS_BORDER | WS_TABSTOP
+ LISTBOX 1120, 6, 32, 90, 68, LBS_STANDARD | LBS_OWNERDRAWFIXED | LBS_HASSTRINGS | LBS_DISABLENOSCROLL | WS_TABSTOP
+ LTEXT "&Répertoires", -1, 110, 6, 92, 9
+ LTEXT "", 1088, 110, 18, 92, 9, SS_NOPREFIX | WS_GROUP
+ LISTBOX 1121, 110, 32, 92, 68, LBS_STANDARD | LBS_OWNERDRAWFIXED | LBS_HASSTRINGS | LBS_DISABLENOSCROLL | WS_TABSTOP
+ LTEXT "Liste des fichiers de &type:", 1089, 6, 104, 90, 9
+ COMBOBOX 1136, 6, 114, 90, 36, CBS_DROPDOWNLIST | CBS_AUTOHSCROLL | WS_BORDER | WS_VSCROLL | WS_TABSTOP
+ LTEXT "&Lecteurs:", 1091, 110, 104, 92, 9
+ COMBOBOX 1137, 110, 114, 92, 68, CBS_DROPDOWNLIST | CBS_OWNERDRAWFIXED | CBS_AUTOHSCROLL | CBS_SORT | CBS_HASSTRINGS | WS_BORDER | WS_VSCROLL | WS_TABSTOP
+ DEFPUSHBUTTON "OK", 1, 208, 6, 56, 14, BS_DEFPUSHBUTTON | WS_GROUP | WS_TABSTOP
+ PUSHBUTTON "Annuler", 2, 208, 24, 56, 14, WS_GROUP | WS_TABSTOP
+ PUSHBUTTON "&Aide", 1038, 208, 46, 56, 14, WS_GROUP | WS_TABSTOP
+ CHECKBOX "Lecture seule", 1040, 208, 68, 50, 12, BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP
+}
+
+
+SAVE_FILE DIALOG LOADONCALL MOVEABLE DISCARDABLE 36, 24, 275, 134
+STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
+CAPTION "Enregistrer sous ..."
+FONT 8, "Helv"
+{
+ LTEXT "&Nom de fichier:", 1090, 6, 6, 76, 9
+ EDITTEXT 1152, 6, 16, 90, 12, ES_AUTOHSCROLL | ES_OEMCONVERT | WS_BORDER | WS_TABSTOP
+ LISTBOX 1120, 6, 32, 90, 68, LBS_STANDARD | LBS_OWNERDRAWFIXED | LBS_HASSTRINGS | LBS_DISABLENOSCROLL | WS_TABSTOP
+ LTEXT "&Répertoires:", -1, 110, 6, 92, 9
+ LTEXT "", 1088, 110, 18, 92, 9, SS_NOPREFIX | WS_GROUP
+ LISTBOX 1121, 110, 32, 92, 68, LBS_STANDARD | LBS_OWNERDRAWFIXED | LBS_HASSTRINGS | LBS_DISABLENOSCROLL | WS_TABSTOP
+ LTEXT "Liste des fichiers de &type:", 1089, 6, 104, 90, 9
+ COMBOBOX 1136, 6, 114, 90, 36, CBS_DROPDOWNLIST | CBS_AUTOHSCROLL | WS_BORDER | WS_VSCROLL | WS_TABSTOP
+ LTEXT "&Lecteurs:", 1091, 110, 104, 92, 9
+ COMBOBOX 1137, 110, 114, 92, 68, CBS_DROPDOWNLIST | CBS_OWNERDRAWFIXED | CBS_AUTOHSCROLL | CBS_SORT | CBS_HASSTRINGS | WS_BORDER | WS_VSCROLL | WS_TABSTOP
+ DEFPUSHBUTTON "OK", 1, 208, 6, 56, 14, BS_DEFPUSHBUTTON | WS_GROUP | WS_TABSTOP
+ PUSHBUTTON "Annuler", 2, 208, 24, 56, 14, WS_GROUP | WS_TABSTOP
+ PUSHBUTTON "&Aide", 1038, 208, 46, 56, 14, WS_GROUP | WS_TABSTOP
+ CHECKBOX "Lecture seule", 1040, 208, 68, 50, 12, BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP
+}
+
+
+PRINT DIALOG LOADONCALL MOVEABLE DISCARDABLE 36, 24, 264, 134
+STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
+CAPTION "Imprimer"
+FONT 8, "Helv"
+{
+ LTEXT "Imprimante:", 1088, 6, 6, 40, 9
+ LTEXT "", 1089, 60, 6, 150, 9
+ GROUPBOX "Etendue", 1072, 6, 30, 160, 65, BS_GROUPBOX
+ RADIOBUTTON "&Tout", 1056, 16, 45, 60, 12
+ RADIOBUTTON "&Sélection", 1057, 16, 60, 60, 12
+ RADIOBUTTON "&Pages", 1058, 16, 75, 60, 12
+ DEFPUSHBUTTON "OK", 1, 206, 6, 56, 14, BS_DEFPUSHBUTTON | WS_GROUP | WS_TABSTOP
+ PUSHBUTTON "Annuler", 2, 206, 24, 56, 14, WS_GROUP | WS_TABSTOP
+ PUSHBUTTON "&Configurer...", 1024, 206, 46, 56, 14, WS_GROUP | WS_TABSTOP
+ LTEXT "&De:", 1090, 60, 80, 30, 9
+ LTEXT "&A:", 1091, 120, 80, 30, 9
+ LTEXT "&Qualité d'impression:", 1092, 6, 100, 76, 9
+ COMBOBOX 1136, 80, 100, 92, 68, CBS_DROPDOWNLIST | CBS_OWNERDRAWFIXED | CBS_AUTOHSCROLL | CBS_SORT | CBS_HASSTRINGS | WS_BORDER | WS_VSCROLL | WS_TABSTOP
+ CHECKBOX "&Fichier d'impression", 1040, 20, 100, 50, 12, BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP
+ CHECKBOX "Copies t&riées", 1041, 160, 100, 50, 12, BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP
+}
+
+
+PRINT_SETUP DIALOG LOADONCALL MOVEABLE DISCARDABLE 36, 24, 264, 134
+STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
+CAPTION "Configuration de l'impression"
+FONT 8, "Helv"
+{
+ GROUPBOX "Imprimante", 1072, 6, 10, 180, 65, BS_GROUPBOX
+ RADIOBUTTON "&Imprimante par défaut", 1056, 16, 20, 80, 12
+ LTEXT "[aucune]", 1088, 35, 35, 120, 9
+ RADIOBUTTON "Imprimante &spécifique", 1057, 16, 50, 80, 12
+ COMBOBOX 1136, 35, 65, 149, 68, CBS_DROPDOWNLIST | CBS_OWNERDRAWFIXED | CBS_AUTOHSCROLL | CBS_SORT | CBS_HASSTRINGS | WS_BORDER | WS_VSCROLL | WS_TABSTOP
+ DEFPUSHBUTTON "OK", 1, 206, 6, 56, 14, BS_DEFPUSHBUTTON | WS_GROUP | WS_TABSTOP
+ PUSHBUTTON "Annuler", 2, 206, 24, 56, 14, WS_GROUP | WS_TABSTOP
+ PUSHBUTTON "&Options...", 1024, 206, 46, 56, 14, WS_GROUP | WS_TABSTOP
+ GROUPBOX "Orientation", 1073, 6, 85, 100, 50, BS_GROUPBOX
+ RADIOBUTTON "&Portrait", 1058, 50, 100, 40, 12
+ RADIOBUTTON "Paysag&e", 1059, 50, 115, 40, 12
+ ICON "LANDSCAP", 1097, 10, 95, 32, 32
+ ICON "PORTRAIT", 1098, 10, 95, 32, 32
+ GROUPBOX "Papier", 1074, 120, 85, 180, 50, BS_GROUPBOX
+ LTEXT "&Taille :", 1089, 130, 95, 30, 9
+ LTEXT "&Ali&mentation :", 1090, 130, 110, 30, 9
+ COMBOBOX 1137, 155, 95, 92, 68, CBS_DROPDOWNLIST | CBS_OWNERDRAWFIXED | CBS_AUTOHSCROLL | CBS_SORT | CBS_HASSTRINGS | WS_BORDER | WS_VSCROLL | WS_TABSTOP
+ COMBOBOX 1138, 155, 110, 92, 68, CBS_DROPDOWNLIST | CBS_OWNERDRAWFIXED | CBS_AUTOHSCROLL | CBS_SORT | CBS_HASSTRINGS | WS_BORDER | WS_VSCROLL | WS_TABSTOP
+}
+
+
+CHOOSE_FONT DIALOG LOADONCALL MOVEABLE DISCARDABLE 36, 24, 264, 134
+STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
+CAPTION "Polices"
+FONT 8, "Helv"
+{
+ LTEXT "&Police:", 1088, 6, 6, 40, 9
+ LTEXT "", 1089, 60, 6, 150, 9
+ DEFPUSHBUTTON "OK", 1, 206, 6, 56, 14, BS_DEFPUSHBUTTON | WS_GROUP | WS_TABSTOP
+ PUSHBUTTON "Annuler", 2, 206, 24, 56, 14, WS_GROUP | WS_TABSTOP
+}
+
+
+CHOOSE_COLOR DIALOG LOADONCALL MOVEABLE DISCARDABLE 36, 24, 264, 200
+STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
+CAPTION "Couleurs"
+FONT 8, "Helv"
+{
+ LTEXT "Couleurs de &base:", 1088, 6, 6, 40, 9
+ LTEXT "%Couleurs personnalisées:", 1089, 6, 126, 40, 9
+ LTEXT "Couleur|&Uni", 1090, 100, 146, 40, 9
+ LTEXT "&Couleur:", 1091, 150, 126, 40, 9
+ LTEXT "&Sat. :", 1092, 150, 146, 40, 9
+ LTEXT "&Lum. :", 1093, 150, 166, 40, 9
+ LTEXT "&Rouge:", 1094, 150, 126, 40, 9
+ LTEXT "&Vert:", 1095, 150, 146, 40, 9
+ LTEXT "&Bleu:", 1096, 150, 166, 40, 9
+ DEFPUSHBUTTON "OK", 1, 6, 182, 56, 14, BS_DEFPUSHBUTTON | WS_GROUP | WS_TABSTOP
+ PUSHBUTTON "&Ajouter la couleur", 1024, 120, 182, 100, 14, WS_GROUP | WS_TABSTOP
+ PUSHBUTTON "&Supprimer la couleur", 1025, 6, 164, 56, 14, WS_GROUP | WS_TABSTOP
+ PUSHBUTTON "Annuler", 2, 76, 182, 56, 14, WS_GROUP | WS_TABSTOP
+}
+
+
+FIND_TEXT DIALOG LOADONCALL MOVEABLE DISCARDABLE 36, 24, 264, 84
+STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
+CAPTION "Rechercher"
+FONT 8, "Helv"
+{
+ LTEXT "&Rechercher:", 1088, 6, 6, 40, 9
+ LTEXT "", 1089, 60, 6, 150, 9
+ CHECKBOX "M&ot seulement", 1040, 20, 30, 50, 12, BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP
+ CHECKBOX "Respect des &majuscules/minuscules", 1041, 20, 50, 50, 12, BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP
+ GROUPBOX "Direction", 1072, 90, 40, 80, 40, BS_GROUPBOX
+ RADIOBUTTON "&Haut", 1056, 100, 50, 50, 12
+ RADIOBUTTON "&Bas", 1057, 150, 50, 50, 12
+ DEFPUSHBUTTON "&Poursuivre", 1, 206, 6, 56, 14, BS_DEFPUSHBUTTON | WS_GROUP | WS_TABSTOP
+ PUSHBUTTON "Annuler", 2, 206, 24, 56, 14, WS_GROUP | WS_TABSTOP
+}
+
+
+REPLACE_TEXT DIALOG LOADONCALL MOVEABLE DISCARDABLE 36, 24, 264, 114
+STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
+CAPTION "Remplacer"
+FONT 8, "Helv"
+{
+ LTEXT "&Rechercher:", 1088, 6, 6, 40, 9
+ LTEXT "", 1089, 60, 6, 150, 9
+ LTEXT "R&emplacer par:", 1090, 6, 26, 40, 9
+ LTEXT "", 1091, 60, 26, 150, 9
+ CHECKBOX "M&ot seulement", 1040, 20, 40, 50, 12, BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP
+ CHECKBOX "Respect des &majuscules/minuscules", 1041, 20, 60, 50, 12, BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP
+ DEFPUSHBUTTON "&Poursuivre", 1, 206, 6, 56, 14, BS_DEFPUSHBUTTON | WS_GROUP | WS_TABSTOP
+ PUSHBUTTON "Rempla&cer", 1024, 206, 24, 56, 14, WS_GROUP | WS_TABSTOP
+ PUSHBUTTON "Remplacer &tout", 1025, 206, 44, 56, 14, WS_GROUP | WS_TABSTOP
+ PUSHBUTTON "&Fermer", 2, 206, 64, 56, 14, WS_GROUP | WS_TABSTOP
+}
diff --git a/rc/winerc.c b/rc/winerc.c
index 14b0c85a54d..afdd89e8a39 100644
--- a/rc/winerc.c
+++ b/rc/winerc.c
@@ -31,6 +31,9 @@ gen_res* g_start;
 FILE *header,*code;
 char hname[256],sname[256];
 
+int transform_binary_file(void);
+int yyparse(void);
+
 int main(int argc,char *argv[])
 {  
 	extern int yydebug;
@@ -88,6 +91,7 @@ int transform_binary_file()
 		fprintf(code,"%3d,",c);
 	}
 	fprintf(code,"\n0}\nint _Aplication_resources_size=%d;\n",i);
+	return 0;
 }
 
 /* SunOS' memcpy is wrong for overlapping arrays */
@@ -592,19 +596,22 @@ void create_output(gen_res* top)
     fprintf( code, "  0\n};\n" );
 }
 
-void make_font()
+gen_res* make_font(gen_res* res)
 {
 	fprintf(stderr,"Fonts not supported\n");
+	return NULL;
 }
 
-void make_raw()
+gen_res* make_raw(gen_res* res)
 {
 	fprintf(stderr,"RCData not supported\n");
+	return NULL;
 }
 
-void int_to_raw()
+gen_res* int_to_raw(int i,gen_res* res)
 {
 	fprintf(stderr,"IntToRaw not supported\n");
+	return NULL;
 }
 
 /* translate "Hello,\\tworld!\\10" to "Hello,\tworld!\n" */
diff --git a/toolkit/Imakefile b/toolkit/Imakefile
deleted file mode 100644
index 28bf583c61d..00000000000
--- a/toolkit/Imakefile
+++ /dev/null
@@ -1,18 +0,0 @@
-#include "../Wine.tmpl"
-
-MODULE = toolkit
-
-SRCS = \
-	arch.c \
-	heap.c \
-	sup.c \
-	winmain.c
-
-OBJS = $(SRCS:.c=.o)
-
-WineRelocatableTarget($(MODULE),,$(OBJS))
-DependTarget()
-
-includes::
-
-install::
diff --git a/toolkit/Makefile.in b/toolkit/Makefile.in
index d09cb1193b1..73f87464f81 100644
--- a/toolkit/Makefile.in
+++ b/toolkit/Makefile.in
@@ -1,14 +1,27 @@
 TOPSRC = @top_srcdir@
+X_LIBS = @X_LIBS@
+XLIB   = @X_PRE_LIBS@ -lXext -lX11 @X_EXTRA_LIBS@
 MODULE = toolkit
 
 C_SRCS = \
+	atom.c \
 	arch.c \
 	heap.c \
+	miscstubs.c \
 	sup.c \
 	winmain.c
 
 all: $(MODULE).o
 
+hello: hello.o ../winelib.a
+	gcc -g -o hello hello.o ../winelib.a -lm $(X_LIBS) -lXpm $(XLIB)
+
+hello2: hello2.o ../winelib.a
+	gcc -g -o hello2 hello2.o ../winelib.a -lm $(X_LIBS) -lXpm $(XLIB)
+
 @MAKE_RULES@
 
+clean::
+	$(RM) hello hello2
+
 ### Dependencies:
diff --git a/toolkit/atom.c b/toolkit/atom.c
new file mode 100644
index 00000000000..26ae4457630
--- /dev/null
+++ b/toolkit/atom.c
@@ -0,0 +1,340 @@
+/*
+ * Atom table functions
+ *
+ * Copyright 1993, 1994, 1995 Alexandre Julliard
+ */
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <ctype.h>
+
+#include "windows.h"
+
+#ifdef CONFIG_IPC
+#include "dde_atom.h"
+#include "options.h"
+#endif
+
+#define MIN_STR_ATOM              0xc000
+
+typedef struct
+{
+  WORD  refCount;
+  BYTE  length;
+  char* str;
+} ATOMDATA;
+
+typedef struct
+{
+  void* next;
+  ATOMDATA a2h[16];
+} ATOMtoHANDLEtable;
+
+static ATOMtoHANDLEtable* GlobalAtomTable = NULL;
+static ATOMtoHANDLEtable*  LocalAtomTable = NULL;
+
+
+/***********************************************************************
+ *           ATOM_Init
+ *
+ * Global table initialisation.
+ */
+BOOL ATOM_Init(void)
+{
+  return TRUE;
+}
+
+
+/***********************************************************************
+ *           ATOM_AddAtom
+ */
+static ATOM ATOM_AddAtom( ATOMtoHANDLEtable** tableptr, SEGPTR name )
+{
+    ATOMDATA* FirstUnused;
+    ATOM FirstUnusedIndex;
+    ATOM Index;
+    ATOMtoHANDLEtable* table;
+    int i,len;
+    char *str;
+
+    /* Check for integer atom */
+
+    if (!HIWORD(name)) return (ATOM)LOWORD(name);
+    str = (char*)name;
+    if (str[0] == '#') return atoi( &str[1] );
+
+    if ((len = strlen( str )) > 255) len = 255;
+    table = *tableptr;
+    FirstUnused = NULL;
+    FirstUnusedIndex = 0;
+    Index = MIN_STR_ATOM;
+    while (table)
+    {
+      for(i=0; i<16; i++, Index++)
+      {
+	if (!table->a2h[i].refCount)
+	{
+	  FirstUnused=&table->a2h[i];
+	  FirstUnusedIndex=Index;
+	}
+	else if ((table->a2h[i].length == len) && 
+		 (!strncasecmp( table->a2h[i].str, str, len )))
+	{
+	    table->a2h[i].refCount++;
+	    return Index;
+	}
+      }
+      tableptr = (ATOMtoHANDLEtable**)&table->next;
+      table = table->next;
+    }
+    if(!FirstUnused)
+    {
+      *tableptr = malloc(sizeof(ATOMtoHANDLEtable));
+      (*tableptr)->next = NULL;
+      for(i=0; i<16; i++)
+      {
+	(*tableptr)->a2h[i].str = NULL;
+	(*tableptr)->a2h[i].refCount = 0;
+      }
+      FirstUnused = (*tableptr)->a2h;
+      FirstUnusedIndex = Index;
+    }
+    if((FirstUnused->str = malloc(len+1)))
+    {
+      memcpy( FirstUnused->str, str, len );
+      FirstUnused->str[len] = 0;
+    }
+    else
+      return 0;
+    FirstUnused->refCount = 1;
+    FirstUnused->length = len;
+    return FirstUnusedIndex;
+}
+
+
+/***********************************************************************
+ *           ATOM_DeleteAtom
+ */
+static ATOM ATOM_DeleteAtom( ATOMtoHANDLEtable** tableptr, ATOM atom )
+{    
+    ATOMtoHANDLEtable* table;
+    int i;
+    ATOM Index;
+
+    if (atom < MIN_STR_ATOM) return 0;  /* Integer atom */
+
+    Index = MIN_STR_ATOM;
+    table = *tableptr;
+    while (table)
+    {
+      if(atom-Index < 16)
+      {
+	i=atom-Index;
+
+	/* Delete atom */
+	if (--table->a2h[i].refCount == 0)
+	{
+	  free(table->a2h[i].str);
+	  table->a2h[i].str=NULL;
+	}    
+	return 0;
+      }
+      else
+      {
+	Index+=16;
+	table = table->next;
+      }
+    }
+    return atom;
+}
+
+
+/***********************************************************************
+ *           ATOM_FindAtom
+ */
+static ATOM ATOM_FindAtom( ATOMtoHANDLEtable** tableptr, SEGPTR name )
+{
+    ATOM Index;
+    ATOMtoHANDLEtable* table;
+    int i,len;
+    char *str;
+
+    /* Check for integer atom */
+
+    if (!HIWORD(name)) return (ATOM)LOWORD(name);
+    str = (char*)name;
+    if (str[0] == '#') return atoi( &str[1] );
+
+    if ((len = strlen( str )) > 255) len = 255;
+    table=*tableptr;
+    Index=MIN_STR_ATOM;
+    while (table)
+    {
+      for(i=0; i<16; i++, Index++)
+      {
+	if ((table->a2h[i].refCount != 0) &&
+	    (table->a2h[i].length == len) && 
+	    (!strncasecmp( table->a2h[i].str, str, len )))
+	  return Index;
+      }
+      table=table->next;
+    }
+    return 0;
+}
+
+
+/***********************************************************************
+ *           ATOM_GetAtomName
+ */
+static WORD ATOM_GetAtomName( ATOMtoHANDLEtable** tableptr, ATOM atom,
+                              LPSTR buffer, short count )
+{
+    ATOMtoHANDLEtable* table;
+    ATOM Index;
+    char * strPtr=NULL;
+    int i,len=0;
+    char text[8];
+    
+    if (!count) return 0;
+    if (atom < MIN_STR_ATOM)
+    {
+	sprintf( text, "#%d", atom );
+	len = strlen(text);
+	strPtr = text;
+    }
+    else
+    {
+      Index = MIN_STR_ATOM;
+      table = *tableptr;
+      while (table)
+      {
+	if(atom-Index < 16)
+	{
+	  i=atom-Index;
+	  
+	  if (table->a2h[i].refCount == 0)
+	    table=NULL;
+	  else
+	  {
+	    len = table->a2h[i].length;
+	    strPtr = table->a2h[i].str;
+	  }
+	  break;
+	}
+	else
+	{
+	  Index+=16;
+	  table = table->next;
+	}
+      }
+      if(!table)return 0;
+    }
+    if (len >= count) len = count-1;
+    memcpy( buffer, strPtr, len );
+    buffer[len] = '\0';
+    return len;
+}
+
+
+/***********************************************************************
+ *           InitAtomTable   (KERNEL.68)
+ */
+WORD InitAtomTable( WORD entries )
+{
+    return entries;
+}
+
+
+/***********************************************************************
+ *           GetAtomHandle   (KERNEL.73)
+ */
+HANDLE GetAtomHandle( ATOM atom )
+{
+  fprintf(stderr,"JBP: GetAtomHandle() called (obsolete).\n");
+  return 0;
+}
+
+
+/***********************************************************************
+ *           AddAtom   (KERNEL.70)
+ */
+ATOM AddAtom( SEGPTR str )
+{
+    return ATOM_AddAtom( &LocalAtomTable, (SEGPTR)str );
+}
+
+
+/***********************************************************************
+ *           DeleteAtom   (KERNEL.71)
+ */
+ATOM DeleteAtom( ATOM atom )
+{
+    return ATOM_DeleteAtom( &LocalAtomTable, atom );
+}
+
+
+/***********************************************************************
+ *           FindAtom   (KERNEL.69)
+ */
+ATOM FindAtom( SEGPTR str )
+{
+    return ATOM_FindAtom( &LocalAtomTable, str );
+}
+
+
+/***********************************************************************
+ *           GetAtomName   (KERNEL.72)
+ */
+WORD GetAtomName( ATOM atom, LPSTR buffer, short count )
+{
+    return ATOM_GetAtomName( &LocalAtomTable, atom, buffer, count );
+}
+
+
+/***********************************************************************
+ *           GlobalAddAtom   (USER.268)
+ */
+ATOM GlobalAddAtom( SEGPTR str )
+{
+#ifdef CONFIG_IPC
+    if (Options.ipc) return DDE_GlobalAddAtom( str );
+#endif
+    return ATOM_AddAtom( &GlobalAtomTable, str );
+}
+
+
+/***********************************************************************
+ *           GlobalDeleteAtom   (USER.269)
+ */
+ATOM GlobalDeleteAtom( ATOM atom )
+{
+#ifdef CONFIG_IPC
+    if (Options.ipc) return DDE_GlobalDeleteAtom( atom );
+#endif
+    return ATOM_DeleteAtom( &GlobalAtomTable, atom );
+}
+
+
+/***********************************************************************
+ *           GlobalFindAtom   (USER.270)
+ */
+ATOM GlobalFindAtom( SEGPTR str )
+{
+#ifdef CONFIG_IPC
+    if (Options.ipc) return DDE_GlobalFindAtom( str );
+#endif
+    return ATOM_FindAtom( &GlobalAtomTable, str );
+}
+
+
+/***********************************************************************
+ *           GlobalGetAtomName   (USER.271)
+ */
+WORD GlobalGetAtomName( ATOM atom, LPSTR buffer, short count )
+{
+#ifdef CONFIG_IPC
+    if (Options.ipc) return DDE_GlobalGetAtomName( atom, buffer, count );
+#endif
+    return ATOM_GetAtomName( &GlobalAtomTable, atom, buffer, count );
+}
diff --git a/toolkit/heap.c b/toolkit/heap.c
index c1584c78cae..370f7c6a6f2 100644
--- a/toolkit/heap.c
+++ b/toolkit/heap.c
@@ -6,11 +6,14 @@
  * All the memory management is being done by the libc malloc and friends.
  */
 
-#ifndef __STDC__
+/* #ifndef __STDC__ */
 #include <malloc.h>
-#endif
+#include <string.h>
+/* #endif */
 #include "windows.h"
 
+#ifdef WINELIB16
+
 /* Controls the blocks per handle table */
 #define MAXBLOCKS 1024
 
@@ -203,3 +206,111 @@ DWORD int GlobalHandle(WORD selector)
 }
 
 #endif
+
+#else /* WINELIB16 */
+HANDLE LocalAlloc (WORD flags, WORD bytes)
+{
+    HANDLE m;
+
+    if (flags & LMEM_WINE_ALIGN)
+	m = memalign (4, bytes);
+    else
+	m = malloc (bytes);
+    if (m){
+	if (flags & LMEM_ZEROINIT)
+	    bzero (m, bytes);
+    }
+    return m;
+}
+
+WORD LocalCompact (WORD min_free)
+{
+    return min_free;
+}
+
+WORD LocalFlags (HANDLE hMem)
+{
+    return 0;
+}
+
+HANDLE LocalFree (HANDLE hMem)
+{
+    free(hMem);
+    return 0;
+}
+
+BOOL LocalInit (HANDLE segment, WORD start, WORD end)
+{
+    return TRUE;
+}
+
+LPVOID LocalLock (HANDLE hMem)
+{
+    return hMem;
+}
+
+HANDLE LocalReAlloc (HANDLE hMem, WORD flags, WORD bytes)
+{
+    realloc(hMem, bytes);
+    return hMem;
+}
+
+WORD LocalSize (HANDLE hMem)
+{
+    /* Not implemented yet */
+  return 0;
+}
+
+
+BOOL LocalUnLock (HANDLE hMem)
+{
+    return 0;
+}
+
+HANDLE GlobalAlloc (WORD flags, DWORD size)
+{
+    return LocalAlloc (flags, size);
+}
+
+HANDLE GlobalFree (HANDLE hMem)
+{
+    return LocalFree (hMem);
+}
+
+LPVOID GlobalLock (HGLOBAL hMem)
+{
+    return LocalLock (hMem);
+}
+
+BOOL GlobalUnlock (HANDLE hMem)
+{
+    return LocalUnLock (hMem);
+}
+
+WORD GlobalFlags (HANDLE hMem)
+{
+    return LocalFlags (hMem);
+}
+
+DWORD GlobalSize (HANDLE hMem)
+{
+    return LocalSize (hMem);
+}
+
+DWORD GlobalCompact(DWORD desired)
+{
+    if (desired)
+	return desired;
+    else
+	return 0x01000000;	/* Should check the available core. */
+}
+
+HANDLE GlobalReAlloc(HANDLE hMem, DWORD new_size, WORD flags)
+{
+    if (!(flags & GMEM_MODIFY))
+      return LocalReAlloc (hMem, new_size, flags);
+    else
+      return hMem;
+}
+
+#endif
diff --git a/toolkit/hello.c b/toolkit/hello.c
index 604f18bf76b..4285ac132b6 100644
--- a/toolkit/hello.c
+++ b/toolkit/hello.c
@@ -5,7 +5,7 @@ void Write (HDC dc, int x, int y, char *s)
     TextOut (dc, x, y, s, strlen (s));
 }
 
-LONG WndProc (HANDLE wnd, UINT msg, WORD w, LONG l)
+LRESULT WndProc (HWND wnd, UINT msg, WPARAM w, LPARAM l)
 {
     static short xChar, yChar;
     HDC dc;
@@ -53,7 +53,7 @@ int PASCAL WinMain (HANDLE inst, HANDLE prev, LPSTR cmdline, int show)
 	class.hCursor    = LoadCursor (0, IDC_ARROW);
 	class.hbrBackground = GetStockObject (WHITE_BRUSH);
 	class.lpszMenuName = NULL;
-	class.lpszClassName = "class";
+	class.lpszClassName = (SEGPTR)"class";
     }
     if (!RegisterClass (&class))
 	return FALSE;
@@ -68,4 +68,5 @@ int PASCAL WinMain (HANDLE inst, HANDLE prev, LPSTR cmdline, int show)
 	TranslateMessage (&msg);
 	DispatchMessage (&msg);
     }
+    return 0;
 }
diff --git a/toolkit/hello2.c b/toolkit/hello2.c
new file mode 100644
index 00000000000..589f1319d92
--- /dev/null
+++ b/toolkit/hello2.c
@@ -0,0 +1,9 @@
+#include "windows.h"
+
+int PASCAL WinMain (HANDLE inst, HANDLE prev, LPSTR cmdline, int show)
+{
+  return MessageBox((HWND)0,
+		    (LPSTR)"Hello, hello!",
+		    (LPSTR)"Hello Wine Application",
+		    (MB_OK | MB_ICONEXCLAMATION));
+}
diff --git a/toolkit/miscstubs.c b/toolkit/miscstubs.c
new file mode 100644
index 00000000000..5db9016bb0d
--- /dev/null
+++ b/toolkit/miscstubs.c
@@ -0,0 +1,324 @@
+/*
+ * JBP (Jim Peterson <jspeter@birch.ee.vt.edu>): Lots of stubs needed for
+ *      libwine.a.
+ */
+
+#include <stdarg.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include "dde_mem.h"
+#include "windows.h"
+#include "global.h"
+#include "debug.h"
+
+int CallTo32_LargeStack( int (*func)(), int nbargs, ...)
+{
+  va_list arglist;
+  int i,a[32];
+
+  va_start(arglist,nbargs);
+
+  for(i=0; i<nbargs; i++) a[i]=va_arg(arglist,int);
+
+  switch(nbargs) /* Ewww... Icky.  But what can I do? */
+  {
+  case 5: return func(a[0],a[1],a[2],a[3],a[4]);
+  case 6: return func(a[0],a[1],a[2],a[3],a[4],a[5]);
+  case 8: return func(a[0],a[1],a[2],a[3],a[4],a[5],a[6],a[7]);
+  case 10: return func(a[0],a[1],a[2],a[3],a[4],a[5],a[6],
+                a[7],a[8],a[9]);
+  case 11: return func(a[0],a[1],a[2],a[3],a[4],a[5],a[6],
+                a[7],a[8],a[9],a[10]);
+  case 14: return func(a[0],a[1],a[2],a[3],a[4],a[5],a[6],
+                a[7],a[8],a[9],a[10],a[11],a[12],a[13]);
+  default: fprintf(stderr,"JBP: CallTo32_LargeStack called with unsupported "
+                          "number of arguments (%d).  Ignored.\n",nbargs);
+           return 0;
+  }
+}
+
+WORD CallTo16_word_ ( FARPROC func, WORD arg ) { return func(arg); }
+
+/* typedef void* ATOM; */
+/* ATOM GlobalAddAtom(char *n) */
+/* { */
+/*   return strdup(n); */
+/* } */
+/* GlobalDeleteAtom(ATOM n) */
+/* { */
+/*   free(n); */
+/* } */
+/* GlobalFindAtom(char*n) */
+/* { */
+/*   fprintf(stderr,"JBP: GlobalFindAtom() ignored.\n"); */
+/*   return 0; */
+/* } */
+/* char *GlobalGetAtomName(ATOM a) */
+/* { */
+/*   return a; */
+/* } */
+
+void GlobalFreeAll(HANDLE owner)
+{
+  fprintf(stderr,"JBP: GlobalFreeAll() ignored.\n");
+}
+
+SEGPTR WIN16_GlobalLock(HGLOBAL h)
+{
+  return (SEGPTR)h;
+}
+
+
+
+#if 0
+typedef WORD* HLOCAL;
+
+int IsValidHLOCAL(HLOCAL handle)
+{
+  return *(handle-1) + *(handle-2) == 0; /* Valid HLOCAL's sum to 0 */
+}
+
+/***********************************************************************
+ *           LOCAL_Free
+ *
+ */
+HLOCAL LOCAL_Free( WORD ds, HLOCAL handle )
+{
+  if (!IsValidHLOCAL(handle)) return handle; /* couldn't free it */
+  free(handle-2);
+  return 0;
+}
+
+
+/***********************************************************************
+ *           LOCAL_Alloc
+ *
+ */
+HLOCAL LOCAL_Alloc( WORD ds, WORD flags, WORD size )
+{
+  HLOCAL handle;
+    
+  handle = malloc(size + 2*sizeof(WORD));
+  handle += 2;
+  *(handle-2) = size;
+  *(handle-1) = -size;
+  return handle;
+}
+
+
+/***********************************************************************
+ *           LOCAL_ReAlloc
+ *
+ */
+HLOCAL LOCAL_ReAlloc( WORD ds, HLOCAL handle, WORD size, WORD flags )
+{
+  HLOCAL newhandle;
+
+  if(!IsValidHLOCAL(handle))return 0;
+  newhandle = realloc(handle-2, size+2*sizeof(WORD));
+  newhandle += 2;
+  *(newhandle-2) = size;
+  *(newhandle-1) = -size;
+  return newhandle;
+}
+
+
+/***********************************************************************
+ *           LOCAL_Lock
+ */
+WORD LOCAL_Lock( WORD ds, HLOCAL handle )
+{
+  if(!IsValidHLOCAL(handle))return 0;
+  return handle;
+}
+
+
+/***********************************************************************
+ *           LOCAL_Unlock
+ */
+BOOL LOCAL_Unlock( WORD ds, HLOCAL handle )
+{
+  return TRUE;
+}
+
+
+/***********************************************************************
+ *           LOCAL_Size
+ *
+ */
+WORD LOCAL_Size( WORD ds, HLOCAL handle )
+{
+  return *(handle-2);
+}
+#endif
+
+HLOCAL LOCAL_Free( WORD ds, HLOCAL handle )
+{
+  fprintf(stderr,"JBP: LOCAL_*() ignored.\n");
+  return 0;
+}
+
+HLOCAL LOCAL_Alloc( WORD ds, WORD flags, WORD size )
+{
+  fprintf(stderr,"JBP: LOCAL_*() ignored.\n");
+  return 0;
+}
+
+HLOCAL LOCAL_ReAlloc( WORD ds, HLOCAL handle, WORD size, WORD flags )
+{
+  fprintf(stderr,"JBP: LOCAL_*() ignored.\n");
+  return 0;
+}
+
+WORD LOCAL_Lock( WORD ds, HLOCAL handle )
+{
+  fprintf(stderr,"JBP: LOCAL_*() ignored.\n");
+  return 0;
+}
+
+BOOL LOCAL_Unlock( WORD ds, HLOCAL handle )
+{
+  fprintf(stderr,"JBP: LOCAL_*() ignored.\n");
+  return 1;
+}
+
+WORD LOCAL_Size( WORD ds, HLOCAL handle )
+{
+  fprintf(stderr,"JBP: LOCAL_*() ignored.\n");
+  return 0;
+}
+
+void FarSetOwner(HANDLE a, WORD b)
+{
+  fprintf(stderr,"JBP: FarSetOwner() ignored.\n");
+}
+
+#define GLOBAL_MAX_ALLOC_SIZE 0x00ff0000  /* Largest allocation is 16M - 64K */
+
+HGLOBAL GLOBAL_Alloc( WORD flags, DWORD size, HGLOBAL hOwner,
+                      BOOL isCode, BOOL is32Bit, BOOL isReadOnly )
+{
+    void *ptr;
+    HGLOBAL handle;
+    SHMDATA shmdata;
+
+    dprintf_global( stddeb, "GLOBAL_Alloc: %ld flags=%04x\n", size, flags );
+
+      /* Fixup the size */
+
+    if (size >= GLOBAL_MAX_ALLOC_SIZE - 0x1f) return 0;
+    if (size == 0) size = 0x20;
+    else size = (size + 0x1f) & ~0x1f;
+
+      /* Allocate the linear memory */
+
+#ifdef CONFIG_IPC
+    if ((flags & GMEM_DDESHARE) && Options.ipc)
+        ptr = DDE_malloc(flags, size, &shmdata);
+    else 
+#endif  /* CONFIG_IPC */
+	ptr = malloc( size );
+    if (!ptr) return 0;
+
+      /* Allocate the selector(s) */
+
+    handle = GLOBAL_CreateBlock( flags, ptr, size, hOwner,
+				isCode, is32Bit, isReadOnly, &shmdata);
+    if (!handle)
+    {
+        free( ptr );
+        return 0;
+    }
+
+    if (flags & GMEM_ZEROINIT) memset( ptr, 0, size );
+    return handle;
+}
+
+HGLOBAL GLOBAL_CreateBlock( WORD flags, void *ptr, DWORD size,
+			    HGLOBAL hOwner, BOOL isCode,
+			    BOOL is32Bit, BOOL isReadOnly,
+			    SHMDATA *shmdata)
+{
+  fprintf(stderr,"JBP: GLOBAL_CreateBlock() faked.\n");
+  return ptr;
+}
+
+BOOL GLOBAL_FreeBlock( HGLOBAL handle )
+{
+  fprintf(stderr,"JBP: GLOBAL_FreeBlock() ignored.\n");
+  return 1;
+}
+
+DWORD GlobalHandle(WORD a)
+{
+  fprintf(stderr,"JBP: GlobalHandle() ignored.\n");
+  return 0;
+}
+
+void *RELAY32_GetEntryPoint(char *dll_name, char *item, int hint)
+{
+  fprintf(stderr,"JBP: RELAY32_GetEntryPoint() ignored.\n");
+  return NULL;
+}
+
+extern LRESULT AboutDlgProc(HWND,UINT,WPARAM,LPARAM);
+extern LRESULT ButtonWndProc(HWND,UINT,WPARAM,LPARAM);
+extern LRESULT CARET_Callback(HWND,UINT,WPARAM,LPARAM);
+extern LRESULT ColorDlgProc(HWND,UINT,WPARAM,LPARAM);
+extern LRESULT ComboBoxWndProc(HWND,UINT,WPARAM,LPARAM);
+extern LRESULT ComboLBoxWndProc(HWND,UINT,WPARAM,LPARAM);
+extern LRESULT DesktopWndProc(HWND,UINT,WPARAM,LPARAM);
+extern LRESULT EditWndProc(HWND,UINT,WPARAM,LPARAM);
+extern LRESULT FileOpenDlgProc(HWND,UINT,WPARAM,LPARAM);
+extern LRESULT FileSaveDlgProc(HWND,UINT,WPARAM,LPARAM);
+extern LRESULT FindTextDlgProc(HWND,UINT,WPARAM,LPARAM);
+extern LRESULT ListBoxWndProc(HWND,UINT,WPARAM,LPARAM);
+extern LRESULT MDIClientWndProc(HWND,UINT,WPARAM,LPARAM);
+extern LRESULT PopupMenuWndProc(HWND,UINT,WPARAM,LPARAM);
+extern LRESULT PrintDlgProc(HWND,UINT,WPARAM,LPARAM);
+extern LRESULT PrintSetupDlgProc(HWND,UINT,WPARAM,LPARAM);
+extern LRESULT ReplaceTextDlgProc(HWND,UINT,WPARAM,LPARAM);
+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;
+}
+
+/***********************************************************************
+ *           GetWndProcEntry16 (not a Windows API function)
+ *
+ * Return an entry point from the WINPROCS dll.
+ */
+WNDPROC GetWndProcEntry16( char *name )
+{
+#define MAP_STR_TO_PROC(str,proc) if(!strcmp(name,str))return proc
+  MAP_STR_TO_PROC("AboutDlgProc",AboutDlgProc);
+  MAP_STR_TO_PROC("ButtonWndProc",ButtonWndProc);
+  MAP_STR_TO_PROC("CARET_Callback",CARET_Callback);
+  MAP_STR_TO_PROC("ColorDlgProc",ColorDlgProc);
+  MAP_STR_TO_PROC("ComboBoxWndProc",ComboBoxWndProc);
+  MAP_STR_TO_PROC("ComboLBoxWndProc",ComboLBoxWndProc);
+  MAP_STR_TO_PROC("DefDlgProc",DefDlgProc);
+  MAP_STR_TO_PROC("DesktopWndProc",DesktopWndProc);
+  MAP_STR_TO_PROC("EditWndProc",EditWndProc);
+  MAP_STR_TO_PROC("FileOpenDlgProc",FileOpenDlgProc);
+  MAP_STR_TO_PROC("FileSaveDlgProc",FileSaveDlgProc);
+  MAP_STR_TO_PROC("FindTextDlgProc",FindTextDlgProc);
+  MAP_STR_TO_PROC("ListBoxWndProc",ListBoxWndProc);
+  MAP_STR_TO_PROC("MDIClientWndProc",MDIClientWndProc);
+  MAP_STR_TO_PROC("PopupMenuWndProc",PopupMenuWndProc);
+  MAP_STR_TO_PROC("PrintDlgProc",PrintDlgProc);
+  MAP_STR_TO_PROC("PrintSetupDlgProc",PrintSetupDlgProc);
+  MAP_STR_TO_PROC("ReplaceTextDlgProc",ReplaceTextDlgProc);
+  MAP_STR_TO_PROC("ScrollBarWndProc",ScrollBarWndProc);
+  MAP_STR_TO_PROC("StaticWndProc",StaticWndProc);
+  MAP_STR_TO_PROC("SystemMessageBoxProc",SystemMessageBoxProc);
+  MAP_STR_TO_PROC("TASK_Reschedule",TASK_Reschedule);
+  return ErrorProc;
+}
diff --git a/toolkit/sup.c b/toolkit/sup.c
index 9a66e74ae35..421a0974098 100644
--- a/toolkit/sup.c
+++ b/toolkit/sup.c
@@ -1,12 +1,13 @@
 #include <stdio.h>
+#include <unistd.h>
 #include "windows.h"
 #include "callback.h"
 #include "wine.h"
 #include "arch.h"
 #include "neexe.h"
 
-LONG CallWindowProc (WNDPROC func, HWND hwnd, WORD message,
-		     WORD wParam, LONG lParam)
+LRESULT CallWindowProc (WNDPROC func, HWND hwnd, UINT message,
+			WPARAM wParam, LPARAM lParam)
 {
     return (*func)(hwnd, message, wParam, lParam);
 }
@@ -91,4 +92,5 @@ int load_nameinfo (int fd, struct resource_nameinfo_s *nameinfo)
     LOADSHORT (id);
     LOADSHORT (handle);
     LOADSHORT (usage);
+    return 0;
 }
diff --git a/toolkit/winmain.c b/toolkit/winmain.c
index f5bd2272e26..1982f6bf987 100644
--- a/toolkit/winmain.c
+++ b/toolkit/winmain.c
@@ -4,33 +4,27 @@
 #include "windows.h"
 #include "wine.h"
 
-_WinMain (int argc, char *argv [])
+extern int MAIN_Init(void);
+extern BOOL WIDGETS_Init(void);
+extern BOOL WIN_CreateDesktopWindow(void);
+extern int PASCAL WinMain(HINSTANCE,HINSTANCE,LPSTR,int);
+extern void TASK_Reschedule(void);
+extern int USER_InitApp(HINSTANCE);
+
+int _WinMain (int argc, char *argv [])
 {
-    int ret_val;
-    char filename [4096], *module_name, *resource_file;
-    HANDLE hTaskMain, hInstance;
-    
-	/* The libwine resource DLL is temporarily disabled */
-#if 0
-    if ((module_name = strchr (argv [0], '/')) == NULL){
-	printf ("Error: Can't determine base name for resource loading\n");
-	return 0;
-    }
+  HINSTANCE hInstance;
 
-    resource_file = malloc (strlen (++module_name) + 5);
-    strcpy (resource_file, module_name);
-    strcat (resource_file, ".dll");
+  if(!MAIN_Init()) return 0; /* JBP: Needed for DosDrives[] structure, etc. */
+  hInstance = WinExec( *argv, SW_SHOWNORMAL );
+  TASK_Reschedule();
+  USER_InitApp( hInstance );
+  /* Perform global initialisations that need a task context */
+  if (!WIDGETS_Init()) return -1;
+  if (!WIN_CreateDesktopWindow()) return -1;
 
-    hInstance = LoadImage (resource_file, 0, 0);
-#endif
-    
-    USER_InitApp( hInstance );
-#if 0
-    hTaskMain = CreateNewTask (1); /* This is not correct */
-#endif
-    ret_val = WinMain (hInstance,	/* hInstance */
-		       0,		/* hPrevInstance */
-		       "",		/* lpszCmdParam */
-		       SW_NORMAL); 	/* nCmdShow */
-    return ret_val;
+  return WinMain (hInstance,    /* hInstance */
+		  0,	        /* hPrevInstance */
+		  "",	        /* lpszCmdParam */
+		  SW_NORMAL);   /* nCmdShow */
 }
diff --git a/tools/Imakefile b/tools/Imakefile
deleted file mode 100644
index e5abd7b3243..00000000000
--- a/tools/Imakefile
+++ /dev/null
@@ -1,15 +0,0 @@
-#include "../Wine.tmpl"
-
-SRCS = build.c
-
-OBJS = $(SRCS:.c=.o)
-
-AllTarget(build)
-
-NormalProgramTarget(build,build.o,$(DEPLIBS),,)
-
-DependTarget()
-
-includes::
-
-install::
diff --git a/tools/build.c b/tools/build.c
index 0221c496dfa..59588755d6b 100644
--- a/tools/build.c
+++ b/tools/build.c
@@ -13,7 +13,7 @@
 #include "neexe.h"
 
 /* ELF symbols do not have an underscore in front */
-#ifdef __ELF__
+#if defined (__ELF__) || defined (__svr4__)
 #define PREFIX
 #else
 #define PREFIX "_"
@@ -539,7 +539,7 @@ static void BuildModule( int max_code_offset, int max_data_offset )
     pModule->magic = NE_SIGNATURE;
     pModule->count = 1;
     pModule->next = 0;
-    pModule->flags = NE_FFLAGS_SINGLEDATA | NE_FFLAGS_LIBMODULE;
+    pModule->flags = NE_FFLAGS_SINGLEDATA | NE_FFLAGS_BUILTIN | NE_FFLAGS_LIBMODULE;
     pModule->dgroup = 2;
     pModule->heap_size = 0xffff;
     pModule->stack_size = 0;
@@ -718,14 +718,13 @@ static void BuildSpec32Files( char *specname )
 
     printf( "/* File generated automatically, do not edit! */\n" );
     printf( "#include <sys/types.h>\n");
-	printf( "#include \"windows.h\"\n");
+    printf( "#include \"windows.h\"\n");
     printf( "#include \"dlls.h\"\n");
     printf( "#include \"pe_image.h\"\n");
     printf( "#include \"winerror.h\"\n");
-	printf( "#include \"relay32.h\"\n");
+    printf( "#include \"relay32.h\"\n");
     printf( "#include \"stddebug.h\"\n");
     printf( "#include \"debug.h\"\n");
-    printf( "\nextern int RELAY32_Unimplemented();\n\n" );
 
     odp = OrdinalDefinitions;
     for (i = 0; i <= Limit; i++, odp++)
@@ -760,8 +759,13 @@ static void BuildSpec32Files( char *specname )
                 if (argno!=argc-1) putchar( ',' );
             }
             printf( ")\n{\n" );
-            printf( "\tdprintf_relay(stddeb,\"Entering %%s.%%s(");
-            for (argno=0;argno<argc;argno++) printf( "%%x ");
+            printf( "\tdprintf_relay(stddeb,\"Call %%s.%%s(");
+            for (argno=0;argno<argc;argno++)
+            {
+                putchar( '%' );
+                putchar( (fdp->arg_types[argno] == 'p') ? 'p' : 'x' );
+                if (argno < argc-1) putchar( ',' );
+            }
             printf( ")\\n\", \"%s\", \"%s\"", UpperDLLName, odp->export_name);
             for(argno=0;argno<argc;argno++) printf( ",%c", 'a'+argno);
             printf( ");\n\t%s(", fdp->internal_name );
@@ -847,7 +851,11 @@ static void BuildSpec16Files( char *specname )
     printf( "\t.data\n" );
     printf( "\t.globl " PREFIX "%s_Data_Start\n", UpperDLLName );
     printf( PREFIX "%s_Data_Start:\n", UpperDLLName );
+#ifdef __svr4__
+    printf( "\t.4byte 0,0,0,0,0,0,0,0\n" );
+#else
     printf( "\t.word 0,0,0,0,0,0,0,0\n" );
+#endif
     data_offset = 16;
     printf( "\t.text\n" );
     printf( "\t.globl " PREFIX "%s_Code_Start\n", UpperDLLName );
@@ -879,7 +887,11 @@ static void BuildSpec16Files( char *specname )
           case TYPE_WORD:
             printf( "/* %s.%d */\n", UpperDLLName, i);
             odp->offset = data_offset;
+#ifdef __svr4__
+            data_offset += 2 * OutputVariableCode( ".4byte", odp);
+#else
             data_offset += 2 * OutputVariableCode( ".word", odp);
+#endif
             break;
 
           case TYPE_LONG:
diff --git a/win32/Makefile.in b/win32/Makefile.in
new file mode 100644
index 00000000000..bfabcb66caa
--- /dev/null
+++ b/win32/Makefile.in
@@ -0,0 +1,18 @@
+TOPSRC = @top_srcdir@
+MODULE = win32
+
+C_SRCS = \
+	code_page.c \
+	environment.c \
+	error.c \
+	file.c \
+	init.c \
+	memory.c \
+	thread.c \
+	time.c
+
+all: $(MODULE).o
+
+@MAKE_RULES@
+
+### Dependencies:
diff --git a/win32/code_page.c b/win32/code_page.c
new file mode 100644
index 00000000000..1338ea4a8df
--- /dev/null
+++ b/win32/code_page.c
@@ -0,0 +1,38 @@
+/*
+ * Win32 kernel functions
+ *
+ * Copyright 1995 Martin von Loewis and Cameron Heide
+ */
+
+#include <stdio.h>
+#include "windows.h"
+#include "winerror.h"
+#include "kernel32.h"
+
+/***********************************************************************
+ *           GetACP               (KERNEL32.148)
+ */
+UINT GetACP(void)
+{
+    return 1252;    /* Windows 3.1 ISO Latin */
+}
+
+/***********************************************************************
+ *           GetCPInfo            (KERNEL32.154)
+ */
+BOOL GetCPInfo(UINT codepage, LPCPINFO cpinfo)
+{
+    cpinfo->MaxCharSize = 1;
+    cpinfo->DefaultChar[0] = '?';
+
+    return 1;
+}
+
+/***********************************************************************
+ *              GetOEMCP                (KERNEL32.248)
+ */
+UINT GetOEMCP(void)
+{
+    return 437;    /* MS-DOS United States */
+}
+
diff --git a/win32/environment.c b/win32/environment.c
new file mode 100644
index 00000000000..a37c57fd3aa
--- /dev/null
+++ b/win32/environment.c
@@ -0,0 +1,26 @@
+/*
+ * Win32 kernel functions
+ *
+ * Copyright 1995 Martin von Loewis and Cameron Heide
+ */
+
+#include <stdio.h>
+#include <string.h>
+#include "windows.h"
+#include "winerror.h"
+#include "kernel32.h"
+#include "task.h"
+
+
+/***********************************************************************
+ *           GetCommandLineA      (KERNEL32.161)
+ */
+LPSTR GetCommandLineA(void)
+{
+    static char buffer[256];
+    PDB *pdb = (PDB *)GlobalLock( GetCurrentPDB() );
+    memcpy( buffer, &pdb->cmdLine[1], pdb->cmdLine[0] );
+    printf("CommandLine = %s\n", buffer );
+    return buffer;
+}
+
diff --git a/win32/error.c b/win32/error.c
new file mode 100644
index 00000000000..5bbe1f885a1
--- /dev/null
+++ b/win32/error.c
@@ -0,0 +1,36 @@
+/*
+ * Win32 kernel functions
+ *
+ * Copyright 1995 Martin von Loewis and Cameron Heide
+ */
+
+#include <stdio.h>
+#include "windows.h"
+#include "winerror.h"
+#include "kernel32.h"
+
+static int WIN32_LastError;
+
+/**********************************************************************
+ *              GetLastError            (KERNEL32.227)
+ */
+DWORD GetLastError(void)
+{
+    return WIN32_LastError;
+}
+
+/**********************************************************************
+ *              SetLastError            (KERNEL32.497)
+ *
+ * This is probably not used by apps too much, but it's useful for
+ * our own internal use.
+ */
+void SetLastError(DWORD error)
+{
+    WIN32_LastError = error;
+}
+
+DWORD ErrnoToLastError(int errno_num)
+{
+    return errno_num;   /* Obviously not finished yet. :-) */
+}
diff --git a/win32/file.c b/win32/file.c
new file mode 100644
index 00000000000..61b4a09ab12
--- /dev/null
+++ b/win32/file.c
@@ -0,0 +1,96 @@
+/*
+ * Win32 kernel functions
+ *
+ * Copyright 1995 Martin von Loewis and Cameron Heide
+ */
+
+#include <errno.h>
+#include <stdio.h>
+#include <unistd.h>
+#include "windows.h"
+#include "winerror.h"
+#include "kernel32.h"
+
+/***********************************************************************
+ *           GetFileType              (KERNEL32.222)
+ *
+ * GetFileType currently only supports stdin, stdout, and stderr, which
+ * are considered to be of type FILE_TYPE_CHAR.
+ */
+DWORD GetFileType(HANDLE hFile)
+{
+    DWORD file_type;
+
+    if(hFile < 3)
+    {
+        file_type = 2;        /* FILE_TYPE_CHAR */
+    }
+    else
+    {
+        file_type = 0;        /* FILE_TYPE_UNKNOWN */
+    }
+
+    return file_type;
+}
+
+/***********************************************************************
+ *           GetStdHandle             (KERNEL32.276)
+ */
+HANDLE GetStdHandle(DWORD nStdHandle)
+{
+        switch(nStdHandle)
+        {
+                case -10/*STD_INPUT_HANDLE*/:return (HANDLE)0;
+                case -11/*STD_OUTPUT_HANDLE*/:return (HANDLE)1;
+                case -12/*STD_ERROR_HANDLE*/:return (HANDLE)2;
+        }
+        return (HANDLE)-1;
+}
+
+/***********************************************************************
+ *              SetFilePointer          (KERNEL32.492)
+ *
+ * Luckily enough, this function maps almost directly into an lseek
+ * call, the exception being the use of 64-bit offsets.
+ */
+DWORD SetFilePointer(HANDLE hFile, LONG distance, LONG *highword,
+                     DWORD method)
+{
+    int rc;
+
+    if(highword != NULL)
+    {
+        if(*highword != 0)
+        {
+            printf("SetFilePointer: 64-bit offsets not yet supported.\n");
+            return -1;
+        }
+    }
+
+    rc = lseek(hFile, distance, method);
+    if(rc == -1)
+        SetLastError(ErrnoToLastError(errno));
+    return rc;
+}
+
+/***********************************************************************
+ *             WriteFile               (KERNEL32.578)
+ *
+ * WriteFile isn't very useful at this point since only standard
+ * handles are permitted, but it lets us see runtime errors at least.
+ */
+BOOL WriteFile(HANDLE hFile, LPVOID lpBuffer, DWORD numberOfBytesToWrite,
+              LPDWORD numberOfBytesWritten, LPOVERLAPPED lpOverlapped)
+{
+    int written;
+
+    if(hFile < 3)
+    {
+        written = write(hFile, lpBuffer, numberOfBytesToWrite);
+        if(numberOfBytesWritten)
+            *numberOfBytesWritten = written;
+    }
+
+    return 1;
+}
+
diff --git a/win32/init.c b/win32/init.c
new file mode 100644
index 00000000000..8000edc7027
--- /dev/null
+++ b/win32/init.c
@@ -0,0 +1,44 @@
+/*
+ * Win32 kernel functions
+ *
+ * Copyright 1995 Martin von Loewis and Cameron Heide
+ */
+
+#include <string.h>
+#include <stdio.h>
+#include <unistd.h>
+#include "windows.h"
+#include "winerror.h"
+#include "kernel32.h"
+
+int WIN32_LastError;
+
+/***********************************************************************
+ *              GetModuleFileNameA      (KERNEL32.235)
+ */
+DWORD GetModuleFileNameA(HMODULE hModule, LPSTR lpFilename, DWORD nSize)
+{
+    strcpy(lpFilename, "c:\\dummy");
+    return 8;
+}
+
+/***********************************************************************
+ *              GetStartupInfoA         (KERNEL32.273)
+ */
+VOID GetStartupInfoA(LPSTARTUPINFO lpStartupInfo)
+{
+    lpStartupInfo->cb = sizeof(STARTUPINFO);
+    lpStartupInfo->lpReserved = NULL;
+    lpStartupInfo->lpDesktop = "Desktop";
+    lpStartupInfo->lpTitle = "Title";
+
+    lpStartupInfo->lpReserved2 = NULL; /* must be NULL for VC runtime */
+    lpStartupInfo->hStdInput = 0;
+    lpStartupInfo->hStdOutput = 1;
+    lpStartupInfo->hStdError = 2;
+}
+
+int KERN32_Init(void)
+{
+    return 1;
+}
diff --git a/win32/memory.c b/win32/memory.c
new file mode 100644
index 00000000000..a6545108ecf
--- /dev/null
+++ b/win32/memory.c
@@ -0,0 +1,46 @@
+/*
+ * Win32 kernel functions
+ *
+ * Copyright 1995 Martin von Loewis and Cameron Heide
+ */
+
+#include <malloc.h>
+#include <stdio.h>
+#include <string.h>
+#include <sys/time.h>
+#include <unistd.h>
+#include "windows.h"
+#include "winerror.h"
+#include "kernel32.h"
+
+/***********************************************************************
+ *           VirtualAlloc             (KERNEL32.548)
+ */
+LPVOID VirtualAlloc(LPVOID lpvAddress, DWORD cbSize,
+                   DWORD fdwAllocationType, DWORD fdwProtect)
+{
+    char *ptr;
+
+    printf("VirtualAlloc: size = %ld, address=%p\n", cbSize, lpvAddress);
+    ptr = malloc(cbSize + 65536);
+    if(ptr)
+    {
+        /* Round it up to the next 64K boundary and zero it.
+         */
+        ptr = (void *)(((unsigned long)ptr & 0xFFFF0000L) + 0x00010000L);
+        memset(ptr, 0, cbSize);
+    }
+    printf("VirtualAlloc: got pointer %p\n", ptr);
+    return ptr;
+}
+
+/***********************************************************************
+ *           VirtualFree               (KERNEL32.550)
+ */
+BOOL VirtualFree(LPVOID lpvAddress, DWORD cbSize, DWORD fdwFreeType)
+{
+    if(lpvAddress)
+        free(lpvAddress);
+    return 1;
+}
+
diff --git a/win32/thread.c b/win32/thread.c
new file mode 100644
index 00000000000..e6b9e2cb3e4
--- /dev/null
+++ b/win32/thread.c
@@ -0,0 +1,29 @@
+/*
+ * Win32 kernel functions
+ *
+ * Copyright 1995 Martin von Loewis
+ */
+
+#include <stdio.h>
+#include <unistd.h>
+#include "windows.h"
+#include "winerror.h"
+#include "kernel32.h"
+
+/***********************************************************************
+ *           GetCurrentThreadId   (KERNEL32.200)
+ */
+
+int GetCurrentThreadId(void)
+{
+        return getpid();
+}
+
+/***********************************************************************
+ *           GetThreadContext         (KERNEL32.294)
+ */
+BOOL GetThreadContext(HANDLE hThread, void *lpContext)
+{
+        return FALSE;
+}
+
diff --git a/win32/time.c b/win32/time.c
new file mode 100644
index 00000000000..58f97035ca3
--- /dev/null
+++ b/win32/time.c
@@ -0,0 +1,31 @@
+/*
+ * Win32 kernel functions
+ *
+ * Copyright 1995 Martin von Loewis and Cameron Heide
+ */
+
+#include <string.h>
+#include <time.h>
+#include <unistd.h>
+#include "windows.h"
+#include "winerror.h"
+#include "kernel32.h"
+
+/***********************************************************************
+ *              GetTimeZoneInformation  (KERNEL32.302)
+ */
+DWORD GetTimeZoneInformation(LPTIME_ZONE_INFORMATION tzinfo)
+{
+    time_t gmt, lt;
+
+    memset(tzinfo, 0, sizeof(TIME_ZONE_INFORMATION));
+
+    gmt = time(NULL);
+    lt = mktime(localtime(&gmt));
+    tzinfo->Bias = (gmt - lt) / 60;
+    tzinfo->StandardBias = 0;
+    tzinfo->DaylightBias = -60;
+
+    return TIME_ZONE_ID_UNKNOWN;
+}
+
diff --git a/windows/Imakefile b/windows/Imakefile
deleted file mode 100644
index 54c0f27985f..00000000000
--- a/windows/Imakefile
+++ /dev/null
@@ -1,41 +0,0 @@
-#include "../Wine.tmpl"
-
-MODULE = windows
-
-SRCS = \
-	alias.c \
-	caret.c \
-	class.c \
-	cursor.c \
-	dce.c \
-	defdlg.c \
-	defwnd.c \
-	dialog.c \
-	event.c \
-	focus.c \
-	graphics.c \
-	hook.c \
-	keyboard.c \
-	mapping.c \
-	mdi.c \
-	message.c \
-	msgbox.c \
-	nonclient.c \
-	painting.c \
-	property.c \
-	scroll.c \
-	syscolor.c \
-	sysmetrics.c \
-	timer.c \
-	utility.c \
-	win.c \
-	winpos.c
-
-OBJS = $(SRCS:.c=.o)
-
-WineRelocatableTarget($(MODULE),,$(OBJS))
-DependTarget()
-
-includes::
-
-install::
diff --git a/windows/Makefile.in b/windows/Makefile.in
index 4eef8a0806d..d04102bfd9b 100644
--- a/windows/Makefile.in
+++ b/windows/Makefile.in
@@ -5,7 +5,6 @@ C_SRCS = \
 	alias.c \
 	caret.c \
 	class.c \
-	cursor.c \
 	dce.c \
 	defdlg.c \
 	defwnd.c \
diff --git a/windows/caret.c b/windows/caret.c
index a85a47cee9b..8cf00ca769d 100644
--- a/windows/caret.c
+++ b/windows/caret.c
@@ -2,13 +2,12 @@
  * Caret functions
  *
  * Copyright 1993 David Metcalfe
- *
-static char Copyright[] = "Copyright  David Metcalfe, 1993";
-*/
+ */
 
 #include "windows.h"
 #include "selectors.h"
 #include "alias.h"
+#include "relay32.h"
 #include "stddebug.h"
 /* #define DEBUG_CARET */
 #include "debug.h"
@@ -50,7 +49,7 @@ WORD CARET_Callback(HWND hwnd, WORD msg, WORD timerid, LONG ctime)
     {
 	Caret.on = (Caret.on ? FALSE : TRUE);
 	hdc = GetDC(Caret.hwnd);
-	if (Caret.bitmap == 0 || Caret.bitmap == 1)
+	if (Caret.bitmap == (HBITMAP)0 || Caret.bitmap == (HBITMAP)1)
 	    hBrush = CreateSolidBrush(Caret.color);
 	else
 	    hBrush = CreatePatternBrush(Caret.bitmap);
@@ -80,7 +79,7 @@ static void CARET_HideCaret()
 
     Caret.on = FALSE;
     hdc = GetDC(Caret.hwnd);
-    if (Caret.bitmap == 0 || Caret.bitmap == 1)
+    if (Caret.bitmap == (HBITMAP)0 || Caret.bitmap == (HBITMAP)1)
 	hBrush = CreateSolidBrush(Caret.color);
     else
 	hBrush = CreatePatternBrush(Caret.bitmap);
@@ -126,7 +125,7 @@ void CreateCaret(HWND hwnd, HBITMAP bitmap, short width, short height)
 /*    if (Caret.hwnd)
 	DestroyCaret();
 */
-    if (bitmap && bitmap != 1)
+    if (bitmap && bitmap != (HBITMAP)1)
 	Caret.bitmap = bitmap;
 
     if (width)
@@ -144,7 +143,7 @@ void CreateCaret(HWND hwnd, HBITMAP bitmap, short width, short height)
     Caret.on = FALSE;
     Caret.x = 0;
     Caret.y = 0;
-    if (bitmap == 1)
+    if (bitmap == (HBITMAP)1)
 	Caret.color = GetSysColor(COLOR_GRAYTEXT);
     else
 	Caret.color = GetSysColor(COLOR_WINDOWTEXT);
@@ -156,7 +155,7 @@ void CreateCaret(HWND hwnd, HBITMAP bitmap, short width, short height)
     Caret.timerid = SetSystemTimer( (HWND)0, 0, Caret.timeout,
                                 (FARPROC)GetWndProcEntry16("CARET_Callback"));
 
-    dprintf_caret(stddeb,"CreateCaret: hwnd=%d, timerid=%d\n", 
+    dprintf_caret(stddeb,"CreateCaret: hwnd="NPFMT", timerid=%d\n", 
 		  hwnd, Caret.timerid);
 }
    
diff --git a/windows/class.c b/windows/class.c
index 4ce07ed33c4..f148b38a82d 100644
--- a/windows/class.c
+++ b/windows/class.c
@@ -28,7 +28,7 @@ static HCLASS firstClass = 0;
  * Return a handle and a pointer to the class.
  * 'ptr' can be NULL if the pointer is not needed.
  */
-HCLASS CLASS_FindClassByName( SEGPTR name, WORD hinstance, CLASS **ptr )
+HCLASS CLASS_FindClassByName( SEGPTR name, HINSTANCE hinstance, CLASS **ptr )
 {
     ATOM atom;
     HCLASS class;
@@ -43,7 +43,8 @@ HCLASS CLASS_FindClassByName( SEGPTR name, WORD hinstance, CLASS **ptr )
         classPtr = (CLASS *) USER_HEAP_LIN_ADDR(class);
         if (classPtr->wc.style & CS_GLOBALCLASS) continue;
         if ((classPtr->atomName == atom) && 
-            ((hinstance==0xffff )|| (hinstance == classPtr->wc.hInstance)))
+            ( (hinstance==(HINSTANCE)0xffff) ||
+	      (hinstance == classPtr->wc.hInstance) ) )
         {
             if (ptr) *ptr = classPtr;
             return class;
@@ -92,7 +93,7 @@ ATOM RegisterClass( LPWNDCLASS class )
     HCLASS handle, prevClass;
     int classExtra;
 
-    dprintf_class( stddeb, "RegisterClass: wndproc=%08lx hinst=%04x name='%s' background %04x\n",
+    dprintf_class( stddeb, "RegisterClass: wndproc=%08lx hinst="NPFMT" name='%s' background "NPFMT"\n",
                  (DWORD)class->lpfnWndProc, class->hInstance,
                  HIWORD(class->lpszClassName) ?
                   (char *)PTR_SEG_TO_LIN(class->lpszClassName) : "(int)",
@@ -143,7 +144,7 @@ ATOM RegisterClass( LPWNDCLASS class )
 	HANDLE hname = USER_HEAP_ALLOC( strlen(menuname)+1 );
 	if (hname)
 	{
-	    newClass->wc.lpszMenuName = USER_HEAP_SEG_ADDR( hname );
+	    newClass->wc.lpszMenuName = (SEGPTR)USER_HEAP_SEG_ADDR( hname );
 	    strcpy( USER_HEAP_LIN_ADDR( hname ), menuname );
 	}
     }
@@ -191,7 +192,11 @@ BOOL UnregisterClass( SEGPTR className, HANDLE hinstance )
     if (classPtr->wc.hbrBackground) DeleteObject( classPtr->wc.hbrBackground );
     GlobalDeleteAtom( classPtr->atomName );
     if (HIWORD(classPtr->wc.lpszMenuName))
+#ifdef WINELIB32
+	USER_HEAP_FREE( (HANDLE)classPtr->wc.lpszMenuName );
+#else
 	USER_HEAP_FREE( LOWORD(classPtr->wc.lpszMenuName) );
+#endif
     USER_HEAP_FREE( class );
     return TRUE;
 }
@@ -265,7 +270,7 @@ int GetClassName(HWND hwnd, LPSTR lpClassName, short maxCount)
     CLASS *classPtr;
 
     /* FIXME: We have the find the correct hInstance */
-    dprintf_class(stddeb,"GetClassName(%x,%p,%d)\n",hwnd,lpClassName,maxCount);
+    dprintf_class(stddeb,"GetClassName("NPFMT",%p,%d)\n",hwnd,lpClassName,maxCount);
     if (!(wndPtr = WIN_FindWndPtr(hwnd))) return 0;
     if (!(classPtr = CLASS_FindClassPtr(wndPtr->hClass))) return 0;
     
@@ -280,7 +285,7 @@ BOOL GetClassInfo( HANDLE hInstance, SEGPTR name, LPWNDCLASS lpWndClass )
 {
     CLASS *classPtr;
 
-    dprintf_class( stddeb, "GetClassInfo: hInstance=%04x className=%s\n",
+    dprintf_class( stddeb, "GetClassInfo: hInstance="NPFMT" className=%s\n",
 		   hInstance,
                    HIWORD(name) ? (char *)PTR_SEG_TO_LIN(name) : "(int)" );
 
diff --git a/windows/cursor.c b/windows/cursor.c
deleted file mode 100644
index 9875df132d0..00000000000
--- a/windows/cursor.c
+++ /dev/null
@@ -1,427 +0,0 @@
-/*
- *    WINE
-static char Copyright[] = "Copyright  Martin Ayotte, 1993";
- */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-#include <unistd.h>
-#include <X11/cursorfont.h>
-#include <X11/Xlib.h>
-#include <X11/Xutil.h>
-#include "windows.h"
-#include "win.h"
-#include "gdi.h"
-#include "neexe.h"
-#include "wine.h"
-#include "callback.h"
-#include "cursor.h"
-#include "resource.h"
-#include "stddebug.h"
-#include "debug.h"
-#include "arch.h"
-#include "bitmap.h"
-
-static int ShowCursCount = 0;
-static HCURSOR hActiveCursor;
-static HCURSOR hEmptyCursor = 0;
-RECT	ClipCursorRect;
-
-static struct { 
-   SEGPTR name; HCURSOR cursor; unsigned int shape;
-} system_cursor[] =
-{
-    { IDC_ARROW,    0, XC_top_left_arrow},
-    { IDC_IBEAM,    0, XC_xterm },
-    { IDC_WAIT,     0, XC_watch },
-    { IDC_CROSS,    0, XC_crosshair },
-    { IDC_UPARROW,  0, XC_based_arrow_up },
-    { IDC_SIZE,     0, XC_bottom_right_corner },
-    { IDC_ICON,     0, XC_icon },
-    { IDC_SIZENWSE, 0, XC_fleur },
-    { IDC_SIZENESW, 0, XC_fleur },
-    { IDC_SIZEWE,   0, XC_sb_h_double_arrow },
-    { IDC_SIZENS,   0, XC_sb_v_double_arrow }
-};
-
-#define NB_SYS_CURSORS  (sizeof(system_cursor)/sizeof(system_cursor[0]))
-
-
-/**********************************************************************
- *			LoadCursor [USER.173]
- */
-HCURSOR LoadCursor(HANDLE instance, SEGPTR cursor_name)
-{
-    HCURSOR 	hCursor;
-    HRSRC       hRsrc;
-    HANDLE 	rsc_mem;
-    char        *lpbits;
-    LONG        *lpl,size;
-    CURSORALLOC *lpcur;
-    CURSORDIR   *lpcurdir;
-    CURSORDESCRIP curdesc;
-    POINT       hotspot;
-    int i;
-    dprintf_resource(stddeb,"LoadCursor: instance = %04x, name = %08lx\n",
-	   instance, cursor_name);
-    if (!instance)
-    {
-	for (i = 0; i < NB_SYS_CURSORS; i++)
-	    if (system_cursor[i].name == cursor_name)
-	    {
-	        if (!system_cursor[i].cursor) 
-	        {
-		    hCursor = GlobalAlloc (GMEM_MOVEABLE, sizeof (Cursor));
-		    dprintf_cursor(stddeb,"LoadCursor Alloc hCursor=%X\n", hCursor);
-		    system_cursor[i].cursor = hCursor;
-		    lpcur = (CURSORALLOC *) GlobalLock(hCursor);
-		    lpcur->xcursor = XCreateFontCursor(display, system_cursor[i].shape);
-		    GlobalUnlock(hCursor);
-	        }
-	       	return system_cursor[i].cursor;
-	    }
-	return 0;
-    }
-
-    if (!(hRsrc = FindResource( instance, cursor_name, RT_GROUP_CURSOR )))
-	return 0;
-    rsc_mem = LoadResource(instance, hRsrc );
-    if (rsc_mem == (HANDLE)NULL) {
-        fprintf(stderr,"LoadCursor / Cursor %08lx not Found !\n", cursor_name);
-	return 0;
-    }
-    lpcurdir = (CURSORDIR *)LockResource(rsc_mem);
-    if (lpcurdir == NULL) {
-        FreeResource( rsc_mem );
-	return 0;
-    }
-    curdesc = *(CURSORDESCRIP *)(lpcurdir + 1);  /* CONV_CURDESC ? */
-#if 0
-    dprintf_cursor(stddeb,"LoadCursor / curReserved=%X\n", lpcurdir->cdReserved);
-    dprintf_cursor(stddeb,"LoadCursor / curResourceType=%X\n", lpcurdir->cdType);
-    dprintf_cursor(stddeb,"LoadCursor / curResourceCount=%X\n", lpcurdir->cdCount);
-    dprintf_cursor(stddeb,"LoadCursor / cursor Width=%d\n", 
-		(int)curdesc.Width);
-    dprintf_cursor(stddeb,"LoadCursor / cursor Height=%d\n", 
-		(int)curdesc.Height);
-    dprintf_cursor(stddeb,"LoadCursor / cursor curDIBSize=%lX\n", 
-		(DWORD)curdesc.curDIBSize);
-    dprintf_cursor(stddeb,"LoadCursor / cursor curDIBOffset=%lX\n",
-		(DWORD)curdesc.curDIBOffset);
-#endif
-    FreeResource( rsc_mem );
-    if (!(hRsrc = FindResource( instance,
-                                MAKEINTRESOURCE(curdesc.curDIBOffset), 
-                                RT_CURSOR )))
-	return 0;
-    rsc_mem = LoadResource(instance, hRsrc );
-    if (rsc_mem == (HANDLE)NULL) {
-    	fprintf(stderr,
-		"LoadCursor / Cursor %08lx Bitmap not Found !\n", cursor_name);
-	return 0;
-    }
-    lpl = (LONG *) LockResource(rsc_mem);
-    if (lpl == NULL) {
-        FreeResource( rsc_mem );
-	return 0;
-	}
-    hotspot = *(POINT *) lpl++;  /* CONV_POINT ? */
-    size = CONV_LONG (*lpl);
-#if 0
-    if (!(hdc = GetDC(0))) {
-       FreeResource( rsc_mem );
-       return 0;
-    }
-    if (size == sizeof(BITMAPCOREHEADER)){
-	CONV_BITMAPCOREHEADER (lpl);
-        ((BITMAPINFOHEADER *)lpl)->biHeight /= 2;
-	lpcur->hBitmap = ConvertCoreBitmap( hdc, (BITMAPCOREHEADER *) lpl );
-    } else if (size == sizeof(BITMAPINFOHEADER)){
-	CONV_BITMAPINFO (lpl);
-        ((BITMAPINFOHEADER *)lpl)->biHeight /= 2;
-	lpcur->hBitmap = ConvertInfoBitmap( hdc, (BITMAPINFO *) lpl );
-    } else  {
-      fprintf(stderr,"No bitmap for cursor?\n");
-      lpcur->hBitmap = 0;
-    }
-    ReleaseDC(0,hdc);
-#endif
-    if (size == sizeof(BITMAPCOREHEADER))
-	lpbits = (char *)lpl + sizeof(BITMAPCOREHEADER) + 2*sizeof(RGBTRIPLE);
-    else if (size == sizeof(BITMAPINFOHEADER))
-	lpbits = (char *)lpl + sizeof(BITMAPINFOHEADER) + 2*sizeof(RGBQUAD);
-    else  {
-      fprintf(stderr,"Invalid bitmap in cursor resource\n");
-      FreeResource(rsc_mem);
-      return 0;
-    }
-    /* The height of the cursor is the height of the XOR-Bitmap
-     * plus the height of the AND-Bitmap, so divide it by two.
-     */
-    size = curdesc.Height/2 * ((curdesc.Width+31)/32 * 4);
-#if 0
-    dprintf_cursor(stddeb,"Bitmap:\n");
-    for(i=0;i<2*size;i++)  {
-      dprintf_cursor(stddeb,"%02x ",(unsigned char) lpc[i]);
-      if ((i & 7) == 7) dprintf_cursor(stddeb,"\n");
-    }
-#endif
-    hCursor = CreateCursor(instance, hotspot.x, hotspot.y, 
-			   curdesc.Width, curdesc.Height / 2,
-			   lpbits+size, lpbits);
-    FreeResource( rsc_mem );
-    return hCursor;
-}
-
-
-
-/***********************************************************************
- *           CreateCursorIconIndirect           (USER.408)
- *
- * Returns handle to either an icon or a cursor. Used by CreateCursor
- * and CreateIcon in  Windoze, but will use same in this version.
- */
-HANDLE CreateCursorIconIndirect(HANDLE hInstance, LPCURSORICONINFO lpInfo,
-                                LPSTR lpANDBits, /* bitmap data */
-                                LPSTR lpXORBits /* masking data */)
-{
-        return CreateIcon(hInstance,
-                lpInfo->nWidth, lpInfo->nHeight,
-                lpInfo->byPlanes, lpInfo->byBitsPix,
-                lpANDBits, lpXORBits);
-}
-
-
-/**********************************************************************
- *			CreateCursor [USER.406]
- */
-HCURSOR CreateCursor(HANDLE instance, short nXhotspot, short nYhotspot, 
-	short nWidth, short nHeight, LPSTR lpANDbitPlane, LPSTR lpXORbitPlane)
-{
-    HCURSOR	hCursor;
-    CURSORALLOC *lpcur;
-    int		bpl = (nWidth + 31)/32 * 4;
-    char	*tmpbits = malloc(bpl * nHeight);
-    char	*src, *dst;
-    int		i;
-    XImage	*image;
-    Pixmap	pixshape, pixmask;
-    extern void _XInitImageFuncPtrs( XImage* );
-  
-    XColor bkcolor,fgcolor;
-    Colormap cmap = XDefaultColormap(display,XDefaultScreen(display));
-    
-    dprintf_resource(stddeb, "CreateCursor: inst=%04x nXhotspot=%d  nYhotspot=%d nWidth=%d nHeight=%d\n",  
-       instance, nXhotspot, nYhotspot, nWidth, nHeight);
-    dprintf_resource(stddeb,"CreateCursor: inst=%04x lpANDbitPlane=%p lpXORbitPlane=%p\n",
-	instance, lpANDbitPlane, lpXORbitPlane);
-
-    image = XCreateImage( display, DefaultVisualOfScreen(screen),
-                          1, ZPixmap, 0, tmpbits,
-                          nWidth, nHeight, 32, bpl );
-    if (!image) {
-	free (tmpbits);
-	return 0;
-    }
-    image->byte_order = MSBFirst;
-    image->bitmap_bit_order = MSBFirst;
-    image->bitmap_unit = 16;
-    _XInitImageFuncPtrs(image);
-
-    hCursor = GlobalAlloc(GMEM_MOVEABLE, sizeof(Cursor)); 
-    if (hCursor == (HCURSOR)NULL) {
-	XDestroyImage(image);
-	return 0;
-    }
-    dprintf_cursor(stddeb,"CreateCursor Alloc hCursor=%X\n", hCursor);
-    lpcur = (CURSORALLOC *)GlobalLock(hCursor);
-
-    for(src=lpANDbitPlane, dst=tmpbits+(nHeight-1)*bpl; 
-	dst>=tmpbits; src+=bpl, dst-=bpl)
-        for(i=0; i<bpl; i++) 
-            dst[i] = ~src[i];
-    pixmask = XCreatePixmap(display, DefaultRootWindow(display), 
-			    nWidth, nHeight, 1);
-    CallTo32_LargeStack(XPutImage, 10,
-			display, pixmask, BITMAP_monoGC, image, 
-			0, 0, 0, 0, nWidth, nHeight );
-
-    for(src=lpXORbitPlane, dst=tmpbits+(nHeight-1)*bpl; 
-	dst>=tmpbits; src+=bpl, dst-=bpl)
-        for(i=0; i<bpl; i++) 
-            dst[i] = ~src[i];
-    pixshape = XCreatePixmap(display, DefaultRootWindow(display), 
-			     nWidth, nHeight, 1);
-    CallTo32_LargeStack(XPutImage, 10,
-			display, pixshape, BITMAP_monoGC, image, 
-			0, 0, 0, 0, nWidth, nHeight );
-    XParseColor(display,cmap,"#000000",&fgcolor);
-    XParseColor(display,cmap,"#ffffff",&bkcolor);
-    lpcur->xcursor = XCreatePixmapCursor(display, pixshape, pixmask,
-			                 &fgcolor, &bkcolor, nXhotspot, nYhotspot);
-    XFreePixmap(display, pixshape);
-    XFreePixmap(display, pixmask);
-    GlobalUnlock(hCursor);
-    XDestroyImage(image);
-    return hCursor;
-}
-
-
-
-/**********************************************************************
- *			DestroyCursor [USER.458]
- */
-BOOL DestroyCursor(HCURSOR hCursor)
-{
-    int i;
-    CURSORALLOC	*lpcur;
-    
-    if (hCursor == 0) return FALSE;
-    for (i = 0; i < NB_SYS_CURSORS; i++) {
-	if (system_cursor[i].cursor == hCursor) return TRUE;
-    }
-    lpcur = (CURSORALLOC *)GlobalLock(hCursor);
-    XFreeCursor (display, lpcur->xcursor);
-    GlobalUnlock(hCursor);
-    GlobalFree(hCursor);
-    return TRUE;
-}
-
-
-/**********************************************************************
- *         CURSOR_SetCursor
- *
- * Internal helper function for SetCursor() and ShowCursor().
- */
-static void CURSOR_SetCursor( HCURSOR hCursor )
-{
-    CURSORALLOC	*lpcur;
-
-    if (!(lpcur = (CURSORALLOC *)GlobalLock(hCursor))) return;
-    if (rootWindow != DefaultRootWindow(display))
-    {
-        XDefineCursor( display, rootWindow, lpcur->xcursor );
-    }
-    else
-    {
-        HWND hwnd = GetWindow( GetDesktopWindow(), GW_CHILD );
-        while(hwnd)
-        {
-            Window win = WIN_GetXWindow( hwnd );
-            if (win) XDefineCursor( display, win, lpcur->xcursor );
-            hwnd = GetWindow( hwnd, GW_HWNDNEXT );
-        }
-    }
-    GlobalUnlock( hCursor );
-}
-
-/**********************************************************************
- *			SetCursor [USER.69]
- */
-HCURSOR SetCursor(HCURSOR hCursor)
-{
-    HCURSOR hOldCursor;
-
-    dprintf_cursor(stddeb,"SetCursor / hCursor=%04X !\n", hCursor);
-    hOldCursor = hActiveCursor;
-    hActiveCursor = hCursor;
-    if ((hCursor != hOldCursor) || (ShowCursCount < 0))
-    {
-        CURSOR_SetCursor( hCursor );
-    }
-    ShowCursCount = 0;
-    return hOldCursor;
-}
-
-
-/**********************************************************************
- *			GetCursor [USER.247]
- */
-HCURSOR GetCursor(void)
-{
-    return hActiveCursor;
-}
-
-
-/**********************************************************************
- *                        SetCursorPos [USER.70]
- */
-void SetCursorPos(short x, short y)
-{
-    dprintf_cursor(stddeb,"SetCursorPos // x=%d y=%d\n", x, y);
-    XWarpPointer( display, None, rootWindow, 0, 0, 0, 0, x, y );
-}
-
-
-/**********************************************************************
- *                        GetCursorPos [USER.17]
- */
-void GetCursorPos(LPPOINT lpRetPoint)
-{
-    Window 	root, child;
-    int		rootX, rootY;
-    int		childX, childY;
-    unsigned int mousebut;
-
-    if (!lpRetPoint) return;
-    if (!XQueryPointer( display, rootWindow, &root, &child,
-		        &rootX, &rootY, &childX, &childY, &mousebut ))
-	lpRetPoint->x = lpRetPoint->y = 0;
-    else
-    {
-	lpRetPoint->x = rootX + desktopX;
-	lpRetPoint->y = rootY + desktopY;
-    }
-    dprintf_cursor(stddeb,
-		"GetCursorPos // x=%d y=%d\n", lpRetPoint->x, lpRetPoint->y);
-}
-
-
-/**********************************************************************
- *			ShowCursor [USER.71]
- */
-int ShowCursor(BOOL bShow)
-{
-    dprintf_cursor(stddeb, "ShowCursor(%d), count=%d\n", bShow, ShowCursCount);
-
-    if (bShow)
-    {
-        if (++ShowCursCount == 0)  /* Time to show it */
-            CURSOR_SetCursor( hActiveCursor );
-    }
-    else  /* Hide it */
-    {
-        if (--ShowCursCount == -1)  /* Time to hide it */
-        {
-            if (!hEmptyCursor)
-                hEmptyCursor = CreateCursor( 0, 1, 1, 1, 1,
-					    "\xFF\xFF\xFF\xFF", "\xFF\xFF\xFF\xFF" );
-            CURSOR_SetCursor( hEmptyCursor );
-        }
-    }
-    return 0;
-}
-
-
-/**********************************************************************
- *                        ClipCursor [USER.16]
- */
-void ClipCursor(LPRECT lpNewClipRect)
-{
-    if (!lpNewClipRect) SetRectEmpty( &ClipCursorRect );
-    else CopyRect( &ClipCursorRect, lpNewClipRect );
-}
-
-
-/**********************************************************************
- *                        GetClipCursor [USER.309]
- */
-void GetClipCursor(LPRECT lpRetClipRect)
-{
-    if (lpRetClipRect != NULL)
-	CopyRect(lpRetClipRect, &ClipCursorRect);
-}
diff --git a/windows/dce.c b/windows/dce.c
index cbd6cf40bfd..7cb9df33138 100644
--- a/windows/dce.c
+++ b/windows/dce.c
@@ -392,7 +392,7 @@ HDC GetDCEx( HWND hwnd, HRGN hrgnClip, DWORD flags )
     SelectVisRgn( hdc, hrgnVisible );
     DeleteObject( hrgnVisible );
 
-    dprintf_dc(stddeb, "GetDCEx(%d,%d,0x%lx): returning %d\n", 
+    dprintf_dc(stddeb, "GetDCEx("NPFMT","NPFMT",0x%lx): returning "NPFMT"\n", 
 	       hwnd, hrgnClip, flags, hdc);
     return hdc;
 }
@@ -432,7 +432,7 @@ int ReleaseDC( HWND hwnd, HDC hdc )
     HANDLE hdce;
     DCE * dce = NULL;
     
-    dprintf_dc(stddeb, "ReleaseDC: %d %d\n", hwnd, hdc );
+    dprintf_dc(stddeb, "ReleaseDC: "NPFMT" "NPFMT"\n", hwnd, hdc );
         
     for (hdce = firstDCE; (hdce); hdce = dce->hNext)
     {
diff --git a/windows/defdlg.c b/windows/defdlg.c
index a3fb464dc04..9f30af19fea 100644
--- a/windows/defdlg.c
+++ b/windows/defdlg.c
@@ -111,7 +111,7 @@ static BOOL DEFDLG_SetDefButton( HWND hwndDlg, DIALOGINFO *dlgInfo,
 /***********************************************************************
  *           DefDlgProc   (USER.308)
  */
-LONG DefDlgProc( HWND hwnd, WORD msg, WORD wParam, LONG lParam )
+LRESULT DefDlgProc( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam )
 {
     DIALOGINFO * dlgInfo;
     BOOL result = FALSE;
@@ -120,8 +120,8 @@ LONG DefDlgProc( HWND hwnd, WORD msg, WORD wParam, LONG lParam )
     if (!wndPtr) return 0;
     dlgInfo = (DIALOGINFO *)&wndPtr->wExtra;
 
-    dprintf_dialog(stddeb, "DefDlgProc: %d %04x %d %08lx\n", 
-		   hwnd, msg, wParam, lParam );
+    dprintf_dialog(stddeb, "DefDlgProc: "NPFMT" %04x %ld %08lx\n", 
+		   hwnd, msg, (DWORD)wParam, lParam );
 
     dlgInfo->msgResult = 0;
     if (dlgInfo->dlgProc)
@@ -197,7 +197,7 @@ LONG DefDlgProc( HWND hwnd, WORD msg, WORD wParam, LONG lParam )
 
 	case WM_NEXTDLGCTL:
 	    {
-                HWND hwndDest = wParam;
+                HWND hwndDest = (HWND)wParam;
                 if (!lParam)
                 {
                     HWND hwndPrev = GetFocus();
diff --git a/windows/defwnd.c b/windows/defwnd.c
index 6263dd57586..1479b689546 100644
--- a/windows/defwnd.c
+++ b/windows/defwnd.c
@@ -15,10 +15,12 @@
 #include "stddebug.h"
 /* #define DEBUG_MESSAGE */
 #include "debug.h"
+#include "spy.h"
 
   /* Last COLOR id */
 #define COLOR_MAX   COLOR_BTNHIGHLIGHT
 
+
 /***********************************************************************
  *           DEFWND_SetText
  *
@@ -40,15 +42,14 @@ void DEFWND_SetText( HWND hwnd, LPSTR text )
 /***********************************************************************
  *           DefWindowProc   (USER.107)
  */
-LONG DefWindowProc( HWND hwnd, WORD msg, WORD wParam, LONG lParam )
+LRESULT DefWindowProc( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam )
 {
     CLASS * classPtr;
     LPSTR textPtr;
     int len;
     WND * wndPtr = WIN_FindWndPtr( hwnd );
-    
-    dprintf_message(stddeb, "DefWindowProc: %d %d %d %08lx\n", 
-		    hwnd, msg, wParam, lParam );
+
+    EnterSpyMessage(SPY_DEFWNDPROC,hwnd,msg,wParam,lParam);
 
     switch(msg)
     {
@@ -120,7 +121,8 @@ LONG DefWindowProc( HWND hwnd, WORD msg, WORD wParam, LONG lParam )
 	return MA_ACTIVATE;
 
     case WM_ACTIVATE:
-	if (wParam) SetFocus( hwnd );
+      /* LOWORD() needed for WINELIB32 implementation.  Should be fine. */
+	if (LOWORD(wParam)!=WA_INACTIVE) SetFocus( hwnd );
 	break;
 
     case WM_WINDOWPOSCHANGING:
@@ -145,11 +147,11 @@ LONG DefWindowProc( HWND hwnd, WORD msg, WORD wParam, LONG lParam )
 	{
 	    if (!(classPtr = CLASS_FindClassPtr( wndPtr->hClass ))) return 0;
 	    if (!classPtr->wc.hbrBackground) return 0;
-            if (classPtr->wc.hbrBackground <= COLOR_MAX+1)
+            if (classPtr->wc.hbrBackground <= (HBRUSH)(COLOR_MAX+1))
             {
                  HBRUSH hbrush;
                  hbrush = CreateSolidBrush(
-                     GetSysColor(classPtr->wc.hbrBackground-1));
+                     GetSysColor(((DWORD)classPtr->wc.hbrBackground)-1));
                  FillWindow( GetParent(hwnd), hwnd, (HDC)wParam, hbrush);
                  DeleteObject (hbrush);
             }
@@ -162,6 +164,22 @@ LONG DefWindowProc( HWND hwnd, WORD msg, WORD wParam, LONG lParam )
     case WM_GETDLGCODE:
 	return 0;
 
+    case WM_CTLCOLORMSGBOX:
+    case WM_CTLCOLOREDIT:
+    case WM_CTLCOLORLISTBOX:
+    case WM_CTLCOLORBTN:
+    case WM_CTLCOLORDLG:
+    case WM_CTLCOLORSTATIC:
+        SetBkColor( (HDC)wParam, GetSysColor(COLOR_WINDOW) );
+        SetTextColor( (HDC)wParam, GetSysColor(COLOR_WINDOWTEXT) );
+        return (LONG)sysColorObjects.hbrushWindow;
+
+    case WM_CTLCOLORSCROLLBAR:
+        SetBkColor( (HDC)wParam, RGB(255, 255, 255) );
+        SetTextColor( (HDC)wParam, RGB(0, 0, 0) );
+        UnrealizeObject( sysColorObjects.hbrushScrollbar );
+        return (LONG)sysColorObjects.hbrushScrollbar;
+
     case WM_CTLCOLOR:
 	{
 	    if (HIWORD(lParam) == CTLCOLOR_SCROLLBAR)
@@ -169,13 +187,13 @@ LONG DefWindowProc( HWND hwnd, WORD msg, WORD wParam, LONG lParam )
 		SetBkColor( (HDC)wParam, RGB(255, 255, 255) );
 		SetTextColor( (HDC)wParam, RGB(0, 0, 0) );
 		UnrealizeObject( sysColorObjects.hbrushScrollbar );
-		return sysColorObjects.hbrushScrollbar;
+		return (LONG)sysColorObjects.hbrushScrollbar;
 	    }
 	    else
 	    {
 		SetBkColor( (HDC)wParam, GetSysColor(COLOR_WINDOW) );
 		SetTextColor( (HDC)wParam, GetSysColor(COLOR_WINDOWTEXT) );
-		return sysColorObjects.hbrushWindow;
+		return (LONG)sysColorObjects.hbrushWindow;
 	    }
 	}
 	
diff --git a/windows/dialog.c b/windows/dialog.c
index b6a3d318327..8dc29c4be2e 100644
--- a/windows/dialog.c
+++ b/windows/dialog.c
@@ -218,7 +218,7 @@ HWND CreateDialogParam( HINSTANCE hInst, SEGPTR dlgTemplate,
     HGLOBAL hmem;
     SEGPTR data;
 
-    dprintf_dialog(stddeb, "CreateDialogParam: %d,%08lx,%d,%08lx,%ld\n",
+    dprintf_dialog(stddeb, "CreateDialogParam: "NPFMT",%08lx,"NPFMT",%08lx,%ld\n",
 	    hInst, dlgTemplate, owner, (DWORD)dlgProc, param );
      
     if (!(hRsrc = FindResource( hInst, dlgTemplate, RT_DIALOG ))) return 0;
@@ -303,7 +303,8 @@ HWND CreateDialogIndirectParam( HINSTANCE hInst, SEGPTR dlgTemplate,
     rect.right = template.header.cx * xUnit / 4;
     rect.bottom = template.header.cy * yUnit / 8;
     if (template.header.style & DS_MODALFRAME) exStyle |= WS_EX_DLGMODALFRAME;
-    AdjustWindowRectEx( &rect, template.header.style, hMenu, exStyle );
+    AdjustWindowRectEx( &rect, template.header.style, 
+			hMenu ? TRUE : FALSE , exStyle );
     rect.right -= rect.left;
     rect.bottom -= rect.top;
 
@@ -393,8 +394,8 @@ HWND CreateDialogIndirectParam( HINSTANCE hInst, SEGPTR dlgTemplate,
                                       header->y * yUnit / 8,
                                       header->cx * xUnit / 4,
                                       header->cy * yUnit / 8,
-                                      hwnd, header->id, dlgInfo->hDialogHeap,
-                                      (SEGPTR)0 );
+                                      hwnd, (HMENU)header->id,
+                                      dlgInfo->hDialogHeap, (SEGPTR)0 );
 	}
 	else
         {
@@ -404,7 +405,8 @@ HWND CreateDialogIndirectParam( HINSTANCE hInst, SEGPTR dlgTemplate,
                                       header->y * yUnit / 8,
                                       header->cx * xUnit / 4,
                                       header->cy * yUnit / 8,
-                                      hwnd, header->id, hInst, (SEGPTR)0 );
+                                      hwnd, (HMENU)header->id,
+                                      hInst, (SEGPTR)0 );
 	}
 
         /* Make the control last one in Z-order, so that controls remain
@@ -413,7 +415,7 @@ HWND CreateDialogIndirectParam( HINSTANCE hInst, SEGPTR dlgTemplate,
                       SWP_NOSIZE | SWP_NOMOVE | SWP_NOACTIVATE );
 
             /* Send initialisation messages to the control */
-        if (hFont) SendMessage( hwndCtrl, WM_SETFONT, hFont, 0 );
+        if (hFont) SendMessage( hwndCtrl, WM_SETFONT, (WPARAM)hFont, 0 );
         if (SendMessage( hwndCtrl, WM_GETDLGCODE, 0, 0 ) & DLGC_DEFPUSHBUTTON)
         {
               /* If there's already a default push-button, set it back */
@@ -439,8 +441,8 @@ HWND CreateDialogIndirectParam( HINSTANCE hInst, SEGPTR dlgTemplate,
       /* Send initialisation messages and set focus */
 
     if (dlgInfo->hUserFont)
-	SendMessage( hwnd, WM_SETFONT, dlgInfo->hUserFont, 0 );
-    if (SendMessage( hwnd, WM_INITDIALOG, dlgInfo->hwndFocus, param ))
+	SendMessage( hwnd, WM_SETFONT, (WPARAM)dlgInfo->hUserFont, 0 );
+    if (SendMessage( hwnd, WM_INITDIALOG, (WPARAM)dlgInfo->hwndFocus, param ))
 	SetFocus( dlgInfo->hwndFocus );
     if (template.header.style & WS_VISIBLE) ShowWindow(hwnd, SW_SHOW);
     return hwnd;
@@ -504,7 +506,7 @@ int DialogBoxParam( HINSTANCE hInst, SEGPTR dlgTemplate,
 {
     HWND hwnd;
     
-    dprintf_dialog(stddeb, "DialogBoxParam: %d,%08lx,%d,%08lx,%ld\n",
+    dprintf_dialog(stddeb, "DialogBoxParam: "NPFMT",%08lx,"NPFMT",%08lx,%ld\n",
 	    hInst, dlgTemplate, owner, (DWORD)dlgProc, param );
     hwnd = CreateDialogParam( hInst, dlgTemplate, owner, dlgProc, param );
     if (hwnd) return DIALOG_DoDialogBox( hwnd, owner );
@@ -531,7 +533,7 @@ int DialogBoxIndirectParam( HINSTANCE hInst, HANDLE dlgTemplate,
     HWND hwnd;
     SEGPTR ptr;
 
-    if (!(ptr = WIN16_GlobalLock( dlgTemplate ))) return -1;
+    if (!(ptr = (SEGPTR)WIN16_GlobalLock( dlgTemplate ))) return -1;
     hwnd = CreateDialogIndirectParam( hInst, ptr, owner, dlgProc, param );
     GlobalUnlock( dlgTemplate );
     if (hwnd) return DIALOG_DoDialogBox( hwnd, owner );
@@ -548,7 +550,7 @@ void EndDialog( HWND hwnd, short retval )
     DIALOGINFO * dlgInfo = (DIALOGINFO *)wndPtr->wExtra;
     dlgInfo->msgResult = retval;
     dlgInfo->fEnd = TRUE;
-    dprintf_dialog(stddeb, "EndDialog: %d %d\n", hwnd, retval );
+    dprintf_dialog(stddeb, "EndDialog: "NPFMT" %d\n", hwnd, retval );
 }
 
 
@@ -610,20 +612,36 @@ BOOL IsDialogMessage( HWND hwndDlg, LPMSG msg )
             break;
 
         case VK_ESCAPE:
+#ifdef WINELIB32
+            SendMessage( hwndDlg, WM_COMMAND, 
+			 MAKEWPARAM( IDCANCEL, 0 ),
+                         (LPARAM)GetDlgItem(hwndDlg,IDCANCEL) );
+#else
             SendMessage( hwndDlg, WM_COMMAND, IDCANCEL,
                          MAKELPARAM( GetDlgItem(hwndDlg,IDCANCEL), 0 ));
+#endif
             break;
 
         case VK_RETURN:
             {
                 DWORD dw = SendMessage( hwndDlg, DM_GETDEFID, 0, 0 );
                 if (HIWORD(dw) == DC_HASDEFID)
+#ifdef WINELIB32
+                    SendMessage( hwndDlg, WM_COMMAND, 
+				 MAKEWPARAM( LOWORD(dw), BN_CLICKED ),
+                                 (LPARAM)GetDlgItem( hwndDlg, LOWORD(dw) ) );
+                else
+                    SendMessage( hwndDlg, WM_COMMAND, 
+				 MAKEWPARAM( IDOK, 0 ),
+                                 (LPARAM)GetDlgItem(hwndDlg,IDOK) );
+#else
                     SendMessage( hwndDlg, WM_COMMAND, LOWORD(dw),
                                  MAKELPARAM( GetDlgItem( hwndDlg, LOWORD(dw) ),
                                              BN_CLICKED ));
                 else
                     SendMessage( hwndDlg, WM_COMMAND, IDOK,
                                  MAKELPARAM( GetDlgItem(hwndDlg,IDOK), 0 ));
+#endif
             }
             break;
         }
@@ -681,7 +699,7 @@ HWND GetDlgItem( HWND hwndDlg, WORD id )
 /*******************************************************************
  *           SendDlgItemMessage   (USER.101)
  */
-LONG SendDlgItemMessage(HWND hwnd, WORD id, UINT msg, WORD wParam, LONG lParam)
+LRESULT SendDlgItemMessage(HWND hwnd, INT id, UINT msg, WPARAM wParam, LPARAM lParam)
 {
     HWND hwndCtrl = GetDlgItem( hwnd, id );
     if (hwndCtrl) return SendMessage( hwndCtrl, msg, wParam, lParam );
diff --git a/windows/event.c b/windows/event.c
index 837d284d9fc..a91d24832e3 100644
--- a/windows/event.c
+++ b/windows/event.c
@@ -118,8 +118,7 @@ typedef union
 
 static BOOL KeyDown = FALSE;
 
-
-static char *event_names[] =
+static const char *event_names[] =
 {
     "", "", "KeyPress", "KeyRelease", "ButtonPress", "ButtonRelease",
     "MotionNotify", "EnterNotify", "LeaveNotify", "FocusIn", "FocusOut",
@@ -157,7 +156,7 @@ void EVENT_ProcessEvent( XEvent *event )
     XFindContext( display, ((XAnyEvent *)event)->window, winContext, &ptr );
     hwnd = (HWND) (int)ptr;
 
-    dprintf_event(stddeb, "Got event %s for hwnd %d\n", 
+    dprintf_event(stddeb, "Got event %s for hwnd "NPFMT"\n",
 		  event_names[event->type], hwnd );
 
     switch(event->type)
@@ -214,7 +213,7 @@ void EVENT_ProcessEvent( XEvent *event )
 	break;
 
     default:    
-	dprintf_event(stddeb, "Unprocessed event %s for hwnd %d\n",
+	dprintf_event(stddeb, "Unprocessed event %s for hwnd "NPFMT"\n",
 	        event_names[event->type], hwnd );
 	break;
     }
@@ -396,6 +395,26 @@ static void EVENT_MotionNotify( XMotionEvent *event )
 }
 
 
+/***********************************************************************
+ *           EVENT_DummyMotionNotify
+ *
+ * Generate a dummy MotionNotify event. Used to force a WM_SETCURSOR message.
+ */
+void EVENT_DummyMotionNotify(void)
+{
+    Window root, child;
+    int rootX, rootY, childX, childY;
+    unsigned int state;
+
+    if (XQueryPointer( display, rootWindow, &root, &child,
+                       &rootX, &rootY, &childX, &childY, &state ))
+    {
+        hardware_event(WM_MOUSEMOVE, EVENT_XStateToKeyState( state ), 0L,
+                       rootX - desktopX, rootY - desktopY, GetTickCount(), 0 );
+    }
+}
+
+
 /***********************************************************************
  *           EVENT_ButtonPress
  */
@@ -539,7 +558,7 @@ HWND SetCapture( HWND hwnd )
                      GrabModeAsync, GrabModeAsync,
                      None, None, CurrentTime ) == GrabSuccess)
     {
-	dprintf_win(stddeb, "SetCapture: %04x\n", hwnd);
+	dprintf_win(stddeb, "SetCapture: "NPFMT"\n", hwnd);
 	captureWnd   = hwnd;
 	return old_capture_wnd;
     }
diff --git a/windows/focus.c b/windows/focus.c
index 7dc8897af80..141bedeb5fe 100644
--- a/windows/focus.c
+++ b/windows/focus.c
@@ -83,10 +83,12 @@ HWND SetFocus(HWND hwnd)
 
     hWndPrevFocus = hWndFocus;
     hWndFocus = hwnd;    
-    if (hWndPrevFocus) SendMessage( hWndPrevFocus, WM_KILLFOCUS, hwnd, 0 );
+    if (hWndPrevFocus) SendMessage( hWndPrevFocus, WM_KILLFOCUS, 
+				    (WPARAM)hwnd, 0 );
     if (hwnd == hWndFocus)  /* Maybe already changed during WM_KILLFOCUS */
     {
-	if (hwnd) SendMessage( hWndFocus, WM_SETFOCUS, hWndPrevFocus, 0 );
+	if (hwnd) SendMessage( hWndFocus, WM_SETFOCUS, 
+			       (WPARAM)hWndPrevFocus, 0 );
 	FOCUS_SetXFocus( hwnd );
     }
     return hWndPrevFocus;
diff --git a/windows/graphics.c b/windows/graphics.c
index d623752e96a..608fbea13d3 100644
--- a/windows/graphics.c
+++ b/windows/graphics.c
@@ -693,19 +693,17 @@ void DrawFocusRect( HDC hdc, LPRECT rc )
 BOOL GRAPH_DrawBitmap( HDC hdc, HBITMAP hbitmap, int xdest, int ydest,
 		       int xsrc, int ysrc, int width, int height )
 {
-    XGCValues val;
     BITMAPOBJ *bmp;
     DC *dc;
     
     if (!(dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC ))) return FALSE;
     if (!(bmp = (BITMAPOBJ *) GDI_GetObjPtr( hbitmap, BITMAP_MAGIC )))
 	return FALSE;
-    val.function   = GXcopy;
-    val.foreground = dc->w.textPixel;
-    val.background = dc->w.backgroundPixel;
-    XChangeGC(display, dc->u.x.gc, GCFunction|GCForeground|GCBackground, &val);
+    XSetFunction( display, dc->u.x.gc, GXcopy );
     if (bmp->bitmap.bmBitsPixel == 1)
     {
+        XSetForeground( display, dc->u.x.gc, dc->w.backgroundPixel );
+        XSetBackground( display, dc->u.x.gc, dc->w.textPixel );
 	XCopyPlane( display, bmp->pixmap, dc->u.x.drawable, dc->u.x.gc,
 		    xsrc, ysrc, width, height,
 		    dc->w.DCOrgX + xdest, dc->w.DCOrgY + ydest, 1 );
@@ -980,7 +978,7 @@ BOOL ExtFloodFill( HDC hdc, INT x, INT y, COLORREF color, WORD fillType )
     RECT rect;
     DC *dc;
 
-    dprintf_graphics( stddeb, "ExtFloodFill %x %d,%d %06lx %d\n",
+    dprintf_graphics( stddeb, "ExtFloodFill "NPFMT" %d,%d %06lx %d\n",
                       hdc, x, y, color, fillType );
     dc = (DC *) GDI_GetObjPtr(hdc, DC_MAGIC);
     if (!dc) 
diff --git a/windows/hook.c b/windows/hook.c
index d4fe2ebd511..08472af7e35 100644
--- a/windows/hook.c
+++ b/windows/hook.c
@@ -52,7 +52,11 @@ BOOL UnhookWindowsHook( short id, FARPROC hproc )
     if (data->proc == hproc) {
       hhook = *prevHook;
       *prevHook = data->next;
+#ifdef WINELIB32
+      USER_HEAP_FREE((HANDLE)hhook);
+#else
       USER_HEAP_FREE(LOWORD(hhook));
+#endif
       return TRUE;
     }
   }
@@ -62,7 +66,11 @@ BOOL UnhookWindowsHook( short id, FARPROC hproc )
     if (data->proc == hproc) {
       hhook = *prevHook;
       *prevHook = data->next;
+#ifdef WINELIB32
+      USER_HEAP_FREE((HANDLE)hhook);
+#else
       USER_HEAP_FREE(LOWORD(hhook));
+#endif
       return TRUE;
     }
   }
@@ -84,8 +92,9 @@ DWORD DefHookProc( short code, WORD wParam, DWORD lParam, HHOOK *hhook )
  */
 BOOL CallMsgFilter( SEGPTR msg, short code )
 {
-    if (CALL_SYSTEM_HOOK( WH_SYSMSGFILTER, code, 0, (LPARAM)msg )) return TRUE;
-    else return CALL_TASK_HOOK( WH_MSGFILTER, code, 0, (LPARAM)msg );
+    if (CALL_TASK_HOOK( WH_MSGFILTER, code, 0, (LPARAM)msg )) 
+	return TRUE;
+    return CALL_SYSTEM_HOOK( WH_SYSMSGFILTER, code, 0, (LPARAM)msg );
 }
 
 
@@ -100,7 +109,8 @@ HHOOK SetWindowsHookEx( short id, HOOKPROC proc, HINSTANCE hinst, HTASK htask )
 
     if ((id < FIRST_HOOK) || (id > LAST_HOOK)) return 0;
     if (id != WH_GETMESSAGE && id != WH_CALLWNDPROC) {
-	fprintf( stdnimp, "Unimplemented hook set: %d!\n", id );
+	fprintf( stdnimp, "Unimplemented hook set: (%d,%08lx,%04x,%04x)!\n",
+                 id, (DWORD)proc, hinst, htask );
     }
     if (htask)  /* Task-specific hook */
     {
@@ -121,7 +131,7 @@ HHOOK SetWindowsHookEx( short id, HOOKPROC proc, HINSTANCE hinst, HTASK htask )
     data->proc  = proc;
     data->id    = id;
     data->htask = htask;
-    *prevHook   = USER_HEAP_SEG_ADDR(handle);
+    *prevHook   = (HHOOK)USER_HEAP_SEG_ADDR(handle);
     return *prevHook;
 }
 
@@ -141,7 +151,11 @@ BOOL UnhookWindowsHookEx( HHOOK hhook )
     }
     if (!*prevHook) return FALSE;
     *prevHook = data->next;
+#ifdef WINELIB32
+    USER_HEAP_FREE( (HANDLE)hhook );
+#else
     USER_HEAP_FREE( hhook & 0xffff );
+#endif
     return TRUE;
 }
 
diff --git a/windows/mapping.c b/windows/mapping.c
index 74b91f3690d..5e6681972b8 100644
--- a/windows/mapping.c
+++ b/windows/mapping.c
@@ -86,7 +86,7 @@ WORD SetMapMode( HDC hdc, WORD mode )
 	return 1;
     }
 
-    dprintf_gdi(stddeb, "SetMapMode: %d %d\n", hdc, mode );
+    dprintf_gdi(stddeb, "SetMapMode: "NPFMT" %d\n", hdc, mode );
     
     prevMode = dc->w.MapMode;
     switch(mode)
diff --git a/windows/mdi.c b/windows/mdi.c
index de7ded74a37..76f6d87f545 100644
--- a/windows/mdi.c
+++ b/windows/mdi.c
@@ -27,7 +27,7 @@ void MDIRecreateMenuList(MDICLIENTINFO *ci)
     char buffer[128];
     int id, n, index;
 
-    dprintf_mdi(stddeb, "MDIRecreateMenuList: hWindowMenu %0x\n", 
+    dprintf_mdi(stddeb, "MDIRecreateMenuList: hWindowMenu "NPFMT"\n", 
 	    ci->hWindowMenu);
     
     id = ci->idFirstChild; 
@@ -66,7 +66,7 @@ void MDIRecreateMenuList(MDICLIENTINFO *ci)
  */
 HMENU MDISetMenu(HWND hwnd, BOOL fRefresh, HMENU hmenuFrame, HMENU hmenuWindow)
 {
-    dprintf_mdi(stddeb, "WM_MDISETMENU: %04x %04x %04x %04x\n", hwnd, fRefresh, hmenuFrame, hmenuWindow);
+    dprintf_mdi(stddeb, "WM_MDISETMENU: "NPFMT" %04x "NPFMT" "NPFMT"\n", hwnd, fRefresh, hmenuFrame, hmenuWindow);
     if (!fRefresh) {
 	HWND hwndFrame = GetParent(hwnd);
 	HMENU oldFrameMenu = GetMenu(hwndFrame);
@@ -112,7 +112,7 @@ HWND MDICreateChild(WND *w, MDICLIENTINFO *ci, HWND parent, LPARAM lParam )
 			  WS_MAXIMIZEBOX | WS_MINIMIZEBOX | WS_SYSMENU |
 			  WS_THICKFRAME | WS_VISIBLE | cs->style,
 			  cs->x, cs->y, cs->cx, cs->cy, parent, (HMENU) 0,
-			  w->hInstance, lParam);
+			  w->hInstance, (SEGPTR)lParam);
 
     if (hwnd)
     {
@@ -215,7 +215,7 @@ void MDIBringChildToTop(HWND parent, WORD id, WORD by_id, BOOL send_to_bottom)
 	{
 	    while (hinfo != 0) {
 		chi = (MDICHILDINFO *)USER_HEAP_LIN_ADDR(hinfo);
-		if (chi->hwnd == id) break;
+		if (chi->hwnd == (HWND)id) break;
 	        hinfo = chi->next;
 	    }
 	}
@@ -223,7 +223,7 @@ void MDIBringChildToTop(HWND parent, WORD id, WORD by_id, BOOL send_to_bottom)
 	if (hinfo == 0)
 	    return;
 
-	dprintf_mdi(stddeb, "MDIBringToTop: child %04x\n", chi->hwnd);
+	dprintf_mdi(stddeb, "MDIBringToTop: child "NPFMT"\n", chi->hwnd);
 	if (hinfo != ci->infoActiveChildren)
 	{
 	    if (ci->flagChildMaximized)
@@ -285,7 +285,7 @@ void MDIBringChildToTop(HWND parent, WORD id, WORD by_id, BOOL send_to_bottom)
 	    SendMessage(parent, WM_CHILDACTIVATE, 0, 0);
 	}
 	
-	dprintf_mdi(stddeb, "MDIBringToTop: pos %04x, hwnd %04x\n", 
+	dprintf_mdi(stddeb, "MDIBringToTop: pos %04x, hwnd "NPFMT"\n", 
 		id, chi->hwnd);
     }
 }
@@ -354,17 +354,17 @@ LONG MDIChildActivated(WND *w, MDICLIENTINFO *ci, HWND parent)
     HWND          act_hwnd;
     LONG          lParam;
 
-    dprintf_mdi(stddeb, "MDIChildActivate: top %04x\n", w->hwndChild);
+    dprintf_mdi(stddeb, "MDIChildActivate: top "NPFMT"\n", w->hwndChild);
 
     hinfo = ci->infoActiveChildren;
     if (hinfo)
     {
 	chi = (MDICHILDINFO *)USER_HEAP_LIN_ADDR(hinfo);
 	deact_hwnd = ci->hwndActiveChild;
-	act_hwnd   = chi->hwnd;
-	lParam     = ((LONG) deact_hwnd << 16) | act_hwnd;
+	act_hwnd   = chi->hwnd;                /* FIX: Hack */
+	lParam     = ((LONG) deact_hwnd << 16) | (LONG)act_hwnd;
 
-	dprintf_mdi(stddeb, "MDIChildActivate: deact %04x, act %04x\n",
+	dprintf_mdi(stddeb, "MDIChildActivate: deact "NPFMT", act "NPFMT"\n",
 	       deact_hwnd, act_hwnd);
 
 	ci->hwndActiveChild = act_hwnd;
@@ -424,13 +424,13 @@ LONG MDICascade(HWND parent, MDICLIENTINFO *ci)
 	hinfo = chi->next;
     }
     
-    dprintf_mdi(stddeb, "MDICascade: last child is %04x\n", chi->hwnd);
+    dprintf_mdi(stddeb, "MDICascade: last child is "NPFMT"\n", chi->hwnd);
     x = 0;
     y = 0;
     while (hinfo != 0)
     {
 	chi = USER_HEAP_LIN_ADDR(hinfo);
-	dprintf_mdi(stddeb, "MDICascade: move %04x to (%d,%d) size [%d,%d]\n", 
+	dprintf_mdi(stddeb, "MDICascade: move "NPFMT" to (%d,%d) size [%d,%d]\n", 
 		chi->hwnd, x, y, xsize, ysize);
         if (IsIconic(chi->hwnd)) continue;
 	SetWindowPos(chi->hwnd, 0, x, y, xsize, ysize, 
@@ -556,7 +556,7 @@ LONG MDIPaintMaximized(HWND hwndFrame, HWND hwndClient, WORD message,
     w  = WIN_FindWndPtr(hwndClient);
     ci = (MDICLIENTINFO *) w->wExtra;
 
-    dprintf_mdi(stddeb, "MDIPaintMaximized: frame %04x,  client %04x"
+    dprintf_mdi(stddeb, "MDIPaintMaximized: frame "NPFMT",  client "NPFMT
 		",  max flag %d,  menu %04x\n", hwndFrame, hwndClient, 
 		ci->flagChildMaximized, wndPtr ? wndPtr->wIDmenu : 0);
 
@@ -576,8 +576,8 @@ LONG MDIPaintMaximized(HWND hwndFrame, HWND hwndClient, WORD message,
 	}
 
 	dprintf_mdi(stddeb, 
-		    "MDIPaintMaximized: hdcMem %04x, close bitmap %04x, "
-		    "maximized bitmap %04x\n",
+		    "MDIPaintMaximized: hdcMem "NPFMT", close bitmap "NPFMT", "
+		    "maximized bitmap "NPFMT"\n",
 		    hdcMem, hbitmapClose, hbitmapMaximized);
 
 	NC_GetInsideRect(hwndFrame, &rect);
@@ -617,7 +617,7 @@ LONG MDIPaintMaximized(HWND hwndFrame, HWND hwndClient, WORD message,
  *
  * This function is the handler for all MDI requests.
  */
-LONG MDIClientWndProc(HWND hwnd, WORD message, WORD wParam, LONG lParam)
+LRESULT MDIClientWndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
 {
     LPCREATESTRUCT       cs;
     LPCLIENTCREATESTRUCT ccs;
@@ -656,7 +656,7 @@ LONG MDIClientWndProc(HWND hwnd, WORD message, WORD wParam, LONG lParam)
 	return MDICascade(hwnd, ci);
 
       case WM_MDICREATE:
-	return MDICreateChild(w, ci, hwnd, lParam );
+	return (LONG)MDICreateChild(w, ci, hwnd, lParam );
 
       case WM_MDIDESTROY:
 	return MDIDestroyChild(w, ci, hwnd, wParam, TRUE);
@@ -690,7 +690,11 @@ LONG MDIClientWndProc(HWND hwnd, WORD message, WORD wParam, LONG lParam)
 	
       case WM_PARENTNOTIFY:
 	if (wParam == WM_DESTROY)
+#ifdef WINELIB32
+	    return MDIDestroyChild(w, ci, hwnd, lParam, FALSE);
+#else
 	    return MDIDestroyChild(w, ci, hwnd, LOWORD(lParam), FALSE);
+#endif
 	else if (wParam == WM_LBUTTONDOWN)
 	    MDIBringChildToTop(hwnd, ci->hwndHitTest, FALSE, FALSE);
 	break;
@@ -708,8 +712,8 @@ LONG MDIClientWndProc(HWND hwnd, WORD message, WORD wParam, LONG lParam)
  *					DefFrameProc (USER.445)
  *
  */
-LONG DefFrameProc(HWND hwnd, HWND hwndMDIClient, WORD message, 
-		  WORD wParam, LONG lParam)
+LRESULT DefFrameProc(HWND hwnd, HWND hwndMDIClient, UINT message, 
+		     WPARAM wParam, LPARAM lParam)
 {
     if (hwndMDIClient)
     {
@@ -751,7 +755,11 @@ LONG DefFrameProc(HWND hwnd, HWND hwndMDIClient, WORD message,
  *					DefMDIChildProc (USER.447)
  *
  */
+#ifdef WINELIB32
+LONG DefMDIChildProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
+#else
 LONG DefMDIChildProc(HWND hwnd, WORD message, WORD wParam, LONG lParam)
+#endif
 {
     MDICLIENTINFO       *ci;
     WND                 *w;
@@ -773,10 +781,10 @@ LONG DefMDIChildProc(HWND hwnd, WORD message, WORD wParam, LONG lParam)
 	switch (wParam)
 	{
 	  case SC_MAXIMIZE:
-	    return SendMessage(GetParent(hwnd), WM_MDIMAXIMIZE, hwnd, 0);
+	    return SendMessage(GetParent(hwnd), WM_MDIMAXIMIZE, (WPARAM)hwnd, 0);
 
 	  case SC_RESTORE:
-	    return SendMessage(GetParent(hwnd), WM_MDIRESTORE, hwnd, 0);
+	    return SendMessage(GetParent(hwnd), WM_MDIRESTORE, (WPARAM)hwnd, 0);
 	}
 	break;
 	
diff --git a/windows/message.c b/windows/message.c
index 72cb9abb8c0..adefb1475e9 100644
--- a/windows/message.c
+++ b/windows/message.c
@@ -15,6 +15,7 @@
 #include "sysmetrics.h"
 #include "hook.h"
 #include "event.h"
+#include "spy.h"
 #include "winpos.h"
 #include "atom.h"
 #include "dde.h"
@@ -137,7 +138,7 @@ static int MSG_FindMsg(MESSAGEQUEUE * msgQueue, HWND hwnd, int first, int last)
 {
     int i, pos = msgQueue->nextMessage;
 
-    dprintf_msg(stddeb,"MSG_FindMsg: hwnd=0x%04x\n\n", hwnd );
+    dprintf_msg(stddeb,"MSG_FindMsg: hwnd=0x"NPFMT"\n\n", hwnd );
 
     if (!msgQueue->msgCount) return -1;
     if (!hwnd && !first && !last) return pos;
@@ -310,7 +311,7 @@ static BOOL MSG_TranslateMouseMsg( MSG *msg, BOOL remove )
 
         /* Send the WM_PARENTNOTIFY message */
 
-        if (mouseClick) WIN_SendParentNotify( msg->hwnd, msg->message,
+        if (mouseClick) WIN_SendParentNotify( msg->hwnd, msg->message, 0,
                                             MAKELONG( msg->pt.x, msg->pt.y ) );
 
         /* Activate the window if needed */
@@ -320,7 +321,8 @@ static BOOL MSG_TranslateMouseMsg( MSG *msg, BOOL remove )
             HWND hwndTop = WIN_GetTopParent( msg->hwnd );
             if (hwndTop != GetActiveWindow())
             {
-                LONG ret = SendMessage( msg->hwnd, WM_MOUSEACTIVATE, hwndTop,
+                LONG ret = SendMessage( msg->hwnd, WM_MOUSEACTIVATE,
+					(WPARAM)hwndTop,
                                         MAKELONG( hittest, msg->message ) );
                 if ((ret == MA_ACTIVATEANDEAT) || (ret == MA_NOACTIVATEANDEAT))
                     eatMsg = TRUE;
@@ -336,7 +338,7 @@ static BOOL MSG_TranslateMouseMsg( MSG *msg, BOOL remove )
 
       /* Send the WM_SETCURSOR message */
 
-    SendMessage( msg->hwnd, WM_SETCURSOR, msg->hwnd,
+    SendMessage( msg->hwnd, WM_SETCURSOR, (WPARAM)msg->hwnd,
                  MAKELONG( hittest, msg->message ));
     if (eatMsg) return FALSE;
 
@@ -954,8 +956,8 @@ BOOL GetMessage( SEGPTR msg, HWND hwnd, WORD first, WORD last )
 {
     MSG_PeekMessage( (MSG *)PTR_SEG_TO_LIN(msg),
                      hwnd, first, last, PM_REMOVE, FALSE );
-    CALL_SYSTEM_HOOK( WH_GETMESSAGE, 0, 0, (LPARAM)msg );
     CALL_TASK_HOOK( WH_GETMESSAGE, 0, 0, (LPARAM)msg );
+    CALL_SYSTEM_HOOK( WH_GETMESSAGE, 0, 0, (LPARAM)msg );
     return (((MSG *)PTR_SEG_TO_LIN(msg))->message != WM_QUIT);
 }
 
@@ -988,7 +990,7 @@ BOOL PostMessage( HWND hwnd, WORD message, WORD wParam, LONG lParam )
       while (hwnd) {
 	if (!(wndPtr = WIN_FindWndPtr(hwnd))) break;
 	if (wndPtr->dwStyle & WS_POPUP || wndPtr->dwStyle & WS_CAPTION) {
-	  dprintf_msg(stddeb,"BROADCAST Message to hWnd=%04X m=%04X w=%04X l=%08lX !\n",
+	  dprintf_msg(stddeb,"BROADCAST Message to hWnd="NPFMT" m=%04X w=%04X l=%08lX !\n",
 		      hwnd, message, wParam, lParam);
 	  PostMessage(hwnd, message, wParam, lParam);
 	}
@@ -1027,16 +1029,16 @@ BOOL PostAppMessage( HTASK hTask, WORD message, WORD wParam, LONG lParam )
 /***********************************************************************
  *           SendMessage   (USER.111)
  */
-LONG SendMessage( HWND hwnd, WORD msg, WORD wParam, LONG lParam )
+LRESULT SendMessage( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam )
 {
     WND * wndPtr;
     LONG ret;
     struct
     {
-	LONG lParam;
-	WORD wParam;
-	WORD wMsg;
-	WORD hWnd;
+	LPARAM lParam;
+	WPARAM wParam;
+	UINT wMsg;
+	HWND hWnd;
     } msgstruct = { lParam, wParam, msg, hwnd };
 
 #ifdef CONFIG_IPC
@@ -1053,8 +1055,8 @@ LONG SendMessage( HWND hwnd, WORD msg, WORD wParam, LONG lParam )
             if (!(wndPtr = WIN_FindWndPtr(hwnd))) break;
             if (wndPtr->dwStyle & WS_POPUP || wndPtr->dwStyle & WS_CAPTION)
             {
-                dprintf_msg(stddeb,"BROADCAST Message to hWnd=%04X m=%04X w=%04X l=%08lX !\n",
-                            hwnd, msg, wParam, lParam);
+                dprintf_msg(stddeb,"BROADCAST Message to hWnd="NPFMT" m=%04X w=%04lX l=%08lX !\n",
+                            hwnd, msg, (DWORD)wParam, lParam);
                  ret |= SendMessage( hwnd, msg, wParam, lParam );
 	    }
             hwnd = wndPtr->hwndNext;
@@ -1063,13 +1065,18 @@ LONG SendMessage( HWND hwnd, WORD msg, WORD wParam, LONG lParam )
         return TRUE;
     }
 
-    CALL_SYSTEM_HOOK( WH_CALLWNDPROC, 0, 0, MAKE_SEGPTR(&msgstruct) );
-    CALL_TASK_HOOK( WH_CALLWNDPROC, 0, 0, MAKE_SEGPTR(&msgstruct) );
-    if (!(wndPtr = WIN_FindWndPtr( hwnd ))) return 0;
+    EnterSpyMessage(SPY_SENDMESSAGE, hwnd, msg, wParam, lParam);
+
+    CALL_TASK_HOOK( WH_CALLWNDPROC, HC_ACTION, 1, MAKE_SEGPTR(&msgstruct) );
+    CALL_SYSTEM_HOOK( WH_CALLWNDPROC, HC_ACTION, 1, MAKE_SEGPTR(&msgstruct) );
+    if (!(wndPtr = WIN_FindWndPtr( hwnd ))) 
+    {
+        ExitSpyMessage(SPY_RESULT_INVALIDHWND,hwnd,msg,0);
+        return 0;
+    }
     ret = CallWindowProc( wndPtr->lpfnWndProc, msgstruct.hWnd, msgstruct.wMsg,
                           msgstruct.wParam, msgstruct.lParam );
-    dprintf_msg( stddeb,"SendMessage(%4.4x,%x,%x,%lx) -> %lx\n",
-                 hwnd, msg, wParam, lParam, ret );
+    ExitSpyMessage(SPY_RESULT_OK,hwnd,msg,ret);
     return ret;
 }
 
@@ -1126,17 +1133,16 @@ LONG DispatchMessage( LPMSG msg )
     LONG retval;
     int painting;
     
-    dprintf_msg(stddeb, "Dispatch message hwnd=%04x msg=0x%x w=%d l=%ld time=%lu pt=%d,%d\n",
-	    msg->hwnd, msg->message, msg->wParam, msg->lParam, 
-	    msg->time, msg->pt.x, msg->pt.y );
+    EnterSpyMessage( SPY_DISPATCHMESSAGE, msg->hwnd, msg->message,
+                     msg->wParam, msg->lParam );
 
       /* Process timer messages */
     if ((msg->message == WM_TIMER) || (msg->message == WM_SYSTIMER))
     {
 	if (msg->lParam)
         {
-            WORD ds = msg->hwnd ? GetWindowWord( msg->hwnd, GWW_HINSTANCE )
-                                : CURRENT_DS;
+            HINSTANCE ds = msg->hwnd ? WIN_GetWindowInstance( msg->hwnd )
+                                     : (HINSTANCE)CURRENT_DS;
 	    return CallWndProc( (WNDPROC)msg->lParam, ds, msg->hwnd,
                                 msg->message, msg->wParam, GetTickCount() );
         }
@@ -1152,7 +1158,7 @@ LONG DispatchMessage( LPMSG msg )
     if (painting && IsWindow(msg->hwnd) &&
         (wndPtr->flags & WIN_NEEDS_BEGINPAINT))
     {
-	fprintf(stderr, "BeginPaint not called on WM_PAINT for hwnd %d!\n", 
+	fprintf(stderr, "BeginPaint not called on WM_PAINT for hwnd "NPFMT"!\n", 
 		msg->hwnd);
 	wndPtr->flags &= ~WIN_NEEDS_BEGINPAINT;
     }
@@ -1207,7 +1213,7 @@ WORD RegisterWindowMessage( SEGPTR str )
 
 
 /***********************************************************************
- *           GetTickCount    (USER.13)
+ *           GetTickCount    (USER.13) (KERNEL32.299)
  */
 DWORD GetTickCount(void)
 {
diff --git a/windows/msgbox.c b/windows/msgbox.c
index 05bc09c6f63..e0cd46cebf5 100644
--- a/windows/msgbox.c
+++ b/windows/msgbox.c
@@ -11,6 +11,7 @@
 #include "selectors.h"
 #include "alias.h"
 #include "relay32.h"
+#include "win.h"
 #include "../rc/sysres.h"
 #include "task.h"
 
@@ -20,7 +21,7 @@ typedef struct {
   WORD  type;
 } MSGBOX, *LPMSGBOX;
 
-LONG SystemMessageBoxProc(HWND hwnd, WORD message, WORD wParam, LONG lParam)
+LRESULT SystemMessageBoxProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
 {
   LPMSGBOX lpmb;
   RECT rect, textrect;
@@ -68,17 +69,21 @@ LONG SystemMessageBoxProc(HWND hwnd, WORD message, WORD wParam, LONG lParam)
     /* Set the icon */
     switch(lpmb->type & MB_ICONMASK) {
      case MB_ICONEXCLAMATION:
-      SendDlgItemMessage(hwnd, stc1, STM_SETICON, LoadIcon(0, IDI_EXCLAMATION), 0);
+      SendDlgItemMessage(hwnd, stc1, STM_SETICON, 
+			 (WPARAM)LoadIcon(0, IDI_EXCLAMATION), 0);
       break;
      case MB_ICONQUESTION:
-      SendDlgItemMessage(hwnd, stc1, STM_SETICON, LoadIcon(0, IDI_QUESTION), 0);
+      SendDlgItemMessage(hwnd, stc1, STM_SETICON, 
+			 (WPARAM)LoadIcon(0, IDI_QUESTION), 0);
       break;
      case MB_ICONASTERISK:
-      SendDlgItemMessage(hwnd, stc1, STM_SETICON, LoadIcon(0, IDI_ASTERISK), 0);
+      SendDlgItemMessage(hwnd, stc1, STM_SETICON, 
+			 (WPARAM)LoadIcon(0, IDI_ASTERISK), 0);
       break;
      case MB_ICONHAND:
      default:
-      SendDlgItemMessage(hwnd, stc1, STM_SETICON, LoadIcon(0, IDI_HAND), 0);
+      SendDlgItemMessage(hwnd, stc1, STM_SETICON, 
+			 (WPARAM)LoadIcon(0, IDI_HAND), 0);
       break;
     }
     
@@ -200,7 +205,7 @@ int MessageBox(HWND hWnd, LPSTR text, LPSTR title, WORD type)
                                  sysres_DIALOG_MSGBOX.size, GetCurrentPDB(),
                                  FALSE, FALSE, TRUE, NULL );
     if (!handle) return 0;
-    ret = DialogBoxIndirectParam( GetWindowWord(hWnd, GWW_HINSTANCE),
+    ret = DialogBoxIndirectParam( WIN_GetWindowInstance(hWnd),
                                   handle, hWnd,
                                   GetWndProcEntry16("SystemMessageBoxProc"),
                                   (LONG)&mbox );
diff --git a/windows/nonclient.c b/windows/nonclient.c
index a192262f2f1..aa77bef4ba6 100644
--- a/windows/nonclient.c
+++ b/windows/nonclient.c
@@ -170,7 +170,7 @@ void NC_GetMinMaxInfo( HWND hwnd, POINT *maxSize, POINT *maxPos,
 	pMinMax = (MINMAXINFO *) USER_HEAP_LIN_ADDR( minmaxHandle );
 	memcpy( pMinMax, &MinMax, sizeof(MinMax) );	
 	SendMessage( hwnd, WM_GETMINMAXINFO, 0,
-                     USER_HEAP_SEG_ADDR(minmaxHandle) );
+                     (LPARAM)USER_HEAP_SEG_ADDR(minmaxHandle) );
     }
     else pMinMax = &MinMax;
 
@@ -260,7 +260,7 @@ LONG NC_HandleNCHitTest( HWND hwnd, POINT pt )
     WND *wndPtr = WIN_FindWndPtr( hwnd );
     if (!wndPtr) return HTERROR;
 
-    dprintf_nonclient(stddeb, "NC_HandleNCHitTest: hwnd=%x pt=%d,%d\n", 
+    dprintf_nonclient(stddeb, "NC_HandleNCHitTest: hwnd="NPFMT" pt=%d,%d\n",
 		      hwnd, pt.x, pt.y );
 
     GetWindowRect( hwnd, &rect );
@@ -624,7 +624,7 @@ void NC_DoNCPaint( HWND hwnd, BOOL active, BOOL suppress_menupaint )
 
     WND *wndPtr = WIN_FindWndPtr( hwnd );
 
-    dprintf_nonclient(stddeb, "NC_DoNCPaint: %x %d\n", hwnd, active );
+    dprintf_nonclient(stddeb, "NC_DoNCPaint: "NPFMT" %d\n", hwnd, active );
     if (!wndPtr || !(wndPtr->dwStyle & WS_VISIBLE)) return; /* Nothing to do */
 
     if (!(hdc = GetDCEx( hwnd, 0, DCX_USESTYLE | DCX_WINDOW ))) return;
@@ -639,7 +639,7 @@ void NC_DoNCPaint( HWND hwnd, BOOL active, BOOL suppress_menupaint )
         HICON hIcon = WIN_CLASS_INFO(wndPtr).hIcon;
         if (hIcon)  
         {
-            SendMessage(hwnd, WM_ICONERASEBKGND, hdc, 0);
+            SendMessage(hwnd, WM_ICONERASEBKGND, (WPARAM)hdc, 0);
             DrawIcon(hdc, 0, 0, hIcon);
         }
         ReleaseDC(hwnd, hdc);
@@ -730,9 +730,9 @@ LONG NC_HandleNCPaint( HWND hwnd )
  *
  * Handle a WM_NCACTIVATE message. Called from DefWindowProc().
  */
-LONG NC_HandleNCActivate( HWND hwnd, WORD wParam )
+LONG NC_HandleNCActivate( HWND hwnd, WPARAM wParam )
 {
-    NC_DoNCPaint( hwnd, wParam, FALSE );
+    NC_DoNCPaint( hwnd, (wParam != 0), FALSE );
     return TRUE;
 }
 
@@ -742,9 +742,9 @@ LONG NC_HandleNCActivate( HWND hwnd, WORD wParam )
  *
  * Handle a WM_SETCURSOR message. Called from DefWindowProc().
  */
-LONG NC_HandleSetCursor( HWND hwnd, WORD wParam, LONG lParam )
+LONG NC_HandleSetCursor( HWND hwnd, WPARAM wParam, LPARAM lParam )
 {
-    if (hwnd != wParam) return 0;  /* Don't set the cursor for child windows */
+    if (hwnd != (HWND)wParam) return 0;  /* Don't set the cursor for child windows */
 
     switch(LOWORD(lParam))
     {
@@ -773,23 +773,23 @@ LONG NC_HandleSetCursor( HWND hwnd, WORD wParam, LONG lParam )
 
     case HTLEFT:
     case HTRIGHT:
-	return SetCursor( LoadCursor( 0, IDC_SIZEWE ) );
+	return (LONG)SetCursor( LoadCursor( 0, IDC_SIZEWE ) );
 
     case HTTOP:
     case HTBOTTOM:
-	return SetCursor( LoadCursor( 0, IDC_SIZENS ) );
+	return (LONG)SetCursor( LoadCursor( 0, IDC_SIZENS ) );
 
     case HTTOPLEFT:
     case HTBOTTOMRIGHT:	
-	return SetCursor( LoadCursor( 0, IDC_SIZENWSE ) );
+	return (LONG)SetCursor( LoadCursor( 0, IDC_SIZENWSE ) );
 
     case HTTOPRIGHT:
     case HTBOTTOMLEFT:
-	return SetCursor( LoadCursor( 0, IDC_SIZENESW ) );
+	return (LONG)SetCursor( LoadCursor( 0, IDC_SIZENESW ) );
     }
 
     /* Default cursor: arrow */
-    return SetCursor( LoadCursor( 0, IDC_ARROW ) );
+    return (LONG)SetCursor( LoadCursor( 0, IDC_ARROW ) );
 }
 
 
@@ -799,7 +799,7 @@ LONG NC_HandleSetCursor( HWND hwnd, WORD wParam, LONG lParam )
  * Initialisation of a move or resize, when initiatied from a menu choice.
  * Return hit test code for caption or sizing border.
  */
-static LONG NC_StartSizeMove( HWND hwnd, WORD wParam, POINT *capturePoint )
+static LONG NC_StartSizeMove( HWND hwnd, WPARAM wParam, POINT *capturePoint )
 {
     LONG hittest = 0;
     POINT pt;
@@ -1114,7 +1114,7 @@ static void NC_TrackScrollBar( HWND hwnd, WORD wParam, POINT pt )
 
     do
     {
-        GetMessage( USER_HEAP_SEG_ADDR(hMsg), 0, 0, 0 );
+        GetMessage( (SEGPTR)USER_HEAP_SEG_ADDR(hMsg), 0, 0, 0 );
 	switch(msg->message)
 	{
 	case WM_LBUTTONUP:
@@ -1174,7 +1174,7 @@ static void NC_TrackSysMenu( HWND hwnd, HDC hdc, POINT pt )
  *
  * Handle a WM_NCLBUTTONDOWN message. Called from DefWindowProc().
  */
-LONG NC_HandleNCLButtonDown( HWND hwnd, WORD wParam, LONG lParam )
+LONG NC_HandleNCLButtonDown( HWND hwnd, WPARAM wParam, LPARAM lParam )
 {
     HDC hdc = GetWindowDC( hwnd );
 
@@ -1230,7 +1230,7 @@ LONG NC_HandleNCLButtonDown( HWND hwnd, WORD wParam, LONG lParam )
  *
  * Handle a WM_NCLBUTTONDBLCLK message. Called from DefWindowProc().
  */
-LONG NC_HandleNCLButtonDblClk( HWND hwnd, WORD wParam, LONG lParam )
+LONG NC_HandleNCLButtonDblClk( HWND hwnd, WPARAM wParam, LPARAM lParam )
 {
     /*
      * if this is an icon, send a restore since we are handling
@@ -1262,12 +1262,12 @@ LONG NC_HandleNCLButtonDblClk( HWND hwnd, WORD wParam, LONG lParam )
  *
  * Handle a WM_SYSCOMMAND message. Called from DefWindowProc().
  */
-LONG NC_HandleSysCommand( HWND hwnd, WORD wParam, POINT pt )
+LONG NC_HandleSysCommand( HWND hwnd, WPARAM wParam, POINT pt )
 {
     WND *wndPtr = WIN_FindWndPtr( hwnd );
 
-    dprintf_nonclient(stddeb, "Handling WM_SYSCOMMAND %x %d,%d\n", 
-		      wParam, pt.x, pt.y );
+    dprintf_nonclient(stddeb, "Handling WM_SYSCOMMAND %lx %d,%d\n", 
+		      (DWORD)wParam, pt.x, pt.y );
 
     if (wndPtr->dwStyle & WS_CHILD) ScreenToClient( wndPtr->hwndParent, &pt );
 
diff --git a/windows/painting.c b/windows/painting.c
index b188ac39d10..7e166320d47 100644
--- a/windows/painting.c
+++ b/windows/painting.c
@@ -47,7 +47,7 @@ HDC BeginPaint( HWND hwnd, LPPAINTSTRUCT lps )
     DeleteObject( hrgnUpdate );
     if (!lps->hdc)
     {
-        fprintf( stderr, "GetDCEx() failed in BeginPaint(), hwnd=%x\n", hwnd );
+        fprintf( stderr, "GetDCEx() failed in BeginPaint(), hwnd="NPFMT"\n", hwnd );
         return 0;
     }
 
@@ -57,7 +57,7 @@ HDC BeginPaint( HWND hwnd, LPPAINTSTRUCT lps )
     if (wndPtr->flags & WIN_NEEDS_ERASEBKGND)
     {
         wndPtr->flags &= ~WIN_NEEDS_ERASEBKGND;
-        lps->fErase = !SendMessage( hwnd, WM_ERASEBKGND, lps->hdc, 0 );
+        lps->fErase = !SendMessage( hwnd, WM_ERASEBKGND, (WPARAM)lps->hdc, 0 );
     }
     else lps->fErase = TRUE;
 
@@ -93,11 +93,17 @@ void PaintRect(HWND hwndParent, HWND hwnd, HDC hdc, HBRUSH hbrush, LPRECT rect)
 {
       /* Send WM_CTLCOLOR message if needed */
 
-    if (hbrush <= CTLCOLOR_MAX)
+    if ((DWORD)hbrush <= CTLCOLOR_MAX)
     {
 	if (!hwndParent) return;
+#ifdef WINELIB32
+	hbrush = (HBRUSH)SendMessage( hwndParent, 
+				      WM_CTLCOLORMSGBOX+(DWORD)hbrush,
+				      (WPARAM)hdc, (LPARAM)hwnd );
+#else
 	hbrush = (HBRUSH)SendMessage( hwndParent, WM_CTLCOLOR,
 				      hdc, MAKELONG( hwnd, hbrush ) );
+#endif
     }
     if (hbrush) FillRect( hdc, rect, hbrush );
 }
@@ -108,8 +114,13 @@ void PaintRect(HWND hwndParent, HWND hwnd, HDC hdc, HBRUSH hbrush, LPRECT rect)
  */
 HBRUSH GetControlBrush( HWND hwnd, HDC hdc, WORD control )
 {
+#ifdef WINELIB32
+    return (HBRUSH)SendMessage( GetParent(hwnd), WM_CTLCOLOR+control,
+                                (WPARAM)hdc, (LPARAM)hwnd );
+#else
     return (HBRUSH)SendMessage( GetParent(hwnd), WM_CTLCOLOR,
                                 hdc, MAKELONG( hwnd, control ) );
+#endif
 }
 
 
@@ -129,13 +140,13 @@ BOOL RedrawWindow( HWND hwnd, LPRECT rectUpdate, HRGN hrgnUpdate, UINT flags )
 
     if (rectUpdate)
     {
-        dprintf_win( stddeb, "RedrawWindow: %x %d,%d-%d,%d %x flags=%04x\n",
+        dprintf_win( stddeb, "RedrawWindow: "NPFMT" %d,%d-%d,%d "NPFMT" flags=%04x\n",
                      hwnd, rectUpdate->left, rectUpdate->top,
                      rectUpdate->right, rectUpdate->bottom, hrgnUpdate, flags);
     }
     else
     {
-        dprintf_win( stddeb, "RedrawWindow: %x NULL %x flags=%04x\n",
+        dprintf_win( stddeb, "RedrawWindow: "NPFMT" NULL "NPFMT" flags=%04x\n",
                      hwnd, hrgnUpdate, flags);
     }
     GetClientRect( hwnd, &rectClient );
@@ -239,7 +250,7 @@ BOOL RedrawWindow( HWND hwnd, LPRECT rectUpdate, HRGN hrgnUpdate, UINT flags )
                 if (!(wndPtr->dwStyle & WS_MINIMIZE)
                     || !WIN_CLASS_INFO(wndPtr).hIcon)
                 {
-                    if (SendMessage( hwnd, WM_ERASEBKGND, hdc, 0 ))
+                    if (SendMessage( hwnd, WM_ERASEBKGND, (WPARAM)hdc, 0 ))
                         wndPtr->flags &= ~WIN_NEEDS_ERASEBKGND;
                 }
                 ReleaseDC( hwnd, hdc );
diff --git a/windows/property.c b/windows/property.c
index f3e88bab9c6..601615f8536 100644
--- a/windows/property.c
+++ b/windows/property.c
@@ -31,7 +31,7 @@ BOOL SetProp( HWND hwnd, SEGPTR str, HANDLE hData )
     PROPERTY *prop;
     WND *wndPtr;
 
-    dprintf_prop( stddeb, "SetProp: %04x %08lx %04x\n", hwnd, str, hData );
+    dprintf_prop( stddeb, "SetProp: "NPFMT" %08lx "NPFMT"\n", hwnd, str, hData );
     if (!(wndPtr = WIN_FindWndPtr( hwnd ))) return FALSE;
     hProp = USER_HEAP_ALLOC( sizeof(PROPERTY) + 
                              (HIWORD(str) ? strlen(PTR_SEG_TO_LIN(str)) : 0 ));
@@ -62,7 +62,7 @@ HANDLE GetProp( HWND hwnd, SEGPTR str )
     HANDLE hProp;
     WND *wndPtr;
 
-    dprintf_prop( stddeb, "GetProp: %04x %08lx\n", hwnd, str );
+    dprintf_prop( stddeb, "GetProp: "NPFMT" %08lx\n", hwnd, str );
     if (!(wndPtr = WIN_FindWndPtr( hwnd ))) return 0;
     hProp = wndPtr->hProp;
     while (hProp)
@@ -88,7 +88,7 @@ HANDLE RemoveProp( HWND hwnd, SEGPTR str )
     HANDLE *hProp;
     WND *wndPtr;
 
-    dprintf_prop( stddeb, "RemoveProp: %04x %08lx\n", hwnd, str );
+    dprintf_prop( stddeb, "RemoveProp: "NPFMT" %08lx\n", hwnd, str );
     if (!(wndPtr = WIN_FindWndPtr( hwnd ))) return 0;
     hProp = &wndPtr->hProp;
     while (*hProp)
@@ -119,23 +119,25 @@ int EnumProps( HWND hwnd, FARPROC func )
     HANDLE hProp;
     WND *wndPtr;
 
-    dprintf_prop( stddeb, "EnumProps: %04x %08lx\n", hwnd, (LONG)func );
+    dprintf_prop( stddeb, "EnumProps: "NPFMT" %08lx\n", hwnd, (LONG)func );
     if (!(wndPtr = WIN_FindWndPtr( hwnd ))) return 0;
     hProp = wndPtr->hProp;
     while (hProp)
     {
         PROPERTY *prop = (PROPERTY *)USER_HEAP_LIN_ADDR(hProp);
         
-        dprintf_prop( stddeb, "  Callback: atom=%04x data=%04x str='%s'\n",
+        dprintf_prop( stddeb, "  Callback: atom=%04x data="NPFMT" str='%s'\n",
                       prop->atom, prop->hData, prop->string );
 
           /* Already get the next in case the callback */
           /* function removes the current property.    */
         hProp = prop->next;
         ret = CallEnumPropProc( func, hwnd,
-                                prop->atom ? MAKELONG( prop->atom, 0 ) :
-                                USER_HEAP_SEG_ADDR(hProp) +
-                                ((int)prop->string - (int)prop),
+                                prop->atom ? 
+				  (LONG)MAKELONG( prop->atom, 0 )
+				:
+                                  (LONG)(USER_HEAP_SEG_ADDR(hProp) +
+                                         ((int)prop->string - (int)prop)),
                                 prop->hData );
         if (!ret) break;
     }
diff --git a/windows/timer.c b/windows/timer.c
index 88b70735ad7..797f66e6190 100644
--- a/windows/timer.c
+++ b/windows/timer.c
@@ -114,8 +114,8 @@ BOOL TIMER_CheckTimer( LONG *next, MSG *msg, HWND hwnd, BOOL remove )
 	TIMER_RestartTimer( pTimer, curTime );
     }
 
-    dprintf_timer(stddeb, "Timer expired: %p, %04x, %04x, %04x, %08lx\n", 
-		  pTimer, pTimer->hwnd, pTimer->msg, pTimer->id, pTimer->proc);
+    dprintf_timer(stddeb, "Timer expired: %p, "NPFMT", %04x, %04x, %08lx\n", 
+		  pTimer, pTimer->hwnd, pTimer->msg, pTimer->id, (DWORD)pTimer->proc);
       /* Build the message */
     msg->hwnd    = pTimer->hwnd;
     msg->message = pTimer->msg;
@@ -170,8 +170,8 @@ static WORD TIMER_SetTimer( HWND hwnd, WORD id, WORD timeout,
     pTimer->timeout = timeout;
     pTimer->expires = GetTickCount() + timeout;
     pTimer->proc    = proc;
-    dprintf_timer(stddeb, "Timer added: %p, %04x, %04x, %04x, %08lx\n", 
-		  pTimer, pTimer->hwnd, pTimer->msg, pTimer->id, pTimer->proc);
+    dprintf_timer(stddeb, "Timer added: %p, "NPFMT", %04x, %04x, %08lx\n", 
+		  pTimer, pTimer->hwnd, pTimer->msg, pTimer->id, (DWORD)pTimer->proc);
     TIMER_InsertTimer( pTimer );
     MSG_IncTimerCount( GetTaskQueue(0) );
     if (!id)
@@ -217,7 +217,7 @@ static BOOL TIMER_KillTimer( HWND hwnd, WORD id, BOOL sys )
  */
 WORD SetTimer( HWND hwnd, WORD id, WORD timeout, FARPROC proc )
 {
-    dprintf_timer(stddeb, "SetTimer: %d %d %d %08lx\n", hwnd, id, timeout, (LONG)proc );
+    dprintf_timer(stddeb, "SetTimer: "NPFMT" %d %d %08lx\n", hwnd, id, timeout, (LONG)proc );
     return TIMER_SetTimer( hwnd, id, timeout, proc, FALSE );
 }
 
@@ -227,7 +227,7 @@ WORD SetTimer( HWND hwnd, WORD id, WORD timeout, FARPROC proc )
  */
 WORD SetSystemTimer( HWND hwnd, WORD id, WORD timeout, FARPROC proc )
 {
-    dprintf_timer(stddeb, "SetSystemTimer: %d %d %d %08lx\n", 
+    dprintf_timer(stddeb, "SetSystemTimer: "NPFMT" %d %d %08lx\n", 
 		  hwnd, id, timeout, (LONG)proc );
     return TIMER_SetTimer( hwnd, id, timeout, proc, TRUE );
 }
@@ -238,7 +238,7 @@ WORD SetSystemTimer( HWND hwnd, WORD id, WORD timeout, FARPROC proc )
  */
 BOOL KillTimer( HWND hwnd, WORD id )
 {
-    dprintf_timer(stddeb, "KillTimer: %d %d\n", hwnd, id );
+    dprintf_timer(stddeb, "KillTimer: "NPFMT" %d\n", hwnd, id );
     return TIMER_KillTimer( hwnd, id, FALSE );
 }
 
@@ -248,6 +248,6 @@ BOOL KillTimer( HWND hwnd, WORD id )
  */
 BOOL KillSystemTimer( HWND hwnd, WORD id )
 {
-    dprintf_timer(stddeb, "KillSystemTimer: %d %d\n", hwnd, id );
+    dprintf_timer(stddeb, "KillSystemTimer: "NPFMT" %d\n", hwnd, id );
     return TIMER_KillTimer( hwnd, id, TRUE );
 }
diff --git a/windows/utility.c b/windows/utility.c
index 61df0cb6f17..8838394ee67 100644
--- a/windows/utility.c
+++ b/windows/utility.c
@@ -423,3 +423,25 @@ int wvsprintf(LPSTR buf, LPSTR format, LPSTR args)
 	free(newargs);
 	return result;
 };
+
+/******************************************************************************
+ *                              DragDetect ( USER.465 )
+ *
+ * Hardly ever called at all
+ */
+
+
+/******************************************************************************
+ *                              DragObject ( USER.464 )
+ *
+ * responsible for generation of WM_QUERYDROPOBJECT, WM_DRAGLOOP, 
+ *                               WM_DRAGMOVE,        WM_DROPOBJECT
+ */
+LONG DragObject(HWND hDesktop, HWND hWnd, UINT Unknown1, WORD Unknown2, WORD Unknown3, HCURSOR hCursor)
+{
+
+ fprintf(stdnimp,"DragObject: EmptyStub!!!\n");
+ return 0;
+}
+ 
+
diff --git a/windows/win.c b/windows/win.c
index d7e2d2d6538..164b563beff 100644
--- a/windows/win.c
+++ b/windows/win.c
@@ -14,8 +14,7 @@
 #include "dce.h"
 #include "sysmetrics.h"
 #include "menu.h"
-#include "icon.h"
-#include "cursor.h"
+#include "cursoricon.h"
 #include "event.h"
 #include "message.h"
 #include "nonclient.h"
@@ -140,7 +139,7 @@ HWND WIN_FindWinToRepaint( HWND hwnd )
     for ( ; hwnd != 0; hwnd = wndPtr->hwndNext )
     {
 	if (!(wndPtr = WIN_FindWndPtr( hwnd ))) return 0;
-	dprintf_win( stddeb, "WIN_FindWinToRepaint: %04x, style %08lx\n",
+	dprintf_win( stddeb, "WIN_FindWinToRepaint: "NPFMT", style %08lx\n",
 		     hwnd, wndPtr->dwStyle );
         if (!(wndPtr->dwStyle & WS_VISIBLE) || (wndPtr->flags & WIN_NO_REDRAW))
             continue;
@@ -165,16 +164,22 @@ HWND WIN_FindWinToRepaint( HWND hwnd )
  * Send a WM_PARENTNOTIFY to all ancestors of the given window, unless
  * the window has the WS_EX_NOPARENTNOTIFY style.
  */
-void WIN_SendParentNotify( HWND hwnd, WORD event, LONG lParam )
+void WIN_SendParentNotify( HWND hwnd, WORD event, WORD idChild, LONG lValue )
 {
     WND *wndPtr = WIN_FindWndPtr( hwnd );
     
     while (wndPtr && (wndPtr->dwStyle & WS_CHILD))
     {
         if (wndPtr->dwExStyle & WS_EX_NOPARENTNOTIFY) break;
-	SendMessage( wndPtr->hwndParent, WM_PARENTNOTIFY, event, lParam );
+#ifdef WINELIB32
+	SendMessage( wndPtr->hwndParent, WM_PARENTNOTIFY, 
+		     MAKEWPARAM(event,idChild),
+		     (LPARAM)lValue );
+#else
+	SendMessage( wndPtr->hwndParent, WM_PARENTNOTIFY, event,
+		     MAKELPARAM(LOWORD(lValue), idChild) );
+#endif
         wndPtr = WIN_FindWndPtr( wndPtr->hwndParent );
-
     }
 }
 
@@ -269,7 +274,7 @@ BOOL WIN_CreateDesktopWindow(void)
     SendMessage( hwndDesktop, WM_NCCREATE, 0, 0 );
     if ((hdc = GetDC( hwndDesktop )) != 0)
     {
-        SendMessage( hwndDesktop, WM_ERASEBKGND, hdc, 0 );
+        SendMessage( hwndDesktop, WM_ERASEBKGND, (WPARAM)hdc, 0 );
         ReleaseDC( hwndDesktop, hdc );
     }
     return TRUE;
@@ -315,9 +320,9 @@ HWND CreateWindowEx( DWORD exStyle, SEGPTR className, SEGPTR windowName,
     else
         dprintf_win( stddeb, "%04x ", LOWORD(className) );
 
-    dprintf_win(stddeb, "%08lx %08lx %d,%d %dx%d %04x %04x %04x %08lx\n",
+    dprintf_win(stddeb, "%08lx %08lx %d,%d %dx%d "NPFMT" "NPFMT" "NPFMT" %08lx\n",
 		exStyle, style, x, y, width, height,
-		parent, menu, instance, data);
+		parent, menu, instance, (DWORD)data);
 
     if (x == CW_USEDEFAULT) x = y = 0;
     if (width == CW_USEDEFAULT)
@@ -332,7 +337,7 @@ HWND CreateWindowEx( DWORD exStyle, SEGPTR className, SEGPTR windowName,
     {
 	/* Make sure parent is valid */
         if (!IsWindow( parent )) {
-	    dprintf_win(stddeb,"CreateWindowEx: Parent %x is not a window\n", parent);
+	    dprintf_win(stddeb,"CreateWindowEx: Parent "NPFMT" is not a window\n", parent);
 	    return 0;
 	}
     }
@@ -436,11 +441,6 @@ HWND CreateWindowEx( DWORD exStyle, SEGPTR className, SEGPTR windowName,
 
     if (!(style & WS_CHILD) && (rootWindow == DefaultRootWindow(display)))
     {
-        CURSORALLOC *cursor;
-        HCURSOR hCursor = classPtr->wc.hCursor;
-        if (!hCursor) hCursor = LoadCursor( 0, IDC_ARROW );
-        cursor = (CURSORALLOC *) GlobalLock(hCursor);
-
         win_attr.event_mask = ExposureMask | KeyPressMask | KeyReleaseMask |
                               PointerMotionMask | ButtonPressMask |
                               ButtonReleaseMask | FocusChangeMask;
@@ -448,7 +448,7 @@ HWND CreateWindowEx( DWORD exStyle, SEGPTR className, SEGPTR windowName,
         win_attr.colormap      = COLOR_WinColormap;
         win_attr.backing_store = Options.backingstore ? WhenMapped : NotUseful;
         win_attr.save_under    = ((classPtr->wc.style & CS_SAVEBITS) != 0);
-        win_attr.cursor        = cursor ? cursor->xcursor : None;
+        win_attr.cursor        = CURSORICON_XCursor;
         wndPtr->window = XCreateWindow( display, rootWindow, x, y,
                                         width, height, 0, CopyFromParent,
                                         InputOutput, CopyFromParent,
@@ -457,7 +457,6 @@ HWND CreateWindowEx( DWORD exStyle, SEGPTR className, SEGPTR windowName,
                                         CWBackingStore, &win_attr );
         XStoreName( display, wndPtr->window, PTR_SEG_TO_LIN(windowName) );
         EVENT_RegisterWindow( wndPtr->window, hwnd );
-        GlobalUnlock( hCursor );
     }
     
     if ((style & WS_CAPTION) && !(style & WS_CHILD))
@@ -507,7 +506,7 @@ HWND CreateWindowEx( DWORD exStyle, SEGPTR className, SEGPTR windowName,
       /* Create a copy of SysMenu */
     if (style & WS_SYSMENU) wndPtr->hSysMenu = CopySysMenu();
 
-    WIN_SendParentNotify( hwnd, WM_CREATE, MAKELONG( hwnd, wndPtr->wIDmenu ) );
+    WIN_SendParentNotify( hwnd, WM_CREATE, wndPtr->wIDmenu, (LONG)hwnd );
 
     /* Show the window, maximizing or minimizing if needed */
 
@@ -528,7 +527,7 @@ HWND CreateWindowEx( DWORD exStyle, SEGPTR className, SEGPTR windowName,
     }
     else if (style & WS_VISIBLE) ShowWindow( hwnd, SW_SHOW );
 
-    dprintf_win(stddeb, "CreateWindowEx: return %04X \n", hwnd);
+    dprintf_win(stddeb, "CreateWindowEx: return "NPFMT" \n", hwnd);
     return hwnd;
 }
 
@@ -541,7 +540,7 @@ BOOL DestroyWindow( HWND hwnd )
     WND * wndPtr;
     CLASS * classPtr;
 
-    dprintf_win(stddeb, "DestroyWindow (%04x)\n", hwnd);
+    dprintf_win(stddeb, "DestroyWindow ("NPFMT")\n", hwnd);
     
       /* Initialisation */
 
@@ -556,7 +555,7 @@ BOOL DestroyWindow( HWND hwnd )
 		      SWP_NOZORDER | SWP_NOMOVE | SWP_NOSIZE );
     if ((hwnd == GetCapture()) || IsChild( hwnd, GetCapture() ))
 	ReleaseCapture();
-    WIN_SendParentNotify( hwnd, WM_DESTROY, MAKELONG(hwnd, wndPtr->wIDmenu) );
+    WIN_SendParentNotify( hwnd, WM_DESTROY, wndPtr->wIDmenu, (LONG)hwnd );
 
       /* Recursively destroy owned windows */
 
@@ -620,7 +619,8 @@ HWND FindWindow( SEGPTR ClassMatch, LPSTR TitleMatch )
 
     if (ClassMatch)
     {
-	hclass = CLASS_FindClassByName( ClassMatch, 0xffff, &classPtr );
+	hclass = CLASS_FindClassByName( ClassMatch, (HINSTANCE)0xffff,
+                                        &classPtr );
 	if (!hclass) return 0;
     }
     else hclass = 0;
@@ -708,13 +708,31 @@ WORD GetWindowWord( HWND hwnd, short offset )
     switch(offset)
     {
 	case GWW_ID:         return wndPtr->wIDmenu;
-	case GWW_HWNDPARENT: return wndPtr->hwndParent;
-	case GWW_HINSTANCE:  return wndPtr->hInstance;
+#ifdef WINELIB32
+        case GWW_HWNDPARENT:
+        case GWW_HINSTANCE: 
+            fprintf(stderr,"GetWindowWord called with offset %d.\n",offset);
+            return 0;
+#else
+	case GWW_HWNDPARENT: return (WORD)wndPtr->hwndParent;
+	case GWW_HINSTANCE:  return (WORD)wndPtr->hInstance;
+#endif
     }
     return 0;
 }
 
 
+/**********************************************************************
+ *	     WIN_GetWindowInstance
+ */
+HINSTANCE WIN_GetWindowInstance(HWND hwnd)
+{
+    WND * wndPtr = WIN_FindWndPtr( hwnd );
+    if (!wndPtr) return (HINSTANCE)0;
+    return wndPtr->hInstance;
+}
+
+
 /**********************************************************************
  *	     SetWindowWord    (USER.134)
  */
@@ -727,7 +745,13 @@ WORD SetWindowWord( HWND hwnd, short offset, WORD newval )
     else switch(offset)
     {
 	case GWW_ID:        ptr = &wndPtr->wIDmenu;   break;
-	case GWW_HINSTANCE: ptr = &wndPtr->hInstance; break;
+#ifdef WINELIB32
+	case GWW_HINSTANCE:
+            fprintf(stderr,"SetWindowWord called with offset %d.\n",offset);
+            return 0;
+#else
+	case GWW_HINSTANCE: ptr = (WORD*)&wndPtr->hInstance; break;
+#endif
 	default: return 0;
     }
     retval = *ptr;
@@ -749,6 +773,10 @@ LONG GetWindowLong( HWND hwnd, short offset )
 	case GWL_STYLE:   return wndPtr->dwStyle;
         case GWL_EXSTYLE: return wndPtr->dwExStyle;
 	case GWL_WNDPROC: return (LONG)wndPtr->lpfnWndProc;
+#ifdef WINELIB32
+	case GWW_HWNDPARENT: return (LONG)wndPtr->hwndParent;
+	case GWW_HINSTANCE:  return (LONG)wndPtr->hInstance;
+#endif
     }
     return 0;
 }
@@ -793,8 +821,8 @@ int GetWindowText( HWND hwnd, LPSTR lpString, int nMaxCount )
       /* We have to allocate a buffer on the USER heap */
       /* to be able to pass its address to 16-bit code */
     if (!(handle = USER_HEAP_ALLOC( nMaxCount ))) return 0;
-    len = (int)SendMessage( hwnd, WM_GETTEXT, (WORD)nMaxCount, 
-                            USER_HEAP_SEG_ADDR(handle) );
+    len = (int)SendMessage( hwnd, WM_GETTEXT, (WPARAM)nMaxCount, 
+                            (LPARAM)USER_HEAP_SEG_ADDR(handle) );
     strncpy( lpString, USER_HEAP_LIN_ADDR(handle), nMaxCount );
     USER_HEAP_FREE( handle );
     return len;
@@ -817,7 +845,7 @@ void SetWindowText( HWND hwnd, LPSTR lpString )
       /* to be able to pass its address to 16-bit code */
     if (!(handle = USER_HEAP_ALLOC( strlen(lpString)+1 ))) return;
     strcpy( USER_HEAP_LIN_ADDR(handle), lpString );
-    SendMessage( hwnd, WM_SETTEXT, 0, USER_HEAP_SEG_ADDR(handle) );
+    SendMessage( hwnd, WM_SETTEXT, 0, (LPARAM)USER_HEAP_SEG_ADDR(handle) );
     USER_HEAP_FREE( handle );
 }
 
@@ -1197,7 +1225,7 @@ HWND SetSysModalWindow(HWND hWnd)
 {
 	HWND hWndOldModal = hWndSysModal;
 	hWndSysModal = hWnd;
-	dprintf_win(stdnimp,"EMPTY STUB !! SetSysModalWindow(%04X) !\n", hWnd);
+	dprintf_win(stdnimp,"EMPTY STUB !! SetSysModalWindow("NPFMT") !\n", hWnd);
 	return hWndOldModal;
 }
 
diff --git a/windows/winpos.c b/windows/winpos.c
index 5ef9e45e7c5..32ca21c6da7 100644
--- a/windows/winpos.c
+++ b/windows/winpos.c
@@ -7,6 +7,7 @@
 #include "sysmetrics.h"
 #include "user.h"
 #include "win.h"
+#include "event.h"
 #include "message.h"
 #include "stackframe.h"
 #include "winpos.h"
@@ -309,7 +310,7 @@ BOOL MoveWindow( HWND hwnd, short x, short y, short cx, short cy, BOOL repaint)
 {    
     int flags = SWP_NOZORDER | SWP_NOACTIVATE;
     if (!repaint) flags |= SWP_NOREDRAW;
-    dprintf_win(stddeb, "MoveWindow: %d %d,%d %dx%d %d\n", 
+    dprintf_win(stddeb, "MoveWindow: "NPFMT" %d,%d %dx%d %d\n", 
 	    hwnd, x, y, cx, cy, repaint );
     return SetWindowPos( hwnd, 0, x, y, cx, cy, flags );
 }
@@ -328,7 +329,7 @@ BOOL ShowWindow( HWND hwnd, int cmd )
 
     if (!wndPtr) return FALSE;
 
-    dprintf_win(stddeb,"ShowWindow: hwnd=%04X, cmd=%d\n", hwnd, cmd);
+    dprintf_win(stddeb,"ShowWindow: hwnd="NPFMT", cmd=%d\n", hwnd, cmd);
 
     wasVisible = (wndPtr->dwStyle & WS_VISIBLE) != 0;
 
@@ -542,8 +543,14 @@ HWND WINPOS_ChangeActiveWindow( HWND hwnd, BOOL mouseMsg )
     if (hwndActive)
     {
 	if (!SendMessage( hwndActive, WM_NCACTIVATE, FALSE, 0 )) return 0;
+#ifdef WINELIB32
+	SendMessage( hwndActive, WM_ACTIVATE,
+		     MAKEWPARAM( WA_INACTIVE, IsIconic(hwndActive) ),
+		     (LPARAM)hwnd );
+#else
 	SendMessage( hwndActive, WM_ACTIVATE, WA_INACTIVE,
 		     MAKELONG( IsIconic(hwndActive), hwnd ) );
+#endif
 	/* Send WM_ACTIVATEAPP here */
     }
 
@@ -555,8 +562,15 @@ HWND WINPOS_ChangeActiveWindow( HWND hwnd, BOOL mouseMsg )
 
 	/* Send WM_ACTIVATEAPP here */
 	SendMessage( hwnd, WM_NCACTIVATE, TRUE, 0 );
+#ifdef WINELIB32
+	SendMessage( hwnd, WM_ACTIVATE,
+		     MAKEWPARAM( mouseMsg ? WA_CLICKACTIVE : WA_ACTIVE, 
+				 IsIconic(hwnd) )
+		     , (LPARAM)prevActive );
+#else
 	SendMessage( hwnd, WM_ACTIVATE, mouseMsg ? WA_CLICKACTIVE : WA_ACTIVE,
 		     MAKELONG( IsIconic(hwnd), prevActive ) );
+#endif
     }
     return prevActive;
 }
@@ -919,6 +933,7 @@ BOOL SetWindowPos( HWND hwnd, HWND hwndInsertAfter, INT x, INT y,
       /* Repaint the window */
 
     if (wndPtr->window) MSG_Synchronize();  /* Wait for all expose events */
+    EVENT_DummyMotionNotify(); /* Simulate a mouse event to set the cursor */
     if ((flags & SWP_FRAMECHANGED) && !(flags & SWP_NOREDRAW))
         RedrawWindow( winpos.hwnd, NULL, 0,
                       RDW_INVALIDATE | RDW_FRAME | RDW_ERASE );
@@ -928,6 +943,8 @@ BOOL SetWindowPos( HWND hwnd, HWND hwndInsertAfter, INT x, INT y,
 
       /* And last, send the WM_WINDOWPOSCHANGED message */
 
+    winpos.flags |= SWP_NOMOVE; /* prevent looping.. window is already moved ??? (FIXME)*/
+
     if (!(winpos.flags & SWP_NOSENDCHANGING))
         SendMessage( winpos.hwnd, WM_WINDOWPOSCHANGED,
                      0, MAKE_SEGPTR(&winpos) );
@@ -1057,7 +1074,7 @@ BOOL EndDeferWindowPos( HDWP hdwp )
  */
 void TileChildWindows( HWND parent, WORD action )
 {
-    printf("STUB TileChildWindows(%04X, %d)\n", parent, action);
+    printf("STUB TileChildWindows("NPFMT", %d)\n", parent, action);
 }
 
 /***********************************************************************
@@ -1065,5 +1082,5 @@ void TileChildWindows( HWND parent, WORD action )
  */
 void CascadeChildWindows( HWND parent, WORD action )
 {
-    printf("STUB CascadeChildWindows(%04X, %d)\n", parent, action);
+    printf("STUB CascadeChildWindows("NPFMT", %d)\n", parent, action);
 }
-- 
GitLab