From e658d82093dcd31c237c2e1fc3f92e1ba74eecda Mon Sep 17 00:00:00 2001
From: Alexandre Julliard <julliard@winehq.org>
Date: Sun, 30 Nov 1997 17:45:40 +0000
Subject: [PATCH] Release 971130

Sat Nov 29 12:35:26 1997  Alexandre Julliard  <julliard@lrc.epfl.ch>

	* [if1632/builtin.c]
	Build a complete PE header for builtin Win32 modules.

	* [loader/pe_image.c] [loader/module.c]
	HMODULE32 now points to the loading address of the module. There
	is no longer a separate PE_MODULE structure.

Fri Nov 28 11:21:47 1997  Marcus Meissner <msmeissn@cip.informatik.uni-erlangen.de>

	* [ole/*][configure.in][Makefile.in][include/interfaces.h]
	  [if1632/olesvr32.spec][if1632/olecli32.spec]
	New directory, moved OLE stuff there.
	new .spec files for olecli32,olesvr32, some stubs added.

	* [misc/shell.c]
	Added support for extracting icons from PE dlls.

	* [misc/shellord.c][if1632/shell32.spec]
	Added a huge heap of ordinal only exported shell functions
	(will work only in Win95).

	* [loader/task.c]
	Hack to make MakeProcInstance16 work in all cases (mplayer.exe).

	* [win32/string32.c][include/string32.h]
	Obsolete, removed.

	* [windows/keyboard.c]
	Added *RegisterHotkey.

	* [objects/font.c][objects/text.c]
	Added GetFontLanguageInfo, GetTextCharsetInfo.

Wed Nov 26 18:10:40 1997  Uwe Bonnes  <bon@elektron.ikp.physik.tu-darmstadt.de>

	* [misc/network.c]
	In WNetGetConnection16 return the Drive label and not the DOS-Cwd.
	Makes Wordview 6 start on a network connected machine.

	* [controls/status.c]
	Catch a Null pointer in SW_SetText.

	* [files/dos_fs.c]
 	Add NT5 functions GetLongPathName32.

	* [files/file.c]
	Make GetTempFileName16 accept drive 0 (Current Drive) too.
	Handle more errors and be more verbose in FILE_SetDosError, fix
	an error in DeleteFile32W

	* [memory/virtual.c]
	Implement FlushViewOfFile.

	* [misc/crtdll]
	Implement _rotl and splitpath and add a stub for
	_abnormal_termination.

	* [misc/printdrv.c]
	Stub for EnumPrinters32A.

	* [win32/newfns]
	Add Stub for QueryPerformanceFrequency, change return value
	for QueryPerformanceCounter.
 	Add stub for DeviceIoControl.

Tue Nov 25 15:55:01 1997 Martin Boehme <boehme@informatik.mu-luebeck.de>

	* [controls/combo.c] [controls/edit.c] [windows/defwnd.c]
	  [windows/winpos.c] [windows/win.c]
	Removed WIN_NO_REDRAW flag.

Tue Nov 25 13:20:35 1997  Douglas Ridgway <ridgway@taiga.v-wave.com>

	* [graphics/x11drv/bitblt.c]
	Fixed memory leak in BITBLT_GetDstArea.

Sun Nov 23 14:05:23 1997  Andreas Mohr <100.30936@germany.net>

	* [files/directory.c]
	Export windows system directory to environment.

	* [if1632/Makefile.in] [if1632/builtin.c] [if1632/w32skrnl.spec]
	  [if1632/win32s16.spec] [misc/w32scomb.c] [misc/w32skrnl.c]
	Added Win32s DLLs W32SKRNL and WIN32S16.

	* [if1632/kernel32.spec] [loader/module.c]
	Added misc functions for Win32s.

	* [if1632/kernel.spec] [loader/task.c]
	Added DefineHandleTable().

	* [scheduler/process.c]
	Fixed SetEnvironmentVariable32A() to avoid heap corruption.

Sat Nov 22 14:11:42 1997  Kristian Nielsen  <kristian.nielsen@risoe.dk>

	* [windows/painting.c]
	Fix leak in BeginPaint16() for CS_PARENTDC windows where the
	update region was not properly released.

Thu Nov 20 03:55:29 1997  Gordon Chaffee <chaffee@CS.Berkeley.EDU>

	* [loader/pe_image.c]
	Implemented forwarded DLL functions.

	* [objects/dib.c]
	Added support for 16- and 32-bit mode DIBs.
	Support negative bitmap heights.

	* [win32/process.c]
	Added stub for CreateProcess32W.

	* [win32/security.c] [include/ntdll.h]
	Added stubs for LookupAccountSid32A/W.

	* [scheduler/process.c]
	Use the size specified in the PE header for the process heap.

Mon Nov 17 00:53:35 1997  Len White <phreak@cgocable.net>

	* [msdos/int3d.c]
	New file. Stubs for int3d.

Sun Nov 16 12:30:00 PST 1997  Jason Schonberg  <schon@mti.sgi.com>

	* [include/aspi.h]
	Changed comment style from C++ to C.
---
 ANNOUNCE                     |  18 +-
 AUTHORS                      |   6 +
 BUGS                         |  10 +-
 ChangeLog                    | 133 ++++++++-
 Makefile.in                  |  10 +-
 configure                    |   4 +
 configure.in                 |   2 +
 controls/combo.c             |  28 +-
 controls/edit.c              | 108 ++++---
 controls/status.c            |   6 +-
 debugger/break.c             |   7 +-
 debugger/expr.c              |   5 +-
 debugger/hash.c              |  30 +-
 debugger/msc.c               |  47 ++--
 files/directory.c            |   6 +-
 files/dos_fs.c               |  36 +++
 files/file.c                 |  14 +-
 graphics/escape.c            |   2 +
 graphics/x11drv/bitblt.c     |   1 +
 if1632/Makefile.in           |   4 +
 if1632/advapi32.spec         |   4 +-
 if1632/builtin.c             | 280 ++++++++++++-------
 if1632/crtdll.spec           |   6 +-
 if1632/gdi.spec              |   2 +-
 if1632/gdi32.spec            |   8 +-
 if1632/kernel.spec           |  23 +-
 if1632/kernel32.spec         |  65 ++++-
 if1632/mpr.spec              |   4 +-
 if1632/ntdll.spec            |  20 ++
 if1632/ole32.spec            |   2 +-
 if1632/olecli.spec           |   6 +-
 if1632/olecli32.spec         |  59 ++++
 if1632/olesvr.spec           |  10 +-
 if1632/olesvr32.spec         |  15 +
 if1632/shell.spec            |   2 +-
 if1632/shell32.spec          | 157 ++++++++++-
 if1632/user.spec             |   7 +-
 if1632/user32.spec           |  18 +-
 if1632/w32skrnl.spec         | 139 ++++++++++
 if1632/win32s16.spec         |  58 ++++
 if1632/winspool.spec         |   2 +-
 if1632/wprocs.spec           |   2 +-
 include/aspi.h               | 128 ++++-----
 include/combo.h              |   1 +
 include/commdlg.h            |  14 -
 include/compobj.h            |  19 +-
 include/debugger.h           |   4 +-
 include/interfaces.h         |  45 +++
 include/module.h             |   9 +-
 include/ntdll.h              |  17 +-
 include/ole.h                |   3 +-
 include/ole2.h               |   2 +
 include/pe_image.h           |  16 +-
 include/peexe.h              |  11 +
 include/shell.h              |  11 +
 include/shlobj.h             |  65 +++++
 include/string32.h           |  16 --
 include/version.h            |   2 +-
 include/win.h                |   2 +-
 include/windows.h            |  30 +-
 include/winerror.h           |   1 +
 include/wintypes.h           |   2 +-
 library/winestub.c           |   3 +-
 loader/module.c              |  71 +++--
 loader/pe_image.c            | 340 +++++++++++++----------
 loader/pe_resource.c         |   4 +-
 loader/resource.c            |  40 ++-
 loader/task.c                |  31 ++-
 memory/global.c              |   4 +-
 memory/virtual.c             |  22 ++
 misc/Makefile.in             |   9 +-
 misc/commdlg.c               |   1 +
 misc/crtdll.c                |  83 ++++++
 misc/lzexpand.c              |   4 +-
 misc/main.c                  |   6 +-
 misc/network.c               |  78 ++++--
 misc/olecli.c                |  54 ----
 misc/olesvr.c                |  78 ------
 misc/printdrv.c              |   9 +
 misc/registry.c              |  27 +-
 misc/shell.c                 | 400 ++++++++++++++++++++------
 misc/shellord.c              | 525 +++++++++++++++++++++++++++++++++++
 misc/version.c               |   8 +-
 misc/w32scomb.c              |  22 ++
 misc/w32skrnl.c              |  30 ++
 misc/wsprintf.c              |   5 +-
 miscemu/main.c               |   2 +-
 msdos/Makefile.in            |   1 +
 msdos/int3d.c                |  38 +++
 objects/cursoricon.c         |  23 +-
 objects/dib.c                | 380 ++++++++++++++++++++-----
 objects/font.c               |  18 ++
 objects/text.c               |  14 +-
 ole/Makefile.in              |  21 ++
 {misc => ole}/compobj.c      |   5 +-
 {misc => ole}/ole2.c         |  13 +
 {misc => ole}/ole2disp.c     |   0
 {misc => ole}/ole2nls.c      |   0
 ole/olecli.c                 | 151 ++++++++++
 ole/olesvr.c                 | 134 +++++++++
 programs/Makefile.in         |   2 +-
 programs/progman/Makefile.in |  13 -
 programs/winhelp/Makefile.in |  13 -
 programs/winver/ChangeLog    |   5 +
 programs/winver/Makefile.in  |  25 ++
 programs/winver/winver.c     |  18 ++
 scheduler/process.c          |  76 ++++-
 tools/build.c                |   7 +-
 win32/Makefile.in            |   1 -
 win32/advapi.c               |   4 +
 win32/newfns.c               |  36 ++-
 win32/process.c              |  18 +-
 win32/security.c             |  30 ++
 win32/string32.c             |  44 ---
 windows/dce.c                |   5 +-
 windows/defwnd.c             |  16 +-
 windows/keyboard.c           |  18 ++
 windows/message.c            |  13 +
 windows/nonclient.c          |  11 +
 windows/painting.c           |  10 +-
 windows/queue.c              |  14 +
 windows/win.c                |  15 +-
 windows/winhelp.c            |   2 +-
 windows/winpos.c             |  30 +-
 124 files changed, 3788 insertions(+), 1056 deletions(-)
 create mode 100644 if1632/olecli32.spec
 create mode 100644 if1632/olesvr32.spec
 create mode 100644 if1632/w32skrnl.spec
 create mode 100644 if1632/win32s16.spec
 create mode 100644 include/interfaces.h
 create mode 100644 include/shlobj.h
 delete mode 100644 include/string32.h
 delete mode 100644 misc/olecli.c
 delete mode 100644 misc/olesvr.c
 create mode 100644 misc/shellord.c
 create mode 100644 misc/w32scomb.c
 create mode 100644 misc/w32skrnl.c
 create mode 100644 msdos/int3d.c
 create mode 100644 ole/Makefile.in
 rename {misc => ole}/compobj.c (97%)
 rename {misc => ole}/ole2.c (69%)
 rename {misc => ole}/ole2disp.c (100%)
 rename {misc => ole}/ole2nls.c (100%)
 create mode 100644 ole/olecli.c
 create mode 100644 ole/olesvr.c
 create mode 100644 programs/winver/ChangeLog
 create mode 100644 programs/winver/Makefile.in
 create mode 100644 programs/winver/winver.c
 delete mode 100644 win32/string32.c

diff --git a/ANNOUNCE b/ANNOUNCE
index d05e8faa650..93c7b241d33 100644
--- a/ANNOUNCE
+++ b/ANNOUNCE
@@ -1,14 +1,14 @@
-This is release 971116 of Wine, the MS Windows emulator.  This is still a
+This is release 971130 of Wine, the MS Windows emulator.  This is still a
 developer's only release.  There are many bugs and many unimplemented API
 features.  Most applications still do not work correctly.
 
 Patches should be submitted to "julliard@lrc.epfl.ch".  Please don't
 forget to include a ChangeLog entry.
 
-WHAT'S NEW with Wine-971116: (see ChangeLog for details)
-	- Emulator and library unification.
-	- New About dialog.
-	- Menus improvements.
+WHAT'S NEW with Wine-971130: (see ChangeLog for details)
+	- Better Win32s support.
+	- Lots of new Win32 functions.
+	- DIB handling improvements.
 	- Lots of bug fixes.
 
 See the README file in the distribution for installation instructions.
@@ -17,10 +17,10 @@ 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:
 
-  ftp://sunsite.unc.edu/pub/Linux/ALPHA/wine/development/Wine-971116.tar.gz
-  ftp://tsx-11.mit.edu/pub/linux/ALPHA/Wine/development/Wine-971116.tar.gz
-  ftp://ftp.infomagic.com/pub/mirrors/linux/wine/development/Wine-971116.tar.gz
-  ftp://ftp.progsoc.uts.edu.au/pub/Wine/development/Wine-971116.tar.gz
+  ftp://sunsite.unc.edu/pub/Linux/ALPHA/wine/development/Wine-971130.tar.gz
+  ftp://tsx-11.mit.edu/pub/linux/ALPHA/Wine/development/Wine-971130.tar.gz
+  ftp://ftp.infomagic.com/pub/mirrors/linux/wine/development/Wine-971130.tar.gz
+  ftp://ftp.progsoc.uts.edu.au/pub/Wine/development/Wine-971130.tar.gz
 
 It should also be available from any site that mirrors tsx-11 or sunsite.
 
diff --git a/AUTHORS b/AUTHORS
index e26d62a47d8..cd18940e3d2 100644
--- a/AUTHORS
+++ b/AUTHORS
@@ -11,6 +11,7 @@ Martin Ayotte,
 Peter Bajusz,
 Georg Beyerle,
 Ross Biro,
+Martin Boehme,
 Uwe Bonnes,
 Erik Bos,
 Fons Botman,
@@ -18,12 +19,14 @@ John Brezak,
 Andrew Bulhak,
 John Burton,
 Niels de Carpentier,
+Gordon Chaffee,
 Jimen Ching,
 David A. Cuthbert,
 Huw D. M. Davies,
 Roman Dolejsi,
 Frans van Dorsselaer,
 Chris Faherty,
+Carsten Fallesen,
 Paul Falstad,
 David Faure,
 Claus Fischer,
@@ -71,6 +74,7 @@ Steffen Moeller,
 Andreas Mohr,
 Philippe De Muyter,
 Itai Nahshon,
+Kristian Nielsen,
 Henrik Olsen,
 Michael Patra,
 Dimitrie O. Paun,
@@ -114,11 +118,13 @@ Ronan Waide,
 Eric Warnke,
 Manfred Weichel,
 Morten Welinder,
+Len White,
 Lawson Whitney,
 Jan Willamowius,
 Carl Williams,
 Karl Guenter Wuensch,
 Eric Youngdale,
 James Youngman,
+Nikita V. Youshchenko,
 Mikolaj Zalewski,
 and John Zero.
diff --git a/BUGS b/BUGS
index dff1e4df9a9..cc9b8c0a45c 100644
--- a/BUGS
+++ b/BUGS
@@ -9,10 +9,6 @@ As of Nov 1997 -
 
 General:
 
- * We need to do InsertMenuItem32[AW] and then code most of the other
-   inserting function in terms of this.  Without this, we cannot support
-   all the new extended menus.  Not hard, but slightly big.
-
  * TrueType, .FON rasterizer.
 
  * No thread/process scheduling support in Win32 code. 
@@ -38,9 +34,11 @@ Miscellaneous:
 
  * Invisible controls in BCW dialogs.
 
- * MIRC is unable to show 'Options' dialog.
+ * mIRC 'commands' menu stays on top and will not refresh.
+
+ * mIRC is unable to show 'Options' dialog.
 
- * Tab switching in MIRC 'Setup' dialog leaks memory.
+ * Tab switching in mIRC 'Setup' dialog leaks memory.
 
  * nBytesWidth in CURSORICONINFO is bogus for some bpp
    (doesn't reflect the fact that bits are packed and 16-bit aligned).
diff --git a/ChangeLog b/ChangeLog
index 8b4b830caa3..76ac4baf3ef 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,134 @@
+----------------------------------------------------------------------
+Sat Nov 29 12:35:26 1997  Alexandre Julliard  <julliard@lrc.epfl.ch>
+
+	* [if1632/builtin.c]
+	Build a complete PE header for builtin Win32 modules.
+
+	* [loader/pe_image.c] [loader/module.c]
+	HMODULE32 now points to the loading address of the module. There
+	is no longer a separate PE_MODULE structure.
+
+Fri Nov 28 11:21:47 1997  Marcus Meissner <msmeissn@cip.informatik.uni-erlangen.de>
+
+	* [ole/*][configure.in][Makefile.in][include/interfaces.h]
+	  [if1632/olesvr32.spec][if1632/olecli32.spec]
+	New directory, moved OLE stuff there.
+	new .spec files for olecli32,olesvr32, some stubs added.
+
+	* [misc/shell.c]
+	Added support for extracting icons from PE dlls.
+
+	* [misc/shellord.c][if1632/shell32.spec]
+	Added a huge heap of ordinal only exported shell functions
+	(will work only in Win95).
+
+	* [loader/task.c]
+	Hack to make MakeProcInstance16 work in all cases (mplayer.exe).
+
+	* [win32/string32.c][include/string32.h]
+	Obsolete, removed.
+
+	* [windows/keyboard.c]
+	Added *RegisterHotkey.
+
+	* [objects/font.c][objects/text.c]
+	Added GetFontLanguageInfo, GetTextCharsetInfo.
+
+Wed Nov 26 18:10:40 1997  Uwe Bonnes  <bon@elektron.ikp.physik.tu-darmstadt.de>
+
+	* [misc/network.c]
+	In WNetGetConnection16 return the Drive label and not the DOS-Cwd.
+	Makes Wordview 6 start on a network connected machine.
+
+	* [controls/status.c]
+	Catch a Null pointer in SW_SetText.
+
+	* [files/dos_fs.c]
+ 	Add NT5 functions GetLongPathName32.
+
+	* [files/file.c]
+	Make GetTempFileName16 accept drive 0 (Current Drive) too.
+	Handle more errors and be more verbose in FILE_SetDosError, fix
+	an error in DeleteFile32W
+
+	* [memory/virtual.c]
+	Implement FlushViewOfFile.
+
+	* [misc/crtdll]
+	Implement _rotl and splitpath and add a stub for 
+	_abnormal_termination.
+
+	* [misc/printdrv.c]
+	Stub for EnumPrinters32A.
+
+	* [win32/newfns]
+	Add Stub for QueryPerformanceFrequency, change return value
+	for QueryPerformanceCounter.
+ 	Add stub for DeviceIoControl.
+
+Tue Nov 25 15:55:01 1997 Martin Boehme <boehme@informatik.mu-luebeck.de>
+
+	* [controls/combo.c] [controls/edit.c] [windows/defwnd.c]
+	  [windows/winpos.c] [windows/win.c]
+	Removed WIN_NO_REDRAW flag.
+
+Tue Nov 25 13:20:35 1997  Douglas Ridgway <ridgway@taiga.v-wave.com>
+
+	* [graphics/x11drv/bitblt.c]
+	Fixed memory leak in BITBLT_GetDstArea.
+
+Sun Nov 23 14:05:23 1997  Andreas Mohr <100.30936@germany.net>
+
+	* [files/directory.c]
+	Export windows system directory to environment.
+
+	* [if1632/Makefile.in] [if1632/builtin.c] [if1632/w32skrnl.spec]
+	  [if1632/win32s16.spec] [misc/w32scomb.c] [misc/w32skrnl.c]
+	Added Win32s DLLs W32SKRNL and WIN32S16.
+
+	* [if1632/kernel32.spec] [loader/module.c]
+	Added misc functions for Win32s.
+
+	* [if1632/kernel.spec] [loader/task.c]
+	Added DefineHandleTable().
+
+	* [scheduler/process.c]
+	Fixed SetEnvironmentVariable32A() to avoid heap corruption.
+
+Sat Nov 22 14:11:42 1997  Kristian Nielsen  <kristian.nielsen@risoe.dk>
+
+	* [windows/painting.c]
+	Fix leak in BeginPaint16() for CS_PARENTDC windows where the
+	update region was not properly released.
+
+Thu Nov 20 03:55:29 1997  Gordon Chaffee <chaffee@CS.Berkeley.EDU>
+
+	* [loader/pe_image.c]
+	Implemented forwarded DLL functions.
+
+	* [objects/dib.c]
+	Added support for 16- and 32-bit mode DIBs.
+	Support negative bitmap heights.
+
+	* [win32/process.c]
+	Added stub for CreateProcess32W.
+
+	* [win32/security.c] [include/ntdll.h]
+	Added stubs for LookupAccountSid32A/W.
+
+	* [scheduler/process.c]
+	Use the size specified in the PE header for the process heap.
+
+Mon Nov 17 00:53:35 1997  Len White <phreak@cgocable.net>
+
+	* [msdos/int3d.c]
+	New file. Stubs for int3d.
+
+Sun Nov 16 12:30:00 PST 1997  Jason Schonberg  <schon@mti.sgi.com>
+
+	* [include/aspi.h]
+	Changed comment style from C++ to C.
+
 ----------------------------------------------------------------------
 Sun Nov 16 07:42:44 1997  Alex Korobka <alex@trantor.pharm.sunysb.edu>
 
@@ -78,7 +209,7 @@ Fri Nov  7 19:44:26 1997  Olaf Flebbe  <o.flebbe@science-computing.de>
 	* [loader/resource.c] [user32.spec]
 	Stubs for CopyAcceleratorTable, Destroy AcceleratorTable.
 
-Thu Nov  6 22:37:04 1997  Morten Welinder  <welinder@rentec.com>
+Thu Nov  6 22:37:04 1997  Morten Welinder  <terra@diku.dk>
 
 	* [files/drive.c]
 	(GetDiskFreeSpace32A): Cap at 2GB.
diff --git a/Makefile.in b/Makefile.in
index 32b77efae95..c326756d4f1 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -37,6 +37,7 @@ LIBSUBDIRS = \
 	msdos \
 	multimedia \
 	objects \
+	ole \
 	resources \
 	scheduler \
 	win32 \
@@ -79,6 +80,7 @@ LIBOBJS = \
 	msdos/msdos.o \
 	multimedia/multimedia.o \
 	objects/objects.o \
+	ole/ole.o \
 	resources/resources.o \
 	scheduler/scheduler.o \
 	win32/win32.o \
@@ -98,18 +100,18 @@ install:: install_$(MAIN_TARGET)
 
 emu: wine
 
-lib: $(LIB_TARGET)
+lib: $(LIBSUBDIRS) $(LIB_TARGET)
 
-wine wine.sym: $(LIB_TARGET) $(EMUSUBDIRS) dummy
+wine wine.sym: $(LIBSUBDIRS) $(LIB_TARGET) $(EMUSUBDIRS) dummy
 	$(CC) -o wine $(EMUOBJS) $(LIB_TARGET) $(LDOPTIONS) $(X_LIBS) $(XPM_LIB) $(XLIB) $(LDLIBS)
 	nm -n wine | grep -v _compiled >wine.sym
 
-libwine.a: $(LIBSUBDIRS) dummy
+libwine.a: $(LIBOBJS)
 	$(RM) $@
 	$(AR) $@ $(LIBOBJS)
 	$(RANLIB) $@
 
-libwine.so.1.0: $(LIBSUBDIRS) dummy
+libwine.so.1.0: $(LIBOBJS)
 	$(CC) -shared -Wl,-soname,libwine.so -o$@ $(LIBOBJS) $(LDOPTIONS) $(X_LIBS) $(XPM_LIB) $(XLIB) $(LDLIBS)
 
 install_emu: dummy
diff --git a/configure b/configure
index 83ba00865f2..5699464ff4f 100755
--- a/configure
+++ b/configure
@@ -2521,9 +2521,11 @@ miscemu/Makefile
 msdos/Makefile
 multimedia/Makefile
 objects/Makefile
+ole/Makefile
 programs/Makefile
 programs/progman/Makefile
 programs/winhelp/Makefile
+programs/winver/Makefile
 rc/Makefile
 resources/Makefile
 scheduler/Makefile
@@ -2643,9 +2645,11 @@ miscemu/Makefile
 msdos/Makefile
 multimedia/Makefile
 objects/Makefile
+ole/Makefile
 programs/Makefile
 programs/progman/Makefile
 programs/winhelp/Makefile
+programs/winver/Makefile
 rc/Makefile
 resources/Makefile
 scheduler/Makefile
diff --git a/configure.in b/configure.in
index 9e4d70201d5..8c1186ce811 100644
--- a/configure.in
+++ b/configure.in
@@ -146,9 +146,11 @@ miscemu/Makefile
 msdos/Makefile
 multimedia/Makefile
 objects/Makefile
+ole/Makefile
 programs/Makefile
 programs/progman/Makefile
 programs/winhelp/Makefile
+programs/winver/Makefile
 rc/Makefile
 resources/Makefile
 scheduler/Makefile
diff --git a/controls/combo.c b/controls/combo.c
index b66173cb43d..e1ccb16fb0b 100644
--- a/controls/combo.c
+++ b/controls/combo.c
@@ -363,6 +363,9 @@ static void CBPaintButton(LPHEADCOMBO lphc, HDC16 hdc)
     UINT32 	x, y;
     BOOL32 	bBool;
 
+    if( lphc->wState & CBF_NOREDRAW )
+        return;
+
     hPrevBrush = (HBRUSH32)SelectObject32(hdc, sysColorObjects.hbrushBtnFace);
     CONV_RECT16TO32( &lphc->RectButton, &r );
 
@@ -401,6 +404,9 @@ static void CBPaintText(LPHEADCOMBO lphc, HDC16 hdc)
    INT32	id, size = 0;
    LPSTR	pText = NULL;
 
+   if( lphc->wState & CBF_NOREDRAW )
+        return;
+
    /* follow Windows combobox that sends a bunch of text 
     * inquiries to its listbox while processing WM_PAINT. */
 
@@ -508,7 +514,7 @@ static LRESULT COMBO_Paint(LPHEADCOMBO lphc, HDC16 hParamDC)
   
   hDC = (hParamDC) ? hParamDC
 		   : BeginPaint16( lphc->self->hwndSelf, &ps);
-  if( hDC && !(lphc->self->flags & WIN_NO_REDRAW) )
+  if( hDC && !(lphc->wState & CBF_NOREDRAW) )
   {
       HBRUSH32	hPrevBrush, hBkgBrush;
 
@@ -673,11 +679,14 @@ static void CBDropDown( LPHEADCOMBO lphc )
 
    SetWindowPos32( lphc->hWndLBox, HWND_TOP, rect.left, rect.top, 
 		 rect.right - rect.left, rect.bottom - rect.top, 
-		 SWP_NOACTIVATE | SWP_NOSIZE );
-   if( pRect )
-       RedrawWindow16( lphc->self->hwndSelf, pRect, 0, RDW_INVALIDATE | 
+		 SWP_NOACTIVATE | SWP_NOSIZE | SWP_NOREDRAW);
+   if( !(lphc->wState & CBF_NOREDRAW) )
+   {
+       if( pRect )
+           RedrawWindow16( lphc->self->hwndSelf, pRect, 0, RDW_INVALIDATE | 
 			   RDW_ERASE | RDW_UPDATENOW | RDW_NOCHILDREN );
-   ShowWindow32( lphc->hWndLBox, SW_SHOWNA );
+       ShowWindow32( lphc->hWndLBox, SW_SHOWNA );
+   }
 }
 
 /***********************************************************************
@@ -722,7 +731,7 @@ static void CBRollUp( LPHEADCOMBO lphc, BOOL32 ok, BOOL32 bButton )
 	       bButton = TRUE;
 	   }
 
-	   if( bButton )
+	   if( bButton && !(lphc->wState & CBF_NOREDRAW) )
 	       RedrawWindow16( hWnd, &rect, 0, RDW_INVALIDATE | 
 			       RDW_ERASE | RDW_UPDATENOW | RDW_NOCHILDREN );
 	   CB_NOTIFY( lphc, CBN_CLOSEUP );
@@ -1036,7 +1045,7 @@ static void CBResetPos( LPHEADCOMBO lphc, LPRECT16 lbRect, BOOL32 bRedraw )
                        lphc->RectEdit.bottom - lphc->RectEdit.top,
                        SWP_NOMOVE | SWP_NOZORDER | SWP_NOACTIVATE | SWP_NOREDRAW );
        lphc->wState &= ~CBF_NORESIZE;
-       if( bRedraw )
+       if( bRedraw && !(lphc->wState & CBF_NOREDRAW) )
            RedrawWindow32( lphc->self->hwndSelf, NULL, 0,
                            RDW_INVALIDATE | RDW_ERASE | RDW_UPDATENOW );
    }
@@ -1336,6 +1345,11 @@ LRESULT WINAPI ComboWndProc( HWND32 hwnd, UINT32 message,
 		return TRUE;
 
 	case WM_SETREDRAW:
+		if( wParam )
+		    lphc->wState &= ~CBF_NOREDRAW;
+		else
+		    lphc->wState |= CBF_NOREDRAW;
+
 		if( lphc->wState & CBF_EDIT )
 		    SendMessage32A( lphc->hWndEdit, message, wParam, lParam );
 		SendMessage32A( lphc->hWndLBox, message, wParam, lParam );
diff --git a/controls/edit.c b/controls/edit.c
index a2858950242..b4cd3ac12ef 100644
--- a/controls/edit.c
+++ b/controls/edit.c
@@ -84,6 +84,8 @@ typedef struct
 	INT32 left_margin;		/* in pixels */
 	INT32 right_margin;		/* in pixels */
 	RECT32 format_rect;
+	INT32 region_posx;		/* Position of cursor relative to region: */
+	INT32 region_posy;		/* -1: to left, 0: within, 1: to right */
 	EDITWORDBREAKPROC16 word_break_proc16;
 	EDITWORDBREAKPROC32A word_break_proc32A;
 	INT32 line_count;		/* number of lines */
@@ -1016,6 +1018,7 @@ static INT32 EDIT_CharFromPos(WND *wnd, EDITSTATE *es, INT32 x, INT32 y, LPBOOL3
 		INT32 line = (y - es->format_rect.top) / es->line_height + es->y_offset;
 		INT32 line_index = 0;
 		LINEDEF *line_def = es->first_line_def;
+		INT32 low, high;
 		while ((line > 0) && line_def->next) {
 			line_index += line_def->length;
 			line_def = line_def->next;
@@ -1035,11 +1038,16 @@ static INT32 EDIT_CharFromPos(WND *wnd, EDITSTATE *es, INT32 x, INT32 y, LPBOOL3
 		dc = GetDC32(wnd->hwndSelf);
 		if (es->font)
 			old_font = SelectObject32(dc, es->font);
-		/* FIXME: inefficient algorithm */
-		for (index = line_index + 1 ; index < line_index + line_def->net_length ; index++)
-			if (LOWORD(GetTabbedTextExtent32A(dc, es->text + line_index,
-					index - line_index, es->tabs_count, es->tabs)) >= x)
-				break;
+                    low = line_index + 1;
+                    high = line_index + line_def->net_length + 1;
+                    while (low < high - 1)
+                    {
+                        INT32 mid = (low + high) / 2;
+			if (LOWORD(GetTabbedTextExtent32A(dc, es->text + line_index,mid - line_index, es->tabs_count, es->tabs)) > x) high = mid;
+                        else low = mid;
+                    }
+                    index = low;
+
 		if (after_wrap)
 			*after_wrap = ((index == line_index + line_def->net_length) &&
 							(line_def->ending == END_WRAP));
@@ -2257,14 +2265,12 @@ static BOOL32 EDIT_EM_LineScroll(WND *wnd, EDITSTATE *es, INT32 dx, INT32 dy)
 		nyoff = es->line_count - 1;
 	dy = (es->y_offset - nyoff) * es->line_height;
 	if (dx || dy) {
-		if (!(wnd->flags & WIN_NO_REDRAW)) {
-			RECT32 rc1;
-			RECT32 rc;
-			GetClientRect32(wnd->hwndSelf, &rc1);
-			IntersectRect32(&rc, &rc1, &es->format_rect);
-			ScrollWindowEx32(wnd->hwndSelf, -dx, dy,
-					NULL, &rc, (HRGN32)NULL, NULL, SW_INVALIDATE);
-		}
+		RECT32 rc1;
+		RECT32 rc;
+		GetClientRect32(wnd->hwndSelf, &rc1);
+		IntersectRect32(&rc, &rc1, &es->format_rect);
+		ScrollWindowEx32(wnd->hwndSelf, -dx, dy,
+				NULL, &rc, (HRGN32)NULL, NULL, SW_INVALIDATE);
 		es->y_offset = nyoff;
 		es->x_offset += dx;
 	}
@@ -2440,8 +2446,7 @@ static void EDIT_EM_ReplaceSel(WND *wnd, EDITSTATE *es, BOOL32 can_undo, LPCSTR
 	EDIT_EM_ScrollCaret(wnd, es);
 
 	/* FIXME: really inefficient */
-	if (!(wnd->flags & WIN_NO_REDRAW))
-		InvalidateRect32(wnd->hwndSelf, NULL, TRUE);
+	InvalidateRect32(wnd->hwndSelf, NULL, TRUE);
 }
 
 
@@ -2525,8 +2530,7 @@ static void EDIT_EM_SetHandle(WND *wnd, EDITSTATE *es, HLOCAL32 hloc)
 	es->flags &= ~EF_MODIFIED;
 	es->flags &= ~EF_UPDATE;
 	EDIT_BuildLineDefs_ML(wnd, es);
-	if (!(wnd->flags & WIN_NO_REDRAW))
-		InvalidateRect32(wnd->hwndSelf, NULL, TRUE);
+	InvalidateRect32(wnd->hwndSelf, NULL, TRUE);
 	EDIT_EM_ScrollCaret(wnd, es);
 }
 
@@ -2569,8 +2573,7 @@ static void EDIT_EM_SetHandle16(WND *wnd, EDITSTATE *es, HLOCAL16 hloc)
 	es->flags &= ~EF_MODIFIED;
 	es->flags &= ~EF_UPDATE;
 	EDIT_BuildLineDefs_ML(wnd, es);
-	if (!(wnd->flags & WIN_NO_REDRAW))
-		InvalidateRect32(wnd->hwndSelf, NULL, TRUE);
+	InvalidateRect32(wnd->hwndSelf, NULL, TRUE);
 	EDIT_EM_ScrollCaret(wnd, es);
 }
 
@@ -2612,16 +2615,16 @@ static void EDIT_EM_SetMargins(WND *wnd, EDITSTATE *es, INT32 action, INT32 left
 			 *	FIXME: do some GetABCCharWidth, or so
 			 *		This is just preliminary
 			 */
-			es->left_margin = es->right_margin = es->char_width;
+			es->left_margin = es->right_margin = es->char_width/4;
 		} else
-			es->left_margin = es->right_margin = es->char_width;
-		return;
+			es->left_margin = es->right_margin = es->char_width/4;
 	} else {
 		if (action & EC_LEFTMARGIN)
 			es->left_margin = left;
 		if (action & EC_RIGHTMARGIN)
 			es->right_margin = right;
 	}
+	dprintf_edit(stddeb, "EDIT_EM_SetMargins: left=%d, right=%d\n", es->left_margin, es->right_margin);
 }
 
 
@@ -2678,24 +2681,36 @@ static void EDIT_EM_SetSel(WND *wnd, EDITSTATE *es, UINT32 start, UINT32 end, BO
 		es->flags |= EF_AFTER_WRAP;
 	else
 		es->flags &= ~EF_AFTER_WRAP;
-	if (!(wnd->flags & WIN_NO_REDRAW)) {
-		if (es->flags & EF_FOCUSED) {
-			LRESULT pos = EDIT_EM_PosFromChar(wnd, es, end, after_wrap);
-			SetCaretPos32(SLOWORD(pos), SHIWORD(pos));
-		}
-		/* FIXME: little efficiency, could be better */
-		ORDER_UINT32(start, end);
-		ORDER_UINT32(start, old_start);
-		ORDER_UINT32(start, old_end);
-		ORDER_UINT32(end, old_start);
-		ORDER_UINT32(end, old_end);
-		ORDER_UINT32(old_start, old_end);
-		if (end != old_start) {
-			EDIT_InvalidateText(wnd, es, start, end);
-			EDIT_InvalidateText(wnd, es, old_start, old_end);
-		} else
-			EDIT_InvalidateText(wnd, es, start, old_end);
+	if (es->flags & EF_FOCUSED) {
+		LRESULT pos = EDIT_EM_PosFromChar(wnd, es, end, after_wrap);
+		SetCaretPos32(SLOWORD(pos), SHIWORD(pos));
+	}
+/* This is little  bit more efficient than before, not sure if it can be improved. FIXME? */
+        ORDER_UINT32(start, end);
+        ORDER_UINT32(end, old_end);
+        ORDER_UINT32(start, old_start);
+        ORDER_UINT32(old_start, old_end);
+	if (end != old_start)
+        {
+/*
+ * One can also do 
+ *          ORDER_UINT32(end, old_start);
+ *          EDIT_InvalidateText(wnd, es, start, end);
+ *          EDIT_InvalidateText(wnd, es, old_start, old_end);
+ * in place of the following if statement.                          
+ */
+            if (old_start > end )
+            {
+                EDIT_InvalidateText(wnd, es, start, end);
+                EDIT_InvalidateText(wnd, es, old_start, old_end);
+            }
+            else
+            {
+                EDIT_InvalidateText(wnd, es, start, old_start);
+                EDIT_InvalidateText(wnd, es, end, old_end);
+            }
 	}
+        else EDIT_InvalidateText(wnd, es, start, old_end);
 }
 
 
@@ -3479,6 +3494,7 @@ static LRESULT EDIT_WM_LButtonDown(WND *wnd, EDITSTATE *es, DWORD keys, INT32 x,
 	e = EDIT_CharFromPos(wnd, es, x, y, &after_wrap);
 	EDIT_EM_SetSel(wnd, es, (keys & MK_SHIFT) ? es->selection_start : e, e, after_wrap);
 	EDIT_EM_ScrollCaret(wnd, es);
+	es->region_posx = es->region_posx = 0;
 	SetTimer32(wnd->hwndSelf, 0, 100, NULL);
 	return 0;
 }
@@ -3508,6 +3524,7 @@ static LRESULT EDIT_WM_MouseMove(WND *wnd, EDITSTATE *es, DWORD keys, INT32 x, I
 {
 	INT32 e;
 	BOOL32 after_wrap;
+	INT32 prex, prey;
 
 	if (GetCapture32() != wnd->hwndSelf)
 		return 0;
@@ -3516,7 +3533,10 @@ static LRESULT EDIT_WM_MouseMove(WND *wnd, EDITSTATE *es, DWORD keys, INT32 x, I
 	 *	FIXME: gotta do some scrolling if outside client
 	 *		area.  Maybe reset the timer ?
 	 */
+	prex = x; prey = y;
 	EDIT_ConfinePoint(wnd, es, &x, &y);
+	es->region_posx = (prex < x) ? -1 : ((prex > x) ? 1 : 0);
+	es->region_posy = (prey < y) ? -1 : ((prey > y) ? 1 : 0);
 	e = EDIT_CharFromPos(wnd, es, x, y, &after_wrap);
 	EDIT_EM_SetSel(wnd, es, es->selection_start, e, after_wrap);
 	return 0;
@@ -3677,7 +3697,7 @@ static void EDIT_WM_SetFont(WND *wnd, EDITSTATE *es, HFONT32 font, BOOL32 redraw
 		EDIT_EM_SetMargins(wnd, es, EC_USEFONTINFO, 0, 0);
 	if (es->style & ES_MULTILINE)
 		EDIT_BuildLineDefs_ML(wnd, es);
-	if (redraw && !(wnd->flags & WIN_NO_REDRAW))
+	if (redraw)
 		InvalidateRect32(wnd->hwndSelf, NULL, TRUE);
 	if (es->flags & EF_FOCUSED) {
 		LRESULT pos;
@@ -3701,6 +3721,7 @@ static void EDIT_WM_SetText(WND *wnd, EDITSTATE *es, LPCSTR text)
 	if (text) {
 		dprintf_edit(stddeb, "\t'%s'\n", text);
 		EDIT_EM_ReplaceSel(wnd, es, FALSE, text);
+		es->x_offset = 0;
 	}
 	es->flags |= EF_MODIFIED;
 	es->flags |= EF_UPDATE;
@@ -3749,8 +3770,13 @@ static LRESULT EDIT_WM_SysKeyDown(WND *wnd, EDITSTATE *es, INT32 key, DWORD key_
  */
 static void EDIT_WM_Timer(WND *wnd, EDITSTATE *es, INT32 id, TIMERPROC32 timer_proc)
 {
+	if (es->region_posx < 0) {
+		EDIT_MoveBackward(wnd, es, TRUE);
+	} else if (es->region_posx > 0) {
+		EDIT_MoveForward(wnd, es, TRUE);
+	}
 /*
- *	FIXME: gotta do some scrolling here, like
+ *	FIXME: gotta do some vertical scrolling here, like
  *		EDIT_EM_LineScroll(wnd, 0, 1);
  */
 }
diff --git a/controls/status.c b/controls/status.c
index d05aa6d466b..395ebce5e06 100644
--- a/controls/status.c
+++ b/controls/status.c
@@ -118,13 +118,11 @@ SW_SetText(STATUSWINDOWINFO *self, HWND32 hwnd, WPARAM32 wParam, LPARAM lParam)
     part_num = ((INT32) wParam) & 0x00ff;
     style = ((INT32) wParam) & 0xff00;
 
-    if (part_num >= 255)
-	return FALSE;
-
-    if ((self->simple) || (part_num==255))
+    if ((self->simple) || (self->parts==NULL) || (part_num==255))
 	part = &self->part0;
     else
 	part = &self->parts[part_num];
+    if (!part) return FALSE;
     part->style = style;
     if (style == SBT_OWNERDRAW) {
 	part->text = text;
diff --git a/debugger/break.c b/debugger/break.c
index 19d33865493..d842f500db8 100644
--- a/debugger/break.c
+++ b/debugger/break.c
@@ -347,19 +347,18 @@ void DEBUG_AddModuleBreakpoints(void)
 
         if (pModule->flags & NE_FFLAGS_WIN32)  /* PE module */
         {
-            PE_MODULE *pe = pModule->pe_module;
             PE_MODREF *pem;
             if (!pCurrentProcess) continue;
             pem = pCurrentProcess->modref_list;
             while (pem)
             {
-		if (pem->pe_module == pe) break;
+		if (pem->module == pModule->module32) break;
 		pem = pem->next;
             }
             if (!pem) continue;
             addr.seg = 0;
-            addr.off = pem->load_addr +
-                      (DWORD)pe->pe_header->OptionalHeader.AddressOfEntryPoint;
+            addr.off = (DWORD)RVA_PTR( pem->module,
+                                       OptionalHeader.AddressOfEntryPoint );
             fprintf( stderr, "Win32 task '%s': ", entry.szModule );
             DEBUG_AddBreakpoint( &addr );
         }
diff --git a/debugger/expr.c b/debugger/expr.c
index e8a7d6d06e8..f097f7da116 100644
--- a/debugger/expr.c
+++ b/debugger/expr.c
@@ -418,13 +418,10 @@ DEBUG_EvalExpr(struct expr * exp)
       exp->un.rgister.result = DEBUG_GetRegister(exp->un.rgister.reg);
       rtn.off = (unsigned int) &exp->un.rgister.result;
       if( exp->un.rgister.reg == REG_EIP )
-	{
 	  rtn.seg = CS_reg(&DEBUG_context);
-	}
       else
-	{
 	  rtn.seg = DS_reg(&DEBUG_context);
-	}
+      DBG_FIX_ADDR_SEG( &rtn, 0 );
       break;
     case EXPR_TYPE_BINOP:
       exp1 = DEBUG_EvalExpr(exp->un.binop.exp1);
diff --git a/debugger/hash.c b/debugger/hash.c
index 815715a0fd2..acf281f0905 100644
--- a/debugger/hash.c
+++ b/debugger/hash.c
@@ -789,24 +789,23 @@ static void DEBUG_LoadEntryPoints16( HMODULE16 hModule, NE_MODULE *pModule,
  *
  * Load the entry points of a Win32 module into the hash table.
  */
-static void DEBUG_LoadEntryPoints32( PE_MODULE *pe, const char *name )
+static void DEBUG_LoadEntryPoints32( HMODULE32 hModule, const char *name )
 {
-#define RVA(x) (load_addr+(DWORD)(x))
+#define RVA(x) (hModule+(DWORD)(x))
 
     DBG_ADDR addr;
     char buffer[256];
     int i, j;
+    IMAGE_SECTION_HEADER *pe_seg;
     IMAGE_EXPORT_DIRECTORY *exports;
     IMAGE_DATA_DIRECTORY *debug_dir;
-    DWORD load_addr;
     WORD *ordinals;
     void **functions;
     const char **names;
 
     PE_MODREF *pem = pCurrentProcess->modref_list;
-    while (pem && (pem->pe_module != pe)) pem = pem->next;
+    while (pem && (pem->module != hModule)) pem = pem->next;
     if (!pem) return;
-    load_addr = pem->load_addr;
     exports = pem->pe_export;
 
     addr.seg = 0;
@@ -814,22 +813,24 @@ static void DEBUG_LoadEntryPoints32( PE_MODULE *pe, const char *name )
 
     /* Add start of DLL */
 
-    addr.off = load_addr;
+    addr.off = hModule;
     DEBUG_AddSymbol( name, &addr, NULL, SYM_WIN32 | SYM_FUNC );
 
     /* Add entry point */
 
     sprintf( buffer, "%s.EntryPoint", name );
-    addr.off = RVA( pe->pe_header->OptionalHeader.AddressOfEntryPoint );
+    addr.off = (DWORD)RVA_PTR( hModule, OptionalHeader.AddressOfEntryPoint );
     DEBUG_AddSymbol( buffer, &addr, NULL, SYM_WIN32 | SYM_FUNC );
 
     /* Add start of sections */
 
-    for (i = 0; i < pe->pe_header->FileHeader.NumberOfSections; i++)
+    pe_seg = PE_SECTIONS(hModule);
+    for (i = 0; i < PE_HEADER(hModule)->FileHeader.NumberOfSections; i++)
     {
-        sprintf( buffer, "%s.%s", name, pe->pe_seg[i].Name );
-        addr.off = RVA( pe->pe_seg[i].VirtualAddress );
+        sprintf( buffer, "%s.%s", name, pe_seg->Name );
+        addr.off = RVA(pe_seg->VirtualAddress );
         DEBUG_AddSymbol( buffer, &addr, NULL, SYM_WIN32 | SYM_FUNC );
+        pe_seg++;
     }
 
     /* Add exported functions */
@@ -859,9 +860,9 @@ static void DEBUG_LoadEntryPoints32( PE_MODULE *pe, const char *name )
         DEBUG_AddSymbol( buffer, &addr, NULL, SYM_WIN32 | SYM_FUNC );
     }
 
-    debug_dir = &pe->pe_header->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_DEBUG];
+    debug_dir = &PE_HEADER(hModule)->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_DEBUG];
     if (debug_dir->Size)
-        DEBUG_RegisterDebugInfo( pe, load_addr, name,
+        DEBUG_RegisterDebugInfo( hModule, name,
                                  debug_dir->VirtualAddress, debug_dir->Size );
 #undef RVA
 }
@@ -884,10 +885,7 @@ void DEBUG_LoadEntryPoints(void)
         fprintf( stderr, " %s", entry.szModule );
 
         if (pModule->flags & NE_FFLAGS_WIN32)  /* PE module */
-        {
-            if (pModule->flags & NE_FFLAGS_BUILTIN) continue;
-            DEBUG_LoadEntryPoints32( pModule->pe_module, entry.szModule );
-        }
+            DEBUG_LoadEntryPoints32( pModule->module32, entry.szModule );
         else  /* NE module */
             DEBUG_LoadEntryPoints16( entry.hModule, pModule, entry.szModule );
     }
diff --git a/debugger/msc.c b/debugger/msc.c
index 8094d86f505..3be941deeed 100644
--- a/debugger/msc.c
+++ b/debugger/msc.c
@@ -509,8 +509,8 @@ struct deferred_debug_info
 	char				* module_name;
 	char				* dbg_info;
 	int				  dbg_size;
+        HMODULE32                         module;
 	LPIMAGE_DEBUG_DIRECTORY           dbgdir;
-	struct pe_data			* pe;
         LPIMAGE_SECTION_HEADER	          sectp;
 	int				  nsect;
 	short int			  dbg_index;			
@@ -881,8 +881,8 @@ DEBUG_InitCVDataTypes()
  * We don't fully process it here for performance reasons.
  */
 int
-DEBUG_RegisterDebugInfo(struct pe_data * pe,int load_addr,
-                        const char *module_name, u_long v_addr, u_long size)
+DEBUG_RegisterDebugInfo( HMODULE32 hModule, const char *module_name,
+                         u_long v_addr, u_long size)
 {
   int			  has_codeview = FALSE;
   int			  rtn = FALSE;
@@ -891,7 +891,7 @@ DEBUG_RegisterDebugInfo(struct pe_data * pe,int load_addr,
   struct deferred_debug_info * deefer;
 
   orig_size = size;
-  dbgptr = (LPIMAGE_DEBUG_DIRECTORY) (load_addr + v_addr);
+  dbgptr = (LPIMAGE_DEBUG_DIRECTORY) (hModule + v_addr);
   for(; size >= sizeof(*dbgptr); size -= sizeof(*dbgptr), dbgptr++ )
     {
       switch(dbgptr->Type)
@@ -904,7 +904,7 @@ DEBUG_RegisterDebugInfo(struct pe_data * pe,int load_addr,
     }
 
   size = orig_size;
-  dbgptr = (LPIMAGE_DEBUG_DIRECTORY) (load_addr + v_addr);
+  dbgptr = (LPIMAGE_DEBUG_DIRECTORY) (hModule + v_addr);
   for(; size >= sizeof(*dbgptr); size -= sizeof(*dbgptr), dbgptr++ )
     {
       switch(dbgptr->Type)
@@ -935,16 +935,16 @@ DEBUG_RegisterDebugInfo(struct pe_data * pe,int load_addr,
 	   * it just points to itself, and we can ignore this.
 	   */
 	  if(    (dbgptr->Type == IMAGE_DEBUG_TYPE_MISC)
-	      && (pe->pe_header->FileHeader.Characteristics & IMAGE_FILE_DEBUG_STRIPPED) == 0 )
+	      && (PE_HEADER(hModule)->FileHeader.Characteristics & IMAGE_FILE_DEBUG_STRIPPED) == 0 )
 	    {
 	      break;
 	    }
 
 	  deefer = (struct deferred_debug_info *) xmalloc(sizeof(*deefer));
-	  deefer->pe = pe;
-
-	  deefer->dbg_info = NULL;
-	  deefer->dbg_size = 0;
+	  deefer->module    = hModule;
+	  deefer->load_addr = (char *)hModule;
+	  deefer->dbg_info  = NULL;
+	  deefer->dbg_size  = 0;
 
 	  /*
 	   * Read the important bits.  What we do after this depends
@@ -952,16 +952,15 @@ DEBUG_RegisterDebugInfo(struct pe_data * pe,int load_addr,
 	   * to proceed if we know what we need to do next.
 	   */
 	  deefer->dbg_size = dbgptr->SizeOfData;
-	  deefer->dbg_info = (char *)(pe->mappeddll+dbgptr->PointerToRawData);
-	  deefer->load_addr = (char *) load_addr;
+	  deefer->dbg_info = (char *)(hModule + dbgptr->PointerToRawData);
 	  deefer->dbgdir = dbgptr;
 	  deefer->next = dbglist;
 	  deefer->loaded = FALSE;
 	  deefer->dbg_index = DEBUG_next_index;
 	  deefer->module_name = xstrdup(module_name);
 
-	  deefer->sectp = pe->pe_seg;
-	  deefer->nsect = pe->pe_header->FileHeader.NumberOfSections;
+	  deefer->sectp = PE_SECTIONS(hModule);
+	  deefer->nsect = PE_HEADER(hModule)->FileHeader.NumberOfSections;
 
 	  dbglist = deefer;
 	  break;
@@ -985,7 +984,7 @@ DEBUG_RegisterELFDebugInfo(int load_addr, u_long size, char * name)
   struct deferred_debug_info * deefer;
 
   deefer = (struct deferred_debug_info *) xmalloc(sizeof(*deefer));
-  deefer->pe = NULL;
+  deefer->module = 0;
   
   /*
    * Read the important bits.  What we do after this depends
@@ -2401,19 +2400,9 @@ void DEBUG_InfoShare(void)
   fprintf(stderr,"Address\t\tModule\tName\n");
 
   for(deefer = dbglist; deefer; deefer = deefer->next)
-    {
-      if( deefer->pe == NULL )
-	{
-	  fprintf(stderr,"0x%8.8x\t(ELF)\t%s\n", 
-		  (unsigned int) deefer->load_addr,
-		  deefer->module_name);
-	}
-      else
-	{
-	  fprintf(stderr,"0x%8.8x\t(Win32)\t%s\n", 
-		  (unsigned int) deefer->load_addr,
-		  deefer->module_name);
-	}
-    }
+  {
+      fprintf(stderr,"0x%8.8x\t(%s)\t%s\n", (unsigned int) deefer->load_addr,
+              deefer->module ? "Win32" : "ELF", deefer->module_name);
+  }
 }
 
diff --git a/files/directory.c b/files/directory.c
index b4ddb7ed10e..f740f3ebe25 100644
--- a/files/directory.c
+++ b/files/directory.c
@@ -161,7 +161,7 @@ int DIR_Init(void)
     dprintf_dosfs( stddeb, "TempDir    = %s\nCwd        = %c:\\%s\n",
                    DIR_TempDosDir, 'A' + drive, DRIVE_GetDosCwd( drive ) );
 
-    /* Put the temp and Windows directories into the environment */
+    /* Put the temp and Windows and system directories into the environment */
 
     env_p = HEAP_xalloc( SystemHeap, 0, strlen(DIR_TempDosDir) + 6 );
     strcpy( env_p, "TEMP=" );
@@ -171,6 +171,10 @@ int DIR_Init(void)
     strcpy( env_p, "windir=" );
     strcpy( env_p + 7, DIR_WindowsDosDir );
     putenv( env_p );
+    env_p = HEAP_xalloc( SystemHeap, 0, strlen(DIR_SystemDosDir) + 11 );
+    strcpy( env_p, "winsysdir=" );
+    strcpy( env_p + 10, DIR_SystemDosDir );
+    putenv( env_p );
 
     return 1;
 }
diff --git a/files/dos_fs.c b/files/dos_fs.c
index 74f6cf24e3e..2ace4e0547d 100644
--- a/files/dos_fs.c
+++ b/files/dos_fs.c
@@ -797,6 +797,42 @@ DWORD WINAPI GetShortPathName32W( LPCWSTR longpath, LPWSTR shortpath,
 }
 
 
+/***********************************************************************
+ *           GetLongPathName32A   (KERNEL32.xxx)
+ */
+DWORD WINAPI GetLongPathName32A( LPCSTR shortpath, LPSTR longpath,
+                                  DWORD longlen )
+{
+    DOS_FULL_NAME full_name;
+
+    /* FIXME: is it correct to always return a fully qualified short path? */
+    if (!DOSFS_GetFullName( shortpath, TRUE, &full_name )) return 0;
+    lstrcpyn32A( longpath, full_name.long_name, longlen );
+    return strlen( full_name.long_name );
+}
+
+
+/***********************************************************************
+ *           GetLongPathName32W   (KERNEL32.269)
+ */
+DWORD WINAPI GetLongPathName32W( LPCWSTR shortpath, LPWSTR longpath,
+                                  DWORD longlen )
+{
+    DOS_FULL_NAME full_name;
+    DWORD ret = 0;
+    LPSTR shortpathA = HEAP_strdupWtoA( GetProcessHeap(), 0, shortpath );
+
+    /* FIXME: is it correct to always return a fully qualified short path? */
+    if (DOSFS_GetFullName( shortpathA, TRUE, &full_name ))
+    {
+        ret = strlen( full_name.short_name );
+        lstrcpynAtoW( longpath, full_name.long_name, longlen );
+    }
+    HeapFree( GetProcessHeap(), 0, shortpathA );
+    return ret;
+}
+
+
 /***********************************************************************
  *           DOSFS_DoGetFullPathName
  *
diff --git a/files/file.c b/files/file.c
index f60a115ea2a..cdbbe55c9dc 100644
--- a/files/file.c
+++ b/files/file.c
@@ -146,7 +146,8 @@ void FILE_SetDosError(void)
 {
     int save_errno = errno; /* errno gets overwritten by printf */
 
-    dprintf_file(stddeb, "FILE_SetDosError: errno = %d\n", errno );
+    dprintf_file(stddeb, "FILE_SetDosError: errno = %d %s\n", errno,
+		 sys_errlist[errno] );
     switch (save_errno)
     {
     case EAGAIN:
@@ -179,6 +180,12 @@ void FILE_SetDosError(void)
     case EEXIST:
         DOS_ERROR( ER_FileExists, EC_Exists, SA_Abort, EL_Disk );
         break;
+    case EINVAL:
+        DOS_ERROR( ER_SeekError, EC_NotFound, SA_Ignore, EL_Disk );
+        break;
+    case ENOTEMPTY:
+        DOS_ERROR( ERROR_DIR_NOT_EMPTY, EC_Exists, SA_Ignore, EL_Disk );
+        break;
     default:
         perror( "int21: unknown errno" );
         DOS_ERROR( ER_GeneralFailure, EC_SystemFailure, SA_Abort, EL_Unknown );
@@ -523,6 +530,9 @@ UINT16 WINAPI GetTempFileName16( BYTE drive, LPCSTR prefix, UINT16 unique,
 {
     char temppath[144];
 
+    if (!(drive & ~TF_FORCEDRIVE)) /* drive 0 means current default drive */
+        drive |= DRIVE_GetCurrentDrive();
+
     if ((drive & TF_FORCEDRIVE) &&
         !DRIVE_IsValid( toupper(drive & ~TF_FORCEDRIVE) - 'A' ))
     {
@@ -1185,7 +1195,7 @@ BOOL32 WINAPI DeleteFile32A( LPCSTR path )
 BOOL32 WINAPI DeleteFile32W( LPCWSTR path )
 {
     LPSTR xpath = HEAP_strdupWtoA( GetProcessHeap(), 0, path );
-    BOOL32 ret = RemoveDirectory32A( xpath );
+    BOOL32 ret = DeleteFile32A( xpath );
     HeapFree( GetProcessHeap(), 0, xpath );
     return ret;
 }
diff --git a/graphics/escape.c b/graphics/escape.c
index 83e006a5ce5..cd3873c0ca7 100644
--- a/graphics/escape.c
+++ b/graphics/escape.c
@@ -92,6 +92,7 @@ INT32 WINAPI Escape32( HDC32 hdc, INT32 nEscape, INT32 cbInput,
         LPSTR x=PTR_SEG_TO_LIN(segout);
         lstrcpy32A(lpvOutData,x);
         SEGPTR_FREE(x);
+	break;
     }
     case ENABLEPAIRKERNING: {
         LPINT16 enab = (LPINT16)PTR_SEG_TO_LIN(segout);
@@ -99,6 +100,7 @@ INT32 WINAPI Escape32( HDC32 hdc, INT32 nEscape, INT32 cbInput,
         *(LPINT32)lpvOutData = *enab;
         SEGPTR_FREE(enab);
         SEGPTR_FREE(PTR_SEG_TO_LIN(segin));
+	break;
     }
     case GETFACENAME: {
         LPSTR x = (LPSTR)PTR_SEG_TO_LIN(segout);
diff --git a/graphics/x11drv/bitblt.c b/graphics/x11drv/bitblt.c
index 44369135bb9..f2f89fd2614 100644
--- a/graphics/x11drv/bitblt.c
+++ b/graphics/x11drv/bitblt.c
@@ -975,6 +975,7 @@ static void BITBLT_GetDstArea(DC *dc, Pixmap pixmap, GC gc, RECT32 *visRectDst)
                 XPutPixel( image, x, y,
                            COLOR_PixelToPalette[XGetPixel( image, x, y )]);
         XPutImage( display, pixmap, gc, image, 0, 0, 0, 0, width, height );
+	XDestroyImage( image );
     }
 }
 
diff --git a/if1632/Makefile.in b/if1632/Makefile.in
index 2469274cd5d..63fb303d551 100644
--- a/if1632/Makefile.in
+++ b/if1632/Makefile.in
@@ -31,7 +31,9 @@ DLLS = \
 	ole2prox.spec \
 	ole32.spec \
 	olecli.spec \
+	olecli32.spec \
 	olesvr.spec \
+	olesvr32.spec \
 	shell.spec \
 	shell32.spec \
 	sound.spec \
@@ -43,7 +45,9 @@ DLLS = \
 	user32.spec \
 	ver.spec \
 	version.spec \
+	w32skrnl.spec \
 	w32sys.spec \
+	win32s16.spec \
 	win87em.spec \
 	winaspi.spec \
 	wing.spec \
diff --git a/if1632/advapi32.spec b/if1632/advapi32.spec
index d72abaa0e09..a53a955aa48 100644
--- a/if1632/advapi32.spec
+++ b/if1632/advapi32.spec
@@ -87,8 +87,8 @@ type	win32
 0083 stub LogonUserW
 0084 stub LookupAccountNameA
 0085 stub LookupAccountNameW
-0086 stub LookupAccountSidA
-0087 stub LookupAccountSidW
+0086 stdcall LookupAccountSidA(ptr ptr ptr ptr ptr ptr ptr) LookupAccountSid32A
+0087 stdcall LookupAccountSidW(ptr ptr ptr ptr ptr ptr ptr) LookupAccountSid32W
 0088 stub LookupPrivilegeDisplayNameA
 0089 stub LookupPrivilegeDisplayNameW
 0090 stub LookupPrivilegeNameA
diff --git a/if1632/builtin.c b/if1632/builtin.c
index d21f294f6a3..f51400470dc 100644
--- a/if1632/builtin.c
+++ b/if1632/builtin.c
@@ -16,6 +16,7 @@
 #include "neexe.h"
 #include "stackframe.h"
 #include "user.h"
+#include "process.h"
 #include "stddebug.h"
 #include "debug.h"
 
@@ -101,6 +102,7 @@ extern const DLL_DESCRIPTOR DDEML_Descriptor;
 extern const DLL_DESCRIPTOR LZEXPAND_Descriptor;
 extern const DLL_DESCRIPTOR VER_Descriptor;
 extern const DLL_DESCRIPTOR W32SYS_Descriptor;
+extern const DLL_DESCRIPTOR WIN32S16_Descriptor;
 extern const DLL_DESCRIPTOR WING_Descriptor;
 extern const DLL_DESCRIPTOR WINASPI_Descriptor;
 
@@ -110,15 +112,18 @@ extern const DLL_DESCRIPTOR ADVAPI32_Descriptor;
 extern const DLL_DESCRIPTOR COMCTL32_Descriptor;
 extern const DLL_DESCRIPTOR COMDLG32_Descriptor;
 extern const DLL_DESCRIPTOR CRTDLL_Descriptor;
-extern const DLL_DESCRIPTOR OLE32_Descriptor;
 extern const DLL_DESCRIPTOR GDI32_Descriptor;
 extern const DLL_DESCRIPTOR KERNEL32_Descriptor;
 extern const DLL_DESCRIPTOR LZ32_Descriptor;
 extern const DLL_DESCRIPTOR MPR_Descriptor;
 extern const DLL_DESCRIPTOR NTDLL_Descriptor;
+extern const DLL_DESCRIPTOR OLE32_Descriptor;
+extern const DLL_DESCRIPTOR OLECLI32_Descriptor;
+extern const DLL_DESCRIPTOR OLESVR32_Descriptor;
 extern const DLL_DESCRIPTOR SHELL32_Descriptor;
 extern const DLL_DESCRIPTOR USER32_Descriptor;
 extern const DLL_DESCRIPTOR VERSION_Descriptor;
+extern const DLL_DESCRIPTOR W32SKRNL_Descriptor;
 extern const DLL_DESCRIPTOR WINMM_Descriptor;
 extern const DLL_DESCRIPTOR WINSPOOL_Descriptor;
 extern const DLL_DESCRIPTOR WSOCK32_Descriptor;
@@ -156,6 +161,7 @@ static BUILTIN_DLL BuiltinDLLs[] =
     { &LZEXPAND_Descriptor, NULL, 0 },
     { &VER_Descriptor,      NULL, 0 },
     { &W32SYS_Descriptor,   NULL, 0 },
+    { &WIN32S16_Descriptor, NULL, 0 },
     { &WING_Descriptor,     NULL, 0 },
     { &WINASPI_Descriptor,  NULL, 0 },
     /* Win32 DLLs */
@@ -163,15 +169,18 @@ static BUILTIN_DLL BuiltinDLLs[] =
     { &COMCTL32_Descriptor, NULL, DLL_FLAG_WIN32 | DLL_FLAG_NOT_USED },
     { &COMDLG32_Descriptor, NULL, DLL_FLAG_WIN32 },
     { &CRTDLL_Descriptor,   NULL, DLL_FLAG_WIN32 },
-    { &OLE32_Descriptor,    NULL, DLL_FLAG_WIN32 | DLL_FLAG_NOT_USED },
     { &GDI32_Descriptor,    NULL, DLL_FLAG_WIN32 },
-    { &KERNEL32_Descriptor, NULL, DLL_FLAG_WIN32 | DLL_FLAG_ALWAYS_USED },
+    { &KERNEL32_Descriptor, NULL, DLL_FLAG_WIN32 },
     { &LZ32_Descriptor,     NULL, DLL_FLAG_WIN32 },
-    { &MPR_Descriptor,      NULL, DLL_FLAG_WIN32 | DLL_FLAG_NOT_USED },
+    { &MPR_Descriptor,      NULL, DLL_FLAG_WIN32 },
     { &NTDLL_Descriptor,    NULL, DLL_FLAG_WIN32 },
+    { &OLE32_Descriptor,    NULL, DLL_FLAG_WIN32 | DLL_FLAG_NOT_USED },
+    { &OLECLI32_Descriptor, NULL, DLL_FLAG_WIN32 | DLL_FLAG_NOT_USED },
+    { &OLESVR32_Descriptor, NULL, DLL_FLAG_WIN32 | DLL_FLAG_NOT_USED },
     { &SHELL32_Descriptor,  NULL, DLL_FLAG_WIN32 },
     { &USER32_Descriptor,   NULL, DLL_FLAG_WIN32 },
     { &VERSION_Descriptor,  NULL, DLL_FLAG_WIN32 },
+    { &W32SKRNL_Descriptor, NULL, DLL_FLAG_WIN32 },
     { &WINMM_Descriptor,    NULL, DLL_FLAG_WIN32 },
     { &WINSPOOL_Descriptor, NULL, DLL_FLAG_WIN32 },
     { &WSOCK32_Descriptor,  NULL, DLL_FLAG_WIN32 },
@@ -182,46 +191,6 @@ static BUILTIN_DLL BuiltinDLLs[] =
   /* Ordinal number for interrupt 0 handler in WPROCS.DLL */
 #define FIRST_INTERRUPT_ORDINAL 100
 
-/***********************************************************************
- *           BUILTIN_BuildDebugEntryPoints
- *
- * Build the table of relay-debugging entry points for a Win32 DLL.
- */
-static void BUILTIN_BuildDebugEntryPoints( BUILTIN_DLL *dll )
-{
-    int i;
-    DEBUG_ENTRY_POINT *entry;
-    extern void RELAY_CallFrom32();
-
-    assert( !dll->dbg_funcs );
-    assert( dll->flags & DLL_FLAG_WIN32 );
-    dll->dbg_funcs = HeapAlloc( SystemHeap, 0,
-                      dll->descr->win32.nb_funcs * sizeof(DEBUG_ENTRY_POINT) );
-    entry = dll->dbg_funcs;
-    for (i = 0; i < dll->descr->win32.nb_funcs; i++, entry++)
-    {
-        BYTE args = dll->descr->win32.args[i];
-        entry->call = 0xe8;  /* call */
-        switch(args)
-        {
-        case 0xfe:  /* register func */
-            entry->callfrom32 = (DWORD)dll->descr->win32.functions[i] -
-                                (DWORD)&entry->ret;
-            entry->ret        = 0x90;  /* nop */
-            entry->args       = 0;
-            break;
-        case 0xff:  /* stub */
-            entry->args = 0xffff;
-            break;
-        default:  /* normal function (stdcall or cdecl) */
-            entry->callfrom32 = (DWORD)RELAY_CallFrom32 - (DWORD)&entry->ret;
-            entry->ret        = (args & 0x80) ? 0xc3 : 0xc2; /* ret / ret $n */
-            entry->args       = (args & 0x7f) * sizeof(int);
-            break;
-        }
-    }
-}
-
 
 /***********************************************************************
  *           BUILTIN_DoLoadModule16
@@ -279,20 +248,179 @@ static HMODULE16 BUILTIN_DoLoadModule16( const WIN16_DESCRIPTOR *descr )
  * Load a built-in Win32 module. Helper function for BUILTIN_LoadModule
  * and BUILTIN_Init.
  */
-static HMODULE16 BUILTIN_DoLoadModule32( BUILTIN_DLL *table )
+static HMODULE32 BUILTIN_DoLoadModule32( BUILTIN_DLL *dll )
 {
+    extern void RELAY_CallFrom32();
+
     HMODULE16 hModule;
     NE_MODULE *pModule;
     OFSTRUCT ofs;
+    IMAGE_DATA_DIRECTORY *dir;
+    IMAGE_DOS_HEADER *dos;
+    IMAGE_NT_HEADERS *nt;
+    IMAGE_SECTION_HEADER *sec;
+    IMAGE_EXPORT_DIRECTORY *exp;
+    LPVOID *funcs;
+    LPSTR *names;
+    DEBUG_ENTRY_POINT *entry;
+    PE_MODREF *pem;
+    INT32 i, size;
+    BYTE *addr;
+
+    /* Allocate the module */
+
+    size = (sizeof(IMAGE_DOS_HEADER)
+            + sizeof(IMAGE_NT_HEADERS)
+            + 2 * sizeof(IMAGE_SECTION_HEADER)
+            + sizeof(IMAGE_EXPORT_DIRECTORY)
+            + dll->descr->win32.nb_funcs * sizeof(LPVOID)
+            + dll->descr->win32.nb_names * sizeof(LPSTR));
+    if (debugging_relay)
+        size += dll->descr->win32.nb_funcs * sizeof(DEBUG_ENTRY_POINT);
+    addr  = VirtualAlloc( NULL, size, MEM_COMMIT, PAGE_EXECUTE_READWRITE );
+    if (!addr) return 0;
+    dos   = (IMAGE_DOS_HEADER *)addr;
+    nt    = (IMAGE_NT_HEADERS *)(dos + 1);
+    sec   = (IMAGE_SECTION_HEADER *)(nt + 1);
+    exp   = (IMAGE_EXPORT_DIRECTORY *)(sec + 2);
+    funcs = (LPVOID *)(exp + 1);
+    names = (LPSTR *)(funcs + dll->descr->win32.nb_funcs);
+    entry = (DEBUG_ENTRY_POINT *)(names + dll->descr->win32.nb_names);
+
+    /* Build the DOS and NT headers */
+
+    dos->e_magic  = IMAGE_DOS_SIGNATURE;
+    dos->e_lfanew = sizeof(*dos);
+
+    nt->Signature                       = IMAGE_NT_SIGNATURE;
+    nt->FileHeader.Machine              = IMAGE_FILE_MACHINE_I386;
+    nt->FileHeader.NumberOfSections     = 2;  /* exports + code */
+    nt->FileHeader.SizeOfOptionalHeader = sizeof(nt->OptionalHeader);
+    nt->FileHeader.Characteristics      = IMAGE_FILE_DLL;
+
+    nt->OptionalHeader.Magic = IMAGE_NT_OPTIONAL_HDR_MAGIC;
+    nt->OptionalHeader.SizeOfCode                  = 0x1000;
+    nt->OptionalHeader.SizeOfInitializedData       = 0;
+    nt->OptionalHeader.SizeOfUninitializedData     = 0;
+    nt->OptionalHeader.ImageBase                   = (DWORD)addr;
+    nt->OptionalHeader.SectionAlignment            = 0x1000;
+    nt->OptionalHeader.FileAlignment               = 0x1000;
+    nt->OptionalHeader.MajorOperatingSystemVersion = 1;
+    nt->OptionalHeader.MinorOperatingSystemVersion = 0;
+    nt->OptionalHeader.MajorSubsystemVersion       = 4;
+    nt->OptionalHeader.MinorSubsystemVersion       = 0;
+    nt->OptionalHeader.SizeOfImage                 = size;
+    nt->OptionalHeader.SizeOfHeaders               = (BYTE *)exp - addr;
+    nt->OptionalHeader.NumberOfRvaAndSizes = IMAGE_NUMBEROF_DIRECTORY_ENTRIES;
+
+    /* Build the export directory */
+
+    dir = &nt->OptionalHeader.DataDirectory[IMAGE_FILE_EXPORT_DIRECTORY];
+    dir->VirtualAddress = (BYTE *)exp - addr;
+    dir->Size = sizeof(*exp)
+                + dll->descr->win32.nb_funcs * sizeof(LPVOID)
+                + dll->descr->win32.nb_names * sizeof(LPSTR);
+
+    /* Build the exports section */
+
+    strcpy( sec->Name, ".edata" );
+    sec->Misc.VirtualSize = dir->Size;
+    sec->VirtualAddress   = (BYTE *)exp - addr;
+    sec->SizeOfRawData    = dir->Size;
+    sec->PointerToRawData = (BYTE *)exp - addr;
+    sec->Characteristics  = (IMAGE_SCN_CNT_INITIALIZED_DATA |
+                             IMAGE_SCN_MEM_EXECUTE | IMAGE_SCN_MEM_READ |
+                             IMAGE_SCN_MEM_WRITE);
+
+    /* Build the code section */
+
+    sec++;
+    strcpy( sec->Name, ".code" );
+    if (debugging_relay)
+        sec->SizeOfRawData = dll->descr->win32.nb_funcs * sizeof(DEBUG_ENTRY_POINT);
+    else
+        sec->SizeOfRawData = 1;
+    sec->Misc.VirtualSize = sec->SizeOfRawData;
+    sec->VirtualAddress   = (BYTE *)entry - addr;
+    sec->PointerToRawData = (BYTE *)entry - addr;
+    sec->Characteristics  = (IMAGE_SCN_CNT_INITIALIZED_DATA |
+                             IMAGE_SCN_MEM_EXECUTE | IMAGE_SCN_MEM_READ);
+
+    /* Build the exports section data */
+
+    exp->Name                  = (BYTE *)dll->descr->name - addr;  /*??*/
+    exp->Base                  = dll->descr->win32.base;
+    exp->NumberOfFunctions     = dll->descr->win32.nb_funcs;
+    exp->NumberOfNames         = dll->descr->win32.nb_names;
+    exp->AddressOfFunctions    = (LPDWORD *)((BYTE *)funcs - addr);
+    exp->AddressOfNames        = (LPDWORD *)((BYTE *)names - addr);
+    exp->AddressOfNameOrdinals = (LPWORD *)((BYTE *)dll->descr->win32.ordinals - addr);
+
+    /* Build the funcs table */
+
+    if (debugging_relay)
+    {
+        dll->dbg_funcs = entry;
+        for (i = 0; i < dll->descr->win32.nb_funcs; i++, funcs++, entry++)
+        {
+            BYTE args = dll->descr->win32.args[i];
+            entry->call = 0xe8;  /* call */
+            switch(args)
+            {
+            case 0xfe:  /* register func */
+                entry->callfrom32 = (DWORD)dll->descr->win32.functions[i] -
+                                    (DWORD)&entry->ret;
+                entry->ret        = 0x90;  /* nop */
+                entry->args       = 0;
+                *funcs = (LPVOID)((BYTE *)entry - addr);
+                break;
+            case 0xff:  /* stub or extern */
+                if (dll->descr->win32.functions[i])
+                    *funcs = (LPVOID)((BYTE *)dll->descr->win32.functions[i]
+                                              - addr);
+                break;
+            default:  /* normal function (stdcall or cdecl) */
+                entry->callfrom32 = (DWORD)RELAY_CallFrom32 -
+                                    (DWORD)&entry->ret;
+                entry->ret        = (args & 0x80) ? 0xc3 : 0xc2; /*ret/ret $n*/
+                entry->args       = (args & 0x7f) * sizeof(int);
+                *funcs = (LPVOID)((BYTE *)entry - addr);
+                break;
+            }
+        }
+    }
+    else
+    {
+        for (i = 0; i < dll->descr->win32.nb_funcs; i++, funcs++)
+            if (dll->descr->win32.functions[i])
+                *funcs = (LPVOID)((BYTE *)dll->descr->win32.functions[i]
+                                           - addr);
+    }
+
+    /* Build the names table */
 
-    sprintf( ofs.szPathName, "%s.DLL", table->descr->name );
+    for (i = 0; i < exp->NumberOfNames; i++, names++)
+        if (dll->descr->win32.names[i])
+            *names = (LPSTR)((BYTE *)dll->descr->win32.names[i] - addr);
+
+    /* Create a modref */
+
+    pem = (PE_MODREF *)HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY,
+                                  sizeof(*pem) );
+    pem->module = (HMODULE32)addr;
+    pem->pe_export = exp;
+    pem->next = pCurrentProcess->modref_list;
+    pCurrentProcess->modref_list = pem;
+
+    /* Create a Win16 dummy module */
+
+    sprintf( ofs.szPathName, "%s.DLL", dll->descr->name );
     hModule = MODULE_CreateDummyModule( &ofs );
     pModule = (NE_MODULE *)GlobalLock16( hModule );
-    pModule->pe_module = (PE_MODULE *)table;
     pModule->flags = NE_FFLAGS_SINGLEDATA | NE_FFLAGS_BUILTIN |
-        NE_FFLAGS_LIBMODULE | NE_FFLAGS_WIN32;
-    if (debugging_relay) BUILTIN_BuildDebugEntryPoints( table );
-    return hModule;
+                     NE_FFLAGS_LIBMODULE | NE_FFLAGS_WIN32;
+    pModule->module32 = (HMODULE32)addr;
+    return pModule->module32;
 }
 
 
@@ -358,7 +486,7 @@ BOOL32 BUILTIN_Init(void)
  * 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.
  */
-HMODULE16 BUILTIN_LoadModule( LPCSTR name, BOOL32 force )
+HMODULE32 BUILTIN_LoadModule( LPCSTR name, BOOL32 force )
 {
     BUILTIN_DLL *table;
     char dllname[16], *p;
@@ -484,56 +612,14 @@ FARPROC32 BUILTIN_GetEntryPoint32( char *buffer, void *relay, DWORD *typemask )
     /* Now find the function */
 
     ordinal = ((DWORD)relay-(DWORD)dll->dbg_funcs) / sizeof(DEBUG_ENTRY_POINT);
-    ordinal += descr->base;
     for (i = 0; i < descr->nb_names; i++)
         if (descr->ordinals[i] == ordinal) break;
     assert( i < descr->nb_names );
 
-    sprintf( buffer, "%s.%d: %s", descr->name, ordinal, descr->names[i] );
-    *typemask = descr->argtypes[ordinal - descr->base];
-    return (FARPROC32)descr->functions[ordinal - descr->base];
-}
-
-
-/***********************************************************************
- *           BUILTIN_GetProcAddress32
- *
- * Implementation of GetProcAddress() for built-in Win32 modules.
- * FIXME: this should be unified with the real GetProcAddress32().
- */
-FARPROC32 BUILTIN_GetProcAddress32( NE_MODULE *pModule, LPCSTR function )
-{
-    BUILTIN_DLL *dll = (BUILTIN_DLL *)pModule->pe_module;
-    const WIN32_DESCRIPTOR *info = &dll->descr->win32;
-    WORD ordinal = 0;
-
-    if (!dll) return NULL;
-
-    if (HIWORD(function))  /* Find function by name */
-    {
-        int i;
-
-        dprintf_module( stddeb, "Looking for function %s in %s\n",
-                        function, dll->descr->name );
-        for (i = 0; i < info->nb_names; i++)
-            if (!strcmp( function, info->names[i] ))
-            {
-                ordinal = info->ordinals[i];
-                break;
-            }
-        if (i >= info->nb_names) return NULL;  /* not found */
-    }
-    else  /* Find function by ordinal */
-    {
-        ordinal = LOWORD(function);
-        dprintf_module( stddeb, "Looking for ordinal %d in %s\n",
-                        ordinal, dll->descr->name );
-        if ((ordinal < info->base) || (ordinal >= info->base + info->nb_funcs))
-            return NULL;  /* not found */
-    }
-    if (dll->dbg_funcs && (dll->dbg_funcs[ordinal-info->base].args != 0xffff))
-        return (FARPROC32)&dll->dbg_funcs[ordinal - info->base];
-    return (FARPROC32)info->functions[ordinal - info->base];
+    sprintf( buffer, "%s.%d: %s", descr->name, ordinal + descr->base,
+             descr->names[i] );
+    *typemask = descr->argtypes[ordinal];
+    return (FARPROC32)descr->functions[ordinal];
 }
 
 
diff --git a/if1632/crtdll.spec b/if1632/crtdll.spec
index c0b8f3cc89e..91b4e2d9876 100644
--- a/if1632/crtdll.spec
+++ b/if1632/crtdll.spec
@@ -37,7 +37,7 @@ type	win32
  33 stub __threadhandle
  34 stub __threadid
  35 stub __toascii
- 36 stub _abnormal_termination
+ 36 cdecl _abnormal_termination() CRTDLL__abnormal_termination
  37 stub _access
  38 extern _acmdln_dll CRTDLL_acmdln_dll
  39 stub _aexit_rtn_dll
@@ -260,7 +260,7 @@ type	win32
 256 stub _read
 257 stub _rmdir
 258 stub _rmtmp
-259 stub _rotl
+259 cdecl _rotl (long long) CRTDLL__rotl
 260 stub _rotr
 261 stub _scalb
 262 stub _searchenv
@@ -280,7 +280,7 @@ type	win32
 276 stub _spawnve
 277 stub _spawnvp
 278 stub _spawnvpe
-279 stub _splitpath
+279 cdecl _splitpath (ptr ptr ptr ptr ptr) CRTDLL__splitpath
 280 cdecl _stat (ptr ptr) CRTDLL__stat
 281 stub _statusfp
 282 cdecl _strcmpi(ptr ptr) CRTDLL__strcmpi
diff --git a/if1632/gdi.spec b/if1632/gdi.spec
index 07848fcd934..f792059df72 100644
--- a/if1632/gdi.spec
+++ b/if1632/gdi.spec
@@ -385,7 +385,7 @@ file	gdi.exe
 613 pascal16 EnumFontFamiliesEx(word ptr segptr long long) THUNK_EnumFontFamiliesEx16
 614 stub AddLpkToGDI
 615 stub GetCharacterPlacement
-616 stub GetFontLanguageInfo
+616 pascal GetFontLanguageInfo(word) GetFontLanguageInfo16
 650 stub BuildInverseTableDIB
 701 stub GDITHKCONNECTIONDATALS
 702 stub FT_GDIFTHKTHKCONNECTIONDATA
diff --git a/if1632/gdi32.spec b/if1632/gdi32.spec
index e33959842e2..686cfcf6457 100644
--- a/if1632/gdi32.spec
+++ b/if1632/gdi32.spec
@@ -173,7 +173,7 @@ type	win32
 166 stub GetCurrentObject
 167 stdcall GetCurrentPositionEx(long ptr) GetCurrentPositionEx32
 168 stdcall GetDCOrgEx(long ptr) GetDCOrgEx
-169 stub GetDIBColorTable
+169 stdcall GetDIBColorTable(long long long ptr) GetDIBColorTable32
 170 stdcall GetDIBits(long long long long ptr ptr long) GetDIBits32
 171 stdcall GetDeviceCaps(long long) GetDeviceCaps32
 172 stub GetDeviceGammaRamp
@@ -186,7 +186,7 @@ type	win32
 179 stub GetEnhMetaFilePaletteEntries
 180 stub GetEnhMetaFileW
 181 stub GetFontData
-182 stub GetFontLanguageInfo
+182 stdcall GetFontLanguageInfo(long) GetFontLanguageInfo32
 183 stub GetFontResourceInfo
 184 stub GetFontResourceInfoW
 185 stub GetGlyphOutline
@@ -315,7 +315,7 @@ type	win32
 308 stdcall SetBrushOrgEx(long long long ptr) SetBrushOrgEx
 309 stub SetColorAdjustment
 310 stub SetColorSpace
-311 stub SetDIBColorTable
+311 stdcall SetDIBColorTable(long long long ptr) SetDIBColorTable32
 312 stdcall SetDIBits(long long long long ptr ptr long) SetDIBits32
 313 stdcall SetDIBitsToDevice(long long long long long long long long long
                                ptr ptr long) SetDIBitsToDevice32
@@ -389,7 +389,7 @@ type	win32
 378 stub GdiWinWatchGetClipList
 379 stub GdiWinWatchOpen
 380 stub GetGlyphOutlineWow
-381 stub GetTextCharsetInfo
+381 stdcall GetTextCharsetInfo(long ptr long) GetTextCharsetInfo
 382 stdcall TranslateCharsetInfo(ptr ptr long) TranslateCharSetInfo
 383 stub UpdateICMRegKeyA
 384 stub UpdateICMRegKeyW
diff --git a/if1632/kernel.spec b/if1632/kernel.spec
index 98f19340cd0..c7fa8da5796 100644
--- a/if1632/kernel.spec
+++ b/if1632/kernel.spec
@@ -30,7 +30,7 @@ file	krnl386.exe
 26  pascal16 GlobalFreeAll(word) GlobalFreeAll
 27  pascal16 GetModuleName(word ptr word) GetModuleName
 28  stub GlobalMasterHandle
-29  pascal16 Yield() Yield
+29  pascal16 Yield() Yield16
 30  pascal16 WaitEvent(word) WaitEvent
 31  pascal16 PostEvent(word) PostEvent
 32  pascal16 SetPriority(word s_word) SetPriority
@@ -91,7 +91,7 @@ file	krnl386.exe
 91  register InitTask() InitTask
 92  pascal   GetTempDrive(word) WIN16_GetTempDrive
 93  pascal16 GetCodeHandle(segptr) GetCodeHandle
-94  stub DefineHandleTable
+94  pascal16 DefineHandleTable(word) DefineHandleTable16
 95  pascal16 LoadLibrary(str) LoadLibrary16
 96  pascal16 FreeLibrary(word) FreeLibrary16
 97  pascal16 GetTempFileName(word str word ptr) GetTempFileName16
@@ -103,7 +103,7 @@ file	krnl386.exe
 103 register NetBIOSCall() NetBIOSCall
 104 stub GetCodeInfo
 105 pascal16 GetExeVersion() GetExeVersion
-106 pascal SetSwapAreaSize(word) SetSwapAreaSize
+106 pascal SetSwapAreaSize(word) SetSwapAreaSize16
 107 pascal16 SetErrorMode(word) SetErrorMode16
 108 pascal16 SwitchStackTo(word word word) SwitchStackTo
 109 register SwitchStackBack(word word word) SwitchStackBack
@@ -232,6 +232,7 @@ file	krnl386.exe
 233 stub RegUnloadKey
 234 stub RegSaveKey
 235 stub InvalidateNlsCache
+236 stub GetProductName
 237 stub KERNEL_237
 262 stub KERNEL_262
 263 stub KERNEL_263
@@ -280,6 +281,7 @@ file	krnl386.exe
 359 pascal KERNEL_359(long) _KERNEL_359
 360 stub OpenFileEx
 #361 PIGLET_361
+365 stub KERNEL_365
 403 pascal16 FarSetOwner(word word) FarSetOwner
 404 pascal16 FarGetOwner(word) FarGetOwner
 406 stub WritePrivateProfileStruct
@@ -312,6 +314,7 @@ file	krnl386.exe
 471 stub KERNEL_471
 472 register KERNEL_472() _KERNEL_472
 473 stub KERNEL_473
+475 stub KERNEL_475
 482 stub KERNEL_482
 485 stub KERNEL_485
 491 stub RegisterServiceProcess
@@ -327,11 +330,21 @@ file	krnl386.exe
 518 stub CallProcEx32W
 519 stub KERNEL_519
 522 stub KERNEL_522
+523 stub KERNEL_523
 525 stub KERNEL_525
+531 stub KERNEL_531
+532 stub KERNEL_532
+540 stub KERNEL_540
+541 stub KERNEL_541
+544 stub KERNEL_544
 600 stub KERNEL_600
 601 stub KERNEL_601
 604 stub KERNEL_604
 605 stub KERNEL_605
+606 stub KERNEL_606
+607 stub KERNEL_607
+608 stub KERNEL_608
+611 stub KERNEL_611
 612 stub KERNEL_612
 613 stub KERNEL_613
 614 stub KERNEL_614
@@ -339,6 +352,6 @@ file	krnl386.exe
 621 stub KERNEL_621
 627 stub IsBadFlatReadWritePtr
 630 stub KERNEL_630
-631 pascal FUNC004(word word long) FUNC004	# shell hook
-651 stub KERNEL_651
+631 pascal FUNC004(word word long) FUNC004	#C16ThkSl01?
+651 stub KERNEL_651				#ThunkConnect16?
 700 pascal KERNEL_700() stub_KERNEL_700
diff --git a/if1632/kernel32.spec b/if1632/kernel32.spec
index c0b0b1c83f0..4de6ca3c015 100644
--- a/if1632/kernel32.spec
+++ b/if1632/kernel32.spec
@@ -160,7 +160,7 @@ type	win32
 169 stub CreateNamedPipeW
 170 stub CreatePipe
 171 stdcall CreateProcessA(str str ptr ptr long long ptr str ptr ptr) CreateProcess32A
-172 stub CreateProcessW
+172 stdcall CreateProcessW(wstr wstr ptr ptr long long ptr wstr ptr ptr) CreateProcess32W
 173 stub CreateRemoteThread
 174 stdcall CreateSemaphoreA(ptr long long str) CreateSemaphore32A
 175 stdcall CreateSemaphoreW(ptr long long wstr) CreateSemaphore32W
@@ -176,7 +176,7 @@ type	win32
 185 stdcall DeleteCriticalSection(ptr)	DeleteCriticalSection
 186 stdcall DeleteFileA(str) DeleteFile32A
 187 stdcall DeleteFileW(wstr) DeleteFile32W
-188 stub DeviceIoControl
+188 stdcall DeviceIoControl(long long ptr long ptr long ptr ptr) DeviceIoControl
 189 stdcall DisableThreadLibraryCalls(long) DisableThreadLibraryCalls
 190 stub DisconnectNamedPipe
 191 stdcall DosDateTimeToFileTime(long long ptr) DosDateTimeToFileTime
@@ -250,7 +250,7 @@ type	win32
 259 stdcall FlushConsoleInputBuffer(long) FlushConsoleInputBuffer
 260 stdcall FlushFileBuffers(long) FlushFileBuffers
 261 stub FlushInstructionCache
-262 stub FlushViewOfFile
+262 stdcall FlushViewOfFile(ptr long) FlushViewOfFile
 263 stub FoldStringA
 264 stub FoldStringW
 265 stdcall FormatMessageA(long ptr long long ptr long ptr) FormatMessage32A
@@ -362,7 +362,7 @@ type	win32
 371 stub GetPrivateProfileStructW
 372 stdcall GetProcAddress(long str) GetProcAddress32
 373 stdcall GetProcessAffinityMask(long ptr ptr) GetProcessAffinityMask
-374 stub GetProcessFlags
+374 stdcall GetProcessFlags(long) GetProcessFlags
 375 stdcall GetProcessHeap() GetProcessHeap
 376 stub GetProcessHeaps
 377 stub GetProcessShutdownParameters
@@ -531,7 +531,7 @@ type	win32
 540 stdcall OpenFileMappingW(long long wstr) OpenFileMapping32W
 541 stdcall OpenMutexA(long long str) OpenMutex32A
 542 stdcall OpenMutexW(long long wstr) OpenMutex32W
-543 stub OpenProcess
+543 stdcall OpenProcess(long long long) OpenProcess32
 544 stub OpenProfileUserMapping
 545 stdcall OpenSemaphoreA(long long str) OpenSemaphore32A
 546 stdcall OpenSemaphoreW(long long wstr) OpenSemaphore32W
@@ -553,7 +553,7 @@ type	win32
 562 stub QueryNumberOfEventLogRecords
 563 stub QueryOldestEventLogRecord
 564 stdcall QueryPerformanceCounter(ptr) QueryPerformanceCounter
-565 stub QueryPerformanceFrequency
+565 stdcall QueryPerformanceFrequency(ptr) QueryPerformanceFrequency
 566 stub QueueUserAPC
 567 register RaiseException() EXC_RaiseException
 568 stdcall ReadConsoleA(long ptr long ptr ptr) ReadConsole32A
@@ -843,3 +843,56 @@ type	win32
 853 stub VirtualBufferExceptionHandler
 854 stub WriteConsoleInputVDMA
 855 stub WriteConsoleInputVDMW
+
+# NT 4.0 additions
+856 stub CancelIo
+857 stub CancelWaitableTimer
+858 stub CopyFileExA
+859 stub CopyFileExW
+860 stub CreateFiber
+861 stub CreateWaitableTimerA
+862 stub CreateWaitableTimerW
+863 stub DeleteFiber
+864 stub DuplicateConsoleHandle
+865 stub FindFirstFileExA
+866 stub FindFirstFileExW
+867 stub GetConsoleInputExeNameA
+868 stub GetConsoleInputExeNameW
+869 stub GetConsoleKeyboardLayoutNameA
+870 stub GetConsoleKeyboardLayoutNameW
+871 stub GetDiskFreeSpaceExA
+873 stub GetDiskFreeSpaceExW
+874 stub GetFileAttributesExA
+875 stub GetFileAttributesExW
+876 stub GetProcessPriorityBoost
+877 stub GetThreadPriorityBoost
+878 stub InterlockedCompareExchange
+879 stub InterlockedExchangeAdd
+880 stub IsProcessorFeaturePresent
+881 stub OpenWaitableTimerA
+882 stub OpenWaitableTimerW
+883 stub ReadConsoleInputExA
+884 stub ReadConsoleInputExW
+885 stub ReadDirectoryChangesW
+886 stub ReadFileScatter
+887 stub SetConsoleIcon
+888 stub SetConsoleInputExeNameA
+889 stub SetConsoleInputExeNameW
+890 stub SetProcessAffinityMask
+891 stub SetProcessPriorityBoost
+892 stub SetThreadIdealProcessor
+893 stub SetThreadPriorityBoost
+894 stub SetWaitableTimer
+895 stub SignalObjectAndWait
+896 stub SwitchToFiber
+897 stub SwitchToThread
+898 stub TryEnterCriticalSection
+899 stub VirtualAllocEx
+900 stub VirtualFreeEx
+901 stub WriteFileGather
+
+1346 stdcall PrivateLoadLibrary(str) PrivateLoadLibrary
+1545 stdcall PrivateFreeLibrary(long) PrivateFreeLibrary
+
+#1599 wrong ordinal (249 in Win32s's W32SCOMB.DLL) !
+1599 stdcall Get16DLLAddress(long str) Get16DLLAddress
diff --git a/if1632/mpr.spec b/if1632/mpr.spec
index ade7cba8071..c1977b4c251 100644
--- a/if1632/mpr.spec
+++ b/if1632/mpr.spec
@@ -58,7 +58,7 @@ type win32
 0077 stub WNetGetNetworkInformationW
 0078 stub WNetGetProviderNameA
 0079 stub WNetGetProviderNameW
-0080 stub WNetGetResourceInformationA
+0080 stdcall WNetGetResourceInformationA(ptr ptr ptr ptr) WNetGetResourceInformation32A
 0081 stub WNetGetResourceInformationW
 0082 stub WNetGetResourceParentA
 0083 stub WNetGetResourceParentW
@@ -70,7 +70,7 @@ type win32
 0089 stub WNetLogoffW
 0090 stub WNetLogonA
 0091 stub WNetLogonW
-0092 stub WNetOpenEnumA
+0092 stdcall WNetOpenEnumA(long long ptr ptr) WNetOpenEnum32A
 0093 stub WNetOpenEnumW
 0094 stub WNetRemoveCachedPassword
 0095 stub WNetRestoreConnectionA
diff --git a/if1632/ntdll.spec b/if1632/ntdll.spec
index b8fd7f52f55..4295ecc87f7 100644
--- a/if1632/ntdll.spec
+++ b/if1632/ntdll.spec
@@ -951,3 +951,23 @@ type	win32
 948 stub wcstol
 949 cdecl wcstombs(ptr ptr long) CRTDLL_wcstombs
 950 stub wcstoul
+
+# NT 4 additions
+951 stub NtAddAtom
+952 stub NtDeleteAtom
+953 stub NtFindAtom
+954 stub NtQueryFullAttributesFile
+955 stub NtQueueApcThread
+956 stub NtReadFileScatter
+957 stub NtSignalAndWaitForSingleObject
+958 stub NtWriteFileGather
+959 stub NtYieldExecution
+960 stub RtlAddAtomToAtomTable
+961 stub RtlAllocateHandle
+962 stub RtlCreateAtomTable
+963 stub RtlDeleteAtomFromAtomTable
+964 stub RtlFreeHandle
+965 stub RtlInitializeHandleTable
+966 stub RtlIsValidHandle
+967 stub RtlLookupAtomInAtomTable
+968 stub RtlQueryAtomInAtomTable
diff --git a/if1632/ole32.spec b/if1632/ole32.spec
index 300d3eef966..18cec809c57 100644
--- a/if1632/ole32.spec
+++ b/if1632/ole32.spec
@@ -38,7 +38,7 @@ type	win32
  35 stub CoQueryReleaseObject
  36 stub CoRegisterClassObject
  37 stub CoRegisterMallocSpy
- 38 stub CoRegisterMessageFilter
+ 38 stdcall CoRegisterMessageFilter(ptr ptr) CoRegisterMessageFilter
  39 stub CoReleaseMarshalData
  40 stub CoRevokeClassObject
  41 stub CoRevokeMallocSpy
diff --git a/if1632/olecli.spec b/if1632/olecli.spec
index 291db7f2144..65c77a4654b 100644
--- a/if1632/olecli.spec
+++ b/if1632/olecli.spec
@@ -40,9 +40,9 @@ type	win16
 38 stub OLECREATEFROMFILE
 39 stub OLECREATELINKFROMFILE
 40 stub OLERELEASE
-41  pascal OleRegisterClientDoc(ptr ptr long ptr) OleRegisterClientDoc
-42  pascal OleRevokeClientDoc(long) OleRevokeClientDoc
-43  pascal OleRenameClientDoc(long ptr) OleRenameClientDoc
+41  pascal OleRegisterClientDoc(ptr ptr long ptr) OleRegisterClientDoc16
+42  pascal OleRevokeClientDoc(long) OleRevokeClientDoc16
+43  pascal OleRenameClientDoc(long ptr) OleRenameClientDoc16
 44 stub OLEREVERTCLIENTDOC
 45 stub OLESAVEDCLIENTDOC
 46 stub OLERENAME
diff --git a/if1632/olecli32.spec b/if1632/olecli32.spec
new file mode 100644
index 00000000000..2034bba98c8
--- /dev/null
+++ b/if1632/olecli32.spec
@@ -0,0 +1,59 @@
+name olecli32
+type win32
+
+   1 stub WEP
+   2 stub OleDelete
+   3 stub OleSaveToStream
+   4 stub OleLoadFromStream
+   6 stub OleClone
+   7 stub OleCopyFromLink
+   8 stub OleEqual
+   9 stdcall OleQueryLinkFromClip(str long long) OleQueryLinkFromClip32
+  10 stdcall OleQueryCreateFromClip(str long long) OleQueryCreateFromClip32
+  11 stdcall OleCreateLinkFromClip(str long ptr str long long) OleCreateLinkFromClip32
+  12 stdcall OleCreateFromClip(str ptr long str ptr long long) OleCreateFromClip32
+  13 stub OleCopyToClipboard
+  14 stdcall OleQueryType(ptr ptr) OleQueryType32
+  15 stdcall OleSetHostNames(ptr str str) OleSetHostNames32
+  16 stub OleSetTargetDevice
+  17 stub OleSetBounds
+  18 stub OleQueryBounds
+  19 stub OleDraw
+  20 stub OleQueryOpen
+  21 stub OleActivate
+  22 stub OleUpdate
+  23 stub OleReconnect
+  24 stub OleGetLinkUpdateOptions
+  25 stub OleSetLinkUpdateOptions
+  26 stub OleEnumFormats
+  27 stub OleClose
+  28 stub OleGetData
+  29 stub OleSetData
+  30 stub OleQueryProtocol
+  31 stub OleQueryOutOfDate
+  32 stub OleObjectConvert
+  33 stub OleCreateFromTemplate
+  34 stub OleCreate
+  35 stub OleQueryReleaseStatus
+  36 stub OleQueryReleaseError
+  37 stub OleQueryReleaseMethod
+  38 stub OleCreateFromFile
+  39 stub OleCreateLinkFromFile
+  40 stub OleRelease
+  41 stdcall OleRegisterClientDoc(str str long ptr) OleRegisterClientDoc32
+  42 stdcall OleRevokeClientDoc(long) OleRevokeClientDoc32
+  43 stdcall OleRenameClientDoc(long str) OleRenameClientDoc32
+  44 stub OleRevertClientDoc
+  45 stub OleSavedClientDoc
+  46 stub OleRename
+  47 stub OleEnumObjects
+  48 stub OleQueryName
+  49 stub OleSetColorScheme
+  50 stub OleRequestData
+  54 stub OleLockServer
+  55 stub OleUnlockServer
+  56 stub OleQuerySize
+  57 stub OleExecute
+  58 stub OleCreateInvisible
+  59 stub OleQueryClientVersion
+  60 stub OleIsDcMeta
diff --git a/if1632/olesvr.spec b/if1632/olesvr.spec
index 3eac9779c7a..074c538dc73 100644
--- a/if1632/olesvr.spec
+++ b/if1632/olesvr.spec
@@ -2,12 +2,12 @@ name	olesvr
 type	win16
 
 #1 WEP
-2  pascal OleRegisterServer(str ptr ptr word word) OleRegisterServer
+2  pascal OleRegisterServer(str ptr ptr word word) OleRegisterServer16
 3  pascal OleRevokeServer(long) OleRevokeServer
-4  pascal OleBlockServer(long) OleBlockServer
-5  pascal OleUnblockServer(long ptr) OleUnblockServer
-6  pascal OleRegisterServerDoc(long str ptr ptr) OleRegisterServerDoc
-7  pascal OleRevokeServerDoc(long) OleRevokeServerDoc
+4  pascal OleBlockServer(long) OleBlockServer16
+5  pascal OleUnblockServer(long ptr) OleUnblockServer16
+6  pascal OleRegisterServerDoc(long str ptr ptr) OleRegisterServerDoc16
+7  pascal OleRevokeServerDoc(long) OleRevokeServerDoc16
 8 stub OLERENAMESERVERDOC
 9 stub OLEREVERTSERVERDOC
 10 stub OLESAVEDSERVERDOC
diff --git a/if1632/olesvr32.spec b/if1632/olesvr32.spec
new file mode 100644
index 00000000000..99726ddee89
--- /dev/null
+++ b/if1632/olesvr32.spec
@@ -0,0 +1,15 @@
+name	olesvr32
+type	win32
+
+ 1 stub WEP
+ 2 stdcall OleRegisterServer(str ptr ptr long long) OleRegisterServer32
+ 3 stub OleRevokeServer
+ 4 stdcall OleBlockServer(long) OleBlockServer32
+ 5 stdcall OleUnblockServer(long ptr) OleUnblockServer32
+ 6 stdcall OleRegisterServerDoc(ptr str ptr ptr) OleRegisterServerDoc32
+ 7 stdcall OleRevokeServerDoc(long) OleRevokeServerDoc32
+ 8 stdcall OleRenameServerDoc(long str) OleRenameServerDoc32
+ 9 stub OleRevertServerDoc
+10 stub OleSavedServerDoc
+11 stub OleRevokeObject
+12 stub OleQueryServerVersion
diff --git a/if1632/shell.spec b/if1632/shell.spec
index 00ec20e5893..2d9b1305933 100644
--- a/if1632/shell.spec
+++ b/if1632/shell.spec
@@ -17,7 +17,7 @@ type	win16
  22 pascal16 ShellAbout(word ptr ptr word) ShellAbout16
  33 pascal16 AboutDlgProc(word word word long) AboutDlgProc16
  34 pascal16 ExtractIcon(word str s_word) ExtractIcon16
- 36 pascal16 ExtractAssociatedIcon(word ptr ptr) ExtractAssociatedIcon
+ 36 pascal16 ExtractAssociatedIcon(word ptr ptr) ExtractAssociatedIcon16
  37 pascal   DoEnvironmentSubst(ptr word) DoEnvironmentSubst
  38 pascal   FindEnvironmentString(ptr) FindEnvironmentString
  39 pascal16 InternalExtractIcon(word ptr s_word word) InternalExtractIcon
diff --git a/if1632/shell32.spec b/if1632/shell32.spec
index 04d1ab79d61..9867e608b3c 100644
--- a/if1632/shell32.spec
+++ b/if1632/shell32.spec
@@ -7,51 +7,182 @@ type	win32
 
    2 stub SHELL32_2
    3 stub CheckEscapesA
+   4 stub SHELL32_4
+   5 stub SHELL32_5
    6 stub CheckEscapesW
    7 stdcall CommandLineToArgvW(ptr ptr) CommandLineToArgvW
    8 stub Control_FillCache_RunDLL
   12 stdcall Control_RunDLL(long long long long) Control_RunDLL
   14 stdcall DllGetClassObject(long long ptr) SHELL32_DllGetClassObject
+  15 stub SHELL32_15
+  16 stdcall SHELL32_16(ptr) SHELL32_16
+  17 stub SHELL32_17
+  18 stdcall SHELL32_18(ptr) SHELL32_18
+  19 stub SHELL32_19
+  20 stub SHELL32_20
+  21 stub SHELL32_21
   22 stub DoEnvironmentSubstA
+  23 stub SHELL32_23
+  24 stub SHELL32_24
+  25 stdcall SHELL32_25(ptr ptr) SHELL32_25
+  26 stub SHELL32_26
+  27 stub SHELL32_27
+  28 stub SHELL32_28
+  29 stdcall SHELL32_29(str) SHELL32_29
+  30 stub SHELL32_30
+  31 stub SHELL32_31
+  32 stdcall SHELL32_32(str) SHELL32_32
   33 stub SHELL32_33
-  34 stub SHELL32_34
-  35 stub SHELL32_35
+  34 stdcall SHELL32_34(str) SHELL32_34
+  35 stdcall SHELL32_35(str) SHELL32_35
+  36 stdcall SHELL32_36(str str) SHELL32_36
+  37 stdcall SHELL32_37(ptr str str) SHELL32_37
   38 stub DoEnvironmentSubstW
+  39 stub SHELL32_39
+  40 stub SHELL32_40
   41 stdcall DragAcceptFiles(long long) DragAcceptFiles
   42 stub DragFinish
+  43 stub SHELL32_43
   44 stub DragQueryFile
+  45 stdcall SHELL32_45(str) SHELL32_45
   46 stub SHELL32_46
   47 stub SHELL32_47
   48 stub SHELL32_48
   49 stub SHELL32_49
   50 stub DragQueryFileA
+  51 stub SHELL32_51
+  52 stdcall SHELL32_52(str) SHELL32_52
   53 stub DragQueryFileAorW
   54 stub DragQueryFileW
+  55 stub SHELL32_55
   56 stub SHELL32_56
   57 stub SHELL32_57
   58 stub SHELL32_58
-  62 stub SHELL32_62
+  59 stub SHELL32_59
+  60 stub SHELL32_60
+  61 stub SHELL32_61
+  62 stdcall SHELL32_62(long long long long) SHELL32_62
   63 stub SHELL32_63
   64 stub SHELL32_64
   65 stub SHELL32_65
+  66 stub SHELL32_66
+  67 stub SHELL32_67
+  68 stub SHELL32_68
+  69 stub SHELL32_69
+  70 stub SHELL32_70
+  71 stdcall SHELL32_71(ptr ptr) SHELL32_71
+  72 stdcall SHELL32_72(ptr ptr long) SHELL32_72
+  73 stub SHELL32_73
+  74 stub SHELL32_74
+  75 stub SHELL32_75
   76 stub DragQueryPoint
+  77 stdcall SHELL32_77(long long long) SHELL32_77
+  78 stub SHELL32_78
+  79 stdcall SHELL32_79(str ptr) SHELL32_79
   80 stub DuplicateIcon
+  81 stub SHELL32_81
   82 stub ExtractAssociatedIconA
+  83 stub SHELL32_83
+  84 stub SHELL32_84
+  85 stub SHELL32_85
+  86 stub SHELL32_86
+  87 stub SHELL32_87
+  88 stub SHELL32_88
+  89 stub SHELL32_89
+  90 stub SHELL32_90
+  91 stub SHELL32_91
+  92 stub SHELL32_92
+  93 stub SHELL32_93
+  94 stub SHELL32_94
+  95 stub SHELL32_95
+  96 stub SHELL32_96
+  97 stub SHELL32_97
+  98 stub SHELL32_98
+  99 stub SHELL32_99
+ 100 stdcall SHELL32_100(long) SHELL32_100
  101 stub ExtractAssociatedIconExA
+ 102 stdcall SHELL32_102(ptr ptr long ptr ptr) SHELL32_102
+ 103 stub SHELL32_103
+ 104 stub SHELL32_104
+ 105 stub SHELL32_105
+ 106 stub SHELL32_106
+ 107 stub SHELL32_107
+ 108 stub SHELL32_108
+ 109 stub SHELL32_109
+ 110 stub SHELL32_110
+ 111 stub SHELL32_111
+ 112 stub SHELL32_112
+ 113 stub SHELL32_113
+ 114 stub SHELL32_114
+ 115 stub SHELL32_115
+ 116 stub SHELL32_116
+ 117 stub SHELL32_117
+ 118 stub SHELL32_118
+ 119 stdcall SHELL32_119(ptr) SHELL32_119
+ 120 stub SHELL32_120
+ 121 stub SHELL32_121
+ 122 stub SHELL32_122
+ 123 stub SHELL32_123
  124 stub ExtractAssociatedIconExW
  125 stub ExtractAssociatedIconW
- 133 stdcall ExtractIconA(long ptr long) ExtractIcon32A
+ 126 stub SHELL32_126
+ 127 stub SHELL32_127
+ 128 stdcall DllGetClassObject(long long ptr) SHELL32_DllGetClassObject
+ 129 stub SHELL32_129
+ 130 stub SHELL32_130
+ 131 stub SHELL32_131
+ 132 stub SHELL32_132
+ 133 stdcall ExtractIconA(long str long) ExtractIcon32A
+ 134 stub SHELL32_134
  135 stub ExtractIconEx
+ 136 stub SHELL32_136
+ 137 stub SHELL32_137
  138 stub ExtractIconExA
+ 139 stub SHELL32_139
+ 140 stub SHELL32_140
+ 141 stub SHELL32_141
+ 142 stub SHELL32_142
+ 143 stub SHELL32_143
+ 144 stub SHELL32_144
+ 145 stub SHELL32_145
+ 146 stub SHELL32_146
+ 147 stub SHELL32_147
  148 stub ExtractIconResInfoA
+ 149 stub SHELL32_149
  150 stub ExtractIconResInfoW
+ 151 stub SHELL32_151
+ 152 stdcall SHELL32_152(ptr) SHELL32_152
+ 153 stub SHELL32_153
+ 154 stub SHELL32_154
+ 155 stdcall SHELL32_155(ptr) SHELL32_155
  156 stub SHELL32_156
  157 stub SHELL32_157
  158 stub SHELL32_158
  159 stub SHELL32_159
  160 stub SHELL32_160
- 180 stub ExtractIconW
+ 161 stub SHELL32_161
+ 162 stub SHELL32_162
+ 163 stub SHELL32_163
+ 164 stub SHELL32_164
+ 165 stdcall SHELL32_165(long long) SHELL32_165
+ 166 stub SHELL32_166
+ 167 stub SHELL32_167
+ 168 stub SHELL32_168
+ 169 stub SHELL32_169
+ 170 stub SHELL32_170
+ 171 stub SHELL32_171
+ 172 stub SHELL32_172
+ 173 stub SHELL32_173
+ 174 stub SHELL32_174
+ 175 stdcall SHELL32_175(long long long long) SHELL32_175
+ 176 stub SHELL32_176
+ 177 stub SHELL32_177
+ 178 stub SHELL32_178
+ 179 stub SHELL32_179
+ 180 stdcall ExtractIconW(long wstr long) ExtractIcon32W
+ 181 stdcall SHELL32_181(long long) SHELL32_181
  182 stub ExtractVersionResource16W
+ 183 cdecl SHELL32_183(long long long long long long) SHELL32_183
  184 stub SHELL32_184
  185 stub SHELL32_185
  186 stdcall FindExecutableA(ptr ptr ptr) FindExecutable32A
@@ -63,11 +194,19 @@ type	win32
  192 stub PrintersGetCommand_RunDLL
  193 stub RealShellExecuteA
  194 stub RealShellExecuteExA
+ 195 stdcall SHELL32_195(ptr) SHELL32_195
+ 196 stdcall SHELL32_196(long) SHELL32_196
+ 197 stub SHELL32_197
+ 198 stub SHELL32_198
+ 199 stub SHELL32_199
+ 200 stub SHELL32_200
+ 201 stub SHELL32_201
+ 202 stub SHELL32_202
  203 stub RealShellExecuteExW
  204 stub RealShellExecuteW
  205 stub RegenerateUserEnvironment
  206 stub SHAddToRecentDocs
- 207 stub SHAppBarMessage
+ 207 stdcall SHAppBarMessage(long ptr) SHAppBarMessage32
  208 stub SHBrowseForFolder
  209 stub SHBrowseForFolderA
  210 stub SHChangeNotify
@@ -76,7 +215,7 @@ type	win32
  213 stub SHFormatDrive
  214 stub SHFreeNameMappings
  215 stub SHGetDataFromIDListA
- 216 stub SHGetDesktopFolder
+ 216 stdcall SHGetDesktopFolder(ptr) SHGetDesktopFolder
  217 stdcall SHGetFileInfo(ptr long ptr long long) SHGetFileInfo32A
  218 stdcall SHGetFileInfoA(ptr long ptr long long) SHGetFileInfo32A
  219 stub SHGetInstanceExplorer
@@ -113,6 +252,10 @@ type	win32
  250 stub Shell_NotifyIconA
  251 stub Shl1632_ThunkData32
  252 stub Shl3216_ThunkData32
+ 505 stub SHELL32_505
+ 507 stub SHELL32_507
+ 510 stub SHELL32_510
+ 511 stub SHELL32_511
 1025 stub ExtractIconExW # proper ordinal unknown
 1030 stub FindExeDlgProc # proper ordinal unknown
 1043 stub RegisterShellHook # proper ordinal unknown
diff --git a/if1632/user.spec b/if1632/user.spec
index 521deb9cf0b..fef3bfc91c3 100644
--- a/if1632/user.spec
+++ b/if1632/user.spec
@@ -52,7 +52,7 @@ file	user.exe
 48  pascal16 IsChild(word word) IsChild16
 49  pascal16 IsWindowVisible(word) IsWindowVisible16
 50  pascal16 FindWindow(segstr str) FindWindow16
-#51 BEAR51
+51  stub BEAR51 # IsTwoByteCharPrefix
 52  pascal16 AnyPopup() AnyPopup16
 53  pascal16 DestroyWindow(word) DestroyWindow16
 54  pascal16 EnumWindows(segptr long) THUNK_EnumWindows16
@@ -87,6 +87,7 @@ file	user.exe
 83  pascal16 FrameRect(word ptr word) FrameRect16
 84  pascal16 DrawIcon(word s_word s_word word) DrawIcon16
 85  pascal16 DrawText(word str s_word ptr word) DrawText16
+86  stub BEAR86 # IconSize
 87  pascal16 DialogBox(word segstr word segptr) DialogBox16
 88  pascal16 EndDialog(word s_word) EndDialog16
 89  pascal16 CreateDialog(word segstr word segptr) CreateDialog16
@@ -217,7 +218,7 @@ file	user.exe
 213 pascal16 BuildCommDCB(ptr ptr) BuildCommDCB16
 214 pascal   EscapeCommFunction(word word) EscapeCommFunction16
 215 pascal16 FlushComm(word word) FlushComm
-#216 USERSEEUSERDO
+216 stub USERSEEUSERDO
 217 pascal16 LookupMenuHandle(word s_word) LookupMenuHandle
 218 pascal16 DialogBoxIndirect(word word word segptr) DialogBoxIndirect16
 219 pascal16 CreateDialogIndirect(word ptr word segptr) CreateDialogIndirect16
@@ -431,6 +432,7 @@ file	user.exe
 492 pascal16 USER_492() stub_USER_492
 496 pascal16 USER_496() stub_USER_496
 499 pascal16 WNetErrorText(word ptr word) WNetErrorText
+500 stub FARCALLNETDRIVER 			# Undocumented Windows
 501 pascal16 WNetOpenJob(ptr ptr word ptr)  WNetOpenJob
 502 pascal16 WNetCloseJob(word ptr ptr) WNetCloseJob
 503 pascal16 WNetAbortJob(ptr word) WNetAbortJob
@@ -534,3 +536,4 @@ file	user.exe
 920 pascal16 USER_920() stub_USER_920
 922 pascal16 USER_922() stub_USER_922
 923 pascal16 USER_923() stub_USER_923
+924 stub UsrMpr_ThunkData16
diff --git a/if1632/user32.spec b/if1632/user32.spec
index 91782b65c98..f0f98be03e6 100644
--- a/if1632/user32.spec
+++ b/if1632/user32.spec
@@ -12,7 +12,7 @@ type	win32
   9 stdcall BeginDeferWindowPos(long) BeginDeferWindowPos32
  10 stdcall BeginPaint(long ptr) BeginPaint32
  11 stdcall BringWindowToTop(long) BringWindowToTop32
- 12 stub BroadcastSystemMessage
+ 12 stdcall BroadcastSystemMessage(long ptr long long long) BroadcastSystemMessage
  13 stub CalcChildScroll
  14 stub CallMsgFilter
  15 stdcall CallMsgFilterA(ptr long) CallMsgFilter32A
@@ -285,7 +285,7 @@ type	win32
 280 stub GetProcessWindowStation
 281 stdcall GetPropA(long ptr) GetProp32A
 282 stdcall GetPropW(long ptr) GetProp32W
-283 stub GetQueueStatus
+283 stdcall GetQueueStatus(long) GetQueueStatus32
 284 stdcall GetScrollInfo(long long ptr) GetScrollInfo32
 285 stdcall GetScrollPos(long long) GetScrollPos32
 286 stdcall GetScrollRange(long long ptr ptr) GetScrollRange32
@@ -381,7 +381,7 @@ type	win32
 376 stdcall LoadStringW(long long ptr long) LoadString32W
 377 stub LockWindowStation
 378 stdcall LockWindowUpdate(long) LockWindowUpdate32
-379 stdcall LookupIconIdFromDirectory(ptr long) LookupIconIdFromDirectory
+379 stdcall LookupIconIdFromDirectory(ptr long) LookupIconIdFromDirectory32
 380 stdcall LookupIconIdFromDirectoryEx(ptr long long long long) LookupIconIdFromDirectoryEx32
 381 stub MBToWCSEx
 382 stdcall MapDialogRect(long ptr) MapDialogRect32
@@ -435,7 +435,7 @@ type	win32
 430 stdcall RegisterClassW(ptr) RegisterClass32W
 431 stdcall RegisterClipboardFormatA(str) RegisterClipboardFormat32A
 432 stdcall RegisterClipboardFormatW(wstr) RegisterClipboardFormat32W
-433 stub RegisterHotKey
+433 stdcall RegisterHotKey(long long long long) RegisterHotKey
 434 stub RegisterLogonProcess
 435 stub RegisterSystemThread
 436 stub RegisterTasklist
@@ -506,7 +506,7 @@ type	win32
 501 stdcall SetScrollInfo(long long ptr long) SetScrollInfo32
 502 stdcall SetScrollPos(long long long long) SetScrollPos32
 503 stdcall SetScrollRange(long long long long long) SetScrollRange32
-504 stub SetShellWindow
+504 stdcall SetShellWindow(long) SetShellWindow32
 505 stdcall SetSysColors(long ptr ptr) SetSysColors32
 506 stub SetSysColorsTemp
 507 stub SetSystemCursor
@@ -567,7 +567,7 @@ type	win32
 562 stub UnpackDDElParam
 563 stdcall UnregisterClassA(str long) UnregisterClass32A
 564 stdcall UnregisterClassW(wstr long) UnregisterClass32W
-565 stub UnregisterHotKey
+565 stdcall UnregisterHotKey(long long) UnregisterHotKey
 566 stub UpdatePerUserSystemParameters
 567 stdcall UpdateWindow(long) UpdateWindow32
 568 stub UserClientDllInitialize
@@ -602,6 +602,10 @@ type	win32
 596 stub RegisterServicesProcess
 597 stub SetWindowRgn
 598 stub ToUnicodeEx
-599 stub DrawCaptionTempA
+599 stdcall DrawCaptionTempA(long long ptr long long str long) DrawCaptionTemp32A
 600 stub RegisterNetworkCapabilities
 601 stub WNDPROC_CALLBACK
+602 stub DrawCaptionTempW
+603 stub IsHungAppWindow
+604 stub ChangeDisplaySettingsA
+605 stub ChangeDisplaySettingsW
diff --git a/if1632/w32skrnl.spec b/if1632/w32skrnl.spec
new file mode 100644
index 00000000000..fd02cde732f
--- /dev/null
+++ b/if1632/w32skrnl.spec
@@ -0,0 +1,139 @@
+name	w32skrnl
+type	win32
+
+1 stub _kSetEnvironmentVariable@8
+2 stub _SzFromImte@4
+3 stdcall GetCurrentTask32() GetCurrentTask
+4 stub _DebugPrintf
+5 stub _NtCloseSection@8
+6 stub _AllocKernelHeap@8
+7 stub _SelToFlat
+8 stub _kGetExeVersion@4
+9 stub _ResizeKernelHeap@12
+10 stub _DbgBackTo32
+11 stub _kGethInstance@0
+12 stub SelOffsetToLinear
+13 stub DebugPrintf
+14 stdcall _kGetWin32sDirectory@0() GetWin32sDirectory
+15 stub _sprintf
+16 stub _KIsDBCSLeadByte@4
+17 stub W32S_BackTo32
+18 stub _KGetDbgFlags32
+19 stub SelToFlat
+20 stub _FreeKernelHeap@4
+21 stub WIN32SYSDLL
+#22
+23 stub _KSilentException@4
+24 stub _NtCreateSection@28
+#25 stub _W32sError32@12
+26 stub _NtOpenSection@12
+27 stub _NtDupSection@4
+28 stub _GetSelModName@20
+29 stub _FGetDscr@8
+30 stdcall _RtlNtStatusToDosError@4(long) RtlNtStatusToDosError #FIXME: not sure
+31 stub _NtFlushVirtualMemory@16
+32 stub _snprintf
+33 stub _NtUnmapViewOfSection@8
+
+#34-149
+
+153 stub _PvAllocVirtMem@16
+154 stub SetVirtMemProcess
+155 stub _FFreeVirtMem@12
+156 stub _FSetVirtProtect@16
+157 stub _QueryVirtMem@8
+158 stub _FLockVirtMem@8
+159 stub _FUnlockVirtMem@8
+
+#160-170
+
+171 stub _HHeapCreateHeap@12
+#172
+173 stub _FHeapDestroy@4
+174 stub _PvAllocHeapMem@12
+175 stub _PvResizeHeapMem@16
+176 stub _FFreeHeapMem@8
+
+#177-196
+
+197 stub _PpdbGetProcess@0
+198 stub _ErcGetError@0
+199 stub _SetError@4
+
+#200-223
+
+224 stub _CbSearchPath@24
+225 stub _CbSearchBinPath@16
+
+#226-230
+
+231 stub _FFindEnvVar@8
+
+#232-251
+
+252 stub _SzFileFromImte@4
+253 stub _ImteFromFileSz@4
+254 stub _ImteFromSz@4
+255 stub _FGetProcAddr@12
+256 stub _KLoadLibrary@8
+257 stub _KFreeLibrary@4
+
+#258-271
+
+272 stub _lmaUserBase
+
+#273-325
+
+326 stub _KrnOutputDebugString@4
+
+#327-359
+
+360 stub _RtlRaiseException
+361 stub _RtlUnwind
+362 stub _RtlUnwind4
+
+#363-401
+
+402 stub _DfhCreateFile@12
+403 stub _FCloseFile@4
+404 stub _CbWriteFile@12
+405 stub _LfoSetFilePos@12
+406 stub _CbReadFile@12
+
+#407-499
+
+500 stub _SelOffsetToLinear@4
+501 stub _ImteFromHModule@4
+502 stub _HModuleFromImte@4
+503 stub _ExitPEApp
+#504 stdcall _GetThunkBuff@0() _GetThunkBuff
+505 stub _Dos3Call@0
+506 stub _GetPEInstanceData@0
+507 stub _GetThreadTask@4
+508 stub _BaseAddrFromImte@4
+509 stub _GetTaskId@12
+510 stub _KGetProcessDebugPort@4
+511 stub _W32S_BackTo32
+512 stub _KReadProcessMemory32@20
+513 stub _KWriteProcessMemory32@20
+514 stub _KGetThreadContext32@8
+515 stub _KSetThreadContext32@8
+516 stub _KQueryPerformanceCounter@8
+#517
+518 stub _KGetExitCodeThread32@8
+519 stub _KGetExitCodeProcess32@8
+520 stub _KGetTaskPpdb32@4
+521 stub _KGetThreadPtdb32@4
+
+#522-599
+
+600 stub _GetCurProcFIOData@0
+601 stub _KUseObject32@4
+602 stub _KUnuseObject32@4
+603 stub _KErcGetError32@0
+604 stub _KCreateProcessHeap@4
+605 stub _KGetSystemInfo@8
+606 stub _KGlobalMemStat@4
+607 stub _GetHandleFromAddr@4
+608 stub _TlsNullSlot@4
+609 stub _FWorkingSetSize@8
diff --git a/if1632/win32s16.spec b/if1632/win32s16.spec
new file mode 100644
index 00000000000..2457c8847e9
--- /dev/null
+++ b/if1632/win32s16.spec
@@ -0,0 +1,58 @@
+name	win32s16
+type	win16
+
+1 stub WEP
+2 stub BOOTTASK
+3 stub CREATEPROCESS
+4 stub WAITFORDEBUGEVENT
+5 pascal CONTINUEDEBUGEVENT(long long long) ContinueDebugEvent
+6 pascal READPROCESSMEMORY(long ptr ptr long ptr) ReadProcessMemory
+7 stub WRITEPROCESSMEMORY
+8 stub GETTHREADCONTEXT
+9 stub SETTHREADCONTEXT
+10 pascal GETLASTERROR() GetLastError
+11 pascal CLOSEHANDLE(long) CloseHandle
+12 stub ALLOCCLBKTO32BDLL
+13 pascal GETEXITCODETHREAD(long ptr) GetExitCodeThread
+14 stub GETEXITCODEPROCESS
+15 stub OPENPROCESS
+16 stub OPENTHREAD
+17 stub GETTHREADSELECTORENTRY
+18 pascal VIRTUALQUERYEX(long ptr ptr long) VirtualQueryEx
+19 pascal VIRTUALPROTECTEX(long ptr long long ptr) VirtualProtectEx
+20 stub KGETTASKPPDB
+21 stub KGETTHREADPTDB
+22 stub FREECALLBACK
+23 stub RELEASECSALIAS
+24 stub EXCHANGEPFN32INSTUB
+25 stub SELCBCS
+26 stub DESTROYPEHEADER
+27 stub SELCBDS
+28 stub GETCSALIAS
+29 stub SELFLATCODE
+30 stub HUNITOANSIDBCS
+31 stub ALLOCUTPROC32
+32 stub FLATDATA
+33 stub CODEDATA
+34 stub MYGLOBALFREE
+35 stub FREE32BDLLCBENTRIES
+36 stub SETFS
+37 stub PELOADRESOURCEHANDLER
+38 stub CHECKDEBUG
+39 stub REMOVEH32FROMWIN32S
+40 stub RMEMCPY
+41 stub INITRESLOADER
+42 stub FREESELECTOROFFSET
+43 stub STACKLINEARTOSEGMENTED
+44 stub GETMODULEFILENAME32S
+45 stub FAPILOG16
+46 stub ALLOCCALLBACK
+47 stub LINEARTOHUGESELECTOROFFSET
+48 stub UTSELECTOROFFSETTOLINEAR
+49 stub UTLINEARTOSELECTOROFFSET
+50 stub SELFOREIGNTIB
+51 stub MYGLOBALREALLOC
+52 stub CREATEPEHEADER
+53 stub FINDGLOBALHANDLE
+
+#54-289 exist, but function names blanked out
diff --git a/if1632/winspool.spec b/if1632/winspool.spec
index cafda7458d3..f5bd31a876f 100644
--- a/if1632/winspool.spec
+++ b/if1632/winspool.spec
@@ -74,7 +74,7 @@ type	win32
 171 stub EnumPrintProcessorsW
 172 stub EnumPrinterDriversA
 173 stub EnumPrinterDriversW
-174 stub EnumPrintersA
+174 stdcall EnumPrintersA(long ptr long ptr long ptr ptr) EnumPrinters32A
 175 stub EnumPrintersW
 176 stub ExtDeviceMode
 177 stub FindClosePrinterChangeNotification
diff --git a/if1632/wprocs.spec b/if1632/wprocs.spec
index f73a118a34b..61ce5f32004 100644
--- a/if1632/wprocs.spec
+++ b/if1632/wprocs.spec
@@ -78,7 +78,7 @@ type	win16
 158 register INT_Int3aHandler(word) BUILTIN_DefaultIntHandler
 159 register INT_Int3bHandler(word) BUILTIN_DefaultIntHandler
 160 register INT_Int3cHandler(word) BUILTIN_DefaultIntHandler
-161 register INT_Int3dHandler(word) BUILTIN_DefaultIntHandler
+161 register INT_Int3dHandler(word) INT_Int3dHandler
 162 register INT_Int3eHandler(word) BUILTIN_DefaultIntHandler
 163 register INT_Int3fHandler(word) BUILTIN_DefaultIntHandler
 164 register INT_Int40Handler(word) BUILTIN_DefaultIntHandler
diff --git a/include/aspi.h b/include/aspi.h
index 901aa9ed11a..9ceafd93b5d 100644
--- a/include/aspi.h
+++ b/include/aspi.h
@@ -56,92 +56,92 @@ struct SRB_HaInquiry16 {
 typedef struct SRB_HaInquiry16 SRB_HaInquiry16;
 
 struct SRB_ExecSCSICmd16 {
-  BYTE        SRB_Cmd;                // ASPI command code		(W)
-  BYTE        SRB_Status;             // ASPI command status byte	(R)
-  BYTE        SRB_HaId;               // ASPI host adapter number	(W)
-  BYTE        SRB_Flags;              // ASPI request flags		(W)
-  DWORD       SRB_Hdr_Rsvd;           // Reserved, MUST = 0		(-)
-  BYTE        SRB_Target;             // Target's SCSI ID		(W)
-  BYTE        SRB_Lun;                // Target's LUN number		(W)
-  DWORD       SRB_BufLen;             // Data Allocation LengthPG	(W/R)
-  BYTE        SRB_SenseLen;           // Sense Allocation Length	(W)
-  SEGPTR      SRB_BufPointer;         // Data Buffer Pointer		(W)
-  DWORD       SRB_Rsvd1;              // Reserved, MUST = 0		(-/W)
-  BYTE        SRB_CDBLen;             // CDB Length = 6			(W)
-  BYTE        SRB_HaStat;             // Host Adapter Status		(R)
-  BYTE        SRB_TargStat;           // Target Status			(R)
-  FARPROC16   SRB_PostProc;	      // Post routine			(W)
-  BYTE        SRB_Rsvd2[34];          // Reserved, MUST = 0
-  BYTE		CDBByte[0];	      // SCSI CBD - variable length	(W)
+  BYTE        SRB_Cmd;                /* ASPI command code	      (W)  */
+  BYTE        SRB_Status;             /* ASPI command status byte     (R)  */
+  BYTE        SRB_HaId;               /* ASPI host adapter number     (W)  */
+  BYTE        SRB_Flags;              /* ASPI request flags	      (W)  */
+  DWORD       SRB_Hdr_Rsvd;           /* Reserved, MUST = 0	      (-)  */
+  BYTE        SRB_Target;             /* Target's SCSI ID	      (W)  */
+  BYTE        SRB_Lun;                /* Target's LUN number	      (W)  */
+  DWORD       SRB_BufLen;             /* Data Allocation LengthPG     (W/R)*/
+  BYTE        SRB_SenseLen;           /* Sense Allocation Length      (W)  */
+  SEGPTR      SRB_BufPointer;         /* Data Buffer Pointer	      (W)  */
+  DWORD       SRB_Rsvd1;              /* Reserved, MUST = 0	      (-/W)*/
+  BYTE        SRB_CDBLen;             /* CDB Length = 6		      (W)  */
+  BYTE        SRB_HaStat;             /* Host Adapter Status	      (R)  */
+  BYTE        SRB_TargStat;           /* Target Status		      (R)  */
+  FARPROC16   SRB_PostProc;	      /* Post routine		      (W)  */
+  BYTE        SRB_Rsvd2[34];          /* Reserved, MUST = 0                */
+  BYTE		CDBByte[0];	      /* SCSI CBD - variable length   (W)  */
   /* variable example for 6 byte cbd
-   * BYTE        CDBByte[6];             // SCSI CDB			(W)
-   * BYTE        SenseArea6[SENSE_LEN];  // Request Sense buffer 	(R)
+   * BYTE        CDBByte[6];             * SCSI CDB                    (W) *
+   * BYTE        SenseArea6[SENSE_LEN];  * Request Sense buffer 	(R) *
    */
 } WINE_PACKED ;
 
 typedef struct SRB_ExecSCSICmd16 SRB_ExecSCSICmd16;
 
 struct SRB_ExecSCSICmd32 {
-  BYTE        SRB_Cmd;            // ASPI command code = SC_EXEC_SCSI_CMD
-  BYTE        SRB_Status;         // ASPI command status byte
-  BYTE        SRB_HaId;           // ASPI host adapter number
-  BYTE        SRB_Flags;          // ASPI request flags
-  DWORD       SRB_Hdr_Rsvd;       // Reserved
-  BYTE        SRB_Target;         // Target's SCSI ID
-  BYTE        SRB_Lun;            // Target's LUN number
-  WORD        SRB_Rsvd1;          // Reserved for Alignment
-  DWORD       SRB_BufLen;         // Data Allocation Length
-  BYTE        *SRB_BufPointer;    // Data Buffer Point
-  BYTE        SRB_SenseLen;       // Sense Allocation Length
-  BYTE        SRB_CDBLen;         // CDB Length
-  BYTE        SRB_HaStat;         // Host Adapter Status
-  BYTE        SRB_TargStat;       // Target Status
-  void        (*SRB_PostProc)();  // Post routine
-  void        *SRB_Rsvd2;         // Reserved
-  BYTE        SRB_Rsvd3[16];      // Reserved for expansion
-  BYTE        CDBByte[16];        // SCSI CDB
-  BYTE        SenseArea[0];       // Request sense buffer - var length
+  BYTE        SRB_Cmd;            /* ASPI command code = SC_EXEC_SCSI_CMD */
+  BYTE        SRB_Status;         /* ASPI command status byte */
+  BYTE        SRB_HaId;           /* ASPI host adapter number */
+  BYTE        SRB_Flags;          /* ASPI request flags */
+  DWORD       SRB_Hdr_Rsvd;       /* Reserved */
+  BYTE        SRB_Target;         /* Target's SCSI ID */
+  BYTE        SRB_Lun;            /* Target's LUN number */
+  WORD        SRB_Rsvd1;          /* Reserved for Alignment */
+  DWORD       SRB_BufLen;         /* Data Allocation Length */
+  BYTE        *SRB_BufPointer;    /* Data Buffer Point */
+  BYTE        SRB_SenseLen;       /* Sense Allocation Length */
+  BYTE        SRB_CDBLen;         /* CDB Length */
+  BYTE        SRB_HaStat;         /* Host Adapter Status */
+  BYTE        SRB_TargStat;       /* Target Status */
+  void        (*SRB_PostProc)();  /* Post routine */
+  void        *SRB_Rsvd2;         /* Reserved */
+  BYTE        SRB_Rsvd3[16];      /* Reserved for expansion */
+  BYTE        CDBByte[16];        /* SCSI CDB */
+  BYTE        SenseArea[0];       /* Request sense buffer - var length */
 };
 
 typedef struct SRB_ExecSCSICmd32 SRB_ExecSCSICmd32;
 
 struct SRB_Abort16 {
-  BYTE        SRB_Cmd;            // ASPI command code = SC_ABORT_SRB
-  BYTE        SRB_Status;         // ASPI command status byte
-  BYTE        SRB_HaId;           // ASPI host adapter number
-  BYTE        SRB_Flags;          // ASPI request flags
-  DWORD       SRB_Hdr_Rsvd;       // Reserved, MUST = 0
-  LPSRB16     SRB_ToAbort;        // Pointer to SRB to abort
+  BYTE        SRB_Cmd;            /* ASPI command code = SC_ABORT_SRB */
+  BYTE        SRB_Status;         /* ASPI command status byte */
+  BYTE        SRB_HaId;           /* ASPI host adapter number */
+  BYTE        SRB_Flags;          /* ASPI request flags */
+  DWORD       SRB_Hdr_Rsvd;       /* Reserved, MUST = 0 */
+  LPSRB16     SRB_ToAbort;        /* Pointer to SRB to abort */
 } WINE_PACKED;
 
 typedef struct SRB_Abort16 SRB_Abort16;
 
 struct SRB_BusDeviceReset16 {
-  BYTE        SRB_Cmd;            // ASPI command code = SC_RESET_DEV
-  BYTE        SRB_Status;         // ASPI command status byte
-  BYTE        SRB_HaId;           // ASPI host adapter number
-  BYTE        SRB_Flags;          // ASPI request flags
-  DWORD       SRB_Hdr_Rsvd;       // Reserved, MUST = 0
-  BYTE        SRB_Target;         // Target's SCSI ID
-  BYTE        SRB_Lun;            // Target's LUN number
-  BYTE        SRB_ResetRsvd1[14]; // Reserved, MUST = 0
-  BYTE        SRB_HaStat;         // Host Adapter Status
-  BYTE        SRB_TargStat;       // Target Status
-  SEGPTR      SRB_PostProc;           // Post routine
-  BYTE        SRB_ResetRsvd2[34]; // Reserved, MUST = 0
+  BYTE        SRB_Cmd;            /* ASPI command code = SC_RESET_DEV */
+  BYTE        SRB_Status;         /* ASPI command status byte */
+  BYTE        SRB_HaId;           /* ASPI host adapter number */
+  BYTE        SRB_Flags;          /* ASPI request flags */
+  DWORD       SRB_Hdr_Rsvd;       /* Reserved, MUST = 0 */
+  BYTE        SRB_Target;         /* Target's SCSI ID */
+  BYTE        SRB_Lun;            /* Target's LUN number */
+  BYTE        SRB_ResetRsvd1[14]; /* Reserved, MUST = 0 */
+  BYTE        SRB_HaStat;         /* Host Adapter Status */
+  BYTE        SRB_TargStat;       /* Target Status */
+  SEGPTR      SRB_PostProc;       /* Post routine */
+  BYTE        SRB_ResetRsvd2[34]; /* Reserved, MUST = 0 */
 } WINE_PACKED;
 
 typedef struct SRB_BusDeviceReset16 SRB_BusDeviceReset16;
 
 struct SRB_GDEVBlock16 {
-  BYTE        SRB_Cmd;            // ASPI command code = SC_GET_DEV_TYPE
-  BYTE        SRB_Status;         // ASPI command status byte
-  BYTE        SRB_HaId;           // ASPI host adapter number
-  BYTE        SRB_Flags;          // ASPI request flags
-  DWORD       SRB_Hdr_Rsvd;       // Reserved, MUST = 0
-  BYTE        SRB_Target;         // Target's SCSI ID
-  BYTE        SRB_Lun;            // Target's LUN number
-  BYTE        SRB_DeviceType;     // Target's peripheral device type
+  BYTE        SRB_Cmd;            /* ASPI command code = SC_GET_DEV_TYPE */
+  BYTE        SRB_Status;         /* ASPI command status byte */
+  BYTE        SRB_HaId;           /* ASPI host adapter number */
+  BYTE        SRB_Flags;          /* ASPI request flags */
+  DWORD       SRB_Hdr_Rsvd;       /* Reserved, MUST = 0 */
+  BYTE        SRB_Target;         /* Target's SCSI ID */
+  BYTE        SRB_Lun;            /* Target's LUN number */
+  BYTE        SRB_DeviceType;     /* Target's peripheral device type */
 } WINE_PACKED;
 
 typedef struct SRB_GDEVBlock16 SRB_GDEVBlock16;
diff --git a/include/combo.h b/include/combo.h
index a4a861e2801..aa808dc312f 100644
--- a/include/combo.h
+++ b/include/combo.h
@@ -19,6 +19,7 @@
 #define CBF_EDIT                0x0040
 #define CBF_NORESIZE		0x0080
 #define CBF_NOTIFY		0x0100
+#define CBF_NOREDRAW            0x0200
 #define CBF_EUI                 0x8000
 
 /* Combo state struct */
diff --git a/include/commdlg.h b/include/commdlg.h
index 2cac6122a7c..4f6e78e112b 100644
--- a/include/commdlg.h
+++ b/include/commdlg.h
@@ -11,20 +11,6 @@ extern "C" {
 
 #include "wintypes.h"		/* needed for CHOOSEFONT structure */
 
-#define RT_CURSOR           MAKEINTRESOURCE(1)
-#define RT_BITMAP           MAKEINTRESOURCE(2)
-#define RT_ICON             MAKEINTRESOURCE(3)
-#define RT_MENU             MAKEINTRESOURCE(4)
-#define RT_DIALOG           MAKEINTRESOURCE(5)
-#define RT_STRING           MAKEINTRESOURCE(6)
-#define RT_FONTDIR          MAKEINTRESOURCE(7)
-#define RT_FONT             MAKEINTRESOURCE(8)
-#define RT_ACCELERATOR      MAKEINTRESOURCE(9)
-#define RT_RCDATA           MAKEINTRESOURCE(10)
-
-#define RT_GROUP_CURSOR     MAKEINTRESOURCE(12)
-#define RT_GROUP_ICON       MAKEINTRESOURCE(14)
-
 #define OFN_READONLY                 0x00000001
 #define OFN_OVERWRITEPROMPT          0x00000002
 #define OFN_HIDEREADONLY             0x00000004
diff --git a/include/compobj.h b/include/compobj.h
index 09fa2fc3c54..9aca77141f3 100644
--- a/include/compobj.h
+++ b/include/compobj.h
@@ -1,6 +1,8 @@
 #if !defined(COMPOBJ_H)
 #define COMPOBJ_H
 
+#include "ole.h"
+
 struct tagGUID
 {
     DWORD Data1;
@@ -10,9 +12,24 @@ struct tagGUID
 };
 
 typedef struct tagGUID	GUID;
-typedef struct tagGUID	CLSID;
+typedef struct tagGUID	CLSID,*LPCLSID,*REFCLSID;
+typedef struct tagGUID	IID,*REFIID,*LPIID;
 
 OLESTATUS WINAPI StringFromCLSID(const CLSID *id, LPSTR);
 OLESTATUS WINAPI CLSIDFromString(const LPCSTR, CLSID *);
 
+
+#ifdef INITGUID
+#define DEFINE_GUID(name, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8) \
+        const GUID name =\
+	{ l, w1, w2, { b1, b2,  b3,  b4,  b5,  b6,  b7,  b8 } }
+#else
+#define DEFINE_GUID(name, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8) \
+    extern const GUID name
+#endif
+
+#define DEFINE_OLEGUID(name, l, w1, w2) \
+	DEFINE_GUID(name, l, w1, w2, 0xC0,0,0,0,0,0,0,0x46)
+
+#define DEFINE_SHLGUID(name, l, w1, w2) DEFINE_OLEGUID(name,l,w1,w2)
 #endif
diff --git a/include/debugger.h b/include/debugger.h
index b872b3c4d13..94d71aa9b8d 100644
--- a/include/debugger.h
+++ b/include/debugger.h
@@ -266,8 +266,8 @@ extern int  DEBUG_GetCurrentFrame(struct name_hash ** name,
 extern int DEBUG_ReadExecutableDbgInfo(void);
 
   /* debugger/msc.c */
-extern int DEBUG_RegisterDebugInfo(struct pe_data *pe, int, const char *,
-				   unsigned long, unsigned long);
+extern int DEBUG_RegisterDebugInfo( HMODULE32, const char *,
+                                    unsigned long, unsigned long);
 extern int DEBUG_ProcessDeferredDebug(void);
 extern int DEBUG_RegisterELFDebugInfo(int load_addr, u_long size, char * name);
 extern void DEBUG_InfoShare(void);
diff --git a/include/interfaces.h b/include/interfaces.h
new file mode 100644
index 00000000000..5e912daa9d9
--- /dev/null
+++ b/include/interfaces.h
@@ -0,0 +1,45 @@
+#ifndef _WINE_INTERFACES_H
+#define _WINE_INTERFACES_H
+
+#include "ole.h"
+#include "ole2.h"
+#include "compobj.h"
+
+DEFINE_OLEGUID(IID_IUnknown,0,0,0);
+DEFINE_OLEGUID(IID_IClassFactory,1,0,0);
+DEFINE_OLEGUID(IID_IMalloc,2,0,0);
+DEFINE_OLEGUID(IID_IMarshal,3,0,0);
+DEFINE_OLEGUID(IID_IStorage,0xb,0,0);
+DEFINE_OLEGUID(IID_IStream,0xc,0,0);
+DEFINE_OLEGUID(IID_IBindCtx,0xe,0,0);
+DEFINE_OLEGUID(IID_IMoniker,0xf,0,0);
+DEFINE_OLEGUID(IID_IRunningObject,0x10,0,0);
+DEFINE_OLEGUID(IID_IRootStorage,0x12,0,0);
+DEFINE_OLEGUID(IID_IMessageFilter,0x16,0,0);
+DEFINE_OLEGUID(IID_IStdMarshalInfo,0x18,0,0);
+
+typedef struct tagUNKNOWN *LPUNKNOWN,IUnknown;
+typedef struct {
+	HRESULT	(CALLBACK *fnQueryInterface)(LPUNKNOWN this,REFIID refiid,LPVOID *obj);
+	HRESULT	(CALLBACK *fnAddRef)(LPUNKNOWN this);
+	HRESULT	(CALLBACK *fnRelease)(LPUNKNOWN this);
+} *LPUNKNOWN_VTABLE;
+
+struct tagUNKNOWN {
+	LPUNKNOWN_VTABLE	lpvtbl;
+	/* internal stuff. Not needed until we actually implement IUnknown */
+};
+
+typedef struct tagCLASSFACTORY *LPCLASSFACTORY,IClassFactory;
+typedef struct {
+	HRESULT	(CALLBACK *fnQueryInterface)(LPCLASSFACTORY this,REFIID refiid,LPVOID *obj);
+	HRESULT	(CALLBACK *fnAddRef)(LPCLASSFACTORY this);
+	HRESULT	(CALLBACK *fnRelease)(LPCLASSFACTORY this);
+	HRESULT (CALLBACK *fnCreateInstance)(LPCLASSFACTORY this,LPUNKNOWN pUnkOuter,REFIID riid,LPVOID * ppvObject);
+} *LPCLASSFACTORY_VTABLE;
+
+struct tagCLASSFACTORY {
+	LPCLASSFACTORY_VTABLE lpvtbl;
+	/*internal stuff. Not needed until we actually implement IClassFactory*/
+};
+#endif /*_WINE_INTERFACES_H*/
diff --git a/include/module.h b/include/module.h
index 4abfc6144be..273750138ca 100644
--- a/include/module.h
+++ b/include/module.h
@@ -46,7 +46,7 @@ typedef struct
     WORD    min_swap_area;    /* 3c Min. swap area size */
     WORD    expected_version; /* 3e Expected Windows version */
     /* From here, these are extra fields not present in normal Windows */
-    PE_MODULE *pe_module;     /* 40 PE module handle for Win32 modules */
+    HMODULE32  module32;      /* 40 PE module handle for Win32 modules */
     HMODULE16  self;          /* 44 Handle for this module */
     WORD    self_loading_sel; /* 46 Selector used for self-loading apps. */
 } NE_MODULE;
@@ -107,8 +107,8 @@ typedef struct resource_nameinfo_s NE_NAMEINFO;
     (((OFSTRUCT *)((char*)(pModule) + (pModule)->fileinfo))->szPathName)
 
 #define NE_WIN32_MODULE(pModule) \
-    ((struct pe_data *)(((pModule)->flags & NE_FFLAGS_WIN32) ? \
-                    ((NE_WIN32_EXTRAINFO *)((pModule) + 1))->pe_module : 0))
+    ((((pModule)->flags & NE_FFLAGS_WIN32) ? \
+                    ((NE_WIN32_EXTRAINFO *)((pModule) + 1))->module32 : 0))
 
 /* module.c */
 extern NE_MODULE *MODULE_GetPtr( HMODULE32 hModule );
@@ -133,11 +133,10 @@ extern FARPROC16 WIN32_GetProcAddress16( HMODULE32 hmodule, LPSTR name );
 
 /* builtin.c */
 extern BOOL32 BUILTIN_Init(void);
-extern HMODULE16 BUILTIN_LoadModule( LPCSTR name, BOOL32 force );
+extern HMODULE32 BUILTIN_LoadModule( LPCSTR name, BOOL32 force );
 extern LPCSTR BUILTIN_GetEntryPoint16( WORD cs, WORD ip, WORD *pOrd );
 extern FARPROC32 BUILTIN_GetEntryPoint32( char *buffer, void *relay,
                                           DWORD *typemask );
-extern FARPROC32 BUILTIN_GetProcAddress32(NE_MODULE *pModule, LPCSTR function);
 extern BOOL32 BUILTIN_ParseDLLOptions( const char *str );
 extern void BUILTIN_PrintDLLs(void);
 
diff --git a/include/ntdll.h b/include/ntdll.h
index 820425e3499..2f1bf8b91ee 100644
--- a/include/ntdll.h
+++ b/include/ntdll.h
@@ -17,14 +17,14 @@ extern "C" {
 
 typedef struct {
 	BYTE	Value[6];
-} SID_IDENTIFIER_AUTHORITY,*LPSID_IDENTIFIER_AUTHORITY;
+} SID_IDENTIFIER_AUTHORITY,*PSID_IDENTIFIER_AUTHORITY,*LPSID_IDENTIFIER_AUTHORITY;
 
 typedef struct _SID {
 	BYTE	Revision;
 	BYTE	SubAuthorityCount;
 	SID_IDENTIFIER_AUTHORITY	IdentifierAuthority;
 	DWORD	SubAuthority[1];	/* more than one */
-} SID,*LPSID;
+} SID,*PSID,*LPSID;
 
 #define	SID_REVISION			(1)	/* Current revision */
 #define	SID_MAX_SUB_AUTHORITIES		(15)	/* current max subauths */
@@ -121,7 +121,18 @@ typedef struct {
 	LPSID	Group;
 	LPACL	Sacl;
 	LPACL	Dacl;
-} SECURITY_DESCRIPTOR,*LPSECURITY_DESCRIPTOR;
+} SECURITY_DESCRIPTOR,*PSECURITY_DESCRIPTOR,*LPSECURITY_DESCRIPTOR;
+
+typedef enum tagSID_NAME_USE {
+	SidTypeUser = 1,
+	SidTypeGroup,
+	SidTypeDomain,
+	SidTypeAlias,
+	SidTypeWellKnownGroup,
+	SidTypeDeletedAccount,
+	SidTypeInvalid,
+	SidTypeUnknown
+} SID_NAME_USE,*PSID_NAME_USE,*LPSID_NAME_USE;
 
 /* NT lowlevel Strings (handled by Rtl* functions in NTDLL)
  * If they are zero terminated, Length does not include the terminating 0.
diff --git a/include/ole.h b/include/ole.h
index 7e08b9d5ccf..0d909600db0 100644
--- a/include/ole.h
+++ b/include/ole.h
@@ -7,8 +7,9 @@
 
 #include "windows.h"
 
-typedef	LPVOID	LPUNKNOWN;
 typedef LPCSTR	OLE_LPCSTR;
+typedef LPSTR	LPOLESTR;
+typedef LPCSTR	LPCOLESTR;
 
 /* object types */
 #define OT_LINK		1
diff --git a/include/ole2.h b/include/ole2.h
index d3856d78680..391843f2f31 100644
--- a/include/ole2.h
+++ b/include/ole2.h
@@ -7,6 +7,8 @@
 
 typedef LONG HRESULT;
 
+typedef LPVOID LPMESSAGEFILTER;
+
 #define S_OK	0
 #define S_FALSE	1
 
diff --git a/include/pe_image.h b/include/pe_image.h
index 482c0f3d576..b432c833f15 100644
--- a/include/pe_image.h
+++ b/include/pe_image.h
@@ -6,22 +6,12 @@
 #include "winnt.h"
 #include "peexe.h"
 
-/* This struct is used for loaded PE .dlls */
-struct pe_data {
-	LPIMAGE_NT_HEADERS	pe_header;
-	LPIMAGE_SECTION_HEADER	pe_seg;
-	HMODULE32		mappeddll;
-};
-
-typedef struct pe_data PE_MODULE;
-
 /* modreference used for attached processes
  * all section are calculated here, relocations etc.
  */
 struct pe_modref {
 	struct pe_modref		*next;
-	PE_MODULE			*pe_module;
-	unsigned long int		load_addr;
+        HMODULE32                       module;
 	LPIMAGE_IMPORT_DESCRIPTOR	pe_import;
 	LPIMAGE_EXPORT_DIRECTORY	pe_export;
 	LPIMAGE_RESOURCE_DIRECTORY	pe_resource;
@@ -35,7 +25,7 @@ struct pe_modref {
 typedef struct pe_modref PE_MODREF;
 
 extern int PE_unloadImage(HMODULE32 hModule);
-extern FARPROC32 PE_FindExportedFunction(struct pe_data *pe, LPCSTR funcName);
+extern FARPROC32 PE_FindExportedFunction(HMODULE32 hModule, LPCSTR funcName);
 extern void my_wcstombs(char * result, u_short * source, int len);
 extern BOOL32 PE_EnumResourceTypes32A(HMODULE32,ENUMRESTYPEPROC32A,LONG);
 extern BOOL32 PE_EnumResourceTypes32W(HMODULE32,ENUMRESTYPEPROC32W,LONG);
@@ -51,4 +41,6 @@ extern HGLOBAL32 PE_LoadResource32(HINSTANCE32,HRSRC32);
 struct _PDB32; /* forward definition */
 extern void PE_InitializeDLLs(struct _PDB32*,DWORD,LPVOID);
 
+extern LPIMAGE_RESOURCE_DIRECTORY GetResDirEntryW(LPIMAGE_RESOURCE_DIRECTORY,LPCWSTR,DWORD);
+
 #endif /* __WINE_PE_IMAGE_H */
diff --git a/include/peexe.h b/include/peexe.h
index 364e44dc0be..78adf3b5fc4 100644
--- a/include/peexe.h
+++ b/include/peexe.h
@@ -145,6 +145,17 @@ typedef struct _IMAGE_NT_HEADERS {
 	IMAGE_OPTIONAL_HEADER	OptionalHeader;
 } IMAGE_NT_HEADERS,*LPIMAGE_NT_HEADERS;
 
+
+#define PE_HEADER(module) \
+    ((IMAGE_NT_HEADERS*)((LPBYTE)(module) + \
+                         (((IMAGE_DOS_HEADER*)(module))->e_lfanew)))
+
+#define PE_SECTIONS(module) \
+    ((IMAGE_SECTION_HEADER*)((LPBYTE)&PE_HEADER(module)->OptionalHeader + \
+                           PE_HEADER(module)->FileHeader.SizeOfOptionalHeader))
+
+#define RVA_PTR(module,field) ((LPBYTE)(module) + PE_HEADER(module)->field)
+
 /* Section header format */
 
 #define	IMAGE_SIZEOF_SHORT_NAME	8
diff --git a/include/shell.h b/include/shell.h
index 947ec4d2ec7..2ddf3a33e2e 100644
--- a/include/shell.h
+++ b/include/shell.h
@@ -50,6 +50,17 @@ typedef struct tagSHFILEINFO32W {
 
 DECL_WINELIB_TYPE_AW(SHFILEINFO);
 
+typedef struct _AppBarData {
+	DWORD	cbSize;
+	HWND32	hWnd;
+	UINT32	uCallbackMessage;
+	UINT32	uEdge;
+	RECT32	rc;
+	LPARAM	lParam;
+} APPBARDATA, *PAPPBARDATA;
+
+DECL_WINELIB_TYPE(APPBARDATA);
+
 #define SHGFI_ICON              0x000000100     /* get icon */
 #define SHGFI_DISPLAYNAME       0x000000200     /* get display name */
 #define SHGFI_TYPENAME          0x000000400     /* get type name */
diff --git a/include/shlobj.h b/include/shlobj.h
new file mode 100644
index 00000000000..bb06efed492
--- /dev/null
+++ b/include/shlobj.h
@@ -0,0 +1,65 @@
+#ifndef _WINE_SHLOBJ_H
+#define _WINE_SHLOBJ_H
+
+#include "ole.h"
+#include "ole2.h"
+#include "compobj.h"
+
+typedef LPVOID	LPBC; /* *IBindCtx really */
+typedef LPVOID	LPSTRRET,LPENUMIDLIST;
+
+/*
+ * shell32 classids
+ */
+DEFINE_SHLGUID(CLSID_ShellDesktop,      0x00021400L, 0, 0);
+DEFINE_SHLGUID(CLSID_ShellLink,         0x00021401L, 0, 0);
+
+/*
+ * shell32 Interface ids
+ */
+DEFINE_SHLGUID(IID_IContextMenu,        0x000214E4L, 0, 0);
+DEFINE_SHLGUID(IID_IShellFolder,        0x000214E6L, 0, 0);
+DEFINE_SHLGUID(IID_IShellExtInit,       0x000214E8L, 0, 0);
+DEFINE_SHLGUID(IID_IShellPropSheetExt,  0x000214E9L, 0, 0);
+DEFINE_SHLGUID(IID_IExtractIcon,        0x000214EBL, 0, 0);
+DEFINE_SHLGUID(IID_IShellLink,          0x000214EEL, 0, 0);
+DEFINE_SHLGUID(IID_IShellCopyHook,      0x000214EFL, 0, 0);
+DEFINE_SHLGUID(IID_IFileViewer,         0x000214F0L, 0, 0);
+DEFINE_SHLGUID(IID_IEnumIDList,         0x000214F2L, 0, 0);
+DEFINE_SHLGUID(IID_IFileViewerSite,     0x000214F3L, 0, 0);
+
+typedef struct {
+	WORD		cb;	/* nr of bytes in this item */
+	BYTE		abID[1];/* first byte in this item */
+} SHITEMID,*LPSHITEMID;
+
+typedef struct {
+	SHITEMID	mkid; /* first itemid in list */
+} ITEMIDLIST,*LPITEMIDLIST,*LPCITEMIDLIST;
+
+/* The IShellFolder interface ... the basic interface for a lot of stuff */
+
+typedef struct tagSHELLFOLDER *LPSHELLFOLDER,IShellFolder;
+typedef struct {
+	HRESULT	(CALLBACK *fnQueryInterface)(LPSHELLFOLDER this,REFIID refiid,LPVOID *obj);
+	HRESULT	(CALLBACK *fnAddRef)(LPSHELLFOLDER this);
+	HRESULT	(CALLBACK *fnRelease)(LPSHELLFOLDER this);
+	/* IShellFolder methods */
+
+	HRESULT (CALLBACK *fnParseDisplayName) (LPSHELLFOLDER this,HWND32 hwndOwner,LPBC pbcReserved,LPOLESTR lpszDisplayName,DWORD * pchEaten,LPITEMIDLIST * ppidl, DWORD *pdwAttributes) ;
+
+	HRESULT (CALLBACK *fnEnumObjects)( LPSHELLFOLDER this,HWND32 hwndOwner, DWORD grfFlags, LPENUMIDLIST* ppenumIDList);
+	HRESULT (CALLBACK *fnBindToObject)(LPSHELLFOLDER this, LPCITEMIDLIST pidl, LPBC pbcReserved, REFIID riid, LPVOID * ppvOut);
+	HRESULT (CALLBACK *fnBindToStorage)(LPSHELLFOLDER this, LPCITEMIDLIST pidl, LPBC pbcReserved, REFIID riid, LPVOID * ppvObj);
+    	HRESULT (CALLBACK *fnCompareIDs) (LPSHELLFOLDER this, LPARAM lParam, LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2);
+	HRESULT (CALLBACK *fnCreateViewObject) (LPSHELLFOLDER this, HWND32 hwndOwner, REFIID riid, LPVOID * ppvOut);
+	HRESULT (CALLBACK *fnGetAttributesOf)  (LPSHELLFOLDER this, UINT32 cidl, LPCITEMIDLIST * apidl, DWORD * rgfInOut);
+	HRESULT (CALLBACK *fnGetUIObjectOf)    (LPSHELLFOLDER this, HWND32 hwndOwner, UINT32 cidl, LPCITEMIDLIST * apidl, REFIID riid, UINT32 * prgfInOut, LPVOID * ppvOut);
+	HRESULT (CALLBACK *fnGetDisplayNameOf) (LPSHELLFOLDER this, LPCITEMIDLIST pidl, DWORD uFlags, LPSTRRET lpName);
+	HRESULT (CALLBACK *fnSetNameOf)        (LPSHELLFOLDER this, HWND32 hwndOwner, LPCITEMIDLIST pidl, LPCOLESTR lpszName, DWORD uFlags, LPITEMIDLIST * ppidlOut);
+} *LPSHELLFOLDER_VTABLE;
+
+struct tagSHELLFOLDER {
+	LPSHELLFOLDER_VTABLE	*lpvtbl;
+};
+#endif /*_WINE_SHLOBJ_H*/
diff --git a/include/string32.h b/include/string32.h
deleted file mode 100644
index 6c644a2477e..00000000000
--- a/include/string32.h
+++ /dev/null
@@ -1,16 +0,0 @@
-/*
- * Unicode string management
- *
- * Copyright 1995 Martin von Loewis
- *
- */
-
-#ifndef __WINE_STRING32_H
-#define __WINE_STRING32_H
-
-#include "wintypes.h"
-
-LPWSTR	STRING32_DupAnsiToUni(LPCSTR src);
-LPWSTR	STRING32_strdupW(LPCWSTR);
-
-#endif  /* __WINE_STRING32_H */
diff --git a/include/version.h b/include/version.h
index 0bf94c8aecd..b0cfc85f1b7 100644
--- a/include/version.h
+++ b/include/version.h
@@ -1 +1 @@
-#define WINE_RELEASE_INFO "Wine release 971116"
+#define WINE_RELEASE_INFO "Wine release 971130"
diff --git a/include/win.h b/include/win.h
index 07dd3b24315..5a57b43d96b 100644
--- a/include/win.h
+++ b/include/win.h
@@ -97,7 +97,7 @@ typedef struct
 #define WIN_NEEDS_NCPAINT      0x0004 /* WM_NCPAINT must be sent to window */
 #define WIN_RESTORE_MAX        0x0008 /* Maximize when restoring */
 #define WIN_INTERNAL_PAINT     0x0010 /* Internal WM_PAINT message pending */
-#define WIN_NO_REDRAW          0x0020 /* WM_SETREDRAW called for this window */
+/* Used to have WIN_NO_REDRAW  0x0020 here */
 #define WIN_NEED_SIZE          0x0040 /* Internal WM_SIZE is needed */
 #define WIN_NCACTIVATED        0x0080 /* last WM_NCACTIVATE was positive */
 #define WIN_MANAGED            0x0100 /* Window managed by the X wm */
diff --git a/include/windows.h b/include/windows.h
index e93a7dd79ad..997208a4c6a 100644
--- a/include/windows.h
+++ b/include/windows.h
@@ -1973,6 +1973,15 @@ typedef struct
 DECL_WINELIB_TYPE(ACCEL);
 DECL_WINELIB_TYPE(LPACCEL);
 
+/* modifiers for RegisterHotKey */
+#define	MOD_ALT		0x0001
+#define	MOD_CONTROL	0x0002
+#define	MOD_SHIFT	0x0004
+#define	MOD_WIN		0x0008
+
+/* ids for RegisterHotKey */
+#define	IDHOT_SNAPWINDOW	(-1)    /* SHIFT-PRINTSCRN  */
+#define	IDHOT_SNAPDESKTOP	(-2)    /* PRINTSCRN        */
 
 /* Flags for DrawIconEx.  */
 #define DI_MASK                 1
@@ -5461,7 +5470,6 @@ VOID        WINAPI SetPriority(HTASK16,INT16);
 FARPROC16   WINAPI SetResourceHandler(HINSTANCE16,SEGPTR,FARPROC16);
 WORD        WINAPI SetSelectorBase(WORD,DWORD);
 WORD        WINAPI SetSelectorLimit(WORD,DWORD);
-LONG        WINAPI SetSwapAreaSize(WORD);
 HQUEUE16    WINAPI SetTaskQueue(HTASK16,HQUEUE16);
 FARPROC16   WINAPI SetTaskSignalProc(HTASK16,FARPROC16);
 DWORD       WINAPI SetViewportExt(HDC16,INT16,INT16);
@@ -5478,7 +5486,6 @@ BOOL16      WINAPI WaitEvent(HTASK16);
 INT16       WINAPI WriteComm(INT16,LPSTR,INT16);
 VOID        WINAPI WriteOutProfiles(VOID);
 VOID        WINAPI hmemcpy(LPVOID,LPCVOID,LONG);
-VOID        WINAPI Yield(void);
 
 
 /* Declarations for functions that exist only in Win32 */
@@ -6160,6 +6167,9 @@ LRESULT     WINAPI DefWindowProc16(HWND16,UINT16,WPARAM16,LPARAM);
 LRESULT     WINAPI DefWindowProc32A(HWND32,UINT32,WPARAM32,LPARAM);
 LRESULT     WINAPI DefWindowProc32W(HWND32,UINT32,WPARAM32,LPARAM);
 #define     DefWindowProc WINELIB_NAME_AW(DefWindowProc)
+BOOL16      WINAPI DefineHandleTable16(WORD);
+#define     DefineHandleTable32(w) ((w),TRUE)
+#define     DefineHandleTable WINELIB_NAME(DefineHandleTable)
 ATOM        WINAPI DeleteAtom16(ATOM);
 ATOM        WINAPI DeleteAtom32(ATOM);
 #define     DeleteAtom WINELIB_NAME(DeleteAtom)
@@ -6357,6 +6367,10 @@ HICON16     WINAPI ExtractIcon16(HINSTANCE16,LPCSTR,UINT16);
 HICON32     WINAPI ExtractIcon32A(HINSTANCE32,LPCSTR,UINT32);
 HICON32     WINAPI ExtractIcon32W(HINSTANCE32,LPCWSTR,UINT32);
 #define     ExtractIcon WINELIB_NAME_AW(ExtractIcon)
+HICON16     WINAPI ExtractAssociatedIcon16(HINSTANCE16,LPSTR,LPWORD);
+HICON32     WINAPI ExtractAssociatedIcon32A(HINSTANCE32,LPSTR,LPWORD);
+HICON32     WINAPI ExtractAssociatedIcon32W(HINSTANCE32,LPWSTR,LPWORD);
+#define     ExtractAssociatedIcon WINELIB_NAME_AW(ExtractAssociatedIcon)
 BOOL16      WINAPI ExtTextOut16(HDC16,INT16,INT16,UINT16,const RECT16*,
                                 LPCSTR,UINT16,const INT16*);
 BOOL32      WINAPI ExtTextOut32A(HDC32,INT32,INT32,UINT32,const RECT32*,
@@ -7173,6 +7187,12 @@ HGLOBAL16   WINAPI LockSegment16(HGLOBAL16);
 BOOL16      WINAPI LockWindowUpdate16(HWND16);
 BOOL32      WINAPI LockWindowUpdate32(HWND32);
 #define     LockWindowUpdate WINELIB_NAME(LockWindowUpdate)
+INT16       WINAPI LookupIconIdFromDirectory16(LPBYTE,BOOL16);
+INT32       WINAPI LookupIconIdFromDirectory32(LPBYTE,BOOL32);
+#define     LookupIconIdFromDirectory WINELIB_NAME(LookupIconIdFromDirectory)
+INT16       WINAPI LookupIconIdFromDirectoryEx16(LPBYTE,BOOL16,INT16,INT16,UINT16);
+INT32       WINAPI LookupIconIdFromDirectoryEx32(LPBYTE,BOOL32,INT32,INT32,UINT32);
+#define     LookupIconIdFromDirectoryEx WINELIB_NAME(LookupIconIdFromDirectoryEx)
 BOOL16      WINAPI LPtoDP16(HDC16,LPPOINT16,INT16);
 BOOL32      WINAPI LPtoDP32(HDC32,LPPOINT32,INT32);
 #define     LPtoDP WINELIB_NAME(LPtoDP)
@@ -7620,6 +7640,9 @@ DWORD       WINAPI SetSoundNoise32(DWORD,DWORD);
 INT16       WINAPI SetStretchBltMode16(HDC16,INT16);
 INT32       WINAPI SetStretchBltMode32(HDC32,INT32);
 #define     SetStretchBltMode WINELIB_NAME(SetStretchBltMode)
+LONG        WINAPI SetSwapAreaSize16(WORD);
+#define     SetSwapAreaSize32(w) (w)
+#define     SetSwapAreaSize WINELIB_NAME(SetSwapAreaSize)
 VOID        WINAPI SetSysColors16(INT16,const INT16*,const COLORREF*);
 BOOL32      WINAPI SetSysColors32(INT32,const INT32*,const COLORREF*);
 #define     SetSysColors WINELIB_NAME(SetSysColors)
@@ -7861,6 +7884,9 @@ BOOL16      WINAPI WriteProfileString16(LPCSTR,LPCSTR,LPCSTR);
 BOOL32      WINAPI WriteProfileString32A(LPCSTR,LPCSTR,LPCSTR);
 BOOL32      WINAPI WriteProfileString32W(LPCWSTR,LPCWSTR,LPCWSTR);
 #define     WriteProfileString WINELIB_NAME_AW(WriteProfileString)
+VOID        WINAPI Yield16(void);
+#define     Yield32()
+#define     Yield WINELIB_NAME(Yield)
 SEGPTR      WINAPI lstrcat16(SEGPTR,LPCSTR);
 LPSTR       WINAPI lstrcat32A(LPSTR,LPCSTR);
 LPWSTR      WINAPI lstrcat32W(LPWSTR,LPCWSTR);
diff --git a/include/winerror.h b/include/winerror.h
index f8d77388121..ce1a3fe8ab3 100644
--- a/include/winerror.h
+++ b/include/winerror.h
@@ -38,5 +38,6 @@ extern int WIN32_LastError;
 #define ERROR_IO_DEVICE             1117
 #define ERROR_POSSIBLE_DEADLOCK     1131
 #define ERROR_BAD_DEVICE            1200
+#define ERROR_NO_NETWORK            1222
 
 #endif  /* __WINE_WINERROR_H */
diff --git a/include/wintypes.h b/include/wintypes.h
index c54a42ff3ef..50921576ef9 100644
--- a/include/wintypes.h
+++ b/include/wintypes.h
@@ -145,7 +145,7 @@ typedef void* SEGPTR;
 
 /* Handle types that exist both in Win16 and Win32. */
 
-#define DECLARE_HANDLE(a)  typedef HANDLE16 a##16; typedef HANDLE32 a##32;
+#define DECLARE_HANDLE(a)  typedef HANDLE16 a##16; typedef HANDLE32 a##32
 DECLARE_HANDLE(HACCEL);
 DECLARE_HANDLE(HBITMAP);
 DECLARE_HANDLE(HBRUSH);
diff --git a/library/winestub.c b/library/winestub.c
index ac18da2a72b..789c7bf6d6a 100644
--- a/library/winestub.c
+++ b/library/winestub.c
@@ -4,9 +4,8 @@
 #include "windows.h"
 #include "xmalloc.h"
 
-/* Stubs needed for linking with Winelib */
+/* Stub needed for linking with Winelib */
 /* FIXME: this should not be necessary */
-FARPROC32 BUILTIN_GetProcAddress32( void *mod, LPCSTR func ) { return 0; }
 HMODULE32 BUILTIN_LoadModule( LPCSTR name, BOOL32 force ) { return 0; }
 
 
diff --git a/loader/module.c b/loader/module.c
index 202f189cdfd..f35bae499e5 100644
--- a/loader/module.c
+++ b/loader/module.c
@@ -53,18 +53,16 @@ HMODULE16
 MODULE_HANDLEtoHMODULE16(HANDLE32 handle) {
     NE_MODULE	*pModule;
 
-    if (HIWORD(handle)) {
-	/* this is a HMODULE32 aka pe->mappeddll */
+    if (HIWORD(handle))
+    {
+	/* this is a HMODULE32 */
 
         /* walk the list looking for the correct startaddress */
     	pModule = (NE_MODULE *)GlobalLock16( hFirstModule );
-	while (pModule) { 
-		if (	((pModule->flags&(NE_FFLAGS_BUILTIN|NE_FFLAGS_WIN32))==NE_FFLAGS_WIN32) &&
-			pModule->pe_module &&
-			((HMODULE32)pModule->pe_module->mappeddll == handle)
-		)
-			return pModule->self;
-		pModule=(NE_MODULE*)GlobalLock16(pModule->next);
+	while (pModule)
+        {
+            if (pModule->module32 == handle) return pModule->self;
+            pModule = (NE_MODULE*)GlobalLock16(pModule->next);
 	}
 	return 0;
     }
@@ -89,10 +87,7 @@ MODULE_HANDLEtoHMODULE32(HANDLE32 handle) {
 	if (!pModule)
 	    return 0;
 	
-	if (	((pModule->flags&(NE_FFLAGS_BUILTIN|NE_FFLAGS_WIN32))==NE_FFLAGS_WIN32) &&
-		pModule->pe_module
-	)
-		return (HMODULE32)pModule->pe_module->mappeddll;
+	if (pModule->module32) return pModule->module32;
 	return handle;
     }
 }
@@ -127,7 +122,7 @@ void MODULE_DumpModule( HMODULE32 hModule )
             pModule->os_flags, pModule->min_swap_area,
             pModule->expected_version );
     if (pModule->flags & NE_FFLAGS_WIN32)
-        printf( "PE module=%08x\n", (unsigned int)pModule->pe_module );
+        printf( "PE module=%08x\n", pModule->module32 );
 
       /* Dump the file info */
 
@@ -557,7 +552,7 @@ static HMODULE32 MODULE_LoadExeHeader( HFILE32 hFile, OFSTRUCT *ofs )
     pModule = (NE_MODULE *)GlobalLock16( hModule );
     memcpy( pModule, &ne_header, sizeof(ne_header) );
     pModule->count = 0;
-    pModule->pe_module = NULL;
+    pModule->module32 = 0;
     pModule->self = hModule;
     pModule->self_loading_sel = 0;
     pData = (BYTE *)(pModule + 1);
@@ -1139,7 +1134,7 @@ BOOL16 MODULE_FreeModule( HMODULE32 hModule, TDB* pTaskContext )
  */
 HINSTANCE16 MODULE_Load( LPCSTR name, LPVOID paramBlock, UINT16 uFlags)
 {
-    HMODULE16 hModule;
+    HMODULE32 hModule;
     HINSTANCE16 hInstance, hPrevInstance;
     NE_MODULE *pModule;
     LOADPARAMS *params = (LOADPARAMS *)paramBlock;
@@ -1161,7 +1156,8 @@ HINSTANCE16 MODULE_Load( LPCSTR name, LPVOID paramBlock, UINT16 uFlags)
         if (!hModule)  /* We have to load the module */
         {
             /* Try to load the built-in first if not disabled */
-            if ((hModule = BUILTIN_LoadModule( name, FALSE ))) return hModule;
+            if ((hModule = BUILTIN_LoadModule( name, FALSE )))
+                return MODULE_HANDLEtoHMODULE16( hModule );
             
             if ((hFile = OpenFile32( name, &ofs, OF_READ )) == HFILE_ERROR32)
             {
@@ -1169,7 +1165,7 @@ HINSTANCE16 MODULE_Load( LPCSTR name, LPVOID paramBlock, UINT16 uFlags)
                 if ((hModule = BUILTIN_LoadModule( name, TRUE )))
                 {
                     fprintf( stderr, "Warning: could not load Windows DLL '%s', using built-in module.\n", name );
-                    return hModule;
+                    return MODULE_HANDLEtoHMODULE16( hModule );
                 }
                 return 2;  /* File not found */
             }
@@ -1254,7 +1250,7 @@ HINSTANCE16 MODULE_Load( LPCSTR name, LPVOID paramBlock, UINT16 uFlags)
                                 (LPSTR)PTR_SEG_TO_LIN( params->cmdLine ),
                                  showcmd );
 
-	if( hTask && TASK_GetNextTask(hTask)) Yield();
+	if( hTask && TASK_GetNextTask(hTask)) Yield16();
     }
 
     return hInstance;
@@ -1507,6 +1503,17 @@ HINSTANCE16 WINAPI LoadLibrary16( LPCSTR libname )
 }
 
 
+/***********************************************************************
+ *           PrivateLoadLibrary       (KERNEL32)
+ *
+ * FIXME: rough guesswork, don't know what "Private" means
+ */
+HMODULE32 WINAPI PrivateLoadLibrary(LPCSTR libname)
+{
+        return LoadLibrary16(libname);
+}
+
+
 /***********************************************************************
  *           FreeLibrary16   (KERNEL.96)
  */
@@ -1517,6 +1524,17 @@ void WINAPI FreeLibrary16( HINSTANCE16 handle )
 }
 
 
+/***********************************************************************
+ *           PrivateFreeLibrary       (KERNEL32)
+ *
+ * FIXME: rough guesswork, don't know what "Private" means
+ */
+void WINAPI PrivateFreeLibrary(HMODULE32 handle)
+{
+	FreeLibrary16(handle);
+}
+
+
 /***********************************************************************
  *           WinExec16   (KERNEL.166)
  */
@@ -1773,15 +1791,14 @@ FARPROC32 WINAPI GetProcAddress32( HMODULE32 hModule, LPCSTR function )
 	dprintf_win32(stddeb,"GetProcAddress32(%08lx,%p)\n",(DWORD)hModule,function);
     if (!(pModule = MODULE_GetPtr( hModule )))
         return (FARPROC32)0;
-    if (pModule->flags & NE_FFLAGS_BUILTIN)
-        return BUILTIN_GetProcAddress32( pModule, function );
-    if (!pModule->pe_module) {
-    	fprintf(stderr,"Oops, Module 0x%08lx has got no pe_module?\n",
+    if (!pModule->module32)
+    {
+    	fprintf(stderr,"Oops, Module 0x%08lx has got no module32?\n",
 		(DWORD)MODULE_HANDLEtoHMODULE32(hModule)
 	);
 	return (FARPROC32)0;
     }
-    return PE_FindExportedFunction( pModule->pe_module, function );
+    return PE_FindExportedFunction( pModule->module32, function );
 }
 
 /***********************************************************************
@@ -1798,11 +1815,9 @@ LPIMAGE_NT_HEADERS WINAPI RtlImageNtHeader(HMODULE32 hModule)
 
     if (!(pModule = MODULE_GetPtr( hModule )))
         return (LPIMAGE_NT_HEADERS)0;
-    if (!(pModule->flags & NE_FFLAGS_WIN32) || !pModule->pe_module)
-        return (LPIMAGE_NT_HEADERS)0;
-    if (pModule->flags & NE_FFLAGS_BUILTIN)
+    if (!(pModule->flags & NE_FFLAGS_WIN32) || !pModule->module32)
         return (LPIMAGE_NT_HEADERS)0;
-    return pModule->pe_module->pe_header;
+    return PE_HEADER(pModule->module32);
 }
 
 
diff --git a/loader/pe_image.c b/loader/pe_image.c
index 17bd23061a3..1485cb68185 100644
--- a/loader/pe_image.c
+++ b/loader/pe_image.c
@@ -40,13 +40,20 @@ static void PE_InitDLL(PE_MODREF* modref, DWORD type, LPVOID lpReserved);
 /* convert PE image VirtualAddress to Real Address */
 #define RVA(x) ((unsigned int)load_addr+(unsigned int)(x))
 
-void dump_exports(IMAGE_EXPORT_DIRECTORY * pe_exports, unsigned int load_addr)
+void dump_exports( HMODULE32 hModule )
 { 
   char		*Module;
   int		i, j;
   u_short	*ordinal;
   u_long	*function,*functions;
   u_char	**name;
+  unsigned int load_addr = hModule;
+
+  DWORD rva_start = PE_HEADER(hModule)->OptionalHeader
+                   .DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress;
+  DWORD rva_end = rva_start + PE_HEADER(hModule)->OptionalHeader
+                   .DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].Size;
+  IMAGE_EXPORT_DIRECTORY *pe_exports = (IMAGE_EXPORT_DIRECTORY*)RVA(rva_start);
 
   Module = (char*)RVA(pe_exports->Name);
   dprintf_win32(stddeb,"\n*******EXPORT DATA*******\nModule name is %s, %ld functions, %ld names\n", 
@@ -58,15 +65,18 @@ void dump_exports(IMAGE_EXPORT_DIRECTORY * pe_exports, unsigned int load_addr)
   functions=function=(u_long*) RVA(pe_exports->AddressOfFunctions);
   name=(u_char**) RVA(pe_exports->AddressOfNames);
 
-  dprintf_win32(stddeb," Ord  Virt Addr  Name\n" );
+  dprintf_win32(stddeb," Ord    RVA     Addr   Name\n" );
   for (i=0;i<pe_exports->NumberOfFunctions;i++, function++)
   {
       if (!*function) continue;  /* No such function */
-      dprintf_win32( stddeb,"%4ld  %08lx", i + pe_exports->Base, *function );
+      dprintf_win32( stddeb,"%4ld %08lx %08x",
+                     i + pe_exports->Base, *function, RVA(*function) );
       /* Check if we have a name for it */
       for (j = 0; j < pe_exports->NumberOfNames; j++)
           if (ordinal[j] == i)
               dprintf_win32( stddeb, "  %s", (char*)RVA(name[j]) );
+      if ((*function >= rva_start) && (*function <= rva_end))
+	  dprintf_win32(stddeb, " (forwarded -> %s)", (char *)RVA(*function));
       dprintf_win32( stddeb,"\n" );
   }
 }
@@ -79,7 +89,7 @@ void dump_exports(IMAGE_EXPORT_DIRECTORY * pe_exports, unsigned int load_addr)
  * If it is a ordinal:
  *	- use ordinal-pe_export->Base as offset into the functionlist
  */
-FARPROC32 PE_FindExportedFunction(struct pe_data *pe, LPCSTR funcName)
+FARPROC32 PE_FindExportedFunction( HMODULE32 hModule, LPCSTR funcName)
 {
 	IMAGE_EXPORT_DIRECTORY 		*exports;
 	unsigned			load_addr;
@@ -89,34 +99,47 @@ FARPROC32 PE_FindExportedFunction(struct pe_data *pe, LPCSTR funcName)
 	int				i;
 	PDB32				*process=(PDB32*)GetCurrentProcessId();
 	PE_MODREF			*pem;
+	u_long				rva_start, rva_end, addr;
+	char				* forward;
 
 	pem = process->modref_list;
-	while (pem && (pem->pe_module != pe))
+	while (pem && (pem->module != hModule))
 		pem=pem->next;
 	if (!pem) {
-		fprintf(stderr,"No MODREF found for PE_MODULE %p in process %p\n",pe,process);
+		fprintf(stderr,"No MODREF found for PE_MODULE %08x in process %p\n",hModule,process);
 		return NULL;
 	}
-	load_addr	= pem->load_addr;
-	exports		= pem->pe_export;
+	load_addr = hModule;
+	exports   = pem->pe_export;
 
 	if (HIWORD(funcName))
 		dprintf_win32(stddeb,"PE_FindExportedFunction(%s)\n",funcName);
 	else
 		dprintf_win32(stddeb,"PE_FindExportedFunction(%d)\n",(int)funcName);
 	if (!exports) {
-		fprintf(stderr,"Module %p/MODREF %p doesn't have a exports table.\n",pe,pem);
+		fprintf(stderr,"Module %08x/MODREF %p doesn't have a exports table.\n",hModule,pem);
 		return NULL;
 	}
 	ordinal	= (u_short*)  RVA(exports->AddressOfNameOrdinals);
 	function= (u_long*)   RVA(exports->AddressOfFunctions);
 	name	= (u_char **) RVA(exports->AddressOfNames);
+	forward = NULL;
+	rva_start = PE_HEADER(hModule)->OptionalHeader
+		.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress;
+	rva_end = rva_start + PE_HEADER(hModule)->OptionalHeader
+		.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].Size;
 
 	if (HIWORD(funcName)) {
 		for(i=0; i<exports->NumberOfNames; i++) {
 			ename=(char*)RVA(*name);
 			if(!strcmp(ename,funcName))
-				return (FARPROC32) RVA(function[*ordinal]);
+                        {
+                            addr = function[*ordinal];
+                            if ((addr < rva_start) || (addr >= rva_end))
+                                return (FARPROC32)RVA(addr);
+                            forward = (char *)RVA(addr);
+                            break;
+			}
 			ordinal++;
 			name++;
 		}
@@ -126,7 +149,19 @@ FARPROC32 PE_FindExportedFunction(struct pe_data *pe, LPCSTR funcName)
                                       LOWORD(funcName));
 			return NULL;
 		}
-		return (FARPROC32) RVA(function[(int)funcName-exports->Base]);
+		addr = function[(int)funcName-exports->Base];
+		if ((addr < rva_start) || (addr >= rva_end))
+			return (FARPROC32)RVA(addr);
+		forward = (char *)RVA(addr);
+	}
+	if (forward)
+        {
+		char module[256];
+		char *end = strchr(forward, '.');
+		if (!end) return NULL;
+		strncpy(module, forward, (end - forward));
+		module[end-forward] = 0;
+		return GetProcAddress32(MODULE_FindModule(module), end + 1);
 	}
 	return NULL;
 }
@@ -134,10 +169,9 @@ FARPROC32 PE_FindExportedFunction(struct pe_data *pe, LPCSTR funcName)
 void 
 fixup_imports (PDB32 *process,PE_MODREF *pem)
 {
-    PE_MODULE			*pe = pem->pe_module;
     IMAGE_IMPORT_DESCRIPTOR	*pe_imp;
     int	fixup_failed		= 0;
-    unsigned int load_addr	= pem->load_addr;
+    unsigned int load_addr	= pem->module;
     int				i;
     char			*modname;
     
@@ -176,7 +210,7 @@ fixup_imports (PDB32 *process,PE_MODREF *pem)
 	    char *p, buffer[256];
 
 	    /* Try with prepending the path of the current module */
-	    GetModuleFileName32A (pe->mappeddll, buffer, sizeof (buffer));
+	    GetModuleFileName32A( pem->module, buffer, sizeof (buffer));
 	    if (!(p = strrchr (buffer, '\\')))
 		p = buffer;
 	    strcpy (p + 1, name);
@@ -189,7 +223,7 @@ fixup_imports (PDB32 *process,PE_MODREF *pem)
 	res = MODULE_HANDLEtoHMODULE32(res);
 	xpem = pem->next;
 	while (xpem) {
-		if (xpem->pe_module->mappeddll == res)
+		if (xpem->module == res)
 			break;
 		xpem = xpem->next;
 	}
@@ -297,37 +331,36 @@ fixup_imports (PDB32 *process,PE_MODREF *pem)
     if (fixup_failed) exit(1);
 }
 
-static int calc_vma_size(struct pe_data *pe)
+static int calc_vma_size( HMODULE32 hModule )
 {
-  int i,vma_size = 0;
+    int i,vma_size = 0;
+    IMAGE_SECTION_HEADER *pe_seg = PE_SECTIONS(hModule);
 
-  dprintf_win32(stddeb, "Dump of segment table\n");
-  dprintf_win32(stddeb, "   Name    VSz  Vaddr     SzRaw   Fileadr  *Reloc *Lineum #Reloc #Linum Char\n");
-  for(i=0; i< pe->pe_header->FileHeader.NumberOfSections; i++)
+    dprintf_win32(stddeb, "Dump of segment table\n");
+    dprintf_win32(stddeb, "   Name    VSz  Vaddr     SzRaw   Fileadr  *Reloc *Lineum #Reloc #Linum Char\n");
+    for (i = 0; i< PE_HEADER(hModule)->FileHeader.NumberOfSections; i++)
     {
-      dprintf_win32(stddeb, "%8s: %4.4lx %8.8lx %8.8lx %8.8lx %8.8lx %8.8lx %4.4x %4.4x %8.8lx\n", 
-	     pe->pe_seg[i].Name, 
-	     pe->pe_seg[i].Misc.VirtualSize,
-	     pe->pe_seg[i].VirtualAddress,
-	     pe->pe_seg[i].SizeOfRawData,
-	     pe->pe_seg[i].PointerToRawData,
-	     pe->pe_seg[i].PointerToRelocations,
-	     pe->pe_seg[i].PointerToLinenumbers,
-	     pe->pe_seg[i].NumberOfRelocations,
-	     pe->pe_seg[i].NumberOfLinenumbers,
-	     pe->pe_seg[i].Characteristics);
-	  vma_size = MAX(vma_size,
-	  		pe->pe_seg[i].VirtualAddress + 
-			pe->pe_seg[i].SizeOfRawData);
+        dprintf_win32(stddeb, "%8s: %4.4lx %8.8lx %8.8lx %8.8lx %8.8lx %8.8lx %4.4x %4.4x %8.8lx\n", 
+                      pe_seg->Name, 
+                      pe_seg->Misc.VirtualSize,
+                      pe_seg->VirtualAddress,
+                      pe_seg->SizeOfRawData,
+                      pe_seg->PointerToRawData,
+                      pe_seg->PointerToRelocations,
+                      pe_seg->PointerToLinenumbers,
+                      pe_seg->NumberOfRelocations,
+                      pe_seg->NumberOfLinenumbers,
+                      pe_seg->Characteristics);
+        vma_size = MAX(vma_size, pe_seg->VirtualAddress+pe_seg->SizeOfRawData);
+        pe_seg++;
     }
     return vma_size;
 }
 
 static void do_relocations(PE_MODREF *pem)
 {
-	int delta = pem->load_addr - pem->pe_module->pe_header->OptionalHeader.ImageBase;
-
-	unsigned int			load_addr= pem->load_addr;
+    int delta = pem->module - PE_HEADER(pem->module)->OptionalHeader.ImageBase;
+    unsigned int load_addr= pem->module;
 	IMAGE_BASE_RELOCATION		*r = pem->pe_reloc;
 	int				hdelta = (delta >> 16) & 0xFFFF;
 	int				ldelta = delta & 0xFFFF;
@@ -398,9 +431,8 @@ static void do_relocations(PE_MODREF *pem)
  * BUT we have to map the whole image anyway, for Win32 programs sometimes
  * want to access them. (HMODULE32 point to the start of it)
  */
-static PE_MODULE *PE_LoadImage( HFILE32 hFile )
+static HMODULE32 PE_LoadImage( HFILE32 hFile )
 {
-    struct pe_data *pe;
     HMODULE32 hModule;
     HANDLE32 mapping;
 
@@ -411,7 +443,7 @@ static PE_MODULE *PE_LoadImage( HFILE32 hFile )
     {
         fprintf( stderr, "PE_LoadImage: CreateFileMapping error %ld\n",
                  GetLastError() );
-        return NULL;
+        return 0;
     }
     hModule = (HMODULE32)MapViewOfFile( mapping, FILE_MAP_READ, 0, 0, 0 );
     CloseHandle( mapping );
@@ -419,126 +451,128 @@ static PE_MODULE *PE_LoadImage( HFILE32 hFile )
     {
         fprintf( stderr, "PE_LoadImage: MapViewOfFile error %ld\n",
                  GetLastError() );
-        return NULL;
+        return 0;
     }
 
-    /* build PE header */
-    pe = xmalloc(sizeof(struct pe_data));
-    pe->mappeddll = hModule;
-    pe->pe_header = (IMAGE_NT_HEADERS*)(pe->mappeddll+(((IMAGE_DOS_HEADER*)pe->mappeddll)->e_lfanew));
-    if (pe->pe_header->Signature!=IMAGE_NT_SIGNATURE)
+    if (PE_HEADER(hModule)->Signature != IMAGE_NT_SIGNATURE)
     {
         fprintf(stderr,"image doesn't have PE signature, but 0x%08lx\n",
-                pe->pe_header->Signature );
-        free(pe);
-        return NULL;
+                PE_HEADER(hModule)->Signature );
+        goto error;
     }
 
-	if (pe->pe_header->FileHeader.Machine != IMAGE_FILE_MACHINE_I386) {
-		fprintf(stderr,"trying to load PE image for unsupported architecture (");
-		switch (pe->pe_header->FileHeader.Machine) {
-		case IMAGE_FILE_MACHINE_UNKNOWN:
-			fprintf(stderr,"Unknown");break;
-		case IMAGE_FILE_MACHINE_I860:
-			fprintf(stderr,"I860");break;
-		case IMAGE_FILE_MACHINE_R3000:
-			fprintf(stderr,"R3000");break;
-		case IMAGE_FILE_MACHINE_R4000:
-			fprintf(stderr,"R4000");break;
-		case IMAGE_FILE_MACHINE_R10000:
-			fprintf(stderr,"R10000");break;
-		case IMAGE_FILE_MACHINE_ALPHA:
-			fprintf(stderr,"Alpha");break;
-		case IMAGE_FILE_MACHINE_POWERPC:
-			fprintf(stderr,"PowerPC");break;
-		default:
-			fprintf(stderr,"Unknown-%04x",pe->pe_header->FileHeader.Machine);break;
-		}
-		fprintf(stderr,")\n");
-		return NULL;
-	}
-	pe->pe_seg = (IMAGE_SECTION_HEADER*)(((LPBYTE)(pe->pe_header+1))-
-		 (16 - pe->pe_header->OptionalHeader.NumberOfRvaAndSizes) * sizeof(IMAGE_DATA_DIRECTORY));
+    if (PE_HEADER(hModule)->FileHeader.Machine != IMAGE_FILE_MACHINE_I386)
+    {
+        fprintf(stderr,"trying to load PE image for unsupported architecture (");
+        switch (PE_HEADER(hModule)->FileHeader.Machine)
+        {
+        case IMAGE_FILE_MACHINE_UNKNOWN: fprintf(stderr,"Unknown"); break;
+        case IMAGE_FILE_MACHINE_I860:    fprintf(stderr,"I860"); break;
+        case IMAGE_FILE_MACHINE_R3000:   fprintf(stderr,"R3000"); break;
+        case IMAGE_FILE_MACHINE_R4000:   fprintf(stderr,"R4000"); break;
+        case IMAGE_FILE_MACHINE_R10000:  fprintf(stderr,"R10000"); break;
+        case IMAGE_FILE_MACHINE_ALPHA:   fprintf(stderr,"Alpha"); break;
+        case IMAGE_FILE_MACHINE_POWERPC: fprintf(stderr,"PowerPC"); break;
+        default: fprintf(stderr,"Unknown-%04x",
+                         PE_HEADER(hModule)->FileHeader.Machine); break;
+        }
+        fprintf(stderr,")\n");
+        goto error;
+    }
+    return hModule;
 
-/* FIXME: the (16-...) is a *horrible* hack to make COMDLG32.DLL load OK. The
- * problem needs to be fixed properly at some stage.
- */
- 	return pe;
+error:
+    UnmapViewOfFile( (LPVOID)hModule );
+    return 0;
 }
 
 /**********************************************************************
  * This maps a loaded PE dll into the address space of the specified process.
  */
-void
-PE_MapImage(PE_MODULE *pe,PDB32 *process, OFSTRUCT *ofs, DWORD flags) {
+static HMODULE32 PE_MapImage( HMODULE32 hModule, PDB32 *process,
+                              OFSTRUCT *ofs, DWORD flags )
+{
 	PE_MODREF		*pem;
 	int			i, result;
-	int			load_addr;
+	DWORD			load_addr;
 	IMAGE_DATA_DIRECTORY	dir;
 	char			*modname;
 	int			vma_size;
+
+        IMAGE_SECTION_HEADER *pe_seg;
+        IMAGE_DOS_HEADER *dos_header = (IMAGE_DOS_HEADER *)hModule;
+        IMAGE_NT_HEADERS *nt_header = PE_HEADER(hModule);
 	
-	pem		= (PE_MODREF*)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(*pem));
+	pem = (PE_MODREF*)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,
+                                    sizeof(*pem));
 	/* NOTE: fixup_imports takes care of the correct order */
 	pem->next	= process->modref_list;
 	process->modref_list = pem;
 
-	pem->pe_module	= pe;
-	if (!(pe->pe_header->FileHeader.Characteristics & IMAGE_FILE_DLL)) {
+	if (!(nt_header->FileHeader.Characteristics & IMAGE_FILE_DLL))
+        {
 		if (process->exe_modref)
 			fprintf(stderr,"overwriting old exe_modref... arrgh\n");
 		process->exe_modref = pem;
 	}
 
-	load_addr 	= pe->pe_header->OptionalHeader.ImageBase;
-	dprintf_win32(stddeb, "Load addr is %x\n",load_addr);
-	vma_size = calc_vma_size(pe);
-	load_addr 	= (int) VirtualAlloc( (void*)load_addr, vma_size, MEM_RESERVE|MEM_COMMIT, PAGE_EXECUTE_READWRITE );
-        pem->load_addr	= load_addr;
+	load_addr = nt_header->OptionalHeader.ImageBase;
+	vma_size = calc_vma_size( hModule );
+	dprintf_win32(stddeb, "Load addr is %lx\n",load_addr);
+	load_addr = (DWORD)VirtualAlloc( (void*)load_addr, vma_size,
+                                         MEM_RESERVE | MEM_COMMIT,
+                                         PAGE_EXECUTE_READWRITE );
+	pem->module = (HMODULE32)load_addr;
 
 	dprintf_win32(stddeb, "Load addr is really %lx, range %x\n",
-		pem->load_addr, vma_size);
+                      load_addr, vma_size);
 	
-
-	for(i=0; i < pe->pe_header->FileHeader.NumberOfSections; i++)
+        /* Store the NT header at the load addr
+         * (FIXME: should really use mmap)
+         */
+        *(IMAGE_DOS_HEADER *)load_addr = *dos_header;
+        *(IMAGE_NT_HEADERS *)(load_addr + dos_header->e_lfanew) = *nt_header;
+
+        pe_seg = PE_SECTIONS(hModule);
+	for (i = 0; i < nt_header->FileHeader.NumberOfSections; i++, pe_seg++)
 	{
 		/* memcpy only non-BSS segments */
 		/* FIXME: this should be done by mmap(..MAP_PRIVATE|MAP_FIXED..)
 		 * but it is not possible for (at least) Linux needs
 		 * a page-aligned offset.
 		 */
-		if(!(pe->pe_seg[i].Characteristics & IMAGE_SCN_CNT_UNINITIALIZED_DATA))
-		    memcpy((char*)RVA(pe->pe_seg[i].VirtualAddress),
-		    	(char*)(pe->mappeddll+pe->pe_seg[i].PointerToRawData),
-			pe->pe_seg[i].SizeOfRawData
+		if(!(pe_seg->Characteristics & IMAGE_SCN_CNT_UNINITIALIZED_DATA))
+		    memcpy((char*)RVA(pe_seg->VirtualAddress),
+		    	(char*)(hModule + pe_seg->PointerToRawData),
+			pe_seg->SizeOfRawData
 		    );
 
-		result = RVA (pe->pe_seg[i].VirtualAddress);
+		result = RVA (pe_seg->VirtualAddress);
 #if 1
 		/* not needed, memory is zero */
-		if(strcmp(pe->pe_seg[i].Name, ".bss") == 0)
+		if(strcmp(pe_seg->Name, ".bss") == 0)
 		    memset((void *)result, 0, 
-			   pe->pe_seg[i].Misc.VirtualSize ?
-			   pe->pe_seg[i].Misc.VirtualSize :
-			   pe->pe_seg[i].SizeOfRawData);
+			   pe_seg->Misc.VirtualSize ?
+			   pe_seg->Misc.VirtualSize :
+			   pe_seg->SizeOfRawData);
 #endif
 
-		if(strcmp(pe->pe_seg[i].Name, ".idata") == 0)
+		if(strcmp(pe_seg->Name, ".idata") == 0)
 			pem->pe_import = (LPIMAGE_IMPORT_DESCRIPTOR) result;
 
-		if(strcmp(pe->pe_seg[i].Name, ".edata") == 0)
+		if(strcmp(pe_seg->Name, ".edata") == 0)
 			pem->pe_export = (LPIMAGE_EXPORT_DIRECTORY) result;
 
-		if(strcmp(pe->pe_seg[i].Name, ".rsrc") == 0)
+		if(strcmp(pe_seg->Name, ".rsrc") == 0)
 			pem->pe_resource = (LPIMAGE_RESOURCE_DIRECTORY) result;
 
-		if(strcmp(pe->pe_seg[i].Name, ".reloc") == 0)
+		if(strcmp(pe_seg->Name, ".reloc") == 0)
 			pem->pe_reloc = (LPIMAGE_BASE_RELOCATION) result;
 	}
 
 	/* There is word that the actual loader does not care about the
 	   section names, and only goes for the DataDirectory */
-	dir=pe->pe_header->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT];
+	dir=nt_header->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT];
 	if(dir.Size)
 	{
 		if(pem->pe_export && (int)pem->pe_export!=RVA(dir.VirtualAddress))
@@ -547,7 +581,7 @@ PE_MapImage(PE_MODULE *pe,PDB32 *process, OFSTRUCT *ofs, DWORD flags) {
 		pem->pe_export = (LPIMAGE_EXPORT_DIRECTORY) RVA(dir.VirtualAddress);
 	}
 
-	dir=pe->pe_header->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT];
+	dir=nt_header->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT];
 	if(dir.Size)
 	{
 		/* 
@@ -557,7 +591,7 @@ PE_MapImage(PE_MODULE *pe,PDB32 *process, OFSTRUCT *ofs, DWORD flags) {
 		pem->pe_import = (LPIMAGE_IMPORT_DESCRIPTOR) RVA(dir.VirtualAddress);
 	}
 
-	dir=pe->pe_header->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_RESOURCE];
+	dir=nt_header->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_RESOURCE];
 	if(dir.Size)
 	{
 		if(pem->pe_resource && (int)pem->pe_resource!=RVA(dir.VirtualAddress))
@@ -565,15 +599,15 @@ PE_MapImage(PE_MODULE *pe,PDB32 *process, OFSTRUCT *ofs, DWORD flags) {
 		pem->pe_resource = (LPIMAGE_RESOURCE_DIRECTORY) RVA(dir.VirtualAddress);
 	}
 
-	if(pe->pe_header->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXCEPTION].Size)
+	if(nt_header->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXCEPTION].Size)
 		dprintf_win32(stdnimp,"Exception directory ignored\n");
 
-	if(pe->pe_header->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_SECURITY].Size)
+	if(nt_header->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_SECURITY].Size)
 		dprintf_win32(stdnimp,"Security directory ignored\n");
 
 
 
-	dir=pe->pe_header->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELOC];
+	dir=nt_header->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELOC];
 	if(dir.Size)
 	{
 		if(pem->pe_reloc && (int)pem->pe_reloc!= RVA(dir.VirtualAddress))
@@ -581,38 +615,38 @@ PE_MapImage(PE_MODULE *pe,PDB32 *process, OFSTRUCT *ofs, DWORD flags) {
 		pem->pe_reloc = (void *) RVA(dir.VirtualAddress);
 	}
 
-	if(pe->pe_header->OptionalHeader.DataDirectory
+	if(nt_header->OptionalHeader.DataDirectory
 		[IMAGE_DIRECTORY_ENTRY_COPYRIGHT].Size)
 		dprintf_win32(stdnimp,"Copyright string ignored\n");
 
-	if(pe->pe_header->OptionalHeader.DataDirectory
+	if(nt_header->OptionalHeader.DataDirectory
 		[IMAGE_DIRECTORY_ENTRY_GLOBALPTR].Size)
 		dprintf_win32(stdnimp,"Global Pointer (MIPS) ignored\n");
 
-	if(pe->pe_header->OptionalHeader.DataDirectory
+	if(nt_header->OptionalHeader.DataDirectory
 		[IMAGE_DIRECTORY_ENTRY_TLS].Size)
 		 fprintf(stdnimp,"Thread local storage ignored\n");
 
-	if(pe->pe_header->OptionalHeader.DataDirectory
+	if(nt_header->OptionalHeader.DataDirectory
 		[IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG].Size)
 		dprintf_win32(stdnimp,"Load Configuration directory ignored\n");
 
-	if(pe->pe_header->OptionalHeader.DataDirectory
+	if(nt_header->OptionalHeader.DataDirectory
 		[IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT].Size)
 		dprintf_win32(stdnimp,"Bound Import directory ignored\n");
 
-	if(pe->pe_header->OptionalHeader.DataDirectory
+	if(nt_header->OptionalHeader.DataDirectory
 		[IMAGE_DIRECTORY_ENTRY_IAT].Size)
 		dprintf_win32(stdnimp,"Import Address Table directory ignored\n");
-	if(pe->pe_header->OptionalHeader.DataDirectory[13].Size)
+	if(nt_header->OptionalHeader.DataDirectory[13].Size)
 		dprintf_win32(stdnimp,"Unknown directory 13 ignored\n");
-	if(pe->pe_header->OptionalHeader.DataDirectory[14].Size)
+	if(nt_header->OptionalHeader.DataDirectory[14].Size)
 		dprintf_win32(stdnimp,"Unknown directory 14 ignored\n");
-	if(pe->pe_header->OptionalHeader.DataDirectory[15].Size)
+	if(nt_header->OptionalHeader.DataDirectory[15].Size)
 		dprintf_win32(stdnimp,"Unknown directory 15 ignored\n");
 
 	if(pem->pe_reloc)	do_relocations(pem);
-	if(pem->pe_export)	dump_exports(pem->pe_export,load_addr);
+	if(pem->pe_export)	dump_exports(pem->module);
 	if(pem->pe_import)	fixup_imports(process,pem);
   		
 	if (pem->pe_export)
@@ -625,6 +659,11 @@ PE_MapImage(PE_MODULE *pe,PDB32 *process, OFSTRUCT *ofs, DWORD flags) {
 		if ((s=strchr(modname,'.')))
 			*s='\0';
 	}
+
+        /* Now that we got everything at the right address,
+         * we can unmap the previous module */
+        UnmapViewOfFile( (LPVOID)hModule );
+        return (HMODULE32)load_addr;
 }
 
 HINSTANCE16 MODULE_CreateInstance(HMODULE16 hModule,LOADPARAMS *params);
@@ -647,8 +686,7 @@ HMODULE32 PE_LoadLibraryEx32A (LPCSTR name, HFILE32 hFile, DWORD flags) {
 		/* check if this module is already mapped */
 		pem 	= ((PDB32*)GetCurrentProcessId())->modref_list;
 		while (pem) {
-			if (pem->pe_module->mappeddll == hModule)
-				return hModule;
+			if (pem->module == hModule) return hModule;
 			pem = pem->next;
 		}
 		pModule = MODULE_GetPtr(hModule);
@@ -656,14 +694,14 @@ HMODULE32 PE_LoadLibraryEx32A (LPCSTR name, HFILE32 hFile, DWORD flags) {
 
 		/* try to load builtin, enabled modules first */
 		if ((hModule = BUILTIN_LoadModule( name, FALSE )))
-			return hModule;
+                    return MODULE_HANDLEtoHMODULE32( hModule );
 
 		/* try to open the specified file */
 		if (HFILE_ERROR32==(hFile=OpenFile32(name,&ofs,OF_READ))) {
 			/* Now try the built-in even if disabled */
 			if ((hModule = BUILTIN_LoadModule( name, TRUE ))) {
 				fprintf( stderr, "Warning: could not load Windows DLL '%s', using built-in module.\n", name );
-				return hModule;
+                                return MODULE_HANDLEtoHMODULE32( hModule );
 			}
 			return 1;
 		}
@@ -673,14 +711,15 @@ HMODULE32 PE_LoadLibraryEx32A (LPCSTR name, HFILE32 hFile, DWORD flags) {
 		}
 		pModule		= (NE_MODULE *)GlobalLock16( hModule );
 		pModule->flags	= NE_FFLAGS_WIN32;
-		pModule->pe_module = PE_LoadImage( hFile );
+		pModule->module32 = PE_LoadImage( hFile );
 		CloseHandle( hFile );
-		if (!pModule->pe_module)
-			return 21;
+		if (pModule->module32 < 32) return 21;
 	}
 	/* recurse */
-	PE_MapImage(pModule->pe_module,(PDB32*)GetCurrentProcessId(),&ofs,flags);
-	return pModule->pe_module->mappeddll;
+	pModule->module32 = PE_MapImage( pModule->module32,
+                                         (PDB32*)GetCurrentProcessId(),
+                                         &ofs,flags);
+	return pModule->module32;
 }
 
 /*****************************************************************************
@@ -690,28 +729,29 @@ HMODULE32 PE_LoadLibraryEx32A (LPCSTR name, HFILE32 hFile, DWORD flags) {
  */
 HINSTANCE16 PE_LoadModule( HFILE32 hFile, OFSTRUCT *ofs, LOADPARAMS* params )
 {
-    HMODULE16 hModule;
+    HMODULE16 hModule16;
+    HMODULE32 hModule32;
     HINSTANCE16 hInstance;
     NE_MODULE *pModule;
 
-    if ((hModule = MODULE_CreateDummyModule( ofs )) < 32) return hModule;
-    pModule = (NE_MODULE *)GlobalLock16( hModule );
+    if ((hModule16 = MODULE_CreateDummyModule( ofs )) < 32) return hModule16;
+    pModule = (NE_MODULE *)GlobalLock16( hModule16 );
     pModule->flags = NE_FFLAGS_WIN32;
 
-    pModule->pe_module = PE_LoadImage( hFile );
+    pModule->module32 = hModule32 = PE_LoadImage( hFile );
     CloseHandle( hFile );
-    if (!pModule->pe_module)
-    	return 21;
+    if (hModule32 < 32) return 21;
 
-    hInstance = MODULE_CreateInstance( hModule, params );
-    if (!(pModule->pe_module->pe_header->FileHeader.Characteristics & IMAGE_FILE_DLL))
+    hInstance = MODULE_CreateInstance( hModule16, params );
+    if (!(PE_HEADER(hModule32)->FileHeader.Characteristics & IMAGE_FILE_DLL))
     {
-        TASK_CreateTask( hModule, hInstance, 0,
+        TASK_CreateTask( hModule16, hInstance, 0,
                          params->hEnvironment,
                          (LPSTR)PTR_SEG_TO_LIN( params->cmdLine ),
                          *((WORD*)PTR_SEG_TO_LIN(params->showCmd) + 1) );
     }
-    PE_MapImage(pModule->pe_module,(PDB32*)GetCurrentProcessId(),ofs,0);
+    pModule->module32 = PE_MapImage( hModule32, (PDB32*)GetCurrentProcessId(),
+                                     ofs, 0 );
     return hInstance;
 }
 
@@ -729,9 +769,6 @@ int PE_UnloadImage( HMODULE32 hModule )
  */
 static void PE_InitDLL(PE_MODREF *pem, DWORD type,LPVOID lpReserved)
 {
-    PE_MODULE		*pe = pem->pe_module;
-    unsigned int	load_addr = pem->load_addr;
-
     if (type==DLL_PROCESS_ATTACH)
 	pem->flags |= PE_MODREF_PROCESS_ATTACHED;
 
@@ -743,13 +780,14 @@ static void PE_InitDLL(PE_MODREF *pem, DWORD type,LPVOID lpReserved)
      */
         
     /* Is this a library? And has it got an entrypoint? */
-    if (	(pe->pe_header->FileHeader.Characteristics & IMAGE_FILE_DLL) &&
-		(pe->pe_header->OptionalHeader.AddressOfEntryPoint)
+    if ((PE_HEADER(pem->module)->FileHeader.Characteristics & IMAGE_FILE_DLL) &&
+        (PE_HEADER(pem->module)->OptionalHeader.AddressOfEntryPoint)
     ) {
-        FARPROC32 entry = (FARPROC32)RVA(pe->pe_header->OptionalHeader.AddressOfEntryPoint);
+        FARPROC32 entry = (FARPROC32)RVA_PTR( pem->module,
+                                          OptionalHeader.AddressOfEntryPoint );
         dprintf_relay( stddeb, "CallTo32(entryproc=%p,module=%d,type=%ld,res=%p)\n",
-                       entry, pe->mappeddll, type, lpReserved );
-        entry( pe->mappeddll, type, lpReserved );
+                       entry, pem->module, type, lpReserved );
+        entry( pem->module, type, lpReserved );
     }
 }
 
@@ -788,12 +826,12 @@ void PE_InitTls(PDB32 *pdb)
 
 	pem = pdb->modref_list;
 	while (pem) {
-		peh = pem->pe_module->pe_header;
+		peh = PE_HEADER(pem->module);
 		if (!peh->OptionalHeader.DataDirectory[IMAGE_FILE_THREAD_LOCAL_STORAGE].VirtualAddress) {
 			pem = pem->next;
 			continue;
 		}
-		pdir = (LPVOID)(pem->load_addr + peh->OptionalHeader.
+		pdir = (LPVOID)(pem->module + peh->OptionalHeader.
 			DataDirectory[IMAGE_FILE_THREAD_LOCAL_STORAGE].VirtualAddress);
 		index	= TlsAlloc();
 		datasize= pdir->EndAddressOfRawData-pdir->StartAddressOfRawData;
@@ -816,7 +854,7 @@ BOOL32 WINAPI DisableThreadLibraryCalls(HMODULE32 hModule)
 	PE_MODREF	*pem = process->modref_list;
 
 	while (pem) {
-		if (pem->pe_module->mappeddll == hModule)
+		if (pem->module == hModule)
 			pem->flags|=PE_MODREF_NO_DLL_CALLS;
 		pem = pem->next;
 	}
diff --git a/loader/pe_resource.c b/loader/pe_resource.c
index 11ee0037dc3..4ba09dde6c4 100644
--- a/loader/pe_resource.c
+++ b/loader/pe_resource.c
@@ -41,7 +41,7 @@ HMODULE32toPE_MODREF(HMODULE32 hmod) {
 	if (!hmod) return NULL;
 	if (!(pModule = MODULE_GetPtr( hmod ))) return 0;
 	pem = pdb->modref_list;
-	while (pem && pem->pe_module->mappeddll != hmod)
+	while (pem && pem->module != hmod)
 		pem=pem->next;
 	return pem;
 }
@@ -141,7 +141,7 @@ HANDLE32 PE_LoadResource32( HINSTANCE32 hModule, HANDLE32 hRsrc )
     	return 0;
     if (!hRsrc)
    	 return 0;
-    return (HANDLE32) (pem->load_addr+((LPIMAGE_RESOURCE_DATA_ENTRY)hRsrc)->OffsetToData);
+    return (HANDLE32) (pem->module + ((LPIMAGE_RESOURCE_DATA_ENTRY)hRsrc)->OffsetToData);
 }
 
 
diff --git a/loader/resource.c b/loader/resource.c
index 0017fa78ac0..5e98fb5d279 100644
--- a/loader/resource.c
+++ b/loader/resource.c
@@ -45,19 +45,27 @@ HRSRC16 WINAPI FindResource16( HMODULE16 hModule, SEGPTR name, SEGPTR type )
     NE_MODULE *pModule;
 
     hModule = MODULE_HANDLEtoHMODULE16( hModule ); 
-    dprintf_resource(stddeb, "FindResource16: module=%04x type=", hModule );
-    PrintId( type );
+    dprintf_resource(stddeb, "FindResource16: module=%04x", hModule );
 
     if (HIWORD(name))  /* Check for '#xxx' name */
     {
 	char *ptr = PTR_SEG_TO_LIN( name );
-	if (ptr[0] == '#') {
+	if (ptr[0] == '#')
 	    if (!(name = (SEGPTR)atoi( ptr + 1 ))) return 0;
-	}
     }
 
     dprintf_resource( stddeb, " name=" );
     PrintId( name );
+
+    if (HIWORD(type))  /* Check for '#xxx' type */
+    {
+	char *ptr = PTR_SEG_TO_LIN( type );
+	if (ptr[0] == '#')
+	    if (!(type = (SEGPTR)atoi( ptr + 1 ))) return 0;
+    }
+
+    dprintf_resource( stddeb, " type=" );
+    PrintId( type );
     dprintf_resource( stddeb, "\n" );
 
     if ((pModule = MODULE_GetPtr( hModule )))
@@ -547,7 +555,7 @@ INT16 WINAPI LoadString16( HINSTANCE16 instance, UINT16 resource_id,
  *	LoadString32W		(USER32.375)
  */
 INT32 WINAPI LoadString32W( HINSTANCE32 instance, UINT32 resource_id,
-                            LPWSTR buffer, int buflen )
+                            LPWSTR buffer, INT32 buflen )
 {
     HGLOBAL32 hmem;
     HRSRC32 hrsrc;
@@ -599,16 +607,20 @@ INT32 WINAPI LoadString32W( HINSTANCE32 instance, UINT32 resource_id,
  *	LoadString32A	(USER32.374)
  */
 INT32 WINAPI LoadString32A( HINSTANCE32 instance, UINT32 resource_id,
-                            LPSTR buffer,int buflen )
+                            LPSTR buffer, INT32 buflen )
 {
     INT32 retval;
     LPWSTR buffer2 = NULL;
-    if (buffer) buffer2 = HeapAlloc( GetProcessHeap(), 0, buflen * 2 );
+    if (buffer && buflen)
+	buffer2 = HeapAlloc( GetProcessHeap(), 0, buflen * 2 );
     retval = LoadString32W(instance,resource_id,buffer2,buflen);
 
     if (buffer2)
     {
-        lstrcpynWtoA( buffer, buffer2, buflen );
+	if (retval) {
+	    lstrcpynWtoA( buffer, buffer2, buflen );
+	    retval = lstrlen32A( buffer );
+	}
 	HeapFree( GetProcessHeap(), 0, buffer2 );
     }
     return retval;
@@ -640,7 +652,7 @@ INT32 WINAPI LoadString32A( HINSTANCE32 instance, UINT32 resource_id,
  *	LoadMessage32A		(internal)
  */
 INT32 LoadMessage32A( HINSTANCE32 instance, UINT32 id, WORD lang,
-                      LPSTR buffer, int buflen )
+                      LPSTR buffer, INT32 buflen )
 {
     HGLOBAL32	hmem;
     HRSRC32	hrsrc;
@@ -708,15 +720,19 @@ INT32 LoadMessage32A( HINSTANCE32 instance, UINT32 id, WORD lang,
  *	LoadMessage32W	(internal)
  */
 INT32 LoadMessage32W( HINSTANCE32 instance, UINT32 id, WORD lang,
-                      LPWSTR buffer, int buflen )
+                      LPWSTR buffer, INT32 buflen )
 {
     INT32 retval;
     LPSTR buffer2 = NULL;
-    if (buffer) buffer2 = HeapAlloc( GetProcessHeap(), 0, buflen );
+    if (buffer && buflen)
+	buffer2 = HeapAlloc( GetProcessHeap(), 0, buflen );
     retval = LoadMessage32A(instance,id,lang,buffer2,buflen);
     if (buffer)
     {
-        lstrcpynAtoW( buffer, buffer2, buflen );
+	if (retval) {
+	    lstrcpynAtoW( buffer, buffer2, buflen );
+	    retval = lstrlen32W( buffer );
+	}
 	HeapFree( GetProcessHeap(), 0, buffer2 );
     }
     return retval;
diff --git a/loader/task.c b/loader/task.c
index 4c5d51ff292..cf981d4958c 100644
--- a/loader/task.c
+++ b/loader/task.c
@@ -340,18 +340,17 @@ static void TASK_CallToStart(void)
     SEGTABLEENTRY *pSegTable = NE_SEG_TABLE( pModule );
 
     IF1632_Saved16_ss_sp = pTask->ss_sp;
+    SET_FS( pCurrentThread->teb_sel );
     if (pModule->flags & NE_FFLAGS_WIN32)
     {
         /* FIXME: all this is an ugly hack */
 
         extern void InitTask( CONTEXT *context );
 
-        FARPROC32 entry = (FARPROC32)(pCurrentProcess->exe_modref->load_addr + 
-                 pCurrentProcess->exe_modref->pe_module->pe_header->OptionalHeader.AddressOfEntryPoint);
+        FARPROC32 entry = (FARPROC32)RVA_PTR( pCurrentProcess->exe_modref->module, OptionalHeader.AddressOfEntryPoint );
 
         InitTask( NULL );
         InitApp( pTask->hModule );
-        SET_FS( pCurrentThread->teb_sel );
         PE_InitializeDLLs( pCurrentProcess, DLL_PROCESS_ATTACH, (LPVOID)-1 );
         dprintf_relay( stddeb, "CallTo32(entryproc=%p)\n", entry );
         exit_code = entry();
@@ -526,7 +525,8 @@ HTASK16 TASK_CreateTask( HMODULE16 hModule, HINSTANCE16 hInstance,
 	    	pCurrentProcess->exe_modref->load_addr +
 		pCurrentProcess->exe_modref->pe_module->pe_header->OptionalHeader.AddressOfEntryPoint);
      */
-        pTask->thdb = THREAD_Create( pdb32, 0, 0 );
+        pTask->thdb = THREAD_Create( pdb32,
+          PE_HEADER(pModule->module32)->OptionalHeader.SizeOfStackReserve, 0 );
         /* FIXME: should not be done here */
         pCurrentThread = pTask->thdb;
         PE_InitTls( pdb32 );
@@ -1005,9 +1005,9 @@ void WINAPI UserYield(void)
 
 
 /***********************************************************************
- *           Yield  (KERNEL.29)
+ *           Yield16  (KERNEL.29)
  */
-void WINAPI Yield(void)
+void WINAPI Yield16(void)
 {
     TDB *pCurTask = (TDB *)GlobalLock16( hCurrentTask );
     if (pCurTask) pCurTask->hYieldTo = 0;
@@ -1021,16 +1021,24 @@ void WINAPI Yield(void)
  */
 FARPROC16 WINAPI MakeProcInstance16( FARPROC16 func, HANDLE16 hInstance )
 {
-    BYTE *thunk;
+    BYTE *thunk,*lfunc;
     SEGPTR thunkaddr;
     
     if (__winelib) return func; /* func can be called directly in Winelib */
     thunkaddr = TASK_AllocThunk( hCurrentTask );
     if (!thunkaddr) return (FARPROC16)0;
     thunk = PTR_SEG_TO_LIN( thunkaddr );
+    lfunc = PTR_SEG_TO_LIN( func );
 
     dprintf_task( stddeb, "MakeProcInstance(%08lx,%04x): got thunk %08lx\n",
                   (DWORD)func, hInstance, (DWORD)thunkaddr );
+    if (((lfunc[0]==0x8c) && (lfunc[1]==0xd8)) ||
+    	((lfunc[0]==0x1e) && (lfunc[1]==0x58))
+    ) {
+    	fprintf(stderr,"FIXME: MakeProcInstance16 thunk would be useless for %p, overwriting with nop;nop;\n", func );
+	lfunc[0]=0x90; /* nop */
+	lfunc[1]=0x90; /* nop */
+    }
     
     *thunk++ = 0xb8;    /* movw instance, %ax */
     *thunk++ = (BYTE)(hInstance & 0xff);
@@ -1074,6 +1082,15 @@ HANDLE16 WINAPI GetCodeHandle( FARPROC16 proc )
 }
 
 
+/**********************************************************************
+ *          DefineHandleTable16    (KERNEL.94)
+ */
+BOOL16 WINAPI DefineHandleTable16( WORD wOffset )
+{
+    return TRUE;  /* FIXME */
+}
+
+
 /***********************************************************************
  *           SetTaskQueue  (KERNEL.34)
  */
diff --git a/memory/global.c b/memory/global.c
index b4b53cd3158..4490b8a0079 100644
--- a/memory/global.c
+++ b/memory/global.c
@@ -567,9 +567,9 @@ BOOL16 WINAPI GlobalUnWire16( HGLOBAL16 handle )
 
 
 /***********************************************************************
- *           SetSwapAreaSize   (KERNEL.106)
+ *           SetSwapAreaSize16   (KERNEL.106)
  */
-LONG WINAPI SetSwapAreaSize( WORD size )
+LONG WINAPI SetSwapAreaSize16( WORD size )
 {
     dprintf_global(stdnimp, "STUB: SetSwapAreaSize(%d)\n", size );
     return MAKELONG( size, 0xffff );
diff --git a/memory/virtual.c b/memory/virtual.c
index 8bc92cee991..7ae69be49f1 100644
--- a/memory/virtual.c
+++ b/memory/virtual.c
@@ -1080,6 +1080,28 @@ error:
 }
 
 
+/***********************************************************************
+ *             FlushViewOfFile   (KERNEL32.262)
+ */
+BOOL32 WINAPI FlushViewOfFile( LPCVOID base, DWORD cbFlush )
+{
+    FILE_VIEW *view;
+    UINT32 addr = ROUND_ADDR( base );
+
+    dprintf_virtual( stddeb, "FlushViewOfFile at %p for %ld bytes\n",
+                     base, cbFlush );
+
+    if (!(view = VIRTUAL_FindView( addr )))
+    {
+        SetLastError( ERROR_INVALID_PARAMETER );
+        return FALSE;
+    }
+    if (!cbFlush) cbFlush = view->size;
+    if (!msync( addr, cbFlush, MS_SYNC )) return TRUE;
+    SetLastError( ERROR_INVALID_PARAMETER );
+    return FALSE;
+
+}
 /***********************************************************************
  *             UnmapViewOfFile   (KERNEL32.540)
  */
diff --git a/misc/Makefile.in b/misc/Makefile.in
index 9a5b752ad31..4bbbe90bd76 100644
--- a/misc/Makefile.in
+++ b/misc/Makefile.in
@@ -10,7 +10,6 @@ C_SRCS = \
 	callback.c \
 	comm.c \
 	commdlg.c \
-	compobj.c \
 	crtdll.c \
 	cpu.c \
 	ddeml.c \
@@ -22,15 +21,11 @@ C_SRCS = \
 	mpr.c \
 	network.c \
 	ntdll.c \
-	ole2.c \
-	ole2disp.c \
-	ole2nls.c \
-	olecli.c \
-	olesvr.c \
 	port.c \
 	printdrv.c \
 	registry.c \
 	shell.c \
+	shellord.c \
 	sound.c \
 	spy.c \
 	stress.c \
@@ -39,6 +34,8 @@ C_SRCS = \
 	tweak.c \
 	ver.c \
 	version.c \
+	w32scomb.c \
+	w32skrnl.c \
 	w32sys.c \
 	winsock.c \
 	winsock_dns.c \
diff --git a/misc/commdlg.c b/misc/commdlg.c
index 4c3668dbee1..83fa922b19f 100644
--- a/misc/commdlg.c
+++ b/misc/commdlg.c
@@ -124,6 +124,7 @@ BOOL16 WINAPI GetOpenFileName16( SEGPTR ofn )
     }
 
     hInst = WIN_GetWindowInstance( lpofn->hwndOwner );
+    /* FIXME: doesn't handle win32 format correctly yet */
     hwndDialog = DIALOG_CreateIndirect( hInst, template, win32Format,
                                         lpofn->hwndOwner,
                                         (DLGPROC16)MODULE_GetWndProcEntry16("FileOpenDlgProc"),
diff --git a/misc/crtdll.c b/misc/crtdll.c
index d5be371dd60..7ffa01a4d59 100644
--- a/misc/crtdll.c
+++ b/misc/crtdll.c
@@ -474,6 +474,16 @@ void __cdecl CRTDLL_exit(DWORD ret)
 }
 
 
+/*********************************************************************
+ *                  _abnormal_termination          (CRTDLL.36 )
+ */
+INT32 __cdecl CRTDLL__abnormal_termination(void)
+{
+        dprintf_crtdll(stddeb,"CRTDLL__abnormal_termination\n");
+	return 0;
+}
+
+
 /*********************************************************************
  *                  fflush        (CRTDLL.365)
  */
@@ -582,6 +592,19 @@ INT32 __cdecl CRTDLL_getc( FILE *stream )
   return ret;
 }
 
+/*********************************************************************
+ *                  _rotl          (CRTDLL.259)
+ */
+UINT32 __cdecl CRTDLL__rotl(UINT32 x,INT32 shift)
+{
+   unsigned int ret = (x >> shift)|( x >>((sizeof(x))-shift));
+
+   dprintf_crtdll(stddeb,
+		  "CRTDLL_rotl got 0x%08x rot %d ret 0x%08x\n",
+		  x,shift,ret);
+   return ret;
+    
+}
 /*********************************************************************
  *                  _lrotl          (CRTDLL.176)
  */
@@ -1429,6 +1452,66 @@ LPSTR __cdecl CRTDLL__fullpath(LPSTR buf, LPCSTR name, INT32 size)
   return buf;
 }
 
+/*********************************************************************
+ *                  _splitpath           (CRTDLL.279)
+ */
+VOID __cdecl CRTDLL__splitpath(LPCSTR path, LPSTR drive, LPSTR directory, LPSTR filename, LPSTR extension )
+{
+  /* drive includes :
+     directory includes leading and trailing (forward and backward slashes)
+     filename without dot and slashes
+     extension with leading dot
+     */
+  char * drivechar,*dirchar,*namechar;
+
+  dprintf_crtdll(stddeb,"CRTDLL__splitpath got %s\n",path);
+
+  drivechar  = strchr(path,':');
+  dirchar    = strrchr(path,'/');
+  namechar   = strrchr(path,'\\');
+  dirchar = MAX(dirchar,namechar);
+  if (dirchar)
+    namechar   = strrchr(dirchar,'.');
+  else
+    namechar   = strrchr(path,'.');
+  
+  
+  if (drive) 
+    {
+      *drive = NULL;
+      if (drivechar) 
+	{
+	  strncat(drive,path,drivechar-path+1);
+	  path = drivechar+1;
+	}
+    }
+  if (directory) 
+    {
+      *directory = NULL;
+      if (dirchar)
+	{
+	  strncat(directory,path,dirchar-path+1);
+	  path = dirchar+1;
+	}
+    }
+  if (filename)
+    {
+      *filename = NULL;
+      if (namechar)
+	{
+	  strncat(filename,path,namechar-path);
+	  if (extension) 
+	    {
+	      *extension = NULL;
+	      strcat(extension,namechar);
+	    }
+	}
+    }
+
+  dprintf_crtdll(stddeb,"CRTDLL__splitpath found %s %s %s %s\n",drive,directory,filename,extension);
+  
+}
+
 /*********************************************************************
  *                  _getcwd           (CRTDLL.120)
  */
diff --git a/misc/lzexpand.c b/misc/lzexpand.c
index 9f370726be4..90c23231530 100644
--- a/misc/lzexpand.c
+++ b/misc/lzexpand.c
@@ -168,7 +168,7 @@ HFILE32 WINAPI LZInit32( HFILE32 hfSrc )
 		_llseek32(hfSrc,0,SEEK_SET);
 		return ret?ret:hfSrc;
 	}
-	lzstates = HeapReAlloc( GetProcessHeap(), 0, lzstates,
+	lzstates = HeapReAlloc( SystemHeap, 0, lzstates,
                                 (++nroflzstates)*sizeof(struct lzstate) );
 	lzs		= lzstates+(nroflzstates-1);
 
@@ -618,7 +618,7 @@ void WINAPI LZClose32( HFILE32 fd )
 	memmove(lzstates+i,lzstates+i+1,
                 sizeof(struct lzstate)*(nroflzstates-i-1));
 	nroflzstates--;
-	lzstates = HeapReAlloc( GetProcessHeap(), 0, lzstates,
+	lzstates = HeapReAlloc( SystemHeap, 0, lzstates,
                                 sizeof(struct lzstate)*nroflzstates );
 }
 
diff --git a/misc/main.c b/misc/main.c
index 14049055815..02984aeec0b 100644
--- a/misc/main.c
+++ b/misc/main.c
@@ -118,7 +118,7 @@ static XrmOptionDescRec optionsTable[] =
 #define NB_OPTIONS  (sizeof(optionsTable) / sizeof(optionsTable[0]))
 
 #define USAGE \
-  "Usage:  %s [options] program_name [arguments]\n" \
+  "Usage:  %s [options] \"program_name [arguments]\"\n" \
   "\n" \
   "Options:\n" \
   "    -backingstore   Turn on backing store\n" \
@@ -613,7 +613,7 @@ void WINAPI MessageBeep16( UINT16 i )
  */
 BOOL32 WINAPI MessageBeep32( UINT32 i )
 {
-    XBell( display, 100 );
+    XBell( display, 0 );
     return TRUE;
 }
 
@@ -624,7 +624,7 @@ BOOL32 WINAPI MessageBeep32( UINT32 i )
 BOOL32 WINAPI Beep( DWORD dwFreq, DWORD dwDur )
 {
     /* dwFreq and dwDur are ignored by Win95 */
-    XBell(display, 100);
+    XBell(display, 0);
     return TRUE;
 }
 
diff --git a/misc/network.c b/misc/network.c
index 4ebd1ffb649..12ed9fa0784 100644
--- a/misc/network.c
+++ b/misc/network.c
@@ -6,6 +6,7 @@
 #include <stdio.h>
 
 #include "windows.h"
+#include "winerror.h"
 #include "drive.h"
 
 #define WN_SUCCESS       			0x0000
@@ -29,8 +30,10 @@
 #define WN_ALREADY_CONNECTED		0x0034
 #define WN_DEVICE_ERROR     		0x0035
 #define WN_CONNECTION_CLOSED		0x0036
+#define WN_NO_NETWORK				ERROR_NO_NETWORK
 
-typedef LPSTR 	LPNETRESOURCE;
+
+typedef LPVOID	LPNETRESOURCE16;
 
 /**************************************************************************
  *              WNetErrorText       [USER.499]
@@ -170,8 +173,12 @@ int WINAPI WNetGetConnection16(LPSTR lpLocalName,
         case DRIVE_FIXED:
             return WN_NOT_CONNECTED;
         case DRIVE_REMOTE:
-            path = DRIVE_GetDosCwd(drive);
-            if (strlen(path) + 1 > *cbRemoteName) return WN_MORE_DATA;
+            path = DRIVE_GetLabel(drive);
+            if (strlen(path) + 1 > *cbRemoteName)
+            {
+                *cbRemoteName = strlen(path) + 1;
+                return WN_MORE_DATA;
+            }
             strcpy( lpRemoteName, path );
             *cbRemoteName = strlen(lpRemoteName) + 1;
             return WN_SUCCESS;
@@ -194,7 +201,7 @@ int WINAPI WNetGetCaps(WORD capability)
 int WINAPI WNetDeviceMode(HWND16 hWndOwner)
 {
 	printf("EMPTY STUB !!! WNetDeviceMode(%04x)\n",hWndOwner);
-	return WN_NET_ERROR;
+	return WN_NO_NETWORK;
 }
 
 /**************************************************************************
@@ -204,7 +211,7 @@ int WINAPI WNetBrowseDialog(HWND16 hParent,WORD nType,LPSTR szPath)
 {
 	printf("EMPTY STUB !!! WNetBrowseDialog(%04x,%x,'%s')\n",
 		hParent,nType,szPath);
-	return WN_NET_ERROR;
+	return WN_NO_NETWORK;
 }
 
 /**************************************************************************
@@ -214,7 +221,7 @@ UINT16 WINAPI WNetGetUser(LPSTR lpLocalName, LPSTR lpUserName, DWORD *lpSize)
 {
 	printf("EMPTY STUB !!! WNetGetUser(%p, %p, %p);\n", 
 							lpLocalName, lpUserName, lpSize);
-	return WN_NET_ERROR;
+	return WN_NO_NETWORK;
 }
 
 /**************************************************************************
@@ -225,7 +232,7 @@ UINT16 WINAPI WNetAddConnection(LPSTR lpNetPath, LPSTR lpPassWord,
 {
 	printf("EMPTY STUB !!! WNetAddConnection('%s', %p, '%s');\n",
 							lpNetPath, lpPassWord, lpLocalName);
-	return WN_NET_ERROR;
+	return WN_NO_NETWORK;
 }
 
 
@@ -236,7 +243,7 @@ UINT16 WINAPI WNetCancelConnection(LPSTR lpName, BOOL16 bForce)
 {
     printf("EMPTY STUB !!! WNetCancelConnection('%s', %04X);\n",
            lpName, bForce);
-    return WN_NET_ERROR;
+    return WN_NO_NETWORK;
 }
 
 /**************************************************************************
@@ -245,7 +252,7 @@ UINT16 WINAPI WNetCancelConnection(LPSTR lpName, BOOL16 bForce)
 int WINAPI WNetGetError(LPWORD nError)
 {
 	printf("EMPTY STUB !!! WNetGetError(%p)\n",nError);
-	return WN_NET_ERROR;
+	return WN_NO_NETWORK;
 }
 
 /**************************************************************************
@@ -265,7 +272,7 @@ int WINAPI WNetRestoreConnection(HWND16 hwndOwner,LPSTR lpszDevice)
 {
 	printf("EMPTY STUB !!! WNetRestoreConnection(%04x,'%s')\n",
 		hwndOwner,lpszDevice);
-	return WN_NET_ERROR;
+	return WN_NO_NETWORK;
 }
 
 /**************************************************************************
@@ -275,7 +282,7 @@ int WINAPI WNetWriteJob(HANDLE16 hJob,void *lpData,LPWORD lpcbData)
 {
 	printf("EMPTY STUB !!! WNetWriteJob(%04x,%p,%p)\n",
 		hJob,lpData,lpcbData);
-	return WN_NET_ERROR;
+	return WN_NO_NETWORK;
 }
 
 /**************************************************************************
@@ -294,7 +301,7 @@ int WINAPI WNetDisconnectDialog(HWND16 hwndOwner, WORD iType)
 {
 	printf("EMPTY STUB !!! WNetDisconnectDialog(%04x,%x)\n",
 		hwndOwner,iType);
-	return WN_NET_ERROR;
+	return WN_NO_NETWORK;
 }
 
 /**************************************************************************
@@ -314,7 +321,7 @@ int WINAPI WNetViewQueueDialog(HWND16 hwndOwner,LPSTR lpszQueue)
 {
 	printf("EMPTY STUB !!! WNetViewQueueDialog(%04x,'%s')\n",
 		hwndOwner,lpszQueue);
-	return WN_NET_ERROR;
+	return WN_NO_NETWORK;
 }
 
 /**************************************************************************
@@ -325,7 +332,7 @@ int WINAPI WNetPropertyDialog(HWND16 hwndParent,WORD iButton,
 {
 	printf("EMPTY STUB !!! WNetPropertyDialog(%04x,%x,%x,'%s',%x)\n",
 		hwndParent,iButton,nPropSel,lpszName,nType);
-	return WN_NET_ERROR;
+	return WN_NO_NETWORK;
 }
 
 /**************************************************************************
@@ -335,7 +342,7 @@ int WINAPI WNetGetDirectoryType(LPSTR lpName,void *lpType)
 {
 	printf("EMPTY STUB !!! WNetGetDirectoryType('%s',%p)\n",
 		lpName,lpType);
-	return WN_NET_ERROR;
+	return WN_NO_NETWORK;
 }
 
 /**************************************************************************
@@ -345,7 +352,7 @@ int WINAPI WNetDirectoryNotify(HWND16 hwndOwner,void *lpDir,WORD wOper)
 {
 	printf("EMPTY STUB !!! WNetDirectoryNotify(%04x,%p,%x)\n",
 		hwndOwner,lpDir,wOper);
-	return WN_NET_ERROR;
+	return WN_NO_NETWORK;
 }
 
 /**************************************************************************
@@ -356,7 +363,7 @@ int WINAPI WNetGetPropertyText(HWND16 hwndParent,WORD iButton,WORD nPropSel,
 {
 	printf("EMPTY STUB !!! WNetGetPropertyText(%04x,%x,%x,'%s',%x)\n",
 		hwndParent,iButton,nPropSel,lpszName,nType);
-	return WN_NET_ERROR;
+	return WN_NO_NETWORK;
 }
 
 /**************************************************************************
@@ -367,7 +374,7 @@ UINT16 WINAPI WNetAddConnection2(LPSTR lpNetPath, LPSTR lpPassWord,
 {
 	printf("EMPTY STUB !!! WNetAddConnection2('%s', %p, '%s', '%s');\n",
 					lpNetPath, lpPassWord, lpLocalName, lpUserName);
-	return WN_NET_ERROR;
+	return WN_NO_NETWORK;
 }
 
 /**************************************************************************
@@ -376,7 +383,7 @@ UINT16 WINAPI WNetAddConnection2(LPSTR lpNetPath, LPSTR lpPassWord,
 UINT16 WINAPI WNetCloseEnum(HANDLE16 hEnum)
 {
 	printf("EMPTY STUB !!! WNetCloseEnum(%04x);\n", hEnum);
-	return WN_NET_ERROR;
+	return WN_NO_NETWORK;
 }
 
 /**************************************************************************
@@ -387,22 +394,35 @@ UINT16 WINAPI WNetEnumResource(HANDLE16 hEnum, DWORD cRequ,
 {
 	printf("EMPTY STUB !!! WNetEnumResource(%04x, %08lX, %p, %p);\n", 
 							hEnum, cRequ, lpCount, lpBuf);
-	return WN_NET_ERROR;
+	return WN_NO_NETWORK;
 }
 
 /**************************************************************************
  *				WNetOpenEnum		[USER.???]
  */
-UINT16 WINAPI WNetOpenEnum(DWORD dwScope, DWORD dwType, 
-                           LPNETRESOURCE lpNet, HANDLE16 *lphEnum)
+UINT16 WINAPI WNetOpenEnum16(DWORD dwScope, DWORD dwType, 
+                             LPNETRESOURCE16 lpNet, HANDLE16 *lphEnum)
 {
 	printf("EMPTY STUB !!! WNetOpenEnum(%08lX, %08lX, %p, %p);\n",
                dwScope, dwType, lpNet, lphEnum);
-	return WN_NET_ERROR;
+	return WN_NO_NETWORK;
 }
 
+/**************************************************************************
+ *				WNetOpenEnumA		[MPR.92]
+ */
+UINT32 WINAPI WNetOpenEnum32A(DWORD dwScope, DWORD dwType, 
+                              LPNETRESOURCE32A lpNet, HANDLE32 *lphEnum)
+{
+	printf("EMPTY STUB !!! WNetOpenEnumA(%08lX, %08lX, %p, %p);\n",
+               dwScope, dwType, lpNet, lphEnum);
+	return WN_NO_NETWORK;
+}
 
-DWORD
+/**************************************************************************
+ *				WNetGetConnectionA	[MPR.92]
+ */
+DWORD WINAPI
 WNetGetConnection32A(LPCSTR localname,LPSTR remotename,LPDWORD buflen)
 {
 	UINT16	x;
@@ -410,3 +430,13 @@ WNetGetConnection32A(LPCSTR localname,LPSTR remotename,LPDWORD buflen)
 	*buflen = x;
 	return ret;
 }
+
+DWORD WINAPI 
+WNetGetResourceInformation32A(
+	LPNETRESOURCE32A netres,LPVOID buf,LPDWORD buflen,LPSTR systemstr
+) {
+	fprintf(stderr,"WNetGetResourceInformationA(%p,%p,%p,%p),stub!\n",
+		netres,buf,buflen,systemstr
+	);
+	return WN_NO_NETWORK;
+}
diff --git a/misc/olecli.c b/misc/olecli.c
deleted file mode 100644
index bdc2aaea326..00000000000
--- a/misc/olecli.c
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- *	OLECLI library
- *
- *	Copyright 1995	Martin von Loewis
- */
-
-/*	At the moment, these are only empty stubs.
- */
-
-#include "windows.h"
-#include "ole.h"
-#include "gdi.h"
-#include "stddebug.h"
-#include "debug.h"
-
-extern LONG	OLE_current_handle;
-
-/***********************************************************************
- *           OleRegisterClientDoc
- */
-OLESTATUS WINAPI OleRegisterClientDoc(	LPCSTR classname, LPCSTR docname,
-                                        LONG reserved, LHCLIENTDOC *hRet )
-{
-    dprintf_ole(stdnimp,"OleRegisterClientDoc:%s %s\n",classname,docname);
-    *hRet=++OLE_current_handle;
-    return OLE_OK;
-}
-
-/***********************************************************************
- *           OleRenameClientDoc
- */
-OLESTATUS WINAPI OleRenameClientDoc(LHCLIENTDOC hDoc, LPCSTR newName)
-{
-    dprintf_ole(stdnimp,"OleRenameClientDoc: %ld %s\n",hDoc, newName);
-    return OLE_OK;
-}
-
-/***********************************************************************
- *           OleRevokeClientDoc
- */
-OLESTATUS WINAPI OleRevokeClientDoc(LHCLIENTDOC hServerDoc)
-{
-    dprintf_ole(stdnimp,"OleRevokeClientDoc:%ld\n",hServerDoc);
-    return OLE_OK;
-}
-
-/***********************************************************************
- *           OleIsDcMeta
- */
-BOOL16 WINAPI OleIsDcMeta(HDC16 hdc)
-{
-	dprintf_ole(stddeb,"OleIsDCMeta(%04x)\n",hdc);
-	return GDI_GetObjPtr( hdc, METAFILE_DC_MAGIC ) != 0;
-}
diff --git a/misc/olesvr.c b/misc/olesvr.c
deleted file mode 100644
index 0ebc3e2ae8d..00000000000
--- a/misc/olesvr.c
+++ /dev/null
@@ -1,78 +0,0 @@
-/*
- *	OLESVR library
- *
- *	Copyright 1995	Martin von Loewis
- */
-
-/*	At the moment, these are only empty stubs.
- */
-
-#include "windows.h"
-#include "ole.h"
-#include "stddebug.h"
-#include "debug.h"
-
-LONG	OLE_current_handle;
-
-/***********************************************************************
- *           OleRegisterServer
- */
-OLESTATUS WINAPI OleRegisterServer( LPCSTR name, LPOLESERVER serverStruct,
-                                    LHSERVER *hRet, HINSTANCE16 hServer,
-                                    OLE_SERVER_USE use )
-{
-    dprintf_ole(stdnimp,"OleRegisterServer:%s\n",name);
-    *hRet=++OLE_current_handle;
-    /* return OLE_ERROR_MEMORY, OLE_ERROR_PROTECT_ONLY if you want it fail*/
-    return OLE_OK;
-}
-
-/***********************************************************************
- *           OleBlockServer
- */
-OLESTATUS WINAPI OleBlockServer(LHSERVER hServer)
-{
-    fprintf(stdnimp,"OleBlockServer:%ld\n",hServer);
-    return OLE_OK;
-}
-
-/***********************************************************************
- *           OleUnblockServer
- */
-OLESTATUS WINAPI OleUnblockServer(LHSERVER hServer, BOOL16 *block)
-{
-    fprintf(stdnimp,"OleUnblockServer:%ld\n",hServer);
-    /* no more blocked messages :) */
-    *block=FALSE;
-    return OLE_OK;
-}
-
-/***********************************************************************
- *           OleRegisterServerDoc
- */
-OLESTATUS WINAPI OleRegisterServerDoc( LHSERVER hServer, LPCSTR docname,
-                                       LPOLESERVERDOC document,
-                                       LHSERVERDOC *hRet)
-{
-    dprintf_ole(stdnimp,"OleRegisterServerDoc:%ld,%s\n", hServer, docname);
-    *hRet=++OLE_current_handle;
-    return OLE_OK;
-}
-
-/***********************************************************************
- *           OleRevokeServerDoc
- */
-OLESTATUS WINAPI OleRevokeServerDoc(LHSERVERDOC hServerDoc)
-{
-    dprintf_ole(stdnimp,"OleRevokeServerDoc:%ld\n",hServerDoc);
-    return OLE_OK;
-}
-
-/***********************************************************************
- *           OleRevokeServer
- */
-OLESTATUS WINAPI OleRevokeServer(LHSERVER hServer)
-{
-    dprintf_ole(stdnimp,"OleRevokeServer:%ld\n",hServer);
-    return OLE_OK;
-}
diff --git a/misc/printdrv.c b/misc/printdrv.c
index 1ad9e09af77..94ca6960732 100644
--- a/misc/printdrv.c
+++ b/misc/printdrv.c
@@ -89,3 +89,12 @@ LONG WINAPI DocumentProperties32A(HWND32 hWnd,HANDLE32 hPrinter,
     return 1;
 }
 
+BOOL32  WINAPI EnumPrinters32A(DWORD dwType, LPSTR lpszName,
+			       DWORD dwLevel, LPBYTE lpbPrinters,
+			       DWORD cbBuf, LPDWORD lpdwNeeded,
+			       LPDWORD lpdwReturned)
+{
+    fprintf(stderr,"EnumPrinters32A nearly empty stub\n");
+    *lpdwReturned=0;
+    return TRUE;
+}
diff --git a/misc/registry.c b/misc/registry.c
index 3cddd698b1a..fa63c804137 100644
--- a/misc/registry.c
+++ b/misc/registry.c
@@ -20,7 +20,6 @@
 #include "winerror.h"
 #include "file.h"
 #include "heap.h"
-#include "string32.h"	
 #include "stddebug.h"
 #include "debug.h"
 #include "xmalloc.h"
@@ -78,9 +77,25 @@ static KEYSTRUCT	*key_dyn_data=NULL;
 /* what valuetypes do we need to convert? */
 #define UNICONVMASK	((1<<REG_SZ)|(1<<REG_MULTI_SZ)|(1<<REG_EXPAND_SZ))
 
-#define strdupA2W(x)	STRING32_DupAnsiToUni(x)
-#define strdupW(x)	STRING32_strdupW(x)
-#define strchrW(a,c)	STRING32_lstrchrW(a,c)
+extern LPWSTR __cdecl CRTDLL_wcschr(LPWSTR a,WCHAR c);
+
+static LPWSTR strdupA2W(LPCSTR src)
+{
+	LPWSTR dest=xmalloc(2*strlen(src)+2);
+	lstrcpyAtoW(dest,src);
+	return dest;
+}
+
+static LPWSTR strdupW(LPCWSTR a) {
+	LPWSTR	b;
+	int	len;
+
+	len=sizeof(WCHAR)*(lstrlen32W(a)+1);
+	b=(LPWSTR)xmalloc(len);
+	memcpy(b,a,len);
+	return b;
+}
+
 
 static struct openhandle {
 	LPKEYSTRUCT	lpkey;
@@ -1454,7 +1469,7 @@ __w31_dumptree(	unsigned short idx,
 				idx=dir->sibling_idx;
 				continue;
 			}
-			name=STRING32_DupAnsiToUni(tail);
+			name=strdupA2W(tail);
 
 			xlpkey=_find_or_add_key(lpkey,name);
 
@@ -1464,7 +1479,7 @@ __w31_dumptree(	unsigned short idx,
 					val=(struct _w31_valent*)&tab[dir->value_idx];
 					memcpy(tail,&txt[val->string_off],val->length);
 					tail[val->length]='\0';
-					value=STRING32_DupAnsiToUni(tail);
+					value=strdupA2W(tail);
 					_find_or_add_value(xlpkey,NULL,REG_SZ,(LPBYTE)value,lstrlen32W(value)*2+2,lastmodified);
 				}
 			}
diff --git a/misc/shell.c b/misc/shell.c
index a824ab06c19..66a94ce3e87 100644
--- a/misc/shell.c
+++ b/misc/shell.c
@@ -1,6 +1,7 @@
 /*
  * 				Shell Library Functions
  */
+#include <assert.h>
 #include <stdlib.h>
 #include <stdio.h>
 #include <string.h>
@@ -17,8 +18,12 @@
 #include "win.h"
 #include "graphics.h"
 #include "cursoricon.h"
+#include "interfaces.h"
+#include "sysmetrics.h"
+#include "shlobj.h"
 #include "stddebug.h"
 #include "debug.h"
+#include "debugstr.h"
 #include "winreg.h"
 
 static const char * const SHELL_People[] =
@@ -29,6 +34,7 @@ static const char * const SHELL_People[] =
     "Peter Bajusz",
     "Georg Beyerle",
     "Ross Biro",
+    "Martin Boehme",
     "Uwe Bonnes",
     "Erik Bos",
     "Fons Botman",
@@ -36,12 +42,14 @@ static const char * const SHELL_People[] =
     "Andrew Bulhak",
     "John Burton",
     "Niels de Carpentier",
+    "Gordon Chaffee",
     "Jimen Ching",
     "David A. Cuthbert",
     "Huw D. M. Davies",
     "Roman Dolejsi",
     "Frans van Dorsselaer",
     "Chris Faherty",
+    "Carsten Fallesen",
     "Paul Falstad",
     "David Faure",
     "Claus Fischer",
@@ -89,6 +97,7 @@ static const char * const SHELL_People[] =
     "Andreas Mohr",
     "Philippe De Muyter",
     "Itai Nahshon",
+    "Kristian Nielsen",
     "Henrik Olsen",
     "Michael Patra",
     "Dimitrie O. Paun",
@@ -132,12 +141,14 @@ static const char * const SHELL_People[] =
     "Eric Warnke",
     "Manfred Weichel",
     "Morten Welinder",
+    "Len White",
     "Lawson Whitney",
     "Jan Willamowius",
     "Carl Williams",
     "Karl Guenter Wuensch",
     "Eric Youngdale",
     "James Youngman",
+    "Nikita V. Youshchenko",
     "Mikolaj Zalewski",
     "John Zero",
     NULL
@@ -746,48 +757,52 @@ BOOL32 WINAPI ShellAbout32W( HWND32 hWnd, LPCWSTR szApp, LPCWSTR szOtherStuff,
 
 /*************************************************************************
  *				SHELL_GetResourceTable
- *
- * FIXME: Implement GetPEResourceTable in w32sys.c and call it here.
  */
-static BYTE* SHELL_GetResourceTable(HFILE32 hFile)
+static DWORD SHELL_GetResourceTable(HFILE32 hFile,LPBYTE *retptr)
 {
-  BYTE*              pTypeInfo = NULL;
   IMAGE_DOS_HEADER	mz_header;
-  IMAGE_OS2_HEADER	ne_header;
-  int		     size;
+  char			magic[4];
+  int			size;
   
+  *retptr = NULL;
   _llseek32( hFile, 0, SEEK_SET );
-  if ((_lread32(hFile,&mz_header,sizeof(mz_header)) != sizeof(mz_header)) ||
-      (mz_header.e_magic != IMAGE_DOS_SIGNATURE)) return (BYTE*)-1;
+  if (	(_lread32(hFile,&mz_header,sizeof(mz_header)) != sizeof(mz_header)) ||
+  	(mz_header.e_magic != IMAGE_DOS_SIGNATURE)
+  )
+  	return 0;
 
   _llseek32( hFile, mz_header.e_lfanew, SEEK_SET );
-  if (_lread32( hFile, &ne_header, sizeof(ne_header) ) != sizeof(ne_header))
-      return NULL;
-
-  if (ne_header.ne_magic == IMAGE_NT_SIGNATURE) 
-     { fprintf(stdnimp,"Win32s FIXME: file %s line %i\n", __FILE__, __LINE__ );
-       return NULL; }
-
-  if (ne_header.ne_magic != IMAGE_OS2_SIGNATURE) return NULL;
-
-  size = ne_header.rname_tab_offset - ne_header.resource_tab_offset;
-
-  if( size > sizeof(NE_TYPEINFO) )
-  {
-      pTypeInfo = (BYTE*)HeapAlloc( GetProcessHeap(), 0, size);
-      if( pTypeInfo ) 
-      {
-          _llseek32(hFile, mz_header.e_lfanew+ne_header.resource_tab_offset, SEEK_SET);
-          if( _lread32( hFile, (char*)pTypeInfo, size) != size )
-          { 
-	      HeapFree( GetProcessHeap(), 0, pTypeInfo); 
-	      pTypeInfo = NULL;
-          }
-      }
-  }
-  /* no resources */
+  if (_lread32( hFile, magic, sizeof(magic) ) != sizeof(magic))
+	return 0;
+  _llseek32( hFile, mz_header.e_lfanew, SEEK_SET);
+
+  if (*(DWORD*)magic  == IMAGE_NT_SIGNATURE)
+	return IMAGE_NT_SIGNATURE;
+  if (*(WORD*)magic == IMAGE_OS2_SIGNATURE) {
+  	IMAGE_OS2_HEADER	ne_header;
+  	LPBYTE			pTypeInfo = NULL;
+
+  	if (_lread32(hFile,&ne_header,sizeof(ne_header))!=sizeof(ne_header))
+		return 0;
+
+	if (ne_header.ne_magic != IMAGE_OS2_SIGNATURE) return 0;
+	size = ne_header.rname_tab_offset - ne_header.resource_tab_offset;
+	if( size > sizeof(NE_TYPEINFO) )
+	{
+	    pTypeInfo = (BYTE*)HeapAlloc( GetProcessHeap(), 0, size);
+	    if( pTypeInfo ) {
+		_llseek32(hFile, mz_header.e_lfanew+ne_header.resource_tab_offset, SEEK_SET);
+		if( _lread32( hFile, (char*)pTypeInfo, size) != size ) { 
+		    HeapFree( GetProcessHeap(), 0, pTypeInfo); 
+		    pTypeInfo = NULL;
+		}
+	    }
+	}
+  	*retptr = pTypeInfo;
+  } else
+  	*retptr = (LPBYTE)-1;
+  return IMAGE_OS2_SIGNATURE; /* handles .ICO too */
 
-  return pTypeInfo;
 }
 
 /*************************************************************************
@@ -886,11 +901,13 @@ HGLOBAL16 WINAPI InternalExtractIcon(HINSTANCE16 hInstance,
 {
   HGLOBAL16 	hRet = 0;
   HGLOBAL16*	RetPtr = NULL;
-  BYTE*  	pData;
+  LPBYTE  	pData;
   OFSTRUCT 	ofs;
+  DWORD		sig;
   HFILE32 	hFile = OpenFile32( lpszExeFileName, &ofs, OF_READ );
+  UINT16	iconDirCount = 0,iconCount = 0;
   
-  dprintf_reg(stddeb, "InternalExtractIcon(%04x, file '%s', start from %d, extract %d\n", 
+  dprintf_reg(stddeb,"InternalExtractIcon(%04x,file %s,start %d,extract %d\n", 
 		       hInstance, lpszExeFileName, nIconIndex, n);
 
   if( hFile == HFILE_ERROR32 || !n ) return 0;
@@ -898,13 +915,13 @@ HGLOBAL16 WINAPI InternalExtractIcon(HINSTANCE16 hInstance,
   hRet = GlobalAlloc16( GMEM_FIXED | GMEM_ZEROINIT, sizeof(HICON16)*n);
   RetPtr = (HICON16*)GlobalLock16(hRet);
 
- *RetPtr = (n == 0xFFFF)? 0: 1;				/* error return values */
+  *RetPtr = (n == 0xFFFF)? 0: 1;	/* error return values */
 
-  if( (pData = SHELL_GetResourceTable(hFile)) )
+  sig = SHELL_GetResourceTable(hFile,&pData);
+
+  if(sig == IMAGE_OS2_SIGNATURE)
   {
     HICON16	 hIcon = 0;
-    UINT16       iconDirCount = 0;
-    UINT16       iconCount = 0;
     NE_TYPEINFO* pTInfo = (NE_TYPEINFO*)(pData + 2);
     NE_NAMEINFO* pIconStorage = NULL;
     NE_NAMEINFO* pIconDir = NULL;
@@ -980,41 +997,214 @@ HGLOBAL16 WINAPI InternalExtractIcon(HINSTANCE16 hInstance,
     if( lpiID ) HeapFree( GetProcessHeap(), 0, lpiID);
     else HeapFree( GetProcessHeap(), 0, pData);
   } 
- _lclose32( hFile );
- 
-  /* return array with icon handles */
+  if( sig == IMAGE_NT_SIGNATURE)
+  {
+  	LPBYTE			peimage,idata,igdata;
+	LPIMAGE_DOS_HEADER	dheader;
+	LPIMAGE_NT_HEADERS	pe_header;
+	LPIMAGE_SECTION_HEADER	pe_sections;
+	LPIMAGE_RESOURCE_DIRECTORY	rootresdir,iconresdir,icongroupresdir;
+	LPIMAGE_RESOURCE_DATA_ENTRY	idataent,igdataent;
+	HANDLE32		fmapping;
+	int			i,j;
+	LPIMAGE_RESOURCE_DIRECTORY_ENTRY	xresent;
+	CURSORICONDIR		**cids;
+	
+	fmapping = CreateFileMapping32A(hFile,NULL,PAGE_READONLY|SEC_COMMIT,0,0,NULL);
+	if (fmapping == 0) { /* FIXME, INVALID_HANDLE_VALUE? */
+		fprintf(stderr,"InternalExtractIcon:failed to create filemap.\n");
+		_lclose32( hFile);
+		return 0;
+	}
+	peimage = MapViewOfFile(fmapping,FILE_MAP_READ,0,0,0);
+	if (!peimage) {
+		fprintf(stderr,"InternalExtractIcon:failed to mmap filemap.\n");
+		CloseHandle(fmapping);
+		_lclose32( hFile);
+		return 0;
+	}
+	dheader = (LPIMAGE_DOS_HEADER)peimage;
+	/* it is a pe header, SHELL_GetResourceTable checked that */
+	pe_header = (LPIMAGE_NT_HEADERS)(peimage+dheader->e_lfanew);
+	/* probably makes problems with short PE headers... but I haven't seen 
+	 * one yet... 
+	 */
+	pe_sections = (LPIMAGE_SECTION_HEADER)(((char*)pe_header)+sizeof(*pe_header));
+	rootresdir = NULL;
+	for (i=0;i<pe_header->FileHeader.NumberOfSections;i++) {
+		if (pe_sections[i].Characteristics & IMAGE_SCN_CNT_UNINITIALIZED_DATA)
+			continue;
+		/* FIXME: doesn't work when the resources are not in a seperate section */
+		if (pe_sections[i].VirtualAddress == pe_header->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_RESOURCE].VirtualAddress) {
+			rootresdir = (LPIMAGE_RESOURCE_DIRECTORY)((char*)peimage+pe_sections[i].PointerToRawData);
+			break;
+		}
+	}
+
+	if (!rootresdir) {
+		fprintf(stderr,"InternalExtractIcon: haven't found section for resource directory.\n");
+		UnmapViewOfFile(peimage);
+		CloseHandle(fmapping);
+		_lclose32( hFile);
+		return 0;
+	}
+	icongroupresdir = GetResDirEntryW(rootresdir,(LPWSTR)RT_GROUP_ICON,(DWORD)rootresdir);
+	if (!icongroupresdir) {
+		fprintf(stderr,"InternalExtractIcon: No Icongroupresourcedirectory!\n");
+		UnmapViewOfFile(peimage);
+		CloseHandle(fmapping);
+		_lclose32( hFile);
+		return 0;
+	}
 
+	iconDirCount = icongroupresdir->NumberOfNamedEntries+icongroupresdir->NumberOfIdEntries;
+	if( nIconIndex == (UINT16)-1 ) {
+		RetPtr[0] = iconDirCount;
+		UnmapViewOfFile(peimage);
+		CloseHandle(fmapping);
+		_lclose32( hFile);
+		return hRet;
+	}
+
+	if (nIconIndex >= iconDirCount) {
+		fprintf(stderr,"nIconIndex %d is larger than iconDirCount %d\n",
+			nIconIndex,iconDirCount
+		);
+		UnmapViewOfFile(peimage);
+		CloseHandle(fmapping);
+		_lclose32( hFile);
+		GlobalFree16(hRet);
+		return 0;
+	}
+	cids = (CURSORICONDIR**)HeapAlloc(GetProcessHeap(),0,n*sizeof(CURSORICONDIR*));
+		
+	/* caller just wanted the number of entries */
+
+	xresent = (LPIMAGE_RESOURCE_DIRECTORY_ENTRY)(icongroupresdir+1);
+	/* assure we don't get too much ... */
+	if( n > iconDirCount - nIconIndex ) n = iconDirCount - nIconIndex;
+
+	/* starting from specified index ... */
+	xresent = xresent+nIconIndex;
+
+	for (i=0;i<n;i++,xresent++) {
+		CURSORICONDIR	*cid;
+		LPIMAGE_RESOURCE_DIRECTORY	resdir;
+
+		/* go down this resource entry, name */
+		resdir = (LPIMAGE_RESOURCE_DIRECTORY)((DWORD)rootresdir+(xresent->u2.s.OffsetToDirectory));
+		/* default language (0) */
+		resdir = GetResDirEntryW(resdir,(LPWSTR)0,(DWORD)rootresdir);
+		igdataent = (LPIMAGE_RESOURCE_DATA_ENTRY)resdir;
+
+		/* lookup address in mapped image for virtual address */
+		igdata = NULL;
+		for (j=0;j<pe_header->FileHeader.NumberOfSections;j++) {
+			if (igdataent->OffsetToData < pe_sections[j].VirtualAddress)
+				continue;
+			if (igdataent->OffsetToData+igdataent->Size > pe_sections[j].VirtualAddress+pe_sections[j].SizeOfRawData)
+				continue;
+			igdata = peimage+(igdataent->OffsetToData-pe_sections[j].VirtualAddress+pe_sections[j].PointerToRawData);
+		}
+		if (!igdata) {
+			fprintf(stderr,"InternalExtractIcon: no matching real address found for icongroup!\n");
+			UnmapViewOfFile(peimage);
+			CloseHandle(fmapping);
+			_lclose32( hFile);
+			return 0;
+		}
+		/* found */
+		cid = (CURSORICONDIR*)igdata;
+		cids[i] = cid;
+		fprintf(stderr,"cursoricondir %d: idType %d, idCount %d\n",
+			i,cid->idType,cid->idCount
+		);
+		RetPtr[i] = LookupIconIdFromDirectoryEx32(igdata,TRUE,SYSMETRICS_CXICON,SYSMETRICS_CYICON,0);
+		fprintf(stderr,"-> best match is %08x\n",RetPtr[i]);
+	}
+	iconresdir=GetResDirEntryW(rootresdir,(LPWSTR)RT_ICON,(DWORD)rootresdir);
+	if (!iconresdir) {
+	    fprintf(stderr,"InternalExtractIcon: No Iconresourcedirectory!\n");
+	    UnmapViewOfFile(peimage);
+	    CloseHandle(fmapping);
+	    _lclose32( hFile);
+	    return 0;
+	}
+	for (i=0;i<n;i++) {
+	    LPIMAGE_RESOURCE_DIRECTORY	xresdir;
+
+	    xresdir = GetResDirEntryW(iconresdir,(LPWSTR)RetPtr[i],(DWORD)rootresdir);
+	    xresdir = GetResDirEntryW(xresdir,(LPWSTR)0,(DWORD)rootresdir);
+
+	    idataent = (LPIMAGE_RESOURCE_DATA_ENTRY)xresdir;
+
+	    idata = NULL;
+	    /* map virtual to address in image */
+	    for (j=0;j<pe_header->FileHeader.NumberOfSections;j++) {
+		if (idataent->OffsetToData < pe_sections[j].VirtualAddress)
+		    continue;
+		if (idataent->OffsetToData+idataent->Size > pe_sections[j].VirtualAddress+pe_sections[j].SizeOfRawData)
+		    continue;
+		idata = peimage+(idataent->OffsetToData-pe_sections[j].VirtualAddress+pe_sections[j].PointerToRawData);
+	    }
+	    if (!idata) {
+		fprintf(stderr,"InternalExtractIcon: no matching real address found for icondata!\n");
+		RetPtr[i]=0;
+		continue;
+	    }
+	    RetPtr[i] = CreateIconFromResourceEx32(idata,idataent->Size,TRUE,0x00030000,SYSMETRICS_CXICON,SYSMETRICS_CYICON,0);
+	}
+	UnmapViewOfFile(peimage);
+	CloseHandle(fmapping);
+	_lclose32( hFile);
+	return hRet;
+  }
+  _lclose32( hFile );
+  /* return array with icon handles */
   return hRet;
+
 }
 
 /*************************************************************************
  *             ExtractIcon16   (SHELL.34)
  */
 HICON16 WINAPI ExtractIcon16( HINSTANCE16 hInstance, LPCSTR lpszExeFileName,
-                              UINT16 nIconIndex )
+	UINT16 nIconIndex )
+{
+    return ExtractIcon32A( hInstance, lpszExeFileName, nIconIndex );
+}
+
+
+/*************************************************************************
+ *             ExtractIcon32A   (SHELL32.133)
+ */
+HICON32 WINAPI ExtractIcon32A( HINSTANCE32 hInstance, LPCSTR lpszExeFileName,
+	UINT32 nIconIndex )
 {
-  HGLOBAL16 handle = InternalExtractIcon(hInstance,lpszExeFileName,nIconIndex, 1);
+    HGLOBAL16 handle = InternalExtractIcon(hInstance,lpszExeFileName,nIconIndex, 1);
 
-  if( handle )
+    if( handle )
     {
-      HICON16* ptr = (HICON16*)GlobalLock16(handle);
-      HICON16  hIcon = *ptr;
+	HICON16* ptr = (HICON16*)GlobalLock16(handle);
+	HICON16  hIcon = *ptr;
 
-      GlobalFree16(handle);
-      return hIcon;
+	GlobalFree16(handle);
+	return hIcon;
     }
-  return 0;
+    return 0;
 }
 
-
 /*************************************************************************
- *             ExtractIcon32A   (SHELL32.133)
+ *             ExtractIcon32W   (SHELL32.180)
  */
-HICON32 WINAPI ExtractIcon32A( HINSTANCE32 hInstance, LPCSTR lpszExeFileName,
-                               UINT32 nIconIndex )
+HICON32 WINAPI ExtractIcon32W( HINSTANCE32 hInstance, LPCWSTR lpszExeFileName,
+	UINT32 nIconIndex )
 {
-    /* FIXME */
-    return ExtractIcon16( hInstance, lpszExeFileName, nIconIndex );
+	LPSTR	exefn = HEAP_strdupWtoA(GetProcessHeap(),0,lpszExeFileName);
+	HICON32	ret = ExtractIcon32A(hInstance,exefn,nIconIndex);
+
+	HeapFree(GetProcessHeap(),0,exefn);
+	return ret;
 }
 
 
@@ -1024,37 +1214,37 @@ HICON32 WINAPI ExtractIcon32A( HINSTANCE32 hInstance, LPCSTR lpszExeFileName,
  * Return icon for given file (either from file itself or from associated
  * executable) and patch parameters if needed.
  */
-HICON16 WINAPI ExtractAssociatedIcon(HINSTANCE16 hInst,LPSTR lpIconPath,
-                                     LPWORD lpiIcon)
+HICON16 WINAPI ExtractAssociatedIcon16(HINSTANCE16 hInst,LPSTR lpIconPath,
+	LPWORD lpiIcon)
 {
     HICON16 hIcon = ExtractIcon16(hInst, lpIconPath, *lpiIcon);
 
     if( hIcon < 2 )
-      {
+    {
 
 	if( hIcon == 1 ) /* no icons found in given file */
-	  {
+	{
 	    char  tempPath[0x80];
 	    UINT16  uRet = FindExecutable16(lpIconPath,NULL,tempPath);
 
 	    if( uRet > 32 && tempPath[0] )
-	      {
+	    {
 		strcpy(lpIconPath,tempPath);
-	        hIcon = ExtractIcon16(hInst, lpIconPath, *lpiIcon);
+		hIcon = ExtractIcon16(hInst, lpIconPath, *lpiIcon);
 
 		if( hIcon > 2 ) return hIcon;
-	      }
+	    }
 	    else hIcon = 0;
-	  }
-	
+	}
+
 	if( hIcon == 1 ) 
-	  *lpiIcon = 2;   /* MSDOS icon - we found .exe but no icons in it */
+	    *lpiIcon = 2;   /* MSDOS icon - we found .exe but no icons in it */
 	else
-	  *lpiIcon = 6;   /* generic icon - found nothing */
+	    *lpiIcon = 6;   /* generic icon - found nothing */
 
-        GetModuleFileName16(hInst, lpIconPath, 0x80);
+	GetModuleFileName16(hInst, lpIconPath, 0x80);
 	hIcon = LoadIcon16( hInst, MAKEINTRESOURCE(*lpiIcon));
-      }
+    }
 
     return hIcon;
 }
@@ -1066,30 +1256,30 @@ HICON16 WINAPI ExtractAssociatedIcon(HINSTANCE16 hInst,LPSTR lpIconPath,
  */
 LPSTR SHELL_FindString(LPSTR lpEnv, LPCSTR entry)
 {
-  UINT16 	l = strlen(entry); 
-  for( ; *lpEnv ; lpEnv+=strlen(lpEnv)+1 )
-     {
-       if( lstrncmpi32A(lpEnv, entry, l) ) continue;
-       
-       if( !*(lpEnv+l) )
-         return (lpEnv + l); 		/* empty entry */
-       else if ( *(lpEnv+l)== '=' )
-	 return (lpEnv + l + 1);
-     }
-  return NULL;
+    UINT16 	l = strlen(entry); 
+    for( ; *lpEnv ; lpEnv+=strlen(lpEnv)+1 )
+    {
+	if( lstrncmpi32A(lpEnv, entry, l) ) continue;
+
+	if( !*(lpEnv+l) )
+	    return (lpEnv + l); 		/* empty entry */
+	else if ( *(lpEnv+l)== '=' )
+	    return (lpEnv + l + 1);
+    }
+    return NULL;
 }
 
 SEGPTR WINAPI FindEnvironmentString(LPSTR str)
 {
- SEGPTR  spEnv = GetDOSEnvironment();
- LPSTR  lpEnv = (LPSTR)PTR_SEG_TO_LIN(spEnv);
- 
- LPSTR  lpString = (spEnv)?SHELL_FindString(lpEnv, str):NULL; 
+    SEGPTR  spEnv = GetDOSEnvironment();
+    LPSTR  lpEnv = (LPSTR)PTR_SEG_TO_LIN(spEnv);
 
- if( lpString )		/*  offset should be small enough */
-     return spEnv + (lpString - lpEnv);
+    LPSTR  lpString = (spEnv)?SHELL_FindString(lpEnv, str):NULL; 
 
- return (SEGPTR)NULL;
+    if( lpString )		/*  offset should be small enough */
+	return spEnv + (lpString - lpEnv);
+
+    return (SEGPTR)NULL;
 }
 
 /*************************************************************************
@@ -1249,6 +1439,30 @@ DWORD WINAPI SHGetFileInfo32A(LPCSTR path,DWORD dwFileAttributes,
 	return TRUE;
 }
 
+/*************************************************************************
+ *				SHAppBarMessage32	[SHELL32.207]
+ */
+UINT32 WINAPI SHAppBarMessage32(DWORD msg, PAPPBARDATA data)
+{
+    fprintf(stdnimp,"SHAppBarMessage32(0x%08lx,%p)\n", msg, data);
+#if 0
+    switch (msg) {
+        case ABM_ACTIVATE:
+        case ABM_GETAUTOHIDEBAR:
+        case ABM_GETSTATE:
+        case ABM_GETTASKBARPOS:
+        case ABM_NEW:
+        case ABM_QUERYPOS:
+        case ABM_REMOVE:
+        case ABM_SETAUTOHIDEBAR:
+        case ABM_SETPOS:
+        case ABM_WINDOWPOSCHANGED:
+	    ;
+    }
+#endif
+    return 0;
+}
+
 /*************************************************************************
  *				CommandLineToArgvW	[SHELL32.7]
  */
@@ -1329,9 +1543,7 @@ void WINAPI FreeIconList( DWORD dw )
  */
 
 /* This is the wrong place, but where is the right one?  */
-typedef UINT32 REFCLSID32;
-typedef UINT32 REFIID32;
-typedef UINT32 HRESULT32;
+#if 0
 #define E_OUTOFMEMORY 0x8007000EL
 
 HRESULT32 WINAPI SHELL32_DllGetClassObject (REFCLSID32 clsid,
@@ -1346,3 +1558,9 @@ HRESULT32 WINAPI SHELL32_DllGetClassObject (REFCLSID32 clsid,
 
   return hres;
 }
+#endif
+
+DWORD WINAPI SHGetDesktopFolder(LPSHELLFOLDER *shellfolder) {
+	*shellfolder = NULL;
+	return 0;
+}
diff --git a/misc/shellord.c b/misc/shellord.c
new file mode 100644
index 00000000000..f3a1191bd07
--- /dev/null
+++ b/misc/shellord.c
@@ -0,0 +1,525 @@
+/*
+ * 				Shell Ordinal Functions
+ *
+ * These are completely undocumented. The meaning of the functions changes
+ * between different OS versions (NT uses Unicode strings, 95 uses ASCII
+ * strings, etc. etc.)
+ * 
+ * They are just here so that explorer.exe and iexplore.exe can be tested.
+ *
+ * Copyright 1997 Marcus Meissner
+ */
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <unistd.h>
+#include <ctype.h>
+#include "windows.h"
+#include "file.h"
+#include "shell.h"
+#include "heap.h"
+#include "module.h"
+#include "neexe.h"
+#include "resource.h"
+#include "dlgs.h"
+#include "win.h"
+#include "graphics.h"
+#include "cursoricon.h"
+#include "interfaces.h"
+#include "shlobj.h"
+#include "stddebug.h"
+#include "debug.h"
+#include "winreg.h"
+
+/*************************************************************************
+ *				SHELL32_32	[SHELL32.32]
+ * append \ if there is none
+ */
+LPSTR WINAPI SHELL32_32(LPSTR path) {
+    int len;
+
+    len = lstrlen32A(path);
+    if (len && path[len-1]!='\\') {
+    	path[len+0]='\\';
+	path[len+1]='\0';
+	return path+len+1;
+    } else
+    	return path+len;
+}
+
+/*************************************************************************
+ *				SHELL32_34	[SHELL32.34]
+ * basename(char *fn);
+ */
+LPSTR WINAPI SHELL32_34(LPSTR fn) {
+    LPSTR basefn;
+
+    basefn = fn;
+    while (fn[0]) {
+    	if (((fn[0]=='\\') || (fn[0]==':')) && fn[1] && fn[1]!='\\')
+	    basefn = fn+1;
+	fn++;
+    }
+    return basefn;
+}
+
+/*************************************************************************
+ *	 		 SHELL32_35   			[SHELL32.35]
+ * bool getpath(char *pathname); truncates passed argument to a valid path
+ * returns if the string was modified or not.
+ * "\foo\xx\foo"-> "\foo\xx"
+ * "\"		-> "\"
+ * "a:\foo"	-> "a:\"
+ */
+DWORD WINAPI SHELL32_35(LPSTR fn) {
+	LPSTR	x,cutplace;
+
+	if (!fn[0])
+		return 0;
+	x=fn;
+	cutplace = fn;
+	while (*x) {
+		if (*x=='\\') {
+			cutplace=x++;
+			continue;
+		}
+		if (*x==':') {
+			x++;
+			if (*x=='\\')
+				cutplace=++x;
+			continue; /* already x++ed */
+		}
+		x++;
+	}
+	if (!*cutplace)
+		return 0;
+	if (cutplace==fn) {
+		if (fn[0]=='\\') {
+			if (!fn[1])
+				return 0;
+			fn[0]='\0';
+			return 1;
+		}
+	}
+	*cutplace='\0';
+	return 1;
+}
+
+/*************************************************************************
+ *				SHELL32_37	[SHELL32.37]
+ * concat_paths(char*target,const char*add);
+ * concats "target\\add" and writes them to target
+ */
+LPSTR WINAPI SHELL32_37(LPSTR target,LPSTR x1,LPSTR x2) {
+	char	buf[260];
+
+	if (!x2 || !x2[0]) {
+		lstrcpy32A(target,x1);
+		return target;
+	}
+	lstrcpy32A(buf,x1);
+	SHELL32_32(buf); /* append \ if not there */
+	lstrcat32A(buf,x2);
+	lstrcpy32A(target,buf);
+	return target;
+}
+
+/*************************************************************************
+ *				SHELL32_36	[SHELL32.36]
+ * concat_paths(char*target,const char*add);
+ * concats "target\\add" and writes them to target
+ */
+LPSTR WINAPI SHELL32_36(LPSTR x1,LPSTR x2) {
+	while (x2[0]=='\\') x2++;
+	return SHELL32_37(x1,x1,x2);
+}
+
+/*************************************************************************
+ *				SHELL32_52	[SHELL32.52]
+ * look for next arg in string. handle "quoted" strings
+ * returns pointer to argument *AFTER* the space. Or to the \0.
+ */
+LPSTR WINAPI SHELL32_52(LPSTR cmdline) {
+    BOOL32	qflag = FALSE;
+
+    while (*cmdline) {
+    	if ((*cmdline==' ') && !qflag)
+		return cmdline+1;
+	if (*cmdline=='"')
+		qflag=!qflag;
+	cmdline++;
+    }
+    return cmdline;
+}
+
+/*************************************************************************
+ *				SHELL32_45	[SHELL32.45]
+ * file_exists(char *fn);
+ */
+BOOL32 WINAPI SHELL32_45(LPSTR fn) {
+    if (GetFileAttributes32A(fn)==-1)
+    	return FALSE;
+    else
+    	return TRUE;
+}
+
+/*************************************************************************
+ *				SHELL32_175	[SHELL32.175]
+ * unknown
+ */
+void WINAPI SHELL32_175(DWORD x1,DWORD x2,DWORD x3,DWORD x4) {
+    fprintf(stdnimp,"SHELL32_175(0x%08lx,0x%08lx,0x%08lx,0x%08lx),stub\n",
+    	x1,x2,x3,x4
+    );
+}
+
+/*************************************************************************
+ *				SHELL32_181	[SHELL32.181]
+ * unknown
+ */
+void WINAPI SHELL32_181(DWORD x,DWORD y) {
+    fprintf(stderr,"SHELL32_181(0x%08lx,0x%08lx)\n",x,y);
+}
+
+/*************************************************************************
+ *				SHELL32_119	[SHELL32.119]
+ * unknown
+ */
+void WINAPI SHELL32_119(LPVOID x) {
+    fprintf(stderr,"SHELL32_119(%p),stub\n",x);
+}
+
+/*************************************************************************
+ *				SHELL32_75	[SHELL32.75]
+ * unknown
+ */
+BOOL32 WINAPI SHELL32_75(LPDWORD x,LPDWORD y) {
+    fprintf(stderr,"SHELL32_75(%p,%p),stub\n",x,y);
+    return TRUE;
+}
+
+DWORD WINAPI
+SHELL32_DllGetClassObject(REFCLSID *clsid,REFIID *iid,LPVOID *x) {
+	char	xclsid[50],xiid[50];
+
+	StringFromCLSID((LPCLSID)clsid,xclsid);
+	StringFromCLSID((LPCLSID)iid,xiid);
+	fprintf(stderr,"SHELL32_DllGetClassObject(%s,%s,%p), STUB\n",xclsid,xiid,x);
+	return 0;
+}
+
+static FARPROC32 _find_moduleproc(LPSTR dllname,HMODULE32 *xhmod,LPSTR name) {
+	HMODULE32	hmod;
+	FARPROC32	dllunload,nameproc;
+
+	if (xhmod) *xhmod = 0;
+	if (!lstrcmpi32A(SHELL32_34(dllname),"shell32.dll"))
+		return (FARPROC32)SHELL32_DllGetClassObject;
+
+	hmod = LoadLibraryEx32A(dllname,0,LOAD_WITH_ALTERED_SEARCH_PATH);
+	if (!hmod)
+		return NULL;
+	dllunload = GetProcAddress32(hmod,"DllCanUnloadNow");
+	if (!dllunload)
+		if (xhmod) *xhmod = hmod;
+	nameproc = GetProcAddress32(hmod,name);
+	if (!nameproc) {
+		FreeLibrary32(hmod);
+		return NULL;
+	}
+	/* register unloadable dll with unloadproc ... */
+	return nameproc;
+}
+
+static DWORD _get_instance(REFCLSID clsid,LPSTR dllname,
+	LPVOID	unknownouter,REFIID refiid,LPVOID inst
+) {
+	DWORD	WINAPI	(*dllgetclassob)(REFCLSID,REFIID,LPVOID);
+	DWORD		hres;
+	LPCLASSFACTORY	classfac;
+
+	dllgetclassob = (DWORD(*)(REFCLSID,REFIID,LPVOID))_find_moduleproc(dllname,NULL,"DllGetClassObject");
+	if (!dllgetclassob)
+		return 0x80070000|GetLastError();
+
+	hres = (*dllgetclassob)(clsid,(REFIID)&IID_IClassFactory,&classfac);
+	if (hres<0)
+		return hres;
+
+	classfac->lpvtbl->fnCreateInstance(classfac,unknownouter,refiid,inst);
+	classfac->lpvtbl->fnRelease(classfac);
+	return 0;
+}
+/*************************************************************************
+ *				SHELL32_102	[SHELL32.102]
+ * unknown
+ */
+LRESULT WINAPI SHELL32_102(
+	LPSTR aclsid,CLSID *clsid,LPUNKNOWN unknownouter,REFIID refiid,LPVOID inst
+) {
+	char	buffer[256],xclsid[48],xiid[48],path[260],tmodel[100];
+	HKEY	inprockey;
+	DWORD	pathlen,type,tmodellen;
+	DWORD	hres;
+	
+	StringFromCLSID(refiid,xiid);
+
+	if (clsid)
+		StringFromCLSID(clsid,xclsid);
+	else {
+		if (!aclsid)
+		    return 0x80040154;
+		strcpy(xclsid,aclsid);
+	}
+	fprintf(stderr,"SHELL32_102(%p,%s,%p,%s,%p)\n",
+		aclsid,xclsid,unknownouter,xiid,inst
+	);
+
+	sprintf(buffer,"CLSID\\%s\\InProcServer32",xclsid);
+	if (RegOpenKeyEx32A(HKEY_CLASSES_ROOT,buffer,0,0x02000000,&inprockey))
+		return _get_instance(clsid,"shell32.dll",unknownouter,refiid,inst);
+	pathlen=sizeof(path);
+	if (RegQueryValue32A(inprockey,NULL,path,&pathlen)) {
+		RegCloseKey(inprockey);
+		return _get_instance(clsid,"shell32.dll",unknownouter,refiid,inst);
+	}
+	fprintf(stderr,"	-> server dll is %s\n",path);
+	tmodellen=sizeof(tmodel);
+	type=REG_SZ;
+	if (RegQueryValueEx32A(inprockey,"ThreadingModel",NULL,&type,tmodel,&tmodellen)) {
+		RegCloseKey(inprockey);
+		return _get_instance(clsid,"shell32.dll",unknownouter,refiid,inst);
+	}
+	fprintf(stderr,"	-> threading model is %s\n",tmodel);
+	hres=_get_instance(clsid,path,unknownouter,refiid,inst);
+	if (hres<0)
+		hres=_get_instance(clsid,"shell32.dll",unknownouter,refiid,inst);
+	RegCloseKey(inprockey);
+	return hres;
+}
+
+
+/*************************************************************************
+ *			 SHELL32_183   			[SHELL32.183]
+ * Format and output errormessage.
+ */
+void __cdecl SHELL32_183(HMODULE32 hmod,HWND32 hwnd,DWORD id,DWORD x,DWORD type,LPVOID arglist) {
+	char	buf[100],buf2[100],*buf3;
+	LPVOID	args = &arglist;
+
+	if (!LoadString32A(hmod,x,buf,100))
+		strcpy(buf,"Desktop");
+	LoadString32A(hmod,id,buf2,100);
+	/* FIXME: the varargs handling doesn't. */
+	FormatMessage32A(0x500,buf2,0,0,&buf3,256,&args);
+
+	fprintf(stderr,"SHELL32_183(%08lx,%08lx,%08lx(%s),%08lx(%s),%08lx,%p),stub!\n",
+		(DWORD)hmod,(DWORD)hwnd,id,buf2,x,buf,type,arglist
+	);
+	MessageBox32A(hwnd,buf3,buf,id|0x10000);
+}
+
+
+/*************************************************************************
+ *			 SHELL32_71   			[SHELL32.71]
+ * returns internal shell values in the passed pointers
+ */
+BOOL32 WINAPI SHELL32_71(LPDWORD x,LPDWORD y) {
+
+	fprintf(stderr,"SHELL32_71(%p,%p),stub!\n",x,y);
+	return TRUE;
+}
+
+/*************************************************************************
+ *			 SHELL32_72   			[SHELL32.72]
+ * dunno. something with icons
+ */
+void WINAPI SHELL32_72(LPSTR x,DWORD y,DWORD z) {
+	fprintf(stderr,"SHELL32_72(%s,%08lx,%08lx),stub!\n",x,y,z);
+}
+
+/*************************************************************************
+ *			 SHELL32_100   			[SHELL32.100]
+ * walks through policy table, queries <app> key, <type> value, returns 
+ * queried (DWORD) value.
+ * {0x00001,Explorer,NoRun}
+ * {0x00002,Explorer,NoClose}
+ * {0x00004,Explorer,NoSaveSettings}
+ * {0x00008,Explorer,NoFileMenu}
+ * {0x00010,Explorer,NoSetFolders}
+ * {0x00020,Explorer,NoSetTaskbar}
+ * {0x00040,Explorer,NoDesktop}
+ * {0x00080,Explorer,NoFind}
+ * {0x00100,Explorer,NoDrives}
+ * {0x00200,Explorer,NoDriveAutoRun}
+ * {0x00400,Explorer,NoDriveTypeAutoRun}
+ * {0x00800,Explorer,NoNetHood}
+ * {0x01000,Explorer,NoStartBanner}
+ * {0x02000,Explorer,RestrictRun}
+ * {0x04000,Explorer,NoPrinterTabs}
+ * {0x08000,Explorer,NoDeletePrinter}
+ * {0x10000,Explorer,NoAddPrinter}
+ * {0x20000,Explorer,NoStartMenuSubFolders}
+ * {0x40000,Explorer,MyDocsOnNet}
+ * {0x80000,WinOldApp,NoRealMode}
+ */
+DWORD WINAPI SHELL32_100(DWORD pol) {
+	HKEY	xhkey;
+
+	fprintf(stderr,"SHELL32_100(%08lx),stub!\n",pol);
+	if (RegOpenKey32A(HKEY_CURRENT_USER,"Software\\Microsoft\\Windows\\CurrentVersion\\Policies",&xhkey))
+		return 0;
+	/* FIXME: do nothing for now, just return 0 (== "allowed") */
+	RegCloseKey(xhkey);
+	return 0;
+	
+}
+
+DWORD WINAPI SHELL32_77(DWORD x,DWORD y,DWORD z) {
+	fprintf(stderr,"SHELL32_77(%08lx,%08lx,%08lx),stub!\n",x,y,z);
+	return 0;
+}
+
+/*************************************************************************
+ *	 		 SHELL32_79   			[SHELL32.79]
+ * create_directory_and_notify(...)
+ */
+DWORD WINAPI SHELL32_79(LPCSTR dir,LPVOID xvoid) {
+	fprintf(stderr,"mkdir %s,%p\n",dir,xvoid);
+	if (!CreateDirectory32A(dir,xvoid))
+		return FALSE;
+	/* SHChangeNotify(8,1,dir,0); */
+	return TRUE;
+}
+
+/*************************************************************************
+ *	 		 SHELL32_165   			[SHELL32.165]
+ * create_path_and_notify(...)
+ */
+DWORD WINAPI SHELL32_165(DWORD x,LPCSTR path) {
+	if (SHELL32_79(path,(LPVOID)x))
+		return 0;
+	fprintf(stderr,"SHELL32_165(%08lx,%s),stub!\n",x,path);
+	return 0;
+}
+
+/*************************************************************************
+ *	 		 SHELL32_29   			[SHELL32.29]
+ * is_rootdir(const char*path)
+ */
+BOOL32 WINAPI SHELL32_29(LPCSTR x) {
+	if (!lstrcmp32A(x+1,":\\"))		/* "X:\" */
+		return 1;
+	if (!lstrcmp32A(x,"\\"))		/* "\" */
+		return 1;
+	if (x[0]=='\\' && x[1]=='\\') {		/* UNC "\\<xx>\" */
+		int	foundbackslash = 0;
+		x=x+2;
+		while (*x) {
+			if (*x++=='\\')
+				foundbackslash++;
+		}
+		if (foundbackslash<=1)	/* max 1 \ more ... */
+			return 1;
+	}
+	return 0;
+}
+
+/*************************************************************************
+ *	 		 SHELL32_152   			[SHELL32.152]
+ * itemlist_length
+ */
+DWORD WINAPI SHELL32_152(LPITEMIDLIST iil) {
+	LPSHITEMID	si;
+	DWORD		len;
+
+	si = &(iil->mkid);
+	len = 2;
+	while (si->cb) {
+		len	+= si->cb;
+		si	 = (LPSHITEMID)(((char*)si)+si->cb);
+	}
+	return len;
+}
+
+/*************************************************************************
+ *	 		 SHELL32_196   			[SHELL32.196]
+ * void *task_alloc(DWORD len), uses SHMalloc allocator
+ */
+LPVOID WINAPI SHELL32_196(DWORD len) {
+	return (LPVOID)LocalAlloc32(len,LMEM_ZEROINIT); /* FIXME */
+}
+
+/*************************************************************************
+ *	 		 SHELL32_18   			[SHELL32.18]
+ * copy_itemidlist()
+ */
+LPITEMIDLIST WINAPI SHELL32_18(LPITEMIDLIST iil) {
+	DWORD		len;
+	LPITEMIDLIST	newiil;
+
+	len = SHELL32_152(iil);
+	newiil = (LPITEMIDLIST)SHELL32_196(len);
+	memcpy(newiil,iil,len);
+	return newiil;
+}
+
+/*************************************************************************
+ *	 		 SHELL32_25   			[SHELL32.25]
+ * merge_itemidlist()
+ */
+LPITEMIDLIST WINAPI SHELL32_25(LPITEMIDLIST iil1,LPITEMIDLIST iil2) {
+	DWORD		len1,len2;
+	LPITEMIDLIST	newiil;
+
+	len1 	= SHELL32_152(iil1)-2;
+	len2	= SHELL32_152(iil2);
+	newiil	= SHELL32_196(len1+len2);
+	memcpy(newiil,iil1,len1);
+	memcpy(((char*)newiil)+len1,iil2,len2);
+	return newiil;
+}
+
+/*************************************************************************
+ *	 		 SHELL32_16   			[SHELL32.16]
+ * find_lastitem_in_itemidlist()
+ */
+LPSHITEMID WINAPI SHELL32_16(LPITEMIDLIST iil) {
+	LPSHITEMID	lastsii,sii;
+
+	if (!iil)
+		return NULL;
+	sii = &(iil->mkid);
+	lastsii = sii;
+	while (sii->cb) {
+		lastsii = sii;
+		sii = (LPSHITEMID)(((char*)sii)+sii->cb);
+	}
+	return lastsii;
+}
+
+/*************************************************************************
+ *	 		 SHELL32_195   			[SHELL32.195]
+ * free_ptr() - frees memory using IMalloc
+ */
+DWORD WINAPI SHELL32_195(LPVOID x) {
+	return LocalFree32((HANDLE32)x);
+}
+
+/*************************************************************************
+ *	 		 SHELL32_155   			[SHELL32.155]
+ * free_check_ptr - frees memory (if not NULL) allocated by SHMalloc allocator
+ */
+DWORD WINAPI SHELL32_155(LPVOID x) {
+	if (!x)
+		return 0;
+	return SHELL32_195(x);
+}
+
+/*************************************************************************
+ *	 		 SHELL32_62   			[SHELL32.62]
+ */
+DWORD WINAPI SHELL32_62(DWORD x,DWORD y,DWORD z,DWORD a) {
+	fprintf(stderr,"SHELL32_62(%08lx,%08lx,%08lx,%08lx),stub!\n",x,y,z,a);
+	return 0xffffffff;
+}
diff --git a/misc/version.c b/misc/version.c
index 5e0d7bb2b86..dafa443c273 100644
--- a/misc/version.c
+++ b/misc/version.c
@@ -117,8 +117,14 @@ static VERSION VERSION_GetVersion(void)
     if (!pCurrentProcess) /* at startuptime probably */
         return defaultVersion;
     if (!pCurrentProcess->exe_modref)
+    {
+        /* HACK: if we have loaded a PE image into this address space,
+         * we are probably using thunks, so Win95 is our best bet
+         */
+        if (pCurrentProcess->modref_list) return WIN95;
         return WIN31; /* FIXME: hmm, look at DDB.version ? */
-    peheader = pCurrentProcess->exe_modref->pe_module->pe_header;
+    }
+    peheader = PE_HEADER(pCurrentProcess->exe_modref->module);
     if (peheader->OptionalHeader.MajorSubsystemVersion == 4)
         /* FIXME: NT4 has the same majorversion; add a check here for it. */
         return WIN95;
diff --git a/misc/w32scomb.c b/misc/w32scomb.c
new file mode 100644
index 00000000000..54d1d5c04da
--- /dev/null
+++ b/misc/w32scomb.c
@@ -0,0 +1,22 @@
+/*
+ * W32SCOMB
+ * DLL for Win32s
+ *
+ * Copyright (c) 1997 Andreas Mohr
+ */
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include "windows.h"
+#include "module.h"
+
+/***********************************************************************
+ *           Get16DLLAddress       (KERNEL32)
+ *
+ * rough guesswork, but seems to work
+ */
+FARPROC16 Get16DLLAddress(HMODULE32 handle, LPSTR name) {
+        if (!handle) handle=GetModuleHandle16("WIN32S16");
+        return (FARPROC16)WIN32_GetProcAddress16(handle, name);
+}
diff --git a/misc/w32skrnl.c b/misc/w32skrnl.c
new file mode 100644
index 00000000000..af8dae58f73
--- /dev/null
+++ b/misc/w32skrnl.c
@@ -0,0 +1,30 @@
+/*
+ * W32SKRNL
+ * DLL for Win32s
+ *
+ * Copyright (c) 1997 Andreas Mohr
+ */
+
+#include "windows.h"
+#include <string.h>
+#include <stdlib.h>
+#include <stdio.h>
+
+LPSTR WINAPI GetWin32sDirectory()
+{
+    static char *sysdir;
+    LPSTR text;
+
+    sysdir = getenv("winsysdir");
+    if (!sysdir) return NULL;
+    strcat(sysdir, "\\WIN32S");
+    text = HeapAlloc(GetProcessHeap(), 0, strlen(sysdir)+1);
+    strcpy(text, sysdir);
+    return text; 
+}
+
+/* FIXME */
+SEGPTR WINAPI _GetThunkBuff()
+{
+	return (SEGPTR)NULL;
+}
diff --git a/misc/wsprintf.c b/misc/wsprintf.c
index da2d15fc73b..7d57209d83a 100644
--- a/misc/wsprintf.c
+++ b/misc/wsprintf.c
@@ -149,6 +149,7 @@ static INT32 WPRINTF_ParseFormatW( LPCWSTR format, WPRINTF_FORMAT *res )
     }
     if (*p == 'l') { res->flags |= WPRINTF_LONG; p++; }
     else if (*p == 'h') { res->flags |= WPRINTF_SHORT; p++; }
+    else if (*p == 'w') { res->flags |= WPRINTF_WIDE; p++; }
     switch((CHAR)*p)
     {
     case 'c':
@@ -162,10 +163,10 @@ static INT32 WPRINTF_ParseFormatW( LPCWSTR format, WPRINTF_FORMAT *res )
         res->type = WPR_SIGNED;
         break;
     case 's':
-        res->type = (res->flags & WPRINTF_SHORT) ? WPR_STRING : WPR_WSTRING;
+        res->type = ((res->flags & WPRINTF_SHORT) && !(res->flags & WPRINTF_WIDE)) ? WPR_STRING : WPR_WSTRING;
         break;
     case 'S':
-        res->type = (res->flags & WPRINTF_LONG) ? WPR_WSTRING : WPR_STRING;
+        res->type = (res->flags & (WPRINTF_LONG|WPRINTF_WIDE)) ? WPR_WSTRING : WPR_STRING;
         break;
     case 'u':
         res->type = WPR_UNSIGNED;
diff --git a/miscemu/main.c b/miscemu/main.c
index 98dc871bb65..6ac2cc84233 100644
--- a/miscemu/main.c
+++ b/miscemu/main.c
@@ -114,7 +114,7 @@ int main( int argc, char *argv[] )
 
     if (Options.debug) DEBUG_AddModuleBreakpoints();
 
-    Yield();  /* Start the first task */
+    Yield16();  /* Start the first task */
     fprintf( stderr, "WinMain: Should never happen: returned from Yield()\n" );
     return 0;
 }
diff --git a/msdos/Makefile.in b/msdos/Makefile.in
index 31be80e5b08..398fb3489ba 100644
--- a/msdos/Makefile.in
+++ b/msdos/Makefile.in
@@ -19,6 +19,7 @@ C_SRCS = \
 	int26.c \
 	int2a.c \
 	int2f.c \
+	int3d.c \
 	int4b.c \
 	int5c.c \
 	interrupts.c \
diff --git a/msdos/int3d.c b/msdos/int3d.c
new file mode 100644
index 00000000000..8e517d49f08
--- /dev/null
+++ b/msdos/int3d.c
@@ -0,0 +1,38 @@
+/*
+ * DOS interrupt 3d handler.
+ * Copyright 1997 Len White
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include "msdos.h"
+#include "miscemu.h"
+#include "stddebug.h"
+/* #define DEBUG_INT */
+#include "debug.h"
+
+/**********************************************************************
+ *          INT_Int3dHandler
+ *
+ * Handler for int 3d (FLOATING POINT EMULATION - STANDALONE FWAIT).
+ */
+void WINAPI INT_Int3dHandler(CONTEXT *context)
+{
+    switch(AH_reg(context))
+    {
+    case 0x00:
+        break;
+
+    case 0x02:
+    case 0x03:
+    case 0x04:
+    case 0x05:
+    case 0xb:
+        AH_reg(context) = 0;
+        break;
+
+    default:
+        INT_BARF( context, 0x3d );
+    }
+}
+
diff --git a/objects/cursoricon.c b/objects/cursoricon.c
index 569b6abfa7c..a9a7a06e22a 100644
--- a/objects/cursoricon.c
+++ b/objects/cursoricon.c
@@ -1258,9 +1258,10 @@ void WINAPI GetClipCursor32( RECT32 *rect )
  *
  * FIXME: exact parameter sizes
  */
-UINT16 WINAPI LookupIconIdFromDirectoryEx16( CURSORICONDIR *dir, BOOL16 bIcon,
+INT16 WINAPI LookupIconIdFromDirectoryEx16( LPBYTE xdir, BOOL16 bIcon,
 	     INT16 width, INT16 height, UINT16 cFlag )
 {
+    CURSORICONDIR	*dir = (CURSORICONDIR*)xdir;
     UINT16 retVal = 0;
     if( dir && !dir->idReserved && (dir->idType & 3) )
     {
@@ -1285,31 +1286,41 @@ UINT16 WINAPI LookupIconIdFromDirectoryEx16( CURSORICONDIR *dir, BOOL16 bIcon,
 /**********************************************************************
  *          LookupIconIdFromDirectoryEx32       (USER32.379)
  */
-INT32 WINAPI LookupIconIdFromDirectoryEx32( CURSORICONDIR *dir, BOOL32 bIcon,
+INT32 WINAPI LookupIconIdFromDirectoryEx32( LPBYTE dir, BOOL32 bIcon,
              INT32 width, INT32 height, UINT32 cFlag )
 {
     return LookupIconIdFromDirectoryEx16( dir, bIcon, width, height, cFlag );
 }
 
 /**********************************************************************
- *          LookupIconIdFromDirectory		(USER32.378)
+ *          LookupIconIdFromDirectory		(USER.???)
  */
-INT32 WINAPI LookupIconIdFromDirectory( CURSORICONDIR *dir, BOOL32 bIcon )
+INT16 WINAPI LookupIconIdFromDirectory16( LPBYTE dir, BOOL16 bIcon )
 {
     return LookupIconIdFromDirectoryEx16( dir, bIcon, 
 	   bIcon ? SYSMETRICS_CXICON : SYSMETRICS_CXCURSOR,
 	   bIcon ? SYSMETRICS_CYICON : SYSMETRICS_CYCURSOR, bIcon ? 0 : LR_MONOCHROME );
 }
 
+/**********************************************************************
+ *          LookupIconIdFromDirectory		(USER32.378)
+ */
+INT32 WINAPI LookupIconIdFromDirectory32( LPBYTE dir, BOOL32 bIcon )
+{
+    return LookupIconIdFromDirectoryEx32( dir, bIcon, 
+	   bIcon ? SYSMETRICS_CXICON : SYSMETRICS_CXCURSOR,
+	   bIcon ? SYSMETRICS_CYICON : SYSMETRICS_CYCURSOR, bIcon ? 0 : LR_MONOCHROME );
+}
+
 /**********************************************************************
  *	    GetIconID    (USER.455)
  */
 WORD WINAPI GetIconID( HGLOBAL16 hResource, DWORD resType )
 {
-    CURSORICONDIR *lpDir = (CURSORICONDIR *)GlobalLock16(hResource);
+    LPBYTE lpDir = (LPBYTE)GlobalLock16(hResource);
 
     dprintf_cursor( stddeb, "GetIconID: hRes=%04x, entries=%i\n",
-                    hResource, lpDir ? lpDir->idCount : 0);
+                    hResource, lpDir ? ((CURSORICONDIR*)lpDir)->idCount : 0);
 
     switch(resType)
     {
diff --git a/objects/dib.c b/objects/dib.c
index 88cb033753e..3c1be2eb9ed 100644
--- a/objects/dib.c
+++ b/objects/dib.c
@@ -27,7 +27,7 @@ typedef struct
 {
     DC               *dc;
     LPCVOID           bits;
-    DWORD             lines;
+    int               lines;
     DWORD             infoWidth;
     WORD              depth;
     WORD              infoBpp;
@@ -145,7 +145,7 @@ int DIB_BitmapInfoSize( BITMAPINFO * info, WORD coloruse )
  * Return 1 for INFOHEADER, 0 for COREHEADER, -1 for error.
  */
 static int DIB_GetBitmapInfo( const BITMAPINFOHEADER *header, DWORD *width,
-                              DWORD *height, WORD *bpp )
+                              int *height, WORD *bpp )
 {
     if (header->biSize == sizeof(BITMAPINFOHEADER))
     {
@@ -235,50 +235,66 @@ static int *DIB_BuildColorMap( DC *dc, WORD coloruse, WORD depth,
     return colorMapping;
 }
 
+/***********************************************************************
+ *           DIB_SetImageBits_1_Line
+ *
+ * Handles a single line of 1 bit data.
+ */
+static void DIB_SetImageBits_1_Line(DWORD dstwidth, int *colors,
+				    XImage *bmpImage, int h, const BYTE *bits)
+{
+    BYTE pix;
+    DWORD i, x;
+
+    for (i = dstwidth/8, x = 0; (i > 0); i--)
+    {
+	pix = *bits++;
+	XPutPixel( bmpImage, x++, h, colors[pix >> 7] );
+	XPutPixel( bmpImage, x++, h, colors[(pix >> 6) & 1] );
+	XPutPixel( bmpImage, x++, h, colors[(pix >> 5) & 1] );
+	XPutPixel( bmpImage, x++, h, colors[(pix >> 4) & 1] );
+	XPutPixel( bmpImage, x++, h, colors[(pix >> 3) & 1] );
+	XPutPixel( bmpImage, x++, h, colors[(pix >> 2) & 1] );
+	XPutPixel( bmpImage, x++, h, colors[(pix >> 1) & 1] );
+	XPutPixel( bmpImage, x++, h, colors[pix & 1] );
+    }
+    pix = *bits;
+    switch(dstwidth & 7)
+    {
+    case 7: XPutPixel( bmpImage, x++, h, colors[pix >> 7] ); pix <<= 1;
+    case 6: XPutPixel( bmpImage, x++, h, colors[pix >> 7] ); pix <<= 1;
+    case 5: XPutPixel( bmpImage, x++, h, colors[pix >> 7] ); pix <<= 1;
+    case 4: XPutPixel( bmpImage, x++, h, colors[pix >> 7] ); pix <<= 1;
+    case 3: XPutPixel( bmpImage, x++, h, colors[pix >> 7] ); pix <<= 1;
+    case 2: XPutPixel( bmpImage, x++, h, colors[pix >> 7] ); pix <<= 1;
+    case 1: XPutPixel( bmpImage, x++, h, colors[pix >> 7] );
+    }
+}
 
 /***********************************************************************
  *           DIB_SetImageBits_1
  *
  * SetDIBits for a 1-bit deep DIB.
  */
-static void DIB_SetImageBits_1( DWORD lines, const BYTE *srcbits,
+static void DIB_SetImageBits_1( int lines, const BYTE *srcbits,
                                 DWORD srcwidth, DWORD dstwidth,
                                 int *colors, XImage *bmpImage )
 {
-    DWORD i, x;
-    BYTE pix;
-    const BYTE *bits = srcbits;
+    int h;
 
     /* 32 bit aligned */
     DWORD linebytes = ((srcwidth + 31) & ~31) / 8;
 
-    while (lines--)
-    {
-	for (i = dstwidth/8, x = 0; (i > 0); i--)
-	{
-	    pix = *bits++;
-	    XPutPixel( bmpImage, x++, lines, colors[pix >> 7] );
-	    XPutPixel( bmpImage, x++, lines, colors[(pix >> 6) & 1] );
-	    XPutPixel( bmpImage, x++, lines, colors[(pix >> 5) & 1] );
-	    XPutPixel( bmpImage, x++, lines, colors[(pix >> 4) & 1] );
-	    XPutPixel( bmpImage, x++, lines, colors[(pix >> 3) & 1] );
-	    XPutPixel( bmpImage, x++, lines, colors[(pix >> 2) & 1] );
-	    XPutPixel( bmpImage, x++, lines, colors[(pix >> 1) & 1] );
-	    XPutPixel( bmpImage, x++, lines, colors[pix & 1] );
+    if (lines > 0) {
+	for (h = lines-1; h >=0; h--) {
+	    DIB_SetImageBits_1_Line(dstwidth, colors, bmpImage, h, srcbits);
+	    srcbits += linebytes;
 	}
-	pix = *bits;
-	switch(dstwidth & 7)
-	{
-	case 7: XPutPixel( bmpImage, x++, lines, colors[pix >> 7] ); pix <<= 1;
-	case 6: XPutPixel( bmpImage, x++, lines, colors[pix >> 7] ); pix <<= 1;
-	case 5: XPutPixel( bmpImage, x++, lines, colors[pix >> 7] ); pix <<= 1;
-	case 4: XPutPixel( bmpImage, x++, lines, colors[pix >> 7] ); pix <<= 1;
-	case 3: XPutPixel( bmpImage, x++, lines, colors[pix >> 7] ); pix <<= 1;
-	case 2: XPutPixel( bmpImage, x++, lines, colors[pix >> 7] ); pix <<= 1;
-	case 1: XPutPixel( bmpImage, x++, lines, colors[pix >> 7] );
+    } else {
+	for (h = 0; h < lines; h++) {
+	    DIB_SetImageBits_1_Line(dstwidth, colors, bmpImage, h, srcbits);
+	    srcbits += linebytes;
 	}
-	srcbits += linebytes;
-	bits	 = srcbits;
     }
 }
 
@@ -288,27 +304,39 @@ static void DIB_SetImageBits_1( DWORD lines, const BYTE *srcbits,
  *
  * SetDIBits for a 4-bit deep DIB.
  */
-static void DIB_SetImageBits_4( DWORD lines, const BYTE *srcbits,
+static void DIB_SetImageBits_4( int lines, const BYTE *srcbits,
                                 DWORD srcwidth, DWORD dstwidth,
                                 int *colors, XImage *bmpImage )
 {
     DWORD i, x;
+    int h;
     const BYTE *bits = srcbits;
   
     /* 32 bit aligned */
     DWORD linebytes = ((srcwidth+7)&~7)/2;
 
-    while (lines--)
-    {
-	for (i = dstwidth/2, x = 0; i > 0; i--)
-	{
-	    BYTE pix = *bits++;
-	    XPutPixel( bmpImage, x++, lines, colors[pix >> 4] );
-	    XPutPixel( bmpImage, x++, lines, colors[pix & 0x0f] );
+    if (lines > 0) {
+	for (h = lines-1; h >= 0; h--) {
+	    for (i = dstwidth/2, x = 0; i > 0; i--) {
+		BYTE pix = *bits++;
+		XPutPixel( bmpImage, x++, h, colors[pix >> 4] );
+		XPutPixel( bmpImage, x++, h, colors[pix & 0x0f] );
+	    }
+	    if (dstwidth & 1) XPutPixel( bmpImage, x, h, colors[*bits >> 4] );
+	    srcbits += linebytes;
+	    bits	 = srcbits;
+	}
+    } else {
+	for (h = 0; h < lines; h++) {
+	    for (i = dstwidth/2, x = 0; i > 0; i--) {
+		BYTE pix = *bits++;
+		XPutPixel( bmpImage, x++, h, colors[pix >> 4] );
+		XPutPixel( bmpImage, x++, h, colors[pix & 0x0f] );
+	    }
+	    if (dstwidth & 1) XPutPixel( bmpImage, x, h, colors[*bits >> 4] );
+	    srcbits += linebytes;
+	    bits	 = srcbits;
 	}
-        if (dstwidth & 1) XPutPixel( bmpImage, x, lines, colors[*bits >> 4] );
-        srcbits += linebytes;
-        bits	 = srcbits;
     }
 }
 
@@ -324,7 +352,7 @@ static void DIB_SetImageBits_4( DWORD lines, const BYTE *srcbits,
  *
  * SetDIBits for a 4-bit deep compressed DIB.
  */
-static void DIB_SetImageBits_RLE4( DWORD lines, const BYTE *bits, DWORD width,
+static void DIB_SetImageBits_RLE4( int lines, const BYTE *bits, DWORD width,
                                 DWORD dstwidth, int *colors, XImage *bmpImage )
 {
 	int x = 0, c, length;
@@ -384,22 +412,32 @@ static void DIB_SetImageBits_RLE4( DWORD lines, const BYTE *bits, DWORD width,
  *
  * SetDIBits for an 8-bit deep DIB.
  */
-static void DIB_SetImageBits_8( DWORD lines, const BYTE *srcbits,
-                                DWORD srcwidth, DWORD dstwidth,
+static void DIB_SetImageBits_8( int lines, const BYTE *srcbits,
+				DWORD srcwidth, DWORD dstwidth,
                                 int *colors, XImage *bmpImage )
 {
     DWORD x;
+    int h;
     const BYTE *bits = srcbits;
 
     /* align to 32 bit */
     DWORD linebytes = (srcwidth + 3) & ~3;
 
-    while (lines--)
-    {
-	for (x = 0; x < dstwidth; x++)
-	    XPutPixel( bmpImage, x, lines, colors[*bits++] );
-        srcbits += linebytes;
-        bits     = srcbits;
+    if (lines > 0) {
+	for (h = lines - 1; h >= 0; h--) {
+	    for (x = 0; x < dstwidth; x++, bits++) {
+		XPutPixel( bmpImage, x, h, colors[*bits] );
+	    }
+	    bits = (srcbits += linebytes);
+	}
+    } else {
+	lines = -lines;
+	for (h = 0; h < lines; h++) {
+	    for (x = 0; x < dstwidth; x++, bits++) {
+		XPutPixel( bmpImage, x, h, colors[*bits] );
+	    }
+	    bits = (srcbits += linebytes);
+	}
     }
 }
 
@@ -434,7 +472,7 @@ enum Rle8_EscapeCodes
   RleDelta	= 2		/* Delta */
 };
   
-static void DIB_SetImageBits_RLE8( DWORD lines, const BYTE *bits, DWORD width,
+static void DIB_SetImageBits_RLE8( int lines, const BYTE *bits, DWORD width,
                                 DWORD dstwidth, int *colors, XImage *bmpImage )
 {
     int x;			/* X-positon on each line.  Increases. */
@@ -582,30 +620,124 @@ static void DIB_SetImageBits_RLE8( DWORD lines, const BYTE *bits, DWORD width,
 }  
 
 
+/***********************************************************************
+ *           DIB_SetImageBits_16
+ *
+ * SetDIBits for a 16-bit deep DIB.
+ */
+static void DIB_SetImageBits_16( int lines, const BYTE *srcbits,
+                                 DWORD srcwidth, DWORD dstwidth,
+				 DC *dc, XImage *bmpImage )
+{
+    DWORD x;
+    LPWORD ptr;
+    WORD val;
+    int h;
+    BYTE r, g, b;
+  
+    /* align to 32 bit */
+    DWORD linebytes = (srcwidth * 2 + 3) & ~3;
+
+    ptr = (LPWORD) srcbits;
+    if (lines > 0) {
+	for (h = lines - 1; h >= 0; h--) {
+	    for (x = 0; x < dstwidth; x++, ptr++) {
+		val = *ptr;
+		r = (BYTE) ((val & 0x7c00) >> 7);
+		g = (BYTE) ((val & 0x03e0) >> 2);
+		b = (BYTE) ((val & 0x001f) << 3);
+		XPutPixel( bmpImage, x, h,
+			   COLOR_ToPhysical(dc, RGB(r,g,b)) );
+	    }
+	    ptr = (LPWORD) (srcbits += linebytes);
+	}
+    } else {
+	lines = -lines;
+	for (h = 0; h < lines; h++) {
+	    for (x = 0; x < dstwidth; x++, ptr++) {
+		val = *ptr;
+		r = (BYTE) ((val & 0x7c00) >> 7);
+		g = (BYTE) ((val & 0x03e0) >> 2);
+		b = (BYTE) ((val & 0x001f) << 3);
+		XPutPixel( bmpImage, x, h,
+			   COLOR_ToPhysical(dc, RGB(r,g,b)) );
+	    }
+	    ptr = (LPWORD) (srcbits += linebytes);
+	}
+    }
+}
+
+
 /***********************************************************************
  *           DIB_SetImageBits_24
  *
  * SetDIBits for a 24-bit deep DIB.
  */
-static void DIB_SetImageBits_24( DWORD lines, const BYTE *srcbits,
+static void DIB_SetImageBits_24( int lines, const BYTE *srcbits,
                                  DWORD srcwidth, DWORD dstwidth,
 				 DC *dc, XImage *bmpImage )
 {
     DWORD x;
     const BYTE *bits = srcbits;
+    int h;
   
     /* align to 32 bit */
     DWORD linebytes = (srcwidth * 3 + 3) & ~3;
 
     /* "bits" order is reversed for some reason */
 
-    while (lines--)
-    {
-	for (x = 0; x < dstwidth; x++, bits += 3)
-	    XPutPixel( bmpImage, x, lines, 
-		       COLOR_ToPhysical(dc, RGB(bits[2],bits[1],bits[0])) );
+    if (lines > 0) {
+	for (h = lines - 1; h >= 0; h--) {
+	    for (x = 0; x < dstwidth; x++, bits += 3) {
+		XPutPixel( bmpImage, x, h, 
+			   COLOR_ToPhysical(dc, RGB(bits[2],bits[1],bits[0])));
+	    }
+	    bits = (srcbits += linebytes);
+	}
+    } else {
+	lines = -lines;
+	for (h = 0; h < lines; h++) {
+	    for (x = 0; x < dstwidth; x++, bits += 3) {
+		XPutPixel( bmpImage, x, h,
+			   COLOR_ToPhysical(dc, RGB(bits[2],bits[1],bits[0])));
+	    }
+	    bits = (srcbits += linebytes);
+	}
+    }
+}
+
+
+/***********************************************************************
+ *           DIB_SetImageBits_32
+ *
+ * SetDIBits for a 32-bit deep DIB.
+ */
+static void DIB_SetImageBits_32( int lines, const BYTE *srcbits,
+                                 DWORD srcwidth, DWORD dstwidth,
+				 DC *dc, XImage *bmpImage )
+{
+    DWORD x;
+    const BYTE *bits = srcbits;
+    int h;
+  
+    DWORD linebytes = (srcwidth * 4);
 
-        bits = (srcbits += linebytes);
+    if (lines > 0) {
+	for (h = lines - 1; h >= 0; h--) {
+	    for (x = 0; x < dstwidth; x++, bits += 4) {
+		XPutPixel( bmpImage, x, h, 
+			   COLOR_ToPhysical(dc, RGB(bits[2],bits[1],bits[0])));
+	    }
+	    bits = (srcbits += linebytes);
+	}
+    } else {
+	for (h = 0; h < lines; h++) {
+	    for (x = 0; x < dstwidth; x++, bits += 4) {
+		XPutPixel( bmpImage, x, h,
+			   COLOR_ToPhysical(dc, RGB(bits[2],bits[1],bits[0])));
+	    }
+	    bits = (srcbits += linebytes);
+	}
     }
 }
 
@@ -621,6 +753,7 @@ static int DIB_SetImageBits( const DIB_SETIMAGEBITS_DESCR *descr )
     int *colorMapping;
     XImage *bmpImage;
     DWORD compression = 0;
+    int lines;
 
     if (descr->info->bmiHeader.biSize == sizeof(BITMAPINFOHEADER))
         compression = descr->info->bmiHeader.biCompression;
@@ -635,7 +768,9 @@ static int DIB_SetImageBits( const DIB_SETIMAGEBITS_DESCR *descr )
     if( descr->dc->w.flags & DC_DIRTY ) CLIPPING_UpdateGCRegion(descr->dc);
 
       /* Transfer the pixels */
-    XCREATEIMAGE(bmpImage, descr->infoWidth, descr->lines, descr->depth );
+    lines = descr->lines;
+    if (lines < 0) lines = -lines;
+    XCREATEIMAGE(bmpImage, descr->infoWidth, lines, descr->depth );
 
     switch(descr->infoBpp)
     {
@@ -657,10 +792,19 @@ static int DIB_SetImageBits( const DIB_SETIMAGEBITS_DESCR *descr )
 	else DIB_SetImageBits_8( descr->lines, descr->bits, descr->infoWidth,
                                  descr->width, colorMapping, bmpImage );
 	break;
+    case 15:
+    case 16:
+	DIB_SetImageBits_16( descr->lines, descr->bits, descr->infoWidth,
+			     descr->width, descr->dc, bmpImage);
+	break;
     case 24:
 	DIB_SetImageBits_24( descr->lines, descr->bits, descr->infoWidth,
                              descr->width, descr->dc, bmpImage );
 	break;
+    case 32:
+	DIB_SetImageBits_32( descr->lines, descr->bits, descr->infoWidth,
+                             descr->width, descr->dc, bmpImage);
+	break;
     default:
         fprintf( stderr, "Invalid depth %d for SetDIBits!\n", descr->infoBpp );
         break;
@@ -670,7 +814,7 @@ static int DIB_SetImageBits( const DIB_SETIMAGEBITS_DESCR *descr )
                descr->xSrc, descr->ySrc, descr->xDest, descr->yDest,
                descr->width, descr->height );
     XDestroyImage( bmpImage );
-    return descr->lines;
+    return lines;
 }
 
 
@@ -732,7 +876,7 @@ INT32 WINAPI SetDIBits32( HDC32 hdc, HBITMAP32 hbitmap, UINT32 startscan,
 {
     DIB_SETIMAGEBITS_DESCR descr;
     BITMAPOBJ * bmp;
-    DWORD height;
+    int height, tmpheight;
     INT32 result;
 
       /* Check parameters */
@@ -755,6 +899,8 @@ INT32 WINAPI SetDIBits32( HDC32 hdc, HBITMAP32 hbitmap, UINT32 startscan,
         GDI_HEAP_UNLOCK( hdc );
         return 0;
     }
+    tmpheight = height;
+    if (height < 0) height = -height;
     if (!lines || (startscan >= height))
     {
         GDI_HEAP_UNLOCK( hbitmap );
@@ -764,7 +910,7 @@ INT32 WINAPI SetDIBits32( HDC32 hdc, HBITMAP32 hbitmap, UINT32 startscan,
     if (startscan + lines > height) lines = height - startscan;
 
     descr.bits      = bits;
-    descr.lines     = lines;
+    descr.lines     = tmpheight >= 0 ? lines : -lines;
     descr.depth     = bmp->bitmap.bmBitsPixel;
     descr.info      = info;
     descr.coloruse  = coloruse;
@@ -807,7 +953,8 @@ INT32 WINAPI SetDIBitsToDevice32(HDC32 hdc, INT32 xDest, INT32 yDest, DWORD cx,
 {
     DIB_SETIMAGEBITS_DESCR descr;
     DC * dc;
-    DWORD width, height;
+    DWORD width;
+    int height, tmpheight;
 
       /* Check parameters */
 
@@ -820,6 +967,8 @@ INT32 WINAPI SetDIBitsToDevice32(HDC32 hdc, INT32 xDest, INT32 yDest, DWORD cx,
     if (DIB_GetBitmapInfo( &info->bmiHeader, &width,
                            &height, &descr.infoBpp ) == -1)
         return 0;
+    tmpheight = height;
+    if (height < 0) height = -height;
     if (!lines || (startscan >= height)) return 0;
     if (startscan + lines > height) lines = height - startscan;
     if (ySrc < startscan) ySrc = startscan;
@@ -834,7 +983,7 @@ INT32 WINAPI SetDIBitsToDevice32(HDC32 hdc, INT32 xDest, INT32 yDest, DWORD cx,
 
     descr.dc        = dc;
     descr.bits      = bits;
-    descr.lines     = lines;
+    descr.lines     = tmpheight >= 0 ? lines : -lines;
     descr.infoWidth = width;
     descr.depth     = dc->w.bitsPerPixel;
     descr.info      = info;
@@ -851,7 +1000,92 @@ INT32 WINAPI SetDIBitsToDevice32(HDC32 hdc, INT32 xDest, INT32 yDest, DWORD cx,
     return CALL_LARGE_STACK( DIB_SetImageBits, &descr );
 }
 
+/***********************************************************************
+ *           SetDIBColorTable32    (GDI32.311)
+ */
+UINT32 WINAPI SetDIBColorTable32( HDC32 hdc, UINT32 startpos, UINT32 entries,
+				  RGBQUAD *colors )
+{
+    DC * dc;
+    PALETTEENTRY * palEntry;
+    PALETTEOBJ * palette;
+    RGBQUAD *end;
+
+    dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC );
+    if (!dc) 
+    {
+	dc = (DC *)GDI_GetObjPtr(hdc, METAFILE_DC_MAGIC);
+	if (!dc) return 0;
+    }
+
+    if (!(palette = (PALETTEOBJ*)GDI_GetObjPtr( dc->w.hPalette, PALETTE_MAGIC )))
+    {
+        return 0;
+    }
 
+    /* Transfer color info */
+    
+    if (dc->w.bitsPerPixel <= 8) {
+	palEntry = palette->logpalette.palPalEntry + startpos;
+	if (startpos + entries > (1 << dc->w.bitsPerPixel)) {
+	    entries = (1 << dc->w.bitsPerPixel) - startpos;
+	}
+	for (end = colors + entries; colors < end; palEntry++, colors++)
+	{
+	    palEntry->peRed   = colors->rgbRed;
+	    palEntry->peGreen = colors->rgbGreen;
+	    palEntry->peBlue  = colors->rgbBlue;
+	}
+    } else {
+	entries = 0;
+    }
+    GDI_HEAP_UNLOCK( dc->w.hPalette );
+    return entries;
+}
+
+/***********************************************************************
+ *           GetDIBColorTable32    (GDI32.169)
+ */
+UINT32 WINAPI GetDIBColorTable32( HDC32 hdc, UINT32 startpos, UINT32 entries,
+				  RGBQUAD *colors )
+{
+    DC * dc;
+    PALETTEENTRY * palEntry;
+    PALETTEOBJ * palette;
+    RGBQUAD *end;
+
+    dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC );
+    if (!dc) 
+    {
+	dc = (DC *)GDI_GetObjPtr(hdc, METAFILE_DC_MAGIC);
+	if (!dc) return 0;
+    }
+
+    if (!(palette = (PALETTEOBJ*)GDI_GetObjPtr( dc->w.hPalette, PALETTE_MAGIC )))
+    {
+        return 0;
+    }
+
+    /* Transfer color info */
+    
+    if (dc->w.bitsPerPixel <= 8) {
+	palEntry = palette->logpalette.palPalEntry + startpos;
+	if (startpos + entries > (1 << dc->w.bitsPerPixel)) {
+	    entries = (1 << dc->w.bitsPerPixel) - startpos;
+	}
+	for (end = colors + entries; colors < end; palEntry++, colors++)
+	{
+	    colors->rgbRed      = palEntry->peRed;
+	    colors->rgbGreen    = palEntry->peGreen;
+	    colors->rgbBlue     = palEntry->peBlue;
+	    colors->rgbReserved = 0;
+	}
+    } else {
+	entries = 0;
+    }
+    GDI_HEAP_UNLOCK( dc->w.hPalette );
+    return entries;
+}
 
 /***********************************************************************
  *           GetDIBits16    (GDI.441)
@@ -1018,6 +1252,18 @@ INT32 WINAPI GetDIBits32( HDC32 hdc, HBITMAP32 hbitmap, UINT32 startscan,
 		   bbits += pad;
 		}
 		break;
+	   case 32:
+		for( y = yend - 1; (int)y >= (int)startscan; y-- )
+		{
+		   *bbits = 0;
+		   for( x = 0; x < xend; x++ ) {
+		   	unsigned long pixel=XGetPixel( bmpImage, x, y);
+			*bbits++ = (pixel >>16) & 0xff;
+			*bbits++ = (pixel >> 8) & 0xff;
+			*bbits++ =  pixel       & 0xff;
+		   }
+		}
+		break;
 	   default:
 	   	fprintf(stderr,"GetDIBits*: unsupported depth %d\n",
 			info->bmiHeader.biBitCount
@@ -1069,10 +1315,12 @@ HBITMAP32 WINAPI CreateDIBitmap32( HDC32 hdc, const BITMAPINFOHEADER *header,
 {
     HBITMAP32 handle;
     BOOL32 fColor;
-    DWORD width, height;
+    DWORD width;
+    int height;
     WORD bpp;
 
     if (DIB_GetBitmapInfo( header, &width, &height, &bpp ) == -1) return 0;
+    if (height < 0) height = -height;
 
     /* Check if we should create a monochrome or color bitmap. */
     /* We create a monochrome bitmap only if it has exactly 2  */
diff --git a/objects/font.c b/objects/font.c
index f65f01611b6..124663e3943 100644
--- a/objects/font.c
+++ b/objects/font.c
@@ -1189,3 +1189,21 @@ BOOL32 WINAPI TranslateCharSetInfo(LPDWORD lpSrc,LPCHARSETINFO lpCs,DWORD dwFlag
     return TRUE;
 }
 
+
+/*************************************************************************
+ *             GetFontLanguageInfo   (GDI32.182)
+ */
+DWORD WINAPI GetFontLanguageInfo32(HDC32 hdc) {
+	/* return value 0 is correct for most cases anyway */
+	fprintf(stderr,"GetFontLanguageInfo:stub!\n");
+	return 0;
+}
+
+/*************************************************************************
+ *             GetFontLanguageInfo   (GDI.616)
+ */
+DWORD WINAPI GetFontLanguageInfo16(HDC16 hdc) {
+	/* return value 0 is correct for most cases anyway */
+	fprintf(stderr,"GetFontLanguageInfo:stub!\n");
+	return 0;
+}
diff --git a/objects/text.c b/objects/text.c
index 7844d8af96d..04f8f8b3618 100644
--- a/objects/text.c
+++ b/objects/text.c
@@ -636,7 +636,7 @@ DWORD WINAPI GetTabbedTextExtent32W( HDC32 hdc, LPCWSTR lpstr, INT32 count,
 }
 
 /***********************************************************************
- *           GetTextCharset    (USER32.226) (USER.612)
+ *           GetTextCharset    (GDI32.226) (GDI.612)
  */
 INT32 WINAPI GetTextCharset32(HDC32 hdc)
 {
@@ -648,3 +648,15 @@ INT16 WINAPI GetTextCharset16(HDC16 hdc)
 {
     return GetTextCharset32(hdc);
 }
+
+/***********************************************************************
+ *           GetTextCharsetInfo    (GDI32.381)
+ */
+INT32 WINAPI GetTextCharsetInfo(HDC32 hdc,LPCHARSETINFO csi,DWORD flags)
+{
+    fprintf(stdnimp,"GetTextCharsetInfo(0x%x,%p,%08lx), stub!\n",hdc,csi,flags);
+    csi->ciCharset = DEFAULT_CHARSET;
+    csi->ciACP = GetACP();
+    /* ... fill fontstruct too ... */
+    return DEFAULT_CHARSET;
+}
diff --git a/ole/Makefile.in b/ole/Makefile.in
new file mode 100644
index 00000000000..feeca6c4b95
--- /dev/null
+++ b/ole/Makefile.in
@@ -0,0 +1,21 @@
+DEFS      = @DLLFLAGS@ -D__WINE__
+TOPSRCDIR = @top_srcdir@
+TOPOBJDIR = ..
+SRCDIR    = @srcdir@
+VPATH     = @srcdir@
+MODULE    = ole
+
+C_SRCS = \
+	compobj.c \
+	ole2.c \
+	ole2disp.c \
+	ole2nls.c \
+	olecli.c \
+	olesvr.c
+
+all: $(MODULE).o
+
+@MAKE_RULES@
+
+### Dependencies:
+
diff --git a/misc/compobj.c b/ole/compobj.c
similarity index 97%
rename from misc/compobj.c
rename to ole/compobj.c
index 40c9444e00d..7287bfef6dc 100644
--- a/misc/compobj.c
+++ b/ole/compobj.c
@@ -6,6 +6,7 @@
 
 /*	At the moment, these are only empty stubs.
  */
+#define INITGUID
 
 #include <ctype.h>
 #include <stdlib.h>
@@ -15,6 +16,8 @@
 #include "stddebug.h"
 #include "debug.h"
 #include "compobj.h"
+#include "interfaces.h"
+#include "shlobj.h"
 
 DWORD currentMalloc=0;
 
@@ -159,7 +162,7 @@ OLESTATUS WINAPI StringFromCLSID(const CLSID *id, LPSTR idstr)
   char *s;
   int	i;
 
-  sprintf(idstr, "{%08lx-%04x-%04x-%2x%2x-",
+  sprintf(idstr, "{%08lx-%04x-%04x-%02x%02x-",
 	  id->Data1, id->Data2, id->Data3,
 	  id->Data4[0], id->Data4[1]);
   s = &idstr[25];
diff --git a/misc/ole2.c b/ole/ole2.c
similarity index 69%
rename from misc/ole2.c
rename to ole/ole2.c
index d51e275d23a..fce01adc6c9 100644
--- a/misc/ole2.c
+++ b/ole/ole2.c
@@ -46,3 +46,16 @@ HRESULT WINAPI OleFlushClipboard()
     return S_OK;
 }
 
+/***********************************************************************
+ *           CoRegisterMessageFilter   [OLE32.38]
+ */
+HRESULT CoRegisterMessageFilter(
+    LPMESSAGEFILTER lpMessageFilter,	/* Pointer to interface */
+    LPMESSAGEFILTER *lplpMessageFilter	/* Indirect pointer to prior instance if non-NULL */
+) {
+    dprintf_ole(stdnimp,"CoRegisterMessageFilter()\n");
+    if (lplpMessageFilter) {
+	*lplpMessageFilter = NULL;
+    }
+    return S_OK;
+}
diff --git a/misc/ole2disp.c b/ole/ole2disp.c
similarity index 100%
rename from misc/ole2disp.c
rename to ole/ole2disp.c
diff --git a/misc/ole2nls.c b/ole/ole2nls.c
similarity index 100%
rename from misc/ole2nls.c
rename to ole/ole2nls.c
diff --git a/ole/olecli.c b/ole/olecli.c
new file mode 100644
index 00000000000..a2182133dc9
--- /dev/null
+++ b/ole/olecli.c
@@ -0,0 +1,151 @@
+/*
+ *	OLECLI library
+ *
+ *	Copyright 1995	Martin von Loewis
+ */
+
+/*	At the moment, these are only empty stubs.
+ */
+
+#include "windows.h"
+#include "ole.h"
+#include "gdi.h"
+#include "stddebug.h"
+#include "debug.h"
+
+extern LONG	OLE_current_handle;
+
+/***********************************************************************
+ *           OleRegisterClientDoc
+ */
+OLESTATUS WINAPI OleRegisterClientDoc16(LPCSTR classname, LPCSTR docname,
+                                        LONG reserved, LHCLIENTDOC *hRet )
+{
+    fprintf(stdnimp,"OleRegisterClientDoc:%s %s\n",classname,docname);
+    *hRet=++OLE_current_handle;
+    return OLE_OK;
+}
+
+/***********************************************************************
+ *           OleRegisterClientDoc
+ */
+OLESTATUS WINAPI OleRegisterClientDoc32(LPCSTR classname, LPCSTR docname,
+                                        LONG reserved, LHCLIENTDOC *hRet )
+{
+    fprintf(stdnimp,"OleRegisterClientDoc:%s %s\n",classname,docname);
+    *hRet=++OLE_current_handle;
+    return OLE_OK;
+}
+
+/***********************************************************************
+ *           OleRenameClientDoc
+ */
+OLESTATUS WINAPI OleRenameClientDoc16(LHCLIENTDOC hDoc, LPCSTR newName)
+{
+    fprintf(stdnimp,"OleRenameClientDoc: %ld %s\n",hDoc, newName);
+    return OLE_OK;
+}
+
+/***********************************************************************
+ *           OleRenameClientDoc
+ */
+OLESTATUS WINAPI OleRenameClientDoc32(LHCLIENTDOC hDoc, LPCSTR newName)
+{
+    fprintf(stdnimp,"OleRenameClientDoc: %ld %s\n",hDoc, newName);
+    return OLE_OK;
+}
+
+/***********************************************************************
+ *           OleRevokeClientDoc
+ */
+OLESTATUS WINAPI OleRevokeClientDoc16(LHCLIENTDOC hServerDoc)
+{
+    fprintf(stdnimp,"OleRevokeClientDoc:%ld\n",hServerDoc);
+    return OLE_OK;
+}
+
+/***********************************************************************
+ *           OleRevokeClientDoc
+ */
+OLESTATUS WINAPI OleRevokeClientDoc32(LHCLIENTDOC hServerDoc)
+{
+    fprintf(stdnimp,"OleRevokeClientDoc:%ld\n",hServerDoc);
+    return OLE_OK;
+}
+
+/***********************************************************************
+ *           OleCreateLinkFromClip32
+ */
+OLESTATUS WINAPI OleCreateLinkFromClip32( 
+	LPCSTR name,LPOLECLIENT olecli,LHCLIENTDOC hclientdoc,LPCSTR xname,
+	LPOLEOBJECT *lpoleob,OLEOPT_RENDER render,OLECLIPFORMAT clipformat
+) {
+	fprintf(stdnimp,"OleCreateLinkFromClip(%s,%p,%08lx,%s,%p,%d,%ld),stub!\n",
+		name,olecli,hclientdoc,xname,lpoleob,render,clipformat
+	);
+	return OLE_OK;
+}
+
+/***********************************************************************
+ *           OleQueryLinkFromClip32
+ */
+OLESTATUS WINAPI OleQueryLinkFromClip32(LPCSTR name,OLEOPT_RENDER render,OLECLIPFORMAT clipformat) {
+	fprintf(stdnimp,"OleQueryLinkFromClip(%s,%d,%ld),stub!\n",
+		name,render,clipformat
+	);
+	return OLE_OK;
+}
+/***********************************************************************
+ *           OleQueryCreateFromClip32
+ */
+OLESTATUS WINAPI OleQueryCreateFromClip32(LPCSTR name,OLEOPT_RENDER render,OLECLIPFORMAT clipformat) {
+	fprintf(stdnimp,"OleQueryCreateFromClip(%s,%d,%ld),stub!\n",
+		name,render,clipformat
+	);
+	return OLE_OK;
+}
+
+
+/***********************************************************************
+ *           OleIsDcMeta
+ */
+BOOL16 WINAPI OleIsDcMeta(HDC16 hdc)
+{
+	dprintf_ole(stddeb,"OleIsDCMeta(%04x)\n",hdc);
+	return GDI_GetObjPtr( hdc, METAFILE_DC_MAGIC ) != 0;
+}
+
+/***********************************************************************
+ *           OleSetHostNames
+ */
+OLESTATUS WINAPI OleSetHostNames32(LPOLEOBJECT oleob,LPCSTR name1,LPCSTR name2) {
+	fprintf(stdnimp,"OleSetHostNames(%p,%s,%s),stub\n",oleob,name1,name2);
+	return OLE_OK;
+}
+
+/***********************************************************************
+ *           OleQueryType32
+ */
+OLESTATUS WINAPI OleQueryType32(LPOLEOBJECT oleob,LONG*xlong) {
+	fprintf(stdnimp,"OleQueryType(%p,%p),stub!\n",oleob,xlong);
+	if (!oleob)
+		return 0x10;
+	fprintf(stddeb,"Calling OLEOBJECT.QueryType (%p) (%p,%p)\n",
+		oleob->lpvtbl->QueryType,oleob,xlong
+	);
+	return oleob->lpvtbl->QueryType(oleob,xlong);
+}
+
+/***********************************************************************
+ *           OleCreateFromClip
+ */
+OLESTATUS WINAPI OleCreateFromClip32(
+	LPCSTR name,LPOLECLIENT olecli,LHCLIENTDOC hclientdoc,LPCSTR xname,
+	LPOLEOBJECT *lpoleob,OLEOPT_RENDER render, OLECLIPFORMAT clipformat
+) {
+	fprintf(stdnimp,"OleCreateLinkFromClip(%s,%p,%08lx,%s,%p,%d,%ld),stub!\n",
+		name,olecli,hclientdoc,xname,lpoleob,render,clipformat
+	);
+	/* clipb type, object kreieren entsprechend etc. */
+	return OLE_OK;
+}
diff --git a/ole/olesvr.c b/ole/olesvr.c
new file mode 100644
index 00000000000..ad68eb1628f
--- /dev/null
+++ b/ole/olesvr.c
@@ -0,0 +1,134 @@
+/*
+ *	OLESVR library
+ *
+ *	Copyright 1995	Martin von Loewis
+ */
+
+/*	At the moment, these are only empty stubs.
+ */
+
+#include "windows.h"
+#include "ole.h"
+#include "stddebug.h"
+#include "debug.h"
+
+LONG	OLE_current_handle;
+
+/***********************************************************************
+ *           OleRegisterServer
+ */
+OLESTATUS WINAPI OleRegisterServer16( LPCSTR name, LPOLESERVER serverStruct,
+                                      LHSERVER *hRet, HINSTANCE16 hServer,
+                                      OLE_SERVER_USE use )
+{
+    dprintf_ole(stdnimp,"OleRegisterServer:%s\n",name);
+    *hRet=++OLE_current_handle;
+    /* return OLE_ERROR_MEMORY, OLE_ERROR_PROTECT_ONLY if you want it fail*/
+    return OLE_OK;
+}
+
+/***********************************************************************
+ *           OleBlockServer
+ */
+OLESTATUS WINAPI OleBlockServer16(LHSERVER hServer)
+{
+    fprintf(stdnimp,"OleBlockServer:%ld\n",hServer);
+    return OLE_OK;
+}
+
+/***********************************************************************
+ *           OleBlockServer
+ */
+OLESTATUS WINAPI OleBlockServer32(LHSERVER hServer)
+{
+    fprintf(stdnimp,"OleBlockServer:%ld\n",hServer);
+    return OLE_OK;
+}
+
+/***********************************************************************
+ *           OleUnblockServer
+ */
+OLESTATUS WINAPI OleUnblockServer16(LHSERVER hServer, BOOL16 *block)
+{
+    fprintf(stdnimp,"OleUnblockServer:%ld\n",hServer);
+    /* no more blocked messages :) */
+    *block=FALSE;
+    return OLE_OK;
+}
+
+/***********************************************************************
+ *           OleUnblockServer
+ */
+OLESTATUS WINAPI OleUnblockServer32(LHSERVER hServer, BOOL32 *block)
+{
+    fprintf(stdnimp,"OleUnblockServer:%ld\n",hServer);
+    /* no more blocked messages :) */
+    *block=FALSE;
+    return OLE_OK;
+}
+
+/***********************************************************************
+ *           OleRegisterServerDoc
+ */
+OLESTATUS WINAPI OleRegisterServerDoc16( LHSERVER hServer, LPCSTR docname,
+                                         LPOLESERVERDOC document,
+                                         LHSERVERDOC *hRet)
+{
+    dprintf_ole(stdnimp,"OleRegisterServerDoc:%ld,%s\n", hServer, docname);
+    *hRet=++OLE_current_handle;
+    return OLE_OK;
+}
+
+/***********************************************************************
+ *           OleRevokeServerDoc
+ */
+OLESTATUS WINAPI OleRevokeServerDoc16(LHSERVERDOC hServerDoc)
+{
+    dprintf_ole(stdnimp,"OleRevokeServerDoc:%ld\n",hServerDoc);
+    return OLE_OK;
+}
+
+/***********************************************************************
+ *           OleRevokeServerDoc
+ */
+OLESTATUS WINAPI OleRevokeServerDoc32(LHSERVERDOC hServerDoc)
+{
+    fprintf(stdnimp,"OleRevokeServerDoc:%ld\n",hServerDoc);
+    return OLE_OK;
+}
+
+/***********************************************************************
+ *           OleRevokeServer
+ */
+OLESTATUS WINAPI OleRevokeServer(LHSERVER hServer)
+{
+    dprintf_ole(stdnimp,"OleRevokeServer:%ld\n",hServer);
+    return OLE_OK;
+}
+
+OLESTATUS WINAPI OleRegisterServer32(LPCSTR svrname,LPOLESERVER olesvr,LHSERVER* hRet,HINSTANCE32 hinst,OLE_SERVER_USE osu) {
+	fprintf(stderr,"OleRegisterServer(%s,%p,%p,%08x,%d),stub!\n",
+		svrname,olesvr,hRet,hinst,osu
+	);
+    	*hRet=++OLE_current_handle;
+	return OLE_OK;
+}
+
+OLESTATUS WINAPI OleRegisterServerDoc32( LHSERVER hServer, LPCSTR docname,
+                                         LPOLESERVERDOC document,
+                                         LHSERVERDOC *hRet)
+{
+    fprintf(stdnimp,"OleRegisterServerDoc:%ld,%s\n", hServer, docname);
+    *hRet=++OLE_current_handle;
+    return OLE_OK;
+}
+
+/***********************************************************************
+ *           OleRenameServerDoc32
+ *
+ */
+OLESTATUS WINAPI OleRenameServerDoc32(LHSERVERDOC hDoc, LPCSTR newName)
+{
+    fprintf(stderr,"OleRenameServerDoc: %ld %s; stub.\n",hDoc, newName);
+    return OLE_OK;
+}
diff --git a/programs/Makefile.in b/programs/Makefile.in
index ad54a38d014..0118d6d7621 100644
--- a/programs/Makefile.in
+++ b/programs/Makefile.in
@@ -1,4 +1,4 @@
-SUBDIRS = progman winhelp
+SUBDIRS = progman winhelp winver
 
 all: $(SUBDIRS)
 
diff --git a/programs/progman/Makefile.in b/programs/progman/Makefile.in
index c1948d63b45..39e72fd79d5 100644
--- a/programs/progman/Makefile.in
+++ b/programs/progman/Makefile.in
@@ -11,19 +11,6 @@ RCFLAGS   = -w32 -h
 LANGUAGES   = En Da De Fr Fi Ko Hu It Va
 LICENSELANG = En
 
-# Installation infos
-
-INSTALL         = @INSTALL@
-INSTALL_PROGRAM = @INSTALL_PROGRAM@
-INSTALL_DATA    = @INSTALL_DATA@
-prefix          = @prefix@
-exec_prefix     = @exec_prefix@
-bindir          = @bindir@
-libdir          = @libdir@
-sysconfdir      = @sysconfdir@
-mandir          = @mandir@/man1
-manext          = .1
-
 MOSTSRCS = \
 	dialog.c \
 	group.c \
diff --git a/programs/winhelp/Makefile.in b/programs/winhelp/Makefile.in
index 322bb0b1454..612a362bd5c 100644
--- a/programs/winhelp/Makefile.in
+++ b/programs/winhelp/Makefile.in
@@ -10,19 +10,6 @@ RCFLAGS   = -w32 -h
 
 LANGUAGES   = En Da De Fr Fi Ko Hu It Va
 
-# Installation infos
-
-INSTALL         = @INSTALL@
-INSTALL_PROGRAM = @INSTALL_PROGRAM@
-INSTALL_DATA    = @INSTALL_DATA@
-prefix          = @prefix@
-exec_prefix     = @exec_prefix@
-bindir          = @bindir@
-libdir          = @libdir@
-sysconfdir      = @sysconfdir@
-mandir          = @mandir@/man1
-manext          = .1
-
 MOSTSRCS = \
 	winhelp.c \
 	hlpfile.c \
diff --git a/programs/winver/ChangeLog b/programs/winver/ChangeLog
new file mode 100644
index 00000000000..5fb731e4096
--- /dev/null
+++ b/programs/winver/ChangeLog
@@ -0,0 +1,5 @@
+Sun Nov 23 22:58:05 1997  Marcel Baur <mbaur@g26.ethz.ch>
+
+	* [winver.c] (new)
+         Original by Marcel Baur <mbaur@g26.ethz.ch>
+
diff --git a/programs/winver/Makefile.in b/programs/winver/Makefile.in
new file mode 100644
index 00000000000..208ca045eac
--- /dev/null
+++ b/programs/winver/Makefile.in
@@ -0,0 +1,25 @@
+DEFS      = -DWINELIB
+TOPSRCDIR = @top_srcdir@
+TOPOBJDIR = ../..
+SRCDIR    = @srcdir@
+VPATH     = @srcdir@
+MODULE    = none
+PROGRAMS  = winver
+ALL_LIBS  = $(WINELIB) $(X_LIBS) $(XPM_LIB) $(XLIB) $(LDLIBS)
+RCFLAGS   = -w32 -h
+
+C_SRCS = winver.c
+
+all: check_winerc $(PROGRAMS)
+
+@MAKE_RULES@
+
+winver: $(OBJS)
+	$(CC) -o winver $(OBJS) $(LDOPTIONS) $(ALL_LIBS)
+
+install: dummy
+	$(INSTALL_PROGRAM) winver $(bindir)/program
+
+dummy:
+
+### Dependencies:
diff --git a/programs/winver/winver.c b/programs/winver/winver.c
new file mode 100644
index 00000000000..fde3992e86f
--- /dev/null
+++ b/programs/winver/winver.c
@@ -0,0 +1,18 @@
+/*
+ * Windows Version Program
+ *
+ * Copyright 1997 by Marcel Baur (mbaur@g26.ethz.ch)
+ *
+*/
+
+#include "windows.h"
+#include "version.h"
+
+int PASCAL WinMain (HANDLE inst, HANDLE prev, LPSTR cmdline, int show)
+{
+   return ShellAbout((HWND)0, "WINE", WINE_RELEASE_INFO, 0);
+}
+
+/* Local Variables:     */
+/* c-files style: "GNU" */
+/* End:                 */
diff --git a/scheduler/process.c b/scheduler/process.c
index 4600e4d07d5..e3bd71b0e4d 100644
--- a/scheduler/process.c
+++ b/scheduler/process.c
@@ -16,6 +16,7 @@
 #include "ldt.h"
 #include "thread.h"
 #include "winerror.h"
+#include "pe_image.h"
 
 PDB32 *pCurrentProcess = NULL;
 
@@ -306,7 +307,12 @@ error:
 PDB32 *PROCESS_Create( TDB *pTask, LPCSTR cmd_line )
 {
     PDB32 *pdb = HeapAlloc( SystemHeap, HEAP_ZERO_MEMORY, sizeof(PDB32) );
+    DWORD size, commit;
+    NE_MODULE *pModule;
+
     if (!pdb) return NULL;
+    if (!(pModule = MODULE_GetPtr( pTask->hModule ))) return 0;
+
     pdb->header.type     = K32OBJ_PROCESS;
     pdb->header.refcount = 1;
     pdb->exit_code       = 0x103; /* STILL_ACTIVE */
@@ -318,8 +324,23 @@ PDB32 *PROCESS_Create( TDB *pTask, LPCSTR cmd_line )
     pdb->group           = pdb;
     pdb->priority        = 8;  /* Normal */
     pdb->heap_list       = pdb->heap;
+
     InitializeCriticalSection( &pdb->crit_section );
-    if (!(pdb->heap = HeapCreate( HEAP_GROWABLE, 0x10000, 0 ))) goto error;
+
+    /* Create the heap */
+
+    if (pModule->module32)
+    {
+	size  = PE_HEADER(pModule->module32)->OptionalHeader.SizeOfHeapReserve;
+	commit = PE_HEADER(pModule->module32)->OptionalHeader.SizeOfHeapCommit;
+    }
+    else
+    {
+	size = 0x10000;
+	commit = 0;
+    }
+    if (!(pdb->heap = HeapCreate( HEAP_GROWABLE, size, commit ))) goto error;
+
     if (!(pdb->env_db = HeapAlloc(pdb->heap, HEAP_ZERO_MEMORY, sizeof(ENVDB))))
         goto error;
     if (!(pdb->handle_table = PROCESS_AllocHandleTable( pdb ))) goto error;
@@ -379,6 +400,21 @@ HANDLE32 WINAPI GetCurrentProcess(void)
 }
 
 
+/*********************************************************************
+ *	OpenProcess				[KERNEL32.543]
+ *
+ */
+HANDLE32 WINAPI OpenProcess32(DWORD fdwAccess,BOOL32 bInherit,DWORD IDProcess)
+{
+	if (IDProcess != (DWORD)pCurrentProcess) {
+		fprintf(stderr,"OpenProcess32(%ld,%d,%ld)\n",fdwAccess,bInherit,IDProcess);
+		/* XXX: might not be the correct error value */
+		SetLastError( ERROR_INVALID_HANDLE );
+		return 0;
+	}
+	return GetCurrentProcess();
+}			      
+
 /***********************************************************************
  *           GetCurrentProcessId   (KERNEL32.199)
  */
@@ -475,7 +511,13 @@ DWORD WINAPI GetEnvironmentVariable32A( LPCSTR name, LPSTR value, DWORD size )
     }
     if (!*p) goto not_found;
     if (value) lstrcpyn32A( value, p + len + 1, size );
-    return strlen(p);
+    len = strlen(p);
+    /* According to the Win32 docs, if there is not enough room, return
+     * the size required to hold the string plus the terminating null
+     */
+    if (size <= len) len++;
+    return len;
+	
 not_found:
     return 0;  /* FIXME: SetLastError */
 }
@@ -527,13 +569,20 @@ BOOL32 WINAPI SetEnvironmentVariable32A( LPCSTR name, LPCSTR value )
     len = value ? strlen(name) + strlen(value) + 2 : 0;
     if (!res) len -= strlen(p) + 1;  /* The name already exists */
     size = pCurrentProcess->env_db->env_size + len;
+    if (len < 0)
+    {
+        LPSTR next = p + strlen(p) + 1;
+        memmove( next + len, next,
+                 pCurrentProcess->env_db->env_size - (next - env) );
+    }
     if (!(new_env = HeapReAlloc( GetProcessHeap(), 0, env, size )))
         return FALSE;
     p = new_env + (p - env);
+    if (len > 0)
+        memmove( p + len, p, pCurrentProcess->env_db->env_size - (p-new_env) );
 
     /* Set the new string */
 
-    memmove( p + len, p, pCurrentProcess->env_db->env_size - (p-new_env) );
     if (value)
     {
         strcpy( p, name );
@@ -597,8 +646,8 @@ DWORD WINAPI ExpandEnvironmentStrings32A( LPCSTR src, LPSTR dst, DWORD len)
 				LPSTR	x = HeapAlloc(heap,0,end-s+1);
 				char	buf[2];
 
-				lstrcpyn32A(x,s+1,end-s-1);
-				x[end-s-1]=0;
+				lstrcpyn32A(x,s+1,end-s);
+				x[end-s]=0;
 
 				/* put expanded variable directly into 
 				 * destination string, so we don't have
@@ -606,7 +655,7 @@ DWORD WINAPI ExpandEnvironmentStrings32A( LPCSTR src, LPSTR dst, DWORD len)
 				 */
 				ret = GetEnvironmentVariable32A(x,buf,2);
 				CHECK_FREE(ret+2);
-				ret = GetEnvironmentVariable32A(x,d,d-xdst);
+				ret = GetEnvironmentVariable32A(x,d,cursize-(d-xdst));
 				if (ret) {
 					d+=strlen(d);
 				} else {
@@ -825,6 +874,21 @@ DWORD WINAPI GetProcessVersion(DWORD processid)
 	return (pTask->version&0xff) | (((pTask->version >>8) & 0xff)<<16);
 }
 
+/***********************************************************************
+ *           GetProcessFlags    (KERNEL32)
+ */
+DWORD WINAPI GetProcessFlags(DWORD processid)
+{
+	PDB32	*process;
+
+	if (!processid) {
+		process=pCurrentProcess;
+		/* check if valid process */
+	} else
+		process=(PDB32*)pCurrentProcess; /* decrypt too, if needed */
+	return process->flags;
+}
+
 /***********************************************************************
  *           SetProcessWorkingSetSize    (KERNEL32)
  */
diff --git a/tools/build.c b/tools/build.c
index 952bb9f9cd0..3f39bda055c 100644
--- a/tools/build.c
+++ b/tools/build.c
@@ -68,7 +68,7 @@ static const char * const TypeNames[TYPE_NBTYPES] =
     "extern"        /* TYPE_EXTERN */
 };
 
-#define MAX_ORDINALS	1299
+#define MAX_ORDINALS	2048
 
   /* Callback function used for stub functions */
 #define STUB_CALLBACK \
@@ -826,7 +826,7 @@ static int BuildModule16( FILE *outfile, int max_code_offset,
     pModule->nrname_handle = 0;
     pModule->min_swap_area = 0;
     pModule->expected_version = 0x030a;
-    pModule->pe_module = NULL;
+    pModule->module32 = 0;
     pModule->self = 0;
     pModule->self_loading_sel = 0;
 
@@ -1097,7 +1097,8 @@ static int BuildSpec32File( char * specfile, FILE *outfile )
         if (odp->type == TYPE_INVALID) continue;
         nb_names++;
         /* Some assemblers do not have .word */
-        fprintf( outfile, "\t.byte %d,%d\n", LOBYTE(i), HIBYTE(i) );
+        fprintf( outfile, "\t.byte %d,%d\n",
+                 LOBYTE(i - Base), HIBYTE(i - Base) );
     }
 
     /* Output the DLL names */
diff --git a/win32/Makefile.in b/win32/Makefile.in
index fb594a85983..d42613dba24 100644
--- a/win32/Makefile.in
+++ b/win32/Makefile.in
@@ -19,7 +19,6 @@ C_SRCS = \
 	ordinals.c \
 	process.c \
 	security.c \
-	string32.c \
 	struct32.c \
 	thread.c \
 	time.c \
diff --git a/win32/advapi.c b/win32/advapi.c
index 33b4720c215..5404f41d8ce 100644
--- a/win32/advapi.c
+++ b/win32/advapi.c
@@ -76,6 +76,10 @@ BOOL32 WINAPI LookupPrivilegeValue32A(LPCSTR system,LPCSTR name,LPVOID bla)
 	);
 	return TRUE;
 }
+
+/***********************************************************************
+ *           AdjustTokenPrivileges   [ADVAPI32.10]
+ */
 BOOL32 WINAPI AdjustTokenPrivileges(HANDLE32 TokenHandle,BOOL32 DisableAllPrivileges,
 	LPVOID NewState,DWORD BufferLength,LPVOID PreviousState,
 	LPDWORD ReturnLength )
diff --git a/win32/newfns.c b/win32/newfns.c
index 7954e72439d..31924511712 100644
--- a/win32/newfns.c
+++ b/win32/newfns.c
@@ -38,12 +38,42 @@ BOOL32 WINAPI UTUnRegister(HMODULE32 hModule)
 }
 
 /****************************************************************************
- *		QueryPerformanceCounter (KERNEL32.415)
+ *		QueryPerformanceCounter (KERNEL32.564)
  */
 BOOL32 WINAPI QueryPerformanceCounter(LPLARGE_INTEGER counter)
 {
 	/* FIXME: don't know what are good values */
-	counter->LowPart	= 1;
+	counter->LowPart	= 0;
 	counter->HighPart	= 0;
-	return TRUE;
+	/* FIXME: Set appropriate error */
+	return FALSE;
+}
+
+
+/****************************************************************************
+ *		QueryPerformanceFrequency (KERNEL32.565)
+ */
+BOOL32 WINAPI QueryPerformanceFrequency(LPLARGE_INTEGER frequency)
+{
+	/* FIXME: don't know what are good values */
+	frequency->LowPart	= 0;
+	frequency->HighPart	= 0;
+	/* FIXME: Set appropriate error */
+	return FALSE;
+}
+
+/****************************************************************************
+ *		DeviceIoControl (KERNEL32.188)
+ */
+BOOL32 WINAPI DeviceIoControl(HANDLE32 hDevice, DWORD dwIoControlCode, 
+			      LPVOID lpvlnBuffer, DWORD cblnBuffer,
+			      LPVOID lpvOutBuffer, DWORD cbOutBuffer,
+			      LPDWORD lpcbBytesReturned,
+			      LPOVERLAPPED lpoPverlapped)
+{
+
+        fprintf(stdnimp, "DeviceIoControl Stub called!\n");
+	/* FIXME: Set appropriate error */
+	return FALSE;
+
 }
diff --git a/win32/process.c b/win32/process.c
index 5b26a528025..fd7d1027e5b 100644
--- a/win32/process.c
+++ b/win32/process.c
@@ -417,7 +417,7 @@ BOOL32 WINAPI CreateProcess32A(
 	DWORD creationflags,LPVOID env,LPCSTR curdir,
 	LPSTARTUPINFO32A startupinfo,LPPROCESS_INFORMATION processinfo
 ) {
-	fprintf(stderr,"CreateProcess(%s,%s,%p,%p,%d,%08lx,%p,%s,%p,%p)\n",
+	fprintf(stderr,"CreateProcessA(%s,%s,%p,%p,%d,%08lx,%p,%s,%p,%p), stub\n",
 		appname,cmdline,processattributes,threadattributes,
 		inherithandles,creationflags,env,curdir,startupinfo,processinfo
 	);
@@ -426,8 +426,22 @@ BOOL32 WINAPI CreateProcess32A(
 	return FALSE;
 }
 
+BOOL32 WINAPI CreateProcess32W(
+	LPCWSTR appname,LPWSTR cmdline,LPSECURITY_ATTRIBUTES processattributes,
+        LPSECURITY_ATTRIBUTES threadattributes,BOOL32 inherithandles,
+	DWORD creationflags,LPVOID env,LPCWSTR curdir,
+	LPSTARTUPINFO32W startupinfo,LPPROCESS_INFORMATION processinfo)
+{
+    fprintf(stderr,"CreateProcessW(%p,%p,%p,%p,%d,%08lx,%p,%p,%p,%p) stub\n",
+            appname,cmdline,processattributes,threadattributes,
+            inherithandles,creationflags,env,curdir,startupinfo,processinfo );
+    /* make from lcc uses system as fallback if CreateProcess returns
+       FALSE, so return false */
+    return FALSE;
+}
+
 BOOL32 WINAPI ContinueDebugEvent(DWORD pid,DWORD tid,DWORD contstatus) {
-	fprintf(stderr,"ContinueDebugEvent(%ld,%ld,%ld), stub\n",pid,tid,contstatus);
+	fprintf(stderr,"ContinueDebugEvent(%ld,%ld,%ld) stub\n",pid,tid,contstatus);
 	return TRUE;
 }
 
diff --git a/win32/security.c b/win32/security.c
index d808cd78184..6516eb74673 100644
--- a/win32/security.c
+++ b/win32/security.c
@@ -3,6 +3,7 @@
 #include <string.h>
 
 #include "windows.h"
+#include "winerror.h"
 #include "ntdll.h"
 #include "stddebug.h"
 #include "debug.h"
@@ -199,3 +200,32 @@ BOOL32 WINAPI CopySid (DWORD nDestinationSidLength, LPSID pDestinationSid,
 
     return TRUE;
 }
+
+/***********************************************************************
+ *           LookupAccountSidA   [ADVAPI32.86]
+ */
+BOOL32 WINAPI LookupAccountSid32A(LPCSTR system,PSID sid,
+				  LPCSTR account,LPDWORD accountSize,
+				  LPCSTR domain, LPDWORD domainSize,
+				  PSID_NAME_USE name_use)
+{
+	fprintf(stdnimp,"LookupAccountSid32A(%s,%p,%p,%p,%p,%p,%p),stub\n",
+		system,sid,account,accountSize,domain,domainSize,name_use);
+	SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
+	return FALSE;
+}
+
+/***********************************************************************
+ *           LookupAccountSidW   [ADVAPI32.86]
+ */
+BOOL32 WINAPI LookupAccountSid32W(LPCWSTR system,PSID sid,
+				  LPCWSTR account,LPDWORD accountSize,
+				  LPCWSTR domain, LPDWORD domainSize,
+				  PSID_NAME_USE name_use)
+{
+	fprintf(stdnimp,"LookupAccountSid32W(%p,%p,%p,%p,%p,%p,%p),stub\n",
+		system,sid,account,accountSize,domain,domainSize,name_use);
+	SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
+	return FALSE;
+}
+
diff --git a/win32/string32.c b/win32/string32.c
deleted file mode 100644
index 253ab606feb..00000000000
--- a/win32/string32.c
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Unicode string management
- *
- * Copyright 1996 Martin von Loewis
- *
- * Conversion between Unicode and ISO-8859-1 is inherently lossy,
- * so the conversion code should be called only if it does not matter
- * 
- */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <ctype.h>
-#include "windows.h"
-#include "string32.h"
-#include "xmalloc.h"
-
-LPWSTR STRING32_DupAnsiToUni(LPCSTR src)
-{
-	LPWSTR dest=xmalloc(2*strlen(src)+2);
-	lstrcpyAtoW(dest,src);
-	return dest;
-}
-
-LPWSTR
-STRING32_lstrchrW(LPCWSTR a,WCHAR c) {
-	while(*a) {
-		if (*a==c)
-			return a;
-		a++;
-	}
-	return NULL;
-}
-
-LPWSTR
-STRING32_strdupW(LPCWSTR a) {
-	LPWSTR	b;
-	int	len;
-
-	len=sizeof(WCHAR)*(lstrlen32W(a)+1);
-	b=(LPWSTR)xmalloc(len);
-	memcpy(b,a,len);
-	return b;
-}
diff --git a/windows/dce.c b/windows/dce.c
index df98a119d41..2d3b506d3fb 100644
--- a/windows/dce.c
+++ b/windows/dce.c
@@ -309,7 +309,7 @@ static BOOL32 DCE_GetVisRect( WND *wndPtr, BOOL32 clientArea, RECT32 *lprect )
 {
     *lprect = clientArea ? wndPtr->rectClient : wndPtr->rectWindow;
 
-    if ((wndPtr->dwStyle & WS_VISIBLE) && !(wndPtr->flags & WIN_NO_REDRAW))
+    if (wndPtr->dwStyle & WS_VISIBLE)
     {
 	INT32 xoffset = lprect->left;
 	INT32 yoffset = lprect->top;
@@ -318,8 +318,7 @@ static BOOL32 DCE_GetVisRect( WND *wndPtr, BOOL32 clientArea, RECT32 *lprect )
 	{
 	    wndPtr = wndPtr->parent;
 
-	    if ((wndPtr->flags & WIN_NO_REDRAW) ||
-		(wndPtr->dwStyle & (WS_ICONIC | WS_VISIBLE)) != WS_VISIBLE )
+	    if ( (wndPtr->dwStyle & (WS_ICONIC | WS_VISIBLE)) != WS_VISIBLE )
 		goto fail;
 
 	    xoffset += wndPtr->rectClient.left;
diff --git a/windows/defwnd.c b/windows/defwnd.c
index 80a8d92e91a..e50d00b1560 100644
--- a/windows/defwnd.c
+++ b/windows/defwnd.c
@@ -167,16 +167,14 @@ static LRESULT DEFWND_DefWinProc( WND *wndPtr, UINT32 msg, WPARAM32 wParam,
 	}
 
     case WM_SETREDRAW:
-        if (!wParam)
-        {
-            ValidateRect32( wndPtr->hwndSelf, NULL );
-            wndPtr->flags |= WIN_NO_REDRAW;
-        }
+        if(wParam)
+            SetWindowPos32( wndPtr->hwndSelf, NULL, 0, 0, 0, 0,
+                SWP_SHOWWINDOW | SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER |
+                SWP_NOACTIVATE | SWP_NOREDRAW );
         else
-        {
-            wndPtr->flags &= ~WIN_NO_REDRAW;
-            ShowWindow32( wndPtr->hwndSelf, SW_SHOW );
-        }
+            SetWindowPos32( wndPtr->hwndSelf, NULL, 0, 0, 0, 0,
+                SWP_HIDEWINDOW | SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER |
+                SWP_NOACTIVATE | SWP_NOREDRAW );
         return 0;
 
     case WM_CLOSE:
diff --git a/windows/keyboard.c b/windows/keyboard.c
index 83010946c72..75a8438614b 100644
--- a/windows/keyboard.c
+++ b/windows/keyboard.c
@@ -1227,3 +1227,21 @@ INT32 WINAPI GetKeyboardLayoutList(INT32 nBuff,HKL32 *layouts)
 	return 1;
 }
 
+
+/***********************************************************************
+ *           RegisterHotKey			(USER32.433)
+ */
+BOOL32 WINAPI RegisterHotKey(HWND32 hwnd,INT32 id,UINT32 modifiers,UINT32 vk) {
+	fprintf(stderr,"RegisterHotKey(%08x,%d,%08x,%d), STUB!\n",
+		hwnd,id,modifiers,vk
+	);
+	return TRUE;
+}
+
+/***********************************************************************
+ *           UnregisterHotKey			(USER32.565)
+ */
+BOOL32 WINAPI UnregisterHotKey(HWND32 hwnd,INT32 id) {
+	fprintf(stderr,"UnregisterHotKey(%08x,%d),stub!\n",hwnd,id);
+	return TRUE;
+}
diff --git a/windows/message.c b/windows/message.c
index 9470710a971..01e0c070307 100644
--- a/windows/message.c
+++ b/windows/message.c
@@ -1658,3 +1658,16 @@ BOOL32 WINAPI InSendMessage32(void)
         return 0;
     return (BOOL32)queue->InSendMessageHandle;
 }
+
+/***********************************************************************
+ *           BroadcastSystemMessage    (USER32.12)
+ */
+LONG WINAPI BroadcastSystemMessage(
+	DWORD dwFlags,LPDWORD recipients,UINT32 uMessage,WPARAM32 wParam,
+	LPARAM lParam
+) {
+	fprintf(stdnimp,"BroadcastSystemMessage(%08lx,%08lx,%08x,%08x,%08lx),stub!\n",
+		dwFlags,*recipients,uMessage,wParam,lParam
+	);
+	return 0;
+}
diff --git a/windows/nonclient.c b/windows/nonclient.c
index 923583621d3..e9b24897ab1 100644
--- a/windows/nonclient.c
+++ b/windows/nonclient.c
@@ -161,6 +161,17 @@ static void NC_AdjustRect95( LPRECT16 rect, DWORD style, BOOL32 menu,
 }
 
 
+/***********************************************************************
+ *           DrawCaptionTempA    (USER32.)
+ */
+DWORD
+DrawCaptionTemp32A(HWND32 hwnd,HDC32 hdc,LPRECT32 rect,HFONT32 hfont,DWORD x1,LPCSTR str,DWORD x2) {
+	fprintf(stderr,"DrawCaptionTempA(%08x,%08x,%p,%08x,%08lx,\"%s\",%08lx),tub!\n",
+		hwnd,hdc,rect,hfont,x1,str,x2
+	);
+	return 0;
+}
+
 
 /***********************************************************************
  *           AdjustWindowRect16    (USER.102)
diff --git a/windows/painting.c b/windows/painting.c
index 8699c2edbff..9ab73d4ca37 100644
--- a/windows/painting.c
+++ b/windows/painting.c
@@ -121,13 +121,19 @@ HDC16 WINAPI BeginPaint16( HWND16 hwnd, LPPAINTSTRUCT16 lps )
      */
 
     if (wndPtr->class->style & CS_PARENTDC)
+    {
         /* Don't clip the output to the update region for CS_PARENTDC window */
+	if(hrgnUpdate > 1)
+	    DeleteObject32(hrgnUpdate);
         lps->hdc = GetDCEx16( hwnd, 0, DCX_WINDOWPAINT | DCX_USESTYLE |
                               (bIcon ? DCX_WINDOW : 0) );
+    }
     else
+    {
         lps->hdc = GetDCEx16(hwnd, hrgnUpdate, DCX_INTERSECTRGN |
                              DCX_WINDOWPAINT | DCX_USESTYLE |
                              (bIcon ? DCX_WINDOW : 0) );
+    }
 
     dprintf_win(stddeb,"hdc = %04x\n", lps->hdc);
 
@@ -283,8 +289,8 @@ BOOL32 PAINT_RedrawWindow( HWND32 hwnd, const RECT32 *rectUpdate,
 
     if (!hwnd) hwnd = GetDesktopWindow32();
     if (!(wndPtr = WIN_FindWndPtr( hwnd ))) return FALSE;
-    if (!WIN_IsWindowDrawable( wndPtr, !(flags & RDW_FRAME) ) 
-	|| (wndPtr->flags & WIN_NO_REDRAW)) return TRUE;  /* No redraw needed */
+    if (!WIN_IsWindowDrawable( wndPtr, !(flags & RDW_FRAME) ) )
+        return TRUE;  /* No redraw needed */
 
     bIcon = (wndPtr->dwStyle & WS_MINIMIZE && wndPtr->class->hIcon);
     if (rectUpdate)
diff --git a/windows/queue.c b/windows/queue.c
index ecc6f30b647..6c6cf303587 100644
--- a/windows/queue.c
+++ b/windows/queue.c
@@ -794,6 +794,20 @@ DWORD WINAPI GetQueueStatus16( UINT16 flags )
     return ret & MAKELONG( flags, flags );
 }
 
+/***********************************************************************
+ *           GetQueueStatus32   (USER32.283)
+ */
+DWORD WINAPI GetQueueStatus32( UINT32 flags )
+{
+    MESSAGEQUEUE *queue;
+    DWORD ret;
+
+    if (!(queue = (MESSAGEQUEUE *)GlobalLock16( GetTaskQueue(0) ))) return 0;
+    ret = MAKELONG( queue->changeBits, queue->wakeBits );
+    queue->changeBits = 0;
+    return ret & MAKELONG( flags, flags );
+}
+
 
 /***********************************************************************
  *           GetInputState16   (USER.335)
diff --git a/windows/win.c b/windows/win.c
index 11c45b817aa..5f6fbc005a2 100644
--- a/windows/win.c
+++ b/windows/win.c
@@ -239,7 +239,7 @@ HWND32 WIN_FindWinToRepaint( HWND32 hwnd, HQUEUE16 hQueue )
 
     for ( ; pWnd ; pWnd = pWnd->next )
     {
-        if (!(pWnd->dwStyle & WS_VISIBLE) || (pWnd->flags & WIN_NO_REDRAW))
+        if (!(pWnd->dwStyle & WS_VISIBLE))
         {
             dprintf_win( stddeb, "FindWinToRepaint: skipping window %04x\n",
                          pWnd->hwndSelf );
@@ -1783,14 +1783,23 @@ HWND32 WINAPI SetParent32( HWND32 hwndChild, HWND32 hwndNewParent )
 
     WND *wndPtr = WIN_FindWndPtr( hwndChild );
     WND *pWndParent = WIN_FindWndPtr( hwndNewParent );
-    if (!wndPtr || !pWndParent || !(wndPtr->dwStyle & WS_CHILD)) return 0;
 
+    if (!wndPtr || !pWndParent) return 0;
     oldParent = wndPtr->parent->hwndSelf;
 
+    if (!(wndPtr->dwStyle & WS_CHILD)) {
+	if (wndPtr->window) {
+	    /* Toplevel window needs to be reparented.  Used by Tk 8.0 */
+	    XDestroyWindow( display, wndPtr->window );
+	    wndPtr->window = None;
+	}
+	wndPtr->dwStyle |= WS_CHILD;
+    }
+
     WIN_UnlinkWindow(hwndChild);
     if (hwndNewParent) wndPtr->parent = pWndParent;
     WIN_LinkWindow(hwndChild, HWND_BOTTOM);
-    
+
     if (IsWindowVisible32(hwndChild)) UpdateWindow32(hwndChild);
     
     return oldParent;
diff --git a/windows/winhelp.c b/windows/winhelp.c
index 89be98bf22c..3b0576f1fa7 100644
--- a/windows/winhelp.c
+++ b/windows/winhelp.c
@@ -37,7 +37,7 @@ BOOL32 WINAPI WinHelp32A( HWND32 hWnd, LPCSTR lpHelpFile, UINT32 wCommand,
             if(WinExec32("winhelp.exe -x",SW_SHOWNORMAL)<=32)
 		return FALSE;
 	/* FIXME: Should be directed yield, to let winhelp open the window */
-	Yield();
+	Yield16();
 	if(!WM_WINHELP) {
 		WM_WINHELP=RegisterWindowMessage32A("WM_WINHELP");
 		if(!WM_WINHELP)
diff --git a/windows/winpos.c b/windows/winpos.c
index 1f28f5f3385..8b51066ec0f 100644
--- a/windows/winpos.c
+++ b/windows/winpos.c
@@ -669,6 +669,15 @@ HWND16 WINAPI GetShellWindow16(void)
     return GetShellWindow32();
 }
 
+/*******************************************************************
+ *         SetShellWindow32    (USER32.287)
+ */
+HWND32 WINAPI SetShellWindow32(HWND32 hwndshell)
+{
+    fprintf( stdnimp, "SetShellWindow(%08x): empty stub\n",hwndshell );
+    return 0;
+}
+
 
 /*******************************************************************
  *         GetShellWindow32    (USER32.287)
@@ -2054,10 +2063,7 @@ BOOL32 WINAPI SetWindowPos32( HWND32 hwnd, HWND32 hwndInsertAfter,
     if (!(wndPtr = WIN_FindWndPtr( hwnd ))) return FALSE;
 
     if(wndPtr->dwStyle & WS_VISIBLE)
-    {
-        if(!(wndPtr->flags & WIN_NO_REDRAW))
-            flags &= ~SWP_SHOWWINDOW;
-    }
+        flags &= ~SWP_SHOWWINDOW;
     else
     {
 	uFlags |= SMC_NOPARENTERASE; 
@@ -2065,9 +2071,6 @@ BOOL32 WINAPI SetWindowPos32( HWND32 hwnd, HWND32 hwndInsertAfter,
 	if (!(flags & SWP_SHOWWINDOW)) flags |= SWP_NOREDRAW;
     }
 
-    if(flags & SWP_SHOWWINDOW)
-       wndPtr->flags&=~WIN_NO_REDRAW;
-
 /*     Check for windows that may not be resized 
        FIXME: this should be done only for Windows 3.0 programs 
        if (flags & (SWP_SHOWWINDOW | SWP_HIDEWINDOW ) )
@@ -2313,12 +2316,25 @@ BOOL32 WINAPI SetWindowPos32( HWND32 hwnd, HWND32 hwndInsertAfter,
 	wndPtr->dwStyle |= WS_VISIBLE;
         if (wndPtr->window)
         {
+	    HWND32 focus, curr;
+
 	    if( uFlags & SMC_SETXPOS )
 	    {
               WINPOS_SetXWindowPos( &winpos );
               winpos.hwndInsertAfter = tempInsertAfter;
 	    }
             XMapWindow( display, wndPtr->window );
+
+	    /* If focus was set to an unmapped window, reset X focus now */
+	    focus = curr = GetFocus32();
+	    while (curr != NULL) {
+		if (curr == hwnd) {
+		    SetFocus32( NULL );
+		    SetFocus32( focus );
+		    break;
+		}
+		curr = GetParent32(curr);
+	    }
         }
         else
         {
-- 
GitLab