Release 980712

Sun Jul 12 16:23:36 1998  Alexandre Julliard  <julliard@lrc.epfl.ch>

	* [server/*] [scheduler/client.c] (new files)
	  [scheduler/sysdeps.c] [scheduler/thread.c] [scheduler/process.c]
	Beginnings of client/server communication for inter-process
	synchronisation.

Sat Jul 11 19:45:45 1998  Ulrich Weigand <weigand@informatik.uni-erlangen.de>

	* [include/bitmap.h] [objects/bitmap.c] [objects/dib.c] 
	  [objects/oembitmap.c]
	Speed up DIB section handling by using pre-allocated colormap and 
	XImage. Moved DIB section data out of general BITMAPOBJ structure.
	Bugfix: GetDIBits32 would overwrite one byte beyond bitmap data.

	* [if1632/shell.spec] [if1632/kernel.spec] [win32/kernel32.c]
	More verbose error message if ThunkConnect fails.
	Implemented KERNEL_475.

	* [files/profile.c] [ole/ole2nls.c]
	Minor bugfixes.

	* [if1632/builtin.c] [if1632/kernel.spec] [include/task.h]
	  [loader/ne/module.c] [loader/task.c]
	Implemented KERNEL.THHOOK.

	* [if1632/wprocs.spec] [include/process.h] [msdos/dpmi.c] [msdos/vxd.c]
	Implemented Win32s VxD services (W32S.386).

Sat Jul 11 17:52:23 1998  Huw D M Davies <daviesh@abacus.physics.ox.ac.uk>

	* [graphics/x11drv/xfont.c] [graphics/x11drv/text.c] 
	  [include/x11font.h]
	Improve handling of rotated X11 fonts. Metrics/extents should now be
	correct. ExtTextOut should behave better (still doesn't handle lpDx).

	* [graphics/painting.c]
	DrawFocusRect32: Don't do anything if width or height are zero.

Sat Jul 11 15:21:35 1998  Andreas Mohr <100.30936@germany.net>

	* [files/profile.c] [include/windows.h]
	The length arguments of *Profile*() need to be treated
	as UINTxx instead of INTxx.

	* [graphics/env.c] [graphics/win16drv/init.c] [include/print.h]
	  [misc/printdrv.c]
	Many printer driver fixes/changes (many thanks go to Huw !).
	Most printers should work again ;)

	* [memory/atom.c]
	Fixed ATOM_AddAtom to store atoms exactly like Windows.

	* [*/*]
	Fixed misc compiler warnings.

Fri Jul 10 15:58:36 1998  Marcus Meissner <marcus@jet.franken.de>

	* [files/drive.c]
	Fixed GetDriveType16 to return DRIVE_REMOTE again.

	* [loader/pe_image.c][loader/module.c]
	Look for modules that have the same modulename or the same
	filename (they sometimes differ).
	Fixed up fixup_imports, removed one of the loops.

	* [windows/winpos.c]
	Added some NULL ptr checks. Needs more.

	* [graphics/ddraw.c]
	Some stubs added.

	* [if1632/snoop.c]
	Updated, made WINELIB compatible.

Fri Jul 10 04:39:56 1998  Douglas Ridgway  <ridgway@winehq.com>

	* [objects/enhmetafile.c] [relay32/gdi32.spec]
	Small tweaks for documentation system.

Thu Jul  9 22:00:18 1998  Eric Kohl <ekohl@abo.rhein-zeitung.de>

	* [controls/commctrl.c][include/commctrl.h][relay32/comctl32.spec]
	Fixed GetEffectiveClientRect, CreateToolbarEx and CreateMappedBitmap.
	Added stub for ShowHideMenuCtl. Added some documentation.

	* [documentation/common_controls]
	Added and updated some information.

	* [controls/toolbar.c][include/toolbar.h]
	Added string support.

	* [misc/shell.c][misc/shellord.c][relay32/shell.spec]
	Changed names of undocumented functions to their real names and
	fixed the export table.

	* [controls/imagelist.c][relay32/comctl32.spec]
	Added stub for ImageList_SetFilter.
	Fixed some minor bugs and typos.

	* [objects/font.c][include/windows.h][relay32/gdi32.spec]
	Added stubs for GetCharacterPlacement32[A/W].

	* [objects/region.c][relay32/gdi32.spec]
	Added stub for UNDOCUMENTED GetRandomRgn.

	* [controls/commctrl.c][controls/*.c][include/*.h]
	Added dummy listview, pager, rebar, tooltips, trackbar and
	treeview control. This keeps some programs from complaining.

Thu Jul  9 11:23:58 1998  Rein Klazes <rklazes@casema.net>

	* [graphics/painting.c] [graphics/*/init.c]
	  [graphics/x11drv/graphics.c] [relay32/gdi32.spec]
	  [if1632/gdi.spec] [include/gdi.h] [include/x11drv.h]
	Implemented drawing bezier curves: PolyBezier16/32 and
	PolyBezierTo16/32.

	* [graphics/x11drv/graphics.c]
	Improved accuracy of several graphic routines, especially the
	drawing of pie's.

	* [include/windows.h] [misc/spy.c]
	Added 25 window messages related to programs based on MFC and/or OLE.

Wed Jul  8 22:00:00 1998  James Juran  <jrj120@psu.edu>

	* [documentation/wine.man]
	Updated manpage.

	* [wine.ini]
	Added section for Win95Look=true (commented out by default).

Wed Jul  8 06:23:19 1998  Matthew Becker <mbecker@glasscity.net>

	* [misc/registry.c]
	Fixed a crash in RegEnumValue32A when the dwType parameter is
	NULL.

	* [programs/regtest/regtest.c]
	Improved the printing of errors.

	* [misc/ntdll.c]
	Added stub for RtlFormatCurrentUserKeyPath.

	* [win32/console.c]
	Added stub for ScrollConsoleScreenBuffer.

Mon Jul  6 16:41:47 1998  Per Lindström <pelinstr@algonet.se>

	* [include/windows.h] [relay32/kernel.spec] [win32/newfns.c]
	Added stubs for SleepEx and TerminateProcess.

	* [rc/README]
	Corrected a grammatical error.

Mon Jul  3 12:00:00 1998  Juergen Schmied <juergen.schmied@metronet.de>

	* [misc/shellord.c]
	Put some TRACE in.

	* [memory/string.c]
	Deleted unused variable in lstrcmpi32A.

	* [include/windows.h][memory/string.c]
	Added functions WideCharToLocal32 LocalToWideChar32 for
	OLE-strings

	* [include/shlobj.h][include/winerror.h][misc/shell.c]
	  [ole/folders.c]
	Added definition of internal class pidlmgr.
	Changed definitions of EnumIDList, IShellFolder.
	Added some OLE error constants.
	Implemented EnumIDList, IShellFolder, IClassFactory,
	PidlMgr, SHELL32_DllGetClassObject, SHGetDesktopFolder,
	SHGetSpecialFolderLocation (half), SHGetPathFromIDList
	(!!This stuff is not finished yet!!)

	* [include/windows.h][misc/network][reley32/mpr.spec]
	Added stubs for WNetConnectionDialog32[A|W|API].
	Added struct LPCONNECTDLGSTRUCT32[A|W] and some constants.
	Added some SetLastError(WN_NO_NETWORK) to the stubs.
	Fixed bufferhandling in WNetCancelConnection
	Added stub for MultinetGetErrorText[A|W]

	* [ole/ole2nls.c]
	Rewrote GetTimeFormat32A.

Fri Jul  3 10:27:30 1998  Michael Poole <poole+@andrew.cmu.edu>

	* [graphics/ddraw.c] [tsx11/X11_calls]
	Implement IDirectDrawPalette_GetEntries.
	Use CopyColormapAndFree to avoid erasing previously-set
	palette entries.

	* [graphics/ddraw.c] [include/ddraw.h]
	  [tools/make_X11wrappers] [tsx11/X11_calls]
	Provide a preliminary, not-yet-working framework for doing
	DirectDraw via Xlib or XShm as well as DGA.

Tue Jun 30 00:16:09 1998  Marcel Baur <mbaur@g26.ethz.ch>

	* [ole/nls/*.nls]
	Added remaining 22 locales (including arabic locales).
diff --git a/ANNOUNCE b/ANNOUNCE
index 605e438..3c55f20 100644
--- a/ANNOUNCE
+++ b/ANNOUNCE
@@ -1,15 +1,15 @@
-This is release 980628 of Wine, the MS Windows emulator.  This is still a
+This is release 980712 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-980628: (see ChangeLog for details)
-	- Common controls improvements.
-	- Win16 DLL snooping.
-	- Preliminary internal Postscript driver.
-	- Improved DIB section handling.
+WHAT'S NEW with Wine-980712: (see ChangeLog for details)
+	- More common controls stuff.
+	- Win32s VxD support.
+	- Beginnings of client/server architecture.
+	- More NLS support.
 	- Lots of bug fixes.
 
 See the README file in the distribution for installation instructions.
@@ -18,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-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
+  ftp://sunsite.unc.edu/pub/Linux/ALPHA/wine/development/Wine-980712.tar.gz
+  ftp://tsx-11.mit.edu/pub/linux/ALPHA/Wine/development/Wine-980712.tar.gz
+  ftp://ftp.infomagic.com/pub/mirrors/linux/sunsite/ALPHA/wine/development/Wine-980712.tar.gz
+  ftp://ftp.progsoc.uts.edu.au/pub/Wine/development/Wine-980712.tar.gz
 
 It should also be available from any site that mirrors tsx-11 or sunsite.
 
diff --git a/AUTHORS b/AUTHORS
index 6e4acf4..04c6de34 100644
--- a/AUTHORS
+++ b/AUTHORS
@@ -57,6 +57,7 @@
 Pavel Kankovsky,
 Jochen Karrer,
 Andreas Kirschbaum,
+Rein Klazes,
 Albrecht Kleine,
 Eric Kohl,
 Jon Konrath,
@@ -66,6 +67,7 @@
 Scott A. Laird,
 David Lee Lambert,
 Andrew Lewycky,
+Per Lindström,
 Martin von Loewis,
 Michiel van Loon,
 Kenneth MacDonald,
@@ -102,6 +104,7 @@
 Peter Schlaile,
 Ulrich Schmid,
 Bernd Schmidt,
+Juergen Schmied,
 Ingo Schneider,
 Victor Schneider,
 Yngvi Sigurjonsson,
diff --git a/ChangeLog b/ChangeLog
index 143d761..f65a7e0 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,4 +1,210 @@
 ----------------------------------------------------------------------
+Sun Jul 12 16:23:36 1998  Alexandre Julliard  <julliard@lrc.epfl.ch>
+
+	* [server/*] [scheduler/client.c] (new files)
+	  [scheduler/sysdeps.c] [scheduler/thread.c] [scheduler/process.c]
+	Beginnings of client/server communication for inter-process
+	synchronisation.
+
+Sat Jul 11 19:45:45 1998  Ulrich Weigand <weigand@informatik.uni-erlangen.de>
+
+	* [include/bitmap.h] [objects/bitmap.c] [objects/dib.c] 
+	  [objects/oembitmap.c]
+	Speed up DIB section handling by using pre-allocated colormap and 
+	XImage. Moved DIB section data out of general BITMAPOBJ structure.
+	Bugfix: GetDIBits32 would overwrite one byte beyond bitmap data.
+
+	* [if1632/shell.spec] [if1632/kernel.spec] [win32/kernel32.c]
+	More verbose error message if ThunkConnect fails.
+	Implemented KERNEL_475.
+
+	* [files/profile.c] [ole/ole2nls.c]
+	Minor bugfixes.
+
+	* [if1632/builtin.c] [if1632/kernel.spec] [include/task.h]
+	  [loader/ne/module.c] [loader/task.c]
+	Implemented KERNEL.THHOOK.
+
+	* [if1632/wprocs.spec] [include/process.h] [msdos/dpmi.c] [msdos/vxd.c]
+	Implemented Win32s VxD services (W32S.386).
+
+Sat Jul 11 17:52:23 1998  Huw D M Davies <daviesh@abacus.physics.ox.ac.uk>
+
+	* [graphics/x11drv/xfont.c] [graphics/x11drv/text.c] 
+	  [include/x11font.h]
+	Improve handling of rotated X11 fonts. Metrics/extents should now be
+	correct. ExtTextOut should behave better (still doesn't handle lpDx).
+
+	* [graphics/painting.c]
+	DrawFocusRect32: Don't do anything if width or height are zero.
+
+Sat Jul 11 15:21:35 1998  Andreas Mohr <100.30936@germany.net>
+
+	* [files/profile.c] [include/windows.h]
+	The length arguments of *Profile*() need to be treated
+	as UINTxx instead of INTxx.
+
+	* [graphics/env.c] [graphics/win16drv/init.c] [include/print.h]
+	  [misc/printdrv.c]
+	Many printer driver fixes/changes (many thanks go to Huw !).
+	Most printers should work again ;)
+
+	* [memory/atom.c]
+	Fixed ATOM_AddAtom to store atoms exactly like Windows.
+
+	* [*/*]
+	Fixed misc compiler warnings.
+
+Fri Jul 10 15:58:36 1998  Marcus Meissner <marcus@jet.franken.de>
+
+	* [files/drive.c]
+	Fixed GetDriveType16 to return DRIVE_REMOTE again.
+
+	* [loader/pe_image.c][loader/module.c]
+	Look for modules that have the same modulename or the same
+	filename (they sometimes differ).
+	Fixed up fixup_imports, removed one of the loops.
+
+	* [windows/winpos.c]
+	Added some NULL ptr checks. Needs more.
+
+	* [graphics/ddraw.c]
+	Some stubs added.
+
+	* [if1632/snoop.c]
+	Updated, made WINELIB compatible.
+
+Fri Jul 10 04:39:56 1998  Douglas Ridgway  <ridgway@winehq.com>
+
+	* [objects/enhmetafile.c] [relay32/gdi32.spec]
+	Small tweaks for documentation system.
+
+Thu Jul  9 22:00:18 1998  Eric Kohl <ekohl@abo.rhein-zeitung.de>
+
+	* [controls/commctrl.c][include/commctrl.h][relay32/comctl32.spec]
+	Fixed GetEffectiveClientRect, CreateToolbarEx and CreateMappedBitmap.
+	Added stub for ShowHideMenuCtl. Added some documentation.
+
+	* [documentation/common_controls]
+	Added and updated some information.
+
+	* [controls/toolbar.c][include/toolbar.h]
+	Added string support.
+
+	* [misc/shell.c][misc/shellord.c][relay32/shell.spec]
+	Changed names of undocumented functions to their real names and
+	fixed the export table.
+
+	* [controls/imagelist.c][relay32/comctl32.spec]
+	Added stub for ImageList_SetFilter.
+	Fixed some minor bugs and typos.
+
+	* [objects/font.c][include/windows.h][relay32/gdi32.spec]
+	Added stubs for GetCharacterPlacement32[A/W].
+
+	* [objects/region.c][relay32/gdi32.spec]
+	Added stub for UNDOCUMENTED GetRandomRgn.
+
+	* [controls/commctrl.c][controls/*.c][include/*.h]
+	Added dummy listview, pager, rebar, tooltips, trackbar and
+	treeview control. This keeps some programs from complaining.
+
+Thu Jul  9 11:23:58 1998  Rein Klazes <rklazes@casema.net>
+
+	* [graphics/painting.c] [graphics/*/init.c]
+	  [graphics/x11drv/graphics.c] [relay32/gdi32.spec]
+	  [if1632/gdi.spec] [include/gdi.h] [include/x11drv.h]
+	Implemented drawing bezier curves: PolyBezier16/32 and
+	PolyBezierTo16/32.
+
+	* [graphics/x11drv/graphics.c]
+	Improved accuracy of several graphic routines, especially the
+	drawing of pie's.
+
+	* [include/windows.h] [misc/spy.c]
+	Added 25 window messages related to programs based on MFC and/or OLE.
+
+Wed Jul  8 22:00:00 1998  James Juran  <jrj120@psu.edu>
+
+	* [documentation/wine.man]
+	Updated manpage.
+
+	* [wine.ini]
+	Added section for Win95Look=true (commented out by default).
+
+Wed Jul  8 06:23:19 1998  Matthew Becker <mbecker@glasscity.net>
+
+	* [misc/registry.c]
+	Fixed a crash in RegEnumValue32A when the dwType parameter is
+	NULL.
+
+	* [programs/regtest/regtest.c]
+	Improved the printing of errors.
+
+	* [misc/ntdll.c]
+	Added stub for RtlFormatCurrentUserKeyPath.
+
+	* [win32/console.c]
+	Added stub for ScrollConsoleScreenBuffer.
+
+Mon Jul  6 16:41:47 1998  Per Lindström <pelinstr@algonet.se>
+
+	* [include/windows.h] [relay32/kernel.spec] [win32/newfns.c]
+	Added stubs for SleepEx and TerminateProcess.
+
+	* [rc/README]
+	Corrected a grammatical error.
+
+Mon Jul  3 12:00:00 1998  Juergen Schmied <juergen.schmied@metronet.de>
+
+	* [misc/shellord.c]
+	Put some TRACE in.
+
+	* [memory/string.c]
+	Deleted unused variable in lstrcmpi32A.
+
+	* [include/windows.h][memory/string.c]
+	Added functions WideCharToLocal32 LocalToWideChar32 for
+	OLE-strings
+
+	* [include/shlobj.h][include/winerror.h][misc/shell.c]
+	  [ole/folders.c]
+	Added definition of internal class pidlmgr.
+	Changed definitions of EnumIDList, IShellFolder.
+	Added some OLE error constants.
+	Implemented EnumIDList, IShellFolder, IClassFactory,
+	PidlMgr, SHELL32_DllGetClassObject, SHGetDesktopFolder,
+	SHGetSpecialFolderLocation (half), SHGetPathFromIDList
+	(!!This stuff is not finished yet!!)
+
+	* [include/windows.h][misc/network][reley32/mpr.spec]
+	Added stubs for WNetConnectionDialog32[A|W|API].
+	Added struct LPCONNECTDLGSTRUCT32[A|W] and some constants.
+	Added some SetLastError(WN_NO_NETWORK) to the stubs.
+	Fixed bufferhandling in WNetCancelConnection
+	Added stub for MultinetGetErrorText[A|W]
+
+	* [ole/ole2nls.c]
+	Rewrote GetTimeFormat32A.
+
+Fri Jul  3 10:27:30 1998  Michael Poole <poole+@andrew.cmu.edu>
+
+	* [graphics/ddraw.c] [tsx11/X11_calls]
+	Implement IDirectDrawPalette_GetEntries.
+	Use CopyColormapAndFree to avoid erasing previously-set
+	palette entries.
+
+	* [graphics/ddraw.c] [include/ddraw.h]
+	  [tools/make_X11wrappers] [tsx11/X11_calls]
+	Provide a preliminary, not-yet-working framework for doing
+	DirectDraw via Xlib or XShm as well as DGA.
+
+Tue Jun 30 00:16:09 1998  Marcel Baur <mbaur@g26.ethz.ch>
+
+	* [ole/nls/*.nls]
+	Added remaining 22 locales (including arabic locales).
+
+----------------------------------------------------------------------
 Sun Jun 28 18:37:02 1998  Alexandre Julliard  <julliard@lrc.epfl.ch>
 
 	* [if1632/signal.c] [miscemu/instr.c] [memory/virtual.c]
@@ -4102,7 +4308,7 @@
 	Fixed pointer copy of args keywords array.
 
 ----------------------------------------------------------------------
-Tue May 20 19:20:23 1997  Pablo Saratxaga <srtxg@linux.chanae.stben.be>
+Tue May 20 19:20:23 1997  Pablo Saratxaga <srtxg@chanae.alphanet.ch>
 
 	* [resources/sysres_Es.rc]
 	Updated CHOOSE_FONT, CHOOSE_COLOR, EDITMENU for Spanish.
@@ -4544,7 +4750,7 @@
 	* [files/*]
 	Fix function names in error messages.
 
-Sat Feb 22 06:15:13 1997  Pablo Saratxaga <srtxg@chanae.stben.be>
+Sat Feb 22 06:15:13 1997  Pablo Saratxaga <srtxg@chanae.alphanet.ch>
 
 	* [windows/keyboard.c] [windows/message.c]
 	Support for more latin alphabet dead keys for iso-8859-{1,2,3,4,9}
diff --git a/Makefile.in b/Makefile.in
index 4f95dbd..e79008c 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -13,7 +13,6 @@
 # Main target to build
 
 MAIN_TARGET = @MAIN_TARGET@
-LIB_TARGET  = @LIB_TARGET@
 
 # Directories
 
@@ -44,6 +43,7 @@
 	relay32 \
 	resources \
 	scheduler \
+	server \
 	tsx11 \
 	win32 \
 	windows
@@ -90,6 +90,7 @@
 	relay32/relay32.o \
 	resources/resources.o \
 	scheduler/scheduler.o \
+	server/server.o \
 	tsx11/tsx11.o \
 	win32/win32.o \
 	windows/windows.o
@@ -101,6 +102,8 @@
 	if1632/if1632.o \
 	miscemu/miscemu.o
 
+LIB_TARGET  = @LIB_TARGET@
+
 all: $(MAIN_TARGET)
 
 @MAKE_RULES@
diff --git a/configure b/configure
index b008d4d..cbde259 100755
--- a/configure
+++ b/configure
@@ -17,6 +17,8 @@
 ac_help="$ac_help
   --enable-dll            build the Wine library as a DLL"
 ac_help="$ac_help
+  --disable-lib           build the Wine without building libwine.a"
+ac_help="$ac_help
   --disable-debug         compile out all debugging messages"
 ac_help="$ac_help
   --disable-trace         compile out TRACE messages"
@@ -576,6 +578,13 @@
 fi
 
 
+# Check whether --enable-lib or --disable-lib was given.
+if test "${enable_lib+set}" = set; then
+  enableval="$enable_lib"
+  if test "$enableval" = "no"; then LIB_TARGET="\$LIBOBJS"; fi
+fi
+
+
 
 # Check whether --enable-debug or --disable-debug was given.
 if test "${enable_debug+set}" = set; then
@@ -624,7 +633,7 @@
 
 
 echo $ac_n "checking whether ${MAKE-make} sets \${MAKE}""... $ac_c" 1>&6
-echo "configure:628: checking whether ${MAKE-make} sets \${MAKE}" >&5
+echo "configure:637: checking whether ${MAKE-make} sets \${MAKE}" >&5
 set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y%./+-%__p_%'`
 if eval "test \"`echo '$''{'ac_cv_prog_make_${ac_make}_set'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
@@ -653,7 +662,7 @@
 # Extract the first word of "gcc", so it can be a program name with args.
 set dummy gcc; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:657: checking for $ac_word" >&5
+echo "configure:666: checking for $ac_word" >&5
 if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -682,7 +691,7 @@
   # Extract the first word of "cc", so it can be a program name with args.
 set dummy cc; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:686: checking for $ac_word" >&5
+echo "configure:695: checking for $ac_word" >&5
 if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -730,7 +739,7 @@
 fi
 
 echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works""... $ac_c" 1>&6
-echo "configure:734: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5
+echo "configure:743: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5
 
 ac_ext=c
 # CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
@@ -740,11 +749,11 @@
 cross_compiling=$ac_cv_prog_cc_cross
 
 cat > conftest.$ac_ext <<EOF
-#line 744 "configure"
+#line 753 "configure"
 #include "confdefs.h"
 main(){return(0);}
 EOF
-if { (eval echo configure:748: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+if { (eval echo configure:757: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
   ac_cv_prog_cc_works=yes
   # If we can't run a trivial program, we are probably using a cross compiler.
   if (./conftest; exit) 2>/dev/null; then
@@ -764,12 +773,12 @@
   { echo "configure: error: installation or configuration problem: C compiler cannot create executables." 1>&2; exit 1; }
 fi
 echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler""... $ac_c" 1>&6
-echo "configure:768: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5
+echo "configure:777: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5
 echo "$ac_t""$ac_cv_prog_cc_cross" 1>&6
 cross_compiling=$ac_cv_prog_cc_cross
 
 echo $ac_n "checking whether we are using GNU C""... $ac_c" 1>&6
-echo "configure:773: checking whether we are using GNU C" >&5
+echo "configure:782: checking whether we are using GNU C" >&5
 if eval "test \"`echo '$''{'ac_cv_prog_gcc'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -778,7 +787,7 @@
   yes;
 #endif
 EOF
-if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:782: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then
+if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:791: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then
   ac_cv_prog_gcc=yes
 else
   ac_cv_prog_gcc=no
@@ -793,7 +802,7 @@
   ac_save_CFLAGS="$CFLAGS"
   CFLAGS=
   echo $ac_n "checking whether ${CC-cc} accepts -g""... $ac_c" 1>&6
-echo "configure:797: checking whether ${CC-cc} accepts -g" >&5
+echo "configure:806: checking whether ${CC-cc} accepts -g" >&5
 if eval "test \"`echo '$''{'ac_cv_prog_cc_g'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -821,7 +830,7 @@
 fi
 
 echo $ac_n "checking how to run the C preprocessor""... $ac_c" 1>&6
-echo "configure:825: checking how to run the C preprocessor" >&5
+echo "configure:834: checking how to run the C preprocessor" >&5
 # On Suns, sometimes $CPP names a directory.
 if test -n "$CPP" && test -d "$CPP"; then
   CPP=
@@ -836,13 +845,13 @@
   # On the NeXT, cc -E runs the code through the compiler's parser,
   # not just through cpp.
   cat > conftest.$ac_ext <<EOF
-#line 840 "configure"
+#line 849 "configure"
 #include "confdefs.h"
 #include <assert.h>
 Syntax Error
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:846: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:855: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out`
 if test -z "$ac_err"; then
   :
@@ -853,13 +862,13 @@
   rm -rf conftest*
   CPP="${CC-cc} -E -traditional-cpp"
   cat > conftest.$ac_ext <<EOF
-#line 857 "configure"
+#line 866 "configure"
 #include "confdefs.h"
 #include <assert.h>
 Syntax Error
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:863: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:872: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out`
 if test -z "$ac_err"; then
   :
@@ -886,7 +895,7 @@
 # Uses ac_ vars as temps to allow command line to override cache and checks.
 # --without-x overrides everything else, but does not touch the cache.
 echo $ac_n "checking for X""... $ac_c" 1>&6
-echo "configure:890: checking for X" >&5
+echo "configure:899: checking for X" >&5
 
 # Check whether --with-x or --without-x was given.
 if test "${with_x+set}" = set; then
@@ -948,12 +957,12 @@
 
   # First, try using that file with no special directory specified.
 cat > conftest.$ac_ext <<EOF
-#line 952 "configure"
+#line 961 "configure"
 #include "confdefs.h"
 #include <$x_direct_test_include>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:957: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:966: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out`
 if test -z "$ac_err"; then
   rm -rf conftest*
@@ -1022,14 +1031,14 @@
   ac_save_LIBS="$LIBS"
   LIBS="-l$x_direct_test_library $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 1026 "configure"
+#line 1035 "configure"
 #include "confdefs.h"
 
 int main() {
 ${x_direct_test_function}()
 ; return 0; }
 EOF
-if { (eval echo configure:1033: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+if { (eval echo configure:1042: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
   rm -rf conftest*
   LIBS="$ac_save_LIBS"
 # We can link X programs with no special library path.
@@ -1135,17 +1144,17 @@
     case "`(uname -sr) 2>/dev/null`" in
     "SunOS 5"*)
       echo $ac_n "checking whether -R must be followed by a space""... $ac_c" 1>&6
-echo "configure:1139: checking whether -R must be followed by a space" >&5
+echo "configure:1148: checking whether -R must be followed by a space" >&5
       ac_xsave_LIBS="$LIBS"; LIBS="$LIBS -R$x_libraries"
       cat > conftest.$ac_ext <<EOF
-#line 1142 "configure"
+#line 1151 "configure"
 #include "confdefs.h"
 
 int main() {
 
 ; return 0; }
 EOF
-if { (eval echo configure:1149: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+if { (eval echo configure:1158: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
   rm -rf conftest*
   ac_R_nospace=yes
 else
@@ -1161,14 +1170,14 @@
       else
 	LIBS="$ac_xsave_LIBS -R $x_libraries"
 	cat > conftest.$ac_ext <<EOF
-#line 1165 "configure"
+#line 1174 "configure"
 #include "confdefs.h"
 
 int main() {
 
 ; return 0; }
 EOF
-if { (eval echo configure:1172: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+if { (eval echo configure:1181: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
   rm -rf conftest*
   ac_R_space=yes
 else
@@ -1200,7 +1209,7 @@
     # libraries were built with DECnet support.  And karl@cs.umb.edu says
     # the Alpha needs dnet_stub (dnet does not exist).
     echo $ac_n "checking for dnet_ntoa in -ldnet""... $ac_c" 1>&6
-echo "configure:1204: checking for dnet_ntoa in -ldnet" >&5
+echo "configure:1213: checking for dnet_ntoa in -ldnet" >&5
 ac_lib_var=`echo dnet'_'dnet_ntoa | sed 'y%./+-%__p_%'`
 if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
@@ -1208,7 +1217,7 @@
   ac_save_LIBS="$LIBS"
 LIBS="-ldnet  $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 1212 "configure"
+#line 1221 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -1219,7 +1228,7 @@
 dnet_ntoa()
 ; return 0; }
 EOF
-if { (eval echo configure:1223: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+if { (eval echo configure:1232: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -1241,7 +1250,7 @@
 
     if test $ac_cv_lib_dnet_dnet_ntoa = no; then
       echo $ac_n "checking for dnet_ntoa in -ldnet_stub""... $ac_c" 1>&6
-echo "configure:1245: checking for dnet_ntoa in -ldnet_stub" >&5
+echo "configure:1254: checking for dnet_ntoa in -ldnet_stub" >&5
 ac_lib_var=`echo dnet_stub'_'dnet_ntoa | sed 'y%./+-%__p_%'`
 if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
@@ -1249,7 +1258,7 @@
   ac_save_LIBS="$LIBS"
 LIBS="-ldnet_stub  $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 1253 "configure"
+#line 1262 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -1260,7 +1269,7 @@
 dnet_ntoa()
 ; return 0; }
 EOF
-if { (eval echo configure:1264: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+if { (eval echo configure:1273: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -1289,12 +1298,12 @@
     # The nsl library prevents programs from opening the X display
     # on Irix 5.2, according to dickey@clark.net.
     echo $ac_n "checking for gethostbyname""... $ac_c" 1>&6
-echo "configure:1293: checking for gethostbyname" >&5
+echo "configure:1302: checking for gethostbyname" >&5
 if eval "test \"`echo '$''{'ac_cv_func_gethostbyname'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 1298 "configure"
+#line 1307 "configure"
 #include "confdefs.h"
 /* System header to define __stub macros and hopefully few prototypes,
     which can conflict with char gethostbyname(); below.  */
@@ -1317,7 +1326,7 @@
 
 ; return 0; }
 EOF
-if { (eval echo configure:1321: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+if { (eval echo configure:1330: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
   rm -rf conftest*
   eval "ac_cv_func_gethostbyname=yes"
 else
@@ -1338,7 +1347,7 @@
 
     if test $ac_cv_func_gethostbyname = no; then
       echo $ac_n "checking for gethostbyname in -lnsl""... $ac_c" 1>&6
-echo "configure:1342: checking for gethostbyname in -lnsl" >&5
+echo "configure:1351: checking for gethostbyname in -lnsl" >&5
 ac_lib_var=`echo nsl'_'gethostbyname | sed 'y%./+-%__p_%'`
 if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
@@ -1346,7 +1355,7 @@
   ac_save_LIBS="$LIBS"
 LIBS="-lnsl  $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 1350 "configure"
+#line 1359 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -1357,7 +1366,7 @@
 gethostbyname()
 ; return 0; }
 EOF
-if { (eval echo configure:1361: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+if { (eval echo configure:1370: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -1387,12 +1396,12 @@
     # -lsocket must be given before -lnsl if both are needed.
     # We assume that if connect needs -lnsl, so does gethostbyname.
     echo $ac_n "checking for connect""... $ac_c" 1>&6
-echo "configure:1391: checking for connect" >&5
+echo "configure:1400: checking for connect" >&5
 if eval "test \"`echo '$''{'ac_cv_func_connect'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 1396 "configure"
+#line 1405 "configure"
 #include "confdefs.h"
 /* System header to define __stub macros and hopefully few prototypes,
     which can conflict with char connect(); below.  */
@@ -1415,7 +1424,7 @@
 
 ; return 0; }
 EOF
-if { (eval echo configure:1419: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+if { (eval echo configure:1428: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
   rm -rf conftest*
   eval "ac_cv_func_connect=yes"
 else
@@ -1436,7 +1445,7 @@
 
     if test $ac_cv_func_connect = no; then
       echo $ac_n "checking for connect in -lsocket""... $ac_c" 1>&6
-echo "configure:1440: checking for connect in -lsocket" >&5
+echo "configure:1449: checking for connect in -lsocket" >&5
 ac_lib_var=`echo socket'_'connect | sed 'y%./+-%__p_%'`
 if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
@@ -1444,7 +1453,7 @@
   ac_save_LIBS="$LIBS"
 LIBS="-lsocket $X_EXTRA_LIBS $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 1448 "configure"
+#line 1457 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -1455,7 +1464,7 @@
 connect()
 ; return 0; }
 EOF
-if { (eval echo configure:1459: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+if { (eval echo configure:1468: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -1479,12 +1488,12 @@
 
     # gomez@mi.uni-erlangen.de says -lposix is necessary on A/UX.
     echo $ac_n "checking for remove""... $ac_c" 1>&6
-echo "configure:1483: checking for remove" >&5
+echo "configure:1492: checking for remove" >&5
 if eval "test \"`echo '$''{'ac_cv_func_remove'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 1488 "configure"
+#line 1497 "configure"
 #include "confdefs.h"
 /* System header to define __stub macros and hopefully few prototypes,
     which can conflict with char remove(); below.  */
@@ -1507,7 +1516,7 @@
 
 ; return 0; }
 EOF
-if { (eval echo configure:1511: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+if { (eval echo configure:1520: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
   rm -rf conftest*
   eval "ac_cv_func_remove=yes"
 else
@@ -1528,7 +1537,7 @@
 
     if test $ac_cv_func_remove = no; then
       echo $ac_n "checking for remove in -lposix""... $ac_c" 1>&6
-echo "configure:1532: checking for remove in -lposix" >&5
+echo "configure:1541: checking for remove in -lposix" >&5
 ac_lib_var=`echo posix'_'remove | sed 'y%./+-%__p_%'`
 if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
@@ -1536,7 +1545,7 @@
   ac_save_LIBS="$LIBS"
 LIBS="-lposix  $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 1540 "configure"
+#line 1549 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -1547,7 +1556,7 @@
 remove()
 ; return 0; }
 EOF
-if { (eval echo configure:1551: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+if { (eval echo configure:1560: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -1571,12 +1580,12 @@
 
     # BSDI BSD/OS 2.1 needs -lipc for XOpenDisplay.
     echo $ac_n "checking for shmat""... $ac_c" 1>&6
-echo "configure:1575: checking for shmat" >&5
+echo "configure:1584: checking for shmat" >&5
 if eval "test \"`echo '$''{'ac_cv_func_shmat'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 1580 "configure"
+#line 1589 "configure"
 #include "confdefs.h"
 /* System header to define __stub macros and hopefully few prototypes,
     which can conflict with char shmat(); below.  */
@@ -1599,7 +1608,7 @@
 
 ; return 0; }
 EOF
-if { (eval echo configure:1603: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+if { (eval echo configure:1612: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
   rm -rf conftest*
   eval "ac_cv_func_shmat=yes"
 else
@@ -1620,7 +1629,7 @@
 
     if test $ac_cv_func_shmat = no; then
       echo $ac_n "checking for shmat in -lipc""... $ac_c" 1>&6
-echo "configure:1624: checking for shmat in -lipc" >&5
+echo "configure:1633: checking for shmat in -lipc" >&5
 ac_lib_var=`echo ipc'_'shmat | sed 'y%./+-%__p_%'`
 if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
@@ -1628,7 +1637,7 @@
   ac_save_LIBS="$LIBS"
 LIBS="-lipc  $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 1632 "configure"
+#line 1641 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -1639,7 +1648,7 @@
 shmat()
 ; return 0; }
 EOF
-if { (eval echo configure:1643: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+if { (eval echo configure:1652: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -1672,7 +1681,7 @@
   # libraries we check for below, so use a different variable.
   #  --interran@uluru.Stanford.EDU, kb@cs.umb.edu.
   echo $ac_n "checking for IceConnectionNumber in -lICE""... $ac_c" 1>&6
-echo "configure:1676: checking for IceConnectionNumber in -lICE" >&5
+echo "configure:1685: checking for IceConnectionNumber in -lICE" >&5
 ac_lib_var=`echo ICE'_'IceConnectionNumber | sed 'y%./+-%__p_%'`
 if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
@@ -1680,7 +1689,7 @@
   ac_save_LIBS="$LIBS"
 LIBS="-lICE  $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 1684 "configure"
+#line 1693 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -1691,7 +1700,7 @@
 IceConnectionNumber()
 ; return 0; }
 EOF
-if { (eval echo configure:1695: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+if { (eval echo configure:1704: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -1720,7 +1729,7 @@
 # Extract the first word of "$ac_prog", so it can be a program name with args.
 set dummy $ac_prog; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:1724: checking for $ac_word" >&5
+echo "configure:1733: checking for $ac_word" >&5
 if eval "test \"`echo '$''{'ac_cv_prog_YACC'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -1752,7 +1761,7 @@
 # Extract the first word of "flex", so it can be a program name with args.
 set dummy flex; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:1756: checking for $ac_word" >&5
+echo "configure:1765: checking for $ac_word" >&5
 if eval "test \"`echo '$''{'ac_cv_prog_LEX'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -1785,7 +1794,7 @@
   *) ac_lib=l ;;
   esac
   echo $ac_n "checking for yywrap in -l$ac_lib""... $ac_c" 1>&6
-echo "configure:1789: checking for yywrap in -l$ac_lib" >&5
+echo "configure:1798: checking for yywrap in -l$ac_lib" >&5
 ac_lib_var=`echo $ac_lib'_'yywrap | sed 'y%./+-%__p_%'`
 if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
@@ -1793,7 +1802,7 @@
   ac_save_LIBS="$LIBS"
 LIBS="-l$ac_lib  $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 1797 "configure"
+#line 1806 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -1804,7 +1813,7 @@
 yywrap()
 ; return 0; }
 EOF
-if { (eval echo configure:1808: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+if { (eval echo configure:1817: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -1829,7 +1838,7 @@
 # Extract the first word of "ranlib", so it can be a program name with args.
 set dummy ranlib; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:1833: checking for $ac_word" >&5
+echo "configure:1842: checking for $ac_word" >&5
 if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -1866,7 +1875,7 @@
 # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
 # ./install, which can be erroneously created by make from ./install.sh.
 echo $ac_n "checking for a BSD compatible install""... $ac_c" 1>&6
-echo "configure:1870: checking for a BSD compatible install" >&5
+echo "configure:1879: checking for a BSD compatible install" >&5
 if test -z "$INSTALL"; then
 if eval "test \"`echo '$''{'ac_cv_path_install'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
@@ -1916,7 +1925,7 @@
 test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
 
 echo $ac_n "checking whether ln -s works""... $ac_c" 1>&6
-echo "configure:1920: checking whether ln -s works" >&5
+echo "configure:1929: checking whether ln -s works" >&5
 if eval "test \"`echo '$''{'ac_cv_prog_LN_S'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -1939,7 +1948,7 @@
 # Extract the first word of "c2man", so it can be a program name with args.
 set dummy c2man; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:1943: checking for $ac_word" >&5
+echo "configure:1952: checking for $ac_word" >&5
 if eval "test \"`echo '$''{'ac_cv_prog_C2MAN'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -1968,7 +1977,7 @@
 
 
 echo $ac_n "checking for i386_set_ldt in -li386""... $ac_c" 1>&6
-echo "configure:1972: checking for i386_set_ldt in -li386" >&5
+echo "configure:1981: checking for i386_set_ldt in -li386" >&5
 ac_lib_var=`echo i386'_'i386_set_ldt | sed 'y%./+-%__p_%'`
 if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
@@ -1976,7 +1985,7 @@
   ac_save_LIBS="$LIBS"
 LIBS="-li386  $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 1980 "configure"
+#line 1989 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -1987,7 +1996,7 @@
 i386_set_ldt()
 ; return 0; }
 EOF
-if { (eval echo configure:1991: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+if { (eval echo configure:2000: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -2015,7 +2024,7 @@
 fi
 
 echo $ac_n "checking for iswalnum in -lw""... $ac_c" 1>&6
-echo "configure:2019: checking for iswalnum in -lw" >&5
+echo "configure:2028: checking for iswalnum in -lw" >&5
 ac_lib_var=`echo w'_'iswalnum | sed 'y%./+-%__p_%'`
 if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
@@ -2023,7 +2032,7 @@
   ac_save_LIBS="$LIBS"
 LIBS="-lw  $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 2027 "configure"
+#line 2036 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -2034,7 +2043,7 @@
 iswalnum()
 ; return 0; }
 EOF
-if { (eval echo configure:2038: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+if { (eval echo configure:2047: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -2062,7 +2071,7 @@
 fi
 
 echo $ac_n "checking for XF86DGAQueryExtension in -lXxf86dga""... $ac_c" 1>&6
-echo "configure:2066: checking for XF86DGAQueryExtension in -lXxf86dga" >&5
+echo "configure:2075: checking for XF86DGAQueryExtension in -lXxf86dga" >&5
 ac_lib_var=`echo Xxf86dga'_'XF86DGAQueryExtension | sed 'y%./+-%__p_%'`
 if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
@@ -2070,7 +2079,7 @@
   ac_save_LIBS="$LIBS"
 LIBS="-lXxf86dga $X_LIBS -lXext -lX11 $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 2074 "configure"
+#line 2083 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -2081,7 +2090,7 @@
 XF86DGAQueryExtension()
 ; return 0; }
 EOF
-if { (eval echo configure:2085: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+if { (eval echo configure:2094: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -2109,17 +2118,17 @@
 do
 ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
-echo "configure:2113: checking for $ac_hdr" >&5
+echo "configure:2122: checking for $ac_hdr" >&5
 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 2118 "configure"
+#line 2127 "configure"
 #include "confdefs.h"
 #include <$ac_hdr>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:2123: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:2132: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out`
 if test -z "$ac_err"; then
   rm -rf conftest*
@@ -2147,12 +2156,12 @@
 
 
 echo $ac_n "checking "for Open Sound System"""... $ac_c" 1>&6
-echo "configure:2151: checking "for Open Sound System"" >&5
+echo "configure:2160: checking "for Open Sound System"" >&5
 if eval "test \"`echo '$''{'ac_cv_c_opensoundsystem'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 2156 "configure"
+#line 2165 "configure"
 #include "confdefs.h"
 
 	#ifdef HAVE_SYS_SOUNDCARD_H
@@ -2172,7 +2181,7 @@
 
 ; return 0; }
 EOF
-if { (eval echo configure:2176: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:2185: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   ac_cv_c_opensoundsystem="yes"
 else
@@ -2196,12 +2205,12 @@
 
 
 echo $ac_n "checking "for union semun"""... $ac_c" 1>&6
-echo "configure:2200: checking "for union semun"" >&5
+echo "configure:2209: checking "for union semun"" >&5
 if eval "test \"`echo '$''{'ac_cv_c_union_semun'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 2205 "configure"
+#line 2214 "configure"
 #include "confdefs.h"
 #include <sys/types.h>
 #include <sys/sem.h>
@@ -2209,7 +2218,7 @@
 union semun foo
 ; return 0; }
 EOF
-if { (eval echo configure:2213: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:2222: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   ac_cv_c_union_semun="yes"
 else
@@ -2237,7 +2246,7 @@
 then
   CFLAGS="$CFLAGS -Wall"
   echo $ac_n "checking "for gcc strength-reduce bug"""... $ac_c" 1>&6
-echo "configure:2241: checking "for gcc strength-reduce bug"" >&5
+echo "configure:2250: checking "for gcc strength-reduce bug"" >&5
 if eval "test \"`echo '$''{'ac_cv_c_gcc_strength_bug'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -2245,7 +2254,7 @@
   ac_cv_c_gcc_strength_bug="yes"
 else
   cat > conftest.$ac_ext <<EOF
-#line 2249 "configure"
+#line 2258 "configure"
 #include "confdefs.h"
 
 int main(void) {
@@ -2256,7 +2265,7 @@
   exit( Array[1] != -2 );
 }
 EOF
-if { (eval echo configure:2260: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit) 2>/dev/null
+if { (eval echo configure:2269: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit) 2>/dev/null
 then
   ac_cv_c_gcc_strength_bug="no"
 else
@@ -2279,7 +2288,7 @@
 
 
 echo $ac_n "checking "whether external symbols need an underscore prefix"""... $ac_c" 1>&6
-echo "configure:2283: checking "whether external symbols need an underscore prefix"" >&5
+echo "configure:2292: checking "whether external symbols need an underscore prefix"" >&5
 if eval "test \"`echo '$''{'ac_cv_c_extern_prefix'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -2291,14 +2300,14 @@
 	.long 0
 EOF
 cat > conftest.$ac_ext <<EOF
-#line 2295 "configure"
+#line 2304 "configure"
 #include "confdefs.h"
 extern int ac_test;
 int main() {
 if (ac_test) return 1
 ; return 0; }
 EOF
-if { (eval echo configure:2302: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+if { (eval echo configure:2311: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
   rm -rf conftest*
   ac_cv_c_extern_prefix="yes"
 else
@@ -2322,7 +2331,7 @@
 
 
 echo $ac_n "checking "whether assembler accepts .string"""... $ac_c" 1>&6
-echo "configure:2326: checking "whether assembler accepts .string"" >&5
+echo "configure:2335: checking "whether assembler accepts .string"" >&5
 if eval "test \"`echo '$''{'ac_cv_c_asm_string'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -2332,14 +2341,14 @@
 	.string "test"
 EOF
 cat > conftest.$ac_ext <<EOF
-#line 2336 "configure"
+#line 2345 "configure"
 #include "confdefs.h"
 
 int main() {
 
 ; return 0; }
 EOF
-if { (eval echo configure:2343: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+if { (eval echo configure:2352: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
   rm -rf conftest*
   ac_cv_c_asm_string="yes"
 else
@@ -2366,21 +2375,21 @@
 if test "$LIB_TARGET" = "libwine.so.1.0"
 then
   echo $ac_n "checking "whether we can build a dll"""... $ac_c" 1>&6
-echo "configure:2370: checking "whether we can build a dll"" >&5
+echo "configure:2379: checking "whether we can build a dll"" >&5
 if eval "test \"`echo '$''{'ac_cv_c_dll'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   saved_cflags=$CFLAGS
   CFLAGS="$CFLAGS -fPIC -shared -Wl,-soname,conftest.so.1.0"
   cat > conftest.$ac_ext <<EOF
-#line 2377 "configure"
+#line 2386 "configure"
 #include "confdefs.h"
 
 int main() {
 return 1
 ; return 0; }
 EOF
-if { (eval echo configure:2384: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+if { (eval echo configure:2393: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
   rm -rf conftest*
   ac_cv_c_dll="yes"
 else
@@ -2406,7 +2415,7 @@
 
 
 echo $ac_n "checking "for reentrant X libraries"""... $ac_c" 1>&6
-echo "configure:2410: checking "for reentrant X libraries"" >&5
+echo "configure:2419: checking "for reentrant X libraries"" >&5
 if eval "test \"`echo '$''{'wine_cv_x_reentrant'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -2450,12 +2459,12 @@
 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
+echo "configure:2463: checking for $ac_func" >&5
 if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 2459 "configure"
+#line 2468 "configure"
 #include "confdefs.h"
 /* System header to define __stub macros and hopefully few prototypes,
     which can conflict with char $ac_func(); below.  */
@@ -2478,7 +2487,7 @@
 
 ; return 0; }
 EOF
-if { (eval echo configure:2482: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+if { (eval echo configure:2491: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
   rm -rf conftest*
   eval "ac_cv_func_$ac_func=yes"
 else
@@ -2506,17 +2515,17 @@
 do
 ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
-echo "configure:2510: checking for $ac_hdr" >&5
+echo "configure:2519: checking for $ac_hdr" >&5
 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 2515 "configure"
+#line 2524 "configure"
 #include "confdefs.h"
 #include <$ac_hdr>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:2520: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:2529: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out`
 if test -z "$ac_err"; then
   rm -rf conftest*
@@ -2543,12 +2552,12 @@
 done
 
 echo $ac_n "checking whether stat file-mode macros are broken""... $ac_c" 1>&6
-echo "configure:2547: checking whether stat file-mode macros are broken" >&5
+echo "configure:2556: checking whether stat file-mode macros are broken" >&5
 if eval "test \"`echo '$''{'ac_cv_header_stat_broken'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 2552 "configure"
+#line 2561 "configure"
 #include "confdefs.h"
 #include <sys/types.h>
 #include <sys/stat.h>
@@ -2599,12 +2608,12 @@
 fi
 
 echo $ac_n "checking for working const""... $ac_c" 1>&6
-echo "configure:2603: checking for working const" >&5
+echo "configure:2612: checking for working const" >&5
 if eval "test \"`echo '$''{'ac_cv_c_const'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 2608 "configure"
+#line 2617 "configure"
 #include "confdefs.h"
 
 int main() {
@@ -2653,7 +2662,7 @@
 
 ; return 0; }
 EOF
-if { (eval echo configure:2657: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:2666: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   ac_cv_c_const=yes
 else
@@ -2674,12 +2683,12 @@
 fi
 
 echo $ac_n "checking for ANSI C header files""... $ac_c" 1>&6
-echo "configure:2678: checking for ANSI C header files" >&5
+echo "configure:2687: checking for ANSI C header files" >&5
 if eval "test \"`echo '$''{'ac_cv_header_stdc'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 2683 "configure"
+#line 2692 "configure"
 #include "confdefs.h"
 #include <stdlib.h>
 #include <stdarg.h>
@@ -2687,7 +2696,7 @@
 #include <float.h>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:2691: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:2700: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out`
 if test -z "$ac_err"; then
   rm -rf conftest*
@@ -2704,7 +2713,7 @@
 if test $ac_cv_header_stdc = yes; then
   # SunOS 4.x string.h does not declare mem*, contrary to ANSI.
 cat > conftest.$ac_ext <<EOF
-#line 2708 "configure"
+#line 2717 "configure"
 #include "confdefs.h"
 #include <string.h>
 EOF
@@ -2722,7 +2731,7 @@
 if test $ac_cv_header_stdc = yes; then
   # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
 cat > conftest.$ac_ext <<EOF
-#line 2726 "configure"
+#line 2735 "configure"
 #include "confdefs.h"
 #include <stdlib.h>
 EOF
@@ -2743,7 +2752,7 @@
   :
 else
   cat > conftest.$ac_ext <<EOF
-#line 2747 "configure"
+#line 2756 "configure"
 #include "confdefs.h"
 #include <ctype.h>
 #define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
@@ -2754,7 +2763,7 @@
 exit (0); }
 
 EOF
-if { (eval echo configure:2758: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit) 2>/dev/null
+if { (eval echo configure:2767: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit) 2>/dev/null
 then
   :
 else
@@ -2778,12 +2787,12 @@
 fi
 
 echo $ac_n "checking for size_t""... $ac_c" 1>&6
-echo "configure:2782: checking for size_t" >&5
+echo "configure:2791: checking for size_t" >&5
 if eval "test \"`echo '$''{'ac_cv_type_size_t'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 2787 "configure"
+#line 2796 "configure"
 #include "confdefs.h"
 #include <sys/types.h>
 #if STDC_HEADERS
@@ -2811,7 +2820,7 @@
 fi
 
 echo $ac_n "checking size of long long""... $ac_c" 1>&6
-echo "configure:2815: checking size of long long" >&5
+echo "configure:2824: checking size of long long" >&5
 if eval "test \"`echo '$''{'ac_cv_sizeof_long_long'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -2819,7 +2828,7 @@
   ac_cv_sizeof_long_long=0
 else
   cat > conftest.$ac_ext <<EOF
-#line 2823 "configure"
+#line 2832 "configure"
 #include "confdefs.h"
 #include <stdio.h>
 main()
@@ -2830,7 +2839,7 @@
   exit(0);
 }
 EOF
-if { (eval echo configure:2834: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit) 2>/dev/null
+if { (eval echo configure:2843: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit) 2>/dev/null
 then
   ac_cv_sizeof_long_long=`cat conftestval`
 else
@@ -2854,12 +2863,12 @@
 if test "$ac_cv_header_sys_vfs_h" = "yes"
 then
     echo $ac_n "checking "whether sys/vfs.h defines statfs"""... $ac_c" 1>&6
-echo "configure:2858: checking "whether sys/vfs.h defines statfs"" >&5
+echo "configure:2867: checking "whether sys/vfs.h defines statfs"" >&5
 if eval "test \"`echo '$''{'wine_cv_sys_vfs_has_statfs'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 2863 "configure"
+#line 2872 "configure"
 #include "confdefs.h"
 
 	#include <sys/types.h>
@@ -2876,7 +2885,7 @@
 	
 ; return 0; }
 EOF
-if { (eval echo configure:2880: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:2889: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   wine_cv_sys_vfs_has_statfs=yes
 else
@@ -2903,12 +2912,12 @@
 if test "$ac_cv_header_sys_statfs_h" = "yes"
 then
     echo $ac_n "checking "whether sys/statfs.h defines statfs"""... $ac_c" 1>&6
-echo "configure:2907: checking "whether sys/statfs.h defines statfs"" >&5
+echo "configure:2916: checking "whether sys/statfs.h defines statfs"" >&5
 if eval "test \"`echo '$''{'wine_cv_sys_statfs_has_statfs'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 2912 "configure"
+#line 2921 "configure"
 #include "confdefs.h"
 
 	#include <sys/types.h>
@@ -2923,7 +2932,7 @@
 	
 ; return 0; }
 EOF
-if { (eval echo configure:2927: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:2936: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   wine_cv_sys_statfs_has_statfs=yes
 else
@@ -2950,12 +2959,12 @@
 if test "$ac_cv_header_sys_mount_h" = "yes"
 then
     echo $ac_n "checking "whether sys/mount.h defines statfs"""... $ac_c" 1>&6
-echo "configure:2954: checking "whether sys/mount.h defines statfs"" >&5
+echo "configure:2963: checking "whether sys/mount.h defines statfs"" >&5
 if eval "test \"`echo '$''{'wine_cv_sys_mount_has_statfs'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 2959 "configure"
+#line 2968 "configure"
 #include "confdefs.h"
 
 	#include <sys/types.h>
@@ -2970,7 +2979,7 @@
 	
 ; return 0; }
 EOF
-if { (eval echo configure:2974: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:2983: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   wine_cv_sys_mount_has_statfs=yes
 else
@@ -2996,7 +3005,7 @@
 
 
 echo $ac_n "checking "for statfs.f_bfree"""... $ac_c" 1>&6
-echo "configure:3000: checking "for statfs.f_bfree"" >&5
+echo "configure:3009: checking "for statfs.f_bfree"" >&5
 if eval "test \"`echo '$''{'wine_cv_statfs_bfree'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -3005,7 +3014,7 @@
         wine_cv_statfs_bfree=no
     else
     	cat > conftest.$ac_ext <<EOF
-#line 3009 "configure"
+#line 3018 "configure"
 #include "confdefs.h"
 
 	#include <sys/types.h>
@@ -3032,7 +3041,7 @@
 	
 ; return 0; }
 EOF
-if { (eval echo configure:3036: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:3045: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   wine_cv_statfs_bfree=yes
 else
@@ -3056,7 +3065,7 @@
 fi
 
 echo $ac_n "checking "for statfs.f_bavail"""... $ac_c" 1>&6
-echo "configure:3060: checking "for statfs.f_bavail"" >&5
+echo "configure:3069: checking "for statfs.f_bavail"" >&5
 if eval "test \"`echo '$''{'wine_cv_statfs_bavail'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -3065,7 +3074,7 @@
         wine_cv_statfs_bavail=no
     else
     	cat > conftest.$ac_ext <<EOF
-#line 3069 "configure"
+#line 3078 "configure"
 #include "confdefs.h"
 
 	#include <sys/types.h>
@@ -3092,7 +3101,7 @@
 	
 ; return 0; }
 EOF
-if { (eval echo configure:3096: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:3105: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   wine_cv_statfs_bavail=yes
 else
@@ -3117,7 +3126,7 @@
 
 
 echo $ac_n "checking "for working sigaltstack"""... $ac_c" 1>&6
-echo "configure:3121: checking "for working sigaltstack"" >&5
+echo "configure:3130: checking "for working sigaltstack"" >&5
 if eval "test \"`echo '$''{'ac_cv_c_working_sigaltstack'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -3126,7 +3135,7 @@
 
 else
   cat > conftest.$ac_ext <<EOF
-#line 3130 "configure"
+#line 3139 "configure"
 #include "confdefs.h"
 
 	#include <stdio.h>
@@ -3164,7 +3173,7 @@
 	}
 	
 EOF
-if { (eval echo configure:3168: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit) 2>/dev/null
+if { (eval echo configure:3177: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit) 2>/dev/null
 then
   ac_cv_c_working_sigaltstack="yes"
 else
@@ -3331,6 +3340,7 @@
 relay32/Makefile
 resources/Makefile
 scheduler/Makefile
+server/Makefile
 tools/Makefile
 tools/wrc/Makefile
 tsx11/Makefile
@@ -3464,6 +3474,7 @@
 relay32/Makefile
 resources/Makefile
 scheduler/Makefile
+server/Makefile
 tools/Makefile
 tools/wrc/Makefile
 tsx11/Makefile
diff --git a/configure.in b/configure.in
index f33f07f..553ea5f 100644
--- a/configure.in
+++ b/configure.in
@@ -26,6 +26,10 @@
 [  --enable-dll            build the Wine library as a DLL],
 [if test "$enableval" = "no"; then : ; else LIB_TARGET="libwine.so.1.0"; fi])
 
+AC_ARG_ENABLE(lib,
+[  --disable-lib           build the Wine without building libwine.a],
+[if test "$enableval" = "no"; then LIB_TARGET="\$LIBOBJS"; fi])
+
 dnl AC_ARG_WITH(ipc,
 dnl [  --enable-ipc            use inter-process communication for DDE],
 dnl [if test "$enableval" = "no"; then : ; else OPTIONS="-DCONFIG_IPC"; fi])
@@ -470,6 +474,7 @@
 relay32/Makefile
 resources/Makefile
 scheduler/Makefile
+server/Makefile
 tools/Makefile
 tools/wrc/Makefile
 tsx11/Makefile
diff --git a/controls/Makefile.in b/controls/Makefile.in
index f36a382..a49d710 100644
--- a/controls/Makefile.in
+++ b/controls/Makefile.in
@@ -15,12 +15,18 @@
 	header.c \
 	icontitle.c \
 	listbox.c \
+	listview.c \
 	menu.c \
+	pager.c \
 	progress.c \
+	rebar.c \
 	scroll.c \
 	static.c \
 	status.c \
 	toolbar.c \
+	tooltips.c \
+	trackbar.c \
+	treeview.c \
 	uitools.c \
 	updown.c \
 	widgets.c
diff --git a/controls/comctl32undoc.c b/controls/comctl32undoc.c
index 88b57d5..baa7a71 100644
--- a/controls/comctl32undoc.c
+++ b/controls/comctl32undoc.c
@@ -5,7 +5,7 @@
  *
  * NOTES
  *     All of these functions are UNDOCUMENTED!! And I mean UNDOCUMENTED!!!!
- *     Do NOT rely on names of undocumented structures and types!!!
+ *     Do NOT rely on names or contents of undocumented structures and types!!!
  *     These functions are used by EXPLORER.EXE, IEXPLORE.EXE and
  *     COMCTL32.DLL (internally).
  *
@@ -16,6 +16,7 @@
  */
 
 #include <string.h>
+#include <stdlib.h>
 #include "windows.h"
 #include "heap.h"
 #include "debug.h"
@@ -50,64 +51,91 @@
 
 
 
+/**************************************************************************
+ * Alloc [COMCTL32.71]
+ *
+ */
 
-DWORD WINAPI
+LPVOID WINAPI
 COMCTL32_Alloc (DWORD dwParam)
 {
-    DWORD dwPtr;
+    LPVOID lpPtr;
 
-    dwPtr = (DWORD)HeapAlloc (GetProcessHeap (), HEAP_ZERO_MEMORY, dwParam);
+    lpPtr = HeapAlloc (GetProcessHeap (), HEAP_ZERO_MEMORY, dwParam);
 
-    TRACE (commctrl, "(0x%08lx) ret=0x%08lx\n", dwParam, dwPtr);
+    TRACE (commctrl, "(0x%08lx) ret=0x%08lx\n", dwParam, (DWORD)lpPtr);
 
-    return dwPtr;
+    return lpPtr;
 }
 
 
-DWORD WINAPI
-COMCTL32_ReAlloc (DWORD dwParam1, DWORD dwParam2)
+/**************************************************************************
+ * ReAlloc [COMCTL32.72]
+ *
+ */
+
+LPVOID WINAPI
+COMCTL32_ReAlloc (LPVOID dwParam1, DWORD dwParam2)
 {
-    DWORD dwPtr;
+    LPVOID dwPtr;
 
     if (dwParam1 == 0)
-	dwPtr = (DWORD)HeapAlloc (GetProcessHeap (), HEAP_ZERO_MEMORY,
-				  dwParam2);
+	dwPtr = HeapAlloc (GetProcessHeap (), HEAP_ZERO_MEMORY,
+			   dwParam2);
     else
-	dwPtr = (DWORD)HeapReAlloc (GetProcessHeap (), HEAP_ZERO_MEMORY,
-				    (LPVOID)dwParam1, dwParam2);
+	dwPtr = HeapReAlloc (GetProcessHeap (), HEAP_ZERO_MEMORY,
+			     dwParam1, dwParam2);
 
     TRACE (commctrl, "(0x%08lx 0x%08lx) ret=0x%08lx\n",
-	   dwParam1, dwParam2, dwPtr);
+	   (DWORD)dwParam1, dwParam2, (DWORD)dwPtr);
 
     return dwPtr;
 }
 
 
+/**************************************************************************
+ * Free [COMCTL32.73]
+ *
+ */
+
 DWORD WINAPI
-COMCTL32_Free (DWORD dwParam)
+COMCTL32_Free (LPVOID dwParam)
 {
-    TRACE (commctrl, "(0x%08lx)\n", dwParam);
-    HeapFree (GetProcessHeap (), 0, (LPVOID)dwParam);
+    TRACE (commctrl, "(0x%08lx)\n", (DWORD)dwParam);
+    HeapFree (GetProcessHeap (), 0, dwParam);
 
     return 0;
 }
 
 
+/**************************************************************************
+ * GetSize [COMCTL32.74]
+ *
+ */
+
 DWORD WINAPI
-COMCTL32_GetSize (DWORD dwParam)
+COMCTL32_GetSize (LPVOID dwParam)
 {
-    TRACE (commctrl, "(0x%08lx)\n", dwParam);
-    return (HeapSize (GetProcessHeap (), 0, (LPVOID)dwParam));
+    TRACE (commctrl, "(0x%08lx)\n", (DWORD)dwParam);
+    return (HeapSize (GetProcessHeap (), 0, dwParam));
 }
 
 
+/**************************************************************************
+ * DSA_Create [COMCTL32.320] Creates a dynamic string array
+ *
+ * PARAMS
+ *     dwParam1 [I]
+ *     dwParam2 [I]
+ */
 
 DWORD WINAPI
 DSA_Create (DWORD dwParam1, DWORD dwParam2)
 {
     LPDSA_DATA dsaPtr;
 
-    dsaPtr = (LPDSA_DATA)HeapAlloc (SystemHeap, HEAP_ZERO_MEMORY, sizeof(DSA_DATA));
+    dsaPtr = (LPDSA_DATA)HeapAlloc (GetProcessHeap (), HEAP_ZERO_MEMORY,
+				    sizeof(DSA_DATA));
     dsaPtr->dwInitial = dwParam1;
     dsaPtr->dwGrow = dwParam2;
 
@@ -129,11 +157,11 @@
     if (dsaPtr->ptrs) {
 	for (i = 0; i < dsaPtr->dwEntryCount; i++) {
 	    if (dsaPtr->ptrs[i])
-		HeapFree (SystemHeap, 0, (LPSTR)dsaPtr->ptrs[i]);
+		HeapFree (GetProcessHeap (), 0, (LPSTR)dsaPtr->ptrs[i]);
 	}
     }
 
-    HeapFree (SystemHeap, 0, dsaPtr);
+    HeapFree (GetProcessHeap (), 0, dsaPtr);
 
     return 0;
 }
@@ -142,10 +170,23 @@
 DWORD WINAPI
 DSA_GetItem (DWORD dwParam1, DWORD dwParam2, DWORD dwParam3)
 {
+    LPDSA_DATA dsaPtr = (LPDSA_DATA)dwParam1;
+
     FIXME (commctrl, "(0x%08lx 0x%08lx 0x%08lx): stub!\n",
 	   dwParam1, dwParam2, dwParam3);
 
-    return 0;
+    if (dsaPtr == NULL)
+	return 0;
+    if (dsaPtr->ptrs == NULL)
+	return 0;
+    if ((dwParam2 < 0) || (dwParam2 >= dsaPtr->dwEntryCount))
+	return 0;
+
+//    FIXME (commctrl, "\"%s\"\n", (LPSTR)dsaPtr->ptrs[dwParam2]);
+
+    return lstrcpy32A ((LPSTR)dwParam3, (LPSTR)dsaPtr->ptrs[dwParam2]);
+
+//    return 0;
 }
 
 
@@ -180,13 +221,13 @@
 	   dwParam1, dwParam2, (LPSTR)dwParam3);
 
     if (dsaPtr->ptrs == NULL) {
-	dsaPtr->ptrs = (LPSTR*)HeapAlloc (SystemHeap, HEAP_ZERO_MEMORY,
+	dsaPtr->ptrs = (LPSTR*)HeapAlloc (GetProcessHeap (), HEAP_ZERO_MEMORY,
 					  dsaPtr->dwInitial * sizeof(LPVOID));
 	dsaPtr->dwMaxCount = dsaPtr->dwInitial;
         dwIndex = 0;
 	len = lstrlen32A ((LPSTR)dwParam3);
 	dsaPtr->ptrs[dwIndex] =
-	    (LPSTR)HeapAlloc (SystemHeap, HEAP_ZERO_MEMORY, len+1);
+	    (LPSTR)HeapAlloc (GetProcessHeap (), HEAP_ZERO_MEMORY, len+1);
 	lstrcpy32A (dsaPtr->ptrs[dwIndex], (LPSTR)dwParam3);
     }
     else {
@@ -197,14 +238,26 @@
 		dwIndex = dsaPtr->dwEntryCount;
 		len = lstrlen32A ((LPSTR)dwParam3);
 		dsaPtr->ptrs[dwIndex] =
-		    (LPSTR)HeapAlloc (SystemHeap, HEAP_ZERO_MEMORY, len+1);
+		    (LPSTR)HeapAlloc (GetProcessHeap (), HEAP_ZERO_MEMORY, len+1);
 		lstrcpy32A (dsaPtr->ptrs[dwIndex], (LPSTR)dwParam3);
 	    }
 	    else {
-		FIXME (commctrl, "resizing array! stub!\n");
+		/* allocate new pointer list and copy all pointers */
+		LPSTR *lpOldPtrs = dsaPtr->ptrs;
+		dsaPtr->ptrs = (LPSTR*)HeapAlloc (SystemHeap, HEAP_ZERO_MEMORY,
+				(dsaPtr->dwInitial + dsaPtr->dwGrow) *
+				sizeof(LPVOID));
+		memcpy (dsaPtr->ptrs, lpOldPtrs,
+			dsaPtr->dwMaxCount * sizeof(LPVOID));
+		dsaPtr->dwMaxCount += dsaPtr->dwGrow;
+		HeapFree (GetProcessHeap (), 0, lpOldPtrs);
 
-		dwIndex = dwParam2;
-
+		/* add new string */
+		dwIndex = dsaPtr->dwEntryCount;
+		len = lstrlen32A ((LPSTR)dwParam3);
+		dsaPtr->ptrs[dwIndex] =
+		    (LPSTR)HeapAlloc (GetProcessHeap (), HEAP_ZERO_MEMORY, len+1);
+		lstrcpy32A (dsaPtr->ptrs[dwIndex], (LPSTR)dwParam3);
 	    }
 	}
 	else {
@@ -235,7 +288,7 @@
     if (dsaPtr->ptrs) {
 	if (dsaPtr->dwEntryCount == 1) {
 	    if (dsaPtr->ptrs[dwParam2])
-		HeapFree (SystemHeap, 0, dsaPtr->ptrs[dwParam2]);
+		HeapFree (GetProcessHeap (), 0, dsaPtr->ptrs[dwParam2]);
 	    dsaPtr->dwEntryCount--;
 	}
 	else {
@@ -243,11 +296,11 @@
 	    TRACE (commctrl, "complex delete!\n");
 
 	    if (dsaPtr->ptrs[dwParam2])
-		HeapFree (SystemHeap, 0, dsaPtr->ptrs[dwParam2]);
+		HeapFree (GetProcessHeap (), 0, dsaPtr->ptrs[dwParam2]);
 
 	    dsaPtr->dwEntryCount--;
 	    dsaPtr->ptrs = 
-		(LPSTR*)HeapAlloc (SystemHeap, HEAP_ZERO_MEMORY,
+		(LPSTR*)HeapAlloc (GetProcessHeap (), HEAP_ZERO_MEMORY,
 				   dsaPtr->dwEntryCount * sizeof(LPVOID));
 	    if (dwParam2 > 0) {
 		memcpy (&dsaPtr->ptrs[0], &oldPtrs[0],
@@ -258,11 +311,11 @@
 		memcpy (&dsaPtr->ptrs[dwParam2], &oldPtrs[dwParam2+1],
 			(dsaPtr->dwEntryCount - dwParam2) * sizeof(LPSTR));
 	    }
-	    HeapFree (SystemHeap, 0, oldPtrs);
+	    HeapFree (GetProcessHeap (), 0, oldPtrs);
 	}
 
 	if (dsaPtr->dwEntryCount == 0) {
-	    HeapFree (SystemHeap, 0, dsaPtr->ptrs);
+	    HeapFree (GetProcessHeap (), 0, dsaPtr->ptrs);
 	    dsaPtr->ptrs = NULL;
 	}
     }
@@ -341,9 +394,70 @@
 }
 
 
+/**************************************************************************
+ * DPA_CreateEx [COMCTL32.340]
+ *
+ */
+
+DWORD WINAPI
+DPA_CreateEx (DWORD dwParam1, DWORD dwParam2)
+{
+    FIXME (commctrl, "(0x%08lx 0x%08lx)\n",
+	   dwParam1, dwParam2);
+
+    return 0;
+}
+
+
+/**************************************************************************
+ * SendNotify [COMCTL32.341]
+ *
+ */
+
+DWORD WINAPI
+COMCTL32_SendNotify (DWORD dw1, DWORD dw2, DWORD dw3, DWORD dw4)
+{
+    FIXME (commctrl, "(0x%08lx 0x%08lx 0x%08lx 0x%08lx)\n",
+	   dw1, dw2, dw3, dw4);
+
+    return 0;
+}
+
+
+
+/**************************************************************************
+ * StrChrA [COMCTL32.350]
+ *
+ */
+
 LPSTR WINAPI
 COMCTL32_StrChrA (LPSTR lpString, CHAR cChar)
 {
     return strchr (lpString, cChar);
 }
 
+
+/**************************************************************************
+ * StrStrIA [COMCTL32.350]
+ *
+ * BUGS
+ *     This implementation is case sensitive, but it mustn't.
+ */
+
+LPSTR WINAPI
+COMCTL32_StrStrIA (LPSTR lpStr1, LPSTR lpStr2)
+{
+    return strstr (lpStr1, lpStr2);
+}
+
+
+/**************************************************************************
+ * StrToIntA [COMCTL32.357]
+ */
+
+INT32 WINAPI
+COMCTL32_StrToIntA (LPSTR lpString)
+{
+    return atoi(lpString);
+}
+
diff --git a/controls/commctrl.c b/controls/commctrl.c
index 8dddf5b..2838976 100644
--- a/controls/commctrl.c
+++ b/controls/commctrl.c
@@ -2,6 +2,7 @@
  * Common controls functions
  *
  * Copyright 1997 Dimitrie O. Paun
+ * Copyright 1998 Eric Kohl
  *
  */
 
@@ -9,43 +10,58 @@
 #include "heap.h"
 #include "commctrl.h"
 #include "header.h"
+#include "listview.h"
+#include "pager.h"
 #include "progress.h"
+#include "rebar.h"
 #include "status.h"
 #include "toolbar.h"
+#include "tooltips.h"
+#include "trackbar.h"
+#include "treeview.h"
 #include "updown.h"
 #include "debug.h"
 
 
 /***********************************************************************
  * DrawStatusText32A [COMCTL32.5][COMCTL32.27]
+ *
+ * Draws text with borders, like in a status bar.
+ *
+ * PARAMS
+ *     hdc   [I] handle to the window's display context
+ *     lprc  [I] pointer to a rectangle
+ *     text  [I] pointer to the text
+ *     style [I] 
  */
-void WINAPI DrawStatusText32A( HDC32 hdc, LPRECT32 lprc, LPCSTR text,
-                               UINT32 style )
+
+VOID WINAPI
+DrawStatusText32A (HDC32 hdc, LPRECT32 lprc, LPCSTR text, UINT32 style)
 {
     RECT32 r = *lprc;
     UINT32 border = BDR_SUNKENOUTER;
 
-    if(style==SBT_POPOUT)
+    if (style == SBT_POPOUT)
       border = BDR_RAISEDOUTER;
-    else if(style==SBT_NOBORDERS)
+    else if (style == SBT_NOBORDERS)
       border = 0;
 
-    DrawEdge32(hdc, &r, border, BF_RECT|BF_ADJUST|BF_MIDDLE);
+    DrawEdge32 (hdc, &r, border, BF_RECT|BF_ADJUST|BF_MIDDLE);
 
     /* now draw text */
     if (text) {
-      int oldbkmode = SetBkMode32(hdc, TRANSPARENT);
+      int oldbkmode = SetBkMode32 (hdc, TRANSPARENT);
       r.left += 3;
-      DrawText32A(hdc, text, lstrlen32A(text),
-		  &r, DT_LEFT|DT_VCENTER|DT_SINGLELINE);  
+      DrawText32A (hdc, text, lstrlen32A(text),
+		   &r, DT_LEFT|DT_VCENTER|DT_SINGLELINE);  
       if (oldbkmode != TRANSPARENT)
 	SetBkMode32(hdc, oldbkmode);
     }
-    
 }
 
+
 /***********************************************************************
- *           DrawStatusText32W   (COMCTL32.28)
+ * DrawStatusText32W [COMCTL32.28]
  */
 void WINAPI DrawStatusText32W( HDC32 hdc, LPRECT32 lprc, LPCWSTR text,
                                UINT32 style )
@@ -55,6 +71,7 @@
   HeapFree( GetProcessHeap(), 0, p );         
 }
 
+
 /***********************************************************************
  * CreateStatusWindow32A [COMCTL32.6][COMCTL32.21]
  */
@@ -67,6 +84,7 @@
 			   parent, wid, 0, 0);
 }
 
+
 /***********************************************************************
  *           CreateStatusWindow32W   (COMCTL32.22)
  */
@@ -102,8 +120,14 @@
 /***********************************************************************
  * InitCommonControls [COMCTL32.17]
  *
+ * Registers the common controls.
  *
+ * PARAMS
+ *     None.
  *
+ * NOTES
+ *     Calls InitCommonControlsEx.
+ *     InitCommonControlsEx should be used instead.
  */
 
 VOID WINAPI
@@ -121,8 +145,10 @@
 /***********************************************************************
  * InitCommonControlsEx [COMCTL32.81]
  *
+ * Registers the common controls.
  *
- *
+ * PARAMS
+ *     lpInitCtrls [I] pointer to a INITCOMMONCONTROLS structure.
  */
 
 BOOL32 WINAPI
@@ -141,25 +167,25 @@
 
     switch (lpInitCtrls->dwICC & dwMask) {
       case ICC_LISTVIEW_CLASSES:
-        TRACE (commctrl, "No listview class implemented!\n");
-        HEADER_Register();
+        LISTVIEW_Register ();
+        HEADER_Register ();
         break;
 
       case ICC_TREEVIEW_CLASSES:
-        TRACE (commctrl, "No treeview class implemented!\n");
-        TRACE (commctrl, "No tooltip class implemented!\n");
+        TREEVIEW_Register ();
+	TOOLTIPS_Register ();
         break;
 
       case ICC_BAR_CLASSES:
 	TOOLBAR_Register ();
 	STATUS_Register ();
-        TRACE (commctrl, "No trackbar class implemented!\n");
-        TRACE (commctrl, "No tooltip class implemented!\n");
+	TRACKBAR_Register ();
+	TOOLTIPS_Register ();
         break;
 
       case ICC_TAB_CLASSES:
         TRACE (commctrl, "No tab class implemented!\n");
-        TRACE (commctrl, "No tooltip class implemented!\n");
+	TOOLTIPS_Register ();
         UPDOWN_Register ();
         break;
 
@@ -192,7 +218,7 @@
         break;
 
       case ICC_COOL_CLASSES:
-        TRACE (commctrl, "No rebar class implemented!\n");
+	REBAR_Register ();
         break;
 
       case ICC_INTERNET_CLASSES:
@@ -200,7 +226,7 @@
         break;
 
       case ICC_PAGESCROLLER_CLASS:
-        TRACE (commctrl, "No page scroller class implemented!\n");
+	PAGER_Register ();
         break;
 
       case ICC_NATIVEFNTCTL_CLASS:
@@ -220,9 +246,14 @@
 /***********************************************************************
  * MenuHelp [COMCTL32.2]
  *
- *
- *
- *
+ * PARAMS
+ *     uMsg
+ *     wParam
+ *     lParam
+ *     hMainMenu
+ *     hInst
+ *     hwndStatus
+ *     lpwIDs
  */
 
 VOID WINAPI
@@ -244,7 +275,7 @@
             }
             else {
                 if (HIWORD(wParam) & MF_POPUP) {
-                    TRACE (commctrl, "popup menu selected!\n");
+		    FIXME (commctrl, "popup 0x%08x 0x%08lx\n", wParam, lParam);
 
                     szStatusText[0] = 0;
                 }
@@ -289,16 +320,25 @@
 			(WPARAM32)uStructSize, 0);
 
 	/* set bitmap and button size */
+	SendMessage32A (hwndTB, TB_SETBITMAPSIZE, 0,
+			MAKELPARAM((WORD)dyBitmap, (WORD)dxBitmap));
+#if 0
+	SendMessage32A (hwndTB, TB_SETBUTTONSIZE, 0,
+			MAKELONG((WORD)dyButton, (WORD)dxButton));
+#endif
 
 	/* add bitmaps */
-	tbab.hInst = hBMInst;
-	tbab.nID   = wBMID;
-	SendMessage32A (hwndTB, TB_ADDBITMAP,
-			(WPARAM32)nBitmaps, (LPARAM)&tbab);
+	if (nBitmaps > 0) {
+	    tbab.hInst = hBMInst;
+	    tbab.nID   = wBMID;
+	    SendMessage32A (hwndTB, TB_ADDBITMAP,
+			    (WPARAM32)nBitmaps, (LPARAM)&tbab);
+	}
 
 	/* add buttons */
-	SendMessage32A (hwndTB, TB_ADDBUTTONS32A,
-			(WPARAM32)iNumButtons, (LPARAM)lpButtons);
+	if (iNumButtons > 0)
+	    SendMessage32A (hwndTB, TB_ADDBUTTONS32A,
+			    (WPARAM32)iNumButtons, (LPARAM)lpButtons);
     }
 
     return hwndTB;
@@ -308,22 +348,100 @@
 /***********************************************************************
  * CreateMappedBitmap [COMCTL32.8]
  *
- *
- *
+ * PARAMS
+ *     hInstance
+ *     idBitmap
+ *     wFlags
+ *     lpColorMap
+ *     iNumMaps
  */
 
 HBITMAP32 WINAPI
 CreateMappedBitmap (HINSTANCE32 hInstance, INT32 idBitmap, UINT32 wFlags,
 		    LPCOLORMAP lpColorMap, INT32 iNumMaps)
 {
+    HGLOBAL32 hglb;
+    HRSRC32 hRsrc;
+    LPBITMAPINFOHEADER lpBitmap, lpBitmapInfo;
+    UINT32 nSize, nColorTableSize;
+    DWORD *pColorTable;
+    INT32 iColor, i, iMaps, nWidth, nHeight;
+    HDC32 hdcScreen;
     HBITMAP32 hbm;
+    LPCOLORMAP sysColorMap;
+    COLORMAP internalColorMap[4] =
+	{{0x000000, 0}, {0x808080, 0}, {0xC0C0C0, 0}, {0xFFFFFF, 0}};
 
-    FIXME (commctrl, "semi-stub!\n");
+    /* initialize pointer to colortable and default color table */
+    if (lpColorMap) {
+	iMaps = iNumMaps;
+	sysColorMap = lpColorMap;
+    }
+    else {
+	internalColorMap[0].to = GetSysColor32 (COLOR_BTNTEXT);
+	internalColorMap[1].to = GetSysColor32 (COLOR_BTNSHADOW);
+	internalColorMap[2].to = GetSysColor32 (COLOR_BTNFACE);
+	internalColorMap[3].to = GetSysColor32 (COLOR_BTNHIGHLIGHT);
+	iMaps = 4;
+	sysColorMap = (LPCOLORMAP)internalColorMap;
+    }
 
-    hbm = LoadBitmap32A (hInstance, MAKEINTRESOURCE32A(idBitmap));
+    hRsrc = FindResource32A (hInstance, (LPSTR)idBitmap, RT_BITMAP32A);
+    if (hRsrc == NULL)
+	return NULL;
+    hglb = LoadResource32 (hInstance, hRsrc);
+    if (hglb == NULL)
+	return NULL;
+    lpBitmap = (LPBITMAPINFOHEADER)LockResource32 (hglb);
+    if (lpBitmap == NULL)
+	return NULL;
+
+    nColorTableSize = (1 << lpBitmap->biBitCount);
+    nSize = lpBitmap->biSize + nColorTableSize * sizeof(RGBQUAD);
+    lpBitmapInfo = (LPBITMAPINFOHEADER)GlobalAlloc32 (GMEM_FIXED, nSize);
+    if (lpBitmapInfo == NULL)
+	return NULL;
+    RtlMoveMemory (lpBitmapInfo, lpBitmap, nSize);
+
+    pColorTable = (DWORD*)(((LPBYTE)lpBitmapInfo)+(UINT32)lpBitmapInfo->biSize);
+
+    for (iColor = 0; iColor < nColorTableSize; iColor++) {
+	for (i = 0; i < iMaps; i++) {
+	    if (pColorTable[iColor] == sysColorMap[i].from) {
+#if 0
+		if (wFlags & CBS_MASKED) {
+		    if (sysColorMap[i].to != COLOR_BTNTEXT)
+			pColorTable[iColor] = RGB(255, 255, 255);
+		}
+		else
+#endif
+		    pColorTable[iColor] = sysColorMap[i].to;
+		break;
+	    }
+	}
+    }
+
+    nWidth  = (INT32)lpBitmapInfo->biWidth;
+    nHeight = (INT32)lpBitmapInfo->biHeight;
+    hdcScreen = GetDC32 (NULL);
+    hbm = CreateCompatibleBitmap32 (hdcScreen, nWidth, nHeight);
+    if (hbm) {
+	HDC32 hdcDst = CreateCompatibleDC32 (hdcScreen);
+	HBITMAP32 hbmOld = SelectObject32 (hdcDst, hbm);
+	LPBYTE lpBits = (LPBYTE)(lpBitmap + 1);
+	lpBits += (1 << (lpBitmapInfo->biBitCount)) * sizeof(RGBQUAD);
+	StretchDIBits32 (hdcDst, 0, 0, nWidth, nHeight, 0, 0, nWidth, nHeight,
+		         lpBits, (LPBITMAPINFO)lpBitmapInfo, DIB_RGB_COLORS,
+		         SRCCOPY);
+	SelectObject32 (hdcDst, hbmOld);
+	DeleteDC32 (hdcDst);
+    }
+    ReleaseDC32 (NULL, hdcScreen);
+    GlobalFree32 ((HGLOBAL32)lpBitmapInfo);
+    FreeResource32 (hglb);
 
     return hbm;
- }
+}
 
 
 /***********************************************************************
@@ -358,28 +476,61 @@
 VOID WINAPI
 GetEffectiveClientRect (HWND32 hwnd, LPRECT32 lpRect, LPINT32 lpInfo)
 {
-    RECT32 rcClient, rcCtrl;
-    INT32  idCtrl, *lpRun;
+    RECT32 rcCtrl;
+    INT32  *lpRun;
+    HWND32 hwndCtrl;
 
-    TRACE (commctrl, "hwnd=0x%08lx lpRect=0x%08lx lpInfo=0x%08lx\n",
+    TRACE (commctrl, "(0x%08lx 0x%08lx 0x%08lx)\n",
 	   (DWORD)hwnd, (DWORD)lpRect, (DWORD)lpInfo);
 
-    GetClientRect32 (hwnd, &rcClient);
-#if 0
+    GetClientRect32 (hwnd, lpRect);
     lpRun = lpInfo;
 
     do {
-	lpRun += 3;
-	idCtrl = *lpRun;
-	if (idCtrl) {
-	    TRACE (commctrl, "control id 0x%x\n", idCtrl);
-	    GetWindowRect32 (GetDlgItem32 (hwnd, idCtrl), &rcCtrl);
+	lpRun += 2;
+	if (*lpRun == 0)
+	    return;
+	lpRun++;
+	hwndCtrl = GetDlgItem32 (hwnd, *lpRun);
+	if (GetWindowLong32A (hwndCtrl, GWL_STYLE) & WS_VISIBLE) {
+	    TRACE (commctrl, "control id 0x%x\n", *lpRun);
+	    GetWindowRect32 (hwndCtrl, &rcCtrl);
 	    MapWindowPoints32 (NULL, hwnd, (LPPOINT32)&rcCtrl, 2);
-	    SubtractRect32 (&rcClient, &rcClient, &rcCtrl);
-	    lpRun++;
+	    SubtractRect32 (lpRect, lpRect, &rcCtrl);
 	}
-    } while (idCtrl);
+	lpRun++;
+    } while (*lpRun);
+}
+
+
+/***********************************************************************
+ * ShowHideMenuCtl [COMCTL32.3]
+ *
+ * PARAMS
+ *     hwnd   [I] handle to the client window.
+ *     uFlags [I] menu command id
+ *     lpInfo [I] pointer to an array of integers
+ *
+ * NOTES
+ */
+
+BOOL32 WINAPI
+ShowHideMenuCtl (HWND32 hwnd, UINT32 uFlags, LPINT32 lpInfo)
+{
+    FIXME (commctrl, "(0x%08x 0x%08x %p): empty stub!\n",
+	   hwnd, uFlags, lpInfo);
+#if 0
+    if (GetMenuState (lpInfo[1], uFlags, MF_BYCOMMAND) & MFS_CHECKED) {
+	/* checked -> hide control */
+
+    }
+    else {
+	/* not checked -> show control */
+
+    }
+
 #endif
-    CopyRect32 (lpRect, &rcClient);
+
+    return FALSE;
 }
 
diff --git a/controls/listview.c b/controls/listview.c
new file mode 100644
index 0000000..d2d4622
--- /dev/null
+++ b/controls/listview.c
@@ -0,0 +1,245 @@
+/*
+ * Listview control
+ *
+ * Copyright 1998 Eric Kohl
+ *
+ * NOTES
+ *   This is just a dummy control. An author is needed! Any volunteers?
+ *   I will only improve this control once in a while.
+ *     Eric <ekohl@abo.rhein-zeitung.de>
+ *
+ * TODO:
+ *   - All messages.
+ *   - All notifications.
+ */
+
+#include "windows.h"
+#include "commctrl.h"
+#include "listview.h"
+#include "heap.h"
+#include "win.h"
+#include "debug.h"
+
+
+#define LISTVIEW_GetInfoPtr(wndPtr) ((LISTVIEW_INFO *)wndPtr->wExtra[0])
+
+
+static VOID
+LISTVIEW_Refresh (WND *wndPtr, HDC32 hdc)
+{
+    LISTVIEW_INFO *infoPtr = LISTVIEW_GetInfoPtr(wndPtr);
+
+
+
+}
+
+
+
+static LRESULT
+LISTVIEW_SetBkColor (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
+{
+    LISTVIEW_INFO *infoPtr = LISTVIEW_GetInfoPtr(wndPtr);
+
+    if (!(infoPtr)) return FALSE;
+
+    /* set background color */
+    infoPtr->clrBk = (COLORREF)lParam;
+
+    return TRUE;
+}
+
+
+static LRESULT
+LISTVIEW_SetImageList (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
+{
+    LISTVIEW_INFO *infoPtr = LISTVIEW_GetInfoPtr(wndPtr);
+
+    fprintf (stderr, "LISTVIEW: SetImageList (0x%08x 0x%08lx)\n",
+	     wParam, lParam);
+
+    return 0;
+}
+
+
+static LRESULT
+LISTVIEW_Create (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
+{
+    LISTVIEW_INFO *infoPtr = LISTVIEW_GetInfoPtr(wndPtr);
+
+    /* initialize info structure */
+    infoPtr->clrBk = CLR_NONE;
+
+    return 0;
+}
+
+
+static LRESULT
+LISTVIEW_Destroy (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
+{
+    LISTVIEW_INFO *infoPtr = LISTVIEW_GetInfoPtr(wndPtr);
+
+
+    return 0;
+}
+
+
+static LRESULT
+LISTVIEW_EraseBackground (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
+{
+    LISTVIEW_INFO *infoPtr = LISTVIEW_GetInfoPtr(wndPtr);
+
+    if (infoPtr->clrBk == CLR_NONE) {
+	return SendMessage32A (GetParent32 (wndPtr->hwndSelf),
+			       WM_ERASEBKGND, wParam, lParam);
+    }
+    else {
+	RECT32 rect;
+	HBRUSH32 hBrush = CreateSolidBrush32 (infoPtr->clrBk);
+	GetClientRect32 (wndPtr->hwndSelf, &rect);
+	FillRect32 ((HDC32)wParam, &rect, hBrush);
+	DeleteObject32 (hBrush);
+	return FALSE;
+    }
+    return FALSE;
+}
+
+
+static LRESULT
+LISTVIEW_NCCreate (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
+{
+    LISTVIEW_INFO *infoPtr;
+
+    /* allocate memory for info structure */
+    infoPtr = (LISTVIEW_INFO *)HeapAlloc (GetProcessHeap (), HEAP_ZERO_MEMORY,
+                                   sizeof(LISTVIEW_INFO));
+    wndPtr->wExtra[0] = (DWORD)infoPtr;
+
+    if (infoPtr == NULL) {
+	ERR (listview, "could not allocate info memory!\n");
+	return 0;
+    }
+
+    if ((LISTVIEW_INFO*)wndPtr->wExtra[0] != infoPtr) {
+	ERR (listview, "pointer assignment error!\n");
+	return 0;
+    }
+
+    return DefWindowProc32A (wndPtr->hwndSelf, WM_NCCREATE, wParam, lParam);
+}
+
+
+static LRESULT
+LISTVIEW_NCDestroy (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
+{
+    LISTVIEW_INFO *infoPtr = LISTVIEW_GetInfoPtr(wndPtr);
+
+
+
+
+    /* free list view info data */
+    HeapFree (GetProcessHeap (), 0, infoPtr);
+
+    return 0;
+}
+
+
+static LRESULT
+LISTVIEW_Paint (WND *wndPtr, WPARAM32 wParam)
+{
+    HDC32 hdc;
+    PAINTSTRUCT32 ps;
+
+    hdc = wParam==0 ? BeginPaint32 (wndPtr->hwndSelf, &ps) : (HDC32)wParam;
+    LISTVIEW_Refresh (wndPtr, hdc);
+    if (!wParam)
+	EndPaint32 (wndPtr->hwndSelf, &ps);
+    return 0;
+}
+
+
+LRESULT WINAPI
+ListviewWindowProc (HWND32 hwnd, UINT32 uMsg, WPARAM32 wParam, LPARAM lParam)
+{
+    WND *wndPtr = WIN_FindWndPtr(hwnd);
+
+    switch (uMsg)
+    {
+
+	case LVM_SETBKCOLOR:
+	    return LISTVIEW_SetBkColor (wndPtr, wParam, lParam);
+
+	
+	case LVM_SETIMAGELIST:
+	    return LISTVIEW_SetImageList (wndPtr, wParam, lParam);
+
+
+
+
+//	case WM_CHAR:
+//	case WM_COMMAND:
+
+	case WM_CREATE:
+	    return LISTVIEW_Create (wndPtr, wParam, lParam);
+
+	case WM_DESTROY:
+	    return LISTVIEW_Destroy (wndPtr, wParam, lParam);
+
+	case WM_ERASEBKGND:
+	    return LISTVIEW_EraseBackground (wndPtr, wParam, lParam);
+
+//	case WM_GETDLGCODE:
+//	case WM_GETFONT:
+//	case WM_HSCROLL:
+
+//	case WM_MOUSEMOVE:
+//	    return LISTVIEW_MouseMove (wndPtr, wParam, lParam);
+
+	case WM_NCCREATE:
+	    return LISTVIEW_NCCreate (wndPtr, wParam, lParam);
+
+	case WM_NCDESTROY:
+	    return LISTVIEW_NCDestroy (wndPtr, wParam, lParam);
+
+//	case WM_NOTIFY:
+
+	case WM_PAINT:
+	    return LISTVIEW_Paint (wndPtr, wParam);
+
+//	case WM_RBUTTONDOWN:
+//	case WM_SETFOCUS:
+//	case WM_SETFONT:
+//	case WM_SETREDRAW:
+//	case WM_TIMER:
+//	case WM_VSCROLL:
+//	case WM_WINDOWPOSCHANGED:
+//	case WM_WININICHANGE:
+
+	default:
+	    if (uMsg >= WM_USER)
+		ERR (listview, "unknown msg %04x wp=%08x lp=%08lx\n",
+		     uMsg, wParam, lParam);
+	    return DefWindowProc32A (hwnd, uMsg, wParam, lParam);
+    }
+    return 0;
+}
+
+
+void
+LISTVIEW_Register (void)
+{
+    WNDCLASS32A wndClass;
+
+    if (GlobalFindAtom32A (WC_LISTVIEW32A)) return;
+
+    ZeroMemory (&wndClass, sizeof(WNDCLASS32A));
+    wndClass.style         = CS_GLOBALCLASS | CS_DBLCLKS;
+    wndClass.lpfnWndProc   = (WNDPROC32)ListviewWindowProc;
+    wndClass.cbClsExtra    = 0;
+    wndClass.cbWndExtra    = sizeof(LISTVIEW_INFO *);
+    wndClass.hCursor       = LoadCursor32A (0, IDC_ARROW32A);
+    wndClass.hbrBackground = (HBRUSH32)(COLOR_WINDOW + 1);
+    wndClass.lpszClassName = WC_LISTVIEW32A;
+ 
+    RegisterClass32A (&wndClass);
+}
+
diff --git a/controls/pager.c b/controls/pager.c
new file mode 100644
index 0000000..e85e60a
--- /dev/null
+++ b/controls/pager.c
@@ -0,0 +1,75 @@
+/*
+ * Pager control
+ *
+ * Copyright 1998 Eric Kohl
+ *
+ * NOTES
+ *   This is just a dummy control. An author is needed! Any volunteers?
+ *   I will only improve this control once in a while.
+ *     Eric <ekohl@abo.rhein-zeitung.de>
+ *
+ * TODO:
+ *   - All messages.
+ *   - All notifications.
+ */
+
+#include "windows.h"
+#include "commctrl.h"
+#include "pager.h"
+#include "heap.h"
+#include "win.h"
+#include "debug.h"
+
+
+#define PAGER_GetInfoPtr(wndPtr) ((PAGER_INFO *)wndPtr->wExtra[0])
+
+
+LRESULT WINAPI
+PagerWindowProc (HWND32 hwnd, UINT32 uMsg, WPARAM32 wParam, LPARAM lParam)
+{
+    WND *wndPtr = WIN_FindWndPtr(hwnd);
+
+    switch (uMsg)
+    {
+//	case WM_CREATE:
+//	    return PAGER_Create (wndPtr, wParam, lParam);
+
+//	case WM_DESTROY:
+//	    return PAGER_Destroy (wndPtr, wParam, lParam);
+
+//	case WM_MOUSEMOVE:
+//	    return PAGER_MouseMove (wndPtr, wParam, lParam);
+
+//	case WM_PAINT:
+//	    return PAGER_Paint (wndPtr, wParam);
+
+
+	default:
+	    if (uMsg >= WM_USER)
+		ERR (pager, "unknown msg %04x wp=%08x lp=%08lx\n",
+		     uMsg, wParam, lParam);
+	    return DefWindowProc32A (hwnd, uMsg, wParam, lParam);
+    }
+    return 0;
+}
+
+
+void
+PAGER_Register (void)
+{
+    WNDCLASS32A wndClass;
+
+    if (GlobalFindAtom32A (WC_PAGESCROLLER32A)) return;
+
+    ZeroMemory (&wndClass, sizeof(WNDCLASS32A));
+    wndClass.style         = CS_GLOBALCLASS | CS_DBLCLKS | CS_SAVEBITS;
+    wndClass.lpfnWndProc   = (WNDPROC32)PagerWindowProc;
+    wndClass.cbClsExtra    = 0;
+    wndClass.cbWndExtra    = sizeof(PAGER_INFO *);
+    wndClass.hCursor       = LoadCursor32A (0, IDC_ARROW32A);
+    wndClass.hbrBackground = 0;
+    wndClass.lpszClassName = WC_PAGESCROLLER32A;
+ 
+    RegisterClass32A (&wndClass);
+}
+
diff --git a/controls/rebar.c b/controls/rebar.c
new file mode 100644
index 0000000..9280cf9
--- /dev/null
+++ b/controls/rebar.c
@@ -0,0 +1,82 @@
+/*
+ * Rebar control
+ *
+ * Copyright 1998 Eric Kohl
+ *
+ * NOTES
+ *   This is just a dummy control. An author is needed! Any volunteers?
+ *   I will only improve this control once in a while.
+ *     Eric <ekohl@abo.rhein-zeitung.de>
+ *
+ * TODO:
+ *   - All messages.
+ *   - All notifications.
+ */
+
+#include "windows.h"
+#include "commctrl.h"
+#include "rebar.h"
+#include "heap.h"
+#include "win.h"
+#include "debug.h"
+
+
+#define REBAR_GetInfoPtr(wndPtr) ((REBAR_INFO *)wndPtr->wExtra[0])
+
+
+LRESULT WINAPI
+RebarWindowProc (HWND32 hwnd, UINT32 uMsg, WPARAM32 wParam, LPARAM lParam)
+{
+    WND *wndPtr = WIN_FindWndPtr(hwnd);
+
+    switch (uMsg)
+    {
+//	case WM_CREATE:
+//	    return REBAR_Create (wndPtr, wParam, lParam);
+
+//	case WM_DESTROY:
+//	    return REBAR_Destroy (wndPtr, wParam, lParam);
+
+//	case WM_GETFONT:
+
+//	case WM_MOUSEMOVE:
+//	    return REBAR_MouseMove (wndPtr, wParam, lParam);
+
+//	case WM_PAINT:
+//	    return REBAR_Paint (wndPtr, wParam);
+
+//	case WM_SETFONT:
+
+//	case WM_TIMER:
+
+//	case WM_WININICHANGE:
+
+	default:
+	    if (uMsg >= WM_USER)
+		ERR (rebar, "unknown msg %04x wp=%08x lp=%08lx\n",
+		     uMsg, wParam, lParam);
+	    return DefWindowProc32A (hwnd, uMsg, wParam, lParam);
+    }
+    return 0;
+}
+
+
+void
+REBAR_Register (void)
+{
+    WNDCLASS32A wndClass;
+
+    if (GlobalFindAtom32A (REBARCLASSNAME32A)) return;
+
+    ZeroMemory (&wndClass, sizeof(WNDCLASS32A));
+    wndClass.style         = CS_GLOBALCLASS | CS_DBLCLKS | CS_SAVEBITS;
+    wndClass.lpfnWndProc   = (WNDPROC32)RebarWindowProc;
+    wndClass.cbClsExtra    = 0;
+    wndClass.cbWndExtra    = sizeof(REBAR_INFO *);
+    wndClass.hCursor       = LoadCursor32A (0, IDC_ARROW32A);
+    wndClass.hbrBackground = 0;
+    wndClass.lpszClassName = REBARCLASSNAME32A;
+ 
+    RegisterClass32A (&wndClass);
+}
+
diff --git a/controls/toolbar.c b/controls/toolbar.c
index 4f3ce96..b562df1 100644
--- a/controls/toolbar.c
+++ b/controls/toolbar.c
@@ -3,13 +3,6 @@
  *
  * Copyright 1998 Eric Kohl
  *
- * NOTES
- *   PLEASE don't try to improve or change this code right now. Many
- *   features are still missing, but I'm working on it. I want to avoid
- *   any confusion. This note will be removed as soon as most of the
- *   features are implemented.
- *     Eric <ekohl@abo.rhein-zeitung.de>
- *
  * TODO:
  *   - Bitmap drawing.
  *   - Button wrapping.
@@ -69,6 +62,54 @@
 
 
 static void
+TOOLBAR_DrawString (TOOLBAR_INFO *infoPtr, TBUTTON_INFO *btnPtr,
+		    HDC32 hdc, INT32 nState)
+{
+    RECT32 rcText = btnPtr->rect;
+    HFONT32 hOldFont;
+    INT32   nOldBkMode;
+
+    /* draw text */
+    if ((btnPtr->iString > -1) && (btnPtr->iString < infoPtr->nNumStrings)) {
+
+	InflateRect32 (&rcText, -3, -3);
+	rcText.top += infoPtr->nBitmapHeight;
+	if (nState & (TBSTATE_PRESSED | TBSTATE_CHECKED))
+	    OffsetRect32 (&rcText, 1, 1);
+
+	hOldFont = SelectObject32 (hdc, infoPtr->hFont);
+	nOldBkMode = SetBkMode32 (hdc, TRANSPARENT);
+	if (!(nState & TBSTATE_ENABLED)) {
+	    COLORREF clrOld = 
+		SetTextColor32 (hdc, GetSysColor32 (COLOR_3DHILIGHT));
+	    OffsetRect32 (&rcText, 1, 1);
+	    DrawText32A (hdc, infoPtr->strings[btnPtr->iString], -1, &rcText,
+			 DT_CENTER);
+	    SetTextColor32 (hdc, GetSysColor32 (COLOR_3DSHADOW));
+	    OffsetRect32 (&rcText, -1, -1);
+	    DrawText32A (hdc, infoPtr->strings[btnPtr->iString], -1, &rcText,
+			 DT_CENTER);
+	    SetTextColor32 (hdc, clrOld);
+	}
+	else if (nState & TBSTATE_INDETERMINATE) {
+	    COLORREF clrOld = 
+		SetTextColor32 (hdc, GetSysColor32 (COLOR_3DSHADOW));
+	    DrawText32A (hdc, infoPtr->strings[btnPtr->iString], -1, &rcText,
+			 DT_CENTER);
+	    SetTextColor32 (hdc, clrOld);
+	}
+	else
+	    DrawText32A (hdc, infoPtr->strings[btnPtr->iString], -1, &rcText,
+			 DT_CENTER);
+
+	SelectObject32 (hdc, hOldFont);
+	if (nOldBkMode != TRANSPARENT)
+	    SetBkMode32 (hdc, nOldBkMode);
+    }
+}
+
+
+static void
 TOOLBAR_DrawButton (WND *wndPtr, TBUTTON_INFO *btnPtr, HDC32 hdc)
 {
     TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr(wndPtr);
@@ -92,6 +133,7 @@
 
 //	ImageList_Draw (infoPtr->himlDis, btnPtr->iBitmap, hdc,
 //			rc.left+1, rc.top+1, ILD_NORMAL);
+	TOOLBAR_DrawString (infoPtr, btnPtr, hdc, btnPtr->fsState);
 	return;
     }
 
@@ -101,6 +143,7 @@
 		    BF_RECT | BF_MIDDLE | BF_ADJUST);
 	ImageList_Draw (infoPtr->himlDef, btnPtr->iBitmap, hdc,
 			rc.left+2, rc.top+2, ILD_NORMAL);
+	TOOLBAR_DrawString (infoPtr, btnPtr, hdc, btnPtr->fsState);
 	return;
     }
 
@@ -117,6 +160,7 @@
 	SelectObject32 (hdc, hbr);
 	ImageList_Draw (infoPtr->himlDef, btnPtr->iBitmap, hdc,
 			rc.left+2, rc.top+2, ILD_NORMAL);
+	TOOLBAR_DrawString (infoPtr, btnPtr, hdc, btnPtr->fsState);
 	return;
     }
 
@@ -132,6 +176,7 @@
 	SelectObject32 (hdc, hbr);
 //	ImageList_Draw (infoPtr->himlDis, btnPtr->iBitmap, hdc,
 //			rc.left+1, rc.top+1, ILD_NORMAL);
+	TOOLBAR_DrawString (infoPtr, btnPtr, hdc, btnPtr->fsState);
 	return;
     }
 
@@ -140,10 +185,10 @@
 		BF_SOFT | BF_RECT | BF_MIDDLE | BF_ADJUST);
     ImageList_Draw (infoPtr->himlDef, btnPtr->iBitmap, hdc,
 		    rc.left+1, rc.top+1, ILD_NORMAL);
+    TOOLBAR_DrawString (infoPtr, btnPtr, hdc, btnPtr->fsState);
 }
 
 
-
 static void
 TOOLBAR_Refresh (WND *wndPtr, HDC32 hdc)
 {
@@ -159,6 +204,42 @@
 
 
 static void
+TOOLBAR_CalcStrings (WND *wndPtr, LPSIZE32 lpSize)
+{
+    TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr(wndPtr);
+    TBUTTON_INFO *btnPtr;
+    INT32 i;
+    HDC32 hdc;
+    HFONT32 hOldFont;
+    SIZE32 sz;
+
+    lpSize->cx = 0;
+    lpSize->cy = 0;
+    hdc = GetDC32 (0);
+    hOldFont = SelectObject32 (hdc, infoPtr->hFont);
+
+    btnPtr = infoPtr->buttons;
+    for (i = 0; i < infoPtr->nNumButtons; i++, btnPtr++) {
+	if (!(btnPtr->fsState & TBSTATE_HIDDEN) &&
+	    (btnPtr->iString > -1) &&
+	    (btnPtr->iString < infoPtr->nNumStrings)) {
+	    LPSTR lpText = infoPtr->strings[btnPtr->iString];
+	    GetTextExtentPoint32A (hdc, lpText, lstrlen32A(lpText), &sz);
+	    if (sz.cx > lpSize->cx)
+		lpSize->cx = sz.cx;
+	    if (sz.cy > lpSize->cy)
+		lpSize->cy = sz.cy;
+	}
+    }
+
+    SelectObject32 (hdc, hOldFont);
+    ReleaseDC32 (0, hdc);
+
+    TRACE (toolbar, "string size %d x %d!\n", lpSize->cx, lpSize->cy);
+}
+
+
+static void
 TOOLBAR_CalcToolbar (WND *wndPtr)
 {
     TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr(wndPtr);
@@ -166,6 +247,17 @@
     INT32 i, j, nRows;
     INT32 x, y, cx, cy;
     BOOL32 bVertical;
+    SIZE32  sizeString;
+
+
+    /* test */
+    TOOLBAR_CalcStrings (wndPtr, &sizeString);
+
+    if (sizeString.cy > 0)
+	infoPtr->nButtonHeight = sizeString.cy + infoPtr->nBitmapHeight + 6;
+
+    if (sizeString.cx > infoPtr->nBitmapWidth)
+	infoPtr->nButtonWidth = sizeString.cx + 6;
 
     x  = infoPtr->nIndent;
     y  = TOP_BORDER;
@@ -220,6 +312,7 @@
     }
 
     infoPtr->nHeight = y + cy + BOTTOM_BORDER;
+    TRACE (toolbar, "toolbar height %d\n", infoPtr->nHeight);
 }
 
 
@@ -335,6 +428,17 @@
 			      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 = 
@@ -434,7 +538,7 @@
 	len = LoadString32A ((HINSTANCE32)wParam, (UINT32)lParam,
 			     szString, 256);
 
-	TRACE (toolbar, "len=%d\n", len);
+	TRACE (toolbar, "len=%d \"%s\"\n", len, szString);
 	nIndex = infoPtr->nNumStrings;
 	if (infoPtr->nNumStrings == 0) {
 	    infoPtr->strings =
@@ -464,7 +568,7 @@
 	nIndex = infoPtr->nNumStrings;
 	while (*p) {
 	    len = lstrlen32A (p);
-	    TRACE (toolbar, "len=%d\n", len);
+	    TRACE (toolbar, "len=%d \"%s\"\n", len, p);
 
 	    if (infoPtr->nNumStrings == 0) {
 		infoPtr->strings =
@@ -487,7 +591,6 @@
 
 	    p += (len+1);
 	}
-
     }
 
     return nIndex;
@@ -501,8 +604,50 @@
 TOOLBAR_AutoSize (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
 {
     TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr(wndPtr);
+    RECT32 parent_rect;
+    HWND32 parent;
+    INT32  x, y, cx, cy;
+    UINT32 uPosFlags = 0;
 
-    TRACE (toolbar, "auto size!\n");
+    FIXME (toolbar, "auto size!\n");
+
+	parent = GetParent32 (wndPtr->hwndSelf);
+	GetClientRect32(parent, &parent_rect);
+
+	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_TOP | CCS_BOTTOM))
+//		cy = (INT32)HIWORD(lParam);
+	}
+#if 0
+	if (wndPtr->dwStyle & CCS_NORESIZE) {
+	    uPosFlags |= SWP_NOSIZE;
+//	    cx = (INT32)LOWORD(lParam);
+//	    cy = (INT32)HIWORD(lParam);
+        }
+	else {
+	     /* FIXME: handle CCS_NOMOVEX and CCS_NOMOVEY */
+
+	}
+
+	infoPtr->nWidth = cx;
+	infoPtr->nHeight = cy;
+#endif
+    if (!(wndPtr->dwStyle & CCS_NODIVIDER))
+	cy += 2;
+
+    infoPtr->bAutoSize = TRUE;
+    SetWindowPos32 (wndPtr->hwndSelf, 0, parent_rect.left, parent_rect.top,
+		    cx, cy, uPosFlags | SWP_NOZORDER);
 
     return 0;
 }
@@ -595,7 +740,7 @@
     TOOLBAR_DrawButton (wndPtr, btnPtr, hdc);
     ReleaseDC32 (wndPtr->hwndSelf, hdc);
 
-    /* FIXME: Send a WM_COMMAND or WM_NOTIFY */
+    /* FIXME: Send a WM_NOTIFY?? */
 
     return TRUE;
 }
@@ -784,7 +929,16 @@
 // << TOOLBAR_GetExtendedStyle >>
 // << TOOLBAR_GetHotImageList >>
 // << TOOLBAR_GetHotItem >>
-// << TOOLBAR_GetImageList >>
+
+
+static LRESULT
+TOOLBAR_GetImageList (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
+{
+    TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr(wndPtr);
+    return (LRESULT)infoPtr->himlDef; 
+}
+
+
 // << TOOLBAR_GetInsertMark >>
 // << TOOLBAR_GetInsertMarkColor >>
 
@@ -1200,7 +1354,21 @@
 // << TOOLBAR_SetExtendedStyle >>
 // << TOOLBAR_SetHotImageList >>
 // << TOOLBAR_SetHotItem >>
-// << TOOLBAR_SetImageList >>
+
+
+static LRESULT
+TOOLBAR_SetImageList (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
+{
+    TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr(wndPtr);
+    HIMAGELIST himlTemp;
+
+    himlTemp = infoPtr->himlDef;
+    infoPtr->himlDef = (HIMAGELIST)lParam;
+
+    /* FIXME: redraw ? */
+
+    return (LRESULT)himlTemp; 
+}
 
 
 static LRESULT
@@ -1220,7 +1388,21 @@
 
 
 // << TOOLBAR_SetInsertMark >>
-// << TOOLBAR_SetInsertMarkColor >>
+
+
+static LRESULT
+TOOLBAR_SetInsertMarkColor (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
+{
+    TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr(wndPtr);
+
+    infoPtr->clrInsertMark = (COLORREF)lParam;
+
+    /* FIXME : redraw ??*/
+
+    return 0;
+}
+
+
 // << TOOLBAR_SetMaxTextRows >>
 // << TOOLBAR_SetPadding >>
 
@@ -1307,13 +1489,22 @@
 }
 
 
-// << TOOLBAR_SetUnicodeFormat >>
+static LRESULT
+TOOLBAR_SetUnicodeFormat (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
+{
+    TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr(wndPtr);
+
+    FIXME (toolbar, "hwnd=0x%04x stub!\n", wndPtr->hwndSelf);
+
+    return 0;
+}
 
 
 static LRESULT
 TOOLBAR_Create (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
 {
     TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr(wndPtr);
+    LOGFONT32A logFont;
 
     /* initialize info structure */
     infoPtr->nButtonHeight = 22;
@@ -1332,6 +1523,9 @@
     infoPtr->bTransparent = (wndPtr->dwStyle & TBSTYLE_FLAT);
     infoPtr->nHotItem = -1;
 
+    SystemParametersInfo32A (SPI_GETICONTITLELOGFONT, 0, &logFont, 0);
+    infoPtr->hFont = CreateFontIndirect32A (&logFont);
+
     return 0;
 }
 
@@ -1371,6 +1565,10 @@
     if (infoPtr->himlHot)
 	ImageList_Destroy (infoPtr->himlHot);
 
+    /* delete default font */
+    if (infoPtr->hFont)
+	DeleteObject32 (infoPtr->hFont);
+
     /* free toolbar info data */
     HeapFree (GetProcessHeap (), 0, infoPtr);
 
@@ -1379,6 +1577,19 @@
 
 
 static LRESULT
+TOOLBAR_EraseBackground (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
+{
+    TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr(wndPtr);
+
+    if (infoPtr->bTransparent)
+	return SendMessage32A (GetParent32 (wndPtr->hwndSelf), WM_ERASEBKGND,
+			       wParam, lParam);
+
+    return DefWindowProc32A (wndPtr->hwndSelf, WM_ERASEBKGND, wParam, lParam);
+}
+
+
+static LRESULT
 TOOLBAR_LButtonDblClk (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
 {
     TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr(wndPtr);
@@ -1546,6 +1757,9 @@
 }
 
 
+
+
+
 static LRESULT
 TOOLBAR_NCCalcSize (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
 {
@@ -1657,12 +1871,19 @@
     INT32  flags;
     UINT32 uPosFlags = 0;
 
+    if (infoPtr->bAutoSize) {
+	infoPtr->bAutoSize = FALSE;
+	return 0;
+    }
+
     flags = (INT32) wParam;
 
     /* FIXME for flags =
      * SIZE_MAXIMIZED, SIZE_MAXSHOW, SIZE_MINIMIZED
      */
 
+    TRACE (toolbar, "sizing toolbar!\n");
+
     if (flags == SIZE_RESTORED) {
 	/* width and height don't apply */
 	parent = GetParent32 (wndPtr->hwndSelf);
@@ -1679,8 +1900,23 @@
 
 	if (wndPtr->dwStyle & CCS_NOPARENTALIGN) {
 	    uPosFlags |= SWP_NOMOVE;
+//	    if (wndPtr->dwStyle & (CCS_TOP | CCS_BOTTOM))
+//		cy = (INT32)HIWORD(lParam);
+	}
+#if 0
+	if (wndPtr->dwStyle & CCS_NORESIZE) {
+	    uPosFlags |= SWP_NOSIZE;
+//	    cx = (INT32)LOWORD(lParam);
+//	    cy = (INT32)HIWORD(lParam);
+        }
+	else {
+	     /* FIXME: handle CCS_NOMOVEX and CCS_NOMOVEY */
+
 	}
 
+	infoPtr->nWidth = cx;
+	infoPtr->nHeight = cy;
+#endif
 	if (!(wndPtr->dwStyle & CCS_NODIVIDER))
 	    cy += 2;
 
@@ -1691,6 +1927,11 @@
 }
 
 
+
+
+
+
+
 LRESULT WINAPI
 ToolbarWindowProc (HWND32 hwnd, UINT32 uMsg, WPARAM32 wParam, LPARAM lParam)
 {
@@ -1763,7 +2004,10 @@
 //	case TB_GETEXTENDEDSTYLE:		/* 4.71 */
 //	case TB_GETHOTIMAGELIST:		/* 4.70 */
 //	case TB_GETHOTITEM:			/* 4.71 */
-//	case TB_GETIMAGELIST:			/* 4.70 */
+
+	case TB_GETIMAGELIST:
+	    return TOOLBAR_GetImageList (wndPtr, wParam, lParam);
+
 //	case TB_GETINSERTMARK:			/* 4.71 */
 //	case TB_GETINSERTMARKCOLOR:		/* 4.71 */
 
@@ -1860,13 +2104,18 @@
 //	case TB_SETEXTENDEDSTYLE:		/* 4.71 */
 //	case TB_SETHOTIMAGELIST:		/* 4.70 */
 //	case TB_SETHOTITEM:			/* 4.71 */
-//	case TB_SETIMAGELIST:			/* 4.70 */
+
+	case TB_SETIMAGELIST:
+	    return TOOLBAR_SetImageList (wndPtr, wParam, lParam);
 
 	case TB_SETINDENT:
 	    return TOOLBAR_SetIndent (wndPtr, wParam, lParam);
 
 //	case TB_SETINSERTMARK:			/* 4.71 */
-//	case TB_SETINSERTMARKCOLOR:		/* 4.71 */
+
+	case TB_SETINSERTMARKCOLOR:
+	    return TOOLBAR_SetInsertMarkColor (wndPtr, wParam, lParam);
+
 //	case TB_SETMAXTEXTROWS:			/* 4.70 */
 //	case TB_SETPADDING:			/* 4.71 */
 
@@ -1885,7 +2134,8 @@
 	case TB_SETTOOLTIPS:
 	    return TOOLBAR_SetToolTips (wndPtr, wParam, lParam);
 
-//	case TB_SETUNICODEFORMAT:
+	case TB_SETUNICODEFORMAT:
+	    return TOOLBAR_SetUnicodeFormat (wndPtr, wParam, lParam);
 
 	case WM_CREATE:
 	    return TOOLBAR_Create (wndPtr, wParam, lParam);
@@ -1893,8 +2143,8 @@
 	case WM_DESTROY:
 	    return TOOLBAR_Destroy (wndPtr, wParam, lParam);
 
-//	case WM_ERASEBKGND:
-//	    return TOOLBAR_EraseBackground (wndPtr, wParam, lParam);
+	case WM_ERASEBKGND:
+	    return TOOLBAR_EraseBackground (wndPtr, wParam, lParam);
 
 	case WM_LBUTTONDBLCLK:
 	    return TOOLBAR_LButtonDblClk (wndPtr, wParam, lParam);
@@ -1921,6 +2171,7 @@
 	    return TOOLBAR_NCPaint (wndPtr, wParam, lParam);
 
 //	case WM_NOTIFY:
+//	    SendMessage32A (GetParent32 (hwnd), uMsg, wParam, lParam);
 
 	case WM_PAINT:
 	    return TOOLBAR_Paint (wndPtr, wParam);
diff --git a/controls/tooltips.c b/controls/tooltips.c
new file mode 100644
index 0000000..3efcf87
--- /dev/null
+++ b/controls/tooltips.c
@@ -0,0 +1,698 @@
+/*
+ * Tool tip control
+ *
+ * Copyright 1998 Eric Kohl
+ *
+ * NOTES
+ *   PLEASE don't try to improve or change this code right now. Many
+ *   features are still missing, but I'm working on it. I want to avoid
+ *   any confusion. This note will be removed as soon as most of the
+ *   features are implemented.
+ *     Eric <ekohl@abo.rhein-zeitung.de>
+ *
+ * TODO:
+ *   - Most messages.
+ *   - All notifications.
+ *
+ * Testing:
+ *   - Run tests using Waite Group Windows95 API Bible Volume 2.
+ *     The second cdrom contains executables enumtools.exe ...
+ *   - additional features.
+ *
+ * FIXME:
+ *   - DelTool32A incomplete.
+ *   - GetCurrentTool32A incomplete.
+ */
+
+#include "windows.h"
+#include "commctrl.h"
+#include "tooltips.h"
+#include "heap.h"
+#include "win.h"
+#include "debug.h"
+
+
+#define TOOLTIPS_GetInfoPtr(wndPtr) ((TOOLTIPS_INFO *)wndPtr->wExtra[0])
+
+
+static INT32
+TOOLTIPS_GetIndexFromInfoA (TOOLTIPS_INFO *infoPtr, LPTOOLINFOA lpToolInfo)
+{
+    TTTOOL_INFO *toolPtr;
+    INT32 nIndex;
+
+    for (nIndex = 0; nIndex < infoPtr->uNumTools; nIndex++) {
+	toolPtr = &infoPtr->tools[nIndex];
+
+	if ((lpToolInfo->hwnd == toolPtr->hwnd) &&
+	    (lpToolInfo->uId == toolPtr->uId))
+	    return nIndex;
+    }
+
+    return -1;
+}
+
+/*
+static INT32
+TOOLTIPS_GetIndexFromPoint (TOOLTIPS_INFO *infoPtr, LPPOINT32 lpPt)
+{
+    TTTOOL_INFO *toolPtr;
+    INT32 nIndex;
+
+    for (nIndex = 0; nIndex < infoPtr->uNumTools; nIndex++) {
+	toolPtr = &infoPtr->tools[nIndex];
+
+	if (lpToolInfo->uFlags & TTF_IDISHWND) {
+	    if (PtInRect (
+	}
+	else {
+
+	    return nIndex;
+	}
+    }
+
+    return -1;
+}
+*/
+
+static LRESULT
+TOOLTIPS_Activate (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
+{
+    TOOLTIPS_INFO *infoPtr = TOOLTIPS_GetInfoPtr(wndPtr);
+
+    infoPtr->bActive = (BOOL32)wParam;
+
+    if (infoPtr->bActive) {
+	FIXME (tooltips, "activated!\n");
+    }
+    else {
+	FIXME (tooltips, "deactivated!\n");
+    }
+
+    return 0;
+}
+
+
+static LRESULT
+TOOLTIPS_AddTool32A (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
+{
+    TOOLTIPS_INFO *infoPtr = TOOLTIPS_GetInfoPtr(wndPtr);
+    LPTOOLINFOA lpToolInfo = (LPTOOLINFOA)lParam;
+    TTTOOL_INFO *toolPtr;
+
+    if (lpToolInfo == NULL) return FALSE;
+
+    if (infoPtr->uNumTools == 0) {
+	infoPtr->tools =
+	    HeapAlloc (GetProcessHeap (), HEAP_ZERO_MEMORY,
+		       sizeof(TTTOOL_INFO));
+	toolPtr = infoPtr->tools;
+    }
+    else {
+	TTTOOL_INFO *oldTools = infoPtr->tools;
+	infoPtr->tools =
+	    HeapAlloc (GetProcessHeap (), HEAP_ZERO_MEMORY,
+		       sizeof(TTTOOL_INFO) * (infoPtr->uNumTools + 1));
+	memcpy (infoPtr->tools, oldTools,
+		infoPtr->uNumTools * sizeof(TTTOOL_INFO));
+	HeapFree (GetProcessHeap (), 0, oldTools);
+	toolPtr = &infoPtr->tools[infoPtr->uNumTools];
+    }
+
+    infoPtr->uNumTools++;
+
+    /* copy tool data */
+    toolPtr->uFlags = lpToolInfo->uFlags;
+    toolPtr->hwnd   = lpToolInfo->hwnd;
+    toolPtr->uId    = lpToolInfo->uId;
+    toolPtr->rect   = lpToolInfo->rect;
+    toolPtr->hinst  = lpToolInfo->hinst;
+
+    if (lpToolInfo->hinst) {
+	toolPtr->lpszText = lpToolInfo->lpszText;
+    }
+    else if (lpToolInfo->lpszText) {
+	if (lpToolInfo->lpszText == LPSTR_TEXTCALLBACK32A)
+	    toolPtr->lpszText = lpToolInfo->lpszText;
+	else {
+	    INT32 len = lstrlen32A (lpToolInfo->lpszText);
+	    toolPtr->lpszText =
+		HeapAlloc (GetProcessHeap (), HEAP_ZERO_MEMORY, len + 1);
+	    lstrcpy32A (toolPtr->lpszText, lpToolInfo->lpszText);
+	}
+    }
+
+    if (lpToolInfo->cbSize >= sizeof(TOOLINFOA))
+	toolPtr->lParam = lpToolInfo->lParam;
+
+
+    return TRUE;
+}
+
+
+// << TOOLTIPS_AddTool32W >>
+
+
+static LRESULT
+TOOLTIPS_DelTool32A (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
+{
+    TOOLTIPS_INFO *infoPtr = TOOLTIPS_GetInfoPtr(wndPtr);
+    LPTOOLINFOA lpToolInfo = (LPTOOLINFOA)lParam;
+    TTTOOL_INFO *toolPtr;
+    INT32 nIndex;
+
+    if (lpToolInfo == NULL) return 0;
+    if (infoPtr->uNumTools == 0) return 0;
+
+    nIndex = TOOLTIPS_GetIndexFromInfoA (infoPtr, lpToolInfo);
+    if (nIndex == -1) return 0;
+
+    TRACE (tooltips, "index=%d\n", nIndex);
+
+
+/*    delete tool from tool list */
+/*
+    toolPtr = &infoPtr->tools[nIndex]; 
+
+    // delete text string
+    if ((toolPtr->hinst) && (toolPtr->lpszText)) {
+	if (toolPtr->lpszText != LPSTR_TEXTCALLBACK32A)
+	    HeapFree (GetProcessHeap (), 0, toolPtr->lpszText);
+    }
+
+
+*/
+    return 0;
+}
+
+
+// << TOOLTIPS_DelTool32W >>
+
+
+static LRESULT
+TOOLTIPS_EnumTools32A (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
+{
+    TOOLTIPS_INFO *infoPtr = TOOLTIPS_GetInfoPtr(wndPtr);
+    UINT32 uIndex = (UINT32)wParam;
+    LPTOOLINFOA lpToolInfo = (LPTOOLINFOA)lParam;
+    TTTOOL_INFO *toolPtr;
+
+    if (uIndex >= infoPtr->uNumTools) return FALSE;
+    if (lpToolInfo == NULL) return FALSE;
+
+    TRACE (tooltips, "index=%u\n", uIndex);
+
+    toolPtr = &infoPtr->tools[uIndex];
+
+    /* copy tool data */
+    lpToolInfo->uFlags   = toolPtr->uFlags;
+    lpToolInfo->hwnd     = toolPtr->hwnd;
+    lpToolInfo->uId      = toolPtr->uId;
+    lpToolInfo->rect     = toolPtr->rect;
+    lpToolInfo->hinst    = toolPtr->hinst;
+    lpToolInfo->lpszText = toolPtr->lpszText;
+
+    if (lpToolInfo->cbSize >= sizeof(TOOLINFOA))
+	lpToolInfo->lParam = toolPtr->lParam;
+
+    return TRUE;
+}
+
+
+// << TOOLTIPS_EnumTools32W >>
+
+
+static LRESULT
+TOOLTIPS_GetCurrentTool32A (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
+{
+    TOOLTIPS_INFO *infoPtr = TOOLTIPS_GetInfoPtr(wndPtr);
+    LPTOOLINFOA lpti = (LPTOOLINFOA)lParam;
+
+    if (lpti) {
+	if (infoPtr->iCurrentTool > -1) {
+	    /* FIXME */
+
+	    return TRUE;
+	}
+	else
+	    return FALSE;
+    }
+    else
+	return (infoPtr->iCurrentTool != -1);
+
+    return FALSE;
+}
+
+
+// << TOOLTIPS_GetCurrentTool32W >>
+// << TOOLTIPS_GetDelayTime >>
+// << TOOLTIPS_GetMargin >>
+
+
+static LRESULT
+TOOLTIPS_GetMaxTipWidth (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
+{
+    TOOLTIPS_INFO *infoPtr = TOOLTIPS_GetInfoPtr(wndPtr);
+
+    return infoPtr->iMaxTipWidth;
+}
+
+
+static LRESULT
+TOOLTIPS_GetText32A (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
+{
+    TOOLTIPS_INFO *infoPtr = TOOLTIPS_GetInfoPtr(wndPtr);
+    LPTOOLINFOA lpti = (LPTOOLINFOA)lParam;
+    INT32 nIndex;
+
+    if (!(lpti)) return 0;
+    if (lpti->cbSize < sizeof(TOOLINFOA)) return 0;
+
+    nIndex = TOOLTIPS_GetIndexFromInfoA (infoPtr, lpti);
+    if (nIndex == -1) return 0;
+
+    lstrcpy32A (lpti->lpszText, infoPtr->tools[nIndex].lpszText);
+
+    return 0;
+}
+
+
+// << TOOLTIPS_GetText32W >>
+
+
+static LRESULT
+TOOLTIPS_GetTipBkColor (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
+{
+    TOOLTIPS_INFO *infoPtr = TOOLTIPS_GetInfoPtr(wndPtr);
+    return infoPtr->clrBk;
+}
+
+
+static LRESULT
+TOOLTIPS_GetTipTextColor (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
+{
+    TOOLTIPS_INFO *infoPtr = TOOLTIPS_GetInfoPtr(wndPtr);
+    return infoPtr->clrText;
+}
+
+
+static LRESULT
+TOOLTIPS_GetToolCount (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
+{
+    TOOLTIPS_INFO *infoPtr = TOOLTIPS_GetInfoPtr(wndPtr);
+    return infoPtr->uNumTools;
+}
+
+
+static LRESULT
+TOOLTIPS_GetToolInfo32A (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
+{
+    TOOLTIPS_INFO *infoPtr = TOOLTIPS_GetInfoPtr(wndPtr);
+    LPTOOLINFOA lpToolInfo = (LPTOOLINFOA)lParam;
+    TTTOOL_INFO *toolPtr;
+    INT32 nIndex;
+
+    if (lpToolInfo == NULL) return FALSE;
+    if (infoPtr->uNumTools == 0) return FALSE;
+
+    nIndex = TOOLTIPS_GetIndexFromInfoA (infoPtr, lpToolInfo);
+    if (nIndex == -1) return FALSE;
+
+    TRACE (tooltips, "index=%d\n", nIndex);
+
+    toolPtr = &infoPtr->tools[nIndex];
+
+    /* copy tool data */
+    lpToolInfo->uFlags   = toolPtr->uFlags;
+    lpToolInfo->rect     = toolPtr->rect;
+    lpToolInfo->hinst    = toolPtr->hinst;
+    lpToolInfo->lpszText = toolPtr->lpszText;
+
+    if (lpToolInfo->cbSize >= sizeof(TOOLINFOA))
+	lpToolInfo->lParam = toolPtr->lParam;
+
+    return TRUE;
+}
+
+
+// << TOOLTIPS_GetToolInfo32W >>
+// << TOOLTIPS_HitTest32A >>
+// << TOOLTIPS_HitTest32W >>
+
+
+static LRESULT
+TOOLTIPS_NewToolRect32A (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
+{
+    TOOLTIPS_INFO *infoPtr = TOOLTIPS_GetInfoPtr(wndPtr);
+    LPTOOLINFOA lpti = (LPTOOLINFOA)lParam;
+    INT32 nIndex;
+
+    if (!(lpti)) return 0;
+    if (lpti->cbSize < sizeof(TOOLINFOA)) return 0;
+
+    nIndex = TOOLTIPS_GetIndexFromInfoA (infoPtr, lpti);
+    if (nIndex == -1) return 0;
+
+    infoPtr->tools[nIndex].rect = lpti->rect;
+
+    return 0;
+}
+
+
+// << TOOLTIPS_NewToolRect32W >>
+// << TOOLTIPS_Pop >>
+
+
+static LRESULT
+TOOLTIPS_RelayEvent (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
+{
+    TOOLTIPS_INFO *infoPtr = TOOLTIPS_GetInfoPtr(wndPtr);
+    LPMSG16 lpMsg = (LPMSG16)lParam;
+
+    if (lpMsg == NULL) return 0;
+
+    if (lpMsg->message == WM_MOUSEMOVE) {
+	FIXME (tooltips, "WM_MOUSEMOVE (%d %d)\n", lpMsg->pt.x, lpMsg->pt.y);
+    }
+
+//    FIXME (tooltips, "empty stub!\n");
+
+    return 0;
+}
+
+
+// << TOOLTIPS_SetDelayTime >>
+// << TOOLTIPS_SetMargin >>
+
+
+static LRESULT
+TOOLTIPS_SetMaxTipWidth (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
+{
+    TOOLTIPS_INFO *infoPtr = TOOLTIPS_GetInfoPtr(wndPtr);
+    INT32 iTemp = infoPtr->iMaxTipWidth;
+
+    infoPtr->iMaxTipWidth = (INT32)lParam;
+
+    return iTemp;
+}
+
+
+static LRESULT
+TOOLTIPS_SetTipBkColor (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
+{
+    TOOLTIPS_INFO *infoPtr = TOOLTIPS_GetInfoPtr(wndPtr);
+
+    infoPtr->clrBk = (COLORREF)wParam;
+
+    return 0;
+}
+
+
+static LRESULT
+TOOLTIPS_SetTipTextColor (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
+{
+    TOOLTIPS_INFO *infoPtr = TOOLTIPS_GetInfoPtr(wndPtr);
+
+    infoPtr->clrText = (COLORREF)wParam;
+
+    return 0;
+}
+
+
+static LRESULT
+TOOLTIPS_SetToolInfo32A (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
+{
+    TOOLTIPS_INFO *infoPtr = TOOLTIPS_GetInfoPtr(wndPtr);
+    LPTOOLINFOA lpToolInfo = (LPTOOLINFOA)lParam;
+    TTTOOL_INFO *toolPtr;
+    INT32 nIndex;
+
+    if (lpToolInfo == NULL) return 0;
+
+    nIndex = TOOLTIPS_GetIndexFromInfoA (infoPtr, lpToolInfo);
+    if (nIndex == -1) return 0;
+
+    TRACE (tooltips, "index=%d\n", nIndex);
+
+    toolPtr = &infoPtr->tools[nIndex];
+
+    /* copy tool data */
+    toolPtr->uFlags = lpToolInfo->uFlags;
+    toolPtr->hwnd   = lpToolInfo->hwnd;
+    toolPtr->uId    = lpToolInfo->uId;
+    toolPtr->rect   = lpToolInfo->rect;
+    toolPtr->hinst  = lpToolInfo->hinst;
+
+    if (lpToolInfo->lpszText) {
+	if (lpToolInfo->lpszText == LPSTR_TEXTCALLBACK32A)
+	    toolPtr->lpszText = lpToolInfo->lpszText;
+	else {
+	    INT32 len = lstrlen32A (lpToolInfo->lpszText);
+	    HeapFree (GetProcessHeap (), 0, toolPtr->lpszText);
+	    toolPtr->lpszText =
+		HeapAlloc (GetProcessHeap (), HEAP_ZERO_MEMORY, len + 1);
+	    lstrcpy32A (toolPtr->lpszText, lpToolInfo->lpszText);
+	}
+    }
+
+    if (lpToolInfo->cbSize >= sizeof(TOOLINFOA))
+	toolPtr->lParam = lpToolInfo->lParam;
+
+    return 0;
+}
+
+
+// << TOOLTIPS_SetToolInfo32W >>
+// << TOOLTIPS_TrackActive >>
+// << TOOLTIPS_TrackPosition >>
+// << TOOLTIPS_Update >>
+// << TOOLTIPS_UpdateTipText32A >>
+// << TOOLTIPS_UpdateTipText32W >>
+// << TOOLTIPS_WindowFromPoint >>
+
+
+static LRESULT
+TOOLTIPS_Create (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
+{
+    TOOLTIPS_INFO *infoPtr;
+
+    /* allocate memory for info structure */
+    infoPtr = (TOOLTIPS_INFO *)HeapAlloc (GetProcessHeap (), HEAP_ZERO_MEMORY,
+					  sizeof(TOOLTIPS_INFO));
+    wndPtr->wExtra[0] = (DWORD)infoPtr;
+
+    if (infoPtr == NULL) {
+	ERR (tooltips, "could not allocate info memory!\n");
+	return 0;
+    }
+
+    /* initialize info structure */
+    infoPtr->bActive = TRUE;
+    infoPtr->clrBk   = GetSysColor32 (COLOR_INFOBK);
+    infoPtr->clrText = GetSysColor32 (COLOR_INFOTEXT);
+    infoPtr->hFont   = NULL;
+    infoPtr->iMaxTipWidth = -1;
+    infoPtr->iCurrentTool = -1;
+
+    return 0;
+}
+
+
+static LRESULT
+TOOLTIPS_Destroy (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
+{
+    TOOLTIPS_INFO *infoPtr = TOOLTIPS_GetInfoPtr(wndPtr);
+
+
+    /* free tools */
+    if (infoPtr->tools) {
+	INT32 i;
+	for (i = 0; i < infoPtr->uNumTools; i++) {
+	    if ((infoPtr->tools[i].hinst) && (infoPtr->tools[i].lpszText)) {
+		if (infoPtr->tools[i].lpszText != LPSTR_TEXTCALLBACK32A)
+		    HeapFree (GetProcessHeap (), 0, infoPtr->tools[i].lpszText);
+	    }
+	}
+	HeapFree (GetProcessHeap (), 0, infoPtr->tools);
+    }
+
+    /* free tool tips info data */
+    HeapFree (GetProcessHeap (), 0, infoPtr);
+
+    return 0;
+}
+
+
+static LRESULT
+TOOLTIPS_GetFont (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
+{
+    TOOLTIPS_INFO *infoPtr = TOOLTIPS_GetInfoPtr(wndPtr);
+
+    return infoPtr->hFont;
+}
+
+
+// << TOOLTIPS_MouseMove >>
+// << TOOLTIPS_Paint >>
+
+
+static LRESULT
+TOOLTIPS_SetFont (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
+{
+    TOOLTIPS_INFO *infoPtr = TOOLTIPS_GetInfoPtr(wndPtr);
+
+    infoPtr->hFont = (HFONT32)wParam;
+
+    if (LOWORD(lParam)) {
+	/* redraw */
+
+    }
+
+    return 0;
+}
+
+
+// << TOOLTIPS_Timer >>
+// << TOOLTIPS_WinIniChange >>
+
+
+LRESULT WINAPI
+ToolTipsWindowProc (HWND32 hwnd, UINT32 uMsg, WPARAM32 wParam, LPARAM lParam)
+{
+    WND *wndPtr = WIN_FindWndPtr(hwnd);
+
+    switch (uMsg)
+    {
+	case TTM_ACTIVATE:
+	    return TOOLTIPS_Activate (wndPtr, wParam, lParam);
+
+	case TTM_ADDTOOL32A:
+	    return TOOLTIPS_AddTool32A (wndPtr, wParam, lParam);
+
+//	case TTM_ADDTOOL32W:
+
+	case TTM_DELTOOL32A:
+	    return TOOLTIPS_DelTool32A (wndPtr, wParam, lParam);
+
+//	case TTM_DELTOOL32W:
+
+	case TTM_ENUMTOOLS32A:
+	    return TOOLTIPS_EnumTools32A (wndPtr, wParam, lParam);
+
+//	case TTM_ENUMTOOLS32W:
+
+	case TTM_GETCURRENTTOOL32A:
+	    return TOOLTIPS_GetCurrentTool32A (wndPtr, wParam, lParam);
+
+//	case TTM_GETCURRENTTOOL32W:
+//	case TTM_GETDELAYTIME:			/* 4.70 */
+//	case TTM_GETMARGIN:			/* 4.70 */
+
+	case TTM_GETMAXTIPWIDTH:
+	    return TOOLTIPS_GetMaxTipWidth (wndPtr, wParam, lParam);
+
+	case TTM_GETTEXT32A:
+	    return TOOLTIPS_GetText32A (wndPtr, wParam, lParam);
+
+//	case TTM_GETTEXT32W:
+
+	case TTM_GETTIPBKCOLOR:
+	    return TOOLTIPS_GetTipBkColor (wndPtr, wParam, lParam);
+
+	case TTM_GETTIPTEXTCOLOR:
+	    return TOOLTIPS_GetTipTextColor (wndPtr, wParam, lParam);
+
+	case TTM_GETTOOLCOUNT:
+	    return TOOLTIPS_GetToolCount (wndPtr, wParam, lParam);
+
+	case TTM_GETTOOLINFO32A:
+	    return TOOLTIPS_GetToolInfo32A (wndPtr, wParam, lParam);
+
+//	case TTM_GETTOOLINFO32W:
+//	case TTM_HITTEST32A:
+//	case TTM_HITTEST32W:
+
+	case TTM_NEWTOOLRECT32A:
+	    return TOOLTIPS_NewToolRect32A (wndPtr, wParam, lParam);
+
+//	case TTM_NEWTOOLRECT32W:
+//	case TTM_POP:				/* 4.70 */
+
+	case TTM_RELAYEVENT:
+	    return TOOLTIPS_RelayEvent (wndPtr, wParam, lParam);
+
+//	case TTM_SETDELAYTIME:			/* 4.70 */
+//	case TTM_SETMARGIN:			/* 4.70 */
+
+	case TTM_SETMAXTIPWIDTH:
+	    return TOOLTIPS_SetMaxTipWidth (wndPtr, wParam, lParam);
+
+	case TTM_SETTIPBKCOLOR:
+	    return TOOLTIPS_SetTipBkColor (wndPtr, wParam, lParam);
+
+	case TTM_SETTIPTEXTCOLOR:
+	    return TOOLTIPS_SetTipTextColor (wndPtr, wParam, lParam);
+
+	case TTM_SETTOOLINFO32A:
+	    return TOOLTIPS_SetToolInfo32A (wndPtr, wParam, lParam);
+
+//	case TTM_SETTOOLINFO32W:
+//	case TTM_TRACKACTIVE:			/* 4.70 */
+//	case TTM_TRACKPOSITION:			/* 4.70 */
+//	case TTM_UPDATE:			/* 4.71 */
+//	case TTM_UPDATETIPTEXT32A:
+//	case TTM_UPDATETIPTEXT32W:
+//	case TTM_WINDOWFROMPOINT:
+
+
+	case WM_CREATE:
+	    return TOOLTIPS_Create (wndPtr, wParam, lParam);
+
+	case WM_DESTROY:
+	    return TOOLTIPS_Destroy (wndPtr, wParam, lParam);
+
+	case WM_GETFONT:
+	    return TOOLTIPS_GetFont (wndPtr, wParam, lParam);
+
+//	case WM_MOUSEMOVE:
+//	    return TOOLTIPS_MouseMove (wndPtr, wParam, lParam);
+
+//	case WM_PAINT:
+//	    return TOOLTIPS_Paint (wndPtr, wParam);
+
+	case WM_SETFONT:
+	    return TOOLTIPS_SetFont (wndPtr, wParam, lParam);
+
+//	case WM_TIMER:
+
+//	case WM_WININICHANGE:
+
+	default:
+	    if (uMsg >= WM_USER)
+		ERR (tooltips, "unknown msg %04x wp=%08x lp=%08lx\n",
+		     uMsg, wParam, lParam);
+	    return DefWindowProc32A (hwnd, uMsg, wParam, lParam);
+    }
+    return 0;
+}
+
+
+void
+TOOLTIPS_Register (void)
+{
+    WNDCLASS32A wndClass;
+
+    if (GlobalFindAtom32A (TOOLTIPS_CLASS32A)) return;
+
+    ZeroMemory (&wndClass, sizeof(WNDCLASS32A));
+    wndClass.style         = CS_GLOBALCLASS | CS_DBLCLKS | CS_SAVEBITS;
+    wndClass.lpfnWndProc   = (WNDPROC32)ToolTipsWindowProc;
+    wndClass.cbClsExtra    = 0;
+    wndClass.cbWndExtra    = sizeof(TOOLTIPS_INFO *);
+    wndClass.hCursor       = LoadCursor32A (0, IDC_ARROW32A);
+    wndClass.hbrBackground = 0;
+    wndClass.lpszClassName = TOOLTIPS_CLASS32A;
+ 
+    RegisterClass32A (&wndClass);
+}
+
diff --git a/controls/trackbar.c b/controls/trackbar.c
new file mode 100644
index 0000000..48e587b
--- /dev/null
+++ b/controls/trackbar.c
@@ -0,0 +1,437 @@
+/*
+ * Trackbar control
+ *
+ * Copyright 1998 Eric Kohl
+ *
+ * NOTES
+ *   This is just a dummy control. An author is needed! Any volunteers?
+ *   I will only improve this control once in a while.
+ *     Eric <ekohl@abo.rhein-zeitung.de>
+ *
+ * TODO:
+ *   - All messages.
+ *   - All notifications.
+ */
+
+#include "windows.h"
+#include "commctrl.h"
+#include "trackbar.h"
+#include "heap.h"
+#include "win.h"
+#include "debug.h"
+
+
+#define TRACKBAR_GetInfoPtr(wndPtr) ((TRACKBAR_INFO *)wndPtr->wExtra[0])
+
+
+static VOID
+TRACKBAR_Refresh (WND *wndPtr, HDC32 hdc)
+{
+    TRACKBAR_INFO *infoPtr = TRACKBAR_GetInfoPtr(wndPtr);
+    RECT32 rect;
+
+    GetClientRect32 (wndPtr->hwndSelf, &rect);
+
+    /* draw channel */
+    DrawEdge32 (hdc, &infoPtr->rcChannel, EDGE_SUNKEN, BF_RECT);
+
+    /* draw thumb */
+    if (!(wndPtr->dwStyle & TBS_NOTHUMB)) {
+
+    }
+
+    /* draw ticks */
+    if (!(wndPtr->dwStyle & TBS_NOTICKS)) {
+
+    }
+
+    if (infoPtr->bFocus)
+	DrawFocusRect32 (hdc, &rect);
+}
+
+
+static LRESULT
+TRACKBAR_ClearSel (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
+{
+    TRACKBAR_INFO *infoPtr = TRACKBAR_GetInfoPtr(wndPtr);
+
+    infoPtr->nSelMin = 0;
+    infoPtr->nSelMax = 0;
+
+    if ((BOOL32)wParam) {
+	HDC32 hdc = GetDC32 (wndPtr->hwndSelf);
+	TRACKBAR_Refresh (wndPtr, hdc);
+	ReleaseDC32 (wndPtr->hwndSelf, hdc);
+    }
+
+    return 0;
+}
+
+
+// << TRACKBAR_ClearTics >>
+// << TRACKBAR_GetChannelRect >>
+
+
+static LRESULT
+TRACKBAR_GetLineSize (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
+{
+    TRACKBAR_INFO *infoPtr = TRACKBAR_GetInfoPtr(wndPtr);
+
+    return infoPtr->nLineSize;
+}
+
+
+// << TRACKBAR_GetNumTics >>
+
+
+static LRESULT
+TRACKBAR_GetPageSize (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
+{
+    TRACKBAR_INFO *infoPtr = TRACKBAR_GetInfoPtr(wndPtr);
+
+    return infoPtr->nPageSize;
+}
+
+
+static LRESULT
+TRACKBAR_GetPos (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
+{
+    TRACKBAR_INFO *infoPtr = TRACKBAR_GetInfoPtr(wndPtr);
+
+    return infoPtr->nPos;
+}
+
+
+// << TRACKBAR_GetPTics >>
+
+
+static LRESULT
+TRACKBAR_GetRangeMax (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
+{
+    TRACKBAR_INFO *infoPtr = TRACKBAR_GetInfoPtr(wndPtr);
+
+    return infoPtr->nRangeMax;
+}
+
+
+static LRESULT
+TRACKBAR_GetRangeMin (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
+{
+    TRACKBAR_INFO *infoPtr = TRACKBAR_GetInfoPtr(wndPtr);
+
+    return infoPtr->nRangeMin;
+}
+
+
+static LRESULT
+TRACKBAR_GetSelEnd (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
+{
+    TRACKBAR_INFO *infoPtr = TRACKBAR_GetInfoPtr(wndPtr);
+
+    return infoPtr->nSelMax;
+}
+
+
+static LRESULT
+TRACKBAR_GetSelStart (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
+{
+    TRACKBAR_INFO *infoPtr = TRACKBAR_GetInfoPtr(wndPtr);
+
+    return infoPtr->nSelMin;
+}
+
+
+static LRESULT
+TRACKBAR_GetThumbLength (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
+{
+    TRACKBAR_INFO *infoPtr = TRACKBAR_GetInfoPtr(wndPtr);
+
+    return infoPtr->nThumbLen;
+}
+
+
+
+
+
+
+static LRESULT
+TRACKBAR_Create (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
+{
+    TRACKBAR_INFO *infoPtr;
+
+    infoPtr = (TRACKBAR_INFO *)HeapAlloc (GetProcessHeap (), HEAP_ZERO_MEMORY,
+					  sizeof(TRACKBAR_INFO));
+    wndPtr->wExtra[0] = (DWORD)infoPtr;
+
+
+    /* default values */
+    infoPtr->nRangeMin = 0;
+    infoPtr->nRangeMax = 100;
+    infoPtr->nLineSize = 1;
+    infoPtr->nPageSize = 20;
+    infoPtr->nSelMin   = 0;
+    infoPtr->nSelMax   = 0;
+    infoPtr->nPos      = 0;
+    infoPtr->nThumbLen = 23;   /* initial thumb length */
+
+
+    return 0;
+}
+
+
+static LRESULT
+TRACKBAR_Destroy (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
+{
+    TRACKBAR_INFO *infoPtr = TRACKBAR_GetInfoPtr(wndPtr);
+
+
+
+
+    HeapFree (GetProcessHeap (), 0, infoPtr);
+
+    return 0;
+}
+
+
+static LRESULT
+TRACKBAR_KillFocus (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
+{
+    TRACKBAR_INFO *infoPtr = TRACKBAR_GetInfoPtr(wndPtr);
+    HDC32 hdc;
+
+    infoPtr->bFocus = FALSE;
+
+    hdc = GetDC32 (wndPtr->hwndSelf);
+    TRACKBAR_Refresh (wndPtr, hdc);
+    ReleaseDC32 (wndPtr->hwndSelf, hdc);
+
+    return 0;
+}
+
+
+static LRESULT
+TRACKBAR_LButtonDown (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
+{
+    TRACKBAR_INFO *infoPtr = TRACKBAR_GetInfoPtr(wndPtr);
+
+    SetFocus32 (wndPtr->hwndSelf);
+
+    return 0;
+}
+
+
+static LRESULT
+TRACKBAR_Paint (WND *wndPtr, WPARAM32 wParam)
+{
+    HDC32 hdc;
+    PAINTSTRUCT32 ps;
+
+    hdc = wParam==0 ? BeginPaint32 (wndPtr->hwndSelf, &ps) : (HDC32)wParam;
+    TRACKBAR_Refresh (wndPtr, hdc);
+    if(!wParam)
+	EndPaint32 (wndPtr->hwndSelf, &ps);
+    return 0;
+}
+
+
+static LRESULT
+TRACKBAR_SetFocus (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
+{
+    TRACKBAR_INFO *infoPtr = TRACKBAR_GetInfoPtr(wndPtr);
+    HDC32 hdc;
+
+    infoPtr->bFocus = TRUE;
+
+    hdc = GetDC32 (wndPtr->hwndSelf);
+    TRACKBAR_Refresh (wndPtr, hdc);
+    ReleaseDC32 (wndPtr->hwndSelf, hdc);
+
+    return 0;
+}
+
+
+static LRESULT
+TRACKBAR_Size (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
+{
+    TRACKBAR_INFO *infoPtr = TRACKBAR_GetInfoPtr(wndPtr);
+    RECT32 rect;
+
+    GetClientRect32 (wndPtr->hwndSelf, &rect);
+
+    /* calculate channel rect */
+    if (wndPtr->dwStyle & TBS_VERT) {
+	infoPtr->rcChannel.top = rect.top + 8;
+	infoPtr->rcChannel.bottom = rect.bottom - 8;
+
+	/* FIXME */
+	infoPtr->rcChannel.left = rect.left + 10;
+	infoPtr->rcChannel.right = rect.left + 14;
+
+    }
+    else {
+	infoPtr->rcChannel.left = rect.left + 8;
+	infoPtr->rcChannel.right = rect.right - 8;
+
+	/* FIXME */
+	if (wndPtr->dwStyle & TBS_BOTH) {
+	    infoPtr->rcChannel.top = rect.bottom / 2 - 2;
+	    infoPtr->rcChannel.bottom = rect.bottom / 2 + 2;
+
+	}
+	else if (wndPtr->dwStyle & TBS_TOP) {
+	    infoPtr->rcChannel.top = rect.top + 10;
+	    infoPtr->rcChannel.bottom = rect.top + 14;
+
+	}
+	else {
+	    /* TBS_BOTTOM */
+	    infoPtr->rcChannel.top = rect.bottom - 14;
+	    infoPtr->rcChannel.bottom = rect.bottom - 10;
+	}
+    }
+
+    return 0;
+}
+
+
+// << TRACKBAR_Timer >>
+// << TRACKBAR_WinIniChange >>
+
+
+LRESULT WINAPI
+TrackbarWindowProc (HWND32 hwnd, UINT32 uMsg, WPARAM32 wParam, LPARAM lParam)
+{
+    WND *wndPtr = WIN_FindWndPtr(hwnd);
+
+    switch (uMsg)
+    {
+	case TBM_CLEARSEL:
+	    return TRACKBAR_ClearSel (wndPtr, wParam, lParam);
+
+//	case TBM_CLEARTICS:
+//	case TBM_GETBUDDY:
+//	case TBM_GETCHANNELRECT:
+
+	case TBM_GETLINESIZE:
+	    return TRACKBAR_GetLineSize (wndPtr, wParam, lParam);
+
+//	case TBM_GETNUMTICS:
+
+	case TBM_GETPAGESIZE:
+	    return TRACKBAR_GetPageSize (wndPtr, wParam, lParam);
+
+	case TBM_GETPOS:
+	    return TRACKBAR_GetPos (wndPtr, wParam, lParam);
+
+//	case TBM_GETPTICS:
+
+	case TBM_GETRANGEMAX:
+	    return TRACKBAR_GetRangeMax (wndPtr, wParam, lParam);
+
+	case TBM_GETRANGEMIN:
+	    return TRACKBAR_GetRangeMin (wndPtr, wParam, lParam);
+
+	case TBM_GETSELEND:
+	    return TRACKBAR_GetSelEnd (wndPtr, wParam, lParam);
+
+	case TBM_GETSELSTART:
+	    return TRACKBAR_GetSelStart (wndPtr, wParam, lParam);
+
+	case TBM_GETTHUMBLENGTH:
+	    return TRACKBAR_GetThumbLength (wndPtr, wParam, lParam);
+
+//	case TBM_GETTHUMBRECT:
+//	case TBM_GETTIC:
+//	case TBM_GETTICPOS:
+//	case TBM_GETTOOLTIPS:
+//	case TBM_GETUNICODEFORMAT:
+//	case TBM_SETBUDDY:
+//	case TBM_SETPAGESIZE:
+//	case TBM_SETPOS:
+//	case TBM_SETRANGE:
+//	case TBM_SETRANGEMAX:
+//	case TBM_SETRANGEMIN:
+//	case TBM_SETSEL:
+//	case TBM_SETSELEND:
+//	case TBM_SETSELSTART:
+//	case TBM_SETTHUMBLENGTH:
+//	case TBM_SETTIC:
+//	case TBM_SETTICFREQ:
+//	case TBM_SETTIPSIDE:
+//	case TBM_SETTOOLTIPS:
+//	case TBM_SETUNICODEFORMAT:
+
+
+//	case WM_CAPTURECHANGED:
+
+	case WM_CREATE:
+	    return TRACKBAR_Create (wndPtr, wParam, lParam);
+
+	case WM_DESTROY:
+	    return TRACKBAR_Destroy (wndPtr, wParam, lParam);
+
+//	case WM_ENABLE:
+
+//	case WM_ERASEBKGND:
+//	    return 0;
+
+	case WM_GETDLGCODE:
+	    return DLGC_WANTARROWS;
+
+//	case WM_KEYDOWN:
+
+//	case WM_KEYUP:
+
+	case WM_KILLFOCUS:
+	    return TRACKBAR_KillFocus (wndPtr, wParam, lParam);
+
+	case WM_LBUTTONDOWN:
+	    return TRACKBAR_LButtonDown (wndPtr, wParam, lParam);
+
+//	case WM_LBUTTONUP:
+
+//	case WM_MOUSEMOVE:
+//	    return TRACKBAR_MouseMove (wndPtr, wParam, lParam);
+
+	case WM_PAINT:
+	    return TRACKBAR_Paint (wndPtr, wParam);
+
+	case WM_SETFOCUS:
+	    return TRACKBAR_SetFocus (wndPtr, wParam, lParam);
+
+	case WM_SIZE:
+	    return TRACKBAR_Size (wndPtr, wParam, lParam);
+
+//	case WM_TIMER:
+
+//	case WM_WININICHANGE:
+
+	default:
+	    if (uMsg >= WM_USER)
+		ERR (trackbar, "unknown msg %04x wp=%08x lp=%08lx\n",
+		     uMsg, wParam, lParam);
+	    return DefWindowProc32A (hwnd, uMsg, wParam, lParam);
+    }
+    return 0;
+}
+
+
+void
+TRACKBAR_Register (void)
+{
+    WNDCLASS32A wndClass;
+
+    if (GlobalFindAtom32A (TRACKBAR_CLASS32A)) return;
+
+    ZeroMemory (&wndClass, sizeof(WNDCLASS32A));
+    wndClass.style         = CS_GLOBALCLASS;
+    wndClass.lpfnWndProc   = (WNDPROC32)TrackbarWindowProc;
+    wndClass.cbClsExtra    = 0;
+    wndClass.cbWndExtra    = sizeof(TRACKBAR_INFO *);
+    wndClass.hCursor       = LoadCursor32A (0, IDC_ARROW32A);
+    wndClass.hbrBackground = (HBRUSH32)(COLOR_3DFACE + 1);
+    wndClass.lpszClassName = TRACKBAR_CLASS32A;
+ 
+    RegisterClass32A (&wndClass);
+}
+
diff --git a/controls/treeview.c b/controls/treeview.c
new file mode 100644
index 0000000..65c1e6e
--- /dev/null
+++ b/controls/treeview.c
@@ -0,0 +1,77 @@
+/*
+ * Treeview control
+ *
+ * Copyright 1998 Eric Kohl
+ *
+ * NOTES
+ *   This is just a dummy control. An author is needed! Any volunteers?
+ *   I will only improve this control once in a while.
+ *     Eric <ekohl@abo.rhein-zeitung.de>
+ *
+ * TODO:
+ *   - All messages.
+ *   - All notifications.
+ */
+
+#include "windows.h"
+#include "commctrl.h"
+#include "treeview.h"
+#include "heap.h"
+#include "win.h"
+#include "debug.h"
+
+
+#define TREEVIEW_GetInfoPtr(wndPtr) ((TREEVIEW_INFO *)wndPtr->wExtra[0])
+
+
+LRESULT WINAPI
+TreeviewWindowProc (HWND32 hwnd, UINT32 uMsg, WPARAM32 wParam, LPARAM lParam)
+{
+    WND *wndPtr = WIN_FindWndPtr(hwnd);
+
+    switch (uMsg)
+    {
+//	case WM_CREATE:
+//	    return TREEVIEW_Create (wndPtr, wParam, lParam);
+
+//	case WM_DESTROY:
+//	    return TREEVIEW_Destroy (wndPtr, wParam, lParam);
+
+//	case WM_PAINT:
+//	    return TREEVIEW_Paint (wndPtr, wParam);
+
+//	case WM_SETFONT:
+
+//	case WM_TIMER:
+
+//	case WM_WININICHANGE:
+
+	default:
+	    if (uMsg >= WM_USER)
+		ERR (treeview, "unknown msg %04x wp=%08x lp=%08lx\n",
+		     uMsg, wParam, lParam);
+	    return DefWindowProc32A (hwnd, uMsg, wParam, lParam);
+    }
+    return 0;
+}
+
+
+void
+TREEVIEW_Register (void)
+{
+    WNDCLASS32A wndClass;
+
+    if (GlobalFindAtom32A (WC_TREEVIEW32A)) return;
+
+    ZeroMemory (&wndClass, sizeof(WNDCLASS32A));
+    wndClass.style         = CS_GLOBALCLASS | CS_DBLCLKS;
+    wndClass.lpfnWndProc   = (WNDPROC32)TreeviewWindowProc;
+    wndClass.cbClsExtra    = 0;
+    wndClass.cbWndExtra    = sizeof(TREEVIEW_INFO *);
+    wndClass.hCursor       = LoadCursor32A (0, IDC_ARROW32A);
+    wndClass.hbrBackground = 0;
+    wndClass.lpszClassName = WC_TREEVIEW32A;
+ 
+    RegisterClass32A (&wndClass);
+}
+
diff --git a/controls/updown.c b/controls/updown.c
index 03d6ed0..e93b5ef 100644
--- a/controls/updown.c
+++ b/controls/updown.c
@@ -8,7 +8,7 @@
  *     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 don not handle correctly the WS_BORDER style.
+ *   - I think I do not handle correctly the WS_BORDER style.
  *     (Should be fixed. <ekohl@abo.rhein-zeitung.de>)
  *
  * Testing:
diff --git a/documentation/common_controls b/documentation/common_controls
index e6c4a2f..83ccdb8 100644
--- a/documentation/common_controls
+++ b/documentation/common_controls
@@ -29,6 +29,7 @@
 -----------
   This paragraph describes the development status of the common controls.
 
+  
 
 
 3.1 Animation Control
@@ -98,11 +99,14 @@
 
 3.10 List View Control
 ----------------------
+  Author:
+      Dummy written by Eric Kohl.
+
   Status:
-      - Nothing done at all.
+      - Dummy control. No functionality.
 
   Notes:
-      This control id NEEDED in many places. Any volunteers??
+      This control is NEEDED in many places. Any volunteers??
 
 
 3.11 Month Calendar Control
@@ -113,12 +117,14 @@
 
 3.12 Pager Control
 ------------------
+  Author:
+      Dummy written by Eric Kohl.
+
   Status:
-      - Dummy control. No functionality.
-      - Not yet published.
+      Dummy control. No functionality.
 
   Notes:
-      The dummy source code is available from the author.
+      Author needed!! Any volunteers??
 
 
 3.13 Progress Bar Control
@@ -139,23 +145,27 @@
 
 3.14 Property Sheet
 -------------------
+  Author:
+      Anders Carlsson <anders.carlsson@linux.nu>
+
   Status:
-      - Nothing done at all.
+      - Development in progress.
+      - Not yet published.
 
   Notes:
-      - This control id NEEDED in many places.
-      - Tab control has to be implemented first.
-      Any volunteers??
+      Tab control must be implemented first.
 
 
 3.15 Rebar Control (Cool Bar)
 -----------------------------
+  Author:
+      Dummy written by Eric Kohl.
+
   Status:
       - Dummy control. No functionality.
-      - Not yet published.
 
   Notes:
-      The dummy source code is available from the author.
+      Author needed!! Any volunteers??
 
 
 3.16 Status Bar Control
@@ -176,9 +186,12 @@
 
 3.17 Tab Control
 ----------------
+  Author:
+      Anders Carlsson <anders.carlsson@linux.nu>
+
   Status:
-      - Nothing done at all.
-      - needed.
+      - Development in progress.
+      - Not yet published.
 
 
 3.18 Toolbar Control
@@ -190,6 +203,9 @@
       - Development in progress.
       - Basic functionality is almost done. (dll version 4.0)
 
+  Notes
+      Bitmaps are not correctly displayed.
+
 
 3.19 Tooltip Control
 --------------------
@@ -198,17 +214,21 @@
 
   Status:
       - Development in progress.
-      - Not yet published, but will be published soon.
+
+  Notes
+      The control does not show.
 
 
 3.20 Trackbar Control
 ---------------------
   Author:
-      Eric Kohl <ekohl@abo.rhein-zeitung.de>
+      Dummy written by Eric Kohl.
 
   Status:
-      - Development in progress.
-      - Not yet published, but will be published soon.
+      - Dummy control. No functionality.
+
+  Notes:
+      Author needed!! Any volunteers??
 
 
 3.21 Tree View Control
diff --git a/documentation/wine.man b/documentation/wine.man
index af45f42..bf57e1c 100644
--- a/documentation/wine.man
+++ b/documentation/wine.man
@@ -1,5 +1,5 @@
 .\" -*- nroff -*-
-.TH WINE 1 "June 22, 1998" "Version 980614" "Windows Emulator"
+.TH WINE 1 "July 8, 1998" "Version 980628" "Windows Emulator"
 .SH NAME
 wine \- run Windows programs under Unix
 .SH SYNOPSIS
@@ -38,11 +38,15 @@
 reetrant option enabled.  
 .PP
 .B libXpm
-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.  Usually it's in a
-package named something like XFree86-devel.
-
+must be installed.  If you're using Red Hat, the name of the package is
+XFree86-devel.  The sources may be FTP'd from ftp.Xfree86.org or its 
+mirrors.
+.PP
+.B gcc
+2.7.x or later is required to build
+.B wine.
+Versions earlier than 2.7.2.3 may have problems when certain files are
+compiled with optimization.
 .SH INSTALLATION
 To install 
 .B Wine,
@@ -59,7 +63,7 @@
 .PP
 For more information, see the 
 .B README
-file contained in the source distribution
+file contained in the source distribution.
 .SH OPTIONS
 .TP
 .I -backingstore
@@ -72,13 +76,20 @@
 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.
+xxx is optional and can be one of the following: 
+.I err, 
+.I warn, 
+.I fixme, 
+or 
+.I trace. 
+If xxx is not specified, all debugging messages for the specified
+channel are turned on.  # is required and can be either + or -.  Note that 
+there is not a space after the comma between names.
 .PP
 For instance:
 .PP
 .I -debugmsg warn+dll,+heap
-will turn on DLL and heap warning messages.  
+will turn on DLL warning messages and all heap messages.  
 .br
 .I -debugmsg fixme-all,warn+cursor,+relay
 will turn off all FIXME messages, turn on cursor warning messages, and turn
@@ -165,7 +176,7 @@
 .PD 1
 .SH PROGRAM/ARGUMENTS
 The program name may be specified in DOS format (C:\\WINDOWS\\SOL.EXE) or in 
-Linux format (/msdos/windows/sol.exe).  The program being executed may be 
+Unix format (/msdos/windows/sol.exe).  The program being executed may be 
 passed arguments by adding them on to the end of the command line invoking
 .B wine
 (such as: wine "notepad C:\\TEMP\\README.TXT").  Note that
@@ -183,7 +194,7 @@
 .B configure
 script.  Alternatively, you may have a 
 .I .winerc
-file of this format in your home directory or the environment variable
+file of this format in your home directory or have the environment variable
 .B WINE_INI
 pointing to a configuration file.
 .SH CONFIGURATION FILE FORMAT
@@ -327,7 +338,7 @@
 .br
 default: false
 .br 
-Use Win95 look (true) or Win3.1 look (false).
+Use Win95-like window displays or Win3.1-like window displays.
 .SH SAMPLE CONFIGURATION FILE
 [Drive A]
 .br
@@ -380,26 +391,14 @@
 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.
+.br 
+Win95Look=true
 .SH AUTHORS
 .B Wine
-is available thanks to the work of Bob Amstadt, Dag Asheim,
-Martin Ayotte, Ross Biro, Erik Bos, Fons Botman, John Brezak,
-Andrew Bulhak, John Burton, Paul Falstad, Olaf Flebbe, Peter Galbavy,
-Ramon Garcia, Hans de Graaf, Charles M. Hannum, Cameron Heide,
-Jochen Hoenicke, Jeffrey Hsu, Miguel de Icaza, Alexandre Julliard,
-Jon Konrath, Scott A. Laird, Martin von Loewis, Kenneth MacDonald,
-Peter MacDonald, William Magro, Marcus Meissner, Graham Menhennitt,
-David Metcalfe, Michael Patra, John Richardson, Johannes Ruscheinski,
-Thomas Sandford, Constantine Sapuntzakis, Daniel Schepler,
-Bernd Schmidt, Yngvi Sigurjonsson, Rick Sladkey, William Smith,
-Erik Svendsen, Goran Thyni, Jimmy Tirtawangsa, Jon Tombs,
-Linus Torvalds, Gregory Trubetskoy, Michael Veksler, Morten Welinder,
-Jan Willamowius, Carl Williams, Karl Guenter Wuensch, Eric Youngdale,
-and James Youngman.
+is available thanks to the work of many developers. For a listing
+of the authors, please see the file 
+.B AUTHORS
+in the top-level directory of the source distribution.
 .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
@@ -416,7 +415,7 @@
 .SH AVAILABILITY
 The most recent public version of 
 .B wine
-can be ftp'ed from tsx-11.mit.edu in the /pub/linux/ALPHA/Wine/development 
+can be ftp'ed from sunsite.unc.edu or 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
diff --git a/files/drive.c b/files/drive.c
index 72ede3d..de25491 100644
--- a/files/drive.c
+++ b/files/drive.c
@@ -742,15 +742,24 @@
 
 /***********************************************************************
  *           GetDriveType16   (KERNEL.136)
+ * This functions returns the drivetype of a drive in Win16. 
+ * Note that it returns DRIVE_REMOTE for CD-ROMs, since MSCDEX uses the
+ * remote drive API. The returnvalue DRIVE_REMOTE for CD-ROMs has been
+ * verified on Win3.11 and Windows 95. Some programs rely on it, so don't
+ * do any pseudo-clever changes.
+ *
+ * RETURNS
+ *	drivetype DRIVE_xxx
  */
-UINT16 WINAPI GetDriveType16( UINT16 drive )
-{
+UINT16 WINAPI GetDriveType16(
+	UINT16 drive	/* [in] number (NOT letter) of drive */
+) {
     TRACE(dosfs, "(%c:)\n", 'A' + drive );
     switch(DRIVE_GetType(drive))
     {
     case TYPE_FLOPPY:  return DRIVE_REMOVABLE;
     case TYPE_HD:      return DRIVE_FIXED;
-    case TYPE_CDROM:   return DRIVE_REMOVABLE;
+    case TYPE_CDROM:   return DRIVE_REMOTE;
     case TYPE_NETWORK: return DRIVE_REMOTE;
     case TYPE_INVALID:
     default:           return DRIVE_CANNOTDETERMINE;
diff --git a/files/profile.c b/files/profile.c
index fa4796e..4110e71 100644
--- a/files/profile.c
+++ b/files/profile.c
@@ -170,21 +170,20 @@
     char *p, *p2;
     int line = 0;
     PROFILESECTION *section, *first_section;
-    PROFILESECTION **prev_section;
-    PROFILEKEY *key, **prev_key;
+    PROFILESECTION **next_section;
+    PROFILEKEY *key, *prev_key, **next_key;
 
     first_section = HEAP_xalloc( SystemHeap, 0, sizeof(*section) );
     first_section->name = NULL;
     first_section->key  = NULL;
     first_section->next = NULL;
-    prev_section = &first_section->next;
-    prev_key     = &first_section->key;
+    next_section = &first_section->next;
+    next_key     = &first_section->key;
+    prev_key     = NULL;
 
     while (fgets( buffer, PROFILE_MAX_LINE_LEN, file ))
     {
         line++;
-        p = buffer + strlen(buffer) - 1;
-        while ((p > buffer) && ((*p == '\n') || PROFILE_isspace(*p))) *p--='\0';
         p = buffer;
         while (*p && PROFILE_isspace(*p)) p++;
         if (*p == '[')  /* section start */
@@ -202,9 +201,10 @@
                 section->name = HEAP_strdupA( SystemHeap, 0, p );
                 section->key  = NULL;
                 section->next = NULL;
-                *prev_section = section;
-                prev_section  = &section->next;
-                prev_key      = &section->key;
+                *next_section = section;
+                next_section  = &section->next;
+                next_key      = &section->key;
+                prev_key      = NULL;
                 continue;
             }
         }
@@ -214,20 +214,22 @@
             while ((p3 > p) && PROFILE_isspace(*p3)) *p3-- = '\0';
             *p2++ = '\0';
             while (*p2 && PROFILE_isspace(*p2)) p2++;
+            p3 = p2 + strlen(p2) - 1;
+            while ((p3 > p2) && ((*p3 == '\n') || PROFILE_isspace(*p3))) *p3--='\0';
         }
-        key = HEAP_xalloc( SystemHeap, 0, sizeof(*key) );
-        key->name  = HEAP_strdupA( SystemHeap, 0, p );
-        key->value = p2 ? HEAP_strdupA( SystemHeap, 0, p2 ) : NULL;
-        key->next  = NULL;
-        *prev_key  = key;
-        prev_key = &key->next;
-    }
-    if (TRACE_ON(profile))
-    {
-        TRACE(profile, "dump:\n" );
-	/* FIXME: improper use of stddeb! */
-        PROFILE_Save(stddeb, first_section );
-        TRACE(profile, "finished.\n" );
+
+        if(*p || !prev_key || *prev_key->name)
+          {
+           key = HEAP_xalloc( SystemHeap, 0, sizeof(*key) );
+           key->name  = HEAP_strdupA( SystemHeap, 0, p );
+           key->value = p2 ? HEAP_strdupA( SystemHeap, 0, p2 ) : NULL;
+           key->next  = NULL;
+           *next_key  = key;
+           next_key   = &key->next;
+           prev_key   = key;
+
+           TRACE(profile, "New key: name='%s', value='%s'\n",key->name,key->value?key->value:"(none)");
+          }
     }
     return first_section;
 }
@@ -467,10 +469,10 @@
  *           PROFILE_GetSection
  *
  * Returns all keys of a section.
- * If return_values is TRUE, also include the corrseponding values.
+ * If return_values is TRUE, also include the corresponding values.
  */
 static INT32 PROFILE_GetSection( PROFILESECTION *section, LPCSTR section_name,
-                                 LPSTR buffer, INT32 len, BOOL32 handle_env,
+                                 LPSTR buffer, UINT32 len, BOOL32 handle_env,
 				 BOOL32 return_values )
 {
     PROFILEKEY *key;
@@ -478,7 +480,7 @@
     {
         if (section->name && !strcasecmp( section->name, section_name ))
         {
-            INT32 oldlen = len;
+            UINT32 oldlen = len;
             for (key = section->key; key; key = key->next)
             {
                 if (len <= 2) break;
@@ -520,7 +522,7 @@
  * Get a profile string.
  */
 static INT32 PROFILE_GetString( LPCSTR section, LPCSTR key_name,
-                                LPCSTR def_val, LPSTR buffer, INT32 len )
+                                LPCSTR def_val, LPSTR buffer, UINT32 len )
 {
     PROFILEKEY *key = NULL;
 
@@ -843,7 +845,7 @@
  *           GetProfileString16   (KERNEL.58)
  */
 INT16 WINAPI GetProfileString16( LPCSTR section, LPCSTR entry, LPCSTR def_val,
-                                 LPSTR buffer, INT16 len )
+                                 LPSTR buffer, UINT16 len )
 {
     return GetPrivateProfileString16( section, entry, def_val,
                                       buffer, len, "win.ini" );
@@ -853,7 +855,7 @@
  *           GetProfileString32A   (KERNEL32.268)
  */
 INT32 WINAPI GetProfileString32A( LPCSTR section, LPCSTR entry, LPCSTR def_val,
-                                  LPSTR buffer, INT32 len )
+                                  LPSTR buffer, UINT32 len )
 {
     return GetPrivateProfileString32A( section, entry, def_val,
                                        buffer, len, "win.ini" );
@@ -863,7 +865,7 @@
  *           GetProfileString32W   (KERNEL32.269)
  */
 INT32 WINAPI GetProfileString32W( LPCWSTR section, LPCWSTR entry,
-                                  LPCWSTR def_val, LPWSTR buffer, INT32 len )
+                                  LPCWSTR def_val, LPWSTR buffer, UINT32 len )
 {
     if (!wininiW) wininiW = HEAP_strdupAtoW( SystemHeap, 0, "win.ini" );
     return GetPrivateProfileString32W( section, entry, def_val,
@@ -873,7 +875,7 @@
 /***********************************************************************
  *           GetProfileSection32A   (KERNEL32.268)
  */
-INT32 WINAPI GetProfileSection32A( LPCSTR section, LPSTR buffer, INT32 len )
+INT32 WINAPI GetProfileSection32A( LPCSTR section, LPSTR buffer, UINT32 len )
 {
     return GetPrivateProfileSection32A( section, buffer, len, "win.ini" );
 }
@@ -961,7 +963,7 @@
  */
 INT16 WINAPI GetPrivateProfileString16( LPCSTR section, LPCSTR entry,
                                         LPCSTR def_val, LPSTR buffer,
-                                        INT16 len, LPCSTR filename )
+                                        UINT16 len, LPCSTR filename )
 {
     return GetPrivateProfileString32A(section,entry,def_val,buffer,len,filename);
 }
@@ -971,7 +973,7 @@
  */
 INT32 WINAPI GetPrivateProfileString32A( LPCSTR section, LPCSTR entry,
                                          LPCSTR def_val, LPSTR buffer,
-                                         INT32 len, LPCSTR filename )
+                                         UINT32 len, LPCSTR filename )
 {
     if (!filename) 
 	filename = "win.ini";
@@ -986,7 +988,7 @@
  */
 INT32 WINAPI GetPrivateProfileString32W( LPCWSTR section, LPCWSTR entry,
                                          LPCWSTR def_val, LPWSTR buffer,
-                                         INT32 len, LPCWSTR filename )
+                                         UINT32 len, LPCWSTR filename )
 {
     LPSTR sectionA  = HEAP_strdupWtoA( GetProcessHeap(), 0, section );
     LPSTR entryA    = HEAP_strdupWtoA( GetProcessHeap(), 0, entry );
@@ -1008,7 +1010,7 @@
  *           GetPrivateProfileSection32A   (KERNEL32.255)
  */
 INT32 WINAPI GetPrivateProfileSection32A( LPCSTR section, LPSTR buffer,
-                                          INT32 len, LPCSTR filename )
+                                          UINT32 len, LPCSTR filename )
 {
     if (PROFILE_Open( filename ))
         return PROFILE_GetSection(CurProfile.section, section, buffer, len,
@@ -1091,7 +1093,8 @@
 	buf=buffer;
 	cursize=0;
 	section=CurProfile.section;
-	for ( ; section; section = section->next) {
+	for ( ; section; section = section->next) 
+            if (section->name) {
 		l=strlen (section->name);
 		cursize+=l+1;
         	if (cursize > size+1)
diff --git a/graphics/ddraw.c b/graphics/ddraw.c
index 5c46c13..2c5add5 100644
--- a/graphics/ddraw.c
+++ b/graphics/ddraw.c
@@ -1,4 +1,4 @@
-/*		DirectDraw using DGA
+/*		DirectDraw using DGA, XShm, or Xlib
  *
  * Copyright 1997,1998 Marcus Meissner
  */
@@ -51,6 +51,11 @@
 #include <unistd.h>
 #include <assert.h>
 #include "ts_xlib.h"
+#ifdef HAVE_LIBXXSHM
+#include "ts_xshm.h"
+#include <sys/ipc.h>
+#include <sys/shm.h>
+#endif
 #include <sys/signal.h>
 
 #include "windows.h"
@@ -65,6 +70,7 @@
 #include "ddraw.h"
 #include "d3d.h"
 #include "debug.h"
+#include "compobj.h"
 
 #ifdef HAVE_LIBXXF86DGA
 #include <X11/extensions/xf86dga.h>
@@ -75,22 +81,73 @@
  */
 #undef RESTORE_SIGNALS
 
-static struct IDirectDrawSurface3_VTable	dds3vt;
-static struct IDirectDrawSurface2_VTable	dds2vt;
-static struct IDirectDrawSurface_VTable		ddsvt;
-static struct IDirectDraw_VTable		ddvt;
-static struct IDirectDraw2_VTable		dd2vt;
+/* Where do these GUIDs come from?  mkuuid.
+ * They exist solely to distinguish between the targets Wine support,
+ * and should be different than any other GUIDs in existence.
+ */
+static GUID DGA_DirectDraw_GUID = { /* e2dcb020-dc60-11d1-8407-9714f5d50802 */
+	0xe2dcb020,
+	0xdc60,
+	0x11d1,
+	{0x84, 0x07, 0x97, 0x14, 0xf5, 0xd5, 0x08, 0x02}
+};
+static GUID XSHM_DirectDraw_GUID = { /* 2e494ff0-dc61-11d1-8407-860cf3f59f7a */
+    0x2e494ff0,
+    0xdc61,
+    0x11d1,
+    {0x84, 0x07, 0x86, 0x0c, 0xf3, 0xf5, 0x9f, 0x7a}
+};
+static GUID XLIB_DirectDraw_GUID = { /* 1574a740-dc61-11d1-8407-f7875a7d1879 */
+    0x1574a740,
+    0xdc61,
+    0x11d1,
+    {0x84, 0x07, 0xf7, 0x87, 0x5a, 0x7d, 0x18, 0x79}
+};
+
+static struct IDirectDrawSurface3_VTable	dga_dds3vt, xshm_dds3vt, xlib_dds3vt;
+static struct IDirectDrawSurface2_VTable	dga_dds2vt, xshm_dds2vt, xlib_dds2vt;
+static struct IDirectDrawSurface_VTable		dga_ddsvt, xshm_ddsvt, xlib_ddsvt;
+static struct IDirectDraw_VTable		dga_ddvt, xshm_ddvt, xlib_ddvt;
+static struct IDirectDraw2_VTable		dga_dd2vt, xshm_dd2vt, xlib_dd2vt;
+static struct IDirectDrawClipper_VTable	ddclipvt;
+static struct IDirectDrawPalette_VTable dga_ddpalvt, xshm_ddpalvt, xlib_ddpalvt;
 static struct IDirect3D_VTable			d3dvt;
 static struct IDirect3D2_VTable			d3d2vt;
 
+BOOL32
+DDRAW_DGA_Available()
+{
+#ifdef HAVE_LIBXXF86DGA
+	int evbase, evret;
+	return (getuid() == 0) && XF86DGAQueryExtension(display,&evbase,&evret);
+#else /* defined(HAVE_LIBXXF86DGA) */
+	return 0;
+#endif /* defined(HAVE_LIBXXF86DGA) */
+}
+
+BOOL32
+DDRAW_XShm_Available()
+{
+#ifdef HAVE_LIBXXSHM
+	return TSXShmQueryExtension(display);
+#else /* defined(HAVE_LIBXXSHM) */
+	return 0;
+#endif /* defined(HAVE_LIBXXSHM) */
+}
 
 HRESULT WINAPI
 DirectDrawEnumerate32A(LPDDENUMCALLBACK32A ddenumproc,LPVOID data) {
-	/* we have just one display driver right now ... */
-	ddenumproc(0,"WINE Display","display",data);
+	if (DDRAW_DGA_Available()) {
+		ddenumproc(&DGA_DirectDraw_GUID,"WINE with XFree86 DGA","wine-dga",data);
+	}
+	if (DDRAW_XShm_Available()) {
+		ddenumproc(&XSHM_DirectDraw_GUID,"WINE with MIT XShm","wine-xshm",data);
+	}
+	ddenumproc(&XLIB_DirectDraw_GUID,"WINE with Xlib","wine-xlib",data);
 	return 0;
 }
 
+/* What is this doing here? */
 HRESULT WINAPI 
 DSoundHelp(DWORD x,DWORD y,DWORD z) {
 	FIXME(ddraw,"(0x%08lx,0x%08lx,0x%08lx),stub!\n",x,y,z);
@@ -98,8 +155,6 @@
 }
 
 
-#ifdef HAVE_LIBXXF86DGA
-
 /******************************************************************************
  *		internal helper functions
  */
@@ -230,7 +285,7 @@
 	DUMP("\n");
 }
 
-void _dump_DDCAPS(DWORD flagmask) {
+static void _dump_DDCAPS(DWORD flagmask) {
 	int	i;
 	const struct {
 		DWORD	mask;
@@ -353,11 +408,12 @@
 		TRACE(ddraw,"	lprect: %dx%d-%dx%d\n",
 			lprect->top,lprect->left,lprect->bottom,lprect->right
 		);
-		lpddsd->y.lpSurface =	this->s.surface+
-					(lprect->top*this->s.lpitch)+
-					(lprect->left*(this->s.ddraw->d.depth/8));
-	} else
+		lpddsd->y.lpSurface = this->s.surface +
+			(lprect->top*this->s.lpitch) +
+			(lprect->left*(this->s.ddraw->d.depth/8));
+	} else {
 		lpddsd->y.lpSurface = this->s.surface;
+	}
 	lpddsd->dwFlags = DDSD_WIDTH|DDSD_HEIGHT|DDSD_PIXELFORMAT|DDSD_PITCH|DDSD_LPSURFACE;
 	lpddsd->dwWidth		= this->s.width;
 	lpddsd->dwHeight	= this->s.height;
@@ -366,14 +422,135 @@
 	return 0;
 }
 
-static HRESULT WINAPI IDirectDrawSurface_Unlock(
+static HRESULT WINAPI DGA_IDirectDrawSurface_Unlock(
 	LPDIRECTDRAWSURFACE this,LPVOID surface
 ) {
 	TRACE(ddraw,"(%p)->Unlock(%p)\n",this,surface);
 	return 0;
 }
 
-static HRESULT WINAPI IDirectDrawSurface_Flip(
+static HRESULT WINAPI XShm_IDirectDrawSurface_Unlock(
+	LPDIRECTDRAWSURFACE this,LPVOID surface
+) {
+#ifdef HAVE_LIBXXSHM
+	TRACE(ddraw,"(%p)->Unlock(%p)\n",this,surface);
+	if (!this->t.xshm.surface_is_image_data) {
+		FIXME(ddraw,"(%p)->Unlock(%p) needs an image copy!\n",this,surface);
+	}
+	/* FIXME: is it really right to display the image on unlock?
+	 * or should it wait for a Flip()? */
+	TSXShmPutImage(display,
+				   this->s.ddraw->e.xshm.drawable,
+				   DefaultGCOfScreen(screen),
+				   this->t.xshm.image,
+				   0, 0, 0, 0,
+				   this->t.xshm.image->width,
+				   this->t.xshm.image->height,
+				   False);
+	if (this->s.palette && this->s.palette->cm) {
+		TSXInstallColormap(display,this->s.palette->cm);
+	}
+	TSXSync(display,False);
+	return 0;
+#else /* defined(HAVE_LIBXXSHM) */
+	return E_UNEXPECTED;
+#endif /* defined(HAVE_LIBXXSHM) */
+}
+
+static HRESULT WINAPI Xlib_IDirectDrawSurface_Unlock(
+	LPDIRECTDRAWSURFACE this,LPVOID surface
+) {
+	TRACE(ddraw,"(%p)->Unlock(%p)\n",this,surface);
+	if (!this->t.xshm.surface_is_image_data) {
+		FIXME(ddraw,"(%p)->Unlock(%p) needs an image copy!\n",this,surface);
+	}
+	/* FIXME: is it really right to display the image on unlock?
+	 * or should it wait for a Flip()? */
+	TSXPutImage(display,
+				this->s.ddraw->e.xlib.drawable,
+				DefaultGCOfScreen(screen),
+				this->t.xlib.image,
+				0, 0, 0, 0,
+				this->t.xlib.image->width,
+				this->t.xlib.image->width);
+	if (this->s.palette && this->s.palette->cm) {
+		TSXInstallColormap(display,this->s.palette->cm);
+	}
+	TSXSync(display,False);
+	return 0;
+}
+
+static HRESULT WINAPI DGA_IDirectDrawSurface_Flip(
+	LPDIRECTDRAWSURFACE this,LPDIRECTDRAWSURFACE flipto,DWORD dwFlags
+) {
+#ifdef HAVE_LIBXXF86DGA
+	TRACE(ddraw,"(%p)->Flip(%p,%08lx)\n",this,flipto,dwFlags);
+	if (!flipto) {
+		if (this->s.backbuffer)
+			flipto = this->s.backbuffer;
+		else
+			flipto = this;
+	}
+	XF86DGASetViewPort(display,DefaultScreen(display),0,flipto->t.dga.fb_height);
+	if (flipto->s.palette && flipto->s.palette->cm) {
+		XF86DGAInstallColormap(display,DefaultScreen(display),flipto->s.palette->cm);
+	}
+	while (!XF86DGAViewPortChanged(display,DefaultScreen(display),2)) {
+	}
+	if (flipto!=this) {
+		int	tmp;
+		LPVOID	ptmp;
+
+		tmp = this->t.dga.fb_height;
+		this->t.dga.fb_height = flipto->t.dga.fb_height;
+		flipto->t.dga.fb_height = tmp;
+
+		ptmp = this->s.surface;
+		this->s.surface = flipto->s.surface;
+		flipto->s.surface = ptmp;
+	}
+	return 0;
+#else /* defined(HAVE_LIBXXF86DGA) */
+	return E_UNEXPECTED;
+#endif /* defined(HAVE_LIBXXF86DGA) */
+}
+
+static HRESULT WINAPI XShm_IDirectDrawSurface_Flip(
+	LPDIRECTDRAWSURFACE this,LPDIRECTDRAWSURFACE flipto,DWORD dwFlags
+) {
+#ifdef HAVE_LIBXXSHM
+	TRACE(ddraw,"(%p)->Flip(%p,%08lx)\n",this,flipto,dwFlags);
+	if (!flipto) {
+		if (this->s.backbuffer)
+			flipto = this->s.backbuffer;
+		else
+			flipto = this;
+	}
+	TSXShmPutImage(display,
+				   this->s.ddraw->e.xshm.drawable,
+				   DefaultGCOfScreen(screen),
+				   flipto->t.xshm.image,
+				   0, 0, 0, 0,
+				   flipto->t.xshm.image->width,
+				   flipto->t.xshm.image->height,
+				   False);
+	if (flipto->s.palette && flipto->s.palette->cm) {
+		TSXInstallColormap(display,flipto->s.palette->cm);
+	}
+	TSXSync(display,False);
+	if (flipto!=this) {
+		XImage *tmp;
+		tmp = this->t.xshm.image;
+		this->t.xshm.image = flipto->t.xshm.image;
+		flipto->t.xshm.image = tmp;
+	}
+	return 0;
+#else /* defined(HAVE_LIBXXSHM) */
+	return E_UNEXPECTED;
+#endif /* defined(HAVE_LIBXXSHM) */
+}
+
+static HRESULT WINAPI Xlib_IDirectDrawSurface_Flip(
 	LPDIRECTDRAWSURFACE this,LPDIRECTDRAWSURFACE flipto,DWORD dwFlags
 ) {
 	TRACE(ddraw,"(%p)->Flip(%p,%08lx)\n",this,flipto,dwFlags);
@@ -383,22 +560,22 @@
 		else
 			flipto = this;
 	}
-	XF86DGASetViewPort(display,DefaultScreen(display),0,flipto->s.fb_height);
-	if (flipto->s.palette && flipto->s.palette->cm)
-		XF86DGAInstallColormap(display,DefaultScreen(display),flipto->s.palette->cm);
-	while (!XF86DGAViewPortChanged(display,DefaultScreen(display),2)) {
+	TSXPutImage(display,
+				this->s.ddraw->e.xlib.drawable,
+				DefaultGCOfScreen(screen),
+				flipto->t.xlib.image,
+				0, 0, 0, 0,
+				flipto->t.xlib.image->width,
+				flipto->t.xlib.image->width);
+	if (flipto->s.palette && flipto->s.palette->cm) {
+		TSXInstallColormap(display,flipto->s.palette->cm);
 	}
+	TSXSync(display,False);
 	if (flipto!=this) {
-		int	tmp;
-		LPVOID	ptmp;
-
-		tmp = this->s.fb_height;
-		this->s.fb_height = flipto->s.fb_height;
-		flipto->s.fb_height = tmp;
-
-		ptmp = this->s.surface;
-		this->s.surface = flipto->s.surface;
-		flipto->s.surface = ptmp;
+		XImage *tmp;
+		tmp = this->t.xshm.image;
+		this->t.xshm.image = flipto->t.xshm.image;
+		flipto->t.xshm.image = tmp;
 	}
 	return 0;
 }
@@ -417,17 +594,18 @@
 	RECT32	xdst,xsrc;
 	int	i,j;
 
-	if (rdst)
+	if (rdst) {
 		memcpy(&xdst,rdst,sizeof(xdst));
-	else {
+	} else {
 		xdst.top	= 0;
 		xdst.bottom	= this->s.height;
 		xdst.left	= 0;
 		xdst.right	= this->s.width;
 	}
-	if (rsrc)
+
+	if (rsrc) {
 		memcpy(&xsrc,rsrc,sizeof(xsrc));
-	else if (src) {
+	} else if (src) {
 		xsrc.top	= 0;
 		xsrc.bottom	= src->s.height;
 		xsrc.left	= 0;
@@ -545,19 +723,54 @@
 	return ++(this->ref);
 }
 
-static ULONG WINAPI IDirectDrawSurface_Release(LPDIRECTDRAWSURFACE this) {
+static ULONG WINAPI DGA_IDirectDrawSurface_Release(LPDIRECTDRAWSURFACE this) {
 	TRACE(ddraw,"(%p)->Release()\n",this);
+#ifdef HAVE_LIBXXF86DGA
 	if (!--(this->ref)) {
 		this->s.ddraw->lpvtbl->fnRelease(this->s.ddraw);
 		/* clear out of surface list */
-		if (this->s.fb_height == -1) {
+		if (this->t.dga.fb_height == -1) {
 			HeapFree(GetProcessHeap(),0,this->s.surface);
 		} else {
-			this->s.ddraw->d.vpmask &= ~(1<<(this->s.fb_height/this->s.ddraw->d.fb_height));
+			this->s.ddraw->e.dga.vpmask &= ~(1<<(this->t.dga.fb_height/this->s.ddraw->e.dga.fb_height));
 		}
 		HeapFree(GetProcessHeap(),0,this);
 		return 0;
 	}
+#endif /* defined(HAVE_LIBXXF86DGA) */
+	return this->ref;
+}
+
+static ULONG WINAPI XShm_IDirectDrawSurface_Release(LPDIRECTDRAWSURFACE this) {
+	TRACE(ddraw,"(%p)->Release()\n",this);
+#ifdef HAVE_LIBXXSHM
+	if (!--(this->ref)) {
+		this->s.ddraw->lpvtbl->fnRelease(this->s.ddraw);
+		if (!this->t.xshm.surface_is_image_data) {
+			HeapFree(GetProcessHeap(),0,this->s.surface);
+		}
+		XShmDetach(display,&this->t.xshm.shminfo);
+		XDestroyImage(this->t.xshm.image);
+		shmdt(this->t.xshm.shminfo.shmaddr);
+		shmctl(this->t.xshm.shminfo.shmid, IPC_RMID, 0);
+		HeapFree(GetProcessHeap(),0,this);
+		return 0;
+	}
+#endif /* defined(HAVE_LIBXXSHM) */
+	return this->ref;
+}
+
+static ULONG WINAPI Xlib_IDirectDrawSurface_Release(LPDIRECTDRAWSURFACE this) {
+	TRACE(ddraw,"(%p)->Release()\n",this);
+	if (!--(this->ref)) {
+		this->s.ddraw->lpvtbl->fnRelease(this->s.ddraw);
+		if (!this->t.xshm.surface_is_image_data) {
+			HeapFree(GetProcessHeap(),0,this->s.surface);
+		}
+		XDestroyImage(this->t.xshm.image);
+		HeapFree(GetProcessHeap(),0,this);
+		return 0;
+	}
 	return this->ref;
 }
 
@@ -627,7 +840,36 @@
 	return 0;
 }
 
-static HRESULT WINAPI IDirectDrawSurface_QueryInterface(LPDIRECTDRAWSURFACE this,REFIID refiid,LPVOID *obj) {
+static HRESULT WINAPI DGA_IDirectDrawSurface_QueryInterface(LPDIRECTDRAWSURFACE this,REFIID refiid,LPVOID *obj) {
+        char    xrefiid[50];
+
+        WINE_StringFromCLSID((LPCLSID)refiid,xrefiid);
+        TRACE(ddraw,"(%p)->(%s,%p)\n",this,xrefiid,obj);
+	
+	/* thats version 3 (DirectX 5) */
+	if (!memcmp(&IID_IDirectDrawSurface3,refiid,sizeof(IID_IDirectDrawSurface3))) {
+		this->lpvtbl = (LPDIRECTDRAWSURFACE_VTABLE)&dga_dds3vt;
+		this->lpvtbl->fnAddRef(this);
+		*obj = this;
+		return 0;
+	}
+	/* thats version 2 (DirectX 3) */
+	if (!memcmp(&IID_IDirectDrawSurface2,refiid,sizeof(IID_IDirectDrawSurface2))) {
+		this->lpvtbl = (LPDIRECTDRAWSURFACE_VTABLE)&dga_dds2vt;
+		*obj = this;
+		return 0;
+	}
+	/* thats us */
+	if (!memcmp(&IID_IDirectDrawSurface,refiid,sizeof(IID_IDirectDrawSurface))) {
+		this->lpvtbl->fnAddRef(this);
+		*obj = this;
+		return 0;
+	}
+	WARN(ddraw,"(%p):interface for IID %s _NOT_ found!\n",this,xrefiid);
+	return OLE_E_ENUM_NOMORE;
+}
+
+static HRESULT WINAPI XShm_IDirectDrawSurface_QueryInterface(LPDIRECTDRAWSURFACE this,REFIID refiid,LPVOID *obj) {
         char    xrefiid[50];
 
         WINE_StringFromCLSID((LPCLSID)refiid,xrefiid);
@@ -636,14 +878,42 @@
 	/* thats version 3 (DirectX 5) */
 	if (	!memcmp(&IID_IDirectDrawSurface3,refiid,sizeof(IID_IDirectDrawSurface3))) {
 		this->lpvtbl->fnAddRef(this);
-		this->lpvtbl = (LPDIRECTDRAWSURFACE_VTABLE)&dds3vt;
+		this->lpvtbl = (LPDIRECTDRAWSURFACE_VTABLE)&xshm_dds3vt;
 		*obj = this;
 		return 0;
 	}
 	/* thats version 2 (DirectX 3) */
-	if (	!memcmp(&IID_IDirectDrawSurface2,refiid,sizeof(IID_IDirectDrawSurface2))) {
+	if (!memcmp(&IID_IDirectDrawSurface2,refiid,sizeof(IID_IDirectDrawSurface2))) {
+		this->lpvtbl = (LPDIRECTDRAWSURFACE_VTABLE)&xshm_dds2vt;
+		*obj = this;
+		return 0;
+	}
+	/* thats us */
+	if (!memcmp(&IID_IDirectDrawSurface,refiid,sizeof(IID_IDirectDrawSurface))) {
 		this->lpvtbl->fnAddRef(this);
-		this->lpvtbl = (LPDIRECTDRAWSURFACE_VTABLE)&dds2vt;
+		*obj = this;
+		return 0;
+	}
+	WARN(ddraw,"(%p):interface for IID %s _NOT_ found!\n",this,xrefiid);
+	return OLE_E_ENUM_NOMORE;
+}
+
+static HRESULT WINAPI Xlib_IDirectDrawSurface_QueryInterface(LPDIRECTDRAWSURFACE this,REFIID refiid,LPVOID *obj) {
+        char    xrefiid[50];
+
+        WINE_StringFromCLSID((LPCLSID)refiid,xrefiid);
+        TRACE(ddraw,"(%p)->(%s,%p)\n",this,xrefiid,obj);
+	
+	/* thats version 3 (DirectX 5) */
+	if (!memcmp(&IID_IDirectDrawSurface3,refiid,sizeof(IID_IDirectDrawSurface3))) {
+		this->lpvtbl = (LPDIRECTDRAWSURFACE_VTABLE)&xlib_dds3vt;
+		this->lpvtbl->fnAddRef(this);
+		*obj = this;
+		return 0;
+	}
+	/* thats version 2 (DirectX 3) */
+	if (!memcmp(&IID_IDirectDrawSurface2,refiid,sizeof(IID_IDirectDrawSurface2))) {
+		this->lpvtbl = (LPDIRECTDRAWSURFACE_VTABLE)&xlib_dds2vt;
 		*obj = this;
 		return 0;
 	}
@@ -661,10 +931,10 @@
 	return 0; /* hmm */
 }
 
-static struct IDirectDrawSurface_VTable ddsvt = {
-	IDirectDrawSurface_QueryInterface,
+static struct IDirectDrawSurface_VTable dga_ddsvt = {
+	DGA_IDirectDrawSurface_QueryInterface,
 	IDirectDrawSurface_AddRef,
-	IDirectDrawSurface_Release,
+	DGA_IDirectDrawSurface_Release,
 	IDirectDrawSurface_AddAttachedSurface,
 	(void*)5,
 	IDirectDrawSurface_Blt,
@@ -673,7 +943,7 @@
 	(void*)9,
 	(void*)10,
 	(void*)11,
-	IDirectDrawSurface_Flip,
+	DGA_IDirectDrawSurface_Flip,
 	IDirectDrawSurface_GetAttachedSurface,
 	IDirectDrawSurface_GetBltStatus,
 	IDirectDrawSurface_GetCaps,
@@ -694,7 +964,85 @@
 	(void*)30,
 	(void*)31,
 	IDirectDrawSurface_SetPalette,
-	IDirectDrawSurface_Unlock,
+	DGA_IDirectDrawSurface_Unlock,
+	(void*)34,
+	(void*)35,
+	(void*)36,
+};
+
+static struct IDirectDrawSurface_VTable xshm_ddsvt = {
+	XShm_IDirectDrawSurface_QueryInterface,
+	IDirectDrawSurface_AddRef,
+	XShm_IDirectDrawSurface_Release,
+	IDirectDrawSurface_AddAttachedSurface,
+	(void*)5,
+	IDirectDrawSurface_Blt,
+	IDirectDrawSurface_BltBatch,
+	IDirectDrawSurface_BltFast,
+	(void*)9,
+	(void*)10,
+	(void*)11,
+	XShm_IDirectDrawSurface_Flip,
+	IDirectDrawSurface_GetAttachedSurface,
+	IDirectDrawSurface_GetBltStatus,
+	IDirectDrawSurface_GetCaps,
+	(void*)16,
+	(void*)17,
+	IDirectDrawSurface_GetDC,
+	(void*)19,
+	IDirectDrawSurface_GetOverlayPosition,
+	(void*)21,
+	IDirectDrawSurface_GetPixelFormat,
+	IDirectDrawSurface_GetSurfaceDesc,
+	IDirectDrawSurface_Initialize,
+	IDirectDrawSurface_IsLost,
+	IDirectDrawSurface_Lock,
+	(void*)27,
+	(void*)28,
+	IDirectDrawSurface_SetClipper,
+	(void*)30,
+	(void*)31,
+	IDirectDrawSurface_SetPalette,
+	XShm_IDirectDrawSurface_Unlock,
+	(void*)34,
+	(void*)35,
+	(void*)36,
+};
+
+static struct IDirectDrawSurface_VTable xlib_ddsvt = {
+	Xlib_IDirectDrawSurface_QueryInterface,
+	IDirectDrawSurface_AddRef,
+	Xlib_IDirectDrawSurface_Release,
+	IDirectDrawSurface_AddAttachedSurface,
+	(void*)5,
+	IDirectDrawSurface_Blt,
+	IDirectDrawSurface_BltBatch,
+	IDirectDrawSurface_BltFast,
+	(void*)9,
+	(void*)10,
+	(void*)11,
+	Xlib_IDirectDrawSurface_Flip,
+	IDirectDrawSurface_GetAttachedSurface,
+	IDirectDrawSurface_GetBltStatus,
+	IDirectDrawSurface_GetCaps,
+	(void*)16,
+	(void*)17,
+	IDirectDrawSurface_GetDC,
+	(void*)19,
+	IDirectDrawSurface_GetOverlayPosition,
+	(void*)21,
+	IDirectDrawSurface_GetPixelFormat,
+	IDirectDrawSurface_GetSurfaceDesc,
+	IDirectDrawSurface_Initialize,
+	IDirectDrawSurface_IsLost,
+	IDirectDrawSurface_Lock,
+	(void*)27,
+	(void*)28,
+	IDirectDrawSurface_SetClipper,
+	(void*)30,
+	(void*)31,
+	IDirectDrawSurface_SetPalette,
+	Xlib_IDirectDrawSurface_Unlock,
 	(void*)34,
 	(void*)35,
 	(void*)36,
@@ -711,11 +1059,22 @@
 	return IDirectDrawSurface_Lock((LPDIRECTDRAWSURFACE)this,lprect,lpddsd,flags,hnd);
 }
 
-static HRESULT WINAPI IDirectDrawSurface2_Unlock(
+static HRESULT WINAPI DGA_IDirectDrawSurface2_Unlock(
 	LPDIRECTDRAWSURFACE2 this,LPVOID surface
 ) {
-	TRACE(ddraw,"(%p)->Unlock(%p)\n",this,surface);
-	return 0;
+	return DGA_IDirectDrawSurface_Unlock((LPDIRECTDRAWSURFACE)this,surface);
+}
+
+static HRESULT WINAPI XShm_IDirectDrawSurface2_Unlock(
+	LPDIRECTDRAWSURFACE2 this,LPVOID surface
+) {
+	return DGA_IDirectDrawSurface_Unlock((LPDIRECTDRAWSURFACE)this,surface);
+}
+
+static HRESULT WINAPI Xlib_IDirectDrawSurface2_Unlock(
+	LPDIRECTDRAWSURFACE2 this,LPVOID surface
+) {
+	return DGA_IDirectDrawSurface_Unlock((LPDIRECTDRAWSURFACE)this,surface);
 }
 
 static HRESULT WINAPI IDirectDrawSurface2_SetPalette(
@@ -729,50 +1088,134 @@
 	return ++(this->ref);
 }
 
-static ULONG WINAPI IDirectDrawSurface2_Release(LPDIRECTDRAWSURFACE2 this) {
-	return IDirectDrawSurface_Release((LPDIRECTDRAWSURFACE)this);
+static ULONG WINAPI DGA_IDirectDrawSurface2_Release(LPDIRECTDRAWSURFACE2 this) {
+	return DGA_IDirectDrawSurface_Release((LPDIRECTDRAWSURFACE)this);
 }
 
-static HRESULT WINAPI IDirectDrawSurface2_GetAttachedSurface(
+static ULONG WINAPI XShm_IDirectDrawSurface2_Release(LPDIRECTDRAWSURFACE2 this) {
+	return XShm_IDirectDrawSurface_Release((LPDIRECTDRAWSURFACE)this);
+}
+
+static ULONG WINAPI Xlib_IDirectDrawSurface2_Release(LPDIRECTDRAWSURFACE2 this) {
+	return Xlib_IDirectDrawSurface_Release((LPDIRECTDRAWSURFACE)this);
+}
+
+static HRESULT WINAPI IDirectDrawSurface2_Blt(
+	LPDIRECTDRAWSURFACE2 this,LPRECT32 rdst,LPDIRECTDRAWSURFACE2 src,LPRECT32 rsrc,DWORD dwFlags,LPDDBLTFX lpbltfx
+) {
+	return IDirectDrawSurface_Blt((LPDIRECTDRAWSURFACE)this, rdst, (LPDIRECTDRAWSURFACE)src, rsrc, dwFlags,lpbltfx);
+}
+
+static HRESULT WINAPI IDirectDrawSurface2_BltFast(
+	LPDIRECTDRAWSURFACE2 this,DWORD dstx,DWORD dsty,LPDIRECTDRAWSURFACE2 src,LPRECT32 rsrc,DWORD trans
+) {
+	return IDirectDrawSurface_BltFast((LPDIRECTDRAWSURFACE)this,dstx,dsty,(LPDIRECTDRAWSURFACE)src,rsrc,trans);
+}
+
+static HRESULT WINAPI IDirectDrawSurface2_BltBatch(
+	LPDIRECTDRAWSURFACE2 this,LPDDBLTBATCH ddbltbatch,DWORD x,DWORD y
+) {
+	return IDirectDrawSurface_BltBatch((LPDIRECTDRAWSURFACE)this,ddbltbatch,x,y);
+}
+
+static HRESULT WINAPI DGA_IDirectDrawSurface2_GetAttachedSurface(
 	LPDIRECTDRAWSURFACE2 this,LPDDSCAPS lpddsd,LPDIRECTDRAWSURFACE2 *lpdsf
 ) {
-	HRESULT	ret = IDirectDrawSurface_GetAttachedSurface((LPDIRECTDRAWSURFACE)this,lpddsd,(LPDIRECTDRAWSURFACE*)lpdsf);
+	HRESULT	ret;
 
-	if (!ret)
-		(*lpdsf)->lpvtbl = &dds2vt;
+	ret = IDirectDrawSurface_GetAttachedSurface((LPDIRECTDRAWSURFACE)this,lpddsd,(LPDIRECTDRAWSURFACE*)lpdsf);
+
+	if (!ret) {
+		(*lpdsf)->lpvtbl = &dga_dds2vt;
+	}
 	return ret;
 }
 
+static HRESULT WINAPI XShm_IDirectDrawSurface2_GetAttachedSurface(
+	LPDIRECTDRAWSURFACE2 this,LPDDSCAPS lpddsd,LPDIRECTDRAWSURFACE2 *lpdsf
+) {
+	HRESULT	ret;
+
+	ret = IDirectDrawSurface_GetAttachedSurface((LPDIRECTDRAWSURFACE)this,lpddsd,(LPDIRECTDRAWSURFACE*)lpdsf);
+
+	if (!ret) {
+		(*lpdsf)->lpvtbl = &xshm_dds2vt;
+	}
+	return ret;
+}
+
+static HRESULT WINAPI Xlib_IDirectDrawSurface2_GetAttachedSurface(
+	LPDIRECTDRAWSURFACE2 this,LPDDSCAPS lpddsd,LPDIRECTDRAWSURFACE2 *lpdsf
+) {
+	HRESULT	ret;
+
+	ret = IDirectDrawSurface_GetAttachedSurface((LPDIRECTDRAWSURFACE)this,lpddsd,(LPDIRECTDRAWSURFACE*)lpdsf);
+
+	if (!ret) {
+		(*lpdsf)->lpvtbl = &xlib_dds2vt;
+	}
+	return ret;
+}
+
+static HRESULT WINAPI DGA_IDirectDrawSurface2_Flip(
+	LPDIRECTDRAWSURFACE2 this,LPDIRECTDRAWSURFACE2 flipto,DWORD dwFlags
+) {
+	return DGA_IDirectDrawSurface_Flip((LPDIRECTDRAWSURFACE)this,(LPDIRECTDRAWSURFACE)flipto,dwFlags);
+}
+
+static HRESULT WINAPI XShm_IDirectDrawSurface2_Flip(
+	LPDIRECTDRAWSURFACE2 this,LPDIRECTDRAWSURFACE2 flipto,DWORD dwFlags
+) {
+	return XShm_IDirectDrawSurface_Flip((LPDIRECTDRAWSURFACE)this,(LPDIRECTDRAWSURFACE)flipto,dwFlags);
+}
+
+static HRESULT WINAPI Xlib_IDirectDrawSurface2_Flip(
+	LPDIRECTDRAWSURFACE2 this,LPDIRECTDRAWSURFACE2 flipto,DWORD dwFlags
+) {
+	return Xlib_IDirectDrawSurface_Flip((LPDIRECTDRAWSURFACE)this,(LPDIRECTDRAWSURFACE)flipto,dwFlags);
+}
+
 static HRESULT WINAPI IDirectDrawSurface2_EnumAttachedSurfaces(LPDIRECTDRAWSURFACE2 this,LPVOID context,LPDDENUMSURFACESCALLBACK esfcb) {
 	FIXME(ddraw,"(%p)->(%p,%p),stub!\n",this,context,esfcb);
 	return 0;
 }
 
-static HRESULT WINAPI IDirectDrawSurface2_QueryInterface(
+static HRESULT WINAPI DGA_IDirectDrawSurface2_QueryInterface(
 	LPDIRECTDRAWSURFACE2 this,REFIID riid,LPVOID *ppobj
 ) {
-	return IDirectDrawSurface_QueryInterface((LPDIRECTDRAWSURFACE)this,riid,ppobj);
+	return DGA_IDirectDrawSurface_QueryInterface((LPDIRECTDRAWSURFACE)this,riid,ppobj);
+}
+
+static HRESULT WINAPI XShm_IDirectDrawSurface2_QueryInterface(
+	LPDIRECTDRAWSURFACE2 this,REFIID riid,LPVOID *ppobj
+) {
+	return XShm_IDirectDrawSurface_QueryInterface((LPDIRECTDRAWSURFACE)this,riid,ppobj);
+}
+
+static HRESULT WINAPI Xlib_IDirectDrawSurface2_QueryInterface(
+	LPDIRECTDRAWSURFACE2 this,REFIID riid,LPVOID *ppobj
+) {
+	return Xlib_IDirectDrawSurface_QueryInterface((LPDIRECTDRAWSURFACE)this,riid,ppobj);
 }
 
 static HRESULT WINAPI IDirectDrawSurface2_IsLost(LPDIRECTDRAWSURFACE2 this) {
 	return 0; /* hmm */
 }
 
-
-static struct IDirectDrawSurface2_VTable dds2vt = {
-	IDirectDrawSurface2_QueryInterface,
+static struct IDirectDrawSurface2_VTable dga_dds2vt = {
+	DGA_IDirectDrawSurface2_QueryInterface,
 	IDirectDrawSurface2_AddRef,
-	IDirectDrawSurface2_Release,
+	DGA_IDirectDrawSurface2_Release,
 	(void*)4,
 	(void*)5,
-	(void*)6/*IDirectDrawSurface_Blt*/,
-	(void*)7/*IDirectDrawSurface_BltBatch*/,
-	(void*)8,
+	IDirectDrawSurface2_Blt,
+	IDirectDrawSurface2_BltBatch,
+	IDirectDrawSurface2_BltFast,
 	(void*)9,
 	IDirectDrawSurface2_EnumAttachedSurfaces,
 	(void*)11,
-	(void*)12,
-	IDirectDrawSurface2_GetAttachedSurface,
+	DGA_IDirectDrawSurface2_Flip,
+	DGA_IDirectDrawSurface2_GetAttachedSurface,
 	(void*)14,
 	(void*)15/*IDirectDrawSurface_GetCaps*/,
 	(void*)16,
@@ -792,7 +1235,91 @@
 	(void*)30,
 	(void*)31,
 	IDirectDrawSurface2_SetPalette,
-	IDirectDrawSurface2_Unlock,
+	DGA_IDirectDrawSurface2_Unlock,
+	(void*)34,
+	(void*)35,
+	(void*)36,
+	(void*)37,
+	(void*)38,
+	(void*)39,
+};
+
+static struct IDirectDrawSurface2_VTable xshm_dds2vt = {
+	XShm_IDirectDrawSurface2_QueryInterface,
+	IDirectDrawSurface2_AddRef,
+	XShm_IDirectDrawSurface2_Release,
+	(void*)4,
+	(void*)5,
+	IDirectDrawSurface2_Blt,
+	IDirectDrawSurface2_BltBatch,
+	IDirectDrawSurface2_BltFast,
+	(void*)9,
+	IDirectDrawSurface2_EnumAttachedSurfaces,
+	(void*)11,
+	XShm_IDirectDrawSurface2_Flip,
+	XShm_IDirectDrawSurface2_GetAttachedSurface,
+	(void*)14,
+	(void*)15/*IDirectDrawSurface_GetCaps*/,
+	(void*)16,
+	(void*)17,
+	(void*)18,
+	(void*)19,
+	(void*)20,
+	(void*)21,
+	(void*)22,
+	(void*)23/*IDirectDrawSurface_GetSurfaceDesc*/,
+	(void*)24,
+	IDirectDrawSurface2_IsLost,
+	IDirectDrawSurface2_Lock,
+	(void*)27,
+	(void*)28,
+	(void*)29,
+	(void*)30,
+	(void*)31,
+	IDirectDrawSurface2_SetPalette,
+	XShm_IDirectDrawSurface2_Unlock,
+	(void*)34,
+	(void*)35,
+	(void*)36,
+	(void*)37,
+	(void*)38,
+	(void*)39,
+};
+
+static struct IDirectDrawSurface2_VTable xlib_dds2vt = {
+	Xlib_IDirectDrawSurface2_QueryInterface,
+	IDirectDrawSurface2_AddRef,
+	Xlib_IDirectDrawSurface2_Release,
+	(void*)4,
+	(void*)5,
+	IDirectDrawSurface2_Blt,
+	IDirectDrawSurface2_BltBatch,
+	IDirectDrawSurface2_BltFast,
+	(void*)9,
+	IDirectDrawSurface2_EnumAttachedSurfaces,
+	(void*)11,
+	Xlib_IDirectDrawSurface2_Flip,
+	Xlib_IDirectDrawSurface2_GetAttachedSurface,
+	(void*)14,
+	(void*)15/*IDirectDrawSurface_GetCaps*/,
+	(void*)16,
+	(void*)17,
+	(void*)18,
+	(void*)19,
+	(void*)20,
+	(void*)21,
+	(void*)22,
+	(void*)23/*IDirectDrawSurface_GetSurfaceDesc*/,
+	(void*)24,
+	IDirectDrawSurface2_IsLost,
+	IDirectDrawSurface2_Lock,
+	(void*)27,
+	(void*)28,
+	(void*)29,
+	(void*)30,
+	(void*)31,
+	IDirectDrawSurface2_SetPalette,
+	Xlib_IDirectDrawSurface2_Unlock,
 	(void*)34,
 	(void*)35,
 	(void*)36,
@@ -816,13 +1343,42 @@
 	return _getpixelformat(this->s.ddraw,pf);
 }
 
-static HRESULT WINAPI IDirectDrawSurface3_GetAttachedSurface(
+static HRESULT WINAPI DGA_IDirectDrawSurface3_GetAttachedSurface(
 	LPDIRECTDRAWSURFACE3 this,LPDDSCAPS lpddsd,LPDIRECTDRAWSURFACE3 *lpdsf
 ) {
-	HRESULT	ret = IDirectDrawSurface_GetAttachedSurface((LPDIRECTDRAWSURFACE)this,lpddsd,(LPDIRECTDRAWSURFACE*)lpdsf);
+	HRESULT	ret;
 
-	if (!ret)
-		(*lpdsf)->lpvtbl = &dds3vt;
+	ret = IDirectDrawSurface_GetAttachedSurface((LPDIRECTDRAWSURFACE)this,lpddsd,(LPDIRECTDRAWSURFACE*)lpdsf);
+
+	if (!ret) {
+		(*lpdsf)->lpvtbl = &dga_dds3vt;
+	}
+	return ret;
+}
+
+static HRESULT WINAPI XShm_IDirectDrawSurface3_GetAttachedSurface(
+	LPDIRECTDRAWSURFACE3 this,LPDDSCAPS lpddsd,LPDIRECTDRAWSURFACE3 *lpdsf
+) {
+	HRESULT	ret;
+
+	ret = IDirectDrawSurface_GetAttachedSurface((LPDIRECTDRAWSURFACE)this,lpddsd,(LPDIRECTDRAWSURFACE*)lpdsf);
+
+	if (!ret) {
+		(*lpdsf)->lpvtbl = &xshm_dds3vt;
+	}
+	return ret;
+}
+
+static HRESULT WINAPI Xlib_IDirectDrawSurface3_GetAttachedSurface(
+	LPDIRECTDRAWSURFACE3 this,LPDDSCAPS lpddsd,LPDIRECTDRAWSURFACE3 *lpdsf
+) {
+	HRESULT	ret;
+
+	ret = IDirectDrawSurface_GetAttachedSurface((LPDIRECTDRAWSURFACE)this,lpddsd,(LPDIRECTDRAWSURFACE*)lpdsf);
+
+	if (!ret) {
+		(*lpdsf)->lpvtbl = &xlib_dds3vt;
+	}
 	return ret;
 }
 
@@ -831,15 +1387,16 @@
 	return ++(this->ref);
 }
 
-static ULONG WINAPI IDirectDrawSurface3_Release(LPDIRECTDRAWSURFACE3 this) {
-	TRACE(ddraw,"(%p)->Release()\n",this);
-	if (!--(this->ref)) {
-		this->s.ddraw->lpvtbl->fnRelease(this->s.ddraw);
-		this->s.ddraw->d.vpmask &= ~(1<<(this->s.fb_height/this->s.ddraw->d.fb_height));
-		HeapFree(GetProcessHeap(),0,this);
-		return 0;
-	}
-	return this->ref;
+static ULONG WINAPI DGA_IDirectDrawSurface3_Release(LPDIRECTDRAWSURFACE3 this) {
+	return DGA_IDirectDrawSurface_Release((LPDIRECTDRAWSURFACE)this);
+}
+
+static ULONG WINAPI XShm_IDirectDrawSurface3_Release(LPDIRECTDRAWSURFACE3 this) {
+	return XShm_IDirectDrawSurface_Release((LPDIRECTDRAWSURFACE)this);
+}
+
+static ULONG WINAPI Xlib_IDirectDrawSurface3_Release(LPDIRECTDRAWSURFACE3 this) {
+	return Xlib_IDirectDrawSurface_Release((LPDIRECTDRAWSURFACE)this);
 }
 
 static HRESULT WINAPI IDirectDrawSurface3_Blt(
@@ -863,10 +1420,22 @@
 	return IDirectDrawSurface_GetBltStatus((LPDIRECTDRAWSURFACE)this,dwflags);
 }
 
-static HRESULT WINAPI IDirectDrawSurface3_Flip(
+static HRESULT WINAPI DGA_IDirectDrawSurface3_Flip(
 	LPDIRECTDRAWSURFACE3 this,LPDIRECTDRAWSURFACE3 flipto,DWORD dwFlags
 ) {
-	return IDirectDrawSurface_Flip((LPDIRECTDRAWSURFACE)this,(LPDIRECTDRAWSURFACE)flipto,dwFlags);
+	return DGA_IDirectDrawSurface_Flip((LPDIRECTDRAWSURFACE)this,(LPDIRECTDRAWSURFACE)flipto,dwFlags);
+}
+
+static HRESULT WINAPI XShm_IDirectDrawSurface3_Flip(
+	LPDIRECTDRAWSURFACE3 this,LPDIRECTDRAWSURFACE3 flipto,DWORD dwFlags
+) {
+	return XShm_IDirectDrawSurface_Flip((LPDIRECTDRAWSURFACE)this,(LPDIRECTDRAWSURFACE)flipto,dwFlags);
+}
+
+static HRESULT WINAPI Xlib_IDirectDrawSurface3_Flip(
+	LPDIRECTDRAWSURFACE3 this,LPDIRECTDRAWSURFACE3 flipto,DWORD dwFlags
+) {
+	return Xlib_IDirectDrawSurface_Flip((LPDIRECTDRAWSURFACE)this,(LPDIRECTDRAWSURFACE)flipto,dwFlags);
 }
 
 static HRESULT WINAPI IDirectDrawSurface3_Lock(
@@ -875,10 +1444,22 @@
 	return IDirectDrawSurface_Lock((LPDIRECTDRAWSURFACE)this,lprect,lpddsd,flags,hnd); 
 }
 
-static HRESULT WINAPI IDirectDrawSurface3_Unlock(
+static HRESULT WINAPI DGA_IDirectDrawSurface3_Unlock(
 	LPDIRECTDRAWSURFACE3 this,LPVOID surface
 ) {
-	return IDirectDrawSurface_Unlock((LPDIRECTDRAWSURFACE)this,surface);
+	return DGA_IDirectDrawSurface_Unlock((LPDIRECTDRAWSURFACE)this,surface);
+}
+
+static HRESULT WINAPI XShm_IDirectDrawSurface3_Unlock(
+	LPDIRECTDRAWSURFACE3 this,LPVOID surface
+) {
+	return XShm_IDirectDrawSurface_Unlock((LPDIRECTDRAWSURFACE)this,surface);
+}
+
+static HRESULT WINAPI Xlib_IDirectDrawSurface3_Unlock(
+	LPDIRECTDRAWSURFACE3 this,LPVOID surface
+) {
+	return Xlib_IDirectDrawSurface_Unlock((LPDIRECTDRAWSURFACE)this,surface);
 }
 
 static HRESULT WINAPI IDirectDrawSurface3_EnumAttachedSurfaces(LPDIRECTDRAWSURFACE3 this,LPVOID context,LPDDENUMSURFACESCALLBACK esfcb) {
@@ -892,16 +1473,28 @@
 	return IDirectDrawSurface_SetClipper((LPDIRECTDRAWSURFACE)this,clipper);
 }
 
-static HRESULT WINAPI IDirectDrawSurface3_QueryInterface(
+static HRESULT WINAPI DGA_IDirectDrawSurface3_QueryInterface(
 	LPDIRECTDRAWSURFACE3 this,REFIID riid,LPVOID *ppobj
 ) {
-	return IDirectDrawSurface_QueryInterface((LPDIRECTDRAWSURFACE)this,riid,ppobj);
+	return DGA_IDirectDrawSurface_QueryInterface((LPDIRECTDRAWSURFACE)this,riid,ppobj);
 }
 
-static struct IDirectDrawSurface3_VTable dds3vt = {
-	IDirectDrawSurface3_QueryInterface,
+static HRESULT WINAPI XShm_IDirectDrawSurface3_QueryInterface(
+	LPDIRECTDRAWSURFACE3 this,REFIID riid,LPVOID *ppobj
+) {
+	return XShm_IDirectDrawSurface_QueryInterface((LPDIRECTDRAWSURFACE)this,riid,ppobj);
+}
+
+static HRESULT WINAPI Xlib_IDirectDrawSurface3_QueryInterface(
+	LPDIRECTDRAWSURFACE3 this,REFIID riid,LPVOID *ppobj
+) {
+	return Xlib_IDirectDrawSurface_QueryInterface((LPDIRECTDRAWSURFACE)this,riid,ppobj);
+}
+
+static struct IDirectDrawSurface3_VTable dga_dds3vt = {
+	DGA_IDirectDrawSurface3_QueryInterface,
 	IDirectDrawSurface3_AddRef,
-	IDirectDrawSurface3_Release,
+	DGA_IDirectDrawSurface3_Release,
 	(void*)4,
 	(void*)5,
 	IDirectDrawSurface3_Blt,
@@ -910,8 +1503,8 @@
 	(void*)9,
 	IDirectDrawSurface3_EnumAttachedSurfaces,
 	(void*)11,
-	IDirectDrawSurface3_Flip,
-	IDirectDrawSurface3_GetAttachedSurface,
+	DGA_IDirectDrawSurface3_Flip,
+	DGA_IDirectDrawSurface3_GetAttachedSurface,
 	IDirectDrawSurface3_GetBltStatus,
 	(void*)15,
 	(void*)16,
@@ -931,7 +1524,7 @@
 	(void*)30,
 	(void*)31,
 	IDirectDrawSurface3_SetPalette,
-	IDirectDrawSurface3_Unlock,
+	DGA_IDirectDrawSurface3_Unlock,
 	(void*)34,
 	(void*)35,
 	(void*)36,
@@ -941,6 +1534,91 @@
 	(void*)40,
 };
 
+static struct IDirectDrawSurface3_VTable xshm_dds3vt = {
+	XShm_IDirectDrawSurface3_QueryInterface,
+	IDirectDrawSurface3_AddRef,
+	XShm_IDirectDrawSurface3_Release,
+	(void*)4,
+	(void*)5,
+	IDirectDrawSurface3_Blt,
+	(void*)7,
+	(void*)8,
+	(void*)9,
+	IDirectDrawSurface3_EnumAttachedSurfaces,
+	(void*)11,
+	XShm_IDirectDrawSurface3_Flip,
+	XShm_IDirectDrawSurface3_GetAttachedSurface,
+	IDirectDrawSurface3_GetBltStatus,
+	(void*)15,
+	(void*)16,
+	(void*)17,
+	(void*)18,
+	(void*)19,
+	(void*)20,
+	(void*)21,
+	IDirectDrawSurface3_GetPixelFormat,
+	(void*)23,
+	(void*)24,
+	IDirectDrawSurface3_IsLost,
+	IDirectDrawSurface3_Lock,
+	(void*)27,
+	IDirectDrawSurface3_Restore,
+	IDirectDrawSurface3_SetClipper,
+	(void*)30,
+	(void*)31,
+	IDirectDrawSurface3_SetPalette,
+	XShm_IDirectDrawSurface3_Unlock,
+	(void*)34,
+	(void*)35,
+	(void*)36,
+	(void*)37,
+	(void*)38,
+	(void*)39,
+	(void*)40,
+};
+
+static struct IDirectDrawSurface3_VTable xlib_dds3vt = {
+	Xlib_IDirectDrawSurface3_QueryInterface,
+	IDirectDrawSurface3_AddRef,
+	Xlib_IDirectDrawSurface3_Release,
+	(void*)4,
+	(void*)5,
+	IDirectDrawSurface3_Blt,
+	(void*)7,
+	(void*)8,
+	(void*)9,
+	IDirectDrawSurface3_EnumAttachedSurfaces,
+	(void*)11,
+	Xlib_IDirectDrawSurface3_Flip,
+	Xlib_IDirectDrawSurface3_GetAttachedSurface,
+	IDirectDrawSurface3_GetBltStatus,
+	(void*)15,
+	(void*)16,
+	(void*)17,
+	(void*)18,
+	(void*)19,
+	(void*)20,
+	(void*)21,
+	IDirectDrawSurface3_GetPixelFormat,
+	(void*)23,
+	(void*)24,
+	IDirectDrawSurface3_IsLost,
+	IDirectDrawSurface3_Lock,
+	(void*)27,
+	IDirectDrawSurface3_Restore,
+	IDirectDrawSurface3_SetClipper,
+	(void*)30,
+	(void*)31,
+	IDirectDrawSurface3_SetPalette,
+	Xlib_IDirectDrawSurface3_Unlock,
+	(void*)34,
+	(void*)35,
+	(void*)36,
+	(void*)37,
+	(void*)38,
+	(void*)39,
+	(void*)40,
+};
 
 /******************************************************************************
  *			IDirectDrawClipper
@@ -986,20 +1664,24 @@
 static HRESULT WINAPI IDirectDrawPalette_GetEntries(
 	LPDIRECTDRAWPALETTE this,DWORD x,DWORD start,DWORD end,LPPALETTEENTRY palent
 ) {
+	XColor xc;
 	int	i;
 
-	FIXME(ddraw,"(%p)->GetEntries(%08lx,%ld,%ld,%p),stub!\n",
-		this,x,start,end,palent
-	);
+	if (!this->cm) /* should not happen */ {
+		TRACE(ddraw,"app tried to read colormap for non-palettized mode\n");
+		return DDERR_GENERIC;
+	}
 	for (i=start;i<end;i++) {
-		palent[i-start].peRed = i;
-		palent[i-start].peGreen = i;
-		palent[i-start].peBlue = i;
+		xc.pixel = i;
+		TSXQueryColor(display,this->cm,&xc);
+		palent[i-start].peRed = xc.red>>8;
+		palent[i-start].peGreen = xc.green>>8;
+		palent[i-start].peBlue = xc.blue>>8;
 	}
 	return 0;
 }
 
-static HRESULT WINAPI IDirectDrawPalette_SetEntries(
+static HRESULT WINAPI common_IDirectDrawPalette_SetEntries(
 	LPDIRECTDRAWPALETTE this,DWORD x,DWORD start,DWORD end,LPPALETTEENTRY palent
 ) {
 	XColor		xc;
@@ -1009,24 +1691,11 @@
 		this,x,start,end,palent
 	);
 	if (!this->cm) /* should not happen */ {
-		ERR(ddraw,"no colormap in SetEntries???\n");
+		TRACE(ddraw,"app tried to set colormap in non-palettized mode\n");
 		return DDERR_GENERIC;
 	}
-/* FIXME: free colorcells instead of freeing whole map */
-	TSXFreeColormap(display,this->cm);
-	this->cm = TSXCreateColormap(display,DefaultRootWindow(display),DefaultVisualOfScreen(screen),AllocAll);
-	if (start>0) {
-		xc.red = xc.blue = xc.green = 0; xc.flags = DoRed|DoGreen|DoBlue; xc.pixel = 0; TSXStoreColor(display,this->cm,&xc);
-		this->palents[0].peRed = 0;
-		this->palents[0].peBlue = 0;
-		this->palents[0].peGreen = 0;
-	}
-	if (end<256) {
-		xc.red = xc.blue = xc.green = 0xffff; xc.flags = DoRed|DoGreen|DoBlue; xc.pixel = 255; TSXStoreColor(display,this->cm,&xc);
-		this->palents[255].peRed = 255;
-		this->palents[255].peBlue = 255;
-		this->palents[255].peGreen = 255;
-	}
+	/* FIXME: free colorcells instead of freeing whole map */
+	this->cm = TSXCopyColormapAndFree(display,this->cm);
 	for (i=start;i<end;i++) {
 		xc.red = palent[i-start].peRed<<8;
 		xc.blue = palent[i-start].peBlue<<8;
@@ -1038,31 +1707,31 @@
 		this->palents[i].peBlue = palent[i-start].peBlue;
 		this->palents[i].peGreen = palent[i-start].peGreen;
 	}
+	return 0;
+}
 
-/* Insomnia's (Stea Greene's) Mods Start Here */
-/* FIXME: Still should free individual cells, but this fixes loss of */
-/*        unchange sections of old palette */
-
-	for (i=0;i<start;i++) {
-		xc.red = this->palents[i].peRed<<8;
-		xc.blue = this->palents[i].peBlue<<8;
-		xc.green = this->palents[i].peGreen<<8;
-		xc.flags = DoRed|DoBlue|DoGreen;
-		xc.pixel = i;
-		TSXStoreColor(display,this->cm,&xc);
-	}
-	for (i=end;i<256;i++) {
-		xc.red = this->palents[i].peRed<<8;
-		xc.blue = this->palents[i].peBlue<<8;
-		xc.green = this->palents[i].peGreen<<8;
-		xc.flags = DoRed|DoBlue|DoGreen;
-		xc.pixel = i;
-		TSXStoreColor(display,this->cm,&xc);
-	}
-/* End Insomnia's Mods */
-
+static HRESULT WINAPI DGA_IDirectDrawPalette_SetEntries(
+	LPDIRECTDRAWPALETTE this,DWORD x,DWORD start,DWORD end,LPPALETTEENTRY palent
+) {
+#ifdef HAVE_LIBXXF86DGA
+	HRESULT hres;
+	hres = common_IDirectDrawPalette_SetEntries(this,x,start,end,palent);
+	if (hres != 0) return hres;
 	XF86DGAInstallColormap(display,DefaultScreen(display),this->cm);
 	return 0;
+#else /* defined(HAVE_LIBXXF86DGA) */
+	return E_UNEXPECTED;
+#endif /* defined(HAVE_LIBXXF86DGA) */
+}
+
+static HRESULT WINAPI Xlib_IDirectDrawPalette_SetEntries(
+	LPDIRECTDRAWPALETTE this,DWORD x,DWORD start,DWORD end,LPPALETTEENTRY palent
+) {
+	HRESULT hres;
+	hres = common_IDirectDrawPalette_SetEntries(this,x,start,end,palent);
+	if (hres != 0) return hres;
+	TSXInstallColormap(display,this->cm);
+	return 0;
 }
 
 static ULONG WINAPI IDirectDrawPalette_Release(LPDIRECTDRAWPALETTE this) {
@@ -1087,14 +1756,34 @@
 	return DDERR_ALREADYINITIALIZED;
 }
 
-static struct IDirectDrawPalette_VTable ddpalvt = {
+static struct IDirectDrawPalette_VTable dga_ddpalvt = {
 	(void*)1,
 	IDirectDrawPalette_AddRef,
 	IDirectDrawPalette_Release,
 	(void*)4,
 	IDirectDrawPalette_GetEntries,
 	IDirectDrawPalette_Initialize,
-	IDirectDrawPalette_SetEntries
+	DGA_IDirectDrawPalette_SetEntries
+};
+
+static struct IDirectDrawPalette_VTable xshm_ddpalvt = {
+	(void*)1,
+	IDirectDrawPalette_AddRef,
+	IDirectDrawPalette_Release,
+	(void*)4,
+	IDirectDrawPalette_GetEntries,
+	IDirectDrawPalette_Initialize,
+	Xlib_IDirectDrawPalette_SetEntries
+};
+
+static struct IDirectDrawPalette_VTable xlib_ddpalvt = {
+	(void*)1,
+	IDirectDrawPalette_AddRef,
+	IDirectDrawPalette_Release,
+	(void*)4,
+	IDirectDrawPalette_GetEntries,
+	IDirectDrawPalette_Initialize,
+	Xlib_IDirectDrawPalette_SetEntries
 };
 
 /*******************************************************************************
@@ -1155,9 +1844,10 @@
 /*******************************************************************************
  *				IDirectDraw
  */
-static HRESULT WINAPI IDirectDraw_CreateSurface(
+static HRESULT WINAPI DGA_IDirectDraw_CreateSurface(
 	LPDIRECTDRAW this,LPDDSURFACEDESC lpddsd,LPDIRECTDRAWSURFACE *lpdsf,IUnknown *lpunk
 ) {
+#ifdef HAVE_LIBXXF86DGA
 	int	i;
 
 	TRACE(ddraw, "(%p)->(%p,%p,%p)\n",
@@ -1173,28 +1863,28 @@
 	*lpdsf = (LPDIRECTDRAWSURFACE)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(IDirectDrawSurface));
 	this->lpvtbl->fnAddRef(this);
 	(*lpdsf)->ref = 1;
-	(*lpdsf)->lpvtbl = &ddsvt;
+	(*lpdsf)->lpvtbl = &dga_ddsvt;
 	if (	(lpddsd->dwFlags & DDSD_CAPS) && 
 		(lpddsd->ddsCaps.dwCaps & DDSCAPS_OFFSCREENPLAIN)
 	) {
 		if (!(lpddsd->dwFlags & DDSD_WIDTH))
-			lpddsd->dwWidth = this->d.fb_width;
+			lpddsd->dwWidth = this->e.dga.fb_width;
 		if (!(lpddsd->dwFlags & DDSD_HEIGHT))
-			lpddsd->dwWidth = this->d.fb_height;
+			lpddsd->dwWidth = this->e.dga.fb_height;
 		(*lpdsf)->s.surface = (LPBYTE)HeapAlloc(GetProcessHeap(),0,lpddsd->dwWidth*lpddsd->dwHeight*this->d.depth/8);
-		(*lpdsf)->s.fb_height = -1;
+		(*lpdsf)->t.dga.fb_height = -1;
 		(*lpdsf)->s.lpitch = lpddsd->dwWidth*this->d.depth/8;
 		TRACE(ddraw,"using system memory for a primary surface\n");
 	} else {
 		for (i=0;i<32;i++)
-			if (!(this->d.vpmask & (1<<i)))
+			if (!(this->e.dga.vpmask & (1<<i)))
 				break;
 		TRACE(ddraw,"using viewport %d for a primary surface\n",i);
 		/* if i == 32 or maximum ... return error */
-		this->d.vpmask|=(1<<i);
-		(*lpdsf)->s.surface = this->d.fb_addr+((i*this->d.fb_height)*this->d.fb_width*this->d.depth/8);
-		(*lpdsf)->s.fb_height = i*this->d.fb_height;
-		(*lpdsf)->s.lpitch = this->d.fb_width*this->d.depth/8;
+		this->e.dga.vpmask|=(1<<i);
+		(*lpdsf)->s.surface = this->e.dga.fb_addr+((i*this->e.dga.fb_height)*this->e.dga.fb_width*this->d.depth/8);
+		(*lpdsf)->t.dga.fb_height = i*this->e.dga.fb_height;
+		(*lpdsf)->s.lpitch = this->e.dga.fb_width*this->d.depth/8;
 	}
 
 	lpddsd->lPitch = (*lpdsf)->s.lpitch;
@@ -1212,24 +1902,106 @@
 		(*lpdsf)->s.backbuffer = back = (LPDIRECTDRAWSURFACE)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(IDirectDrawSurface));
 		this->lpvtbl->fnAddRef(this);
 		back->ref = 1;
-		back->lpvtbl = &ddsvt;
+		back->lpvtbl = &dga_ddsvt;
 		for (i=0;i<32;i++)
-			if (!(this->d.vpmask & (1<<i)))
+			if (!(this->e.dga.vpmask & (1<<i)))
 				break;
 		TRACE(ddraw,"using viewport %d for backbuffer\n",i);
 		/* if i == 32 or maximum ... return error */
-		this->d.vpmask|=(1<<i);
-		back->s.surface = this->d.fb_addr+((i*this->d.fb_height)*this->d.fb_width*this->d.depth/8);
-		back->s.fb_height = i*this->d.fb_height;
+		this->e.dga.vpmask|=(1<<i);
+		back->s.surface = this->e.dga.fb_addr+((i*this->e.dga.fb_height)*this->e.dga.fb_width*this->d.depth/8);
+		back->t.dga.fb_height = i*this->e.dga.fb_height;
 
 		back->s.width = this->d.width;
 		back->s.height = this->d.height;
 		back->s.ddraw = this;
-		back->s.lpitch = this->d.fb_width*this->d.depth/8;
+		back->s.lpitch = this->e.dga.fb_width*this->d.depth/8;
 		back->s.backbuffer = NULL; /* does not have a backbuffer, it is
-					  * one! */
+					    * one! */
 	}
 	return 0;
+#else /* defined(HAVE_LIBXXF86DGA) */
+	return E_UNEXPECTED;
+#endif /* defined(HAVE_LIBXXF86DGA) */
+}
+
+static HRESULT WINAPI XShm_IDirectDraw_CreateSurface(
+	LPDIRECTDRAW this,LPDDSURFACEDESC lpddsd,LPDIRECTDRAWSURFACE *lpdsf,IUnknown *lpunk
+) {
+#ifdef HAVE_LIBXXSHM
+	XImage *img;
+	int shmid;
+	TRACE(ddraw, "(%p)->CreateSurface(%p,%p,%p)\n",
+		     this,lpddsd,lpdsf,lpunk);
+	if (TRACE_ON(ddraw)) {
+		fprintf(stderr,"[w=%ld,h=%ld,flags ",lpddsd->dwWidth,lpddsd->dwHeight);
+		_dump_DDSD(lpddsd->dwFlags);
+		fprintf(stderr,"caps ");
+		_dump_DDSCAPS(lpddsd->ddsCaps.dwCaps);
+		fprintf(stderr,"]\n");
+	}
+
+	TRACE(ddraw,"using shared XImage for a primary surface\n");
+	*lpdsf = (LPDIRECTDRAWSURFACE)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(IDirectDrawSurface));
+	this->lpvtbl->fnAddRef(this);
+	(*lpdsf)->ref = 1;
+	(*lpdsf)->lpvtbl = &xshm_ddsvt;
+	(*lpdsf)->t.xshm.image = img =
+		XShmCreateImage(display, /*FIXME:visual*/0, /*FIXME:depth*/8, ZPixmap,
+						NULL, &(*lpdsf)->t.xshm.shminfo,
+						/*FIXME:width*/640, /*FIXME:height*/480);
+	(*lpdsf)->t.xshm.shminfo.shmid = shmid =
+		shmget(IPC_PRIVATE, img->bytes_per_line*img->height, IPC_CREAT|0777);
+	(*lpdsf)->t.xshm.shminfo.shmaddr = img->data = shmat(shmid, 0, 0);
+	XShmAttach(display, &(*lpdsf)->t.xshm.shminfo);
+	/* POOLE FIXME: XShm: this will easily break */
+	(*lpdsf)->t.xshm.surface_is_image_data = TRUE;
+	(*lpdsf)->s.surface = img->data;
+	/* END FIXME: XShm */
+	(*lpdsf)->s.lpitch = img->bytes_per_line;
+	(*lpdsf)->s.width = img->width;
+	(*lpdsf)->s.height = img->height;
+	(*lpdsf)->s.ddraw = this;
+	(*lpdsf)->s.backbuffer = NULL;
+	return 0;
+#else /* defined(HAVE_LIBXXSHM) */
+	return E_UNEXPECTED;
+#endif /* defined(HAVE_LIBXXSHM) */
+}
+
+static HRESULT WINAPI Xlib_IDirectDraw_CreateSurface(
+	LPDIRECTDRAW this,LPDDSURFACEDESC lpddsd,LPDIRECTDRAWSURFACE *lpdsf,IUnknown *lpunk
+) {
+	XImage *img;
+	TRACE(ddraw, "(%p)->CreateSurface(%p,%p,%p)\n",
+		     this,lpddsd,lpdsf,lpunk);
+	if (TRACE_ON(ddraw)) {
+		fprintf(stderr,"[w=%ld,h=%ld,flags ",lpddsd->dwWidth,lpddsd->dwHeight);
+		_dump_DDSD(lpddsd->dwFlags);
+		fprintf(stderr,"caps ");
+		_dump_DDSCAPS(lpddsd->ddsCaps.dwCaps);
+		fprintf(stderr,"]\n");
+	}
+
+	*lpdsf = (LPDIRECTDRAWSURFACE)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(IDirectDrawSurface));
+	this->lpvtbl->fnAddRef(this);
+	(*lpdsf)->ref = 1;
+	(*lpdsf)->lpvtbl = &xlib_ddsvt;
+	TRACE(ddraw,"using standard XImage for a primary surface\n");
+	/* POOLE FIXME: Xlib: this will easily break */
+	(*lpdsf)->t.xshm.surface_is_image_data = TRUE;
+	(*lpdsf)->s.surface = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,640*480);
+	(*lpdsf)->t.xlib.image = img =
+		XCreateImage(display, /*FIXME:visual*/0, /*FIXME: depth*/8, ZPixmap,
+					 0, (*lpdsf)->s.surface,
+					 /*FIXME:width*/640, /*FIXME:height*/480, 0, 640*1);
+	/* END FIXME: Xlib */
+	(*lpdsf)->s.lpitch = img->bytes_per_line;
+	(*lpdsf)->s.width = img->width;
+	(*lpdsf)->s.height = img->height;
+	(*lpdsf)->s.ddraw = this;
+	(*lpdsf)->s.backbuffer = NULL;
+	return 0;
 }
 
 static HRESULT WINAPI IDirectDraw_DuplicateSurface(
@@ -1274,9 +2046,10 @@
 }
 
 
-static HRESULT WINAPI IDirectDraw_SetDisplayMode(
+static HRESULT WINAPI DGA_IDirectDraw_SetDisplayMode(
 	LPDIRECTDRAW this,DWORD width,DWORD height,DWORD depth
 ) {
+#ifdef HAVE_LIBXXF86DGA
 	int	i,*depths,depcount;
 
 	TRACE(ddraw, "(%p)->(%ld,%ld,%ld)\n",
@@ -1291,15 +2064,15 @@
 		ERR(ddraw,"(w=%ld,h=%ld,d=%ld), unsupported depth!\n",width,height,depth);
 		return DDERR_UNSUPPORTEDMODE;
 	}
-	if (this->d.fb_width < width) {
-		ERR(ddraw,"SetDisplayMode(w=%ld,h=%ld,d=%ld), width %ld exceeds framebuffer width %ld\n",width,height,depth,width,this->d.fb_width);
+	if (this->e.dga.fb_width < width) {
+		ERR(ddraw,"SetDisplayMode(w=%ld,h=%ld,d=%ld), width %ld exceeds framebuffer width %ld\n",width,height,depth,width,this->e.dga.fb_width);
 		return DDERR_UNSUPPORTEDMODE;
 	}
 	this->d.width	= width;
 	this->d.height	= height;
 	/* adjust fb_height, so we don't overlap */
-	if (this->d.fb_height < height)
-		this->d.fb_height = height;
+	if (this->e.dga.fb_height < height)
+		this->e.dga.fb_height = height;
 	this->d.depth	= depth;
 
 	/* FIXME: this function OVERWRITES several signal handlers. 
@@ -1315,21 +2088,140 @@
 	SIGNAL_InitEmulator();
 #endif
 	return 0;
+#else /* defined(HAVE_LIBXXF86DGA) */
+	return E_UNEXPECTED
+#endif /* defined(HAVE_LIBXXF86DGA) */
 }
 
-static HRESULT WINAPI IDirectDraw_GetCaps(
+static HRESULT WINAPI XShm_IDirectDraw_SetDisplayMode(
+	LPDIRECTDRAW this,DWORD width,DWORD height,DWORD depth
+) {
+#ifdef HAVE_LIBXXSHM
+	int	i,*depths,depcount;
+	char	buf[200];
+
+	TRACE(ddraw, "(%p)->SetDisplayMode(%ld,%ld,%ld)\n",
+		      this, width, height, depth);
+
+	depths = TSXListDepths(display,DefaultScreen(display),&depcount);
+	for (i=0;i<depcount;i++)
+		if (depths[i]==depth)
+			break;
+	TSXFree(depths);
+	if (i==depcount) {/* not found */
+		sprintf(buf,"SetDisplayMode(w=%ld,h=%ld,d=%ld), unsupported depth!",width,height,depth);
+		MessageBox32A(0,buf,"WINE DirectDraw",MB_OK|MB_ICONSTOP);
+		return DDERR_UNSUPPORTEDMODE;
+	}
+	/* POOLE FIXME: XShm */
+	if (this->e.dga.fb_width < width) {
+		sprintf(buf,"SetDisplayMode(w=%ld,h=%ld,d=%ld), width %ld exceeds framebuffer width %ld",width,height,depth,width,this->e.dga.fb_width);
+		MessageBox32A(0,buf,"WINE DirectDraw",MB_OK|MB_ICONSTOP);
+		return DDERR_UNSUPPORTEDMODE;
+	}
+	this->d.width	= width;
+	this->d.height	= height;
+	/* adjust fb_height, so we don't overlap */
+	if (this->e.dga.fb_height < height)
+		this->e.dga.fb_height = height;
+	this->d.depth	= depth;
+	/* END FIXME: XShm */
+	return 0;
+#else /* defined(HAVE_LIBXXSHM) */
+	return E_UNEXPECTED;
+#endif /* defined(HAVE_LIBXXSHM) */
+}
+
+static HRESULT WINAPI Xlib_IDirectDraw_SetDisplayMode(
+	LPDIRECTDRAW this,DWORD width,DWORD height,DWORD depth
+) {
+	int	i,*depths,depcount;
+	char	buf[200];
+
+	TRACE(ddraw, "(%p)->SetDisplayMode(%ld,%ld,%ld)\n",
+		      this, width, height, depth);
+
+	depths = TSXListDepths(display,DefaultScreen(display),&depcount);
+	for (i=0;i<depcount;i++)
+		if (depths[i]==depth)
+			break;
+	TSXFree(depths);
+	if (i==depcount) {/* not found */
+		sprintf(buf,"SetDisplayMode(w=%ld,h=%ld,d=%ld), unsupported depth!",width,height,depth);
+		MessageBox32A(0,buf,"WINE DirectDraw",MB_OK|MB_ICONSTOP);
+		return DDERR_UNSUPPORTEDMODE;
+	}
+	/* POOLE FIXME: Xlib */
+	if (this->e.dga.fb_width < width) {
+		sprintf(buf,"SetDisplayMode(w=%ld,h=%ld,d=%ld), width %ld exceeds framebuffer width %ld",width,height,depth,width,this->e.dga.fb_width);
+		MessageBox32A(0,buf,"WINE DirectDraw",MB_OK|MB_ICONSTOP);
+		return DDERR_UNSUPPORTEDMODE;
+	}
+	this->d.width	= width;
+	this->d.height	= height;
+	/* adjust fb_height, so we don't overlap */
+	if (this->e.dga.fb_height < height)
+		this->e.dga.fb_height = height;
+	this->d.depth	= depth;
+	/* END FIXME: Xlib */
+	return 0;
+}
+
+static HRESULT WINAPI DGA_IDirectDraw_GetCaps(
 	LPDIRECTDRAW this,LPDDCAPS caps1,LPDDCAPS caps2
-)  {
-	TRACE(ddraw,"(%p)->(%p,%p)\n",this,caps1,caps2);
-	caps1->dwVidMemTotal = this->d.fb_memsize;
+) {
+#ifdef HAVE_LIBXXF86DGA
+	TRACE(ddraw,"(%p)->GetCaps(%p,%p)\n",this,caps1,caps2);
+	caps1->dwVidMemTotal = this->e.dga.fb_memsize;
 	caps1->dwCaps = 0xffffffff&~(DDCAPS_BANKSWITCHED);		/* we can do anything */
 	caps1->ddsCaps.dwCaps = 0xffffffff;	/* we can do anything */
 	if (caps2) {
-		caps2->dwVidMemTotal = this->d.fb_memsize;
+		caps2->dwVidMemTotal = this->e.dga.fb_memsize;
 		caps2->dwCaps = 0xffffffff&~(DDCAPS_BANKSWITCHED);		/* we can do anything */
 		caps2->ddsCaps.dwCaps = 0xffffffff;	/* we can do anything */
 	}
 	return 0;
+#else /* defined(HAVE_LIBXXF86DGA) */
+	return E_UNEXPECTED;
+#endif /* defined(HAVE_LIBXXF86DGA) */
+}
+
+static HRESULT WINAPI XShm_IDirectDraw_GetCaps(
+	LPDIRECTDRAW this,LPDDCAPS caps1,LPDDCAPS caps2
+)  {
+#ifdef HAVE_LIBXXSHM
+	TRACE(ddraw,"(%p)->GetCaps(%p,%p)\n",this,caps1,caps2);
+	/* FIXME: XShm */
+	caps1->dwVidMemTotal = 2048*1024;
+	caps1->dwCaps = 0xffffffff&~(DDCAPS_BANKSWITCHED);		/* we can do anything */
+	caps1->ddsCaps.dwCaps = 0xffffffff;	/* we can do anything */
+	if (caps2) {
+		caps2->dwVidMemTotal = 2048*1024;
+		caps2->dwCaps = 0xffffffff&~(DDCAPS_BANKSWITCHED);		/* we can do anything */
+		caps2->ddsCaps.dwCaps = 0xffffffff;	/* we can do anything */
+	}
+	/* END FIXME: XShm */
+	return 0;
+#else /* defined(HAVE_LIBXXSHM) */
+	return E_UNEXPECTED;
+#endif /* defined(HAVE_LIBXXSHM) */
+}
+
+static HRESULT WINAPI Xlib_IDirectDraw_GetCaps(
+	LPDIRECTDRAW this,LPDDCAPS caps1,LPDDCAPS caps2
+)  {
+	TRACE(ddraw,"(%p)->GetCaps(%p,%p)\n",this,caps1,caps2);
+	/* FIXME: Xlib */
+	caps1->dwVidMemTotal = 2048*1024;
+	caps1->dwCaps = 0xffffffff&~(DDCAPS_BANKSWITCHED);		/* we can do anything */
+	caps1->ddsCaps.dwCaps = 0xffffffff;	/* we can do anything */
+	if (caps2) {
+		caps2->dwVidMemTotal = 2048*1024;
+		caps2->dwCaps = 0xffffffff&~(DDCAPS_BANKSWITCHED);		/* we can do anything */
+		caps2->ddsCaps.dwCaps = 0xffffffff;	/* we can do anything */
+	}
+	/* END FIXME: Xlib */
+	return 0;
 }
 
 static HRESULT WINAPI IDirectDraw_CreateClipper(
@@ -1344,25 +2236,63 @@
 	return 0;
 }
 
-static HRESULT WINAPI IDirectDraw_CreatePalette(
+static HRESULT WINAPI common_IDirectDraw_CreatePalette(
 	LPDIRECTDRAW this,DWORD x,LPPALETTEENTRY palent,LPDIRECTDRAWPALETTE *lpddpal,LPUNKNOWN lpunk
 ) {
-	TRACE(ddraw,"(%p)->(%08lx,%p,%p,%p)\n",
-		this,x,palent,lpddpal,lpunk
-	);
 	*lpddpal = (LPDIRECTDRAWPALETTE)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(IDirectDrawPalette));
+	if (*lpddpal == NULL) return E_OUTOFMEMORY;
 	(*lpddpal)->ref = 1;
-	(*lpddpal)->lpvtbl = &ddpalvt;
 	(*lpddpal)->ddraw = this;
 	if (this->d.depth<=8) {
 		(*lpddpal)->cm = TSXCreateColormap(display,DefaultRootWindow(display),DefaultVisualOfScreen(screen),AllocAll);
-	} else /* we don't want palettes in hicolor or truecolor */
+	} else {
+		/* we don't want palettes in hicolor or truecolor */
 		(*lpddpal)->cm = 0;
-
+	}
 	return 0;
 }
 
-static HRESULT WINAPI IDirectDraw_RestoreDisplayMode(LPDIRECTDRAW this) {
+static HRESULT WINAPI DGA_IDirectDraw_CreatePalette(
+	LPDIRECTDRAW this,DWORD x,LPPALETTEENTRY palent,LPDIRECTDRAWPALETTE *lpddpal,LPUNKNOWN lpunk
+) {
+	HRESULT res;
+	TRACE(ddraw,"(%p)->(%08lx,%p,%p,%p)\n",
+		this,x,palent,lpddpal,lpunk
+	);
+	res = common_IDirectDraw_CreatePalette(this,x,palent,lpddpal,lpunk);
+	if (res != 0) return res;
+	(*lpddpal)->lpvtbl = &dga_ddpalvt;
+	return 0;
+}
+
+static HRESULT WINAPI XShm_IDirectDraw_CreatePalette(
+	LPDIRECTDRAW this,DWORD x,LPPALETTEENTRY palent,LPDIRECTDRAWPALETTE *lpddpal,LPUNKNOWN lpunk
+) {
+	HRESULT res;
+	TRACE(ddraw,"(%p)->(%08lx,%p,%p,%p)\n",
+		this,x,palent,lpddpal,lpunk
+	);
+	res = common_IDirectDraw_CreatePalette(this,x,palent,lpddpal,lpunk);
+	if (res != 0) return res;
+	(*lpddpal)->lpvtbl = &xshm_ddpalvt;
+	return 0;
+}
+
+static HRESULT WINAPI Xlib_IDirectDraw_CreatePalette(
+	LPDIRECTDRAW this,DWORD x,LPPALETTEENTRY palent,LPDIRECTDRAWPALETTE *lpddpal,LPUNKNOWN lpunk
+) {
+	HRESULT res;
+	TRACE(ddraw,"(%p)->(%08lx,%p,%p,%p)\n",
+		this,x,palent,lpddpal,lpunk
+	);
+	res = common_IDirectDraw_CreatePalette(this,x,palent,lpddpal,lpunk);
+	if (res != 0) return res;
+	(*lpddpal)->lpvtbl = &xlib_ddpalvt;
+	return 0;
+}
+
+static HRESULT WINAPI DGA_IDirectDraw_RestoreDisplayMode(LPDIRECTDRAW this) {
+#ifdef HAVE_LIBXXF86DGA
 	TRACE(ddraw, "(%p)->()\n", 
 		      this);
 	Sleep(1000);
@@ -1371,8 +2301,27 @@
 	SIGNAL_InitEmulator();
 #endif
 	return 0;
+#else /* defined(HAVE_LIBXXF86DGA) */
+	return E_UNEXPECTED;
+#endif
 }
 
+static HRESULT WINAPI XShm_IDirectDraw_RestoreDisplayMode(LPDIRECTDRAW this) {
+#ifdef HAVE_LIBXXF86DGA
+	TRACE(ddraw, "(%p)->RestoreDisplayMode()\n", 
+		      this);
+	Sleep(1000);
+	return 0;
+#else /* defined(HAVE_LIBXXF86DGA) */
+	return E_UNEXPECTED;
+#endif
+}
+
+static HRESULT WINAPI Xlib_IDirectDraw_RestoreDisplayMode(LPDIRECTDRAW this) {
+	TRACE(ddraw, "(%p)->RestoreDisplayMode()\n", 
+		      this);
+	return 0;
+}
 
 static HRESULT WINAPI IDirectDraw_WaitForVerticalBlank(
 	LPDIRECTDRAW this,DWORD x,HANDLE32 h
@@ -1385,7 +2334,8 @@
 	return ++(this->ref);
 }
 
-static ULONG WINAPI IDirectDraw_Release(LPDIRECTDRAW this) {
+static ULONG WINAPI DGA_IDirectDraw_Release(LPDIRECTDRAW this) {
+#ifdef HAVE_LIBXXF86DGA
 	if (!--(this->ref)) {
 		XF86DGADirectVideo(display,DefaultScreen(display),0);
 #ifdef RESTORE_SIGNALS
@@ -1394,32 +2344,149 @@
 		HeapFree(GetProcessHeap(),0,this);
 		return 0;
 	}
+#endif /* defined(HAVE_LIBXXF86DGA) */
 	return this->ref;
 }
 
-static HRESULT WINAPI IDirectDraw_QueryInterface(
+static ULONG WINAPI XShm_IDirectDraw_Release(LPDIRECTDRAW this) {
+#ifdef HAVE_LIBXXSHM
+	if (!--(this->ref)) {
+		HeapFree(GetProcessHeap(),0,this);
+		return 0;
+	}
+#endif /* defined(HAVE_LIBXXSHM) */
+	return this->ref;
+}
+
+static ULONG WINAPI Xlib_IDirectDraw_Release(LPDIRECTDRAW this) {
+	if (!--(this->ref)) {
+		HeapFree(GetProcessHeap(),0,this);
+		return 0;
+	}
+	return this->ref;
+}
+
+static HRESULT WINAPI DGA_IDirectDraw_QueryInterface(
 	LPDIRECTDRAW this,REFIID refiid,LPVOID *obj
 ) {
-        char    xrefiid[50];
+	char    xrefiid[50];
 
-        WINE_StringFromCLSID((LPCLSID)refiid,xrefiid);
-        TRACE(ddraw,"(%p)->(%s,%p)\n",this,xrefiid,obj);
-        if (!memcmp(&IID_IUnknown,refiid,sizeof(IID_IUnknown))) {
-                *obj = this;
+	WINE_StringFromCLSID((LPCLSID)refiid,xrefiid);
+	TRACE(ddraw,"(%p)->(%s,%p)\n",this,xrefiid,obj);
+	if (!memcmp(&IID_IUnknown,refiid,sizeof(IID_IUnknown))) {
+		*obj = this;
 		this->lpvtbl->fnAddRef(this);
-                return 0;
-        }
-        if (!memcmp(&IID_IDirectDraw,refiid,sizeof(IID_IDirectDraw))) {
-                *obj = this;
+		return 0;
+	}
+	if (!memcmp(&IID_IDirectDraw,refiid,sizeof(IID_IDirectDraw))) {
+		*obj = this;
 		this->lpvtbl->fnAddRef(this);
-                return 0;
-        }
-        if (!memcmp(&IID_IDirectDraw2,refiid,sizeof(IID_IDirectDraw2))) {
-		this->lpvtbl = (LPDIRECTDRAW_VTABLE)&dd2vt;
+		return 0;
+	}
+	if (!memcmp(&IID_IDirectDraw2,refiid,sizeof(IID_IDirectDraw2))) {
+		this->lpvtbl = (LPDIRECTDRAW_VTABLE)&dga_dd2vt;
 		this->lpvtbl->fnAddRef(this);
-                *obj = this;
-                return 0;
-        }
+		*obj = this;
+		return 0;
+	}
+	if (!memcmp(&IID_IDirect3D,refiid,sizeof(IID_IDirect3D))) {
+		LPDIRECT3D	d3d;
+
+		d3d = HeapAlloc(GetProcessHeap(),0,sizeof(*d3d));
+		d3d->ref = 1;
+		d3d->ddraw = this;
+		this->lpvtbl->fnAddRef(this);
+		d3d->lpvtbl = &d3dvt;
+		*obj = d3d;
+		return 0;
+	}
+	if (!memcmp(&IID_IDirect3D2,refiid,sizeof(IID_IDirect3D))) {
+		LPDIRECT3D2	d3d;
+
+		d3d = HeapAlloc(GetProcessHeap(),0,sizeof(*d3d));
+		d3d->ref = 1;
+		d3d->ddraw = this;
+		this->lpvtbl->fnAddRef(this);
+		d3d->lpvtbl = &d3d2vt;
+		*obj = d3d;
+		return 0;
+	}
+	WARN(ddraw,"(%p):interface for IID %s _NOT_ found!\n",this,xrefiid);
+        return OLE_E_ENUM_NOMORE;
+}
+
+static HRESULT WINAPI XShm_IDirectDraw_QueryInterface(
+	LPDIRECTDRAW this,REFIID refiid,LPVOID *obj
+	) {
+	char    xrefiid[50];
+
+	WINE_StringFromCLSID((LPCLSID)refiid,xrefiid);
+	TRACE(ddraw,"(%p)->(%s,%p)\n",this,xrefiid,obj);
+	if (!memcmp(&IID_IUnknown,refiid,sizeof(IID_IUnknown))) {
+		*obj = this;
+		this->lpvtbl->fnAddRef(this);
+		return 0;
+	}
+	if (!memcmp(&IID_IDirectDraw,refiid,sizeof(IID_IDirectDraw))) {
+		*obj = this;
+		this->lpvtbl->fnAddRef(this);
+		return 0;
+	}
+	if (!memcmp(&IID_IDirectDraw2,refiid,sizeof(IID_IDirectDraw2))) {
+		this->lpvtbl = (LPDIRECTDRAW_VTABLE)&xshm_dd2vt;
+		this->lpvtbl->fnAddRef(this);
+		*obj = this;
+		return 0;
+	}
+	if (!memcmp(&IID_IDirect3D,refiid,sizeof(IID_IDirect3D))) {
+		LPDIRECT3D	d3d;
+
+		d3d = HeapAlloc(GetProcessHeap(),0,sizeof(*d3d));
+		d3d->ref = 1;
+		d3d->ddraw = this;
+		this->lpvtbl->fnAddRef(this);
+		d3d->lpvtbl = &d3dvt;
+		*obj = d3d;
+		return 0;
+	}
+	if (!memcmp(&IID_IDirect3D2,refiid,sizeof(IID_IDirect3D))) {
+		LPDIRECT3D2	d3d;
+
+		d3d = HeapAlloc(GetProcessHeap(),0,sizeof(*d3d));
+		d3d->ref = 1;
+		d3d->ddraw = this;
+		this->lpvtbl->fnAddRef(this);
+		d3d->lpvtbl = &d3d2vt;
+		*obj = d3d;
+		return 0;
+	}
+	WARN(ddraw,"(%p):interface for IID %s _NOT_ found!\n",this,xrefiid);
+	return OLE_E_ENUM_NOMORE;
+}
+
+static HRESULT WINAPI Xlib_IDirectDraw_QueryInterface(
+	LPDIRECTDRAW this,REFIID refiid,LPVOID *obj
+) {
+	char    xrefiid[50];
+
+	WINE_StringFromCLSID((LPCLSID)refiid,xrefiid);
+	TRACE(ddraw,"(%p)->(%s,%p)\n",this,xrefiid,obj);
+	if (!memcmp(&IID_IUnknown,refiid,sizeof(IID_IUnknown))) {
+		*obj = this;
+		this->lpvtbl->fnAddRef(this);
+		return 0;
+	}
+	if (!memcmp(&IID_IDirectDraw,refiid,sizeof(IID_IDirectDraw))) {
+		*obj = this;
+		this->lpvtbl->fnAddRef(this);
+		return 0;
+	}
+	if (!memcmp(&IID_IDirectDraw2,refiid,sizeof(IID_IDirectDraw2))) {
+		this->lpvtbl = (LPDIRECTDRAW_VTABLE)&xlib_dd2vt;
+		this->lpvtbl->fnAddRef(this);
+		*obj = this;
+		return 0;
+	}
 	if (!memcmp(&IID_IDirect3D,refiid,sizeof(IID_IDirect3D))) {
 		LPDIRECT3D	d3d;
 
@@ -1461,7 +2528,6 @@
 
 	TRACE(ddraw,"(%p)->(0x%08lx,%p,%p,%p)\n",this,dwFlags,lpddsfd,context,modescb);
 
-
 	_getpixelformat(this,&(ddsfd.ddpfPixelFormat));
 	ddsfd.dwSize = sizeof(ddsfd);
 	ddsfd.dwFlags = DDSD_HEIGHT|DDSD_WIDTH|DDSD_BACKBUFFERCOUNT|DDSD_PIXELFORMAT|DDSD_CAPS;
@@ -1491,14 +2557,56 @@
 	return DD_OK;
 }
 
-static HRESULT WINAPI IDirectDraw_GetDisplayMode(
+static HRESULT WINAPI DGA_IDirectDraw_GetDisplayMode(
 	LPDIRECTDRAW this,LPDDSURFACEDESC lpddsfd
 ) {
+#ifdef HAVE_LIBXXF86DGA
 	TRACE(ddraw,"(%p)->(%p)\n",this,lpddsfd);
 	lpddsfd->dwFlags = DDSD_HEIGHT|DDSD_WIDTH|DDSD_PITCH|DDSD_BACKBUFFERCOUNT|DDSD_PIXELFORMAT|DDSD_CAPS;
 	lpddsfd->dwHeight = screenHeight;
 	lpddsfd->dwWidth = screenWidth;
-	lpddsfd->lPitch = this->d.fb_width*this->d.depth/8;
+	lpddsfd->lPitch = this->e.dga.fb_width*this->d.depth/8;
+	lpddsfd->dwBackBufferCount = 1;
+	lpddsfd->x.dwRefreshRate = 60;
+	lpddsfd->ddsCaps.dwCaps = DDSCAPS_PALETTE;
+	_getpixelformat(this,&(lpddsfd->ddpfPixelFormat));
+	return DD_OK;
+#else /* defined(HAVE_LIBXXF86DGA) */
+	return E_UNEXPECTED;
+#endif /* defined(HAVE_LIBXXF86DGA) */
+}
+
+static HRESULT WINAPI XShm_IDirectDraw_GetDisplayMode(
+	LPDIRECTDRAW this,LPDDSURFACEDESC lpddsfd
+) {
+#ifdef HAVE_LIBXXSM
+	TRACE(ddraw,"(%p)->GetDisplayMode(%p)\n",this,lpddsfd);
+	lpddsfd->dwFlags = DDSD_HEIGHT|DDSD_WIDTH|DDSD_PITCH|DDSD_BACKBUFFERCOUNT|DDSD_PIXELFORMAT|DDSD_CAPS;
+	lpddsfd->dwHeight = screenHeight;
+	lpddsfd->dwWidth = screenWidth;
+	/* POOLE FIXME: XShm */
+	lpddsfd->lPitch = this->e.dga.fb_width*this->d.depth/8;
+	/* END FIXME: XShm */
+	lpddsfd->dwBackBufferCount = 1;
+	lpddsfd->x.dwRefreshRate = 60;
+	lpddsfd->ddsCaps.dwCaps = DDSCAPS_PALETTE;
+	_getpixelformat(this,&(lpddsfd->ddpfPixelFormat));
+	return DD_OK;
+#else /* defined(HAVE_LIBXXSHM) */
+	return E_UNEXPECTED;
+#endif /* defined(HAVE_LIBXXSHM) */
+}
+
+static HRESULT WINAPI Xlib_IDirectDraw_GetDisplayMode(
+	LPDIRECTDRAW this,LPDDSURFACEDESC lpddsfd
+) {
+	TRACE(ddraw,"(%p)->GetDisplayMode(%p)\n",this,lpddsfd);
+	lpddsfd->dwFlags = DDSD_HEIGHT|DDSD_WIDTH|DDSD_PITCH|DDSD_BACKBUFFERCOUNT|DDSD_PIXELFORMAT|DDSD_CAPS;
+	lpddsfd->dwHeight = screenHeight;
+	lpddsfd->dwWidth = screenWidth;
+	/* POOLE FIXME: Xlib */
+	lpddsfd->lPitch = this->e.dga.fb_width*this->d.depth/8;
+	/* END FIXME: Xlib */
 	lpddsfd->dwBackBufferCount = 1;
 	lpddsfd->x.dwRefreshRate = 60;
 	lpddsfd->ddsCaps.dwCaps = DDSCAPS_PALETTE;
@@ -1527,29 +2635,81 @@
 	return 0;
 }
 
-static IDirectDraw_VTable ddvt = {
-	IDirectDraw_QueryInterface,
+static struct IDirectDraw_VTable dga_ddvt = {
+	DGA_IDirectDraw_QueryInterface,
 	IDirectDraw_AddRef,
-	IDirectDraw_Release,
+	DGA_IDirectDraw_Release,
 	(void*)4,
 	IDirectDraw_CreateClipper,
-	IDirectDraw_CreatePalette,
-	IDirectDraw_CreateSurface,
+	DGA_IDirectDraw_CreatePalette,
+	DGA_IDirectDraw_CreateSurface,
 	IDirectDraw_DuplicateSurface,
 	IDirectDraw_EnumDisplayModes,
 	(void*)10,
 	IDirectDraw_FlipToGDISurface,
-	IDirectDraw_GetCaps,
-	IDirectDraw_GetDisplayMode,
+	DGA_IDirectDraw_GetCaps,
+	DGA_IDirectDraw_GetDisplayMode,
 	IDirectDraw_GetFourCCCodes,
 	(void*)15,
 	IDirectDraw_GetMonitorFrequency,
 	(void*)17,
 	IDirectDraw_GetVerticalBlankStatus,
 	(void*)19,
-	IDirectDraw_RestoreDisplayMode,
+	DGA_IDirectDraw_RestoreDisplayMode,
 	IDirectDraw_SetCooperativeLevel,
-	IDirectDraw_SetDisplayMode,
+	DGA_IDirectDraw_SetDisplayMode,
+	IDirectDraw_WaitForVerticalBlank,
+};
+
+static struct IDirectDraw_VTable xshm_ddvt = {
+	XShm_IDirectDraw_QueryInterface,
+	IDirectDraw_AddRef,
+	XShm_IDirectDraw_Release,
+	(void*)4,
+	IDirectDraw_CreateClipper,
+	XShm_IDirectDraw_CreatePalette,
+	XShm_IDirectDraw_CreateSurface,
+	IDirectDraw_DuplicateSurface,
+	IDirectDraw_EnumDisplayModes,
+	(void*)10,
+	IDirectDraw_FlipToGDISurface,
+	XShm_IDirectDraw_GetCaps,
+	XShm_IDirectDraw_GetDisplayMode,
+	IDirectDraw_GetFourCCCodes,
+	(void*)15,
+	IDirectDraw_GetMonitorFrequency,
+	(void*)17,
+	IDirectDraw_GetVerticalBlankStatus,
+	(void*)19,
+	XShm_IDirectDraw_RestoreDisplayMode,
+	IDirectDraw_SetCooperativeLevel,
+	XShm_IDirectDraw_SetDisplayMode,
+	IDirectDraw_WaitForVerticalBlank,
+};
+
+static struct IDirectDraw_VTable xlib_ddvt = {
+	Xlib_IDirectDraw_QueryInterface,
+	IDirectDraw_AddRef,
+	Xlib_IDirectDraw_Release,
+	(void*)4,
+	IDirectDraw_CreateClipper,
+	Xlib_IDirectDraw_CreatePalette,
+	Xlib_IDirectDraw_CreateSurface,
+	IDirectDraw_DuplicateSurface,
+	IDirectDraw_EnumDisplayModes,
+	(void*)10,
+	IDirectDraw_FlipToGDISurface,
+	Xlib_IDirectDraw_GetCaps,
+	Xlib_IDirectDraw_GetDisplayMode,
+	IDirectDraw_GetFourCCCodes,
+	(void*)15,
+	IDirectDraw_GetMonitorFrequency,
+	(void*)17,
+	IDirectDraw_GetVerticalBlankStatus,
+	(void*)19,
+	Xlib_IDirectDraw_RestoreDisplayMode,
+	IDirectDraw_SetCooperativeLevel,
+	Xlib_IDirectDraw_SetDisplayMode,
 	IDirectDraw_WaitForVerticalBlank,
 };
 
@@ -1563,30 +2723,74 @@
 	return IDirectDraw_CreateClipper((LPDIRECTDRAW)this,x,lpddclip,lpunk);
 }
 
-static HRESULT WINAPI IDirectDraw2_CreateSurface(
+static HRESULT WINAPI DGA_IDirectDraw2_CreateSurface(
 	LPDIRECTDRAW2 this,LPDDSURFACEDESC lpddsd,LPDIRECTDRAWSURFACE *lpdsf,IUnknown *lpunk
 ) {
-	return IDirectDraw_CreateSurface((LPDIRECTDRAW)this,lpddsd,(LPDIRECTDRAWSURFACE*)lpdsf,lpunk);
+	return DGA_IDirectDraw_CreateSurface((LPDIRECTDRAW)this,lpddsd,(LPDIRECTDRAWSURFACE*)lpdsf,lpunk);
 }
 
-static HRESULT WINAPI IDirectDraw2_QueryInterface(
+static HRESULT WINAPI XShm_IDirectDraw2_CreateSurface(
+	LPDIRECTDRAW2 this,LPDDSURFACEDESC lpddsd,LPDIRECTDRAWSURFACE *lpdsf,IUnknown *lpunk
+) {
+	return XShm_IDirectDraw_CreateSurface((LPDIRECTDRAW)this,lpddsd,(LPDIRECTDRAWSURFACE*)lpdsf,lpunk);
+}
+
+static HRESULT WINAPI Xlib_IDirectDraw2_CreateSurface(
+	LPDIRECTDRAW2 this,LPDDSURFACEDESC lpddsd,LPDIRECTDRAWSURFACE *lpdsf,IUnknown *lpunk
+) {
+	return Xlib_IDirectDraw_CreateSurface((LPDIRECTDRAW)this,lpddsd,(LPDIRECTDRAWSURFACE*)lpdsf,lpunk);
+}
+
+static HRESULT WINAPI DGA_IDirectDraw2_QueryInterface(
 	LPDIRECTDRAW2 this,REFIID refiid,LPVOID *obj
 ) {
-	return IDirectDraw_QueryInterface((LPDIRECTDRAW)this,refiid,obj);
+	return DGA_IDirectDraw_QueryInterface((LPDIRECTDRAW)this,refiid,obj);
+}
+
+static HRESULT WINAPI XShm_IDirectDraw2_QueryInterface(
+	LPDIRECTDRAW2 this,REFIID refiid,LPVOID *obj
+) {
+	return XShm_IDirectDraw_QueryInterface((LPDIRECTDRAW)this,refiid,obj);
+}
+
+static HRESULT WINAPI Xlib_IDirectDraw2_QueryInterface(
+	LPDIRECTDRAW2 this,REFIID refiid,LPVOID *obj
+) {
+	return Xlib_IDirectDraw_QueryInterface((LPDIRECTDRAW)this,refiid,obj);
 }
 
 static ULONG WINAPI IDirectDraw2_AddRef(LPDIRECTDRAW2 this) {
 	return IDirectDraw_AddRef((LPDIRECTDRAW)this);
 }
 
-static ULONG WINAPI IDirectDraw2_Release(LPDIRECTDRAW2 this) {
-	return IDirectDraw_Release((LPDIRECTDRAW)this);
+static ULONG WINAPI DGA_IDirectDraw2_Release(LPDIRECTDRAW2 this) {
+	return DGA_IDirectDraw_Release((LPDIRECTDRAW)this);
 }
 
-static HRESULT WINAPI IDirectDraw2_GetCaps(
+static ULONG WINAPI XShm_IDirectDraw2_Release(LPDIRECTDRAW2 this) {
+	return XShm_IDirectDraw_Release((LPDIRECTDRAW)this);
+}
+
+static ULONG WINAPI Xlib_IDirectDraw2_Release(LPDIRECTDRAW2 this) {
+	return Xlib_IDirectDraw_Release((LPDIRECTDRAW)this);
+}
+
+static HRESULT WINAPI DGA_IDirectDraw2_GetCaps(
 	LPDIRECTDRAW2 this,LPDDCAPS caps1,LPDDCAPS caps2
 )  {
-	return IDirectDraw_GetCaps((LPDIRECTDRAW)this,caps1,caps2);
+	return DGA_IDirectDraw_GetCaps((LPDIRECTDRAW)this,caps1,caps2);
+}
+
+static HRESULT WINAPI XShm_IDirectDraw2_GetCaps(
+	LPDIRECTDRAW2 this,LPDDCAPS caps1,LPDDCAPS caps2
+)  {
+	return XShm_IDirectDraw_GetCaps((LPDIRECTDRAW)this,caps1,caps2);
+}
+
+static HRESULT WINAPI Xlib_IDirectDraw2_GetCaps(
+	LPDIRECTDRAW2 this,LPDDCAPS caps1,LPDDCAPS caps2
+)  {
+	return Xlib_IDirectDraw_GetCaps((LPDIRECTDRAW)this,caps1,caps2);
 }
 
 static HRESULT WINAPI IDirectDraw2_SetCooperativeLevel(
@@ -1595,24 +2799,52 @@
 	return IDirectDraw_SetCooperativeLevel((LPDIRECTDRAW)this,hwnd,x);
 }
 
-static HRESULT WINAPI IDirectDraw2_CreatePalette(
+static HRESULT WINAPI DGA_IDirectDraw2_CreatePalette(
 	LPDIRECTDRAW2 this,DWORD x,LPPALETTEENTRY palent,LPDIRECTDRAWPALETTE *lpddpal,LPUNKNOWN lpunk
 ) {
-	return IDirectDraw_CreatePalette((LPDIRECTDRAW)this,x,palent,lpddpal,lpunk);
+	return DGA_IDirectDraw_CreatePalette((LPDIRECTDRAW)this,x,palent,lpddpal,lpunk);
 }
 
+static HRESULT WINAPI XShm_IDirectDraw2_CreatePalette(
+	LPDIRECTDRAW2 this,DWORD x,LPPALETTEENTRY palent,LPDIRECTDRAWPALETTE *lpddpal,LPUNKNOWN lpunk
+) {
+	return XShm_IDirectDraw_CreatePalette((LPDIRECTDRAW)this,x,palent,lpddpal,lpunk);
+}
 
-static HRESULT WINAPI IDirectDraw2_SetDisplayMode(
+static HRESULT WINAPI Xlib_IDirectDraw2_CreatePalette(
+	LPDIRECTDRAW2 this,DWORD x,LPPALETTEENTRY palent,LPDIRECTDRAWPALETTE *lpddpal,LPUNKNOWN lpunk
+) {
+	return Xlib_IDirectDraw_CreatePalette((LPDIRECTDRAW)this,x,palent,lpddpal,lpunk);
+}
+
+static HRESULT WINAPI DGA_IDirectDraw2_SetDisplayMode(
 	LPDIRECTDRAW2 this,DWORD width,DWORD height,DWORD depth,DWORD xx,DWORD yy
 ) {
-	TRACE(ddraw,"(%p)->(%ld,%ld,%ld,%08lx,%08lx)\n",
-		      this, width, height, depth, xx, yy);
-
-	return IDirectDraw_SetDisplayMode((LPDIRECTDRAW)this,width,height,depth);
+	return DGA_IDirectDraw_SetDisplayMode((LPDIRECTDRAW)this,width,height,depth);
 }
 
-static HRESULT WINAPI IDirectDraw2_RestoreDisplayMode(LPDIRECTDRAW2 this) {
-	return IDirectDraw_RestoreDisplayMode((LPDIRECTDRAW)this);
+static HRESULT WINAPI XShm_IDirectDraw2_SetDisplayMode(
+	LPDIRECTDRAW2 this,DWORD width,DWORD height,DWORD depth,DWORD xx,DWORD yy
+) {
+	return XShm_IDirectDraw_SetDisplayMode((LPDIRECTDRAW)this,width,height,depth);
+}
+
+static HRESULT WINAPI Xlib_IDirectDraw2_SetDisplayMode(
+	LPDIRECTDRAW2 this,DWORD width,DWORD height,DWORD depth,DWORD xx,DWORD yy
+) {
+	return Xlib_IDirectDraw_SetDisplayMode((LPDIRECTDRAW)this,width,height,depth);
+}
+
+static HRESULT WINAPI DGA_IDirectDraw2_RestoreDisplayMode(LPDIRECTDRAW2 this) {
+	return DGA_IDirectDraw_RestoreDisplayMode((LPDIRECTDRAW)this);
+}
+
+static HRESULT WINAPI XShm_IDirectDraw2_RestoreDisplayMode(LPDIRECTDRAW2 this) {
+	return XShm_IDirectDraw_RestoreDisplayMode((LPDIRECTDRAW)this);
+}
+
+static HRESULT WINAPI Xlib_IDirectDraw2_RestoreDisplayMode(LPDIRECTDRAW2 this) {
+	return Xlib_IDirectDraw_RestoreDisplayMode((LPDIRECTDRAW)this);
 }
 
 static HRESULT WINAPI IDirectDraw2_EnumSurfaces(
@@ -1628,20 +2860,43 @@
 	return IDirectDraw_EnumDisplayModes((LPDIRECTDRAW)this,dwFlags,lpddsfd,context,modescb);
 }
 
-static HRESULT WINAPI IDirectDraw2_GetDisplayMode(
+static HRESULT WINAPI DGA_IDirectDraw2_GetDisplayMode(
 	LPDIRECTDRAW2 this,LPDDSURFACEDESC lpddsfd
 ) {
-	return IDirectDraw_GetDisplayMode((LPDIRECTDRAW)this,lpddsfd);
+	return DGA_IDirectDraw_GetDisplayMode((LPDIRECTDRAW)this,lpddsfd);
 }
 
-static HRESULT WINAPI IDirectDraw2_GetAvailableVidMem(
+static HRESULT WINAPI XShm_IDirectDraw2_GetDisplayMode(
+	LPDIRECTDRAW2 this,LPDDSURFACEDESC lpddsfd
+) {
+	return XShm_IDirectDraw_GetDisplayMode((LPDIRECTDRAW)this,lpddsfd);
+}
+
+static HRESULT WINAPI Xlib_IDirectDraw2_GetDisplayMode(
+	LPDIRECTDRAW2 this,LPDDSURFACEDESC lpddsfd
+) {
+	return Xlib_IDirectDraw_GetDisplayMode((LPDIRECTDRAW)this,lpddsfd);
+}
+
+static HRESULT WINAPI DGA_IDirectDraw2_GetAvailableVidMem(
 	LPDIRECTDRAW2 this,LPDDSCAPS ddscaps,LPDWORD total,LPDWORD free
 ) {
 	TRACE(ddraw,"(%p)->(%p,%p,%p)\n",
 		this,ddscaps,total,free
 	);
-	if (total) *total = this->d.fb_memsize * 1024;
-	if (free) *free = this->d.fb_memsize * 1024;
+	if (total) *total = this->e.dga.fb_memsize * 1024;
+	if (free) *free = this->e.dga.fb_memsize * 1024;
+	return 0;
+}
+
+static HRESULT WINAPI Xlib_IDirectDraw2_GetAvailableVidMem(
+	LPDIRECTDRAW2 this,LPDDSCAPS ddscaps,LPDWORD total,LPDWORD free
+) {
+	TRACE(ddraw,"(%p)->(%p,%p,%p)\n",
+		this,ddscaps,total,free
+	);
+	if (total) *total = 2048 * 1024;
+	if (free) *free = 2048 * 1024;
 	return 0;
 }
 
@@ -1663,62 +2918,108 @@
 	return IDirectDraw_WaitForVerticalBlank((LPDIRECTDRAW)this,x,h);
 }
 
-static IDirectDraw2_VTable dd2vt = {
-	IDirectDraw2_QueryInterface,
+static IDirectDraw2_VTable dga_dd2vt = {
+	DGA_IDirectDraw2_QueryInterface,
 	IDirectDraw2_AddRef,
-	IDirectDraw2_Release,
+	DGA_IDirectDraw2_Release,
 	(void*)4,
 	IDirectDraw2_CreateClipper,
-	IDirectDraw2_CreatePalette,
-	IDirectDraw2_CreateSurface,
+	DGA_IDirectDraw2_CreatePalette,
+	DGA_IDirectDraw2_CreateSurface,
 	(void*)8,
 	IDirectDraw2_EnumDisplayModes,
 	IDirectDraw2_EnumSurfaces,
 	(void*)11,
-	IDirectDraw2_GetCaps,
-	IDirectDraw2_GetDisplayMode,
+	DGA_IDirectDraw2_GetCaps,
+	DGA_IDirectDraw2_GetDisplayMode,
 	(void*)14,
 	(void*)15,
 	IDirectDraw2_GetMonitorFrequency,
 	(void*)17,
 	IDirectDraw2_GetVerticalBlankStatus,
 	(void*)19,
-	IDirectDraw2_RestoreDisplayMode,
+	DGA_IDirectDraw2_RestoreDisplayMode,
 	IDirectDraw2_SetCooperativeLevel,
-	IDirectDraw2_SetDisplayMode,
+	DGA_IDirectDraw2_SetDisplayMode,
 	IDirectDraw2_WaitForVerticalBlank,
-	IDirectDraw2_GetAvailableVidMem
-	
+	DGA_IDirectDraw2_GetAvailableVidMem
+};
+
+static IDirectDraw2_VTable xshm_dd2vt = {
+	XShm_IDirectDraw2_QueryInterface,
+	IDirectDraw2_AddRef,
+	XShm_IDirectDraw2_Release,
+	(void*)4,
+	IDirectDraw2_CreateClipper,
+	XShm_IDirectDraw2_CreatePalette,
+	XShm_IDirectDraw2_CreateSurface,
+	(void*)8,
+	IDirectDraw2_EnumDisplayModes,
+	IDirectDraw2_EnumSurfaces,
+	(void*)11,
+	XShm_IDirectDraw2_GetCaps,
+	XShm_IDirectDraw2_GetDisplayMode,
+	(void*)14,
+	(void*)15,
+	IDirectDraw2_GetMonitorFrequency,
+	(void*)17,
+	IDirectDraw2_GetVerticalBlankStatus,
+	(void*)19,
+	XShm_IDirectDraw2_RestoreDisplayMode,
+	IDirectDraw2_SetCooperativeLevel,
+	XShm_IDirectDraw2_SetDisplayMode,
+	IDirectDraw2_WaitForVerticalBlank,
+	Xlib_IDirectDraw2_GetAvailableVidMem
+};
+
+static struct IDirectDraw2_VTable xlib_dd2vt = {
+	Xlib_IDirectDraw2_QueryInterface,
+	IDirectDraw2_AddRef,
+	Xlib_IDirectDraw2_Release,
+	(void*)4,
+	IDirectDraw2_CreateClipper,
+	Xlib_IDirectDraw2_CreatePalette,
+	Xlib_IDirectDraw2_CreateSurface,
+	(void*)8,
+	IDirectDraw2_EnumDisplayModes,
+	IDirectDraw2_EnumSurfaces,
+	(void*)11,
+	Xlib_IDirectDraw2_GetCaps,
+	Xlib_IDirectDraw2_GetDisplayMode,
+	(void*)14,
+	(void*)15,
+	IDirectDraw2_GetMonitorFrequency,
+	(void*)17,
+	IDirectDraw2_GetVerticalBlankStatus,
+	(void*)19,
+	Xlib_IDirectDraw2_RestoreDisplayMode,
+	IDirectDraw2_SetCooperativeLevel,
+	Xlib_IDirectDraw2_SetDisplayMode,
+	IDirectDraw2_WaitForVerticalBlank,
+	Xlib_IDirectDraw2_GetAvailableVidMem	
 };
 
 /******************************************************************************
  * 				DirectDrawCreate
  */
 
-HRESULT WINAPI DirectDrawCreate( LPGUID lpGUID, LPDIRECTDRAW *lplpDD, LPUNKNOWN pUnkOuter ) {
-
-	char	xclsid[50];
-	int	memsize,banksize,width,evbase,evret,major,minor,flags,height;
+HRESULT WINAPI DGA_DirectDrawCreate( LPDIRECTDRAW *lplpDD, LPUNKNOWN pUnkOuter) {
+#ifdef HAVE_LIBXXF86DGA
+	int	memsize,banksize,width,major,minor,flags,height;
 	char	*addr;
 
-	if (lpGUID)
-		WINE_StringFromCLSID(lpGUID,xclsid);
-	else
-		strcpy(xclsid,"<null>");
-
-	TRACE(ddraw,"(%s,%p,%p)\n",xclsid,lplpDD,pUnkOuter);
-	if (getuid()) {
+	if (getuid() != 0) {
 		MSG("Must be root to use XF86DGA!\n");
 		MessageBox32A(0,"Using the XF86DGA extension requires the program to be run using UID 0.","WINE DirectDraw",MB_OK|MB_ICONSTOP);
 		return E_UNEXPECTED;
 	}
-	*lplpDD = (LPDIRECTDRAW)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(IDirectDraw));
-	(*lplpDD)->lpvtbl = &ddvt;
-	(*lplpDD)->ref = 1;
-	if (!XF86DGAQueryExtension(display,&evbase,&evret)) {
-		MSG("Wine DirectDraw: No XF86DGA detected.\n");
-		return 0;
+	if (!DDRAW_DGA_Available()) {
+		TRACE(ddraw,"No XF86DGA detected.\n");
+		return DDERR_GENERIC;
 	}
+	*lplpDD = (LPDIRECTDRAW)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(IDirectDraw));
+	(*lplpDD)->lpvtbl = &dga_ddvt;
+	(*lplpDD)->ref = 1;
 	XF86DGAQueryVersion(display,&major,&minor);
 	TRACE(ddraw,"XF86DGA is version %d.%d\n",major,minor);
 	XF86DGAQueryDirectVideo(display,DefaultScreen(display),&flags);
@@ -1728,17 +3029,15 @@
 	TRACE(ddraw,"video framebuffer: begin %p, width %d,banksize %d,memsize %d\n",
 		addr,width,banksize,memsize
 	);
-	(*lplpDD)->d.fb_width = width;
-	(*lplpDD)->d.fb_addr = addr;
-	(*lplpDD)->d.fb_memsize = memsize;
-	(*lplpDD)->d.fb_banksize = banksize;
+	(*lplpDD)->e.dga.fb_width = width;
+	(*lplpDD)->e.dga.fb_addr = addr;
+	(*lplpDD)->e.dga.fb_memsize = memsize;
+	(*lplpDD)->e.dga.fb_banksize = banksize;
 
 	XF86DGAGetViewPortSize(display,DefaultScreen(display),&width,&height);
 	XF86DGASetViewPort(display,DefaultScreen(display),0,0);
-	(*lplpDD)->d.vp_width = width;
-	(*lplpDD)->d.vp_height = height;
-	(*lplpDD)->d.fb_height = screenHeight;
-	(*lplpDD)->d.vpmask = 0;
+	(*lplpDD)->e.dga.fb_height = screenHeight;
+	(*lplpDD)->e.dga.vpmask = 0;
 
 	/* just assume the default depth is the DGA depth too */
 	(*lplpDD)->d.depth = DefaultDepthOfScreen(screen);
@@ -1746,11 +3045,69 @@
 	SIGNAL_InitEmulator();
 #endif
 	return 0;
+#else /* defined(HAVE_LIBXXF86DGA) */
+	return DDERR_INVALIDDIRECTDRAWGUID;
+#endif /* defined(HAVE_LIBXXF86DGA) */
 }
-#else
+
+HRESULT WINAPI XShm_DirectDrawCreate( LPDIRECTDRAW *lplpDD, LPUNKNOWN pUnkOuter) {
+#ifdef HAVE_LIBXXSHM
+	if (!DDRAW_XShm_Available()) {
+		fprintf(stderr,"No XShm detected.\n");
+		return DDERR_GENERIC;
+	}
+	*lplpDD = (LPDIRECTDRAW)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(IDirectDraw));
+	(*lplpDD)->lpvtbl = &xshm_ddvt;
+	(*lplpDD)->ref = 1;
+	(*lplpDD)->e.xshm.drawable = 0; /* FIXME: make a window */
+	(*lplpDD)->d.depth = DefaultDepthOfScreen(screen);
+	(*lplpDD)->d.height = (*lplpDD)->d.width = 0; /* FIXME */
+	return 0;
+#else /* defined(HAVE_LIBXXSHM) */
+	return DDERR_INVALIDDIRECTDRAWGUID;
+#endif /* defined(HAVE_LIBXXSHM) */
+}
+
+HRESULT WINAPI Xlib_DirectDrawCreate( LPDIRECTDRAW *lplpDD, LPUNKNOWN pUnkOuter) {
+	*lplpDD = (LPDIRECTDRAW)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(IDirectDraw));
+	(*lplpDD)->lpvtbl = &xlib_ddvt;
+	(*lplpDD)->ref = 1;
+	(*lplpDD)->e.xshm.drawable = 0; /* FIXME: make a window */
+	(*lplpDD)->d.depth = DefaultDepthOfScreen(screen);
+	(*lplpDD)->d.height = (*lplpDD)->d.width = 0; /* FIXME */
+	return 0;
+}
 
 HRESULT WINAPI DirectDrawCreate( LPGUID lpGUID, LPDIRECTDRAW *lplpDD, LPUNKNOWN pUnkOuter ) {
-	MessageBox32A(0,"WINE DirectDraw needs the XF86DGA extensions compiled in. (libXxf86dga.a).","WINE DirectDraw",MB_OK|MB_ICONSTOP);
-	return E_OUTOFMEMORY;
+	char	xclsid[50];
+
+	if (lpGUID)
+		WINE_StringFromCLSID(lpGUID,xclsid);
+	else
+		strcpy(xclsid,"<null>");
+
+	TRACE(ddraw,"(%s,%p,%p)\n",xclsid,lplpDD,pUnkOuter);
+
+	if (!lpGUID) {
+		/* if they didn't request a particular interface, use the best
+		 * supported one */
+		if (DDRAW_DGA_Available()) {
+			lpGUID = &DGA_DirectDraw_GUID;
+		} else if (DDRAW_XShm_Available()) {
+			lpGUID = &XSHM_DirectDraw_GUID;
+		} else {
+			lpGUID = &XLIB_DirectDraw_GUID;
+		}
+	}
+
+	if (!memcmp(lpGUID, &DGA_DirectDraw_GUID, sizeof(GUID))) {
+		return DGA_DirectDrawCreate(lplpDD, pUnkOuter);
+	} else if (!memcmp(lpGUID, &XSHM_DirectDraw_GUID, sizeof(GUID))) {
+		return XShm_DirectDrawCreate(lplpDD, pUnkOuter);
+	} else if (!memcmp(lpGUID, &XLIB_DirectDraw_GUID, sizeof(GUID))) {
+		return Xlib_DirectDrawCreate(lplpDD, pUnkOuter);
+	}
+
+	fprintf(stderr,"DirectDrawCreate(%s,%p,%p): did not recognize requested GUID\n",xclsid,lplpDD,pUnkOuter);
+	return DDERR_INVALIDDIRECTDRAWGUID;
 }
-#endif
diff --git a/graphics/env.c b/graphics/env.c
index cb1f498..8220a21 100644
--- a/graphics/env.c
+++ b/graphics/env.c
@@ -6,12 +6,13 @@
  * Copyright 1997 Marcus Meissner
  * Copyright 1998 Andreas Mohr
  */
-#include <windows.h>
 #include <stdio.h>
 #include <string.h>
-#include <config.h>
-#include <gdi.h>
-#include <debug.h>
+#include "windows.h"
+#include "config.h"
+#include "gdi.h"
+#include "debug.h"
+#include "heap.h"
 
 typedef struct {
         ATOM atom;
@@ -24,8 +25,9 @@
 {
     INT16 i;
     
-    for (i = 20; i; i--) {
-      if (EnvTable[i].atom == atom) return &EnvTable[i];
+    for (i = 19; i >= 0; i--) {
+      if (EnvTable[i].atom == atom)
+	return &EnvTable[i];
     }
     return NULL;
 }
@@ -46,20 +48,26 @@
 
 static ATOM PortNameToAtom(LPCSTR lpPortName, BOOL16 add)
 {
-    char PortName[256];
-    LPCSTR p;
+    char *p;
+    BOOL32 needfree = FALSE;
+    ATOM ret;
 
     if (lpPortName[strlen(lpPortName) - 1] == ':') {
-        strncpy(PortName, lpPortName, strlen(lpPortName) - 1);
-        p = PortName;
+        p = HEAP_strdupA(GetProcessHeap(), 0, lpPortName);
+        p[strlen(lpPortName) - 1] = '\0';
+        needfree = TRUE;
     }
     else
-        p = lpPortName;
+        p = (char *)lpPortName;
 
     if (add)
-        return AddAtom32A(p);
+        ret = AddAtom32A(p);
     else
-        return FindAtom32A(p);
+        ret =  FindAtom32A(p);
+
+    if(needfree) HeapFree(GetProcessHeap(), 0, p);
+
+    return ret;
 }
 
 
diff --git a/graphics/metafiledrv/init.c b/graphics/metafiledrv/init.c
index a789159..a9b5d2e 100644
--- a/graphics/metafiledrv/init.c
+++ b/graphics/metafiledrv/init.c
@@ -46,6 +46,7 @@
     NULL,                            /* pPolyPolyline */
     MFDRV_Polygon,                   /* pPolygon */
     MFDRV_Polyline,                  /* pPolyline */
+    NULL,                            /* pPolyBezier */
     NULL,                            /* pRealizePalette */
     MFDRV_Rectangle,                 /* pRectangle */
     NULL,                            /* pRestoreDC */
diff --git a/graphics/painting.c b/graphics/painting.c
index 4d75ddd..659e9e8 100644
--- a/graphics/painting.c
+++ b/graphics/painting.c
@@ -629,7 +629,10 @@
     top    = YLPTODP( dc, rc->top );
     right  = XLPTODP( dc, rc->right );
     bottom = YLPTODP( dc, rc->bottom );
-    
+
+    if(left == right || top == bottom)
+        return;
+
     hnewPen = CreatePen32(PS_DOT, 1, GetSysColor32(COLOR_WINDOWTEXT) );
     hOldPen = SelectObject32( hdc, hnewPen );
     oldDrawMode = SetROP232(hdc, R2_XORPEN);
@@ -1057,8 +1060,31 @@
  */
 BOOL16 WINAPI PolyBezier16( HDC16 hDc, LPPOINT16 lppt, INT16 cPoints )
 {
-    FIXME(gdi, "(%x,%p,%d): stub\n",hDc,lppt,cPoints);
-    return TRUE;
+    int i;
+    BOOL16 ret;
+    LPPOINT32 pt32 = (LPPOINT32)HeapAlloc( GetProcessHeap(), 0,
+                                           cPoints*sizeof(POINT32) );
+    if(!pt32) return FALSE;
+    for (i=cPoints;i--;) CONV_POINT16TO32(&(lppt[i]),&(pt32[i]));
+    ret= PolyBezier32(hDc, pt32, cPoints);
+    HeapFree( GetProcessHeap(), 0, pt32 );
+    return ret;
+}
+
+/******************************************************************************
+ * PolyBezierTo16 [GDI.503]
+ */
+BOOL16 WINAPI PolyBezierTo16( HDC16 hDc, LPPOINT16 lppt, INT16 cPoints )
+{
+    int i;
+    BOOL16 ret;
+    LPPOINT32 pt32 = (LPPOINT32)HeapAlloc( GetProcessHeap(), 0,
+                                           cPoints*sizeof(POINT32) );
+    if(!pt32) return FALSE;
+    for (i=cPoints;i--;) CONV_POINT16TO32(&(lppt[i]),&(pt32[i]));
+    ret= PolyBezierTo32(hDc, pt32, cPoints);
+    HeapFree( GetProcessHeap(), 0, pt32 );
+    return ret;
 }
 
 /******************************************************************************
@@ -1072,9 +1098,44 @@
  *
  * RETURNS STD
  */
-BOOL32 WINAPI PolyBezier32( HDC32 hDc, LPPOINT32 lppt, DWORD cPoints )
+BOOL32 WINAPI PolyBezier32( HDC32 hdc, LPPOINT32 lppt, DWORD cPoints )
 {
-    FIXME(gdi, "(%x,%p,%ld): stub\n",hDc,lppt,cPoints);
-    return TRUE;
+    DC * dc = DC_GetDCPtr( hdc );
+    if(!dc) return FALSE;
+    if(dc && PATH_IsPathOpen(dc->w.path))
+        FIXME(gdi, "PATH_PolyBezier is not implemented!\n");
+//        if(!PATH_PolyBezier(hdc, x, y))
+//	   return FALSE;
+    return dc->funcs->pPolyBezier&&
+    	   dc->funcs->pPolyBezier(dc, lppt[0], lppt+1, cPoints-1);
 }
 
+/******************************************************************************
+ * PolyBezierTo32 [GDI32.269]
+ * Draws one or more Bezier curves
+ *
+ * PARAMS
+ *    hDc     [I] Handle to device context
+ *    lppt    [I] Pointer to endpoints and control points
+ *    cPoints [I] Count of endpoints and control points
+ *
+ * RETURNS STD
+ */
+BOOL32 WINAPI PolyBezierTo32( HDC32 hdc, LPPOINT32 lppt, DWORD cPoints )
+{
+    DC * dc = DC_GetDCPtr( hdc );
+    POINT32 pt;
+    BOOL32 ret;
+    if(!dc) return FALSE;
+    pt.x=dc->w.CursPosX;
+    pt.y=dc->w.CursPosY;
+    if(dc && PATH_IsPathOpen(dc->w.path))
+        FIXME(gdi, "PATH_PolyBezierTo is not implemented!\n");
+//        if(!PATH_PolyBezier(hdc, x, y))
+//	   return FALSE;
+    ret= dc->funcs->pPolyBezier &&
+    	   dc->funcs->pPolyBezier(dc, pt, lppt, cPoints);
+    if( dc->funcs->pMoveToEx)
+    	   dc->funcs->pMoveToEx(dc,lppt[cPoints].x,lppt[cPoints].y,&pt);
+    return ret;
+}
diff --git a/graphics/psdrv/init.c b/graphics/psdrv/init.c
index e99b519..e68f64c 100644
--- a/graphics/psdrv/init.c
+++ b/graphics/psdrv/init.c
@@ -48,6 +48,7 @@
     NULL,                            /* pPolyPolyline */
     NULL,                            /* pPolygon */
     NULL,                            /* pPolyline */
+    NULL,                            /* pPolyBezier */
     NULL,                            /* pRealizePalette */
     PSDRV_Rectangle,                 /* pRectangle */
     NULL,                            /* pRestoreDC */
diff --git a/graphics/win16drv/init.c b/graphics/win16drv/init.c
index e7ad018..10dbf65 100644
--- a/graphics/win16drv/init.c
+++ b/graphics/win16drv/init.c
@@ -80,6 +80,7 @@
     NULL,                            /* pPolyPolyline */
     WIN16DRV_Polygon,                /* pPolygon */
     WIN16DRV_Polyline,               /* pPolyline */
+    NULL,                            /* pPolyBezier */
     NULL,                            /* pRealizePalette */
     WIN16DRV_Rectangle,              /* pRectangle */
     NULL,                            /* pRestoreDC */
@@ -175,8 +176,8 @@
                              printerEnabled, sizeof(printerEnabled) );
     if (lstrcmpi32A(printerEnabled,"on"))
     {
-        MSG("WIN16DRV_CreateDC disabled in wine.conf file\n");
-	MSG("Enable printing with \"printer=on\"");
+        MSG("Printing disabled in wine.conf or .winerc file\n");
+        MSG("Use \"printer=on\" in the \"[wine]\" section to enable it.");
         return FALSE;
     }
 
@@ -398,14 +399,33 @@
 
 HPQ WINAPI CreatePQ(int size) 
 {
+#if 0
+    HGLOBAL16 hpq = 0;
+    WORD tmp_size;
+    LPWORD pPQ;
+
+    tmp_size = size << 2;
+    if (!(hpq = GlobalAlloc16(GMEM_SHARE|GMEM_MOVEABLE, tmp_size + 8)))
+       return 0xffff;
+    pPQ = GlobalLock16(hpq);
+    *pPQ++ = 0;
+    *pPQ++ = tmp_size;
+    *pPQ++ = 0;
+    *pPQ++ = 0;
+    GlobalUnlock16(hpq);
+
+    return (HPQ)hpq;
+#else
     FIXME(win16drv, "(%d): stub\n",size);
     return 1;
+#endif
 }
+
 int WINAPI DeletePQ(HPQ hPQ) 
 {
-    FIXME(win16drv, "(%x): stub\n", hPQ);
-    return 0;
+    return GlobalFree16((HGLOBAL16)hPQ);
 }
+
 int WINAPI ExtractPQ(HPQ hPQ) 
 { 
     struct hpq *queue, *prev, *current, *currentPrev;
diff --git a/graphics/x11drv/clipping.c b/graphics/x11drv/clipping.c
index 88b3455..bf5f880 100644
--- a/graphics/x11drv/clipping.c
+++ b/graphics/x11drv/clipping.c
@@ -25,7 +25,8 @@
     if (!obj)
     {
         ERR(x11drv, "Rgn is 0. Please report this.\n");
-        exit(1);
+	return;
+        /*exit(1);*/
     }
     
     if (obj->rgn->numRects > 0)
diff --git a/graphics/x11drv/graphics.c b/graphics/x11drv/graphics.c
index 1912e55..0f385ad 100644
--- a/graphics/x11drv/graphics.c
+++ b/graphics/x11drv/graphics.c
@@ -38,7 +38,7 @@
 #include "debug.h"
 #include "xmalloc.h"
 
-
+#define ABS(x)    ((x)<0?(-(x)):(x))
 /**********************************************************************
  *	     X11DRV_MoveToEx
  */
@@ -79,17 +79,16 @@
  * Helper functions for Arc(), Chord() and Pie().
  * 'lines' is the number of lines to draw: 0 for Arc, 1 for Chord, 2 for Pie.
  *
- * FIXME: incorrect with thick pen and/or PS_INSIDEFRAME style
- *        see ellipse and rectangle functions
  */
 static BOOL32
 X11DRV_DrawArc( DC *dc, INT32 left, INT32 top, INT32 right,
                 INT32 bottom, INT32 xstart, INT32 ystart,
                 INT32 xend, INT32 yend, INT32 lines )
 {
-    INT32 xcenter, ycenter, istart_angle, idiff_angle, tmp;
+    INT32 xcenter, ycenter, istart_angle, idiff_angle;
+    INT32 width, oldwidth, oldendcap;
     double start_angle, end_angle;
-    XPoint points[3];
+    XPoint points[4];
 
     left   = XLPTODP( dc, left );
     top    = YLPTODP( dc, top );
@@ -100,10 +99,29 @@
     xend   = XLPTODP( dc, xend );
     yend   = YLPTODP( dc, yend );
 
-    if ((left == right) || (top == bottom)) return TRUE;
+    if (right < left) { INT32 tmp = right; right = left; left = tmp; }
+    if (bottom < top) { INT32 tmp = bottom; bottom = top; top = tmp; }
+    if ((left == right) || (top == bottom)
+            ||(lines && ((right-left==1)||(bottom-top==1)))) return TRUE;
 
-    if (left > right) { tmp=left; left=right; right=tmp; }
-    if (top > bottom) { tmp=top; top=bottom; bottom=tmp; } 
+    oldwidth = width = dc->u.x.pen.width;
+    oldendcap= dc->u.x.pen.endcap;
+    if (!width) width = 1;
+    if(dc->u.x.pen.style == PS_NULL) width = 0;
+
+    if ((dc->u.x.pen.style == PS_INSIDEFRAME))
+    {
+        if (2*width > (right-left)) width=(right-left + 1)/2;
+        if (2*width > (bottom-top)) width=(bottom-top + 1)/2;
+        left   += width / 2;
+        right  -= (width - 1) / 2;
+        top    += width / 2;
+        bottom -= (width - 1) / 2;
+    }
+    if(width == 0) width=1; /* more accurate */
+    dc->u.x.pen.width=width;
+    dc->u.x.pen.endcap=PS_ENDCAP_SQUARE;
+
     xcenter = (right + left) / 2;
     ycenter = (bottom + top) / 2;
     start_angle = atan2( (double)(ycenter-ystart)*(right-left),
@@ -121,14 +139,13 @@
     else
       if ((end_angle == PI)&&( start_angle <0))
 	end_angle = - PI;
-    istart_angle = (INT32)(start_angle * 180 * 64 / PI);
-    idiff_angle  = (INT32)((end_angle - start_angle) * 180 * 64 / PI );
+    istart_angle = (INT32)(start_angle * 180 * 64 / PI + 0.5);
+    idiff_angle  = (INT32)((end_angle - start_angle) * 180 * 64 / PI + 0.5);
     if (idiff_angle <= 0) idiff_angle += 360 * 64;
 
       /* Fill arc with brush if Chord() or Pie() */
 
-    if ((lines > 0) && DC_SetupGCForBrush( dc ))
-    {
+    if ((lines > 0) && DC_SetupGCForBrush( dc )) {
         TSXSetArcMode( display, dc->u.x.gc, (lines==1) ? ArcChord : ArcPieSlice);
         TSXFillArc( display, dc->u.x.drawable, dc->u.x.gc,
                  dc->w.DCOrgX + left, dc->w.DCOrgY + top,
@@ -137,24 +154,69 @@
 
       /* Draw arc and lines */
 
-    if (!DC_SetupGCForPen( dc )) return TRUE;
+    if (DC_SetupGCForPen( dc )){
     TSXDrawArc( display, dc->u.x.drawable, dc->u.x.gc,
 	      dc->w.DCOrgX + left, dc->w.DCOrgY + top,
 	      right-left-1, bottom-top-1, istart_angle, idiff_angle );
-    if (!lines) return TRUE;
-
-    points[0].x = dc->w.DCOrgX + xcenter + (int)(cos(start_angle) * (right-left) / 2);
-    points[0].y = dc->w.DCOrgY + ycenter - (int)(sin(start_angle) * (bottom-top) / 2);
-    points[1].x = dc->w.DCOrgX + xcenter + (int)(cos(end_angle) * (right-left) / 2);
-    points[1].y = dc->w.DCOrgY + ycenter - (int)(sin(end_angle) * (bottom-top) / 2);
-    if (lines == 2)
-    {
-	points[2] = points[1];
+        if (lines) {
+            /* use the truncated values */
+            start_angle=(double)istart_angle*PI/64./180.;
+            end_angle=(double)(istart_angle+idiff_angle)*PI/64./180.;
+            /* calculate the endpoints and round correctly */
+            points[0].x = (int) floor(dc->w.DCOrgX + (right+left)/2.0 +
+                    cos(start_angle) * (right-left-width*2+2) / 2. + 0.5);
+            points[0].y = (int) floor(dc->w.DCOrgY + (top+bottom)/2.0 -
+                    sin(start_angle) * (bottom-top-width*2+2) / 2. + 0.5);
+            points[1].x = (int) floor(dc->w.DCOrgX + (right+left)/2.0 +
+                    cos(end_angle) * (right-left-width*2+2) / 2. + 0.5);
+            points[1].y = (int) floor(dc->w.DCOrgY + (top+bottom)/2.0 -
+                    sin(end_angle) * (bottom-top-width*2+2) / 2. + 0.5);
+                    
+            /* OK this stuff is optimized for Xfree86 
+             * which is probably the most used server by
+             * wine users. Other X servers will not 
+             * display correctly. (eXceed for instance)
+             * so if you feel you must change make sure that
+             * you either use Xfree86 or seperate your changes 
+             * from these (compile switch or whatever)
+             */
+            if (lines == 2) {
+                INT32 dx1,dy1;
+                points[3] = points[1];
 	points[1].x = dc->w.DCOrgX + xcenter;
 	points[1].y = dc->w.DCOrgY + ycenter;
+                points[2] = points[1];
+                dx1=points[1].x-points[0].x;
+                dy1=points[1].y-points[0].y;
+                if(((top-bottom) | -2) == -2)
+                    if(dy1>0) points[1].y--;
+                if(dx1<0) {
+                    if (((-dx1)*64)<=ABS(dy1)*37) points[0].x--;
+                    if(((-dx1*9))<(dy1*16)) points[0].y--;
+                    if( dy1<0 && ((dx1*9)) < (dy1*16)) points[0].y--;
+                } else {
+                    if(dy1 < 0)  points[0].y--;
+                    if(((right-left) | -2) == -2) points[1].x--;
+                }
+                dx1=points[3].x-points[2].x;
+                dy1=points[3].y-points[2].y;
+                if(((top-bottom) | -2 ) == -2)
+                    if(dy1 < 0) points[2].y--;
+                if( dx1<0){ 
+                    if( dy1>0) points[3].y--;
+                    if(((right-left) | -2) == -2 ) points[2].x--;
+                }else {
+                    points[3].y--;
+                    if( dx1 * 64 < dy1 * -37 ) points[3].x--;
+                }
+                lines++;
     }
     TSXDrawLines( display, dc->u.x.drawable, dc->u.x.gc,
 	        points, lines+1, CoordModeOrigin );
+        }
+    }
+    dc->u.x.pen.width=oldwidth;
+    dc->u.x.pen.endcap=oldendcap;
     return TRUE;
 }
 
@@ -201,7 +263,6 @@
 X11DRV_Ellipse( DC *dc, INT32 left, INT32 top, INT32 right, INT32 bottom )
 {
     INT32 width, oldwidth;
-
     left   = XLPTODP( dc, left );
     top    = YLPTODP( dc, top );
     right  = XLPTODP( dc, right );
@@ -224,7 +285,7 @@
         top    += width / 2;
         bottom -= (width - 1) / 2;
     }
-    if(width == 1) width=0;
+    if(width == 0) width=1; /* more accurate */
     dc->u.x.pen.width=width;
 
     if (DC_SetupGCForBrush( dc ))
@@ -305,7 +366,7 @@
 X11DRV_RoundRect( DC *dc, INT32 left, INT32 top, INT32 right,
                   INT32 bottom, INT32 ell_width, INT32 ell_height )
 {
-    INT32 width, oldwidth;
+    INT32 width, oldwidth, oldendcap;
 
     TRACE(graphics, "(%d %d %d %d  %d %d\n", 
     	left, top, right, bottom, ell_width, ell_height);
@@ -327,6 +388,7 @@
     if (bottom < top) { INT32 tmp = bottom; bottom = top; top = tmp; }
 
     oldwidth=width = dc->u.x.pen.width;
+    oldendcap = dc->u.x.pen.endcap;
     if (!width) width = 1;
     if(dc->u.x.pen.style == PS_NULL) width = 0;
 
@@ -339,8 +401,9 @@
         top    += width / 2;
         bottom -= (width - 1) / 2;
     }
-    if(width == 1) width=0;
+    if(width == 0) width=1;
     dc->u.x.pen.width=width;
+    dc->u.x.pen.endcap=PS_ENDCAP_SQUARE;
 
     if (DC_SetupGCForBrush( dc ))
     {
@@ -386,23 +449,34 @@
         if (ell_width < right - left)
         {
             TSXFillRectangle( display, dc->u.x.drawable, dc->u.x.gc,
-                            dc->w.DCOrgX + left + ell_width / 2,
-                            dc->w.DCOrgY + top,
-                            right - left - ell_width, ell_height / 2 );
+                            dc->w.DCOrgX + left + (ell_width + 1) / 2,
+                            dc->w.DCOrgY + top + 1,
+                            right - left - ell_width - 1,
+                            (ell_height + 1) / 2 - 1);
             TSXFillRectangle( display, dc->u.x.drawable, dc->u.x.gc,
-                            dc->w.DCOrgX + left + ell_width / 2,
-                            dc->w.DCOrgY + bottom - (ell_height+1) / 2,
-                            right - left - ell_width,
-                            (ell_height+1) / 2 - 1 );
+                            dc->w.DCOrgX + left + (ell_width + 1) / 2,
+                            dc->w.DCOrgY + bottom - (ell_height) / 2 - 1,
+                            right - left - ell_width - 1,
+                            (ell_height) / 2 );
         }
         if  (ell_height < bottom - top)
         {
             TSXFillRectangle( display, dc->u.x.drawable, dc->u.x.gc,
-                            dc->w.DCOrgX + left,
-                            dc->w.DCOrgY + top + ell_height / 2,
-                            right - left - 1, bottom - top - ell_height );
+                            dc->w.DCOrgX + left + 1,
+                            dc->w.DCOrgY + top + (ell_height + 1) / 2,
+                            right - left - 2,
+                            bottom - top - ell_height - 1);
         }
     }
+    /* FIXME: this could be done with on X call
+     * more efficient and probably more correct
+     * on any X server: XDrawArcs will draw
+     * straight horizontal and vertical lines
+     * if width or height are zero.
+     *
+     * BTW this stuff is optimized for an Xfree86 server
+     * read the comments inside the X11DRV_DrawArc function
+     */
     if (DC_SetupGCForPen(dc)) {
         if (ell_width > (right-left) )
             if (ell_height > (bottom-top) )
@@ -444,31 +518,32 @@
 	if (ell_width < right - left)
 	{
 	    TSXDrawLine( display, dc->u.x.drawable, dc->u.x.gc, 
-		       dc->w.DCOrgX + left + ell_width / 2 - 2,
+               dc->w.DCOrgX + left + ell_width / 2,
 		       dc->w.DCOrgY + top,
-		       dc->w.DCOrgX + right - ell_width / 2,
+               dc->w.DCOrgX + right - (ell_width+1) / 2,
 		       dc->w.DCOrgY + top);
 	    TSXDrawLine( display, dc->u.x.drawable, dc->u.x.gc, 
-		       dc->w.DCOrgX + left + ell_width / 2 - 2,
+               dc->w.DCOrgX + left + ell_width / 2 ,
 		       dc->w.DCOrgY + bottom - 1,
-		       dc->w.DCOrgX + right - ell_width / 2,
+               dc->w.DCOrgX + right - (ell_width+1)/ 2,
 		       dc->w.DCOrgY + bottom - 1);
 	}
 	if (ell_height < bottom - top)
 	{
 	    TSXDrawLine( display, dc->u.x.drawable, dc->u.x.gc, 
 		       dc->w.DCOrgX + right - 1,
-		       dc->w.DCOrgY + top + ell_height / 2 - 1,
+               dc->w.DCOrgY + top + ell_height / 2,
 		       dc->w.DCOrgX + right - 1,
-		       dc->w.DCOrgY + bottom - ell_height / 2);
+               dc->w.DCOrgY + bottom - (ell_height+1) / 2);
 	    TSXDrawLine( display, dc->u.x.drawable, dc->u.x.gc, 
 		       dc->w.DCOrgX + left,
-		       dc->w.DCOrgY + top + ell_height / 2 - 1,
+               dc->w.DCOrgY + top + ell_height / 2,
 		       dc->w.DCOrgX + left,
-		       dc->w.DCOrgY + bottom - ell_height / 2);
+               dc->w.DCOrgY + bottom - (ell_height+1) / 2);
 	}
     }
     dc->u.x.pen.width=oldwidth;
+    dc->u.x.pen.endcap=oldendcap;
     return TRUE;
 }
 
@@ -576,17 +651,26 @@
  *          X11DRV_Polyline
  */
 BOOL32
-X11DRV_Polyline( DC *dc, const LPPOINT32 pt, INT32 count )
+X11DRV_Polyline( DC *dc, LPPOINT32 pt, INT32 count )
 {
+    INT32 oldwidth;
     register int i;
+    XPoint *points;
+    if((oldwidth=dc->u.x.pen.width)==0) dc->u.x.pen.width=1;
 
-    if (DC_SetupGCForPen( dc ))
-	for (i = 0; i < count-1; i ++)
-	    TSXDrawLine (display, dc->u.x.drawable, dc->u.x.gc,  
-		       dc->w.DCOrgX + XLPTODP(dc, pt [i].x),
-		       dc->w.DCOrgY + YLPTODP(dc, pt [i].y),
-		       dc->w.DCOrgX + XLPTODP(dc, pt [i+1].x),
-		       dc->w.DCOrgY + YLPTODP(dc, pt [i+1].y));
+    points = (XPoint *) xmalloc (sizeof (XPoint) * (count));
+    for (i = 0; i < count; i++)
+    {
+    points[i].x = dc->w.DCOrgX + XLPTODP( dc, pt[i].x );
+    points[i].y = dc->w.DCOrgY + YLPTODP( dc, pt[i].y );
+    }
+
+    if (DC_SetupGCForPen ( dc ))
+    TSXDrawLines( display, dc->u.x.drawable, dc->u.x.gc,
+           points, count, CoordModeOrigin );
+
+    free( points );
+    dc->u.x.pen.width=oldwidth;
     return TRUE;
 }
 
@@ -835,3 +919,189 @@
     LeaveCriticalSection( &X11DRV_CritSection );
     return result;
 }
+
+/****************** WARNING: WORK IN PROGRESS AHEAD !!!! ****************
+ * 
+ *   *Very* simple bezier drawing code, 
+ *
+ *   It uses a recursive algorithm to divide the curve in a series
+ *   of straight line segements. Not ideal but for me sufficient.
+ *   If you are in need for something better look for some incremental
+ *   algorithm.
+ *
+ *   7 July 1998 Rein Klazes
+ */
+
+ /* 
+  * some macro definitions for bezier drawing
+  *
+  * to avoid trucation errors the coordinates are
+  * shifted upwards. When used in drawing they are
+  * shifted down again, including correct rounding
+  * and avoiding floating points
+  */
+
+#define BEZIERSHIFTBITS 4
+#define BEZIERSHIFTUP(x)    ((x)<<BEZIERSHIFTBITS)
+#define BEZIERFACTOR        BEZIERSHIFTUP(1)    
+#define BEZIERSHIFTDOWN(x)  (((x)+(1<<(BEZIERSHIFTBITS-1)))>>BEZIERSHIFTBITS)
+/* maximum depth of recursion */
+#define BEZIERMAXDEPTH  6
+
+/* size of array to store points on */
+/* enough for one curve */
+#define BEZMAXPOINTS    ((1<<BEZIERMAXDEPTH)+1)
+
+/* calculate Bezier average, in this case the middle */
+
+#define BEZIERMIDDLE(Mid, P1, P2) \
+    (Mid).x=((P1).x+(P2).x)/2;\
+    (Mid).y=((P1).y+(P2).y)/2;
+    
+/* check to terminate recursion */
+static int BezierCheck( int level, POINT32 *Points)
+{ 
+#if 0
+/* this code works, it just is too much work for
+ * the savings that are created. This should be done
+ * with integer arithmetic and simpler.
+ */
+    double hyp, r1, r2;
+    /* first check that the control points are "near" */
+    if(Points[3].x>Points[0].x)
+        if(Points[1].x > Points[3].x+BEZIERFACTOR || 
+                Points[1].x < Points[0].x-BEZIERFACTOR ||
+                Points[2].x > Points[3].x+BEZIERFACTOR || 
+                Points[2].x < Points[0].x-BEZIERFACTOR)
+        return FALSE;
+    else
+        if(Points[1].x < Points[3].x-BEZIERFACTOR || 
+                Points[1].x > Points[0].x+BEZIERFACTOR ||
+                Points[2].x < Points[3].x-BEZIERFACTOR || 
+                Points[2].x > Points[0].x+BEZIERFACTOR)
+        return FALSE;
+    if(Points[3].y>Points[0].y)
+        if(Points[1].y > Points[3].y+BEZIERFACTOR || 
+                Points[1].y < Points[0].y-BEZIERFACTOR ||
+                Points[2].y > Points[3].y+BEZIERFACTOR || 
+                Points[2].y < Points[0].y-BEZIERFACTOR)
+        return FALSE;
+    else
+        if(Points[1].x < Points[3].x-BEZIERFACTOR || 
+                Points[1].x > Points[0].x+BEZIERFACTOR ||
+                Points[2].x < Points[3].x-BEZIERFACTOR || 
+                Points[2].x > Points[0].x+BEZIERFACTOR)
+        return FALSE;o
+        
+    /* calculate the distance squared of the control point from
+     * the line from begin and endpoint
+     */
+        
+    hyp=((double)(Points[3].x-Points[0].x)*(double)(Points[3].x-Points[0].x)+
+           (double) (Points[3].y-Points[0].y)*(double)(Points[3].y-Points[0].y));
+    r1=((double)(Points[2].y-Points[0].y)*(double)(Points[3].x-Points[0].x)-
+           (double) (Points[3].y-Points[0].y)*(double)(Points[2].x-Points[0].x))
+           /BEZIERFACTOR;
+    r2=((double)(Points[1].y-Points[0].y)*(double)(Points[3].x-Points[0].x)-
+            (double)(Points[3].y-Points[0].y)*(double)(Points[1].x-Points[0].x))
+            /BEZIERFACTOR;
+    r1=r1*r1/hyp;
+    r1=r2*r2/hyp;
+    if( r1<1 && r2 <1){ /* distance less then a pixel */
+//        fprintf(stderr,"level is %d\n", level);
+        return TRUE;
+    }
+#endif
+    return FALSE;
+    
+}
+    
+/***********************************************************************
+ *           X11DRV_Bezier
+ *   Draw a -what microsoft calls- bezier curve
+ *   The routine recursively devides the curve
+ *   in two parts until a straight line can be drawn
+ */
+static void X11DRV_Bezier(int level, DC * dc, POINT32 *Points, 
+                          XPoint* xpoints, unsigned int* pix)
+{
+    if(*pix == BEZMAXPOINTS){
+        TSXDrawLines( display, dc->u.x.drawable, dc->u.x.gc,
+                    xpoints, *pix, CoordModeOrigin );
+        *pix=0;
+    }
+    if(!level || BezierCheck(level, Points)) {
+        if(*pix == 0){
+            xpoints[*pix].x= dc->w.DCOrgX + BEZIERSHIFTDOWN(Points[0].x);
+            xpoints[*pix].y= dc->w.DCOrgY + BEZIERSHIFTDOWN(Points[0].y);
+            *pix=1;
+        }
+        xpoints[*pix].x= dc->w.DCOrgX + BEZIERSHIFTDOWN(Points[3].x);
+        xpoints[*pix].y= dc->w.DCOrgY + BEZIERSHIFTDOWN(Points[3].y);
+        (*pix) ++;
+    } else {
+        POINT32 Points2[4]; /* for the second recursive call */
+        Points2[3]=Points[3];
+        BEZIERMIDDLE(Points2[2], Points[2], Points[3]);
+        BEZIERMIDDLE(Points2[0], Points[1], Points[2]);
+        BEZIERMIDDLE(Points2[1],Points2[0],Points2[2]);
+
+        BEZIERMIDDLE(Points[1], Points[0],  Points[1]);
+        BEZIERMIDDLE(Points[2], Points[1], Points2[0]);
+        BEZIERMIDDLE(Points[3], Points[2], Points2[1]);
+
+        Points2[0]=Points[3];
+
+        /* do the two halves */
+        X11DRV_Bezier(level-1, dc, Points, xpoints, pix);
+        X11DRV_Bezier(level-1, dc, Points2, xpoints, pix);
+    }
+}
+
+/***********************************************************************
+ *           X11DRV_PolyBezier
+ *      Implement functionality for PolyBezier and PolyBezierTo
+ *      calls. 
+ *      [i] dc pointer to device context
+ *      [i] start, first point in curve
+ *      [i] BezierPoints , array of point filled with rest of the points
+ *      [i] count, number of points in BezierPoints, must be a 
+ *          multiple of 3.
+ */
+BOOL32
+X11DRV_PolyBezier(DC *dc, POINT32 start, POINT32 *BezierPoints, DWORD count)
+{
+    POINT32 Points[4]; 
+    int i;
+    unsigned int ix=0;
+    XPoint* xpoints;
+    TRACE(graphics, "dc=%04x count=%ld %d,%d - %d,%d - %d,%d -%d,%d \n", 
+            (int)dc, count,
+            start.x, start.y,
+            (Points+0)->x, (Points+0)->y, 
+            (Points+1)->x, (Points+1)->y, 
+            (Points+2)->x, (Points+2)->y); 
+    if(!count || count % 3){
+        WARN(graphics," bad value for count : %ld\n", count);
+        return FALSE; /* paranoid */
+    }
+    xpoints=(XPoint*) xmalloc( sizeof(XPoint)*BEZMAXPOINTS);
+    Points[3].x=BEZIERSHIFTUP(XLPTODP(dc,start.x));
+    Points[3].y=BEZIERSHIFTUP(YLPTODP(dc,start.y));
+    while(count){
+        Points[0]=Points[3];
+        for(i=1;i<4;i++) {
+            Points[i].x= BEZIERSHIFTUP(XLPTODP(dc,BezierPoints->x));
+            Points[i].y= BEZIERSHIFTUP(YLPTODP(dc,BezierPoints->y));
+            BezierPoints++;
+        }
+        X11DRV_Bezier(BEZIERMAXDEPTH , dc, Points, xpoints, &ix );
+        count -=3;
+    }
+    if( ix) TSXDrawLines( display, dc->u.x.drawable, dc->u.x.gc,
+                xpoints, ix, CoordModeOrigin );
+//    fprintf(stderr," ix is %d\n",ix);
+    free(xpoints);
+    return TRUE;
+}
+/***************************END OF WORK IN PROGRESS ********************/
diff --git a/graphics/x11drv/init.c b/graphics/x11drv/init.c
index d5f11aa..cf91c6d 100644
--- a/graphics/x11drv/init.c
+++ b/graphics/x11drv/init.c
@@ -50,6 +50,7 @@
     X11DRV_PolyPolyline,             /* pPolyPolyline */
     X11DRV_Polygon,                  /* pPolygon */
     X11DRV_Polyline,                 /* pPolyline */
+    X11DRV_PolyBezier,               /* pPolyBezier */
     NULL,                            /* pRealizePalette */
     X11DRV_Rectangle,                /* pRectangle */
     NULL,                            /* pRestoreDC */
diff --git a/graphics/x11drv/text.c b/graphics/x11drv/text.c
index ea8c361..09c78b0 100644
--- a/graphics/x11drv/text.c
+++ b/graphics/x11drv/text.c
@@ -29,25 +29,28 @@
                    const INT32 *lpDx )
 {
     HRGN32		hRgnClip = 0;
-    int 		dir, ascent, descent, i;
+    int 	        i;
     fontObject*		pfo;
-    XCharStruct 	info;
+    INT32	 	width, ascent, descent, xwidth, ywidth;
     XFontStruct*	font;
     RECT32 		rect;
     char		dfBreakChar, lfUnderline, lfStrikeOut;
+    BOOL32		rotated = FALSE;
 
     if (!DC_SetupGCForText( dc )) return TRUE;
 
     pfo = XFONT_GetFontObject( dc->u.x.font );
     font = pfo->fs;
-
+     
+    if (pfo->lf.lfEscapement && pfo->lpX11Trans)
+        rotated = TRUE;
     dfBreakChar = (char)pfo->fi->df.dfBreakChar;
     lfUnderline = (pfo->fo_flags & FO_SYNTH_UNDERLINE) ? 1 : 0;
     lfStrikeOut = (pfo->fo_flags & FO_SYNTH_STRIKEOUT) ? 1 : 0;
 
-    TRACE(text,"hdc=%04x df=%04x %d,%d %s, %d  flags=%d\n",
+    TRACE(text,"hdc=%04x df=%04x %d,%d %s, %d  flags=%d lpDx=%p\n",
 	  dc->hSelf, (UINT16)(dc->u.x.font), x, y,
-	  debugstr_an (str, count), count, flags);
+	  debugstr_an (str, count), count, flags, lpDx);
 
     /* some strings sent here end in a newline for whatever reason.  I have no
        clue what the right treatment should be in general, but ignoring
@@ -112,37 +115,58 @@
     if (lpDx) /* have explicit character cell x offsets in logical coordinates */
     {
 	int extra = dc->wndExtX / 2;
-        for (i = info.width = 0; i < count; i++) info.width += lpDx[i];
-	info.width = (info.width * dc->vportExtX + extra ) / dc->wndExtX;
+        for (i = width = 0; i < count; i++) width += lpDx[i];
+	width = (width * dc->vportExtX + extra ) / dc->wndExtX;
     }
     else
     {
-	TSXTextExtents( font, str, count, &dir, &ascent, &descent, &info );
-        info.width += count*dc->w.charExtra + dc->w.breakExtra*dc->w.breakCount;
+        SIZE32 sz;
+        if (!X11DRV_GetTextExtentPoint( dc, str, count, &sz ))
+	    return FALSE;
+	width = XLSTODS(dc, sz.cx);
     }
+    ascent = pfo->lpX11Trans ? pfo->lpX11Trans->ascent : font->ascent;
+    descent = pfo->lpX11Trans ? pfo->lpX11Trans->descent : font->descent;
+    xwidth = pfo->lpX11Trans ? width * pfo->lpX11Trans->a /
+      pfo->lpX11Trans->pixelsize : width;
+    ywidth = pfo->lpX11Trans ? width * pfo->lpX11Trans->b /
+      pfo->lpX11Trans->pixelsize : 0;
 
     switch( dc->w.textAlign & (TA_LEFT | TA_RIGHT | TA_CENTER) )
     {
       case TA_LEFT:
- 	  if (dc->w.textAlign & TA_UPDATECP)
-	      dc->w.CursPosX = XDPTOLP( dc, x + info.width );
+	  if (dc->w.textAlign & TA_UPDATECP) {
+	      dc->w.CursPosX = XDPTOLP( dc, x + xwidth );
+	      dc->w.CursPosY = YDPTOLP( dc, y - ywidth );
+	  }
 	  break;
       case TA_RIGHT:
-	  x -= info.width;
-	  if (dc->w.textAlign & TA_UPDATECP) dc->w.CursPosX = XDPTOLP( dc, x );
+	  x -= xwidth;
+	  y += ywidth;
+	  if (dc->w.textAlign & TA_UPDATECP) {
+	      dc->w.CursPosX = XDPTOLP( dc, x );
+	      dc->w.CursPosY = YDPTOLP( dc, y );
+	  }
 	  break;
       case TA_CENTER:
-	  x -= info.width / 2;
+	  x -= xwidth / 2;
+	  y += ywidth / 2;
 	  break;
     }
 
     switch( dc->w.textAlign & (TA_TOP | TA_BOTTOM | TA_BASELINE) )
     {
       case TA_TOP:
-	  y += font->ascent;
+	  x -= pfo->lpX11Trans ? ascent * pfo->lpX11Trans->c /
+	    pfo->lpX11Trans->pixelsize : 0;
+	  y += pfo->lpX11Trans ? ascent * pfo->lpX11Trans->d /
+	    pfo->lpX11Trans->pixelsize : ascent;
 	  break;
       case TA_BOTTOM:
-	  y -= font->descent;
+	  x += pfo->lpX11Trans ? descent * pfo->lpX11Trans->c /
+	    pfo->lpX11Trans->pixelsize : 0;
+	  y -= pfo->lpX11Trans ? descent * pfo->lpX11Trans->d /
+	    pfo->lpX11Trans->pixelsize : descent;
 	  break;
       case TA_BASELINE:
 	  break;
@@ -168,16 +192,16 @@
               /* text is outside the rectangle */
             if (!(flags & ETO_OPAQUE) ||
                 (x < rect.left) ||
-                (x + info.width >= rect.right) ||
-                (y-font->ascent < rect.top) ||
-                (y+font->descent >= rect.bottom))
+                (x + width >= rect.right) ||
+                (y - ascent < rect.top) ||
+                (y + descent >= rect.bottom))
             {
                 TSXSetForeground( display, dc->u.x.gc, dc->w.backgroundPixel );
                 TSXFillRectangle( display, dc->u.x.drawable, dc->u.x.gc,
                                 dc->w.DCOrgX + x,
-                                dc->w.DCOrgY + y - font->ascent,
-                                info.width,
-                                font->ascent + font->descent );
+                                dc->w.DCOrgY + y - ascent,
+                                width,
+                                ascent + descent );
             }
         }
     }
@@ -187,7 +211,7 @@
     TSXSetForeground( display, dc->u.x.gc, dc->w.textPixel );
     if (!dc->w.charExtra && !dc->w.breakExtra && !lpDx)
     {
-      if (!pfo->lf.lfOrientation)  /* angled baseline? */
+      if(!rotated)
       {
         TSXDrawString( display, dc->u.x.drawable, dc->u.x.gc, 
                      dc->w.DCOrgX + x, dc->w.DCOrgY + y, str, count );
@@ -197,18 +221,15 @@
 	/* have to render character by character. */
 	double offset = 0.0;
 	int i;
-	/* tenths of degrees to radians */
-	double theta = M_PI*pfo->lf.lfOrientation/1800.;
-	/* components of pointsize matrix */
-	double xc = pfo->fi->lfd_decipoints*cos(theta)/10.;
-	double yc = pfo->fi->lfd_decipoints*sin(theta)/10.;
-	
+
 	for(i=0; i<count; i++) {
 	  int char_metric_offset = (unsigned char) str[i] 
 	    - font->min_char_or_byte2;
-	  int x_i = IROUND((double) (dc->w.DCOrgX + x) + offset*xc/1000. );
-	  int y_i = IROUND((double) (dc->w.DCOrgY + y) - offset*yc/1000. );
-	   
+	  int x_i = IROUND((double) (dc->w.DCOrgX + x) + offset *
+			   pfo->lpX11Trans->a / 1000.0 );
+	  int y_i = IROUND((double) (dc->w.DCOrgY + y) - offset *
+			   pfo->lpX11Trans->b / 1000.0 );
+
 	  TSXDrawString( display, dc->u.x.drawable, dc->u.x.gc,
 			 x_i, y_i, &str[i], 1);
 	  offset += (double) (font->per_char ?
@@ -285,7 +306,7 @@
 	long linePos, lineWidth;       
 
 	if (!TSXGetFontProperty( font, XA_UNDERLINE_POSITION, &linePos ))
-	    linePos = font->descent-1;
+	    linePos = descent - 1;
 	if (!TSXGetFontProperty( font, XA_UNDERLINE_THICKNESS, &lineWidth ))
 	    lineWidth = 0;
 	else if (lineWidth == 1) lineWidth = 0;
@@ -293,20 +314,20 @@
 			    LineSolid, CapRound, JoinBevel ); 
         TSXDrawLine( display, dc->u.x.drawable, dc->u.x.gc,
 		   dc->w.DCOrgX + x, dc->w.DCOrgY + y + linePos,
-		   dc->w.DCOrgX + x + info.width, dc->w.DCOrgY + y + linePos );
+		   dc->w.DCOrgX + x + width, dc->w.DCOrgY + y + linePos );
     }
     if (lfStrikeOut)
     {
 	long lineAscent, lineDescent;
 	if (!TSXGetFontProperty( font, XA_STRIKEOUT_ASCENT, &lineAscent ))
-	    lineAscent = font->ascent / 2;
+	    lineAscent = ascent / 2;
 	if (!TSXGetFontProperty( font, XA_STRIKEOUT_DESCENT, &lineDescent ))
 	    lineDescent = -lineAscent * 2 / 3;
 	TSXSetLineAttributes( display, dc->u.x.gc, lineAscent + lineDescent,
 			    LineSolid, CapRound, JoinBevel ); 
 	TSXDrawLine( display, dc->u.x.drawable, dc->u.x.gc,
 		   dc->w.DCOrgX + x, dc->w.DCOrgY + y - lineAscent,
-		   dc->w.DCOrgX + x + info.width, dc->w.DCOrgY + y - lineAscent );
+		   dc->w.DCOrgX + x + width, dc->w.DCOrgY + y - lineAscent );
     }
 
     if (flags & ETO_CLIPPED) 
@@ -316,3 +337,4 @@
     }
     return TRUE;
 }
+
diff --git a/graphics/x11drv/xfont.c b/graphics/x11drv/xfont.c
index 85762c6..edefaf7 100644
--- a/graphics/x11drv/xfont.c
+++ b/graphics/x11drv/xfont.c
@@ -87,7 +87,8 @@
 				     BALTIC_CHARSET	/* cp125-7 */
 				   }; 
 
-UINT16			XTextCaps = TC_OP_CHARACTER | TC_OP_STROKE | TC_CP_STROKE |
+UINT16			XTextCaps = TC_OP_CHARACTER | TC_OP_STROKE |
+TC_CP_STROKE | TC_CR_ANY |
 				    TC_SA_DOUBLE | TC_SA_INTEGER | TC_SA_CONTIN |
 			 	    TC_UA_ABLE | TC_SO_ABLE | TC_RA_ABLE;
 
@@ -122,6 +123,10 @@
 static void  XFONT_CheckFIList(fontResource*, fontInfo*, int subset_action);
 static void  XFONT_GrowFreeList(int start, int end);
 
+
+static Atom RAW_ASCENT;
+static Atom RAW_DESCENT;
+
 /***********************************************************************
  *           Helper macros from X distribution
  */
@@ -556,7 +561,8 @@
  * font info		- http://www.microsoft.com/kb/articles/q65/1/23.htm
  * Windows font metrics	- http://www.microsoft.com/kb/articles/q32/6/67.htm
  */
-static BOOL32 XFONT_GetLeading( LPIFONTINFO16 pFI, XFontStruct* x_fs, INT32* pIL, INT32* pEL )
+static BOOL32 XFONT_GetLeading( LPIFONTINFO16 pFI, XFontStruct* x_fs, INT32*
+       pIL, INT32* pEL, XFONTTRANS *XFT )
 {
     unsigned long height;
     unsigned min = (unsigned char)pFI->dfFirstChar;
@@ -564,11 +570,22 @@
     BOOL32 bHaveCapHeight = (pFI->dfCharSet == ANSI_CHARSET && 'X' >= min && 'X' <= max );
 
     if( pEL ) *pEL = 0;
-    if( TSXGetFontProperty(x_fs, XA_CAP_HEIGHT, &height) == False )
+
+    if(XFT) {
+        Atom RAW_CAP_HEIGHT = TSXInternAtom(display, "RAW_CAP_HEIGHT", TRUE);
+	if(TSXGetFontProperty(x_fs, RAW_CAP_HEIGHT, &height))
+	    *pIL = XFT->ascent - 
+                            (INT32)(hypotf(XFT->a, XFT->b) / 1000.0 * height);
+	else
+	    *pIL = 0;
+	return bHaveCapHeight && x_fs->per_char;
+    }
+       
+    if( TSXGetFontProperty(x_fs, XA_CAP_HEIGHT, &height) == FALSE )
     {
-	if( x_fs->per_char )
+        if( x_fs->per_char )
 	    if( bHaveCapHeight )
-		height = x_fs->per_char['X' - min].ascent;
+		    height = x_fs->per_char['X' - min].ascent;
 	    else
 		if (x_fs->ascent >= x_fs->max_bounds.ascent)
 		    height = x_fs->max_bounds.ascent;
@@ -586,7 +603,8 @@
     return (bHaveCapHeight && x_fs->per_char);
 }
 
-static INT32 XFONT_GetAvgCharWidth( LPIFONTINFO16 pFI, XFontStruct* x_fs)
+static INT32 XFONT_GetAvgCharWidth( LPIFONTINFO16 pFI, XFontStruct* x_fs,
+				    XFONTTRANS *XFT)
 {
     unsigned min = (unsigned char)pFI->dfFirstChar;
     unsigned max = (unsigned char)pFI->dfLastChar;
@@ -597,7 +615,11 @@
 	for( j = 0, width = 0, chars = 0, max -= min; j <= max; j++ )
             if( !CI_NONEXISTCHAR(x_fs->per_char + j) )
             {
-                width += x_fs->per_char[j].width;
+	        if(!XFT)
+		    width += x_fs->per_char[j].width;
+		else
+		    width += x_fs->per_char[j].attributes * 
+		      XFT->pixelsize / 1000.0;
                 chars++;
             }
 	return (width / chars);
@@ -606,6 +628,28 @@
     return x_fs->min_bounds.width;
 }
 
+static INT32 XFONT_GetMaxCharWidth(fontObject *pfo)
+{
+    unsigned min = (unsigned char)pfo->fs->min_char_or_byte2;
+    unsigned max = (unsigned char)pfo->fs->max_char_or_byte2;
+
+    if(!pfo->lpX11Trans)
+        return abs(pfo->fs->max_bounds.width);
+
+    if( pfo->fs->per_char )
+    {
+	int  maxwidth, j;
+	for( j = 0, maxwidth = 0, max -= min; j <= max; j++ )
+            if( !CI_NONEXISTCHAR(pfo->fs->per_char + j) )
+	        if(maxwidth < pfo->fs->per_char[j].attributes)
+		    maxwidth = pfo->fs->per_char[j].attributes;
+
+	maxwidth *= pfo->lpX11Trans->pixelsize / 1000.0;
+	return maxwidth;
+    }
+    return pfo->foAvgCharWidth;
+}
+
 /***********************************************************************
  *              XFONT_SetFontMetric
  *
@@ -626,10 +670,10 @@
     fi->df.dfPixWidth = (xfs->per_char) ? 0 : xfs->min_bounds.width;
     fi->df.dfMaxWidth = (INT16)abs(xfs->max_bounds.width);
 
-    if( XFONT_GetLeading( &fi->df, xfs, &il, &el ) )
+    if( XFONT_GetLeading( &fi->df, xfs, &il, &el, NULL ) )
         fi->df.dfAvgWidth = (INT16)xfs->per_char['X' - min].width;
     else
-        fi->df.dfAvgWidth = (INT16)XFONT_GetAvgCharWidth( &fi->df, xfs);
+        fi->df.dfAvgWidth = (INT16)XFONT_GetAvgCharWidth( &fi->df, xfs, NULL);
 
     fi->df.dfInternalLeading = (INT16)il;
     fi->df.dfExternalLeading = (INT16)el;
@@ -659,12 +703,17 @@
 {
     LPIFONTINFO16 pdf = &pfo->fi->df;
 
-    pTM->tmAscent = pfo->fs->ascent;
-    pTM->tmDescent = pfo->fs->descent;
+    if( ! pfo->lpX11Trans ) {
+      pTM->tmAscent = pfo->fs->ascent;
+      pTM->tmDescent = pfo->fs->descent;
+    } else {
+      pTM->tmAscent = pfo->lpX11Trans->ascent;
+      pTM->tmDescent = pfo->lpX11Trans->descent;
+    }
     pTM->tmHeight = pTM->tmAscent + pTM->tmDescent;
 
     pTM->tmAveCharWidth = pfo->foAvgCharWidth;
-    pTM->tmMaxCharWidth = abs(pfo->fs->max_bounds.width);
+    pTM->tmMaxCharWidth = pfo->foMaxCharWidth;
 
     pTM->tmInternalLeading = pfo->foInternalLeading;
     pTM->tmExternalLeading = pdf->dfExternalLeading;
@@ -1504,6 +1553,10 @@
   /* update text caps parameter */
 
   pDevCaps->textCaps = XTextCaps;
+
+  RAW_ASCENT = TSXInternAtom(display, "RAW_ASCENT", TRUE);
+  RAW_DESCENT = TSXInternAtom(display, "RAW_DESCENT", TRUE);
+  
   return TRUE;
 }
 
@@ -1886,6 +1939,9 @@
 	    else fontMRU = (INT16)fontCache[j].lru;
 
 	    /* FIXME: lpXForm, lpPixmap */
+	    if(fontCache[j].lpX11Trans)
+	        HeapFree( SystemHeap, 0, fontCache[j].lpX11Trans );
+
 	    TSXFreeFont( display, fontCache[j].fs );
 
 	    memset( fontCache + j, 0, sizeof(fontObject) );
@@ -1927,6 +1983,50 @@
     return -1;
 }
 
+/**********************************************************************
+ *	XFONT_SetX11Trans
+ */
+static BOOL32 XFONT_SetX11Trans( fontObject *pfo )
+{
+  char *fontName;
+  Atom nameAtom;
+  int i;
+  char *cp, *start;
+
+  XGetFontProperty( pfo->fs, XA_FONT, &nameAtom );
+  fontName = XGetAtomName( display, nameAtom );
+  for(i = 0, cp = fontName; i < 7; i++) {
+    cp = strchr(cp, '-');
+    cp++;
+  }
+  if(*cp != '[') {
+    XFree(fontName);
+    return FALSE;
+  }
+  start = cp;
+  while((cp = strchr(cp, '~')))
+    *cp = '-';
+
+#define PX pfo->lpX11Trans
+
+  sscanf(start, "[%f%f%f%f]", &PX->a, &PX->b, &PX->c, &PX->d);
+  XFree(fontName);
+
+  XGetFontProperty( pfo->fs, RAW_ASCENT, &PX->RAW_ASCENT );
+  XGetFontProperty( pfo->fs, RAW_DESCENT, &PX->RAW_DESCENT );
+
+  PX->pixelsize = hypotf(PX->a, PX->b);
+  PX->ascent = PX->pixelsize / 1000.0 * PX->RAW_ASCENT;
+  PX->descent = PX->pixelsize / 1000.0 * PX->RAW_DESCENT;
+
+  TRACE(font, "[%f %f %f %f] RA = %ld RD = %ld\n", pfo->lpX11Trans->a, 
+	pfo->lpX11Trans->b, pfo->lpX11Trans->c, pfo->lpX11Trans->d,
+	pfo->lpX11Trans->RAW_ASCENT, pfo->lpX11Trans->RAW_DESCENT);
+
+#undef PX
+  return TRUE;
+}
+
 /***********************************************************************
  *           X Device Font Objects
  */
@@ -1971,10 +2071,30 @@
 		    if( (pfo->fs = TSXLoadQueryFont( display, lpLFD )) ) break;
 		} while( uRelaxLevel );
 
-		if( XFONT_GetLeading( &pfo->fi->df, pfo->fs, &i, NULL ) )
-		    pfo->foAvgCharWidth = (INT16)pfo->fs->per_char['X' - pfo->fs->min_char_or_byte2].width;
+
+		if(pfo->lf.lfEscapement != 0) {
+		    pfo->lpX11Trans = HeapAlloc(SystemHeap, 0,
+						sizeof(XFONTTRANS));
+		    if(!XFONT_SetX11Trans( pfo )) {
+		        HeapFree(SystemHeap, 0, pfo->lpX11Trans);
+			pfo->lpX11Trans = NULL;
+		    }
+		}
+
+		if( XFONT_GetLeading( &pfo->fi->df, pfo->fs, &i, NULL, 
+				      pfo->lpX11Trans ) )
+
+		    if(!pfo->lpX11Trans)
+		        pfo->foAvgCharWidth =
+	      (INT16)pfo->fs->per_char['X' - pfo->fs->min_char_or_byte2].width;
+		    else
+		        pfo->foAvgCharWidth = 
+	 (INT16)pfo->fs->per_char['X' - pfo->fs->min_char_or_byte2].attributes
+			  * pfo->lpX11Trans->pixelsize / 1000.0;
 		else
-		    pfo->foAvgCharWidth = (INT16)XFONT_GetAvgCharWidth( &pfo->fi->df, pfo->fs );
+		    pfo->foAvgCharWidth = (INT16)XFONT_GetAvgCharWidth(
+			             &pfo->fi->df, pfo->fs, pfo->lpX11Trans );
+		pfo->foMaxCharWidth = (INT16)XFONT_GetMaxCharWidth(pfo);
 		pfo->foInternalLeading = (INT16)i;
 
 		/* FIXME: If we've got a soft font or
@@ -2135,17 +2255,34 @@
 BOOL32 X11DRV_GetTextExtentPoint( DC *dc, LPCSTR str, INT32 count,
                                   LPSIZE32 size )
 {
-    XFontStruct* pfs = XFONT_GetFontStruct( dc->u.x.font );
-    if( pfs )
-    {
-	int dir, ascent, descent;
-	XCharStruct info;
+    fontObject* pfo = XFONT_GetFontObject( dc->u.x.font );
+    if( pfo ) {
+        if( !pfo->lpX11Trans ) {
+	    int dir, ascent, descent;
+	    XCharStruct info;
 
-	TSXTextExtents( pfs, str, count, &dir, &ascent, &descent, &info );
-	size->cx = abs((info.width + dc->w.breakRem + count * dc->w.charExtra)
-						* dc->wndExtX / dc->vportExtX);
-	size->cy = abs((pfs->ascent + pfs->descent) * dc->wndExtY / dc->vportExtY);
+	    TSXTextExtents( pfo->fs, str, count, &dir, &ascent, &descent, &info );
+	    size->cx = abs((info.width + dc->w.breakRem + count * 
+			    dc->w.charExtra) * dc->wndExtX / dc->vportExtX);
+	    size->cy = abs((pfo->fs->ascent + pfo->fs->descent) * 
+			   dc->wndExtY / dc->vportExtY);
+	} else {
 
+	    INT32 i;
+	    float x = 0.0, y = 0.0;
+	    for(i = 0; i < count; i++) {
+	        x += pfo->fs->per_char ? 
+	   pfo->fs->per_char[str[i] - pfo->fs->min_char_or_byte2].attributes : 
+	   pfo->fs->min_bounds.attributes;
+	    }
+	    y = pfo->lpX11Trans->RAW_ASCENT + pfo->lpX11Trans->RAW_DESCENT;
+	    TRACE(font, "x = %f y = %f\n", x, y);
+	    x *= pfo->lpX11Trans->pixelsize / 1000.0;
+	    y *= pfo->lpX11Trans->pixelsize / 1000.0; 
+	    size->cx = fabsf((x + dc->w.breakRem + count * dc->w.charExtra) *
+			     dc->wndExtX / dc->vportExtX);
+	    size->cy = fabsf(y * dc->wndExtY / dc->vportExtY);
+	}
 	return TRUE;
     }
     return FALSE;
@@ -2174,30 +2311,40 @@
 BOOL32 X11DRV_GetCharWidth( DC *dc, UINT32 firstChar, UINT32 lastChar,
                             LPINT32 buffer )
 {
-    XFontStruct* xfs = XFONT_GetFontStruct( dc->u.x.font );
+    fontObject* pfo = XFONT_GetFontObject( dc->u.x.font );
 
-    if( xfs )
+    if( pfo )
     {
 	int i;
 
-	if (xfs->per_char == NULL)
+	if (pfo->fs->per_char == NULL)
 	    for (i = firstChar; i <= lastChar; i++)
-		*buffer++ = xfs->min_bounds.width;
+  	        if(pfo->lpX11Trans)
+		    *buffer++ = pfo->fs->min_bounds.attributes *
+		      pfo->lpX11Trans->pixelsize / 1000.0;
+		else
+		    *buffer++ = pfo->fs->min_bounds.width;
 	else
 	{
 	    XCharStruct *cs, *def;
 	    static XCharStruct	__null_char = { 0, 0, 0, 0, 0, 0 };
 
-	    CI_GET_CHAR_INFO(xfs, xfs->default_char, &__null_char, def);
+	    CI_GET_CHAR_INFO(pfo->fs, pfo->fs->default_char, &__null_char,
+			     def);
 
 	    for (i = firstChar; i <= lastChar; i++)
 	    {
-		if (i >= xfs->min_char_or_byte2 && i <= xfs->max_char_or_byte2)
+		if (i >= pfo->fs->min_char_or_byte2 && 
+		    i <= pfo->fs->max_char_or_byte2)
 		{
-		    cs = &xfs->per_char[(i - xfs->min_char_or_byte2)]; 
+		    cs = &pfo->fs->per_char[(i - pfo->fs->min_char_or_byte2)]; 
 		    if (CI_NONEXISTCHAR(cs)) cs = def; 
   		} else cs = def;
-		*buffer++ = MAX(cs->width, 0 );
+		if(pfo->lpX11Trans)
+		    *buffer++ = MAX(cs->attributes, 0) *
+		      pfo->lpX11Trans->pixelsize / 1000.0;
+		else
+		    *buffer++ = MAX(cs->width, 0 );
 	    }
 	}
 
diff --git a/if1632/builtin.c b/if1632/builtin.c
index 40c3652..b300732 100644
--- a/if1632/builtin.c
+++ b/if1632/builtin.c
@@ -18,6 +18,8 @@
 #include "stackframe.h"
 #include "user.h"
 #include "process.h"
+#include "snoop.h"
+#include "task.h"
 #include "debug.h"
 
 /* Built-in modules descriptors */
@@ -114,8 +116,8 @@
     { &TOOLHELP_Descriptor, 0 },
     { &TYPELIB_Descriptor,  DLL_FLAG_NOT_USED },
     { &VER_Descriptor,      0 },
-    { &W32SYS_Descriptor,   0 },
-    { &WIN32S16_Descriptor, 0 },
+    { &W32SYS_Descriptor,   DLL_FLAG_NOT_USED },
+    { &WIN32S16_Descriptor, DLL_FLAG_NOT_USED },
     { &WIN87EM_Descriptor,  DLL_FLAG_NOT_USED },
     { &WINASPI_Descriptor,  0 },
     { &WINEPS_Descriptor,   DLL_FLAG_ALWAYS_USED },
@@ -217,6 +219,11 @@
     GET_CS(cs); GET_DS(ds);
     NE_SetEntryPoint( hModule, 454, cs );
     NE_SetEntryPoint( hModule, 455, ds );
+
+    /* Initialize KERNEL.THHOOK */
+
+    TASK_InstallTHHook((THHOOK *)PTR_SEG_TO_LIN( 
+                                  (SEGPTR)NE_GetEntryPoint( hModule, 332 )));
   
     /* Initialize the real-mode selector entry points */
 
@@ -248,6 +255,8 @@
         INT_SetHandler( vector, proc );
     }
 
+    SNOOP16_Init();
+
     return TRUE;
 }
 
diff --git a/if1632/gdi.spec b/if1632/gdi.spec
index 34322b4..d0a7ef1 100644
--- a/if1632/gdi.spec
+++ b/if1632/gdi.spec
@@ -327,7 +327,7 @@
 499 stub GetEnhMetafileHeader
 501 stub GetEnhMetafilePaletteEntries
 502 pascal16 PolyBezier(word ptr word) PolyBezier16
-503 stub PolyBezierTo
+503 pascal16 PolyBezierTo(word ptr word) PolyBezierTo16
 504 stub PlayEnhMetafileRecord
 505 stub SetEnhMetafileBits
 506 stub SetMetaRgn
diff --git a/if1632/kernel.spec b/if1632/kernel.spec
index a57c987..918f129 100644
--- a/if1632/kernel.spec
+++ b/if1632/kernel.spec
@@ -253,7 +253,7 @@
 327 stub KERNEL_327
 328 stub _DebugOutput
 329 pascal16 K329(str word) DebugFillBuffer
-#332 stub THHOOK
+332 long THHOOK(0 0 0 0 0 0 0 0)
 334 pascal16 IsBadReadPtr(segptr word) IsBadReadPtr16
 335 pascal16 IsBadWritePtr(segptr word) IsBadWritePtr16
 336 pascal16 IsBadCodePtr(segptr) IsBadCodePtr16
@@ -318,7 +318,7 @@
 471 pascal KERNEL_471() _KERNEL_471
 472 register KERNEL_472() _KERNEL_472
 473 stub KERNEL_473
-475 return KERNEL_475 0 0
+475 register KERNEL_475() _KERNEL_475
 480 stub KERNEL_480
 481 stub KERNEL_481
 482 pascal LoadLibrary32(str) LoadLibrary32A
diff --git a/if1632/mmsystem.spec b/if1632/mmsystem.spec
index 4b118bf..d13ae12 100644
--- a/if1632/mmsystem.spec
+++ b/if1632/mmsystem.spec
@@ -134,7 +134,7 @@
 900    pascal  mmTaskCreate(ptr long long) mmTaskCreate16
 902    stub    MMTASKBLOCK
 903    pascal  mmTaskSignal(word) mmTaskSignal16
-904    stub    MMGETCURRENTTASK
+904    pascal  mmGetCurrentTask() WIN16_GetCurrentTask #just the same
 905    stub    MMTASKYIELD
 1100   pascal  DRVOPEN(str str long) DrvOpen
 1101   pascal  DRVCLOSE(word long long) DrvClose
diff --git a/if1632/shell.spec b/if1632/shell.spec
index 2d9b130..f8a99b2 100644
--- a/if1632/shell.spec
+++ b/if1632/shell.spec
@@ -22,8 +22,8 @@
  38 pascal   FindEnvironmentString(ptr) FindEnvironmentString
  39 pascal16 InternalExtractIcon(word ptr s_word word) InternalExtractIcon
  40 stub ExtractIconEx
- 98 stub SHL3216_THUNKDATA16
- 99 stub SHL1632_THUNKDATA16
+# 98 stub SHL3216_THUNKDATA16
+# 99 stub SHL1632_THUNKDATA16
 
 #100   4  0550  HERETHARBETYGARS exported, shared data
 #101   8  010e  FINDEXEDLGPROC exported, shared data
diff --git a/if1632/snoop.c b/if1632/snoop.c
index e224662..3935901 100644
--- a/if1632/snoop.c
+++ b/if1632/snoop.c
@@ -186,6 +186,16 @@
 		fun->name = HEAP_strdupA(SystemHeap,0,name);
 	else
 		fun->name = HEAP_strdupA(SystemHeap,0,"");
+	/* more magic. do not try to snoop thunk data entries (MMSYSTEM) */
+	if (strchr(fun->name,'_')) {
+		char *s=strchr(fun->name,'_');
+
+		if (!strncasecmp(s,"_thunkdata",10)) {
+			HeapFree(SystemHeap,0,fun->name);
+			fun->name = NULL;
+			return origfun;
+		}
+	}
 	fun->lcall 	= 0x9a;
 	fun->snr	= MAKELONG(0,xsnr);
 	fun->origfun	= origfun;
@@ -314,3 +324,9 @@
 	return origfun;
 }
 #endif	/* !__i386__ */
+
+void
+SNOOP16_Init() {
+	fnSNOOP16_GetProcAddress16=SNOOP16_GetProcAddress16;
+	fnSNOOP16_RegisterDLL=SNOOP16_RegisterDLL;
+}
diff --git a/if1632/wprocs.spec b/if1632/wprocs.spec
index 965b6bb..3695a74 100644
--- a/if1632/wprocs.spec
+++ b/if1632/wprocs.spec
@@ -286,3 +286,4 @@
 #415 register VXD_Printer() VXD_Printer
 423 register VXD_Shell() VXD_Shell
 433 register VXD_PageFile() VXD_PageFile
+445 register VXD_Win32s() VXD_Win32s
diff --git a/include/bitmap.h b/include/bitmap.h
index a9e8c33..5993b1a 100644
--- a/include/bitmap.h
+++ b/include/bitmap.h
@@ -22,6 +22,24 @@
 
 #endif
 
+  /* Additional info for DIB section objects */
+typedef struct
+{
+    /* Windows DIB section */
+    DIBSECTION  dibSection;
+
+    /* Mapping status */
+    enum { DIB_NoHandler, DIB_InSync, DIB_AppMod, DIB_GdiMod } status;
+
+    /* Color map info */
+    int         nColorMap;
+    int        *colorMap;
+
+    /* Cached XImage */
+    XImage     *image;
+
+} DIBSECTIONOBJ;
+
   /* GDI logical bitmap object */
 typedef struct
 {
@@ -31,11 +49,7 @@
     SIZE16      size;   /* For SetBitmapDimension() */
 
     /* For device-independent bitmaps: */
-    DIBSECTION *dibSection;
-    RGBQUAD    *colorMap;
-    int         nColorMap;
-    /* DIBSECTION mapping status */
-    enum { DIB_NoHandler, DIB_InSync, DIB_AppMod, DIB_GdiMod } status;
+    DIBSECTIONOBJ *dib;
 
 } BITMAPOBJ;
 
@@ -71,7 +85,8 @@
 extern int DIB_GetXImageWidthBytes( int width, int depth );
 extern int DIB_BitmapInfoSize( BITMAPINFO * info, WORD coloruse );
 extern void DIB_UpdateDIBSection( DC *dc, BOOL32 toDIB );
-
+extern void DIB_DeleteDIBSection( BITMAPOBJ *bmp );
+extern void DIB_SelectDIBSection( DC *dc, BITMAPOBJ *bmp );
 
   /* objects/oembitmap.c */
 extern BOOL32 OBM_Init(void);
diff --git a/include/commctrl.h b/include/commctrl.h
index 523cca2..32a5372 100644
--- a/include/commctrl.h
+++ b/include/commctrl.h
@@ -7,17 +7,16 @@
 
 #include "windows.h"
 
+BOOL32 WINAPI ShowHideMenuCtl (HWND32, UINT32, LPINT32);
 VOID WINAPI GetEffectiveClientRect (HWND32, LPRECT32, LPINT32);
-
-
-void WINAPI InitCommonControls(void);
+VOID WINAPI InitCommonControls (VOID);
 
 typedef struct tagINITCOMMONCONTROLSEX {
     DWORD dwSize;
     DWORD dwICC;
 } INITCOMMONCONTROLSEX, *LPINITCOMMONCONTROLSEX;
 
-BOOL32 WINAPI InitCommonControlsEx(LPINITCOMMONCONTROLSEX);
+BOOL32 WINAPI InitCommonControlsEx (LPINITCOMMONCONTROLSEX);
 
 #define ICC_LISTVIEW_CLASSES   0x00000001  /* listview, header */
 #define ICC_TREEVIEW_CLASSES   0x00000002  /* treeview, tooltips */
@@ -52,9 +51,12 @@
 
 
 /* common control shared messages */
-#define CCM_FIRST           0x2000
+#define CCM_FIRST            0x2000
 
-#define CCM_SETBKCOLOR      (CCM_FIRST+1)     /* lParam = bkColor */
+#define CCM_SETBKCOLOR       (CCM_FIRST+1)     /* lParam = bkColor */
+
+#define CCM_SETUNICODEFORMAT (CCM_FIRST+5)
+#define CCM_GETUNICODEFORMAT (CCM_FIRST+6)
 
 
 /* common notification codes */
@@ -704,4 +706,184 @@
 CreateMappedBitmap (HINSTANCE32, INT32, UINT32, LPCOLORMAP, INT32); 
 
 
+/* Tool tips */
+
+#define TOOLTIPS_CLASS16         "tooltips_class"
+#define TOOLTIPS_CLASS32W       L"tooltips_class32"
+#define TOOLTIPS_CLASS32A        "tooltips_class32"
+#define TOOLTIPS_CLASS          WINELIB_NAME_AW(TOOLTIPS_CLASS)
+ 
+#define TTS_ALWAYSTIP           0x01
+#define TTS_NOPREFIX            0x02
+ 
+#define TTF_IDISHWND            0x0001
+#define TTF_CENTERTIP           0x0002
+#define TTF_RTLREADING          0x0004
+#define TTF_SUBCLASS            0x0010
+#define TTF_TRACK               0x0020
+#define TTF_ABSOLUTE            0x0080
+#define TTF_TRANSPARENT         0x0100
+#define TTF_DI_SETITEM          0x8000  /* valid only on the TTN_NEEDTEXT callback */
+
+
+#define TTDT_AUTOMATIC          0
+#define TTDT_RESHOW             1
+#define TTDT_AUTOPOP            2
+#define TTDT_INITIAL            3
+
+
+#define TTM_ACTIVATE            (WM_USER+1)
+#define TTM_SETDELAYTIME        (WM_USER+3)
+#define TTM_ADDTOOL32A          (WM_USER+4)
+#define TTM_ADDTOOL32W          (WM_USER+50)
+#define TTM_ADDTOOL WINELIB_NAME_AW(TTM_ADDTOOL)
+#define TTM_DELTOOL32A          (WM_USER+5)
+#define TTM_DELTOOL32W          (WM_USER+51)
+#define TTM_DELTOOL WINELIB_NAME_AW(TTM_DELTOOL)
+#define TTM_NEWTOOLRECT32A      (WM_USER+6)
+#define TTM_NEWTOOLRECT32W      (WM_USER+52)
+#define TTM_NEWTOOLRECT WINELIB_NAME_AW(TTM_NEWTOOLRECT)
+#define TTM_RELAYEVENT          (WM_USER+7)
+#define TTM_GETTOOLINFO32A      (WM_USER+8)
+#define TTM_GETTOOLINFO32W      (WM_USER+53)
+#define TTM_GETTOOLINFO WINELIB_NAME_AW(TTM_GETTOOLINFO)
+#define TTM_SETTOOLINFO32A      (WM_USER+9)
+#define TTM_SETTOOLINFO32W      (WM_USER+54)
+#define TTM_SETTOOLINFO WINELIB_NAME_AW(TTM_SETTOOLINFO)
+#define TTM_HITTEST32A          (WM_USER+10)
+#define TTM_HITTEST32W          (WM_USER+55)
+#define TTM_HITTEST WINELIB_NAME_AW(TTM_HITTEST)
+#define TTM_GETTEXT32A          (WM_USER+11)
+#define TTM_GETTEXT32W          (WM_USER+56)
+#define TTM_GETTEXT WINELIB_NAME_AW(TTM_GETTEXT)
+#define TTM_UPDATETIPTEXT32A    (WM_USER+12)
+#define TTM_UPDATETIPTEXT32W    (WM_USER+57)
+#define TTM_UPDATETIPTEXT WINELIB_NAME_AW(TTM_UPDATETIPTEXT)
+#define TTM_GETTOOLCOUNT        (WM_USER+13)
+#define TTM_ENUMTOOLS32A        (WM_USER+14)
+#define TTM_ENUMTOOLS32W        (WM_USER+58)
+#define TTM_ENUMTOOLS WINELIB_NAME_AW(TTM_ENUMTOOLS)
+#define TTM_GETCURRENTTOOL32A   (WM_USER+15)
+#define TTM_GETCURRENTTOOL32W   (WM_USER+59)
+#define TTM_GETCURRENTTOOL WINELIB_NAME_AW(TTM_GETCURRENTTOOL)
+#define TTM_WINDOWFROMPOINT     (WM_USER+16)
+#define TTM_TRACKACTIVATE       (WM_USER+17)
+#define TTM_TRACKPOSITION       (WM_USER+18)
+#define TTM_SETTIPBKCOLOR       (WM_USER+19)
+#define TTM_SETTIPTEXTCOLOR     (WM_USER+20)
+#define TTM_GETDELAYTIME        (WM_USER+21)
+#define TTM_GETTIPBKCOLOR       (WM_USER+22)
+#define TTM_GETTIPTEXTCOLOR     (WM_USER+23)
+#define TTM_SETMAXTIPWIDTH      (WM_USER+24)
+#define TTM_GETMAXTIPWIDTH      (WM_USER+25)
+#define TTM_SETMARGIN           (WM_USER+26)
+#define TTM_GETMARGIN           (WM_USER+27)
+#define TTM_POP                 (WM_USER+28)
+#define TTM_UPDATE              (WM_USER+29)
+
+typedef struct tagTOOLINFOA {
+    UINT32 cbSize;
+    UINT32 uFlags;
+    HWND32 hwnd;
+    UINT32 uId;
+    RECT32 rect;
+    HINSTANCE32 hinst;
+    LPSTR lpszText;
+    LPARAM lParam;
+} TOOLINFOA, *PTOOLINFOA, *LPTOOLINFOA;
+
+typedef struct tagTOOLINFOW {
+    UINT32 cbSize;
+    UINT32 uFlags;
+    HWND32 hwnd;
+    UINT32 uId;
+    RECT32 rect;
+    HINSTANCE32 hinst;
+    LPWSTR lpszText;
+    LPARAM lParam;
+} TOOLINFOW, *PTOOLINFOW, *LPTOOLINFOW;
+
+
+
+
+
+/* Rebar control */
+
+#define REBARCLASSNAME16        "ReBarWindow"
+#define REBARCLASSNAME32A       "ReBarWindow32"
+#define REBARCLASSNAME32W       L"ReBarWindow32"
+#define REBARCLASSNAME  WINELIB_NAME_AW(REBARCLASSNAME)
+
+
+/* Trackbar control */
+
+#define TRACKBAR_CLASS16        "msctls_trackbar"
+#define TRACKBAR_CLASS32A       "msctls_trackbar32"
+#define TRACKBAR_CLASS32W       L"msctls_trackbar32"
+#define TRACKBAR_CLASS  WINELIB_NAME_AW(TRACKBAR_CLASS)
+
+#define TBS_AUTOTICKS           0x0001
+#define TBS_VERT                0x0002
+#define TBS_HORZ                0x0000
+#define TBS_TOP                 0x0004
+#define TBS_BOTTOM              0x0000
+#define TBS_LEFT                0x0004
+#define TBS_RIGHT               0x0000
+#define TBS_BOTH                0x0008
+#define TBS_NOTICKS             0x0010
+#define TBS_ENABLESELRANGE      0x0020
+#define TBS_FIXEDLENGTH         0x0040
+#define TBS_NOTHUMB             0x0080
+#define TBS_TOOLTIPS            0x0100
+
+#define TBM_GETPOS              (WM_USER)
+#define TBM_GETRANGEMIN         (WM_USER+1)
+#define TBM_GETRANGEMAX         (WM_USER+2)
+#define TBM_GETTIC              (WM_USER+3)
+#define TBM_SETTIC              (WM_USER+4)
+#define TBM_SETPOS              (WM_USER+5)
+
+#define TBM_GETSELSTART         (WM_USER+17)
+#define TBM_GETSELEND           (WM_USER+18)
+#define TBM_CLEARSEL            (WM_USER+19)
+#define TBM_SETTICFREQ          (WM_USER+20)
+#define TBM_SETPAGESIZE         (WM_USER+21)
+#define TBM_GETPAGESIZE         (WM_USER+22)
+#define TBM_SETLINESIZE         (WM_USER+23)
+#define TBM_GETLINESIZE         (WM_USER+24)
+#define TBM_GETTHUMBRECT        (WM_USER+25)
+#define TBM_GETCHANNELRECT      (WM_USER+26)
+#define TBM_SETTHUMBLENGTH      (WM_USER+27)
+#define TBM_GETTHUMBLENGTH      (WM_USER+28)
+
+
+/* Pager control */
+
+#define WC_PAGESCROLLER32A      "SysPager"
+#define WC_PAGESCROLLER32W      L"SysPager"
+#define WC_PAGESCROLLER  WINELIB_NAME_AW(WC_PAGESCROLLER)
+
+
+/* Treeview control */
+
+#define WC_TREEVIEW32A          "SysTreeView32"
+#define WC_TREEVIEW32W          L"SysTreeView32"
+#define WC_TREEVIEW  WINELIB_NAME_AW(WC_TREEVIEW)
+
+#define TV_FIRST      0x1100
+
+
+/* Listview control */
+
+#define WC_LISTVIEW32A          "SysListView32"
+#define WC_LISTVIEW32W          L"SysListView32"
+#define WC_LISTVIEW  WINELIB_NAME_AW(WC_LISTVIEW)
+
+#define LVM_FIRST               0x1000
+
+#define LVM_SETBKCOLOR          (LVM_FIRST+1)
+#define LVM_SETIMAGELIST        (LVM_FIRST+3)
+
+
+
 #endif  /* __WINE_COMMCTRL_H */
diff --git a/include/ddraw.h b/include/ddraw.h
index 04d49c5..cc0818e 100644
--- a/include/ddraw.h
+++ b/include/ddraw.h
@@ -2,6 +2,9 @@
 #define __WINE_DDRAW_H
 
 #include "ts_xlib.h"
+#ifdef HAVE_LIBXXSHM
+#include "ts_xshm.h"
+#endif
 
 #ifndef	DIRECTDRAW_VERSION
 #define	DIRECTDRAW_VERSION	0x0500
@@ -869,21 +872,34 @@
     STDMETHOD(WaitForVerticalBlank)(THIS_ DWORD, HANDLE32 ) PURE;
 } *LPDIRECTDRAW_VTABLE,IDirectDraw_VTable;
 
-struct _directdrawdata {
+struct _common_directdrawdata {
     DWORD			depth;
-    DWORD			vp_width,vp_height; /* viewport dimension */
     DWORD			height,width;	/* SetDisplayMode */
-    DWORD			fb_width,fb_height,fb_banksize,fb_memsize;
     HWND32			mainwindow;
+};
+
+struct _dga_directdrawdata {
+    DWORD			fb_width,fb_height,fb_banksize,fb_memsize;
     void			*fb_addr;
     unsigned int		vpmask;
 };
 
+struct _xlib_directdrawdata {
+    Window		drawable;
+    /* are these needed for anything? (draw_surf is the active surface)
+       IDirectDrawSurface	*surfs;
+       DWORD		num_surfs, alloc_surfs, draw_surf; */
+};
 
 struct IDirectDraw {
 	LPDIRECTDRAW_VTABLE	lpvtbl;
 	DWORD			ref;
-	struct _directdrawdata	d;
+	struct _common_directdrawdata d;
+	union {
+		struct _xlib_directdrawdata xlib;
+		struct _xlib_directdrawdata xshm;
+		struct _dga_directdrawdata  dga;
+	} e;
 };
 #undef THIS
 
@@ -932,19 +948,41 @@
 /* MUST HAVE THE SAME LAYOUT AS struct IDirectDraw */
 
 struct IDirectDraw2 {
-    LPDIRECTDRAW2_VTABLE	lpvtbl;
-    DWORD			ref;
-    struct _directdrawdata	d;
+	LPDIRECTDRAW2_VTABLE	lpvtbl;
+	DWORD			ref;
+	struct _common_directdrawdata	d;
+	union {
+		struct _xlib_directdrawdata xlib;
+		/* only different in image create&put */
+		struct _xlib_directdrawdata xshm;
+		struct _dga_directdrawdata dga;
+	} e;
 };
 #undef THIS
 
 #define THIS LPDIRECTDRAWSURFACE this
-struct _directdrawsurface {
-    LPVOID		surface;
+struct _common_directdrawsurface {
     LPDIRECTDRAWPALETTE	palette;
-    DWORD		fb_height,lpitch,width,height;
     LPDIRECTDRAW	ddraw;
     LPDIRECTDRAWSURFACE	backbuffer;
+    LPVOID		surface;
+    DWORD		lpitch,width,height;
+};
+
+struct _dga_directdrawsurface {
+    DWORD		fb_height;
+};
+
+struct _xshm_directdrawsurface {
+    XImage		*image;
+    BOOL32		surface_is_image_data;
+#ifdef HAVE_LIBXXSHM
+    XShmSegmentInfo	shminfo;
+#endif
+};
+struct _xlib_directdrawsurface {
+    XImage		*image;
+    BOOL32		surface_is_image_data;
 };
 
 typedef struct IDirectDrawSurface_VTable {
@@ -990,7 +1028,12 @@
 struct IDirectDrawSurface {
     LPDIRECTDRAWSURFACE_VTABLE	lpvtbl;
     DWORD			ref;
-    struct _directdrawsurface	s;
+    struct _common_directdrawsurface	s;
+    union {
+	struct _dga_directdrawsurface	dga;
+	struct _xshm_directdrawsurface	xshm;
+	struct _xlib_directdrawsurface	xlib;
+    } t;
 };
 #undef THIS
 #define THIS LPDIRECTDRAWSURFACE2 this
@@ -1007,7 +1050,8 @@
     STDMETHOD(BltBatch)(THIS_ LPDDBLTBATCH, DWORD, DWORD ) PURE;
     STDMETHOD(BltFast)(THIS_ DWORD,DWORD,LPDIRECTDRAWSURFACE2, LPRECT32,DWORD) PURE;
     STDMETHOD(DeleteAttachedSurface)(THIS_ DWORD,LPDIRECTDRAWSURFACE2) PURE;
-    STDMETHOD(EnumAttachedSurfaces)(THIS_ LPVOID,LPDDENUMSURFACESCALLBACK) PURE;    STDMETHOD(EnumOverlayZOrders)(THIS_ DWORD,LPVOID,LPDDENUMSURFACESCALLBACK) PURE;
+    STDMETHOD(EnumAttachedSurfaces)(THIS_ LPVOID,LPDDENUMSURFACESCALLBACK) PURE;
+    STDMETHOD(EnumOverlayZOrders)(THIS_ DWORD,LPVOID,LPDDENUMSURFACESCALLBACK) PURE;
     STDMETHOD(Flip)(THIS_ LPDIRECTDRAWSURFACE2, DWORD) PURE;
     STDMETHOD(GetAttachedSurface)(THIS_ LPDDSCAPS, LPDIRECTDRAWSURFACE2 FAR *) PURE;
     STDMETHOD(GetBltStatus)(THIS_ DWORD) PURE;
@@ -1042,7 +1086,12 @@
 struct IDirectDrawSurface2 {
     LPDIRECTDRAWSURFACE2_VTABLE	lpvtbl;
     DWORD			ref;
-    struct _directdrawsurface	s;
+    struct _common_directdrawsurface	s;
+    union {
+	struct _dga_directdrawsurface	dga;
+	struct _xlib_directdrawsurface	xshm;
+	struct _xlib_directdrawsurface	xlib;
+    } t;
 };
 #undef THIS
 #define THIS LPDIRECTDRAWSURFACE3 this
@@ -1097,7 +1146,12 @@
 struct IDirectDrawSurface3 {
     LPDIRECTDRAWSURFACE3_VTABLE	lpvtbl;
     DWORD			ref;
-    struct _directdrawsurface	s;
+    struct _common_directdrawsurface	s;
+    union {
+	struct _dga_directdrawsurface	dga;
+	struct _xlib_directdrawsurface	xshm;
+	struct _xlib_directdrawsurface	xlib;
+    } t;
 };
 #undef THIS
 
diff --git a/include/debug.h b/include/debug.h
index ad65c53..b21d384 100644
--- a/include/debug.h
+++ b/include/debug.h
@@ -5,125 +5,138 @@
 #endif
 
 /* Definitions for channels identifiers */
-#define dbch_accel 0
-#define dbch_advapi 1
-#define dbch_aspi 2
-#define dbch_atom 3
-#define dbch_bitblt 4
-#define dbch_bitmap 5
-#define dbch_caret 6
-#define dbch_cd 7
-#define dbch_cdaudio 8
-#define dbch_class 9
-#define dbch_clipboard 10
-#define dbch_clipping 11
-#define dbch_combo 12
-#define dbch_comm 13
-#define dbch_commctrl 14
-#define dbch_commdlg 15
-#define dbch_console 16
-#define dbch_crtdll 17
-#define dbch_cursor 18
-#define dbch_dc 19
-#define dbch_dde 20
-#define dbch_ddeml 21
-#define dbch_ddraw 22
-#define dbch_debug 23
-#define dbch_dialog 24
-#define dbch_dinput 25
-#define dbch_dll 26
-#define dbch_dosfs 27
-#define dbch_dosmem 28
-#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
+#define dbch_1 0
+#define dbch_2 1
+#define dbch_3 2
+#define dbch_4 3
+#define dbch_5 4
+#define dbch_6 5
+#define dbch_accel 6
+#define dbch_advapi 7
+#define dbch_aspi 8
+#define dbch_atom 9
+#define dbch_bitblt 10
+#define dbch_bitmap 11
+#define dbch_caret 12
+#define dbch_cd 13
+#define dbch_cdaudio 14
+#define dbch_class 15
+#define dbch_clipboard 16
+#define dbch_clipping 17
+#define dbch_combo 18
+#define dbch_comm 19
+#define dbch_commctrl 20
+#define dbch_commdlg 21
+#define dbch_console 22
+#define dbch_crtdll 23
+#define dbch_cursor 24
+#define dbch_dc 25
+#define dbch_dde 26
+#define dbch_ddeml 27
+#define dbch_ddraw 28
+#define dbch_debug 29
+#define dbch_dialog 30
+#define dbch_dinput 31
+#define dbch_dll 32
+#define dbch_dosfs 33
+#define dbch_dosmem 34
+#define dbch_dplay 35
+#define dbch_driver 36
+#define dbch_dsound 37
+#define dbch_edit 38
+#define dbch_event 39
+#define dbch_exec 40
+#define dbch_file 41
+#define dbch_fixup 42
+#define dbch_font 43
+#define dbch_gdi 44
+#define dbch_global 45
+#define dbch_graphics 46
+#define dbch_header 47
+#define dbch_heap 48
+#define dbch_hook 49
+#define dbch_icon 50
+#define dbch_imagelist 51
+#define dbch_int 52
+#define dbch_int21 53
+#define dbch_int31 54
+#define dbch_key 55
+#define dbch_keyboard 56
+#define dbch_ldt 57
+#define dbch_listbox 58
+#define dbch_listview 59
+#define dbch_local 60
+#define dbch_mci 61
+#define dbch_mcianim 62
+#define dbch_mciwave 63
+#define dbch_mdi 64
+#define dbch_menu 65
+#define dbch_message 66
+#define dbch_metafile 67
+#define dbch_midi 68
+#define dbch_mmaux 69
+#define dbch_mmio 70
+#define dbch_mmsys 71
+#define dbch_mmtime 72
+#define dbch_module 73
+#define dbch_mpr 74
+#define dbch_msg 75
+#define dbch_nonclient 76
+#define dbch_ntdll 77
+#define dbch_ole 78
+#define dbch_pager 79
+#define dbch_palette 80
+#define dbch_print 81
+#define dbch_process 82
+#define dbch_profile 83
+#define dbch_progress 84
+#define dbch_prop 85
+#define dbch_psdrv 86
+#define dbch_rebar 87
+#define dbch_reg 88
+#define dbch_region 89
+#define dbch_relay 90
+#define dbch_resource 91
+#define dbch_s 92
+#define dbch_scroll 93
+#define dbch_security 94
+#define dbch_segment 95
+#define dbch_selector 96
+#define dbch_sem 97
+#define dbch_sendmsg 98
+#define dbch_shell 99
+#define dbch_shm 100
+#define dbch_snoop 101
+#define dbch_sound 102
+#define dbch_static 103
+#define dbch_stress 104
+#define dbch_string 105
+#define dbch_syscolor 106
+#define dbch_system 107
+#define dbch_task 108
+#define dbch_text 109
+#define dbch_thread 110
+#define dbch_thunk 111
+#define dbch_timer 112
+#define dbch_toolbar 113
+#define dbch_toolhelp 114
+#define dbch_tooltips 115
+#define dbch_trackbar 116
+#define dbch_treeview 117
+#define dbch_tweak 118
+#define dbch_uitools 119
+#define dbch_updown 120
+#define dbch_ver 121
+#define dbch_virtual 122
+#define dbch_vxd 123
+#define dbch_win 124
+#define dbch_win16drv 125
+#define dbch_win32 126
+#define dbch_wing 127
+#define dbch_winsock 128
+#define dbch_wnet 129
+#define dbch_x11 130
+#define dbch_x11drv 131
 /* Definitions for classes identifiers */
 #define dbcl_fixme 0
 #define dbcl_err 1
diff --git a/include/debugdefs.h b/include/debugdefs.h
index a8ddd2f..3a8bb30 100644
--- a/include/debugdefs.h
+++ b/include/debugdefs.h
@@ -4,7 +4,7 @@
 #include "debugtools.h"
 #endif
 
-#define DEBUG_CHANNEL_COUNT 119
+#define DEBUG_CHANNEL_COUNT 132
 #ifdef DEBUG_RUNTIME
 short debug_msg_enabled[][DEBUG_CLASS_COUNT] = {
 {1, 1, 0, 0},
@@ -126,8 +126,27 @@
 {1, 1, 0, 0},
 {1, 1, 0, 0},
 {1, 1, 0, 0},
+{1, 1, 0, 0},
+{1, 1, 0, 0},
+{1, 1, 0, 0},
+{1, 1, 0, 0},
+{1, 1, 0, 0},
+{1, 1, 0, 0},
+{1, 1, 0, 0},
+{1, 1, 0, 0},
+{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[] = {
+"1",
+"2",
+"3",
+"4",
+"5",
+"6",
 "accel",
 "advapi",
 "aspi",
@@ -181,6 +200,7 @@
 "keyboard",
 "ldt",
 "listbox",
+"listview",
 "local",
 "mci",
 "mcianim",
@@ -200,6 +220,7 @@
 "nonclient",
 "ntdll",
 "ole",
+"pager",
 "palette",
 "print",
 "process",
@@ -207,10 +228,12 @@
 "progress",
 "prop",
 "psdrv",
+"rebar",
 "reg",
 "region",
 "relay",
 "resource",
+"s",
 "scroll",
 "security",
 "segment",
@@ -233,6 +256,9 @@
 "timer",
 "toolbar",
 "toolhelp",
+"tooltips",
+"trackbar",
+"treeview",
 "tweak",
 "uitools",
 "updown",
diff --git a/include/gdi.h b/include/gdi.h
index 723aa2f..fcb1786 100644
--- a/include/gdi.h
+++ b/include/gdi.h
@@ -203,6 +203,7 @@
     BOOL32     (*pPolyPolyline)(DC*,LPPOINT32,LPINT32,UINT32);
     BOOL32     (*pPolygon)(DC*,LPPOINT32,INT32);
     BOOL32     (*pPolyline)(DC*,LPPOINT32,INT32);
+    BOOL32     (*pPolyBezier)(DC*,POINT32, LPPOINT32,DWORD);
     UINT32     (*pRealizePalette)(DC*);
     BOOL32     (*pRectangle)(DC*,INT32,INT32,INT32,INT32);
     BOOL32     (*pRestoreDC)(DC*,INT32);
diff --git a/include/listview.h b/include/listview.h
new file mode 100644
index 0000000..7e8c920e
--- /dev/null
+++ b/include/listview.h
@@ -0,0 +1,21 @@
+/*
+ * Listview class extra info
+ *
+ * Copyright 1998 Eric Kohl
+ */
+
+#ifndef __WINE_LISTVIEW_H
+#define __WINE_LISTVIEW_H
+
+
+typedef struct tagLISTVIEW_INFO
+{
+    COLORREF   clrBk;
+
+
+} LISTVIEW_INFO;
+
+
+extern void LISTVIEW_Register (void);
+
+#endif  /* __WINE_LISTVIEW_H */
diff --git a/include/msdos.h b/include/msdos.h
index f8276ac..f154dab 100644
--- a/include/msdos.h
+++ b/include/msdos.h
@@ -194,5 +194,6 @@
 
 void WINAPI DOS3Call( CONTEXT *context );
 void do_mscdex( CONTEXT *context, int dorealmode );
+void do_mscdex_dd (CONTEXT * context, int dorealmode);
 
 #endif /* __WINE_MSDOS_H */
diff --git a/include/pager.h b/include/pager.h
new file mode 100644
index 0000000..428a8f0
--- /dev/null
+++ b/include/pager.h
@@ -0,0 +1,20 @@
+/*
+ * Pager class extra info
+ *
+ * Copyright 1998 Eric Kohl
+ */
+
+#ifndef __WINE_PAGER_H
+#define __WINE_PAGER_H
+
+
+typedef struct tagPAGER_INFO
+{
+    UINT32  uDummy;  /* this is just a dummy to keep the compiler happy */
+
+} PAGER_INFO;
+
+
+extern void PAGER_Register (void);
+
+#endif  /* __WINE_PAGER_H */
diff --git a/include/print.h b/include/print.h
index 1cc5628..fa64a49 100644
--- a/include/print.h
+++ b/include/print.h
@@ -1,5 +1,30 @@
+/* Definitions for printing
+ *
+ * Copyright 1998 Huw Davies, Andreas Mohr
+ */
+#ifndef __WINE_PRINT_H
+#define __WINE_PRINT_H
+
 #include "windows.h"
 
+#define INT_PD_DEFAULT_DEVMODE  1
+#define INT_PD_DEFAULT_MODEL    2
+
+#define PRINTER_ATTRIBUTE_QUEUED         0x00000001
+#define PRINTER_ATTRIBUTE_DIRECT         0x00000002
+#define PRINTER_ATTRIBUTE_DEFAULT        0x00000004
+#define PRINTER_ATTRIBUTE_SHARED         0x00000008
+#define PRINTER_ATTRIBUTE_NETWORK        0x00000010
+#define PRINTER_ATTRIBUTE_HIDDEN         0x00000020
+#define PRINTER_ATTRIBUTE_LOCAL          0x00000040
+
+#define PRINTER_ATTRIBUTE_ENABLE_DEVQ       0x00000080
+#define PRINTER_ATTRIBUTE_KEEPPRINTEDJOBS   0x00000100
+#define PRINTER_ATTRIBUTE_DO_COMPLETE_FIRST 0x00000200
+
+#define PRINTER_ATTRIBUTE_WORK_OFFLINE   0x00000400
+#define PRINTER_ATTRIBUTE_ENABLE_BIDI    0x00000800
+
 HANDLE16 WINAPI OpenJob(LPSTR lpOutput, LPSTR lpTitle, HDC16 hDC);
 int WINAPI CloseJob(HANDLE16 hJob);
 int WINAPI WriteSpool(HANDLE16 hJob, LPSTR lpData, WORD cch);
@@ -9,7 +34,4 @@
 DWORD WINAPI GetSpoolJob(int nOption, LONG param);
 int WINAPI WriteDialog(HANDLE16 hJob, LPSTR lpMsg, WORD cchMsg);
 
-
-
-
-
+#endif  /* __WINE_PRINT_H */
diff --git a/include/process.h b/include/process.h
index e669c2d..a5abc05 100644
--- a/include/process.h
+++ b/include/process.h
@@ -101,6 +101,8 @@
     DWORD            unknown7;         /* bc Unknown */
     DWORD            unknown8;         /* c0 Unknown (NT) */
     LCID             locale;           /* c4 Locale to be queried by GetThreadLocale (NT) */
+    /* The following are Wine-specific fields */
+    void            *server_pid;       /*    Server id for this process */
 } PDB32;
 
 /* Process flags */
@@ -108,6 +110,7 @@
 #define PDB32_DOS_PROC      0x0010  /* Dos process */
 #define PDB32_CONSOLE_PROC  0x0020  /* Console process */
 #define PDB32_FILE_APIS_OEM 0x0040  /* File APIs are OEM */
+#define PDB32_WIN32S_PROC   0x8000  /* Win32s process */
 
 /* PDB <-> Process id conversion macros */
 #define PROCESS_OBFUSCATOR     ((DWORD)0xdeadbeef)
diff --git a/include/rebar.h b/include/rebar.h
new file mode 100644
index 0000000..152d6ee
--- /dev/null
+++ b/include/rebar.h
@@ -0,0 +1,20 @@
+/*
+ * Rebar class extra info
+ *
+ * Copyright 1998 Eric Kohl
+ */
+
+#ifndef __WINE_REBAR_H
+#define __WINE_REBAR_H
+
+
+typedef struct tagREBAR_INFO
+{
+    UINT32  uDummy;   /* this is just a dummy to keep the compiler happy */
+
+} REBAR_INFO;
+
+
+extern void REBAR_Register (void);
+
+#endif  /* __WINE_REBAR_H */
diff --git a/include/server.h b/include/server.h
new file mode 100644
index 0000000..ab3dcc8
--- /dev/null
+++ b/include/server.h
@@ -0,0 +1,64 @@
+/*
+ * Wine server definitions
+ *
+ * Copyright (C) 1998 Alexandre Julliard
+ */
+
+#ifndef __WINE_SERVER_H
+#define __WINE_SERVER_H
+
+/* message header as sent on the wire */
+struct header
+{
+    unsigned int  len;     /* total msg length (including this header) */
+    unsigned int  type;    /* msg type */
+    unsigned int  seq;     /* sequence number */
+};
+
+/* max msg length (not including the header) */
+#define MAX_MSG_LENGTH (16384 - sizeof(struct header))
+
+/* request from client to server */
+
+enum request
+{
+    REQ_TIMEOUT,         /* internal timeout msg */
+    REQ_KILL_THREAD,     /* internal kill thread msg */
+    REQ_NEW_THREAD,      /* create a new thread (called from the creator) */
+    REQ_INIT_THREAD,     /* init a new thread (called by itself) */
+    REQ_NB_REQUESTS
+};
+
+/* request structures */
+
+struct new_thread_request
+{
+    void *pid;  /* process id for the new thread (or 0 if none yet) */
+};
+
+struct new_thread_reply
+{
+    void *tid;  /* thread id */
+    void *pid;  /* process id (created if necessary) */
+};
+
+struct init_thread_request
+{
+    int  pid;
+/*    char name[...];*/
+};
+
+/* server-side functions */
+
+extern void server_main_loop( int fd );
+
+
+/* client-side functions */
+
+#ifndef __WINE_SERVER__
+struct _THDB;
+extern int CLIENT_NewThread( struct _THDB *thdb );
+extern int CLIENT_InitThread(void);
+#endif  /* __WINE_SERVER__ */
+
+#endif  /* __WINE_SERVER_H */
diff --git a/include/shlobj.h b/include/shlobj.h
index 411ca0b..3deeb40 100644
--- a/include/shlobj.h
+++ b/include/shlobj.h
@@ -40,14 +40,12 @@
 #define	STRRET_CSTR	0x0002
 
 typedef struct _STRRET
-{
-    UINT32 uType;		/* STRRET_xxx */
-    union
-    {
-        LPWSTR	pOleStr;	/* OLESTR that will be freed */
-        UINT32	uOffset;	/* Offset into SHITEMID (ANSI) */
-        char	cStr[MAX_PATH];	/* Buffer to fill in */
-    } DUMMYUNIONNAME;
+{ UINT32 uType;		/* STRRET_xxx */
+  union
+  { LPWSTR	pOleStr;	/* OLESTR that will be freed */
+    UINT32	uOffset;	/* Offset into SHITEMID (ANSI) */
+    char	cStr[MAX_PATH];	/* Buffer to fill in */
+  }u;
 } STRRET,*LPSTRRET;
 
 typedef struct {
@@ -59,16 +57,87 @@
 	SHITEMID	mkid; /* first itemid in list */
 } ITEMIDLIST,*LPITEMIDLIST,*LPCITEMIDLIST;
 
+
+/****************************************************************************
+ * INTERNAL CLASS: PIDL-Manager
+ * Source: HOWTO extend the explorer namespace
+ * ftp.microsoft.com/ ... softlib ... regview.exe
+ */
+#define THIS LPPIDLMGR this
+typedef enum tagPIDLTYPE
+{ PT_DESKTOP = 0x00000000,
+  PT_DRIVE =   0x00000001,
+  PT_FOLDER =  0x00000002,
+	PT_VALUE =   0x00000004,
+  PT_TEXT = PT_FOLDER | PT_VALUE
+} PIDLTYPE;
+
+typedef struct tagPIDLDATA
+{ PIDLTYPE type;
+  CHAR    szText[1];
+}PIDLDATA, FAR *LPPIDLDATA;
+
+typedef struct pidlmgr pidlmgr,*LPPIDLMGR;
+typedef struct PidlMgr_VTable {
+   STDMETHOD_(LPITEMIDLIST, CreateDesktop) (THIS);
+   STDMETHOD_(LPITEMIDLIST, CreateDrive) (THIS_ LPCSTR);
+   STDMETHOD_(LPITEMIDLIST, CreateFolder) (THIS_ LPCSTR);
+   STDMETHOD_(LPITEMIDLIST, CreateValue) (THIS_ LPCSTR);
+   STDMETHOD_(void, Delete) (THIS_ LPITEMIDLIST);
+   STDMETHOD_(LPITEMIDLIST, GetNextItem) (THIS_ LPCITEMIDLIST);
+   STDMETHOD_(LPITEMIDLIST, Copy) (THIS_ LPCITEMIDLIST);
+   STDMETHOD_(UINT16, GetSize) (THIS_ LPCITEMIDLIST);
+   STDMETHOD_(BOOL32, GetDesktop) (THIS_ LPCITEMIDLIST, LPSTR);
+   STDMETHOD_(BOOL32, GetDrive) (THIS_ LPCITEMIDLIST, LPSTR, UINT16);
+	 STDMETHOD_(LPITEMIDLIST, GetLastItem) (THIS_ LPCITEMIDLIST);
+   STDMETHOD_(DWORD, GetItemText) (THIS_ LPCITEMIDLIST, LPSTR, UINT16);
+   STDMETHOD_(BOOL32, IsDesktop) (THIS_ LPCITEMIDLIST);
+   STDMETHOD_(BOOL32, IsDrive) (THIS_ LPCITEMIDLIST);
+   STDMETHOD_(BOOL32, IsFolder) (THIS_ LPCITEMIDLIST);
+   STDMETHOD_(BOOL32, IsValue) (THIS_ LPCITEMIDLIST);
+   STDMETHOD_(BOOL32, HasFolders) (THIS_ LPSTR, LPCITEMIDLIST);
+   STDMETHOD_(DWORD, GetFolderText) (THIS_ LPCITEMIDLIST, LPSTR, DWORD);
+   STDMETHOD_(DWORD, GetValueText) (THIS_ LPCITEMIDLIST, LPSTR, DWORD);
+   
+/*   STDMETHOD_(BOOL32, GetValueType) (THIS_ LPCITEMIDLIST, LPDWORD);*/
+   STDMETHOD_(BOOL32, GetValueType) (THIS_ LPCITEMIDLIST, LPCITEMIDLIST, LPDWORD);
+   
+/*   STDMETHOD_(DWORD, GetDataText) (THIS_ LPCITEMIDLIST, LPSTR, DWORD);*/
+   STDMETHOD_(DWORD, GetDataText) (THIS_ LPCITEMIDLIST, LPCITEMIDLIST, LPSTR, DWORD);
+   
+   STDMETHOD_(DWORD, GetPidlPath) (THIS_ LPCITEMIDLIST, LPSTR, DWORD);
+   STDMETHOD_(LPITEMIDLIST, Concatenate) (THIS_ LPCITEMIDLIST, LPCITEMIDLIST);
+   STDMETHOD_(LPITEMIDLIST, Create) (THIS_ PIDLTYPE, LPVOID, UINT16);
+   STDMETHOD_(DWORD, GetData) (THIS_ PIDLTYPE, LPCITEMIDLIST, LPVOID, UINT16);
+   STDMETHOD_(LPPIDLDATA, GetDataPointer) (THIS_ LPCITEMIDLIST);
+   STDMETHOD_(BOOL32, SeparatePathAndValue) (THIS_ LPCITEMIDLIST, LPITEMIDLIST*, LPITEMIDLIST*);
+
+} *LPPIDLMGR_VTABLE,PidlMgr_VTable;
+
+struct pidlmgr {
+	LPPIDLMGR_VTABLE	lpvtbl;
+};
+#ifdef __WINE__
+extern LPPIDLMGR PidlMgr_Constructor();
+extern void PidlMgr_Destructor(THIS);
+#endif
+
+#undef THIS
+
 /*****************************************************************************
  * IEnumIDList interface
  */
 #define THIS LPENUMIDLIST this
+typedef struct tagENUMLIST
+{ struct tagENUMLIST	*pNext;
+  LPITEMIDLIST pidl;
+} ENUMLIST, *LPENUMLIST;
 
 typedef struct IEnumIDList IEnumIDList,*LPENUMIDLIST;
 typedef struct IEnumIDList_VTable {
     /* *** IUnknown methods *** */
     STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID * ppvObj) PURE;
-    STDMETHOD_(ULONG,AddRef) (THIS)  PURE;
+		STDMETHOD_(ULONG,AddRef) (THIS)  PURE;
     STDMETHOD_(ULONG,Release) (THIS) PURE;
 
     /* *** IEnumIDList methods *** */
@@ -78,12 +147,24 @@
     STDMETHOD(Skip)  (THIS_ ULONG celt) PURE;
     STDMETHOD(Reset) (THIS) PURE;
     STDMETHOD(Clone) (THIS_ IEnumIDList **ppenum) PURE;
+		/* *** private methods *** */
+		STDMETHOD_(BOOL32,CreateEnumList)(THIS_ LPCSTR, DWORD) PURE;
+    STDMETHOD_(BOOL32,AddToEnumList)(THIS_ LPITEMIDLIST) PURE;
+    STDMETHOD_(BOOL32,DeleteList)(THIS) PURE;
+
+		
 } IEnumIDList_VTable,*LPENUMIDLIST_VTABLE;
 
 struct IEnumIDList {
 	LPENUMIDLIST_VTABLE	lpvtbl;
-	DWORD			ref;
+	DWORD			 ref;
+	LPPIDLMGR  mpPidlMgr;
+	LPENUMLIST mpFirst;
+	LPENUMLIST mpLast;
+	LPENUMLIST mpCurrent;
+
 };
+
 #undef THIS
 /************************************************************************
  * The IShellFolder interface ... the basic interface for a lot of stuff
@@ -143,7 +224,8 @@
     STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID * ppvObj) PURE;
     STDMETHOD_(ULONG,AddRef) (THIS)  PURE;
     STDMETHOD_(ULONG,Release) (THIS) PURE;
-
+    /* *** IPersist Folder methods *** */
+		STDMETHOD(Initialize)(THIS_ LPCITEMIDLIST pidl) PURE;
     /* *** IShellFolder methods *** */
     STDMETHOD(ParseDisplayName) (THIS_ HWND32 hwndOwner,
         LPBC pbcReserved, LPOLESTR32 lpszDisplayName,
@@ -169,7 +251,12 @@
 
 struct tagSHELLFOLDER {
 	LPSHELLFOLDER_VTABLE	lpvtbl;
-	DWORD			ref;
+	DWORD			   ref;
+	LPSTR        mlpszFolder;
+  LPPIDLMGR	   pPidlMgr;
+	LPITEMIDLIST mpidl;
+	LPITEMIDLIST mpidlNSRoot;
+	LPSHELLFOLDER mpSFParent;
 };
 
 #undef THIS
@@ -240,9 +327,10 @@
 #undef THIS
 
 #ifdef __WINE__
-extern LPSHELLFOLDER IShellFolder_Constructor();
+extern LPCLASSFACTORY IClassFactory_Constructor();
+extern LPSHELLFOLDER IShellFolder_Constructor(LPSHELLFOLDER,LPITEMIDLIST);
 extern LPSHELLLINK IShellLink_Constructor();
-extern LPENUMIDLIST IEnumIDList_Constructor();
+extern LPENUMIDLIST IEnumIDList_Constructor(LPCSTR,DWORD,HRESULT*);
 #endif
 
 DWORD WINAPI SHELL32_DllGetClassObject(LPCLSID,REFIID,LPVOID*);
@@ -324,7 +412,6 @@
 #endif 
 */
 
-
 #undef PURE
 #undef FAR
 #undef THIS
diff --git a/include/snoop.h b/include/snoop.h
index 29a7b91..72466f6 100644
--- a/include/snoop.h
+++ b/include/snoop.h
@@ -8,6 +8,7 @@
 
 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);
+extern void (*fnSNOOP16_RegisterDLL)(NE_MODULE*,LPCSTR);
+extern FARPROC16 (*fnSNOOP16_GetProcAddress16)(HMODULE16,DWORD,FARPROC16);
+extern void SNOOP16_Init();
 #endif
diff --git a/include/task.h b/include/task.h
index 0a3cc86..85f38cb 100644
--- a/include/task.h
+++ b/include/task.h
@@ -123,13 +123,33 @@
 #define USIG_DLL_UNLOAD		0x0080
 #define USIG_GPF		0x0666
 
+
+  /* THHOOK Kernel Data Structure */
+typedef struct _THHOOK
+{
+    HANDLE16   hGlobalHeap;         /* 00 (handle BURGERMASTER) */
+    WORD       pGlobalHeap;         /* 02 (selector BURGERMASTER) */
+    HMODULE16  hExeHead;            /* 04 hFirstModule */
+    HMODULE16  hExeSweep;           /* 06 (unused) */
+    HANDLE16   TopPDB;              /* 08 (handle of KERNEL PDB) */
+    HANDLE16   HeadPDB;             /* 0A (first PDB in list) */
+    HANDLE16   TopSizePDB;          /* 0C (unused) */
+    HTASK16    HeadTDB;             /* 0E hFirstTask */
+    HTASK16    CurTDB;              /* 10 hCurrentTask */
+    HTASK16    LoadTDB;             /* 12 (unused) */
+    HTASK16    LockTDB;             /* 14 hLockedTask */
+} THHOOK;
+
 #pragma pack(4)
 
+extern THHOOK *pThhook;
+
 extern HTASK16 TASK_Create( struct _THDB *thdb, struct _NE_MODULE *pModule,
                             HINSTANCE16 hInstance, HINSTANCE16 hPrevInstance,
                             UINT16 cmdShow );
 extern void TASK_KillCurrentTask( INT16 exitCode );
 extern HTASK16 TASK_GetNextTask( HTASK16 hTask );
 extern void TASK_Reschedule(void);
+extern void TASK_InstallTHHook( THHOOK *pNewThook );
 
 #endif /* __WINE_TASK_H */
diff --git a/include/thread.h b/include/thread.h
index 9e95d29..8d81fd2 100644
--- a/include/thread.h
+++ b/include/thread.h
@@ -92,6 +92,9 @@
     /* The following are Wine-specific fields */
     CONTEXT        context;        /* 200 Thread context */
     WAIT_STRUCT    wait_struct;    /*     Event wait structure */
+    int            socket;         /*     Socket for server communication */
+    unsigned int   seq;            /*     Server sequence number */
+    void          *server_tid;     /*     Server id for this thread */
 } THDB;
 
 /* Thread queue entry */
diff --git a/include/toolbar.h b/include/toolbar.h
index 407c331..e036a12 100644
--- a/include/toolbar.h
+++ b/include/toolbar.h
@@ -43,12 +43,16 @@
     INT32      nOldHit;
     INT32      nHotItem;        /* index of the "hot" item */
 
+    HFONT32    hFont;           /* text font */
     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 */
+    BOOL32     bAutoSize;
+
+    COLORREF   clrInsertMark;   /* insert mark color */
 
     TBUTTON_INFO *buttons;
     CHAR         **strings;
diff --git a/include/tooltips.h b/include/tooltips.h
new file mode 100644
index 0000000..1c07135
--- /dev/null
+++ b/include/tooltips.h
@@ -0,0 +1,40 @@
+/*
+ * Tool tips class extra info
+ *
+ * Copyright 1998 Eric Kohl
+ */
+
+#ifndef __WINE_TOOLTIPS_H
+#define __WINE_TOOLTIPS_H
+
+
+typedef struct tagTTTOOL_INFO
+{
+    UINT32 uFlags;
+    HWND32 hwnd;
+    UINT32 uId;
+    RECT32 rect;
+    HINSTANCE32 hinst;
+    LPSTR  lpszText;
+    LPARAM lParam;
+
+} TTTOOL_INFO; 
+
+
+typedef struct tagTOOLTIPS_INFO
+{
+    BOOL32     bActive;
+    UINT32     uNumTools;
+    COLORREF   clrBk;
+    COLORREF   clrText;
+    HFONT32    hFont;
+    INT32      iMaxTipWidth;
+    INT32      iCurrentTool;
+
+    TTTOOL_INFO *tools;
+} TOOLTIPS_INFO;
+
+
+extern void TOOLTIPS_Register (void);
+
+#endif  /* __WINE_TOOLTIPS_H */
diff --git a/include/trackbar.h b/include/trackbar.h
new file mode 100644
index 0000000..0645f6a
--- /dev/null
+++ b/include/trackbar.h
@@ -0,0 +1,28 @@
+/*
+ * Trackbar class extra info
+ *
+ * Copyright 1998 Eric Kohl
+ */
+
+#ifndef __WINE_TRACKBAR_H
+#define __WINE_TRACKBAR_H
+
+typedef struct tagTRACKBAR_INFO
+{
+    INT32  nRangeMin;
+    INT32  nRangeMax;
+    INT32  nLineSize;
+    INT32  nPageSize;
+    INT32  nSelMin;
+    INT32  nSelMax;
+    INT32  nPos;
+    INT32  nThumbLen;
+
+    BOOL32 bFocus;
+    RECT32 rcChannel;
+} TRACKBAR_INFO;
+
+
+extern void TRACKBAR_Register (void);
+
+#endif  /* __WINE_TRACKBAR_H */
diff --git a/include/treeview.h b/include/treeview.h
new file mode 100644
index 0000000..2d92a80
--- /dev/null
+++ b/include/treeview.h
@@ -0,0 +1,19 @@
+/*
+ * Treeview class extra info
+ *
+ * Copyright 1998 Eric Kohl
+ */
+
+#ifndef __WINE_TREEVIEW_H
+#define __WINE_TREEVIEW_H
+
+typedef struct tagTREEVIEW_INFO
+{
+    UINT32  uDummy;  /* this is just a dummy to keep the compiler happy */
+
+} TREEVIEW_INFO;
+
+
+extern void TREEVIEW_Register (void);
+
+#endif  /* __WINE_TREEVIEW_H */
diff --git a/include/ts_xlib.h b/include/ts_xlib.h
index 7088599..f49bdee 100644
--- a/include/ts_xlib.h
+++ b/include/ts_xlib.h
@@ -20,6 +20,7 @@
 extern char * TSXGetAtomName(Display*, Atom);
 extern char * TSXKeysymToString(KeySym);
 extern Atom  TSXInternAtom(Display*, const  char*, int);
+extern Colormap  TSXCopyColormapAndFree(Display*, Colormap);
 extern Colormap  TSXCreateColormap(Display*, Window, Visual*, int);
 extern Cursor  TSXCreatePixmapCursor(Display*, Pixmap, Pixmap, XColor*, XColor*, unsigned int, unsigned int);
 extern Cursor  TSXCreateFontCursor(Display*, unsigned int);
diff --git a/include/ts_xshm.h b/include/ts_xshm.h
index 01a2b51..817da7d 100644
--- a/include/ts_xshm.h
+++ b/include/ts_xshm.h
@@ -16,5 +16,6 @@
 extern int TSXShmPixmapFormat(Display *);
 extern Status TSXShmDetach(Display *, XShmSegmentInfo *);
 extern Status TSXShmAttach(Display *, XShmSegmentInfo *);
+extern Status TSXShmPutImage(Display *, Drawable, GC, XImage *, int, int, int, int, unsigned int, unsigned int, Bool);
 
 #endif /* __WINE_TSXSHM_H */
diff --git a/include/version.h b/include/version.h
index abb9b65..0554a0e 100644
--- a/include/version.h
+++ b/include/version.h
@@ -1 +1 @@
-#define WINE_RELEASE_INFO "Wine release 980628"
+#define WINE_RELEASE_INFO "Wine release 980712"
diff --git a/include/windows.h b/include/windows.h
index 6b7bfcc..5184273 100644
--- a/include/windows.h
+++ b/include/windows.h
@@ -1684,6 +1684,35 @@
 DECL_WINELIB_TYPE(ABC)
 DECL_WINELIB_TYPE(LPABC)
 
+  /* for GetCharacterPlacement () */
+typedef struct tagGCP_RESULTS32A
+{
+    DWORD  lStructSize;
+    LPSTR  lpOutString;
+    UINT32 *lpOrder;
+    INT32  *lpDx;
+    INT32  *lpCaretPos;
+    LPSTR  lpClass;
+    UINT32 *lpGlyphs;
+    UINT32 nGlyphs;
+    UINT32 nMaxFit;
+} GCP_RESULTS32A;
+
+typedef struct tagGCP_RESULTS32W
+{
+    DWORD  lStructSize;
+    LPWSTR lpOutString;
+    UINT32 *lpOrder;
+    INT32  *lpDx;
+    INT32  *lpCaretPos;
+    LPWSTR lpClass;
+    UINT32 *lpGlyphs;
+    UINT32 nGlyphs;
+    UINT32 nMaxFit;
+} GCP_RESULTS32W;
+
+DECL_WINELIB_TYPE_AW(GCP_RESULTS)
+
   /* Rasterizer status */
 typedef struct
 {
@@ -3186,6 +3215,36 @@
 #define WM_PRINT             0x0317
 #define WM_PRINTCLIENT       0x0318
 
+  /* MFC messages [370-37f] */
+
+#define WM_QUERYAFXWNDPROC  0x0360
+#define WM_SIZEPARENT       0x0361
+#define WM_SETMESSAGESTRING 0x0362
+#define WM_IDLEUPDATECMDUI  0x0363 
+#define WM_INITIALUPDATE    0x0364
+#define WM_COMMANDHELP      0x0365
+#define WM_HELPHITTEST      0x0366
+#define WM_EXITHELPMODE     0x0367
+#define WM_RECALCPARENT     0x0368
+#define WM_SIZECHILD        0x0369
+#define WM_KICKIDLE         0x036A 
+#define WM_QUERYCENTERWND   0x036B
+#define WM_DISABLEMODAL     0x036C
+#define WM_FLOATSTATUS      0x036D 
+#define WM_ACTIVATETOPLEVEL 0x036E 
+#define WM_QUERY3DCONTROLS  0x036F 
+#define WM_SOCKET_NOTIFY    0x0373
+#define WM_SOCKET_DEAD      0x0374
+#define WM_POPMESSAGESTRING 0x0375
+#define WM_OCC_LOADFROMSTREAM           0x0376
+#define WM_OCC_LOADFROMSTORAGE          0x0377
+#define WM_OCC_INITNEW                  0x0378
+#define WM_OCC_LOADFROMSTREAM_EX        0x037A
+#define WM_OCC_LOADFROMSTORAGE_EX       0x037B
+#define WM_QUEUE_SENTINEL   0x0379
+
+/* end of MFC messages */
+
 #define WM_COALESCE_FIRST    0x0390
 #define WM_COALESCE_LAST     0x039F
 
@@ -5877,6 +5936,33 @@
 DECL_WINELIB_TYPE_AW(LPNETRESOURCE)
 
 typedef struct {
+    DWORD cbStructure;       /* size of this structure in bytes */
+    HWND32 hwndOwner;          /* owner window for the dialog */
+    LPNETRESOURCE32A lpConnRes;/* Requested Resource info    */
+    DWORD dwFlags;           /* flags (see below) */
+    DWORD dwDevNum;          /* number of devices connected to */
+} CONNECTDLGSTRUCT32A, *LPCONNECTDLGSTRUCT32A;
+typedef struct {
+    DWORD cbStructure;       /* size of this structure in bytes */
+    HWND32 hwndOwner;          /* owner window for the dialog */
+    LPNETRESOURCE32W lpConnRes;/* Requested Resource info    */
+    DWORD dwFlags;           /* flags (see below) */
+    DWORD dwDevNum;          /* number of devices connected to */
+} CONNECTDLGSTRUCT32W, *LPCONNECTDLGSTRUCT32W;
+
+DECL_WINELIB_TYPE_AW(CONNECTDLGSTRUCT)
+DECL_WINELIB_TYPE_AW(LPCONNECTDLGSTRUCT)
+
+/**/
+#define CONNDLG_RO_PATH     0x00000001 /* Resource path should be read-only    */
+#define CONNDLG_CONN_POINT  0x00000002 /* Netware -style movable connection point enabled */
+#define CONNDLG_USE_MRU     0x00000004 /* Use MRU combobox  */
+#define CONNDLG_HIDE_BOX    0x00000008 /* Hide persistent connect checkbox  */
+#define CONNDLG_PERSIST     0x00000010 /* Force persistent connection */
+#define CONNDLG_NOT_PERSIST 0x00000020 /* Force connection NOT persistent */
+
+
+typedef struct {
 	DWORD	cbStructure;
 	DWORD	dwFlags;
 	DWORD	dwSpeed;
@@ -6159,7 +6245,7 @@
 HANDLE16    WINAPI FarGetOwner(HGLOBAL16);
 VOID        WINAPI FarSetOwner(HGLOBAL16,HANDLE16);
 BOOL16      WINAPI FastWindowFrame(HDC16,const RECT16*,INT16,INT16,DWORD);
-VOID        WINAPI FileCDR(FARPROC16);
+FARPROC16   WINAPI FileCDR(FARPROC16);
 VOID        WINAPI FillWindow(HWND16,HWND16,HDC16,HBRUSH16);
 INT16       WINAPI FlushComm(INT16,INT16);
 WORD        WINAPI FreeSelector(WORD);
@@ -6449,8 +6535,8 @@
 DWORD       WINAPI GetObjectType(HANDLE32);
 UINT32      WINAPI GetOEMCP(void);
 DWORD       WINAPI GetPriorityClass(HANDLE32);
-INT32       WINAPI GetPrivateProfileSection32A(LPCSTR,LPSTR,INT32,LPCSTR);
-INT32       WINAPI GetPrivateProfileSection32W(LPCWSTR,LPWSTR,INT32,LPCWSTR);
+INT32       WINAPI GetPrivateProfileSection32A(LPCSTR,LPSTR,UINT32,LPCSTR);
+INT32       WINAPI GetPrivateProfileSection32W(LPCWSTR,LPWSTR,UINT32,LPCWSTR);
 #define     GetPrivateProfileSection WINELIB_NAME_AW(GetPrivateProfileSection)
 HANDLE32    WINAPI GetProcessHeap(void);
 DWORD       WINAPI GetRegionData(HRGN32,DWORD,LPRGNDATA);
@@ -6647,6 +6733,7 @@
 BOOL32      WINAPI SetWindowContextHelpId(HWND32,DWORD);
 BOOL32      WINAPI SetWorldTransform(HDC32,const XFORM*);
 VOID        WINAPI Sleep(DWORD);
+DWORD       WINAPI SleepEx(DWORD,BOOL32);
 BOOL32      WINAPI StartService32A(HANDLE32,DWORD,LPCSTR*);
 BOOL32      WINAPI StartService32W(HANDLE32,DWORD,LPCWSTR*);
 #define     StartService WINELIB_NAME_AW(StartService)
@@ -6682,6 +6769,13 @@
 UINT32      WINAPI WNetAddConnection3_32A(HWND32,LPNETRESOURCE32A,LPCSTR,LPCSTR,DWORD);
 UINT32      WINAPI WNetAddConnection3_32W(HWND32,LPNETRESOURCE32W,LPCWSTR,LPCWSTR,DWORD);
 #define     WNetAddConnection3 WINELIB_NAME_AW(WNetAddConnection3_)
+UINT32      WINAPI WNetConnectionDialog1_32(HWND32,DWORD);
+UINT32      WINAPI WNetConnectionDialog1_32A(LPCONNECTDLGSTRUCT32A);
+UINT32      WINAPI WNetConnectionDialog1_32W(LPCONNECTDLGSTRUCT32W);
+#define     WNetConnectionDialog1 WINELIB_NAME_AW(WNetConnectionDialog1_)
+UINT32      WINAPI MultinetGetErrorText32A(DWORD,DWORD,DWORD);
+UINT32      WINAPI MultinetGetErrorText32W(DWORD,DWORD,DWORD);
+#define     MultinetGetErrorText WINELIB_NAME_AW(MultinetGetErrorText_)
 SEGPTR      WINAPI WOWGlobalAllocLock16(DWORD,DWORD,HGLOBAL16*);
 DWORD       WINAPI WOWCallback16(FARPROC16,DWORD);
 BOOL32      WINAPI WOWCallback16Ex(FARPROC16,DWORD,DWORD,LPVOID,LPDWORD);
@@ -7704,9 +7798,9 @@
 UINT32      WINAPI GetPrivateProfileInt32A(LPCSTR,LPCSTR,INT32,LPCSTR);
 UINT32      WINAPI GetPrivateProfileInt32W(LPCWSTR,LPCWSTR,INT32,LPCWSTR);
 #define     GetPrivateProfileInt WINELIB_NAME_AW(GetPrivateProfileInt)
-INT16       WINAPI GetPrivateProfileString16(LPCSTR,LPCSTR,LPCSTR,LPSTR,INT16,LPCSTR);
-INT32       WINAPI GetPrivateProfileString32A(LPCSTR,LPCSTR,LPCSTR,LPSTR,INT32,LPCSTR);
-INT32       WINAPI GetPrivateProfileString32W(LPCWSTR,LPCWSTR,LPCWSTR,LPWSTR,INT32,LPCWSTR);
+INT16       WINAPI GetPrivateProfileString16(LPCSTR,LPCSTR,LPCSTR,LPSTR,UINT16,LPCSTR);
+INT32       WINAPI GetPrivateProfileString32A(LPCSTR,LPCSTR,LPCSTR,LPSTR,UINT32,LPCSTR);
+INT32       WINAPI GetPrivateProfileString32W(LPCWSTR,LPCWSTR,LPCWSTR,LPWSTR,UINT32,LPCWSTR);
 #define     GetPrivateProfileString WINELIB_NAME_AW(GetPrivateProfileString)
 FARPROC16   WINAPI GetProcAddress16(HMODULE16,SEGPTR);
 FARPROC32   WINAPI GetProcAddress32(HMODULE32,LPCSTR);
@@ -7715,9 +7809,9 @@
 UINT32      WINAPI GetProfileInt32A(LPCSTR,LPCSTR,INT32);
 UINT32      WINAPI GetProfileInt32W(LPCWSTR,LPCWSTR,INT32);
 #define     GetProfileInt WINELIB_NAME_AW(GetProfileInt)
-INT16       WINAPI GetProfileString16(LPCSTR,LPCSTR,LPCSTR,LPSTR,INT16);
-INT32       WINAPI GetProfileString32A(LPCSTR,LPCSTR,LPCSTR,LPSTR,INT32);
-INT32       WINAPI GetProfileString32W(LPCWSTR,LPCWSTR,LPCWSTR,LPWSTR,INT32);
+INT16       WINAPI GetProfileString16(LPCSTR,LPCSTR,LPCSTR,LPSTR,UINT16);
+INT32       WINAPI GetProfileString32A(LPCSTR,LPCSTR,LPCSTR,LPSTR,UINT32);
+INT32       WINAPI GetProfileString32W(LPCWSTR,LPCWSTR,LPCWSTR,LPWSTR,UINT32);
 #define     GetProfileString WINELIB_NAME_AW(GetProfileString)
 HANDLE16    WINAPI GetProp16(HWND16,LPCSTR);
 HANDLE32    WINAPI GetProp32A(HWND32,LPCSTR);
@@ -8253,6 +8347,12 @@
 BOOL32      WINAPI OemToCharBuff32A(LPCSTR,LPSTR,DWORD);
 BOOL32      WINAPI OemToCharBuff32W(LPCSTR,LPWSTR,DWORD);
 #define     OemToCharBuff WINELIB_NAME_AW(OemToCharBuff)
+INT16       WINAPI WideCharToLocal16(LPSTR,LPWSTR,INT16);
+INT32       WINAPI WideCharToLocal32(LPSTR,LPWSTR,INT32);
+#define			WideCharToLocal WINELIB_NAME(WideCharToLocal)
+INT16       WINAPI LocalToWideChar16(LPWSTR,LPSTR,INT16);
+INT32       WINAPI LocalToWideChar32(LPWSTR,LPSTR,INT32);
+#define			LocalToWideChar WINELIB_NAME(LocalToWideChar)
 INT16       WINAPI OffsetClipRgn16(HDC16,INT16,INT16);
 INT32       WINAPI OffsetClipRgn32(HDC32,INT32,INT32);
 #define     OffsetClipRgn WINELIB_NAME(OffsetClipRgn)
diff --git a/include/winerror.h b/include/winerror.h
index 441f839..8c6c8d6 100644
--- a/include/winerror.h
+++ b/include/winerror.h
@@ -97,14 +97,13 @@
 #define CO_E_INIT_SCM_EXEC_FAILURE	0x80004011
 #define CO_E_INIT_ONLY_SINGLE_THREADED	0x80004012 */
 
-
-#define	OLE_E_ENUM_NOMORE		0x80040002
+#define	OLE_E_ENUM_NOMORE		      0x80040002
+#define CLASS_E_NOAGGREGATION     0x80040110
 #define	CLASS_E_CLASSNOTAVAILABLE	0x80040111
-
-#define E_ACCESSDENIED			0x80070005
-#define E_HANDLE			0x80070006
-#define	E_OUTOFMEMORY			0x8007000E
-#define	E_INVALIDARG			0x80070057
+#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
diff --git a/include/x11drv.h b/include/x11drv.h
index d8e7d7a..0bb9b24 100644
--- a/include/x11drv.h
+++ b/include/x11drv.h
@@ -93,6 +93,7 @@
 extern COLORREF X11DRV_GetPixel( struct tagDC *dc, INT32 x, INT32 y);
 extern BOOL32 X11DRV_PaintRgn( struct tagDC *dc, HRGN32 hrgn );
 extern BOOL32 X11DRV_Polyline( struct tagDC *dc,const LPPOINT32 pt,INT32 count);
+extern BOOL32 X11DRV_PolyBezier( struct tagDC *dc,const POINT32 start, const LPPOINT32 lppt,DWORD cPoints);
 extern BOOL32 X11DRV_Polygon( struct tagDC *dc, LPPOINT32 pt, INT32 count );
 extern BOOL32 X11DRV_PolyPolygon( struct tagDC *dc, LPPOINT32 pt,
 				  LPINT32 counts, UINT32 polygons);
diff --git a/include/x11font.h b/include/x11font.h
index aed042c..268fe1a 100644
--- a/include/x11font.h
+++ b/include/x11font.h
@@ -76,7 +76,6 @@
     UINT16			lfd_width;
     UINT16			lfd_decipoints;
     UINT16			lfd_resolution;
-
     IFONTINFO16			df;
 } fontInfo;
 
@@ -97,6 +96,15 @@
   CHAR				lfFaceName[LF_FACESIZE];
 } fontResource;
 
+typedef struct {
+  float		a,b,c,d;	/* pixelsize matrix */
+  unsigned long	RAW_ASCENT;
+  unsigned long	RAW_DESCENT;
+  float		pixelsize;
+  float		ascent;
+  float		descent;
+} XFONTTRANS;
+
 #define FO_RESOURCE_MASK	0x000F
 #define FO_SYSTEM		0x0001		/* resident in cache */
 #define FO_SOFTFONT		0x0002		/* installed at runtime */
@@ -127,8 +135,10 @@
   LPMAT2*		lpXForm;		/* optional transformation matrix */
   Pixmap*               lpPixmap;		/* optional character bitmasks for synth fonts */
 
+  XFONTTRANS		*lpX11Trans;		/* Info for X11R6 transform */
   INT16			foInternalLeading;
   INT16			foAvgCharWidth;
+  INT16			foMaxCharWidth;
   UINT16		fo_flags;
 
   /* font cache housekeeping */
@@ -176,4 +186,3 @@
 extern LPIFONTINFO16 XFONT_GetFontInfo( X_PHYSFONT pFont );
 
 #endif __WINE_X11FONT_H 
-
diff --git a/loader/module.c b/loader/module.c
index 2668174..b6f859b 100644
--- a/loader/module.c
+++ b/loader/module.c
@@ -220,16 +220,14 @@
     LPSTR	dotptr;
     WINE_MODREF	*wm;
 
+    if (!process)
+    	return 0;
     if (!(filename = strrchr( path, '\\' )))
     	filename = HEAP_strdupA(process->heap,0,path);
     else 
     	filename = HEAP_strdupA(process->heap,0,filename+1);
     dotptr=strrchr(filename,'.');
 
-    if (!process) {
-    	HeapFree(process->heap,0,filename);
-    	return 0;
-    }
     for (wm=process->modref_list;wm;wm=wm->next) {
     	LPSTR	xmodname,xdotptr;
 
@@ -251,6 +249,33 @@
 	/* FIXME: add paths, shortname */
 	HeapFree(process->heap,0,xmodname);
     }
+    /* if that fails, try looking for the filename... */
+    for (wm=process->modref_list;wm;wm=wm->next) {
+    	LPSTR	xlname,xdotptr;
+
+	assert (wm->longname);
+	xlname = strrchr(wm->longname,'/');
+	if (!xlname) 
+	    xlname = wm->longname;
+	else
+	    xlname++;
+	xlname = HEAP_strdupA(process->heap,0,xlname);
+	xdotptr=strrchr(xlname,'.');
+	if (	(xdotptr && !dotptr) ||
+		(!xdotptr && dotptr)
+	) {
+	    if (dotptr)	*dotptr		= '\0';
+	    if (xdotptr) *xdotptr	= '\0';
+	}
+	if (!strcasecmp( filename, xlname)) {
+	    HeapFree(process->heap,0,filename);
+	    HeapFree(process->heap,0,xlname);
+	    return wm->module;
+	}
+	if (dotptr) *dotptr='.';
+	/* FIXME: add paths, shortname */
+	HeapFree(process->heap,0,xlname);
+    }
     HeapFree(process->heap,0,filename);
     return 0;
 }
diff --git a/loader/ne/module.c b/loader/ne/module.c
index 148efbc..0bf46e4 100644
--- a/loader/ne/module.c
+++ b/loader/ne/module.c
@@ -21,7 +21,11 @@
 #include "snoop.h"
 #include "debug.h"
 
-static HMODULE16 hFirstModule = 0;
+FARPROC16 (*fnSNOOP16_GetProcAddress16)(HMODULE16,DWORD,FARPROC16) = NULL;
+void (*fnSNOOP16_RegisterDLL)(NE_MODULE*,LPCSTR) = NULL;
+
+#define hFirstModule (pThhook->hExeHead)
+
 static NE_MODULE *pCachedModule = 0;  /* Module cached by NE_OpenFile */
 
 static HMODULE16 NE_LoadBuiltin(LPCSTR name,BOOL32 force) { return 0; }
@@ -330,8 +334,10 @@
     else sel = (WORD)(DWORD)NE_SEG_TABLE(pModule)[sel-1].selector;
     if (sel==0xffff)
 	return (FARPROC16)PTR_SEG_OFF_TO_SEGPTR( sel, offset );
+    if (!fnSNOOP16_GetProcAddress16)
+	return (FARPROC16)PTR_SEG_OFF_TO_SEGPTR( sel, offset );
     else
-	return (FARPROC16)SNOOP16_GetProcAddress16(hModule,ordinal,(FARPROC16)PTR_SEG_OFF_TO_SEGPTR( sel, offset ));
+	return (FARPROC16)fnSNOOP16_GetProcAddress16(hModule,ordinal,(FARPROC16)PTR_SEG_OFF_TO_SEGPTR( sel, offset ));
 }
 
 
@@ -654,7 +660,8 @@
     else pModule->dlls_to_init = 0;
 
     NE_RegisterModule( pModule );
-    SNOOP16_RegisterDLL(pModule,ofs->szPathName);
+    if (fnSNOOP16_RegisterDLL)
+    	fnSNOOP16_RegisterDLL(pModule,ofs->szPathName);
     return hModule;
 }
 
diff --git a/loader/ne/segment.c b/loader/ne/segment.c
index 28caa77..fcaa085 100644
--- a/loader/ne/segment.c
+++ b/loader/ne/segment.c
@@ -105,8 +105,12 @@
         stack16Top->bp = 0;
         stack16Top->ip = 0;
         stack16Top->cs = 0;
+	TRACE(dll,"CallLoadAppSegProc(hmodule=0x%04x,hf=0x%04x,segnum=%d\n",
+		pModule->self,hf,segnum
+	);
  	newselector = Callbacks->CallLoadAppSegProc(selfloadheader->LoadAppSeg,
                                                    pModule->self, hf, segnum );
+	TRACE(dll,"Ret CallLoadAppSegProc: selector = 0x%04x\n",newselector);
         _lclose32( hf );
  	if (newselector != oldselector) {
  	  /* Self loaders like creating their own selectors; 
@@ -410,7 +414,9 @@
         stack16Top->cs = 0;
 
         hf = FILE_DupUnixHandle( NE_OpenFile( pModule ) );
+	TRACE(dll,"CallBootAppProc(hModule=0x%04x,hf=0x%04x)\n",pModule->self,hf);
         Callbacks->CallBootAppProc(selfloadheader->BootApp, pModule->self, hf);
+	TRACE(dll,"Return from CallBootAppProc\n");
         _lclose32(hf);
         /* some BootApp procs overwrite the selector of dgroup */
         pSegTable[pModule->dgroup - 1].selector = saved_dgroup;
diff --git a/loader/pe_image.c b/loader/pe_image.c
index aaf2dec..30273cb 100644
--- a/loader/pe_image.c
+++ b/loader/pe_image.c
@@ -217,7 +217,6 @@
     IMAGE_IMPORT_DESCRIPTOR	*pe_imp;
     WINE_MODREF			*xwm;
     PE_MODREF			*pem;
-    int	fixup_failed		= 0;
     unsigned int load_addr	= wm->module;
     int				i;
     char			*modname;
@@ -247,13 +246,15 @@
  
     /* FIXME: should terminate on 0 Characteristics */
     for (i = 0, pe_imp = pem->pe_import; pe_imp->Name; pe_imp++) {
-    	HMODULE32	res;
-	WINE_MODREF	**ywm;
- 	char		*name = (char *) RVA(pe_imp->Name);
+    	HMODULE32		hImpModule;
+	WINE_MODREF		**ywm;
+	IMAGE_IMPORT_BY_NAME	*pe_name;
+	LPIMAGE_THUNK_DATA	import_list,thunk_list;
+ 	char			*name = (char *) RVA(pe_imp->Name);
 
 	/* don't use MODULE_Load, Win32 creates new task differently */
-	res = PE_LoadLibraryEx32A( name, process, 0, 0 );
-	if (res <= (HMODULE32) 32) {
+	hImpModule = PE_LoadLibraryEx32A( name, process, 0, 0 );
+	if (!hImpModule) {
 	    char *p,buffer[2000];
 	    
 	    /* GetModuleFileName would use the wrong process, so don't use it */
@@ -261,15 +262,15 @@
 	    if (!(p = strrchr (buffer, '\\')))
 		p = buffer;
 	    strcpy (p + 1, name);
-	    res = PE_LoadLibraryEx32A( buffer, process, 0, 0 );
+	    hImpModule = PE_LoadLibraryEx32A( buffer, process, 0, 0 );
 	}
-	if (res <= (HMODULE32) 32) {
+	if (!hImpModule) {
 	    ERR (module, "Module %s not found\n", name);
-	    return res;
+	    return 1;
 	}
 	xwm = wm->next;
 	while (xwm) {
-		if (xwm->module == res)
+		if (xwm->module == hImpModule)
 			break;
 		xwm = xwm->next;
 	}
@@ -296,18 +297,6 @@
 		
 	}
 	i++;
-    }
-    pe_imp = pem->pe_import;
-    while (pe_imp->Name) {
-	char			*Module;
-	IMAGE_IMPORT_BY_NAME	*pe_name;
-	LPIMAGE_THUNK_DATA	import_list,thunk_list;
-        HMODULE32 hImpModule;
-
-	Module = (char *) RVA(pe_imp->Name);
-        hImpModule = MODULE_FindModule32(process,Module);
-	assert(hImpModule); /* we have imported it, so it MUST be there */
-	TRACE(win32, "%s\n", Module);
 
 	/* FIXME: forwarder entries ... */
 
@@ -320,25 +309,23 @@
 		if (IMAGE_SNAP_BY_ORDINAL(import_list->u1.Ordinal)) {
 		    int ordinal = IMAGE_ORDINAL(import_list->u1.Ordinal);
 
-		    TRACE(win32, "--- Ordinal %s,%d\n", Module, ordinal);
+		    TRACE(win32, "--- Ordinal %s,%d\n", name, ordinal);
 		    thunk_list->u1.Function=(LPDWORD)MODULE_GetProcAddress32(
                         process, hImpModule, (LPCSTR)ordinal
 		    );
 		    if (!thunk_list->u1.Function) {
-			WARN(win32,"No implementation for %s.%d, setting to NULL\n",
-				Module, ordinal);
-			/* fixup_failed=1; */
+			ERR(win32,"No implementation for %s.%d, setting to NULL\n",
+				name, ordinal);
 		    }
 		} else {		/* import by name */
 		    pe_name = (LPIMAGE_IMPORT_BY_NAME)RVA(import_list->u1.AddressOfData);
-		    TRACE(win32, "--- %s %s.%d\n", pe_name->Name, Module, pe_name->Hint);
+		    TRACE(win32, "--- %s %s.%d\n", pe_name->Name, name, pe_name->Hint);
 		    thunk_list->u1.Function=(LPDWORD)MODULE_GetProcAddress32(
                         process, hImpModule, pe_name->Name
 		    );
 		    if (!thunk_list->u1.Function) {
-			WARN(win32,"No implementation for %s.%d(%s), setting to NULL\n",
-				Module,pe_name->Hint,pe_name->Name);
-			/* fixup_failed=1; */
+			ERR(win32,"No implementation for %s.%d(%s), setting to NULL\n",
+				name,pe_name->Hint,pe_name->Name);
 		    }
 		}
 		import_list++;
@@ -352,34 +339,30 @@
 		    /* not sure about this branch, but it seems to work */
 		    int ordinal = IMAGE_ORDINAL(thunk_list->u1.Ordinal);
 
-		    TRACE(win32,"--- Ordinal %s.%d\n",Module,ordinal);
+		    TRACE(win32,"--- Ordinal %s.%d\n",name,ordinal);
 		    thunk_list->u1.Function=(LPDWORD)MODULE_GetProcAddress32(
                         process, hImpModule, (LPCSTR) ordinal
 		    );
 		    if (!thunk_list->u1.Function) {
-			WARN(win32, "No implementation for %s.%d, setting to NULL\n",
-				Module,ordinal);
-			/* fixup_failed=1; */
+			ERR(win32, "No implementation for %s.%d, setting to NULL\n",
+				name,ordinal);
 		    }
 		} else {
 		    pe_name=(LPIMAGE_IMPORT_BY_NAME) RVA(thunk_list->u1.AddressOfData);
 		    TRACE(win32,"--- %s %s.%d\n",
-		   		  pe_name->Name,Module,pe_name->Hint);
+		   		  pe_name->Name,name,pe_name->Hint);
 		    thunk_list->u1.Function=(LPDWORD)MODULE_GetProcAddress32(
                         process, hImpModule, pe_name->Name
 		    );
 		    if (!thunk_list->u1.Function) {
-		    	WARN(win32, "No implementation for %s.%d, setting to NULL\n",
-				Module, pe_name->Hint);
-		    	/* fixup_failed=1; */
+		    	ERR(win32, "No implementation for %s.%d, setting to NULL\n",
+				name, pe_name->Hint);
 		    }
 		}
 		thunk_list++;
 	    }
 	}
-	pe_imp++;
     }
-    if (fixup_failed) return 22;
     return 0;
 }
 
diff --git a/loader/task.c b/loader/task.c
index 5483f0f..84d5b1d 100644
--- a/loader/task.c
+++ b/loader/task.c
@@ -32,6 +32,7 @@
 #include "thread.h"
 #include "debug.h"
 #include "dde_proc.h"
+#include "server.h"
 
   /* Min. number of thunks allocated when creating a new segment */
 #define MIN_THUNKS  32
@@ -39,14 +40,30 @@
   /* Pointer to function to switch to a larger stack */
 int (*IF1632_CallLargeStack)( int (*func)(), void *arg ) = NULL;
 
-static HTASK16 hFirstTask = 0;
-static HTASK16 hCurrentTask = 0;
+
+static THHOOK DefaultThhook = { 0 };
+THHOOK *pThhook = &DefaultThhook;
+
+#define hCurrentTask (pThhook->CurTDB)
+#define hFirstTask   (pThhook->HeadTDB)
+#define hLockedTask  (pThhook->LockTDB)
+
 static HTASK16 hTaskToKill = 0;
-static HTASK16 hLockedTask = 0;
 static UINT16 nTaskCount = 0;
 
 static void TASK_YieldToSystem(TDB*);
 
+/***********************************************************************
+ *	     TASK_InstallTHHook
+ */
+void TASK_InstallTHHook( THHOOK *pNewThhook )
+{
+     THHOOK *pOldThhook = pThhook;
+
+     pThhook = pNewThhook? pNewThhook : &DefaultThhook;
+
+     *pThhook = *pOldThhook;
+}
 
 /***********************************************************************
  *	     TASK_GetNextTask
@@ -209,6 +226,7 @@
     SEGTABLEENTRY *pSegTable = NE_SEG_TABLE( pModule );
 
     SET_CUR_THREAD( pTask->thdb );
+    CLIENT_InitThread();
     /* Terminate the stack frame */
     THREAD_STACK16(pTask->thdb)->frame32 = NULL;
     if (pModule->flags & NE_FFLAGS_WIN32)
diff --git a/memory/atom.c b/memory/atom.c
index 6da9694..f2744cb 100644
--- a/memory/atom.c
+++ b/memory/atom.c
@@ -144,6 +144,11 @@
 /***********************************************************************
  *           ATOM_AddAtom
  *
+ * Windows DWORD aligns the atom entry size.
+ * The remaining unused string space created by the alignment
+ * gets padded with '\0's in a certain way to ensure
+ * that at least one trailing '\0' remains.
+ *
  * RETURNS
  *	Atom: Success
  *	0: Failure
@@ -156,7 +161,7 @@
     HANDLE16 entry;
     ATOMENTRY * entryPtr;
     ATOMTABLE * table;
-    int len;
+    int len, ae_len;
 
     if (str[0] == '#') return atoi( &str[1] );  /* Check for integer atom */
     if ((len = strlen( str )) > MAX_ATOM_LEN) len = MAX_ATOM_LEN;
@@ -175,7 +180,8 @@
 	entry = entryPtr->next;
     }
 
-    entry = LOCAL_Alloc( selector, LMEM_FIXED, sizeof(ATOMENTRY)+len-1 );
+    ae_len = (sizeof(ATOMENTRY)+len+3) & ~3;
+    entry = LOCAL_Alloc( selector, LMEM_FIXED, ae_len);
     if (!entry) return 0;
     /* Reload the table ptr in case it moved in linear memory */
     table = ATOM_GetTable( selector, FALSE );
@@ -183,7 +189,7 @@
     entryPtr->next = table->entries[hash];
     entryPtr->refCount = 1;
     entryPtr->length = len;
-    memcpy( entryPtr->str, str, len );
+    strncpy( entryPtr->str, str, ae_len - sizeof(ATOMENTRY) + 1); /* always use strncpy ('\0's padding) */
     table->entries[hash] = entry;
     return HANDLETOATOM( entry );
 }
diff --git a/memory/string.c b/memory/string.c
index 262667f..85f77f2 100644
--- a/memory/string.c
+++ b/memory/string.c
@@ -189,10 +189,7 @@
  *           lstrcmpi32A   (KERNEL32.605)
  */
 INT32 WINAPI lstrcmpi32A( LPCSTR str1, LPCSTR str2 )
-{
-    INT32 res;
-
-    TRACE(string,"strcmpi %s and %s\n",
+{    TRACE(string,"strcmpi %s and %s\n",
 		   debugstr_a (str1), debugstr_a (str2));
     return CompareString32A(LOCALE_SYSTEM_DEFAULT,NORM_IGNORECASE,str1,-1,str2,-1)-2;
 }
@@ -616,3 +613,37 @@
     while ((*d++ = (WCHAR)OEM_TO_ANSI(*s++)));
     return TRUE;
 }
+
+/***********************************************************************
+ *  WideCharToLocal (Not a Windows API)
+ *  similar lstrcpyWtoA, should handle codepages properly
+ *
+ *  RETURNS
+ *    strlen of the destination string
+ */
+ 
+INT32 WINAPI WideCharToLocal32(
+    LPSTR pLocal, 
+		LPWSTR pWide, 
+		INT32 dwChars)
+{ *pLocal = 0;
+  TRACE(string,"(%p, %s, %li)\n",	pLocal, debugstr_w(pWide),dwChars);
+  WideCharToMultiByte(CP_ACP,0,pWide,-1,pLocal,dwChars,NULL,NULL);
+  return strlen(pLocal);
+}
+/***********************************************************************
+ *  LocalToWideChar (Not a Windows API)
+ *  similar lstrcpyAtoW, should handle codepages properly
+ *
+ *  RETURNS
+ *    strlen of the destination string
+ */
+INT32 WINAPI LocalToWideChar32(
+    LPWSTR pWide, 
+		LPSTR pLocal, 
+		INT32 dwChars)
+{ *pWide = 0;
+  TRACE(string,"(%p, %s, %li)\n",pWide,	pLocal, dwChars);
+	MultiByteToWideChar(CP_ACP,0,pLocal,-1,pWide,dwChars); 
+  return lstrlen32W(pWide);
+}
diff --git a/misc/comm.c b/misc/comm.c
index a1f69d3..f0bcc0f 100644
--- a/misc/comm.c
+++ b/misc/comm.c
@@ -14,6 +14,24 @@
  *
  * August 12, 1997.  Take a bash at SetCommEventMask - Lawson Whitney
  *                                     <lawson_whitney@juno.com>
+ * July 6, 1998. Fixes and comments by Valentijn Sessink
+ *                                     <vsessink@ic.uva.nl> [V]
+ *  I only quick-fixed an error for the output buffers. The thing is this: if a
+ * WinApp starts using serial ports, it calls OpenComm, asking it to open two
+ * buffers, cbInQueue and cbOutQueue size, to hold data to/from the serial
+ * ports. Wine OpenComm only returns "OK". Now the kernel buffer size for
+ * serial communication is only 4096 bytes large. Error: (App asks for
+ * a 104,000 bytes size buffer, Wine returns "OK", App asks "How many char's
+ * are in the buffer", Wine returns "4000" and App thinks "OK, another
+ * 100,000 chars left, good!")
+ * The solution below is a bad but working quickfix for the transmit buffer:
+ * the cbInQueue is saved in a variable; when the program asks how many chars
+ * there are in the buffer, GetCommError returns # in buffer PLUS
+ * the additional (cbOutQeueu - 4096), which leaves the application thinking
+ * "wow, almost full".
+ * Sorry for the rather chatty explanation - but I think comm.c needs to be
+ * redefined with real working buffers make it work; maybe these comments are
+ * of help.
  */
 
 #include "config.h"
@@ -56,6 +74,14 @@
  */
 int commerror = 0, eventmask = 0;
 
+/*
+ * [V] If above globals are wrong, the one below will be wrong as well. It
+ * should probably be in the DosDeviceStruct on per port basis too.
+*/
+int iGlobalOutQueueFiller;
+
+#define SERIAL_XMIT_SIZE 4096
+
 struct DosDeviceStruct COM[MAX_PORTS];
 struct DosDeviceStruct LPT[MAX_PORTS];
 LPCVOID *unknown[MAX_PORTS];
@@ -439,6 +465,10 @@
 			ERR(comm, "BUG ! COM0 doesn't exist !\n");
 			commerror = IE_BADID;
 		}
+		
+		/* to help GetCommError return left buffsize [V] */
+		iGlobalOutQueueFiller = (cbOutQueue - SERIAL_XMIT_SIZE);
+		if (iGlobalOutQueueFiller < 0) iGlobalOutQueueFiller = 0;
 
                 TRACE(comm, "%s = %s\n", device, COM[port].devicename);
 
@@ -780,7 +810,7 @@
 
 		rc = ioctl(fd, TIOCOUTQ, &cnt);
 		if (rc) WARN(comm, "Error !\n");
-		lpStat->cbOutQue = cnt;
+		lpStat->cbOutQue = cnt + iGlobalOutQueueFiller;
 
 		rc = ioctl(fd, TIOCINQ, &cnt);
                 if (rc) WARN(comm, "Error !\n");
diff --git a/misc/imagelist.c b/misc/imagelist.c
index 5ca6e24..0514c0f 100644
--- a/misc/imagelist.c
+++ b/misc/imagelist.c
@@ -10,7 +10,7 @@
  *      ILD_TRANSPARENT error in ImageList_DrawIndirect).
  *    - Fix drag functions.
  *    - Fix ImageList_Read and ImageList_Write.
- *    - Add ImageList_SetFilter (undocumented).
+ *    - Fix ImageList_SetFilter (undocumented).
  *      BTW does anybody know anything about this function???
  *        - It removes 12 Bytes from the stack (3 Parameters).
  *        - First parameter SHOULD be a HIMAGELIST.
@@ -31,10 +31,7 @@
  */
 #define __WINE_IMAGELIST_C
  
-/* This must be defined until "GetIconInfo" is implemented completely.
- * To do that the cursor and icon code in objects/cursoricon.c must
- * be rewritten.
- */
+/* This must be defined until "GetIconInfo" is not fully implemented. */
 #define __GET_ICON_INFO_HACK__ 
  
 #include "windows.h"
@@ -1446,21 +1443,23 @@
                                    ptr->bBitsPerPixel,
                                    (char *)(ptr + 1) + ptr->nHeight * 
                                    BITMAP_WIDTH_BYTES(ptr->nWidth, 1));
+        GlobalUnlock16 (handle);
         himl = ImageList_Create (ptr->nWidth, ptr->nHeight,
                                  ILC_MASK | ILC_COLOR, 1, cGrow);
         ImageList_Add (himl, hbmImage, hbmMask);
         DeleteObject32 (hbmImage);
         DeleteObject32 (hbmMask);
-        GlobalUnlock16 (handle);
 #else
         ICONINFO32 ii;
         BITMAP32 bmp;
 
         GetIconInfo (hIcon, &ii);
-        GetObject32A (ii->hbmMask, sizeof(BITMAP32), (LPVOID)&bmp);
+        GetObject32A (ii->hbmColor, sizeof(BITMAP32), (LPVOID)&bmp);
         himl = ImageList_Create (bmp.bmWidth, bmp.bmHeight, 
                                  ILC_MASK | ILC_COLOR, 1, cGrow);
         ImageList_Add (himl, ii->hbmColor, ii->hbmMask);
+        DeleteObject32 (ii->hbmColor);
+        DeleteObject32 (ii->hbmMask);
 #endif
     }
 
@@ -1543,6 +1542,8 @@
         himl = ImageList_Create (bmp.bmWidth, bmp.bmHeight, 
                                  ILC_MASK | ILC_COLOR, 1, cGrow);
         ImageList_Add (himl, ii->hbmColor, ii->hbmMask);
+        DeleteObject32 (ii->hbmColor);
+        DeleteObject32 (ii->hbmMask);
 #endif
     }
 
@@ -1915,6 +1916,8 @@
     BITMAP32 bmp;
 #endif
 
+    TRACE (imagelist, "(0x%x 0x%x 0x%x)\n", himl, i, hIcon);
+
     if (himl == NULL) return (-1);
     if ((i >= himl->cCurImage) || (i < -1)) return (-1);
 
@@ -1922,10 +1925,14 @@
     if (!(ptr = (CURSORICONINFO *)GlobalLock16(hIcon))) return (-1);
     hbmMask  = CreateBitmap32 (ptr->nWidth, ptr->nHeight, 1, 1, 
                                (char *)(ptr + 1));
+    if (!(hbmMask))
+	ERR (imagelist, " no mask!\n");
     hbmImage = CreateBitmap32 (ptr->nWidth, ptr->nHeight, ptr->bPlanes,
                                ptr->bBitsPerPixel,
                                (char *)(ptr + 1) + ptr->nHeight * 
                                BITMAP_WIDTH_BYTES(ptr->nWidth, 1));
+    if (!(hbmMask))
+	ERR (imagelist, " no image!\n");
 #else
     GetIconInfo (hIcon, &ii);
     GetObject32A (ii->hbmMask, sizeof(BITMAP32), (LPVOID)&bmp);
@@ -1970,10 +1977,13 @@
 
     DeleteDC32 (hdcImageList);
     DeleteDC32 (hdcImage);
-#ifdef __GET_ICON_INFO_HACK        
+#ifdef __GET_ICON_INFO_HACK__
     DeleteObject32 (hbmImage);
     DeleteObject32 (hbmMask);
     GlobalUnlock16 (hIcon);
+#else
+    DeleteObject32 (ii->hbmColor);
+    DeleteObject32 (ii->hbmMask);
 #endif
     return (nIndex);
 }
@@ -2071,15 +2081,14 @@
  *     empty stub.
  */
 
-#if 0
 BOOL32 WINAPI
 ImageList_SetFilter (HIMAGELIST himl, INT32 i, DWORD dwFilter)
 {
-    FIXME (imagelist, "empty stub!\n");
+    FIXME (imagelist, "(%p 0x%08x 0x%08x):empty stub!\n",
+	   himl, i, dwFilter);
 
-
+    return FALSE;
 }
-#endif /* 0 */
 
 
 /*************************************************************************
diff --git a/misc/main.c b/misc/main.c
index 9819e55..6a459da 100644
--- a/misc/main.c
+++ b/misc/main.c
@@ -1149,7 +1149,7 @@
 
     case SPI_GETHIGHCONTRAST:
     {
-       LPHIGHCONTRASTA lpHighContrastW = (LPHIGHCONTRASTW)lpvParam;
+       LPHIGHCONTRASTW lpHighContrastW = (LPHIGHCONTRASTW)lpvParam;
 
        FIXME(system,"SPI_GETHIGHCONTRAST not fully implemented\n");
 
@@ -1178,7 +1178,8 @@
 /***********************************************************************
 *	FileCDR (KERNEL.130)
 */
-void WINAPI FileCDR(FARPROC16 x)
+FARPROC16 WINAPI FileCDR(FARPROC16 x)
 {
 	FIXME(file,"(%8x): stub\n", (int) x);
+	return (FARPROC16)TRUE;
 }
diff --git a/misc/network.c b/misc/network.c
index a0eedad..d955016 100644
--- a/misc/network.c
+++ b/misc/network.c
@@ -14,6 +14,7 @@
 #include "wnet.h"
 #include "debug.h"
 #include "win.h"
+#include "heap.h"
 
 /********************************************************************
  *  WNetAddConnection16 [USER.517]  Directs a local device to net
@@ -27,7 +28,9 @@
    return WNetAddConnection32A(lpNetPath, lpPassWord, lpLocalName);
 }
 
-/* [MPR.50] */
+/*********************************************************************
+ *  WNetAddConnection32 [MPR.50] 
+ */
 
 UINT32 WINAPI WNetAddConnection32A(LPCSTR NetPath, LPCSTR PassWord,
 			    LPCSTR LocalName)
@@ -44,6 +47,7 @@
 			    LPCWSTR LocalName)
 {
    FIXME(wnet, " stub!\n");
+   SetLastError(WN_NO_NETWORK);
    return WN_NO_NETWORK;
 }
 
@@ -108,7 +112,32 @@
 				 flags); 
 } 
 
+/*******************************************************************
+ * WNetConnectionDialog1_32A [MPR.59]
+ */
+UINT32 WNetConnectionDialog1_32A (LPCONNECTDLGSTRUCT32A lpConnDlgStruct)
+{ FIXME(wnet,"%p stub\n", lpConnDlgStruct);   
+  SetLastError(WN_NO_NETWORK);
+  return ERROR_NO_NETWORK;
+}
+/*******************************************************************
+ * WNetConnectionDialog1_32W [MPR.60]
+ */ 
+UINT32 WNetConnectionDialog1_32W (LPCONNECTDLGSTRUCT32W lpConnDlgStruct)
+{ FIXME(wnet,"%p stub\n", lpConnDlgStruct);
+  SetLastError(WN_NO_NETWORK);
+  return ERROR_NO_NETWORK;
+}
+ 
+/*******************************************************************
+ * WNetConnectionDialog1_32 [MPR.61]
+ */ 
+UINT32 WNetConnectionDialog1_32(HWND32 owner, DWORD flags  )
+{ FIXME(wnet,"owner = 0x%x, flags=0x%lx stub\n", owner,flags);
+  SetLastError(WN_NO_NETWORK);
+  return ERROR_NO_NETWORK;
 
+}
 /********************************************************************
  *   WNetCancelConnection	[USER.518]  undirects a local device
  */
@@ -285,15 +314,15 @@
  *				WNetGetConnectionW	[MPR.72]
  */
 DWORD WINAPI
-WNetGetConnection32W(LPCWSTR localnameW,LPSTR remotenameW,LPDWORD buflen)
+WNetGetConnection32W(LPCWSTR localnameW,LPWSTR remotenameW,LPDWORD buflen)
 {
 	UINT16	x;
 	CHAR	buf[200];	
 	LPSTR	lnA = HEAP_strdupWtoA(GetProcessHeap(),0,localnameW);
 	DWORD	ret = WNetGetConnection16(lnA,buf,&x);
 
-	*buflen = x; /* FIXME: *2 ? */
 	lstrcpyAtoW(remotenameW,buf);
+	*buflen=lstrlen32W(remotenameW);
 	HeapFree(GetProcessHeap(),0,lnA);
 	return ret;
 }
@@ -572,6 +601,7 @@
 {
 	FIXME(wnet, "(%08lX, %08lX, %08lX, %p, %p): stub\n",
 	      dwScope, dwType, dwUsage, lpNet, lphEnum);
+	SetLastError(WN_NO_NETWORK);
 	return WN_NO_NETWORK;
 }
 
@@ -584,6 +614,7 @@
 	LPNETRESOURCE32A netres,LPVOID buf,LPDWORD buflen,LPSTR systemstr
 ) {
 	FIXME(wnet,"(%p,%p,%p,%p): stub!\n",netres,buf,buflen,systemstr);
+  SetLastError(WN_NO_NETWORK);
 	return WN_NO_NETWORK;
 }
 
@@ -667,4 +698,19 @@
 	FIXME(mpr,"(%lx,%lx): stub\n",x,y);
 	return 1;
 }
+/*****************************************************************
+ *  MultinetGetErrorTextA [MPR.28]
+ */
 
+UINT32 WINAPI MultinetGetErrorText32A (DWORD x, DWORD y, DWORD z)
+{	FIXME(mpr,"(%lx,%lx,%lx): stub\n",x,y,z);
+  return 0;
+}
+/*****************************************************************
+ *  MultinetGetErrorTextW [MPR.29]
+ */
+
+UINT32 WINAPI MultinetGetErrorText32W (DWORD x, DWORD y, DWORD z)
+{	FIXME(mpr,"(%lx,%lx,%lx): stub\n",x,y,z);
+  return 0;
+}
diff --git a/misc/ntdll.c b/misc/ntdll.c
index 169cf45..faee4d8 100644
--- a/misc/ntdll.c
+++ b/misc/ntdll.c
@@ -712,3 +712,9 @@
 	);
 	return 0;
 }
+
+DWORD WINAPI RtlFormatCurrentUserKeyPath()
+{
+    FIXME(ntdll,"(): stub\n");
+    return 1;
+}
diff --git a/misc/printdrv.c b/misc/printdrv.c
index 37a1748..75a6a8f 100644
--- a/misc/printdrv.c
+++ b/misc/printdrv.c
@@ -2,6 +2,7 @@
  * Implementation of some printer driver bits
  * 
  * Copyright 1996 John Harvey
+ * Copyright 1998 Andreas Mohr
  */
 
 #include <stdlib.h>
@@ -12,9 +13,7 @@
 #include "winerror.h"
 #include "winreg.h"
 #include "debug.h"
-
-#define INT_PD_DEFAULT_DEVMODE	1
-#define INT_PD_DEFAULT_MODEL	2
+#include "print.h"
 
 static char PrinterModel[]	= "Printer Model";
 static char DefaultDevMode[]	= "Default DevMode";
@@ -31,7 +30,8 @@
   TRACE(print, "%d %s %s\n",lpdoc->cbSize,
 	(LPSTR)PTR_SEG_TO_LIN(lpdoc->lpszDocName),
 	(LPSTR)PTR_SEG_TO_LIN(lpdoc->lpszOutput));
-  retVal =  Escape16(hdc, STARTDOC, sizeof(DOCINFO16), lpdoc->lpszDocName, 0);
+  retVal =  Escape16(hdc, STARTDOC,
+    strlen((LPSTR)PTR_SEG_TO_LIN(lpdoc->lpszDocName)), lpdoc->lpszDocName, 0);
   TRACE(print,"Escape16 returned %d\n",retVal);
   return retVal;
 }
@@ -100,8 +100,8 @@
     strcpy(RegStr_Printer, Printers);
     strcat(RegStr_Printer, lpPrinter);
 
-    if (((DWORD)lpProfile == INT_PD_DEFAULT_DEVMODE) ||
-    (!lstrcmp32A(lpProfile, DefaultDevMode))) {
+    if (((DWORD)lpProfile == INT_PD_DEFAULT_DEVMODE) || (HIWORD(lpProfile) &&
+    (!strcmp(lpProfile, DefaultDevMode)))) {
 	size = DrvGetPrinterDataInternal(RegStr_Printer, lpPrinterData, cbData);
 	if (size+1) {
 	    *lpNeeded = size;
@@ -111,8 +111,8 @@
 	else res = ERROR_INVALID_PRINTER_NAME;
     }
     else
-    if (((DWORD)lpProfile == INT_PD_DEFAULT_MODEL) ||
-    (!lstrcmp32A(lpProfile, PrinterModel))) {
+    if (((DWORD)lpProfile == INT_PD_DEFAULT_MODEL) || (HIWORD(lpProfile) &&
+    (!strcmp(lpProfile, PrinterModel)))) {
 	*lpNeeded = 32;
 	if (!lpPrinterData) goto failed;
 	if (cbData < 32) {
@@ -130,13 +130,18 @@
 	if ((res = RegOpenKey32A(HKEY_LOCAL_MACHINE, RegStr_Printer, &hkey)))
 	    goto failed;
         cbPrinterAttr = 4;
-	if ((res = RegQueryValueEx32A(hkey, "Attributes", 0, &dwType, (LPBYTE)&PrinterAttr, &cbPrinterAttr)))
+        if ((res = RegQueryValueEx32A(hkey, "Attributes", 0,
+                        &dwType, (LPBYTE)&PrinterAttr, &cbPrinterAttr)))
 	    goto failed;
 	if ((res = RegOpenKey32A(hkey, PrinterDriverData, &hkey2)))
 	    goto failed;
         *lpNeeded = cbData;
-	res = RegQueryValueEx32A(hkey2, lpProfile, 0, lpType, lpPrinterData, lpNeeded);
-	if ((res != ERROR_CANTREAD) && ((PrinterAttr & (0x800|0x10)) == 0x10))
+        res = RegQueryValueEx32A(hkey2, lpProfile, 0,
+                lpType, lpPrinterData, lpNeeded);
+        if ((res != ERROR_CANTREAD) &&
+         ((PrinterAttr &
+        (PRINTER_ATTRIBUTE_ENABLE_BIDI|PRINTER_ATTRIBUTE_NETWORK))
+        == PRINTER_ATTRIBUTE_NETWORK))
         {
 	    if (!(res) && (*lpType == REG_DWORD) && (*(LPDWORD)lpPrinterData == -1))
 	        res = ERROR_INVALID_DATA;
@@ -176,8 +181,8 @@
     TRACE(print,"lpType %08lx\n",lpType);
 
     if ((!lpPrinter) || (!lpProfile) ||
-    ((DWORD)lpProfile == INT_PD_DEFAULT_MODEL) ||
-    (!lstrcmp32A(lpProfile, PrinterModel)))
+    ((DWORD)lpProfile == INT_PD_DEFAULT_MODEL) || (HIWORD(lpProfile) &&
+    (!strcmp(lpProfile, PrinterModel))))
 	return ERROR_INVALID_PARAMETER;
 
     RegStr_Printer = HeapAlloc(GetProcessHeap(), 0,
@@ -185,8 +190,8 @@
     strcpy(RegStr_Printer, Printers);
     strcat(RegStr_Printer, lpPrinter);
 
-    if (((DWORD)lpProfile == INT_PD_DEFAULT_DEVMODE) ||
-    (!lstrcmp32A(lpProfile, DefaultDevMode))) {
+    if (((DWORD)lpProfile == INT_PD_DEFAULT_DEVMODE) || (HIWORD(lpProfile) &&
+    (!strcmp(lpProfile, DefaultDevMode)))) {
 	if (!(RegOpenKey32A(HKEY_LOCAL_MACHINE, RegStr_Printer, &hkey)) ||
 	    (RegSetValueEx32A(hkey, DefaultDevMode, 0, REG_BINARY, lpPrinterData, dwSize)))
 	        res = ERROR_INVALID_PRINTER_NAME;
diff --git a/misc/registry.c b/misc/registry.c
index 01b7498..6f7ff91 100644
--- a/misc/registry.c
+++ b/misc/registry.c
@@ -15,6 +15,7 @@
  * TODO
  *    Security access
  *    Option handling
+ *    Time for RegEnumKey*, RegQueryInfoKey*
  */
 
 #include <stdlib.h>
@@ -2080,7 +2081,7 @@
  *
  * Callpath:
  * RegQueryValue16 -> RegQueryValue32A -> RegQueryValueEx32A \
- *                                          RegQueryValue32W -> RegQueryValueEx32W
+ *                                        RegQueryValue32W -> RegQueryValueEx32W
  */
 
 
@@ -2602,12 +2603,22 @@
  *
  * Callpath:
  * RegEnumKey16 -> RegEnumKey32A -> RegEnumKeyEx32A \
- *                              RegEnumKey32W   -> RegEnumKeyEx32W
+ *                                  RegEnumKey32W   -> RegEnumKeyEx32W
  */
 
 
 /******************************************************************************
  * RegEnumKeyEx32W [ADVAPI32.139]
+ *
+ * PARAMS
+ *    hkey         [I] Handle to key to enumerate
+ *    iSubKey      [I] Index of subkey to enumerate
+ *    lpszName     [O] Buffer for subkey name
+ *    lpcchName    [O] Size of subkey buffer
+ *    lpdwReserved [I] Reserved
+ *    lpszClass    [O] Buffer for class string
+ *    lpcchClass   [O] Size of class buffer
+ *    ft           [O] Time key last written to
  */
 DWORD WINAPI RegEnumKeyEx32W( HKEY hkey, DWORD iSubkey, LPWSTR lpszName,
                               LPDWORD lpcchName, LPDWORD lpdwReserved,
@@ -2626,17 +2637,24 @@
 	if (!lpkey->nextsub)
 		return ERROR_NO_MORE_ITEMS;
 	lpxkey=lpkey->nextsub;
+
+    /* Traverse the subkeys */
 	while (iSubkey && lpxkey) {
 		iSubkey--;
 		lpxkey=lpxkey->next;
 	}
+
 	if (iSubkey || !lpxkey)
 		return ERROR_NO_MORE_ITEMS;
 	if (2*lstrlen32W(lpxkey->keyname)+2>*lpcchName)
 		return ERROR_MORE_DATA;
 	memcpy(lpszName,lpxkey->keyname,lstrlen32W(lpxkey->keyname)*2+2);
+
+        if (*lpcchName)
+            *lpcchName = lstrlen32W(lpszName);
+
 	if (lpszClass) {
-		/* what should we write into it? */
+		/* FIXME: what should we write into it? */
 		*lpszClass	= 0;
 		*lpcchClass	= 2;
 	}
@@ -2749,9 +2767,14 @@
  * RegEnumValue32W [ADVAPI32.142]
  *
  * PARAMS
- *    hkey   [I]
- *    iValue [I]
- *    ...
+ *    hkey        [I] Handle to key to query
+ *    iValue      [I] Index of value to query
+ *    lpszValue   [O] Value string
+ *    lpcchValue  [O] Size of value buffer
+ *    lpdReserved [I] Reserved
+ *    lpdwType    [O] Type code
+ *    lpbData     [O] Value data
+ *    lpcbData    [O] Size of data buffer
  */
 DWORD WINAPI RegEnumValue32W( HKEY hkey, DWORD iValue, LPWSTR lpszValue,
                               LPDWORD lpcchValue, LPDWORD lpdReserved,
@@ -2772,10 +2795,11 @@
     if (!iValue)
         return ERROR_SUCCESS;
 
-	if (lpkey->nrofvalues<=iValue)
-		return ERROR_NO_MORE_ITEMS;
+    if (lpkey->nrofvalues <= iValue)
+        return ERROR_NO_MORE_ITEMS;
 
-	val	= lpkey->values+iValue;
+    /* FIXME: Should this be lpkey->values + iValue * sizeof(KEYVALUE)? */
+    val = lpkey->values + iValue;
 
 	if (val->name) {
 		if (lstrlen32W(val->name)*2+2>*lpcchValue) {
@@ -2788,8 +2812,11 @@
 		*lpszValue	= 0;
 		*lpcchValue	= 0;
 	}
-	if (lpdwType)
-		*lpdwType=val->type;
+
+    /* Can be NULL if the type code is not required */
+    if (lpdwType)
+        *lpdwType = val->type;
+
 	if (lpbData) {
 		if (val->len>*lpcbData)
 			return ERROR_MORE_DATA;
@@ -2811,10 +2838,10 @@
 	LPWSTR	lpszValueW;
 	LPBYTE	lpbDataW;
 	DWORD	ret,lpcbDataW;
+	DWORD dwType;
 
-	TRACE(reg,"(%x,%ld,%p,%p,%p,%p,%p,%p)\n",
-		hkey,iValue,lpszValue,lpcchValue,lpdReserved,lpdwType,lpbData,lpcbData
-	);
+	TRACE(reg,"(%x,%ld,%p,%p,%p,%p,%p,%p)\n",hkey,iValue,lpszValue,lpcchValue,
+		lpdReserved,lpdwType,lpbData,lpcbData);
 
 	lpszValueW = (LPWSTR)xmalloc(*lpcchValue*2);
 	if (lpbData) {
@@ -2822,21 +2849,17 @@
 		lpcbDataW = *lpcbData*2;
 	} else
 		lpbDataW = NULL;
-	ret=RegEnumValue32W(
-		hkey,
-		iValue,
-		lpszValueW,
-		lpcchValue,
-		lpdReserved,
-		lpdwType,
-		lpbDataW,
-		&lpcbDataW
-	);
+
+	ret = RegEnumValue32W( hkey, iValue, lpszValueW, lpcchValue, 
+				lpdReserved, &dwType, lpbDataW, &lpcbDataW );
+
+	if (lpdwType)
+		*lpdwType = dwType;
 
 	if (ret==ERROR_SUCCESS) {
 		lstrcpyWtoA(lpszValue,lpszValueW);
 		if (lpbData) {
-			if ((1<<*lpdwType) & UNICONVMASK) {
+			if ((1<<dwType) & UNICONVMASK) {
 				lstrcpyWtoA(lpbData,(LPWSTR)lpbDataW);
 			} else {
 				if (lpcbDataW > *lpcbData)
@@ -2847,11 +2870,9 @@
 			*lpcbData = lpcbDataW;
 		}
 	}
-	if (lpbDataW)
-		free(lpbDataW);
-	if (lpszValueW)
-		free(lpszValueW);
-	return ret;
+    if (lpbDataW) free(lpbDataW);
+    if (lpszValueW) free(lpszValueW);
+    return ret;
 }
 
 
@@ -2906,8 +2927,8 @@
  * RegDeleteKey32W [ADVAPI32.134]
  *
  * PARAMS
- *    hkey       [I]
- *    lpszSubKey [I]
+ *    hkey       [I] Handle to open key
+ *    lpszSubKey [I] Name of subkey to delete
  *
  * RETURNS
  *    Success: ERROR_SUCCESS
@@ -2925,10 +2946,11 @@
     if (!lpNextKey)
         return ERROR_INVALID_HANDLE;
 
-    /* We need to know the previous key in the hier. */
+    /* Subkey param cannot be NULL */
     if (!lpszSubKey || !*lpszSubKey)
         return ERROR_BADKEY;
 
+    /* We need to know the previous key in the hier. */
 	split_keypath(lpszSubKey,&wps,&wpc);
 	i 	= 0;
 	lpxkey	= lpNextKey;
@@ -3133,28 +3155,37 @@
 
 /* FIXME: lpcchXXXX ... is this counting in WCHARS or in BYTEs ?? */
 
+
 /******************************************************************************
  * RegQueryInfoKey32W [ADVAPI32.153]
+ *
+ * PARAMS
+ *    hkey                   [I] Handle to key to query
+ *    lpszClass              [O] Buffer for class string
+ *    lpcchClass             [O] Size of class string buffer
+ *    lpdwReserved           [I] Reserved
+ *    lpcSubKeys             [I] Buffer for number of subkeys
+ *    lpcchMaxSubKey         [O] Buffer for longest subkey name length
+ *    lpcchMaxClass          [O] Buffer for longest class string length
+ *    lpcValues              [O] Buffer for number of value entries
+ *    lpcchMaxValueName      [O] Buffer for longest value name length
+ *    lpccbMaxValueData      [O] Buffer for longest value data length
+ *    lpcbSecurityDescriptor [O] Buffer for security descriptor length
+ *    ft
  */
-DWORD WINAPI RegQueryInfoKey32W(
-	HKEY	hkey,
-	LPWSTR	lpszClass,
-	LPDWORD	lpcchClass,
-	LPDWORD	lpdwReserved,
-	LPDWORD	lpcSubKeys,
-	LPDWORD	lpcchMaxSubkey,
-	LPDWORD	lpcchMaxClass,
-	LPDWORD	lpcValues,
-	LPDWORD	lpcchMaxValueName,
-	LPDWORD	lpccbMaxValueData,
-	LPDWORD	lpcbSecurityDescriptor,
-	FILETIME	*ft
-) {
+DWORD WINAPI RegQueryInfoKey32W( HKEY hkey, LPWSTR lpszClass, 
+                                 LPDWORD lpcchClass, LPDWORD lpdwReserved,
+                                 LPDWORD lpcSubKeys, LPDWORD lpcchMaxSubkey,
+                                 LPDWORD lpcchMaxClass, LPDWORD lpcValues,
+                                 LPDWORD lpcchMaxValueName, 
+                                 LPDWORD lpccbMaxValueData, 
+                                 LPDWORD lpcbSecurityDescriptor, FILETIME *ft )
+{
 	LPKEYSTRUCT	lpkey,lpxkey;
 	int		nrofkeys,maxsubkey,maxclass,maxvname,maxvdata;
 	int		i;
 
-	TRACE(reg,"(%x,......)\n",hkey);
+	TRACE(reg,"(%x,%p,...)\n",hkey,lpszClass);
 	lpkey = lookup_hkey(hkey);
 	if (!lpkey)
 		return ERROR_INVALID_HANDLE;
@@ -3210,21 +3241,16 @@
 }
 
 
-/* RegQueryInfoKeyA		[ADVAPI32.152] */
-DWORD WINAPI RegQueryInfoKey32A(
-	HKEY	hkey,
-	LPSTR	lpszClass,
-	LPDWORD	lpcchClass,
-	LPDWORD	lpdwReserved,
-	LPDWORD	lpcSubKeys,
-	LPDWORD	lpcchMaxSubkey,
-	LPDWORD	lpcchMaxClass,
-	LPDWORD	lpcValues,
-	LPDWORD	lpcchMaxValueName,
-	LPDWORD	lpccbMaxValueData,
-	LPDWORD	lpcbSecurityDescriptor,
-	FILETIME	*ft
-) {
+/******************************************************************************
+ * RegQueryInfoKey32A [ADVAPI32.152]
+ */
+DWORD WINAPI RegQueryInfoKey32A( HKEY hkey, LPSTR lpszClass, LPDWORD lpcchClass,
+                                 LPDWORD lpdwReserved, LPDWORD lpcSubKeys,
+                                 LPDWORD lpcchMaxSubkey, LPDWORD lpcchMaxClass,
+                                 LPDWORD lpcValues, LPDWORD lpcchMaxValueName,
+                                 LPDWORD lpccbMaxValueData, 
+                                 LPDWORD lpcbSecurityDescriptor, FILETIME *ft )
+{
 	LPWSTR		lpszClassW;
 	DWORD		ret;
 
@@ -3322,16 +3348,21 @@
 {
     LPKEYSTRUCT	lpkey;
 
-    FIXME(reg, "(%x,%ld,%p,%ld): stub\n",hkey,SecurityInformation,
-          pSecurityDescriptor,lpcbSecurityDescriptor?*lpcbSecurityDescriptor:0);
+    TRACE(reg,"(%x,%ld,%p,%ld)\n",hkey,SecurityInformation,pSecurityDescriptor,
+          lpcbSecurityDescriptor?*lpcbSecurityDescriptor:0);
 
     lpkey = lookup_hkey( hkey );
     if (!lpkey)
         return ERROR_INVALID_HANDLE;
 
+    /* FIXME: Check for valid SecurityInformation values */
+
     if (*lpcbSecurityDescriptor < sizeof(*pSecurityDescriptor))
         return ERROR_INSUFFICIENT_BUFFER;
 
+    FIXME(reg, "(%x,%ld,%p,%ld): stub\n",hkey,SecurityInformation,
+          pSecurityDescriptor,lpcbSecurityDescriptor?*lpcbSecurityDescriptor:0);
+
     return ERROR_SUCCESS;
 }
 
@@ -3347,8 +3378,7 @@
 LONG WINAPI RegLoadKey32W( HKEY hkey, LPCWSTR lpszSubKey, LPCWSTR lpszFile )
 {
     LPKEYSTRUCT	lpkey;
-    FIXME(reg,"(%x,%s,%s): stub\n",hkey,debugstr_w(lpszSubKey),
-          debugstr_w(lpszFile));
+    TRACE(reg,"(%x,%s,%s)\n",hkey,debugstr_w(lpszSubKey),debugstr_w(lpszFile));
 
     /* Do this check before the hkey check */
     if (!lpszSubKey || !*lpszSubKey || !lpszFile || !*lpszFile)
@@ -3358,6 +3388,9 @@
     if (!lpkey)
         return ERROR_INVALID_HANDLE;
 
+    FIXME(reg,"(%x,%s,%s): stub\n",hkey,debugstr_w(lpszSubKey),
+          debugstr_w(lpszFile));
+
     return ERROR_SUCCESS;
 }
 
@@ -3392,13 +3425,16 @@
                                      BOOL32 fAsync )
 {
     LPKEYSTRUCT	lpkey;
-    FIXME(reg,"(%x,%i,%ld,%x,%i): stub\n",hkey,fWatchSubTree,fdwNotifyFilter,
+    TRACE(reg,"(%x,%i,%ld,%x,%i)\n",hkey,fWatchSubTree,fdwNotifyFilter,
           hEvent,fAsync);
 
     lpkey = lookup_hkey( hkey );
     if (!lpkey)
         return ERROR_INVALID_HANDLE;
 
+    FIXME(reg,"(%x,%i,%ld,%x,%i): stub\n",hkey,fWatchSubTree,fdwNotifyFilter,
+          hEvent,fAsync);
+
     return ERROR_SUCCESS;
 }
 
@@ -3443,7 +3479,7 @@
 {
     LPKEYSTRUCT	lpkey;
 
-    FIXME(reg, "(%x,%ld,%p): stub\n", hkey, SecurityInfo, pSecurityDesc);
+    TRACE(reg,"(%x,%ld,%p)\n",hkey,SecurityInfo,pSecurityDesc);
 
     /* It seems to perform this check before the hkey check */
     if ((SecurityInfo & OWNER_SECURITY_INFORMATION) ||
@@ -3461,6 +3497,8 @@
     if (!lpkey)
         return ERROR_INVALID_HANDLE;
 
+    FIXME(reg,":(%x,%ld,%p): stub\n",hkey,SecurityInfo,pSecurityDesc);
+
     return ERROR_SUCCESS;
 }
 
@@ -3478,7 +3516,7 @@
 {
     LPKEYSTRUCT	lpkey;
 
-    FIXME(reg, "(%x,%s,%p): stub\n", hkey, debugstr_w(lpFile), sa);
+    TRACE(reg, "(%x,%s,%p)\n", hkey, debugstr_w(lpFile), sa);
 
     /* It appears to do this check before the hkey check */
     if (!lpFile || !*lpFile)
@@ -3488,6 +3526,8 @@
     if (!lpkey)
         return ERROR_INVALID_HANDLE;
 
+    FIXME(reg, "(%x,%s,%p): stub\n", hkey, debugstr_w(lpFile), sa);
+
     return ERROR_SUCCESS;
 }
 
@@ -3517,7 +3557,8 @@
 LONG WINAPI RegRestoreKey32W( HKEY hkey, LPCWSTR lpFile, DWORD dwFlags )
 {
     LPKEYSTRUCT	lpkey;
-    FIXME(reg, "(%x,%s,%ld): stub\n", hkey, debugstr_w(lpFile), dwFlags);
+
+    TRACE(reg, "(%x,%s,%ld)\n",hkey,debugstr_w(lpFile),dwFlags);
 
     /* It seems to do this check before the hkey check */
     if (!lpFile || !*lpFile)
@@ -3527,6 +3568,8 @@
     if (!lpkey)
         return ERROR_INVALID_HANDLE;
 
+    FIXME(reg,"(%x,%s,%ld): stub\n",hkey,debugstr_w(lpFile),dwFlags);
+
     /* Check for file existence */
 
     return ERROR_SUCCESS;
@@ -3560,13 +3603,16 @@
 {
     LPKEYSTRUCT	lpkey;
 
-    FIXME(reg, "(%x,%s,%s,%s): stub\n", hkey, debugstr_w(lpSubKey), 
+    TRACE(reg,"(%x,%s,%s,%s)\n",hkey,debugstr_w(lpSubKey),
           debugstr_w(lpNewFile),debugstr_w(lpOldFile));
 
     lpkey = lookup_hkey( hkey );
     if (!lpkey)
         return ERROR_INVALID_HANDLE;
 
+    FIXME(reg, "(%x,%s,%s,%s): stub\n", hkey, debugstr_w(lpSubKey), 
+          debugstr_w(lpNewFile),debugstr_w(lpOldFile));
+
     return ERROR_SUCCESS;
 }
 
diff --git a/misc/shell.c b/misc/shell.c
index b140083..75d830f 100644
--- a/misc/shell.c
+++ b/misc/shell.c
@@ -1,6 +1,8 @@
 /*
  * 				Shell Library Functions
  *
+ *  1998 Marcus Meissner
+ *  1998 Juergen Schmied (jsch)
  *  currently work in progress on SH* and SHELL32_DllGetClassObject functions
  *  <contact juergen.schmied@metronet.de 980624>
  */
@@ -27,12 +29,18 @@
 #include "debug.h"
 #include "winreg.h"
 
+/* FIXME should be moved to a header file. IsEqualGUID 
+is declared but not exported in compobj.c !!!*/
+#define IsEqualGUID(rguid1, rguid2) (!memcmp(rguid1, rguid2, sizeof(GUID)))
+#define IsEqualIID(riid1, riid2) IsEqualGUID(riid1, riid2)
+#define IsEqualCLSID(rclsid1, rclsid2) IsEqualGUID(rclsid1, rclsid2)
+
 static const char * const SHELL_People[] =
 {
     "Bob Amstadt",
     "Dag Asheim",
     "Martin Ayotte",
-    "Karl Backstr\366m",
+    "Karl Backström",
     "Peter Bajusz",
     "Marcel Baur",
     "Georg Beyerle",
@@ -81,6 +89,7 @@
     "Pavel Kankovsky",
     "Jochen Karrer",
     "Andreas Kirschbaum",
+    "Rein Klazes",
     "Albrecht Kleine",
     "Eric Kohl",
     "Jon Konrath",
@@ -90,6 +99,7 @@
     "Scott A. Laird",
     "David Lee Lambert",
     "Andrew Lewycky",
+    "Per Lindström",
     "Martin von Loewis",
     "Michiel van Loon",
     "Kenneth MacDonald",
@@ -126,6 +136,7 @@
     "Peter Schlaile",
     "Ulrich Schmid",
     "Bernd Schmidt",
+    "Juergen Schmied",
     "Ingo Schneider",
     "Victor Schneider",
     "Yngvi Sigurjonsson",
@@ -1574,65 +1585,88 @@
 }
 
 /*************************************************************************
- *			 SHELL32_DllGetClassObject   [SHELL32.14]
+ * SHELL32_DllGetClassObject   [SHELL32.128]
  *
- * http://premium.microsoft.com/msdn/library/sdkdoc/api2_48fo.htm
+ * [Standart OLE/COM Interface Method]
+ * This Function retrives the pointer to a specified interface (iid) of
+ * a given class (rclsid).
+ * With this pointer it's possible to call the IClassFactory_CreateInstance
+ * method to get a instance of the requested Class.
+ * This function does NOT instantiate the Class!!!
+ * 
+ * RETURNS
+ *   HRESULT
+ *
  */
 DWORD WINAPI SHELL32_DllGetClassObject(REFCLSID rclsid,REFIID iid,LPVOID *ppv)
-{
-    char	xclsid[50],xiid[50];
-    HRESULT	hres = E_OUTOFMEMORY;
+{ HRESULT	hres = E_OUTOFMEMORY;
+  LPCLASSFACTORY lpclf;
 
+  char	xclsid[50],xiid[50];
+  WINE_StringFromCLSID((LPCLSID)rclsid,xclsid);
+  WINE_StringFromCLSID((LPCLSID)iid,xiid);
+  TRACE(shell,"\n\tCLSID:\t%s,\n\tIID:\t%s\n",xclsid,xiid);
+	
+  *ppv = NULL;
+	if(IsEqualCLSID(rclsid, &CLSID_ShellDesktop)|| 
+	   IsEqualCLSID(rclsid, &CLSID_ShellLink))
+	{ if(IsEqualCLSID(rclsid, &CLSID_ShellDesktop))      /*debug*/
+	    TRACE(shell,"requested CLSID_ShellDesktop\n");
+	  if(IsEqualCLSID(rclsid, &CLSID_ShellLink))         /*debug*/
+	    TRACE(shell,"requested CLSID_ShellLink\n");
 
-    WINE_StringFromCLSID((LPCLSID)rclsid,xclsid);
-    WINE_StringFromCLSID((LPCLSID)iid,xiid);
-    TRACE(shell,"(%s,%s,%p)\n",xclsid,xiid,ppv);
-
-    *ppv = NULL;
-/* SDK example code looks like this:
- *
-    HRESULT	hres = E_OUTOFMEMORY;
-
-    *ppv = NULL;
-    CClassFactory *pClassFactory = new CClassFactory(rclsid);
-    
-    if (pClassFactory) {
-    	hRes = pClassFactory->QueryInterface(riid,ppv);
-		pClassFactory->Release();
-    }
-    return hRes;
- *
- * The magic of the whole stuff is still unclear to me, so just hack together 
- * 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 S_OK;
+    /* fixme: the IClassFactory_Constructor at the moment only 
+		 for rclsid=CLSID_ShellDesktop, so we get the right Interface (jsch)*/
+	  lpclf = IClassFactory_Constructor();
+    if(lpclf)
+    { hres = lpclf->lpvtbl->fnQueryInterface(lpclf,iid, ppv);
+		  lpclf->lpvtbl->fnRelease(lpclf);
+		}
 	}
-
-	FIXME(shell, "clsid(%s) not found, return CLASS_E_CLASSNOTAVAILABLE.\n",xclsid);
-	*ppv=NULL;
-	return CLASS_E_CLASSNOTAVAILABLE;
+	else
+  { WARN(shell, "clsid(%s) not in buildin SHELL32\n",xclsid);
+    hres = CLASS_E_CLASSNOTAVAILABLE;
+	}
+  TRACE(shell,"RETURN pointer to interface: %p\n",ppv);
+  return hres;
 }
 
 /*************************************************************************
- *			 SHGetDesktopFolder		[SHELL32.216]
- * returns the interface to the shell desktop folder.
+ *  SHGetDesktopFolder		[SHELL32.216]
+ * 
+ *  SDK header win95/shlobj.h: This is equivalent to call CoCreateInstance with
+ *  CLSID_ShellDesktop
+ *  CoCreateInstance(CLSID_Desktop, NULL, CLSCTX_INPROC, IID_IShellFolder, &pshf);
  *
- * [SDK header win95/shlobj.h: This is equivalent to call CoCreateInstance with
- *  CLSID_ShellDesktop.
+ * RETURNS
+ *   the interface to the shell desktop folder.
  *
- *  CoCreateInstance(CLSID_Desktop, NULL,
- *                   CLSCTX_INPROC, IID_IShellFolder, &pshf);
- * ]
- * So what we are doing is currently wrong....
  */
-DWORD WINAPI SHGetDesktopFolder(LPSHELLFOLDER *shellfolder) {
-	*shellfolder = IShellFolder_Constructor();
-	return NOERROR;
+LPSHELLFOLDER pdesktopfolder=NULL;
+
+DWORD WINAPI SHGetDesktopFolder(LPSHELLFOLDER *shellfolder)
+{ HRESULT	hres = E_OUTOFMEMORY;
+  LPCLASSFACTORY lpclf;
+	TRACE(shell,"%p->(%p)\n",shellfolder,*shellfolder);
+	
+  if (pdesktopfolder)
+	{ *shellfolder = pdesktopfolder;
+	  hres = NOERROR;
+	}
+  else
+	{ lpclf = IClassFactory_Constructor();
+    /* fixme: the buildin IClassFactory_Constructor is at the moment only 
+ 		for rclsid=CLSID_ShellDesktop, so we get the right Interface (jsch)*/
+    if(lpclf)
+    { hres = lpclf->lpvtbl->fnCreateInstance(lpclf,NULL,(REFIID)&IID_IShellFolder, (void*)&pdesktopfolder);
+	 	  lpclf->lpvtbl->fnRelease(lpclf);
+	  }  
+	}	
+	if (pdesktopfolder)
+	{ *shellfolder = pdesktopfolder;	
+	}
+  TRACE(shell,"-- %p->(%p)\n",shellfolder, *shellfolder);
+	return hres;
 }
 
 /*************************************************************************
@@ -1645,61 +1679,95 @@
  * What we are currently doing is not very wrong, since we always use the same
  * heap (ProcessHeap).
  */
-DWORD WINAPI SHGetMalloc(LPMALLOC32 *lpmal) {
-	TRACE(shell,"(%p)\n", lpmal);
+DWORD WINAPI SHGetMalloc(LPMALLOC32 *lpmal) 
+{	TRACE(shell,"(%p)\n", lpmal);
 	return CoGetMalloc32(0,lpmal);
 }
 
 /*************************************************************************
  *			 SHGetSpecialFolderLocation	[SHELL32.223]
- * returns the PIDL of a special folder
+ *  nFolder is a CSIDL_xxxxx.
  *
- * nFolder is a CSIDL_xxxxx.
+ * RETURNS
+ *    returns the PIDL of a special folder
+ *
+ * FIXME
+ *   the path is every time x:\\windows\\desktop
+ *   we should get the path's from the registry
  */
-HRESULT WINAPI SHGetSpecialFolderLocation(HWND32 hwndOwner, INT32 nFolder, LPITEMIDLIST * ppidl)
-{	FIXME(shell,"(%04x,%d,%p),stub!\n", hwndOwner,nFolder,ppidl);
+HRESULT WINAPI SHGetSpecialFolderLocation(
+    HWND32 hwndOwner,
+		INT32 nFolder,
+    LPITEMIDLIST * ppidl)
+{	LPSHELLFOLDER shellfolder;
+  DWORD  pchEaten;
+	CHAR   pszTemp[256];
+	LPWSTR lpszDisplayName = (LPWSTR)&pszTemp[0];
+	
+  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;
+  LocalToWideChar32(lpszDisplayName, "x:\\windows\\desktop\\", 256);
+  
+	if (SHGetDesktopFolder(&shellfolder)==S_OK)
+	{ shellfolder->lpvtbl->fnParseDisplayName(shellfolder,hwndOwner,
+	NULL,lpszDisplayName,&pchEaten,ppidl,NULL);
 	}
 
-	*ppidl = (LPITEMIDLIST)HeapAlloc(GetProcessHeap(),0,sizeof(ITEMIDLIST));
-	(*ppidl)->mkid.cb = 0;		/*the first ITEMIDLIST*/
+	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;
+	}
 
-	FIXME(shell, "return empty ITEMIDLIST only (pidl %p)\n",*ppidl);
+	TRACE(shell, "-- (new pidl %p)\n",*ppidl);
 
 	return NOERROR;
 }
@@ -1709,8 +1777,16 @@
  * returns the path from a passed PIDL.
  */
 BOOL32 WINAPI SHGetPathFromIDList(LPCITEMIDLIST pidl,LPSTR pszPath) 
-{	FIXME(shell,"(pidl %p,%p),stub, returning E:\\\\ \n",pidl,pszPath);
-	strcpy(pszPath,"E:\\"); /* FIXME */
+{ STRRET lpName;
+	LPSHELLFOLDER shellfolder;
+	TRACE(shell,"(pidl=%p,%p)\n",pidl,pszPath);
+
+	if (SHGetDesktopFolder(&shellfolder)==S_OK)
+	{ shellfolder->lpvtbl->fnGetDisplayNameOf(shellfolder,pidl,SHGDN_FORPARSING,&lpName);
+	}
+  WideCharToLocal32(pszPath, lpName.u.pOleStr, MAX_PATH);
+	/* fixme free the olestring*/
+	TRACE(shell,"-- (%s)\n",pszPath);
 	return NOERROR;
 }
 
@@ -1721,14 +1797,25 @@
 
 DWORD WINAPI
 SHHelpShortcuts_RunDLL (DWORD dwArg1, DWORD dwArg2, DWORD dwArg3, DWORD dwArg4)
+{ FIXME (exec, "(%lx, %lx, %lx, %lx) empty stub!\n",
+	dwArg1, dwArg2, dwArg3, dwArg4);
+
+  return 0;
+}
+
+/*************************************************************************
+ * SHLoadInProc [SHELL32.225]
+ *
+ */
+
+DWORD WINAPI
+SHLoadInProc (DWORD dwArg1)
 {
-    FIXME (exec, "(%lx, %lx, %lx, %lx) empty stub!\n",
-	   dwArg1, dwArg2, dwArg3, dwArg4);
+    FIXME (shell, "(%lx) empty stub!\n", dwArg1);
 
     return 0;
 }
 
-
 /*************************************************************************
  * SHBrowseForFolderA [SHELL32.209]
  *
@@ -1736,10 +1823,8 @@
 
 LPITEMIDLIST WINAPI
 SHBrowseForFolder32A (LPBROWSEINFO32A lpbi)
-{
-    FIXME (exec, "(%lx) empty stub!\n", (DWORD)lpbi);
-    FIXME (exec, "(%s) empty stub!\n", lpbi->lpszTitle);
-
-    return NULL;
+{ FIXME (shell, "(%lx) empty stub!\n", (DWORD)lpbi);
+  FIXME (shell, "(%s) empty stub!\n", lpbi->lpszTitle);
+  return NULL;
 }
 
diff --git a/misc/shellord.c b/misc/shellord.c
index 432e5ca..2f6a343 100644
--- a/misc/shellord.c
+++ b/misc/shellord.c
@@ -31,24 +31,32 @@
 #include "winreg.h"
 
 /*************************************************************************
- *	 		 SHELL32_2   			[SHELL32.2]
+ * SHChangeNotifyRegister [SHELL32.2]
  */
-DWORD WINAPI SHELL32_2(HWND32 hwnd,DWORD x2,DWORD x3,DWORD x4,DWORD x5,DWORD x6) {
+DWORD WINAPI
+SHChangeNotifyRegister(HWND32 hwnd,DWORD x2,DWORD x3,DWORD x4,DWORD x5,DWORD x6) {
 	FIXME(shell,"(0x%04x,0x%08lx,0x%08lx,0x%08lx,0x%08lx,0x%08lx):stub.\n",
 		hwnd,x2,x3,x4,x5,x6
 	);
 	return 0;
 }
+
 /*************************************************************************
- *	 		 SHELL32_16   			[SHELL32.16]
- * find_lastitem_in_itemidlist()
- *
- * NOTES
- *     Original name: ILFindLast (exported by ordinal)
+ *	 		 ILGetDisplayName			[SHELL32.15]
+ * get_path_from_itemlist(itemlist,path); ? not sure...
  */
-LPSHITEMID WINAPI SHELL32_16(LPITEMIDLIST iil) {
+BOOL32 WINAPI ILGetDisplayName(LPCITEMIDLIST iil,LPSTR path) {
+	FIXME(shell,"(%p,%p),stub, return e:!\n",iil,path);
+	strcpy(path,"e:\\");
+	return TRUE;
+}
+/*************************************************************************
+ * ILFindLastID [SHELL32.16]
+ */
+LPSHITEMID WINAPI ILFindLastID(LPITEMIDLIST iil) {
 	LPSHITEMID	lastsii,sii;
 
+  TRACE(shell,"%p\n",iil);
 	if (!iil)
 		return NULL;
 	sii = &(iil->mkid);
@@ -61,13 +69,10 @@
 }
 
 /*************************************************************************
- *	 		 SHELL32_29   			[SHELL32.29]
- * is_rootdir(const char*path)
- *
- * NOTES
- *     Original Name: PathIsRoot
+ * PathIsRoot [SHELL32.29]
  */
-BOOL32 WINAPI SHELL32_29(LPCSTR x) {
+BOOL32 WINAPI PathIsRoot(LPCSTR x) {
+  TRACE(shell,"%s\n",x);
 	if (!strcmp(x+1,":\\"))		/* "X:\" */
 		return 1;
 	if (!strcmp(x,"\\"))		/* "\" */
@@ -86,25 +91,24 @@
 }
 
 /*************************************************************************
- *	 		 SHELL32_30   			[SHELL32.30]
- * get_rootdir(char*path,int drive)
- *
- * NOTES
- *     Original Name: PathBuildRoot
+ * PathBuildRoot [SHELL32.30]
  */
-LPSTR WINAPI SHELL32_30(LPSTR root,BYTE drive) {
+LPSTR WINAPI PathBuildRoot(LPSTR root,BYTE drive) {
+  TRACE(shell,"%p %i\n",root, drive);
 	strcpy(root,"A:\\");
 	root[0]+=drive;
 	return root;
 }
 
 /*************************************************************************
- *					SHELL32_31      [SHELL32.31]
- * returns pointer to last . in last pathcomponent or at \0.
+ * PathFindExtension [SHELL32.31]
+ *
+ * NOTES
+ *     returns pointer to last . in last pathcomponent or at \0.
  */
-LPSTR WINAPI SHELL32_31(LPSTR path) {
-    LPSTR   lastpoint = NULL;
-
+LPSTR WINAPI PathFindExtension(LPSTR path) {
+  LPSTR   lastpoint = NULL;
+  TRACE(shell,"%p %s\n",path,path);
     while (*path) {
 	if (*path=='\\'||*path==' ')
 	    lastpoint=NULL;
@@ -116,12 +120,14 @@
 }
 
 /*************************************************************************
- *				SHELL32_32	[SHELL32.32]
- * append \ if there is none
+ * PathAddBackslash [SHELL32.32]
+ * 
+ * NOTES
+ *     append \ if there is none
  */
-LPSTR WINAPI SHELL32_32(LPSTR path) {
+LPSTR WINAPI PathAddBackslash(LPSTR path) {
     int len;
-
+  TRACE(shell,"%p->%s\n",path,path);
     len = lstrlen32A(path);
     if (len && path[len-1]!='\\') {
     	path[len+0]='\\';
@@ -132,12 +138,14 @@
 }
 
 /*************************************************************************
- *				SHELL32_33      [SHELL32.33]
- * remove spaces from beginning and end of passed string
+ * PathRemoveBlanks [SHELL32.33]
+ * 
+ * NOTES
+ *     remove spaces from beginning and end of passed string
  */
-LPSTR WINAPI SHELL32_33(LPSTR str) {
+LPSTR WINAPI PathRemoveBlanks(LPSTR str) {
     LPSTR x = str;
-
+  TRACE(shell,"PathRemoveBlanks %s\n",str);
     while (*x==' ') x++;
     if (x!=str)
 	lstrcpy32A(str,x);
@@ -153,12 +161,14 @@
 
 
 /*************************************************************************
- *				SHELL32_34	[SHELL32.34]
- * basename(char *fn);
+ * PathFindFilename [SHELL32.34]
+ * 
+ * NOTES
+ *     basename(char *fn);
  */
-LPSTR WINAPI SHELL32_34(LPSTR fn) {
+LPSTR WINAPI PathFindFilename(LPSTR fn) {
     LPSTR basefn;
-
+  TRACE(shell,"PathFindFilename %s\n",fn);
     basefn = fn;
     while (fn[0]) {
     	if (((fn[0]=='\\') || (fn[0]==':')) && fn[1] && fn[1]!='\\')
@@ -169,16 +179,18 @@
 }
 
 /*************************************************************************
- *	 		 SHELL32_35   			[SHELL32.35]
- * bool getpath(char *pathname); truncates passed argument to a valid path
- * returns if the string was modified or not.
- * "\foo\xx\foo"-> "\foo\xx"
- * "\"		-> "\"
- * "a:\foo"	-> "a:\"
+ * PathRemoveFileSpec [SHELL32.35]
+ * 
+ * NOTES
+ *     bool getpath(char *pathname); truncates passed argument to a valid path
+ *     returns if the string was modified or not.
+ *     "\foo\xx\foo"-> "\foo\xx"
+ *     "\" -> "\"
+ *     "a:\foo"	-> "a:\"
  */
-DWORD WINAPI SHELL32_35(LPSTR fn) {
+DWORD WINAPI PathRemoveFileSpec(LPSTR fn) {
 	LPSTR	x,cutplace;
-
+  TRACE(shell,"%s\n",fn);
 	if (!fn[0])
 		return 0;
 	x=fn;
@@ -211,71 +223,84 @@
 }
 
 /*************************************************************************
- *				SHELL32_37	[SHELL32.37]
- * concat_paths(char*target,const char*add);
- * concats "target\\add" and writes them to target
+ * PathCombine [SHELL32.37]
+ * 
+ * NOTES
+ *     concat_paths(char*target,const char*add);
+ *     concats "target\\add" and writes them to target
  */
-LPSTR WINAPI SHELL32_37(LPSTR target,LPSTR x1,LPSTR x2) {
+LPSTR WINAPI PathCombine(LPSTR target,LPSTR x1,LPSTR x2) {
 	char	buf[260];
-
+  TRACE(shell,"%s %s\n",x1,x2);
 	if (!x2 || !x2[0]) {
 		lstrcpy32A(target,x1);
 		return target;
 	}
 	lstrcpy32A(buf,x1);
-	SHELL32_32(buf); /* append \ if not there */
+	PathAddBackslash(buf); /* append \ if not there */
 	lstrcat32A(buf,x2);
 	lstrcpy32A(target,buf);
 	return target;
 }
 
 /*************************************************************************
- *				SHELL32_36	[SHELL32.36]
- * concat_paths(char*target,const char*add);
- * concats "target\\add" and writes them to target
+ * PathAppend [SHELL32.36]
+ * 
+ * NOTES
+ *     concat_paths(char*target,const char*add);
+ *     concats "target\\add" and writes them to target
  */
-LPSTR WINAPI SHELL32_36(LPSTR x1,LPSTR x2) {
+LPSTR WINAPI PathAppend(LPSTR x1,LPSTR x2) {
+  TRACE(shell,"%s %s\n",x1,x2);
 	while (x2[0]=='\\') x2++;
-	return SHELL32_37(x1,x1,x2);
+	return PathCombine(x1,x1,x2);
 }
 
 /*************************************************************************
- *				SHELL32_39	[SHELL32.39]
- * isUNC(const char*path);
+ * PathIsUNC [SHELL32.39]
+ * 
+ * NOTES
+ *     isUNC(const char*path);
  */
-BOOL32 WINAPI SHELL32_39(LPCSTR path) {
+BOOL32 WINAPI PathIsUNC(LPCSTR path) {
+  TRACE(shell,"%s\n",path);
 	if ((path[0]=='\\') && (path[1]=='\\'))
 		return TRUE;
 	return FALSE;
 }
 
 /*************************************************************************
- *				SHELL32_45	[SHELL32.45]
- * file_exists(char *fn);
+ * PathFileExists [SHELL32.45]
+ * 
+ * NOTES
+ *     file_exists(char *fn);
  */
-BOOL32 WINAPI SHELL32_45(LPSTR fn) {
-    if (GetFileAttributes32A(fn)==-1)
+BOOL32 WINAPI PathFileExists(LPSTR fn) {
+  TRACE(shell,"%s\n",fn);
+   if (GetFileAttributes32A(fn)==-1)
     	return FALSE;
     else
     	return TRUE;
 }
 
 /*************************************************************************
- *				SHELL32_51	[SHELL32.51]
+ * PathResolve [SHELL32.51]
  */
-DWORD WINAPI SHELL32_51(LPCSTR s,DWORD x2,DWORD x3) {
+DWORD WINAPI PathResolve(LPCSTR s,DWORD x2,DWORD x3) {
 	FIXME(shell,"(%s,0x%08lx,0x%08lx),stub!\n",s,x2,x3);
 	return 0;
 }
 
 /*************************************************************************
- *				SHELL32_52	[SHELL32.52]
- * look for next arg in string. handle "quoted" strings
- * returns pointer to argument *AFTER* the space. Or to the \0.
+ * PathGetArgs [SHELL32.52]
+ *
+ * NOTES
+ *     look for next arg in string. handle "quoted" strings
+ *     returns pointer to argument *AFTER* the space. Or to the \0.
  */
-LPSTR WINAPI SHELL32_52(LPSTR cmdline) {
+LPSTR WINAPI PathGetArgs(LPSTR cmdline) {
     BOOL32	qflag = FALSE;
-
+  TRACE(shell,"%s\n",cmdline);
     while (*cmdline) {
     	if ((*cmdline==' ') && !qflag)
 		return cmdline+1;
@@ -287,12 +312,14 @@
 }
 
 /*************************************************************************
- *				SHELL32_56      [SHELL32.56]
- * unquote string (remove ")
+ * PathUnquoteSpaces [SHELL32.56]
+ * 
+ * NOTES
+ *     unquote string (remove ")
  */
-VOID WINAPI SHELL32_56(LPSTR str) {
+VOID WINAPI PathUnquoteSpaces(LPSTR str) {
     DWORD      len = lstrlen32A(str);
-
+    TRACE(shell,"%s\n",str);
     if (*str!='"') return;
     if (str[len-1]!='"') return;
     str[len-1]='\0';
@@ -301,9 +328,10 @@
 }
 
 /*************************************************************************
- *	 		 SHELL32_58   			[SHELL32.58]
+ * ParseField [SHELL32.58]
+ *
  */
-DWORD WINAPI SHELL32_58(LPCSTR src,DWORD x2,LPSTR target,DWORD pathlen) {
+DWORD WINAPI ParseField(LPCSTR src,DWORD x2,LPSTR target,DWORD pathlen) {
 	FIXME(shell,"(%s,0x%08lx,%p,%ld):stub.\n",
 		src,x2,target,pathlen
 	);
@@ -313,17 +341,19 @@
 }
 
 /*************************************************************************
- *	 		 SHELL32_62   			[SHELL32.62]
+ * PickIconDlg [SHELL32.62]
+ * 
  */
-DWORD WINAPI SHELL32_62(DWORD x,DWORD y,DWORD z,DWORD a) {
+DWORD WINAPI PickIconDlg(DWORD x,DWORD y,DWORD z,DWORD a) {
 	FIXME(shell,"(%08lx,%08lx,%08lx,%08lx):stub.\n",x,y,z,a);
 	return 0xffffffff;
 }
 
 /*************************************************************************
- *                      SHELL32_63                     [SHELL32.63]
+ * GetFileNameFromBrowse [SHELL32.63]
+ * 
  */
-DWORD WINAPI SHELL32_63(HWND32 howner, LPSTR targetbuf, DWORD len, DWORD x, LPCSTR suffix, LPCSTR y, LPCSTR cmd) {
+DWORD WINAPI GetFileNameFromBrowse(HWND32 howner, LPSTR targetbuf, DWORD len, DWORD x, LPCSTR suffix, LPCSTR y, LPCSTR cmd) {
     FIXME(shell,"(%04x,%p,%ld,%08lx,%s,%s,%s):stub.\n",
 	    howner,targetbuf,len,x,suffix,y,cmd
     );
@@ -334,36 +364,42 @@
 }
 
 /*************************************************************************
- *                      SHELL32_68                     [SHELL32.68]
+ * SHGetSettings [SHELL32.68]
+ * 
  */
-DWORD WINAPI SHELL32_68(DWORD x,DWORD y,DWORD z) {
+DWORD WINAPI SHGetSettings(DWORD x,DWORD y,DWORD z) {
 	FIXME(shell,"(0x%08lx,0x%08lx,0x%08lx):stub.\n",
 		x,y,z
 	);
 	return 0;
 }
 /*************************************************************************
- *			 SHELL32_71   			[SHELL32.71]
- * returns internal shell values in the passed pointers
+ * Shell_GetImageList [SHELL32.71]
+ * 
+ * NOTES
+ *     returns internal shell values in the passed pointers
  */
-BOOL32 WINAPI SHELL32_71(LPDWORD x,LPDWORD y) {
+BOOL32 WINAPI Shell_GetImageList(LPDWORD x,LPDWORD y) {
 
 	FIXME(shell,"(%p,%p):stub.\n",x,y);
 	return TRUE;
 }
 
 /*************************************************************************
- *			 SHELL32_72   			[SHELL32.72]
- * dunno. something with icons
+ * Shell_GetCachedImageIndex [SHELL32.72]
+ *
  */
-void WINAPI SHELL32_72(LPSTR x,DWORD y,DWORD z) {
+void WINAPI Shell_GetCachedImageIndex(LPSTR x,DWORD y,DWORD z) {
 	FIXME(shell,"(%s,%08lx,%08lx):stub.\n",x,y,z);
 }
 
 /*************************************************************************
- *			 SHELL32_89   			[SHELL32.89]
+ * SHCloneSpecialIDList [SHELL32.89]
+ * 
+ * NOTES
+ *     exported by ordinal
  */
-DWORD WINAPI SHELL32_89(DWORD x1,DWORD x2,DWORD x3) {
+DWORD WINAPI SHCloneSpecialIDList(DWORD x1,DWORD x2,DWORD x3) {
 	FIXME(shell,"(0x%08lx,0x%08lx,0x%08lx):stub.\n",
 		x1,x2,x3
 	);
@@ -371,58 +407,70 @@
 }
 
 /*************************************************************************
- *				SHELL32_119	[SHELL32.119]
- * unknown
+ * IsLFNDrive [SHELL32.119]
+ * 
+ * NOTES
+ *     exported by ordinal Name
  */
-void WINAPI SHELL32_119(LPVOID x) {
+void WINAPI IsLFNDrive(LPVOID x) {
     FIXME(shell,"(%p(%s)):stub.\n",x,(char *)x);
 }
 
 /*************************************************************************
- *				SHELL32_175	[SHELL32.175]
- * unknown
+ * SHGetSpecialFolderPath [SHELL32.175]
+ * 
+ * NOTES
+ *     exported by ordinal
  */
-void WINAPI SHELL32_175(DWORD x1,DWORD x2,DWORD x3,DWORD x4) {
+void WINAPI SHGetSpecialFolderPath(DWORD x1,DWORD x2,DWORD x3,DWORD x4) {
     FIXME(shell,"(0x%08lx,0x%08lx,0x%08lx,0x%08lx):stub.\n",
     	x1,x2,x3,x4
     );
 }
 
 /*************************************************************************
- *				SHELL32_181	[SHELL32.181]
- * unknown
+ * RegisterShellHook [SHELL32.181]
  *
  * PARAMS
  *      hwnd [I]  window handle
  *      y    [I]  flag ????
  *
  * NOTES
- *     Original name: RegisterShellHook (exported by ordinal)
+ *     exported by ordinal
  */
-void WINAPI SHELL32_181(HWND32 hwnd, DWORD y) {
-    FIXME(shell,"(0x%08lx,0x%08x):stub.\n",hwnd,y);
+void WINAPI RegisterShellHook32(HWND32 hwnd, DWORD y) {
+    FIXME(shell,"(0x%08x,0x%08lx):stub.\n",hwnd,y);
 }
 
 /*************************************************************************
- *				SHELL32_75	[SHELL32.75]
- * unknown
+ * PathYetAnotherMakeUniqueName [SHELL32.75]
+ * 
+ * NOTES
+ *     exported by ordinal
  */
-BOOL32 WINAPI SHELL32_75(LPDWORD x,LPDWORD y) {
+BOOL32 WINAPI PathYetAnotherMakeUniqueName(LPDWORD x,LPDWORD y) {
     FIXME(shell,"(%p,%p):stub.\n",x,y);
     return TRUE;
 }
 
 /*************************************************************************
- *	 		 SHELL32_77   			[SHELL32.77]
+ * SHMapPIDLToSystemImageListIndex [SHELL32.77]
+ * 
+ * NOTES
+ *     exported by ordinal
  */
-DWORD WINAPI SHELL32_77(DWORD x,DWORD y,DWORD z) {
+DWORD WINAPI
+SHMapPIDLToSystemImageListIndex(DWORD x,DWORD y,DWORD z) {
 	FIXME(shell,"(%08lx,%08lx,%08lx):stub.\n",x,y,z);
 	return 0;
 }
 
 /*************************************************************************
- *	 		 SHELL32_79   			[SHELL32.79]
+ * 	 		 SHELL32_79   			[SHELL32.79]
  * create_directory_and_notify(...)
+ * 
+ * NOTES
+ * (isn't it StrToOleStrN ??? jsch)
  */
 DWORD WINAPI SHELL32_79(LPCSTR dir,LPVOID xvoid) {
 	TRACE(shell,"mkdir %s,%p\n",dir,xvoid);
@@ -432,6 +480,9 @@
 	return TRUE;
 }
 
+/*************************************************************************
+ *
+ */
 typedef DWORD (* WINAPI GetClassPtr)(REFCLSID,REFIID,LPVOID);
 
 static GetClassPtr SH_find_moduleproc(LPSTR dllname,HMODULE32 *xhmod,
@@ -441,7 +492,7 @@
 	FARPROC32	dllunload,nameproc;
 
 	if (xhmod) *xhmod = 0;
-	if (!strcasecmp(SHELL32_34(dllname),"shell32.dll"))
+	if (!strcasecmp(PathFindFilename(dllname),"shell32.dll"))
 		return (GetClassPtr)SHELL32_DllGetClassObject;
 
 	hmod = LoadLibraryEx32A(dllname,0,LOAD_WITH_ALTERED_SEARCH_PATH);
@@ -458,7 +509,9 @@
 	/* register unloadable dll with unloadproc ... */
 	return (GetClassPtr)nameproc;
 }
-
+/*************************************************************************
+ *
+ */
 static DWORD SH_get_instance(REFCLSID clsid,LPSTR dllname,
 	LPVOID	unknownouter,REFIID refiid,LPVOID inst
 ) {
@@ -466,6 +519,8 @@
 	DWORD		hres;
 	LPCLASSFACTORY	classfac;
 
+  TRACE(shell,"%s\n",dllname);
+	
 	dllgetclassob = SH_find_moduleproc(dllname,NULL,"DllGetClassObject");
 	if (!dllgetclassob)
 		return 0x80070000|GetLastError();
@@ -490,10 +545,12 @@
 }
 
 /*************************************************************************
- *				SHELL32_102	[SHELL32.102]
- * unknown
+ * SHCoCreateInstance [SHELL32.102]
+ * 
+ * NOTES
+ *     exported by ordinal
  */
-LRESULT WINAPI SHELL32_102(
+LRESULT WINAPI SHCoCreateInstance(
 	LPSTR aclsid,CLSID *clsid,LPUNKNOWN unknownouter,REFIID refiid,LPVOID inst
 ) {
 	char	buffer[256],xclsid[48],xiid[48],path[260],tmodel[100];
@@ -510,9 +567,7 @@
 		    return 0x80040154;
 		strcpy(xclsid,aclsid);
 	}
-	TRACE(shell,"(%p,%s,%p,%s,%p)\n",
-		aclsid,xclsid,unknownouter,xiid,inst
-	);
+	TRACE(shell,"(%p,\n\tSID:\t%s,%p,\n\tIID:\t%s,%p)\n",aclsid,xclsid,unknownouter,xiid,inst);
 
 	sprintf(buffer,"CLSID\\%s\\InProcServer32",xclsid);
 	if (RegOpenKeyEx32A(HKEY_CLASSES_ROOT,buffer,0,0x02000000,&inprockey))
@@ -539,21 +594,23 @@
 
 
 /*************************************************************************
- *			 SHELL32_183   			[SHELL32.183]
+ * ShellMessageBoxA [SHELL32.183]
+ *
  * Format and output errormessage.
  *
  * NOTES
- *     Original name: ShellMessageBoxA
+ *     exported by ordinal
  */
-void __cdecl SHELL32_183(HMODULE32 hmod,HWND32 hwnd,DWORD id,DWORD x,DWORD type,LPVOID arglist) {
+void __cdecl
+ShellMessageBoxA(HMODULE32 hmod,HWND32 hwnd,DWORD id,DWORD x,DWORD type,LPVOID arglist) {
 	char	buf[100],buf2[100],*buf3;
 	LPVOID	args = &arglist;
 
 	if (!LoadString32A(hmod,x,buf,100))
 		strcpy(buf,"Desktop");
-	LoadString32A(hmod,id,buf2,100);
+//	LoadString32A(hmod,id,buf2,100);
 	/* FIXME: the varargs handling doesn't. */
-	FormatMessage32A(0x500,buf2,0,0,(LPSTR)&buf3,256,(LPDWORD)&args);
+//	FormatMessage32A(0x500,buf2,0,0,(LPSTR)&buf3,256,(LPDWORD)&args);
 
 	FIXME(shell,"(%08lx,%08lx,%08lx(%s),%08lx(%s),%08lx,%p):stub.\n",
 		(DWORD)hmod,(DWORD)hwnd,id,buf2,x,buf,type,arglist
@@ -563,7 +620,8 @@
 
 
 /*************************************************************************
- *			 SHELL32_100   			[SHELL32.100]
+ * SHRestricted [SHELL32.100]
+ *
  * walks through policy table, queries <app> key, <type> value, returns 
  * queried (DWORD) value.
  * {0x00001,Explorer,NoRun}
@@ -586,8 +644,11 @@
  * {0x20000,Explorer,NoStartMenuSubFolders}
  * {0x40000,Explorer,MyDocsOnNet}
  * {0x80000,WinOldApp,NoRealMode}
+ *
+ * NOTES
+ *     exported by ordinal
  */
-DWORD WINAPI SHELL32_100(DWORD pol) {
+DWORD WINAPI SHRestricted (DWORD pol) {
 	HKEY	xhkey;
 
 	FIXME(shell,"(%08lx):stub.\n",pol);
@@ -596,17 +657,18 @@
 	/* FIXME: do nothing for now, just return 0 (== "allowed") */
 	RegCloseKey(xhkey);
 	return 0;
-	
 }
 
 /*************************************************************************
- *	 		 SHELL32_152   			[SHELL32.152]
- * itemlist_length
+ * ILGetSize [SHELL32.152]
+ *
+ * NOTES
+ *     exported by ordinal
  */
-DWORD WINAPI SHELL32_152(LPITEMIDLIST iil) {
+DWORD WINAPI ILGetSize(LPITEMIDLIST iil) {
 	LPSHITEMID	si;
 	DWORD		len;
-
+	TRACE(shell,"%p\n",iil);
 	if (!iil)
 		return 0;
 	si = &(iil->mkid);
@@ -619,96 +681,114 @@
 }
 
 /*************************************************************************
- *                      SHELL32_158                    [SHELL32.158]
+ * PathGetExtension [SHELL32.158]
+ *
+ * NOTES
+ *     exported by ordinal
  */
-LPSTR WINAPI SHELL32_158(LPSTR path,DWORD y,DWORD z) {
+LPSTR WINAPI PathGetExtension(LPSTR path,DWORD y,DWORD z) {
     TRACE(shell,"(%s,%08lx,%08lx)\n",path,y,z);
-    path = SHELL32_31(path);
+    path = PathFindExtension(path);
     return *path?(path+1):path;
 }
 
 /*************************************************************************
- *	 		 SHELL32_165   			[SHELL32.165]
- * create_path_and_notify(...)
+ * SHCreateDirectory [SHELL32.165]
+ *
+ * NOTES
+ *     exported by ordinal
  */
-DWORD WINAPI SHELL32_165(DWORD x,LPCSTR path) {
+DWORD WINAPI SHCreateDirectory(DWORD x,LPCSTR path) {
+	TRACE(shell,"(%08lx,%s):stub.\n",x,path);
+	if (CreateDirectory32A(path,x))
+		return TRUE;
+	/* SHChangeNotify(8,1,path,0); */
+	return FALSE;
+#if 0
 	if (SHELL32_79(path,(LPVOID)x))
 		return 0;
 	FIXME(shell,"(%08lx,%s):stub.\n",x,path);
 	return 0;
+#endif
 }
 
 /*************************************************************************
- *	 		 SHELL32_195   			[SHELL32.195]
- * free_ptr() - frees memory using IMalloc
+ * SHFree [SHELL32.195]
  *
  * NOTES
- *     Original name: SHFree (exported by ordinal)
+ *     free_ptr() - frees memory using IMalloc
+ *     exported by ordinal
  */
-DWORD WINAPI SHELL32_195(LPVOID x) {
+DWORD WINAPI SHFree(LPVOID x) {
+  TRACE(shell,"%p\n",x);
 	return LocalFree32((HANDLE32)x);
 }
 
 /*************************************************************************
- *	 		 SHELL32_196   			[SHELL32.196]
- * void *task_alloc(DWORD len), uses SHMalloc allocator
+ * SHAlloc [SHELL32.196]
+ *
+ * NOTES
+ *     void *task_alloc(DWORD len), uses SHMalloc allocator
+ *     exported by ordinal
  */
-LPVOID WINAPI SHELL32_196(DWORD len) {
+LPVOID WINAPI SHAlloc(DWORD len) {
+  TRACE(shell,"%lu\n",len);
 	return (LPVOID)LocalAlloc32(len,LMEM_ZEROINIT); /* FIXME */
 }
 
 /*************************************************************************
- *	 		 SHELL32_18   			[SHELL32.18]
- * copy_itemidlist()
+ * ILClone [SHELL32.18]
+ *
  */
-LPITEMIDLIST WINAPI SHELL32_18(LPITEMIDLIST iil) {
+LPITEMIDLIST WINAPI ILClone (LPITEMIDLIST iil) {
 	DWORD		len;
 	LPITEMIDLIST	newiil;
-
-	len = SHELL32_152(iil);
-	newiil = (LPITEMIDLIST)SHELL32_196(len);
+  TRACE(shell,"%p\n",iil);
+	len = ILGetSize(iil);
+	newiil = (LPITEMIDLIST)SHAlloc(len);
 	if (newiil)
 		memcpy(newiil,iil,len);
 	return newiil;
 }
 
 /*************************************************************************
- *	 		 SHELL32_25   			[SHELL32.25]
- * merge_itemidlist()
+ * ILCombine [SHELL32.25]
+ *
  */
-LPITEMIDLIST WINAPI SHELL32_25(LPITEMIDLIST iil1,LPITEMIDLIST iil2) {
+LPITEMIDLIST WINAPI ILCombine(LPITEMIDLIST iil1,LPITEMIDLIST iil2) {
 	DWORD		len1,len2;
 	LPITEMIDLIST	newiil;
-
-	len1 	= SHELL32_152(iil1)-2;
-	len2	= SHELL32_152(iil2);
-	newiil	= SHELL32_196(len1+len2);
+	TRACE(shell,"%p %p\n",iil1,iil2);
+	len1 	= ILGetSize(iil1)-2;
+	len2	= ILGetSize(iil2);
+	newiil	= SHAlloc(len1+len2);
 	memcpy(newiil,iil1,len1);
 	memcpy(((char*)newiil)+len1,iil2,len2);
 	return newiil;
 }
 
 /*************************************************************************
- *	 		 SHELL32_155   			[SHELL32.155]
- * free_check_ptr - frees memory (if not NULL) allocated by SHMalloc allocator
+ * ILFree [SHELL32.155]
  *
  * NOTES
- *     Original name: ILFree (exported by ordinal)
+ *     free_check_ptr - frees memory (if not NULL)
+ *     allocated by SHMalloc allocator
+ *     exported by ordinal
  */
-DWORD WINAPI SHELL32_155(LPVOID x) {
+DWORD WINAPI ILFree(LPVOID x) {
 	FIXME (shell,"(0x%08lx):stub.\n", (DWORD)x);
-//	if (!x)
+	if (!x)
 		return 0;
-//	return SHELL32_195(x);
+	return SHFree(x);
 }
 
 /*************************************************************************
- * SHELL32_85 [SHELL32.85]
+ * OpenRegStream [SHELL32.85]
  *
  * NOTES
- *     Original name: OpenRegStream (exported by ordinal)
+ *     exported by ordinal
  */
-DWORD WINAPI SHELL32_85(DWORD x1,DWORD x2,DWORD x3,DWORD x4) {
+DWORD WINAPI OpenRegStream(DWORD x1,DWORD x2,DWORD x3,DWORD x4) {
     FIXME(shell,"(0x%08lx,0x%08lx,0x%08lx,0x%08lx):stub.\n",
     	x1,x2,x3,x4
     );
@@ -716,38 +796,36 @@
 }
 
 /*************************************************************************
- * SHELL32_86 [SHELL32.86]
- * unknown
+ * SHRegisterDragDrop [SHELL32.86]
  *
  * NOTES
- *     Original name: SHRegisterDragDrop (exported by ordinal)
+ *     exported by ordinal
  */
-DWORD WINAPI SHELL32_86(HWND32 hwnd,DWORD x2) {
-    FIXME (shell, "(0x%08lx,0x%08x):stub.\n", hwnd, x2);
+DWORD WINAPI SHRegisterDragDrop(HWND32 hwnd,DWORD x2) {
+    FIXME (shell, "(0x%08x,0x%08lx):stub.\n", hwnd, x2);
     return 0;
 }
 
 /*************************************************************************
- * SHELL32_87 [SHELL32.87]
- * unknown
+ * SHRevokeDragDrop [SHELL32.87]
  *
  * NOTES
- *     Original name: SHRevokeDragDrop (exported by ordinal)
+ *     exported by ordinal
  */
-DWORD WINAPI SHELL32_87(DWORD x) {
+DWORD WINAPI SHRevokeDragDrop(DWORD x) {
     FIXME(shell,"(0x%08lx):stub.\n",x);
     return 0;
 }
 
 
 /*************************************************************************
- * SHELL32_61 [SHELL32.61]
+ * RunFileDlg [SHELL32.61]
  *
  * NOTES
  *     Original name: RunFileDlg (exported by ordinal)
  */
 DWORD WINAPI
-SHELL32_61 (HWND32 hwndOwner, DWORD dwParam1, DWORD dwParam2,
+RunFileDlg (HWND32 hwndOwner, DWORD dwParam1, DWORD dwParam2,
 	    LPSTR lpszTitle, LPSTR lpszPrompt, UINT32 uFlags)
 {
     FIXME (shell,"(0x%08x 0x%lx 0x%lx \"%s\" \"%s\" 0x%x):stub.\n",
@@ -757,11 +835,13 @@
 
 
 /*************************************************************************
- * SHELL32_60 [SHELL32.60]
- * Shell/Shutdown-Dialog
+ * ExitWindowsDialog [SHELL32.60]
+ *
+ * NOTES
+ *     exported by ordinal
  */
 DWORD WINAPI
-SHELL32_60 (HWND32 hwndOwner)
+ExitWindowsDialog (HWND32 hwndOwner)
 {
     FIXME (shell,"(0x%08x):stub.\n", hwndOwner);
     return 0;
@@ -769,12 +849,12 @@
 
 
 /*************************************************************************
- * SHELL32_184 [SHELL32.184]
- * unknown
+ * ArrangeWindows [SHELL32.184]
+ * 
  */
 DWORD WINAPI
-SHELL32_184 (DWORD dwParam1, DWORD dwParam2, DWORD dwParam3,
-	     DWORD dwParam4, DWORD dwParam5)
+ArrangeWindows (DWORD dwParam1, DWORD dwParam2, DWORD dwParam3,
+		DWORD dwParam4, DWORD dwParam5)
 {
     FIXME (shell,"(0x%lx 0x%lx 0x%lx 0x%lx 0x%lx):stub.\n",
 	   dwParam1, dwParam2, dwParam3, dwParam4, dwParam5);
@@ -783,15 +863,33 @@
 
 
 /*************************************************************************
- * SHELL32_147 [SHELL32.147]
+ * SHCLSIDFromString [SHELL32.147]
  *
  * NOTES
- *     Original name: SHCLSIDFromString (exported by ordinal)
+ *     exported by ordinal
  */
 DWORD WINAPI
-SHELL32_147 (DWORD dwParam1, DWORD dwParam2)
+SHCLSIDFromString (DWORD dwParam1, DWORD dwParam2)
 {
     FIXME (shell,"(0x%lx 0x%lx):stub.\n", dwParam1, dwParam2);
+
+    FIXME (shell,"(\"%s\" \"%s\"):stub.\n", (LPSTR)dwParam1, (LPSTR)dwParam2);
+
+    return 0;
+}
+
+
+/*************************************************************************
+ * SignalFileOpen [SHELL32.103]
+ *
+ * NOTES
+ *     exported by ordinal
+ */
+DWORD WINAPI
+SignalFileOpen (DWORD dwParam1)
+{
+    FIXME (shell,"(0x%08lx):stub.\n", dwParam1);
+
     return 0;
 }
 
diff --git a/misc/spy.c b/misc/spy.c
index 0419c05..3996003 100644
--- a/misc/spy.c
+++ b/misc/spy.c
@@ -492,10 +492,34 @@
     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
 
-    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
-    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
-    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
-    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+    "WM_QUERYAFXWNDPROC",   /*  0x0360 */
+    "WM_SIZEPARENT",        /*  0x0361 */
+    "WM_SETMESSAGESTRING",  /*  0x0362 */
+    "WM_IDLEUPDATECMDUI",   /*  0x0363 */
+    "WM_INITIALUPDATE",     /*  0x0364 */
+    "WM_COMMANDHELP",       /*  0x0365 */
+    "WM_HELPHITTEST",       /*  0x0366 */
+    "WM_EXITHELPMODE",      /*  0x0367 */
+    "WM_RECALCPARENT",      /*  0x0368 */
+    "WM_SIZECHILD",         /*  0x0369 */
+    "WM_KICKIDLE",          /*  0x036A */
+    "WM_QUERYCENTERWND",    /*  0x036B */
+    "WM_DISABLEMODAL",      /*  0x036C */
+    "WM_FLOATSTATUS",       /*  0x036D */
+    "WM_ACTIVATETOPLEVEL",  /*  0x036E */
+    "WM_QUERY3DCONTROLS",   /*  0x036F */
+    NULL,NULL,NULL,
+    "WM_SOCKET_NOTIFY",     /*  0x0373 */
+    "WM_SOCKET_DEAD",       /*  0x0374 */
+    "WM_POPMESSAGESTRING",  /*  0x0375 */
+    "WM_OCC_LOADFROMSTREAM",     /* 0x0376 */
+    "WM_OCC_LOADFROMSTORAGE",    /* 0x0377 */
+    "WM_OCC_INITNEW",            /* 0x0378 */
+    "WM_QUEUE_SENTINEL",         /* 0x0379 */
+    "WM_OCC_LOADFROMSTREAM_EX",  /* 0x037A */
+    "WM_OCC_LOADFROMSTORAGE_EX", /* 0x037B */
+
+    NULL,NULL,NULL,NULL,
 
     /* 0x0380 */
     "WM_PENWINFIRST", 
diff --git a/msdos/Makefile.in b/msdos/Makefile.in
index a30b251..6ec0f26 100644
--- a/msdos/Makefile.in
+++ b/msdos/Makefile.in
@@ -6,6 +6,7 @@
 MODULE    = msdos
 
 C_SRCS = \
+	cdrom.c \
 	dosmem.c \
 	dpmi.c \
 	int10.c \
diff --git a/msdos/cdrom.c b/msdos/cdrom.c
new file mode 100644
index 0000000..37d73a8
--- /dev/null
+++ b/msdos/cdrom.c
@@ -0,0 +1,303 @@
+
+/*
+ *  Cdrom - device driver emulation - Audio features.
+ *  (c) 1998 Petr Tomasek <tomasek@etf.cuni.cz>
+ *
+ */
+
+#ifdef linux
+
+#include <fcntl.h>
+#include <sys/ioctl.h>
+#include <sys/types.h>
+/* FIXME - how to make this OS independent ?? */
+#include <linux/cdrom.h>
+#include <linux/ucdrom.h>
+
+#include "ldt.h"
+#include "drive.h"
+#include "msdos.h"
+#include "miscemu.h"
+#include "module.h"
+/* #define DEBUG_INT */
+#include "debug.h"
+
+
+/*  FIXME - more general ?? */
+#define cdrom_dev "/dev/cdrom"
+
+u_char cdrom_a_status (int fd)
+{
+struct cdrom_subchnl sc;
+
+ioctl(fd,CDROMSUBCHNL,&sc);
+return sc.cdsc_audiostatus;
+}
+
+BYTE * get_io_stru (WORD * reqh,int dorealmode)
+{
+WORD ofst,segm;
+BYTE * io_stru;
+ofst = reqh[7]; segm = reqh[8];
+
+if (dorealmode)
+  io_stru = DOSMEM_MapRealToLinear (MAKELONG(ofst,segm));
+else
+  io_stru = PTR_SEG_OFF_TO_LIN(segm,ofst);
+
+return io_stru;
+}
+
+DWORD msf0_to_abs (struct cdrom_msf0 msf)
+{
+return  (msf.minute *60 + 
+        msf.second) *75 +
+        msf.frame-150; 
+}
+
+void abs_to_msf0 (DWORD abs, struct cdrom_msf0 * msf)
+{
+DWORD d;
+d=abs+150;
+msf->frame=d%75;  d=d/75;
+msf->second=d%60; msf->minute=d/60;
+}
+
+void msf0_to_msf (struct cdrom_msf0 from, struct cdrom_msf0 to, struct cdrom_msf * msf)
+{
+msf->cdmsf_min0=from.minute;
+msf->cdmsf_min1=to.minute;
+msf->cdmsf_sec0=from.second;
+msf->cdmsf_sec1=to.second;
+msf->cdmsf_frame0=from.frame;
+msf->cdmsf_frame1=to.frame;
+} 
+
+void abs_to_msf (DWORD from, DWORD to, struct cdrom_msf * msf)
+{
+struct cdrom_msf0 fr,tt;
+abs_to_msf0(from, &fr);
+abs_to_msf0(to, &tt);
+msf0_to_msf(fr,tt,msf);
+}
+
+/************************************************************
+ *
+ *   Cdrom ms-dos driver emulation. 
+ *    (accesible throught the MSCDEX 0x10 function.)
+ */
+
+extern void do_mscdex_dd (CONTEXT * context, int dorealmode)
+ { 
+ BYTE * driver_request;	
+ BYTE * io_stru;	
+ static int fdcd=-1; /* file descriptor.. */
+ struct cdrom_tochdr tochdr; /* the Toc header */
+ struct cdrom_tocentry tocentry; /* a Toc entry */
+ struct cdrom_msf msf; 
+ struct cdrom_subchnl subchnl; 
+ u_char Error=255; /*No Error */ 
+
+if (dorealmode)
+  driver_request=DOSMEM_MapRealToLinear
+                        (MAKELONG(BX_reg(context),ES_reg(context)));
+else
+  driver_request=PTR_SEG_OFF_TO_LIN(ES_reg(context),BX_reg(context));
+
+if (!driver_request) 
+     {             /* FIXME - to be deleted ?? */
+	ERR(int,"   ES:BX==0 ! SEGFAULT ?\n");
+	ERR(int," -->BX=0x%04X, ES=0x%04X, DS=0x%04X, CX=0x%04X\n\n",
+		BX_reg(context),
+		ES_reg(context),
+		DS_reg(context),
+		CX_reg(context));
+     }
+else
+
+/* FIXME - would be best to open the device at the begining of the wine
+   session .... */
+ if (fdcd<0) fdcd=open(cdrom_dev,O_RDONLY);
+
+   TRACE(int,"CDROM device driver -> command <%d>\n",
+         (unsigned char)driver_request[2]);
+
+/* set status to 0 */
+ driver_request[3]=0;
+ driver_request[4]=0;
+
+
+ switch(driver_request[2])
+ {
+ case 3:
+   io_stru=get_io_stru((WORD *)driver_request,dorealmode);
+   FIXME(int," --> IOCTL INPUT <%d>\n",io_stru[0]); 
+   switch (io_stru[0])
+	{
+	case 1: /* location of head */
+	 if (io_stru[1]==0)
+          {
+          ioctl(fdcd,CDROMSUBCHNL,&subchnl);
+	((DWORD*)io_stru+2)[0]=(DWORD)msf0_to_abs(subchnl.cdsc_absaddr.msf); 
+         FIXME(int," ----> HEAD LOCATION <%ld>\n\n", 
+                                ((DWORD *)io_stru+2)[0]); 
+	  }
+         else
+     	  {
+ 	 ERR(int,"CDRom-Driver: Unsupported address mode !!\n");
+   	 Error=0x0c;
+    	  }
+	 break;
+
+	case 6: /* device status */
+              /* FIXME .. does this work properly ?? */
+	 io_stru[3]=io_stru[4]=0;
+	 io_stru[2]=1; /* supports audio channels (?? FIXME ??) */
+	 io_stru[1]=16; /* data read and plays audio racks */
+	 io_stru[1]|=(ioctl(fdcd,CDROM_DRIVE_STATUS,0)==CDS_TRAY_OPEN);
+         TRACE(int," ----> DEVICE STATUS <0x%08X>\n\n",(DWORD)io_stru[1]); 
+	 break;
+
+	case 9: /* media changed ? */
+	 if (ioctl(fdcd,CDROM_MEDIA_CHANGED,0))
+          io_stru[1]=0xff;
+         else
+	  io_stru[0]=0; /* FIXME? 1? */
+	 break;
+
+	case 10: /* audio disk info */
+         ioctl(fdcd,CDROMREADTOCHDR,&tochdr);
+	 io_stru[1]=tochdr.cdth_trk0; /* staring track of the disc */
+	 io_stru[2]=tochdr.cdth_trk1; /* ending track */
+         tocentry.cdte_track=CDROM_LEADOUT; /* Now the leadout track ...*/
+         tocentry.cdte_format=CDROM_MSF; 
+         ioctl(fdcd,CDROMREADTOCENTRY,&tocentry); /* ... get position of it */
+	 ((DWORD*)io_stru+3)[0]=(DWORD)msf0_to_abs(tocentry.cdte_addr.msf); 
+         TRACE(int," ----> AUDIO DISK INFO <%d-%d/%ld>\n\n",
+				io_stru[1],io_stru[2],
+                                ((DWORD *)io_stru+3)[0]); 
+	 break;
+
+
+	case 11: /* audio track info */
+	 tocentry.cdte_track=io_stru[1]; /* track of the disc */ 
+         tocentry.cdte_format=CDROM_MSF; 
+         ioctl(fdcd,CDROMREADTOCENTRY,&tocentry);
+	 ((DWORD*)io_stru+2)[0]=(DWORD)msf0_to_abs(tocentry.cdte_addr.msf); 
+                        /* starting point if the track */
+         io_stru[6]=tocentry.cdte_adr+16*tocentry.cdte_ctrl;
+         TRACE(int," ----> AUDIO TRACK INFO <track=%d>[%ld] \n\n",
+                         io_stru[1],((DWORD *)io_stru+2)[0]); 
+	 break;
+
+	case 12: /* get Q-Channel / Subchannel (??) info */
+	 subchnl.cdsc_format=CDROM_MSF;
+	 ioctl(fdcd,CDROMSUBCHNL,&subchnl);
+	 io_stru[1]=subchnl.cdsc_adr+16*subchnl.cdsc_ctrl;
+	 io_stru[2]=subchnl.cdsc_trk;
+	 io_stru[3]=subchnl.cdsc_ind; /* FIXME - ?? */
+	 io_stru[4]=subchnl.cdsc_reladdr.msf.minute;
+	 io_stru[5]=subchnl.cdsc_reladdr.msf.second;
+	 io_stru[6]=subchnl.cdsc_reladdr.msf.frame;
+	 io_stru[7]=0; /* always zero */
+	 io_stru[8]=subchnl.cdsc_absaddr.msf.minute;
+	 io_stru[9]=subchnl.cdsc_absaddr.msf.second;
+	 io_stru[10]=subchnl.cdsc_absaddr.msf.frame;
+	 break;
+	
+	case 15: /* fixme !!!!!!! just a small workaround ! */
+	 /* !!!! FIXME FIXME FIXME !! */
+         tocentry.cdte_track=CDROM_LEADOUT; /* Now the leadout track ...*/
+         tocentry.cdte_format=CDROM_MSF; 
+         ioctl(fdcd,CDROMREADTOCENTRY,&tocentry); /* ... get position of it */
+	 ((DWORD*)io_stru+7)[0]=(DWORD)msf0_to_abs(tocentry.cdte_addr.msf); 
+ 	break;
+
+	default:
+         FIXME(int," Cdrom-driver: IOCTL INPUT: Unimplemented <%d>!! \n",
+                                                             io_stru[0]); 
+	 Error=0x0c; 
+	 break;	
+	}	
+   break;
+
+ case 12:
+   io_stru=get_io_stru((WORD *)driver_request,dorealmode);
+   TRACE(int," --> IOCTL OUTPUT <%d>\n",io_stru[0]); 
+   switch (io_stru[0])
+	{
+	case 0: /* eject */ 
+	 ioctl (fdcd,CDROMEJECT);
+         TRACE(int," ----> EJECT \n\n"); 
+	 break;
+	case 5: /* close tray */
+	 ioctl (fdcd,CDROMCLOSETRAY);
+         TRACE(int," ----> CLOSE TRAY \n\n"); 
+	 break;
+	case 2: /* reset drive */
+	 ioctl (fdcd,CDROMRESET);
+         TRACE(int," ----> RESET \n\n"); 
+	 break;
+	default:
+         FIXME(int," Cdrom-driver: IOCTL OUPUT: Unimplemented <%d>!! \n",
+                                                             io_stru[0]); 
+	 Error=0x0c;
+	 break;	
+	}	
+   break;
+ 
+case 133:
+   if (cdrom_a_status(fdcd)==CDROM_AUDIO_PLAY)
+     {
+     ioctl (fdcd,CDROMPAUSE);
+     TRACE(int," --> STOP AUDIO (Paused)\n\n");
+     }
+   else
+     {
+     ioctl (fdcd,CDROMSTOP);
+     TRACE(int," --> STOP AUDIO (Stopped)\n\n");
+     }
+   break;
+
+ case 132:  /* FIXME - It didn't function for me... */
+   FIXME(int," --> PLAY AUDIO \n");
+     ioctl (fdcd,CDROMSTART);
+   FIXME(int,"Mode :<0x%02X> , [%ld-%ld]\n\n",
+          (unsigned char)driver_request[13],
+          ((DWORD*)driver_request+14)[0],
+          ((DWORD*)driver_request+18)[0]);
+   if (driver_request[13]==0)
+     {
+    abs_to_msf(((DWORD*)driver_request+14)[0],
+               ((DWORD*)driver_request+18)[0],&msf);
+    ioctl(fdcd,CDROMPLAYMSF,&msf);
+     }
+   else 
+     {
+    ERR(int,"CDRom-Driver: Unsupported address mode !!\n");
+    Error=0x0c;
+     }
+   break;
+ case 136:
+   TRACE(int," --> RESUME AUDIO \n\n");
+   ioctl(fdcd,CDROMRESUME);
+   break;
+ default:
+   FIXME(int," CDRom-Driver - ioctl uninplemented <%d>\n",driver_request[2]); 
+   Error=0x0c;	
+
+ }
+
+if (Error<255)
+ {
+ driver_request[4]|=127;
+ driver_request[3]=Error;
+ }
+ driver_request[4]|=2*(cdrom_a_status(fdcd)==CDROM_AUDIO_PLAY);
+
+/*  close (fdcd); FIXME !! -- cannot use close when ejecting 
+    the cd-rom - close would close it again */ 
+}
+
+#endif
+
diff --git a/msdos/dpmi.c b/msdos/dpmi.c
index 1aa802f..ee20a38 100644
--- a/msdos/dpmi.c
+++ b/msdos/dpmi.c
@@ -18,6 +18,7 @@
 #include "debug.h"
 #include "selectors.h"
 #include "thread.h"
+#include "process.h"
 #include "stackframe.h"
 #include "callback.h"
 
@@ -110,19 +111,24 @@
 	MEMORY_BASIC_INFORMATION	mbi;
 	LPVOID				newptr;
 
-	if (!VirtualQuery(ptr,&mbi,sizeof(mbi))) {
-		FIXME(int31,"reallocing non DPMI_xalloced region?\n");
-		return NULL;
-	}
-	/* We do not shrink allocated memory. most reallocs only do grows
-	 * anyway
-	 */
-	if (newsize<=mbi.RegionSize)
-		return ptr;
-
 	newptr = DPMI_xalloc(newsize);
-	memcpy(newptr,ptr,newsize);
-	DPMI_xfree(ptr);
+	if (ptr) {
+		if (!VirtualQuery(ptr,&mbi,sizeof(mbi))) {
+			FIXME(int31,"realloc of DPMI_xallocd region %p?\n",ptr);
+			return NULL;
+		}
+		if (mbi.State == MEM_FREE) {
+			FIXME(int31,"realloc of DPMI_xallocd region %p?\n",ptr);
+			return NULL;
+		}
+		/* We do not shrink allocated memory. most reallocs
+		 * only do grows anyway
+		 */
+		if (newsize<=mbi.RegionSize)
+			return ptr;
+		memcpy(newptr,ptr,newsize);
+		DPMI_xfree(ptr);
+	}
 	return newptr;
 }
 /**********************************************************************
@@ -293,6 +299,23 @@
                 break;
             }
             break;
+        case 0x58: /* GET OR SET MEMORY/UMB ALLOCATION STRATEGY */
+            TRACE(int31,"GET OR SET MEMORY/UMB ALLOCATION STRATEGY subfunction %d\n",
+                  AL_reg(context));
+            switch (AL_reg(context))
+            {
+            case 0x00:
+                AX_reg(context) = 1;
+                break;
+            case 0x02:
+                AX_reg(context) = 0;
+                break;
+            case 0x01:
+            case 0x03:
+                break;
+            }
+            RESET_CFLAG(context);
+            break;
 	case 0x60: {/* CANONICALIZE PATH */
 		LPCSTR path = (LPCSTR)DOSMEM_MapRealToLinear((DS_reg(&realmode_ctx)<<16)+SI_reg(&realmode_ctx));
 
@@ -460,8 +483,18 @@
  *
  * Handler for int 31h (DPMI).
  */
+
 void WINAPI INT_Int31Handler( CONTEXT *context )
 {
+    /*
+     * Note: For Win32s processes, the whole linear address space is
+     *       shifted by 0x10000 relative to the OS linear address space.
+     *       See the comment in msdos/vxd.c.
+     */
+    DWORD offset = PROCESS_Current()->flags & PDB32_WIN32S_PROC ? 0x10000 : 0;
+    #define AppToWine(addr) ((addr)? ((DWORD)(addr)) + offset : 0)
+    #define WineToApp(addr) ((addr)? ((DWORD)(addr)) - offset : 0)
+
     DWORD dw;
     BYTE *ptr;
 
@@ -547,15 +580,17 @@
         }
         else
         {
-            CX_reg(context) = HIWORD(dw);
-            DX_reg(context) = LOWORD(dw);
+            CX_reg(context) = HIWORD(WineToApp(dw));
+            DX_reg(context) = LOWORD(WineToApp(dw));
         }
         break;
 
     case 0x0007:  /* Set selector base address */
-    	TRACE(int31,"set selector base address (0x%04x,0x%08lx)\n",BX_reg(context),MAKELONG(DX_reg(context),CX_reg(context)));
-        SetSelectorBase( BX_reg(context),
-                         MAKELONG( DX_reg(context), CX_reg(context) ) );
+    	TRACE(int31, "set selector base address (0x%04x,0x%08lx)\n",
+                     BX_reg(context),
+                     AppToWine(MAKELONG(DX_reg(context),CX_reg(context))));
+        SetSelectorBase(BX_reg(context),
+                        AppToWine(MAKELONG(DX_reg(context), CX_reg(context))));
         break;
 
     case 0x0008:  /* Set selector limit */
@@ -583,6 +618,8 @@
         {
             ldt_entry entry;
             LDT_GetEntry( SELECTOR_TO_ENTRY( BX_reg(context) ), &entry );
+            entry.base = WineToApp(entry.base);
+
             /* FIXME: should use ES:EDI for 32-bit clients */
             LDT_EntryToBytes( PTR_SEG_OFF_TO_LIN( ES_reg(context),
                                                   DI_reg(context) ), &entry );
@@ -595,6 +632,8 @@
             ldt_entry entry;
             LDT_BytesToEntry( PTR_SEG_OFF_TO_LIN( ES_reg(context),
                                                   DI_reg(context) ), &entry );
+            entry.base = AppToWine(entry.base);
+
             LDT_SetEntry( SELECTOR_TO_ENTRY( BX_reg(context) ), &entry );
         }
         break;
@@ -621,7 +660,7 @@
 	break;
 
     case 0x0205:  /* Set protected mode interrupt vector */
-    	TRACE(int31,"set protected mode interrupt handler (0x%02x,0x%08lx), stub!\n",
+    	TRACE(int31,"set protected mode interrupt handler (0x%02x,%p), stub!\n",
             BL_reg(context),PTR_SEG_OFF_TO_LIN(CX_reg(context),DX_reg(context)));
 	INT_SetHandler( BL_reg(context),
                         (FARPROC16)PTR_SEG_OFF_TO_SEGPTR( CX_reg(context),
@@ -686,27 +725,31 @@
             AX_reg(context) = 0x8012;  /* linear memory not available */
             SET_CFLAG(context);
         } else {
-            BX_reg(context) = SI_reg(context) = HIWORD(ptr);
-            CX_reg(context) = DI_reg(context) = LOWORD(ptr);
+            BX_reg(context) = SI_reg(context) = HIWORD(WineToApp(ptr));
+            CX_reg(context) = DI_reg(context) = LOWORD(WineToApp(ptr));
         }
         break;
 
     case 0x0502:  /* Free memory block */
-        TRACE(int31,"free memory block (0x%08lx)\n",MAKELONG(DI_reg(context),SI_reg(context)));
-	DPMI_xfree((void *)MAKELONG(DI_reg(context), SI_reg(context)));
+        TRACE(int31, "free memory block (0x%08lx)\n",
+                     AppToWine(MAKELONG(DI_reg(context),SI_reg(context))));
+	DPMI_xfree( (void *)AppToWine(MAKELONG(DI_reg(context), 
+                                               SI_reg(context))) );
         break;
 
     case 0x0503:  /* Resize memory block */
-        TRACE(int31,"resize memory block (0x%08lx,%ld)\n",MAKELONG(DI_reg(context),SI_reg(context)),MAKELONG(CX_reg(context),BX_reg(context)));
+        TRACE(int31, "resize memory block (0x%08lx,%ld)\n",
+                     AppToWine(MAKELONG(DI_reg(context),SI_reg(context))),
+                     MAKELONG(CX_reg(context),BX_reg(context)));
         if (!(ptr = (BYTE *)DPMI_xrealloc(
-                           (void *)MAKELONG(DI_reg(context),SI_reg(context)),
-                                   MAKELONG(CX_reg(context),BX_reg(context)))))
+                (void *)AppToWine(MAKELONG(DI_reg(context),SI_reg(context))),
+                MAKELONG(CX_reg(context),BX_reg(context)))))
         {
             AX_reg(context) = 0x8012;  /* linear memory not available */
             SET_CFLAG(context);
         } else {
-            BX_reg(context) = SI_reg(context) = HIWORD(ptr);
-            CX_reg(context) = DI_reg(context) = LOWORD(ptr);
+            BX_reg(context) = SI_reg(context) = HIWORD(WineToApp(ptr));
+            CX_reg(context) = DI_reg(context) = LOWORD(WineToApp(ptr));
         }
         break;
 
@@ -749,8 +792,8 @@
          }
          else
          {
-             BX_reg(context) = HIWORD(ptr);
-             CX_reg(context) = LOWORD(ptr);
+             BX_reg(context) = HIWORD(WineToApp(ptr));
+             CX_reg(context) = LOWORD(WineToApp(ptr));
              RESET_CFLAG(context);
          }
          break;
@@ -761,4 +804,7 @@
         SET_CFLAG(context);
         break;
     }
+
+    #undef AppToWine
+    #undef WineToApp
 }
diff --git a/msdos/int21.c b/msdos/int21.c
index cbb181c..ec85439 100644
--- a/msdos/int21.c
+++ b/msdos/int21.c
@@ -1649,7 +1649,7 @@
 	    *(WORD*)(dataptr+1) = 41;
 	    *(WORD*)(dataptr+3) = WINE_LanguageId;
 	    *(WORD*)(dataptr+5) = CodePage;
-	    *(DWORD*)(dataptr+0x19) = NULL; /* FIXME: ptr to case map routine */
+	    *(DWORD*)(dataptr+0x19) = 0; /* FIXME: ptr to case map routine */
 	    break;
 	case 0x06:
 	    TRACE(int21,"\tget pointer to collating sequence table\n");
diff --git a/msdos/int2f.c b/msdos/int2f.c
index e6a0dd2..914333a 100644
--- a/msdos/int2f.c
+++ b/msdos/int2f.c
@@ -5,6 +5,7 @@
 #include <stdlib.h>
 #include <string.h>
 #include <unistd.h>
+
 #include "ldt.h"
 #include "drive.h"
 #include "msdos.h"
@@ -228,6 +229,13 @@
             }
             break;
 
+#ifdef linux
+	case 0x10: /* direct driver acces */
+	    do_mscdex_dd(context,dorealmode);
+	    break;
+
+#endif
+
         default:
             FIXME(int, "Unimplemented MSCDEX function 0x%02X.\n", AL_reg(context));
             break;
diff --git a/msdos/vxd.c b/msdos/vxd.c
index 708cd36..186bdb3 100644
--- a/msdos/vxd.c
+++ b/msdos/vxd.c
@@ -4,9 +4,17 @@
  * Copyright 1995 Anand Kumria
  */
 
+#include <fcntl.h>
+#include <memory.h>
 #include "windows.h"
+#include "winbase.h"
 #include "msdos.h"
 #include "miscemu.h"
+#include "selectors.h"
+#include "module.h"
+#include "task.h"
+#include "process.h"
+#include "file.h"
 #include "debug.h"
 
 
@@ -190,3 +198,1180 @@
     }
 }
 
+/***********************************************************************
+ *           VXD_Win32s
+ *
+ * This is an implementation of the services of the Win32s VxD.
+ * Since official documentation of these does not seem to be available,
+ * certain arguments of some of the services remain unclear.  
+ *
+ * FIXME: The following services are currently unimplemented: 
+ *        Exception handling      (0x01, 0x1C)
+ *        Debugger support        (0x0C, 0x14, 0x17)
+ *        Low-level memory access (0x02, 0x03, 0x0A, 0x0B)
+ *        Memory Statistics       (0x1B)
+ *        
+ *
+ * We have a specific problem running Win32s on Linux (and probably also
+ * the other x86 unixes), since Win32s tries to allocate its main 'flat
+ * code/data segment' selectors with a base of 0xffff0000 (and limit 4GB).
+ * The rationale for this seems to be that they want one the one hand to 
+ * be able to leave the Win 3.1 memory (starting with the main DOS memory) 
+ * at linear address 0, but want at other hand to have offset 0 of the
+ * flat data/code segment point to an unmapped page (to catch NULL pointer
+ * accesses). Hence they allocate the flat segments with a base of 0xffff0000
+ * so that the Win 3.1 memory area at linear address zero shows up in the
+ * flat segments at offset 0x10000 (since linear addresses wrap around at
+ * 4GB). To compensate for that discrepancy between flat segment offsets
+ * and plain linear addresses, all flat pointers passed between the 32-bit
+ * and the 16-bit parts of Win32s are shifted by 0x10000 in the appropriate
+ * direction by the glue code (mainly) in W32SKRNL and WIN32S16.
+ *
+ * The problem for us is now that Linux does not allow a LDT selector with
+ * base 0xffff0000 to be created, since it would 'see' a part of the kernel
+ * address space. To address this problem we introduce *another* offset:
+ * We add 0x10000 to every linear address we get as an argument from Win32s.
+ * This means especially that the flat code/data selectors get actually
+ * allocated with base 0x0, so that flat offsets and (real) linear addresses
+ * do again agree!  In fact, every call e.g. of a Win32s VxD service now
+ * has all pointer arguments (which are offsets in the flat data segement)
+ * first reduced by 0x10000 by the W32SKRNL glue code, and then again
+ * increased by 0x10000 by *our* code.
+ *
+ * Note that to keep everything consistent, this offset has to be applied by
+ * every Wine function that operates on 'linear addresses' passed to it by
+ * Win32s. Fortunately, since Win32s does not directly call any Wine 32-bit
+ * API routines, this affects only two locations: this VxD and the DPMI
+ * handler. (NOTE: Should any Win32s application pass a linear address to
+ * any routine apart from those, e.g. some other VxD handler, that code
+ * would have to take the offset into account as well!)
+ *
+ * The application of the offset is triggered by marking the current process
+ * as a Win32s process by setting the PDB32_WIN32S_PROC flag in the process
+ * database. This is done the first time any application calls the GetVersion()
+ * service of the Win32s VxD. (Note that the flag is never removed.)
+ * 
+ */
+
+void VXD_Win32s( CONTEXT *context )
+{
+    #define AppToWine(addr) ((addr)? ((LPBYTE)(addr)) + 0x10000 : NULL)
+    #define WineToApp(addr) ((addr)? ((DWORD) (addr)) - 0x10000 : 0)
+
+    switch (AX_reg(context))
+    {
+    case 0x0000: /* Get Version */
+        /*
+         * Input:   None
+         *
+         * Output:  EAX: LoWord: Win32s Version (1.30)
+         *               HiWord: VxD Version (200)
+         *
+         *          EBX: Build (172)
+         *
+         *          ECX: ???   (1)
+         *
+         *          EDX: Debugging Flags
+         *
+         *          EDI: Error Flag 
+         *               0 if OK,
+         *               1 if VMCPD VxD not found
+         */
+
+        TRACE(vxd, "GetVersion()\n");
+        
+	EAX_reg(context) = VXD_WinVersion() | (200 << 16);
+        EBX_reg(context) = 0;
+        ECX_reg(context) = 0;
+        EDX_reg(context) = 0;
+        EDI_reg(context) = 0;
+
+        /* 
+         * If this is the first time we are called for this process,
+         * hack the memory image of WIN32S16 so that it doesn't try
+         * to access the GDT directly ...
+         *
+         * The first code segment of WIN32S16 (version 1.30) contains 
+         * an unexported function somewhere between the exported functions
+         * SetFS and StackLinearToSegmented that tries to find a selector
+         * in the LDT that maps to the memory image of the LDT itself.
+         * If it succeeds, it stores this selector into a global variable
+         * which will be used to speed up execution by using this selector
+         * to modify the LDT directly instead of using the DPMI calls.
+         *
+         * To perform this search of the LDT, this function uses the
+         * sgdt and sldt instructions to find the linear address of
+         * the (GDT and then) LDT. While those instructions themselves
+         * execute without problem, the linear address that sgdt returns
+         * points (at least under Linux) to the kernel address space, so
+         * that any subsequent access leads to a segfault.
+         *
+         * Fortunately, WIN32S16 still contains as a fallback option the
+         * mechanism of using DPMI calls to modify LDT selectors instead
+         * of direct writes to the LDT. Thus we can circumvent the problem
+         * by simply replacing the first byte of the offending function
+         * with an 'retf' instruction. This means that the global variable
+         * supposed to contain the LDT alias selector will remain zero,
+         * and hence WIN32S16 will fall back to using DPMI calls.
+         *
+         * The heuristic we employ to _find_ that function is as follows:
+         * We search between the addresses of the exported symbols SetFS
+         * and StackLinearToSegmented for the byte sequence '0F 01 04'
+         * (this is the opcode of 'sgdt [si]'). We then search backwards
+         * from this address for the last occurrance of 'CB' (retf) that marks
+         * the end of the preceeding function. The following byte (which
+         * should now be the first byte of the function we are looking for)
+         * will be replaced by 'CB' (retf).
+         *
+         * This heuristic works for the retail as well as the debug version
+         * of Win32s version 1.30. For versions earlier than that this
+         * hack should not be necessary at all, since the whole mechanism
+         * ('PERF130') was introduced only in 1.30 to improve the overall
+         * performance of Win32s.
+         */
+
+        if (!(PROCESS_Current()->flags & PDB32_WIN32S_PROC))
+        {
+            HMODULE16 hModule = GetModuleHandle16("win32s16");
+            SEGPTR func1 = (SEGPTR)WIN32_GetProcAddress16(hModule, "SetFS");
+            SEGPTR func2 = (SEGPTR)WIN32_GetProcAddress16(hModule, 
+                                                  "StackLinearToSegmented");
+
+            if (   hModule && func1 && func2 
+                && SELECTOROF(func1) == SELECTOROF(func2))
+            {
+                BYTE *start = PTR_SEG_TO_LIN(func1);
+                BYTE *end   = PTR_SEG_TO_LIN(func2);
+                BYTE *p, *retv = NULL;
+                int found = 0;
+
+                for (p = start; p < end; p++)
+                    if (*p == 0xCB) found = 0, retv = p;
+                    else if (*p == 0x0F) found = 1;
+                    else if (*p == 0x01 && found == 1) found = 2;
+                    else if (*p == 0x04 && found == 2) { found = 3; break; }
+                    else found = 0;
+
+                if (found == 3 && retv)
+                {
+                    TRACE(vxd, "PERF130 hack: "
+                               "Replacing byte %02X at offset %04X:%04X\n",
+                               *(retv+1), SELECTOROF(func1), 
+                                          OFFSETOF(func1) + retv+1-start);
+
+                    *(retv+1) = (BYTE)0xCB;
+                }
+            }
+        }
+
+        /* 
+         * Mark process as Win32s, so that subsequent DPMI calls
+         * will perform the AppToWine/WineToApp address shift.
+         */
+
+        PROCESS_Current()->flags |= PDB32_WIN32S_PROC;
+	break;
+
+
+    case 0x0001: /* Install Exception Handling */
+        /*
+         * Input:   EBX: Flat address of W32SKRNL Exception Data
+         *
+         *          ECX: LoWord: Flat Code Selector
+         *               HiWord: Flat Data Selector
+         *
+         *          EDX: Flat address of W32SKRNL Exception Handler 
+         *               (this is equal to W32S_BackTo32 + 0x40)
+         *
+         *          ESI: SEGPTR KERNEL.HASGPHANDLER
+         *
+         *          EDI: SEGPTR phCurrentTask (KERNEL.THHOOK + 0x10)
+         *
+         * Output:  EAX: 0 if OK
+         */
+
+        TRACE(vxd, "[0001] EBX=%lx ECX=%lx EDX=%lx ESI=%lx EDI=%lx\n", 
+                   EBX_reg(context), ECX_reg(context), EDX_reg(context),
+                   ESI_reg(context), EDI_reg(context));
+
+        /* FIXME */
+
+        EAX_reg(context) = 0;
+        break;
+
+
+    case 0x0002: /* Set Page Access Flags */
+        /*
+         * Input:   EBX: New access flags
+         *               Bit 2: User Page if set, Supervisor Page if clear
+         *               Bit 1: Read-Write if set, Read-Only if clear
+         *
+         *          ECX: Size of memory area to change
+         *
+         *          EDX: Flat start address of memory area
+         *
+         * Output:  EAX: Size of area changed
+         */
+
+        TRACE(vxd, "[0002] EBX=%lx ECX=%lx EDX=%lx\n", 
+                   EBX_reg(context), ECX_reg(context), EDX_reg(context));
+
+        /* FIXME */
+
+        EAX_reg(context) = ECX_reg(context);
+        break;
+
+
+    case 0x0003: /* Get Page Access Flags */
+        /*
+         * Input:   EDX: Flat address of page to query
+         *
+         * Output:  EAX: Page access flags
+         *               Bit 2: User Page if set, Supervisor Page if clear
+         *               Bit 1: Read-Write if set, Read-Only if clear
+         */
+
+        TRACE(vxd, "[0003] EDX=%lx\n", EDX_reg(context));
+
+        /* FIXME */
+
+        EAX_reg(context) = 6;
+        break;
+
+
+    case 0x0004: /* Map Module */
+        /*
+         * Input:   ECX: IMTE (offset in Module Table) of new module
+         *
+         *          EDX: Flat address of Win32s Module Table
+         *
+         * Output:  EAX: 0 if OK
+         */
+
+    if (!EDX_reg(context) || CX_reg(context) == 0xFFFF)
+    {
+        TRACE(vxd, "MapModule: Initialization call\n");
+        EAX_reg(context) = 0;
+    }
+    else
+    {
+        /*
+         * Structure of a Win32s Module Table Entry:
+         */
+        struct Win32sModule
+        {
+            DWORD  flags;
+            DWORD  flatBaseAddr;
+            LPCSTR moduleName;
+            LPCSTR pathName;
+            LPCSTR unknown;
+            LPBYTE baseAddr;
+            DWORD  hModule;
+            DWORD  relocDelta;
+        };
+
+        /* 
+         * Note: This function should set up a demand-paged memory image 
+         *       of the given module. Since mmap does not allow file offsets
+         *       not aligned at 1024 bytes, we simply load the image fully
+         *       into memory.
+         */
+
+        struct Win32sModule *moduleTable = 
+                            (struct Win32sModule *)AppToWine(EDX_reg(context));
+        struct Win32sModule *module = moduleTable + ECX_reg(context);
+
+        IMAGE_NT_HEADERS *nt_header = PE_HEADER(module->baseAddr);
+        IMAGE_SECTION_HEADER *pe_seg = PE_SECTIONS(module->baseAddr);
+
+        HFILE32 image = FILE_Open(module->pathName, O_RDONLY);
+        BOOL32 error = (image == INVALID_HANDLE_VALUE32);
+        UINT32 i;
+
+        TRACE(vxd, "MapModule: Loading %s\n", module->pathName);
+
+        for (i = 0; 
+             !error && i < nt_header->FileHeader.NumberOfSections; 
+             i++, pe_seg++)
+            if(!(pe_seg->Characteristics & IMAGE_SCN_CNT_UNINITIALIZED_DATA))
+            {
+                DWORD  off  = pe_seg->PointerToRawData;
+                DWORD  len  = pe_seg->SizeOfRawData;
+                LPBYTE addr = module->baseAddr + pe_seg->VirtualAddress;
+
+                TRACE(vxd, "MapModule: "
+                           "Section %d at %08lx from %08lx len %08lx\n", 
+                           i, (DWORD)addr, off, len);
+
+                if (   _llseek32(image, off, SEEK_SET) != off
+                    || _lread32(image, addr, len) != len)
+                    error = TRUE;
+            }
+        
+        _lclose32(image);
+
+        if (error)
+            ERR(vxd, "MapModule: Unable to load %s\n", module->pathName);
+
+        else if (module->relocDelta != 0)
+        {
+            IMAGE_DATA_DIRECTORY *dir = nt_header->OptionalHeader.DataDirectory
+                                      + IMAGE_DIRECTORY_ENTRY_BASERELOC;
+            IMAGE_BASE_RELOCATION *r = (IMAGE_BASE_RELOCATION *)
+                (dir->Size? module->baseAddr + dir->VirtualAddress : 0);
+
+            TRACE(vxd, "MapModule: Reloc delta %08lx\n", module->relocDelta);
+
+            while (r && r->VirtualAddress)
+            {
+                LPBYTE page  = module->baseAddr + r->VirtualAddress;
+                int    count = (r->SizeOfBlock - 8) / 2;
+
+                TRACE(vxd, "MapModule: %d relocations for page %08lx\n", 
+                           count, (DWORD)page);
+
+                for(i = 0; i < count; i++)
+                {
+                    int offset = r->TypeOffset[i] & 0xFFF;
+                    int type   = r->TypeOffset[i] >> 12;
+                    switch(type)
+                    {
+                    case IMAGE_REL_BASED_ABSOLUTE: 
+                        break;
+                    case IMAGE_REL_BASED_HIGH:
+                        *(WORD *)(page+offset) += HIWORD(module->relocDelta);
+                        break;
+                    case IMAGE_REL_BASED_LOW:
+                        *(WORD *)(page+offset) += LOWORD(module->relocDelta);
+                        break;
+                    case IMAGE_REL_BASED_HIGHLOW:
+                        *(DWORD*)(page+offset) += module->relocDelta;
+                        break;
+                    default:
+                        WARN(vxd, "MapModule: Unsupported fixup type\n");
+                        break;
+                    }
+                }
+
+                r = (IMAGE_BASE_RELOCATION *)((LPBYTE)r + r->SizeOfBlock);
+            }
+        }
+
+        EAX_reg(context) = 0;
+        RESET_CFLAG(context);
+    }
+    break;
+
+
+    case 0x0005: /* UnMap Module */
+        /*
+         * Input:   EDX: Flat address of module image 
+         *
+         * Output:  EAX: 1 if OK
+         */
+        
+        TRACE(vxd, "UnMapModule: %lx\n", (DWORD)AppToWine(EDX_reg(context)));
+
+        /* As we didn't map anything, there's nothing to unmap ... */
+
+        EAX_reg(context) = 1;
+        break;
+
+
+    case 0x0006: /* VirtualAlloc */
+        /* 
+         * Input:   ECX: Current Process
+         *
+         *          EDX: Flat address of arguments on stack
+         * 
+         *   DWORD *retv     [out] Flat base address of allocated region
+         *   LPVOID base     [in]  Flat address of region to reserve/commit
+         *   DWORD  size     [in]  Size of region
+         *   DWORD  type     [in]  Type of allocation
+         *   DWORD  prot     [in]  Type of access protection
+         *
+         * Output:  EAX: NtStatus
+         */
+    {
+        DWORD *stack  = (DWORD *)AppToWine(EDX_reg(context));
+        DWORD *retv   = (DWORD *)AppToWine(stack[0]);
+        LPVOID base   = (LPVOID) AppToWine(stack[1]);
+        DWORD  size   = stack[2];
+        DWORD  type   = stack[3];
+        DWORD  prot   = stack[4];
+        DWORD  result;
+
+        TRACE(vxd, "VirtualAlloc(%lx, %lx, %lx, %lx, %lx)\n", 
+                   (DWORD)retv, (DWORD)base, size, type, prot);
+
+        if (type & 0x80000000)
+        {
+            WARN(vxd, "VirtualAlloc: strange type %lx\n", type);
+            type &= 0x7fffffff;
+        }
+
+        if (!base && (type & MEM_COMMIT) && prot == PAGE_READONLY)
+        {
+            WARN(vxd, "VirtualAlloc: NLS hack, allowing write access!\n");
+            prot = PAGE_READWRITE;
+        }
+
+        result = (DWORD)VirtualAlloc(base, size, type, prot);
+
+        if (WineToApp(result))
+            *retv            = WineToApp(result),
+            EAX_reg(context) = STATUS_SUCCESS;
+        else
+            *retv            = 0,
+            EAX_reg(context) = STATUS_NO_MEMORY;  /* FIXME */
+    }
+    break;
+
+
+    case 0x0007: /* VirtualFree */
+        /* 
+         * Input:   ECX: Current Process
+         *
+         *          EDX: Flat address of arguments on stack
+         * 
+         *   DWORD *retv     [out] TRUE if success, FALSE if failure
+         *   LPVOID base     [in]  Flat address of region
+         *   DWORD  size     [in]  Size of region
+         *   DWORD  type     [in]  Type of operation
+         *
+         * Output:  EAX: NtStatus
+         */
+    {
+        DWORD *stack  = (DWORD *)AppToWine(EDX_reg(context));
+        DWORD *retv   = (DWORD *)AppToWine(stack[0]);
+        LPVOID base   = (LPVOID) AppToWine(stack[1]);
+        DWORD  size   = stack[2];
+        DWORD  type   = stack[3];
+        DWORD  result;
+
+        TRACE(vxd, "VirtualFree(%lx, %lx, %lx, %lx)\n", 
+                   (DWORD)retv, (DWORD)base, size, type);
+
+        result = VirtualFree(base, size, type);
+
+        if (result)
+            *retv            = TRUE,
+            EAX_reg(context) = STATUS_SUCCESS;
+        else
+            *retv            = FALSE,
+            EAX_reg(context) = STATUS_NO_MEMORY;  /* FIXME */
+    }
+    break;
+
+
+    case 0x0008: /* VirtualProtect */
+        /* 
+         * Input:   ECX: Current Process
+         *
+         *          EDX: Flat address of arguments on stack
+         * 
+         *   DWORD *retv     [out] TRUE if success, FALSE if failure
+         *   LPVOID base     [in]  Flat address of region
+         *   DWORD  size     [in]  Size of region
+         *   DWORD  new_prot [in]  Desired access protection
+         *   DWORD *old_prot [out] Previous access protection
+         *
+         * Output:  EAX: NtStatus
+         */
+    {
+        DWORD *stack    = (DWORD *)AppToWine(EDX_reg(context));
+        DWORD *retv     = (DWORD *)AppToWine(stack[0]);
+        LPVOID base     = (LPVOID) AppToWine(stack[1]);
+        DWORD  size     = stack[2];
+        DWORD  new_prot = stack[3];
+        DWORD *old_prot = (DWORD *)AppToWine(stack[4]);
+        DWORD  result;
+
+        TRACE(vxd, "VirtualProtect(%lx, %lx, %lx, %lx, %lx)\n", 
+                   (DWORD)retv, (DWORD)base, size, new_prot, (DWORD)old_prot);
+
+        result = VirtualProtect(base, size, new_prot, old_prot);
+
+        if (result)
+            *retv            = TRUE,
+            EAX_reg(context) = STATUS_SUCCESS;
+        else
+            *retv            = FALSE,
+            EAX_reg(context) = STATUS_NO_MEMORY;  /* FIXME */
+    }
+    break;
+
+
+    case 0x0009: /* VirtualQuery */
+        /* 
+         * Input:   ECX: Current Process
+         *
+         *          EDX: Flat address of arguments on stack
+         * 
+         *   DWORD *retv                     [out] Nr. bytes returned
+         *   LPVOID base                     [in]  Flat address of region
+         *   LPMEMORY_BASIC_INFORMATION info [out] Info buffer
+         *   DWORD  len                      [in]  Size of buffer
+         *
+         * Output:  EAX: NtStatus
+         */
+    {
+        DWORD *stack  = (DWORD *)AppToWine(EDX_reg(context));
+        DWORD *retv   = (DWORD *)AppToWine(stack[0]);
+        LPVOID base   = (LPVOID) AppToWine(stack[1]);
+        LPMEMORY_BASIC_INFORMATION info = 
+                        (LPMEMORY_BASIC_INFORMATION)AppToWine(stack[2]);
+        DWORD  len    = stack[3];
+        DWORD  result;
+
+        TRACE(vxd, "VirtualQuery(%lx, %lx, %lx, %lx)\n", 
+                   (DWORD)retv, (DWORD)base, (DWORD)info, len);
+
+        result = VirtualQuery(base, info, len);
+
+        *retv            = result;
+        EAX_reg(context) = STATUS_SUCCESS;
+    }
+    break;
+
+
+    case 0x000A: /* SetVirtMemProcess */
+        /*
+         * Input:   ECX: Process Handle
+         *
+         *          EDX: Flat address of region
+         *
+         * Output:  EAX: NtStatus
+         */
+
+        TRACE(vxd, "[000a] ECX=%lx EDX=%lx\n",
+                   ECX_reg(context), EDX_reg(context));
+
+        /* FIXME */
+
+        EAX_reg(context) = STATUS_SUCCESS;
+        break;
+
+
+    case 0x000B: /* ??? some kind of cleanup */
+        /*
+         * Input:   ECX: Process Handle
+         *
+         * Output:  EAX: NtStatus
+         */
+
+        TRACE(vxd, "[000b] ECX=%lx\n", ECX_reg(context));
+
+        /* FIXME */
+
+        EAX_reg(context) = STATUS_SUCCESS;
+        break;
+
+
+    case 0x000C: /* Set Debug Flags */
+        /*
+         * Input:   EDX: Debug Flags
+         *
+         * Output:  EDX: Previous Debug Flags
+         */
+
+        FIXME(vxd, "[000c] EDX=%lx\n", EDX_reg(context));
+
+        /* FIXME */
+
+        EDX_reg(context) = 0;
+        break;
+
+
+    case 0x000D: /* NtCreateSection */
+        /* 
+         * Input:   EDX: Flat address of arguments on stack
+         * 
+         *   HANDLE32 *retv      [out] Handle of Section created
+         *   DWORD  flags1       [in]  (?? unknown ??)
+         *   DWORD  atom         [in]  Name of Section to create
+         *   LARGE_INTEGER *size [in]  Size of Section
+         *   DWORD  protect      [in]  Access protection
+         *   DWORD  flags2       [in]  (?? unknown ??)
+         *   HFILE32 hFile       [in]  Handle of file to map
+         *   DWORD  psp          [in]  (Win32s: PSP that hFile belongs to)
+         *
+         * Output:  EAX: NtStatus
+         */
+    {
+        DWORD *stack    = (DWORD *)   AppToWine(EDX_reg(context));
+        HANDLE32 *retv  = (HANDLE32 *)AppToWine(stack[0]);
+        DWORD  flags1   = stack[1];
+        DWORD  atom     = stack[2];
+        LARGE_INTEGER *size = (LARGE_INTEGER *)AppToWine(stack[3]);
+        DWORD  protect  = stack[4];
+        DWORD  flags2   = stack[5];
+        HFILE32 hFile   = stack[6];
+        DWORD  psp      = stack[7];
+
+        HANDLE32 result = INVALID_HANDLE_VALUE32;
+        char name[128];
+
+        TRACE(vxd, "NtCreateSection(%lx, %lx, %lx, %lx, %lx, %lx, %lx, %lx)\n",
+                   (DWORD)retv, flags1, atom, (DWORD)size, protect, flags2,
+                   (DWORD)hFile, psp);
+
+        if (!atom || GlobalGetAtomName32A(atom, name, sizeof(name)))
+        {
+            TRACE(vxd, "NtCreateSection: name=%s\n", atom? name : NULL);
+
+            result = CreateFileMapping32A(hFile, NULL, protect, 
+                                          size? size->HighPart : 0, 
+                                          size? size->LowPart  : 0, 
+                                          atom? name : NULL);
+        }
+
+        if (result == INVALID_HANDLE_VALUE32)
+            WARN(vxd, "NtCreateSection: failed!\n");
+        else
+            TRACE(vxd, "NtCreateSection: returned %lx\n", (DWORD)result);
+
+        if (result != INVALID_HANDLE_VALUE32)
+            *retv            = result,
+            EAX_reg(context) = STATUS_SUCCESS;
+        else
+            *retv            = result,
+            EAX_reg(context) = STATUS_NO_MEMORY;   /* FIXME */
+    }
+    break;
+
+
+    case 0x000E: /* NtOpenSection */
+        /* 
+         * Input:   EDX: Flat address of arguments on stack
+         * 
+         *   HANDLE32 *retv  [out] Handle of Section opened
+         *   DWORD  protect  [in]  Access protection
+         *   DWORD  atom     [in]  Name of Section to create
+         *
+         * Output:  EAX: NtStatus
+         */
+    {
+        DWORD *stack    = (DWORD *)   AppToWine(EDX_reg(context));
+        HANDLE32 *retv  = (HANDLE32 *)AppToWine(stack[0]);
+        DWORD  protect  = stack[1];
+        DWORD  atom     = stack[2];
+
+        HANDLE32 result = INVALID_HANDLE_VALUE32;
+        char name[128];
+
+        TRACE(vxd, "NtOpenSection(%lx, %lx, %lx)\n", 
+                   (DWORD)retv, protect, atom);
+
+        if (atom && GlobalGetAtomName32A(atom, name, sizeof(name)))
+        {
+            TRACE(vxd, "NtOpenSection: name=%s\n", name);
+
+            result = OpenFileMapping32A(protect, FALSE, name);
+        }
+
+        if (result == INVALID_HANDLE_VALUE32)
+            WARN(vxd, "NtOpenSection: failed!\n");
+        else
+            TRACE(vxd, "NtOpenSection: returned %lx\n", (DWORD)result);
+
+        if (result != INVALID_HANDLE_VALUE32)
+            *retv            = result,
+            EAX_reg(context) = STATUS_SUCCESS;
+        else
+            *retv            = result,
+            EAX_reg(context) = STATUS_NO_MEMORY;   /* FIXME */
+    }
+    break;
+
+
+    case 0x000F: /* NtCloseSection */
+        /* 
+         * Input:   EDX: Flat address of arguments on stack
+         * 
+         *   HANDLE32 handle  [in]  Handle of Section to close
+         *   DWORD *id        [out] Unique ID  (?? unclear ??)
+         *
+         * Output:  EAX: NtStatus
+         */
+    {
+        DWORD *stack    = (DWORD *)AppToWine(EDX_reg(context));
+        HANDLE32 handle = stack[0];
+        DWORD *id       = (DWORD *)AppToWine(stack[1]);
+
+        TRACE(vxd, "NtCloseSection(%lx, %lx)\n", (DWORD)handle, (DWORD)id);
+
+        CloseHandle(handle);
+        if (id) *id = 0; /* FIXME */
+
+        EAX_reg(context) = STATUS_SUCCESS;
+    }
+    break;
+
+
+    case 0x0010: /* NtDupSection */
+        /* 
+         * Input:   EDX: Flat address of arguments on stack
+         * 
+         *   HANDLE32 handle  [in]  Handle of Section to duplicate
+         *
+         * Output:  EAX: NtStatus
+         */
+    {
+        DWORD *stack    = (DWORD *)AppToWine(EDX_reg(context));
+        HANDLE32 handle = stack[0];
+
+        TRACE(vxd, "NtDupSection(%lx)\n", (DWORD)handle);
+ 
+        /* Handle is 'duplicated' by incrementing RefCount */
+        HANDLE_GetObjPtr(PROCESS_Current(), handle, K32OBJ_MEM_MAPPED_FILE, 0);
+
+        EAX_reg(context) = STATUS_SUCCESS;
+    }
+    break;
+
+
+    case 0x0011: /* NtMapViewOfSection */
+        /* 
+         * Input:   EDX: Flat address of arguments on stack
+         * 
+         *   HANDLE32 SectionHandle       [in]     Section to be mapped
+         *   DWORD    ProcessHandle       [in]     Process to be mapped into
+         *   DWORD *  BaseAddress         [in/out] Address to be mapped at
+         *   DWORD    ZeroBits            [in]     (?? unclear ??)
+         *   DWORD    CommitSize          [in]     (?? unclear ??)
+         *   LARGE_INTEGER *SectionOffset [in]     Offset within section
+         *   DWORD *  ViewSize            [in]     Size of view
+         *   DWORD    InheritDisposition  [in]     (?? unclear ??)
+         *   DWORD    AllocationType      [in]     (?? unclear ??)
+         *   DWORD    Protect             [in]     Access protection
+         *
+         * Output:  EAX: NtStatus
+         */
+    {
+        DWORD *  stack          = (DWORD *)AppToWine(EDX_reg(context));
+        HANDLE32 SectionHandle  = stack[0];
+        DWORD    ProcessHandle  = stack[1]; /* ignored */
+        DWORD *  BaseAddress    = (DWORD *)AppToWine(stack[2]);
+        DWORD    ZeroBits       = stack[3];
+        DWORD    CommitSize     = stack[4];
+        LARGE_INTEGER *SectionOffset = (LARGE_INTEGER *)AppToWine(stack[5]);
+        DWORD *  ViewSize       = (DWORD *)AppToWine(stack[6]);
+        DWORD    InheritDisposition = stack[7];
+        DWORD    AllocationType = stack[8];
+        DWORD    Protect        = stack[9];
+
+        LPBYTE address = (LPBYTE)(BaseAddress? AppToWine(*BaseAddress) : 0);
+        DWORD  access = 0, result;
+
+        switch (Protect & ~(PAGE_GUARD|PAGE_NOCACHE))
+        {
+            case PAGE_READONLY:           access = FILE_MAP_READ;  break;
+            case PAGE_READWRITE:          access = FILE_MAP_WRITE; break;
+            case PAGE_WRITECOPY:          access = FILE_MAP_COPY;  break;
+
+            case PAGE_EXECUTE_READ:       access = FILE_MAP_READ;  break;
+            case PAGE_EXECUTE_READWRITE:  access = FILE_MAP_WRITE; break;
+            case PAGE_EXECUTE_WRITECOPY:  access = FILE_MAP_COPY;  break;
+        }
+
+        TRACE(vxd, "NtMapViewOfSection"
+                   "(%lx, %lx, %lx, %lx, %lx, %lx, %lx, %lx, %lx, %lx)\n",
+                   (DWORD)SectionHandle, ProcessHandle, (DWORD)BaseAddress, 
+                   ZeroBits, CommitSize, (DWORD)SectionOffset, (DWORD)ViewSize,
+                   InheritDisposition, AllocationType, Protect);
+        TRACE(vxd, "NtMapViewOfSection: "
+                   "base=%lx, offset=%lx, size=%lx, access=%lx\n", 
+                   (DWORD)address, SectionOffset? SectionOffset->LowPart : 0, 
+                   ViewSize? *ViewSize : 0, access);
+
+        result = (DWORD)MapViewOfFileEx(SectionHandle, access, 
+                            SectionOffset? SectionOffset->HighPart : 0, 
+                            SectionOffset? SectionOffset->LowPart  : 0,
+                            ViewSize? *ViewSize : 0, address);
+
+        TRACE(vxd, "NtMapViewOfSection: result=%lx\n", result);
+
+        if (WineToApp(result))
+        {
+            if (BaseAddress) *BaseAddress = WineToApp(result);
+            EAX_reg(context) = STATUS_SUCCESS;
+        }
+        else
+            EAX_reg(context) = STATUS_NO_MEMORY; /* FIXME */
+    }
+    break;
+
+
+    case 0x0012: /* NtUnmapViewOfSection */
+        /* 
+         * Input:   EDX: Flat address of arguments on stack
+         * 
+         *   DWORD  ProcessHandle  [in]  Process (defining address space)
+         *   LPBYTE BaseAddress    [in]  Base address of view to be unmapped
+         *
+         * Output:  EAX: NtStatus
+         */
+    {
+        DWORD *stack          = (DWORD *)AppToWine(EDX_reg(context));
+        DWORD  ProcessHandle  = stack[0]; /* ignored */
+        LPBYTE BaseAddress    = (LPBYTE)AppToWine(stack[1]);
+
+        TRACE(vxd, "NtUnmapViewOfSection(%lx, %lx)\n", 
+                   ProcessHandle, (DWORD)BaseAddress);
+
+        UnmapViewOfFile(BaseAddress);
+
+        EAX_reg(context) = STATUS_SUCCESS;
+    }
+    break;
+
+
+    case 0x0013: /* NtFlushVirtualMemory */
+        /* 
+         * Input:   EDX: Flat address of arguments on stack
+         * 
+         *   DWORD   ProcessHandle  [in]  Process (defining address space)
+         *   LPBYTE *BaseAddress    [in?] Base address of range to be flushed
+         *   DWORD  *ViewSize       [in?] Number of bytes to be flushed
+         *   DWORD  *unknown        [???] (?? unknown ??)
+         *
+         * Output:  EAX: NtStatus
+         */
+    {
+        DWORD *stack          = (DWORD *)AppToWine(EDX_reg(context));
+        DWORD  ProcessHandle  = stack[0]; /* ignored */
+        DWORD *BaseAddress    = (DWORD *)AppToWine(stack[1]);
+        DWORD *ViewSize       = (DWORD *)AppToWine(stack[2]);
+        DWORD *unknown        = (DWORD *)AppToWine(stack[3]);
+        
+        LPBYTE address = (LPBYTE)(BaseAddress? AppToWine(*BaseAddress) : 0);
+        DWORD  size    = ViewSize? *ViewSize : 0;
+
+        TRACE(vxd, "NtFlushVirtualMemory(%lx, %lx, %lx, %lx)\n", 
+                   ProcessHandle, (DWORD)BaseAddress, (DWORD)ViewSize, 
+                   (DWORD)unknown);
+        TRACE(vxd, "NtFlushVirtualMemory: base=%lx, size=%lx\n", 
+                   (DWORD)address, size);
+
+        FlushViewOfFile(address, size);
+
+        EAX_reg(context) = STATUS_SUCCESS;
+    }
+    break;
+
+
+    case 0x0014: /* Get/Set Debug Registers */
+        /*
+         * Input:   ECX: 0 if Get, 1 if Set
+         *
+         *          EDX: Get: Flat address of buffer to receive values of
+         *                    debug registers DR0 .. DR7
+         *               Set: Flat address of buffer containing values of
+         *                    debug registers DR0 .. DR7 to be set
+         * Output:  None
+         */
+
+        FIXME(vxd, "[0014] ECX=%lx EDX=%lx\n", 
+                   ECX_reg(context), EDX_reg(context));
+
+        /* FIXME */
+        break;
+
+
+    case 0x0015: /* Set Coprocessor Emulation Flag */
+        /*
+         * Input:   EDX: 0 to deactivate, 1 to activate coprocessor emulation
+         *
+         * Output:  None
+         */
+
+        TRACE(vxd, "[0015] EDX=%lx\n", EDX_reg(context));
+
+        /* We don't care, as we always have a coprocessor anyway */
+        break;
+
+
+    case 0x0016: /* Init Win32S VxD PSP */
+        /*
+         * If called to query required PSP size:
+         *
+         *     Input:  EBX: 0
+         *     Output: EDX: Required size of Win32s VxD PSP
+         *
+         * If called to initialize allocated PSP:
+         *
+         *     Input:  EBX: LoWord: Selector of Win32s VxD PSP
+         *                  HiWord: Paragraph of Win32s VxD PSP (DOSMEM)
+         *     Output: None
+         */
+ 
+        if (EBX_reg(context) == 0)
+            EDX_reg(context) = 0x80;
+        else
+        {
+            PDB *psp = PTR_SEG_OFF_TO_LIN(BX_reg(context), 0);
+            psp->nbFiles = 32;
+            psp->fileHandlesPtr = MAKELONG(HIWORD(EBX_reg(context)), 0x5c);
+            memset((LPBYTE)psp + 0x5c, '\xFF', 32);
+        }
+        break;
+
+
+    case 0x0017: /* Set Break Point */
+        /*
+         * Input:   EBX: Offset of Break Point
+         *          CX:  Selector of Break Point
+         *
+         * Output:  None
+         */
+
+        FIXME(vxd, "[0017] EBX=%lx CX=%x\n", 
+                   EBX_reg(context), CX_reg(context));
+
+        /* FIXME */
+        break;
+
+
+    case 0x0018: /* VirtualLock */
+        /* 
+         * Input:   ECX: Current Process
+         *
+         *          EDX: Flat address of arguments on stack
+         * 
+         *   DWORD *retv     [out] TRUE if success, FALSE if failure
+         *   LPVOID base     [in]  Flat address of range to lock
+         *   DWORD  size     [in]  Size of range
+         *
+         * Output:  EAX: NtStatus
+         */
+    {
+        DWORD *stack  = (DWORD *)AppToWine(EDX_reg(context));
+        DWORD *retv   = (DWORD *)AppToWine(stack[0]);
+        LPVOID base   = (LPVOID) AppToWine(stack[1]);
+        DWORD  size   = stack[2];
+        DWORD  result;
+
+        TRACE(vxd, "VirtualLock(%lx, %lx, %lx)\n", 
+                   (DWORD)retv, (DWORD)base, size);
+
+        result = VirtualLock(base, size);
+
+        if (result)
+            *retv            = TRUE,
+            EAX_reg(context) = STATUS_SUCCESS;
+        else
+            *retv            = FALSE,
+            EAX_reg(context) = STATUS_NO_MEMORY;  /* FIXME */
+    }
+    break;
+
+
+    case 0x0019: /* VirtualUnlock */
+        /* 
+         * Input:   ECX: Current Process
+         *
+         *          EDX: Flat address of arguments on stack
+         * 
+         *   DWORD *retv     [out] TRUE if success, FALSE if failure
+         *   LPVOID base     [in]  Flat address of range to unlock
+         *   DWORD  size     [in]  Size of range
+         *
+         * Output:  EAX: NtStatus
+         */
+    {
+        DWORD *stack  = (DWORD *)AppToWine(EDX_reg(context));
+        DWORD *retv   = (DWORD *)AppToWine(stack[0]);
+        LPVOID base   = (LPVOID) AppToWine(stack[1]);
+        DWORD  size   = stack[2];
+        DWORD  result;
+
+        TRACE(vxd, "VirtualUnlock(%lx, %lx, %lx)\n", 
+                   (DWORD)retv, (DWORD)base, size);
+
+        result = VirtualUnlock(base, size);
+
+        if (result)
+            *retv            = TRUE,
+            EAX_reg(context) = STATUS_SUCCESS;
+        else
+            *retv            = FALSE,
+            EAX_reg(context) = STATUS_NO_MEMORY;  /* FIXME */
+    }
+    break;
+
+
+    case 0x001A: /* KGetSystemInfo */
+        /*
+         * Input:   None
+         *
+         * Output:  ECX:  Start of sparse memory arena
+         *          EDX:  End of sparse memory arena
+         */
+
+        TRACE(vxd, "KGetSystemInfo()\n");
+        
+        /*
+         * Note: Win32s reserves 0GB - 2GB for Win 3.1 and uses 2GB - 4GB as 
+         *       sparse memory arena. We do it the other way around, since 
+         *       we have to reserve 3GB - 4GB for Linux, and thus use
+         *       0GB - 3GB as sparse memory arena.
+         *
+         *       FIXME: What about other OSes ?
+         */
+
+        ECX_reg(context) = WineToApp(0x00000000);
+        EDX_reg(context) = WineToApp(0xbfffffff);
+        break;
+
+
+    case 0x001B: /* KGlobalMemStat */
+        /*
+         * Input:   ESI: Flat address of buffer to receive memory info
+         *
+         * Output:  None
+         */
+    {
+        struct Win32sMemoryInfo
+        {
+            DWORD DIPhys_Count;       /* Total physical pages */
+            DWORD DIFree_Count;       /* Free physical pages */
+            DWORD DILin_Total_Count;  /* Total virtual pages (private arena) */
+            DWORD DILin_Total_Free;   /* Free virtual pages (private arena) */
+
+            DWORD SparseTotal;        /* Total size of sparse arena (bytes ?) */
+            DWORD SparseFree;         /* Free size of sparse arena (bytes ?) */
+        };
+
+        struct Win32sMemoryInfo *info = 
+                       (struct Win32sMemoryInfo *)AppToWine(ESI_reg(context));
+
+        FIXME(vxd, "KGlobalMemStat(%lx)\n", (DWORD)info);
+
+        /* FIXME */
+    }
+    break;
+
+
+    case 0x001C: /* Enable/Disable Exceptions */
+        /*
+         * Input:   ECX: 0 to disable, 1 to enable exception handling
+         *
+         * Output:  None
+         */
+
+        TRACE(vxd, "[001c] ECX=%lx\n", ECX_reg(context));
+
+        /* FIXME */
+        break;
+
+
+    case 0x001D: /* VirtualAlloc called from 16-bit code */
+        /* 
+         * Input:   EDX: Segmented address of arguments on stack
+         * 
+         *   LPVOID base     [in]  Flat address of region to reserve/commit
+         *   DWORD  size     [in]  Size of region
+         *   DWORD  type     [in]  Type of allocation
+         *   DWORD  prot     [in]  Type of access protection
+         *
+         * Output:  EAX: NtStatus
+         *          EDX: Flat base address of allocated region
+         */
+    {
+        DWORD *stack  = PTR_SEG_OFF_TO_LIN(LOWORD(EDX_reg(context)), 
+                                           HIWORD(EDX_reg(context)));
+        LPVOID base   = (LPVOID)AppToWine(stack[0]);
+        DWORD  size   = stack[1];
+        DWORD  type   = stack[2];
+        DWORD  prot   = stack[3];
+        DWORD  result;
+
+        TRACE(vxd, "VirtualAlloc16(%lx, %lx, %lx, %lx)\n", 
+                   (DWORD)base, size, type, prot);
+
+        if (type & 0x80000000)
+        {
+            WARN(vxd, "VirtualAlloc16: strange type %lx\n", type);
+            type &= 0x7fffffff;
+        }
+
+        result = (DWORD)VirtualAlloc(base, size, type, prot);
+
+        if (WineToApp(result))
+            EDX_reg(context) = WineToApp(result),
+            EAX_reg(context) = STATUS_SUCCESS;
+        else
+            EDX_reg(context) = 0,
+            EAX_reg(context) = STATUS_NO_MEMORY;  /* FIXME */
+    }
+    break;
+
+
+    case 0x001E: /* VirtualFree called from 16-bit code */
+        /* 
+         * Input:   EDX: Segmented address of arguments on stack
+         * 
+         *   LPVOID base     [in]  Flat address of region
+         *   DWORD  size     [in]  Size of region
+         *   DWORD  type     [in]  Type of operation
+         *
+         * Output:  EAX: NtStatus
+         *          EDX: TRUE if success, FALSE if failure
+         */
+    {
+        DWORD *stack  = PTR_SEG_OFF_TO_LIN(LOWORD(EDX_reg(context)), 
+                                           HIWORD(EDX_reg(context)));
+        LPVOID base   = (LPVOID)AppToWine(stack[0]);
+        DWORD  size   = stack[1];
+        DWORD  type   = stack[2];
+        DWORD  result;
+
+        TRACE(vxd, "VirtualFree16(%lx, %lx, %lx)\n", 
+                   (DWORD)base, size, type);
+
+        result = VirtualFree(base, size, type);
+
+        if (result)
+            EDX_reg(context) = TRUE,
+            EAX_reg(context) = STATUS_SUCCESS;
+        else
+            EDX_reg(context) = FALSE,
+            EAX_reg(context) = STATUS_NO_MEMORY;  /* FIXME */
+    }
+    break;
+
+
+    case 0x001F: /* FWorkingSetSize */
+        /*
+         * Input:   EDX: 0 if Get, 1 if Set
+         *
+         *          ECX: Get: Buffer to receive Working Set Size
+         *               Set: Buffer containing Working Set Size
+         *
+         * Output:  NtStatus
+         */
+    {
+        DWORD *ptr = (DWORD *)AppToWine(ECX_reg(context));
+        BOOL32 set = EDX_reg(context);
+        
+        TRACE(vxd, "FWorkingSetSize(%lx, %lx)\n", (DWORD)ptr, (DWORD)set);
+
+        if (set)
+            /* We do it differently ... */;
+        else
+            *ptr = 0x100;
+
+        EAX_reg(context) = STATUS_SUCCESS;
+    }
+    break;
+
+
+    default:
+	VXD_BARF( context, "W32S" );
+    }
+
+    #undef AppToWine
+    #undef WineToApp
+}
+
diff --git a/objects/bitmap.c b/objects/bitmap.c
index 4d6fd4b..a3df02b 100644
--- a/objects/bitmap.c
+++ b/objects/bitmap.c
@@ -175,10 +175,7 @@
     bmpObjPtr->bitmap.bmWidthBytes = (INT16)BITMAP_WIDTH_BYTES( width, bpp );
     bmpObjPtr->bitmap.bmBits = NULL;
 
-    bmpObjPtr->dibSection = NULL;
-    bmpObjPtr->colorMap = NULL;
-    bmpObjPtr->nColorMap = 0;
-    bmpObjPtr->status = DIB_NoHandler;
+    bmpObjPtr->dib = NULL;
 
       /* Create the pixmap */
     bmpObjPtr->pixmap = TSXCreatePixmap(display, rootWindow, width, height, bpp);
@@ -829,20 +826,7 @@
     }
 #endif
 
-    if (bmp->dibSection)
-    {
-	DIBSECTION *dib = bmp->dibSection;
-
-	if (dib->dsBm.bmBits)
-            if (dib->dshSection)
-                UnmapViewOfFile(dib->dsBm.bmBits);
-            else
-                VirtualFree(dib->dsBm.bmBits, MEM_RELEASE, 0L);
-
-	HeapFree(GetProcessHeap(), 0, dib);
-    }
-    if (bmp->colorMap)
-	HeapFree(GetProcessHeap(), 0, bmp->colorMap);
+    DIB_DeleteDIBSection( bmp );
 
     return GDI_FreeObject( hbitmap );
 }
@@ -853,7 +837,7 @@
  */
 INT16 BITMAP_GetObject16( BITMAPOBJ * bmp, INT16 count, LPVOID buffer )
 {
-    if (bmp->dibSection)
+    if (bmp->dib)
     {
 	FIXME(bitmap, "not implemented for DIBs\n");
 	return 0;
@@ -872,7 +856,7 @@
  */
 INT32 BITMAP_GetObject32( BITMAPOBJ * bmp, INT32 count, LPVOID buffer )
 {
-    if (bmp->dibSection)
+    if (bmp->dib)
     {
 	if (count < sizeof(DIBSECTION))
 	{
@@ -883,7 +867,7 @@
 	    if (count > sizeof(DIBSECTION)) count = sizeof(DIBSECTION);
 	}
 
-	memcpy( buffer, bmp->dibSection, count );
+	memcpy( buffer, &bmp->dib->dibSection, count );
 	return count;
     }
     else
diff --git a/objects/dib.c b/objects/dib.c
index 72780f9..413e233 100644
--- a/objects/dib.c
+++ b/objects/dib.c
@@ -24,12 +24,13 @@
 {
     DC               *dc;
     LPCVOID           bits;
+    XImage           *image;
     int               lines;
     DWORD             infoWidth;
     WORD              depth;
     WORD              infoBpp;
     WORD              compression;
-    RGBQUAD          *colorMap;
+    int              *colorMap;
     int               nColorMap;
     Drawable          drawable;
     GC                gc;
@@ -174,13 +175,13 @@
  * Build the color map from the bitmap palette. Should not be called
  * for a >8-bit deep bitmap.
  */
-static RGBQUAD *DIB_BuildColorMap( const BITMAPINFO *info, 
-				   HPALETTE16 hPalette, int *nColors )
+static int *DIB_BuildColorMap( DC *dc, WORD coloruse, WORD depth, 
+                               const BITMAPINFO *info, int *nColors )
 {
     int i, colors;
     BOOL32 isInfo;
     WORD *colorPtr;
-    RGBQUAD *colorMapping;
+    int *colorMapping;
 
     if ((isInfo = (info->bmiHeader.biSize == sizeof(BITMAPINFOHEADER))))
     {
@@ -200,85 +201,51 @@
         return NULL;
     }
 
-    if (!(colorMapping = (RGBQUAD *)HeapAlloc(GetProcessHeap(), 0,
-                                              colors * sizeof(RGBQUAD) ))) 
+    if (!(colorMapping = (int *)HeapAlloc(GetProcessHeap(), 0,
+                                          colors * sizeof(int) ))) 
 	return NULL;
 
-    if (hPalette == 0) /* DIB_RGB_COLORS */
+    if (coloruse == DIB_RGB_COLORS)
     {
         if (isInfo)
         {
             RGBQUAD * rgb = (RGBQUAD *)colorPtr;
 
-            for (i = 0; i < colors; i++, rgb++)
-                colorMapping[i] = *rgb;
+            if (depth == 1)  /* Monochrome */
+                for (i = 0; i < colors; i++, rgb++)
+                    colorMapping[i] = (rgb->rgbRed + rgb->rgbGreen +
+                                       rgb->rgbBlue > 255*3/2);
+            else
+                for (i = 0; i < colors; i++, rgb++)
+                    colorMapping[i] = COLOR_ToPhysical( dc, RGB(rgb->rgbRed,
+                                                                rgb->rgbGreen,
+                                                                rgb->rgbBlue));
         }
         else
         {
             RGBTRIPLE * rgb = (RGBTRIPLE *)colorPtr;
-        
-            for (i = 0; i < colors; i++, rgb++)
-                colorMapping[i].rgbRed   = rgb->rgbtRed,
-                colorMapping[i].rgbGreen = rgb->rgbtGreen,
-                colorMapping[i].rgbBlue  = rgb->rgbtBlue;
+
+            if (depth == 1)  /* Monochrome */
+                for (i = 0; i < colors; i++, rgb++)
+                    colorMapping[i] = (rgb->rgbtRed + rgb->rgbtGreen +
+                                       rgb->rgbtBlue > 255*3/2);
+            else
+                for (i = 0; i < colors; i++, rgb++)
+                    colorMapping[i] = COLOR_ToPhysical( dc, RGB(rgb->rgbtRed,
+                                                               rgb->rgbtGreen,
+                                                               rgb->rgbtBlue));
         }
     }
     else  /* DIB_PAL_COLORS */
     {
-	PALETTEOBJ *palPtr = (PALETTEOBJ *)GDI_GetObjPtr(hPalette, PALETTE_MAGIC);
-	if (!palPtr) 
-	{
-	    HeapFree(GetProcessHeap(), 0, colorMapping);
-	    return NULL;
-	}
-
         for (i = 0; i < colors; i++, colorPtr++)
-	    if (*colorPtr >= palPtr->logpalette.palNumEntries)
-	    {
-		colorMapping[i].rgbRed   = 0;
-		colorMapping[i].rgbGreen = 0;
-		colorMapping[i].rgbBlue  = 0;
-	    }
-	    else
-	    {
-		PALETTEENTRY *pe = palPtr->logpalette.palPalEntry + *colorPtr;
-		colorMapping[i].rgbRed   = pe->peRed;
-		colorMapping[i].rgbGreen = pe->peGreen;
-		colorMapping[i].rgbBlue  = pe->peBlue;
-	    }
-	
-	GDI_HEAP_UNLOCK(hPalette);
+            colorMapping[i] = COLOR_ToPhysical( dc, PALETTEINDEX(*colorPtr) );
     }
 
     *nColors = colors;
     return colorMapping;
 }
 
-/***********************************************************************
- *           DIB_PhysicalColorMap
- *
- * Translate color map to physical colors
- */
-static int *DIB_PhysicalColorMap( DC *dc, int depth, 
-				  RGBQUAD *colorMap, int nColorMap)
-{
-    int *colorMapping, i;
-
-    if (!nColorMap) return NULL;
-    if (!(colorMapping = (int *)HeapAlloc(GetProcessHeap(), 0,
-                                          nColorMap * sizeof(int) ))) return NULL;
-
-    if (depth == 1) /* Monochrome */
-	for (i = 0; i < nColorMap; i++, colorMap++)
-	    colorMapping[i] = (colorMap->rgbRed + colorMap->rgbGreen + 
-                               colorMap->rgbBlue > 255*3/2);
-    else
-	for (i = 0; i < nColorMap; i++, colorMap++)
-            colorMapping[i] = COLOR_ToPhysical( dc, RGB(colorMap->rgbRed,
-                                                        colorMap->rgbGreen,
-                                                        colorMap->rgbBlue));
-    return colorMapping;
-}
 
 /***********************************************************************
  *           DIB_MapColor
@@ -834,8 +801,8 @@
  * 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 srcwidth, DWORD dstwidth, int left,
+                                 XImage *bmpImage )
 {
     DWORD x;
     LPWORD ptr;
@@ -927,8 +894,8 @@
  * 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 srcwidth, DWORD dstwidth, int left,
+                                 XImage *bmpImage )
 {
     DWORD x;
     int h;
@@ -1013,8 +980,8 @@
  * 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 srcwidth, DWORD dstwidth, int left,
+                                 XImage *bmpImage )
 {
     DWORD x;
     int h;
@@ -1064,44 +1031,37 @@
  */
 static int DIB_SetImageBits( const DIB_SETIMAGEBITS_DESCR *descr )
 {
-    int *colorMapping;
+    int lines = descr->lines >= 0 ? descr->lines : -descr->lines;
     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;
 
     if ( descr->dc && descr->dc->w.flags & DC_DIRTY ) 
-        CLIPPING_UpdateGCRegion(descr->dc);
+        CLIPPING_UpdateGCRegion( descr->dc );
+
+    if (descr->image)
+        bmpImage = descr->image;
+    else
+        XCREATEIMAGE( bmpImage, descr->infoWidth, lines, descr->depth );
 
       /* Transfer the pixels */
-    lines = descr->lines;
-    if (lines < 0) lines = -lines;
-    XCREATEIMAGE(bmpImage, descr->infoWidth, lines, descr->depth );
-
     switch(descr->infoBpp)
     {
     case 1:
 	DIB_SetImageBits_1( descr->lines, descr->bits, descr->infoWidth,
-			    descr->width, descr->xSrc, colorMapping, bmpImage );
+			    descr->width, descr->xSrc, descr->colorMap, bmpImage );
 	break;
     case 4:
 	if (descr->compression) DIB_SetImageBits_RLE4( descr->lines, descr->bits,
                                                 descr->infoWidth, descr->width, descr->xSrc,
-                                                colorMapping, bmpImage );
+                                                descr->colorMap, bmpImage );
 	else DIB_SetImageBits_4( descr->lines, descr->bits, descr->infoWidth,
-                                 descr->width, descr->xSrc, colorMapping, bmpImage );
+                                 descr->width, descr->xSrc, descr->colorMap, bmpImage );
 	break;
     case 8:
 	if (descr->compression) DIB_SetImageBits_RLE8( descr->lines, descr->bits,
                                                 descr->infoWidth, descr->width, descr->xSrc,
-                                                colorMapping, bmpImage );
+                                                descr->colorMap, bmpImage );
 	else DIB_SetImageBits_8( descr->lines, descr->bits, descr->infoWidth,
-                                 descr->width, descr->xSrc, colorMapping, bmpImage );
+                                 descr->width, descr->xSrc, descr->colorMap, bmpImage );
 	break;
     case 15:
     case 16:
@@ -1120,11 +1080,12 @@
         WARN(bitmap, "(%d): Invalid depth\n", descr->infoBpp );
         break;
     }
-    if (colorMapping) HeapFree( GetProcessHeap(), 0, colorMapping );
+
     XPutImage( display, descr->drawable, descr->gc, bmpImage,
                descr->xSrc, descr->ySrc, descr->xDest, descr->yDest,
                descr->width, descr->height );
-    XDestroyImage( bmpImage );
+
+    if (!descr->image) XDestroyImage( bmpImage );
     return lines;
 }
 
@@ -1136,24 +1097,19 @@
  */
 static int DIB_GetImageBits( const DIB_SETIMAGEBITS_DESCR *descr )
 {
-    int *colorMapping;
+    int lines = descr->lines >= 0 ? descr->lines : -descr->lines;
     XImage *bmpImage;
-    int lines;
 
-      /* Translate the color mapping table */
+    if (descr->image)
+        bmpImage = descr->image;
+    else
+        XCREATEIMAGE( bmpImage, descr->infoWidth, lines, descr->depth );
 
-    if (descr->infoBpp > 8) colorMapping = NULL;
-    else if (!(colorMapping = DIB_PhysicalColorMap( descr->dc, descr->depth,
-                                                   descr->colorMap, descr->nColorMap )))
-        return 0;
+    XGetSubImage( display, descr->drawable, descr->xDest, descr->yDest,
+                  descr->width, descr->height, AllPlanes, ZPixmap,
+                  bmpImage, descr->xSrc, descr->ySrc );
 
       /* 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:
@@ -1163,34 +1119,31 @@
     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 );
+                                descr->width, descr->xSrc,
+                                descr->colorMap, 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 );
+                                descr->width, descr->xSrc,
+                                descr->colorMap, 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 );
+                            descr->width, descr->xSrc, bmpImage );
        break;
 
     case 24:
        DIB_GetImageBits_24( descr->lines, (LPVOID)descr->bits, descr->infoWidth,
-                             descr->width, descr->xSrc,
-                             colorMapping, descr->nColorMap, bmpImage );
+                            descr->width, descr->xSrc, bmpImage );
        break;
 
     case 32:
        DIB_GetImageBits_32( descr->lines, (LPVOID)descr->bits, descr->infoWidth,
-                             descr->width, descr->xSrc,
-                             colorMapping, descr->nColorMap, bmpImage );
+                            descr->width, descr->xSrc, bmpImage );
        break;
 
     default:
@@ -1198,9 +1151,7 @@
         break;
     }
 
-    if (colorMapping) HeapFree( GetProcessHeap(), 0, colorMapping );
-
-    XDestroyImage( bmpImage );
+    if (!descr->image) XDestroyImage( bmpImage );
     return lines;
 }
 
@@ -1311,10 +1262,8 @@
 
     if (descr.infoBpp <= 8)
     {
-        descr.colorMap = DIB_BuildColorMap( info, coloruse == DIB_PAL_COLORS?
-                                            descr.dc->w.hPalette : 0, 
-                                            &descr.nColorMap);
-
+        descr.colorMap = DIB_BuildColorMap( descr.dc, coloruse, bmp->bitmap.bmBitsPixel,
+                                            info, &descr.nColorMap );
         if (!descr.colorMap)
         {
             GDI_HEAP_UNLOCK( hbitmap );
@@ -1323,9 +1272,8 @@
         } 
     }
 
-
-
     descr.bits      = bits;
+    descr.image     = NULL;
     descr.lines     = tmpheight >= 0 ? lines : -lines;
     descr.depth     = bmp->bitmap.bmBitsPixel;
     descr.drawable  = bmp->pixmap;
@@ -1401,17 +1349,17 @@
     DC_SetupGCForText( dc );  /* To have the correct colors */
     TSXSetFunction( display, dc->u.x.gc, DC_XROPfunction[dc->w.ROPmode-1] );
 
-    descr.dc = dc;
     if (descr.infoBpp <= 8)
     {
-        descr.colorMap = DIB_BuildColorMap( info, coloruse == DIB_PAL_COLORS?
-                                            descr.dc->w.hPalette : 0, 
-                                            &descr.nColorMap );
-
+        descr.colorMap = DIB_BuildColorMap( dc, coloruse, dc->w.bitsPerPixel,
+                                            info, &descr.nColorMap );
         if (!descr.colorMap)
             return 0;
     }
+
+    descr.dc        = dc;
     descr.bits      = bits;
+    descr.image     = NULL;
     descr.lines     = tmpheight >= 0 ? lines : -lines;
     descr.infoWidth = width;
     descr.depth     = dc->w.bitsPerPixel;
@@ -1638,14 +1586,10 @@
 	   	pad += ((32 - (info->bmiHeader.biWidth & 31)) / 8) & 3;
 		for( y = yend - 1; (int)y >= (int)startscan; y-- )
 		{
-		   *bbits = 0;
 		   for( x = 0; x < xend; x++ ) {
-		   	
+		   	if (!(x&7)) *bbits = 0;
 			*bbits |= XGetPixel( bmpImage, x, y)<<(7-(x&7));
-			if ((x&7)==7) {
-			    bbits++;
-			    *bbits=0;
-			}
+			if ((x&7)==7) bbits++;
 		   }
 		   bbits += pad;
 		}
@@ -1654,14 +1598,10 @@
 	   	pad += ((8 - (info->bmiHeader.biWidth & 7)) / 2) & 3;
 		for( y = yend - 1; (int)y >= (int)startscan; y-- )
 		{
-		   *bbits = 0;
 		   for( x = 0; x < xend; x++ ) {
-		   	
+		   	if (!(x&1)) *bbits = 0;
 			*bbits |= XGetPixel( bmpImage, x, y)<<(4*(1-(x&1)));
-			if ((x&1)==1) {
-			    bbits++;
-			    *bbits=0;
-			}
+			if ((x&1)==1) bbits++;
 		   }
 		   bbits += pad;
 		}
@@ -1671,7 +1611,6 @@
 	   	pad += (4 - ((info->bmiHeader.biWidth*2) & 3)) & 3;
 		for( y = yend - 1; (int)y >= (int)startscan; y-- )
 		{
-		   *bbits = 0;
 		   for( x = 0; x < xend; x++ ) {
 		   	unsigned long pixel=XGetPixel( bmpImage, x, y);
 			*bbits++ = pixel & 0xff;
@@ -1684,7 +1623,6 @@
 	   	pad += (4 - ((info->bmiHeader.biWidth*3) & 3)) & 3;
 		for( y = yend - 1; (int)y >= (int)startscan; y-- )
 		{
-		   *bbits = 0;
 		   for( x = 0; x < xend; x++ ) {
 		   	unsigned long pixel=XGetPixel( bmpImage, x, y);
 			*bbits++ = (pixel >>16) & 0xff;
@@ -1697,7 +1635,6 @@
 	   case 32:
 		for( y = yend - 1; (int)y >= (int)startscan; y-- )
 		{
-		   *bbits = 0;
 		   for( x = 0; x < xend; x++ ) {
 		   	unsigned long pixel=XGetPixel( bmpImage, x, y);
 			*bbits++ = (pixel >>16) & 0xff;
@@ -1824,7 +1761,7 @@
  */
 static void DIB_DoProtectDIBSection( BITMAPOBJ *bmp, DWORD new_prot )
 {
-    DIBSECTION *dib = bmp->dibSection;
+    DIBSECTION *dib = &bmp->dib->dibSection;
     INT32 effHeight = dib->dsBm.bmHeight >= 0? dib->dsBm.bmHeight
                                              : -dib->dsBm.bmHeight;
     INT32 totalSize = dib->dsBmih.biSizeImage? dib->dsBmih.biSizeImage
@@ -1841,17 +1778,18 @@
  */
 static void DIB_DoUpdateDIBSection( BITMAPOBJ *bmp, BOOL32 toDIB )
 {
-    DIBSECTION *dib = bmp->dibSection;
+    DIBSECTIONOBJ *dib = bmp->dib;
     DIB_SETIMAGEBITS_DESCR descr;
 
-    if (DIB_GetBitmapInfo( &dib->dsBmih, &descr.infoWidth, &descr.lines,
+    if (DIB_GetBitmapInfo( &dib->dibSection.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.image     = dib->image;
+    descr.colorMap  = dib->colorMap;
+    descr.nColorMap = dib->nColorMap;
+    descr.bits      = dib->dibSection.dsBm.bmBits;
     descr.depth     = bmp->bitmap.bmBitsPixel;
     descr.drawable  = bmp->pixmap;
     descr.gc        = BITMAP_GC(bmp);
@@ -1889,22 +1827,22 @@
     bmp = (BITMAPOBJ *)GDI_GetObjPtr( (HBITMAP32)res, BITMAP_MAGIC );
     if (!bmp) return FALSE;
 
-    if (bmp->dibSection)
-        switch (bmp->status)
+    if (bmp->dib)
+        switch (bmp->dib->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;
+            bmp->dib->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;
+            bmp->dib->status = DIB_AppMod;
             handled = TRUE;
             break;
 
@@ -1938,7 +1876,7 @@
     bmp = (BITMAPOBJ *)GDI_GetObjPtr( dc->w.hBitmap, BITMAP_MAGIC );
     if (!bmp) return;
 
-    if (!bmp->dibSection)
+    if (!bmp->dib)
     {
 	GDI_HEAP_UNLOCK(dc->w.hBitmap);
 	return;
@@ -1949,7 +1887,7 @@
     {
         /* Prepare for access to the DIB by GDI functions */
 
-        switch (bmp->status)
+        switch (bmp->dib->status)
         {
         default:
         case DIB_NoHandler:
@@ -1970,7 +1908,7 @@
             TRACE( bitmap, "fromDIB called in status DIB_AppMod\n" );
             DIB_DoUpdateDIBSection( bmp, FALSE );
             DIB_DoProtectDIBSection( bmp, PAGE_READONLY );
-            bmp->status = DIB_InSync;
+            bmp->dib->status = DIB_InSync;
             break;
         }
     }
@@ -1978,7 +1916,7 @@
     {
         /* Acknowledge write access to the DIB by GDI functions */
 
-        switch (bmp->status)
+        switch (bmp->dib->status)
         {
         default:
         case DIB_NoHandler:
@@ -1993,7 +1931,7 @@
         case DIB_InSync:
             TRACE( bitmap, "  toDIB called in status DIB_InSync\n" );
             DIB_DoProtectDIBSection( bmp, PAGE_NOACCESS );
-            bmp->status = DIB_GdiMod;
+            bmp->dib->status = DIB_GdiMod;
             break;
 
         case DIB_AppMod:
@@ -2026,8 +1964,8 @@
 {
     HBITMAP32 res = 0;
     BITMAPOBJ *bmp = NULL;
-    DIBSECTION *dib = NULL;
-    RGBQUAD *colorMap = NULL;
+    DIBSECTIONOBJ *dib = NULL;
+    int *colorMap = NULL;
     int nColorMap;
 
     /* Fill BITMAP32 structure with DIB data */
@@ -2064,50 +2002,46 @@
 	bm.bmBits = VirtualAlloc(NULL, totalSize, 
                                  MEM_RESERVE|MEM_COMMIT, PAGE_READWRITE);
 
+    /* Create Color Map */
+    if (bm.bmBits && bm.bmBitsPixel <= 8)
+    {
+        DC *dc = (DC *)GDI_GetObjPtr(hdc, DC_MAGIC);
+        if (!dc) dc = (DC *)GDI_GetObjPtr(hdc, METAFILE_DC_MAGIC);
+
+        if (dc) colorMap = DIB_BuildColorMap( dc, usage, bm.bmBitsPixel,
+                                              bmi, &nColorMap );
+        GDI_HEAP_UNLOCK(hdc);
+    }
+
     /* Allocate Memory for DIB and fill structure */
     if (bm.bmBits)
-	dib = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(DIBSECTION));
+	dib = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(DIBSECTIONOBJ));
     if (dib)
     {
-	dib->dsBm = bm;
-	dib->dsBmih = *bi;
-	/* FIXME: dib->dsBitfields ??? */
-	dib->dshSection = section;
-	dib->dsOffset = offset;
+	dib->dibSection.dsBm = bm;
+	dib->dibSection.dsBmih = *bi;
+	/* FIXME: dib->dibSection.dsBitfields ??? */
+	dib->dibSection.dshSection = section;
+	dib->dibSection.dsOffset = offset;
+
+        dib->status    = DIB_NoHandler;
+        
+	dib->nColorMap = nColorMap;
+        dib->colorMap  = colorMap;
     }
 
-    /* Create Color Map */
-    if (dib && bm.bmBitsPixel <= 8)
-    {
-        HPALETTE16 hPalette = 0;
-        if (usage == DIB_PAL_COLORS)
-        {
-            DC *dc = (DC *)GDI_GetObjPtr(hdc, DC_MAGIC);
-            if (!dc) 
-	        dc = (DC *)GDI_GetObjPtr(hdc, METAFILE_DC_MAGIC);
-            if (dc)
-	    {
-		hPalette = dc->w.hPalette;
-		GDI_HEAP_UNLOCK(hdc);
-	    }
-	}
-	colorMap = DIB_BuildColorMap(bmi, hPalette, &nColorMap);
-    }
-
-    /* Create Device Dependent Bitmap and add DIB/ColorMap info */
+    /* Create Device Dependent Bitmap and add DIB pointer */
     if (dib) 
     {
        res = CreateDIBitmap32(hdc, bi, 0, NULL, bmi, usage);
        bmp = (BITMAPOBJ *) GDI_GetObjPtr(res, BITMAP_MAGIC);
-       if (bmp)
-       {
-	    bmp->dibSection = dib;
-            bmp->colorMap   = colorMap;
-	    bmp->nColorMap  = nColorMap;
-            bmp->status     = DIB_NoHandler;
-       }
+       if (bmp) bmp->dib = dib;
     }
 
+    /* Create XImage */
+    if (dib && bmp)
+        XCREATEIMAGE( dib->image, bm.bmWidth, effHeight, bmp->bitmap.bmBitsPixel );
+
     /* Clean up in case of errors */
     if (!res || !bmp || !dib || !bm.bmBits || (bm.bmBitsPixel <= 8 && !colorMap))
     {
@@ -2117,6 +2051,7 @@
             else
                 VirtualFree(bm.bmBits, MEM_RELEASE, 0L), bm.bmBits = NULL;
 
+        if (dib->image) XDestroyImage(dib->image), dib->image = NULL;
 	if (colorMap) HeapFree(GetProcessHeap(), 0, colorMap), colorMap = NULL;
 	if (dib) HeapFree(GetProcessHeap(), 0, dib), dib = NULL;
 	if (res) DeleteObject32(res), res = 0;
@@ -2127,7 +2062,7 @@
         if (VIRTUAL_SetFaultHandler(bm.bmBits, DIB_FaultHandler, (LPVOID)res))
         {
             DIB_DoProtectDIBSection( bmp, PAGE_READONLY );
-            bmp->status = DIB_InSync;
+            dib->status = DIB_InSync;
         }
 
     /* Return BITMAP handle and storage location */
@@ -2136,3 +2071,29 @@
     return res;
 }
 
+/***********************************************************************
+ *           DIB_DeleteDIBSection
+ */
+void DIB_DeleteDIBSection( BITMAPOBJ *bmp )
+{
+    if (bmp && bmp->dib)
+    {
+        DIBSECTIONOBJ *dib = bmp->dib;
+
+        if (dib->dibSection.dsBm.bmBits)
+            if (dib->dibSection.dshSection)
+                UnmapViewOfFile(dib->dibSection.dsBm.bmBits);
+            else
+                VirtualFree(dib->dibSection.dsBm.bmBits, MEM_RELEASE, 0L);
+
+        if (dib->image) 
+            XDestroyImage( dib->image );
+
+        if (dib->colorMap)
+            HeapFree(GetProcessHeap(), 0, dib->colorMap);
+
+        HeapFree(GetProcessHeap(), 0, dib);
+        bmp->dib = NULL;
+    }
+}
+
diff --git a/objects/enhmetafile.c b/objects/enhmetafile.c
index eac0c8e..dcb3dc2 100644
--- a/objects/enhmetafile.c
+++ b/objects/enhmetafile.c
@@ -82,7 +82,7 @@
 }
 
 /*****************************************************************************
- *          GetEnhMetaFileDescription32W  (GDI32.xxx)
+ *          GetEnhMetaFileDescription32W  (GDI32.177)
  *
  *  Copies the description string of an enhanced metafile into a buffer 
  *  _buf_.
@@ -142,10 +142,8 @@
  *    Many unimplemented records.
  */
 BOOL32 WINAPI PlayEnhMetaFileRecord( 
-     HDC32 hdc, 
-     /* device context in which to render EMF record */
-     LPHANDLETABLE32 handletable, 
-     /* array of handles to be used in rendering record */
+     HDC32 hdc, /* device context in which to render EMF record */
+     LPHANDLETABLE32 handletable, /* array of handles to be used in rendering record */
      const ENHMETARECORD *mr, /* EMF record to render */
      UINT32 handles  /* size of handle array */
      ) 
diff --git a/objects/font.c b/objects/font.c
index 6f5a911..9c1d638 100644
--- a/objects/font.c
+++ b/objects/font.c
@@ -1230,12 +1230,14 @@
     return GetKerningPairs32A( hDC, cPairs, lpKerningPairs );
 }
 
+/*************************************************************************
+ * TranslateCharSetInfo [GDI32.382]
+ */
 BOOL32 WINAPI TranslateCharSetInfo(LPDWORD lpSrc,LPCHARSETINFO lpCs,DWORD dwFlags) {
     FIXME(font,"(%p,%p,0x%08lx), stub.\n",lpSrc,lpCs,dwFlags);
     return TRUE;
 }
 
-
 /*************************************************************************
  *             GetFontLanguageInfo   (GDI32.182)
  */
@@ -1253,3 +1255,31 @@
 	FIXME(font,"(%x):stub!\n",hdc);
 	return 0;
 }
+
+
+/*************************************************************************
+ * GetCharacterPlacement32A [GDI32.160]
+ */
+DWORD WINAPI
+GetCharacterPlacement32A(HDC32 hdc, LPCSTR lpString, UINT32 uCount,
+			 INT32 nMaxExtent, GCP_RESULTS32A lpResults,
+			 DWORD dwFlags)
+{
+    /* return value 0 is correct for most cases anyway */
+    FIXME(font,":stub!\n");
+    return 0;
+}
+
+/*************************************************************************
+ * GetCharacterPlacement32W [GDI32.161]
+ */
+DWORD WINAPI
+GetCharacterPlacement32W(HDC32 hdc, LPCWSTR lpString, UINT32 uCount,
+			 INT32 nMaxExtent, GCP_RESULTS32W lpResults,
+			 DWORD dwFlags)
+{
+    /* return value 0 is correct for most cases anyway */
+    FIXME(font,":stub!\n");
+    return 0;
+}
+
diff --git a/objects/oembitmap.c b/objects/oembitmap.c
index cc4d191..6a016ce 100644
--- a/objects/oembitmap.c
+++ b/objects/oembitmap.c
@@ -336,11 +336,7 @@
     bmpObjPtr->bitmap.bmPlanes     = 1;
     bmpObjPtr->bitmap.bmBitsPixel  = bpp;
     bmpObjPtr->bitmap.bmBits       = (SEGPTR)NULL;
-
-    bmpObjPtr->dibSection          = NULL;
-    bmpObjPtr->colorMap            = NULL;
-    bmpObjPtr->nColorMap           = 0;
-    bmpObjPtr->status              = DIB_NoHandler;
+    bmpObjPtr->dib                 = NULL;
 
     GDI_HEAP_UNLOCK( hbitmap );
     return hbitmap;
diff --git a/objects/palette.c b/objects/palette.c
index 5752cb7..c23c784 100644
--- a/objects/palette.c
+++ b/objects/palette.c
@@ -594,6 +594,11 @@
             return RealizeDefaultPalette( hdc );
 
         palPtr = (PALETTEOBJ *) GDI_GetObjPtr( dc->w.hPalette, PALETTE_MAGIC );
+
+	if (!palPtr) {
+		FIXME(palette,"invalid selected palette %04x\n",dc->w.hPalette);
+		return 0;
+	}
         
         realized = COLOR_SetMapping(palPtr,0,palPtr->logpalette.palNumEntries,
                                     (dc->w.hPalette != hPrimaryPalette) ||
diff --git a/objects/region.c b/objects/region.c
index 6c79e1e..1f014a1 100644
--- a/objects/region.c
+++ b/objects/region.c
@@ -2506,3 +2506,20 @@
 {
     return CreatePolyPolygonRgn32( points, &count, 1, mode );
 }
+
+
+/***********************************************************************
+ * GetRandomRgn [GDI32.215]
+ *
+ * NOTES
+ *     This function is UNDOCUMENTED, it isn't even in the header file.
+ *     I assume that it will return a HRGN32!??
+ */
+HRGN32 WINAPI GetRandomRgn(DWORD dwArg1, DWORD dwArg2, DWORD dwArg3)
+{
+    FIXME (region, "(0x%08x 0x%08x 0x%08x): empty stub!\n",
+	   dwArg1, dwArg2, dwArg3);
+
+    return NULL;
+}
+
diff --git a/ole/compobj.c b/ole/compobj.c
index ba84e5d..a5fc327 100644
--- a/ole/compobj.c
+++ b/ole/compobj.c
@@ -231,6 +231,12 @@
   char *s;
   int	i;
 
+  if (!id)
+	{ ERR(ole,"called with id=Null\n");
+	  *idstr = 0x00;
+	  return E_FAIL;
+	}
+	
   sprintf(idstr, "{%08lx-%04x-%04x-%02x%02x-",
 	  id->Data1, id->Data2, id->Data3,
 	  id->Data4[0], id->Data4[1]);
diff --git a/ole/folders.c b/ole/folders.c
index 1c37812..a74a2a7 100644
--- a/ole/folders.c
+++ b/ole/folders.c
@@ -1,9 +1,10 @@
 /*
- *	Shell Folder stuff
+ *	Shell Folder stuff (...and all the OLE-Objects of SHELL32.DLL)
  *
  *	Copyright 1997	Marcus Meissner
+ *	Copyright 1998	Juergen Schmied
  *
- *  currently work in progress on IShellFolders,IEnumIDList and pidl handling
+ *  !!! currently work in progress on all classes !!!
  *  <contact juergen.schmied@metronet.de, 980624>
  */
 
@@ -17,180 +18,914 @@
 #include "interfaces.h"
 #include "shlobj.h"
 #include "winerror.h"
+#include "winnls.h"
 
-/******************************************************************************
- * IEnumIDList implementation
+/* FIXME should be moved to a header file. IsEqualGUID 
+is declared but not exported in compobj.c !!!*/
+#define IsEqualGUID(rguid1, rguid2) (!memcmp(rguid1, rguid2, sizeof(GUID)))
+#define IsEqualIID(riid1, riid2) IsEqualGUID(riid1, riid2)
+#define IsEqualCLSID(rclsid1, rclsid2) IsEqualGUID(rclsid1, rclsid2)
+/***************************************************************************
+ *  GetNextElement (internal function)
+ *
+ *  RETURNS
+ *    LPSTR pointer to first, not yet parsed char
  */
+LPSTR GetNextElement(
+    LPSTR pszNext, /*[IN] string to get the element from*/
+		LPSTR pszOut,  /*[IN] pointer to buffer whitch receives string*/
+		DWORD dwOut)   /*[IN] length of pszOut*/
+{ LPSTR   pszTail = pszNext;
+  DWORD dwCopy;
+  TRACE(shell,"(%s %p %lx)\n",pszNext,	pszOut, dwOut);
 
-static ULONG WINAPI IEnumIDList_AddRef(LPENUMIDLIST this) {
-	TRACE(ole,"(%p)->()\n",this);
-	return ++(this->ref);
+  if(!pszNext || !*pszNext)
+    return NULL;
+
+  while(*pszTail && (*pszTail != '\\'))
+  { pszTail++;
+  }
+  dwCopy=((LPBYTE)pszTail-(LPBYTE)pszNext)/sizeof(CHAR)+1;
+  lstrcpyn32A(pszOut, pszNext, (dwOut<dwCopy)? dwOut : dwCopy);
+
+  if(*pszTail)
+  {  pszTail++;
+	}
+
+  TRACE(shell,"--(%s %s %lx)\n",pszNext,	pszOut, dwOut);
+  return pszTail;
 }
 
-static ULONG WINAPI IEnumIDList_Release(LPENUMIDLIST this) {
-	TRACE(ole,"(%p)->()\n",this);
-	if (!--(this->ref)) {
-		WARN(ole," freeing IEnumIDList(%p)\n",this);
+/**************************************************************************
+*  IClassFactory Implementation
+*/
+static HRESULT WINAPI IClassFactory_QueryInterface(LPCLASSFACTORY,REFIID,LPVOID*);
+static ULONG WINAPI IClassFactory_AddRef(LPCLASSFACTORY);
+static ULONG WINAPI IClassFactory_Release(LPCLASSFACTORY);
+static HRESULT WINAPI IClassFactory_CreateInstance();
+/*static HRESULT WINAPI IClassFactory_LockServer();*/
+/**************************************************************************
+ *  IClassFactory_VTable
+ */
+static IClassFactory_VTable clfvt = {
+	IClassFactory_QueryInterface,
+	IClassFactory_AddRef,
+	IClassFactory_Release,
+	IClassFactory_CreateInstance,
+/*	IClassFactory_LockServer*/
+};
+
+/**************************************************************************
+ *  IClassFactory_Constructor
+ */
+
+LPCLASSFACTORY IClassFactory_Constructor()
+{	LPCLASSFACTORY	lpclf;
+
+	lpclf= (LPCLASSFACTORY)HeapAlloc(GetProcessHeap(),0,sizeof(IClassFactory));
+	lpclf->ref = 1;
+	lpclf->lpvtbl = &clfvt;
+  TRACE(shell,"(%p)->()\n",lpclf);
+	return lpclf;
+}
+/**************************************************************************
+ *  IClassFactory::QueryInterface
+ */
+static HRESULT WINAPI IClassFactory_QueryInterface(
+  LPCLASSFACTORY this, REFIID riid, LPVOID *ppvObj)
+{  char	xriid[50];
+   WINE_StringFromCLSID((LPCLSID)riid,xriid);
+   TRACE(shell,"(%p)->(\n\tIID:\t%s)\n",this,xriid);
+
+  *ppvObj = NULL;
+
+  if(IsEqualIID(riid, &IID_IUnknown))          /*IUnknown*/
+  { *ppvObj = this; 
+  }
+  else if(IsEqualIID(riid, &IID_IClassFactory))  /*IClassFactory*/
+  {    *ppvObj = (IClassFactory*)this;
+  }   
+
+  if(*ppvObj)
+  { (*(LPCLASSFACTORY*)ppvObj)->lpvtbl->fnAddRef(this);  	
+    TRACE(shell,"-- Interface: (%p)->(%p)\n",ppvObj,*ppvObj);
+    return S_OK;
+  }
+	TRACE(shell,"-- Interface: E_NOINTERFACE\n");
+  return E_NOINTERFACE;
+}  
+/******************************************************************************
+ * IClassFactory_AddRef
+ */
+static ULONG WINAPI IClassFactory_AddRef(LPCLASSFACTORY this)
+{ TRACE(shell,"(%p)->(count=%lu)\n",this,this->ref);
+	return ++(this->ref);
+}
+/******************************************************************************
+ * IClassFactory_Release
+ */
+static ULONG WINAPI IClassFactory_Release(LPCLASSFACTORY this)
+{	TRACE(shell,"(%p)->(count=%lu)\n",this,this->ref);
+	if (!--(this->ref)) 
+	{ TRACE(shell,"-- destroying IClassFactory(%p)\n",this);
 		HeapFree(GetProcessHeap(),0,this);
 		return 0;
 	}
 	return this->ref;
 }
+/******************************************************************************
+ * IClassFactory_CreateInstance
+ */
+static HRESULT WINAPI IClassFactory_CreateInstance(
+  LPCLASSFACTORY this, LPUNKNOWN pUnknown, REFIID riid, LPVOID *ppObject)
+{ LPSHELLFOLDER pSHFolder;
+  HRESULT hResult=E_OUTOFMEMORY;
+  
+	char	xriid[50];
+  WINE_StringFromCLSID((LPCLSID)riid,xriid);
+  TRACE(shell,"%p->(%p,\n\tIID:\t%s)\n",this,pUnknown,xriid);
 
-static HRESULT WINAPI IEnumIDList_Next(
-	LPENUMIDLIST this,ULONG celt,LPITEMIDLIST *rgelt,ULONG *pceltFetched
-) {
-	FIXME(ole,"(%p)->(%ld,%p,%p),stub!\n",
-		this,celt,rgelt,pceltFetched
-	);
-	*pceltFetched = 0; /* we don't have any ... */
-	return 0;
+  *ppObject = NULL;
+	
+	if(pUnknown)
+	{	return CLASS_E_NOAGGREGATION;
+	}
+
+	if (IsEqualIID(riid, &IID_IShellFolder))
+  { pSHFolder = IShellFolder_Constructor(NULL,NULL);
+    if(pSHFolder)
+  	{ hResult = pSHFolder->lpvtbl->fnQueryInterface(pSHFolder,riid, ppObject);
+      pSHFolder->lpvtbl->fnRelease(pSHFolder);
+  		TRACE(shell,"-- ShellFolder created: (%p)->%p\n",this,*ppObject);
+  	}
+	}	
+	else
+	{  FIXME(shell,"unknown IID requested\n\tIID:\t%s\n",xriid);
+	   hResult=E_NOINTERFACE;
+	}
+  return hResult;
+}
+/******************************************************************************
+ * IClassFactory_LockServer
+ */
+/*static HRESULT WINAPI IClassFactory_LockServer(LPCLASSFACTORY this, BOOL)
+{ TRACE(shell,"%p->(), not implemented\n",this)
+  return E_NOTIMPL;
 }
 
+*/
+/**************************************************************************
+ *  IEnumIDList Implementation
+ */
+static HRESULT WINAPI IEnumIDList_QueryInterface(LPENUMIDLIST,REFIID,LPVOID*);
+static ULONG WINAPI IEnumIDList_AddRef(LPENUMIDLIST);
+static ULONG WINAPI IEnumIDList_Release(LPENUMIDLIST);
+static HRESULT WINAPI IEnumIDList_Next(LPENUMIDLIST,ULONG,LPITEMIDLIST*,ULONG*);
+static HRESULT WINAPI IEnumIDList_Skip(LPENUMIDLIST,ULONG);
+static HRESULT WINAPI IEnumIDList_Reset(LPENUMIDLIST);
+static HRESULT WINAPI IEnumIDList_Clone(LPENUMIDLIST,LPENUMIDLIST*);
+static BOOL32 WINAPI IEnumIDList_CreateEnumList(LPENUMIDLIST,LPCSTR, DWORD);
+static BOOL32 WINAPI IEnumIDList_AddToEnumList(LPENUMIDLIST,LPITEMIDLIST);
+static BOOL32 WINAPI IEnumIDList_DeleteList(LPENUMIDLIST);
+/**************************************************************************
+ *  IEnumIDList_VTable
+ */
 static IEnumIDList_VTable eidlvt = {
-	(void *)1,
+	IEnumIDList_QueryInterface,
 	IEnumIDList_AddRef,
 	IEnumIDList_Release,
 	IEnumIDList_Next,
-	(void *)5,
-        (void *)6,
-        (void *)7
+	IEnumIDList_Skip,
+	IEnumIDList_Reset,
+  IEnumIDList_Clone,
+	IEnumIDList_CreateEnumList,
+  IEnumIDList_AddToEnumList,
+	IEnumIDList_DeleteList
 };
 
-LPENUMIDLIST IEnumIDList_Constructor() {
-	LPENUMIDLIST	lpeidl;
+/**************************************************************************
+ *  IEnumIDList_Constructor
+ */
 
-	lpeidl= (LPENUMIDLIST)HeapAlloc(GetProcessHeap(),0,sizeof(IEnumIDList));
+LPENUMIDLIST IEnumIDList_Constructor( LPCSTR lpszPath, DWORD dwFlags, HRESULT* pResult)
+{	LPENUMIDLIST	lpeidl;
+
+	lpeidl = (LPENUMIDLIST)HeapAlloc(GetProcessHeap(),0,sizeof(IEnumIDList));
 	lpeidl->ref = 1;
 	lpeidl->lpvtbl = &eidlvt;
+	lpeidl->mpFirst=NULL;
+	lpeidl->mpLast=NULL;
+	lpeidl->mpCurrent=NULL;
+
+  TRACE(shell,"(%p)->(%s %lx %p)\n",lpeidl,lpszPath,dwFlags,pResult);
+
+	lpeidl->mpPidlMgr=PidlMgr_Constructor();
+  if (!lpeidl->mpPidlMgr)
+	{ if (pResult)
+	  { *pResult=E_OUTOFMEMORY;
+			HeapFree(GetProcessHeap(),0,lpeidl);
+			return NULL;
+		}
+	}
+
+	if(!IEnumIDList_CreateEnumList(lpeidl, lpszPath, dwFlags))
+  { if(pResult)
+    { *pResult = E_OUTOFMEMORY;
+			HeapFree(GetProcessHeap(),0,lpeidl->mpPidlMgr);
+			HeapFree(GetProcessHeap(),0,lpeidl);
+			return NULL;
+		}
+  }
+
+  TRACE(shell,"-- (%p)->()\n",lpeidl);
 	return lpeidl;
 }
 
-/******************************************************************************
- * IShellFolder implementation
+/**************************************************************************
+ *  EnumIDList::QueryInterface
  */
-static ULONG WINAPI IShellFolder_Release(LPSHELLFOLDER this) {
-	TRACE(ole,"(%p)->(count=%lu)\n",this,this->ref);
-	if (!--(this->ref)) {
-		WARN(ole," freeing IShellFolder(%p)\n",this);
+static HRESULT WINAPI IEnumIDList_QueryInterface(
+  LPENUMIDLIST this, REFIID riid, LPVOID *ppvObj)
+{  char	xriid[50];
+   WINE_StringFromCLSID((LPCLSID)riid,xriid);
+   TRACE(shell,"(%p)->(\n\tIID:\t%s,%p)\n",this,xriid,ppvObj);
+
+  *ppvObj = NULL;
+
+  if(IsEqualIID(riid, &IID_IUnknown))          /*IUnknown*/
+  { *ppvObj = this; 
+  }
+  else if(IsEqualIID(riid, &IID_IEnumIDList))  /*IEnumIDList*/
+  {    *ppvObj = (IEnumIDList*)this;
+  }   
+
+  if(*ppvObj)
+  { (*(LPENUMIDLIST*)ppvObj)->lpvtbl->fnAddRef(this);  	
+    TRACE(shell,"-- Interface: (%p)->(%p)\n",ppvObj,*ppvObj);
+    return S_OK;
+  }
+	TRACE(shell,"-- Interface: E_NOINTERFACE\n");
+	return E_NOINTERFACE;
+}   
+
+/******************************************************************************
+ * IEnumIDList_AddRef
+ */
+static ULONG WINAPI IEnumIDList_AddRef(LPENUMIDLIST this)
+{ TRACE(shell,"(%p)->()\n",this);
+	return ++(this->ref);
+}
+/******************************************************************************
+ * IEnumIDList_Release
+ */
+static ULONG WINAPI IEnumIDList_Release(LPENUMIDLIST this)
+{	TRACE(shell,"(%p)->()\n",this);
+	if (!--(this->ref)) 
+	{ TRACE(shell," destroying IEnumIDList(%p)\n",this);
 		HeapFree(GetProcessHeap(),0,this);
 		return 0;
 	}
 	return this->ref;
 }
+   
+/**************************************************************************
+ *  IEnumIDList_Next
+ */
 
-static ULONG WINAPI IShellFolder_AddRef(LPSHELLFOLDER this) {
-	TRACE(ole,"(%p)->(count=%lu)\n",this,(this->ref)+1);
-	return ++(this->ref);
-}
+static HRESULT WINAPI IEnumIDList_Next(
+	LPENUMIDLIST this,ULONG celt,LPITEMIDLIST * rgelt,ULONG *pceltFetched) 
+{ ULONG    i;
+  HRESULT  hr = S_OK;
 
-static HRESULT WINAPI IShellFolder_GetAttributesOf(
-	LPSHELLFOLDER this,UINT32 cidl,LPCITEMIDLIST *apidl,DWORD *rgfInOut
-) {
-	FIXME(ole,"\n	(%p)->(%d,%p->(%p),%p),stub!\n",
-		this,cidl,apidl,*apidl,rgfInOut
-	);
-	return E_NOTIMPL;
-}
+  LPITEMIDLIST  temp;
 
-/*---------------------------------------------------------------
-!		IShellFolder_BindToObject
-!
-*/
-static HRESULT WINAPI IShellFolder_BindToObject(
-	LPSHELLFOLDER this,LPCITEMIDLIST pidl,LPBC pbcReserved,
-	REFIID riid,LPVOID * ppvOut)
-  {	char	xclsid[50];
+	TRACE(shell,"(%p)->(%ld,%p, %p)\n",this,celt,rgelt,pceltFetched);
 
-		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
-) {	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;
-
-	*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;
+	*rgelt=0;
+	
+  if(celt > 1 && !pceltFetched)
+  { return E_INVALIDARG;
 	}
 
-	//*pchEaten = lstrlen32W(lpszDisplayName); 		/* number of char's parsed*/
-	//TRACE(shell,"%1 chars parsed",*pchEaten)
-	return NOERROR;
+  for(i = 0; i < celt; i++)
+  { if(!(this->mpCurrent))
+    { hr =  S_FALSE;
+      break;
+    }
+		temp = this->mpPidlMgr->lpvtbl->fnCopy(this->mpPidlMgr, this->mpCurrent->pidl);
+    rgelt[i] = temp;
+    this->mpCurrent = this->mpCurrent->pNext;
+  }
+  if(pceltFetched)
+  {  *pceltFetched = i;
+	}
+
+  return hr;
 }
 
-static HRESULT WINAPI IShellFolder_EnumObjects(
-	LPSHELLFOLDER this,HWND32 hwndOwner,DWORD grfFlags,
-	LPENUMIDLIST* ppenumIDList
-) {
-	FIXME(ole,"(%p)->(0x%04x,0x%08lx,%p),stub!\n",
-		this,hwndOwner,grfFlags,ppenumIDList
-	);
-	*ppenumIDList = IEnumIDList_Constructor();
-	return 0;
+/**************************************************************************
+*  IEnumIDList_Skip
+*/
+static HRESULT WINAPI IEnumIDList_Skip(
+	LPENUMIDLIST this,ULONG celt)
+{ DWORD    dwIndex;
+  HRESULT  hr = S_OK;
+
+  TRACE(shell,"(%p)->(%lu)\n",this,celt);
+
+  for(dwIndex = 0; dwIndex < celt; dwIndex++)
+  { if(!this->mpCurrent)
+    { hr = S_FALSE;
+      break;
+    }
+    this->mpCurrent = this->mpCurrent->pNext;
+  }
+  return hr;
+}
+/**************************************************************************
+*  IEnumIDList_Reset
+*/
+static HRESULT WINAPI IEnumIDList_Reset(LPENUMIDLIST this)
+{ TRACE(shell,"(%p)\n",this);
+  this->mpCurrent = this->mpFirst;
+  return S_OK;
+}
+/**************************************************************************
+*  IEnumIDList_Clone
+*/
+static HRESULT WINAPI IEnumIDList_Clone(
+	LPENUMIDLIST this,LPENUMIDLIST * ppenum)
+{ TRACE(shell,"(%p)->() to (%p)->() E_NOTIMPL\n",this,ppenum);
+	return E_NOTIMPL;
+}
+/**************************************************************************
+ *  EnumIDList_CreateEnumList()
+ *  fixme: devices not handled
+ *  fixme: add wildcards to path
+ */
+static BOOL32 WINAPI IEnumIDList_CreateEnumList(LPENUMIDLIST this, LPCSTR lpszPath, DWORD dwFlags)
+{ LPITEMIDLIST   pidl=NULL;
+  WIN32_FIND_DATA32A stffile;	
+  HANDLE32 hFile;
+	
+  TRACE(shell,"(%p)->(%s %lx) \n",this,lpszPath,dwFlags);
+
+  /*enumerate the folders*/
+  if(dwFlags & SHCONTF_FOLDERS)
+  { /* special case - we can't enumerate the Desktop level Objects (MyComputer,Nethood...
+   so we need to fake an enumeration of those.*/
+   if(!lpszPath)
+   { //create the pidl for this item
+     pidl = this->mpPidlMgr->lpvtbl->fnCreateDesktop(this->mpPidlMgr);
+     if(pidl)
+     { if(!IEnumIDList_AddToEnumList(this, pidl))
+         return FALSE;
+     }
+     else
+     { return FALSE;
+     }
+   }   
+   else
+   {  hFile = FindFirstFile32A(lpszPath,&stffile);
+      do
+      { if (stffile.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
+			  //create the pidl for this item
+				/* fixme: the shortname should be given too*/
+        pidl = this->mpPidlMgr->lpvtbl->fnCreateFolder(this->mpPidlMgr, stffile.cFileName);
+        if(pidl)
+        { if(!IEnumIDList_AddToEnumList(this, pidl))
+            return FALSE;
+        }
+        else
+        { return FALSE;
+        }   
+      } while( FindNextFile32A(hFile,&stffile));
+			FindClose32 (hFile);
+    }
+  }   
+  //enumerate the non-folder items (values)
+  if(dwFlags & SHCONTF_NONFOLDERS)
+  {   hFile = FindFirstFile32A(lpszPath,&stffile);
+      do
+      { if (! (stffile.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) )
+			  //create the pidl for this item
+				/* fixme: the shortname should be given too*/
+        pidl = this->mpPidlMgr->lpvtbl->fnCreateFolder(this->mpPidlMgr, stffile.cFileName);
+        if(pidl)
+        { if(!IEnumIDList_AddToEnumList(this, pidl))
+          { return FALSE;
+					}
+        }
+        else
+        { return FALSE;
+        }   
+      } while( FindNextFile32A(hFile,&stffile));
+			FindClose32 (hFile);
+   } 
+  return TRUE;
 }
 
-static HRESULT WINAPI IShellFolder_CreateViewObject(
-	LPSHELLFOLDER this,HWND32 hwndOwner,REFIID riid,LPVOID *ppv
-) {
-	char	xclsid[50];
+/**************************************************************************
+ *  EnumIDList_AddToEnumList()
+ */
+static BOOL32 WINAPI IEnumIDList_AddToEnumList(LPENUMIDLIST this,LPITEMIDLIST pidl)
+{ LPENUMLIST  pNew;
 
-	WINE_StringFromCLSID(riid,xclsid);
-	FIXME(ole,"(%p)->(0x%04x,%s,%p),stub!\n",
-		this,hwndOwner,xclsid,ppv
-	);
-	*(DWORD*)ppv = 0;
-	return 0;
+  TRACE(shell,"(%p)->(pidl=%p)\n",this,pidl);
+  pNew = (LPENUMLIST)HeapAlloc(GetProcessHeap(),0,sizeof(ENUMLIST));
+  if(pNew)
+  { //set the next pointer
+    pNew->pNext = NULL;
+    pNew->pidl = pidl;
+
+    //is this the first item in the list?
+    if(!this->mpFirst)
+    { this->mpFirst = pNew;
+      this->mpCurrent = pNew;
+    }
+   
+    if(this->mpLast)
+    { //add the new item to the end of the list
+      this->mpLast->pNext = pNew;
+    }
+   
+    //update the last item pointer
+    this->mpLast = pNew;
+		TRACE(shell,"(%p)->(first=%p, last=%p)\n",this,this->mpFirst,this->mpLast);
+    return TRUE;
+  }
+  return FALSE;
+}
+/**************************************************************************
+*   EnumIDList_DeleteList()
+*/
+static BOOL32 WINAPI IEnumIDList_DeleteList(LPENUMIDLIST this)
+{ LPENUMLIST  pDelete;
+
+  TRACE(shell,"(%p)->()\n",this);
+	
+  while(this->mpFirst)
+  { pDelete = this->mpFirst;
+    this->mpFirst = pDelete->pNext;
+
+    //free the pidl
+    this->mpPidlMgr->lpvtbl->fnDelete(this->mpPidlMgr,pDelete->pidl);
+   
+    //free the list item
+		HeapFree(GetProcessHeap(),0,pDelete);
+  }
+  this->mpFirst = this->mpLast = this->mpCurrent = NULL;
+  return TRUE;
 }
 
-
+/***********************************************************************
+*   IShellFolder implementation
+*/
+/*LPSHELLFOLDER IShellFolder_Constructor();*/
+static HRESULT WINAPI IShellFolder_QueryInterface(LPSHELLFOLDER,REFIID,LPVOID*);
+static ULONG WINAPI IShellFolder_AddRef(LPSHELLFOLDER);
+static ULONG WINAPI IShellFolder_Release(LPSHELLFOLDER);
+static HRESULT WINAPI IShellFolder_Initialize(LPSHELLFOLDER,LPCITEMIDLIST);
+static HRESULT WINAPI IShellFolder_ParseDisplayName(LPSHELLFOLDER,HWND32,LPBC,LPOLESTR32,DWORD*,LPITEMIDLIST*,DWORD*);
+static HRESULT WINAPI IShellFolder_EnumObjects(LPSHELLFOLDER,HWND32,DWORD,LPENUMIDLIST*);
+static HRESULT WINAPI IShellFolder_BindToObject(LPSHELLFOLDER,LPCITEMIDLIST,LPBC,REFIID,LPVOID*);
+static HRESULT WINAPI IShellFolder_BindToStorage(LPSHELLFOLDER,LPCITEMIDLIST,LPBC,REFIID,LPVOID*);
+static HRESULT WINAPI IShellFolder_CompareIDs(LPSHELLFOLDER,LPARAM,LPCITEMIDLIST,LPCITEMIDLIST);
+static HRESULT WINAPI IShellFolder_CreateViewObject(LPSHELLFOLDER,HWND32,REFIID,LPVOID*);
+static HRESULT WINAPI IShellFolder_GetAttributesOf(LPSHELLFOLDER,UINT32,LPCITEMIDLIST*,DWORD*);
+static HRESULT WINAPI IShellFolder_GetUIObjectOf(LPSHELLFOLDER,HWND32,UINT32,LPCITEMIDLIST*,REFIID,UINT32*,LPVOID*);
+static HRESULT WINAPI IShellFolder_GetDisplayNameOf(LPSHELLFOLDER,LPCITEMIDLIST,DWORD,LPSTRRET);
+static HRESULT WINAPI IShellFolder_SetNameOf(LPSHELLFOLDER,HWND32,LPCITEMIDLIST,LPCOLESTR32,DWORD,LPITEMIDLIST*);
+/***********************************************************************
+*
+*	  IShellFolder_VTable
+*/
 static struct IShellFolder_VTable sfvt = {
-        (void *)1,
+  IShellFolder_QueryInterface,
 	IShellFolder_AddRef,
 	IShellFolder_Release,
+	IShellFolder_Initialize,
 	IShellFolder_ParseDisplayName,
 	IShellFolder_EnumObjects,
 	IShellFolder_BindToObject,
-        (void *)7,
-        (void *)8,
+  IShellFolder_BindToStorage,
+  IShellFolder_CompareIDs,
 	IShellFolder_CreateViewObject,
 	IShellFolder_GetAttributesOf,
-        (void *)11,
-        (void *)12,
-        (void *)13
+  IShellFolder_GetUIObjectOf,
+  IShellFolder_GetDisplayNameOf,
+  IShellFolder_SetNameOf
 };
+/**************************************************************************
+*	  IShellFolder_Constructor
+*/
 
-LPSHELLFOLDER IShellFolder_Constructor() {
+LPSHELLFOLDER IShellFolder_Constructor(LPSHELLFOLDER pParent,LPITEMIDLIST pidl) {
 	LPSHELLFOLDER	sf;
+	DWORD dwSize=0;
+	WORD wLen;
 	sf = (LPSHELLFOLDER)HeapAlloc(GetProcessHeap(),0,sizeof(IShellFolder));
 	sf->ref		= 1;
 	sf->lpvtbl	= &sfvt;
-	TRACE(ole,"(%p)->()\n",sf);
+  sf->mlpszFolder=NULL;
+	sf->mpSFParent=pParent;
+
+	TRACE(shell,"(%p)->(parent:%p, pidl=%p)\n",sf,pParent, pidl);
+	
+  sf->pPidlMgr  = PidlMgr_Constructor();
+	if (! sf->pPidlMgr )
+	{ HeapFree(GetProcessHeap(),0,sf);
+	  ERR (shell,"-- Could not initialize PidMGR\n");
+	  return NULL;
+	}
+
+	sf->mpidl = sf->pPidlMgr->lpvtbl->fnCopy(sf->pPidlMgr, pidl);
+	sf->mpidlNSRoot = NULL;
+	
+  if(sf->mpidl)
+  { /*if(sf->pPidlMgr->lpvtbl->fnIsDesktop(sf->pPidlMgr,sf->mpidl))
+    { sf->pPidlMgr->lpvtbl->fnGetDesktop(sf->pPidlMgr,sf->mpidl);
+    }*/
+    dwSize = 0;
+    if(sf->mpSFParent->mlpszFolder)
+    { dwSize += strlen(sf->mpSFParent->mlpszFolder) + 1;
+    }   
+    dwSize += sf->pPidlMgr->lpvtbl->fnGetFolderText(sf->pPidlMgr,sf->mpidl,NULL,0);
+    sf->mlpszFolder = (LPSTR)HeapAlloc(GetProcessHeap(),0,dwSize);
+    if(sf->mlpszFolder)
+    { *(sf->mlpszFolder) = 0;
+      if(sf->mpSFParent->mlpszFolder)
+      {  strcpy(sf->mlpszFolder, sf->mpSFParent->mlpszFolder);
+         wLen = strlen(sf->mlpszFolder);
+         if (wLen && sf->mlpszFolder[wLen-1]!='\\')
+         { sf->mlpszFolder[wLen+0]='\\';
+           sf->mlpszFolder[wLen+1]='\0';
+         }
+      }
+      sf->pPidlMgr->lpvtbl->fnGetFolderText(sf->pPidlMgr, sf->mpidl, sf->mlpszFolder+strlen(sf->mlpszFolder), dwSize-strlen(sf->mlpszFolder));
+    }
+  }
+	
+	TRACE(shell,"-- (%p)->(%p,%p)\n",sf,pParent, pidl);
 	return sf;
 }
+/**************************************************************************
+ *  IShellFolder::QueryInterface
+ */
+static HRESULT WINAPI IShellFolder_QueryInterface(
+  LPSHELLFOLDER this, REFIID riid, LPVOID *ppvObj)
+{  char	xriid[50];
+   WINE_StringFromCLSID((LPCLSID)riid,xriid);
+   TRACE(shell,"(%p)->(\n\tIID:\t%s,%p)\n",this,xriid,ppvObj);
 
+  *ppvObj = NULL;
+
+  if(IsEqualIID(riid, &IID_IUnknown))          /*IUnknown*/
+  { *ppvObj = this; 
+  }
+  else if(IsEqualIID(riid, &IID_IShellFolder))  /*IShellFolder*/
+  {    *ppvObj = (IShellFolder*)this;
+  }   
+
+  if(*ppvObj)
+  { (*(LPSHELLFOLDER*)ppvObj)->lpvtbl->fnAddRef(this);  	
+    TRACE(shell,"-- Interface: (%p)->(%p)\n",ppvObj,*ppvObj);
+		return S_OK;
+  }
+	TRACE(shell,"-- Interface: E_NOINTERFACE\n");
+	return E_NOINTERFACE;
+}   
+
+/**************************************************************************
+*  IShellFolder::AddRef
+*/
+
+static ULONG WINAPI IShellFolder_AddRef(LPSHELLFOLDER this)
+{	TRACE(shell,"(%p)->(count=%lu)\n",this,(this->ref)+1);
+	return ++(this->ref);
+}
+
+/**************************************************************************
+ *  IShellFolder_Release
+ */
+static ULONG WINAPI IShellFolder_Release(LPSHELLFOLDER this) 
+{ TRACE(shell,"(%p)->(count=%lu)\n",this,this->ref);
+	if (!--(this->ref)) {
+		TRACE(shell,"-- destroying IShellFolder(%p)\n",this);
+		HeapFree(GetProcessHeap(),0,this);
+		return 0;
+	}
+	return this->ref;
+}
+/**************************************************************************
+*		IShellFolder_ParseDisplayName
+*
+* FIXME: 
+*    pdwAttributes: not used
+*/
+static HRESULT WINAPI IShellFolder_ParseDisplayName(
+	LPSHELLFOLDER this,
+	HWND32 hwndOwner,
+	LPBC pbcReserved,
+	LPOLESTR32 lpszDisplayName,    /* [in]  name of file or folder*/
+	DWORD *pchEaten,               /* [out] number of chars parsed*/
+	LPITEMIDLIST *ppidl,           /* [out] the pidl*/
+	DWORD *pdwAttributes)
+{	HRESULT        hr=E_OUTOFMEMORY;
+  LPITEMIDLIST   pidlFull=NULL;
+  DWORD          dwChars=lstrlen32W(lpszDisplayName) + 1;
+  LPSTR          pszTemp=(LPSTR)HeapAlloc(GetProcessHeap(),0,dwChars * sizeof(CHAR));
+  LPSTR          pszNext=NULL;
+  CHAR           szElement[MAX_PATH];
+  BOOL32         bType;
+  LPITEMIDLIST   pidlTemp = NULL;
+  LPITEMIDLIST   pidlOld = NULL;
+       
+  TRACE(shell,"(%p)->(%x,%p,%p=%s,%p,pidl=%p,%p)\n",
+	this,hwndOwner,pbcReserved,lpszDisplayName,debugstr_w(lpszDisplayName),pchEaten,ppidl,pdwAttributes
+	);
+  if(pszTemp)
+  { hr = E_FAIL;
+    WideCharToLocal32(pszTemp, lpszDisplayName, dwChars);
+    if(*pszTemp)
+    { pidlFull = this->pPidlMgr->lpvtbl->fnCreateDesktop(this->pPidlMgr);
+
+      /* check if the lpszDisplayName is Folder or File*/
+			bType = ! (GetFileAttributes32A(pszNext)&FILE_ATTRIBUTE_DIRECTORY);
+			
+			pszNext = GetNextElement(pszTemp, szElement, MAX_PATH);
+
+      pidlTemp = this->pPidlMgr->lpvtbl->fnCreateDrive(this->pPidlMgr,szElement);			
+      pidlOld = pidlFull;
+      pidlFull = this->pPidlMgr->lpvtbl->fnConcatenate(this->pPidlMgr,pidlFull,pidlTemp);
+	    this->pPidlMgr->lpvtbl->fnDelete(this->pPidlMgr,pidlOld);
+
+			if(pidlFull)
+      { while((pszNext=GetNextElement(pszNext, szElement, MAX_PATH)))
+        { if(!*pszNext && bType)
+					{ pidlTemp = this->pPidlMgr->lpvtbl->fnCreateValue(this->pPidlMgr,szElement);
+					}
+					else				
+          { pidlTemp = this->pPidlMgr->lpvtbl->fnCreateFolder(this->pPidlMgr,szElement);
+					}
+          pidlOld = pidlFull;
+          pidlFull = this->pPidlMgr->lpvtbl->fnConcatenate(this->pPidlMgr,pidlFull,pidlTemp);
+          this->pPidlMgr->lpvtbl->fnDelete(this->pPidlMgr,pidlOld);
+         }
+         hr = S_OK;
+       }
+     }
+		HeapFree(GetProcessHeap(),0,pszTemp);
+  }
+  *ppidl = pidlFull;
+  return hr;
+
+
+
+}
+
+/**************************************************************************
+*		IShellFolder_EnumObjects
+*/
+static HRESULT WINAPI IShellFolder_EnumObjects(
+	LPSHELLFOLDER this,HWND32 hwndOwner,DWORD dwFlags,
+	LPENUMIDLIST* ppEnumIDList)
+{ HRESULT  hr;
+	TRACE(shell,"(%p)->(%x,%lx,%p)\n",this,hwndOwner,dwFlags,ppEnumIDList);
+
+  *ppEnumIDList = NULL;
+	*ppEnumIDList = IEnumIDList_Constructor (this->mlpszFolder, dwFlags, &hr);
+  TRACE(shell,"-- (%p)->(new ID List: %p)\n",this,*ppEnumIDList);
+  if(!*ppEnumIDList)
+  { return hr;
+  }
+  return S_OK;		
+}
+/**************************************************************************
+ *  IShellFolder_Initialize()
+ *  IPersistFolder Method
+ */
+static HRESULT WINAPI IShellFolder_Initialize(
+	LPSHELLFOLDER this,
+	LPCITEMIDLIST pidl)
+{ TRACE(shell,"(%p)->(pidl=%p)\n",this,pidl);
+  if(this->mpidlNSRoot)
+  { this->pPidlMgr->lpvtbl->fnDelete(this->pPidlMgr, this->mpidlNSRoot);
+    this->mpidlNSRoot = NULL;
+  }
+  this->mpidlNSRoot = this->pPidlMgr->lpvtbl->fnCopy(this->pPidlMgr, pidl);
+  return S_OK;
+}
+
+/**************************************************************************
+*		IShellFolder_BindToObject
+*/
+static HRESULT WINAPI IShellFolder_BindToObject(
+	LPSHELLFOLDER this,
+	LPCITEMIDLIST pidl,
+	LPBC pbcReserved,
+	REFIID riid,
+	LPVOID * ppvOut)
+{	char	        xclsid[50];
+  HRESULT       hr;
+	LPSHELLFOLDER pShellFolder;
+	
+	WINE_StringFromCLSID(riid,xclsid);
+
+	TRACE(shell,"(%p)->(pidl=%p,%p,\n\tSID:%s,%p)\n",this,pidl,pbcReserved,xclsid,ppvOut);
+
+  *ppvOut = NULL;
+  pShellFolder = IShellFolder_Constructor(this, pidl);
+  if(!pShellFolder)
+    return E_OUTOFMEMORY;
+  pShellFolder->lpvtbl->fnInitialize(pShellFolder, this->mpidlNSRoot);
+  hr = pShellFolder->lpvtbl->fnQueryInterface(pShellFolder, riid, ppvOut);
+  pShellFolder->lpvtbl->fnRelease(pShellFolder);
+	TRACE(shell,"-- (%p)->(interface=%p)\n",this, ppvOut);
+  return hr;
+}
+
+/**************************************************************************
+*  IShellFolder_BindToStorage
+*/
+static HRESULT WINAPI IShellFolder_BindToStorage(
+  	LPSHELLFOLDER this,
+    LPCITEMIDLIST pidl, 
+    LPBC pbcReserved, 
+    REFIID riid, 
+    LPVOID *ppvOut)
+{	char	        xclsid[50];
+	WINE_StringFromCLSID(riid,xclsid);
+
+	FIXME(shell,"(%p)->(pidl=%p,%p,\n\tSID:%s,%p) stub\n",this,pidl,pbcReserved,xclsid,ppvOut);
+
+  *ppvOut = NULL;
+  return E_NOTIMPL;
+}
+
+/**************************************************************************
+*  IShellFolder_CompareIDs
+*/
+static HRESULT WINAPI  IShellFolder_CompareIDs(
+  	LPSHELLFOLDER this,
+		LPARAM lParam, 
+    LPCITEMIDLIST pidl1, 
+    LPCITEMIDLIST pidl2)
+{ CHAR szString1[MAX_PATH] = "";
+  CHAR szString2[MAX_PATH] = "";
+  int   nReturn;
+  LPCITEMIDLIST  pidlTemp1 = pidl1, pidlTemp2 = pidl2;
+
+  TRACE(shell,"(%p)->(%lx,pidl1=%p,pidl2=%p) stub\n",this,lParam,pidl1,pidl2);
+
+  /*Special case - If one of the items is a Path and the other is a File, always 
+  make the Path come before the File.*/
+
+  //get the last item in each list
+  while((this->pPidlMgr->lpvtbl->fnGetNextItem(this->pPidlMgr,pidlTemp1))->mkid.cb)
+    pidlTemp1 = this->pPidlMgr->lpvtbl->fnGetNextItem(this->pPidlMgr,pidlTemp1);
+  while((this->pPidlMgr->lpvtbl->fnGetNextItem(this->pPidlMgr,pidlTemp2))->mkid.cb)
+    pidlTemp2 = this->pPidlMgr->lpvtbl->fnGetNextItem(this->pPidlMgr,pidlTemp2);
+
+  //at this point, both pidlTemp1 and pidlTemp2 point to the last item in the list
+  if(this->pPidlMgr->lpvtbl->fnIsValue(this->pPidlMgr,pidlTemp1) != this->pPidlMgr->lpvtbl->fnIsValue(this->pPidlMgr,pidlTemp2))
+  { if(this->pPidlMgr->lpvtbl->fnIsValue(this->pPidlMgr,pidlTemp1))
+      return 1;
+   return -1;
+  }
+
+  this->pPidlMgr->lpvtbl->fnGetDrive(this->pPidlMgr, pidl1,szString1,sizeof(szString1));
+  this->pPidlMgr->lpvtbl->fnGetDrive(this->pPidlMgr, pidl2,szString1,sizeof(szString2));
+  nReturn = strcasecmp(szString1, szString2);
+  if(nReturn)
+    return nReturn;
+
+  this->pPidlMgr->lpvtbl->fnGetFolderText(this->pPidlMgr, pidl1,szString1,sizeof(szString1));
+  this->pPidlMgr->lpvtbl->fnGetFolderText(this->pPidlMgr, pidl2,szString2,sizeof(szString2));
+  nReturn = strcasecmp(szString1, szString2);
+  if(nReturn)
+    return nReturn;
+
+  this->pPidlMgr->lpvtbl->fnGetValueText(this->pPidlMgr,pidl1,szString1,sizeof(szString1));
+  this->pPidlMgr->lpvtbl->fnGetValueText(this->pPidlMgr,pidl2,szString2,sizeof(szString2));
+  return strcasecmp(szString1, szString2);
+}
+
+/**************************************************************************
+*	  IShellFolder_CreateViewObject
+*/
+static HRESULT WINAPI IShellFolder_CreateViewObject(
+	LPSHELLFOLDER this,HWND32 hwndOwner,REFIID riid,LPVOID *ppv)
+{	char	xclsid[50];
+
+	WINE_StringFromCLSID(riid,xclsid);
+	FIXME(shell,"(%p)->(0x%04x,\n\tIID:\t%s,%p),stub!\n",this,hwndOwner,xclsid,ppv);
+	
+	*(DWORD*)ppv = 0;
+	return E_OUTOFMEMORY;
+}
+
+/**************************************************************************
+*  IShellFolder_GetAttributesOf
+*/
+static HRESULT WINAPI IShellFolder_GetAttributesOf(
+	LPSHELLFOLDER this,
+	UINT32 cidl,
+	LPCITEMIDLIST *apidl,
+	DWORD *rgfInOut)
+{ FIXME(shell,"(%p)->(%d,%p,%p),stub!\n",this,cidl,apidl,rgfInOut);
+	return E_NOTIMPL;
+}
+/**************************************************************************
+*  IShellFolder_GetUIObjectOf
+*/
+static HRESULT WINAPI IShellFolder_GetUIObjectOf(
+	LPSHELLFOLDER this,
+	HWND32 hwndOwner,
+	UINT32 cidl, 
+	LPCITEMIDLIST * apidl,
+  REFIID riid,
+	UINT32 * prgfInOut,
+	LPVOID * ppvOut)
+{ char	        xclsid[50];
+  
+	WINE_StringFromCLSID(riid,xclsid);
+
+  FIXME(shell,"(%p)->(%u %u,pidl=%p,\n\tIID:%s,%p,%p),stub!\n",
+	  this,hwndOwner,cidl,apidl,xclsid,prgfInOut,ppvOut);
+	return E_FAIL;
+}
+/**************************************************************************
+*  IShellFolder_GetDisplayNameOf
+*/
+#define GET_SHGDN_FOR(dwFlags)         ((DWORD)dwFlags & (DWORD)0x0000FF00)
+#define GET_SHGDN_RELATION(dwFlags)    ((DWORD)dwFlags & (DWORD)0x000000FF)
+
+static HRESULT WINAPI IShellFolder_GetDisplayNameOf( 
+  	LPSHELLFOLDER this,
+    LPCITEMIDLIST pidl, 
+    DWORD dwFlags, 
+    LPSTRRET lpName)
+{ CHAR szText[MAX_PATH];
+  int   cchOleStr;
+  LPITEMIDLIST   pidlTemp;
+
+  TRACE(shell,"(%p)->(pidl=%p,%lx,%p)\n",this,pidl,dwFlags,lpName);
+  switch(GET_SHGDN_RELATION(dwFlags))
+  { case SHGDN_NORMAL:
+    //get the full name
+    this->pPidlMgr->lpvtbl->fnGetPidlPath(this->pPidlMgr, pidl, szText, sizeof(szText));
+/*  FIXME if the text is NULL and this is a value, then is something wrong*/
+/*  if(!*szText && this->pPidlMgr->lpvtbl->fnIsValue(this->pPidlMgr, this->pPidlMgr->lpvtbl->fnGetLastItem(this->pPidlMgr, pidl)))
+    { do_something()
+    }*/  
+    break;
+
+    case SHGDN_INFOLDER:
+      pidlTemp = this->pPidlMgr->lpvtbl->fnGetLastItem(this->pPidlMgr,pidl);
+      //get the relative name
+      this->pPidlMgr->lpvtbl->fnGetItemText(this->pPidlMgr, pidlTemp, szText, sizeof(szText));
+/*    FIXME if the text is NULL and this is a value, then is something wrong*/
+      if(!*szText && this->pPidlMgr->lpvtbl->fnIsValue(this->pPidlMgr,pidlTemp))
+/*    { do_something()
+      }*/   
+     break;
+   default:    return E_INVALIDARG;
+  }
+
+  //get the number of characters required
+  cchOleStr = strlen(szText) + 1;
+
+  TRACE(shell,"-- (%p)->(%s)\n",this,szText);
+  //allocate the wide character string
+  lpName->u.pOleStr = (LPWSTR)HeapAlloc(GetProcessHeap(),0,cchOleStr * sizeof(WCHAR));
+
+  if(!(lpName->u.pOleStr))
+  {  return E_OUTOFMEMORY;
+	}
+  lpName->uType = STRRET_WSTR;
+  LocalToWideChar32(lpName->u.pOleStr, szText, cchOleStr);
+  return S_OK;
+}
+
+/**************************************************************************
+*  IShellFolder_SetNameOf
+*/
+static HRESULT WINAPI IShellFolder_SetNameOf(
+  	LPSHELLFOLDER this,
+		HWND32 hwndOwner, 
+    LPCITEMIDLIST pidl, 
+    LPCOLESTR32 lpName, 
+    DWORD dw, 
+    LPITEMIDLIST *pPidlOut)
+{  FIXME(shell,"(%p)->(%u,pidl=%p,%s,%lu,%p),stub!\n",
+	  this,hwndOwner,pidl,debugstr_w(lpName),dw,pPidlOut);
+	 return E_NOTIMPL;
+}
+
+/**************************************************************************
+*	  IShellLink_VTable
+*/
 static struct IShellLink_VTable slvt = {
     (void *)1,
     (void *)2,
@@ -215,11 +950,728 @@
     (void *)21
 };
 
-LPSHELLLINK IShellLink_Constructor() {
-	LPSHELLLINK sl;
+/**************************************************************************
+ *	  IShellLink_Constructor
+ */
+LPSHELLLINK IShellLink_Constructor() 
+{	LPSHELLLINK sl;
 
 	sl = (LPSHELLLINK)HeapAlloc(GetProcessHeap(),0,sizeof(IShellLink));
 	sl->ref = 1;
 	sl->lpvtbl = &slvt;
+	TRACE(shell,"(%p)->()\n",sl);
 	return sl;
 }
+
+/**************************************************************************
+*	  INTERNAL CLASS pidlmgr
+*/
+LPITEMIDLIST PidlMgr_CreateDesktop(LPPIDLMGR);
+LPITEMIDLIST PidlMgr_CreateDrive(LPPIDLMGR,LPCSTR);
+LPITEMIDLIST PidlMgr_CreateFolder(LPPIDLMGR,LPCSTR);
+LPITEMIDLIST PidlMgr_CreateValue(LPPIDLMGR,LPCSTR);
+void PidlMgr_Delete(LPPIDLMGR,LPITEMIDLIST);
+LPITEMIDLIST PidlMgr_GetNextItem(LPPIDLMGR,LPITEMIDLIST);
+LPITEMIDLIST PidlMgr_Copy(LPPIDLMGR,LPITEMIDLIST);
+UINT16 PidlMgr_GetSize(LPPIDLMGR,LPITEMIDLIST);
+BOOL32 PidlMgr_GetDesktop(LPPIDLMGR,LPCITEMIDLIST,LPSTR);
+BOOL32 PidlMgr_GetDrive(LPPIDLMGR,LPCITEMIDLIST,LPSTR,UINT16);
+LPITEMIDLIST PidlMgr_GetLastItem(LPPIDLMGR,LPCITEMIDLIST);
+DWORD PidlMgr_GetItemText(LPPIDLMGR,LPCITEMIDLIST,LPSTR,UINT16);
+BOOL32 PidlMgr_IsDesktop(LPPIDLMGR,LPCITEMIDLIST);
+BOOL32 PidlMgr_IsDrive(LPPIDLMGR,LPCITEMIDLIST);
+BOOL32 PidlMgr_IsFolder(LPPIDLMGR,LPCITEMIDLIST);
+BOOL32 PidlMgr_IsValue(LPPIDLMGR,LPCITEMIDLIST);
+BOOL32 PidlMgr_HasFolders(LPPIDLMGR,LPSTR,LPCITEMIDLIST);
+DWORD PidlMgr_GetFolderText(LPPIDLMGR,LPCITEMIDLIST,LPSTR,DWORD);
+DWORD PidlMgr_GetValueText(LPPIDLMGR,LPCITEMIDLIST,LPSTR,DWORD);
+BOOL32 PidlMgr_GetValueType(LPPIDLMGR,LPCITEMIDLIST,LPCITEMIDLIST,LPDWORD);
+DWORD PidlMgr_GetDataText(LPPIDLMGR,LPCITEMIDLIST,LPCITEMIDLIST,LPSTR,DWORD);
+DWORD PidlMgr_GetPidlPath(LPPIDLMGR,LPCITEMIDLIST,LPSTR,DWORD);
+LPITEMIDLIST PidlMgr_Concatenate(LPPIDLMGR,LPITEMIDLIST,LPITEMIDLIST);
+LPITEMIDLIST PidlMgr_Create(LPPIDLMGR,PIDLTYPE,LPVOID,UINT16);
+DWORD PidlMgr_GetData(LPPIDLMGR,PIDLTYPE,LPCITEMIDLIST,LPVOID,UINT16);
+LPPIDLDATA PidlMgr_GetDataPointer(LPPIDLMGR,LPCITEMIDLIST);
+BOOL32 PidlMgr_SeparatePathAndValue(LPPIDLMGR,LPITEMIDLIST,LPITEMIDLIST*,LPITEMIDLIST*);
+
+static struct PidlMgr_VTable pmgrvt = {
+    PidlMgr_CreateDesktop,
+    PidlMgr_CreateDrive,
+    PidlMgr_CreateFolder,
+    PidlMgr_CreateValue,
+		PidlMgr_Delete,
+    PidlMgr_GetNextItem,
+    PidlMgr_Copy,
+    PidlMgr_GetSize,
+    PidlMgr_GetDesktop,
+		PidlMgr_GetDrive,
+    PidlMgr_GetLastItem,
+    PidlMgr_GetItemText,
+    PidlMgr_IsDesktop,
+    PidlMgr_IsDrive,
+    PidlMgr_IsFolder,
+    PidlMgr_IsValue,
+    PidlMgr_HasFolders,
+    PidlMgr_GetFolderText,
+    PidlMgr_GetValueText,
+    PidlMgr_GetValueType,
+    PidlMgr_GetDataText,
+    PidlMgr_GetPidlPath,
+		PidlMgr_Concatenate,
+    PidlMgr_Create,
+    PidlMgr_GetData,
+    PidlMgr_GetDataPointer,
+    PidlMgr_SeparatePathAndValue
+};
+/**************************************************************************
+ *	  PidlMgr_Constructor
+ */
+LPPIDLMGR PidlMgr_Constructor() 
+{	LPPIDLMGR pmgr;
+	pmgr = (LPPIDLMGR)HeapAlloc(GetProcessHeap(),0,sizeof(pidlmgr));
+	pmgr->lpvtbl = &pmgrvt;
+	TRACE(shell,"(%p)->()\n",pmgr);
+  /** FIXME DllRefCount++;*/
+	return pmgr;
+}
+/**************************************************************************
+ *	  PidlMgr_Destructor
+ */
+void PidlMgr_Destructor(LPPIDLMGR this) 
+{	HeapFree(GetProcessHeap(),0,this);
+ 	TRACE(shell,"(%p)->()\n",this);
+  /** FIXME DllRefCount--;*/
+}
+
+/**************************************************************************
+ *  PidlMgr_CreateDesktop()
+ *  PidlMgr_CreateDrive()
+ *  PidlMgr_CreateFolder() 
+ *  PidlMgr_CreateValue()
+ */
+LPITEMIDLIST PidlMgr_CreateDesktop(LPPIDLMGR this)
+{ TRACE(shell,"(%p)->()\n",this);
+    return PidlMgr_Create(this,PT_DESKTOP, (void *)"Desktop", sizeof("Desktop"));
+}
+LPITEMIDLIST PidlMgr_CreateDrive(LPPIDLMGR this, LPCSTR lpszNew)
+{ TRACE(shell,"(%p)->(%s)\n",this,lpszNew);
+  return PidlMgr_Create(this,PT_DRIVE, (LPVOID)lpszNew , strlen(lpszNew)+1);
+}
+LPITEMIDLIST PidlMgr_CreateFolder(LPPIDLMGR this, LPCSTR lpszNew)
+{ TRACE(shell,"(%p)->(%s)\n",this,lpszNew);
+  return PidlMgr_Create(this,PT_FOLDER, (LPVOID)lpszNew, strlen(lpszNew)+1);
+}
+LPITEMIDLIST PidlMgr_CreateValue(LPPIDLMGR this,LPCSTR lpszNew)
+{ TRACE(shell,"(%p)->(%s)\n",this,lpszNew);
+  return PidlMgr_Create(this,PT_VALUE, (LPVOID)lpszNew, strlen(lpszNew)+1);
+}
+/**************************************************************************
+ *  PidlMgr_Delete()
+ *  Deletes a PIDL
+ */
+void PidlMgr_Delete(LPPIDLMGR this,LPITEMIDLIST pidl)
+{ TRACE(shell,"(%p)->(pidl=%p)\n",this,pidl);
+  HeapFree(GetProcessHeap(),0,pidl);
+}
+
+/**************************************************************************
+ *  PidlMgr_GetNextItem()
+ */
+LPITEMIDLIST PidlMgr_GetNextItem(LPPIDLMGR this, LPITEMIDLIST pidl)
+{ TRACE(shell,"(%p)->(pidl=%p)\n",this,pidl);
+  if(pidl)
+  {  return (LPITEMIDLIST)(LPBYTE)(((LPBYTE)pidl) + pidl->mkid.cb);
+	}
+  else
+  {  return (NULL);
+	}
+}
+
+/**************************************************************************
+ *  PidlMgr_Copy()
+ */
+LPITEMIDLIST PidlMgr_Copy(LPPIDLMGR this, LPITEMIDLIST pidlSource)
+{ LPITEMIDLIST pidlTarget = NULL;
+  UINT16 cbSource = 0;
+
+	TRACE(shell,"-- (%p)->(pidl=%p)\n",this,pidlSource);
+
+  if(NULL == pidlSource)
+ 	{  ERR(shell,"-- (%p)->(%p)\n",this,pidlSource);
+     return (NULL);
+	}
+
+  cbSource = PidlMgr_GetSize(this, pidlSource);
+  pidlTarget = (LPITEMIDLIST)HeapAlloc(GetProcessHeap(),0,cbSource);
+  if(!pidlTarget)
+  { return (NULL);
+	}
+
+  memcpy(pidlTarget, pidlSource, cbSource);
+
+	TRACE(shell,"-- (%p)->(pidl=%p to new pidl=%p)\n",this,pidlSource,pidlTarget);
+  return pidlTarget;
+}
+/**************************************************************************
+ *  PidlMgr_GetSize()
+ *  calculates the size of the complete pidl
+ */
+UINT16 PidlMgr_GetSize(LPPIDLMGR this, LPITEMIDLIST pidl)
+{ UINT16 cbTotal = 0;
+  LPITEMIDLIST pidlTemp = pidl;
+
+  TRACE(shell,"(%p)->(pidl=%p)\n",this,pidl);
+  if(pidlTemp)
+  { while(pidlTemp->mkid.cb)
+    { cbTotal += pidlTemp->mkid.cb;
+      pidlTemp = PidlMgr_GetNextItem(this, pidlTemp);
+    }  
+    //add the size of the NULL terminating ITEMIDLIST
+    cbTotal += sizeof(ITEMIDLIST);
+  }
+	TRACE(shell,"-- size %u\n",cbTotal);
+  return (cbTotal);
+}
+/**************************************************************************
+ *  PidlMgr_GetDesktop()
+ * 
+ *  FIXME: quick hack
+ */
+BOOL32 PidlMgr_GetDesktop(LPPIDLMGR this,LPCITEMIDLIST pidl,LPSTR pOut)
+{ TRACE(shell,"(%p)->(%p %p)\n",this,pidl,pOut);
+  return (BOOL32)PidlMgr_GetData(this,PT_DESKTOP, pidl, (LPVOID)pOut, 255);
+}
+/**************************************************************************
+ *  PidlMgr_GetDrive()
+ *
+ *  FIXME: quick hack
+ */
+BOOL32 PidlMgr_GetDrive(LPPIDLMGR this,LPCITEMIDLIST pidl,LPSTR pOut, UINT16 uSize)
+{ LPITEMIDLIST   pidlTemp=NULL;
+
+  TRACE(shell,"(%p)->(%p,%p,%u)\n",this,pidl,pOut,uSize);
+  if(PidlMgr_IsDesktop(this,pidl))
+  { pidlTemp = PidlMgr_GetNextItem(this,pidl);
+	}
+	else if (PidlMgr_IsDrive(this,pidl))
+  { pidlTemp = PidlMgr_GetNextItem(this,pidl);	  	
+    return (BOOL32)PidlMgr_GetData(this,PT_DRIVE, pidlTemp, (LPVOID)pOut, uSize);
+	}
+	return FALSE;
+}
+/**************************************************************************
+ *  PidlMgr_GetLastItem()
+ *  Gets the last item in the list
+ */
+LPITEMIDLIST PidlMgr_GetLastItem(LPPIDLMGR this,LPCITEMIDLIST pidl)
+{ LPITEMIDLIST   pidlLast = NULL;
+
+  TRACE(shell,"(%p)->(pidl=%p)\n",this,pidl);
+
+  if(pidl)
+  { while(pidl->mkid.cb)
+    { pidlLast = (LPITEMIDLIST)pidl;
+      pidl = PidlMgr_GetNextItem(this,pidl);
+    }  
+  }
+  return pidlLast;
+}
+/**************************************************************************
+ *  PidlMgr_GetItemText()
+ *  Gets the text for only this item
+ */
+DWORD PidlMgr_GetItemText(LPPIDLMGR this,LPCITEMIDLIST pidl, LPSTR lpszText, UINT16 uSize)
+{ TRACE(shell,"(%p)->(pidl=%p %p %x)\n",this,pidl,lpszText,uSize);
+  if (PidlMgr_IsDesktop(this, pidl))
+  { return PidlMgr_GetData(this,PT_DESKTOP, pidl, (LPVOID)lpszText, uSize);
+	}
+	if (PidlMgr_IsDrive(this, pidl))
+	{ return PidlMgr_GetData(this,PT_DRIVE, pidl, (LPVOID)lpszText, uSize);
+	}
+	return PidlMgr_GetData(this,PT_TEXT, pidl, (LPVOID)lpszText, uSize);	
+}
+/**************************************************************************
+ *  PidlMgr_IsDesktop()
+ *  PidlMgr_IsDrive()
+ *  PidlMgr_IsFolder()
+ *  PidlMgr_IsValue()
+*/
+BOOL32 PidlMgr_IsDesktop(LPPIDLMGR this,LPCITEMIDLIST pidl)
+{ LPPIDLDATA  pData;
+  TRACE(shell,"%p->(%p)\n",this,pidl);
+  pData = PidlMgr_GetDataPointer(this,pidl);
+  return (PT_DESKTOP == pData->type);
+}
+
+BOOL32 PidlMgr_IsDrive(LPPIDLMGR this,LPCITEMIDLIST pidl)
+{ LPPIDLDATA  pData;
+  TRACE(shell,"%p->(%p)\n",this,pidl);
+  pData = PidlMgr_GetDataPointer(this,pidl);
+  return (PT_DRIVE == pData->type);
+}
+
+BOOL32 PidlMgr_IsFolder(LPPIDLMGR this,LPCITEMIDLIST pidl)
+{ LPPIDLDATA  pData;
+  TRACE(shell,"%p->(%p)\n",this,pidl);
+  pData = PidlMgr_GetDataPointer(this,pidl);
+  return (PT_FOLDER == pData->type);
+}
+
+BOOL32 PidlMgr_IsValue(LPPIDLMGR this,LPCITEMIDLIST pidl)
+{ LPPIDLDATA  pData;
+  TRACE(shell,"%p->(%p)\n",this,pidl);
+  pData = PidlMgr_GetDataPointer(this,pidl);
+  return (PT_VALUE == pData->type);
+}
+/**************************************************************************
+ * PidlMgr_HasFolders()
+ * fixme: quick hack
+ */
+BOOL32 PidlMgr_HasFolders(LPPIDLMGR this, LPSTR pszPath, LPCITEMIDLIST pidl)
+{ BOOL32 bResult= FALSE;
+  WIN32_FIND_DATA32A stffile;	
+  HANDLE32 hFile;
+
+  TRACE (shell,"(%p)->%p %p\n",this, pszPath, pidl);
+	
+  hFile = FindFirstFile32A(pszPath,&stffile);
+  do
+  { if (! (stffile.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) )
+    {  bResult= TRUE;
+		}
+  } while( FindNextFile32A(hFile,&stffile));
+  FindClose32 (hFile);
+	
+	return bResult;
+}
+
+
+/**************************************************************************
+ *  PidlMgr_GetFolderText()
+ *  Creates a Path string from a PIDL, filtering out the Desktop and the Drive
+ *  value, if either is present.
+ */
+DWORD PidlMgr_GetFolderText(LPPIDLMGR this,LPCITEMIDLIST pidl,
+   LPSTR lpszPath, DWORD dwSize)
+{ LPITEMIDLIST   pidlTemp;
+  DWORD          dwCopied = 0;
+ 
+  TRACE(shell,"(%p)->(%p)\n",this,pidl);
+ 
+  if(!pidl)
+  { return 0;
+	}
+
+  if(PidlMgr_IsDesktop(this,pidl))
+  { pidlTemp = PidlMgr_GetNextItem(this,pidl);
+	}
+	else if (PidlMgr_IsFolder(this,pidl))
+  { pidlTemp = PidlMgr_GetNextItem(this,pidl);	  	
+	}
+  else
+  { pidlTemp = (LPITEMIDLIST)pidl;
+	}
+
+  //if this is NULL, return the required size of the buffer
+  if(!lpszPath)
+  { while(pidlTemp->mkid.cb)
+    { LPPIDLDATA  pData = PidlMgr_GetDataPointer(this,pidlTemp);
+      
+      //add the length of this item plus one for the backslash
+      dwCopied += strlen(pData->szText) + 1;  /* fixme pData->szText is not every time a string*/
+
+      pidlTemp = PidlMgr_GetNextItem(this,pidlTemp);
+    }
+
+    //add one for the NULL terminator
+    return dwCopied + 1;
+  }
+
+  *lpszPath = 0;
+
+  while(pidlTemp->mkid.cb && (dwCopied < dwSize))
+  { LPPIDLDATA  pData = PidlMgr_GetDataPointer(this,pidlTemp);
+
+    //if this item is a value, then skip it and finish
+    if(PT_VALUE == pData->type)
+    { break;
+		}
+   
+    strcat(lpszPath, pData->szText);
+    strcat(lpszPath, "\\");
+
+    dwCopied += strlen(pData->szText) + 1;
+
+    pidlTemp = PidlMgr_GetNextItem(this,pidlTemp);
+  }
+
+  //remove the last backslash if necessary
+  if(dwCopied)
+  { if(*(lpszPath + strlen(lpszPath) - 1) == '\\')
+    { *(lpszPath + strlen(lpszPath) - 1) = 0;
+      dwCopied--;
+    }
+  }
+  return dwCopied;
+}
+
+
+/**************************************************************************
+ *  PidlMgr_GetValueText()
+ *  Gets the text for the last item in the list
+ */
+DWORD PidlMgr_GetValueText(LPPIDLMGR this,
+    LPCITEMIDLIST pidl, LPSTR lpszValue, DWORD dwSize)
+{ LPITEMIDLIST  pidlTemp=pidl;
+  CHAR          szText[MAX_PATH];
+
+  TRACE(shell,"(%p)->(pidl=%p %p %lx)\n",this,pidl,lpszValue,dwSize);
+
+  if(!pidl)
+  { return 0;
+	}
+		
+  while(pidlTemp->mkid.cb && !PidlMgr_IsValue(this,pidlTemp))
+  { pidlTemp = PidlMgr_GetNextItem(this,pidlTemp);
+  }
+
+  if(!pidlTemp->mkid.cb)
+  { return 0;
+	}
+
+  PidlMgr_GetItemText(this, pidlTemp, szText, sizeof(szText));
+
+  if(!lpszValue)
+  { return strlen(szText) + 1;
+  }
+  strcpy(lpszValue, szText);
+	TRACE(shell,"-- (%p)->(pidl=%p %p=%s %lx)\n",this,pidl,lpszValue,lpszValue,dwSize);
+  return strlen(lpszValue);
+}
+/**************************************************************************
+ *  PidlMgr_GetValueType()
+ */
+BOOL32 PidlMgr_GetValueType( LPPIDLMGR this,
+ LPCITEMIDLIST pidlPath, LPCITEMIDLIST pidlValue, LPDWORD pdwType)
+{ LPSTR    lpszFolder,
+           lpszValueName;
+  DWORD    dwNameSize;
+ 
+  FIXME(shell,"(%p)->(%p %p %p) stub\n",this,pidlPath,pidlValue,pdwType);
+	
+  if(!pidlPath)
+  { return FALSE;
+	}
+
+  if(!pidlValue)
+  { return FALSE;
+	}
+
+  if(!pdwType)
+  { return FALSE;
+	}
+
+  //get the Desktop
+  //PidlMgr_GetDesktop(this,pidlPath);
+
+  /* fixme: add the driveletter here*/
+	
+  //assemble the Folder string
+  dwNameSize = PidlMgr_GetFolderText(this,pidlPath, NULL, 0);
+  lpszFolder = (LPSTR)HeapAlloc(GetProcessHeap(),0,dwNameSize);
+  if(!lpszFolder)
+  {  return FALSE;
+	}
+  PidlMgr_GetFolderText(this,pidlPath, lpszFolder, dwNameSize);
+
+  //assemble the value name
+  dwNameSize = PidlMgr_GetValueText(this,pidlValue, NULL, 0);
+  lpszValueName = (LPSTR)HeapAlloc(GetProcessHeap(),0,dwNameSize);
+  if(!lpszValueName)
+  { HeapFree(GetProcessHeap(),0,lpszFolder);
+    return FALSE;
+  }
+  PidlMgr_GetValueText(this,pidlValue, lpszValueName, dwNameSize);
+
+  /* fixme: we've got the path now do something with it
+	  -like get the filetype*/
+	
+	pdwType=NULL;
+	
+  HeapFree(GetProcessHeap(),0,lpszFolder);
+  HeapFree(GetProcessHeap(),0,lpszValueName);
+  return TRUE;
+}
+/**************************************************************************
+ *  PidlMgr_GetDataText()
+ */
+DWORD PidlMgr_GetDataText( LPPIDLMGR this,
+ LPCITEMIDLIST pidlPath, LPCITEMIDLIST pidlValue, LPSTR lpszOut, DWORD dwOutSize)
+{ LPSTR    lpszFolder,
+           lpszValueName;
+  DWORD    dwNameSize;
+
+  FIXME(shell,"(%p)->(pidl=%p pidl=%p) stub\n",this,pidlPath,pidlValue);
+
+  if(!lpszOut)
+  { return FALSE;
+	}
+
+  if(!pidlPath)
+  { return FALSE;
+	}
+
+  if(!pidlValue)
+  { return FALSE;
+	}
+
+  /* fixme: get the driveletter*/
+
+  //assemble the Folder string
+  dwNameSize = PidlMgr_GetFolderText(this,pidlPath, NULL, 0);
+  lpszFolder = (LPSTR)HeapAlloc(GetProcessHeap(),0,dwNameSize);
+  if(!lpszFolder)
+  {  return FALSE;
+	}
+  PidlMgr_GetFolderText(this,pidlPath, lpszFolder, dwNameSize);
+
+  //assemble the value name
+  dwNameSize = PidlMgr_GetValueText(this,pidlValue, NULL, 0);
+  lpszValueName = (LPSTR)HeapAlloc(GetProcessHeap(),0,dwNameSize);
+  if(!lpszValueName)
+  { HeapFree(GetProcessHeap(),0,lpszFolder);
+    return FALSE;
+  }
+  PidlMgr_GetValueText(this,pidlValue, lpszValueName, dwNameSize);
+
+  /* fixme: we've got the path now do something with it*/
+	
+  HeapFree(GetProcessHeap(),0,lpszFolder);
+  HeapFree(GetProcessHeap(),0,lpszValueName);
+
+  TRACE(shell,"-- (%p)->(%p=%s %lx)\n",this,lpszOut,lpszOut,dwOutSize);
+
+	return TRUE;
+}
+
+/**************************************************************************
+ *   CPidlMgr::GetPidlPath()
+ *  Create a string that includes the Drive name, the folder text and 
+ *  the value text.
+ */
+DWORD PidlMgr_GetPidlPath(LPPIDLMGR this,
+    LPCITEMIDLIST pidl, LPSTR lpszOut, DWORD dwOutSize)
+{ LPSTR lpszTemp;
+  WORD	len;
+
+  TRACE(shell,"(%p)->(%p,%lu)\n",this,lpszOut,dwOutSize);
+
+  if(!lpszOut)
+  { return 0;
+	}
+
+  *lpszOut = 0;
+  lpszTemp = lpszOut;
+
+  dwOutSize -= PidlMgr_GetFolderText(this,pidl, lpszTemp, dwOutSize);
+
+  //add a backslash if necessary
+  len = strlen(lpszTemp);
+  if (len && lpszTemp[len-1]!='\\')
+	{ lpszTemp[len+0]='\\';
+    lpszTemp[len+1]='\0';
+		dwOutSize--;
+  }
+
+  lpszTemp = lpszOut + strlen(lpszOut);
+
+  //add the value string
+  PidlMgr_GetValueText(this,pidl, lpszTemp, dwOutSize);
+
+  //remove the last backslash if necessary
+  if(*(lpszOut + strlen(lpszOut) - 1) == '\\')
+  { *(lpszOut + strlen(lpszOut) - 1) = 0;
+  }
+
+  TRACE(shell,"-- (%p)->(%p=%s,%lu)\n",this,lpszOut,lpszOut,dwOutSize);
+
+  return strlen(lpszOut);
+
+}
+/**************************************************************************
+ * PidlMgr_Concatenate()
+ * Create a new PIDL by combining two existing PIDLs.
+ */  
+LPITEMIDLIST PidlMgr_Concatenate(LPPIDLMGR this,LPITEMIDLIST pidl1, LPITEMIDLIST pidl2)
+{ LPITEMIDLIST   pidlNew;
+  UINT32         cb1 = 0, cb2 = 0;
+
+  TRACE(shell,"(%p)->(%p,%p)\n",this,pidl1,pidl2);
+
+  if(!pidl1 && !pidl2)
+  {  return NULL;
+	}
+
+  if(!pidl1)
+  { pidlNew = PidlMgr_Copy(this,pidl2);
+    return pidlNew;
+  }
+
+  if(!pidl2)
+  { pidlNew = PidlMgr_Copy(this,pidl1);
+    return pidlNew;
+  }
+
+  cb1 = PidlMgr_GetSize(this,pidl1) - sizeof(ITEMIDLIST);
+  cb2 = PidlMgr_GetSize(this,pidl2);
+
+  pidlNew = (LPITEMIDLIST)HeapAlloc(GetProcessHeap(),0,cb1+cb2);
+
+  if(pidlNew)
+  { memcpy(pidlNew, pidl1, cb1);
+    memcpy(((LPBYTE)pidlNew) + cb1, pidl2, cb2);
+  }
+  TRACE(shell,"-- (%p)-> (new pidl=%p)\n",this,pidlNew);
+	return pidlNew;
+}
+/**************************************************************************
+ *  PidlMgr_Create()
+ *  Creates a new PIDL
+ *  type = PT_DESKTOP | PT_DRIVE | PT_FOLDER | PT_VALUE
+ *  pIn = data
+ *  uInSize = size of data
+ */
+
+LPITEMIDLIST PidlMgr_Create(LPPIDLMGR this,PIDLTYPE type, LPVOID pIn, UINT16 uInSize)
+{ LPITEMIDLIST   pidlOut=NULL;
+  UINT16         uSize;
+  LPITEMIDLIST   pidlTemp=NULL;
+  LPPIDLDATA     pData;
+
+  TRACE(shell,"(%p)->(%x %p %x)\n",this,type,pIn,uInSize);
+
+  if (! pIn)
+	{ return NULL;
+	}	
+  uSize = sizeof(ITEMIDLIST) + (sizeof(PIDLTYPE)) + uInSize;
+
+  /* Allocate the memory, adding an additional ITEMIDLIST for the NULL terminating 
+  ID List. */
+  pidlOut = (LPITEMIDLIST)HeapAlloc(GetProcessHeap(),0,uSize + sizeof(ITEMIDLIST));
+  pidlTemp = pidlOut;
+  if(pidlOut)
+  { pidlTemp->mkid.cb = uSize;
+    pData = PidlMgr_GetDataPointer(this,pidlTemp);
+    pData->type = type;
+    switch(type)
+    { case PT_DESKTOP: memcpy(pData->szText, pIn, uInSize);
+                       TRACE(shell,"-- (%p)->create Desktop: %s\n",this,debugstr_a(pData->szText));
+                       break;
+			case PT_DRIVE:	 memcpy(pData->szText, pIn, uInSize);
+                       TRACE(shell,"-- (%p)->create Drive: %s\n",this,debugstr_a(pData->szText));
+											 break;
+      case PT_FOLDER:
+      case PT_VALUE:   memcpy(pData->szText, pIn, uInSize);
+                       TRACE(shell,"-- (%p)->create Value: %s\n",this,debugstr_a(pData->szText));
+											 break;
+		  default:         FIXME(shell,"-- (%p) wrong argument\n",this);
+			                 break;
+    }
+   
+    pidlTemp = PidlMgr_GetNextItem(this,pidlTemp);
+    pidlTemp->mkid.cb = 0;
+    pidlTemp->mkid.abID[0] = 0;
+  }
+	TRACE(shell,"-- (%p)->(pidl=%p)\n",this,pidlOut);
+  return pidlOut;
+}
+/**************************************************************************
+ *  PidlMgr_GetData(PIDLTYPE, LPCITEMIDLIST, LPVOID, UINT16)
+ */
+DWORD PidlMgr_GetData(
+    LPPIDLMGR this,
+		PIDLTYPE type, 
+    LPCITEMIDLIST pidl,
+		LPVOID pOut,
+		UINT16 uOutSize)
+{ LPPIDLDATA  pData;
+  DWORD       dwReturn=0; 
+
+	TRACE(shell,"(%p)->(%x %p %p %x)\n",this,type,pidl,pOut,uOutSize);
+	
+  if(!pidl)
+  {  return 0;
+	}
+
+  pData = PidlMgr_GetDataPointer(this,pidl);
+
+  //copy the data
+  switch(type)
+  { case PT_DESKTOP: if(uOutSize < 1)
+                       return 0;
+                     if(PT_DESKTOP != pData->type)
+                       return 0;
+										 *(LPSTR)pOut = 0;	 
+                     strncpy((LPSTR)pOut, "DESKTOP", uOutSize);
+										 dwReturn = strlen((LPSTR)pOut);
+                     break;
+
+	 case PT_DRIVE:    if(uOutSize < 1)
+                       return 0;
+                     if(PT_DESKTOP != pData->type)
+                       return 0;
+										 *(LPSTR)pOut = 0;	 
+                     strncpy((LPSTR)pOut, "DRIVE", uOutSize);
+										 dwReturn = strlen((LPSTR)pOut);
+                     break;
+
+   case PT_FOLDER:
+   case PT_VALUE: 
+	 case PT_TEXT:     *(LPSTR)pOut = 0;
+                     strncpy((LPSTR)pOut, pData->szText, uOutSize);
+                     dwReturn = strlen((LPSTR)pOut);
+                     break;
+  }
+	TRACE(shell,"-- (%p)->(%p:%s %lx)\n",this,pOut,(char*)pOut,dwReturn);
+  return dwReturn;
+}
+
+
+/**************************************************************************
+ *  PidlMgr_GetDataPointer()
+ */
+LPPIDLDATA PidlMgr_GetDataPointer(LPPIDLMGR this,LPITEMIDLIST pidl)
+{ if(!pidl)
+  {  return NULL;
+	}
+	TRACE (shell,"(%p)->(%p)\n"	,this, pidl);
+  return (LPPIDLDATA)(pidl->mkid.abID);
+}
+
+/**************************************************************************
+ *  CPidlMgr_SeparatePathAndValue)
+ *  Creates a separate path and value PIDL from a fully qualified PIDL.
+ */
+BOOL32 PidlMgr_SeparatePathAndValue(LPPIDLMGR this, 
+   LPITEMIDLIST pidlFQ, LPITEMIDLIST *ppidlPath, LPITEMIDLIST *ppidlValue)
+{ LPITEMIDLIST   pidlTemp;
+	TRACE (shell,"(%p)->(pidl=%p pidl=%p pidl=%p)",this,pidlFQ,ppidlPath,ppidlValue);
+  if(!pidlFQ)
+  {  return FALSE;
+	}
+
+  *ppidlValue = PidlMgr_GetLastItem(this,pidlFQ);
+
+  if(!PidlMgr_IsValue(this,*ppidlValue))
+  { return FALSE;
+	}
+
+  *ppidlValue = PidlMgr_Copy(this,*ppidlValue);
+  *ppidlPath = PidlMgr_Copy(this,pidlFQ);
+
+  pidlTemp = PidlMgr_GetLastItem(this,*ppidlPath);
+  pidlTemp->mkid.cb = 0;
+  pidlTemp->mkid.abID[0] = 0;
+
+  return TRUE;
+}
diff --git a/ole/nls/afk.nls b/ole/nls/afk.nls
index d994f574..b67bf44 100644
--- a/ole/nls/afk.nls
+++ b/ole/nls/afk.nls
@@ -6,13 +6,13 @@
 /* LOCVAL(LOCALE_ILANGUAGE,"") */
 /* LOCVAL(LOCALE_SLANGUAGE,"") */
 /* LOCVAL(LOCALE_SENGLANGUAGE,"") */
-/* LOCVAL(LOCALE_SABBREVLANGNAME,"") */
-/* LOCVAL(LOCALE_SNATIVELANGNAME,"") */
+LOCVAL(LOCALE_SABBREVLANGNAME,"afk")
+LOCVAL(LOCALE_SNATIVELANGNAME,"Afrikaans")
 /* LOCVAL(LOCALE_ICOUNTRY,"") */
 /* LOCVAL(LOCALE_SCOUNTRY,"") */
 /* LOCVAL(LOCALE_SENGCOUNTRY,"") */
-LOCVAL(LOCALE_SABBREVCTRYNAME,"afk")
-/* LOCVAL(LOCALE_SNATIVECTRYNAME,"") */
+LOCVAL(LOCALE_SABBREVCTRYNAME,"ZAF")
+LOCVAL(LOCALE_SNATIVECTRYNAME,"Suid Afrika")
 /* LOCVAL(LOCALE_IDEFAULTLANGUAGE,"") */
 /* LOCVAL(LOCALE_IDEFAULTCOUNTRY,"") */
 /* LOCVAL(LOCALE_IDEFAULTCODEPAGE) */
@@ -25,12 +25,12 @@
 /* LOCVAL(LOCALE_IDIGITS,"2") */
 /* LOCVAL(LOCALE_ILZERO,"1") */
 /* LOCVAL(LOCALE_INEGNUMBER) */
-/* LOCVAL(LOCALE_SNATIVEDIGITS) */
+LOCVAL(LOCALE_SNATIVEDIGITS,"0123456789")
 /* LOCVAL(LOCALE_SCURRENCY,"") */
 /* LOCVAL(LOCALE_SINTLSYMBOL) */
 /* LOCVAL(LOCALE_SMONDECIMALSEP,",") */
 /* LOCVAL(LOCALE_SMONTHOUSANDSEP,".") */
-/* LOCVAL(LOCALE_SMONGROUPING) */
+LOCVAL(LOCALE_SMONGROUPING,"3;0")
 /* LOCVAL(LOCALE_ICURRDIGITS,"2") */
 /* LOCVAL(LOCALE_IINTLCURRDIGITS) */
 /* LOCVAL(LOCALE_ICURRENCY,"3") */
@@ -55,35 +55,35 @@
 /* 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_SDAYNAME1,"Maandag")
+LOCVAL(LOCALE_SDAYNAME2,"Dinsdag")
+LOCVAL(LOCALE_SDAYNAME3,"Woensdag")
+LOCVAL(LOCALE_SDAYNAME4,"Donderdag")
+LOCVAL(LOCALE_SDAYNAME5,"Vrydag")
+LOCVAL(LOCALE_SDAYNAME6,"Saterdag")
+LOCVAL(LOCALE_SDAYNAME7,"Sondag")
 
-/* 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_SABBREVDAYNAME1,"Maan")
+LOCVAL(LOCALE_SABBREVDAYNAME2,"Dins")
+LOCVAL(LOCALE_SABBREVDAYNAME3,"Woen")
+LOCVAL(LOCALE_SABBREVDAYNAME4,"Dond")
+LOCVAL(LOCALE_SABBREVDAYNAME5,"Vry")
+LOCVAL(LOCALE_SABBREVDAYNAME6,"Sat")
+LOCVAL(LOCALE_SABBREVDAYNAME7,"Son")
 
-/* 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_SMONTHNAME1,"Januarie")
+LOCVAL(LOCALE_SMONTHNAME2,"Februarie")
+LOCVAL(LOCALE_SMONTHNAME3,"Maart")
+LOCVAL(LOCALE_SMONTHNAME4,"April")
+LOCVAL(LOCALE_SMONTHNAME5,"Mei")
+LOCVAL(LOCALE_SMONTHNAME6,"Junie")
+LOCVAL(LOCALE_SMONTHNAME7,"Julie")
+LOCVAL(LOCALE_SMONTHNAME8,"Augustus")
+LOCVAL(LOCALE_SMONTHNAME9,"September")
+LOCVAL(LOCALE_SMONTHNAME10,"Oktober")
+LOCVAL(LOCALE_SMONTHNAME11,"November")
+LOCVAL(LOCALE_SMONTHNAME12,"Desember")
+LOCVAL(LOCALE_SMONTHNAME13,"")
 
 /* LOCVAL(LOCALE_SABBREVMONTHNAME1,"") */
 /* LOCVAL(LOCALE_SABBREVMONTHNAME2,"") */
@@ -108,3 +108,4 @@
 /* LOCVAL(LOCALE_INEGSYMPRECEDES, "") */
 /* LOCVAL(LOCALE_INEGSEPBYSPACE, "") */
 
+/* Gregoriaanse kalender */
diff --git a/ole/nls/ara.nls b/ole/nls/ara.nls
new file mode 100644
index 0000000..a3ac9d4
--- /dev/null
+++ b/ole/nls/ara.nls
@@ -0,0 +1,111 @@
+/*
+ *	OLE2NLS library
+ *      Arabic (Saudi Arabia)
+ */
+
+/* LOCVAL(LOCALE_ILANGUAGE,"") */
+/* LOCVAL(LOCALE_SLANGUAGE,"") */
+/* LOCVAL(LOCALE_SENGLANGUAGE,"") */
+LOCVAL(LOCALE_SABBREVLANGNAME,"ara")
+/* 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,"0123456789")
+/* LOCVAL(LOCALE_SCURRENCY,"") */
+LOCVAL(LOCALE_SINTLSYMBOL,"AED")
+/* 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,"") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME2,"") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME3,"") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME4,"") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME5,"") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME6,"") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME7,"") */
+
+/* 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/arb.nls b/ole/nls/arb.nls
new file mode 100644
index 0000000..5499d8a
--- /dev/null
+++ b/ole/nls/arb.nls
@@ -0,0 +1,111 @@
+/*
+ *	OLE2NLS library
+ *      Arabic (Lebanon)
+ */
+
+/* LOCVAL(LOCALE_ILANGUAGE,"") */
+/* LOCVAL(LOCALE_SLANGUAGE,"") */
+/* LOCVAL(LOCALE_SENGLANGUAGE,"") */
+LOCVAL(LOCALE_SABBREVLANGNAME,"arl")
+/* 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,"0123456789")
+/* LOCVAL(LOCALE_SCURRENCY,"") */
+LOCVAL(LOCALE_SINTLSYMBOL,"AED")
+/* 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,"") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME2,"") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME3,"") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME4,"") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME5,"") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME6,"") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME7,"") */
+
+/* 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/are.nls b/ole/nls/are.nls
new file mode 100644
index 0000000..5fd1478
--- /dev/null
+++ b/ole/nls/are.nls
@@ -0,0 +1,111 @@
+/*
+ *	OLE2NLS library
+ *      Arabic (Egypt)
+ */
+
+/* LOCVAL(LOCALE_ILANGUAGE,"") */
+/* LOCVAL(LOCALE_SLANGUAGE,"") */
+/* LOCVAL(LOCALE_SENGLANGUAGE,"") */
+LOCVAL(LOCALE_SABBREVLANGNAME,"are")
+/* 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,"0123456789")
+/* LOCVAL(LOCALE_SCURRENCY,"") */
+LOCVAL(LOCALE_SINTLSYMBOL,"AED")
+/* 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,"") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME2,"") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME3,"") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME4,"") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME5,"") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME6,"") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME7,"") */
+
+/* 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/arg.nls b/ole/nls/arg.nls
new file mode 100644
index 0000000..a6aaf14
--- /dev/null
+++ b/ole/nls/arg.nls
@@ -0,0 +1,111 @@
+/*
+ *	OLE2NLS library
+ *      Arabic (Algeria)
+ */
+
+/* LOCVAL(LOCALE_ILANGUAGE,"") */
+/* LOCVAL(LOCALE_SLANGUAGE,"") */
+/* LOCVAL(LOCALE_SENGLANGUAGE,"") */
+LOCVAL(LOCALE_SABBREVLANGNAME,"ars")
+/* 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,"0123456789")
+/* LOCVAL(LOCALE_SCURRENCY,"") */
+LOCVAL(LOCALE_SINTLSYMBOL,"AED")
+/* 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,"") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME2,"") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME3,"") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME4,"") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME5,"") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME6,"") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME7,"") */
+
+/* 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/ari.nls b/ole/nls/ari.nls
new file mode 100644
index 0000000..f77c6bb
--- /dev/null
+++ b/ole/nls/ari.nls
@@ -0,0 +1,111 @@
+/*
+ *	OLE2NLS library
+ *      Arabic
+ */
+
+/* LOCVAL(LOCALE_ILANGUAGE,"") */
+/* LOCVAL(LOCALE_SLANGUAGE,"") */
+/* LOCVAL(LOCALE_SENGLANGUAGE,"") */
+LOCVAL(LOCALE_SABBREVLANGNAME,"ari")
+/* 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,"") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME2,"") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME3,"") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME4,"") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME5,"") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME6,"") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME7,"") */
+
+/* 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/ark.nls b/ole/nls/ark.nls
new file mode 100644
index 0000000..f265b49
--- /dev/null
+++ b/ole/nls/ark.nls
@@ -0,0 +1,111 @@
+/*
+ *	OLE2NLS library
+ *      Arabic (Kuwait)
+ */
+
+/* LOCVAL(LOCALE_ILANGUAGE,"") */
+/* LOCVAL(LOCALE_SLANGUAGE,"") */
+/* LOCVAL(LOCALE_SENGLANGUAGE,"") */
+LOCVAL(LOCALE_SABBREVLANGNAME,"ark")
+/* LOCVAL(LOCALE_SNATIVELANGNAME,"") */
+/* LOCVAL(LOCALE_ICOUNTRY,"") */
+/* LOCVAL(LOCALE_SCOUNTRY,"") */
+/* LOCVAL(LOCALE_SENGCOUNTRY,"") */
+LOCVAL(LOCALE_SABBREVCTRYNAME,"KWT")
+/* 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,"0123456789")
+/* LOCVAL(LOCALE_SCURRENCY,"") */
+LOCVAL(LOCALE_SINTLSYMBOL,"KWD")
+/* 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,"") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME2,"") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME3,"") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME4,"") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME5,"") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME6,"") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME7,"") */
+
+/* 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/arm.nls b/ole/nls/arm.nls
new file mode 100644
index 0000000..45f17d2
--- /dev/null
+++ b/ole/nls/arm.nls
@@ -0,0 +1,111 @@
+/*
+ *	OLE2NLS library
+ *      Arabic (Marocco)
+ */
+
+/* LOCVAL(LOCALE_ILANGUAGE,"") */
+/* LOCVAL(LOCALE_SLANGUAGE,"") */
+/* LOCVAL(LOCALE_SENGLANGUAGE,"") */
+LOCVAL(LOCALE_SABBREVLANGNAME,"ars")
+/* 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,"0123456789")
+/* LOCVAL(LOCALE_SCURRENCY,"") */
+LOCVAL(LOCALE_SINTLSYMBOL,"AED")
+/* 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,"") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME2,"") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME3,"") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME4,"") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME5,"") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME6,"") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME7,"") */
+
+/* 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/aro.nls b/ole/nls/aro.nls
new file mode 100644
index 0000000..eeaf67d
--- /dev/null
+++ b/ole/nls/aro.nls
@@ -0,0 +1,111 @@
+/*
+ *	OLE2NLS library
+ *      Arabic (Oman)
+ */
+
+/* LOCVAL(LOCALE_ILANGUAGE,"") */
+/* LOCVAL(LOCALE_SLANGUAGE,"") */
+/* LOCVAL(LOCALE_SENGLANGUAGE,"") */
+LOCVAL(LOCALE_SABBREVLANGNAME,"ars")
+/* 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,"0123456789")
+/* LOCVAL(LOCALE_SCURRENCY,"") */
+LOCVAL(LOCALE_SINTLSYMBOL,"AED")
+/* 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,"") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME2,"") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME3,"") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME4,"") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME5,"") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME6,"") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME7,"") */
+
+/* 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/arq.nls b/ole/nls/arq.nls
new file mode 100644
index 0000000..5e5020c
--- /dev/null
+++ b/ole/nls/arq.nls
@@ -0,0 +1,111 @@
+/*
+ *	OLE2NLS library
+ *      Arabic (Quatar)
+ */
+
+/* LOCVAL(LOCALE_ILANGUAGE,"") */
+/* LOCVAL(LOCALE_SLANGUAGE,"") */
+/* LOCVAL(LOCALE_SENGLANGUAGE,"") */
+LOCVAL(LOCALE_SABBREVLANGNAME,"arq")
+/* 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,"") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME2,"") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME3,"") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME4,"") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME5,"") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME6,"") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME7,"") */
+
+/* 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/ars.nls b/ole/nls/ars.nls
new file mode 100644
index 0000000..4fcbb35
--- /dev/null
+++ b/ole/nls/ars.nls
@@ -0,0 +1,111 @@
+/*
+ *	OLE2NLS library
+ *      Arabic (Syria)
+ */
+
+/* LOCVAL(LOCALE_ILANGUAGE,"") */
+/* LOCVAL(LOCALE_SLANGUAGE,"") */
+/* LOCVAL(LOCALE_SENGLANGUAGE,"") */
+LOCVAL(LOCALE_SABBREVLANGNAME,"ars")
+/* 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,"0123456789")
+/* LOCVAL(LOCALE_SCURRENCY,"") */
+LOCVAL(LOCALE_SINTLSYMBOL,"AED")
+/* 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,"") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME2,"") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME3,"") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME4,"") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME5,"") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME6,"") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME7,"") */
+
+/* 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/art.nls b/ole/nls/art.nls
new file mode 100644
index 0000000..73eb885
--- /dev/null
+++ b/ole/nls/art.nls
@@ -0,0 +1,111 @@
+/*
+ *	OLE2NLS library
+ *      Arabic (Tunesia)
+ */
+
+/* LOCVAL(LOCALE_ILANGUAGE,"") */
+/* LOCVAL(LOCALE_SLANGUAGE,"") */
+/* LOCVAL(LOCALE_SENGLANGUAGE,"") */
+LOCVAL(LOCALE_SABBREVLANGNAME,"art")
+/* LOCVAL(LOCALE_SNATIVELANGNAME,"") */
+/* LOCVAL(LOCALE_ICOUNTRY,"") */
+/* LOCVAL(LOCALE_SCOUNTRY,"") */
+/* LOCVAL(LOCALE_SENGCOUNTRY,"") */
+LOCVAL(LOCALE_SABBREVCTRYNAME,"TUN")
+/* 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,"0123456789")
+/* LOCVAL(LOCALE_SCURRENCY,"") */
+LOCVAL(LOCALE_SINTLSYMBOL,"AED")
+/* 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,"") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME2,"") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME3,"") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME4,"") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME5,"") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME6,"") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME7,"") */
+
+/* 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/aru.nls b/ole/nls/aru.nls
new file mode 100644
index 0000000..db2c50e
--- /dev/null
+++ b/ole/nls/aru.nls
@@ -0,0 +1,111 @@
+/*
+ *	OLE2NLS library
+ *      Arabic (aru)
+ */
+
+/* LOCVAL(LOCALE_ILANGUAGE,"") */
+/* LOCVAL(LOCALE_SLANGUAGE,"") */
+/* LOCVAL(LOCALE_SENGLANGUAGE,"") */
+LOCVAL(LOCALE_SABBREVLANGNAME,"aru")
+/* 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,"0123456789")
+/* LOCVAL(LOCALE_SCURRENCY,"") */
+LOCVAL(LOCALE_SINTLSYMBOL,"AED")
+/* 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,"") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME2,"") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME3,"") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME4,"") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME5,"") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME6,"") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME7,"") */
+
+/* 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
index 435edcb..328c2ab 100644
--- a/ole/nls/bel.nls
+++ b/ole/nls/bel.nls
@@ -63,13 +63,13 @@
 /* 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_SABBREVDAYNAME1,"") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME2,"") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME3,"") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME4,"") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME5,"") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME6,"") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME7,"") */
 
 /* LOCVAL(LOCALE_SMONTHNAME1,"") */
 /* LOCVAL(LOCALE_SMONTHNAME2,"") */
diff --git a/ole/nls/bgr.nls b/ole/nls/bgr.nls
index f423cac..aaaad3b 100644
--- a/ole/nls/bgr.nls
+++ b/ole/nls/bgr.nls
@@ -25,7 +25,7 @@
 /* LOCVAL(LOCALE_IDIGITS,"2") */
 /* LOCVAL(LOCALE_ILZERO,"1") */
 /* LOCVAL(LOCALE_INEGNUMBER) */
-/* LOCVAL(LOCALE_SNATIVEDIGITS) */
+LOCVAL(LOCALE_SNATIVEDIGITS, "0123456789")
 /* LOCVAL(LOCALE_SCURRENCY,"") */
 /* LOCVAL(LOCALE_SINTLSYMBOL) */
 /* LOCVAL(LOCALE_SMONDECIMALSEP,",") */
@@ -63,13 +63,13 @@
 /* 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_SABBREVDAYNAME1,"") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME2,"") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME3,"") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME4,"") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME5,"") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME6,"") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME7,"") */
 
 /* LOCVAL(LOCALE_SMONTHNAME1,"") */
 /* LOCVAL(LOCALE_SMONTHNAME2,"") */
diff --git a/ole/nls/cat.nls b/ole/nls/cat.nls
index 06b6a50..f5537be 100644
--- a/ole/nls/cat.nls
+++ b/ole/nls/cat.nls
@@ -4,41 +4,41 @@
  */
 
 /* LOCVAL(LOCALE_ILANGUAGE,"") */
-/* LOCVAL(LOCALE_SLANGUAGE,"") */
-LOCVAL(LOCALE_SENGLANGUAGE,"Spanish")
-LOCVAL(LOCALE_SABBREVLANGNAME,"esp")
-/* LOCVAL(LOCALE_SNATIVELANGNAME,"") */
+LOCVAL(LOCALE_SLANGUAGE,"Català")
+LOCVAL(LOCALE_SENGLANGUAGE,"Catalan")
+LOCVAL(LOCALE_SABBREVLANGNAME,"cat")
+LOCVAL(LOCALE_SNATIVELANGNAME,"Català")
 /* LOCVAL(LOCALE_ICOUNTRY,"") */
-/* LOCVAL(LOCALE_SCOUNTRY,"") */
+LOCVAL(LOCALE_SCOUNTRY,"Espanya")
 LOCVAL(LOCALE_SENGCOUNTRY,"Spain")
-LOCVAL(LOCALE_SABBREVCTRYNAME,"cat")
-/* LOCVAL(LOCALE_SNATIVECTRYNAME,"Espa€a") */
+LOCVAL(LOCALE_SABBREVCTRYNAME,"Es")
+LOCVAL(LOCALE_SNATIVECTRYNAME,"Espanya")
 /* LOCVAL(LOCALE_IDEFAULTLANGUAGE,"") */
 /* LOCVAL(LOCALE_IDEFAULTCOUNTRY,"") */
-/* LOCVAL(LOCALE_IDEFAULTCODEPAGE) */
+LOCVAL(LOCALE_IDEFAULTCODEPAGE,"850")
 /* LOCVAL(LOCALE_IDEFAULTANSICODEPAGE) */
 /* LOCVAL(LOCALE_SLIST,"") */
 /* LOCVAL(LOCALE_IMEASURE,"") */
-/* LOCVAL(LOCALE_SDECIMAL,"") */
-/* LOCVAL(LOCALE_STHOUSAND,"") */
-/* LOCVAL(LOCALE_SGROUPING) */
+LOCVAL(LOCALE_SDECIMAL,",")
+LOCVAL(LOCALE_STHOUSAND,"")
+LOCVAL(LOCALE_SGROUPING,"0;0")
 /* 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_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_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) */
@@ -48,59 +48,59 @@
 /* LOCVAL(LOCALE_ITLZERO,"1")
 /* LOCVAL(LOCALE_IDAYLZERO) */
 /* LOCVAL(LOCALE_IMONLZERO) */
-/* LOCVAL(LOCALE_S1159, "") */
-/* LOCVAL(LOCALE_S2359, "") */
+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_SDAYNAME1,"Dilluns")
+LOCVAL(LOCALE_SDAYNAME2,"Dimarts")
+LOCVAL(LOCALE_SDAYNAME3,"Dimecres")
+LOCVAL(LOCALE_SDAYNAME4,"Dijous")
+LOCVAL(LOCALE_SDAYNAME5,"Divendres")
+LOCVAL(LOCALE_SDAYNAME6,"Dissabte")
+LOCVAL(LOCALE_SDAYNAME7,"Diumenge")
 
-/* 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_SABBREVDAYNAME1,"Dl")
+LOCVAL(LOCALE_SABBREVDAYNAME2,"Dt")
+LOCVAL(LOCALE_SABBREVDAYNAME3,"Dc")
+LOCVAL(LOCALE_SABBREVDAYNAME4,"Dj")
+LOCVAL(LOCALE_SABBREVDAYNAME5,"Dv")
+LOCVAL(LOCALE_SABBREVDAYNAME6,"Ds")
+LOCVAL(LOCALE_SABBREVDAYNAME7,"Dg")
 
-/* 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_SMONTHNAME1,"Gener")
+LOCVAL(LOCALE_SMONTHNAME2,"Febrer")
+LOCVAL(LOCALE_SMONTHNAME3,"Març")
+LOCVAL(LOCALE_SMONTHNAME4,"Abril")
+LOCVAL(LOCALE_SMONTHNAME5,"Maig")
+LOCVAL(LOCALE_SMONTHNAME6,"Juny")
+LOCVAL(LOCALE_SMONTHNAME7,"Juliol")
+LOCVAL(LOCALE_SMONTHNAME8,"Agost")
+LOCVAL(LOCALE_SMONTHNAME9,"Setembre")
+LOCVAL(LOCALE_SMONTHNAME10,"Octubre")
+LOCVAL(LOCALE_SMONTHNAME11,"Novembre")
+LOCVAL(LOCALE_SMONTHNAME12,"Desembre")
 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_SABBREVMONTHNAME1,"Gn")
+LOCVAL(LOCALE_SABBREVMONTHNAME2,"Fb")
+LOCVAL(LOCALE_SABBREVMONTHNAME3,"Mç")
+LOCVAL(LOCALE_SABBREVMONTHNAME4,"Ab")
+LOCVAL(LOCALE_SABBREVMONTHNAME5,"Mg")
+LOCVAL(LOCALE_SABBREVMONTHNAME6,"Jn")
+LOCVAL(LOCALE_SABBREVMONTHNAME7,"Jl")
+LOCVAL(LOCALE_SABBREVMONTHNAME8,"Ag")
+LOCVAL(LOCALE_SABBREVMONTHNAME9,"St")
+LOCVAL(LOCALE_SABBREVMONTHNAME10,"Oc")
+LOCVAL(LOCALE_SABBREVMONTHNAME11,"Nv")
+LOCVAL(LOCALE_SABBREVMONTHNAME12,"Ds")
 LOCVAL(LOCALE_SABBREVMONTHNAME13,"")
 
-/* LOCVAL(LOCALE_SPOSITIVESIGN, "") */
-/* LOCVAL(LOCALE_SNEGATIVESIGN, "") */
+LOCVAL(LOCALE_SPOSITIVESIGN, "")
+LOCVAL(LOCALE_SNEGATIVESIGN, "-")
 /* LOCVAL(LOCALE_IPOSSIGNPOSN, "") */
 /* LOCVAL(LOCALE_INEGSIGNPOSN, "") */
 /* LOCVAL(LOCALE_IPOSSYMPRECEDES, "") */
diff --git a/ole/nls/cht.nls b/ole/nls/cht.nls
new file mode 100644
index 0000000..9dafd4d
--- /dev/null
+++ b/ole/nls/cht.nls
@@ -0,0 +1,110 @@
+/*
+ *	OLE2NLS library
+ *      Chinese (Taiwan)
+ */
+
+/* LOCVAL(LOCALE_ILANGUAGE,"") */
+/* LOCVAL(LOCALE_SLANGUAGE,"") */
+/* LOCVAL(LOCALE_SENGLANGUAGE,"Chinese (Taiwan)") */
+LOCVAL(LOCALE_SABBREVLANGNAME,"cht")
+/* 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, "TWD")
+/* 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,"") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME2,"") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME3,"") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME4,"") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME5,"") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME6,"") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME7,"") */
+
+/* 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/cze.nls b/ole/nls/cze.nls
index 6d63603..806703f 100644
--- a/ole/nls/cze.nls
+++ b/ole/nls/cze.nls
@@ -5,17 +5,18 @@
 
 /* LOCVAL(LOCALE_ILANGUAGE,"") */
 /* LOCVAL(LOCALE_SLANGUAGE,"") */
-/* LOCVAL(LOCALE_SENGLANGUAGE,"Czech Republic") */
+LOCVAL(LOCALE_SENGLANGUAGE,"Czech Republic")
 LOCVAL(LOCALE_SABBREVLANGNAME,"cze")
-/* LOCVAL(LOCALE_SNATIVELANGNAME,"?zech republika") */
+
+LOCVAL(LOCALE_SNATIVELANGNAME,"Èeský jazyk")
 /* LOCVAL(LOCALE_ICOUNTRY,"") */
-/* LOCVAL(LOCALE_SCOUNTRY,"") */
-/* LOCVAL(LOCALE_SENGCOUNTRY,"") */
-LOCVAL(LOCALE_SABBREVCTRYNAME,"cze")
-/* LOCVAL(LOCALE_SNATIVECTRYNAME,"") */
+LOCVAL(LOCALE_SCOUNTRY,"Èeská Republika")
+LOCVAL(LOCALE_SENGCOUNTRY,"Czech Republic")
+LOCVAL(LOCALE_SABBREVCTRYNAME,"Cz")
+LOCVAL(LOCALE_SNATIVECTRYNAME,"Èeská Republika")
 /* LOCVAL(LOCALE_IDEFAULTLANGUAGE,"") */
 /* LOCVAL(LOCALE_IDEFAULTCOUNTRY,"") */
-/* LOCVAL(LOCALE_IDEFAULTCODEPAGE) */
+LOCVAL(LOCALE_IDEFAULTCODEPAGE,"895")
 /* LOCVAL(LOCALE_IDEFAULTANSICODEPAGE) */
 /* LOCVAL(LOCALE_SLIST,"") */
 /* LOCVAL(LOCALE_IMEASURE,"") */
@@ -25,20 +26,20 @@
 /* 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_SNATIVEDIGITS, "0123456789")
+LOCVAL(LOCALE_SCURRENCY,"Kè")
+LOCVAL(LOCALE_SINTLSYMBOL,"CZK")
+LOCVAL(LOCALE_SMONDECIMALSEP,",")
+LOCVAL(LOCALE_SMONTHOUSANDSEP," ")
+LOCVAL(LOCALE_SMONGROUPING,"3;3")
 /* 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_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) */
@@ -48,59 +49,59 @@
 /* LOCVAL(LOCALE_ITLZERO,"1")
 /* LOCVAL(LOCALE_IDAYLZERO) */
 /* LOCVAL(LOCALE_IMONLZERO) */
-/* LOCVAL(LOCALE_S1159, "") */
-/* LOCVAL(LOCALE_S2359, "") */
+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_SDAYNAME1,"Ponïelí")
+LOCVAL(LOCALE_SDAYNAME2,"Úterý")
+LOCVAL(LOCALE_SDAYNAME3,"Støeda")
+LOCVAL(LOCALE_SDAYNAME4,"Ètvrtek")
+LOCVAL(LOCALE_SDAYNAME5,"Pátek")
+LOCVAL(LOCALE_SDAYNAME6,"Sobota")
+LOCVAL(LOCALE_SDAYNAME7,"Nedìle")
 
-/* 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_SABBREVDAYNAME1,"Po")
+LOCVAL(LOCALE_SABBREVDAYNAME2,"Út")
+LOCVAL(LOCALE_SABBREVDAYNAME3,"St")
+LOCVAL(LOCALE_SABBREVDAYNAME4,"Èt")
+LOCVAL(LOCALE_SABBREVDAYNAME5,"Pá")
+LOCVAL(LOCALE_SABBREVDAYNAME6,"So")
+LOCVAL(LOCALE_SABBREVDAYNAME7,"Ne")
 
-/* 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_SMONTHNAME1,"Leden")
+LOCVAL(LOCALE_SMONTHNAME2,"Únor")
+LOCVAL(LOCALE_SMONTHNAME3,"Bøezen")
+LOCVAL(LOCALE_SMONTHNAME4,"Duben")
+LOCVAL(LOCALE_SMONTHNAME5,"Kvìten")
+LOCVAL(LOCALE_SMONTHNAME6,"Èerven")
+LOCVAL(LOCALE_SMONTHNAME7,"Èervenec")
+LOCVAL(LOCALE_SMONTHNAME8,"Srpen")
+LOCVAL(LOCALE_SMONTHNAME9,"Záøí")
+LOCVAL(LOCALE_SMONTHNAME10,"Øíjen")
+LOCVAL(LOCALE_SMONTHNAME11,"Listopad")
+LOCVAL(LOCALE_SMONTHNAME12,"Prosinec")
 /* 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_SABBREVMONTHNAME1,"Led")
+LOCVAL(LOCALE_SABBREVMONTHNAME2,"Úno")
+LOCVAL(LOCALE_SABBREVMONTHNAME3,"Bøe")
+LOCVAL(LOCALE_SABBREVMONTHNAME4,"Dub")
+LOCVAL(LOCALE_SABBREVMONTHNAME5,"Kvì")
+LOCVAL(LOCALE_SABBREVMONTHNAME6,"Èer")
+LOCVAL(LOCALE_SABBREVMONTHNAME7,"Ènc")
+LOCVAL(LOCALE_SABBREVMONTHNAME8,"Srp")
+LOCVAL(LOCALE_SABBREVMONTHNAME9,"Záø")
+LOCVAL(LOCALE_SABBREVMONTHNAME10,"Øíj")
+LOCVAL(LOCALE_SABBREVMONTHNAME11,"Lis")
+LOCVAL(LOCALE_SABBREVMONTHNAME12,"Pro")
 /* LOCVAL(LOCALE_SABBREVMONTHNAME13,"") */
 
-/* LOCVAL(LOCALE_SPOSITIVESIGN, "") */
-/* LOCVAL(LOCALE_SNEGATIVESIGN, "") */
+LOCVAL(LOCALE_SPOSITIVESIGN, "")
+LOCVAL(LOCALE_SNEGATIVESIGN, "-")
 /* LOCVAL(LOCALE_IPOSSIGNPOSN, "") */
 /* LOCVAL(LOCALE_INEGSIGNPOSN, "") */
 /* LOCVAL(LOCALE_IPOSSYMPRECEDES, "") */
diff --git a/ole/nls/dan.nls b/ole/nls/dan.nls
new file mode 100644
index 0000000..6baefff
--- /dev/null
+++ b/ole/nls/dan.nls
@@ -0,0 +1,111 @@
+/*
+ *	OLE2NLS library
+ *      Denmark
+ */
+
+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, "0123456789")
+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")
+
+/* Den gregorianske Kalender */
diff --git a/ole/nls/dea.nls b/ole/nls/dea.nls
index dab500f..bac90de 100644
--- a/ole/nls/dea.nls
+++ b/ole/nls/dea.nls
@@ -30,7 +30,7 @@
 LOCVAL(LOCALE_SINTLSYMBOL,"ATS")
 /* LOCVAL(LOCALE_SMONDECIMALSEP) */
 /* LOCVAL(LOCALE_SMONTHOUSANDSEP) */
-/* LOCVAL(LOCALE_SMONGROUPING) */
+LOCVAL(LOCALE_SMONGROUPING, "3;0")
 
 LOCVAL(LOCALE_ICURRDIGITS,"2")
 /* LOCVAL(LOCALE_IINTLCURRDIGITS) */
@@ -72,7 +72,7 @@
 LOCVAL(LOCALE_SABBREVDAYNAME6,"Sa")
 LOCVAL(LOCALE_SABBREVDAYNAME7,"So")
 
-LOCVAL(LOCALE_SMONTHNAME1,"Januar")
+LOCVAL(LOCALE_SMONTHNAME1,"J€nner")
 LOCVAL(LOCALE_SMONTHNAME2,"Februar")
 LOCVAL(LOCALE_SMONTHNAME3,"März")
 LOCVAL(LOCALE_SMONTHNAME4,"April")
@@ -86,7 +86,7 @@
 LOCVAL(LOCALE_SMONTHNAME12,"Dezember")
 LOCVAL(LOCALE_SMONTHNAME13,"")
 
-LOCVAL(LOCALE_SABBREVMONTHNAME1,"Jan")
+LOCVAL(LOCALE_SABBREVMONTHNAME1,"J€n")
 LOCVAL(LOCALE_SABBREVMONTHNAME2,"Feb")
 LOCVAL(LOCALE_SABBREVMONTHNAME3,"Mär")
 LOCVAL(LOCALE_SABBREVMONTHNAME4,"Apr")
@@ -108,3 +108,5 @@
 /* LOCVAL(LOCALE_IPOSSEPBYSPACE) */
 /* LOCVAL(LOCALE_INEGSYMPRECEDES) */
 /* LOCVAL(LOCALE_INEGSEPBYSPACE) */
+
+/* Gregorianischer Kalender */
\ No newline at end of file
diff --git a/ole/nls/dec.nls b/ole/nls/dec.nls
new file mode 100644
index 0000000..ed2b0a0
--- /dev/null
+++ b/ole/nls/dec.nls
@@ -0,0 +1,112 @@
+/*
+ *	OLE2NLS library
+ *      Fuerstentum Liechtenstein
+ */
+ 
+LOCVAL(LOCALE_ILANGUAGE,"9")
+LOCVAL(LOCALE_SLANGUAGE,"Deutsch")
+LOCVAL(LOCALE_SENGLANGUAGE,"German")
+LOCVAL(LOCALE_SABBREVLANGNAME,"dec")
+LOCVAL(LOCALE_SNATIVELANGNAME,"Deutsch")
+LOCVAL(LOCALE_ICOUNTRY,"41")
+LOCVAL(LOCALE_SCOUNTRY,"Liechtenstein (Deutsch)")
+LOCVAL(LOCALE_SENGCOUNTRY,"Liechtenstein")
+LOCVAL(LOCALE_SABBREVCTRYNAME,"LIE")
+LOCVAL(LOCALE_SNATIVECTRYNAME,"Liechtenstein")
+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, "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,"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) */
+
+/* Gregorianischer Kalender */
diff --git a/ole/nls/del.nls b/ole/nls/del.nls
new file mode 100644
index 0000000..70307a6
--- /dev/null
+++ b/ole/nls/del.nls
@@ -0,0 +1,111 @@
+/*
+ *	OLE2NLS library
+ *      Luxembourg (German)
+ */
+
+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,"Luxemburg")
+LOCVAL(LOCALE_SENGCOUNTRY,"Luxemburg")
+LOCVAL(LOCALE_SABBREVCTRYNAME,"LUX")
+LOCVAL(LOCALE_SNATIVECTRYNAME,"Luxembourg")
+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,"F")
+LOCVAL(LOCALE_SINTLSYMBOL, "LUF")
+/* 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) */
+
+/* Gregorianischer Kalender */
\ No newline at end of file
diff --git a/ole/nls/des.nls b/ole/nls/des.nls
index db5a2fd..61e5ae7 100644
--- a/ole/nls/des.nls
+++ b/ole/nls/des.nls
@@ -1,6 +1,6 @@
 /*
  *	OLE2NLS library
- *      Switzerland
+ *      Switzerland (German)
  */
  
 LOCVAL(LOCALE_ILANGUAGE,"9")
@@ -30,7 +30,7 @@
 LOCVAL(LOCALE_SINTLSYMBOL,"CHF")
 /* LOCVAL(LOCALE_SMONDECIMALSEP) */
 /* LOCVAL(LOCALE_SMONTHOUSANDSEP) */
-/* LOCVAL(LOCALE_SMONGROUPING) */
+LOCVAL(LOCALE_SMONGROUPING, "3;0")
 
 LOCVAL(LOCALE_ICURRDIGITS,"2")
 /* LOCVAL(LOCALE_IINTLCURRDIGITS) */
@@ -108,3 +108,5 @@
 /* LOCVAL(LOCALE_IPOSSEPBYSPACE) */
 /* LOCVAL(LOCALE_INEGSYMPRECEDES) */
 /* LOCVAL(LOCALE_INEGSEPBYSPACE) */
+
+/* Gregorianischer Kalender */
diff --git a/ole/nls/deu.nls b/ole/nls/deu.nls
index 1c681f9..21e7891 100644
--- a/ole/nls/deu.nls
+++ b/ole/nls/deu.nls
@@ -107,3 +107,5 @@
 /* LOCVAL(LOCALE_IPOSSEPBYSPACE) */
 /* LOCVAL(LOCALE_INEGSYMPRECEDES) */
 /* LOCVAL(LOCALE_INEGSEPBYSPACE) */
+
+/* Gregorianischer Kalender */
\ No newline at end of file
diff --git a/ole/nls/empty.nls b/ole/nls/empty.nls
new file mode 100644
index 0000000..7648569
--- /dev/null
+++ b/ole/nls/empty.nls
@@ -0,0 +1,111 @@
+/*
+ *	OLE2NLS library
+ *      Language (Information)
+ */
+
+/* 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,"") */
+/* 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,"") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME2,"") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME3,"") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME4,"") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME5,"") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME6,"") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME7,"") */
+
+/* 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/ena.nls b/ole/nls/ena.nls
index 76bba0e..f3fa01a 100644
--- a/ole/nls/ena.nls
+++ b/ole/nls/ena.nls
@@ -107,3 +107,5 @@
 LOCVAL(LOCALE_IPOSSEPBYSPACE, "0")
 LOCVAL(LOCALE_INEGSYMPRECEDES, "1")
 LOCVAL(LOCALE_INEGSEPBYSPACE, "0")
+
+/* Gregorian Calendar */
diff --git a/ole/nls/enb.nls b/ole/nls/enb.nls
new file mode 100644
index 0000000..f1b59b1
--- /dev/null
+++ b/ole/nls/enb.nls
@@ -0,0 +1,111 @@
+/*
+ *	OLE2NLS library
+ *      Caribbean
+ */
+
+LOCVAL(LOCALE_ILANGUAGE, "0809")
+LOCVAL(LOCALE_SLANGUAGE, "English (Caribbean)")
+LOCVAL(LOCALE_SENGLANGUAGE, "English")
+LOCVAL(LOCALE_SABBREVLANGNAME, "enb")
+LOCVAL(LOCALE_SNATIVELANGNAME, "English")
+LOCVAL(LOCALE_ICOUNTRY, "44")
+LOCVAL(LOCALE_SCOUNTRY, "Caribbean")
+LOCVAL(LOCALE_SENGCOUNTRY, "Caribbean")
+LOCVAL(LOCALE_SABBREVCTRYNAME, "CAR")
+LOCVAL(LOCALE_SNATIVECTRYNAME, "Carribean")
+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, "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, "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")
+
+/* Gregorian Calendar */
diff --git a/ole/nls/enc.nls b/ole/nls/enc.nls
index 31edec4..9d92ee3 100644
--- a/ole/nls/enc.nls
+++ b/ole/nls/enc.nls
@@ -1,6 +1,6 @@
 /*
  *	OLE2NLS library
- *      Canada
+ *      Canada (English)
  */
 
 LOCVAL(LOCALE_ILANGUAGE, "0409")
@@ -107,3 +107,5 @@
 LOCVAL(LOCALE_IPOSSEPBYSPACE, "0")
 LOCVAL(LOCALE_INEGSYMPRECEDES, "1")
 LOCVAL(LOCALE_INEGSEPBYSPACE, "0")
+
+/* Gregorian Calendar */
diff --git a/ole/nls/eng.nls b/ole/nls/eng.nls
index 25dbd24..8bd2987 100644
--- a/ole/nls/eng.nls
+++ b/ole/nls/eng.nls
@@ -107,3 +107,5 @@
 LOCVAL(LOCALE_IPOSSEPBYSPACE, "0")
 LOCVAL(LOCALE_INEGSYMPRECEDES, "1")
 LOCVAL(LOCALE_INEGSEPBYSPACE, "0")
+
+/* Gregorian Calendar */
diff --git a/ole/nls/enj.nls b/ole/nls/enj.nls
new file mode 100644
index 0000000..aef13b7
--- /dev/null
+++ b/ole/nls/enj.nls
@@ -0,0 +1,111 @@
+/*
+ *	OLE2NLS library
+ *      Jamaica
+ */
+
+LOCVAL(LOCALE_ILANGUAGE, "0809")
+LOCVAL(LOCALE_SLANGUAGE, "English (Jamaica)")
+LOCVAL(LOCALE_SENGLANGUAGE, "English")
+LOCVAL(LOCALE_SABBREVLANGNAME, "enj")
+LOCVAL(LOCALE_SNATIVELANGNAME, "English")
+LOCVAL(LOCALE_ICOUNTRY, "44")
+LOCVAL(LOCALE_SCOUNTRY, "Jamaica")
+LOCVAL(LOCALE_SENGCOUNTRY, "Jamaica")
+LOCVAL(LOCALE_SABBREVCTRYNAME, "JAM")
+LOCVAL(LOCALE_SNATIVECTRYNAME, "Jamaica")
+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, "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, "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")
+
+/* Gregorian Calendar */
diff --git a/ole/nls/ens.nls b/ole/nls/ens.nls
new file mode 100644
index 0000000..07a8e8c
--- /dev/null
+++ b/ole/nls/ens.nls
@@ -0,0 +1,111 @@
+/*
+ *	OLE2NLS library
+ *      South Africa (English)
+ */
+
+LOCVAL(LOCALE_ILANGUAGE, "0809")
+LOCVAL(LOCALE_SLANGUAGE, "English (South Africa)")
+LOCVAL(LOCALE_SENGLANGUAGE, "English")
+LOCVAL(LOCALE_SABBREVLANGNAME, "ens")
+LOCVAL(LOCALE_SNATIVELANGNAME, "English")
+/* LOCVAL(LOCALE_ICOUNTRY, "") */
+LOCVAL(LOCALE_SCOUNTRY, "South Africa")
+LOCVAL(LOCALE_SENGCOUNTRY, "South Africa")
+LOCVAL(LOCALE_SABBREVCTRYNAME, "ZAF")
+LOCVAL(LOCALE_SNATIVECTRYNAME, "South Africa")
+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, "R")
+LOCVAL(LOCALE_SINTLSYMBOL, "ZAR")
+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")
+
+/* Gregorian Calendar */
diff --git a/ole/nls/enu.nls b/ole/nls/enu.nls
index 631cdfd..718f2f3 100644
--- a/ole/nls/enu.nls
+++ b/ole/nls/enu.nls
@@ -107,3 +107,5 @@
 LOCVAL(LOCALE_IPOSSEPBYSPACE, "0")
 LOCVAL(LOCALE_INEGSYMPRECEDES, "1")
 LOCVAL(LOCALE_INEGSEPBYSPACE, "0")
+
+/* Gregorian Calendar */
\ No newline at end of file
diff --git a/ole/nls/enz.nls b/ole/nls/enz.nls
index c6824ed..869b79b 100644
--- a/ole/nls/enz.nls
+++ b/ole/nls/enz.nls
@@ -26,8 +26,8 @@
 LOCVAL(LOCALE_ILZERO, "1")
 LOCVAL(LOCALE_INEGNUMBER, "1")
 LOCVAL(LOCALE_SNATIVEDIGITS, "0123456789")
-LOCVAL(LOCALE_SCURRENCY, "£")
-LOCVAL(LOCALE_SINTLSYMBOL, "GBP")
+LOCVAL(LOCALE_SCURRENCY, "$")
+LOCVAL(LOCALE_SINTLSYMBOL, "NZD")
 LOCVAL(LOCALE_SMONDECIMALSEP, ".")
 LOCVAL(LOCALE_SMONTHOUSANDSEP, ",")
 LOCVAL(LOCALE_SMONGROUPING, "3;0")
@@ -107,3 +107,5 @@
 LOCVAL(LOCALE_IPOSSEPBYSPACE, "0")
 LOCVAL(LOCALE_INEGSYMPRECEDES, "1")
 LOCVAL(LOCALE_INEGSEPBYSPACE, "0")
+
+/* Gregorian Calendar */
\ No newline at end of file
diff --git a/ole/nls/esa.nls b/ole/nls/esa.nls
new file mode 100644
index 0000000..99c5602
--- /dev/null
+++ b/ole/nls/esa.nls
@@ -0,0 +1,111 @@
+/*
+ *	OLE2NLS library
+ *      Spanish (Panama)
+ */
+
+/* LOCVAL(LOCALE_ILANGUAGE,"") */
+/* LOCVAL(LOCALE_SLANGUAGE,"") */
+LOCVAL(LOCALE_SENGLANGUAGE,"Spanish")
+LOCVAL(LOCALE_SABBREVLANGNAME,"esa")
+LOCVAL(LOCALE_SNATIVELANGNAME,"Panama")
+/* LOCVAL(LOCALE_ICOUNTRY,"") */
+/* LOCVAL(LOCALE_SCOUNTRY,"") */
+LOCVAL(LOCALE_SENGCOUNTRY,"Panama")
+LOCVAL(LOCALE_SABBREVCTRYNAME,"PAN")
+LOCVAL(LOCALE_SNATIVECTRYNAME,"Panama")
+/* 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,"B")
+LOCVAL(LOCALE_SINTLSYMBOL, "PAB")
+/* 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,"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,"enero")
+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, "") */
+
+/* calendario gregoriano */
diff --git a/ole/nls/esb.nls b/ole/nls/esb.nls
new file mode 100644
index 0000000..7fae583
--- /dev/null
+++ b/ole/nls/esb.nls
@@ -0,0 +1,111 @@
+/*
+ *	OLE2NLS library
+ *      Spanish (Bolivia)
+ */
+
+/* LOCVAL(LOCALE_ILANGUAGE,"") */
+/* LOCVAL(LOCALE_SLANGUAGE,"") */
+LOCVAL(LOCALE_SENGLANGUAGE,"Spanish")
+LOCVAL(LOCALE_SABBREVLANGNAME,"esb")
+LOCVAL(LOCALE_SNATIVELANGNAME,"Bolivia")
+/* LOCVAL(LOCALE_ICOUNTRY,"") */
+/* LOCVAL(LOCALE_SCOUNTRY,"") */
+LOCVAL(LOCALE_SENGCOUNTRY,"Bolivia")
+LOCVAL(LOCALE_SABBREVCTRYNAME,"BOL")
+LOCVAL(LOCALE_SNATIVECTRYNAME,"Bolivia")
+/* 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,"Bs")
+LOCVAL(LOCALE_SINTLSYMBOL, "BOB")
+/* 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,"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,"enero")
+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, "") */
+
+/* calendario gregoriano */
diff --git a/ole/nls/esc.nls b/ole/nls/esc.nls
new file mode 100644
index 0000000..5a9b67d
--- /dev/null
+++ b/ole/nls/esc.nls
@@ -0,0 +1,111 @@
+/*
+ *	OLE2NLS library
+ *      Spanish (Costa Rica)
+ */
+
+/* LOCVAL(LOCALE_ILANGUAGE,"") */
+/* LOCVAL(LOCALE_SLANGUAGE,"") */
+LOCVAL(LOCALE_SENGLANGUAGE,"Spanish")
+LOCVAL(LOCALE_SABBREVLANGNAME,"esa")
+LOCVAL(LOCALE_SNATIVELANGNAME,"Costa Rica")
+/* LOCVAL(LOCALE_ICOUNTRY,"") */
+/* LOCVAL(LOCALE_SCOUNTRY,"") */
+LOCVAL(LOCALE_SENGCOUNTRY,"Costa Rica")
+LOCVAL(LOCALE_SABBREVCTRYNAME,"CRI")
+LOCVAL(LOCALE_SNATIVECTRYNAME,"Costa Rica")
+/* 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,"C")
+LOCVAL(LOCALE_SINTLSYMBOL, "CRC")
+/* 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, "AM")
+LOCVAL(LOCALE_S2359, "PM")
+/* 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,"enero")
+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, "") */
+
+/* calendario gregoriano */
diff --git a/ole/nls/esd.nls b/ole/nls/esd.nls
new file mode 100644
index 0000000..a1ee8c7
--- /dev/null
+++ b/ole/nls/esd.nls
@@ -0,0 +1,111 @@
+/*
+ *	OLE2NLS library
+ *      Spanish (Dominican Republic)
+ */
+
+/* LOCVAL(LOCALE_ILANGUAGE,"") */
+/* LOCVAL(LOCALE_SLANGUAGE,"") */
+LOCVAL(LOCALE_SENGLANGUAGE,"Spanish")
+LOCVAL(LOCALE_SABBREVLANGNAME,"esd")
+LOCVAL(LOCALE_SNATIVELANGNAME,"Rep?blica Dominicana")
+/* LOCVAL(LOCALE_ICOUNTRY,"") */
+/* LOCVAL(LOCALE_SCOUNTRY,"") */
+LOCVAL(LOCALE_SENGCOUNTRY,"Dominican Republic")
+LOCVAL(LOCALE_SABBREVCTRYNAME,"DMA")
+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,"RD$")
+LOCVAL(LOCALE_SINTLSYMBOL, "DOP")
+/* 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,"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,"enero")
+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, "") */
+
+/* calendario gregoriano */
diff --git a/ole/nls/ese.nls b/ole/nls/ese.nls
new file mode 100644
index 0000000..9a410ac
--- /dev/null
+++ b/ole/nls/ese.nls
@@ -0,0 +1,111 @@
+/*
+ *	OLE2NLS library
+ *      Spanish (El Salvador)
+ */
+
+/* LOCVAL(LOCALE_ILANGUAGE,"") */
+/* LOCVAL(LOCALE_SLANGUAGE,"") */
+LOCVAL(LOCALE_SENGLANGUAGE,"Spanish")
+LOCVAL(LOCALE_SABBREVLANGNAME,"ese")
+LOCVAL(LOCALE_SNATIVELANGNAME,"Espa€ol")
+/* LOCVAL(LOCALE_ICOUNTRY,"") */
+/* LOCVAL(LOCALE_SCOUNTRY,"") */
+LOCVAL(LOCALE_SENGCOUNTRY,"El Salvador")
+LOCVAL(LOCALE_SABBREVCTRYNAME,"SVD")
+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,"C")
+LOCVAL(LOCALE_SINTLSYMBOL, "SVC")
+/* 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,"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,"enero")
+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, "") */
+
+/* calendario gregoriano */
diff --git a/ole/nls/esf.nls b/ole/nls/esf.nls
new file mode 100644
index 0000000..ee3fbeb
--- /dev/null
+++ b/ole/nls/esf.nls
@@ -0,0 +1,111 @@
+/*
+ *	OLE2NLS library
+ *      Spanish (Ecuador)
+ */
+
+/* LOCVAL(LOCALE_ILANGUAGE,"") */
+/* LOCVAL(LOCALE_SLANGUAGE,"") */
+LOCVAL(LOCALE_SENGLANGUAGE,"Spanish")
+LOCVAL(LOCALE_SABBREVLANGNAME,"esf")
+LOCVAL(LOCALE_SNATIVELANGNAME,"Espa€ol")
+/* LOCVAL(LOCALE_ICOUNTRY,"") */
+LOCVAL(LOCALE_SCOUNTRY,"Ecuador")
+LOCVAL(LOCALE_SENGCOUNTRY,"Ecuador")
+LOCVAL(LOCALE_SABBREVCTRYNAME,"ECU")
+LOCVAL(LOCALE_SNATIVECTRYNAME,"Ecuador")
+/* 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,"S")
+LOCVAL(LOCALE_SINTLSYMBOL, "ECS")
+/* 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,"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, "") */
+
+/* calendario gregoriano */
diff --git a/ole/nls/esg.nls b/ole/nls/esg.nls
new file mode 100644
index 0000000..cee3e23
--- /dev/null
+++ b/ole/nls/esg.nls
@@ -0,0 +1,111 @@
+/*
+ *	OLE2NLS library
+ *      Spanish (Guatemala)
+ */
+
+/* LOCVAL(LOCALE_ILANGUAGE,"") */
+/* LOCVAL(LOCALE_SLANGUAGE,"") */
+LOCVAL(LOCALE_SENGLANGUAGE,"Spanish")
+LOCVAL(LOCALE_SABBREVLANGNAME,"esg")
+LOCVAL(LOCALE_SNATIVELANGNAME,"Espa€ol")
+/* LOCVAL(LOCALE_ICOUNTRY,"") */
+LOCVAL(LOCALE_SCOUNTRY,"Guatemala")
+LOCVAL(LOCALE_SENGCOUNTRY,"Guatemala")
+LOCVAL(LOCALE_SABBREVCTRYNAME,"GTM")
+LOCVAL(LOCALE_SNATIVECTRYNAME,"Guatemala")
+/* 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,"Q")
+LOCVAL(LOCALE_SINTLSYMBOL, "GTQ")
+/* 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,"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, "") */
+
+/* calendario gregoriano */
diff --git a/ole/nls/esh.nls b/ole/nls/esh.nls
index 9a8a9f1..bd2e743 100644
--- a/ole/nls/esh.nls
+++ b/ole/nls/esh.nls
@@ -4,17 +4,18 @@
  */
 
 /* LOCVAL(LOCALE_ILANGUAGE,"") */
-/* LOCVAL(LOCALE_SLANGUAGE,"") */
-LOCVAL(LOCALE_SENGLANGUAGE,"Spanish")
+LOCVAL(LOCALE_SLANGUAGE,"Español (Honduras)")
+LOCVAL(LOCALE_SENGLANGUAGE,"Spanish (Honduras)")
 LOCVAL(LOCALE_SABBREVLANGNAME,"esh")
-/* LOCVAL(LOCALE_SNATIVELANGNAME,"") */
+LOCVAL(LOCALE_SNATIVELANGNAME,"Español (Honduras)")
 /* LOCVAL(LOCALE_ICOUNTRY,"") */
-/* LOCVAL(LOCALE_SCOUNTRY,"") */
-LOCVAL(LOCALE_SENGCOUNTRY,"Spain")
-/* LOCVAL(LOCALE_SABBREVCTRYNAME,"") */
-/* LOCVAL(LOCALE_SNATIVECTRYNAME,"Espa€a") */
+LOCVAL(LOCALE_SCOUNTRY,"Honduras")
+LOCVAL(LOCALE_SENGCOUNTRY,"Honduras")
+LOCVAL(LOCALE_SABBREVCTRYNAME,"HND")
+LOCVAL(LOCALE_SNATIVECTRYNAME,"Honduras")
 /* LOCVAL(LOCALE_IDEFAULTLANGUAGE,"") */
 /* LOCVAL(LOCALE_IDEFAULTCOUNTRY,"") */
+LOCVAL(LOCALE_IDEFAULTCODEPAGE,"850")
 /* LOCVAL(LOCALE_IDEFAULTCODEPAGE) */
 /* LOCVAL(LOCALE_IDEFAULTANSICODEPAGE) */
 /* LOCVAL(LOCALE_SLIST,"") */
@@ -26,8 +27,8 @@
 /* LOCVAL(LOCALE_ILZERO,"1") */
 /* LOCVAL(LOCALE_INEGNUMBER) */
 LOCVAL(LOCALE_SNATIVEDIGITS, "0123456789")
-LOCVAL(LOCALE_SCURRENCY,"Pts")
-LOCVAL(LOCALE_SINTLSYMBOL, "ESP")
+LOCVAL(LOCALE_SCURRENCY,"L")
+LOCVAL(LOCALE_SINTLSYMBOL, "HNL")
 /* LOCVAL(LOCALE_SMONDECIMALSEP,",") */
 /* LOCVAL(LOCALE_SMONTHOUSANDSEP,".") */
 /* LOCVAL(LOCALE_SMONGROUPING) */
@@ -57,21 +58,21 @@
 
 LOCVAL(LOCALE_SDAYNAME1,"lunes")
 LOCVAL(LOCALE_SDAYNAME2,"martes")
-LOCVAL(LOCALE_SDAYNAME3,"mi?rcoles")
+LOCVAL(LOCALE_SDAYNAME3,"miércoles")
 LOCVAL(LOCALE_SDAYNAME4,"jueves")
 LOCVAL(LOCALE_SDAYNAME5,"viernes")
-LOCVAL(LOCALE_SDAYNAME6,"s?abado")
+LOCVAL(LOCALE_SDAYNAME6,"sábado")
 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_SABBREVDAYNAME1,"lun")
+LOCVAL(LOCALE_SABBREVDAYNAME2,"mar")
+LOCVAL(LOCALE_SABBREVDAYNAME3,"mié")
+LOCVAL(LOCALE_SABBREVDAYNAME4,"jue")
+LOCVAL(LOCALE_SABBREVDAYNAME5,"vie")
+LOCVAL(LOCALE_SABBREVDAYNAME6,"sáb")
+LOCVAL(LOCALE_SABBREVDAYNAME7,"dom")
 
-/* LOCVAL(LOCALE_SMONTHNAME1,"") */
+LOCVAL(LOCALE_SMONTHNAME1,"enero")
 LOCVAL(LOCALE_SMONTHNAME2,"febrero")
 LOCVAL(LOCALE_SMONTHNAME3,"marzo")
 LOCVAL(LOCALE_SMONTHNAME4,"abril")
@@ -99,8 +100,8 @@
 LOCVAL(LOCALE_SABBREVMONTHNAME12,"dic")
 LOCVAL(LOCALE_SABBREVMONTHNAME13,"")
 
-/* LOCVAL(LOCALE_SPOSITIVESIGN, "") */
-/* LOCVAL(LOCALE_SNEGATIVESIGN, "") */
+LOCVAL(LOCALE_SPOSITIVESIGN, "")
+LOCVAL(LOCALE_SNEGATIVESIGN, "-")
 /* LOCVAL(LOCALE_IPOSSIGNPOSN, "") */
 /* LOCVAL(LOCALE_INEGSIGNPOSN, "") */
 /* LOCVAL(LOCALE_IPOSSYMPRECEDES, "") */
@@ -108,3 +109,4 @@
 /* LOCVAL(LOCALE_INEGSYMPRECEDES, "") */
 /* LOCVAL(LOCALE_INEGSEPBYSPACE, "") */
 
+/* calendario gregoriano */
diff --git a/ole/nls/esi.nls b/ole/nls/esi.nls
index 2c5f881..57b0538 100644
--- a/ole/nls/esi.nls
+++ b/ole/nls/esi.nls
@@ -4,18 +4,18 @@
  */
 
 /* LOCVAL(LOCALE_ILANGUAGE,"") */
-/* LOCVAL(LOCALE_SLANGUAGE,"") */
-LOCVAL(LOCALE_SENGLANGUAGE,"Spanish")
+LOCVAL(LOCALE_SLANGUAGE,"Español (Nicaragua)")
+LOCVAL(LOCALE_SENGLANGUAGE,"Spanish (Nicaragua)")
 LOCVAL(LOCALE_SABBREVLANGNAME,"esi")
-/* LOCVAL(LOCALE_SNATIVELANGNAME,"") */
+LOCVAL(LOCALE_SNATIVELANGNAME,"Español (Nicaragua)")
 /* LOCVAL(LOCALE_ICOUNTRY,"") */
-/* LOCVAL(LOCALE_SCOUNTRY,"") */
-LOCVAL(LOCALE_SENGCOUNTRY,"Spain")
-/* LOCVAL(LOCALE_SABBREVCTRYNAME,"") */
-/* LOCVAL(LOCALE_SNATIVECTRYNAME,"Espa€a") */
+LOCVAL(LOCALE_SCOUNTRY,"Nicaragua")
+LOCVAL(LOCALE_SENGCOUNTRY,"Nicaragua")
+LOCVAL(LOCALE_SABBREVCTRYNAME,"NIC")
+LOCVAL(LOCALE_SNATIVECTRYNAME,"Nicaragua")
 /* LOCVAL(LOCALE_IDEFAULTLANGUAGE,"") */
 /* LOCVAL(LOCALE_IDEFAULTCOUNTRY,"") */
-/* LOCVAL(LOCALE_IDEFAULTCODEPAGE) */
+LOCVAL(LOCALE_IDEFAULTCODEPAGE,"850")
 /* LOCVAL(LOCALE_IDEFAULTANSICODEPAGE) */
 /* LOCVAL(LOCALE_SLIST,"") */
 /* LOCVAL(LOCALE_IMEASURE,"") */
@@ -26,8 +26,8 @@
 /* LOCVAL(LOCALE_ILZERO,"1") */
 /* LOCVAL(LOCALE_INEGNUMBER) */
 LOCVAL(LOCALE_SNATIVEDIGITS, "0123456789")
-LOCVAL(LOCALE_SCURRENCY,"Pts")
-LOCVAL(LOCALE_SINTLSYMBOL, "ESP")
+/* LOCVAL(LOCALE_SCURRENCY,"") */
+LOCVAL(LOCALE_SINTLSYMBOL, "NIO")
 /* LOCVAL(LOCALE_SMONDECIMALSEP,",") */
 /* LOCVAL(LOCALE_SMONTHOUSANDSEP,".") */
 /* LOCVAL(LOCALE_SMONGROUPING) */
@@ -57,21 +57,21 @@
 
 LOCVAL(LOCALE_SDAYNAME1,"lunes")
 LOCVAL(LOCALE_SDAYNAME2,"martes")
-LOCVAL(LOCALE_SDAYNAME3,"mi?rcoles")
+LOCVAL(LOCALE_SDAYNAME3,"miércoles")
 LOCVAL(LOCALE_SDAYNAME4,"jueves")
 LOCVAL(LOCALE_SDAYNAME5,"viernes")
-LOCVAL(LOCALE_SDAYNAME6,"s?abado")
+LOCVAL(LOCALE_SDAYNAME6,"sábado")
 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_SABBREVDAYNAME1,"lun")
+LOCVAL(LOCALE_SABBREVDAYNAME2,"mar")
+LOCVAL(LOCALE_SABBREVDAYNAME3,"mié")
+LOCVAL(LOCALE_SABBREVDAYNAME4,"jue")
+LOCVAL(LOCALE_SABBREVDAYNAME5,"vie")
+LOCVAL(LOCALE_SABBREVDAYNAME6,"sáb")
+LOCVAL(LOCALE_SABBREVDAYNAME7,"dom")
 
-/* LOCVAL(LOCALE_SMONTHNAME1,"") */
+LOCVAL(LOCALE_SMONTHNAME1,"enero")
 LOCVAL(LOCALE_SMONTHNAME2,"febrero")
 LOCVAL(LOCALE_SMONTHNAME3,"marzo")
 LOCVAL(LOCALE_SMONTHNAME4,"abril")
@@ -99,8 +99,8 @@
 LOCVAL(LOCALE_SABBREVMONTHNAME12,"dic")
 LOCVAL(LOCALE_SABBREVMONTHNAME13,"")
 
-/* LOCVAL(LOCALE_SPOSITIVESIGN, "") */
-/* LOCVAL(LOCALE_SNEGATIVESIGN, "") */
+LOCVAL(LOCALE_SPOSITIVESIGN, "")
+LOCVAL(LOCALE_SNEGATIVESIGN, "-")
 /* LOCVAL(LOCALE_IPOSSIGNPOSN, "") */
 /* LOCVAL(LOCALE_INEGSIGNPOSN, "") */
 /* LOCVAL(LOCALE_IPOSSYMPRECEDES, "") */
@@ -108,3 +108,5 @@
 /* LOCVAL(LOCALE_INEGSYMPRECEDES, "") */
 /* LOCVAL(LOCALE_INEGSEPBYSPACE, "") */
 
+/* calendario gregoriano */
+
diff --git a/ole/nls/esl.nls b/ole/nls/esl.nls
new file mode 100644
index 0000000..2f9339a
--- /dev/null
+++ b/ole/nls/esl.nls
@@ -0,0 +1,110 @@
+/*
+ *	OLE2NLS library
+ *      Spanish (Chile)
+ */
+
+/* LOCVAL(LOCALE_ILANGUAGE,"") */
+LOCVAL(LOCALE_SLANGUAGE,"Spanish (Chile)")
+LOCVAL(LOCALE_SENGLANGUAGE,"Spanish")
+LOCVAL(LOCALE_SABBREVLANGNAME,"esl")
+LOCVAL(LOCALE_SNATIVELANGNAME,"Espa€ol")
+/* LOCVAL(LOCALE_ICOUNTRY,"") */
+/* LOCVAL(LOCALE_SCOUNTRY,"") */
+LOCVAL(LOCALE_SENGCOUNTRY,"Chile")
+LOCVAL(LOCALE_SABBREVCTRYNAME,"CHL")
+/* LOCVAL(LOCALE_SNATIVECTRYNAME,"Chile") */
+/* 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,"Ch$")
+LOCVAL(LOCALE_SINTLSYMBOL, "CLP")
+/* 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
index 63023c6..6990594 100644
--- a/ole/nls/esm.nls
+++ b/ole/nls/esm.nls
@@ -1,21 +1,21 @@
 /*
  *	OLE2NLS library
- *      Mexiko
+ *      Mexico
  */
 
 /* LOCVAL(LOCALE_ILANGUAGE,"") */
-/* LOCVAL(LOCALE_SLANGUAGE,"") */
-LOCVAL(LOCALE_SENGLANGUAGE,"Spanish")
+LOCVAL(LOCALE_SLANGUAGE,"Español (Mexico)")
+LOCVAL(LOCALE_SENGLANGUAGE,"Spanish (Mexico)")
 LOCVAL(LOCALE_SABBREVLANGNAME,"esm")
-/* LOCVAL(LOCALE_SNATIVELANGNAME,"") */
+LOCVAL(LOCALE_SNATIVELANGNAME,"Español (Mexico)")
 /* LOCVAL(LOCALE_ICOUNTRY,"") */
-/* LOCVAL(LOCALE_SCOUNTRY,"") */
+LOCVAL(LOCALE_SCOUNTRY,"Mexico")
 LOCVAL(LOCALE_SENGCOUNTRY,"Mexico")
-/* LOCVAL(LOCALE_SABBREVCTRYNAME,"") */
-/* LOCVAL(LOCALE_SNATIVECTRYNAME,"Espa€a") */
+LOCVAL(LOCALE_SABBREVCTRYNAME,"Mx")
+LOCVAL(LOCALE_SNATIVECTRYNAME,"Mexico")
 /* LOCVAL(LOCALE_IDEFAULTLANGUAGE,"") */
 /* LOCVAL(LOCALE_IDEFAULTCOUNTRY,"") */
-/* LOCVAL(LOCALE_IDEFAULTCODEPAGE) */
+LOCVAL(LOCALE_IDEFAULTCODEPAGE,"850")
 /* LOCVAL(LOCALE_IDEFAULTANSICODEPAGE) */
 /* LOCVAL(LOCALE_SLIST,"") */
 /* LOCVAL(LOCALE_IMEASURE,"") */
@@ -30,7 +30,7 @@
 LOCVAL(LOCALE_SINTLSYMBOL, "MXN")
 /* LOCVAL(LOCALE_SMONDECIMALSEP,",") */
 /* LOCVAL(LOCALE_SMONTHOUSANDSEP,".") */
-/* LOCVAL(LOCALE_SMONGROUPING) */
+LOCVAL(LOCALE_SMONGROUPING, "3;0")
 /* LOCVAL(LOCALE_ICURRDIGITS,"2") */
 /* LOCVAL(LOCALE_IINTLCURRDIGITS) */
 /* LOCVAL(LOCALE_ICURRENCY,"3") */
@@ -57,50 +57,50 @@
 
 LOCVAL(LOCALE_SDAYNAME1,"lunes")
 LOCVAL(LOCALE_SDAYNAME2,"martes")
-LOCVAL(LOCALE_SDAYNAME3,"mi?rcoles")
+LOCVAL(LOCALE_SDAYNAME3,"miércoles")
 LOCVAL(LOCALE_SDAYNAME4,"jueves")
 LOCVAL(LOCALE_SDAYNAME5,"viernes")
-LOCVAL(LOCALE_SDAYNAME6,"s?abado")
+LOCVAL(LOCALE_SDAYNAME6,"sábado")
 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_SABBREVDAYNAME1,"lun")
+LOCVAL(LOCALE_SABBREVDAYNAME2,"mar")
+LOCVAL(LOCALE_SABBREVDAYNAME3,"mié")
+LOCVAL(LOCALE_SABBREVDAYNAME4,"jue")
+LOCVAL(LOCALE_SABBREVDAYNAME5,"vie")
+LOCVAL(LOCALE_SABBREVDAYNAME6,"sáb")
+LOCVAL(LOCALE_SABBREVDAYNAME7,"dom")
 
-/* 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_SMONTHNAME1,"Enero")
+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_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_SPOSITIVESIGN, "")
+LOCVAL(LOCALE_SNEGATIVESIGN, "-")
 /* LOCVAL(LOCALE_IPOSSIGNPOSN, "") */
 /* LOCVAL(LOCALE_INEGSIGNPOSN, "") */
 /* LOCVAL(LOCALE_IPOSSYMPRECEDES, "") */
@@ -108,3 +108,4 @@
 /* LOCVAL(LOCALE_INEGSYMPRECEDES, "") */
 /* LOCVAL(LOCALE_INEGSEPBYSPACE, "") */
 
+/* calendario gregoriano */
diff --git a/ole/nls/esn.nls b/ole/nls/esn.nls
index 6834c2a..680f048 100644
--- a/ole/nls/esn.nls
+++ b/ole/nls/esn.nls
@@ -1,21 +1,21 @@
 /*
  *	OLE2NLS library
- *      Spanish (Modern)
+ *      Spanish (Modern Sort)
  */
 
 /* LOCVAL(LOCALE_ILANGUAGE,"") */
-/* LOCVAL(LOCALE_SLANGUAGE,"") */
-LOCVAL(LOCALE_SENGLANGUAGE,"Spanish")
+LOCVAL(LOCALE_SLANGUAGE,"Español")
+LOCVAL(LOCALE_SENGLANGUAGE,"Spanish - Modern Sort")
 LOCVAL(LOCALE_SABBREVLANGNAME,"esn")
-/* LOCVAL(LOCALE_SNATIVELANGNAME,"") */
+LOCVAL(LOCALE_SNATIVELANGNAME,"Español (Moderno)")
 /* LOCVAL(LOCALE_ICOUNTRY,"") */
 /* LOCVAL(LOCALE_SCOUNTRY,"") */
 LOCVAL(LOCALE_SENGCOUNTRY,"Spain")
-/* LOCVAL(LOCALE_SABBREVCTRYNAME,"") */
-/* LOCVAL(LOCALE_SNATIVECTRYNAME,"Espa€a") */
+LOCVAL(LOCALE_SABBREVCTRYNAME,"Es")
+LOCVAL(LOCALE_SNATIVECTRYNAME,"España")
 /* LOCVAL(LOCALE_IDEFAULTLANGUAGE,"") */
 /* LOCVAL(LOCALE_IDEFAULTCOUNTRY,"") */
-/* LOCVAL(LOCALE_IDEFAULTCODEPAGE) */
+LOCVAL(LOCALE_IDEFAULTCODEPAGE,"850")
 /* LOCVAL(LOCALE_IDEFAULTANSICODEPAGE) */
 /* LOCVAL(LOCALE_SLIST,"") */
 /* LOCVAL(LOCALE_IMEASURE,"") */
@@ -30,7 +30,7 @@
 LOCVAL(LOCALE_SINTLSYMBOL, "ESP")
 /* LOCVAL(LOCALE_SMONDECIMALSEP,",") */
 /* LOCVAL(LOCALE_SMONTHOUSANDSEP,".") */
-/* LOCVAL(LOCALE_SMONGROUPING) */
+LOCVAL(LOCALE_SMONGROUPING, "3;0")
 /* LOCVAL(LOCALE_ICURRDIGITS,"2") */
 /* LOCVAL(LOCALE_IINTLCURRDIGITS) */
 /* LOCVAL(LOCALE_ICURRENCY,"3") */
@@ -57,21 +57,21 @@
 
 LOCVAL(LOCALE_SDAYNAME1,"lunes")
 LOCVAL(LOCALE_SDAYNAME2,"martes")
-LOCVAL(LOCALE_SDAYNAME3,"mi?rcoles")
+LOCVAL(LOCALE_SDAYNAME3,"miércoles")
 LOCVAL(LOCALE_SDAYNAME4,"jueves")
 LOCVAL(LOCALE_SDAYNAME5,"viernes")
-LOCVAL(LOCALE_SDAYNAME6,"s?abado")
+LOCVAL(LOCALE_SDAYNAME6,"sábado")
 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_SABBREVDAYNAME1,"lun")
+LOCVAL(LOCALE_SABBREVDAYNAME2,"mar")
+LOCVAL(LOCALE_SABBREVDAYNAME3,"mié")
+LOCVAL(LOCALE_SABBREVDAYNAME4,"jue")
+LOCVAL(LOCALE_SABBREVDAYNAME5,"vie")
+LOCVAL(LOCALE_SABBREVDAYNAME6,"sáb")
+LOCVAL(LOCALE_SABBREVDAYNAME7,"dom")
 
-/* LOCVAL(LOCALE_SMONTHNAME1,"") */
+LOCVAL(LOCALE_SMONTHNAME1,"enero")
 LOCVAL(LOCALE_SMONTHNAME2,"febrero")
 LOCVAL(LOCALE_SMONTHNAME3,"marzo")
 LOCVAL(LOCALE_SMONTHNAME4,"abril")
@@ -99,8 +99,8 @@
 LOCVAL(LOCALE_SABBREVMONTHNAME12,"dic")
 LOCVAL(LOCALE_SABBREVMONTHNAME13,"")
 
-/* LOCVAL(LOCALE_SPOSITIVESIGN, "") */
-/* LOCVAL(LOCALE_SNEGATIVESIGN, "") */
+LOCVAL(LOCALE_SPOSITIVESIGN, "")
+LOCVAL(LOCALE_SNEGATIVESIGN, "-")
 /* LOCVAL(LOCALE_IPOSSIGNPOSN, "") */
 /* LOCVAL(LOCALE_INEGSIGNPOSN, "") */
 /* LOCVAL(LOCALE_IPOSSYMPRECEDES, "") */
@@ -108,3 +108,4 @@
 /* LOCVAL(LOCALE_INEGSYMPRECEDES, "") */
 /* LOCVAL(LOCALE_INEGSEPBYSPACE, "") */
 
+/* calendario gregoriano */
diff --git a/ole/nls/eso.nls b/ole/nls/eso.nls
new file mode 100644
index 0000000..8780105
--- /dev/null
+++ b/ole/nls/eso.nls
@@ -0,0 +1,111 @@
+/*
+ *	OLE2NLS library
+ *      Spanish (Colombia)
+ */
+
+/* LOCVAL(LOCALE_ILANGUAGE,"") */
+/* LOCVAL(LOCALE_SLANGUAGE,"") */
+LOCVAL(LOCALE_SENGLANGUAGE,"Spanish")
+LOCVAL(LOCALE_SABBREVLANGNAME,"esg")
+LOCVAL(LOCALE_SNATIVELANGNAME,"Espa€ol")
+/* LOCVAL(LOCALE_ICOUNTRY,"") */
+LOCVAL(LOCALE_SCOUNTRY,"Colombia")
+LOCVAL(LOCALE_SENGCOUNTRY,"Colombia")
+LOCVAL(LOCALE_SABBREVCTRYNAME,"COL")
+LOCVAL(LOCALE_SNATIVECTRYNAME,"Colombia")
+/* 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,"C$")
+LOCVAL(LOCALE_SINTLSYMBOL, "COP")
+/* 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,"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, "") */
+
+/* calendario gregoriano */
diff --git a/ole/nls/esp.nls b/ole/nls/esp.nls
index 5191e89..dbbc0f3 100644
--- a/ole/nls/esp.nls
+++ b/ole/nls/esp.nls
@@ -4,18 +4,18 @@
  */
 
 /* LOCVAL(LOCALE_ILANGUAGE,"") */
-/* LOCVAL(LOCALE_SLANGUAGE,"") */
-LOCVAL(LOCALE_SENGLANGUAGE,"Spanish")
+LOCVAL(LOCALE_SLANGUAGE,"Español")
+LOCVAL(LOCALE_SENGLANGUAGE,"Spanish - Traditional Sort")
 LOCVAL(LOCALE_SABBREVLANGNAME,"esp")
-/* LOCVAL(LOCALE_SNATIVELANGNAME,"") */
+LOCVAL(LOCALE_SNATIVELANGNAME,"Español")
 /* LOCVAL(LOCALE_ICOUNTRY,"") */
-/* LOCVAL(LOCALE_SCOUNTRY,"") */
+LOCVAL(LOCALE_SCOUNTRY,"España")
 LOCVAL(LOCALE_SENGCOUNTRY,"Spain")
-/* LOCVAL(LOCALE_SABBREVCTRYNAME,"") */
-/* LOCVAL(LOCALE_SNATIVECTRYNAME,"Espa€a") */
+LOCVAL(LOCALE_SABBREVCTRYNAME,"Es")
+LOCVAL(LOCALE_SNATIVECTRYNAME,"España")
 /* LOCVAL(LOCALE_IDEFAULTLANGUAGE,"") */
 /* LOCVAL(LOCALE_IDEFAULTCOUNTRY,"") */
-/* LOCVAL(LOCALE_IDEFAULTCODEPAGE) */
+LOCVAL(LOCALE_IDEFAULTCODEPAGE,"850")
 /* LOCVAL(LOCALE_IDEFAULTANSICODEPAGE) */
 /* LOCVAL(LOCALE_SLIST,"") */
 /* LOCVAL(LOCALE_IMEASURE,"") */
@@ -30,7 +30,7 @@
 LOCVAL(LOCALE_SINTLSYMBOL, "ESP")
 /* LOCVAL(LOCALE_SMONDECIMALSEP,",") */
 /* LOCVAL(LOCALE_SMONTHOUSANDSEP,".") */
-/* LOCVAL(LOCALE_SMONGROUPING) */
+LOCVAL(LOCALE_SMONGROUPING, "3;0")
 /* LOCVAL(LOCALE_ICURRDIGITS,"2") */
 /* LOCVAL(LOCALE_IINTLCURRDIGITS) */
 /* LOCVAL(LOCALE_ICURRENCY,"3") */
@@ -57,21 +57,21 @@
 
 LOCVAL(LOCALE_SDAYNAME1,"lunes")
 LOCVAL(LOCALE_SDAYNAME2,"martes")
-LOCVAL(LOCALE_SDAYNAME3,"mi?rcoles")
+LOCVAL(LOCALE_SDAYNAME3,"miércoles")
 LOCVAL(LOCALE_SDAYNAME4,"jueves")
 LOCVAL(LOCALE_SDAYNAME5,"viernes")
-LOCVAL(LOCALE_SDAYNAME6,"s?abado")
+LOCVAL(LOCALE_SDAYNAME6,"sábado")
 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_SABBREVDAYNAME1,"lun")
+LOCVAL(LOCALE_SABBREVDAYNAME2,"mar")
+LOCVAL(LOCALE_SABBREVDAYNAME3,"mié")
+LOCVAL(LOCALE_SABBREVDAYNAME4,"jue")
+LOCVAL(LOCALE_SABBREVDAYNAME5,"vie")
+LOCVAL(LOCALE_SABBREVDAYNAME6,"sáb")
+LOCVAL(LOCALE_SABBREVDAYNAME7,"dom")
 
-/* LOCVAL(LOCALE_SMONTHNAME1,"") */
+LOCVAL(LOCALE_SMONTHNAME1,"enero")
 LOCVAL(LOCALE_SMONTHNAME2,"febrero")
 LOCVAL(LOCALE_SMONTHNAME3,"marzo")
 LOCVAL(LOCALE_SMONTHNAME4,"abril")
@@ -99,8 +99,8 @@
 LOCVAL(LOCALE_SABBREVMONTHNAME12,"dic")
 LOCVAL(LOCALE_SABBREVMONTHNAME13,"")
 
-/* LOCVAL(LOCALE_SPOSITIVESIGN, "") */
-/* LOCVAL(LOCALE_SNEGATIVESIGN, "") */
+LOCVAL(LOCALE_SPOSITIVESIGN, "")
+LOCVAL(LOCALE_SNEGATIVESIGN, "-")
 /* LOCVAL(LOCALE_IPOSSIGNPOSN, "") */
 /* LOCVAL(LOCALE_INEGSIGNPOSN, "") */
 /* LOCVAL(LOCALE_IPOSSYMPRECEDES, "") */
@@ -108,3 +108,4 @@
 /* LOCVAL(LOCALE_INEGSYMPRECEDES, "") */
 /* LOCVAL(LOCALE_INEGSEPBYSPACE, "") */
 
+/* calendario gregoriano */
diff --git a/ole/nls/esr.nls b/ole/nls/esr.nls
new file mode 100644
index 0000000..36027af
--- /dev/null
+++ b/ole/nls/esr.nls
@@ -0,0 +1,111 @@
+/*
+ *	OLE2NLS library
+ *      Spanish (Peru)
+ */
+
+/* LOCVAL(LOCALE_ILANGUAGE,"") */
+/* LOCVAL(LOCALE_SLANGUAGE,"") */
+LOCVAL(LOCALE_SENGLANGUAGE,"Spanish")
+LOCVAL(LOCALE_SABBREVLANGNAME,"esf")
+LOCVAL(LOCALE_SNATIVELANGNAME,"Espa€ol")
+/* LOCVAL(LOCALE_ICOUNTRY,"") */
+LOCVAL(LOCALE_SCOUNTRY,"Peru")
+LOCVAL(LOCALE_SENGCOUNTRY,"Peru")
+LOCVAL(LOCALE_SABBREVCTRYNAME,"PER")
+LOCVAL(LOCALE_SNATIVECTRYNAME,"Peru")
+/* 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,"S")
+LOCVAL(LOCALE_SINTLSYMBOL, "PES")
+/* 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,"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, "") */
+
+/* calendario gregoriano */
diff --git a/ole/nls/ess.nls b/ole/nls/ess.nls
new file mode 100644
index 0000000..6bea781
--- /dev/null
+++ b/ole/nls/ess.nls
@@ -0,0 +1,111 @@
+/*
+ *	OLE2NLS library
+ *      Spanish (Argentinia)
+ */
+
+/* LOCVAL(LOCALE_ILANGUAGE,"") */
+/* LOCVAL(LOCALE_SLANGUAGE,"") */
+LOCVAL(LOCALE_SENGLANGUAGE,"Spanish")
+LOCVAL(LOCALE_SABBREVLANGNAME,"esg")
+LOCVAL(LOCALE_SNATIVELANGNAME,"Espa€ol")
+/* LOCVAL(LOCALE_ICOUNTRY,"") */
+LOCVAL(LOCALE_SCOUNTRY,"Argentinia")
+LOCVAL(LOCALE_SENGCOUNTRY,"Argentinia")
+LOCVAL(LOCALE_SABBREVCTRYNAME,"ARG")
+LOCVAL(LOCALE_SNATIVECTRYNAME,"Argentinia")
+/* 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, "ARS")
+/* 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, "AM")
+LOCVAL(LOCALE_S2359, "PM")
+/* 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, "") */
+
+/* calendario gregoriano */
diff --git a/ole/nls/est.nls b/ole/nls/est.nls
index 3a453a2..7a29465 100644
--- a/ole/nls/est.nls
+++ b/ole/nls/est.nls
@@ -5,13 +5,13 @@
 
 /* LOCVAL(LOCALE_ILANGUAGE,"") */
 /* LOCVAL(LOCALE_SLANGUAGE,"") */
-/* LOCVAL(LOCALE_SENGLANGUAGE,"") */
+LOCVAL(LOCALE_SENGLANGUAGE,"Estonian")
 LOCVAL(LOCALE_SABBREVLANGNAME,"est")
 /* LOCVAL(LOCALE_SNATIVELANGNAME,"") */
 /* LOCVAL(LOCALE_ICOUNTRY,"") */
 /* LOCVAL(LOCALE_SCOUNTRY,"") */
-/* LOCVAL(LOCALE_SENGCOUNTRY,"") */
-/* LOCVAL(LOCALE_SABBREVCTRYNAME,"") */
+LOCVAL(LOCALE_SENGCOUNTRY,"Estonia")
+LOCVAL(LOCALE_SABBREVCTRYNAME,"Ee")
 /* LOCVAL(LOCALE_SNATIVECTRYNAME,"") */
 /* LOCVAL(LOCALE_IDEFAULTLANGUAGE,"") */
 /* LOCVAL(LOCALE_IDEFAULTCOUNTRY,"") */
@@ -27,7 +27,7 @@
 /* LOCVAL(LOCALE_INEGNUMBER) */
 /* LOCVAL(LOCALE_SNATIVEDIGITS) */
 /* LOCVAL(LOCALE_SCURRENCY,"") */
-/* LOCVAL(LOCALE_SINTLSYMBOL) */
+LOCVAL(LOCALE_SINTLSYMBOL,"EEK")
 /* LOCVAL(LOCALE_SMONDECIMALSEP,",") */
 /* LOCVAL(LOCALE_SMONTHOUSANDSEP,".") */
 /* LOCVAL(LOCALE_SMONGROUPING) */
@@ -55,52 +55,52 @@
 /* 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_SDAYNAME1,"esmaspäev")
+LOCVAL(LOCALE_SDAYNAME2,"teisipäev")
+LOCVAL(LOCALE_SDAYNAME3,"kolmapäev")
+LOCVAL(LOCALE_SDAYNAME4,"meljapäev")
+LOCVAL(LOCALE_SDAYNAME5,"reede")
+LOCVAL(LOCALE_SDAYNAME6,"laupäev")
+LOCVAL(LOCALE_SDAYNAME7,"pühapäev")
 
-/* 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_SABBREVDAYNAME1,"E")
+LOCVAL(LOCALE_SABBREVDAYNAME2,"T")
+LOCVAL(LOCALE_SABBREVDAYNAME3,"K")
+LOCVAL(LOCALE_SABBREVDAYNAME4,"N")
+LOCVAL(LOCALE_SABBREVDAYNAME5,"R")
+LOCVAL(LOCALE_SABBREVDAYNAME6,"L")
+LOCVAL(LOCALE_SABBREVDAYNAME7,"P")
 
-/* 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_SMONTHNAME1,"jaanuar")
+LOCVAL(LOCALE_SMONTHNAME2,"veebruar")
+LOCVAL(LOCALE_SMONTHNAME3,"märts")
+LOCVAL(LOCALE_SMONTHNAME4,"aprill")
+LOCVAL(LOCALE_SMONTHNAME5,"mai")
+LOCVAL(LOCALE_SMONTHNAME6,"juuni")
+LOCVAL(LOCALE_SMONTHNAME7,"juuli")
+LOCVAL(LOCALE_SMONTHNAME8,"august")
+LOCVAL(LOCALE_SMONTHNAME9,"september")
+LOCVAL(LOCALE_SMONTHNAME10,"oktoober")
+LOCVAL(LOCALE_SMONTHNAME11,"november")
+LOCVAL(LOCALE_SMONTHNAME12,"detsember")
 /* 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_SABBREVMONTHNAME1,"jaan ")
+LOCVAL(LOCALE_SABBREVMONTHNAME2,"veebr")
+LOCVAL(LOCALE_SABBREVMONTHNAME3,"märts")
+LOCVAL(LOCALE_SABBREVMONTHNAME4,"apr  ")
+LOCVAL(LOCALE_SABBREVMONTHNAME5,"mai  ")
+LOCVAL(LOCALE_SABBREVMONTHNAME6,"juuni")
+LOCVAL(LOCALE_SABBREVMONTHNAME7,"juuli")
+LOCVAL(LOCALE_SABBREVMONTHNAME8,"aug  ")
+LOCVAL(LOCALE_SABBREVMONTHNAME9,"sept ")
+LOCVAL(LOCALE_SABBREVMONTHNAME10,"okt  ")
+LOCVAL(LOCALE_SABBREVMONTHNAME11,"nov  ")
+LOCVAL(LOCALE_SABBREVMONTHNAME12,"dets ")
 /* LOCVAL(LOCALE_SABBREVMONTHNAME13,"") */
 
-/* LOCVAL(LOCALE_SPOSITIVESIGN, "") */
-/* LOCVAL(LOCALE_SNEGATIVESIGN, "") */
+LOCVAL(LOCALE_SPOSITIVESIGN, "")
+LOCVAL(LOCALE_SNEGATIVESIGN, "-")
 /* LOCVAL(LOCALE_IPOSSIGNPOSN, "") */
 /* LOCVAL(LOCALE_INEGSIGNPOSN, "") */
 /* LOCVAL(LOCALE_IPOSSYMPRECEDES, "") */
diff --git a/ole/nls/esu.nls b/ole/nls/esu.nls
index 749690b..50e9dff 100644
--- a/ole/nls/esu.nls
+++ b/ole/nls/esu.nls
@@ -4,18 +4,18 @@
  */
 
 /* LOCVAL(LOCALE_ILANGUAGE,"") */
-/* LOCVAL(LOCALE_SLANGUAGE,"") */
-LOCVAL(LOCALE_SENGLANGUAGE,"Spanish")
+LOCVAL(LOCALE_SLANGUAGE,"Español (Puerto Rico)")
+LOCVAL(LOCALE_SENGLANGUAGE,"Spanish (Puerto Rico)")
 LOCVAL(LOCALE_SABBREVLANGNAME,"esu")
-/* LOCVAL(LOCALE_SNATIVELANGNAME,"") */
+LOCVAL(LOCALE_SNATIVELANGNAME,"Español (Puerto Rico)")
 /* LOCVAL(LOCALE_ICOUNTRY,"") */
-/* LOCVAL(LOCALE_SCOUNTRY,"") */
-LOCVAL(LOCALE_SENGCOUNTRY,"Spain")
+LOCVAL(LOCALE_SCOUNTRY,"Puerto Rico")
+LOCVAL(LOCALE_SENGCOUNTRY,"Puerto Rico")
 /* LOCVAL(LOCALE_SABBREVCTRYNAME,"") */
-/* LOCVAL(LOCALE_SNATIVECTRYNAME,"Espa€a") */
+LOCVAL(LOCALE_SNATIVECTRYNAME,"Puerto Rico")
 /* LOCVAL(LOCALE_IDEFAULTLANGUAGE,"") */
 /* LOCVAL(LOCALE_IDEFAULTCOUNTRY,"") */
-/* LOCVAL(LOCALE_IDEFAULTCODEPAGE) */
+LOCVAL(LOCALE_IDEFAULTCODEPAGE,"850")
 /* LOCVAL(LOCALE_IDEFAULTANSICODEPAGE) */
 /* LOCVAL(LOCALE_SLIST,"") */
 /* LOCVAL(LOCALE_IMEASURE,"") */
@@ -26,8 +26,8 @@
 /* LOCVAL(LOCALE_ILZERO,"1") */
 /* LOCVAL(LOCALE_INEGNUMBER) */
 LOCVAL(LOCALE_SNATIVEDIGITS, "0123456789")
-LOCVAL(LOCALE_SCURRENCY,"Pts")
-LOCVAL(LOCALE_SINTLSYMBOL, "ESP")
+LOCVAL(LOCALE_SCURRENCY,"$")
+/* LOCVAL(LOCALE_SINTLSYMBOL, "ESP") */
 /* LOCVAL(LOCALE_SMONDECIMALSEP,",") */
 /* LOCVAL(LOCALE_SMONTHOUSANDSEP,".") */
 /* LOCVAL(LOCALE_SMONGROUPING) */
@@ -57,21 +57,21 @@
 
 LOCVAL(LOCALE_SDAYNAME1,"lunes")
 LOCVAL(LOCALE_SDAYNAME2,"martes")
-LOCVAL(LOCALE_SDAYNAME3,"mi?rcoles")
+LOCVAL(LOCALE_SDAYNAME3,"miércoles")
 LOCVAL(LOCALE_SDAYNAME4,"jueves")
 LOCVAL(LOCALE_SDAYNAME5,"viernes")
-LOCVAL(LOCALE_SDAYNAME6,"s?abado")
+LOCVAL(LOCALE_SDAYNAME6,"sábado")
 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_SABBREVDAYNAME1,"lun")
+LOCVAL(LOCALE_SABBREVDAYNAME2,"mar")
+LOCVAL(LOCALE_SABBREVDAYNAME3,"mié")
+LOCVAL(LOCALE_SABBREVDAYNAME4,"jue")
+LOCVAL(LOCALE_SABBREVDAYNAME5,"vie")
+LOCVAL(LOCALE_SABBREVDAYNAME6,"sáb")
+LOCVAL(LOCALE_SABBREVDAYNAME7,"dom")
 
-/* LOCVAL(LOCALE_SMONTHNAME1,"") */
+LOCVAL(LOCALE_SMONTHNAME1,"enero")
 LOCVAL(LOCALE_SMONTHNAME2,"febrero")
 LOCVAL(LOCALE_SMONTHNAME3,"marzo")
 LOCVAL(LOCALE_SMONTHNAME4,"abril")
@@ -99,8 +99,8 @@
 LOCVAL(LOCALE_SABBREVMONTHNAME12,"dic")
 LOCVAL(LOCALE_SABBREVMONTHNAME13,"")
 
-/* LOCVAL(LOCALE_SPOSITIVESIGN, "") */
-/* LOCVAL(LOCALE_SNEGATIVESIGN, "") */
+LOCVAL(LOCALE_SPOSITIVESIGN, "")
+LOCVAL(LOCALE_SNEGATIVESIGN, "-")
 /* LOCVAL(LOCALE_IPOSSIGNPOSN, "") */
 /* LOCVAL(LOCALE_INEGSIGNPOSN, "") */
 /* LOCVAL(LOCALE_IPOSSYMPRECEDES, "") */
diff --git a/ole/nls/esv.nls b/ole/nls/esv.nls
new file mode 100644
index 0000000..dac639e
--- /dev/null
+++ b/ole/nls/esv.nls
@@ -0,0 +1,111 @@
+/*
+ *	OLE2NLS library
+ *      Spanish (Venezuela)
+ */
+
+/* LOCVAL(LOCALE_ILANGUAGE,"") */
+/* LOCVAL(LOCALE_SLANGUAGE,"") */
+LOCVAL(LOCALE_SENGLANGUAGE,"Spanish")
+LOCVAL(LOCALE_SABBREVLANGNAME,"esv")
+LOCVAL(LOCALE_SNATIVELANGNAME,"Espa€ol")
+/* LOCVAL(LOCALE_ICOUNTRY,"") */
+LOCVAL(LOCALE_SCOUNTRY,"Venezuela")
+LOCVAL(LOCALE_SENGCOUNTRY,"Venezuela")
+LOCVAL(LOCALE_SABBREVCTRYNAME,"VEN")
+LOCVAL(LOCALE_SNATIVECTRYNAME,"Venezuela")
+/* 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,"Bs")
+LOCVAL(LOCALE_SINTLSYMBOL, "VEB")
+/* 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,"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, "") */
+
+/* calendario gregoriano */
diff --git a/ole/nls/esy.nls b/ole/nls/esy.nls
new file mode 100644
index 0000000..2f8b9ac
--- /dev/null
+++ b/ole/nls/esy.nls
@@ -0,0 +1,111 @@
+/*
+ *	OLE2NLS library
+ *      Spanish (Uruguay)
+ */
+
+/* LOCVAL(LOCALE_ILANGUAGE,"") */
+LOCVAL(LOCALE_SLANGUAGE,"Espa€ol")
+LOCVAL(LOCALE_SENGLANGUAGE,"Spanish")
+LOCVAL(LOCALE_SABBREVLANGNAME,"esy")
+LOCVAL(LOCALE_SNATIVELANGNAME,"Uruguay")
+/* LOCVAL(LOCALE_ICOUNTRY,"") */
+/* LOCVAL(LOCALE_SCOUNTRY,"") */
+LOCVAL(LOCALE_SENGCOUNTRY,"Uruguay")
+LOCVAL(LOCALE_SABBREVCTRYNAME,"URY")
+LOCVAL(LOCALE_SNATIVECTRYNAME,"Uruguay")
+/* 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,"NU$")
+LOCVAL(LOCALE_SINTLSYMBOL, "UYU")
+/* 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,"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,"enero")
+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, "") */
+
+/* calendario gregoriano */
diff --git a/ole/nls/esz.nls b/ole/nls/esz.nls
new file mode 100644
index 0000000..01ad318
--- /dev/null
+++ b/ole/nls/esz.nls
@@ -0,0 +1,111 @@
+/*
+ *	OLE2NLS library
+ *      Spanish (Paraguay)
+ */
+
+/* LOCVAL(LOCALE_ILANGUAGE,"") */
+/* LOCVAL(LOCALE_SLANGUAGE,"") */
+LOCVAL(LOCALE_SENGLANGUAGE,"Spanish")
+LOCVAL(LOCALE_SABBREVLANGNAME,"esz")
+LOCVAL(LOCALE_SNATIVELANGNAME,"Paraguay")
+/* LOCVAL(LOCALE_ICOUNTRY,"") */
+/* LOCVAL(LOCALE_SCOUNTRY,"") */
+LOCVAL(LOCALE_SENGCOUNTRY,"Paraguay")
+LOCVAL(LOCALE_SABBREVCTRYNAME,"PRY")
+LOCVAL(LOCALE_SNATIVECTRYNAME,"Paraguay")
+/* 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,"G")
+LOCVAL(LOCALE_SINTLSYMBOL, "PYG")
+/* 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,"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,"enero")
+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, "") */
+
+/* calendario gregoriano */
diff --git a/ole/nls/euq.nls b/ole/nls/euq.nls
index 989c5e7..c6639fe 100644
--- a/ole/nls/euq.nls
+++ b/ole/nls/euq.nls
@@ -4,18 +4,18 @@
  */
 
 /* LOCVAL(LOCALE_ILANGUAGE,"") */
-/* LOCVAL(LOCALE_SLANGUAGE,"") */
-LOCVAL(LOCALE_SENGLANGUAGE,"Spanish")
+LOCVAL(LOCALE_SLANGUAGE,"Euskara")
+LOCVAL(LOCALE_SENGLANGUAGE,"Basque")
 LOCVAL(LOCALE_SABBREVLANGNAME,"euq")
-/* LOCVAL(LOCALE_SNATIVELANGNAME,"") */
+LOCVAL(LOCALE_SNATIVELANGNAME,"Euskara")
 /* LOCVAL(LOCALE_ICOUNTRY,"") */
-/* LOCVAL(LOCALE_SCOUNTRY,"") */
-LOCVAL(LOCALE_SENGCOUNTRY,"Spain")
-/* LOCVAL(LOCALE_SABBREVCTRYNAME,"") */
-/* LOCVAL(LOCALE_SNATIVECTRYNAME,"Espa€a") */
+LOCVAL(LOCALE_SCOUNTRY,"Espaina")
+LOCVAL(LOCALE_SENGCOUNTRY,"Spain (Basque)")
+LOCVAL(LOCALE_SABBREVCTRYNAME,"Es")
+LOCVAL(LOCALE_SNATIVECTRYNAME,"Espaina")
 /* LOCVAL(LOCALE_IDEFAULTLANGUAGE,"") */
 /* LOCVAL(LOCALE_IDEFAULTCOUNTRY,"") */
-/* LOCVAL(LOCALE_IDEFAULTCODEPAGE) */
+LOCVAL(LOCALE_IDEFAULTCODEPAGE,"850")
 /* LOCVAL(LOCALE_IDEFAULTANSICODEPAGE) */
 /* LOCVAL(LOCALE_SLIST,"") */
 /* LOCVAL(LOCALE_IMEASURE,"") */
@@ -37,8 +37,8 @@
 /* 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_SSHORTDATE,"yyyy-MM-dd")
+LOCVAL(LOCALE_SLONGDATE,"ddd, yyyyeko MMMMren d.a")
 /* LOCVAL(LOCALE_STIMEFORMAT) */
 /* LOCVAL(LOCALE_IDATE,"1") */
 /* LOCVAL(LOCALE_ILDATE) */
@@ -55,13 +55,13 @@
 /* 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_SDAYNAME1,"astelehena")
+LOCVAL(LOCALE_SDAYNAME2,"asteartea")
+LOCVAL(LOCALE_SDAYNAME3,"asteazkena")
+LOCVAL(LOCALE_SDAYNAME4,"osteguna")
+LOCVAL(LOCALE_SDAYNAME5,"ostirala")
+LOCVAL(LOCALE_SDAYNAME6,"larunbata")
+LOCVAL(LOCALE_SDAYNAME7,"igandea")
 
 /* LOCVAL(LOCALE_SABBREVDAYNAME1,"lun") */
 /* LOCVAL(LOCALE_SABBREVDAYNAME2,"mar") */
@@ -71,36 +71,36 @@
 /* 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_SMONTHNAME1,"urtarrila")
+LOCVAL(LOCALE_SMONTHNAME2,"otsaila")
+LOCVAL(LOCALE_SMONTHNAME3,"martxoa")
+LOCVAL(LOCALE_SMONTHNAME4,"apirila")
+LOCVAL(LOCALE_SMONTHNAME5,"maiatza")
+LOCVAL(LOCALE_SMONTHNAME6,"ekaina")
+LOCVAL(LOCALE_SMONTHNAME7,"uztaila")
+LOCVAL(LOCALE_SMONTHNAME8,"abuztua")
+LOCVAL(LOCALE_SMONTHNAME9,"iraila")
+LOCVAL(LOCALE_SMONTHNAME10,"urria")
+LOCVAL(LOCALE_SMONTHNAME11,"azaroa")
+LOCVAL(LOCALE_SMONTHNAME12,"abendua")
 LOCVAL(LOCALE_SMONTHNAME13,"")
 
-LOCVAL(LOCALE_SABBREVMONTHNAME1,"ene")
-LOCVAL(LOCALE_SABBREVMONTHNAME2,"feb")
+LOCVAL(LOCALE_SABBREVMONTHNAME1,"urt")
+LOCVAL(LOCALE_SABBREVMONTHNAME2,"ots")
 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_SABBREVMONTHNAME4,"api")
+LOCVAL(LOCALE_SABBREVMONTHNAME5,"mai")
+LOCVAL(LOCALE_SABBREVMONTHNAME6,"eka")
+LOCVAL(LOCALE_SABBREVMONTHNAME7,"uzt")
+LOCVAL(LOCALE_SABBREVMONTHNAME8,"abu")
+LOCVAL(LOCALE_SABBREVMONTHNAME9,"ira")
+LOCVAL(LOCALE_SABBREVMONTHNAME10,"urr")
+LOCVAL(LOCALE_SABBREVMONTHNAME11,"aza")
+LOCVAL(LOCALE_SABBREVMONTHNAME12,"abe")
 LOCVAL(LOCALE_SABBREVMONTHNAME13,"")
 
-/* LOCVAL(LOCALE_SPOSITIVESIGN, "") */
-/* LOCVAL(LOCALE_SNEGATIVESIGN, "") */
+LOCVAL(LOCALE_SPOSITIVESIGN, "")
+LOCVAL(LOCALE_SNEGATIVESIGN, "-")
 /* LOCVAL(LOCALE_IPOSSIGNPOSN, "") */
 /* LOCVAL(LOCALE_INEGSIGNPOSN, "") */
 /* LOCVAL(LOCALE_IPOSSYMPRECEDES, "") */
diff --git a/ole/nls/fin.nls b/ole/nls/fin.nls
index a06b5d3..6cd954c 100644
--- a/ole/nls/fin.nls
+++ b/ole/nls/fin.nls
@@ -30,7 +30,7 @@
 LOCVAL(LOCALE_SINTLSYMBOL,"FIM")
 /* LOCVAL(LOCALE_SMONDECIMALSEP) */
 /* LOCVAL(LOCALE_SMONTHOUSANDSEP) */
-/* LOCVAL(LOCALE_SMONGROUPING) /*
+LOCVAL(LOCALE_SMONGROUPING, "3;0")
 LOCVAL(LOCALE_ICURRDIGITS,"2")
 /* LOCVAL(LOCALE_IINTLCURRDIGITS) */
 LOCVAL(LOCALE_ICURRENCY,"3")
@@ -43,7 +43,7 @@
 LOCVAL(LOCALE_IDATE,"1")
 /* LOCVAL(LOCALE_ILDATE) */
 LOCVAL(LOCALE_ITIME,"1")
-/* LOCVAL(LOCALE_ITIMEMARKPOSN) /*
+/* LOCVAL(LOCALE_ITIMEMARKPOSN) */
 /* LOCVAL(LOCALE_ICENTURY) */
 LOCVAL(LOCALE_ITLZERO,"1")
 /* LOCVAL(LOCALE_IDAYLZERO) */
@@ -107,3 +107,5 @@
 /* LOCVAL(LOCALE_IPOSSEPBYSPACE) */
 /* LOCVAL(LOCALE_INEGSYMPRECEDES) */
 /* LOCVAL(LOCALE_INEGSEPBYSPACE) */
+
+/* gregoriaaninen kalenteri */
diff --git a/ole/nls/fos.nls b/ole/nls/fos.nls
new file mode 100644
index 0000000..5a4beaf
--- /dev/null
+++ b/ole/nls/fos.nls
@@ -0,0 +1,111 @@
+/*
+ *	OLE2NLS library
+ *      Faroe Islands
+ */
+
+LOCVAL(LOCALE_ILANGUAGE,"9")
+LOCVAL(LOCALE_SLANGUAGE,"")
+LOCVAL(LOCALE_SENGLANGUAGE,"Faroese")
+LOCVAL(LOCALE_SABBREVLANGNAME,"fos")
+LOCVAL(LOCALE_SNATIVELANGNAME,"f?royskt")
+/* LOCVAL(LOCALE_ICOUNTRY,"49") */
+LOCVAL(LOCALE_SCOUNTRY,"")
+LOCVAL(LOCALE_SENGCOUNTRY,"Faroe Islands")
+LOCVAL(LOCALE_SABBREVCTRYNAME,"FRS")
+LOCVAL(LOCALE_SNATIVECTRYNAME,"Froyar")
+/* 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, "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,"m€nadagur")
+LOCVAL(LOCALE_SDAYNAME2,"?osdagur")
+LOCVAL(LOCALE_SDAYNAME3,"mikudagur")
+LOCVAL(LOCALE_SDAYNAME4,"h?sdagur")
+LOCVAL(LOCALE_SDAYNAME5,"fr?ggjadagur")
+LOCVAL(LOCALE_SDAYNAME6,"leygardagur")
+LOCVAL(LOCALE_SDAYNAME7,"sunnudagur")
+
+LOCVAL(LOCALE_SABBREVDAYNAME1,"m?n")
+LOCVAL(LOCALE_SABBREVDAYNAME2,"t?s")
+LOCVAL(LOCALE_SABBREVDAYNAME3,"mik")
+LOCVAL(LOCALE_SABBREVDAYNAME4,"h?s")
+LOCVAL(LOCALE_SABBREVDAYNAME5,"fr?")
+LOCVAL(LOCALE_SABBREVDAYNAME6,"ley")
+LOCVAL(LOCALE_SABBREVDAYNAME7,"sun")
+
+LOCVAL(LOCALE_SMONTHNAME1,"januar")
+LOCVAL(LOCALE_SMONTHNAME2,"februar")
+LOCVAL(LOCALE_SMONTHNAME3,"mars")
+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,"desember")
+LOCVAL(LOCALE_SMONTHNAME13,"")
+
+LOCVAL(LOCALE_SABBREVMONTHNAME1,"jan")
+LOCVAL(LOCALE_SABBREVMONTHNAME2,"feb")
+LOCVAL(LOCALE_SABBREVMONTHNAME3,"mar")
+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,"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) */
+
+/* Den gregorianske kalender */
diff --git a/ole/nls/fra.nls b/ole/nls/fra.nls
index db9fee2..a6188d9 100644
--- a/ole/nls/fra.nls
+++ b/ole/nls/fra.nls
@@ -4,18 +4,18 @@
  */
 
 /* LOCVAL(LOCALE_ILANGUAGE,"") */
-/* LOCVAL(LOCALE_SLANGUAGE,"") */
-LOCVAL(LOCALE_SENGLANGUAGE,"France")
+LOCVAL(LOCALE_SLANGUAGE,"Français")
+LOCVAL(LOCALE_SENGLANGUAGE,"French")
 LOCVAL(LOCALE_SABBREVLANGNAME,"fra")
-/* LOCVAL(LOCALE_SNATIVELANGNAME,"") */
-/* LOCVAL(LOCALE_ICOUNTRY,"") */
-/* LOCVAL(LOCALE_SCOUNTRY,"") */
-/* LOCVAL(LOCALE_SENGCOUNTRY,"") */
-/* LOCVAL(LOCALE_SABBREVCTRYNAME,"") */
-/* LOCVAL(LOCALE_SNATIVECTRYNAME,"") */
+LOCVAL(LOCALE_SNATIVELANGNAME,"Français")
+LOCVAL(LOCALE_ICOUNTRY,"33")
+LOCVAL(LOCALE_SCOUNTRY,"France")
+LOCVAL(LOCALE_SENGCOUNTRY,"France")
+LOCVAL(LOCALE_SABBREVCTRYNAME,"Fr")
+LOCVAL(LOCALE_SNATIVECTRYNAME,"France")
 /* LOCVAL(LOCALE_IDEFAULTLANGUAGE,"") */
 /* LOCVAL(LOCALE_IDEFAULTCOUNTRY,"") */
-/* LOCVAL(LOCALE_IDEFAULTCODEPAGE) */
+LOCVAL(LOCALE_IDEFAULTCODEPAGE,"850")
 /* LOCVAL(LOCALE_IDEFAULTANSICODEPAGE) */
 /* LOCVAL(LOCALE_SLIST,"") */
 /* LOCVAL(LOCALE_IMEASURE,"") */
@@ -25,19 +25,19 @@
 /* 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_SNATIVEDIGITS, "0123456789")
+LOCVAL(LOCALE_SCURRENCY,"F")
+LOCVAL(LOCALE_SINTLSYMBOL, "FRF")
+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_SDATE,"/")
 /* LOCVAL(LOCALE_STIME,":") */
-/* LOCVAL(LOCALE_SSHORTDATE,"dd/MM-yyyy") */
+LOCVAL(LOCALE_SSHORTDATE,"dd/MM/yyyy")
 /* LOCVAL(LOCALE_SLONGDATE,"ddd, d. MMMM yyyy") */
 /* LOCVAL(LOCALE_STIMEFORMAT) */
 /* LOCVAL(LOCALE_IDATE,"1") */
@@ -48,59 +48,59 @@
 /* LOCVAL(LOCALE_ITLZERO,"1")
 /* LOCVAL(LOCALE_IDAYLZERO) */
 /* LOCVAL(LOCALE_IMONLZERO) */
-/* LOCVAL(LOCALE_S1159, "") */
-/* LOCVAL(LOCALE_S2359, "") */
+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_SDAYNAME1,"lundi")
+LOCVAL(LOCALE_SDAYNAME2,"mardi")
+LOCVAL(LOCALE_SDAYNAME3,"mercredi")
+LOCVAL(LOCALE_SDAYNAME4,"jeudi")
+LOCVAL(LOCALE_SDAYNAME5,"vendredi") 
+LOCVAL(LOCALE_SDAYNAME6,"samedi") 
+LOCVAL(LOCALE_SDAYNAME7,"dimanche")
 
-/* 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_SABBREVDAYNAME1,"lun") 
+LOCVAL(LOCALE_SABBREVDAYNAME2,"mar") 
+LOCVAL(LOCALE_SABBREVDAYNAME3,"mer") 
+LOCVAL(LOCALE_SABBREVDAYNAME4,"jeu") 
+LOCVAL(LOCALE_SABBREVDAYNAME5,"ven") 
+LOCVAL(LOCALE_SABBREVDAYNAME6,"sam") 
+LOCVAL(LOCALE_SABBREVDAYNAME7,"dim") 
 
-/* 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_SMONTHNAME1,"janvier")
+LOCVAL(LOCALE_SMONTHNAME2,"février")
+LOCVAL(LOCALE_SMONTHNAME3,"mars")
+LOCVAL(LOCALE_SMONTHNAME4,"avril")
+LOCVAL(LOCALE_SMONTHNAME5,"mai")
+LOCVAL(LOCALE_SMONTHNAME6,"juin")
+LOCVAL(LOCALE_SMONTHNAME7,"juillet")
+LOCVAL(LOCALE_SMONTHNAME8,"août")
+LOCVAL(LOCALE_SMONTHNAME9,"septembre")
+LOCVAL(LOCALE_SMONTHNAME10,"octobre")
+LOCVAL(LOCALE_SMONTHNAME11,"novembre")
+LOCVAL(LOCALE_SMONTHNAME12,"décembre")
 /* 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_SABBREVMONTHNAME1,"jan")
+LOCVAL(LOCALE_SABBREVMONTHNAME2,"fév")
+LOCVAL(LOCALE_SABBREVMONTHNAME3,"mar")
+LOCVAL(LOCALE_SABBREVMONTHNAME4,"avr")
+LOCVAL(LOCALE_SABBREVMONTHNAME5,"mai")
+LOCVAL(LOCALE_SABBREVMONTHNAME6,"jun")
+LOCVAL(LOCALE_SABBREVMONTHNAME7,"jul")
+LOCVAL(LOCALE_SABBREVMONTHNAME8,"aoû")
+LOCVAL(LOCALE_SABBREVMONTHNAME9,"sep")
+LOCVAL(LOCALE_SABBREVMONTHNAME10,"oct")
+LOCVAL(LOCALE_SABBREVMONTHNAME11,"nov")
+LOCVAL(LOCALE_SABBREVMONTHNAME12,"déc")
 /* LOCVAL(LOCALE_SABBREVMONTHNAME13,"") */
 
-/* LOCVAL(LOCALE_SPOSITIVESIGN, "") */
-/* LOCVAL(LOCALE_SNEGATIVESIGN, "") */
+LOCVAL(LOCALE_SPOSITIVESIGN, "")
+LOCVAL(LOCALE_SNEGATIVESIGN, "-")
 /* LOCVAL(LOCALE_IPOSSIGNPOSN, "") */
 /* LOCVAL(LOCALE_INEGSIGNPOSN, "") */
 /* LOCVAL(LOCALE_IPOSSYMPRECEDES, "") */
@@ -108,3 +108,4 @@
 /* LOCVAL(LOCALE_INEGSYMPRECEDES, "") */
 /* LOCVAL(LOCALE_INEGSEPBYSPACE, "") */
 
+/* calendrier gr€gorien */
diff --git a/ole/nls/frb.nls b/ole/nls/frb.nls
index af67745..be64b1b 100644
--- a/ole/nls/frb.nls
+++ b/ole/nls/frb.nls
@@ -4,18 +4,18 @@
  */
 
 /* LOCVAL(LOCALE_ILANGUAGE,"") */
-/* LOCVAL(LOCALE_SLANGUAGE,"") */
-LOCVAL(LOCALE_SENGLANGUAGE,"Belgium")
+LOCVAL(LOCALE_SLANGUAGE,"Français (Belgique)")
+LOCVAL(LOCALE_SENGLANGUAGE,"French (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_SNATIVELANGNAME,"Français (Belgique)")
+LOCVAL(LOCALE_ICOUNTRY,"32")
+LOCVAL(LOCALE_SCOUNTRY,"Belgique")
+LOCVAL(LOCALE_SENGCOUNTRY,"Belgium")
+LOCVAL(LOCALE_SABBREVCTRYNAME,"Be")
+LOCVAL(LOCALE_SNATIVECTRYNAME,"Belgique")
 /* LOCVAL(LOCALE_IDEFAULTLANGUAGE,"") */
 /* LOCVAL(LOCALE_IDEFAULTCOUNTRY,"") */
-/* LOCVAL(LOCALE_IDEFAULTCODEPAGE) */
+LOCVAL(LOCALE_IDEFAULTCODEPAGE,"850")
 /* LOCVAL(LOCALE_IDEFAULTANSICODEPAGE) */
 /* LOCVAL(LOCALE_SLIST,"") */
 /* LOCVAL(LOCALE_IMEASURE,"") */
@@ -25,19 +25,19 @@
 /* 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_SNATIVEDIGITS, "0123456789")
+LOCVAL(LOCALE_SCURRENCY,"FB")
+LOCVAL(LOCALE_SINTLSYMBOL, "BEF")
+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_SDATE,"/")
+LOCVAL(LOCALE_STIME,":")
+LOCVAL(LOCALE_SSHORTDATE,"dd/MM/yyyy")
 /* LOCVAL(LOCALE_SLONGDATE,"ddd, d. MMMM yyyy") */
 /* LOCVAL(LOCALE_STIMEFORMAT) */
 /* LOCVAL(LOCALE_IDATE,"1") */
@@ -48,59 +48,59 @@
 /* LOCVAL(LOCALE_ITLZERO,"1")
 /* LOCVAL(LOCALE_IDAYLZERO) */
 /* LOCVAL(LOCALE_IMONLZERO) */
-/* LOCVAL(LOCALE_S1159, "") */
-/* LOCVAL(LOCALE_S2359, "") */
+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_SDAYNAME1,"lundi")
+LOCVAL(LOCALE_SDAYNAME2,"mardi")
+LOCVAL(LOCALE_SDAYNAME3,"mercredi")
+LOCVAL(LOCALE_SDAYNAME4,"jeudi")
+LOCVAL(LOCALE_SDAYNAME5,"vendredi")
+LOCVAL(LOCALE_SDAYNAME6,"samedi")
+LOCVAL(LOCALE_SDAYNAME7,"dimanche")
 
-/* 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_SABBREVDAYNAME1,"lun")
+LOCVAL(LOCALE_SABBREVDAYNAME2,"mar")
+LOCVAL(LOCALE_SABBREVDAYNAME3,"mer")
+LOCVAL(LOCALE_SABBREVDAYNAME4,"jeu")
+LOCVAL(LOCALE_SABBREVDAYNAME5,"ven")
+LOCVAL(LOCALE_SABBREVDAYNAME6,"sam")
+LOCVAL(LOCALE_SABBREVDAYNAME7,"dim")
 
-/* 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_SMONTHNAME1,"janvier")
+LOCVAL(LOCALE_SMONTHNAME2,"février")
+LOCVAL(LOCALE_SMONTHNAME3,"mars")
+LOCVAL(LOCALE_SMONTHNAME4,"avril")
+LOCVAL(LOCALE_SMONTHNAME5,"mai")
+LOCVAL(LOCALE_SMONTHNAME6,"juin")
+LOCVAL(LOCALE_SMONTHNAME7,"juillet")
+LOCVAL(LOCALE_SMONTHNAME8,"août")
+LOCVAL(LOCALE_SMONTHNAME9,"septembre")
+LOCVAL(LOCALE_SMONTHNAME10,"octobre")
+LOCVAL(LOCALE_SMONTHNAME11,"novembre")
+LOCVAL(LOCALE_SMONTHNAME12,"décembre")
 /* 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_SABBREVMONTHNAME1,"jan")
+LOCVAL(LOCALE_SABBREVMONTHNAME2,"fév")
+LOCVAL(LOCALE_SABBREVMONTHNAME3,"mar")
+LOCVAL(LOCALE_SABBREVMONTHNAME4,"avr")
+LOCVAL(LOCALE_SABBREVMONTHNAME5,"mai")
+LOCVAL(LOCALE_SABBREVMONTHNAME6,"jun")
+LOCVAL(LOCALE_SABBREVMONTHNAME7,"jul")
+LOCVAL(LOCALE_SABBREVMONTHNAME8,"aoû")
+LOCVAL(LOCALE_SABBREVMONTHNAME9,"sep")
+LOCVAL(LOCALE_SABBREVMONTHNAME10,"oct")
+LOCVAL(LOCALE_SABBREVMONTHNAME11,"nov")
+LOCVAL(LOCALE_SABBREVMONTHNAME12,"déc")
 /* LOCVAL(LOCALE_SABBREVMONTHNAME13,"") */
 
-/* LOCVAL(LOCALE_SPOSITIVESIGN, "") */
-/* LOCVAL(LOCALE_SNEGATIVESIGN, "") */
+LOCVAL(LOCALE_SPOSITIVESIGN, "")
+LOCVAL(LOCALE_SNEGATIVESIGN, "-")
 /* LOCVAL(LOCALE_IPOSSIGNPOSN, "") */
 /* LOCVAL(LOCALE_INEGSIGNPOSN, "") */
 /* LOCVAL(LOCALE_IPOSSYMPRECEDES, "") */
@@ -108,3 +108,4 @@
 /* LOCVAL(LOCALE_INEGSYMPRECEDES, "") */
 /* LOCVAL(LOCALE_INEGSEPBYSPACE, "") */
 
+/* calendrier grégorien */
diff --git a/ole/nls/frc.nls b/ole/nls/frc.nls
new file mode 100644
index 0000000..3829012
--- /dev/null
+++ b/ole/nls/frc.nls
@@ -0,0 +1,111 @@
+/*
+ *	OLE2NLS library
+ *      Canada (French)
+ */
+
+/* LOCVAL(LOCALE_ILANGUAGE,"") */
+/* LOCVAL(LOCALE_SLANGUAGE,"") */
+LOCVAL(LOCALE_SENGLANGUAGE,"French")
+LOCVAL(LOCALE_SABBREVLANGNAME,"frc")
+LOCVAL(LOCALE_SNATIVELANGNAME,"fran€ais")
+/* LOCVAL(LOCALE_ICOUNTRY,"") */
+/* LOCVAL(LOCALE_SCOUNTRY,"") */
+LOCVAL(LOCALE_SENGCOUNTRY,"Canada")
+LOCVAL(LOCALE_SABBREVCTRYNAME,"CAN")
+LOCVAL(LOCALE_SNATIVECTRYNAME,"Canada")
+/* 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, "CAD")
+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,"lundi")
+LOCVAL(LOCALE_SDAYNAME2,"mardi")
+LOCVAL(LOCALE_SDAYNAME3,"mercredi")
+LOCVAL(LOCALE_SDAYNAME4,"jeudi")
+LOCVAL(LOCALE_SDAYNAME5,"vendredi")
+LOCVAL(LOCALE_SDAYNAME6,"samedi")
+LOCVAL(LOCALE_SDAYNAME7,"dimanche")
+
+LOCVAL(LOCALE_SABBREVDAYNAME1,"lun")
+LOCVAL(LOCALE_SABBREVDAYNAME2,"mar")
+LOCVAL(LOCALE_SABBREVDAYNAME3,"mer")
+LOCVAL(LOCALE_SABBREVDAYNAME4,"jeu")
+LOCVAL(LOCALE_SABBREVDAYNAME5,"ven")
+LOCVAL(LOCALE_SABBREVDAYNAME6,"sam")
+LOCVAL(LOCALE_SABBREVDAYNAME7,"dim")
+
+LOCVAL(LOCALE_SMONTHNAME1,"janvier")
+LOCVAL(LOCALE_SMONTHNAME2,"f€vrier")
+LOCVAL(LOCALE_SMONTHNAME3,"mars")
+LOCVAL(LOCALE_SMONTHNAME4,"avril")
+LOCVAL(LOCALE_SMONTHNAME5,"mai")
+LOCVAL(LOCALE_SMONTHNAME6,"juin")
+LOCVAL(LOCALE_SMONTHNAME7,"juillet")
+LOCVAL(LOCALE_SMONTHNAME8,"ao€t")
+LOCVAL(LOCALE_SMONTHNAME9,"septembre")
+LOCVAL(LOCALE_SMONTHNAME10,"octobre")
+LOCVAL(LOCALE_SMONTHNAME11,"novembre")
+LOCVAL(LOCALE_SMONTHNAME12,"d€cembre")
+LOCVAL(LOCALE_SMONTHNAME13,"")
+
+LOCVAL(LOCALE_SABBREVMONTHNAME1,"janv")
+LOCVAL(LOCALE_SABBREVMONTHNAME2,"f€vr")
+LOCVAL(LOCALE_SABBREVMONTHNAME3,"mars")
+LOCVAL(LOCALE_SABBREVMONTHNAME4,"avr")
+LOCVAL(LOCALE_SABBREVMONTHNAME5,"mai")
+LOCVAL(LOCALE_SABBREVMONTHNAME6,"juin")
+LOCVAL(LOCALE_SABBREVMONTHNAME7,"juil")
+LOCVAL(LOCALE_SABBREVMONTHNAME8,"ao€t")
+LOCVAL(LOCALE_SABBREVMONTHNAME9,"sept")
+LOCVAL(LOCALE_SABBREVMONTHNAME10,"oct")
+LOCVAL(LOCALE_SABBREVMONTHNAME11,"nov")
+LOCVAL(LOCALE_SABBREVMONTHNAME12,"d€c")
+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, "") */
+
+/* calendrier gr€gorien */
diff --git a/ole/nls/frl.nls b/ole/nls/frl.nls
new file mode 100644
index 0000000..a70cc5d
--- /dev/null
+++ b/ole/nls/frl.nls
@@ -0,0 +1,111 @@
+/*
+ *	OLE2NLS library
+ *      Luxemburg (French)
+ */
+
+/* LOCVAL(LOCALE_ILANGUAGE,"") */
+/* LOCVAL(LOCALE_SLANGUAGE,"") */
+LOCVAL(LOCALE_SENGLANGUAGE,"French")
+LOCVAL(LOCALE_SABBREVLANGNAME,"frl")
+LOCVAL(LOCALE_SNATIVELANGNAME,"fran€ais")
+/* LOCVAL(LOCALE_ICOUNTRY,"") */
+LOCVAL(LOCALE_SCOUNTRY,"Luxembourg")
+LOCVAL(LOCALE_SENGCOUNTRY,"Luxemburg")
+LOCVAL(LOCALE_SABBREVCTRYNAME,"LUX")
+LOCVAL(LOCALE_SNATIVECTRYNAME,"Luxembourg")
+/* 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,"F")
+LOCVAL(LOCALE_SINTLSYMBOL, "LUF")
+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,"lundi")
+LOCVAL(LOCALE_SDAYNAME2,"mardi")
+LOCVAL(LOCALE_SDAYNAME3,"mercredi")
+LOCVAL(LOCALE_SDAYNAME4,"jeudi")
+LOCVAL(LOCALE_SDAYNAME5,"vendredi") 
+LOCVAL(LOCALE_SDAYNAME6,"samedi") 
+LOCVAL(LOCALE_SDAYNAME7,"dimanche")
+
+LOCVAL(LOCALE_SABBREVDAYNAME1,"lun") 
+LOCVAL(LOCALE_SABBREVDAYNAME2,"mar") 
+LOCVAL(LOCALE_SABBREVDAYNAME3,"mer") 
+LOCVAL(LOCALE_SABBREVDAYNAME4,"jeu") 
+LOCVAL(LOCALE_SABBREVDAYNAME5,"ven") 
+LOCVAL(LOCALE_SABBREVDAYNAME6,"sam") 
+LOCVAL(LOCALE_SABBREVDAYNAME7,"dim") 
+
+LOCVAL(LOCALE_SMONTHNAME1,"janvier")
+LOCVAL(LOCALE_SMONTHNAME2,"f€vrier")
+LOCVAL(LOCALE_SMONTHNAME3,"mars")
+LOCVAL(LOCALE_SMONTHNAME4,"avril")
+LOCVAL(LOCALE_SMONTHNAME5,"mai")
+LOCVAL(LOCALE_SMONTHNAME6,"juin")
+LOCVAL(LOCALE_SMONTHNAME7,"juillet")
+LOCVAL(LOCALE_SMONTHNAME8,"ao€t")
+LOCVAL(LOCALE_SMONTHNAME9,"septembre")
+LOCVAL(LOCALE_SMONTHNAME10,"octobre")
+LOCVAL(LOCALE_SMONTHNAME11,"novembre")
+LOCVAL(LOCALE_SMONTHNAME12,"d€cembre")
+LOCVAL(LOCALE_SMONTHNAME13,"")
+
+LOCVAL(LOCALE_SABBREVMONTHNAME1,"janv")
+LOCVAL(LOCALE_SABBREVMONTHNAME2,"f€vr")
+LOCVAL(LOCALE_SABBREVMONTHNAME3,"mars")
+LOCVAL(LOCALE_SABBREVMONTHNAME4,"avr")
+LOCVAL(LOCALE_SABBREVMONTHNAME5,"mai")
+LOCVAL(LOCALE_SABBREVMONTHNAME6,"juin")
+LOCVAL(LOCALE_SABBREVMONTHNAME7,"juil")
+LOCVAL(LOCALE_SABBREVMONTHNAME8,"ao€t")
+LOCVAL(LOCALE_SABBREVMONTHNAME9,"sept")
+LOCVAL(LOCALE_SABBREVMONTHNAME10,"oct")
+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, "") */
+
+/* calendrier gr€gorien */
diff --git a/ole/nls/frs.nls b/ole/nls/frs.nls
index 62c4c8d..9c794f0 100644
--- a/ole/nls/frs.nls
+++ b/ole/nls/frs.nls
@@ -4,18 +4,18 @@
  */
 
 /* LOCVAL(LOCALE_ILANGUAGE,"") */
-/* LOCVAL(LOCALE_SLANGUAGE,"") */
-LOCVAL(LOCALE_SENGLANGUAGE,"Switzerland")
+LOCVAL(LOCALE_SLANGUAGE,"Français (Suisse)")
+LOCVAL(LOCALE_SENGLANGUAGE,"French (Switzerland)")
 LOCVAL(LOCALE_SABBREVLANGNAME,"frs")
-/* LOCVAL(LOCALE_SNATIVELANGNAME,"") */
+LOCVAL(LOCALE_SNATIVELANGNAME,"Français (Suisse)")
 /* LOCVAL(LOCALE_ICOUNTRY,"") */
-/* LOCVAL(LOCALE_SCOUNTRY,"") */
-/* LOCVAL(LOCALE_SENGCOUNTRY,"") */
-/* LOCVAL(LOCALE_SABBREVCTRYNAME,"") */
-/* LOCVAL(LOCALE_SNATIVECTRYNAME,"") */
+LOCVAL(LOCALE_SCOUNTRY,"Suisse")
+LOCVAL(LOCALE_SENGCOUNTRY,"Switzerland")
+LOCVAL(LOCALE_SABBREVCTRYNAME,"Ch")
+LOCVAL(LOCALE_SNATIVECTRYNAME,"Suisse")
 /* LOCVAL(LOCALE_IDEFAULTLANGUAGE,"") */
 /* LOCVAL(LOCALE_IDEFAULTCOUNTRY,"") */
-/* LOCVAL(LOCALE_IDEFAULTCODEPAGE) */
+LOCVAL(LOCALE_IDEFAULTCODEPAGE,"850")
 /* LOCVAL(LOCALE_IDEFAULTANSICODEPAGE) */
 /* LOCVAL(LOCALE_SLIST,"") */
 /* LOCVAL(LOCALE_IMEASURE,"") */
@@ -25,12 +25,12 @@
 /* LOCVAL(LOCALE_IDIGITS,"2") */
 /* LOCVAL(LOCALE_ILZERO,"1") */
 /* LOCVAL(LOCALE_INEGNUMBER) */
-/* LOCVAL(LOCALE_SNATIVEDIGITS) */
-/* LOCVAL(LOCALE_SCURRENCY,"") */
-/* LOCVAL(LOCALE_SINTLSYMBOL) */
+LOCVAL(LOCALE_SNATIVEDIGITS, "0123456789")
+LOCVAL(LOCALE_SCURRENCY,"SFr")
+LOCVAL(LOCALE_SINTLSYMBOL, "CHF")
 /* LOCVAL(LOCALE_SMONDECIMALSEP,",") */
 /* LOCVAL(LOCALE_SMONTHOUSANDSEP,".") */
-/* LOCVAL(LOCALE_SMONGROUPING) */
+LOCVAL(LOCALE_SMONGROUPING, "3;0")
 /* LOCVAL(LOCALE_ICURRDIGITS,"2") */
 /* LOCVAL(LOCALE_IINTLCURRDIGITS) */
 /* LOCVAL(LOCALE_ICURRENCY,"3") */
@@ -55,52 +55,52 @@
 /* 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_SDAYNAME1,"lundi")
+LOCVAL(LOCALE_SDAYNAME2,"mardi")
+LOCVAL(LOCALE_SDAYNAME3,"mercredi")
+LOCVAL(LOCALE_SDAYNAME4,"jeudi")
+LOCVAL(LOCALE_SDAYNAME5,"vendredi")
+LOCVAL(LOCALE_SDAYNAME6,"samedi")
+LOCVAL(LOCALE_SDAYNAME7,"dimanche")
 
-/* 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_SABBREVDAYNAME1,"lun")
+LOCVAL(LOCALE_SABBREVDAYNAME2,"mar")
+LOCVAL(LOCALE_SABBREVDAYNAME3,"mer")
+LOCVAL(LOCALE_SABBREVDAYNAME4,"jeu")
+LOCVAL(LOCALE_SABBREVDAYNAME5,"ven")
+LOCVAL(LOCALE_SABBREVDAYNAME6,"sam")
+LOCVAL(LOCALE_SABBREVDAYNAME7,"dim")
 
-/* 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_SMONTHNAME1,"janvier")
+LOCVAL(LOCALE_SMONTHNAME2,"février")
+LOCVAL(LOCALE_SMONTHNAME3,"mars")
+LOCVAL(LOCALE_SMONTHNAME4,"avril")
+LOCVAL(LOCALE_SMONTHNAME5,"mai")
+LOCVAL(LOCALE_SMONTHNAME6,"juin")
+LOCVAL(LOCALE_SMONTHNAME7,"juillet")
+LOCVAL(LOCALE_SMONTHNAME8,"août")
+LOCVAL(LOCALE_SMONTHNAME9,"septembre")
+LOCVAL(LOCALE_SMONTHNAME10,"octobre")
+LOCVAL(LOCALE_SMONTHNAME11,"novembre")
+LOCVAL(LOCALE_SMONTHNAME12,"décembre")
 /* 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_SABBREVMONTHNAME1,"jan")
+LOCVAL(LOCALE_SABBREVMONTHNAME2,"fév")
+LOCVAL(LOCALE_SABBREVMONTHNAME3,"mar")
+LOCVAL(LOCALE_SABBREVMONTHNAME4,"avr")
+LOCVAL(LOCALE_SABBREVMONTHNAME5,"mai")
+LOCVAL(LOCALE_SABBREVMONTHNAME6,"jun")
+LOCVAL(LOCALE_SABBREVMONTHNAME7,"jul")
+LOCVAL(LOCALE_SABBREVMONTHNAME8,"aoû")
+LOCVAL(LOCALE_SABBREVMONTHNAME9,"sep")
+LOCVAL(LOCALE_SABBREVMONTHNAME10,"oct")
+LOCVAL(LOCALE_SABBREVMONTHNAME11,"nov")
+LOCVAL(LOCALE_SABBREVMONTHNAME12,"déc")
 /* LOCVAL(LOCALE_SABBREVMONTHNAME13,"") */
 
-/* LOCVAL(LOCALE_SPOSITIVESIGN, "") */
-/* LOCVAL(LOCALE_SNEGATIVESIGN, "") */
+LOCVAL(LOCALE_SPOSITIVESIGN, "")
+LOCVAL(LOCALE_SNEGATIVESIGN, "-")
 /* LOCVAL(LOCALE_IPOSSIGNPOSN, "") */
 /* LOCVAL(LOCALE_INEGSIGNPOSN, "") */
 /* LOCVAL(LOCALE_IPOSSYMPRECEDES, "") */
@@ -108,3 +108,4 @@
 /* LOCVAL(LOCALE_INEGSYMPRECEDES, "") */
 /* LOCVAL(LOCALE_INEGSEPBYSPACE, "") */
 
+/* calendrier grégorien */
diff --git a/ole/nls/grc.nls b/ole/nls/grc.nls
index 0e6e423..11fd066 100644
--- a/ole/nls/grc.nls
+++ b/ole/nls/grc.nls
@@ -25,12 +25,12 @@
 /* LOCVAL(LOCALE_IDIGITS,"2") */
 /* LOCVAL(LOCALE_ILZERO,"1") */
 /* LOCVAL(LOCALE_INEGNUMBER) */
-/* LOCVAL(LOCALE_SNATIVEDIGITS) */
+LOCVAL(LOCALE_SNATIVEDIGITS, "0123456789")
 /* LOCVAL(LOCALE_SCURRENCY,"") */
-/* LOCVAL(LOCALE_SINTLSYMBOL) */
+LOCVAL(LOCALE_SINTLSYMBOL, "GRD")
 /* LOCVAL(LOCALE_SMONDECIMALSEP,",") */
 /* LOCVAL(LOCALE_SMONTHOUSANDSEP,".") */
-/* LOCVAL(LOCALE_SMONGROUPING) */
+LOCVAL(LOCALE_SMONGROUPING, "3;0")
 /* LOCVAL(LOCALE_ICURRDIGITS,"2") */
 /* LOCVAL(LOCALE_IINTLCURRDIGITS) */
 /* LOCVAL(LOCALE_ICURRENCY,"3") */
diff --git a/ole/nls/hrv.nls b/ole/nls/hrv.nls
index b03d261..36d4314 100644
--- a/ole/nls/hrv.nls
+++ b/ole/nls/hrv.nls
@@ -5,14 +5,14 @@
 
 /* LOCVAL(LOCALE_ILANGUAGE,"") */
 /* LOCVAL(LOCALE_SLANGUAGE,"") */
-/* LOCVAL(LOCALE_SENGLANGUAGE,"") */
+LOCVAL(LOCALE_SENGLANGUAGE,"Croatian")
 LOCVAL(LOCALE_SABBREVLANGNAME,"hrv")
-/* LOCVAL(LOCALE_SNATIVELANGNAME,"") */
+LOCVAL(LOCALE_SNATIVELANGNAME,"hrvatski")
 /* LOCVAL(LOCALE_ICOUNTRY,"") */
 /* LOCVAL(LOCALE_SCOUNTRY,"") */
-/* LOCVAL(LOCALE_SENGCOUNTRY,"") */
-/* LOCVAL(LOCALE_SABBREVCTRYNAME,"") */
-/* LOCVAL(LOCALE_SNATIVECTRYNAME,"") */
+LOCVAL(LOCALE_SENGCOUNTRY,"Croatia")
+/* LOCVAL(LOCALE_SABBREVCTRYNAME,"HRV")
+LOCVAL(LOCALE_SNATIVECTRYNAME,"Hrvatska")
 /* LOCVAL(LOCALE_IDEFAULTLANGUAGE,"") */
 /* LOCVAL(LOCALE_IDEFAULTCOUNTRY,"") */
 /* LOCVAL(LOCALE_IDEFAULTCODEPAGE) */
@@ -25,12 +25,12 @@
 /* LOCVAL(LOCALE_IDIGITS,"2") */
 /* LOCVAL(LOCALE_ILZERO,"1") */
 /* LOCVAL(LOCALE_INEGNUMBER) */
-/* LOCVAL(LOCALE_SNATIVEDIGITS) */
-/* LOCVAL(LOCALE_SCURRENCY,"") */
-/* LOCVAL(LOCALE_SINTLSYMBOL) */
+LOCVAL(LOCALE_SNATIVEDIGITS,"0123456789")
+LOCVAL(LOCALE_SCURRENCY,"Din")
+LOCVAL(LOCALE_SINTLSYMBOL,"HRD")
 /* LOCVAL(LOCALE_SMONDECIMALSEP,",") */
 /* LOCVAL(LOCALE_SMONTHOUSANDSEP,".") */
-/* LOCVAL(LOCALE_SMONGROUPING) */
+LOCVAL(LOCALE_SMONGROUPING,"3;0")
 /* LOCVAL(LOCALE_ICURRDIGITS,"2") */
 /* LOCVAL(LOCALE_IINTLCURRDIGITS) */
 /* LOCVAL(LOCALE_ICURRENCY,"3") */
@@ -55,49 +55,50 @@
 /* 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_SDAYNAME1,"ponedj") */
+/* LOCVAL(LOCALE_SDAYNAME2,"eljak") */
+/* LOCVAL(LOCALE_SDAYNAME3,"utorak") */
+/* LOCVAL(LOCALE_SDAYNAME4,"srijeda") */
+/* LOCVAL(LOCALE_SDAYNAME5,"etvrtak") */
+/* LOCVAL(LOCALE_SDAYNAME6,"petak") */
+/* LOCVAL(LOCALE_SDAYNAME7,"subota") */
+/* LOCVAL(LOCALE_SDAYNAME?,"nedjelja") */
 
-/* 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_SABBREVDAYNAME1,"") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME2,"") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME3,"") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME4,"") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME5,"") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME6,"") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME7,"") */
 
-/* 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_SMONTHNAME1,"sije?anj") 
+LOCVAL(LOCALE_SMONTHNAME2,"velja") 
+LOCVAL(LOCALE_SMONTHNAME3,"o?ujak")
+LOCVAL(LOCALE_SMONTHNAME4,"travanj")
+LOCVAL(LOCALE_SMONTHNAME5,"svibanj")
+LOCVAL(LOCALE_SMONTHNAME6,"lipanj")
+LOCVAL(LOCALE_SMONTHNAME7,"srpanj")
+LOCVAL(LOCALE_SMONTHNAME7,"kolovoz")
+LOCVAL(LOCALE_SMONTHNAME9,"rujan")
+LOCVAL(LOCALE_SMONTHNAME10,"listopad")
+LOCVAL(LOCALE_SMONTHNAME11,"studeni")
+LOCVAL(LOCALE_SMONTHNAME12,"prosinac")
+LOCVAL(LOCALE_SMONTHNAME12,"")
 
-/* 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_SABBREVMONTHNAME1,"sij")
+LOCVAL(LOCALE_SABBREVMONTHNAME2,"vel")
+LOCVAL(LOCALE_SABBREVMONTHNAME3,"o?u")
+LOCVAL(LOCALE_SABBREVMONTHNAME4,"tra")
+LOCVAL(LOCALE_SABBREVMONTHNAME5,"svi")
+LOCVAL(LOCALE_SABBREVMONTHNAME6,"lip")
+LOCVAL(LOCALE_SABBREVMONTHNAME7,"srp")
+LOCVAL(LOCALE_SABBREVMONTHNAME8,"kol")
+LOCVAL(LOCALE_SABBREVMONTHNAME9,"ruj")
+LOCVAL(LOCALE_SABBREVMONTHNAME10,"lis")
+LOCVAL(LOCALE_SABBREVMONTHNAME11,"stu")
+LOCVAL(LOCALE_SABBREVMONTHNAME12,"pro")
+LOCVAL(LOCALE_SABBREVMONTHNAME13,"")
 
 /* LOCVAL(LOCALE_SPOSITIVESIGN, "") */
 /* LOCVAL(LOCALE_SNEGATIVESIGN, "") */
@@ -108,3 +109,4 @@
 /* LOCVAL(LOCALE_INEGSYMPRECEDES, "") */
 /* LOCVAL(LOCALE_INEGSEPBYSPACE, "") */
 
+/* Gregorijanski kalendar */
diff --git a/ole/nls/hun.nls b/ole/nls/hun.nls
index 466e789..7db35f0 100644
--- a/ole/nls/hun.nls
+++ b/ole/nls/hun.nls
@@ -25,12 +25,12 @@
 LOCVAL(LOCALE_IDIGITS,"2")
 LOCVAL(LOCALE_ILZERO,"1")
 /* LOCVAL(LOCALE_INEGNUMBER) */
-/* LOCVAL(LOCALE_SNATIVEDIGITS) */
+LOCVAL(LOCALE_SNATIVEDIGITS, "0123456789")
 LOCVAL(LOCALE_SCURRENCY,"Ft")
 LOCVAL(LOCALE_SINTLSYMBOL,"HUF")
 /* LOCVAL(LOCALE_SMONDECIMALSEP) */
 /* LOCVAL(LOCALE_SMONTHOUSANDSEP) */
-/* LOCVAL(LOCALE_SMONGROUPING) */
+LOCVAL(LOCALE_SMONGROUPING,"3;0")
 LOCVAL(LOCALE_ICURRDIGITS,"0")
 /* LOCVAL(LOCALE_IINTLCURRDIGITS) */
 LOCVAL(LOCALE_ICURRENCY,"3")
diff --git a/ole/nls/ind.nls b/ole/nls/ind.nls
new file mode 100644
index 0000000..7c9610f
--- /dev/null
+++ b/ole/nls/ind.nls
@@ -0,0 +1,111 @@
+/*
+ *	OLE2NLS library
+ *      Indonesia (Bahasa)
+ */
+
+/* LOCVAL(LOCALE_ILANGUAGE,"") */
+/* LOCVAL(LOCALE_SLANGUAGE,"") */
+/* LOCVAL(LOCALE_SENGLANGUAGE,"") */
+LOCVAL(LOCALE_SABBREVLANGNAME,"ind")
+/* 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,"0123456789")
+/* LOCVAL(LOCALE_SCURRENCY,"") */
+LOCVAL(LOCALE_SINTLSYMBOL,"AED")
+/* 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,"") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME2,"") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME3,"") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME4,"") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME5,"") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME6,"") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME7,"") */
+
+/* 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/irl.nls b/ole/nls/irl.nls
index fb15228..cf96e6f 100644
--- a/ole/nls/irl.nls
+++ b/ole/nls/irl.nls
@@ -9,9 +9,9 @@
 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_SCOUNTRY, "Ireland")
+LOCVAL(LOCALE_SENGCOUNTRY, "Ireland")
+LOCVAL(LOCALE_SABBREVCTRYNAME, "IRL")
 LOCVAL(LOCALE_SNATIVECTRYNAME, "Eire")
 LOCVAL(LOCALE_IDEFAULTLANGUAGE, "0409")
 LOCVAL(LOCALE_IDEFAULTCOUNTRY, "1")
@@ -107,3 +107,5 @@
 LOCVAL(LOCALE_IPOSSEPBYSPACE, "0")
 LOCVAL(LOCALE_INEGSYMPRECEDES, "1")
 LOCVAL(LOCALE_INEGSEPBYSPACE, "0")
+
+/* Gregorian Calendar */
\ No newline at end of file
diff --git a/ole/nls/isl.nls b/ole/nls/isl.nls
index e207da1..ca7a579 100644
--- a/ole/nls/isl.nls
+++ b/ole/nls/isl.nls
@@ -7,7 +7,7 @@
 LOCVAL(LOCALE_SLANGUAGE,"€slensk")
 LOCVAL(LOCALE_SENGLANGUAGE,"Icelandic")
 LOCVAL(LOCALE_SABBREVLANGNAME,"isl")
-LOCVAL(LOCALE_SNATIVELANGNAME,"€slensk")
+LOCVAL(LOCALE_SNATIVELANGNAME,"€slenska")
 /* LOCVAL(LOCALE_ICOUNTRY,"49") */
 LOCVAL(LOCALE_SCOUNTRY,"€sland")
 LOCVAL(LOCALE_SENGCOUNTRY,"Iceland")
@@ -30,7 +30,7 @@
 LOCVAL(LOCALE_SINTLSYMBOL, "ISK")
 /* LOCVAL(LOCALE_SMONDECIMALSEP) */
 /* LOCVAL(LOCALE_SMONTHOUSANDSEP) */
-/* LOCVAL(LOCALE_SMONGROUPING) */
+LOCVAL(LOCALE_SMONGROUPING,"3;0")
 LOCVAL(LOCALE_ICURRDIGITS,"2")
 /* LOCVAL(LOCALE_IINTLCURRDIGITS) */
 LOCVAL(LOCALE_ICURRENCY,"3")
@@ -56,20 +56,20 @@
 /* LOCVAL(LOCALE_IFIRSTWEEKOFYEAR) */
 
 LOCVAL(LOCALE_SDAYNAME1,"m€nudagur")
-LOCVAL(LOCALE_SDAYNAME2,"thridjudagur")
-LOCVAL(LOCALE_SDAYNAME3,"midvikudagur")
+LOCVAL(LOCALE_SDAYNAME2,"?hridjudagur")
+LOCVAL(LOCALE_SDAYNAME3,"mi?vikudagur")
 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_SABBREVDAYNAME1,"m€n")
+LOCVAL(LOCALE_SABBREVDAYNAME2,"?ri")
+LOCVAL(LOCALE_SABBREVDAYNAME3,"mi?")
+LOCVAL(LOCALE_SABBREVDAYNAME4,"fim")
+LOCVAL(LOCALE_SABBREVDAYNAME5,"f€s")
+LOCVAL(LOCALE_SABBREVDAYNAME6,"lau")
+LOCVAL(LOCALE_SABBREVDAYNAME7,"sun")
 
 LOCVAL(LOCALE_SMONTHNAME1,"jan€ar")
 LOCVAL(LOCALE_SMONTHNAME2,"febr€ar")
@@ -107,3 +107,5 @@
 /* LOCVAL(LOCALE_IPOSSEPBYSPACE) */
 /* LOCVAL(LOCALE_INEGSYMPRECEDES) */
 /* LOCVAL(LOCALE_INEGSEPBYSPACE) */
+
+/* gregor */
diff --git a/ole/nls/ita.nls b/ole/nls/ita.nls
index 664568e..282a857 100644
--- a/ole/nls/ita.nls
+++ b/ole/nls/ita.nls
@@ -11,11 +11,11 @@
 LOCVAL(LOCALE_ICOUNTRY,"39")
 LOCVAL(LOCALE_SCOUNTRY,"Italia")
 LOCVAL(LOCALE_SENGCOUNTRY,"Italy")
-LOCVAL(LOCALE_SABBREVCTRYNAME,"It")
+LOCVAL(LOCALE_SABBREVCTRYNAME,"ITL")
 LOCVAL(LOCALE_SNATIVECTRYNAME,"Italia")
 LOCVAL(LOCALE_IDEFAULTLANGUAGE,"9")
 LOCVAL(LOCALE_IDEFAULTCOUNTRY,"39")
-/* LOCVAL(LOCALE_IDEFAULTCODEPAGE) /*
+/* LOCVAL(LOCALE_IDEFAULTCODEPAGE) */
 /* LOCVAL(LOCALE_IDEFAULTANSICODEPAGE) */
 LOCVAL(LOCALE_SLIST,";")
 LOCVAL(LOCALE_IMEASURE,"0")
@@ -30,7 +30,7 @@
 LOCVAL(LOCALE_SINTLSYMBOL, "ITL")
 /* LOCVAL(LOCALE_SMONDECIMALSEP) */
 /* LOCVAL(LOCALE_SMONTHOUSANDSEP) */
-/* LOCVAL(LOCALE_SMONGROUPING) */
+LOCVAL(LOCALE_SMONGROUPING,"3;0")
 LOCVAL(LOCALE_ICURRDIGITS,"2")
 /* LOCVAL(LOCALE_IINTLCURRDIGITS) */
 LOCVAL(LOCALE_ICURRENCY,"3")
@@ -71,32 +71,32 @@
 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_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_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) */
@@ -108,3 +108,4 @@
 /* LOCVAL(LOCALE_INEGSYMPRECEDES) */
 /* LOCVAL(LOCALE_INEGSEPBYSPACE) */
  
+/* calendario gregoriano */
diff --git a/ole/nls/its.nls b/ole/nls/its.nls
index a493fde..8c4b3fb 100644
--- a/ole/nls/its.nls
+++ b/ole/nls/its.nls
@@ -1,6 +1,6 @@
 /*
  *	OLE2NLS library
- *      Switzerland
+ *      Switzerland (Italiano)
  */
 
 LOCVAL(LOCALE_ILANGUAGE,"9")
@@ -11,7 +11,7 @@
 LOCVAL(LOCALE_ICOUNTRY,"41")
 LOCVAL(LOCALE_SCOUNTRY,"Svizzera")
 LOCVAL(LOCALE_SENGCOUNTRY,"Switzerand")
-LOCVAL(LOCALE_SABBREVCTRYNAME,"CH")
+LOCVAL(LOCALE_SABBREVCTRYNAME,"CHE")
 LOCVAL(LOCALE_SNATIVECTRYNAME,"Svizzera")
 LOCVAL(LOCALE_IDEFAULTLANGUAGE,"9")
 LOCVAL(LOCALE_IDEFAULTCOUNTRY,"41")
@@ -30,7 +30,7 @@
 LOCVAL(LOCALE_SINTLSYMBOL, "CHF")
 /* LOCVAL(LOCALE_SMONDECIMALSEP) */
 /* LOCVAL(LOCALE_SMONTHOUSANDSEP) */
-/* LOCVAL(LOCALE_SMONGROUPING) */
+LOCVAL(LOCALE_SMONGROUPING,"3;0")
 LOCVAL(LOCALE_ICURRDIGITS,"2")
 /* LOCVAL(LOCALE_IINTLCURRDIGITS) */
 LOCVAL(LOCALE_ICURRENCY,"3")
@@ -55,48 +55,48 @@
 /* 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_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_SABBREVDAYNAME1,"lun")
+LOCVAL(LOCALE_SABBREVDAYNAME2,"mar")
+LOCVAL(LOCALE_SABBREVDAYNAME3,"mer")
+LOCVAL(LOCALE_SABBREVDAYNAME4,"gio")
+LOCVAL(LOCALE_SABBREVDAYNAME5,"ven")
+LOCVAL(LOCALE_SABBREVDAYNAME6,"sab")
+LOCVAL(LOCALE_SABBREVDAYNAME7,"dom")
 
-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_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_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) */
@@ -108,3 +108,4 @@
 /* LOCVAL(LOCALE_INEGSYMPRECEDES) */
 /* LOCVAL(LOCALE_INEGSEPBYSPACE) */
  
+/* calendario gregoriano */
diff --git a/ole/nls/jpn.nls b/ole/nls/jpn.nls
new file mode 100644
index 0000000..941cf81
--- /dev/null
+++ b/ole/nls/jpn.nls
@@ -0,0 +1,110 @@
+/*
+ *	OLE2NLS library
+ *      Japanese
+ */
+
+/* LOCVAL(LOCALE_ILANGUAGE,"") */
+/* LOCVAL(LOCALE_SLANGUAGE,"") */
+LOCVAL(LOCALE_SENGLANGUAGE,"Japanese")
+LOCVAL(LOCALE_SABBREVLANGNAME,"jpn")
+/* LOCVAL(LOCALE_SNATIVELANGNAME,"") */
+/* LOCVAL(LOCALE_ICOUNTRY,"") */
+/* LOCVAL(LOCALE_SCOUNTRY,"") */
+LOCVAL(LOCALE_SENGCOUNTRY,"Japan")
+LOCVAL(LOCALE_SABBREVCTRYNAME,"JPN")
+/* 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,"3;0")
+/* LOCVAL(LOCALE_IDIGITS,"2") */
+/* LOCVAL(LOCALE_ILZERO,"1") */
+/* LOCVAL(LOCALE_INEGNUMBER) */
+LOCVAL(LOCALE_SNATIVEDIGITS,"0123456789")
+/* LOCVAL(LOCALE_SCURRENCY,"") */
+LOCVAL(LOCALE_SINTLSYMBOL, "JPY")
+/* 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,"") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME2,"") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME3,"") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME4,"") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME5,"") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME6,"") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME7,"") */
+
+/* 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/koj.nls b/ole/nls/koj.nls
index 71aceb2..4de9210 100644
--- a/ole/nls/koj.nls
+++ b/ole/nls/koj.nls
@@ -1,17 +1,17 @@
 /*
  *	OLE2NLS library
- *      Korean
+ *      Korean (Johab)
  */
 
 /* LOCVAL(LOCALE_ILANGUAGE,"") */
-/* LOCVAL(LOCALE_SLANGUAGE,"") */
-/* LOCVAL(LOCALE_SENGLANGUAGE,"") */
+LOCVAL(LOCALE_SLANGUAGE,"Korean (Johab)") 
+LOCVAL(LOCALE_SENGLANGUAGE,"Korean")
 LOCVAL(LOCALE_SABBREVLANGNAME,"koj")
 /* LOCVAL(LOCALE_SNATIVELANGNAME,"") */
 /* LOCVAL(LOCALE_ICOUNTRY,"") */
 /* LOCVAL(LOCALE_SCOUNTRY,"") */
 /* LOCVAL(LOCALE_SENGCOUNTRY,"") */
-/* LOCVAL(LOCALE_SABBREVCTRYNAME,"") */
+LOCVAL(LOCALE_SABBREVCTRYNAME,"KOR")
 /* LOCVAL(LOCALE_SNATIVECTRYNAME,"") */
 /* LOCVAL(LOCALE_IDEFAULTLANGUAGE,"") */
 /* LOCVAL(LOCALE_IDEFAULTCOUNTRY,"") */
@@ -25,12 +25,12 @@
 /* LOCVAL(LOCALE_IDIGITS,"2") */
 /* LOCVAL(LOCALE_ILZERO,"1") */
 /* LOCVAL(LOCALE_INEGNUMBER) */
-/* LOCVAL(LOCALE_SNATIVEDIGITS) */
+LOCVAL(LOCALE_SNATIVEDIGITS, "0123456789")
 /* LOCVAL(LOCALE_SCURRENCY,"") */
 /* LOCVAL(LOCALE_SINTLSYMBOL) */
 /* LOCVAL(LOCALE_SMONDECIMALSEP,",") */
 /* LOCVAL(LOCALE_SMONTHOUSANDSEP,".") */
-/* LOCVAL(LOCALE_SMONGROUPING) */
+LOCVAL(LOCALE_SMONGROUPING,"3;0")
 /* LOCVAL(LOCALE_ICURRDIGITS,"2") */
 /* LOCVAL(LOCALE_IINTLCURRDIGITS) */
 /* LOCVAL(LOCALE_ICURRENCY,"3") */
@@ -63,13 +63,13 @@
 /* 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_SABBREVDAYNAME1,"") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME2,"") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME3,"") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME4,"") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME5,"") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME6,"") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME7,"") */
 
 /* LOCVAL(LOCALE_SMONTHNAME1,"") */
 /* LOCVAL(LOCALE_SMONTHNAME2,"") */
diff --git a/ole/nls/lth.nls b/ole/nls/lth.nls
index f758697..051c141 100644
--- a/ole/nls/lth.nls
+++ b/ole/nls/lth.nls
@@ -63,13 +63,13 @@
 /* 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_SABBREVDAYNAME1,"") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME2,"") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME3,"") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME4,"") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME5,"") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME6,"") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME7,"") */
 
 /* LOCVAL(LOCALE_SMONTHNAME1,"") */
 /* LOCVAL(LOCALE_SMONTHNAME2,"") */
diff --git a/ole/nls/lvi.nls b/ole/nls/lvi.nls
index a0d1773..67863c7 100644
--- a/ole/nls/lvi.nls
+++ b/ole/nls/lvi.nls
@@ -63,13 +63,13 @@
 /* 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_SABBREVDAYNAME1,"") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME2,"") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME3,"") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME4,"") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME5,"") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME6,"") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME7,"") */
 
 /* LOCVAL(LOCALE_SMONTHNAME1,"") */
 /* LOCVAL(LOCALE_SMONTHNAME2,"") */
diff --git a/ole/nls/nlb.nls b/ole/nls/nlb.nls
index e29103f..f998059 100644
--- a/ole/nls/nlb.nls
+++ b/ole/nls/nlb.nls
@@ -1,18 +1,18 @@
 /*
  *	OLE2NLS library
- *      Netherlands
+ *      Dutch (Belgium)
  */
 
 /* LOCVAL(LOCALE_ILANGUAGE,"") */
 /* LOCVAL(LOCALE_SLANGUAGE,"") */
-/* LOCVAL(LOCALE_SENGLANGUAGE,"") */
+LOCVAL(LOCALE_SENGLANGUAGE,"Dutch")
 LOCVAL(LOCALE_SABBREVLANGNAME,"nlb")
-/* LOCVAL(LOCALE_SNATIVELANGNAME,"") */
+LOCVAL(LOCALE_SNATIVELANGNAME,"Nederlands")
 /* LOCVAL(LOCALE_ICOUNTRY,"") */
 /* LOCVAL(LOCALE_SCOUNTRY,"") */
-/* LOCVAL(LOCALE_SENGCOUNTRY,"") */
-/* LOCVAL(LOCALE_SABBREVCTRYNAME,"") */
-/* LOCVAL(LOCALE_SNATIVECTRYNAME,"") */
+LOCVAL(LOCALE_SENGCOUNTRY,"Belgium")
+LOCVAL(LOCALE_SABBREVCTRYNAME,"BEL")
+/* LOCVAL(LOCALE_SNATIVECTRYNAME,"Belgi") */
 /* LOCVAL(LOCALE_IDEFAULTLANGUAGE,"") */
 /* LOCVAL(LOCALE_IDEFAULTCOUNTRY,"") */
 /* LOCVAL(LOCALE_IDEFAULTCODEPAGE) */
@@ -25,12 +25,12 @@
 /* LOCVAL(LOCALE_IDIGITS,"2") */
 /* LOCVAL(LOCALE_ILZERO,"1") */
 /* LOCVAL(LOCALE_INEGNUMBER) */
-/* LOCVAL(LOCALE_SNATIVEDIGITS) */
-/* LOCVAL(LOCALE_SCURRENCY,"") */
-/* LOCVAL(LOCALE_SINTLSYMBOL) */
+LOCVAL(LOCALE_SNATIVEDIGITS,"0123456789")
+LOCVAL(LOCALE_SCURRENCY,"BF")
+LOCVAL(LOCALE_SINTLSYMBOL,"BEF")
 /* LOCVAL(LOCALE_SMONDECIMALSEP,",") */
 /* LOCVAL(LOCALE_SMONTHOUSANDSEP,".") */
-/* LOCVAL(LOCALE_SMONGROUPING) */
+LOCVAL(LOCALE_SMONGROUPING,"3;0")
 /* LOCVAL(LOCALE_ICURRDIGITS,"2") */
 /* LOCVAL(LOCALE_IINTLCURRDIGITS) */
 /* LOCVAL(LOCALE_ICURRENCY,"3") */
@@ -55,49 +55,49 @@
 /* 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_SDAYNAME1,"maandag")
+LOCVAL(LOCALE_SDAYNAME2,"dinsdag")
+LOCVAL(LOCALE_SDAYNAME3,"woensdag")
+LOCVAL(LOCALE_SDAYNAME4,"donderdag")
+LOCVAL(LOCALE_SDAYNAME5,"vrijdag")
+LOCVAL(LOCALE_SDAYNAME6,"zaterdag")
+LOCVAL(LOCALE_SDAYNAME7,"zondag")
 
-/* 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_SABBREVDAYNAME1,"ma")
+LOCVAL(LOCALE_SABBREVDAYNAME2,"di")
+LOCVAL(LOCALE_SABBREVDAYNAME3,"wo")
+LOCVAL(LOCALE_SABBREVDAYNAME4,"do")
+LOCVAL(LOCALE_SABBREVDAYNAME5,"vr")
+LOCVAL(LOCALE_SABBREVDAYNAME6,"za")
+LOCVAL(LOCALE_SABBREVDAYNAME7,"zo")
 
-/* 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_SMONTHNAME1,"januar")
+LOCVAL(LOCALE_SMONTHNAME2,"februari")
+LOCVAL(LOCALE_SMONTHNAME3,"maart")
+LOCVAL(LOCALE_SMONTHNAME4,"april")
+LOCVAL(LOCALE_SMONTHNAME5,"mei")
+LOCVAL(LOCALE_SMONTHNAME6,"juni")
+LOCVAL(LOCALE_SMONTHNAME7,"juli")
+LOCVAL(LOCALE_SMONTHNAME8,"augustus")
+LOCVAL(LOCALE_SMONTHNAME9,"september")
+LOCVAL(LOCALE_SMONTHNAME10,"oktober")
+LOCVAL(LOCALE_SMONTHNAME11,"november")
+LOCVAL(LOCALE_SMONTHNAME12,"december")
+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_SABBREVMONTHNAME1,"jan")
+LOCVAL(LOCALE_SABBREVMONTHNAME2,"feb")
+LOCVAL(LOCALE_SABBREVMONTHNAME3,"mrt")
+LOCVAL(LOCALE_SABBREVMONTHNAME4,"apr")
+LOCVAL(LOCALE_SABBREVMONTHNAME5,"mei")
+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, "") */
@@ -108,3 +108,4 @@
 /* LOCVAL(LOCALE_INEGSYMPRECEDES, "") */
 /* LOCVAL(LOCALE_INEGSEPBYSPACE, "") */
 
+/* Gregorianse kalender */
diff --git a/ole/nls/nld.nls b/ole/nls/nld.nls
new file mode 100644
index 0000000..a701df3
--- /dev/null
+++ b/ole/nls/nld.nls
@@ -0,0 +1,111 @@
+/*
+ *	OLE2NLS library
+ *      Dutch (Netherlands)
+ */
+
+/* LOCVAL(LOCALE_ILANGUAGE,"") */
+/* LOCVAL(LOCALE_SLANGUAGE,"") */
+LOCVAL(LOCALE_SENGLANGUAGE,"Dutch")
+LOCVAL(LOCALE_SABBREVLANGNAME,"nld")
+LOCVAL(LOCALE_SNATIVELANGNAME,"Nederlands")
+/* LOCVAL(LOCALE_ICOUNTRY,"") */
+/* LOCVAL(LOCALE_SCOUNTRY,"") */
+LOCVAL(LOCALE_SENGCOUNTRY,"Netherlands")
+LOCVAL(LOCALE_SABBREVCTRYNAME,"NLD")
+LOCVAL(LOCALE_SNATIVECTRYNAME,"Nederland")
+/* 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,"F")
+LOCVAL(LOCALE_SINTLSYMBOL,"NLG")
+/* 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,"maandag")
+LOCVAL(LOCALE_SDAYNAME2,"dinsdag")
+LOCVAL(LOCALE_SDAYNAME3,"woensdag")
+LOCVAL(LOCALE_SDAYNAME4,"donderdag")
+LOCVAL(LOCALE_SDAYNAME5,"vrijdag")
+LOCVAL(LOCALE_SDAYNAME6,"zaterdag")
+LOCVAL(LOCALE_SDAYNAME7,"zondag")
+
+LOCVAL(LOCALE_SABBREVDAYNAME1,"ma")
+LOCVAL(LOCALE_SABBREVDAYNAME2,"di")
+LOCVAL(LOCALE_SABBREVDAYNAME3,"wo")
+LOCVAL(LOCALE_SABBREVDAYNAME4,"do")
+LOCVAL(LOCALE_SABBREVDAYNAME5,"vr")
+LOCVAL(LOCALE_SABBREVDAYNAME6,"za")
+LOCVAL(LOCALE_SABBREVDAYNAME7,"zo")
+
+LOCVAL(LOCALE_SMONTHNAME1,"januar")
+LOCVAL(LOCALE_SMONTHNAME2,"februari")
+LOCVAL(LOCALE_SMONTHNAME3,"maart")
+LOCVAL(LOCALE_SMONTHNAME4,"april")
+LOCVAL(LOCALE_SMONTHNAME5,"mei")
+LOCVAL(LOCALE_SMONTHNAME6,"juni")
+LOCVAL(LOCALE_SMONTHNAME7,"juli")
+LOCVAL(LOCALE_SMONTHNAME8,"augustus")
+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,"mrt")
+LOCVAL(LOCALE_SABBREVMONTHNAME4,"apr")
+LOCVAL(LOCALE_SABBREVMONTHNAME5,"mei")
+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, "") */
+/* LOCVAL(LOCALE_INEGSIGNPOSN, "") */
+/* LOCVAL(LOCALE_IPOSSYMPRECEDES, "") */
+/* LOCVAL(LOCALE_IPOSSEPBYSPACE, "") */
+/* LOCVAL(LOCALE_INEGSYMPRECEDES, "") */
+/* LOCVAL(LOCALE_INEGSEPBYSPACE, "") */
+
+/* Gregorianse kalender */
diff --git a/ole/nls/non.nls b/ole/nls/non.nls
index aa92e74..c6ab915 100644
--- a/ole/nls/non.nls
+++ b/ole/nls/non.nls
@@ -4,15 +4,15 @@
  */
 
 /* LOCVAL(LOCALE_ILANGUAGE,"") */
-/* LOCVAL(LOCALE_SLANGUAGE,"") */
-/* LOCVAL(LOCALE_SENGLANGUAGE,"") */
+LOCVAL(LOCALE_SLANGUAGE,"Norwegian (Nynorsk)")
+LOCVAL(LOCALE_SENGLANGUAGE,"Norwegian")
 LOCVAL(LOCALE_SABBREVLANGNAME,"non")
-/* LOCVAL(LOCALE_SNATIVELANGNAME,"") */
+LOCVAL(LOCALE_SNATIVELANGNAME,"nynorsk")
 /* LOCVAL(LOCALE_ICOUNTRY,"") */
 /* LOCVAL(LOCALE_SCOUNTRY,"") */
-/* LOCVAL(LOCALE_SENGCOUNTRY,"") */
-/* LOCVAL(LOCALE_SABBREVCTRYNAME,"") */
-/* LOCVAL(LOCALE_SNATIVECTRYNAME,"") */
+LOCVAL(LOCALE_SENGCOUNTRY,"Norway")
+LOCVAL(LOCALE_SABBREVCTRYNAME,"NOR")
+LOCVAL(LOCALE_SNATIVECTRYNAME,"Noreg")
 /* LOCVAL(LOCALE_IDEFAULTLANGUAGE,"") */
 /* LOCVAL(LOCALE_IDEFAULTCOUNTRY,"") */
 /* LOCVAL(LOCALE_IDEFAULTCODEPAGE) */
@@ -25,12 +25,12 @@
 /* LOCVAL(LOCALE_IDIGITS,"2") */
 /* LOCVAL(LOCALE_ILZERO,"1") */
 /* LOCVAL(LOCALE_INEGNUMBER) */
-/* LOCVAL(LOCALE_SNATIVEDIGITS) */
-/* LOCVAL(LOCALE_SCURRENCY,"") */
-/* LOCVAL(LOCALE_SINTLSYMBOL) */
+LOCVAL(LOCALE_SNATIVEDIGITS,"0123456789")
+/* LOCVAL(LOCALE_SCURRENCY,"kr") */
+/* LOCVAL(LOCALE_SINTLSYMBOL,"NOK") */
 /* LOCVAL(LOCALE_SMONDECIMALSEP,",") */
 /* LOCVAL(LOCALE_SMONTHOUSANDSEP,".") */
-/* LOCVAL(LOCALE_SMONGROUPING) */
+LOCVAL(LOCALE_SMONGROUPING,"3;0")
 /* LOCVAL(LOCALE_ICURRDIGITS,"2") */
 /* LOCVAL(LOCALE_IINTLCURRDIGITS) */
 /* LOCVAL(LOCALE_ICURRENCY,"3") */
@@ -55,49 +55,49 @@
 /* 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_SDAYNAME1,"m?ndag")
+LOCVAL(LOCALE_SDAYNAME2,"tysdag")
+LOCVAL(LOCALE_SDAYNAME3,"fredag")
+LOCVAL(LOCALE_SDAYNAME4,"onsdag")
+LOCVAL(LOCALE_SDAYNAME5,"torsdag")
+LOCVAL(LOCALE_SDAYNAME6,"laurdag")
+LOCVAL(LOCALE_SDAYNAME7,"sundag")
 
-/* 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_SABBREVDAYNAME1,"m?")
+LOCVAL(LOCALE_SABBREVDAYNAME2,"ty")
+LOCVAL(LOCALE_SABBREVDAYNAME3,"fr")
+LOCVAL(LOCALE_SABBREVDAYNAME4,"on")
+LOCVAL(LOCALE_SABBREVDAYNAME5,"to")
+LOCVAL(LOCALE_SABBREVDAYNAME6,"lau")
+LOCVAL(LOCALE_SABBREVDAYNAME7,"su")
 
-/* 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_SMONTHNAME1,"januar") 
+LOCVAL(LOCALE_SMONTHNAME2,"februar")
+LOCVAL(LOCALE_SMONTHNAME3,"mars")
+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,"desember")
+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_SABBREVMONTHNAME1,"jan")
+LOCVAL(LOCALE_SABBREVMONTHNAME2,"feb")
+LOCVAL(LOCALE_SABBREVMONTHNAME3,"mar")
+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,"des")
+LOCVAL(LOCALE_SABBREVMONTHNAME13,"")
 
 /* LOCVAL(LOCALE_SPOSITIVESIGN, "") */
 /* LOCVAL(LOCALE_SNEGATIVESIGN, "") */
@@ -108,3 +108,4 @@
 /* LOCVAL(LOCALE_INEGSYMPRECEDES, "") */
 /* LOCVAL(LOCALE_INEGSEPBYSPACE, "") */
 
+/* gregoriansk kalender */
diff --git a/ole/nls/nor.nls b/ole/nls/nor.nls
index 90e44fd..2727ae6 100644
--- a/ole/nls/nor.nls
+++ b/ole/nls/nor.nls
@@ -4,15 +4,15 @@
  */
 
 /* LOCVAL(LOCALE_ILANGUAGE,"") */
-/* LOCVAL(LOCALE_SLANGUAGE,"") */
-/* LOCVAL(LOCALE_SENGLANGUAGE,"") */
+/* LOCVAL(LOCALE_SLANGUAGE,"Norwegian (Bokm?l)") */
+/* LOCVAL(LOCALE_SENGLANGUAGE,"Norwegian") */
 LOCVAL(LOCALE_SABBREVLANGNAME,"nor")
-/* LOCVAL(LOCALE_SNATIVELANGNAME,"") */
+LOCVAL(LOCALE_SNATIVELANGNAME,"bokm?l")
 /* LOCVAL(LOCALE_ICOUNTRY,"") */
 /* LOCVAL(LOCALE_SCOUNTRY,"") */
-/* LOCVAL(LOCALE_SENGCOUNTRY,"") */
-/* LOCVAL(LOCALE_SABBREVCTRYNAME,"") */
-/* LOCVAL(LOCALE_SNATIVECTRYNAME,"") */
+LOCVAL(LOCALE_SENGCOUNTRY,"Norway")
+LOCVAL(LOCALE_SABBREVCTRYNAME,"NOR")
+LOCVAL(LOCALE_SNATIVECTRYNAME,"Norge")
 /* LOCVAL(LOCALE_IDEFAULTLANGUAGE,"") */
 /* LOCVAL(LOCALE_IDEFAULTCOUNTRY,"") */
 /* LOCVAL(LOCALE_IDEFAULTCODEPAGE) */
@@ -25,12 +25,12 @@
 /* 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_SNATIVEDIGITS, "0123456789")
+LOCVAL(LOCALE_SCURRENCY,"kr")
+LOCVAL(LOCALE_SINTLSYMBOL,"NOK")
+LOCVAL(LOCALE_SMONDECIMALSEP,",")
+LOCVAL(LOCALE_SMONTHOUSANDSEP,".")
+LOCVAL(LOCALE_SMONGROUPING,"3;0")
 /* LOCVAL(LOCALE_ICURRDIGITS,"2") */
 /* LOCVAL(LOCALE_IINTLCURRDIGITS) */
 /* LOCVAL(LOCALE_ICURRENCY,"3") */
@@ -55,49 +55,49 @@
 /* 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_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_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_SMONTHNAME1,"januar")
+LOCVAL(LOCALE_SMONTHNAME2,"februar")
+LOCVAL(LOCALE_SMONTHNAME3,"mars")
+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,"desember")
+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_SABBREVMONTHNAME1,"jan")
+LOCVAL(LOCALE_SABBREVMONTHNAME2,"feb")
+LOCVAL(LOCALE_SABBREVMONTHNAME3,"mar")
+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,"des")
+LOCVAL(LOCALE_SABBREVMONTHNAME13,"")
 
 /* LOCVAL(LOCALE_SPOSITIVESIGN, "") */
 /* LOCVAL(LOCALE_SNEGATIVESIGN, "") */
@@ -108,3 +108,4 @@
 /* LOCVAL(LOCALE_INEGSYMPRECEDES, "") */
 /* LOCVAL(LOCALE_INEGSEPBYSPACE, "") */
 
+/* gregoriansk kalender */
diff --git a/ole/nls/plk.nls b/ole/nls/plk.nls
index 7474c88..5d86184 100644
--- a/ole/nls/plk.nls
+++ b/ole/nls/plk.nls
@@ -11,7 +11,7 @@
 LOCVAL(LOCALE_ICOUNTRY,"49")
 LOCVAL(LOCALE_SCOUNTRY,"Polska")
 LOCVAL(LOCALE_SENGCOUNTRY,"Poland")
-LOCVAL(LOCALE_SABBREVCTRYNAME,"Pl")
+LOCVAL(LOCALE_SABBREVCTRYNAME,"PLZ")
 LOCVAL(LOCALE_SNATIVECTRYNAME,"Polska")
 LOCVAL(LOCALE_IDEFAULTLANGUAGE,"9")
 LOCVAL(LOCALE_IDEFAULTCOUNTRY,"49")
@@ -25,12 +25,12 @@
 LOCVAL(LOCALE_IDIGITS,"2")
 LOCVAL(LOCALE_ILZERO,"1")
 /* LOCVAL(LOCALE_INEGNUMBER) */
-/* LOCVAL(LOCALE_SNATIVEDIGITS) */
+LOCVAL(LOCALE_SNATIVEDIGITS,"0123456789")
 LOCVAL(LOCALE_SCURRENCY,"z\xB3")
 /* LOCVAL(LOCALE_SINTLSYMBOL) */
 /* LOCVAL(LOCALE_SMONDECIMALSEP) */
 /* LOCVAL(LOCALE_SMONTHOUSANDSEP) */
-/* LOCVAL(LOCALE_SMONGROUPING) */
+LOCVAL(LOCALE_SMONGROUPING,"3;0")
 LOCVAL(LOCALE_ICURRDIGITS,"2")
 /* LOCVAL(LOCALE_IINTLCURRDIGITS) */
 LOCVAL(LOCALE_ICURRENCY,"3")
@@ -107,3 +107,5 @@
 /* LOCVAL(LOCALE_IPOSSEPBYSPACE) */
 /* LOCVAL(LOCALE_INEGSYMPRECEDES) */
 /* LOCVAL(LOCALE_INEGSEPBYSPACE) */
+
+/* kalendarz gregoria?dski */
diff --git a/ole/nls/ptb.nls b/ole/nls/ptb.nls
index e60c91e..d9ffc3a 100644
--- a/ole/nls/ptb.nls
+++ b/ole/nls/ptb.nls
@@ -15,7 +15,7 @@
 LOCVAL(LOCALE_SNATIVECTRYNAME, "Brasil")
 LOCVAL(LOCALE_IDEFAULTLANGUAGE, "0409")
 LOCVAL(LOCALE_IDEFAULTCOUNTRY, "1")
-LOCVAL(LOCALE_IDEFAULTCODEPAGE, "437")
+LOCVAL(LOCALE_IDEFAULTCODEPAGE, "850")
 LOCVAL(LOCALE_IDEFAULTANSICODEPAGE, "1252")
 LOCVAL(LOCALE_SLIST, ";")
 LOCVAL(LOCALE_IMEASURE, "1")
@@ -27,7 +27,7 @@
 LOCVAL(LOCALE_INEGNUMBER, "1")
 LOCVAL(LOCALE_SNATIVEDIGITS, "0123456789")
 LOCVAL(LOCALE_SCURRENCY, "$")
-LOCVAL(LOCALE_SINTLSYMBOL, "USD")
+LOCVAL(LOCALE_SINTLSYMBOL, "BRC")
 LOCVAL(LOCALE_SMONDECIMALSEP, ",")
 LOCVAL(LOCALE_SMONTHOUSANDSEP, ".")
 LOCVAL(LOCALE_SMONGROUPING, "3;0")
@@ -55,11 +55,11 @@
 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_SDAYNAME1, "Segunda-feira")
+LOCVAL(LOCALE_SDAYNAME2, "Ter\347a-feira")
+LOCVAL(LOCALE_SDAYNAME3, "Quarta-feira")
+LOCVAL(LOCALE_SDAYNAME4, "Quinta-feira")
+LOCVAL(LOCALE_SDAYNAME5, "Sexta-feira")
 LOCVAL(LOCALE_SDAYNAME6, "S\341bado")
 LOCVAL(LOCALE_SDAYNAME7, "Domingo")
 
@@ -107,3 +107,5 @@
 LOCVAL(LOCALE_IPOSSEPBYSPACE, "0")
 LOCVAL(LOCALE_INEGSYMPRECEDES, "1")
 LOCVAL(LOCALE_INEGSEPBYSPACE, "0")
+
+/* Calend?rio gregoriano */
diff --git a/ole/nls/ptg.nls b/ole/nls/ptg.nls
index ac429d4..9dfd6c8 100644
--- a/ole/nls/ptg.nls
+++ b/ole/nls/ptg.nls
@@ -15,7 +15,7 @@
 LOCVAL(LOCALE_SNATIVECTRYNAME, "Portugal")
 LOCVAL(LOCALE_IDEFAULTLANGUAGE, "0409")
 LOCVAL(LOCALE_IDEFAULTCOUNTRY, "1")
-LOCVAL(LOCALE_IDEFAULTCODEPAGE, "437")
+LOCVAL(LOCALE_IDEFAULTCODEPAGE, "850")
 LOCVAL(LOCALE_IDEFAULTANSICODEPAGE, "1252")
 LOCVAL(LOCALE_SLIST, ";")
 LOCVAL(LOCALE_IMEASURE, "1")
diff --git a/ole/nls/rom.nls b/ole/nls/rom.nls
index 9caabf7..85c13a7 100644
--- a/ole/nls/rom.nls
+++ b/ole/nls/rom.nls
@@ -5,13 +5,13 @@
 
 /* LOCVAL(LOCALE_ILANGUAGE,"") */
 /* LOCVAL(LOCALE_SLANGUAGE,"") */
-/* LOCVAL(LOCALE_SENGLANGUAGE,"") */
+/* LOCVAL(LOCALE_SENGLANGUAGE,"Romanian") */
 LOCVAL(LOCALE_SABBREVLANGNAME,"rom")
 /* LOCVAL(LOCALE_SNATIVELANGNAME,"") */
 /* LOCVAL(LOCALE_ICOUNTRY,"") */
 /* LOCVAL(LOCALE_SCOUNTRY,"") */
-/* LOCVAL(LOCALE_SENGCOUNTRY,"") */
-/* LOCVAL(LOCALE_SABBREVCTRYNAME,"") */
+LOCVAL(LOCALE_SENGCOUNTRY,"Romania")
+LOCVAL(LOCALE_SABBREVCTRYNAME,"ROM")
 /* LOCVAL(LOCALE_SNATIVECTRYNAME,"") */
 /* LOCVAL(LOCALE_IDEFAULTLANGUAGE,"") */
 /* LOCVAL(LOCALE_IDEFAULTCOUNTRY,"") */
@@ -25,12 +25,12 @@
 /* LOCVAL(LOCALE_IDIGITS,"2") */
 /* LOCVAL(LOCALE_ILZERO,"1") */
 /* LOCVAL(LOCALE_INEGNUMBER) */
-/* LOCVAL(LOCALE_SNATIVEDIGITS) */
-/* LOCVAL(LOCALE_SCURRENCY,"") */
-/* LOCVAL(LOCALE_SINTLSYMBOL) */
+LOCVAL(LOCALE_SNATIVEDIGITS,"0123456789")
+LOCVAL(LOCALE_SCURRENCY,"LEI")
+LOCVAL(LOCALE_SINTLSYMBOL,"ROL)
 /* LOCVAL(LOCALE_SMONDECIMALSEP,",") */
 /* LOCVAL(LOCALE_SMONTHOUSANDSEP,".") */
-/* LOCVAL(LOCALE_SMONGROUPING) */
+LOCVAL(LOCALE_SMONGROUPING,"3;0")
 /* LOCVAL(LOCALE_ICURRDIGITS,"2") */
 /* LOCVAL(LOCALE_IINTLCURRDIGITS) */
 /* LOCVAL(LOCALE_ICURRENCY,"3") */
@@ -55,49 +55,49 @@
 /* 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_SDAYNAME1,"luni")
+LOCVAL(LOCALE_SDAYNAME2,"marci")
+LOCVAL(LOCALE_SDAYNAME3,"miercuri")
+LOCVAL(LOCALE_SDAYNAME4,"joi")
+LOCVAL(LOCALE_SDAYNAME5,"vineri")
+LOCVAL(LOCALE_SDAYNAME6,"s?mb?t")
+LOCVAL(LOCALE_SDAYNAME7,"duminic?")
 
-/* 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_SABBREVDAYNAME1,"L?")
+LOCVAL(LOCALE_SABBREVDAYNAME2,"Ma")
+LOCVAL(LOCALE_SABBREVDAYNAME3,"Mi")
+LOCVAL(LOCALE_SABBREVDAYNAME4,"J?")
+LOCVAL(LOCALE_SABBREVDAYNAME5,"V?")
+LOCVAL(LOCALE_SABBREVDAYNAME6,"S?")
+LOCVAL(LOCALE_SABBREVDAYNAME7,"D?")
 
-/* 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_SMONTHNAME1,"ianuarie")
+LOCVAL(LOCALE_SMONTHNAME2,"februarie")
+LOCVAL(LOCALE_SMONTHNAME3,"martie")
+LOCVAL(LOCALE_SMONTHNAME4,"arpilie")
+LOCVAL(LOCALE_SMONTHNAME5,"mai")
+LOCVAL(LOCALE_SMONTHNAME6,"iunie")
+LOCVAL(LOCALE_SMONTHNAME7,"iulie")
+LOCVAL(LOCALE_SMONTHNAME8,"august")
+LOCVAL(LOCALE_SMONTHNAME9,"septembrie")
+LOCVAL(LOCALE_SMONTHNAME10,"octombrie")
+LOCVAL(LOCALE_SMONTHNAME11,"noiembrie")
+LOCVAL(LOCALE_SMONTHNAME12,"decembrie")
+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_SABBREVMONTHNAME1,"Ian")
+LOCVAL(LOCALE_SABBREVMONTHNAME2,"Feb")
+LOCVAL(LOCALE_SABBREVMONTHNAME3,"Mar")
+LOCVAL(LOCALE_SABBREVMONTHNAME4,"Apr")
+LOCVAL(LOCALE_SABBREVMONTHNAME5,"Mai")
+LOCVAL(LOCALE_SABBREVMONTHNAME6,"Iun")
+LOCVAL(LOCALE_SABBREVMONTHNAME7,"Iul")
+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, "") */
@@ -108,3 +108,4 @@
 /* LOCVAL(LOCALE_INEGSYMPRECEDES, "") */
 /* LOCVAL(LOCALE_INEGSEPBYSPACE, "") */
 
+/* Gregorian calendar */
diff --git a/ole/nls/rus.nls b/ole/nls/rus.nls
new file mode 100644
index 0000000..63fb685
--- /dev/null
+++ b/ole/nls/rus.nls
@@ -0,0 +1,110 @@
+/*
+ *	OLE2NLS library
+ *      Russia
+ */
+
+/* LOCVAL(LOCALE_ILANGUAGE,"") */
+/* LOCVAL(LOCALE_SLANGUAGE,"") */
+LOCVAL(LOCALE_SENGLANGUAGE,"Russian")
+LOCVAL(LOCALE_SABBREVLANGNAME,"rus")
+/* LOCVAL(LOCALE_SNATIVELANGNAME,"") */
+/* LOCVAL(LOCALE_ICOUNTRY,"") */
+/* LOCVAL(LOCALE_SCOUNTRY,"") */
+LOCVAL(LOCALE_SENGCOUNTRY,"Russia")
+/* 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,"0123456789")
+/* LOCVAL(LOCALE_SCURRENCY,"") */
+LOCVAL(LOCALE_SINTLSYMBOL,"RUR")
+/* 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,"") */
+/* LOCVAL(LOCALE_SDAYNAME2,"") */
+/* LOCVAL(LOCALE_SDAYNAME3,"") */
+/* LOCVAL(LOCALE_SDAYNAME4,"") */
+/* LOCVAL(LOCALE_SDAYNAME5,"") */
+/* LOCVAL(LOCALE_SDAYNAME6,"") */
+/* LOCVAL(LOCALE_SDAYNAME7,"") */
+
+/* LOCVAL(LOCALE_SABBREVDAYNAME1,"") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME2,"") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME3,"") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME4,"") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME5,"") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME6,"") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME7,"") */
+
+/* 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
index 4d8af3a..d6f9d88 100644
--- a/ole/nls/sky.nls
+++ b/ole/nls/sky.nls
@@ -63,13 +63,13 @@
 /* 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_SABBREVDAYNAME1,"") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME2,"") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME3,"") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME4,"") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME5,"") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME6,"") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME7,"") */
 
 /* LOCVAL(LOCALE_SMONTHNAME1,"") */
 /* LOCVAL(LOCALE_SMONTHNAME2,"") */
diff --git a/ole/nls/slv.nls b/ole/nls/slv.nls
index 374062a..6fcd1c0 100644
--- a/ole/nls/slv.nls
+++ b/ole/nls/slv.nls
@@ -63,13 +63,13 @@
 /* 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_SABBREVDAYNAME1,"") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME2,"") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME3,"") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME4,"") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME5,"") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME6,"") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME7,"") */
 
 /* LOCVAL(LOCALE_SMONTHNAME1,"") */
 /* LOCVAL(LOCALE_SMONTHNAME2,"") */
diff --git a/ole/nls/sqi.nls b/ole/nls/sqi.nls
new file mode 100644
index 0000000..411c719
--- /dev/null
+++ b/ole/nls/sqi.nls
@@ -0,0 +1,111 @@
+/*
+ *	OLE2NLS library
+ *      Albania
+ */
+
+/* LOCVAL(LOCALE_ILANGUAGE,"") */
+/* LOCVAL(LOCALE_SLANGUAGE,"") */
+LOCVAL(LOCALE_SENGLANGUAGE,"Albanian")
+LOCVAL(LOCALE_SABBREVLANGNAME,"sqi")
+/* LOCVAL(LOCALE_SNATIVELANGNAME,"Shqip?ria") */
+/* 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,"0123456789")
+/* LOCVAL(LOCALE_SCURRENCY,"") */
+/* LOCVAL(LOCALE_SINTLSYMBOL) */
+/* 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,"") */
+/* LOCVAL(LOCALE_SDAYNAME2,"") */
+/* LOCVAL(LOCALE_SDAYNAME3,"") */
+/* LOCVAL(LOCALE_SDAYNAME4,"") */
+/* LOCVAL(LOCALE_SDAYNAME5,"") */
+/* LOCVAL(LOCALE_SDAYNAME6,"") */
+/* LOCVAL(LOCALE_SDAYNAME7,"") */
+
+/* LOCVAL(LOCALE_SABBREVDAYNAME1,"") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME2,"") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME3,"") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME4,"") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME5,"") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME6,"") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME7,"") */
+
+/* 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, "") */
+
+/* Gregorian Calendar */
diff --git a/ole/nls/srb.nls b/ole/nls/srb.nls
index ecaaa18..16fd09e 100644
--- a/ole/nls/srb.nls
+++ b/ole/nls/srb.nls
@@ -63,13 +63,13 @@
 /* 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_SABBREVDAYNAME1,"") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME2,"") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME3,"") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME4,"") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME5,"") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME6,"") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME7,"") */
 
 /* LOCVAL(LOCALE_SMONTHNAME1,"") */
 /* LOCVAL(LOCALE_SMONTHNAME2,"") */
diff --git a/ole/nls/srl.nls b/ole/nls/srl.nls
new file mode 100644
index 0000000..ae4bb7d
--- /dev/null
+++ b/ole/nls/srl.nls
@@ -0,0 +1,110 @@
+/*
+ *	OLE2NLS library
+ *      Serbian (Latin)
+ */
+
+/* LOCVAL(LOCALE_ILANGUAGE,"") */
+/* LOCVAL(LOCALE_SLANGUAGE,"") */
+/* LOCVAL(LOCALE_SENGLANGUAGE,"") */
+LOCVAL(LOCALE_SABBREVLANGNAME,"srl")
+/* 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,"") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME2,"") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME3,"") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME4,"") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME5,"") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME6,"") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME7,"") */
+
+/* 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/svf.nls b/ole/nls/svf.nls
new file mode 100644
index 0000000..c517775
--- /dev/null
+++ b/ole/nls/svf.nls
@@ -0,0 +1,111 @@
+/*
+ *	OLE2NLS library
+ *      Finland (Swedish)
+ */
+
+LOCVAL(LOCALE_ILANGUAGE,"1d")
+LOCVAL(LOCALE_SLANGUAGE,"Svenska")
+LOCVAL(LOCALE_SENGLANGUAGE,"Swedish (Finland)")
+LOCVAL(LOCALE_SABBREVLANGNAME,"sve")
+LOCVAL(LOCALE_SNATIVELANGNAME,"Svenska")
+LOCVAL(LOCALE_ICOUNTRY,"45")
+LOCVAL(LOCALE_SCOUNTRY,"SWE")
+LOCVAL(LOCALE_SENGCOUNTRY,"Finland")
+LOCVAL(LOCALE_SABBREVCTRYNAME,"FIN")
+LOCVAL(LOCALE_SNATIVECTRYNAME,"Finland")
+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,"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, "")
+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")
+
+/* gregoriansk kalender */
diff --git a/ole/nls/trk.nls b/ole/nls/trk.nls
index 3a6b7c9..d90462b 100644
--- a/ole/nls/trk.nls
+++ b/ole/nls/trk.nls
@@ -63,13 +63,13 @@
 /* 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_SABBREVDAYNAME1,"") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME2,"") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME3,"") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME4,"") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME5,"") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME6,"") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME7,"") */
 
 /* LOCVAL(LOCALE_SMONTHNAME1,"") */
 /* LOCVAL(LOCALE_SMONTHNAME2,"") */
diff --git a/ole/nls/ukr.nls b/ole/nls/ukr.nls
index 0d65b28..b1e8b42 100644
--- a/ole/nls/ukr.nls
+++ b/ole/nls/ukr.nls
@@ -63,13 +63,13 @@
 /* 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_SABBREVDAYNAME1,"") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME2,"") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME3,"") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME4,"") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME5,"") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME6,"") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME7,"") */
 
 /* LOCVAL(LOCALE_SMONTHNAME1,"") */
 /* LOCVAL(LOCALE_SMONTHNAME2,"") */
diff --git a/ole/nls/zhh.nls b/ole/nls/zhh.nls
new file mode 100644
index 0000000..65c8c63
--- /dev/null
+++ b/ole/nls/zhh.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,"zhh")
+/* 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,"") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME2,"") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME3,"") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME4,"") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME5,"") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME6,"") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME7,"") */
+
+/* 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/zhi.nls b/ole/nls/zhi.nls
new file mode 100644
index 0000000..f427ef4
--- /dev/null
+++ b/ole/nls/zhi.nls
@@ -0,0 +1,110 @@
+/*
+ *	OLE2NLS library
+ *      Chinese (Singapore)
+ */
+
+/* LOCVAL(LOCALE_ILANGUAGE,"") */
+/* LOCVAL(LOCALE_SLANGUAGE,"") */
+LOCVAL(LOCALE_SENGLANGUAGE,"Chinese (Singapore)")
+LOCVAL(LOCALE_SABBREVLANGNAME,"zhi")
+/* LOCVAL(LOCALE_SNATIVELANGNAME,"") */
+/* LOCVAL(LOCALE_ICOUNTRY,"") */
+/* LOCVAL(LOCALE_SCOUNTRY,"") */
+/* LOCVAL(LOCALE_SENGCOUNTRY,"") */
+LOCVAL(LOCALE_SABBREVCTRYNAME,"SGP")
+/* 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, "0123456789")
+LOCVAL(LOCALE_SCURRENCY,"$")
+LOCVAL(LOCALE_SINTLSYMBOL,"SGD")
+/* 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,"") */
+/* LOCVAL(LOCALE_SDAYNAME2,"") */
+/* LOCVAL(LOCALE_SDAYNAME3,"") */
+/* LOCVAL(LOCALE_SDAYNAME4,"") */
+/* LOCVAL(LOCALE_SDAYNAME5,"") */
+/* LOCVAL(LOCALE_SDAYNAME6,"") */
+/* LOCVAL(LOCALE_SDAYNAME7,"") */
+
+/* LOCVAL(LOCALE_SABBREVDAYNAME1,"") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME2,"") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME3,"") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME4,"") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME5,"") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME6,"") */
+/* LOCVAL(LOCALE_SABBREVDAYNAME7,"") */
+
+/* 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/zhs.nls b/ole/nls/zhs.nls
new file mode 100644
index 0000000..89fb2fe
--- /dev/null
+++ b/ole/nls/zhs.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,"zhs")
+/* 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, "0123456789")
+/* 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 0815d96..bf4b732 100644
--- a/ole/ole2nls.c
+++ b/ole/ole2nls.c
@@ -2551,27 +2551,57 @@
 		 LPCSTR format,      /* in  */
 		 LPSTR timestr,      /* out */
 		 INT32 timelen       /* in  */) 
-{
-   LPCSTR realformat;
-   char fmt_buf[40];
-   
-   TRACE(ole,"GetTimeFormat(0x%04lx,0x%08lx,%p,%s,%p,%d)\n",
-	 locale,flags,xtime,format,timestr,timelen);
-   
-   if (format) {
-      realformat = format;
-   } else if (locale) {
-      GetLocaleInfo32A(locale, LOCALE_STIMEFORMAT,
-		       fmt_buf,  sizeof(fmt_buf));
-      realformat = fmt_buf;
-   } else {
-      WARN(ole, "Caller gave no locale and no format\n");
-      realformat = "hh:mm:ss";
-   };
-   if (!locale) {
-      locale = GetSystemDefaultLCID();
-   }
-   return OLE_GetFormatA(locale, flags, xtime, realformat, timestr, timelen);
+{ char format_buf[40];
+  LPCSTR thisformat;
+  SYSTEMTIME t;
+  LPSYSTEMTIME thistime;
+  LCID thislocale=0;
+  DWORD thisflags=LOCALE_STIMEFORMAT; /* standart timeformat */;
+  
+  TRACE(ole,"GetTimeFormat(0x%04lx,0x%08lx,%p,%s,%p,%d)\n",locale,flags,xtime,format,timestr,timelen);
+  if (!locale) 
+  { locale = LOCALE_SYSTEM_DEFAULT;
+  }
+  
+  if (locale == LOCALE_SYSTEM_DEFAULT) 
+  { thislocale = GetSystemDefaultLCID();
+  } 
+  else if (locale == LOCALE_USER_DEFAULT) 
+  { thislocale = GetUserDefaultLCID();
+	}
+  else
+  { thislocale = locale;
+  }
+  if (format == NULL) 
+  { if (flags&LOCALE_NOUSEROVERRIDE)  /*use system default*/
+    { thislocale = GetSystemDefaultLCID();
+    }
+    switch (flags)
+    { case TIME_NOSECONDS:
+        FIXME(ole,"TIME_NOSECONDS not yet implemented");
+        break;
+      case TIME_NOMINUTESORSECONDS:
+        FIXME(ole,"TIME_NOMINUTESORSECONDS not yet implemented");
+       break;
+    }   
+    GetLocaleInfo32A(thislocale, thisflags, format_buf,sizeof(format_buf));
+    thisformat = format_buf;
+  }
+  else 
+  { thisformat = format;
+  }
+  
+  if (!locale) 
+  {  locale = GetSystemDefaultLCID();
+  }
+  if (xtime == NULL) /* NULL means use the current local time*/
+  { GetSystemTime(&t);
+    thistime = &t;
+  } 
+  else
+  { thistime = xtime;
+  }
+  return OLE_GetFormatA(thislocale, thisflags, thistime, thisformat,timestr, timelen);
 }
 
 
diff --git a/programs/clock/ChangeLog b/programs/clock/ChangeLog
index 5906d79..aecc457 100644
--- a/programs/clock/ChangeLog
+++ b/programs/clock/ChangeLog
@@ -1,8 +1,13 @@
+Sun Jul  5 20:10:53 1998  Marcel Baur <mbaur@g26.ethz.ch>
+       * Moved "Always on top" menu into system menu (as in Windows)
+         This required minor changes in 
+         [main.h] [clock.rc] [language.c] [??.rc]
+
 Fri Jun 12 22:47:56 1998  Marcel Baur <mbaur@g26.ethz.ch>
        * Fixed resource bug in UpdateWindowCaption() that caused wrong (old)
          locale for the displayed date
        * The digital clock now shows up (WINE-NLS-UNKNOWN means that there
-         is no locale rule for time string format in /ole/winnls.c)
+         is no locale rule for time string format in /ole/ole2nls.c)
 
 Thu May 28 20:42:13 1998  Marcel Baur <mbaur@g26.ethz.ch>
        * [language.c]
@@ -36,5 +41,3 @@
          [main.c] [main.h] [winclock.c] [winclock.h]
 
          Originals by Marcel Baur
-
-
diff --git a/programs/clock/Da.rc b/programs/clock/Da.rc
index e53c30c..8f32433 100644
--- a/programs/clock/Da.rc
+++ b/programs/clock/Da.rc
@@ -6,27 +6,35 @@
 
 #define LANGUAGE_ID                  Da
 #define LANGUAGE_NUMBER              6
-#define LANGUAGE_MENU_ITEM           "&Dansk"
 
-/* Menu */
+
+/* System Menu */
+
+#define MENU_ON_TOP                  "&Altid øverst"
+
+
+/* Window Menu */
 
 #define MENU_PROPERTIES              "&Instillinger"
 #define MENU_ANALOG                  "&Analog"
 #define MENU_DIGITAL                 "&Digital"
 #define MENU_FONT                    "&Skrifttype..."
 #define MENU_WITHOUT_TITLE           "Skjul Titel&linje"
-#define MENU_ON_TOP                  "&Altid øverst"
+
 #define MENU_SECONDS                 "Se&kunder"
 #define MENU_DATE                    "Da&to"
 
 #define MENU_LANGUAGE                "S&prog"
+#define LANGUAGE_MENU_ITEM           "&Dansk"
 
 #define MENU_INFO                    "Inf&o..."
 #define MENU_INFO_LICENSE            "&Licens"
 #define MENU_INFO_NO_WARRANTY        "&NO WARRANTY"
 #define MENU_INFO_ABOUT_WINE         "&Om Ur..."
 
-/* Strings */
+
+/* Window Caption */
+
 #define STRING_CLOCK                 "Ur"
 
 
diff --git a/programs/clock/De.rc b/programs/clock/De.rc
index ab1371e..0cbbdbf 100644
--- a/programs/clock/De.rc
+++ b/programs/clock/De.rc
@@ -7,27 +7,35 @@
 
 #define LANGUAGE_ID                  De
 #define LANGUAGE_NUMBER              2
-#define LANGUAGE_MENU_ITEM           "&Deutsch"
 
-/* Menu */
+
+/* System Menu */
+
+#define MENU_ON_TOP                  "&Immer im Vordergrund"
+
+
+/* Window Menu */
 
 #define MENU_PROPERTIES              "&Einstellungen"
 #define MENU_ANALOG                  "Ana&log"
 #define MENU_DIGITAL                 "Digi&tal"
 #define MENU_FONT                    "Schrift&art..."
 #define MENU_WITHOUT_TITLE           "&Ohne Titelleiste"
-#define MENU_ON_TOP                  "&Immer im Vordergrund"
+
 #define MENU_SECONDS                 "&Sekunden"
 #define MENU_DATE                    "&Datum"
 
 #define MENU_LANGUAGE                "&Sprache"
+#define LANGUAGE_MENU_ITEM           "&Deutsch"
 
 #define MENU_INFO                    "Inf&o..."
 #define MENU_INFO_LICENSE            "&Lizenz"
 #define MENU_INFO_NO_WARRANTY        "&KEINE GARANTIE"
 #define MENU_INFO_ABOUT_WINE         "&Über Uhr..."
 
-/* Strings */
+
+/* Window Caption */
+
 #define STRING_CLOCK                 "Uhr"
 
 #include "clock.rc"
diff --git a/programs/clock/En.rc b/programs/clock/En.rc
index 3330cf7..443e974 100644
--- a/programs/clock/En.rc
+++ b/programs/clock/En.rc
@@ -7,27 +7,32 @@
 
 #define LANGUAGE_ID                  En
 #define LANGUAGE_NUMBER              0
-#define LANGUAGE_MENU_ITEM           "&English"
 
-/* Menu */
+
+/* System Menu */
+
+#define MENU_ON_TOP                  "&Always on Top"
+
+/* Window Menu */
 
 #define MENU_PROPERTIES              "&Properties"
 #define MENU_ANALOG                  "Ana&log"
 #define MENU_DIGITAL                 "Digi&tal"
 #define MENU_FONT                    "&Font..."
 #define MENU_WITHOUT_TITLE           "&Without Titlebar"
-#define MENU_ON_TOP                  "&Always on Top"
+
 #define MENU_SECONDS                 "&Seconds"
 #define MENU_DATE                    "&Date"
 
 #define MENU_LANGUAGE                "&Language"
+#define LANGUAGE_MENU_ITEM           "&English"
 
 #define MENU_INFO                    "Inf&o..."
 #define MENU_INFO_LICENSE            "&License"
 #define MENU_INFO_NO_WARRANTY        "&NO WARRANTY"
 #define MENU_INFO_ABOUT_WINE         "&About Clock..."
 
-/* Strings */
+/* Window Caption */
 #define STRING_CLOCK                 "Clock"
 
 
diff --git a/programs/clock/README b/programs/clock/README
index 296a6a2..880579d 100644
--- a/programs/clock/README
+++ b/programs/clock/README
@@ -10,3 +10,6 @@
 
  Code is currently under heavy construction. Please direct patches and
  additions to my personal email address <mbaur@g26.ethz.ch>
+
+ If you think that the compiled binary is too big, you can reduce its size
+ with the command 'strip clock' (please don't try this on libraries).
diff --git a/programs/clock/Sw.rc b/programs/clock/Sw.rc
index 9e58cc9..02fbf50 100644
--- a/programs/clock/Sw.rc
+++ b/programs/clock/Sw.rc
@@ -2,32 +2,40 @@
  * Clock (Swedish resources)
  *
  * Copyright 1998 Marcel Baur <mbaur@g26.ethz.ch>
- * Translated into swedish by Karl Backström <karl_b@geocities.com> 
+ * Translated into Swedish by Karl Backström <karl_b@geocities.com> 
  */
 
 #define LANGUAGE_ID                  Sw
 #define LANGUAGE_NUMBER              1d
-#define LANGUAGE_MENU_ITEM           "&Svenska"
 
-/* Menu */
+
+/* System Menu */
+
+#define MENU_ON_TOP                  "&Alltid överst"
+
+
+/* Window Menu */
 
 #define MENU_PROPERTIES              "&Egenskaper"
 #define MENU_ANALOG                  "Ana&log"
 #define MENU_DIGITAL                 "Digi&tal"
 #define MENU_FONT                    "&Font..."
 #define MENU_WITHOUT_TITLE           "&Utan Titlebar"
-#define MENU_ON_TOP                  "&Alltid överst"
+
 #define MENU_SECONDS                 "&Sekunder"
 #define MENU_DATE                    "&Datum"
 
 #define MENU_LANGUAGE                "&Språk"
+#define LANGUAGE_MENU_ITEM           "&Svenska"
 
 #define MENU_INFO                    "Inf&o..."
 #define MENU_INFO_LICENSE            "&Licens"
 #define MENU_INFO_NO_WARRANTY        "&INGEN GARANTI"
 #define MENU_INFO_ABOUT_WINE         "&Om Klockan..."
 
-/* Strings */
+
+/* Window Caption */
+
 #define STRING_CLOCK                 "Klockan"
 
 #include "clock.rc"
diff --git a/programs/clock/TODO b/programs/clock/TODO
index f8336f0..63c815f 100644
--- a/programs/clock/TODO
+++ b/programs/clock/TODO
@@ -5,9 +5,6 @@
 - Make "Without Titlebar", Double-clicking the clock should reveal the caption
   again.
 
-- Move the "Without Titlebar" into the System Menu (as in Windows)
-  (Does not work probably due to Winelib)
-
 - Font Handling of Digital Clock.
   (Does not work probably due to Winelib)
 
@@ -17,6 +14,8 @@
 - Fix English translation by comparing strings from an original English
   Windows Clock application (I only have a German version).
 
-- Add new .rc resources for all languages you know.
+- Add new .rc resources for all languages you know. That's in fact very easy. 
+  Just clone the file En.rc, change the strings and submit it. You can find
+  my email address in the README file.
 
 Please don't forget a ChangeLog entry.
diff --git a/programs/clock/clock.rc b/programs/clock/clock.rc
index 756b836..f4169c3 100644
--- a/programs/clock/clock.rc
+++ b/programs/clock/clock.rc
@@ -24,19 +24,18 @@
    MENUITEM SEPARATOR
    MENUITEM MENU_SECONDS,               CL_SECONDS
    MENUITEM MENU_DATE,                  CL_DATE
+ }
+
+ POPUP MENU_LANGUAGE {
+   /* Dummy item, will be removed */
    MENUITEM SEPARATOR
-   MENUITEM MENU_ON_TOP,                CL_ON_TOP
-   }
-   POPUP MENU_LANGUAGE {
-     /* Dummy item, will be removed */
-     MENUITEM SEPARATOR
-   }
+ }
    
-   POPUP MENU_INFO {
-      MENUITEM MENU_INFO_LICENSE,       CL_INFO_LICENSE
-      MENUITEM MENU_INFO_NO_WARRANTY,   CL_INFO_NO_WARRANTY
-      MENUITEM MENU_INFO_ABOUT_WINE,    CL_INFO_ABOUT_WINE
-   }
+ POPUP MENU_INFO {
+   MENUITEM MENU_INFO_LICENSE,       CL_INFO_LICENSE
+   MENUITEM MENU_INFO_NO_WARRANTY,   CL_INFO_NO_WARRANTY
+   MENUITEM MENU_INFO_ABOUT_WINE,    CL_INFO_ABOUT_WINE
+ }
  
 }
 
@@ -51,6 +50,7 @@
 
 #define STRING_LANGUAGE_ID        STRINGIFY(LANGUAGE_ID)
 #define STRING_LANGUAGE_MENU_ITEM LANGUAGE_MENU_ITEM
+#define STRING_MENU_ON_TOP        MENU_ON_TOP
 
 
 STRINGTABLE
@@ -58,4 +58,5 @@
 ADDSTRING(LANGUAGE_ID)
 ADDSTRING(LANGUAGE_MENU_ITEM)
 ADDSTRING(CLOCK)
+ADDSTRING(MENU_ON_TOP)
 }
diff --git a/programs/clock/language.c b/programs/clock/language.c
index a41ae6f..b0137ba 100644
--- a/programs/clock/language.c
+++ b/programs/clock/language.c
@@ -45,7 +45,7 @@
     
     CheckMenuItem(Globals.hPropertiesMenu, CL_WITHOUT_TITLE, MF_BYCOMMAND | \
                  (Globals.bWithoutTitle ? MF_CHECKED : MF_UNCHECKED));
-    CheckMenuItem(Globals.hPropertiesMenu, CL_ON_TOP, MF_BYCOMMAND | \
+    CheckMenuItem(Globals.hSystemMenu, CL_ON_TOP, MF_BYCOMMAND | \
                  (Globals.bAlwaysOnTop ? MF_CHECKED : MF_UNCHECKED));
     CheckMenuItem(Globals.hPropertiesMenu, CL_SECONDS, MF_BYCOMMAND | \
                  (Globals.bSeconds ? MF_CHECKED : MF_UNCHECKED));
@@ -89,11 +89,11 @@
 VOID LANGUAGE_SelectByName(LPCSTR lang)
 {
   INT i;
-  CHAR newlang[3];
+  CHAR szNewLang[3];
 
   for (i = 0; i <= MAX_LANGUAGE_NUMBER; i++)
-    if (LANGUAGE_LoadStringOther(i, IDS_LANGUAGE_ID, newlang, sizeof(newlang)) &&
-        !lstrcmp(lang, newlang))
+    if (LANGUAGE_LoadStringOther(i, IDS_LANGUAGE_ID, szNewLang, 
+                sizeof(szNewLang)) && !lstrcmp(lang, szNewLang))
       {
         LANGUAGE_SelectByNumber(i);
         return;
@@ -101,33 +101,33 @@
 
   /* Fallback */
     for (i = 0; i <= MAX_LANGUAGE_NUMBER; i++)
-    if (LANGUAGE_LoadStringOther(i, IDS_LANGUAGE_ID, newlang, sizeof(newlang)))
+    if (LANGUAGE_LoadStringOther(i, IDS_LANGUAGE_ID, szNewLang, sizeof(szNewLang)))
       {
         LANGUAGE_SelectByNumber(i);
         return;
       }
 
-  MessageBox(Globals.hMainWnd, "No language found", "FATAL ERROR", MB_OK);
-  PostQuitMessage(1);
+    MessageBox(Globals.hMainWnd, "No language found", "FATAL ERROR", MB_OK);
+    PostQuitMessage(1);
 }
 
 VOID LANGUAGE_SelectByNumber(UINT num)
 {
   INT    i;
-  CHAR   lang[3];
+  CHAR   szLanguage[3];
 
-  CHAR   item[MAX_STRING_LEN];
+  CHAR   szItem[MAX_STRING_LEN];
   HMENU  hMainMenu;
 
   /* Select string table */
   Globals.wStringTableOffset = num * 0x100;
 
   /* Get Language id */
-  LoadString(Globals.hInstance, IDS_LANGUAGE_ID, lang, sizeof(lang));
-  Globals.lpszLanguage = lang;
+  LoadString(Globals.hInstance, IDS_LANGUAGE_ID, szLanguage, sizeof(szLanguage));
+  Globals.lpszLanguage = szLanguage;
 
   /* Change Resource names */
-  lstrcpyn(STRING_MENU_Xx + sizeof(STRING_MENU_Xx) - 3, lang, 3);
+  lstrcpyn(STRING_MENU_Xx + sizeof(STRING_MENU_Xx) - 3, szLanguage, 3);
 
   /* Create menu */
   hMainMenu = LoadMenu(Globals.hInstance, STRING_MENU_Xx);
@@ -139,9 +139,10 @@
   RemoveMenu(Globals.hLanguageMenu, 0, MF_BYPOSITION);
   /* Add language items */
   for (i = 0; i <= MAX_LANGUAGE_NUMBER; i++)
-    if (LANGUAGE_LoadStringOther(i, IDS_LANGUAGE_MENU_ITEM, item, sizeof(item)))
-      AppendMenu(Globals.hLanguageMenu, MF_STRING | MF_BYCOMMAND,
-                 CL_FIRST_LANGUAGE + i, item);
+    if (LANGUAGE_LoadStringOther(i, IDS_LANGUAGE_MENU_ITEM, szItem, sizeof(szItem)))
+             AppendMenu(Globals.hLanguageMenu, MF_STRING | MF_BYCOMMAND,
+                        CL_FIRST_LANGUAGE + i, szItem);
+  EnableMenuItem(Globals.hLanguageMenu, CL_FIRST_LANGUAGE + num, MF_BYCOMMAND | MF_CHECKED);
 
   SetMenu(Globals.hMainWnd, hMainMenu);
 
@@ -151,14 +152,21 @@
 
 #ifdef WINELIB
   /* Update system menus */
-  for (i = 0; Languages[i].name && lstrcmp(lang, Languages[i].name);) i++;
+  for (i = 0; Languages[i].name && lstrcmp(szLanguage, Languages[i].name);) i++;
   if (Languages[i].name) Options.language = i;
 #endif
 
-   /* specific for Clock: */
+  /* specific for Clock: */
 
-   LANGUAGE_UpdateMenuCheckmarks();
-   LANGUAGE_UpdateWindowCaption();   
+  LANGUAGE_UpdateMenuCheckmarks();
+  LANGUAGE_UpdateWindowCaption();   
+
+  Globals.hSystemMenu = GetSystemMenu(Globals.hMainWnd, TRUE);
+
+  /* FIXME: Append a SEPARATOR to Globals.hSystemMenu here */
+
+  LoadString(Globals.hInstance, IDS_MENU_ON_TOP, szItem, sizeof(szItem));
+  AppendMenu(Globals.hSystemMenu, MF_STRING | MF_BYCOMMAND, 1000, szItem);
 }
 
 VOID LANGUAGE_DefaultHandle(WPARAM wParam)
@@ -181,7 +189,8 @@
                                   sizeof(szBuffer));       
         Globals.lpszLanguage = LocalLock(LocalAlloc(LMEM_FIXED, lstrlen(szBuffer)));
 
-        hmemcpy(Globals.lpszLanguage, szBuffer, 1+lstrlen(szBuffer)); 
+//        hmemcpy(Globals.lpszLanguage, szBuffer, 1+lstrlen(szBuffer)); 
+        lstrcpyn(Globals.lpszLanguage, szBuffer, strlen(szBuffer)+1); 
   }
 }
 
diff --git a/programs/clock/license.c b/programs/clock/license.c
index 095da57..adfd586 100644
--- a/programs/clock/license.c
+++ b/programs/clock/license.c
@@ -11,23 +11,23 @@
 static LICENSE* SelectLanguage(LPCSTR Language)
 {
 /*
-  if (!lstrcmp(Language, "Ca")) return(&WineLicense_Ca);
-  if (!lstrcmp(Language, "Cz")) return(&WineLicense_Cz);
-  if (!lstrcmp(Language, "Da")) return(&WineLicense_Da);
-  if (!lstrcmp(Language, "De")) return(&WineLicense_De);
-  if (!lstrcmp(Language, "En")) return(&WineLicense_En);
-  if (!lstrcmp(Language, "Eo")) return(&WineLicense_Eo);
-  if (!lstrcmp(Language, "Es")) return(&WineLicense_Es);
-  if (!lstrcmp(Language, "Fi")) return(&WineLicense_Fi);
-  if (!lstrcmp(Language, "Fr")) return(&WineLicense_Fr);
-  if (!lstrcmp(Language, "Hu")) return(&WineLicense_Hu);
-  if (!lstrcmp(Language, "It")) return(&WineLicense_It);
-  if (!lstrcmp(Langauge, "Ko")) return(&WineLicense_Ko);
-  if (!lstrcmp(Language, "No")) return(&WineLicense_No);
-  if (!lstrcmp(Language, "Pl")) return(&WineLicense_Pl);
-  if (!lstrcmp(Language, "Po")) return(&WineLicense_Po);
-  if (!lstrcmp(Language, "Sw")) return(&WineLicense_Sw); 
-  if (!lstrcmp(Language, "Va")) return(&WineLicense_Va);
+  if (lstrcmp(Language, "Ca")) return(&WineLicense_Ca);
+  if (lstrcmp(Language, "Cz")) return(&WineLicense_Cz);
+  if (lstrcmp(Language, "Da")) return(&WineLicense_Da);
+  if (lstrcmp(Language, "De")) return(&WineLicense_De);
+  if (lstrcmp(Language, "En")) return(&WineLicense_En);
+  if (lstrcmp(Language, "Eo")) return(&WineLicense_Eo);
+  if (lstrcmp(Language, "Es")) return(&WineLicense_Es);
+  if (lstrcmp(Language, "Fi")) return(&WineLicense_Fi);
+  if (lstrcmp(Language, "Fr")) return(&WineLicense_Fr);
+  if (lstrcmp(Language, "Hu")) return(&WineLicense_Hu);
+  if (lstrcmp(Language, "It")) return(&WineLicense_It);
+  if (lstrcmp(Langauge, "Ko")) return(&WineLicense_Ko);
+  if (lstrcmp(Language, "No")) return(&WineLicense_No);
+  if (lstrcmp(Language, "Pl")) return(&WineLicense_Pl);
+  if (lstrcmp(Language, "Po")) return(&WineLicense_Po);
+  if (lstrcmp(Language, "Sw")) return(&WineLicense_Sw); 
+  if (lstrcmp(Language, "Va")) return(&WineLicense_Va);
 */
   return(&WineLicense_En);
 }
@@ -49,4 +49,3 @@
   MessageBox(Wnd, License->Warranty, License->WarrantyCaption,
              MB_ICONEXCLAMATION | MB_OK);
 }
-
diff --git a/programs/clock/main.c b/programs/clock/main.c
index e5c6591..42d5f37 100644
--- a/programs/clock/main.c
+++ b/programs/clock/main.c
@@ -112,10 +112,10 @@
         font.lpfnHook        = 0;
         font.lpTemplateName  = 0;
         font.hInstance       = Globals.hInstance;
-        font.lpszStyle       = LF_FACESIZE;
+//        font.lpszStyle       = LF_FACESIZE;
         font.nFontType       = 0;
         font.nSizeMin        = 0;
-        font.nSizeMax        = 0;
+        font.nSizeMax        = 144;
 
         if (ChooseFont(&font)) {
             /* do nothing yet */
@@ -203,8 +203,8 @@
     MSG      msg;
     WNDCLASS class;
     
-    char className[] = "CLClass";  /* To make sure className >= 0x10000 */
-    char winName[]   = "Clock";
+    char szClassName[] = "CLClass";  /* To make sure className >= 0x10000 */
+    char szWinName[]   = "Clock";
 
     #if defined(WINELIB) && !defined(HAVE_WINE_CONSTRUCTOR)
       /* Register resources */
@@ -239,29 +239,18 @@
 	class.hCursor       = LoadCursor (0, IDC_ARROW);
 	class.hbrBackground = GetStockObject (GRAY_BRUSH);
 	class.lpszMenuName  = 0;
-	class.lpszClassName = className;
+	class.lpszClassName = szClassName;
     }
 
     if (!RegisterClass (&class)) return FALSE;
 
-    Globals.hMainWnd = CreateWindow (className, winName, WS_OVERLAPPEDWINDOW,
-			CW_USEDEFAULT, 0, CW_USEDEFAULT, Globals.MaxX, Globals.MaxY, 
-			LoadMenu(Globals.hInstance, STRING_MENU_Xx),
-			Globals.hInstance, 0);
+    Globals.hMainWnd = CreateWindow (szClassName, szWinName, WS_OVERLAPPEDWINDOW,
+        CW_USEDEFAULT, 0, CW_USEDEFAULT, Globals.MaxX, Globals.MaxY, 
+        LoadMenu(Globals.hInstance, STRING_MENU_Xx), Globals.hInstance, 0);
 			
     LANGUAGE_SelectByName(Globals.lpszLanguage);
     SetMenu(Globals.hMainWnd, Globals.hMainMenu);
 
-    Globals.hSystemMenu = GetSystemMenu(Globals.hMainWnd, TRUE);
-
-    /*
-        FIXME: The next few lines are an attempt to add a menu item to the 
-               window system menu. 
-    */
-    
-    AppendMenu(Globals.hSystemMenu, MF_STRING | MF_BYCOMMAND, 1000, "item");
-    SetSystemMenu(Globals.hMainWnd, Globals.hSystemMenu);
-
     LANGUAGE_UpdateMenuCheckmarks();
 
     ShowWindow (Globals.hMainWnd, show);
diff --git a/programs/clock/main.h b/programs/clock/main.h
index 6efaf77..221b165 100644
--- a/programs/clock/main.h
+++ b/programs/clock/main.h
@@ -63,23 +63,25 @@
 #define IDS_LANGUAGE_ID                STRINGID(00)
 #define IDS_LANGUAGE_MENU_ITEM         STRINGID(01)
 #define IDS_CLOCK                      STRINGID(02)
+#define IDS_MENU_ON_TOP                STRINGID(03)
 
 /* main menu */
 
+#define CL_ON_TOP                99
+
 #define CL_ANALOG                100
 #define CL_DIGITAL               101
 #define CL_FONT                  102
 #define CL_WITHOUT_TITLE         103
-#define CL_ON_TOP                104
-#define CL_SECONDS               105
-#define CL_DATE                  106
+#define CL_SECONDS               104
+#define CL_DATE                  105
 
-#define CL_LANGUAGE              108
+#define CL_LANGUAGE              200
 
-#define CL_INFO                  186
-#define CL_INFO_LICENSE          187
-#define CL_INFO_NO_WARRANTY      188
-#define CL_INFO_ABOUT_WINE       189
+#define CL_INFO                  301
+#define CL_INFO_LICENSE          302
+#define CL_INFO_NO_WARRANTY      303
+#define CL_INFO_ABOUT_WINE       304
 
-#define CL_FIRST_LANGUAGE        109
-#define CL_LAST_LANGUAGE         185
+#define CL_FIRST_LANGUAGE        200
+#define CL_LAST_LANGUAGE         220
diff --git a/programs/clock/winclock.c b/programs/clock/winclock.c
index 5baf5eb..9578966 100644
--- a/programs/clock/winclock.c
+++ b/programs/clock/winclock.c
@@ -36,6 +36,8 @@
 
 float Pi=3.1415926;
 
+int nLastSecond = 60;
+
 HandData OldSecond,OldHour,OldMinute;
 
 int MiddleX(void) {
@@ -199,9 +201,12 @@
   BOOL Redraw;
 
   GetLocalTime(&st);
+
+  S = st.wSecond;
+  if (nLastSecond==S) { exit; }
+  nLastSecond = S;
   H = st.wHour;
   M = st.wMinute;
-  S = st.wSecond;
   F = st.wMilliseconds / 10;
   F = F + S*100;
   M = M*1000+F/6;
diff --git a/programs/progman/ChangeLog b/programs/progman/ChangeLog
index 9db8ab8..4d89780 100644
--- a/programs/progman/ChangeLog
+++ b/programs/progman/ChangeLog
@@ -36,7 +36,7 @@
 
 	* Program icons: repaint on WM_NCPAINT or WM_PAINTICON
 
-Sun Apr 14 20:09:19 1996  Pablo Saratxaga <srtxg@linux.chanae.stben.be>
+Sun Apr 14 20:09:19 1996  Pablo Saratxaga <srtxg@chanae.alphanet.ch>
 
 	* [Fr.rc] (new)
 	Added French language support.
diff --git a/programs/progman/Fr.rc b/programs/progman/Fr.rc
index 251b5bd..b0b35c2 100644
--- a/programs/progman/Fr.rc
+++ b/programs/progman/Fr.rc
@@ -2,7 +2,7 @@
  * Program Manager
  *
  * Copyright 1996 Ulrich Schmid
- * French Fr.rc by Pablo Saratxaga <srtxg@linux.chanae.stben.be>
+ * French Fr.rc by Pablo Saratxaga <srtxg@chanae.alphanet.ch>
  */
 
 #define LANGUAGE_ID                  Fr
diff --git a/programs/regtest/regtest.c b/programs/regtest/regtest.c
index 161548b..5dabe41 100644
--- a/programs/regtest/regtest.c
+++ b/programs/regtest/regtest.c
@@ -23,6 +23,8 @@
 /* True this when security is implemented */
 #define CHECK_SAM FALSE
 
+#define ERR(s,d) fprintf(stderr, "%s:#%d(Status=%ld)\n", __FUNCTION__,s,d)
+
 /*
  * NOTES: These individual routines are listed in alphabetical order.
  *
@@ -36,17 +38,16 @@
 void TestCloseKey()
 {
     long lSts;
-    fprintf(stderr, "Testing RegCloseKey...\n");
 
     lSts = RegCloseKey((HKEY)2);
-    if (lSts != ERROR_INVALID_HANDLE) fprintf(stderr, " 1:%ld\n",lSts);
+    if (lSts != ERROR_INVALID_HANDLE) ERR(1,lSts);
 
     lSts = RegCloseKey(HKEY_LOCAL_MACHINE);
-    if (lSts != ERROR_SUCCESS) fprintf(stderr, " 2:%ld\n",lSts);
+    if (lSts != ERROR_SUCCESS) ERR(2,lSts);
 
     /* Check twice just for kicks */
     lSts = RegCloseKey(HKEY_LOCAL_MACHINE);
-    if (lSts != ERROR_SUCCESS) fprintf(stderr, " 3:%ld\n",lSts);
+    if (lSts != ERROR_SUCCESS) ERR(3,lSts);
 }
 
 /******************************************************************************
@@ -56,17 +57,16 @@
 {
     long lSts;
     HKEY hkey;
-    fprintf(stderr, "Testing RegConnectRegistry...\n");
 
     lSts = RegConnectRegistry("",(HKEY)2,&hkey);
-    if (lSts != ERROR_SUCCESS) fprintf(stderr, " 1:%ld\n",lSts);
+    if (lSts != ERROR_SUCCESS) ERR(1,lSts);
 
     lSts = RegConnectRegistry("",HKEY_LOCAL_MACHINE,&hkey);
-    if (lSts != ERROR_SUCCESS) fprintf(stderr, " 2:%ld\n",lSts);
+    if (lSts != ERROR_SUCCESS) ERR(2,lSts);
 
 #if TOO_SLOW
     lSts = RegConnectRegistry("\\\\regtest",HKEY_LOCAL_MACHINE,&hkey);
-    if (lSts != ERROR_BAD_NETPATH) fprintf(stderr, " 3:%ld\n",lSts);
+    if (lSts != ERROR_BAD_NETPATH) ERR(3,lSts);
 #endif
 }
 
@@ -78,25 +78,23 @@
     long lSts;
     HKEY hkey;
 
-    fprintf(stderr, "Testing RegCreateKey...\n");
-
     lSts = RegCreateKey((HKEY)2,"",&hkey);
-    if (lSts != ERROR_BADKEY) fprintf(stderr, " 1:%ld\n",lSts);
+    if (lSts != ERROR_BADKEY) ERR(1,lSts);
 
     lSts = RegCreateKey(HKEY_LOCAL_MACHINE,"",&hkey);
-    if (lSts != ERROR_SUCCESS) fprintf(stderr, " 2:%ld\n",lSts);
+    if (lSts != ERROR_SUCCESS) ERR(2,lSts);
     RegCloseKey(hkey);
 
     lSts = RegCreateKey(HKEY_LOCAL_MACHINE,"\\asdf",&hkey);
-    if (lSts != ERROR_BAD_PATHNAME) fprintf(stderr, " 3:%ld\n",lSts);
+    if (lSts != ERROR_BAD_PATHNAME) ERR(3,lSts);
 
 #if 0
     lSts = RegCreateKey(HKEY_LOCAL_MACHINE,"asdf\\",&hkey);
-    if (lSts != ERROR_INVALID_PARAMETER) fprintf(stderr, " 4:%ld\n",lSts);
+    if (lSts != ERROR_INVALID_PARAMETER) ERR(4,lSts);
 #endif
 
     lSts = RegCreateKey(HKEY_LOCAL_MACHINE,"\\asdf\\",&hkey);
-    if (lSts != ERROR_BAD_PATHNAME) fprintf(stderr, " 5:%ld\n",lSts);
+    if (lSts != ERROR_BAD_PATHNAME) ERR(5,lSts);
 }
 
 /******************************************************************************
@@ -108,22 +106,20 @@
     HKEY hkey;
     DWORD dwDisp;
 
-    fprintf(stderr, "Testing RegCreateKeyEx...\n");
-
     lSts = RegCreateKeyEx((HKEY)2,"",0,"",0,0,NULL,&hkey,&dwDisp);
-    if (lSts != ERROR_INVALID_HANDLE) fprintf(stderr, " 1:%ld\n",lSts);
+    if (lSts != ERROR_INVALID_HANDLE) ERR(1,lSts);
 
     lSts = RegCreateKeyEx(HKEY_LOCAL_MACHINE,"regtest",0,"",0,0,NULL,&hkey,
                           &dwDisp);
-    if (lSts != ERROR_INVALID_PARAMETER) fprintf(stderr, " 2:%ld\n",lSts);
+    if (lSts != ERROR_INVALID_PARAMETER) ERR(2,lSts);
 
     lSts = RegCreateKeyEx(HKEY_LOCAL_MACHINE,"regtest",0,"asdf",0,
                           KEY_ALL_ACCESS,NULL,&hkey,&dwDisp);
-    if (lSts != ERROR_INVALID_PARAMETER) fprintf(stderr, " 3:%ld\n",lSts);
+    if (lSts != ERROR_INVALID_PARAMETER) ERR(3,lSts);
 
     lSts = RegCreateKeyEx(HKEY_LOCAL_MACHINE,"regtest",0,"",0,
                           KEY_ALL_ACCESS,NULL,&hkey,&dwDisp);
-    if (lSts != ERROR_INVALID_PARAMETER) fprintf(stderr, " 4:%ld\n",lSts);
+    if (lSts != ERROR_INVALID_PARAMETER) ERR(4,lSts);
 
 }
 
@@ -133,17 +129,16 @@
 void TestDeleteKey()
 {
     long lSts;
-    fprintf(stderr, "Testing RegDeleteKey...\n");
 
     lSts = RegDeleteKey((HKEY)2, "asdf");
-    if (lSts != ERROR_INVALID_HANDLE) fprintf(stderr, " 1:%ld\n",lSts);
+    if (lSts != ERROR_INVALID_HANDLE) ERR(1,lSts);
 
     lSts = RegDeleteKey(HKEY_CURRENT_USER, "asdf");
-    if (lSts != ERROR_FILE_NOT_FOUND) fprintf(stderr, " 2:%ld\n",lSts);
+    if (lSts != ERROR_FILE_NOT_FOUND) ERR(2,lSts);
 
 #if CHECK_SAM
     lSts = RegDeleteKey(HKEY_CURRENT_USER, "");
-    if (lSts != ERROR_ACCESS_DENIED) fprintf(stderr, " 3:%ld\n",lSts);
+    if (lSts != ERROR_ACCESS_DENIED) ERR(3,lSts);
 #endif
 }
 
@@ -153,19 +148,18 @@
 void TestDeleteValue()
 {
     long lSts;
-    fprintf(stderr, "Testing RegDeleteValue...\n");
 
     lSts = RegDeleteValue((HKEY)2, "asdf");
-    if (lSts != ERROR_INVALID_HANDLE) fprintf(stderr, " 1:%ld\n",lSts);
+    if (lSts != ERROR_INVALID_HANDLE) ERR(1,lSts);
 
     lSts = RegDeleteValue(HKEY_CURRENT_USER, "");
-    if (lSts != ERROR_FILE_NOT_FOUND) fprintf(stderr, " 2:%ld\n",lSts);
+    if (lSts != ERROR_FILE_NOT_FOUND) ERR(2,lSts);
 
     lSts = RegDeleteValue(HKEY_CURRENT_USER, "asdf");
-    if (lSts != ERROR_FILE_NOT_FOUND) fprintf(stderr, " 3:%ld\n",lSts);
+    if (lSts != ERROR_FILE_NOT_FOUND) ERR(3,lSts);
 
     lSts = RegDeleteValue(HKEY_CURRENT_USER, "\\asdf");
-    if (lSts != ERROR_FILE_NOT_FOUND) fprintf(stderr, " 4:%ld\n",lSts);
+    if (lSts != ERROR_FILE_NOT_FOUND) ERR(4,lSts);
 }
 
 /******************************************************************************
@@ -177,18 +171,17 @@
     char *sVal;
     long lVal;
 
-    fprintf(stderr, "Testing RegEnumKey...\n");
     lVal = 1;
     sVal = (char *)malloc(lVal * sizeof(char));
 
     lSts = RegEnumKey((HKEY)2,3,sVal,lVal);
-    if (lSts != ERROR_INVALID_HANDLE) fprintf(stderr, " 1:%ld\n",lSts);
+    if (lSts != ERROR_INVALID_HANDLE) ERR(1,lSts);
 
     lSts = RegEnumKey(HKEY_CURRENT_USER,-1,sVal,lVal);
-    if (lSts != ERROR_NO_MORE_ITEMS) fprintf(stderr, " 2:%ld\n",lSts);
+    if (lSts != ERROR_NO_MORE_ITEMS) ERR(2,lSts);
 
     lSts = RegEnumKey(HKEY_CURRENT_USER,0,sVal,lVal);
-    if (lSts != ERROR_MORE_DATA) fprintf(stderr, " 3:%ld\n",lSts);
+    if (lSts != ERROR_MORE_DATA) ERR(3,lSts);
 }
 
 /******************************************************************************
@@ -203,20 +196,19 @@
     unsigned long lLen2;
     FILETIME ft;
 
-    fprintf(stderr, "Testing RegEnumKeyEx...\n");
     lLen1 = 1;
     sVal = (char *)malloc(lLen1 * sizeof(char));
     lLen2 = 1;
     sClass = (char *)malloc(lLen2 * sizeof(char));
 
     lSts = RegEnumKeyEx((HKEY)2,0,sVal,&lLen1,0,sClass,&lLen2,&ft);
-    if (lSts != ERROR_INVALID_HANDLE) fprintf(stderr, " 1:%ld\n",lSts);
+    if (lSts != ERROR_INVALID_HANDLE) ERR(1,lSts);
 
     lSts = RegEnumKeyEx(HKEY_LOCAL_MACHINE,0,sVal,&lLen1,0,sClass,&lLen2,&ft);
-    if (lSts != ERROR_MORE_DATA) fprintf(stderr, " 2:%ld\n",lSts);
+    if (lSts != ERROR_MORE_DATA) ERR(2,lSts);
 
     lSts = RegEnumKeyEx(HKEY_LOCAL_MACHINE,0,sVal,&lLen1,0,sClass,&lLen2,&ft);
-    if (lSts != ERROR_MORE_DATA) fprintf(stderr, " 3:%ld\n",lSts);
+    if (lSts != ERROR_MORE_DATA) ERR(3,lSts);
 }
 
 /******************************************************************************
@@ -231,23 +223,25 @@
     unsigned long lLen1;
     char *bVal;
 
-    fprintf(stderr, "Testing RegEnumValue...\n");
     lVal = 1;
     sVal = (char *)malloc(lVal * sizeof(char));
     lLen1 = 1;
     bVal = (char *)malloc(lLen1 * sizeof(char));
 
     lSts = RegEnumValue((HKEY)2,-1,sVal,&lVal,0,&lType,NULL,&lLen1);
-    if (lSts != ERROR_INVALID_HANDLE) fprintf(stderr, " 1:%ld\n",lSts);
+    if (lSts != ERROR_INVALID_HANDLE) ERR(1,lSts);
 
     lSts = RegEnumValue(HKEY_LOCAL_MACHINE,-1,sVal,&lVal,0,&lType,NULL,&lLen1);
-    if (lSts != ERROR_NO_MORE_ITEMS) fprintf(stderr, " 2:%ld\n",lSts);
+    if (lSts != ERROR_NO_MORE_ITEMS) ERR(2,lSts);
 
     lSts = RegEnumValue(HKEY_LOCAL_MACHINE,0,sVal,&lVal,0,&lType,NULL,&lLen1);
-    if (lSts != ERROR_SUCCESS) fprintf(stderr, " 3:%ld\n",lSts);
+    if (lSts != ERROR_SUCCESS) ERR(3,lSts);
+
+    lSts = RegEnumValue(HKEY_LOCAL_MACHINE,0,sVal,&lVal,0,NULL,NULL,&lLen1);
+    if (lSts != ERROR_SUCCESS) ERR(4,lSts);
 
     lSts = RegEnumValue(HKEY_LOCAL_MACHINE,1,sVal,&lVal,0,&lType,bVal,&lLen1);
-    if (lSts != ERROR_NO_MORE_ITEMS) fprintf(stderr, " 4:%ld\n",lSts);
+    if (lSts != ERROR_NO_MORE_ITEMS) ERR(5,lSts);
 }
 
 /******************************************************************************
@@ -256,13 +250,12 @@
 void TestFlushKey()
 {
     long lSts;
-    fprintf(stderr, "Testing RegFlushKey...\n");
 
     lSts = RegFlushKey((HKEY)2);
-    if (lSts != ERROR_INVALID_HANDLE) fprintf(stderr, " 1:%ld\n",lSts);
+    if (lSts != ERROR_INVALID_HANDLE) ERR(1,lSts);
 
     lSts = RegFlushKey(HKEY_LOCAL_MACHINE);
-    if (lSts != ERROR_SUCCESS) fprintf(stderr, " 2:%ld\n",lSts);
+    if (lSts != ERROR_SUCCESS) ERR(2,lSts);
 }
 
 /******************************************************************************
@@ -275,18 +268,17 @@
     SECURITY_DESCRIPTOR sd;
     unsigned long lLen;
 
-    fprintf(stderr, "Testing RegGetKeySecurity...\n");
     lLen = sizeof(sd);
-
+    si = 0;
     lSts = RegGetKeySecurity((HKEY)2,si,&sd,&lLen);
-    if (lSts != ERROR_INVALID_HANDLE) fprintf(stderr, " 1:%ld\n",lSts);
+    if (lSts != ERROR_INVALID_HANDLE) ERR(1,lSts);
 
     lSts = RegGetKeySecurity(HKEY_LOCAL_MACHINE,si,&sd,&lLen);
-    if (lSts != ERROR_INSUFFICIENT_BUFFER) fprintf(stderr, " 2:%ld\n",lSts);
+    if (lSts != ERROR_INSUFFICIENT_BUFFER) ERR(2,lSts);
 
     si = GROUP_SECURITY_INFORMATION;
     lSts = RegGetKeySecurity(HKEY_LOCAL_MACHINE,si,&sd,&lLen);
-    if (lSts != ERROR_SUCCESS) fprintf(stderr, " 3:%ld\n",lSts);
+    if (lSts != ERROR_SUCCESS) ERR(3,lSts);
 }
 
 /******************************************************************************
@@ -295,26 +287,25 @@
 void TestLoadKey()
 {
     long lSts;
-    fprintf(stderr, "Testing RegLoadKey...\n");
 
     lSts = RegLoadKey((HKEY)2,"","");
-    if (lSts != ERROR_INVALID_PARAMETER) fprintf(stderr, " 1:%ld\n",lSts);
+    if (lSts != ERROR_INVALID_PARAMETER) ERR(1,lSts);
 
     lSts = RegLoadKey(HKEY_CURRENT_USER,"","");
-    if (lSts != ERROR_INVALID_PARAMETER) fprintf(stderr, " 2:%ld\n",lSts);
+    if (lSts != ERROR_INVALID_PARAMETER) ERR(2,lSts);
 
     lSts = RegLoadKey(HKEY_CURRENT_USER,"regtest","");
-    if (lSts != ERROR_INVALID_PARAMETER) fprintf(stderr, " 3:%ld\n",lSts);
+    if (lSts != ERROR_INVALID_PARAMETER) ERR(3,lSts);
 
     lSts = RegLoadKey(HKEY_CURRENT_USER,"\\regtest","");
-    if (lSts != ERROR_INVALID_PARAMETER) fprintf(stderr, " 4:%ld\n",lSts);
+    if (lSts != ERROR_INVALID_PARAMETER) ERR(4,lSts);
 
 #if CHECK_SAM
     lSts = RegLoadKey(HKEY_CURRENT_USER,"regtest","regtest.dat");
-    if (lSts != ERROR_PRIVILEGE_NOT_HELD) fprintf(stderr, " 5:%ld\n",lSts);
+    if (lSts != ERROR_PRIVILEGE_NOT_HELD) ERR(5,lSts);
 
     lSts = RegLoadKey(HKEY_CURRENT_USER,"\\regtest","regtest.dat");
-    if (lSts != ERROR_PRIVILEGE_NOT_HELD) fprintf(stderr, " 6:%ld\n",lSts);
+    if (lSts != ERROR_PRIVILEGE_NOT_HELD) ERR(6,lSts);
 #endif
 }
 
@@ -326,18 +317,17 @@
     long lSts;
     HANDLE hEvent;
 
-    fprintf(stderr, "Testing RegNotifyChangeKeyValue...\n");
     hEvent = (HANDLE)0;
 
     lSts = RegNotifyChangeKeyValue((HKEY)2, TRUE, REG_NOTIFY_CHANGE_NAME, 0, 0);
-    if (lSts != ERROR_INVALID_HANDLE) fprintf(stderr, " 1:%ld\n",lSts);
+    if (lSts != ERROR_INVALID_HANDLE) ERR(1,lSts);
 
     lSts = RegNotifyChangeKeyValue(HKEY_CURRENT_USER, TRUE, REG_NOTIFY_CHANGE_NAME, 0, 1);
-    if (lSts != ERROR_INVALID_PARAMETER) fprintf(stderr, " 2:%ld\n",lSts);
+    if (lSts != ERROR_INVALID_PARAMETER) ERR(2,lSts);
 
     hEvent = (HANDLE)HKEY_CURRENT_USER;
     lSts = RegNotifyChangeKeyValue(HKEY_CURRENT_USER, TRUE, REG_NOTIFY_CHANGE_NAME, hEvent, 1);
-    if (lSts != ERROR_INVALID_HANDLE) fprintf(stderr, " 3:%ld\n",lSts);
+    if (lSts != ERROR_INVALID_HANDLE) ERR(3,lSts);
 }
 
 /******************************************************************************
@@ -347,20 +337,19 @@
 {
     long lSts;
     HKEY hkey;
-    fprintf(stderr, "Testing RegOpenKey...\n");
 
     lSts = RegOpenKey((HKEY)72, "",&hkey);
-    if (lSts != ERROR_SUCCESS) fprintf(stderr, " 1:%ld\n",lSts);
+    if (lSts != ERROR_SUCCESS) ERR(1,lSts);
     RegCloseKey(hkey);
 
     lSts = RegOpenKey((HKEY)2, "regtest",&hkey);
-    if (lSts != ERROR_INVALID_HANDLE) fprintf(stderr, " 2:%ld\n",lSts);
+    if (lSts != ERROR_INVALID_HANDLE) ERR(2,lSts);
 
     lSts = RegOpenKey(HKEY_CURRENT_USER, "regtest",&hkey);
-    if (lSts != ERROR_FILE_NOT_FOUND) fprintf(stderr, " 3:%ld\n",lSts);
+    if (lSts != ERROR_FILE_NOT_FOUND) ERR(3,lSts);
 
     lSts = RegOpenKey(HKEY_CURRENT_USER, "\\regtest",&hkey);
-    if (lSts != ERROR_BAD_PATHNAME) fprintf(stderr, " 4:%ld\n",lSts);
+    if (lSts != ERROR_BAD_PATHNAME) ERR(4,lSts);
 }
 
 /******************************************************************************
@@ -370,19 +359,18 @@
 {
     long lSts;
     HKEY hkey;
-    fprintf(stderr, "Testing RegOpenKeyEx...\n");
 
     lSts = RegOpenKeyEx((HKEY)2,"",0,KEY_ALL_ACCESS,&hkey);
-    if (lSts != ERROR_INVALID_HANDLE) fprintf(stderr, " 1:%ld\n",lSts);
+    if (lSts != ERROR_INVALID_HANDLE) ERR(1,lSts);
 
     lSts = RegOpenKeyEx(HKEY_CURRENT_USER,"\\regtest",0,KEY_ALL_ACCESS,&hkey);
-    if (lSts != ERROR_BAD_PATHNAME) fprintf(stderr, " 2:%ld\n",lSts);
+    if (lSts != ERROR_BAD_PATHNAME) ERR(2,lSts);
 
     lSts = RegOpenKeyEx(HKEY_CURRENT_USER,"regtest",0,0,&hkey);
-    if (lSts != ERROR_FILE_NOT_FOUND) fprintf(stderr, " 3:%ld\n",lSts);
+    if (lSts != ERROR_FILE_NOT_FOUND) ERR(3,lSts);
 
     lSts = RegOpenKeyEx(HKEY_CURRENT_USER,"regtest\\",0,0,&hkey);
-    if (lSts != ERROR_FILE_NOT_FOUND) fprintf(stderr, " 3:%ld\n",lSts);
+    if (lSts != ERROR_FILE_NOT_FOUND) ERR(4,lSts);
 }
 
 /******************************************************************************
@@ -401,7 +389,6 @@
     unsigned long lMaxValLen;
     unsigned long lSecDescLen;
     FILETIME ft;
-    fprintf(stderr, "Testing RegQueryInfoKey...\n");
 
     lClass = 1;
     sClass = (char *)malloc(lClass * sizeof(char));
@@ -409,12 +396,12 @@
     lSts = RegQueryInfoKey((HKEY)2,sClass,&lClass,0,&lSubKeys,&lMaxSubLen,
                            &lMaxClassLen,&lValues,&lMaxValNameLen,&lMaxValLen,
                            &lSecDescLen, &ft);
-    if (lSts != ERROR_INVALID_HANDLE) fprintf(stderr, " 1:%ld\n",lSts);
+    if (lSts != ERROR_INVALID_HANDLE) ERR(1,lSts);
 
     lSts = RegQueryInfoKey(HKEY_CURRENT_USER,sClass,&lClass,0,&lSubKeys,
                            &lMaxSubLen,&lMaxClassLen,&lValues,&lMaxValNameLen,
                            &lMaxValLen,&lSecDescLen, &ft);
-    if (lSts != ERROR_SUCCESS) fprintf(stderr, " 2:%ld\n",lSts);
+    if (lSts != ERROR_SUCCESS) ERR(2,lSts);
 }
 
 /******************************************************************************
@@ -426,21 +413,20 @@
     long lLen;
     char *sVal;
 
-    fprintf(stderr, "Testing RegQueryValue...\n");
     sVal = (char *)malloc(80 * sizeof(char));
     lLen = strlen(sVal);
 
     lSts = RegQueryValue((HKEY)2,"",NULL,&lLen);
-    if (lSts != ERROR_INVALID_HANDLE) fprintf(stderr, " 1:%ld\n",lSts);
+    if (lSts != ERROR_INVALID_HANDLE) ERR(1,lSts);
 
     lSts = RegQueryValue(HKEY_CURRENT_USER,"",NULL,&lLen);
-    if (lSts != ERROR_SUCCESS) fprintf(stderr, " 2:%ld\n",lSts);
+    if (lSts != ERROR_SUCCESS) ERR(2,lSts);
 
     lSts = RegQueryValue(HKEY_CURRENT_USER,"\\regtest",NULL,&lLen);
-    if (lSts != ERROR_BAD_PATHNAME) fprintf(stderr, " 3:%ld\n",lSts);
+    if (lSts != ERROR_BAD_PATHNAME) ERR(3,lSts);
 
     lSts = RegQueryValue(HKEY_CURRENT_USER,"",sVal,&lLen);
-    if (lSts != ERROR_SUCCESS) fprintf(stderr, " 4:%ld\n",lSts);
+    if (lSts != ERROR_SUCCESS) ERR(4,lSts);
 }
 
 /******************************************************************************
@@ -453,18 +439,17 @@
     unsigned long lType;
     unsigned long lLen;
 
-    fprintf(stderr, "Testing RegQueryValueEx...\n");
     lLen = 80;
     sVal = (char *)malloc(lLen * sizeof(char));
 
     lSts = RegQueryValueEx((HKEY)2,"",0,&lType,sVal,&lLen);
-    if (lSts != ERROR_INVALID_HANDLE) fprintf(stderr, " 1:%ld\n",lSts);
+    if (lSts != ERROR_INVALID_HANDLE) ERR(1,lSts);
 
     lSts = RegQueryValueEx(HKEY_CURRENT_USER,"",(LPDWORD)1,&lType,sVal,&lLen);
-    if (lSts != ERROR_INVALID_PARAMETER) fprintf(stderr, " 2:%ld\n",lSts);
+    if (lSts != ERROR_INVALID_PARAMETER) ERR(2,lSts);
 
     lSts = RegQueryValueEx(HKEY_LOCAL_MACHINE,"",0,&lType,sVal,&lLen);
-    if (lSts != ERROR_SUCCESS) fprintf(stderr, " 3:%ld\n",lSts);
+    if (lSts != ERROR_SUCCESS) ERR(3,lSts);
 }
 
 /******************************************************************************
@@ -474,17 +459,15 @@
 {
     long lSts;
 
-    fprintf(stderr, "Testing RegReplaceKey...\n");
-
     lSts = RegReplaceKey((HKEY)2,"","","");
-    if (lSts != ERROR_INVALID_HANDLE) fprintf(stderr, " 1:%ld\n",lSts);
+    if (lSts != ERROR_INVALID_HANDLE) ERR(1,lSts);
 
 #if CHECK_SAM
     lSts = RegReplaceKey(HKEY_LOCAL_MACHINE,"","","");
-    if (lSts != ERROR_ACCESS_DENIED) fprintf(stderr, " 2:%ld\n",lSts);
+    if (lSts != ERROR_ACCESS_DENIED) ERR(2,lSts);
 
     lSts = RegReplaceKey(HKEY_LOCAL_MACHINE,"Software","","");
-    if (lSts != ERROR_ACCESS_DENIED) fprintf(stderr, " 3:%ld\n",lSts);
+    if (lSts != ERROR_ACCESS_DENIED) ERR(3,lSts);
 #endif
 }
 
@@ -494,16 +477,15 @@
 void TestRestoreKey()
 {
     long lSts;
-    fprintf(stderr, "Testing RegRestoreKey...\n");
 
     lSts = RegRestoreKey((HKEY)2,"",0);
-    if (lSts != ERROR_INVALID_PARAMETER) fprintf(stderr, " 1:%ld\n",lSts);
+    if (lSts != ERROR_INVALID_PARAMETER) ERR(1,lSts);
 
     lSts = RegRestoreKey(HKEY_LOCAL_MACHINE,"",0);
-    if (lSts != ERROR_INVALID_PARAMETER) fprintf(stderr, " 2:%ld\n",lSts);
+    if (lSts != ERROR_INVALID_PARAMETER) ERR(2,lSts);
 
     lSts = RegRestoreKey(HKEY_LOCAL_MACHINE,"a.a",0);
-    if (lSts != ERROR_FILE_NOT_FOUND) fprintf(stderr, " 3:%ld\n",lSts);
+    if (lSts != ERROR_FILE_NOT_FOUND) ERR(3,lSts);
 }
 
 /******************************************************************************
@@ -512,17 +494,16 @@
 void TestSaveKey()
 {
     long lSts;
-    fprintf(stderr, "Testing RegSaveKey...\n");
 
     lSts = RegSaveKey((HKEY)2,"",NULL);
-    if (lSts != ERROR_INVALID_PARAMETER) fprintf(stderr, " 1:%ld\n",lSts);
+    if (lSts != ERROR_INVALID_PARAMETER) ERR(1,lSts);
 
     lSts = RegSaveKey(HKEY_LOCAL_MACHINE,"",NULL);
-    if (lSts != ERROR_INVALID_PARAMETER) fprintf(stderr, " 2:%ld\n",lSts);
+    if (lSts != ERROR_INVALID_PARAMETER) ERR(2,lSts);
 
 #if CHECK_SAM
     lSts = RegSaveKey(HKEY_LOCAL_MACHINE,"a.a",NULL);
-    if (lSts != ERROR_PRIVILEGE_NOT_HELD) fprintf(stderr, " 3:%ld\n",lSts);
+    if (lSts != ERROR_PRIVILEGE_NOT_HELD) ERR(3,lSts);
 #endif
 }
 
@@ -533,19 +514,18 @@
 {
     long lSts;
     SECURITY_DESCRIPTOR sd;
-    fprintf(stderr, "Testing RegSetKeySecurity...\n");
 
     lSts = RegSetKeySecurity((HKEY)2,0,NULL);
-    if (lSts != ERROR_INVALID_PARAMETER) fprintf(stderr, " 1:%ld\n",lSts);
+    if (lSts != ERROR_INVALID_PARAMETER) ERR(1,lSts);
 
     lSts = RegSetKeySecurity(HKEY_LOCAL_MACHINE,0,NULL);
-    if (lSts != ERROR_INVALID_PARAMETER) fprintf(stderr, " 2:%ld\n",lSts);
+    if (lSts != ERROR_INVALID_PARAMETER) ERR(2,lSts);
 
     lSts = RegSetKeySecurity(HKEY_LOCAL_MACHINE,OWNER_SECURITY_INFORMATION,NULL);
-    if (lSts != ERROR_INVALID_PARAMETER) fprintf(stderr, " 3:%ld\n",lSts);
+    if (lSts != ERROR_INVALID_PARAMETER) ERR(3,lSts);
 
     lSts = RegSetKeySecurity(HKEY_LOCAL_MACHINE,OWNER_SECURITY_INFORMATION,&sd);
-    if (lSts != ERROR_INVALID_PARAMETER) fprintf(stderr, " 4:%ld\n",lSts);
+    if (lSts != ERROR_INVALID_PARAMETER) ERR(4,lSts);
 }
 
 /******************************************************************************
@@ -553,27 +533,28 @@
  */
 void TestSetValue()
 {
+#if MAKE_NT_CRASH
     long lSts;
-    fprintf(stderr, "Testing RegSetValue...\n");
+#endif
 
 #if MAKE_NT_CRASH
     lSts = RegSetValue((HKEY)2,"",0,NULL,0);
-    if (lSts != ERROR_INVALID_PARAMETER) fprintf(stderr, " 1:%ld\n",lSts);
+    if (lSts != ERROR_INVALID_PARAMETER) ERR(1,lSts);
 #endif
 
 #if MAKE_NT_CRASH
     lSts = RegSetValue((HKEY)2,"regtest",0,NULL,0);
-    if (lSts != ERROR_INVALID_PARAMETER) fprintf(stderr, " 2:%ld\n",lSts);
+    if (lSts != ERROR_INVALID_PARAMETER) ERR(2,lSts);
 #endif
 
 #if MAKE_NT_CRASH
     lSts = RegSetValue((HKEY)2,"regtest",REG_SZ,NULL,0);
-    if (lSts != ERROR_INVALID_HANDLE) fprintf(stderr, " 3:%ld\n",lSts);
+    if (lSts != ERROR_INVALID_HANDLE) ERR(3,lSts);
 #endif
 
 #if MAKE_NT_CRASH
     lSts = RegSetValue(HKEY_LOCAL_MACHINE,"regtest",REG_SZ,NULL,0);
-    if (lSts != ERROR_INVALID_HANDLE) fprintf(stderr, " 4:%ld\n",lSts);
+    if (lSts != ERROR_INVALID_HANDLE) ERR(4,lSts);
 #endif
 }
 
@@ -583,13 +564,12 @@
 void TestSetValueEx()
 {
     long lSts;
-    fprintf(stderr, "Testing RegSetValueEx...\n");
 
     lSts = RegSetValueEx((HKEY)2,"",0,0,NULL,0);
-    if (lSts != ERROR_INVALID_HANDLE) fprintf(stderr, " 1:%ld\n",lSts);
+    if (lSts != ERROR_INVALID_HANDLE) ERR(1,lSts);
 
     lSts = RegSetValueEx(HKEY_LOCAL_MACHINE,"",0,0,NULL,0);
-    if (lSts != ERROR_SUCCESS) fprintf(stderr, " 2:%ld\n",lSts);
+    if (lSts != ERROR_SUCCESS) ERR(2,lSts);
 }
 
 /******************************************************************************
@@ -597,18 +577,19 @@
  */
 void TestUnLoadKey()
 {
+#if CHECK_SAM
     long lSts;
-    fprintf(stderr, "Testing RegUnloadKey...\n");
+#endif
 
 #if CHECK_SAM
     lSts = RegUnLoadKey((HKEY)2,"");
-    if (lSts != ERROR_PRIVILEGE_NOT_HELD) fprintf(stderr, " 1:%ld\n",lSts);
+    if (lSts != ERROR_PRIVILEGE_NOT_HELD) ERR(1,lSts);
 
     lSts = RegUnLoadKey(HKEY_LOCAL_MACHINE,"");
-    if (lSts != ERROR_PRIVILEGE_NOT_HELD) fprintf(stderr, " 2:%ld\n",lSts);
+    if (lSts != ERROR_PRIVILEGE_NOT_HELD) ERR(2,lSts);
 
     lSts = RegUnLoadKey(HKEY_LOCAL_MACHINE,"\\regtest");
-    if (lSts != ERROR_PRIVILEGE_NOT_HELD) fprintf(stderr, " 3:%ld\n",lSts);
+    if (lSts != ERROR_PRIVILEGE_NOT_HELD) ERR(3,lSts);
 #endif
 }
 
@@ -620,17 +601,15 @@
     HKEY hkey;
     long lSts;
 
-    fprintf(stderr, "Testing Sequence1...\n");
-
     lSts = RegCreateKey(HKEY_CURRENT_USER,"regtest",&hkey);
-    if (lSts != ERROR_SUCCESS) fprintf(stderr, " 1:%ld\n",lSts);
+    if (lSts != ERROR_SUCCESS) ERR(1,lSts);
 
-    fprintf(stderr, " hkey=0x%x\n", hkey);
+/*    fprintf(stderr, " hkey=0x%x\n", hkey); */
 
     lSts = RegDeleteKey(HKEY_CURRENT_USER, "regtest");
-    if (lSts != ERROR_SUCCESS) fprintf(stderr, " 2:%ld\n",lSts);
+    if (lSts != ERROR_SUCCESS) ERR(2,lSts);
     lSts = RegCloseKey(hkey);
-    if (lSts != ERROR_SUCCESS) fprintf(stderr, " 3:%ld\n",lSts);
+    if (lSts != ERROR_SUCCESS) ERR(3,lSts);
 }
 
 
diff --git a/rc/README b/rc/README
index 949335c..314a03f 100644
--- a/rc/README
+++ b/rc/README
@@ -9,7 +9,7 @@
 commdlg.dll, but the use in the library version is possible as well.
 The expected advantage of using winerc over sysres.dll is a speed
 improvement, however, actual data to support that claim are not
-available. The use of winerc might also simplifies the source code. For
+available. The use of winerc might also simplify the source code. For
 example, the system menu is managed in the function CopySysMenu
 (controls/menu.c). A winerc-based implementation would just call
 	return LoadMenuIndirect(_Sysres_SYSMENU);
diff --git a/relay32/comctl32.spec b/relay32/comctl32.spec
index 3d04c04..67fe617 100644
--- a/relay32/comctl32.spec
+++ b/relay32/comctl32.spec
@@ -7,7 +7,7 @@
 #   This list was created from a comctl32.dll v4.72 (IE4.01).
 
   2 stdcall MenuHelp(long long long long long long ptr) MenuHelp
-  3 stub ShowHideMenuCtl
+  3 stdcall ShowHideMenuCtl(long long ptr) ShowHideMenuCtl
   4 stdcall GetEffectiveClientRect(long long long) GetEffectiveClientRect
   5 stdcall DrawStatusTextA(long ptr str long) DrawStatusText32A
   6 stdcall CreateStatusWindowA(long str long long) CreateStatusWindow32A
@@ -80,7 +80,7 @@
  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
+ 76 stdcall ImageList_SetFilter(ptr long long) ImageList_SetFilter
  77 stdcall ImageList_SetIconSize(ptr long long) ImageList_SetIconSize
  78 stdcall ImageList_SetImageCount(ptr long) ImageList_SetImageCount
  79 stdcall ImageList_SetOverlayImage(ptr long long) ImageList_SetOverlayImage
@@ -133,18 +133,18 @@
 337 stub DPA_DeleteAllPtrs
 338 stub DPA_Sort
 339 stub DPA_Search
-340 stub DPA_CreateEx
-341 stub SendNotify
+340 stdcall DPA_CreateEx(long long) DPA_CreateEx
+341 stdcall SendNotify(long long long long) COMCTL32_SendNotify
 342 stub SendNotifyEx
 
-350 stdcall StrChrA(long long) COMCTL32_StrChrA
-351 stub StrRChr
+350 stdcall StrChrA(str str) COMCTL32_StrChrA
+351 stub StrRChrA
 352 stub StrCmpNA
 353 stub StrCmpNIA
 354 stub StrStrA
-355 stub StrStrIA
+355 stdcall StrStrIA(str str) COMCTL32_StrStrIA
 356 stub StrCSpnA
-357 stub StrToIntA
+357 stdcall StrToIntA(str) COMCTL32_StrToIntA
 358 stub StrChrW
 359 stub StrRChrW
 360 stub StrCmpNW
diff --git a/relay32/gdi32.spec b/relay32/gdi32.spec
index 576ecb4..8f11c9c 100644
--- a/relay32/gdi32.spec
+++ b/relay32/gdi32.spec
@@ -44,12 +44,10 @@
  40 stdcall CreateEllipticRgnIndirect(ptr) CreateEllipticRgnIndirect32
  41 stdcall CreateEnhMetaFileA(long ptr ptr ptr) CreateEnhMetaFile32A
  42 stub CreateEnhMetaFileW
- 43 stdcall CreateFontA(long long long long long long long long
-                        long long long long long str) CreateFont32A
+ 43 stdcall CreateFontA(long long long long long long long long long long long long long str) CreateFont32A
  44 stdcall CreateFontIndirectA(ptr) CreateFontIndirect32A
  45 stdcall CreateFontIndirectW(ptr) CreateFontIndirect32W
- 46 stdcall CreateFontW(long long long long long long long long
-                        long long long long long wstr) CreateFont32W
+ 46 stdcall CreateFontW(long long long long long long long long long long long long long wstr) CreateFont32W
  47 stdcall CreateHalftonePalette(long) CreateHalftonePalette
  48 stdcall CreateHatchBrush(long long) CreateHatchBrush32
  49 stdcall CreateICA(str str str ptr) CreateIC32A
@@ -64,8 +62,7 @@
  58 stdcall CreatePolygonRgn(ptr long long) CreatePolygonRgn32
  59 stdcall CreateRectRgn(long long long long) CreateRectRgn32
  60 stdcall CreateRectRgnIndirect(ptr) CreateRectRgnIndirect32
- 61 stdcall CreateRoundRectRgn(long long long long long long)
-             CreateRoundRectRgn32
+ 61 stdcall CreateRoundRectRgn(long long long long long long) CreateRoundRectRgn32
  62 stdcall CreateScalableFontResourceA(long str str str) CreateScalableFontResource32A
  63 stdcall CreateScalableFontResourceW(long wstr wstr wstr) CreateScalableFontResource32W
  64 stdcall CreateSolidBrush(long) CreateSolidBrush32
@@ -164,8 +161,8 @@
 157 stub GetCharWidthFloatW
 158 stdcall GetCharWidthW(long long long long) GetCharWidth32W
 159 stub GetCharWidthWOW
-160 stub GetCharacterPlacementA
-161 stub GetCharacterPlacementW
+160 stdcall GetCharacterPlacementA(long str long long ptr long) GetCharacterPlacement32A
+161 stdcall GetCharacterPlacementW(long wstr long long ptr long) GetCharacterPlacement32W
 162 stdcall GetClipBox(long ptr) GetClipBox32
 163 stdcall GetClipRgn(long long) GetClipRgn32
 164 stub GetColorAdjustment
@@ -181,7 +178,7 @@
 174 stdcall GetEnhMetaFileA(ptr) GetEnhMetaFile32A
 175 stdcall GetEnhMetaFileBits(long long ptr) GetEnhMetaFileBits
 176 stdcall GetEnhMetaFileDescriptionA(long long ptr) GetEnhMetaFileDescription32A
-177 stub GetEnhMetaFileDescriptionW
+177 stdcall GetEnhMetaFileDescriptionW(long long ptr) GetEnhMetaFileDescription32W
 178 stdcall GetEnhMetaFileHeader(long long ptr) GetEnhMetaFileHeader
 179 stub GetEnhMetaFilePaletteEntries
 180 stub GetEnhMetaFileW
@@ -219,7 +216,7 @@
 212 stdcall GetPixelFormat(long) GetPixelFormat
 213 stdcall GetPolyFillMode(long) GetPolyFillMode32
 214 stdcall GetROP2(long) GetROP232
-215 stub GetRandomRgn
+215 stdcall GetRandomRgn(long long long) GetRandomRgn
 216 stdcall GetRasterizerCaps(ptr long) GetRasterizerCaps32
 217 stdcall GetRegionData(long long ptr) GetRegionData
 218 stdcall GetRelAbs(long) GetRelAbs32
@@ -273,7 +270,7 @@
 266 stdcall PlayMetaFileRecord(long ptr ptr long) PlayMetaFileRecord32
 267 stub PlgBlt
 268 stdcall PolyBezier(long ptr long) PolyBezier32
-269 stub PolyBezierTo
+269 stdcall PolyBezierTo(long ptr long) PolyBezierTo32
 270 stub PolyDraw
 271 stdcall PolyPolygon(long ptr ptr long) PolyPolygon32
 272 stdcall PolyPolyline(long ptr ptr long) PolyPolyline32
@@ -317,8 +314,7 @@
 310 stub SetColorSpace
 311 stdcall SetDIBColorTable(long long long ptr) SetDIBColorTable32
 312 stdcall SetDIBits(long long long long ptr ptr long) SetDIBits32
-313 stdcall SetDIBitsToDevice(long long long long long long long long long
-                               ptr ptr long) SetDIBitsToDevice32
+313 stdcall SetDIBitsToDevice(long long long long long long long long long ptr ptr long) SetDIBitsToDevice32
 314 stub SetDeviceGammaRamp
 315 stdcall SetEnhMetaFileBits(long ptr) SetEnhMetaFileBits
 316 stub SetFontEnumeration
@@ -355,10 +351,8 @@
 347 stub StartDocA
 348 stub StartDocW
 349 stub StartPage
-350 stdcall StretchBlt(long long long long long long long long long long long)
-            StretchBlt32
-351 stdcall StretchDIBits(long long long long long long long long long
-                          ptr ptr long long) StretchDIBits32
+350 stdcall StretchBlt(long long long long long long long long long long long) StretchBlt32
+351 stdcall StretchDIBits(long long long long long long long long long ptr ptr long long) StretchDIBits32
 352 stub StrokeAndFillPath
 353 stub StrokePath
 354 stdcall SwapBuffers(long) SwapBuffers
diff --git a/relay32/kernel32.spec b/relay32/kernel32.spec
index 2e35642..65f2dd8 100644
--- a/relay32/kernel32.spec
+++ b/relay32/kernel32.spec
@@ -626,7 +626,7 @@
 609 register SUnMapLS_IP_EBP_36() SUnMapLS_IP_EBP_36
 610 register SUnMapLS_IP_EBP_40() SUnMapLS_IP_EBP_40
 611 register SUnMapLS_IP_EBP_8() SUnMapLS_IP_EBP_8
-612 stub ScrollConsoleScreenBufferA
+612 stdcall ScrollConsoleScreenBufferA(long ptr ptr ptr ptr) ScrollConsoleScreenBuffer
 613 stub ScrollConsoleScreenBufferW
 614 stdcall SearchPathA(str str str long ptr ptr) SearchPath32A
 615 stdcall SearchPathW(wstr wstr wstr long ptr ptr) SearchPath32W
@@ -694,11 +694,11 @@
 677 stdcall SetupComm(long long long) SetupComm
 678 stdcall SizeofResource(long long) SizeofResource32
 679 stdcall Sleep(long) Sleep
-680 stub SleepEx
+680 stdcall SleepEx(long long) SleepEx
 681 stdcall SuspendThread(long) SuspendThread
 682 stdcall SystemTimeToFileTime(ptr ptr) SystemTimeToFileTime
 683 stub SystemTimeToTzSpecificLocalTime
-684 stub TerminateProcess
+684 stdcall TerminateProcess(ptr long) TerminateProcess
 685 stdcall TerminateThread(long long) TerminateThread
 686 stub Thread32First
 687 stub Thread32Next
diff --git a/relay32/mpr.spec b/relay32/mpr.spec
index aa83c39..760f1de 100644
--- a/relay32/mpr.spec
+++ b/relay32/mpr.spec
@@ -26,10 +26,10 @@
 0023 stub MPR_23
 0024 stub MPR_24
 0025 stdcall MPR_25(str long) _MPR_25
-0026 stdcall MultinetGetConnectionPerformanceA(ptr ptr) MultinetGetConnectionPerformance32A
+	0026 stdcall MultinetGetConnectionPerformanceA(ptr ptr) MultinetGetConnectionPerformance32A
 0027 stub MultinetGetConnectionPerformanceW
-0028 stub MultinetGetErrorTextA
-0029 stub MultinetGetErrorTextW
+0028 stdcall MultinetGetErrorTextA(long ptr long)MultinetGetErrorText32A
+0029 stdcall MultinetGetErrorTextW(long ptr long)MultinetGetErrorText32W
 0030 stub NPSAuthenticationDialogA
 0031 stub NPSCopyStringA
 0032 stub NPSDeviceGetNumberA
@@ -59,9 +59,9 @@
 0056 stub WNetCancelConnectionA
 0057 stub WNetCancelConnectionW
 0058 stub WNetCloseEnum
-0059 stub WNetConnectionDialog1A
-0060 stub WNetConnectionDialog1W
-0061 stub WNetConnectionDialog
+0059 stdcall WNetConnectionDialog1A(ptr) WNetConnectionDialog1_32A
+0060 stdcall WNetConnectionDialog1W(ptr) WNetConnectionDialog1_32W
+0061 stdcall WNetConnectionDialog1(long long) WNetConnectionDialog1_32
 0062 stub WNetDisconnectDialog1A
 0063 stub WNetDisconnectDialog1W
 0064 stub WNetDisconnectDialog
diff --git a/relay32/ntdll.spec b/relay32/ntdll.spec
index aaf2d41..cd5daaa 100644
--- a/relay32/ntdll.spec
+++ b/relay32/ntdll.spec
@@ -371,7 +371,7 @@
 368 stub RtlFindSetBits
 369 stub RtlFindSetBitsAndClear
 370 stdcall RtlFirstFreeAce(ptr ptr) RtlFirstFreeAce
-371 stub RtlFormatCurrentUserKeyPath
+371 stdcall RtlFormatCurrentUserKeyPath() RtlFormatCurrentUserKeyPath
 372 stub RtlFormatMessage
 373 stdcall RtlFreeAnsiString(long) RtlFreeAnsiString
 374 stdcall RtlFreeHeap(long long long) HeapFree
diff --git a/relay32/shell32.spec b/relay32/shell32.spec
index 2bb8126..894ff22 100644
--- a/relay32/shell32.spec
+++ b/relay32/shell32.spec
@@ -2,296 +2,374 @@
 type	win32
 
 # Functions exported by the Win95 shell32.dll 
-# (these need to have these exact ordinals, for some win95 dlls 
-#  import shell32.dll by ordinal)
+# (these need to have these exact ordinals, for some 
+#  win95 and winNT dlls import shell32.dll by ordinal)
+# This list was updated to dll version 4.72
 
-   2 stdcall SHELL32_2(long long long long long long) SHELL32_2
-   3 stub CheckEscapesA
-   4 stub SHELL32_4
-   5 stub SHELL32_5
-   6 stub CheckEscapesW
-   7 stdcall CommandLineToArgvW(wstr ptr) CommandLineToArgvW
-   8 stub Control_FillCache_RunDLL
-  12 stdcall Control_RunDLL(long long long long) Control_RunDLL
-  14 stdcall DllGetClassObject(long long ptr) SHELL32_DllGetClassObject
-  15 stub SHELL32_15
-  16 stdcall SHELL32_16(ptr) SHELL32_16
-  17 stub SHELL32_17
-  18 stdcall SHELL32_18(ptr) SHELL32_18
-  19 stub SHELL32_19
-  20 stub SHELL32_20
-  21 stub SHELL32_21
-  22 stub DoEnvironmentSubstA
-  23 stub SHELL32_23
-  24 stub SHELL32_24
-  25 stdcall SHELL32_25(ptr ptr) SHELL32_25
-  26 stub SHELL32_26
-  27 stub SHELL32_27
-  28 stub SHELL32_28
-  29 stdcall SHELL32_29(str) SHELL32_29
-  30 stdcall SHELL32_30(ptr long) SHELL32_30
-  31 stdcall SHELL32_31(str) SHELL32_31
-  32 stdcall SHELL32_32(str) SHELL32_32
-  33 stdcall SHELL32_33(str) SHELL32_33
-  34 stdcall SHELL32_34(str) SHELL32_34
-  35 stdcall SHELL32_35(str) SHELL32_35
-  36 stdcall SHELL32_36(str str) SHELL32_36
-  37 stdcall SHELL32_37(ptr str str) SHELL32_37
-  38 stub DoEnvironmentSubstW
-  39 stub SHELL32_39
-  40 stub SHELL32_40
-  41 stdcall DragAcceptFiles(long long) DragAcceptFiles
-  42 stub DragFinish
-  43 stub SHELL32_43
-  44 stub DragQueryFile
-  45 stdcall SHELL32_45(str) SHELL32_45
-  46 stub SHELL32_46
-  47 stub SHELL32_47
-  48 stub SHELL32_48
-  49 stub SHELL32_49
-  50 stub DragQueryFileA
-  51 stdcall SHELL32_51(str long long) SHELL32_51
-  52 stdcall SHELL32_52(str) SHELL32_52
-  53 stub DragQueryFileAorW
-  54 stub DragQueryFileW
-  55 stub SHELL32_55
-  56 stdcall SHELL32_56(str) SHELL32_56
-  57 stub SHELL32_57
-  58 stdcall SHELL32_58(long long long long) SHELL32_58
-  59 stub SHELL32_59
-  60 stdcall SHELL32_60(long) SHELL32_60
-  61 stdcall SHELL32_61(long long long str str long) SHELL32_61
-  62 stdcall SHELL32_62(long long long long) SHELL32_62
-  63 stdcall SHELL32_63(long long long long str str str) SHELL32_63
-  64 stub SHELL32_64
-  65 stub SHELL32_65
-  66 stub SHELL32_66
-  67 stub SHELL32_67
-  68 stdcall SHELL32_68(long long long) SHELL32_68
-  69 stub SHELL32_69
-  70 stub SHELL32_70
-  71 stdcall SHELL32_71(ptr ptr) SHELL32_71
-  72 stdcall SHELL32_72(ptr ptr long) SHELL32_72
-  73 stub SHELL32_73
-  74 stub SHELL32_74
-  75 stub SHELL32_75
-  76 stub DragQueryPoint
-  77 stdcall SHELL32_77(long long long) SHELL32_77
-  78 stub SHELL32_78
+   2 stdcall SHChangeNotifyRegister(long long long long long long) SHChangeNotifyRegister
+   3 stub CheckEscapesA   # exported by name
+   4 stub SHChangeNotifyDeregister
+   5 stub SHChangeNotifyUpdateEntryList
+   6 stub CheckEscapesW   # exported by name
+   7 stdcall CommandLineToArgvW(wstr ptr) CommandLineToArgvW   # exported by name
+   8 stub Control_FillCache_RunDLL   # exported by name
+   9 stub PifMgr_OpenProperties
+  10 stub PifMgr_GetProperties
+  11 stub PifMgr_SetProperties
+  12 stub Control_FillCache_RunDLLA   # exported by name
+  13 stub PifMgr_CloseProperties
+  14 stub Control_FillCache_RunDLLW   # exported by name
+  15 stdcall ILGetDisplayName(ptr ptr) ILGetDisplayName
+  16 stdcall ILFindLastID(ptr) ILFindLastID
+  17 stub ILRemoveLastID
+  18 stdcall ILClone(ptr) ILClone
+  19 stub ILCloneFirst
+  20 stub ILGlobalClone
+  21 stub ILIsEqual
+  22 stdcall Control_RunDLL(long long long long) Control_RunDLL # exported by name
+  23 stub ILIsParent
+  24 stub ILFindChild
+  25 stdcall ILCombine(ptr ptr) ILCombine
+  26 stub ILLoadFromStream
+  27 stub ILSaveToStream
+  28 stub SHILCreateFromPath
+  29 stdcall PathIsRoot(str) PathIsRoot
+  30 stdcall PathBuildRoot(ptr long) PathBuildRoot
+  31 stdcall PathFindExtension(str) PathFindExtension
+  32 stdcall PathAddBackslash(str) PathAddBackslash
+  33 stdcall PathRemoveBlanks(str) PathRemoveBlanks
+  34 stdcall PathFindFilename(str) PathFindFilename
+  35 stdcall PathRemoveFileSpec(str) PathRemoveFileSpec
+  36 stdcall PathAppend(str str) PathAppend
+  37 stdcall PathCombine(ptr str str) PathCombine
+  38 stub PathStripPath
+  39 stdcall PathIsUNC(str) PathIsUNC
+  40 stub PathIsRelative
+  41 stub Control_RunDLLA   # exported by name
+  42 stub Control_RunDLLW   # exported by name
+  43 stub PathIsExe
+  44 stub DoEnvironmentSubstA   # exported by name
+  45 stdcall PathFileExists(str) PathFileExists
+  46 stub PathMatchSpec
+  47 stub PathMakeUniqueName
+  48 stub PathSetDlgItemPath
+  49 stub PathQualify
+  50 stub PathStripToRoot
+  51 stdcall PathResolve(str long long) PathResolve
+  52 stdcall PathGetArgs(str) PathGetArgs
+  53 stub DoEnvironmentSubstW   # exported by name
+  54 stdcall DragAcceptFiles(long long) DragAcceptFiles   # exported by name
+  55 stub PathQuoteSpaces
+  56 stdcall PathUnquoteSpaces(str) PathUnquoteSpaces
+  57 stub PathGetDriveNumber
+  58 stdcall ParseField(str long str long) ParseField
+  59 stub RestartDialog
+  60 stdcall ExitWindowsDialog(long) ExitWindowsDialog
+  61 stdcall RunFileDlg(long long long str str long) RunFileDlg
+  62 stdcall PickIconDlg(long long long long) PickIconDlg
+  63 stdcall GetFileNameFromBrowse(long long long long str str str) GetFileNameFromBrowse
+  64 stub DriveType
+  65 stub InvalidateDriveType
+  66 stub IsNetDrive
+  67 stub Shell_MergeMenus
+  68 stdcall SHGetSettings(long long long) SHGetSettings
+  69 stub SHGetNetResource
+  70 stub SHCreateDefClassObject
+  71 stdcall Shell_GetImageList(ptr ptr) Shell_GetImageList
+  72 stdcall Shell_GetCachedImageIndex(ptr ptr long) Shell_GetCachedImageIndex
+  73 stub SHShellFolderView_Message
+  74 stub SHCreateStdEnumFmtEtc
+  75 stdcall PathYetAnotherMakeUniqueName(ptr ptr) PathYetAnotherMakeUniqueName
+  76 stub DragQueryInfo
+  77 stdcall SHMapPIDLToSystemImageListIndex(long long long) SHMapPIDLToSystemImageListIndex
+  78 stub OleStrToStrN@16
+#  79 stub StrToOleStrN@16
   79 stdcall SHELL32_79(str ptr) SHELL32_79
-  80 stub DuplicateIcon
-  81 stub SHELL32_81
-  82 stdcall ExtractAssociatedIconA(long ptr long) ExtractAssociatedIcon32A
-  83 stub SHELL32_83
-  84 stub SHELL32_84
-  85 stdcall SHELL32_85(long long long long) SHELL32_85
-  86 stdcall SHELL32_86(long ptr) SHELL32_86
-  87 stdcall SHELL32_87(long) SHELL32_87
-  88 stub SHELL32_88
-  89 stdcall SHELL32_89(long long long) SHELL32_89
-  90 stub SHELL32_90
-  91 stub SHELL32_91
-  92 stub SHELL32_92
-  93 stub SHELL32_93
-  94 stub SHELL32_94
-  95 stub SHELL32_95
-  96 stub SHELL32_96
-  97 stub SHELL32_97
-  98 stub SHELL32_98
-  99 stub SHELL32_99
- 100 stdcall SHELL32_100(long) SHELL32_100
- 101 stub ExtractAssociatedIconExA
- 102 stdcall SHELL32_102(ptr ptr long ptr ptr) SHELL32_102
- 103 stub SHELL32_103
- 104 stub SHELL32_104
- 105 stub SHELL32_105
- 106 stub SHELL32_106
- 107 stub SHELL32_107
- 108 stub SHELL32_108
- 109 stub SHELL32_109
- 110 stub SHELL32_110
- 111 stub SHELL32_111
- 112 stub SHELL32_112
- 113 stub SHELL32_113
- 114 stub SHELL32_114
- 115 stub SHELL32_115
- 116 stub SHELL32_116
- 117 stub SHELL32_117
- 118 stub SHELL32_118
- 119 stdcall SHELL32_119(ptr) SHELL32_119
- 120 stub SHELL32_120
- 121 stub SHELL32_121
- 122 stub SHELL32_122
- 123 stub SHELL32_123
- 124 stub ExtractAssociatedIconExW
- 125 stub ExtractAssociatedIconW
- 126 stub SHELL32_126
- 127 stub SHELL32_127
+  80 stub DragFinish   # exported by name
+  81 stub DragQueryFile   # exported by name
+  82 stub DragQueryFileA   # exported by name
+  83 stub CIDLData_CreateFromIDArray
+  84 stub SHIsBadInterfacePtr
+  85 stdcall OpenRegStream(long long long long) OpenRegStream
+  86 stdcall SHRegisterDragDrop(long ptr) SHRegisterDragDrop
+  87 stdcall SHRevokeDragDrop(long) SHRevokeDragDrop
+  88 stub SHDoDragDrop
+  89 stdcall SHCloneSpecialIDList(long long long) SHCloneSpecialIDList
+  90 stub SHFindFiles
+  91 stub SHFindComputer
+  92 stub PathGetShortPath
+  93 stub Win32CreateDirectory
+  94 stub Win32RemoveDirectory
+  95 stub SHLogILFromFSIL
+  96 stub StrRetToStrN
+  97 stub SHWaitForFileToOpen
+  98 stub SHGetRealIDL
+  99 stub SetAppStartingCursor
+ 100 stdcall SHRestricted(long) SHRestricted
+ 101 stub DragQueryFileAorW   # exported by name
+ 102 stdcall SHCoCreateInstance(ptr ptr long ptr ptr) SHCoCreateInstance
+ 103 stdcall SignalFileOpen(long) SignalFileOpen
+ 104 stub FileMenu_DeleteAllItems
+ 105 stub FileMenu_DrawItem
+ 106 stub FileMenu_FindSubMenuByPidl
+ 107 stub FileMenu_GetLastSelectedItemPidls
+ 108 stub FileMenu_HandleMenuChar
+ 109 stub FileMenu_InitMenuPopup
+ 110 stub FileMenu_InsertUsingPidl
+ 111 stub FileMenu_Invalidate
+ 112 stub FileMenu_MeasureItem
+ 113 stub FileMenu_ReplaceUsingPidl
+ 114 stub FileMenu_Create
+ 115 stub FileMenu_AppendItem
+ 116 stub FileMenu_TrackPopupMenuEx
+ 117 stub FileMenu_DeleteItemByCmd
+ 118 stub FileMenu_Destroy
+ 119 stdcall IsLFNDrive(ptr) IsLFNDrive
+ 120 stub FileMenu_AbortInitMenu
+ 121 stub SHFlushClipboard
+ 122 stub RunDLL_CallEntry16
+ 123 stub SHFreeUnusedLibraries
+ 124 stub FileMenu_AppendFilesForPidl
+ 125 stub FileMenu_AddFilesForPidl
+ 126 stub SHOutOfMemoryMessageBox
+ 127 stub SHWinHelp
  128 stdcall DllGetClassObject(long long ptr) SHELL32_DllGetClassObject
- 129 stub SHELL32_129
- 130 stub SHELL32_130
- 131 stub SHELL32_131
- 132 stub SHELL32_132
- 133 stdcall ExtractIconA(long str long) ExtractIcon32A
- 134 stub SHELL32_134
- 135 stub ExtractIconEx
- 136 stub SHELL32_136
- 137 stub SHELL32_137
- 138 stub ExtractIconExA
- 139 stub SHELL32_139
- 140 stub SHELL32_140
- 141 stub SHELL32_141
- 142 stub SHELL32_142
- 143 stub SHELL32_143
- 144 stub SHELL32_144
- 145 stub SHELL32_145
- 146 stub SHELL32_146
- 147 stdcall SHELL32_147(long long) SHELL32_147
- 148 stub ExtractIconResInfoA
- 149 stub SHELL32_149
- 150 stub ExtractIconResInfoW
- 151 stub SHELL32_151
- 152 stdcall SHELL32_152(ptr) SHELL32_152
- 153 stub SHELL32_153
- 154 stub SHELL32_154
- 155 stdcall SHELL32_155(ptr) SHELL32_155
- 156 stub SHELL32_156
- 157 stub SHELL32_157
- 158 stub SHELL32_158
- 159 stub SHELL32_159
- 160 stub SHELL32_160
- 161 stub SHELL32_161
- 162 stub SHELL32_162
- 163 stub SHELL32_163
- 164 stub SHELL32_164
- 165 stdcall SHELL32_165(long long) SHELL32_165
- 166 stub SHELL32_166
- 167 stub SHELL32_167
- 168 stub SHELL32_168
- 169 stub SHELL32_169
- 170 stub SHELL32_170
- 171 stub SHELL32_171
- 172 stub SHELL32_172
- 173 stub SHELL32_173
- 174 stub SHELL32_174
- 175 stdcall SHELL32_175(long long long long) SHELL32_175
- 176 stub SHELL32_176
- 177 stub SHELL32_177
- 178 stub SHELL32_178
- 179 stub SHELL32_179
- 180 stdcall ExtractIconW(long wstr long) ExtractIcon32W
- 181 stdcall SHELL32_181(long long) SHELL32_181
- 182 stub ExtractVersionResource16W
- 183 cdecl SHELL32_183(long long long long long long) SHELL32_183
- 184 stdcall SHELL32_184(long long long long long) SHELL32_184
- 185 stub SHELL32_185
- 186 stdcall FindExecutableA(ptr ptr ptr) FindExecutable32A
- 187 stub FindExecutableW
- 188 stdcall FreeIconList(long) FreeIconList
- 189 stub InternalExtractIconListA
- 190 stub InternalExtractIconListW
- 191 stub OpenAs_RunDLL
- 192 stub PrintersGetCommand_RunDLL
- 193 stub RealShellExecuteA
- 194 stub RealShellExecuteExA
- 195 stdcall SHELL32_195(ptr) SHELL32_195
- 196 stdcall SHELL32_196(long) SHELL32_196
- 197 stub SHELL32_197
- 198 stub SHELL32_198
- 199 stub SHELL32_199
- 200 stub SHELL32_200
- 201 stub SHELL32_201
- 202 stub SHELL32_202
- 203 stub RealShellExecuteExW
- 204 stub RealShellExecuteW
- 205 stub RegenerateUserEnvironment
- 206 stub SHAddToRecentDocs
- 207 stdcall SHAppBarMessage(long ptr) SHAppBarMessage32
- 208 stub SHBrowseForFolder
- 209 stdcall SHBrowseForFolderA(ptr) SHBrowseForFolder32A
- 210 stub SHChangeNotify
- 211 stub SHFileOperation
- 212 stub SHFileOperationA
- 213 stub SHFormatDrive
- 214 stub SHFreeNameMappings
- 215 stub SHGetDataFromIDListA
- 216 stdcall SHGetDesktopFolder(ptr) SHGetDesktopFolder
- 217 stdcall SHGetFileInfo(ptr long ptr long long) SHGetFileInfo32A
- 218 stdcall SHGetFileInfoA(ptr long ptr long long) SHGetFileInfo32A
- 219 stub SHGetInstanceExplorer
- 220 stdcall SHGetMalloc(ptr) SHGetMalloc
- 221 stdcall SHGetPathFromIDList(ptr ptr) SHGetPathFromIDList
- 222 stub SHGetPathFromIDListA
- 223 stdcall SHGetSpecialFolderLocation(long long ptr) SHGetSpecialFolderLocation
- 224 stdcall SHHelpShortcuts_RunDLL(long long long long) SHHelpShortcuts_RunDLL
- 225 stub SHLoadInProc
- 226 stub SheChangeDirA
- 227 stub SheChangeDirExA
- 228 stub SheChangeDirExW
- 229 stub SheChangeDirW
- 230 stub SheConvertPathW
- 231 stub SheFullPathA
- 232 stub SheFullPathW
- 233 stub SheGetCurDrive
- 234 stub SheGetDirA
- 235 stub SheGetDirExW
- 236 stub SheGetDirW
- 237 stub SheGetPathOffsetW
- 238 stub SheRemoveQuotesA
- 239 stub SheRemoveQuotesW
- 240 stub SheSetCurDrive
- 241 stub SheShortenPathA
- 242 stub SheShortenPathW
- 243 stdcall ShellAboutA(long str str long) ShellAbout32A
- 244 stdcall ShellAboutW(long wstr wstr long) ShellAbout32W
- 245 stdcall ShellExecuteA(long str str str str long) ShellExecute32A
- 246 stub ShellExecuteEx
- 247 stub ShellExecuteExA
- 248 stub ShellExecuteW
- 249 stdcall Shell_NotifyIcon(long ptr) Shell_NotifyIcon
- 250 stdcall Shell_NotifyIconA(long ptr) Shell_NotifyIconA
- 251 stub Shl1632_ThunkData32
- 252 stub Shl3216_ThunkData32
- 505 stub SHELL32_505
- 507 stub SHELL32_507
- 510 stub SHELL32_510
- 511 stub SHELL32_511
-1025 stub ExtractIconExW # proper ordinal unknown
-1030 stub FindExeDlgProc # proper ordinal unknown
-1043 stub RegisterShellHook # proper ordinal unknown
-1048 stub SHBrowseForFolderW # proper ordinal unknown
-1052 stub SHFileOperationW # proper ordinal unknown
-1058 stub SHGetFileInfoW # proper ordinal unknown
-1063 stub SHGetPathFromIDListW # proper ordinal unknown
-1089 stub ShellExecuteExW # proper ordinal unknown
-1091 stub ShellHookProc # proper ordinal unknown
-1094 stub Shell_NotifyIconW # proper ordinal unknown
-1095 stub StrChrA # proper ordinal unknown
-1096 stub StrChrIA # proper ordinal unknown
-1097 stub StrChrIW # proper ordinal unknown
-1098 stub StrChrW # proper ordinal unknown
-1099 stub StrCmpNA # proper ordinal unknown
-1100 stub StrCmpNIA # proper ordinal unknown
-1101 stub StrCmpNIW # proper ordinal unknown
-1102 stub StrCmpNW # proper ordinal unknown
-1103 stub StrCpyNA # proper ordinal unknown
-1104 stub StrCpyNW # proper ordinal unknown
-1105 stub StrNCmpA # proper ordinal unknown
-1106 stub StrNCmpIA # proper ordinal unknown
-1107 stub StrNCmpIW # proper ordinal unknown
-1108 stub StrNCmpW # proper ordinal unknown
-1109 stub StrNCpyA # proper ordinal unknown
-1110 stub StrNCpyW # proper ordinal unknown
-1111 stub StrRChrA # proper ordinal unknown
-1112 stub StrRChrIA # proper ordinal unknown
-1113 stub StrRChrIW # proper ordinal unknown
-1114 stub StrRChrW # proper ordinal unknown
-1115 stub StrRStrA # proper ordinal unknown
-1116 stub StrRStrIA # proper ordinal unknown
-1117 stub StrRStrIW # proper ordinal unknown
-1118 stub StrRStrW # proper ordinal unknown
-1119 stub StrStrA # proper ordinal unknown
-1120 stub StrStrIA # proper ordinal unknown
-1121 stub StrStrIW # proper ordinal unknown
-1122 stub StrStrW # proper ordinal unknown
-1123 stub WOWShellExecute # proper ordinal unknown
+ 129 stub DAD_AutoScroll
+ 130 stub DAD_DragEnter
+ 131 stub DAD_DragEnterEx
+ 132 stub DAD_DragLeave
+ 133 stub DragQueryFileW   # exported by name
+ 134 stub DAD_DragMove
+ 135 stub DragQueryPoint   # exported by name
+ 136 stub DAD_SetDragImage
+ 137 stub DAD_ShowDragImage
+ 138 stub DuplicateIcon   # exported by name
+ 139 stub Desktop_UpdateBriefcaseOnEvent
+ 140 stub FileMenu_DeleteItemByIndex
+ 141 stub FileMenu_DeleteItemByFirstID
+ 142 stub FileMenu_DeleteSeparator
+ 143 stub FileMenu_EnableItemByCmd
+ 144 stub FileMenu_GetItemExtent
+ 145 stub PathFindOnPath
+ 146 stub RLBuildListOfPaths
+ 147 stdcall SHCLSIDFromString(long long) SHCLSIDFromString
+ 148 stdcall ExtractAssociatedIconA(long ptr long) ExtractAssociatedIcon32A   # exported by name
+ 149 stub SHFind_InitMenuPopup
+ 150 stub ExtractAssociatedIconExA   # exported by name
+ 151 stub SHLoadOLE
+ 152 stdcall ILGetSize(ptr) ILGetSize
+ 153 stub ILGetNext
+ 154 stub ILAppend
+ 155 stdcall ILFree(ptr) ILFree
+ 156 stub ILGlobalFree
+ 157 stub ILCreateFromPath
+ 158 stdcall PathGetExtension(str long long) PathGetExtension
+ 159 stub PathIsDirectory
+ 160 stub SHNetConnectionDialog
+ 161 stub SHRunConrolPanel
+ 162 stub SHSimpleIDListFromPath
+ 163 stub StrToOleStr
+ 164 stub Win32DeleteFile
+ 165 stdcall SHCreateDirectory(long long) SHCreateDirectory
+ 166 stub CallCPLEntry16
+ 167 stub SHAddFromPropSheetExtArray
+ 168 stub SHCreatePropSheetExtArray
+ 169 stub SHDestroyPropSheetExtArray
+ 170 stub SHReplaceFromPropSheetExtArray
+ 171 stub PathCleanupSpec
+ 172 stub SHCreateLinks
+ 173 stub SHValidateUNC
+ 174 stub SHCreateShellFolderViewEx
+ 175 stdcall SHGetSpecialFolderPath(long long long long) SHGetSpecialFolderPath
+ 176 stub SHSetInstanceExplorer
+ 177 stub DAD_SetDragImageFromListView
+ 178 stub SHObjectProperties
+ 179 stub SHGetNewLinkInfoA
+ 180 stub SHGetNewLinkInfoW
+ 181 stdcall RegisterShellHook(long long) RegisterShellHook32
+ 182 stub ShellMessageBoxW
+ 183 cdecl ShellMessageBoxA(long long long long long long) ShellMessageBoxA
+ 184 stdcall ArrangeWindows(long long long long long) ArrangeWindows
+ 185 stub SHHandleDiskFull
+ 186 stub ExtractAssociatedIconExW   # exported by name
+ 187 stub ExtractAssociatedIconW   # exported by name
+ 188 stdcall ExtractIconA(long str long) ExtractIcon32A   # exported by name
+ 189 stub ExtractIconEx   # exported by name
+ 190 stub ExtractIconExA   # exported by name
+ 191 stub ExtractIconExW   # exported by name
+ 192 stub ExtractIconResInfoA   # exported by name
+ 193 stub ExtractIconResInfoW   # exported by name
+ 194 stdcall ExtractIconW(long wstr long) ExtractIcon32W   # exported by name
+ 195 stdcall SHFree(ptr) SHFree
+ 196 stdcall SHAlloc(long) SHAlloc
+ 197 stub SHGlobalDefect
+ 198 stub SHAbortInvokeCommand
+ 199 stub SHGetFileIcon
+ 200 stub SHLocalAlloc
+ 201 stub SHLocalFree
+ 202 stub SHLocalReAlloc
+ 203 stub AddCommasW
+ 204 stub ShortSizeFormatW
+ 205 stub Printer_LoadIconsW
+ 206 stub Link_AddExtraDataSection
+ 207 stub Link_ReadExtraDataSection
+ 208 stub Link_RemoveExtraDataSection
+ 209 stub Int64ToString
+ 210 stub LargeIntegerToString
+ 211 stub Printers_GetPidl
+ 212 stub Printer_AddPrinterPropPages
+ 213 stub Printers_RegisterWindowW
+ 214 stub Printers_UnregisterWindow
+ 215 stub SHStartNetConnectionDialog@12
+ 216 stub ExtractVersionResource16W   # exported by name
+ 217 stub FindExeDlgProc   # exported by name
+ 218 stdcall FindExecutableA(ptr ptr ptr) FindExecutable32A   # exported by name
+ 219 stub FindExecutableW   # exported by name
+ 220 stdcall FreeIconList(long) FreeIconList   # exported by name
+ 221 stub InternalExtractIconListA   # exported by name
+ 222 stub InternalExtractIconListW   # exported by name
+ 223 stub OpenAs_RunDLL   # exported by name
+ 224 stub OpenAs_RunDLLA   # exported by name
+ 225 stub OpenAs_RunDLLW   # exported by name
+ 226 stub PrintersGetCommand_RunDLL   # exported by name
+ 227 stub PrintersGetCommand_RunDLLA   # exported by name
+ 228 stub PrintersGetCommand_RunDLLW   # exported by name
+ 229 stub RealShellExecuteA   # exported by name
+ 230 stub RealShellExecuteExA   # exported by name
+ 231 stub RealShellExecuteExW   # exported by name
+ 232 stub RealShellExecuteW   # exported by name
+ 233 stub RegenerateUserEnvironment@8   # exported by name
+ 234 stub SHAddToRecentDocs@8   # exported by name
+ 235 stdcall SHAppBarMessage(long ptr) SHAppBarMessage32   # exported by name
+ 236 stub SHBrowseForFolder@4   # exported by name
+ 237 stdcall SHBrowseForFolderA(ptr) SHBrowseForFolder32A   # exported by name
+ 238 stub SHBrowseForFolderW@4   # exported by name
+ 239 stub SHChangeNotify@16   # exported by name
+ 240 stub SHEmptyRecycleBinA@12   # exported by name
+ 241 stub SHEmptyRecycleBinW@12   # exported by name
+ 242 stub SHFileOperation@4   # exported by name
+ 243 stub SHFileOperationA@4   # exported by name
+ 244 stub SHFileOperationW@4   # exported by name
+ 245 stub SHFormatDrive@16   # exported by name
+ 246 stub SHFreeNameMappings@4   # exported by name
+ 247 stub SHGetDataFromIDListA@20   # exported by name
+ 248 stub SHGetDataFromIDListW@20   # exported by name
+ 249 stub PathParseIconLocation@4
+ 250 stub PathRemoveExtension@4
+ 251 stub PathRemoveArgs@5
+ 252 stdcall SHGetDesktopFolder(ptr) SHGetDesktopFolder   # exported by name
+ 253 stdcall SHGetFileInfo(ptr long ptr long long) SHGetFileInfo32A   # exported by name
+ 254 stdcall SHGetFileInfoA(ptr long ptr long long) SHGetFileInfo32A   # exported by name
+ 255 stub SHGetFileInfoW@20 # exported by name
+ 256 stub SHGetInstanceExplorer   # exported by name
+ 257 stdcall SHGetMalloc(ptr) SHGetMalloc   # exported by name
+ 258 stub SHGetNewLinkInfo@20   # exported by name
+ 259 stdcall SHGetPathFromIDList(ptr ptr) SHGetPathFromIDList   # exported by name
+ 260 stub SHGetPathFromIDList@8   # exported by name
+ 261 stub SHGetPathFromIDListA@8   # exported by name
+ 262 stub SHGetPathFromIDListW@8   # exported by name
+ 263 stdcall SHGetSpecialFolderLocation(long long ptr) SHGetSpecialFolderLocation   # exported by name
+ 264 stdcall SHHelpShortcuts_RunDLL(long long long long) SHHelpShortcuts_RunDLL   # exported by name
+ 265 stub SHHelpShortcuts_RunDLLA@16   # exported by name
+ 266 stub SHHelpShortcuts_RunDLLW@16   # exported by name
+ 267 stdcall SHLoadInProc(long) SHLoadInProc   # exported by name
+ 268 stub SHQueryRecycleBinA@8   # exported by name
+ 269 stub SHQueryRecycleBinW@8   # exported by name
+ 270 stub SHUpdateRecycleBinIcon@0   # exported by name
+
+ 271 stub SheChangeDirA
+ 272 stub SheChangeDirExA
+ 273 stub SheChangeDirExW
+ 274 stub SheChangeDirW
+ 275 stub SheConvertPathW
+ 276 stub SheFullPathA
+ 277 stub SheFullPathW
+ 278 stub SheGetCurDrive
+ 279 stub SheGetDirA
+ 280 stub SheGetDirExW
+ 281 stub SheGetDirW
+ 282 stub SheGetPathOffsetW
+ 283 stub SheRemoveQuotesA
+ 284 stub SheRemoveQuotesW
+ 285 stub SheSetCurDrive
+ 286 stub SheShortenPathA
+ 287 stub SheShortenPathW
+ 288 stdcall ShellAboutA(long str str long) ShellAbout32A
+ 289 stdcall ShellAboutW(long wstr wstr long) ShellAbout32W
+ 290 stdcall ShellExecuteA(long str str str str long) ShellExecute32A
+ 291 stub ShellExecuteEx
+ 292 stub ShellExecuteExA
+ 293 stub ShellExecuteExW
+ 294 stub ShellExecuteW
+ 295 stub ShellHookProc   # exported by name
+ 296 stdcall Shell_NotifyIcon(long ptr) Shell_NotifyIcon
+ 297 stdcall Shell_NotifyIconA(long ptr) Shell_NotifyIconA
+ 298 stub Shell_NotifyIconW   # exported by name
+ 299 stub Shl1632_ThunkData32
+ 300 stub Shl3216_ThunkData32
+ 301 stub StrChrA # proper ordinal unknown
+ 302 stub StrChrIA # proper ordinal unknown
+ 303 stub StrChrIW # proper ordinal unknown
+ 304 stub StrChrW # proper ordinal unknown
+ 305 stub StrCmpNA # proper ordinal unknown
+ 306 stub StrCmpNIA # proper ordinal unknown
+ 307 stub StrCmpNIW # proper ordinal unknown
+ 308 stub StrCmpNW # proper ordinal unknown
+ 309 stub StrCpyNA # proper ordinal unknown
+ 310 stub StrCpyNW # proper ordinal unknown
+ 311 stub StrNCmpA # proper ordinal unknown
+ 312 stub StrNCmpIA # proper ordinal unknown
+ 313 stub StrNCmpIW # proper ordinal unknown
+ 314 stub StrNCmpW # proper ordinal unknown
+ 315 stub StrNCpyA # proper ordinal unknown
+ 316 stub StrNCpyW # proper ordinal unknown
+ 317 stub StrRChrA # proper ordinal unknown
+ 318 stub StrRChrIA # proper ordinal unknown
+ 319 stub StrRChrIW # proper ordinal unknown
+ 320 stub StrRChrW # proper ordinal unknown
+ 321 stub StrRStrA # proper ordinal unknown
+ 322 stub StrRStrIA # proper ordinal unknown
+ 323 stub StrRStrIW # proper ordinal unknown
+ 324 stub StrRStrW # proper ordinal unknown
+ 325 stub StrStrA # proper ordinal unknown
+ 326 stub StrStrIA # proper ordinal unknown
+ 327 stub StrStrIW # proper ordinal unknown
+ 328 stub StrStrW # proper ordinal unknown 
+ 329 stub WOWShellExecute # proper ordinal unknown
+
+ 505 stub SHRegCloseKey@4
+ 506 stub SHRegOpenKeyA@12
+ 507 stub SHRegOpenKeyW@12
+ 508 stub SHRegQueryValueA@16
+ 509 stub SHRegQueryValueExA@24
+ 510 stub SHRegQueryValueW@16
+ 511 stub SHRegQueryValueExW@24
+ 512 stub SHRegDeleteKeyW@8
+
+ 520 stub SHAllocShared@12
+ 521 stub SHLockShared@8
+ 522 stub SHUnlockShared@4
+ 523 stub SHFreeShared@8
+ 524 stub RealDriveType@8
+ 525 stub RealDriveTypeFlags@8
+
+ 640 stub NTSHChangeNotifyRegister@24
+ 641 stub NTSHChangeNotifyDeregister@4
+
+ 643 stub SHChangeNotifyReceive@16
+ 644 stub SHChangeNotification_Lock@16
+ 645 stub SHChangeNotification_Unlock@4
+ 646 stub SHChangeRegistrationReceive@8
+ 647 stub ReceiveAddToRecentDocs
+ 648 stub SHWaitOp_Operate@8
+
+ 650 stub PathIsSameRoot
+ 651 stub ReadCabinetState
+ 652 stub WriteCabinetState@4
+ 653 stub PathProcessCommand
+
+ 660 stub FileIconInit
+
+ 680 stub IsUserAdmin
+
+1217 stub FOOBAR1217   # no joke! This is the real name!!
diff --git a/relay32/winmm.spec b/relay32/winmm.spec
index fc210e6..2ebbdd7 100644
--- a/relay32/winmm.spec
+++ b/relay32/winmm.spec
@@ -51,7 +51,7 @@
  48 stub mciLoadCommandResource
  49 stdcall mciSendCommandA(long long long long) mciSendCommand32A
  50 stub mciSendCommandW
- 51 stdcall mciSendStringA(ptr ptr long long) mciSendString
+ 51 stdcall mciSendStringA(str ptr long long) mciSendString
  52 stub mciSendStringW
  53 stub mciSetDriverData
  54 stub mciSetYieldProc
diff --git a/relay32/wsock32.spec b/relay32/wsock32.spec
index de18bce..b1b49f5 100644
--- a/relay32/wsock32.spec
+++ b/relay32/wsock32.spec
@@ -10,7 +10,7 @@
 007 stdcall getsockopt(long long long ptr ptr) WINSOCK_getsockopt32
 008 stdcall htonl(long) WINSOCK_htonl
 009 stdcall htons(long) WINSOCK_htons
-010 stdcall inet_addr(ptr) WINSOCK_inet_addr
+010 stdcall inet_addr(str) WINSOCK_inet_addr
 011 stdcall inet_ntoa(ptr) WINSOCK_inet_ntoa32
 012 stdcall ioctlsocket(long long ptr) WINSOCK_ioctlsocket32
 013 stdcall listen(long long) WINSOCK_listen32
diff --git a/scheduler/Makefile.in b/scheduler/Makefile.in
index c0b0a2e..c273db6 100644
--- a/scheduler/Makefile.in
+++ b/scheduler/Makefile.in
@@ -6,6 +6,7 @@
 MODULE    = scheduler
 
 C_SRCS = \
+	client.c \
 	critsection.c \
 	event.c \
 	handle.c \
diff --git a/scheduler/client.c b/scheduler/client.c
new file mode 100644
index 0000000..c7910b3
--- /dev/null
+++ b/scheduler/client.c
@@ -0,0 +1,308 @@
+/*
+ * Client part of the client/server communication
+ *
+ * Copyright (C) 1998 Alexandre Julliard
+ */
+
+#include <assert.h>
+#include <errno.h>
+#include <stdio.h>
+#include <string.h>
+#include <sys/socket.h>
+#include <sys/uio.h>
+#include <unistd.h>
+
+#include "process.h"
+#include "thread.h"
+#include "server.h"
+#include "winerror.h"
+
+
+/***********************************************************************
+ *           CLIENT_SendRequest_v
+ *
+ * Send a request to the server.
+ */
+static void CLIENT_SendRequest_v( enum request req, int pass_fd,
+                                  struct iovec *vec, int veclen )
+{
+    THDB *thdb = THREAD_Current();
+    struct { struct cmsghdr hdr; int fd; } cmsg =
+                         { { sizeof(cmsg), SOL_SOCKET, SCM_RIGHTS }, pass_fd };
+    struct msghdr msghdr;
+    struct header head;
+    int i, ret, len;
+
+    msghdr.msg_name    = NULL;
+    msghdr.msg_namelen = 0;
+
+    assert( veclen > 0 );
+
+    vec[0].iov_base   = &head;
+    vec[0].iov_len    = sizeof(head);
+    msghdr.msg_iov    = vec;
+    msghdr.msg_iovlen = veclen;
+    for (i = len = 0; i < veclen; i++) len += vec[i].iov_len;
+
+    assert( len <= MAX_MSG_LENGTH );
+    head.type = req;
+    head.len  = len;
+    head.seq  = thdb->seq++;
+
+    if (pass_fd == -1)  /* no fd to pass */
+    {
+        msghdr.msg_control = NULL;
+        msghdr.msg_controllen = 0;
+    }
+    else
+    {
+        msghdr.msg_control = &cmsg;
+        msghdr.msg_controllen = sizeof(cmsg);
+    }
+
+    if ((ret = sendmsg( thdb->socket, &msghdr, 0 )) < len)
+    {
+        fprintf( stderr, "Fatal protocol error: " );
+        if (ret == -1) perror( "sendmsg" );
+        else fprintf( stderr, "partial msg sent %d/%d\n", ret, len );
+        ExitThread(1);
+    }
+    /* we passed the fd now we can close it */
+    if (pass_fd != -1) close( pass_fd );
+}
+
+
+/***********************************************************************
+ *           CLIENT_SendRequest
+ *
+ * Send a request to the server.
+ */
+static void CLIENT_SendRequest( enum request req, int pass_fd,
+                                int n, ... /* arg_1, len_1, etc. */ )
+{
+    struct iovec vec[16];
+    va_list args;
+    int i;
+
+    n++;  /* for vec[0] */
+    assert( n < 16 );
+    va_start( args, n );
+    for (i = 1; i < n; i++)
+    {
+        vec[i].iov_base = va_arg( args, void * );
+        vec[i].iov_len  = va_arg( args, int );
+    }
+    va_end( args );
+    return CLIENT_SendRequest_v( req, pass_fd, vec, n );
+}
+
+
+/***********************************************************************
+ *           CLIENT_WaitReply_v
+ *
+ * Wait for a reply from the server.
+ * Returns the error code (or 0 if OK).
+ */
+static unsigned int CLIENT_WaitReply_v( int *len, int *passed_fd,
+                                        struct iovec *vec, int veclen )
+{
+    THDB *thdb = THREAD_Current();
+    struct { struct cmsghdr hdr; int fd; } cmsg =
+                         { { sizeof(cmsg), SOL_SOCKET, SCM_RIGHTS }, -1 };
+    struct msghdr msghdr;
+    struct header head;
+    int ret, remaining;
+
+    assert( veclen > 0 );
+    vec[0].iov_base       = &head;
+    vec[0].iov_len        = sizeof(head);
+    msghdr.msg_name       = NULL;
+    msghdr.msg_namelen    = 0;
+    msghdr.msg_iov        = vec;
+    msghdr.msg_iovlen     = veclen;
+    msghdr.msg_control    = &cmsg;
+    msghdr.msg_controllen = sizeof(cmsg);
+
+    if ((ret = recvmsg( thdb->socket, &msghdr, 0 )) == -1)
+    {
+        fprintf( stderr, "Fatal protocol error: " );
+        perror("recvmsg");
+        ExitThread(1);
+    }
+    if (ret < sizeof(head))
+    {
+        fprintf( stderr,
+                 "Fatal protocol error: partial header received %d/%d\n",
+                 ret, sizeof(head));
+        ExitThread(1);
+    }
+    if ((head.len < sizeof(head)) || (head.len > MAX_MSG_LENGTH))
+    {
+        fprintf( stderr, "Fatal protocol error: header length %d\n",
+                 head.len );
+        ExitThread(1);
+    }
+    if (head.seq != thdb->seq++)
+    {
+        fprintf( stderr,
+                 "Fatal protocol error: sequence %08x instead of %08x\n",
+                 head.seq, thdb->seq - 1 );
+        ExitThread(1);
+    }
+
+    if (head.type != ERROR_SUCCESS)
+    {
+        SetLastError( head.type );
+    }
+    else if (passed_fd)
+    {
+        *passed_fd = cmsg.fd;
+        cmsg.fd = -1;
+    }
+
+    if (len) *len = ret - sizeof(head);
+    if (cmsg.fd != -1) close( cmsg.fd );
+    remaining = head.len - ret;
+    while (remaining > 0)  /* drop remaining data */
+    {
+        char buffer[1024];
+        int len = remaining < sizeof(buffer) ? remaining : sizeof(buffer);
+        if ((len = recv( thdb->socket, buffer, len, 0 )) == -1)
+        {
+            fprintf( stderr, "Fatal protocol error: " );
+            perror( "recv" );
+            ExitThread(1);
+        }
+        remaining -= len;
+    }
+
+    return head.type;  /* error code */
+}
+
+
+/***********************************************************************
+ *           CLIENT_WaitReply
+ *
+ * Wait for a reply from the server.
+ */
+static unsigned int CLIENT_WaitReply( int *len, int *passed_fd,
+                                      int n, ... /* arg_1, len_1, etc. */ )
+{
+    struct iovec vec[16];
+    va_list args;
+    int i;
+
+    n++;  /* for vec[0] */
+    assert( n < 16 );
+    va_start( args, n );
+    for (i = 1; i < n; i++)
+    {
+        vec[i].iov_base = va_arg( args, void * );
+        vec[i].iov_len  = va_arg( args, int );
+    }
+    va_end( args );
+    return CLIENT_WaitReply_v( len, passed_fd, vec, n );
+}
+
+
+/***********************************************************************
+ *           send_new_thread
+ *
+ * Send a new thread request. Helper function for CLIENT_NewThread.
+ */
+static int send_new_thread( THDB *thdb )
+{
+    struct new_thread_request request;
+    struct new_thread_reply reply;
+    int len, fd[2];
+
+    if (socketpair( AF_UNIX, SOCK_STREAM, PF_UNIX, fd ) == -1)
+    {
+        SetLastError( ERROR_TOO_MANY_OPEN_FILES );  /* FIXME */
+        return -1;
+    }
+
+    request.pid = thdb->process->server_pid;
+    CLIENT_SendRequest( REQ_NEW_THREAD, fd[1], 1, &request, sizeof(request) );
+
+    if (CLIENT_WaitReply( &len, NULL, 1, &reply, sizeof(reply) )) goto error;
+    if (len < sizeof(reply)) goto error;
+    thdb->server_tid = reply.tid;
+    thdb->process->server_pid = reply.pid;
+    if (thdb->socket != -1) close( thdb->socket );
+    thdb->socket = fd[0];
+    thdb->seq = 0;  /* reset the sequence number for the new fd */
+    return 0;
+
+ error:
+    close( fd[0] );
+    return -1;
+}
+
+
+/***********************************************************************
+ *           CLIENT_NewThread
+ *
+ * Send a new thread request.
+ */
+int CLIENT_NewThread( THDB *thdb )
+{
+    extern BOOL32 THREAD_InitDone;
+
+    if (!THREAD_InitDone)  /* first thread -> start the server */
+    {
+        int tmpfd[2];
+        char buffer[16];
+
+        if (socketpair( AF_UNIX, SOCK_STREAM, PF_UNIX, tmpfd ) == -1)
+        {
+            perror("socketpair");
+            exit(1);
+        }
+        switch(fork())
+        {
+        case -1:  /* error */
+            perror("fork");
+            exit(1);
+        case 0:  /* child */
+            close( tmpfd[0] );
+            sprintf( buffer, "%d", tmpfd[1] );
+#ifdef EXEC_SERVER
+            execlp( "wineserver", "wineserver", buffer, NULL );
+            execl( "/usr/local/bin/wineserver", "wineserver", buffer, NULL );
+            execl( "./server/wineserver", "wineserver", buffer, NULL );
+#endif
+            server_main_loop( tmpfd[1] );
+            exit(0);
+        default:  /* parent */
+            close( tmpfd[1] );
+            SET_CUR_THREAD( thdb );
+            THREAD_InitDone = TRUE;
+            thdb->socket = tmpfd[0];
+            break;
+        }
+    }
+
+    return send_new_thread( thdb );
+}
+
+
+/***********************************************************************
+ *           CLIENT_InitThread
+ *
+ * Send an init thread request. Return 0 if OK.
+ */
+int CLIENT_InitThread(void)
+{
+    THDB *thdb = THREAD_Current();
+    struct init_thread_request init;
+    int len = strlen( thdb->process->env_db->cmd_line );
+
+    init.pid = getpid();
+    len = MIN( len, MAX_MSG_LENGTH - sizeof(init) );
+
+    CLIENT_SendRequest( REQ_INIT_THREAD, -1, 2,
+                        &init, sizeof(init),
+                        thdb->process->env_db->cmd_line, len );
+    return CLIENT_WaitReply( NULL, NULL, NULL, 0 );
+}
diff --git a/scheduler/k32obj.c b/scheduler/k32obj.c
index 3b91ab5..989d319 100644
--- a/scheduler/k32obj.c
+++ b/scheduler/k32obj.c
@@ -146,7 +146,8 @@
         return FALSE;
     }
     entry->next = K32OBJ_FirstEntry;
-    entry->obj = obj;
+    entry->obj  = obj;
+    entry->len  = len;
     lstrcpy32A( entry->name, name );
     K32OBJ_FirstEntry = entry;
     SYSTEM_UNLOCK();
diff --git a/scheduler/process.c b/scheduler/process.c
index 3ebc69b..c213d2a 100644
--- a/scheduler/process.c
+++ b/scheduler/process.c
@@ -19,6 +19,7 @@
 #include "winerror.h"
 #include "pe_image.h"
 #include "task.h"
+#include "server.h"
 #include "debug.h"
 
 /* Process self-handle */
@@ -112,6 +113,10 @@
     FILE_SetFileType( pdb->env_db->hStdout, FILE_TYPE_CHAR );
     FILE_SetFileType( pdb->env_db->hStderr, FILE_TYPE_CHAR );
 
+    /* Build the command-line */
+
+    pdb->env_db->cmd_line = HEAP_strdupA( SystemHeap, 0, "kernel32" );
+
     /* Build the environment strings */
 
     return ENV_BuildEnvironment( pdb );
@@ -210,7 +215,6 @@
  */
 BOOL32 PROCESS_Init(void)
 {
-    extern BOOL32 THREAD_InitDone;
     PDB32 *pdb;
     THDB *thdb;
 
@@ -225,12 +229,13 @@
     if (!(pdb = PROCESS_CreatePDB( NULL ))) return FALSE;
     if (!(thdb = THREAD_Create( pdb, 0, FALSE, NULL, NULL ))) return FALSE;
     thdb->unix_pid = getpid();
-    SET_CUR_THREAD( thdb );
-    THREAD_InitDone = TRUE;
 
     /* Create the environment DB of the first process */
     if (!PROCESS_BuildEnvDB( pdb )) return FALSE;
 
+    /* Initialize the first thread */
+    if (CLIENT_InitThread()) return FALSE;
+
     return TRUE;
 }
 
diff --git a/scheduler/sysdeps.c b/scheduler/sysdeps.c
index d76988a..390c68c 100644
--- a/scheduler/sysdeps.c
+++ b/scheduler/sysdeps.c
@@ -15,6 +15,7 @@
 #include <stdio.h>
 #include <unistd.h>
 #include "thread.h"
+#include "server.h"
 #include "winbase.h"
 #include "debug.h"
 
@@ -82,6 +83,7 @@
     LPTHREAD_START_ROUTINE func = (LPTHREAD_START_ROUTINE)thdb->entry_point;
     thdb->unix_pid = getpid();
     SET_FS( thdb->teb_sel );
+    CLIENT_InitThread();
     ExitThread( func( thdb->entry_arg ) );
 }
 #endif  /* __linux__ */
@@ -99,6 +101,8 @@
     if (clone( (int (*)(void *))SYSDEPS_StartThread, thread->teb.stack_top,
                CLONE_VM | CLONE_FS | CLONE_FILES | SIGCHLD, thread ) < 0)
         return -1;
+    /* FIXME: close the child socket in the parent process */
+/*    close( thread->socket );*/
 #else
     FIXME(thread, "CreateThread: stub\n" );
 #endif  /* __linux__ */
diff --git a/scheduler/thread.c b/scheduler/thread.c
index 1137d35..e881e05 100644
--- a/scheduler/thread.c
+++ b/scheduler/thread.c
@@ -14,6 +14,7 @@
 #include "selectors.h"
 #include "miscemu.h"
 #include "winnt.h"
+#include "server.h"
 #include "debug.h"
 
 #ifndef __i386__
@@ -152,6 +153,7 @@
     thdb->exit_code       = 0x103; /* STILL_ACTIVE */
     thdb->entry_point     = start_addr;
     thdb->entry_arg       = param;
+    thdb->socket          = -1;
 
     /* Allocate the stack */
 
@@ -199,6 +201,10 @@
 
     if (!(thdb->event = EVENT_Create( TRUE, FALSE ))) goto error;
 
+    /* Create the thread socket */
+
+    if (CLIENT_NewThread( thdb )) goto error;
+
     /* Initialize the thread context */
 
     GET_CS(cs);
@@ -216,6 +222,7 @@
     return thdb;
 
 error:
+    if (thdb->socket != -1) close( thdb->socket );
     if (thdb->event) K32OBJ_DecCount( thdb->event );
     if (thdb->teb.stack_sel) SELECTOR_FreeBlock( thdb->teb.stack_sel, 1 );
     if (thdb->teb_sel) SELECTOR_FreeBlock( thdb->teb_sel, 1 );
@@ -299,6 +306,7 @@
         }
     }
 #endif
+    close( thdb->socket );
     K32OBJ_DecCount( thdb->event );
     SELECTOR_FreeBlock( thdb->teb_sel, 1 );
     if (thdb->teb.stack_sel) SELECTOR_FreeBlock( thdb->teb.stack_sel, 1 );
@@ -314,7 +322,7 @@
                               LPTHREAD_START_ROUTINE start, LPVOID param,
                               DWORD flags, LPDWORD id )
 {
-    HANDLE32 handle;
+    HANDLE32 handle = INVALID_HANDLE_VALUE32;
     BOOL32 inherit = (sa && (sa->nLength>=sizeof(*sa)) && sa->bInheritHandle);
 
     THDB *thread = THREAD_Create( PROCESS_Current(), stack,
@@ -328,6 +336,7 @@
     return handle;
 
 error:
+    if (handle != INVALID_HANDLE_VALUE32) CloseHandle( handle );
     K32OBJ_DecCount( &thread->header );
     return INVALID_HANDLE_VALUE32;
 }
diff --git a/server/Makefile.in b/server/Makefile.in
new file mode 100644
index 0000000..1881c52
--- /dev/null
+++ b/server/Makefile.in
@@ -0,0 +1,26 @@
+DEFS      = @DLLFLAGS@ -D__WINE__ -D__WINE_SERVER__
+TOPSRCDIR = @top_srcdir@
+TOPOBJDIR = ..
+SRCDIR    = @srcdir@
+VPATH     = @srcdir@
+MODULE    = server
+
+C_SRCS = \
+	object.c \
+	process.c \
+	socket.c \
+	thread.c
+
+EXTRA_SRCS = main.c
+MAIN_OBJS = main.o
+
+PROGRAMS = wineserver
+
+all: $(MODULE).o $(PROGRAMS)
+
+@MAKE_RULES@
+
+wineserver: $(OBJS) $(MAIN_OBJS)
+	gcc -o $(PROGRAMS) $(OBJS) $(MAIN_OBJS)
+
+### Dependencies:
diff --git a/server/main.c b/server/main.c
new file mode 100644
index 0000000..a596a76
--- /dev/null
+++ b/server/main.c
@@ -0,0 +1,33 @@
+/*
+ * Server main function
+ *
+ * Copyright (C) 1998 Alexandre Julliard
+ */
+
+#include <ctype.h>
+#include <fcntl.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+
+#include "server.h"
+
+int main( int argc, char *argv[] )
+{
+    int fd;
+
+    if (argc != 2) goto error;
+    if (!isdigit( *argv[1] )) goto error;
+    fd = atoi( argv[1] );
+    /* make sure the fd is valid */
+    if (fcntl( fd, F_GETFL, 0 ) == -1) goto error;
+
+    fprintf( stderr, "Server: starting (pid=%d)\n", getpid() );
+    server_main_loop( fd );
+    fprintf( stderr, "Server: exiting (pid=%d)\n", getpid() );
+    exit(0);
+
+ error:    
+    fprintf( stderr, "%s: must be run from Wine.\n", argv[0] );
+    exit(1);
+}
diff --git a/server/object.c b/server/object.c
new file mode 100644
index 0000000..3724761
--- /dev/null
+++ b/server/object.c
@@ -0,0 +1,94 @@
+/*
+ * Server-side objects
+ * These are the server equivalent of K32OBJ
+ *
+ * Copyright (C) 1998 Alexandre Julliard
+ */
+
+#include <assert.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "server.h"
+#include "object.h"
+
+struct object_name
+{
+    struct object_name *next;
+    struct object      *obj;
+    int                 len;
+    char                name[1];
+};
+
+#define NAME_HASH_SIZE 37
+
+static struct object_name *names[NAME_HASH_SIZE];
+
+/*****************************************************************/
+
+static int get_name_hash( const char *name )
+{
+    int hash = 0;
+    while (*name) hash ^= *name++;
+    return hash % NAME_HASH_SIZE;
+}
+
+static struct object_name *add_name( struct object *obj, const char *name )
+{
+    struct object_name *ptr;
+    int hash = get_name_hash( name );
+    int len = strlen( name );
+
+    if (!(ptr = (struct object_name *)malloc( sizeof(*ptr) + len )))
+        return NULL;
+    ptr->next = names[hash];
+    ptr->obj  = obj;
+    ptr->len  = len;
+    strcpy( ptr->name, name );
+    names[hash] = ptr;
+    return ptr;
+}
+
+static void free_name( struct object *obj )
+{
+    int hash = get_name_hash( obj->name->name );
+    struct object_name **pptr = &names[hash];
+    while (*pptr && *pptr != obj->name) pptr = &(*pptr)->next;
+    assert( *pptr );
+    *pptr = (*pptr)->next;
+    free( obj->name );
+}
+
+/* initialize an already allocated object */
+void init_object( struct object *obj, const struct object_ops *ops,
+                  const char *name )
+{
+    obj->refcount = 1;
+    obj->ops      = ops;
+    if (!name) obj->name = NULL;
+    else obj->name = add_name( obj, name );
+}
+
+/* release an object (i.e. decrement its refcount */
+void release_object( void *ptr )
+{
+    struct object *obj = (struct object *)ptr;
+    assert( obj->refcount );
+    if (!--obj->refcount)
+    {
+        if (obj->name) free_name( obj );
+        obj->ops->destroy( obj );
+    }
+}
+
+/* find an object by its name; the refcount is incremented */
+struct object *find_object( const char *name )
+{
+    int hash = get_name_hash( name );
+    struct object_name *ptr = names[hash];
+    while (ptr && strcmp( ptr->name, name )) ptr = ptr->next;
+    if (!ptr) return NULL;
+    ptr->obj->refcount++;
+    return ptr->obj;
+}
+
diff --git a/server/object.h b/server/object.h
new file mode 100644
index 0000000..c9f6abe
--- /dev/null
+++ b/server/object.h
@@ -0,0 +1,55 @@
+/*
+ * Wine server objects
+ *
+ * Copyright (C) 1998 Alexandre Julliard
+ */
+
+#ifndef __WINE_OBJECT_H
+#define __WINE_OBJECT_H
+
+#include <sys/time.h>
+
+struct object;
+struct object_name;
+
+struct object_ops
+{
+    void (*destroy)(struct object *);    /* destroy on refcount == 0 */
+};
+
+struct object
+{
+    unsigned int              refcount;
+    const struct object_ops  *ops;
+    struct object_name       *name;
+};
+
+extern void init_object( struct object *obj, const struct object_ops *ops,
+                         const char *name );
+/* release object can take any pointer, but you better make sure that */
+/* the thing pointed to starts with a struct object... */
+extern void release_object( void *obj );
+
+/* request handlers */
+
+struct thread;
+typedef void (*req_handler)( void *data, int len, int fd, struct thread *self);
+extern const req_handler req_handlers[REQ_NB_REQUESTS];
+
+/* socket functions */
+
+extern int add_client( int client_fd, struct thread *self );
+extern void remove_client( int client_fd );
+extern int get_initial_client_fd(void);
+extern void set_timeout( int client_fd, struct timeval *when );
+extern int send_reply( int client_fd, int err_code, int pass_fd,
+                       int n, ... /* arg_1, len_1, ..., arg_n, len_n */ );
+
+/* process functions */
+
+struct process;
+
+extern struct process *create_process(void);
+extern struct process *get_process_from_id( void *id );
+
+#endif  /* __WINE_OBJECT_H */
diff --git a/server/process.c b/server/process.c
new file mode 100644
index 0000000..95690db
--- /dev/null
+++ b/server/process.c
@@ -0,0 +1,66 @@
+/*
+ * Server-side process management
+ *
+ * Copyright (C) 1998 Alexandre Julliard
+ */
+
+#include <assert.h>
+#include <stdlib.h>
+
+#include "server.h"
+#include "object.h"
+
+
+/* process structure; not much for now... */
+
+struct process
+{
+    struct object   obj;       /* object header */
+    struct process *next;      /* system-wide process list */
+    struct process *prev;
+};
+
+static struct process *first_process;
+
+/* process operations */
+
+static void destroy_process( struct object *obj );
+
+static const struct object_ops process_ops =
+{
+    destroy_process
+};
+
+/* create a new process */
+struct process *create_process(void)
+{
+    struct process *process;
+
+    if (!(process = malloc( sizeof(*process) ))) return NULL;
+    init_object( &process->obj, &process_ops, NULL );
+    process->next = first_process;
+    process->prev = NULL;
+    first_process = process;
+    return process;
+}
+
+/* destroy a process when its refcount is 0 */
+static void destroy_process( struct object *obj )
+{
+    struct process *process = (struct process *)obj;
+    assert( obj->ops == &process_ops );
+
+    if (process->next) process->next->prev = process->prev;
+    if (process->prev) process->prev->next = process->next;
+    else first_process = process->next;
+    free( process );
+}
+
+/* get a process from an id (and increment the refcount) */
+struct process *get_process_from_id( void *id )
+{
+    struct process *p = first_process;
+    while (p && (p != id)) p = p->next;
+    if (p) p->obj.refcount++;
+    return p;
+}
diff --git a/server/socket.c b/server/socket.c
new file mode 100644
index 0000000..eca5e1c
--- /dev/null
+++ b/server/socket.c
@@ -0,0 +1,464 @@
+/*
+ * Server-side socket communication functions
+ *
+ * Copyright (C) 1998 Alexandre Julliard
+ */
+
+#include <assert.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <signal.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdarg.h>
+#include <string.h>
+#include <sys/time.h>
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <sys/uio.h>
+#include <unistd.h>
+
+#include "server.h"
+#include "object.h"
+
+/* client state */
+enum state
+{
+    RUNNING,   /* running normally */
+    SENDING,   /* sending us a request */
+    WAITING,   /* waiting for us to reply */
+    READING    /* reading our reply */
+};
+
+/* client timeout */
+struct timeout
+{
+    struct timeval  when;    /* timeout expiry (absolute time) */
+    struct timeout *next;    /* next in sorted list */
+    struct timeout *prev;    /* prev in sorted list */
+    int             client;  /* client id */
+};
+
+/* client structure */
+struct client
+{
+    enum state         state;        /* client state */
+    unsigned int       seq;          /* current sequence number */
+    struct header      head;         /* current msg header */
+    char              *data;         /* current msg data */
+    int                count;        /* bytes sent/received so far */
+    int                pass_fd;      /* fd to pass to and from the client */
+    struct thread     *self;         /* client thread (opaque pointer) */
+    struct timeout     timeout;      /* client timeout */
+};
+
+
+static struct client *clients[FD_SETSIZE];  /* clients array */
+static fd_set read_set, write_set;          /* current select sets */
+static int nb_clients;                      /* current number of clients */
+static int max_fd;                          /* max fd in use */
+static int initial_client_fd;               /* fd of the first client */
+static struct timeout *timeout_head;        /* sorted timeouts list head */
+static struct timeout *timeout_tail;        /* sorted timeouts list tail */
+
+
+/* signal a client protocol error */
+static void protocol_error( int client_fd, const char *err, ... )
+{
+    va_list args;
+
+    va_start( args, err );
+    fprintf( stderr, "Protocol error:%d: ", client_fd );
+    vfprintf( stderr, err, args );
+    va_end( args );
+}
+
+
+/* send a message to a client that is ready to receive something */
+static int do_write( int client_fd )
+{
+    struct client *client = clients[client_fd];
+    struct iovec vec[2];
+    struct { struct cmsghdr hdr; int fd; } cmsg =
+                 { { sizeof(cmsg), SOL_SOCKET, SCM_RIGHTS }, client->pass_fd };
+    struct msghdr msghdr = { NULL, 0, vec, 2, NULL, 0, 0 };
+    int ret;
+
+    /* make sure we have something to send */
+    assert( client->count < client->head.len );
+    /* make sure the client is listening */
+    assert( client->state == READING );
+
+    if (client->count < sizeof(client->head))
+    {
+        vec[0].iov_base = (char *)&client->head + client->count;
+        vec[0].iov_len  = sizeof(client->head) - client->count;
+        vec[1].iov_base = client->data;
+        vec[1].iov_len  = client->head.len - sizeof(client->head);
+    }
+    else
+    {
+        vec[0].iov_base = client->data + client->count - sizeof(client->head);
+        vec[0].iov_len  = client->head.len - client->count;
+        msghdr.msg_iovlen = 1;
+    }
+    if (client->pass_fd != -1)
+    {
+        /* we have an fd to send */
+        msghdr.msg_control = &cmsg;
+        msghdr.msg_controllen = sizeof(cmsg);
+    }
+    ret = sendmsg( client_fd, &msghdr, 0 );
+    if (ret == -1)
+    {
+        if (errno != EPIPE) perror("sendmsg");
+        return -1;
+    }
+    if (client->pass_fd != -1)  /* We sent the fd, now we can close it */
+    {
+        close( client->pass_fd );
+        client->pass_fd = -1;
+    }
+    if ((client->count += ret) < client->head.len) return 0;
+
+    /* we have finished with this message */
+    if (client->data) free( client->data );
+    client->data  = NULL;
+    client->count = 0;
+    client->state = RUNNING;
+    client->seq++;
+    FD_CLR( client_fd, &write_set );
+    FD_SET( client_fd, &read_set );
+    return 0;
+}
+
+
+/* read a message from a client that has something to say */
+static int do_read( int client_fd )
+{
+    struct client *client = clients[client_fd];
+    struct iovec vec;
+    struct { struct cmsghdr hdr; int fd; } cmsg = { { sizeof(cmsg), SOL_SOCKET,
+                                                      SCM_RIGHTS }, -1 };
+    struct msghdr msghdr = { NULL, 0, &vec, 1, &cmsg, sizeof(cmsg), 0 };
+    int ret;
+
+    if (client->state == RUNNING) client->state = SENDING;
+    assert( client->state == SENDING );
+
+    if (client->count < sizeof(client->head))
+    {
+        vec.iov_base = (char *)&client->head + client->count;
+        vec.iov_len  = sizeof(client->head) - client->count;
+    }
+    else
+    {
+        if (!client->data &&
+            !(client->data = malloc(client->head.len-sizeof(client->head))))
+            return -1;
+        vec.iov_base = client->data + client->count - sizeof(client->head);
+        vec.iov_len  = client->head.len - client->count;
+    }
+
+    ret = recvmsg( client_fd, &msghdr, 0 );
+    if (ret == -1)
+    {
+        perror("recvmsg");
+        return -1;
+    }
+    if (cmsg.fd != -1)
+    {
+        /* can only receive one fd per message */
+        if (client->pass_fd != -1) close( client->pass_fd );
+        client->pass_fd = cmsg.fd;
+    }
+    else if (!ret) return -1;  /* closed pipe */
+
+    client->count += ret;
+
+    /* received the complete header yet? */
+    if (client->count < sizeof(client->head)) return 0;
+
+    /* sanity checks */
+    if (client->head.seq != client->seq)
+    {
+        protocol_error( client_fd, "bad sequence %08x instead of %08x\n",
+                        client->head.seq, client->seq );
+        return -1;
+    }
+    if ((client->head.len < sizeof(client->head)) ||
+        (client->head.len > MAX_MSG_LENGTH + sizeof(client->head)))
+    {
+        protocol_error( client_fd, "bad header length %08x\n",
+                        client->head.len );
+        return -1;
+    }
+
+    /* received the whole message? */
+    if (client->count == client->head.len)
+    {
+        /* done reading the data, call the callback function */
+
+        char *data = client->data;
+        int passed_fd = client->pass_fd;
+        unsigned short type = client->head.type;
+        unsigned short len  = client->head.len - sizeof(client->head);
+
+        if ((type >= REQ_NB_REQUESTS) || !req_handlers[client->head.type])
+        {
+            protocol_error( client_fd, "unknown request %08x\n",
+                            client->head.type );
+            return -1;
+        }
+
+        /* clear the info now, as the client may be deleted by the callback */
+        client->head.len  = 0;
+        client->head.type = 0;
+        client->count     = 0;
+        client->data      = NULL;
+        client->pass_fd   = -1;
+        client->state     = WAITING;
+        client->seq++;
+
+        req_handlers[type]( data, len, passed_fd, client->self );
+        if (passed_fd != -1) close( passed_fd );
+        if (data) free( data );
+    }
+    return 0;
+}
+
+
+/* handle a client timeout */
+static int do_timeout( int client_fd )
+{
+    struct client *client = clients[client_fd];
+    set_timeout( client_fd, 0 );  /* Remove the timeout */
+    req_handlers[REQ_TIMEOUT]( NULL, 0, -1, client->self );
+    return 0;
+}
+
+
+/* send a reply to a client */
+static int send_reply_v( int client_fd, int type, int pass_fd,
+                         struct iovec *vec, int veclen )
+{
+    int i;
+    unsigned int len;
+    char *p;
+    struct client *client = clients[client_fd];
+
+    assert( client );
+    assert( client->state == WAITING );
+    assert( !client->data );
+
+    for (i = len = 0; i < veclen; i++) len += vec[i].iov_len;
+    assert( len < MAX_MSG_LENGTH );
+
+    if (len && !(client->data = malloc( len ))) return -1;
+    client->count     = 0;
+    client->head.len  = len + sizeof(client->head);
+    client->head.type = type;
+    client->head.seq  = client->seq;
+    client->pass_fd   = pass_fd;
+
+    for (i = 0, p = client->data; i < veclen; i++)
+    {
+        memcpy( p, vec[i].iov_base, vec[i].iov_len );
+        p += vec[i].iov_len;
+    }
+
+    client->state = READING;
+    FD_CLR( client_fd, &read_set );
+    FD_SET( client_fd, &write_set );
+    return 0;
+}
+
+
+/* server main loop */
+void server_main_loop( int fd )
+{
+    int i, ret;
+
+    setsid();
+    signal( SIGPIPE, SIG_IGN );
+
+    /* special magic to create the initial thread */
+    initial_client_fd = fd;
+    add_client( initial_client_fd, NULL );
+
+    while (nb_clients)
+    {
+        fd_set read = read_set, write = write_set;
+
+        if (timeout_head)
+        {
+            struct timeval tv, now;
+            gettimeofday( &now, NULL );
+            if ((timeout_head->when.tv_sec < now.tv_sec) ||
+                ((timeout_head->when.tv_sec == now.tv_sec) &&
+                 (timeout_head->when.tv_usec < now.tv_usec)))
+            {
+                int id = timeout_head->client;
+                if (do_timeout( id ) == -1) remove_client( id );
+                continue;
+            }
+            tv.tv_sec = timeout_head->when.tv_sec - now.tv_sec;
+            if ((tv.tv_usec = timeout_head->when.tv_usec - now.tv_usec) < 0)
+            {
+                tv.tv_usec += 1000000;
+                tv.tv_sec--;
+            }
+            ret = select( max_fd + 1, &read, &write, NULL, &tv );
+        }
+        else  /* no timeout */
+        {
+            ret = select( max_fd + 1, &read, &write, NULL, NULL );
+        }
+
+        if (!ret) continue;
+        if (ret == -1) perror("select");
+
+        for (i = 0; i <= max_fd; i++)
+        {
+            if (FD_ISSET( i, &write ))
+            {
+                if (!clients[i]) continue;
+                if (do_write( i ) == -1) remove_client( i );
+            }
+            else if (FD_ISSET( i, &read ))
+            {
+                if (!clients[i]) continue;
+                if (do_read( i ) == -1) remove_client( i );
+            }
+        }
+    }
+}
+
+
+/*******************************************************************/
+/* server-side exported functions                                  */
+
+/* add a client */
+int add_client( int client_fd, struct thread *self )
+{
+    int flags;
+    struct client *client = malloc( sizeof(*client) );
+    if (!client) return -1;
+    assert( !clients[client_fd] );
+
+    client->state                = RUNNING;
+    client->seq                  = 0;
+    client->head.len             = 0;
+    client->head.type            = 0;
+    client->count                = 0;
+    client->data                 = NULL;
+    client->self                 = self;
+    client->pass_fd              = -1;
+    client->timeout.when.tv_sec  = 0;
+    client->timeout.when.tv_usec = 0;
+    client->timeout.client       = client_fd;
+
+    flags = fcntl( client_fd, F_GETFL, 0 );
+    fcntl( client_fd, F_SETFL, flags | O_NONBLOCK );
+
+    clients[client_fd] = client;
+    FD_SET( client_fd, &read_set );
+    if (client_fd > max_fd) max_fd = client_fd;
+    nb_clients++;
+    return client_fd;
+}
+
+/* remove a client */
+void remove_client( int client_fd )
+{
+    struct client *client = clients[client_fd];
+    assert( client );
+
+    req_handlers[REQ_KILL_THREAD]( NULL, 0, -1, client->self );
+
+    set_timeout( client_fd, 0 );
+    clients[client_fd] = NULL;
+    FD_CLR( client_fd, &read_set );
+    FD_CLR( client_fd, &write_set );
+    if (max_fd == client_fd) while (max_fd && !clients[max_fd]) max_fd--;
+    if (initial_client_fd == client_fd) initial_client_fd = -1;
+    close( client_fd );
+    nb_clients--;
+
+    /* Purge messages */
+    if (client->data) free( client->data );
+    if (client->pass_fd != -1) close( client->pass_fd );
+    free( client );
+}
+
+/* return the fd of the initial client */
+int get_initial_client_fd(void)
+{
+    assert( initial_client_fd != -1 );
+    return initial_client_fd;
+}
+
+/* set a client timeout */
+void set_timeout( int client_fd, struct timeval *when )
+{
+    struct timeout *tm, *pos;
+    struct client *client = clients[client_fd];
+    assert( client );
+
+    tm = &client->timeout;
+    if (tm->when.tv_sec || tm->when.tv_usec)
+    {
+        /* there is already a timeout */
+        if (tm->next) tm->next->prev = tm->prev;
+        else timeout_tail = tm->prev;
+        if (tm->prev) tm->prev->next = tm->next;
+        else timeout_head = tm->next;
+        tm->when.tv_sec = tm->when.tv_usec = 0;
+    }
+    if (!when) return;  /* no timeout */
+    tm->when = *when;
+
+    /* Now insert it in the linked list */
+
+    for (pos = timeout_head; pos; pos = pos->next)
+    {
+        if (pos->when.tv_sec > tm->when.tv_sec) break;
+        if ((pos->when.tv_sec == tm->when.tv_sec) &&
+            (pos->when.tv_usec > tm->when.tv_usec)) break;
+    }
+
+    if (pos)  /* insert it before 'pos' */
+    {
+        if ((tm->prev = pos->prev)) tm->prev->next = tm;
+        else timeout_head = tm;
+        tm->next = pos;
+        pos->prev = tm;
+    }
+    else  /* insert it at the tail */
+    {
+        tm->next = NULL;
+        if (timeout_tail) timeout_tail->next = tm;
+        else timeout_head = tm;
+        tm->prev = timeout_tail;
+        timeout_tail = tm;
+    }
+}
+
+/* send a reply to a client */
+int send_reply( int client_fd, int err_code, int pass_fd,
+                int n, ... /* arg_1, len_1, ..., arg_n, len_n */ )
+{
+    struct iovec vec[16];
+    va_list args;
+    int i;
+
+    assert( n < 16 );
+    va_start( args, n );
+    for (i = 0; i < n; i++)
+    {
+        vec[i].iov_base = va_arg( args, void * );
+        vec[i].iov_len  = va_arg( args, int );
+    }
+    va_end( args );
+    return send_reply_v( client_fd, err_code, pass_fd, vec, n );
+}
diff --git a/server/thread.c b/server/thread.c
new file mode 100644
index 0000000..d1ce30b
--- /dev/null
+++ b/server/thread.c
@@ -0,0 +1,204 @@
+/*
+ * Server-side thread management
+ *
+ * Copyright (C) 1998 Alexandre Julliard
+ */
+
+#include <assert.h>
+#include <fcntl.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+#include "winerror.h"
+#include "server.h"
+#include "object.h"
+
+
+/* request handling */
+
+static void handle_timeout( void *data, int len, int fd,
+                            struct thread *self );
+static void handle_kill_thread( void *data, int len, int fd,
+                                struct thread *self );
+static void handle_new_thread( void *data, int len, int fd,
+                               struct thread *self );
+static void handle_init_thread( void *data, int len, int fd,
+                                struct thread *self );
+
+const req_handler req_handlers[REQ_NB_REQUESTS] =
+{
+    handle_timeout,        /* REQ_TIMEOUT */
+    handle_kill_thread,    /* REQ_KILL_THREAD */
+    handle_new_thread,     /* REQ_NEW_THREAD */
+    handle_init_thread     /* REQ_INIT_THREAD */
+};
+
+
+/* thread structure; not much for now... */
+
+struct thread
+{
+    struct object   obj;       /* object header */
+    struct thread  *next;      /* system-wide thread list */
+    struct thread  *prev;
+    struct process *process;
+    int             client_fd; /* client fd for socket communications */
+    int             unix_pid;
+    char           *name;
+};
+
+static struct thread *first_thread;
+
+/* thread operations */
+
+static void destroy_thread( struct object *obj );
+
+static const struct object_ops thread_ops =
+{
+    destroy_thread
+};
+
+
+/* create a new thread */
+static struct thread *create_thread( int fd, void *pid )
+{
+    struct thread *thread;
+    struct process *process;
+
+    if (pid)
+    {
+        if (!(process = get_process_from_id( pid ))) return NULL;
+    }
+    else
+    {
+        if (!(process = create_process())) return NULL;
+    }
+    if (!(thread = malloc( sizeof(*thread) )))
+    {
+        release_object( process );
+        return NULL;
+    }
+    init_object( &thread->obj, &thread_ops, NULL );
+    thread->client_fd = fd;
+    thread->process   = process;
+    thread->unix_pid  = 0;  /* not known yet */
+    thread->name      = NULL;
+
+    thread->next = first_thread;
+    thread->prev = NULL;
+    first_thread = thread;
+
+    if (add_client( fd, thread ) == -1)
+    {
+        release_object( thread );
+        return NULL;
+    }
+    return thread;
+}
+
+/* destroy a thread when its refcount is 0 */
+static void destroy_thread( struct object *obj )
+{
+    struct thread *thread = (struct thread *)obj;
+    assert( obj->ops == &thread_ops );
+
+    release_object( thread->process );
+    if (thread->next) thread->next->prev = thread->prev;
+    if (thread->prev) thread->prev->next = thread->next;
+    else first_thread = thread->next;
+    if (thread->name) free( thread->name );
+    free( thread );
+}
+
+struct thread *get_thread_from_id( void *id )
+{
+    struct thread *t = first_thread;
+    while (t && (t != id)) t = t->next;
+    return t;
+}
+
+/* handle a client timeout (unused for now) */
+static void handle_timeout( void *data, int len, int fd, struct thread *self )
+{
+/*    fprintf( stderr, "Server: got timeout for %s\n", self->name );*/
+    send_reply( self->client_fd, 0, -1, 0 );
+}
+
+/* a thread has been killed */
+static void handle_kill_thread( void *data, int len, int fd,
+                                struct thread *self )
+{
+    if (!self) return;  /* initial client being killed */
+/*    fprintf( stderr, "Server: thread '%s' killed\n",
+               self->name ? self->name : "???" );
+*/
+    release_object( &self->obj );
+}
+
+/* create a new thread */
+static void handle_new_thread( void *data, int len, int fd,
+                               struct thread *self )
+{
+    struct new_thread_request *req = (struct new_thread_request *)data;
+    struct new_thread_reply reply;
+    struct thread *new_thread;
+    int new_fd, err;
+
+    if ((new_fd = dup(fd)) == -1)
+    {
+        new_thread = NULL;
+        err = ERROR_TOO_MANY_OPEN_FILES;
+        goto done;
+    }
+    if (len != sizeof(*req))
+    {
+        err = ERROR_INVALID_PARAMETER;
+        goto done;
+    }
+    if (!(new_thread = create_thread( new_fd, req->pid )))
+    {
+        err = ERROR_NOT_ENOUGH_MEMORY;
+        close( new_fd );
+        goto done;
+    }
+    reply.tid = new_thread;
+    reply.pid = new_thread->process;
+    err = ERROR_SUCCESS;
+ done:
+    send_reply( self ? self->client_fd : get_initial_client_fd(),
+                err, -1, 1, &reply, sizeof(reply) );
+}
+
+/* create a new thread */
+static void handle_init_thread( void *data, int len, int fd,
+                                struct thread *self )
+{
+    struct init_thread_request *req = (struct init_thread_request *)data;
+    int err;
+
+    if (len < sizeof(*req))
+    {
+        err = ERROR_INVALID_PARAMETER;
+        goto done;
+    }
+    len -= sizeof(*req);
+    self->unix_pid = req->pid;
+    if (!(self->name = malloc( len + 1 )))
+    {
+        err = ERROR_NOT_ENOUGH_MEMORY;
+        goto done;
+    }
+    memcpy( self->name, (char *)data + sizeof(*req), len );
+    self->name[len] = '\0';
+    
+/*    fprintf( stderr,
+             "Server: init thread '%s' pid=%08x tid=%08x unix_pid=%d\n",
+             self->name, (int)self->process, (int)self, self->unix_pid );
+*/
+
+    err = ERROR_SUCCESS;
+ done:
+    send_reply( self->client_fd, err, -1, 0 );
+}
diff --git a/tools/make_X11wrappers b/tools/make_X11wrappers
index 2b34c8b..80babee 100755
--- a/tools/make_X11wrappers
+++ b/tools/make_X11wrappers
@@ -98,6 +98,9 @@
 	output_fn("XShmAttach", Status,
 		  "Display *, XShmSegmentInfo *",
 		  "Display *a0, XShmSegmentInfo *a1", "a0, a1");
+	output_fn("XShmPutImage", Status,
+		  "Display *, Drawable, GC, XImage *, int, int, int, int, unsigned int, unsigned int, Bool",
+		  "Display *a0, Drawable a1, GC a2, XImage *a3, int a4, int a5, int a6, int a7, unsigned int a8, unsigned int a9, Bool a10", "a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10");
     } else {
 	open(IN, "echo \"$x11_incl#include <X11/$extensions_dir$name.h>\" | gcc -L$X11_include_dir -E - | grep -v '^[ \t]*\$'|") || die "open";
 
diff --git a/tsx11/X11_calls b/tsx11/X11_calls
index 856ddf7..aeca2b6 100644
--- a/tsx11/X11_calls
+++ b/tsx11/X11_calls
@@ -21,6 +21,7 @@
 XClipBox
 XConvertSelection
 XCopyArea
+XCopyColormapAndFree
 XCopyPlane
 XCreateBitmapFromData
 XCreateColormap
@@ -133,6 +134,7 @@
 XShmAttach
 XShmDetach
 XShmPixmapFormat
+XShmPutImage
 XShmQueryExtension
 XShrinkRegion
 XStoreColor
diff --git a/tsx11/ts_xlib.c b/tsx11/ts_xlib.c
index 7ced801..2e163df 100644
--- a/tsx11/ts_xlib.c
+++ b/tsx11/ts_xlib.c
@@ -105,6 +105,17 @@
   return r;
 }
 
+Colormap  TSXCopyColormapAndFree(Display* a0, Colormap a1)
+{
+  Colormap  r;
+  TRACE(x11, "Call XCopyColormapAndFree\n");
+  EnterCriticalSection( &X11DRV_CritSection );
+  r = XCopyColormapAndFree(a0, a1);
+  LeaveCriticalSection( &X11DRV_CritSection );
+  TRACE(x11, "Ret XCopyColormapAndFree\n");
+  return r;
+}
+
 Colormap  TSXCreateColormap(Display* a0, Window a1, Visual* a2, int a3)
 {
   Colormap  r;
diff --git a/tsx11/ts_xshm.c b/tsx11/ts_xshm.c
index e3afe6b..dfe9434 100644
--- a/tsx11/ts_xshm.c
+++ b/tsx11/ts_xshm.c
@@ -52,3 +52,14 @@
   TRACE(x11, "Ret XShmAttach\n");
   return r;
 }
+
+Status TSXShmPutImage(Display *a0, Drawable a1, GC a2, XImage *a3, int a4, int a5, int a6, int a7, unsigned int a8, unsigned int a9, Bool a10)
+{
+  Status r;
+  TRACE(x11, "Call XShmPutImage\n");
+  EnterCriticalSection( &X11DRV_CritSection );
+  r = XShmPutImage(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10);
+  LeaveCriticalSection( &X11DRV_CritSection );
+  TRACE(x11, "Ret XShmPutImage\n");
+  return r;
+}
diff --git a/win32/advapi.c b/win32/advapi.c
index 368642e..d2ff65f 100644
--- a/win32/advapi.c
+++ b/win32/advapi.c
@@ -118,10 +118,10 @@
  *           GetTokenInformation	[ADVAPI32.66]
  */
 BOOL32 WINAPI GetTokenInformation(
-	HANDLE32 token,/*TOKEN_INFORMATION_CLASS*/ DWORD tokeninfoclass,LPVOID tokeninfo,
+	HANDLE32 token,TOKEN_INFORMATION_CLASS tokeninfoclass,LPVOID tokeninfo,
 	DWORD tokeninfolength,LPDWORD retlen
 ) {
-	FIXME(advapi,"(%08x,%ld,%p,%ld,%p): stub\n",
+        FIXME(advapi,"(%08x,%d,%p,%ld,%p): stub\n",
 	      token,tokeninfoclass,tokeninfo,tokeninfolength,retlen);
 	return TRUE;
 }
diff --git a/win32/console.c b/win32/console.c
index 505bfea..6bab46d 100644
--- a/win32/console.c
+++ b/win32/console.c
@@ -1139,3 +1139,20 @@
     SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
     return FALSE;
 }
+
+
+/******************************************************************************
+ * ScrollConsoleScreenBuffer [KERNEL32.612]
+ * 
+ * BUGS
+ *   Unimplemented
+ */
+BOOL32 WINAPI ScrollConsoleScreenBuffer( HANDLE32 hConsoleOutput, 
+	      LPSMALL_RECT lpScrollRect, LPSMALL_RECT lpClipRect,
+              COORD dwDestOrigin, LPCHAR_INFO lpFill)
+{
+    FIXME(console, "(%d,%p,%p,%dx%d,%p): stub\n", hConsoleOutput,lpScrollRect,
+	  lpClipRect,dwDestOrigin.x,dwDestOrigin.y,lpFill);
+    SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
+    return FALSE;
+}
diff --git a/win32/kernel32.c b/win32/kernel32.c
index b01a40c..12e69b4 100644
--- a/win32/kernel32.c
+++ b/win32/kernel32.c
@@ -77,14 +77,53 @@
 }
 
 /***********************************************************************
+ *           _loadthunk
+ */
+static LPVOID _loadthunk(LPSTR module, LPSTR func, LPSTR module32, 
+                         struct ThunkDataCommon *TD32)
+{
+    struct ThunkDataCommon *TD16;
+    HMODULE32 hmod;
+
+    if ((hmod = LoadLibrary16(module)) <= 32) 
+    {
+        ERR(thunk, "(%s, %s, %s, %p): Unable to load '%s', error %d\n",
+                   module, func, module32, TD32, module, hmod);
+        return 0;
+    }
+
+    if (!(TD16 = PTR_SEG_TO_LIN(WIN32_GetProcAddress16(hmod, func))))
+    {
+        ERR(thunk, "(%s, %s, %s, %p): Unable to find '%s'\n",
+                   module, func, module32, TD32, func);
+        return 0;
+    }
+
+    if (TD32 && memcmp(TD16->magic, TD32->magic, 4))
+    {
+        ERR(thunk, "(%s, %s, %s, %p): Bad magic %c%c%c%c (should be %c%c%c%c)\n",
+                   module, func, module32, TD32, 
+                   TD16->magic[0], TD16->magic[1], TD16->magic[2], TD16->magic[3],
+                   TD32->magic[0], TD32->magic[1], TD32->magic[2], TD32->magic[3]);
+        return 0;
+    }
+
+    if (TD32 && TD16->checksum != TD32->checksum)
+    {
+        ERR(thunk, "(%s, %s, %s, %p): Wrong checksum %08lx (should be %08lx)\n",
+                   module, func, module32, TD32, TD16->checksum, TD32->checksum);
+        return 0;
+    }
+
+    return TD16;
+}
+
+/***********************************************************************
  *           GetThunkStuff    (KERNEL32.53)
  */
 LPVOID WINAPI GetThunkStuff(LPSTR module, LPSTR func)
 {
-    HMODULE32 hmod = LoadLibrary16(module);
-    if (hmod <= 32) return 0;
-
-    return PTR_SEG_TO_LIN(WIN32_GetProcAddress16(hmod, func));
+    return _loadthunk(module, func, "<kernel>", NULL);
 }
 
 /***********************************************************************
@@ -135,13 +174,9 @@
     {
         case DLL_PROCESS_ATTACH:
         {
-            struct ThunkDataCommon *TD16 = GetThunkStuff(module16, thunkfun16);
-            if (!TD16 || TD16->checksum != TD->checksum
-                      || memcmp(TD16->magic, TD->magic, 4))
-            {
-                ERR(thunk, "Problem loading 16-bit thunk buffer!\n");
+            struct ThunkDataCommon *TD16;
+            if (!(TD16 = _loadthunk(module16, thunkfun16, module32, TD)))
                 return 0;
-            }
 
             if (directionSL)
             {
@@ -1009,6 +1044,15 @@
 }
 
 /**********************************************************************
+ * 		KERNEL_475		(KERNEL.475)
+ * 	Set the 16-bit %fs to the 32-bit %fs (current TEB selector)
+ */
+VOID WINAPI _KERNEL_475(CONTEXT *context) 
+{
+    GET_FS( THREAD_Current()->saved_fs );
+}
+
+/**********************************************************************
  * 		KERNEL_431		(KERNEL.431)
  *		IsPeFormat		(W32SYS.2)
  * Checks the passed filename if it is a PE format executeable
diff --git a/win32/newfns.c b/win32/newfns.c
index 08faf01..7f61887 100644
--- a/win32/newfns.c
+++ b/win32/newfns.c
@@ -234,10 +234,10 @@
                                LPDWORD lpReadTimeout )
 {
     FIXME(win32, "(%d): stub\n",hMailslot);
-    *lpMaxMessageSize = NULL;
-    *lpNextSize = NULL;
-    *lpMessageCount = NULL;
-    *lpReadTimeout = NULL;
+    *lpMaxMessageSize = (DWORD)NULL;
+    *lpNextSize = (DWORD)NULL;
+    *lpMessageCount = (DWORD)NULL;
+    *lpReadTimeout = (DWORD)NULL;
     return TRUE;
 }
 
@@ -382,6 +382,31 @@
 	return FALSE; 
 }
 
+/******************************************************************************
+ * SleepEx [KERNEL32.680]
+ *
+ * BUGS
+ *   Unimplemented
+ */
+DWORD WINAPI SleepEx(DWORD x1,BOOL32 x2)
+{
+  FIXME(win32,":(%d,%ld): stub\n",x1,x2);
+  SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
+  return FALSE;
+}
+
+/******************************************************************************
+ * TerminateProcess [KERNEL32.684]
+ * 
+ * BUGS
+ *   Unimplemented
+ */
+int WINAPI TerminateProcess(HANDLE32 h, int ret)
+{
+  FIXME(win32,":(%p,%d): stub\n",h,ret);
+  SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
+	return FALSE;
+}
 
 /******************************************************************************
  * OpenDesktop32A [USER32.408]
diff --git a/win32/process.c b/win32/process.c
index c4c1635..a9e8b2d 100644
--- a/win32/process.c
+++ b/win32/process.c
@@ -108,9 +108,10 @@
 	DWORD creationflags,LPVOID env,LPCWSTR curdir,
 	LPSTARTUPINFO32W startupinfo,LPPROCESS_INFORMATION processinfo)
 {
-    FIXME(win32,"(%p,%p,%p,%p,%d,%08lx,%p,%p,%p,%p): stub\n",
-            appname,cmdline,processattributes,threadattributes,
-            inherithandles,creationflags,env,curdir,startupinfo,processinfo );
+    FIXME(win32,"(%p,%s,%p,%p,%d,%08lx,%p,%s,%p,%p): stub\n",
+            appname,debugstr_w(cmdline),processattributes,threadattributes,
+            inherithandles,creationflags,env,debugstr_w(curdir),startupinfo,
+	    processinfo );
     /* make from lcc uses system as fallback if CreateProcess returns
        FALSE, so return false */
     return FALSE;
diff --git a/windows/mdi.c b/windows/mdi.c
index 47e7e07..b305ba0 100644
--- a/windows/mdi.c
+++ b/windows/mdi.c
@@ -1383,7 +1383,7 @@
     MDICLIENTINFO       *ci;
     WND                 *clientWnd;
 
-    clientWnd  = WIN_FindWndPtr(GetParent16(hwnd));
+    clientWnd  = WIN_FindWndPtr(WIN_FindWndPtr(hwnd)->parent->hwndSelf);
     ci         = (MDICLIENTINFO *) clientWnd->wExtra;
 
     switch (message)
diff --git a/windows/syscolor.c b/windows/syscolor.c
index fe48431..c3c10b3 100644
--- a/windows/syscolor.c
+++ b/windows/syscolor.c
@@ -46,19 +46,19 @@
 {
     "Scrollbar", "223 223 223",      /* COLOR_SCROLLBAR           */
     "Background", "192 192 192",     /* COLOR_BACKGROUND          */
-    "ActiveTitle", "0 64 128",       /* COLOR_ACTIVECAPTION       */
-    "InactiveTitle", "255 255 255",  /* COLOR_INACTIVECAPTION     */
+    "ActiveTitle", "0 0 128",        /* COLOR_ACTIVECAPTION       */
+    "InactiveTitle", "128 128 128",  /* COLOR_INACTIVECAPTION     */
     "Menu", "192 192 192",           /* COLOR_MENU                */
     "Window", "255 255 255",         /* COLOR_WINDOW              */
     "WindowFrame", "0 0 0",          /* COLOR_WINDOWFRAME         */
     "MenuText", "0 0 0",             /* COLOR_MENUTEXT            */
     "WindowText", "0 0 0",           /* COLOR_WINDOWTEXT          */
     "TitleText", "255 255 255",      /* COLOR_CAPTIONTEXT         */
-    "ActiveBorder", "128 128 128",   /* COLOR_ACTIVEBORDER        */
-    "InactiveBorder", "255 255 255", /* COLOR_INACTIVEBORDER      */
+    "ActiveBorder", "192 192 192",   /* COLOR_ACTIVEBORDER        */
+    "InactiveBorder", "192 192 192", /* COLOR_INACTIVEBORDER      */
     "AppWorkspace", "128 128 128",   /* COLOR_APPWORKSPACE        */
-    "Hilight", "223 223 223",        /* COLOR_HIGHLIGHT           */
-    "HilightText", "0 0 0",          /* COLOR_HIGHLIGHTTEXT       */
+    "Hilight", "0 0 128",            /* COLOR_HIGHLIGHT           */
+    "HilightText", "255 255 255",    /* COLOR_HIGHLIGHTTEXT       */
     "ButtonFace", "192 192 192",     /* COLOR_BTNFACE             */
     "ButtonShadow", "128 128 128",   /* COLOR_BTNSHADOW           */
     "GrayText", "192 192 192",       /* COLOR_GRAYTEXT            */
diff --git a/windows/winpos.c b/windows/winpos.c
index 1eba986..8bec519 100644
--- a/windows/winpos.c
+++ b/windows/winpos.c
@@ -1542,7 +1542,10 @@
     if( fChangeFocus && GetFocus32() )
 	if( WIN_GetTopParent(GetFocus32()) != hwndActive )
 	    FOCUS_SwitchFocus( GetFocus32(),
-			       (wndPtr->dwStyle & WS_MINIMIZE)? 0: hwndActive);
+			       (wndPtr && (wndPtr->dwStyle & WS_MINIMIZE))?
+			       0:
+			       hwndActive
+	    );
 
     if( !hwndPrevActive && wndPtr && 
 	 wndPtr->window && !(wndPtr->flags & WIN_MANAGED) )
@@ -2155,8 +2158,11 @@
     if ((hwndInsertAfter != HWND_TOP) && (hwndInsertAfter != HWND_BOTTOM))
        {
 	 WND* wnd = WIN_FindWndPtr(hwndInsertAfter);
-	 if( wnd->parent != wndPtr->parent ) return FALSE;
-	 if( wnd->next == wndPtr ) flags |= SWP_NOZORDER;
+
+	 if( wndPtr ) {
+	   if( wnd->parent != wndPtr->parent ) return FALSE;
+	   if( wnd->next == wndPtr ) flags |= SWP_NOZORDER;
+	 }
        }
     else if (!(wndPtr->window))
          /* FIXME: the following optimization is no good for "X-ed" windows */
diff --git a/wine.ini b/wine.ini
index 7cde88b..32f0b71 100644
--- a/wine.ini
+++ b/wine.ini
@@ -74,3 +74,6 @@
 
 [spy]
 Exclude=WM_SIZE;WM_TIMER;
+
+[Tweak.Layout]
+;Win95Look=true