Release 980628

Sun Jun 28 18:37:02 1998  Alexandre Julliard  <julliard@lrc.epfl.ch>

	* [if1632/signal.c] [miscemu/instr.c] [memory/virtual.c]
	Moved page-fault handling to INSTR_EmulateInstruction.

	* [scheduler/thread.c]
	Added locking and check for own thread in Suspend/ResumeThread.

Sat Jun 27 21:25:21 1998  Ulrich Weigand <weigand@informatik.uni-erlangen.de>

	* [objects/dib.c] [objects/bitmap.c] [objects/oembitmap.c] 
	  [graphics/x11drv/bitblt.c] [include/bitmap.h]
	Improved DIB section handling using page fault handlers.
	(Note: This patch includes code contributed by Matthew J. Francis.)

	* [memory/virtual.c] [if1632/signal.c] [include/global.h]
	Page Fault handler support added.

	* [if1632/signal.c] [loader/signal.c] [tools/build.c] [misc/system.c]
	  [misc/winsock_dns.c] [include/sig_context.h] [include/thread.h]
	16-bit %fs handling improved: Always preserve 16-bit %fs value,
	always restore 32-bit %fs value for signal handlers.

	* [if1632/thunk.c] [loader/module.c] [misc/callback.c] [windows/user.c]
	  [loader/ne/resource.c] [include/callback.h] [include/module.h]
	  [if1632/kernel.spec] [if1632/wprocs.spec]
	Resource Handler function pointer stored as 16-bit SEGPTR.

	* [loader/task.c] [windows/win.c] [windows/winpos.c] [if1632/user.spec]
	  [if1632/kernel.spec] [loader/ne/module.c]
	Some minor incompatibilities fixed (Win32s relies on those):
	GetExePtr, IsWindow16 should set ES on return; WINPOS_SendNCCalcSize
	should cope with having the WINDOWPOS structure trashed;
	the OFSTRUCT in the NE module image should be placed *last*.

	* [include/windows.h]
	Missing prototype for FlushViewOfFile.

	* [loader/task.c]
	Bugfix: Command line should *not* start with a blank.
	
	* [loader/ne/segment.c]
	Bugfix: Fixups to offset 0 were never applied.

	* [misc/lstr.c]
	Use debugstr_a in OutputDebugString16.

	* [msdos/dpmi.c]
	Stub for int 31 BL=2f AX=7a20 (NetWare: Get VLM Call Address) added.

	* [msdos/int21.c]
	Stub for int 21 AX=440d CL=6f (get drive map information) added.

Fri Jun 26 18:08:30 1998  Rein Klazes <rklazes@casema.net>

	* [windows/winpos.c]
	Fix small buglet that mixed up maximized and minimized windows.

	* [include/x11drv.h] [objects/dc.c] [graphics/x11drv/pen.c]
	  [graphics/x11drv/graphics.c]
	Fix some bugs with lines joining styles. Draws rectangles
	with thick pens now correctly.

Fri Jun 26 16:22:23 1998  James Juran <jrj120@psu.edu>

	* [misc/shell.c]
	Fixed bug I introduced last release in InternalExtractIcon.

	* [win32/file.c]
	Added documentation for CreateFile32A.

	* [documentation/wine.man]
	Updated manpage.	

	* [ChangeLog]
	Added my entry from last release.

Fri Jun 26 13:33:30 1998  Huw D M Davies <daviesh@abacus.physics.ox.ac.uk>

	* [graphics/psdrv/*] [if1632/wineps.spec] [include/psdrv.h]
	  [include/print.h] [objects/gdiobj.c]
	First stages of an internal Postscript driver. See
	graphics/psdrv/README . Should print text (badly) from win3.1 notepad,
	write and winword6.

	* [documentation/printing]
	Some notes on printing.

	* [controls/edit.c]
	Strip off WS_BORDER in WM_NCREATE, edit draws its own rectangle.
	EC_USEFONTINFO seems to be used as a left/right value for EM_SETMARGINS
	and not as an action as the docs say. This actually makes more sense.
	Scroll the caret back to zero after a WM_SETTEXT.

Fri Jun 26 10:56:25 1998  Marcus Meissner <marcus@jet.franken.de>

	* [if1632/snoop.c]
	Added win16 inter-dll snooping.

	* [win32/ordinals.c]
	KERNEL_485 is GetProcessDword.

	* [include/xmalloc.h][include/bitmap.h][misc/xmalloc.c]
	Added xcalloc so we 0 initialize XImages. 
	Fixes/Hides the 'junk around MOPYFish'.

	* [misc/ntdll.c]
	Some stubs added.

Thu Jun 25 15:22:43 1998  Adrian Harvey <adrian@select.com.au>

	* [scheduler/thread.c] 
	Implemented SuspendThread and ResumeThread.

Thu Jun 25 00:55:03 1998  Peter Hunnisett <hunnise@nortel.ca>

	* [include/debug.h,dplay.h,dsound.h][multimedia/dsound.c,dplay.c]
	  [relay32/dplayx.spec,dplay.spec][multimedia/Makefile.in]
	  [documentation/status/directplay]
	Added preliminary support for DirectPlay & DirectPlayLobby. Moved the
	preliminary stubs put in the dsound files into two new files
	dplay.h and dplay.c.
	Added new debug channel (dplay) for this.
	Created new document to keep track of implementation.

	* [include/winioctl.h][win32/device.c]
	Added some framework in DeviceIoControl to, in the future, support
	the "builtin" windows dwIoControlCodes. Added new header file
	winioctl.h . 

	* [multimedia/mmsystem.c]
	Added slightly improved debugging information for PlaySound.

Wed Jun 24 12:00:00 1998  Juergen Schmied <juergen.schmied@metronet.de> 

	* [files/profile.c][graphics/x11drv/xfont.c][loader/module.c]
	Changed lstrcmpi32A to strcasecmp, lstrncmpi32A to strncasecmp,
	lstrcpy32A to strcpy, lstrlen32A to strlen, lstrcmp32A to strcmp
	because it's not necessary to support locale on such places.
	It causes a huge overhead and even fails sometimes 

	* [include/oleauto.h][include/winerror.h]
	Added some ole-related constants.

	* [misc/shell.c]
	SHELL32_DllGetClassObject, SHGetSpecialFolderLocation,
	SHGetPathFromIDList improved the stubs

	* [ole/folders.c]
	IShellFolder* functions rewrote the stubs so don't crash and give
	something sensible back, started implementation of.

	* [ole/typelib.c][relay32/oleaut32.spec]
	LoadTypeLib32, RegisterTypeLib stub.

	* [ole/ole2nls.c]
	Fixed a buffer overrun in CompareString32A.
	Test for a bad pointer in LCMapString32A (happens
	in winhlp32 while building a index for searching). 

	* [relay32/oleaut32.spec] [ole/typelib.c]
	Added stub for LoadTypeLib (ole32) to make excel95 happy.

Tue Jun 23 22:47:09 1998  Alex Priem <alexp@sci.kun.nl>

	* [files/profile.c] [relay32/kernel32.spec]
	Added WritePrivateProfileStructA, GetPrivateProfileStructA,
	GetPrivateProfileSectionNames16.

Tue Jun 23 01:34:43 1998  Pascal Cuoq <pcuoq@ens-lyon.fr>

	* [ole/ole2nls.c]
	GetStringTypeEx32A: Implemented CT_CTYPE2 and CT_CTYPE3 cases.
	LCMapString32A: Map final '\0' for '\0'-terminated strings.

	* [misc/shellord.c] [files/profile.c] [graphics/driver.c] 
	  [loader/module.c] [msdos/int21.c] [windows/driver.c] [files/drive.c]
	Changed lstrcmpi32A -> strcasecmp.  Should be OK in these places.

Sat Jun 20 23:40:00 1998  Bertho Stultiens <bertho@akhphd.au.dk>

	* [tools/wrc/]
	Wrc version 1.0.2 (20-Jun-1998). Please revert to 
	the file tools/wrc/CHANGES for details.

Sat Jun 20 14:58:00 1998  Marcel Baur  <mbaur@g26.ethz.ch>

	* [ole/ole2nls.c] [ole/nls/*]
	Added the first 57 nls files, most are not yet complete.

Wed Jun 17 11:16:54 1998  David Luyer <luyer@ucs.uwa.edu.au>

	* [relay32/relay386.c] [if1632/relay.c]
	Move debug_relay_(include|exclude)_list handling into
	seperate function RELAY_ShowDebugmsgsRelay().  Include
	checking of this for 16 bit calls (originally only
	32-bit calls).

	* [relay32/snoop.c] [misc/main.c]
	Add debug_snoop_(include|exclude)_list as per the relay stuff.
	Fix typo and add information on -debugmsg +/-relay=... in
	help on -debugmsg.  Refer to availability of snoop too.

Tue Jun 10 22:00:18 1998  Eric Kohl <ekohl@abo.rhein-zeitung.de>

	* [controls/header.c][include/header.h][include/commctrl.h]
	Added owner draw support.

	* [windows/nonclient.c][windows/sysmetics.c]
	Fixed menu bar height for Win95 look.
	Split NC_AdjustRect95() into NC_AdjustRectOuter95() and
	NC_AdjustRectInner95 to fix a menu bar bug.
	Improved Win95 look.

	* [controls/progress.c]
	Improved drawing code. Borders will be drawn by non-client code.

	* [controls/updown.c]
	Changed memory allocation and fixed some bugs.

	* [controls/toolbar.c]
	Fixed TB_BUTTONSTRUCTSIZE bug in MFC programs.
	Several improvements.

	* [misc/shell.c]
	Added stub for BrowseForFoldersA().

	* [misc/shellord.c]
	Added stub for SHELL32_147().

	* [controls/comctl32undoc.c]
	Minor changes.

	* [documentation/common_controls]
	New File: Documentation about development status, undocumented
	features and functions of the common controls.
diff --git a/ANNOUNCE b/ANNOUNCE
index 1697c1e..605e438 100644
--- a/ANNOUNCE
+++ b/ANNOUNCE
@@ -1,13 +1,15 @@
-This is release 980614 of Wine, the MS Windows emulator.  This is still a
+This is release 980628 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-980614: (see ChangeLog for details)
-	- Many drawing fixes.
-	- Inter-DLL calls snooping.
+WHAT'S NEW with Wine-980628: (see ChangeLog for details)
+	- Common controls improvements.
+	- Win16 DLL snooping.
+	- Preliminary internal Postscript driver.
+	- Improved DIB section handling.
 	- Lots of bug fixes.
 
 See the README file in the distribution for installation instructions.
@@ -16,10 +18,10 @@
 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-980614.tar.gz
-  ftp://tsx-11.mit.edu/pub/linux/ALPHA/Wine/development/Wine-980614.tar.gz
-  ftp://ftp.infomagic.com/pub/mirrors/linux/sunsite/ALPHA/wine/development/Wine-980614.tar.gz
-  ftp://ftp.progsoc.uts.edu.au/pub/Wine/development/Wine-980614.tar.gz
+  ftp://sunsite.unc.edu/pub/Linux/ALPHA/wine/development/Wine-980628.tar.gz
+  ftp://tsx-11.mit.edu/pub/linux/ALPHA/Wine/development/Wine-980628.tar.gz
+  ftp://ftp.infomagic.com/pub/mirrors/linux/sunsite/ALPHA/wine/development/Wine-980628.tar.gz
+  ftp://ftp.progsoc.uts.edu.au/pub/Wine/development/Wine-980628.tar.gz
 
 It should also be available from any site that mirrors tsx-11 or sunsite.
 
diff --git a/BUGS b/BUGS
index 8e26b04..9f08c48 100644
--- a/BUGS
+++ b/BUGS
@@ -13,17 +13,21 @@
 
  * Incomplete thread/process scheduling support in Win32 code.
 
+ * Threading for non Linux systems completely missing. (might use
+   LWPs in Solaris, FreeBSD? NetBSD? SCO?)
+
  * Very alpha printing code using win16 drivers.
-   We should add a WINE internal PostScript driver (all other printers
-   can be supported using ghostscript filters).
 
- * Extremely alpha Win95 interface code.
+ * Very alpha internal Postscript driver. [h.davies1@physics.ox.ac.uk]
 
+ * Extremely alpha Win95 interface code.		
  * No OLE2 and OLE32 support (including OLE2 interfaces etc.).
+	 (started work on pidl-handling, IShellFolders IEnumIdLists 
+	 and SH* functions juergen.schmied@metronet.de)	
 
  * No MS Video support. [just started, marcus@jet.franken.de]
 
- * COMDLG32 support not complete yet [bertho@akhphd.au.dk?]
+ * COMDLG32 support not complete yet [bertho@akhphd.au.dk]
 
  * COMMCTRL/COMCTL32 support in progress [ekohl@abo.rhein-zeitung.de].
 
diff --git a/ChangeLog b/ChangeLog
index 2c4b965..143d761 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,4 +1,242 @@
 ----------------------------------------------------------------------
+Sun Jun 28 18:37:02 1998  Alexandre Julliard  <julliard@lrc.epfl.ch>
+
+	* [if1632/signal.c] [miscemu/instr.c] [memory/virtual.c]
+	Moved page-fault handling to INSTR_EmulateInstruction.
+
+	* [scheduler/thread.c]
+	Added locking and check for own thread in Suspend/ResumeThread.
+
+Sat Jun 27 21:25:21 1998  Ulrich Weigand <weigand@informatik.uni-erlangen.de>
+
+	* [objects/dib.c] [objects/bitmap.c] [objects/oembitmap.c] 
+	  [graphics/x11drv/bitblt.c] [include/bitmap.h]
+	Improved DIB section handling using page fault handlers.
+	(Note: This patch includes code contributed by Matthew J. Francis.)
+
+	* [memory/virtual.c] [if1632/signal.c] [include/global.h]
+	Page Fault handler support added.
+
+	* [if1632/signal.c] [loader/signal.c] [tools/build.c] [misc/system.c]
+	  [misc/winsock_dns.c] [include/sig_context.h] [include/thread.h]
+	16-bit %fs handling improved: Always preserve 16-bit %fs value,
+	always restore 32-bit %fs value for signal handlers.
+
+	* [if1632/thunk.c] [loader/module.c] [misc/callback.c] [windows/user.c]
+	  [loader/ne/resource.c] [include/callback.h] [include/module.h]
+	  [if1632/kernel.spec] [if1632/wprocs.spec]
+	Resource Handler function pointer stored as 16-bit SEGPTR.
+
+	* [loader/task.c] [windows/win.c] [windows/winpos.c] [if1632/user.spec]
+	  [if1632/kernel.spec] [loader/ne/module.c]
+	Some minor incompatibilities fixed (Win32s relies on those):
+	GetExePtr, IsWindow16 should set ES on return; WINPOS_SendNCCalcSize
+	should cope with having the WINDOWPOS structure trashed;
+	the OFSTRUCT in the NE module image should be placed *last*.
+
+	* [include/windows.h]
+	Missing prototype for FlushViewOfFile.
+
+	* [loader/task.c]
+	Bugfix: Command line should *not* start with a blank.
+	
+	* [loader/ne/segment.c]
+	Bugfix: Fixups to offset 0 were never applied.
+
+	* [misc/lstr.c]
+	Use debugstr_a in OutputDebugString16.
+
+	* [msdos/dpmi.c]
+	Stub for int 31 BL=2f AX=7a20 (NetWare: Get VLM Call Address) added.
+
+	* [msdos/int21.c]
+	Stub for int 21 AX=440d CL=6f (get drive map information) added.
+
+Fri Jun 26 18:08:30 1998  Rein Klazes <rklazes@casema.net>
+
+	* [windows/winpos.c]
+	Fix small buglet that mixed up maximized and minimized windows.
+
+	* [include/x11drv.h] [objects/dc.c] [graphics/x11drv/pen.c]
+	  [graphics/x11drv/graphics.c]
+	Fix some bugs with lines joining styles. Draws rectangles
+	with thick pens now correctly.
+
+Fri Jun 26 16:22:23 1998  James Juran <jrj120@psu.edu>
+
+	* [misc/shell.c]
+	Fixed bug I introduced last release in InternalExtractIcon.
+
+	* [win32/file.c]
+	Added documentation for CreateFile32A.
+
+	* [documentation/wine.man]
+	Updated manpage.	
+
+	* [ChangeLog]
+	Added my entry from last release.
+
+Fri Jun 26 13:33:30 1998  Huw D M Davies <daviesh@abacus.physics.ox.ac.uk>
+
+	* [graphics/psdrv/*] [if1632/wineps.spec] [include/psdrv.h]
+	  [include/print.h] [objects/gdiobj.c]
+	First stages of an internal Postscript driver. See
+	graphics/psdrv/README . Should print text (badly) from win3.1 notepad,
+	write and winword6.
+
+	* [documentation/printing]
+	Some notes on printing.
+
+	* [controls/edit.c]
+	Strip off WS_BORDER in WM_NCREATE, edit draws its own rectangle.
+	EC_USEFONTINFO seems to be used as a left/right value for EM_SETMARGINS
+	and not as an action as the docs say. This actually makes more sense.
+	Scroll the caret back to zero after a WM_SETTEXT.
+
+Fri Jun 26 10:56:25 1998  Marcus Meissner <marcus@jet.franken.de>
+
+	* [if1632/snoop.c]
+	Added win16 inter-dll snooping.
+
+	* [win32/ordinals.c]
+	KERNEL_485 is GetProcessDword.
+
+	* [include/xmalloc.h][include/bitmap.h][misc/xmalloc.c]
+	Added xcalloc so we 0 initialize XImages. 
+	Fixes/Hides the 'junk around MOPYFish'.
+
+	* [misc/ntdll.c]
+	Some stubs added.
+
+Thu Jun 25 15:22:43 1998  Adrian Harvey <adrian@select.com.au>
+
+	* [scheduler/thread.c] 
+	Implemented SuspendThread and ResumeThread.
+
+Thu Jun 25 00:55:03 1998  Peter Hunnisett <hunnise@nortel.ca>
+
+	* [include/debug.h,dplay.h,dsound.h][multimedia/dsound.c,dplay.c]
+	  [relay32/dplayx.spec,dplay.spec][multimedia/Makefile.in]
+	  [documentation/status/directplay]
+	Added preliminary support for DirectPlay & DirectPlayLobby. Moved the
+	preliminary stubs put in the dsound files into two new files
+	dplay.h and dplay.c.
+	Added new debug channel (dplay) for this.
+	Created new document to keep track of implementation.
+
+	* [include/winioctl.h][win32/device.c]
+	Added some framework in DeviceIoControl to, in the future, support
+	the "builtin" windows dwIoControlCodes. Added new header file
+	winioctl.h . 
+
+	* [multimedia/mmsystem.c]
+	Added slightly improved debugging information for PlaySound.
+
+Wed Jun 24 12:00:00 1998  Juergen Schmied <juergen.schmied@metronet.de> 
+
+	* [files/profile.c][graphics/x11drv/xfont.c][loader/module.c]
+	Changed lstrcmpi32A to strcasecmp, lstrncmpi32A to strncasecmp,
+	lstrcpy32A to strcpy, lstrlen32A to strlen, lstrcmp32A to strcmp
+	because it's not necessary to support locale on such places.
+	It causes a huge overhead and even fails sometimes 
+
+	* [include/oleauto.h][include/winerror.h]
+	Added some ole-related constants.
+
+	* [misc/shell.c]
+	SHELL32_DllGetClassObject, SHGetSpecialFolderLocation,
+	SHGetPathFromIDList improved the stubs
+
+	* [ole/folders.c]
+	IShellFolder* functions rewrote the stubs so don't crash and give
+	something sensible back, started implementation of.
+
+	* [ole/typelib.c][relay32/oleaut32.spec]
+	LoadTypeLib32, RegisterTypeLib stub.
+
+	* [ole/ole2nls.c]
+	Fixed a buffer overrun in CompareString32A.
+	Test for a bad pointer in LCMapString32A (happens
+	in winhlp32 while building a index for searching). 
+
+	* [relay32/oleaut32.spec] [ole/typelib.c]
+	Added stub for LoadTypeLib (ole32) to make excel95 happy.
+
+Tue Jun 23 22:47:09 1998  Alex Priem <alexp@sci.kun.nl>
+
+	* [files/profile.c] [relay32/kernel32.spec]
+	Added WritePrivateProfileStructA, GetPrivateProfileStructA,
+	GetPrivateProfileSectionNames16.
+
+Tue Jun 23 01:34:43 1998  Pascal Cuoq <pcuoq@ens-lyon.fr>
+
+	* [ole/ole2nls.c]
+	GetStringTypeEx32A: Implemented CT_CTYPE2 and CT_CTYPE3 cases.
+	LCMapString32A: Map final '\0' for '\0'-terminated strings.
+
+	* [misc/shellord.c] [files/profile.c] [graphics/driver.c] 
+	  [loader/module.c] [msdos/int21.c] [windows/driver.c] [files/drive.c]
+	Changed lstrcmpi32A -> strcasecmp.  Should be OK in these places.
+
+Sat Jun 20 23:40:00 1998  Bertho Stultiens <bertho@akhphd.au.dk>
+
+	* [tools/wrc/]
+	Wrc version 1.0.2 (20-Jun-1998). Please revert to 
+	the file tools/wrc/CHANGES for details.
+
+Sat Jun 20 14:58:00 1998  Marcel Baur  <mbaur@g26.ethz.ch>
+
+	* [ole/ole2nls.c] [ole/nls/*]
+	Added the first 57 nls files, most are not yet complete.
+
+Wed Jun 17 11:16:54 1998  David Luyer <luyer@ucs.uwa.edu.au>
+
+	* [relay32/relay386.c] [if1632/relay.c]
+	Move debug_relay_(include|exclude)_list handling into
+	seperate function RELAY_ShowDebugmsgsRelay().  Include
+	checking of this for 16 bit calls (originally only
+	32-bit calls).
+
+	* [relay32/snoop.c] [misc/main.c]
+	Add debug_snoop_(include|exclude)_list as per the relay stuff.
+	Fix typo and add information on -debugmsg +/-relay=... in
+	help on -debugmsg.  Refer to availability of snoop too.
+
+Tue Jun 10 22:00:18 1998  Eric Kohl <ekohl@abo.rhein-zeitung.de>
+
+	* [controls/header.c][include/header.h][include/commctrl.h]
+	Added owner draw support.
+
+	* [windows/nonclient.c][windows/sysmetics.c]
+	Fixed menu bar height for Win95 look.
+	Split NC_AdjustRect95() into NC_AdjustRectOuter95() and
+	NC_AdjustRectInner95 to fix a menu bar bug.
+	Improved Win95 look.
+
+	* [controls/progress.c]
+	Improved drawing code. Borders will be drawn by non-client code.
+
+	* [controls/updown.c]
+	Changed memory allocation and fixed some bugs.
+
+	* [controls/toolbar.c]
+	Fixed TB_BUTTONSTRUCTSIZE bug in MFC programs.
+	Several improvements.
+
+	* [misc/shell.c]
+	Added stub for BrowseForFoldersA().
+
+	* [misc/shellord.c]
+	Added stub for SHELL32_147().
+
+	* [controls/comctl32undoc.c]
+	Minor changes.
+
+	* [documentation/common_controls]
+	New File: Documentation about development status, undocumented
+	features and functions of the common controls.
+
+----------------------------------------------------------------------
 Sun Jun 15 10:30:35 1998  Andreas Mohr <100.30936@germany.net>
 
 	* [files/dos_fs.c] [files/file.c] [if1632/wprocs.spec]
@@ -112,6 +350,27 @@
 	Added stubs for OpenDesktopA, SetThreadDesktop, and
 	SetUserObjectInformationA.
 
+Wed Jun 10  20:28:08 1998  James Juran  <jrj120@psu.edu>
+
+	* [debugger/break.c]
+	Fixed bug introduced in 980503 that broke the -debug command 
+	line option for PE executable files.
+
+	* [configure.in] [include/acconfig.h] [include/debugtools.h]
+	  [documentation/debug-msgs]
+	Added 'configure' options to compile out debugging messages.
+	Use --disable-debug to disable all debugging messages, and
+	--disable-trace to just disable TRACE messages.  This results
+	in a stripped executable that is 15-20% smaller.  This option
+	is very much untested--don't expect it to work.
+
+	* [documentation/debug-msgs] [documentation/debugging]
+	Minor updates.
+
+	* [*/*.c]
+	Fixed some compile warnings.  This also includes the
+	compile_warnings_trivial patch from WineHQ.
+
 Tue Jun 10 22:00:18 1998  Eric Kohl <ekohl@abo.rhein-zeitung.de>
 
 	* [windows/sysmetrics.c][include/sysmetrics.h]
diff --git a/Makefile.in b/Makefile.in
index a0674fe..4f95dbd 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -50,6 +50,7 @@
 
 EMUSUBDIRS = \
 	debugger \
+	graphics/psdrv \
 	graphics/win16drv \
 	if1632 \
 	miscemu
@@ -95,6 +96,7 @@
 
 EMUOBJS = \
 	debugger/debugger.o \
+	graphics/psdrv/psdrv.o \
 	graphics/win16drv/win16drv.o \
 	if1632/if1632.o \
 	miscemu/miscemu.o
diff --git a/configure b/configure
index 409b3f5..b008d4d 100755
--- a/configure
+++ b/configure
@@ -2447,7 +2447,7 @@
 fi
 
 
-for ac_func in clone getpagesize memmove sigaltstack strerror stricmp tcgetattr timegm usleep wait4 waitpid
+for ac_func in clone getpagesize memmove sigaltstack strerror stricmp tcgetattr timegm usleep wait4 waitpid vfscanf
 do
 echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
 echo "configure:2454: checking for $ac_func" >&5
@@ -3303,6 +3303,7 @@
 files/Makefile
 graphics/Makefile
 graphics/metafiledrv/Makefile
+graphics/psdrv/Makefile
 graphics/win16drv/Makefile
 graphics/x11drv/Makefile
 if1632/Makefile
@@ -3435,6 +3436,7 @@
 files/Makefile
 graphics/Makefile
 graphics/metafiledrv/Makefile
+graphics/psdrv/Makefile
 graphics/win16drv/Makefile
 graphics/x11drv/Makefile
 if1632/Makefile
diff --git a/configure.in b/configure.in
index ae9944c..f33f07f 100644
--- a/configure.in
+++ b/configure.in
@@ -235,7 +235,7 @@
 
 dnl **** Check for functions and header files ****
 
-AC_CHECK_FUNCS(clone getpagesize memmove sigaltstack strerror stricmp tcgetattr timegm usleep wait4 waitpid)
+AC_CHECK_FUNCS(clone getpagesize memmove sigaltstack strerror stricmp tcgetattr timegm usleep wait4 waitpid vfscanf)
 AC_CHECK_HEADERS(wctype.h sys/syscall.h syscall.h sys/param.h sys/vfs.h sys/mount.h sys/statfs.h float.h linux/cdrom.h sys/cdio.h sys/filio.h sys/modem.h strings.h sys/strtio.h)
 AC_HEADER_STAT()
 AC_C_CONST()
@@ -442,6 +442,7 @@
 files/Makefile
 graphics/Makefile
 graphics/metafiledrv/Makefile
+graphics/psdrv/Makefile
 graphics/win16drv/Makefile
 graphics/x11drv/Makefile
 if1632/Makefile
diff --git a/controls/comctl32undoc.c b/controls/comctl32undoc.c
index 2719e3b..88b57d5 100644
--- a/controls/comctl32undoc.c
+++ b/controls/comctl32undoc.c
@@ -11,6 +11,7 @@
  *
  * TODO
  *     - Fix DSA_InsertItem.
+ *     - Fix DSA_GetItem.
  *     - Write documentation.
  */
 
@@ -39,10 +40,6 @@
 } DPA_DATA, *LPDPA_DATA;
 
 
-DWORD WINAPI Alloc (DWORD);
-DWORD WINAPI ReAlloc (DWORD, DWORD);
-DWORD WINAPI Free (DWORD);
-
 DWORD WINAPI DSA_Create (DWORD, DWORD);
 
 
@@ -51,31 +48,32 @@
 DWORD WINAPI DPA_InsertPtr (DWORD, DWORD, DWORD);
 
 
-LPSTR WINAPI COMCTL32_StrChrA (LPSTR lpString, CHAR cChar);
+
 
 
 DWORD WINAPI
-Alloc (DWORD dwParam1)
+COMCTL32_Alloc (DWORD dwParam)
 {
     DWORD dwPtr;
 
-    dwPtr = (DWORD)HeapAlloc (SystemHeap, HEAP_ZERO_MEMORY, dwParam1);
+    dwPtr = (DWORD)HeapAlloc (GetProcessHeap (), HEAP_ZERO_MEMORY, dwParam);
 
-    TRACE (commctrl, "(0x%08lx) ret=0x%08lx\n", dwParam1, dwPtr);
+    TRACE (commctrl, "(0x%08lx) ret=0x%08lx\n", dwParam, dwPtr);
 
     return dwPtr;
 }
 
 
 DWORD WINAPI
-ReAlloc (DWORD dwParam1, DWORD dwParam2)
+COMCTL32_ReAlloc (DWORD dwParam1, DWORD dwParam2)
 {
     DWORD dwPtr;
 
     if (dwParam1 == 0)
-	dwPtr = (DWORD)HeapAlloc (SystemHeap, HEAP_ZERO_MEMORY, dwParam2);
+	dwPtr = (DWORD)HeapAlloc (GetProcessHeap (), HEAP_ZERO_MEMORY,
+				  dwParam2);
     else
-	dwPtr = (DWORD)HeapReAlloc (SystemHeap, HEAP_ZERO_MEMORY, 
+	dwPtr = (DWORD)HeapReAlloc (GetProcessHeap (), HEAP_ZERO_MEMORY,
 				    (LPVOID)dwParam1, dwParam2);
 
     TRACE (commctrl, "(0x%08lx 0x%08lx) ret=0x%08lx\n",
@@ -86,15 +84,21 @@
 
 
 DWORD WINAPI
-Free (DWORD dwParam1)
+COMCTL32_Free (DWORD dwParam)
 {
-    TRACE (commctrl, "(0x%08lx)\n", dwParam1);
-    HeapFree (SystemHeap, 0, (LPVOID)dwParam1);
+    TRACE (commctrl, "(0x%08lx)\n", dwParam);
+    HeapFree (GetProcessHeap (), 0, (LPVOID)dwParam);
 
     return 0;
 }
 
 
+DWORD WINAPI
+COMCTL32_GetSize (DWORD dwParam)
+{
+    TRACE (commctrl, "(0x%08lx)\n", dwParam);
+    return (HeapSize (GetProcessHeap (), 0, (LPVOID)dwParam));
+}
 
 
 
@@ -136,6 +140,36 @@
 
 
 DWORD WINAPI
+DSA_GetItem (DWORD dwParam1, DWORD dwParam2, DWORD dwParam3)
+{
+    FIXME (commctrl, "(0x%08lx 0x%08lx 0x%08lx): stub!\n",
+	   dwParam1, dwParam2, dwParam3);
+
+    return 0;
+}
+
+
+DWORD WINAPI
+DSA_GetItemPtr (DWORD dwParam1, DWORD dwParam2)
+{
+    LPDSA_DATA dsaPtr = (LPDSA_DATA)dwParam1;
+
+    TRACE (commctrl, "(0x%08lx 0x%08lx)\n", dwParam1, dwParam2);
+
+    if (dsaPtr == NULL)
+	return 0;
+    if (dsaPtr->ptrs == NULL)
+	return 0;
+    if ((dwParam2 < 0) || (dwParam2 >= dsaPtr->dwEntryCount))
+	return 0;
+
+    TRACE (commctrl, "ret=0x%08lx\n", (DWORD)dsaPtr->ptrs[dwParam2]);
+
+    return (DWORD)dsaPtr->ptrs[dwParam2];
+}
+
+
+DWORD WINAPI
 DSA_InsertItem (DWORD dwParam1, DWORD dwParam2, DWORD dwParam3)
 {
     LPDSA_DATA dsaPtr = (LPDSA_DATA)dwParam1;
@@ -188,24 +222,6 @@
 }
 
 
-DWORD WINAPI
-DSA_GetItemPtr (DWORD dwParam1, DWORD dwParam2)
-{
-    LPDSA_DATA dsaPtr = (LPDSA_DATA)dwParam1;
-
-    TRACE (commctrl, "(0x%08lx 0x%08lx)\n", dwParam1, dwParam2);
-
-    if (dsaPtr == NULL)
-	return 0;
-    if (dsaPtr->ptrs == NULL)
-	return 0;
-    if ((dwParam2 < 0) || (dwParam2 >= dsaPtr->dwEntryCount))
-	return 0;
-
-    TRACE (commctrl, "ret=0x%08lx\n", (DWORD)dsaPtr->ptrs[dwParam2]);
-
-    return (DWORD)dsaPtr->ptrs[dwParam2];
-}
 
 
 DWORD WINAPI
diff --git a/controls/commctrl.c b/controls/commctrl.c
index 22ef4c4..8dddf5b 100644
--- a/controls/commctrl.c
+++ b/controls/commctrl.c
@@ -218,7 +218,7 @@
 
 
 /***********************************************************************
- * MenuHelp (COMCTL32.2)
+ * MenuHelp [COMCTL32.2]
  *
  *
  *
@@ -234,7 +234,7 @@
     if (!IsWindow32 (hwndStatus)) return;
 
     switch (uMsg) {
-        case WM_MENUSELECT:
+	case WM_MENUSELECT:
             TRACE (commctrl, "WM_MENUSELECT wParam=0x%X lParam=0x%lX\n",
                    wParam, lParam);
 
@@ -245,7 +245,6 @@
             else {
                 if (HIWORD(wParam) & MF_POPUP) {
                     TRACE (commctrl, "popup menu selected!\n");
-                    FIXME (commctrl, "no popup menu texts!\n");
 
                     szStatusText[0] = 0;
                 }
@@ -281,8 +280,8 @@
                  INT32 dxBitmap, INT32 dyBitmap, UINT32 uStructSize)
 {
     HWND32 hwndTB =
-        CreateWindowEx32A(0, TOOLBARCLASSNAME32A, "", style, 0, 0, 0, 0,
-			  hwnd, (HMENU32)wID, 0, NULL);
+        CreateWindowEx32A (0, TOOLBARCLASSNAME32A, "", style, 0, 0, 0, 0,
+			   hwnd, (HMENU32)wID, 0, NULL);
     if(hwndTB) {
 	TBADDBITMAP tbab;
 
@@ -348,35 +347,39 @@
 /***********************************************************************
  * GetEffectiveClientRect [COMCTL32.4]
  *
+ * PARAMS
+ *     hwnd   [I] handle to the client window.
+ *     lpRect [O] pointer to the rectangle of the client window
+ *     lpInfo [I] pointer to an array of integers
  *
- *
+ * NOTES
  */
 
 VOID WINAPI
 GetEffectiveClientRect (HWND32 hwnd, LPRECT32 lpRect, LPINT32 lpInfo)
 {
-    RECT32  rcClient, rcCtrl;
-    HWND32  hwndCtrl;
-    LPINT32 lpRun;
+    RECT32 rcClient, rcCtrl;
+    INT32  idCtrl, *lpRun;
 
     TRACE (commctrl, "hwnd=0x%08lx lpRect=0x%08lx lpInfo=0x%08lx\n",
 	   (DWORD)hwnd, (DWORD)lpRect, (DWORD)lpInfo);
 
     GetClientRect32 (hwnd, &rcClient);
-
+#if 0
     lpRun = lpInfo;
-    TRACE (commctrl, "*lpRun=0x%08x\n", *lpRun);
-    while (*lpRun) {
-	lpRun++;
-	TRACE (commctrl, "control id 0x%08x\n", *lpRun);
-	hwndCtrl = GetDlgItem32 (hwnd, *lpRun);
-	GetWindowRect32 (hwndCtrl, &rcCtrl);
-	MapWindowPoints32 (NULL, hwnd, (LPPOINT32)&rcCtrl, 2);
-	SubtractRect32 (&rcClient, &rcClient, &rcCtrl);
-	lpRun++;
-	TRACE (commctrl, "*lpRun=0x%08x\n", *lpRun);
-    }
 
+    do {
+	lpRun += 3;
+	idCtrl = *lpRun;
+	if (idCtrl) {
+	    TRACE (commctrl, "control id 0x%x\n", idCtrl);
+	    GetWindowRect32 (GetDlgItem32 (hwnd, idCtrl), &rcCtrl);
+	    MapWindowPoints32 (NULL, hwnd, (LPPOINT32)&rcCtrl, 2);
+	    SubtractRect32 (&rcClient, &rcClient, &rcCtrl);
+	    lpRun++;
+	}
+    } while (idCtrl);
+#endif
     CopyRect32 (lpRect, &rcClient);
 }
 
diff --git a/controls/edit.c b/controls/edit.c
index d8407bc..acfef57 100644
--- a/controls/edit.c
+++ b/controls/edit.c
@@ -19,6 +19,7 @@
 #include "resource.h"
 #include "debug.h"
 #include "callback.h"
+#include "tweak.h"
 
 #define BUFLIMIT_MULTI		65534	/* maximum buffer size (not including '\0')
 					   FIXME: BTW, new specs say 65535 (do you dare ???) */
@@ -177,6 +178,7 @@
 static void	EDIT_MoveWordForward(WND *wnd, EDITSTATE *es, BOOL32 extend);
 static void	EDIT_PaintLine(WND *wnd, EDITSTATE *es, HDC32 hdc, INT32 line, BOOL32 rev);
 static INT32	EDIT_PaintText(WND *wnd, EDITSTATE *es, HDC32 hdc, INT32 x, INT32 y, INT32 line, INT32 col, INT32 count, BOOL32 rev);
+static void	EDIT_SetCaretPos(WND *wnd, EDITSTATE *es, INT32 pos, BOOL32 after_wrap); 
 static void	EDIT_SetRectNP(WND *wnd, EDITSTATE *es, LPRECT32 lprc);
 static void	EDIT_UnlockBuffer(WND *wnd, EDITSTATE *es, BOOL32 force);
 static INT32	EDIT_WordBreakProc(LPSTR s, INT32 index, INT32 count, INT32 action);
@@ -216,7 +218,7 @@
 static void	EDIT_WM_Command(WND *wnd, EDITSTATE *es, INT32 code, INT32 id, HWND32 conrtol);
 static void	EDIT_WM_ContextMenu(WND *wnd, EDITSTATE *es, HWND32 hwnd, INT32 x, INT32 y);
 static void	EDIT_WM_Copy(WND *wnd, EDITSTATE *es);
-static LRESULT	EDIT_WM_Create(WND *wnd, LPCREATESTRUCT32A cs);
+static LRESULT	EDIT_WM_Create(WND *wnd, EDITSTATE *es, LPCREATESTRUCT32A cs);
 static void	EDIT_WM_Destroy(WND *wnd, EDITSTATE *es);
 static LRESULT	EDIT_WM_EraseBkGnd(WND *wnd, EDITSTATE *es, HDC32 dc);
 static INT32	EDIT_WM_GetText(WND *wnd, EDITSTATE *es, INT32 count, LPSTR text);
@@ -227,6 +229,7 @@
 static LRESULT	EDIT_WM_LButtonDown(WND *wnd, EDITSTATE *es, DWORD keys, INT32 x, INT32 y);
 static LRESULT	EDIT_WM_LButtonUp(WND *wnd, EDITSTATE *es, DWORD keys, INT32 x, INT32 y);
 static LRESULT	EDIT_WM_MouseMove(WND *wnd, EDITSTATE *es, DWORD keys, INT32 x, INT32 y);
+static LRESULT	EDIT_WM_NCCreate(WND *wnd, LPCREATESTRUCT32A cs);
 static void	EDIT_WM_Paint(WND *wnd, EDITSTATE *es);
 static void	EDIT_WM_Paste(WND *wnd, EDITSTATE *es);
 static void	EDIT_WM_SetFocus(WND *wnd, EDITSTATE *es, HWND32 window_losing_focus);
@@ -305,14 +308,14 @@
 	LRESULT result = 0;
 
 	switch (msg) {
-	case WM_CREATE:
-		DPRINTF_EDIT_MSG32("WM_CREATE");
-		return EDIT_WM_Create(wnd, (LPCREATESTRUCT32A)lParam);
-
 	case WM_DESTROY:
 		DPRINTF_EDIT_MSG32("WM_DESTROY");
 		EDIT_WM_Destroy(wnd, es);
 		return 0;
+
+	case WM_NCCREATE:
+		DPRINTF_EDIT_MSG32("WM_NCCREATE");
+		return EDIT_WM_NCCreate(wnd, (LPCREATESTRUCT32A)lParam);
 	}
 
 	if (!es)
@@ -718,6 +721,11 @@
 		EDIT_WM_Copy(wnd, es);
 		break;
 
+	case WM_CREATE:
+		DPRINTF_EDIT_MSG32("WM_CREATE");
+		result = EDIT_WM_Create(wnd, es, (LPCREATESTRUCT32A)lParam);
+		break;
+
 	case WM_CUT:
 		DPRINTF_EDIT_MSG32("WM_CUT");
 		EDIT_WM_Cut(wnd, es);
@@ -1721,67 +1729,26 @@
 
 /*********************************************************************
  *
- *	EM_SCROLLCARET
+ *	EDIT_SetCaretPos
  *
  */
-static void EDIT_EM_ScrollCaret(WND *wnd, EDITSTATE *es)
+static void EDIT_SetCaretPos(WND *wnd, EDITSTATE *es, INT32 pos,
+			     BOOL32 after_wrap)
 {
-	if (es->style & ES_MULTILINE) {
-		INT32 l;
-		INT32 li;
-		INT32 vlc;
-		INT32 ww;
-		INT32 cw = es->char_width;
-		INT32 x;
-		INT32 dy = 0;
-		INT32 dx = 0;
+	LRESULT res = EDIT_EM_PosFromChar(wnd, es, pos, after_wrap);
+	INT32 x = SLOWORD(res);
+	INT32 y = SHIWORD(res);
 
-		l = EDIT_EM_LineFromChar(wnd, es, es->selection_end);
-		li = EDIT_EM_LineIndex(wnd, es, l);
-		x = SLOWORD(EDIT_EM_PosFromChar(wnd, es, es->selection_end, es->flags & EF_AFTER_WRAP));
-		vlc = (es->format_rect.bottom - es->format_rect.top) / es->line_height;
-		if (l >= es->y_offset + vlc)
-			dy = l - vlc + 1 - es->y_offset;
-		if (l < es->y_offset)
-			dy = l - es->y_offset;
-		ww = es->format_rect.right - es->format_rect.left;
-		if (x < es->format_rect.left)
-			dx = x - es->format_rect.left - ww / HSCROLL_FRACTION / cw * cw;
-		if (x > es->format_rect.right)
-			dx = x - es->format_rect.left - (HSCROLL_FRACTION - 1) * ww / HSCROLL_FRACTION / cw * cw;
-		if (dy || dx)
-			EDIT_EM_LineScroll(wnd, es, dx, dy);
-	} else {
-		INT32 x;
-		INT32 goal;
-		INT32 format_width;
-
-		if (!(es->style & ES_AUTOHSCROLL))
-			return;
-
-		x = SLOWORD(EDIT_EM_PosFromChar(wnd, es, es->selection_end, FALSE));
-		format_width = es->format_rect.right - es->format_rect.left;
-		if (x < es->format_rect.left) {
-			goal = es->format_rect.left + format_width / HSCROLL_FRACTION;
-			do {
-				es->x_offset--;
-				x = SLOWORD(EDIT_EM_PosFromChar(wnd, es, es->selection_end, FALSE));
-			} while ((x < goal) && es->x_offset);
-			/* FIXME: use ScrollWindow() somehow to improve performance */
-			InvalidateRect32(wnd->hwndSelf, NULL, TRUE);
-		} else if (x > es->format_rect.right) {
-			INT32 x_last;
-			INT32 len = lstrlen32A(es->text);
-			goal = es->format_rect.right - format_width / HSCROLL_FRACTION;
-			do {
-				es->x_offset++;
-				x = SLOWORD(EDIT_EM_PosFromChar(wnd, es, es->selection_end, FALSE));
-				x_last = SLOWORD(EDIT_EM_PosFromChar(wnd, es, len, FALSE));
-			} while ((x > goal) && (x_last > es->format_rect.right));
-			/* FIXME: use ScrollWindow() somehow to improve performance */
-			InvalidateRect32(wnd->hwndSelf, NULL, TRUE);
-		}
-	}
+	if(x < es->format_rect.left)
+		x = es->format_rect.left;
+	if(x > es->format_rect.right - 2)
+		x = es->format_rect.right - 2;
+	if(y > es->format_rect.bottom)
+		y = es->format_rect.bottom;
+	if(y < es->format_rect.top)
+		y = es->format_rect.top;
+	SetCaretPos32(x, y);
+	return;
 }
 
 
@@ -1798,6 +1765,8 @@
 	CopyRect32(&es->format_rect, rc);
 	if (es->style & WS_BORDER) {
 		INT32 bw = GetSystemMetrics32(SM_CXBORDER) + 1;
+		if(!TWEAK_Win95Look)
+			bw += 2;
 		es->format_rect.left += bw;
 		es->format_rect.top += bw;
 		es->format_rect.right -= bw;
@@ -2496,6 +2465,72 @@
 
 /*********************************************************************
  *
+ *	EM_SCROLLCARET
+ *
+ */
+static void EDIT_EM_ScrollCaret(WND *wnd, EDITSTATE *es)
+{
+	if (es->style & ES_MULTILINE) {
+		INT32 l;
+		INT32 li;
+		INT32 vlc;
+		INT32 ww;
+		INT32 cw = es->char_width;
+		INT32 x;
+		INT32 dy = 0;
+		INT32 dx = 0;
+
+		l = EDIT_EM_LineFromChar(wnd, es, es->selection_end);
+		li = EDIT_EM_LineIndex(wnd, es, l);
+		x = SLOWORD(EDIT_EM_PosFromChar(wnd, es, es->selection_end, es->flags & EF_AFTER_WRAP));
+		vlc = (es->format_rect.bottom - es->format_rect.top) / es->line_height;
+		if (l >= es->y_offset + vlc)
+			dy = l - vlc + 1 - es->y_offset;
+		if (l < es->y_offset)
+			dy = l - es->y_offset;
+		ww = es->format_rect.right - es->format_rect.left;
+		if (x < es->format_rect.left)
+			dx = x - es->format_rect.left - ww / HSCROLL_FRACTION / cw * cw;
+		if (x > es->format_rect.right)
+			dx = x - es->format_rect.left - (HSCROLL_FRACTION - 1) * ww / HSCROLL_FRACTION / cw * cw;
+		if (dy || dx)
+			EDIT_EM_LineScroll(wnd, es, dx, dy);
+	} else {
+		INT32 x;
+		INT32 goal;
+		INT32 format_width;
+
+		if (!(es->style & ES_AUTOHSCROLL))
+			return;
+
+		x = SLOWORD(EDIT_EM_PosFromChar(wnd, es, es->selection_end, FALSE));
+		format_width = es->format_rect.right - es->format_rect.left;
+		if (x < es->format_rect.left) {
+			goal = es->format_rect.left + format_width / HSCROLL_FRACTION;
+			do {
+				es->x_offset--;
+				x = SLOWORD(EDIT_EM_PosFromChar(wnd, es, es->selection_end, FALSE));
+			} while ((x < goal) && es->x_offset);
+			/* FIXME: use ScrollWindow() somehow to improve performance */
+			InvalidateRect32(wnd->hwndSelf, NULL, TRUE);
+		} else if (x > es->format_rect.right) {
+			INT32 x_last;
+			INT32 len = lstrlen32A(es->text);
+			goal = es->format_rect.right - format_width / HSCROLL_FRACTION;
+			do {
+				es->x_offset++;
+				x = SLOWORD(EDIT_EM_PosFromChar(wnd, es, es->selection_end, FALSE));
+				x_last = SLOWORD(EDIT_EM_PosFromChar(wnd, es, len, FALSE));
+			} while ((x > goal) && (x_last > es->format_rect.right));
+			/* FIXME: use ScrollWindow() somehow to improve performance */
+			InvalidateRect32(wnd->hwndSelf, NULL, TRUE);
+		}
+	}
+}
+
+
+/*********************************************************************
+ *
  *	EM_SETHANDLE
  *
  *	FIXME:	ES_LOWERCASE, ES_UPPERCASE, ES_OEMCONVERT, ES_NUMBER ???
@@ -2607,24 +2642,33 @@
 /*********************************************************************
  *
  *	EM_SETMARGINS
+ * 
+ * EC_USEFONTINFO is used as a left or right value i.e. lParam and not as an
+ * action wParam despite what the docs say. It also appears not to affect
+ * multiline controls??
  *
  */
-static void EDIT_EM_SetMargins(WND *wnd, EDITSTATE *es, INT32 action, INT32 left, INT32 right)
+static void EDIT_EM_SetMargins(WND *wnd, EDITSTATE *es, INT32 action,
+			       INT32 left, INT32 right)
 {
-	if (action & EC_USEFONTINFO) {
-		if (es->style & ES_MULTILINE) {
-			/*
-			 *	FIXME: do some GetABCCharWidth, or so
-			 *		This is just preliminary
-			 */
-			es->left_margin = es->right_margin = es->char_width/4;
-		} else
-			es->left_margin = es->right_margin = es->char_width/4;
-	} else {
-		if (action & EC_LEFTMARGIN)
+	if (action & EC_LEFTMARGIN) {
+		if (left != EC_USEFONTINFO)
 			es->left_margin = left;
-		if (action & EC_RIGHTMARGIN)
-			es->right_margin = right;
+		else
+			if (es->style & ES_MULTILINE)
+				es->left_margin = 0; /* ?? */
+			else
+			  es->left_margin = es->char_width;
+	}
+
+	if (action & EC_RIGHTMARGIN) {
+		if (right != EC_USEFONTINFO)
+ 			es->right_margin = right;
+		else
+			if (es->style & ES_MULTILINE)
+				es->right_margin = 0; /* ?? */
+			else
+				es->right_margin = es->char_width;
 	}
 	TRACE(edit, "left=%d, right=%d\n", es->left_margin, es->right_margin);
 }
@@ -2683,10 +2727,8 @@
 		es->flags |= EF_AFTER_WRAP;
 	else
 		es->flags &= ~EF_AFTER_WRAP;
-	if (es->flags & EF_FOCUSED) {
-		LRESULT pos = EDIT_EM_PosFromChar(wnd, es, end, after_wrap);
-		SetCaretPos32(SLOWORD(pos), SHIWORD(pos));
-	}
+	if (es->flags & EF_FOCUSED)
+		EDIT_SetCaretPos(wnd, es, end, after_wrap);
 /* 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);
@@ -2976,70 +3018,8 @@
  *	WM_CREATE
  *
  */
-static LRESULT EDIT_WM_Create(WND *wnd, LPCREATESTRUCT32A cs)
+static LRESULT EDIT_WM_Create(WND *wnd, EDITSTATE *es, LPCREATESTRUCT32A cs)
 {
-	EDITSTATE *es;
-
-	if (!(es = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*es))))
-		return -1;
-	*(EDITSTATE **)wnd->wExtra = es;
-	if (!(es->heap = HeapCreate(0, 0x10000, 0)))
-		return -1;
-	es->style = cs->style;
-
-	/* remove the WS_CAPTION style if it has been set - this is really a  */
-	/* pseudo option made from a combination of WS_BORDER and WS_DLGFRAME */
-	if ((es->style & WS_BORDER) && (es->style & WS_DLGFRAME))
-		es->style ^= WS_DLGFRAME;
-
-	if (es->style & ES_MULTILINE) {
-		es->buffer_size = BUFSTART_MULTI;
-		es->buffer_limit = BUFLIMIT_MULTI;
-		if (es->style & WS_VSCROLL)
-			es->style |= ES_AUTOVSCROLL;
-		if (es->style & WS_HSCROLL)
-			es->style |= ES_AUTOHSCROLL;
-		es->style &= ~ES_PASSWORD;
-		if ((es->style & ES_CENTER) || (es->style & ES_RIGHT)) {
-			if (es->style & ES_RIGHT)
-				es->style &= ~ES_CENTER;
-			es->style &= ~WS_HSCROLL;
-			es->style &= ~ES_AUTOHSCROLL;
-		}
-
-		/* FIXME: for now, all multi line controls are AUTOVSCROLL */
-		es->style |= ES_AUTOVSCROLL;
-	} else {
-		es->buffer_size = BUFSTART_SINGLE;
-		es->buffer_limit = BUFLIMIT_SINGLE;
-		es->style &= ~ES_CENTER;
-		es->style &= ~ES_RIGHT;
-		es->style &= ~WS_HSCROLL;
-		es->style &= ~WS_VSCROLL;
-		es->style &= ~ES_AUTOVSCROLL;
-		es->style &= ~ES_WANTRETURN;
-		if (es->style & ES_UPPERCASE) {
-			es->style &= ~ES_LOWERCASE;
-			es->style &= ~ES_NUMBER;
-		} else if (es->style & ES_LOWERCASE)
-			es->style &= ~ES_NUMBER;
-		if (es->style & ES_PASSWORD)
-			es->password_char = '*';
-
-		/* FIXME: for now, all single line controls are AUTOHSCROLL */
-		es->style |= ES_AUTOHSCROLL;
-	}
-	if (!(es->text = HeapAlloc(es->heap, 0, es->buffer_size + 1)))
-		return -1;
-	es->buffer_size = HeapSize(es->heap, 0, es->text) - 1;
-	if (!(es->undo_text = HeapAlloc(es->heap, 0, es->buffer_size + 1)))
-		return -1;
-	es->undo_buffer_size = HeapSize(es->heap, 0, es->undo_text) - 1;
-	*es->text = '\0';
-	if (es->style & ES_MULTILINE)
-		if (!(es->first_line_def = HeapAlloc(es->heap, HEAP_ZERO_MEMORY, sizeof(LINEDEF))))
-			return -1;
-	es->line_count = 1;
 	/*
 	 *	To initialize some final structure members, we call some helper
 	 *	functions.  However, since the EDITSTATE is not consistent (i.e.
@@ -3547,6 +3527,78 @@
 
 /*********************************************************************
  *
+ *	WM_NCCREATE
+ *
+ */
+static LRESULT EDIT_WM_NCCreate(WND *wnd, LPCREATESTRUCT32A cs)
+{
+	EDITSTATE *es;
+
+	if (!(es = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*es))))
+		return FALSE;
+	*(EDITSTATE **)wnd->wExtra = es;
+	if (!(es->heap = HeapCreate(0, 0x10000, 0)))
+		return FALSE;
+	es->style = cs->style;
+
+	if ((es->style & WS_BORDER) && !(es->style & WS_DLGFRAME))
+		SetWindowLong32A(wnd->hwndSelf, GWL_STYLE, 
+				es->style & ~WS_BORDER);
+
+	if (es->style & ES_MULTILINE) {
+		es->buffer_size = BUFSTART_MULTI;
+		es->buffer_limit = BUFLIMIT_MULTI;
+		if (es->style & WS_VSCROLL)
+			es->style |= ES_AUTOVSCROLL;
+		if (es->style & WS_HSCROLL)
+			es->style |= ES_AUTOHSCROLL;
+		es->style &= ~ES_PASSWORD;
+		if ((es->style & ES_CENTER) || (es->style & ES_RIGHT)) {
+			if (es->style & ES_RIGHT)
+				es->style &= ~ES_CENTER;
+			es->style &= ~WS_HSCROLL;
+			es->style &= ~ES_AUTOHSCROLL;
+		}
+
+		/* FIXME: for now, all multi line controls are AUTOVSCROLL */
+		es->style |= ES_AUTOVSCROLL;
+	} else {
+		es->buffer_size = BUFSTART_SINGLE;
+		es->buffer_limit = BUFLIMIT_SINGLE;
+		es->style &= ~ES_CENTER;
+		es->style &= ~ES_RIGHT;
+		es->style &= ~WS_HSCROLL;
+		es->style &= ~WS_VSCROLL;
+		es->style &= ~ES_AUTOVSCROLL;
+		es->style &= ~ES_WANTRETURN;
+		if (es->style & ES_UPPERCASE) {
+			es->style &= ~ES_LOWERCASE;
+			es->style &= ~ES_NUMBER;
+		} else if (es->style & ES_LOWERCASE)
+			es->style &= ~ES_NUMBER;
+		if (es->style & ES_PASSWORD)
+			es->password_char = '*';
+
+		/* FIXME: for now, all single line controls are AUTOHSCROLL */
+		es->style |= ES_AUTOHSCROLL;
+	}
+	if (!(es->text = HeapAlloc(es->heap, 0, es->buffer_size + 1)))
+		return FALSE;
+	es->buffer_size = HeapSize(es->heap, 0, es->text) - 1;
+	if (!(es->undo_text = HeapAlloc(es->heap, 0, es->buffer_size + 1)))
+		return FALSE;
+	es->undo_buffer_size = HeapSize(es->heap, 0, es->undo_text) - 1;
+	*es->text = '\0';
+	if (es->style & ES_MULTILINE)
+		if (!(es->first_line_def = HeapAlloc(es->heap, HEAP_ZERO_MEMORY, sizeof(LINEDEF))))
+			return FALSE;
+	es->line_count = 1;
+
+	return TRUE;
+}
+
+/*********************************************************************
+ *
  *	WM_PAINT
  *
  */
@@ -3559,7 +3611,6 @@
 	RECT32 rc;
 	RECT32 rcLine;
 	RECT32 rcRgn;
- 	LRESULT pos;
 	BOOL32 rev = IsWindowEnabled32(wnd->hwndSelf) &&
 				((es->flags & EF_FOCUSED) ||
 					(es->style & ES_NOHIDESEL));
@@ -3568,6 +3619,14 @@
 		EDIT_NOTIFY_PARENT(wnd, EN_UPDATE, "EN_UPDATE");
 
 	dc = BeginPaint32(wnd->hwndSelf, &ps);
+	if(es->style & WS_BORDER) {
+		GetClientRect32(wnd->hwndSelf, &rc);
+		if(es->style & ES_MULTILINE) {
+			if(es->style & WS_HSCROLL) rc.bottom++;
+			if(es->style & WS_VSCROLL) rc.right++;
+		}
+		Rectangle32(dc, rc.left, rc.top, rc.right, rc.bottom);
+	}
 	IntersectClipRect32(dc, es->format_rect.left,
 				es->format_rect.top,
 				es->format_rect.right,
@@ -3596,10 +3655,9 @@
 	}
 	if (es->font)
 		SelectObject32(dc, old_font);
-	if (es->flags & EF_FOCUSED) {
-		pos = EDIT_EM_PosFromChar(wnd, es, es->selection_end, es->flags & EF_AFTER_WRAP);
-		SetCaretPos32(SLOWORD(pos), SHIWORD(pos));
-	}
+	if (es->flags & EF_FOCUSED)
+		EDIT_SetCaretPos(wnd, es, es->selection_end,
+				 es->flags & EF_AFTER_WRAP);
 	EndPaint32(wnd->hwndSelf, &ps);
 	if ((es->style & WS_VSCROLL) && !(es->flags & EF_VSCROLL_TRACK)) {
 		INT32 vlc = (es->format_rect.bottom - es->format_rect.top) / es->line_height;
@@ -3661,12 +3719,10 @@
  */
 static void EDIT_WM_SetFocus(WND *wnd, EDITSTATE *es, HWND32 window_losing_focus)
 {
-	LRESULT pos;
-
 	es->flags |= EF_FOCUSED;
 	CreateCaret32(wnd->hwndSelf, 0, 2, es->line_height);
-	pos = EDIT_EM_PosFromChar(wnd, es, es->selection_end, es->flags & EF_AFTER_WRAP);
-	SetCaretPos32(SLOWORD(pos), SHIWORD(pos));
+	EDIT_SetCaretPos(wnd, es, es->selection_end,
+			 es->flags & EF_AFTER_WRAP);
 	if(!(es->style & ES_NOHIDESEL))
 		EDIT_InvalidateText(wnd, es, es->selection_start, es->selection_end);
 	ShowCaret32(wnd->hwndSelf);
@@ -3678,6 +3734,10 @@
  *
  *	WM_SETFONT
  *
+ * With Win95 look the margins are set to default font value unless 
+ * the system font (font == 0) is being set, in which case they are left
+ * unchanged.
+ *
  */
 static void EDIT_WM_SetFont(WND *wnd, EDITSTATE *es, HFONT32 font, BOOL32 redraw)
 {
@@ -3695,18 +3755,23 @@
 	if (font)
 		SelectObject32(dc, old_font);
 	ReleaseDC32(wnd->hwndSelf, dc);
-	if (wnd->flags & WIN_ISWIN32)
-		EDIT_EM_SetMargins(wnd, es, EC_USEFONTINFO, 0, 0);
+	if (font & TWEAK_Win95Look)
+		EDIT_EM_SetMargins(wnd, es, EC_LEFTMARGIN | EC_RIGHTMARGIN,
+				   EC_USEFONTINFO, EC_USEFONTINFO);
 	if (es->style & ES_MULTILINE)
 		EDIT_BuildLineDefs_ML(wnd, es);
+	else {
+		RECT32 r;
+		GetClientRect32(wnd->hwndSelf, &r);
+		EDIT_SetRectNP(wnd, es, &r);
+	}
 	if (redraw)
 		InvalidateRect32(wnd->hwndSelf, NULL, TRUE);
 	if (es->flags & EF_FOCUSED) {
-		LRESULT pos;
 		DestroyCaret32();
 		CreateCaret32(wnd->hwndSelf, 0, 2, es->line_height);
-		pos = EDIT_EM_PosFromChar(wnd, es, es->selection_end, es->flags & EF_AFTER_WRAP);
-		SetCaretPos32(SLOWORD(pos), SHIWORD(pos));
+		EDIT_SetCaretPos(wnd, es, es->selection_end,
+				 es->flags & EF_AFTER_WRAP);
 		ShowCaret32(wnd->hwndSelf);
 	}
 }
@@ -3723,10 +3788,14 @@
 	if (text) {
 		TRACE(edit, "\t'%s'\n", text);
 		EDIT_EM_ReplaceSel(wnd, es, FALSE, text);
-		es->x_offset = 0;
+	} else {
+		TRACE(edit, "\t<NULL>\n");
+		EDIT_EM_ReplaceSel(wnd, es, FALSE, "");
 	}
+	es->x_offset = 0;
 	es->flags |= EF_MODIFIED;
 	es->flags |= EF_UPDATE;
+	EDIT_EM_SetSel(wnd, es, 0, 0, FALSE);
 	EDIT_EM_ScrollCaret(wnd, es);
 }
 
diff --git a/controls/header.c b/controls/header.c
index 18bbfaa..1e7097aa 100644
--- a/controls/header.c
+++ b/controls/header.c
@@ -6,7 +6,6 @@
  *  TODO:
  *   - Imagelist support (partially).
  *   - Callback items.
- *   - Owner draw support.
  *   - Order list support.
  *   - Control specific cursors (over dividers).
  *   - Hottrack support (partially).
@@ -38,8 +37,10 @@
 
 
 static INT32
-HEADER_DrawItem (WND *wndPtr, HDC32 hdc, HEADER_ITEM *phdi, BOOL32 bHotTrack)
+HEADER_DrawItem (WND *wndPtr, HDC32 hdc, INT32 iItem, BOOL32 bHotTrack)
 {
+    HEADER_INFO *infoPtr = HEADER_GetInfoPtr(wndPtr);
+    HEADER_ITEM *phdi = &infoPtr->items[iItem];
     RECT32 r;
     INT32  oldBkMode;
 
@@ -62,7 +63,18 @@
         DrawEdge32 (hdc, &r, EDGE_ETCHED, BF_BOTTOM | BF_RIGHT | BF_ADJUST);
 
     if (phdi->fmt & HDF_OWNERDRAW) {
-        /* FIXME: owner drawn items */
+	DRAWITEMSTRUCT32 dis;
+	dis.CtlType    = ODT_HEADER;
+	dis.CtlID      = wndPtr->wIDmenu;
+	dis.itemID     = iItem;
+	dis.itemAction = ODA_DRAWENTIRE;
+	dis.itemState  = phdi->bDown ? ODS_SELECTED : 0;
+	dis.hwndItem   = wndPtr->hwndSelf;
+	dis.hDC        = hdc;
+	dis.rcItem     = r;
+	dis.itemData   = phdi->lParam;
+	SendMessage32A (GetParent32 (wndPtr->hwndSelf), WM_DRAWITEM,
+			(WPARAM32)wndPtr->wIDmenu, (LPARAM)&dis);
     }
     else {
         UINT32 uTextJustify = DT_LEFT;
@@ -161,7 +173,6 @@
 	}
 
 	if (phdi->fmt & HDF_IMAGE) {
-	    HEADER_INFO *infoPtr = HEADER_GetInfoPtr(wndPtr);
 
 
 //	    ImageList_Draw (infoPtr->himl, phdi->iImage,...);
@@ -203,7 +214,7 @@
 
     x = rect.left;
     for (i = 0; i < infoPtr->uNumItem; i++) {
-        x = HEADER_DrawItem (wndPtr, hdc, &infoPtr->items[i], FALSE);
+        x = HEADER_DrawItem (wndPtr, hdc, i, FALSE);
     }
 
     if ((x <= rect.right) && (infoPtr->uNumItem > 0)) {
@@ -219,14 +230,14 @@
 
 
 static void
-HEADER_RefreshItem (WND *wndPtr, HDC32 hdc, HEADER_ITEM *phdi)
+HEADER_RefreshItem (WND *wndPtr, HDC32 hdc, INT32 iItem)
 {
     HEADER_INFO *infoPtr = HEADER_GetInfoPtr(wndPtr);
     HFONT32 hFont, hOldFont;
 
     hFont = infoPtr->hFont ? infoPtr->hFont : GetStockObject32 (SYSTEM_FONT);
     hOldFont = SelectObject32 (hdc, hFont);
-    HEADER_DrawItem (wndPtr, hdc, phdi, FALSE);
+    HEADER_DrawItem (wndPtr, hdc, iItem, FALSE);
     SelectObject32 (hdc, hOldFont);
 }
 
@@ -501,8 +512,8 @@
     if (infoPtr->uNumItem == 1) {
         TRACE(header, "Simple delete!\n");
         if (infoPtr->items[0].pszText)
-            HeapFree (SystemHeap, 0, infoPtr->items[0].pszText);
-        HeapFree (SystemHeap, 0, infoPtr->items);
+            HeapFree (GetProcessHeap (), 0, infoPtr->items[0].pszText);
+        HeapFree (GetProcessHeap (), 0, infoPtr->items);
         infoPtr->items = 0;
         infoPtr->uNumItem = 0;
     }
@@ -511,10 +522,10 @@
         TRACE(header, "Complex delete! [iItem=%d]\n", iItem);
 
         if (infoPtr->items[iItem].pszText)
-            HeapFree (SystemHeap, 0, infoPtr->items[iItem].pszText);
+            HeapFree (GetProcessHeap (), 0, infoPtr->items[iItem].pszText);
 
         infoPtr->uNumItem--;
-        infoPtr->items = HeapAlloc (SystemHeap, HEAP_ZERO_MEMORY,
+        infoPtr->items = HeapAlloc (GetProcessHeap (), HEAP_ZERO_MEMORY,
                                     sizeof (HEADER_ITEM) * infoPtr->uNumItem);
         /* pre delete copy */
         if (iItem > 0) {
@@ -528,7 +539,7 @@
                     (infoPtr->uNumItem - iItem) * sizeof(HEADER_ITEM));
         }
 
-        HeapFree (SystemHeap, 0, oldItems);
+        HeapFree (GetProcessHeap (), 0, oldItems);
     }
 
     HEADER_SetItemBounds (wndPtr);
@@ -669,7 +680,7 @@
         iItem = infoPtr->uNumItem;
 
     if (infoPtr->uNumItem == 0) {
-        infoPtr->items = HeapAlloc (SystemHeap, HEAP_ZERO_MEMORY,
+        infoPtr->items = HeapAlloc (GetProcessHeap (), HEAP_ZERO_MEMORY,
                                     sizeof (HEADER_ITEM));
         infoPtr->uNumItem++;
     }
@@ -677,7 +688,7 @@
         HEADER_ITEM *oldItems = infoPtr->items;
 
         infoPtr->uNumItem++;
-        infoPtr->items = HeapAlloc (SystemHeap, HEAP_ZERO_MEMORY,
+        infoPtr->items = HeapAlloc (GetProcessHeap (), HEAP_ZERO_MEMORY,
                                     sizeof (HEADER_ITEM) * infoPtr->uNumItem);
         /* pre insert copy */
         if (iItem > 0) {
@@ -691,7 +702,7 @@
                     (infoPtr->uNumItem - iItem) * sizeof(HEADER_ITEM));
         }
 
-        HeapFree (SystemHeap, 0, oldItems);
+        HeapFree (GetProcessHeap (), 0, oldItems);
     }
 
     infoPtr->items[iItem].bDown = FALSE;
@@ -703,7 +714,7 @@
     if (phdi->mask & HDI_TEXT) {
         len = lstrlen32A (phdi->pszText);
         infoPtr->items[iItem].pszText =
-            HeapAlloc (SystemHeap, HEAP_ZERO_MEMORY, len+1);
+            HeapAlloc (GetProcessHeap (), HEAP_ZERO_MEMORY, len+1);
         lstrcpy32A (infoPtr->items[iItem].pszText, phdi->pszText);
         infoPtr->items[iItem].cchTextMax = phdi->cchTextMax;
     }
@@ -748,7 +759,7 @@
         lpLayout->pwpos->cy = 0;
     else
         lpLayout->pwpos->cy = infoPtr->nHeight;
-    lpLayout->pwpos->flags = SWP_NOACTIVATE|SWP_NOZORDER;
+    lpLayout->pwpos->flags = SWP_NOZORDER;
 
     TRACE (header, "Layout x=%d y=%d cx=%d cy=%d\n",
            lpLayout->pwpos->x, lpLayout->pwpos->y,
@@ -818,9 +829,9 @@
     if (phdi->mask & HDI_TEXT) {
         INT32 len = lstrlen32A (phdi->pszText);
         if (infoPtr->items[iItem].pszText)
-	    HeapFree (SystemHeap, 0, infoPtr->items[iItem].pszText);
+	    HeapFree (GetProcessHeap (), 0, infoPtr->items[iItem].pszText);
         infoPtr->items[iItem].pszText =
-            HeapAlloc (SystemHeap, HEAP_ZERO_MEMORY, len+1);
+            HeapAlloc (GetProcessHeap (), HEAP_ZERO_MEMORY, len+1);
         lstrcpy32A (infoPtr->items[iItem].pszText, phdi->pszText);
         infoPtr->items[iItem].cchTextMax = phdi->cchTextMax;
     }
@@ -859,7 +870,7 @@
     HFONT32 hOldFont;
     HDC32   hdc;
 
-    infoPtr = (HEADER_INFO *)HeapAlloc( SystemHeap, HEAP_ZERO_MEMORY,
+    infoPtr = (HEADER_INFO *)HeapAlloc (GetProcessHeap (), HEAP_ZERO_MEMORY,
                                         sizeof(HEADER_INFO));
     wndPtr->wExtra[0] = (DWORD)infoPtr;
 
@@ -896,15 +907,15 @@
     if (infoPtr->items) {
         for (iItem = 0; iItem < infoPtr->uNumItem; iItem++) {
             if (infoPtr->items[iItem].pszText)
-                HeapFree (SystemHeap, 0, infoPtr->items[iItem].pszText);
+                HeapFree (GetProcessHeap (), 0, infoPtr->items[iItem].pszText);
         }
-        HeapFree (SystemHeap, 0, infoPtr->items);
+        HeapFree (GetProcessHeap (), 0, infoPtr->items);
     }
 
     if (infoPtr->himl)
 	ImageList_Destroy (infoPtr->himl);
 
-    HeapFree (SystemHeap, 0, infoPtr);
+    HeapFree (GetProcessHeap (), 0, infoPtr);
 
     return 0;
 }
@@ -962,7 +973,7 @@
 
 	/* Send WM_CUSTOMDRAW */
 	hdc = GetDC32 (wndPtr->hwndSelf);
-	HEADER_RefreshItem (wndPtr, hdc, &infoPtr->items[iItem]);
+	HEADER_RefreshItem (wndPtr, hdc, iItem);
 	ReleaseDC32 (wndPtr->hwndSelf, hdc);
 
 	TRACE (header, "Pressed item %d!\n", iItem);
@@ -987,8 +998,6 @@
 	}
     }
 
-
-
     return 0;
 }
 
@@ -1010,7 +1019,7 @@
 	if ((iItem == infoPtr->iMoveItem) && (flags == HHT_ONHEADER)) {
 	    infoPtr->items[infoPtr->iMoveItem].bDown = FALSE;
 	    hdc = GetDC32 (wndPtr->hwndSelf);
-	    HEADER_RefreshItem (wndPtr, hdc, &infoPtr->items[infoPtr->iMoveItem]);
+	    HEADER_RefreshItem (wndPtr, hdc, infoPtr->iMoveItem);
 	    ReleaseDC32 (wndPtr->hwndSelf, hdc);
 
 	    HEADER_SendClickNotify (wndPtr, HDN_ITEMCLICK32A, infoPtr->iMoveItem);
@@ -1086,7 +1095,7 @@
 	    else
 		infoPtr->items[infoPtr->iMoveItem].bDown = FALSE;
 	    hdc = GetDC32 (wndPtr->hwndSelf);
-	    HEADER_RefreshItem (wndPtr, hdc, &infoPtr->items[infoPtr->iMoveItem]);
+	    HEADER_RefreshItem (wndPtr, hdc, infoPtr->iMoveItem);
 	    ReleaseDC32 (wndPtr->hwndSelf, hdc);
 
 	    TRACE (header, "Moving pressed item %d!\n", infoPtr->iMoveItem);
@@ -1127,7 +1136,7 @@
     }
 
     if ((wndPtr->dwStyle & HDS_BUTTONS) && (wndPtr->dwStyle & HDS_HOTTRACK)) {
-
+	FIXME (header, "hot track support!\n");
     }
 
     return 0;
diff --git a/controls/listbox.c b/controls/listbox.c
index 60ea183..25af765 100644
--- a/controls/listbox.c
+++ b/controls/listbox.c
@@ -13,6 +13,7 @@
 #include "win.h"
 #include "combo.h"
 #include "debug.h"
+#include "tweak.h"
 
 /* Unimplemented yet:
  * - LBS_NOSEL
@@ -1330,7 +1331,7 @@
     if (index <= descr->focus_item)
     {
         descr->focus_item++;
-        LISTBOX_MoveCaret( wnd, descr, descr->focus_item - 1, FALSE );
+        LISTBOX_MoveCaret( wnd, descr, descr->focus_item, FALSE );
     }
 
     /* If listbox was empty, set focus to the first item */
@@ -1447,7 +1448,7 @@
     if (index <= descr->focus_item)
     {
         descr->focus_item--;
-        LISTBOX_MoveCaret( wnd, descr, descr->focus_item + 1, FALSE );
+        LISTBOX_MoveCaret( wnd, descr, descr->focus_item, FALSE );
     }
     return LB_OKAY;
 }
@@ -2484,6 +2485,11 @@
         }
 	break;
 
+    case WM_NCCREATE:
+	if (TWEAK_Win95Look)
+	    wnd->dwExStyle |= WS_EX_CLIENTEDGE;
+        return DefWindowProc32A( hwnd, msg, wParam, lParam );
+
     default:
         if ((msg >= WM_USER) && (msg < 0xc000))
             WARN(listbox, "[%04x]: unknown msg %04x wp %08x lp %08lx\n",
diff --git a/controls/menu.c b/controls/menu.c
index ee407e2..6e60858 100644
--- a/controls/menu.c
+++ b/controls/menu.c
@@ -653,7 +653,10 @@
     {
         dwSize = GetTextExtent( hdc, lpitem->text, strlen(lpitem->text) );
         lpitem->rect.right  += LOWORD(dwSize);
-        lpitem->rect.bottom += MAX( HIWORD(dwSize), SYSMETRICS_CYMENU );
+	if (TWEAK_Win95Look)
+            lpitem->rect.bottom += MAX (HIWORD(dwSize), sysMetrics[SM_CYMENU]- 1);
+        else
+            lpitem->rect.bottom += MAX( HIWORD(dwSize), SYSMETRICS_CYMENU );
         lpitem->xTab = 0;
 
         if (menuBar) lpitem->rect.right += MENU_BAR_ITEMS_SPACE;
@@ -698,6 +701,7 @@
 	lpitem = &lppop->items[start];
 	orgX = maxX;
 	orgY = SYSMETRICS_CYBORDER;
+
 	maxTab = maxTabWidth = 0;
 
 	  /* Parse items until column break or end of menu */
@@ -731,6 +735,9 @@
 	lppop->Height = MAX( lppop->Height, orgY );
     }
 
+    if(TWEAK_Win95Look)
+	lppop->Height++;
+
     lppop->Width  = maxX;
     ReleaseDC32( 0, hdc );
 }
@@ -881,22 +888,10 @@
 	*/
     }
 
-    if (lpitem->fState & MF_HILITE) {
-	RECT32  r = rect;
-	r.top += MENU_HighlightTopNudge;
-	r.bottom += MENU_HighlightBottomNudge;
-	r.left += MENU_HighlightLeftNudge;
-	r.right += MENU_HighlightRightNudge;
-	FillRect32( hdc, &r, GetSysColorBrush32(COLOR_HIGHLIGHT) );
-    }
-    else {
-	RECT32  r = rect;
-	r.top += MENU_HighlightTopNudge;
-	r.bottom += MENU_HighlightBottomNudge;
-	r.left += MENU_HighlightLeftNudge;
-	r.right += MENU_HighlightRightNudge;
-	FillRect32( hdc, &r, GetSysColorBrush32(COLOR_MENU) );
-    }
+    if (lpitem->fState & MF_HILITE)
+	FillRect32( hdc, &rect, GetSysColorBrush32(COLOR_HIGHLIGHT) );
+    else
+	FillRect32( hdc, &rect, GetSysColorBrush32(COLOR_MENU) );
 
     SetBkMode32( hdc, TRANSPARENT );
 
@@ -1147,9 +1142,6 @@
     lprect->bottom = lprect->top + lppop->Height;
     if (suppress_draw) return lppop->Height;
     
-    if(TWEAK_Win95Look)
-	++lprect->bottom;
-
     FillRect32(hDC, lprect, GetSysColorBrush32(COLOR_MENU) );
 
     if(!TWEAK_Win95Look) {
@@ -1157,6 +1149,11 @@
 	MoveTo( hDC, lprect->left, lprect->bottom );
 	LineTo32( hDC, lprect->right, lprect->bottom );
     }
+    else {
+	SelectObject32( hDC, GetSysColorPen32(COLOR_3DFACE));
+	MoveTo( hDC, lprect->left, lprect->bottom );
+	LineTo32( hDC, lprect->right, lprect->bottom );
+    }
 
     if (lppop->nItems == 0) return SYSMETRICS_CYMENU;
     for (i = 0; i < lppop->nItems; i++)
diff --git a/controls/progress.c b/controls/progress.c
index d83cb93..3acb294 100644
--- a/controls/progress.c
+++ b/controls/progress.c
@@ -29,25 +29,20 @@
 
 
 /***********************************************************************
- *           PROGRESS_Paint
- * Draw the arrows. The background need not be erased.
- * If dc!=0, it draws on it
+ * PROGRESS_Draw
+ * Draws the progress bar.
  */
-static void PROGRESS_Paint(WND *wndPtr, HDC32 dc)
+static void
+PROGRESS_Draw (WND *wndPtr, HDC32 hdc)
 {
   PROGRESS_INFO *infoPtr = PROGRESS_GetInfoPtr(wndPtr);
   HBRUSH32 hbrBar, hbrBk;
   int rightBar, rightMost, ledWidth;
-  PAINTSTRUCT32 ps;
   RECT32 rect;
-  HDC32 hdc;
 
-  TRACE(progress, "paint pos=%d min=%d, max=%d\n",
+  TRACE(progress, "refresh pos=%d min=%d, max=%d\n",
 	       infoPtr->CurVal, infoPtr->MinVal, infoPtr->MaxVal);
 
-  /* get a dc */
-  hdc = dc==0 ? BeginPaint32(wndPtr->hwndSelf, &ps) : dc;
-
   /* get the required bar brush */
   if (infoPtr->ColorBar == CLR_DEFAULT)
     hbrBar = GetSysColorBrush32(COLOR_HIGHLIGHT);
@@ -60,11 +55,10 @@
   else
     hbrBk = CreateSolidBrush32 (infoPtr->ColorBk);
 
-  /* get rect for the bar, adjusted for the border */
+  /* get client rectangle */
   GetClientRect32 (wndPtr->hwndSelf, &rect);
 
-  /* draw the border */
-  DrawEdge32(hdc, &rect, BDR_SUNKENOUTER, BF_RECT|BF_ADJUST);
+  /* draw the background */
   FillRect32(hdc, &rect, hbrBk);
 
   rect.left++; rect.right--; rect.top++; rect.bottom--;
@@ -125,13 +119,40 @@
   /* delete background brush */
   if (infoPtr->ColorBk != CLR_DEFAULT)
       DeleteObject32 (hbrBk);
-
-  /* clean-up */  
-  if(!dc)
-    EndPaint32(wndPtr->hwndSelf, &ps);
 }
 
 /***********************************************************************
+ * PROGRESS_Refresh
+ * Draw the progress bar. The background need not be erased.
+ */
+static void
+PROGRESS_Refresh (WND *wndPtr)
+{
+    HDC32 hdc;
+
+    hdc = GetDC32 (wndPtr->hwndSelf);
+    PROGRESS_Draw (wndPtr, hdc);
+    ReleaseDC32 (wndPtr->hwndSelf, hdc);
+}
+
+/***********************************************************************
+ * PROGRESS_Paint
+ * Draw the progress bar. The background need not be erased.
+ * If dc!=0, it draws on it
+ */
+static void
+PROGRESS_Paint (WND *wndPtr)
+{
+    PAINTSTRUCT32 ps;
+    HDC32 hdc;
+
+    hdc = BeginPaint32 (wndPtr->hwndSelf, &ps);
+    PROGRESS_Draw (wndPtr, hdc);
+    EndPaint32 (wndPtr->hwndSelf, &ps);
+}
+
+
+/***********************************************************************
  *           PROGRESS_CoercePos
  * Makes sure the current position (CUrVal) is within bounds.
  */
@@ -157,10 +178,15 @@
 
   switch(message)
     {
+    case WM_NCCREATE:
+      wndPtr->dwExStyle |= WS_EX_STATICEDGE;
+      return TRUE;
+
     case WM_CREATE:
       /* allocate memory for info struct */
-      infoPtr = (PROGRESS_INFO *)HeapAlloc (SystemHeap, HEAP_ZERO_MEMORY,
-                                     sizeof(PROGRESS_INFO));
+      infoPtr = 
+	(PROGRESS_INFO *)HeapAlloc (GetProcessHeap (), HEAP_ZERO_MEMORY,
+                                    sizeof(PROGRESS_INFO));
       wndPtr->wExtra[0] = (DWORD)infoPtr;
 
       /* initialize the info struct */
@@ -175,7 +201,7 @@
     
     case WM_DESTROY:
       TRACE(progress, "Progress Ctrl destruction, hwnd=%04x\n", hwnd);
-      HeapFree (SystemHeap, 0, infoPtr);
+      HeapFree (GetProcessHeap (), 0, infoPtr);
       break;
 
     case WM_ERASEBKGND:
@@ -194,7 +220,7 @@
       break;
 
     case WM_PAINT:
-      PROGRESS_Paint(wndPtr, wParam);
+      PROGRESS_Paint (wndPtr);
       break;
     
     case PBM_DELTAPOS:
@@ -204,8 +230,7 @@
       if(wParam != 0){
 	infoPtr->CurVal += (UINT16)wParam;
 	PROGRESS_CoercePos(wndPtr);
-        InvalidateRect32 (hwnd, NULL, FALSE);
-        UpdateWindow32 (hwnd);
+	PROGRESS_Refresh (wndPtr);
       }
       return temp;
 
@@ -216,8 +241,7 @@
       if(temp != wParam){
 	infoPtr->CurVal = (UINT16)wParam;
 	PROGRESS_CoercePos(wndPtr);
-        InvalidateRect32 (hwnd, NULL, FALSE);
-        UpdateWindow32 (hwnd);
+	PROGRESS_Refresh (wndPtr);
       }
       return temp;          
       
@@ -231,8 +255,7 @@
 	if(infoPtr->MaxVal <= infoPtr->MinVal)
 	  infoPtr->MaxVal = infoPtr->MinVal+1;
 	PROGRESS_CoercePos(wndPtr);
-        InvalidateRect32 (hwnd, NULL, FALSE);
-        UpdateWindow32 (hwnd);
+	PROGRESS_Refresh (wndPtr);
       }
       return temp;
 
@@ -251,10 +274,7 @@
       if(infoPtr->CurVal > infoPtr->MaxVal)
 	infoPtr->CurVal = infoPtr->MinVal;
       if(temp != infoPtr->CurVal)
-      {
-        InvalidateRect32 (hwnd, NULL, FALSE);
-        UpdateWindow32 (hwnd);
-      }
+	PROGRESS_Refresh (wndPtr);
       return temp;
 
     case PBM_SETRANGE32:
@@ -266,8 +286,7 @@
 	if(infoPtr->MaxVal <= infoPtr->MinVal)
 	  infoPtr->MaxVal = infoPtr->MinVal+1;
 	PROGRESS_CoercePos(wndPtr);
-        InvalidateRect32 (hwnd, NULL, FALSE);
-        UpdateWindow32 (hwnd);
+	PROGRESS_Refresh (wndPtr);
       }
       return temp;
     
@@ -287,16 +306,14 @@
       if (wParam)
 	UNKNOWN_PARAM(PBM_SETBARCOLOR, wParam, lParam);
       infoPtr->ColorBar = (COLORREF)lParam;     
-      InvalidateRect32 (hwnd, NULL, FALSE);
-      UpdateWindow32 (hwnd);
+      PROGRESS_Refresh (wndPtr);
       break;
 
     case PBM_SETBKCOLOR:
       if (wParam)
 	UNKNOWN_PARAM(PBM_SETBKCOLOR, wParam, lParam);
       infoPtr->ColorBk = (COLORREF)lParam;
-      InvalidateRect32 (hwnd, NULL, FALSE);
-      UpdateWindow32 (hwnd);
+      PROGRESS_Refresh (wndPtr);
       break;
 
     default: 
@@ -316,7 +333,8 @@
  * Registers the progress bar window class.
  * 
  */
-void PROGRESS_Register(void)
+void 
+PROGRESS_Register(void)
 {
     WNDCLASS32A wndClass;
 
diff --git a/controls/static.c b/controls/static.c
index 01f386c..255f01f 100644
--- a/controls/static.c
+++ b/controls/static.c
@@ -12,12 +12,13 @@
 #include "static.h"
 #include "heap.h"
 #include "debug.h"
+#include "tweak.h"
 
 static void STATIC_PaintTextfn( WND *wndPtr, HDC32 hdc );
 static void STATIC_PaintRectfn( WND *wndPtr, HDC32 hdc );
 static void STATIC_PaintIconfn( WND *wndPtr, HDC32 hdc );
 static void STATIC_PaintBitmapfn( WND *wndPtr, HDC32 hdc );
-
+static void STATIC_PaintEtchedfn( WND *wndPtr, HDC32 hdc );
 
 static COLORREF color_windowframe, color_background, color_window;
 
@@ -42,9 +43,9 @@
     NULL,                    /* SS_OWNERDRAW */
     STATIC_PaintBitmapfn,    /* SS_BITMAP */
     NULL,                    /* SS_ENHMETAFILE */
-    NULL,                    /* SS_ETCHEDHORIZ */
-    NULL,                    /* SS_ETCHEDVERT */
-    NULL,                    /* SS_ETCHEDFRAME */
+    STATIC_PaintEtchedfn,    /* SS_ETCHEDHORIZ */
+    STATIC_PaintEtchedfn,    /* SS_ETCHEDVERT */
+    STATIC_PaintEtchedfn,    /* SS_ETCHEDFRAME */
 };
 
 
@@ -170,6 +171,9 @@
     switch (uMsg)
     {
     case WM_NCCREATE:
+	if (TWEAK_Win95Look && (wndPtr->dwStyle & SS_SUNKEN))
+	    wndPtr->dwExStyle |= WS_EX_STATICEDGE;
+
         if (style == SS_ICON)
         {
             CREATESTRUCT32A *cs = (CREATESTRUCT32A *)lParam;
@@ -392,7 +396,7 @@
     if (infoPtr->hIcon) DrawIcon32( hdc, rc.left, rc.top, infoPtr->hIcon );
 }
 
-static void STATIC_PaintBitmapfn(WND *wndPtr, HDC32 hdc ) 
+static void STATIC_PaintBitmapfn(WND *wndPtr, HDC32 hdc )
 {
     RECT32 rc;
     HBRUSH32 hbrush;
@@ -416,3 +420,48 @@
         GDI_HEAP_UNLOCK(infoPtr->hIcon);
     }
 }
+
+
+static void STATIC_PaintEtchedfn( WND *wndPtr, HDC32 hdc )
+{
+    RECT32 rc;
+    HBRUSH32 hbrush;
+    HPEN32 hpen;
+
+    if (!TWEAK_Win95Look) return;
+
+    GetClientRect32( wndPtr->hwndSelf, &rc );
+    hbrush = SendMessage32A( GetParent32(wndPtr->hwndSelf), WM_CTLCOLORSTATIC,
+                             hdc, wndPtr->hwndSelf );
+    FillRect32( hdc, &rc, hbrush );
+
+    switch (wndPtr->dwStyle & SS_TYPEMASK)
+    {
+	case SS_ETCHEDHORZ:
+	    hpen = SelectObject32 (hdc, GetSysColorPen32 (COLOR_3DSHADOW));
+	    MoveToEx32 (hdc, rc.left, rc.bottom / 2 - 1, NULL);
+	    LineTo32 (hdc, rc.right - 1, rc.bottom / 2 - 1);
+	    SelectObject32 (hdc, GetSysColorPen32 (COLOR_3DHIGHLIGHT));
+	    MoveToEx32 (hdc, rc.left, rc.bottom / 2, NULL);
+	    LineTo32 (hdc, rc.right, rc.bottom / 2);
+	    LineTo32 (hdc, rc.right, rc.bottom / 2 - 1);
+	    SelectObject32 (hdc, hpen);
+	    break;
+
+	case SS_ETCHEDVERT:
+	    hpen = SelectObject32 (hdc, GetSysColorPen32 (COLOR_3DSHADOW));
+	    MoveToEx32 (hdc, rc.right / 2 - 1, rc.top, NULL);
+	    LineTo32 (hdc, rc.right / 2 - 1, rc.bottom - 1);
+	    SelectObject32 (hdc, GetSysColorPen32 (COLOR_3DHIGHLIGHT));
+	    MoveToEx32 (hdc, rc.right / 2, rc.top, NULL);
+	    LineTo32 (hdc, rc.right / 2, rc.bottom);
+	    LineTo32 (hdc, rc.right / 2 -1 , rc.bottom);
+	    SelectObject32 (hdc, hpen); 
+	    break;
+
+	case SS_ETCHEDFRAME:
+	    DrawEdge32 (hdc, &rc, EDGE_ETCHED, BF_RECT);
+	    break;
+    }
+}
+
diff --git a/controls/status.c b/controls/status.c
index 6df39b0..93113e1 100644
--- a/controls/status.c
+++ b/controls/status.c
@@ -103,7 +103,7 @@
     /* now draw text */
     if (text) {
       int oldbkmode = SetBkMode32(hdc, TRANSPARENT);
-      LPSTR p = text;
+      LPSTR p = (LPSTR)text;
       UINT32 align = DT_LEFT;
       if (*p == '\t') {
 	p++;
diff --git a/controls/toolbar.c b/controls/toolbar.c
index 3c5d134..4f3ce96 100644
--- a/controls/toolbar.c
+++ b/controls/toolbar.c
@@ -11,14 +11,16 @@
  *     Eric <ekohl@abo.rhein-zeitung.de>
  *
  * TODO:
- *   - Many messages.
- *   - All notifications.
+ *   - Bitmap drawing.
+ *   - Button wrapping.
+ *   - Messages.
+ *   - Notifications.
  *   - Fix TB_GETBITMAPFLAGS.
  *   - Fix TB_GETROWS and TB_SETROWS.
  *   - Tooltip support (partially).
  *   - Unicode suppport.
  *   - Internal COMMCTL32 bitmaps.
- *   - Customize dialog.
+ *   - Fix TOOLBAR_Customize. (Customize dialog.)
  *
  * Testing:
  *   - Run tests using Waite Group Windows95 API Bible Volume 2.
@@ -39,9 +41,10 @@
 #include "debug.h"
 
 
-#define SEPARATOR_WIDTH  8
-#define SEPARATOR_HEIGHT 5
-
+#define SEPARATOR_WIDTH    8
+#define SEPARATOR_HEIGHT   5
+#define TOP_BORDER         2
+#define BOTTOM_BORDER      2
 
 
 
@@ -49,76 +52,94 @@
 
 
 static void
+TOOLBAR_DrawFlatSeparator (LPRECT32 lpRect, HDC32 hdc)
+{
+    INT32 x = (lpRect->left + lpRect->right) / 2 - 1;
+    INT32 yBottom = lpRect->bottom - 3;
+    INT32 yTop = lpRect->top + 1;
+
+    SelectObject32 ( hdc, GetSysColorPen32 (COLOR_3DSHADOW));
+    MoveToEx32 (hdc, x, yBottom, NULL);
+    LineTo32 (hdc, x, yTop);
+    x++;
+    SelectObject32 ( hdc, GetSysColorPen32 (COLOR_3DHILIGHT));
+    MoveToEx32 (hdc, x, yBottom, NULL);
+    LineTo32 (hdc, x, yTop);
+}
+
+
+static void
 TOOLBAR_DrawButton (WND *wndPtr, TBUTTON_INFO *btnPtr, HDC32 hdc)
 {
     TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr(wndPtr);
+    BOOL32 bFlat = (wndPtr->dwStyle & TBSTYLE_FLAT);
     RECT32 rc;
 
     if (btnPtr->fsState & TBSTATE_HIDDEN) return;
 
     rc = btnPtr->rect;
     if (btnPtr->fsStyle & TBSTYLE_SEP) {
-
+	if ((bFlat) && (btnPtr->idCommand == 0))
+	    TOOLBAR_DrawFlatSeparator (&btnPtr->rect, hdc);
+	return;
     }
-    else {
-	if (!(btnPtr->fsState & TBSTATE_ENABLED)) {
-	    /* button is disabled */
-	    HICON32 hIcon;
-	    DrawEdge32 (hdc, &rc, EDGE_RAISED,
-			BF_SOFT | BF_RECT | BF_MIDDLE | BF_ADJUST);
-	    hIcon = ImageList_GetIcon (infoPtr->himlDef, btnPtr->iBitmap, ILD_IMAGE);
-	    DrawState32A (hdc, (HBRUSH32)NULL, NULL, MAKELONG(hIcon, 0), 0,
-		rc.left+1, rc.top+1,
-		infoPtr->nBitmapWidth, infoPtr->nBitmapHeight, DST_ICON|DSS_DISABLED);
-//	    ImageList_Draw (infoPtr->himlDis, btnPtr->iBitmap, hdc,
-//			    rc.left+1, rc.top+1, ILD_NORMAL);
-	    return;
-	}
 
-	/* TBSTYLE_BUTTON */
-	if (btnPtr->fsState & TBSTATE_PRESSED) {
-	    DrawEdge32 (hdc, &rc, EDGE_SUNKEN,
-			BF_RECT | BF_MIDDLE | BF_ADJUST);
-	    ImageList_Draw (infoPtr->himlDef, btnPtr->iBitmap, hdc,
-			    rc.left+2, rc.top+2, ILD_NORMAL);
-	    return;
-	}
-
-	if ((btnPtr->fsStyle & TBSTYLE_CHECK) &&
-	    (btnPtr->fsState & TBSTATE_CHECKED)) {
-	    HBRUSH32 hbr;
-	    DrawEdge32 (hdc, &rc, EDGE_SUNKEN,
-			BF_RECT | BF_MIDDLE | BF_ADJUST);
-
-	    hbr = SelectObject32 (hdc, CACHE_GetPattern55AABrush ());
-	    PatBlt32 (hdc, rc.left, rc.top, rc.right - rc.left,
-		      rc.bottom - rc.top, 0x00FA0089);
-	    SelectObject32 (hdc, hbr);
-	    ImageList_Draw (infoPtr->himlDef, btnPtr->iBitmap, hdc,
-			    rc.left+2, rc.top+2, ILD_NORMAL);
-	    return;
-	}
-	
-	if (btnPtr->fsState & TBSTATE_INDETERMINATE) {
-	    HBRUSH32 hbr;
-	    DrawEdge32 (hdc, &rc, EDGE_RAISED,
-			BF_SOFT | BF_RECT | BF_MIDDLE | BF_ADJUST);
-
-	    hbr = SelectObject32 (hdc, CACHE_GetPattern55AABrush ());
-	    PatBlt32 (hdc, rc.left, rc.top, rc.right - rc.left,
-		      rc.bottom - rc.top, 0x00FA0089);
-	    SelectObject32 (hdc, hbr);
-//	    ImageList_Draw (infoPtr->himlDef, btnPtr->iBitmap, hdc,
-//			    rc.left+1, rc.top+1, ILD_NORMAL);
-	    return;
-	}
-
-	/* normal state */
+    /* disabled */
+    if (!(btnPtr->fsState & TBSTATE_ENABLED)) {
+	HICON32 hIcon;
 	DrawEdge32 (hdc, &rc, EDGE_RAISED,
 		    BF_SOFT | BF_RECT | BF_MIDDLE | BF_ADJUST);
-	ImageList_Draw (infoPtr->himlDef, btnPtr->iBitmap, hdc,
-			rc.left+1, rc.top+1, ILD_NORMAL);
+
+//	ImageList_Draw (infoPtr->himlDis, btnPtr->iBitmap, hdc,
+//			rc.left+1, rc.top+1, ILD_NORMAL);
+	return;
     }
+
+    /* pressed TBSTYLE_BUTTON */
+    if (btnPtr->fsState & TBSTATE_PRESSED) {
+	DrawEdge32 (hdc, &rc, EDGE_SUNKEN,
+		    BF_RECT | BF_MIDDLE | BF_ADJUST);
+	ImageList_Draw (infoPtr->himlDef, btnPtr->iBitmap, hdc,
+			rc.left+2, rc.top+2, ILD_NORMAL);
+	return;
+    }
+
+    /* checked TBSTYLE_CHECK*/
+    if ((btnPtr->fsStyle & TBSTYLE_CHECK) &&
+	(btnPtr->fsState & TBSTATE_CHECKED)) {
+	HBRUSH32 hbr;
+	DrawEdge32 (hdc, &rc, EDGE_SUNKEN,
+		    BF_RECT | BF_MIDDLE | BF_ADJUST);
+
+	hbr = SelectObject32 (hdc, CACHE_GetPattern55AABrush ());
+	PatBlt32 (hdc, rc.left, rc.top, rc.right - rc.left,
+		  rc.bottom - rc.top, 0x00FA0089);
+	SelectObject32 (hdc, hbr);
+	ImageList_Draw (infoPtr->himlDef, btnPtr->iBitmap, hdc,
+			rc.left+2, rc.top+2, ILD_NORMAL);
+	return;
+    }
+
+    /* indeterminate */	
+    if (btnPtr->fsState & TBSTATE_INDETERMINATE) {
+	HBRUSH32 hbr;
+	DrawEdge32 (hdc, &rc, EDGE_RAISED,
+		    BF_SOFT | BF_RECT | BF_MIDDLE | BF_ADJUST);
+
+	hbr = SelectObject32 (hdc, CACHE_GetPattern55AABrush ());
+	PatBlt32 (hdc, rc.left, rc.top, rc.right - rc.left,
+		  rc.bottom - rc.top, 0x00FA0089);
+	SelectObject32 (hdc, hbr);
+//	ImageList_Draw (infoPtr->himlDis, btnPtr->iBitmap, hdc,
+//			rc.left+1, rc.top+1, ILD_NORMAL);
+	return;
+    }
+
+    /* normal state */
+    DrawEdge32 (hdc, &rc, EDGE_RAISED,
+		BF_SOFT | BF_RECT | BF_MIDDLE | BF_ADJUST);
+    ImageList_Draw (infoPtr->himlDef, btnPtr->iBitmap, hdc,
+		    rc.left+1, rc.top+1, ILD_NORMAL);
 }
 
 
@@ -130,14 +151,10 @@
     TBUTTON_INFO *btnPtr;
     INT32 i;
 
-
     /* draw buttons */
-
     btnPtr = infoPtr->buttons;
-    for (i = 0; i < infoPtr->nNumButtons; i++) {
+    for (i = 0; i < infoPtr->nNumButtons; i++, btnPtr++)
 	TOOLBAR_DrawButton (wndPtr, btnPtr, hdc);
-	btnPtr++;
-    }
 }
 
 
@@ -146,33 +163,63 @@
 {
     TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr(wndPtr);
     TBUTTON_INFO *btnPtr;
-    RECT32 rect;
-    INT32 i;
+    INT32 i, j, nRows;
+    INT32 x, y, cx, cy;
+    BOOL32 bVertical;
 
-    rect.left   = infoPtr->nIndent;
-    rect.top    = infoPtr->nButtonTop;
-//    rect.right  = rect.left + infoPtr->nButtonWidth;
-    rect.bottom = rect.top + infoPtr->nButtonHeight;
+    x  = infoPtr->nIndent;
+    y  = TOP_BORDER;
+    cx = infoPtr->nButtonWidth;
+    cy = infoPtr->nButtonHeight;
+    nRows = 1;
 
     btnPtr = infoPtr->buttons;
     for (i = 0; i < infoPtr->nNumButtons; i++, btnPtr++) {
-	if (btnPtr->fsState & TBSTATE_HIDDEN) {
-	    btnPtr->rect.left = 0;
-	    btnPtr->rect.right = 0;
-	    btnPtr->rect.top = 0;
-	    btnPtr->rect.bottom = 0;
+	bVertical = FALSE;
+
+	if (btnPtr->fsState & TBSTATE_HIDDEN)
 	    continue;
+
+	if (btnPtr->fsStyle & TBSTYLE_SEP) {
+	    /* UNDOCUMENTED: If a separator has a non zero bitmap index, */
+	    /* it is the actual width of the separator. This is used for */
+	    /* custom controls in toolbars.                              */
+	    if ((wndPtr->dwStyle & TBSTYLE_WRAPABLE) &&
+		(btnPtr->fsState & TBSTATE_WRAP)) {
+		x = 0;
+		y += cy;
+		cx = infoPtr->nWidth;
+		cy = ((btnPtr->iBitmap == 0) ?
+		    SEPARATOR_WIDTH : btnPtr->iBitmap) * 2 / 3;
+		nRows++;
+		bVertical = TRUE;
+	    }
+	    else
+		cx = (btnPtr->iBitmap == 0) ?
+		    SEPARATOR_WIDTH : btnPtr->iBitmap;
+	}
+	else {
+	    /* this must be a button */
+	    cx = infoPtr->nButtonWidth;
+
 	}
 
-	btnPtr->rect = rect;
-	if (btnPtr->fsStyle & TBSTYLE_SEP)
-	    btnPtr->rect.right = btnPtr->rect.left + SEPARATOR_WIDTH;
+	btnPtr->rect.left   = x;
+	btnPtr->rect.top    = y;
+	btnPtr->rect.right  = x + cx;
+	btnPtr->rect.bottom = y + cy;
+
+	if (bVertical) {
+	    x = 0;
+	    y += cy;
+	    if (i < infoPtr->nNumButtons)
+		nRows++;
+	}
 	else
-	    btnPtr->rect.right = btnPtr->rect.left + infoPtr->nButtonWidth;
-	rect.left = btnPtr->rect.right;
+	    x += cx;
     }
 
-    infoPtr->nHeight = rect.bottom + 8;
+    infoPtr->nHeight = y + cy + BOTTOM_BORDER;
 }
 
 
@@ -183,9 +230,8 @@
     TBUTTON_INFO *btnPtr;
     INT32 i;
     
-
     btnPtr = infoPtr->buttons;
-    for (i = 0; i < infoPtr->nNumButtons; i++) {
+    for (i = 0; i < infoPtr->nNumButtons; i++, btnPtr++) {
 	if (btnPtr->fsStyle & TBSTYLE_SEP) {
 	    if (PtInRect32 (&btnPtr->rect, *lpPt)) {
 		TRACE (toolbar, " ON SEPARATOR %d!\n", i);
@@ -197,10 +243,7 @@
 		TRACE (toolbar, " ON BUTTON %d!\n", i);
 		return i;
 	    }
-
 	}
-
-	btnPtr++;
     }
 
     TRACE (toolbar, " NOWHERE!\n");
@@ -215,12 +258,11 @@
     INT32 i;
 
     btnPtr = infoPtr->buttons;
-    for (i = 0; i < infoPtr->nNumButtons; i++) {
+    for (i = 0; i < infoPtr->nNumButtons; i++, btnPtr++) {
 	if (btnPtr->idCommand == idCommand) {
 	    TRACE (toolbar, "command=%d index=%d\n", idCommand, i);
 	    return i;
 	}
-	btnPtr++;
     }
     TRACE (toolbar, "no index found for command=%d\n", idCommand);
     return -1;
@@ -289,28 +331,15 @@
 	/* create new default image list */
 	TRACE (toolbar, "creating default image list!\n");
 	infoPtr->himlDef =
-	    ImageList_Create (infoPtr->nBitmapWidth, 
-			      infoPtr->nBitmapHeight, ILC_COLOR | ILC_MASK,
-			      (INT32)wParam, 2);
+	    ImageList_Create (infoPtr->nBitmapWidth, infoPtr->nBitmapHeight,
+			      ILC_COLOR | ILC_MASK, (INT32)wParam, 2);
     }
 
-#if 0
-    if (!(infoPtr->himlDis)) {
-	/* create new disabled image list */
-	TRACE (toolbar, "creating disabled image list!\n");
-	infoPtr->himlDis =
-	    ImageList_Create (infoPtr->nBitmapWidth, 
-			      infoPtr->nBitmapHeight, ILC_COLOR | ILC_MASK,
-			      (INT32)wParam, 2);
-    }
-#endif
-
     /* Add bitmaps to the default image list */
     if (lpAddBmp->hInst == (HINSTANCE32)0) {
 	nIndex = 
 	    ImageList_AddMasked (infoPtr->himlDef, (HBITMAP32)lpAddBmp->nID,
-				 0xC0C0C0);
-//				 GetSysColor32 (COLOR_3DFACE));
+				 GetSysColor32 (COLOR_3DFACE));
     }
     else if (lpAddBmp->hInst == HINST_COMMCTRL) {
 	/* add internal bitmaps */
@@ -353,17 +382,17 @@
 
     if (infoPtr->nNumButtons == 0) {
 	infoPtr->buttons =
-	    HeapAlloc (SystemHeap, HEAP_ZERO_MEMORY,
+	    HeapAlloc (GetProcessHeap (), HEAP_ZERO_MEMORY,
 		       sizeof (TBUTTON_INFO) * nNewButtons);
     }
     else {
 	TBUTTON_INFO *oldButtons = infoPtr->buttons;
 	infoPtr->buttons =
-	    HeapAlloc (SystemHeap, HEAP_ZERO_MEMORY,
+	    HeapAlloc (GetProcessHeap (), HEAP_ZERO_MEMORY,
 		       sizeof (TBUTTON_INFO) * nNewButtons);
 	memcpy (&infoPtr->buttons[0], &oldButtons[0],
 		nOldButtons * sizeof(TBUTTON_INFO));
-        HeapFree (SystemHeap, 0, oldButtons);
+        HeapFree (GetProcessHeap (), 0, oldButtons);
     }
 
     infoPtr->nNumButtons = nNewButtons;
@@ -409,20 +438,20 @@
 	nIndex = infoPtr->nNumStrings;
 	if (infoPtr->nNumStrings == 0) {
 	    infoPtr->strings =
-		HeapAlloc (SystemHeap, HEAP_ZERO_MEMORY, sizeof(char *));
+		HeapAlloc (GetProcessHeap (), HEAP_ZERO_MEMORY, sizeof(char *));
 	}
 	else {
 	    char **oldStrings = infoPtr->strings;
 	    infoPtr->strings =
-		HeapAlloc (SystemHeap, HEAP_ZERO_MEMORY,
+		HeapAlloc (GetProcessHeap (), HEAP_ZERO_MEMORY,
 			   sizeof(char *) * (infoPtr->nNumStrings + 1));
 	    memcpy (&infoPtr->strings[0], &oldStrings[0],
 		    sizeof(char *) * infoPtr->nNumStrings);
-	    HeapFree (SystemHeap, 0, oldStrings);
+	    HeapFree (GetProcessHeap (), 0, oldStrings);
 	}
 
 	infoPtr->strings[infoPtr->nNumStrings] =
-	    HeapAlloc (SystemHeap, HEAP_ZERO_MEMORY, sizeof(char)*(len+1));
+	    HeapAlloc (GetProcessHeap (), HEAP_ZERO_MEMORY, sizeof(char)*(len+1));
 	lstrcpy32A (infoPtr->strings[infoPtr->nNumStrings], szString);
 	infoPtr->nNumStrings++;
     }
@@ -439,20 +468,20 @@
 
 	    if (infoPtr->nNumStrings == 0) {
 		infoPtr->strings =
-		    HeapAlloc (SystemHeap, HEAP_ZERO_MEMORY, sizeof(char *));
+		    HeapAlloc (GetProcessHeap (), HEAP_ZERO_MEMORY, sizeof(char *));
 	    }
 	    else {
 		char **oldStrings = infoPtr->strings;
 		infoPtr->strings =
-		    HeapAlloc (SystemHeap, HEAP_ZERO_MEMORY,
+		    HeapAlloc (GetProcessHeap (), HEAP_ZERO_MEMORY,
 			       sizeof(char *) * (infoPtr->nNumStrings + 1));
 		memcpy (&infoPtr->strings[0], &oldStrings[0],
 			sizeof(char *) * infoPtr->nNumStrings);
-		HeapFree (SystemHeap, 0, oldStrings);
+		HeapFree (GetProcessHeap (), 0, oldStrings);
 	    }
 
 	    infoPtr->strings[infoPtr->nNumStrings] =
-		HeapAlloc (SystemHeap, HEAP_ZERO_MEMORY, sizeof(char)*(len+1));
+		HeapAlloc (GetProcessHeap (), HEAP_ZERO_MEMORY, sizeof(char)*(len+1));
 	    lstrcpy32A (infoPtr->strings[infoPtr->nNumStrings], p);
 	    infoPtr->nNumStrings++;
 
@@ -493,6 +522,12 @@
 {
     TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr(wndPtr);
 
+    if (infoPtr == NULL) {
+	ERR (toolbar, "(0x%08lx, 0x%08x, 0x%08lx)\n", (DWORD)wndPtr, wParam, lParam);
+	ERR (toolbar, "infoPtr == NULL!\n");
+	return 0;
+    }
+
     infoPtr->dwStructSize = (DWORD)wParam;
 
     return 0;
@@ -575,7 +610,13 @@
 }
 
 
-// << TOOLBAR_Customize >>
+static LRESULT
+TOOLBAR_Customize (WND *wndPtr)
+{
+    FIXME (toolbar, "customization not implemented!\n");
+
+    return 0;
+}
 
 
 static LRESULT
@@ -589,7 +630,7 @@
 
     if (infoPtr->nNumButtons == 1) {
 	TRACE (toolbar, " simple delete!\n");
-	HeapFree (SystemHeap, 0, infoPtr->buttons);
+	HeapFree (GetProcessHeap (), 0, infoPtr->buttons);
 	infoPtr->buttons = NULL;
 	infoPtr->nNumButtons = 0;
     }
@@ -598,7 +639,7 @@
         TRACE(toolbar, "complex delete! [nIndex=%d]\n", nIndex);
 
 	infoPtr->nNumButtons--;
-	infoPtr->buttons = HeapAlloc (SystemHeap, HEAP_ZERO_MEMORY,
+	infoPtr->buttons = HeapAlloc (GetProcessHeap (), HEAP_ZERO_MEMORY,
 				      sizeof (TBUTTON_INFO) * infoPtr->nNumButtons);
         if (nIndex > 0) {
             memcpy (&infoPtr->buttons[0], &oldButtons[0],
@@ -610,7 +651,7 @@
                     (infoPtr->nNumButtons - nIndex) * sizeof(TBUTTON_INFO));
         }
 
-        HeapFree (SystemHeap, 0, oldButtons);
+        HeapFree (GetProcessHeap (), 0, oldButtons);
     }
 
     TOOLBAR_CalcToolbar (wndPtr);
@@ -636,7 +677,7 @@
 
     btnPtr = &infoPtr->buttons[nIndex];
     if (LOWORD(lParam) == FALSE)
-	btnPtr->fsState &= ~TBSTATE_ENABLED;
+	btnPtr->fsState &= ~(TBSTATE_ENABLED | TBSTATE_PRESSED);
     else
 	btnPtr->fsState |= TBSTATE_ENABLED;
 
@@ -700,7 +741,16 @@
 
 
 // << TOOLBAR_GetButtonInfo >>
-// << TOOLBAR_GetButtonSize >>
+
+
+static LRESULT
+TOOLBAR_GetButtonSize (WND *wndPtr)
+{
+    TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr(wndPtr);
+
+    return MAKELONG((WORD)infoPtr->nButtonWidth,
+		    (WORD)infoPtr->nButtonHeight);
+}
 
 
 static LRESULT
@@ -904,7 +954,7 @@
 
     oldButtons = infoPtr->buttons;
     infoPtr->nNumButtons++;
-    infoPtr->buttons = HeapAlloc (SystemHeap, HEAP_ZERO_MEMORY,
+    infoPtr->buttons = HeapAlloc (GetProcessHeap (), HEAP_ZERO_MEMORY,
 				  sizeof (TBUTTON_INFO) * infoPtr->nNumButtons);
     /* pre insert copy */
     if (nIndex > 0) {
@@ -926,7 +976,7 @@
 		(infoPtr->nNumButtons - nIndex - 1) * sizeof(TBUTTON_INFO));
     }
 
-    HeapFree (SystemHeap, 0, oldButtons);
+    HeapFree (GetProcessHeap (), 0, oldButtons);
 
     TOOLBAR_CalcToolbar (wndPtr);
 
@@ -1059,7 +1109,37 @@
 
 
 // << TOOLBAR_ReplaceBitmap >>
-// << TOOLBAR_SaveRestore >>
+
+
+static LRESULT
+TOOLBAR_SaveRestore32A (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
+{
+    TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr(wndPtr);
+    LPTBSAVEPARAMS32A lpSave = (LPTBSAVEPARAMS32A)lParam;
+
+    if (lpSave == NULL) return 0;
+
+    if ((BOOL32)wParam) {
+	/* save toolbar information */
+	FIXME (toolbar, "save to \"%s\" \"%s\"\n",
+	       lpSave->pszSubKey, lpSave->pszValueName);
+
+
+    }
+    else {
+	/* restore toolbar information */
+
+	FIXME (toolbar, "restore from \"%s\" \"%s\"\n",
+	       lpSave->pszSubKey, lpSave->pszValueName);
+
+
+    }
+
+    return 0;
+}
+
+
+// << TOOLBAR_SaveRestore32W >>
 // << TOOLBAR_SetAnchorHighlight >>
 
 
@@ -1233,26 +1313,15 @@
 static LRESULT
 TOOLBAR_Create (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
 {
-    TOOLBAR_INFO *infoPtr;
-
-    /* allocate memory for info structure */
-    infoPtr = (TOOLBAR_INFO *)HeapAlloc (SystemHeap, HEAP_ZERO_MEMORY,
-                                   sizeof(TOOLBAR_INFO));
-    wndPtr->wExtra[0] = (DWORD)infoPtr;
-
-    if (infoPtr == NULL) {
-	ERR (toolbar, "could not allocate info memory!\n");
-	return 0;
-    }
+    TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr(wndPtr);
 
     /* initialize info structure */
     infoPtr->nButtonHeight = 22;
     infoPtr->nButtonWidth = 23;
-    infoPtr->nButtonTop = 2;
     infoPtr->nBitmapHeight = 15;
     infoPtr->nBitmapWidth = 16;
 
-    infoPtr->nHeight = infoPtr->nButtonHeight + 6;
+    infoPtr->nHeight = infoPtr->nButtonHeight + TOP_BORDER + BOTTOM_BORDER;
     infoPtr->nMaxRows = 1;
 
     infoPtr->bCaptured = 0;
@@ -1260,6 +1329,8 @@
     infoPtr->nOldHit = -1;
 
     infoPtr->hwndNotify = GetParent32 (wndPtr->hwndSelf);
+    infoPtr->bTransparent = (wndPtr->dwStyle & TBSTYLE_FLAT);
+    infoPtr->nHotItem = -1;
 
     return 0;
 }
@@ -1276,16 +1347,16 @@
 
     /* delete button data */
     if (infoPtr->buttons)
-	HeapFree (SystemHeap, 0, infoPtr->buttons);
+	HeapFree (GetProcessHeap (), 0, infoPtr->buttons);
 
     /* delete strings */
     if (infoPtr->strings) {
 	INT32 i;
 	for (i = 0; i < infoPtr->nNumStrings; i++)
 	    if (infoPtr->strings[i])
-		HeapFree (SystemHeap, 0, infoPtr->strings[i]);
+		HeapFree (GetProcessHeap (), 0, infoPtr->strings[i]);
 
-	HeapFree (SystemHeap, 0, infoPtr->strings);
+	HeapFree (GetProcessHeap (), 0, infoPtr->strings);
     }
 
     /* destroy default image list */
@@ -1301,7 +1372,7 @@
 	ImageList_Destroy (infoPtr->himlHot);
 
     /* free toolbar info data */
-    HeapFree (SystemHeap, 0, infoPtr);
+    HeapFree (GetProcessHeap (), 0, infoPtr);
 
     return 0;
 }
@@ -1334,11 +1405,8 @@
 	TOOLBAR_DrawButton (wndPtr, btnPtr, hdc);
 	ReleaseDC32 (wndPtr->hwndSelf, hdc);
     }
-    else if (wndPtr->dwStyle & CCS_ADJUSTABLE) {
-	/* customize */
-
-	FIXME (toolbar, "customization not implemented!\n");
-    }
+    else if (wndPtr->dwStyle & CCS_ADJUSTABLE)
+	TOOLBAR_Customize (wndPtr);
 
     return 0;
 }
@@ -1388,6 +1456,7 @@
     INT32   nHit;
     INT32   nOldIndex = -1;
     HDC32   hdc;
+    BOOL32  bSendMessage = TRUE;
 
     pt.x = (INT32)LOWORD(lParam);
     pt.y = (INT32)HIWORD(lParam);
@@ -1399,25 +1468,28 @@
 	btnPtr = &infoPtr->buttons[infoPtr->nButtonDown];
 	btnPtr->fsState &= ~TBSTATE_PRESSED;
 
-	if (btnPtr->fsStyle & TBSTYLE_CHECK) {
-	    if (btnPtr->fsStyle & TBSTYLE_GROUP) {
-		nOldIndex = TOOLBAR_GetCheckedGroupButtonIndex (infoPtr, infoPtr->nButtonDown);
-		if (nOldIndex == infoPtr->nButtonDown)
-		    return 0;
-		if (nOldIndex != -1)
-		    infoPtr->buttons[nOldIndex].fsState &= ~TBSTATE_CHECKED;
-		btnPtr->fsState |= TBSTATE_CHECKED;
-	    }
-	    else {
-		if (btnPtr->fsState & TBSTATE_CHECKED)
-		    btnPtr->fsState &= ~TBSTATE_CHECKED;
-		else
+	if (nHit == infoPtr->nButtonDown) {
+	    if (btnPtr->fsStyle & TBSTYLE_CHECK) {
+		if (btnPtr->fsStyle & TBSTYLE_GROUP) {
+		    nOldIndex = TOOLBAR_GetCheckedGroupButtonIndex (infoPtr,
+			infoPtr->nButtonDown);
+		    if (nOldIndex == infoPtr->nButtonDown)
+			bSendMessage = FALSE;
+		    if ((nOldIndex != infoPtr->nButtonDown) && 
+			(nOldIndex != -1))
+			infoPtr->buttons[nOldIndex].fsState &= ~TBSTATE_CHECKED;
 		    btnPtr->fsState |= TBSTATE_CHECKED;
+		}
+		else {
+		    if (btnPtr->fsState & TBSTATE_CHECKED)
+			btnPtr->fsState &= ~TBSTATE_CHECKED;
+		    else
+			btnPtr->fsState |= TBSTATE_CHECKED;
+		}
 	    }
 	}
-
-	infoPtr->nButtonDown = -1;
-	infoPtr->nOldHit = -1;
+	else
+	    bSendMessage = FALSE;
 
 	hdc = GetDC32 (wndPtr->hwndSelf);
 	if (nOldIndex != -1)
@@ -1425,9 +1497,13 @@
 	TOOLBAR_DrawButton (wndPtr, btnPtr, hdc);
 	ReleaseDC32 (wndPtr->hwndSelf, hdc);
 
-	SendMessage32A (GetParent32 (wndPtr->hwndSelf), WM_COMMAND,
-			MAKEWPARAM(btnPtr->idCommand, 0),
-			(LPARAM)wndPtr->hwndSelf);
+	if (bSendMessage)
+	    SendMessage32A (infoPtr->hwndNotify, WM_COMMAND,
+			    MAKEWPARAM(btnPtr->idCommand, 0),
+			    (LPARAM)wndPtr->hwndSelf);
+
+	infoPtr->nButtonDown = -1;
+	infoPtr->nOldHit = -1;
     }
 
     return 0;
@@ -1470,34 +1546,43 @@
 }
 
 
-
-
-
 static LRESULT
 TOOLBAR_NCCalcSize (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
 {
-    RECT32 tmpRect = {0, 0, 0, 0};
-    LPRECT32 winRect;
-
-//    DefWindowProc32A (wndPtr->hwndSelf, WM_NCCALCSIZE, wParam, lParam);
-
-    winRect = (LPRECT32)lParam;
-
-//    if (wndPtr->dwStyle & WS_BORDER)
-//	InflateRect32 (&tmpRect, 1, 1);
-
     if (!(wndPtr->dwStyle & CCS_NODIVIDER)) {
-	tmpRect.top -= 2;
-	tmpRect.bottom -= 2;
+	LPRECT32 winRect  = (LPRECT32)lParam;
+	winRect->top    += 2;   
+	winRect->bottom += 2;   
     }
 
-    winRect->left   -= tmpRect.left;   
-    winRect->top    -= tmpRect.top;   
-    winRect->right  -= tmpRect.right;   
-    winRect->bottom -= tmpRect.bottom;   
-
     return DefWindowProc32A (wndPtr->hwndSelf, WM_NCCALCSIZE, wParam, lParam);
-//    return 0;
+}
+
+
+static LRESULT
+TOOLBAR_NCCreate (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
+{
+    TOOLBAR_INFO *infoPtr;
+
+    /* allocate memory for info structure */
+    infoPtr = (TOOLBAR_INFO *)HeapAlloc (GetProcessHeap (), HEAP_ZERO_MEMORY,
+                                   sizeof(TOOLBAR_INFO));
+    wndPtr->wExtra[0] = (DWORD)infoPtr;
+
+    if (infoPtr == NULL) {
+	ERR (toolbar, "could not allocate info memory!\n");
+	return 0;
+    }
+
+    if ((TOOLBAR_INFO*)wndPtr->wExtra[0] != infoPtr) {
+	ERR (toolbar, "pointer assignment error!\n");
+	return 0;
+    }
+
+    /* this is just for security (reliable??)*/
+    infoPtr->dwStructSize = sizeof(TBBUTTON);
+
+    return DefWindowProc32A (wndPtr->hwndSelf, WM_NCCREATE, wParam, lParam);
 }
 
 
@@ -1568,32 +1653,44 @@
     TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr(wndPtr);
     RECT32 parent_rect;
     HWND32 parent;
+    INT32  x, y, cx, cy;
     INT32  flags;
+    UINT32 uPosFlags = 0;
 
     flags = (INT32) wParam;
 
     /* FIXME for flags =
-     * SIZE_MAXIMIZED, SIZE_MAXSHOW, SIZE_MINIMIZED, SIZE_RESTORED
+     * SIZE_MAXIMIZED, SIZE_MAXSHOW, SIZE_MINIMIZED
      */
 
-//    if (flags == SIZE_RESTORED) {
+    if (flags == SIZE_RESTORED) {
 	/* width and height don't apply */
 	parent = GetParent32 (wndPtr->hwndSelf);
 	GetClientRect32(parent, &parent_rect);
-        infoPtr->nWidth = parent_rect.right - parent_rect.left;
-	TOOLBAR_CalcToolbar (wndPtr);
-	MoveWindow32(wndPtr->hwndSelf, parent_rect.left, parent_rect.top, //0, 0,
-		     infoPtr->nWidth, infoPtr->nHeight, TRUE);
-//    }
+
+	if (wndPtr->dwStyle & CCS_NORESIZE)
+	    uPosFlags |= SWP_NOSIZE;
+	else {
+	    infoPtr->nWidth = parent_rect.right - parent_rect.left;
+	    TOOLBAR_CalcToolbar (wndPtr);
+	    cy = infoPtr->nHeight;
+	    cx = infoPtr->nWidth;
+	}
+
+	if (wndPtr->dwStyle & CCS_NOPARENTALIGN) {
+	    uPosFlags |= SWP_NOMOVE;
+	}
+
+	if (!(wndPtr->dwStyle & CCS_NODIVIDER))
+	    cy += 2;
+
+	SetWindowPos32 (wndPtr->hwndSelf, 0, parent_rect.left, parent_rect.top,
+			cx, cy, uPosFlags | SWP_NOZORDER);
+    }
     return 0;
 }
 
 
-
-
-
-
-
 LRESULT WINAPI
 ToolbarWindowProc (HWND32 hwnd, UINT32 uMsg, WPARAM32 wParam, LPARAM lParam)
 {
@@ -1632,7 +1729,8 @@
 	case TB_COMMANDTOINDEX:
 	    return TOOLBAR_CommandToIndex (wndPtr, wParam, lParam);
 
-//	case TB_CUSTOMIZE:
+	case TB_CUSTOMIZE:
+	    return TOOLBAR_Customize (wndPtr);
 
 	case TB_DELETEBUTTON:
 	    return TOOLBAR_DeleteButton (wndPtr, wParam, lParam);
@@ -1652,7 +1750,9 @@
 	    return TOOLBAR_GetButton (wndPtr, wParam, lParam);
 
 //	case TB_GETBUTTONINFO:			/* 4.71 */
-//	case TB_GETBUTTONSIZE:			/* 4.70 */
+
+	case TB_GETBUTTONSIZE:
+	    return TOOLBAR_GetButtonSize (wndPtr);
 
 	case TB_GETBUTTONTEXT32A:
 	    return TOOLBAR_GetButtonText32A (wndPtr, wParam, lParam);
@@ -1734,7 +1834,10 @@
 	    return TOOLBAR_PressButton (wndPtr, wParam, lParam);
 
 //	case TB_REPLACEBITMAP:
-//	case TB_SAVERESTORE32A:
+
+	case TB_SAVERESTORE32A:
+	    return TOOLBAR_SaveRestore32A (wndPtr, wParam, lParam);
+
 //	case TB_SAVERESTORE32W:
 //	case TB_SETANCHORHIGHLIGHT:		/* 4.71 */
 
@@ -1790,6 +1893,9 @@
 	case WM_DESTROY:
 	    return TOOLBAR_Destroy (wndPtr, wParam, lParam);
 
+//	case WM_ERASEBKGND:
+//	    return TOOLBAR_EraseBackground (wndPtr, wParam, lParam);
+
 	case WM_LBUTTONDBLCLK:
 	    return TOOLBAR_LButtonDblClk (wndPtr, wParam, lParam);
 
@@ -1808,6 +1914,9 @@
 	case WM_NCCALCSIZE:
 	    return TOOLBAR_NCCalcSize (wndPtr, wParam, lParam);
 
+	case WM_NCCREATE:
+	    return TOOLBAR_NCCreate (wndPtr, wParam, lParam);
+
 	case WM_NCPAINT:
 	    return TOOLBAR_NCPaint (wndPtr, wParam, lParam);
 
diff --git a/controls/updown.c b/controls/updown.c
index d71ba9d..03d6ed0 100644
--- a/controls/updown.c
+++ b/controls/updown.c
@@ -8,7 +8,9 @@
  *     arrow keys
  *   - I am not sure about the default values for the Min, Max, Pos
  *     (in the UPDOWN_INFO the fields: MinVal, MaxVal, CurVal)
- *   - I think I do not handle correctly the WS_BORDER style.
+ *   - I think I don not handle correctly the WS_BORDER style.
+ *     (Should be fixed. <ekohl@abo.rhein-zeitung.de>)
+ *
  * Testing:
  *   Not much. The following  have not been tested at all:
  *     - horizontal arrows
@@ -63,7 +65,8 @@
         "UpDown Ctrl: Unknown parameter(s) for message " #msg     \
 	"(%04x): wp=%04x lp=%08lx\n", msg, wParam, lParam);
 
-#define UPDOWN_GetInfoPtr(wndPtr) ((UPDOWN_INFO *)wndPtr->wExtra)
+#define UPDOWN_GetInfoPtr(wndPtr) ((UPDOWN_INFO *)wndPtr->wExtra[0])
+
 
 /***********************************************************************
  *           UPDOWN_InBounds
@@ -189,7 +192,7 @@
       return FALSE;
   }
   else{
-    /* we have a regural window, so will get the text */
+    /* we have a regular window, so will get the text */
     if (!GetWindowText32A(infoPtr->Buddy, txt, sizeof(txt)))
       return FALSE;
 
@@ -238,7 +241,7 @@
   if(WIDGETS_IsControl32(WIN_FindWndPtr(infoPtr->Buddy), BIC32_LISTBOX)){
     SendMessage32A(infoPtr->Buddy, LB_SETCURSEL32, infoPtr->CurVal, 0);
   }
-  else{ /* Regural window, so set caption to the number */
+  else{ /* Regular window, so set caption to the number */
     len = sprintf(txt1, (infoPtr->Base==16) ? "%X" : "%d", infoPtr->CurVal);
 
     sep = UPDOWN_GetThousandSep(); 
@@ -265,20 +268,16 @@
 } 
 
 /***********************************************************************
- *           UPDOWN_Paint
+ * UPDOWN_Draw [Internal]
+ *
  * Draw the arrows. The background need not be erased.
  */
-static void UPDOWN_Paint(WND *wndPtr)
+static void UPDOWN_Draw (WND *wndPtr, HDC32 hdc)
 {
   UPDOWN_INFO *infoPtr = UPDOWN_GetInfoPtr(wndPtr);
-  PAINTSTRUCT32 ps;
   BOOL32 prssed;
   RECT32 rect;
-  HDC32 hdc;
   
-  /* start painting the button */
-  hdc = BeginPaint32( wndPtr->hwndSelf, &ps );
-
   /* Draw the incr button */
   UPDOWN_GetArrowRect(wndPtr, &rect, TRUE);
   prssed = (infoPtr->Flags & FLAG_INCR) && (infoPtr->Flags & FLAG_MOUSEIN);
@@ -298,10 +297,38 @@
 	(wndPtr->dwStyle & UDS_HORZ ? DFCS_SCROLLRIGHT : DFCS_SCROLLDOWN) |
 	(prssed ? DFCS_PUSHED : 0) |
 	(wndPtr->dwStyle&WS_DISABLED ? DFCS_INACTIVE : 0) );
+}
+
+/***********************************************************************
+ * UPDOWN_Refresh [Internal]
+ *
+ * Synchronous drawing (must NOT be used in WM_PAINT).
+ * Calls UPDOWN_Draw.
+ */
+static void UPDOWN_Refresh (WND *wndPtr)
+{
+    HDC32 hdc;
+  
+    hdc = GetDC32 (wndPtr->hwndSelf);
+    UPDOWN_Draw (wndPtr, hdc);
+    ReleaseDC32 (wndPtr->hwndSelf, hdc);
+}
 
 
-  /* clean-up */  
-  EndPaint32( wndPtr->hwndSelf, &ps );
+/***********************************************************************
+ * UPDOWN_Paint [Internal]
+ *
+ * Asynchronous drawing (must ONLY be used in WM_PAINT).
+ * Calls UPDOWN_Draw.
+ */
+static void UPDOWN_Paint (WND *wndPtr)
+{
+    PAINTSTRUCT32 ps;
+    HDC32 hdc;
+  
+    hdc = BeginPaint32 (wndPtr->hwndSelf, &ps);
+    UPDOWN_Draw (wndPtr, hdc);
+    EndPaint32 (wndPtr->hwndSelf, &ps);
 }
 
 /***********************************************************************
@@ -355,9 +382,10 @@
   /* now position the up/down */
   /* Since the UDS_ALIGN* flags were used, */
   /* we will pick the position and size of the window. */
+
   SetWindowPos32(wndPtr->hwndSelf,0,x,budRect.top-DEFAULT_ADDTOP,DEFAULT_WIDTH,
 		 (budRect.bottom-budRect.top)+DEFAULT_ADDTOP+DEFAULT_ADDBOT,
-		 SWP_NOACTIVATE|SWP_NOZORDER); 
+		 SWP_NOACTIVATE|SWP_NOZORDER);
 
   return TRUE;
 }	  
@@ -413,7 +441,8 @@
   /* Also, notify it */
   /* FIXME: do we need to send the notification only if
             we do not have the UDS_SETBUDDYINT style set? */
-  SendMessage32A(infoPtr->Buddy, 
+
+  SendMessage32A(GetParent32 (wndPtr->hwndSelf), 
 		 wndPtr->dwStyle & UDS_HORZ ? WM_HSCROLL : WM_VSCROLL, 
 		 MAKELONG(incr ? SB_LINEUP : SB_LINEDOWN, infoPtr->CurVal),
 		 wndPtr->hwndSelf);
@@ -457,7 +486,7 @@
     ReleaseCapture();          /* if we still have it      */  
   
   infoPtr->Flags = 0;          /* get rid of any flags     */
-  UPDOWN_Paint(wndPtr);        /* redraw the control just in case */
+  UPDOWN_Refresh (wndPtr);     /* redraw the control just in case */
   
   return TRUE;
 }
@@ -505,7 +534,7 @@
       infoPtr->Flags |= FLAG_MOUSEIN;
       
       /* repaint the control */
-      UPDOWN_Paint(wndPtr);
+      UPDOWN_Refresh (wndPtr);
 
       /* process the click */
       UPDOWN_DoAction(wndPtr, 1, infoPtr->Flags & FLAG_INCR);
@@ -541,7 +570,7 @@
       }
       /* If state changed, redraw the control */
       if(temp != infoPtr->Flags)
-	UPDOWN_Paint(wndPtr);
+	UPDOWN_Refresh (wndPtr);
       break;
 
       default:
@@ -562,9 +591,16 @@
 
   switch(message)
     {
-    case WM_CREATE:
+    case WM_NCCREATE:
       /* get rid of border, if any */
       wndPtr->dwStyle &= ~WS_BORDER;
+      return TRUE;
+
+    case WM_CREATE:
+      infoPtr =
+	(UPDOWN_INFO*)HeapAlloc (GetProcessHeap (), HEAP_ZERO_MEMORY,
+				 sizeof(UPDOWN_INFO));
+      wndPtr->wExtra[0] = (DWORD)infoPtr;
 
       /* initialize the info struct */
       infoPtr->AccelCount=0; infoPtr->AccelVect=0; 
@@ -583,6 +619,10 @@
     case WM_DESTROY:
       if(infoPtr->AccelVect)
 	free(infoPtr->AccelVect);
+
+      HeapFree (GetProcessHeap (), 0, infoPtr);
+      wndPtr->wExtra[0] = 0;
+
       TRACE(updown, "UpDown Ctrl destruction, hwnd=%04x\n", hwnd);
       break;
 	
@@ -785,7 +825,7 @@
 }
 
 /***********************************************************************
- *           UPDOWN_Register [Internal]
+ * UPDOWN_Register [Internal]
  *
  * Registers the updown window class.
  */
@@ -796,10 +836,10 @@
     if( GlobalFindAtom32A( UPDOWN_CLASS32A ) ) return;
 
     ZeroMemory( &wndClass, sizeof( WNDCLASS32A ) );
-    wndClass.style         = CS_GLOBALCLASS | CS_DBLCLKS | CS_VREDRAW;
+    wndClass.style         = CS_GLOBALCLASS | CS_VREDRAW;
     wndClass.lpfnWndProc   = (WNDPROC32)UpDownWindowProc;
     wndClass.cbClsExtra    = 0;
-    wndClass.cbWndExtra    = sizeof(UPDOWN_INFO);
+    wndClass.cbWndExtra    = sizeof(UPDOWN_INFO*);
     wndClass.hCursor       = LoadCursor32A( 0, IDC_ARROW32A );
     wndClass.hbrBackground = (HBRUSH32)(COLOR_3DFACE + 1);
     wndClass.lpszClassName = UPDOWN_CLASS32A;
diff --git a/documentation/common_controls b/documentation/common_controls
new file mode 100644
index 0000000..e6c4a2f
--- /dev/null
+++ b/documentation/common_controls
@@ -0,0 +1,296 @@
+
+                  COMMON CONTROLS
+              their development status
+    and their UNDOCUMENTED features and functions
+-----------------------------------------------------
+
+
+1. Introduction
+---------------
+  The information provided herein is based on the dll version 4.72 which
+  is included in MS Internet Explorer 4.01.
+
+  All information about common controls should be collected in this document.
+
+  All Wine programmers are encouraged to add their knowledge to this document.
+
+
+2. General Information
+----------------------
+  Further information about common controls can be found in the MS Platform SDK
+  and the MS Internet Client SDK (most recent). Information from these SDK's
+  will NOT be repeated here. Only information which can NOT be found in these
+  SDK's will be collected here. Some information in the SDK's mentioned above
+  is (intentionally???) WRONG. Corrections to wrong information will be
+  collected here too.
+
+
+3. Controls
+-----------
+  This paragraph describes the development status of the common controls.
+
+
+
+3.1 Animation Control
+---------------------
+  Status:
+      - Nothing done at all.
+
+
+3.2 Combo Box Ex Control
+------------------------
+  Status:
+      - Nothing done at all.
+
+
+3.3 Date and Time Picker Control
+--------------------------------
+  Status:
+      - Nothing done at all.
+
+
+3.4 Drag List Box Control
+-------------------------
+  Status:
+      - Nothing done at all.
+
+
+3.5 Flat Scroll Bar Control
+---------------------------
+  Status:
+      - Nothing done at all.
+
+
+3.6 Header Control
+------------------
+  Author:
+      Eric Kohl <ekohl@abo.rhein-zeitung.de>
+
+  Status:
+      - Almost finished.
+
+
+3.7 Hot Key Control
+-------------------
+  Status:
+      - Nothing done at all.
+
+
+3.8 Image List (no control)
+---------------------------
+  Author:
+      Eric Kohl <ekohl@abo.rhein-zeitung.de>
+
+  Status:
+      - Almost finished.
+
+  Notes:
+      Most of my test programs work as expected. But when image lists are used
+      in other controls (e.g. Toolbar) they don't seem to be error-free.
+      It looks like I have to do a major re-write (use DIB's instead of DDB's).
+
+
+3.9 IP Address Control
+----------------------
+  Status:
+      - Nothing done at all.
+
+
+3.10 List View Control
+----------------------
+  Status:
+      - Nothing done at all.
+
+  Notes:
+      This control id NEEDED in many places. Any volunteers??
+
+
+3.11 Month Calendar Control
+---------------------------
+  Status:
+      - Nothing done at all.
+
+
+3.12 Pager Control
+------------------
+  Status:
+      - Dummy control. No functionality.
+      - Not yet published.
+
+  Notes:
+      The dummy source code is available from the author.
+
+
+3.13 Progress Bar Control
+-------------------------
+  Author:
+      Original implementation by Dimitrie O. Paun.
+      Fixes and improvements by Eric Kohl.
+
+  Status:
+      - Almost finished (should behave like the original).
+
+  Notes:
+      WM_GETFONT and WM_SETFONT are not implemented yet. They seem to be
+      useless because progress bars usually don't display any textual
+      information. But if M$ implemented an undocumented flag to display
+      textual information (e.g. percentage) these messages would make sense.
+
+
+3.14 Property Sheet
+-------------------
+  Status:
+      - Nothing done at all.
+
+  Notes:
+      - This control id NEEDED in many places.
+      - Tab control has to be implemented first.
+      Any volunteers??
+
+
+3.15 Rebar Control (Cool Bar)
+-----------------------------
+  Status:
+      - Dummy control. No functionality.
+      - Not yet published.
+
+  Notes:
+      The dummy source code is available from the author.
+
+
+3.16 Status Bar Control
+-----------------------
+  Author:
+      Original implementation by Bruce Milner.
+      Fixes and improvements by Eric Kohl.
+
+  Status:
+      - Almost finished.
+
+  Notes:
+      - Tool tips need to be added, but since they are not done yet...
+
+  Notes:
+      Have a look at controls/status.c for a list of bugs and missing features.
+
+
+3.17 Tab Control
+----------------
+  Status:
+      - Nothing done at all.
+      - needed.
+
+
+3.18 Toolbar Control
+--------------------
+  Author:
+      Eric Kohl <ekohl@abo.rhein-zeitung.de>
+
+  Status:
+      - Development in progress.
+      - Basic functionality is almost done. (dll version 4.0)
+
+
+3.19 Tooltip Control
+--------------------
+  Author:
+      Eric Kohl <ekohl@abo.rhein-zeitung.de>
+
+  Status:
+      - Development in progress.
+      - Not yet published, but will be published soon.
+
+
+3.20 Trackbar Control
+---------------------
+  Author:
+      Eric Kohl <ekohl@abo.rhein-zeitung.de>
+
+  Status:
+      - Development in progress.
+      - Not yet published, but will be published soon.
+
+
+3.21 Tree View Control
+----------------------
+  Status:
+      - Nothing done at all.
+      - needed.
+
+
+3.22 Updown Control
+-------------------
+  Author:
+      Original implementation by Dimitrie O. Paun.
+      Some minor changes by Eric Kohl <ekohl@abo.rhein-zeitung.de>.
+
+  Status:
+      - Unknown.
+
+  Notes:
+      - Have a look at controls/updown.c for a list of bugs and missing
+        features.
+
+      - The status is unknown, because I did not have a close look at this
+        control. One test-program looked quite good, but in Win95's
+        cdplayer.exe the control does not show at all.
+      
+      Any volunteers??
+
+
+4. Additional Information
+-------------------------
+
+  Has to be written...
+
+
+5. Undocumented features
+------------------------
+
+  There are quite a lot of undocumented functions like:
+     - DSA (Dynnamic String Array?) functions.
+     - DPA (Dymnamic Pointer Array?) functions.
+     - MRU ("Most Recently Used" List) functions.
+     - other unknown functions.
+
+  Have a look at relay32/comctl32.spec.
+
+
+5.1 Dymnamic String Arrays ??? (DSA)
+------------------------------------
+  Most of the DSA functions are implemented. I used TASKMAN.EXE to write them.
+  Since TASKMAN.EXE doesn't bail out or crash I think I've done it right.
+
+  Have a look at the source code to get more information.
+  Further documentation will be written...
+
+
+5.2 Dynamic Pointer Arrays ??? (DPA)
+------------------------------------
+  Similar to the DSA functions, but they just store pointers. I have written
+  some stubs and semi-stubs. They are used by Explorer and IE4 but the 
+  implementation is still incomplete since both programs seem to crash because
+  of other incomplete functions.
+
+  Have a look at the source code to get more information.
+  Further documentation will be written...
+
+
+5.3 MenuHelp
+------------
+  Has to be written...
+
+
+5.4 GetEffectiveClientRect
+--------------------------
+  Has to be written...
+
+
+6. Epilogue
+-----------
+  You see, much work has still to be done. If you are interested in writing
+  a control send me an e-mail. If you like to fix bugs or add some
+  functionality send an e-mail to the author of the control.
+
+  Eric Kohl <ekohl@abo.rhein-zeitung.de>
+
diff --git a/documentation/printing b/documentation/printing
new file mode 100644
index 0000000..be79693
--- /dev/null
+++ b/documentation/printing
@@ -0,0 +1,50 @@
+Printing in Wine
+================
+
+Printing in Wine can be done in one of two ways. Both of which are very alpha.
+
+1. Use a windows 3.1 printer driver.
+
+2. Use the builtin Wine Postscript driver (+ ghostscript to produce output for
+   non-postscript printers).
+
+
+1. External printer drivers
+---------------------------
+At present only 16 bit drivers will work.
+Add
+
+printer=on
+
+to the [wine] section of wine.conf (or ~/.winerc). This lets CreateDC proceed
+if its driver argument is a 16 bit driver.
+
+You will probably also need to add
+
+TTEnable=0
+TTOnly=0
+
+to the [TrueType] section of win.ini .
+
+The code for the driver interface is in graphics/win16drv .
+
+
+2. Builtin Wine Postscript driver
+---------------------------------
+Enables printing of postscript files via a driver built into Wine. See
+graphics/psdrv/README for installation instructions. The code for the
+postscript driver is in graphics/psdrv .
+
+
+
+Spooling
+========
+Spooling is rather primitive. The [spooler] section of wine.conf maps a port
+(e.g. LPT1:) to a file or a command via a pipe. For example the following lines
+
+LPT1:=foo.ps
+LPT2:=|lpr
+
+map LPT1: to file foo.ps and LPT2: to the lpr command. If a job is sent to an
+unlisted port then a file is created with that port's name e.g. for LPT3: a
+file called LPT3: would be created.
diff --git a/documentation/status/directplay b/documentation/status/directplay
new file mode 100644
index 0000000..69c859a
--- /dev/null
+++ b/documentation/status/directplay
@@ -0,0 +1,17 @@
+This file contains information on the implementation of the direct play
+and direct play lobby features. 
+
+Most methods and APIs are not implemented at this point. Examine the code
+to see what has been implemented.  Stay tuned for some information here once
+there is more implementation (and I figure out what the heck I'm doing).
+
+The files are include/dplay.h and multimedia/dplay.c.
+
+I think I can safely say that any application which requires direct play
+or direct play lobby will not work at this point. Priority will be to get
+lserver.exe and star wars rebellion going (at least the direct play portions).
+
+
+
+TODO:
+  Just about everything
diff --git a/documentation/wine.man b/documentation/wine.man
index 0be4451..af45f42 100644
--- a/documentation/wine.man
+++ b/documentation/wine.man
@@ -1,5 +1,5 @@
 .\" -*- nroff -*-
-.TH WINE 1 "September 1, 1995" "Version 9/1/95" "Windows Emulation"
+.TH WINE 1 "June 22, 1998" "Version 980614" "Windows Emulator"
 .SH NAME
 wine \- run Windows programs under Unix
 .SH SYNOPSIS
@@ -16,44 +16,50 @@
 invokes the Windows emulator.
 .PP
 .B wine 
-currently runs a number of games and small applications (approximately
-half of the applets and common games actually run), although the entire API
-has not been implemented.
-.PP
-See the files 
-.B README,
-.B ChangeLog, 
-.B configure, 
-and the
-.B Makefile
-contained in the source distribution
-to compile
-.B wine.
+currently runs a growing list of applications written for both Win3.1 and 
+Win95.  Older, simpler applications work better than newer, more complex 
+ones.  A large percentage of the API has been implemented, although there
+are still several major pieces of work left to do.
 .SH REQUIREMENTS
 At present, 
 .B wine
 will run under any Linux kernel more recent than 0.99.13, or
 under recent releases of NetBSD/i386, FreeBSD and OpenBSD/i386.
 .PP
+The current support for multithreaded applications relies on the 
+.B clone(2)
+system call, which is currently available only on Linux systems running
+libc6 (glibc2).
+.PP
 .B X
-must be installed.
+must be installed.  To use Wine's support for multithreaded applications,
+your X libraries must be reetrant.  If you have libc6 (glibc2), or you 
+compiled the libraries yourself, they were probably compiled with the 
+reetrant option enabled.  
 .PP
 .B libXpm
-must be installed.  (It is probably available from the same site 
+must be installed.  It is probably available from the same site 
 .B wine
-was, or the sources may be FTP'd from ftp.x.org).
+was, or the sources may be FTP'd from ftp.x.org.  Usually it's in a
+package named something like XFree86-devel.
+
 .SH INSTALLATION
 To install 
 .B Wine,
-run "./configure", which will detect your specific setup and create
-the Makefiles. You can run "./configure --help" to see the available
-configuration options. Then do "make depend; make" to build the
+run "./configure" in the top-level directory of the source, which will 
+detect your specific setup and create the Makefiles.  You can run 
+"./configure --help" to see the available configuration options.  Then do 
+"make depend; make" to build the
 .B wine
 executable, and then "make install" to install it. By default,
 .B wine
 is installed in /usr/local/bin; you can specify a different path with
 the --prefix option when running
 .B configure.
+.PP
+For more information, see the 
+.B README
+file contained in the source distribution
 .SH OPTIONS
 .TP
 .I -backingstore
@@ -62,17 +68,39 @@
 .I -debug
 Enter the debugger before starting application
 .TP
-.I -debugmsg name[,name]
-Turn debugging messages on or off - for instance, 
-.I -debugmsg +dll,+heap
-will turn on DLL and heap debugging messages.  The full list is: all, accel,
-atom, bitblt, bitmap, caret, cdaudio, class, clipboard, clipping, combo,
-comm, commdlg, crtdll, cursor, dc, dde, dialog, dll, dosfs, driver, edit,
-env, event, exec, file, fixup, font, gdi, global, graphics, heap, hook,
-icon, int, key, keyboard, ldt, listbox, local, mci, mcianim, mciwave, mdi,
-menu, message, metafile, midi, mmio, mmsys, mmtime, module, msg, nonclient,
-ole, palette, profile, prop, reg, region, relay, resource, scroll, segment,
-selector,sem, sendmsg, shm, stress, string, syscolor, task, text, timer, toolhelp,ver, vxd, win, win32, winsock.
+.I -debugmsg [xxx]#name[,[xxx1]#name1]
+Turn debugging messages on or off.  
+.RS +7
+.PP
+xxx can be one of the following: err, warn, fixme, or trace, and # can be
+either + or -.  Note that there is not a space between names.
+.PP
+For instance:
+.PP
+.I -debugmsg warn+dll,+heap
+will turn on DLL and heap warning messages.  
+.br
+.I -debugmsg fixme-all,warn+cursor,+relay
+will turn off all FIXME messages, turn on cursor warning messages, and turn
+on all relay messages (API calls).
+.PP
+The full list of names is: all, accel, advapi, aspi, atom, bitblt, bitmap, 
+caret, cd, cdaudio, class, clipboard, clipping, combo, comm, commctrl, 
+commdlg, console, crtdll, cursor, dc, dde, ddeml, ddraw, debug, dialog, 
+dinput, dll, dosfs, driver, dsound, edit, event, exec, file, fixup, font, 
+gdi, global, graphics, header, heap, hook, icon, imagelist, int, int21, 
+int31, key, keyboard, ldt, listbox, local, mci, mcianim, mciwave, mdi, menu, 
+message, metafile, midi, mmaux, mmio, mmsys, mmtime, module, mpr, msg, 
+nonclient, ntdll, ole, palette, print, process, profile, prop, reg, region, 
+relay, resource, scroll, security, segment, selector, sem, sendmsg, shell, 
+shm, snoop, sound, stress, string, syscolor, task, text, thread, thunk, timer, 
+toolhelp, tweak, uitools, updown, ver, virtual, vxd, win, win16drv, win32, 
+wing, winsock, wnet, x11, x11drv.
+.PP
+For more information on debugging messages, see the file 
+.I documentation/debug-msgs
+in the source distribution.
+.RE
 .TP
 .I -depth n
 Change the depth to use for multiple-depth screens
@@ -133,7 +161,7 @@
 .TP
 .I -winver version
 Specify which Windows version WINE should imitate.
-Possible arguments are: win31, win95 and nt351.
+Possible arguments are: win31, win95, nt351, and nt40.
 .PD 1
 .SH PROGRAM/ARGUMENTS
 The program name may be specified in DOS format (C:\\WINDOWS\\SOL.EXE) or in 
@@ -155,7 +183,9 @@
 .B configure
 script.  Alternatively, you may have a 
 .I .winerc
-file of this format in your home directory.
+file of this format in your home directory or the environment variable
+.B WINE_INI
+pointing to a configuration file.
 .SH CONFIGURATION FILE FORMAT
 All entries are grouped in sections; a section begins with the line
 .br
@@ -290,6 +320,14 @@
 .br
 default: none
 .br Used to specify which messages will be included in the logfile.
+.PP
+.B [Tweak.Layout]
+.br
+.I format: Win95Look=<true|false>
+.br
+default: false
+.br 
+Use Win95 look (true) or Win3.1 look (false).
 .SH SAMPLE CONFIGURATION FILE
 [Drive A]
 .br
@@ -340,6 +378,12 @@
 Exclude=WM_TIMER;WM_SETCURSOR;WM_MOUSEMOVE;WM_NCHITTEST;
 .br
 Include=WM_COMMAND;
+.PP
+[Tweak.Layout]
+.br Win95Look=[true|false]
+.br Win95Look=true enables Win95-like windows layouts; Win95Look=false 
+uses Win3.1-like displays. If this section is not included, it defaults
+to false.
 .SH AUTHORS
 .B Wine
 is available thanks to the work of Bob Amstadt, Dag Asheim,
@@ -356,9 +400,6 @@
 Linus Torvalds, Gregory Trubetskoy, Michael Veksler, Morten Welinder,
 Jan Willamowius, Carl Williams, Karl Guenter Wuensch, Eric Youngdale,
 and James Youngman.
-.PP
-This man page is maintained by Mike Phillips (msphil@facstaff.wm.edu), so 
-please send all corrections, comments, flames, etc., to him.
 .SH BUGS
 There are too many to count, much less list.  Some bugs of note, however,
 are that programs requiring VBRUNxxx.DLL are unreliable (with reports of
@@ -366,18 +407,11 @@
 at 100% (although rapidly improving).  Color support for other than 8bpp
 (256 colors) is currently flaky.
 .PP
-A partial list of applications known to work with 
-.B wine
-include: sol, cruel, golf, clock, notepad, charmap, calc, and wzip11.
-The following URLs point to different success/testing lists:
-.br
-.I http://www.ifi.uio.no/~dash/wine/working-apps.html
-.br
-.I http://dutifp.twi.tudelft.nl:8000/wine/
+A status report on many appplications is available from
+.I http://www.winehq.com/apps.cgi.
+Users can add, modify, and delete entries on this list.
 .PP
-We would like to hear about what software does run under 
-.B Wine,
-and such reports may be posted to 
+Bug reports and successes may be posted to 
 .I comp.emulators.ms-windows.wine.
 .SH AVAILABILITY
 The most recent public version of 
@@ -385,6 +419,20 @@
 can be ftp'ed from tsx-11.mit.edu in the /pub/linux/ALPHA/Wine/development 
 directory.  The releases are in the format 'Wine-yymmdd.tar.gz', 
 or 'Wine-yymmdd.diff.gz' for the diff's from the previous release.
+.PP
+The
+.B wine
+homepage is at
+.I http://www.winehq.com.
+This website contains a great deal of information about
+.B wine
+as well as a collection of unofficial patches against the current release.
+.PP
+The
+.B wine 
+newsgroup is 
+.I comp.emulators.ms-windows.wine.
+All discussions about the project take place in this forum.
 .SH FILES
 .PD 0
 .TP
@@ -392,14 +440,12 @@
 The invoker program.
 .TP
 .I /usr/local/etc/wine.conf
-Main configuration file for wine.
+Global configuration file for wine.
 .TP
-.I ChangeLog
-Changes in Wine, since the beginning (most recent changes first)
+.I /usr/local/lib/wine.sym
+Global symbol table (used in debugger)
 .TP
-.I configure
-Shell script to automatically generate Makefiles.  Usually followed by
-make to compile wine.
-.TP
-.I Wine newsgroup
-Subscribe to comp.emulators.ms-windows.wine
+.I ~/.winerc
+User-specific configuration file
+.SH "SEE ALSO"
+clone(2)
diff --git a/files/directory.c b/files/directory.c
index aa975a4..26ded31 100644
--- a/files/directory.c
+++ b/files/directory.c
@@ -190,7 +190,7 @@
     char buffer[2];
     /* FIXME: apparently Windows does something with the ignored byte */
     if (!GetTempPath32A( sizeof(buffer), buffer )) buffer[0] = 'C';
-    return toupper(buffer[0]) - 'A';
+    return toupper(buffer[0]);
 }
 
 
diff --git a/files/drive.c b/files/drive.c
index 246b347..72ede3d 100644
--- a/files/drive.c
+++ b/files/drive.c
@@ -102,7 +102,7 @@
     PROFILE_GetWineIniString( name, "Type", "hd", buffer, sizeof(buffer) );
     for (i = 0; i < sizeof(DRIVE_Types)/sizeof(DRIVE_Types[0]); i++)
     {
-        if (!lstrcmpi32A( buffer, DRIVE_Types[i] )) return (DRIVETYPE)i;
+        if (!strcasecmp( buffer, DRIVE_Types[i] )) return (DRIVETYPE)i;
     }
     MSG("%s: unknown type '%s', defaulting to 'hd'.\n", name, buffer );
     return TYPE_HD;
@@ -117,7 +117,7 @@
     const FS_DESCR *descr;
 
     for (descr = DRIVE_Filesystems; descr->name; descr++)
-        if (!lstrcmpi32A( value, descr->name )) return descr->flags;
+        if (!strcasecmp( value, descr->name )) return descr->flags;
     MSG("%s: unknown filesystem type '%s', defaulting to 'unix'.\n",
 	name, value );
     return DRIVE_CASE_SENSITIVE | DRIVE_CASE_PRESERVING;
diff --git a/files/profile.c b/files/profile.c
index 53e610a..fa4796e 100644
--- a/files/profile.c
+++ b/files/profile.c
@@ -242,7 +242,7 @@
 {
     while (*section)
     {
-        if ((*section)->name && !lstrcmpi32A( (*section)->name, name ))
+        if ((*section)->name && !strcasecmp( (*section)->name, name ))
         {
             PROFILESECTION *to_del = *section;
             *section = to_del->next;
@@ -266,12 +266,12 @@
 {
     while (*section)
     {
-        if ((*section)->name && !lstrcmpi32A( (*section)->name, section_name ))
+        if ((*section)->name && !strcasecmp( (*section)->name, section_name ))
         {
             PROFILEKEY **key = &(*section)->key;
             while (*key)
             {
-                if (!lstrcmpi32A( (*key)->name, key_name ))
+                if (!strcasecmp( (*key)->name, key_name ))
                 {
                     PROFILEKEY *to_del = *key;
                     *key = to_del->next;
@@ -300,12 +300,12 @@
 {
     while (*section)
     {
-        if ((*section)->name && !lstrcmpi32A( (*section)->name, section_name ))
+        if ((*section)->name && !strcasecmp( (*section)->name, section_name ))
         {
             PROFILEKEY **key = &(*section)->key;
             while (*key)
             {
-                if (!lstrcmpi32A( (*key)->name, key_name )) return *key;
+                if (!strcasecmp( (*key)->name, key_name )) return *key;
                 key = &(*key)->next;
             }
             if (!create) return NULL;
@@ -476,7 +476,7 @@
     PROFILEKEY *key;
     while (section)
     {
-        if (section->name && !lstrcmpi32A( section->name, section_name ))
+        if (section->name && !strcasecmp( section->name, section_name ))
         {
             INT32 oldlen = len;
             for (key = section->key; key; key = key->next)
@@ -664,7 +664,7 @@
 
     /* Search for the correct section */
     for(scansect = WineProfile; scansect; scansect = scansect->next) {
-	if(scansect->name && !lstrcmpi32A(scansect->name, section)) {
+	if(scansect->name && !strcasecmp(scansect->name, section)) {
 
 	    /* Enumerate each key with the callback */
 	    for(scankey = scansect->key; scankey; scankey = scankey->next) {
@@ -752,6 +752,12 @@
     const char *p;
     FILE *f;
 
+    if ( (p = getenv( "WINE_INI" )) && (f = fopen( p, "r" )) )
+      {
+	WineProfile = PROFILE_Load( f );
+	fclose( f );
+	return 1;
+      }
     if ((p = getenv( "HOME" )) != NULL)
     {
         lstrcpyn32A(buffer, p, MAX_PATHNAME_LEN - sizeof(PROFILE_WineIniName));
@@ -1077,11 +1083,67 @@
 WORD WINAPI GetPrivateProfileSectionNames16( LPSTR buffer, WORD size,
                                              LPCSTR filename )
 {
-    FIXME(profile, "(%p,%d,%s):stub\n", buffer, size, filename);
-    buffer[0] = buffer[1] = '\0';
-    return 0;
+ char *buf;
+ int l,cursize;
+ PROFILESECTION *section;
+
+    if (PROFILE_Open( filename )) {
+	buf=buffer;
+	cursize=0;
+	section=CurProfile.section;
+	for ( ; section; section = section->next) {
+		l=strlen (section->name);
+		cursize+=l+1;
+        	if (cursize > size+1)
+			return size-2;
+		strcpy (buf,section->name);
+		buf+=l;
+		*buf=0;
+		buf++;
+		}
+ 	buf++;
+ 	*buf=0;
+ 	return (buf-buffer);
+ }
+ return FALSE;
 }
 
+
+
+/***********************************************************************
+ *           GetPrivateProfileStruct32A (KERNEL32.370)
+ */
+WORD WINAPI GetPrivateProfileStruct32A (LPCSTR section, LPCSTR key, 
+	LPVOID buf, UINT32 len, LPCSTR filename)
+{
+    PROFILEKEY *k;
+
+    if (PROFILE_Open( filename )) {
+        k=PROFILE_Find ( &CurProfile.section, section, key, FALSE);
+	if (!k) return FALSE;
+    	lstrcpyn32A( buf, k->value, strlen(k->value));
+        return TRUE;
+    }
+  return FALSE;
+}
+
+
+/***********************************************************************
+ *           WritePrivateProfileStruct32A (KERNEL32.744)
+ */
+WORD WINAPI WritePrivateProfileStruct32A (LPCSTR section, LPCSTR key, 
+	LPVOID buf, UINT32 bufsize, LPCSTR filename)
+{
+    if ((!section) && (!key) && (!buf)) {	/* flush the cache */
+        PROFILE_FlushFile();
+	return FALSE;
+ 	}
+
+    if (!PROFILE_Open( filename )) return FALSE;
+    return PROFILE_SetString( section, key, buf);
+}
+
+
 /***********************************************************************
  *           WriteOutProfiles   (KERNEL.315)
  */
diff --git a/graphics/driver.c b/graphics/driver.c
index a22cd6d..c4a28d6 100644
--- a/graphics/driver.c
+++ b/graphics/driver.c
@@ -7,6 +7,7 @@
 #include "gdi.h"
 #include "heap.h"
 #include "debug.h"
+#include <string.h>
 
 typedef struct tagGRAPHICS_DRIVER
 {
@@ -54,7 +55,7 @@
     GRAPHICS_DRIVER *driver = firstDriver;
     while (driver)
     {
-        if (!lstrcmpi32A( driver->name, name )) return driver->funcs;
+        if (!strcasecmp( driver->name, name )) return driver->funcs;
         driver = driver->next;
     }
     return genericDriver ? genericDriver->funcs : NULL;
@@ -71,7 +72,7 @@
         GRAPHICS_DRIVER **ppDriver = &firstDriver;
         while (*ppDriver)
         {
-            if (!lstrcmpi32A( (*ppDriver)->name, name ))
+            if (!strcasecmp( (*ppDriver)->name, name ))
             {
                 GRAPHICS_DRIVER *driver = *ppDriver;
                 (*ppDriver) = driver->next;
diff --git a/graphics/psdrv/Makefile.in b/graphics/psdrv/Makefile.in
new file mode 100644
index 0000000..169f06f
--- /dev/null
+++ b/graphics/psdrv/Makefile.in
@@ -0,0 +1,23 @@
+DEFS      = -D__WINE__
+TOPSRCDIR = @top_srcdir@
+TOPOBJDIR = ../..
+SRCDIR    = @srcdir@
+VPATH     = @srcdir@
+MODULE    = psdrv
+
+C_SRCS = \
+	afm.c \
+	driver.c \
+	escape.c \
+	font.c \
+	graphics.c \
+	init.c \
+	objects.c \
+	ps.c \
+	text.c
+
+all: $(MODULE).o
+
+@MAKE_RULES@
+
+### Dependencies:
diff --git a/graphics/psdrv/README b/graphics/psdrv/README
new file mode 100644
index 0000000..85fcd88
--- /dev/null
+++ b/graphics/psdrv/README
@@ -0,0 +1,75 @@
+Wine Postscript Driver
+======================
+
+When complete this will allow Wine to generate Postscript files without needing
+an external printer driver. It should be possible to print to a non Postscript
+printer by filtering the output through ghostscript.
+
+
+Installation
+------------
+
+At the moment the driver will only work for 16 bit apps, the move to 32 bit
+should be quite easy, I'd just like to improve it first. The driver behaves as
+if it were a DRV file called WINEPS.DRV . To install it as the default printer
+driver add
+
+device=Wine Postscript Driver,WINEPS,LPT1:
+
+to the [windows] section of win.ini . You may prefer to add
+
+Wine Postscript Driver=WINEPS,LPT1:
+
+to the [devices] section of win.ini instead.
+
+You will need Adobe Font Metric (AFM) files for the (type 1 Postscript) fonts
+that you wish to use. You can get these from
+
+ftp://ftp.adobe.com/pub/adobe/type/win/all/afmfiles . The directories base17 or
+base35 are good places to start.
+
+Note that these are only the font metrics and not the fonts themselves. At
+present the driver does not download additional fonts, so you can only use
+fonts that are already present on the printer.
+
+Then create a [afmfiles] section in your wine.conf (or ~/.winerc) and add a
+line of the form
+
+file=/unix/path/name/filename.afm
+
+for each AFM file that you wish to use. [This might change in the future]
+
+Note that you need not set printer=on in the [wine] section of wine.conf, this
+enables printing via external printer drivers and does not affect wineps.
+
+If you're lucky you should now be able to produce PS files from Wine!
+
+I've tested it with win3.1 notepad/write, Winword6 and Origin4.0 with some
+degree of success - you should be able to get something out, it may not be in
+the right place.
+
+TODO / Bugs
+-----------
+
+Driver doesn't read PPD files - it should.
+
+A4 portrait mode is hard coded in at the moment.
+
+Graphics are basically non-existent. Only MoveTo/LineTo/Rectangle with a thin
+black pen.
+
+No colour.
+
+AFM parsing is not finished (or ideal).
+
+No TrueType download.
+
+Many partial-implemented functions.
+
+Probably many more...
+
+
+Since the driver is very very alpha, things are likely to change quickly.
+Please contact me if you want to help so that we can avoid duplication.
+
+Huw Davies <h.davies1@physics.ox.ac.uk>
diff --git a/graphics/psdrv/afm.c b/graphics/psdrv/afm.c
new file mode 100644
index 0000000..f97ee9f
--- /dev/null
+++ b/graphics/psdrv/afm.c
@@ -0,0 +1,304 @@
+/*
+ *	Adobe Font Metric (AFM) file parsing
+ *	See http://www.adobe.com/supportservice/devrelations/PDFS/TN/5004.AFM_Spec.pdf
+ *
+ *	Copyright 1998  Huw D M Davies
+ * 
+ */
+
+#include <string.h>
+#include "windows.h"
+#include "winnt.h" /* HEAP_ZERO_MEMORY */
+#include "psdrv.h"
+#include "options.h"
+#include "debug.h"
+#include "heap.h"
+#include <ctype.h>
+
+/* ptr to fonts for which we have afm files */
+FontFamily *PSDRV_AFMFontList = NULL;
+
+
+/***********************************************************
+ *
+ *	PSDRV_AFMGetCharMetrics
+ *
+ * Parses CharMetric section of AFM file.
+ *
+ * Actually only collects the widths of numbered chars and puts then in
+ * afm->CharWidths.
+ */
+static void PSDRV_AFMGetCharMetrics(AFM *afm, FILE *fp)
+{
+    char buf[256];
+    char *cp, *item, *value;
+    int i, charno;
+
+    for(i = 0; i < afm->NumofMetrics; i++) {
+        if(!fgets(buf, sizeof(buf), fp)) {
+	   ERR(psdrv, "Unexpected EOF\n");
+	   return;
+	}
+	cp = buf + strlen(buf);
+	do {
+	    *cp = '\0';
+	    cp--;
+	} while(cp > buf && isspace(*cp));
+
+        item = strtok(buf, ";");
+	if(!strncmp(item, "C ", 2)) {
+	    value = strchr(item, ' ');
+	    sscanf(value, " %d", &charno);
+	} else if(!strncmp(item, "CH ", 3)) {
+	    value = strrchr(item, ' ');
+	    sscanf(value, " %x", &charno);
+	} else {
+	    WARN(psdrv, "Don't understand '%s'\n", item);
+	    return;
+	}
+
+	while((item = strtok(NULL, ";"))) {
+	    while(isspace(*item))
+	        item++;
+	    value = strchr(item, ' ');
+	    if(!value) /* last char maybe a ';' but no white space after it */
+	        break;
+	    value++;
+
+	    if(!strncmp("WX ", item, 3) || !strncmp("W0X ", item, 4)) {
+	        if(charno >= 0 && charno <= 0xff)
+		    sscanf(value, "%f", &(afm->CharWidths[charno]));
+	    }
+	    /* would carry on here to scan in BBox, name and ligs */
+
+	}
+    }
+
+    return;
+}
+
+/***********************************************************
+ *
+ *	PSDRV_AFMParse
+ *
+ * Fills out an AFM structure and associated substructures (see psdrv.h)
+ * for a given AFM file. All memory is allocated from the process heap. 
+ * Returns a ptr to the AFM structure or NULL on error.
+ *
+ * This is not complete (we don't handle kerning yet) and not efficient
+ */
+static AFM *PSDRV_AFMParse(char const *file)
+{
+    FILE *fp;
+    char buf[256];
+    char *value;
+    AFM *afm;
+    char *cp;
+
+    if((fp = fopen(file, "r")) == NULL) {
+        MSG("Can't open AFM file '%s'. Please check wine.conf .\n", file);
+        return NULL;
+    }
+
+    afm = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(AFM));
+    if(!afm) {
+        fclose(fp);
+        return NULL;
+    }
+
+    while(fgets(buf, sizeof(buf), fp)) {
+	cp = buf + strlen(buf);
+	do {
+	    *cp = '\0';
+	    cp--;
+	} while(cp > buf && isspace(*cp));
+
+        value = strchr(buf, ' ');
+	if(value)
+	    value++;
+
+	if(!strncmp("FontName", buf, 8)) {
+	    afm->FontName = HEAP_strdupA(GetProcessHeap(), 0, value);
+	    continue;
+	}
+
+	if(!strncmp("FullName", buf, 8)) {
+	    afm->FullName = HEAP_strdupA(GetProcessHeap(), 0, value);
+	    continue;
+	}
+
+	if(!strncmp("FamilyName", buf, 10)) {
+	    afm->FamilyName = HEAP_strdupA(GetProcessHeap(), 0, value);
+	    continue;
+	}
+	
+	if(!strncmp("Weight", buf, 6)) {
+	    if(!strncmp("Roman", value, 5) || !strncmp("Medium", value, 6)
+	       || !strncmp("Book", value, 4))
+	        afm->Weight = FW_NORMAL;
+	    else if(!strncmp("Demi", value, 4))
+	        afm->Weight = FW_DEMIBOLD;
+	    else if(!strncmp("Bold", value, 4))
+	        afm->Weight = FW_BOLD;
+	    else if(!strncmp("Light", value, 5))
+	        afm->Weight = FW_LIGHT;
+	    else {
+  	        FIXME(psdrv, "Unkown AFM Weight '%s'\n", value);
+	        afm->Weight = FW_NORMAL;
+	    }
+	    continue;
+	}
+
+	if(!strncmp("ItalicAngle", buf, 11)) {
+	    sscanf(value, "%f", &(afm->ItalicAngle));
+	    continue;
+	}
+
+	if(!strncmp("IsFixedPitch", buf, 12)) {
+	    if(!strncasecmp("false", value, 5))
+	        afm->IsFixedPitch = FALSE;
+	    else
+	        afm->IsFixedPitch = TRUE;
+	    continue;
+	}
+
+	if(!strncmp("FontBBox", buf, 8)) {
+	    sscanf(value, "%f %f %f %f", &(afm->FontBBox.llx), 
+		   &(afm->FontBBox.lly), &(afm->FontBBox.urx), 
+		   &(afm->FontBBox.ury) );
+	    continue;
+	}
+
+	if(!strncmp("UnderlinePosition", buf, 17)) {
+	    sscanf(value, "%f", &(afm->UnderlinePosition) );
+	    continue;
+	}
+
+	if(!strncmp("UnderlineThickness", buf, 18)) {
+	    sscanf(value, "%f", &(afm->UnderlineThickness) );
+	    continue;
+	}
+
+	if(!strncmp("CapHeight", buf, 9)) {
+	    sscanf(value, "%f", &(afm->CapHeight) );
+	    continue;
+	}
+
+	if(!strncmp("XHeight", buf, 7)) {
+	    sscanf(value, "%f", &(afm->XHeight) );
+	    continue;
+	}
+
+	if(!strncmp("Ascender", buf, 8)) {
+	    sscanf(value, "%f", &(afm->Ascender) );
+	    continue;
+	}
+
+	if(!strncmp("Descender", buf, 9)) {
+	    sscanf(value, "%f", &(afm->Descender) );
+	    continue;
+	}
+
+	if(!strncmp("StartCharMetrics", buf, 16)) {
+	    sscanf(value, "%d", &(afm->NumofMetrics) );
+	    PSDRV_AFMGetCharMetrics(afm, fp);
+	    continue;
+	}
+
+    }
+
+    fclose(fp);
+    if(afm->Ascender == 0.0) afm->Ascender = 1000.0;
+    return afm;
+}
+
+/***********************************************************
+ *
+ *	PSDRV_AddAFMtoList
+ *
+ * Adds an afm to the current font list. Creates new family node if necessary.
+ */
+static void PSDRV_AddAFMtoList(AFM *afm)
+{
+    FontFamily *family = PSDRV_AFMFontList;
+    FontFamily **insert = &PSDRV_AFMFontList;
+    AFM *tmpafm;
+
+    while(family) {
+        if(!strcmp(family->FamilyName, afm->FamilyName))
+	    break;
+	insert = &(family->next);
+	family = family->next;
+    }
+    
+    if(!family) {
+        family = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY,
+			   sizeof(*family));
+	*insert = family;
+	family->FamilyName = HEAP_strdupA(GetProcessHeap(), 0,
+					  afm->FamilyName);
+	family->afm = afm;
+	return;
+    }
+    
+    tmpafm = family->afm;
+    while(tmpafm->next)
+        tmpafm = tmpafm->next;
+
+    tmpafm->next = afm;
+
+    return;
+}
+    
+/***********************************************************
+ *
+ *	PSDRV_afmfilesCallback
+ *
+ * Callback for PROFILE_EnumerateWineIniSection
+ */
+static void PSDRV_afmfilesCallback(char const *key, char const *value,
+void *user)
+{
+    AFM *afm;
+
+    afm = PSDRV_AFMParse(value);
+    if(afm)
+        PSDRV_AddAFMtoList(afm);
+    return;
+}
+
+
+/***********************************************************
+ *
+ *	PSDRV_DumpFontList
+ *
+ */
+static void PSDRV_DumpFontList(void)
+{
+    FontFamily *family;
+    AFM *afm;
+
+    for(family = PSDRV_AFMFontList; family; family = family->next) {
+        TRACE(psdrv, "Family '%s'\n", family->FamilyName);
+	for(afm = family->afm; afm; afm = afm->next) {
+	    TRACE(psdrv, "\tFontName '%s'\n", afm->FontName);
+	}
+    }
+    return;
+}
+
+
+/***********************************************************
+ *
+ *	PSDRV_GetFontMetrics
+ *
+ * Only exported function in this file. Parses all afm files listed in
+ * [afmfiles] of wine.conf .
+ */
+BOOL32 PSDRV_GetFontMetrics(void)
+{
+    PROFILE_EnumerateWineIniSection( "afmfiles", PSDRV_afmfilesCallback, NULL);
+    PSDRV_DumpFontList();
+    return TRUE;
+}
+
diff --git a/graphics/psdrv/driver.c b/graphics/psdrv/driver.c
new file mode 100644
index 0000000..d217e99
--- /dev/null
+++ b/graphics/psdrv/driver.c
@@ -0,0 +1,145 @@
+/*
+ * Exported functions from the Postscript driver.
+ *
+ * [Ext]DeviceMode, DeviceCapabilities. 
+ *
+ * Will need ExtTextOut for winword6 (urgh!)
+ *
+ * Copyright 1998  Huw D M Davies
+ *
+ */
+
+#include "windows.h"
+#include "psdrv.h"
+#include "debug.h"
+
+
+static DEVMODE16 DefaultDevMode = 
+{
+/* dmDeviceName */	"Wine Postscript Driver",
+/* dmSpecVersion */	0x30a,
+/* dmDriverVersion */	0x001,
+/* dmSize */		sizeof(DEVMODE16),
+/* dmDriverExtra */	0,
+/* dmFields */		DM_ORIENTATION | DM_PAPERSIZE | DM_PAPERLENGTH | 
+			  DM_PAPERWIDTH,
+/* dmOrientation */	DMORIENT_PORTRAIT,
+/* dmPaperSize */	DMPAPER_A4,
+/* dmPaperLength */	2930,
+/* dmPaperWidth */      2000,
+/* dmScale */		0,
+/* dmCopies */		0,
+/* dmDefaultSource */	0,
+/* dmPrintQuality */	0,
+/* dmColor */		0,
+/* dmDuplex */		0,
+/* dmYResolution */	0,
+/* dmTTOption */	0,
+/* dmCollate */		0,
+/* dmFormName */	"",
+/* dmUnusedPadding */   0,
+/* dmBitsPerPel */	0,
+/* dmPelsWidth */	0,
+/* dmPelsHeight */	0,
+/* dmDisplayFlags */	0,
+/* dmDisplayFrequency */ 0
+};
+
+
+static char PaperNames[][64] = {"My A4"};
+static WORD Papers[] = {DMPAPER_A4};
+static POINT16 PaperSizes[] = {{2110, 2975}};
+static char BinNames[][24] = {"My Bin"};
+static WORD Bins[] = {DMBIN_AUTO};
+static LONG Resolutions[][2] = { {600,600} };
+
+
+/***************************************************************
+ *
+ *	PSDRV_ExtDeviceMode16	[WINEPS.90]
+ *
+ * Just returns default devmode at the moment
+ */
+INT16 WINAPI PSDRV_ExtDeviceMode16(HWND16 hwnd, HANDLE16 hDriver,
+LPDEVMODE16 lpdmOutput, LPSTR lpszDevice, LPSTR lpszPort,
+LPDEVMODE16 lpdmInput, LPSTR lpszProfile, WORD fwMode)
+{
+
+  TRACE(psdrv,
+"(hwnd=%04x, hDriver=%04x, devOut=%p, Device='%s', Port='%s', devIn=%p, Profile='%s', Mode=%04x)\n",
+hwnd, hDriver, lpdmOutput, lpszDevice, lpszPort, lpdmInput, lpszProfile,
+fwMode);
+
+  if(!fwMode)
+    return sizeof(DefaultDevMode);
+
+  if(fwMode & DM_COPY)
+    memcpy(lpdmOutput, &DefaultDevMode, sizeof(DefaultDevMode));
+  
+  return IDOK;
+}
+
+/***************************************************************
+ *
+ *	PSDRV_DeviceCapabilities16	[WINEPS.91]
+ *
+ */
+DWORD WINAPI PSDRV_DeviceCapabilities16(LPSTR lpszDevice, LPSTR lpszPort,
+  WORD fwCapability, LPSTR lpszOutput, LPDEVMODE16 lpdm)
+{
+  TRACE(psdrv, "Cap=%d\n", fwCapability);
+
+  switch(fwCapability) {
+
+  case DC_PAPERS:
+    if(lpszOutput != NULL)
+      memcpy(lpszOutput, Papers, sizeof(Papers));
+    return sizeof(Papers) / sizeof(WORD);
+
+  case DC_PAPERSIZE:
+    if(lpszOutput != NULL)
+      memcpy(lpszOutput, PaperSizes, sizeof(PaperSizes));
+    return sizeof(PaperSizes) / sizeof(POINT16);
+
+  case DC_BINS:
+    if(lpszOutput != NULL)
+      memcpy(lpszOutput, Bins, sizeof(Bins));
+    return sizeof(Bins) / sizeof(WORD);
+    
+  case DC_BINNAMES:
+    if(lpszOutput != NULL)
+      memcpy(lpszOutput, BinNames, sizeof(BinNames));
+    return sizeof(BinNames) / sizeof(BinNames[0]);
+
+  case DC_PAPERNAMES:
+    if(lpszOutput != NULL)
+      memcpy(lpszOutput, PaperNames, sizeof(PaperNames));
+    return sizeof(PaperNames) / sizeof(PaperNames[0]);
+
+  case DC_ORIENTATION:
+    return 90;
+
+  case DC_ENUMRESOLUTIONS:
+    if(lpszOutput != NULL)
+      memcpy(lpszOutput, Resolutions, sizeof(Resolutions));
+    return sizeof(Resolutions) / sizeof(Resolutions[0]);
+
+
+  default:
+    FIXME(psdrv, "Unsupported capability %d\n", fwCapability);
+  }
+  return -1;
+}
+
+/***************************************************************
+ *
+ *	PSDRV_DeviceMode16	[WINEPS.13]
+ *
+ */
+void WINAPI PSDRV_DeviceMode16(HWND16 hwnd, HANDLE16 hDriver,
+LPSTR lpszDevice, LPSTR lpszPort)
+{
+    PSDRV_ExtDeviceMode16( hwnd, hDriver, NULL, lpszDevice, lpszPort, NULL, 
+			   NULL, DM_PROMPT );
+    return;
+}
diff --git a/graphics/psdrv/escape.c b/graphics/psdrv/escape.c
new file mode 100644
index 0000000..036582b
--- /dev/null
+++ b/graphics/psdrv/escape.c
@@ -0,0 +1,137 @@
+/*
+ *	Postscript driver Escape function
+ *
+ *	Copyright 1998  Huw D M Davies
+ */
+#include "windows.h"
+#include "psdrv.h"
+#include "debug.h"
+#include "print.h"
+
+
+INT32 PSDRV_Escape( DC *dc, INT32 nEscape, INT32 cbInput, 
+                              SEGPTR lpInData, SEGPTR lpOutData )
+{
+    PSDRV_PDEVICE *physDev = (PSDRV_PDEVICE *)dc->physDev;
+
+    switch(nEscape) {
+
+    case NEXTBAND: {
+        RECT16 *r = (RECT16 *)PTR_SEG_TO_LIN(lpOutData);
+	if(!physDev->job.banding) {
+	    physDev->job.banding = TRUE;
+	    SetRect16( r, 0, 0, dc->w.devCaps->horzRes,
+		                     dc->w.devCaps->vertRes );
+	    TRACE(psdrv, "NEXTBAND returning %d,%d - %d,%d\n", r->left,
+		  r->top, r->right, r->bottom );
+	    return 1;
+	}
+        SetRect16( r, 0, 0, 0, 0 );
+	TRACE(psdrv, "NEXTBAND rect to 0,0 - 0,0\n" );
+	physDev->job.banding = FALSE;
+    }	/* Fall through */
+    case NEWFRAME:
+        TRACE(psdrv, "NEWFRAME\n");
+
+        if(!physDev->job.hJob) {
+	    FIXME(psdrv, "hJob == 0. Now what?\n");
+	    return 0;
+	}
+
+	if(!PSDRV_WriteEndPage( dc ))
+	    return 0;
+
+	physDev->job.NeedPageHeader = TRUE;
+	return 1;
+          
+    case STARTDOC:
+        TRACE(psdrv, "STARTDOC\n");
+        if(physDev->job.hJob) {
+	    FIXME(psdrv, "hJob != 0. Now what?\n");
+	    return 0;
+	}
+
+	physDev->job.hJob = OpenJob(physDev->job.output,
+				    PTR_SEG_TO_LIN(lpInData), dc->hSelf);
+	if(!physDev->job.hJob) {
+	    WARN(psdrv, "OpenJob failed\n");
+	    return 0;
+	}
+	physDev->job.banding = FALSE;
+	physDev->job.NeedPageHeader = FALSE;
+	physDev->job.PageNo = 1;
+	if(!PSDRV_WriteHeader( dc, PTR_SEG_TO_LIN(lpInData), cbInput ))
+	    return 0;
+
+	if(!PSDRV_WriteNewPage( dc ))
+	    return 0;
+	return 1;
+
+    case QUERYESCSUPPORT:
+        if(cbInput != 2) {
+	    WARN(psdrv, "cbInput != 2 (=%d) for QUERYESCSUPPORT\n", cbInput);
+	    return 0;
+	} else {
+	    UINT16 num = *(UINT16 *)PTR_SEG_TO_LIN(lpInData);
+	    TRACE(psdrv, "QUERYESCSUPPORT for %d\n", num);	   
+	    return 0;
+	}
+
+    case SETABORTPROC:
+        FIXME(psdrv, "SETABORTPROC: ignoring\n");
+	return 1;
+
+    case GETPHYSPAGESIZE:
+        {
+	    POINT16 *p  = (POINT16 *)PTR_SEG_TO_LIN(lpOutData);
+	    
+	    p->x = dc->w.devCaps->horzRes;
+	    p->y = dc->w.devCaps->vertRes;
+	    TRACE(psdrv, "GETPHYSPAGESIZE: returning %dx%d\n", p->x, p->y);
+	    return 1;
+	}
+
+    case GETPRINTINGOFFSET:
+        {
+	    POINT16 *p  = (POINT16 *)PTR_SEG_TO_LIN(lpOutData);
+        
+	    p->x = p->y = 0;
+	    TRACE(psdrv, "GETPRINTINGOFFSET: returning %dx%d\n", p->x, p->y);
+	    return 1;
+	}
+      
+    case GETSCALINGFACTOR:
+        {
+	    POINT16 *p  = (POINT16 *)PTR_SEG_TO_LIN(lpOutData);
+        
+	    p->x = p->y = 0;
+	    TRACE(psdrv, "GETSCALINGFACTOR: returning %dx%d\n", p->x, p->y);
+	    return 1;
+	}
+
+    case ENDDOC:
+        TRACE(psdrv, "ENDDOC\n");
+        if(!physDev->job.hJob) {
+	    FIXME(psdrv, "hJob == 0. Now what?\n");
+	    return 0;
+	}
+
+	physDev->job.NeedPageHeader = FALSE;
+
+	if(!PSDRV_WriteFooter( dc ))
+	    return 0;
+
+        if( CloseJob( physDev->job.hJob ) == SP_ERROR ) {
+	    WARN(psdrv, "CloseJob error\n");
+	    return 0;
+	}
+	physDev->job.hJob = 0;
+	return 1;
+
+    default:
+        FIXME(psdrv, "Unimplemented code 0x%x\n", nEscape);
+	return 0;
+    }
+}
+
+
diff --git a/graphics/psdrv/font.c b/graphics/psdrv/font.c
new file mode 100644
index 0000000..fc7e5d5
--- /dev/null
+++ b/graphics/psdrv/font.c
@@ -0,0 +1,269 @@
+/*
+ *	Postscript driver font functions
+ *
+ *	Copyright 1998  Huw D M Davies
+ *
+ */
+#include <string.h>
+#include "windows.h"
+#include "print.h"
+#include "psdrv.h"
+#include "debug.h"
+
+
+
+/***********************************************************************
+ *           PSDRV_FONT_SelectObject
+ */
+HFONT16 PSDRV_FONT_SelectObject( DC * dc, HFONT16 hfont,
+                                        FONTOBJ *font )
+{
+    HFONT16 prevfont = dc->w.hFont;
+    PSDRV_PDEVICE *physDev = (PSDRV_PDEVICE *)dc->physDev;
+    LOGFONT16 *lf = &(font->logfont);
+    BOOL32 bd = FALSE, it = FALSE;
+    AFM *afm;
+    FontFamily *family;
+    char FaceName[LF_FACESIZE];
+
+
+    TRACE(psdrv, "FaceName = '%s' Height = %d Italic = %d Weight = %d\n",
+	  lf->lfFaceName, lf->lfHeight, lf->lfItalic, lf->lfWeight);
+
+    dc->w.hFont = hfont;
+
+    if(lf->lfItalic)
+        it = TRUE;
+    if(lf->lfWeight > 550)
+        bd = TRUE;
+    lstrcpy32A(FaceName, lf->lfFaceName);
+    
+    if(FaceName[0] == '\0') {
+        switch(lf->lfPitchAndFamily & 0xf0) {
+	case FF_DONTCARE:
+	    break;
+	case FF_ROMAN:
+	case FF_SCRIPT:
+	    lstrcpy32A(FaceName, "Times");
+	    break;
+	case FF_SWISS:
+	    lstrcpy32A(FaceName, "Helvetica");
+	    break;
+	case FF_MODERN:
+	    lstrcpy32A(FaceName, "Courier");
+	    break;
+	case FF_DECORATIVE:
+	    lstrcpy32A(FaceName, "Symbol");
+	    break;
+	}
+    }
+
+    if(FaceName[0] == '\0') {
+        switch(lf->lfPitchAndFamily & 0x0f) {
+	case VARIABLE_PITCH:
+	    lstrcpy32A(FaceName, "Times");
+	    break;
+	default:
+	    lstrcpy32A(FaceName, "Courier");
+	    break;
+	}
+    }
+
+    for(family = PSDRV_AFMFontList; family; family = family->next) {
+        if(!lstrncmp32A(FaceName, family->FamilyName, 
+			                         strlen(family->FamilyName)))
+	    break;
+    }
+    if(!family)
+        family = PSDRV_AFMFontList;
+
+    
+    for(afm = family->afm; afm; afm = afm->next) {
+        if( (bd == (afm->Weight == FW_BOLD)) && 
+	    (it == (afm->ItalicAngle != 0.0)) )
+	        break;
+    }
+    if(!afm)
+        afm = family->afm; /* not ideal */
+    
+    physDev->font.afm = afm;
+    physDev->font.size = YLSTODS(dc, lf->lfHeight);
+    if(physDev->font.size < 0) {
+        TRACE(psdrv, "physDev->font.size < 0\n");
+        physDev->font.size = abs(physDev->font.size);
+        TRACE(psdrv, "physDev->font.size now %d\n", physDev->font.size);
+    }
+    physDev->font.scale = physDev->font.size / 
+                                    (afm->Ascender - afm->Descender);
+
+    physDev->font.escapement = lf->lfEscapement;
+    physDev->font.tm.tmHeight = physDev->font.size;
+    physDev->font.tm.tmAscent = afm->Ascender * physDev->font.scale;
+    physDev->font.tm.tmDescent = -afm->Descender * physDev->font.scale;
+    physDev->font.tm.tmInternalLeading = physDev->font.tm.tmHeight * 0.2;
+    physDev->font.tm.tmExternalLeading = physDev->font.tm.tmHeight * 0.2;
+    physDev->font.tm.tmAveCharWidth = afm->CharWidths[120] * /* x */
+                                                   physDev->font.scale;
+    physDev->font.tm.tmMaxCharWidth = afm->CharWidths[77] * /* M */
+                                           physDev->font.scale;
+    physDev->font.tm.tmWeight = afm->Weight;
+    physDev->font.tm.tmItalic = afm->ItalicAngle != 0.0;
+    physDev->font.tm.tmUnderlined = lf->lfUnderline;
+    physDev->font.tm.tmStruckOut = lf->lfStrikeOut;
+    physDev->font.tm.tmFirstChar = 32;
+    physDev->font.tm.tmLastChar = 251;
+    physDev->font.tm.tmDefaultChar = 128;
+    physDev->font.tm.tmBreakChar = 32;
+    physDev->font.tm.tmPitchAndFamily = afm->IsFixedPitch ? 0 :
+                                          TMPF_FIXED_PITCH;
+    physDev->font.tm.tmPitchAndFamily |= TMPF_DEVICE;
+    physDev->font.tm.tmCharSet = ANSI_CHARSET;
+    physDev->font.tm.tmOverhang = 0;
+    physDev->font.tm.tmDigitizedAspectX = dc->w.devCaps->logPixelsY;
+    physDev->font.tm.tmDigitizedAspectY = dc->w.devCaps->logPixelsX;
+
+    physDev->font.set = FALSE;
+
+    TRACE(psdrv, "Selected PS font '%s' size %d weight %d\n", 
+	  physDev->font.afm->FontName, physDev->font.size,
+	  physDev->font.tm.tmWeight );
+    
+    return prevfont;
+}
+
+/***********************************************************************
+ *           PSDRV_GetTextMetrics
+ */
+BOOL32 PSDRV_GetTextMetrics(DC *dc, TEXTMETRIC32A *metrics)
+{
+    PSDRV_PDEVICE *physDev = (PSDRV_PDEVICE *)dc->physDev;
+
+    memcpy(metrics, &(physDev->font.tm), sizeof(physDev->font.tm));
+    return TRUE;
+}
+
+
+/***********************************************************************
+ *           PSDRV_GetTextExtentPoint
+ */
+BOOL32 PSDRV_GetTextExtentPoint( DC *dc, LPCSTR str, INT32 count,
+                                  LPSIZE32 size )
+{
+    PSDRV_PDEVICE *physDev = (PSDRV_PDEVICE *)dc->physDev;
+    INT32 i;
+    float width;
+
+    size->cy = YDSTOLS(dc, physDev->font.tm.tmHeight);
+    width = 0.0;
+
+    for(i = 0; i < count && str[i]; i++)
+        width += physDev->font.afm->CharWidths[ (UINT32)str[i] ];
+    
+    width *= physDev->font.scale;
+    size->cx = XDSTOLS(dc, width);
+
+    return TRUE;
+}
+
+
+/***********************************************************************
+ *           PSDRV_SetFont
+ */
+BOOL32 PSDRV_SetFont( DC *dc )
+{
+    PSDRV_PDEVICE *physDev = (PSDRV_PDEVICE *)dc->physDev;
+
+    if(physDev->font.set) return TRUE;
+
+    PSDRV_WriteReencodeFont(dc);
+    PSDRV_WriteSetFont(dc);
+    physDev->font.set = TRUE;
+    return TRUE;
+}
+
+
+/***********************************************************************
+ *           PSDRV_GetFontMetric
+ */
+static UINT32 PSDRV_GetFontMetric(DC *dc, AFM *pafm, NEWTEXTMETRIC16 *pTM, 
+              ENUMLOGFONTEX16 *pLF, INT16 size)
+
+{
+    memset( pLF, 0, sizeof(*pLF) );
+    memset( pTM, 0, sizeof(*pTM) );
+
+#define plf ((LPLOGFONT16)pLF)
+    plf->lfHeight    = pTM->tmHeight       = size;
+    plf->lfWidth     = pTM->tmAveCharWidth = size * 0.7;
+    plf->lfWeight    = pTM->tmWeight       = pafm->Weight;
+    plf->lfItalic    = pTM->tmItalic       = pafm->ItalicAngle != 0.0;
+    plf->lfUnderline = pTM->tmUnderlined   = 0;
+    plf->lfStrikeOut = pTM->tmStruckOut    = 0;
+    plf->lfCharSet   = pTM->tmCharSet      = ANSI_CHARSET;
+
+    /* convert pitch values */
+
+    pTM->tmPitchAndFamily = pafm->IsFixedPitch ? 0 : TMPF_FIXED_PITCH;
+    pTM->tmPitchAndFamily |= TMPF_DEVICE;
+    plf->lfPitchAndFamily = 0;
+
+    lstrcpyn32A( plf->lfFaceName, pafm->FamilyName, LF_FACESIZE );
+#undef plf
+
+    pTM->tmAscent = pTM->tmHeight * 0.2;
+    pTM->tmDescent = pTM->tmHeight - pTM->tmAscent;
+    pTM->tmInternalLeading = pTM->tmHeight * 0.2;
+    pTM->tmMaxCharWidth = pTM->tmHeight * 0.7;
+    pTM->tmDigitizedAspectX = dc->w.devCaps->logPixelsY;
+    pTM->tmDigitizedAspectY = dc->w.devCaps->logPixelsX;
+
+    *(INT32*)&pTM->tmFirstChar = 32;
+
+    /* return font type */
+
+    return DEVICE_FONTTYPE;
+
+}
+
+/***********************************************************************
+ *           PSDRV_EnumDeviceFonts
+ */
+BOOL32 PSDRV_EnumDeviceFonts( DC* dc, LPLOGFONT16 plf, 
+				        DEVICEFONTENUMPROC proc, LPARAM lp )
+{
+    ENUMLOGFONTEX16	lf;
+    NEWTEXTMETRIC16	tm;
+    BOOL32	  	b, bRet = 0;
+    AFM			*afm;
+    FontFamily		*family;
+
+    if( plf->lfFaceName[0] ) {
+        TRACE(psdrv, "lfFaceName = '%s'\n", plf->lfFaceName);
+        for(family = PSDRV_AFMFontList; family; family = family->next) {
+            if(!lstrncmp32A(plf->lfFaceName, family->FamilyName, 
+			strlen(family->FamilyName)))
+	        break;
+	}
+	if(family) {
+	    for(afm = family->afm; afm; afm = afm->next) {
+	        TRACE(psdrv, "Got '%s'\n", afm->FontName);
+		if( (b = (*proc)( (LPENUMLOGFONT16)&lf, &tm, 
+			PSDRV_GetFontMetric( dc, afm, &tm, &lf, 200 ), lp )) )
+		     bRet = b;
+		else break;
+	    }
+	}
+    } else {
+
+        TRACE(psdrv, "lfFaceName = NULL\n");
+        for(family = PSDRV_AFMFontList; family; family = family->next) {
+	    afm = family->afm;
+	    TRACE(psdrv, "Got '%s'\n", afm->FontName);
+	    if( (b = (*proc)( (LPENUMLOGFONT16)&lf, &tm, 
+		   PSDRV_GetFontMetric( dc, afm, &tm, &lf, 200 ), lp )) )
+	        bRet = b;
+	    else break;
+	}
+    }
+    return bRet;
+}
diff --git a/graphics/psdrv/graphics.c b/graphics/psdrv/graphics.c
new file mode 100644
index 0000000..ebc4c2e
--- /dev/null
+++ b/graphics/psdrv/graphics.c
@@ -0,0 +1,73 @@
+/*
+ *	Postscript driver graphics functions
+ *
+ *	Copyright 1998  Huw D M Davies
+ *
+ *	Not much here yet...
+ */
+#include <string.h>
+#include "windows.h"
+#include "psdrv.h"
+#include "debug.h"
+#include "print.h"
+
+/**********************************************************************
+ *	     PSDRV_MoveToEx
+ */
+BOOL32 PSDRV_MoveToEx(DC *dc, INT32 x, INT32 y, LPPOINT32 pt)
+{
+    TRACE(psdrv, "%d %d\n", x, y);
+    if (pt)
+    {
+	pt->x = dc->w.CursPosX;
+	pt->y = dc->w.CursPosY;
+    }
+    dc->w.CursPosX = x;
+    dc->w.CursPosY = y;
+
+    return PSDRV_WriteMoveTo(dc, XLPTODP(dc, x), YLPTODP(dc, y));
+}
+
+/***********************************************************************
+ *           PSDRV_LineTo
+ */
+BOOL32 PSDRV_LineTo(DC *dc, INT32 x, INT32 y)
+{
+    TRACE(psdrv, "%d %d\n", x, y);
+
+    PSDRV_WriteLineTo(dc, XLPTODP(dc, x), YLPTODP(dc, y));
+    PSDRV_WriteStroke(dc);
+
+    dc->w.CursPosX = x;
+    dc->w.CursPosY = y;
+    return TRUE;
+}
+
+/***********************************************************************
+ *           PSDRV_Rectangle
+ */
+BOOL32 PSDRV_Rectangle(DC *dc, INT32 left, INT32 top, INT32 right,
+		       INT32 bottom)
+{
+    INT32 width = XLSTODS(dc, right - left);
+    INT32 height = YLSTODS(dc, bottom - top);
+
+
+    TRACE(psdrv, "%d %d - %d %d\n", left, top, right, bottom);
+
+    PSDRV_WriteRectangle(dc, XLPTODP(dc, left), YLPTODP(dc, top),
+		 width, height);
+    PSDRV_WriteStroke(dc);
+    return TRUE;
+}
+
+
+/***********************************************************************
+ *           PSDRV_Ellipse
+ */
+BOOL32 PSDRV_Ellipse( DC *dc, INT32 left, INT32 top, INT32 right, INT32 bottom )
+{
+    TRACE(psdrv, "%d %d - %d %d\n", left, top, right, bottom);
+    
+    return TRUE;
+}
diff --git a/graphics/psdrv/init.c b/graphics/psdrv/init.c
new file mode 100644
index 0000000..e99b519
--- /dev/null
+++ b/graphics/psdrv/init.c
@@ -0,0 +1,183 @@
+/*
+ *	Postscript driver initialization functions
+ *
+ *	Copyright 1998 Huw D M Davies
+ *
+ */
+
+#include "windows.h"
+#include "gdi.h"
+#include "psdrv.h"
+#include "debug.h"
+#include "heap.h"
+
+static BOOL32 PSDRV_CreateDC( DC *dc, LPCSTR driver, LPCSTR device,
+                               LPCSTR output, const DEVMODE16* initData );
+static BOOL32 PSDRV_DeleteDC( DC *dc );
+
+static const DC_FUNCTIONS PSDRV_Funcs =
+{
+    NULL,                            /* pArc */
+    NULL,                            /* pBitBlt */
+    NULL,                            /* pChord */
+    PSDRV_CreateDC,                  /* pCreateDC */
+    PSDRV_DeleteDC,                  /* pDeleteDC */
+    NULL,                            /* pDeleteObject */
+    PSDRV_Ellipse,                   /* pEllipse */
+    PSDRV_EnumDeviceFonts,           /* pEnumDeviceFonts */
+    PSDRV_Escape,                    /* pEscape */
+    NULL,                            /* pExcludeClipRect */
+    NULL,                            /* pExcludeVisRect */
+    NULL,                            /* pExtFloodFill */
+    PSDRV_ExtTextOut,                /* pExtTextOut */
+    NULL,                            /* pGetCharWidth */
+    NULL,                            /* pGetPixel */
+    PSDRV_GetTextExtentPoint,        /* pGetTextExtentPoint */
+    PSDRV_GetTextMetrics,            /* pGetTextMetrics */
+    NULL,                            /* pIntersectClipRect */
+    NULL,                            /* pIntersectVisRect */
+    PSDRV_LineTo,                    /* pLineTo */
+    PSDRV_MoveToEx,                  /* pMoveToEx */
+    NULL,                            /* pOffsetClipRgn */
+    NULL,                            /* pOffsetViewportOrg (optional) */
+    NULL,                            /* pOffsetWindowOrg (optional) */
+    NULL,                            /* pPaintRgn */
+    NULL,                            /* pPatBlt */
+    NULL,                            /* pPie */
+    NULL,                            /* pPolyPolygon */
+    NULL,                            /* pPolyPolyline */
+    NULL,                            /* pPolygon */
+    NULL,                            /* pPolyline */
+    NULL,                            /* pRealizePalette */
+    PSDRV_Rectangle,                 /* pRectangle */
+    NULL,                            /* pRestoreDC */
+    NULL,                            /* pRoundRect */
+    NULL,                            /* pSaveDC */
+    NULL,                            /* pScaleViewportExt (optional) */
+    NULL,                            /* pScaleWindowExt (optional) */
+    NULL,                            /* pSelectClipRgn */
+    PSDRV_SelectObject,              /* pSelectObject */
+    NULL,                            /* pSelectPalette */
+    NULL,                            /* pSetBkColor */
+    NULL,                            /* pSetBkMode */
+    NULL,                            /* pSetDeviceClipping */
+    NULL,                            /* pSetDIBitsToDevice */
+    NULL,                            /* pSetMapMode (optional) */
+    NULL,                            /* pSetMapperFlags */
+    NULL,                            /* pSetPixel */
+    NULL,                            /* pSetPolyFillMode */
+    NULL,                            /* pSetROP2 */
+    NULL,                            /* pSetRelAbs */
+    NULL,                            /* pSetStretchBltMode */
+    NULL,                            /* pSetTextAlign */
+    NULL,                            /* pSetTextCharacterExtra */
+    NULL,                            /* pSetTextColor */
+    NULL,                            /* pSetTextJustification */
+    NULL,                            /* pSetViewportExt (optional) */
+    NULL,                            /* pSetViewportOrg (optional) */
+    NULL,                            /* pSetWindowExt (optional) */
+    NULL,                            /* pSetWindowOrg (optional) */
+    NULL,                            /* pStretchBlt */
+    NULL                             /* pStretchDIBits */
+};
+
+
+/* Default entries for devcaps */
+
+static DeviceCaps PSDRV_DevCaps = {
+/* version */		0, 
+/* technology */	DT_RASPRINTER,
+/* horzSize */		200,
+/* vertSize */		288,
+/* horzRes */		4733,
+/* vertRes */		6808, 
+/* bitsPixel */		1,
+/* planes */		1,
+/* numBrushes */	-1,
+/* numPens */		10,
+/* numMarkers */	0,
+/* numFonts */		39,
+/* numColors */		2,
+/* pdeviceSize */	0,	
+/* curveCaps */		CC_CIRCLES | CC_PIE | CC_CHORD | CC_ELLIPSES |
+			CC_WIDE | CC_STYLED | CC_WIDESTYLED | CC_INTERIORS |
+			CC_ROUNDRECT,
+/* lineCaps */		LC_POLYLINE | LC_MARKER | LC_POLYMARKER | LC_WIDE |
+			LC_STYLED | LC_WIDESTYLED | LC_INTERIORS,
+/* polygoalnCaps */	PC_POLYGON | PC_RECTANGLE | PC_WINDPOLYGON |
+			PC_SCANLINE | PC_WIDE | PC_STYLED | PC_WIDESTYLED |
+			PC_INTERIORS,
+/* textCaps */		0, /* psdrv 0x59f7 */
+/* clipCaps */		CP_RECTANGLE,
+/* rasterCaps */	RC_BITBLT | RC_BANDING | RC_SCALING | RC_BITMAP64 |
+			RC_DI_BITMAP | RC_DIBTODEV | RC_BIGFONT |
+			RC_STRETCHBLT | RC_STRETCHDIB | RC_DEVBITS, 
+			/* psdrv 0x6e99 */
+/* aspectX */		600,
+/* aspectY */		600,
+/* aspectXY */		848,
+/* pad1 */		{ 0 },
+/* logPixelsX */	600,
+/* logPixelsY */	600, 
+/* pad2 */		{ 0 },
+/* palette size */	0,
+/* ..etc */		0, 0 };
+
+/*********************************************************************
+ *	     PSDRV_Init
+ *
+ * Initializes font metrics and registers driver. Called from GDI_Init()
+ *
+ */
+BOOL32 PSDRV_Init(void)
+{
+  TRACE(psdrv, "\n");
+  PSDRV_GetFontMetrics();
+  return DRIVER_RegisterDriver( "WINEPS", &PSDRV_Funcs );
+}
+
+
+/**********************************************************************
+ *	     PSDRV_CreateDC
+ */
+static BOOL32 PSDRV_CreateDC( DC *dc, LPCSTR driver, LPCSTR device,
+                               LPCSTR output, const DEVMODE16* initData )
+{
+    PSDRV_PDEVICE *physDev;
+
+    TRACE(psdrv, "(%s %s %s %p)\n", driver, device, output, initData);
+
+    if(!PSDRV_AFMFontList) {
+        MSG("To use WINEPS you need to install some AFM files.\n");
+	return FALSE;
+    }
+
+    dc->w.devCaps = &PSDRV_DevCaps;
+    dc->w.hVisRgn = CreateRectRgn32(0, 0, dc->w.devCaps->horzRes,
+    			    dc->w.devCaps->vertRes);
+    
+    physDev = (PSDRV_PDEVICE *)HeapAlloc( GetProcessHeap(), 0,
+					             sizeof(*physDev) );
+    if (!physDev) return FALSE;
+    dc->physDev = physDev;
+    physDev->job.output = HEAP_strdupA( GetProcessHeap(), 0, output );
+    if (!physDev->job.output) return FALSE;
+    physDev->job.hJob = 0;
+    return TRUE;
+}
+
+
+/**********************************************************************
+ *	     PSDRV_DeleteDC
+ */
+static BOOL32 PSDRV_DeleteDC( DC *dc )
+{
+    PSDRV_PDEVICE *physDev = (PSDRV_PDEVICE *)dc->physDev;
+
+    TRACE(psdrv, "\n");
+    HeapFree( GetProcessHeap(), 0, physDev->job.output );
+    HeapFree( GetProcessHeap(), 0, physDev );
+    dc->physDev = NULL;
+    return TRUE;
+}
+
diff --git a/graphics/psdrv/objects.c b/graphics/psdrv/objects.c
new file mode 100644
index 0000000..6d7de82
--- /dev/null
+++ b/graphics/psdrv/objects.c
@@ -0,0 +1,82 @@
+/*
+ *	Postscript driver object handling
+ *
+ *	Copyright 1998  Huw D M Davies
+ *
+ */
+
+#include "windows.h"
+#include "psdrv.h"
+#include "font.h"
+#include "pen.h"
+#include "brush.h"
+#include "bitmap.h"
+#include "debug.h"
+
+/***********************************************************************
+ *           PSDRV_BITMAP_SelectObject
+ */
+static HBITMAP16 PSDRV_BITMAP_SelectObject( DC * dc, HBITMAP16 hbitmap,
+                                            BITMAPOBJ * bmp )
+{
+    FIXME(psdrv, "stub\n");
+    return 0;
+}
+
+
+/***********************************************************************
+ *           PSDRV_BRUSH_SelectObject
+ */
+static HBRUSH32 PSDRV_BRUSH_SelectObject( DC * dc, HBRUSH32 hbrush,
+                                          BRUSHOBJ * brush )
+{
+    FIXME(psdrv, "stub\n");
+    return 0;
+}
+
+
+/***********************************************************************
+ *           PSDRV_PEN_SelectObject
+ */
+static HPEN32 PSDRV_PEN_SelectObject( DC * dc, HPEN32 hpen, PENOBJ * pen )
+{
+    FIXME(psdrv, "stub\n");
+    return 0;
+}
+
+
+/***********************************************************************
+ *           PSDRV_SelectObject
+ */
+HGDIOBJ32 PSDRV_SelectObject( DC *dc, HGDIOBJ32 handle )
+{
+    GDIOBJHDR * ptr = GDI_GetObjPtr( handle, MAGIC_DONTCARE );
+    HGDIOBJ32 ret = 0;
+
+    if (!ptr) return 0;
+    TRACE(psdrv, "hdc=%04x %04x\n", dc->hSelf, handle );
+    
+    switch(ptr->wMagic)
+    {
+      case PEN_MAGIC:
+	  ret = PSDRV_PEN_SelectObject( dc, handle, (PENOBJ *)ptr );
+	  break;
+      case BRUSH_MAGIC:
+	  ret = PSDRV_BRUSH_SelectObject( dc, handle, (BRUSHOBJ *)ptr );
+	  break;
+      case BITMAP_MAGIC:
+	  ret = PSDRV_BITMAP_SelectObject( dc, handle, (BITMAPOBJ *)ptr );
+	  break;
+      case FONT_MAGIC:
+	  ret = PSDRV_FONT_SelectObject( dc, handle, (FONTOBJ *)ptr );	  
+	  break;
+      case REGION_MAGIC:
+	  ret = (HGDIOBJ16)SelectClipRgn16( dc->hSelf, handle );
+	  break;
+      default:
+	  ERR(psdrv, "Unknown object magic %04x\n", ptr->wMagic);
+	  break;
+    }
+    GDI_HEAP_UNLOCK( handle );
+    return ret;
+}
diff --git a/graphics/psdrv/ps.c b/graphics/psdrv/ps.c
new file mode 100644
index 0000000..c544d17
--- /dev/null
+++ b/graphics/psdrv/ps.c
@@ -0,0 +1,323 @@
+/*
+ *	Postscript output functions
+ *
+ *	Copyright 1998  Huw D M Davies
+ *
+ */
+
+#include "windows.h"
+#include "psdrv.h"
+#include "print.h"
+#include "debug.h"
+
+char psheader[] = /* title */
+"%%!PS-Adobe-3.0 (not quite)\n"
+"%%%%Creator: Wine Postscript Driver\n"
+"%%%%Title: %s\n"
+"%%%%BoundingBox: 0 0 595 842\n"
+"%%%%Pages: (atend)\n"
+"%%%%EndComments\n"
+"%%%%BeginProlog\n"
+"/reencodefont {\n"
+"findfont\n"
+"dup length dict begin\n"
+"{1 index /FID ne {def} {pop pop} ifelse} forall\n"
+"/Encoding ISOLatin1Encoding def\n"
+"currentdict\n"
+"end\n"
+"definefont pop\n"
+"} bind def\n"
+"%%%%EndProlog\n"
+"%%%%BeginSetup\n"
+"%%%%EndSetup\n";
+
+char psnewpage[] = /* name, number */
+"%%%%Page: %s %d\n"
+"%%%%BeginPageSetup\n"
+"/pgsave save def\n"
+"72 600 div dup scale\n"
+"0 7014 translate\n"
+"1 -1 scale\n"
+"%%%%EndPageSetup\n";
+
+char psendpage[] =
+"pgsave restore\n"
+"showpage\n";
+
+char psfooter[] = /* pages */
+"%%%%Trailer\n"
+"%%%%Pages: %d\n"
+"%%%%EOF\n";
+
+char psmoveto[] = /* x, y */
+"%d %d moveto\n";
+
+char pslineto[] = /* x, y */
+"%d %d lineto\n";
+
+char psrlineto[] = /* dx, dy */
+"%d %d rlineto\n";
+
+char psstroke[] = 
+"stroke\n";
+
+char psrectangle[] = /* x, y, width, height, -width */
+"%d %d moveto\n"
+"%d 0 rlineto\n"
+"0 %d rlineto\n"
+"%d 0 rlineto\n"
+"closepath\n";
+
+char psshow[] = /* string */
+"(%s) show\n";
+
+char pssetfont[] = /* fontname, xscale, yscale, ascent, escapement */
+"/%s findfont\n"
+"[%d 0 0 %d 0 %d]\n"
+"%d 10 div matrix rotate\n"
+"matrix concatmatrix\n"
+"makefont setfont\n";
+
+char psreencodefont[] = /* newfontname basefontname*/
+"/%s /%s reencodefont\n";
+
+
+int PSDRV_WriteSpool(DC *dc, LPSTR lpData, WORD cch)
+{
+    PSDRV_PDEVICE *physDev = (PSDRV_PDEVICE *)dc->physDev;
+
+    if(physDev->job.NeedPageHeader) {
+	physDev->job.PageNo++;
+        if( !PSDRV_WriteNewPage(dc) )
+	    return FALSE;
+	physDev->job.NeedPageHeader = FALSE;
+    }
+    return WriteSpool( physDev->job.hJob, lpData, cch );
+}
+
+
+INT32 PSDRV_WriteHeader( DC *dc, char *title, int len )
+{
+    PSDRV_PDEVICE *physDev = (PSDRV_PDEVICE *)dc->physDev;
+    char *buf, *titlebuf;
+
+
+    titlebuf = (char *)HeapAlloc( GetProcessHeap(), 0, len+1 );
+    if(!titlebuf) {
+        WARN(psdrv, "HeapAlloc failed\n");
+        return 0;
+    }
+    memcpy(titlebuf, title, len);
+    titlebuf[len] = '\0';
+
+    buf = (char *)HeapAlloc( GetProcessHeap(), 0, sizeof(psheader) + len);
+    if(!buf) {
+        WARN(psdrv, "HeapAlloc failed\n");
+	HeapFree( GetProcessHeap(), 0, titlebuf );
+        return 0;
+    }
+
+    wsprintf32A(buf, psheader, title);
+
+    if( WriteSpool( physDev->job.hJob, buf, strlen(buf) ) != 
+	                                             strlen(buf) ) {
+        WARN(psdrv, "WriteSpool error\n");
+	HeapFree( GetProcessHeap(), 0, titlebuf );
+	HeapFree( GetProcessHeap(), 0, buf );
+	return 0;
+    }
+    HeapFree( GetProcessHeap(), 0, titlebuf );
+    HeapFree( GetProcessHeap(), 0, buf );
+    return 1;
+}
+
+
+INT32 PSDRV_WriteFooter( DC *dc )
+{
+    PSDRV_PDEVICE *physDev = (PSDRV_PDEVICE *)dc->physDev;
+    char *buf;
+
+    buf = (char *)HeapAlloc( GetProcessHeap(), 0, sizeof(psfooter) + 100 );
+    if(!buf) {
+        WARN(psdrv, "HeapAlloc failed\n");
+        return 0;
+    }
+
+    wsprintf32A(buf, psfooter, physDev->job.PageNo);
+
+    if( WriteSpool( physDev->job.hJob, buf, strlen(buf) ) != 
+	                                             strlen(buf) ) {
+        WARN(psdrv, "WriteSpool error\n");
+	HeapFree( GetProcessHeap(), 0, buf );
+	return 0;
+    }
+    HeapFree( GetProcessHeap(), 0, buf );
+    return 1;
+}
+
+
+
+INT32 PSDRV_WriteEndPage( DC *dc )
+{
+    PSDRV_PDEVICE *physDev = (PSDRV_PDEVICE *)dc->physDev;
+
+    if( WriteSpool( physDev->job.hJob, psendpage, sizeof(psendpage)-1 ) != 
+	                                             sizeof(psendpage)-1 ) {
+        WARN(psdrv, "WriteSpool error\n");
+	return 0;
+    }
+    return 1;
+}
+
+
+
+
+INT32 PSDRV_WriteNewPage( DC *dc )
+{
+    PSDRV_PDEVICE *physDev = (PSDRV_PDEVICE *)dc->physDev;
+    char *buf;
+    char name[100];
+    
+    wsprintf32A(name, "%d", physDev->job.PageNo);
+
+    buf = (char *)HeapAlloc( GetProcessHeap(), 0, sizeof(psnewpage) + 100 );
+    if(!buf) {
+        WARN(psdrv, "HeapAlloc failed\n");
+        return 0;
+    }
+
+    wsprintf32A(buf, psnewpage, name, physDev->job.PageNo); 
+    if( WriteSpool( physDev->job.hJob, buf, strlen(buf) ) != 
+	                                             strlen(buf) ) {
+        WARN(psdrv, "WriteSpool error\n");
+	HeapFree( GetProcessHeap(), 0, buf );
+	return 0;
+    }
+    HeapFree( GetProcessHeap(), 0, buf );
+    return 1;
+}
+
+
+BOOL32 PSDRV_WriteMoveTo(DC *dc, INT32 x, INT32 y)
+{
+    char buf[100];
+
+    wsprintf32A(buf, psmoveto, x, y);
+    return PSDRV_WriteSpool(dc, buf, strlen(buf));
+}
+
+BOOL32 PSDRV_WriteLineTo(DC *dc, INT32 x, INT32 y)
+{
+    char buf[100];
+
+    wsprintf32A(buf, pslineto, x, y);
+    return PSDRV_WriteSpool(dc, buf, strlen(buf));
+}
+
+
+BOOL32 PSDRV_WriteStroke(DC *dc)
+{
+    return PSDRV_WriteSpool(dc, psstroke, sizeof(psstroke)-1);
+}
+
+
+
+BOOL32 PSDRV_WriteRectangle(DC *dc, INT32 x, INT32 y, INT32 width, 
+			INT32 height)
+{
+    char buf[100];
+
+    wsprintf32A(buf, psrectangle, x, y, width, height, -width);
+    return PSDRV_WriteSpool(dc, buf, strlen(buf));
+}
+
+static char encodingext[] = "-ISOLatin1";
+
+BOOL32 PSDRV_WriteSetFont(DC *dc)
+{
+    PSDRV_PDEVICE *physDev = (PSDRV_PDEVICE *)dc->physDev;
+    char *buf, *newbuf;
+
+    buf = (char *)HeapAlloc( GetProcessHeap(), 0,
+	     sizeof(pssetfont) + strlen(physDev->font.afm->FontName) + 40);
+
+    if(!buf) {
+        WARN(psdrv, "HeapAlloc failed\n");
+        return FALSE;
+    }
+
+    newbuf = (char *)HeapAlloc( GetProcessHeap(), 0,
+	      strlen(physDev->font.afm->FontName) + sizeof(encodingext));
+
+    if(!newbuf) {
+        WARN(psdrv, "HeapAlloc failed\n");
+	HeapFree(GetProcessHeap(), 0, buf);
+        return FALSE;
+    }
+
+    wsprintf32A(newbuf, "%s%s", physDev->font.afm->FontName, encodingext);
+
+    wsprintf32A(buf, pssetfont, newbuf, 
+		physDev->font.tm.tmHeight, -physDev->font.tm.tmHeight,
+		physDev->font.tm.tmAscent, -physDev->font.escapement);
+
+    PSDRV_WriteSpool(dc, buf, strlen(buf));
+    HeapFree(GetProcessHeap(), 0, buf);
+    return TRUE;
+}    
+
+BOOL32 PSDRV_WriteReencodeFont(DC *dc)
+{
+    PSDRV_PDEVICE *physDev = (PSDRV_PDEVICE *)dc->physDev;
+    char *buf, *newbuf;
+ 
+    buf = (char *)HeapAlloc( GetProcessHeap(), 0,
+	     sizeof(psreencodefont) + 2 * strlen(physDev->font.afm->FontName) 
+			     + sizeof(encodingext));
+
+    if(!buf) {
+        WARN(psdrv, "HeapAlloc failed\n");
+        return FALSE;
+    }
+
+    newbuf = (char *)HeapAlloc( GetProcessHeap(), 0,
+	      strlen(physDev->font.afm->FontName) + sizeof(encodingext));
+
+    if(!newbuf) {
+        WARN(psdrv, "HeapAlloc failed\n");
+	HeapFree(GetProcessHeap(), 0, buf);
+        return FALSE;
+    }
+
+    wsprintf32A(newbuf, "%s%s", physDev->font.afm->FontName, encodingext);
+    wsprintf32A(buf, psreencodefont, newbuf, physDev->font.afm->FontName);
+
+    PSDRV_WriteSpool(dc, buf, strlen(buf));
+
+    HeapFree(GetProcessHeap(), 0, newbuf);
+    HeapFree(GetProcessHeap(), 0, buf);
+    return TRUE;
+}    
+
+BOOL32 PSDRV_WriteShow(DC *dc, char *str, INT32 count)
+{
+    char *buf;
+
+    buf = (char *)HeapAlloc( GetProcessHeap(), 0, sizeof(psshow) + count);
+
+    if(!buf) {
+        WARN(psdrv, "HeapAlloc failed\n");
+        return FALSE;
+    }
+
+    wsprintf32A(buf, psshow, str);
+
+    PSDRV_WriteSpool(dc, buf, strlen(buf));
+    HeapFree(GetProcessHeap(), 0, buf);
+    return TRUE;
+}    
+
+
+
+
+
diff --git a/graphics/psdrv/text.c b/graphics/psdrv/text.c
new file mode 100644
index 0000000..f886b75
--- /dev/null
+++ b/graphics/psdrv/text.c
@@ -0,0 +1,85 @@
+/*
+ *	Postscript driver text functions
+ *
+ *	Copyright 1998  Huw D M Davies
+ *
+ */
+#include <string.h>
+#include "windows.h"
+#include "psdrv.h"
+#include "debug.h"
+#include "print.h"
+
+/***********************************************************************
+ *           PSDRV_ExtTextOut
+ */
+BOOL32 PSDRV_ExtTextOut( DC *dc, INT32 x, INT32 y, UINT32 flags,
+                   const RECT32 *lprect, LPCSTR str, UINT32 count,
+                   const INT32 *lpDx )
+{
+    PSDRV_PDEVICE *physDev = (PSDRV_PDEVICE *)dc->physDev;
+    char *strbuf;
+    SIZE32 sz;
+
+    TRACE(psdrv, "(x=%d, y=%d, flags=0x%08x, str='%s', count=%d)\n", x, y,
+	  flags, str, count);
+
+    strbuf = (char *)HeapAlloc( GetProcessHeap(), 0, count + 1);
+    if(!strbuf) {
+        WARN(psdrv, "HeapAlloc failed\n");
+        return FALSE;
+    }
+
+    if(dc->w.textAlign & TA_UPDATECP) {
+	x = dc->w.CursPosX;
+	y = dc->w.CursPosY;
+    }
+
+    x = XLPTODP(dc, x);
+    y = YLPTODP(dc, y);
+
+    GetTextExtentPoint32A(dc->hSelf, str, count, &sz);
+    sz.cx = XLSTODS(dc, sz.cx);
+    sz.cy = YLSTODS(dc, sz.cy);
+
+    switch(dc->w.textAlign & (TA_LEFT | TA_CENTER | TA_RIGHT) ) {
+    case TA_LEFT:
+        if(dc->w.textAlign & TA_UPDATECP)
+	    dc->w.CursPosX = XDPTOLP(dc, x + sz.cx);
+	break;
+
+    case TA_CENTER:
+	x -= sz.cx/2;
+	break;
+
+    case TA_RIGHT:
+	x -= sz.cx;
+	if(dc->w.textAlign & TA_UPDATECP)
+	    dc->w.CursPosX = XDPTOLP(dc, x);
+	break;
+    }
+
+    switch(dc->w.textAlign & (TA_TOP | TA_BASELINE | TA_BOTTOM) ) {
+    case TA_TOP:
+	break;
+
+    case TA_BASELINE:
+	y -= physDev->font.tm.tmAscent;
+	break;
+
+    case TA_BOTTOM:
+        y -= sz.cy;
+	break;
+    }
+
+    memcpy(strbuf, str, count);
+    *(strbuf + count) = '\0';
+    
+    PSDRV_SetFont(dc);
+
+    PSDRV_WriteMoveTo(dc, x, y);
+    PSDRV_WriteShow(dc, strbuf, strlen(strbuf));
+
+    HeapFree(GetProcessHeap(), 0, strbuf);
+    return TRUE;
+}
diff --git a/graphics/x11drv/bitblt.c b/graphics/x11drv/bitblt.c
index 699d67c..6cc8994 100644
--- a/graphics/x11drv/bitblt.c
+++ b/graphics/x11drv/bitblt.c
@@ -1404,7 +1404,6 @@
     result = (BOOL32)CALL_LARGE_STACK( BITBLT_DoStretchBlt, &params );
     LeaveCriticalSection( &X11DRV_CritSection );
     DIB_UpdateDIBSection( dcDst, TRUE );
-    DIB_UpdateDIBSection( dcSrc, TRUE );
     return result;
 }
 
@@ -1427,6 +1426,5 @@
     result = (BOOL32)CALL_LARGE_STACK( BITBLT_DoStretchBlt, &params );
     LeaveCriticalSection( &X11DRV_CritSection );
     DIB_UpdateDIBSection( dcDst, TRUE );
-    DIB_UpdateDIBSection( dcSrc, TRUE );
     return result;
 }
diff --git a/graphics/x11drv/graphics.c b/graphics/x11drv/graphics.c
index 4f08fdf..1912e55 100644
--- a/graphics/x11drv/graphics.c
+++ b/graphics/x11drv/graphics.c
@@ -246,7 +246,7 @@
 BOOL32
 X11DRV_Rectangle(DC *dc, INT32 left, INT32 top, INT32 right, INT32 bottom)
 {
-    INT32 width, oldwidth;
+    INT32 width, oldwidth, oldjoinstyle;
 
     TRACE(graphics, "(%d %d %d %d)\n", 
     	left, top, right, bottom);
@@ -276,6 +276,9 @@
     }
     if(width == 1) width=0;
     dc->u.x.pen.width=width;
+    oldjoinstyle=dc->u.x.pen.linejoin;
+    if(dc->u.x.pen.type!=PS_GEOMETRIC)
+            dc->u.x.pen.linejoin=PS_JOIN_MITER;
 
     if ((right > left + width) && (bottom > top + width))
     {
@@ -291,6 +294,7 @@
 		        right-left-1, bottom-top-1 );
 
     dc->u.x.pen.width=oldwidth;
+    dc->u.x.pen.linejoin=oldjoinstyle;
     return TRUE;
 }
 
diff --git a/graphics/x11drv/pen.c b/graphics/x11drv/pen.c
index a918c85..5251075 100644
--- a/graphics/x11drv/pen.c
+++ b/graphics/x11drv/pen.c
@@ -23,10 +23,12 @@
 
     dc->w.hPen = hpen;
     dc->u.x.pen.style = pen->logpen.lopnStyle & PS_STYLE_MASK;
+    dc->u.x.pen.type = pen->logpen.lopnStyle & PS_TYPE_MASK;
     dc->u.x.pen.endcap = pen->logpen.lopnStyle & PS_ENDCAP_MASK;
     dc->u.x.pen.linejoin = pen->logpen.lopnStyle & PS_JOIN_MASK;
 
-    dc->u.x.pen.width = pen->logpen.lopnWidth.x * dc->vportExtX / dc->wndExtX;
+    dc->u.x.pen.width = (pen->logpen.lopnWidth.x * dc->vportExtX +
+                    dc->wndExtX / 2) / dc->wndExtX;
     if (dc->u.x.pen.width < 0) dc->u.x.pen.width = -dc->u.x.pen.width;
     if (dc->u.x.pen.width == 1) dc->u.x.pen.width = 0;  /* Faster */
     dc->u.x.pen.pixel = COLOR_ToPhysical( dc, pen->logpen.lopnColor );    
diff --git a/graphics/x11drv/xfont.c b/graphics/x11drv/xfont.c
index 2378ec3..85762c6 100644
--- a/graphics/x11drv/xfont.c
+++ b/graphics/x11drv/xfont.c
@@ -197,14 +197,14 @@
       fi->fi_flags |= FI_POLYWEIGHT;
   else if( j == 4 )
        {
-         if( !lstrncmpi32A( "bold", lpStr, 4) )
+         if( !strncasecmp( "bold", lpStr, 4) )
            fi->df.dfWeight = FW_BOLD; 
-	 else if( !lstrncmpi32A( "demi", lpStr, 4) )
+	 else if( !strncasecmp( "demi", lpStr, 4) )
 	 {
 	   fi->fi_flags |= FI_FW_DEMI;
 	   fi->df.dfWeight = FW_DEMIBOLD;
 	 }
-	 else if( !lstrncmpi32A( "book", lpStr, 4) )
+	 else if( !strncasecmp( "book", lpStr, 4) )
 	 {
 	   fi->fi_flags |= FI_FW_BOOK;
 	   fi->df.dfWeight = FW_REGULAR;
@@ -212,14 +212,14 @@
        }
   else if( j == 5 )
        {
-         if( !lstrncmpi32A( "light", lpStr, 5) )
+         if( !strncasecmp( "light", lpStr, 5) )
 	   fi->df.dfWeight = FW_LIGHT;
-         else if( !lstrncmpi32A( "black", lpStr, 5) )
+         else if( !strncasecmp( "black", lpStr, 5) )
 	   fi->df.dfWeight = FW_BLACK;
        }
-  else if( j == 6 && !lstrncmpi32A( "medium", lpStr, 6) )
+  else if( j == 6 && !strncasecmp( "medium", lpStr, 6) )
       fi->df.dfWeight = FW_REGULAR; 
-  else if( j == 8 && !lstrncmpi32A( "demibold", lpStr, 8) )
+  else if( j == 8 && !strncasecmp( "demibold", lpStr, 8) )
       fi->df.dfWeight = FW_DEMIBOLD; 
   else
       fi->df.dfWeight = FW_DONTCARE; /* FIXME: try to get something
@@ -274,7 +274,7 @@
 /* width name - */
    lpch = LFD_Advance( lpstr = lpch, 1);
    if( !*lpch ) return FALSE;
-   if( lstrncmpi32A( "normal", lpstr, 6) )	/* XXX 'narrow', 'condensed', etc... */
+   if( strncasecmp( "normal", lpstr, 6) )	/* XXX 'narrow', 'condensed', etc... */
        dec_style_check = TRUE;
    else
        fi->fi_flags |= FI_NORMAL;
@@ -751,28 +751,28 @@
    switch( lfFaceName[0] )
    {
         case 'h':
-        case 'H': if(!lstrcmpi32A(lfFaceName, "Helvetica") )
+        case 'H': if(!strcasecmp(lfFaceName, "Helvetica") )
                     return FF_SWISS;
                   break;
         case 'c':
-        case 'C': if(!lstrcmpi32A(lfFaceName, "Courier") ||
-		     !lstrcmpi32A(lfFaceName, "Charter") )
+        case 'C': if(!strcasecmp(lfFaceName, "Courier") ||
+		     !strcasecmp(lfFaceName, "Charter") )
                     return FF_ROMAN;
                   break;
         case 'p':
-        case 'P': if( !lstrcmpi32A(lfFaceName,"Palatino") )
+        case 'P': if( !strcasecmp(lfFaceName,"Palatino") )
                     return FF_ROMAN;
                   break;
         case 't':
-        case 'T': if(!lstrncmpi32A(lfFaceName, "Times", 5) )
+        case 'T': if(!strncasecmp(lfFaceName, "Times", 5) )
                     return FF_ROMAN;
                   break;
         case 'u':
-        case 'U': if(!lstrcmpi32A(lfFaceName, "Utopia") )
+        case 'U': if(!strcasecmp(lfFaceName, "Utopia") )
                     return FF_ROMAN;
                   break;
         case 'z':
-        case 'Z': if(!lstrcmpi32A(lfFaceName, "Zapf Dingbats") )
+        case 'Z': if(!strcasecmp(lfFaceName, "Zapf Dingbats") )
                     return FF_DECORATIVE;
    }
    return 0;
@@ -786,7 +786,7 @@
 {
     resource = LFD_Advance( resource, 2 );
     if( resource )
-	return (!lstrncmpi32A( resource, name, n ));
+	return (!strncasecmp( resource, name, n ));
     return FALSE;
 }
 
@@ -857,8 +857,8 @@
 	    while( *buffer && isspace(*buffer) ) buffer++;
 	    for( fr = NULL, pfr = fontList; pfr; pfr = pfr->next )
 	    {
-		i = lstrlen32A( pfr->resource );
-		if( !lstrncmpi32A( pfr->resource, buffer, i) )
+		i = strlen( pfr->resource );
+		if( !strncasecmp( pfr->resource, buffer, i) )
 		{
 		    if( fr )
 		    {
@@ -884,7 +884,7 @@
     while( 1 ) 
     {
 	/* check if we already got one */
-	if( !lstrcmpi32A( pfa->faTypeFace, lpAlias ) )
+	if( !strcasecmp( pfa->faTypeFace, lpAlias ) )
 	{
 	    TRACE(font,"\tredundant alias '%s' -> '%s'\n", 
 		  lpAlias, lpTypeFace );
@@ -966,14 +966,14 @@
 	{
 	    int length;
 
-	    length = lstrlen32A( lpAlias );
+	    length = strlen( lpAlias );
 	    if( lpResource && length )
 	    {
 		fontResource* fr, *frMatch = NULL;
 
 		for (fr = fontList; fr ; fr = fr->next)
 		{
-		    if( !lstrcmpi32A( fr->resource, lpResource ) ) frMatch = fr;
+		    if( !strcasecmp( fr->resource, lpResource ) ) frMatch = fr;
 		    if( XFONT_CheckResourceName( fr->resource, lpAlias, length ) )
 		    {
 			/* alias is not needed since the real font is present */
@@ -990,7 +990,7 @@
 			for(pfa = aliasTable; pfa; pfa = pfa->next)
 			{
 	/* Remove lpAlias from aliasTable - we should free the old entry */
-			    if(!lstrcmp32A(lpAlias, pfa->faAlias))
+			    if(!strcmp(lpAlias, pfa->faAlias))
 			    {
 				if(prev)
 				    prev->next = pfa->next;
@@ -999,7 +999,7 @@
 			     }
 
 	/* Update any references to the substituted font in aliasTable */
-			    if(!lstrcmp32A(frMatch->lfFaceName,
+			    if(!strcmp(frMatch->lfFaceName,
 							pfa->faTypeFace))
 				pfa->faTypeFace = HEAP_strdupA( SystemHeap, 0,
 							 lpAlias );
@@ -1037,11 +1037,11 @@
     pwd = getpwuid(getuid());
     if( pwd && pwd->pw_dir )
     {
-	int i = lstrlen32A( pwd->pw_dir ) + lstrlen32A( INIWinePrefix ) + 
-					    lstrlen32A( INIFontMetrics ) + 2;
+	int i = strlen( pwd->pw_dir ) + strlen( INIWinePrefix ) + 
+					    strlen( INIFontMetrics ) + 2;
 	if( i > *buf_size ) 
 	    buffer = (char*) HeapReAlloc( SystemHeap, 0, buffer, *buf_size = i );
-	lstrcpy32A( buffer, pwd->pw_dir );
+	strcpy( buffer, pwd->pw_dir );
 	strcat( buffer, INIWinePrefix );
 	strcat( buffer, INIFontMetrics );
     } else buffer[0] = '\0';
@@ -1170,7 +1170,7 @@
 
 	for( j = i = 0, pfr = fontList; pfr; pfr = pfr->next ) 
 	{
-	    i += lstrlen32A( pfr->resource ) + 1;
+	    i += strlen( pfr->resource ) + 1;
 	    j += pfr->count;
 	}
         i += n_ff * sizeof(fontResource) + j * sizeof(fontInfo) + sizeof(int);
@@ -1207,7 +1207,7 @@
 	    write( fd, &i, sizeof(int) );
 	    for( pfr = fontList; pfr && i == j; pfr = pfr->next )
 	    {
-	        i = lstrlen32A( pfr->resource ) + 1;
+	        i = strlen( pfr->resource ) + 1;
 		j = write( fd, pfr->resource, i );
 	    }
 	}
@@ -1349,7 +1349,7 @@
      printf("%i\t: %s\n", i, x_pattern[i] );
 #endif
 
-     j = lstrlen32A( x_pattern[i] );
+     j = strlen( x_pattern[i] );
      if( j ) x_checksum ^= __genericCheckSum( x_pattern[i], j );
   }
   x_checksum |= X_PFONT_MAGIC;
@@ -1395,8 +1395,8 @@
 
 	for( pfr = NULL, fr = fontList; fr; fr = fr->next )
 	{
-	   if( !lstrncmpi32A(fr->resource, typeface, j) && 
-	       lstrlen32A(fr->resource) == j ) break;
+	   if( !strncasecmp(fr->resource, typeface, j) && 
+	       strlen(fr->resource) == j ) break;
 	   pfr = fr;
 	}  
 
@@ -1433,7 +1433,7 @@
 	{
 	    /* set scalable font height to 24 to get an origin for extrapolation */
 
-	   j = lstrlen32A(typeface);  j += 0x10;
+	   j = strlen(typeface);  j += 0x10;
 	   if( j > buf_size ) 
 	       buffer = (char*)HeapReAlloc( SystemHeap, 0, buffer, buf_size = j );
 
@@ -1482,7 +1482,7 @@
 
   /* check if we're dealing with X11 R6 server */
 
-  lstrcpy32A(buffer, "-*-*-*-*-normal-*-[12 0 0 12]-*-72-*-*-*-iso8859-1");
+  strcpy(buffer, "-*-*-*-*-normal-*-[12 0 0 12]-*-72-*-*-*-iso8859-1");
   if( (x_fs = TSXLoadQueryFont(display, buffer)) )
   {
        XTextCaps |= TC_SF_X_YINDEP;
@@ -1739,7 +1739,7 @@
 {
   while( pfr )
   {
-    if( !lstrcmpi32A( pfr->lfFaceName, pTypeFace ) ) break;
+    if( !strcasecmp( pfr->lfFaceName, pTypeFace ) ) break;
     pfr = pfr->next;
   }
   return pfr;
@@ -1761,7 +1761,7 @@
 	LPSTR str = NULL;
 
 	for( fa = aliasTable; fa; fa = fa->next )
-	     if( !lstrcmpi32A( fa->faAlias, fm.plf->lfFaceName ) ) 
+	     if( !strcmp( fa->faAlias, fm.plf->lfFaceName ) ) 
 	     {
 		str = fa->faTypeFace;
 		break;
@@ -1834,7 +1834,7 @@
 
 	    if( !memcmp( plf, &fontCache[i].lf,
 			 sizeof(LOGFONT16) - LF_FACESIZE ) &&
-		!lstrncmpi32A( plf->lfFaceName, fontCache[i].lf.lfFaceName, 
+		!strncasecmp( plf->lfFaceName, fontCache[i].lf.lfFaceName, 
 							    LF_FACESIZE ) )
 	    {
 		/* remove temporarily from the lru list */
diff --git a/if1632/Makefile.in b/if1632/Makefile.in
index dfad2dd..3275487 100644
--- a/if1632/Makefile.in
+++ b/if1632/Makefile.in
@@ -38,6 +38,7 @@
 	win87em.spec \
 	winaspi.spec \
 	windebug.spec \
+	wineps.spec \
 	wing.spec \
 	winsock.spec \
 	wprocs.spec
@@ -49,6 +50,7 @@
 	dummy.c \
 	relay.c \
 	signal.c \
+	snoop.c \
 	thunk.c
 
 GEN_ASM_SRCS = \
diff --git a/if1632/builtin.c b/if1632/builtin.c
index 7f40e21..40c3652 100644
--- a/if1632/builtin.c
+++ b/if1632/builtin.c
@@ -76,6 +76,7 @@
 extern const WIN16_DESCRIPTOR WIN87EM_Descriptor;
 extern const WIN16_DESCRIPTOR WINASPI_Descriptor;
 extern const WIN16_DESCRIPTOR WINDEBUG_Descriptor;
+extern const WIN16_DESCRIPTOR WINEPS_Descriptor;
 extern const WIN16_DESCRIPTOR WING_Descriptor;
 extern const WIN16_DESCRIPTOR WINSOCK_Descriptor;
 extern const WIN16_DESCRIPTOR WPROCS_Descriptor;
@@ -117,6 +118,7 @@
     { &WIN32S16_Descriptor, 0 },
     { &WIN87EM_Descriptor,  DLL_FLAG_NOT_USED },
     { &WINASPI_Descriptor,  0 },
+    { &WINEPS_Descriptor,   DLL_FLAG_ALWAYS_USED },
     { &WING_Descriptor,     0 },
     { &WINSOCK_Descriptor,  0 },
     /* Last entry */
diff --git a/if1632/kernel.spec b/if1632/kernel.spec
index 88f9cf0..a57c987 100644
--- a/if1632/kernel.spec
+++ b/if1632/kernel.spec
@@ -64,7 +64,7 @@
 64  pascal16 AccessResource(word word) AccessResource16
 65  pascal SizeofResource(word word) SizeofResource16
 66  pascal16 AllocResource(word word long) AllocResource
-67  pascal SetResourceHandler(word segstr segptr) THUNK_SetResourceHandler
+67  pascal SetResourceHandler(word segstr segptr) SetResourceHandler
 68  pascal16 InitAtomTable(word) InitAtomTable16
 69  pascal16 FindAtom(segstr) FindAtom16
 70  pascal16 AddAtom(segstr) AddAtom16
@@ -133,7 +133,7 @@
 130 pascal FileCDR(ptr) FileCDR
 131 pascal GetDOSEnvironment() GetDOSEnvironment
 132 pascal GetWinFlags() GetWinFlags
-133 pascal16 GetExePtr(word) GetExePtr
+133 register GetExePtr(word) WIN16_GetExePtr
 134 pascal16 GetWindowsDirectory(ptr word) GetWindowsDirectory16
 135 pascal16 GetSystemDirectory(ptr word) GetSystemDirectory16
 136 pascal16 GetDriveType(word) GetDriveType16
@@ -322,7 +322,7 @@
 480 stub KERNEL_480
 481 stub KERNEL_481
 482 pascal LoadLibrary32(str) LoadLibrary32A
-485 stub KERNEL_485
+485 pascal GetProcessDWORD(long s_word) GetProcessDword
 486 stub KERNEL_486
 491 stub RegisterServiceProcess
 500 stub KERNEL_500
diff --git a/if1632/mmsystem.spec b/if1632/mmsystem.spec
index 5bd0b24..4b118bf 100644
--- a/if1632/mmsystem.spec
+++ b/if1632/mmsystem.spec
@@ -7,7 +7,7 @@
 5      pascal  mmsystemGetVersion() mmsystemGetVersion16
 6      pascal  DriverProc(long word word long long) DriverProc
 8      stub    WMMMIDIRUNONCE
-30     pascal16 OutputDebugStr(ptr) OutputDebugString16
+30     pascal16 OutputDebugStr(str) OutputDebugString16
 31     pascal  DriverCallback(long word word word long long long) DriverCallback
 32     stub    STACKENTER
 33     stub    STACKLEAVE
diff --git a/if1632/relay.c b/if1632/relay.c
index c6f02f4..cc904e3 100644
--- a/if1632/relay.c
+++ b/if1632/relay.c
@@ -55,6 +55,9 @@
 }
 
 
+    /* from relay32/relay386.c */
+    extern debug_relay_includelist;
+    extern debug_relay_excludelist;
 
 /***********************************************************************
  *           RELAY_DebugCallFrom16
@@ -65,14 +68,18 @@
     STACK16FRAME *frame;
     WORD ordinal;
     char *args16;
+    const char *funstr;
     int i;
+    /* from relay32/relay386.c */
+    extern int RELAY_ShowDebugmsgRelay(const char *);
 
     if (!TRACE_ON(relay)) return;
 
     frame = CURRENT_STACK16;
-    DPRINTF( "Call %s(", BUILTIN_GetEntryPoint16( frame->entry_cs,
-                                                  frame->entry_ip,
-                                                  &ordinal ));
+    funstr = BUILTIN_GetEntryPoint16(frame->entry_cs,frame->entry_ip,&ordinal);
+    if (!funstr) return; /* happens for the two snoop register relays */
+    if (!RELAY_ShowDebugmsgRelay(funstr)) return;
+    DPRINTF( "Call %s(",funstr);
     VA_START16( args16 );
 
     if (func_type & 4)  /* cdecl */
@@ -184,12 +191,16 @@
 {
     STACK16FRAME *frame;
     WORD ordinal;
+    const char *funstr;
+    /* from relay32/relay386.c */
+    extern int RELAY_ShowDebugmsgRelay(const char *);
 
     if (!TRACE_ON(relay)) return;
     frame = CURRENT_STACK16;
-    DPRINTF( "Ret  %s() ", BUILTIN_GetEntryPoint16( frame->entry_cs,
-                                                   frame->entry_ip,
-                                                   &ordinal ));
+    funstr = BUILTIN_GetEntryPoint16(frame->entry_cs,frame->entry_ip,&ordinal);
+    if (!funstr) return;
+    if (!RELAY_ShowDebugmsgRelay(funstr)) return;
+    DPRINTF( "Ret  %s() ",funstr);
     switch(func_type)
     {
     case 0: /* long */
@@ -475,10 +486,10 @@
 
 
 /**********************************************************************
-*           CallProcEx32W()   (KERNEL.518)        
+*           CallProcEx32W()   (KERNEL.518)
 *
 *      C - style linkage to CallProc32W - caller pops stack.
-*/ 
+*/
 DWORD WINAPI WIN16_CallProcEx32W()
 {
 	return RELAY_CallProc32W(TRUE);
diff --git a/if1632/snoop.c b/if1632/snoop.c
new file mode 100644
index 0000000..e224662
--- /dev/null
+++ b/if1632/snoop.c
@@ -0,0 +1,316 @@
+/*
+ * 386-specific Win16 dll<->dll snooping functions
+ *
+ * Copyright 1998 Marcus Meissner
+ */
+
+#ifdef __i386__
+
+#include <assert.h>
+#include "windows.h"
+#include "winbase.h"
+#include "winnt.h"
+#include "heap.h"
+#include "global.h"
+#include "selectors.h"
+#include "stackframe.h"
+#include "snoop.h"
+#include "debugstr.h"
+#include "debug.h"
+
+#pragma pack(1)
+
+void WINAPI SNOOP16_Entry(CONTEXT *context);
+void WINAPI SNOOP16_Return(CONTEXT *context);
+extern void CallFrom16_p_regs_();
+
+/* Generic callfrom16_p_regs function entry.
+ *      pushw %bp			0x55
+ *      pushl $DOS3Call			DWORD fun32
+ *      .byte 0x9a			0x9a
+ *      .long CallFrom16_p_regs_	DWORD addr
+ *      .long 0x90900023		WORD seg;nop;nop
+ */
+
+typedef	struct tagSNOOP16_FUN {
+	/* code part */
+	BYTE		lcall;		/* 0x9a call absolute with segment */
+	DWORD		snr;
+	/* unreached */
+	int		nrofargs;
+	FARPROC16	origfun;
+	char		*name;
+} SNOOP16_FUN;
+
+typedef struct tagSNOOP16_DLL {
+	HMODULE16	hmod;
+	HANDLE16	funhandle;
+	SNOOP16_FUN	*funs;
+	LPCSTR		name;
+	struct tagSNOOP16_DLL	*next;
+} SNOOP16_DLL;
+
+typedef struct tagSNOOP16_RETURNENTRY {
+	/* code part */
+	BYTE		lcall;		/* 0x9a call absolute with segment */
+	DWORD		snr;
+	/* unreached */
+	FARPROC16	origreturn;
+	SNOOP16_DLL	*dll;
+	DWORD		ordinal;
+	WORD		origSP;
+	WORD		*args;		/* saved args across a stdcall */
+} SNOOP16_RETURNENTRY;
+
+typedef struct tagSNOOP16_RETURNENTRIES {
+	SNOOP16_RETURNENTRY entry[65500/sizeof(SNOOP16_RETURNENTRY)];
+	HANDLE16	rethandle;
+	struct tagSNOOP16_RETURNENTRIES	*next;
+} SNOOP16_RETURNENTRIES;
+
+typedef struct tagSNOOP16_RELAY {
+	/* code part */
+	BYTE		prefix;		/* 0x66 , 32bit prefix */
+	BYTE		pushbp;		/* 0x55 */
+	BYTE		pushl;		/* 0x68 */
+	DWORD		realfun;	/* SNOOP16_Return */
+	BYTE		lcall;		/* 0x9a call absolute with segment */
+	DWORD		callfromregs;
+	WORD		seg;
+	/* unreached */
+} SNOOP16_RELAY;
+
+#pragma pack(4)
+
+static	SNOOP16_DLL		*firstdll = NULL;
+static	SNOOP16_RETURNENTRIES 	*firstrets = NULL;
+static	SNOOP16_RELAY		*snr;
+static	HANDLE16		xsnr = 0;
+
+void
+SNOOP16_RegisterDLL(NE_MODULE *pModule,LPCSTR name) {
+	SNOOP16_DLL	**dll = &(firstdll);
+	char		*s;
+
+	if (!TRACE_ON(snoop)) return;
+	if (!snr) {
+		xsnr=GLOBAL_Alloc(GMEM_ZEROINIT,2*sizeof(*snr),0,TRUE,TRUE,FALSE);
+		snr = GlobalLock16(xsnr);
+		snr[0].prefix	= 0x66;
+		snr[0].pushbp	= 0x55;
+		snr[0].pushl	= 0x68;
+		snr[0].realfun	= (DWORD)SNOOP16_Entry;
+		snr[0].lcall 	= 0x9a;
+		snr[0].callfromregs = (DWORD)CallFrom16_p_regs_;
+		GET_CS(snr[0].seg);
+		snr[1].prefix	= 0x66;
+		snr[1].pushbp	= 0x55;
+		snr[1].pushl	= 0x68;
+		snr[1].realfun	= (DWORD)SNOOP16_Return;
+		snr[1].lcall 	= 0x9a;
+		snr[1].callfromregs = (DWORD)CallFrom16_p_regs_;
+		GET_CS(snr[1].seg);
+	}
+	while (*dll) {
+		if ((*dll)->hmod == pModule->self)
+			return; /* already registered */
+		dll = &((*dll)->next);
+	}
+	*dll = (SNOOP16_DLL*)HeapAlloc(SystemHeap,HEAP_ZERO_MEMORY,sizeof(SNOOP16_DLL));
+	(*dll)->next	= NULL;
+	(*dll)->hmod	= pModule->self;
+	if ((s=strrchr(name,'\\')))
+		name = s+1;
+	(*dll)->name	= HEAP_strdupA(SystemHeap,0,name);
+	if ((s=strrchr((*dll)->name,'.')))
+		*s='\0';
+	(*dll)->funhandle = GlobalHandleToSel(GLOBAL_Alloc(GMEM_ZEROINIT,65535,0,TRUE,FALSE,FALSE));
+	(*dll)->funs = GlobalLock16((*dll)->funhandle);
+	if (!(*dll)->funs) {
+		HeapFree(SystemHeap,0,*dll);
+		FIXME(snoop,"out of memory\n");
+		return;
+	}
+	memset((*dll)->funs,0,65535);
+}
+
+FARPROC16
+SNOOP16_GetProcAddress16(HMODULE16 hmod,DWORD ordinal,FARPROC16 origfun) {
+	SNOOP16_DLL			*dll = firstdll;
+	SNOOP16_FUN			*fun;
+	NE_MODULE			*pModule = NE_GetPtr(hmod);
+	unsigned char			*cpnt;
+	char				name[200];
+
+	if (!TRACE_ON(snoop) || !pModule || !HIWORD(origfun))
+		return origfun;
+	if (!*(LPBYTE)PTR_SEG_TO_LIN(origfun)) /* 0x00 is an imposs. opcode, poss. dataref. */
+		return origfun;
+	while (dll) {
+		if (hmod == dll->hmod)
+			break;
+		dll=dll->next;
+	}
+	if (!dll)	/* probably internal */
+		return origfun;
+	if (ordinal>65535/sizeof(SNOOP16_FUN))
+		return origfun;
+	fun = dll->funs+ordinal;
+	/* already done? */
+	fun->lcall 	= 0x9a;
+	fun->snr	= MAKELONG(0,xsnr);
+	fun->origfun	= origfun;
+	if (fun->name)
+		return (FARPROC16)(SEGPTR)MAKELONG(((char*)fun-(char*)dll->funs),dll->funhandle);
+	cpnt = (unsigned char *)pModule + pModule->name_table;
+	while (*cpnt) {
+		cpnt += *cpnt + 1 + sizeof(WORD);
+		if (*(WORD*)(cpnt+*cpnt+1) == ordinal) {
+			sprintf(name,"%.*s",*cpnt,cpnt+1);
+			break;
+		}
+	}
+	/* Now search the non-resident names table */
+
+	if (!*cpnt && pModule->nrname_handle) {
+		cpnt = (char *)GlobalLock16( pModule->nrname_handle );
+		while (*cpnt) {
+			cpnt += *cpnt + 1 + sizeof(WORD);
+			if (*(WORD*)(cpnt+*cpnt+1) == ordinal) {
+				    sprintf(name,"%.*s",*cpnt,cpnt+1);
+				    break;
+			}
+		}
+	}
+	if (*cpnt)
+		fun->name = HEAP_strdupA(SystemHeap,0,name);
+	else
+		fun->name = HEAP_strdupA(SystemHeap,0,"");
+	fun->lcall 	= 0x9a;
+	fun->snr	= MAKELONG(0,xsnr);
+	fun->origfun	= origfun;
+	fun->nrofargs	= -1;
+	return (FARPROC16)(SEGPTR)MAKELONG(((char*)fun-(char*)dll->funs),dll->funhandle);
+}
+
+#define CALLER1REF (*(DWORD*)(PTR_SEG_OFF_TO_LIN(SS_reg(context),SP_reg(context)+4)))
+void WINAPI SNOOP16_Entry(CONTEXT *context) {
+	DWORD		ordinal=0;
+	DWORD		entry=(DWORD)PTR_SEG_OFF_TO_LIN(CS_reg(context),IP_reg(context))-5;
+	WORD		xcs = CS_reg(context);
+	SNOOP16_DLL	*dll = firstdll;
+	SNOOP16_FUN	*fun = NULL;
+	SNOOP16_RETURNENTRIES	**rets = &firstrets;
+	SNOOP16_RETURNENTRY	*ret;
+	int		i,max;
+
+	while (dll) {
+		if (xcs == dll->funhandle) {
+			fun = (SNOOP16_FUN*)entry;
+			ordinal = fun-dll->funs;
+			break;
+		}
+		dll=dll->next;
+	}
+	if (!dll) {
+		FIXME(snoop,"entrypoint 0x%08lx not found\n",entry);
+		return; /* oops */
+	}
+	/* guess cdecl ... */
+	if (fun->nrofargs<0) {
+		/* Typical cdecl return frame is:
+		 * 	add esp, xxxxxxxx 
+		 * which has (for xxxxxxxx up to 255 the opcode "83 C4 xx".
+		 */
+		LPBYTE	reteip = (LPBYTE)PTR_SEG_TO_LIN(CALLER1REF);
+
+		if ((reteip[0]==0x83)&&(reteip[1]==0xc4))
+			fun->nrofargs=reteip[2]/2;
+	}
+
+	while (*rets) {
+		for (i=0;i<sizeof((*rets)->entry)/sizeof((*rets)->entry[0]);i++)
+			if (!(*rets)->entry[i].origreturn)
+				break;
+		if (i!=sizeof((*rets)->entry)/sizeof((*rets)->entry[0]))
+			break;
+		rets = &((*rets)->next);
+	}
+	if (!*rets) {
+		HANDLE16	hand = GlobalHandleToSel(GLOBAL_Alloc(GMEM_ZEROINIT,65535,0,TRUE,FALSE,FALSE));
+		*rets = GlobalLock16(hand);
+		memset(*rets,0,65535);
+		(*rets)->rethandle = hand;
+		i = 0;	/* entry 0 is free */
+	}
+	ret = &((*rets)->entry[i]);
+	ret->lcall 	= 0x9a;
+	ret->snr	= MAKELONG(sizeof(SNOOP16_RELAY),xsnr);
+	ret->origreturn	= (FARPROC16)CALLER1REF;
+	CALLER1REF	= MAKELONG((char*)&(ret->lcall)-(char*)((*rets)->entry),(*rets)->rethandle);
+	ret->dll	= dll;
+	ret->args	= NULL;
+	ret->ordinal	= ordinal;
+	ret->origSP	= SP_reg(context);
+
+	IP_reg(context)= LOWORD(fun->origfun);
+	CS_reg(context)= HIWORD(fun->origfun);
+
+	DPRINTF("Call %s.%ld: %s(",dll->name,ordinal,fun->name);
+	if (fun->nrofargs>0) {
+		max = fun->nrofargs; if (max>16) max=16;
+		for (i=max;i--;)
+			DPRINTF("%04x%s",*(WORD*)(PTR_SEG_OFF_TO_LIN(SS_reg(context),SP_reg(context))+8+sizeof(WORD)*i),i?",":"");
+		if (max!=fun->nrofargs)
+			DPRINTF(" ...");
+	} else if (fun->nrofargs<0) {
+		DPRINTF("<unknown, check return>");
+		ret->args = HeapAlloc(SystemHeap,0,16*sizeof(WORD));
+		memcpy(ret->args,(LPBYTE)(PTR_SEG_OFF_TO_LIN(SS_reg(context),SP_reg(context))+8),sizeof(WORD)*16);
+	}
+	DPRINTF(") ret=%04x:%04x\n",HIWORD((DWORD)(*rets)->entry[i].origreturn),LOWORD((DWORD)(*rets)->entry[i].origreturn));
+}
+
+void WINAPI SNOOP16_Return(CONTEXT *context) {
+	SNOOP16_RETURNENTRY	*ret = (SNOOP16_RETURNENTRY*)(PTR_SEG_OFF_TO_LIN(CS_reg(context),IP_reg(context))-5);
+
+	/* We haven't found out the nrofargs yet. If we called a cdecl
+	 * function it is too late anyway and we can just set '0' (which 
+	 * will be the difference between orig and current SP
+	 * If pascal -> everything ok.
+	 */
+	if (ret->dll->funs[ret->ordinal].nrofargs<0)
+		ret->dll->funs[ret->ordinal].nrofargs=(SP_reg(context)-ret->origSP-4)/2;
+	IP_reg(context) = LOWORD(ret->origreturn);
+	CS_reg(context) = HIWORD(ret->origreturn);
+	if (ret->args) {
+		int	i,max;
+
+		DPRINTF("Ret  %s.%ld: %s(",ret->dll->name,ret->ordinal,ret->dll->funs[ret->ordinal].name);
+		max = ret->dll->funs[ret->ordinal].nrofargs;
+		if (max>16) max=16;
+
+		for (i=max;i--;)
+			DPRINTF("%04x%s",ret->args[i],i?",":"");
+		DPRINTF(") retval = %04x:%04x ret=%04x:%04x\n",
+			DX_reg(context),AX_reg(context),HIWORD(ret->origreturn),LOWORD(ret->origreturn)
+		);
+		HeapFree(SystemHeap,0,ret->args);
+		ret->args = NULL;
+	} else
+		DPRINTF("Ret  %s.%ld: %s() retval = %04x:%04x ret=%04x:%04x\n",
+			ret->dll->name,ret->ordinal,ret->dll->funs[ret->ordinal].name,
+			DX_reg(context),AX_reg(context),HIWORD(ret->origreturn),LOWORD(ret->origreturn)
+		);
+	ret->origreturn = NULL; /* mark as empty */
+}
+#else	/* !__i386__ */
+void SNOOP16_RegisterDLL(NE_MODULE *pModule,LPCSTR name) {
+	FIXME(snoop,"snooping works only on i386 for now.\n");
+	return;
+}
+
+FARPROC16 SNOOP16_GetProcAddress16(HMODULE16 hmod,DWORD ordinal,FARPROC16 origfun) {
+	return origfun;
+}
+#endif	/* !__i386__ */
diff --git a/if1632/thunk.c b/if1632/thunk.c
index fec3b9e..01794ab 100644
--- a/if1632/thunk.c
+++ b/if1632/thunk.c
@@ -152,6 +152,7 @@
     (void *)CallTo16_word_ww,              /* CallBootAppProc */
     (void *)CallTo16_word_www,             /* CallLoadAppSegProc */
     (void *)CallTo16_word_,                /* CallSystemTimerProc */
+    (void *)CallTo16_word_www,             /* CallResourceHandlerProc */
     (void *)CallTo16_long_l,               /* CallWOWCallbackProc */
     THUNK_WOWCallback16Ex,                 /* CallWOWCallback16Ex */
     (void *)CallTo16_long_l,               /* CallASPIPostProc */
@@ -566,55 +567,6 @@
 
 
 /***********************************************************************
- *           THUNK_SetResourceHandler	(KERNEL.67)
- */
-FARPROC16 WINAPI THUNK_SetResourceHandler( HMODULE16 hModule, SEGPTR typeId, FARPROC16 proc )
-{
-    static FARPROC16 defDIBIconLoader16 = NULL;
-    static FARPROC16 defDIBCursorLoader16 = NULL;
-    static FARPROC16 defResourceLoader16 = NULL;
-
-    THUNK *thunk = NULL;
-
-    if( !defResourceLoader16 )
-    {
-	HMODULE16 hUser = GetModuleHandle16("USER");
-	defDIBIconLoader16 = NE_GetEntryPoint( hUser, 357 );
-	defDIBCursorLoader16 = NE_GetEntryPoint( hUser, 356 );
-	defResourceLoader16 = MODULE_GetWndProcEntry16( "DefResourceHandler" );
-    }
-
-    if( proc == defResourceLoader16 )
-	thunk = (THUNK*)&NE_DefResourceHandler;
-    else if( proc == defDIBIconLoader16 )
-	thunk = (THUNK*)&LoadDIBIconHandler;
-    else if( proc == defDIBCursorLoader16 )
-	thunk = (THUNK*)&LoadDIBCursorHandler;
-    else
-    {
-	thunk = THUNK_Alloc( proc, (RELAY)CallTo16_word_www );
-	if( !thunk ) return FALSE;
-    }
-
-    thunk = (THUNK*)SetResourceHandler( hModule, typeId, (FARPROC16)thunk );
-
-    if( thunk == (THUNK*)&NE_DefResourceHandler )
-	return defResourceLoader16;
-    if( thunk == (THUNK*)&LoadDIBIconHandler )
-	return defDIBIconLoader16;
-    if( thunk == (THUNK*)&LoadDIBCursorHandler )
-	return defDIBCursorLoader16;
-
-    if( thunk )
-    {
-	proc = thunk->proc;
-	THUNK_Free( thunk );
-	return proc;
-    }
-    return NULL;
-}
-
-/***********************************************************************
  *           THUNK_WOWCallback16Ex	(WOW32.3)(KERNEL32.55)
  * Generic thunking routine to call 16 bit functions from 32bit code.
  * 
diff --git a/if1632/user.spec b/if1632/user.spec
index 83e7603..299977b 100644
--- a/if1632/user.spec
+++ b/if1632/user.spec
@@ -48,7 +48,7 @@
 44  pascal16 OpenIcon(word) OpenIcon16
 45  pascal16 BringWindowToTop(word) BringWindowToTop16
 46  pascal16 GetParent(word) GetParent16
-47  pascal16 IsWindow(word) IsWindow16
+47  register IsWindow(word) WIN16_IsWindow16
 48  pascal16 IsChild(word word) IsChild16
 49  pascal16 IsWindowVisible(word) IsWindowVisible16
 50  pascal16 FindWindow(segstr str) FindWindow16
diff --git a/if1632/wineps.spec b/if1632/wineps.spec
new file mode 100644
index 0000000..a02aca2
--- /dev/null
+++ b/if1632/wineps.spec
@@ -0,0 +1,7 @@
+name    wineps
+type    win16
+
+13 pascal16 DeviceMode(word word str str) PSDRV_DeviceMode16
+90 pascal16 ExtDeviceMode(word word ptr str str ptr str word) PSDRV_ExtDeviceMode16
+91 pascal DeviceCapabilities(str str word ptr ptr) PSDRV_DeviceCapabilities16
+
diff --git a/if1632/wprocs.spec b/if1632/wprocs.spec
index 7993aea..965b6bb 100644
--- a/if1632/wprocs.spec
+++ b/if1632/wprocs.spec
@@ -14,6 +14,8 @@
 29 pascal DefResourceHandler(word word word) NE_DefResourceHandler
 30 pascal FormatCharDlgProc(word word word long) FormatCharDlgProc16
 31 pascal16 ASPI_DOS_func(long) ASPI_DOS_func
+32 pascal LoadDIBIconHandler(word word word) LoadDIBIconHandler
+33 pascal LoadDIBCursorHandler(word word word) LoadDIBCursorHandler
  
 # Interrupt vectors 0-255 are ordinals 100-355
 # The 'word' parameter are the flags pushed on the stack by the interrupt
diff --git a/include/bitmap.h b/include/bitmap.h
index 042c4a7..a9e8c33 100644
--- a/include/bitmap.h
+++ b/include/bitmap.h
@@ -34,6 +34,8 @@
     DIBSECTION *dibSection;
     RGBQUAD    *colorMap;
     int         nColorMap;
+    /* DIBSECTION mapping status */
+    enum { DIB_NoHandler, DIB_InSync, DIB_AppMod, DIB_GdiMod } status;
 
 } BITMAPOBJ;
 
@@ -51,7 +53,7 @@
 { \
     int width_bytes = DIB_GetXImageWidthBytes( (width), (bpp) ); \
     (image) = TSXCreateImage(display, DefaultVisualOfScreen(screen), \
-                           (bpp), ZPixmap, 0, xmalloc( (height)*width_bytes ),\
+                           (bpp), ZPixmap, 0, xcalloc( (height)*width_bytes ),\
                            (width), (height), 32, width_bytes ); \
 }
 
diff --git a/include/callback.h b/include/callback.h
index a8668a3..e03d86a 100644
--- a/include/callback.h
+++ b/include/callback.h
@@ -37,6 +37,7 @@
     VOID (CALLBACK *CallBootAppProc)( FARPROC16, HANDLE16, HFILE16 );
     WORD (CALLBACK *CallLoadAppSegProc)( FARPROC16, HANDLE16, HFILE16, WORD );
     VOID (CALLBACK *CallSystemTimerProc)( FARPROC16 );
+    HGLOBAL16 (CALLBACK *CallResourceHandlerProc)( FARPROC16, HGLOBAL16, HMODULE16, HRSRC16 );
     DWORD (CALLBACK *CallWOWCallbackProc)( FARPROC16, DWORD );
     BOOL32 (CALLBACK *CallWOWCallback16Ex)( FARPROC16, DWORD, DWORD, LPVOID, 
                                             LPDWORD );
diff --git a/include/commctrl.h b/include/commctrl.h
index ba94bfa..523cca2 100644
--- a/include/commctrl.h
+++ b/include/commctrl.h
@@ -85,6 +85,12 @@
 #define LPSTR_TEXTCALLBACK WINELIB_NAME_AW(LPSTR_TEXTCALLBACK)
 
 
+/* owner drawn types */
+#define ODT_HEADER      100
+#define ODT_TAB         101
+#define ODT_LISTVIEW    102
+
+
 /* StatusWindow */
 
 #define STATUSCLASSNAME16     "msctls_statusbar"
@@ -506,46 +512,47 @@
 
 /* Toolbar */
 
-#define TOOLBARCLASSNAME16        "ToolbarWindow"
-#define TOOLBARCLASSNAME32W       L"ToolbarWindow32"
-#define TOOLBARCLASSNAME32A       "ToolbarWindow32"
+#define TOOLBARCLASSNAME16        "ToolbarWindow" 
+#define TOOLBARCLASSNAME32W       L"ToolbarWindow32" 
+#define TOOLBARCLASSNAME32A       "ToolbarWindow32" 
 #define TOOLBARCLASSNAME WINELIB_NAME_AW(TOOLBARCLASSNAME)
 
-
-#define CMB_MASKED              0x02
-
-#define TBSTATE_CHECKED         0x01
-#define TBSTATE_PRESSED         0x02
-#define TBSTATE_ENABLED         0x04
-#define TBSTATE_HIDDEN          0x08
-#define TBSTATE_INDETERMINATE   0x10
-#define TBSTATE_WRAP            0x20
-#define TBSTATE_ELLIPSES        0x40
-#define TBSTATE_MARKED          0x80
-
-#define TBSTYLE_BUTTON          0x00
-#define TBSTYLE_SEP             0x01
-#define TBSTYLE_CHECK           0x02
-#define TBSTYLE_GROUP           0x04
-#define TBSTYLE_CHECKGROUP      (TBSTYLE_GROUP | TBSTYLE_CHECK)
-#define TBSTYLE_DROPDOWN        0x08
  
-#define TBSTYLE_TOOLTIPS        0x0100
-#define TBSTYLE_WRAPABLE        0x0200
-#define TBSTYLE_ALTDRAG         0x0400
-#define TBSTYLE_FLAT            0x0800
-#define TBSTYLE_LIST            0x1000
-#define TBSTYLE_CUSTOMERASE     0x2000
-
+#define CMB_MASKED              0x02 
+ 
+#define TBSTATE_CHECKED         0x01 
+#define TBSTATE_PRESSED         0x02 
+#define TBSTATE_ENABLED         0x04 
+#define TBSTATE_HIDDEN          0x08 
+#define TBSTATE_INDETERMINATE   0x10 
+#define TBSTATE_WRAP            0x20 
+#define TBSTATE_ELLIPSES        0x40
+#define TBSTATE_MARKED          0x80 
+ 
+ 
+#define TBSTYLE_BUTTON          0x00 
+#define TBSTYLE_SEP             0x01 
+#define TBSTYLE_CHECK           0x02 
+#define TBSTYLE_GROUP           0x04 
+#define TBSTYLE_CHECKGROUP      (TBSTYLE_GROUP | TBSTYLE_CHECK) 
+#define TBSTYLE_DROPDOWN        0x08 
+ 
+#define TBSTYLE_TOOLTIPS        0x0100 
+#define TBSTYLE_WRAPABLE        0x0200 
+#define TBSTYLE_ALTDRAG         0x0400 
+#define TBSTYLE_FLAT            0x0800 
+#define TBSTYLE_LIST            0x1000 
+#define TBSTYLE_CUSTOMERASE     0x2000 
+ 
 #define TB_ENABLEBUTTON          (WM_USER+1)
 #define TB_CHECKBUTTON           (WM_USER+2)
 #define TB_PRESSBUTTON           (WM_USER+3)
 #define TB_HIDEBUTTON            (WM_USER+4)
 #define TB_INDETERMINATE         (WM_USER+5)
-#define TB_ISBUTTONENABLED       (WM_USER+9)
-#define TB_ISBUTTONCHECKED       (WM_USER+10)
-#define TB_ISBUTTONPRESSED       (WM_USER+11)
-#define TB_ISBUTTONHIDDEN        (WM_USER+12)
+#define TB_ISBUTTONENABLED       (WM_USER+9) 
+#define TB_ISBUTTONCHECKED       (WM_USER+10) 
+#define TB_ISBUTTONPRESSED       (WM_USER+11) 
+#define TB_ISBUTTONHIDDEN        (WM_USER+12) 
 #define TB_ISBUTTONINDETERMINATE (WM_USER+13)
 #define TB_ISBUTTONHIGHLIGHTED   (WM_USER+14)
 #define TB_SETSTATE              (WM_USER+17)
@@ -566,8 +573,8 @@
 #define TB_SAVERESTORE32W        (WM_USER+76)
 #define TB_SAVERESTORE WINELIB_NAME_AW(TB_SAVERESTORE)
 #define TB_CUSTOMIZE             (WM_USER+27)
-#define TB_ADDSTRING32A          (WM_USER+28)
-#define TB_ADDSTRING32W          (WM_USER+77)
+#define TB_ADDSTRING32A          (WM_USER+28) 
+#define TB_ADDSTRING32W          (WM_USER+77) 
 #define TB_ADDSTRING WINELIB_NAME_AW(TB_ADDSTRING)
 #define TB_GETITEMRECT           (WM_USER+29)
 #define TB_BUTTONSTRUCTSIZE      (WM_USER+30)
@@ -602,10 +609,32 @@
 #define TB_SETBUTTONWIDTH        (WM_USER+59)
 #define TB_SETMAXTEXTROWS        (WM_USER+60)
 #define TB_GETTEXTROWS           (WM_USER+61)
-
+#define TB_GETOBJECT             (WM_USER+62)
+#define TB_SETDRAWTEXTFLAGS      (WM_USER+70)
+#define TB_GETHOTITEM            (WM_USER+71)
+#define TB_SETHOTITEM            (WM_USER+72)
+#define TB_SETANCHORHIGHLIGHT    (WM_USER+73)
+#define TB_GETANCHORHIGHLIGHT    (WM_USER+74)
 #define TB_MAPACCELERATOR32A     (WM_USER+78)
 #define TB_MAPACCELERATOR32W     (WM_USER+90)
 #define TB_MAPACCELERATOR WINELIB_NAME_AW(TB_MAPACCELERATOR)
+#define TB_GETINSERTMARK         (WM_USER+79)
+#define TB_SETINSERTMARK         (WM_USER+80)
+#define TB_INSERTMARKHITTEST     (WM_USER+81)
+#define TB_MOVEBUTTON            (WM_USER+82)
+#define TB_GETMAXSIZE            (WM_USER+83)
+#define TB_SETEXTENDEDSTYLE      (WM_USER+84)
+#define TB_GETEXTENDEDSTYLE      (WM_USER+85)
+#define TB_GETPADDING            (WM_USER+86)
+#define TB_SETPADDING            (WM_USER+87)
+#define TB_SETINSERTMARKCOLOR    (WM_USER+88)
+#define TB_GETINSERTMARKCOLOR    (WM_USER+89)
+
+#define TB_SETCOLORSCHEME        CCM_SETCOLORSCHEME
+#define TB_GETCOLORSCHEME        CCM_GETCOLORSCHEME
+
+#define TB_SETUNICODEFORMAT      CCM_SETUNICODEFORMAT
+#define TB_GETUNICODEFORMAT      CCM_GETUNICODEFORMAT
 
 
 /* This is just for old CreateToolbar. */
@@ -646,12 +675,33 @@
 #define HINST_COMMCTRL         ((HINSTANCE32)-1)
 
 
-HWND32 WINAPI CreateToolbar(HWND32, DWORD, UINT32, INT32, HINSTANCE32,
-                            UINT32, LPCOLDTBBUTTON, INT32);
-HWND32 WINAPI CreateToolbarEx(HWND32, DWORD, UINT32, INT32, HINSTANCE32,
-                              UINT32, LPCTBBUTTON, INT32, INT32, INT32,
-                              INT32, INT32, UINT32);
-HBITMAP32 WINAPI CreateMappedBitmap (HINSTANCE32, INT32, UINT32,
-                                     LPCOLORMAP, INT32);
+typedef struct tagTBSAVEPARAMSA {
+    HKEY   hkr;
+    LPCSTR pszSubKey;
+    LPCSTR pszValueName;
+} TBSAVEPARAMS32A, *LPTBSAVEPARAMS32A;
+
+typedef struct tagTBSAVEPARAMSW {
+    HKEY   hkr;
+    LPCWSTR pszSubKey;
+    LPCWSTR pszValueName;
+} TBSAVEPARAMSA32W, *LPTBSAVEPARAMSA32W;
+
+#define TBSAVEPARAMS   WINELIB_NAMEAW(TBSAVEPARAMS)
+#define LPTBSAVEPARAMS WINELIB_NAMEAW(LPTBSAVEPARAMS)
+
+
+HWND32 WINAPI
+CreateToolbar(HWND32, DWORD, UINT32, INT32, HINSTANCE32,
+              UINT32, LPCOLDTBBUTTON, INT32); 
+ 
+HWND32 WINAPI
+CreateToolbarEx(HWND32, DWORD, UINT32, INT32,
+                HINSTANCE32, UINT32, LPCTBBUTTON, 
+                INT32, INT32, INT32, INT32, INT32, UINT32); 
+
+HBITMAP32 WINAPI
+CreateMappedBitmap (HINSTANCE32, INT32, UINT32, LPCOLORMAP, INT32); 
+
 
 #endif  /* __WINE_COMMCTRL_H */
diff --git a/include/config.h.in b/include/config.h.in
index e57a78e..21e18e1 100644
--- a/include/config.h.in
+++ b/include/config.h.in
@@ -87,6 +87,9 @@
 /* Define if you have the usleep function.  */
 #undef HAVE_USLEEP
 
+/* Define if you have the vfscanf function.  */
+#undef HAVE_VFSCANF
+
 /* Define if you have the wait4 function.  */
 #undef HAVE_WAIT4
 
diff --git a/include/debug.h b/include/debug.h
index ff4b508..ad65c53 100644
--- a/include/debug.h
+++ b/include/debug.h
@@ -34,94 +34,96 @@
 #define dbch_dll 26
 #define dbch_dosfs 27
 #define dbch_dosmem 28
-#define dbch_driver 29
-#define dbch_dsound 30
-#define dbch_edit 31
-#define dbch_event 32
-#define dbch_exec 33
-#define dbch_file 34
-#define dbch_fixup 35
-#define dbch_font 36
-#define dbch_gdi 37
-#define dbch_global 38
-#define dbch_graphics 39
-#define dbch_header 40
-#define dbch_heap 41
-#define dbch_hook 42
-#define dbch_icon 43
-#define dbch_imagelist 44
-#define dbch_int 45
-#define dbch_int21 46
-#define dbch_int31 47
-#define dbch_key 48
-#define dbch_keyboard 49
-#define dbch_ldt 50
-#define dbch_listbox 51
-#define dbch_local 52
-#define dbch_mci 53
-#define dbch_mcianim 54
-#define dbch_mciwave 55
-#define dbch_mdi 56
-#define dbch_menu 57
-#define dbch_message 58
-#define dbch_metafile 59
-#define dbch_midi 60
-#define dbch_mmaux 61
-#define dbch_mmio 62
-#define dbch_mmsys 63
-#define dbch_mmtime 64
-#define dbch_module 65
-#define dbch_mpr 66
-#define dbch_msg 67
-#define dbch_nonclient 68
-#define dbch_ntdll 69
-#define dbch_ole 70
-#define dbch_palette 71
-#define dbch_print 72
-#define dbch_process 73
-#define dbch_profile 74
-#define dbch_progress 75
-#define dbch_prop 76
-#define dbch_reg 77
-#define dbch_region 78
-#define dbch_relay 79
-#define dbch_resource 80
-#define dbch_scroll 81
-#define dbch_security 82
-#define dbch_segment 83
-#define dbch_selector 84
-#define dbch_sem 85
-#define dbch_sendmsg 86
-#define dbch_shell 87
-#define dbch_shm 88
-#define dbch_snoop 89
-#define dbch_sound 90
-#define dbch_static 91
-#define dbch_stress 92
-#define dbch_string 93
-#define dbch_syscolor 94
-#define dbch_system 95
-#define dbch_task 96
-#define dbch_text 97
-#define dbch_thread 98
-#define dbch_thunk 99
-#define dbch_timer 100
-#define dbch_toolbar 101
-#define dbch_toolhelp 102
-#define dbch_tweak 103
-#define dbch_uitools 104
-#define dbch_updown 105
-#define dbch_ver 106
-#define dbch_virtual 107
-#define dbch_vxd 108
-#define dbch_win 109
-#define dbch_win16drv 110
-#define dbch_win32 111
-#define dbch_wing 112
-#define dbch_winsock 113
-#define dbch_wnet 114
-#define dbch_x11 115
-#define dbch_x11drv 116
+#define dbch_dplay 29
+#define dbch_driver 30
+#define dbch_dsound 31
+#define dbch_edit 32
+#define dbch_event 33
+#define dbch_exec 34
+#define dbch_file 35
+#define dbch_fixup 36
+#define dbch_font 37
+#define dbch_gdi 38
+#define dbch_global 39
+#define dbch_graphics 40
+#define dbch_header 41
+#define dbch_heap 42
+#define dbch_hook 43
+#define dbch_icon 44
+#define dbch_imagelist 45
+#define dbch_int 46
+#define dbch_int21 47
+#define dbch_int31 48
+#define dbch_key 49
+#define dbch_keyboard 50
+#define dbch_ldt 51
+#define dbch_listbox 52
+#define dbch_local 53
+#define dbch_mci 54
+#define dbch_mcianim 55
+#define dbch_mciwave 56
+#define dbch_mdi 57
+#define dbch_menu 58
+#define dbch_message 59
+#define dbch_metafile 60
+#define dbch_midi 61
+#define dbch_mmaux 62
+#define dbch_mmio 63
+#define dbch_mmsys 64
+#define dbch_mmtime 65
+#define dbch_module 66
+#define dbch_mpr 67
+#define dbch_msg 68
+#define dbch_nonclient 69
+#define dbch_ntdll 70
+#define dbch_ole 71
+#define dbch_palette 72
+#define dbch_print 73
+#define dbch_process 74
+#define dbch_profile 75
+#define dbch_progress 76
+#define dbch_prop 77
+#define dbch_psdrv 78
+#define dbch_reg 79
+#define dbch_region 80
+#define dbch_relay 81
+#define dbch_resource 82
+#define dbch_scroll 83
+#define dbch_security 84
+#define dbch_segment 85
+#define dbch_selector 86
+#define dbch_sem 87
+#define dbch_sendmsg 88
+#define dbch_shell 89
+#define dbch_shm 90
+#define dbch_snoop 91
+#define dbch_sound 92
+#define dbch_static 93
+#define dbch_stress 94
+#define dbch_string 95
+#define dbch_syscolor 96
+#define dbch_system 97
+#define dbch_task 98
+#define dbch_text 99
+#define dbch_thread 100
+#define dbch_thunk 101
+#define dbch_timer 102
+#define dbch_toolbar 103
+#define dbch_toolhelp 104
+#define dbch_tweak 105
+#define dbch_uitools 106
+#define dbch_updown 107
+#define dbch_ver 108
+#define dbch_virtual 109
+#define dbch_vxd 110
+#define dbch_win 111
+#define dbch_win16drv 112
+#define dbch_win32 113
+#define dbch_wing 114
+#define dbch_winsock 115
+#define dbch_wnet 116
+#define dbch_x11 117
+#define dbch_x11drv 118
 /* Definitions for classes identifiers */
 #define dbcl_fixme 0
 #define dbcl_err 1
diff --git a/include/debugdefs.h b/include/debugdefs.h
index 6aae49f..a8ddd2f 100644
--- a/include/debugdefs.h
+++ b/include/debugdefs.h
@@ -4,7 +4,7 @@
 #include "debugtools.h"
 #endif
 
-#define DEBUG_CHANNEL_COUNT 117
+#define DEBUG_CHANNEL_COUNT 119
 #ifdef DEBUG_RUNTIME
 short debug_msg_enabled[][DEBUG_CLASS_COUNT] = {
 {1, 1, 0, 0},
@@ -124,6 +124,8 @@
 {1, 1, 0, 0},
 {1, 1, 0, 0},
 {1, 1, 0, 0},
+{1, 1, 0, 0},
+{1, 1, 0, 0},
 };
 const char* debug_ch_name[] = {
 "accel",
@@ -155,6 +157,7 @@
 "dll",
 "dosfs",
 "dosmem",
+"dplay",
 "driver",
 "dsound",
 "edit",
@@ -203,6 +206,7 @@
 "profile",
 "progress",
 "prop",
+"psdrv",
 "reg",
 "region",
 "relay",
diff --git a/include/dplay.h b/include/dplay.h
new file mode 100644
index 0000000..f9d649e
--- /dev/null
+++ b/include/dplay.h
@@ -0,0 +1,338 @@
+/* Header for Direct Play and Direct Play Lobby */
+#ifndef __WINE_DPLAY_H
+#define __WINE_DPLAY_H
+
+#include "mmsystem.h"
+
+/* Return Values */
+#define _FACDP  0x877
+#define MAKE_DPHRESULT( code )    MAKE_HRESULT( 1, _FACDP, code )
+
+#define DP_OK                           S_OK
+#define DPERR_ALREADYINITIALIZED        MAKE_DPHRESULT(   5 )
+#define DPERR_ACCESSDENIED              MAKE_DPHRESULT(  10 )
+#define DPERR_ACTIVEPLAYERS             MAKE_DPHRESULT(  20 )
+#define DPERR_BUFFERTOOSMALL            MAKE_DPHRESULT(  30 )
+#define DPERR_CANTADDPLAYER             MAKE_DPHRESULT(  40 )
+#define DPERR_CANTCREATEGROUP           MAKE_DPHRESULT(  50 )
+#define DPERR_CANTCREATEPLAYER          MAKE_DPHRESULT(  60 )
+#define DPERR_CANTCREATESESSION         MAKE_DPHRESULT(  70 )
+#define DPERR_CAPSNOTAVAILABLEYET       MAKE_DPHRESULT(  80 )
+#define DPERR_EXCEPTION                 MAKE_DPHRESULT(  90 )
+#define DPERR_GENERIC                   E_FAIL
+#define DPERR_INVALIDFLAGS              MAKE_DPHRESULT( 120 )
+#define DPERR_INVALIDOBJECT             MAKE_DPHRESULT( 130 )
+#define DPERR_INVALIDPARAM              E_INVALIDARG
+#define DPERR_INVALIDPARAMS             DPERR_INVALIDPARAM
+#define DPERR_INVALIDPLAYER             MAKE_DPHRESULT( 150 )
+#define DPERR_INVALIDGROUP              MAKE_DPHRESULT( 155 )
+#define DPERR_NOCAPS                    MAKE_DPHRESULT( 160 )
+#define DPERR_NOCONNECTION              MAKE_DPHRESULT( 170 )
+#define DPERR_NOMEMORY                  E_OUTOFMEMORY
+#define DPERR_OUTOFMEMORY               DPERR_NOMEMORY
+#define DPERR_NOMESSAGES                MAKE_DPHRESULT( 190 )
+#define DPERR_NONAMESERVERFOUND         MAKE_DPHRESULT( 200 )
+#define DPERR_NOPLAYERS                 MAKE_DPHRESULT( 210 )
+#define DPERR_NOSESSIONS                MAKE_DPHRESULT( 220 )
+#define DPERR_PENDING                                   E_PENDING
+#define DPERR_SENDTOOBIG                                MAKE_DPHRESULT( 230 )
+#define DPERR_TIMEOUT                   MAKE_DPHRESULT( 240 )
+#define DPERR_UNAVAILABLE               MAKE_DPHRESULT( 250 )
+#define DPERR_UNSUPPORTED               E_NOTIMPL
+#define DPERR_BUSY                      MAKE_DPHRESULT( 270 )
+#define DPERR_USERCANCEL                MAKE_DPHRESULT( 280 )
+#define DPERR_NOINTERFACE               E_NOINTERFACE
+#define DPERR_CANNOTCREATESERVER        MAKE_DPHRESULT( 290 )
+#define DPERR_PLAYERLOST                MAKE_DPHRESULT( 300 )
+#define DPERR_SESSIONLOST               MAKE_DPHRESULT( 310 )
+#define DPERR_UNINITIALIZED             MAKE_DPHRESULT( 320 )
+#define DPERR_NONEWPLAYERS              MAKE_DPHRESULT( 330 )
+#define DPERR_INVALIDPASSWORD           MAKE_DPHRESULT( 340 )
+#define DPERR_CONNECTING                MAKE_DPHRESULT( 350 )
+#define DPERR_BUFFERTOOLARGE            MAKE_DPHRESULT( 1000 )
+#define DPERR_CANTCREATEPROCESS         MAKE_DPHRESULT( 1010 )
+#define DPERR_APPNOTSTARTED             MAKE_DPHRESULT( 1020 )
+#define DPERR_INVALIDINTERFACE          MAKE_DPHRESULT( 1030 )
+#define DPERR_NOSERVICEPROVIDER         MAKE_DPHRESULT( 1040 )
+#define DPERR_UNKNOWNAPPLICATION        MAKE_DPHRESULT( 1050 )
+#define DPERR_NOTLOBBIED                MAKE_DPHRESULT( 1070 )
+#define DPERR_SERVICEPROVIDERLOADED     MAKE_DPHRESULT( 1080 )
+#define DPERR_ALREADYREGISTERED         MAKE_DPHRESULT( 1090 )
+#define DPERR_NOTREGISTERED             MAKE_DPHRESULT( 1100 )
+#define DPERR_AUTHENTICATIONFAILED      MAKE_DPHRESULT(  2000 )
+#define DPERR_CANTLOADSSPI              MAKE_DPHRESULT(  2010 )
+#define DPERR_ENCRYPTIONFAILED          MAKE_DPHRESULT(  2020 )
+#define DPERR_SIGNFAILED                MAKE_DPHRESULT(  2030 )
+#define DPERR_CANTLOADSECURITYPACKAGE   MAKE_DPHRESULT(  2040 )
+#define DPERR_ENCRYPTIONNOTSUPPORTED    MAKE_DPHRESULT(  2050 )
+#define DPERR_CANTLOADCAPI              MAKE_DPHRESULT(  2060 )
+#define DPERR_NOTLOGGEDIN               MAKE_DPHRESULT(  2070 )
+#define DPERR_LOGONDENIED               MAKE_DPHRESULT(  2080 )
+
+DEFINE_GUID(IID_IDirectPlay2, 0x2b74f7c0, 0x9154, 0x11cf, 0xa9, 0xcd, 0x0, 0xaa, 0x0, 0x68, 0x86, 0xe3);
+DEFINE_GUID(IID_IDirectPlay2A,0x9d460580, 0xa822, 0x11cf, 0x96, 0xc, 0x0, 0x80, 0xc7, 0x53, 0x4e, 0x82);
+
+DEFINE_GUID(IID_IDirectPlay3, 0x133efe40, 0x32dc, 0x11d0, 0x9c, 0xfb, 0x0, 0xa0, 0xc9, 0xa, 0x43, 0xcb);
+DEFINE_GUID(IID_IDirectPlay3A,0x133efe41, 0x32dc, 0x11d0, 0x9c, 0xfb, 0x0, 0xa0, 0xc9, 0xa, 0x43, 0xcb);
+
+// {D1EB6D20-8923-11d0-9D97-00A0C90A43CB}
+DEFINE_GUID(CLSID_DirectPlay,0xd1eb6d20, 0x8923, 0x11d0, 0x9d, 0x97, 0x0, 0xa0, 0xc9, 0xa, 0x43, 0xcb);
+
+
+/* {AF465C71-9588-11cf-A020-00AA006157AC} */
+DEFINE_GUID(IID_IDirectPlayLobby, 0xaf465c71, 0x9588, 0x11cf, 0xa0, 0x20, 0x0, 0xaa, 0x0, 0x61, 0x57, 0xac);
+/* {26C66A70-B367-11cf-A024-00AA006157AC} */
+DEFINE_GUID(IID_IDirectPlayLobbyA, 0x26c66a70, 0xb367, 0x11cf, 0xa0, 0x24, 0x0, 0xaa, 0x0, 0x61, 0x57, 0xac);
+/* {0194C220-A303-11d0-9C4F-00A0C905425E} */
+DEFINE_GUID(IID_IDirectPlayLobby2, 0x194c220, 0xa303, 0x11d0, 0x9c, 0x4f, 0x0, 0xa0, 0xc9, 0x5, 0x42, 0x5e);
+/* {1BB4AF80-A303-11d0-9C4F-00A0C905425E} */
+DEFINE_GUID(IID_IDirectPlayLobby2A, 0x1bb4af80, 0xa303, 0x11d0, 0x9c, 0x4f, 0x0, 0xa0, 0xc9, 0x5, 0x42, 0x5e);
+/* {2FE8F810-B2A5-11d0-A787-0000F803ABFC} */
+DEFINE_GUID(CLSID_DirectPlayLobby, 0x2fe8f810, 0xb2a5, 0x11d0, 0xa7, 0x87, 0x0, 0x0, 0xf8, 0x3, 0xab, 0xfc);
+
+/*
+ * GUIDS used by Service Providers shipped with DirectPlay
+ * Use these to identify Service Provider returned by EnumConnections
+ */
+
+/* GUID for IPX service provider {685BC400-9D2C-11cf-A9CD-00AA006886E3} */
+DEFINE_GUID(DPSPGUID_IPX, 0x685bc400, 0x9d2c, 0x11cf, 0xa9, 0xcd, 0x0, 0xaa, 0x0, 0x68, 0x86, 0xe3);
+
+/* GUID for TCP/IP service provider 36E95EE0-8577-11cf-960C-0080C7534E82 */
+DEFINE_GUID(DPSPGUID_TCPIP, 0x36E95EE0, 0x8577, 0x11cf, 0x96, 0xc, 0x0, 0x80, 0xc7, 0x53, 0x4e, 0x82);
+
+/* GUID for Serial service provider {0F1D6860-88D9-11cf-9C4E-00A0C905425E} */
+DEFINE_GUID(DPSPGUID_SERIAL, 0xf1d6860, 0x88d9, 0x11cf, 0x9c, 0x4e, 0x0, 0xa0, 0xc9, 0x5, 0x42, 0x5e);
+
+/* GUID for Modem service provider {44EAA760-CB68-11cf-9C4E-00A0C905425E} */
+DEFINE_GUID(DPSPGUID_MODEM, 0x44eaa760, 0xcb68, 0x11cf, 0x9c, 0x4e, 0x0, 0xa0, 0xc9, 0x5, 0x42, 0x5e);
+
+
+#pragma pack(1)
+
+/* Direct Play */
+typedef struct IDirectPlay        IDirectPlay, *LPDIRECTPLAY;
+
+/* Direct Play 2 */
+typedef struct IDirectPlay2       IDirectPlay2, *LPDIRECTPLAY2;
+typedef struct IDirectPlay2       IDirectPlay2A, *LPDIRECTPLAY2A;
+
+/* Direct Play 3 */
+typedef struct IDirectPlay3       IDirectPlay3, *LPDIRECTPLAY3;
+typedef struct IDirectPlay3       IDirectPlay3A, *LPDIRECTPLAY3A;
+
+/* DPID - DirectPlay player and group ID */
+typedef DWORD DPID, *LPDPID;
+
+/* DPID from whence originate messages - just an ID */
+#define DPID_SYSMSG             0           /* DPID of system */
+#define DPID_ALLPLAYERS         0           /* DPID of all players */
+#define DPID_SERVERPLAYER       1           /* DPID of the server player */
+#define DPID_UNKNOWN            0xFFFFFFFF  /* Player ID is unknown */
+
+/*  DPCAPS -  Used to obtain the capabilities of a DirectPlay object */
+typedef struct tagDPCAPS
+{
+    DWORD dwSize;               /* Size of structure in bytes */
+    DWORD dwFlags;              
+    DWORD dwMaxBufferSize;      
+    DWORD dwMaxQueueSize;       /* Obsolete. */
+    DWORD dwMaxPlayers;         /* Maximum players/groups (local + remote) */
+    DWORD dwHundredBaud;        /* Bandwidth in 100 bits per second units;
+                                 * i.e. 24 is 2400, 96 is 9600, etc. 
+                                 */
+    DWORD dwLatency;            /* Estimated latency; 0 = unknown */
+    DWORD dwMaxLocalPlayers;    /* Maximum # of locally created players */
+    DWORD dwHeaderLength;       /* Maximum header length in bytes */
+    DWORD dwTimeout;            /* Service provider's suggested timeout value
+                                 * This is how long DirectPlay will wait for
+                                 * responses to system messages
+                                 */
+} DPCAPS, *LPDPCAPS;
+
+typedef struct tagDPNAME
+{
+    DWORD   dwSize;             
+    DWORD   dwFlags;            /* Not used must be 0 */
+    union playerShortName       /* Player's Handle? */
+    {                           
+        LPWSTR  lpszShortName;  
+        LPSTR   lpszShortNameA; 
+    };
+    union playerLongName        /* Player's formal/real name */
+    {                         
+        LPWSTR  lpszLongName;  
+        LPSTR   lpszLongNameA;  
+    };
+
+} DPNAME, *LPDPNAME;
+
+typedef struct tagDPSESSIONDESC2
+{
+    DWORD   dwSize;             
+    DWORD   dwFlags;           
+    GUID    guidInstance;      
+    GUID    guidApplication;   
+                               
+    DWORD   dwMaxPlayers;      
+    DWORD   dwCurrentPlayers;  
+
+    union sessionName
+    {                             
+        LPWSTR  lpszSessionName;  
+        LPSTR   lpszSessionNameA; 
+    };
+
+    union optnlSessionPasswd
+    {                           
+        LPWSTR  lpszPassword;   
+        LPSTR   lpszPasswordA;  
+    };
+
+    DWORD   dwReserved1;       
+    DWORD   dwReserved2;
+    DWORD   dwUser1;          
+    DWORD   dwUser2;
+    DWORD   dwUser3;
+    DWORD   dwUser4;
+} DPSESSIONDESC2, *LPDPSESSIONDESC2;
+
+typedef struct tagDPLCONNECTION
+{
+    DWORD               dwSize;          
+    DWORD               dwFlags;          
+    LPDPSESSIONDESC2    lpSessionDesc;   
+    LPDPNAME            lpPlayerName;    
+    GUID                guidSP;          
+    LPVOID              lpAddress;       
+    DWORD               dwAddressSize;  
+} DPLCONNECTION, *LPDPLCONNECTION;
+
+typedef struct tagDPLAPPINFO
+{
+    DWORD       dwSize;            
+    GUID        guidApplication;   
+
+    union appName
+    {
+        LPSTR   lpszAppNameA;      
+        LPWSTR  lpszAppName;
+    };
+
+} DPLAPPINFO, *LPDPLAPPINFO;
+typedef const DPLAPPINFO *LPCDPLAPPINFO;
+
+typedef struct DPCOMPOUNDADDRESSELEMENT
+{
+    GUID    guidDataType;
+    DWORD   dwDataSize;
+    LPVOID  lpData;
+} DPCOMPOUNDADDRESSELEMENT, *LPDPCOMPOUNDADDRESSELEMENT;
+typedef const DPCOMPOUNDADDRESSELEMENT *LPCDPCOMPOUNDADDRESSELEMENT;
+
+typedef BOOL32 (CALLBACK* LPDPENUMDPCALLBACKW)(
+    LPGUID      lpguidSP,
+    LPWSTR      lpSPName,
+    DWORD       dwMajorVersion,
+    DWORD       dwMinorVersion,
+    LPVOID      lpContext);
+
+typedef BOOL32 (CALLBACK* LPDPENUMDPCALLBACKA)(
+    LPGUID      lpguidSP,
+    LPSTR       lpSPName,       /* ptr to str w/ driver description */
+    DWORD       dwMajorVersion, /* Major # of driver spec in lpguidSP */
+    DWORD       dwMinorVersion, /* Minor # of driver spec in lpguidSP */ 
+    LPVOID      lpContext);     /* User given */
+
+typedef const GUID   *LPCGUID;
+typedef const DPNAME *LPCDPNAME;
+
+typedef BOOL32 (CALLBACK* LPDPENUMCONNECTIONSCALLBACK)(
+    LPCGUID     lpguidSP,
+    LPVOID      lpConnection,
+    DWORD       dwConnectionSize,
+    LPCDPNAME   lpName,
+    DWORD       dwFlags,
+    LPVOID      lpContext);
+
+extern HRESULT WINAPI DirectPlayEnumerateA( LPDPENUMDPCALLBACKA, LPVOID );
+extern HRESULT WINAPI DirectPlayEnumerateW( LPDPENUMDPCALLBACKW, LPVOID );
+extern HRESULT WINAPI DirectPlayCreate( LPGUID lpGUID, LPDIRECTPLAY *lplpDP, IUnknown *pUnk);
+
+
+/* Direct Play Lobby 1 */
+typedef struct IDirectPlayLobby   IDirectPlayLobby, *LPDIRECTPLAYLOBBY;
+typedef struct IDirectPlayLobby   IDirectPlayLobbyA, *LPDIRECTPLAYLOBBYA;
+
+/* Direct Play Lobby 2 */
+typedef struct IDirectPlayLobby2    IDirectPlayLobby2, *LPDIRECTPLAYLOBBY2;
+typedef struct IDirectPlayLobby2    IDirectPlayLobby2A, *LPDIRECTPLAYLOBBY2A;
+
+extern HRESULT WINAPI DirectPlayLobbyCreateW(LPGUID, LPDIRECTPLAYLOBBY2 *, IUnknown *, LPVOID, DWORD );
+extern HRESULT WINAPI DirectPlayLobbyCreateA(LPGUID, LPDIRECTPLAYLOBBY2A *, IUnknown *, LPVOID, DWORD );
+
+
+
+typedef BOOL32 (CALLBACK* LPDPENUMADDRESSCALLBACK)(
+    REFGUID         guidDataType,
+    DWORD           dwDataSize,
+    LPCVOID         lpData,
+    LPVOID          lpContext);
+
+typedef BOOL32 (CALLBACK* LPDPLENUMADDRESSTYPESCALLBACK)(
+    REFGUID         guidDataType,
+    LPVOID          lpContext,
+    DWORD           dwFlags);
+
+typedef BOOL32 (CALLBACK* LPDPLENUMLOCALAPPLICATIONSCALLBACK)(
+    LPCDPLAPPINFO   lpAppInfo,
+    LPVOID          lpContext,
+    DWORD           dwFlags);
+
+
+#define STDMETHOD(xfn) HRESULT (CALLBACK *fn##xfn)
+#define STDMETHOD_(ret,xfn) ret (CALLBACK *fn##xfn)
+#define PURE
+#define FAR
+#define THIS_ THIS,
+
+#define THIS LPDIRECTPLAYLOBBY2 this
+typedef struct tagLPDIRECTPLAYLOBBY2_VTABLE {
+    /*  IUnknown Methods "Inherited Methods" */
+    STDMETHOD(QueryInterface)       (THIS_ REFIID riid, LPVOID * ppvObj) PURE;
+    STDMETHOD_(ULONG,AddRef)        (THIS) PURE;
+    STDMETHOD_(ULONG,Release)       (THIS) PURE;
+
+    /*  IDirectPlayLobby Methods */
+    STDMETHOD(Connect)              (THIS_ DWORD, LPDIRECTPLAY2 *, IUnknown *) PURE;
+    STDMETHOD(CreateAddress)        (THIS_ REFGUID, REFGUID, LPCVOID, DWORD, LPVOID, LPDWORD) PURE;
+    STDMETHOD(EnumAddress)          (THIS_ LPDPENUMADDRESSCALLBACK, LPCVOID, DWORD, LPVOID) PURE;
+    STDMETHOD(EnumAddressTypes)     (THIS_ LPDPLENUMADDRESSTYPESCALLBACK, REFGUID, LPVOID, DWORD) PURE;
+    STDMETHOD(EnumLocalApplications)(THIS_ LPDPLENUMLOCALAPPLICATIONSCALLBACK, LPVOID, DWORD) PURE;
+    STDMETHOD(GetConnectionSettings)(THIS_ DWORD, LPVOID, LPDWORD) PURE;
+    STDMETHOD(ReceiveLobbyMessage)  (THIS_ DWORD, DWORD, LPDWORD, LPVOID, LPDWORD) PURE;
+    STDMETHOD(RunApplication)       (THIS_ DWORD, LPDWORD, LPDPLCONNECTION, HANDLE32) PURE;
+    STDMETHOD(SendLobbyMessage)     (THIS_ DWORD, DWORD, LPVOID, DWORD) PURE;
+    STDMETHOD(SetConnectionSettings)(THIS_ DWORD, DWORD, LPDPLCONNECTION) PURE;
+    STDMETHOD(SetLobbyMessageEvent) (THIS_ DWORD, DWORD, HANDLE32) PURE;
+
+    /*  IDirectPlayLobby2 Methods */
+    STDMETHOD(CreateCompoundAddress)(THIS_ LPCDPCOMPOUNDADDRESSELEMENT, DWORD, LPVOID, LPDWORD) PURE;
+
+} DIRECTPLAYLOBBY2_VTABLE, *LPDIRECTPLAYLOBBY2_VTABLE;
+
+/* Is this right? How does one know? */
+struct IDirectPlayLobby2 {
+    LPDIRECTPLAYLOBBY2_VTABLE lpvtbl;
+    DWORD                     ref;
+};
+
+#pragma pack(4)
+
+#undef STDMETHOD
+#undef STDMETHOD_
+#undef PURE
+#undef FAR
+#undef THIS_
+
+#endif
diff --git a/include/dsound.h b/include/dsound.h
index af7a6a8..81a1220 100644
--- a/include/dsound.h
+++ b/include/dsound.h
@@ -251,29 +251,4 @@
 #undef PURE
 #undef FAR
 #undef THIS_
-
-/* DirectPlayLobby stuff */
-/* {AF465C71-9588-11cf-A020-00AA006157AC} */
-DEFINE_GUID(IID_IDirectPlayLobby, 0xaf465c71, 0x9588, 0x11cf, 0xa0, 0x20, 0x0, 0xaa, 0x0, 0x61, 0x57, 0xac);
-/* {26C66A70-B367-11cf-A024-00AA006157AC} */
-DEFINE_GUID(IID_IDirectPlayLobbyA, 0x26c66a70, 0xb367, 0x11cf, 0xa0, 0x24, 0x0, 0xaa, 0x0, 0x61, 0x57, 0xac);
-/* {0194C220-A303-11d0-9C4F-00A0C905425E} */
-DEFINE_GUID(IID_IDirectPlayLobby2, 0x194c220, 0xa303, 0x11d0, 0x9c, 0x4f, 0x0, 0xa0, 0xc9, 0x5, 0x42, 0x5e);
-/* {1BB4AF80-A303-11d0-9C4F-00A0C905425E} */
-DEFINE_GUID(IID_IDirectPlayLobby2A, 0x1bb4af80, 0xa303, 0x11d0, 0x9c, 0x4f, 0x0, 0xa0, 0xc9, 0x5, 0x42, 0x5e);
-/* {2FE8F810-B2A5-11d0-A787-0000F803ABFC} */
-DEFINE_GUID(CLSID_DirectPlayLobby, 0x2fe8f810, 0xb2a5, 0x11d0, 0xa7, 0x87, 0x0, 0x0, 0xf8, 0x3, 0xab, 0xfc);
-
-typedef struct IDirectPlayLobby     *LPDIRECTPLAYLOBBY;
-typedef struct IDirectPlayLobby     *LPDIRECTPLAYLOBBYA;
-typedef struct IDirectPlayLobby     IDirectPlayLobbyA;
-
-typedef struct IDirectPlayLobby2    *LPDIRECTPLAYLOBBY2;
-typedef struct IDirectPlayLobby2    *LPDIRECTPLAYLOBBY2A;
-typedef struct IDirectPlayLobby2    IDirectPlayLobby2A;
-
-extern HRESULT WINAPI DirectPlayLobbyCreateW(LPGUID, LPDIRECTPLAYLOBBY *, IUnknown *, LPVOID, DWORD );
-
-extern HRESULT WINAPI DirectPlayLobbyCreateA(LPGUID, LPDIRECTPLAYLOBBYA *, IUnknown *, LPVOID, DWORD );
-
 #endif
diff --git a/include/global.h b/include/global.h
index 56be65b..775f31e 100644
--- a/include/global.h
+++ b/include/global.h
@@ -33,4 +33,8 @@
 extern DWORD VIRTUAL_GetPageSize(void);
 extern DWORD VIRTUAL_GetGranularity(void);
 
+typedef BOOL32 (*HANDLERPROC)(LPVOID, LPVOID);
+extern BOOL32 VIRTUAL_SetFaultHandler(LPVOID addr, HANDLERPROC proc, LPVOID arg);
+extern BOOL32 VIRTUAL_HandleFault(LPVOID addr);
+
 #endif  /* __WINE_GLOBAL_H */
diff --git a/include/header.h b/include/header.h
index 498ea0f..710b1e4 100644
--- a/include/header.h
+++ b/include/header.h
@@ -47,6 +47,6 @@
 } HEADER_INFO;
 
 
-void HEADER_Register( void );
+extern void HEADER_Register (void);
 
 #endif /* __WINE_HEADER_H_ */
diff --git a/include/module.h b/include/module.h
index c0bb276..7add294 100644
--- a/include/module.h
+++ b/include/module.h
@@ -142,8 +142,6 @@
 extern FARPROC16 MODULE_GetWndProcEntry16( const char *name );
 extern FARPROC16 WINAPI WIN32_GetProcAddress16( HMODULE32 hmodule, LPCSTR name );
 
-typedef HGLOBAL16 (CALLBACK *RESOURCEHANDLER16)(HGLOBAL16,HMODULE16,HRSRC16);
-
 /* loader/ne/module.c */
 extern NE_MODULE *NE_GetPtr( HMODULE16 hModule );
 extern void NE_DumpModule( HMODULE16 hModule );
diff --git a/include/nonclient.h b/include/nonclient.h
index 2bc595a..7a3b04d 100644
--- a/include/nonclient.h
+++ b/include/nonclient.h
@@ -9,16 +9,16 @@
 
 #include "win.h"
 
-extern LONG NC_HandleNCPaint( HWND32 hwnd , HRGN32 clip);
-extern LONG NC_HandleNCActivate( WND *pwnd, WPARAM16 wParam );
-extern LONG NC_HandleNCCalcSize( WND *pWnd, RECT32 *winRect );
-extern LONG NC_HandleNCHitTest( HWND32 hwnd, POINT16 pt );
-extern LONG NC_HandleNCLButtonDown( WND* pWnd, WPARAM16 wParam, LPARAM lParam );
-extern LONG NC_HandleNCLButtonDblClk( WND *pWnd, WPARAM16 wParam, LPARAM lParam);
-extern LONG NC_HandleSysCommand( HWND32 hwnd, WPARAM16 wParam, POINT16 pt );
-extern LONG NC_HandleSetCursor( HWND32 hwnd, WPARAM16 wParam, LPARAM lParam );
-extern void NC_DrawSysButton( HWND32 hwnd, HDC32 hdc, BOOL32 down );
-extern void NC_DrawSysButton95( HWND32 hwnd, HDC32 hdc, BOOL32 down );
+extern LONG   NC_HandleNCPaint( HWND32 hwnd , HRGN32 clip);
+extern LONG   NC_HandleNCActivate( WND *pwnd, WPARAM16 wParam );
+extern LONG   NC_HandleNCCalcSize( WND *pWnd, RECT32 *winRect );
+extern LONG   NC_HandleNCHitTest( HWND32 hwnd, POINT16 pt );
+extern LONG   NC_HandleNCLButtonDown( WND* pWnd, WPARAM16 wParam, LPARAM lParam );
+extern LONG   NC_HandleNCLButtonDblClk( WND *pWnd, WPARAM16 wParam, LPARAM lParam);
+extern LONG   NC_HandleSysCommand( HWND32 hwnd, WPARAM16 wParam, POINT16 pt );
+extern LONG   NC_HandleSetCursor( HWND32 hwnd, WPARAM16 wParam, LPARAM lParam );
+extern void   NC_DrawSysButton( HWND32 hwnd, HDC32 hdc, BOOL32 down );
+extern BOOL32 NC_DrawSysButton95( HWND32 hwnd, HDC32 hdc, BOOL32 down );
 extern BOOL32 NC_GetSysPopupPos( WND* wndPtr, RECT32* rect );
 
 #endif /* __WINE_NONCLIENT_H */
diff --git a/include/oleauto.h b/include/oleauto.h
index 8a0f265..61d42c6 100644
--- a/include/oleauto.h
+++ b/include/oleauto.h
@@ -11,4 +11,8 @@
 VOID SysFreeString32(BSTR32);
 #define SysFreeString WINELIB_NAME(SysFreeString)
 
+typedef char OLECHAR;
+typedef void ITypeLib;
+typedef ITypeLib * LPTYPELIB;
+
 #endif
diff --git a/include/print.h b/include/print.h
new file mode 100644
index 0000000..1cc5628
--- /dev/null
+++ b/include/print.h
@@ -0,0 +1,15 @@
+#include "windows.h"
+
+HANDLE16 WINAPI OpenJob(LPSTR lpOutput, LPSTR lpTitle, HDC16 hDC);
+int WINAPI CloseJob(HANDLE16 hJob);
+int WINAPI WriteSpool(HANDLE16 hJob, LPSTR lpData, WORD cch);
+int WINAPI DeleteJob(HANDLE16 hJob, WORD wNotUsed);
+int WINAPI StartSpoolPage(HANDLE16 hJob);
+int WINAPI EndSpoolPage(HANDLE16 hJob);
+DWORD WINAPI GetSpoolJob(int nOption, LONG param);
+int WINAPI WriteDialog(HANDLE16 hJob, LPSTR lpMsg, WORD cchMsg);
+
+
+
+
+
diff --git a/include/psdrv.h b/include/psdrv.h
new file mode 100644
index 0000000..0c47895
--- /dev/null
+++ b/include/psdrv.h
@@ -0,0 +1,123 @@
+/*
+ *	Postscript driver definitions
+ *
+ *	Copyright 1998  Huw D M Davies
+ */
+#include "windows.h"
+#include "font.h"
+
+typedef struct {
+    float	llx, lly, urx, ury;
+} AFMBBOX;
+
+typedef struct _tagAFMLIGS {
+    char		*successor;
+    char		*ligature;
+    struct _tagAFMLIGS	*next;
+} AFMLIGS;
+
+typedef struct _tagAFMMETRICS {
+    int				C;			/* character */  
+    float			WX;
+    char			*N;			/* name */
+    AFMBBOX			B;
+    AFMLIGS			*L;			/* Ligatures */
+    struct _tagAFMMETRICS	*next;
+} AFMMETRICS;
+
+typedef struct _tagAFM {
+    char		*FontName;
+    char		*FullName;
+    char		*FamilyName;
+    int			Weight;			/* FW_NORMAL etc. */
+    float		ItalicAngle;
+    BOOL32		IsFixedPitch;
+    float		UnderlinePosition;
+    float		UnderlineThickness;
+    AFMBBOX		FontBBox;
+    float		CapHeight;
+    float		XHeight;
+    float		Ascender;
+    float		Descender;
+    float		CharWidths[256];
+    int			NumofMetrics;
+    AFMMETRICS		*Metrics;
+    struct _tagAFM	*next;
+} AFM; /* CharWidths is a shortcut to the WX values of numbered glyphs */
+
+typedef struct _tagFontFamily {
+    char			*FamilyName; /* family name */
+    AFM				*afm;	     /* list of afms for this family */
+    struct _tagFontFamily	*next;       /* next family */
+} FontFamily;
+
+extern FontFamily *PSDRV_AFMFontList;
+
+typedef struct {
+    AFM			*afm;
+    TEXTMETRIC32A	tm;
+    INT32		size;
+    float		scale;
+    INT32		escapement;
+    BOOL32		set;		/* Have we done a setfont yet */
+} PSFONT;
+
+typedef struct {
+    HANDLE16		hJob;
+    LPSTR		output;		/* Output file/port */
+    BOOL32              banding;        /* Have we received a NEXTBAND */
+    BOOL32		NeedPageHeader; /* Page header not sent yet */
+    INT32		PageNo;
+} JOB;
+
+typedef struct
+{
+    PSFONT		font;		/* Current PS font */
+    JOB			job;
+} PSDRV_PDEVICE;
+
+
+extern BOOL32 PSDRV_GetFontMetrics(void);
+
+extern BOOL32 PSDRV_Init(void);
+extern HFONT16 PSDRV_FONT_SelectObject( DC *dc, HFONT16 hfont, FONTOBJ *font);
+extern BOOL32 PSDRV_SetFont( DC *dc );
+
+extern INT32 PSDRV_WriteHeader( DC *dc, char *title, int len );
+extern INT32 PSDRV_WriteFooter( DC *dc );
+extern INT32 PSDRV_WriteNewPage( DC *dc );
+extern INT32 PSDRV_WriteEndPage( DC *dc );
+extern BOOL32 PSDRV_WriteMoveTo(DC *dc, INT32 x, INT32 y);
+extern BOOL32 PSDRV_WriteLineTo(DC *dc, INT32 x, INT32 y);
+extern BOOL32 PSDRV_WriteStroke(DC *dc);
+extern BOOL32 PSDRV_WriteRectangle(DC *dc, INT32 x, INT32 y, INT32 width, 
+			INT32 height);
+extern BOOL32 PSDRV_WriteSetFont(DC *dc);
+extern BOOL32 PSDRV_WriteShow(DC *dc, char *str, INT32 count);
+extern BOOL32 PSDRV_WriteReencodeFont(DC *dc);
+
+
+
+
+
+
+
+
+extern BOOL32 PSDRV_EnumDeviceFonts( DC* dc, LPLOGFONT16 plf, 
+				        DEVICEFONTENUMPROC proc, LPARAM lp );
+extern INT32 PSDRV_Escape( DC *dc, INT32 nEscape, INT32 cbInput, 
+                              SEGPTR lpInData, SEGPTR lpOutData );
+extern BOOL32 PSDRV_ExtTextOut( DC *dc, INT32 x, INT32 y, UINT32 flags,
+                   const RECT32 *lprect, LPCSTR str, UINT32 count,
+                   const INT32 *lpDx );
+extern BOOL32 PSDRV_GetTextExtentPoint( DC *dc, LPCSTR str, INT32 count,
+                                  LPSIZE32 size );
+extern BOOL32 PSDRV_GetTextMetrics( DC *dc, TEXTMETRIC32A *metrics );
+extern BOOL32 PSDRV_LineTo( DC *dc, INT32 x, INT32 y );
+extern BOOL32 PSDRV_MoveToEx( DC *dc, INT32 x, INT32 y, LPPOINT32 pt );
+extern HGDIOBJ32 PSDRV_SelectObject( DC *dc, HGDIOBJ32 handle );
+
+extern BOOL32 PSDRV_Rectangle(DC *dc, INT32 left, INT32 top, INT32 right,
+		       INT32 bottom);
+extern BOOL32 PSDRV_Ellipse(DC *dc, INT32 left, INT32 top, INT32 right,
+		       INT32 bottom);
diff --git a/include/shlobj.h b/include/shlobj.h
index 9d277c1..411ca0b 100644
--- a/include/shlobj.h
+++ b/include/shlobj.h
@@ -247,6 +247,84 @@
 
 DWORD WINAPI SHELL32_DllGetClassObject(LPCLSID,REFIID,LPVOID*);
 
+
+/****************************************************************************
+ * SHBrowseForFolder API
+ */
+
+typedef int (CALLBACK* BFFCALLBACK)(HWND32 hwnd, UINT32 uMsg, LPARAM lParam, LPARAM lpData);
+
+typedef struct tagBROWSEINFO32A {
+    HWND32        hwndOwner;
+    LPCITEMIDLIST pidlRoot;
+    LPSTR         pszDisplayName;
+    LPCSTR        lpszTitle;
+    UINT32        ulFlags;
+    BFFCALLBACK   lpfn;
+    LPARAM        lParam;
+    int           iImage;
+} BROWSEINFO32A, *PBROWSEINFO32A, *LPBROWSEINFO32A;
+
+typedef struct tagBROWSEINFO32W {
+    HWND32        hwndOwner;
+    LPCITEMIDLIST pidlRoot;
+    LPWSTR        pszDisplayName;
+    LPCWSTR       lpszTitle;
+    UINT32        ulFlags;
+    BFFCALLBACK   lpfn;
+    LPARAM        lParam;
+    int           iImage;
+} BROWSEINFO32W, *PBROWSEINFO32W, *LPBROWSEINFO32W; 
+
+#define BROWSEINFO   WINELIB_NAME_AW(BROWSEINFO)
+#define PBROWSEINFO  WINELIB_NAME_AW(PBROWSEINFO)
+#define LPBROWSEINFO WINELIB_NAME_AW(LPBROWSEINFO)
+
+// Browsing for directory.
+#define BIF_RETURNONLYFSDIRS   0x0001
+#define BIF_DONTGOBELOWDOMAIN  0x0002
+#define BIF_STATUSTEXT         0x0004
+#define BIF_RETURNFSANCESTORS  0x0008
+#define BIF_EDITBOX            0x0010
+#define BIF_VALIDATE           0x0020
+ 
+#define BIF_BROWSEFORCOMPUTER  0x1000
+#define BIF_BROWSEFORPRINTER   0x2000
+#define BIF_BROWSEINCLUDEFILES 0x4000
+
+// message from browser
+#define BFFM_INITIALIZED        1
+#define BFFM_SELCHANGED         2
+#define BFFM_VALIDATEFAILEDA    3   // lParam:szPath ret:1(cont),0(EndDialog)
+#define BFFM_VALIDATEFAILEDW    4   // lParam:wzPath ret:1(cont),0(EndDialog)
+
+// messages to browser
+#define BFFM_SETSTATUSTEXTA     (WM_USER+100)
+#define BFFM_ENABLEOK           (WM_USER+101)
+#define BFFM_SETSELECTIONA      (WM_USER+102)
+#define BFFM_SETSELECTIONW      (WM_USER+103)
+#define BFFM_SETSTATUSTEXTW     (WM_USER+104)
+
+LPITEMIDLIST WINAPI SHBrowseForFolder32A(LPBROWSEINFO32A lpbi);
+/*
+LPITEMIDLIST WINAPI SHBrowseForFolder32W(LPBROWSEINFO32W lpbi);
+
+#ifdef UNICODE
+#define SHBrowseForFolder   SHBrowseForFolderW
+#define BFFM_SETSTATUSTEXT  BFFM_SETSTATUSTEXTW
+#define BFFM_SETSELECTION   BFFM_SETSELECTIONW
+
+#define BFFM_VALIDATEFAILED BFFM_VALIDATEFAILEDW
+#else
+#define SHBrowseForFolder   SHBrowseForFolderA
+#define BFFM_SETSTATUSTEXT  BFFM_SETSTATUSTEXTA
+#define BFFM_SETSELECTION   BFFM_SETSELECTIONA
+
+#define BFFM_VALIDATEFAILED BFFM_VALIDATEFAILEDA 
+#endif 
+*/
+
+
 #undef PURE
 #undef FAR
 #undef THIS
diff --git a/include/sig_context.h b/include/sig_context.h
index 50def94..595d91c 100644
--- a/include/sig_context.h
+++ b/include/sig_context.h
@@ -217,8 +217,11 @@
 #define FL_sig(context)      (*(WORD*)&EFL_sig(context))
 
 #ifdef FS_sig
-#define HANDLER_INIT() SET_FS(FS_sig(HANDLER_CONTEXT))
-#else FS_sig
+extern WORD CALLTO16_Current_fs;
+#define HANDLER_INIT() \
+    SET_FS(IS_SELECTOR_SYSTEM(CS_sig(HANDLER_CONTEXT)) ? \
+           FS_sig(HANDLER_CONTEXT) : CALLTO16_Current_fs)
+#else
 #define HANDLER_INIT() /* nothing */
 #endif
 
diff --git a/include/snoop.h b/include/snoop.h
index 0c5fd5f..29a7b91 100644
--- a/include/snoop.h
+++ b/include/snoop.h
@@ -1,8 +1,13 @@
 /* 
- * Definitions for inter-win32-dll snooping
+ * Definitions for inter-dll snooping
  */
 #ifndef __WINE_SNOOP_H
 #define __WINE_SNOOP_H
-extern void SNOOP_RegisterDLL(HMODULE32 hmod,LPCSTR name,DWORD nrofordinals);
-extern FARPROC32 SNOOP_GetProcAddress32(HMODULE32 hmod,LPCSTR name,DWORD ordinal,FARPROC32 origfun);
+
+#include "module.h"
+
+extern void SNOOP_RegisterDLL(HMODULE32,LPCSTR,DWORD);
+extern FARPROC32 SNOOP_GetProcAddress32(HMODULE32,LPCSTR,DWORD,FARPROC32);
+extern void SNOOP16_RegisterDLL(NE_MODULE*,LPCSTR);
+extern FARPROC16 SNOOP16_GetProcAddress16(HMODULE16,DWORD,FARPROC16);
 #endif
diff --git a/include/thread.h b/include/thread.h
index 096eadf..9e95d29 100644
--- a/include/thread.h
+++ b/include/thread.h
@@ -70,7 +70,7 @@
     DWORD          cur_stack;      /*  80 Current stack (was: unknown) */
     DWORD          unknown3[2];    /*  84 Unknown */
     WORD           current_ss;     /*  8c Another 16-bit stack selector */
-    WORD           pad2;           /*  8e */
+    WORD           saved_fs;       /*  8e Saved 16-bit FS (was: pad2) */
     void          *ss_table;       /*  90 Pointer to info about 16-bit stack */
     WORD           thunk_ss;       /*  94 Yet another 16-bit stack selector */
     WORD           pad3;           /*  96 */
diff --git a/include/toolbar.h b/include/toolbar.h
index 14ecd84..407c331 100644
--- a/include/toolbar.h
+++ b/include/toolbar.h
@@ -27,7 +27,6 @@
     DWORD      dwStructSize;   /* size of TBBUTTON struct */
     INT32      nHeight;        /* height of the toolbar */
     INT32      nWidth;         /* width of the toolbar */
-    INT32      nButtonTop;     /* top of the button rectangle */
     INT32      nButtonHeight;
     INT32      nButtonWidth;
     INT32      nBitmapHeight;
@@ -42,12 +41,14 @@
     BOOL32     bCaptured;
     INT32      nButtonDown;
     INT32      nOldHit;
+    INT32      nHotItem;        /* index of the "hot" item */
 
     HIMAGELIST himlDef;         /* default image list */
     HIMAGELIST himlHot;         /* hot image list */
     HIMAGELIST himlDis;         /* disabled image list */
     HWND32     hwndToolTip;     /* handle to tool tip control */
     HWND32     hwndNotify;      /* handle to the window that gets notifications */
+    BOOL32     bTransparent;    /* background transparency flag */
 
     TBUTTON_INFO *buttons;
     CHAR         **strings;
diff --git a/include/version.h b/include/version.h
index 5a092e3..abb9b65 100644
--- a/include/version.h
+++ b/include/version.h
@@ -1 +1 @@
-#define WINE_RELEASE_INFO "Wine release 980614"
+#define WINE_RELEASE_INFO "Wine release 980628"
diff --git a/include/windows.h b/include/windows.h
index 9119e41..6b7bfcc 100644
--- a/include/windows.h
+++ b/include/windows.h
@@ -465,6 +465,9 @@
 #define HTGROWBOX           HTSIZE
 #define HTREDUCE            HTMINBUTTON
 #define HTZOOM              HTMAXBUTTON
+#define HTOBJECT            19
+#define HTCLOSE             20
+#define HTHELP              21
 
   /* WM_SYSCOMMAND parameters */
 #ifdef SC_SIZE /* at least HP-UX: already defined in /usr/include/sys/signal.h */
@@ -5442,6 +5445,54 @@
 DECL_WINELIB_TYPE_AW(DEVMODE)
 DECL_WINELIB_TYPE_AW(LPDEVMODE)
 
+#define DM_UPDATE	1
+#define DM_COPY		2
+#define DM_PROMPT	4
+#define DM_MODIFY	8
+
+#define DM_ORIENTATION		0x00000001L
+#define DM_PAPERSIZE		0x00000002L
+#define DM_PAPERLENGTH		0x00000004L
+#define DM_PAPERWIDTH		0x00000008L
+#define DM_SCALE		0x00000010L
+#define DM_COPIES		0x00000100L
+#define DM_DEFAULTSOURCE	0x00000200L
+#define DM_PRINTQUALITY		0x00000400L
+#define DM_COLOR		0x00000800L
+#define DM_DUPLEX		0x00001000L
+
+/* etc.... */
+
+#define DMORIENT_PORTRAIT	1
+#define DMORIENT_LANDSCAPE	2
+
+#define DMPAPER_LETTER	1
+#define DMPAPER_A3	8
+#define DMPAPER_A4	9
+#define DMPAPER_A5	11
+
+#define DMBIN_UPPER	1
+#define DMBIN_AUTO	7
+
+#define DC_FIELDS		1
+#define DC_PAPERS		2
+#define DC_PAPERSIZE		3
+#define DC_MINEXTENT		4
+#define DC_MAXEXTENT		5
+#define DC_BINS			6
+#define DC_DUPLEX		7
+#define DC_SIZE			8
+#define DC_EXTRA		9
+#define DC_VERSION		10
+#define DC_DRIVER		11
+#define DC_BINNAMES		12
+#define DC_ENUMRESOLUTIONS	13
+#define DC_FILEDEPENDENCIES	14
+#define DC_TRUETYPE		15
+#define DC_PAPERNAMES		16
+#define DC_ORIENTATION		17
+#define DC_COPIES		18
+
 typedef struct _PRINTER_DEFAULTS32A {
     LPSTR        pDatatype;
     LPDEVMODE32A pDevMode;
@@ -6326,6 +6377,7 @@
 #define     FindResourceEx WINELIB_NAME_AW(FindResourceEx)
 BOOL32      WINAPI FlushConsoleInputBuffer(HANDLE32);
 BOOL32      WINAPI FlushFileBuffers(HFILE32);
+BOOL32      WINAPI FlushViewOfFile(LPCVOID, DWORD);
 DWORD       WINAPI FormatMessage32A(DWORD,LPCVOID,DWORD,DWORD,LPSTR,
 				    DWORD,LPDWORD);
 #define     FormatMessage WINELIB_NAME_AW(FormatMessage)
diff --git a/include/winerror.h b/include/winerror.h
index d5b2cfc..441f839 100644
--- a/include/winerror.h
+++ b/include/winerror.h
@@ -70,17 +70,47 @@
 #define ERROR_INVALID_PRINTER_NAME  1801
 
 /* HRESULT values for OLE, SHELL and other Interface stuff */
+/* the codes 4000-40ff are reserved for OLE */
 #define	NOERROR				0
 #define	S_OK				0
-#define	E_FAIL				0x80000008
+
+
 #define	E_UNEXPECTED			0x8000FFFF
 
+#define E_NOTIMPL			0x80004001
+#define E_NOINTERFACE			0x80004002
+#define E_POINTER			0x80004003
+#define E_ABORT				0x80004004
+#define E_FAIL				0x80004005
+
+/*#define CO_E_INIT_TLS			0x80004006
+#define CO_E_INIT_SHARED_ALLOCATOR	0x80004007
+#define CO_E_INIT_MEMORY_ALLOCATOR	0x80004008
+#define CO_E_INIT_CLASS_CACHE		0x80004009
+#define CO_E_INIT_RPC_CHANNEL		0x8000400A
+#define CO_E_INIT_TLS_SET_CHANNEL_CONTROL	0x8000400B
+#define CO_E_INIT_TLS_CHANNEL_CONTROL	0x8000400C
+#define CO_E_INIT_UNACCEPTED_USER_ALLOCATOR	0x8000400D
+#define CO_E_INIT_SCM_MUTEX_EXISTS	0x8000400E
+#define CO_E_INIT_SCM_FILE_MAPPING_EXISTS	0x8000400F
+#define CO_E_INIT_SCM_MAP_VIEW_OF_FILE	0x80004010
+#define CO_E_INIT_SCM_EXEC_FAILURE	0x80004011
+#define CO_E_INIT_ONLY_SINGLE_THREADED	0x80004012 */
+
+
 #define	OLE_E_ENUM_NOMORE		0x80040002
 #define	CLASS_E_CLASSNOTAVAILABLE	0x80040111
 
+#define E_ACCESSDENIED			0x80070005
+#define E_HANDLE			0x80070006
 #define	E_OUTOFMEMORY			0x8007000E
 #define	E_INVALIDARG			0x80070057
 
+//#define OLE_E_FIRST 0x80040000L
+//#define OLE_E_LAST  0x800400FFL
+//#define OLE_S_FIRST 0x00040000L
+//#define OLE_S_LAST  0x000400FFL
+
 #define STG_E_INVALIDFUNCTION		0x80030001
 #define STG_E_FILENOTFOUND		0x80030002
 #define STG_E_PATHNOTFOUND		0x80030003
@@ -115,4 +145,15 @@
 #define STG_E_NOTFILEBASEDSTORAGE	0x80030107
 #define STG_E_EXTANTMARSHALLINGS	0x80030108
 
+/* alten versionen
+#define E_NOTIMPL			0x80000001
+#define E_OUTOFMEMORY			0x80000002
+#define E_INVALIDARG			0x80000003
+#define E_NOINTERFACE			0x80000004
+#define E_POINTER			0x80000005
+#define E_HANDLE			0x80000006
+#define E_ABORT				0x80000007
+#define	E_FAIL				0x80000008
+#define E_ACCESSDENIED			0x80000009 */
+
 #endif  /* __WINE_WINERROR_H */
diff --git a/include/winioctl.h b/include/winioctl.h
new file mode 100644
index 0000000..588e199
--- /dev/null
+++ b/include/winioctl.h
@@ -0,0 +1,254 @@
+#ifndef __WINE_WINIOCTL_H
+#define __WINE_WINIOCTL_H
+
+#include "winnt.h"
+
+#pragma pack(1)
+
+#define CTL_CODE( DeviceType, Function, Method, Access ) (                 \
+    (DWORD)((DeviceType) << 16) | ((Access) << 14) | ((Function) << 2) | (Method) \
+)
+
+#define DEVICE_TYPE DWORD
+
+#define FILE_DEVICE_BEEP                0x00000001
+#define FILE_DEVICE_CD_ROM              0x00000002
+#define FILE_DEVICE_CD_ROM_FILE_SYSTEM  0x00000003
+#define FILE_DEVICE_CONTROLLER          0x00000004
+#define FILE_DEVICE_DATALINK            0x00000005
+#define FILE_DEVICE_DFS                 0x00000006
+#define FILE_DEVICE_DISK                0x00000007
+#define FILE_DEVICE_DISK_FILE_SYSTEM    0x00000008
+#define FILE_DEVICE_FILE_SYSTEM         0x00000009
+#define FILE_DEVICE_INPORT_PORT         0x0000000a
+#define FILE_DEVICE_KEYBOARD            0x0000000b
+#define FILE_DEVICE_MAILSLOT            0x0000000c
+#define FILE_DEVICE_MIDI_IN             0x0000000d
+#define FILE_DEVICE_MIDI_OUT            0x0000000e
+#define FILE_DEVICE_MOUSE               0x0000000f
+#define FILE_DEVICE_MULTI_UNC_PROVIDER  0x00000010
+#define FILE_DEVICE_NAMED_PIPE          0x00000011
+#define FILE_DEVICE_NETWORK             0x00000012
+#define FILE_DEVICE_NETWORK_BROWSER     0x00000013
+#define FILE_DEVICE_NETWORK_FILE_SYSTEM 0x00000014
+#define FILE_DEVICE_NULL                0x00000015
+#define FILE_DEVICE_PARALLEL_PORT       0x00000016
+#define FILE_DEVICE_PHYSICAL_NETCARD    0x00000017
+#define FILE_DEVICE_PRINTER             0x00000018
+#define FILE_DEVICE_SCANNER             0x00000019
+#define FILE_DEVICE_SERIAL_MOUSE_PORT   0x0000001a
+#define FILE_DEVICE_SERIAL_PORT         0x0000001b
+#define FILE_DEVICE_SCREEN              0x0000001c
+#define FILE_DEVICE_SOUND               0x0000001d
+#define FILE_DEVICE_STREAMS             0x0000001e
+#define FILE_DEVICE_TAPE                0x0000001f
+#define FILE_DEVICE_TAPE_FILE_SYSTEM    0x00000020
+#define FILE_DEVICE_TRANSPORT           0x00000021
+#define FILE_DEVICE_UNKNOWN             0x00000022
+#define FILE_DEVICE_VIDEO               0x00000023
+#define FILE_DEVICE_VIRTUAL_DISK        0x00000024
+#define FILE_DEVICE_WAVE_IN             0x00000025
+#define FILE_DEVICE_WAVE_OUT            0x00000026
+#define FILE_DEVICE_8042_PORT           0x00000027
+#define FILE_DEVICE_NETWORK_REDIRECTOR  0x00000028
+#define FILE_DEVICE_BATTERY             0x00000029
+#define FILE_DEVICE_BUS_EXTENDER        0x0000002a
+#define FILE_DEVICE_MODEM               0x0000002b
+#define FILE_DEVICE_VDM                 0x0000002c
+#define FILE_DEVICE_MASS_STORAGE        0x0000002d
+#define FILE_DEVICE_SMB                 0x0000002e
+#define FILE_DEVICE_KS                  0x0000002f
+#define FILE_DEVICE_CHANGER             0x00000030
+#define FILE_DEVICE_SMARTCARD           0x00000031
+#define FILE_DEVICE_ACPI                0x00000032
+#define FILE_DEVICE_DVD                 0x00000033
+#define FILE_DEVICE_FULLSCREEN_VIDEO    0x00000034
+#define FILE_DEVICE_DFS_FILE_SYSTEM     0x00000035
+#define FILE_DEVICE_DFS_VOLUME          0x00000036
+
+#define METHOD_BUFFERED                 0
+#define METHOD_IN_DIRECT                1
+#define METHOD_OUT_DIRECT               2
+#define METHOD_NEITHER                  3
+
+#define FILE_ANY_ACCESS                 0
+#define FILE_READ_ACCESS                FILE_READ_DATA  /* file & pipe */
+#define FILE_WRITE_ACCESS               FILE_WRITE_DATA /* file & pipe */
+
+#define FSCTL_REQUEST_OPLOCK_LEVEL_1    CTL_CODE(FILE_DEVICE_FILE_SYSTEM,  0, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define FSCTL_REQUEST_OPLOCK_LEVEL_2    CTL_CODE(FILE_DEVICE_FILE_SYSTEM,  1, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define FSCTL_REQUEST_BATCH_OPLOCK      CTL_CODE(FILE_DEVICE_FILE_SYSTEM,  2, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define FSCTL_OPLOCK_BREAK_ACKNOWLEDGE  CTL_CODE(FILE_DEVICE_FILE_SYSTEM,  3, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define FSCTL_OPBATCH_ACK_CLOSE_PENDING CTL_CODE(FILE_DEVICE_FILE_SYSTEM,  4, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define FSCTL_OPLOCK_BREAK_NOTIFY       CTL_CODE(FILE_DEVICE_FILE_SYSTEM,  5, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define FSCTL_LOCK_VOLUME               CTL_CODE(FILE_DEVICE_FILE_SYSTEM,  6, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define FSCTL_UNLOCK_VOLUME             CTL_CODE(FILE_DEVICE_FILE_SYSTEM,  7, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define FSCTL_DISMOUNT_VOLUME           CTL_CODE(FILE_DEVICE_FILE_SYSTEM,  8, METHOD_BUFFERED, FILE_ANY_ACCESS)
+/* decommissioned fsctl value                                              9                                     */
+#define FSCTL_IS_VOLUME_MOUNTED         CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 10, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define FSCTL_IS_PATHNAME_VALID         CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 11, METHOD_BUFFERED, FILE_ANY_ACCESS) 
+#define FSCTL_MARK_VOLUME_DIRTY         CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 12, METHOD_BUFFERED, FILE_ANY_ACCESS)
+/* decommissioned fsctl value                                             13                                     */
+#define FSCTL_QUERY_RETRIEVAL_POINTERS  CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 14,  METHOD_NEITHER, FILE_ANY_ACCESS)
+#define FSCTL_GET_COMPRESSION           CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 15, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define FSCTL_SET_COMPRESSION           CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 16, METHOD_BUFFERED, FILE_READ_DATA | FILE_WRITE_DATA)
+/* decommissioned fsctl value                                             17                                     */
+/* decommissioned fsctl value                                             18                                     */
+#define FSCTL_MARK_AS_SYSTEM_HIVE       CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 19,  METHOD_NEITHER, FILE_ANY_ACCESS)
+#define FSCTL_OPLOCK_BREAK_ACK_NO_2     CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 20, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define FSCTL_INVALIDATE_VOLUMES        CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 21, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define FSCTL_QUERY_FAT_BPB             CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 22, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define FSCTL_REQUEST_FILTER_OPLOCK     CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 23, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define FSCTL_FILESYSTEM_GET_STATISTICS CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 24, METHOD_BUFFERED, FILE_ANY_ACCESS)
+/* Start: _WIN32_WINNT >= 0x0400 */
+#define FSCTL_GET_NTFS_VOLUME_DATA      CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 25, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define FSCTL_GET_NTFS_FILE_RECORD      CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 26, METHOD_BUFFERED, FILE_ANY_ACCESS) 
+#define FSCTL_GET_VOLUME_BITMAP         CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 27,  METHOD_NEITHER, FILE_ANY_ACCESS) 
+#define FSCTL_GET_RETRIEVAL_POINTERS    CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 28,  METHOD_NEITHER, FILE_ANY_ACCESS) 
+#define FSCTL_MOVE_FILE                 CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 29, METHOD_BUFFERED, FILE_ANY_ACCESS) 
+#define FSCTL_IS_VOLUME_DIRTY           CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 30, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define FSCTL_GET_HFS_INFORMATION       CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 31, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define FSCTL_ALLOW_EXTENDED_DASD_IO    CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 32, METHOD_NEITHER,  FILE_ANY_ACCESS)
+/* End: _WIN32_WINNT >= 0x0400 */
+
+/* Start: _WIN32_WINNT >= 0x0500 */
+#define FSCTL_READ_PROPERTY_DATA        CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 33, METHOD_NEITHER, FILE_ANY_ACCESS)
+#define FSCTL_WRITE_PROPERTY_DATA       CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 34, METHOD_NEITHER, FILE_ANY_ACCESS)
+#define FSCTL_FIND_FILES_BY_SID         CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 35, METHOD_NEITHER, FILE_ANY_ACCESS)
+/* decommissioned fsctl value                                             36                                     */
+#define FSCTL_DUMP_PROPERTY_DATA        CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 37,  METHOD_NEITHER, FILE_ANY_ACCESS)
+#define FSCTL_SET_OBJECT_ID             CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 38, METHOD_BUFFERED, FILE_WRITE_DATA) 
+#define FSCTL_GET_OBJECT_ID             CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 39, METHOD_BUFFERED, FILE_ANY_ACCESS) 
+#define FSCTL_DELETE_OBJECT_ID          CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 40, METHOD_BUFFERED, FILE_WRITE_DATA)
+#define FSCTL_SET_REPARSE_POINT         CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 41, METHOD_BUFFERED, FILE_WRITE_DATA) 
+#define FSCTL_GET_REPARSE_POINT         CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 42, METHOD_BUFFERED, FILE_ANY_ACCESS) 
+#define FSCTL_DELETE_REPARSE_POINT      CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 43, METHOD_BUFFERED, FILE_WRITE_DATA) 
+#define FSCTL_ENUM_USN_DATA             CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 44,  METHOD_NEITHER, FILE_READ_DATA)  
+#define FSCTL_SECURITY_ID_CHECK         CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 45,  METHOD_NEITHER, FILE_READ_DATA)  
+#define FSCTL_READ_USN_JOURNAL          CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 46,  METHOD_NEITHER, FILE_READ_DATA)  
+#define FSCTL_SET_OBJECT_ID_EXTENDED    CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 47, METHOD_BUFFERED, FILE_WRITE_DATA
+#define FSCTL_CREATE_OR_GET_OBJECT_ID   CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 48, METHOD_BUFFERED, FILE_ANY_ACCESS) 
+#define FSCTL_SET_SPARSE                CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 49, METHOD_BUFFERED, FILE_WRITE_DATA)
+#define FSCTL_SET_ZERO_DATA             CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 50, METHOD_BUFFERED, FILE_WRITE_DATA) 
+#define FSCTL_QUERY_ALLOCATED_RANGES    CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 51,  METHOD_NEITHER, FILE_READ_DATA)  
+#define FSCTL_ENABLE_UPGRADE            CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 52, METHOD_BUFFERED, FILE_WRITE_DATA)
+#define FSCTL_SET_ENCRYPTION            CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 53, METHOD_BUFFERED, FILE_ANY_ACCESS) 
+#define FSCTL_ENCRYPTION_FSCTL_IO       CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 54,  METHOD_NEITHER, FILE_ANY_ACCESS)
+#define FSCTL_WRITE_RAW_ENCRYPTED       CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 55,  METHOD_NEITHER, FILE_ANY_ACCESS) 
+#define FSCTL_READ_RAW_ENCRYPTED        CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 56,  METHOD_NEITHER, FILE_ANY_ACCESS) 
+#define FSCTL_CREATE_USN_JOURNAL        CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 57,  METHOD_NEITHER, FILE_READ_DATA)  
+#define FSCTL_READ_FILE_USN_DATA        CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 58,  METHOD_NEITHER, FILE_READ_DATA)  
+#define FSCTL_WRITE_USN_CLOSE_RECORD    CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 59,  METHOD_NEITHER, FILE_READ_DATA)  
+#define FSCTL_EXTEND_VOLUME             CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 60, METHOD_BUFFERED, FILE_ANY_ACCESS)
+/* End: _WIN32_WINNT >= 0x0500 */
+
+
+
+#define IOCTL_STORAGE_BASE FILE_DEVICE_MASS_STORAGE
+#define IOCTL_STORAGE_CHECK_VERIFY       CTL_CODE(IOCTL_STORAGE_BASE, 0x0200, METHOD_BUFFERED, FILE_READ_ACCESS)
+#define IOCTL_STORAGE_MEDIA_REMOVAL      CTL_CODE(IOCTL_STORAGE_BASE, 0x0201, METHOD_BUFFERED, FILE_READ_ACCESS)
+#define IOCTL_STORAGE_EJECT_MEDIA        CTL_CODE(IOCTL_STORAGE_BASE, 0x0202, METHOD_BUFFERED, FILE_READ_ACCESS)
+#define IOCTL_STORAGE_LOAD_MEDIA         CTL_CODE(IOCTL_STORAGE_BASE, 0x0203, METHOD_BUFFERED, FILE_READ_ACCESS)
+#define IOCTL_STORAGE_RESERVE            CTL_CODE(IOCTL_STORAGE_BASE, 0x0204, METHOD_BUFFERED, FILE_READ_ACCESS)
+#define IOCTL_STORAGE_RELEASE            CTL_CODE(IOCTL_STORAGE_BASE, 0x0205, METHOD_BUFFERED, FILE_READ_ACCESS)
+#define IOCTL_STORAGE_FIND_NEW_DEVICES   CTL_CODE(IOCTL_STORAGE_BASE, 0x0206, METHOD_BUFFERED, FILE_READ_ACCESS)
+
+#define IOCTL_STORAGE_GET_MEDIA_TYPES    CTL_CODE(IOCTL_STORAGE_BASE, 0x0300, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define IOCTL_STORAGE_GET_MEDIA_TYPES_EX CTL_CODE(IOCTL_STORAGE_BASE, 0x0301, METHOD_BUFFERED, FILE_ANY_ACCESS)
+
+#define IOCTL_STORAGE_RESET_BUS          CTL_CODE(IOCTL_STORAGE_BASE, 0x0400, METHOD_BUFFERED, FILE_READ_ACCESS)
+#define IOCTL_STORAGE_RESET_DEVICE       CTL_CODE(IOCTL_STORAGE_BASE, 0x0401, METHOD_BUFFERED, FILE_READ_ACCESS)
+#define IOCTL_STORAGE_GET_DEVICE_NUMBER  CTL_CODE(IOCTL_STORAGE_BASE, 0x0420, METHOD_BUFFERED, FILE_ANY_ACCESS)
+
+#define IOCTL_DISK_BASE                 FILE_DEVICE_DISK
+#define IOCTL_DISK_GET_DRIVE_GEOMETRY   CTL_CODE(IOCTL_DISK_BASE, 0x0000, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define IOCTL_DISK_GET_PARTITION_INFO   CTL_CODE(IOCTL_DISK_BASE, 0x0001, METHOD_BUFFERED, FILE_READ_ACCESS)
+#define IOCTL_DISK_SET_PARTITION_INFO   CTL_CODE(IOCTL_DISK_BASE, 0x0002, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
+#define IOCTL_DISK_GET_DRIVE_LAYOUT     CTL_CODE(IOCTL_DISK_BASE, 0x0003, METHOD_BUFFERED, FILE_READ_ACCESS)
+#define IOCTL_DISK_SET_DRIVE_LAYOUT     CTL_CODE(IOCTL_DISK_BASE, 0x0004, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
+#define IOCTL_DISK_VERIFY               CTL_CODE(IOCTL_DISK_BASE, 0x0005, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define IOCTL_DISK_FORMAT_TRACKS        CTL_CODE(IOCTL_DISK_BASE, 0x0006, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
+#define IOCTL_DISK_REASSIGN_BLOCKS      CTL_CODE(IOCTL_DISK_BASE, 0x0007, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
+#define IOCTL_DISK_PERFORMANCE          CTL_CODE(IOCTL_DISK_BASE, 0x0008, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define IOCTL_DISK_IS_WRITABLE          CTL_CODE(IOCTL_DISK_BASE, 0x0009, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define IOCTL_DISK_LOGGING              CTL_CODE(IOCTL_DISK_BASE, 0x000a, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define IOCTL_DISK_FORMAT_TRACKS_EX     CTL_CODE(IOCTL_DISK_BASE, 0x000b, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
+#define IOCTL_DISK_HISTOGRAM_STRUCTURE  CTL_CODE(IOCTL_DISK_BASE, 0x000c, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define IOCTL_DISK_HISTOGRAM_DATA       CTL_CODE(IOCTL_DISK_BASE, 0x000d, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define IOCTL_DISK_HISTOGRAM_RESET      CTL_CODE(IOCTL_DISK_BASE, 0x000e, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define IOCTL_DISK_REQUEST_STRUCTURE    CTL_CODE(IOCTL_DISK_BASE, 0x000f, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define IOCTL_DISK_REQUEST_DATA         CTL_CODE(IOCTL_DISK_BASE, 0x0010, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define IOCTL_DISK_CHECK_VERIFY         CTL_CODE(IOCTL_DISK_BASE, 0x0200, METHOD_BUFFERED, FILE_READ_ACCESS)
+#define IOCTL_DISK_MEDIA_REMOVAL        CTL_CODE(IOCTL_DISK_BASE, 0x0201, METHOD_BUFFERED, FILE_READ_ACCESS)
+#define IOCTL_DISK_EJECT_MEDIA          CTL_CODE(IOCTL_DISK_BASE, 0x0202, METHOD_BUFFERED, FILE_READ_ACCESS)
+#define IOCTL_DISK_LOAD_MEDIA           CTL_CODE(IOCTL_DISK_BASE, 0x0203, METHOD_BUFFERED, FILE_READ_ACCESS)
+#define IOCTL_DISK_RESERVE              CTL_CODE(IOCTL_DISK_BASE, 0x0204, METHOD_BUFFERED, FILE_READ_ACCESS)
+#define IOCTL_DISK_RELEASE              CTL_CODE(IOCTL_DISK_BASE, 0x0205, METHOD_BUFFERED, FILE_READ_ACCESS)
+#define IOCTL_DISK_FIND_NEW_DEVICES     CTL_CODE(IOCTL_DISK_BASE, 0x0206, METHOD_BUFFERED, FILE_READ_ACCESS)
+#define IOCTL_DISK_GET_MEDIA_TYPES      CTL_CODE(IOCTL_DISK_BASE, 0x0300, METHOD_BUFFERED, FILE_ANY_ACCESS)
+
+
+/* Start: For _WIN32_WINNT >= 0x0400 */ 
+#define IOCTL_DISK_CONTROLLER_NUMBER    CTL_CODE(IOCTL_DISK_BASE, 0x0011, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define SMART_GET_VERSION               CTL_CODE(IOCTL_DISK_BASE, 0x0020, METHOD_BUFFERED, FILE_READ_ACCESS)
+#define SMART_SEND_DRIVE_COMMAND        CTL_CODE(IOCTL_DISK_BASE, 0x0021, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
+#define SMART_RCV_DRIVE_DATA            CTL_CODE(IOCTL_DISK_BASE, 0x0022, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
+/* End: For _WIN32_WINNT >= 0x0400 */ 
+
+#define IOCTL_SERIAL_LSRMST_INSERT      CTL_CODE(FILE_DEVICE_SERIAL_PORT,31,METHOD_BUFFERED,FILE_ANY_ACCESS)
+
+
+/* Return Codes... should these be the same as something somewhere? */
+#define PARTITION_ENTRY_UNUSED          0x00      // Entry unused
+#define PARTITION_FAT_12                0x01      // 12-bit FAT entries
+#define PARTITION_XENIX_1               0x02      // Xenix
+#define PARTITION_XENIX_2               0x03      // Xenix
+#define PARTITION_FAT_16                0x04      // 16-bit FAT entries
+#define PARTITION_EXTENDED              0x05      // Extended partition entry
+#define PARTITION_HUGE                  0x06      // Huge partition MS-DOS V4
+#define PARTITION_IFS                   0x07      // IFS Partition
+#define PARTITION_FAT32                 0x0B      // FAT32
+#define PARTITION_FAT32_XINT13          0x0C      // FAT32 using extended int13 services
+#define PARTITION_XINT13                0x0E      // Win95 partition using extended int13 services
+#define PARTITION_XINT13_EXTENDED       0x0F      // Same as type 5 but uses extended int13 services
+#define PARTITION_PREP                  0x41      // PowerPC Reference Platform (PReP) Boot Partition
+#define PARTITION_LDM                   0x42      // Logical Disk Manager partition
+#define PARTITION_UNIX                  0x63      // Unix
+
+
+/* Device Io Stuff - Most VxD support.
+ * NOTE: All VxD messages seem to start with a hiword or 0
+ */
+typedef struct tagDIOCRegs {
+    DWORD   reg_EBX;
+    DWORD   reg_EDX;      
+    DWORD   reg_ECX;      
+    DWORD   reg_EAX;
+    DWORD   reg_EDI;
+    DWORD   reg_ESI;
+    DWORD   reg_Flags;
+} DIOC_REGISTERS, *PDIOC_REGISTERS;         
+
+/* Start VWIN32 information: 
+ * VWIN32 is a VxD which supports the MSDOS Io routines.
+ */
+#define VWIN32_DIOC_DOS_IOCTL     1 /* This is the specified MS-DOS device I/O ctl - Interrupt 21h Function 4400h - 4411h */
+#define VWIN32_DIOC_DOS_INT25     2 /* This is the Absolute Disk Read command - Interrupt 25h */
+#define VWIN32_DIOC_DOS_INT26     3 /* This is the Absolute Disk Write command - Interrupt 25h */
+#define VWIN32_DIOC_DOS_INT13     4 /* This is Interrupt 13h commands */
+#define VWIN32_DIOC_DOS_DRIVEINFO 6 /* This is Interrupt 21h Function 730X commands */
+
+/* Important: All MS_DOS data structures must be packed on a one-byte boundary - good old 16 bit. */
+
+#pragma pack(1)
+typedef struct tagMID {
+    WORD  midInfoLevel;
+    DWORD midSerialNum;
+    BYTE  midVolLabel[11];
+    BYTE  midFileSysType[8];
+} MID, *PMID;
+#pragma pack()
+
+/* End VWIN32 information */
+
+#endif
diff --git a/include/x11drv.h b/include/x11drv.h
index c96a6fc..d8e7d7a 100644
--- a/include/x11drv.h
+++ b/include/x11drv.h
@@ -20,6 +20,7 @@
     int          width;
     char *       dashes;
     int          dash_len;
+    int          type;          /* GEOMETRIC || COSMETIC */
 } X_PHYSPEN;
 
   /* X physical brush */
diff --git a/include/xmalloc.h b/include/xmalloc.h
index f054edd..78c355c 100644
--- a/include/xmalloc.h
+++ b/include/xmalloc.h
@@ -2,6 +2,7 @@
 #define __WINE_XMALLOC_H
 
 void *xmalloc( int size );
+void *xcalloc( int size );
 void *xrealloc( void *ptr, int size );
 char *xstrdup( const char *str );
 
diff --git a/loader/module.c b/loader/module.c
index 7b7ff65..2668174 100644
--- a/loader/module.c
+++ b/loader/module.c
@@ -173,6 +173,12 @@
             return (FARPROC16)PrintSetupDlgProc;
         if (!strcmp(name,"ReplaceTextDlgProc"))
             return (FARPROC16)ReplaceTextDlgProc16;
+        if (!strcmp(name,"DefResourceHandler"))
+            return (FARPROC16)NE_DefResourceHandler;
+        if (!strcmp(name,"LoadDIBIconHandler"))
+            return (FARPROC16)LoadDIBIconHandler;
+        if (!strcmp(name,"LoadDIBCursorHandler"))
+            return (FARPROC16)LoadDIBCursorHandler;
         FIXME(module,"No mapping for %s(), add one in library/miscstubs.c\n",name);
         assert( FALSE );
         return NULL;
@@ -236,7 +242,7 @@
 	    if (dotptr)	*dotptr		= '\0';
 	    if (xdotptr) *xdotptr	= '\0';
 	}
-	if (!lstrcmpi32A( filename, xmodname)) {
+	if (!strcasecmp( filename, xmodname)) {
 	    HeapFree(process->heap,0,filename);
 	    HeapFree(process->heap,0,xmodname);
 	    return wm->module;
diff --git a/loader/ne/module.c b/loader/ne/module.c
index e9b645c..148efbc 100644
--- a/loader/ne/module.c
+++ b/loader/ne/module.c
@@ -18,6 +18,7 @@
 #include "global.h"
 #include "process.h"
 #include "toolhelp.h"
+#include "snoop.h"
 #include "debug.h"
 
 static HMODULE16 hFirstModule = 0;
@@ -327,7 +328,10 @@
 
     if (sel == 0xfe) sel = 0xffff;  /* constant entry */
     else sel = (WORD)(DWORD)NE_SEG_TABLE(pModule)[sel-1].selector;
-    return (FARPROC16)PTR_SEG_OFF_TO_SEGPTR( sel, offset );
+    if (sel==0xffff)
+	return (FARPROC16)PTR_SEG_OFF_TO_SEGPTR( sel, offset );
+    else
+	return (FARPROC16)SNOOP16_GetProcAddress16(hModule,ordinal,(FARPROC16)PTR_SEG_OFF_TO_SEGPTR( sel, offset ));
 }
 
 
@@ -444,8 +448,6 @@
     /* We now have a valid NE header */
 
     size = sizeof(NE_MODULE) +
-             /* loaded file info */
-           sizeof(OFSTRUCT)-sizeof(ofs->szPathName)+strlen(ofs->szPathName)+1+
              /* segment table */
            ne_header.n_segment_tab * sizeof(SEGTABLEENTRY) +
              /* resource table */
@@ -457,9 +459,11 @@
              /* imported names table */
            ne_header.entry_tab_offset - ne_header.iname_tab_offset +
              /* entry table length */
-           ne_header.entry_tab_length;
+           ne_header.entry_tab_length +
+             /* loaded file info */
+           sizeof(OFSTRUCT)-sizeof(ofs->szPathName)+strlen(ofs->szPathName)+1;
 
-    hModule = GlobalAlloc16( GMEM_MOVEABLE | GMEM_ZEROINIT, size );
+    hModule = GlobalAlloc16( GMEM_FIXED | GMEM_ZEROINIT, size );
     if (!hModule) return (HMODULE16)11;  /* invalid exe */
     FarSetOwner( hModule, hModule );
     pModule = (NE_MODULE *)GlobalLock16( hModule );
@@ -494,14 +498,6 @@
         }
     }
 
-    /* Store the filename information */
-
-    pModule->fileinfo = (int)pData - (int)pModule;
-    size = sizeof(OFSTRUCT)-sizeof(ofs->szPathName)+strlen(ofs->szPathName)+1;
-    memcpy( pData, ofs, size );
-    ((OFSTRUCT *)pData)->cBytes = size - 1;
-    pData += size;
-
     /* Get the segment table */
 
     pModule->seg_table = (int)pData - (int)pModule;
@@ -605,6 +601,14 @@
     }
     pData += ne_header.entry_tab_length;
 
+    /* Store the filename information */
+
+    pModule->fileinfo = (int)pData - (int)pModule;
+    size = sizeof(OFSTRUCT)-sizeof(ofs->szPathName)+strlen(ofs->szPathName)+1;
+    memcpy( pData, ofs, size );
+    ((OFSTRUCT *)pData)->cBytes = size - 1;
+    pData += size;
+
     /* Free the fast-load area */
 
 #undef READ
@@ -650,6 +654,7 @@
     else pModule->dlls_to_init = 0;
 
     NE_RegisterModule( pModule );
+    SNOOP16_RegisterDLL(pModule,ofs->szPathName);
     return hModule;
 }
 
diff --git a/loader/ne/resource.c b/loader/ne/resource.c
index 7339467..c5d3fce 100644
--- a/loader/ne/resource.c
+++ b/loader/ne/resource.c
@@ -20,6 +20,7 @@
 #include "module.h"
 #include "neexe.h"
 #include "resource.h"
+#include "callback.h"
 #include "debug.h"
 
 #define NEXT_TYPEINFO(pTypeInfo) ((NE_TYPEINFO *)((char*)((pTypeInfo) + 1) + \
@@ -218,11 +219,13 @@
     NE_MODULE *pModule = NE_GetPtr( hModule );
     NE_TYPEINFO *pTypeInfo = (NE_TYPEINFO *)((char *)pModule + pModule->res_table + 2);
 
+    FARPROC16 handler = MODULE_GetWndProcEntry16("DefResourceHandler");
+
     TRACE(resource,"InitResourceHandler[%04x]\n", hModule );
 
     while(pTypeInfo->type_id)
     {
-	pTypeInfo->resloader = (FARPROC16)&NE_DefResourceHandler;
+	pTypeInfo->resloader = handler;
 	pTypeInfo = NEXT_TYPEINFO(pTypeInfo);
     }
     return TRUE;
@@ -450,7 +453,6 @@
 
     if (pNameInfo)
     {
-	RESOURCEHANDLER16 loader;
 	if (pNameInfo->handle
 	    && !(GlobalFlags16(pNameInfo->handle) & GMEM_DISCARDED))
 	{
@@ -461,16 +463,16 @@
 	else
 	{
 	    if (pTypeInfo->resloader)
-	  	loader = (RESOURCEHANDLER16)pTypeInfo->resloader;
+                pNameInfo->handle = Callbacks->CallResourceHandlerProc(
+                    pTypeInfo->resloader, pNameInfo->handle, hModule, hRsrc );
 	    else /* this is really bad */
 	    {
 		ERR(resource, "[%04x]: Missing resource handler!\n", hModule);
-		loader = NE_DefResourceHandler;
+                pNameInfo->handle = NE_DefResourceHandler(
+                                         pNameInfo->handle, hModule, hRsrc );
 	    }
 
-	    /* Finally call resource loader */
-
-	    if ((pNameInfo->handle = loader(pNameInfo->handle, hModule, hRsrc)))
+	    if (pNameInfo->handle)
 	    {
 		pNameInfo->usage++;
 		pNameInfo->flags |= NE_SEGFLAGS_LOADED;
diff --git a/loader/ne/segment.c b/loader/ne/segment.c
index 719d6d1..28caa77 100644
--- a/loader/ne/segment.c
+++ b/loader/ne/segment.c
@@ -349,7 +349,7 @@
                 if (next_offset == offset) break;  /* avoid infinite loop */
                 if (next_offset >= GlobalSize16(pSeg->selector)) break;
                 offset = next_offset;
-            } while (offset && (offset != 0xffff));
+            } while (offset != 0xffff);
         }
     }
 
diff --git a/loader/signal.c b/loader/signal.c
index 2e3dec6..0023c65 100644
--- a/loader/signal.c
+++ b/loader/signal.c
@@ -34,6 +34,8 @@
 #include "sig_context.h"
 #include "winsock.h"
 
+/* Global variable to save %fs register while in 16-bit code */
+WORD CALLTO16_Current_fs;
 
 /* Linux sigaction function */
 
diff --git a/loader/task.c b/loader/task.c
index a842c08..5483f0f 100644
--- a/loader/task.c
+++ b/loader/task.c
@@ -346,6 +346,7 @@
 
     cmd_line = pdb32->env_db->cmd_line;
     while (*cmd_line && (*cmd_line != ' ') && (*cmd_line != '\t')) cmd_line++;
+    while ((*cmd_line == ' ') || (*cmd_line == '\t')) cmd_line++;
     lstrcpyn32A( pTask->pdb.cmdLine+1, cmd_line, sizeof(pTask->pdb.cmdLine)-1);
     pTask->pdb.cmdLine[0] = strlen( pTask->pdb.cmdLine + 1 );
 
@@ -1245,10 +1246,9 @@
 /***********************************************************************
  *           GetExePtr   (KERNEL.133)
  */
-HMODULE16 WINAPI GetExePtr( HANDLE16 handle )
+static HMODULE16 GetExePtrHelper( HANDLE16 handle, HTASK16 *hTask )
 {
     char *ptr;
-    HTASK16 hTask;
     HANDLE16 owner;
 
       /* Check for module handle */
@@ -1256,31 +1256,60 @@
     if (!(ptr = GlobalLock16( handle ))) return 0;
     if (((NE_MODULE *)ptr)->magic == IMAGE_OS2_SIGNATURE) return handle;
 
+      /* Search for this handle inside all tasks */
+
+    *hTask = hFirstTask;
+    while (*hTask)
+    {
+        TDB *pTask = (TDB *)GlobalLock16( *hTask );
+        if ((*hTask == handle) ||
+            (pTask->hInstance == handle) ||
+            (pTask->hQueue == handle) ||
+            (pTask->hPDB == handle)) return pTask->hModule;
+        *hTask = pTask->hNext;
+    }
+
       /* Check the owner for module handle */
 
     owner = FarGetOwner( handle );
     if (!(ptr = GlobalLock16( owner ))) return 0;
     if (((NE_MODULE *)ptr)->magic == IMAGE_OS2_SIGNATURE) return owner;
 
-      /* Search for this handle and its owner inside all tasks */
+      /* Search for the owner inside all tasks */
 
-    hTask = hFirstTask;
-    while (hTask)
+    *hTask = hFirstTask;
+    while (*hTask)
     {
-        TDB *pTask = (TDB *)GlobalLock16( hTask );
-        if ((hTask == handle) ||
-            (pTask->hInstance == handle) ||
-            (pTask->hQueue == handle) ||
-            (pTask->hPDB == handle)) return pTask->hModule;
-        if ((hTask == owner) ||
+        TDB *pTask = (TDB *)GlobalLock16( *hTask );
+        if ((*hTask == owner) ||
             (pTask->hInstance == owner) ||
             (pTask->hQueue == owner) ||
             (pTask->hPDB == owner)) return pTask->hModule;
-        hTask = pTask->hNext;
+        *hTask = pTask->hNext;
     }
+
     return 0;
 }
 
+HMODULE16 WINAPI GetExePtr( HANDLE16 handle )
+{
+    HTASK16 dummy;
+    return GetExePtrHelper( handle, &dummy );
+}
+
+void WINAPI WIN16_GetExePtr( CONTEXT *context )
+{
+    WORD *stack = PTR_SEG_OFF_TO_LIN(SS_reg(context), SP_reg(context));
+    HANDLE16 handle = (HANDLE16)stack[2];
+    HTASK16 hTask = 0;
+    HMODULE16 hModule;
+
+    hModule = GetExePtrHelper( handle, &hTask );
+
+    AX_reg(context) = CX_reg(context) = hModule;
+    if (hTask) ES_reg(context) = hTask;
+}
+
 /***********************************************************************
  *           TaskFirst   (TOOLHELP.63)
  */
diff --git a/memory/virtual.c b/memory/virtual.c
index c033543..414e9ca 100644
--- a/memory/virtual.c
+++ b/memory/virtual.c
@@ -17,6 +17,7 @@
 #include "heap.h"
 #include "process.h"
 #include "xmalloc.h"
+#include "global.h"
 #include "debug.h"
 
 #ifndef MS_SYNC
@@ -36,15 +37,17 @@
 /* File view */
 typedef struct _FV
 {
-    struct _FV   *next;     /* Next view */
-    struct _FV   *prev;     /* Prev view */
-    UINT32        base;     /* Base address */
-    UINT32        size;     /* Size in bytes */
-    UINT32        flags;    /* Allocation flags */
-    UINT32        offset;   /* Offset from start of mapped file */
-    FILE_MAPPING *mapping;  /* File mapping */
-    BYTE          protect;  /* Protection for all pages at allocation time */
-    BYTE          prot[1];  /* Protection byte for each page */
+    struct _FV   *next;        /* Next view */
+    struct _FV   *prev;        /* Prev view */
+    UINT32        base;        /* Base address */
+    UINT32        size;        /* Size in bytes */
+    UINT32        flags;       /* Allocation flags */
+    UINT32        offset;      /* Offset from start of mapped file */
+    FILE_MAPPING *mapping;     /* File mapping */
+    HANDLERPROC   handlerProc; /* Fault handler */
+    LPVOID        handlerArg;  /* Fault handler argument */
+    BYTE          protect;     /* Protection for all pages at allocation time */
+    BYTE          prot[1];     /* Protection byte for each page */
 } FILE_VIEW;
 
 /* Per-page protection byte values */
@@ -501,6 +504,32 @@
 
 
 /***********************************************************************
+ *           VIRTUAL_SetFaultHandler
+ */
+BOOL32 VIRTUAL_SetFaultHandler( LPVOID addr, HANDLERPROC proc, LPVOID arg )
+{
+    FILE_VIEW *view;
+
+    if (!(view = VIRTUAL_FindView((UINT32)addr))) return FALSE;
+    view->handlerProc = proc;
+    view->handlerArg  = arg;
+    return TRUE;
+}
+
+/***********************************************************************
+ *           VIRTUAL_HandleFault
+ */
+BOOL32 VIRTUAL_HandleFault(LPVOID addr)
+{
+    FILE_VIEW *view = VIRTUAL_FindView((UINT32)addr);
+
+    if (view && view->handlerProc)
+        return view->handlerProc(view->handlerArg, addr);
+    return FALSE;
+}
+
+
+/***********************************************************************
  *             VirtualAlloc   (KERNEL32.548)
  * Reserves or commits a region of pages in virtual address space
  *
diff --git a/misc/callback.c b/misc/callback.c
index a39119a..3907fc3 100644
--- a/misc/callback.c
+++ b/misc/callback.c
@@ -116,6 +116,17 @@
     proc();
 }
 
+/**********************************************************************
+ *	     CALLBACK_CallResourceHandlerProc
+ */
+static HGLOBAL16 WINAPI CALLBACK_CallResourceHandlerProc( FARPROC16 proc,
+                                                          HGLOBAL16 hMemObj, 
+                                                          HMODULE16 hModule,
+                                                          HRSRC16 hRsrc )
+{
+    return proc( hMemObj, hModule, hRsrc );
+}
+
 
 /**********************************************************************
  *	     CALLBACK_CallASPIPostProc
@@ -227,32 +238,33 @@
  */
 static const CALLBACKS_TABLE CALLBACK_WinelibTable =
 {
-    CALLBACK_CallRegisterProc,     /* CallRegisterShortProc */
-    CALLBACK_CallRegisterProc,     /* CallRegisterLongProc */
-    TASK_Reschedule,               /* CallTaskRescheduleProc */
-    NULL,                          /* CallFrom16WndProc */
-    CALLBACK_CallWndProc,          /* CallWndProc */
-    CALLBACK_CallDriverProc,       /* CallDriverProc */
-    CALLBACK_CallDriverCallback,   /* CallDriverCallback */
-    CALLBACK_CallTimeFuncProc,     /* CallTimeFuncProc */
-    CALLBACK_CallWindowsExitProc,  /* CallWindowsExitProc */
-    CALLBACK_CallWordBreakProc,    /* CallWordBreakProc */
-    CALLBACK_CallBootAppProc,      /* CallBootAppProc */
-    CALLBACK_CallLoadAppSegProc,   /* CallLoadAppSegProc */
-    CALLBACK_CallSystemTimerProc,  /* CallSystemTimerProc */
-    CALLBACK_CallWOWCallbackProc,  /* CallWOWCallbackProc */
-    CALLBACK_CallWOWCallback16Ex,  /* CallWOWCallback16Ex */
-    CALLBACK_CallASPIPostProc,     /* CallASPIPostProc */
+    CALLBACK_CallRegisterProc,        /* CallRegisterShortProc */
+    CALLBACK_CallRegisterProc,        /* CallRegisterLongProc */
+    TASK_Reschedule,                  /* CallTaskRescheduleProc */
+    NULL,                             /* CallFrom16WndProc */
+    CALLBACK_CallWndProc,             /* CallWndProc */
+    CALLBACK_CallDriverProc,          /* CallDriverProc */
+    CALLBACK_CallDriverCallback,      /* CallDriverCallback */
+    CALLBACK_CallTimeFuncProc,        /* CallTimeFuncProc */
+    CALLBACK_CallWindowsExitProc,     /* CallWindowsExitProc */
+    CALLBACK_CallWordBreakProc,       /* CallWordBreakProc */
+    CALLBACK_CallBootAppProc,         /* CallBootAppProc */
+    CALLBACK_CallLoadAppSegProc,      /* CallLoadAppSegProc */
+    CALLBACK_CallSystemTimerProc,     /* CallSystemTimerProc */
+    CALLBACK_CallResourceHandlerProc, /* CallResourceHandlerProc */
+    CALLBACK_CallWOWCallbackProc,     /* CallWOWCallbackProc */
+    CALLBACK_CallWOWCallback16Ex,     /* CallWOWCallback16Ex */
+    CALLBACK_CallASPIPostProc,        /* CallASPIPostProc */
     /* The graphics driver callbacks are never used in Winelib */
-    NULL,                          /* CallDrvControlProc */
-    NULL,                          /* CallDrvEnableProc */
-    NULL,                          /* CallDrvEnumDFontsProc */
-    NULL,                          /* CallDrvEnumObjProc */
-    NULL,                          /* CallDrvOutputProc */
-    NULL,                          /* CallDrvRealizeProc */
-    NULL,                          /* CallDrvStretchBltProc */
-    NULL,                          /* CallDrvExtTextOutProc */
-    NULL                           /* CallDrvGetCharWidth */
+    NULL,                             /* CallDrvControlProc */
+    NULL,                             /* CallDrvEnableProc */
+    NULL,                             /* CallDrvEnumDFontsProc */
+    NULL,                             /* CallDrvEnumObjProc */
+    NULL,                             /* CallDrvOutputProc */
+    NULL,                             /* CallDrvRealizeProc */
+    NULL,                             /* CallDrvStretchBltProc */
+    NULL,                             /* CallDrvExtTextOutProc */
+    NULL                              /* CallDrvGetCharWidth */
 };
 
 const CALLBACKS_TABLE *Callbacks = &CALLBACK_WinelibTable;
diff --git a/misc/crtdll.c b/misc/crtdll.c
index 3b88c3f..c2f3750 100644
--- a/misc/crtdll.c
+++ b/misc/crtdll.c
@@ -306,7 +306,9 @@
     INT32 res;
 
     va_start( valist, format );
+#ifdef HAVE_VFSCANF
     res = vfscanf( xlat_file_ptr(stream), format, valist );
+#endif
     va_end( valist );
     return res;
 }
diff --git a/misc/imagelist.c b/misc/imagelist.c
index ecd6d31..5ca6e24 100644
--- a/misc/imagelist.c
+++ b/misc/imagelist.c
@@ -4,7 +4,7 @@
  *  Copyright 1998 Eric Kohl
  *
  *  TODO:
- *    - Fix offsets in ImageList_DrawIndirect.
+ *    - Fix xBitmap and yBitmap in ImageList_DrawIndirect.
  *    - Fix ILD_TRANSPARENT error in ImageList_DrawIndirect.
  *    - Fix ImageList_GetIcon (might be a result of the
  *      ILD_TRANSPARENT error in ImageList_DrawIndirect).
@@ -115,7 +115,7 @@
 
     if (himl->hbmMask) {
         hbmNewBitmap = 
-            CreateBitmap32 (nNewWidth, himl->cy, 1, 1, NULL);
+            CreateBitmap32 (nNewWidth, himl->cy, 1, himl->uBitsPixel, NULL);
 
         if (hbmNewBitmap == 0)
             ERR (imagelist, "creating new mask bitmap!");
@@ -274,10 +274,13 @@
     INT32    nIndex, nImageCount;
     BITMAP32 bmp;
     INT32    nStartX, nRunX, nRunY;
+    COLORREF bkColor;
 
     if (himl == NULL)
 	return (-1);
 
+    bkColor = (clrMask == CLR_NONE) ? himl->clrBk : clrMask;
+
     GetObject32A (hbmImage, sizeof(BITMAP32), &bmp);
     nImageCount = bmp.bmWidth / himl->cx;
 
@@ -303,8 +306,7 @@
         for (nRunY = 0; nRunY < himl->cy; nRunY++) {
             for (nRunX = 0; nRunX < bmp.bmWidth; nRunX++) {
                 if (GetPixel32 (hdcImageList, nStartX + nRunX, nRunY) ==
-                    clrMask)
-                {
+                    bkColor) {
                     SetPixel32 (hdcImageList, nStartX + nRunX, nRunY,
                                 RGB(0, 0, 0));
                     SetPixel32 (hdcMask, nStartX + nRunX, nRunY,
@@ -438,7 +440,8 @@
         /* create temporary bitmaps */
         hbmTempImage = CreateBitmap32 (himlSrc->cx, himlSrc->cy, 1,
                                        himlSrc->uBitsPixel, NULL);
-        hbmTempMask = CreateBitmap32 (himlSrc->cx, himlSrc->cy, 1, 1, NULL);
+        hbmTempMask = CreateBitmap32 (himlSrc->cx, himlSrc->cy, 1,
+				      himlSrc->uBitsPixel, NULL);
 
         /* copy (and stretch) destination to temporary bitmaps.(save) */
         /* image */
@@ -578,8 +581,8 @@
     }
 
     if (himl->flags & ILC_MASK) {
-        himl->hbmMask = 
-            CreateBitmap32 (himl->cx * himl->cMaxImage, himl->cy, 1, 1, NULL);
+        himl->hbmMask = CreateBitmap32 (himl->cx * himl->cMaxImage, himl->cy,
+					1, himl->uBitsPixel, NULL);
         if (himl->hbmMask == 0) {
             ERR(imagelist, "Error creating mask bitmap!\n");
             if (himl->hbmImage)
@@ -860,7 +863,7 @@
 
 BOOL32 WINAPI
 ImageList_DrawEx (HIMAGELIST himl, INT32 i, HDC32 hdc, INT32 x, INT32 y,
-		  INT32 xOffs, INT32 yOffs, COLORREF rgbBk, COLORREF rgbFg,
+		  INT32 dx, INT32 dy, COLORREF rgbBk, COLORREF rgbFg,
 		  UINT32 fStyle)
 {
     IMAGELISTDRAWPARAMS imldp;
@@ -871,8 +874,8 @@
     imldp.hdcDst  = hdc,
     imldp.x       = x;
     imldp.y       = y;
-    imldp.cx      = xOffs;
-    imldp.cy      = yOffs;
+    imldp.cx      = dx;
+    imldp.cy      = dy;
     imldp.xBitmap = 0;
     imldp.yBitmap = 0;
     imldp.rgbBk   = rgbBk;
@@ -904,6 +907,7 @@
     HDC32      hdcImageList, hdcTempImage;
     HBITMAP32  hbmTempImage;
     HBRUSH32   hBrush, hOldBrush;
+    INT32      cx, cy;
     INT32      nOvlIdx;
     COLORREF   clrBlend;
     BOOL32     bImage;       /* draw image ? */
@@ -920,7 +924,10 @@
 	return (FALSE);
 
     himlLocal = pimldp->himl;
-    
+
+    cx = (pimldp->cx == 0) ? himlLocal->cx : pimldp->cx;
+    cy = (pimldp->cy == 0) ? himlLocal->cy : pimldp->cy;
+
     /* ILD_NORMAL state */
     bImage      = TRUE;
     bImageTrans = FALSE;
@@ -967,31 +974,29 @@
 
     if (bMask)
     {
-        /* draw the mask */
-        SelectObject32 (hdcImageList, himlLocal->hbmMask);
-        
-        BitBlt32 (pimldp->hdcDst, pimldp->x, pimldp->y,
-                  himlLocal->cx, himlLocal->cy, hdcImageList,
-                  himlLocal->cx * pimldp->i, 0,
-                  bMaskTrans ? SRCAND : SRCCOPY);
+	/* draw the mask */
+	SelectObject32 (hdcImageList, himlLocal->hbmMask);
+	BitBlt32 (pimldp->hdcDst, pimldp->x, pimldp->y, cx, cy,
+		  hdcImageList, himlLocal->cx * pimldp->i, 0,
+		  bMaskTrans ? SRCAND : SRCCOPY);
     }
 
     if (bImage)
     {
-        /* draw the image */
-        SelectObject32 (hdcImageList, himlLocal->hbmImage);
+	/* draw the image */
+	SelectObject32 (hdcImageList, himlLocal->hbmImage);
 
         if (!bImageTrans)
         {
             hBrush = CreateSolidBrush32 (himlLocal->clrBk);
             hOldBrush = SelectObject32 (pimldp->hdcDst, hBrush);
             PatBlt32 (pimldp->hdcDst, pimldp->x, pimldp->y,
-                      himlLocal->cx, himlLocal->cy, PATCOPY);
+                      cx, cy, PATCOPY);
             DeleteObject32 (SelectObject32 (pimldp->hdcDst, hOldBrush));
         }
 
-        BitBlt32 (pimldp->hdcDst, pimldp->x, pimldp->y, himlLocal->cx,
-                  himlLocal->cy, hdcImageList, himlLocal->cx * pimldp->i, 0,
+        BitBlt32 (pimldp->hdcDst, pimldp->x, pimldp->y, cx, cy,
+                  hdcImageList, himlLocal->cx * pimldp->i, 0,
                   SRCPAINT);
 
         if (bBlend25 || bBlend50)
@@ -1017,8 +1022,8 @@
                       himlLocal->cy, hdcImageList, 
                       pimldp->i * himlLocal->cx, 0, SRCPAINT);
 
-            BitBlt32 (pimldp->hdcDst, pimldp->x, pimldp->y, himlLocal->cx,
-                      himlLocal->cy, hdcTempImage, 0, 0, SRCAND);
+            BitBlt32 (pimldp->hdcDst, pimldp->x, pimldp->y, cx, cy,
+		      hdcTempImage, 0, 0, SRCAND);
 
             /* fill */
             hBrush = CreateSolidBrush32 (clrBlend);
@@ -1035,8 +1040,8 @@
                       himlLocal->cy, hdcImageList, 
                       pimldp->i * himlLocal->cx, 0, SRCPAINT);
 
-            BitBlt32 (pimldp->hdcDst, pimldp->x, pimldp->y, himlLocal->cx,
-                      himlLocal->cy, hdcTempImage, 0, 0, SRCPAINT);
+            BitBlt32 (pimldp->hdcDst, pimldp->x, pimldp->y, cx, cy,
+                      hdcTempImage, 0, 0, SRCPAINT);
 
             DeleteObject32 (hbmTempImage);
             DeleteDC32 (hdcTempImage);
@@ -1044,24 +1049,20 @@
     }   
 
     /* Draw overlay image */
-    if (pimldp->fStyle & 0x0700)
-    {
-        nOvlIdx = (pimldp->fStyle & 0x0700) >> 8;
-        if ((nOvlIdx >= 1) && (nOvlIdx <= MAX_OVERLAYIMAGE))
-        {
-            nOvlIdx = pimldp->himl->nOvlIdx[nOvlIdx - 1];
-            if ((nOvlIdx >= 0) && (nOvlIdx <= pimldp->himl->cCurImage))
-            {
-                if (pimldp->himl->hbmMask)
-                {  
+    if (pimldp->fStyle & 0x0700) {
+	nOvlIdx = (pimldp->fStyle & 0x0700) >> 8;
+	if ((nOvlIdx >= 1) && (nOvlIdx <= MAX_OVERLAYIMAGE)) {
+	    nOvlIdx = pimldp->himl->nOvlIdx[nOvlIdx - 1];
+	    if ((nOvlIdx >= 0) && (nOvlIdx <= pimldp->himl->cCurImage)) {
+		if (pimldp->himl->hbmMask) {  
                     SelectObject32 (hdcImageList, pimldp->himl->hbmMask);
-                    BitBlt32 (pimldp->hdcDst, pimldp->x, pimldp->y, 
-                              pimldp->himl->cx, pimldp->himl->cy, hdcImageList,
-                              pimldp->himl->cx * nOvlIdx, 0, SRCAND);  
-                }  
+                    BitBlt32 (pimldp->hdcDst, pimldp->x, pimldp->y, cx, cy,
+                              hdcImageList, pimldp->himl->cx * nOvlIdx, 0,
+			      SRCAND);
+		}  
                 SelectObject32 (hdcImageList, pimldp->himl->hbmImage);
-                BitBlt32 (pimldp->hdcDst, pimldp->x, pimldp->y, 
-                          pimldp->himl->cx, pimldp->himl->cy, hdcImageList,
+                BitBlt32 (pimldp->hdcDst, pimldp->x, pimldp->y,
+                          cx, cy, hdcImageList,
                           pimldp->himl->cx * nOvlIdx, 0, SRCPAINT);
             }
         }
@@ -1745,7 +1746,7 @@
             DeleteObject32 (himl->hbmMask);
             himl->hbmMask =
                 CreateBitmap32 (himl->cMaxImage * himl->cx, himl->cy,
-                                1, 1, NULL);
+                                1, himl->uBitsPixel, NULL);
         }
     }
     else {
@@ -1764,7 +1765,7 @@
             CreateBitmap32 (cxNew, himl->cy, 1, himl->uBitsPixel, NULL);
 
         if (himl->hbmMask)
-            hbmNewMask = CreateBitmap32 (cxNew, himl->cy, 1, 1, NULL);
+            hbmNewMask = CreateBitmap32 (cxNew, himl->cy, 1, himl->uBitsPixel, NULL);
         else
             hbmNewMask = 0;  /* Just to keep compiler happy! */
 
@@ -2122,7 +2123,7 @@
         DeleteObject32 (himl->hbmMask);
         himl->hbmMask =
             CreateBitmap32 (himl->cMaxImage * himl->cx, himl->cy,
-                            1, 1, NULL);
+                            1, himl->uBitsPixel, NULL);
     }
 
     return (TRUE);
@@ -2179,7 +2180,7 @@
     if (himl->hbmMask)
     {
         hbmNewBitmap = CreateBitmap32 (nNewCount * himl->cx, himl->cy,
-                                       1, 1, NULL);
+                                       1, himl->uBitsPixel, NULL);
         if (hbmNewBitmap != 0)
         {
             SelectObject32 (hdcImageList, himl->hbmMask);
diff --git a/misc/lstr.c b/misc/lstr.c
index 043a778..0255049 100644
--- a/misc/lstr.c
+++ b/misc/lstr.c
@@ -43,13 +43,13 @@
 /* FIXME: should probably get rid of wctype.h altogether */
 #include "casemap.h"
 
-WCHAR _towupper(WCHAR code)
+WCHAR towupper(WCHAR code)
 {
     const WCHAR * ptr = uprtable[HIBYTE(code)];
     return ptr ? ptr[LOBYTE(code)] : code;
 }
 
-WCHAR _towlower(WCHAR code)
+WCHAR towlower(WCHAR code)
 {
     const WCHAR * ptr = lwrtable[HIBYTE(code)];
     return ptr ? ptr[LOBYTE(code)] : code;
@@ -171,15 +171,10 @@
 void WINAPI OutputDebugString16( LPCSTR str )
 {
     char module[10];
-    char *p, *buffer = HeapAlloc( GetProcessHeap(), 0, strlen(str)+2 );
-    /* Remove CRs */
-    for (p = buffer; *str; str++) if (*str != '\r') *p++ = *str;
-    *p = '\0';
-    if ((p > buffer) && (p[-1] == '\n')) p[1] = '\0'; /* Remove trailing \n */
     if (!GetModuleName( GetCurrentTask(), module, sizeof(module) ))
         strcpy( module, "???" );
-    DUMP("%s says '%s'\n", module, buffer );
-    HeapFree( GetProcessHeap(), 0, buffer );
+
+    DUMP( "%s says %s\n", module, debugstr_a(str) );
 }
 
 
diff --git a/misc/main.c b/misc/main.c
index 8db0f9d..9819e55 100644
--- a/misc/main.c
+++ b/misc/main.c
@@ -212,6 +212,9 @@
   /* defined in relay32/relay386.c */
   extern char **debug_relay_includelist;
   extern char **debug_relay_excludelist;
+  /* defined in relay32/snoop.c */
+  extern char **debug_snoop_includelist;
+  extern char **debug_snoop_excludelist;
 
   int l, cls;
   if (strlen(options)<3)
@@ -247,13 +250,14 @@
 	    if(cls == -1 || cls == j)
 	      debug_msg_enabled[i][j]=(*options=='+');
       }
-    else if (!lstrncmpi32A(options+1, "relay=", 6))
+    else if (!lstrncmpi32A(options+1, "relay=", 6) ||
+	     !lstrncmpi32A(options+1, "snoop=", 6))
       {
 	int i, j;
 	char *s, *s2, ***output, c;
 
 	for (i=0; i<DEBUG_CHANNEL_COUNT; i++)
-	  if (debug_ch_name && (!lstrncmpi32A(debug_ch_name[i],"relay",5))){
+	  if (debug_ch_name && (!lstrncmpi32A(debug_ch_name[i],options+1,5))){
 	    for(j=0; j<DEBUG_CLASS_COUNT; j++)
 	      if(cls == -1 || cls == j)
 		debug_msg_enabled[i][j]=TRUE;
@@ -262,10 +266,13 @@
 	/* should never happen, maybe assert(i!=DEBUG_CHANNEL_COUNT)? */
 	if (i==DEBUG_CHANNEL_COUNT)
 	  return FALSE;
-	if (*options == '+')
-	  output = &debug_relay_includelist;
-	else
-	  output = &debug_relay_excludelist;
+	output = (*options == '+') ?
+			((*(options+1) == 'r') ?
+				&debug_relay_includelist :
+				&debug_snoop_includelist) :
+			((*(options+1) == 'r') ?
+				&debug_relay_excludelist :
+				&debug_snoop_excludelist);
 	s = options + 7;
 	i = 1;
 	while((s = strchr(s, ':'))) i++, s++;
@@ -448,8 +455,13 @@
 	    int i;
 	    MSG("%s: Syntax: -debugmsg [class]+xxx,...  or "
 		    "-debugmsg [class]-xxx,...\n",argv[0]);
-	    MSG("Example: -debugmsg +all,warn-heap"
-		    "turn on all messages except warning heap messages\n");
+	    MSG("Example: -debugmsg +all,warn-heap\n"
+		    "  turn on all messages except warning heap messages\n");
+	    MSG("Special case: -debugmsg +relay=DLL:DLL.###:FuncName\n"
+		"  turn on -debugmsg +relay only as specified\n"
+		"Special case: -debugmsg -relay=DLL:DLL.###:FuncName\n"
+		"  turn on -debugmsg +relay except as specified\n"
+		"Also permitted, +snoop=..., -snoop=... as with relay.\n\n");
 
 	    MSG("Available message classes:\n");
 	    for(i=0;i<DEBUG_CLASS_COUNT;i++)
diff --git a/misc/ntdll.c b/misc/ntdll.c
index d265d92..169cf45 100644
--- a/misc/ntdll.c
+++ b/misc/ntdll.c
@@ -17,6 +17,7 @@
 #include "debug.h"
 #include "module.h"
 #include "heap.h"
+#include "debugstr.h"
 
 /**************************************************************************
  *                 RtlLengthRequiredSid			[NTDLL]
@@ -680,3 +681,34 @@
 	return 0;
 #endif
 }
+
+DWORD WINAPI NtOpenKey(DWORD x1,DWORD x2,DWORD x3) {
+	FIXME(ntdll,"(0x%08lx(%s),0x%08lx,0x%08lx),stub!\n",x1,
+		debugstr_w(*(LPWSTR*)x1),x2,x3);
+	/* hmm... */
+	return RegOpenKey32W(x2,*(LPWSTR*)x1,x3);
+}
+
+DWORD WINAPI NtQueryValueKey(DWORD x1,DWORD x2,DWORD x3,DWORD x4,DWORD x5,DWORD x6) {
+	FIXME(ntdll,"(%08lx,%08lx,%08lx,%08lx,%08lx,%08lx),stub!\n",
+		x1,x2,x3,x4,x5,x6
+	);
+	return 0;
+}
+
+DWORD WINAPI NtQueryTimerResolution(DWORD x1,DWORD x2,DWORD x3) {
+	FIXME(ntdll,"(0x%08lx,0x%08lx,0x%08lx), stub!\n",x1,x2,x3);
+	return 1;
+}
+
+DWORD WINAPI NtClose(DWORD x1) {
+	FIXME(ntdll,"(0x%08lx),stub!\n",x1);
+	return 1;
+}
+
+DWORD WINAPI NtQueryInformationProcess(DWORD x1,DWORD x2,DWORD x3,DWORD x4,DWORD x5) {
+	FIXME(ntdll,"(0x%08lx,0x%08lx,0x%08lx,0x%08lx,0x%08lx),stub!\n",
+		x1,x2,x3,x4,x5
+	);
+	return 0;
+}
diff --git a/misc/shell.c b/misc/shell.c
index 40a8084..b140083 100644
--- a/misc/shell.c
+++ b/misc/shell.c
@@ -1,5 +1,8 @@
 /*
  * 				Shell Library Functions
+ *
+ *  currently work in progress on SH* and SHELL32_DllGetClassObject functions
+ *  <contact juergen.schmied@metronet.de 980624>
  */
 #include <assert.h>
 #include <stdlib.h>
@@ -1172,7 +1175,7 @@
 	for (i=0;i<n;i++) {
 	    LPIMAGE_RESOURCE_DIRECTORY	xresdir;
 
-	    xresdir = GetResDirEntryW(iconresdir,(LPWSTR)&(RetPtr[i]),(DWORD)rootresdir,FALSE);
+	    xresdir = GetResDirEntryW(iconresdir,(LPWSTR)RetPtr[i],(DWORD)rootresdir,FALSE);
 	    xresdir = GetResDirEntryW(xresdir,(LPWSTR)0,(DWORD)rootresdir,TRUE);
 
 	    idataent = (LPIMAGE_RESOURCE_DATA_ENTRY)xresdir;
@@ -1580,6 +1583,7 @@
     char	xclsid[50],xiid[50];
     HRESULT	hres = E_OUTOFMEMORY;
 
+
     WINE_StringFromCLSID((LPCLSID)rclsid,xclsid);
     WINE_StringFromCLSID((LPCLSID)iid,xiid);
     TRACE(shell,"(%s,%s,%p)\n",xclsid,xiid,ppv);
@@ -1594,23 +1598,24 @@
     
     if (pClassFactory) {
     	hRes = pClassFactory->QueryInterface(riid,ppv);
-	pClassFactory->Release();
+		pClassFactory->Release();
     }
     return hRes;
  *
  * The magic of the whole stuff is still unclear to me, so just hack together 
- * something.
+ * something.   
  */
   
-    if (!memcmp(rclsid,&CLSID_ShellDesktop,sizeof(CLSID_ShellDesktop))) {
-    	TRACE(shell,"   requested CLSID_ShellDesktop, creating it.\n");
-	*ppv = IShellFolder_Constructor();
-	FIXME(shell,"Initialize this folder to be the shell desktop folder\n");
-	return 0;
-    }
+  if (!memcmp(rclsid,&CLSID_ShellDesktop,sizeof(CLSID_ShellDesktop)))
+	{	TRACE(shell,"   requested CLSID_ShellDesktop, creating it.\n");
+  	*ppv = IShellFolder_Constructor();
+/*		FIXME(shell,"Initialize this folder to be the shell desktop folder\n")*/
+		return S_OK;
+	}
 
-    FIXME(shell, "clsid(%s) not found.  Returning E_OUTOFMEMORY.\n",xclsid);
-    return hres;
+	FIXME(shell, "clsid(%s) not found, return CLASS_E_CLASSNOTAVAILABLE.\n",xclsid);
+	*ppv=NULL;
+	return CLASS_E_CLASSNOTAVAILABLE;
 }
 
 /*************************************************************************
@@ -1651,11 +1656,51 @@
  *
  * nFolder is a CSIDL_xxxxx.
  */
-HRESULT WINAPI SHGetSpecialFolderLocation(HWND32 hwndOwner, INT32 nFolder, LPITEMIDLIST * ppidl) {
-	FIXME(shell,"(%04x,%d,%p),stub!\n", hwndOwner,nFolder,ppidl);
-	*ppidl = (LPITEMIDLIST)HeapAlloc(GetProcessHeap(),0,2*sizeof(ITEMIDLIST));
-	FIXME(shell, "we return only the empty ITEMIDLIST currently.\n");
-	(*ppidl)->mkid.cb = 0;
+HRESULT WINAPI SHGetSpecialFolderLocation(HWND32 hwndOwner, INT32 nFolder, LPITEMIDLIST * ppidl)
+{	FIXME(shell,"(%04x,%d,%p),stub!\n", hwndOwner,nFolder,ppidl);
+
+	switch (nFolder)
+	{	case CSIDL_BITBUCKET:					TRACE (shell,"looking for Recyceler\n");
+																	break;
+		case CSIDL_CONTROLS:				  TRACE (shell,"looking for Control\n");
+																	break;
+		case CSIDL_DESKTOP:			  		TRACE (shell,"looking for Desktop\n");
+																	break;
+		case CSIDL_DESKTOPDIRECTORY:  TRACE (shell,"looking for DeskDir\n");
+																	break;
+		case CSIDL_DRIVES:			  		TRACE (shell,"looking for Drives\n");
+																	break;
+		case CSIDL_FONTS:			  			TRACE (shell,"looking for Fonts\n");
+																	break;
+		case CSIDL_NETHOOD:			  		TRACE (shell,"looking for Nethood\n");
+																	break;
+		case CSIDL_NETWORK:			  		TRACE (shell,"looking for Network\n");
+																	break;
+		case CSIDL_PERSONAL:			  	TRACE (shell,"looking for Personal\n");
+																	break;
+		case CSIDL_PRINTERS:			    TRACE (shell,"looking for Printers\n");
+																	break;
+		case CSIDL_PROGRAMS:				  TRACE (shell,"looking for Programms\n");
+																	break;
+		case CSIDL_RECENT:			  		TRACE (shell,"looking for Recent\n");
+																	break;
+		case CSIDL_SENDTO:			  		TRACE (shell,"looking for Sendto\n");
+																	break;
+		case CSIDL_STARTMENU:			  	TRACE (shell,"looking for Startmenu\n");
+																	break;
+		case CSIDL_STARTUP:			  		TRACE (shell,"looking for Startup\n");
+																	break;
+		case CSIDL_TEMPLATES:			  	TRACE (shell,"looking for Templates\n");
+																	break;
+		default:			  							ERR (shell,"unknown CSIDL\n");
+																	break;
+	}
+
+	*ppidl = (LPITEMIDLIST)HeapAlloc(GetProcessHeap(),0,sizeof(ITEMIDLIST));
+	(*ppidl)->mkid.cb = 0;		/*the first ITEMIDLIST*/
+
+	FIXME(shell, "return empty ITEMIDLIST only (pidl %p)\n",*ppidl);
+
 	return NOERROR;
 }
 
@@ -1663,9 +1708,9 @@
  *			 SHGetPathFromIDList		[SHELL32.221]
  * returns the path from a passed PIDL.
  */
-BOOL32 WINAPI SHGetPathFromIDList(LPCITEMIDLIST pidl,LPSTR pszPath) {
-	FIXME(shell,"(%p,%p),stub!\n",pidl,pszPath);
-	lstrcpy32A(pszPath,"E:\\"); /* FIXME */
+BOOL32 WINAPI SHGetPathFromIDList(LPCITEMIDLIST pidl,LPSTR pszPath) 
+{	FIXME(shell,"(pidl %p,%p),stub, returning E:\\\\ \n",pidl,pszPath);
+	strcpy(pszPath,"E:\\"); /* FIXME */
 	return NOERROR;
 }
 
@@ -1683,3 +1728,18 @@
     return 0;
 }
 
+
+/*************************************************************************
+ * SHBrowseForFolderA [SHELL32.209]
+ *
+ */
+
+LPITEMIDLIST WINAPI
+SHBrowseForFolder32A (LPBROWSEINFO32A lpbi)
+{
+    FIXME (exec, "(%lx) empty stub!\n", (DWORD)lpbi);
+    FIXME (exec, "(%s) empty stub!\n", lpbi->lpszTitle);
+
+    return NULL;
+}
+
diff --git a/misc/shellord.c b/misc/shellord.c
index 62de68b..432e5ca 100644
--- a/misc/shellord.c
+++ b/misc/shellord.c
@@ -68,9 +68,9 @@
  *     Original Name: PathIsRoot
  */
 BOOL32 WINAPI SHELL32_29(LPCSTR x) {
-	if (!lstrcmp32A(x+1,":\\"))		/* "X:\" */
+	if (!strcmp(x+1,":\\"))		/* "X:\" */
 		return 1;
-	if (!lstrcmp32A(x,"\\"))		/* "\" */
+	if (!strcmp(x,"\\"))		/* "\" */
 		return 1;
 	if (x[0]=='\\' && x[1]=='\\') {		/* UNC "\\<xx>\" */
 		int	foundbackslash = 0;
@@ -400,7 +400,7 @@
  *     Original name: RegisterShellHook (exported by ordinal)
  */
 void WINAPI SHELL32_181(HWND32 hwnd, DWORD y) {
-    FIXME(shell,"(0x%08lx,0x%08lx):stub.\n",hwnd,y);
+    FIXME(shell,"(0x%08lx,0x%08x):stub.\n",hwnd,y);
 }
 
 /*************************************************************************
@@ -441,7 +441,7 @@
 	FARPROC32	dllunload,nameproc;
 
 	if (xhmod) *xhmod = 0;
-	if (!lstrcmpi32A(SHELL32_34(dllname),"shell32.dll"))
+	if (!strcasecmp(SHELL32_34(dllname),"shell32.dll"))
 		return (GetClassPtr)SHELL32_DllGetClassObject;
 
 	hmod = LoadLibraryEx32A(dllname,0,LOAD_WITH_ALTERED_SEARCH_PATH);
@@ -607,6 +607,8 @@
 	LPSHITEMID	si;
 	DWORD		len;
 
+	if (!iil)
+		return 0;
 	si = &(iil->mkid);
 	len = 2;
 	while (si->cb) {
@@ -639,6 +641,9 @@
 /*************************************************************************
  *	 		 SHELL32_195   			[SHELL32.195]
  * free_ptr() - frees memory using IMalloc
+ *
+ * NOTES
+ *     Original name: SHFree (exported by ordinal)
  */
 DWORD WINAPI SHELL32_195(LPVOID x) {
 	return LocalFree32((HANDLE32)x);
@@ -662,7 +667,8 @@
 
 	len = SHELL32_152(iil);
 	newiil = (LPITEMIDLIST)SHELL32_196(len);
-	memcpy(newiil,iil,len);
+	if (newiil)
+		memcpy(newiil,iil,len);
 	return newiil;
 }
 
@@ -685,16 +691,22 @@
 /*************************************************************************
  *	 		 SHELL32_155   			[SHELL32.155]
  * free_check_ptr - frees memory (if not NULL) allocated by SHMalloc allocator
+ *
+ * NOTES
+ *     Original name: ILFree (exported by ordinal)
  */
 DWORD WINAPI SHELL32_155(LPVOID x) {
-	if (!x)
+	FIXME (shell,"(0x%08lx):stub.\n", (DWORD)x);
+//	if (!x)
 		return 0;
-	return SHELL32_195(x);
+//	return SHELL32_195(x);
 }
 
 /*************************************************************************
  * SHELL32_85 [SHELL32.85]
- * unknown
+ *
+ * NOTES
+ *     Original name: OpenRegStream (exported by ordinal)
  */
 DWORD WINAPI SHELL32_85(DWORD x1,DWORD x2,DWORD x3,DWORD x4) {
     FIXME(shell,"(0x%08lx,0x%08lx,0x%08lx,0x%08lx):stub.\n",
@@ -706,15 +718,21 @@
 /*************************************************************************
  * SHELL32_86 [SHELL32.86]
  * unknown
+ *
+ * NOTES
+ *     Original name: SHRegisterDragDrop (exported by ordinal)
  */
 DWORD WINAPI SHELL32_86(HWND32 hwnd,DWORD x2) {
-    FIXME(shell,"(0x%08lx,0x%08lx):stub.\n",hwnd,x2);
+    FIXME (shell, "(0x%08lx,0x%08x):stub.\n", hwnd, x2);
     return 0;
 }
 
 /*************************************************************************
  * SHELL32_87 [SHELL32.87]
  * unknown
+ *
+ * NOTES
+ *     Original name: SHRevokeDragDrop (exported by ordinal)
  */
 DWORD WINAPI SHELL32_87(DWORD x) {
     FIXME(shell,"(0x%08lx):stub.\n",x);
@@ -724,13 +742,15 @@
 
 /*************************************************************************
  * SHELL32_61 [SHELL32.61]
- * Shell/Run-Dialog
+ *
+ * NOTES
+ *     Original name: RunFileDlg (exported by ordinal)
  */
 DWORD WINAPI
 SHELL32_61 (HWND32 hwndOwner, DWORD dwParam1, DWORD dwParam2,
 	    LPSTR lpszTitle, LPSTR lpszPrompt, UINT32 uFlags)
 {
-    FIXME (shell,"(0x%08x 0x%lx 0x%lx \"%s\" \"%s\" 0x%lx):stub.\n",
+    FIXME (shell,"(0x%08x 0x%lx 0x%lx \"%s\" \"%s\" 0x%x):stub.\n",
 	   hwndOwner, dwParam1, dwParam2, lpszTitle, lpszPrompt, uFlags);
     return 0;
 }
@@ -761,3 +781,17 @@
     return 0;
 }
 
+
+/*************************************************************************
+ * SHELL32_147 [SHELL32.147]
+ *
+ * NOTES
+ *     Original name: SHCLSIDFromString (exported by ordinal)
+ */
+DWORD WINAPI
+SHELL32_147 (DWORD dwParam1, DWORD dwParam2)
+{
+    FIXME (shell,"(0x%lx 0x%lx):stub.\n", dwParam1, dwParam2);
+    return 0;
+}
+
diff --git a/misc/toolhelp.c b/misc/toolhelp.c
index 606416b..c3cb60a 100644
--- a/misc/toolhelp.c
+++ b/misc/toolhelp.c
@@ -101,3 +101,12 @@
 	/* just return previously installed notification function */
 	return tmp;
 }
+
+/***********************************************************************
+ *           CreateToolHelp32Snapshot			(KERNEL32.179)
+ *	see "Undocumented Windows"
+ */
+HANDLE32 WINAPI CreateToolhelp32Snapshot(DWORD dwFlags, DWORD th32ProcessID) {
+	FIXME(toolhelp,"(0x%08lx,0x%08lx), stub!\n",dwFlags,th32ProcessID);
+	return INVALID_HANDLE_VALUE32;
+}
diff --git a/misc/winsock.c b/misc/winsock.c
index 44c1ecd..5eb67d5 100644
--- a/misc/winsock.c
+++ b/misc/winsock.c
@@ -65,8 +65,6 @@
 
 /* ----------------------------------- internal data */
 
-extern int h_errno;
-
 static HANDLE32 	_WSHeap = 0;
 static unsigned char*	_ws_stub = NULL;
 static LPWSINFO         _wsi_list = NULL;
@@ -2570,9 +2568,9 @@
 {
     int	loc_errno = errno; 
 #ifdef HAVE_STRERROR
-    WARN(winsock, "errno %d, (%s).\n", errno, strerror(errno));
+    WARN(winsock, "errno %d, (%s).\n", loc_errno, strerror(loc_errno));
 #else
-    WARN(winsock, "errno %d\n", errno);
+    WARN(winsock, "errno %d\n", loc_errno);
 #endif
 
     switch(loc_errno)
@@ -2635,7 +2633,7 @@
        /* just in case we ever get here and there are no problems */
 	case 0:			return 0;
         default:
-		WARN(winsock, "Unknown errno %d!\n", errno);
+		WARN(winsock, "Unknown errno %d!\n", loc_errno);
 		return WSAEOPNOTSUPP;
     }
 }
@@ -2644,11 +2642,7 @@
 {
     int		loc_errno = h_errno;
 
-#ifdef HAVE_STRERROR
-    WARN(winsock, "h_errno %d, (%s).\n", h_errno, strerror(h_errno));
-#else
-    WARN(winsock, "h_errno %d.\n", h_errno);
-#endif
+    WARN(winsock, "h_errno %d.\n", loc_errno);
 
     switch(loc_errno)
     {
@@ -2659,7 +2653,7 @@
 
 	case 0:			return 0;
         default:
-		WARN(winsock,"Unknown h_errno %d!\n", h_errno);
+		WARN(winsock,"Unknown h_errno %d!\n", loc_errno);
 		return WSAEOPNOTSUPP;
     }
 }
diff --git a/misc/winsock_dns.c b/misc/winsock_dns.c
index 3cb1fe0..baf9b9f 100644
--- a/misc/winsock_dns.c
+++ b/misc/winsock_dns.c
@@ -33,8 +33,6 @@
 # include <sys/file.h>
 #endif
 
-extern int h_errno;
-
 #include "winsock.h"
 #include "windows.h"
 #include "heap.h"
diff --git a/misc/xmalloc.c b/misc/xmalloc.c
index 3faa6a8..0e757e8 100644
--- a/misc/xmalloc.c
+++ b/misc/xmalloc.c
@@ -28,6 +28,16 @@
         MSG("Virtual memory exhausted.\n");
         exit (1);
     }
+    memset(res,0,size);
+    return res;
+}
+
+void *xcalloc( int size )
+{
+    void *res;
+
+    res = xmalloc (size);
+    memset(res,0,size);
     return res;
 }
 
diff --git a/miscemu/instr.c b/miscemu/instr.c
index 465f16c..41eaa5b 100644
--- a/miscemu/instr.c
+++ b/miscemu/instr.c
@@ -6,6 +6,7 @@
 
 #include "windows.h"
 #include "ldt.h"
+#include "global.h"
 #include "miscemu.h"
 #include "sig_context.h"
 #include "debug.h"
@@ -296,6 +297,13 @@
     int prefix, segprefix, prefixlen, len, repX, long_op, long_addr;
     BYTE *instr;
 
+    /* Check for page-fault */
+
+#if defined(TRAP_sig) && defined(CR2_sig)
+    if (TRAP_sig(context) == 0x0e
+        && VIRTUAL_HandleFault( (LPVOID)CR2_sig(context) )) return TRUE;
+#endif
+
     long_op = long_addr = IS_SELECTOR_32BIT(CS_sig(context));
     instr = (BYTE *)MAKE_PTR(CS_sig(context),EIP_sig(context));
     if (!instr) return FALSE;
diff --git a/miscemu/main.c b/miscemu/main.c
index 4174b0e..4eac2c4 100644
--- a/miscemu/main.c
+++ b/miscemu/main.c
@@ -12,6 +12,7 @@
 #include "options.h"
 #include "process.h"
 #include "win16drv.h"
+#include "psdrv.h"
 #include "windows.h"
 
 
@@ -32,6 +33,9 @@
     /* Create the Win16 printer driver */
     if (!WIN16DRV_Init()) return FALSE;
 
+    /* Create the Postscript printer driver (FIXME: should be in Winelib) */
+    if (!PSDRV_Init()) return FALSE;
+
     /* Initialize all the USER stuff */
     return MAIN_UserInit();
 }
diff --git a/msdos/dpmi.c b/msdos/dpmi.c
index 4edbc9e..1aa802f 100644
--- a/msdos/dpmi.c
+++ b/msdos/dpmi.c
@@ -191,6 +191,18 @@
             /* MSCDEX hook */
             do_mscdex( &realmode_ctx, 1 );
             break;
+        case 0x7a:
+            /* NOVELL NetWare */
+            switch (AL_reg(&realmode_ctx))
+	    {
+                case 0x20:  /* Get VLM Call Address */
+                    /* return nothing -> NetWare not installed */
+                    break;
+                default:
+                    SET_CFLAG(context);
+                    break;
+            }
+	    break;
         default:
             SET_CFLAG(context);
             break;
diff --git a/msdos/int21.c b/msdos/int21.c
index 31d6a93..cbb181c 100644
--- a/msdos/int21.c
+++ b/msdos/int21.c
@@ -289,6 +289,13 @@
 			TRACE(int21,"logical volume %d unlocked.\n",drive);
 			break;
 
+		case 0x6f:
+			memset(dataptr+1, '\0', dataptr[0]-1);
+			dataptr[1] = dataptr[0]; 
+			dataptr[2] = 0x07; /* protected mode driver; no eject; no notification */
+			dataptr[3] = 0xFF; /* no physical drive */
+			break;
+
 		default:
                         INT_BARF( context, 0x21 );
 	}
@@ -1316,7 +1323,7 @@
         case 0x02:{
            FILE_OBJECT *file;
            file = FILE_GetFile(BX_reg(context));
-            if (!lstrcmpi32A(file->unix_name, "SCSIMGR$"))
+            if (!strcasecmp(file->unix_name, "SCSIMGR$"))
                         ASPI_DOS_HandleInt(context);
            break;
        }
diff --git a/multimedia/Makefile.in b/multimedia/Makefile.in
index a04cb55..347b0d6 100644
--- a/multimedia/Makefile.in
+++ b/multimedia/Makefile.in
@@ -7,6 +7,7 @@
 
 C_SRCS = \
 	audio.c \
+	dplay.c \
 	dsound.c \
 	init.c \
 	joystick.c \
diff --git a/multimedia/dplay.c b/multimedia/dplay.c
new file mode 100644
index 0000000..eef3542
--- /dev/null
+++ b/multimedia/dplay.c
@@ -0,0 +1,528 @@
+/* Direct Play 3 and Direct Play Lobby 1 Implementation
+ * Presently only the Lobby skeleton is implemented.                    
+ *
+ * Copyright 1998 - Peter Hunnisett
+ *
+ */
+#include "windows.h"
+#include "heap.h"
+#include "wintypes.h"
+#include "winerror.h"
+#include "interfaces.h"
+#include "mmsystem.h"
+#include "dplay.h"
+#include "debug.h"
+#include "winnt.h"
+#include "winreg.h"
+
+
+static HRESULT WINAPI IDirectPlayLobby_QueryInterface
+( LPDIRECTPLAYLOBBY2 this,
+  REFIID riid,
+  LPVOID* ppvObj )
+{
+  FIXME( dplay, ":stub\n");
+  return DPERR_OUTOFMEMORY;
+}
+
+static ULONG WINAPI IDirectPlayLobby_AddRef
+( LPDIRECTPLAYLOBBY2 this )
+{
+  ++(this->ref);
+  TRACE( dplay," ref count now %ld\n", this->ref );
+  return (this->ref);
+}
+
+static ULONG WINAPI IDirectPlayLobby_Release
+( LPDIRECTPLAYLOBBY2 this )
+{
+  this->ref--;
+
+  TRACE( dplay, " ref count now %ld\n", this->ref );
+  
+  /* Deallocate if this is the last reference to the object */
+  if( !(this->ref) )
+  {
+    HeapFree( GetProcessHeap(), 0, this ); 
+    return 0;
+  }
+
+  return this->ref;
+}
+
+/********************************************************************
+ * 
+ * Connects an application to the session specified by the DPLCONNECTION
+ * structure currently stored with the DirectPlayLobby object.
+ *
+ * Returns a IDirectPlay2 or IDirectPlay2A interface.
+ *
+ */
+static HRESULT WINAPI IDirectPlayLobby_Connect
+( LPDIRECTPLAYLOBBY2 this,
+  DWORD dwFlags,
+  LPDIRECTPLAY2* lplpDP,
+  IUnknown* pUnk)
+{
+  FIXME( dplay, ":stub\n");
+  return DPERR_OUTOFMEMORY;
+}
+
+/********************************************************************
+ *
+ * Creates a DirectPlay Address, given a service provider-specific network
+ * address. 
+ * Returns an address contains the globally unique identifier
+ * (GUID) of the service provider and data that the service provider can
+ * interpret as a network address.
+ *
+ */
+static HRESULT WINAPI IDirectPlayLobby_CreateAddress
+( LPDIRECTPLAYLOBBY2 this,
+  REFGUID guidSP,
+  REFGUID guidDataType,
+  LPCVOID lpData, 
+  DWORD dwDataSize,
+  LPVOID lpAddress, 
+  LPDWORD lpdwAddressSize )
+{
+  FIXME( dplay, ":stub\n");
+  return DPERR_OUTOFMEMORY;
+}
+
+/********************************************************************
+ *
+ * Parses out chunks from the DirectPlay Address buffer by calling the
+ * given callback function, with lpContext, for each of the chunks.
+ *
+ */
+static HRESULT WINAPI IDirectPlayLobby_EnumAddress
+( LPDIRECTPLAYLOBBY2 this,
+  LPDPENUMADDRESSCALLBACK lpEnumAddressCallback, 
+  LPCVOID lpAddress,
+  DWORD dwAddressSize, 
+  LPVOID lpContext )
+{
+  FIXME( dplay, ":stub\n");
+  return DPERR_OUTOFMEMORY;
+}
+
+/********************************************************************
+ *
+ * Enumerates all the address types that a given service provider needs to
+ * build the DirectPlay Address.
+ *
+ */
+static HRESULT WINAPI IDirectPlayLobby_EnumAddressTypes
+( LPDIRECTPLAYLOBBY2 this,
+  LPDPLENUMADDRESSTYPESCALLBACK lpEnumAddressTypeCallback,
+  REFGUID guidSP, 
+  LPVOID lpContext,
+  DWORD dwFlags )
+{
+  FIXME( dplay, ":stub\n");
+  return DPERR_OUTOFMEMORY;
+}
+
+/********************************************************************
+ *
+ * Enumerates what applications are registered with DirectPlay by
+ * invoking the callback function with lpContext.
+ *
+ */
+static HRESULT WINAPI IDirectPlayLobby_EnumLocalApplications
+( LPDIRECTPLAYLOBBY2 this,
+  LPDPLENUMLOCALAPPLICATIONSCALLBACK a,
+  LPVOID lpContext,
+  DWORD dwFlags )
+{
+  FIXME( dplay, ":stub\n");
+  return DPERR_OUTOFMEMORY;
+}
+
+/********************************************************************
+ *
+ * Retrieves the DPLCONNECTION structure that contains all the information
+ * needed to start and connect an application. This was generated using
+ * either the RunApplication or SetConnectionSettings methods.
+ *
+ * NOTES: If lpData is NULL then just return lpdwDataSize. This allows
+ *        the data structure to be allocated by our caller which can then
+ *        call this procedure/method again with a valid data pointer.
+ */
+static HRESULT WINAPI IDirectPlayLobby_GetConnectionSettings
+( LPDIRECTPLAYLOBBY2 this,
+  DWORD dwAppID, 
+  LPVOID lpData,
+  LPDWORD lpdwDataSize )
+{
+  LPDPLCONNECTION lpConnectionSettings;
+
+  FIXME( dplay, ":semi stub %p %08lx %p %p \n", this, dwAppID, lpData, lpdwDataSize );
+
+  if ( !lpData )
+  {
+    /* Let's check the size of the buffer that the application has allocated */
+    if( *lpdwDataSize >= sizeof( DPLCONNECTION ) )
+    {
+      return DP_OK;  
+    }
+    else
+    {
+      *lpdwDataSize = sizeof( DPLCONNECTION );
+      return DPERR_BUFFERTOOSMALL;
+    }
+  }
+
+  /* Ok we assume that we've been given a buffer that is large enough for our needs */
+  lpConnectionSettings = ( LPDPLCONNECTION ) lpData; 
+
+  /* Fill in the fields */
+
+  return DPERR_NOTLOBBIED;
+}
+
+/********************************************************************
+ *
+ * Retrieves the message sent between a lobby client and a DirectPlay 
+ * application. All messages are queued until received.
+ *
+ */
+static HRESULT WINAPI IDirectPlayLobby_ReceiveLobbyMessage
+( LPDIRECTPLAYLOBBY2 this,
+  DWORD dwFlags,
+  DWORD dwAppID,
+  LPDWORD lpdwMessageFlags,
+  LPVOID lpData,
+  LPDWORD lpdwDataSize )
+{
+  FIXME( dplay, ":stub %p %08lx %08lx %p %p %p\n", this, dwFlags, dwAppID, lpdwMessageFlags, lpData,
+         lpdwDataSize );
+  return DPERR_OUTOFMEMORY;
+}
+
+/********************************************************************
+ *
+ * Starts an application and passes to it all the information to
+ * connect to a session.
+ *
+ */
+static HRESULT WINAPI IDirectPlayLobby_RunApplication
+( LPDIRECTPLAYLOBBY2 this,
+  DWORD dwFlags,
+  LPDWORD lpdwAppID,
+  LPDPLCONNECTION lpConn,
+  HANDLE32 hReceiveEvent )
+{
+  FIXME( dplay, ":stub\n");
+  return DPERR_OUTOFMEMORY;
+}
+
+/********************************************************************
+ *
+ * Sends a message between the application and the lobby client.
+ * All messages are queued until received.
+ *
+ */
+static HRESULT WINAPI IDirectPlayLobby_SendLobbyMessage
+( LPDIRECTPLAYLOBBY2 this,
+  DWORD dwFlags,
+  DWORD dwAppID,
+  LPVOID lpData,
+  DWORD dwDataSize )
+{
+  FIXME( dplay, ":stub\n");
+  return DPERR_OUTOFMEMORY;
+}
+
+/********************************************************************
+ *
+ * Modifies the DPLCONNECTION structure to contain all information
+ * needed to start and connect an application.
+ *
+ */
+static HRESULT WINAPI IDirectPlayLobby_SetConnectionSettings
+( LPDIRECTPLAYLOBBY2 this,
+  DWORD dwFlags,
+  DWORD dwAppID,
+  LPDPLCONNECTION lpConn )
+{
+  FIXME( dplay, ": this=%p, dwFlags=%08lx, dwAppId=%08lx, lpConn=%p: stub\n",
+         this, dwFlags, dwAppID, lpConn );
+
+  /* Paramater check */
+  if( dwFlags || !this || !lpConn )
+  {
+    return DPERR_INVALIDPARAMS;
+  }
+
+  if( !( lpConn->dwSize == sizeof(DPLCONNECTION) ) )
+  {
+    /* Is this the right return code? */
+    return DPERR_INVALIDPARAMS;
+  }
+
+  return DPERR_OUTOFMEMORY;
+}
+
+/********************************************************************
+ *
+ * Registers an event that will be set when a lobby message is received.
+ *
+ */
+static HRESULT WINAPI IDirectPlayLobby_SetLobbyMessageEvent
+( LPDIRECTPLAYLOBBY2 this,
+  DWORD dwFlags,
+  DWORD dwAppID,
+  HANDLE32 hReceiveEvent )
+{
+  FIXME( dplay, ":stub\n");
+  return DPERR_OUTOFMEMORY;
+}
+
+static HRESULT WINAPI IDirectPlayLobby_CreateCompoundAddress
+( LPDIRECTPLAYLOBBY2 this,
+  LPCDPCOMPOUNDADDRESSELEMENT lpElements,
+  DWORD dwElementCount,
+  LPVOID lpAddress,
+  LPDWORD lpdwAddressSize )
+{
+  FIXME( dplay, ":stub\n");
+  return DPERR_OUTOFMEMORY;
+}
+
+/* Direct Play Lobby 2 Virtual Table for methods */
+static struct tagLPDIRECTPLAYLOBBY2_VTABLE lobby2VT = {
+  IDirectPlayLobby_QueryInterface,
+  IDirectPlayLobby_AddRef, 
+  IDirectPlayLobby_Release,
+  IDirectPlayLobby_Connect,
+  IDirectPlayLobby_CreateAddress,
+  IDirectPlayLobby_EnumAddress,
+  IDirectPlayLobby_EnumAddressTypes,
+  IDirectPlayLobby_EnumLocalApplications,
+  IDirectPlayLobby_GetConnectionSettings,
+  IDirectPlayLobby_ReceiveLobbyMessage,
+  IDirectPlayLobby_RunApplication,
+  IDirectPlayLobby_SendLobbyMessage,
+  IDirectPlayLobby_SetConnectionSettings,
+  IDirectPlayLobby_SetLobbyMessageEvent,
+  IDirectPlayLobby_CreateCompoundAddress
+};
+
+/***************************************************************************
+ *  DirectPlayLobbyCreateA   (DPLAYX.4)
+ *
+ */
+HRESULT WINAPI DirectPlayLobbyCreateA( LPGUID lpGUIDDSP,
+                                       LPDIRECTPLAYLOBBY2A *lplpDPL,
+                                       IUnknown *lpUnk, 
+                                       LPVOID lpData,
+                                       DWORD dwDataSize )
+{
+  TRACE(dplay,"lpGUIDDSP=%p lplpDPL=%p lpUnk=%p lpData=%p dwDataSize=%08lx\n",
+        lpGUIDDSP,lplpDPL,lpUnk,lpData,dwDataSize);
+
+  /* Parameter Check: lpGUIDSP, lpUnk & lpData must be NULL. dwDataSize must
+   * equal 0. These fields are mostly for future expansion.
+   */
+  if ( lpGUIDDSP || lpUnk || lpData || dwDataSize )
+  {
+     *lplpDPL = NULL;
+     return DPERR_INVALIDPARAMS;
+  }
+
+  *lplpDPL = (LPDIRECTPLAYLOBBY2A)HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY,
+                                            sizeof( IDirectPlayLobby2A ) );
+
+  if( ! (*lplpDPL) )
+  {
+     return DPERR_OUTOFMEMORY;
+  }
+
+  (*lplpDPL)->lpvtbl = &lobby2VT;
+  (*lplpDPL)->ref    = 1;
+
+  /* Still some stuff to do here */
+
+  return DP_OK;
+}
+
+/***************************************************************************
+ *  DirectPlayLobbyCreateW   (DPLAYX.5)
+ *
+ */
+HRESULT WINAPI DirectPlayLobbyCreateW( LPGUID lpGUIDDSP, 
+                                       LPDIRECTPLAYLOBBY2 *lplpDPL,
+                                       IUnknown *lpUnk,
+                                       LPVOID lpData, 
+                                       DWORD dwDataSize )
+{
+  TRACE(dplay,"lpGUIDDSP=%p lplpDPL=%p lpUnk=%p lpData=%p dwDataSize=%08lx\n",
+        lpGUIDDSP,lplpDPL,lpUnk,lpData,dwDataSize);
+
+  /* Parameter Check: lpGUIDSP, lpUnk & lpData must be NULL. dwDataSize must 
+   * equal 0. These fields are mostly for future expansion.
+   */
+  if ( lpGUIDDSP || lpUnk || lpData || dwDataSize )
+  {
+     *lplpDPL = NULL;
+     return DPERR_INVALIDPARAMS;
+  }
+
+  *lplpDPL = (LPDIRECTPLAYLOBBY2)HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY,
+                                           sizeof( IDirectPlayLobby2 ) );
+
+  if( !*lplpDPL)
+  {
+     return DPERR_OUTOFMEMORY;
+  }
+
+  (*lplpDPL)->lpvtbl = &lobby2VT;
+  (*lplpDPL)->ref    = 1;
+
+  return DP_OK;
+
+}
+
+/***************************************************************************
+ *  DirectPlayEnumerateA (DPLAYX.2) 
+ *
+ *  The pointer to the structure lpContext will be filled with the 
+ *  appropriate data for each service offered by the OS. These services are
+ *  not necessarily available on this particular machine but are defined
+ *  as simple service providers under the "Service Providers" registry key.
+ *  This structure is then passed to lpEnumCallback for each of the different 
+ *  services. 
+ *
+ *  This API is useful only for applications written using DirectX3 or
+ *  worse. It is superceeded by IDirectPlay3::EnumConnections which also
+ *  gives information on the actual connections.
+ *
+ * defn of a service provider:
+ * A dynamic-link library used by DirectPlay to communicate over a network. 
+ * The service provider contains all the network-specific code required
+ * to send and receive messages. Online services and network operators can
+ * supply service providers to use specialized hardware, protocols, communications
+ * media, and network resources. 
+ *
+ * TODO: Allocate string buffer space from the heap (length from reg)
+ *       Pass real device driver numbers...
+ *       Get the GUID properly...
+ */
+HRESULT WINAPI DirectPlayEnumerateA( LPDPENUMDPCALLBACKA lpEnumCallback,
+                                     LPVOID lpContext )
+{
+
+  HKEY hkResult; 
+  LPCSTR searchSubKey    = "SOFTWARE\\Microsoft\\DirectPlay\\Service Providers";
+  LPSTR guidDataSubKey   = "Guid";
+  LPSTR majVerDataSubKey = "dwReserved1";
+  DWORD dwIndex, sizeOfSubKeyName=50;
+  char subKeyName[51]; 
+
+  TRACE( dplay, ": lpEnumCallback=%p lpContext=%p\n", lpEnumCallback, lpContext );
+
+  if( !lpEnumCallback || !*lpEnumCallback )
+  {
+     return DPERR_INVALIDPARAMS;
+  }
+
+  /* Need to loop over the service providers in the registry */
+  if( RegOpenKeyEx32A( HKEY_LOCAL_MACHINE, searchSubKey,
+                       0, KEY_ENUMERATE_SUB_KEYS, &hkResult ) != ERROR_SUCCESS )
+  {
+    /* Hmmm. Does this mean that there are no service providers? */ 
+    ERR(dplay, ": no service providers?\n");
+    return DP_OK; 
+  }
+
+  /* Traverse all the service providers we have available */
+  for( dwIndex=0;
+       RegEnumKey32A( hkResult, dwIndex, subKeyName, sizeOfSubKeyName ) !=
+         ERROR_NO_MORE_ITEMS;
+       ++dwIndex )
+  {
+    HKEY     hkServiceProvider;
+    GUID     serviceProviderGUID;
+    DWORD    returnTypeGUID, returnTypeReserved1, sizeOfReturnBuffer=50;
+    char     returnBuffer[51];
+    DWORD    majVersionNum, minVersionNum;
+    LPWSTR   lpWGUIDString; 
+
+    TRACE( dplay, " this time through: %s\n", subKeyName );
+
+    /* Get a handle for this particular service provider */
+    if( RegOpenKeyEx32A( hkResult, subKeyName, 0, KEY_QUERY_VALUE,
+                         &hkServiceProvider ) != ERROR_SUCCESS )
+    {
+      ERR( dplay, ": what the heck is going on?\n" );
+      continue;
+    }
+
+    /* Get the GUID, Device major number and device minor number 
+     * from the registry. 
+     */
+    if( RegQueryValueEx32A( hkServiceProvider, guidDataSubKey,
+                            NULL, &returnTypeGUID, returnBuffer,
+                            &sizeOfReturnBuffer ) != ERROR_SUCCESS )
+    {
+      ERR( dplay, ": missing GUID registry data members\n" );
+      continue; 
+    }
+
+    /* FIXME: Check return types to ensure we're interpreting data right */
+    lpWGUIDString = HEAP_strdupAtoW( GetProcessHeap(), 0, returnBuffer );
+    CLSIDFromString32( (LPCOLESTR32)lpWGUIDString, &serviceProviderGUID ); 
+    HeapFree( GetProcessHeap(), 0, lpWGUIDString );
+
+    sizeOfReturnBuffer = 50;
+ 
+    if( RegQueryValueEx32A( hkServiceProvider, majVerDataSubKey,
+                            NULL, &returnTypeReserved1, returnBuffer,
+                            &sizeOfReturnBuffer ) != ERROR_SUCCESS )
+    {
+      ERR( dplay, ": missing dwReserved1 registry data members\n") ;
+      continue; 
+    }
+    /* FIXME: This couldn't possibly be right...*/
+    majVersionNum = GET_DWORD( returnBuffer );
+
+    /* The enumeration will return FALSE if we are not to continue */
+    if( !lpEnumCallback( &serviceProviderGUID , subKeyName,
+                         majVersionNum, (DWORD)0, lpContext ) )
+    {
+      WARN( dplay, "lpEnumCallback returning FALSE\n" );
+      break;
+    }
+  }
+
+  return DP_OK;
+
+}
+
+/***************************************************************************
+ *  DirectPlayEnumerateW (DPLAYX.3)
+ *
+ */
+HRESULT WINAPI DirectPlayEnumerateW( LPDPENUMDPCALLBACKW lpEnumCallback, LPVOID lpContext )
+{
+
+  FIXME( dplay, ":stub\n");
+
+  return DPERR_OUTOFMEMORY; 
+
+}
+
+/***************************************************************************
+ *  DirectPlayCreate (DPLAYX.1) (DPLAY.1)
+ *
+ */
+HRESULT WINAPI DirectPlayCreate
+( LPGUID lpGUID, LPDIRECTPLAY *lplpDP, IUnknown *pUnk)
+{
+
+  FIXME( dplay, ":stub\n");
+  return DPERR_OUTOFMEMORY;
+
+}
diff --git a/multimedia/dsound.c b/multimedia/dsound.c
index 5e248b0..8926af3 100644
--- a/multimedia/dsound.c
+++ b/multimedia/dsound.c
@@ -1077,26 +1077,3 @@
     FIXME(dsound, "(void): stub\n");
     return S_FALSE;
 }
-
-/***************************************************************************
- *   DirectPlayLobbyCreateW (DPLAYX.5)
- *
- */
-HRESULT WINAPI DirectPlayLobbyCreateW( LPGUID lpGUID, LPDIRECTPLAYLOBBY *a,
-                                       IUnknown *b, LPVOID c, DWORD d )
-{
-  FIXME(dsound,"lpGUID=%p a=%p b=%p c=%p d=%08lx :stub\n",lpGUID,a,b,c,d);
-  return E_FAIL;
-}
-
-/***************************************************************************
- *  DirectPlayLobbyCreateA   (DPLAYX.4)
- *
- */
-HRESULT WINAPI DirectPlayLobbyCreateA( LPGUID lpGUID, LPDIRECTPLAYLOBBYA *a,
-                                       IUnknown *b, LPVOID c, DWORD d )
-{
-  FIXME(dsound,"lpGUID=%p a=%p b=%p c=%p d=%08lx :stub\n",lpGUID,a,b,c,d);
-  return E_FAIL;
-}
-
diff --git a/multimedia/init.c b/multimedia/init.c
index 7e48550..63df1bf 100644
--- a/multimedia/init.c
+++ b/multimedia/init.c
@@ -58,7 +58,7 @@
 BOOL32 MULTIMEDIA_Init (void)
 {
 #ifdef HAVE_OSS
-  int i, status, numsynthdevs, nummididevs;
+  int i, status, numsynthdevs=255, nummididevs=255;
   struct synth_info sinfo;
   struct midi_info minfo;
   int fd;        /* file descriptor for MIDI_DEV */
@@ -182,5 +182,4 @@
 #endif /* HAVE_OSS */
   
   return TRUE;
-  
 }
diff --git a/multimedia/mmsystem.c b/multimedia/mmsystem.c
index 5888ca5..36c9261 100644
--- a/multimedia/mmsystem.c
+++ b/multimedia/mmsystem.c
@@ -124,7 +124,7 @@
   TRACE(mmsys, "pszSound='%p' hmod=%04X fdwSound=%08lX\n",
 	pszSound, hmod, fdwSound);
   if(hmod != 0 || !(fdwSound & SND_FILENAME)) {
-    FIXME(mmsys, "only disk sound files are supported\n");
+    FIXME(mmsys, "only disk sound files are supported. Type: %08lx\n",fdwSound);
     return FALSE;
   } else
     return  sndPlaySound(pszSound, (UINT16) fdwSound);
diff --git a/objects/bitmap.c b/objects/bitmap.c
index 0a3dbdf..4d6fd4b 100644
--- a/objects/bitmap.c
+++ b/objects/bitmap.c
@@ -178,6 +178,7 @@
     bmpObjPtr->dibSection = NULL;
     bmpObjPtr->colorMap = NULL;
     bmpObjPtr->nColorMap = 0;
+    bmpObjPtr->status = DIB_NoHandler;
 
       /* Create the pixmap */
     bmpObjPtr->pixmap = TSXCreatePixmap(display, rootWindow, width, height, bpp);
@@ -186,7 +187,7 @@
 	GDI_HEAP_FREE( hbitmap );
 	hbitmap = 0;
     }
-    else if (bits)  /* Set bitmap bits */
+    else if (bits) /* Set bitmap bits */
 	SetBitmapBits32( hbitmap, height * bmpObjPtr->bitmap.bmWidthBytes,
                          bits );
     GDI_HEAP_UNLOCK( hbitmap );
@@ -832,8 +833,11 @@
     {
 	DIBSECTION *dib = bmp->dibSection;
 
-	if (!dib->dshSection && dib->dsBm.bmBits)
-	    HeapFree(GetProcessHeap(), 0, dib->dsBm.bmBits);
+	if (dib->dsBm.bmBits)
+            if (dib->dshSection)
+                UnmapViewOfFile(dib->dsBm.bmBits);
+            else
+                VirtualFree(dib->dsBm.bmBits, MEM_RELEASE, 0L);
 
 	HeapFree(GetProcessHeap(), 0, dib);
     }
diff --git a/objects/cursoricon.c b/objects/cursoricon.c
index 18f1721..f6568c8 100644
--- a/objects/cursoricon.c
+++ b/objects/cursoricon.c
@@ -1625,7 +1625,8 @@
     if (hMemDC && ptr)
     {
 	HBITMAP32 hXorBits, hAndBits;
-	COLORREF oldFg, oldBg;
+	COLORREF  oldFg, oldBg;
+	INT32     nStretchMode;
 
 	/* Calculate the size of the destination image.  */
 	if (cxWidth == 0)
@@ -1639,6 +1640,8 @@
 	    else
 		cyWidth = ptr->nHeight;
 
+	nStretchMode = SetStretchBltMode32 (hdc, STRETCH_DELETESCANS);
+
 	hXorBits = CreateBitmap32 ( ptr->nWidth, ptr->nHeight,
 				    ptr->bPlanes, ptr->bBitsPerPixel,
 				    (char *)(ptr + 1)
@@ -1653,12 +1656,12 @@
 	{
 	    HBITMAP32 hBitTemp = SelectObject32( hMemDC, hAndBits );
 	    if (flags & DI_MASK)
-		BitBlt32 (hdc, x0, y0, cxWidth, cyWidth,
-			  hMemDC, 0, 0, SRCAND);
+		StretchBlt32 (hdc, x0, y0, cxWidth, cyWidth,
+			      hMemDC, 0, 0, ptr->nWidth, ptr->nHeight, SRCAND);
 	    SelectObject32( hMemDC, hXorBits );
 	    if (flags & DI_IMAGE)
-		BitBlt32 (hdc, x0, y0, cxWidth, cyWidth,
-			  hMemDC, 0, 0, SRCPAINT);
+		StretchBlt32 (hdc, x0, y0, cxWidth, cyWidth,
+			  hMemDC, 0, 0, ptr->nWidth, ptr->nHeight, SRCPAINT);
 	    SelectObject32( hMemDC, hBitTemp );
 	    result = TRUE;
 	}
@@ -1667,6 +1670,7 @@
 	SetBkColor32( hdc, oldBg );
 	if (hXorBits) DeleteObject32( hXorBits );
 	if (hAndBits) DeleteObject32( hAndBits );
+	SetStretchBltMode32 (hdc, nStretchMode);
     }
     if (hMemDC) DeleteDC32( hMemDC );
     GlobalUnlock16( hIcon );
diff --git a/objects/dc.c b/objects/dc.c
index 751430d..20243c3 100644
--- a/objects/dc.c
+++ b/objects/dc.c
@@ -389,8 +389,10 @@
     {
     case PS_JOIN_BEVEL:
 	val.join_style = JoinBevel;
+        break;
     case PS_JOIN_MITER:
 	val.join_style = JoinMiter;
+        break;
     case PS_JOIN_ROUND:
     default:
 	val.join_style = JoinRound;
diff --git a/objects/dib.c b/objects/dib.c
index 4f88ee9..72780f9 100644
--- a/objects/dib.c
+++ b/objects/dib.c
@@ -12,6 +12,7 @@
 #include "callback.h"
 #include "palette.h"
 #include "color.h"
+#include "global.h"
 #include "debug.h"
 
 static int bitmapDepthTable[] = { 8, 1, 32, 16, 24, 15, 4, 0 };
@@ -280,6 +281,22 @@
 }
 
 /***********************************************************************
+ *           DIB_MapColor
+ */
+static int DIB_MapColor( int *physMap, int nPhysMap, int phys )
+{
+    int color;
+
+    for (color = 0; color < nPhysMap; color++)
+        if (physMap[color] == phys)
+            return color;
+
+    WARN(bitmap, "Strange color %08x\n", phys);
+    return 0;
+}
+
+
+/***********************************************************************
  *           DIB_SetImageBits_1_Line
  *
  * Handles a single line of 1 bit data.
@@ -392,6 +409,51 @@
     }
 }
 
+/***********************************************************************
+ *           DIB_GetImageBits_4
+ *
+ * GetDIBits for a 4-bit deep DIB.
+ */
+static void DIB_GetImageBits_4( int lines, BYTE *srcbits,
+                                DWORD srcwidth, DWORD dstwidth, int left,
+                                int *colors, int nColors, XImage *bmpImage )
+{
+    DWORD i, x;
+    int h;
+    BYTE *bits = srcbits + (left >> 1);
+
+    /* 32 bit aligned */
+    DWORD linebytes = ((srcwidth+7)&~7)/2;
+
+    dstwidth += left;
+
+    /* FIXME: should avoid putting x<left pixels (minor speed issue) */
+    if (lines > 0) {
+       for (h = lines-1; h >= 0; h--) {
+           for (i = dstwidth/2, x = left&~1; i > 0; i--) {
+               *bits++ = (DIB_MapColor( colors, nColors, XGetPixel( bmpImage, x++, h )) << 4)
+                       | (DIB_MapColor( colors, nColors, XGetPixel( bmpImage, x++, h )) & 0x0f);
+           }
+           if (dstwidth & 1)
+               *bits = (DIB_MapColor( colors, nColors, XGetPixel( bmpImage, x++, h )) << 4);
+           srcbits += linebytes;
+           bits     = srcbits + (left >> 1);
+       }
+    } else {
+       lines = -lines;
+       for (h = 0; h < lines; h++) {
+           for (i = dstwidth/2, x = left&~1; i > 0; i--) {
+               *bits++ = (DIB_MapColor( colors, nColors, XGetPixel( bmpImage, x++, h )) << 4)
+                       | (DIB_MapColor( colors, nColors, XGetPixel( bmpImage, x++, h )) & 0x0f);
+           }
+           if (dstwidth & 1)
+               *bits = (DIB_MapColor( colors, nColors, XGetPixel( bmpImage, x++, h )) << 4);
+           srcbits += linebytes;
+           bits     = srcbits + (left >> 1);
+       }
+    }
+}
+
 #define check_xy(x,y) \
 	if (x > width) { \
 		x = 0; \
@@ -498,6 +560,46 @@
 }
 
 /***********************************************************************
+ *           DIB_GetImageBits_8
+ *
+ * GetDIBits for an 8-bit deep DIB.
+ */
+static void DIB_GetImageBits_8( int lines, BYTE *srcbits,
+                                DWORD srcwidth, DWORD dstwidth, int left,
+                                int *colors, int nColors, XImage *bmpImage )
+{
+    DWORD x;
+    int h;
+    BYTE *bits = srcbits + left;
+
+    /* align to 32 bit */
+    DWORD linebytes = (srcwidth + 3) & ~3;
+
+    dstwidth+=left;
+
+    if (lines > 0) {
+       for (h = lines - 1; h >= 0; h--) {
+           for (x = left; x < dstwidth; x++, bits++) {
+               if ( XGetPixel( bmpImage, x, h ) != colors[*bits] )
+                   *bits = DIB_MapColor( colors, nColors,
+                                          XGetPixel( bmpImage, x, h ) );
+           }
+           bits = (srcbits += linebytes) + left;
+       }
+    } else {
+       lines = -lines;
+       for (h = 0; h < lines; h++) {
+           for (x = left; x < dstwidth; x++, bits++) {
+               if ( XGetPixel( bmpImage, x, h ) != colors[*bits] )
+                   *bits = DIB_MapColor( colors, nColors,
+                                         XGetPixel( bmpImage, x, h ) );
+           }
+           bits = (srcbits += linebytes) + left;
+       }
+    }
+}
+
+/***********************************************************************
  *	      DIB_SetImageBits_RLE8
  *
  * SetDIBits for an 8-bit deep compressed DIB.
@@ -727,6 +829,58 @@
 
 
 /***********************************************************************
+ *           DIB_GetImageBits_16
+ *
+ * GetDIBits for an 16-bit deep DIB.
+ */
+static void DIB_GetImageBits_16( int lines, BYTE *srcbits,
+                               DWORD srcwidth, DWORD dstwidth, int left,
+                                int *colors, int nColors, XImage *bmpImage )
+{
+    DWORD x;
+    LPWORD ptr;
+    int h;
+    BYTE r, g, b;
+
+    /* align to 32 bit */
+    DWORD linebytes = (srcwidth * 2 + 3) & ~3;
+
+    dstwidth += left;
+
+    ptr = (LPWORD) srcbits + left;
+    if (lines > 0) {
+       for (h = lines - 1; h >= 0; h--)
+        {
+           for (x = left; x < dstwidth; x++, ptr++)
+            {
+                COLORREF pixel = COLOR_ToLogical( XGetPixel( bmpImage, x, h ) );
+               r = (BYTE) GetRValue(pixel);
+               g = (BYTE) GetGValue(pixel);
+               b = (BYTE) GetBValue(pixel);
+                *ptr = ( ((r << 7) & 0x7c00) | ((g << 2) & 0x03e0) | ((b >> 3) & 0x001f) );
+           }
+           ptr = (LPWORD) (srcbits += linebytes) + left;
+       }
+    } else {
+       lines = -lines;
+       for (h = 0; h < lines; h++)
+        {
+           for (x = left; x < dstwidth; x++, ptr++)
+            {
+                COLORREF pixel = COLOR_ToLogical( XGetPixel( bmpImage, x, h ) );
+               r = (BYTE) GetRValue(pixel);
+               g = (BYTE) GetGValue(pixel);
+               b = (BYTE) GetBValue(pixel);
+                *ptr = ( ((r << 7) & 0x7c00) | ((g << 2) & 0x03e0) | ((b >> 3) & 0x001f) );
+           }
+
+           ptr = (LPWORD) (srcbits += linebytes) + left;
+       }
+    }
+}
+
+
+/***********************************************************************
  *           DIB_SetImageBits_24
  *
  * SetDIBits for a 24-bit deep DIB.
@@ -768,6 +922,54 @@
 
 
 /***********************************************************************
+ *           DIB_GetImageBits_24
+ *
+ * GetDIBits for an 24-bit deep DIB.
+ */
+static void DIB_GetImageBits_24( int lines, BYTE *srcbits,
+                               DWORD srcwidth, DWORD dstwidth, int left,
+                                int *colors, int nColors, XImage *bmpImage )
+{
+    DWORD x;
+    int h;
+    BYTE *bits = srcbits + (left * 3);
+
+    /* align to 32 bit */
+    DWORD linebytes = (srcwidth * 3 + 3) & ~3;
+
+    dstwidth += left;
+
+    if (lines > 0) {
+       for (h = lines - 1; h >= 0; h--)
+        {
+           for (x = left; x < dstwidth; x++, bits += 3)
+            {
+                COLORREF pixel = COLOR_ToLogical( XGetPixel( bmpImage, x, h ) );
+                bits[0] = GetRValue(pixel);
+                bits[1] = GetGValue(pixel);
+                bits[2] = GetBValue(pixel);
+           }
+           bits = (srcbits += linebytes) + (left * 3);
+       }
+    } else {
+       lines = -lines;
+       for (h = 0; h < lines; h++)
+        {
+           for (x = left; x < dstwidth; x++, bits += 3)
+            {
+                COLORREF pixel = COLOR_ToLogical( XGetPixel( bmpImage, x, h ) );
+                bits[0] = GetRValue(pixel);
+                bits[1] = GetGValue(pixel);
+                bits[2] = GetBValue(pixel);
+           }
+
+           bits = (srcbits += linebytes) + (left * 3);
+       }
+    }
+}
+
+
+/***********************************************************************
  *           DIB_SetImageBits_32
  *
  * SetDIBits for a 32-bit deep DIB.
@@ -806,6 +1008,54 @@
 
 
 /***********************************************************************
+ *           DIB_GetImageBits_32
+ *
+ * GetDIBits for an 32-bit deep DIB.
+ */
+static void DIB_GetImageBits_32( int lines, BYTE *srcbits,
+                               DWORD srcwidth, DWORD dstwidth, int left,
+                                int *colors, int nColors, XImage *bmpImage )
+{
+    DWORD x;
+    int h;
+    BYTE *bits = srcbits + (left * 4);
+
+    /* align to 32 bit */
+    DWORD linebytes = (srcwidth * 4);
+
+    dstwidth += left;
+
+    if (lines > 0) {
+       for (h = lines - 1; h >= 0; h--)
+        {
+           for (x = left; x < dstwidth; x++, bits += 4)
+            {
+                COLORREF pixel = COLOR_ToLogical( XGetPixel( bmpImage, x, h ) );
+                bits[0] = GetRValue(pixel);
+                bits[1] = GetGValue(pixel);
+                bits[2] = GetBValue(pixel);
+           }
+           bits = (srcbits += linebytes) + (left * 4);
+       }
+    } else {
+       lines = -lines;
+       for (h = 0; h < lines; h++)
+        {
+           for (x = left; x < dstwidth; x++, bits += 4)
+            {
+                COLORREF pixel = COLOR_ToLogical( XGetPixel( bmpImage, x, h ) );
+                bits[0] = GetRValue(pixel);
+                bits[1] = GetGValue(pixel);
+                bits[2] = GetBValue(pixel);
+           }
+
+           bits = (srcbits += linebytes) + (left * 4);
+       }
+    }
+}
+
+
+/***********************************************************************
  *           DIB_SetImageBits
  *
  * Transfer the bits to an X image.
@@ -825,7 +1075,8 @@
 						    descr->colorMap, descr->nColorMap )))
         return 0;
 
-    if( descr->dc->w.flags & DC_DIRTY ) CLIPPING_UpdateGCRegion(descr->dc);
+    if ( descr->dc && descr->dc->w.flags & DC_DIRTY ) 
+        CLIPPING_UpdateGCRegion(descr->dc);
 
       /* Transfer the pixels */
     lines = descr->lines;
@@ -877,6 +1128,82 @@
     return lines;
 }
 
+/***********************************************************************
+ *           DIB_GetImageBits
+ *
+ * Transfer the bits from an X image.
+ * The Xlib critical section must be entered before calling this function.
+ */
+static int DIB_GetImageBits( const DIB_SETIMAGEBITS_DESCR *descr )
+{
+    int *colorMapping;
+    XImage *bmpImage;
+    int lines;
+
+      /* Translate the color mapping table */
+
+    if (descr->infoBpp > 8) colorMapping = NULL;
+    else if (!(colorMapping = DIB_PhysicalColorMap( descr->dc, descr->depth,
+                                                   descr->colorMap, descr->nColorMap )))
+        return 0;
+
+      /* Transfer the pixels */
+
+    lines = descr->lines;
+    if (lines < 0) lines = -lines;
+    bmpImage = XGetImage( display, descr->drawable, descr->xDest, descr->yDest,
+                          descr->width, descr->height, AllPlanes, ZPixmap );
+
+    switch(descr->infoBpp)
+    {
+    case 1:
+        FIXME(bitmap, "Depth 1 not yet supported!\n");
+       break;
+
+    case 4:
+       if (descr->compression) FIXME(bitmap, "Compression not yet supported!\n");
+       else DIB_GetImageBits_4( descr->lines, (LPVOID)descr->bits, descr->infoWidth,
+                                 descr->width, descr->xSrc,
+                                 colorMapping, descr->nColorMap, bmpImage );
+       break;
+
+    case 8:
+       if (descr->compression) FIXME(bitmap, "Compression not yet supported!\n");
+       else DIB_GetImageBits_8( descr->lines, (LPVOID)descr->bits, descr->infoWidth,
+                                 descr->width, descr->xSrc,
+                                 colorMapping, descr->nColorMap, bmpImage );
+       break;
+
+    case 15:
+    case 16:
+       DIB_GetImageBits_16( descr->lines, (LPVOID)descr->bits, descr->infoWidth,
+                             descr->width, descr->xSrc,
+                             colorMapping, descr->nColorMap, bmpImage );
+       break;
+
+    case 24:
+       DIB_GetImageBits_24( descr->lines, (LPVOID)descr->bits, descr->infoWidth,
+                             descr->width, descr->xSrc,
+                             colorMapping, descr->nColorMap, bmpImage );
+       break;
+
+    case 32:
+       DIB_GetImageBits_32( descr->lines, (LPVOID)descr->bits, descr->infoWidth,
+                             descr->width, descr->xSrc,
+                             colorMapping, descr->nColorMap, bmpImage );
+       break;
+
+    default:
+        WARN(bitmap, "(%d): Invalid depth\n", descr->infoBpp );
+        break;
+    }
+
+    if (colorMapping) HeapFree( GetProcessHeap(), 0, colorMapping );
+
+    XDestroyImage( bmpImage );
+    return lines;
+}
+
 
 /***********************************************************************
  *           StretchDIBits16   (GDI.439)
@@ -1491,6 +1818,195 @@
     return handle;
 }
 
+
+/***********************************************************************
+ *           DIB_DoProtectDIBSection
+ */
+static void DIB_DoProtectDIBSection( BITMAPOBJ *bmp, DWORD new_prot )
+{
+    DIBSECTION *dib = bmp->dibSection;
+    INT32 effHeight = dib->dsBm.bmHeight >= 0? dib->dsBm.bmHeight
+                                             : -dib->dsBm.bmHeight;
+    INT32 totalSize = dib->dsBmih.biSizeImage? dib->dsBmih.biSizeImage
+                         : dib->dsBm.bmWidthBytes * effHeight;
+    DWORD old_prot;
+
+    VirtualProtect(dib->dsBm.bmBits, totalSize, new_prot, &old_prot);
+    TRACE(bitmap, "Changed protection from %ld to %ld\n", 
+                  old_prot, new_prot);
+}
+
+/***********************************************************************
+ *           DIB_DoUpdateDIBSection
+ */
+static void DIB_DoUpdateDIBSection( BITMAPOBJ *bmp, BOOL32 toDIB )
+{
+    DIBSECTION *dib = bmp->dibSection;
+    DIB_SETIMAGEBITS_DESCR descr;
+
+    if (DIB_GetBitmapInfo( &dib->dsBmih, &descr.infoWidth, &descr.lines,
+                           &descr.infoBpp, &descr.compression ) == -1)
+	return;
+
+    descr.dc        = NULL;
+    descr.colorMap  = bmp->colorMap;
+    descr.nColorMap = bmp->nColorMap;
+    descr.bits      = dib->dsBm.bmBits;
+    descr.depth     = bmp->bitmap.bmBitsPixel;
+    descr.drawable  = bmp->pixmap;
+    descr.gc        = BITMAP_GC(bmp);
+    descr.xSrc      = 0;
+    descr.ySrc      = 0;
+    descr.xDest     = 0;
+    descr.yDest     = 0;
+    descr.width     = bmp->bitmap.bmWidth;
+    descr.height    = bmp->bitmap.bmHeight;
+
+    if (toDIB)
+    {
+        TRACE(bitmap, "Copying from Pixmap to DIB bits\n");
+        EnterCriticalSection( &X11DRV_CritSection );
+        CALL_LARGE_STACK( DIB_GetImageBits, &descr );
+        LeaveCriticalSection( &X11DRV_CritSection );
+    }
+    else
+    {
+	TRACE(bitmap, "Copying from DIB bits to Pixmap\n"); 
+        EnterCriticalSection( &X11DRV_CritSection );
+        CALL_LARGE_STACK( DIB_SetImageBits, &descr );
+        LeaveCriticalSection( &X11DRV_CritSection );
+    }
+}
+
+/***********************************************************************
+ *           DIB_FaultHandler
+ */
+static BOOL32 DIB_FaultHandler( LPVOID res, LPVOID addr )
+{
+    BOOL32 handled = FALSE;
+    BITMAPOBJ *bmp;
+
+    bmp = (BITMAPOBJ *)GDI_GetObjPtr( (HBITMAP32)res, BITMAP_MAGIC );
+    if (!bmp) return FALSE;
+
+    if (bmp->dibSection)
+        switch (bmp->status)
+        {
+        case DIB_GdiMod:
+            TRACE( bitmap, "called in status DIB_GdiMod\n" );
+            DIB_DoProtectDIBSection( bmp, PAGE_READWRITE );
+            DIB_DoUpdateDIBSection( bmp, TRUE );
+            DIB_DoProtectDIBSection( bmp, PAGE_READONLY );
+            bmp->status = DIB_InSync;
+            handled = TRUE;
+            break;
+
+        case DIB_InSync:
+            TRACE( bitmap, "called in status DIB_InSync\n" );
+            DIB_DoProtectDIBSection( bmp, PAGE_READWRITE );
+            bmp->status = DIB_AppMod;
+            handled = TRUE;
+            break;
+
+        case DIB_AppMod:
+            FIXME( bitmap, "called in status DIB_AppMod: "
+                           "this can't happen!\n" );
+            break;
+
+        case DIB_NoHandler:
+            FIXME( bitmap, "called in status DIB_NoHandler: "
+                           "this can't happen!\n" );
+            break;
+        }
+
+    GDI_HEAP_UNLOCK( (HBITMAP32)res );
+    return handled;
+}
+
+/***********************************************************************
+ *           DIB_UpdateDIBSection
+ */
+void DIB_UpdateDIBSection( DC *dc, BOOL32 toDIB )
+{
+    BITMAPOBJ *bmp;
+
+    /* Ensure this is a Compatible DC that has a DIB section selected */
+
+    if (!dc) return;
+    if (!(dc->w.flags & DC_MEMORY)) return;
+
+    bmp = (BITMAPOBJ *)GDI_GetObjPtr( dc->w.hBitmap, BITMAP_MAGIC );
+    if (!bmp) return;
+
+    if (!bmp->dibSection)
+    {
+	GDI_HEAP_UNLOCK(dc->w.hBitmap);
+	return;
+    }
+
+
+    if (!toDIB)
+    {
+        /* Prepare for access to the DIB by GDI functions */
+
+        switch (bmp->status)
+        {
+        default:
+        case DIB_NoHandler:
+            DIB_DoUpdateDIBSection( bmp, FALSE );
+            break;
+
+        case DIB_GdiMod:
+            TRACE( bitmap, "fromDIB called in status DIB_GdiMod\n" );
+            /* nothing to do */
+            break;
+
+        case DIB_InSync:
+            TRACE( bitmap, "fromDIB called in status DIB_InSync\n" );
+            /* nothing to do */
+            break;
+
+        case DIB_AppMod:
+            TRACE( bitmap, "fromDIB called in status DIB_AppMod\n" );
+            DIB_DoUpdateDIBSection( bmp, FALSE );
+            DIB_DoProtectDIBSection( bmp, PAGE_READONLY );
+            bmp->status = DIB_InSync;
+            break;
+        }
+    }
+    else
+    {
+        /* Acknowledge write access to the DIB by GDI functions */
+
+        switch (bmp->status)
+        {
+        default:
+        case DIB_NoHandler:
+            DIB_DoUpdateDIBSection( bmp, TRUE );
+            break;
+
+        case DIB_GdiMod:
+            TRACE( bitmap, "  toDIB called in status DIB_GdiMod\n" );
+            /* nothing to do */
+            break;
+
+        case DIB_InSync:
+            TRACE( bitmap, "  toDIB called in status DIB_InSync\n" );
+            DIB_DoProtectDIBSection( bmp, PAGE_NOACCESS );
+            bmp->status = DIB_GdiMod;
+            break;
+
+        case DIB_AppMod:
+            FIXME( bitmap, "  toDIB called in status DIB_AppMod: "
+                           "this can't happen!\n" );
+            break;
+        }
+    }
+
+  
+    GDI_HEAP_UNLOCK(dc->w.hBitmap);
+}
+
 /***********************************************************************
  *           CreateDIBSection16    (GDI.489)
  */
@@ -1516,6 +2032,7 @@
 
     /* Fill BITMAP32 structure with DIB data */
     BITMAPINFOHEADER *bi = &bmi->bmiHeader;
+    INT32 effHeight, totalSize;
     BITMAP32 bm;
 
     TRACE(bitmap, "format (%ld,%ld), planes %d, bpp %d, size %ld, colors %ld (%s)\n",
@@ -1537,15 +2054,15 @@
     bm.bmBits = NULL;
 
     /* Get storage location for DIB bits */
-    if (section)
-	FIXME(bitmap, "section != NULL not implemented!\n");	
-    else
-    {
-	INT32 totalSize = bi->biSizeImage? bi->biSizeImage
-                                         : bm.bmWidthBytes * bm.bmHeight;
+    effHeight = bm.bmHeight >= 0 ? bm.bmHeight : -bm.bmHeight;
+    totalSize = bi->biSizeImage? bi->biSizeImage : bm.bmWidthBytes * effHeight;
 
-	bm.bmBits = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, totalSize);
-    }
+    if (section)
+        bm.bmBits = MapViewOfFile(section, FILE_MAP_ALL_ACCESS, 
+                                  0L, offset, totalSize);
+    else
+	bm.bmBits = VirtualAlloc(NULL, totalSize, 
+                                 MEM_RESERVE|MEM_COMMIT, PAGE_READWRITE);
 
     /* Allocate Memory for DIB and fill structure */
     if (bm.bmBits)
@@ -1587,94 +2104,35 @@
 	    bmp->dibSection = dib;
             bmp->colorMap   = colorMap;
 	    bmp->nColorMap  = nColorMap;
-	    GDI_HEAP_UNLOCK(res);
+            bmp->status     = DIB_NoHandler;
        }
     }
 
     /* Clean up in case of errors */
     if (!res || !bmp || !dib || !bm.bmBits || (bm.bmBitsPixel <= 8 && !colorMap))
     {
-	if (bm.bmBits && section) 
-	    HeapFree(GetProcessHeap(), 0, bm.bmBits), bm.bmBits = NULL;
+	if (bm.bmBits)
+            if (section)
+                UnmapViewOfFile(bm.bmBits), bm.bmBits = NULL;
+            else
+                VirtualFree(bm.bmBits, MEM_RELEASE, 0L), bm.bmBits = NULL;
 
 	if (colorMap) HeapFree(GetProcessHeap(), 0, colorMap), colorMap = NULL;
 	if (dib) HeapFree(GetProcessHeap(), 0, dib), dib = NULL;
 	if (res) DeleteObject32(res), res = 0;
     }
 
+    /* Install fault handler, if possible */
+    if (bm.bmBits)
+        if (VIRTUAL_SetFaultHandler(bm.bmBits, DIB_FaultHandler, (LPVOID)res))
+        {
+            DIB_DoProtectDIBSection( bmp, PAGE_READONLY );
+            bmp->status = DIB_InSync;
+        }
+
     /* Return BITMAP handle and storage location */
+    if (res) GDI_HEAP_UNLOCK(res);
     if (bm.bmBits && bits) *bits = bm.bmBits;
     return res;
 }
 
-/***********************************************************************
- *           DIB_UpdateDIBSection
- */
-void DIB_UpdateDIBSection( DC *dc, BOOL32 toDIB )
-{
-    BITMAPOBJ *bmp;
-    DIBSECTION *dib;
-
-    /* Ensure this is a Compatible DC that has a DIB section selected */
-
-    if (!dc) return;
-    if (!(dc->w.flags & DC_MEMORY)) return;
-
-    bmp = (BITMAPOBJ *)GDI_GetObjPtr( dc->w.hBitmap, BITMAP_MAGIC );
-    if (!bmp) return;
-
-    dib = bmp->dibSection;
-    if (!dib)
-    {
-	GDI_HEAP_UNLOCK(dc->w.hBitmap);
-	return;
-    }
-
-  
-    /* Copy Pixmap to bits */
-    if (toDIB)
-    {
-        /* Expect colour corruption if you uncomment this. -MF */
-//        BITMAPINFO bi;
-//        bi.bmiHeader = dib->dsBmih;
-//        bi.bmiHeader.biClrUsed = 0; /* don't copy palette */
-//        TRACE(bitmap, "Copying from Pixmap to DIB bits\n");
-//        GetDIBits32( dc->hSelf, dc->w.hBitmap, 0, dib->dsBmih.biHeight,
-//                     dib->dsBm.bmBits, &bi, 0 );
-    }
-
-    /* Copy bits to Pixmap */
-    else
-    {
-    	DIB_SETIMAGEBITS_DESCR descr;
-
-	TRACE(bitmap, "Copying from DIB bits to Pixmap\n"); 
-	if (DIB_GetBitmapInfo( &dib->dsBmih, &descr.infoWidth, &descr.lines,
-			       &descr.infoBpp, &descr.compression ) == -1)
-	{
-	    GDI_HEAP_UNLOCK(dc->w.hBitmap);
-	    return;
-	}
-
-        descr.dc        = dc;
-        descr.colorMap  = bmp->colorMap;
-        descr.nColorMap = bmp->nColorMap;
-        descr.bits      = dib->dsBm.bmBits;
-        descr.depth     = bmp->bitmap.bmBitsPixel;
-        descr.drawable  = bmp->pixmap;
-        descr.gc        = BITMAP_GC(bmp);
-        descr.xSrc      = 0;
-        descr.ySrc      = 0;
-        descr.xDest     = 0;
-        descr.yDest     = 0;
-        descr.width     = bmp->bitmap.bmWidth;
-        descr.height    = bmp->bitmap.bmHeight;
-
-        EnterCriticalSection( &X11DRV_CritSection );
-        CALL_LARGE_STACK( DIB_SetImageBits, &descr );
-        LeaveCriticalSection( &X11DRV_CritSection );
-    }
-
-    GDI_HEAP_UNLOCK(dc->w.hBitmap);
-}
-
diff --git a/objects/gdiobj.c b/objects/gdiobj.c
index 22c8722..c3ded34 100644
--- a/objects/gdiobj.c
+++ b/objects/gdiobj.c
@@ -246,21 +246,20 @@
 
     DIB_Init();	/* always before X11DRV_Init() */
 
-    if( X11DRV_Init() )
-    {
+    if( ! X11DRV_Init() )
+        return FALSE;
+
 	/* Create default palette */
 
       /* DR well *this* palette can't be moveable (?) */
-
-	HPALETTE16 hpalette = PALETTE_Init();
-
-	if( hpalette )
-	{
-	    StockObjects[DEFAULT_PALETTE] = (GDIOBJHDR *)GDI_HEAP_LOCK( hpalette );
-	    return TRUE;
-	}
+    {
+    HPALETTE16 hpalette = PALETTE_Init();
+    if( !hpalette )
+        return FALSE;
+    StockObjects[DEFAULT_PALETTE] = (GDIOBJHDR *)GDI_HEAP_LOCK( hpalette );
     }
-    return FALSE;
+
+    return TRUE;
 }
 
 
diff --git a/objects/oembitmap.c b/objects/oembitmap.c
index 8dbd25f..cc4d191 100644
--- a/objects/oembitmap.c
+++ b/objects/oembitmap.c
@@ -340,6 +340,7 @@
     bmpObjPtr->dibSection          = NULL;
     bmpObjPtr->colorMap            = NULL;
     bmpObjPtr->nColorMap           = 0;
+    bmpObjPtr->status              = DIB_NoHandler;
 
     GDI_HEAP_UNLOCK( hbitmap );
     return hbitmap;
diff --git a/ole/folders.c b/ole/folders.c
index a9fc717..1c37812 100644
--- a/ole/folders.c
+++ b/ole/folders.c
@@ -2,6 +2,9 @@
  *	Shell Folder stuff
  *
  *	Copyright 1997	Marcus Meissner
+ *
+ *  currently work in progress on IShellFolders,IEnumIDList and pidl handling
+ *  <contact juergen.schmied@metronet.de, 980624>
  */
 
 #include <ctype.h>
@@ -13,6 +16,7 @@
 #include "compobj.h"
 #include "interfaces.h"
 #include "shlobj.h"
+#include "winerror.h"
 
 /******************************************************************************
  * IEnumIDList implementation
@@ -66,7 +70,7 @@
  * IShellFolder implementation
  */
 static ULONG WINAPI IShellFolder_Release(LPSHELLFOLDER this) {
-	TRACE(ole,"(%p)->()\n",this);
+	TRACE(ole,"(%p)->(count=%lu)\n",this,this->ref);
 	if (!--(this->ref)) {
 		WARN(ole," freeing IShellFolder(%p)\n",this);
 		HeapFree(GetProcessHeap(),0,this);
@@ -76,43 +80,65 @@
 }
 
 static ULONG WINAPI IShellFolder_AddRef(LPSHELLFOLDER this) {
-	TRACE(ole,"(%p)->()\n",this);
+	TRACE(ole,"(%p)->(count=%lu)\n",this,(this->ref)+1);
 	return ++(this->ref);
 }
 
 static HRESULT WINAPI IShellFolder_GetAttributesOf(
 	LPSHELLFOLDER this,UINT32 cidl,LPCITEMIDLIST *apidl,DWORD *rgfInOut
 ) {
-	FIXME(ole,"(%p)->(%d,%p,%p),stub!\n",
-		this,cidl,apidl,rgfInOut
+	FIXME(ole,"\n	(%p)->(%d,%p->(%p),%p),stub!\n",
+		this,cidl,apidl,*apidl,rgfInOut
 	);
-	return 0;
+	return E_NOTIMPL;
 }
 
+/*---------------------------------------------------------------
+!		IShellFolder_BindToObject
+!
+*/
 static HRESULT WINAPI IShellFolder_BindToObject(
-	LPSHELLFOLDER this,LPCITEMIDLIST pidl,LPBC pbcReserved,REFIID riid,LPVOID * ppvOut
-) {
-	char	xclsid[50];
+	LPSHELLFOLDER this,LPCITEMIDLIST pidl,LPBC pbcReserved,
+	REFIID riid,LPVOID * ppvOut)
+  {	char	xclsid[50];
 
-	WINE_StringFromCLSID(riid,xclsid);
-	FIXME(ole,"(%p)->(%p,%p,%s,%p),stub!\n",
-		this,pidl,pbcReserved,xclsid,ppvOut
-	);
-	*ppvOut = IShellFolder_Constructor();
-	return 0;
+		WINE_StringFromCLSID(riid,xclsid);
+
+		FIXME(ole,"(%p)->(pidl:%p,%p,%s,%p),stub!\n",this,pidl,pbcReserved,xclsid,ppvOut);
+		*ppvOut = IShellFolder_Constructor();
+
+		return E_NOTIMPL;
 }
-
+/*---------------------------------------------------------------
+!		IShellFolder_ParseDisplayName
+!
+*/
 static HRESULT WINAPI IShellFolder_ParseDisplayName(
 	LPSHELLFOLDER this,HWND32 hwndOwner,LPBC pbcReserved,
 	LPOLESTR32 lpszDisplayName,DWORD *pchEaten,LPITEMIDLIST *ppidl,
 	DWORD *pdwAttributes
-) {
-	FIXME(ole,"(%p)->(%08x,%p,%p,%p,%p,%p),stub!\n",
-		this,hwndOwner,pbcReserved,lpszDisplayName,pchEaten,ppidl,pdwAttributes
+) {	TRACE(ole,"(%p)->(%08x,%p,%p=%s,%p,%p,%p)\n",
+		this,hwndOwner,pbcReserved,lpszDisplayName,debugstr_w(lpszDisplayName),pchEaten,ppidl,pdwAttributes
 	);
-	if (pbcReserved)
-		*(DWORD*)pbcReserved = 0;
-	return 0;
+//	if (pbcReserved)
+//		*(DWORD*)pbcReserved = 0;
+
+	*ppidl = (LPITEMIDLIST)HeapAlloc(GetProcessHeap(),0,sizeof(ITEMIDLIST));
+	(*ppidl)->mkid.cb = 0x0;		/*the first ITEMIDLIST*/
+	(*ppidl)->mkid.abID[0] = 0x0;		/*the first ITEMIDLIST*/
+
+//	((LPITEMIDLIST) (((LPBYTE)ppidl)+4) )->mkid.cb=0; /*the second ITEMIDLIST*/
+//	((LPITEMIDLIST) (((LPBYTE)ppidl)+4) )->mkid.abID[0]=0; /*the second ITEMIDLIST*/
+	FIXME(shell, "return dummy ITEMIDLIST only (pidl %p)\n",*ppidl);
+ 
+	/* it is NULL if the caller don't request attributes*/
+	if (pdwAttributes)
+	{	*pdwAttributes=SFGAO_FOLDER;
+	}
+
+	//*pchEaten = lstrlen32W(lpszDisplayName); 		/* number of char's parsed*/
+	//TRACE(shell,"%1 chars parsed",*pchEaten)
+	return NOERROR;
 }
 
 static HRESULT WINAPI IShellFolder_EnumObjects(
@@ -158,10 +184,10 @@
 
 LPSHELLFOLDER IShellFolder_Constructor() {
 	LPSHELLFOLDER	sf;
-
 	sf = (LPSHELLFOLDER)HeapAlloc(GetProcessHeap(),0,sizeof(IShellFolder));
 	sf->ref		= 1;
 	sf->lpvtbl	= &sfvt;
+	TRACE(ole,"(%p)->()\n",sf);
 	return sf;
 }
 
diff --git a/ole/nls/afk.nls b/ole/nls/afk.nls
new file mode 100644
index 0000000..d994f574
--- /dev/null
+++ b/ole/nls/afk.nls
@@ -0,0 +1,110 @@
+/*
+ *	OLE2NLS library
+ *      Afrikaans (South Africa)
+ */
+
+/* LOCVAL(LOCALE_ILANGUAGE,"") */
+/* LOCVAL(LOCALE_SLANGUAGE,"") */
+/* LOCVAL(LOCALE_SENGLANGUAGE,"") */
+/* LOCVAL(LOCALE_SABBREVLANGNAME,"") */
+/* LOCVAL(LOCALE_SNATIVELANGNAME,"") */
+/* LOCVAL(LOCALE_ICOUNTRY,"") */
+/* LOCVAL(LOCALE_SCOUNTRY,"") */
+/* LOCVAL(LOCALE_SENGCOUNTRY,"") */
+LOCVAL(LOCALE_SABBREVCTRYNAME,"afk")
+/* LOCVAL(LOCALE_SNATIVECTRYNAME,"") */
+/* LOCVAL(LOCALE_IDEFAULTLANGUAGE,"") */
+/* LOCVAL(LOCALE_IDEFAULTCOUNTRY,"") */
+/* LOCVAL(LOCALE_IDEFAULTCODEPAGE) */
+/* LOCVAL(LOCALE_IDEFAULTANSICODEPAGE) */
+/* LOCVAL(LOCALE_SLIST,"") */
+/* LOCVAL(LOCALE_IMEASURE,"") */
+/* LOCVAL(LOCALE_SDECIMAL,"") */
+/* LOCVAL(LOCALE_STHOUSAND,"") */
+/* LOCVAL(LOCALE_SGROUPING) */
+/* LOCVAL(LOCALE_IDIGITS,"2") */
+/* LOCVAL(LOCALE_ILZERO,"1") */
+/* LOCVAL(LOCALE_INEGNUMBER) */
+/* LOCVAL(LOCALE_SNATIVEDIGITS) */
+/* LOCVAL(LOCALE_SCURRENCY,"") */
+/* LOCVAL(LOCALE_SINTLSYMBOL) */
+/* LOCVAL(LOCALE_SMONDECIMALSEP,",") */
+/* LOCVAL(LOCALE_SMONTHOUSANDSEP,".") */
+/* LOCVAL(LOCALE_SMONGROUPING) */
+/* LOCVAL(LOCALE_ICURRDIGITS,"2") */
+/* LOCVAL(LOCALE_IINTLCURRDIGITS) */
+/* LOCVAL(LOCALE_ICURRENCY,"3") */
+/* LOCVAL(LOCALE_INEGCURR,"8") */
+/* LOCVAL(LOCALE_SDATE,".") */
+/* LOCVAL(LOCALE_STIME,":") */
+/* LOCVAL(LOCALE_SSHORTDATE,"dd/MM-yyyy") */
+/* LOCVAL(LOCALE_SLONGDATE,"ddd, d. MMMM yyyy") */
+/* LOCVAL(LOCALE_STIMEFORMAT) */
+/* LOCVAL(LOCALE_IDATE,"1") */
+/* LOCVAL(LOCALE_ILDATE) */
+/* LOCVAL(LOCALE_ITIME,"1")
+/* LOCVAL(LOCALE_ITIMEMARKPOSN) */
+/* LOCVAL(LOCALE_ICENTURY) */
+/* LOCVAL(LOCALE_ITLZERO,"1")
+/* LOCVAL(LOCALE_IDAYLZERO) */
+/* LOCVAL(LOCALE_IMONLZERO) */
+/* LOCVAL(LOCALE_S1159, "") */
+/* LOCVAL(LOCALE_S2359, "") */
+/* LOCVAL(LOCALE_ICALENDARTYPE) */
+/* LOCVAL(LOCALE_IOPTIONALCALENDAR) */
+/* LOCVAL(LOCALE_IFIRSTDAYOFWEEK) */
+/* LOCVAL(LOCALE_IFIRSTWEEKOFYEAR) */
+
+/* LOCVAL(LOCALE_SDAYNAME1,"") */
+/* LOCVAL(LOCALE_SDAYNAME2,"") */
+/* LOCVAL(LOCALE_SDAYNAME3,"") */
+/* LOCVAL(LOCALE_SDAYNAME4,"") */
+/* LOCVAL(LOCALE_SDAYNAME5,"") */
+/* LOCVAL(LOCALE_SDAYNAME6,"") */
+/* LOCVAL(LOCALE_SDAYNAME7,"") */
+
+/* LOCVAL(LOCALE_SABBREVDAYNAME1,"Ma") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME2,"Ti") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME3,"On") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME4,"To") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME5,"Fr") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME6,"Lø") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME7,"Sø") */
+
+/* LOCVAL(LOCALE_SMONTHNAME1,"") */
+/* LOCVAL(LOCALE_SMONTHNAME2,"") */
+/* LOCVAL(LOCALE_SMONTHNAME3,"") */
+/* LOCVAL(LOCALE_SMONTHNAME4,"") */
+/* LOCVAL(LOCALE_SMONTHNAME5,"") */
+/* LOCVAL(LOCALE_SMONTHNAME6,"") */
+/* LOCVAL(LOCALE_SMONTHNAME7,"") */
+/* LOCVAL(LOCALE_SMONTHNAME8,"") */
+/* LOCVAL(LOCALE_SMONTHNAME9,"") */
+/* LOCVAL(LOCALE_SMONTHNAME10,"") */
+/* LOCVAL(LOCALE_SMONTHNAME11,"") */
+/* LOCVAL(LOCALE_SMONTHNAME12,"") */
+/* LOCVAL(LOCALE_SMONTHNAME13,"") */
+
+/* LOCVAL(LOCALE_SABBREVMONTHNAME1,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME2,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME3,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME4,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME5,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME6,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME7,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME8,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME9,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME10,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME11,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME12,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME13,"") */
+
+/* LOCVAL(LOCALE_SPOSITIVESIGN, "") */
+/* LOCVAL(LOCALE_SNEGATIVESIGN, "") */
+/* LOCVAL(LOCALE_IPOSSIGNPOSN, "") */
+/* LOCVAL(LOCALE_INEGSIGNPOSN, "") */
+/* LOCVAL(LOCALE_IPOSSYMPRECEDES, "") */
+/* LOCVAL(LOCALE_IPOSSEPBYSPACE, "") */
+/* LOCVAL(LOCALE_INEGSYMPRECEDES, "") */
+/* LOCVAL(LOCALE_INEGSEPBYSPACE, "") */
+
diff --git a/ole/nls/bel.nls b/ole/nls/bel.nls
new file mode 100644
index 0000000..435edcb
--- /dev/null
+++ b/ole/nls/bel.nls
@@ -0,0 +1,110 @@
+/*
+ *	OLE2NLS library
+ *      Belarusian
+ */
+
+/* LOCVAL(LOCALE_ILANGUAGE,"") */
+/* LOCVAL(LOCALE_SLANGUAGE,"") */
+/* LOCVAL(LOCALE_SENGLANGUAGE,"") */
+/* LOCVAL(LOCALE_SABBREVLANGNAME,"") */
+/* LOCVAL(LOCALE_SNATIVELANGNAME,"") */
+/* LOCVAL(LOCALE_ICOUNTRY,"") */
+/* LOCVAL(LOCALE_SCOUNTRY,"") */
+/* LOCVAL(LOCALE_SENGCOUNTRY,"") */
+LOCVAL(LOCALE_SABBREVCTRYNAME,"bel")
+/* LOCVAL(LOCALE_SNATIVECTRYNAME,"") */
+/* LOCVAL(LOCALE_IDEFAULTLANGUAGE,"") */
+/* LOCVAL(LOCALE_IDEFAULTCOUNTRY,"") */
+/* LOCVAL(LOCALE_IDEFAULTCODEPAGE) */
+/* LOCVAL(LOCALE_IDEFAULTANSICODEPAGE) */
+/* LOCVAL(LOCALE_SLIST,"") */
+/* LOCVAL(LOCALE_IMEASURE,"") */
+/* LOCVAL(LOCALE_SDECIMAL,"") */
+/* LOCVAL(LOCALE_STHOUSAND,"") */
+/* LOCVAL(LOCALE_SGROUPING) */
+/* LOCVAL(LOCALE_IDIGITS,"2") */
+/* LOCVAL(LOCALE_ILZERO,"1") */
+/* LOCVAL(LOCALE_INEGNUMBER) */
+/* LOCVAL(LOCALE_SNATIVEDIGITS) */
+/* LOCVAL(LOCALE_SCURRENCY,"") */
+/* LOCVAL(LOCALE_SINTLSYMBOL) */
+/* LOCVAL(LOCALE_SMONDECIMALSEP,",") */
+/* LOCVAL(LOCALE_SMONTHOUSANDSEP,".") */
+/* LOCVAL(LOCALE_SMONGROUPING) */
+/* LOCVAL(LOCALE_ICURRDIGITS,"2") */
+/* LOCVAL(LOCALE_IINTLCURRDIGITS) */
+/* LOCVAL(LOCALE_ICURRENCY,"3") */
+/* LOCVAL(LOCALE_INEGCURR,"8") */
+/* LOCVAL(LOCALE_SDATE,".") */
+/* LOCVAL(LOCALE_STIME,":") */
+/* LOCVAL(LOCALE_SSHORTDATE,"dd/MM-yyyy") */
+/* LOCVAL(LOCALE_SLONGDATE,"ddd, d. MMMM yyyy") */
+/* LOCVAL(LOCALE_STIMEFORMAT) */
+/* LOCVAL(LOCALE_IDATE,"1") */
+/* LOCVAL(LOCALE_ILDATE) */
+/* LOCVAL(LOCALE_ITIME,"1")
+/* LOCVAL(LOCALE_ITIMEMARKPOSN) */
+/* LOCVAL(LOCALE_ICENTURY) */
+/* LOCVAL(LOCALE_ITLZERO,"1")
+/* LOCVAL(LOCALE_IDAYLZERO) */
+/* LOCVAL(LOCALE_IMONLZERO) */
+/* LOCVAL(LOCALE_S1159, "") */
+/* LOCVAL(LOCALE_S2359, "") */
+/* LOCVAL(LOCALE_ICALENDARTYPE) */
+/* LOCVAL(LOCALE_IOPTIONALCALENDAR) */
+/* LOCVAL(LOCALE_IFIRSTDAYOFWEEK) */
+/* LOCVAL(LOCALE_IFIRSTWEEKOFYEAR) */
+
+/* LOCVAL(LOCALE_SDAYNAME1,"") */
+/* LOCVAL(LOCALE_SDAYNAME2,"") */
+/* LOCVAL(LOCALE_SDAYNAME3,"") */
+/* LOCVAL(LOCALE_SDAYNAME4,"") */
+/* LOCVAL(LOCALE_SDAYNAME5,"") */
+/* LOCVAL(LOCALE_SDAYNAME6,"") */
+/* LOCVAL(LOCALE_SDAYNAME7,"") */
+
+/* LOCVAL(LOCALE_SABBREVDAYNAME1,"Ma") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME2,"Ti") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME3,"On") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME4,"To") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME5,"Fr") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME6,"Lø") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME7,"Sø") */
+
+/* LOCVAL(LOCALE_SMONTHNAME1,"") */
+/* LOCVAL(LOCALE_SMONTHNAME2,"") */
+/* LOCVAL(LOCALE_SMONTHNAME3,"") */
+/* LOCVAL(LOCALE_SMONTHNAME4,"") */
+/* LOCVAL(LOCALE_SMONTHNAME5,"") */
+/* LOCVAL(LOCALE_SMONTHNAME6,"") */
+/* LOCVAL(LOCALE_SMONTHNAME7,"") */
+/* LOCVAL(LOCALE_SMONTHNAME8,"") */
+/* LOCVAL(LOCALE_SMONTHNAME9,"") */
+/* LOCVAL(LOCALE_SMONTHNAME10,"") */
+/* LOCVAL(LOCALE_SMONTHNAME11,"") */
+/* LOCVAL(LOCALE_SMONTHNAME12,"") */
+/* LOCVAL(LOCALE_SMONTHNAME13,"") */
+
+/* LOCVAL(LOCALE_SABBREVMONTHNAME1,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME2,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME3,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME4,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME5,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME6,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME7,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME8,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME9,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME10,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME11,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME12,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME13,"") */
+
+/* LOCVAL(LOCALE_SPOSITIVESIGN, "") */
+/* LOCVAL(LOCALE_SNEGATIVESIGN, "") */
+/* LOCVAL(LOCALE_IPOSSIGNPOSN, "") */
+/* LOCVAL(LOCALE_INEGSIGNPOSN, "") */
+/* LOCVAL(LOCALE_IPOSSYMPRECEDES, "") */
+/* LOCVAL(LOCALE_IPOSSEPBYSPACE, "") */
+/* LOCVAL(LOCALE_INEGSYMPRECEDES, "") */
+/* LOCVAL(LOCALE_INEGSEPBYSPACE, "") */
+
diff --git a/ole/nls/bgr.nls b/ole/nls/bgr.nls
new file mode 100644
index 0000000..f423cac
--- /dev/null
+++ b/ole/nls/bgr.nls
@@ -0,0 +1,110 @@
+/*
+ *	OLE2NLS library
+ *      Bulgaria
+ */
+
+/* LOCVAL(LOCALE_ILANGUAGE,"") */
+/* LOCVAL(LOCALE_SLANGUAGE,"") */
+LOCVAL(LOCALE_SENGLANGUAGE,"Bulgarian")
+LOCVAL(LOCALE_SABBREVLANGNAME,"bgr")
+/* LOCVAL(LOCALE_SNATIVELANGNAME,"") */
+/* LOCVAL(LOCALE_ICOUNTRY,"") */
+/* LOCVAL(LOCALE_SCOUNTRY,"") */
+/* LOCVAL(LOCALE_SENGCOUNTRY,"") */
+LOCVAL(LOCALE_SABBREVCTRYNAME,"bgr")
+/* LOCVAL(LOCALE_SNATIVECTRYNAME,"") */
+/* LOCVAL(LOCALE_IDEFAULTLANGUAGE,"") */
+/* LOCVAL(LOCALE_IDEFAULTCOUNTRY,"") */
+/* LOCVAL(LOCALE_IDEFAULTCODEPAGE) */
+/* LOCVAL(LOCALE_IDEFAULTANSICODEPAGE) */
+/* LOCVAL(LOCALE_SLIST,"") */
+/* LOCVAL(LOCALE_IMEASURE,"") */
+/* LOCVAL(LOCALE_SDECIMAL,"") */
+/* LOCVAL(LOCALE_STHOUSAND,"") */
+/* LOCVAL(LOCALE_SGROUPING) */
+/* LOCVAL(LOCALE_IDIGITS,"2") */
+/* LOCVAL(LOCALE_ILZERO,"1") */
+/* LOCVAL(LOCALE_INEGNUMBER) */
+/* LOCVAL(LOCALE_SNATIVEDIGITS) */
+/* LOCVAL(LOCALE_SCURRENCY,"") */
+/* LOCVAL(LOCALE_SINTLSYMBOL) */
+/* LOCVAL(LOCALE_SMONDECIMALSEP,",") */
+/* LOCVAL(LOCALE_SMONTHOUSANDSEP,".") */
+/* LOCVAL(LOCALE_SMONGROUPING) */
+/* LOCVAL(LOCALE_ICURRDIGITS,"2") */
+/* LOCVAL(LOCALE_IINTLCURRDIGITS) */
+/* LOCVAL(LOCALE_ICURRENCY,"3") */
+/* LOCVAL(LOCALE_INEGCURR,"8") */
+/* LOCVAL(LOCALE_SDATE,".") */
+/* LOCVAL(LOCALE_STIME,":") */
+/* LOCVAL(LOCALE_SSHORTDATE,"dd/MM-yyyy") */
+/* LOCVAL(LOCALE_SLONGDATE,"ddd, d. MMMM yyyy") */
+/* LOCVAL(LOCALE_STIMEFORMAT) */
+/* LOCVAL(LOCALE_IDATE,"1") */
+/* LOCVAL(LOCALE_ILDATE) */
+/* LOCVAL(LOCALE_ITIME,"1")
+/* LOCVAL(LOCALE_ITIMEMARKPOSN) */
+/* LOCVAL(LOCALE_ICENTURY) */
+/* LOCVAL(LOCALE_ITLZERO,"1")
+/* LOCVAL(LOCALE_IDAYLZERO) */
+/* LOCVAL(LOCALE_IMONLZERO) */
+/* LOCVAL(LOCALE_S1159, "") */
+/* LOCVAL(LOCALE_S2359, "") */
+/* LOCVAL(LOCALE_ICALENDARTYPE) */
+/* LOCVAL(LOCALE_IOPTIONALCALENDAR) */
+/* LOCVAL(LOCALE_IFIRSTDAYOFWEEK) */
+/* LOCVAL(LOCALE_IFIRSTWEEKOFYEAR) */
+
+/* LOCVAL(LOCALE_SDAYNAME1,"") */
+/* LOCVAL(LOCALE_SDAYNAME2,"") */
+/* LOCVAL(LOCALE_SDAYNAME3,"") */
+/* LOCVAL(LOCALE_SDAYNAME4,"") */
+/* LOCVAL(LOCALE_SDAYNAME5,"") */
+/* LOCVAL(LOCALE_SDAYNAME6,"") */
+/* LOCVAL(LOCALE_SDAYNAME7,"") */
+
+/* LOCVAL(LOCALE_SABBREVDAYNAME1,"Ma") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME2,"Ti") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME3,"On") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME4,"To") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME5,"Fr") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME6,"Lø") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME7,"Sø") */
+
+/* LOCVAL(LOCALE_SMONTHNAME1,"") */
+/* LOCVAL(LOCALE_SMONTHNAME2,"") */
+/* LOCVAL(LOCALE_SMONTHNAME3,"") */
+/* LOCVAL(LOCALE_SMONTHNAME4,"") */
+/* LOCVAL(LOCALE_SMONTHNAME5,"") */
+/* LOCVAL(LOCALE_SMONTHNAME6,"") */
+/* LOCVAL(LOCALE_SMONTHNAME7,"") */
+/* LOCVAL(LOCALE_SMONTHNAME8,"") */
+/* LOCVAL(LOCALE_SMONTHNAME9,"") */
+/* LOCVAL(LOCALE_SMONTHNAME10,"") */
+/* LOCVAL(LOCALE_SMONTHNAME11,"") */
+/* LOCVAL(LOCALE_SMONTHNAME12,"") */
+/* LOCVAL(LOCALE_SMONTHNAME13,"") */
+
+/* LOCVAL(LOCALE_SABBREVMONTHNAME1,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME2,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME3,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME4,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME5,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME6,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME7,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME8,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME9,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME10,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME11,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME12,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME13,"") */
+
+/* LOCVAL(LOCALE_SPOSITIVESIGN, "") */
+/* LOCVAL(LOCALE_SNEGATIVESIGN, "") */
+/* LOCVAL(LOCALE_IPOSSIGNPOSN, "") */
+/* LOCVAL(LOCALE_INEGSIGNPOSN, "") */
+/* LOCVAL(LOCALE_IPOSSYMPRECEDES, "") */
+/* LOCVAL(LOCALE_IPOSSEPBYSPACE, "") */
+/* LOCVAL(LOCALE_INEGSYMPRECEDES, "") */
+/* LOCVAL(LOCALE_INEGSEPBYSPACE, "") */
+
diff --git a/ole/nls/cat.nls b/ole/nls/cat.nls
new file mode 100644
index 0000000..06b6a50
--- /dev/null
+++ b/ole/nls/cat.nls
@@ -0,0 +1,110 @@
+/*
+ *	OLE2NLS library
+ *      Catalan
+ */
+
+/* LOCVAL(LOCALE_ILANGUAGE,"") */
+/* LOCVAL(LOCALE_SLANGUAGE,"") */
+LOCVAL(LOCALE_SENGLANGUAGE,"Spanish")
+LOCVAL(LOCALE_SABBREVLANGNAME,"esp")
+/* LOCVAL(LOCALE_SNATIVELANGNAME,"") */
+/* LOCVAL(LOCALE_ICOUNTRY,"") */
+/* LOCVAL(LOCALE_SCOUNTRY,"") */
+LOCVAL(LOCALE_SENGCOUNTRY,"Spain")
+LOCVAL(LOCALE_SABBREVCTRYNAME,"cat")
+/* LOCVAL(LOCALE_SNATIVECTRYNAME,"Espa€a") */
+/* LOCVAL(LOCALE_IDEFAULTLANGUAGE,"") */
+/* LOCVAL(LOCALE_IDEFAULTCOUNTRY,"") */
+/* LOCVAL(LOCALE_IDEFAULTCODEPAGE) */
+/* LOCVAL(LOCALE_IDEFAULTANSICODEPAGE) */
+/* LOCVAL(LOCALE_SLIST,"") */
+/* LOCVAL(LOCALE_IMEASURE,"") */
+/* LOCVAL(LOCALE_SDECIMAL,"") */
+/* LOCVAL(LOCALE_STHOUSAND,"") */
+/* LOCVAL(LOCALE_SGROUPING) */
+/* LOCVAL(LOCALE_IDIGITS,"2") */
+/* LOCVAL(LOCALE_ILZERO,"1") */
+/* LOCVAL(LOCALE_INEGNUMBER) */
+LOCVAL(LOCALE_SNATIVEDIGITS, "0123456789")
+LOCVAL(LOCALE_SCURRENCY,"Pts")
+LOCVAL(LOCALE_SINTLSYMBOL, "ESP")
+/* LOCVAL(LOCALE_SMONDECIMALSEP,",") */
+/* LOCVAL(LOCALE_SMONTHOUSANDSEP,".") */
+/* LOCVAL(LOCALE_SMONGROUPING) */
+/* LOCVAL(LOCALE_ICURRDIGITS,"2") */
+/* LOCVAL(LOCALE_IINTLCURRDIGITS) */
+/* LOCVAL(LOCALE_ICURRENCY,"3") */
+/* LOCVAL(LOCALE_INEGCURR,"8") */
+/* LOCVAL(LOCALE_SDATE,".") */
+/* LOCVAL(LOCALE_STIME,":") */
+/* LOCVAL(LOCALE_SSHORTDATE,"dd/MM-yyyy") */
+/* LOCVAL(LOCALE_SLONGDATE,"ddd, d. MMMM yyyy") */
+/* LOCVAL(LOCALE_STIMEFORMAT) */
+/* LOCVAL(LOCALE_IDATE,"1") */
+/* LOCVAL(LOCALE_ILDATE) */
+/* LOCVAL(LOCALE_ITIME,"1")
+/* LOCVAL(LOCALE_ITIMEMARKPOSN) */
+/* LOCVAL(LOCALE_ICENTURY) */
+/* LOCVAL(LOCALE_ITLZERO,"1")
+/* LOCVAL(LOCALE_IDAYLZERO) */
+/* LOCVAL(LOCALE_IMONLZERO) */
+/* LOCVAL(LOCALE_S1159, "") */
+/* LOCVAL(LOCALE_S2359, "") */
+/* LOCVAL(LOCALE_ICALENDARTYPE) */
+/* LOCVAL(LOCALE_IOPTIONALCALENDAR) */
+/* LOCVAL(LOCALE_IFIRSTDAYOFWEEK) */
+/* LOCVAL(LOCALE_IFIRSTWEEKOFYEAR) */
+
+LOCVAL(LOCALE_SDAYNAME1,"lunes")
+LOCVAL(LOCALE_SDAYNAME2,"martes")
+LOCVAL(LOCALE_SDAYNAME3,"mi?rcoles")
+LOCVAL(LOCALE_SDAYNAME4,"jueves")
+LOCVAL(LOCALE_SDAYNAME5,"viernes")
+LOCVAL(LOCALE_SDAYNAME6,"s?abado")
+LOCVAL(LOCALE_SDAYNAME7,"domingo")
+
+/* LOCVAL(LOCALE_SABBREVDAYNAME1,"lun") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME2,"mar") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME3,"mi?") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME4,"jue") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME5,"vie") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME6,"") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME7,"") */
+
+/* LOCVAL(LOCALE_SMONTHNAME1,"") */
+LOCVAL(LOCALE_SMONTHNAME2,"febrero")
+LOCVAL(LOCALE_SMONTHNAME3,"marzo")
+LOCVAL(LOCALE_SMONTHNAME4,"abril")
+LOCVAL(LOCALE_SMONTHNAME5,"mayo")
+LOCVAL(LOCALE_SMONTHNAME6,"junio")
+LOCVAL(LOCALE_SMONTHNAME7,"julio")
+LOCVAL(LOCALE_SMONTHNAME8,"agosto")
+LOCVAL(LOCALE_SMONTHNAME9,"septiembre")
+LOCVAL(LOCALE_SMONTHNAME10,"octubre")
+LOCVAL(LOCALE_SMONTHNAME11,"noviembre")
+LOCVAL(LOCALE_SMONTHNAME12,"diciembre")
+LOCVAL(LOCALE_SMONTHNAME13,"")
+
+LOCVAL(LOCALE_SABBREVMONTHNAME1,"ene")
+LOCVAL(LOCALE_SABBREVMONTHNAME2,"feb")
+LOCVAL(LOCALE_SABBREVMONTHNAME3,"mar")
+LOCVAL(LOCALE_SABBREVMONTHNAME4,"abr")
+LOCVAL(LOCALE_SABBREVMONTHNAME5,"may")
+LOCVAL(LOCALE_SABBREVMONTHNAME6,"jun")
+LOCVAL(LOCALE_SABBREVMONTHNAME7,"jul")
+LOCVAL(LOCALE_SABBREVMONTHNAME8,"ago")
+LOCVAL(LOCALE_SABBREVMONTHNAME9,"sep")
+LOCVAL(LOCALE_SABBREVMONTHNAME10,"oct")
+LOCVAL(LOCALE_SABBREVMONTHNAME11,"nov")
+LOCVAL(LOCALE_SABBREVMONTHNAME12,"dic")
+LOCVAL(LOCALE_SABBREVMONTHNAME13,"")
+
+/* LOCVAL(LOCALE_SPOSITIVESIGN, "") */
+/* LOCVAL(LOCALE_SNEGATIVESIGN, "") */
+/* LOCVAL(LOCALE_IPOSSIGNPOSN, "") */
+/* LOCVAL(LOCALE_INEGSIGNPOSN, "") */
+/* LOCVAL(LOCALE_IPOSSYMPRECEDES, "") */
+/* LOCVAL(LOCALE_IPOSSEPBYSPACE, "") */
+/* LOCVAL(LOCALE_INEGSYMPRECEDES, "") */
+/* LOCVAL(LOCALE_INEGSEPBYSPACE, "") */
+
diff --git a/ole/nls/cze.nls b/ole/nls/cze.nls
new file mode 100644
index 0000000..6d63603
--- /dev/null
+++ b/ole/nls/cze.nls
@@ -0,0 +1,110 @@
+/*
+ *	OLE2NLS library
+ *      Czech Republic
+ */
+
+/* LOCVAL(LOCALE_ILANGUAGE,"") */
+/* LOCVAL(LOCALE_SLANGUAGE,"") */
+/* LOCVAL(LOCALE_SENGLANGUAGE,"Czech Republic") */
+LOCVAL(LOCALE_SABBREVLANGNAME,"cze")
+/* LOCVAL(LOCALE_SNATIVELANGNAME,"?zech republika") */
+/* LOCVAL(LOCALE_ICOUNTRY,"") */
+/* LOCVAL(LOCALE_SCOUNTRY,"") */
+/* LOCVAL(LOCALE_SENGCOUNTRY,"") */
+LOCVAL(LOCALE_SABBREVCTRYNAME,"cze")
+/* LOCVAL(LOCALE_SNATIVECTRYNAME,"") */
+/* LOCVAL(LOCALE_IDEFAULTLANGUAGE,"") */
+/* LOCVAL(LOCALE_IDEFAULTCOUNTRY,"") */
+/* LOCVAL(LOCALE_IDEFAULTCODEPAGE) */
+/* LOCVAL(LOCALE_IDEFAULTANSICODEPAGE) */
+/* LOCVAL(LOCALE_SLIST,"") */
+/* LOCVAL(LOCALE_IMEASURE,"") */
+/* LOCVAL(LOCALE_SDECIMAL,"") */
+/* LOCVAL(LOCALE_STHOUSAND,"") */
+/* LOCVAL(LOCALE_SGROUPING) */
+/* LOCVAL(LOCALE_IDIGITS,"2") */
+/* LOCVAL(LOCALE_ILZERO,"1") */
+/* LOCVAL(LOCALE_INEGNUMBER) */
+/* LOCVAL(LOCALE_SNATIVEDIGITS) */
+/* LOCVAL(LOCALE_SCURRENCY,"") */
+/* LOCVAL(LOCALE_SINTLSYMBOL) */
+/* LOCVAL(LOCALE_SMONDECIMALSEP,",") */
+/* LOCVAL(LOCALE_SMONTHOUSANDSEP,".") */
+/* LOCVAL(LOCALE_SMONGROUPING) */
+/* LOCVAL(LOCALE_ICURRDIGITS,"2") */
+/* LOCVAL(LOCALE_IINTLCURRDIGITS) */
+/* LOCVAL(LOCALE_ICURRENCY,"3") */
+/* LOCVAL(LOCALE_INEGCURR,"8") */
+/* LOCVAL(LOCALE_SDATE,".") */
+/* LOCVAL(LOCALE_STIME,":") */
+/* LOCVAL(LOCALE_SSHORTDATE,"dd/MM-yyyy") */
+/* LOCVAL(LOCALE_SLONGDATE,"ddd, d. MMMM yyyy") */
+/* LOCVAL(LOCALE_STIMEFORMAT) */
+/* LOCVAL(LOCALE_IDATE,"1") */
+/* LOCVAL(LOCALE_ILDATE) */
+/* LOCVAL(LOCALE_ITIME,"1")
+/* LOCVAL(LOCALE_ITIMEMARKPOSN) */
+/* LOCVAL(LOCALE_ICENTURY) */
+/* LOCVAL(LOCALE_ITLZERO,"1")
+/* LOCVAL(LOCALE_IDAYLZERO) */
+/* LOCVAL(LOCALE_IMONLZERO) */
+/* LOCVAL(LOCALE_S1159, "") */
+/* LOCVAL(LOCALE_S2359, "") */
+/* LOCVAL(LOCALE_ICALENDARTYPE) */
+/* LOCVAL(LOCALE_IOPTIONALCALENDAR) */
+/* LOCVAL(LOCALE_IFIRSTDAYOFWEEK) */
+/* LOCVAL(LOCALE_IFIRSTWEEKOFYEAR) */
+
+/* LOCVAL(LOCALE_SDAYNAME1,"") */
+/* LOCVAL(LOCALE_SDAYNAME2,"") */
+/* LOCVAL(LOCALE_SDAYNAME3,"") */
+/* LOCVAL(LOCALE_SDAYNAME4,"") */
+/* LOCVAL(LOCALE_SDAYNAME5,"") */
+/* LOCVAL(LOCALE_SDAYNAME6,"") */
+/* LOCVAL(LOCALE_SDAYNAME7,"") */
+
+/* LOCVAL(LOCALE_SABBREVDAYNAME1,"Ma") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME2,"Ti") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME3,"On") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME4,"To") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME5,"Fr") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME6,"Lø") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME7,"Sø") */
+
+/* LOCVAL(LOCALE_SMONTHNAME1,"") */
+/* LOCVAL(LOCALE_SMONTHNAME2,"") */
+/* LOCVAL(LOCALE_SMONTHNAME3,"") */
+/* LOCVAL(LOCALE_SMONTHNAME4,"") */
+/* LOCVAL(LOCALE_SMONTHNAME5,"") */
+/* LOCVAL(LOCALE_SMONTHNAME6,"") */
+/* LOCVAL(LOCALE_SMONTHNAME7,"") */
+/* LOCVAL(LOCALE_SMONTHNAME8,"") */
+/* LOCVAL(LOCALE_SMONTHNAME9,"") */
+/* LOCVAL(LOCALE_SMONTHNAME10,"") */
+/* LOCVAL(LOCALE_SMONTHNAME11,"") */
+/* LOCVAL(LOCALE_SMONTHNAME12,"") */
+/* LOCVAL(LOCALE_SMONTHNAME13,"") */
+
+/* LOCVAL(LOCALE_SABBREVMONTHNAME1,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME2,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME3,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME4,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME5,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME6,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME7,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME8,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME9,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME10,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME11,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME12,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME13,"") */
+
+/* LOCVAL(LOCALE_SPOSITIVESIGN, "") */
+/* LOCVAL(LOCALE_SNEGATIVESIGN, "") */
+/* LOCVAL(LOCALE_IPOSSIGNPOSN, "") */
+/* LOCVAL(LOCALE_INEGSIGNPOSN, "") */
+/* LOCVAL(LOCALE_IPOSSYMPRECEDES, "") */
+/* LOCVAL(LOCALE_IPOSSEPBYSPACE, "") */
+/* LOCVAL(LOCALE_INEGSYMPRECEDES, "") */
+/* LOCVAL(LOCALE_INEGSEPBYSPACE, "") */
+
diff --git a/ole/nls/dea.nls b/ole/nls/dea.nls
new file mode 100644
index 0000000..dab500f
--- /dev/null
+++ b/ole/nls/dea.nls
@@ -0,0 +1,110 @@
+/*
+ *	OLE2NLS library
+ *      Austria
+ */
+ 
+LOCVAL(LOCALE_ILANGUAGE,"9")
+LOCVAL(LOCALE_SLANGUAGE,"Deutsch")
+LOCVAL(LOCALE_SENGLANGUAGE,"German")
+LOCVAL(LOCALE_SABBREVLANGNAME,"dea")
+LOCVAL(LOCALE_SNATIVELANGNAME,"€sterreich")
+LOCVAL(LOCALE_ICOUNTRY,"41")
+LOCVAL(LOCALE_SCOUNTRY,"€sterreich (Deutsch)")
+LOCVAL(LOCALE_SENGCOUNTRY,"Austria")
+LOCVAL(LOCALE_SABBREVCTRYNAME,"ATS")
+LOCVAL(LOCALE_SNATIVECTRYNAME,"€sterreich")
+LOCVAL(LOCALE_IDEFAULTLANGUAGE,"9")
+LOCVAL(LOCALE_IDEFAULTCOUNTRY,"41")
+LOCVAL(LOCALE_IDEFAULTCODEPAGE,"851")
+/* LOCVAL(LOCALE_IDEFAULTANSICODEPAGE) */
+LOCVAL(LOCALE_SLIST,";")
+LOCVAL(LOCALE_IMEASURE,"0")
+LOCVAL(LOCALE_SDECIMAL,".")
+LOCVAL(LOCALE_STHOUSAND,"'")
+/* LOCVAL(LOCALE_SGROUPING) */
+LOCVAL(LOCALE_IDIGITS,"2")
+LOCVAL(LOCALE_ILZERO,"1")
+/* LOCVAL(LOCALE_INEGNUMBER) */
+LOCVAL(LOCALE_SNATIVEDIGITS, "0123456789")
+LOCVAL(LOCALE_SCURRENCY,"S")
+LOCVAL(LOCALE_SINTLSYMBOL,"ATS")
+/* LOCVAL(LOCALE_SMONDECIMALSEP) */
+/* LOCVAL(LOCALE_SMONTHOUSANDSEP) */
+/* LOCVAL(LOCALE_SMONGROUPING) */
+
+LOCVAL(LOCALE_ICURRDIGITS,"2")
+/* LOCVAL(LOCALE_IINTLCURRDIGITS) */
+LOCVAL(LOCALE_ICURRENCY,"3")
+LOCVAL(LOCALE_INEGCURR,"8")
+LOCVAL(LOCALE_SDATE,".")
+LOCVAL(LOCALE_STIME,":")
+LOCVAL(LOCALE_SSHORTDATE,"dd.MM.yyyy")
+LOCVAL(LOCALE_SLONGDATE,"ddd, d. MMMM yyyy")
+/* LOCVAL(LOCALE_STIMEFORMAT) */
+LOCVAL(LOCALE_IDATE,"1")
+/* LOCVAL(LOCALE_ILDATE) */
+LOCVAL(LOCALE_ITIME,"1")
+/* LOCVAL(LOCALE_ITIMEMARKPOSN) */
+/* LOCVAL(LOCALE_ICENTURY) */
+LOCVAL(LOCALE_ITLZERO,"1")
+/* LOCVAL(LOCALE_IDAYLZERO) */
+/* LOCVAL(LOCALE_IMONLZERO) */
+LOCVAL(LOCALE_S1159,"")
+LOCVAL(LOCALE_S2359,"")
+/* LOCVAL(LOCALE_ICALENDARTYPE) */
+/* LOCVAL(LOCALE_IOPTIONALCALENDAR) */
+/* LOCVAL(LOCALE_IFIRSTDAYOFWEEK) */
+/* LOCVAL(LOCALE_IFIRSTWEEKOFYEAR) */
+
+LOCVAL(LOCALE_SDAYNAME1,"Montag")
+LOCVAL(LOCALE_SDAYNAME2,"Dienstag")
+LOCVAL(LOCALE_SDAYNAME3,"Mittwoch")
+LOCVAL(LOCALE_SDAYNAME4,"Donnerstag")
+LOCVAL(LOCALE_SDAYNAME5,"Freitag")
+LOCVAL(LOCALE_SDAYNAME6,"Samstag")
+LOCVAL(LOCALE_SDAYNAME7,"Sonntag")
+
+LOCVAL(LOCALE_SABBREVDAYNAME1,"Mo")
+LOCVAL(LOCALE_SABBREVDAYNAME2,"Di")
+LOCVAL(LOCALE_SABBREVDAYNAME3,"Mi")
+LOCVAL(LOCALE_SABBREVDAYNAME4,"Do")
+LOCVAL(LOCALE_SABBREVDAYNAME5,"Fr")
+LOCVAL(LOCALE_SABBREVDAYNAME6,"Sa")
+LOCVAL(LOCALE_SABBREVDAYNAME7,"So")
+
+LOCVAL(LOCALE_SMONTHNAME1,"Januar")
+LOCVAL(LOCALE_SMONTHNAME2,"Februar")
+LOCVAL(LOCALE_SMONTHNAME3,"März")
+LOCVAL(LOCALE_SMONTHNAME4,"April")
+LOCVAL(LOCALE_SMONTHNAME5,"Mai")
+LOCVAL(LOCALE_SMONTHNAME6,"Juni")
+LOCVAL(LOCALE_SMONTHNAME7,"Juli")
+LOCVAL(LOCALE_SMONTHNAME8,"August")
+LOCVAL(LOCALE_SMONTHNAME9,"September")
+LOCVAL(LOCALE_SMONTHNAME10,"Oktober")
+LOCVAL(LOCALE_SMONTHNAME11,"November")
+LOCVAL(LOCALE_SMONTHNAME12,"Dezember")
+LOCVAL(LOCALE_SMONTHNAME13,"")
+
+LOCVAL(LOCALE_SABBREVMONTHNAME1,"Jan")
+LOCVAL(LOCALE_SABBREVMONTHNAME2,"Feb")
+LOCVAL(LOCALE_SABBREVMONTHNAME3,"Mär")
+LOCVAL(LOCALE_SABBREVMONTHNAME4,"Apr")
+LOCVAL(LOCALE_SABBREVMONTHNAME5,"Mai")
+LOCVAL(LOCALE_SABBREVMONTHNAME6,"Jun")
+LOCVAL(LOCALE_SABBREVMONTHNAME7,"Jul")
+LOCVAL(LOCALE_SABBREVMONTHNAME8,"Aug")
+LOCVAL(LOCALE_SABBREVMONTHNAME9,"Sep")
+LOCVAL(LOCALE_SABBREVMONTHNAME10,"Okt")
+LOCVAL(LOCALE_SABBREVMONTHNAME11,"Nov")
+LOCVAL(LOCALE_SABBREVMONTHNAME12,"Dez")
+LOCVAL(LOCALE_SABBREVMONTHNAME13,"")
+
+/* LOCVAL(LOCALE_SPOSITIVESIGN) */
+/* LOCVAL(LOCALE_SNEGATIVESIGN) */
+/* LOCVAL(LOCALE_IPOSSIGNPOSN) */
+/* LOCVAL(LOCALE_INEGSIGNPOSN) */
+/* LOCVAL(LOCALE_IPOSSYMPRECEDES) */
+/* LOCVAL(LOCALE_IPOSSEPBYSPACE) */
+/* LOCVAL(LOCALE_INEGSYMPRECEDES) */
+/* LOCVAL(LOCALE_INEGSEPBYSPACE) */
diff --git a/ole/nls/des.nls b/ole/nls/des.nls
new file mode 100644
index 0000000..db5a2fd
--- /dev/null
+++ b/ole/nls/des.nls
@@ -0,0 +1,110 @@
+/*
+ *	OLE2NLS library
+ *      Switzerland
+ */
+ 
+LOCVAL(LOCALE_ILANGUAGE,"9")
+LOCVAL(LOCALE_SLANGUAGE,"Deutsch")
+LOCVAL(LOCALE_SENGLANGUAGE,"German")
+LOCVAL(LOCALE_SABBREVLANGNAME,"des")
+LOCVAL(LOCALE_SNATIVELANGNAME,"Schweiz")
+LOCVAL(LOCALE_ICOUNTRY,"41")
+LOCVAL(LOCALE_SCOUNTRY,"Schweiz (Deutsch)")
+LOCVAL(LOCALE_SENGCOUNTRY,"Switzerland")
+LOCVAL(LOCALE_SABBREVCTRYNAME,"Sg")
+LOCVAL(LOCALE_SNATIVECTRYNAME,"Schweiz")
+LOCVAL(LOCALE_IDEFAULTLANGUAGE,"9")
+LOCVAL(LOCALE_IDEFAULTCOUNTRY,"41")
+LOCVAL(LOCALE_IDEFAULTCODEPAGE,"851")
+/* LOCVAL(LOCALE_IDEFAULTANSICODEPAGE) */
+LOCVAL(LOCALE_SLIST,";")
+LOCVAL(LOCALE_IMEASURE,"0")
+LOCVAL(LOCALE_SDECIMAL,".")
+LOCVAL(LOCALE_STHOUSAND,"'")
+/* LOCVAL(LOCALE_SGROUPING) */
+LOCVAL(LOCALE_IDIGITS,"2")
+LOCVAL(LOCALE_ILZERO,"1")
+/* LOCVAL(LOCALE_INEGNUMBER) */
+LOCVAL(LOCALE_SNATIVEDIGITS, "0123456789")
+LOCVAL(LOCALE_SCURRENCY,"SFr")
+LOCVAL(LOCALE_SINTLSYMBOL,"CHF")
+/* LOCVAL(LOCALE_SMONDECIMALSEP) */
+/* LOCVAL(LOCALE_SMONTHOUSANDSEP) */
+/* LOCVAL(LOCALE_SMONGROUPING) */
+
+LOCVAL(LOCALE_ICURRDIGITS,"2")
+/* LOCVAL(LOCALE_IINTLCURRDIGITS) */
+LOCVAL(LOCALE_ICURRENCY,"3")
+LOCVAL(LOCALE_INEGCURR,"8")
+LOCVAL(LOCALE_SDATE,".")
+LOCVAL(LOCALE_STIME,":")
+LOCVAL(LOCALE_SSHORTDATE,"dd.MM.yyyy")
+LOCVAL(LOCALE_SLONGDATE,"ddd, d. MMMM yyyy")
+/* LOCVAL(LOCALE_STIMEFORMAT) */
+LOCVAL(LOCALE_IDATE,"1")
+/* LOCVAL(LOCALE_ILDATE) */
+LOCVAL(LOCALE_ITIME,"1")
+/* LOCVAL(LOCALE_ITIMEMARKPOSN) */
+/* LOCVAL(LOCALE_ICENTURY) */
+LOCVAL(LOCALE_ITLZERO,"1")
+/* LOCVAL(LOCALE_IDAYLZERO) */
+/* LOCVAL(LOCALE_IMONLZERO) */
+LOCVAL(LOCALE_S1159,"")
+LOCVAL(LOCALE_S2359,"")
+/* LOCVAL(LOCALE_ICALENDARTYPE) */
+/* LOCVAL(LOCALE_IOPTIONALCALENDAR) */
+/* LOCVAL(LOCALE_IFIRSTDAYOFWEEK) */
+/* LOCVAL(LOCALE_IFIRSTWEEKOFYEAR) */
+
+LOCVAL(LOCALE_SDAYNAME1,"Montag")
+LOCVAL(LOCALE_SDAYNAME2,"Dienstag")
+LOCVAL(LOCALE_SDAYNAME3,"Mittwoch")
+LOCVAL(LOCALE_SDAYNAME4,"Donnerstag")
+LOCVAL(LOCALE_SDAYNAME5,"Freitag")
+LOCVAL(LOCALE_SDAYNAME6,"Samstag")
+LOCVAL(LOCALE_SDAYNAME7,"Sonntag")
+
+LOCVAL(LOCALE_SABBREVDAYNAME1,"Mo")
+LOCVAL(LOCALE_SABBREVDAYNAME2,"Di")
+LOCVAL(LOCALE_SABBREVDAYNAME3,"Mi")
+LOCVAL(LOCALE_SABBREVDAYNAME4,"Do")
+LOCVAL(LOCALE_SABBREVDAYNAME5,"Fr")
+LOCVAL(LOCALE_SABBREVDAYNAME6,"Sa")
+LOCVAL(LOCALE_SABBREVDAYNAME7,"So")
+
+LOCVAL(LOCALE_SMONTHNAME1,"Januar")
+LOCVAL(LOCALE_SMONTHNAME2,"Februar")
+LOCVAL(LOCALE_SMONTHNAME3,"März")
+LOCVAL(LOCALE_SMONTHNAME4,"April")
+LOCVAL(LOCALE_SMONTHNAME5,"Mai")
+LOCVAL(LOCALE_SMONTHNAME6,"Juni")
+LOCVAL(LOCALE_SMONTHNAME7,"Juli")
+LOCVAL(LOCALE_SMONTHNAME8,"August")
+LOCVAL(LOCALE_SMONTHNAME9,"September")
+LOCVAL(LOCALE_SMONTHNAME10,"Oktober")
+LOCVAL(LOCALE_SMONTHNAME11,"November")
+LOCVAL(LOCALE_SMONTHNAME12,"Dezember")
+LOCVAL(LOCALE_SMONTHNAME13,"")
+
+LOCVAL(LOCALE_SABBREVMONTHNAME1,"Jan")
+LOCVAL(LOCALE_SABBREVMONTHNAME2,"Feb")
+LOCVAL(LOCALE_SABBREVMONTHNAME3,"Mär")
+LOCVAL(LOCALE_SABBREVMONTHNAME4,"Apr")
+LOCVAL(LOCALE_SABBREVMONTHNAME5,"Mai")
+LOCVAL(LOCALE_SABBREVMONTHNAME6,"Jun")
+LOCVAL(LOCALE_SABBREVMONTHNAME7,"Jul")
+LOCVAL(LOCALE_SABBREVMONTHNAME8,"Aug")
+LOCVAL(LOCALE_SABBREVMONTHNAME9,"Sep")
+LOCVAL(LOCALE_SABBREVMONTHNAME10,"Okt")
+LOCVAL(LOCALE_SABBREVMONTHNAME11,"Nov")
+LOCVAL(LOCALE_SABBREVMONTHNAME12,"Dez")
+LOCVAL(LOCALE_SABBREVMONTHNAME13,"")
+
+/* LOCVAL(LOCALE_SPOSITIVESIGN) */
+/* LOCVAL(LOCALE_SNEGATIVESIGN) */
+/* LOCVAL(LOCALE_IPOSSIGNPOSN) */
+/* LOCVAL(LOCALE_INEGSIGNPOSN) */
+/* LOCVAL(LOCALE_IPOSSYMPRECEDES) */
+/* LOCVAL(LOCALE_IPOSSEPBYSPACE) */
+/* LOCVAL(LOCALE_INEGSYMPRECEDES) */
+/* LOCVAL(LOCALE_INEGSEPBYSPACE) */
diff --git a/ole/nls/deu.nls b/ole/nls/deu.nls
new file mode 100644
index 0000000..1c681f9
--- /dev/null
+++ b/ole/nls/deu.nls
@@ -0,0 +1,109 @@
+/*
+ *	OLE2NLS library
+ *      Germany
+ */
+
+LOCVAL(LOCALE_ILANGUAGE,"9")
+LOCVAL(LOCALE_SLANGUAGE,"Deutsch")
+LOCVAL(LOCALE_SENGLANGUAGE,"German")
+LOCVAL(LOCALE_SABBREVLANGNAME,"deu")
+LOCVAL(LOCALE_SNATIVELANGNAME,"Deutsch")
+LOCVAL(LOCALE_ICOUNTRY,"49")
+LOCVAL(LOCALE_SCOUNTRY,"Deutschland")
+LOCVAL(LOCALE_SENGCOUNTRY,"Germany")
+LOCVAL(LOCALE_SABBREVCTRYNAME,"De")
+LOCVAL(LOCALE_SNATIVECTRYNAME,"Deutschland")
+LOCVAL(LOCALE_IDEFAULTLANGUAGE,"9")
+LOCVAL(LOCALE_IDEFAULTCOUNTRY,"49")
+LOCVAL(LOCALE_IDEFAULTCODEPAGE,"851")
+/* LOCVAL(LOCALE_IDEFAULTANSICODEPAGE) */
+LOCVAL(LOCALE_SLIST,";")
+LOCVAL(LOCALE_IMEASURE,"0")
+LOCVAL(LOCALE_SDECIMAL,",")
+LOCVAL(LOCALE_STHOUSAND,".")
+/* LOCVAL(LOCALE_SGROUPING) */
+LOCVAL(LOCALE_IDIGITS,"2")
+LOCVAL(LOCALE_ILZERO,"1")
+/* LOCVAL(LOCALE_INEGNUMBER) */
+LOCVAL(LOCALE_SNATIVEDIGITS, "0123456789")
+LOCVAL(LOCALE_SCURRENCY,"DM")
+LOCVAL(LOCALE_SINTLSYMBOL, "DEM")
+/* LOCVAL(LOCALE_SMONDECIMALSEP) */
+/* LOCVAL(LOCALE_SMONTHOUSANDSEP) */
+LOCVAL(LOCALE_SMONGROUPING, "3;0")
+LOCVAL(LOCALE_ICURRDIGITS,"2")
+/* LOCVAL(LOCALE_IINTLCURRDIGITS) */
+LOCVAL(LOCALE_ICURRENCY,"3")
+LOCVAL(LOCALE_INEGCURR,"8")
+LOCVAL(LOCALE_SDATE,".")
+LOCVAL(LOCALE_STIME,":")
+LOCVAL(LOCALE_SSHORTDATE,"dd.MM.yyyy")
+LOCVAL(LOCALE_SLONGDATE,"ddd, d. MMMM yyyy")
+/* LOCVAL(LOCALE_STIMEFORMAT) */
+LOCVAL(LOCALE_IDATE,"1")
+/* LOCVAL(LOCALE_ILDATE) */
+LOCVAL(LOCALE_ITIME,"1")
+/* LOCVAL(LOCALE_ITIMEMARKPOSN) */
+/* LOCVAL(LOCALE_ICENTURY) */
+LOCVAL(LOCALE_ITLZERO,"1")
+/* LOCVAL(LOCALE_IDAYLZERO) */
+/* LOCVAL(LOCALE_IMONLZERO) */
+LOCVAL(LOCALE_S1159,"")
+LOCVAL(LOCALE_S2359,"")
+/* LOCVAL(LOCALE_ICALENDARTYPE) */
+/* LOCVAL(LOCALE_IOPTIONALCALENDAR) */
+/* LOCVAL(LOCALE_IFIRSTDAYOFWEEK) */
+/* LOCVAL(LOCALE_IFIRSTWEEKOFYEAR) */
+
+LOCVAL(LOCALE_SDAYNAME1,"Montag")
+LOCVAL(LOCALE_SDAYNAME2,"Dienstag")
+LOCVAL(LOCALE_SDAYNAME3,"Mittwoch")
+LOCVAL(LOCALE_SDAYNAME4,"Donnerstag")
+LOCVAL(LOCALE_SDAYNAME5,"Freitag")
+LOCVAL(LOCALE_SDAYNAME6,"Sonnabend")
+LOCVAL(LOCALE_SDAYNAME7,"Sonntag")
+
+LOCVAL(LOCALE_SABBREVDAYNAME1,"Mo")
+LOCVAL(LOCALE_SABBREVDAYNAME2,"Di")
+LOCVAL(LOCALE_SABBREVDAYNAME3,"Mi")
+LOCVAL(LOCALE_SABBREVDAYNAME4,"Do")
+LOCVAL(LOCALE_SABBREVDAYNAME5,"Fr")
+LOCVAL(LOCALE_SABBREVDAYNAME6,"Sa")
+LOCVAL(LOCALE_SABBREVDAYNAME7,"So")
+
+LOCVAL(LOCALE_SMONTHNAME1,"Januar")
+LOCVAL(LOCALE_SMONTHNAME2,"Februar")
+LOCVAL(LOCALE_SMONTHNAME3,"März")
+LOCVAL(LOCALE_SMONTHNAME4,"April")
+LOCVAL(LOCALE_SMONTHNAME5,"Mai")
+LOCVAL(LOCALE_SMONTHNAME6,"Juni")
+LOCVAL(LOCALE_SMONTHNAME7,"Juli")
+LOCVAL(LOCALE_SMONTHNAME8,"August")
+LOCVAL(LOCALE_SMONTHNAME9,"September")
+LOCVAL(LOCALE_SMONTHNAME10,"Oktober")
+LOCVAL(LOCALE_SMONTHNAME11,"November")
+LOCVAL(LOCALE_SMONTHNAME12,"Dezember")
+LOCVAL(LOCALE_SMONTHNAME13,"")
+
+LOCVAL(LOCALE_SABBREVMONTHNAME1,"Jan")
+LOCVAL(LOCALE_SABBREVMONTHNAME2,"Feb")
+LOCVAL(LOCALE_SABBREVMONTHNAME3,"Mär")
+LOCVAL(LOCALE_SABBREVMONTHNAME4,"Apr")
+LOCVAL(LOCALE_SABBREVMONTHNAME5,"Mai")
+LOCVAL(LOCALE_SABBREVMONTHNAME6,"Jun")
+LOCVAL(LOCALE_SABBREVMONTHNAME7,"Jul")
+LOCVAL(LOCALE_SABBREVMONTHNAME8,"Aug")
+LOCVAL(LOCALE_SABBREVMONTHNAME9,"Sep")
+LOCVAL(LOCALE_SABBREVMONTHNAME10,"Okt")
+LOCVAL(LOCALE_SABBREVMONTHNAME11,"Nov")
+LOCVAL(LOCALE_SABBREVMONTHNAME12,"Dez")
+LOCVAL(LOCALE_SABBREVMONTHNAME13,"")
+
+/* LOCVAL(LOCALE_SPOSITIVESIGN) */
+/* LOCVAL(LOCALE_SNEGATIVESIGN) */
+/* LOCVAL(LOCALE_IPOSSIGNPOSN) */
+/* LOCVAL(LOCALE_INEGSIGNPOSN) */
+/* LOCVAL(LOCALE_IPOSSYMPRECEDES) */
+/* LOCVAL(LOCALE_IPOSSEPBYSPACE) */
+/* LOCVAL(LOCALE_INEGSYMPRECEDES) */
+/* LOCVAL(LOCALE_INEGSEPBYSPACE) */
diff --git a/ole/nls/dnk.nls b/ole/nls/dnk.nls
new file mode 100644
index 0000000..049ca1c
--- /dev/null
+++ b/ole/nls/dnk.nls
@@ -0,0 +1,109 @@
+/*
+ *	OLE2NLS library
+ *      Denmark
+ */
+
+LOCVAL(LOCALE_ILANGUAGE,"6")
+LOCVAL(LOCALE_SLANGUAGE,"Dansk")
+LOCVAL(LOCALE_SENGLANGUAGE,"Danish")
+LOCVAL(LOCALE_SABBREVLANGNAME,"dnk")
+LOCVAL(LOCALE_SNATIVELANGNAME,"Dansk")
+LOCVAL(LOCALE_ICOUNTRY,"45")
+LOCVAL(LOCALE_SCOUNTRY,"Danmark")
+LOCVAL(LOCALE_SENGCOUNTRY,"Denmark")
+LOCVAL(LOCALE_SABBREVCTRYNAME,"DK")
+LOCVAL(LOCALE_SNATIVECTRYNAME,"Danmark")
+LOCVAL(LOCALE_IDEFAULTLANGUAGE,"6")
+LOCVAL(LOCALE_IDEFAULTCOUNTRY,"45")
+/* LOCVAL(LOCALE_IDEFAULTCODEPAGE) */
+/* LOCVAL(LOCALE_IDEFAULTANSICODEPAGE) */
+LOCVAL(LOCALE_SLIST,";")
+LOCVAL(LOCALE_IMEASURE,"0")
+LOCVAL(LOCALE_SDECIMAL,",")
+LOCVAL(LOCALE_STHOUSAND,".")
+/* LOCVAL(LOCALE_SGROUPING) */
+LOCVAL(LOCALE_IDIGITS,"2")
+LOCVAL(LOCALE_ILZERO,"1")
+/* LOCVAL(LOCALE_INEGNUMBER) */
+/* LOCVAL(LOCALE_SNATIVEDIGITS) */
+LOCVAL(LOCALE_SCURRENCY,"kr")
+LOCVAL(LOCALE_SINTLSYMBOL,"DKK")
+LOCVAL(LOCALE_SMONDECIMALSEP,",")
+LOCVAL(LOCALE_SMONTHOUSANDSEP,".")
+LOCVAL(LOCALE_SMONGROUPING, "3;0")
+LOCVAL(LOCALE_ICURRDIGITS,"2")
+/* LOCVAL(LOCALE_IINTLCURRDIGITS) */
+LOCVAL(LOCALE_ICURRENCY,"3")
+LOCVAL(LOCALE_INEGCURR,"8")
+LOCVAL(LOCALE_SDATE,".")
+LOCVAL(LOCALE_STIME,":")
+LOCVAL(LOCALE_SSHORTDATE,"dd/MM-yyyy")
+LOCVAL(LOCALE_SLONGDATE,"ddd, d. MMMM yyyy")
+/* LOCVAL(LOCALE_STIMEFORMAT) */
+LOCVAL(LOCALE_IDATE,"1")
+/* LOCVAL(LOCALE_ILDATE) */
+LOCVAL(LOCALE_ITIME,"1")
+/* LOCVAL(LOCALE_ITIMEMARKPOSN) */
+/* LOCVAL(LOCALE_ICENTURY) */
+LOCVAL(LOCALE_ITLZERO,"1")
+/* LOCVAL(LOCALE_IDAYLZERO) */
+/* LOCVAL(LOCALE_IMONLZERO) */
+LOCVAL(LOCALE_S1159, "")
+LOCVAL(LOCALE_S2359, "")
+/* LOCVAL(LOCALE_ICALENDARTYPE) */
+/* LOCVAL(LOCALE_IOPTIONALCALENDAR) */
+/* LOCVAL(LOCALE_IFIRSTDAYOFWEEK) */
+/* LOCVAL(LOCALE_IFIRSTWEEKOFYEAR) */
+
+LOCVAL(LOCALE_SDAYNAME1,"Mandag")
+LOCVAL(LOCALE_SDAYNAME2,"Tirsdag")
+LOCVAL(LOCALE_SDAYNAME3,"Onsdag")
+LOCVAL(LOCALE_SDAYNAME4,"Torsdag")
+LOCVAL(LOCALE_SDAYNAME5,"Fredag")
+LOCVAL(LOCALE_SDAYNAME6,"Lørdag")
+LOCVAL(LOCALE_SDAYNAME7,"Søndag")
+
+LOCVAL(LOCALE_SABBREVDAYNAME1,"Ma")
+LOCVAL(LOCALE_SABBREVDAYNAME2,"Ti")
+LOCVAL(LOCALE_SABBREVDAYNAME3,"On")
+LOCVAL(LOCALE_SABBREVDAYNAME4,"To")
+LOCVAL(LOCALE_SABBREVDAYNAME5,"Fr")
+LOCVAL(LOCALE_SABBREVDAYNAME6,"Lø")
+LOCVAL(LOCALE_SABBREVDAYNAME7,"Sø")
+
+LOCVAL(LOCALE_SMONTHNAME1,"januar")
+LOCVAL(LOCALE_SMONTHNAME2,"februar")
+LOCVAL(LOCALE_SMONTHNAME3,"marts")
+LOCVAL(LOCALE_SMONTHNAME4,"april")
+LOCVAL(LOCALE_SMONTHNAME5,"maj")
+LOCVAL(LOCALE_SMONTHNAME6,"juni")
+LOCVAL(LOCALE_SMONTHNAME7,"juli")
+LOCVAL(LOCALE_SMONTHNAME8,"august")
+LOCVAL(LOCALE_SMONTHNAME9,"september")
+LOCVAL(LOCALE_SMONTHNAME10,"oktober")
+LOCVAL(LOCALE_SMONTHNAME11,"november")
+LOCVAL(LOCALE_SMONTHNAME12,"december")
+LOCVAL(LOCALE_SMONTHNAME13,"")
+
+LOCVAL(LOCALE_SABBREVMONTHNAME1,"jan")
+LOCVAL(LOCALE_SABBREVMONTHNAME2,"feb")
+LOCVAL(LOCALE_SABBREVMONTHNAME3,"mar")
+LOCVAL(LOCALE_SABBREVMONTHNAME4,"apr")
+LOCVAL(LOCALE_SABBREVMONTHNAME5,"maj")
+LOCVAL(LOCALE_SABBREVMONTHNAME6,"jun")
+LOCVAL(LOCALE_SABBREVMONTHNAME7,"jul")
+LOCVAL(LOCALE_SABBREVMONTHNAME8,"aug")
+LOCVAL(LOCALE_SABBREVMONTHNAME9,"sep")
+LOCVAL(LOCALE_SABBREVMONTHNAME10,"okt")
+LOCVAL(LOCALE_SABBREVMONTHNAME11,"nov")
+LOCVAL(LOCALE_SABBREVMONTHNAME12,"dec")
+LOCVAL(LOCALE_SABBREVMONTHNAME13,"")
+
+LOCVAL(LOCALE_SPOSITIVESIGN, "")
+LOCVAL(LOCALE_SNEGATIVESIGN, "-")
+LOCVAL(LOCALE_IPOSSIGNPOSN, "3")
+LOCVAL(LOCALE_INEGSIGNPOSN, "3")
+LOCVAL(LOCALE_IPOSSYMPRECEDES, "1")
+LOCVAL(LOCALE_IPOSSEPBYSPACE, "0")
+LOCVAL(LOCALE_INEGSYMPRECEDES, "1")
+LOCVAL(LOCALE_INEGSEPBYSPACE, "0")
diff --git a/ole/nls/ena.nls b/ole/nls/ena.nls
new file mode 100644
index 0000000..76bba0e
--- /dev/null
+++ b/ole/nls/ena.nls
@@ -0,0 +1,109 @@
+/*
+ *	OLE2NLS library
+ *      Australia
+ */
+
+LOCVAL(LOCALE_ILANGUAGE, "0809")
+LOCVAL(LOCALE_SLANGUAGE, "English (Australia)")
+LOCVAL(LOCALE_SENGLANGUAGE, "English")
+LOCVAL(LOCALE_SABBREVLANGNAME, "ena")
+LOCVAL(LOCALE_SNATIVELANGNAME, "English")
+LOCVAL(LOCALE_ICOUNTRY, "44")
+LOCVAL(LOCALE_SCOUNTRY, "Australia")
+LOCVAL(LOCALE_SENGCOUNTRY, "Australia")
+LOCVAL(LOCALE_SABBREVCTRYNAME, "AUS")
+LOCVAL(LOCALE_SNATIVECTRYNAME, "Australia")
+LOCVAL(LOCALE_IDEFAULTLANGUAGE, "0809")
+LOCVAL(LOCALE_IDEFAULTCOUNTRY, "44")
+LOCVAL(LOCALE_IDEFAULTCODEPAGE, "850")
+LOCVAL(LOCALE_IDEFAULTANSICODEPAGE, "1252")
+LOCVAL(LOCALE_SLIST, ",")
+LOCVAL(LOCALE_IMEASURE, "0")
+LOCVAL(LOCALE_SDECIMAL, ".")
+LOCVAL(LOCALE_STHOUSAND, ",")
+LOCVAL(LOCALE_SGROUPING, "3;0")
+LOCVAL(LOCALE_IDIGITS, "2")
+LOCVAL(LOCALE_ILZERO, "1")
+LOCVAL(LOCALE_INEGNUMBER, "1")
+LOCVAL(LOCALE_SNATIVEDIGITS, "0123456789")
+LOCVAL(LOCALE_SCURRENCY, "$")
+LOCVAL(LOCALE_SINTLSYMBOL, "AUD")
+LOCVAL(LOCALE_SMONDECIMALSEP, ".")
+LOCVAL(LOCALE_SMONTHOUSANDSEP, ",")
+LOCVAL(LOCALE_SMONGROUPING, "3;0")
+LOCVAL(LOCALE_ICURRDIGITS, "2")
+LOCVAL(LOCALE_IINTLCURRDIGITS, "2")
+LOCVAL(LOCALE_ICURRENCY, "0")
+LOCVAL(LOCALE_INEGCURR, "1")
+LOCVAL(LOCALE_SDATE, "/")
+LOCVAL(LOCALE_STIME, ":")
+LOCVAL(LOCALE_SSHORTDATE, "dd/MM/yy")
+LOCVAL(LOCALE_SLONGDATE, "dd MMMM yyyy")
+LOCVAL(LOCALE_STIMEFORMAT, "HH:mm:ss")
+LOCVAL(LOCALE_IDATE, "1")
+LOCVAL(LOCALE_ILDATE, "1")
+LOCVAL(LOCALE_ITIME, "1")
+LOCVAL(LOCALE_ITIMEMARKPOSN, "0")
+LOCVAL(LOCALE_ICENTURY, "0")
+LOCVAL(LOCALE_ITLZERO, "1")
+LOCVAL(LOCALE_IDAYLZERO, "1")
+LOCVAL(LOCALE_IMONLZERO, "1")
+LOCVAL(LOCALE_S1159, "AM")
+LOCVAL(LOCALE_S2359, "PM")
+LOCVAL(LOCALE_ICALENDARTYPE, "1")
+LOCVAL(LOCALE_IOPTIONALCALENDAR, "0")
+LOCVAL(LOCALE_IFIRSTDAYOFWEEK, "0")
+LOCVAL(LOCALE_IFIRSTWEEKOFYEAR, "0")
+
+LOCVAL(LOCALE_SDAYNAME1, "Monday")
+LOCVAL(LOCALE_SDAYNAME2, "Tuesday")
+LOCVAL(LOCALE_SDAYNAME3, "Wednesday")
+LOCVAL(LOCALE_SDAYNAME4, "Thursday")
+LOCVAL(LOCALE_SDAYNAME5, "Friday")
+LOCVAL(LOCALE_SDAYNAME6, "Saturday")
+LOCVAL(LOCALE_SDAYNAME7, "Sunday")
+
+LOCVAL(LOCALE_SABBREVDAYNAME1, "Mon")
+LOCVAL(LOCALE_SABBREVDAYNAME2, "Tue")
+LOCVAL(LOCALE_SABBREVDAYNAME3, "Wed")
+LOCVAL(LOCALE_SABBREVDAYNAME4, "Thu")
+LOCVAL(LOCALE_SABBREVDAYNAME5, "Fri")
+LOCVAL(LOCALE_SABBREVDAYNAME6, "Sat")
+LOCVAL(LOCALE_SABBREVDAYNAME7, "Sun")
+
+LOCVAL(LOCALE_SMONTHNAME1, "January")
+LOCVAL(LOCALE_SMONTHNAME2, "February")
+LOCVAL(LOCALE_SMONTHNAME3, "March")
+LOCVAL(LOCALE_SMONTHNAME4, "April")
+LOCVAL(LOCALE_SMONTHNAME5, "May")
+LOCVAL(LOCALE_SMONTHNAME6, "June")
+LOCVAL(LOCALE_SMONTHNAME7, "July")
+LOCVAL(LOCALE_SMONTHNAME8, "August")
+LOCVAL(LOCALE_SMONTHNAME9, "September")
+LOCVAL(LOCALE_SMONTHNAME10, "October")
+LOCVAL(LOCALE_SMONTHNAME11, "November")
+LOCVAL(LOCALE_SMONTHNAME12, "December")
+LOCVAL(LOCALE_SMONTHNAME13, "")
+
+LOCVAL(LOCALE_SABBREVMONTHNAME1, "Jan")
+LOCVAL(LOCALE_SABBREVMONTHNAME2, "Feb")
+LOCVAL(LOCALE_SABBREVMONTHNAME3, "Mar")
+LOCVAL(LOCALE_SABBREVMONTHNAME4, "Apr")
+LOCVAL(LOCALE_SABBREVMONTHNAME5, "May")
+LOCVAL(LOCALE_SABBREVMONTHNAME6, "Jun")
+LOCVAL(LOCALE_SABBREVMONTHNAME7, "Jul")
+LOCVAL(LOCALE_SABBREVMONTHNAME8, "Aug")
+LOCVAL(LOCALE_SABBREVMONTHNAME9, "Sep")
+LOCVAL(LOCALE_SABBREVMONTHNAME10, "Oct")
+LOCVAL(LOCALE_SABBREVMONTHNAME11, "Nov")
+LOCVAL(LOCALE_SABBREVMONTHNAME12, "Dec")
+LOCVAL(LOCALE_SABBREVMONTHNAME13, "")
+
+LOCVAL(LOCALE_SPOSITIVESIGN, "")
+LOCVAL(LOCALE_SNEGATIVESIGN, "-")
+LOCVAL(LOCALE_IPOSSIGNPOSN, "3")
+LOCVAL(LOCALE_INEGSIGNPOSN, "3")
+LOCVAL(LOCALE_IPOSSYMPRECEDES, "1")
+LOCVAL(LOCALE_IPOSSEPBYSPACE, "0")
+LOCVAL(LOCALE_INEGSYMPRECEDES, "1")
+LOCVAL(LOCALE_INEGSEPBYSPACE, "0")
diff --git a/ole/nls/enc.nls b/ole/nls/enc.nls
new file mode 100644
index 0000000..31edec4
--- /dev/null
+++ b/ole/nls/enc.nls
@@ -0,0 +1,109 @@
+/*
+ *	OLE2NLS library
+ *      Canada
+ */
+
+LOCVAL(LOCALE_ILANGUAGE, "0409")
+LOCVAL(LOCALE_SLANGUAGE, "English (Canada)")
+LOCVAL(LOCALE_SENGLANGUAGE, "English")
+LOCVAL(LOCALE_SABBREVLANGNAME, "enc")
+LOCVAL(LOCALE_SNATIVELANGNAME, "English")
+LOCVAL(LOCALE_ICOUNTRY, "1")
+LOCVAL(LOCALE_SCOUNTRY, "Canada")
+LOCVAL(LOCALE_SENGCOUNTRY, "Canada")
+LOCVAL(LOCALE_SABBREVCTRYNAME, "CAN")
+LOCVAL(LOCALE_SNATIVECTRYNAME, "Canada")
+LOCVAL(LOCALE_IDEFAULTLANGUAGE, "0409")
+LOCVAL(LOCALE_IDEFAULTCOUNTRY, "1")
+LOCVAL(LOCALE_IDEFAULTCODEPAGE, "437")
+LOCVAL(LOCALE_IDEFAULTANSICODEPAGE, "1252")
+LOCVAL(LOCALE_SLIST, ",")
+LOCVAL(LOCALE_IMEASURE, "1")
+LOCVAL(LOCALE_SDECIMAL, ".")
+LOCVAL(LOCALE_STHOUSAND, ",")
+LOCVAL(LOCALE_SGROUPING, "3;0")
+LOCVAL(LOCALE_IDIGITS, "2")
+LOCVAL(LOCALE_ILZERO, "1")
+LOCVAL(LOCALE_INEGNUMBER, "1")
+LOCVAL(LOCALE_SNATIVEDIGITS, "0123456789")
+LOCVAL(LOCALE_SCURRENCY, "$")
+LOCVAL(LOCALE_SINTLSYMBOL, "CAD")
+LOCVAL(LOCALE_SMONDECIMALSEP, ".")
+LOCVAL(LOCALE_SMONTHOUSANDSEP, ",")
+LOCVAL(LOCALE_SMONGROUPING, "3;0")
+LOCVAL(LOCALE_ICURRDIGITS, "2")
+LOCVAL(LOCALE_IINTLCURRDIGITS, "2")
+LOCVAL(LOCALE_ICURRENCY, "0")
+LOCVAL(LOCALE_INEGCURR, "0")
+LOCVAL(LOCALE_SDATE, "/")
+LOCVAL(LOCALE_STIME, ":")
+LOCVAL(LOCALE_SSHORTDATE, "M/d/yy")
+LOCVAL(LOCALE_SLONGDATE, "dddd, MMMM dd, yyyy")
+LOCVAL(LOCALE_STIMEFORMAT, "h:mm:ss tt")
+LOCVAL(LOCALE_IDATE, "0")
+LOCVAL(LOCALE_ILDATE, "0")
+LOCVAL(LOCALE_ITIME, "0")
+LOCVAL(LOCALE_ITIMEMARKPOSN, "0")
+LOCVAL(LOCALE_ICENTURY, "0")
+LOCVAL(LOCALE_ITLZERO, "0")
+LOCVAL(LOCALE_IDAYLZERO, "0")
+LOCVAL(LOCALE_IMONLZERO, "0")
+LOCVAL(LOCALE_S1159, "AM")
+LOCVAL(LOCALE_S2359, "PM")
+LOCVAL(LOCALE_ICALENDARTYPE, "1")
+LOCVAL(LOCALE_IOPTIONALCALENDAR, "0")
+LOCVAL(LOCALE_IFIRSTDAYOFWEEK, "6")
+LOCVAL(LOCALE_IFIRSTWEEKOFYEAR, "0")
+
+LOCVAL(LOCALE_SDAYNAME1, "Monday")
+LOCVAL(LOCALE_SDAYNAME2, "Tuesday")
+LOCVAL(LOCALE_SDAYNAME3, "Wednesday")
+LOCVAL(LOCALE_SDAYNAME4, "Thursday")
+LOCVAL(LOCALE_SDAYNAME5, "Friday")
+LOCVAL(LOCALE_SDAYNAME6, "Saturday")
+LOCVAL(LOCALE_SDAYNAME7, "Sunday")
+
+LOCVAL(LOCALE_SABBREVDAYNAME1, "Mon")
+LOCVAL(LOCALE_SABBREVDAYNAME2, "Tue")
+LOCVAL(LOCALE_SABBREVDAYNAME3, "Wed")
+LOCVAL(LOCALE_SABBREVDAYNAME4, "Thu")
+LOCVAL(LOCALE_SABBREVDAYNAME5, "Fri")
+LOCVAL(LOCALE_SABBREVDAYNAME6, "Sat")
+LOCVAL(LOCALE_SABBREVDAYNAME7, "Sun")
+
+LOCVAL(LOCALE_SMONTHNAME1, "January")
+LOCVAL(LOCALE_SMONTHNAME2, "February")
+LOCVAL(LOCALE_SMONTHNAME3, "March")
+LOCVAL(LOCALE_SMONTHNAME4, "April")
+LOCVAL(LOCALE_SMONTHNAME5, "May")
+LOCVAL(LOCALE_SMONTHNAME6, "June")
+LOCVAL(LOCALE_SMONTHNAME7, "July")
+LOCVAL(LOCALE_SMONTHNAME8, "August")
+LOCVAL(LOCALE_SMONTHNAME9, "September")
+LOCVAL(LOCALE_SMONTHNAME10, "October")
+LOCVAL(LOCALE_SMONTHNAME11, "November")
+LOCVAL(LOCALE_SMONTHNAME12, "December")
+LOCVAL(LOCALE_SMONTHNAME13, "")
+
+LOCVAL(LOCALE_SABBREVMONTHNAME1, "Jan")
+LOCVAL(LOCALE_SABBREVMONTHNAME2, "Feb")
+LOCVAL(LOCALE_SABBREVMONTHNAME3, "Mar")
+LOCVAL(LOCALE_SABBREVMONTHNAME4, "Apr")
+LOCVAL(LOCALE_SABBREVMONTHNAME5, "May")
+LOCVAL(LOCALE_SABBREVMONTHNAME6, "Jun")
+LOCVAL(LOCALE_SABBREVMONTHNAME7, "Jul")
+LOCVAL(LOCALE_SABBREVMONTHNAME8, "Aug")
+LOCVAL(LOCALE_SABBREVMONTHNAME9, "Sep")
+LOCVAL(LOCALE_SABBREVMONTHNAME10, "Oct")
+LOCVAL(LOCALE_SABBREVMONTHNAME11, "Nov")
+LOCVAL(LOCALE_SABBREVMONTHNAME12, "Dec")
+LOCVAL(LOCALE_SABBREVMONTHNAME13, "")
+
+LOCVAL(LOCALE_SPOSITIVESIGN, "")
+LOCVAL(LOCALE_SNEGATIVESIGN, "-")
+LOCVAL(LOCALE_IPOSSIGNPOSN, "3")
+LOCVAL(LOCALE_INEGSIGNPOSN, "0")
+LOCVAL(LOCALE_IPOSSYMPRECEDES, "1")
+LOCVAL(LOCALE_IPOSSEPBYSPACE, "0")
+LOCVAL(LOCALE_INEGSYMPRECEDES, "1")
+LOCVAL(LOCALE_INEGSEPBYSPACE, "0")
diff --git a/ole/nls/eng.nls b/ole/nls/eng.nls
new file mode 100644
index 0000000..25dbd24
--- /dev/null
+++ b/ole/nls/eng.nls
@@ -0,0 +1,109 @@
+/*
+ *	OLE2NLS library
+ *      United Kingdom
+ */
+
+LOCVAL(LOCALE_ILANGUAGE, "0809")
+LOCVAL(LOCALE_SLANGUAGE, "English (United Kingdom)")
+LOCVAL(LOCALE_SENGLANGUAGE, "English")
+LOCVAL(LOCALE_SABBREVLANGNAME, "eng")
+LOCVAL(LOCALE_SNATIVELANGNAME, "English")
+LOCVAL(LOCALE_ICOUNTRY, "44")
+LOCVAL(LOCALE_SCOUNTRY, "United Kingdom")
+LOCVAL(LOCALE_SENGCOUNTRY, "United Kingdom")
+LOCVAL(LOCALE_SABBREVCTRYNAME, "GBR")
+LOCVAL(LOCALE_SNATIVECTRYNAME, "United Kingdom")
+LOCVAL(LOCALE_IDEFAULTLANGUAGE, "0809")
+LOCVAL(LOCALE_IDEFAULTCOUNTRY, "44")
+LOCVAL(LOCALE_IDEFAULTCODEPAGE, "850")
+LOCVAL(LOCALE_IDEFAULTANSICODEPAGE, "1252")
+LOCVAL(LOCALE_SLIST, ",")
+LOCVAL(LOCALE_IMEASURE, "0")
+LOCVAL(LOCALE_SDECIMAL, ".")
+LOCVAL(LOCALE_STHOUSAND, ",")
+LOCVAL(LOCALE_SGROUPING, "3;0")
+LOCVAL(LOCALE_IDIGITS, "2")
+LOCVAL(LOCALE_ILZERO, "1")
+LOCVAL(LOCALE_INEGNUMBER, "1")
+LOCVAL(LOCALE_SNATIVEDIGITS, "0123456789")
+LOCVAL(LOCALE_SCURRENCY, "£")
+LOCVAL(LOCALE_SINTLSYMBOL, "GBP")
+LOCVAL(LOCALE_SMONDECIMALSEP, ".")
+LOCVAL(LOCALE_SMONTHOUSANDSEP, ",")
+LOCVAL(LOCALE_SMONGROUPING, "3;0")
+LOCVAL(LOCALE_ICURRDIGITS, "2")
+LOCVAL(LOCALE_IINTLCURRDIGITS, "2")
+LOCVAL(LOCALE_ICURRENCY, "0")
+LOCVAL(LOCALE_INEGCURR, "1")
+LOCVAL(LOCALE_SDATE, "/")
+LOCVAL(LOCALE_STIME, ":")
+LOCVAL(LOCALE_SSHORTDATE, "dd/MM/yy")
+LOCVAL(LOCALE_SLONGDATE, "dd MMMM yyyy")
+LOCVAL(LOCALE_STIMEFORMAT, "HH:mm:ss")
+LOCVAL(LOCALE_IDATE, "1")
+LOCVAL(LOCALE_ILDATE, "1")
+LOCVAL(LOCALE_ITIME, "1")
+LOCVAL(LOCALE_ITIMEMARKPOSN, "0")
+LOCVAL(LOCALE_ICENTURY, "0")
+LOCVAL(LOCALE_ITLZERO, "1")
+LOCVAL(LOCALE_IDAYLZERO, "1")
+LOCVAL(LOCALE_IMONLZERO, "1")
+LOCVAL(LOCALE_S1159, "AM")
+LOCVAL(LOCALE_S2359, "PM")
+LOCVAL(LOCALE_ICALENDARTYPE, "1")
+LOCVAL(LOCALE_IOPTIONALCALENDAR, "0")
+LOCVAL(LOCALE_IFIRSTDAYOFWEEK, "0")
+LOCVAL(LOCALE_IFIRSTWEEKOFYEAR, "0")
+
+LOCVAL(LOCALE_SDAYNAME1, "Monday")
+LOCVAL(LOCALE_SDAYNAME2, "Tuesday")
+LOCVAL(LOCALE_SDAYNAME3, "Wednesday")
+LOCVAL(LOCALE_SDAYNAME4, "Thursday")
+LOCVAL(LOCALE_SDAYNAME5, "Friday")
+LOCVAL(LOCALE_SDAYNAME6, "Saturday")
+LOCVAL(LOCALE_SDAYNAME7, "Sunday")
+
+LOCVAL(LOCALE_SABBREVDAYNAME1, "Mon")
+LOCVAL(LOCALE_SABBREVDAYNAME2, "Tue")
+LOCVAL(LOCALE_SABBREVDAYNAME3, "Wed")
+LOCVAL(LOCALE_SABBREVDAYNAME4, "Thu")
+LOCVAL(LOCALE_SABBREVDAYNAME5, "Fri")
+LOCVAL(LOCALE_SABBREVDAYNAME6, "Sat")
+LOCVAL(LOCALE_SABBREVDAYNAME7, "Sun")
+
+LOCVAL(LOCALE_SMONTHNAME1, "January")
+LOCVAL(LOCALE_SMONTHNAME2, "February")
+LOCVAL(LOCALE_SMONTHNAME3, "March")
+LOCVAL(LOCALE_SMONTHNAME4, "April")
+LOCVAL(LOCALE_SMONTHNAME5, "May")
+LOCVAL(LOCALE_SMONTHNAME6, "June")
+LOCVAL(LOCALE_SMONTHNAME7, "July")
+LOCVAL(LOCALE_SMONTHNAME8, "August")
+LOCVAL(LOCALE_SMONTHNAME9, "September")
+LOCVAL(LOCALE_SMONTHNAME10, "October")
+LOCVAL(LOCALE_SMONTHNAME11, "November")
+LOCVAL(LOCALE_SMONTHNAME12, "December")
+LOCVAL(LOCALE_SMONTHNAME13, "")
+
+LOCVAL(LOCALE_SABBREVMONTHNAME1, "Jan")
+LOCVAL(LOCALE_SABBREVMONTHNAME2, "Feb")
+LOCVAL(LOCALE_SABBREVMONTHNAME3, "Mar")
+LOCVAL(LOCALE_SABBREVMONTHNAME4, "Apr")
+LOCVAL(LOCALE_SABBREVMONTHNAME5, "May")
+LOCVAL(LOCALE_SABBREVMONTHNAME6, "Jun")
+LOCVAL(LOCALE_SABBREVMONTHNAME7, "Jul")
+LOCVAL(LOCALE_SABBREVMONTHNAME8, "Aug")
+LOCVAL(LOCALE_SABBREVMONTHNAME9, "Sep")
+LOCVAL(LOCALE_SABBREVMONTHNAME10, "Oct")
+LOCVAL(LOCALE_SABBREVMONTHNAME11, "Nov")
+LOCVAL(LOCALE_SABBREVMONTHNAME12, "Dec")
+LOCVAL(LOCALE_SABBREVMONTHNAME13, "")
+
+LOCVAL(LOCALE_SPOSITIVESIGN, "")
+LOCVAL(LOCALE_SNEGATIVESIGN, "-")
+LOCVAL(LOCALE_IPOSSIGNPOSN, "3")
+LOCVAL(LOCALE_INEGSIGNPOSN, "3")
+LOCVAL(LOCALE_IPOSSYMPRECEDES, "1")
+LOCVAL(LOCALE_IPOSSEPBYSPACE, "0")
+LOCVAL(LOCALE_INEGSYMPRECEDES, "1")
+LOCVAL(LOCALE_INEGSEPBYSPACE, "0")
diff --git a/ole/nls/enl.nls b/ole/nls/enl.nls
new file mode 100644
index 0000000..802814a
--- /dev/null
+++ b/ole/nls/enl.nls
@@ -0,0 +1,109 @@
+/*
+ *	OLE2NLS library
+ *      English Belize
+ */
+
+LOCVAL(LOCALE_ILANGUAGE, "0409")
+LOCVAL(LOCALE_SLANGUAGE, "English (United States)")
+LOCVAL(LOCALE_SENGLANGUAGE, "English")
+LOCVAL(LOCALE_SABBREVLANGNAME, "enl")
+LOCVAL(LOCALE_SNATIVELANGNAME, "English")
+LOCVAL(LOCALE_ICOUNTRY, "1")
+LOCVAL(LOCALE_SCOUNTRY, "United States")
+LOCVAL(LOCALE_SENGCOUNTRY, "United States")
+LOCVAL(LOCALE_SABBREVCTRYNAME, "USA")
+LOCVAL(LOCALE_SNATIVECTRYNAME, "United States")
+LOCVAL(LOCALE_IDEFAULTLANGUAGE, "0409")
+LOCVAL(LOCALE_IDEFAULTCOUNTRY, "1")
+LOCVAL(LOCALE_IDEFAULTCODEPAGE, "437")
+LOCVAL(LOCALE_IDEFAULTANSICODEPAGE, "1252")
+LOCVAL(LOCALE_SLIST, ",")
+LOCVAL(LOCALE_IMEASURE, "1")
+LOCVAL(LOCALE_SDECIMAL, ".")
+LOCVAL(LOCALE_STHOUSAND, ",")
+LOCVAL(LOCALE_SGROUPING, "3;0")
+LOCVAL(LOCALE_IDIGITS, "2")
+LOCVAL(LOCALE_ILZERO, "1")
+LOCVAL(LOCALE_INEGNUMBER, "1")
+LOCVAL(LOCALE_SNATIVEDIGITS, "0123456789")
+LOCVAL(LOCALE_SCURRENCY, "$")
+LOCVAL(LOCALE_SINTLSYMBOL, "USD")
+LOCVAL(LOCALE_SMONDECIMALSEP, ".")
+LOCVAL(LOCALE_SMONTHOUSANDSEP, ",")
+LOCVAL(LOCALE_SMONGROUPING, "3;0")
+LOCVAL(LOCALE_ICURRDIGITS, "2")
+LOCVAL(LOCALE_IINTLCURRDIGITS, "2")
+LOCVAL(LOCALE_ICURRENCY, "0")
+LOCVAL(LOCALE_INEGCURR, "0")
+LOCVAL(LOCALE_SDATE, "/")
+LOCVAL(LOCALE_STIME, ":")
+LOCVAL(LOCALE_SSHORTDATE, "M/d/yy")
+LOCVAL(LOCALE_SLONGDATE, "dddd, MMMM dd, yyyy")
+LOCVAL(LOCALE_STIMEFORMAT, "h:mm:ss tt")
+LOCVAL(LOCALE_IDATE, "0")
+LOCVAL(LOCALE_ILDATE, "0")
+LOCVAL(LOCALE_ITIME, "0")
+LOCVAL(LOCALE_ITIMEMARKPOSN, "0")
+LOCVAL(LOCALE_ICENTURY, "0")
+LOCVAL(LOCALE_ITLZERO, "0")
+LOCVAL(LOCALE_IDAYLZERO, "0")
+LOCVAL(LOCALE_IMONLZERO, "0")
+LOCVAL(LOCALE_S1159, "AM")
+LOCVAL(LOCALE_S2359, "PM")
+LOCVAL(LOCALE_ICALENDARTYPE, "1")
+LOCVAL(LOCALE_IOPTIONALCALENDAR, "0")
+LOCVAL(LOCALE_IFIRSTDAYOFWEEK, "6")
+LOCVAL(LOCALE_IFIRSTWEEKOFYEAR, "0")
+
+LOCVAL(LOCALE_SDAYNAME1, "Monday")
+LOCVAL(LOCALE_SDAYNAME2, "Tuesday")
+LOCVAL(LOCALE_SDAYNAME3, "Wednesday")
+LOCVAL(LOCALE_SDAYNAME4, "Thursday")
+LOCVAL(LOCALE_SDAYNAME5, "Friday")
+LOCVAL(LOCALE_SDAYNAME6, "Saturday")
+LOCVAL(LOCALE_SDAYNAME7, "Sunday")
+
+LOCVAL(LOCALE_SABBREVDAYNAME1, "Mon")
+LOCVAL(LOCALE_SABBREVDAYNAME2, "Tue")
+LOCVAL(LOCALE_SABBREVDAYNAME3, "Wed")
+LOCVAL(LOCALE_SABBREVDAYNAME4, "Thu")
+LOCVAL(LOCALE_SABBREVDAYNAME5, "Fri")
+LOCVAL(LOCALE_SABBREVDAYNAME6, "Sat")
+LOCVAL(LOCALE_SABBREVDAYNAME7, "Sun")
+
+LOCVAL(LOCALE_SMONTHNAME1, "January")
+LOCVAL(LOCALE_SMONTHNAME2, "February")
+LOCVAL(LOCALE_SMONTHNAME3, "March")
+LOCVAL(LOCALE_SMONTHNAME4, "April")
+LOCVAL(LOCALE_SMONTHNAME5, "May")
+LOCVAL(LOCALE_SMONTHNAME6, "June")
+LOCVAL(LOCALE_SMONTHNAME7, "July")
+LOCVAL(LOCALE_SMONTHNAME8, "August")
+LOCVAL(LOCALE_SMONTHNAME9, "September")
+LOCVAL(LOCALE_SMONTHNAME10, "October")
+LOCVAL(LOCALE_SMONTHNAME11, "November")
+LOCVAL(LOCALE_SMONTHNAME12, "December")
+LOCVAL(LOCALE_SMONTHNAME13, "")
+
+LOCVAL(LOCALE_SABBREVMONTHNAME1, "Jan")
+LOCVAL(LOCALE_SABBREVMONTHNAME2, "Feb")
+LOCVAL(LOCALE_SABBREVMONTHNAME3, "Mar")
+LOCVAL(LOCALE_SABBREVMONTHNAME4, "Apr")
+LOCVAL(LOCALE_SABBREVMONTHNAME5, "May")
+LOCVAL(LOCALE_SABBREVMONTHNAME6, "Jun")
+LOCVAL(LOCALE_SABBREVMONTHNAME7, "Jul")
+LOCVAL(LOCALE_SABBREVMONTHNAME8, "Aug")
+LOCVAL(LOCALE_SABBREVMONTHNAME9, "Sep")
+LOCVAL(LOCALE_SABBREVMONTHNAME10, "Oct")
+LOCVAL(LOCALE_SABBREVMONTHNAME11, "Nov")
+LOCVAL(LOCALE_SABBREVMONTHNAME12, "Dec")
+LOCVAL(LOCALE_SABBREVMONTHNAME13, "")
+
+LOCVAL(LOCALE_SPOSITIVESIGN, "")
+LOCVAL(LOCALE_SNEGATIVESIGN, "-")
+LOCVAL(LOCALE_IPOSSIGNPOSN, "3")
+LOCVAL(LOCALE_INEGSIGNPOSN, "0")
+LOCVAL(LOCALE_IPOSSYMPRECEDES, "1")
+LOCVAL(LOCALE_IPOSSEPBYSPACE, "0")
+LOCVAL(LOCALE_INEGSYMPRECEDES, "1")
+LOCVAL(LOCALE_INEGSEPBYSPACE, "0")
diff --git a/ole/nls/ent.nls b/ole/nls/ent.nls
new file mode 100644
index 0000000..4b9ec63
--- /dev/null
+++ b/ole/nls/ent.nls
@@ -0,0 +1,109 @@
+/*
+ *	OLE2NLS library
+ *      Trinidad & Tobago
+ */
+
+LOCVAL(LOCALE_ILANGUAGE, "0409")
+LOCVAL(LOCALE_SLANGUAGE, "English (Trinidad & Tobago)")
+LOCVAL(LOCALE_SENGLANGUAGE, "English")
+LOCVAL(LOCALE_SABBREVLANGNAME, "ent")
+LOCVAL(LOCALE_SNATIVELANGNAME, "English")
+LOCVAL(LOCALE_ICOUNTRY, "1")
+LOCVAL(LOCALE_SCOUNTRY, "Trinidad & Tobago")
+LOCVAL(LOCALE_SENGCOUNTRY, "Trinidad & Tobago")
+LOCVAL(LOCALE_SABBREVCTRYNAME, "USA")
+LOCVAL(LOCALE_SNATIVECTRYNAME, "United States")
+LOCVAL(LOCALE_IDEFAULTLANGUAGE, "0409")
+LOCVAL(LOCALE_IDEFAULTCOUNTRY, "1")
+LOCVAL(LOCALE_IDEFAULTCODEPAGE, "437")
+LOCVAL(LOCALE_IDEFAULTANSICODEPAGE, "1252")
+LOCVAL(LOCALE_SLIST, ",")
+LOCVAL(LOCALE_IMEASURE, "1")
+LOCVAL(LOCALE_SDECIMAL, ".")
+LOCVAL(LOCALE_STHOUSAND, ",")
+LOCVAL(LOCALE_SGROUPING, "3;0")
+LOCVAL(LOCALE_IDIGITS, "2")
+LOCVAL(LOCALE_ILZERO, "1")
+LOCVAL(LOCALE_INEGNUMBER, "1")
+LOCVAL(LOCALE_SNATIVEDIGITS, "0123456789")
+LOCVAL(LOCALE_SCURRENCY, "$")
+LOCVAL(LOCALE_SINTLSYMBOL, "USD")
+LOCVAL(LOCALE_SMONDECIMALSEP, ".")
+LOCVAL(LOCALE_SMONTHOUSANDSEP, ",")
+LOCVAL(LOCALE_SMONGROUPING, "3;0")
+LOCVAL(LOCALE_ICURRDIGITS, "2")
+LOCVAL(LOCALE_IINTLCURRDIGITS, "2")
+LOCVAL(LOCALE_ICURRENCY, "0")
+LOCVAL(LOCALE_INEGCURR, "0")
+LOCVAL(LOCALE_SDATE, "/")
+LOCVAL(LOCALE_STIME, ":")
+LOCVAL(LOCALE_SSHORTDATE, "M/d/yy")
+LOCVAL(LOCALE_SLONGDATE, "dddd, MMMM dd, yyyy")
+LOCVAL(LOCALE_STIMEFORMAT, "h:mm:ss tt")
+LOCVAL(LOCALE_IDATE, "0")
+LOCVAL(LOCALE_ILDATE, "0")
+LOCVAL(LOCALE_ITIME, "0")
+LOCVAL(LOCALE_ITIMEMARKPOSN, "0")
+LOCVAL(LOCALE_ICENTURY, "0")
+LOCVAL(LOCALE_ITLZERO, "0")
+LOCVAL(LOCALE_IDAYLZERO, "0")
+LOCVAL(LOCALE_IMONLZERO, "0")
+LOCVAL(LOCALE_S1159, "AM")
+LOCVAL(LOCALE_S2359, "PM")
+LOCVAL(LOCALE_ICALENDARTYPE, "1")
+LOCVAL(LOCALE_IOPTIONALCALENDAR, "0")
+LOCVAL(LOCALE_IFIRSTDAYOFWEEK, "6")
+LOCVAL(LOCALE_IFIRSTWEEKOFYEAR, "0")
+
+LOCVAL(LOCALE_SDAYNAME1, "Monday")
+LOCVAL(LOCALE_SDAYNAME2, "Tuesday")
+LOCVAL(LOCALE_SDAYNAME3, "Wednesday")
+LOCVAL(LOCALE_SDAYNAME4, "Thursday")
+LOCVAL(LOCALE_SDAYNAME5, "Friday")
+LOCVAL(LOCALE_SDAYNAME6, "Saturday")
+LOCVAL(LOCALE_SDAYNAME7, "Sunday")
+
+LOCVAL(LOCALE_SABBREVDAYNAME1, "Mon")
+LOCVAL(LOCALE_SABBREVDAYNAME2, "Tue")
+LOCVAL(LOCALE_SABBREVDAYNAME3, "Wed")
+LOCVAL(LOCALE_SABBREVDAYNAME4, "Thu")
+LOCVAL(LOCALE_SABBREVDAYNAME5, "Fri")
+LOCVAL(LOCALE_SABBREVDAYNAME6, "Sat")
+LOCVAL(LOCALE_SABBREVDAYNAME7, "Sun")
+
+LOCVAL(LOCALE_SMONTHNAME1, "January")
+LOCVAL(LOCALE_SMONTHNAME2, "February")
+LOCVAL(LOCALE_SMONTHNAME3, "March")
+LOCVAL(LOCALE_SMONTHNAME4, "April")
+LOCVAL(LOCALE_SMONTHNAME5, "May")
+LOCVAL(LOCALE_SMONTHNAME6, "June")
+LOCVAL(LOCALE_SMONTHNAME7, "July")
+LOCVAL(LOCALE_SMONTHNAME8, "August")
+LOCVAL(LOCALE_SMONTHNAME9, "September")
+LOCVAL(LOCALE_SMONTHNAME10, "October")
+LOCVAL(LOCALE_SMONTHNAME11, "November")
+LOCVAL(LOCALE_SMONTHNAME12, "December")
+LOCVAL(LOCALE_SMONTHNAME13, "")
+
+LOCVAL(LOCALE_SABBREVMONTHNAME1, "Jan")
+LOCVAL(LOCALE_SABBREVMONTHNAME2, "Feb")
+LOCVAL(LOCALE_SABBREVMONTHNAME3, "Mar")
+LOCVAL(LOCALE_SABBREVMONTHNAME4, "Apr")
+LOCVAL(LOCALE_SABBREVMONTHNAME5, "May")
+LOCVAL(LOCALE_SABBREVMONTHNAME6, "Jun")
+LOCVAL(LOCALE_SABBREVMONTHNAME7, "Jul")
+LOCVAL(LOCALE_SABBREVMONTHNAME8, "Aug")
+LOCVAL(LOCALE_SABBREVMONTHNAME9, "Sep")
+LOCVAL(LOCALE_SABBREVMONTHNAME10, "Oct")
+LOCVAL(LOCALE_SABBREVMONTHNAME11, "Nov")
+LOCVAL(LOCALE_SABBREVMONTHNAME12, "Dec")
+LOCVAL(LOCALE_SABBREVMONTHNAME13, "")
+
+LOCVAL(LOCALE_SPOSITIVESIGN, "")
+LOCVAL(LOCALE_SNEGATIVESIGN, "-")
+LOCVAL(LOCALE_IPOSSIGNPOSN, "3")
+LOCVAL(LOCALE_INEGSIGNPOSN, "0")
+LOCVAL(LOCALE_IPOSSYMPRECEDES, "1")
+LOCVAL(LOCALE_IPOSSEPBYSPACE, "0")
+LOCVAL(LOCALE_INEGSYMPRECEDES, "1")
+LOCVAL(LOCALE_INEGSEPBYSPACE, "0")
diff --git a/ole/nls/enu.nls b/ole/nls/enu.nls
new file mode 100644
index 0000000..631cdfd
--- /dev/null
+++ b/ole/nls/enu.nls
@@ -0,0 +1,109 @@
+/*
+ *	OLE2NLS library
+ *      United States
+ */
+
+LOCVAL(LOCALE_ILANGUAGE, "0409")
+LOCVAL(LOCALE_SLANGUAGE, "English (United States)")
+LOCVAL(LOCALE_SENGLANGUAGE, "English")
+LOCVAL(LOCALE_SABBREVLANGNAME, "enu")
+LOCVAL(LOCALE_SNATIVELANGNAME, "English")
+LOCVAL(LOCALE_ICOUNTRY, "1")
+LOCVAL(LOCALE_SCOUNTRY, "United States")
+LOCVAL(LOCALE_SENGCOUNTRY, "United States")
+LOCVAL(LOCALE_SABBREVCTRYNAME, "USA")
+LOCVAL(LOCALE_SNATIVECTRYNAME, "United States")
+LOCVAL(LOCALE_IDEFAULTLANGUAGE, "0409")
+LOCVAL(LOCALE_IDEFAULTCOUNTRY, "1")
+LOCVAL(LOCALE_IDEFAULTCODEPAGE, "437")
+LOCVAL(LOCALE_IDEFAULTANSICODEPAGE, "1252")
+LOCVAL(LOCALE_SLIST, ",")
+LOCVAL(LOCALE_IMEASURE, "1")
+LOCVAL(LOCALE_SDECIMAL, ".")
+LOCVAL(LOCALE_STHOUSAND, ",")
+LOCVAL(LOCALE_SGROUPING, "3;0")
+LOCVAL(LOCALE_IDIGITS, "2")
+LOCVAL(LOCALE_ILZERO, "1")
+LOCVAL(LOCALE_INEGNUMBER, "1")
+LOCVAL(LOCALE_SNATIVEDIGITS, "0123456789")
+LOCVAL(LOCALE_SCURRENCY, "$")
+LOCVAL(LOCALE_SINTLSYMBOL, "USD")
+LOCVAL(LOCALE_SMONDECIMALSEP, ".")
+LOCVAL(LOCALE_SMONTHOUSANDSEP, ",")
+LOCVAL(LOCALE_SMONGROUPING, "3;0")
+LOCVAL(LOCALE_ICURRDIGITS, "2")
+LOCVAL(LOCALE_IINTLCURRDIGITS, "2")
+LOCVAL(LOCALE_ICURRENCY, "0")
+LOCVAL(LOCALE_INEGCURR, "0")
+LOCVAL(LOCALE_SDATE, "/")
+LOCVAL(LOCALE_STIME, ":")
+LOCVAL(LOCALE_SSHORTDATE, "M/d/yy")
+LOCVAL(LOCALE_SLONGDATE, "dddd, MMMM dd, yyyy")
+LOCVAL(LOCALE_STIMEFORMAT, "h:mm:ss tt")
+LOCVAL(LOCALE_IDATE, "0")
+LOCVAL(LOCALE_ILDATE, "0")
+LOCVAL(LOCALE_ITIME, "0")
+LOCVAL(LOCALE_ITIMEMARKPOSN, "0")
+LOCVAL(LOCALE_ICENTURY, "0")
+LOCVAL(LOCALE_ITLZERO, "0")
+LOCVAL(LOCALE_IDAYLZERO, "0")
+LOCVAL(LOCALE_IMONLZERO, "0")
+LOCVAL(LOCALE_S1159, "AM")
+LOCVAL(LOCALE_S2359, "PM")
+LOCVAL(LOCALE_ICALENDARTYPE, "1")
+LOCVAL(LOCALE_IOPTIONALCALENDAR, "0")
+LOCVAL(LOCALE_IFIRSTDAYOFWEEK, "6")
+LOCVAL(LOCALE_IFIRSTWEEKOFYEAR, "0")
+
+LOCVAL(LOCALE_SDAYNAME1, "Monday")
+LOCVAL(LOCALE_SDAYNAME2, "Tuesday")
+LOCVAL(LOCALE_SDAYNAME3, "Wednesday")
+LOCVAL(LOCALE_SDAYNAME4, "Thursday")
+LOCVAL(LOCALE_SDAYNAME5, "Friday")
+LOCVAL(LOCALE_SDAYNAME6, "Saturday")
+LOCVAL(LOCALE_SDAYNAME7, "Sunday")
+
+LOCVAL(LOCALE_SABBREVDAYNAME1, "Mon")
+LOCVAL(LOCALE_SABBREVDAYNAME2, "Tue")
+LOCVAL(LOCALE_SABBREVDAYNAME3, "Wed")
+LOCVAL(LOCALE_SABBREVDAYNAME4, "Thu")
+LOCVAL(LOCALE_SABBREVDAYNAME5, "Fri")
+LOCVAL(LOCALE_SABBREVDAYNAME6, "Sat")
+LOCVAL(LOCALE_SABBREVDAYNAME7, "Sun")
+
+LOCVAL(LOCALE_SMONTHNAME1, "January")
+LOCVAL(LOCALE_SMONTHNAME2, "February")
+LOCVAL(LOCALE_SMONTHNAME3, "March")
+LOCVAL(LOCALE_SMONTHNAME4, "April")
+LOCVAL(LOCALE_SMONTHNAME5, "May")
+LOCVAL(LOCALE_SMONTHNAME6, "June")
+LOCVAL(LOCALE_SMONTHNAME7, "July")
+LOCVAL(LOCALE_SMONTHNAME8, "August")
+LOCVAL(LOCALE_SMONTHNAME9, "September")
+LOCVAL(LOCALE_SMONTHNAME10, "October")
+LOCVAL(LOCALE_SMONTHNAME11, "November")
+LOCVAL(LOCALE_SMONTHNAME12, "December")
+LOCVAL(LOCALE_SMONTHNAME13, "")
+
+LOCVAL(LOCALE_SABBREVMONTHNAME1, "Jan")
+LOCVAL(LOCALE_SABBREVMONTHNAME2, "Feb")
+LOCVAL(LOCALE_SABBREVMONTHNAME3, "Mar")
+LOCVAL(LOCALE_SABBREVMONTHNAME4, "Apr")
+LOCVAL(LOCALE_SABBREVMONTHNAME5, "May")
+LOCVAL(LOCALE_SABBREVMONTHNAME6, "Jun")
+LOCVAL(LOCALE_SABBREVMONTHNAME7, "Jul")
+LOCVAL(LOCALE_SABBREVMONTHNAME8, "Aug")
+LOCVAL(LOCALE_SABBREVMONTHNAME9, "Sep")
+LOCVAL(LOCALE_SABBREVMONTHNAME10, "Oct")
+LOCVAL(LOCALE_SABBREVMONTHNAME11, "Nov")
+LOCVAL(LOCALE_SABBREVMONTHNAME12, "Dec")
+LOCVAL(LOCALE_SABBREVMONTHNAME13, "")
+
+LOCVAL(LOCALE_SPOSITIVESIGN, "")
+LOCVAL(LOCALE_SNEGATIVESIGN, "-")
+LOCVAL(LOCALE_IPOSSIGNPOSN, "3")
+LOCVAL(LOCALE_INEGSIGNPOSN, "0")
+LOCVAL(LOCALE_IPOSSYMPRECEDES, "1")
+LOCVAL(LOCALE_IPOSSEPBYSPACE, "0")
+LOCVAL(LOCALE_INEGSYMPRECEDES, "1")
+LOCVAL(LOCALE_INEGSEPBYSPACE, "0")
diff --git a/ole/nls/enz.nls b/ole/nls/enz.nls
new file mode 100644
index 0000000..c6824ed
--- /dev/null
+++ b/ole/nls/enz.nls
@@ -0,0 +1,109 @@
+/*
+ *	OLE2NLS library
+ *      New Zealand
+ */
+
+LOCVAL(LOCALE_ILANGUAGE, "0809")
+LOCVAL(LOCALE_SLANGUAGE, "English (New Zealand)")
+LOCVAL(LOCALE_SENGLANGUAGE, "English")
+LOCVAL(LOCALE_SABBREVLANGNAME, "enz")
+LOCVAL(LOCALE_SNATIVELANGNAME, "English")
+LOCVAL(LOCALE_ICOUNTRY, "44")
+LOCVAL(LOCALE_SCOUNTRY, "New Zealand")
+LOCVAL(LOCALE_SENGCOUNTRY, "New Zealand")
+LOCVAL(LOCALE_SABBREVCTRYNAME, "NZL")
+LOCVAL(LOCALE_SNATIVECTRYNAME, "New Zealand")
+LOCVAL(LOCALE_IDEFAULTLANGUAGE, "0809")
+LOCVAL(LOCALE_IDEFAULTCOUNTRY, "44")
+LOCVAL(LOCALE_IDEFAULTCODEPAGE, "850")
+LOCVAL(LOCALE_IDEFAULTANSICODEPAGE, "1252")
+LOCVAL(LOCALE_SLIST, ",")
+LOCVAL(LOCALE_IMEASURE, "0")
+LOCVAL(LOCALE_SDECIMAL, ".")
+LOCVAL(LOCALE_STHOUSAND, ",")
+LOCVAL(LOCALE_SGROUPING, "3;0")
+LOCVAL(LOCALE_IDIGITS, "2")
+LOCVAL(LOCALE_ILZERO, "1")
+LOCVAL(LOCALE_INEGNUMBER, "1")
+LOCVAL(LOCALE_SNATIVEDIGITS, "0123456789")
+LOCVAL(LOCALE_SCURRENCY, "£")
+LOCVAL(LOCALE_SINTLSYMBOL, "GBP")
+LOCVAL(LOCALE_SMONDECIMALSEP, ".")
+LOCVAL(LOCALE_SMONTHOUSANDSEP, ",")
+LOCVAL(LOCALE_SMONGROUPING, "3;0")
+LOCVAL(LOCALE_ICURRDIGITS, "2")
+LOCVAL(LOCALE_IINTLCURRDIGITS, "2")
+LOCVAL(LOCALE_ICURRENCY, "0")
+LOCVAL(LOCALE_INEGCURR, "1")
+LOCVAL(LOCALE_SDATE, "/")
+LOCVAL(LOCALE_STIME, ":")
+LOCVAL(LOCALE_SSHORTDATE, "dd/MM/yy")
+LOCVAL(LOCALE_SLONGDATE, "dd MMMM yyyy")
+LOCVAL(LOCALE_STIMEFORMAT, "HH:mm:ss")
+LOCVAL(LOCALE_IDATE, "1")
+LOCVAL(LOCALE_ILDATE, "1")
+LOCVAL(LOCALE_ITIME, "1")
+LOCVAL(LOCALE_ITIMEMARKPOSN, "0")
+LOCVAL(LOCALE_ICENTURY, "0")
+LOCVAL(LOCALE_ITLZERO, "1")
+LOCVAL(LOCALE_IDAYLZERO, "1")
+LOCVAL(LOCALE_IMONLZERO, "1")
+LOCVAL(LOCALE_S1159, "AM")
+LOCVAL(LOCALE_S2359, "PM")
+LOCVAL(LOCALE_ICALENDARTYPE, "1")
+LOCVAL(LOCALE_IOPTIONALCALENDAR, "0")
+LOCVAL(LOCALE_IFIRSTDAYOFWEEK, "0")
+LOCVAL(LOCALE_IFIRSTWEEKOFYEAR, "0")
+
+LOCVAL(LOCALE_SDAYNAME1, "Monday")
+LOCVAL(LOCALE_SDAYNAME2, "Tuesday")
+LOCVAL(LOCALE_SDAYNAME3, "Wednesday")
+LOCVAL(LOCALE_SDAYNAME4, "Thursday")
+LOCVAL(LOCALE_SDAYNAME5, "Friday")
+LOCVAL(LOCALE_SDAYNAME6, "Saturday")
+LOCVAL(LOCALE_SDAYNAME7, "Sunday")
+
+LOCVAL(LOCALE_SABBREVDAYNAME1, "Mon")
+LOCVAL(LOCALE_SABBREVDAYNAME2, "Tue")
+LOCVAL(LOCALE_SABBREVDAYNAME3, "Wed")
+LOCVAL(LOCALE_SABBREVDAYNAME4, "Thu")
+LOCVAL(LOCALE_SABBREVDAYNAME5, "Fri")
+LOCVAL(LOCALE_SABBREVDAYNAME6, "Sat")
+LOCVAL(LOCALE_SABBREVDAYNAME7, "Sun")
+
+LOCVAL(LOCALE_SMONTHNAME1, "January")
+LOCVAL(LOCALE_SMONTHNAME2, "February")
+LOCVAL(LOCALE_SMONTHNAME3, "March")
+LOCVAL(LOCALE_SMONTHNAME4, "April")
+LOCVAL(LOCALE_SMONTHNAME5, "May")
+LOCVAL(LOCALE_SMONTHNAME6, "June")
+LOCVAL(LOCALE_SMONTHNAME7, "July")
+LOCVAL(LOCALE_SMONTHNAME8, "August")
+LOCVAL(LOCALE_SMONTHNAME9, "September")
+LOCVAL(LOCALE_SMONTHNAME10, "October")
+LOCVAL(LOCALE_SMONTHNAME11, "November")
+LOCVAL(LOCALE_SMONTHNAME12, "December")
+LOCVAL(LOCALE_SMONTHNAME13, "")
+
+LOCVAL(LOCALE_SABBREVMONTHNAME1, "Jan")
+LOCVAL(LOCALE_SABBREVMONTHNAME2, "Feb")
+LOCVAL(LOCALE_SABBREVMONTHNAME3, "Mar")
+LOCVAL(LOCALE_SABBREVMONTHNAME4, "Apr")
+LOCVAL(LOCALE_SABBREVMONTHNAME5, "May")
+LOCVAL(LOCALE_SABBREVMONTHNAME6, "Jun")
+LOCVAL(LOCALE_SABBREVMONTHNAME7, "Jul")
+LOCVAL(LOCALE_SABBREVMONTHNAME8, "Aug")
+LOCVAL(LOCALE_SABBREVMONTHNAME9, "Sep")
+LOCVAL(LOCALE_SABBREVMONTHNAME10, "Oct")
+LOCVAL(LOCALE_SABBREVMONTHNAME11, "Nov")
+LOCVAL(LOCALE_SABBREVMONTHNAME12, "Dec")
+LOCVAL(LOCALE_SABBREVMONTHNAME13, "")
+
+LOCVAL(LOCALE_SPOSITIVESIGN, "")
+LOCVAL(LOCALE_SNEGATIVESIGN, "-")
+LOCVAL(LOCALE_IPOSSIGNPOSN, "3")
+LOCVAL(LOCALE_INEGSIGNPOSN, "3")
+LOCVAL(LOCALE_IPOSSYMPRECEDES, "1")
+LOCVAL(LOCALE_IPOSSEPBYSPACE, "0")
+LOCVAL(LOCALE_INEGSYMPRECEDES, "1")
+LOCVAL(LOCALE_INEGSEPBYSPACE, "0")
diff --git a/ole/nls/esh.nls b/ole/nls/esh.nls
new file mode 100644
index 0000000..9a8a9f1
--- /dev/null
+++ b/ole/nls/esh.nls
@@ -0,0 +1,110 @@
+/*
+ *	OLE2NLS library
+ *      Spanish (Honduras)
+ */
+
+/* LOCVAL(LOCALE_ILANGUAGE,"") */
+/* LOCVAL(LOCALE_SLANGUAGE,"") */
+LOCVAL(LOCALE_SENGLANGUAGE,"Spanish")
+LOCVAL(LOCALE_SABBREVLANGNAME,"esh")
+/* LOCVAL(LOCALE_SNATIVELANGNAME,"") */
+/* LOCVAL(LOCALE_ICOUNTRY,"") */
+/* LOCVAL(LOCALE_SCOUNTRY,"") */
+LOCVAL(LOCALE_SENGCOUNTRY,"Spain")
+/* LOCVAL(LOCALE_SABBREVCTRYNAME,"") */
+/* LOCVAL(LOCALE_SNATIVECTRYNAME,"Espa€a") */
+/* LOCVAL(LOCALE_IDEFAULTLANGUAGE,"") */
+/* LOCVAL(LOCALE_IDEFAULTCOUNTRY,"") */
+/* LOCVAL(LOCALE_IDEFAULTCODEPAGE) */
+/* LOCVAL(LOCALE_IDEFAULTANSICODEPAGE) */
+/* LOCVAL(LOCALE_SLIST,"") */
+/* LOCVAL(LOCALE_IMEASURE,"") */
+/* LOCVAL(LOCALE_SDECIMAL,"") */
+/* LOCVAL(LOCALE_STHOUSAND,"") */
+/* LOCVAL(LOCALE_SGROUPING) */
+/* LOCVAL(LOCALE_IDIGITS,"2") */
+/* LOCVAL(LOCALE_ILZERO,"1") */
+/* LOCVAL(LOCALE_INEGNUMBER) */
+LOCVAL(LOCALE_SNATIVEDIGITS, "0123456789")
+LOCVAL(LOCALE_SCURRENCY,"Pts")
+LOCVAL(LOCALE_SINTLSYMBOL, "ESP")
+/* LOCVAL(LOCALE_SMONDECIMALSEP,",") */
+/* LOCVAL(LOCALE_SMONTHOUSANDSEP,".") */
+/* LOCVAL(LOCALE_SMONGROUPING) */
+/* LOCVAL(LOCALE_ICURRDIGITS,"2") */
+/* LOCVAL(LOCALE_IINTLCURRDIGITS) */
+/* LOCVAL(LOCALE_ICURRENCY,"3") */
+/* LOCVAL(LOCALE_INEGCURR,"8") */
+/* LOCVAL(LOCALE_SDATE,".") */
+/* LOCVAL(LOCALE_STIME,":") */
+/* LOCVAL(LOCALE_SSHORTDATE,"dd/MM-yyyy") */
+/* LOCVAL(LOCALE_SLONGDATE,"ddd, d. MMMM yyyy") */
+/* LOCVAL(LOCALE_STIMEFORMAT) */
+/* LOCVAL(LOCALE_IDATE,"1") */
+/* LOCVAL(LOCALE_ILDATE) */
+/* LOCVAL(LOCALE_ITIME,"1")
+/* LOCVAL(LOCALE_ITIMEMARKPOSN) */
+/* LOCVAL(LOCALE_ICENTURY) */
+/* LOCVAL(LOCALE_ITLZERO,"1")
+/* LOCVAL(LOCALE_IDAYLZERO) */
+/* LOCVAL(LOCALE_IMONLZERO) */
+/* LOCVAL(LOCALE_S1159, "") */
+/* LOCVAL(LOCALE_S2359, "") */
+/* LOCVAL(LOCALE_ICALENDARTYPE) */
+/* LOCVAL(LOCALE_IOPTIONALCALENDAR) */
+/* LOCVAL(LOCALE_IFIRSTDAYOFWEEK) */
+/* LOCVAL(LOCALE_IFIRSTWEEKOFYEAR) */
+
+LOCVAL(LOCALE_SDAYNAME1,"lunes")
+LOCVAL(LOCALE_SDAYNAME2,"martes")
+LOCVAL(LOCALE_SDAYNAME3,"mi?rcoles")
+LOCVAL(LOCALE_SDAYNAME4,"jueves")
+LOCVAL(LOCALE_SDAYNAME5,"viernes")
+LOCVAL(LOCALE_SDAYNAME6,"s?abado")
+LOCVAL(LOCALE_SDAYNAME7,"domingo")
+
+/* LOCVAL(LOCALE_SABBREVDAYNAME1,"lun") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME2,"mar") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME3,"mi?") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME4,"jue") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME5,"vie") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME6,"") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME7,"") */
+
+/* LOCVAL(LOCALE_SMONTHNAME1,"") */
+LOCVAL(LOCALE_SMONTHNAME2,"febrero")
+LOCVAL(LOCALE_SMONTHNAME3,"marzo")
+LOCVAL(LOCALE_SMONTHNAME4,"abril")
+LOCVAL(LOCALE_SMONTHNAME5,"mayo")
+LOCVAL(LOCALE_SMONTHNAME6,"junio")
+LOCVAL(LOCALE_SMONTHNAME7,"julio")
+LOCVAL(LOCALE_SMONTHNAME8,"agosto")
+LOCVAL(LOCALE_SMONTHNAME9,"septiembre")
+LOCVAL(LOCALE_SMONTHNAME10,"octubre")
+LOCVAL(LOCALE_SMONTHNAME11,"noviembre")
+LOCVAL(LOCALE_SMONTHNAME12,"diciembre")
+LOCVAL(LOCALE_SMONTHNAME13,"")
+
+LOCVAL(LOCALE_SABBREVMONTHNAME1,"ene")
+LOCVAL(LOCALE_SABBREVMONTHNAME2,"feb")
+LOCVAL(LOCALE_SABBREVMONTHNAME3,"mar")
+LOCVAL(LOCALE_SABBREVMONTHNAME4,"abr")
+LOCVAL(LOCALE_SABBREVMONTHNAME5,"may")
+LOCVAL(LOCALE_SABBREVMONTHNAME6,"jun")
+LOCVAL(LOCALE_SABBREVMONTHNAME7,"jul")
+LOCVAL(LOCALE_SABBREVMONTHNAME8,"ago")
+LOCVAL(LOCALE_SABBREVMONTHNAME9,"sep")
+LOCVAL(LOCALE_SABBREVMONTHNAME10,"oct")
+LOCVAL(LOCALE_SABBREVMONTHNAME11,"nov")
+LOCVAL(LOCALE_SABBREVMONTHNAME12,"dic")
+LOCVAL(LOCALE_SABBREVMONTHNAME13,"")
+
+/* LOCVAL(LOCALE_SPOSITIVESIGN, "") */
+/* LOCVAL(LOCALE_SNEGATIVESIGN, "") */
+/* LOCVAL(LOCALE_IPOSSIGNPOSN, "") */
+/* LOCVAL(LOCALE_INEGSIGNPOSN, "") */
+/* LOCVAL(LOCALE_IPOSSYMPRECEDES, "") */
+/* LOCVAL(LOCALE_IPOSSEPBYSPACE, "") */
+/* LOCVAL(LOCALE_INEGSYMPRECEDES, "") */
+/* LOCVAL(LOCALE_INEGSEPBYSPACE, "") */
+
diff --git a/ole/nls/esi.nls b/ole/nls/esi.nls
new file mode 100644
index 0000000..2c5f881
--- /dev/null
+++ b/ole/nls/esi.nls
@@ -0,0 +1,110 @@
+/*
+ *	OLE2NLS library
+ *      Spanish (Nicaragua)
+ */
+
+/* LOCVAL(LOCALE_ILANGUAGE,"") */
+/* LOCVAL(LOCALE_SLANGUAGE,"") */
+LOCVAL(LOCALE_SENGLANGUAGE,"Spanish")
+LOCVAL(LOCALE_SABBREVLANGNAME,"esi")
+/* LOCVAL(LOCALE_SNATIVELANGNAME,"") */
+/* LOCVAL(LOCALE_ICOUNTRY,"") */
+/* LOCVAL(LOCALE_SCOUNTRY,"") */
+LOCVAL(LOCALE_SENGCOUNTRY,"Spain")
+/* LOCVAL(LOCALE_SABBREVCTRYNAME,"") */
+/* LOCVAL(LOCALE_SNATIVECTRYNAME,"Espa€a") */
+/* LOCVAL(LOCALE_IDEFAULTLANGUAGE,"") */
+/* LOCVAL(LOCALE_IDEFAULTCOUNTRY,"") */
+/* LOCVAL(LOCALE_IDEFAULTCODEPAGE) */
+/* LOCVAL(LOCALE_IDEFAULTANSICODEPAGE) */
+/* LOCVAL(LOCALE_SLIST,"") */
+/* LOCVAL(LOCALE_IMEASURE,"") */
+/* LOCVAL(LOCALE_SDECIMAL,"") */
+/* LOCVAL(LOCALE_STHOUSAND,"") */
+/* LOCVAL(LOCALE_SGROUPING) */
+/* LOCVAL(LOCALE_IDIGITS,"2") */
+/* LOCVAL(LOCALE_ILZERO,"1") */
+/* LOCVAL(LOCALE_INEGNUMBER) */
+LOCVAL(LOCALE_SNATIVEDIGITS, "0123456789")
+LOCVAL(LOCALE_SCURRENCY,"Pts")
+LOCVAL(LOCALE_SINTLSYMBOL, "ESP")
+/* LOCVAL(LOCALE_SMONDECIMALSEP,",") */
+/* LOCVAL(LOCALE_SMONTHOUSANDSEP,".") */
+/* LOCVAL(LOCALE_SMONGROUPING) */
+/* LOCVAL(LOCALE_ICURRDIGITS,"2") */
+/* LOCVAL(LOCALE_IINTLCURRDIGITS) */
+/* LOCVAL(LOCALE_ICURRENCY,"3") */
+/* LOCVAL(LOCALE_INEGCURR,"8") */
+/* LOCVAL(LOCALE_SDATE,".") */
+/* LOCVAL(LOCALE_STIME,":") */
+/* LOCVAL(LOCALE_SSHORTDATE,"dd/MM-yyyy") */
+/* LOCVAL(LOCALE_SLONGDATE,"ddd, d. MMMM yyyy") */
+/* LOCVAL(LOCALE_STIMEFORMAT) */
+/* LOCVAL(LOCALE_IDATE,"1") */
+/* LOCVAL(LOCALE_ILDATE) */
+/* LOCVAL(LOCALE_ITIME,"1")
+/* LOCVAL(LOCALE_ITIMEMARKPOSN) */
+/* LOCVAL(LOCALE_ICENTURY) */
+/* LOCVAL(LOCALE_ITLZERO,"1")
+/* LOCVAL(LOCALE_IDAYLZERO) */
+/* LOCVAL(LOCALE_IMONLZERO) */
+/* LOCVAL(LOCALE_S1159, "") */
+/* LOCVAL(LOCALE_S2359, "") */
+/* LOCVAL(LOCALE_ICALENDARTYPE) */
+/* LOCVAL(LOCALE_IOPTIONALCALENDAR) */
+/* LOCVAL(LOCALE_IFIRSTDAYOFWEEK) */
+/* LOCVAL(LOCALE_IFIRSTWEEKOFYEAR) */
+
+LOCVAL(LOCALE_SDAYNAME1,"lunes")
+LOCVAL(LOCALE_SDAYNAME2,"martes")
+LOCVAL(LOCALE_SDAYNAME3,"mi?rcoles")
+LOCVAL(LOCALE_SDAYNAME4,"jueves")
+LOCVAL(LOCALE_SDAYNAME5,"viernes")
+LOCVAL(LOCALE_SDAYNAME6,"s?abado")
+LOCVAL(LOCALE_SDAYNAME7,"domingo")
+
+/* LOCVAL(LOCALE_SABBREVDAYNAME1,"lun") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME2,"mar") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME3,"mi?") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME4,"jue") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME5,"vie") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME6,"") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME7,"") */
+
+/* LOCVAL(LOCALE_SMONTHNAME1,"") */
+LOCVAL(LOCALE_SMONTHNAME2,"febrero")
+LOCVAL(LOCALE_SMONTHNAME3,"marzo")
+LOCVAL(LOCALE_SMONTHNAME4,"abril")
+LOCVAL(LOCALE_SMONTHNAME5,"mayo")
+LOCVAL(LOCALE_SMONTHNAME6,"junio")
+LOCVAL(LOCALE_SMONTHNAME7,"julio")
+LOCVAL(LOCALE_SMONTHNAME8,"agosto")
+LOCVAL(LOCALE_SMONTHNAME9,"septiembre")
+LOCVAL(LOCALE_SMONTHNAME10,"octubre")
+LOCVAL(LOCALE_SMONTHNAME11,"noviembre")
+LOCVAL(LOCALE_SMONTHNAME12,"diciembre")
+LOCVAL(LOCALE_SMONTHNAME13,"")
+
+LOCVAL(LOCALE_SABBREVMONTHNAME1,"ene")
+LOCVAL(LOCALE_SABBREVMONTHNAME2,"feb")
+LOCVAL(LOCALE_SABBREVMONTHNAME3,"mar")
+LOCVAL(LOCALE_SABBREVMONTHNAME4,"abr")
+LOCVAL(LOCALE_SABBREVMONTHNAME5,"may")
+LOCVAL(LOCALE_SABBREVMONTHNAME6,"jun")
+LOCVAL(LOCALE_SABBREVMONTHNAME7,"jul")
+LOCVAL(LOCALE_SABBREVMONTHNAME8,"ago")
+LOCVAL(LOCALE_SABBREVMONTHNAME9,"sep")
+LOCVAL(LOCALE_SABBREVMONTHNAME10,"oct")
+LOCVAL(LOCALE_SABBREVMONTHNAME11,"nov")
+LOCVAL(LOCALE_SABBREVMONTHNAME12,"dic")
+LOCVAL(LOCALE_SABBREVMONTHNAME13,"")
+
+/* LOCVAL(LOCALE_SPOSITIVESIGN, "") */
+/* LOCVAL(LOCALE_SNEGATIVESIGN, "") */
+/* LOCVAL(LOCALE_IPOSSIGNPOSN, "") */
+/* LOCVAL(LOCALE_INEGSIGNPOSN, "") */
+/* LOCVAL(LOCALE_IPOSSYMPRECEDES, "") */
+/* LOCVAL(LOCALE_IPOSSEPBYSPACE, "") */
+/* LOCVAL(LOCALE_INEGSYMPRECEDES, "") */
+/* LOCVAL(LOCALE_INEGSEPBYSPACE, "") */
+
diff --git a/ole/nls/esm.nls b/ole/nls/esm.nls
new file mode 100644
index 0000000..63023c6
--- /dev/null
+++ b/ole/nls/esm.nls
@@ -0,0 +1,110 @@
+/*
+ *	OLE2NLS library
+ *      Mexiko
+ */
+
+/* LOCVAL(LOCALE_ILANGUAGE,"") */
+/* LOCVAL(LOCALE_SLANGUAGE,"") */
+LOCVAL(LOCALE_SENGLANGUAGE,"Spanish")
+LOCVAL(LOCALE_SABBREVLANGNAME,"esm")
+/* LOCVAL(LOCALE_SNATIVELANGNAME,"") */
+/* LOCVAL(LOCALE_ICOUNTRY,"") */
+/* LOCVAL(LOCALE_SCOUNTRY,"") */
+LOCVAL(LOCALE_SENGCOUNTRY,"Mexico")
+/* LOCVAL(LOCALE_SABBREVCTRYNAME,"") */
+/* LOCVAL(LOCALE_SNATIVECTRYNAME,"Espa€a") */
+/* LOCVAL(LOCALE_IDEFAULTLANGUAGE,"") */
+/* LOCVAL(LOCALE_IDEFAULTCOUNTRY,"") */
+/* LOCVAL(LOCALE_IDEFAULTCODEPAGE) */
+/* LOCVAL(LOCALE_IDEFAULTANSICODEPAGE) */
+/* LOCVAL(LOCALE_SLIST,"") */
+/* LOCVAL(LOCALE_IMEASURE,"") */
+/* LOCVAL(LOCALE_SDECIMAL,"") */
+/* LOCVAL(LOCALE_STHOUSAND,"") */
+/* LOCVAL(LOCALE_SGROUPING) */
+/* LOCVAL(LOCALE_IDIGITS,"2") */
+/* LOCVAL(LOCALE_ILZERO,"1") */
+/* LOCVAL(LOCALE_INEGNUMBER) */
+LOCVAL(LOCALE_SNATIVEDIGITS, "0123456789")
+LOCVAL(LOCALE_SCURRENCY,"$")
+LOCVAL(LOCALE_SINTLSYMBOL, "MXN")
+/* LOCVAL(LOCALE_SMONDECIMALSEP,",") */
+/* LOCVAL(LOCALE_SMONTHOUSANDSEP,".") */
+/* LOCVAL(LOCALE_SMONGROUPING) */
+/* LOCVAL(LOCALE_ICURRDIGITS,"2") */
+/* LOCVAL(LOCALE_IINTLCURRDIGITS) */
+/* LOCVAL(LOCALE_ICURRENCY,"3") */
+/* LOCVAL(LOCALE_INEGCURR,"8") */
+/* LOCVAL(LOCALE_SDATE,".") */
+/* LOCVAL(LOCALE_STIME,":") */
+/* LOCVAL(LOCALE_SSHORTDATE,"dd/MM-yyyy") */
+/* LOCVAL(LOCALE_SLONGDATE,"ddd, d. MMMM yyyy") */
+/* LOCVAL(LOCALE_STIMEFORMAT) */
+/* LOCVAL(LOCALE_IDATE,"1") */
+/* LOCVAL(LOCALE_ILDATE) */
+/* LOCVAL(LOCALE_ITIME,"1")
+/* LOCVAL(LOCALE_ITIMEMARKPOSN) */
+/* LOCVAL(LOCALE_ICENTURY) */
+/* LOCVAL(LOCALE_ITLZERO,"1")
+/* LOCVAL(LOCALE_IDAYLZERO) */
+/* LOCVAL(LOCALE_IMONLZERO) */
+/* LOCVAL(LOCALE_S1159, "") */
+/* LOCVAL(LOCALE_S2359, "") */
+/* LOCVAL(LOCALE_ICALENDARTYPE) */
+/* LOCVAL(LOCALE_IOPTIONALCALENDAR) */
+/* LOCVAL(LOCALE_IFIRSTDAYOFWEEK) */
+/* LOCVAL(LOCALE_IFIRSTWEEKOFYEAR) */
+
+LOCVAL(LOCALE_SDAYNAME1,"lunes")
+LOCVAL(LOCALE_SDAYNAME2,"martes")
+LOCVAL(LOCALE_SDAYNAME3,"mi?rcoles")
+LOCVAL(LOCALE_SDAYNAME4,"jueves")
+LOCVAL(LOCALE_SDAYNAME5,"viernes")
+LOCVAL(LOCALE_SDAYNAME6,"s?abado")
+LOCVAL(LOCALE_SDAYNAME7,"domingo")
+
+/* LOCVAL(LOCALE_SABBREVDAYNAME1,"lun") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME2,"mar") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME3,"mi?") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME4,"jue") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME5,"vie") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME6,"") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME7,"") */
+
+/* LOCVAL(LOCALE_SMONTHNAME1,"") */
+LOCVAL(LOCALE_SMONTHNAME2,"febrero")
+LOCVAL(LOCALE_SMONTHNAME3,"marzo")
+LOCVAL(LOCALE_SMONTHNAME4,"abril")
+LOCVAL(LOCALE_SMONTHNAME5,"mayo")
+LOCVAL(LOCALE_SMONTHNAME6,"junio")
+LOCVAL(LOCALE_SMONTHNAME7,"julio")
+LOCVAL(LOCALE_SMONTHNAME8,"agosto")
+LOCVAL(LOCALE_SMONTHNAME9,"septiembre")
+LOCVAL(LOCALE_SMONTHNAME10,"octubre")
+LOCVAL(LOCALE_SMONTHNAME11,"noviembre")
+LOCVAL(LOCALE_SMONTHNAME12,"diciembre")
+LOCVAL(LOCALE_SMONTHNAME13,"")
+
+LOCVAL(LOCALE_SABBREVMONTHNAME1,"ene")
+LOCVAL(LOCALE_SABBREVMONTHNAME2,"feb")
+LOCVAL(LOCALE_SABBREVMONTHNAME3,"mar")
+LOCVAL(LOCALE_SABBREVMONTHNAME4,"abr")
+LOCVAL(LOCALE_SABBREVMONTHNAME5,"may")
+LOCVAL(LOCALE_SABBREVMONTHNAME6,"jun")
+LOCVAL(LOCALE_SABBREVMONTHNAME7,"jul")
+LOCVAL(LOCALE_SABBREVMONTHNAME8,"ago")
+LOCVAL(LOCALE_SABBREVMONTHNAME9,"sep")
+LOCVAL(LOCALE_SABBREVMONTHNAME10,"oct")
+LOCVAL(LOCALE_SABBREVMONTHNAME11,"nov")
+LOCVAL(LOCALE_SABBREVMONTHNAME12,"dic")
+LOCVAL(LOCALE_SABBREVMONTHNAME13,"")
+
+/* LOCVAL(LOCALE_SPOSITIVESIGN, "") */
+/* LOCVAL(LOCALE_SNEGATIVESIGN, "") */
+/* LOCVAL(LOCALE_IPOSSIGNPOSN, "") */
+/* LOCVAL(LOCALE_INEGSIGNPOSN, "") */
+/* LOCVAL(LOCALE_IPOSSYMPRECEDES, "") */
+/* LOCVAL(LOCALE_IPOSSEPBYSPACE, "") */
+/* LOCVAL(LOCALE_INEGSYMPRECEDES, "") */
+/* LOCVAL(LOCALE_INEGSEPBYSPACE, "") */
+
diff --git a/ole/nls/esn.nls b/ole/nls/esn.nls
new file mode 100644
index 0000000..6834c2a
--- /dev/null
+++ b/ole/nls/esn.nls
@@ -0,0 +1,110 @@
+/*
+ *	OLE2NLS library
+ *      Spanish (Modern)
+ */
+
+/* LOCVAL(LOCALE_ILANGUAGE,"") */
+/* LOCVAL(LOCALE_SLANGUAGE,"") */
+LOCVAL(LOCALE_SENGLANGUAGE,"Spanish")
+LOCVAL(LOCALE_SABBREVLANGNAME,"esn")
+/* LOCVAL(LOCALE_SNATIVELANGNAME,"") */
+/* LOCVAL(LOCALE_ICOUNTRY,"") */
+/* LOCVAL(LOCALE_SCOUNTRY,"") */
+LOCVAL(LOCALE_SENGCOUNTRY,"Spain")
+/* LOCVAL(LOCALE_SABBREVCTRYNAME,"") */
+/* LOCVAL(LOCALE_SNATIVECTRYNAME,"Espa€a") */
+/* LOCVAL(LOCALE_IDEFAULTLANGUAGE,"") */
+/* LOCVAL(LOCALE_IDEFAULTCOUNTRY,"") */
+/* LOCVAL(LOCALE_IDEFAULTCODEPAGE) */
+/* LOCVAL(LOCALE_IDEFAULTANSICODEPAGE) */
+/* LOCVAL(LOCALE_SLIST,"") */
+/* LOCVAL(LOCALE_IMEASURE,"") */
+/* LOCVAL(LOCALE_SDECIMAL,"") */
+/* LOCVAL(LOCALE_STHOUSAND,"") */
+/* LOCVAL(LOCALE_SGROUPING) */
+/* LOCVAL(LOCALE_IDIGITS,"2") */
+/* LOCVAL(LOCALE_ILZERO,"1") */
+/* LOCVAL(LOCALE_INEGNUMBER) */
+LOCVAL(LOCALE_SNATIVEDIGITS, "0123456789")
+LOCVAL(LOCALE_SCURRENCY,"Pts")
+LOCVAL(LOCALE_SINTLSYMBOL, "ESP")
+/* LOCVAL(LOCALE_SMONDECIMALSEP,",") */
+/* LOCVAL(LOCALE_SMONTHOUSANDSEP,".") */
+/* LOCVAL(LOCALE_SMONGROUPING) */
+/* LOCVAL(LOCALE_ICURRDIGITS,"2") */
+/* LOCVAL(LOCALE_IINTLCURRDIGITS) */
+/* LOCVAL(LOCALE_ICURRENCY,"3") */
+/* LOCVAL(LOCALE_INEGCURR,"8") */
+/* LOCVAL(LOCALE_SDATE,".") */
+/* LOCVAL(LOCALE_STIME,":") */
+/* LOCVAL(LOCALE_SSHORTDATE,"dd/MM-yyyy") */
+/* LOCVAL(LOCALE_SLONGDATE,"ddd, d. MMMM yyyy") */
+/* LOCVAL(LOCALE_STIMEFORMAT) */
+/* LOCVAL(LOCALE_IDATE,"1") */
+/* LOCVAL(LOCALE_ILDATE) */
+/* LOCVAL(LOCALE_ITIME,"1")
+/* LOCVAL(LOCALE_ITIMEMARKPOSN) */
+/* LOCVAL(LOCALE_ICENTURY) */
+/* LOCVAL(LOCALE_ITLZERO,"1")
+/* LOCVAL(LOCALE_IDAYLZERO) */
+/* LOCVAL(LOCALE_IMONLZERO) */
+/* LOCVAL(LOCALE_S1159, "") */
+/* LOCVAL(LOCALE_S2359, "") */
+/* LOCVAL(LOCALE_ICALENDARTYPE) */
+/* LOCVAL(LOCALE_IOPTIONALCALENDAR) */
+/* LOCVAL(LOCALE_IFIRSTDAYOFWEEK) */
+/* LOCVAL(LOCALE_IFIRSTWEEKOFYEAR) */
+
+LOCVAL(LOCALE_SDAYNAME1,"lunes")
+LOCVAL(LOCALE_SDAYNAME2,"martes")
+LOCVAL(LOCALE_SDAYNAME3,"mi?rcoles")
+LOCVAL(LOCALE_SDAYNAME4,"jueves")
+LOCVAL(LOCALE_SDAYNAME5,"viernes")
+LOCVAL(LOCALE_SDAYNAME6,"s?abado")
+LOCVAL(LOCALE_SDAYNAME7,"domingo")
+
+/* LOCVAL(LOCALE_SABBREVDAYNAME1,"lun") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME2,"mar") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME3,"mi?") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME4,"jue") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME5,"vie") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME6,"") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME7,"") */
+
+/* LOCVAL(LOCALE_SMONTHNAME1,"") */
+LOCVAL(LOCALE_SMONTHNAME2,"febrero")
+LOCVAL(LOCALE_SMONTHNAME3,"marzo")
+LOCVAL(LOCALE_SMONTHNAME4,"abril")
+LOCVAL(LOCALE_SMONTHNAME5,"mayo")
+LOCVAL(LOCALE_SMONTHNAME6,"junio")
+LOCVAL(LOCALE_SMONTHNAME7,"julio")
+LOCVAL(LOCALE_SMONTHNAME8,"agosto")
+LOCVAL(LOCALE_SMONTHNAME9,"septiembre")
+LOCVAL(LOCALE_SMONTHNAME10,"octubre")
+LOCVAL(LOCALE_SMONTHNAME11,"noviembre")
+LOCVAL(LOCALE_SMONTHNAME12,"diciembre")
+LOCVAL(LOCALE_SMONTHNAME13,"")
+
+LOCVAL(LOCALE_SABBREVMONTHNAME1,"ene")
+LOCVAL(LOCALE_SABBREVMONTHNAME2,"feb")
+LOCVAL(LOCALE_SABBREVMONTHNAME3,"mar")
+LOCVAL(LOCALE_SABBREVMONTHNAME4,"abr")
+LOCVAL(LOCALE_SABBREVMONTHNAME5,"may")
+LOCVAL(LOCALE_SABBREVMONTHNAME6,"jun")
+LOCVAL(LOCALE_SABBREVMONTHNAME7,"jul")
+LOCVAL(LOCALE_SABBREVMONTHNAME8,"ago")
+LOCVAL(LOCALE_SABBREVMONTHNAME9,"sep")
+LOCVAL(LOCALE_SABBREVMONTHNAME10,"oct")
+LOCVAL(LOCALE_SABBREVMONTHNAME11,"nov")
+LOCVAL(LOCALE_SABBREVMONTHNAME12,"dic")
+LOCVAL(LOCALE_SABBREVMONTHNAME13,"")
+
+/* LOCVAL(LOCALE_SPOSITIVESIGN, "") */
+/* LOCVAL(LOCALE_SNEGATIVESIGN, "") */
+/* LOCVAL(LOCALE_IPOSSIGNPOSN, "") */
+/* LOCVAL(LOCALE_INEGSIGNPOSN, "") */
+/* LOCVAL(LOCALE_IPOSSYMPRECEDES, "") */
+/* LOCVAL(LOCALE_IPOSSEPBYSPACE, "") */
+/* LOCVAL(LOCALE_INEGSYMPRECEDES, "") */
+/* LOCVAL(LOCALE_INEGSEPBYSPACE, "") */
+
diff --git a/ole/nls/esp.nls b/ole/nls/esp.nls
new file mode 100644
index 0000000..5191e89
--- /dev/null
+++ b/ole/nls/esp.nls
@@ -0,0 +1,110 @@
+/*
+ *	OLE2NLS library
+ *      Spanish (Traditional Sort)
+ */
+
+/* LOCVAL(LOCALE_ILANGUAGE,"") */
+/* LOCVAL(LOCALE_SLANGUAGE,"") */
+LOCVAL(LOCALE_SENGLANGUAGE,"Spanish")
+LOCVAL(LOCALE_SABBREVLANGNAME,"esp")
+/* LOCVAL(LOCALE_SNATIVELANGNAME,"") */
+/* LOCVAL(LOCALE_ICOUNTRY,"") */
+/* LOCVAL(LOCALE_SCOUNTRY,"") */
+LOCVAL(LOCALE_SENGCOUNTRY,"Spain")
+/* LOCVAL(LOCALE_SABBREVCTRYNAME,"") */
+/* LOCVAL(LOCALE_SNATIVECTRYNAME,"Espa€a") */
+/* LOCVAL(LOCALE_IDEFAULTLANGUAGE,"") */
+/* LOCVAL(LOCALE_IDEFAULTCOUNTRY,"") */
+/* LOCVAL(LOCALE_IDEFAULTCODEPAGE) */
+/* LOCVAL(LOCALE_IDEFAULTANSICODEPAGE) */
+/* LOCVAL(LOCALE_SLIST,"") */
+/* LOCVAL(LOCALE_IMEASURE,"") */
+/* LOCVAL(LOCALE_SDECIMAL,"") */
+/* LOCVAL(LOCALE_STHOUSAND,"") */
+/* LOCVAL(LOCALE_SGROUPING) */
+/* LOCVAL(LOCALE_IDIGITS,"2") */
+/* LOCVAL(LOCALE_ILZERO,"1") */
+/* LOCVAL(LOCALE_INEGNUMBER) */
+LOCVAL(LOCALE_SNATIVEDIGITS, "0123456789")
+LOCVAL(LOCALE_SCURRENCY,"Pts")
+LOCVAL(LOCALE_SINTLSYMBOL, "ESP")
+/* LOCVAL(LOCALE_SMONDECIMALSEP,",") */
+/* LOCVAL(LOCALE_SMONTHOUSANDSEP,".") */
+/* LOCVAL(LOCALE_SMONGROUPING) */
+/* LOCVAL(LOCALE_ICURRDIGITS,"2") */
+/* LOCVAL(LOCALE_IINTLCURRDIGITS) */
+/* LOCVAL(LOCALE_ICURRENCY,"3") */
+/* LOCVAL(LOCALE_INEGCURR,"8") */
+/* LOCVAL(LOCALE_SDATE,".") */
+/* LOCVAL(LOCALE_STIME,":") */
+/* LOCVAL(LOCALE_SSHORTDATE,"dd/MM-yyyy") */
+/* LOCVAL(LOCALE_SLONGDATE,"ddd, d. MMMM yyyy") */
+/* LOCVAL(LOCALE_STIMEFORMAT) */
+/* LOCVAL(LOCALE_IDATE,"1") */
+/* LOCVAL(LOCALE_ILDATE) */
+/* LOCVAL(LOCALE_ITIME,"1")
+/* LOCVAL(LOCALE_ITIMEMARKPOSN) */
+/* LOCVAL(LOCALE_ICENTURY) */
+/* LOCVAL(LOCALE_ITLZERO,"1")
+/* LOCVAL(LOCALE_IDAYLZERO) */
+/* LOCVAL(LOCALE_IMONLZERO) */
+/* LOCVAL(LOCALE_S1159, "") */
+/* LOCVAL(LOCALE_S2359, "") */
+/* LOCVAL(LOCALE_ICALENDARTYPE) */
+/* LOCVAL(LOCALE_IOPTIONALCALENDAR) */
+/* LOCVAL(LOCALE_IFIRSTDAYOFWEEK) */
+/* LOCVAL(LOCALE_IFIRSTWEEKOFYEAR) */
+
+LOCVAL(LOCALE_SDAYNAME1,"lunes")
+LOCVAL(LOCALE_SDAYNAME2,"martes")
+LOCVAL(LOCALE_SDAYNAME3,"mi?rcoles")
+LOCVAL(LOCALE_SDAYNAME4,"jueves")
+LOCVAL(LOCALE_SDAYNAME5,"viernes")
+LOCVAL(LOCALE_SDAYNAME6,"s?abado")
+LOCVAL(LOCALE_SDAYNAME7,"domingo")
+
+/* LOCVAL(LOCALE_SABBREVDAYNAME1,"lun") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME2,"mar") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME3,"mi?") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME4,"jue") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME5,"vie") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME6,"") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME7,"") */
+
+/* LOCVAL(LOCALE_SMONTHNAME1,"") */
+LOCVAL(LOCALE_SMONTHNAME2,"febrero")
+LOCVAL(LOCALE_SMONTHNAME3,"marzo")
+LOCVAL(LOCALE_SMONTHNAME4,"abril")
+LOCVAL(LOCALE_SMONTHNAME5,"mayo")
+LOCVAL(LOCALE_SMONTHNAME6,"junio")
+LOCVAL(LOCALE_SMONTHNAME7,"julio")
+LOCVAL(LOCALE_SMONTHNAME8,"agosto")
+LOCVAL(LOCALE_SMONTHNAME9,"septiembre")
+LOCVAL(LOCALE_SMONTHNAME10,"octubre")
+LOCVAL(LOCALE_SMONTHNAME11,"noviembre")
+LOCVAL(LOCALE_SMONTHNAME12,"diciembre")
+LOCVAL(LOCALE_SMONTHNAME13,"")
+
+LOCVAL(LOCALE_SABBREVMONTHNAME1,"ene")
+LOCVAL(LOCALE_SABBREVMONTHNAME2,"feb")
+LOCVAL(LOCALE_SABBREVMONTHNAME3,"mar")
+LOCVAL(LOCALE_SABBREVMONTHNAME4,"abr")
+LOCVAL(LOCALE_SABBREVMONTHNAME5,"may")
+LOCVAL(LOCALE_SABBREVMONTHNAME6,"jun")
+LOCVAL(LOCALE_SABBREVMONTHNAME7,"jul")
+LOCVAL(LOCALE_SABBREVMONTHNAME8,"ago")
+LOCVAL(LOCALE_SABBREVMONTHNAME9,"sep")
+LOCVAL(LOCALE_SABBREVMONTHNAME10,"oct")
+LOCVAL(LOCALE_SABBREVMONTHNAME11,"nov")
+LOCVAL(LOCALE_SABBREVMONTHNAME12,"dic")
+LOCVAL(LOCALE_SABBREVMONTHNAME13,"")
+
+/* LOCVAL(LOCALE_SPOSITIVESIGN, "") */
+/* LOCVAL(LOCALE_SNEGATIVESIGN, "") */
+/* LOCVAL(LOCALE_IPOSSIGNPOSN, "") */
+/* LOCVAL(LOCALE_INEGSIGNPOSN, "") */
+/* LOCVAL(LOCALE_IPOSSYMPRECEDES, "") */
+/* LOCVAL(LOCALE_IPOSSEPBYSPACE, "") */
+/* LOCVAL(LOCALE_INEGSYMPRECEDES, "") */
+/* LOCVAL(LOCALE_INEGSEPBYSPACE, "") */
+
diff --git a/ole/nls/esperanto.nls b/ole/nls/esperanto.nls
new file mode 100644
index 0000000..6611a3c
--- /dev/null
+++ b/ole/nls/esperanto.nls
@@ -0,0 +1,112 @@
+/*
+ *	OLE2NLS library
+ *      Esperanto
+ *      
+ *      Esperanto seems not to be supported by Windows
+ *
+ *      TODO: ISO numerical ID for language ?
+ */
+
+/* LOCVAL(LOCALE_ILANGUAGE,"9") */
+LOCVAL(LOCALE_SLANGUAGE,"Esperanto")
+LOCVAL(LOCALE_SENGLANGUAGE,"Esperanto")
+/* LOCVAL(LOCALE_SABBREVLANGNAME,"deu") */
+LOCVAL(LOCALE_SNATIVELANGNAME,"Esperanto")
+/* LOCVAL(LOCALE_ICOUNTRY,"") not official in any one country */
+/* LOCVAL(LOCALE_SCOUNTRY,"") */
+/* LOCVAL(LOCALE_SENGCOUNTRY,"") */
+/* LOCVAL(LOCALE_SABBREVCTRYNAME,"") */
+/* LOCVAL(LOCALE_SNATIVECTRYNAME,"") */
+/* LOCVAL(LOCALE_IDEFAULTLANGUAGE,"") ISO ID of lang TODO */
+/* LOCVAL(LOCALE_IDEFAULTCOUNTRY,"") */
+LOCVAL(LOCALE_IDEFAULTCODEPAGE,"3") /* is this right? TODO */
+LOCVAL(LOCALE_IDEFAULTANSICODEPAGE,"3") /* is this right? TODO */
+LOCVAL(LOCALE_SLIST,";")
+LOCVAL(LOCALE_IMEASURE,"0")
+LOCVAL(LOCALE_SDECIMAL,",")
+LOCVAL(LOCALE_STHOUSAND,".")
+/* LOCVAL(LOCALE_SGROUPING) */
+LOCVAL(LOCALE_IDIGITS,"2")
+LOCVAL(LOCALE_ILZERO,"1")
+/* LOCVAL(LOCALE_INEGNUMBER) */
+/* LOCVAL(LOCALE_SNATIVEDIGITS) */
+LOCVAL(LOCALE_SCURRENCY,"NLG") /* accounting currency of UEA */
+/* LOCVAL(LOCALE_SINTLSYMBOL) */
+/* LOCVAL(LOCALE_SMONDECIMALSEP) */
+/* LOCVAL(LOCALE_SMONTHOUSANDSEP) */
+/* LOCVAL(LOCALE_SMONGROUPING) */
+/* LOCVAL(LOCALE_ICURRDIGITS,"2") */
+/* LOCVAL(LOCALE_IINTLCURRDIGITS) */
+LOCVAL(LOCALE_ICURRENCY,"3")
+LOCVAL(LOCALE_INEGCURR,"8")
+LOCVAL(LOCALE_SDATE,".")
+LOCVAL(LOCALE_STIME,":")
+LOCVAL(LOCALE_SSHORTDATE,"yyyy.mm.dd")
+LOCVAL(LOCALE_SLONGDATE,"ddd, d. MMMM yyyy")
+/* LOCVAL(LOCALE_STIMEFORMAT) */
+LOCVAL(LOCALE_IDATE,"1")
+/* LOCVAL(LOCALE_ILDATE) */
+LOCVAL(LOCALE_ITIME,"1")
+/* LOCVAL(LOCALE_ITIMEMARKPOSN) */
+/* LOCVAL(LOCALE_ICENTURY) */
+LOCVAL(LOCALE_ITLZERO,"1")
+/* LOCVAL(LOCALE_IDAYLZERO) */
+/* LOCVAL(LOCALE_IMONLZERO) */
+/* LOCVAL(LOCALE_S1159) */
+/* LOCVAL(LOCALE_S2359) */
+/* LOCVAL(LOCALE_ICALENDARTYPE) */
+/* LOCVAL(LOCALE_IOPTIONALCALENDAR) */
+/* LOCVAL(LOCALE_IFIRSTDAYOFWEEK) */
+/* LOCVAL(LOCALE_IFIRSTWEEKOFYEAR) */
+
+LOCVAL(LOCALE_SDAYNAME1,"lundo")
+LOCVAL(LOCALE_SDAYNAME2,"mardo")
+LOCVAL(LOCALE_SDAYNAME3,"merkredo")
+LOCVAL(LOCALE_SDAYNAME4,"¼aýdo")
+LOCVAL(LOCALE_SDAYNAME5,"vendredo")
+LOCVAL(LOCALE_SDAYNAME6,"sabato")
+LOCVAL(LOCALE_SDAYNAME7,"dimanæo")
+LOCVAL(LOCALE_SABBREVDAYNAME1,"lu")
+LOCVAL(LOCALE_SABBREVDAYNAME2,"ma")
+LOCVAL(LOCALE_SABBREVDAYNAME3,"me")
+LOCVAL(LOCALE_SABBREVDAYNAME4,"¼a")
+LOCVAL(LOCALE_SABBREVDAYNAME5,"ve")
+LOCVAL(LOCALE_SABBREVDAYNAME6,"sa")
+LOCVAL(LOCALE_SABBREVDAYNAME7,"di")
+
+LOCVAL(LOCALE_SMONTHNAME1,"januaro")
+LOCVAL(LOCALE_SMONTHNAME2,"februaro")
+LOCVAL(LOCALE_SMONTHNAME3,"marto")
+LOCVAL(LOCALE_SMONTHNAME4,"aprilo")
+LOCVAL(LOCALE_SMONTHNAME5,"majo")
+LOCVAL(LOCALE_SMONTHNAME6,"junio")
+LOCVAL(LOCALE_SMONTHNAME7,"julio")
+LOCVAL(LOCALE_SMONTHNAME8,"aýgusto")
+LOCVAL(LOCALE_SMONTHNAME9,"septembro")
+LOCVAL(LOCALE_SMONTHNAME10,"oktobro")
+LOCVAL(LOCALE_SMONTHNAME11,"novembro")
+LOCVAL(LOCALE_SMONTHNAME12,"decembro")
+LOCVAL(LOCALE_SMONTHNAME13,"")
+
+LOCVAL(LOCALE_SABBREVMONTHNAME1,"jan")
+LOCVAL(LOCALE_SABBREVMONTHNAME2,"feb")
+LOCVAL(LOCALE_SABBREVMONTHNAME3,"mar")
+LOCVAL(LOCALE_SABBREVMONTHNAME4,"apr")
+LOCVAL(LOCALE_SABBREVMONTHNAME5,"maj")
+LOCVAL(LOCALE_SABBREVMONTHNAME6,"jun")
+LOCVAL(LOCALE_SABBREVMONTHNAME7,"jul")
+LOCVAL(LOCALE_SABBREVMONTHNAME8,"aýg")
+LOCVAL(LOCALE_SABBREVMONTHNAME9,"sep")
+LOCVAL(LOCALE_SABBREVMONTHNAME10,"okt")
+LOCVAL(LOCALE_SABBREVMONTHNAME11,"nov")
+LOCVAL(LOCALE_SABBREVMONTHNAME12,"dec")
+LOCVAL(LOCALE_SABBREVMONTHNAME13,"")
+
+/* LOCVAL(LOCALE_SPOSITIVESIGN) */
+/* LOCVAL(LOCALE_SNEGATIVESIGN) */
+/* LOCVAL(LOCALE_IPOSSIGNPOSN) */
+/* LOCVAL(LOCALE_INEGSIGNPOSN) */
+/* LOCVAL(LOCALE_IPOSSYMPRECEDES) */
+/* LOCVAL(LOCALE_IPOSSEPBYSPACE) */
+/* LOCVAL(LOCALE_INEGSYMPRECEDES) */
+/* LOCVAL(LOCALE_INEGSEPBYSPACE) */
diff --git a/ole/nls/est.nls b/ole/nls/est.nls
new file mode 100644
index 0000000..3a453a2
--- /dev/null
+++ b/ole/nls/est.nls
@@ -0,0 +1,110 @@
+/*
+ *	OLE2NLS library
+ *      Estonia
+ */
+
+/* LOCVAL(LOCALE_ILANGUAGE,"") */
+/* LOCVAL(LOCALE_SLANGUAGE,"") */
+/* LOCVAL(LOCALE_SENGLANGUAGE,"") */
+LOCVAL(LOCALE_SABBREVLANGNAME,"est")
+/* LOCVAL(LOCALE_SNATIVELANGNAME,"") */
+/* LOCVAL(LOCALE_ICOUNTRY,"") */
+/* LOCVAL(LOCALE_SCOUNTRY,"") */
+/* LOCVAL(LOCALE_SENGCOUNTRY,"") */
+/* LOCVAL(LOCALE_SABBREVCTRYNAME,"") */
+/* LOCVAL(LOCALE_SNATIVECTRYNAME,"") */
+/* LOCVAL(LOCALE_IDEFAULTLANGUAGE,"") */
+/* LOCVAL(LOCALE_IDEFAULTCOUNTRY,"") */
+/* LOCVAL(LOCALE_IDEFAULTCODEPAGE) */
+/* LOCVAL(LOCALE_IDEFAULTANSICODEPAGE) */
+/* LOCVAL(LOCALE_SLIST,"") */
+/* LOCVAL(LOCALE_IMEASURE,"") */
+/* LOCVAL(LOCALE_SDECIMAL,"") */
+/* LOCVAL(LOCALE_STHOUSAND,"") */
+/* LOCVAL(LOCALE_SGROUPING) */
+/* LOCVAL(LOCALE_IDIGITS,"2") */
+/* LOCVAL(LOCALE_ILZERO,"1") */
+/* LOCVAL(LOCALE_INEGNUMBER) */
+/* LOCVAL(LOCALE_SNATIVEDIGITS) */
+/* LOCVAL(LOCALE_SCURRENCY,"") */
+/* LOCVAL(LOCALE_SINTLSYMBOL) */
+/* LOCVAL(LOCALE_SMONDECIMALSEP,",") */
+/* LOCVAL(LOCALE_SMONTHOUSANDSEP,".") */
+/* LOCVAL(LOCALE_SMONGROUPING) */
+/* LOCVAL(LOCALE_ICURRDIGITS,"2") */
+/* LOCVAL(LOCALE_IINTLCURRDIGITS) */
+/* LOCVAL(LOCALE_ICURRENCY,"3") */
+/* LOCVAL(LOCALE_INEGCURR,"8") */
+/* LOCVAL(LOCALE_SDATE,".") */
+/* LOCVAL(LOCALE_STIME,":") */
+/* LOCVAL(LOCALE_SSHORTDATE,"dd/MM-yyyy") */
+/* LOCVAL(LOCALE_SLONGDATE,"ddd, d. MMMM yyyy") */
+/* LOCVAL(LOCALE_STIMEFORMAT) */
+/* LOCVAL(LOCALE_IDATE,"1") */
+/* LOCVAL(LOCALE_ILDATE) */
+/* LOCVAL(LOCALE_ITIME,"1")
+/* LOCVAL(LOCALE_ITIMEMARKPOSN) */
+/* LOCVAL(LOCALE_ICENTURY) */
+/* LOCVAL(LOCALE_ITLZERO,"1")
+/* LOCVAL(LOCALE_IDAYLZERO) */
+/* LOCVAL(LOCALE_IMONLZERO) */
+/* LOCVAL(LOCALE_S1159, "") */
+/* LOCVAL(LOCALE_S2359, "") */
+/* LOCVAL(LOCALE_ICALENDARTYPE) */
+/* LOCVAL(LOCALE_IOPTIONALCALENDAR) */
+/* LOCVAL(LOCALE_IFIRSTDAYOFWEEK) */
+/* LOCVAL(LOCALE_IFIRSTWEEKOFYEAR) */
+
+/* LOCVAL(LOCALE_SDAYNAME1,"") */
+/* LOCVAL(LOCALE_SDAYNAME2,"") */
+/* LOCVAL(LOCALE_SDAYNAME3,"") */
+/* LOCVAL(LOCALE_SDAYNAME4,"") */
+/* LOCVAL(LOCALE_SDAYNAME5,"") */
+/* LOCVAL(LOCALE_SDAYNAME6,"") */
+/* LOCVAL(LOCALE_SDAYNAME7,"") */
+
+/* LOCVAL(LOCALE_SABBREVDAYNAME1,"Ma") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME2,"Ti") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME3,"On") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME4,"To") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME5,"Fr") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME6,"Lø") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME7,"Sø") */
+
+/* LOCVAL(LOCALE_SMONTHNAME1,"") */
+/* LOCVAL(LOCALE_SMONTHNAME2,"") */
+/* LOCVAL(LOCALE_SMONTHNAME3,"") */
+/* LOCVAL(LOCALE_SMONTHNAME4,"") */
+/* LOCVAL(LOCALE_SMONTHNAME5,"") */
+/* LOCVAL(LOCALE_SMONTHNAME6,"") */
+/* LOCVAL(LOCALE_SMONTHNAME7,"") */
+/* LOCVAL(LOCALE_SMONTHNAME8,"") */
+/* LOCVAL(LOCALE_SMONTHNAME9,"") */
+/* LOCVAL(LOCALE_SMONTHNAME10,"") */
+/* LOCVAL(LOCALE_SMONTHNAME11,"") */
+/* LOCVAL(LOCALE_SMONTHNAME12,"") */
+/* LOCVAL(LOCALE_SMONTHNAME13,"") */
+
+/* LOCVAL(LOCALE_SABBREVMONTHNAME1,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME2,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME3,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME4,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME5,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME6,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME7,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME8,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME9,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME10,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME11,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME12,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME13,"") */
+
+/* LOCVAL(LOCALE_SPOSITIVESIGN, "") */
+/* LOCVAL(LOCALE_SNEGATIVESIGN, "") */
+/* LOCVAL(LOCALE_IPOSSIGNPOSN, "") */
+/* LOCVAL(LOCALE_INEGSIGNPOSN, "") */
+/* LOCVAL(LOCALE_IPOSSYMPRECEDES, "") */
+/* LOCVAL(LOCALE_IPOSSEPBYSPACE, "") */
+/* LOCVAL(LOCALE_INEGSYMPRECEDES, "") */
+/* LOCVAL(LOCALE_INEGSEPBYSPACE, "") */
+
diff --git a/ole/nls/esu.nls b/ole/nls/esu.nls
new file mode 100644
index 0000000..749690b
--- /dev/null
+++ b/ole/nls/esu.nls
@@ -0,0 +1,110 @@
+/*
+ *	OLE2NLS library
+ *      Spanish (Puerto Rico)
+ */
+
+/* LOCVAL(LOCALE_ILANGUAGE,"") */
+/* LOCVAL(LOCALE_SLANGUAGE,"") */
+LOCVAL(LOCALE_SENGLANGUAGE,"Spanish")
+LOCVAL(LOCALE_SABBREVLANGNAME,"esu")
+/* LOCVAL(LOCALE_SNATIVELANGNAME,"") */
+/* LOCVAL(LOCALE_ICOUNTRY,"") */
+/* LOCVAL(LOCALE_SCOUNTRY,"") */
+LOCVAL(LOCALE_SENGCOUNTRY,"Spain")
+/* LOCVAL(LOCALE_SABBREVCTRYNAME,"") */
+/* LOCVAL(LOCALE_SNATIVECTRYNAME,"Espa€a") */
+/* LOCVAL(LOCALE_IDEFAULTLANGUAGE,"") */
+/* LOCVAL(LOCALE_IDEFAULTCOUNTRY,"") */
+/* LOCVAL(LOCALE_IDEFAULTCODEPAGE) */
+/* LOCVAL(LOCALE_IDEFAULTANSICODEPAGE) */
+/* LOCVAL(LOCALE_SLIST,"") */
+/* LOCVAL(LOCALE_IMEASURE,"") */
+/* LOCVAL(LOCALE_SDECIMAL,"") */
+/* LOCVAL(LOCALE_STHOUSAND,"") */
+/* LOCVAL(LOCALE_SGROUPING) */
+/* LOCVAL(LOCALE_IDIGITS,"2") */
+/* LOCVAL(LOCALE_ILZERO,"1") */
+/* LOCVAL(LOCALE_INEGNUMBER) */
+LOCVAL(LOCALE_SNATIVEDIGITS, "0123456789")
+LOCVAL(LOCALE_SCURRENCY,"Pts")
+LOCVAL(LOCALE_SINTLSYMBOL, "ESP")
+/* LOCVAL(LOCALE_SMONDECIMALSEP,",") */
+/* LOCVAL(LOCALE_SMONTHOUSANDSEP,".") */
+/* LOCVAL(LOCALE_SMONGROUPING) */
+/* LOCVAL(LOCALE_ICURRDIGITS,"2") */
+/* LOCVAL(LOCALE_IINTLCURRDIGITS) */
+/* LOCVAL(LOCALE_ICURRENCY,"3") */
+/* LOCVAL(LOCALE_INEGCURR,"8") */
+/* LOCVAL(LOCALE_SDATE,".") */
+/* LOCVAL(LOCALE_STIME,":") */
+/* LOCVAL(LOCALE_SSHORTDATE,"dd/MM-yyyy") */
+/* LOCVAL(LOCALE_SLONGDATE,"ddd, d. MMMM yyyy") */
+/* LOCVAL(LOCALE_STIMEFORMAT) */
+/* LOCVAL(LOCALE_IDATE,"1") */
+/* LOCVAL(LOCALE_ILDATE) */
+/* LOCVAL(LOCALE_ITIME,"1")
+/* LOCVAL(LOCALE_ITIMEMARKPOSN) */
+/* LOCVAL(LOCALE_ICENTURY) */
+/* LOCVAL(LOCALE_ITLZERO,"1")
+/* LOCVAL(LOCALE_IDAYLZERO) */
+/* LOCVAL(LOCALE_IMONLZERO) */
+/* LOCVAL(LOCALE_S1159, "") */
+/* LOCVAL(LOCALE_S2359, "") */
+/* LOCVAL(LOCALE_ICALENDARTYPE) */
+/* LOCVAL(LOCALE_IOPTIONALCALENDAR) */
+/* LOCVAL(LOCALE_IFIRSTDAYOFWEEK) */
+/* LOCVAL(LOCALE_IFIRSTWEEKOFYEAR) */
+
+LOCVAL(LOCALE_SDAYNAME1,"lunes")
+LOCVAL(LOCALE_SDAYNAME2,"martes")
+LOCVAL(LOCALE_SDAYNAME3,"mi?rcoles")
+LOCVAL(LOCALE_SDAYNAME4,"jueves")
+LOCVAL(LOCALE_SDAYNAME5,"viernes")
+LOCVAL(LOCALE_SDAYNAME6,"s?abado")
+LOCVAL(LOCALE_SDAYNAME7,"domingo")
+
+/* LOCVAL(LOCALE_SABBREVDAYNAME1,"lun") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME2,"mar") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME3,"mi?") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME4,"jue") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME5,"vie") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME6,"") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME7,"") */
+
+/* LOCVAL(LOCALE_SMONTHNAME1,"") */
+LOCVAL(LOCALE_SMONTHNAME2,"febrero")
+LOCVAL(LOCALE_SMONTHNAME3,"marzo")
+LOCVAL(LOCALE_SMONTHNAME4,"abril")
+LOCVAL(LOCALE_SMONTHNAME5,"mayo")
+LOCVAL(LOCALE_SMONTHNAME6,"junio")
+LOCVAL(LOCALE_SMONTHNAME7,"julio")
+LOCVAL(LOCALE_SMONTHNAME8,"agosto")
+LOCVAL(LOCALE_SMONTHNAME9,"septiembre")
+LOCVAL(LOCALE_SMONTHNAME10,"octubre")
+LOCVAL(LOCALE_SMONTHNAME11,"noviembre")
+LOCVAL(LOCALE_SMONTHNAME12,"diciembre")
+LOCVAL(LOCALE_SMONTHNAME13,"")
+
+LOCVAL(LOCALE_SABBREVMONTHNAME1,"ene")
+LOCVAL(LOCALE_SABBREVMONTHNAME2,"feb")
+LOCVAL(LOCALE_SABBREVMONTHNAME3,"mar")
+LOCVAL(LOCALE_SABBREVMONTHNAME4,"abr")
+LOCVAL(LOCALE_SABBREVMONTHNAME5,"may")
+LOCVAL(LOCALE_SABBREVMONTHNAME6,"jun")
+LOCVAL(LOCALE_SABBREVMONTHNAME7,"jul")
+LOCVAL(LOCALE_SABBREVMONTHNAME8,"ago")
+LOCVAL(LOCALE_SABBREVMONTHNAME9,"sep")
+LOCVAL(LOCALE_SABBREVMONTHNAME10,"oct")
+LOCVAL(LOCALE_SABBREVMONTHNAME11,"nov")
+LOCVAL(LOCALE_SABBREVMONTHNAME12,"dic")
+LOCVAL(LOCALE_SABBREVMONTHNAME13,"")
+
+/* LOCVAL(LOCALE_SPOSITIVESIGN, "") */
+/* LOCVAL(LOCALE_SNEGATIVESIGN, "") */
+/* LOCVAL(LOCALE_IPOSSIGNPOSN, "") */
+/* LOCVAL(LOCALE_INEGSIGNPOSN, "") */
+/* LOCVAL(LOCALE_IPOSSYMPRECEDES, "") */
+/* LOCVAL(LOCALE_IPOSSEPBYSPACE, "") */
+/* LOCVAL(LOCALE_INEGSYMPRECEDES, "") */
+/* LOCVAL(LOCALE_INEGSEPBYSPACE, "") */
+
diff --git a/ole/nls/euq.nls b/ole/nls/euq.nls
new file mode 100644
index 0000000..989c5e7
--- /dev/null
+++ b/ole/nls/euq.nls
@@ -0,0 +1,110 @@
+/*
+ *	OLE2NLS library
+ *      Basque
+ */
+
+/* LOCVAL(LOCALE_ILANGUAGE,"") */
+/* LOCVAL(LOCALE_SLANGUAGE,"") */
+LOCVAL(LOCALE_SENGLANGUAGE,"Spanish")
+LOCVAL(LOCALE_SABBREVLANGNAME,"euq")
+/* LOCVAL(LOCALE_SNATIVELANGNAME,"") */
+/* LOCVAL(LOCALE_ICOUNTRY,"") */
+/* LOCVAL(LOCALE_SCOUNTRY,"") */
+LOCVAL(LOCALE_SENGCOUNTRY,"Spain")
+/* LOCVAL(LOCALE_SABBREVCTRYNAME,"") */
+/* LOCVAL(LOCALE_SNATIVECTRYNAME,"Espa€a") */
+/* LOCVAL(LOCALE_IDEFAULTLANGUAGE,"") */
+/* LOCVAL(LOCALE_IDEFAULTCOUNTRY,"") */
+/* LOCVAL(LOCALE_IDEFAULTCODEPAGE) */
+/* LOCVAL(LOCALE_IDEFAULTANSICODEPAGE) */
+/* LOCVAL(LOCALE_SLIST,"") */
+/* LOCVAL(LOCALE_IMEASURE,"") */
+/* LOCVAL(LOCALE_SDECIMAL,"") */
+/* LOCVAL(LOCALE_STHOUSAND,"") */
+/* LOCVAL(LOCALE_SGROUPING) */
+/* LOCVAL(LOCALE_IDIGITS,"2") */
+/* LOCVAL(LOCALE_ILZERO,"1") */
+/* LOCVAL(LOCALE_INEGNUMBER) */
+LOCVAL(LOCALE_SNATIVEDIGITS, "0123456789")
+LOCVAL(LOCALE_SCURRENCY,"Pts")
+LOCVAL(LOCALE_SINTLSYMBOL, "ESP")
+/* LOCVAL(LOCALE_SMONDECIMALSEP,",") */
+/* LOCVAL(LOCALE_SMONTHOUSANDSEP,".") */
+/* LOCVAL(LOCALE_SMONGROUPING) */
+/* LOCVAL(LOCALE_ICURRDIGITS,"2") */
+/* LOCVAL(LOCALE_IINTLCURRDIGITS) */
+/* LOCVAL(LOCALE_ICURRENCY,"3") */
+/* LOCVAL(LOCALE_INEGCURR,"8") */
+/* LOCVAL(LOCALE_SDATE,".") */
+/* LOCVAL(LOCALE_STIME,":") */
+/* LOCVAL(LOCALE_SSHORTDATE,"dd/MM-yyyy") */
+/* LOCVAL(LOCALE_SLONGDATE,"ddd, d. MMMM yyyy") */
+/* LOCVAL(LOCALE_STIMEFORMAT) */
+/* LOCVAL(LOCALE_IDATE,"1") */
+/* LOCVAL(LOCALE_ILDATE) */
+/* LOCVAL(LOCALE_ITIME,"1")
+/* LOCVAL(LOCALE_ITIMEMARKPOSN) */
+/* LOCVAL(LOCALE_ICENTURY) */
+/* LOCVAL(LOCALE_ITLZERO,"1")
+/* LOCVAL(LOCALE_IDAYLZERO) */
+/* LOCVAL(LOCALE_IMONLZERO) */
+/* LOCVAL(LOCALE_S1159, "") */
+/* LOCVAL(LOCALE_S2359, "") */
+/* LOCVAL(LOCALE_ICALENDARTYPE) */
+/* LOCVAL(LOCALE_IOPTIONALCALENDAR) */
+/* LOCVAL(LOCALE_IFIRSTDAYOFWEEK) */
+/* LOCVAL(LOCALE_IFIRSTWEEKOFYEAR) */
+
+LOCVAL(LOCALE_SDAYNAME1,"lunes")
+LOCVAL(LOCALE_SDAYNAME2,"martes")
+LOCVAL(LOCALE_SDAYNAME3,"mi?rcoles")
+LOCVAL(LOCALE_SDAYNAME4,"jueves")
+LOCVAL(LOCALE_SDAYNAME5,"viernes")
+LOCVAL(LOCALE_SDAYNAME6,"s?abado")
+LOCVAL(LOCALE_SDAYNAME7,"domingo")
+
+/* LOCVAL(LOCALE_SABBREVDAYNAME1,"lun") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME2,"mar") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME3,"mi?") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME4,"jue") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME5,"vie") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME6,"") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME7,"") */
+
+/* LOCVAL(LOCALE_SMONTHNAME1,"") */
+LOCVAL(LOCALE_SMONTHNAME2,"febrero")
+LOCVAL(LOCALE_SMONTHNAME3,"marzo")
+LOCVAL(LOCALE_SMONTHNAME4,"abril")
+LOCVAL(LOCALE_SMONTHNAME5,"mayo")
+LOCVAL(LOCALE_SMONTHNAME6,"junio")
+LOCVAL(LOCALE_SMONTHNAME7,"julio")
+LOCVAL(LOCALE_SMONTHNAME8,"agosto")
+LOCVAL(LOCALE_SMONTHNAME9,"septiembre")
+LOCVAL(LOCALE_SMONTHNAME10,"octubre")
+LOCVAL(LOCALE_SMONTHNAME11,"noviembre")
+LOCVAL(LOCALE_SMONTHNAME12,"diciembre")
+LOCVAL(LOCALE_SMONTHNAME13,"")
+
+LOCVAL(LOCALE_SABBREVMONTHNAME1,"ene")
+LOCVAL(LOCALE_SABBREVMONTHNAME2,"feb")
+LOCVAL(LOCALE_SABBREVMONTHNAME3,"mar")
+LOCVAL(LOCALE_SABBREVMONTHNAME4,"abr")
+LOCVAL(LOCALE_SABBREVMONTHNAME5,"may")
+LOCVAL(LOCALE_SABBREVMONTHNAME6,"jun")
+LOCVAL(LOCALE_SABBREVMONTHNAME7,"jul")
+LOCVAL(LOCALE_SABBREVMONTHNAME8,"ago")
+LOCVAL(LOCALE_SABBREVMONTHNAME9,"sep")
+LOCVAL(LOCALE_SABBREVMONTHNAME10,"oct")
+LOCVAL(LOCALE_SABBREVMONTHNAME11,"nov")
+LOCVAL(LOCALE_SABBREVMONTHNAME12,"dic")
+LOCVAL(LOCALE_SABBREVMONTHNAME13,"")
+
+/* LOCVAL(LOCALE_SPOSITIVESIGN, "") */
+/* LOCVAL(LOCALE_SNEGATIVESIGN, "") */
+/* LOCVAL(LOCALE_IPOSSIGNPOSN, "") */
+/* LOCVAL(LOCALE_INEGSIGNPOSN, "") */
+/* LOCVAL(LOCALE_IPOSSYMPRECEDES, "") */
+/* LOCVAL(LOCALE_IPOSSEPBYSPACE, "") */
+/* LOCVAL(LOCALE_INEGSYMPRECEDES, "") */
+/* LOCVAL(LOCALE_INEGSEPBYSPACE, "") */
+
diff --git a/ole/nls/fin.nls b/ole/nls/fin.nls
new file mode 100644
index 0000000..a06b5d3
--- /dev/null
+++ b/ole/nls/fin.nls
@@ -0,0 +1,109 @@
+/*
+ *	OLE2NLS library
+ *      Finland
+ */
+ 
+LOCVAL(LOCALE_ILANGUAGE,"11")
+LOCVAL(LOCALE_SLANGUAGE,"Suomi")
+LOCVAL(LOCALE_SENGLANGUAGE,"Finnish")
+LOCVAL(LOCALE_SABBREVLANGNAME,"fin")
+LOCVAL(LOCALE_SNATIVELANGNAME,"suomi")
+LOCVAL(LOCALE_ICOUNTRY,"49")
+LOCVAL(LOCALE_SCOUNTRY,"Suomi")
+LOCVAL(LOCALE_SENGCOUNTRY,"Finland")
+LOCVAL(LOCALE_SABBREVCTRYNAME,"Fin")
+LOCVAL(LOCALE_SNATIVECTRYNAME,"Suomi")
+LOCVAL(LOCALE_IDEFAULTLANGUAGE,"11")
+LOCVAL(LOCALE_IDEFAULTCOUNTRY,"358")
+/* LOCVAL(LOCALE_IDEFAULTCODEPAGE) */
+/* LOCVAL(LOCALE_IDEFAULTANSICODEPAGE) */
+LOCVAL(LOCALE_SLIST,";")
+LOCVAL(LOCALE_IMEASURE,"0")
+LOCVAL(LOCALE_SDECIMAL,",")
+LOCVAL(LOCALE_STHOUSAND,".")
+/* LOCVAL(LOCALE_SGROUPING) */
+LOCVAL(LOCALE_IDIGITS,"2")
+LOCVAL(LOCALE_ILZERO,"1")
+/* LOCVAL(LOCALE_INEGNUMBER) */
+LOCVAL(LOCALE_SNATIVEDIGITS,"0123456789")
+LOCVAL(LOCALE_SCURRENCY,"mk")
+LOCVAL(LOCALE_SINTLSYMBOL,"FIM")
+/* LOCVAL(LOCALE_SMONDECIMALSEP) */
+/* LOCVAL(LOCALE_SMONTHOUSANDSEP) */
+/* LOCVAL(LOCALE_SMONGROUPING) /*
+LOCVAL(LOCALE_ICURRDIGITS,"2")
+/* LOCVAL(LOCALE_IINTLCURRDIGITS) */
+LOCVAL(LOCALE_ICURRENCY,"3")
+LOCVAL(LOCALE_INEGCURR,"8")
+LOCVAL(LOCALE_SDATE,".")
+LOCVAL(LOCALE_STIME,":")
+LOCVAL(LOCALE_SSHORTDATE,"dd.MM.yyyy")
+LOCVAL(LOCALE_SLONGDATE,"ddd, d. MMMM yyyy")
+/* LOCVAL(LOCALE_STIMEFORMAT) */
+LOCVAL(LOCALE_IDATE,"1")
+/* LOCVAL(LOCALE_ILDATE) */
+LOCVAL(LOCALE_ITIME,"1")
+/* LOCVAL(LOCALE_ITIMEMARKPOSN) /*
+/* LOCVAL(LOCALE_ICENTURY) */
+LOCVAL(LOCALE_ITLZERO,"1")
+/* LOCVAL(LOCALE_IDAYLZERO) */
+/* LOCVAL(LOCALE_IMONLZERO) */
+LOCVAL(LOCALE_S1159, "AM")
+LOCVAL(LOCALE_S2359, "PM")
+/* LOCVAL(LOCALE_ICALENDARTYPE) */
+/* LOCVAL(LOCALE_IOPTIONALCALENDAR) */
+/* LOCVAL(LOCALE_IFIRSTDAYOFWEEK) */
+/* LOCVAL(LOCALE_IFIRSTWEEKOFYEAR) */
+
+LOCVAL(LOCALE_SDAYNAME1,"maanantai")
+LOCVAL(LOCALE_SDAYNAME2,"tiistai")
+LOCVAL(LOCALE_SDAYNAME3,"keskiviikko")
+LOCVAL(LOCALE_SDAYNAME4,"torstai")
+LOCVAL(LOCALE_SDAYNAME5,"perjantai")
+LOCVAL(LOCALE_SDAYNAME6,"lauantai")
+LOCVAL(LOCALE_SDAYNAME7,"sunnuntai")
+
+LOCVAL(LOCALE_SABBREVDAYNAME1,"Ma")
+LOCVAL(LOCALE_SABBREVDAYNAME2,"Ti")
+LOCVAL(LOCALE_SABBREVDAYNAME3,"Ke")
+LOCVAL(LOCALE_SABBREVDAYNAME4,"To")
+LOCVAL(LOCALE_SABBREVDAYNAME5,"Pe")
+LOCVAL(LOCALE_SABBREVDAYNAME6,"La")
+LOCVAL(LOCALE_SABBREVDAYNAME7,"Su")
+
+LOCVAL(LOCALE_SMONTHNAME1,"tammikuu")
+LOCVAL(LOCALE_SMONTHNAME2,"helmikuu")
+LOCVAL(LOCALE_SMONTHNAME3,"maaliskuu")
+LOCVAL(LOCALE_SMONTHNAME4,"huhtikuu")
+LOCVAL(LOCALE_SMONTHNAME5,"toukokuu")
+LOCVAL(LOCALE_SMONTHNAME6,"kesäkuu")
+LOCVAL(LOCALE_SMONTHNAME7,"heinäkuu")
+LOCVAL(LOCALE_SMONTHNAME8,"elokuu")
+LOCVAL(LOCALE_SMONTHNAME9,"syyskuu")
+LOCVAL(LOCALE_SMONTHNAME10,"lokakuu")
+LOCVAL(LOCALE_SMONTHNAME11,"marraskuu")
+LOCVAL(LOCALE_SMONTHNAME12,"joulukuu")
+LOCVAL(LOCALE_SMONTHNAME13,"")
+
+LOCVAL(LOCALE_SABBREVMONTHNAME1,"tammi")
+LOCVAL(LOCALE_SABBREVMONTHNAME2,"helmi")
+LOCVAL(LOCALE_SABBREVMONTHNAME3,"maalis")
+LOCVAL(LOCALE_SABBREVMONTHNAME4,"huhti")
+LOCVAL(LOCALE_SABBREVMONTHNAME5,"touko")
+LOCVAL(LOCALE_SABBREVMONTHNAME6,"kesä")
+LOCVAL(LOCALE_SABBREVMONTHNAME7,"heinä")
+LOCVAL(LOCALE_SABBREVMONTHNAME8,"elo")
+LOCVAL(LOCALE_SABBREVMONTHNAME9,"syys")
+LOCVAL(LOCALE_SABBREVMONTHNAME10,"loka")
+LOCVAL(LOCALE_SABBREVMONTHNAME11,"marras")
+LOCVAL(LOCALE_SABBREVMONTHNAME12,"joulu")
+LOCVAL(LOCALE_SABBREVMONTHNAME13,"")
+
+LOCVAL(LOCALE_SPOSITIVESIGN, "")
+LOCVAL(LOCALE_SNEGATIVESIGN, "-")
+/* LOCVAL(LOCALE_IPOSSIGNPOSN) */
+/* LOCVAL(LOCALE_INEGSIGNPOSN) */
+/* LOCVAL(LOCALE_IPOSSYMPRECEDES) */
+/* LOCVAL(LOCALE_IPOSSEPBYSPACE) */
+/* LOCVAL(LOCALE_INEGSYMPRECEDES) */
+/* LOCVAL(LOCALE_INEGSEPBYSPACE) */
diff --git a/ole/nls/fra.nls b/ole/nls/fra.nls
new file mode 100644
index 0000000..db9fee2
--- /dev/null
+++ b/ole/nls/fra.nls
@@ -0,0 +1,110 @@
+/*
+ *	OLE2NLS library
+ *      France
+ */
+
+/* LOCVAL(LOCALE_ILANGUAGE,"") */
+/* LOCVAL(LOCALE_SLANGUAGE,"") */
+LOCVAL(LOCALE_SENGLANGUAGE,"France")
+LOCVAL(LOCALE_SABBREVLANGNAME,"fra")
+/* LOCVAL(LOCALE_SNATIVELANGNAME,"") */
+/* LOCVAL(LOCALE_ICOUNTRY,"") */
+/* LOCVAL(LOCALE_SCOUNTRY,"") */
+/* LOCVAL(LOCALE_SENGCOUNTRY,"") */
+/* LOCVAL(LOCALE_SABBREVCTRYNAME,"") */
+/* LOCVAL(LOCALE_SNATIVECTRYNAME,"") */
+/* LOCVAL(LOCALE_IDEFAULTLANGUAGE,"") */
+/* LOCVAL(LOCALE_IDEFAULTCOUNTRY,"") */
+/* LOCVAL(LOCALE_IDEFAULTCODEPAGE) */
+/* LOCVAL(LOCALE_IDEFAULTANSICODEPAGE) */
+/* LOCVAL(LOCALE_SLIST,"") */
+/* LOCVAL(LOCALE_IMEASURE,"") */
+/* LOCVAL(LOCALE_SDECIMAL,"") */
+/* LOCVAL(LOCALE_STHOUSAND,"") */
+/* LOCVAL(LOCALE_SGROUPING) */
+/* LOCVAL(LOCALE_IDIGITS,"2") */
+/* LOCVAL(LOCALE_ILZERO,"1") */
+/* LOCVAL(LOCALE_INEGNUMBER) */
+/* LOCVAL(LOCALE_SNATIVEDIGITS) */
+/* LOCVAL(LOCALE_SCURRENCY,"") */
+/* LOCVAL(LOCALE_SINTLSYMBOL) */
+/* LOCVAL(LOCALE_SMONDECIMALSEP,",") */
+/* LOCVAL(LOCALE_SMONTHOUSANDSEP,".") */
+/* LOCVAL(LOCALE_SMONGROUPING) */
+/* LOCVAL(LOCALE_ICURRDIGITS,"2") */
+/* LOCVAL(LOCALE_IINTLCURRDIGITS) */
+/* LOCVAL(LOCALE_ICURRENCY,"3") */
+/* LOCVAL(LOCALE_INEGCURR,"8") */
+/* LOCVAL(LOCALE_SDATE,".") */
+/* LOCVAL(LOCALE_STIME,":") */
+/* LOCVAL(LOCALE_SSHORTDATE,"dd/MM-yyyy") */
+/* LOCVAL(LOCALE_SLONGDATE,"ddd, d. MMMM yyyy") */
+/* LOCVAL(LOCALE_STIMEFORMAT) */
+/* LOCVAL(LOCALE_IDATE,"1") */
+/* LOCVAL(LOCALE_ILDATE) */
+/* LOCVAL(LOCALE_ITIME,"1")
+/* LOCVAL(LOCALE_ITIMEMARKPOSN) */
+/* LOCVAL(LOCALE_ICENTURY) */
+/* LOCVAL(LOCALE_ITLZERO,"1")
+/* LOCVAL(LOCALE_IDAYLZERO) */
+/* LOCVAL(LOCALE_IMONLZERO) */
+/* LOCVAL(LOCALE_S1159, "") */
+/* LOCVAL(LOCALE_S2359, "") */
+/* LOCVAL(LOCALE_ICALENDARTYPE) */
+/* LOCVAL(LOCALE_IOPTIONALCALENDAR) */
+/* LOCVAL(LOCALE_IFIRSTDAYOFWEEK) */
+/* LOCVAL(LOCALE_IFIRSTWEEKOFYEAR) */
+
+/* LOCVAL(LOCALE_SDAYNAME1,"") */
+/* LOCVAL(LOCALE_SDAYNAME2,"") */
+/* LOCVAL(LOCALE_SDAYNAME3,"") */
+/* LOCVAL(LOCALE_SDAYNAME4,"") */
+/* LOCVAL(LOCALE_SDAYNAME5,"") */
+/* LOCVAL(LOCALE_SDAYNAME6,"") */
+/* LOCVAL(LOCALE_SDAYNAME7,"") */
+
+/* LOCVAL(LOCALE_SABBREVDAYNAME1,"Ma") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME2,"Ti") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME3,"On") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME4,"To") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME5,"Fr") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME6,"Lø") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME7,"Sø") */
+
+/* LOCVAL(LOCALE_SMONTHNAME1,"") */
+/* LOCVAL(LOCALE_SMONTHNAME2,"") */
+/* LOCVAL(LOCALE_SMONTHNAME3,"") */
+/* LOCVAL(LOCALE_SMONTHNAME4,"") */
+/* LOCVAL(LOCALE_SMONTHNAME5,"") */
+/* LOCVAL(LOCALE_SMONTHNAME6,"") */
+/* LOCVAL(LOCALE_SMONTHNAME7,"") */
+/* LOCVAL(LOCALE_SMONTHNAME8,"") */
+/* LOCVAL(LOCALE_SMONTHNAME9,"") */
+/* LOCVAL(LOCALE_SMONTHNAME10,"") */
+/* LOCVAL(LOCALE_SMONTHNAME11,"") */
+/* LOCVAL(LOCALE_SMONTHNAME12,"") */
+/* LOCVAL(LOCALE_SMONTHNAME13,"") */
+
+/* LOCVAL(LOCALE_SABBREVMONTHNAME1,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME2,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME3,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME4,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME5,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME6,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME7,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME8,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME9,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME10,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME11,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME12,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME13,"") */
+
+/* LOCVAL(LOCALE_SPOSITIVESIGN, "") */
+/* LOCVAL(LOCALE_SNEGATIVESIGN, "") */
+/* LOCVAL(LOCALE_IPOSSIGNPOSN, "") */
+/* LOCVAL(LOCALE_INEGSIGNPOSN, "") */
+/* LOCVAL(LOCALE_IPOSSYMPRECEDES, "") */
+/* LOCVAL(LOCALE_IPOSSEPBYSPACE, "") */
+/* LOCVAL(LOCALE_INEGSYMPRECEDES, "") */
+/* LOCVAL(LOCALE_INEGSEPBYSPACE, "") */
+
diff --git a/ole/nls/frb.nls b/ole/nls/frb.nls
new file mode 100644
index 0000000..af67745
--- /dev/null
+++ b/ole/nls/frb.nls
@@ -0,0 +1,110 @@
+/*
+ *	OLE2NLS library
+ *      Belgium
+ */
+
+/* LOCVAL(LOCALE_ILANGUAGE,"") */
+/* LOCVAL(LOCALE_SLANGUAGE,"") */
+LOCVAL(LOCALE_SENGLANGUAGE,"Belgium")
+LOCVAL(LOCALE_SABBREVLANGNAME,"frb")
+/* LOCVAL(LOCALE_SNATIVELANGNAME,"") */
+/* LOCVAL(LOCALE_ICOUNTRY,"") */
+/* LOCVAL(LOCALE_SCOUNTRY,"") */
+/* LOCVAL(LOCALE_SENGCOUNTRY,"") */
+/* LOCVAL(LOCALE_SABBREVCTRYNAME,"") */
+/* LOCVAL(LOCALE_SNATIVECTRYNAME,"") */
+/* LOCVAL(LOCALE_IDEFAULTLANGUAGE,"") */
+/* LOCVAL(LOCALE_IDEFAULTCOUNTRY,"") */
+/* LOCVAL(LOCALE_IDEFAULTCODEPAGE) */
+/* LOCVAL(LOCALE_IDEFAULTANSICODEPAGE) */
+/* LOCVAL(LOCALE_SLIST,"") */
+/* LOCVAL(LOCALE_IMEASURE,"") */
+/* LOCVAL(LOCALE_SDECIMAL,"") */
+/* LOCVAL(LOCALE_STHOUSAND,"") */
+/* LOCVAL(LOCALE_SGROUPING) */
+/* LOCVAL(LOCALE_IDIGITS,"2") */
+/* LOCVAL(LOCALE_ILZERO,"1") */
+/* LOCVAL(LOCALE_INEGNUMBER) */
+/* LOCVAL(LOCALE_SNATIVEDIGITS) */
+/* LOCVAL(LOCALE_SCURRENCY,"") */
+/* LOCVAL(LOCALE_SINTLSYMBOL) */
+/* LOCVAL(LOCALE_SMONDECIMALSEP,",") */
+/* LOCVAL(LOCALE_SMONTHOUSANDSEP,".") */
+/* LOCVAL(LOCALE_SMONGROUPING) */
+/* LOCVAL(LOCALE_ICURRDIGITS,"2") */
+/* LOCVAL(LOCALE_IINTLCURRDIGITS) */
+/* LOCVAL(LOCALE_ICURRENCY,"3") */
+/* LOCVAL(LOCALE_INEGCURR,"8") */
+/* LOCVAL(LOCALE_SDATE,".") */
+/* LOCVAL(LOCALE_STIME,":") */
+/* LOCVAL(LOCALE_SSHORTDATE,"dd/MM-yyyy") */
+/* LOCVAL(LOCALE_SLONGDATE,"ddd, d. MMMM yyyy") */
+/* LOCVAL(LOCALE_STIMEFORMAT) */
+/* LOCVAL(LOCALE_IDATE,"1") */
+/* LOCVAL(LOCALE_ILDATE) */
+/* LOCVAL(LOCALE_ITIME,"1")
+/* LOCVAL(LOCALE_ITIMEMARKPOSN) */
+/* LOCVAL(LOCALE_ICENTURY) */
+/* LOCVAL(LOCALE_ITLZERO,"1")
+/* LOCVAL(LOCALE_IDAYLZERO) */
+/* LOCVAL(LOCALE_IMONLZERO) */
+/* LOCVAL(LOCALE_S1159, "") */
+/* LOCVAL(LOCALE_S2359, "") */
+/* LOCVAL(LOCALE_ICALENDARTYPE) */
+/* LOCVAL(LOCALE_IOPTIONALCALENDAR) */
+/* LOCVAL(LOCALE_IFIRSTDAYOFWEEK) */
+/* LOCVAL(LOCALE_IFIRSTWEEKOFYEAR) */
+
+/* LOCVAL(LOCALE_SDAYNAME1,"") */
+/* LOCVAL(LOCALE_SDAYNAME2,"") */
+/* LOCVAL(LOCALE_SDAYNAME3,"") */
+/* LOCVAL(LOCALE_SDAYNAME4,"") */
+/* LOCVAL(LOCALE_SDAYNAME5,"") */
+/* LOCVAL(LOCALE_SDAYNAME6,"") */
+/* LOCVAL(LOCALE_SDAYNAME7,"") */
+
+/* LOCVAL(LOCALE_SABBREVDAYNAME1,"Ma") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME2,"Ti") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME3,"On") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME4,"To") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME5,"Fr") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME6,"Lø") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME7,"Sø") */
+
+/* LOCVAL(LOCALE_SMONTHNAME1,"") */
+/* LOCVAL(LOCALE_SMONTHNAME2,"") */
+/* LOCVAL(LOCALE_SMONTHNAME3,"") */
+/* LOCVAL(LOCALE_SMONTHNAME4,"") */
+/* LOCVAL(LOCALE_SMONTHNAME5,"") */
+/* LOCVAL(LOCALE_SMONTHNAME6,"") */
+/* LOCVAL(LOCALE_SMONTHNAME7,"") */
+/* LOCVAL(LOCALE_SMONTHNAME8,"") */
+/* LOCVAL(LOCALE_SMONTHNAME9,"") */
+/* LOCVAL(LOCALE_SMONTHNAME10,"") */
+/* LOCVAL(LOCALE_SMONTHNAME11,"") */
+/* LOCVAL(LOCALE_SMONTHNAME12,"") */
+/* LOCVAL(LOCALE_SMONTHNAME13,"") */
+
+/* LOCVAL(LOCALE_SABBREVMONTHNAME1,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME2,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME3,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME4,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME5,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME6,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME7,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME8,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME9,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME10,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME11,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME12,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME13,"") */
+
+/* LOCVAL(LOCALE_SPOSITIVESIGN, "") */
+/* LOCVAL(LOCALE_SNEGATIVESIGN, "") */
+/* LOCVAL(LOCALE_IPOSSIGNPOSN, "") */
+/* LOCVAL(LOCALE_INEGSIGNPOSN, "") */
+/* LOCVAL(LOCALE_IPOSSYMPRECEDES, "") */
+/* LOCVAL(LOCALE_IPOSSEPBYSPACE, "") */
+/* LOCVAL(LOCALE_INEGSYMPRECEDES, "") */
+/* LOCVAL(LOCALE_INEGSEPBYSPACE, "") */
+
diff --git a/ole/nls/frs.nls b/ole/nls/frs.nls
new file mode 100644
index 0000000..62c4c8d
--- /dev/null
+++ b/ole/nls/frs.nls
@@ -0,0 +1,110 @@
+/*
+ *	OLE2NLS library
+ *      Switzerland (French)
+ */
+
+/* LOCVAL(LOCALE_ILANGUAGE,"") */
+/* LOCVAL(LOCALE_SLANGUAGE,"") */
+LOCVAL(LOCALE_SENGLANGUAGE,"Switzerland")
+LOCVAL(LOCALE_SABBREVLANGNAME,"frs")
+/* LOCVAL(LOCALE_SNATIVELANGNAME,"") */
+/* LOCVAL(LOCALE_ICOUNTRY,"") */
+/* LOCVAL(LOCALE_SCOUNTRY,"") */
+/* LOCVAL(LOCALE_SENGCOUNTRY,"") */
+/* LOCVAL(LOCALE_SABBREVCTRYNAME,"") */
+/* LOCVAL(LOCALE_SNATIVECTRYNAME,"") */
+/* LOCVAL(LOCALE_IDEFAULTLANGUAGE,"") */
+/* LOCVAL(LOCALE_IDEFAULTCOUNTRY,"") */
+/* LOCVAL(LOCALE_IDEFAULTCODEPAGE) */
+/* LOCVAL(LOCALE_IDEFAULTANSICODEPAGE) */
+/* LOCVAL(LOCALE_SLIST,"") */
+/* LOCVAL(LOCALE_IMEASURE,"") */
+/* LOCVAL(LOCALE_SDECIMAL,"") */
+/* LOCVAL(LOCALE_STHOUSAND,"") */
+/* LOCVAL(LOCALE_SGROUPING) */
+/* LOCVAL(LOCALE_IDIGITS,"2") */
+/* LOCVAL(LOCALE_ILZERO,"1") */
+/* LOCVAL(LOCALE_INEGNUMBER) */
+/* LOCVAL(LOCALE_SNATIVEDIGITS) */
+/* LOCVAL(LOCALE_SCURRENCY,"") */
+/* LOCVAL(LOCALE_SINTLSYMBOL) */
+/* LOCVAL(LOCALE_SMONDECIMALSEP,",") */
+/* LOCVAL(LOCALE_SMONTHOUSANDSEP,".") */
+/* LOCVAL(LOCALE_SMONGROUPING) */
+/* LOCVAL(LOCALE_ICURRDIGITS,"2") */
+/* LOCVAL(LOCALE_IINTLCURRDIGITS) */
+/* LOCVAL(LOCALE_ICURRENCY,"3") */
+/* LOCVAL(LOCALE_INEGCURR,"8") */
+/* LOCVAL(LOCALE_SDATE,".") */
+/* LOCVAL(LOCALE_STIME,":") */
+/* LOCVAL(LOCALE_SSHORTDATE,"dd/MM-yyyy") */
+/* LOCVAL(LOCALE_SLONGDATE,"ddd, d. MMMM yyyy") */
+/* LOCVAL(LOCALE_STIMEFORMAT) */
+/* LOCVAL(LOCALE_IDATE,"1") */
+/* LOCVAL(LOCALE_ILDATE) */
+/* LOCVAL(LOCALE_ITIME,"1")
+/* LOCVAL(LOCALE_ITIMEMARKPOSN) */
+/* LOCVAL(LOCALE_ICENTURY) */
+/* LOCVAL(LOCALE_ITLZERO,"1")
+/* LOCVAL(LOCALE_IDAYLZERO) */
+/* LOCVAL(LOCALE_IMONLZERO) */
+/* LOCVAL(LOCALE_S1159, "") */
+/* LOCVAL(LOCALE_S2359, "") */
+/* LOCVAL(LOCALE_ICALENDARTYPE) */
+/* LOCVAL(LOCALE_IOPTIONALCALENDAR) */
+/* LOCVAL(LOCALE_IFIRSTDAYOFWEEK) */
+/* LOCVAL(LOCALE_IFIRSTWEEKOFYEAR) */
+
+/* LOCVAL(LOCALE_SDAYNAME1,"") */
+/* LOCVAL(LOCALE_SDAYNAME2,"") */
+/* LOCVAL(LOCALE_SDAYNAME3,"") */
+/* LOCVAL(LOCALE_SDAYNAME4,"") */
+/* LOCVAL(LOCALE_SDAYNAME5,"") */
+/* LOCVAL(LOCALE_SDAYNAME6,"") */
+/* LOCVAL(LOCALE_SDAYNAME7,"") */
+
+/* LOCVAL(LOCALE_SABBREVDAYNAME1,"Ma") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME2,"Ti") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME3,"On") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME4,"To") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME5,"Fr") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME6,"Lø") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME7,"Sø") */
+
+/* LOCVAL(LOCALE_SMONTHNAME1,"") */
+/* LOCVAL(LOCALE_SMONTHNAME2,"") */
+/* LOCVAL(LOCALE_SMONTHNAME3,"") */
+/* LOCVAL(LOCALE_SMONTHNAME4,"") */
+/* LOCVAL(LOCALE_SMONTHNAME5,"") */
+/* LOCVAL(LOCALE_SMONTHNAME6,"") */
+/* LOCVAL(LOCALE_SMONTHNAME7,"") */
+/* LOCVAL(LOCALE_SMONTHNAME8,"") */
+/* LOCVAL(LOCALE_SMONTHNAME9,"") */
+/* LOCVAL(LOCALE_SMONTHNAME10,"") */
+/* LOCVAL(LOCALE_SMONTHNAME11,"") */
+/* LOCVAL(LOCALE_SMONTHNAME12,"") */
+/* LOCVAL(LOCALE_SMONTHNAME13,"") */
+
+/* LOCVAL(LOCALE_SABBREVMONTHNAME1,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME2,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME3,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME4,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME5,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME6,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME7,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME8,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME9,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME10,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME11,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME12,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME13,"") */
+
+/* LOCVAL(LOCALE_SPOSITIVESIGN, "") */
+/* LOCVAL(LOCALE_SNEGATIVESIGN, "") */
+/* LOCVAL(LOCALE_IPOSSIGNPOSN, "") */
+/* LOCVAL(LOCALE_INEGSIGNPOSN, "") */
+/* LOCVAL(LOCALE_IPOSSYMPRECEDES, "") */
+/* LOCVAL(LOCALE_IPOSSEPBYSPACE, "") */
+/* LOCVAL(LOCALE_INEGSYMPRECEDES, "") */
+/* LOCVAL(LOCALE_INEGSEPBYSPACE, "") */
+
diff --git a/ole/nls/grc.nls b/ole/nls/grc.nls
new file mode 100644
index 0000000..0e6e423
--- /dev/null
+++ b/ole/nls/grc.nls
@@ -0,0 +1,110 @@
+/*
+ *	OLE2NLS library
+ *      Greek
+ */
+
+/* LOCVAL(LOCALE_ILANGUAGE,"") */
+/* LOCVAL(LOCALE_SLANGUAGE,"") */
+LOCVAL(LOCALE_SENGLANGUAGE,"Greek")
+LOCVAL(LOCALE_SABBREVLANGNAME,"grc")
+/* LOCVAL(LOCALE_SNATIVELANGNAME,"") */
+/* LOCVAL(LOCALE_ICOUNTRY,"") */
+/* LOCVAL(LOCALE_SCOUNTRY,"") */
+/* LOCVAL(LOCALE_SENGCOUNTRY,"") */
+/* LOCVAL(LOCALE_SABBREVCTRYNAME,"") */
+/* LOCVAL(LOCALE_SNATIVECTRYNAME,"") */
+/* LOCVAL(LOCALE_IDEFAULTLANGUAGE,"") */
+/* LOCVAL(LOCALE_IDEFAULTCOUNTRY,"") */
+/* LOCVAL(LOCALE_IDEFAULTCODEPAGE) */
+/* LOCVAL(LOCALE_IDEFAULTANSICODEPAGE) */
+/* LOCVAL(LOCALE_SLIST,"") */
+/* LOCVAL(LOCALE_IMEASURE,"") */
+/* LOCVAL(LOCALE_SDECIMAL,"") */
+/* LOCVAL(LOCALE_STHOUSAND,"") */
+/* LOCVAL(LOCALE_SGROUPING) */
+/* LOCVAL(LOCALE_IDIGITS,"2") */
+/* LOCVAL(LOCALE_ILZERO,"1") */
+/* LOCVAL(LOCALE_INEGNUMBER) */
+/* LOCVAL(LOCALE_SNATIVEDIGITS) */
+/* LOCVAL(LOCALE_SCURRENCY,"") */
+/* LOCVAL(LOCALE_SINTLSYMBOL) */
+/* LOCVAL(LOCALE_SMONDECIMALSEP,",") */
+/* LOCVAL(LOCALE_SMONTHOUSANDSEP,".") */
+/* LOCVAL(LOCALE_SMONGROUPING) */
+/* LOCVAL(LOCALE_ICURRDIGITS,"2") */
+/* LOCVAL(LOCALE_IINTLCURRDIGITS) */
+/* LOCVAL(LOCALE_ICURRENCY,"3") */
+/* LOCVAL(LOCALE_INEGCURR,"8") */
+/* LOCVAL(LOCALE_SDATE,".") */
+/* LOCVAL(LOCALE_STIME,":") */
+/* LOCVAL(LOCALE_SSHORTDATE,"dd/MM-yyyy") */
+/* LOCVAL(LOCALE_SLONGDATE,"ddd, d. MMMM yyyy") */
+/* LOCVAL(LOCALE_STIMEFORMAT) */
+/* LOCVAL(LOCALE_IDATE,"1") */
+/* LOCVAL(LOCALE_ILDATE) */
+/* LOCVAL(LOCALE_ITIME,"1")
+/* LOCVAL(LOCALE_ITIMEMARKPOSN) */
+/* LOCVAL(LOCALE_ICENTURY) */
+/* LOCVAL(LOCALE_ITLZERO,"1")
+/* LOCVAL(LOCALE_IDAYLZERO) */
+/* LOCVAL(LOCALE_IMONLZERO) */
+/* LOCVAL(LOCALE_S1159, "") */
+/* LOCVAL(LOCALE_S2359, "") */
+/* LOCVAL(LOCALE_ICALENDARTYPE) */
+/* LOCVAL(LOCALE_IOPTIONALCALENDAR) */
+/* LOCVAL(LOCALE_IFIRSTDAYOFWEEK) */
+/* LOCVAL(LOCALE_IFIRSTWEEKOFYEAR) */
+
+/* LOCVAL(LOCALE_SDAYNAME1,"") */
+/* LOCVAL(LOCALE_SDAYNAME2,"") */
+/* LOCVAL(LOCALE_SDAYNAME3,"") */
+/* LOCVAL(LOCALE_SDAYNAME4,"") */
+/* LOCVAL(LOCALE_SDAYNAME5,"") */
+/* LOCVAL(LOCALE_SDAYNAME6,"") */
+/* LOCVAL(LOCALE_SDAYNAME7,"") */
+
+/* LOCVAL(LOCALE_SABBREVDAYNAME1,"Ma") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME2,"Ti") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME3,"On") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME4,"To") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME5,"Fr") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME6,"Lø") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME7,"Sø") */
+
+/* LOCVAL(LOCALE_SMONTHNAME1,"") */
+/* LOCVAL(LOCALE_SMONTHNAME2,"") */
+/* LOCVAL(LOCALE_SMONTHNAME3,"") */
+/* LOCVAL(LOCALE_SMONTHNAME4,"") */
+/* LOCVAL(LOCALE_SMONTHNAME5,"") */
+/* LOCVAL(LOCALE_SMONTHNAME6,"") */
+/* LOCVAL(LOCALE_SMONTHNAME7,"") */
+/* LOCVAL(LOCALE_SMONTHNAME8,"") */
+/* LOCVAL(LOCALE_SMONTHNAME9,"") */
+/* LOCVAL(LOCALE_SMONTHNAME10,"") */
+/* LOCVAL(LOCALE_SMONTHNAME11,"") */
+/* LOCVAL(LOCALE_SMONTHNAME12,"") */
+/* LOCVAL(LOCALE_SMONTHNAME13,"") */
+
+/* LOCVAL(LOCALE_SABBREVMONTHNAME1,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME2,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME3,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME4,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME5,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME6,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME7,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME8,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME9,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME10,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME11,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME12,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME13,"") */
+
+/* LOCVAL(LOCALE_SPOSITIVESIGN, "") */
+/* LOCVAL(LOCALE_SNEGATIVESIGN, "") */
+/* LOCVAL(LOCALE_IPOSSIGNPOSN, "") */
+/* LOCVAL(LOCALE_INEGSIGNPOSN, "") */
+/* LOCVAL(LOCALE_IPOSSYMPRECEDES, "") */
+/* LOCVAL(LOCALE_IPOSSEPBYSPACE, "") */
+/* LOCVAL(LOCALE_INEGSYMPRECEDES, "") */
+/* LOCVAL(LOCALE_INEGSEPBYSPACE, "") */
+
diff --git a/ole/nls/hkg.nls b/ole/nls/hkg.nls
new file mode 100644
index 0000000..47fbfd7
--- /dev/null
+++ b/ole/nls/hkg.nls
@@ -0,0 +1,110 @@
+/*
+ *	OLE2NLS library
+ *      Chinese (Hong Kong)
+ */
+
+/* LOCVAL(LOCALE_ILANGUAGE,"") */
+/* LOCVAL(LOCALE_SLANGUAGE,"") */
+/* LOCVAL(LOCALE_SENGLANGUAGE,"Chinese (Hong Kong)") */
+LOCVAL(LOCALE_SABBREVLANGNAME,"hkg")
+/* LOCVAL(LOCALE_SNATIVELANGNAME,"") */
+/* LOCVAL(LOCALE_ICOUNTRY,"") */
+/* LOCVAL(LOCALE_SCOUNTRY,"") */
+/* LOCVAL(LOCALE_SENGCOUNTRY,"") */
+/* LOCVAL(LOCALE_SABBREVCTRYNAME,"") */
+/* LOCVAL(LOCALE_SNATIVECTRYNAME,"") */
+/* LOCVAL(LOCALE_IDEFAULTLANGUAGE,"") */
+/* LOCVAL(LOCALE_IDEFAULTCOUNTRY,"") */
+/* LOCVAL(LOCALE_IDEFAULTCODEPAGE) */
+/* LOCVAL(LOCALE_IDEFAULTANSICODEPAGE) */
+/* LOCVAL(LOCALE_SLIST,"") */
+/* LOCVAL(LOCALE_IMEASURE,"") */
+/* LOCVAL(LOCALE_SDECIMAL,"") */
+/* LOCVAL(LOCALE_STHOUSAND,"") */
+/* LOCVAL(LOCALE_SGROUPING) */
+/* LOCVAL(LOCALE_IDIGITS,"2") */
+/* LOCVAL(LOCALE_ILZERO,"1") */
+/* LOCVAL(LOCALE_INEGNUMBER) */
+/* LOCVAL(LOCALE_SNATIVEDIGITS) */
+/* LOCVAL(LOCALE_SCURRENCY,"") */
+/* LOCVAL(LOCALE_SINTLSYMBOL) */
+/* LOCVAL(LOCALE_SMONDECIMALSEP,",") */
+/* LOCVAL(LOCALE_SMONTHOUSANDSEP,".") */
+/* LOCVAL(LOCALE_SMONGROUPING) */
+/* LOCVAL(LOCALE_ICURRDIGITS,"2") */
+/* LOCVAL(LOCALE_IINTLCURRDIGITS) */
+/* LOCVAL(LOCALE_ICURRENCY,"3") */
+/* LOCVAL(LOCALE_INEGCURR,"8") */
+/* LOCVAL(LOCALE_SDATE,".") */
+/* LOCVAL(LOCALE_STIME,":") */
+/* LOCVAL(LOCALE_SSHORTDATE,"dd/MM-yyyy") */
+/* LOCVAL(LOCALE_SLONGDATE,"ddd, d. MMMM yyyy") */
+/* LOCVAL(LOCALE_STIMEFORMAT) */
+/* LOCVAL(LOCALE_IDATE,"1") */
+/* LOCVAL(LOCALE_ILDATE) */
+/* LOCVAL(LOCALE_ITIME,"1")
+/* LOCVAL(LOCALE_ITIMEMARKPOSN) */
+/* LOCVAL(LOCALE_ICENTURY) */
+/* LOCVAL(LOCALE_ITLZERO,"1")
+/* LOCVAL(LOCALE_IDAYLZERO) */
+/* LOCVAL(LOCALE_IMONLZERO) */
+/* LOCVAL(LOCALE_S1159, "") */
+/* LOCVAL(LOCALE_S2359, "") */
+/* LOCVAL(LOCALE_ICALENDARTYPE) */
+/* LOCVAL(LOCALE_IOPTIONALCALENDAR) */
+/* LOCVAL(LOCALE_IFIRSTDAYOFWEEK) */
+/* LOCVAL(LOCALE_IFIRSTWEEKOFYEAR) */
+
+/* LOCVAL(LOCALE_SDAYNAME1,"") */
+/* LOCVAL(LOCALE_SDAYNAME2,"") */
+/* LOCVAL(LOCALE_SDAYNAME3,"") */
+/* LOCVAL(LOCALE_SDAYNAME4,"") */
+/* LOCVAL(LOCALE_SDAYNAME5,"") */
+/* LOCVAL(LOCALE_SDAYNAME6,"") */
+/* LOCVAL(LOCALE_SDAYNAME7,"") */
+
+/* LOCVAL(LOCALE_SABBREVDAYNAME1,"Ma") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME2,"Ti") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME3,"On") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME4,"To") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME5,"Fr") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME6,"Lø") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME7,"Sø") */
+
+/* LOCVAL(LOCALE_SMONTHNAME1,"") */
+/* LOCVAL(LOCALE_SMONTHNAME2,"") */
+/* LOCVAL(LOCALE_SMONTHNAME3,"") */
+/* LOCVAL(LOCALE_SMONTHNAME4,"") */
+/* LOCVAL(LOCALE_SMONTHNAME5,"") */
+/* LOCVAL(LOCALE_SMONTHNAME6,"") */
+/* LOCVAL(LOCALE_SMONTHNAME7,"") */
+/* LOCVAL(LOCALE_SMONTHNAME8,"") */
+/* LOCVAL(LOCALE_SMONTHNAME9,"") */
+/* LOCVAL(LOCALE_SMONTHNAME10,"") */
+/* LOCVAL(LOCALE_SMONTHNAME11,"") */
+/* LOCVAL(LOCALE_SMONTHNAME12,"") */
+/* LOCVAL(LOCALE_SMONTHNAME13,"") */
+
+/* LOCVAL(LOCALE_SABBREVMONTHNAME1,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME2,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME3,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME4,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME5,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME6,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME7,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME8,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME9,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME10,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME11,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME12,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME13,"") */
+
+/* LOCVAL(LOCALE_SPOSITIVESIGN, "") */
+/* LOCVAL(LOCALE_SNEGATIVESIGN, "") */
+/* LOCVAL(LOCALE_IPOSSIGNPOSN, "") */
+/* LOCVAL(LOCALE_INEGSIGNPOSN, "") */
+/* LOCVAL(LOCALE_IPOSSYMPRECEDES, "") */
+/* LOCVAL(LOCALE_IPOSSEPBYSPACE, "") */
+/* LOCVAL(LOCALE_INEGSYMPRECEDES, "") */
+/* LOCVAL(LOCALE_INEGSEPBYSPACE, "") */
+
diff --git a/ole/nls/hrv.nls b/ole/nls/hrv.nls
new file mode 100644
index 0000000..b03d261
--- /dev/null
+++ b/ole/nls/hrv.nls
@@ -0,0 +1,110 @@
+/*
+ *	OLE2NLS library
+ *      Croatia
+ */
+
+/* LOCVAL(LOCALE_ILANGUAGE,"") */
+/* LOCVAL(LOCALE_SLANGUAGE,"") */
+/* LOCVAL(LOCALE_SENGLANGUAGE,"") */
+LOCVAL(LOCALE_SABBREVLANGNAME,"hrv")
+/* LOCVAL(LOCALE_SNATIVELANGNAME,"") */
+/* LOCVAL(LOCALE_ICOUNTRY,"") */
+/* LOCVAL(LOCALE_SCOUNTRY,"") */
+/* LOCVAL(LOCALE_SENGCOUNTRY,"") */
+/* LOCVAL(LOCALE_SABBREVCTRYNAME,"") */
+/* LOCVAL(LOCALE_SNATIVECTRYNAME,"") */
+/* LOCVAL(LOCALE_IDEFAULTLANGUAGE,"") */
+/* LOCVAL(LOCALE_IDEFAULTCOUNTRY,"") */
+/* LOCVAL(LOCALE_IDEFAULTCODEPAGE) */
+/* LOCVAL(LOCALE_IDEFAULTANSICODEPAGE) */
+/* LOCVAL(LOCALE_SLIST,"") */
+/* LOCVAL(LOCALE_IMEASURE,"") */
+/* LOCVAL(LOCALE_SDECIMAL,"") */
+/* LOCVAL(LOCALE_STHOUSAND,"") */
+/* LOCVAL(LOCALE_SGROUPING) */
+/* LOCVAL(LOCALE_IDIGITS,"2") */
+/* LOCVAL(LOCALE_ILZERO,"1") */
+/* LOCVAL(LOCALE_INEGNUMBER) */
+/* LOCVAL(LOCALE_SNATIVEDIGITS) */
+/* LOCVAL(LOCALE_SCURRENCY,"") */
+/* LOCVAL(LOCALE_SINTLSYMBOL) */
+/* LOCVAL(LOCALE_SMONDECIMALSEP,",") */
+/* LOCVAL(LOCALE_SMONTHOUSANDSEP,".") */
+/* LOCVAL(LOCALE_SMONGROUPING) */
+/* LOCVAL(LOCALE_ICURRDIGITS,"2") */
+/* LOCVAL(LOCALE_IINTLCURRDIGITS) */
+/* LOCVAL(LOCALE_ICURRENCY,"3") */
+/* LOCVAL(LOCALE_INEGCURR,"8") */
+/* LOCVAL(LOCALE_SDATE,".") */
+/* LOCVAL(LOCALE_STIME,":") */
+/* LOCVAL(LOCALE_SSHORTDATE,"dd/MM-yyyy") */
+/* LOCVAL(LOCALE_SLONGDATE,"ddd, d. MMMM yyyy") */
+/* LOCVAL(LOCALE_STIMEFORMAT) */
+/* LOCVAL(LOCALE_IDATE,"1") */
+/* LOCVAL(LOCALE_ILDATE) */
+/* LOCVAL(LOCALE_ITIME,"1")
+/* LOCVAL(LOCALE_ITIMEMARKPOSN) */
+/* LOCVAL(LOCALE_ICENTURY) */
+/* LOCVAL(LOCALE_ITLZERO,"1")
+/* LOCVAL(LOCALE_IDAYLZERO) */
+/* LOCVAL(LOCALE_IMONLZERO) */
+/* LOCVAL(LOCALE_S1159, "") */
+/* LOCVAL(LOCALE_S2359, "") */
+/* LOCVAL(LOCALE_ICALENDARTYPE) */
+/* LOCVAL(LOCALE_IOPTIONALCALENDAR) */
+/* LOCVAL(LOCALE_IFIRSTDAYOFWEEK) */
+/* LOCVAL(LOCALE_IFIRSTWEEKOFYEAR) */
+
+/* LOCVAL(LOCALE_SDAYNAME1,"") */
+/* LOCVAL(LOCALE_SDAYNAME2,"") */
+/* LOCVAL(LOCALE_SDAYNAME3,"") */
+/* LOCVAL(LOCALE_SDAYNAME4,"") */
+/* LOCVAL(LOCALE_SDAYNAME5,"") */
+/* LOCVAL(LOCALE_SDAYNAME6,"") */
+/* LOCVAL(LOCALE_SDAYNAME7,"") */
+
+/* LOCVAL(LOCALE_SABBREVDAYNAME1,"Ma") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME2,"Ti") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME3,"On") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME4,"To") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME5,"Fr") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME6,"Lø") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME7,"Sø") */
+
+/* LOCVAL(LOCALE_SMONTHNAME1,"") */
+/* LOCVAL(LOCALE_SMONTHNAME2,"") */
+/* LOCVAL(LOCALE_SMONTHNAME3,"") */
+/* LOCVAL(LOCALE_SMONTHNAME4,"") */
+/* LOCVAL(LOCALE_SMONTHNAME5,"") */
+/* LOCVAL(LOCALE_SMONTHNAME6,"") */
+/* LOCVAL(LOCALE_SMONTHNAME7,"") */
+/* LOCVAL(LOCALE_SMONTHNAME8,"") */
+/* LOCVAL(LOCALE_SMONTHNAME9,"") */
+/* LOCVAL(LOCALE_SMONTHNAME10,"") */
+/* LOCVAL(LOCALE_SMONTHNAME11,"") */
+/* LOCVAL(LOCALE_SMONTHNAME12,"") */
+/* LOCVAL(LOCALE_SMONTHNAME13,"") */
+
+/* LOCVAL(LOCALE_SABBREVMONTHNAME1,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME2,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME3,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME4,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME5,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME6,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME7,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME8,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME9,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME10,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME11,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME12,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME13,"") */
+
+/* LOCVAL(LOCALE_SPOSITIVESIGN, "") */
+/* LOCVAL(LOCALE_SNEGATIVESIGN, "") */
+/* LOCVAL(LOCALE_IPOSSIGNPOSN, "") */
+/* LOCVAL(LOCALE_INEGSIGNPOSN, "") */
+/* LOCVAL(LOCALE_IPOSSYMPRECEDES, "") */
+/* LOCVAL(LOCALE_IPOSSEPBYSPACE, "") */
+/* LOCVAL(LOCALE_INEGSYMPRECEDES, "") */
+/* LOCVAL(LOCALE_INEGSEPBYSPACE, "") */
+
diff --git a/ole/nls/hun.nls b/ole/nls/hun.nls
new file mode 100644
index 0000000..466e789
--- /dev/null
+++ b/ole/nls/hun.nls
@@ -0,0 +1,110 @@
+/*
+ *	OLE2NLS library
+ *      Hungarian
+ */
+
+LOCVAL(LOCALE_ILANGUAGE,"9")
+LOCVAL(LOCALE_SLANGUAGE,"Magyar")
+LOCVAL(LOCALE_SENGLANGUAGE,"Hungarian")
+LOCVAL(LOCALE_SABBREVLANGNAME,"hun")
+LOCVAL(LOCALE_SNATIVELANGNAME,"Magyar")
+LOCVAL(LOCALE_ICOUNTRY,"36")
+LOCVAL(LOCALE_SCOUNTRY,"Magyarország")
+LOCVAL(LOCALE_SENGCOUNTRY,"Hungary")
+LOCVAL(LOCALE_SABBREVCTRYNAME,"Hu")
+LOCVAL(LOCALE_SNATIVECTRYNAME,"Magyarország")
+LOCVAL(LOCALE_IDEFAULTLANGUAGE,"9")
+LOCVAL(LOCALE_IDEFAULTCOUNTRY,"36")
+LOCVAL(LOCALE_IDEFAULTCODEPAGE,"852")
+LOCVAL(LOCALE_IDEFAULTANSICODEPAGE,"852")
+LOCVAL(LOCALE_SLIST,";")
+LOCVAL(LOCALE_IMEASURE,"0")
+LOCVAL(LOCALE_SDECIMAL,".")
+LOCVAL(LOCALE_STHOUSAND,",")
+/* LOCVAL(LOCALE_SGROUPING) */
+LOCVAL(LOCALE_IDIGITS,"2")
+LOCVAL(LOCALE_ILZERO,"1")
+/* LOCVAL(LOCALE_INEGNUMBER) */
+/* LOCVAL(LOCALE_SNATIVEDIGITS) */
+LOCVAL(LOCALE_SCURRENCY,"Ft")
+LOCVAL(LOCALE_SINTLSYMBOL,"HUF")
+/* LOCVAL(LOCALE_SMONDECIMALSEP) */
+/* LOCVAL(LOCALE_SMONTHOUSANDSEP) */
+/* LOCVAL(LOCALE_SMONGROUPING) */
+LOCVAL(LOCALE_ICURRDIGITS,"0")
+/* LOCVAL(LOCALE_IINTLCURRDIGITS) */
+LOCVAL(LOCALE_ICURRENCY,"3")
+LOCVAL(LOCALE_INEGCURR,"8")
+LOCVAL(LOCALE_SDATE,"/")
+LOCVAL(LOCALE_STIME,":")
+LOCVAL(LOCALE_SSHORTDATE,"yyyy.MM.dd")
+LOCVAL(LOCALE_SLONGDATE,"ddd, yyyy. MMMM d")
+/* LOCVAL(LOCALE_STIMEFORMAT) */
+LOCVAL(LOCALE_IDATE,"1")
+/* LOCVAL(LOCALE_ILDATE) */
+LOCVAL(LOCALE_ITIME,"1")
+/* LOCVAL(LOCALE_ITIMEMARKPOSN) */
+/* LOCVAL(LOCALE_ICENTURY) */
+LOCVAL(LOCALE_ITLZERO,"1")
+
+/* LOCVAL(LOCALE_IDAYLZERO) */
+/* LOCVAL(LOCALE_IMONLZERO) */
+/* LOCVAL(LOCALE_S1159) */
+/* LOCVAL(LOCALE_S2359) */
+/* LOCVAL(LOCALE_ICALENDARTYPE) */
+/* LOCVAL(LOCALE_IOPTIONALCALENDAR) */
+/* LOCVAL(LOCALE_IFIRSTDAYOFWEEK) */
+/* LOCVAL(LOCALE_IFIRSTWEEKOFYEAR) */
+
+LOCVAL(LOCALE_SDAYNAME1,"Hétfõ")
+LOCVAL(LOCALE_SDAYNAME2,"Kedd")
+LOCVAL(LOCALE_SDAYNAME3,"Szerda")
+LOCVAL(LOCALE_SDAYNAME4,"Csütörtök")
+LOCVAL(LOCALE_SDAYNAME5,"Péntek")
+LOCVAL(LOCALE_SDAYNAME6,"Szombat")
+LOCVAL(LOCALE_SDAYNAME7,"Vasárnap")
+
+LOCVAL(LOCALE_SABBREVDAYNAME1,"Hé")
+LOCVAL(LOCALE_SABBREVDAYNAME2,"Ke")
+LOCVAL(LOCALE_SABBREVDAYNAME3,"Se")
+LOCVAL(LOCALE_SABBREVDAYNAME4,"Cs")
+LOCVAL(LOCALE_SABBREVDAYNAME5,"Pé")
+LOCVAL(LOCALE_SABBREVDAYNAME6,"So")
+LOCVAL(LOCALE_SABBREVDAYNAME7,"Va")
+
+LOCVAL(LOCALE_SMONTHNAME1,"Január")
+LOCVAL(LOCALE_SMONTHNAME2,"Február")
+LOCVAL(LOCALE_SMONTHNAME3,"Március")
+LOCVAL(LOCALE_SMONTHNAME4,"Április")
+LOCVAL(LOCALE_SMONTHNAME5,"Május")
+LOCVAL(LOCALE_SMONTHNAME6,"Június")
+LOCVAL(LOCALE_SMONTHNAME7,"Július")
+LOCVAL(LOCALE_SMONTHNAME8,"Augusztus")
+LOCVAL(LOCALE_SMONTHNAME9,"Szeptember")
+LOCVAL(LOCALE_SMONTHNAME10,"Október")
+LOCVAL(LOCALE_SMONTHNAME11,"November")
+LOCVAL(LOCALE_SMONTHNAME12,"December")
+LOCVAL(LOCALE_SMONTHNAME13,"")
+
+LOCVAL(LOCALE_SABBREVMONTHNAME1,"Jan")
+LOCVAL(LOCALE_SABBREVMONTHNAME2,"Feb")
+LOCVAL(LOCALE_SABBREVMONTHNAME3,"Már")
+LOCVAL(LOCALE_SABBREVMONTHNAME4,"Ápr")
+LOCVAL(LOCALE_SABBREVMONTHNAME5,"Máj")
+LOCVAL(LOCALE_SABBREVMONTHNAME6,"Jún")
+LOCVAL(LOCALE_SABBREVMONTHNAME7,"Júl")
+LOCVAL(LOCALE_SABBREVMONTHNAME8,"Aug")
+LOCVAL(LOCALE_SABBREVMONTHNAME9,"Sze")
+LOCVAL(LOCALE_SABBREVMONTHNAME10,"Okt")
+LOCVAL(LOCALE_SABBREVMONTHNAME11,"Nov")
+LOCVAL(LOCALE_SABBREVMONTHNAME12,"Dec")
+LOCVAL(LOCALE_SABBREVMONTHNAME13,"")
+
+/* LOCVAL(LOCALE_SPOSITIVESIGN) */
+/* LOCVAL(LOCALE_SNEGATIVESIGN) */
+/* LOCVAL(LOCALE_IPOSSIGNPOSN) */
+/* LOCVAL(LOCALE_INEGSIGNPOSN) */
+/* LOCVAL(LOCALE_IPOSSYMPRECEDES) */
+/* LOCVAL(LOCALE_IPOSSEPBYSPACE) */
+/* LOCVAL(LOCALE_INEGSYMPRECEDES) */
+/* LOCVAL(LOCALE_INEGSEPBYSPACE) */
diff --git a/ole/nls/irl.nls b/ole/nls/irl.nls
new file mode 100644
index 0000000..fb15228
--- /dev/null
+++ b/ole/nls/irl.nls
@@ -0,0 +1,109 @@
+/*
+ *	OLE2NLS library
+ *      Ireland
+ */
+
+LOCVAL(LOCALE_ILANGUAGE, "0409")
+LOCVAL(LOCALE_SLANGUAGE, "English")
+LOCVAL(LOCALE_SENGLANGUAGE, "English")
+LOCVAL(LOCALE_SABBREVLANGNAME, "irl")
+LOCVAL(LOCALE_SNATIVELANGNAME, "English")
+LOCVAL(LOCALE_ICOUNTRY, "1")
+LOCVAL(LOCALE_SCOUNTRY, "United States")
+LOCVAL(LOCALE_SENGCOUNTRY, "United States")
+LOCVAL(LOCALE_SABBREVCTRYNAME, "USA")
+LOCVAL(LOCALE_SNATIVECTRYNAME, "Eire")
+LOCVAL(LOCALE_IDEFAULTLANGUAGE, "0409")
+LOCVAL(LOCALE_IDEFAULTCOUNTRY, "1")
+LOCVAL(LOCALE_IDEFAULTCODEPAGE, "437")
+LOCVAL(LOCALE_IDEFAULTANSICODEPAGE, "1252")
+LOCVAL(LOCALE_SLIST, ",")
+LOCVAL(LOCALE_IMEASURE, "1")
+LOCVAL(LOCALE_SDECIMAL, ".")
+LOCVAL(LOCALE_STHOUSAND, ",")
+LOCVAL(LOCALE_SGROUPING, "3;0")
+LOCVAL(LOCALE_IDIGITS, "2")
+LOCVAL(LOCALE_ILZERO, "1")
+LOCVAL(LOCALE_INEGNUMBER, "1")
+LOCVAL(LOCALE_SNATIVEDIGITS, "0123456789")
+LOCVAL(LOCALE_SCURRENCY, "IR")
+LOCVAL(LOCALE_SINTLSYMBOL, "IEP")
+LOCVAL(LOCALE_SMONDECIMALSEP, ".")
+LOCVAL(LOCALE_SMONTHOUSANDSEP, ",")
+LOCVAL(LOCALE_SMONGROUPING, "3;0")
+LOCVAL(LOCALE_ICURRDIGITS, "2")
+LOCVAL(LOCALE_IINTLCURRDIGITS, "2")
+LOCVAL(LOCALE_ICURRENCY, "0")
+LOCVAL(LOCALE_INEGCURR, "0")
+LOCVAL(LOCALE_SDATE, "/")
+LOCVAL(LOCALE_STIME, ":")
+LOCVAL(LOCALE_SSHORTDATE, "M/d/yy")
+LOCVAL(LOCALE_SLONGDATE, "dddd, MMMM dd, yyyy")
+LOCVAL(LOCALE_STIMEFORMAT, "h:mm:ss tt")
+LOCVAL(LOCALE_IDATE, "0")
+LOCVAL(LOCALE_ILDATE, "0")
+LOCVAL(LOCALE_ITIME, "0")
+LOCVAL(LOCALE_ITIMEMARKPOSN, "0")
+LOCVAL(LOCALE_ICENTURY, "0")
+LOCVAL(LOCALE_ITLZERO, "0")
+LOCVAL(LOCALE_IDAYLZERO, "0")
+LOCVAL(LOCALE_IMONLZERO, "0")
+LOCVAL(LOCALE_S1159, "AM")
+LOCVAL(LOCALE_S2359, "PM")
+LOCVAL(LOCALE_ICALENDARTYPE, "1")
+LOCVAL(LOCALE_IOPTIONALCALENDAR, "0")
+LOCVAL(LOCALE_IFIRSTDAYOFWEEK, "6")
+LOCVAL(LOCALE_IFIRSTWEEKOFYEAR, "0")
+
+LOCVAL(LOCALE_SDAYNAME1, "Monday")
+LOCVAL(LOCALE_SDAYNAME2, "Tuesday")
+LOCVAL(LOCALE_SDAYNAME3, "Wednesday")
+LOCVAL(LOCALE_SDAYNAME4, "Thursday")
+LOCVAL(LOCALE_SDAYNAME5, "Friday")
+LOCVAL(LOCALE_SDAYNAME6, "Saturday")
+LOCVAL(LOCALE_SDAYNAME7, "Sunday")
+
+LOCVAL(LOCALE_SABBREVDAYNAME1, "Mon")
+LOCVAL(LOCALE_SABBREVDAYNAME2, "Tue")
+LOCVAL(LOCALE_SABBREVDAYNAME3, "Wed")
+LOCVAL(LOCALE_SABBREVDAYNAME4, "Thu")
+LOCVAL(LOCALE_SABBREVDAYNAME5, "Fri")
+LOCVAL(LOCALE_SABBREVDAYNAME6, "Sat")
+LOCVAL(LOCALE_SABBREVDAYNAME7, "Sun")
+
+LOCVAL(LOCALE_SMONTHNAME1, "January")
+LOCVAL(LOCALE_SMONTHNAME2, "February")
+LOCVAL(LOCALE_SMONTHNAME3, "March")
+LOCVAL(LOCALE_SMONTHNAME4, "April")
+LOCVAL(LOCALE_SMONTHNAME5, "May")
+LOCVAL(LOCALE_SMONTHNAME6, "June")
+LOCVAL(LOCALE_SMONTHNAME7, "July")
+LOCVAL(LOCALE_SMONTHNAME8, "August")
+LOCVAL(LOCALE_SMONTHNAME9, "September")
+LOCVAL(LOCALE_SMONTHNAME10, "October")
+LOCVAL(LOCALE_SMONTHNAME11, "November")
+LOCVAL(LOCALE_SMONTHNAME12, "December")
+LOCVAL(LOCALE_SMONTHNAME13, "")
+
+LOCVAL(LOCALE_SABBREVMONTHNAME1, "Jan")
+LOCVAL(LOCALE_SABBREVMONTHNAME2, "Feb")
+LOCVAL(LOCALE_SABBREVMONTHNAME3, "Mar")
+LOCVAL(LOCALE_SABBREVMONTHNAME4, "Apr")
+LOCVAL(LOCALE_SABBREVMONTHNAME5, "May")
+LOCVAL(LOCALE_SABBREVMONTHNAME6, "Jun")
+LOCVAL(LOCALE_SABBREVMONTHNAME7, "Jul")
+LOCVAL(LOCALE_SABBREVMONTHNAME8, "Aug")
+LOCVAL(LOCALE_SABBREVMONTHNAME9, "Sep")
+LOCVAL(LOCALE_SABBREVMONTHNAME10, "Oct")
+LOCVAL(LOCALE_SABBREVMONTHNAME11, "Nov")
+LOCVAL(LOCALE_SABBREVMONTHNAME12, "Dec")
+LOCVAL(LOCALE_SABBREVMONTHNAME13, "")
+
+LOCVAL(LOCALE_SPOSITIVESIGN, "")
+LOCVAL(LOCALE_SNEGATIVESIGN, "-")
+LOCVAL(LOCALE_IPOSSIGNPOSN, "3")
+LOCVAL(LOCALE_INEGSIGNPOSN, "0")
+LOCVAL(LOCALE_IPOSSYMPRECEDES, "1")
+LOCVAL(LOCALE_IPOSSEPBYSPACE, "0")
+LOCVAL(LOCALE_INEGSYMPRECEDES, "1")
+LOCVAL(LOCALE_INEGSEPBYSPACE, "0")
diff --git a/ole/nls/isl.nls b/ole/nls/isl.nls
new file mode 100644
index 0000000..e207da1
--- /dev/null
+++ b/ole/nls/isl.nls
@@ -0,0 +1,109 @@
+/*
+ *	OLE2NLS library
+ *      Iceland
+ */
+
+LOCVAL(LOCALE_ILANGUAGE,"9")
+LOCVAL(LOCALE_SLANGUAGE,"€slensk")
+LOCVAL(LOCALE_SENGLANGUAGE,"Icelandic")
+LOCVAL(LOCALE_SABBREVLANGNAME,"isl")
+LOCVAL(LOCALE_SNATIVELANGNAME,"€slensk")
+/* LOCVAL(LOCALE_ICOUNTRY,"49") */
+LOCVAL(LOCALE_SCOUNTRY,"€sland")
+LOCVAL(LOCALE_SENGCOUNTRY,"Iceland")
+LOCVAL(LOCALE_SABBREVCTRYNAME,"Is")
+LOCVAL(LOCALE_SNATIVECTRYNAME,"€sland")
+/* LOCVAL(LOCALE_IDEFAULTLANGUAGE,"9") */
+/* LOCVAL(LOCALE_IDEFAULTCOUNTRY,"40") */
+/* LOCVAL(LOCALE_IDEFAULTCODEPAGE,"851") */
+/* LOCVAL(LOCALE_IDEFAULTANSICODEPAGE) */
+LOCVAL(LOCALE_SLIST,";")
+LOCVAL(LOCALE_IMEASURE,"0")
+LOCVAL(LOCALE_SDECIMAL,",")
+LOCVAL(LOCALE_STHOUSAND,".")
+/* LOCVAL(LOCALE_SGROUPING) */
+LOCVAL(LOCALE_IDIGITS,"2")
+LOCVAL(LOCALE_ILZERO,"1")
+/* LOCVAL(LOCALE_INEGNUMBER) */
+LOCVAL(LOCALE_SNATIVEDIGITS, "0123456789")
+LOCVAL(LOCALE_SCURRENCY,"kr")
+LOCVAL(LOCALE_SINTLSYMBOL, "ISK")
+/* LOCVAL(LOCALE_SMONDECIMALSEP) */
+/* LOCVAL(LOCALE_SMONTHOUSANDSEP) */
+/* LOCVAL(LOCALE_SMONGROUPING) */
+LOCVAL(LOCALE_ICURRDIGITS,"2")
+/* LOCVAL(LOCALE_IINTLCURRDIGITS) */
+LOCVAL(LOCALE_ICURRENCY,"3")
+LOCVAL(LOCALE_INEGCURR,"8")
+LOCVAL(LOCALE_SDATE,".")
+LOCVAL(LOCALE_STIME,":")
+LOCVAL(LOCALE_SSHORTDATE,"dd.MM.yyyy")
+LOCVAL(LOCALE_SLONGDATE,"ddd, d. MMMM yyyy")
+/* LOCVAL(LOCALE_STIMEFORMAT) */
+LOCVAL(LOCALE_IDATE,"1")
+/* LOCVAL(LOCALE_ILDATE) */
+LOCVAL(LOCALE_ITIME,"1")
+/* LOCVAL(LOCALE_ITIMEMARKPOSN) */
+/* LOCVAL(LOCALE_ICENTURY) */
+LOCVAL(LOCALE_ITLZERO,"1")
+/* LOCVAL(LOCALE_IDAYLZERO) */
+/* LOCVAL(LOCALE_IMONLZERO) */
+/* LOCVAL(LOCALE_S1159) */
+/* LOCVAL(LOCALE_S2359) */
+/* LOCVAL(LOCALE_ICALENDARTYPE) */
+/* LOCVAL(LOCALE_IOPTIONALCALENDAR) */
+/* LOCVAL(LOCALE_IFIRSTDAYOFWEEK) */
+/* LOCVAL(LOCALE_IFIRSTWEEKOFYEAR) */
+
+LOCVAL(LOCALE_SDAYNAME1,"m€nudagur")
+LOCVAL(LOCALE_SDAYNAME2,"thridjudagur")
+LOCVAL(LOCALE_SDAYNAME3,"midvikudagur")
+LOCVAL(LOCALE_SDAYNAME4,"fimmtudagur")
+LOCVAL(LOCALE_SDAYNAME5,"f€studagur")
+LOCVAL(LOCALE_SDAYNAME6,"laugardagur")
+LOCVAL(LOCALE_SDAYNAME7,"sunnudagur")
+
+LOCVAL(LOCALE_SABBREVDAYNAME1,"m€")
+LOCVAL(LOCALE_SABBREVDAYNAME2,"dr")
+LOCVAL(LOCALE_SABBREVDAYNAME3,"mi")
+LOCVAL(LOCALE_SABBREVDAYNAME4,"fi")
+LOCVAL(LOCALE_SABBREVDAYNAME5,"f€")
+LOCVAL(LOCALE_SABBREVDAYNAME6,"la")
+LOCVAL(LOCALE_SABBREVDAYNAME7,"su")
+
+LOCVAL(LOCALE_SMONTHNAME1,"jan€ar")
+LOCVAL(LOCALE_SMONTHNAME2,"febr€ar")
+LOCVAL(LOCALE_SMONTHNAME3,"mars")
+LOCVAL(LOCALE_SMONTHNAME4,"april")
+LOCVAL(LOCALE_SMONTHNAME5,"ma€")
+LOCVAL(LOCALE_SMONTHNAME6,"j€n€")
+LOCVAL(LOCALE_SMONTHNAME7,"j€l€")
+LOCVAL(LOCALE_SMONTHNAME8,"€gst")
+LOCVAL(LOCALE_SMONTHNAME9,"september")
+LOCVAL(LOCALE_SMONTHNAME10,"okt€ber")
+LOCVAL(LOCALE_SMONTHNAME11,"november")
+LOCVAL(LOCALE_SMONTHNAME12,"desember")
+LOCVAL(LOCALE_SMONTHNAME13,"")
+
+LOCVAL(LOCALE_SABBREVMONTHNAME1,"jan")
+LOCVAL(LOCALE_SABBREVMONTHNAME2,"feb")
+LOCVAL(LOCALE_SABBREVMONTHNAME3,"mär")
+LOCVAL(LOCALE_SABBREVMONTHNAME4,"apr")
+LOCVAL(LOCALE_SABBREVMONTHNAME5,"ma€")
+LOCVAL(LOCALE_SABBREVMONTHNAME6,"j€n")
+LOCVAL(LOCALE_SABBREVMONTHNAME7,"j€l")
+LOCVAL(LOCALE_SABBREVMONTHNAME8,"€g€")
+LOCVAL(LOCALE_SABBREVMONTHNAME9,"sep")
+LOCVAL(LOCALE_SABBREVMONTHNAME10,"okt")
+LOCVAL(LOCALE_SABBREVMONTHNAME11,"n€v")
+LOCVAL(LOCALE_SABBREVMONTHNAME12,"des")
+LOCVAL(LOCALE_SABBREVMONTHNAME13,"")
+
+/* LOCVAL(LOCALE_SPOSITIVESIGN) */
+/* LOCVAL(LOCALE_SNEGATIVESIGN) */
+/* LOCVAL(LOCALE_IPOSSIGNPOSN) */
+/* LOCVAL(LOCALE_INEGSIGNPOSN) */
+/* LOCVAL(LOCALE_IPOSSYMPRECEDES) */
+/* LOCVAL(LOCALE_IPOSSEPBYSPACE) */
+/* LOCVAL(LOCALE_INEGSYMPRECEDES) */
+/* LOCVAL(LOCALE_INEGSEPBYSPACE) */
diff --git a/ole/nls/ita.nls b/ole/nls/ita.nls
new file mode 100644
index 0000000..664568e
--- /dev/null
+++ b/ole/nls/ita.nls
@@ -0,0 +1,110 @@
+/*
+ *	OLE2NLS library
+ *      Italy
+ */
+
+LOCVAL(LOCALE_ILANGUAGE,"9")
+LOCVAL(LOCALE_SLANGUAGE,"Italiano")
+LOCVAL(LOCALE_SENGLANGUAGE,"Italian")
+LOCVAL(LOCALE_SABBREVLANGNAME,"ita")
+LOCVAL(LOCALE_SNATIVELANGNAME,"Italiano")
+LOCVAL(LOCALE_ICOUNTRY,"39")
+LOCVAL(LOCALE_SCOUNTRY,"Italia")
+LOCVAL(LOCALE_SENGCOUNTRY,"Italy")
+LOCVAL(LOCALE_SABBREVCTRYNAME,"It")
+LOCVAL(LOCALE_SNATIVECTRYNAME,"Italia")
+LOCVAL(LOCALE_IDEFAULTLANGUAGE,"9")
+LOCVAL(LOCALE_IDEFAULTCOUNTRY,"39")
+/* LOCVAL(LOCALE_IDEFAULTCODEPAGE) /*
+/* LOCVAL(LOCALE_IDEFAULTANSICODEPAGE) */
+LOCVAL(LOCALE_SLIST,";")
+LOCVAL(LOCALE_IMEASURE,"0")
+LOCVAL(LOCALE_SDECIMAL,",")
+LOCVAL(LOCALE_STHOUSAND,".")
+/* LOCVAL(LOCALE_SGROUPING) */
+LOCVAL(LOCALE_IDIGITS,"2")
+LOCVAL(LOCALE_ILZERO,"1")
+/* LOCVAL(LOCALE_INEGNUMBER) */
+LOCVAL(LOCALE_SNATIVEDIGITS, "0123456789")
+LOCVAL(LOCALE_SCURRENCY,"Lit.")
+LOCVAL(LOCALE_SINTLSYMBOL, "ITL")
+/* LOCVAL(LOCALE_SMONDECIMALSEP) */
+/* LOCVAL(LOCALE_SMONTHOUSANDSEP) */
+/* LOCVAL(LOCALE_SMONGROUPING) */
+LOCVAL(LOCALE_ICURRDIGITS,"2")
+/* LOCVAL(LOCALE_IINTLCURRDIGITS) */
+LOCVAL(LOCALE_ICURRENCY,"3")
+LOCVAL(LOCALE_INEGCURR,"8")
+LOCVAL(LOCALE_SDATE,".")
+LOCVAL(LOCALE_STIME,":")
+LOCVAL(LOCALE_SSHORTDATE,"dd.MM.yyyy")
+LOCVAL(LOCALE_SLONGDATE,"ddd, d. MMMM yyyy")
+/* LOCVAL(LOCALE_STIMEFORMAT) */
+LOCVAL(LOCALE_IDATE,"1")
+/* LOCVAL(LOCALE_ILDATE) */
+LOCVAL(LOCALE_ITIME,"1")
+/* LOCVAL(LOCALE_ITIMEMARKPOSN) */
+/* LOCVAL(LOCALE_ICENTURY) */
+LOCVAL(LOCALE_ITLZERO,"1")
+/* LOCVAL(LOCALE_IDAYLZERO) */
+/* LOCVAL(LOCALE_IMONLZERO) */
+/* LOCVAL(LOCALE_S1159) */
+/* LOCVAL(LOCALE_S2359) */
+/* LOCVAL(LOCALE_ICALENDARTYPE) */
+/* LOCVAL(LOCALE_IOPTIONALCALENDAR) */
+/* LOCVAL(LOCALE_IFIRSTDAYOFWEEK) */
+/* LOCVAL(LOCALE_IFIRSTWEEKOFYEAR) */
+
+LOCVAL(LOCALE_SDAYNAME1,"Lunedi'")
+LOCVAL(LOCALE_SDAYNAME2,"Martedi'")
+LOCVAL(LOCALE_SDAYNAME3,"Mercoledi'")
+LOCVAL(LOCALE_SDAYNAME4,"Giovedi'")
+LOCVAL(LOCALE_SDAYNAME5,"Venerdi'")
+LOCVAL(LOCALE_SDAYNAME6,"Sabato")
+LOCVAL(LOCALE_SDAYNAME7,"Domenica")
+
+LOCVAL(LOCALE_SABBREVDAYNAME1,"Lu")
+LOCVAL(LOCALE_SABBREVDAYNAME2,"Ma")
+LOCVAL(LOCALE_SABBREVDAYNAME3,"Me")
+LOCVAL(LOCALE_SABBREVDAYNAME4,"Gi")
+LOCVAL(LOCALE_SABBREVDAYNAME5,"Ve")
+LOCVAL(LOCALE_SABBREVDAYNAME6,"Sa")
+LOCVAL(LOCALE_SABBREVDAYNAME7,"Do")
+
+LOCVAL(LOCALE_SMONTHNAME1,"Gennaio")
+LOCVAL(LOCALE_SMONTHNAME2,"Febbraio")
+LOCVAL(LOCALE_SMONTHNAME3,"Marzo")
+LOCVAL(LOCALE_SMONTHNAME4,"Aprile")
+LOCVAL(LOCALE_SMONTHNAME5,"Maggio")
+LOCVAL(LOCALE_SMONTHNAME6,"Giugno")
+LOCVAL(LOCALE_SMONTHNAME7,"Luglio")
+LOCVAL(LOCALE_SMONTHNAME8,"Agosto")
+LOCVAL(LOCALE_SMONTHNAME9,"Settembre")
+LOCVAL(LOCALE_SMONTHNAME10,"Ottobre")
+LOCVAL(LOCALE_SMONTHNAME11,"Novembre")
+LOCVAL(LOCALE_SMONTHNAME12,"Dicembre")
+LOCVAL(LOCALE_SMONTHNAME13,"")
+
+LOCVAL(LOCALE_SABBREVMONTHNAME1,"Gen")
+LOCVAL(LOCALE_SABBREVMONTHNAME2,"Feb")
+LOCVAL(LOCALE_SABBREVMONTHNAME3,"Mar")
+LOCVAL(LOCALE_SABBREVMONTHNAME4,"Apr")
+LOCVAL(LOCALE_SABBREVMONTHNAME5,"Mag")
+LOCVAL(LOCALE_SABBREVMONTHNAME6,"Giu")
+LOCVAL(LOCALE_SABBREVMONTHNAME7,"Lug")
+LOCVAL(LOCALE_SABBREVMONTHNAME8,"Ago")
+LOCVAL(LOCALE_SABBREVMONTHNAME9,"Set")
+LOCVAL(LOCALE_SABBREVMONTHNAME10,"Ott")
+LOCVAL(LOCALE_SABBREVMONTHNAME11,"Nov")
+LOCVAL(LOCALE_SABBREVMONTHNAME12,"Dic")
+LOCVAL(LOCALE_SABBREVMONTHNAME13,"")
+
+/* LOCVAL(LOCALE_SPOSITIVESIGN) */
+/* LOCVAL(LOCALE_SNEGATIVESIGN) */
+/* LOCVAL(LOCALE_IPOSSIGNPOSN) */
+/* LOCVAL(LOCALE_INEGSIGNPOSN) */
+/* LOCVAL(LOCALE_IPOSSYMPRECEDES) */
+/* LOCVAL(LOCALE_IPOSSEPBYSPACE) */
+/* LOCVAL(LOCALE_INEGSYMPRECEDES) */
+/* LOCVAL(LOCALE_INEGSEPBYSPACE) */
+ 
diff --git a/ole/nls/its.nls b/ole/nls/its.nls
new file mode 100644
index 0000000..a493fde
--- /dev/null
+++ b/ole/nls/its.nls
@@ -0,0 +1,110 @@
+/*
+ *	OLE2NLS library
+ *      Switzerland
+ */
+
+LOCVAL(LOCALE_ILANGUAGE,"9")
+LOCVAL(LOCALE_SLANGUAGE,"Italiano")
+LOCVAL(LOCALE_SENGLANGUAGE,"Italian")
+LOCVAL(LOCALE_SABBREVLANGNAME,"its")
+LOCVAL(LOCALE_SNATIVELANGNAME,"Italiano")
+LOCVAL(LOCALE_ICOUNTRY,"41")
+LOCVAL(LOCALE_SCOUNTRY,"Svizzera")
+LOCVAL(LOCALE_SENGCOUNTRY,"Switzerand")
+LOCVAL(LOCALE_SABBREVCTRYNAME,"CH")
+LOCVAL(LOCALE_SNATIVECTRYNAME,"Svizzera")
+LOCVAL(LOCALE_IDEFAULTLANGUAGE,"9")
+LOCVAL(LOCALE_IDEFAULTCOUNTRY,"41")
+/* LOCVAL(LOCALE_IDEFAULTCODEPAGE) /*
+/* LOCVAL(LOCALE_IDEFAULTANSICODEPAGE) */
+LOCVAL(LOCALE_SLIST,";")
+LOCVAL(LOCALE_IMEASURE,"0")
+LOCVAL(LOCALE_SDECIMAL,",")
+LOCVAL(LOCALE_STHOUSAND,".")
+/* LOCVAL(LOCALE_SGROUPING) */
+LOCVAL(LOCALE_IDIGITS,"2")
+LOCVAL(LOCALE_ILZERO,"1")
+/* LOCVAL(LOCALE_INEGNUMBER) */
+LOCVAL(LOCALE_SNATIVEDIGITS, "0123456789")
+LOCVAL(LOCALE_SCURRENCY,"SFr")
+LOCVAL(LOCALE_SINTLSYMBOL, "CHF")
+/* LOCVAL(LOCALE_SMONDECIMALSEP) */
+/* LOCVAL(LOCALE_SMONTHOUSANDSEP) */
+/* LOCVAL(LOCALE_SMONGROUPING) */
+LOCVAL(LOCALE_ICURRDIGITS,"2")
+/* LOCVAL(LOCALE_IINTLCURRDIGITS) */
+LOCVAL(LOCALE_ICURRENCY,"3")
+LOCVAL(LOCALE_INEGCURR,"8")
+LOCVAL(LOCALE_SDATE,".")
+LOCVAL(LOCALE_STIME,":")
+LOCVAL(LOCALE_SSHORTDATE,"dd.MM.yyyy")
+LOCVAL(LOCALE_SLONGDATE,"ddd, d. MMMM yyyy")
+/* LOCVAL(LOCALE_STIMEFORMAT) */
+LOCVAL(LOCALE_IDATE,"1")
+/* LOCVAL(LOCALE_ILDATE) */
+LOCVAL(LOCALE_ITIME,"1")
+/* LOCVAL(LOCALE_ITIMEMARKPOSN) */
+/* LOCVAL(LOCALE_ICENTURY) */
+LOCVAL(LOCALE_ITLZERO,"1")
+/* LOCVAL(LOCALE_IDAYLZERO) */
+/* LOCVAL(LOCALE_IMONLZERO) */
+/* LOCVAL(LOCALE_S1159) */
+/* LOCVAL(LOCALE_S2359) */
+/* LOCVAL(LOCALE_ICALENDARTYPE) */
+/* LOCVAL(LOCALE_IOPTIONALCALENDAR) */
+/* LOCVAL(LOCALE_IFIRSTDAYOFWEEK) */
+/* LOCVAL(LOCALE_IFIRSTWEEKOFYEAR) */
+
+LOCVAL(LOCALE_SDAYNAME1,"Lunedi'")
+LOCVAL(LOCALE_SDAYNAME2,"Martedi'")
+LOCVAL(LOCALE_SDAYNAME3,"Mercoledi'")
+LOCVAL(LOCALE_SDAYNAME4,"Giovedi'")
+LOCVAL(LOCALE_SDAYNAME5,"Venerdi'")
+LOCVAL(LOCALE_SDAYNAME6,"Sabato")
+LOCVAL(LOCALE_SDAYNAME7,"Domenica")
+
+LOCVAL(LOCALE_SABBREVDAYNAME1,"Lu")
+LOCVAL(LOCALE_SABBREVDAYNAME2,"Ma")
+LOCVAL(LOCALE_SABBREVDAYNAME3,"Me")
+LOCVAL(LOCALE_SABBREVDAYNAME4,"Gi")
+LOCVAL(LOCALE_SABBREVDAYNAME5,"Ve")
+LOCVAL(LOCALE_SABBREVDAYNAME6,"Sa")
+LOCVAL(LOCALE_SABBREVDAYNAME7,"Do")
+
+LOCVAL(LOCALE_SMONTHNAME1,"Gennaio")
+LOCVAL(LOCALE_SMONTHNAME2,"Febbraio")
+LOCVAL(LOCALE_SMONTHNAME3,"Marzo")
+LOCVAL(LOCALE_SMONTHNAME4,"Aprile")
+LOCVAL(LOCALE_SMONTHNAME5,"Maggio")
+LOCVAL(LOCALE_SMONTHNAME6,"Giugno")
+LOCVAL(LOCALE_SMONTHNAME7,"Luglio")
+LOCVAL(LOCALE_SMONTHNAME8,"Agosto")
+LOCVAL(LOCALE_SMONTHNAME9,"Settembre")
+LOCVAL(LOCALE_SMONTHNAME10,"Ottobre")
+LOCVAL(LOCALE_SMONTHNAME11,"Novembre")
+LOCVAL(LOCALE_SMONTHNAME12,"Dicembre")
+LOCVAL(LOCALE_SMONTHNAME13,"")
+
+LOCVAL(LOCALE_SABBREVMONTHNAME1,"Gen")
+LOCVAL(LOCALE_SABBREVMONTHNAME2,"Feb")
+LOCVAL(LOCALE_SABBREVMONTHNAME3,"Mar")
+LOCVAL(LOCALE_SABBREVMONTHNAME4,"Apr")
+LOCVAL(LOCALE_SABBREVMONTHNAME5,"Mag")
+LOCVAL(LOCALE_SABBREVMONTHNAME6,"Giu")
+LOCVAL(LOCALE_SABBREVMONTHNAME7,"Lug")
+LOCVAL(LOCALE_SABBREVMONTHNAME8,"Ago")
+LOCVAL(LOCALE_SABBREVMONTHNAME9,"Set")
+LOCVAL(LOCALE_SABBREVMONTHNAME10,"Ott")
+LOCVAL(LOCALE_SABBREVMONTHNAME11,"Nov")
+LOCVAL(LOCALE_SABBREVMONTHNAME12,"Dic")
+LOCVAL(LOCALE_SABBREVMONTHNAME13,"")
+
+/* LOCVAL(LOCALE_SPOSITIVESIGN) */
+/* LOCVAL(LOCALE_SNEGATIVESIGN) */
+/* LOCVAL(LOCALE_IPOSSIGNPOSN) */
+/* LOCVAL(LOCALE_INEGSIGNPOSN) */
+/* LOCVAL(LOCALE_IPOSSYMPRECEDES) */
+/* LOCVAL(LOCALE_IPOSSEPBYSPACE) */
+/* LOCVAL(LOCALE_INEGSYMPRECEDES) */
+/* LOCVAL(LOCALE_INEGSEPBYSPACE) */
+ 
diff --git a/ole/nls/koj.nls b/ole/nls/koj.nls
new file mode 100644
index 0000000..71aceb2
--- /dev/null
+++ b/ole/nls/koj.nls
@@ -0,0 +1,110 @@
+/*
+ *	OLE2NLS library
+ *      Korean
+ */
+
+/* LOCVAL(LOCALE_ILANGUAGE,"") */
+/* LOCVAL(LOCALE_SLANGUAGE,"") */
+/* LOCVAL(LOCALE_SENGLANGUAGE,"") */
+LOCVAL(LOCALE_SABBREVLANGNAME,"koj")
+/* LOCVAL(LOCALE_SNATIVELANGNAME,"") */
+/* LOCVAL(LOCALE_ICOUNTRY,"") */
+/* LOCVAL(LOCALE_SCOUNTRY,"") */
+/* LOCVAL(LOCALE_SENGCOUNTRY,"") */
+/* LOCVAL(LOCALE_SABBREVCTRYNAME,"") */
+/* LOCVAL(LOCALE_SNATIVECTRYNAME,"") */
+/* LOCVAL(LOCALE_IDEFAULTLANGUAGE,"") */
+/* LOCVAL(LOCALE_IDEFAULTCOUNTRY,"") */
+/* LOCVAL(LOCALE_IDEFAULTCODEPAGE) */
+/* LOCVAL(LOCALE_IDEFAULTANSICODEPAGE) */
+/* LOCVAL(LOCALE_SLIST,"") */
+/* LOCVAL(LOCALE_IMEASURE,"") */
+/* LOCVAL(LOCALE_SDECIMAL,"") */
+/* LOCVAL(LOCALE_STHOUSAND,"") */
+/* LOCVAL(LOCALE_SGROUPING) */
+/* LOCVAL(LOCALE_IDIGITS,"2") */
+/* LOCVAL(LOCALE_ILZERO,"1") */
+/* LOCVAL(LOCALE_INEGNUMBER) */
+/* LOCVAL(LOCALE_SNATIVEDIGITS) */
+/* LOCVAL(LOCALE_SCURRENCY,"") */
+/* LOCVAL(LOCALE_SINTLSYMBOL) */
+/* LOCVAL(LOCALE_SMONDECIMALSEP,",") */
+/* LOCVAL(LOCALE_SMONTHOUSANDSEP,".") */
+/* LOCVAL(LOCALE_SMONGROUPING) */
+/* LOCVAL(LOCALE_ICURRDIGITS,"2") */
+/* LOCVAL(LOCALE_IINTLCURRDIGITS) */
+/* LOCVAL(LOCALE_ICURRENCY,"3") */
+/* LOCVAL(LOCALE_INEGCURR,"8") */
+/* LOCVAL(LOCALE_SDATE,".") */
+/* LOCVAL(LOCALE_STIME,":") */
+/* LOCVAL(LOCALE_SSHORTDATE,"dd/MM-yyyy") */
+/* LOCVAL(LOCALE_SLONGDATE,"ddd, d. MMMM yyyy") */
+/* LOCVAL(LOCALE_STIMEFORMAT) */
+/* LOCVAL(LOCALE_IDATE,"1") */
+/* LOCVAL(LOCALE_ILDATE) */
+/* LOCVAL(LOCALE_ITIME,"1")
+/* LOCVAL(LOCALE_ITIMEMARKPOSN) */
+/* LOCVAL(LOCALE_ICENTURY) */
+/* LOCVAL(LOCALE_ITLZERO,"1")
+/* LOCVAL(LOCALE_IDAYLZERO) */
+/* LOCVAL(LOCALE_IMONLZERO) */
+/* LOCVAL(LOCALE_S1159, "") */
+/* LOCVAL(LOCALE_S2359, "") */
+/* LOCVAL(LOCALE_ICALENDARTYPE) */
+/* LOCVAL(LOCALE_IOPTIONALCALENDAR) */
+/* LOCVAL(LOCALE_IFIRSTDAYOFWEEK) */
+/* LOCVAL(LOCALE_IFIRSTWEEKOFYEAR) */
+
+/* LOCVAL(LOCALE_SDAYNAME1,"") */
+/* LOCVAL(LOCALE_SDAYNAME2,"") */
+/* LOCVAL(LOCALE_SDAYNAME3,"") */
+/* LOCVAL(LOCALE_SDAYNAME4,"") */
+/* LOCVAL(LOCALE_SDAYNAME5,"") */
+/* LOCVAL(LOCALE_SDAYNAME6,"") */
+/* LOCVAL(LOCALE_SDAYNAME7,"") */
+
+/* LOCVAL(LOCALE_SABBREVDAYNAME1,"Ma") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME2,"Ti") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME3,"On") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME4,"To") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME5,"Fr") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME6,"Lø") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME7,"Sø") */
+
+/* LOCVAL(LOCALE_SMONTHNAME1,"") */
+/* LOCVAL(LOCALE_SMONTHNAME2,"") */
+/* LOCVAL(LOCALE_SMONTHNAME3,"") */
+/* LOCVAL(LOCALE_SMONTHNAME4,"") */
+/* LOCVAL(LOCALE_SMONTHNAME5,"") */
+/* LOCVAL(LOCALE_SMONTHNAME6,"") */
+/* LOCVAL(LOCALE_SMONTHNAME7,"") */
+/* LOCVAL(LOCALE_SMONTHNAME8,"") */
+/* LOCVAL(LOCALE_SMONTHNAME9,"") */
+/* LOCVAL(LOCALE_SMONTHNAME10,"") */
+/* LOCVAL(LOCALE_SMONTHNAME11,"") */
+/* LOCVAL(LOCALE_SMONTHNAME12,"") */
+/* LOCVAL(LOCALE_SMONTHNAME13,"") */
+
+/* LOCVAL(LOCALE_SABBREVMONTHNAME1,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME2,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME3,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME4,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME5,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME6,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME7,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME8,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME9,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME10,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME11,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME12,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME13,"") */
+
+/* LOCVAL(LOCALE_SPOSITIVESIGN, "") */
+/* LOCVAL(LOCALE_SNEGATIVESIGN, "") */
+/* LOCVAL(LOCALE_IPOSSIGNPOSN, "") */
+/* LOCVAL(LOCALE_INEGSIGNPOSN, "") */
+/* LOCVAL(LOCALE_IPOSSYMPRECEDES, "") */
+/* LOCVAL(LOCALE_IPOSSEPBYSPACE, "") */
+/* LOCVAL(LOCALE_INEGSYMPRECEDES, "") */
+/* LOCVAL(LOCALE_INEGSEPBYSPACE, "") */
+
diff --git a/ole/nls/kor.nls b/ole/nls/kor.nls
new file mode 100644
index 0000000..0644f00
--- /dev/null
+++ b/ole/nls/kor.nls
@@ -0,0 +1,111 @@
+/*
+ *	OLE2NLS library
+ *      Korean
+ *      string using codepage 949
+ */
+ 
+LOCVAL(LOCALE_ILANGUAGE,"18")
+LOCVAL(LOCALE_SLANGUAGE,"\307\321\261\271\276\356")
+LOCVAL(LOCALE_SENGLANGUAGE,"Korean")
+LOCVAL(LOCALE_SABBREVLANGNAME,"kor")
+LOCVAL(LOCALE_SNATIVELANGNAME,"\307\321\261\271\276\356")
+LOCVAL(LOCALE_ICOUNTRY,"82")
+LOCVAL(LOCALE_SCOUNTRY,"\264\353\307\321\271\316\261\271")
+LOCVAL(LOCALE_SENGCOUNTRY,"Korea (South)")
+LOCVAL(LOCALE_SABBREVCTRYNAME,"KOR")
+LOCVAL(LOCALE_SNATIVECTRYNAME,"\264\353\307\321\271\316\261\271")
+LOCVAL(LOCALE_IDEFAULTLANGUAGE,"18")
+LOCVAL(LOCALE_IDEFAULTCOUNTRY,"82")
+LOCVAL(LOCALE_IDEFAULTCODEPAGE,"949")
+LOCVAL(LOCALE_IDEFAULTANSICODEPAGE,"949")
+LOCVAL(LOCALE_SLIST,",")
+LOCVAL(LOCALE_IMEASURE,"0")
+LOCVAL(LOCALE_SDECIMAL,".")
+LOCVAL(LOCALE_STHOUSAND,",")
+LOCVAL(LOCALE_SGROUPING,"3;0")
+LOCVAL(LOCALE_IDIGITS,"2")
+LOCVAL(LOCALE_ILZERO,"0")
+LOCVAL(LOCALE_INEGNUMBER,"1")
+LOCVAL(LOCALE_SNATIVEDIGITS,"0123456789")
+LOCVAL(LOCALE_SCURRENCY,"\\")
+LOCVAL(LOCALE_SINTLSYMBOL,"Won")
+LOCVAL(LOCALE_SMONDECIMALSEP,".")
+LOCVAL(LOCALE_SMONTHOUSANDSEP,",")
+LOCVAL(LOCALE_SMONGROUPING,"3;0")
+LOCVAL(LOCALE_ICURRDIGITS,"2")
+LOCVAL(LOCALE_IINTLCURRDIGITS,"2")
+LOCVAL(LOCALE_ICURRENCY,"3")
+LOCVAL(LOCALE_INEGCURR,"8")
+LOCVAL(LOCALE_SDATE,"/")
+LOCVAL(LOCALE_STIME,":")
+LOCVAL(LOCALE_SSHORTDATE,"yyyy/MM/dd")
+LOCVAL(LOCALE_SLONGDATE,"yyyy/MM/dd")
+LOCVAL(LOCALE_STIMEFORMAT,"h:mm:ss tt")
+LOCVAL(LOCALE_IDATE,"1")
+LOCVAL(LOCALE_ILDATE,"1")
+LOCVAL(LOCALE_ITIME,"1")
+LOCVAL(LOCALE_ITIMEMARKPOSN,"0")
+LOCVAL(LOCALE_ICENTURY,"0")
+LOCVAL(LOCALE_ITLZERO,"0")
+LOCVAL(LOCALE_IDAYLZERO,"0")
+LOCVAL(LOCALE_IMONLZERO,"0")
+LOCVAL(LOCALE_S1159,"\277\300\300\374")
+LOCVAL(LOCALE_S2359,"\277\300\310\304")
+LOCVAL(LOCALE_ICALENDARTYPE,"1")
+/* Korean Tangun Era calendar */
+LOCVAL(LOCALE_IOPTIONALCALENDAR,"5")
+LOCVAL(LOCALE_IFIRSTDAYOFWEEK,"6")
+LOCVAL(LOCALE_IFIRSTWEEKOFYEAR,"0")
+
+LOCVAL(LOCALE_SDAYNAME1,"\277\371\277\344\300\317")
+LOCVAL(LOCALE_SDAYNAME2,"\310\255\277\344\300\317")
+LOCVAL(LOCALE_SDAYNAME3,"\274\366\277\344\300\317")
+LOCVAL(LOCALE_SDAYNAME4,"\270\361\277\344\300\317")
+LOCVAL(LOCALE_SDAYNAME5,"\261\335\277\344\300\317")
+LOCVAL(LOCALE_SDAYNAME6,"\305\344\277\344\300\317")
+LOCVAL(LOCALE_SDAYNAME7,"\300\317\277\344\300\317")
+
+LOCVAL(LOCALE_SABBREVDAYNAME1,"\277\371")
+LOCVAL(LOCALE_SABBREVDAYNAME2,"\310\255")
+LOCVAL(LOCALE_SABBREVDAYNAME3,"\274\366")
+LOCVAL(LOCALE_SABBREVDAYNAME4,"\270\361")
+LOCVAL(LOCALE_SABBREVDAYNAME5,"\261\335")
+LOCVAL(LOCALE_SABBREVDAYNAME6,"\305\344")
+LOCVAL(LOCALE_SABBREVDAYNAME7,"\300\317")
+
+LOCVAL(LOCALE_SMONTHNAME1,"1\277\371")
+LOCVAL(LOCALE_SMONTHNAME2,"2\277\371")
+LOCVAL(LOCALE_SMONTHNAME3,"3\277\371")
+LOCVAL(LOCALE_SMONTHNAME4,"4\277\371")
+LOCVAL(LOCALE_SMONTHNAME5,"5\277\371")
+LOCVAL(LOCALE_SMONTHNAME6,"6\277\371")
+LOCVAL(LOCALE_SMONTHNAME7,"7\277\371")
+LOCVAL(LOCALE_SMONTHNAME8,"8\277\371")
+LOCVAL(LOCALE_SMONTHNAME9,"9\277\371")
+LOCVAL(LOCALE_SMONTHNAME10,"10\277\371")
+LOCVAL(LOCALE_SMONTHNAME11,"11\277\371")
+LOCVAL(LOCALE_SMONTHNAME12,"12\277\371")
+LOCVAL(LOCALE_SMONTHNAME13,"")
+
+LOCVAL(LOCALE_SABBREVMONTHNAME1,"1\277\371")
+LOCVAL(LOCALE_SABBREVMONTHNAME2,"2\277\371")
+LOCVAL(LOCALE_SABBREVMONTHNAME3,"3\277\371")
+LOCVAL(LOCALE_SABBREVMONTHNAME4,"4\277\371")
+LOCVAL(LOCALE_SABBREVMONTHNAME5,"5\277\371")
+LOCVAL(LOCALE_SABBREVMONTHNAME6,"6\277\371")
+LOCVAL(LOCALE_SABBREVMONTHNAME7,"7\277\371")
+LOCVAL(LOCALE_SABBREVMONTHNAME8,"8\277\371")
+LOCVAL(LOCALE_SABBREVMONTHNAME9,"9\277\371")
+LOCVAL(LOCALE_SABBREVMONTHNAME10,"10\277\371")
+LOCVAL(LOCALE_SABBREVMONTHNAME11,"11\277\371")
+LOCVAL(LOCALE_SABBREVMONTHNAME12,"12\277\371")
+LOCVAL(LOCALE_SABBREVMONTHNAME13,"")
+
+LOCVAL(LOCALE_SPOSITIVESIGN,"")
+LOCVAL(LOCALE_SNEGATIVESIGN,"-")
+LOCVAL(LOCALE_IPOSSIGNPOSN,"3")
+LOCVAL(LOCALE_INEGSIGNPOSN,"0")
+LOCVAL(LOCALE_IPOSSYMPRECEDES,"3")
+LOCVAL(LOCALE_IPOSSEPBYSPACE,"0")
+LOCVAL(LOCALE_INEGSYMPRECEDES,"3")
+LOCVAL(LOCALE_INEGSEPBYSPACE,"0")
diff --git a/ole/nls/lth.nls b/ole/nls/lth.nls
new file mode 100644
index 0000000..f758697
--- /dev/null
+++ b/ole/nls/lth.nls
@@ -0,0 +1,110 @@
+/*
+ *	OLE2NLS library
+ *      Lithuanian
+ */
+
+/* LOCVAL(LOCALE_ILANGUAGE,"") */
+/* LOCVAL(LOCALE_SLANGUAGE,"") */
+/* LOCVAL(LOCALE_SENGLANGUAGE,"") */
+LOCVAL(LOCALE_SABBREVLANGNAME,"lth")
+/* LOCVAL(LOCALE_SNATIVELANGNAME,"") */
+/* LOCVAL(LOCALE_ICOUNTRY,"") */
+/* LOCVAL(LOCALE_SCOUNTRY,"") */
+/* LOCVAL(LOCALE_SENGCOUNTRY,"") */
+/* LOCVAL(LOCALE_SABBREVCTRYNAME,"") */
+/* LOCVAL(LOCALE_SNATIVECTRYNAME,"") */
+/* LOCVAL(LOCALE_IDEFAULTLANGUAGE,"") */
+/* LOCVAL(LOCALE_IDEFAULTCOUNTRY,"") */
+/* LOCVAL(LOCALE_IDEFAULTCODEPAGE) */
+/* LOCVAL(LOCALE_IDEFAULTANSICODEPAGE) */
+/* LOCVAL(LOCALE_SLIST,"") */
+/* LOCVAL(LOCALE_IMEASURE,"") */
+/* LOCVAL(LOCALE_SDECIMAL,"") */
+/* LOCVAL(LOCALE_STHOUSAND,"") */
+/* LOCVAL(LOCALE_SGROUPING) */
+/* LOCVAL(LOCALE_IDIGITS,"2") */
+/* LOCVAL(LOCALE_ILZERO,"1") */
+/* LOCVAL(LOCALE_INEGNUMBER) */
+/* LOCVAL(LOCALE_SNATIVEDIGITS) */
+/* LOCVAL(LOCALE_SCURRENCY,"") */
+/* LOCVAL(LOCALE_SINTLSYMBOL) */
+/* LOCVAL(LOCALE_SMONDECIMALSEP,",") */
+/* LOCVAL(LOCALE_SMONTHOUSANDSEP,".") */
+/* LOCVAL(LOCALE_SMONGROUPING) */
+/* LOCVAL(LOCALE_ICURRDIGITS,"2") */
+/* LOCVAL(LOCALE_IINTLCURRDIGITS) */
+/* LOCVAL(LOCALE_ICURRENCY,"3") */
+/* LOCVAL(LOCALE_INEGCURR,"8") */
+/* LOCVAL(LOCALE_SDATE,".") */
+/* LOCVAL(LOCALE_STIME,":") */
+/* LOCVAL(LOCALE_SSHORTDATE,"dd/MM-yyyy") */
+/* LOCVAL(LOCALE_SLONGDATE,"ddd, d. MMMM yyyy") */
+/* LOCVAL(LOCALE_STIMEFORMAT) */
+/* LOCVAL(LOCALE_IDATE,"1") */
+/* LOCVAL(LOCALE_ILDATE) */
+/* LOCVAL(LOCALE_ITIME,"1")
+/* LOCVAL(LOCALE_ITIMEMARKPOSN) */
+/* LOCVAL(LOCALE_ICENTURY) */
+/* LOCVAL(LOCALE_ITLZERO,"1")
+/* LOCVAL(LOCALE_IDAYLZERO) */
+/* LOCVAL(LOCALE_IMONLZERO) */
+/* LOCVAL(LOCALE_S1159, "") */
+/* LOCVAL(LOCALE_S2359, "") */
+/* LOCVAL(LOCALE_ICALENDARTYPE) */
+/* LOCVAL(LOCALE_IOPTIONALCALENDAR) */
+/* LOCVAL(LOCALE_IFIRSTDAYOFWEEK) */
+/* LOCVAL(LOCALE_IFIRSTWEEKOFYEAR) */
+
+/* LOCVAL(LOCALE_SDAYNAME1,"") */
+/* LOCVAL(LOCALE_SDAYNAME2,"") */
+/* LOCVAL(LOCALE_SDAYNAME3,"") */
+/* LOCVAL(LOCALE_SDAYNAME4,"") */
+/* LOCVAL(LOCALE_SDAYNAME5,"") */
+/* LOCVAL(LOCALE_SDAYNAME6,"") */
+/* LOCVAL(LOCALE_SDAYNAME7,"") */
+
+/* LOCVAL(LOCALE_SABBREVDAYNAME1,"Ma") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME2,"Ti") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME3,"On") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME4,"To") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME5,"Fr") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME6,"Lø") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME7,"Sø") */
+
+/* LOCVAL(LOCALE_SMONTHNAME1,"") */
+/* LOCVAL(LOCALE_SMONTHNAME2,"") */
+/* LOCVAL(LOCALE_SMONTHNAME3,"") */
+/* LOCVAL(LOCALE_SMONTHNAME4,"") */
+/* LOCVAL(LOCALE_SMONTHNAME5,"") */
+/* LOCVAL(LOCALE_SMONTHNAME6,"") */
+/* LOCVAL(LOCALE_SMONTHNAME7,"") */
+/* LOCVAL(LOCALE_SMONTHNAME8,"") */
+/* LOCVAL(LOCALE_SMONTHNAME9,"") */
+/* LOCVAL(LOCALE_SMONTHNAME10,"") */
+/* LOCVAL(LOCALE_SMONTHNAME11,"") */
+/* LOCVAL(LOCALE_SMONTHNAME12,"") */
+/* LOCVAL(LOCALE_SMONTHNAME13,"") */
+
+/* LOCVAL(LOCALE_SABBREVMONTHNAME1,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME2,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME3,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME4,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME5,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME6,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME7,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME8,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME9,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME10,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME11,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME12,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME13,"") */
+
+/* LOCVAL(LOCALE_SPOSITIVESIGN, "") */
+/* LOCVAL(LOCALE_SNEGATIVESIGN, "") */
+/* LOCVAL(LOCALE_IPOSSIGNPOSN, "") */
+/* LOCVAL(LOCALE_INEGSIGNPOSN, "") */
+/* LOCVAL(LOCALE_IPOSSYMPRECEDES, "") */
+/* LOCVAL(LOCALE_IPOSSEPBYSPACE, "") */
+/* LOCVAL(LOCALE_INEGSYMPRECEDES, "") */
+/* LOCVAL(LOCALE_INEGSEPBYSPACE, "") */
+
diff --git a/ole/nls/lvi.nls b/ole/nls/lvi.nls
new file mode 100644
index 0000000..a0d1773
--- /dev/null
+++ b/ole/nls/lvi.nls
@@ -0,0 +1,110 @@
+/*
+ *	OLE2NLS library
+ *      Latvia
+ */
+
+/* LOCVAL(LOCALE_ILANGUAGE,"") */
+/* LOCVAL(LOCALE_SLANGUAGE,"") */
+/* LOCVAL(LOCALE_SENGLANGUAGE,"") */
+LOCVAL(LOCALE_SABBREVLANGNAME,"lvi")
+/* LOCVAL(LOCALE_SNATIVELANGNAME,"") */
+/* LOCVAL(LOCALE_ICOUNTRY,"") */
+/* LOCVAL(LOCALE_SCOUNTRY,"") */
+/* LOCVAL(LOCALE_SENGCOUNTRY,"") */
+/* LOCVAL(LOCALE_SABBREVCTRYNAME,"") */
+/* LOCVAL(LOCALE_SNATIVECTRYNAME,"") */
+/* LOCVAL(LOCALE_IDEFAULTLANGUAGE,"") */
+/* LOCVAL(LOCALE_IDEFAULTCOUNTRY,"") */
+/* LOCVAL(LOCALE_IDEFAULTCODEPAGE) */
+/* LOCVAL(LOCALE_IDEFAULTANSICODEPAGE) */
+/* LOCVAL(LOCALE_SLIST,"") */
+/* LOCVAL(LOCALE_IMEASURE,"") */
+/* LOCVAL(LOCALE_SDECIMAL,"") */
+/* LOCVAL(LOCALE_STHOUSAND,"") */
+/* LOCVAL(LOCALE_SGROUPING) */
+/* LOCVAL(LOCALE_IDIGITS,"2") */
+/* LOCVAL(LOCALE_ILZERO,"1") */
+/* LOCVAL(LOCALE_INEGNUMBER) */
+/* LOCVAL(LOCALE_SNATIVEDIGITS) */
+/* LOCVAL(LOCALE_SCURRENCY,"") */
+/* LOCVAL(LOCALE_SINTLSYMBOL) */
+/* LOCVAL(LOCALE_SMONDECIMALSEP,",") */
+/* LOCVAL(LOCALE_SMONTHOUSANDSEP,".") */
+/* LOCVAL(LOCALE_SMONGROUPING) */
+/* LOCVAL(LOCALE_ICURRDIGITS,"2") */
+/* LOCVAL(LOCALE_IINTLCURRDIGITS) */
+/* LOCVAL(LOCALE_ICURRENCY,"3") */
+/* LOCVAL(LOCALE_INEGCURR,"8") */
+/* LOCVAL(LOCALE_SDATE,".") */
+/* LOCVAL(LOCALE_STIME,":") */
+/* LOCVAL(LOCALE_SSHORTDATE,"dd/MM-yyyy") */
+/* LOCVAL(LOCALE_SLONGDATE,"ddd, d. MMMM yyyy") */
+/* LOCVAL(LOCALE_STIMEFORMAT) */
+/* LOCVAL(LOCALE_IDATE,"1") */
+/* LOCVAL(LOCALE_ILDATE) */
+/* LOCVAL(LOCALE_ITIME,"1")
+/* LOCVAL(LOCALE_ITIMEMARKPOSN) */
+/* LOCVAL(LOCALE_ICENTURY) */
+/* LOCVAL(LOCALE_ITLZERO,"1")
+/* LOCVAL(LOCALE_IDAYLZERO) */
+/* LOCVAL(LOCALE_IMONLZERO) */
+/* LOCVAL(LOCALE_S1159, "") */
+/* LOCVAL(LOCALE_S2359, "") */
+/* LOCVAL(LOCALE_ICALENDARTYPE) */
+/* LOCVAL(LOCALE_IOPTIONALCALENDAR) */
+/* LOCVAL(LOCALE_IFIRSTDAYOFWEEK) */
+/* LOCVAL(LOCALE_IFIRSTWEEKOFYEAR) */
+
+/* LOCVAL(LOCALE_SDAYNAME1,"") */
+/* LOCVAL(LOCALE_SDAYNAME2,"") */
+/* LOCVAL(LOCALE_SDAYNAME3,"") */
+/* LOCVAL(LOCALE_SDAYNAME4,"") */
+/* LOCVAL(LOCALE_SDAYNAME5,"") */
+/* LOCVAL(LOCALE_SDAYNAME6,"") */
+/* LOCVAL(LOCALE_SDAYNAME7,"") */
+
+/* LOCVAL(LOCALE_SABBREVDAYNAME1,"Ma") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME2,"Ti") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME3,"On") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME4,"To") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME5,"Fr") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME6,"Lø") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME7,"Sø") */
+
+/* LOCVAL(LOCALE_SMONTHNAME1,"") */
+/* LOCVAL(LOCALE_SMONTHNAME2,"") */
+/* LOCVAL(LOCALE_SMONTHNAME3,"") */
+/* LOCVAL(LOCALE_SMONTHNAME4,"") */
+/* LOCVAL(LOCALE_SMONTHNAME5,"") */
+/* LOCVAL(LOCALE_SMONTHNAME6,"") */
+/* LOCVAL(LOCALE_SMONTHNAME7,"") */
+/* LOCVAL(LOCALE_SMONTHNAME8,"") */
+/* LOCVAL(LOCALE_SMONTHNAME9,"") */
+/* LOCVAL(LOCALE_SMONTHNAME10,"") */
+/* LOCVAL(LOCALE_SMONTHNAME11,"") */
+/* LOCVAL(LOCALE_SMONTHNAME12,"") */
+/* LOCVAL(LOCALE_SMONTHNAME13,"") */
+
+/* LOCVAL(LOCALE_SABBREVMONTHNAME1,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME2,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME3,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME4,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME5,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME6,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME7,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME8,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME9,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME10,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME11,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME12,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME13,"") */
+
+/* LOCVAL(LOCALE_SPOSITIVESIGN, "") */
+/* LOCVAL(LOCALE_SNEGATIVESIGN, "") */
+/* LOCVAL(LOCALE_IPOSSIGNPOSN, "") */
+/* LOCVAL(LOCALE_INEGSIGNPOSN, "") */
+/* LOCVAL(LOCALE_IPOSSYMPRECEDES, "") */
+/* LOCVAL(LOCALE_IPOSSEPBYSPACE, "") */
+/* LOCVAL(LOCALE_INEGSYMPRECEDES, "") */
+/* LOCVAL(LOCALE_INEGSEPBYSPACE, "") */
+
diff --git a/ole/nls/nlb.nls b/ole/nls/nlb.nls
new file mode 100644
index 0000000..e29103f
--- /dev/null
+++ b/ole/nls/nlb.nls
@@ -0,0 +1,110 @@
+/*
+ *	OLE2NLS library
+ *      Netherlands
+ */
+
+/* LOCVAL(LOCALE_ILANGUAGE,"") */
+/* LOCVAL(LOCALE_SLANGUAGE,"") */
+/* LOCVAL(LOCALE_SENGLANGUAGE,"") */
+LOCVAL(LOCALE_SABBREVLANGNAME,"nlb")
+/* LOCVAL(LOCALE_SNATIVELANGNAME,"") */
+/* LOCVAL(LOCALE_ICOUNTRY,"") */
+/* LOCVAL(LOCALE_SCOUNTRY,"") */
+/* LOCVAL(LOCALE_SENGCOUNTRY,"") */
+/* LOCVAL(LOCALE_SABBREVCTRYNAME,"") */
+/* LOCVAL(LOCALE_SNATIVECTRYNAME,"") */
+/* LOCVAL(LOCALE_IDEFAULTLANGUAGE,"") */
+/* LOCVAL(LOCALE_IDEFAULTCOUNTRY,"") */
+/* LOCVAL(LOCALE_IDEFAULTCODEPAGE) */
+/* LOCVAL(LOCALE_IDEFAULTANSICODEPAGE) */
+/* LOCVAL(LOCALE_SLIST,"") */
+/* LOCVAL(LOCALE_IMEASURE,"") */
+/* LOCVAL(LOCALE_SDECIMAL,"") */
+/* LOCVAL(LOCALE_STHOUSAND,"") */
+/* LOCVAL(LOCALE_SGROUPING) */
+/* LOCVAL(LOCALE_IDIGITS,"2") */
+/* LOCVAL(LOCALE_ILZERO,"1") */
+/* LOCVAL(LOCALE_INEGNUMBER) */
+/* LOCVAL(LOCALE_SNATIVEDIGITS) */
+/* LOCVAL(LOCALE_SCURRENCY,"") */
+/* LOCVAL(LOCALE_SINTLSYMBOL) */
+/* LOCVAL(LOCALE_SMONDECIMALSEP,",") */
+/* LOCVAL(LOCALE_SMONTHOUSANDSEP,".") */
+/* LOCVAL(LOCALE_SMONGROUPING) */
+/* LOCVAL(LOCALE_ICURRDIGITS,"2") */
+/* LOCVAL(LOCALE_IINTLCURRDIGITS) */
+/* LOCVAL(LOCALE_ICURRENCY,"3") */
+/* LOCVAL(LOCALE_INEGCURR,"8") */
+/* LOCVAL(LOCALE_SDATE,".") */
+/* LOCVAL(LOCALE_STIME,":") */
+/* LOCVAL(LOCALE_SSHORTDATE,"dd/MM-yyyy") */
+/* LOCVAL(LOCALE_SLONGDATE,"ddd, d. MMMM yyyy") */
+/* LOCVAL(LOCALE_STIMEFORMAT) */
+/* LOCVAL(LOCALE_IDATE,"1") */
+/* LOCVAL(LOCALE_ILDATE) */
+/* LOCVAL(LOCALE_ITIME,"1")
+/* LOCVAL(LOCALE_ITIMEMARKPOSN) */
+/* LOCVAL(LOCALE_ICENTURY) */
+/* LOCVAL(LOCALE_ITLZERO,"1")
+/* LOCVAL(LOCALE_IDAYLZERO) */
+/* LOCVAL(LOCALE_IMONLZERO) */
+/* LOCVAL(LOCALE_S1159, "") */
+/* LOCVAL(LOCALE_S2359, "") */
+/* LOCVAL(LOCALE_ICALENDARTYPE) */
+/* LOCVAL(LOCALE_IOPTIONALCALENDAR) */
+/* LOCVAL(LOCALE_IFIRSTDAYOFWEEK) */
+/* LOCVAL(LOCALE_IFIRSTWEEKOFYEAR) */
+
+/* LOCVAL(LOCALE_SDAYNAME1,"") */
+/* LOCVAL(LOCALE_SDAYNAME2,"") */
+/* LOCVAL(LOCALE_SDAYNAME3,"") */
+/* LOCVAL(LOCALE_SDAYNAME4,"") */
+/* LOCVAL(LOCALE_SDAYNAME5,"") */
+/* LOCVAL(LOCALE_SDAYNAME6,"") */
+/* LOCVAL(LOCALE_SDAYNAME7,"") */
+
+/* LOCVAL(LOCALE_SABBREVDAYNAME1,"Ma") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME2,"Ti") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME3,"On") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME4,"To") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME5,"Fr") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME6,"Lø") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME7,"Sø") */
+
+/* LOCVAL(LOCALE_SMONTHNAME1,"") */
+/* LOCVAL(LOCALE_SMONTHNAME2,"") */
+/* LOCVAL(LOCALE_SMONTHNAME3,"") */
+/* LOCVAL(LOCALE_SMONTHNAME4,"") */
+/* LOCVAL(LOCALE_SMONTHNAME5,"") */
+/* LOCVAL(LOCALE_SMONTHNAME6,"") */
+/* LOCVAL(LOCALE_SMONTHNAME7,"") */
+/* LOCVAL(LOCALE_SMONTHNAME8,"") */
+/* LOCVAL(LOCALE_SMONTHNAME9,"") */
+/* LOCVAL(LOCALE_SMONTHNAME10,"") */
+/* LOCVAL(LOCALE_SMONTHNAME11,"") */
+/* LOCVAL(LOCALE_SMONTHNAME12,"") */
+/* LOCVAL(LOCALE_SMONTHNAME13,"") */
+
+/* LOCVAL(LOCALE_SABBREVMONTHNAME1,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME2,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME3,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME4,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME5,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME6,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME7,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME8,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME9,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME10,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME11,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME12,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME13,"") */
+
+/* LOCVAL(LOCALE_SPOSITIVESIGN, "") */
+/* LOCVAL(LOCALE_SNEGATIVESIGN, "") */
+/* LOCVAL(LOCALE_IPOSSIGNPOSN, "") */
+/* LOCVAL(LOCALE_INEGSIGNPOSN, "") */
+/* LOCVAL(LOCALE_IPOSSYMPRECEDES, "") */
+/* LOCVAL(LOCALE_IPOSSEPBYSPACE, "") */
+/* LOCVAL(LOCALE_INEGSYMPRECEDES, "") */
+/* LOCVAL(LOCALE_INEGSEPBYSPACE, "") */
+
diff --git a/ole/nls/nls.nls b/ole/nls/nls.nls
new file mode 100644
index 0000000..bbd56cd
--- /dev/null
+++ b/ole/nls/nls.nls
@@ -0,0 +1,110 @@
+/*
+ *	OLE2NLS library
+ *      Dutch
+ */
+
+/* LOCVAL(LOCALE_ILANGUAGE,"") */
+/* LOCVAL(LOCALE_SLANGUAGE,"") */
+/* LOCVAL(LOCALE_SENGLANGUAGE,"") */
+LOCVAL(LOCALE_SABBREVLANGNAME,"nls")
+/* LOCVAL(LOCALE_SNATIVELANGNAME,"") */
+/* LOCVAL(LOCALE_ICOUNTRY,"") */
+/* LOCVAL(LOCALE_SCOUNTRY,"") */
+/* LOCVAL(LOCALE_SENGCOUNTRY,"") */
+/* LOCVAL(LOCALE_SABBREVCTRYNAME,"") */
+/* LOCVAL(LOCALE_SNATIVECTRYNAME,"") */
+/* LOCVAL(LOCALE_IDEFAULTLANGUAGE,"") */
+/* LOCVAL(LOCALE_IDEFAULTCOUNTRY,"") */
+/* LOCVAL(LOCALE_IDEFAULTCODEPAGE) */
+/* LOCVAL(LOCALE_IDEFAULTANSICODEPAGE) */
+/* LOCVAL(LOCALE_SLIST,"") */
+/* LOCVAL(LOCALE_IMEASURE,"") */
+/* LOCVAL(LOCALE_SDECIMAL,"") */
+/* LOCVAL(LOCALE_STHOUSAND,"") */
+/* LOCVAL(LOCALE_SGROUPING) */
+/* LOCVAL(LOCALE_IDIGITS,"2") */
+/* LOCVAL(LOCALE_ILZERO,"1") */
+/* LOCVAL(LOCALE_INEGNUMBER) */
+/* LOCVAL(LOCALE_SNATIVEDIGITS) */
+/* LOCVAL(LOCALE_SCURRENCY,"") */
+/* LOCVAL(LOCALE_SINTLSYMBOL) */
+/* LOCVAL(LOCALE_SMONDECIMALSEP,",") */
+/* LOCVAL(LOCALE_SMONTHOUSANDSEP,".") */
+/* LOCVAL(LOCALE_SMONGROUPING) */
+/* LOCVAL(LOCALE_ICURRDIGITS,"2") */
+/* LOCVAL(LOCALE_IINTLCURRDIGITS) */
+/* LOCVAL(LOCALE_ICURRENCY,"3") */
+/* LOCVAL(LOCALE_INEGCURR,"8") */
+/* LOCVAL(LOCALE_SDATE,".") */
+/* LOCVAL(LOCALE_STIME,":") */
+/* LOCVAL(LOCALE_SSHORTDATE,"dd/MM-yyyy") */
+/* LOCVAL(LOCALE_SLONGDATE,"ddd, d. MMMM yyyy") */
+/* LOCVAL(LOCALE_STIMEFORMAT) */
+/* LOCVAL(LOCALE_IDATE,"1") */
+/* LOCVAL(LOCALE_ILDATE) */
+/* LOCVAL(LOCALE_ITIME,"1")
+/* LOCVAL(LOCALE_ITIMEMARKPOSN) */
+/* LOCVAL(LOCALE_ICENTURY) */
+/* LOCVAL(LOCALE_ITLZERO,"1")
+/* LOCVAL(LOCALE_IDAYLZERO) */
+/* LOCVAL(LOCALE_IMONLZERO) */
+/* LOCVAL(LOCALE_S1159, "") */
+/* LOCVAL(LOCALE_S2359, "") */
+/* LOCVAL(LOCALE_ICALENDARTYPE) */
+/* LOCVAL(LOCALE_IOPTIONALCALENDAR) */
+/* LOCVAL(LOCALE_IFIRSTDAYOFWEEK) */
+/* LOCVAL(LOCALE_IFIRSTWEEKOFYEAR) */
+
+/* LOCVAL(LOCALE_SDAYNAME1,"") */
+/* LOCVAL(LOCALE_SDAYNAME2,"") */
+/* LOCVAL(LOCALE_SDAYNAME3,"") */
+/* LOCVAL(LOCALE_SDAYNAME4,"") */
+/* LOCVAL(LOCALE_SDAYNAME5,"") */
+/* LOCVAL(LOCALE_SDAYNAME6,"") */
+/* LOCVAL(LOCALE_SDAYNAME7,"") */
+
+/* LOCVAL(LOCALE_SABBREVDAYNAME1,"Ma") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME2,"Ti") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME3,"On") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME4,"To") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME5,"Fr") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME6,"Lø") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME7,"Sø") */
+
+/* LOCVAL(LOCALE_SMONTHNAME1,"") */
+/* LOCVAL(LOCALE_SMONTHNAME2,"") */
+/* LOCVAL(LOCALE_SMONTHNAME3,"") */
+/* LOCVAL(LOCALE_SMONTHNAME4,"") */
+/* LOCVAL(LOCALE_SMONTHNAME5,"") */
+/* LOCVAL(LOCALE_SMONTHNAME6,"") */
+/* LOCVAL(LOCALE_SMONTHNAME7,"") */
+/* LOCVAL(LOCALE_SMONTHNAME8,"") */
+/* LOCVAL(LOCALE_SMONTHNAME9,"") */
+/* LOCVAL(LOCALE_SMONTHNAME10,"") */
+/* LOCVAL(LOCALE_SMONTHNAME11,"") */
+/* LOCVAL(LOCALE_SMONTHNAME12,"") */
+/* LOCVAL(LOCALE_SMONTHNAME13,"") */
+
+/* LOCVAL(LOCALE_SABBREVMONTHNAME1,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME2,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME3,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME4,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME5,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME6,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME7,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME8,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME9,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME10,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME11,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME12,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME13,"") */
+
+/* LOCVAL(LOCALE_SPOSITIVESIGN, "") */
+/* LOCVAL(LOCALE_SNEGATIVESIGN, "") */
+/* LOCVAL(LOCALE_IPOSSIGNPOSN, "") */
+/* LOCVAL(LOCALE_INEGSIGNPOSN, "") */
+/* LOCVAL(LOCALE_IPOSSYMPRECEDES, "") */
+/* LOCVAL(LOCALE_IPOSSEPBYSPACE, "") */
+/* LOCVAL(LOCALE_INEGSYMPRECEDES, "") */
+/* LOCVAL(LOCALE_INEGSEPBYSPACE, "") */
+
diff --git a/ole/nls/non.nls b/ole/nls/non.nls
new file mode 100644
index 0000000..aa92e74
--- /dev/null
+++ b/ole/nls/non.nls
@@ -0,0 +1,110 @@
+/*
+ *	OLE2NLS library
+ *      Norway (Nynorsk)
+ */
+
+/* LOCVAL(LOCALE_ILANGUAGE,"") */
+/* LOCVAL(LOCALE_SLANGUAGE,"") */
+/* LOCVAL(LOCALE_SENGLANGUAGE,"") */
+LOCVAL(LOCALE_SABBREVLANGNAME,"non")
+/* LOCVAL(LOCALE_SNATIVELANGNAME,"") */
+/* LOCVAL(LOCALE_ICOUNTRY,"") */
+/* LOCVAL(LOCALE_SCOUNTRY,"") */
+/* LOCVAL(LOCALE_SENGCOUNTRY,"") */
+/* LOCVAL(LOCALE_SABBREVCTRYNAME,"") */
+/* LOCVAL(LOCALE_SNATIVECTRYNAME,"") */
+/* LOCVAL(LOCALE_IDEFAULTLANGUAGE,"") */
+/* LOCVAL(LOCALE_IDEFAULTCOUNTRY,"") */
+/* LOCVAL(LOCALE_IDEFAULTCODEPAGE) */
+/* LOCVAL(LOCALE_IDEFAULTANSICODEPAGE) */
+/* LOCVAL(LOCALE_SLIST,"") */
+/* LOCVAL(LOCALE_IMEASURE,"") */
+/* LOCVAL(LOCALE_SDECIMAL,"") */
+/* LOCVAL(LOCALE_STHOUSAND,"") */
+/* LOCVAL(LOCALE_SGROUPING) */
+/* LOCVAL(LOCALE_IDIGITS,"2") */
+/* LOCVAL(LOCALE_ILZERO,"1") */
+/* LOCVAL(LOCALE_INEGNUMBER) */
+/* LOCVAL(LOCALE_SNATIVEDIGITS) */
+/* LOCVAL(LOCALE_SCURRENCY,"") */
+/* LOCVAL(LOCALE_SINTLSYMBOL) */
+/* LOCVAL(LOCALE_SMONDECIMALSEP,",") */
+/* LOCVAL(LOCALE_SMONTHOUSANDSEP,".") */
+/* LOCVAL(LOCALE_SMONGROUPING) */
+/* LOCVAL(LOCALE_ICURRDIGITS,"2") */
+/* LOCVAL(LOCALE_IINTLCURRDIGITS) */
+/* LOCVAL(LOCALE_ICURRENCY,"3") */
+/* LOCVAL(LOCALE_INEGCURR,"8") */
+/* LOCVAL(LOCALE_SDATE,".") */
+/* LOCVAL(LOCALE_STIME,":") */
+/* LOCVAL(LOCALE_SSHORTDATE,"dd/MM-yyyy") */
+/* LOCVAL(LOCALE_SLONGDATE,"ddd, d. MMMM yyyy") */
+/* LOCVAL(LOCALE_STIMEFORMAT) */
+/* LOCVAL(LOCALE_IDATE,"1") */
+/* LOCVAL(LOCALE_ILDATE) */
+/* LOCVAL(LOCALE_ITIME,"1")
+/* LOCVAL(LOCALE_ITIMEMARKPOSN) */
+/* LOCVAL(LOCALE_ICENTURY) */
+/* LOCVAL(LOCALE_ITLZERO,"1")
+/* LOCVAL(LOCALE_IDAYLZERO) */
+/* LOCVAL(LOCALE_IMONLZERO) */
+/* LOCVAL(LOCALE_S1159, "") */
+/* LOCVAL(LOCALE_S2359, "") */
+/* LOCVAL(LOCALE_ICALENDARTYPE) */
+/* LOCVAL(LOCALE_IOPTIONALCALENDAR) */
+/* LOCVAL(LOCALE_IFIRSTDAYOFWEEK) */
+/* LOCVAL(LOCALE_IFIRSTWEEKOFYEAR) */
+
+/* LOCVAL(LOCALE_SDAYNAME1,"") */
+/* LOCVAL(LOCALE_SDAYNAME2,"") */
+/* LOCVAL(LOCALE_SDAYNAME3,"") */
+/* LOCVAL(LOCALE_SDAYNAME4,"") */
+/* LOCVAL(LOCALE_SDAYNAME5,"") */
+/* LOCVAL(LOCALE_SDAYNAME6,"") */
+/* LOCVAL(LOCALE_SDAYNAME7,"") */
+
+/* LOCVAL(LOCALE_SABBREVDAYNAME1,"Ma") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME2,"Ti") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME3,"On") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME4,"To") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME5,"Fr") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME6,"Lø") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME7,"Sø") */
+
+/* LOCVAL(LOCALE_SMONTHNAME1,"") */
+/* LOCVAL(LOCALE_SMONTHNAME2,"") */
+/* LOCVAL(LOCALE_SMONTHNAME3,"") */
+/* LOCVAL(LOCALE_SMONTHNAME4,"") */
+/* LOCVAL(LOCALE_SMONTHNAME5,"") */
+/* LOCVAL(LOCALE_SMONTHNAME6,"") */
+/* LOCVAL(LOCALE_SMONTHNAME7,"") */
+/* LOCVAL(LOCALE_SMONTHNAME8,"") */
+/* LOCVAL(LOCALE_SMONTHNAME9,"") */
+/* LOCVAL(LOCALE_SMONTHNAME10,"") */
+/* LOCVAL(LOCALE_SMONTHNAME11,"") */
+/* LOCVAL(LOCALE_SMONTHNAME12,"") */
+/* LOCVAL(LOCALE_SMONTHNAME13,"") */
+
+/* LOCVAL(LOCALE_SABBREVMONTHNAME1,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME2,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME3,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME4,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME5,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME6,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME7,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME8,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME9,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME10,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME11,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME12,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME13,"") */
+
+/* LOCVAL(LOCALE_SPOSITIVESIGN, "") */
+/* LOCVAL(LOCALE_SNEGATIVESIGN, "") */
+/* LOCVAL(LOCALE_IPOSSIGNPOSN, "") */
+/* LOCVAL(LOCALE_INEGSIGNPOSN, "") */
+/* LOCVAL(LOCALE_IPOSSYMPRECEDES, "") */
+/* LOCVAL(LOCALE_IPOSSEPBYSPACE, "") */
+/* LOCVAL(LOCALE_INEGSYMPRECEDES, "") */
+/* LOCVAL(LOCALE_INEGSEPBYSPACE, "") */
+
diff --git a/ole/nls/nor.nls b/ole/nls/nor.nls
new file mode 100644
index 0000000..90e44fd
--- /dev/null
+++ b/ole/nls/nor.nls
@@ -0,0 +1,110 @@
+/*
+ *	OLE2NLS library
+ *      Norway (Bokm?l)
+ */
+
+/* LOCVAL(LOCALE_ILANGUAGE,"") */
+/* LOCVAL(LOCALE_SLANGUAGE,"") */
+/* LOCVAL(LOCALE_SENGLANGUAGE,"") */
+LOCVAL(LOCALE_SABBREVLANGNAME,"nor")
+/* LOCVAL(LOCALE_SNATIVELANGNAME,"") */
+/* LOCVAL(LOCALE_ICOUNTRY,"") */
+/* LOCVAL(LOCALE_SCOUNTRY,"") */
+/* LOCVAL(LOCALE_SENGCOUNTRY,"") */
+/* LOCVAL(LOCALE_SABBREVCTRYNAME,"") */
+/* LOCVAL(LOCALE_SNATIVECTRYNAME,"") */
+/* LOCVAL(LOCALE_IDEFAULTLANGUAGE,"") */
+/* LOCVAL(LOCALE_IDEFAULTCOUNTRY,"") */
+/* LOCVAL(LOCALE_IDEFAULTCODEPAGE) */
+/* LOCVAL(LOCALE_IDEFAULTANSICODEPAGE) */
+/* LOCVAL(LOCALE_SLIST,"") */
+/* LOCVAL(LOCALE_IMEASURE,"") */
+/* LOCVAL(LOCALE_SDECIMAL,"") */
+/* LOCVAL(LOCALE_STHOUSAND,"") */
+/* LOCVAL(LOCALE_SGROUPING) */
+/* LOCVAL(LOCALE_IDIGITS,"2") */
+/* LOCVAL(LOCALE_ILZERO,"1") */
+/* LOCVAL(LOCALE_INEGNUMBER) */
+/* LOCVAL(LOCALE_SNATIVEDIGITS) */
+/* LOCVAL(LOCALE_SCURRENCY,"") */
+/* LOCVAL(LOCALE_SINTLSYMBOL) */
+/* LOCVAL(LOCALE_SMONDECIMALSEP,",") */
+/* LOCVAL(LOCALE_SMONTHOUSANDSEP,".") */
+/* LOCVAL(LOCALE_SMONGROUPING) */
+/* LOCVAL(LOCALE_ICURRDIGITS,"2") */
+/* LOCVAL(LOCALE_IINTLCURRDIGITS) */
+/* LOCVAL(LOCALE_ICURRENCY,"3") */
+/* LOCVAL(LOCALE_INEGCURR,"8") */
+/* LOCVAL(LOCALE_SDATE,".") */
+/* LOCVAL(LOCALE_STIME,":") */
+/* LOCVAL(LOCALE_SSHORTDATE,"dd/MM-yyyy") */
+/* LOCVAL(LOCALE_SLONGDATE,"ddd, d. MMMM yyyy") */
+/* LOCVAL(LOCALE_STIMEFORMAT) */
+/* LOCVAL(LOCALE_IDATE,"1") */
+/* LOCVAL(LOCALE_ILDATE) */
+/* LOCVAL(LOCALE_ITIME,"1")
+/* LOCVAL(LOCALE_ITIMEMARKPOSN) */
+/* LOCVAL(LOCALE_ICENTURY) */
+/* LOCVAL(LOCALE_ITLZERO,"1")
+/* LOCVAL(LOCALE_IDAYLZERO) */
+/* LOCVAL(LOCALE_IMONLZERO) */
+/* LOCVAL(LOCALE_S1159, "") */
+/* LOCVAL(LOCALE_S2359, "") */
+/* LOCVAL(LOCALE_ICALENDARTYPE) */
+/* LOCVAL(LOCALE_IOPTIONALCALENDAR) */
+/* LOCVAL(LOCALE_IFIRSTDAYOFWEEK) */
+/* LOCVAL(LOCALE_IFIRSTWEEKOFYEAR) */
+
+/* LOCVAL(LOCALE_SDAYNAME1,"") */
+/* LOCVAL(LOCALE_SDAYNAME2,"") */
+/* LOCVAL(LOCALE_SDAYNAME3,"") */
+/* LOCVAL(LOCALE_SDAYNAME4,"") */
+/* LOCVAL(LOCALE_SDAYNAME5,"") */
+/* LOCVAL(LOCALE_SDAYNAME6,"") */
+/* LOCVAL(LOCALE_SDAYNAME7,"") */
+
+/* LOCVAL(LOCALE_SABBREVDAYNAME1,"Ma") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME2,"Ti") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME3,"On") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME4,"To") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME5,"Fr") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME6,"Lø") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME7,"Sø") */
+
+/* LOCVAL(LOCALE_SMONTHNAME1,"") */
+/* LOCVAL(LOCALE_SMONTHNAME2,"") */
+/* LOCVAL(LOCALE_SMONTHNAME3,"") */
+/* LOCVAL(LOCALE_SMONTHNAME4,"") */
+/* LOCVAL(LOCALE_SMONTHNAME5,"") */
+/* LOCVAL(LOCALE_SMONTHNAME6,"") */
+/* LOCVAL(LOCALE_SMONTHNAME7,"") */
+/* LOCVAL(LOCALE_SMONTHNAME8,"") */
+/* LOCVAL(LOCALE_SMONTHNAME9,"") */
+/* LOCVAL(LOCALE_SMONTHNAME10,"") */
+/* LOCVAL(LOCALE_SMONTHNAME11,"") */
+/* LOCVAL(LOCALE_SMONTHNAME12,"") */
+/* LOCVAL(LOCALE_SMONTHNAME13,"") */
+
+/* LOCVAL(LOCALE_SABBREVMONTHNAME1,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME2,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME3,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME4,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME5,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME6,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME7,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME8,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME9,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME10,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME11,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME12,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME13,"") */
+
+/* LOCVAL(LOCALE_SPOSITIVESIGN, "") */
+/* LOCVAL(LOCALE_SNEGATIVESIGN, "") */
+/* LOCVAL(LOCALE_IPOSSIGNPOSN, "") */
+/* LOCVAL(LOCALE_INEGSIGNPOSN, "") */
+/* LOCVAL(LOCALE_IPOSSYMPRECEDES, "") */
+/* LOCVAL(LOCALE_IPOSSEPBYSPACE, "") */
+/* LOCVAL(LOCALE_INEGSYMPRECEDES, "") */
+/* LOCVAL(LOCALE_INEGSEPBYSPACE, "") */
+
diff --git a/ole/nls/plk.nls b/ole/nls/plk.nls
new file mode 100644
index 0000000..7474c88
--- /dev/null
+++ b/ole/nls/plk.nls
@@ -0,0 +1,109 @@
+/*
+ *	OLE2NLS library
+ *      Poland
+ */
+        
+LOCVAL(LOCALE_ILANGUAGE,"9")
+LOCVAL(LOCALE_SLANGUAGE,"Polski")
+LOCVAL(LOCALE_SENGLANGUAGE,"Polish")
+LOCVAL(LOCALE_SABBREVLANGNAME, "plk")
+LOCVAL(LOCALE_SNATIVELANGNAME,"Polski")
+LOCVAL(LOCALE_ICOUNTRY,"49")
+LOCVAL(LOCALE_SCOUNTRY,"Polska")
+LOCVAL(LOCALE_SENGCOUNTRY,"Poland")
+LOCVAL(LOCALE_SABBREVCTRYNAME,"Pl")
+LOCVAL(LOCALE_SNATIVECTRYNAME,"Polska")
+LOCVAL(LOCALE_IDEFAULTLANGUAGE,"9")
+LOCVAL(LOCALE_IDEFAULTCOUNTRY,"49")
+LOCVAL(LOCALE_IDEFAULTCODEPAGE,"1252")
+LOCVAL(LOCALE_IDEFAULTANSICODEPAGE,"1252")
+LOCVAL(LOCALE_SLIST,";")
+LOCVAL(LOCALE_IMEASURE,"0")
+LOCVAL(LOCALE_SDECIMAL,",")
+LOCVAL(LOCALE_STHOUSAND," ")
+/* LOCVAL(LOCALE_SGROUPING) */
+LOCVAL(LOCALE_IDIGITS,"2")
+LOCVAL(LOCALE_ILZERO,"1")
+/* LOCVAL(LOCALE_INEGNUMBER) */
+/* LOCVAL(LOCALE_SNATIVEDIGITS) */
+LOCVAL(LOCALE_SCURRENCY,"z\xB3")
+/* LOCVAL(LOCALE_SINTLSYMBOL) */
+/* LOCVAL(LOCALE_SMONDECIMALSEP) */
+/* LOCVAL(LOCALE_SMONTHOUSANDSEP) */
+/* LOCVAL(LOCALE_SMONGROUPING) */
+LOCVAL(LOCALE_ICURRDIGITS,"2")
+/* LOCVAL(LOCALE_IINTLCURRDIGITS) */
+LOCVAL(LOCALE_ICURRENCY,"3")
+LOCVAL(LOCALE_INEGCURR,"8")
+LOCVAL(LOCALE_SDATE,".")
+LOCVAL(LOCALE_STIME,":")
+LOCVAL(LOCALE_SSHORTDATE,"dd.MM.yyyy")
+LOCVAL(LOCALE_SLONGDATE,"ddd, d. MMMM yyyy")
+/* LOCVAL(LOCALE_STIMEFORMAT) */
+LOCVAL(LOCALE_IDATE,"1")
+/* LOCVAL(LOCALE_ILDATE) */
+LOCVAL(LOCALE_ITIME,"1")
+/* LOCVAL(LOCALE_ITIMEMARKPOSN) */
+/* LOCVAL(LOCALE_ICENTURY) */
+LOCVAL(LOCALE_ITLZERO,"1")
+/* LOCVAL(LOCALE_IDAYLZERO) */
+/* LOCVAL(LOCALE_IMONLZERO) */
+/* LOCVAL(LOCALE_S1159) */
+/* LOCVAL(LOCALE_S2359) */
+/* LOCVAL(LOCALE_ICALENDARTYPE) */
+/* LOCVAL(LOCALE_IOPTIONALCALENDAR) */
+/* LOCVAL(LOCALE_IFIRSTDAYOFWEEK) */
+/* LOCVAL(LOCALE_IFIRSTWEEKOFYEAR) */
+
+LOCVAL(LOCALE_SDAYNAME1,"Poniedzia\263ek")
+LOCVAL(LOCALE_SDAYNAME2,"Wtorek")
+LOCVAL(LOCALE_SDAYNAME3,"Sroda")
+LOCVAL(LOCALE_SDAYNAME4,"Czwartek")
+LOCVAL(LOCALE_SDAYNAME5,"Pi\xB9tek")
+LOCVAL(LOCALE_SDAYNAME6,"Sobota")
+LOCVAL(LOCALE_SDAYNAME7,"Niedziela")
+
+LOCVAL(LOCALE_SABBREVDAYNAME1,"Po")
+LOCVAL(LOCALE_SABBREVDAYNAME2,"Wt")
+LOCVAL(LOCALE_SABBREVDAYNAME3,"Sr")
+LOCVAL(LOCALE_SABBREVDAYNAME4,"Cz")
+LOCVAL(LOCALE_SABBREVDAYNAME5,"Pt")
+LOCVAL(LOCALE_SABBREVDAYNAME6,"So")
+LOCVAL(LOCALE_SABBREVDAYNAME7,"Ni")
+
+LOCVAL(LOCALE_SMONTHNAME1,"Stycze\xF1")
+LOCVAL(LOCALE_SMONTHNAME2,"Luty")
+LOCVAL(LOCALE_SMONTHNAME3,"Marzec")
+LOCVAL(LOCALE_SMONTHNAME4,"Kwiecie\xF1")
+LOCVAL(LOCALE_SMONTHNAME5,"Maj")
+LOCVAL(LOCALE_SMONTHNAME6,"Czerwiec")
+LOCVAL(LOCALE_SMONTHNAME7,"Lipiec")
+LOCVAL(LOCALE_SMONTHNAME8,"Sierpie\xF1")
+LOCVAL(LOCALE_SMONTHNAME9,"Wrzesie\xF1")
+LOCVAL(LOCALE_SMONTHNAME10,"Pa\237dziernik")
+LOCVAL(LOCALE_SMONTHNAME11,"Listapad")
+LOCVAL(LOCALE_SMONTHNAME12,"Grudzie\xF1")
+LOCVAL(LOCALE_SMONTHNAME13,"")
+
+LOCVAL(LOCALE_SABBREVMONTHNAME1,"Sty")
+LOCVAL(LOCALE_SABBREVMONTHNAME2,"Lut")
+LOCVAL(LOCALE_SABBREVMONTHNAME3,"Mar")
+LOCVAL(LOCALE_SABBREVMONTHNAME4,"Kwi")
+LOCVAL(LOCALE_SABBREVMONTHNAME5,"Maj")
+LOCVAL(LOCALE_SABBREVMONTHNAME6,"Cze")
+LOCVAL(LOCALE_SABBREVMONTHNAME7,"Lip")
+LOCVAL(LOCALE_SABBREVMONTHNAME8,"Sie")
+LOCVAL(LOCALE_SABBREVMONTHNAME9,"Wrz")
+LOCVAL(LOCALE_SABBREVMONTHNAME10,"Pa\x9F")
+LOCVAL(LOCALE_SABBREVMONTHNAME11,"Lis")
+LOCVAL(LOCALE_SABBREVMONTHNAME12,"Gru")
+LOCVAL(LOCALE_SABBREVMONTHNAME13,"")
+
+/* LOCVAL(LOCALE_SPOSITIVESIGN) */
+/* LOCVAL(LOCALE_SNEGATIVESIGN) */
+/* LOCVAL(LOCALE_IPOSSIGNPOSN) */
+/* LOCVAL(LOCALE_INEGSIGNPOSN) */
+/* LOCVAL(LOCALE_IPOSSYMPRECEDES) */
+/* LOCVAL(LOCALE_IPOSSEPBYSPACE) */
+/* LOCVAL(LOCALE_INEGSYMPRECEDES) */
+/* LOCVAL(LOCALE_INEGSEPBYSPACE) */
diff --git a/ole/nls/prc.nls b/ole/nls/prc.nls
new file mode 100644
index 0000000..b46252c
--- /dev/null
+++ b/ole/nls/prc.nls
@@ -0,0 +1,110 @@
+/*
+ *	OLE2NLS library
+ *      People's republic of China
+ */
+
+/* LOCVAL(LOCALE_ILANGUAGE,"") */
+/* LOCVAL(LOCALE_SLANGUAGE,"") */
+/* LOCVAL(LOCALE_SENGLANGUAGE,"People's republic of China") */
+LOCVAL(LOCALE_SABBREVLANGNAME,"prc")
+/* LOCVAL(LOCALE_SNATIVELANGNAME,"") */
+/* LOCVAL(LOCALE_ICOUNTRY,"") */
+/* LOCVAL(LOCALE_SCOUNTRY,"") */
+/* LOCVAL(LOCALE_SENGCOUNTRY,"") */
+/* LOCVAL(LOCALE_SABBREVCTRYNAME,"") */
+/* LOCVAL(LOCALE_SNATIVECTRYNAME,"") */
+/* LOCVAL(LOCALE_IDEFAULTLANGUAGE,"") */
+/* LOCVAL(LOCALE_IDEFAULTCOUNTRY,"") */
+/* LOCVAL(LOCALE_IDEFAULTCODEPAGE) */
+/* LOCVAL(LOCALE_IDEFAULTANSICODEPAGE) */
+/* LOCVAL(LOCALE_SLIST,"") */
+/* LOCVAL(LOCALE_IMEASURE,"") */
+/* LOCVAL(LOCALE_SDECIMAL,"") */
+/* LOCVAL(LOCALE_STHOUSAND,"") */
+/* LOCVAL(LOCALE_SGROUPING) */
+/* LOCVAL(LOCALE_IDIGITS,"2") */
+/* LOCVAL(LOCALE_ILZERO,"1") */
+/* LOCVAL(LOCALE_INEGNUMBER) */
+/* LOCVAL(LOCALE_SNATIVEDIGITS) */
+/* LOCVAL(LOCALE_SCURRENCY,"") */
+/* LOCVAL(LOCALE_SINTLSYMBOL) */
+/* LOCVAL(LOCALE_SMONDECIMALSEP,",") */
+/* LOCVAL(LOCALE_SMONTHOUSANDSEP,".") */
+/* LOCVAL(LOCALE_SMONGROUPING) */
+/* LOCVAL(LOCALE_ICURRDIGITS,"2") */
+/* LOCVAL(LOCALE_IINTLCURRDIGITS) */
+/* LOCVAL(LOCALE_ICURRENCY,"3") */
+/* LOCVAL(LOCALE_INEGCURR,"8") */
+/* LOCVAL(LOCALE_SDATE,".") */
+/* LOCVAL(LOCALE_STIME,":") */
+/* LOCVAL(LOCALE_SSHORTDATE,"dd/MM-yyyy") */
+/* LOCVAL(LOCALE_SLONGDATE,"ddd, d. MMMM yyyy") */
+/* LOCVAL(LOCALE_STIMEFORMAT) */
+/* LOCVAL(LOCALE_IDATE,"1") */
+/* LOCVAL(LOCALE_ILDATE) */
+/* LOCVAL(LOCALE_ITIME,"1")
+/* LOCVAL(LOCALE_ITIMEMARKPOSN) */
+/* LOCVAL(LOCALE_ICENTURY) */
+/* LOCVAL(LOCALE_ITLZERO,"1")
+/* LOCVAL(LOCALE_IDAYLZERO) */
+/* LOCVAL(LOCALE_IMONLZERO) */
+/* LOCVAL(LOCALE_S1159, "") */
+/* LOCVAL(LOCALE_S2359, "") */
+/* LOCVAL(LOCALE_ICALENDARTYPE) */
+/* LOCVAL(LOCALE_IOPTIONALCALENDAR) */
+/* LOCVAL(LOCALE_IFIRSTDAYOFWEEK) */
+/* LOCVAL(LOCALE_IFIRSTWEEKOFYEAR) */
+
+/* LOCVAL(LOCALE_SDAYNAME1,"") */
+/* LOCVAL(LOCALE_SDAYNAME2,"") */
+/* LOCVAL(LOCALE_SDAYNAME3,"") */
+/* LOCVAL(LOCALE_SDAYNAME4,"") */
+/* LOCVAL(LOCALE_SDAYNAME5,"") */
+/* LOCVAL(LOCALE_SDAYNAME6,"") */
+/* LOCVAL(LOCALE_SDAYNAME7,"") */
+
+/* LOCVAL(LOCALE_SABBREVDAYNAME1,"Ma") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME2,"Ti") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME3,"On") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME4,"To") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME5,"Fr") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME6,"Lø") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME7,"Sø") */
+
+/* LOCVAL(LOCALE_SMONTHNAME1,"") */
+/* LOCVAL(LOCALE_SMONTHNAME2,"") */
+/* LOCVAL(LOCALE_SMONTHNAME3,"") */
+/* LOCVAL(LOCALE_SMONTHNAME4,"") */
+/* LOCVAL(LOCALE_SMONTHNAME5,"") */
+/* LOCVAL(LOCALE_SMONTHNAME6,"") */
+/* LOCVAL(LOCALE_SMONTHNAME7,"") */
+/* LOCVAL(LOCALE_SMONTHNAME8,"") */
+/* LOCVAL(LOCALE_SMONTHNAME9,"") */
+/* LOCVAL(LOCALE_SMONTHNAME10,"") */
+/* LOCVAL(LOCALE_SMONTHNAME11,"") */
+/* LOCVAL(LOCALE_SMONTHNAME12,"") */
+/* LOCVAL(LOCALE_SMONTHNAME13,"") */
+
+/* LOCVAL(LOCALE_SABBREVMONTHNAME1,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME2,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME3,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME4,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME5,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME6,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME7,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME8,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME9,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME10,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME11,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME12,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME13,"") */
+
+/* LOCVAL(LOCALE_SPOSITIVESIGN, "") */
+/* LOCVAL(LOCALE_SNEGATIVESIGN, "") */
+/* LOCVAL(LOCALE_IPOSSIGNPOSN, "") */
+/* LOCVAL(LOCALE_INEGSIGNPOSN, "") */
+/* LOCVAL(LOCALE_IPOSSYMPRECEDES, "") */
+/* LOCVAL(LOCALE_IPOSSEPBYSPACE, "") */
+/* LOCVAL(LOCALE_INEGSYMPRECEDES, "") */
+/* LOCVAL(LOCALE_INEGSEPBYSPACE, "") */
+
diff --git a/ole/nls/ptb.nls b/ole/nls/ptb.nls
new file mode 100644
index 0000000..e60c91e
--- /dev/null
+++ b/ole/nls/ptb.nls
@@ -0,0 +1,109 @@
+/*
+ *	OLE2NLS library
+ *      Brazil
+ */
+
+LOCVAL(LOCALE_ILANGUAGE, "0416")
+LOCVAL(LOCALE_SLANGUAGE, "Portugu\352s (Brasil)")
+LOCVAL(LOCALE_SENGLANGUAGE, "Protuguese")
+LOCVAL(LOCALE_SABBREVLANGNAME, "ptb")
+LOCVAL(LOCALE_SNATIVELANGNAME, "Portugu\352s")
+LOCVAL(LOCALE_ICOUNTRY, "1")
+LOCVAL(LOCALE_SCOUNTRY, "Brasil")
+LOCVAL(LOCALE_SENGCOUNTRY, "Brazil")
+LOCVAL(LOCALE_SABBREVCTRYNAME, "BRA")
+LOCVAL(LOCALE_SNATIVECTRYNAME, "Brasil")
+LOCVAL(LOCALE_IDEFAULTLANGUAGE, "0409")
+LOCVAL(LOCALE_IDEFAULTCOUNTRY, "1")
+LOCVAL(LOCALE_IDEFAULTCODEPAGE, "437")
+LOCVAL(LOCALE_IDEFAULTANSICODEPAGE, "1252")
+LOCVAL(LOCALE_SLIST, ";")
+LOCVAL(LOCALE_IMEASURE, "1")
+LOCVAL(LOCALE_SDECIMAL, ",")
+LOCVAL(LOCALE_STHOUSAND, ".")
+LOCVAL(LOCALE_SGROUPING, "3;0")
+LOCVAL(LOCALE_IDIGITS, "2")
+LOCVAL(LOCALE_ILZERO, "1")
+LOCVAL(LOCALE_INEGNUMBER, "1")
+LOCVAL(LOCALE_SNATIVEDIGITS, "0123456789")
+LOCVAL(LOCALE_SCURRENCY, "$")
+LOCVAL(LOCALE_SINTLSYMBOL, "USD")
+LOCVAL(LOCALE_SMONDECIMALSEP, ",")
+LOCVAL(LOCALE_SMONTHOUSANDSEP, ".")
+LOCVAL(LOCALE_SMONGROUPING, "3;0")
+LOCVAL(LOCALE_ICURRDIGITS, "2")
+LOCVAL(LOCALE_IINTLCURRDIGITS, "2")
+LOCVAL(LOCALE_ICURRENCY, "0")
+LOCVAL(LOCALE_INEGCURR, "0")
+LOCVAL(LOCALE_SDATE, "/")
+LOCVAL(LOCALE_STIME, ":")
+LOCVAL(LOCALE_SSHORTDATE, "dd/MM/yy")
+LOCVAL(LOCALE_SLONGDATE, "dddd, MMMM dd, yyyy")
+LOCVAL(LOCALE_STIMEFORMAT, "h:mm:ss tt")
+LOCVAL(LOCALE_IDATE, "0")
+LOCVAL(LOCALE_ILDATE, "0")
+LOCVAL(LOCALE_ITIME, "0")
+LOCVAL(LOCALE_ITIMEMARKPOSN, "0")
+LOCVAL(LOCALE_ICENTURY, "0")
+LOCVAL(LOCALE_ITLZERO, "0")
+LOCVAL(LOCALE_IDAYLZERO, "0")
+LOCVAL(LOCALE_IMONLZERO, "0")
+LOCVAL(LOCALE_S1159, "AM")
+LOCVAL(LOCALE_S2359, "PM")
+LOCVAL(LOCALE_ICALENDARTYPE, "1")
+LOCVAL(LOCALE_IOPTIONALCALENDAR, "0")
+LOCVAL(LOCALE_IFIRSTDAYOFWEEK, "6")
+LOCVAL(LOCALE_IFIRSTWEEKOFYEAR, "0")
+
+LOCVAL(LOCALE_SDAYNAME1, "Segunda")
+LOCVAL(LOCALE_SDAYNAME2, "Ter\347a")
+LOCVAL(LOCALE_SDAYNAME3, "Quarta")
+LOCVAL(LOCALE_SDAYNAME4, "Quinta")
+LOCVAL(LOCALE_SDAYNAME5, "Sexta")
+LOCVAL(LOCALE_SDAYNAME6, "S\341bado")
+LOCVAL(LOCALE_SDAYNAME7, "Domingo")
+
+LOCVAL(LOCALE_SABBREVDAYNAME1, "Seg")
+LOCVAL(LOCALE_SABBREVDAYNAME2, "Ter")
+LOCVAL(LOCALE_SABBREVDAYNAME3, "Qua")
+LOCVAL(LOCALE_SABBREVDAYNAME4, "Qui")
+LOCVAL(LOCALE_SABBREVDAYNAME5, "Sex")
+LOCVAL(LOCALE_SABBREVDAYNAME6, "S\341b")
+LOCVAL(LOCALE_SABBREVDAYNAME7, "Dom")
+
+LOCVAL(LOCALE_SMONTHNAME1, "Janeiro")
+LOCVAL(LOCALE_SMONTHNAME2, "Fevereiro")
+LOCVAL(LOCALE_SMONTHNAME3, "Mar\347o")
+LOCVAL(LOCALE_SMONTHNAME4, "Abril")
+LOCVAL(LOCALE_SMONTHNAME5, "Maio")
+LOCVAL(LOCALE_SMONTHNAME6, "Junho")
+LOCVAL(LOCALE_SMONTHNAME7, "Julho")
+LOCVAL(LOCALE_SMONTHNAME8, "Agosto")
+LOCVAL(LOCALE_SMONTHNAME9, "Setembro")
+LOCVAL(LOCALE_SMONTHNAME10, "Outubro")
+LOCVAL(LOCALE_SMONTHNAME11, "Novembro")
+LOCVAL(LOCALE_SMONTHNAME12, "Dezembro")
+LOCVAL(LOCALE_SMONTHNAME13, "")
+
+LOCVAL(LOCALE_SABBREVMONTHNAME1, "Jan")
+LOCVAL(LOCALE_SABBREVMONTHNAME2, "Fev")
+LOCVAL(LOCALE_SABBREVMONTHNAME3, "Mar")
+LOCVAL(LOCALE_SABBREVMONTHNAME4, "Abr")
+LOCVAL(LOCALE_SABBREVMONTHNAME5, "Mai")
+LOCVAL(LOCALE_SABBREVMONTHNAME6, "Jun")
+LOCVAL(LOCALE_SABBREVMONTHNAME7, "Jul")
+LOCVAL(LOCALE_SABBREVMONTHNAME8, "Ago")
+LOCVAL(LOCALE_SABBREVMONTHNAME9, "Set")
+LOCVAL(LOCALE_SABBREVMONTHNAME10, "Out")
+LOCVAL(LOCALE_SABBREVMONTHNAME11, "Nov")
+LOCVAL(LOCALE_SABBREVMONTHNAME12, "Dez")
+LOCVAL(LOCALE_SABBREVMONTHNAME13, "")
+
+LOCVAL(LOCALE_SPOSITIVESIGN, "")
+LOCVAL(LOCALE_SNEGATIVESIGN, "-")
+LOCVAL(LOCALE_IPOSSIGNPOSN, "3")
+LOCVAL(LOCALE_INEGSIGNPOSN, "0")
+LOCVAL(LOCALE_IPOSSYMPRECEDES, "1")
+LOCVAL(LOCALE_IPOSSEPBYSPACE, "0")
+LOCVAL(LOCALE_INEGSYMPRECEDES, "1")
+LOCVAL(LOCALE_INEGSEPBYSPACE, "0")
diff --git a/ole/nls/ptg.nls b/ole/nls/ptg.nls
new file mode 100644
index 0000000..ac429d4
--- /dev/null
+++ b/ole/nls/ptg.nls
@@ -0,0 +1,109 @@
+/*
+ *	OLE2NLS library
+ *      Portugal
+ */
+
+LOCVAL(LOCALE_ILANGUAGE, "0416")
+LOCVAL(LOCALE_SLANGUAGE, "Portugu\352s")
+LOCVAL(LOCALE_SENGLANGUAGE, "Protuguese")
+LOCVAL(LOCALE_SABBREVLANGNAME, "ptg")
+LOCVAL(LOCALE_SNATIVELANGNAME, "Portugu\352s")
+LOCVAL(LOCALE_ICOUNTRY, "1")
+LOCVAL(LOCALE_SCOUNTRY, "Portugal")
+LOCVAL(LOCALE_SENGCOUNTRY, "Portugal")
+LOCVAL(LOCALE_SABBREVCTRYNAME, "PTG")
+LOCVAL(LOCALE_SNATIVECTRYNAME, "Portugal")
+LOCVAL(LOCALE_IDEFAULTLANGUAGE, "0409")
+LOCVAL(LOCALE_IDEFAULTCOUNTRY, "1")
+LOCVAL(LOCALE_IDEFAULTCODEPAGE, "437")
+LOCVAL(LOCALE_IDEFAULTANSICODEPAGE, "1252")
+LOCVAL(LOCALE_SLIST, ";")
+LOCVAL(LOCALE_IMEASURE, "1")
+LOCVAL(LOCALE_SDECIMAL, ",")
+LOCVAL(LOCALE_STHOUSAND, ".")
+LOCVAL(LOCALE_SGROUPING, "3;0")
+LOCVAL(LOCALE_IDIGITS, "2")
+LOCVAL(LOCALE_ILZERO, "1")
+LOCVAL(LOCALE_INEGNUMBER, "1")
+LOCVAL(LOCALE_SNATIVEDIGITS, "0123456789")
+LOCVAL(LOCALE_SCURRENCY, "$")
+LOCVAL(LOCALE_SINTLSYMBOL, "USD")
+LOCVAL(LOCALE_SMONDECIMALSEP, ",")
+LOCVAL(LOCALE_SMONTHOUSANDSEP, ".")
+LOCVAL(LOCALE_SMONGROUPING, "3;0")
+LOCVAL(LOCALE_ICURRDIGITS, "2")
+LOCVAL(LOCALE_IINTLCURRDIGITS, "2")
+LOCVAL(LOCALE_ICURRENCY, "0")
+LOCVAL(LOCALE_INEGCURR, "0")
+LOCVAL(LOCALE_SDATE, "/")
+LOCVAL(LOCALE_STIME, ":")
+LOCVAL(LOCALE_SSHORTDATE, "dd/MM/yy")
+LOCVAL(LOCALE_SLONGDATE, "dddd, MMMM dd, yyyy")
+LOCVAL(LOCALE_STIMEFORMAT, "h:mm:ss tt")
+LOCVAL(LOCALE_IDATE, "0")
+LOCVAL(LOCALE_ILDATE, "0")
+LOCVAL(LOCALE_ITIME, "0")
+LOCVAL(LOCALE_ITIMEMARKPOSN, "0")
+LOCVAL(LOCALE_ICENTURY, "0")
+LOCVAL(LOCALE_ITLZERO, "0")
+LOCVAL(LOCALE_IDAYLZERO, "0")
+LOCVAL(LOCALE_IMONLZERO, "0")
+LOCVAL(LOCALE_S1159, "AM")
+LOCVAL(LOCALE_S2359, "PM")
+LOCVAL(LOCALE_ICALENDARTYPE, "1")
+LOCVAL(LOCALE_IOPTIONALCALENDAR, "0")
+LOCVAL(LOCALE_IFIRSTDAYOFWEEK, "6")
+LOCVAL(LOCALE_IFIRSTWEEKOFYEAR, "0")
+
+LOCVAL(LOCALE_SDAYNAME1, "Segunda")
+LOCVAL(LOCALE_SDAYNAME2, "Ter\347a")
+LOCVAL(LOCALE_SDAYNAME3, "Quarta")
+LOCVAL(LOCALE_SDAYNAME4, "Quinta")
+LOCVAL(LOCALE_SDAYNAME5, "Sexta")
+LOCVAL(LOCALE_SDAYNAME6, "S\341bado")
+LOCVAL(LOCALE_SDAYNAME7, "Domingo")
+
+LOCVAL(LOCALE_SABBREVDAYNAME1, "Seg")
+LOCVAL(LOCALE_SABBREVDAYNAME2, "Ter")
+LOCVAL(LOCALE_SABBREVDAYNAME3, "Qua")
+LOCVAL(LOCALE_SABBREVDAYNAME4, "Qui")
+LOCVAL(LOCALE_SABBREVDAYNAME5, "Sex")
+LOCVAL(LOCALE_SABBREVDAYNAME6, "S\341b")
+LOCVAL(LOCALE_SABBREVDAYNAME7, "Dom")
+
+LOCVAL(LOCALE_SMONTHNAME1, "Janeiro")
+LOCVAL(LOCALE_SMONTHNAME2, "Fevereiro")
+LOCVAL(LOCALE_SMONTHNAME3, "Mar\347o")
+LOCVAL(LOCALE_SMONTHNAME4, "Abril")
+LOCVAL(LOCALE_SMONTHNAME5, "Maio")
+LOCVAL(LOCALE_SMONTHNAME6, "Junho")
+LOCVAL(LOCALE_SMONTHNAME7, "Julho")
+LOCVAL(LOCALE_SMONTHNAME8, "Agosto")
+LOCVAL(LOCALE_SMONTHNAME9, "Setembro")
+LOCVAL(LOCALE_SMONTHNAME10, "Outubro")
+LOCVAL(LOCALE_SMONTHNAME11, "Novembro")
+LOCVAL(LOCALE_SMONTHNAME12, "Dezembro")
+LOCVAL(LOCALE_SMONTHNAME13, "")
+
+LOCVAL(LOCALE_SABBREVMONTHNAME1, "Jan")
+LOCVAL(LOCALE_SABBREVMONTHNAME2, "Fev")
+LOCVAL(LOCALE_SABBREVMONTHNAME3, "Mar")
+LOCVAL(LOCALE_SABBREVMONTHNAME4, "Abr")
+LOCVAL(LOCALE_SABBREVMONTHNAME5, "Mai")
+LOCVAL(LOCALE_SABBREVMONTHNAME6, "Jun")
+LOCVAL(LOCALE_SABBREVMONTHNAME7, "Jul")
+LOCVAL(LOCALE_SABBREVMONTHNAME8, "Ago")
+LOCVAL(LOCALE_SABBREVMONTHNAME9, "Set")
+LOCVAL(LOCALE_SABBREVMONTHNAME10, "Out")
+LOCVAL(LOCALE_SABBREVMONTHNAME11, "Nov")
+LOCVAL(LOCALE_SABBREVMONTHNAME12, "Dez")
+LOCVAL(LOCALE_SABBREVMONTHNAME13, "")
+
+LOCVAL(LOCALE_SPOSITIVESIGN, "")
+LOCVAL(LOCALE_SNEGATIVESIGN, "-")
+LOCVAL(LOCALE_IPOSSIGNPOSN, "3")
+LOCVAL(LOCALE_INEGSIGNPOSN, "0")
+LOCVAL(LOCALE_IPOSSYMPRECEDES, "1")
+LOCVAL(LOCALE_IPOSSEPBYSPACE, "0")
+LOCVAL(LOCALE_INEGSYMPRECEDES, "1")
+LOCVAL(LOCALE_INEGSEPBYSPACE, "0")
diff --git a/ole/nls/rom.nls b/ole/nls/rom.nls
new file mode 100644
index 0000000..9caabf7
--- /dev/null
+++ b/ole/nls/rom.nls
@@ -0,0 +1,110 @@
+/*
+ *	OLE2NLS library
+ *      Romania
+ */
+
+/* LOCVAL(LOCALE_ILANGUAGE,"") */
+/* LOCVAL(LOCALE_SLANGUAGE,"") */
+/* LOCVAL(LOCALE_SENGLANGUAGE,"") */
+LOCVAL(LOCALE_SABBREVLANGNAME,"rom")
+/* LOCVAL(LOCALE_SNATIVELANGNAME,"") */
+/* LOCVAL(LOCALE_ICOUNTRY,"") */
+/* LOCVAL(LOCALE_SCOUNTRY,"") */
+/* LOCVAL(LOCALE_SENGCOUNTRY,"") */
+/* LOCVAL(LOCALE_SABBREVCTRYNAME,"") */
+/* LOCVAL(LOCALE_SNATIVECTRYNAME,"") */
+/* LOCVAL(LOCALE_IDEFAULTLANGUAGE,"") */
+/* LOCVAL(LOCALE_IDEFAULTCOUNTRY,"") */
+/* LOCVAL(LOCALE_IDEFAULTCODEPAGE) */
+/* LOCVAL(LOCALE_IDEFAULTANSICODEPAGE) */
+/* LOCVAL(LOCALE_SLIST,"") */
+/* LOCVAL(LOCALE_IMEASURE,"") */
+/* LOCVAL(LOCALE_SDECIMAL,"") */
+/* LOCVAL(LOCALE_STHOUSAND,"") */
+/* LOCVAL(LOCALE_SGROUPING) */
+/* LOCVAL(LOCALE_IDIGITS,"2") */
+/* LOCVAL(LOCALE_ILZERO,"1") */
+/* LOCVAL(LOCALE_INEGNUMBER) */
+/* LOCVAL(LOCALE_SNATIVEDIGITS) */
+/* LOCVAL(LOCALE_SCURRENCY,"") */
+/* LOCVAL(LOCALE_SINTLSYMBOL) */
+/* LOCVAL(LOCALE_SMONDECIMALSEP,",") */
+/* LOCVAL(LOCALE_SMONTHOUSANDSEP,".") */
+/* LOCVAL(LOCALE_SMONGROUPING) */
+/* LOCVAL(LOCALE_ICURRDIGITS,"2") */
+/* LOCVAL(LOCALE_IINTLCURRDIGITS) */
+/* LOCVAL(LOCALE_ICURRENCY,"3") */
+/* LOCVAL(LOCALE_INEGCURR,"8") */
+/* LOCVAL(LOCALE_SDATE,".") */
+/* LOCVAL(LOCALE_STIME,":") */
+/* LOCVAL(LOCALE_SSHORTDATE,"dd/MM-yyyy") */
+/* LOCVAL(LOCALE_SLONGDATE,"ddd, d. MMMM yyyy") */
+/* LOCVAL(LOCALE_STIMEFORMAT) */
+/* LOCVAL(LOCALE_IDATE,"1") */
+/* LOCVAL(LOCALE_ILDATE) */
+/* LOCVAL(LOCALE_ITIME,"1")
+/* LOCVAL(LOCALE_ITIMEMARKPOSN) */
+/* LOCVAL(LOCALE_ICENTURY) */
+/* LOCVAL(LOCALE_ITLZERO,"1")
+/* LOCVAL(LOCALE_IDAYLZERO) */
+/* LOCVAL(LOCALE_IMONLZERO) */
+/* LOCVAL(LOCALE_S1159, "") */
+/* LOCVAL(LOCALE_S2359, "") */
+/* LOCVAL(LOCALE_ICALENDARTYPE) */
+/* LOCVAL(LOCALE_IOPTIONALCALENDAR) */
+/* LOCVAL(LOCALE_IFIRSTDAYOFWEEK) */
+/* LOCVAL(LOCALE_IFIRSTWEEKOFYEAR) */
+
+/* LOCVAL(LOCALE_SDAYNAME1,"") */
+/* LOCVAL(LOCALE_SDAYNAME2,"") */
+/* LOCVAL(LOCALE_SDAYNAME3,"") */
+/* LOCVAL(LOCALE_SDAYNAME4,"") */
+/* LOCVAL(LOCALE_SDAYNAME5,"") */
+/* LOCVAL(LOCALE_SDAYNAME6,"") */
+/* LOCVAL(LOCALE_SDAYNAME7,"") */
+
+/* LOCVAL(LOCALE_SABBREVDAYNAME1,"Ma") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME2,"Ti") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME3,"On") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME4,"To") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME5,"Fr") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME6,"Lø") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME7,"Sø") */
+
+/* LOCVAL(LOCALE_SMONTHNAME1,"") */
+/* LOCVAL(LOCALE_SMONTHNAME2,"") */
+/* LOCVAL(LOCALE_SMONTHNAME3,"") */
+/* LOCVAL(LOCALE_SMONTHNAME4,"") */
+/* LOCVAL(LOCALE_SMONTHNAME5,"") */
+/* LOCVAL(LOCALE_SMONTHNAME6,"") */
+/* LOCVAL(LOCALE_SMONTHNAME7,"") */
+/* LOCVAL(LOCALE_SMONTHNAME8,"") */
+/* LOCVAL(LOCALE_SMONTHNAME9,"") */
+/* LOCVAL(LOCALE_SMONTHNAME10,"") */
+/* LOCVAL(LOCALE_SMONTHNAME11,"") */
+/* LOCVAL(LOCALE_SMONTHNAME12,"") */
+/* LOCVAL(LOCALE_SMONTHNAME13,"") */
+
+/* LOCVAL(LOCALE_SABBREVMONTHNAME1,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME2,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME3,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME4,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME5,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME6,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME7,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME8,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME9,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME10,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME11,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME12,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME13,"") */
+
+/* LOCVAL(LOCALE_SPOSITIVESIGN, "") */
+/* LOCVAL(LOCALE_SNEGATIVESIGN, "") */
+/* LOCVAL(LOCALE_IPOSSIGNPOSN, "") */
+/* LOCVAL(LOCALE_INEGSIGNPOSN, "") */
+/* LOCVAL(LOCALE_IPOSSYMPRECEDES, "") */
+/* LOCVAL(LOCALE_IPOSSEPBYSPACE, "") */
+/* LOCVAL(LOCALE_INEGSYMPRECEDES, "") */
+/* LOCVAL(LOCALE_INEGSEPBYSPACE, "") */
+
diff --git a/ole/nls/sgp.nls b/ole/nls/sgp.nls
new file mode 100644
index 0000000..7ca7e4c
--- /dev/null
+++ b/ole/nls/sgp.nls
@@ -0,0 +1,110 @@
+/*
+ *	OLE2NLS library
+ *      Chinese (Singapore)
+ */
+
+/* LOCVAL(LOCALE_ILANGUAGE,"") */
+/* LOCVAL(LOCALE_SLANGUAGE,"") */
+/* LOCVAL(LOCALE_SENGLANGUAGE,"Chinese (Singapore)") */
+LOCVAL(LOCALE_SABBREVLANGNAME,"sgp")
+/* LOCVAL(LOCALE_SNATIVELANGNAME,"") */
+/* LOCVAL(LOCALE_ICOUNTRY,"") */
+/* LOCVAL(LOCALE_SCOUNTRY,"") */
+/* LOCVAL(LOCALE_SENGCOUNTRY,"") */
+/* LOCVAL(LOCALE_SABBREVCTRYNAME,"") */
+/* LOCVAL(LOCALE_SNATIVECTRYNAME,"") */
+/* LOCVAL(LOCALE_IDEFAULTLANGUAGE,"") */
+/* LOCVAL(LOCALE_IDEFAULTCOUNTRY,"") */
+/* LOCVAL(LOCALE_IDEFAULTCODEPAGE) */
+/* LOCVAL(LOCALE_IDEFAULTANSICODEPAGE) */
+/* LOCVAL(LOCALE_SLIST,"") */
+/* LOCVAL(LOCALE_IMEASURE,"") */
+/* LOCVAL(LOCALE_SDECIMAL,"") */
+/* LOCVAL(LOCALE_STHOUSAND,"") */
+/* LOCVAL(LOCALE_SGROUPING) */
+/* LOCVAL(LOCALE_IDIGITS,"2") */
+/* LOCVAL(LOCALE_ILZERO,"1") */
+/* LOCVAL(LOCALE_INEGNUMBER) */
+/* LOCVAL(LOCALE_SNATIVEDIGITS) */
+/* LOCVAL(LOCALE_SCURRENCY,"") */
+/* LOCVAL(LOCALE_SINTLSYMBOL) */
+/* LOCVAL(LOCALE_SMONDECIMALSEP,",") */
+/* LOCVAL(LOCALE_SMONTHOUSANDSEP,".") */
+/* LOCVAL(LOCALE_SMONGROUPING) */
+/* LOCVAL(LOCALE_ICURRDIGITS,"2") */
+/* LOCVAL(LOCALE_IINTLCURRDIGITS) */
+/* LOCVAL(LOCALE_ICURRENCY,"3") */
+/* LOCVAL(LOCALE_INEGCURR,"8") */
+/* LOCVAL(LOCALE_SDATE,".") */
+/* LOCVAL(LOCALE_STIME,":") */
+/* LOCVAL(LOCALE_SSHORTDATE,"dd/MM-yyyy") */
+/* LOCVAL(LOCALE_SLONGDATE,"ddd, d. MMMM yyyy") */
+/* LOCVAL(LOCALE_STIMEFORMAT) */
+/* LOCVAL(LOCALE_IDATE,"1") */
+/* LOCVAL(LOCALE_ILDATE) */
+/* LOCVAL(LOCALE_ITIME,"1")
+/* LOCVAL(LOCALE_ITIMEMARKPOSN) */
+/* LOCVAL(LOCALE_ICENTURY) */
+/* LOCVAL(LOCALE_ITLZERO,"1")
+/* LOCVAL(LOCALE_IDAYLZERO) */
+/* LOCVAL(LOCALE_IMONLZERO) */
+/* LOCVAL(LOCALE_S1159, "") */
+/* LOCVAL(LOCALE_S2359, "") */
+/* LOCVAL(LOCALE_ICALENDARTYPE) */
+/* LOCVAL(LOCALE_IOPTIONALCALENDAR) */
+/* LOCVAL(LOCALE_IFIRSTDAYOFWEEK) */
+/* LOCVAL(LOCALE_IFIRSTWEEKOFYEAR) */
+
+/* LOCVAL(LOCALE_SDAYNAME1,"") */
+/* LOCVAL(LOCALE_SDAYNAME2,"") */
+/* LOCVAL(LOCALE_SDAYNAME3,"") */
+/* LOCVAL(LOCALE_SDAYNAME4,"") */
+/* LOCVAL(LOCALE_SDAYNAME5,"") */
+/* LOCVAL(LOCALE_SDAYNAME6,"") */
+/* LOCVAL(LOCALE_SDAYNAME7,"") */
+
+/* LOCVAL(LOCALE_SABBREVDAYNAME1,"Ma") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME2,"Ti") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME3,"On") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME4,"To") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME5,"Fr") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME6,"Lø") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME7,"Sø") */
+
+/* LOCVAL(LOCALE_SMONTHNAME1,"") */
+/* LOCVAL(LOCALE_SMONTHNAME2,"") */
+/* LOCVAL(LOCALE_SMONTHNAME3,"") */
+/* LOCVAL(LOCALE_SMONTHNAME4,"") */
+/* LOCVAL(LOCALE_SMONTHNAME5,"") */
+/* LOCVAL(LOCALE_SMONTHNAME6,"") */
+/* LOCVAL(LOCALE_SMONTHNAME7,"") */
+/* LOCVAL(LOCALE_SMONTHNAME8,"") */
+/* LOCVAL(LOCALE_SMONTHNAME9,"") */
+/* LOCVAL(LOCALE_SMONTHNAME10,"") */
+/* LOCVAL(LOCALE_SMONTHNAME11,"") */
+/* LOCVAL(LOCALE_SMONTHNAME12,"") */
+/* LOCVAL(LOCALE_SMONTHNAME13,"") */
+
+/* LOCVAL(LOCALE_SABBREVMONTHNAME1,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME2,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME3,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME4,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME5,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME6,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME7,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME8,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME9,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME10,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME11,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME12,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME13,"") */
+
+/* LOCVAL(LOCALE_SPOSITIVESIGN, "") */
+/* LOCVAL(LOCALE_SNEGATIVESIGN, "") */
+/* LOCVAL(LOCALE_IPOSSIGNPOSN, "") */
+/* LOCVAL(LOCALE_INEGSIGNPOSN, "") */
+/* LOCVAL(LOCALE_IPOSSYMPRECEDES, "") */
+/* LOCVAL(LOCALE_IPOSSEPBYSPACE, "") */
+/* LOCVAL(LOCALE_INEGSYMPRECEDES, "") */
+/* LOCVAL(LOCALE_INEGSEPBYSPACE, "") */
+
diff --git a/ole/nls/sky.nls b/ole/nls/sky.nls
new file mode 100644
index 0000000..4d8af3a
--- /dev/null
+++ b/ole/nls/sky.nls
@@ -0,0 +1,110 @@
+/*
+ *	OLE2NLS library
+ *      Slovakia
+ */
+
+/* LOCVAL(LOCALE_ILANGUAGE,"") */
+/* LOCVAL(LOCALE_SLANGUAGE,"") */
+/* LOCVAL(LOCALE_SENGLANGUAGE,"") */
+LOCVAL(LOCALE_SABBREVLANGNAME,"sky")
+/* LOCVAL(LOCALE_SNATIVELANGNAME,"") */
+/* LOCVAL(LOCALE_ICOUNTRY,"") */
+/* LOCVAL(LOCALE_SCOUNTRY,"") */
+/* LOCVAL(LOCALE_SENGCOUNTRY,"") */
+/* LOCVAL(LOCALE_SABBREVCTRYNAME,"") */
+/* LOCVAL(LOCALE_SNATIVECTRYNAME,"") */
+/* LOCVAL(LOCALE_IDEFAULTLANGUAGE,"") */
+/* LOCVAL(LOCALE_IDEFAULTCOUNTRY,"") */
+/* LOCVAL(LOCALE_IDEFAULTCODEPAGE) */
+/* LOCVAL(LOCALE_IDEFAULTANSICODEPAGE) */
+/* LOCVAL(LOCALE_SLIST,"") */
+/* LOCVAL(LOCALE_IMEASURE,"") */
+/* LOCVAL(LOCALE_SDECIMAL,"") */
+/* LOCVAL(LOCALE_STHOUSAND,"") */
+/* LOCVAL(LOCALE_SGROUPING) */
+/* LOCVAL(LOCALE_IDIGITS,"2") */
+/* LOCVAL(LOCALE_ILZERO,"1") */
+/* LOCVAL(LOCALE_INEGNUMBER) */
+/* LOCVAL(LOCALE_SNATIVEDIGITS) */
+/* LOCVAL(LOCALE_SCURRENCY,"") */
+/* LOCVAL(LOCALE_SINTLSYMBOL) */
+/* LOCVAL(LOCALE_SMONDECIMALSEP,",") */
+/* LOCVAL(LOCALE_SMONTHOUSANDSEP,".") */
+/* LOCVAL(LOCALE_SMONGROUPING) */
+/* LOCVAL(LOCALE_ICURRDIGITS,"2") */
+/* LOCVAL(LOCALE_IINTLCURRDIGITS) */
+/* LOCVAL(LOCALE_ICURRENCY,"3") */
+/* LOCVAL(LOCALE_INEGCURR,"8") */
+/* LOCVAL(LOCALE_SDATE,".") */
+/* LOCVAL(LOCALE_STIME,":") */
+/* LOCVAL(LOCALE_SSHORTDATE,"dd/MM-yyyy") */
+/* LOCVAL(LOCALE_SLONGDATE,"ddd, d. MMMM yyyy") */
+/* LOCVAL(LOCALE_STIMEFORMAT) */
+/* LOCVAL(LOCALE_IDATE,"1") */
+/* LOCVAL(LOCALE_ILDATE) */
+/* LOCVAL(LOCALE_ITIME,"1")
+/* LOCVAL(LOCALE_ITIMEMARKPOSN) */
+/* LOCVAL(LOCALE_ICENTURY) */
+/* LOCVAL(LOCALE_ITLZERO,"1")
+/* LOCVAL(LOCALE_IDAYLZERO) */
+/* LOCVAL(LOCALE_IMONLZERO) */
+/* LOCVAL(LOCALE_S1159, "") */
+/* LOCVAL(LOCALE_S2359, "") */
+/* LOCVAL(LOCALE_ICALENDARTYPE) */
+/* LOCVAL(LOCALE_IOPTIONALCALENDAR) */
+/* LOCVAL(LOCALE_IFIRSTDAYOFWEEK) */
+/* LOCVAL(LOCALE_IFIRSTWEEKOFYEAR) */
+
+/* LOCVAL(LOCALE_SDAYNAME1,"") */
+/* LOCVAL(LOCALE_SDAYNAME2,"") */
+/* LOCVAL(LOCALE_SDAYNAME3,"") */
+/* LOCVAL(LOCALE_SDAYNAME4,"") */
+/* LOCVAL(LOCALE_SDAYNAME5,"") */
+/* LOCVAL(LOCALE_SDAYNAME6,"") */
+/* LOCVAL(LOCALE_SDAYNAME7,"") */
+
+/* LOCVAL(LOCALE_SABBREVDAYNAME1,"Ma") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME2,"Ti") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME3,"On") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME4,"To") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME5,"Fr") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME6,"Lø") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME7,"Sø") */
+
+/* LOCVAL(LOCALE_SMONTHNAME1,"") */
+/* LOCVAL(LOCALE_SMONTHNAME2,"") */
+/* LOCVAL(LOCALE_SMONTHNAME3,"") */
+/* LOCVAL(LOCALE_SMONTHNAME4,"") */
+/* LOCVAL(LOCALE_SMONTHNAME5,"") */
+/* LOCVAL(LOCALE_SMONTHNAME6,"") */
+/* LOCVAL(LOCALE_SMONTHNAME7,"") */
+/* LOCVAL(LOCALE_SMONTHNAME8,"") */
+/* LOCVAL(LOCALE_SMONTHNAME9,"") */
+/* LOCVAL(LOCALE_SMONTHNAME10,"") */
+/* LOCVAL(LOCALE_SMONTHNAME11,"") */
+/* LOCVAL(LOCALE_SMONTHNAME12,"") */
+/* LOCVAL(LOCALE_SMONTHNAME13,"") */
+
+/* LOCVAL(LOCALE_SABBREVMONTHNAME1,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME2,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME3,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME4,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME5,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME6,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME7,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME8,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME9,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME10,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME11,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME12,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME13,"") */
+
+/* LOCVAL(LOCALE_SPOSITIVESIGN, "") */
+/* LOCVAL(LOCALE_SNEGATIVESIGN, "") */
+/* LOCVAL(LOCALE_IPOSSIGNPOSN, "") */
+/* LOCVAL(LOCALE_INEGSIGNPOSN, "") */
+/* LOCVAL(LOCALE_IPOSSYMPRECEDES, "") */
+/* LOCVAL(LOCALE_IPOSSEPBYSPACE, "") */
+/* LOCVAL(LOCALE_INEGSYMPRECEDES, "") */
+/* LOCVAL(LOCALE_INEGSEPBYSPACE, "") */
+
diff --git a/ole/nls/slv.nls b/ole/nls/slv.nls
new file mode 100644
index 0000000..374062a
--- /dev/null
+++ b/ole/nls/slv.nls
@@ -0,0 +1,110 @@
+/*
+ *	OLE2NLS library
+ *      Slovenia
+ */
+
+/* LOCVAL(LOCALE_ILANGUAGE,"") */
+/* LOCVAL(LOCALE_SLANGUAGE,"") */
+/* LOCVAL(LOCALE_SENGLANGUAGE,"") */
+LOCVAL(LOCALE_SABBREVLANGNAME,"slv")
+/* LOCVAL(LOCALE_SNATIVELANGNAME,"") */
+/* LOCVAL(LOCALE_ICOUNTRY,"") */
+/* LOCVAL(LOCALE_SCOUNTRY,"") */
+/* LOCVAL(LOCALE_SENGCOUNTRY,"") */
+/* LOCVAL(LOCALE_SABBREVCTRYNAME,"") */
+/* LOCVAL(LOCALE_SNATIVECTRYNAME,"") */
+/* LOCVAL(LOCALE_IDEFAULTLANGUAGE,"") */
+/* LOCVAL(LOCALE_IDEFAULTCOUNTRY,"") */
+/* LOCVAL(LOCALE_IDEFAULTCODEPAGE) */
+/* LOCVAL(LOCALE_IDEFAULTANSICODEPAGE) */
+/* LOCVAL(LOCALE_SLIST,"") */
+/* LOCVAL(LOCALE_IMEASURE,"") */
+/* LOCVAL(LOCALE_SDECIMAL,"") */
+/* LOCVAL(LOCALE_STHOUSAND,"") */
+/* LOCVAL(LOCALE_SGROUPING) */
+/* LOCVAL(LOCALE_IDIGITS,"2") */
+/* LOCVAL(LOCALE_ILZERO,"1") */
+/* LOCVAL(LOCALE_INEGNUMBER) */
+/* LOCVAL(LOCALE_SNATIVEDIGITS) */
+/* LOCVAL(LOCALE_SCURRENCY,"") */
+/* LOCVAL(LOCALE_SINTLSYMBOL) */
+/* LOCVAL(LOCALE_SMONDECIMALSEP,",") */
+/* LOCVAL(LOCALE_SMONTHOUSANDSEP,".") */
+/* LOCVAL(LOCALE_SMONGROUPING) */
+/* LOCVAL(LOCALE_ICURRDIGITS,"2") */
+/* LOCVAL(LOCALE_IINTLCURRDIGITS) */
+/* LOCVAL(LOCALE_ICURRENCY,"3") */
+/* LOCVAL(LOCALE_INEGCURR,"8") */
+/* LOCVAL(LOCALE_SDATE,".") */
+/* LOCVAL(LOCALE_STIME,":") */
+/* LOCVAL(LOCALE_SSHORTDATE,"dd/MM-yyyy") */
+/* LOCVAL(LOCALE_SLONGDATE,"ddd, d. MMMM yyyy") */
+/* LOCVAL(LOCALE_STIMEFORMAT) */
+/* LOCVAL(LOCALE_IDATE,"1") */
+/* LOCVAL(LOCALE_ILDATE) */
+/* LOCVAL(LOCALE_ITIME,"1")
+/* LOCVAL(LOCALE_ITIMEMARKPOSN) */
+/* LOCVAL(LOCALE_ICENTURY) */
+/* LOCVAL(LOCALE_ITLZERO,"1")
+/* LOCVAL(LOCALE_IDAYLZERO) */
+/* LOCVAL(LOCALE_IMONLZERO) */
+/* LOCVAL(LOCALE_S1159, "") */
+/* LOCVAL(LOCALE_S2359, "") */
+/* LOCVAL(LOCALE_ICALENDARTYPE) */
+/* LOCVAL(LOCALE_IOPTIONALCALENDAR) */
+/* LOCVAL(LOCALE_IFIRSTDAYOFWEEK) */
+/* LOCVAL(LOCALE_IFIRSTWEEKOFYEAR) */
+
+/* LOCVAL(LOCALE_SDAYNAME1,"") */
+/* LOCVAL(LOCALE_SDAYNAME2,"") */
+/* LOCVAL(LOCALE_SDAYNAME3,"") */
+/* LOCVAL(LOCALE_SDAYNAME4,"") */
+/* LOCVAL(LOCALE_SDAYNAME5,"") */
+/* LOCVAL(LOCALE_SDAYNAME6,"") */
+/* LOCVAL(LOCALE_SDAYNAME7,"") */
+
+/* LOCVAL(LOCALE_SABBREVDAYNAME1,"Ma") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME2,"Ti") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME3,"On") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME4,"To") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME5,"Fr") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME6,"Lø") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME7,"Sø") */
+
+/* LOCVAL(LOCALE_SMONTHNAME1,"") */
+/* LOCVAL(LOCALE_SMONTHNAME2,"") */
+/* LOCVAL(LOCALE_SMONTHNAME3,"") */
+/* LOCVAL(LOCALE_SMONTHNAME4,"") */
+/* LOCVAL(LOCALE_SMONTHNAME5,"") */
+/* LOCVAL(LOCALE_SMONTHNAME6,"") */
+/* LOCVAL(LOCALE_SMONTHNAME7,"") */
+/* LOCVAL(LOCALE_SMONTHNAME8,"") */
+/* LOCVAL(LOCALE_SMONTHNAME9,"") */
+/* LOCVAL(LOCALE_SMONTHNAME10,"") */
+/* LOCVAL(LOCALE_SMONTHNAME11,"") */
+/* LOCVAL(LOCALE_SMONTHNAME12,"") */
+/* LOCVAL(LOCALE_SMONTHNAME13,"") */
+
+/* LOCVAL(LOCALE_SABBREVMONTHNAME1,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME2,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME3,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME4,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME5,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME6,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME7,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME8,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME9,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME10,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME11,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME12,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME13,"") */
+
+/* LOCVAL(LOCALE_SPOSITIVESIGN, "") */
+/* LOCVAL(LOCALE_SNEGATIVESIGN, "") */
+/* LOCVAL(LOCALE_IPOSSIGNPOSN, "") */
+/* LOCVAL(LOCALE_INEGSIGNPOSN, "") */
+/* LOCVAL(LOCALE_IPOSSYMPRECEDES, "") */
+/* LOCVAL(LOCALE_IPOSSEPBYSPACE, "") */
+/* LOCVAL(LOCALE_INEGSYMPRECEDES, "") */
+/* LOCVAL(LOCALE_INEGSEPBYSPACE, "") */
+
diff --git a/ole/nls/srb.nls b/ole/nls/srb.nls
new file mode 100644
index 0000000..ecaaa18
--- /dev/null
+++ b/ole/nls/srb.nls
@@ -0,0 +1,110 @@
+/*
+ *	OLE2NLS library
+ *      Serbia
+ */
+
+/* LOCVAL(LOCALE_ILANGUAGE,"") */
+/* LOCVAL(LOCALE_SLANGUAGE,"") */
+/* LOCVAL(LOCALE_SENGLANGUAGE,"") */
+LOCVAL(LOCALE_SABBREVLANGNAME,"srb")
+/* LOCVAL(LOCALE_SNATIVELANGNAME,"") */
+/* LOCVAL(LOCALE_ICOUNTRY,"") */
+/* LOCVAL(LOCALE_SCOUNTRY,"") */
+/* LOCVAL(LOCALE_SENGCOUNTRY,"") */
+/* LOCVAL(LOCALE_SABBREVCTRYNAME,"") */
+/* LOCVAL(LOCALE_SNATIVECTRYNAME,"") */
+/* LOCVAL(LOCALE_IDEFAULTLANGUAGE,"") */
+/* LOCVAL(LOCALE_IDEFAULTCOUNTRY,"") */
+/* LOCVAL(LOCALE_IDEFAULTCODEPAGE) */
+/* LOCVAL(LOCALE_IDEFAULTANSICODEPAGE) */
+/* LOCVAL(LOCALE_SLIST,"") */
+/* LOCVAL(LOCALE_IMEASURE,"") */
+/* LOCVAL(LOCALE_SDECIMAL,"") */
+/* LOCVAL(LOCALE_STHOUSAND,"") */
+/* LOCVAL(LOCALE_SGROUPING) */
+/* LOCVAL(LOCALE_IDIGITS,"2") */
+/* LOCVAL(LOCALE_ILZERO,"1") */
+/* LOCVAL(LOCALE_INEGNUMBER) */
+/* LOCVAL(LOCALE_SNATIVEDIGITS) */
+/* LOCVAL(LOCALE_SCURRENCY,"") */
+/* LOCVAL(LOCALE_SINTLSYMBOL) */
+/* LOCVAL(LOCALE_SMONDECIMALSEP,",") */
+/* LOCVAL(LOCALE_SMONTHOUSANDSEP,".") */
+/* LOCVAL(LOCALE_SMONGROUPING) */
+/* LOCVAL(LOCALE_ICURRDIGITS,"2") */
+/* LOCVAL(LOCALE_IINTLCURRDIGITS) */
+/* LOCVAL(LOCALE_ICURRENCY,"3") */
+/* LOCVAL(LOCALE_INEGCURR,"8") */
+/* LOCVAL(LOCALE_SDATE,".") */
+/* LOCVAL(LOCALE_STIME,":") */
+/* LOCVAL(LOCALE_SSHORTDATE,"dd/MM-yyyy") */
+/* LOCVAL(LOCALE_SLONGDATE,"ddd, d. MMMM yyyy") */
+/* LOCVAL(LOCALE_STIMEFORMAT) */
+/* LOCVAL(LOCALE_IDATE,"1") */
+/* LOCVAL(LOCALE_ILDATE) */
+/* LOCVAL(LOCALE_ITIME,"1")
+/* LOCVAL(LOCALE_ITIMEMARKPOSN) */
+/* LOCVAL(LOCALE_ICENTURY) */
+/* LOCVAL(LOCALE_ITLZERO,"1")
+/* LOCVAL(LOCALE_IDAYLZERO) */
+/* LOCVAL(LOCALE_IMONLZERO) */
+/* LOCVAL(LOCALE_S1159, "") */
+/* LOCVAL(LOCALE_S2359, "") */
+/* LOCVAL(LOCALE_ICALENDARTYPE) */
+/* LOCVAL(LOCALE_IOPTIONALCALENDAR) */
+/* LOCVAL(LOCALE_IFIRSTDAYOFWEEK) */
+/* LOCVAL(LOCALE_IFIRSTWEEKOFYEAR) */
+
+/* LOCVAL(LOCALE_SDAYNAME1,"") */
+/* LOCVAL(LOCALE_SDAYNAME2,"") */
+/* LOCVAL(LOCALE_SDAYNAME3,"") */
+/* LOCVAL(LOCALE_SDAYNAME4,"") */
+/* LOCVAL(LOCALE_SDAYNAME5,"") */
+/* LOCVAL(LOCALE_SDAYNAME6,"") */
+/* LOCVAL(LOCALE_SDAYNAME7,"") */
+
+/* LOCVAL(LOCALE_SABBREVDAYNAME1,"Ma") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME2,"Ti") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME3,"On") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME4,"To") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME5,"Fr") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME6,"Lø") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME7,"Sø") */
+
+/* LOCVAL(LOCALE_SMONTHNAME1,"") */
+/* LOCVAL(LOCALE_SMONTHNAME2,"") */
+/* LOCVAL(LOCALE_SMONTHNAME3,"") */
+/* LOCVAL(LOCALE_SMONTHNAME4,"") */
+/* LOCVAL(LOCALE_SMONTHNAME5,"") */
+/* LOCVAL(LOCALE_SMONTHNAME6,"") */
+/* LOCVAL(LOCALE_SMONTHNAME7,"") */
+/* LOCVAL(LOCALE_SMONTHNAME8,"") */
+/* LOCVAL(LOCALE_SMONTHNAME9,"") */
+/* LOCVAL(LOCALE_SMONTHNAME10,"") */
+/* LOCVAL(LOCALE_SMONTHNAME11,"") */
+/* LOCVAL(LOCALE_SMONTHNAME12,"") */
+/* LOCVAL(LOCALE_SMONTHNAME13,"") */
+
+/* LOCVAL(LOCALE_SABBREVMONTHNAME1,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME2,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME3,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME4,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME5,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME6,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME7,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME8,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME9,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME10,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME11,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME12,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME13,"") */
+
+/* LOCVAL(LOCALE_SPOSITIVESIGN, "") */
+/* LOCVAL(LOCALE_SNEGATIVESIGN, "") */
+/* LOCVAL(LOCALE_IPOSSIGNPOSN, "") */
+/* LOCVAL(LOCALE_INEGSIGNPOSN, "") */
+/* LOCVAL(LOCALE_IPOSSYMPRECEDES, "") */
+/* LOCVAL(LOCALE_IPOSSEPBYSPACE, "") */
+/* LOCVAL(LOCALE_INEGSYMPRECEDES, "") */
+/* LOCVAL(LOCALE_INEGSEPBYSPACE, "") */
+
diff --git a/ole/nls/sve.nls b/ole/nls/sve.nls
new file mode 100644
index 0000000..7e0051d
--- /dev/null
+++ b/ole/nls/sve.nls
@@ -0,0 +1,109 @@
+/*
+ *	OLE2NLS library
+ *      Sweden
+ */
+
+LOCVAL(LOCALE_ILANGUAGE,"1d")
+LOCVAL(LOCALE_SLANGUAGE,"Svenska")
+LOCVAL(LOCALE_SENGLANGUAGE,"Swedish")
+LOCVAL(LOCALE_SABBREVLANGNAME,"sve")
+LOCVAL(LOCALE_SNATIVELANGNAME,"Svenska")
+LOCVAL(LOCALE_ICOUNTRY,"45")
+LOCVAL(LOCALE_SCOUNTRY,"SWE")
+LOCVAL(LOCALE_SENGCOUNTRY,"Sweden")
+LOCVAL(LOCALE_SABBREVCTRYNAME,"SVE")
+LOCVAL(LOCALE_SNATIVECTRYNAME,"Sverige")
+LOCVAL(LOCALE_IDEFAULTLANGUAGE,"1d")
+LOCVAL(LOCALE_IDEFAULTCOUNTRY,"45")
+/* LOCVAL(LOCALE_IDEFAULTCODEPAGE) */
+/* LOCVAL(LOCALE_IDEFAULTANSICODEPAGE) */
+LOCVAL(LOCALE_SLIST,";")
+LOCVAL(LOCALE_IMEASURE,"0")
+LOCVAL(LOCALE_SDECIMAL,",")
+LOCVAL(LOCALE_STHOUSAND,".")
+/* LOCVAL(LOCALE_SGROUPING) */
+LOCVAL(LOCALE_IDIGITS,"2")
+LOCVAL(LOCALE_ILZERO,"1")
+/* LOCVAL(LOCALE_INEGNUMBER) */
+LOCVAL(LOCALE_SNATIVEDIGITS, "0123456789")
+LOCVAL(LOCALE_SCURRENCY,"kr")
+/* LOCVAL(LOCALE_SINTLSYMBOL) */
+LOCVAL(LOCALE_SMONDECIMALSEP,",")
+LOCVAL(LOCALE_SMONTHOUSANDSEP,".")
+/* LOCVAL(LOCALE_SMONGROUPING) */
+LOCVAL(LOCALE_ICURRDIGITS,"2")
+/* LOCVAL(LOCALE_IINTLCURRDIGITS) */
+LOCVAL(LOCALE_ICURRENCY,"3")
+LOCVAL(LOCALE_INEGCURR,"8")
+LOCVAL(LOCALE_SDATE,".")
+LOCVAL(LOCALE_STIME,":")
+LOCVAL(LOCALE_SSHORTDATE,"dd/MM-yyyy")
+LOCVAL(LOCALE_SLONGDATE,"ddd, d. MMMM yyyy")
+/* LOCVAL(LOCALE_STIMEFORMAT) */
+LOCVAL(LOCALE_IDATE,"1")
+/* LOCVAL(LOCALE_ILDATE) */
+LOCVAL(LOCALE_ITIME,"1")
+/* LOCVAL(LOCALE_ITIMEMARKPOSN) */
+/* LOCVAL(LOCALE_ICENTURY) */
+LOCVAL(LOCALE_ITLZERO,"1")
+/* LOCVAL(LOCALE_IDAYLZERO) */
+/* LOCVAL(LOCALE_IMONLZERO) */
+LOCVAL(LOCALE_S1159, "")
+LOCVAL(LOCALE_S2359, "")
+/* LOCVAL(LOCALE_ICALENDARTYPE) */
+/* LOCVAL(LOCALE_IOPTIONALCALENDAR) */
+/* LOCVAL(LOCALE_IFIRSTDAYOFWEEK) */
+/* LOCVAL(LOCALE_IFIRSTWEEKOFYEAR) */
+
+LOCVAL(LOCALE_SDAYNAME1,"Måndag")
+LOCVAL(LOCALE_SDAYNAME2,"Tisdag")
+LOCVAL(LOCALE_SDAYNAME3,"Onsdag")
+LOCVAL(LOCALE_SDAYNAME4,"Torsdag")
+LOCVAL(LOCALE_SDAYNAME5,"Fredag")
+LOCVAL(LOCALE_SDAYNAME6,"Lördag")
+LOCVAL(LOCALE_SDAYNAME7,"Söndag")
+
+LOCVAL(LOCALE_SABBREVDAYNAME1,"Må")
+LOCVAL(LOCALE_SABBREVDAYNAME2,"Ti")
+LOCVAL(LOCALE_SABBREVDAYNAME3,"On")
+LOCVAL(LOCALE_SABBREVDAYNAME4,"To")
+LOCVAL(LOCALE_SABBREVDAYNAME5,"Fr")
+LOCVAL(LOCALE_SABBREVDAYNAME6,"Lö")
+LOCVAL(LOCALE_SABBREVDAYNAME7,"Sö")
+
+LOCVAL(LOCALE_SMONTHNAME1,"Januari")
+LOCVAL(LOCALE_SMONTHNAME2,"Februari")
+LOCVAL(LOCALE_SMONTHNAME3,"Mars")
+LOCVAL(LOCALE_SMONTHNAME4,"April")
+LOCVAL(LOCALE_SMONTHNAME5,"Maj")
+LOCVAL(LOCALE_SMONTHNAME6,"Juni")
+LOCVAL(LOCALE_SMONTHNAME7,"Juli")
+LOCVAL(LOCALE_SMONTHNAME8,"Augusti")
+LOCVAL(LOCALE_SMONTHNAME9,"September")
+LOCVAL(LOCALE_SMONTHNAME10,"Oktober")
+LOCVAL(LOCALE_SMONTHNAME11,"November")
+LOCVAL(LOCALE_SMONTHNAME12,"December")
+LOCVAL(LOCALE_SMONTHNAME13,"")
+
+LOCVAL(LOCALE_SABBREVMONTHNAME1,"Jan")
+LOCVAL(LOCALE_SABBREVMONTHNAME2,"Feb")
+LOCVAL(LOCALE_SABBREVMONTHNAME3,"Mar")
+LOCVAL(LOCALE_SABBREVMONTHNAME4,"Apr")
+LOCVAL(LOCALE_SABBREVMONTHNAME5,"Maj")
+LOCVAL(LOCALE_SABBREVMONTHNAME6,"Jun")
+LOCVAL(LOCALE_SABBREVMONTHNAME7,"Jul")
+LOCVAL(LOCALE_SABBREVMONTHNAME8,"Aug")
+LOCVAL(LOCALE_SABBREVMONTHNAME9,"Sep")
+LOCVAL(LOCALE_SABBREVMONTHNAME10,"Okt")
+LOCVAL(LOCALE_SABBREVMONTHNAME11,"Nov")
+LOCVAL(LOCALE_SABBREVMONTHNAME12,"Dec")
+LOCVAL(LOCALE_SABBREVMONTHNAME13,"")
+
+LOCVAL(LOCALE_SPOSITIVESIGN, "")
+LOCVAL(LOCALE_SNEGATIVESIGN, "-")
+LOCVAL(LOCALE_IPOSSIGNPOSN, "3")
+LOCVAL(LOCALE_INEGSIGNPOSN, "3")
+LOCVAL(LOCALE_IPOSSYMPRECEDES, "1")
+LOCVAL(LOCALE_IPOSSEPBYSPACE, "0")
+LOCVAL(LOCALE_INEGSYMPRECEDES, "1")
+LOCVAL(LOCALE_INEGSEPBYSPACE, "0")
diff --git a/ole/nls/trk.nls b/ole/nls/trk.nls
new file mode 100644
index 0000000..3a6b7c9
--- /dev/null
+++ b/ole/nls/trk.nls
@@ -0,0 +1,110 @@
+/*
+ *	OLE2NLS library
+ *      Turkey
+ */
+
+/* LOCVAL(LOCALE_ILANGUAGE,"") */
+/* LOCVAL(LOCALE_SLANGUAGE,"") */
+/* LOCVAL(LOCALE_SENGLANGUAGE,"") */
+LOCVAL(LOCALE_SABBREVLANGNAME,"trk")
+/* LOCVAL(LOCALE_SNATIVELANGNAME,"") */
+/* LOCVAL(LOCALE_ICOUNTRY,"") */
+/* LOCVAL(LOCALE_SCOUNTRY,"") */
+/* LOCVAL(LOCALE_SENGCOUNTRY,"") */
+/* LOCVAL(LOCALE_SABBREVCTRYNAME,"") */
+/* LOCVAL(LOCALE_SNATIVECTRYNAME,"") */
+/* LOCVAL(LOCALE_IDEFAULTLANGUAGE,"") */
+/* LOCVAL(LOCALE_IDEFAULTCOUNTRY,"") */
+/* LOCVAL(LOCALE_IDEFAULTCODEPAGE) */
+/* LOCVAL(LOCALE_IDEFAULTANSICODEPAGE) */
+/* LOCVAL(LOCALE_SLIST,"") */
+/* LOCVAL(LOCALE_IMEASURE,"") */
+/* LOCVAL(LOCALE_SDECIMAL,"") */
+/* LOCVAL(LOCALE_STHOUSAND,"") */
+/* LOCVAL(LOCALE_SGROUPING) */
+/* LOCVAL(LOCALE_IDIGITS,"2") */
+/* LOCVAL(LOCALE_ILZERO,"1") */
+/* LOCVAL(LOCALE_INEGNUMBER) */
+/* LOCVAL(LOCALE_SNATIVEDIGITS) */
+/* LOCVAL(LOCALE_SCURRENCY,"") */
+/* LOCVAL(LOCALE_SINTLSYMBOL) */
+/* LOCVAL(LOCALE_SMONDECIMALSEP,",") */
+/* LOCVAL(LOCALE_SMONTHOUSANDSEP,".") */
+/* LOCVAL(LOCALE_SMONGROUPING) */
+/* LOCVAL(LOCALE_ICURRDIGITS,"2") */
+/* LOCVAL(LOCALE_IINTLCURRDIGITS) */
+/* LOCVAL(LOCALE_ICURRENCY,"3") */
+/* LOCVAL(LOCALE_INEGCURR,"8") */
+/* LOCVAL(LOCALE_SDATE,".") */
+/* LOCVAL(LOCALE_STIME,":") */
+/* LOCVAL(LOCALE_SSHORTDATE,"dd/MM-yyyy") */
+/* LOCVAL(LOCALE_SLONGDATE,"ddd, d. MMMM yyyy") */
+/* LOCVAL(LOCALE_STIMEFORMAT) */
+/* LOCVAL(LOCALE_IDATE,"1") */
+/* LOCVAL(LOCALE_ILDATE) */
+/* LOCVAL(LOCALE_ITIME,"1")
+/* LOCVAL(LOCALE_ITIMEMARKPOSN) */
+/* LOCVAL(LOCALE_ICENTURY) */
+/* LOCVAL(LOCALE_ITLZERO,"1")
+/* LOCVAL(LOCALE_IDAYLZERO) */
+/* LOCVAL(LOCALE_IMONLZERO) */
+/* LOCVAL(LOCALE_S1159, "") */
+/* LOCVAL(LOCALE_S2359, "") */
+/* LOCVAL(LOCALE_ICALENDARTYPE) */
+/* LOCVAL(LOCALE_IOPTIONALCALENDAR) */
+/* LOCVAL(LOCALE_IFIRSTDAYOFWEEK) */
+/* LOCVAL(LOCALE_IFIRSTWEEKOFYEAR) */
+
+/* LOCVAL(LOCALE_SDAYNAME1,"") */
+/* LOCVAL(LOCALE_SDAYNAME2,"") */
+/* LOCVAL(LOCALE_SDAYNAME3,"") */
+/* LOCVAL(LOCALE_SDAYNAME4,"") */
+/* LOCVAL(LOCALE_SDAYNAME5,"") */
+/* LOCVAL(LOCALE_SDAYNAME6,"") */
+/* LOCVAL(LOCALE_SDAYNAME7,"") */
+
+/* LOCVAL(LOCALE_SABBREVDAYNAME1,"Ma") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME2,"Ti") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME3,"On") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME4,"To") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME5,"Fr") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME6,"Lø") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME7,"Sø") */
+
+/* LOCVAL(LOCALE_SMONTHNAME1,"") */
+/* LOCVAL(LOCALE_SMONTHNAME2,"") */
+/* LOCVAL(LOCALE_SMONTHNAME3,"") */
+/* LOCVAL(LOCALE_SMONTHNAME4,"") */
+/* LOCVAL(LOCALE_SMONTHNAME5,"") */
+/* LOCVAL(LOCALE_SMONTHNAME6,"") */
+/* LOCVAL(LOCALE_SMONTHNAME7,"") */
+/* LOCVAL(LOCALE_SMONTHNAME8,"") */
+/* LOCVAL(LOCALE_SMONTHNAME9,"") */
+/* LOCVAL(LOCALE_SMONTHNAME10,"") */
+/* LOCVAL(LOCALE_SMONTHNAME11,"") */
+/* LOCVAL(LOCALE_SMONTHNAME12,"") */
+/* LOCVAL(LOCALE_SMONTHNAME13,"") */
+
+/* LOCVAL(LOCALE_SABBREVMONTHNAME1,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME2,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME3,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME4,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME5,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME6,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME7,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME8,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME9,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME10,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME11,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME12,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME13,"") */
+
+/* LOCVAL(LOCALE_SPOSITIVESIGN, "") */
+/* LOCVAL(LOCALE_SNEGATIVESIGN, "") */
+/* LOCVAL(LOCALE_IPOSSIGNPOSN, "") */
+/* LOCVAL(LOCALE_INEGSIGNPOSN, "") */
+/* LOCVAL(LOCALE_IPOSSYMPRECEDES, "") */
+/* LOCVAL(LOCALE_IPOSSEPBYSPACE, "") */
+/* LOCVAL(LOCALE_INEGSYMPRECEDES, "") */
+/* LOCVAL(LOCALE_INEGSEPBYSPACE, "") */
+
diff --git a/ole/nls/ukr.nls b/ole/nls/ukr.nls
new file mode 100644
index 0000000..0d65b28
--- /dev/null
+++ b/ole/nls/ukr.nls
@@ -0,0 +1,110 @@
+/*
+ *	OLE2NLS library
+ *      Ukrainian
+ */
+
+/* LOCVAL(LOCALE_ILANGUAGE,"") */
+/* LOCVAL(LOCALE_SLANGUAGE,"") */
+/* LOCVAL(LOCALE_SENGLANGUAGE,"") */
+LOCVAL(LOCALE_SABBREVLANGNAME,"ukr")
+/* LOCVAL(LOCALE_SNATIVELANGNAME,"") */
+/* LOCVAL(LOCALE_ICOUNTRY,"") */
+/* LOCVAL(LOCALE_SCOUNTRY,"") */
+/* LOCVAL(LOCALE_SENGCOUNTRY,"") */
+/* LOCVAL(LOCALE_SABBREVCTRYNAME,"") */
+/* LOCVAL(LOCALE_SNATIVECTRYNAME,"") */
+/* LOCVAL(LOCALE_IDEFAULTLANGUAGE,"") */
+/* LOCVAL(LOCALE_IDEFAULTCOUNTRY,"") */
+/* LOCVAL(LOCALE_IDEFAULTCODEPAGE) */
+/* LOCVAL(LOCALE_IDEFAULTANSICODEPAGE) */
+/* LOCVAL(LOCALE_SLIST,"") */
+/* LOCVAL(LOCALE_IMEASURE,"") */
+/* LOCVAL(LOCALE_SDECIMAL,"") */
+/* LOCVAL(LOCALE_STHOUSAND,"") */
+/* LOCVAL(LOCALE_SGROUPING) */
+/* LOCVAL(LOCALE_IDIGITS,"2") */
+/* LOCVAL(LOCALE_ILZERO,"1") */
+/* LOCVAL(LOCALE_INEGNUMBER) */
+/* LOCVAL(LOCALE_SNATIVEDIGITS) */
+/* LOCVAL(LOCALE_SCURRENCY,"") */
+/* LOCVAL(LOCALE_SINTLSYMBOL) */
+/* LOCVAL(LOCALE_SMONDECIMALSEP,",") */
+/* LOCVAL(LOCALE_SMONTHOUSANDSEP,".") */
+/* LOCVAL(LOCALE_SMONGROUPING) */
+/* LOCVAL(LOCALE_ICURRDIGITS,"2") */
+/* LOCVAL(LOCALE_IINTLCURRDIGITS) */
+/* LOCVAL(LOCALE_ICURRENCY,"3") */
+/* LOCVAL(LOCALE_INEGCURR,"8") */
+/* LOCVAL(LOCALE_SDATE,".") */
+/* LOCVAL(LOCALE_STIME,":") */
+/* LOCVAL(LOCALE_SSHORTDATE,"dd/MM-yyyy") */
+/* LOCVAL(LOCALE_SLONGDATE,"ddd, d. MMMM yyyy") */
+/* LOCVAL(LOCALE_STIMEFORMAT) */
+/* LOCVAL(LOCALE_IDATE,"1") */
+/* LOCVAL(LOCALE_ILDATE) */
+/* LOCVAL(LOCALE_ITIME,"1")
+/* LOCVAL(LOCALE_ITIMEMARKPOSN) */
+/* LOCVAL(LOCALE_ICENTURY) */
+/* LOCVAL(LOCALE_ITLZERO,"1")
+/* LOCVAL(LOCALE_IDAYLZERO) */
+/* LOCVAL(LOCALE_IMONLZERO) */
+/* LOCVAL(LOCALE_S1159, "") */
+/* LOCVAL(LOCALE_S2359, "") */
+/* LOCVAL(LOCALE_ICALENDARTYPE) */
+/* LOCVAL(LOCALE_IOPTIONALCALENDAR) */
+/* LOCVAL(LOCALE_IFIRSTDAYOFWEEK) */
+/* LOCVAL(LOCALE_IFIRSTWEEKOFYEAR) */
+
+/* LOCVAL(LOCALE_SDAYNAME1,"") */
+/* LOCVAL(LOCALE_SDAYNAME2,"") */
+/* LOCVAL(LOCALE_SDAYNAME3,"") */
+/* LOCVAL(LOCALE_SDAYNAME4,"") */
+/* LOCVAL(LOCALE_SDAYNAME5,"") */
+/* LOCVAL(LOCALE_SDAYNAME6,"") */
+/* LOCVAL(LOCALE_SDAYNAME7,"") */
+
+/* LOCVAL(LOCALE_SABBREVDAYNAME1,"Ma") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME2,"Ti") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME3,"On") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME4,"To") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME5,"Fr") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME6,"Lø") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME7,"Sø") */
+
+/* LOCVAL(LOCALE_SMONTHNAME1,"") */
+/* LOCVAL(LOCALE_SMONTHNAME2,"") */
+/* LOCVAL(LOCALE_SMONTHNAME3,"") */
+/* LOCVAL(LOCALE_SMONTHNAME4,"") */
+/* LOCVAL(LOCALE_SMONTHNAME5,"") */
+/* LOCVAL(LOCALE_SMONTHNAME6,"") */
+/* LOCVAL(LOCALE_SMONTHNAME7,"") */
+/* LOCVAL(LOCALE_SMONTHNAME8,"") */
+/* LOCVAL(LOCALE_SMONTHNAME9,"") */
+/* LOCVAL(LOCALE_SMONTHNAME10,"") */
+/* LOCVAL(LOCALE_SMONTHNAME11,"") */
+/* LOCVAL(LOCALE_SMONTHNAME12,"") */
+/* LOCVAL(LOCALE_SMONTHNAME13,"") */
+
+/* LOCVAL(LOCALE_SABBREVMONTHNAME1,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME2,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME3,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME4,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME5,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME6,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME7,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME8,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME9,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME10,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME11,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME12,"") */
+/* LOCVAL(LOCALE_SABBREVMONTHNAME13,"") */
+
+/* LOCVAL(LOCALE_SPOSITIVESIGN, "") */
+/* LOCVAL(LOCALE_SNEGATIVESIGN, "") */
+/* LOCVAL(LOCALE_IPOSSIGNPOSN, "") */
+/* LOCVAL(LOCALE_INEGSIGNPOSN, "") */
+/* LOCVAL(LOCALE_IPOSSYMPRECEDES, "") */
+/* LOCVAL(LOCALE_IPOSSEPBYSPACE, "") */
+/* LOCVAL(LOCALE_INEGSYMPRECEDES, "") */
+/* LOCVAL(LOCALE_INEGSEPBYSPACE, "") */
+
diff --git a/ole/ole2nls.c b/ole/ole2nls.c
index a6318dc..0815d96 100644
--- a/ole/ole2nls.c
+++ b/ole/ole2nls.c
@@ -294,1366 +294,84 @@
     {
     case LANG_De:
     	switch (LCType) {
-/* This definitions apply to Germany only. Users in Austria 
-   or Switzerland might want to modify them */
-LOCVAL(LOCALE_ILANGUAGE,"9")
-LOCVAL(LOCALE_SLANGUAGE,"Deutsch")
-LOCVAL(LOCALE_SENGLANGUAGE,"German")
-LOCVAL(LOCALE_SABBREVLANGNAME,"deu")
-LOCVAL(LOCALE_SNATIVELANGNAME,"Deutsch")
-LOCVAL(LOCALE_ICOUNTRY,"49")
-LOCVAL(LOCALE_SCOUNTRY,"Deutschland")
-LOCVAL(LOCALE_SENGCOUNTRY,"Deutschland")
-LOCVAL(LOCALE_SABBREVCTRYNAME,"De")
-LOCVAL(LOCALE_SNATIVECTRYNAME,"Deutschland")
-LOCVAL(LOCALE_IDEFAULTLANGUAGE,"9")
-LOCVAL(LOCALE_IDEFAULTCOUNTRY,"49")
-LOCVAL(LOCALE_IDEFAULTCODEPAGE,"851")
-/* Dunno
-LOCVAL(LOCALE_IDEFAULTANSICODEPAGE)
-*/
-LOCVAL(LOCALE_SLIST,";")
-LOCVAL(LOCALE_IMEASURE,"0")
-LOCVAL(LOCALE_SDECIMAL,",")
-LOCVAL(LOCALE_STHOUSAND,".")
-/*
-LOCVAL(LOCALE_SGROUPING)
-*/
-LOCVAL(LOCALE_IDIGITS,"2")
-LOCVAL(LOCALE_ILZERO,"1")
-/*
-LOCVAL(LOCALE_INEGNUMBER)
-Is this "0123456789" ??
-LOCVAL(LOCALE_SNATIVEDIGITS)
-*/
-LOCVAL(LOCALE_SCURRENCY,"DM")
-/*
-LOCVAL(LOCALE_SINTLSYMBOL)
-LOCVAL(LOCALE_SMONDECIMALSEP)
-LOCVAL(LOCALE_SMONTHOUSANDSEP)
-LOCVAL(LOCALE_SMONGROUPING)
-*/
-LOCVAL(LOCALE_ICURRDIGITS,"2")
-/*
-LOCVAL(LOCALE_IINTLCURRDIGITS)
-*/
-LOCVAL(LOCALE_ICURRENCY,"3")
-LOCVAL(LOCALE_INEGCURR,"8")
-LOCVAL(LOCALE_SDATE,".")
-LOCVAL(LOCALE_STIME,":")
-LOCVAL(LOCALE_SSHORTDATE,"dd.MM.yyyy")
-LOCVAL(LOCALE_SLONGDATE,"ddd, d. MMMM yyyy")
-/*
-LOCVAL(LOCALE_STIMEFORMAT)
-*/
-LOCVAL(LOCALE_IDATE,"1")
-/*
-LOCVAL(LOCALE_ILDATE)
-*/
-LOCVAL(LOCALE_ITIME,"1")
-/*
-LOCVAL(LOCALE_ITIMEMARKPOSN)
-LOCVAL(LOCALE_ICENTURY)
-*/
-LOCVAL(LOCALE_ITLZERO,"1")
-/*
-LOCVAL(LOCALE_IDAYLZERO)
-LOCVAL(LOCALE_IMONLZERO)
-LOCVAL(LOCALE_S1159)
-LOCVAL(LOCALE_S2359)
-LOCVAL(LOCALE_ICALENDARTYPE)
-LOCVAL(LOCALE_IOPTIONALCALENDAR)
-LOCVAL(LOCALE_IFIRSTDAYOFWEEK)
-LOCVAL(LOCALE_IFIRSTWEEKOFYEAR)
-*/
-LOCVAL(LOCALE_SDAYNAME1,"Montag")
-LOCVAL(LOCALE_SDAYNAME2,"Dienstag")
-LOCVAL(LOCALE_SDAYNAME3,"Mittwoch")
-LOCVAL(LOCALE_SDAYNAME4,"Donnerstag")
-LOCVAL(LOCALE_SDAYNAME5,"Freitag")
-LOCVAL(LOCALE_SDAYNAME6,"Sonnabend")
-LOCVAL(LOCALE_SDAYNAME7,"Sonntag")
-LOCVAL(LOCALE_SABBREVDAYNAME1,"Mo")
-LOCVAL(LOCALE_SABBREVDAYNAME2,"Di")
-LOCVAL(LOCALE_SABBREVDAYNAME3,"Mi")
-LOCVAL(LOCALE_SABBREVDAYNAME4,"Do")
-LOCVAL(LOCALE_SABBREVDAYNAME5,"Fr")
-LOCVAL(LOCALE_SABBREVDAYNAME6,"Sa")
-LOCVAL(LOCALE_SABBREVDAYNAME7,"So")
-LOCVAL(LOCALE_SMONTHNAME1,"Januar")
-LOCVAL(LOCALE_SMONTHNAME2,"Februar")
-LOCVAL(LOCALE_SMONTHNAME3,"März")
-LOCVAL(LOCALE_SMONTHNAME4,"April")
-LOCVAL(LOCALE_SMONTHNAME5,"Mai")
-LOCVAL(LOCALE_SMONTHNAME6,"Juni")
-LOCVAL(LOCALE_SMONTHNAME7,"Juli")
-LOCVAL(LOCALE_SMONTHNAME8,"August")
-LOCVAL(LOCALE_SMONTHNAME9,"September")
-LOCVAL(LOCALE_SMONTHNAME10,"Oktober")
-LOCVAL(LOCALE_SMONTHNAME11,"November")
-LOCVAL(LOCALE_SMONTHNAME12,"Dezember")
-LOCVAL(LOCALE_SMONTHNAME13,"")
-LOCVAL(LOCALE_SABBREVMONTHNAME1,"Jan")
-LOCVAL(LOCALE_SABBREVMONTHNAME2,"Feb")
-LOCVAL(LOCALE_SABBREVMONTHNAME3,"Mär")
-LOCVAL(LOCALE_SABBREVMONTHNAME4,"Apr")
-LOCVAL(LOCALE_SABBREVMONTHNAME5,"Mai")
-LOCVAL(LOCALE_SABBREVMONTHNAME6,"Jun")
-LOCVAL(LOCALE_SABBREVMONTHNAME7,"Jul")
-LOCVAL(LOCALE_SABBREVMONTHNAME8,"Aug")
-LOCVAL(LOCALE_SABBREVMONTHNAME9,"Sep")
-LOCVAL(LOCALE_SABBREVMONTHNAME10,"Okt")
-LOCVAL(LOCALE_SABBREVMONTHNAME11,"Nov")
-LOCVAL(LOCALE_SABBREVMONTHNAME12,"Dez")
-LOCVAL(LOCALE_SABBREVMONTHNAME13,"")
-/*
-LOCVAL(LOCALE_SPOSITIVESIGN)
-LOCVAL(LOCALE_SNEGATIVESIGN)
-LOCVAL(LOCALE_IPOSSIGNPOSN)
-LOCVAL(LOCALE_INEGSIGNPOSN)
-LOCVAL(LOCALE_IPOSSYMPRECEDES)
-LOCVAL(LOCALE_IPOSSEPBYSPACE)
-LOCVAL(LOCALE_INEGSYMPRECEDES)
-LOCVAL(LOCALE_INEGSEPBYSPACE)
-*/
+#include "nls/deu.nls"
 	default: found=0;break;
 	}
     break;  /* LANG(De) */
 
     case LANG_Da:
     	switch (LCType) {
-LOCVAL(LOCALE_ILANGUAGE,"6")
-LOCVAL(LOCALE_SLANGUAGE,"Dansk")
-LOCVAL(LOCALE_SENGLANGUAGE,"Danish")
-LOCVAL(LOCALE_SABBREVLANGNAME,"dan")
-LOCVAL(LOCALE_SNATIVELANGNAME,"Dansk")
-LOCVAL(LOCALE_ICOUNTRY,"45")
-LOCVAL(LOCALE_SCOUNTRY,"Danmark")
-LOCVAL(LOCALE_SENGCOUNTRY,"Denmark")
-LOCVAL(LOCALE_SABBREVCTRYNAME,"DK")
-LOCVAL(LOCALE_SNATIVECTRYNAME,"Danmark")
-LOCVAL(LOCALE_IDEFAULTLANGUAGE,"6")
-LOCVAL(LOCALE_IDEFAULTCOUNTRY,"45")
-/* LOCVAL(LOCALE_IDEFAULTCODEPAGE) */
-/* LOCVAL(LOCALE_IDEFAULTANSICODEPAGE) */
-LOCVAL(LOCALE_SLIST,";")
-LOCVAL(LOCALE_IMEASURE,"0")
-LOCVAL(LOCALE_SDECIMAL,",")
-LOCVAL(LOCALE_STHOUSAND,".")
-/* LOCVAL(LOCALE_SGROUPING) */
-LOCVAL(LOCALE_IDIGITS,"2")
-LOCVAL(LOCALE_ILZERO,"1")
-/* LOCVAL(LOCALE_INEGNUMBER) */
-/* LOCVAL(LOCALE_SNATIVEDIGITS) */
-LOCVAL(LOCALE_SCURRENCY,"kr")
-/* LOCVAL(LOCALE_SINTLSYMBOL) */
-LOCVAL(LOCALE_SMONDECIMALSEP,",")
-LOCVAL(LOCALE_SMONTHOUSANDSEP,".")
-/* LOCVAL(LOCALE_SMONGROUPING) */
-LOCVAL(LOCALE_ICURRDIGITS,"2")
-/* LOCVAL(LOCALE_IINTLCURRDIGITS) */
-LOCVAL(LOCALE_ICURRENCY,"3")
-LOCVAL(LOCALE_INEGCURR,"8")
-LOCVAL(LOCALE_SDATE,".")
-LOCVAL(LOCALE_STIME,":")
-LOCVAL(LOCALE_SSHORTDATE,"dd/MM-yyyy")
-LOCVAL(LOCALE_SLONGDATE,"ddd, d. MMMM yyyy")
-/* LOCVAL(LOCALE_STIMEFORMAT) */
-LOCVAL(LOCALE_IDATE,"1")
-/* LOCVAL(LOCALE_ILDATE) */
-LOCVAL(LOCALE_ITIME,"1")
-/* LOCVAL(LOCALE_ITIMEMARKPOSN) */
-/* LOCVAL(LOCALE_ICENTURY) */
-LOCVAL(LOCALE_ITLZERO,"1")
-/* LOCVAL(LOCALE_IDAYLZERO) */
-/* LOCVAL(LOCALE_IMONLZERO) */
-LOCVAL(LOCALE_S1159, "")
-LOCVAL(LOCALE_S2359, "")
-/* LOCVAL(LOCALE_ICALENDARTYPE) */
-/* LOCVAL(LOCALE_IOPTIONALCALENDAR) */
-/* LOCVAL(LOCALE_IFIRSTDAYOFWEEK) */
-/* LOCVAL(LOCALE_IFIRSTWEEKOFYEAR) */
-LOCVAL(LOCALE_SDAYNAME1,"Mandag")
-LOCVAL(LOCALE_SDAYNAME2,"Tirsdag")
-LOCVAL(LOCALE_SDAYNAME3,"Onsdag")
-LOCVAL(LOCALE_SDAYNAME4,"Torsdag")
-LOCVAL(LOCALE_SDAYNAME5,"Fredag")
-LOCVAL(LOCALE_SDAYNAME6,"Lørdag")
-LOCVAL(LOCALE_SDAYNAME7,"Søndag")
-LOCVAL(LOCALE_SABBREVDAYNAME1,"Ma")
-LOCVAL(LOCALE_SABBREVDAYNAME2,"Ti")
-LOCVAL(LOCALE_SABBREVDAYNAME3,"On")
-LOCVAL(LOCALE_SABBREVDAYNAME4,"To")
-LOCVAL(LOCALE_SABBREVDAYNAME5,"Fr")
-LOCVAL(LOCALE_SABBREVDAYNAME6,"Lø")
-LOCVAL(LOCALE_SABBREVDAYNAME7,"Sø")
-LOCVAL(LOCALE_SMONTHNAME1,"Januar")
-LOCVAL(LOCALE_SMONTHNAME2,"Februar")
-LOCVAL(LOCALE_SMONTHNAME3,"Marts")
-LOCVAL(LOCALE_SMONTHNAME4,"April")
-LOCVAL(LOCALE_SMONTHNAME5,"Maj")
-LOCVAL(LOCALE_SMONTHNAME6,"Juni")
-LOCVAL(LOCALE_SMONTHNAME7,"Juli")
-LOCVAL(LOCALE_SMONTHNAME8,"August")
-LOCVAL(LOCALE_SMONTHNAME9,"September")
-LOCVAL(LOCALE_SMONTHNAME10,"Oktober")
-LOCVAL(LOCALE_SMONTHNAME11,"November")
-LOCVAL(LOCALE_SMONTHNAME12,"December")
-LOCVAL(LOCALE_SMONTHNAME13,"")
-LOCVAL(LOCALE_SABBREVMONTHNAME1,"Jan")
-LOCVAL(LOCALE_SABBREVMONTHNAME2,"Feb")
-LOCVAL(LOCALE_SABBREVMONTHNAME3,"Mar")
-LOCVAL(LOCALE_SABBREVMONTHNAME4,"Apr")
-LOCVAL(LOCALE_SABBREVMONTHNAME5,"Maj")
-LOCVAL(LOCALE_SABBREVMONTHNAME6,"Jun")
-LOCVAL(LOCALE_SABBREVMONTHNAME7,"Jul")
-LOCVAL(LOCALE_SABBREVMONTHNAME8,"Aug")
-LOCVAL(LOCALE_SABBREVMONTHNAME9,"Sep")
-LOCVAL(LOCALE_SABBREVMONTHNAME10,"Okt")
-LOCVAL(LOCALE_SABBREVMONTHNAME11,"Nov")
-LOCVAL(LOCALE_SABBREVMONTHNAME12,"Dec")
-LOCVAL(LOCALE_SABBREVMONTHNAME13,"")
-LOCVAL(LOCALE_SPOSITIVESIGN, "")
-LOCVAL(LOCALE_SNEGATIVESIGN, "-")
-LOCVAL(LOCALE_IPOSSIGNPOSN, "3")
-LOCVAL(LOCALE_INEGSIGNPOSN, "3")
-LOCVAL(LOCALE_IPOSSYMPRECEDES, "1")
-LOCVAL(LOCALE_IPOSSEPBYSPACE, "0")
-LOCVAL(LOCALE_INEGSYMPRECEDES, "1")
-LOCVAL(LOCALE_INEGSEPBYSPACE, "0")
+#include "nls/dnk.nls"
 	default: found=0;break;
 	}
     break; /* LANG(Da) */
 
     case LANG_En:
     	switch (LCType) {
-LOCVAL(LOCALE_ILANGUAGE, "0409")
-LOCVAL(LOCALE_SLANGUAGE, "English (United States)")
-LOCVAL(LOCALE_SENGLANGUAGE, "English")
-LOCVAL(LOCALE_SABBREVLANGNAME, "ENU")
-LOCVAL(LOCALE_SNATIVELANGNAME, "English")
-LOCVAL(LOCALE_ICOUNTRY, "1")
-LOCVAL(LOCALE_SCOUNTRY, "United States")
-LOCVAL(LOCALE_SENGCOUNTRY, "United States")
-LOCVAL(LOCALE_SABBREVCTRYNAME, "USA")
-LOCVAL(LOCALE_SNATIVECTRYNAME, "United States")
-LOCVAL(LOCALE_IDEFAULTLANGUAGE, "0409")
-LOCVAL(LOCALE_IDEFAULTCOUNTRY, "1")
-LOCVAL(LOCALE_IDEFAULTCODEPAGE, "437")
-LOCVAL(LOCALE_IDEFAULTANSICODEPAGE, "1252")
-LOCVAL(LOCALE_SLIST, ",")
-LOCVAL(LOCALE_IMEASURE, "1")
-LOCVAL(LOCALE_SDECIMAL, ".")
-LOCVAL(LOCALE_STHOUSAND, ",")
-LOCVAL(LOCALE_SGROUPING, "3;0")
-LOCVAL(LOCALE_IDIGITS, "2")
-LOCVAL(LOCALE_ILZERO, "1")
-LOCVAL(LOCALE_INEGNUMBER, "1")
-LOCVAL(LOCALE_SNATIVEDIGITS, "0123456789")
-LOCVAL(LOCALE_SCURRENCY, "$")
-LOCVAL(LOCALE_SINTLSYMBOL, "USD")
-LOCVAL(LOCALE_SMONDECIMALSEP, ".")
-LOCVAL(LOCALE_SMONTHOUSANDSEP, ",")
-LOCVAL(LOCALE_SMONGROUPING, "3;0")
-LOCVAL(LOCALE_ICURRDIGITS, "2")
-LOCVAL(LOCALE_IINTLCURRDIGITS, "2")
-LOCVAL(LOCALE_ICURRENCY, "0")
-LOCVAL(LOCALE_INEGCURR, "0")
-LOCVAL(LOCALE_SDATE, "/")
-LOCVAL(LOCALE_STIME, ":")
-LOCVAL(LOCALE_SSHORTDATE, "M/d/yy")
-LOCVAL(LOCALE_SLONGDATE, "dddd, MMMM dd, yyyy")
-LOCVAL(LOCALE_STIMEFORMAT, "h:mm:ss tt")
-LOCVAL(LOCALE_IDATE, "0")
-LOCVAL(LOCALE_ILDATE, "0")
-LOCVAL(LOCALE_ITIME, "0")
-LOCVAL(LOCALE_ITIMEMARKPOSN, "0")
-LOCVAL(LOCALE_ICENTURY, "0")
-LOCVAL(LOCALE_ITLZERO, "0")
-LOCVAL(LOCALE_IDAYLZERO, "0")
-LOCVAL(LOCALE_IMONLZERO, "0")
-LOCVAL(LOCALE_S1159, "AM")
-LOCVAL(LOCALE_S2359, "PM")
-LOCVAL(LOCALE_ICALENDARTYPE, "1")
-LOCVAL(LOCALE_IOPTIONALCALENDAR, "0")
-LOCVAL(LOCALE_IFIRSTDAYOFWEEK, "6")
-LOCVAL(LOCALE_IFIRSTWEEKOFYEAR, "0")
-LOCVAL(LOCALE_SDAYNAME1, "Monday")
-LOCVAL(LOCALE_SDAYNAME2, "Tuesday")
-LOCVAL(LOCALE_SDAYNAME3, "Wednesday")
-LOCVAL(LOCALE_SDAYNAME4, "Thursday")
-LOCVAL(LOCALE_SDAYNAME5, "Friday")
-LOCVAL(LOCALE_SDAYNAME6, "Saturday")
-LOCVAL(LOCALE_SDAYNAME7, "Sunday")
-LOCVAL(LOCALE_SABBREVDAYNAME1, "Mon")
-LOCVAL(LOCALE_SABBREVDAYNAME2, "Tue")
-LOCVAL(LOCALE_SABBREVDAYNAME3, "Wed")
-LOCVAL(LOCALE_SABBREVDAYNAME4, "Thu")
-LOCVAL(LOCALE_SABBREVDAYNAME5, "Fri")
-LOCVAL(LOCALE_SABBREVDAYNAME6, "Sat")
-LOCVAL(LOCALE_SABBREVDAYNAME7, "Sun")
-LOCVAL(LOCALE_SMONTHNAME1, "January")
-LOCVAL(LOCALE_SMONTHNAME2, "February")
-LOCVAL(LOCALE_SMONTHNAME3, "March")
-LOCVAL(LOCALE_SMONTHNAME4, "April")
-LOCVAL(LOCALE_SMONTHNAME5, "May")
-LOCVAL(LOCALE_SMONTHNAME6, "June")
-LOCVAL(LOCALE_SMONTHNAME7, "July")
-LOCVAL(LOCALE_SMONTHNAME8, "August")
-LOCVAL(LOCALE_SMONTHNAME9, "September")
-LOCVAL(LOCALE_SMONTHNAME10, "October")
-LOCVAL(LOCALE_SMONTHNAME11, "November")
-LOCVAL(LOCALE_SMONTHNAME12, "December")
-LOCVAL(LOCALE_SMONTHNAME13, "")
-LOCVAL(LOCALE_SABBREVMONTHNAME1, "Jan")
-LOCVAL(LOCALE_SABBREVMONTHNAME2, "Feb")
-LOCVAL(LOCALE_SABBREVMONTHNAME3, "Mar")
-LOCVAL(LOCALE_SABBREVMONTHNAME4, "Apr")
-LOCVAL(LOCALE_SABBREVMONTHNAME5, "May")
-LOCVAL(LOCALE_SABBREVMONTHNAME6, "Jun")
-LOCVAL(LOCALE_SABBREVMONTHNAME7, "Jul")
-LOCVAL(LOCALE_SABBREVMONTHNAME8, "Aug")
-LOCVAL(LOCALE_SABBREVMONTHNAME9, "Sep")
-LOCVAL(LOCALE_SABBREVMONTHNAME10, "Oct")
-LOCVAL(LOCALE_SABBREVMONTHNAME11, "Nov")
-LOCVAL(LOCALE_SABBREVMONTHNAME12, "Dec")
-LOCVAL(LOCALE_SABBREVMONTHNAME13, "")
-LOCVAL(LOCALE_SPOSITIVESIGN, "")
-LOCVAL(LOCALE_SNEGATIVESIGN, "-")
-LOCVAL(LOCALE_IPOSSIGNPOSN, "3")
-LOCVAL(LOCALE_INEGSIGNPOSN, "0")
-LOCVAL(LOCALE_IPOSSYMPRECEDES, "1")
-LOCVAL(LOCALE_IPOSSEPBYSPACE, "0")
-LOCVAL(LOCALE_INEGSYMPRECEDES, "1")
-LOCVAL(LOCALE_INEGSEPBYSPACE, "0")
+#include "nls/enu.nls"
 	default: found=0;break;
 	}
     break;  /* LANG(En) */
 
     case LANG_Eo:
     	switch (LCType) {
-/* LOCVAL(LOCALE_ILANGUAGE,"9") ISO numerical ID for language TODO */
-LOCVAL(LOCALE_SLANGUAGE,"Esperanto")
-LOCVAL(LOCALE_SENGLANGUAGE,"Esperanto")
-/* LOCVAL(LOCALE_SABBREVLANGNAME,"deu") */
-LOCVAL(LOCALE_SNATIVELANGNAME,"Esperanto")
-/* LOCVAL(LOCALE_ICOUNTRY,"49") not official in any one country */
-/* LOCVAL(LOCALE_SCOUNTRY,"Deutschland") */
-/* LOCVAL(LOCALE_SENGCOUNTRY,"Germany") */
-/* LOCVAL(LOCALE_SABBREVCTRYNAME,"De") */
-/* LOCVAL(LOCALE_SNATIVECTRYNAME,"Deutschland") */
-/* LOCVAL(LOCALE_IDEFAULTLANGUAGE,"9") ISO ID of lang TODO */
-/* LOCVAL(LOCALE_IDEFAULTCOUNTRY,"49") */
-LOCVAL(LOCALE_IDEFAULTCODEPAGE,"3") /* is this right? TODO */
-LOCVAL(LOCALE_IDEFAULTANSICODEPAGE,"3") /* is this right? TODO */
-LOCVAL(LOCALE_SLIST,";")
-LOCVAL(LOCALE_IMEASURE,"0")
-LOCVAL(LOCALE_SDECIMAL,",")
-LOCVAL(LOCALE_STHOUSAND,".")
-/* LOCVAL(LOCALE_SGROUPING) */
-LOCVAL(LOCALE_IDIGITS,"2")
-LOCVAL(LOCALE_ILZERO,"1")
-/* LOCVAL(LOCALE_INEGNUMBER) */
-/* LOCVAL(LOCALE_SNATIVEDIGITS) */
-LOCVAL(LOCALE_SCURRENCY,"NLG") /* accounting currency of UEA */
-/* LOCVAL(LOCALE_SINTLSYMBOL) */
-/* LOCVAL(LOCALE_SMONDECIMALSEP) */
-/* LOCVAL(LOCALE_SMONTHOUSANDSEP) */
-/* LOCVAL(LOCALE_SMONGROUPING) */
-/* LOCVAL(LOCALE_ICURRDIGITS,"2") */
-/* LOCVAL(LOCALE_IINTLCURRDIGITS) */
-LOCVAL(LOCALE_ICURRENCY,"3")
-LOCVAL(LOCALE_INEGCURR,"8")
-LOCVAL(LOCALE_SDATE,".")
-LOCVAL(LOCALE_STIME,":")
-LOCVAL(LOCALE_SSHORTDATE,"yyyy.mm.dd")
-LOCVAL(LOCALE_SLONGDATE,"ddd, d. MMMM yyyy")
-/* LOCVAL(LOCALE_STIMEFORMAT) */
-LOCVAL(LOCALE_IDATE,"1")
-/* LOCVAL(LOCALE_ILDATE) */
-LOCVAL(LOCALE_ITIME,"1")
-/* LOCVAL(LOCALE_ITIMEMARKPOSN) */
-/* LOCVAL(LOCALE_ICENTURY) */
-LOCVAL(LOCALE_ITLZERO,"1")
-/* LOCVAL(LOCALE_IDAYLZERO) */
-/* LOCVAL(LOCALE_IMONLZERO) */
-/* LOCVAL(LOCALE_S1159) */
-/* LOCVAL(LOCALE_S2359) */
-/* LOCVAL(LOCALE_ICALENDARTYPE) */
-/* LOCVAL(LOCALE_IOPTIONALCALENDAR) */
-/* LOCVAL(LOCALE_IFIRSTDAYOFWEEK) */
-/* LOCVAL(LOCALE_IFIRSTWEEKOFYEAR) */
-LOCVAL(LOCALE_SDAYNAME1,"lundo")
-LOCVAL(LOCALE_SDAYNAME2,"mardo")
-LOCVAL(LOCALE_SDAYNAME3,"merkredo")
-LOCVAL(LOCALE_SDAYNAME4,"¼aýdo")
-LOCVAL(LOCALE_SDAYNAME5,"vendredo")
-LOCVAL(LOCALE_SDAYNAME6,"sabato")
-LOCVAL(LOCALE_SDAYNAME7,"dimanæo")
-LOCVAL(LOCALE_SABBREVDAYNAME1,"lu")
-LOCVAL(LOCALE_SABBREVDAYNAME2,"ma")
-LOCVAL(LOCALE_SABBREVDAYNAME3,"me")
-LOCVAL(LOCALE_SABBREVDAYNAME4,"¼a")
-LOCVAL(LOCALE_SABBREVDAYNAME5,"ve")
-LOCVAL(LOCALE_SABBREVDAYNAME6,"sa")
-LOCVAL(LOCALE_SABBREVDAYNAME7,"di")
-LOCVAL(LOCALE_SMONTHNAME1,"januaro")
-LOCVAL(LOCALE_SMONTHNAME2,"februaro")
-LOCVAL(LOCALE_SMONTHNAME3,"marto")
-LOCVAL(LOCALE_SMONTHNAME4,"aprilo")
-LOCVAL(LOCALE_SMONTHNAME5,"majo")
-LOCVAL(LOCALE_SMONTHNAME6,"junio")
-LOCVAL(LOCALE_SMONTHNAME7,"julio")
-LOCVAL(LOCALE_SMONTHNAME8,"aýgusto")
-LOCVAL(LOCALE_SMONTHNAME9,"septembro")
-LOCVAL(LOCALE_SMONTHNAME10,"oktobro")
-LOCVAL(LOCALE_SMONTHNAME11,"novembro")
-LOCVAL(LOCALE_SMONTHNAME12,"decembro")
-LOCVAL(LOCALE_SMONTHNAME13,"")
-LOCVAL(LOCALE_SABBREVMONTHNAME1,"jan")
-LOCVAL(LOCALE_SABBREVMONTHNAME2,"feb")
-LOCVAL(LOCALE_SABBREVMONTHNAME3,"mar")
-LOCVAL(LOCALE_SABBREVMONTHNAME4,"apr")
-LOCVAL(LOCALE_SABBREVMONTHNAME5,"maj")
-LOCVAL(LOCALE_SABBREVMONTHNAME6,"jun")
-LOCVAL(LOCALE_SABBREVMONTHNAME7,"jul")
-LOCVAL(LOCALE_SABBREVMONTHNAME8,"aýg")
-LOCVAL(LOCALE_SABBREVMONTHNAME9,"sep")
-LOCVAL(LOCALE_SABBREVMONTHNAME10,"okt")
-LOCVAL(LOCALE_SABBREVMONTHNAME11,"nov")
-LOCVAL(LOCALE_SABBREVMONTHNAME12,"dec")
-LOCVAL(LOCALE_SABBREVMONTHNAME13,"")
-/* LOCVAL(LOCALE_SPOSITIVESIGN) */
-/* LOCVAL(LOCALE_SNEGATIVESIGN) */
-/* LOCVAL(LOCALE_IPOSSIGNPOSN) */
-/* LOCVAL(LOCALE_INEGSIGNPOSN) */
-/* LOCVAL(LOCALE_IPOSSYMPRECEDES) */
-/* LOCVAL(LOCALE_IPOSSEPBYSPACE) */
-/* LOCVAL(LOCALE_INEGSYMPRECEDES) */
-/* LOCVAL(LOCALE_INEGSEPBYSPACE) */
+#include "nls/esperanto.nls"
 	default: found=0;break;
 	}
     break;  /* LANG(Eo) */
 
     case LANG_Fi:
     	switch (LCType) {
-LOCVAL(LOCALE_ILANGUAGE,"11")
-LOCVAL(LOCALE_SLANGUAGE,"Suomi")
-LOCVAL(LOCALE_SENGLANGUAGE,"Finnish")
-LOCVAL(LOCALE_SABBREVLANGNAME,"fin")
-LOCVAL(LOCALE_SNATIVELANGNAME,"suomi")
-LOCVAL(LOCALE_ICOUNTRY,"49")
-LOCVAL(LOCALE_SCOUNTRY,"Suomi")
-LOCVAL(LOCALE_SENGCOUNTRY,"Finland")
-LOCVAL(LOCALE_SABBREVCTRYNAME,"Fin")
-LOCVAL(LOCALE_SNATIVECTRYNAME,"Suomi")
-LOCVAL(LOCALE_IDEFAULTLANGUAGE,"11")
-LOCVAL(LOCALE_IDEFAULTCOUNTRY,"358")
-/* 
-LOCVAL(LOCALE_IDEFAULTCODEPAGE)
-LOCVAL(LOCALE_IDEFAULTANSICODEPAGE)
-*/
-LOCVAL(LOCALE_SLIST,";")
-LOCVAL(LOCALE_IMEASURE,"0")
-LOCVAL(LOCALE_SDECIMAL,",")
-LOCVAL(LOCALE_STHOUSAND,".")
-/*
-LOCVAL(LOCALE_SGROUPING)
-*/
-LOCVAL(LOCALE_IDIGITS,"2")
-LOCVAL(LOCALE_ILZERO,"1")
-/*
-LOCVAL(LOCALE_INEGNUMBER)
-Is this "0123456789" ??
-LOCVAL(LOCALE_SNATIVEDIGITS)
-*/
-LOCVAL(LOCALE_SCURRENCY,"mk")
-/*
-LOCVAL(LOCALE_SINTLSYMBOL)
-LOCVAL(LOCALE_SMONDECIMALSEP)
-LOCVAL(LOCALE_SMONTHOUSANDSEP)
-LOCVAL(LOCALE_SMONGROUPING)
-*/
-LOCVAL(LOCALE_ICURRDIGITS,"2")
-/*
-LOCVAL(LOCALE_IINTLCURRDIGITS)
-*/
-LOCVAL(LOCALE_ICURRENCY,"3")
-LOCVAL(LOCALE_INEGCURR,"8")
-LOCVAL(LOCALE_SDATE,".")
-LOCVAL(LOCALE_STIME,":")
-LOCVAL(LOCALE_SSHORTDATE,"dd.MM.yyyy")
-LOCVAL(LOCALE_SLONGDATE,"ddd, d. MMMM yyyy")
-/*
-LOCVAL(LOCALE_STIMEFORMAT)
-*/
-LOCVAL(LOCALE_IDATE,"1")
-/*
-LOCVAL(LOCALE_ILDATE)
-*/
-LOCVAL(LOCALE_ITIME,"1")
-/*
-LOCVAL(LOCALE_ITIMEMARKPOSN)
-LOCVAL(LOCALE_ICENTURY)
-*/
-LOCVAL(LOCALE_ITLZERO,"1")
-/*
-LOCVAL(LOCALE_IDAYLZERO)
-LOCVAL(LOCALE_IMONLZERO)
-*/
-LOCVAL(LOCALE_S1159, "AM")
-LOCVAL(LOCALE_S2359, "PM")
-/*
-LOCVAL(LOCALE_ICALENDARTYPE)
-LOCVAL(LOCALE_IOPTIONALCALENDAR)
-LOCVAL(LOCALE_IFIRSTDAYOFWEEK)
-LOCVAL(LOCALE_IFIRSTWEEKOFYEAR)
-*/
-LOCVAL(LOCALE_SDAYNAME1,"maanantai")
-LOCVAL(LOCALE_SDAYNAME2,"tiistai")
-LOCVAL(LOCALE_SDAYNAME3,"keskiviikko")
-LOCVAL(LOCALE_SDAYNAME4,"torstai")
-LOCVAL(LOCALE_SDAYNAME5,"perjantai")
-LOCVAL(LOCALE_SDAYNAME6,"lauantai")
-LOCVAL(LOCALE_SDAYNAME7,"sunnuntai")
-LOCVAL(LOCALE_SABBREVDAYNAME1,"Ma")
-LOCVAL(LOCALE_SABBREVDAYNAME2,"Ti")
-LOCVAL(LOCALE_SABBREVDAYNAME3,"Ke")
-LOCVAL(LOCALE_SABBREVDAYNAME4,"To")
-LOCVAL(LOCALE_SABBREVDAYNAME5,"Pe")
-LOCVAL(LOCALE_SABBREVDAYNAME6,"La")
-LOCVAL(LOCALE_SABBREVDAYNAME7,"Su")
-LOCVAL(LOCALE_SMONTHNAME1,"tammikuu")
-LOCVAL(LOCALE_SMONTHNAME2,"helmikuu")
-LOCVAL(LOCALE_SMONTHNAME3,"maaliskuu")
-LOCVAL(LOCALE_SMONTHNAME4,"huhtikuu")
-LOCVAL(LOCALE_SMONTHNAME5,"toukokuu")
-LOCVAL(LOCALE_SMONTHNAME6,"kesäkuu")
-LOCVAL(LOCALE_SMONTHNAME7,"heinäkuu")
-LOCVAL(LOCALE_SMONTHNAME8,"elokuu")
-LOCVAL(LOCALE_SMONTHNAME9,"syyskuu")
-LOCVAL(LOCALE_SMONTHNAME10,"lokakuu")
-LOCVAL(LOCALE_SMONTHNAME11,"marraskuu")
-LOCVAL(LOCALE_SMONTHNAME12,"joulukuu")
-LOCVAL(LOCALE_SMONTHNAME13,"")
-LOCVAL(LOCALE_SABBREVMONTHNAME1,"tammi")
-LOCVAL(LOCALE_SABBREVMONTHNAME2,"helmi")
-LOCVAL(LOCALE_SABBREVMONTHNAME3,"maalis")
-LOCVAL(LOCALE_SABBREVMONTHNAME4,"huhti")
-LOCVAL(LOCALE_SABBREVMONTHNAME5,"touko")
-LOCVAL(LOCALE_SABBREVMONTHNAME6,"kesä")
-LOCVAL(LOCALE_SABBREVMONTHNAME7,"heinä")
-LOCVAL(LOCALE_SABBREVMONTHNAME8,"elo")
-LOCVAL(LOCALE_SABBREVMONTHNAME9,"syys")
-LOCVAL(LOCALE_SABBREVMONTHNAME10,"loka")
-LOCVAL(LOCALE_SABBREVMONTHNAME11,"marras")
-LOCVAL(LOCALE_SABBREVMONTHNAME12,"joulu")
-LOCVAL(LOCALE_SABBREVMONTHNAME13,"")
-LOCVAL(LOCALE_SPOSITIVESIGN, "")
-LOCVAL(LOCALE_SNEGATIVESIGN, "-")
-/*
-LOCVAL(LOCALE_IPOSSIGNPOSN)
-LOCVAL(LOCALE_INEGSIGNPOSN)
-LOCVAL(LOCALE_IPOSSYMPRECEDES)
-LOCVAL(LOCALE_IPOSSEPBYSPACE)
-LOCVAL(LOCALE_INEGSYMPRECEDES)
-LOCVAL(LOCALE_INEGSEPBYSPACE)
-*/
+#include "nls/fin.nls"
 	default: found=0;break;
 	}
     break;  /* LANG(Fi) */
 
     case LANG_It:
     	switch (LCType) {
-LOCVAL(LOCALE_ILANGUAGE,"9")
-LOCVAL(LOCALE_SLANGUAGE,"Italiano")
-LOCVAL(LOCALE_SENGLANGUAGE,"Italian")
-LOCVAL(LOCALE_SABBREVLANGNAME,"ita")
-LOCVAL(LOCALE_SNATIVELANGNAME,"Italiano")
-LOCVAL(LOCALE_ICOUNTRY,"39")
-LOCVAL(LOCALE_SCOUNTRY,"Italia")
-LOCVAL(LOCALE_SENGCOUNTRY,"Italy")
-LOCVAL(LOCALE_SABBREVCTRYNAME,"It")
-LOCVAL(LOCALE_SNATIVECTRYNAME,"Italia")
-LOCVAL(LOCALE_IDEFAULTLANGUAGE,"9")
-LOCVAL(LOCALE_IDEFAULTCOUNTRY,"39")
-/* Dunno
-LOCVAL(LOCALE_IDEFAULTCODEPAGE)
-LOCVAL(LOCALE_IDEFAULTANSICODEPAGE)
-*/
-LOCVAL(LOCALE_SLIST,";")
-LOCVAL(LOCALE_IMEASURE,"0")
-LOCVAL(LOCALE_SDECIMAL,",")
-LOCVAL(LOCALE_STHOUSAND,".")
-/*
-LOCVAL(LOCALE_SGROUPING)
-*/
-LOCVAL(LOCALE_IDIGITS,"2")
-LOCVAL(LOCALE_ILZERO,"1")
-/*
-LOCVAL(LOCALE_INEGNUMBER)
-Is this "0123456789" ??
-LOCVAL(LOCALE_SNATIVEDIGITS)
-*/
-LOCVAL(LOCALE_SCURRENCY,"Lit.")
-/*
-LOCVAL(LOCALE_SINTLSYMBOL)
-LOCVAL(LOCALE_SMONDECIMALSEP)
-LOCVAL(LOCALE_SMONTHOUSANDSEP)
-LOCVAL(LOCALE_SMONGROUPING)
-*/
-LOCVAL(LOCALE_ICURRDIGITS,"2")
-/*
-LOCVAL(LOCALE_IINTLCURRDIGITS)
-*/
-LOCVAL(LOCALE_ICURRENCY,"3")
-LOCVAL(LOCALE_INEGCURR,"8")
-LOCVAL(LOCALE_SDATE,".")
-LOCVAL(LOCALE_STIME,":")
-LOCVAL(LOCALE_SSHORTDATE,"dd.MM.yyyy")
-LOCVAL(LOCALE_SLONGDATE,"ddd, d. MMMM yyyy")
-/*
-LOCVAL(LOCALE_STIMEFORMAT)
-*/
-LOCVAL(LOCALE_IDATE,"1")
-/*
-LOCVAL(LOCALE_ILDATE)
-*/
-LOCVAL(LOCALE_ITIME,"1")
-/*
-LOCVAL(LOCALE_ITIMEMARKPOSN)
-LOCVAL(LOCALE_ICENTURY)
-*/
-LOCVAL(LOCALE_ITLZERO,"1")
-/*
-LOCVAL(LOCALE_IDAYLZERO)
-LOCVAL(LOCALE_IMONLZERO)
-LOCVAL(LOCALE_S1159)
-LOCVAL(LOCALE_S2359)
-LOCVAL(LOCALE_ICALENDARTYPE)
-LOCVAL(LOCALE_IOPTIONALCALENDAR)
-LOCVAL(LOCALE_IFIRSTDAYOFWEEK)
-LOCVAL(LOCALE_IFIRSTWEEKOFYEAR)
-*/
-LOCVAL(LOCALE_SDAYNAME1,"Lunedi'")
-LOCVAL(LOCALE_SDAYNAME2,"Martedi'")
-LOCVAL(LOCALE_SDAYNAME3,"Mercoledi'")
-LOCVAL(LOCALE_SDAYNAME4,"Giovedi'")
-LOCVAL(LOCALE_SDAYNAME5,"Venerdi'")
-LOCVAL(LOCALE_SDAYNAME6,"Sabato")
-LOCVAL(LOCALE_SDAYNAME7,"Domenica")
-LOCVAL(LOCALE_SABBREVDAYNAME1,"Lu")
-LOCVAL(LOCALE_SABBREVDAYNAME2,"Ma")
-LOCVAL(LOCALE_SABBREVDAYNAME3,"Me")
-LOCVAL(LOCALE_SABBREVDAYNAME4,"Gi")
-LOCVAL(LOCALE_SABBREVDAYNAME5,"Ve")
-LOCVAL(LOCALE_SABBREVDAYNAME6,"Sa")
-LOCVAL(LOCALE_SABBREVDAYNAME7,"Do")
-LOCVAL(LOCALE_SMONTHNAME1,"Gennaio")
-LOCVAL(LOCALE_SMONTHNAME2,"Febbraio")
-LOCVAL(LOCALE_SMONTHNAME3,"Marzo")
-LOCVAL(LOCALE_SMONTHNAME4,"Aprile")
-LOCVAL(LOCALE_SMONTHNAME5,"Maggio")
-LOCVAL(LOCALE_SMONTHNAME6,"Giugno")
-LOCVAL(LOCALE_SMONTHNAME7,"Luglio")
-LOCVAL(LOCALE_SMONTHNAME8,"Agosto")
-LOCVAL(LOCALE_SMONTHNAME9,"Settembre")
-LOCVAL(LOCALE_SMONTHNAME10,"Ottobre")
-LOCVAL(LOCALE_SMONTHNAME11,"Novembre")
-LOCVAL(LOCALE_SMONTHNAME12,"Dicembre")
-LOCVAL(LOCALE_SMONTHNAME13,"")
-LOCVAL(LOCALE_SABBREVMONTHNAME1,"Gen")
-LOCVAL(LOCALE_SABBREVMONTHNAME2,"Feb")
-LOCVAL(LOCALE_SABBREVMONTHNAME3,"Mar")
-LOCVAL(LOCALE_SABBREVMONTHNAME4,"Apr")
-LOCVAL(LOCALE_SABBREVMONTHNAME5,"Mag")
-LOCVAL(LOCALE_SABBREVMONTHNAME6,"Giu")
-LOCVAL(LOCALE_SABBREVMONTHNAME7,"Lug")
-LOCVAL(LOCALE_SABBREVMONTHNAME8,"Ago")
-LOCVAL(LOCALE_SABBREVMONTHNAME9,"Set")
-LOCVAL(LOCALE_SABBREVMONTHNAME10,"Ott")
-LOCVAL(LOCALE_SABBREVMONTHNAME11,"Nov")
-LOCVAL(LOCALE_SABBREVMONTHNAME12,"Dic")
-LOCVAL(LOCALE_SABBREVMONTHNAME13,"")
-/*
-LOCVAL(LOCALE_SPOSITIVESIGN)
-LOCVAL(LOCALE_SNEGATIVESIGN)
-LOCVAL(LOCALE_IPOSSIGNPOSN)
-LOCVAL(LOCALE_INEGSIGNPOSN)
-LOCVAL(LOCALE_IPOSSYMPRECEDES)
-LOCVAL(LOCALE_IPOSSEPBYSPACE)
-LOCVAL(LOCALE_INEGSYMPRECEDES)
-LOCVAL(LOCALE_INEGSEPBYSPACE)
-*/
+#include "nls/ita.nls"
 	default: found=0;break;
 	}
     break;  /* LANG(It) */
 
     case 0x0809:
     	switch (LCType) {
-LOCVAL(LOCALE_ILANGUAGE, "0809")
-LOCVAL(LOCALE_SLANGUAGE, "English (United Kingdom)")
-LOCVAL(LOCALE_SENGLANGUAGE, "English")
-LOCVAL(LOCALE_SABBREVLANGNAME, "ENG")
-LOCVAL(LOCALE_SNATIVELANGNAME, "English")
-LOCVAL(LOCALE_ICOUNTRY, "44")
-LOCVAL(LOCALE_SCOUNTRY, "United Kingdom")
-LOCVAL(LOCALE_SENGCOUNTRY, "United Kingdom")
-LOCVAL(LOCALE_SABBREVCTRYNAME, "GBR")
-LOCVAL(LOCALE_SNATIVECTRYNAME, "United Kingdom")
-LOCVAL(LOCALE_IDEFAULTLANGUAGE, "0809")
-LOCVAL(LOCALE_IDEFAULTCOUNTRY, "44")
-LOCVAL(LOCALE_IDEFAULTCODEPAGE, "850")
-LOCVAL(LOCALE_IDEFAULTANSICODEPAGE, "1252")
-LOCVAL(LOCALE_SLIST, ",")
-LOCVAL(LOCALE_IMEASURE, "0")
-LOCVAL(LOCALE_SDECIMAL, ".")
-LOCVAL(LOCALE_STHOUSAND, ",")
-LOCVAL(LOCALE_SGROUPING, "3;0")
-LOCVAL(LOCALE_IDIGITS, "2")
-LOCVAL(LOCALE_ILZERO, "1")
-LOCVAL(LOCALE_INEGNUMBER, "1")
-LOCVAL(LOCALE_SNATIVEDIGITS, "0123456789")
-LOCVAL(LOCALE_SCURRENCY, "£")
-LOCVAL(LOCALE_SINTLSYMBOL, "GBP")
-LOCVAL(LOCALE_SMONDECIMALSEP, ".")
-LOCVAL(LOCALE_SMONTHOUSANDSEP, ",")
-LOCVAL(LOCALE_SMONGROUPING, "3;0")
-LOCVAL(LOCALE_ICURRDIGITS, "2")
-LOCVAL(LOCALE_IINTLCURRDIGITS, "2")
-LOCVAL(LOCALE_ICURRENCY, "0")
-LOCVAL(LOCALE_INEGCURR, "1")
-LOCVAL(LOCALE_SDATE, "/")
-LOCVAL(LOCALE_STIME, ":")
-LOCVAL(LOCALE_SSHORTDATE, "dd/MM/yy")
-LOCVAL(LOCALE_SLONGDATE, "dd MMMM yyyy")
-LOCVAL(LOCALE_STIMEFORMAT, "HH:mm:ss")
-LOCVAL(LOCALE_IDATE, "1")
-LOCVAL(LOCALE_ILDATE, "1")
-LOCVAL(LOCALE_ITIME, "1")
-LOCVAL(LOCALE_ITIMEMARKPOSN, "0")
-LOCVAL(LOCALE_ICENTURY, "0")
-LOCVAL(LOCALE_ITLZERO, "1")
-LOCVAL(LOCALE_IDAYLZERO, "1")
-LOCVAL(LOCALE_IMONLZERO, "1")
-LOCVAL(LOCALE_S1159, "AM")
-LOCVAL(LOCALE_S2359, "PM")
-LOCVAL(LOCALE_ICALENDARTYPE, "1")
-LOCVAL(LOCALE_IOPTIONALCALENDAR, "0")
-LOCVAL(LOCALE_IFIRSTDAYOFWEEK, "0")
-LOCVAL(LOCALE_IFIRSTWEEKOFYEAR, "0")
-LOCVAL(LOCALE_SDAYNAME1, "Monday")
-LOCVAL(LOCALE_SDAYNAME2, "Tuesday")
-LOCVAL(LOCALE_SDAYNAME3, "Wednesday")
-LOCVAL(LOCALE_SDAYNAME4, "Thursday")
-LOCVAL(LOCALE_SDAYNAME5, "Friday")
-LOCVAL(LOCALE_SDAYNAME6, "Saturday")
-LOCVAL(LOCALE_SDAYNAME7, "Sunday")
-LOCVAL(LOCALE_SABBREVDAYNAME1, "Mon")
-LOCVAL(LOCALE_SABBREVDAYNAME2, "Tue")
-LOCVAL(LOCALE_SABBREVDAYNAME3, "Wed")
-LOCVAL(LOCALE_SABBREVDAYNAME4, "Thu")
-LOCVAL(LOCALE_SABBREVDAYNAME5, "Fri")
-LOCVAL(LOCALE_SABBREVDAYNAME6, "Sat")
-LOCVAL(LOCALE_SABBREVDAYNAME7, "Sun")
-LOCVAL(LOCALE_SMONTHNAME1, "January")
-LOCVAL(LOCALE_SMONTHNAME2, "February")
-LOCVAL(LOCALE_SMONTHNAME3, "March")
-LOCVAL(LOCALE_SMONTHNAME4, "April")
-LOCVAL(LOCALE_SMONTHNAME5, "May")
-LOCVAL(LOCALE_SMONTHNAME6, "June")
-LOCVAL(LOCALE_SMONTHNAME7, "July")
-LOCVAL(LOCALE_SMONTHNAME8, "August")
-LOCVAL(LOCALE_SMONTHNAME9, "September")
-LOCVAL(LOCALE_SMONTHNAME10, "October")
-LOCVAL(LOCALE_SMONTHNAME11, "November")
-LOCVAL(LOCALE_SMONTHNAME12, "December")
-LOCVAL(LOCALE_SMONTHNAME13, "")
-LOCVAL(LOCALE_SABBREVMONTHNAME1, "Jan")
-LOCVAL(LOCALE_SABBREVMONTHNAME2, "Feb")
-LOCVAL(LOCALE_SABBREVMONTHNAME3, "Mar")
-LOCVAL(LOCALE_SABBREVMONTHNAME4, "Apr")
-LOCVAL(LOCALE_SABBREVMONTHNAME5, "May")
-LOCVAL(LOCALE_SABBREVMONTHNAME6, "Jun")
-LOCVAL(LOCALE_SABBREVMONTHNAME7, "Jul")
-LOCVAL(LOCALE_SABBREVMONTHNAME8, "Aug")
-LOCVAL(LOCALE_SABBREVMONTHNAME9, "Sep")
-LOCVAL(LOCALE_SABBREVMONTHNAME10, "Oct")
-LOCVAL(LOCALE_SABBREVMONTHNAME11, "Nov")
-LOCVAL(LOCALE_SABBREVMONTHNAME12, "Dec")
-LOCVAL(LOCALE_SABBREVMONTHNAME13, "")
-LOCVAL(LOCALE_SPOSITIVESIGN, "")
-LOCVAL(LOCALE_SNEGATIVESIGN, "-")
-LOCVAL(LOCALE_IPOSSIGNPOSN, "3")
-LOCVAL(LOCALE_INEGSIGNPOSN, "3")
-LOCVAL(LOCALE_IPOSSYMPRECEDES, "1")
-LOCVAL(LOCALE_IPOSSEPBYSPACE, "0")
-LOCVAL(LOCALE_INEGSYMPRECEDES, "1")
-LOCVAL(LOCALE_INEGSEPBYSPACE, "0")
+#include "nls/eng.nls"
 	default: found=0;break;
 	}
     break; /* LANG(0x0809) (U.K. English) */
 
     case LANG_Ko: /* string using codepage 949 */
         switch (LCType) {
-LOCVAL(LOCALE_ILANGUAGE,"18")
-LOCVAL(LOCALE_SLANGUAGE,"\307\321\261\271\276\356")
-LOCVAL(LOCALE_SENGLANGUAGE,"Korean")
-LOCVAL(LOCALE_SABBREVLANGNAME,"KOR")
-LOCVAL(LOCALE_SNATIVELANGNAME,"\307\321\261\271\276\356")
-LOCVAL(LOCALE_ICOUNTRY,"82")
-LOCVAL(LOCALE_SCOUNTRY,"\264\353\307\321\271\316\261\271")
-LOCVAL(LOCALE_SENGCOUNTRY,"Korea (South)")
-LOCVAL(LOCALE_SABBREVCTRYNAME,"KOR")
-LOCVAL(LOCALE_SNATIVECTRYNAME,"\264\353\307\321\271\316\261\271")
-LOCVAL(LOCALE_IDEFAULTLANGUAGE,"18")
-LOCVAL(LOCALE_IDEFAULTCOUNTRY,"82")
-LOCVAL(LOCALE_IDEFAULTCODEPAGE,"949")
-LOCVAL(LOCALE_IDEFAULTANSICODEPAGE,"949")
-LOCVAL(LOCALE_SLIST,",")
-LOCVAL(LOCALE_IMEASURE,"0")
-LOCVAL(LOCALE_SDECIMAL,".")
-LOCVAL(LOCALE_STHOUSAND,",")
-LOCVAL(LOCALE_SGROUPING,"3;0")
-LOCVAL(LOCALE_IDIGITS,"2")
-LOCVAL(LOCALE_ILZERO,"0")
-LOCVAL(LOCALE_INEGNUMBER,"1")
-LOCVAL(LOCALE_SNATIVEDIGITS,"0123456789")
-LOCVAL(LOCALE_SCURRENCY,"\\")
-LOCVAL(LOCALE_SINTLSYMBOL,"Won")
-LOCVAL(LOCALE_SMONDECIMALSEP,".")
-LOCVAL(LOCALE_SMONTHOUSANDSEP,",")
-LOCVAL(LOCALE_SMONGROUPING,"3;0")
-LOCVAL(LOCALE_ICURRDIGITS,"2")
-LOCVAL(LOCALE_IINTLCURRDIGITS,"2")
-LOCVAL(LOCALE_ICURRENCY,"3")
-LOCVAL(LOCALE_INEGCURR,"8")
-LOCVAL(LOCALE_SDATE,"/")
-LOCVAL(LOCALE_STIME,":")
-LOCVAL(LOCALE_SSHORTDATE,"yyyy/MM/dd")
-LOCVAL(LOCALE_SLONGDATE,"yyyy/MM/dd")
-LOCVAL(LOCALE_STIMEFORMAT,"h:mm:ss tt")
-LOCVAL(LOCALE_IDATE,"1")
-LOCVAL(LOCALE_ILDATE,"1")
-LOCVAL(LOCALE_ITIME,"1")
-LOCVAL(LOCALE_ITIMEMARKPOSN,"0")
-LOCVAL(LOCALE_ICENTURY,"0")
-LOCVAL(LOCALE_ITLZERO,"0")
-LOCVAL(LOCALE_IDAYLZERO,"0")
-LOCVAL(LOCALE_IMONLZERO,"0")
-LOCVAL(LOCALE_S1159,"\277\300\300\374")
-LOCVAL(LOCALE_S2359,"\277\300\310\304")
-LOCVAL(LOCALE_ICALENDARTYPE,"1")
-/* Korean Tangun Era calendar */
-LOCVAL(LOCALE_IOPTIONALCALENDAR,"5")
-LOCVAL(LOCALE_IFIRSTDAYOFWEEK,"6")
-LOCVAL(LOCALE_IFIRSTWEEKOFYEAR,"0")
-LOCVAL(LOCALE_SDAYNAME1,"\277\371\277\344\300\317")
-LOCVAL(LOCALE_SDAYNAME2,"\310\255\277\344\300\317")
-LOCVAL(LOCALE_SDAYNAME3,"\274\366\277\344\300\317")
-LOCVAL(LOCALE_SDAYNAME4,"\270\361\277\344\300\317")
-LOCVAL(LOCALE_SDAYNAME5,"\261\335\277\344\300\317")
-LOCVAL(LOCALE_SDAYNAME6,"\305\344\277\344\300\317")
-LOCVAL(LOCALE_SDAYNAME7,"\300\317\277\344\300\317")
-LOCVAL(LOCALE_SABBREVDAYNAME1,"\277\371")
-LOCVAL(LOCALE_SABBREVDAYNAME2,"\310\255")
-LOCVAL(LOCALE_SABBREVDAYNAME3,"\274\366")
-LOCVAL(LOCALE_SABBREVDAYNAME4,"\270\361")
-LOCVAL(LOCALE_SABBREVDAYNAME5,"\261\335")
-LOCVAL(LOCALE_SABBREVDAYNAME6,"\305\344")
-LOCVAL(LOCALE_SABBREVDAYNAME7,"\300\317")
-LOCVAL(LOCALE_SMONTHNAME1,"1\277\371")
-LOCVAL(LOCALE_SMONTHNAME2,"2\277\371")
-LOCVAL(LOCALE_SMONTHNAME3,"3\277\371")
-LOCVAL(LOCALE_SMONTHNAME4,"4\277\371")
-LOCVAL(LOCALE_SMONTHNAME5,"5\277\371")
-LOCVAL(LOCALE_SMONTHNAME6,"6\277\371")
-LOCVAL(LOCALE_SMONTHNAME7,"7\277\371")
-LOCVAL(LOCALE_SMONTHNAME8,"8\277\371")
-LOCVAL(LOCALE_SMONTHNAME9,"9\277\371")
-LOCVAL(LOCALE_SMONTHNAME10,"10\277\371")
-LOCVAL(LOCALE_SMONTHNAME11,"11\277\371")
-LOCVAL(LOCALE_SMONTHNAME12,"12\277\371")
-LOCVAL(LOCALE_SMONTHNAME13,"")
-LOCVAL(LOCALE_SABBREVMONTHNAME1,"1\277\371")
-LOCVAL(LOCALE_SABBREVMONTHNAME2,"2\277\371")
-LOCVAL(LOCALE_SABBREVMONTHNAME3,"3\277\371")
-LOCVAL(LOCALE_SABBREVMONTHNAME4,"4\277\371")
-LOCVAL(LOCALE_SABBREVMONTHNAME5,"5\277\371")
-LOCVAL(LOCALE_SABBREVMONTHNAME6,"6\277\371")
-LOCVAL(LOCALE_SABBREVMONTHNAME7,"7\277\371")
-LOCVAL(LOCALE_SABBREVMONTHNAME8,"8\277\371")
-LOCVAL(LOCALE_SABBREVMONTHNAME9,"9\277\371")
-LOCVAL(LOCALE_SABBREVMONTHNAME10,"10\277\371")
-LOCVAL(LOCALE_SABBREVMONTHNAME11,"11\277\371")
-LOCVAL(LOCALE_SABBREVMONTHNAME12,"12\277\371")
-LOCVAL(LOCALE_SABBREVMONTHNAME13,"")
-LOCVAL(LOCALE_SPOSITIVESIGN,"")
-LOCVAL(LOCALE_SNEGATIVESIGN,"-")
-LOCVAL(LOCALE_IPOSSIGNPOSN,"3")
-LOCVAL(LOCALE_INEGSIGNPOSN,"0")
-LOCVAL(LOCALE_IPOSSYMPRECEDES,"3")
-LOCVAL(LOCALE_IPOSSEPBYSPACE,"0")
-LOCVAL(LOCALE_INEGSYMPRECEDES,"3")
-LOCVAL(LOCALE_INEGSEPBYSPACE,"0")
+#include "nls/kor.nls"
         default: found=0;break;
         }
     break;  /* LANG(Ko) */
 
     case LANG_Hu:
     	switch (LCType) {
-LOCVAL(LOCALE_ILANGUAGE,"9")
-LOCVAL(LOCALE_SLANGUAGE,"Magyar")
-LOCVAL(LOCALE_SENGLANGUAGE,"Hungarian")
-LOCVAL(LOCALE_SABBREVLANGNAME,"hun")
-LOCVAL(LOCALE_SNATIVELANGNAME,"Magyar")
-LOCVAL(LOCALE_ICOUNTRY,"36")
-LOCVAL(LOCALE_SCOUNTRY,"Magyarország")
-LOCVAL(LOCALE_SENGCOUNTRY,"Hungary")
-LOCVAL(LOCALE_SABBREVCTRYNAME,"Hu")
-LOCVAL(LOCALE_SNATIVECTRYNAME,"Magyarország")
-LOCVAL(LOCALE_IDEFAULTLANGUAGE,"9")
-LOCVAL(LOCALE_IDEFAULTCOUNTRY,"36")
-LOCVAL(LOCALE_IDEFAULTCODEPAGE,"852")
-LOCVAL(LOCALE_IDEFAULTANSICODEPAGE,"852")
-LOCVAL(LOCALE_SLIST,";")
-LOCVAL(LOCALE_IMEASURE,"0")
-LOCVAL(LOCALE_SDECIMAL,".")
-LOCVAL(LOCALE_STHOUSAND,",")
-/*
-LOCVAL(LOCALE_SGROUPING)
-*/
-LOCVAL(LOCALE_IDIGITS,"2")
-LOCVAL(LOCALE_ILZERO,"1")
-/*
-LOCVAL(LOCALE_INEGNUMBER)
-Is this "0123456789" ??
-LOCVAL(LOCALE_SNATIVEDIGITS)
-*/
-LOCVAL(LOCALE_SCURRENCY,"Ft")
-/*
-LOCVAL(LOCALE_SINTLSYMBOL)
-LOCVAL(LOCALE_SMONDECIMALSEP)
-LOCVAL(LOCALE_SMONTHOUSANDSEP)
-LOCVAL(LOCALE_SMONGROUPING)
-*/
-LOCVAL(LOCALE_ICURRDIGITS,"0")
-/*
-LOCVAL(LOCALE_IINTLCURRDIGITS)
-*/
-LOCVAL(LOCALE_ICURRENCY,"3")
-LOCVAL(LOCALE_INEGCURR,"8")
-LOCVAL(LOCALE_SDATE,"/")
-LOCVAL(LOCALE_STIME,":")
-LOCVAL(LOCALE_SSHORTDATE,"yyyy.MM.dd")
-LOCVAL(LOCALE_SLONGDATE,"ddd, yyyy. MMMM d")
-/*
-LOCVAL(LOCALE_STIMEFORMAT)
-*/
-LOCVAL(LOCALE_IDATE,"1")
-/*
-LOCVAL(LOCALE_ILDATE)
-*/
-LOCVAL(LOCALE_ITIME,"1")
-/*
-LOCVAL(LOCALE_ITIMEMARKPOSN)
-LOCVAL(LOCALE_ICENTURY)
-*/
-LOCVAL(LOCALE_ITLZERO,"1")
-/*
-LOCVAL(LOCALE_IDAYLZERO)
-LOCVAL(LOCALE_IMONLZERO)
-LOCVAL(LOCALE_S1159)
-LOCVAL(LOCALE_S2359)
-LOCVAL(LOCALE_ICALENDARTYPE)
-LOCVAL(LOCALE_IOPTIONALCALENDAR)
-LOCVAL(LOCALE_IFIRSTDAYOFWEEK)
-LOCVAL(LOCALE_IFIRSTWEEKOFYEAR)
-*/
-LOCVAL(LOCALE_SDAYNAME1,"Hétfõ")
-LOCVAL(LOCALE_SDAYNAME2,"Kedd")
-LOCVAL(LOCALE_SDAYNAME3,"Szerda")
-LOCVAL(LOCALE_SDAYNAME4,"Csütörtök")
-LOCVAL(LOCALE_SDAYNAME5,"Péntek")
-LOCVAL(LOCALE_SDAYNAME6,"Szombat")
-LOCVAL(LOCALE_SDAYNAME7,"Vasárnap")
-LOCVAL(LOCALE_SABBREVDAYNAME1,"Hé")
-LOCVAL(LOCALE_SABBREVDAYNAME2,"Ke")
-LOCVAL(LOCALE_SABBREVDAYNAME3,"Se")
-LOCVAL(LOCALE_SABBREVDAYNAME4,"Cs")
-LOCVAL(LOCALE_SABBREVDAYNAME5,"Pé")
-LOCVAL(LOCALE_SABBREVDAYNAME6,"So")
-LOCVAL(LOCALE_SABBREVDAYNAME7,"Va")
-LOCVAL(LOCALE_SMONTHNAME1,"Január")
-LOCVAL(LOCALE_SMONTHNAME2,"Február")
-LOCVAL(LOCALE_SMONTHNAME3,"Március")
-LOCVAL(LOCALE_SMONTHNAME4,"Április")
-LOCVAL(LOCALE_SMONTHNAME5,"Május")
-LOCVAL(LOCALE_SMONTHNAME6,"Június")
-LOCVAL(LOCALE_SMONTHNAME7,"Július")
-LOCVAL(LOCALE_SMONTHNAME8,"Augusztus")
-LOCVAL(LOCALE_SMONTHNAME9,"Szeptember")
-LOCVAL(LOCALE_SMONTHNAME10,"Október")
-LOCVAL(LOCALE_SMONTHNAME11,"November")
-LOCVAL(LOCALE_SMONTHNAME12,"December")
-LOCVAL(LOCALE_SMONTHNAME13,"")
-LOCVAL(LOCALE_SABBREVMONTHNAME1,"Jan")
-LOCVAL(LOCALE_SABBREVMONTHNAME2,"Feb")
-LOCVAL(LOCALE_SABBREVMONTHNAME3,"Már")
-LOCVAL(LOCALE_SABBREVMONTHNAME4,"Ápr")
-LOCVAL(LOCALE_SABBREVMONTHNAME5,"Máj")
-LOCVAL(LOCALE_SABBREVMONTHNAME6,"Jún")
-LOCVAL(LOCALE_SABBREVMONTHNAME7,"Júl")
-LOCVAL(LOCALE_SABBREVMONTHNAME8,"Aug")
-LOCVAL(LOCALE_SABBREVMONTHNAME9,"Sze")
-LOCVAL(LOCALE_SABBREVMONTHNAME10,"Okt")
-LOCVAL(LOCALE_SABBREVMONTHNAME11,"Nov")
-LOCVAL(LOCALE_SABBREVMONTHNAME12,"Dec")
-LOCVAL(LOCALE_SABBREVMONTHNAME13,"")
-/*
-LOCVAL(LOCALE_SPOSITIVESIGN)
-LOCVAL(LOCALE_SNEGATIVESIGN)
-LOCVAL(LOCALE_IPOSSIGNPOSN)
-LOCVAL(LOCALE_INEGSIGNPOSN)
-LOCVAL(LOCALE_IPOSSYMPRECEDES)
-LOCVAL(LOCALE_IPOSSEPBYSPACE)
-LOCVAL(LOCALE_INEGSYMPRECEDES)
-LOCVAL(LOCALE_INEGSEPBYSPACE)
-*/
+#include "nls/hun.nls"
 	default: found=0;break;
 	}
     break;  /* LANG(En) */
 
     case LANG_Pl:
     	switch (LCType) {
-LOCVAL(LOCALE_ILANGUAGE,"9")
-LOCVAL(LOCALE_SLANGUAGE,"Polski")
-LOCVAL(LOCALE_SENGLANGUAGE,"Polish")
-LOCVAL(LOCALE_SABBREVLANGNAME, "pol")
-LOCVAL(LOCALE_SNATIVELANGNAME,"Polski")
-LOCVAL(LOCALE_ICOUNTRY,"49")
-LOCVAL(LOCALE_SCOUNTRY,"Polska")
-LOCVAL(LOCALE_SENGCOUNTRY,"Poland")
-LOCVAL(LOCALE_SABBREVCTRYNAME,"Pl")
-LOCVAL(LOCALE_SNATIVECTRYNAME,"Polska")
-LOCVAL(LOCALE_IDEFAULTLANGUAGE,"9")
-LOCVAL(LOCALE_IDEFAULTCOUNTRY,"49")
-LOCVAL(LOCALE_IDEFAULTCODEPAGE,"1252")
-LOCVAL(LOCALE_IDEFAULTANSICODEPAGE,"1252")
-LOCVAL(LOCALE_SLIST,";")
-LOCVAL(LOCALE_IMEASURE,"0")
-LOCVAL(LOCALE_SDECIMAL,",")
-LOCVAL(LOCALE_STHOUSAND," ")
-/*
-LOCVAL(LOCALE_SGROUPING)
-*/
-LOCVAL(LOCALE_IDIGITS,"2")
-LOCVAL(LOCALE_ILZERO,"1")
-/*
-LOCVAL(LOCALE_INEGNUMBER)
-Is this "0123456789" ??
-LOCVAL(LOCALE_SNATIVEDIGITS)
-*/
-LOCVAL(LOCALE_SCURRENCY,"z\xB3")
-/*
-LOCVAL(LOCALE_SINTLSYMBOL)
-LOCVAL(LOCALE_SMONDECIMALSEP)
-LOCVAL(LOCALE_SMONTHOUSANDSEP)
-LOCVAL(LOCALE_SMONGROUPING)
-*/
-LOCVAL(LOCALE_ICURRDIGITS,"2")
-/*
-LOCVAL(LOCALE_IINTLCURRDIGITS)
-*/
-LOCVAL(LOCALE_ICURRENCY,"3")
-LOCVAL(LOCALE_INEGCURR,"8")
-LOCVAL(LOCALE_SDATE,".")
-LOCVAL(LOCALE_STIME,":")
-LOCVAL(LOCALE_SSHORTDATE,"dd.MM.yyyy")
-LOCVAL(LOCALE_SLONGDATE,"ddd, d. MMMM yyyy")
-/*
-LOCVAL(LOCALE_STIMEFORMAT)
-*/
-LOCVAL(LOCALE_IDATE,"1")
-/*
-LOCVAL(LOCALE_ILDATE)
-*/
-LOCVAL(LOCALE_ITIME,"1")
-/*
-LOCVAL(LOCALE_ITIMEMARKPOSN)
-LOCVAL(LOCALE_ICENTURY)
-*/
-LOCVAL(LOCALE_ITLZERO,"1")
-/*
-LOCVAL(LOCALE_IDAYLZERO)
-LOCVAL(LOCALE_IMONLZERO)
-LOCVAL(LOCALE_S1159)
-LOCVAL(LOCALE_S2359)
-LOCVAL(LOCALE_ICALENDARTYPE)
-LOCVAL(LOCALE_IOPTIONALCALENDAR)
-LOCVAL(LOCALE_IFIRSTDAYOFWEEK)
-LOCVAL(LOCALE_IFIRSTWEEKOFYEAR)
-*/
-LOCVAL(LOCALE_SDAYNAME1,"Poniedzia\263ek")
-LOCVAL(LOCALE_SDAYNAME2,"Wtorek")
-LOCVAL(LOCALE_SDAYNAME3,"Sroda")
-LOCVAL(LOCALE_SDAYNAME4,"Czwartek")
-LOCVAL(LOCALE_SDAYNAME5,"Pi\xB9tek")
-LOCVAL(LOCALE_SDAYNAME6,"Sobota")
-LOCVAL(LOCALE_SDAYNAME7,"Niedziela")
-LOCVAL(LOCALE_SABBREVDAYNAME1,"Po")
-LOCVAL(LOCALE_SABBREVDAYNAME2,"Wt")
-LOCVAL(LOCALE_SABBREVDAYNAME3,"Sr")
-LOCVAL(LOCALE_SABBREVDAYNAME4,"Cz")
-LOCVAL(LOCALE_SABBREVDAYNAME5,"Pt")
-LOCVAL(LOCALE_SABBREVDAYNAME6,"So")
-LOCVAL(LOCALE_SABBREVDAYNAME7,"Ni")
-LOCVAL(LOCALE_SMONTHNAME1,"Stycze\xF1")
-LOCVAL(LOCALE_SMONTHNAME2,"Luty")
-LOCVAL(LOCALE_SMONTHNAME3,"Marzec")
-LOCVAL(LOCALE_SMONTHNAME4,"Kwiecie\xF1")
-LOCVAL(LOCALE_SMONTHNAME5,"Maj")
-LOCVAL(LOCALE_SMONTHNAME6,"Czerwiec")
-LOCVAL(LOCALE_SMONTHNAME7,"Lipiec")
-LOCVAL(LOCALE_SMONTHNAME8,"Sierpie\xF1")
-LOCVAL(LOCALE_SMONTHNAME9,"Wrzesie\xF1")
-LOCVAL(LOCALE_SMONTHNAME10,"Pa\237dziernik")
-LOCVAL(LOCALE_SMONTHNAME11,"Listapad")
-LOCVAL(LOCALE_SMONTHNAME12,"Grudzie\xF1")
-LOCVAL(LOCALE_SMONTHNAME13,"")
-LOCVAL(LOCALE_SABBREVMONTHNAME1,"Sty")
-LOCVAL(LOCALE_SABBREVMONTHNAME2,"Lut")
-LOCVAL(LOCALE_SABBREVMONTHNAME3,"Mar")
-LOCVAL(LOCALE_SABBREVMONTHNAME4,"Kwi")
-LOCVAL(LOCALE_SABBREVMONTHNAME5,"Maj")
-LOCVAL(LOCALE_SABBREVMONTHNAME6,"Cze")
-LOCVAL(LOCALE_SABBREVMONTHNAME7,"Lip")
-LOCVAL(LOCALE_SABBREVMONTHNAME8,"Sie")
-LOCVAL(LOCALE_SABBREVMONTHNAME9,"Wrz")
-LOCVAL(LOCALE_SABBREVMONTHNAME10,"Pa\x9F")
-LOCVAL(LOCALE_SABBREVMONTHNAME11,"Lis")
-LOCVAL(LOCALE_SABBREVMONTHNAME12,"Gru")
-LOCVAL(LOCALE_SABBREVMONTHNAME13,"")
-/*
-LOCVAL(LOCALE_SPOSITIVESIGN)
-LOCVAL(LOCALE_SNEGATIVESIGN)
-LOCVAL(LOCALE_IPOSSIGNPOSN)
-LOCVAL(LOCALE_INEGSIGNPOSN)
-LOCVAL(LOCALE_IPOSSYMPRECEDES)
-LOCVAL(LOCALE_IPOSSEPBYSPACE)
-LOCVAL(LOCALE_INEGSYMPRECEDES)
-LOCVAL(LOCALE_INEGSEPBYSPACE)
-*/
+#include "nls/plk.nls"
 	default: found=0;break;
 	}
     break;  /* LANG(Pl) */
 
     case LANG_Po:
     	switch (LCType) {
-LOCVAL(LOCALE_ILANGUAGE, "0416")
-LOCVAL(LOCALE_SLANGUAGE, "Portugu\352s (Brasil)")
-LOCVAL(LOCALE_SENGLANGUAGE, "Protuguese")
-LOCVAL(LOCALE_SABBREVLANGNAME, "POR")
-LOCVAL(LOCALE_SNATIVELANGNAME, "Portugu\352s")
-LOCVAL(LOCALE_ICOUNTRY, "1")
-LOCVAL(LOCALE_SCOUNTRY, "Brasil")
-LOCVAL(LOCALE_SENGCOUNTRY, "Brazil")
-LOCVAL(LOCALE_SABBREVCTRYNAME, "BRA")
-LOCVAL(LOCALE_SNATIVECTRYNAME, "Brasil")
-LOCVAL(LOCALE_IDEFAULTLANGUAGE, "0409")
-LOCVAL(LOCALE_IDEFAULTCOUNTRY, "1")
-LOCVAL(LOCALE_IDEFAULTCODEPAGE, "437")
-LOCVAL(LOCALE_IDEFAULTANSICODEPAGE, "1252")
-LOCVAL(LOCALE_SLIST, ";")
-LOCVAL(LOCALE_IMEASURE, "1")
-LOCVAL(LOCALE_SDECIMAL, ",")
-LOCVAL(LOCALE_STHOUSAND, ".")
-LOCVAL(LOCALE_SGROUPING, "3;0")
-LOCVAL(LOCALE_IDIGITS, "2")
-LOCVAL(LOCALE_ILZERO, "1")
-LOCVAL(LOCALE_INEGNUMBER, "1")
-LOCVAL(LOCALE_SNATIVEDIGITS, "0123456789")
-LOCVAL(LOCALE_SCURRENCY, "$")
-LOCVAL(LOCALE_SINTLSYMBOL, "USD")
-LOCVAL(LOCALE_SMONDECIMALSEP, ",")
-LOCVAL(LOCALE_SMONTHOUSANDSEP, ".")
-LOCVAL(LOCALE_SMONGROUPING, "3;0")
-LOCVAL(LOCALE_ICURRDIGITS, "2")
-LOCVAL(LOCALE_IINTLCURRDIGITS, "2")
-LOCVAL(LOCALE_ICURRENCY, "0")
-LOCVAL(LOCALE_INEGCURR, "0")
-LOCVAL(LOCALE_SDATE, "/")
-LOCVAL(LOCALE_STIME, ":")
-LOCVAL(LOCALE_SSHORTDATE, "dd/MM/yy")
-LOCVAL(LOCALE_SLONGDATE, "dddd, MMMM dd, yyyy")
-LOCVAL(LOCALE_STIMEFORMAT, "h:mm:ss tt")
-LOCVAL(LOCALE_IDATE, "0")
-LOCVAL(LOCALE_ILDATE, "0")
-LOCVAL(LOCALE_ITIME, "0")
-LOCVAL(LOCALE_ITIMEMARKPOSN, "0")
-LOCVAL(LOCALE_ICENTURY, "0")
-LOCVAL(LOCALE_ITLZERO, "0")
-LOCVAL(LOCALE_IDAYLZERO, "0")
-LOCVAL(LOCALE_IMONLZERO, "0")
-LOCVAL(LOCALE_S1159, "AM")
-LOCVAL(LOCALE_S2359, "PM")
-LOCVAL(LOCALE_ICALENDARTYPE, "1")
-LOCVAL(LOCALE_IOPTIONALCALENDAR, "0")
-LOCVAL(LOCALE_IFIRSTDAYOFWEEK, "6")
-LOCVAL(LOCALE_IFIRSTWEEKOFYEAR, "0")
-LOCVAL(LOCALE_SDAYNAME1, "Segunda")
-LOCVAL(LOCALE_SDAYNAME2, "Ter\347a")
-LOCVAL(LOCALE_SDAYNAME3, "Quarta")
-LOCVAL(LOCALE_SDAYNAME4, "Quinta")
-LOCVAL(LOCALE_SDAYNAME5, "Sexta")
-LOCVAL(LOCALE_SDAYNAME6, "S\341bado")
-LOCVAL(LOCALE_SDAYNAME7, "Domingo")
-LOCVAL(LOCALE_SABBREVDAYNAME1, "Seg")
-LOCVAL(LOCALE_SABBREVDAYNAME2, "Ter")
-LOCVAL(LOCALE_SABBREVDAYNAME3, "Qua")
-LOCVAL(LOCALE_SABBREVDAYNAME4, "Qui")
-LOCVAL(LOCALE_SABBREVDAYNAME5, "Sex")
-LOCVAL(LOCALE_SABBREVDAYNAME6, "S\341b")
-LOCVAL(LOCALE_SABBREVDAYNAME7, "Dom")
-LOCVAL(LOCALE_SMONTHNAME1, "Janeiro")
-LOCVAL(LOCALE_SMONTHNAME2, "Fevereiro")
-LOCVAL(LOCALE_SMONTHNAME3, "Mar\347o")
-LOCVAL(LOCALE_SMONTHNAME4, "Abril")
-LOCVAL(LOCALE_SMONTHNAME5, "Maio")
-LOCVAL(LOCALE_SMONTHNAME6, "Junho")
-LOCVAL(LOCALE_SMONTHNAME7, "Julho")
-LOCVAL(LOCALE_SMONTHNAME8, "Agosto")
-LOCVAL(LOCALE_SMONTHNAME9, "Setembro")
-LOCVAL(LOCALE_SMONTHNAME10, "Outubro")
-LOCVAL(LOCALE_SMONTHNAME11, "Novembro")
-LOCVAL(LOCALE_SMONTHNAME12, "Dezembro")
-LOCVAL(LOCALE_SMONTHNAME13, "")
-LOCVAL(LOCALE_SABBREVMONTHNAME1, "Jan")
-LOCVAL(LOCALE_SABBREVMONTHNAME2, "Fev")
-LOCVAL(LOCALE_SABBREVMONTHNAME3, "Mar")
-LOCVAL(LOCALE_SABBREVMONTHNAME4, "Abr")
-LOCVAL(LOCALE_SABBREVMONTHNAME5, "Mai")
-LOCVAL(LOCALE_SABBREVMONTHNAME6, "Jun")
-LOCVAL(LOCALE_SABBREVMONTHNAME7, "Jul")
-LOCVAL(LOCALE_SABBREVMONTHNAME8, "Ago")
-LOCVAL(LOCALE_SABBREVMONTHNAME9, "Set")
-LOCVAL(LOCALE_SABBREVMONTHNAME10, "Out")
-LOCVAL(LOCALE_SABBREVMONTHNAME11, "Nov")
-LOCVAL(LOCALE_SABBREVMONTHNAME12, "Dez")
-LOCVAL(LOCALE_SABBREVMONTHNAME13, "")
-LOCVAL(LOCALE_SPOSITIVESIGN, "")
-LOCVAL(LOCALE_SNEGATIVESIGN, "-")
-LOCVAL(LOCALE_IPOSSIGNPOSN, "3")
-LOCVAL(LOCALE_INEGSIGNPOSN, "0")
-LOCVAL(LOCALE_IPOSSYMPRECEDES, "1")
-LOCVAL(LOCALE_IPOSSEPBYSPACE, "0")
-LOCVAL(LOCALE_INEGSYMPRECEDES, "1")
-LOCVAL(LOCALE_INEGSEPBYSPACE, "0")
+#include "nls/ptb.nls"
 	default: found=0;break;
 	}
     break; /* LANG(Po) */
 
-case LANG_Sw:
+    case LANG_Sw:
     	switch (LCType) {
-LOCVAL(LOCALE_ILANGUAGE,"1d")
-LOCVAL(LOCALE_SLANGUAGE,"Svenska")
-LOCVAL(LOCALE_SENGLANGUAGE,"Swedish")
-LOCVAL(LOCALE_SABBREVLANGNAME,"SV")
-LOCVAL(LOCALE_SNATIVELANGNAME,"Svenska")
-LOCVAL(LOCALE_ICOUNTRY,"45")
-LOCVAL(LOCALE_SCOUNTRY,"SWE")
-LOCVAL(LOCALE_SENGCOUNTRY,"Sweden")
-LOCVAL(LOCALE_SABBREVCTRYNAME,"SVE")
-LOCVAL(LOCALE_SNATIVECTRYNAME,"Sverige")
-LOCVAL(LOCALE_IDEFAULTLANGUAGE,"1d")
-LOCVAL(LOCALE_IDEFAULTCOUNTRY,"45")
-/* LOCVAL(LOCALE_IDEFAULTCODEPAGE) */
-/* LOCVAL(LOCALE_IDEFAULTANSICODEPAGE) */
-LOCVAL(LOCALE_SLIST,";")
-LOCVAL(LOCALE_IMEASURE,"0")
-LOCVAL(LOCALE_SDECIMAL,",")
-LOCVAL(LOCALE_STHOUSAND,".")
-/* LOCVAL(LOCALE_SGROUPING) */
-LOCVAL(LOCALE_IDIGITS,"2")
-LOCVAL(LOCALE_ILZERO,"1")
-/* LOCVAL(LOCALE_INEGNUMBER) */
-/* LOCVAL(LOCALE_SNATIVEDIGITS) */
-LOCVAL(LOCALE_SCURRENCY,"kr")
-/* LOCVAL(LOCALE_SINTLSYMBOL) */
-LOCVAL(LOCALE_SMONDECIMALSEP,",")
-LOCVAL(LOCALE_SMONTHOUSANDSEP,".")
-/* LOCVAL(LOCALE_SMONGROUPING) */
-LOCVAL(LOCALE_ICURRDIGITS,"2")
-/* LOCVAL(LOCALE_IINTLCURRDIGITS) */
-LOCVAL(LOCALE_ICURRENCY,"3")
-LOCVAL(LOCALE_INEGCURR,"8")
-LOCVAL(LOCALE_SDATE,".")
-LOCVAL(LOCALE_STIME,":")
-LOCVAL(LOCALE_SSHORTDATE,"dd/MM-yyyy")
-LOCVAL(LOCALE_SLONGDATE,"ddd, d. MMMM yyyy")
-/* LOCVAL(LOCALE_STIMEFORMAT) */
-LOCVAL(LOCALE_IDATE,"1")
-/* LOCVAL(LOCALE_ILDATE) */
-LOCVAL(LOCALE_ITIME,"1")
-/* LOCVAL(LOCALE_ITIMEMARKPOSN) */
-/* LOCVAL(LOCALE_ICENTURY) */
-LOCVAL(LOCALE_ITLZERO,"1")
-/* LOCVAL(LOCALE_IDAYLZERO) */
-/* LOCVAL(LOCALE_IMONLZERO) */
-LOCVAL(LOCALE_S1159, "")
-LOCVAL(LOCALE_S2359, "")
-/* LOCVAL(LOCALE_ICALENDARTYPE) */
-/* LOCVAL(LOCALE_IOPTIONALCALENDAR) */
-/* LOCVAL(LOCALE_IFIRSTDAYOFWEEK) */
-/* LOCVAL(LOCALE_IFIRSTWEEKOFYEAR) */
-LOCVAL(LOCALE_SDAYNAME1,"Måndag")
-LOCVAL(LOCALE_SDAYNAME2,"Tisdag")
-LOCVAL(LOCALE_SDAYNAME3,"Onsdag")
-LOCVAL(LOCALE_SDAYNAME4,"Torsdag")
-LOCVAL(LOCALE_SDAYNAME5,"Fredag")
-LOCVAL(LOCALE_SDAYNAME6,"Lördag")
-LOCVAL(LOCALE_SDAYNAME7,"Söndag")
-LOCVAL(LOCALE_SABBREVDAYNAME1,"Må")
-LOCVAL(LOCALE_SABBREVDAYNAME2,"Ti")
-LOCVAL(LOCALE_SABBREVDAYNAME3,"On")
-LOCVAL(LOCALE_SABBREVDAYNAME4,"To")
-LOCVAL(LOCALE_SABBREVDAYNAME5,"Fr")
-LOCVAL(LOCALE_SABBREVDAYNAME6,"Lö")
-LOCVAL(LOCALE_SABBREVDAYNAME7,"Sö")
-LOCVAL(LOCALE_SMONTHNAME1,"Januari")
-LOCVAL(LOCALE_SMONTHNAME2,"Februari")
-LOCVAL(LOCALE_SMONTHNAME3,"Mars")
-LOCVAL(LOCALE_SMONTHNAME4,"April")
-LOCVAL(LOCALE_SMONTHNAME5,"Maj")
-LOCVAL(LOCALE_SMONTHNAME6,"Juni")
-LOCVAL(LOCALE_SMONTHNAME7,"Juli")
-LOCVAL(LOCALE_SMONTHNAME8,"Augusti")
-LOCVAL(LOCALE_SMONTHNAME9,"September")
-LOCVAL(LOCALE_SMONTHNAME10,"Oktober")
-LOCVAL(LOCALE_SMONTHNAME11,"November")
-LOCVAL(LOCALE_SMONTHNAME12,"December")
-LOCVAL(LOCALE_SMONTHNAME13,"")
-LOCVAL(LOCALE_SABBREVMONTHNAME1,"Jan")
-LOCVAL(LOCALE_SABBREVMONTHNAME2,"Feb")
-LOCVAL(LOCALE_SABBREVMONTHNAME3,"Mar")
-LOCVAL(LOCALE_SABBREVMONTHNAME4,"Apr")
-LOCVAL(LOCALE_SABBREVMONTHNAME5,"Maj")
-LOCVAL(LOCALE_SABBREVMONTHNAME6,"Jun")
-LOCVAL(LOCALE_SABBREVMONTHNAME7,"Jul")
-LOCVAL(LOCALE_SABBREVMONTHNAME8,"Aug")
-LOCVAL(LOCALE_SABBREVMONTHNAME9,"Sep")
-LOCVAL(LOCALE_SABBREVMONTHNAME10,"Okt")
-LOCVAL(LOCALE_SABBREVMONTHNAME11,"Nov")
-LOCVAL(LOCALE_SABBREVMONTHNAME12,"Dec")
-LOCVAL(LOCALE_SABBREVMONTHNAME13,"")
-LOCVAL(LOCALE_SPOSITIVESIGN, "")
-LOCVAL(LOCALE_SNEGATIVESIGN, "-")
-LOCVAL(LOCALE_IPOSSIGNPOSN, "3")
-LOCVAL(LOCALE_INEGSIGNPOSN, "3")
-LOCVAL(LOCALE_IPOSSYMPRECEDES, "1")
-LOCVAL(LOCALE_IPOSSEPBYSPACE, "0")
-LOCVAL(LOCALE_INEGSYMPRECEDES, "1")
-LOCVAL(LOCALE_INEGSEPBYSPACE, "0")
+#include "nls/sve.nls"
 	default: found=0;break;
 	}
     break; /* LANG(Sw) */
@@ -1787,6 +505,524 @@
 	return TRUE;
 }
 
+static const unsigned char CT_CType2_LUT[] = {
+  C2_NOTAPPLICABLE, /*   -   0 */
+  C2_NOTAPPLICABLE, /*   -   1 */
+  C2_NOTAPPLICABLE, /*   -   2 */
+  C2_NOTAPPLICABLE, /*   -   3 */
+  C2_NOTAPPLICABLE, /*   -   4 */
+  C2_NOTAPPLICABLE, /*   -   5 */
+  C2_NOTAPPLICABLE, /*   -   6 */
+  C2_NOTAPPLICABLE, /*   -   7 */
+  C2_NOTAPPLICABLE, /*   -   8 */
+  C2_SEGMENTSEPARATOR, /*   -   9 */
+  C2_NOTAPPLICABLE, /*   -  10 */
+  C2_NOTAPPLICABLE, /*   -  11 */
+  C2_NOTAPPLICABLE, /*   -  12 */
+  C2_NOTAPPLICABLE, /*   -  13 */
+  C2_NOTAPPLICABLE, /*   -  14 */
+  C2_NOTAPPLICABLE, /*   -  15 */
+  C2_NOTAPPLICABLE, /*   -  16 */
+  C2_NOTAPPLICABLE, /*   -  17 */
+  C2_NOTAPPLICABLE, /*   -  18 */
+  C2_NOTAPPLICABLE, /*   -  19 */
+  C2_NOTAPPLICABLE, /*   -  20 */
+  C2_NOTAPPLICABLE, /*   -  21 */
+  C2_NOTAPPLICABLE, /*   -  22 */
+  C2_NOTAPPLICABLE, /*   -  23 */
+  C2_NOTAPPLICABLE, /*   -  24 */
+  C2_NOTAPPLICABLE, /*   -  25 */
+  C2_NOTAPPLICABLE, /*   -  26 */
+  C2_NOTAPPLICABLE, /*   -  27 */
+  C2_NOTAPPLICABLE, /*   -  28 */
+  C2_NOTAPPLICABLE, /*   -  29 */
+  C2_NOTAPPLICABLE, /*   -  30 */
+  C2_NOTAPPLICABLE, /*   -  31 */
+  C2_WHITESPACE, /*   -  32 */
+  C2_OTHERNEUTRAL, /* ! -  33 */
+  C2_OTHERNEUTRAL, /* " -  34 */ /* " */
+  C2_EUROPETERMINATOR, /* # -  35 */
+  C2_EUROPETERMINATOR, /* $ -  36 */
+  C2_EUROPETERMINATOR, /* % -  37 */
+  C2_LEFTTORIGHT, /* & -  38 */
+  C2_OTHERNEUTRAL, /* ' -  39 */
+  C2_OTHERNEUTRAL, /* ( -  40 */
+  C2_OTHERNEUTRAL, /* ) -  41 */
+  C2_OTHERNEUTRAL, /* * -  42 */
+  C2_EUROPETERMINATOR, /* + -  43 */
+  C2_COMMONSEPARATOR, /* , -  44 */
+  C2_EUROPETERMINATOR, /* - -  45 */
+  C2_EUROPESEPARATOR, /* . -  46 */
+  C2_EUROPESEPARATOR, /* / -  47 */
+  C2_EUROPENUMBER, /* 0 -  48 */
+  C2_EUROPENUMBER, /* 1 -  49 */
+  C2_EUROPENUMBER, /* 2 -  50 */
+  C2_EUROPENUMBER, /* 3 -  51 */
+  C2_EUROPENUMBER, /* 4 -  52 */
+  C2_EUROPENUMBER, /* 5 -  53 */
+  C2_EUROPENUMBER, /* 6 -  54 */
+  C2_EUROPENUMBER, /* 7 -  55 */
+  C2_EUROPENUMBER, /* 8 -  56 */
+  C2_EUROPENUMBER, /* 9 -  57 */
+  C2_COMMONSEPARATOR, /* : -  58 */
+  C2_OTHERNEUTRAL, /* ; -  59 */
+  C2_OTHERNEUTRAL, /* < -  60 */
+  C2_OTHERNEUTRAL, /* = -  61 */
+  C2_OTHERNEUTRAL, /* > -  62 */
+  C2_OTHERNEUTRAL, /* ? -  63 */
+  C2_LEFTTORIGHT, /* @ -  64 */
+  C2_LEFTTORIGHT, /* A -  65 */
+  C2_LEFTTORIGHT, /* B -  66 */
+  C2_LEFTTORIGHT, /* C -  67 */
+  C2_LEFTTORIGHT, /* D -  68 */
+  C2_LEFTTORIGHT, /* E -  69 */
+  C2_LEFTTORIGHT, /* F -  70 */
+  C2_LEFTTORIGHT, /* G -  71 */
+  C2_LEFTTORIGHT, /* H -  72 */
+  C2_LEFTTORIGHT, /* I -  73 */
+  C2_LEFTTORIGHT, /* J -  74 */
+  C2_LEFTTORIGHT, /* K -  75 */
+  C2_LEFTTORIGHT, /* L -  76 */
+  C2_LEFTTORIGHT, /* M -  77 */
+  C2_LEFTTORIGHT, /* N -  78 */
+  C2_LEFTTORIGHT, /* O -  79 */
+  C2_LEFTTORIGHT, /* P -  80 */
+  C2_LEFTTORIGHT, /* Q -  81 */
+  C2_LEFTTORIGHT, /* R -  82 */
+  C2_LEFTTORIGHT, /* S -  83 */
+  C2_LEFTTORIGHT, /* T -  84 */
+  C2_LEFTTORIGHT, /* U -  85 */
+  C2_LEFTTORIGHT, /* V -  86 */
+  C2_LEFTTORIGHT, /* W -  87 */
+  C2_LEFTTORIGHT, /* X -  88 */
+  C2_LEFTTORIGHT, /* Y -  89 */
+  C2_LEFTTORIGHT, /* Z -  90 */
+  C2_OTHERNEUTRAL, /* [ -  91 */
+  C2_OTHERNEUTRAL, /* \ -  92 */
+  C2_OTHERNEUTRAL, /* ] -  93 */
+  C2_OTHERNEUTRAL, /* ^ -  94 */
+  C2_OTHERNEUTRAL, /* _ -  95 */
+  C2_OTHERNEUTRAL, /* ` -  96 */
+  C2_LEFTTORIGHT, /* a -  97 */
+  C2_LEFTTORIGHT, /* b -  98 */
+  C2_LEFTTORIGHT, /* c -  99 */
+  C2_LEFTTORIGHT, /* d - 100 */
+  C2_LEFTTORIGHT, /* e - 101 */
+  C2_LEFTTORIGHT, /* f - 102 */
+  C2_LEFTTORIGHT, /* g - 103 */
+  C2_LEFTTORIGHT, /* h - 104 */
+  C2_LEFTTORIGHT, /* i - 105 */
+  C2_LEFTTORIGHT, /* j - 106 */
+  C2_LEFTTORIGHT, /* k - 107 */
+  C2_LEFTTORIGHT, /* l - 108 */
+  C2_LEFTTORIGHT, /* m - 109 */
+  C2_LEFTTORIGHT, /* n - 110 */
+  C2_LEFTTORIGHT, /* o - 111 */
+  C2_LEFTTORIGHT, /* p - 112 */
+  C2_LEFTTORIGHT, /* q - 113 */
+  C2_LEFTTORIGHT, /* r - 114 */
+  C2_LEFTTORIGHT, /* s - 115 */
+  C2_LEFTTORIGHT, /* t - 116 */
+  C2_LEFTTORIGHT, /* u - 117 */
+  C2_LEFTTORIGHT, /* v - 118 */
+  C2_LEFTTORIGHT, /* w - 119 */
+  C2_LEFTTORIGHT, /* x - 120 */
+  C2_LEFTTORIGHT, /* y - 121 */
+  C2_LEFTTORIGHT, /* z - 122 */
+  C2_OTHERNEUTRAL, /* { - 123 */
+  C2_OTHERNEUTRAL, /* | - 124 */
+  C2_OTHERNEUTRAL, /* } - 125 */
+  C2_OTHERNEUTRAL, /* ~ - 126 */
+  C2_NOTAPPLICABLE, /*  - 127 */
+  C2_NOTAPPLICABLE, /* € - 128 */
+  C2_NOTAPPLICABLE, /*  - 129 */
+  C2_OTHERNEUTRAL, /* ‚ - 130 */
+  C2_LEFTTORIGHT, /* ƒ - 131 */
+  C2_OTHERNEUTRAL, /* „ - 132 */
+  C2_OTHERNEUTRAL, /* … - 133 */
+  C2_OTHERNEUTRAL, /* † - 134 */
+  C2_OTHERNEUTRAL, /* ‡ - 135 */
+  C2_LEFTTORIGHT, /* ˆ - 136 */
+  C2_EUROPETERMINATOR, /* ‰ - 137 */
+  C2_LEFTTORIGHT, /* Š - 138 */
+  C2_OTHERNEUTRAL, /* ‹ - 139 */
+  C2_LEFTTORIGHT, /* Π- 140 */
+  C2_NOTAPPLICABLE, /*  - 141 */
+  C2_NOTAPPLICABLE, /* Ž - 142 */
+  C2_NOTAPPLICABLE, /*  - 143 */
+  C2_NOTAPPLICABLE, /*  - 144 */
+  C2_OTHERNEUTRAL, /* ‘ - 145 */
+  C2_OTHERNEUTRAL, /* ’ - 146 */
+  C2_OTHERNEUTRAL, /* “ - 147 */
+  C2_OTHERNEUTRAL, /* ” - 148 */
+  C2_OTHERNEUTRAL, /* • - 149 */
+  C2_OTHERNEUTRAL, /* – - 150 */
+  C2_OTHERNEUTRAL, /* — - 151 */
+  C2_LEFTTORIGHT, /* ˜ - 152 */
+  C2_OTHERNEUTRAL, /* ™ - 153 */
+  C2_LEFTTORIGHT, /* š - 154 */
+  C2_OTHERNEUTRAL, /* › - 155 */
+  C2_LEFTTORIGHT, /* œ - 156 */
+  C2_NOTAPPLICABLE, /*  - 157 */
+  C2_NOTAPPLICABLE, /* ž - 158 */
+  C2_LEFTTORIGHT, /* Ÿ - 159 */
+  C2_WHITESPACE, /*   - 160 */
+  C2_OTHERNEUTRAL, /* ¡ - 161 */
+  C2_EUROPETERMINATOR, /* ¢ - 162 */
+  C2_EUROPETERMINATOR, /* £ - 163 */
+  C2_EUROPETERMINATOR, /* ¤ - 164 */
+  C2_EUROPETERMINATOR, /* ¥ - 165 */
+  C2_OTHERNEUTRAL, /* ¦ - 166 */
+  C2_OTHERNEUTRAL, /* § - 167 */
+  C2_OTHERNEUTRAL, /* ¨ - 168 */
+  C2_OTHERNEUTRAL, /* © - 169 */
+  C2_OTHERNEUTRAL, /* ª - 170 */
+  C2_OTHERNEUTRAL, /* « - 171 */
+  C2_OTHERNEUTRAL, /* ¬ - 172 */
+  C2_OTHERNEUTRAL, /* ­ - 173 */
+  C2_OTHERNEUTRAL, /* ® - 174 */
+  C2_OTHERNEUTRAL, /* ¯ - 175 */
+  C2_EUROPETERMINATOR, /* ° - 176 */
+  C2_EUROPETERMINATOR, /* ± - 177 */
+  C2_EUROPENUMBER, /* ² - 178 */
+  C2_EUROPENUMBER, /* ³ - 179 */
+  C2_OTHERNEUTRAL, /* ´ - 180 */
+  C2_OTHERNEUTRAL, /* µ - 181 */
+  C2_OTHERNEUTRAL, /* ¶ - 182 */
+  C2_OTHERNEUTRAL, /* · - 183 */
+  C2_OTHERNEUTRAL, /* ¸ - 184 */
+  C2_EUROPENUMBER, /* ¹ - 185 */
+  C2_OTHERNEUTRAL, /* º - 186 */
+  C2_OTHERNEUTRAL, /* » - 187 */
+  C2_OTHERNEUTRAL, /* ¼ - 188 */
+  C2_OTHERNEUTRAL, /* ½ - 189 */
+  C2_OTHERNEUTRAL, /* ¾ - 190 */
+  C2_OTHERNEUTRAL, /* ¿ - 191 */
+  C2_LEFTTORIGHT, /* À - 192 */
+  C2_LEFTTORIGHT, /* Á - 193 */
+  C2_LEFTTORIGHT, /* Â - 194 */
+  C2_LEFTTORIGHT, /* Ã - 195 */
+  C2_LEFTTORIGHT, /* Ä - 196 */
+  C2_LEFTTORIGHT, /* Å - 197 */
+  C2_LEFTTORIGHT, /* Æ - 198 */
+  C2_LEFTTORIGHT, /* Ç - 199 */
+  C2_LEFTTORIGHT, /* È - 200 */
+  C2_LEFTTORIGHT, /* É - 201 */
+  C2_LEFTTORIGHT, /* Ê - 202 */
+  C2_LEFTTORIGHT, /* Ë - 203 */
+  C2_LEFTTORIGHT, /* Ì - 204 */
+  C2_LEFTTORIGHT, /* Í - 205 */
+  C2_LEFTTORIGHT, /* Î - 206 */
+  C2_LEFTTORIGHT, /* Ï - 207 */
+  C2_LEFTTORIGHT, /* Ð - 208 */
+  C2_LEFTTORIGHT, /* Ñ - 209 */
+  C2_LEFTTORIGHT, /* Ò - 210 */
+  C2_LEFTTORIGHT, /* Ó - 211 */
+  C2_LEFTTORIGHT, /* Ô - 212 */
+  C2_LEFTTORIGHT, /* Õ - 213 */
+  C2_LEFTTORIGHT, /* Ö - 214 */
+  C2_OTHERNEUTRAL, /* × - 215 */
+  C2_LEFTTORIGHT, /* Ø - 216 */
+  C2_LEFTTORIGHT, /* Ù - 217 */
+  C2_LEFTTORIGHT, /* Ú - 218 */
+  C2_LEFTTORIGHT, /* Û - 219 */
+  C2_LEFTTORIGHT, /* Ü - 220 */
+  C2_LEFTTORIGHT, /* Ý - 221 */
+  C2_LEFTTORIGHT, /* Þ - 222 */
+  C2_LEFTTORIGHT, /* ß - 223 */
+  C2_LEFTTORIGHT, /* à - 224 */
+  C2_LEFTTORIGHT, /* á - 225 */
+  C2_LEFTTORIGHT, /* â - 226 */
+  C2_LEFTTORIGHT, /* ã - 227 */
+  C2_LEFTTORIGHT, /* ä - 228 */
+  C2_LEFTTORIGHT, /* å - 229 */
+  C2_LEFTTORIGHT, /* æ - 230 */
+  C2_LEFTTORIGHT, /* ç - 231 */
+  C2_LEFTTORIGHT, /* è - 232 */
+  C2_LEFTTORIGHT, /* é - 233 */
+  C2_LEFTTORIGHT, /* ê - 234 */
+  C2_LEFTTORIGHT, /* ë - 235 */
+  C2_LEFTTORIGHT, /* ì - 236 */
+  C2_LEFTTORIGHT, /* í - 237 */
+  C2_LEFTTORIGHT, /* î - 238 */
+  C2_LEFTTORIGHT, /* ï - 239 */
+  C2_LEFTTORIGHT, /* ð - 240 */
+  C2_LEFTTORIGHT, /* ñ - 241 */
+  C2_LEFTTORIGHT, /* ò - 242 */
+  C2_LEFTTORIGHT, /* ó - 243 */
+  C2_LEFTTORIGHT, /* ô - 244 */
+  C2_LEFTTORIGHT, /* õ - 245 */
+  C2_LEFTTORIGHT, /* ö - 246 */
+  C2_OTHERNEUTRAL, /* ÷ - 247 */
+  C2_LEFTTORIGHT, /* ø - 248 */
+  C2_LEFTTORIGHT, /* ù - 249 */
+  C2_LEFTTORIGHT, /* ú - 250 */
+  C2_LEFTTORIGHT, /* û - 251 */
+  C2_LEFTTORIGHT, /* ü - 252 */
+  C2_LEFTTORIGHT, /* ý - 253 */
+  C2_LEFTTORIGHT, /* þ - 254 */
+  C2_LEFTTORIGHT /* ÿ - 255 */
+};
+
+static const WORD CT_CType3_LUT[] = { 
+  0x0000, /*   -   0 */
+  0x0000, /*   -   1 */
+  0x0000, /*   -   2 */
+  0x0000, /*   -   3 */
+  0x0000, /*   -   4 */
+  0x0000, /*   -   5 */
+  0x0000, /*   -   6 */
+  0x0000, /*   -   7 */
+  0x0000, /*   -   8 */
+  0x0008, /*   -   9 */
+  0x0008, /*   -  10 */
+  0x0008, /*   -  11 */
+  0x0008, /*   -  12 */
+  0x0008, /*   -  13 */
+  0x0000, /*   -  14 */
+  0x0000, /*   -  15 */
+  0x0000, /*   -  16 */
+  0x0000, /*   -  17 */
+  0x0000, /*   -  18 */
+  0x0000, /*   -  19 */
+  0x0000, /*   -  20 */
+  0x0000, /*   -  21 */
+  0x0000, /*   -  22 */
+  0x0000, /*   -  23 */
+  0x0000, /*   -  24 */
+  0x0000, /*   -  25 */
+  0x0000, /*   -  26 */
+  0x0000, /*   -  27 */
+  0x0000, /*   -  28 */
+  0x0000, /*   -  29 */
+  0x0000, /*   -  30 */
+  0x0000, /*   -  31 */
+  0x0048, /*   -  32 */
+  0x0048, /* ! -  33 */
+  0x0448, /* " -  34 */ /* " */
+  0x0048, /* # -  35 */
+  0x0448, /* $ -  36 */
+  0x0048, /* % -  37 */
+  0x0048, /* & -  38 */
+  0x0440, /* ' -  39 */
+  0x0048, /* ( -  40 */
+  0x0048, /* ) -  41 */
+  0x0048, /* * -  42 */
+  0x0048, /* + -  43 */
+  0x0048, /* , -  44 */
+  0x0440, /* - -  45 */
+  0x0048, /* . -  46 */
+  0x0448, /* / -  47 */
+  0x0040, /* 0 -  48 */
+  0x0040, /* 1 -  49 */
+  0x0040, /* 2 -  50 */
+  0x0040, /* 3 -  51 */
+  0x0040, /* 4 -  52 */
+  0x0040, /* 5 -  53 */
+  0x0040, /* 6 -  54 */
+  0x0040, /* 7 -  55 */
+  0x0040, /* 8 -  56 */
+  0x0040, /* 9 -  57 */
+  0x0048, /* : -  58 */
+  0x0048, /* ; -  59 */
+  0x0048, /* < -  60 */
+  0x0448, /* = -  61 */
+  0x0048, /* > -  62 */
+  0x0048, /* ? -  63 */
+  0x0448, /* @ -  64 */
+  0x8040, /* A -  65 */
+  0x8040, /* B -  66 */
+  0x8040, /* C -  67 */
+  0x8040, /* D -  68 */
+  0x8040, /* E -  69 */
+  0x8040, /* F -  70 */
+  0x8040, /* G -  71 */
+  0x8040, /* H -  72 */
+  0x8040, /* I -  73 */
+  0x8040, /* J -  74 */
+  0x8040, /* K -  75 */
+  0x8040, /* L -  76 */
+  0x8040, /* M -  77 */
+  0x8040, /* N -  78 */
+  0x8040, /* O -  79 */
+  0x8040, /* P -  80 */
+  0x8040, /* Q -  81 */
+  0x8040, /* R -  82 */
+  0x8040, /* S -  83 */
+  0x8040, /* T -  84 */
+  0x8040, /* U -  85 */
+  0x8040, /* V -  86 */
+  0x8040, /* W -  87 */
+  0x8040, /* X -  88 */
+  0x8040, /* Y -  89 */
+  0x8040, /* Z -  90 */
+  0x0048, /* [ -  91 */
+  0x0448, /* \ -  92 */
+  0x0048, /* ] -  93 */
+  0x0448, /* ^ -  94 */
+  0x0448, /* _ -  95 */
+  0x0448, /* ` -  96 */
+  0x8040, /* a -  97 */
+  0x8040, /* b -  98 */
+  0x8040, /* c -  99 */
+  0x8040, /* d - 100 */
+  0x8040, /* e - 101 */
+  0x8040, /* f - 102 */
+  0x8040, /* g - 103 */
+  0x8040, /* h - 104 */
+  0x8040, /* i - 105 */
+  0x8040, /* j - 106 */
+  0x8040, /* k - 107 */
+  0x8040, /* l - 108 */
+  0x8040, /* m - 109 */
+  0x8040, /* n - 110 */
+  0x8040, /* o - 111 */
+  0x8040, /* p - 112 */
+  0x8040, /* q - 113 */
+  0x8040, /* r - 114 */
+  0x8040, /* s - 115 */
+  0x8040, /* t - 116 */
+  0x8040, /* u - 117 */
+  0x8040, /* v - 118 */
+  0x8040, /* w - 119 */
+  0x8040, /* x - 120 */
+  0x8040, /* y - 121 */
+  0x8040, /* z - 122 */
+  0x0048, /* { - 123 */
+  0x0048, /* | - 124 */
+  0x0048, /* } - 125 */
+  0x0448, /* ~ - 126 */
+  0x0000, /*  - 127 */
+  0x0000, /* € - 128 */
+  0x0000, /*  - 129 */
+  0x0008, /* ‚ - 130 */
+  0x8000, /* ƒ - 131 */
+  0x0008, /* „ - 132 */
+  0x0008, /* … - 133 */
+  0x0008, /* † - 134 */
+  0x0008, /* ‡ - 135 */
+  0x0001, /* ˆ - 136 */
+  0x0008, /* ‰ - 137 */
+  0x8003, /* Š - 138 */
+  0x0008, /* ‹ - 139 */
+  0x8000, /* Π- 140 */
+  0x0000, /*  - 141 */
+  0x0000, /* Ž - 142 */
+  0x0000, /*  - 143 */
+  0x0000, /*  - 144 */
+  0x0088, /* ‘ - 145 */
+  0x0088, /* ’ - 146 */
+  0x0088, /* “ - 147 */
+  0x0088, /* ” - 148 */
+  0x0008, /* • - 149 */
+  0x0400, /* – - 150 */
+  0x0400, /* — - 151 */
+  0x0408, /* ˜ - 152 */
+  0x0000, /* ™ - 153 */
+  0x8003, /* š - 154 */
+  0x0008, /* › - 155 */
+  0x8000, /* œ - 156 */
+  0x0000, /*  - 157 */
+  0x0000, /* ž - 158 */
+  0x8003, /* Ÿ - 159 */
+  0x0008, /*   - 160 */
+  0x0008, /* ¡ - 161 */
+  0x0048, /* ¢ - 162 */
+  0x0048, /* £ - 163 */
+  0x0008, /* ¤ - 164 */
+  0x0048, /* ¥ - 165 */
+  0x0048, /* ¦ - 166 */
+  0x0008, /* § - 167 */
+  0x0408, /* ¨ - 168 */
+  0x0008, /* © - 169 */
+  0x0400, /* ª - 170 */
+  0x0008, /* « - 171 */
+  0x0048, /* ¬ - 172 */
+  0x0408, /* ­ - 173 */
+  0x0008, /* ® - 174 */
+  0x0448, /* ¯ - 175 */
+  0x0008, /* ° - 176 */
+  0x0008, /* ± - 177 */
+  0x0000, /* ² - 178 */
+  0x0000, /* ³ - 179 */
+  0x0408, /* ´ - 180 */
+  0x0008, /* µ - 181 */
+  0x0008, /* ¶ - 182 */
+  0x0008, /* · - 183 */
+  0x0408, /* ¸ - 184 */
+  0x0000, /* ¹ - 185 */
+  0x0400, /* º - 186 */
+  0x0008, /* » - 187 */
+  0x0000, /* ¼ - 188 */
+  0x0000, /* ½ - 189 */
+  0x0000, /* ¾ - 190 */
+  0x0008, /* ¿ - 191 */
+  0x8003, /* À - 192 */
+  0x8003, /* Á - 193 */
+  0x8003, /* Â - 194 */
+  0x8003, /* Ã - 195 */
+  0x8003, /* Ä - 196 */
+  0x8003, /* Å - 197 */
+  0x8000, /* Æ - 198 */
+  0x8003, /* Ç - 199 */
+  0x8003, /* È - 200 */
+  0x8003, /* É - 201 */
+  0x8003, /* Ê - 202 */
+  0x8003, /* Ë - 203 */
+  0x8003, /* Ì - 204 */
+  0x8003, /* Í - 205 */
+  0x8003, /* Î - 206 */
+  0x8003, /* Ï - 207 */
+  0x8000, /* Ð - 208 */
+  0x8003, /* Ñ - 209 */
+  0x8003, /* Ò - 210 */
+  0x8003, /* Ó - 211 */
+  0x8003, /* Ô - 212 */
+  0x8003, /* Õ - 213 */
+  0x8003, /* Ö - 214 */
+  0x0008, /* × - 215 */
+  0x8003, /* Ø - 216 */
+  0x8003, /* Ù - 217 */
+  0x8003, /* Ú - 218 */
+  0x8003, /* Û - 219 */
+  0x8003, /* Ü - 220 */
+  0x8003, /* Ý - 221 */
+  0x8000, /* Þ - 222 */
+  0x8000, /* ß - 223 */
+  0x8003, /* à - 224 */
+  0x8003, /* á - 225 */
+  0x8003, /* â - 226 */
+  0x8003, /* ã - 227 */
+  0x8003, /* ä - 228 */
+  0x8003, /* å - 229 */
+  0x8000, /* æ - 230 */
+  0x8003, /* ç - 231 */
+  0x8003, /* è - 232 */
+  0x8003, /* é - 233 */
+  0x8003, /* ê - 234 */
+  0x8003, /* ë - 235 */
+  0x8003, /* ì - 236 */
+  0x8003, /* í - 237 */
+  0x8003, /* î - 238 */
+  0x8003, /* ï - 239 */
+  0x8000, /* ð - 240 */
+  0x8003, /* ñ - 241 */
+  0x8003, /* ò - 242 */
+  0x8003, /* ó - 243 */
+  0x8003, /* ô - 244 */
+  0x8003, /* õ - 245 */
+  0x8003, /* ö - 246 */
+  0x0008, /* ÷ - 247 */
+  0x8003, /* ø - 248 */
+  0x8003, /* ù - 249 */
+  0x8003, /* ú - 250 */
+  0x8003, /* û - 251 */
+  0x8003, /* ü - 252 */
+  0x8003, /* ý - 253 */
+  0x8000, /* þ - 254 */
+  0x8003  /* ÿ - 255 */
+};
+
 /***********************************************************************
  *              GetStringTypeA                [OLE2NLS.7]
  */
@@ -1803,40 +1039,63 @@
 {
 	return GetStringTypeEx32A(locale,dwInfoType,src,cchSrc,chartype);
 }
+
 /***********************************************************************
  *              GetStringTypeExA                [KERNEL32.276]
+ *
+ * FIXME: Ignores the locale.
  */
 BOOL32 WINAPI GetStringTypeEx32A(LCID locale,DWORD dwInfoType,LPCSTR src,
                                  INT32 cchSrc,LPWORD chartype)
 {
 	int	i;
-
-	switch (dwInfoType) {
-	case CT_CTYPE2:
-		FIXME(ole,"CT_CTYPE2 not supported.\n");
-		return FALSE;
-	case CT_CTYPE3:
-		FIXME(ole,"CT_CTYPE3 not supported.\n");
-		return FALSE;
-	default:break;
+	
+	if ((src==NULL) || (chartype==NULL) || (src==(LPSTR)chartype))
+	{
+	  SetLastError(ERROR_INVALID_PARAMETER);
+	  return FALSE;
 	}
+
 	if (cchSrc==-1)
-		cchSrc=lstrlen32A(src);
-	for (i=0;i<cchSrc;i++) {
-		chartype[i] = 0;
-		if (isdigit(src[i])) chartype[i]|=C1_DIGIT;
-		if (isalpha(src[i])) chartype[i]|=C1_ALPHA;
-		if (islower(src[i])) chartype[i]|=C1_LOWER;
-		if (isupper(src[i])) chartype[i]|=C1_UPPER;
-		if (isspace(src[i])) chartype[i]|=C1_SPACE;
-		if (ispunct(src[i])) chartype[i]|=C1_PUNCT;
-		if (iscntrl(src[i])) chartype[i]|=C1_CNTRL;
+	  cchSrc=lstrlen32A(src)+1;
+	  
+	switch (dwInfoType) {
+	case CT_CTYPE1:
+	  for (i=0;i<cchSrc;i++) 
+	  {
+	    chartype[i] = 0;
+	    if (isdigit(src[i])) chartype[i]|=C1_DIGIT;
+	    if (isalpha(src[i])) chartype[i]|=C1_ALPHA;
+	    if (islower(src[i])) chartype[i]|=C1_LOWER;
+	    if (isupper(src[i])) chartype[i]|=C1_UPPER;
+	    if (isspace(src[i])) chartype[i]|=C1_SPACE;
+	    if (ispunct(src[i])) chartype[i]|=C1_PUNCT;
+	    if (iscntrl(src[i])) chartype[i]|=C1_CNTRL;
 /* FIXME: isblank() is a GNU extension */
 /*		if (isblank(src[i])) chartype[i]|=C1_BLANK; */
-                if ((src[i] == ' ') || (src[i] == '\t')) chartype[i]|=C1_BLANK;
-		/* C1_XDIGIT */
+	    if ((src[i] == ' ') || (src[i] == '\t')) chartype[i]|=C1_BLANK;
+	    /* C1_XDIGIT */
 	}
 	return TRUE;
+
+	case CT_CTYPE2:
+	  for (i=0;i<cchSrc;i++) 
+	  {
+	    chartype[i]=(WORD)CT_CType2_LUT[i];
+	  }
+	  return TRUE;
+
+	case CT_CTYPE3:
+	  for (i=0;i<cchSrc;i++) 
+	  {
+	    chartype[i]=CT_CType3_LUT[i];
+	  }
+	  return TRUE;
+
+	default:
+	  ERR(ole,"Unknown dwInfoType:%ld\n",dwInfoType);
+	  return FALSE;
+	}
 }
 
 /*********************************************************************
@@ -1860,6 +1119,10 @@
 {
 	int	i;
 
+
+	if (cchSrc==-1)
+	  cchSrc=lstrlen32W(src)+1;
+	
 	switch (dwInfoType) {
 	case CT_CTYPE2:
 		FIXME(ole,"CT_CTYPE2 not supported.\n");
@@ -1869,8 +1132,6 @@
 		return FALSE;
 	default:break;
 	}
-	if (cchSrc==-1)
-		cchSrc=lstrlen32W(src);
 	for (i=0;i<cchSrc;i++) {
 		chartype[i] = 0;
 		if (isdigit(src[i])) chartype[i]|=C1_DIGIT;
@@ -2417,7 +1678,7 @@
     return 0;
   }
   if (srclen==-1) 
-    srclen = lstrlen32A(srcstr);
+    srclen = lstrlen32A(srcstr) + 1 ;    /* (include final '\0') */
 
   if (mapflags & ~ ( LCMAP_UPPERCASE | LCMAP_LOWERCASE | LCMAP_SORTKEY |
 		     NORM_IGNORECASE | NORM_IGNORENONSPACE | SORT_STRINGSORT) )
@@ -2434,10 +1695,8 @@
     if (dstlen==0)
       return srclen;  /* dstlen=0 means "do nothing but return required length" */
     if (dstlen<srclen)
-    {
-      SetLastError(ERROR_INSUFFICIENT_BUFFER);
-      return 0;
-    }
+      srclen=dstlen;  /* No, this case is not an error under Windows 95.
+		         And no '\0' gets written. */
     if (mapflags & LCMAP_UPPERCASE)
       f = toupper;
     else if (mapflags & LCMAP_LOWERCASE)
@@ -2505,6 +1764,13 @@
       return 0;
     }
 
+    /*FIXME the Pointercheck should not be nessesary */
+    if (IsBadWritePtr32 (dststr,room))
+    { ERR (string,"bad destination buffer (dststr) : %p,%d\n",dststr,dstlen);
+      SetLastError(ERROR_INSUFFICIENT_BUFFER);
+      return 0;
+    }
+
     /* locate each component, write separators */
     diacritic_component = dststr + 2*unicode_len ;
     *diacritic_component++ = '\1'; 
@@ -2589,7 +1855,7 @@
     return 0;
   }
   if (srclen==-1) 
-    srclen = lstrlen32W(srcstr);
+    srclen = lstrlen32W(srcstr)+1;
   if (mapflags & LCMAP_SORTKEY) 
   {
     FIXME(string,"(0x%04lx,0x%08lx,%p,%d,%p,%d): "
@@ -2635,7 +1901,8 @@
 {
   int mapstring_flags;
   int len1,len2;
-
+  int result;
+  LPSTR sk1,sk2;
   TRACE(ole,"%s and %s\n",
 	debugstr_a (s1), debugstr_a (s2));
 
@@ -2645,8 +1912,6 @@
     return 0;
   }
 
-  if(fdwStyle & NORM_IGNORENONSPACE)
-    FIXME(ole, "IGNORENONSPACE not supported\n");
   if(fdwStyle & NORM_IGNORESYMBOLS)
     FIXME(ole, "IGNORESYMBOLS not supported\n");
   	
@@ -2657,17 +1922,19 @@
   if ((len1==0)||(len2==0))
     return 0;     /* something wrong happened */
 
-  {
-    char sk1[len1];    
-    char sk2[len2];    
-    if ( (!LCMapString32A(lcid,mapstring_flags,s1,l1,sk1,len1))
+  sk1 = (LPSTR)HeapAlloc(GetProcessHeap(),0,len1);
+  sk2 = (LPSTR)HeapAlloc(GetProcessHeap(),0,len2);
+  if ( (!LCMapString32A(lcid,mapstring_flags,s1,l1,sk1,len1))
 	 || (!LCMapString32A(lcid,mapstring_flags,s2,l2,sk2,len2)) )
-    {
-      ERR(ole,"Bug in LCmapString32A.");
-      return 0;
-    }
-    return strcmp(sk1,sk2)+2;
+  { ERR(ole,"Bug in LCmapString32A.\n");
+    result = 0;
   }
+  else
+  { result = strcmp(sk1,sk2)+2;
+  }
+  HeapFree(GetProcessHeap(),0,sk1);
+  HeapFree(GetProcessHeap(),0,sk2);
+  return result;
 }
 
 /***********************************************************************
diff --git a/ole/typelib.c b/ole/typelib.c
index 1ffdbd1..97a57bb 100644
--- a/ole/typelib.c
+++ b/ole/typelib.c
@@ -54,7 +54,7 @@
 	*path = SysAllocString16(pathname);
 	return S_OK;
 }
-
+ 
 /****************************************************************************
  *	QueryPathOfRegTypeLib			(OLEAUT32.164)
  * RETURNS
@@ -94,7 +94,6 @@
 
 /******************************************************************************
  * LoadTypeLib [TYPELIB.3]  Loads and registers a type library
- *
  * NOTES
  *    Docs: OLECHAR FAR* szFile
  *    Docs: iTypeLib FAR* FAR* pptLib
@@ -111,6 +110,45 @@
     return E_FAIL;
 }
 
+/******************************************************************************
+ * LoadTypeLib				(OLEAUT32.161)
+ * Loads and registers a type library
+ * NOTES
+ *    Docs: OLECHAR FAR* szFile
+ *    Docs: iTypeLib FAR* FAR* pptLib
+ *
+ * RETURNS
+ *    Success: S_OK
+ *    Failure: Status
+ */
+HRESULT WINAPI LoadTypeLib32(
+    void *szFile,   /* [in] Name of file to load from */
+    void * *pptLib) /* [out] Pointer to pointer to loaded type library */
+{
+    FIXME(ole, "(%s,%p): stub\n",szFile,pptLib);
+    (long *)pptLib=0x123;
+    return S_OK;           /* fixme: pretend everything is OK*/
+}
+
+/******************************************************************************
+ * RegisterTypeLib				(OLEAUT32.163)
+ * Adds information about a type library to the System Registry           
+ * NOTES
+ *    Docs: ITypeLib FAR * ptlib
+ *    Docs: OLECHAR FAR* szFullPath
+ *    Docs: OLECHAR FAR* szHelpDir
+ *
+ * RETURNS
+ *    Success: S_OK
+ *    Failure: Status
+ */
+HRESULT WINAPI RegisterTypeLib32(
+     ITypeLib * ptlib,      /*[in] Pointer to the library*/
+     OLECHAR * szFullPath, /*[in] full Path of the library*/
+     OLECHAR * szHelpDir)  /*[in] dir to the helpfile for the library, may be NULL*/  
+{   FIXME(ole, "(%p,%s,%s): stub\n",ptlib, szFullPath,szHelpDir);
+    return S_OK;	/* fixme: pretend everything is OK*/
+}
 
 /****************************************************************************
  *	OABuildVersion				(TYPELIB.15)
diff --git a/relay32/comctl32.spec b/relay32/comctl32.spec
index cd5871c..3d04c04 100644
--- a/relay32/comctl32.spec
+++ b/relay32/comctl32.spec
@@ -75,10 +75,10 @@
  68 stdcall ImageList_Replace(ptr long long long) ImageList_Replace
  69 stdcall ImageList_ReplaceIcon(ptr long long) ImageList_ReplaceIcon
  70 stdcall ImageList_SetBkColor(ptr long) ImageList_SetBkColor
- 71 stdcall Alloc(long) Alloc
- 72 stdcall ReAlloc(long long) ReAlloc
- 73 stdcall Free(long) Free
- 74 stub GetSize
+ 71 stdcall Alloc(long) COMCTL32_Alloc
+ 72 stdcall ReAlloc(long long) COMCTL32_ReAlloc
+ 73 stdcall Free(long) COMCTL32_Free
+ 74 stdcall GetSize(long) COMCTL32_GetSize
  75 stdcall ImageList_SetDragCursorImage(ptr long long long) ImageList_SetDragCursorImage
  76 stub ImageList_SetFilter
  77 stdcall ImageList_SetIconSize(ptr long long) ImageList_SetIconSize
@@ -114,7 +114,7 @@
 
 320 stdcall DSA_Create(long long) DSA_Create
 321 stdcall DSA_Destroy(long) DSA_Destroy
-322 stub DSA_GetItem
+322 stdcall DSA_GetItem(long long long) DSA_GetItem
 323 stdcall DSA_GetItemPtr(long long) DSA_GetItemPtr
 324 stdcall DSA_InsertItem(long long long) DSA_InsertItem
 325 stub DSA_SetItem
diff --git a/relay32/dplay.spec b/relay32/dplay.spec
index d8dbe2c..2d62cb5 100644
--- a/relay32/dplay.spec
+++ b/relay32/dplay.spec
@@ -1,5 +1,5 @@
 name dplay
 type win32
 
-  1 stub DirectPlayCreate
+  1 stdcall DirectPlayCreate(ptr ptr ptr ptr) DirectPlayCreate
   2 stub DirectPlayEnumerate
diff --git a/relay32/dplayx.spec b/relay32/dplayx.spec
index cffce80..49c51b7 100644
--- a/relay32/dplayx.spec
+++ b/relay32/dplayx.spec
@@ -1,9 +1,9 @@
 name dplayx
 type win32
 
-  1 stub DirectPlayCreate
-  2 stub DirectPlayEnumerateA
-  3 stub DirectPlayEnumerateW
+  1 stdcall DirectPlayCreate(ptr ptr ptr ptr) DirectPlayCreate
+  2 stdcall DirectPlayEnumerateA(ptr ptr) DirectPlayEnumerateA
+  3 stdcall DirectPlayEnumerateW(ptr ptr) DirectPlayEnumerateW
   4 stdcall DirectPlayLobbyCreateA(ptr ptr ptr ptr long) DirectPlayLobbyCreateA
   5 stdcall DirectPlayLobbyCreateW(ptr ptr ptr ptr long) DirectPlayLobbyCreateW
   9 stub DirectPlayEnumerate
diff --git a/relay32/kernel32.spec b/relay32/kernel32.spec
index e403451..2e35642 100644
--- a/relay32/kernel32.spec
+++ b/relay32/kernel32.spec
@@ -191,7 +191,7 @@
 176 stub CreateSocketHandle
 177 stub CreateTapePartition
 178 stdcall CreateThread(ptr long ptr long long ptr) CreateThread
-179 stub CreateToolhelp32Snapshot
+179 stdcall CreateToolhelp32Snapshot(long long) CreateToolhelp32Snapshot
 180 stub DebugActiveProcess
 # FIXME
 #181 register DebugBreak() DebugBreak
@@ -384,7 +384,7 @@
 367 stub GetPrivateProfileSectionW
 368 stdcall GetPrivateProfileStringA(str str str ptr long str) GetPrivateProfileString32A
 369 stdcall GetPrivateProfileStringW(wstr wstr wstr ptr long wstr) GetPrivateProfileString32W
-370 stub GetPrivateProfileStructA
+370 stdcall GetPrivateProfileStructA (str str ptr long str) GetPrivateProfileStruct32A
 371 stub GetPrivateProfileStructW
 372 stdcall GetProcAddress(long str) GetProcAddress32
 373 stdcall GetProcessAffinityMask(long ptr ptr) GetProcessAffinityMask
@@ -723,8 +723,8 @@
 706 stdcall UnmapViewOfFile(ptr) UnmapViewOfFile
 707 stub UpdateResourceA
 708 stub UpdateResourceW
-709 stub VerLanguageNameA
-710 stub VerLanguageNameW
+709 stdcall VerLanguageNameA(long str long) VerLanguageName32A
+710 stdcall VerLanguageNameW(long wstr long) VerLanguageName32W
 711 stdcall VirtualAlloc(ptr long long long) VirtualAlloc
 712 stdcall VirtualFree(ptr long long) VirtualFree
 713 stdcall VirtualLock(ptr long) VirtualLock
@@ -758,7 +758,7 @@
 741 stub WritePrivateProfileSectionW
 742 stdcall WritePrivateProfileStringA(str str str str) WritePrivateProfileString32A
 743 stdcall WritePrivateProfileStringW(wstr wstr wstr wstr) WritePrivateProfileString32W
-744 stub WritePrivateProfileStructA
+744 stdcall WritePrivateProfileStructA (str str ptr long str) WritePrivateProfileStruct32A
 745 stub WritePrivateProfileStructW
 746 stdcall WriteProcessMemory(long ptr ptr long ptr) WriteProcessMemory
 747 stub WriteProfileSectionA
diff --git a/relay32/ntdll.spec b/relay32/ntdll.spec
index 2e4a7ec..aaf2d41 100644
--- a/relay32/ntdll.spec
+++ b/relay32/ntdll.spec
@@ -65,7 +65,7 @@
 062 stub NtCancelIoFile
 063 stub NtCancelTimer
 064 stub NtClearEvent
-065 stub NtClose
+065 stdcall NtClose(long) NtClose
 066 stub NtCloseObjectAuditAlarm
 067 stub NtCompleteConnectPort
 068 stub NtConnectPort
@@ -129,7 +129,7 @@
 126 stub NtOpenEventPair
 127 stdcall NtOpenFile(ptr long ptr ptr long long) NtOpenFile
 128 stub NtOpenIoCompletion
-129 stub NtOpenKey
+129 stdcall NtOpenKey(ptr long ptr) NtOpenKey
 130 stub NtOpenMutant
 131 stub NtOpenObjectAuditAlarm
 132 stub NtOpenProcess
@@ -154,7 +154,7 @@
 151 stub NtQueryEvent
 152 stub NtQueryInformationFile
 153 stub NtQueryInformationPort
-154 stub NtQueryInformationProcess
+154 stdcall NtQueryInformationProcess(long long long long long) NtQueryInformationProcess
 155 stub NtQueryInformationThread
 156 stub NtQueryInformationToken
 157 stub NtQueryIntervalProfile
@@ -171,8 +171,8 @@
 168 stdcall NtQuerySystemInformation(long long long long) NtQuerySystemInformation
 169 stub NtQuerySystemTime
 170 stub NtQueryTimer
-171 stub NtQueryTimerResolution
-172 stub NtQueryValueKey
+171 stdcall NtQueryTimerResolution(long long long) NtQueryTimerResolution
+172 stdcall NtQueryValueKey(long long long long long long) NtQueryValueKey
 173 stub NtQueryVirtualMemory
 174 stub NtQueryVolumeInformationFile
 175 stub NtRaiseException
@@ -399,11 +399,11 @@
 396 stub RtlImageDirectoryEntryToData
 397 stdcall RtlImageNtHeader(long) RtlImageNtHeader
 398 stub RtlImpersonateSelf
-399 stdcall RtlInitAnsiString(ptr ptr) RtlInitAnsiString
+399 stdcall RtlInitAnsiString(ptr str) RtlInitAnsiString
 400 stub RtlInitCodePageTable
 401 stub RtlInitNlsTables
-402 stdcall RtlInitString(ptr ptr) RtlInitString
-403 stdcall RtlInitUnicodeString(ptr ptr) RtlInitUnicodeString
+402 stdcall RtlInitString(ptr str) RtlInitString
+403 stdcall RtlInitUnicodeString(ptr wstr) RtlInitUnicodeString
 404 stub RtlInitializeBitMap
 405 stub RtlInitializeContext
 406 stdcall RtlInitializeCriticalSection(ptr) InitializeCriticalSection
diff --git a/relay32/oleaut32.spec b/relay32/oleaut32.spec
index af80955..fe57d97 100644
--- a/relay32/oleaut32.spec
+++ b/relay32/oleaut32.spec
@@ -131,9 +131,9 @@
 149 stub SysStringByteLen
 150 stub SysAllocStringByteLen
 160 stub CreateTypeLib
-161 stub LoadTypeLib
-162 stub LoadRegTypeLib
-163 stub RegisterTypeLib
+161 stdcall LoadTypeLib (ptr ptr) LoadTypeLib32
+162 stub LoadRegTypeLib 
+163 stdcall RegisterTypeLib(ptr str str) RegisterTypeLib32
 164 stdcall QueryPathOfRegTypeLib(ptr long long long ptr) QueryPathOfRegTypeLib32
 165 stub LHashValOfNameSys
 166 stub LHashValOfNameSysA
diff --git a/relay32/relay386.c b/relay32/relay386.c
index e586d40..bb6297f 100644
--- a/relay32/relay386.c
+++ b/relay32/relay386.c
@@ -18,6 +18,46 @@
 char **debug_relay_excludelist = NULL, **debug_relay_includelist = NULL;
 
 /***********************************************************************
+ *           RELAY_ShowDebugmsgRelay
+ *
+ * Simple function to decide if a particular debugging message is
+ * wanted.  Called from RELAY_CallFrom32 and from in if1632/relay.c
+ */
+int RELAY_ShowDebugmsgRelay(const char *func) {
+
+  if(debug_relay_excludelist || debug_relay_includelist) {
+    const char *term = strchr(func, ':');
+    char **listitem;
+    int len, len2, itemlen, show;
+
+    if(debug_relay_excludelist) {
+      show = 1;
+      listitem = debug_relay_excludelist;
+    } else {
+      show = 0;
+      listitem = debug_relay_includelist;
+    }
+    assert(term);
+    assert(strlen(term) > 2);
+    len = term - func;
+    len2 = strchr(func, '.') - func;
+    assert(len2 && len2 > 0 && len2 < 64);
+    term += 2;
+    for(; *listitem; listitem++) {
+      itemlen = strlen(*listitem);
+      if((itemlen == len && !strncmp(*listitem, func, len)) ||
+         (itemlen == len2 && !strncmp(*listitem, func, len2)) ||
+         !strcmp(*listitem, term)) {
+        show = !show;
+       break;
+      }
+    }
+    return show;
+  }
+  return 1;
+}
+
+/***********************************************************************
  *           RELAY_CallFrom32
  *
  * Stack layout on entry to this function:
@@ -29,7 +69,7 @@
  */
 int RELAY_CallFrom32( int ret_addr, ... )
 {
-    int i, ret, show = 1;
+    int i, ret, show;
     char buffer[80];
     FARPROC32 func;
     unsigned int mask, typemask;
@@ -41,36 +81,9 @@
     WORD nb_args = *(WORD *)(relay_addr + 1) / sizeof(int);
 
     assert(TRACE_ON(relay));
-    GET_FS( fs );
     func = (FARPROC32)BUILTIN32_GetEntryPoint( buffer, relay_addr - 5,
                                                &typemask );
-    if(debug_relay_excludelist || debug_relay_includelist) {
-      char *term = strchr(buffer, ':'), **listitem;
-      int len, len2, itemlen;
-
-      if(debug_relay_excludelist) {
-	show = 1;
-	listitem = debug_relay_excludelist;
-      } else {
-	show = 0;
-	listitem = debug_relay_includelist;
-      }
-      assert(term);
-      assert(strlen(term) > 2);
-      len = term - buffer;
-      len2 = strchr(buffer, '.') - buffer;
-      assert(len2 && len2 > 0 && len2 < 64);
-      term += 2;
-      for(; *listitem; listitem++) {
-        itemlen = strlen(*listitem);
-        if((itemlen == len && !strncmp(*listitem, buffer, len)) ||
-           (itemlen == len2 && !strncmp(*listitem, buffer, len2)) ||
-           !strcmp(*listitem, term)) {
-          show = !show;
-          break;
-        }
-      }
-    }
+    show = RELAY_ShowDebugmsgRelay(buffer);
     if(show) {
       DPRINTF( "Call %s(", buffer );
       args++;
@@ -86,9 +99,12 @@
 	}
         else DPRINTF( "%08x", args[i] );
       }
+      GET_FS( fs );
       DPRINTF( ") ret=%08x fs=%04x\n", ret_addr, fs );
-    } else
+    } else {
       args++;
+      fs = 0; /* quieten gcc */
+    }
     if (*relay_addr == 0xc3) /* cdecl */
     {
         LRESULT (*cfunc)() = (LRESULT(*)())func;
diff --git a/relay32/shell32.spec b/relay32/shell32.spec
index 5607578..2bb8126 100644
--- a/relay32/shell32.spec
+++ b/relay32/shell32.spec
@@ -146,7 +146,7 @@
  144 stub SHELL32_144
  145 stub SHELL32_145
  146 stub SHELL32_146
- 147 stub SHELL32_147
+ 147 stdcall SHELL32_147(long long) SHELL32_147
  148 stub ExtractIconResInfoA
  149 stub SHELL32_149
  150 stub ExtractIconResInfoW
@@ -208,7 +208,7 @@
  206 stub SHAddToRecentDocs
  207 stdcall SHAppBarMessage(long ptr) SHAppBarMessage32
  208 stub SHBrowseForFolder
- 209 stub SHBrowseForFolderA
+ 209 stdcall SHBrowseForFolderA(ptr) SHBrowseForFolder32A
  210 stub SHChangeNotify
  211 stub SHFileOperation
  212 stub SHFileOperationA
diff --git a/relay32/snoop.c b/relay32/snoop.c
index 061fad2..f4a12fb 100644
--- a/relay32/snoop.c
+++ b/relay32/snoop.c
@@ -19,13 +19,15 @@
 #include "debugstr.h"
 #include "debug.h"
 
+char **debug_snoop_excludelist = NULL, **debug_snoop_includelist = NULL;
+
 #ifdef NEED_UNDERSCORE_PREFIX
 # define PREFIX "_"
 #else
 # define PREFIX
 #endif
 
-/* Well ,not exactly extern since they are in the same file (in the lines
+/* Well, not exactly extern since they are in the same file (in the lines
  * below). But the C Compiler doesn't see them there, so we have to help a bit.
  */
 extern void SNOOP_Return();
@@ -81,6 +83,7 @@
 	DWORD		ordinal;
 	DWORD		origESP;
 	DWORD		*args;		/* saved args across a stdcall */
+	BYTE		show;
 } SNOOP_RETURNENTRY;
 
 typedef struct tagSNOOP_RETURNENTRIES {
@@ -93,6 +96,44 @@
 static	SNOOP_DLL		*firstdll = NULL;
 static	SNOOP_RETURNENTRIES 	*firstrets = NULL;
 
+/***********************************************************************
+ *          SNOOP_ShowDebugmsgSnoop
+ *
+ * Simple function to decide if a particular debugging message is
+ * wanted.
+ */
+int SNOOP_ShowDebugmsgSnoop(const char *dll, int ord, const char *fname) {
+
+  if(debug_snoop_excludelist || debug_snoop_includelist) {
+    char **listitem;
+    char buf[80];
+    int len, len2, itemlen, show;
+
+    if(debug_snoop_excludelist) {
+      show = 1;
+      listitem = debug_snoop_excludelist;
+    } else {
+      show = 0;
+      listitem = debug_snoop_includelist;
+    }
+    len = strlen(dll);
+    assert(len < 64);
+    sprintf(buf, "%s.%d", dll, ord);
+    len2 = strlen(buf);
+    for(; *listitem; listitem++) {
+      itemlen = strlen(*listitem);
+      if((itemlen == len && !strncmp(*listitem, buf, len)) ||
+         (itemlen == len2 && !strncmp(*listitem, buf, len2)) ||
+         !strcmp(*listitem, fname)) {
+        show = !show;
+       break;
+      }
+    }
+    return show;
+  }
+  return 1;
+}
+
 void
 SNOOP_RegisterDLL(HMODULE32 hmod,LPCSTR name,DWORD nrofordinals) {
 	SNOOP_DLL	**dll = &(firstdll);
@@ -136,7 +177,7 @@
 		    		   pe_seg[j].SizeOfRawData)
 		)
 			break;
-	/* If we looked through all sections (and didn't find one) 
+	/* If we looked through all sections (and didn't find one)
 	 * or if the sectionname contains "data", we return the
 	 * original function since it is most likely a datareference.
 	 */
@@ -225,7 +266,7 @@
 	SNOOP_FUN	*fun = NULL;
 	SNOOP_RETURNENTRIES	**rets = &firstrets;
 	SNOOP_RETURNENTRY	*ret;
-	int		i,max;
+	int		i,max,show;
 
 	while (dll) {
 		if (	((char*)entry>=(char*)dll->funs)	&&
@@ -244,7 +285,7 @@
 	/* guess cdecl ... */
 	if (fun->nrofargs<0) {
 		/* Typical cdecl return frame is:
-		 * 	add esp, xxxxxxxx 
+		 * 	add esp, xxxxxxxx
 		 * which has (for xxxxxxxx up to 255 the opcode "83 C4 xx".
 		 */
 		LPBYTE	reteip = (LPBYTE)CALLER1REF;
@@ -279,6 +320,8 @@
 
 	EIP_reg(context)= (DWORD)fun->origfun;
 
+	ret->show = SNOOP_ShowDebugmsgSnoop(dll->name, ordinal, fun->name);
+	if(!ret->show) return;
 	DPRINTF("Call %s.%ld: %s(",dll->name,ordinal,fun->name);
 	if (fun->nrofargs>0) {
 		max = fun->nrofargs; if (max>16) max=16;
@@ -298,14 +341,16 @@
 	SNOOP_RETURNENTRY	*ret = (SNOOP_RETURNENTRY*)(EIP_reg(context)-5);
 
 	/* We haven't found out the nrofargs yet. If we called a cdecl
-	 * function it is too late anyway and we can just set '0' (which 
+	 * function it is too late anyway and we can just set '0' (which
 	 * will be the difference between orig and current ESP
 	 * If stdcall -> everything ok.
 	 */
 	if (ret->dll->funs[ret->ordinal].nrofargs<0)
 		ret->dll->funs[ret->ordinal].nrofargs=(ESP_reg(context)-ret->origESP-4)/4;
 	EIP_reg(context) = (DWORD)ret->origreturn;
-	if (ret->args) {
+	if(!ret->show) {
+		;
+	} else if (ret->args) {
 		int	i,max;
 
 		DPRINTF("Ret  %s.%ld: %s(",ret->dll->name,ret->ordinal,ret->dll->funs[ret->ordinal].name);
diff --git a/scheduler/sysdeps.c b/scheduler/sysdeps.c
index 8599c5f..d76988a 100644
--- a/scheduler/sysdeps.c
+++ b/scheduler/sysdeps.c
@@ -16,6 +16,7 @@
 #include <unistd.h>
 #include "thread.h"
 #include "winbase.h"
+#include "debug.h"
 
 /* Xlib critical section (FIXME: does not belong here) */
 CRITICAL_SECTION X11DRV_CritSection = { 0, };
diff --git a/scheduler/thread.c b/scheduler/thread.c
index e9d27b1..1137d35 100644
--- a/scheduler/thread.c
+++ b/scheduler/thread.c
@@ -690,12 +690,36 @@
  * RETURNS
  *    Success: Previous suspend count
  *    Failure: 0xFFFFFFFF
+ *    Already running: 0
  */
 DWORD WINAPI ResumeThread(
-    HANDLE32 handle) /* [in] Indentifies thread to restart */
+    HANDLE32 hthread) /* [in] Indentifies thread to restart */
 {
-    FIXME(thread,"(0x%08x): stub\n",handle);
-    return 0xFFFFFFFF;
+    THDB *thread;
+    DWORD oldcount;
+
+    SYSTEM_LOCK();
+    if (!(thread = THREAD_GetPtr( hthread, THREAD_QUERY_INFORMATION )))
+    {
+        SYSTEM_UNLOCK();
+        WARN(thread, "Invalid thread handle\n");
+	return 0xFFFFFFFF;
+    }
+    if ((oldcount = thread->suspend_count) != 0)
+    {
+        if (!--thread->suspend_count)
+        {
+            if (kill(thread->unix_pid, SIGCONT))
+            {
+                WARN(thread, "Unable to CONTinue pid: %04x\n",
+                     thread->unix_pid);
+                oldcount = 0xFFFFFFFF;
+            }
+        }
+    }
+    K32OBJ_DecCount(&thread->header);
+    SYSTEM_UNLOCK();
+    return oldcount;
 }
 
 
@@ -707,10 +731,39 @@
  *    Failure: 0xFFFFFFFF
  */
 DWORD WINAPI SuspendThread(
-    HANDLE32 handle) /* [in] Handle to the thread */
+    HANDLE32 hthread) /* [in] Handle to the thread */
 {
-    FIXME(thread,"(0x%08x): stub\n",handle);
-    return 0xFFFFFFFF;
+    THDB *thread;
+    DWORD oldcount;
+
+    SYSTEM_LOCK();
+    if (!(thread = THREAD_GetPtr( hthread, THREAD_QUERY_INFORMATION )))
+    {
+        SYSTEM_UNLOCK();
+        WARN(thread, "Invalid thread handle\n");
+	return 0xFFFFFFFF;
+    }
+    
+    if (!(oldcount = thread->suspend_count))
+    {
+        if (thread->unix_pid == getpid())
+            WARN(thread, "Attempting to suspend myself\n" );
+        else
+        {
+            if (kill(thread->unix_pid, SIGSTOP))
+            {
+                WARN(thread, "Unable to STOP pid: %04x\n", 
+                     thread->unix_pid);
+                oldcount = 0xFFFFFFFF;
+            }
+            else thread->suspend_count++;
+        }
+    }
+    else thread->suspend_count++;
+    K32OBJ_DecCount( &thread->header );
+    SYSTEM_UNLOCK();
+    return oldcount;
+
 }
 
 
diff --git a/tools/build.c b/tools/build.c
index f0564d4..c119136 100644
--- a/tools/build.c
+++ b/tools/build.c
@@ -167,6 +167,9 @@
   /* Offset of the stack pointer relative to %fs:(0) */
 #define STACKOFFSET (STRUCTOFFSET(THDB,cur_stack) - STRUCTOFFSET(THDB,teb))
 
+  /* Offset of the saved fs relative to %fs:(0) */
+#define FSOFFSET (STRUCTOFFSET(THDB,saved_fs) - STRUCTOFFSET(THDB,teb))
+
 
 static void *xmalloc (size_t size)
 {
@@ -1605,7 +1608,10 @@
     fprintf( outfile, "\tdata16\n");
 #endif
     fprintf( outfile, "\tmovw %%bx,%%es\n" );
+
+    fprintf( outfile, "\tmovw %%fs, %%bx\n" );
     fprintf( outfile, "\tmovw " PREFIX "CALLTO16_Current_fs,%%fs\n" );
+    fprintf( outfile, "\t.byte 0x64\n\tmovw %%bx,(%d)\n", FSOFFSET );
 
     /* Get the 32-bit stack pointer from the TEB */
 
@@ -1724,6 +1730,9 @@
     fprintf( outfile, "\t.byte 0x64\n\tpopl (%d)\n", STACKOFFSET );
     fprintf( outfile, "\tmovw %%fs," PREFIX "CALLTO16_Current_fs\n" );
 
+    fprintf( outfile, "\t.byte 0x64\n\tmovw (%d),%%bx\n", FSOFFSET );
+    fprintf( outfile, "\tmovw %%bx, %%fs\n" );
+
     if (reg_func)
     {
         /* Calc the arguments size */
@@ -1909,6 +1918,9 @@
         fprintf( outfile, "\tmovl %%eax,%%esp\n" );
         fprintf( outfile, "\t.byte 0x64\n\tmovl %%edx,(%d)\n", STACKOFFSET );
 
+    fprintf( outfile, "\t.byte 0x64\n\tmovw (%d),%%cx\n", FSOFFSET );
+    fprintf( outfile, "\tmovw %%cx, %%fs\n" );
+
         /* Get the registers. ebx is handled later on. */
 
         fprintf( outfile, "\tmovl 8(%%ebx),%%ebx\n" );
@@ -1959,6 +1971,9 @@
         fprintf( outfile, "\t.byte 0x64\n\tmovw (%d),%%sp\n", STACKOFFSET );
         fprintf( outfile, "\t.byte 0x64\n\tmovl %%edx,(%d)\n", STACKOFFSET );
 
+    fprintf( outfile, "\t.byte 0x64\n\tmovw (%d),%%cx\n", FSOFFSET );
+    fprintf( outfile, "\tmovw %%cx, %%fs\n" );
+
         /* Make %bp point to the previous stackframe (built by CallFrom16) */
         fprintf( outfile, "\tmovzwl %%sp,%%ebp\n" );
         fprintf( outfile, "\tleal %d(%%ebp),%%ebp\n",
@@ -2039,7 +2054,10 @@
     fprintf( outfile, "\tdata16\n");
 #endif
     fprintf( outfile, "\tmovw %%bx,%%es\n" );
+
+    fprintf( outfile, "\tmovw %%fs, %%cx\n" );
     fprintf( outfile, "\tmovw " PREFIX "CALLTO16_Current_fs,%%fs\n" );
+    fprintf( outfile, "\t.byte 0x64\n\tmovw %%cx,(%d)\n", FSOFFSET );
 
     /* Restore the 32-bit stack */
 
@@ -2068,11 +2086,9 @@
     fprintf( outfile, "\t.globl " PREFIX "CALLTO16_RetAddr_word\n" );
     fprintf( outfile, "\t.globl " PREFIX "CALLTO16_RetAddr_long\n" );
     fprintf( outfile, "\t.globl " PREFIX "CALLTO16_RetAddr_eax\n" );
-    fprintf( outfile, "\t.globl " PREFIX "CALLTO16_Current_fs\n" );
     fprintf( outfile, PREFIX "CALLTO16_RetAddr_word:\t.long 0\n" );
     fprintf( outfile, PREFIX "CALLTO16_RetAddr_long:\t.long 0\n" );
     fprintf( outfile, PREFIX "CALLTO16_RetAddr_eax:\t.long 0\n" );
-    fprintf( outfile, PREFIX "CALLTO16_Current_fs:\t.long 0\n" );
     fprintf( outfile, "\t.text\n" );
 }
 
diff --git a/tools/wrc/CHANGES b/tools/wrc/CHANGES
new file mode 100644
index 0000000..c51d562
--- /dev/null
+++ b/tools/wrc/CHANGES
@@ -0,0 +1,31 @@
+
+---------------------------------------------------------------------------
+Version 1.0.2 (20-Jun-1998)
+- Started this file
+- Fixed a bug in filename scanning when they are double quoted. The code now
+  is compatible with MS' rc and Borland's brc. There is a compromise in the
+  filenames because of case-sensitivity under *nix.
+- Backslashes in a filepath are now converted to forward slashes and double
+- Fixed a bug in printing the filename if loading of a file should fail.
+  backslashes are converted to single forward slash.
+- Added -L option to prevent conversion to lower case for embedded filenames
+  in resource statements.
+- Added language posibilities to icons and cursors so that the current
+  language is put into the .res ans .s file.
+- Added character position indication of an error.
+- Fixed CLASS statement so that it accepts double quoted strings as class
+  argument. This seems to be the correct behaviour (see SDK). The unquoted
+  class-name is still supported because it seems a reasonable option.
+- Fixed accelerators with CONTROL option set so that they generate correct
+  code instead of generating an error.
+- Added testing for flex version 2.5 or better because wrc needs the
+  yy_scan* functions to do preprocessing.
+
+---------------------------------------------------------------------------
+Version  1.0.1 (08-Jun-1998)
+- Added -A commandline option to generate autoregister code for the winelib
+  programs.
+
+---------------------------------------------------------------------------
+Version 1.0.0 (28-May-1998)
+- Initial release
diff --git a/tools/wrc/README.wrc b/tools/wrc/README.wrc
index 7c2b47a..26c4fd6 100644
--- a/tools/wrc/README.wrc
+++ b/tools/wrc/README.wrc
@@ -1,5 +1,9 @@
-This is the first release (1.0.0 (28-May-1998)) of the new resource compiler
-'wrc'. It improves the winerc implementation by these features:
+Release 1.0.2 of wrc (20-Jun-1998), the wine resource compiler.
+
+See the file CHANGES for differences between the version and what has been
+corrected in the current version.
+
+Wrc features:
 
 - source preprocessing
 - 16 and 32 bit support
@@ -23,6 +27,7 @@
 
 Usage: wrc [options...] [infile[.rc|.res]]
    -a n        Alignment of resource (win16 only, default is 4)
+   -A          Auto register resources (only with gcc 2.7 and better)
    -b          Create a C array from a binary .res file
    -c          Add 'const' prefix to C constants
    -C cp       Set the resource's codepage to cp (default is 0)
@@ -34,6 +39,7 @@
    -H file     Same as -h but written to file
    -I path     Set include search dir to path (multiple -I allowed)
    -l lan      Set default language to lan (default is neutral {0})
+   -L          Leave case of embedded filenames as is
    -n          Do not generate .s file
    -o file     Output to file (default is infile.[res|s|h]
    -p prefix   Give a prefix for the generated names
@@ -102,7 +108,8 @@
 Not all resource-types can have local language keywords attached yet
 (notably: BITMAP, CURSOR, ICON and usertype). This is due to implementation
 of filename-scanning and the complexity that it poses. This will be changed
-in the next release.
+in the next release. You can work arround this problem by putting a LANGUAGE
+statement before (and evt. after) the code in the resource file.
 
 
 Resource types supported
@@ -110,7 +117,7 @@
 All types are supported except for:
 - FONT
 - MESSAGETABLE
-- extensions like TOOLBAR and the like
+- extensions like TOOLBAR and the like (is this a user-type?)
 
 These types will be implemented as soon as I get a proper specification of
 the layout.
@@ -120,10 +127,10 @@
 must be enclosed in double quotes. These are examples of valid usertype
 resources:
 
-MyName "MyType" mydata.bin
-MyName 12345 mydata.bin
-MyName "MyType" "mydata.bin"
-MyName 12345 "mydata.bin"
+MyName "MyType"	mydata.bin
+MyName 12345	mydata.bin
+MyName "MyType"	"mydata.bin"
+MyName 12345	"mydata.bin"
 
 MyName "MyType"
 {
@@ -242,7 +249,10 @@
 - UNICODE translations are not/not correct implemented
 - No documentation ('wrc -?' gives command-line options though)
 - grep for FIXME in the source
-
+- Memory options are wrong under some conditions. There seems to be a
+  different action for win32 and win16.
+- User-type resources have slightly different layout.
+- Filename scanning is still hopeless.
 
 Reporting bugs and patches
 --------------------------
diff --git a/tools/wrc/genres.c b/tools/wrc/genres.c
index b9e831c..0f863d4 100644
--- a/tools/wrc/genres.c
+++ b/tools/wrc/genres.c
@@ -800,11 +800,6 @@
 	res = new_res();
 	if(win32)
 	{
-		/* FIXME: Borland's rc compiler writes the default system's
-		 * language if none specified (0x406 for me that is). I believe
-		 * that this is a Borland bug (brc32 ver. 5.01), as the default
-		 * should be 0 (system default).
-		 */
 		restag = put_res_header(res, WRC_RT_MENU, NULL, name, menex->memopt, &(menex->lvc));
 
 		put_word(res, 1);		/* Menuheader: Version */
@@ -847,15 +842,9 @@
 	assert(curg != NULL);
 
 	res = new_res();
-	restag = put_res_header(res, WRC_RT_GROUP_CURSOR, NULL, name, curg->memopt, NULL);
+	restag = put_res_header(res, WRC_RT_GROUP_CURSOR, NULL, name, curg->memopt, &(curg->lvc));
 	if(win32)
 	{
-		/* FIXME: Borland's rc compiler writes the default system's
-		 * language if none specified (0x406 for me that is). I believe
-		 * that this is a Borland bug (brc32 ver. 5.01), as the default
-		 * should be 0 (system default).
-		 */
-
 		put_word(res, 0);	/* Reserved */
 		/* FIXME: The ResType in the NEWHEADER structure should
 		 * contain 14 according to the MS win32 doc. This is
@@ -963,12 +952,7 @@
 	res = new_res();
 	name.type = name_ord;
 	name.name.i_name = cur->id;
-	/* FIXME: Borland's rc compiler writes the default system's
-	 * language if none specified (0x406 for me that is). I believe
-	 * that this is a Borland bug (brc32 ver. 5.01), as the default
-	 * should be 0 (system default).
-	 */
-	restag = put_res_header(res, WRC_RT_CURSOR, NULL, &name, WRC_MO_MOVEABLE | WRC_MO_DISCARDABLE, NULL);
+	restag = put_res_header(res, WRC_RT_CURSOR, NULL, &name, WRC_MO_MOVEABLE | WRC_MO_DISCARDABLE, &(cur->lvc));
 	put_word(res, cur->xhot);
 	put_word(res, cur->yhot);
 	put_raw_data(res, cur->data, 0);
@@ -1001,15 +985,9 @@
 	assert(icog != NULL);
 
 	res = new_res();
-	restag = put_res_header(res, WRC_RT_GROUP_ICON, NULL, name, icog->memopt, NULL);
+	restag = put_res_header(res, WRC_RT_GROUP_ICON, NULL, name, icog->memopt, &(icog->lvc));
 	if(win32)
 	{
-		/* FIXME: Borland's rc compiler writes the default system's
-		 * language if none specified (0x406 for me that is). I believe
-		 * that this is a Borland bug (brc32 ver. 5.01), as the default
-		 * should be 0 (system default).
-		 */
-
 		put_word(res, 0);	/* Reserved */
 		/* FIXME: The ResType in the NEWHEADER structure should
 		 * contain 14 according to the MS win32 doc. This is
@@ -1077,12 +1055,7 @@
 	res = new_res();
 	name.type = name_ord;
 	name.name.i_name = ico->id;
-	/* FIXME: Borland's rc compiler writes the default system's
-	 * language if none specified (0x406 for me that is). I believe
-	 * that this is a Borland bug (brc32 ver. 5.01), as the default
-	 * should be 0 (system default).
-	 */
-	restag = put_res_header(res, WRC_RT_ICON, NULL, &name, WRC_MO_MOVEABLE | WRC_MO_DISCARDABLE, NULL);
+	restag = put_res_header(res, WRC_RT_ICON, NULL, &name, WRC_MO_MOVEABLE | WRC_MO_DISCARDABLE, &(ico->lvc));
 	put_raw_data(res, ico->data, 0);
 
 	SetResSize(res, restag);	/* Set ResourceSize */
diff --git a/tools/wrc/newstruc.c b/tools/wrc/newstruc.c
index 6d33c4b..3fb9941 100644
--- a/tools/wrc/newstruc.c
+++ b/tools/wrc/newstruc.c
@@ -155,6 +155,7 @@
 	}
 	else
 		icog->memopt = WRC_MO_MOVEABLE | WRC_MO_PURE | WRC_MO_DISCARDABLE;
+	icog->lvc.language = dup_language(currentlanguage);
 	split_icons(rd, icog, &(icog->nicon));
 	free(rd->data);
 	free(rd);
@@ -171,6 +172,7 @@
 	}
 	else
 		curg->memopt = WRC_MO_MOVEABLE | WRC_MO_PURE | WRC_MO_DISCARDABLE;
+	curg->lvc.language = dup_language(currentlanguage);
 	split_cursors(rd, curg, &(curg->ncursor));
 	free(rd->data);
 	free(rd);
diff --git a/tools/wrc/parser.h b/tools/wrc/parser.h
index a038371..ce095af 100644
--- a/tools/wrc/parser.h
+++ b/tools/wrc/parser.h
@@ -18,7 +18,9 @@
 
 /* From parser.l */
 extern FILE *yyin;
+extern char *yytext;
 extern int line_number;
+extern int char_number;
 
 int yylex(void);
 void set_yywf(void);
diff --git a/tools/wrc/parser.l b/tools/wrc/parser.l
index 7b411d8..ddb7a97 100644
--- a/tools/wrc/parser.l
+++ b/tools/wrc/parser.l
@@ -3,6 +3,15 @@
  * Copyright 1994 Martin von Loewis
  * Copyright 1998 Bertho A. Stultiens (BS)
  *
+ * 20-Jun-1998 BS	- Changed the filename conversion. Filenames are
+ *			  case-sensitive inder *nix, but not under dos.
+ *			  default behaviour is to convert to lower case.
+ *			- All backslashes are converted to forward and
+ *			  both single and double slash is recognized as
+ *			  MS/Borland does.
+ *			- Fixed a bug in 'yywf' case that prevented
+ *			  double quoted names to be scanned propperly.
+ *
  * 19-May-1998 BS	- Started to build a preprocessor.
  *			- Changed keyword processing completely to
  *			  table-lookups.
@@ -37,6 +46,7 @@
 
 /* Exclusive rules when looking for a filename */
 %x yywf
+%x yywf_s
 /* Exclusive string handling */
 %x yystr
 /* Exclusive unicode string handling */
@@ -78,11 +88,16 @@
 
 %{
 
+#if !defined(YY_FLEX_MAJOR_VERSION) || (1000 * YY_FLEX_MAJOR_VERSION + YY_FLEX_MINOR_VERSION < 2005)
+#error Must use flex version 2.5.1 or higher (yy_scan_* routines are required).
+#endif
+
 /*#define LEX_DEBUG*/
 
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
+#include <ctype.h>
 
 #include <config.h>
 #include "wrc.h"
@@ -96,6 +111,9 @@
 #define YY_USE_PROTOS
 #define YY_NO_UNPUT
 
+/* Always update the current character position within a line */
+#define YY_USER_ACTION	char_number+=yyleng;
+
 raw_data_t *new_raw_data(void);
 
 void addcchar(char c);
@@ -103,8 +121,10 @@
 string_t *get_buffered_cstring(void);
 string_t *get_buffered_wstring(void);
 string_t *make_string(char *s);
+string_t *make_filename(char *s, int len);
 
-int line_number = 1;
+int line_number = 1;		/* The current line */
+int char_number = 1;		/* The current char pos within the line */
 static char cbuffer[1024];	/* Buffers for string collection */
 static int cbufidx;
 static short wbuffer[1024];
@@ -152,6 +172,7 @@
 					   or NULL if handling includes
 					 */
 	int line_number;		/* Line that we were handling */
+	int char_number;		/* The current position */
 	char *filename;			/* Filename that we were handling */
 };
 
@@ -174,7 +195,9 @@
 	{
 		/* These will track the yyerror to the correct file and line */
 		bufferstack[bufferstackidx].line_number = line_number;
+		bufferstack[bufferstackidx].char_number = char_number;
 		line_number = 1;
+		char_number = 1;
 		bufferstack[bufferstackidx].filename = input_name;
 		input_name = filename;
 	}
@@ -193,14 +216,16 @@
 	else
 	{
 		line_number = bufferstack[bufferstackidx].line_number;
+		char_number = bufferstack[bufferstackidx].char_number;
 		input_name = bufferstack[bufferstackidx].filename;
 		fclose(yyin);
 	}
 	if(yydebug)
-		printf("pop_buffer: %p %p (%d) %p\n",
+		printf("pop_buffer: %p %p (%d, %d) %p\n",
 			bufferstack[bufferstackidx].bufferstate,
 			bufferstack[bufferstackidx].define,
 			bufferstack[bufferstackidx].line_number,
+			bufferstack[bufferstackidx].char_number,
 			bufferstack[bufferstackidx].filename);
 	yy_switch_to_buffer(bufferstack[bufferstackidx].bufferstate);
 	return bufferstack[bufferstackidx].bufferstate;
@@ -400,7 +425,7 @@
 			if(YY_START == pp_def_s)
 				add_to_substtext(yytext, yyleng);
 		}
-<pp_ignore,pp_def_s>\\{ws}*\n	line_number++;	/* Line continuation */
+<pp_ignore,pp_def_s>\\{ws}*\n	line_number++;	char_number = 1; /* Line continuation */
 <pp_ignore,pp_def_s>\n		{
 			if(YY_START == pp_def_s)
 			{
@@ -409,6 +434,7 @@
 				substtext = NULL;
 			}
 			line_number++;
+			char_number = 1;
 			pop_start();
 			pop_start();
 		}
@@ -536,7 +562,7 @@
 
 <pp_stripp_final>{ws}*	; /* Ignore */
 <pp_stripp_final>;	pop_start(); /* Kill the semicolon */
-<pp_stripp_final>\n	line_number++; pop_start();
+<pp_stripp_final>\n	line_number++; char_number = 1; pop_start();
 <pp_stripp_final>.	yyless(0); pop_start();
 
 <pp_false>.		;	/* Ignore everything except #xxx during false #if state */
@@ -570,7 +596,7 @@
 					want_ident = 0;
 					yylval.str = make_string(yytext);
 				#ifdef LEX_DEBUG
-					printf("want IDENT (%s, %d): <%s>\n", input_name, line_number, yytext);
+					printf("want IDENT (%s, %d, %d): <%s>\n", input_name, line_number, char_number, yytext);
 				#endif
 					return IDENT;
 				}
@@ -583,7 +609,7 @@
 					if(!ppp->expanding)
 					{
 				#ifdef LEX_DEBUG
-						printf("expand IDENT (%s, %d): <%s>\n", input_name, line_number, yytext);
+						printf("expand IDENT (%s, %d, %d): <%s>\n", input_name, line_number, char_number, yytext);
 				#endif
 						push_buffer(YY_CURRENT_BUFFER, ppp, NULL);
 						yy_scan_string(ppp->subst);
@@ -619,10 +645,11 @@
 				{
 					yylval.str = make_string(yytext);
 				#ifdef LEX_DEBUG
-					printf("%s IDENT (%s, %d): <%s>\n",
+					printf("%s IDENT (%s, %d, %d): <%s>\n",
 						want_rscname ? "rscname" : "just",
 						input_name,
 						line_number,
+						char_number,
 						yytext);
 				#endif
 					return IDENT;
@@ -635,8 +662,10 @@
 \<\=			return LTE;
 \>\=			return GTE;
 
-<yywf>[^ \f\t\r\n]*	{ pop_start(); yylval.str = make_string(yytext); return FILENAME; }
-<yywf>\"[^\"]*\"	{ pop_start(); yylval.str = make_string(yytext); return FILENAME; }
+<yywf>[^ \f\t\r\n\"]*	{ pop_start(); yylval.str = make_filename(yytext, yyleng); return FILENAME; }
+<yywf>\"		push_to(yywf_s);
+<yywf_s>[^\"\n]*\"	{ pop_start(); pop_start(); yylval.str = make_filename(yytext, yyleng-1); return FILENAME; }
+<yywf_s>\n		yyerror("Newline in filename");
 
 L\"			{
 				push_to(yylstr);
@@ -739,7 +768,7 @@
 <INITIAL,pp_ignore,pp_def_s>"/*"	push_to(comment);	/* Eat comment */
 <comment>[^*\n]*	;
 <comment>"*"+[^*/\n]*	;
-<comment>\n		line_number++;
+<comment>\n		line_number++; char_number = 1;
 <comment>"*"+"/"	pop_start();
 
 ;[^\n]*			; /* Eat comment */
@@ -749,6 +778,7 @@
 				if(YY_START == yywf)
 					pop_start();
 				line_number++;
+				char_number = 1;
 				if(want_nl)
 				{
 					want_nl = 0;
@@ -830,6 +860,37 @@
 	return str;
 }
 
+string_t *make_filename(char *s, int len)
+{
+	char *cptr;
+	string_t *str = new_string();
+
+	str->size = len;
+	str->type = str_char;
+	str->str.cstr = (char *)xmalloc(str->size+1);
+	memcpy(str->str.cstr, s, str->size);
+	str->str.cstr[str->size] = '\0';
+
+	/* Remove escaped backslash and convert to forward */
+	cptr = str->str.cstr;
+	for(cptr = str->str.cstr; (cptr = strchr(cptr, '\\')) != NULL; cptr++)
+	{
+		if(cptr[1] == '\\')
+		{
+			memmove(cptr, cptr+1, strlen(cptr));
+			str->size--;
+		}
+		*cptr = '/';
+	}
+
+	/* Convert to lower case. Seems to be reasonable to do */
+	for(cptr = str->str.cstr; !leave_case && *cptr; cptr++)
+	{
+		*cptr = tolower(*cptr);
+	}
+	return str;
+}
+
 /* Called from the parser to signal filename request */
 void set_yywf(void)
 {
diff --git a/tools/wrc/parser.y b/tools/wrc/parser.y
index 6186da9..494d006 100644
--- a/tools/wrc/parser.y
+++ b/tools/wrc/parser.y
@@ -3,6 +3,12 @@
  * Copyright  Martin von Loewis, 1994
  * Copyright 1998 Bertho A. Stultiens (BS)
  *
+ * 20-Jun-1998 BS	- Fixed a bug in load_file() where the name was not
+ *			  printed out correctly.
+ *
+ * 17-Jun-1998 BS	- Fixed a bug in CLASS statement parsing which should
+ *			  also accept a tSTRING as argument.
+ *
  * 25-May-1998 BS	- Found out that I need to support language, version
  *			  and characteristics in inline resources (bitmap,
  *			  cursor, etc) but they can also be specified with
@@ -250,7 +256,7 @@
 %type <msg> 	messagetable
 %type <usr> 	userres
 %type <num> 	item_options
-%type <nid> 	nameid ctlclass usertype
+%type <nid> 	nameid nameid_s ctlclass usertype
 %type <num> 	acc_opt
 %type <iptr>	loadmemopts lamo lama
 %type <fntid>	opt_font opt_exfont
@@ -394,11 +400,8 @@
 		}
 	;
 
-/* FIXME:
- * The problem here is that MENU MENU {...} is a valid (!) resource.
- * The name-identifier is "MENU". We cannot parse this without generating
- * an error. It would mean that a list of keywords must be added here
- * and converted into a valid name_id_t structure.
+/*
+ * Get a valid name/id
  */
 nameid	: expr	{
 		$$ = new_name_id();
@@ -414,6 +417,18 @@
 		}
 	;
 
+/*
+ * Extra string recognition for CLASS statement in dialogs
+ */
+nameid_s: nameid	{ $$ = $1; }
+	| tSTRING	{
+		$$ = new_name_id();
+		$$->type = name_str;
+		$$->name.s_name = $1;
+		want_rscname = 0;
+		}
+	;
+
 /* get the value for a single resource*/
 resource_definition
 	: accelerators	{ $$ = new_resource(res_acc, $1, $1->memopt, $1->lvc.language); }
@@ -631,7 +646,7 @@
 	| dlg_attributes EXSTYLE expr	{ $$=dialog_exstyle($3,$1); }
 	| dlg_attributes CAPTION tSTRING { $$=dialog_caption($3,$1); }
 	| dlg_attributes opt_font	{ $$=dialog_font($2,$1); }
-	| dlg_attributes CLASS nameid	{ $$=dialog_class($3,$1); }
+	| dlg_attributes CLASS nameid_s	{ $$=dialog_class($3,$1); }
 	| dlg_attributes MENU nameid	{ $$=dialog_menu($3,$1); }
 	| dlg_attributes opt_language	{ $$=dialog_language($2,$1); }
 	| dlg_attributes opt_characts	{ $$=dialog_characteristics($2,$1); }
@@ -823,7 +838,7 @@
 	| dlgex_attribs EXSTYLE expr	{ $$=dialogex_exstyle($3,$1); }
 	| dlgex_attribs CAPTION tSTRING { $$=dialogex_caption($3,$1); }
 	| dlgex_attribs opt_exfont	{ $$=dialogex_font($2,$1); }
-	| dlgex_attribs CLASS nameid	{ $$=dialogex_class($3,$1); }
+	| dlgex_attribs CLASS nameid_s	{ $$=dialogex_class($3,$1); }
 	| dlgex_attribs MENU nameid	{ $$=dialogex_menu($3,$1); }
 	| dlgex_attribs opt_language	{ $$=dialogex_language($2,$1); }
 	| dlgex_attribs opt_characts	{ $$=dialogex_characteristics($2,$1); }
@@ -1838,10 +1853,14 @@
 	if(key->type != str_char)
 		yyerror("Key code must be an ascii string");
 
-	if((flags & WRC_AF_VIRTKEY) && (!isupper(key->str.cstr[0]) || !isdigit(key->str.cstr[0])))
+	if((flags & WRC_AF_VIRTKEY) && (!isupper(key->str.cstr[0]) && !isdigit(key->str.cstr[0])))
 		yyerror("VIRTKEY code is not equal to ascii value");
 
-	if(key->str.cstr[0] == '^')
+	if(key->str.cstr[0] == '^' && (flags & WRC_AF_CONTROL) != 0)
+	{
+		yyerror("Cannot use both '^' and CONTROL modifier");
+	}
+	else if(key->str.cstr[0] == '^')
 	{
 		keycode = toupper(key->str.cstr[1]) - '@';
 		if(keycode >= ' ')
@@ -1879,7 +1898,7 @@
 		
 	fp = fopen(name->str.cstr, "rb");
 	if(!fp)
-		yyerror("Cannot open file %s", name);
+		yyerror("Cannot open file %s", name->str.cstr);
 	rd = new_raw_data();
 	fseek(fp, 0, SEEK_END);
 	rd->size = ftell(fp);
@@ -2175,6 +2194,7 @@
 	{
 		ico = new_icon();
 		ico->id = alloc_icon_id();
+		ico->lvc.language = dup_language(icog->lvc.language);
 		if(ide[i].offset > rd->size
 		|| ide[i].offset + ide[i].ressize > rd->size)
 			yyerror("Icon resource data corrupt");
@@ -2227,6 +2247,7 @@
 	{
 		cur = new_cursor();
 		cur->id = alloc_cursor_id();
+		cur->lvc.language = dup_language(curg->lvc.language);
 		if(cde[i].offset > rd->size
 		|| cde[i].offset + cde[i].ressize > rd->size)
 			yyerror("Cursor resource data corrupt");
diff --git a/tools/wrc/utils.c b/tools/wrc/utils.c
index 1cb8ab8..7d1b67e 100644
--- a/tools/wrc/utils.c
+++ b/tools/wrc/utils.c
@@ -15,11 +15,10 @@
 #include <config.h>
 #include "wrc.h"
 #include "utils.h"
+#include "parser.h"
 
 #define WANT_NEAR_INDICATION
 
-extern int line_number;
-extern char* yytext;
 
 #ifdef WANT_NEAR_INDICATION
 void make_print(char *str)
@@ -37,7 +36,7 @@
 {
 	va_list ap;
 	va_start(ap, s);
-	fprintf(stderr, "Error %s: %d: ", input_name ? input_name : "stdin", line_number);
+	fprintf(stderr, "Error %s: %d, %d: ", input_name ? input_name : "stdin", line_number, char_number);
 	vfprintf(stderr, s, ap);
 #ifdef WANT_NEAR_INDICATION
 	{
@@ -47,7 +46,7 @@
 		free(cpy);
 	}
 #else
-	fprintf(stderr, "\n", yytext);
+	fprintf(stderr, "\n");
 #endif
 	va_end(ap);
 	exit(1);
@@ -58,7 +57,7 @@
 {
 	va_list ap;
 	va_start(ap, s);
-	fprintf(stderr, "Warning %s:%d: ", input_name ? input_name : "stdin", line_number);
+	fprintf(stderr, "Warning %s: %d, %d: ", input_name ? input_name : "stdin", line_number, char_number);
 	vfprintf(stderr, s, ap);
 #ifdef WANT_NEAR_INDICATION
 	{
@@ -68,7 +67,7 @@
 		free(cpy);
 	}
 #else
-	fprintf(stderr, "\n", yytext);
+	fprintf(stderr, "\n");
 #endif
 	va_end(ap);
 	return 0;
@@ -189,7 +188,7 @@
 	}
 	else
 	{
-		error("Cannot yet compare unicode strings");
+		internal_error(__FILE__, __LINE__, "Cannot yet compare unicode strings");
 	}
 	return 0;
 }
@@ -217,7 +216,7 @@
 	int retval = stricmp(cs1, cs2);
 	free(cs1);
 	free(cs2);
-	warning("Comparing unicode strings -> converting to ascii");
+	warning("Comparing unicode strings without case -> converting to ascii");
 	return retval;;
 }
 
diff --git a/tools/wrc/wrc.c b/tools/wrc/wrc.c
index 6ffcd29..f9e1c6c 100644
--- a/tools/wrc/wrc.c
+++ b/tools/wrc/wrc.c
@@ -3,6 +3,12 @@
  * Copyright  Martin von Loewis, 1994
  * Copyrignt 1998 Bertho A. Stultiens (BS)
  *
+ * 20-Jun-1998 BS	- Added -L option to prevent case conversion
+ *			  of embedded filenames.
+ *
+ * 08-Jun-1998 BS	- Added -A option to generate autoregister code
+ *			  for winelib operation.
+ *
  * 21-May-1998 BS	- Removed the CPP option. Its internal now.
  *			- Added implementations for defines and includes
  *			  on the commandline.
@@ -58,6 +64,7 @@
 	"   -H file     Same as -h but written to file\n"
 	"   -I path     Set include search dir to path (multiple -I allowed)\n"
 	"   -l lan      Set default language to lan (default is neutral {0})\n"
+	"   -L          Leave case of embedded filenames as is\n"
 	"   -n          Do not generate .s file\n"
 	"   -o file     Output to file (default is infile.[res|s|h]\n"
 	"   -p prefix   Give a prefix for the generated names\n"
@@ -106,9 +113,6 @@
 
 /*
  * Create a .res file from the source and exit (-r option).
- * The compiler actually always creates this file, and then
- * converts it into whatever is requested. The compiler just
- * stops after the res-file when create_res is set.
  */
 int create_res = 0;
 
@@ -188,6 +192,12 @@
  */
 int auto_register = 0;
 
+/*
+ * Set when the case of embedded filenames should not be converted
+ * to lower case (-L option)
+ */
+int leave_case = 0;
+
 char *output_name;		/* The name given by the -o option */
 char *input_name;		/* The name given on the command-line */
 char *header_name;		/* The name given by the -H option */
@@ -223,7 +233,7 @@
 			strcat(cmdline, " ");
 	}
 
-	while((optc = getopt(argc, argv, "a:AbcC:d:D:eghH:I:l:no:p:rstTVw:W")) != EOF)
+	while((optc = getopt(argc, argv, "a:AbcC:d:D:eghH:I:l:Lno:p:rstTVw:W")) != EOF)
 	{
 		switch(optc)
 		{
@@ -270,6 +280,9 @@
 				currentlanguage = new_language(PRIMARYLANGID(lan), SUBLANGID(lan));
 			}
 			break;
+		case 'L':
+			leave_case = 1;
+			break;
 		case 'n':
 			create_s = 0;
 			break;
diff --git a/tools/wrc/wrc.h b/tools/wrc/wrc.h
index b3d8ef6..371b965 100644
--- a/tools/wrc/wrc.h
+++ b/tools/wrc/wrc.h
@@ -12,8 +12,8 @@
 #include "wrctypes.h"
 #endif
 
-#define WRC_VERSION	"1.0.1"
-#define WRC_RELEASEDATE	"(08-Jun-1998)"
+#define WRC_VERSION	"1.0.2"
+#define WRC_RELEASEDATE	"(20-Jun-1998)"
 #define WRC_FULLVERSION WRC_VERSION " " WRC_RELEASEDATE
 
 /* Only used in heavy debugging sessions */
@@ -77,6 +77,7 @@
 extern DWORD codepage;
 extern int pedantic;
 extern int auto_register;
+extern int leave_case;
 
 extern char *prefix;
 extern char *output_name;
diff --git a/tools/wrc/wrctypes.h b/tools/wrc/wrctypes.h
index 00075de..eebdb56 100644
--- a/tools/wrc/wrctypes.h
+++ b/tools/wrc/wrctypes.h
@@ -239,7 +239,7 @@
 } font_t;
 
 typedef struct icon_dir_entry {
-    BYTE  width;	/* From the SKD doc. */
+    BYTE  width;	/* From the SDK doc. */
     BYTE  height;
     BYTE  nclr;
     BYTE  reserved;
@@ -252,6 +252,7 @@
 typedef struct icon {
 	struct icon	*next;
 	struct icon	*prev;
+	lvc_t		lvc;
 	int		id;	/* Unique icon id within resource file */
 	int		width;	/* Field from the IconDirEntry */
 	int		height;
@@ -263,12 +264,13 @@
 
 typedef struct icon_group {
 	DWORD		memopt;
+	lvc_t		lvc;
 	icon_t		*iconlist;
 	int		nicon;
 } icon_group_t;
 
 typedef struct cursor_dir_entry {
-    BYTE  width;	/* From the SKD doc. */
+    BYTE  width;	/* From the SDK doc. */
     BYTE  height;
     BYTE  nclr;
     BYTE  reserved;
@@ -281,6 +283,7 @@
 typedef struct cursor {
 	struct cursor	*next;
 	struct cursor	*prev;
+	lvc_t		lvc;
 	int		id;	/* Unique icon id within resource file */
 	int		width;	/* Field from the CursorDirEntry */
 	int		height;
@@ -294,6 +297,7 @@
 
 typedef struct cursor_group {
 	DWORD		memopt;
+	lvc_t		lvc;
 	cursor_t	*cursorlist;
 	int		ncursor;
 } cursor_group_t;
diff --git a/tools/wrc/writeres.c b/tools/wrc/writeres.c
index bd2fa36..ef17613 100644
--- a/tools/wrc/writeres.c
+++ b/tools/wrc/writeres.c
@@ -932,7 +932,8 @@
 	}
 
 	now = time(NULL);
-	fprintf(fo, s_file_head_str, input_name, cmdline, ctime(&now));
+	fprintf(fo, s_file_head_str, input_name ? input_name : "stdin",
+                cmdline, ctime(&now));
 
 	/* Get an idea how many we have and restructure the tables */
 	count_resources(top);
@@ -1084,7 +1085,8 @@
 	}
 
 	time(&now);
-	fprintf(fo, h_file_head_str, input_name, cmdline, ctime(&now), now, now);
+	fprintf(fo, h_file_head_str, input_name ? input_name : "stdin",
+                cmdline, ctime(&now), now, now);
 
 	/* First write the segment tables reference */
 	if(create_dir)
diff --git a/win32/device.c b/win32/device.c
index 528d36a..052e472 100644
--- a/win32/device.c
+++ b/win32/device.c
@@ -22,6 +22,7 @@
 #include "mmsystem.h"
 #include "heap.h"
 #include "debug.h"
+#include "winioctl.h"
 
 void DEVICE_Destroy(K32OBJ *dev);
 const K32OBJ_OPS DEVICE_Ops =
@@ -71,6 +72,12 @@
 
 /****************************************************************************
  *		DeviceIoControl (KERNEL32.188)
+ * This is one of those big ugly nasty procedure which can do
+ * a million and one things when it comes to devices. It can also be
+ * used for VxD communication.
+ *
+ * A return value of FALSE indicates that something has gone wrong which
+ * GetLastError can decypher.
  */
 BOOL32 WINAPI DeviceIoControl(HANDLE32 hDevice, DWORD dwIoControlCode, 
 			      LPVOID lpvlnBuffer, DWORD cblnBuffer,
@@ -85,12 +92,23 @@
 		hDevice,dwIoControlCode,lpvlnBuffer,cblnBuffer,
 		lpvOutBuffer,cbOutBuffer,lpcbBytesReturned,lpOverlapped
 	);
+
 	if (!dev)
+	{
+		SetLastError( ERROR_INVALID_PARAMETER );
 		return FALSE;
-	/* FIXME: Set appropriate error */
-	FIXME(win32,"	device %s\n",dev->devname);
-	if (!strcmp(dev->devname,"VTDAPI")) {
-		switch (dwIoControlCode) {
+	}
+
+	/* Check if this is a user defined control code for a VxD */
+        if( HIWORD( dwIoControlCode ) == 0 )
+        {
+	    /* FIXME: Set appropriate error */
+	    FIXME(win32," VxD device %s msg\n",dev->devname);
+ 
+	    if (!strcmp(dev->devname,"VTDAPI"))
+            {
+		switch (dwIoControlCode)
+                {
 		case 5:	if (lpvOutBuffer && (cbOutBuffer>=4))
 				*(DWORD*)lpvOutBuffer = timeGetTime();
 			if (lpcbBytesReturned)
@@ -99,7 +117,54 @@
 		default:
 			break;
 		}
+	
+           }
 	}
-	FIXME(win32,"	(unhandled)\n");
-	return FALSE;
+	else
+	{
+		switch( dwIoControlCode )
+		{
+		case FSCTL_DELETE_REPARSE_POINT:
+		case FSCTL_DISMOUNT_VOLUME:
+		case FSCTL_GET_COMPRESSION:
+		case FSCTL_GET_REPARSE_POINT:
+		case FSCTL_LOCK_VOLUME:
+		case FSCTL_QUERY_ALLOCATED_RANGES:
+		case FSCTL_SET_COMPRESSION:
+		case FSCTL_SET_REPARSE_POINT:
+		case FSCTL_SET_SPARSE:
+		case FSCTL_SET_ZERO_DATA:
+		case FSCTL_UNLOCK_VOLUME:
+		case IOCTL_DISK_CHECK_VERIFY:
+		case IOCTL_DISK_EJECT_MEDIA:
+		case IOCTL_DISK_FORMAT_TRACKS:
+		case IOCTL_DISK_GET_DRIVE_GEOMETRY:
+		case IOCTL_DISK_GET_DRIVE_LAYOUT:
+		case IOCTL_DISK_GET_MEDIA_TYPES:
+		case IOCTL_DISK_GET_PARTITION_INFO:
+		case IOCTL_DISK_LOAD_MEDIA:
+		case IOCTL_DISK_MEDIA_REMOVAL:
+		case IOCTL_DISK_PERFORMANCE:
+		case IOCTL_DISK_REASSIGN_BLOCKS:
+		case IOCTL_DISK_SET_DRIVE_LAYOUT:
+		case IOCTL_DISK_SET_PARTITION_INFO:
+		case IOCTL_DISK_VERIFY:
+		case IOCTL_SERIAL_LSRMST_INSERT:
+		case IOCTL_STORAGE_CHECK_VERIFY:
+		case IOCTL_STORAGE_EJECT_MEDIA:
+		case IOCTL_STORAGE_GET_MEDIA_TYPES:
+		case IOCTL_STORAGE_LOAD_MEDIA:
+		case IOCTL_STORAGE_MEDIA_REMOVAL:
+    			FIXME( win32, "unimplemented dwIoControlCode=%08lx\n", dwIoControlCode);
+    			SetLastError( ERROR_CALL_NOT_IMPLEMENTED );
+    			return FALSE;
+    			break;
+		default:
+    			FIXME( win32, "ignored dwIoControlCode=%08lx\n",dwIoControlCode);
+    			SetLastError( ERROR_CALL_NOT_IMPLEMENTED );
+    			return FALSE;
+    			break;
+		}
+	}
+   	return FALSE;
 }
diff --git a/win32/file.c b/win32/file.c
index cba870f..3d24640 100644
--- a/win32/file.c
+++ b/win32/file.c
@@ -97,7 +97,29 @@
 
 
 /*************************************************************************
- *              CreateFile32A              (KERNEL32.45)
+ * CreateFile32A [KERNEL32.45]  Creates or opens a file or other object
+ *
+ * Creates or opens an object, and returns a handle that can be used to
+ * access that object.
+ *
+ * PARAMS
+ *
+ * filename	[I] pointer to filename to be accessed
+ * access	[I] access mode requested
+ * sharing	[I] share mode
+ * security	[I] pointer to security attributes
+ * creation	[I] ?
+ * attributes	[I] ?
+ * template	[I] handle to file with attributes to copy
+ *
+ * RETURNS
+ *   Success: Open handle to specified file
+ *   Failure: INVALID_HANDLE_VALUE
+ *
+ * NOTES
+ *  Should call SetLastError() on failure.
+ *
+ * BUGS
  *
  * Doesn't support character devices, pipes, template files, or a
  * lot of the 'attributes' flags yet.
diff --git a/win32/ordinals.c b/win32/ordinals.c
index 481fa08..a1077a6 100644
--- a/win32/ordinals.c
+++ b/win32/ordinals.c
@@ -101,7 +101,6 @@
  *           GetProcessDword    (KERNEL32.18)
  * 'Of course you cannot directly access Windows internal structures'
  */
-
 DWORD WINAPI GetProcessDword(DWORD processid,DWORD action)
 {
 	PDB32	*process = processid? PROCESS_IdToPDB( processid )
@@ -171,7 +170,6 @@
 	/* shouldn't come here */
 }
 
-
 /***********************************************************************
  *		GetWin16DOSEnv			(KERNEL32.34)
  * Returns some internal value.... probably the default environment database?
diff --git a/windows/driver.c b/windows/driver.c
index f62b3f1..e38fecf 100644
--- a/windows/driver.c
+++ b/windows/driver.c
@@ -12,6 +12,7 @@
 #include "driver.h"
 #include "module.h"
 #include "debug.h"
+#include <string.h>
 
 LPDRIVERITEM lpDrvItemList = NULL;
 LPDRIVERITEM32A lpDrvItemList32 = NULL;
@@ -121,7 +122,7 @@
     lpdrv = lpDrvItemList;
     while (lpdrv)			/* XXX find it... like this? */
     {
-	if (!lstrcmpi32A( lpDriverName, lpdrv->dis.szAliasName ))
+	if (!strcasecmp( lpDriverName, lpdrv->dis.szAliasName ))
 	{
 	    lpdrv->count++;
 	    SendDriverMessage16( lpdrv->dis.hDriver, DRV_OPEN, 0L, lParam );
@@ -205,7 +206,7 @@
 
     lpdrv = lpDrvItemList32;
     while (lpdrv) {
-	if (!lstrcmpi32A( lpDriverName, lpdrv->dis.szAliasName )) {
+	if (!strcasecmp( lpDriverName, lpdrv->dis.szAliasName )) {
 	    lpdrv->count++;
 	    lpdrv->dis.hDriver = SendDriverMessage32( lpdrv->dis.hDriver, DRV_OPEN, ""/*FIXME*/, 0L );
 	    return (HDRVR32)lpdrv;
diff --git a/windows/nonclient.c b/windows/nonclient.c
index 521c0b1..f9917ee 100644
--- a/windows/nonclient.c
+++ b/windows/nonclient.c
@@ -36,6 +36,7 @@
 HBRUSH32  NC_WinShadow95;
 
 static HBITMAP16 hbitmapClose = 0;
+static HBITMAP16 hbitmapCloseD = 0;
 static HBITMAP16 hbitmapMinimize = 0;
 static HBITMAP16 hbitmapMinimizeD = 0;
 static HBITMAP16 hbitmapMaximize = 0;
@@ -54,6 +55,15 @@
     (((style) & WS_THICKFRAME) && \
      !(((style) & (WS_DLGFRAME|WS_BORDER)) == WS_DLGFRAME))
 
+#define HAS_FIXEDFRAME(style,exStyle) \
+   (((((exStyle) & WS_EX_DLGMODALFRAME) || \
+      ((style) & WS_DLGFRAME)) && ((style) & WS_BORDER)) && \
+     !((style) & WS_THICKFRAME))
+
+#define HAS_SIZEFRAME(style) \
+    (((style) & WS_THICKFRAME) && \
+     !(((style) & (WS_DLGFRAME|WS_BORDER)) == WS_DLGFRAME))
+
 #define HAS_MENU(w)  (!((w)->dwStyle & WS_CHILD) && ((w)->wIDmenu != 0))
 
 #define ON_LEFT_BORDER(hit) \
@@ -113,29 +123,34 @@
 
 
 /******************************************************************************
+ * NC_AdjustRectOuter95
  *
- *   NC_AdjustRect95(
- *      LPRECT16  rect,
- *      DWORD  style,
- *      BOOL32  menu,
- *      DWORD  exStyle )
+ * Computes the size of the "outside" parts of the window based on the
+ * parameters of the client area.
  *
- *   Computes the size of the window based on the parameters of the client
- *   area.
+ + PARAMS
+ *     LPRECT16  rect
+ *     DWORD  style
+ *     BOOL32  menu
+ *     DWORD  exStyle
  *
- *   Bugs
- *        Most of this code is copied from NC_AdjustRect.  It shouldn't be.
- *        There are some unique things about Win 95 that are being horribly
- *        neglected here.  I don't know what they are, either.  :-\
+ * NOTES
+ *     "Outer" parts of a window means the whole window frame, caption and
+ *     menu bar. It does not include "inner" parts of the frame like client
+ *     edge, static edge or scroll bars.
  *
- *   Revision history
- *        05-Jul-1997 Dave Cuthbert (dacut@ece.cmu.edu)
- *             Original cut & paste from NC_AdjustRect
+ * Revision history
+ *     05-Jul-1997 Dave Cuthbert (dacut@ece.cmu.edu)
+ *        Original (NC_AdjustRect95) cut & paste from NC_AdjustRect
+ *
+ *     20-Jun-1998 Eric Kohl (ekohl@abo.rhein-zeitung.de)
+ *        Split NC_AdjustRect95 into NC_AdjustRectOuter95 and
+ *        NC_AdjustRectInner95 and added handling of Win95 styles.
  *
  *****************************************************************************/
 
-static void NC_AdjustRect95( LPRECT16 rect, DWORD style, BOOL32 menu,
-			     DWORD exStyle )
+static void
+NC_AdjustRectOuter95 (LPRECT16 rect, DWORD style, BOOL32 menu, DWORD exStyle)
 {
     if(style & WS_ICONIC) return;
 
@@ -144,21 +159,67 @@
           ((style & (WS_DLGFRAME | WS_THICKFRAME)) ||
            (exStyle & WS_EX_DLGMODALFRAME))))
     {
-        if (HAS_DLGFRAME( style, exStyle ))
+        if (HAS_FIXEDFRAME( style, exStyle ))
             InflateRect16(rect, SYSMETRICS_CXDLGFRAME, SYSMETRICS_CYDLGFRAME );
         else
         {
-            if (HAS_THICKFRAME(style))
+            if (HAS_SIZEFRAME(style))
                 InflateRect16( rect, SYSMETRICS_CXFRAME, SYSMETRICS_CYFRAME );
+#if 0
             if (style & WS_BORDER)
                 InflateRect16( rect, SYSMETRICS_CXBORDER, SYSMETRICS_CYBORDER);
+#endif
         }
 
         if ((style & WS_CAPTION) == WS_CAPTION)
-            rect->top -= SYSMETRICS_CYCAPTION - SYSMETRICS_CYBORDER;
+	    if (exStyle & WS_EX_TOOLWINDOW)
+		rect->top -= SYSMETRICS_CYSMCAPTION;
+	    else
+		rect->top -= SYSMETRICS_CYCAPTION;
+//            rect->top -= sysMetrics[SM_CYCAPTION];
     }
-    if (menu) rect->top -= SYSMETRICS_CYMENU + SYSMETRICS_CYBORDER + 2;
-    else if (!(style & WS_CHILD)) rect->top += SYSMETRICS_CYBORDER;
+
+    if (menu)
+	rect->top -= sysMetrics[SM_CYMENU];
+}
+
+
+/******************************************************************************
+ * NC_AdjustRectInner95
+ *
+ * Computes the size of the "inside" part of the window based on the
+ * parameters of the client area.
+ *
+ + PARAMS
+ *     LPRECT16 rect
+ *     DWORD    style
+ *     DWORD    exStyle
+ *
+ * NOTES
+ *     "Inner" part of a window means the window frame inside of the flat
+ *     window frame. It includes the client edge, the static edge and the
+ *     scroll bars.
+ *
+ * Revision history
+ *     05-Jul-1997 Dave Cuthbert (dacut@ece.cmu.edu)
+ *        Original (NC_AdjustRect95) cut & paste from NC_AdjustRect
+ *
+ *     20-Jun-1998 Eric Kohl (ekohl@abo.rhein-zeitung.de)
+ *        Split NC_AdjustRect95 into NC_AdjustRectOuter95 and
+ *        NC_AdjustRectInner95 and added handling of Win95 styles.
+ *
+ *****************************************************************************/
+
+static void
+NC_AdjustRectInner95 (LPRECT16 rect, DWORD style, DWORD exStyle)
+{
+    if(style & WS_ICONIC) return;
+
+    if (exStyle & WS_EX_CLIENTEDGE)
+	InflateRect16 (rect, sysMetrics[SM_CXEDGE], sysMetrics[SM_CYEDGE]);
+
+    if (exStyle & WS_EX_STATICEDGE)
+	InflateRect16 (rect, sysMetrics[SM_CXBORDER], sysMetrics[SM_CYBORDER]);
 
     if (style & WS_VSCROLL) rect->right  += SYSMETRICS_CXVSCROLL;
     if (style & WS_HSCROLL) rect->bottom += SYSMETRICS_CYHSCROLL;
@@ -206,15 +267,18 @@
     if (!(style & (WS_POPUP | WS_CHILD)))  /* Overlapped window */
 	style |= WS_CAPTION;
     style &= (WS_DLGFRAME | WS_BORDER | WS_THICKFRAME | WS_CHILD);
-    exStyle &= (WS_EX_DLGMODALFRAME | WS_EX_CLIENTEDGE);
+    exStyle &= (WS_EX_DLGMODALFRAME | WS_EX_CLIENTEDGE |
+		WS_EX_STATICEDGE | WS_EX_TOOLWINDOW);
     if (exStyle & WS_EX_DLGMODALFRAME) style &= ~WS_THICKFRAME;
 
     TRACE(nonclient, "(%d,%d)-(%d,%d) %08lx %d %08lx\n",
                       rect->left, rect->top, rect->right, rect->bottom,
                       style, menu, exStyle );
 
-    if(TWEAK_Win95Look)
-	NC_AdjustRect95( rect, style, menu, exStyle );
+    if(TWEAK_Win95Look) {
+	NC_AdjustRectOuter95( rect, style, menu, exStyle );
+	NC_AdjustRectInner95( rect, style, exStyle );
+    }
     else
 	NC_AdjustRect( rect, style, menu, exStyle );
 
@@ -253,7 +317,7 @@
 
     if( !( pWnd->dwStyle & WS_MINIMIZE ) ) {
 	if(TWEAK_Win95Look)
-	    NC_AdjustRect95( &tmpRect, pWnd->dwStyle, FALSE, pWnd->dwExStyle );
+	    NC_AdjustRectOuter95( &tmpRect, pWnd->dwStyle, FALSE, pWnd->dwExStyle );
 	else
 	    NC_AdjustRect( &tmpRect, pWnd->dwStyle, FALSE, pWnd->dwExStyle );
 
@@ -274,6 +338,15 @@
 				       winRect->right - winRect->left,
 				       -tmpRect.left, -tmpRect.top ) + 1;
 	}
+
+	if (TWEAK_Win95Look) {
+	    SetRect16 (&tmpRect, 0, 0, 0, 0);
+	    NC_AdjustRectInner95 (&tmpRect, pWnd->dwStyle, pWnd->dwExStyle);
+	    winRect->left   -= tmpRect.left;
+	    winRect->top    -= tmpRect.top;
+	    winRect->right  -= tmpRect.right;
+	    winRect->bottom -= tmpRect.bottom;
+	}
     }
     return result;
 }
@@ -335,16 +408,24 @@
     if ((wndPtr->dwStyle & WS_ICONIC) || (wndPtr->flags & WIN_MANAGED)) return;
 
       /* Remove frame from rectangle */
-    if (HAS_DLGFRAME (wndPtr->dwStyle, wndPtr->dwExStyle ))
+    if (HAS_FIXEDFRAME (wndPtr->dwStyle, wndPtr->dwExStyle ))
     {
 	InflateRect32( rect, -SYSMETRICS_CXFIXEDFRAME, -SYSMETRICS_CYFIXEDFRAME);
     }
-    else if (HAS_THICKFRAME (wndPtr->dwStyle))
+    else if (HAS_SIZEFRAME (wndPtr->dwStyle))
     {
 	InflateRect32( rect, -SYSMETRICS_CXSIZEFRAME, -SYSMETRICS_CYSIZEFRAME );
 
-	if (wndPtr->dwStyle & WS_BORDER)
-	    InflateRect32( rect, -SYSMETRICS_CXBORDER, -SYSMETRICS_CYBORDER );
+/*	if (wndPtr->dwStyle & WS_BORDER)
+          InflateRect32( rect, -SYSMETRICS_CXBORDER, -SYSMETRICS_CYBORDER );*/
+    }
+
+    if (wndPtr->dwStyle & WS_CHILD) {
+	if (wndPtr->dwExStyle & WS_EX_CLIENTEDGE)
+	    InflateRect32 (rect, -SYSMETRICS_CXEDGE, -SYSMETRICS_CYEDGE);
+
+	if (wndPtr->dwExStyle & WS_EX_STATICEDGE)
+	    InflateRect32 (rect, -SYSMETRICS_CXBORDER, -SYSMETRICS_CYBORDER);
     }
 
     return;
@@ -352,22 +433,19 @@
 
 
 /***********************************************************************
- *           NC_HandleNCHitTest
+ * NC_DoNCHitTest
  *
- * Handle a WM_NCHITTEST message. Called from DefWindowProc().
- *
- * FIXME:  A Win95 version of this function is needed.
+ * Handle a WM_NCHITTEST message. Called from NC_HandleNcHitTest().
  */
-LONG NC_HandleNCHitTest( HWND32 hwnd, POINT16 pt )
+
+LONG NC_DoNCHitTest (WND *wndPtr, POINT16 pt )
 {
     RECT16 rect;
-    WND *wndPtr = WIN_FindWndPtr( hwnd );
-    if (!wndPtr) return HTERROR;
 
     TRACE(nonclient, "hwnd=%04x pt=%d,%d\n",
-		      hwnd, pt.x, pt.y );
+		      wndPtr->hwndSelf, pt.x, pt.y );
 
-    GetWindowRect16( hwnd, &rect );
+    GetWindowRect16 (wndPtr->hwndSelf, &rect );
     if (!PtInRect16( &rect, pt )) return HTNOWHERE;
 
     if (wndPtr->dwStyle & WS_MINIMIZE) return HTCAPTION;
@@ -425,7 +503,7 @@
 
         if ((wndPtr->dwStyle & WS_CAPTION) == WS_CAPTION)
         {
-            rect.top += SYSMETRICS_CYCAPTION - 1;
+            rect.top += sysMetrics[SM_CYCAPTION] - 1;
             if (!PtInRect16( &rect, pt ))
             {
                 /* Check system menu */
@@ -447,8 +525,8 @@
 
       /* Check client area */
 
-    ScreenToClient16( hwnd, &pt );
-    GetClientRect16( hwnd, &rect );
+    ScreenToClient16( wndPtr->hwndSelf, &pt );
+    GetClientRect16( wndPtr->hwndSelf, &rect );
     if (PtInRect16( &rect, pt )) return HTCLIENT;
 
       /* Check vertical scroll bar */
@@ -488,6 +566,173 @@
 
 
 /***********************************************************************
+ * NC_DoNCHitTest95
+ *
+ * Handle a WM_NCHITTEST message. Called from NC_HandleNCHitTest().
+ *
+ * FIXME:  Just a copy of the Win 3.1 version.
+ */
+
+LONG
+NC_DoNCHitTest95 (WND *wndPtr, POINT16 pt )
+{
+    RECT16 rect;
+
+    TRACE(nonclient, "hwnd=%04x pt=%d,%d\n",
+		      wndPtr->hwndSelf, pt.x, pt.y );
+
+    GetWindowRect16 (wndPtr->hwndSelf, &rect );
+    if (!PtInRect16( &rect, pt )) return HTNOWHERE;
+
+    if (wndPtr->dwStyle & WS_MINIMIZE) return HTCAPTION;
+
+    if (!(wndPtr->flags & WIN_MANAGED))
+    {
+        /* Check borders */
+        if (HAS_SIZEFRAME( wndPtr->dwStyle ))
+        {
+            InflateRect16( &rect, -SYSMETRICS_CXFRAME, -SYSMETRICS_CYFRAME );
+//            if (wndPtr->dwStyle & WS_BORDER)
+//                InflateRect16(&rect,-SYSMETRICS_CXBORDER,-SYSMETRICS_CYBORDER);
+            if (!PtInRect16( &rect, pt ))
+            {
+                /* Check top sizing border */
+                if (pt.y < rect.top)
+                {
+                    if (pt.x < rect.left+SYSMETRICS_CXSIZE) return HTTOPLEFT;
+                    if (pt.x >= rect.right-SYSMETRICS_CXSIZE) return HTTOPRIGHT;
+                    return HTTOP;
+                }
+                /* Check bottom sizing border */
+                if (pt.y >= rect.bottom)
+                {
+                    if (pt.x < rect.left+SYSMETRICS_CXSIZE) return HTBOTTOMLEFT;
+                    if (pt.x >= rect.right-SYSMETRICS_CXSIZE) return HTBOTTOMRIGHT;
+                    return HTBOTTOM;
+                }
+                /* Check left sizing border */
+                if (pt.x < rect.left)
+                {
+                    if (pt.y < rect.top+SYSMETRICS_CYSIZE) return HTTOPLEFT;
+                    if (pt.y >= rect.bottom-SYSMETRICS_CYSIZE) return HTBOTTOMLEFT;
+                    return HTLEFT;
+                }
+                /* Check right sizing border */
+                if (pt.x >= rect.right)
+                {
+                    if (pt.y < rect.top+SYSMETRICS_CYSIZE) return HTTOPRIGHT;
+                    if (pt.y >= rect.bottom-SYSMETRICS_CYSIZE) return HTBOTTOMRIGHT;
+                    return HTRIGHT;
+                }
+            }
+        }
+        else  /* No thick frame */
+        {
+            if (HAS_FIXEDFRAME( wndPtr->dwStyle, wndPtr->dwExStyle ))
+                InflateRect16(&rect, -SYSMETRICS_CXDLGFRAME, -SYSMETRICS_CYDLGFRAME);
+//            else if (wndPtr->dwStyle & WS_BORDER)
+//                InflateRect16(&rect, -SYSMETRICS_CXBORDER, -SYSMETRICS_CYBORDER);
+            if (!PtInRect16( &rect, pt )) return HTBORDER;
+        }
+
+        /* Check caption */
+
+        if ((wndPtr->dwStyle & WS_CAPTION) == WS_CAPTION)
+        {
+	    if (wndPtr->dwExStyle & WS_EX_TOOLWINDOW)
+	        rect.top += sysMetrics[SM_CYSMCAPTION] - 1;
+	    else
+	        rect.top += sysMetrics[SM_CYCAPTION] - 1;
+            if (!PtInRect16( &rect, pt ))
+            {
+                /* Check system menu */
+                if ((wndPtr->dwStyle & WS_SYSMENU) &&
+		    ((wndPtr->class->hIconSm) || (wndPtr->class->hIcon)))
+                    rect.left += sysMetrics[SM_CYCAPTION] - 1;
+                if (pt.x < rect.left) return HTSYSMENU;
+
+                /* Check close button */
+                if (wndPtr->dwStyle & WS_SYSMENU)
+                    rect.right -= sysMetrics[SM_CYCAPTION] - 1;
+                if (pt.x > rect.right) return HTCLOSE;
+
+                /* Check maximize box */
+                if (wndPtr->dwStyle & WS_MAXIMIZEBOX)
+                    rect.right -= SYSMETRICS_CXSIZE + 1;
+                if (pt.x > rect.right) return HTMAXBUTTON;
+
+                /* Check minimize box */
+                if (wndPtr->dwStyle & WS_MINIMIZEBOX)
+                    rect.right -= SYSMETRICS_CXSIZE + 1;
+                if (pt.x > rect.right) return HTMINBUTTON;
+                return HTCAPTION;
+            }
+        }
+    }
+
+      /* Check client area */
+
+    ScreenToClient16( wndPtr->hwndSelf, &pt );
+    GetClientRect16( wndPtr->hwndSelf, &rect );
+    if (PtInRect16( &rect, pt )) return HTCLIENT;
+
+      /* Check vertical scroll bar */
+
+    if (wndPtr->dwStyle & WS_VSCROLL)
+    {
+	rect.right += SYSMETRICS_CXVSCROLL;
+	if (PtInRect16( &rect, pt )) return HTVSCROLL;
+    }
+
+      /* Check horizontal scroll bar */
+
+    if (wndPtr->dwStyle & WS_HSCROLL)
+    {
+	rect.bottom += SYSMETRICS_CYHSCROLL;
+	if (PtInRect16( &rect, pt ))
+	{
+	      /* Check size box */
+	    if ((wndPtr->dwStyle & WS_VSCROLL) &&
+		(pt.x >= rect.right - SYSMETRICS_CXVSCROLL))
+		return HTSIZE;
+	    return HTHSCROLL;
+	}
+    }
+
+      /* Check menu bar */
+
+    if (HAS_MENU(wndPtr))
+    {
+	if ((pt.y < 0) && (pt.x >= 0) && (pt.x < rect.right))
+	    return HTMENU;
+    }
+
+      /* Should never get here */
+    return HTERROR;
+}
+
+
+/***********************************************************************
+ * NC_HandleNCHitTest
+ *
+ * Handle a WM_NCHITTEST message. Called from DefWindowProc().
+ */
+LONG
+NC_HandleNCHitTest( HWND32 hwnd , POINT16 pt)
+{
+    WND* wndPtr = WIN_FindWndPtr( hwnd );
+
+    if (!wndPtr)
+	return HTERROR;
+
+    if(TWEAK_Win95Look)
+	return NC_DoNCHitTest95 (wndPtr, pt);
+    else
+        return NC_DoNCHitTest (wndPtr, pt);
+}
+
+
+/***********************************************************************
  *           NC_DrawSysButton
  */
 void NC_DrawSysButton( HWND32 hwnd, HDC32 hdc, BOOL32 down )
@@ -557,45 +802,83 @@
  *      HDC32  hdc,
  *      BOOL32  down )
  *
- *   Draws a fake Win95 system button.  Horribly broken.  We should be drawing
- *   an icon, not the X.  (This will require some thought)
- *
- *   Bugs
- *        Plain and simply doesn't work.  Fails miserably for child windows.
+ *   Draws the Win95 system icon.
  *
  *   Revision history
  *        05-Jul-1997 Dave Cuthbert (dacut@ece.cmu.edu)
  *             Original implementation from NC_DrawSysButton source.
+ *        11-Jun-1998 Eric Kohl (ekohl@abo.rhein-zeitung.de)
+ *             Fixed most bugs.
+ *
+ *****************************************************************************/
+
+BOOL32
+NC_DrawSysButton95 (HWND32 hwnd, HDC32 hdc, BOOL32 down)
+{
+    WND *wndPtr = WIN_FindWndPtr( hwnd );
+
+    if( !(wndPtr->flags & WIN_MANAGED) )
+    {
+	HICON32  hIcon = 0;
+	RECT32 rect;
+
+	NC_GetInsideRect95( hwnd, &rect );
+
+	if (wndPtr->class->hIconSm)
+	    hIcon = wndPtr->class->hIconSm;
+	else if (wndPtr->class->hIcon)
+	    hIcon = wndPtr->class->hIcon;
+
+	if (hIcon)
+	    DrawIconEx32 (hdc, rect.left + 2, rect.top + 1, hIcon,
+			  sysMetrics[SM_CYCAPTION] - 3,
+			  sysMetrics[SM_CYCAPTION] - 3, 0, 0, DI_NORMAL);
+	return (hIcon != 0);
+    }
+    return FALSE;
+}
+
+
+/******************************************************************************
+ *
+ *   void  NC_DrawCloseButton95(
+ *      HWND32  hwnd,
+ *      HDC32  hdc,
+ *      BOOL32  down )
+ *
+ *   Draws the Win95 close button.
+ *
+ *   Revision history
+ *        11-Jun-1998 Eric Kohl (ekohl@abo.rhein-zeitung.de)
+ *             Original implementation from NC_DrawSysButton95 source.
  *
  *****************************************************************************/
 
 void
-NC_DrawSysButton95 (HWND32 hwnd, HDC32 hdc, BOOL32 down)
+NC_DrawCloseButton95 (HWND32 hwnd, HDC32 hdc, BOOL32 down)
 {
     RECT32 rect;
     HDC32 hdcMem;
-    HBITMAP32 hbitmap;
     WND *wndPtr = WIN_FindWndPtr( hwnd );
 
     if( !(wndPtr->flags & WIN_MANAGED) )
     {
 	BITMAP32 bmp;
+	HBITMAP32 hBmp, hOldBmp;
 
 	NC_GetInsideRect95( hwnd, &rect );
-	hdcMem = CreateCompatibleDC32( hdc );
-	hbitmap = SelectObject32( hdcMem, hbitmapClose );
-	GetObject32A (hbitmapClose, sizeof(BITMAP32), &bmp);
-	BitBlt32 (hdc, rect.left + (sysMetrics[SM_CXSIZE] - bmp.bmWidth) / 2 +
-		     NC_SysControlNudge,
-		     rect.top + (sysMetrics[SM_CYSIZE] - bmp.bmHeight - 1) / 2,
-		     bmp.bmWidth, bmp.bmHeight,
-		     hdcMem, 0, 0, down ? NOTSRCCOPY : SRCCOPY );
 
-	SelectObject32( hdcMem, hbitmap );
-	DeleteDC32( hdcMem );
-	
+	hdcMem = CreateCompatibleDC32( hdc );
+	hBmp = /*down ? hbitmapCloseD :*/ hbitmapClose;
+	hOldBmp = SelectObject32 (hdcMem, hBmp);
+	GetObject32A (hBmp, sizeof(BITMAP32), &bmp);
+	BitBlt32 (hdc, rect.right - (sysMetrics[SM_CYCAPTION] + 1 + bmp.bmWidth) / 2,
+		  rect.top + (sysMetrics[SM_CYCAPTION] - 1 - bmp.bmHeight) / 2,
+		  bmp.bmWidth, bmp.bmHeight, hdcMem, 0, 0, down ? NOTSRCCOPY : SRCCOPY);
+
+	SelectObject32 (hdcMem, hOldBmp);
+	DeleteDC32 (hdcMem);
     }
-    return;
 }
 
 
@@ -610,9 +893,8 @@
  *
  *   Bugs
  *        Many.  Spacing might still be incorrect.  Need to fit a close
- *        button between the max button and the edge.  Draws the wrong thing
- *        (a Win31 up-down) when maximized.  Should scale the image with the
- *        title bar.  And more...
+ *        button between the max button and the edge.
+ *        Should scale the image with the title bar.  And more...
  *
  *   Revision history
  *        05-Jul-1997 Dave Cuthbert (dacut@ece.cmu.edu)
@@ -637,11 +919,13 @@
 			       &bmsz)) {
 
 	NC_GetInsideRect95( hwnd, &rect );
+
+	if (wndPtr->dwStyle & WS_SYSMENU)
+	    rect.right -= sysMetrics[SM_CYCAPTION] + 1;
 	
-	GRAPH_DrawBitmap( hdc, bm,
-			  rect.right + NC_MaxControlNudge -
+	GRAPH_DrawBitmap( hdc, bm, rect.right + NC_MinControlNudge -
 			  (sysMetrics[SM_CXSIZE] + bmsz.cx) / 2,
-			  rect.top + (sysMetrics[SM_CYSIZE] - bmsz.cy - 1) / 2,
+			  rect.top + (sysMetrics[SM_CYCAPTION] - 1 - bmsz.cy) / 2,
 			  0, 0, bmsz.cx, bmsz.cy, FALSE );
     }
 
@@ -684,13 +968,16 @@
 	
 	NC_GetInsideRect95( hwnd, &rect );
 
+	if (wndPtr->dwStyle & WS_SYSMENU)
+	    rect.right -= sysMetrics[SM_CYCAPTION] + 1;
+
 	if (wndPtr->dwStyle & WS_MAXIMIZEBOX)
 	    rect.right += -1 + NC_MaxControlNudge -
 		(sysMetrics[SM_CXSIZE] + bmsz.cx) / 2;
 
 	GRAPH_DrawBitmap( hdc, bm, rect.right + NC_MinControlNudge -
 			  (sysMetrics[SM_CXSIZE] + bmsz.cx) / 2,
-			  rect.top + (sysMetrics[SM_CYSIZE] - bmsz.cy - 1) / 2,
+			  rect.top + (sysMetrics[SM_CYCAPTION] - 1 - bmsz.cy) / 2,
 			  0, 0, bmsz.cx, bmsz.cy, FALSE );
     }
 
@@ -826,8 +1113,8 @@
     }
     else
     {
-	width = sysMetrics[SM_CXFRAME] - sysMetrics[SM_CXEDGE] - 1;
-	height = sysMetrics[SM_CYFRAME] - sysMetrics[SM_CYEDGE] - 1;
+	width = sysMetrics[SM_CXFRAME] - sysMetrics[SM_CXEDGE];
+	height = sysMetrics[SM_CYFRAME] - sysMetrics[SM_CYEDGE];
     }
 
     SelectObject32( hdc, GetSysColorBrush32(active ? COLOR_ACTIVEBORDER :
@@ -844,16 +1131,6 @@
               -width, rect->bottom - rect->top, PATCOPY );
 
     InflateRect32( rect, -width, -height );
-
-    if(!dlgFrame) {
-	/* Draw inner rectangle */
-	GRAPH_DrawRectangle( hdc, rect->left, rect->top,
-			     rect->right - rect->left,
-			     rect->bottom - rect->top,
-			     TWEAK_PenC095 );
-
-	InflateRect32( rect, -1, -1 );
-    }
 }
 
 
@@ -897,6 +1174,7 @@
     {
 	if (!(hbitmapClose = LoadBitmap16( 0, MAKEINTRESOURCE16(OBM_CLOSE) )))
 	    return;
+	hbitmapCloseD    = LoadBitmap16( 0, MAKEINTRESOURCE16(OBM_CLOSE) );
 	hbitmapMinimize  = LoadBitmap16( 0, MAKEINTRESOURCE16(OBM_REDUCE) );
 	hbitmapMinimizeD = LoadBitmap16( 0, MAKEINTRESOURCE16(OBM_REDUCED) );
 	hbitmapMaximize  = LoadBitmap16( 0, MAKEINTRESOURCE16(OBM_ZOOM) );
@@ -983,11 +1261,16 @@
     BOOL32  active )
 {
     RECT32  r = *rect;
-    WND   *wndPtr = WIN_FindWndPtr( hwnd );
-    char  buffer[256];
+    WND     *wndPtr = WIN_FindWndPtr( hwnd );
+    char    buffer[256];
+    POINT32 sep[2] = { { r.left,  r.bottom - 1 },
+		       { r.right, r.bottom - 1 } };
 
     if (wndPtr->flags & WIN_MANAGED) return;
 
+    GRAPH_DrawLines( hdc, sep, 1, TWEAK_PenC095 );
+    r.bottom--;
+
     FillRect32( hdc, &r, GetSysColorBrush32(active ? COLOR_ACTIVECAPTION :
 					    COLOR_INACTIVECAPTION) );
 
@@ -1003,8 +1286,10 @@
     }
 
     if (style & WS_SYSMENU) {
-	NC_DrawSysButton95( hwnd, hdc, FALSE );
-	r.left += SYSMETRICS_CXSIZE + 1;
+	if (NC_DrawSysButton95 (hwnd, hdc, FALSE))
+	    r.left += sysMetrics[SM_CYCAPTION] - 1;
+	NC_DrawCloseButton95 (hwnd, hdc, FALSE);
+	r.right -= sysMetrics[SM_CYCAPTION] - 1;
     }
     if (style & WS_MAXIMIZEBOX) {
 	NC_DrawMaxButton95( hwnd, hdc, FALSE );
@@ -1184,12 +1469,12 @@
     SelectObject32( hdc, GetSysColorPen32(COLOR_WINDOWFRAME) );
 
     if(!(wndPtr->flags & WIN_MANAGED)) {
-        if((wndPtr->dwStyle & WS_BORDER) || (wndPtr->dwStyle & WS_DLGFRAME) ||
-	   (wndPtr->dwExStyle & WS_EX_DLGMODALFRAME)) {
+        if ((wndPtr->dwStyle & WS_BORDER) && ((wndPtr->dwStyle & WS_DLGFRAME) ||
+	    (wndPtr->dwExStyle & WS_EX_DLGMODALFRAME) || (wndPtr->dwStyle & WS_THICKFRAME))) {
             DrawEdge32 (hdc, &rect, EDGE_RAISED, BF_RECT | BF_ADJUST);
         }
 
-        if (HAS_DLGFRAME( wndPtr->dwStyle, wndPtr->dwExStyle )) 
+        if (HAS_FIXEDFRAME( wndPtr->dwStyle, wndPtr->dwExStyle )) 
             NC_DrawFrame95( hdc, &rect, TRUE, active );
         else if (wndPtr->dwStyle & WS_THICKFRAME)
             NC_DrawFrame95(hdc, &rect, FALSE, active );
@@ -1197,43 +1482,38 @@
         if ((wndPtr->dwStyle & WS_CAPTION) == WS_CAPTION)
         {
             RECT32  r = rect;
-	    POINT32  sep[2] = { { rect.left,
-				  rect.top + sysMetrics[SM_CYCAPTION] - 2 },
-				{ rect.right,
-				  rect.top + sysMetrics[SM_CYCAPTION] - 2 } };
-
-            r.bottom = rect.top + sysMetrics[SM_CYCAPTION] - 2;
-            rect.top += sysMetrics[SM_CYCAPTION] - 2 + sysMetrics[SM_CYBORDER];
+	    if (wndPtr->dwExStyle & WS_EX_TOOLWINDOW) {
+		r.bottom = rect.top + sysMetrics[SM_CYSMCAPTION];
+		rect.top += sysMetrics[SM_CYSMCAPTION];
+	    }
+	    else {
+		r.bottom = rect.top + sysMetrics[SM_CYCAPTION];
+		rect.top += sysMetrics[SM_CYCAPTION];
+	    }
             NC_DrawCaption95( hdc, &r, hwnd, wndPtr->dwStyle, active );
-	    GRAPH_DrawLines( hdc, sep, 1, TWEAK_PenC095 );
         }
     }
 
     if (HAS_MENU(wndPtr))
     {
 	RECT32 r = rect;
-	r.bottom = rect.top + sysMetrics[SM_CYMENU] - sysMetrics[SM_CYBORDER];
-	r.top -= sysMetrics[SM_CYBORDER];
+	r.bottom = rect.top + sysMetrics[SM_CYMENU];
 	
 	TRACE(nonclient, "Calling DrawMenuBar with "
 			  "rect (%d, %d)-(%d, %d)\n", r.left, r.top,
 			  r.right, r.bottom);
 
-	rect.top += MENU_DrawMenuBar( hdc, &r, hwnd, suppress_menupaint );
+	rect.top += MENU_DrawMenuBar( hdc, &r, hwnd, suppress_menupaint ) + 1;
     }
 
     TRACE(nonclient, "After MenuBar, rect is (%d, %d)-(%d, %d).\n",
 		       rect.left, rect.top, rect.right, rect.bottom );
 
-    /* Draw the inner frames */
-    GRAPH_DrawRectangle( hdc, rect.left, rect.top, rect.right - rect.left,
-			 rect.bottom - rect.top, TWEAK_PenC095 );
-    InflateRect32(&rect, -1, -1);
-    GRAPH_DrawGenericReliefRect( hdc, &rect, 1, 1, NC_WinShadow95,
-				 NC_WinHighlight95 );
+    if (wndPtr->dwExStyle & WS_EX_CLIENTEDGE)
+	DrawEdge32 (hdc, &rect, EDGE_SUNKEN, BF_RECT | BF_ADJUST);
 
-    InflateRect32(&rect, -1, -1);
-
+    if (wndPtr->dwExStyle & WS_EX_STATICEDGE)
+	DrawEdge32 (hdc, &rect, BDR_SUNKENOUTER, BF_RECT | BF_ADJUST);
 
     /* Draw the scroll-bars */
 
@@ -1378,8 +1658,14 @@
   	  OffsetRect32( rect, wndPtr->rectWindow.left, wndPtr->rectWindow.top);
   	  if (wndPtr->dwStyle & WS_CHILD)
      	      ClientToScreen32( wndPtr->parent->hwndSelf, (POINT32 *)rect );
-          rect->right = rect->left + SYSMETRICS_CXSIZE;
-          rect->bottom = rect->top + SYSMETRICS_CYSIZE;
+          if(TWEAK_Win95Look) {
+            rect->right = rect->left + sysMetrics[SM_CYCAPTION] - 1;
+            rect->bottom = rect->top + sysMetrics[SM_CYCAPTION] - 1;
+	  }
+	  else {
+            rect->right = rect->left + SYSMETRICS_CXSIZE;
+            rect->bottom = rect->top + SYSMETRICS_CYSIZE;
+	  }
       }
       return TRUE;
   }
@@ -1749,6 +2035,42 @@
 
 
 /***********************************************************************
+ * NC_TrackCloseButton95
+ *
+ * Track a mouse button press on the Win95 close button.
+ */
+static void
+NC_TrackCloseButton95 (HWND32 hwnd, WORD wParam)
+{
+    MSG16 msg;
+    HDC32 hdc = GetWindowDC32( hwnd );
+    BOOL32 pressed = TRUE;
+
+    SetCapture32( hwnd );
+
+    NC_DrawCloseButton95 (hwnd, hdc, TRUE);
+
+    do
+    {
+	BOOL32 oldstate = pressed;
+        MSG_InternalGetMessage( &msg, 0, 0, 0, PM_REMOVE, FALSE );
+
+	pressed = (NC_HandleNCHitTest( hwnd, msg.pt ) == wParam);
+	if (pressed != oldstate)
+	   NC_DrawCloseButton95 (hwnd, hdc, pressed);
+    } while (msg.message != WM_LBUTTONUP);
+
+    NC_DrawCloseButton95 (hwnd, hdc, FALSE);
+
+    ReleaseCapture();
+    ReleaseDC32( hwnd, hdc );
+    if (!pressed) return;
+
+    SendMessage16( hwnd, WM_SYSCOMMAND, SC_CLOSE, *(LONG*)&msg.pt );
+}
+
+
+/***********************************************************************
  *           NC_TrackScrollBar
  *
  * Track a mouse button press on the horizontal or vertical scroll-bar.
@@ -1855,6 +2177,11 @@
 	NC_TrackMinMaxBox( hwnd, wParam );
 	break;
 
+    case HTCLOSE:
+	if (TWEAK_Win95Look)
+	    NC_TrackCloseButton95 (hwnd, wParam);
+	break;
+
     case HTLEFT:
     case HTRIGHT:
     case HTTOP:
diff --git a/windows/syscolor.c b/windows/syscolor.c
index c08adc7..fe48431 100644
--- a/windows/syscolor.c
+++ b/windows/syscolor.c
@@ -56,7 +56,7 @@
     "TitleText", "255 255 255",      /* COLOR_CAPTIONTEXT         */
     "ActiveBorder", "128 128 128",   /* COLOR_ACTIVEBORDER        */
     "InactiveBorder", "255 255 255", /* COLOR_INACTIVEBORDER      */
-    "AppWorkspace", "255 255 232",   /* COLOR_APPWORKSPACE        */
+    "AppWorkspace", "128 128 128",   /* COLOR_APPWORKSPACE        */
     "Hilight", "223 223 223",        /* COLOR_HIGHLIGHT           */
     "HilightText", "0 0 0",          /* COLOR_HIGHLIGHTTEXT       */
     "ButtonFace", "192 192 192",     /* COLOR_BTNFACE             */
diff --git a/windows/sysmetrics.c b/windows/sysmetrics.c
index b02f629..4411e0c 100644
--- a/windows/sysmetrics.c
+++ b/windows/sysmetrics.c
@@ -27,8 +27,12 @@
     sysMetrics[SM_CXVSCROLL] =
 	PROFILE_GetWineIniInt("Tweak.Layout", "ScrollBarWidth", 16) + 1;
     sysMetrics[SM_CYHSCROLL] = sysMetrics[SM_CXVSCROLL];
-    sysMetrics[SM_CYCAPTION] = 2 +
-	PROFILE_GetWineIniInt("Tweak.Layout", "CaptionHeight", 18);
+    if (TWEAK_Win95Look)
+	sysMetrics[SM_CYCAPTION] =
+	    PROFILE_GetWineIniInt("Tweak.Layout", "CaptionHeight", 19);
+    else
+	sysMetrics[SM_CYCAPTION] = 2 +
+	    PROFILE_GetWineIniInt("Tweak.Layout", "CaptionHeight", 18);
     sysMetrics[SM_CXBORDER] = 1;
     sysMetrics[SM_CYBORDER] = sysMetrics[SM_CXBORDER];
     sysMetrics[SM_CXDLGFRAME] =
@@ -39,8 +43,12 @@
     sysMetrics[SM_CXHTHUMB] = sysMetrics[SM_CYVTHUMB];
     sysMetrics[SM_CXICON] = 32;
     sysMetrics[SM_CYICON] = 32;
-    sysMetrics[SM_CYMENU] =
-	PROFILE_GetWineIniInt("Tweak.Layout", "MenuHeight", 18);
+    if (TWEAK_Win95Look)
+	sysMetrics[SM_CYMENU] =
+	    PROFILE_GetWineIniInt("Tweak.Layout", "MenuHeight", 19);
+    else
+	sysMetrics[SM_CYMENU] =
+	    PROFILE_GetWineIniInt("Tweak.Layout", "MenuHeight", 18);
     sysMetrics[SM_CXFULLSCREEN] = sysMetrics[SM_CXSCREEN];
     sysMetrics[SM_CYFULLSCREEN] =
 	sysMetrics[SM_CYSCREEN] - sysMetrics[SM_CYCAPTION];
diff --git a/windows/user.c b/windows/user.c
index d0cd7ed..0a6611a 100644
--- a/windows/user.c
+++ b/windows/user.c
@@ -24,6 +24,7 @@
 #include "miscemu.h"
 #include "queue.h"
 #include "shell.h"
+#include "callback.h"
 
 /***********************************************************************
  *           GetFreeSystemResources   (USER.284)
@@ -93,7 +94,7 @@
     return TRUE;
 }
 
-static RESOURCEHANDLER16 __r16loader = NULL;
+static FARPROC16 __r16loader = NULL;
 
 /**********************************************************************
  *           USER_CallDefaultRsrcHandler
@@ -102,7 +103,7 @@
  */
 HGLOBAL16 USER_CallDefaultRsrcHandler( HGLOBAL16 hMemObj, HMODULE16 hModule, HRSRC16 hRsrc )
 {
-    return __r16loader( hMemObj, hModule, hRsrc );
+    return Callbacks->CallResourceHandlerProc( __r16loader, hMemObj, hModule, hRsrc );
 }
 
 /**********************************************************************
@@ -116,13 +117,12 @@
      * when a module's resource table is loaded. */
 
     proc = SetResourceHandler( hInstance, RT_ICON16,
-                               (FARPROC32)LoadDIBIconHandler );
-    if(!__r16loader ) 
-	__r16loader = (RESOURCEHANDLER16)proc;
+                               MODULE_GetWndProcEntry16("LoadDIBIconHandler") );
+    if (!__r16loader) __r16loader = proc;
+
     proc = SetResourceHandler( hInstance, RT_CURSOR16,
-                               (FARPROC32)LoadDIBCursorHandler );
-    if(!__r16loader )
-	__r16loader = (RESOURCEHANDLER16)proc;
+                               MODULE_GetWndProcEntry16("LoadDIBCursorHandler") );
+    if (!__r16loader) __r16loader = proc;
 }
 
 /**********************************************************************
diff --git a/windows/win.c b/windows/win.c
index e146e89..d9366e4 100644
--- a/windows/win.c
+++ b/windows/win.c
@@ -1406,8 +1406,12 @@
     		WARN( win,"GWW_ID: discards high bits of 0x%08x!\n",
                     wndPtr->wIDmenu);
     	return (WORD)wndPtr->wIDmenu;
-    case GWW_HWNDPARENT: return wndPtr->parent ?
-			wndPtr->parent->hwndSelf : wndPtr->owner->hwndSelf;
+    case GWW_HWNDPARENT: 
+    	return wndPtr->parent ?
+		wndPtr->parent->hwndSelf : (
+			wndPtr->owner ?
+			 wndPtr->owner->hwndSelf : 
+			 0);
     case GWW_HINSTANCE:  
     	if (HIWORD(wndPtr->hInstance))
     		WARN(win,"GWW_HINSTANCE: discards high bits of 0x%08x!\n",
@@ -1728,6 +1732,15 @@
     return IsWindow32( hwnd );
 }
 
+void WINAPI WIN16_IsWindow16( CONTEXT *context )
+{
+    WORD *stack = PTR_SEG_OFF_TO_LIN(SS_reg(context), SP_reg(context));
+    HWND16 hwnd = (HWND16)stack[2];
+
+    AX_reg(context) = IsWindow32( hwnd );
+    ES_reg(context) = USER_HeapSel;
+}
+
 
 /*******************************************************************
  *         IsWindow32   (USER32.348)
diff --git a/windows/winpos.c b/windows/winpos.c
index 7380db9..1eba986 100644
--- a/windows/winpos.c
+++ b/windows/winpos.c
@@ -1182,10 +1182,10 @@
 			     *(LPPOINT32)&pWnd->rectWindow.left, &pWnd->rectWindow );
 	wndpl->length  = sizeof(*wndpl);
 	if( pWnd->dwStyle & WS_MINIMIZE )
-	    wndpl->showCmd = SW_SHOWMAXIMIZED;
+	    wndpl->showCmd = SW_SHOWMINIMIZED;
 	else 
 	    wndpl->showCmd = ( pWnd->dwStyle & WS_MAXIMIZE )
-			     ? SW_SHOWMINIMIZED : SW_SHOWNORMAL ;
+			     ? SW_SHOWMAXIMIZED : SW_SHOWNORMAL ;
 	if( pWnd->flags & WIN_RESTORE_MAX )
 	    wndpl->flags = WPF_RESTORETOMAXIMIZED;
 	else
@@ -1648,14 +1648,16 @@
                             RECT32 *newClientRect )
 {
     NCCALCSIZE_PARAMS32 params;
+    WINDOWPOS32 winposCopy;
     LONG result;
 
     params.rgrc[0] = *newWindowRect;
     if (calcValidRect)
     {
+        winposCopy = *winpos;
 	params.rgrc[1] = *oldWindowRect;
 	params.rgrc[2] = *oldClientRect;
-	params.lppos = winpos;
+	params.lppos = &winposCopy;
     }
     result = SendMessage32A( hwnd, WM_NCCALCSIZE, calcValidRect,
                              (LPARAM)&params );