diff --git a/ANNOUNCE b/ANNOUNCE
index 5c0bea1..d73d5d4 100644
--- a/ANNOUNCE
+++ b/ANNOUNCE
@@ -1,15 +1,14 @@
-This is release 980822 of Wine, the MS Windows emulator.  This is still a
+This is release 980913 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-980822: (see ChangeLog for details)
-	- Improved mmio support.
-	- VxDCall support.
-	- More common controls and shell32 stuff.
-	- Better DOS executables support.
+WHAT'S NEW with Wine-980913: (see ChangeLog for details)
+	- Even more common controls stuff.
+	- Many PostScript driver improvements.
+	- More DOS executables support.
 	- Lots of bug fixes.
 
 See the README file in the distribution for installation instructions.
@@ -18,10 +17,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-980822.tar.gz
-  ftp://tsx-11.mit.edu/pub/linux/ALPHA/Wine/development/Wine-980822.tar.gz
-  ftp://ftp.infomagic.com/pub/mirrors/linux/sunsite/ALPHA/wine/development/Wine-980822.tar.gz
-  ftp://ftp.progsoc.uts.edu.au/pub/Wine/development/Wine-980822.tar.gz
+  ftp://sunsite.unc.edu/pub/Linux/ALPHA/wine/development/Wine-980913.tar.gz
+  ftp://tsx-11.mit.edu/pub/linux/ALPHA/Wine/development/Wine-980913.tar.gz
+  ftp://ftp.infomagic.com/pub/mirrors/linux/sunsite/ALPHA/wine/development/Wine-980913.tar.gz
+  ftp://ftp.progsoc.uts.edu.au/pub/Wine/development/Wine-980913.tar.gz
 
 It should also be available from any site that mirrors tsx-11 or sunsite.
 
diff --git a/AUTHORS b/AUTHORS
index 87e0804..d12f9ff 100644
--- a/AUTHORS
+++ b/AUTHORS
@@ -113,6 +113,7 @@
 Rick Sladkey,
 William Smith,
 Dominik Strasser,
+Patrik Stridvall,
 Vadim Strizhevsky,
 Bertho Stultiens,
 Erik Svendsen,
diff --git a/BUGS b/BUGS
index e7113ad..157eb72 100644
--- a/BUGS
+++ b/BUGS
@@ -18,7 +18,7 @@
 
  * Very alpha printing code using win16 drivers.
 
- * Very alpha internal Postscript driver. [h.davies1@physics.ox.ac.uk]
+ * Very alpha internal PostScript driver. [h.davies1@physics.ox.ac.uk]
 
  * Extremely alpha Win95 interface code.		
  * No OLE2 and OLE32 support (including OLE2 interfaces etc.).
diff --git a/ChangeLog b/ChangeLog
index b6e4c54..2b00865 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,4 +1,320 @@
 ----------------------------------------------------------------------
+Fri Sep 11 13:14:35 1998  Andreas Mohr <100.30936@germany.net>
+
+	* [files/file.c] [include/file.h]
+	Fixed SetFilePointer to allow negative positions as in DOS.
+
+	* [graphics/ddraw.c]
+	Added some methods to IDirect3D.
+
+	* [ole/compobj.c] [if1632/compobj.spec]
+	Added/implemented CoCreateStandardMalloc16,
+	CoGetClassObject, CoCreateInstance,
+	LookupETask, SetETask, CoGetState16.
+
+	* [loader/task.c]
+	MakeProcInstance: return 0 if func == NULL.
+
+	* [*/*] [tools/winapi-check]
+	Added zillions of missing WINAPI's and __cdecl's.
+	(oops, several caused by myself)
+	Wrote script for automated checking.
+
+	* [if1632/compobj.spec]
+	Many stub names.
+
+	* [misc/ddeml.c] [ole/compobj.c]
+	Some stubs.
+
+Tue Sep  9 21:36:48 1998  Anders Carlsson <anders.carlsson@linux.nu>
+
+	* [dlls/comctl32/Makefile.in] [dlls/comctl32/commctrl.c]
+	  [dlls/comctl32/tab.c] [include/commctrl.h] [include/tab.h]
+        Added preliminary tab control support.
+
+Sat Sep  5 16:27:20 1998  Huw D M Davies <daviesh@abacus.physics.ox.ac.uk>
+
+	* [graphics/psdrv/*]
+	More changes to the PostScript driver:
+	Implemented pens and solid brushes.
+	Colour/greyscale for fonts, pens and brushes.
+	To get coloured output you need to have *ColorDevice set to true
+	in your PPD, otherwise you'll get greyscale.
+	Landscape mode now works, as does non-A4 page sizes.
+	Encoding of fonts to ANSI is better, Symbol works again.
+
+	* [objects/dc.c] [include/gdi.h] [*/*]
+	Moved dc->w.{text,background}Pixel to X11DRV_PDEVICE where they
+	belong.
+
+Sat Sep  5 05:12:09 1998  Ove Kaaven <ovek@arcticnet.no>
+
+	* [include/dosexe.h] [include/miscemu.h] [include/msdos.h]
+	  [loader/dos/dosvm.c] [loader/dos/module.c] [msdos/dpmi.c]
+	  [msdos/int2f.c] [msdos/interrupts.c]
+	Fixed portability. Adapted some code to make it easier to
+	integrate the DOS subsystem with the DPMI subsystem, made
+	the DPMI simulated real-mode interrupts be handled the V86
+	way. Added support for .COM files. Made int2f DPMI check
+	fail, to avoid pkunzip crashing in attempting to use DPMI.
+	Generally moved stuff around a little.
+	It is now technically possible to load several DOS programs
+	into the same memory space. Not tested, though.
+
+Fri Sep  4 21:40:45 1998  Marcus Meissner <marcus@jet.franken.de>
+
+	* [if1632/kernel.spec]
+	Changed 500-53x stubnames accordingly to nt3.51 krnl386.exe.
+
+	* [win32/except.c]
+	Fixed one bad program behaviour, (deleting SEH while in 
+	first walk). RtlUnwind is broken too I think (it should unwind
+	on success, not while walking the exception chain).
+
+	* [ole/ole2nls.c]
+	Get*DefaultLCID  returns 0x400|id. expected by one application.
+
+	* [if1632/snoop.c]
+	Handle non-standard SP returns more graceful.
+
+	* [windows/class.c]
+	hinstances are mostly irrelevant for win32.
+
+	* [memory/string.c] [misc/registry.c]
+	lstrcmpi32W: use toupper for characters < 0x100. (speedup hack
+	for registry.c)
+	Some small speedup hacks for registry.c
+
+Thu Sep  3 20:40:16 1998  Eric Kohl <ekohl@abo.rhein-zeitung.de>
+
+	* [Makefile.in][configure][configure.in][dlls/Makefile.in]
+	  [dlls/comctl32/Makefile.in]
+	Created dlls/comctl32 and moved the common controls stuff to it.
+
+	* [misc/version.c]
+	Removed COMCTL32_DllGetVersion. The fixed function is part
+	of the common controls stuff.
+
+	* [dlls/comctl32/*.c][include/commctrl.h]
+	Added structure size tests.
+
+	* [dlls/comctl32/toolbar.c]
+	Fixed a bug in TOOLBAR_GetMaxWidth().
+
+	* [dlls/comctl32/animate.c][include/animate.h]
+	  [dlls/comctl32/comboex.c][include/comboex.h]
+	  [dlls/comctl32/hotkey.c][include/hotkey.h]
+	  [dlls/comctl32/listview.c][include/listview.h]
+	  [dlls/comctl32/commctrl.c][include/commctrl.h]
+	New files. Added Animation, ComboBoxEx, Hotkey and
+	Listview control dummies.
+
+	* [dlls/comctl32/tooltips.c]
+	Fixed a display bug and font selection.
+
+	* [dlls/comctl32/comctl32undoc.c][include/commctrl.h]
+	Added missing DPA functions. Fixed bugs and published the
+	function prototypes.
+
+	* [documentation/common_controls]
+	Updated.
+
+Wed Sep  2 15:43:45 1998  Patrik Stridvall <ps@leissner.se>
+
+	* [AUTHORS] [include/authors.h]
+	Added myself as a Wine author.
+
+	* [memory/virtual.c] [objects/dc.c]
+	Fixed runtime errors for Solaris.
+
+	* [misc/ddeml.c] [objects/gdiobj.c]
+	Minor fixes.
+
+	* [win32/device.c]
+	Added stubs for IFSMgr VxDCall and
+	a partial implementation of IFSMgr DeviceIo.
+
+	* [relay32/Makefile.in] [relay32/builtin32.c] [relay32/imm32.spec] 
+	  [relay32/msnet32.spec] [relay32/oledlg.spec]
+	Added new spec files for IMM32.DLL, MSNET32.DLL, OLEDLG.DLL.
+
+	* [misc/Makefile.in] [misc/imm.c] [include/imm.h]
+	Added news files for implementation of IMM32.DLL. 
+	All functions return 0 as is correct for all Western Languages.
+
+	* [ole/Makefile.in] [ole/oledlg.c] [include/oledlg.h]
+	Added new files for implementation of OLEDLG.DLL.
+	Added stubs with FIXME:s for all functions.
+
+Wed Sep  2 10:50:00 1998  Juergen Schmied <juergen.schmied@metronet.de>
+
+	* [dlls/shell32/contmenu.c][dlls/shell32/shellole.c]
+	  [dlls/shell32/shlfolder.c][dlls/shell32/shlview.c]
+	  [documentation/shell32][include/shell.h]
+	Clean up, bugfixes.
+	
+	* [dlls/shell32/enumidlist.c]
+	Fileattributes implemented.
+	
+	* [dlls/shell32/pidl.c]
+	Class pidlmgr splited into functions, structures changed, 
+	some functions rewritten.
+
+	* [dlls/shell32/shell32_main.c]
+	Small changes and bugfixes SHGetFileInfoA, SHGetSpecialFolderLocation.
+	
+	* [dlls/shell32/shellord.c][relay32/shell32.spec]
+	Parameter documented, implemented SHCloneSpecialIDList.
+	Stub improved ShellExecuteEx32A.
+	New stubs SHFind_InitMenuPopup, FileMenu_InitMenuPopup, 
+	FileMenu_Create, FileMenu_TrackPopupMenuEx, SHWinHelp,
+	SHRunConrolPanel, DAD_ShowDragImage, FileMenu_Destroy,
+	SHGetDataFromIDListA, SHFileOperationA.
+	
+	* [include/winnls.h][include/ole2nls.c]
+	TIME_FORCE24HOURFORMAT, TIME_NOTIMEMARKER implemented
+	in OLE_GetFormatA, GetTimeFormat32A.
+	
+	* [win32/code_page.c]
+	WideCharToMultiByte: parameter checking and returning of strlen
+	implemented.
+	
+	* [windows/keyboard.c][windows/defwnd.c]
+	Debug messages added.
+	
+	* [windows/win.c]
+	WIN_SetWindowLong GWL_STYLE and GWL_EXSTYLE implemented.
+
+	* [controls/menu.c]
+	Missing line added.
+
+	* [include/winerror.h]
+	Macros for SUCCEEDED and FAILED added.
+
+Mon Aug 31 00:55:31 1998  Ulrich Weigand <weigand@informatik.uni-erlangen.de>
+
+	* [loader/module.c]
+	Bugfix: LoadModule16 should *not* call LoadModule32.
+
+	* [files/dos_fs.c]
+	Bugfix: don't crash if given directory doesn't exist.
+
+Sat Aug 29 15:00:49 1998  Turchanov Sergey <turchanov@usa.net>
+
+	* [include/mmsystem.h][multimedia/mmsystem.c][relay32/winmm.spec]
+	Almost completed implementation of [snd]PlaySound (except
+	flags SND_ALIAS_ID and SND_APPLICATION).
+
+	* [if1632/user.spec][windows/winpos.c]
+	Added SetWindowRgn16 stub.
+
+Sat Aug 29 02:53:31 1998  Alexander Lukyanov <lav@long.yar.ru>
+
+	* [files/drive.c]
+	GetDriveType32A: return DRIVE_DOESNOTEXIST in case of non
+	existent drive.
+
+	* [msdos/int21.c]
+	INT21_FindFirstFCB: check drive validity to prevent oops.
+
+	* [win32/file.c]
+	CreateFile32A: duplicate STD_{INPUT,OUTPUT}_HANDLE.
+
+	* [files/dos_fs.c]
+	Make DOSFS_OpenDir treat "" as "/".
+	DOSFS_OpenDevice: duplicate STD_{INPUT,OUTPUT}_HANDLE.
+
+	* [windows/dialog.c]
+	GetNextDlgTabItem32: use last/first item instead of first/last
+	when hwndCtrl==0. This fixes initial focus.
+
+Sat Aug 29 02:46:32 1998  Adrian Harvey <adrian@select.com.au>
+
+	* [include/process.h] [include/process.c]
+	Renamed PROCESS_SELF to CURRENT_PROCESS_PSEUDOHANDLE in line
+	with thread constant, and Win32 documentation (which calls it
+	a pseudohandle.)  Made GetCurrentProcess actually use this
+	constant instead of the value.
+
+	* [include/process.h] [include/thread.h] [scheduler/thread.c]
+	  [scheduler/process.c] [scheduler/handle.c]
+	Modify HANDLE_GetObjPtr to understand about
+	CURRENT_THREAD_PSEUDOHANDLE and CURRENT_PROCESS_PSEUDOHANDLE.
+	This allows DuplicateHandle to do the correct thing with these
+	handles.  Removed now duplicate functionality from THREAD_GetPtr
+	and PROCESS_GetPtr.
+
+	* [loader/ne/segment.c]
+	Fixed two places where HFILE32s were being created and passed to
+	16-bit code. This should unbreak NE self-loading code.
+	Added two casts to remove compile time warnings.
+
+Fri Aug 28 21:04:13 1998  Joseph Pranevich <knight@baltimore.wwaves.com>
+
+	* [msdos/dosmem.c] [msdos/int2f.c]
+	Added beginnings of DOS error table.
+
+	* [msdos/int1a.c]
+	Stub for subfunction 0xb0.
+
+	* [msdos/int10.c] [loader/dos/dosvm.c]
+	INT 10 support completely rewritten and lots of debugging
+	added. Now, DOS apps that use INT 10 to write to the screen will
+	work. (Beyond Zork does, at least. Somewhat.)
+
+	* [include/miscemu.h] [msdos/dosmem.c] [msdos/int21.c]
+	Another shot at getting MS's generic error message facility
+	right.
+
+	* [msdos/int21.c]
+	Command.Com wanted to set its own PSP address. I let it.
+
+Wed Aug 26 12:26:20 1998  Matthew Toseland <Matthew.Toseland@btinternet.com>
+
+	* [include/file.h] [misc/lzexpand.c]
+	Fixed LZCopy16 by fixing HFILE16/HFILE32 convertor macros so don't
+	convert lzw handles.
+
+Tue Aug 25 22:22:55 1998  Uwe Bonnes <bon@elektron.ikp.physik.tu-darmstadt.de>
+
+	* [misc/registry.c]
+	In RegEnumvalue, ivalue == 0 is a legal request and should
+	return the first entry.
+
+	* [msdos/int21.c]
+	Add handling for Int21-48/49 in Win16. Makes blinker demo work.
+
+	* [windows/winproc.c]
+	Add Msg32A<->Msg32W translation for LB_ADDSTRING.
+
+Tue Aug 25 21:03:31 1998  Kristian Nielsen  <kristian.nielsen@risoe.dk>
+
+	* [windows/win.c]
+	Fix for SetParent(): MS Windows 3.11 does not clear the WS_CHILD
+	flag when a child window is reparented to the desktop window.
+
+Mon Aug 24 20:55:22 1998  Berend Reitsma <berend at asset-control dot com>
+
+	* [controls/menu.c]
+	Menus created with SetMenuItemInfo and InsertMenuItem should
+	work now.
+
+Sun Aug 23 23:23:23 1998  Alex Korobka <korobka@ams.sunysb.edu>
+
+	* [controls/combo.c]
+	Added CB_GETITEMHEIGHT.
+
+	* [windows/winpos.c] 
+	WM_NCHITTEST, SWP_FRAMECHANGED bugfixes.
+
+Sat Aug 22 21:15:29 1998 Alex Priem <alexp@sci.kun.nl>
+
+	* [files/profile.c] [include/windows.h]
+	Added GetPrivateProfileSectionNames[AW],GetPrivateProfileSectionW,
+	GetPrivateProfileStructW, GetProfileSectionW,
+	WriteProfileSection[AW], WritePrivateProfileStructW. 
+
+----------------------------------------------------------------------
 Sat Aug 22 17:46:19 1998  Ulrich Weigand <weigand@informatik.uni-erlangen.de>
 
 	* [include/dosexe.h] [include/module.h] [include/pe_image.h] 
diff --git a/Makefile.in b/Makefile.in
index 3f88e15..d4433a0 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -27,6 +27,7 @@
 	tools \
 	tools/wrc \
 	controls \
+	dlls/comctl32 \
 	dlls/shell32 \
 	files \
 	graphics \
@@ -77,6 +78,7 @@
 
 LIBOBJS = \
 	controls/controls.o \
+	dlls/comctl32/comctl32.o \
 	dlls/shell32/shell32.o \
 	files/files.o \
 	graphics/graphics.o \
diff --git a/configure b/configure
index 4c6f44c..d36a6c7 100755
--- a/configure
+++ b/configure
@@ -3397,6 +3397,7 @@
 controls/Makefile
 debugger/Makefile
 dlls/Makefile
+dlls/comctl32/Makefile
 dlls/shell32/Makefile
 documentation/Makefile
 files/Makefile
@@ -3534,6 +3535,7 @@
 controls/Makefile
 debugger/Makefile
 dlls/Makefile
+dlls/comctl32/Makefile
 dlls/shell32/Makefile
 documentation/Makefile
 files/Makefile
diff --git a/configure.in b/configure.in
index cf1d414..d6a0c78 100644
--- a/configure.in
+++ b/configure.in
@@ -461,6 +461,7 @@
 controls/Makefile
 debugger/Makefile
 dlls/Makefile
+dlls/comctl32/Makefile
 dlls/shell32/Makefile
 documentation/Makefile
 files/Makefile
diff --git a/controls/Makefile.in b/controls/Makefile.in
index a49d710..e2369d6 100644
--- a/controls/Makefile.in
+++ b/controls/Makefile.in
@@ -8,27 +8,14 @@
 C_SRCS = \
 	button.c \
 	combo.c \
-	comctl32undoc.c \
-	commctrl.c \
 	desktop.c \
 	edit.c \
-	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
 
 all: $(MODULE).o
diff --git a/controls/combo.c b/controls/combo.c
index 1b8e1d7..b7a44db 100644
--- a/controls/combo.c
+++ b/controls/combo.c
@@ -129,6 +129,7 @@
    return 0;
 }
 
+
 /***********************************************************************
  *           CBCalcPlacement
  *
@@ -142,22 +143,6 @@
 
    /* get combo height and width */
 
-   if( lphc->editHeight )
-       size.cy = lphc->editHeight;
-   else
-   {
-       HDC32	hDC = GetDC32( lphc->self->hwndSelf );
-       HFONT32	hPrevFont = 0;
-
-       if( lphc->hFont ) hPrevFont = SelectObject32( hDC, lphc->hFont );
-   
-       GetTextExtentPoint32A( hDC, "0", 1, &size);
-
-       size.cy += size.cy / 4 + 4 * SYSMETRICS_CYBORDER;
-
-       if( hPrevFont ) SelectObject32( hDC, hPrevFont );
-       ReleaseDC32( lphc->self->hwndSelf, hDC );
-   }
    size.cx = rect.right - rect.left;
 
    if( CB_OWNERDRAWN(lphc) )
@@ -181,6 +166,23 @@
        }
        size.cy = u;
    }
+   else if( lphc->editHeight ) /* explicitly set height */
+	size.cy = lphc->editHeight;
+   else
+   {
+       HDC32    hDC = GetDC32( lphc->self->hwndSelf );
+       HFONT32  hPrevFont = 0;
+
+       if( lphc->hFont ) hPrevFont = SelectObject32( hDC, lphc->hFont );
+
+       GetTextExtentPoint32A( hDC, "0", 1, &size);
+
+       size.cy += size.cy / 4 + 4 * SYSMETRICS_CYBORDER;
+
+       if( hPrevFont ) SelectObject32( hDC, hPrevFont );
+       ReleaseDC32( lphc->self->hwndSelf, hDC );
+   }
+
 
    /* calculate text and button placement */
 
@@ -1419,10 +1421,17 @@
 		return SendMessage32A( lphc->hWndLBox, LB_FINDSTRINGEXACT32, 
 						       wParam, lParam );
 	case CB_SETITEMHEIGHT16:
-		wParam = (INT32)(INT16)wParam;
+		wParam = (INT32)(INT16)wParam; /* signed integer */
 	case CB_SETITEMHEIGHT32:
 		return COMBO_SetItemHeight( lphc, (INT32)wParam, (INT32)lParam);
 
+	case CB_GETITEMHEIGHT16:
+		wParam = (INT32)(INT16)wParam;
+	case CB_GETITEMHEIGHT32:
+		if( (INT32)wParam >= 0 )
+		    return SendMessage32A( lphc->hWndLBox, LB_GETITEMHEIGHT32, wParam, 0);
+		return (lphc->RectEdit.bottom - lphc->RectEdit.top);
+
 	case CB_RESETCONTENT16: 
 	case CB_RESETCONTENT32:
 		SendMessage32A( lphc->hWndLBox, LB_RESETCONTENT32, 0, 0 );
diff --git a/controls/comctl32undoc.c b/controls/comctl32undoc.c
deleted file mode 100644
index aa5c83d..0000000
--- a/controls/comctl32undoc.c
+++ /dev/null
@@ -1,586 +0,0 @@
-/*
- * Undocumented functions from COMCTL32.DLL
- *
- * Copyright 1998 Eric Kohl <ekohl@abo.rhein-zeitung.de>
- *           1998 Juergen Schmied <j.schmied@metronet.de>
- * NOTES
- *     All of these functions are UNDOCUMENTED!! And I mean UNDOCUMENTED!!!!
- *     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).
- *
- * TODO
- *     - Fix DSA_InsertItem.
- *     - Fix DSA_GetItem.
- *     - Write documentation.
- */
-
-#include <string.h>
-#include <stdlib.h>
-#include <ctype.h>
-#include "windows.h"
-#include "heap.h"
-#include "debug.h"
-
-typedef struct _DPA_DATA
-{
-    DWORD   dwEntryCount;
-    DWORD   dwMaxCount;
-    DWORD   dwGrow;
-    LPDWORD ptrs; 
-} DPA_DATA, *LPDPA_DATA;
-
-
-DWORD WINAPI DPA_Create (DWORD);
-DWORD WINAPI DPA_GetPtr (DWORD, DWORD);
-DWORD WINAPI DPA_InsertPtr (DWORD, DWORD, DWORD);
-
-
-CRITICAL_SECTION cs_comctl_alloc;
-HANDLE32 hComctl32Heap=0;
-/**************************************************************************
- * Alloc [COMCTL32.71]
- *
- */
-
-LPVOID WINAPI COMCTL32_Alloc (DWORD dwParam)
-{   LPVOID lpPtr;
-
-    TRACE (commctrl, "(0x%08lx)\n", dwParam);
-
-	if (hComctl32Heap==0)
-	{ EnterCriticalSection((void*)&cs_comctl_alloc);
-      hComctl32Heap=HeapCreate(0,1,0x4000000);
-      LeaveCriticalSection((void*)&cs_comctl_alloc);
-      TRACE (commctrl, "Heap created: 0x%08x\n", hComctl32Heap);
-      if (! hComctl32Heap)
-        return FALSE;        
-	}
-
-//    lpPtr = HeapAlloc (GetProcessHeap(), HEAP_ZERO_MEMORY, dwParam);
-    lpPtr = HeapAlloc (hComctl32Heap, HEAP_ZERO_MEMORY, dwParam);
-    TRACE (commctrl, "-- ret=%p\n", lpPtr);
-    return lpPtr;
-}
-
-
-/**************************************************************************
- * ReAlloc [COMCTL32.72]
- *
- */
-
-LPVOID WINAPI
-COMCTL32_ReAlloc (LPVOID dwParam1, DWORD dwParam2)
-{
-    LPVOID dwPtr;
-    TRACE (commctrl, "(0x%08lx 0x%08lx)\n",(DWORD)dwParam1, dwParam2);
-    
-    if (dwParam1 == 0)
-	dwPtr = HeapAlloc (hComctl32Heap, HEAP_ZERO_MEMORY,
-			   dwParam2);
-    else
-	dwPtr = HeapReAlloc (hComctl32Heap, HEAP_ZERO_MEMORY,
-			     dwParam1, dwParam2);
-
-    TRACE (commctrl, "-- ret=0x%08lx\n", (DWORD)dwPtr);
-
-    return dwPtr;
-}
-
-
-/**************************************************************************
- * Free [COMCTL32.73]
- *
- */
-
-DWORD WINAPI
-COMCTL32_Free (LPVOID dwParam)
-{
-    TRACE (commctrl, "(0x%08lx)\n", (DWORD)dwParam);
-    HeapFree (hComctl32Heap, 0, dwParam);
-
-    return 0;
-}
-
-
-/**************************************************************************
- * GetSize [COMCTL32.74]
- *
- */
-
-DWORD WINAPI
-COMCTL32_GetSize (LPVOID dwParam)
-{
-    TRACE (commctrl, "(0x%08lx)\n", (DWORD)dwParam);
-    return (HeapSize (hComctl32Heap, 0, dwParam));
-}
-
-
-
-/**************************************************************************
- * Str_SetPtrA [COMCTL32.234]
- *
- * PARAMS
- *     dwParam1 [I]
- *     dwParam2 [I]
- */
-
-BOOL32 WINAPI
-COMCTL32_Str_SetPtrA (LPSTR lpStr, LPVOID *lpPtr)
-{
-    INT32 len;
-    LPSTR ptr;
-
-    FIXME (commctrl, "(0x%08lx 0x%08lx)\n", (DWORD)lpStr, (DWORD)lpPtr);
-    FIXME (commctrl, "(\"%s\" \"%s\")\n", lpStr, (LPSTR)*lpPtr);
-
-    if (lpStr) {
-	len = lstrlen32A (lpStr);
-	ptr = COMCTL32_ReAlloc (lpPtr, len + 1);
-	if (!(ptr))
-	    return FALSE;
-	lstrcpy32A (ptr, lpStr);
-	*lpPtr = ptr;
-	return TRUE;
-    }
-
-    if (*lpPtr) {
-	COMCTL32_Free (*lpPtr);
-	return TRUE;
-    }
-
-    return FALSE;
-}
-
-/*************************************************************************
-* The DSA-API is a set of functions to create and manipulate arrays of
-* fix sized memory blocks. This arrays can store any kind of data (strings,
-* icons...) so the name "dynamic string array" is a bit misleading.
-*
-* STATUS 
-*  complete
-*/
-typedef struct _DSA_DATA
-{   DWORD   dwEntryCount;
-    BYTE    * pData;
-    DWORD   dwMaxCount;
-    DWORD   dwElementSize;
-    DWORD   dwGrow;
-} DSA_DATA, *LPDSA_DATA;
-
-/**************************************************************************
- * DSA_Create [COMCTL32.320] Creates a dynamic string array
- *
- * PARAMS
- *     dwSize [I] size of the array elements
- *     dwGrow [I] 
- * RETURNS
- *     pointer to a array control structure. use this like a handle.
- */
-
-LPDSA_DATA WINAPI DSA_Create (DWORD dwSize, DWORD dwGrow)
-{   LPDSA_DATA dsaPtr;
-
-    TRACE (commctrl, "(size=0x%08lx grow=0x%08lx)\n", dwSize, dwGrow);
-
-    if ((dsaPtr=(LPDSA_DATA)COMCTL32_Alloc(sizeof(DSA_DATA))));
-    {  dsaPtr->dwEntryCount=0x00;
-       dsaPtr->pData=NULL;
-       dsaPtr->dwMaxCount=0x00;
-       dsaPtr->dwElementSize=dwSize;
-       if ( dwGrow == 0 )
-         dsaPtr->dwGrow=1;
-       else
-         dsaPtr->dwGrow=dwGrow;
-       return dsaPtr;
-    }
-    return FALSE;   
-}
-
-/**************************************************************************
- * DSA_Destroy [COMCTL32.321] Destroys a dynamic string array
- *
- * PARAMS
- *     dsaPtr [I] pointer to the array control structure
- * RETURNS
- *  TRUE if dsaPtr = NULL or success
- *  FALSE if failure
- */
-
-BOOL32 WINAPI DSA_Destroy (const LPDSA_DATA dsaPtr )
-{   TRACE (commctrl, "(%p)\n", dsaPtr);
-
-	if (! dsaPtr)
-      return FALSE;
-
-    if (dsaPtr->pData && (! COMCTL32_Free(dsaPtr->pData)))
-    { return FALSE;
-    }
-    return COMCTL32_Free (dsaPtr);
-}
-
-/**************************************************************************
- * DSA_GetItem [COMCTL32.322] 
- *
- * PARAMS
- *  dsaPtr [I] pointer to the array control structure
- *  dwItem [I] number of the Item to get
-+ *  pDest  [O] destination buffer. Has to be >= dwElementSize.
- */
-
-BOOL32 WINAPI DSA_GetItem (const LPDSA_DATA dsaPtr, DWORD dwItem, LPBYTE pDest)
-{   BYTE * pSrc;
-
-    TRACE (commctrl, "(%p 0x%08lx %p)\n", dsaPtr, dwItem, pDest);
-    
-    if ( (!dsaPtr) || (dwItem < 0) || (dwItem >= dsaPtr->dwEntryCount))
-      return FALSE;
-    
-    pSrc = dsaPtr->pData + (dsaPtr->dwElementSize * dwItem);
-    memmove(pDest,pSrc,dsaPtr->dwElementSize);
-    return TRUE;
-}
-
-/**************************************************************************
- * DSA_GetItemPtr [COMCTL32.323] 
- *
- * PARAMS
- *  dsaPtr [I] pointer to the array control structure
- *  dwItem [I] number of the Item to get
- * RETURNS
- *  pointer ti a item 
- */
-LPBYTE WINAPI DSA_GetItemPtr (const LPDSA_DATA dsaPtr, DWORD dwItem)
-{   BYTE * pSrc;
-
-	TRACE (commctrl, "(%p 0x%08lx)\n", dsaPtr, dwItem);
-
-    if ((!dsaPtr) || (dwItem < 0) || (dwItem >= dsaPtr->dwEntryCount))
-	  return FALSE;
-    pSrc = dsaPtr->pData + (dsaPtr->dwElementSize * dwItem);
-    
-    TRACE (commctrl, "-- ret=%p\n", pSrc);
-
-    return  pSrc;
-}
-
-/**************************************************************************
- * DSA_SetItem [COMCTL32.325] 
- *
- * PARAMS
- *  dsaPtr [I] pointer to the array control structure
- *  dwItem [I] index for the new element
- *  pSrc   [I] the element
- */
-BOOL32 WINAPI DSA_SetItem (const LPDSA_DATA dsaPtr, DWORD dwItem, LPBYTE pSrc)
-{   LPBYTE pDest;
- 	DWORD  dwSize, dwNewItems;
-	LPBYTE lpTemp;
-    
-    TRACE (commctrl, "(%p 0x%08lx %p)\n", dsaPtr, dwItem, pSrc);
-
-	if ((!dsaPtr) || dwItem<0 )
-      return FALSE;
-      
-    if (dsaPtr->dwEntryCount <= dwItem)	/* within the old array */
-    { if ( dsaPtr->dwMaxCount > dwItem) 
-      { dsaPtr->dwEntryCount = dwItem; /* within the allocated space, set a new boundary */
-      }
-      else
-      { /* resize the block of memory*/
-        dwNewItems = dsaPtr->dwGrow * ( (WORD)((dwItem-1)/dsaPtr->dwGrow) +1);
-        dwSize = dsaPtr->dwElementSize * dwNewItems;
-        lpTemp = (LPBYTE) COMCTL32_ReAlloc(dsaPtr->pData,dwSize);
-        if (! lpTemp )
-        { return FALSE;
-        }
-        dsaPtr->dwMaxCount = dwNewItems;
-        dsaPtr->pData = lpTemp;        
-      }    
-    }
-	/* put the new entry in */
-	pDest = dsaPtr->pData +  (dsaPtr->dwElementSize * dwItem);
-    TRACE (commctrl,"move dest=%p src=%p size=%x",pDest,pSrc,dsaPtr->dwElementSize);
-	memmove(pDest,pSrc,dsaPtr->dwElementSize);
-    return TRUE;
-}
-
-/**************************************************************************
- * DSA_InsertItem [COMCTL32.325] 
- *
- * PARAMS
- *  dsaPtr [I] pointer to the array control structure
- *  dwItem [I] index for the new element
- *  pSrc   [I] the element
- *
- * RETURNS
- *  the position of the new element
- */
-DWORD WINAPI DSA_InsertItem (const LPDSA_DATA dsaPtr, DWORD dwItem, LPBYTE pSrc)
-{	DWORD dwNewItems, dwSize,i;
-	LPBYTE lpTemp, lpDest;
-    LPDWORD p;
-    
-	TRACE(commctrl, "(%p 0x%08lx %p)\n", dsaPtr, dwItem, pSrc);
-
-	if ( (!dsaPtr) || dwItem<0 )
-      return -1;
-
-	for (i=0; i<dsaPtr->dwElementSize;i+=4)
-    { p = *(DWORD**)(pSrc+i);
-      if ( IsBadStringPtr32A ((char*)p,256))
-      { TRACE(commctrl,"-- 0x%04lx=%p\n",i,(DWORD*)p);
-      }
-      else
-      { TRACE(commctrl,"-- 0x%04lx=%p [%s]\n",i,p,debugstr_a((char*)p));
-      }
-    }
-    
-    if (dwItem > dsaPtr->dwEntryCount)		/* when dwItem > dwEntryCount then append*/
-      dwItem = dsaPtr->dwEntryCount+1;
-    
-    if (dwItem >= dsaPtr->dwMaxCount)		/* do we need to resize ? */
-    { dwNewItems = dsaPtr->dwMaxCount + dsaPtr->dwGrow;
-      dwSize = dsaPtr->dwElementSize * dwNewItems;
-	  lpTemp = (LPBYTE)COMCTL32_ReAlloc(dsaPtr->pData,dwSize);
-      if (!lpTemp)
-      { return -1;
-      }
-      dsaPtr->dwMaxCount = dwNewItems;
-      dsaPtr->pData = lpTemp;         
-    }
-
-    if (dwItem < dsaPtr->dwEntryCount)		/* do we need to move elements ?*/
-	{ lpTemp = dsaPtr->pData + (dsaPtr->dwElementSize * dwItem);
-      lpDest = lpTemp + dsaPtr->dwElementSize;
-      TRACE (commctrl,"-- move dest=%p src=%p size=%x\n",lpDest,lpTemp,dsaPtr->dwElementSize);
-      memmove (lpDest,lpTemp,dsaPtr->dwElementSize);
-    } 
-    /* ok, we can put the new Item in*/
-    dsaPtr->dwEntryCount++;
-    lpDest = dsaPtr->pData + (dsaPtr->dwElementSize * dwItem);
-    TRACE (commctrl,"-- move dest=%p src=%p size=%x\n",lpDest,pSrc,dsaPtr->dwElementSize);
-	memmove (lpDest,pSrc,dsaPtr->dwElementSize);
-	return dsaPtr->dwEntryCount;
-}
-/**************************************************************************
- * DSA_DeleteItem [COMCTL32.326] 
- *
- * PARAMS
- *  dsaPtr [I] pointer to the array control structure
- *  dwItem [I] index for the element to delete
- * RETURNS
- *  number of the element deleted
- */
-DWORD WINAPI DSA_DeleteItem (const LPDSA_DATA dsaPtr, DWORD dwItem)
-{	LPBYTE	lpDest,lpSrc;
-	DWORD	dwSize;
-    
-    TRACE (commctrl, "(%p 0x%08lx)\n", dsaPtr, dwItem);
-
-	if ( (! dsaPtr) || dwItem<0 || dwItem>=dsaPtr->dwEntryCount)
-      return FALSE;
-
-    if ( dwItem < dsaPtr->dwEntryCount-1 )	/* do we need to move ?*/
-	{ lpDest = dsaPtr->pData + (dsaPtr->dwElementSize * dwItem);
-      lpSrc = lpDest + dsaPtr->dwElementSize;
-      dwSize = dsaPtr->dwElementSize * (dsaPtr->dwEntryCount-dwItem-1);
-      TRACE (commctrl,"-- move dest=%p src=%p size=%x\n",lpDest,lpSrc,dwSize);
-      memmove (lpDest,lpSrc,dwSize);
-	}
-    
-    dsaPtr->dwEntryCount--;
-    
-    if ( (dsaPtr->dwMaxCount-dsaPtr->dwEntryCount) >= dsaPtr->dwGrow) /* free memory ?*/
-    { dwSize = dsaPtr->dwElementSize * dsaPtr->dwEntryCount;
-      lpDest = (LPBYTE) COMCTL32_ReAlloc(dsaPtr->pData,dwSize);
-      if (!lpDest)
-      { return FALSE;
-      }
-      dsaPtr->dwMaxCount = dsaPtr->dwEntryCount;
-      dsaPtr->pData = lpDest;         
-
-    }
-    return dwItem;
-}
-
-/**************************************************************************
- * DSA_DeleteAllItems [COMCTL32.326] 
- *  deletes all elements and initializes array
- *
- * PARAMS
- *  dsaPtr [I] pointer to the array control structure
- *
- * RETURNS
- *  TRUE/FALSE
- */
-BOOL32 WINAPI DSA_DeleteAllItems (const LPDSA_DATA dsaPtr)
-{   TRACE (commctrl, "(%p)\n", dsaPtr);
-
-	if (! dsaPtr) 
-      return FALSE;
-
-    if (dsaPtr->pData && (! COMCTL32_Free(dsaPtr->pData)))
-    { return FALSE;
-    }
-	dsaPtr->dwEntryCount=0x00;
-    dsaPtr->pData=NULL;
-    dsaPtr->dwMaxCount=0x00;
-    return TRUE;
-}
-/**************************************************************************/
-
-
-DWORD WINAPI
-DPA_Create (DWORD dwParam1)
-{
-    LPDPA_DATA dpaPtr;
-
-    TRACE (commctrl, "(0x%08lx)\n", dwParam1);
-
-    dpaPtr = (LPDPA_DATA)HeapAlloc (SystemHeap, HEAP_ZERO_MEMORY, sizeof(DPA_DATA));
-    dpaPtr->dwGrow = dwParam1;
-
-    TRACE (commctrl, "ret=0x%08lx\n", (DWORD)dpaPtr);
-
-    return (DWORD)dpaPtr;
-}
-
-
-
-DWORD WINAPI
-DPA_GetPtr (DWORD dwParam1, DWORD dwParam2)
-{
-    LPDPA_DATA dpaPtr = (LPDPA_DATA)dwParam1;
-
-    TRACE (commctrl, "(0x%08lx 0x%08lx)\n", dwParam1, dwParam2);
-
-    if (dpaPtr == NULL)
-	return 0;
-    if (dpaPtr->ptrs == NULL)
-	return 0;
-    if ((dwParam2 < 0) || (dwParam2 >= dpaPtr->dwEntryCount))
-	return 0;
-
-    TRACE (commctrl, "ret=0x%08lx\n", (DWORD)dpaPtr->ptrs[dwParam2]);
-
-    return (DWORD)dpaPtr->ptrs[dwParam2];
-}
-
-
-
-DWORD WINAPI
-DPA_InsertPtr (DWORD dwParam1, DWORD dwParam2, DWORD dwParam3)
-{
-    LPDPA_DATA dpaPtr = (LPDPA_DATA)dwParam1;
-    DWORD dwIndex;
-
-    TRACE (commctrl, "(0x%08lx 0x%08lx 0x%lx)\n",
-	   dwParam1, dwParam2, dwParam3);
-
-    if (dpaPtr->ptrs == NULL) {
-	dpaPtr->ptrs = (LPDWORD)HeapAlloc (SystemHeap, HEAP_ZERO_MEMORY,
-					   dpaPtr->dwGrow * sizeof(LPVOID));
-	dpaPtr->dwMaxCount = dpaPtr->dwGrow;
-        dwIndex = 0;
-        dpaPtr->ptrs[dwIndex] = dwParam3;
-    }
-    else {
-	FIXME (commctrl, "adding to existing array! stub!\n");
-
-
-	dwIndex = dwParam2;
-    }
-
-    dpaPtr->dwEntryCount++;
-
-    return (dwIndex);
-}
-
-
-/**************************************************************************
- * 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 (LPCSTR lpString, CHAR cChar)
-{
-    return strchr (lpString, cChar);
-}
-
-
-/**************************************************************************
- * StrStrIA [COMCTL32.355]
- */
-
-LPSTR WINAPI
-COMCTL32_StrStrIA (LPCSTR lpStr1, LPCSTR lpStr2)
-{
-    INT32 len1, len2, i;
-    CHAR  first;
-
-    if (*lpStr2 == 0)
-	return ((LPSTR)lpStr1);
-    len1 = 0;
-    while (lpStr1[len1] != 0) ++len1;
-    len2 = 0;
-    while (lpStr2[len2] != 0) ++len2;
-    if (len2 == 0)
-	return ((LPSTR)(lpStr1 + len1));
-    first = tolower (*lpStr2);
-    while (len1 >= len2) {
-	if (tolower(*lpStr1) == first) {
-	    for (i = 1; i < len2; ++i)
-		if (tolower (lpStr1[i]) != tolower(lpStr2[i]))
-		    break;
-	    if (i >= len2)
-		return ((LPSTR)lpStr1);
-        }
-	++lpStr1; --len1;
-    }
-    return (NULL);
-}
-
-
-/**************************************************************************
- * StrToIntA [COMCTL32.357] Converts a string to a signed integer.
- */
-
-INT32 WINAPI
-COMCTL32_StrToIntA (LPSTR lpString)
-{
-    return atoi(lpString);
-}
-
diff --git a/controls/edit.c b/controls/edit.c
index bfb724a..8a90e01 100644
--- a/controls/edit.c
+++ b/controls/edit.c
@@ -514,6 +514,7 @@
 	case EM_REPLACESEL32:
 		DPRINTF_EDIT_MSG32("EM_REPLACESEL");
 		EDIT_EM_ReplaceSel(wnd, es, (BOOL32)wParam, (LPCSTR)lParam);
+		result = 1;
 		break;
 
 	/* message 0x00c3 missing from specs */
diff --git a/controls/listbox.c b/controls/listbox.c
index 25af765..9571034 100644
--- a/controls/listbox.c
+++ b/controls/listbox.c
@@ -312,7 +312,7 @@
     GetClientRect32( wnd->hwndSelf, &rect );
     descr->width  = rect.right - rect.left;
     descr->height = rect.bottom - rect.top;
-    if (!(descr->style & LBS_NOINTEGRALHEIGHT))
+    if (!(descr->style & LBS_NOINTEGRALHEIGHT) && !IS_OWNERDRAW(descr))
     {
         if ((descr->height > descr->item_height) &&
             (descr->height % descr->item_height))
diff --git a/controls/listview.c b/controls/listview.c
deleted file mode 100644
index 1c600c5..0000000
--- a/controls/listview.c
+++ /dev/null
@@ -1,244 +0,0 @@
-/*
- * 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);
-
-    FIXME (listview, "(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/menu.c b/controls/menu.c
index 45a25c6..8940964 100644
--- a/controls/menu.c
+++ b/controls/menu.c
@@ -760,7 +760,7 @@
 
     if ((lprect == NULL) || (lppop == NULL)) return;
     if (lppop->nItems == 0) return;
-    TRACE(menu,"MENU_MenuBarCalcSize left=%d top=%d right=%d bottom=%d\n", 
+    TRACE(menu,"left=%d top=%d right=%d bottom=%d\n", 
                  lprect->left, lprect->top, lprect->right, lprect->bottom);
     lppop->Width  = lprect->right - lprect->left;
     lppop->Height = 0;
@@ -1102,7 +1102,7 @@
 		SetROP232( hdc, ropPrev );
 	    }
 	    else
-		TWEAK_DrawReliefRect95(hdc, &rect);
+		DrawEdge32 (hdc, &rect, EDGE_RAISED, BF_RECT);
 
 	    /* draw menu items */
 
@@ -2968,6 +2968,7 @@
 
     if (!(menu = (LPPOPUPMENU) USER_HEAP_LIN_ADDR(hMenu))) return -1;
     if ((nPos < 0) || (nPos >= menu->nItems)) return -1;
+    if (menu->items[nPos].fType & MF_POPUP) return -1; 
     return menu->items[nPos].wID;
 }
 
@@ -3814,8 +3815,21 @@
     if (lpmii->fMask & MIIM_ID)
 	menu->wID = lpmii->wID;
 
-    if (lpmii->fMask & MIIM_SUBMENU)
+    if (lpmii->fMask & MIIM_SUBMENU) {
 	menu->hSubMenu = lpmii->hSubMenu;
+	if (menu->hSubMenu) {
+	    POPUPMENU *subMenu = (POPUPMENU *)USER_HEAP_LIN_ADDR((UINT16)menu->hSubMenu);
+	    if (IS_A_MENU(subMenu)) {
+		subMenu->wFlags |= MF_POPUP;
+		menu->fType |= MF_POPUP;
+	    }
+	    else
+		/* FIXME: Return an error ? */
+		menu->fType &= ~MF_POPUP;
+	}
+	else
+	    menu->fType &= ~MF_POPUP;
+    }
 
     if (lpmii->fMask & MIIM_CHECKMARKS)
     {
diff --git a/controls/static.c b/controls/static.c
index ac53bbd..70c65f0 100644
--- a/controls/static.c
+++ b/controls/static.c
@@ -271,7 +271,6 @@
     case WM_GETDLGCODE:
         return DLGC_STATIC;
 
-    	return infoPtr->hIcon;
     case STM_GETIMAGE:
     case STM_GETICON16:
     case STM_GETICON32:
@@ -283,6 +282,7 @@
         InvalidateRect32( hWnd, NULL, FALSE );
         UpdateWindow32( hWnd );
 	break;
+
     case STM_SETICON16:
     case STM_SETICON32:
         lResult = STATIC_SetIcon( wndPtr, (HICON16)wParam );
diff --git a/controls/trackbar.c b/controls/trackbar.c
deleted file mode 100644
index 48e587b..0000000
--- a/controls/trackbar.c
+++ /dev/null
@@ -1,437 +0,0 @@
-/*
- * 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/widgets.c b/controls/widgets.c
index 20ca347..51fe1bc 100644
--- a/controls/widgets.c
+++ b/controls/widgets.c
@@ -7,7 +7,6 @@
 #include <assert.h>
 
 #include "win.h"
-#include "commctrl.h"
 #include "button.h"
 #include "static.h"
 #include "scroll.h"
diff --git a/dlls/Makefile.in b/dlls/Makefile.in
index efbafbc..67e3a95 100644
--- a/dlls/Makefile.in
+++ b/dlls/Makefile.in
@@ -1,4 +1,5 @@
 SUBDIRS = \
+	comctl32 \
 	shell32
 
 all: $(SUBDIRS)
diff --git a/dlls/comctl32/Makefile.in b/dlls/comctl32/Makefile.in
new file mode 100644
index 0000000..8c7b770
--- /dev/null
+++ b/dlls/comctl32/Makefile.in
@@ -0,0 +1,32 @@
+DEFS      = @DLLFLAGS@ -D__WINE__
+TOPSRCDIR = @top_srcdir@
+TOPOBJDIR = ../..
+SRCDIR    = @srcdir@
+VPATH     = @srcdir@
+MODULE    = comctl32
+
+C_SRCS = \
+	animate.c \
+	comboex.c \
+	comctl32undoc.c \
+	commctrl.c \
+	header.c \
+	hotkey.c \
+	imagelist.c \
+	listview.c \
+	pager.c \
+	progress.c \
+	rebar.c \
+	status.c \
+	tab.c \
+	toolbar.c \
+	tooltips.c \
+	trackbar.c \
+	treeview.c \
+	updown.c
+
+all: $(MODULE).o
+
+@MAKE_RULES@
+
+### Dependencies:
diff --git a/dlls/comctl32/animate.c b/dlls/comctl32/animate.c
new file mode 100644
index 0000000..9303711
--- /dev/null
+++ b/dlls/comctl32/animate.c
@@ -0,0 +1,225 @@
+/*
+ * Animation 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 "animate.h"
+#include "win.h"
+#include "debug.h"
+
+
+#define ANIMATE_GetInfoPtr(wndPtr) ((ANIMATE_INFO *)wndPtr->wExtra[0])
+
+
+static LRESULT
+ANIMATE_Open32A (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
+{
+    ANIMATE_INFO *infoPtr = ANIMATE_GetInfoPtr(wndPtr);
+
+    if (!lParam) {
+
+	FIXME (animate, "close avi: empty stub!\n");
+
+	return TRUE;
+    }
+    
+    if (HIWORD(lParam)) {
+
+	FIXME (animate, "(\"%s\") empty stub!\n", (LPSTR)lParam);
+
+    }
+    else {
+
+	FIXME (animate, "(%u) empty stub!\n", (WORD)LOWORD(lParam));
+
+    }
+
+
+    return TRUE;
+}
+
+
+static LRESULT
+ANIMATE_Play (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
+{
+    ANIMATE_INFO *infoPtr = ANIMATE_GetInfoPtr(wndPtr);
+    INT32 nFrom   = (INT32)LOWORD(lParam);
+    INT32 nTo     = (INT32)HIWORD(lParam);
+    INT32 nRepeat = (INT32)wParam;
+
+#if 0
+    /* nothing opened */
+    if (...)
+	return FALSE;
+#endif
+    
+    if (nRepeat == -1) {
+
+	FIXME (animate, "(loop from=%d to=%d) empty stub!\n",
+	       nFrom, nTo);
+
+    }
+    else {
+
+	FIXME (animate, "(repeat=%d from=%d to=%d) empty stub!\n",
+	       nRepeat, nFrom, nTo);
+
+    }
+
+
+    return TRUE;
+}
+
+
+static LRESULT
+ANIMATE_Stop (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
+{
+    ANIMATE_INFO *infoPtr = ANIMATE_GetInfoPtr(wndPtr);
+
+#if 0
+    /* nothing opened */
+    if (...)
+	return FALSE;
+#endif
+    
+    return TRUE;
+}
+
+
+
+static LRESULT
+ANIMATE_Create (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
+{
+    ANIMATE_INFO *infoPtr;
+
+    /* allocate memory for info structure */
+    infoPtr = (ANIMATE_INFO *)COMCTL32_Alloc (sizeof(ANIMATE_INFO));
+    wndPtr->wExtra[0] = (DWORD)infoPtr;
+
+    if (infoPtr == NULL) {
+	ERR (animate, "could not allocate info memory!\n");
+	return 0;
+    }
+
+    if ((ANIMATE_INFO*)wndPtr->wExtra[0] != infoPtr) {
+	ERR (animate, "pointer assignment error!\n");
+	return 0;
+    }
+
+    /* set default settings */
+
+
+    return 0;
+}
+
+
+static LRESULT
+ANIMATE_Destroy (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
+{
+    ANIMATE_INFO *infoPtr = ANIMATE_GetInfoPtr(wndPtr);
+
+
+
+
+    /* free animate info data */
+    COMCTL32_Free (infoPtr);
+
+    return 0;
+}
+
+
+#if 0
+static LRESULT
+ANIMATE_EraseBackground (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
+{
+    ANIMATE_INFO *infoPtr = ANIMATE_GetInfoPtr(wndPtr);
+/*
+    HBRUSH32 hBrush = CreateSolidBrush32 (infoPtr->clrBk);
+    RECT32 rect;
+
+    GetClientRect32 (wndPtr->hwndSelf, &rect);
+    FillRect32 ((HDC32)wParam, &rect, hBrush);
+    DeleteObject32 (hBrush);
+*/
+    return TRUE;
+}
+#endif
+
+
+
+LRESULT WINAPI
+ANIMATE_WindowProc (HWND32 hwnd, UINT32 uMsg, WPARAM32 wParam, LPARAM lParam)
+{
+    WND *wndPtr = WIN_FindWndPtr(hwnd);
+
+    switch (uMsg)
+    {
+	case ACM_OPEN32A:
+	    return ANIMATE_Open32A (wndPtr, wParam, lParam);
+
+//	case ACM_OPEN32W:
+//	    return ANIMATE_Open32W (wndPtr, wParam, lParam);
+
+        case ACM_PLAY:
+            return ANIMATE_Play (wndPtr, wParam, lParam);
+
+	case ACM_STOP:
+	    return ANIMATE_Stop (wndPtr, wParam, lParam);
+
+
+	case WM_CREATE:
+	    return ANIMATE_Create (wndPtr, wParam, lParam);
+
+	case WM_DESTROY:
+	    return ANIMATE_Destroy (wndPtr, wParam, lParam);
+
+//	case WM_ERASEBKGND:
+//	    return ANIMATE_EraseBackground (wndPtr, wParam, lParam);
+
+//	case WM_NCCREATE:
+//	case WM_NCHITTEST:
+//	case WM_PAINT:
+//	case WM_SIZE:
+//	case WM_STYLECHANGED:
+//	case WM_TIMER:
+
+	default:
+	    if (uMsg >= WM_USER)
+		ERR (animate, "unknown msg %04x wp=%08x lp=%08lx\n",
+		     uMsg, wParam, lParam);
+	    return DefWindowProc32A (hwnd, uMsg, wParam, lParam);
+    }
+    return 0;
+}
+
+
+void
+ANIMATE_Register (void)
+{
+    WNDCLASS32A wndClass;
+
+    if (GlobalFindAtom32A (ANIMATE_CLASS32A)) return;
+
+    ZeroMemory (&wndClass, sizeof(WNDCLASS32A));
+    wndClass.style         = CS_GLOBALCLASS | CS_DBLCLKS;
+    wndClass.lpfnWndProc   = (WNDPROC32)ANIMATE_WindowProc;
+    wndClass.cbClsExtra    = 0;
+    wndClass.cbWndExtra    = sizeof(ANIMATE_INFO *);
+    wndClass.hCursor       = LoadCursor32A (0, IDC_ARROW32A);
+    wndClass.hbrBackground = (HBRUSH32)(COLOR_BTNFACE + 1);
+    wndClass.lpszClassName = ANIMATE_CLASS32A;
+ 
+    RegisterClass32A (&wndClass);
+}
diff --git a/dlls/comctl32/comboex.c b/dlls/comctl32/comboex.c
new file mode 100644
index 0000000..7c7dc90
--- /dev/null
+++ b/dlls/comctl32/comboex.c
@@ -0,0 +1,283 @@
+/*
+ * ComboBoxEx 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.
+ *
+ * FIXME:
+ *   - should include "combo.h" 
+ */
+
+#include "windows.h"
+#include "commctrl.h"
+#include "comboex.h"
+#include "win.h"
+#include "debug.h"
+
+#define ID_CB_EDIT    1001
+
+#define COMBOEX_GetInfoPtr(wndPtr) ((COMBOEX_INFO *)wndPtr->wExtra[0])
+
+
+// << COMBOEX_DeleteItem >>
+
+
+__inline__ static LRESULT
+COMBOEX_GetComboControl (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
+{
+    COMBOEX_INFO *infoPtr = COMBOEX_GetInfoPtr(wndPtr);
+
+    TRACE (comboex, "\n");
+
+    return (LRESULT)infoPtr->hwndCombo;
+}
+
+
+__inline__ static LRESULT
+COMBOEX_GetEditControl (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
+{
+    COMBOEX_INFO *infoPtr = COMBOEX_GetInfoPtr(wndPtr);
+
+    if ((wndPtr->dwStyle & CBS_DROPDOWNLIST) != CBS_DROPDOWN)
+	return 0;
+
+    FIXME (comboex, "-- 0x%x\n", GetDlgItem32 (infoPtr->hwndCombo, ID_CB_EDIT));
+
+    return (LRESULT)GetDlgItem32 (infoPtr->hwndCombo, ID_CB_EDIT);
+}
+
+
+__inline__ static LRESULT
+COMBOEX_GetExtendedStyle (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
+{
+    COMBOEX_INFO *infoPtr = COMBOEX_GetInfoPtr(wndPtr);
+
+    return (LRESULT)infoPtr->dwExtStyle;
+}
+
+
+__inline__ static LRESULT
+COMBOEX_GetImageList (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
+{
+    COMBOEX_INFO *infoPtr = COMBOEX_GetInfoPtr(wndPtr);
+
+    TRACE (comboex, "(0x%08x 0x%08lx)\n", wParam, lParam);
+
+    return (LRESULT)infoPtr->himl;
+}
+
+
+
+
+static LRESULT
+COMBOEX_InsertItem32A (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
+{
+    COMBOEX_INFO *infoPtr = COMBOEX_GetInfoPtr(wndPtr);
+
+    FIXME (comboex, "(0x%08x 0x%08lx)\n", wParam, lParam);
+
+    return -1;
+}
+
+
+
+static LRESULT
+COMBOEX_SetExtendedStyle (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
+{
+    COMBOEX_INFO *infoPtr = COMBOEX_GetInfoPtr(wndPtr);
+    DWORD dwTemp;
+
+    TRACE (comboex, "(0x%08x 0x%08lx)\n", wParam, lParam);
+
+    dwTemp = infoPtr->dwExtStyle;
+
+    if ((DWORD)wParam) {
+	infoPtr->dwExtStyle = (infoPtr->dwExtStyle & ~(DWORD)wParam) | (DWORD)lParam;
+    }
+    else
+	infoPtr->dwExtStyle = (DWORD)lParam;
+
+    /* FIXME: repaint?? */
+
+    return (LRESULT)dwTemp;
+}
+
+
+__inline__ static LRESULT
+COMBOEX_SetImageList (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
+{
+    COMBOEX_INFO *infoPtr = COMBOEX_GetInfoPtr(wndPtr);
+    HIMAGELIST himlTemp;
+
+    TRACE (comboex, "(0x%08x 0x%08lx)\n", wParam, lParam);
+
+    himlTemp = infoPtr->himl;
+    infoPtr->himl = (HIMAGELIST)lParam;
+
+    return (LRESULT)himlTemp;
+}
+
+
+
+
+static LRESULT
+COMBOEX_Create (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
+{
+    COMBOEX_INFO *infoPtr;
+    DWORD dwComboStyle;
+
+    /* allocate memory for info structure */
+    infoPtr = (COMBOEX_INFO *)COMCTL32_Alloc (sizeof(COMBOEX_INFO));
+    wndPtr->wExtra[0] = (DWORD)infoPtr;
+
+    if (infoPtr == NULL) {
+	ERR (listview, "could not allocate info memory!\n");
+	return 0;
+    }
+
+    if ((COMBOEX_INFO*)wndPtr->wExtra[0] != infoPtr) {
+	ERR (listview, "pointer assignment error!\n");
+	return 0;
+    }
+
+
+    /* initialize info structure */
+
+
+    /* create combo box */
+    dwComboStyle = 
+	wndPtr->dwStyle & (CBS_SIMPLE|CBS_DROPDOWN|CBS_DROPDOWNLIST|WS_CHILD);
+
+    infoPtr->hwndCombo =
+	CreateWindow32A ("ComboBox", "",
+			 WS_CHILD | WS_VISIBLE | CBS_OWNERDRAWFIXED | dwComboStyle,
+			 0, 0, 0, 0, wndPtr->hwndSelf, (HMENU32)1,
+			 wndPtr->hInstance, NULL);
+
+
+    return 0;
+}
+
+
+static LRESULT
+COMBOEX_Destroy (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
+{
+    COMBOEX_INFO *infoPtr = COMBOEX_GetInfoPtr(wndPtr);
+
+
+    if (infoPtr->hwndCombo)
+	DestroyWindow32 (infoPtr->hwndCombo);
+
+
+
+
+    /* free comboex info data */
+    COMCTL32_Free (infoPtr);
+
+    return 0;
+}
+
+
+static LRESULT
+COMBOEX_Size (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
+{
+    COMBOEX_INFO *infoPtr = COMBOEX_GetInfoPtr(wndPtr);
+    RECT32 rect;
+
+    GetClientRect32 (wndPtr->hwndSelf, &rect);
+
+    MoveWindow32 (infoPtr->hwndCombo, 0, 0, rect.right -rect.left,
+		  rect.bottom - rect.top, TRUE);
+
+    return 0;
+}
+
+
+LRESULT WINAPI
+COMBOEX_WindowProc (HWND32 hwnd, UINT32 uMsg, WPARAM32 wParam, LPARAM lParam)
+{
+    WND *wndPtr = WIN_FindWndPtr(hwnd);
+
+    switch (uMsg)
+    {
+//	case CBEM_DELETEITEM:
+
+	case CBEM_GETCOMBOCONTROL:
+	    return COMBOEX_GetComboControl (wndPtr, wParam, lParam);
+
+	case CBEM_GETEDITCONTROL:
+	    return COMBOEX_GetEditControl (wndPtr, wParam, lParam);
+
+	case CBEM_GETEXTENDEDSTYLE:
+	    return COMBOEX_GetExtendedStyle (wndPtr, wParam, lParam);
+
+	case CBEM_GETIMAGELIST:
+	    return COMBOEX_GetImageList (wndPtr, wParam, lParam);
+
+//	case CBEM_GETITEM32A:
+//	case CBEM_GETITEM32W:
+//	case CBEM_GETUNICODEFORMAT:
+//	case CBEM_HASEDITCHANGED:
+
+	case CBEM_INSERTITEM32A:
+	    return COMBOEX_InsertItem32A (wndPtr, wParam, lParam);
+
+//	case CBEM_INSERTITEM32W:
+
+	case CBEM_SETEXTENDEDSTYLE:
+	    return COMBOEX_SetExtendedStyle (wndPtr, wParam, lParam);
+
+	case CBEM_SETIMAGELIST:
+	    return COMBOEX_SetImageList (wndPtr, wParam, lParam);
+
+//	case CBEM_SETITEM32A:
+//	case CBEM_SETITEM32W:
+//	case CBEM_SETUNICODEFORMAT:
+
+
+	case WM_CREATE:
+	    return COMBOEX_Create (wndPtr, wParam, lParam);
+
+	case WM_DESTROY:
+	    return COMBOEX_Destroy (wndPtr, wParam, lParam);
+
+	case WM_SIZE:
+	    return COMBOEX_Size (wndPtr, wParam, lParam);
+
+	default:
+	    if (uMsg >= WM_USER)
+		ERR (comboex, "unknown msg %04x wp=%08x lp=%08lx\n",
+		     uMsg, wParam, lParam);
+	    return DefWindowProc32A (hwnd, uMsg, wParam, lParam);
+    }
+    return 0;
+}
+
+
+void
+COMBOEX_Register (void)
+{
+    WNDCLASS32A wndClass;
+
+    if (GlobalFindAtom32A (WC_COMBOBOXEX32A)) return;
+
+    ZeroMemory (&wndClass, sizeof(WNDCLASS32A));
+    wndClass.style         = CS_GLOBALCLASS;
+    wndClass.lpfnWndProc   = (WNDPROC32)COMBOEX_WindowProc;
+    wndClass.cbClsExtra    = 0;
+    wndClass.cbWndExtra    = sizeof(COMBOEX_INFO *);
+    wndClass.hCursor       = LoadCursor32A (0, IDC_ARROW32A);
+    wndClass.hbrBackground = (HBRUSH32)(COLOR_WINDOW + 1);
+    wndClass.lpszClassName = WC_COMBOBOXEX32A;
+ 
+    RegisterClass32A (&wndClass);
+}
+
diff --git a/dlls/comctl32/comctl32undoc.c b/dlls/comctl32/comctl32undoc.c
new file mode 100644
index 0000000..e45f77f
--- /dev/null
+++ b/dlls/comctl32/comctl32undoc.c
@@ -0,0 +1,1269 @@
+/*
+ * Undocumented functions from COMCTL32.DLL
+ *
+ * Copyright 1998 Eric Kohl <ekohl@abo.rhein-zeitung.de>
+ *           1998 Juergen Schmied <j.schmied@metronet.de>
+ * NOTES
+ *     All of these functions are UNDOCUMENTED!! And I mean UNDOCUMENTED!!!!
+ *     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).
+ *
+ * TODO
+ *     - Write documentation.
+ */
+
+#include <string.h>
+#include <stdlib.h>
+#include <ctype.h>
+#include "windows.h"
+#include "commctrl.h"
+#include "heap.h"
+#include "debug.h"
+
+
+CRITICAL_SECTION cs_comctl_alloc;
+HANDLE32 hComctl32Heap = 0;
+
+
+/**************************************************************************
+ * Alloc [COMCTL32.71]
+ *
+ * Allocates memory block from the dll's local heap
+ *
+ * PARAMS
+ *     dwSize [I] size of the allocated memory block
+ *
+ * RETURNS
+ *     Success: pointer to allocated memory block
+ *     Failure: NULL
+ */
+
+LPVOID WINAPI
+COMCTL32_Alloc (DWORD dwSize)
+{
+    LPVOID lpPtr;
+
+    TRACE (commctrl, "(0x%lx)\n", dwSize);
+
+    if (hComctl32Heap == 0) {
+	EnterCriticalSection ((void*)&cs_comctl_alloc);
+	hComctl32Heap = HeapCreate (0, 1, 0x4000000);
+	LeaveCriticalSection ((void*)&cs_comctl_alloc);
+	TRACE (commctrl, "Heap created: 0x%x\n", hComctl32Heap);
+	if (!hComctl32Heap)
+	    return NULL;        
+    }
+
+    lpPtr = HeapAlloc (hComctl32Heap, HEAP_ZERO_MEMORY, dwSize);
+    TRACE (commctrl, "-- ret=%p\n", lpPtr);
+    return lpPtr;
+}
+
+
+/**************************************************************************
+ * ReAlloc [COMCTL32.72]
+ *
+ * Changes the size of an allocated memory block or allocates a memory
+ * block using the dll's local heap.
+ *
+ * PARAMS
+ *     lpSrc  [I] pointer to memory block which will be resized
+ *     dwSize [I] new size of the memory block.
+ *
+ * RETURNS
+ *     Success: pointer to the resized memory block
+ *     Failure: NULL
+ *
+ * NOTES
+ *     If lpSrc is a NULL-pointer, then COMCTL32_ReAlloc allocates a memory
+ *     block like COMCTL32_Alloc.
+ */
+
+LPVOID WINAPI
+COMCTL32_ReAlloc (LPVOID lpSrc, DWORD dwSize)
+{
+    LPVOID lpDest;
+
+    TRACE (commctrl, "(%p 0x%08lx)\n", lpSrc, dwSize);
+
+    if (hComctl32Heap == 0) {
+	EnterCriticalSection ((void*)&cs_comctl_alloc);
+	hComctl32Heap = HeapCreate (0, 1, 0x4000000);
+	LeaveCriticalSection ((void*)&cs_comctl_alloc);
+	TRACE (commctrl, "Heap created: 0x%x\n", hComctl32Heap);
+	if (!hComctl32Heap)
+	    return NULL;        
+    }
+    
+    if (lpSrc)
+	lpDest = HeapReAlloc (hComctl32Heap, HEAP_ZERO_MEMORY, lpSrc, dwSize);
+    else
+	lpDest = HeapAlloc (hComctl32Heap, HEAP_ZERO_MEMORY, dwSize);
+
+    TRACE (commctrl, "-- ret=%p\n", lpDest);
+
+    return lpDest;
+}
+
+
+/**************************************************************************
+ * Free [COMCTL32.73]
+.*
+ * Frees an allocated memory block from the dll's local heap.
+ *
+ * PARAMS
+ *     lpMem [I] pointer to memory block which will be freed
+ *
+ * RETURNS
+ *     Success: TRUE
+ *     Failure: FALSE
+ */
+
+BOOL32 WINAPI
+COMCTL32_Free (LPVOID lpMem)
+{
+    TRACE (commctrl, "(%p)\n", lpMem);
+
+    return HeapFree (hComctl32Heap, 0, lpMem);
+}
+
+
+/**************************************************************************
+ * GetSize [COMCTL32.74]
+ *
+ * Retrieves the size of the specified memory block from the dll's
+ * local heap.
+ *
+ * PARAMS
+ *     lpMem [I] pointer to an allocated memory block
+ *
+ * RETURNS
+ *     Success: size of the specified memory block
+ *     Failure: 0
+ */
+
+DWORD WINAPI
+COMCTL32_GetSize (LPVOID lpMem)
+{
+    TRACE (commctrl, "(%p)\n", lpMem);
+
+    return HeapSize (hComctl32Heap, 0, lpMem);
+}
+
+
+/**************************************************************************
+ * CreateMRUListA [COMCTL32.151]
+ *
+ * PARAMS
+ *     dwParam
+ *
+ * RETURNS
+ */
+
+DWORD WINAPI
+CreateMRUList32A (DWORD dwParam)
+{
+
+    FIXME (commctrl, "(%lx)\n", dwParam);
+
+    return 1;
+}
+
+
+
+
+/**************************************************************************
+ * Str_SetPtrA [COMCTL32.234]
+ *
+ * PARAMS
+ *     dwParam1 [I]
+ *     dwParam2 [I]
+ *
+ * RETURNS
+ */
+
+BOOL32 WINAPI
+COMCTL32_Str_SetPtrA (LPSTR lpStr, LPVOID *lpPtr)
+{
+    INT32 len;
+    LPSTR ptr;
+
+    TRACE (commctrl, "(%p %p)\n", lpStr, lpPtr);
+ 
+    if (lpStr) {
+	len = lstrlen32A (lpStr);
+	ptr = COMCTL32_ReAlloc (lpPtr, len + 1);
+	if (!(ptr))
+	    return FALSE;
+	lstrcpy32A (ptr, lpStr);
+	if (!lpPtr)
+	    return FALSE;
+	*lpPtr = ptr;
+	return TRUE;
+    }
+
+    if (*lpPtr) {
+	COMCTL32_Free (*lpPtr);
+	return TRUE;
+    }
+
+    return FALSE;
+}
+
+
+/**************************************************************************
+ * The DSA-API is a set of functions to create and manipulate arrays of
+ * fix sized memory blocks. These arrays can store any kind of data
+ * (strings, icons...).
+ */
+
+/**************************************************************************
+ * DSA_Create [COMCTL32.320] Creates a dynamic storage array
+ *
+ * PARAMS
+ *     nSize [I] size of the array elements
+ *     nGrow [I] number of elements by which the array grows when it is filled
+ *
+ * RETURNS
+ *     Success: pointer to a array control structure. use this like a handle.
+ *     Failure: NULL
+ */
+
+HDSA WINAPI
+DSA_Create (INT32 nSize, INT32 nGrow)
+{
+    HDSA hdsa;
+
+    TRACE (commctrl, "(size=%d grow=%d)\n", nSize, nGrow);
+
+    hdsa = (HDSA)COMCTL32_Alloc (sizeof(DSA));
+    if (hdsa)
+    {
+	hdsa->nItemCount = 0;
+        hdsa->pData = NULL;
+	hdsa->nMaxCount = 0;
+	hdsa->nItemSize = nSize;
+	hdsa->nGrow = MIN(1, nGrow);
+    }
+
+    return hdsa;
+}
+
+
+/**************************************************************************
+ * DSA_Destroy [COMCTL32.321] Destroys a dynamic storage array
+ *
+ * PARAMS
+ *     hdsa [I] pointer to the array control structure
+ *
+ * RETURNS
+ *     Success: TRUE
+ *     Failure: FALSE
+ */
+
+BOOL32 WINAPI
+DSA_Destroy (const HDSA hdsa)
+{
+    TRACE (commctrl, "(%p)\n", hdsa);
+
+    if (!hdsa)
+	return FALSE;
+
+    if (hdsa->pData && (!COMCTL32_Free (hdsa->pData)))
+	return FALSE;
+
+    return COMCTL32_Free (hdsa);
+}
+
+
+/**************************************************************************
+ * DSA_GetItem [COMCTL32.322] 
+ *
+ * PARAMS
+ *     hdsa   [I] pointer to the array control structure
+ *     nIndex [I] number of the Item to get
+ *     pDest  [O] destination buffer. Has to be >= dwElementSize.
+ *
+ * RETURNS
+ *     Success: TRUE
+ *     Failure: FALSE
+ */
+
+BOOL32 WINAPI
+DSA_GetItem (const HDSA hdsa, INT32 nIndex, LPVOID pDest)
+{
+    LPVOID pSrc;
+
+    TRACE (commctrl, "(%p %d %p)\n", hdsa, nIndex, pDest);
+    
+    if (!hdsa)
+	return FALSE;
+    if ((nIndex < 0) || (nIndex >= hdsa->nItemCount))
+	return FALSE;
+
+    pSrc = hdsa->pData + (hdsa->nItemSize * nIndex);
+    memmove (pDest, pSrc, hdsa->nItemSize);
+
+    return TRUE;
+}
+
+
+/**************************************************************************
+ * DSA_GetItemPtr [COMCTL32.323] 
+ *
+ * Retrieves a pointer to the specified item.
+ *
+ * PARAMS
+ *     hdsa   [I] pointer to the array control structure
+ *     nIndex [I] index of the desired item
+ *
+ * RETURNS
+ *     Success: pointer to an item
+ *     Failure: NULL
+ */
+
+LPVOID WINAPI
+DSA_GetItemPtr (const HDSA hdsa, INT32 nIndex)
+{
+    LPVOID pSrc;
+
+    TRACE (commctrl, "(%p %d)\n", hdsa, nIndex);
+
+    if (!hdsa)
+	return NULL;
+    if ((nIndex < 0) || (nIndex >= hdsa->nItemCount))
+	return NULL;
+
+    pSrc = hdsa->pData + (hdsa->nItemSize * nIndex);
+    
+    TRACE (commctrl, "-- ret=%p\n", pSrc);
+
+    return  pSrc;
+}
+
+
+/**************************************************************************
+ * DSA_SetItem [COMCTL32.325] 
+ *
+ * Sets the contents of an item in the array.
+ *
+ * PARAMS
+ *     hdsa   [I] pointer to the array control structure
+ *     nIndex [I] index for the item
+ *     pSrc   [I] pointer to the new item data
+ *
+ * RETURNS
+ *     Success: TRUE
+ *     Failure: FALSE
+ */
+
+BOOL32 WINAPI
+DSA_SetItem (const HDSA hdsa, INT32 nIndex, LPVOID pSrc)
+{
+    INT32  nSize, nNewItems;
+    LPVOID pDest, lpTemp;
+    
+    TRACE (commctrl, "(%p %d %p)\n", hdsa, nIndex, pSrc);
+
+    if ((!hdsa) || nIndex < 0)
+	return FALSE;
+      
+    if (hdsa->nItemCount <= nIndex) {
+	/* within the old array */
+	if (hdsa->nMaxCount > nIndex) {
+	    /* within the allocated space, set a new boundary */
+	    hdsa->nItemCount = nIndex;
+	}
+	else {
+	    /* resize the block of memory */
+	    nNewItems =
+		hdsa->nGrow * ((INT32)((nIndex - 1) / hdsa->nGrow) + 1);
+	    nSize = hdsa->nItemSize * nNewItems;
+
+	    lpTemp = (LPVOID)COMCTL32_ReAlloc (hdsa->pData, nSize);
+	    if (!lpTemp)
+		return FALSE;
+
+	    hdsa->nMaxCount = nNewItems;
+	    hdsa->pData = lpTemp;
+	}    
+    }
+
+    /* put the new entry in */
+    pDest = hdsa->pData + (hdsa->nItemSize * nIndex);
+    TRACE (commctrl, "-- move dest=%p src=%p size=%d\n",
+	   pDest, pSrc, hdsa->nItemSize);
+    memmove (pDest, pSrc, hdsa->nItemSize);
+
+    return TRUE;
+}
+
+
+/**************************************************************************
+ * DSA_InsertItem [COMCTL32.325] 
+ *
+ * PARAMS
+ *     hdsa   [I] pointer to the array control structure
+ *     nIndex [I] index for the new item
+ *     pSrc   [I] pointer to the element
+ *
+ * RETURNS
+ *     Success: position of the new item
+ *     Failure: -1
+ */
+
+INT32 WINAPI
+DSA_InsertItem (const HDSA hdsa, INT32 nIndex, LPVOID pSrc)
+{
+    INT32   nNewItems, nSize, i;
+    LPVOID  lpTemp, lpDest;
+    LPDWORD p;
+    
+    TRACE(commctrl, "(%p %d %p)\n", hdsa, nIndex, pSrc);
+
+    if ((!hdsa) || nIndex < 0)
+	return -1;
+
+    for (i = 0; i < hdsa->nItemSize; i += 4) {
+	p = *(DWORD**)(pSrc + i);
+	if (IsBadStringPtr32A ((char*)p, 256))
+	    TRACE (commctrl, "-- %d=%p\n", i, (DWORD*)p);
+	else
+	    TRACE (commctrl, "-- %d=%p [%s]\n", i, p, debugstr_a((char*)p));
+    }
+   
+    /* when nIndex > nItemCount then append */
+    if (nIndex >= hdsa->nItemCount)
+ 	nIndex = hdsa->nItemCount;
+
+    /* do we need to resize ? */
+    if (hdsa->nItemCount >= hdsa->nMaxCount) {
+	nNewItems = hdsa->nMaxCount + hdsa->nGrow;
+	nSize = hdsa->nItemSize * nNewItems;
+
+	lpTemp = (LPVOID)COMCTL32_ReAlloc (hdsa->pData, nSize);
+	if (!lpTemp)
+	    return -1;
+
+	hdsa->nMaxCount = nNewItems;
+	hdsa->pData = lpTemp;         
+    }
+
+    /* do we need to move elements ? */
+    if (nIndex < hdsa->nItemCount) {
+	lpTemp = hdsa->pData + (hdsa->nItemSize * nIndex);
+	lpDest = lpTemp + hdsa->nItemSize;
+	nSize = (hdsa->nItemCount - nIndex) * hdsa->nItemSize;
+	TRACE (commctrl, "-- move dest=%p src=%p size=%d\n",
+	       lpDest, lpTemp, nSize);
+	memmove (lpDest, lpTemp, nSize);
+    }
+
+    /* ok, we can put the new Item in */
+    hdsa->nItemCount++;
+    lpDest = hdsa->pData + (hdsa->nItemSize * nIndex);
+    TRACE (commctrl, "-- move dest=%p src=%p size=%d\n",
+	   lpDest, pSrc, hdsa->nItemSize);
+    memmove (lpDest, pSrc, hdsa->nItemSize);
+
+    return hdsa->nItemCount;
+}
+
+
+/**************************************************************************
+ * DSA_DeleteItem [COMCTL32.326] 
+ *
+ * PARAMS
+ *     hdsa   [I] pointer to the array control structure
+ *     nIndex [I] index for the element to delete
+ *
+ * RETURNS
+ *     Success: number of the deleted element
+ *     Failure: -1
+ */
+
+INT32 WINAPI
+DSA_DeleteItem (const HDSA hdsa, INT32 nIndex)
+{
+    LPVOID lpDest,lpSrc;
+    INT32  nSize;
+    
+    TRACE (commctrl, "(%p %d)\n", hdsa, nIndex);
+
+    if (!hdsa)
+	return -1;
+    if (nIndex < 0 || nIndex >= hdsa->nItemCount)
+	return -1;
+
+    /* do we need to move ? */
+    if (nIndex < hdsa->nItemCount - 1) {
+	lpDest = hdsa->pData + (hdsa->nItemSize * nIndex);
+	lpSrc = lpDest + hdsa->nItemSize;
+	nSize = hdsa->nItemSize * (hdsa->nItemCount - nIndex - 1);
+	TRACE (commctrl, "-- move dest=%p src=%p size=%d\n",
+	       lpDest, lpSrc, nSize);
+	memmove (lpDest, lpSrc, nSize);
+    }
+    
+    hdsa->nItemCount--;
+    
+    /* free memory ? */
+    if ((hdsa->nMaxCount - hdsa->nItemCount) >= hdsa->nGrow) {
+	nSize = hdsa->nItemSize * hdsa->nItemCount;
+
+	lpDest = (LPVOID)COMCTL32_ReAlloc (hdsa->pData, nSize);
+	if (!lpDest)
+	    return -1;
+
+	hdsa->nMaxCount = hdsa->nItemCount;
+	hdsa->pData = lpDest;
+    }
+
+    return nIndex;
+}
+
+
+/**************************************************************************
+ * DSA_DeleteAllItems [COMCTL32.326]
+ *
+ * Removes all items and reinitializes the array.
+ *
+ * PARAMS
+ *     hdsa [I] pointer to the array control structure
+ *
+ * RETURNS
+ *     Success: TRUE
+ *     Failure: FALSE
+ */
+
+BOOL32 WINAPI
+DSA_DeleteAllItems (const HDSA hdsa)
+{
+    TRACE (commctrl, "(%p)\n", hdsa);
+
+    if (!hdsa) 
+	return FALSE;
+    if (hdsa->pData && (!COMCTL32_Free (hdsa->pData)))
+	return FALSE;
+
+    hdsa->nItemCount = 0;
+    hdsa->pData = NULL;
+    hdsa->nMaxCount = 0;
+
+    return TRUE;
+}
+
+
+/**************************************************************************
+ * The DPA-API is a set of functions to create and manipulate arrays of
+ * pointers.
+ */
+
+/**************************************************************************
+ * DPA_Create [COMCTL32.328] Creates a dynamic pointer array
+ *
+ * PARAMS
+ *     nGrow [I] number of items by which the array grows when it is filled
+ *
+ * RETURNS
+ *     Success: handle (pointer) to the pointer array.
+ *     Failure: NULL
+ */
+
+HDPA WINAPI
+DPA_Create (INT32 nGrow)
+{
+    HDPA hdpa;
+
+    TRACE (commctrl, "(%d)\n", nGrow);
+
+    hdpa = (HDPA)COMCTL32_Alloc (sizeof(DPA));
+    if (hdpa) {
+	hdpa->nGrow = MIN(8, nGrow);
+	hdpa->hHeap = hComctl32Heap;
+	hdpa->nMaxCount = hdpa->nGrow * 2;
+	hdpa->ptrs =
+	    (LPVOID*)COMCTL32_Alloc (hdpa->nMaxCount * sizeof(LPVOID));
+    }
+
+    TRACE (commctrl, "-- %p\n", hdpa);
+
+    return hdpa;
+}
+
+
+/**************************************************************************
+ * DPA_Destroy [COMCTL32.329] Destroys a dynamic pointer array
+ *
+ * PARAMS
+ *     hdpa [I] handle (pointer) to the pointer array
+ *
+ * RETURNS
+ *     Success: TRUE
+ *     Failure: FALSE
+ */
+
+BOOL32 WINAPI
+DPA_Destroy (const HDPA hdpa)
+{
+    TRACE (commctrl, "(%p)\n", hdpa);
+
+    if (!hdpa)
+	return FALSE;
+
+    if (hdpa->ptrs && (!HeapFree (hdpa->hHeap, 0, hdpa->ptrs)))
+	return FALSE;
+
+    return HeapFree (hdpa->hHeap, 0, hdpa);
+}
+
+
+/**************************************************************************
+ * DPA_Grow [COMCTL32.330]
+ *
+ * Sets the growth amount.
+ *
+ * PARAMS
+ *     hdpa  [I] handle (pointer) to the existing (source) pointer array
+ *     nGrow [I] number of items, the array grows, when it's too small
+ *
+ * RETURNS
+ *     Success: TRUE
+ *     Failure: FALSE
+ */
+
+BOOL32 WINAPI
+DPA_Grow (const HDPA hdpa, INT32 nGrow)
+{
+    FIXME (commctrl, "(%p %d) stub!\n", hdpa, nGrow);
+
+    if (!hdpa)
+	return FALSE;
+
+    hdpa->nGrow = MIN(8, nGrow);
+
+    return TRUE;
+}
+
+
+/**************************************************************************
+ * DPA_Clone [COMCTL32.331]
+ *
+ * Copies a pointer array to an other one or creates a copy
+ *
+ * PARAMS
+ *     hdpa    [I] handle (pointer) to the existing (source) pointer array
+ *     hdpaNew [O] handle (pointer) to the destination pointer array
+ *
+ * RETURNS
+ *     Success: pointer to the destination pointer array.
+ *     Failure: NULL
+ *
+ * NOTES
+ *     - If the 'hdpaNew' is a NULL-Pointer, a copy of the source pointer
+ *       array will be created and it's handle (pointer) is returned.
+ *     - If 'hdpa' is a NULL-Pointer, the original implementation crashes,
+ *       this implementation just returns NULL.
+ */
+
+HDPA WINAPI
+DPA_Clone (const HDPA hdpa, const HDPA hdpaNew)
+{
+    INT32 nNewItems, nSize;
+    HDPA hdpaTemp;
+
+    if (!hdpa)
+	return NULL;
+
+    FIXME (commctrl, "(%p %p) stub!\n", hdpa, hdpaNew);
+
+    if (!hdpaNew) {
+	/* create a new DPA */
+	hdpaTemp = (HDPA)HeapAlloc (hdpa->hHeap, HEAP_ZERO_MEMORY,
+				    sizeof(DPA));
+	hdpaTemp->hHeap = hdpa->hHeap;
+	hdpaTemp->nGrow = hdpa->nGrow;
+    }
+    else
+	hdpaTemp = hdpaNew;
+
+    if (hdpaTemp->ptrs) {
+	/* remove old pointer array */
+	HeapFree (hdpaTemp->hHeap, 0, hdpaTemp->ptrs);
+	hdpaTemp->ptrs = NULL;
+	hdpaTemp->nItemCount = 0;
+	hdpaTemp->nMaxCount = 0;
+    }
+
+    /* create a new pointer array */
+    nNewItems = hdpaTemp->nGrow *
+		((INT32)((hdpa->nItemCount - 1) / hdpaTemp->nGrow) + 1);
+    nSize = nNewItems * sizeof(LPVOID);
+    hdpaTemp->ptrs =
+	(LPVOID*)HeapAlloc (hdpaTemp->hHeap, HEAP_ZERO_MEMORY, nSize);
+    hdpaTemp->nMaxCount = nNewItems;
+
+    /* clone the pointer array */
+    hdpaTemp->nItemCount = hdpa->nItemCount;
+    memmove (hdpaTemp->ptrs, hdpa->ptrs,
+	     hdpaTemp->nItemCount * sizeof(LPVOID));
+
+    return hdpaTemp;
+}
+
+
+/**************************************************************************
+ * DPA_GetPtr [COMCTL32.332]
+ *
+ * Retrieves a pointer from a dynamic pointer array
+ *
+ * PARAMS
+ *     hdpa   [I] handle (pointer) to the pointer array
+ *     nIndex [I] array index of the desired pointer
+ *
+ * RETURNS
+ *     Success: pointer
+ *     Failure: NULL
+ */
+
+LPVOID WINAPI
+DPA_GetPtr (const HDPA hdpa, INT32 i)
+{
+    TRACE (commctrl, "(%p %d)\n", hdpa, i);
+
+    if (!hdpa)
+	return NULL;
+    if (!hdpa->ptrs)
+	return NULL;
+    if ((i < 0) || (i >= hdpa->nItemCount))
+	return NULL;
+
+    TRACE (commctrl, "-- %p\n", hdpa->ptrs[i]);
+
+    return hdpa->ptrs[i];
+}
+
+
+/**************************************************************************
+ * DPA_GetPtrIndex [COMCTL32.333]
+ *
+ * Retrieves the index of the specified pointer
+ *
+ * PARAMS
+ *     hdpa   [I] handle (pointer) to the pointer array
+ *     p      [I] pointer
+ *
+ * RETURNS
+ *     Success: index of the specified pointer
+ *     Failure: -1
+ */
+
+INT32 WINAPI
+DPA_GetPtrIndex (const HDPA hdpa, LPVOID p)
+{
+    INT32 i;
+
+    if (!hdpa->ptrs)
+	return -1;
+
+    for (i = 0; i < hdpa->nItemCount; i++) {
+	if (hdpa->ptrs[i] == p)
+	    return i;
+    }
+
+    return -1;
+}
+
+
+/**************************************************************************
+ * DPA_InsertPtr [COMCTL32.334]
+ *
+ * Inserts a pointer into a dynamic pointer array
+ *
+ * PARAMS
+ *     hdpa [I] handle (pointer) to the array
+ *     i    [I] array index
+ *     p    [I] pointer to insert
+ *
+ * RETURNS
+ *     Success: index of the inserted pointer
+ *     Failure: -1
+ */
+
+INT32 WINAPI
+DPA_InsertPtr (const HDPA hdpa, INT32 i, LPVOID p)
+{
+    INT32   nNewItems, nSize, nIndex = 0;
+    LPVOID  *lpTemp, *lpDest;
+
+    TRACE (commctrl, "(%p %d %p)\n", hdpa, i, p);
+
+    if ((!hdpa) || (i < 0))
+	return -1;
+
+    if (!hdpa->ptrs) {
+	hdpa->ptrs =
+	    (LPVOID*)HeapAlloc (hdpa->hHeap, HEAP_ZERO_MEMORY,
+				hdpa->nGrow * sizeof(LPVOID));
+	if (!hdpa->ptrs)
+	    return -1;
+	hdpa->nMaxCount = hdpa->nGrow;
+        nIndex = 0;
+    }
+    else {
+	if (hdpa->nItemCount > hdpa->nMaxCount) {
+	    TRACE (commctrl, "-- resizing\n");
+	    nNewItems = hdpa->nMaxCount + hdpa->nGrow;
+	    nSize = nNewItems * sizeof(LPVOID);
+
+	    lpTemp = (LPVOID*)HeapReAlloc (hdpa->hHeap, HEAP_ZERO_MEMORY,
+					   hdpa->ptrs, nSize);
+	    if (!lpTemp)
+		return -1;
+	    hdpa->nMaxCount = nNewItems;
+	    hdpa->ptrs = lpTemp;
+	}
+
+	if (i >= hdpa->nItemCount) {
+	    TRACE (commctrl, "-- appending at %d\n", nIndex);
+	    nIndex = hdpa->nItemCount;
+	}
+	else {
+	    TRACE (commctrl, "-- inserting at %d\n", i);
+	    lpTemp = hdpa->ptrs + (sizeof(LPVOID) * i);
+	    lpDest = lpTemp + sizeof(LPVOID);
+	    nSize  = (hdpa->nItemCount - i) * sizeof(LPVOID);
+	    TRACE (commctrl, "-- move dest=%p src=%p size=%x\n",
+		   lpDest, lpTemp, nSize);
+	    memmove (lpDest, lpTemp, nSize);
+	    nIndex = i;
+	}
+    }
+
+    /* insert item */
+    hdpa->nItemCount++;
+    hdpa->ptrs[nIndex] = p;
+
+    return nIndex;
+}
+
+
+/**************************************************************************
+ * DPA_SetPtr [COMCTL32.335]
+ *
+ * Sets a pointer in the pointer array
+ *
+ * PARAMS
+ *     hdpa [I] handle (pointer) to the pointer array
+ *     i    [I] index of the pointer that will be set
+ *     p    [I] pointer to be set
+ *
+ * RETURNS
+ *     Success: TRUE
+ *     Failure: FALSE
+ */
+
+BOOL32 WINAPI
+DPA_SetPtr (const HDPA hdpa, INT32 i, LPVOID p)
+{
+    LPVOID *lpTemp;
+    
+    TRACE (commctrl, "(%p %d %p)\n", hdpa, i, p);
+
+    if ((!hdpa) || i < 0)
+	return FALSE;
+      
+    if (hdpa->nItemCount <= i) {
+	/* within the old array */
+	if (hdpa->nMaxCount > i) {
+	    /* within the allocated space, set a new boundary */
+	    hdpa->nItemCount = i;
+	}
+	else {
+	    /* resize the block of memory */
+	    INT32 nNewItems =
+		hdpa->nGrow * ((INT32)((i - 1) / hdpa->nGrow) + 1);
+	    INT32 nSize = nNewItems * sizeof(LPVOID);
+
+	    lpTemp = (LPVOID*)HeapReAlloc (hdpa->hHeap, HEAP_ZERO_MEMORY,
+					   hdpa->ptrs, nSize);
+	    if (!lpTemp)
+		return FALSE;
+
+	    hdpa->nItemCount = nNewItems;
+	    hdpa->ptrs = lpTemp;        
+	}    
+    }
+
+    /* put the new entry in */
+    hdpa->ptrs[i] = p;
+
+    return TRUE;
+}
+
+
+/**************************************************************************
+ * DPA_DeletePtr [COMCTL32.336]
+ *
+ * Removes a pointer from the pointer array.
+ *
+ * PARAMS
+ *     hdpa [I] handle (pointer) to the pointer array
+ *     i    [I] index of the pointer that will be deleted
+ *
+ * RETURNS
+ *     Success: deleted pointer
+ *     Failure: NULL
+ */
+
+LPVOID WINAPI
+DPA_DeletePtr (const HDPA hdpa, INT32 i)
+{
+    LPVOID lpDest, lpSrc, lpTemp = NULL;
+    INT32  nSize;
+    
+    TRACE (commctrl, "(%p %d)\n", hdpa, i);
+
+    if ((!hdpa) || i < 0 || i >= hdpa->nItemCount)
+	return NULL;
+
+    lpTemp = hdpa->ptrs[i];
+
+    /* do we need to move ?*/
+    if (i < hdpa->nItemCount - 1) {
+	lpDest = hdpa->ptrs + (i * sizeof (LPVOID));
+	lpSrc = lpDest + sizeof(LPVOID);
+	nSize = (hdpa->nItemCount - i - 1) * sizeof(LPVOID);
+	TRACE (commctrl,"-- move dest=%p src=%p size=%x\n",
+	       lpDest, lpSrc, nSize);
+	memmove (lpDest, lpSrc, nSize);
+    }
+    
+    hdpa->nItemCount --;
+    
+    /* free memory ?*/
+    if ((hdpa->nMaxCount - hdpa->nItemCount) >= hdpa->nGrow) {
+	INT32 nNewItems = MIN(hdpa->nGrow * 2, hdpa->nItemCount);
+	nSize = nNewItems * sizeof(LPVOID);
+	lpDest = (LPVOID)HeapReAlloc (hdpa->hHeap, HEAP_ZERO_MEMORY,
+				      hdpa->ptrs, nSize);
+	if (!lpDest)
+	    return NULL;
+
+	hdpa->nMaxCount = nNewItems;
+	hdpa->ptrs = (LPVOID*)lpDest;         
+    }
+
+    return lpTemp;
+}
+
+
+/**************************************************************************
+ * DPA_DeleteAllPtrs [COMCTL32.337]
+ *
+ * Removes all pointers and reinitializes the array.
+ *
+ * PARAMS
+ *     hdpa [I] handle (pointer) to the pointer array
+ *
+ * RETURNS
+ *     Success: TRUE
+ *     Failure: FALSE
+ */
+
+BOOL32 WINAPI
+DPA_DeleteAllPtrs (const HDPA hdpa)
+{
+    TRACE (commctrl, "(%p)\n", hdpa);
+
+    if (!hdpa) 
+	return FALSE;
+
+    if (hdpa->ptrs && (!HeapFree (hdpa->hHeap, 0, hdpa->ptrs)))
+	return FALSE;
+
+    hdpa->nItemCount = 0;
+    hdpa->nMaxCount = hdpa->nGrow * 2;
+    hdpa->ptrs = (LPVOID*)HeapAlloc (hdpa->hHeap, HEAP_ZERO_MEMORY,
+				     hdpa->nMaxCount * sizeof(LPVOID));
+
+    return TRUE;
+}
+
+
+/**************************************************************************
+ * DPA_QuickSort [Internal]
+ *
+ * Modified version of quicksort (used by DPA_Sort).
+ *
+ * PARAMS
+ *     lpPtrs     [I] pointer to the pointer array
+ *     l          [I] index of the "left border" of the partition
+ *     r          [I] index of the "right border" of the partition
+ *     pfnCompare [I] pointer to the compare function
+ *     lParam     [I] user defined value (3rd parameter in compare function)
+ *
+ * RETURNS
+ *     NONE
+ *
+ * NOTES
+ *     Taken from R.Sedgewick "Algorithms in C"!
+ *     If something goes wrong, blame HIM not ME! (Eric Kohl)
+ */
+
+static VOID
+DPA_QuickSort (LPVOID *lpPtrs , INT32 l, INT32 r,
+	       PFNDPACOMPARE pfnCompare, LPARAM lParam)
+{
+    LPVOID t, v;
+    INT32  i, j;
+
+    if (l > r) {
+	v = lpPtrs[r];
+	i = l - 1;
+	j = r;
+	for (;;) {
+	    while ((pfnCompare)(lpPtrs[++i], v, lParam) < 0);
+	    while ((pfnCompare)(lpPtrs[--j], v, lParam) > 0);
+	    if (i >= j)
+		break;
+	    t = lpPtrs[i];
+	    lpPtrs[i] = lpPtrs[j];
+	    lpPtrs[j] = t;
+	}
+	t = lpPtrs[i];
+	lpPtrs[i] = lpPtrs[r];
+	lpPtrs[r] = t;
+	DPA_QuickSort (lpPtrs, l, i - 1, pfnCompare, lParam);
+	DPA_QuickSort (lpPtrs, i + 1, r, pfnCompare, lParam);
+    }
+}
+
+
+/**************************************************************************
+ * DPA_Sort [COMCTL32.338]
+ *
+ * Sorts a pointer array using a user defined compare function
+ *
+ * PARAMS
+ *     hdpa       [I] handle (pointer) to the pointer array
+ *     pfnCompare [I] pointer to the compare function
+ *     lParam     [I] user defined value (3rd parameter of compare function)
+ *
+ * RETURNS
+ *     Success: TRUE
+ *     Failure: FALSE
+ */
+
+BOOL32 WINAPI
+DPA_Sort (const HDPA hdpa, PFNDPACOMPARE pfnCompare, LPARAM lParam)
+{
+    if (!hdpa || !pfnCompare)
+	return FALSE;
+
+    TRACE (commctrl, "(%p %p 0x%lx)\n", hdpa, pfnCompare, lParam);
+
+    DPA_QuickSort (hdpa->ptrs, 0, hdpa->nItemCount - 1, pfnCompare, lParam);
+
+    return TRUE;
+}
+
+
+/**************************************************************************
+ * DPA_Search [COMCTL32.339]
+ *
+ * Searches a pointer array for a specified pointer
+ *
+ * PARAMS
+ *     hdpa       [I] handle (pointer) to the pointer array
+ *     pFind      [I] pointer to search for
+ *     nStart     [I] start index
+ *     pfnCompare [I] pointer to the compare function
+ *     lParam     [I] user defined value (3rd parameter of compare function)
+ *     uOptions   [I] search options
+ *
+ * RETURNS
+ *     Success: index of the pointer in the array.
+ *     Failure: -1
+ *
+ * NOTES
+ *     Binary search taken from R.Sedgewick "Algorithms in C"!
+ *     If something goes wrong, blame HIM not ME! (Eric Kohl)
+ */
+
+INT32 WINAPI
+DPA_Search (const HDPA hdpa, LPVOID pFind, INT32 nStart,
+	    PFNDPACOMPARE pfnCompare, LPARAM lParam, UINT32 uOptions)
+{
+    if (!hdpa || !pfnCompare || !pFind)
+	return -1;
+
+    TRACE (commctrl, "(%p %p %d %p 0x%08lx 0x%08x)\n",
+	   hdpa, pFind, nStart, pfnCompare, lParam, uOptions);
+
+    if (uOptions & DPAS_SORTED) {
+	/* array is sorted --> use binary search */
+	INT32 l, r, x, n;
+	LPVOID *lpPtr;
+
+	l = (nStart == -1) ? 0 : nStart;
+	r = hdpa->nItemCount - 1;
+	lpPtr = hdpa->ptrs;
+	while (r >= l) {
+	    x = (l + r) / 2;
+	    n = (pfnCompare)(pFind, lpPtr[x], lParam);
+	    if (n < 0)
+		r = x - 1;
+	    else
+		l = x + 1;
+	    if (n == 0) {
+		TRACE (commctrl, "-- ret=%d\n", n);
+		return n;
+	    }
+	}
+
+	if (uOptions & DPAS_INSERTBEFORE) {
+	    TRACE (commctrl, "-- ret=%d\n", r);
+	    return r;
+	}
+
+	if (uOptions & DPAS_INSERTAFTER) {
+	    TRACE (commctrl, "-- ret=%d\n", r);
+	    return l;
+	}
+    }
+    else {
+	/* array is not sorted --> use linear search */
+	LPVOID *lpPtr;
+	INT32  nIndex;
+
+	FIXME (commctrl, "linear search\n");
+	
+	nIndex = (nStart == -1)? 0 : nStart;
+	lpPtr = hdpa->ptrs;
+	for (; nIndex < hdpa->nItemCount; nIndex++) {
+	    if ((pfnCompare)(pFind, lpPtr[nIndex], lParam) == 0) {
+		TRACE (commctrl, "-- ret=%d\n", nIndex);
+		return nIndex;
+	    }
+	}
+    }
+
+    TRACE (commctrl, "-- not found: ret=-1\n");
+    return -1;
+}
+
+
+/**************************************************************************
+ * DPA_CreateEx [COMCTL32.340]
+ *
+ * Creates a dynamic pointer array using the specified size and heap.
+ *
+ * PARAMS
+ *     nGrow [I] number of items by which the array grows when it is filled
+ *     hHeap [I] handle to the heap where the array is stored
+ *
+ * RETURNS
+ *     Success: handle (pointer) to the pointer array.
+ *     Failure: NULL
+ */
+
+HDPA WINAPI
+DPA_CreateEx (INT32 nGrow, HANDLE32 hHeap)
+{
+    HDPA hdpa;
+
+    TRACE (commctrl, "(%d 0x%x)\n", nGrow, hHeap);
+
+    if (hHeap)
+	hdpa = (HDPA)HeapAlloc (hHeap, HEAP_ZERO_MEMORY, sizeof(DPA));
+    else
+	hdpa = (HDPA)COMCTL32_Alloc (sizeof(DPA));
+
+    if (hdpa) {
+	hdpa->nGrow = MIN(8, nGrow);
+	hdpa->hHeap = hHeap ? hHeap : hComctl32Heap;
+	hdpa->nMaxCount = hdpa->nGrow * 2;
+	hdpa->ptrs =
+	    (LPVOID*)HeapAlloc (hHeap, HEAP_ZERO_MEMORY,
+				hdpa->nMaxCount * sizeof(LPVOID));
+    }
+
+    TRACE (commctrl, "-- %p\n", hdpa);
+
+    return hdpa;
+}
+
+
+/**************************************************************************
+ * 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 (LPCSTR lpString, CHAR cChar)
+{
+    return strchr (lpString, cChar);
+}
+
+
+/**************************************************************************
+ * StrStrIA [COMCTL32.355]
+ */
+
+LPSTR WINAPI
+COMCTL32_StrStrIA (LPCSTR lpStr1, LPCSTR lpStr2)
+{
+    INT32 len1, len2, i;
+    CHAR  first;
+
+    if (*lpStr2 == 0)
+	return ((LPSTR)lpStr1);
+    len1 = 0;
+    while (lpStr1[len1] != 0) ++len1;
+    len2 = 0;
+    while (lpStr2[len2] != 0) ++len2;
+    if (len2 == 0)
+	return ((LPSTR)(lpStr1 + len1));
+    first = tolower (*lpStr2);
+    while (len1 >= len2) {
+	if (tolower(*lpStr1) == first) {
+	    for (i = 1; i < len2; ++i)
+		if (tolower (lpStr1[i]) != tolower(lpStr2[i]))
+		    break;
+	    if (i >= len2)
+		return ((LPSTR)lpStr1);
+        }
+	++lpStr1; --len1;
+    }
+    return (NULL);
+}
+
+
+/**************************************************************************
+ * StrToIntA [COMCTL32.357] Converts a string to a signed integer.
+ */
+
+INT32 WINAPI
+COMCTL32_StrToIntA (LPSTR lpString)
+{
+    return atoi(lpString);
+}
+
diff --git a/controls/commctrl.c b/dlls/comctl32/commctrl.c
similarity index 84%
rename from controls/commctrl.c
rename to dlls/comctl32/commctrl.c
index 629fc50..0c6f00e 100644
--- a/controls/commctrl.c
+++ b/dlls/comctl32/commctrl.c
@@ -9,18 +9,23 @@
 #include "win.h"
 #include "heap.h"
 #include "commctrl.h"
+#include "animate.h"
+#include "comboex.h"
 #include "header.h"
+#include "hotkey.h"
 #include "listview.h"
 #include "pager.h"
 #include "progress.h"
 #include "rebar.h"
 #include "status.h"
+#include "tab.h"
 #include "toolbar.h"
 #include "tooltips.h"
 #include "trackbar.h"
 #include "treeview.h"
 #include "updown.h"
 #include "debug.h"
+#include "winerror.h"
 
 
 /***********************************************************************
@@ -40,13 +45,13 @@
 
     switch (fdwReason) {
 	case DLL_PROCESS_ATTACH:
-	    TRACE (commctrl, "No animation class implemented!\n");
+	    ANIMATE_Register ();
 	    HEADER_Register ();
-	    TRACE (commctrl, "No hotkey class implemented!\n");
+	    HOTKEY_Register ();
 	    LISTVIEW_Register ();
 	    PROGRESS_Register ();
 	    STATUS_Register ();
-	    TRACE (commctrl, "No tab class implemented!\n");
+	    TAB_Register ();
 	    TOOLBAR_Register ();
 	    TOOLTIPS_Register ();
 	    TRACKBAR_Register ();
@@ -60,6 +65,176 @@
 
 
 /***********************************************************************
+ * MenuHelp [COMCTL32.2]
+ *
+ * PARAMS
+ *     uMsg
+ *     wParam
+ *     lParam
+ *     hMainMenu
+ *     hInst
+ *     hwndStatus
+ *     lpwIDs
+ *
+ * RETURNS
+ *     None
+ *
+ * NOTES
+ *     Some features are still missing because of incomplete WM_MENUSELECT
+ *     messages (16->32 bit conversion).
+ */
+
+VOID WINAPI
+MenuHelp (UINT32 uMsg, WPARAM32 wParam, LPARAM lParam, HMENU32 hMainMenu,
+	  HINSTANCE32 hInst, HWND32 hwndStatus, LPUINT32 lpwIDs)
+{
+    char szStatusText[128];
+
+    if (!IsWindow32 (hwndStatus)) return;
+
+    switch (uMsg) {
+	case WM_MENUSELECT:
+            TRACE (commctrl, "WM_MENUSELECT wParam=0x%X lParam=0x%lX\n",
+                   wParam, lParam);
+
+            if ((HIWORD(wParam) == 0xFFFF) && (lParam == 0)) {
+                /* menu was closed */
+                SendMessage32A (hwndStatus, SB_SIMPLE, FALSE, 0);
+            }
+            else {
+                if (HIWORD(wParam) & MF_POPUP) {
+		    FIXME (commctrl, "popup 0x%08x 0x%08lx\n", wParam, lParam);
+
+                    szStatusText[0] = 0;
+                }
+                else {
+                    TRACE (commctrl, "menu item selected!\n");
+                    if (!LoadString32A (hInst, LOWORD(wParam), szStatusText, 128))
+                        szStatusText[0] = 0;
+                }
+                SendMessage32A (hwndStatus, SB_SETTEXT32A, 255 | SBT_NOBORDERS,
+                                (LPARAM)szStatusText);
+                SendMessage32A (hwndStatus, SB_SIMPLE, TRUE, 0);
+            }
+            break;
+
+        default:
+            WARN (commctrl, "Invalid Message!\n");
+            break;
+    }
+}
+
+
+/***********************************************************************
+ * ShowHideMenuCtl [COMCTL32.3] 
+ *
+ * Shows or hides controls and updates the corresponding menu item.
+ *
+ * PARAMS
+ *     hwnd   [I] handle to the client window.
+ *     uFlags [I] menu command id.
+ *     lpInfo [I] pointer to an array of integers. (See NOTES.)
+ *
+ * RETURNS
+ *     Success: TRUE
+ *     Failure: FALSE
+ *
+ * NOTES
+ *     The official documentation is incomplete! This has been fixed.
+ *
+ *     lpInfo
+ *     The array of integers contains pairs of values. BOTH values of
+ *     the first pair must be the handles to application's main menu.
+ *     Each subsequent pair consists of a menu id and control id.
+ */
+
+BOOL32 WINAPI
+ShowHideMenuCtl (HWND32 hwnd, UINT32 uFlags, LPINT32 lpInfo)
+{
+    LPINT32 lpMenuId;
+
+    TRACE (commctrl, "%x, %x, %p\n", hwnd, uFlags, lpInfo);
+
+    if (lpInfo == NULL)
+	return FALSE;
+
+    if (!(lpInfo[0]) || !(lpInfo[1]))
+	return FALSE;
+
+    /* search for control */
+    lpMenuId = &lpInfo[2];
+    while (*lpMenuId != uFlags)
+	lpMenuId += 2;
+
+    if (GetMenuState32 (lpInfo[1], uFlags, MF_BYCOMMAND) & MFS_CHECKED) {
+	/* uncheck menu item */
+	CheckMenuItem32 (lpInfo[0], *lpMenuId, MF_BYCOMMAND | MF_UNCHECKED);
+
+	/* hide control */
+	lpMenuId++;
+	SetWindowPos32 (GetDlgItem32 (hwnd, *lpMenuId), 0, 0, 0, 0, 0,
+			SWP_HIDEWINDOW);
+    }
+    else {
+	/* check menu item */
+	CheckMenuItem32 (lpInfo[0], *lpMenuId, MF_BYCOMMAND | MF_CHECKED);
+
+	/* show control */
+	lpMenuId++;
+	SetWindowPos32 (GetDlgItem32 (hwnd, *lpMenuId), 0, 0, 0, 0, 0,
+			SWP_SHOWWINDOW);
+    }
+
+    return TRUE;
+}
+
+
+/***********************************************************************
+ * GetEffectiveClientRect [COMCTL32.4]
+ *
+ * PARAMS
+ *     hwnd   [I] handle to the client window.
+ *     lpRect [O] pointer to the rectangle of the client window
+ *     lpInfo [I] pointer to an array of integers
+ *
+ * RETURNS
+ *     None.
+ *
+ * NOTES
+ *
+ */
+
+VOID WINAPI
+GetEffectiveClientRect (HWND32 hwnd, LPRECT32 lpRect, LPINT32 lpInfo)
+{
+    RECT32 rcCtrl;
+    INT32  *lpRun;
+    HWND32 hwndCtrl;
+
+    TRACE (commctrl, "(0x%08lx 0x%08lx 0x%08lx)\n",
+	   (DWORD)hwnd, (DWORD)lpRect, (DWORD)lpInfo);
+
+    GetClientRect32 (hwnd, lpRect);
+    lpRun = lpInfo;
+
+    do {
+	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 ((HWND32)0, hwnd, (LPPOINT32)&rcCtrl, 2);
+	    SubtractRect32 (lpRect, lpRect, &rcCtrl);
+	}
+	lpRun++;
+    } while (*lpRun);
+}
+
+
+/***********************************************************************
  * DrawStatusText32A [COMCTL32.5][COMCTL32.27]
  *
  * Draws text with borders, like in a status bar.
@@ -111,17 +286,17 @@
 VOID WINAPI
 DrawStatusText32W (HDC32 hdc, LPRECT32 lprc, LPCWSTR text, UINT32 style)
 {
-  LPSTR p = HEAP_strdupWtoA( GetProcessHeap(), 0, text );
-  DrawStatusText32A(hdc, lprc, p, style);
-  HeapFree( GetProcessHeap(), 0, p );         
+    LPSTR p = HEAP_strdupWtoA (GetProcessHeap (), 0, text);
+    DrawStatusText32A (hdc, lprc, p, style);
+    HeapFree (GetProcessHeap (), 0, p );
 }
 
 
 /***********************************************************************
  * CreateStatusWindow32A [COMCTL32.6][COMCTL32.21]
  */
-HWND32 WINAPI CreateStatusWindow32A( INT32 style, LPCSTR text, HWND32 parent,
-                                     UINT32 wid )
+HWND32 WINAPI
+CreateStatusWindow32A (INT32 style, LPCSTR text, HWND32 parent, UINT32 wid)
 {
     return CreateWindow32A(STATUSCLASSNAME32A, text, style, 
 			   CW_USEDEFAULT32, CW_USEDEFAULT32,
@@ -145,20 +320,21 @@
 /***********************************************************************
  *           CreateUpDownControl  (COMCTL32.16)
  */
-HWND32 WINAPI CreateUpDownControl( DWORD style, INT32 x, INT32 y,
-                                   INT32 cx, INT32 cy, HWND32 parent,
-                                   INT32 id, HINSTANCE32 inst, HWND32 buddy,
-                                   INT32 maxVal, INT32 minVal, INT32 curVal )
+HWND32 WINAPI
+CreateUpDownControl (DWORD style, INT32 x, INT32 y, INT32 cx, INT32 cy,
+		     HWND32 parent, INT32 id, HINSTANCE32 inst,
+		     HWND32 buddy, INT32 maxVal, INT32 minVal, INT32 curVal)
 {
-  HWND32 hUD = CreateWindow32A(UPDOWN_CLASS32A, 0, style, x, y, cx, cy,
-			       parent, id, inst, 0);
-  if(hUD){
-    SendMessage32A(hUD, UDM_SETBUDDY, buddy, 0);
-    SendMessage32A(hUD, UDM_SETRANGE, 0, MAKELONG(maxVal, minVal));
-    SendMessage32A(hUD, UDM_SETPOS, 0, MAKELONG(curVal, 0));     
-  }
+    HWND32 hUD =
+	CreateWindow32A (UPDOWN_CLASS32A, 0, style, x, y, cx, cy,
+			 parent, id, inst, 0);
+    if (hUD) {
+	SendMessage32A (hUD, UDM_SETBUDDY, buddy, 0);
+	SendMessage32A (hUD, UDM_SETRANGE, 0, MAKELONG(maxVal, minVal));
+	SendMessage32A (hUD, UDM_SETPOS, 0, MAKELONG(curVal, 0));     
+    }
 
-  return hUD;
+    return hUD;
 }
 
 
@@ -198,30 +374,30 @@
 BOOL32 WINAPI
 InitCommonControlsEx (LPINITCOMMONCONTROLSEX lpInitCtrls)
 {
-  INT32 cCount;
-  DWORD dwMask;
+    INT32 cCount;
+    DWORD dwMask;
 
-  TRACE(commctrl,"\n");
+    TRACE(commctrl,"\n");
   
-  if (lpInitCtrls == NULL) return FALSE;
-  if (lpInitCtrls->dwSize < sizeof(INITCOMMONCONTROLSEX)) return FALSE;
+    if (lpInitCtrls == NULL) return FALSE;
+    if (lpInitCtrls->dwSize < sizeof(INITCOMMONCONTROLSEX)) return FALSE;
 
-  for (cCount = 0; cCount < 32; cCount++) {
-    dwMask = 1 << cCount;
-    if (!(lpInitCtrls->dwICC & dwMask))
-      continue;
+    for (cCount = 0; cCount < 32; cCount++) {
+	dwMask = 1 << cCount;
+	if (!(lpInitCtrls->dwICC & dwMask))
+	    continue;
 
-    switch (lpInitCtrls->dwICC & dwMask) {
-      /* dummy initialization */
-      case ICC_ANIMATE_CLASS:
-      case ICC_BAR_CLASSES:
-      case ICC_LISTVIEW_CLASSES:
-      case ICC_TREEVIEW_CLASSES:
-      case ICC_TAB_CLASSES:
-      case ICC_UPDOWN_CLASS:
-      case ICC_PROGRESS_CLASS:
-      case ICC_HOTKEY_CLASS:
-        break;
+	switch (lpInitCtrls->dwICC & dwMask) {
+	    /* dummy initialization */
+	    case ICC_ANIMATE_CLASS:
+	    case ICC_BAR_CLASSES:
+	    case ICC_LISTVIEW_CLASSES:
+	    case ICC_TREEVIEW_CLASSES:
+	    case ICC_TAB_CLASSES:
+	    case ICC_UPDOWN_CLASS:
+	    case ICC_PROGRESS_CLASS:
+	    case ICC_HOTKEY_CLASS:
+		break;
 
       /* advanced classes - not included in Win95 */
       case ICC_DATE_CLASSES:
@@ -232,7 +408,7 @@
         break;
 
       case ICC_USEREX_CLASSES:
-        TRACE (commctrl, "No comboex class implemented!\n");
+	COMBOEX_Register ();
         break;
 
       case ICC_COOL_CLASSES:
@@ -254,68 +430,10 @@
       default:
         WARN (commctrl, "Unknown class! dwICC=0x%lX\n", dwMask);
         break;
+	}
     }
-  }
 
-  return TRUE;
-}
-
-
-/***********************************************************************
- * MenuHelp [COMCTL32.2]
- *
- * PARAMS
- *     uMsg
- *     wParam
- *     lParam
- *     hMainMenu
- *     hInst
- *     hwndStatus
- *     lpwIDs
- *
- * NOTES
- *     Some features are still missing because of incomplete WM_MENUSELECT
- *     messages (16->32 bit conversion).
- */
-
-VOID WINAPI
-MenuHelp (UINT32 uMsg, WPARAM32 wParam, LPARAM lParam, HMENU32 hMainMenu,
-	  HINSTANCE32 hInst, HWND32 hwndStatus, LPUINT32 lpwIDs)
-{
-    char szStatusText[128];
-
-    if (!IsWindow32 (hwndStatus)) return;
-
-    switch (uMsg) {
-	case WM_MENUSELECT:
-            TRACE (commctrl, "WM_MENUSELECT wParam=0x%X lParam=0x%lX\n",
-                   wParam, lParam);
-
-            if ((HIWORD(wParam) == 0xFFFF) && (lParam == 0)) {
-                /* menu was closed */
-                SendMessage32A (hwndStatus, SB_SIMPLE, FALSE, 0);
-            }
-            else {
-                if (HIWORD(wParam) & MF_POPUP) {
-		    FIXME (commctrl, "popup 0x%08x 0x%08lx\n", wParam, lParam);
-
-                    szStatusText[0] = 0;
-                }
-                else {
-                    TRACE (commctrl, "menu item selected!\n");
-                    if (!LoadString32A (hInst, LOWORD(wParam), szStatusText, 128))
-                        szStatusText[0] = 0;
-                }
-                SendMessage32A (hwndStatus, SB_SETTEXT32A, 255 | SBT_NOBORDERS,
-                                (LPARAM)szStatusText);
-                SendMessage32A (hwndStatus, SB_SIMPLE, TRUE, 0);
-            }
-            break;
-
-        default:
-            WARN (commctrl, "Invalid Message!\n");
-            break;
-    }
+    return TRUE;
 }
 
 
@@ -387,6 +505,10 @@
  *     wFlags
  *     lpColorMap
  *     iNumMaps
+ *
+ * RETURNS
+ *     Success: bitmap handle
+ *     Failure: 0
  */
 
 HBITMAP32 WINAPI
@@ -496,101 +618,34 @@
 
 
 /***********************************************************************
- * GetEffectiveClientRect [COMCTL32.4]
+ * DllGetVersion [COMCTL32.25]
+ *
+ * Retrieves version information of the 'COMCTL32.DLL'
  *
  * PARAMS
- *     hwnd   [I] handle to the client window.
- *     lpRect [O] pointer to the rectangle of the client window
- *     lpInfo [I] pointer to an array of integers
+ *     pdvi [O] pointer to version information structure.
  *
- * NOTES
+ * REURNS
+ *     Success: S_OK
+ *     Failure: E_INVALIDARG
  */
 
-VOID WINAPI
-GetEffectiveClientRect (HWND32 hwnd, LPRECT32 lpRect, LPINT32 lpInfo)
+HRESULT WINAPI
+COMCTL32_DllGetVersion (DLLVERSIONINFO *pdvi)
 {
-    RECT32 rcCtrl;
-    INT32  *lpRun;
-    HWND32 hwndCtrl;
-
-    TRACE (commctrl, "(0x%08lx 0x%08lx 0x%08lx)\n",
-	   (DWORD)hwnd, (DWORD)lpRect, (DWORD)lpInfo);
-
-    GetClientRect32 (hwnd, lpRect);
-    lpRun = lpInfo;
-
-    do {
-	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 ((HWND32)0, hwnd, (LPPOINT32)&rcCtrl, 2);
-	    SubtractRect32 (lpRect, lpRect, &rcCtrl);
-	}
-	lpRun++;
-    } while (*lpRun);
-}
-
-
-/***********************************************************************
- * ShowHideMenuCtl [COMCTL32.3] 
- *
- * Shows or hides controls and updates the corresponding menu item.
- *
- * PARAMS
- *     hwnd   [I] handle to the client window.
- *     uFlags [I] menu command id.
- *     lpInfo [I] pointer to an array of integers. (See NOTES.)
- *
- * NOTES
- *     The official documentation is incomplete! This has been fixed.
- *
- *     lpInfo
- *     The array of integers contains pairs of values. BOTH values of
- *     the first pair must be the handles to application's main menu.
- *     Each subsequent pair consists of a menu id and control id.
- */
-
-BOOL32 WINAPI
-ShowHideMenuCtl (HWND32 hwnd, UINT32 uFlags, LPINT32 lpInfo)
-{
-    LPINT32 lpMenuId;
-    FIXME (commctrl, "(0x%08x 0x%08x %p): empty stub!\n",
-	   hwnd, uFlags, lpInfo);
-
-    if (lpInfo == NULL)
-	return FALSE;
-
-    if (!(lpInfo[0]) || !(lpInfo[1]))
-	return FALSE;
-
-    /* search for control */
-    lpMenuId = &lpInfo[2];
-    while (*lpMenuId != uFlags)
-	lpMenuId += 2;
-
-    if (GetMenuState32 (lpInfo[1], uFlags, MF_BYCOMMAND) & MFS_CHECKED) {
-	/* uncheck menu item */
-	CheckMenuItem32 (lpInfo[0], *lpMenuId, MF_BYCOMMAND | MF_UNCHECKED);
-
-	/* hide control */
-	lpMenuId++;
-	SetWindowPos32 (GetDlgItem32 (hwnd, *lpMenuId), 0, 0, 0, 0, 0,
-			SWP_HIDEWINDOW);
-    }
-    else {
-	/* check menu item */
-	CheckMenuItem32 (lpInfo[0], *lpMenuId, MF_BYCOMMAND | MF_CHECKED);
-
-	/* show control */
-	lpMenuId++;
-	SetWindowPos32 (GetDlgItem32 (hwnd, *lpMenuId), 0, 0, 0, 0, 0,
-			SWP_SHOWWINDOW);
+    if (pdvi->cbSize != sizeof(DLLVERSIONINFO)) {
+        WARN(ver, "wrong DLLVERSIONINFO size from app");
+	return E_INVALIDARG;
     }
 
-    return TRUE;
+    pdvi->dwMajorVersion = 4;
+    pdvi->dwMinorVersion = 72;
+    pdvi->dwBuildNumber = 2106;
+    pdvi->dwPlatformID = 1;
+
+    TRACE (commctrl, "%lu.%lu.%lu.%lu\n",
+	   pdvi->dwMajorVersion, pdvi->dwMinorVersion,
+	   pdvi->dwBuildNumber, pdvi->dwPlatformID);
+
+    return S_OK;
 }
diff --git a/controls/header.c b/dlls/comctl32/header.c
similarity index 97%
rename from controls/header.c
rename to dlls/comctl32/header.c
index 1e7097aa..813512c 100644
--- a/controls/header.c
+++ b/dlls/comctl32/header.c
@@ -447,7 +447,7 @@
 {
     HEADER_INFO *infoPtr = HEADER_GetInfoPtr(wndPtr);   
     NMHEADERA nmhdr;
-    HD_ITEMA  nmitem;
+    HDITEM32A nmitem;
 
     nmhdr.hdr.hwndFrom = wndPtr->hwndSelf;
     nmhdr.hdr.idFrom = wndPtr->wIDmenu;
@@ -565,13 +565,15 @@
 HEADER_GetItem32A (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
 {
     HEADER_INFO *infoPtr = HEADER_GetInfoPtr(wndPtr);
-    HD_ITEMA *phdi;
-    INT32    iItem;
-    UINT32   uMask;
+    HDITEM32A *phdi;
+    INT32     iItem;
+    UINT32    uMask;
 
-    phdi = (HD_ITEMA*)lParam;
+    phdi = (HDITEM32A*)lParam;
     iItem = (INT32)wParam;
 
+    if (phdi == NULL)
+	return FALSE;
     if ((iItem < 0) || (iItem > infoPtr->uNumItem - 1))
         return FALSE;
 
@@ -668,13 +670,12 @@
 HEADER_InsertItem32A (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
 {
     HEADER_INFO *infoPtr = HEADER_GetInfoPtr(wndPtr);
-    HD_ITEMA *phdi;
-    HDC32    hdc;
-    INT32    iItem, len;
+    HDITEM32A *phdi = (HDITEM32A*)lParam;
+    INT32     iItem = (INT32)wParam;
+    HDC32     hdc;
+    INT32     len;
 
-    phdi = (HD_ITEMA*)lParam;
-    iItem = (INT32)wParam;
-    
+    if (phdi == NULL) return -1;
     if (iItem < 0) return -1;
     if (iItem > infoPtr->uNumItem)
         iItem = infoPtr->uNumItem;
@@ -796,13 +797,12 @@
 HEADER_SetItem32A (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
 {
     HEADER_INFO *infoPtr = HEADER_GetInfoPtr(wndPtr);
-    HD_ITEMA *phdi;
-    INT32    iItem;
-    HDC32    hdc;
+    HDITEM32A *phdi = (HDITEM32A*)lParam;
+    INT32 iItem = (INT32)wParam;
+    HDC32 hdc;
 
-    phdi = (HD_ITEMA*)lParam;
-    iItem = (INT32)wParam;
-
+    if (phdi == NULL)
+	return FALSE;
     if ((iItem < 0) || (iItem > infoPtr->uNumItem - 1))
         return FALSE;
 
@@ -1221,7 +1221,7 @@
 
 
 LRESULT WINAPI
-HeaderWindowProc (HWND32 hwnd, UINT32 msg, WPARAM32 wParam, LPARAM lParam)
+HEADER_WindowProc (HWND32 hwnd, UINT32 msg, WPARAM32 wParam, LPARAM lParam)
 {
     WND *wndPtr = WIN_FindWndPtr(hwnd);
 
@@ -1317,7 +1317,7 @@
 
     ZeroMemory (&wndClass, sizeof(WNDCLASS32A));
     wndClass.style         = CS_GLOBALCLASS | CS_DBLCLKS;
-    wndClass.lpfnWndProc   = (WNDPROC32)HeaderWindowProc;
+    wndClass.lpfnWndProc   = (WNDPROC32)HEADER_WindowProc;
     wndClass.cbClsExtra    = 0;
     wndClass.cbWndExtra    = sizeof(HEADER_INFO *);
     wndClass.hCursor       = LoadCursor32A (0, IDC_ARROW32A);
diff --git a/dlls/comctl32/hotkey.c b/dlls/comctl32/hotkey.c
new file mode 100644
index 0000000..a0c24d6
--- /dev/null
+++ b/dlls/comctl32/hotkey.c
@@ -0,0 +1,360 @@
+/*
+ * Hotkey control
+ *
+ * Copyright 1998 Eric Kohl
+ *
+ * NOTES
+ *   Development in progress. An author is needed! Any volunteers?
+ *   I will only improve this control once in a while.
+ *     Eric <ekohl@abo.rhein-zeitung.de>
+ *
+ * TODO:
+ *   - Some messages.
+ *   - Display code.
+ */
+
+#include "windows.h"
+#include "commctrl.h"
+#include "hotkey.h"
+#include "win.h"
+#include "debug.h"
+
+
+#define HOTKEY_GetInfoPtr(wndPtr) ((HOTKEY_INFO *)wndPtr->wExtra[0])
+
+
+// << HOTHEY_GetHotKey >>
+// << HOTHEY_SetHotKey >>
+// << HOTHEY_SetRules >>
+
+
+
+// << HOTKEY_Char >>
+
+
+static LRESULT
+HOTKEY_Create (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
+{
+    HOTKEY_INFO *infoPtr;
+    TEXTMETRIC32A tm;
+    HDC32 hdc;
+
+    /* allocate memory for info structure */
+    infoPtr = (HOTKEY_INFO *)COMCTL32_Alloc (sizeof(HOTKEY_INFO));
+    wndPtr->wExtra[0] = (DWORD)infoPtr;
+
+    if (infoPtr == NULL) {
+	ERR (listview, "could not allocate info memory!\n");
+	return 0;
+    }
+
+    if ((HOTKEY_INFO*)wndPtr->wExtra[0] != infoPtr) {
+	ERR (listview, "pointer assignment error!\n");
+	return 0;
+    }
+
+
+    /* initialize info structure */
+
+    /* get default font height */
+    hdc = GetDC32 (wndPtr->hwndSelf);
+    GetTextMetrics32A (hdc, &tm);
+    infoPtr->nHeight = tm.tmHeight;
+    ReleaseDC32 (wndPtr->hwndSelf, hdc);
+
+    return 0;
+}
+
+
+static LRESULT
+HOTKEY_Destroy (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
+{
+    HOTKEY_INFO *infoPtr = HOTKEY_GetInfoPtr(wndPtr);
+
+
+
+    /* free hotkey info data */
+    COMCTL32_Free (infoPtr);
+
+    return 0;
+}
+
+
+static LRESULT
+HOTKEY_EraseBackground (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
+{
+    HOTKEY_INFO *infoPtr = HOTKEY_GetInfoPtr(wndPtr);
+    HBRUSH32 hBrush;
+    RECT32   rc;
+
+    hBrush =
+	(HBRUSH32)SendMessage32A (wndPtr->parent->hwndSelf, WM_CTLCOLOREDIT,
+				  wParam, (LPARAM)wndPtr->hwndSelf);
+    if (hBrush)
+	hBrush = (HBRUSH32)GetStockObject32 (WHITE_BRUSH);
+    GetClientRect32 (wndPtr->hwndSelf, &rc);
+
+    FillRect32 ((HDC32)wParam, &rc, hBrush);
+
+    return -1;
+}
+
+
+__inline__ static LRESULT
+HOTKEY_GetFont (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
+{
+    HOTKEY_INFO *infoPtr = HOTKEY_GetInfoPtr(wndPtr);
+
+    return infoPtr->hFont;
+}
+
+
+static LRESULT
+HOTKEY_KeyDown (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
+{
+    HOTKEY_INFO *infoPtr = HOTKEY_GetInfoPtr(wndPtr);
+
+    switch (wParam) {
+	case VK_RETURN:
+	case VK_TAB:
+	case VK_SPACE:
+	case VK_DELETE:
+	case VK_ESCAPE:
+	case VK_BACK:
+	    return DefWindowProc32A (wndPtr->hwndSelf, WM_KEYDOWN, wParam, lParam);
+
+	case VK_SHIFT:
+	case VK_CONTROL:
+	case VK_MENU:
+	    FIXME (hotkey, "modifier key pressed!\n");
+	    break;
+
+	default:
+	    FIXME (hotkey, " %d\n", wParam);
+	    break;
+    }
+
+    return TRUE;
+}
+
+
+static LRESULT
+HOTKEY_KeyUp (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
+{
+    HOTKEY_INFO *infoPtr = HOTKEY_GetInfoPtr(wndPtr);
+
+    FIXME (hotkey, " %d\n", wParam);
+
+    return 0;
+}
+
+
+static LRESULT
+HOTKEY_KillFocus (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
+{
+    HOTKEY_INFO *infoPtr = HOTKEY_GetInfoPtr(wndPtr);
+
+    infoPtr->bFocus = FALSE;
+    DestroyCaret32 ();
+
+    return 0;
+}
+
+
+static LRESULT
+HOTKEY_LButtonDown (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
+{
+//    HOTKEY_INFO *infoPtr = HOTKEY_GetInfoPtr(wndPtr);
+
+    SetFocus32 (wndPtr->hwndSelf);
+
+    return 0;
+}
+
+
+__inline__ static LRESULT
+HOTKEY_NCCreate (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
+{
+    wndPtr->dwExStyle |= WS_EX_CLIENTEDGE;
+
+    return DefWindowProc32A (wndPtr->hwndSelf, WM_NCCREATE, wParam, lParam);
+}
+
+
+
+
+
+static LRESULT
+HOTKEY_SetFocus (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
+{
+    HOTKEY_INFO *infoPtr = HOTKEY_GetInfoPtr(wndPtr);
+
+    infoPtr->bFocus = TRUE;
+
+
+    CreateCaret32 (wndPtr->hwndSelf, (HBITMAP32)0, 1, infoPtr->nHeight);
+
+    SetCaretPos32 (1, 1);
+
+    ShowCaret32 (wndPtr->hwndSelf);
+
+
+    return 0;
+}
+
+
+__inline__ static LRESULT
+HOTKEY_SetFont (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
+{
+    HOTKEY_INFO *infoPtr = HOTKEY_GetInfoPtr(wndPtr);
+    TEXTMETRIC32A tm;
+    HDC32 hdc;
+    HFONT32 hOldFont = 0;
+
+    infoPtr->hFont = (HFONT32)wParam;
+
+    hdc = GetDC32 (wndPtr->hwndSelf);
+    if (infoPtr->hFont)
+	hOldFont = SelectObject32 (hdc, infoPtr->hFont);
+
+    GetTextMetrics32A (hdc, &tm);
+    infoPtr->nHeight = tm.tmHeight;
+
+    if (infoPtr->hFont)
+	SelectObject32 (hdc, hOldFont);
+    ReleaseDC32 (wndPtr->hwndSelf, hdc);
+
+    if (LOWORD(lParam)) {
+
+	FIXME (hotkey, "force redraw!\n");
+
+    }
+
+    return 0;
+}
+
+
+static LRESULT
+HOTKEY_SysKeyDown (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
+{
+    HOTKEY_INFO *infoPtr = HOTKEY_GetInfoPtr(wndPtr);
+
+    switch (wParam) {
+	case VK_RETURN:
+	case VK_TAB:
+	case VK_SPACE:
+	case VK_DELETE:
+	case VK_ESCAPE:
+	case VK_BACK:
+	    return DefWindowProc32A (wndPtr->hwndSelf, WM_SYSKEYDOWN, wParam, lParam);
+
+	case VK_SHIFT:
+	case VK_CONTROL:
+	case VK_MENU:
+	    FIXME (hotkey, "modifier key pressed!\n");
+	    break;
+
+	default:
+	    FIXME (hotkey, " %d\n", wParam);
+	    break;
+    }
+
+    return TRUE;
+}
+
+
+static LRESULT
+HOTKEY_SysKeyUp (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
+{
+    HOTKEY_INFO *infoPtr = HOTKEY_GetInfoPtr(wndPtr);
+
+    FIXME (hotkey, " %d\n", wParam);
+
+    return 0;
+}
+
+
+
+LRESULT WINAPI
+HOTKEY_WindowProc (HWND32 hwnd, UINT32 uMsg, WPARAM32 wParam, LPARAM lParam)
+{
+    WND *wndPtr = WIN_FindWndPtr(hwnd);
+
+    switch (uMsg)
+    {
+//	case HKM_GETHOTKEY:
+//	case HKM_SETHOTKEY:
+//	case HKM_SETRULES:
+
+//	case WM_CHAR:
+
+	case WM_CREATE:
+	    return HOTKEY_Create (wndPtr, wParam, lParam);
+
+	case WM_DESTROY:
+	    return HOTKEY_Destroy (wndPtr, wParam, lParam);
+
+	case WM_ERASEBKGND:
+	    return HOTKEY_EraseBackground (wndPtr, wParam, lParam);
+
+	case WM_GETDLGCODE:
+	    return DLGC_WANTCHARS | DLGC_WANTARROWS;
+
+	case WM_GETFONT:
+	    return HOTKEY_GetFont (wndPtr, wParam, lParam);
+
+	case WM_KEYDOWN:
+	case WM_SYSKEYDOWN:
+	    return HOTKEY_KeyDown (wndPtr, wParam, lParam);
+
+	case WM_KEYUP:
+	case WM_SYSKEYUP:
+	    return HOTKEY_KeyUp (wndPtr, wParam, lParam);
+
+	case WM_KILLFOCUS:
+	    return HOTKEY_KillFocus (wndPtr, wParam, lParam);
+
+	case WM_LBUTTONDOWN:
+	    return HOTKEY_LButtonDown (wndPtr, wParam, lParam);
+
+	case WM_NCCREATE:
+	    return HOTKEY_NCCreate (wndPtr, wParam, lParam);
+
+//	case WM_PAINT:
+
+	case WM_SETFOCUS:
+	    return HOTKEY_SetFocus (wndPtr, wParam, lParam);
+
+	case WM_SETFONT:
+	    return HOTKEY_SetFont (wndPtr, wParam, lParam);
+
+//	case WM_SYSCHAR:
+
+	default:
+	    if (uMsg >= WM_USER)
+		ERR (hotkey, "unknown msg %04x wp=%08x lp=%08lx\n",
+		     uMsg, wParam, lParam);
+	    return DefWindowProc32A (hwnd, uMsg, wParam, lParam);
+    }
+    return 0;
+}
+
+
+void
+HOTKEY_Register (void)
+{
+    WNDCLASS32A wndClass;
+
+    if (GlobalFindAtom32A (HOTKEY_CLASS32A)) return;
+
+    ZeroMemory (&wndClass, sizeof(WNDCLASS32A));
+    wndClass.style         = CS_GLOBALCLASS;
+    wndClass.lpfnWndProc   = (WNDPROC32)HOTKEY_WindowProc;
+    wndClass.cbClsExtra    = 0;
+    wndClass.cbWndExtra    = sizeof(HOTKEY_INFO *);
+    wndClass.hCursor       = 0;
+    wndClass.hbrBackground = 0;
+    wndClass.lpszClassName = HOTKEY_CLASS32A;
+ 
+    RegisterClass32A (&wndClass);
+}
diff --git a/misc/imagelist.c b/dlls/comctl32/imagelist.c
similarity index 99%
rename from misc/imagelist.c
rename to dlls/comctl32/imagelist.c
index 8cafd4a..6fbbd33 100644
--- a/misc/imagelist.c
+++ b/dlls/comctl32/imagelist.c
@@ -1921,8 +1921,10 @@
     if (hdcImage)
 	DeleteDC32 (hdcImage);
 
+//    FIXME (imagelist, "deleting hbmColor!\n");
     if (ii.hbmColor)
 	DeleteObject32 (ii.hbmColor);
+//    FIXME (imagelist, "deleted hbmColor!\n");
     if (ii.hbmMask)
 	DeleteObject32 (ii.hbmMask);
 
diff --git a/dlls/comctl32/listview.c b/dlls/comctl32/listview.c
new file mode 100644
index 0000000..91fe4cb
--- /dev/null
+++ b/dlls/comctl32/listview.c
@@ -0,0 +1,600 @@
+/*
+ * 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 "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);
+
+
+
+}
+
+
+
+// << LISTVIEW_FindItem >>
+
+
+static LRESULT
+LISTVIEW_GetBkColor (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
+{
+    LISTVIEW_INFO *infoPtr = LISTVIEW_GetInfoPtr(wndPtr);
+
+    return infoPtr->clrBk;
+}
+
+
+// << LISTVIEW_GetBkImage >>
+
+
+__inline__ static LRESULT
+LISTVIEW_GetColumnWidth (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
+{
+    LISTVIEW_INFO *infoPtr = LISTVIEW_GetInfoPtr(wndPtr);
+    HDITEM32A hdi;
+
+    hdi.mask = HDI_WIDTH;
+    if (SendMessage32A (infoPtr->hwndHeader, HDM_GETITEM32A,
+			wParam, (LPARAM)&hdi))
+	return hdi.cxy;
+
+    return 0;
+}
+
+
+
+
+__inline__ static LRESULT
+LISTVIEW_GetHeader (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
+{
+    LISTVIEW_INFO *infoPtr = LISTVIEW_GetInfoPtr(wndPtr);
+
+    return infoPtr->hwndHeader;
+}
+
+
+static LRESULT
+LISTVIEW_GetImageList (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
+{
+    LISTVIEW_INFO *infoPtr = LISTVIEW_GetInfoPtr(wndPtr);
+
+    TRACE (listview, "(0x%08x)\n", wParam);
+
+    switch (wParam) {
+	case LVSIL_NORMAL:
+	    return (LRESULT)infoPtr->himlNormal;
+
+	case LVSIL_SMALL:
+	    return (LRESULT)infoPtr->himlSmall;
+
+	case LVSIL_STATE:
+	    return (LRESULT)infoPtr->himlState;
+    }
+
+    return (LRESULT)NULL;
+}
+
+
+static LRESULT
+LISTVIEW_GetItem32A (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
+{
+    LISTVIEW_INFO *infoPtr = LISTVIEW_GetInfoPtr(wndPtr);
+
+    FIXME (listview, "(0x%08x) empty stub!\n", wParam);
+
+
+
+    return TRUE;
+}
+
+
+
+__inline__ static LRESULT
+LISTVIEW_GetItemCount (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
+{
+    LISTVIEW_INFO *infoPtr = LISTVIEW_GetInfoPtr(wndPtr);
+    return infoPtr->nItemCount;
+}
+
+
+
+static LRESULT
+LISTVIEW_GetStringWidth32A (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
+{
+    LISTVIEW_INFO *infoPtr = LISTVIEW_GetInfoPtr(wndPtr);
+    LPSTR lpsz = (LPSTR)lParam;
+    HFONT32 hFont, hOldFont;
+    HDC32 hdc;
+    SIZE32 size;
+
+    if (!lpsz)
+	return 0;
+
+    TRACE (listview, "(%s) empty stub!\n", lpsz);
+
+    hFont = infoPtr->hFont ? infoPtr->hFont : GetStockObject32 (SYSTEM_FONT);
+    hdc = GetDC32 (0);
+    hOldFont = SelectObject32 (hdc, hFont);
+    GetTextExtentPoint32A (hdc, lpsz, lstrlen32A(lpsz), &size);
+    SelectObject32 (hdc, hOldFont);
+    ReleaseDC32 (0, hdc);
+
+    TRACE (listview, "-- ret=%d\n", size.cx);
+
+    return (LRESULT)size.cx;
+}
+
+
+
+
+static LRESULT
+LISTVIEW_InsertColumn32A (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
+{
+    LISTVIEW_INFO *infoPtr = LISTVIEW_GetInfoPtr(wndPtr);
+    LPLVCOLUMN32A lpcol = (LPLVCOLUMN32A)lParam;
+    HDITEM32A hdi;
+
+    if (!lpcol)
+	return -1;
+
+    TRACE (listview, "(%d %p) empty stub!\n", (INT32)wParam, lpcol);
+
+    ZeroMemory (&hdi, sizeof(HDITEM32A));
+
+    if (lpcol->mask & LVCF_FMT) {
+	if (wParam == 0)
+	    hdi.fmt |= HDF_LEFT;
+	else if (lpcol->fmt & LVCFMT_LEFT)
+	    hdi.fmt |= HDF_LEFT;
+	else if (lpcol->fmt & LVCFMT_RIGHT)
+	    hdi.fmt |= HDF_RIGHT;
+	else if (lpcol->fmt & LVCFMT_CENTER)
+	    hdi.fmt |= HDF_CENTER;
+
+	if (lpcol->fmt & LVCFMT_COL_HAS_IMAGES)
+	    hdi.fmt |= HDF_IMAGE;
+	    
+	hdi.mask |= HDI_FORMAT;
+    }
+
+    if (lpcol->mask & LVCF_WIDTH) {
+        hdi.mask |= HDI_WIDTH;
+	hdi.cxy = lpcol->cx;
+    }
+    
+    if (lpcol->mask & LVCF_TEXT) {
+        hdi.mask |= (HDI_TEXT | HDI_FORMAT);
+	hdi.pszText = lpcol->pszText;
+	hdi.fmt |= HDF_STRING;
+    }
+
+    if (lpcol->mask & LVCF_IMAGE) {
+        hdi.mask |= HDI_IMAGE;
+	hdi.iImage = lpcol->iImage;
+    }
+
+    if (lpcol->mask & LVCF_ORDER) {
+        hdi.mask |= HDI_ORDER;
+	hdi.iOrder = lpcol->iOrder;
+    }
+
+    return (LRESULT)SendMessage32A (infoPtr->hwndHeader, HDM_INSERTITEM32A,
+				    wParam, (LPARAM)&hdi);
+}
+
+
+
+
+static LRESULT
+LISTVIEW_SetBkColor (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
+{
+    LISTVIEW_INFO *infoPtr = LISTVIEW_GetInfoPtr(wndPtr);
+
+    if (!(infoPtr)) return FALSE;
+
+    /* set background color */
+    TRACE (listview, "0x%06x\n", (COLORREF)lParam);
+    infoPtr->clrBk = (COLORREF)lParam;
+
+    return TRUE;
+}
+
+
+static LRESULT
+LISTVIEW_SetImageList (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
+{
+    LISTVIEW_INFO *infoPtr = LISTVIEW_GetInfoPtr(wndPtr);
+    HIMAGELIST himlTemp = 0;
+
+    TRACE (listview, "(0x%08x 0x%08lx)\n", wParam, lParam);
+
+    switch (wParam) {
+	case LVSIL_NORMAL:
+	    himlTemp = infoPtr->himlNormal;
+	    infoPtr->himlNormal = (HIMAGELIST)lParam;
+	    return (LRESULT)himlTemp;
+
+	case LVSIL_SMALL:
+	    himlTemp = infoPtr->himlSmall;
+	    infoPtr->himlSmall = (HIMAGELIST)lParam;
+	    return (LRESULT)himlTemp;
+
+	case LVSIL_STATE:
+	    himlTemp = infoPtr->himlState;
+	    infoPtr->himlState = (HIMAGELIST)lParam;
+	    return (LRESULT)himlTemp;
+    }
+
+    return (LRESULT)NULL;
+}
+
+
+
+
+static LRESULT
+LISTVIEW_Create (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
+{
+    /* info structure is created at NCCreate */
+    LISTVIEW_INFO *infoPtr = LISTVIEW_GetInfoPtr(wndPtr);
+    LOGFONT32A logFont;
+    DWORD dwStyle = WS_CHILD | WS_VISIBLE; 
+
+
+    /* initialize info structure */
+    infoPtr->clrBk = CLR_NONE;
+
+    if (!(wndPtr->dwStyle & LVS_REPORT) ||
+	 (wndPtr->dwStyle & LVS_NOCOLUMNHEADER))
+	dwStyle |= HDS_HIDDEN;
+    if (!(wndPtr->dwStyle & LVS_NOSORTHEADER))
+	dwStyle |= HDS_BUTTONS;
+
+    /* create header */
+    infoPtr->hwndHeader =
+	CreateWindow32A (WC_HEADER32A, "", dwStyle,
+			 0, 0, 0, 0, wndPtr->hwndSelf,
+			 (HMENU32)0, wndPtr->hInstance, NULL);
+
+    /* get default font (icon title) */
+    SystemParametersInfo32A (SPI_GETICONTITLELOGFONT, 0, &logFont, 0);
+    infoPtr->hDefaultFont = CreateFontIndirect32A (&logFont);
+    infoPtr->hFont = infoPtr->hDefaultFont;
+
+    /* set header font */
+    SendMessage32A (infoPtr->hwndHeader, WM_SETFONT,
+		    (WPARAM32)infoPtr->hFont, (LPARAM)TRUE);
+
+
+    infoPtr->hdsaItems = DSA_Create (sizeof(LISTVIEW_ITEM), 10);
+
+    return 0;
+}
+
+
+static LRESULT
+LISTVIEW_Destroy (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
+{
+    LISTVIEW_INFO *infoPtr = LISTVIEW_GetInfoPtr(wndPtr);
+
+    DSA_Destroy (infoPtr->hdsaItems);
+
+    /* destroy header */
+    if (infoPtr->hwndHeader)
+	DestroyWindow32 (infoPtr->hwndHeader);
+
+    /* destroy font */
+    infoPtr->hFont = (HFONT32)0;
+    if (infoPtr->hDefaultFont)
+	DeleteObject32 (infoPtr->hDefaultFont);
+
+    
+
+    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 {
+	HBRUSH32 hBrush = CreateSolidBrush32 (infoPtr->clrBk);
+	FillRect32 ((HDC32)wParam, &infoPtr->rcList, hBrush);
+	DeleteObject32 (hBrush);
+	return FALSE;
+    }
+    return FALSE;
+}
+
+
+__inline__ static LRESULT
+LISTVIEW_GetFont (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
+{
+    LISTVIEW_INFO *infoPtr = LISTVIEW_GetInfoPtr(wndPtr);
+
+    return infoPtr->hFont;
+}
+
+
+// << LISTVIEW_HScroll >>
+// << LISTVIEW_KeyDown >>
+// << LISTVIEW_KillFocus >>
+
+
+static LRESULT
+LISTVIEW_NCCreate (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
+{
+    LISTVIEW_INFO *infoPtr;
+
+    /* allocate memory for info structure */
+    infoPtr = (LISTVIEW_INFO *)COMCTL32_Alloc (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 */
+    COMCTL32_Free (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;
+}
+
+
+
+
+static LRESULT
+LISTVIEW_SetFont (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
+{
+    LISTVIEW_INFO *infoPtr = LISTVIEW_GetInfoPtr(wndPtr);
+    HFONT32 hFont = (HFONT32)wParam;
+
+    infoPtr->hFont = hFont ? hFont : infoPtr->hDefaultFont;
+
+    /* set header font */
+    SendMessage32A (infoPtr->hwndHeader, WM_SETFONT, wParam, lParam);
+
+    /* reinitialize the listview */
+    
+
+
+    if (lParam) {
+	/* force redraw */
+
+
+    }
+
+    return 0;
+}
+
+
+
+
+static LRESULT
+LISTVIEW_Size (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
+{
+    LISTVIEW_INFO *infoPtr = LISTVIEW_GetInfoPtr(wndPtr);
+    HDLAYOUT hl;
+    WINDOWPOS32 wp;
+    RECT32 rc;
+
+    rc.top = 0;
+    rc.left = 0;
+    rc.right = LOWORD(lParam);
+    rc.bottom = HIWORD(lParam);
+
+    hl.prc = &rc;
+    hl.pwpos = &wp;
+    SendMessage32A (infoPtr->hwndHeader, HDM_LAYOUT, 0, (LPARAM)&hl);
+
+    SetWindowPos32 (infoPtr->hwndHeader, wndPtr->hwndSelf,
+		    wp.x, wp.y, wp.cx, wp.cy, wp.flags);
+
+    GetClientRect32 (wndPtr->hwndSelf, &infoPtr->rcList);
+    infoPtr->rcList.top += wp.cy;
+
+    return 0;
+}
+
+
+LRESULT WINAPI
+LISTVIEW_WindowProc (HWND32 hwnd, UINT32 uMsg, WPARAM32 wParam, LPARAM lParam)
+{
+    WND *wndPtr = WIN_FindWndPtr(hwnd);
+
+    switch (uMsg)
+    {
+//	case LVM_DELETEALLITEMS:
+
+        case LVM_GETBKCOLOR:
+	    return LISTVIEW_GetBkColor (wndPtr, wParam, lParam);
+
+
+        case LVM_GETCOLUMNWIDTH:
+	    return LISTVIEW_GetColumnWidth (wndPtr, wParam, lParam);
+
+
+        case LVM_GETHEADER:
+	    return LISTVIEW_GetHeader (wndPtr, wParam, lParam);
+
+//	case LVM_GETISEARCHSTRING:
+
+	case LVM_GETIMAGELIST:
+	    return LISTVIEW_GetImageList (wndPtr, wParam, lParam);
+
+	case LVM_GETITEM32A:
+	    return LISTVIEW_GetItem32A (wndPtr, wParam, lParam);
+
+//	case LVM_GETITEM32W:
+
+	case LVM_GETITEMCOUNT:
+	    return LISTVIEW_GetItemCount (wndPtr, wParam, lParam);
+
+//	case LVM_GETSELECTEDCOUNT:
+
+	case LVM_GETSTRINGWIDTH32A:
+	    return LISTVIEW_GetStringWidth32A (wndPtr, wParam, lParam);
+
+//	case LVM_GETSTRINGWIDTH32W:
+//	case LVM_GETSUBITEMRECT:
+
+	case LVM_INSERTCOLUMN32A:
+	    return LISTVIEW_InsertColumn32A (wndPtr, wParam, lParam);
+
+
+//	case LVM_INSERTCOLUMN32W:
+
+//	case LVM_INSERTITEM32A:
+//	case LVM_INSERTITEM32W:
+
+
+	case LVM_SETBKCOLOR:
+	    return LISTVIEW_SetBkColor (wndPtr, wParam, lParam);
+
+	
+	case LVM_SETIMAGELIST:
+	    return LISTVIEW_SetImageList (wndPtr, wParam, lParam);
+
+//	case LVM_SETITEMPOSITION:
+
+//	case LVM_SORTITEMS:
+
+
+//	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:
+	    return DLGC_WANTTAB | DLGC_WANTARROWS;
+
+	case WM_GETFONT:
+	    return LISTVIEW_GetFont (wndPtr, wParam, lParam);
+
+//	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:
+	    return LISTVIEW_SetFont (wndPtr, wParam, lParam);
+
+//	case WM_SETREDRAW:
+
+	case WM_SIZE:
+	    return LISTVIEW_Size (wndPtr, wParam, lParam);
+
+//	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)LISTVIEW_WindowProc;
+    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/dlls/comctl32/pager.c
similarity index 73%
rename from controls/pager.c
rename to dlls/comctl32/pager.c
index 60612c2..e5c231e 100644
--- a/controls/pager.c
+++ b/dlls/comctl32/pager.c
@@ -16,7 +16,6 @@
 #include "windows.h"
 #include "commctrl.h"
 #include "pager.h"
-#include "heap.h"
 #include "win.h"
 #include "debug.h"
 
@@ -49,7 +48,7 @@
 {
     PAGER_INFO *infoPtr = PAGER_GetInfoPtr(wndPtr);
 
-    return (LRESULT)infoPtr->iBorder;
+    return (LRESULT)infoPtr->nBorder;
 }
 
 
@@ -58,11 +57,21 @@
 {
     PAGER_INFO *infoPtr = PAGER_GetInfoPtr(wndPtr);
 
-    return (LRESULT)infoPtr->iButtonSize;
+    return (LRESULT)infoPtr->nButtonSize;
 }
 
 
-// << PAGER_GetButtonState >>
+static LRESULT
+PAGER_GetButtonState (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
+{
+    PAGER_INFO *infoPtr = PAGER_GetInfoPtr(wndPtr);
+
+    FIXME (pager, "empty stub!\n");
+
+    return PGF_INVISIBLE;
+}
+
+
 // << PAGER_GetDropTarget >>
 
 
@@ -71,16 +80,33 @@
 {
     PAGER_INFO *infoPtr = PAGER_GetInfoPtr(wndPtr);
 
-    return infoPtr->iPos;
+    return infoPtr->nPos;
 }
 
 
 static LRESULT
 PAGER_RecalcSize (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
 {
-//    PAGER_INFO *infoPtr = PAGER_GetInfoPtr(wndPtr);
+    PAGER_INFO *infoPtr = PAGER_GetInfoPtr(wndPtr);
+    NMPGCALCSIZE nmpgcs;
 
-    FIXME (pager, "empty stub!\n");
+    if (infoPtr->hwndChild) {
+	nmpgcs.hdr.hwndFrom = wndPtr->hwndSelf;
+	nmpgcs.hdr.idFrom = wndPtr->wIDmenu;
+	nmpgcs.hdr.code = PGN_CALCSIZE;
+	nmpgcs.dwFlag =
+	     (wndPtr->dwStyle & PGS_HORZ) ? PGF_CALCWIDTH : PGF_CALCHEIGHT;
+	SendMessage32A (GetParent32 (wndPtr->hwndSelf), WM_NOTIFY,
+			(WPARAM32)wndPtr->wIDmenu, (LPARAM)&nmpgcs);
+
+	infoPtr->nChildSize =
+	     (wndPtr->dwStyle & PGS_HORZ) ? nmpgcs.iWidth : nmpgcs.iHeight;
+
+
+        FIXME (pager, "Child size %d\n", infoPtr->nChildSize);
+
+
+    }
 
     return 0;
 }
@@ -104,9 +130,9 @@
 PAGER_SetBorder (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
 {
     PAGER_INFO *infoPtr = PAGER_GetInfoPtr(wndPtr);
-    INT32 nTemp = infoPtr->iBorder;
+    INT32 nTemp = infoPtr->nBorder;
 
-    infoPtr->iBorder = (INT32)lParam;
+    infoPtr->nBorder = (INT32)lParam;
 
     /* FIXME: redraw */
 
@@ -118,9 +144,11 @@
 PAGER_SetButtonSize (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
 {
     PAGER_INFO *infoPtr = PAGER_GetInfoPtr(wndPtr);
-    INT32 nTemp = infoPtr->iButtonSize;
+    INT32 nTemp = infoPtr->nButtonSize;
 
-    infoPtr->iButtonSize = (INT32)lParam;
+    infoPtr->nButtonSize = (INT32)lParam;
+
+    FIXME (pager, "size=%d\n", infoPtr->nButtonSize);
 
     /* FIXME: redraw */
 
@@ -133,9 +161,15 @@
 {
     PAGER_INFO *infoPtr = PAGER_GetInfoPtr(wndPtr);
 
-    infoPtr->hwndChild = (HWND32)lParam;
+    infoPtr->hwndChild = IsWindow32 ((HWND32)lParam) ? (HWND32)lParam : 0;
+
+    FIXME (pager, "hwnd=%x\n", infoPtr->hwndChild);
 
     /* FIXME: redraw */
+    SetParent32 (infoPtr->hwndChild, wndPtr->hwndSelf);
+    SetWindowPos32 (infoPtr->hwndChild, wndPtr->hwndSelf,
+		    0, 0, 40, 40, SWP_SHOWWINDOW);
+    RedrawWindow32 (wndPtr->hwndSelf, NULL, 0, RDW_INVALIDATE);
 
     return 0;
 }
@@ -146,9 +180,13 @@
 {
     PAGER_INFO *infoPtr = PAGER_GetInfoPtr(wndPtr);
 
-    infoPtr->iPos = (INT32)lParam;
+    infoPtr->nPos = (INT32)lParam;
+
+    FIXME (pager, "pos=%d\n", infoPtr->nPos);
 
     /* FIXME: redraw */
+    SetWindowPos32 (infoPtr->hwndChild, wndPtr->hwndSelf,
+		    0, 0, 0, 0, SWP_NOSIZE);
 
     return 0;
 }
@@ -160,8 +198,7 @@
     PAGER_INFO *infoPtr;
 
     /* allocate memory for info structure */
-    infoPtr = (PAGER_INFO *)HeapAlloc (GetProcessHeap (), HEAP_ZERO_MEMORY,
-                                   sizeof(PAGER_INFO));
+    infoPtr = (PAGER_INFO *)COMCTL32_Alloc (sizeof(PAGER_INFO));
     wndPtr->wExtra[0] = (DWORD)infoPtr;
 
     if (infoPtr == NULL) {
@@ -177,9 +214,9 @@
     /* set default settings */
     infoPtr->hwndChild = 0;
     infoPtr->clrBk = GetSysColor32 (COLOR_BTNFACE);
-    infoPtr->iBorder = 0;
-    infoPtr->iButtonSize = 0;
-    infoPtr->iPos = 0;
+    infoPtr->nBorder = 0;
+    infoPtr->nButtonSize = 0;
+    infoPtr->nPos = 0;
 
 
     return 0;
@@ -195,7 +232,7 @@
 
 
     /* free pager info data */
-    HeapFree (GetProcessHeap (), 0, infoPtr);
+    COMCTL32_Free (infoPtr);
 
     return 0;
 }
@@ -208,9 +245,9 @@
     HBRUSH32 hBrush = CreateSolidBrush32 (infoPtr->clrBk);
     RECT32 rect;
 
-    GetClientRect32 (wndPtr->hwndSelf, &rect);
-    FillRect32 ((HDC32)wParam, &rect, hBrush);
-    DeleteObject32 (hBrush);
+//    GetClientRect32 (wndPtr->hwndSelf, &rect);
+//    FillRect32 ((HDC32)wParam, &rect, hBrush);
+//    DeleteObject32 (hBrush);
     return TRUE;
 }
 
@@ -238,7 +275,9 @@
 	case PGM_GETBUTTONSIZE:
 	    return PAGER_GetButtonSize (wndPtr, wParam, lParam);
 
-//	case PGM_GETBUTTONSTATE:
+	case PGM_GETBUTTONSTATE:
+	    return PAGER_GetButtonState (wndPtr, wParam, lParam);
+
 //	case PGM_GETDROPTARGET:
 
 	case PGM_GETPOS:
diff --git a/controls/progress.c b/dlls/comctl32/progress.c
similarity index 100%
rename from controls/progress.c
rename to dlls/comctl32/progress.c
diff --git a/controls/rebar.c b/dlls/comctl32/rebar.c
similarity index 75%
rename from controls/rebar.c
rename to dlls/comctl32/rebar.c
index a36bbff..b27b5f5 100644
--- a/controls/rebar.c
+++ b/dlls/comctl32/rebar.c
@@ -24,6 +24,26 @@
 #define REBAR_GetInfoPtr(wndPtr) ((REBAR_INFO *)wndPtr->wExtra[0])
 
 
+
+
+static VOID
+REBAR_Refresh (WND *wndPtr, HDC32 hdc)
+{
+    RECT32 rect;
+    HBRUSH32 hbrBk;
+
+    GetClientRect32 (wndPtr->hwndSelf, &rect);
+
+    hbrBk = CreateSolidBrush32 (RGB (192, 192, 192));
+    FillRect32 (hdc, &rect, hbrBk);
+    DeleteObject32 (hbrBk);
+}
+
+
+
+
+
+
 // << REBAR_BeginDrag >>
 // << REBAR_DeleteBand >>
 // << REBAR_DragMove >>
@@ -51,7 +71,7 @@
 
     if (lprbbi == NULL)
 	return FALSE;
-    if (lprbbi->cbSize < sizeof (LPREBARBANDINFO32A))
+    if (lprbbi->cbSize < REBARBANDINFO_V3_SIZE32A)
 	return FALSE;
     if ((UINT32)wParam >= infoPtr->uNumBands)
 	return FALSE;
@@ -97,16 +117,17 @@
     if (lprbbi->fMask & RBBIM_ID)
 	lprbbi->wID = lpBand->wID;
 
-    /* FIXME: check for size of band info structure */
+    /* check for additional data */
+    if (lprbbi->cbSize >= sizeof (REBARBANDINFO32A)) {
+	if (lprbbi->fMask & RBBIM_IDEALSIZE)
+	    lprbbi->cxIdeal = lpBand->cxIdeal;
 
-    if (lprbbi->fMask & RBBIM_IDEALSIZE)
-	lprbbi->cxIdeal = lpBand->cxIdeal;
+	if (lprbbi->fMask & RBBIM_LPARAM)
+	    lprbbi->lParam = lpBand->lParam;
 
-    if (lprbbi->fMask & RBBIM_LPARAM)
-	lprbbi->lParam = lpBand->lParam;
-
-    if (lprbbi->fMask & RBBIM_HEADERSIZE)
-	lprbbi->cxHeader = lpBand->cxHeader;
+	if (lprbbi->fMask & RBBIM_HEADERSIZE)
+	    lprbbi->cxHeader = lpBand->cxHeader;
+    }
 
     return TRUE;
 }
@@ -114,7 +135,16 @@
 
 // << REBAR_GetBandInfo32W >>
 
-// << REBAR_GetBarHeight >>
+
+static LRESULT
+REBAR_GetBarHeight (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
+{
+    REBAR_INFO *infoPtr = REBAR_GetInfoPtr (wndPtr);
+
+    FIXME (rebar, "returns fixed height of 40 pixels!\n");
+
+    return 40;
+}
 
 
 static LRESULT
@@ -187,10 +217,13 @@
     TRACE (rebar, "id %u\n", (UINT32)wParam);
 
     for (i = 0; i < infoPtr->uNumBands; i++) {
-	if (infoPtr->bands[i].wID == (UINT32)wParam)
+	if (infoPtr->bands[i].wID == (UINT32)wParam) {
+	    TRACE (rebar, "band %u found!\n", i);
 	    return i;
+	}
     }
 
+    TRACE (rebar, "no band found!\n");
     return -1;
 }
 
@@ -207,9 +240,11 @@
 	return FALSE;
     if (lprbbi == NULL)
 	return FALSE;
-    if (lprbbi->cbSize < sizeof (REBARBANDINFO32A))
+    if (lprbbi->cbSize < REBARBANDINFO_V3_SIZE32A)
 	return FALSE;
 
+    TRACE (rebar, "insert band at %u!\n", uIndex);
+
     if (infoPtr->uNumBands == 0) {
 	infoPtr->bands =
 	    (REBAR_BAND *)HeapAlloc (GetProcessHeap (), HEAP_ZERO_MEMORY,
@@ -221,12 +256,20 @@
 	infoPtr->bands =
 	    (REBAR_BAND *)HeapAlloc (GetProcessHeap (), HEAP_ZERO_MEMORY,
 				     (infoPtr->uNumBands+1)*sizeof(REBAR_BAND));
-	if ((INT32)uIndex == -1)
+	if (((INT32)uIndex == -1) || (uIndex > infoPtr->uNumBands))
 	    uIndex = infoPtr->uNumBands;
 
-	/* pre copy */
+	/* pre insert copy */
+	if (uIndex > 0) {
+	    memcpy (&infoPtr->bands[0], &oldBands[0],
+		    uIndex * sizeof(REBAR_BAND));
+	}
 
 	/* post copy */
+	if (uIndex < infoPtr->uNumBands - 1) {
+	    memcpy (&infoPtr->bands[uIndex+1], &oldBands[uIndex],
+		    (infoPtr->uNumBands - uIndex - 1) * sizeof(REBAR_BAND));
+	}
 
 	HeapFree (GetProcessHeap (), 0, &oldBands);
     }
@@ -258,8 +301,11 @@
     if (lprbbi->fMask & RBBIM_IMAGE)
 	lpBand->iImage = lprbbi->iImage;
 
-    if (lprbbi->fMask & RBBIM_CHILD)
+    if (lprbbi->fMask & RBBIM_CHILD) {
 	lpBand->hwndChild = lprbbi->hwndChild;
+	lpBand->hwndPrevParent =
+	    SetParent32 (lpBand->hwndChild, wndPtr->hwndSelf);
+    }
 
     if (lprbbi->fMask & RBBIM_CHILDSIZE) {
 	lpBand->cxMinChild = lprbbi->cxMinChild;
@@ -278,16 +324,17 @@
     if (lprbbi->fMask & RBBIM_ID)
 	lpBand->wID = lprbbi->wID;
 
-    /* FIXME: check for size of band info structure */
+    /* check for additional data */
+    if (lprbbi->cbSize >= sizeof (REBARBANDINFO32A)) {
+	if (lprbbi->fMask & RBBIM_IDEALSIZE)
+	    lpBand->cxIdeal = lprbbi->cxIdeal;
 
-    if (lprbbi->fMask & RBBIM_IDEALSIZE)
-	lpBand->cxIdeal = lprbbi->cxIdeal;
+	if (lprbbi->fMask & RBBIM_LPARAM)
+	    lpBand->lParam = lprbbi->lParam;
 
-    if (lprbbi->fMask & RBBIM_LPARAM)
-	lpBand->lParam = lprbbi->lParam;
-
-    if (lprbbi->fMask & RBBIM_HEADERSIZE)
-	lpBand->cxHeader = lprbbi->cxHeader;
+	if (lprbbi->fMask & RBBIM_HEADERSIZE)
+	    lpBand->cxHeader = lprbbi->cxHeader;
+    }
 
     return TRUE;
 }
@@ -308,7 +355,7 @@
 
     if (lprbbi == NULL)
 	return FALSE;
-    if (lprbbi->cbSize < sizeof (LPREBARBANDINFO32A))
+    if (lprbbi->cbSize < REBARBANDINFO_V3_SIZE32A)
 	return FALSE;
     if ((UINT32)wParam >= infoPtr->uNumBands)
 	return FALSE;
@@ -340,8 +387,11 @@
     if (lprbbi->fMask & RBBIM_IMAGE)
 	lpBand->iImage = lprbbi->iImage;
 
-    if (lprbbi->fMask & RBBIM_CHILD)
+    if (lprbbi->fMask & RBBIM_CHILD) {
 	lpBand->hwndChild = lprbbi->hwndChild;
+	lpBand->hwndPrevParent =
+	    SetParent32 (lpBand->hwndChild, wndPtr->hwndSelf);
+    }
 
     if (lprbbi->fMask & RBBIM_CHILDSIZE) {
 	lpBand->cxMinChild = lprbbi->cxMinChild;
@@ -360,16 +410,17 @@
     if (lprbbi->fMask & RBBIM_ID)
 	lpBand->wID = lprbbi->wID;
 
-    /* FIXME: check for size of band info structure */
+    /* check for additional data */
+    if (lprbbi->cbSize >= sizeof (REBARBANDINFO32A)) {
+	if (lprbbi->fMask & RBBIM_IDEALSIZE)
+	    lpBand->cxIdeal = lprbbi->cxIdeal;
 
-    if (lprbbi->fMask & RBBIM_IDEALSIZE)
-	lpBand->cxIdeal = lprbbi->cxIdeal;
+	if (lprbbi->fMask & RBBIM_LPARAM)
+	    lpBand->lParam = lprbbi->lParam;
 
-    if (lprbbi->fMask & RBBIM_LPARAM)
-	lpBand->lParam = lprbbi->lParam;
-
-    if (lprbbi->fMask & RBBIM_HEADERSIZE)
-	lpBand->cxHeader = lprbbi->cxHeader;
+	if (lprbbi->fMask & RBBIM_HEADERSIZE)
+	    lpBand->cxHeader = lprbbi->cxHeader;
+    }
 
     return TRUE;
 }
@@ -436,8 +487,38 @@
 
 // << REBAR_SetTooltips >>
 // << REBAR_SetUnicodeFormat >>
-// << REBAR_ShowBand >>
-// << REBAR_SizeToRect >>
+
+
+static LRESULT
+REBAR_ShowBand (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
+{
+    REBAR_INFO *infoPtr = REBAR_GetInfoPtr (wndPtr);
+
+    if (((INT32)wParam < 0) || ((INT32)wParam > infoPtr->uNumBands))
+	return FALSE;
+
+    if ((BOOL32)lParam)
+	FIXME (rebar, "show band %d\n", (INT32)wParam);
+    else
+	FIXME (rebar, "hide band %d\n", (INT32)wParam);
+
+    return TRUE;
+}
+
+
+static LRESULT
+REBAR_SizeToRect (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
+{
+    REBAR_INFO *infoPtr = REBAR_GetInfoPtr (wndPtr);
+    LPRECT32 lpRect = (LPRECT32)lParam;
+
+    if (lpRect == NULL)
+	return FALSE;
+
+    FIXME (rebar, "layout change not implemented!\n");
+
+    return TRUE;
+}
 
 
 
@@ -447,8 +528,7 @@
     REBAR_INFO *infoPtr;
 
     /* allocate memory for info structure */
-    infoPtr = (REBAR_INFO *)HeapAlloc (GetProcessHeap (), HEAP_ZERO_MEMORY,
-				       sizeof(REBAR_INFO));
+    infoPtr = (REBAR_INFO *)COMCTL32_Alloc (sizeof(REBAR_INFO));
     wndPtr->wExtra[0] = (DWORD)infoPtr;
 
     if (infoPtr == NULL) {
@@ -461,7 +541,7 @@
 	return 0;
     }
 
-
+    /* initialize info structure */
     infoPtr->clrText = CLR_NONE;
     infoPtr->clrText = RGB(0, 0, 0);
 
@@ -497,7 +577,7 @@
     }
 
     /* free rebar info data */
-    HeapFree (GetProcessHeap (), 0, infoPtr);
+    COMCTL32_Free (infoPtr);
 
     TRACE (rebar, "destroyed!\n");
     return 0;
@@ -505,6 +585,20 @@
 
 
 
+static LRESULT
+REBAR_Paint (WND *wndPtr, WPARAM32 wParam)
+{
+    HDC32 hdc;
+    PAINTSTRUCT32 ps;
+
+    hdc = wParam==0 ? BeginPaint32 (wndPtr->hwndSelf, &ps) : (HDC32)wParam;
+    REBAR_Refresh (wndPtr, hdc);
+    if (!wParam)
+	EndPaint32 (wndPtr->hwndSelf, &ps);
+    return 0;
+}
+
+
 
 LRESULT WINAPI
 REBAR_WindowProc (HWND32 hwnd, UINT32 uMsg, WPARAM32 wParam, LPARAM lParam)
@@ -529,7 +623,9 @@
 
 
 //	case RB_GETBANDINFO32W:
-//	case RB_GETBARHEIGHT:
+
+	case RB_GETBARHEIGHT:
+	    return REBAR_GetBarHeight (wndPtr, wParam, lParam);
 
 	case RB_GETBARINFO:
 	    return REBAR_GetBarInfo (wndPtr, wParam, lParam);
@@ -582,8 +678,12 @@
 
 //	case RB_SETTOOLTIPS:
 //	case RB_SETUNICODEFORMAT:
-//	case RB_SHOWBAND:
-//	case RB_SIZETORECT:
+
+	case RB_SHOWBAND:
+	    return REBAR_ShowBand (wndPtr, wParam, lParam);
+
+	case RB_SIZETORECT:
+	    return REBAR_SizeToRect (wndPtr, wParam, lParam);
 
 
 	case WM_CREATE:
@@ -597,8 +697,8 @@
 //	case WM_MOUSEMOVE:
 //	    return REBAR_MouseMove (wndPtr, wParam, lParam);
 
-//	case WM_PAINT:
-//	    return REBAR_Paint (wndPtr, wParam);
+	case WM_PAINT:
+	    return REBAR_Paint (wndPtr, wParam);
 
 //	case WM_SETFONT:
 
@@ -624,12 +724,12 @@
     if (GlobalFindAtom32A (REBARCLASSNAME32A)) return;
 
     ZeroMemory (&wndClass, sizeof(WNDCLASS32A));
-    wndClass.style         = CS_GLOBALCLASS | CS_DBLCLKS | CS_SAVEBITS;
+    wndClass.style         = CS_GLOBALCLASS | CS_DBLCLKS;
     wndClass.lpfnWndProc   = (WNDPROC32)REBAR_WindowProc;
     wndClass.cbClsExtra    = 0;
     wndClass.cbWndExtra    = sizeof(REBAR_INFO *);
-    wndClass.hCursor       = LoadCursor32A (0, IDC_ARROW32A);
-    wndClass.hbrBackground = 0;
+    wndClass.hCursor       = 0;
+    wndClass.hbrBackground = (HBRUSH32) COLOR_BTNFACE + 1;
     wndClass.lpszClassName = REBARCLASSNAME32A;
  
     RegisterClass32A (&wndClass);
diff --git a/controls/status.c b/dlls/comctl32/status.c
similarity index 100%
rename from controls/status.c
rename to dlls/comctl32/status.c
diff --git a/dlls/comctl32/tab.c b/dlls/comctl32/tab.c
new file mode 100644
index 0000000..21eca63
--- /dev/null
+++ b/dlls/comctl32/tab.c
@@ -0,0 +1,392 @@
+/*
+ * Tab control
+ *
+ * Copyright 1998 Anders Carlsson
+ *
+ * TODO:
+ *  Image list support
+ *  Multiline support
+ *  Unicode support
+ *  Updown control support
+ *  Look and feel
+ *  Messages to be added in commctrl.h
+ *  ...
+ */
+
+#include "windows.h"
+#include "commctrl.h"
+#include "tab.h"
+#include "heap.h"
+#include "win.h"
+#include "debug.h"
+
+
+#define TAB_GetInfoPtr(wndPtr) ((TAB_INFO *)wndPtr->wExtra[0])
+
+static BOOL32
+TAB_SendSimpleNotify (WND *wndPtr, UINT32 code)
+{
+    NMHDR nmhdr;
+
+    nmhdr.hwndFrom = wndPtr->hwndSelf;
+    nmhdr.idFrom = wndPtr->wIDmenu;
+    nmhdr.code = code;
+
+    return (BOOL32) SendMessage32A (GetParent32 (wndPtr->hwndSelf), WM_NOTIFY,
+				    (WPARAM32) nmhdr.idFrom, (LPARAM) &nmhdr);
+}
+
+static LRESULT
+TAB_GetCurSel (WND *wndPtr)
+{
+    TAB_INFO *infoPtr = TAB_GetInfoPtr(wndPtr);
+ 
+    return infoPtr->iSelected;
+}
+
+static LRESULT
+TAB_LButtonUp (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
+{
+    TAB_INFO *infoPtr = TAB_GetInfoPtr(wndPtr);
+    POINT32 pt;
+    RECT32 rect;
+    INT32 iCount;
+
+    pt.x = (INT32)LOWORD(lParam);
+    pt.y = (INT32)HIWORD(lParam);
+
+    GetClientRect32 (wndPtr->hwndSelf, &rect);
+
+    if (PtInRect32 (&rect, pt))
+    {
+	for (iCount = 0; iCount < infoPtr->uNumItem; iCount++) {
+	    rect = infoPtr->items[iCount].rect;
+	    if (PtInRect32 (&rect, pt)) {
+		TRACE(tab, "On Tab, item %d\n", iCount);
+		
+		if (infoPtr->iSelected != iCount) {
+			infoPtr->iSelected = iCount;
+
+			TAB_SendSimpleNotify(wndPtr, TCN_SELCHANGE);
+		}
+		
+		return 0;
+	    }
+	}
+    }
+
+    return 0;
+}
+
+static void 
+TAB_SetItemBounds (WND *wndPtr)
+{
+    TAB_INFO *infoPtr = TAB_GetInfoPtr(wndPtr);
+    RECT32 rect;
+    HFONT32 hFont, hOldFont;
+    INT32 i, left;
+    SIZE32 size;
+    HDC32 hdc;
+
+    /* FIXME: Is this needed? */
+    GetClientRect32 (wndPtr->hwndSelf, &rect);
+    
+    hdc = GetDC32(wndPtr->hwndSelf); 
+    
+    hFont = infoPtr->hFont ? infoPtr->hFont : GetStockObject32 (SYSTEM_FONT);
+    hOldFont = SelectObject32 (hdc, hFont);
+
+    left = rect.left;
+    
+    for (i = 0; i < infoPtr->uNumItem; i++)
+    {
+	infoPtr->items[i].rect.left = left;
+	infoPtr->items[i].rect.top = infoPtr->rect.top;
+
+	GetTextExtentPoint32A(hdc, 
+			     infoPtr->items[i].pszText, 
+			     lstrlen32A(infoPtr->items[i].pszText), &size);
+	infoPtr->items[i].rect.right = left + size.cx+2*5;
+        infoPtr->items[i].rect.bottom = infoPtr->rect.top + 20;
+	TRACE(tab, "TextSize: %i - ", size.cx);
+	TRACE(tab, "Rect: T %i, L %i, B %i, R %i\n", 
+	      infoPtr->items[i].rect.top,
+	      infoPtr->items[i].rect.left,
+	      infoPtr->items[i].rect.bottom,
+	      infoPtr->items[i].rect.right);	
+	left += (size.cx + 11);
+    }
+
+    SelectObject32 (hdc, hOldFont);
+    ReleaseDC32 (wndPtr->hwndSelf, hdc);
+}
+				 
+static void
+TAB_DrawItem (WND *wndPtr, HDC32 hdc, INT32 iItem)
+{
+    TAB_INFO *infoPtr = TAB_GetInfoPtr(wndPtr);
+    TAB_ITEM *pti = &infoPtr->items[iItem];
+    RECT32 r;
+    INT32 oldBkMode;
+   
+    HPEN32	hwPen = CreatePen32 (PS_SOLID, 1, RGB (255, 255, 255 ));
+    HPEN32	hbPen = CreatePen32 (PS_SOLID, 1, GetSysColor32 (COLOR_BTNSHADOW));
+    HPEN32	hsdPen = CreatePen32(PS_SOLID, 1, GetSysColor32 (COLOR_BTNTEXT));
+    HPEN32	htmpPen = (HPEN32)NULL;
+
+    CopyRect32(&r, &pti->rect);
+
+    htmpPen = hwPen;
+    htmpPen = SelectObject32 (hdc, htmpPen);
+    MoveToEx32 (hdc, r.left, r.bottom, NULL);
+    LineTo32 (hdc, r.left, r.top + 2);
+    LineTo32 (hdc, r.left +2, r.top);
+
+    LineTo32 (hdc, r.right -1, r.top);
+    htmpPen = SelectObject32 (hdc, htmpPen);
+
+    htmpPen = SelectObject32 (hdc, hbPen);
+    MoveToEx32 (hdc, r.right-1, r.top, NULL);
+    LineTo32 (hdc,r.right-1, r.bottom-1);
+    hbPen = SelectObject32 (hdc, hsdPen);
+    MoveToEx32 (hdc, r.right, r.top+1, NULL);
+    LineTo32(hdc, r.right,r.bottom);
+    hsdPen = SelectObject32(hdc,htmpPen); 
+    DeleteObject32(hwPen);
+    DeleteObject32(hbPen);
+    DeleteObject32(hsdPen);
+
+    oldBkMode = SetBkMode32(hdc, TRANSPARENT);
+    r.left += 3;
+    r.right -= 3;
+    SetTextColor32 (hdc, COLOR_BTNTEXT);
+    DrawText32A(hdc, pti->pszText, lstrlen32A(pti->pszText),
+	&r, DT_LEFT|DT_SINGLELINE|DT_VCENTER);
+    if (oldBkMode != TRANSPARENT)
+	SetBkMode32(hdc, oldBkMode);
+}
+
+static void
+TAB_DrawBorder (WND *wndPtr, HDC32 hdc)
+{
+    HPEN32 htmPen;
+    HPEN32 hwPen = GetStockObject32(WHITE_PEN);
+    HPEN32 hbPen = GetStockObject32(BLACK_PEN);
+    HPEN32 hShade = CreatePen32 ( PS_SOLID, 1, GetSysColor32 (COLOR_BTNSHADOW));
+    RECT32 rect;
+
+    htmPen = SelectObject32 (hdc, hwPen);
+    GetClientRect32 (wndPtr->hwndSelf, &rect);
+
+    MoveToEx32 (hdc, rect.left, rect.bottom, NULL);
+    LineTo32 (hdc, rect.left, rect.top+20); 
+
+    LineTo32 (hdc, rect.right, rect.top+20);
+
+    hwPen = SelectObject32 (hdc, htmPen);
+    LineTo32 (hdc, rect.right, rect.bottom );
+    LineTo32 (hdc, rect.left, rect.bottom);
+    hbPen = SelectObject32 (hdc, hShade );
+    MoveToEx32 (hdc, rect.right-1, rect.top+20, NULL);
+    LineTo32 (hdc, rect.right-1, rect.bottom-1);
+    LineTo32 (hdc, rect.left, rect.bottom-1);
+    hShade = SelectObject32(hdc, hShade);
+    DeleteObject32 (hShade);
+}
+
+    
+static void
+TAB_Refresh (WND *wndPtr, HDC32 hdc)
+{
+    TAB_INFO *infoPtr = TAB_GetInfoPtr(wndPtr);
+    HFONT32 hFont, hOldFont;
+    RECT32 rect;
+    HBRUSH32 hbrBk;
+    INT32 i;
+
+    TAB_DrawBorder (wndPtr, hdc);
+
+    for (i = 0; i < infoPtr->uNumItem; i++) {
+	TAB_DrawItem (wndPtr, hdc, i);
+    }
+
+}
+
+static LRESULT
+TAB_Paint (WND *wndPtr, WPARAM32 wParam)
+{
+    HDC32 hdc;
+    PAINTSTRUCT32 ps;
+    
+    hdc = wParam== 0 ? BeginPaint32 (wndPtr->hwndSelf, &ps) : (HDC32)wParam;
+    TAB_Refresh (wndPtr, hdc);
+    
+    if(!wParam)
+	EndPaint32 (wndPtr->hwndSelf, &ps);
+    return 0;
+}
+
+static LRESULT
+TAB_InsertItem (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
+{
+    TAB_INFO *infoPtr = TAB_GetInfoPtr(wndPtr);
+    TCITEM *pti;
+    HDC32  hdc;
+    INT32 iItem, len;
+
+    pti = (TCITEM*)lParam;
+    iItem = (INT32)wParam;
+
+    if (iItem < 0) return -1;
+    if (iItem > infoPtr->uNumItem)
+	iItem = infoPtr->uNumItem;
+
+    if (infoPtr->uNumItem == 0) {
+	infoPtr->items = HeapAlloc (GetProcessHeap (), HEAP_ZERO_MEMORY,
+				    sizeof (TAB_ITEM));
+	infoPtr->uNumItem++;
+    }
+    else {
+	TAB_ITEM *oldItems = infoPtr->items;
+
+	infoPtr->uNumItem++;
+	infoPtr->items = HeapAlloc (GetProcessHeap (), HEAP_ZERO_MEMORY,
+				    sizeof (TAB_ITEM) * infoPtr->uNumItem);
+	
+	/* pre insert copy */
+	if (iItem > 0) {
+	    memcpy (&infoPtr->items[0], &oldItems[0],
+		    iItem * sizeof(TAB_ITEM));
+	}
+
+	/* post insert copy */
+	if (iItem < infoPtr->uNumItem - 1) {
+	    memcpy (&infoPtr->items[iItem+1], &oldItems[iItem],
+		    (infoPtr->uNumItem - iItem) * sizeof(TAB_ITEM));
+
+	}
+	
+	HeapFree (GetProcessHeap (), 0, oldItems);
+    }
+
+    infoPtr->items[iItem].mask = pti->mask;
+    if (pti->mask & TCIF_TEXT) {
+	len = lstrlen32A (pti->pszText);
+	infoPtr->items[iItem].pszText = 
+	    HeapAlloc (GetProcessHeap (), HEAP_ZERO_MEMORY, len+1);
+	lstrcpy32A (infoPtr->items[iItem].pszText, pti->pszText);
+	infoPtr->items[iItem].cchTextMax = pti->cchTextMax;
+    }
+
+    
+
+    if (pti->mask & TCIF_IMAGE)
+	infoPtr->items[iItem].iImage = pti->iImage;
+
+    if (pti->mask & TCIF_PARAM)
+	infoPtr->items[iItem].lParam = pti->lParam;
+
+    hdc = GetDC32 (wndPtr->hwndSelf);
+    TAB_Refresh (wndPtr, hdc);
+    ReleaseDC32 (wndPtr->hwndSelf, hdc);
+
+    TRACE(tab, "[%04x]: added item %d '%s'\n",
+		wndPtr->hwndSelf, iItem, infoPtr->items[iItem].pszText);
+
+    TAB_SetItemBounds(wndPtr);
+    return iItem;
+}
+
+static LRESULT 
+TAB_Create (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
+{
+    TAB_INFO *infoPtr;
+
+    infoPtr = (TAB_INFO *)HeapAlloc (GetProcessHeap (), HEAP_ZERO_MEMORY,
+				     sizeof(TAB_INFO));
+    wndPtr->wExtra[0] = (DWORD)infoPtr;
+   
+    infoPtr->uNumItem = 0;
+    infoPtr->hFont = 0;
+    infoPtr->items = 0;
+    infoPtr->hcurArrow = LoadCursor32A (0, IDC_ARROW32A);
+    infoPtr->iSelected = -1;  
+  
+    TRACE(tab, "Created tab control, hwnd [%04x]\n", wndPtr->hwndSelf); 
+    return 0;
+}
+
+static LRESULT
+TAB_Destroy (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
+{
+    TAB_INFO *infoPtr = TAB_GetInfoPtr(wndPtr);
+    INT32 iItem;
+
+    if (infoPtr->items) {
+	for (iItem = 0; iItem < infoPtr->uNumItem; iItem++) {
+	    if (infoPtr->items[iItem].pszText)
+		HeapFree (GetProcessHeap (), 0, infoPtr->items[iItem].pszText);
+	}
+	HeapFree (GetProcessHeap (), 0, infoPtr->items);
+    }
+
+    HeapFree (GetProcessHeap (), 0, infoPtr);
+ 
+    return 0;
+}
+
+LRESULT WINAPI
+TAB_WindowProc (HWND32 hwnd, UINT32 uMsg, WPARAM32 wParam, LPARAM lParam)
+{
+    WND *wndPtr = WIN_FindWndPtr(hwnd);
+
+    switch (uMsg)
+    {
+
+	case TCM_GETCURSEL:
+	   return TAB_GetCurSel (wndPtr);
+
+	case TCM_INSERTITEM:
+	   return TAB_InsertItem (wndPtr, wParam, lParam);
+
+	case WM_CREATE:
+	    return TAB_Create (wndPtr, wParam, lParam);
+
+	case WM_DESTROY:
+	    return TAB_Destroy (wndPtr, wParam, lParam);
+
+	case WM_LBUTTONUP:
+	    return TAB_LButtonUp (wndPtr, wParam, lParam);
+	case WM_PAINT:
+	    return TAB_Paint (wndPtr, wParam);
+	
+	
+	default:
+	    if (uMsg >= WM_USER)
+		ERR (tab, "unknown msg %04x wp=%08x lp=%08lx\n",
+		     uMsg, wParam, lParam);
+	    return DefWindowProc32A (hwnd, uMsg, wParam, lParam);
+    }
+    return 0;
+}
+
+
+void
+TAB_Register (void)
+{
+    WNDCLASS32A wndClass;
+
+    if (GlobalFindAtom32A (WC_TABCONTROL32A)) return;
+
+    ZeroMemory (&wndClass, sizeof(WNDCLASS32A));
+    wndClass.style         = CS_GLOBALCLASS | CS_DBLCLKS | CS_SAVEBITS;
+    wndClass.lpfnWndProc   = (WNDPROC32)TAB_WindowProc;
+    wndClass.cbClsExtra    = 0;
+    wndClass.cbWndExtra    = sizeof(TAB_INFO *);
+    wndClass.hCursor       = LoadCursor32A (0, IDC_ARROW32A);
+    wndClass.hbrBackground = 0;
+    wndClass.lpszClassName = WC_TABCONTROL32A;
+ 
+    RegisterClass32A (&wndClass);
+}
+
diff --git a/controls/toolbar.c b/dlls/comctl32/toolbar.c
similarity index 93%
rename from controls/toolbar.c
rename to dlls/comctl32/toolbar.c
index 142ffb6..a1ac4e3 100644
--- a/controls/toolbar.c
+++ b/dlls/comctl32/toolbar.c
@@ -13,6 +13,7 @@
  *   - Tooltip support (almost complete).
  *   - Unicode suppport.
  *   - Internal COMMCTL32 bitmaps.
+ *   - Fix TOOLBAR_SetButtonInfo32A.
  *   - Fix TOOLBAR_Customize. (Customize dialog.)
  *
  * Testing:
@@ -26,6 +27,7 @@
  */
 
 #include "windows.h"
+#include "sysmetrics.h"
 #include "commctrl.h"
 #include "cache.h"
 #include "toolbar.h"
@@ -151,8 +153,12 @@
     if ((btnPtr->fsStyle & TBSTYLE_CHECK) &&
 	(btnPtr->fsState & TBSTATE_CHECKED)) {
 	HBRUSH32 hbr;
-	DrawEdge32 (hdc, &rc, EDGE_SUNKEN,
-		    BF_RECT | BF_MIDDLE | BF_ADJUST);
+	if (bFlat)
+	    DrawEdge32 (hdc, &rc, BDR_SUNKENOUTER,
+			BF_RECT | BF_MIDDLE | BF_ADJUST);
+	else
+	    DrawEdge32 (hdc, &rc, EDGE_SUNKEN,
+			BF_RECT | BF_MIDDLE | BF_ADJUST);
 
 	hbr = SelectObject32 (hdc, CACHE_GetPattern55AABrush ());
 	PatBlt32 (hdc, rc.left, rc.top, rc.right - rc.left,
@@ -248,7 +254,6 @@
     INT32 x, y, cx, cy;
     BOOL32 bVertical;
     SIZE32  sizeString;
-    RECT32 rect = {0, 0, 0, 0};
 
     TOOLBAR_CalcStrings (wndPtr, &sizeString);
 
@@ -267,10 +272,11 @@
     cx = infoPtr->nButtonWidth;
     cy = infoPtr->nButtonHeight;
     nRows = 1;
-    rect.top = y;
-    rect.left = x;
-    rect.bottom = y + cy;
-    rect.right = x;
+
+    infoPtr->rcBound.top = y;
+    infoPtr->rcBound.left = x;
+    infoPtr->rcBound.bottom = y + cy;
+    infoPtr->rcBound.right = x;
 
     btnPtr = infoPtr->buttons;
     for (i = 0; i < infoPtr->nNumButtons; i++, btnPtr++) {
@@ -300,7 +306,6 @@
 	else {
 	    /* this must be a button */
 	    cx = infoPtr->nButtonWidth;
-
 	}
 
 	btnPtr->rect.left   = x;
@@ -308,12 +313,12 @@
 	btnPtr->rect.right  = x + cx;
 	btnPtr->rect.bottom = y + cy;
 
-	if (rect.left > x)
-	    rect.left = x;
-	if (rect.right < x + cx)
-	    rect.right = x + cx;
-	if (rect.bottom < y + cy)
-	    rect.bottom = y + cy;
+	if (infoPtr->rcBound.left > x)
+	    infoPtr->rcBound.left = x;
+	if (infoPtr->rcBound.right < x + cx)
+	    infoPtr->rcBound.right = x + cx;
+	if (infoPtr->rcBound.bottom < y + cy)
+	    infoPtr->rcBound.bottom = y + cy;
 
 	if (infoPtr->hwndToolTip) {
 	    TTTOOLINFO32A ti;
@@ -338,8 +343,6 @@
     }
 
     infoPtr->nHeight = y + cy + BOTTOM_BORDER;
-    infoPtr->maxSize.cx = rect.right - rect.left;
-    infoPtr->maxSize.cy = rect.bottom - rect.top;
     TRACE (toolbar, "toolbar height %d\n", infoPtr->nHeight);
 }
 
@@ -550,22 +553,23 @@
 
     infoPtr->nNumButtons = nNewButtons;
 
-    /* insert new button data (bad implementation)*/
+    /* insert new button data */
     for (nCount = 0; nCount < nAddButtons; nCount++) {
-	infoPtr->buttons[nOldButtons+nCount].iBitmap   = lpTbb[nCount].iBitmap;
-	infoPtr->buttons[nOldButtons+nCount].idCommand = lpTbb[nCount].idCommand;
-	infoPtr->buttons[nOldButtons+nCount].fsState   = lpTbb[nCount].fsState;
-	infoPtr->buttons[nOldButtons+nCount].fsStyle   = lpTbb[nCount].fsStyle;
-	infoPtr->buttons[nOldButtons+nCount].dwData    = lpTbb[nCount].dwData;
-	infoPtr->buttons[nOldButtons+nCount].iString   = lpTbb[nCount].iString;
+	TBUTTON_INFO *btnPtr = &infoPtr->buttons[nOldButtons+nCount];
+	btnPtr->iBitmap   = lpTbb[nCount].iBitmap;
+	btnPtr->idCommand = lpTbb[nCount].idCommand;
+	btnPtr->fsState   = lpTbb[nCount].fsState;
+	btnPtr->fsStyle   = lpTbb[nCount].fsStyle;
+	btnPtr->dwData    = lpTbb[nCount].dwData;
+	btnPtr->iString   = lpTbb[nCount].iString;
 
-	if ((infoPtr->hwndToolTip) && !(lpTbb[nCount].fsStyle & TBSTYLE_SEP)) {
+	if ((infoPtr->hwndToolTip) && !(btnPtr->fsStyle & TBSTYLE_SEP)) {
 	    TTTOOLINFO32A ti;
 
 	    ZeroMemory (&ti, sizeof(TTTOOLINFO32A));
 	    ti.cbSize   = sizeof (TTTOOLINFO32A);
 	    ti.hwnd     = wndPtr->hwndSelf;
-	    ti.uId      = lpTbb[nCount].idCommand;
+	    ti.uId      = btnPtr->idCommand;
 	    ti.hinst    = 0;
 	    ti.lpszText = LPSTR_TEXTCALLBACK32A;
 
@@ -672,7 +676,7 @@
     INT32  x, y, cx, cy;
     UINT32 uPosFlags = 0;
 
-    TRACE (toolbar, "resizing!\n");
+    TRACE (toolbar, "resize forced!\n");
 
     parent = GetParent32 (wndPtr->hwndSelf);
     GetClientRect32(parent, &parent_rect);
@@ -693,7 +697,7 @@
 	uPosFlags |= SWP_NOMOVE;
 
     if (!(wndPtr->dwStyle & CCS_NODIVIDER))
-	cy += 2;
+	cy += sysMetrics[SM_CYEDGE];
 
     infoPtr->bAutoSize = TRUE;
     SetWindowPos32 (wndPtr->hwndSelf, HWND_TOP, parent_rect.left, parent_rect.top,
@@ -960,7 +964,6 @@
     if (lpTbInfo->cbSize < sizeof(LPTBBUTTONINFO32A)) return -1;
 
     nIndex = TOOLBAR_GetButtonIndex (infoPtr, (INT32)wParam);
-
     if (nIndex == -1)
 	return -1;
 
@@ -968,22 +971,16 @@
 
     if (lpTbInfo->dwMask & TBIF_COMMAND)
 	lpTbInfo->idCommand = btnPtr->idCommand;
-
     if (lpTbInfo->dwMask & TBIF_IMAGE)
 	lpTbInfo->iImage = btnPtr->iBitmap;
-
     if (lpTbInfo->dwMask & TBIF_LPARAM)
 	lpTbInfo->lParam = btnPtr->dwData;
-
     if (lpTbInfo->dwMask & TBIF_SIZE)
 	lpTbInfo->cx = (WORD)(btnPtr->rect.right - btnPtr->rect.left);
-
     if (lpTbInfo->dwMask & TBIF_STATE)
 	lpTbInfo->fsState = btnPtr->fsState;
-
     if (lpTbInfo->dwMask & TBIF_STYLE)
 	lpTbInfo->fsStyle = btnPtr->fsStyle;
-
     if (lpTbInfo->dwMask & TBIF_TEXT) {
 	if ((btnPtr->iString >= 0) || (btnPtr->iString < infoPtr->nNumStrings))
 	    lstrcpyn32A (lpTbInfo->pszText, 
@@ -1124,11 +1121,12 @@
     if (lpSize == NULL)
 	return FALSE;
 
-    lpSize->cx = infoPtr->maxSize.cx;
-    lpSize->cx = infoPtr->maxSize.cy;
+    lpSize->cx = infoPtr->rcBound.right - infoPtr->rcBound.left;
+    lpSize->cy = infoPtr->rcBound.bottom - infoPtr->rcBound.top;
 
     TRACE (toolbar, "maximum size %d x %d\n",
-	   infoPtr->maxSize.cx, infoPtr->maxSize.cy);
+	   infoPtr->rcBound.right - infoPtr->rcBound.left,
+	   infoPtr->rcBound.bottom - infoPtr->rcBound.top);
 
     return TRUE;
 }
@@ -1532,7 +1530,56 @@
 }
 
 
-// << TOOLBAR_SetButtonInfo >>
+static LRESULT
+TOOLBAR_SetButtonInfo32A (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
+{
+    TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr(wndPtr);
+    LPTBBUTTONINFO32A lptbbi = (LPTBBUTTONINFO32A)lParam;
+    TBUTTON_INFO *btnPtr;
+    INT32 nIndex;
+
+    if (lptbbi == NULL)
+	return FALSE;
+    if (lptbbi->cbSize < sizeof(LPTBBUTTONINFO32A))
+	return FALSE;
+    
+    nIndex = TOOLBAR_GetButtonIndex (infoPtr, (INT32)wParam);
+    if (nIndex == -1)
+	return FALSE;
+
+    btnPtr = &infoPtr->buttons[nIndex];
+    if (lptbbi->dwMask & TBIF_COMMAND)
+	btnPtr->idCommand = lptbbi->idCommand;
+    if (lptbbi->dwMask & TBIF_IMAGE)
+	btnPtr->iBitmap = lptbbi->iImage;
+    if (lptbbi->dwMask & TBIF_LPARAM)
+	btnPtr->dwData = lptbbi->lParam;
+//    if (lptbbi->dwMask & TBIF_SIZE)
+//	btnPtr->cx = lptbbi->cx;
+    if (lptbbi->dwMask & TBIF_STATE)
+	btnPtr->fsState = lptbbi->fsState;
+    if (lptbbi->dwMask & TBIF_STYLE)
+	btnPtr->fsStyle = lptbbi->fsStyle;
+
+    if (lptbbi->dwMask & TBIF_TEXT) {
+	if ((btnPtr->iString >= 0) || 
+	    (btnPtr->iString < infoPtr->nNumStrings)) {
+#if 0
+	    CHAR *lpString = infoPtr->strings[btnPtr->iString];
+	    INT32 len = lstrlen32A (lptbbi->pszText);
+
+	    lpString = HeapReAlloc (GetProcessHeap (), HEAP_ZERO_MEMORY, sizeof(char)*(len+1));
+
+#endif
+
+	}
+    }
+
+    return TRUE;
+}
+
+
+// << TOOLBAR_SetButtonInfo32W >>
 
 
 static LRESULT
@@ -1729,8 +1776,30 @@
 TOOLBAR_SetRows (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
 {
     TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr(wndPtr);
+    LPRECT32 lprc = (LPRECT32)lParam;
+    HDC32 hdc;
 
-    FIXME (toolbar, "support multiple rows!\n");
+    if (LOWORD(wParam) > 1) {
+
+	FIXME (toolbar, "multiple rows not supported!\n");
+
+    }
+
+    /* recalculate toolbar */
+    TOOLBAR_CalcToolbar (wndPtr);
+
+    /* return bounding rectangle */
+    if (lprc) {
+	lprc->left   = infoPtr->rcBound.left;
+	lprc->right  = infoPtr->rcBound.right;
+	lprc->top    = infoPtr->rcBound.top;
+	lprc->bottom = infoPtr->rcBound.bottom;
+    }
+
+    /* repaint toolbar */
+    hdc = GetDC32 (wndPtr->hwndSelf);
+    TOOLBAR_Refresh (wndPtr, hdc);
+    ReleaseDC32 (wndPtr->hwndSelf, hdc);
 
     return 0;
 }
@@ -1788,7 +1857,7 @@
 }
 
 
-static LRESULT
+__inline__ static LRESULT
 TOOLBAR_SetToolTips (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
 {
     TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr(wndPtr);
@@ -1997,7 +2066,6 @@
 	TOOLBAR_DrawButton (wndPtr, btnPtr, hdc);
 	ReleaseDC32 (wndPtr->hwndSelf, hdc);
     }
-    
 
     return 0;
 }
@@ -2113,13 +2181,11 @@
 // << TOOLBAR_NCActivate >>
 
 
-static LRESULT
+__inline__ static LRESULT
 TOOLBAR_NCCalcSize (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
 {
-    if (!(wndPtr->dwStyle & CCS_NODIVIDER)) {
-	LPRECT32 winRect  = (LPRECT32)lParam;
-	winRect->top += 2;   
-    }
+    if (!(wndPtr->dwStyle & CCS_NODIVIDER))
+	((LPRECT32)lParam)->top += sysMetrics[SM_CYEDGE];
 
     return DefWindowProc32A (wndPtr->hwndSelf, WM_NCCALCSIZE, wParam, lParam);
 }
@@ -2159,9 +2225,8 @@
 static LRESULT
 TOOLBAR_NCPaint (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
 {
-    HDC32 hdc;
-    RECT32 rect;
     HWND32 hwnd = wndPtr->hwndSelf;
+    HDC32 hdc;
 
     if ( wndPtr->dwStyle & WS_MINIMIZE ||
 	!WIN_IsWindowDrawable( wndPtr, 0 )) return 0; /* Nothing to do */
@@ -2179,22 +2244,8 @@
 	return 0;
     }
 
-    if (!(wndPtr->flags & WIN_MANAGED)) {
-	if (!(wndPtr->dwStyle & CCS_NODIVIDER)) {
-	    rect.left = wndPtr->rectClient.left;
-	    rect.top = wndPtr->rectClient.top - 2;
-	    rect.right = wndPtr->rectClient.right;
-
-	    SelectObject32 ( hdc, GetSysColorPen32 (COLOR_3DSHADOW));
-	    MoveToEx32 (hdc, rect.left, rect.top, NULL);
-	    LineTo32 (hdc, rect.right, rect.top);
-	    rect.top++;
-	    SelectObject32 ( hdc, GetSysColorPen32 (COLOR_3DHILIGHT));
-	    MoveToEx32 (hdc, rect.left, rect.top, NULL);
-	    LineTo32 (hdc, rect.right, rect.top);
-	}
-
-    }
+    if (!(wndPtr->flags & WIN_MANAGED) && !(wndPtr->dwStyle & CCS_NODIVIDER))
+	DrawEdge32 (hdc, &wndPtr->rectWindow, EDGE_ETCHED, BF_TOP);
 
     ReleaseDC32( hwnd, hdc );
 
@@ -2301,7 +2352,7 @@
 	}
 
 	if (!(wndPtr->dwStyle & CCS_NODIVIDER))
-	    cy += 2;
+	    cy += sysMetrics[SM_CYEDGE];
 
 	SetWindowPos32 (wndPtr->hwndSelf, 0, parent_rect.left, parent_rect.top,
 			cx, cy, uPosFlags | SWP_NOZORDER);
@@ -2310,8 +2361,19 @@
 }
 
 
+static LRESULT
+TOOLBAR_StyleChanged (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
+{
+    HDC32 hdc;
 
+    TOOLBAR_AutoSize (wndPtr, wParam, lParam);
 
+    hdc = GetDC32 (wndPtr->hwndSelf);
+    TOOLBAR_Refresh (wndPtr, hdc);
+    ReleaseDC32 (wndPtr->hwndSelf, hdc);
+
+    return 0;
+}
 
 
 
@@ -2487,7 +2549,9 @@
 	case TB_SETBITMAPSIZE:
 	    return TOOLBAR_SetBitmapSize (wndPtr, wParam, lParam);
 
-//	case TB_SETBUTTONINFO32A:		/* 4.71 */
+	case TB_SETBUTTONINFO32A:
+	    return TOOLBAR_SetButtonInfo32A (wndPtr, wParam, lParam);
+
 //	case TB_SETBUTTONINFO32W:		/* 4.71 */
 
 	case TB_SETBUTTONSIZE:
@@ -2554,8 +2618,6 @@
 	case WM_CREATE:
 	    return TOOLBAR_Create (wndPtr, wParam, lParam);
 
-//	case WM_COMMAND:
-
 	case WM_DESTROY:
 	    return TOOLBAR_Destroy (wndPtr, wParam, lParam);
 
@@ -2601,6 +2663,9 @@
 	case WM_SIZE:
 	    return TOOLBAR_Size (wndPtr, wParam, lParam);
 
+	case WM_STYLECHANGED:
+	    return TOOLBAR_StyleChanged (wndPtr, wParam, lParam);
+
 //	case WM_SYSCOLORCHANGE:
 
 //	case WM_WININICHANGE:
diff --git a/controls/tooltips.c b/dlls/comctl32/tooltips.c
similarity index 91%
rename from controls/tooltips.c
rename to dlls/comctl32/tooltips.c
index baf6971..93ea5f3 100644
--- a/controls/tooltips.c
+++ b/dlls/comctl32/tooltips.c
@@ -29,7 +29,9 @@
 #define ID_TIMER1  1    /* show delay timer */
 #define ID_TIMER2  2    /* auto pop timer */
 #define ID_TIMER3  3    /* tool leave timer */
-#define TT_SUBCLASS_PROP "CC32SubclassInfo"   /* property name of tooltip window handle */
+
+/* property name of tooltip window handle */
+#define TT_SUBCLASS_PROP "CC32SubclassInfo"
 
 #define TOOLTIPS_GetInfoPtr(wndPtr) ((TOOLTIPS_INFO *)wndPtr->wExtra[0])
 
@@ -160,6 +162,7 @@
     hdc = GetDC32 (wndPtr->hwndSelf);
     hOldFont = SelectObject32 (hdc, infoPtr->hFont);
     DrawText32A (hdc, infoPtr->szTipText, -1, &rc, uFlags);
+    GetTextExtentPoint32A (hdc, infoPtr->szTipText, lstrlen32A(infoPtr->szTipText), lpSize);
     SelectObject32 (hdc, hOldFont);
     ReleaseDC32 (wndPtr->hwndSelf, hdc);
 
@@ -337,8 +340,8 @@
 }
 
 
-static BOOL32
-TOOLTIPS_CheckTool (WND *wndPtr)
+static INT32
+TOOLTIPS_CheckTool (WND *wndPtr, BOOL32 bShowTest)
 {
     TOOLTIPS_INFO *infoPtr = TOOLTIPS_GetInfoPtr(wndPtr);
     POINT32 pt;
@@ -349,13 +352,23 @@
     hwndTool =
 	SendMessage32A (wndPtr->hwndSelf, TTM_WINDOWFROMPOINT, 0, (LPARAM)&pt);
     if (hwndTool == 0)
-	return FALSE;
+	return -1;
 
     ScreenToClient32 (hwndTool, &pt);
     nTool = TOOLTIPS_GetToolFromPoint (infoPtr, hwndTool, &pt);
+    if (nTool == -1)
+	return -1;
+
+#if 0
+    if (!(wndPtr->dwStyle & TTS_ALWAYSTIP) && bShowTest) {
+	if (!IsWindowEnabled32 (infoPtr->tools[infoPtr->nTool].hwnd))
+	    return -1;
+    }
+#endif
+
     TRACE (tooltips, "tool %d\n", nTool);
 
-    return (nTool != -1);
+    return nTool;
 }
 
 
@@ -383,7 +396,10 @@
     LPTTTOOLINFO32A lpToolInfo = (LPTTTOOLINFO32A)lParam;
     TTTOOL_INFO *toolPtr;
 
-    if (lpToolInfo == NULL) return FALSE;
+    if (lpToolInfo == NULL)
+	return FALSE;
+    if (lpToolInfo->cbSize < TTTOOLINFO_V1_SIZE32A)
+	return FALSE;
 
     TRACE (tooltips, "add tool (%x) %x %d%s!\n",
 	   wndPtr->hwndSelf, lpToolInfo->hwnd, lpToolInfo->uId,
@@ -436,7 +452,7 @@
     if (lpToolInfo->cbSize >= sizeof(TTTOOLINFO32A))
 	toolPtr->lParam = lpToolInfo->lParam;
 
-    /* install subclassing */
+    /* install subclassing hook */
     if (toolPtr->uFlags & TTF_SUBCLASS) {
 	if (toolPtr->uFlags & TTF_IDISHWND) {
 	    LPTT_SUBCLASS_INFO lpttsi =
@@ -453,7 +469,7 @@
 			    (HANDLE32)lpttsi);
 	    }
 	    else
-		ERR (tooltips, "A window tool must only be listed once!\n");
+		WARN (tooltips, "A window tool must only be listed once!\n");
 	}
 	else {
 	    LPTT_SUBCLASS_INFO lpttsi =
@@ -489,8 +505,12 @@
     TTTOOL_INFO *toolPtr;
     INT32 nTool;
 
-    if (lpToolInfo == NULL) return 0;
-    if (infoPtr->uNumTools == 0) return 0;
+    if (lpToolInfo == NULL)
+	return 0;
+    if (lpToolInfo->cbSize < TTTOOLINFO_V1_SIZE32A)
+	return 0;
+    if (infoPtr->uNumTools == 0)
+	return 0;
 
     nTool = TOOLTIPS_GetToolFromInfoA (infoPtr, lpToolInfo);
     if (nTool == -1) return 0;
@@ -575,8 +595,12 @@
     LPTTTOOLINFO32A lpToolInfo = (LPTTTOOLINFO32A)lParam;
     TTTOOL_INFO *toolPtr;
 
-    if (uIndex >= infoPtr->uNumTools) return FALSE;
-    if (lpToolInfo == NULL) return FALSE;
+    if (lpToolInfo == NULL)
+	return FALSE;
+    if (lpToolInfo->cbSize < TTTOOLINFO_V1_SIZE32A)
+	return FALSE;
+    if (uIndex >= infoPtr->uNumTools)
+	return FALSE;
 
     TRACE (tooltips, "index=%u\n", uIndex);
 
@@ -604,21 +628,26 @@
 TOOLTIPS_GetCurrentTool32A (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
 {
     TOOLTIPS_INFO *infoPtr = TOOLTIPS_GetInfoPtr(wndPtr);
-    LPTTTOOLINFO32A lpti = (LPTTTOOLINFO32A)lParam;
+    LPTTTOOLINFO32A lpToolInfo = (LPTTTOOLINFO32A)lParam;
     TTTOOL_INFO *toolPtr;
 
-    if (lpti) {
+    if (lpToolInfo == NULL)
+	return FALSE;
+    if (lpToolInfo->cbSize < TTTOOLINFO_V1_SIZE32A)
+	return FALSE;
+
+    if (lpToolInfo) {
 	if (infoPtr->nCurrentTool > -1) {
 	    toolPtr = &infoPtr->tools[infoPtr->nCurrentTool];
 
 	    /* copy tool data */
-	    lpti->uFlags   = toolPtr->uFlags;
-	    lpti->rect     = toolPtr->rect;
-	    lpti->hinst    = toolPtr->hinst;
-	    lpti->lpszText = toolPtr->lpszText;
+	    lpToolInfo->uFlags   = toolPtr->uFlags;
+	    lpToolInfo->rect     = toolPtr->rect;
+	    lpToolInfo->hinst    = toolPtr->hinst;
+	    lpToolInfo->lpszText = toolPtr->lpszText;
 
-	    if (lpti->cbSize >= sizeof(TTTOOLINFO32A))
-		lpti->lParam = toolPtr->lParam;
+	    if (lpToolInfo->cbSize >= sizeof(TTTOOLINFO32A))
+		lpToolInfo->lParam = toolPtr->lParam;
 
 	    return TRUE;
 	}
@@ -673,7 +702,7 @@
 }
 
 
-static LRESULT
+__inline__ static LRESULT
 TOOLTIPS_GetMaxTipWidth (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
 {
     TOOLTIPS_INFO *infoPtr = TOOLTIPS_GetInfoPtr(wndPtr);
@@ -686,16 +715,18 @@
 TOOLTIPS_GetText32A (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
 {
     TOOLTIPS_INFO *infoPtr = TOOLTIPS_GetInfoPtr(wndPtr);
-    LPTTTOOLINFO32A lpti = (LPTTTOOLINFO32A)lParam;
+    LPTTTOOLINFO32A lpToolInfo = (LPTTTOOLINFO32A)lParam;
     INT32 nTool;
 
-    if (!(lpti)) return 0;
-    if (lpti->cbSize < sizeof(TTTOOLINFO32A)) return 0;
+    if (lpToolInfo == NULL)
+	return 0;
+    if (lpToolInfo->cbSize < TTTOOLINFO_V1_SIZE32A)
+	return 0;
 
-    nTool = TOOLTIPS_GetToolFromInfoA (infoPtr, lpti);
+    nTool = TOOLTIPS_GetToolFromInfoA (infoPtr, lpToolInfo);
     if (nTool == -1) return 0;
 
-    lstrcpy32A (lpti->lpszText, infoPtr->tools[nTool].lpszText);
+    lstrcpy32A (lpToolInfo->lpszText, infoPtr->tools[nTool].lpszText);
 
     return 0;
 }
@@ -704,7 +735,7 @@
 // << TOOLTIPS_GetText32W >>
 
 
-static LRESULT
+__inline__ static LRESULT
 TOOLTIPS_GetTipBkColor (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
 {
     TOOLTIPS_INFO *infoPtr = TOOLTIPS_GetInfoPtr(wndPtr);
@@ -712,7 +743,7 @@
 }
 
 
-static LRESULT
+__inline__ static LRESULT
 TOOLTIPS_GetTipTextColor (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
 {
     TOOLTIPS_INFO *infoPtr = TOOLTIPS_GetInfoPtr(wndPtr);
@@ -720,7 +751,7 @@
 }
 
 
-static LRESULT
+__inline__ static LRESULT
 TOOLTIPS_GetToolCount (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
 {
     TOOLTIPS_INFO *infoPtr = TOOLTIPS_GetInfoPtr(wndPtr);
@@ -736,8 +767,12 @@
     TTTOOL_INFO *toolPtr;
     INT32 nTool;
 
-    if (lpToolInfo == NULL) return FALSE;
-    if (infoPtr->uNumTools == 0) return FALSE;
+    if (lpToolInfo == NULL)
+	return FALSE;
+    if (lpToolInfo->cbSize < TTTOOLINFO_V1_SIZE32A)
+	return FALSE;
+    if (infoPtr->uNumTools == 0)
+	return FALSE;
 
     nTool = TOOLTIPS_GetToolFromInfoA (infoPtr, lpToolInfo);
     if (nTool == -1) return FALSE;
@@ -804,10 +839,10 @@
     LPTTTOOLINFO32A lpti = (LPTTTOOLINFO32A)lParam;
     INT32 nTool;
 
-    if (!(lpti)) return 0;
-#if 0
-    if (lpti->cbSize < sizeof(TTTOOLINFO32A)) return 0;
-#endif
+    if (lpti == NULL)
+	return 0;
+    if (lpti->cbSize < TTTOOLINFO_V1_SIZE32A)
+	return FALSE;
 
     nTool = TOOLTIPS_GetToolFromInfoA (infoPtr, lpti);
     if (nTool == -1) return 0;
@@ -821,7 +856,7 @@
 // << TOOLTIPS_NewToolRect32W >>
 
 
-static LRESULT
+__inline__ static LRESULT
 TOOLTIPS_Pop (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
 {
     TOOLTIPS_INFO *infoPtr = TOOLTIPS_GetInfoPtr(wndPtr);
@@ -839,7 +874,7 @@
     LPMSG32 lpMsg = (LPMSG32)lParam;
     POINT32 pt;
 
-    if (lParam == NULL) {
+    if (lParam == 0) {
 	ERR (tooltips, "lpMsg == NULL!\n");
 	return 0;
     }
@@ -947,7 +982,7 @@
 }
 
 
-static LRESULT
+__inline__ static LRESULT
 TOOLTIPS_SetMaxTipWidth (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
 {
     TOOLTIPS_INFO *infoPtr = TOOLTIPS_GetInfoPtr(wndPtr);
@@ -959,7 +994,7 @@
 }
 
 
-static LRESULT
+__inline__ static LRESULT
 TOOLTIPS_SetTipBkColor (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
 {
     TOOLTIPS_INFO *infoPtr = TOOLTIPS_GetInfoPtr(wndPtr);
@@ -970,7 +1005,7 @@
 }
 
 
-static LRESULT
+__inline__ static LRESULT
 TOOLTIPS_SetTipTextColor (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
 {
     TOOLTIPS_INFO *infoPtr = TOOLTIPS_GetInfoPtr(wndPtr);
@@ -989,7 +1024,10 @@
     TTTOOL_INFO *toolPtr;
     INT32 nTool;
 
-    if (lpToolInfo == NULL) return 0;
+    if (lpToolInfo == NULL)
+	return 0;
+    if (lpToolInfo->cbSize < TTTOOLINFO_V1_SIZE32A)
+	return 0;
 
     nTool = TOOLTIPS_GetToolFromInfoA (infoPtr, lpToolInfo);
     if (nTool == -1) return 0;
@@ -1036,18 +1074,23 @@
     TOOLTIPS_INFO *infoPtr = TOOLTIPS_GetInfoPtr(wndPtr);
     LPTTTOOLINFO32A lpToolInfo = (LPTTTOOLINFO32A)lParam;
 
+    if (lpToolInfo == NULL)
+	return 0;
+    if (lpToolInfo->cbSize < TTTOOLINFO_V1_SIZE32A)
+	return FALSE;
+
     if ((BOOL32)wParam) {
 	/* activate */
 	infoPtr->nTrackTool = TOOLTIPS_GetToolFromInfoA (infoPtr, lpToolInfo);
 	if (infoPtr->nTrackTool != -1) {
 	    infoPtr->bTrackActive = TRUE;
 
-	    /* FIXME : show tool tip */
+	    /* FIXME : show tool tip ??? */
 	}
     }
     else {
 	/* deactivate */
-	/* FIXME : hide tool tip */
+	/* FIXME : hide tool tip ??? */
 
 	infoPtr->bTrackActive = FALSE;
 	infoPtr->nTrackTool = -1;
@@ -1094,7 +1137,10 @@
     TTTOOL_INFO *toolPtr;
     INT32 nTool;
 
-    if (lpToolInfo == NULL) return 0;
+    if (lpToolInfo == NULL)
+	return 0;
+    if (lpToolInfo->cbSize < TTTOOLINFO_V1_SIZE32A)
+	return FALSE;
 
     nTool = TOOLTIPS_GetToolFromInfoA (infoPtr, lpToolInfo);
     if (nTool == -1) return 0;
@@ -1140,7 +1186,7 @@
 TOOLTIPS_Create (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
 {
     TOOLTIPS_INFO *infoPtr;
-    LOGFONT32A logFont;
+    NONCLIENTMETRICS32A nclm;
 
     /* allocate memory for info structure */
     infoPtr = (TOOLTIPS_INFO *)HeapAlloc (GetProcessHeap (), HEAP_ZERO_MEMORY,
@@ -1158,8 +1204,9 @@
     infoPtr->clrBk   = GetSysColor32 (COLOR_INFOBK);
     infoPtr->clrText = GetSysColor32 (COLOR_INFOTEXT);
 
-    SystemParametersInfo32A( SPI_GETICONTITLELOGFONT, 0, &logFont, 0 );
-    infoPtr->hFont = CreateFontIndirect32A( &logFont );
+    nclm.cbSize = sizeof(NONCLIENTMETRICS32A);
+    SystemParametersInfo32A (SPI_GETNONCLIENTMETRICS, 0, &nclm, 0);
+    infoPtr->hFont = CreateFontIndirect32A (&nclm.lfStatusFont);
 
     infoPtr->nMaxTipWidth = -1;
     infoPtr->nTool = -1;
@@ -1253,8 +1300,24 @@
 TOOLTIPS_MouseMove (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
 {
     TOOLTIPS_INFO *infoPtr = TOOLTIPS_GetInfoPtr(wndPtr);
+    TTTOOL_INFO *toolPtr = &infoPtr->tools[infoPtr->nTool];
 
-    TOOLTIPS_Hide (wndPtr, infoPtr);
+    if (toolPtr->uFlags & TTF_TRANSPARENT) {
+#if 0
+	POINT32 pt;
+	RECT32  rc;
+
+	pt.x = (INT32)LOWORD(lParam);
+	pt.y = (INT32)HIWORD(lParam);
+
+	GetClientRect32 (toolPtr->hwnd, &rc);
+	ScreenToClient32 (toolPtr->hwnd, &pt);
+	if (PtInRect32 (&rc, pt))
+	    SendMessage32A (toolPtr->hwnd, WM_MOUSEMOVE, wParam, lParam);
+#endif
+    }
+    else
+	TOOLTIPS_Hide (wndPtr, infoPtr);
 
     return 0;
 }
@@ -1310,7 +1373,8 @@
     {
 	case ID_TIMER1:
 	    KillTimer32 (wndPtr->hwndSelf, ID_TIMER1);
-	    TOOLTIPS_Show (wndPtr, infoPtr);
+	    if (TOOLTIPS_CheckTool (wndPtr, TRUE) == infoPtr->nTool)
+		TOOLTIPS_Show (wndPtr, infoPtr);
 	    break;
 
 	case ID_TIMER2:
@@ -1319,7 +1383,7 @@
 
 	case ID_TIMER3:
 	    KillTimer32 (wndPtr->hwndSelf, ID_TIMER3);
-	    if (TOOLTIPS_CheckTool (wndPtr) == FALSE) {
+	    if (TOOLTIPS_CheckTool (wndPtr, FALSE) == -1) {
 		infoPtr->nTool = -1;
 		infoPtr->nOldTool = -1;
 		TOOLTIPS_Hide (wndPtr, infoPtr);
@@ -1334,14 +1398,15 @@
 TOOLTIPS_WinIniChange (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
 {
     TOOLTIPS_INFO *infoPtr = TOOLTIPS_GetInfoPtr(wndPtr);
-    LOGFONT32A logFont;
+    NONCLIENTMETRICS32A nclm;
 
     infoPtr->clrBk   = GetSysColor32 (COLOR_INFOBK);
     infoPtr->clrText = GetSysColor32 (COLOR_INFOTEXT);
 
     DeleteObject32 (infoPtr->hFont);
-    SystemParametersInfo32A( SPI_GETICONTITLELOGFONT, 0, &logFont, 0 );
-    infoPtr->hFont = CreateFontIndirect32A( &logFont );
+    nclm.cbSize = sizeof(NONCLIENTMETRICS32A);
+    SystemParametersInfo32A (SPI_GETNONCLIENTMETRICS, 0, &nclm, 0);
+    infoPtr->hFont = CreateFontIndirect32A (&nclm.lfStatusFont);
 
     return 0;
 }
diff --git a/dlls/comctl32/trackbar.c b/dlls/comctl32/trackbar.c
new file mode 100644
index 0000000..f80f433
--- /dev/null
+++ b/dlls/comctl32/trackbar.c
@@ -0,0 +1,901 @@
+/*
+ * Trackbar control
+ *
+ * Copyright 1998 Eric Kohl
+ *
+ * NOTES
+ *   Development in progress. Author needed! Any volunteers?
+ *   I will only improve this control once in a while.
+ *     Eric <ekohl@abo.rhein-zeitung.de>
+ *
+ * TODO:
+ *   - Some messages.
+ *   - display code.
+ *   - user interaction.
+ *   - tic handling.
+ *   - 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 rcClient, rcChannel;
+
+    GetClientRect32 (wndPtr->hwndSelf, &rcClient);
+
+    /* draw channel */
+    rcChannel = infoPtr->rcChannel;
+    DrawEdge32 (hdc, &rcChannel, EDGE_SUNKEN, BF_RECT | BF_ADJUST);
+    if (wndPtr->dwStyle & TBS_ENABLESELRANGE) {
+	/* fill the channel */
+	HBRUSH32 hbr = CreateSolidBrush32 (RGB(255,255,255));
+	FillRect32 (hdc, &rcChannel, hbr);
+	DeleteObject32 (hbr);
+    }
+
+    /* draw ticks */
+    if (!(wndPtr->dwStyle & TBS_NOTICKS)) {
+
+    }
+
+    /* draw thumb */
+    if (!(wndPtr->dwStyle & TBS_NOTHUMB)) {
+
+    }
+
+    if (infoPtr->bFocus)
+	DrawFocusRect32 (hdc, &rcClient);
+}
+
+
+static VOID
+TRACKBAR_Calc (WND *wndPtr, TRACKBAR_INFO *infoPtr, LPRECT32 lpRect)
+{
+    INT32 cyChannel;
+
+    if (wndPtr->dwStyle & TBS_ENABLESELRANGE)
+	cyChannel = MAX(infoPtr->uThumbLen - 8, 4);
+    else
+	cyChannel = 4;
+
+    /* calculate channel rect */
+    if (wndPtr->dwStyle & TBS_VERT) {
+	infoPtr->rcChannel.top = lpRect->top + 8;
+	infoPtr->rcChannel.bottom = lpRect->bottom - 8;
+
+	if (wndPtr->dwStyle & TBS_BOTH) {
+	    infoPtr->rcChannel.left = (lpRect->bottom - cyChannel ) / 2;
+	    infoPtr->rcChannel.right = (lpRect->bottom + cyChannel) / 2;
+	}
+	else if (wndPtr->dwStyle & TBS_LEFT) {
+	    infoPtr->rcChannel.left = lpRect->left + 10;
+	    infoPtr->rcChannel.right = infoPtr->rcChannel.left + cyChannel;
+	}
+	else {
+	    /* TBS_RIGHT */
+	    infoPtr->rcChannel.right = lpRect->right - 10;
+	    infoPtr->rcChannel.left = infoPtr->rcChannel.right - cyChannel;
+	}
+    }
+    else {
+	infoPtr->rcChannel.left = lpRect->left + 8;
+	infoPtr->rcChannel.right = lpRect->right - 8;
+
+	if (wndPtr->dwStyle & TBS_BOTH) {
+	    infoPtr->rcChannel.top = (lpRect->bottom - cyChannel ) / 2;
+	    infoPtr->rcChannel.bottom = (lpRect->bottom + cyChannel) / 2;
+	}
+	else if (wndPtr->dwStyle & TBS_TOP) {
+	    infoPtr->rcChannel.top = lpRect->top + 10;
+	    infoPtr->rcChannel.bottom = infoPtr->rcChannel.top + cyChannel;
+	}
+	else {
+	    /* TBS_BOTTOM */
+	    infoPtr->rcChannel.bottom = lpRect->bottom - 10;
+	    infoPtr->rcChannel.top = infoPtr->rcChannel.bottom - cyChannel;
+	}
+    }
+}
+
+
+static VOID
+TRACKBAR_AlignBuddies (WND *wndPtr, TRACKBAR_INFO *infoPtr)
+{
+    HWND32 hwndParent = GetParent32 (wndPtr->hwndSelf);
+    RECT32 rcSelf, rcBuddy;
+    INT32 x, y;
+
+    GetWindowRect32 (wndPtr->hwndSelf, &rcSelf);
+    MapWindowPoints32 (HWND_DESKTOP, hwndParent, (LPPOINT32)&rcSelf, 2);
+
+    /* align buddy left or above */
+    if (infoPtr->hwndBuddyLA) {
+	GetWindowRect32 (infoPtr->hwndBuddyLA, &rcBuddy);
+	MapWindowPoints32 (HWND_DESKTOP, hwndParent, (LPPOINT32)&rcBuddy, 2);
+
+	if (wndPtr->dwStyle & TBS_VERT) {
+	    x = (infoPtr->rcChannel.right + infoPtr->rcChannel.left) / 2 -
+		(rcBuddy.right - rcBuddy.left) / 2 + rcSelf.left;
+	    y = rcSelf.top - (rcBuddy.bottom - rcBuddy.top);
+	}
+	else {
+	    x = rcSelf.left - (rcBuddy.right - rcBuddy.left);
+	    y = (infoPtr->rcChannel.bottom + infoPtr->rcChannel.top) / 2 -
+		(rcBuddy.bottom - rcBuddy.top) / 2 + rcSelf.top;
+	}
+
+	SetWindowPos32 (infoPtr->hwndBuddyLA, 0, x, y, 0, 0,
+			SWP_NOZORDER | SWP_NOSIZE);
+    }
+
+
+    /* align buddy right or below */
+    if (infoPtr->hwndBuddyRB) {
+	GetWindowRect32 (infoPtr->hwndBuddyRB, &rcBuddy);
+	MapWindowPoints32 (HWND_DESKTOP, hwndParent, (LPPOINT32)&rcBuddy, 2);
+
+	if (wndPtr->dwStyle & TBS_VERT) {
+	    x = (infoPtr->rcChannel.right + infoPtr->rcChannel.left) / 2 -
+		(rcBuddy.right - rcBuddy.left) / 2 + rcSelf.left;
+	    y = rcSelf.bottom;
+	}
+	else {
+	    x = rcSelf.right;
+	    y = (infoPtr->rcChannel.bottom + infoPtr->rcChannel.top) / 2 -
+		(rcBuddy.bottom - rcBuddy.top) / 2 + rcSelf.top;
+	}
+	SetWindowPos32 (infoPtr->hwndBuddyRB, 0, x, y, 0, 0,
+			SWP_NOZORDER | SWP_NOSIZE);
+    }
+}
+
+
+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;
+}
+
+
+static LRESULT
+TRACKBAR_ClearTics (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
+{
+    TRACKBAR_INFO *infoPtr = TRACKBAR_GetInfoPtr(wndPtr);
+
+    if (infoPtr->tics) {
+	FIXME (trackbar, "is this correct??\n");
+	HeapFree (GetProcessHeap (), 0, infoPtr->tics);
+	infoPtr->tics = NULL;
+	infoPtr->uNumTics = 2;
+    }
+
+    if (wParam) {
+	HDC32 hdc = GetDC32 (wndPtr->hwndSelf);
+	TRACKBAR_Refresh (wndPtr, hdc);
+	ReleaseDC32 (wndPtr->hwndSelf, hdc);
+    }
+
+    return 0;
+}
+
+
+static LRESULT
+TRACKBAR_GetBuddy (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
+{
+    TRACKBAR_INFO *infoPtr = TRACKBAR_GetInfoPtr(wndPtr);
+
+    if (wParam)
+	/* buddy is left or above */
+	return (LRESULT)infoPtr->hwndBuddyLA;
+
+    /* buddy is right or below */
+    return (LRESULT) infoPtr->hwndBuddyRB;
+}
+
+
+static LRESULT
+TRACKBAR_GetChannelRect (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
+{
+    TRACKBAR_INFO *infoPtr = TRACKBAR_GetInfoPtr(wndPtr);
+    LPRECT32 lprc = (LPRECT32)lParam;
+
+    if (lprc == NULL)
+	return 0;
+
+    lprc->left   = infoPtr->rcChannel.left;
+    lprc->right  = infoPtr->rcChannel.right;
+    lprc->bottom = infoPtr->rcChannel.bottom;
+    lprc->top    = infoPtr->rcChannel.top;
+
+    return 0;
+}
+
+
+static LRESULT
+TRACKBAR_GetLineSize (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
+{
+    TRACKBAR_INFO *infoPtr = TRACKBAR_GetInfoPtr(wndPtr);
+
+    return infoPtr->nLineSize;
+}
+
+
+static LRESULT
+TRACKBAR_GetNumTics (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
+{
+    TRACKBAR_INFO *infoPtr = TRACKBAR_GetInfoPtr(wndPtr);
+
+    if (wndPtr->dwStyle & TBS_NOTICKS)
+	return 0;
+
+    return infoPtr->uNumTics;
+}
+
+
+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->uThumbLen;
+}
+
+
+
+// << TRACKBAR_GetThumbRect >>
+//	case TBM_GETTIC:
+//	case TBM_GETTICPOS:
+
+
+static LRESULT
+TRACKBAR_GetToolTips (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
+{
+    TRACKBAR_INFO *infoPtr = TRACKBAR_GetInfoPtr(wndPtr);
+
+    if (wndPtr->dwStyle & TBS_TOOLTIPS)
+	return (LRESULT)infoPtr->hwndToolTip;
+    return 0;
+}
+
+
+//	case TBM_GETUNICODEFORMAT:
+
+
+static LRESULT
+TRACKBAR_SetBuddy (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
+{
+    TRACKBAR_INFO *infoPtr = TRACKBAR_GetInfoPtr(wndPtr);
+    HWND32 hwndTemp;
+
+    if (wParam) {
+	/* buddy is left or above */
+	hwndTemp = infoPtr->hwndBuddyLA;
+	infoPtr->hwndBuddyLA = (HWND32)lParam;
+
+	FIXME (trackbar, "move buddy!\n");
+    }
+    else {
+	/* buddy is right or below */
+	hwndTemp = infoPtr->hwndBuddyRB;
+	infoPtr->hwndBuddyRB = (HWND32)lParam;
+
+	FIXME (trackbar, "move buddy!\n");
+    }
+
+    TRACKBAR_AlignBuddies (wndPtr, infoPtr);
+
+    return (LRESULT)hwndTemp;
+}
+
+
+static LRESULT
+TRACKBAR_SetLineSize (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
+{
+    TRACKBAR_INFO *infoPtr = TRACKBAR_GetInfoPtr(wndPtr);
+    INT32 nTemp = infoPtr->nLineSize;
+
+    infoPtr->nLineSize = (INT32)lParam;
+
+    return nTemp;
+}
+
+
+static LRESULT
+TRACKBAR_SetPageSize (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
+{
+    TRACKBAR_INFO *infoPtr = TRACKBAR_GetInfoPtr(wndPtr);
+    INT32 nTemp = infoPtr->nPageSize;
+
+    infoPtr->nPageSize = (INT32)lParam;
+
+    return nTemp;
+}
+
+
+static LRESULT
+TRACKBAR_SetPos (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
+{
+    TRACKBAR_INFO *infoPtr = TRACKBAR_GetInfoPtr(wndPtr);
+
+    infoPtr->nPos = (INT32)HIWORD(lParam);
+
+    if (infoPtr->nPos < infoPtr->nRangeMin)
+	infoPtr->nPos = infoPtr->nRangeMin;
+
+    if (infoPtr->nPos > infoPtr->nRangeMax)
+	infoPtr->nPos = infoPtr->nRangeMax;
+
+    if (wParam) {
+	HDC32 hdc = GetDC32 (wndPtr->hwndSelf);
+	TRACKBAR_Refresh (wndPtr, hdc);
+	ReleaseDC32 (wndPtr->hwndSelf, hdc);
+    }
+
+    return 0;
+}
+
+
+static LRESULT
+TRACKBAR_SetRange (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
+{
+    TRACKBAR_INFO *infoPtr = TRACKBAR_GetInfoPtr(wndPtr);
+
+    infoPtr->nRangeMin = (INT32)LOWORD(lParam);
+    infoPtr->nRangeMax = (INT32)HIWORD(lParam);
+
+    if (infoPtr->nPos < infoPtr->nRangeMin)
+	infoPtr->nPos = infoPtr->nRangeMin;
+
+    if (infoPtr->nPos > infoPtr->nRangeMax)
+	infoPtr->nPos = infoPtr->nRangeMax;
+
+    if (wParam) {
+	HDC32 hdc = GetDC32 (wndPtr->hwndSelf);
+	TRACKBAR_Refresh (wndPtr, hdc);
+	ReleaseDC32 (wndPtr->hwndSelf, hdc);
+    }
+
+    return 0;
+}
+
+
+static LRESULT
+TRACKBAR_SetRangeMax (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
+{
+    TRACKBAR_INFO *infoPtr = TRACKBAR_GetInfoPtr(wndPtr);
+
+    infoPtr->nRangeMax = (INT32)lParam;
+    if (infoPtr->nPos > infoPtr->nRangeMax)
+	infoPtr->nPos = infoPtr->nRangeMax;
+
+    if (wParam) {
+	HDC32 hdc = GetDC32 (wndPtr->hwndSelf);
+	TRACKBAR_Refresh (wndPtr, hdc);
+	ReleaseDC32 (wndPtr->hwndSelf, hdc);
+    }
+
+    return 0;
+}
+
+
+static LRESULT
+TRACKBAR_SetRangeMin (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
+{
+    TRACKBAR_INFO *infoPtr = TRACKBAR_GetInfoPtr(wndPtr);
+
+    infoPtr->nRangeMin = (INT32)lParam;
+    if (infoPtr->nPos < infoPtr->nRangeMin)
+	infoPtr->nPos = infoPtr->nRangeMin;
+
+    if (wParam) {
+	HDC32 hdc = GetDC32 (wndPtr->hwndSelf);
+	TRACKBAR_Refresh (wndPtr, hdc);
+	ReleaseDC32 (wndPtr->hwndSelf, hdc);
+    }
+
+    return 0;
+}
+
+
+static LRESULT
+TRACKBAR_SetSel (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
+{
+    TRACKBAR_INFO *infoPtr = TRACKBAR_GetInfoPtr(wndPtr);
+
+    if (!wndPtr->dwStyle & TBS_ENABLESELRANGE)
+	return 0;
+
+    infoPtr->nSelMin = (INT32)LOWORD(lParam);
+    infoPtr->nSelMax = (INT32)HIWORD(lParam);
+
+    if (infoPtr->nSelMin < infoPtr->nRangeMin)
+	infoPtr->nSelMin = infoPtr->nRangeMin;
+    if (infoPtr->nSelMax > infoPtr->nRangeMax)
+	infoPtr->nSelMax = infoPtr->nRangeMax;
+
+    if (wParam) {
+	HDC32 hdc = GetDC32 (wndPtr->hwndSelf);
+	TRACKBAR_Refresh (wndPtr, hdc);
+	ReleaseDC32 (wndPtr->hwndSelf, hdc);
+    }
+
+    return 0;
+}
+
+
+static LRESULT
+TRACKBAR_SetSelEnd (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
+{
+    TRACKBAR_INFO *infoPtr = TRACKBAR_GetInfoPtr(wndPtr);
+
+    if (!wndPtr->dwStyle & TBS_ENABLESELRANGE)
+	return 0;
+
+    infoPtr->nSelMax = (INT32)lParam;
+    if (infoPtr->nSelMax > infoPtr->nRangeMax)
+	infoPtr->nSelMax = infoPtr->nRangeMax;
+
+    if (wParam) {
+	HDC32 hdc = GetDC32 (wndPtr->hwndSelf);
+	TRACKBAR_Refresh (wndPtr, hdc);
+	ReleaseDC32 (wndPtr->hwndSelf, hdc);
+    }
+
+    return 0;
+}
+
+
+static LRESULT
+TRACKBAR_SetSelStart (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
+{
+    TRACKBAR_INFO *infoPtr = TRACKBAR_GetInfoPtr(wndPtr);
+
+    if (!wndPtr->dwStyle & TBS_ENABLESELRANGE)
+	return 0;
+
+    infoPtr->nSelMin = (INT32)lParam;
+    if (infoPtr->nSelMin < infoPtr->nRangeMin)
+	infoPtr->nSelMin = infoPtr->nRangeMin;
+
+    if (wParam) {
+	HDC32 hdc = GetDC32 (wndPtr->hwndSelf);
+	TRACKBAR_Refresh (wndPtr, hdc);
+	ReleaseDC32 (wndPtr->hwndSelf, hdc);
+    }
+
+    return 0;
+}
+
+
+static LRESULT
+TRACKBAR_SetThumbLength (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
+{
+    TRACKBAR_INFO *infoPtr = TRACKBAR_GetInfoPtr(wndPtr);
+
+    if (wndPtr->dwStyle & TBS_FIXEDLENGTH)
+	infoPtr->uThumbLen = (UINT32)wParam;
+
+    return 0;
+}
+
+
+static LRESULT
+TRACKBAR_SetTic (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
+{
+    TRACKBAR_INFO *infoPtr = TRACKBAR_GetInfoPtr(wndPtr);
+    INT32 nPos = (INT32)lParam;
+
+    if (nPos < infoPtr->nRangeMin)
+	return FALSE;
+    if (nPos > infoPtr->nRangeMax)
+	return FALSE;
+
+    FIXME (trackbar, "%d - empty stub!\n", nPos);
+
+    return TRUE;
+}
+
+
+//	case TBM_SETTICFREQ:
+
+
+static LRESULT
+TRACKBAR_SetTipSide (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
+{
+    TRACKBAR_INFO *infoPtr = TRACKBAR_GetInfoPtr(wndPtr);
+    INT32 fTemp = infoPtr->fLocation;
+
+    infoPtr->fLocation = (INT32)wParam;
+
+    return fTemp;
+}
+
+
+static LRESULT
+TRACKBAR_SetToolTips (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
+{
+    TRACKBAR_INFO *infoPtr = TRACKBAR_GetInfoPtr(wndPtr);
+
+    infoPtr->hwndToolTip = (HWND32)wParam;
+
+    return 0;
+}
+
+
+//	case TBM_SETUNICODEFORMAT:
+
+
+
+
+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->uThumbLen = 23;   /* initial thumb length */
+    infoPtr->uNumTics  = 2;    /* default start and end tic */
+
+
+    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);
+    InvalidateRect32 (wndPtr->hwndSelf, NULL, TRUE);
+
+    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 rcClient;
+
+    GetClientRect32 (wndPtr->hwndSelf, &rcClient);
+
+    TRACKBAR_Calc (wndPtr, infoPtr, &rcClient);
+    TRACKBAR_AlignBuddies (wndPtr, infoPtr);
+
+    return 0;
+}
+
+
+// << TRACKBAR_Timer >>
+// << TRACKBAR_WinIniChange >>
+
+
+LRESULT WINAPI
+TRACKBAR_WindowProc (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:
+	    return TRACKBAR_ClearTics (wndPtr, wParam, lParam);
+
+	case TBM_GETBUDDY:
+	    return TRACKBAR_GetBuddy (wndPtr, wParam, lParam);
+
+	case TBM_GETCHANNELRECT:
+	    return TRACKBAR_GetChannelRect (wndPtr, wParam, lParam);
+
+	case TBM_GETLINESIZE:
+	    return TRACKBAR_GetLineSize (wndPtr, wParam, lParam);
+
+	case TBM_GETNUMTICS:
+	    return TRACKBAR_GetNumTics (wndPtr, wParam, lParam);
+
+	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:
+	    return TRACKBAR_GetToolTips (wndPtr, wParam, lParam);
+
+//	case TBM_GETUNICODEFORMAT:
+
+	case TBM_SETBUDDY:
+	    return TRACKBAR_SetBuddy (wndPtr, wParam, lParam);
+
+	case TBM_SETLINESIZE:
+	    return TRACKBAR_SetLineSize (wndPtr, wParam, lParam);
+
+	case TBM_SETPAGESIZE:
+	    return TRACKBAR_SetPageSize (wndPtr, wParam, lParam);
+
+	case TBM_SETPOS:
+	    return TRACKBAR_SetPos (wndPtr, wParam, lParam);
+
+	case TBM_SETRANGE:
+	    return TRACKBAR_SetRange (wndPtr, wParam, lParam);
+
+	case TBM_SETRANGEMAX:
+	    return TRACKBAR_SetRangeMax (wndPtr, wParam, lParam);
+
+	case TBM_SETRANGEMIN:
+	    return TRACKBAR_SetRangeMin (wndPtr, wParam, lParam);
+
+	case TBM_SETSEL:
+	    return TRACKBAR_SetSel (wndPtr, wParam, lParam);
+
+	case TBM_SETSELEND:
+	    return TRACKBAR_SetSelEnd (wndPtr, wParam, lParam);
+
+	case TBM_SETSELSTART:
+	    return TRACKBAR_SetSelStart (wndPtr, wParam, lParam);
+
+	case TBM_SETTHUMBLENGTH:
+	    return TRACKBAR_SetThumbLength (wndPtr, wParam, lParam);
+
+	case TBM_SETTIC:
+	    return TRACKBAR_SetTic (wndPtr, wParam, lParam);
+
+//	case TBM_SETTICFREQ:
+
+	case TBM_SETTIPSIDE:
+	    return TRACKBAR_SetTipSide (wndPtr, wParam, lParam);
+
+	case TBM_SETTOOLTIPS:
+	    return TRACKBAR_SetToolTips (wndPtr, wParam, lParam);
+
+//	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)TRACKBAR_WindowProc;
+    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/dlls/comctl32/treeview.c
similarity index 75%
rename from controls/treeview.c
rename to dlls/comctl32/treeview.c
index 992b5d8..a4eac47 100644
--- a/controls/treeview.c
+++ b/dlls/comctl32/treeview.c
@@ -26,23 +26,43 @@
 
 
 static LRESULT
+TREEVIEW_GetImageList (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
+{
+    TREEVIEW_INFO *infoPtr = TREEVIEW_GetInfoPtr(wndPtr);
+
+    switch ((INT32)wParam) {
+	case TVSIL_NORMAL:
+	    return (LRESULT)infoPtr->himlNormal;
+
+	case TVSIL_STATE:
+	    return (LRESULT)infoPtr->himlState;
+    }
+
+    return (LRESULT)NULL;
+}
+
+
+
+
+static LRESULT
 TREEVIEW_SetImageList (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
 {
     TREEVIEW_INFO *infoPtr = TREEVIEW_GetInfoPtr(wndPtr);
     HIMAGELIST himlTemp;
 
-    if ((INT32)wParam == TVSIL_NORMAL) {
-	himlTemp = infoPtr->himlNormal;
-	infoPtr->himlNormal = (HIMAGELIST)lParam;
-    }
-    else if ((INT32)wParam == TVSIL_STATE) {
-	himlTemp = infoPtr->himlState;
-	infoPtr->himlState = (HIMAGELIST)lParam;
-    }
-    else
-	return 0;
+    switch ((INT32)wParam) {
+	case TVSIL_NORMAL:
+	    himlTemp = infoPtr->himlNormal;
+	    infoPtr->himlNormal = (HIMAGELIST)lParam;
+	    return (LRESULT)himlTemp;
 
-    return (LRESULT)himlTemp;
+	case TVSIL_STATE:
+	    himlTemp = infoPtr->himlState;
+	    infoPtr->himlState = (HIMAGELIST)lParam;
+	    return (LRESULT)himlTemp;
+    }
+
+    return (LRESULT)NULL;
 }
 
 
@@ -116,12 +136,12 @@
     switch (uMsg)
     {
 
-    case TVM_INSERTITEMA:
-      FIXME (treeview, "Unimplemented msg TVM_INSERTITEMA\n");
+    case TVM_INSERTITEM32A:
+      FIXME (treeview, "Unimplemented msg TVM_INSERTITEM32A\n");
       return 0;
 
-    case TVM_INSERTITEMW:
-      FIXME (treeview, "Unimplemented msg TVM_INSERTITEMW\n");
+    case TVM_INSERTITEM32W:
+      FIXME (treeview, "Unimplemented msg TVM_INSERTITEM32W\n");
       return 0;
 
     case TVM_DELETEITEM:
@@ -148,10 +168,8 @@
       FIXME (treeview, "Unimplemented msg TVM_SETINDENT\n");
       return 0;
 
-    case TVM_GETIMAGELIST:
-      FIXME (treeview, "Unimplemented msg TVM_GETIMAGELIST\n");
-      return 0;
-      //return TREEVIEW_GetImageList (wndPtr, wParam, lParam);
+	case TVM_GETIMAGELIST:
+	    return TREEVIEW_GetImageList (wndPtr, wParam, lParam);
 
 	case TVM_SETIMAGELIST:
 	    return TREEVIEW_SetImageList (wndPtr, wParam, lParam);
@@ -164,28 +182,28 @@
       FIXME (treeview, "Unimplemented msg TVM_SELECTITEM \n");
       return 0;
 
-    case TVM_GETITEMA:
-      FIXME (treeview, "Unimplemented msg TVM_GETITEMA\n");
+    case TVM_GETITEM32A:
+      FIXME (treeview, "Unimplemented msg TVM_GETITEM32A\n");
       return 0;
 
-    case TVM_GETITEMW:
-      FIXME (treeview, "Unimplemented msg TVM_GETITEMW\n");
+    case TVM_GETITEM32W:
+      FIXME (treeview, "Unimplemented msg TVM_GETITEM32W\n");
       return 0;
 
-    case TVM_SETITEMA:
-      FIXME (treeview, "Unimplemented msg TVM_SETITEMA\n");
+    case TVM_SETITEM32A:
+      FIXME (treeview, "Unimplemented msg TVM_SETITEM32A\n");
       return 0;
 
-    case TVM_SETITEMW:
-      FIXME (treeview, "Unimplemented msg TVM_SETITEMW\n");
+    case TVM_SETITEM32W:
+      FIXME (treeview, "Unimplemented msg TVM_SETITEM32W\n");
       return 0;
 
-    case TVM_EDITLABELA:
-      FIXME (treeview, "Unimplemented msg TVM_EDITLABELA \n");
+    case TVM_EDITLABEL32A:
+      FIXME (treeview, "Unimplemented msg TVM_EDITLABEL32A\n");
       return 0;
 
-    case TVM_EDITLABELW:
-      FIXME (treeview, "Unimplemented msg TVM_EDITLABELW \n");
+    case TVM_EDITLABEL32W:
+      FIXME (treeview, "Unimplemented msg TVM_EDITLABEL32W\n");
       return 0;
 
     case TVM_GETEDITCONTROL:
@@ -220,12 +238,12 @@
       FIXME (treeview, "Unimplemented msg TVM_ENDEDITLABELNOW\n");
       return 0;
 
-    case TVM_GETISEARCHSTRINGA:
-      FIXME (treeview, "Unimplemented msg TVM_GETISEARCHSTRINGA\n");
+    case TVM_GETISEARCHSTRING32A:
+      FIXME (treeview, "Unimplemented msg TVM_GETISEARCHSTRING32A\n");
       return 0;
 
-    case TVM_GETISEARCHSTRINGW:
-      FIXME (treeview, "Unimplemented msg TVM_GETISEARCHSTRINGW\n");
+    case TVM_GETISEARCHSTRING32W:
+      FIXME (treeview, "Unimplemented msg TVM_GETISEARCHSTRING32W\n");
       return 0;
 
     case TVM_SETTOOLTIPS:
@@ -261,8 +279,8 @@
 
 	default:
 	    if (uMsg >= WM_USER)
-	FIXME (treeview, "Unknown msg %04x wp=%08x lp=%08lx\n",
-		     uMsg, wParam, lParam);
+		FIXME (treeview, "Unknown msg %04x wp=%08x lp=%08lx\n",
+		       uMsg, wParam, lParam);
 	    return DefWindowProc32A (hwnd, uMsg, wParam, lParam);
     }
     return 0;
diff --git a/controls/updown.c b/dlls/comctl32/updown.c
similarity index 100%
rename from controls/updown.c
rename to dlls/comctl32/updown.c
diff --git a/dlls/shell32/Makefile.in b/dlls/shell32/Makefile.in
index 59a0004..2a7f204 100644
--- a/dlls/shell32/Makefile.in
+++ b/dlls/shell32/Makefile.in
@@ -17,8 +17,8 @@
 	shlfolder.c \
 	shlview.c
 
-RC_SRCS = \
-	shres.rc
+# RC_SRCS = \
+#	shres.rc
 
 all: check_wrc $(MODULE).o
 
diff --git a/dlls/shell32/contmenu.c b/dlls/shell32/contmenu.c
index 52ce253..9aa758c 100644
--- a/dlls/shell32/contmenu.c
+++ b/dlls/shell32/contmenu.c
@@ -6,6 +6,7 @@
 #include "windows.h"
 #include "winerror.h"
 #include "debug.h"
+#include "pidl.h"
 #include "shlobj.h"
 #include "shell32_main.h"
 
@@ -22,8 +23,9 @@
 static ULONG WINAPI IContextMenu_AddRef(LPCONTEXTMENU);
 static ULONG WINAPI IContextMenu_Release(LPCONTEXTMENU);
 static HRESULT WINAPI IContextMenu_QueryContextMenu(LPCONTEXTMENU , HMENU32 ,UINT32 ,UINT32 ,UINT32 ,UINT32);
-static HRESULT WINAPI IContextMenu_InvokeCommand(LPCONTEXTMENU, LPCMINVOKECOMMANDINFO);
+static HRESULT WINAPI IContextMenu_InvokeCommand(LPCONTEXTMENU, LPCMINVOKECOMMANDINFO32);
 static HRESULT WINAPI IContextMenu_GetCommandString(LPCONTEXTMENU , UINT32 ,UINT32 ,LPUINT32 ,LPSTR ,UINT32);
+static HRESULT WINAPI IContextMenu_HandleMenuMsg(LPCONTEXTMENU, UINT32, WPARAM32, LPARAM);
 
 BOOL32 IContextMenu_AllocPidlTable(LPCONTEXTMENU, DWORD);
 void IContextMenu_FreePidlTable(LPCONTEXTMENU);
@@ -33,10 +35,12 @@
 static struct IContextMenu_VTable cmvt = 
 {	IContextMenu_QueryInterface,
 	IContextMenu_AddRef,
-    IContextMenu_Release,
+	IContextMenu_Release,
 	IContextMenu_QueryContextMenu,
 	IContextMenu_InvokeCommand,
-	IContextMenu_GetCommandString
+	IContextMenu_GetCommandString,
+	IContextMenu_HandleMenuMsg,
+	(void *) 0xdeadbabe	/* just paranoia */
 };
 /**************************************************************************
 *  IContextMenu_QueryInterface
@@ -56,10 +60,11 @@
   }   
   else if(IsEqualIID(riid, &IID_IShellExtInit))  /*IShellExtInit*/
   { *ppvObj = (LPSHELLEXTINIT)this;
+    WARN(shell,"-- LPSHELLEXTINIT pointer requested\n");  
   }   
 
   if(*ppvObj)
-  { (*(LPCONTEXTMENU*)ppvObj)->lpvtbl->fnAddRef(this);      
+  { (*(LPCONTEXTMENU *)ppvObj)->lpvtbl->fnAddRef(this);      
     TRACE(shell,"-- Interface: (%p)->(%p)\n",ppvObj,*ppvObj);
     return S_OK;
   }
@@ -78,25 +83,23 @@
 *  IContextMenu_Release
 */
 static ULONG WINAPI IContextMenu_Release(LPCONTEXTMENU this)
-{ TRACE(shell,"(%p)->()\n",this);
-  if (!--(this->ref)) 
-  { TRACE(shell," destroying IContextMenu(%p)\n",this);
+{	TRACE(shell,"(%p)->()\n",this);
+	if (!--(this->ref)) 
+	{ TRACE(shell," destroying IContextMenu(%p)\n",this);
 
-	if(this->pSFParent)
+	  if(this->pSFParent)
 	  this->pSFParent->lpvtbl->fnRelease(this->pSFParent);
 
-	/*make sure the pidl is freed*/
-	if(this->aPidls)
-	{ IContextMenu_FreePidlTable(this);
+	  /*make sure the pidl is freed*/
+	  if(this->aPidls)
+	  { IContextMenu_FreePidlTable(this);
+	  }
+
+
+	  HeapFree(GetProcessHeap(),0,this);
+	  return 0;
 	}
-
-	if(this->pPidlMgr)
-   	  PidlMgr_Destructor(this->pPidlMgr);
-
-    HeapFree(GetProcessHeap(),0,this);
-    return 0;
-  }
-  return this->ref;
+	return this->ref;
 }
 
 /**************************************************************************
@@ -115,7 +118,6 @@
 	   cm->pSFParent->lpvtbl->fnAddRef(cm->pSFParent);
 
 	cm->aPidls = NULL;
-	cm->pPidlMgr = PidlMgr_Constructor();
 
 	IContextMenu_AllocPidlTable(cm, uItemCount);
     
@@ -125,10 +127,10 @@
 
 	cm->bAllValues = 1;
 	for(u = 0; u < uItemCount; u++)
-    { cm->bAllValues &= (cm->pPidlMgr->lpvtbl->fnIsValue(cm->pPidlMgr, aPidls[u]) ? 1 : 0);
+	{ cm->bAllValues &= (_ILIsValue(aPidls[u]) ? 1 : 0);
 	}
-    TRACE(shell,"(%p)->()\n",cm);
-    return cm;
+	TRACE(shell,"(%p)->()\n",cm);
+	return cm;
 }
 
 
@@ -210,12 +212,12 @@
 /**************************************************************************
 * IContextMenu_InvokeCommand()
 */
-static HRESULT WINAPI IContextMenu_InvokeCommand(LPCONTEXTMENU this, LPCMINVOKECOMMANDINFO lpcmi)
+static HRESULT WINAPI IContextMenu_InvokeCommand(LPCONTEXTMENU this, LPCMINVOKECOMMANDINFO32 lpcmi)
 {	LPITEMIDLIST      pidlTemp,pidlFQ;
-	SHELLEXECUTEINFO  sei;
+	SHELLEXECUTEINFO32A  sei;
 	int   i;
 
- 	TRACE(shell,"(%p)->(execinfo=%p)\n",this,lpcmi);    
+ 	TRACE(shell,"(%p)->(invcom=%p verb=%p)\n",this,lpcmi,lpcmi->lpVerb);    
 
 	if(HIWORD(lpcmi->lpVerb))
 	{ //the command is being sent via a verb
@@ -232,7 +234,7 @@
       	should never be invoked if there isn't at least one key item in the list.*/
 
         for(i = 0; this->aPidls[i]; i++)
-	    { if(!this->pPidlMgr->lpvtbl->fnIsValue(this->pPidlMgr, this->aPidls[i]))
+	    { if(!_ILIsValue(this->aPidls[i]))
             break;
         }
       
@@ -273,46 +275,56 @@
 						UINT32 uFlags,LPUINT32 lpReserved,LPSTR lpszName,UINT32 uMaxNameLen)
 {	HRESULT  hr = E_INVALIDARG;
 
-	TRACE(shell,"(%p)->(idcom=%x flags=%x %p name=%s len=%x)\n",this, idCommand, uFlags, lpReserved, lpszName, uMaxNameLen);
+	TRACE(shell,"(%p)->(idcom=%x flags=%x %p name=%p len=%x)\n",this, idCommand, uFlags, lpReserved, lpszName, uMaxNameLen);
 
- 	switch(uFlags)
+	switch(uFlags)
 	{ case GCS_HELPTEXT:
-        hr = E_NOTIMPL;
-        break;
+	    hr = E_NOTIMPL;
+	    break;
    
 	  case GCS_VERBA:
-        switch(idCommand)
-        { case IDM_RENAME:
-            strcpy((LPSTR)lpszName, "rename");
-            hr = NOERROR;
-            break;
-        }
-        break;
+	    switch(idCommand)
+	    { case IDM_RENAME:
+	        strcpy((LPSTR)lpszName, "rename");
+	        hr = NOERROR;
+	        break;
+	    }
+	    break;
 
-   /* NT 4.0 with IE 3.0x or no IE will always call this with GCS_VERBW. In this 
-   case, you need to do the lstrcpyW to the pointer passed.*/
+	     /* NT 4.0 with IE 3.0x or no IE will always call this with GCS_VERBW. In this 
+	     case, you need to do the lstrcpyW to the pointer passed.*/
 	  case GCS_VERBW:
-        switch(idCommand)
-        { case IDM_RENAME:
-            lstrcpyAtoW((LPWSTR)lpszName, "rename");
-            hr = NOERROR;
-            break;
-        }
-        break;
+	    switch(idCommand)
+	    { case IDM_RENAME:
+	        lstrcpyAtoW((LPWSTR)lpszName, "rename");
+	        hr = NOERROR;
+	        break;
+	    }
+	    break;
 
 	  case GCS_VALIDATE:
-        hr = NOERROR;
-        break;
+	    hr = NOERROR;
+	    break;
 	}
+	TRACE(shell,"-- (%p)->(name=%s)\n",this, lpszName);
 	return hr;
 }
-
+/**************************************************************************
+* IContextMenu_HandleMenuMsg()
+* NOTES
+*  should be only in IContextMenu2 and IContextMenu3
+*  is nevertheless called from word95
+*/
+static HRESULT WINAPI IContextMenu_HandleMenuMsg(LPCONTEXTMENU this, UINT32 uMsg,WPARAM32 wParam,LPARAM lParam)
+{	TRACE(shell,"(%p)->(msg=%x wp=%x lp=%lx)\n",this, uMsg, wParam, lParam);
+	return E_NOTIMPL;
+}
 /**************************************************************************
 *  IContextMenu_AllocPidlTable()
 */
 BOOL32 IContextMenu_AllocPidlTable(LPCONTEXTMENU this, DWORD dwEntries)
 {	//add one for NULL terminator
-	TRACE(shell,"(%p)->(entrys=%u)\n",this, dwEntries);
+	TRACE(shell,"(%p)->(entrys=%lu)\n",this, dwEntries);
 	dwEntries++;
 
 	this->aPidls = (LPITEMIDLIST*)SHAlloc(dwEntries * sizeof(LPITEMIDLIST));
@@ -327,17 +339,17 @@
 * IContextMenu_FreePidlTable()
 */
 void IContextMenu_FreePidlTable(LPCONTEXTMENU this)
-{   int   i;
+{	int   i;
 
 	TRACE(shell,"(%p)->()\n",this);
 
 	if(this->aPidls)
 	{ for(i = 0; this->aPidls[i]; i++)
-      { SHFree(this->aPidls[i]);
-      }
+	  { SHFree(this->aPidls[i]);
+	  }
    
-	SHFree(this->aPidls);
-	this->aPidls = NULL;
+	  SHFree(this->aPidls);
+	  this->aPidls = NULL;
 	}
 }
 
@@ -366,18 +378,16 @@
 	TRACE(shell,"(%p)->()\n",this);
 
 	if(this->aPidls)
-	{ if(this->pPidlMgr)
-	  { for(i = 0; this->aPidls[i]; i++){} /*get the number of items assigned to this object*/
-        if(i > 1)	/*you can't rename more than one item at a time*/
-        { return FALSE;
-        }
+	{ for(i = 0; this->aPidls[i]; i++){} /*get the number of items assigned to this object*/
+	    if(i > 1)	/*you can't rename more than one item at a time*/
+	    { return FALSE;
+	    }
 	    dwAttributes = SFGAO_CANRENAME;
 	    this->pSFParent->lpvtbl->fnGetAttributesOf(this->pSFParent, i,
         						 (LPCITEMIDLIST*)this->aPidls, &dwAttributes);
       
-      return dwAttributes & SFGAO_CANRENAME;
-      }
-	}	
+	    return dwAttributes & SFGAO_CANRENAME;
+	}
 	return FALSE;
 }
 
diff --git a/dlls/shell32/enumidlist.c b/dlls/shell32/enumidlist.c
index 4afff0c..960d6ac 100644
--- a/dlls/shell32/enumidlist.c
+++ b/dlls/shell32/enumidlist.c
@@ -18,7 +18,7 @@
 #include "winnls.h"
 #include "winproc.h"
 #include "commctrl.h"
-
+#include "pidl.h"
 #include "shell32_main.h"
 
 /* IEnumIDList Implementation */
@@ -63,27 +63,17 @@
 	lpeidl->mpLast=NULL;
 	lpeidl->mpCurrent=NULL;
 
-  TRACE(shell,"(%p)->(%s 0x%08lx %p)\n",lpeidl,debugstr_a(lpszPath),dwFlags,pResult);
-
-	lpeidl->mpPidlMgr=PidlMgr_Constructor();
-  if (!lpeidl->mpPidlMgr)
-	{ if (pResult)
-	  { *pResult=E_OUTOFMEMORY;
-			HeapFree(GetProcessHeap(),0,lpeidl);
-			return NULL;
-		}
-	}
+	TRACE(shell,"(%p)->(%s 0x%08lx %p)\n",lpeidl,debugstr_a(lpszPath),dwFlags,pResult);
 
 	if(!IEnumIDList_CreateEnumList(lpeidl, lpszPath, dwFlags))
-  { if(pResult)
-    { *pResult = E_OUTOFMEMORY;
-			HeapFree(GetProcessHeap(),0,lpeidl->mpPidlMgr);
-			HeapFree(GetProcessHeap(),0,lpeidl);
-			return NULL;
-		}
-  }
+	{ if(pResult)
+	  { *pResult = E_OUTOFMEMORY;
+	    HeapFree(GetProcessHeap(),0,lpeidl);
+	    return NULL;
+	  }
+	}
 
-  TRACE(shell,"-- (%p)->()\n",lpeidl);
+	TRACE(shell,"-- (%p)->()\n",lpeidl);
 	return lpeidl;
 }
 
@@ -128,8 +118,9 @@
 {	TRACE(shell,"(%p)->()\n",this);
 	if (!--(this->ref)) 
 	{ TRACE(shell," destroying IEnumIDList(%p)\n",this);
-		HeapFree(GetProcessHeap(),0,this);
-		return 0;
+	  IEnumIDList_DeleteList(this);
+	  HeapFree(GetProcessHeap(),0,this);
+	  return 0;
 	}
 	return this->ref;
 }
@@ -140,38 +131,38 @@
 
 static HRESULT WINAPI IEnumIDList_Next(
 	LPENUMIDLIST this,ULONG celt,LPITEMIDLIST * rgelt,ULONG *pceltFetched) 
-{ ULONG    i;
-  HRESULT  hr = S_OK;
-  LPITEMIDLIST  temp;
+{	ULONG    i;
+	HRESULT  hr = S_OK;
+	LPITEMIDLIST  temp;
 
 	TRACE(shell,"(%p)->(%ld,%p, %p)\n",this,celt,rgelt,pceltFetched);
 
-  /* It is valid to leave pceltFetched NULL when celt is 1. Some of explorer's
-     subsystems actually use it (and so may a third party browser)
-   */
-  if(pceltFetched)
-    *pceltFetched = 0;
+/* It is valid to leave pceltFetched NULL when celt is 1. Some of explorer's
+ * subsystems actually use it (and so may a third party browser)
+ */
+	if(pceltFetched)
+	  *pceltFetched = 0;
 
 	*rgelt=0;
 	
-  if(celt > 1 && !pceltFetched)
-  { return E_INVALIDARG;
+	if(celt > 1 && !pceltFetched)
+	{ return E_INVALIDARG;
 	}
 
-  for(i = 0; i < celt; i++)
-  { if(!(this->mpCurrent))
-    { hr =  S_FALSE;
-      break;
-    }
-    temp = ILClone(this->mpCurrent->pidl);
-    rgelt[i] = temp;
-    this->mpCurrent = this->mpCurrent->pNext;
-  }
-  if(pceltFetched)
-  {  *pceltFetched = i;
+	for(i = 0; i < celt; i++)
+	{ if(!(this->mpCurrent))
+	  { hr =  S_FALSE;
+	    break;
+	  }
+	  temp = ILClone(this->mpCurrent->pidl);
+	  rgelt[i] = temp;
+	  this->mpCurrent = this->mpCurrent->pNext;
+	}
+	if(pceltFetched)
+	{  *pceltFetched = i;
 	}
 
-  return hr;
+	return hr;
 }
 
 /**************************************************************************
@@ -215,96 +206,123 @@
  *  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;
-  DWORD dwDrivemap;
-  CHAR  szDriveName[4];
-  CHAR  szPath[MAX_PATH];
+{	LPITEMIDLIST	pidl=NULL;
+	LPPIDLDATA 	pData=NULL;
+	WIN32_FIND_DATA32A stffile;	
+	HANDLE32 hFile;
+	DWORD dwDrivemap;
+	CHAR  szDriveName[4];
+	CHAR  szPath[MAX_PATH];
     
-  TRACE(shell,"(%p)->(%s 0x%08lx) \n",this,debugstr_a(lpszPath),dwFlags);
+	TRACE(shell,"(%p)->(%s 0x%08lx) \n",this,debugstr_a(lpszPath),dwFlags);
 
-  if (lpszPath && lpszPath[0]!='\0')
-  { strcpy(szPath, lpszPath);
-    PathAddBackslash(szPath);
-    strcat(szPath,"*.*");
-  }
+	if (lpszPath && lpszPath[0]!='\0')
+	{ strcpy(szPath, lpszPath);
+	  PathAddBackslash(szPath);
+	  strcat(szPath,"*.*");
+	}
 
-  /*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.*/
+	/*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)
-    { TRACE (shell,"-- (%p)-> enumerate SHCONTF_FOLDERS (special) items\n",this);
+	  { TRACE (shell,"-- (%p)-> enumerate SHCONTF_FOLDERS (special) items\n",this);
   		//create the pidl for this item
-      pidl = this->mpPidlMgr->lpvtbl->fnCreateMyComputer(this->mpPidlMgr);
-      if(pidl)
-      { if(!IEnumIDList_AddToEnumList(this, pidl))
-        return FALSE;
-      }
-    }   
-    else if (lpszPath[0]=='\0') /* enumerate the drives*/
-    { TRACE (shell,"-- (%p)-> enumerate SHCONTF_FOLDERS (drives)\n",this);
-      dwDrivemap = GetLogicalDrives();
-      strcpy (szDriveName,"A:\\");
-      while (szDriveName[0]<='Z')
-      { if(dwDrivemap & 0x00000001L)
-        { pidl = this->mpPidlMgr->lpvtbl->fnCreateDrive(this->mpPidlMgr,szDriveName );
-      if(pidl)
-      { if(!IEnumIDList_AddToEnumList(this, pidl))
-          return FALSE;
-      }
-      }
-        szDriveName[0]++;
-        dwDrivemap = dwDrivemap >> 1;
-     }   
-    }
-    
-     else
-    { TRACE (shell,"-- (%p)-> enumerate SHCONTF_FOLDERS of %s\n",this,debugstr_a(szPath));
-      hFile = FindFirstFile32A(szPath,&stffile);
-      if ( hFile != INVALID_HANDLE_VALUE32 )
-      { do
-        { if ( (stffile.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) && strcmp (stffile.cFileName, ".") && strcmp (stffile.cFileName, ".."))
-          { 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));
+	    pidl = _ILCreateMyComputer();
+	    if(pidl)
+	    { pData = _ILGetDataPointer(pidl);
+	      pData->u.generic.dwSFGAO = SFGAO_HASPROPSHEET | SFGAO_READONLY | SFGAO_HASSUBFOLDER;
+	      if(!IEnumIDList_AddToEnumList(this, pidl))
+	        return FALSE;
+	    }
+	  }   
+	  else if (lpszPath[0]=='\0') /* enumerate the drives*/
+	  { TRACE (shell,"-- (%p)-> enumerate SHCONTF_FOLDERS (drives)\n",this);
+	    dwDrivemap = GetLogicalDrives();
+	    strcpy (szDriveName,"A:\\");
+	    while (szDriveName[0]<='Z')
+	    { if(dwDrivemap & 0x00000001L)
+	      { pidl = _ILCreateDrive(szDriveName);
+	        pData = _ILGetDataPointer(pidl);
+	        pData->u.drive.dwSFGAO = SFGAO_HASPROPSHEET | SFGAO_READONLY | SFGAO_CANLINK | 
+		                 SFGAO_HASSUBFOLDER | SFGAO_DROPTARGET | SFGAO_FILESYSTEM;
+	        if(pidl)
+	        { if(!IEnumIDList_AddToEnumList(this, pidl))
+	          return FALSE;
+	        }
+	      }
+	      szDriveName[0]++;
+	      dwDrivemap = dwDrivemap >> 1;
+	    }   
+	  }
+    	  else
+	  { TRACE (shell,"-- (%p)-> enumerate SHCONTF_FOLDERS of %s\n",this,debugstr_a(szPath));
+	    hFile = FindFirstFile32A(szPath,&stffile);
+	    if ( hFile != INVALID_HANDLE_VALUE32 )
+	    { do
+	      { if ( (stffile.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) && strcmp (stffile.cFileName, ".") && strcmp (stffile.cFileName, ".."))
+	        { pidl = _ILCreateFolder( stffile.cFileName);
+	          if(pidl)
+	          { pData = _ILGetDataPointer(pidl);
+		    pData->u.folder.dwSFGAO = SFGAO_CANCOPY | SFGAO_CANDELETE | SFGAO_CANLINK  |
+		                     SFGAO_CANMOVE | SFGAO_CANRENAME | SFGAO_DROPTARGET |
+				     SFGAO_HASPROPSHEET | SFGAO_FILESYSTEM | SFGAO_FOLDER;
+		    if ( stffile.dwFileAttributes & FILE_ATTRIBUTE_READONLY)
+		    { pData->u.folder.dwSFGAO |= SFGAO_READONLY;
+		    }
+		    FileTimeToDosDateTime(&stffile.ftLastWriteTime,&pData->u.folder.uFileDate,&pData->u.folder.uFileTime);
+		    pData->u.folder.dwFileSize = stffile.nFileSizeLow;
+		    pData->u.folder.uFileAttribs=stffile.dwFileAttributes;
+		    strncpy (pData->u.folder.szAlternateName, stffile.cAlternateFileName,14);
+	            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)
-  { if(lpszPath)
-    { TRACE (shell,"-- (%p)-> enumerate SHCONTF_NONFOLDERS of %s\n",this,debugstr_a(szPath));
-      hFile = FindFirstFile32A(szPath,&stffile);
-      if ( hFile != INVALID_HANDLE_VALUE32 )
-      { do
-    { if (! (stffile.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) )
-          { pidl = this->mpPidlMgr->lpvtbl->fnCreateValue(this->mpPidlMgr, stffile.cFileName);
-      if(pidl)
-      { if(!IEnumIDList_AddToEnumList(this, pidl))
-        { return FALSE;
-			  }
-      }
-      else
-      { return FALSE;
-      }   
-          }
-    } while( FindNextFile32A(hFile,&stffile));
-	  FindClose32 (hFile);
-  } 
-    }
-  } 
-  return TRUE;
+	    }
+	  }   
+	}   
+	//enumerate the non-folder items (values)
+	if(dwFlags & SHCONTF_NONFOLDERS)
+	{ if(lpszPath)
+	  { TRACE (shell,"-- (%p)-> enumerate SHCONTF_NONFOLDERS of %s\n",this,debugstr_a(szPath));
+	    hFile = FindFirstFile32A(szPath,&stffile);
+	    if ( hFile != INVALID_HANDLE_VALUE32 )
+	    { do
+	      { if (! (stffile.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) )
+	        { pidl = _ILCreateValue( stffile.cFileName);
+	          if(pidl)
+	          { pData = _ILGetDataPointer(pidl);
+		    pData->u.file.dwSFGAO = SFGAO_CANCOPY | SFGAO_CANDELETE | SFGAO_CANLINK  |
+		                     SFGAO_CANMOVE | SFGAO_CANRENAME | SFGAO_DROPTARGET |
+				     SFGAO_HASPROPSHEET | SFGAO_FILESYSTEM;
+		    if ( stffile.dwFileAttributes & FILE_ATTRIBUTE_READONLY)
+		    { pData->u.file.dwSFGAO |= SFGAO_READONLY;
+		    }
+		    FileTimeToDosDateTime(&stffile.ftLastWriteTime,&pData->u.file.uFileDate,&pData->u.file.uFileTime);
+		    pData->u.file.dwFileSize = stffile.nFileSizeLow;
+		    pData->u.file.uFileAttribs=stffile.dwFileAttributes;
+		    strncpy (pData->u.file.szAlternateName, stffile.cAlternateFileName,14);
+	            if(!IEnumIDList_AddToEnumList(this, pidl))
+	            { return FALSE;
+	            }
+	          }
+	          else
+	          { return FALSE;
+	          }   
+	        }
+	      } while( FindNextFile32A(hFile,&stffile));
+	      FindClose32 (hFile);
+	    } 
+	  }
+	} 
+	return TRUE;
 }
 
 /**************************************************************************
@@ -314,7 +332,7 @@
 { LPENUMLIST  pNew;
 
   TRACE(shell,"(%p)->(pidl=%p)\n",this,pidl);
-  pNew = (LPENUMLIST)HeapAlloc(GetProcessHeap(),0,sizeof(ENUMLIST));
+  pNew = (LPENUMLIST)SHAlloc(sizeof(ENUMLIST));
   if(pNew)
   { //set the next pointer
     pNew->pNext = NULL;
diff --git a/dlls/shell32/folders.c b/dlls/shell32/folders.c
index e9e078c..75374f9 100644
--- a/dlls/shell32/folders.c
+++ b/dlls/shell32/folders.c
@@ -35,8 +35,8 @@
 static ULONG WINAPI IExtractIcon_AddRef(LPEXTRACTICON);
 static ULONG WINAPI IExtractIcon_AddRef(LPEXTRACTICON);
 static ULONG WINAPI IExtractIcon_Release(LPEXTRACTICON);
-static HRESULT IExtractIcon_GetIconLocation(LPEXTRACTICON, UINT32, LPSTR, UINT32, int *, UINT32 *);
-static HRESULT IExtractIcon_Extract(LPEXTRACTICON, LPCSTR, UINT32, HICON32 *, HICON32 *, UINT32);
+static HRESULT WINAPI IExtractIcon_GetIconLocation(LPEXTRACTICON, UINT32, LPSTR, UINT32, int *, UINT32 *);
+static HRESULT WINAPI IExtractIcon_Extract(LPEXTRACTICON, LPCSTR, UINT32, HICON32 *, HICON32 *, UINT32);
 
 /* IShellLink Implementation */
 static HRESULT WINAPI IShellLink_QueryInterface(LPSHELLLINK,REFIID,LPVOID*);
@@ -118,16 +118,22 @@
 * NOTE
 *  FIXME returns allways the icon no. 3 (closed Folder)
 */
-static HRESULT IExtractIcon_GetIconLocation(LPEXTRACTICON this, UINT32 uFlags, LPSTR szIconFile, UINT32 cchMax, int * piIndex, UINT32 * pwFlags)
+static HRESULT WINAPI IExtractIcon_GetIconLocation(LPEXTRACTICON this, UINT32 uFlags, LPSTR szIconFile, UINT32 cchMax, int * piIndex, UINT32 * pwFlags)
 { FIXME (shell,"(%p) (flags=%u file=%s max=%u %p %p) semi-stub\n", this, uFlags, szIconFile, cchMax, piIndex, pwFlags);
-  *pwFlags = GIL_NOTFILENAME;
-  *piIndex = 3;
-  return NOERROR;
+	if (!szIconFile)
+	{ *piIndex = 20;
+	}
+	else
+	{ *piIndex = 3;
+	}
+	*pwFlags = GIL_NOTFILENAME;
+
+	return NOERROR;
 }
 /**************************************************************************
 *  IExtractIcon_Extract
 */
-static HRESULT IExtractIcon_Extract(LPEXTRACTICON this, LPCSTR pszFile, UINT32 nIconIndex, HICON32 *phiconLarge, HICON32 *phiconSmall, UINT32 nIconSize)
+static HRESULT WINAPI IExtractIcon_Extract(LPEXTRACTICON this, LPCSTR pszFile, UINT32 nIconIndex, HICON32 *phiconLarge, HICON32 *phiconSmall, UINT32 nIconSize)
 { FIXME (shell,"(%p) (file=%s index=%u %p %p size=%u) semi-stub\n", this, pszFile, nIconIndex, phiconLarge, phiconSmall, nIconSize);
   *phiconLarge = pImageList_GetIcon(ShellBigIconList, nIconIndex, ILD_TRANSPARENT);
   *phiconSmall = pImageList_GetIcon(ShellSmallIconList, nIconIndex, ILD_TRANSPARENT);
diff --git a/dlls/shell32/pidl.c b/dlls/shell32/pidl.c
index 7b1440a..caed624 100644
--- a/dlls/shell32/pidl.c
+++ b/dlls/shell32/pidl.c
@@ -26,16 +26,18 @@
 #include "pidl.h"
 
 void pdump (LPCITEMIDLIST pidl)
-{ DWORD type;
-  CHAR * szData;
-  LPITEMIDLIST pidltemp = pidl;
-  TRACE(pidl,"---------- pidl=%p \n", pidl);
-  do
-  { szData = ((LPPIDLDATA )(pidltemp->mkid.abID))->szText;
-    type   = ((LPPIDLDATA )(pidltemp->mkid.abID))->type;
-    TRACE(pidl,"---- pidl=%p size=%u type=%lx %s\n",pidltemp, pidltemp->mkid.cb,type,debugstr_a(szData));
-    pidltemp = (LPITEMIDLIST)(((BYTE*)pidltemp)+pidltemp->mkid.cb);
-  } while (pidltemp->mkid.cb);
+{	DWORD type;
+	CHAR * szData;
+	LPITEMIDLIST pidltemp = pidl;
+	TRACE(pidl,"---------- pidl=%p \n", pidl);
+	do
+	{ type   = _ILGetDataPointer(pidltemp)->type;
+	  szData = _ILGetTextPointer(type, _ILGetDataPointer(pidltemp));
+
+	  TRACE(pidl,"---- pidl=%p size=%u type=%lx %s\n",pidltemp, pidltemp->mkid.cb,type,debugstr_a(szData));
+
+	  pidltemp = ILGetNext(pidltemp);
+	} while (pidltemp->mkid.cb);
 }
 /*************************************************************************
  * ILGetDisplayName			[SHELL32.15]
@@ -48,20 +50,18 @@
 /*************************************************************************
  * ILFindLastID [SHELL32.16]
  */
-LPSHITEMID WINAPI ILFindLastID(LPITEMIDLIST iil) 
-{	LPSHITEMID	lastsii,sii;
+LPITEMIDLIST WINAPI ILFindLastID(LPITEMIDLIST pidl) 
+{	LPITEMIDLIST   pidlLast = NULL;
 
- 	TRACE(pidl,"%p\n",iil);
-	if (!iil)
-	{ return NULL;
-    }
-	sii = &(iil->mkid);
-	lastsii = sii;
-	while (sii->cb)
-    { lastsii = sii;
-	  sii = (LPSHITEMID)(((char*)sii)+sii->cb);
+	TRACE(pidl,"(pidl=%p)\n",pidl);
+
+	if(pidl)
+	{ while(pidl->mkid.cb)
+	  { pidlLast = (LPITEMIDLIST)pidl;
+	    pidl = ILGetNext(pidl);
+	  }  
 	}
-	return lastsii;
+	return pidlLast;		
 }
 /*************************************************************************
  * ILRemoveLastID [SHELL32.17]
@@ -69,13 +69,11 @@
  *  Removes the last item 
  */
 BOOL32 WINAPI ILRemoveLastID(LPCITEMIDLIST pidl)
-{ LPCITEMIDLIST	xpidl;
-   
-  TRACE(shell,"pidl=%p\n",pidl);
-  if (!pidl || !pidl->mkid.cb)
-    return 0;
-  ILFindLastID(pidl)->cb = 0;
-  return 1;
+{	TRACE(shell,"pidl=%p\n",pidl);
+	if (!pidl || !pidl->mkid.cb)
+	  return 0;
+	ILFindLastID(pidl)->mkid.cb = 0;
+	return 1;
 }
 
 /*************************************************************************
@@ -181,7 +179,7 @@
 }
 /*************************************************************************
  * ILGetNext [SHELL32.153]
- *  gets the next simple pidl ot of a complex pidl
+ *  gets the next simple pidl of a complex pidl
  *
  * PARAMETERS
  *  pidl ITEMIDLIST
@@ -191,16 +189,16 @@
  *
  */
 LPITEMIDLIST WINAPI ILGetNext(LPITEMIDLIST pidl)
-{ LPITEMIDLIST nextpidl;
+{	LPITEMIDLIST nextpidl;
 
-  TRACE(pidl,"(pidl=%p)\n",pidl);
-  if(pidl)
-  { nextpidl = (LPITEMIDLIST)(LPBYTE)(((LPBYTE)pidl) + pidl->mkid.cb);
-	return nextpidl;
-  }
-  else
-  {  return (NULL);
-  }
+	TRACE(pidl,"(pidl=%p)\n",pidl);
+	if(pidl)
+	{ nextpidl = (LPITEMIDLIST)(LPBYTE)(((LPBYTE)pidl) + pidl->mkid.cb);
+	  return nextpidl;
+	}
+	else
+	{  return (NULL);
+	}
 }
 /*************************************************************************
  * ILAppend [SHELL32.154]
@@ -231,152 +229,83 @@
 }
 
 /**************************************************************************
-*	  INTERNAL CLASS pidlmgr
+* internal functions
 */
 
-static struct PidlMgr_VTable pmgrvt = {
-    PidlMgr_CreateDesktop,
-    PidlMgr_CreateMyComputer,
-	PidlMgr_CreateDrive,
-    PidlMgr_CreateFolder,
-    PidlMgr_CreateValue,
-    PidlMgr_GetDesktop,
-	PidlMgr_GetDrive,
-    PidlMgr_GetLastItem,
-    PidlMgr_GetItemText,
-    PidlMgr_IsDesktop,
-    PidlMgr_IsMyComputer,
-	PidlMgr_IsDrive,
-    PidlMgr_IsFolder,
-    PidlMgr_IsValue,
-    PidlMgr_HasFolders,
-    PidlMgr_GetFolderText,
-    PidlMgr_GetValueText,
-    PidlMgr_GetValueType,
-    PidlMgr_GetDataText,
-    PidlMgr_GetPidlPath,
-    PidlMgr_Create,
-    PidlMgr_GetData,
-    PidlMgr_GetDataPointer,
-    PidlMgr_SeparatePathAndValue
-};
 /**************************************************************************
- *	  PidlMgr_Constructor
+ *  _ILCreateDesktop()
+ *  _ILCreateMyComputer()
+ *  _ILCreateDrive()
+ *  _ILCreateFolder() 
+ *  _ILCreateValue()
  */
-LPPIDLMGR PidlMgr_Constructor() 
-{	LPPIDLMGR pmgr;
-	pmgr = (LPPIDLMGR)HeapAlloc(GetProcessHeap(),0,sizeof(pidlmgr));
-	pmgr->lpvtbl = &pmgrvt;
-	TRACE(pidl,"(%p)->()\n",pmgr);
-  /** FIXMEDllRefCount++;*/
-	return pmgr;
+LPITEMIDLIST WINAPI _ILCreateDesktop()
+{	TRACE(pidl,"()\n");
+	return _ILCreate(PT_DESKTOP, NULL, 0);
 }
-/**************************************************************************
- *	  PidlMgr_Destructor
- */
-void PidlMgr_Destructor(LPPIDLMGR this) 
-{	HeapFree(GetProcessHeap(),0,this);
- 	TRACE(pidl,"(%p)->()\n",this);
-  /** FIXMEDllRefCount--;*/
+LPITEMIDLIST WINAPI _ILCreateMyComputer()
+{ TRACE(pidl,"()\n");
+  return _ILCreate(PT_MYCOMP, (void *)"My Computer", strlen ("My Computer")+1);
 }
-
-/**************************************************************************
- *  PidlMgr_CreateDesktop()
- *  PidlMgr_CreateMyComputer()
- *  PidlMgr_CreateDrive()
- *  PidlMgr_CreateFolder() 
- *  PidlMgr_CreateValue()
- */
-LPITEMIDLIST PidlMgr_CreateDesktop(LPPIDLMGR this)
-{ TRACE(pidl,"(%p)->()\n",this);
-    return PidlMgr_Create(this,PT_DESKTOP, NULL, 0);
-}
-LPITEMIDLIST PidlMgr_CreateMyComputer(LPPIDLMGR this)
-{ TRACE(pidl,"(%p)->()\n",this);
-  return PidlMgr_Create(this,PT_MYCOMP, (void *)"My Computer", strlen ("My Computer")+1);
-}
-LPITEMIDLIST PidlMgr_CreateDrive(LPPIDLMGR this, LPCSTR lpszNew)
-{ char sTemp[4];
-  strncpy (sTemp,lpszNew,4);
+LPITEMIDLIST WINAPI _ILCreateDrive( LPCSTR lpszNew)
+{	char sTemp[4];
+	strncpy (sTemp,lpszNew,4);
 	sTemp[2]='\\';
 	sTemp[3]=0x00;
-  TRACE(pidl,"(%p)->(%s)\n",this,sTemp);
-  return PidlMgr_Create(this,PT_DRIVE,(LPVOID)&sTemp[0],4);
+	TRACE(pidl,"(%s)\n",sTemp);
+	return _ILCreate(PT_DRIVE,(LPVOID)&sTemp[0],4);
 }
-LPITEMIDLIST PidlMgr_CreateFolder(LPPIDLMGR this, LPCSTR lpszNew)
-{ TRACE(pidl,"(%p)->(%s)\n",this,lpszNew);
-  return PidlMgr_Create(this,PT_FOLDER, (LPVOID)lpszNew, strlen(lpszNew)+1);
+LPITEMIDLIST WINAPI _ILCreateFolder( LPCSTR lpszNew)
+{ TRACE(pidl,"(%s)\n",lpszNew);
+  return _ILCreate(PT_FOLDER, (LPVOID)lpszNew, strlen(lpszNew)+1);
 }
-LPITEMIDLIST PidlMgr_CreateValue(LPPIDLMGR this,LPCSTR lpszNew)
-{ TRACE(pidl,"(%p)->(%s)\n",this,lpszNew);
-  return PidlMgr_Create(this,PT_VALUE, (LPVOID)lpszNew, strlen(lpszNew)+1);
+LPITEMIDLIST WINAPI _ILCreateValue(LPCSTR lpszNew)
+{ TRACE(pidl,"(%s)\n",lpszNew);
+  return _ILCreate(PT_VALUE, (LPVOID)lpszNew, strlen(lpszNew)+1);
 }
 
 /**************************************************************************
- *  PidlMgr_GetDesktop()
- * 
- *  FIXME: quick hack
- */
-BOOL32 PidlMgr_GetDesktop(LPPIDLMGR this,LPCITEMIDLIST pidl,LPSTR pOut)
-{ TRACE(pidl,"(%p)->(%p %p)\n",this,pidl,pOut);
-  return (BOOL32)PidlMgr_GetData(this,PT_DESKTOP, pidl, (LPVOID)pOut, 255);
-}
-/**************************************************************************
- *  PidlMgr_GetDrive()
+ *  _ILGetDrive()
  *
  *  FIXME: quick hack
  */
-BOOL32 PidlMgr_GetDrive(LPPIDLMGR this,LPCITEMIDLIST pidl,LPSTR pOut, UINT16 uSize)
-{ LPITEMIDLIST   pidlTemp=NULL;
+BOOL32 WINAPI _ILGetDrive(LPCITEMIDLIST pidl,LPSTR pOut, UINT16 uSize)
+{	LPITEMIDLIST   pidlTemp=NULL;
 
-  TRACE(pidl,"(%p)->(%p,%p,%u)\n",this,pidl,pOut,uSize);
-  if(PidlMgr_IsMyComputer(this,pidl))
-  { pidlTemp = ILGetNext(pidl);
+	TRACE(pidl,"(%p,%p,%u)\n",pidl,pOut,uSize);
+	if(_ILIsMyComputer(pidl))
+	{ pidlTemp = ILGetNext(pidl);
 	}
-  else if (pidlTemp && PidlMgr_IsDrive(this,pidlTemp))
-  { return (BOOL32)PidlMgr_GetData(this,PT_DRIVE, pidlTemp, (LPVOID)pOut, uSize);
+	else if (pidlTemp && _ILIsDrive(pidlTemp))
+	{ return (BOOL32)_ILGetData(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(pidl,"(%p)->(pidl=%p)\n",this,pidl);
-
-  if(pidl)
-  { while(pidl->mkid.cb)
-    { pidlLast = (LPITEMIDLIST)pidl;
-      pidl = ILGetNext(pidl);
-    }  
-  }
-  return pidlLast;
-}
-/**************************************************************************
- *  PidlMgr_GetItemText()
+ *  _ILGetItemText()
  *  Gets the text for only this item
  */
-DWORD PidlMgr_GetItemText(LPPIDLMGR this,LPCITEMIDLIST pidl, LPSTR lpszText, UINT16 uSize)
-{ TRACE(pidl,"(%p)->(pidl=%p %p %x)\n",this,pidl,lpszText,uSize);
-  if (PidlMgr_IsMyComputer(this, pidl))
-  { return PidlMgr_GetData(this,PT_MYCOMP, pidl, (LPVOID)lpszText, uSize);
+DWORD WINAPI _ILGetItemText(LPCITEMIDLIST pidl, LPSTR lpszText, UINT16 uSize)
+{	TRACE(pidl,"(pidl=%p %p %x)\n",pidl,lpszText,uSize);
+	if (_ILIsMyComputer(pidl))
+	{ return _ILGetData(PT_MYCOMP, pidl, (LPVOID)lpszText, uSize);
 	}
-	if (PidlMgr_IsDrive(this, pidl))
-	{ return PidlMgr_GetData(this,PT_DRIVE, pidl, (LPVOID)lpszText, uSize);
+	if (_ILIsDrive(pidl))
+	{ return _ILGetData(PT_DRIVE, pidl, (LPVOID)lpszText, uSize);
 	}
-	return PidlMgr_GetData(this,PT_TEXT, pidl, (LPVOID)lpszText, uSize);	
+	if (_ILIsFolder (pidl))
+	{ return _ILGetData(PT_FOLDER, pidl, (LPVOID)lpszText, uSize);
+	}
+	return _ILGetData(PT_VALUE, pidl, (LPVOID)lpszText, uSize);	
 }
 /**************************************************************************
- *  PidlMgr_IsDesktop()
- *  PidlMgr_IsDrive()
- *  PidlMgr_IsFolder()
- *  PidlMgr_IsValue()
+ *  _ILIsDesktop()
+ *  _ILIsDrive()
+ *  _ILIsFolder()
+ *  _ILIsValue()
 */
-BOOL32 PidlMgr_IsDesktop(LPPIDLMGR this,LPCITEMIDLIST pidl)
-{ TRACE(pidl,"%p->(%p)\n",this,pidl);
+BOOL32 WINAPI _ILIsDesktop(LPCITEMIDLIST pidl)
+{ TRACE(pidl,"(%p)\n",pidl);
 
   if (! pidl)
     return FALSE;
@@ -384,239 +313,184 @@
   return (  pidl->mkid.cb == 0x00 );
 }
 
-BOOL32 PidlMgr_IsMyComputer(LPPIDLMGR this,LPCITEMIDLIST pidl)
+BOOL32 WINAPI _ILIsMyComputer(LPCITEMIDLIST pidl)
 { LPPIDLDATA  pData;
-  TRACE(pidl,"%p->(%p)\n",this,pidl);
+  TRACE(pidl,"(%p)\n",pidl);
 
   if (! pidl)
     return FALSE;
 
-  pData = PidlMgr_GetDataPointer(this,pidl);
+  pData = _ILGetDataPointer(pidl);
   return (PT_MYCOMP == pData->type);
 }
 
-BOOL32 PidlMgr_IsDrive(LPPIDLMGR this,LPCITEMIDLIST pidl)
+BOOL32 WINAPI _ILIsDrive(LPCITEMIDLIST pidl)
 { LPPIDLDATA  pData;
-  TRACE(pidl,"%p->(%p)\n",this,pidl);
+  TRACE(pidl,"(%p)\n",pidl);
 
   if (! pidl)
     return FALSE;
 
-  pData = PidlMgr_GetDataPointer(this,pidl);
+  pData = _ILGetDataPointer(pidl);
   return (PT_DRIVE == pData->type);
 }
 
-BOOL32 PidlMgr_IsFolder(LPPIDLMGR this,LPCITEMIDLIST pidl)
+BOOL32 WINAPI _ILIsFolder(LPCITEMIDLIST pidl)
 { LPPIDLDATA  pData;
-  TRACE(pidl,"%p->(%p)\n",this,pidl);
+  TRACE(pidl,"(%p)\n",pidl);
 
   if (! pidl)
     return FALSE;
 
-  pData = PidlMgr_GetDataPointer(this,pidl);
+  pData = _ILGetDataPointer(pidl);
   return (PT_FOLDER == pData->type);
 }
 
-BOOL32 PidlMgr_IsValue(LPPIDLMGR this,LPCITEMIDLIST pidl)
+BOOL32 WINAPI _ILIsValue(LPCITEMIDLIST pidl)
 { LPPIDLDATA  pData;
-  TRACE(pidl,"%p->(%p)\n",this,pidl);
+  TRACE(pidl,"(%p)\n",pidl);
 
   if (! pidl)
     return FALSE;
 
-  pData = PidlMgr_GetDataPointer(this,pidl);
+  pData = _ILGetDataPointer(pidl);
   return (PT_VALUE == pData->type);
 }
 /**************************************************************************
- * PidlMgr_HasFolders()
+ * _ILHasFolders()
  * fixme: quick hack
  */
-BOOL32 PidlMgr_HasFolders(LPPIDLMGR this, LPSTR pszPath, LPCITEMIDLIST pidl)
-{ BOOL32 bResult= FALSE;
-  WIN32_FIND_DATA32A stffile;	
-  HANDLE32 hFile;
+BOOL32 WINAPI _ILHasFolders( LPSTR pszPath, LPCITEMIDLIST pidl)
+{	BOOL32 bResult= FALSE;
+	WIN32_FIND_DATA32A stffile;	
+	HANDLE32 hFile;
 
-  TRACE(pidl,"(%p)->%p %p\n",this, pszPath, pidl);
+	TRACE(pidl,"%p %p\n", pszPath, pidl);
 	
-  hFile = FindFirstFile32A(pszPath,&stffile);
-  do
-  { if (! (stffile.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) )
-    {  bResult= TRUE;
-		}
-  } while( FindNextFile32A(hFile,&stffile));
-  FindClose32 (hFile);
+	hFile = FindFirstFile32A(pszPath,&stffile);
+	do
+	{ if (! (stffile.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) )
+	  {  bResult= TRUE;	  
+	  }
+	} while( FindNextFile32A(hFile,&stffile));
+	FindClose32 (hFile);
 	
 	return bResult;
 }
 
-
 /**************************************************************************
- *  PidlMgr_GetFolderText()
+ *  _ILGetFolderText()
  *  Creates a Path string from a PIDL, filtering out the special Folders 
  */
-DWORD PidlMgr_GetFolderText(LPPIDLMGR this,LPCITEMIDLIST pidl,
-   LPSTR lpszPath, DWORD dwSize)
-{ LPITEMIDLIST   pidlTemp;
-  DWORD          dwCopied = 0;
+DWORD WINAPI _ILGetFolderText(LPCITEMIDLIST pidl,LPSTR lpszPath, DWORD dwSize)
+{	LPITEMIDLIST	pidlTemp;
+	DWORD		dwCopied = 0;
+	LPSTR		pText;
  
-  TRACE(pidl,"(%p)->(%p)\n",this,pidl);
+	TRACE(pidl,"(%p)\n",pidl);
  
-  if(!pidl)
-  { return 0;
-  }
-
-  if(PidlMgr_IsMyComputer(this,pidl))
-  { pidlTemp = ILGetNext(pidl);
-    TRACE(pidl,"-- (%p)->skip My Computer\n",this);
-  }
-  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 = ILGetNext(pidlTemp);
-    }
-
-    //add one for the NULL terminator
-	TRACE(pidl,"-- (%p)->(size=%lu)\n",this,dwCopied);
-    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;
+	if(!pidl)
+	{ return 0;
 	}
-   
-    strcat(lpszPath, pData->szText);
-    strcat(lpszPath, "\\");
-    dwCopied += strlen(pData->szText) + 1;
-    pidlTemp = ILGetNext(pidlTemp);
 
-	TRACE(pidl,"-- (%p)->(size=%lu,%s)\n",this,dwCopied,lpszPath);
-  }
+	if(_ILIsMyComputer(pidl))
+	{ pidlTemp = ILGetNext(pidl);
+	  TRACE(pidl,"-- skip My Computer\n");
+	}
+	else
+	{ pidlTemp = (LPITEMIDLIST)pidl;
+	}
 
-  //remove the last backslash if necessary
-  if(dwCopied)
-  { if(*(lpszPath + strlen(lpszPath) - 1) == '\\')
-    { *(lpszPath + strlen(lpszPath) - 1) = 0;
-      dwCopied--;
-    }
-  }
-  TRACE(pidl,"-- (%p)->(path=%s)\n",this,lpszPath);
-  return dwCopied;
+	//if this is NULL, return the required size of the buffer
+	if(!lpszPath)
+	{ while(pidlTemp->mkid.cb)
+	  { LPPIDLDATA  pData = _ILGetDataPointer(pidlTemp);
+	    pText = _ILGetTextPointer(pData->type,pData);         
+
+	    /*add the length of this item plus one for the backslash
+	    fixme: is one to much, drive has its own backslash*/
+	    dwCopied += strlen(pText) + 1;  	    
+	    pidlTemp = ILGetNext(pidlTemp);
+	  }
+
+	  //add one for the NULL terminator
+	  TRACE(pidl,"-- (size=%lu)\n",dwCopied);
+	  return dwCopied + 1;
+	}
+
+	*lpszPath = 0;
+
+	while(pidlTemp->mkid.cb && (dwCopied < dwSize))
+	{ LPPIDLDATA  pData = _ILGetDataPointer(pidlTemp);
+
+	  //if this item is a value, then skip it and finish
+	  if(PT_VALUE == pData->type)
+	  { break;
+	  }
+	  pText = _ILGetTextPointer(pData->type,pData);   
+	  strcat(lpszPath, pText);
+	  PathAddBackslash(lpszPath);
+	  dwCopied += strlen(pText) + 1;
+	  pidlTemp = ILGetNext(pidlTemp);
+
+	  TRACE(pidl,"-- (size=%lu,%s)\n",dwCopied,lpszPath);
+	}
+
+	//remove the last backslash if necessary
+	if(dwCopied)
+	{ if(*(lpszPath + strlen(lpszPath) - 1) == '\\')
+	  { *(lpszPath + strlen(lpszPath) - 1) = 0;
+	    dwCopied--;
+	  }
+	}
+	TRACE(pidl,"-- (path=%s)\n",lpszPath);
+	return dwCopied;
 }
 
 
 /**************************************************************************
- *  PidlMgr_GetValueText()
+ *  _ILGetValueText()
  *  Gets the text for the last item in the list
  */
-DWORD PidlMgr_GetValueText(LPPIDLMGR this,
+DWORD WINAPI _ILGetValueText(
     LPCITEMIDLIST pidl, LPSTR lpszValue, DWORD dwSize)
-{ LPITEMIDLIST  pidlTemp=pidl;
-  CHAR          szText[MAX_PATH];
+{	LPITEMIDLIST  pidlTemp=pidl;
+	CHAR          szText[MAX_PATH];
 
-  TRACE(pidl,"(%p)->(pidl=%p %p 0x%08lx)\n",this,pidl,lpszValue,dwSize);
+	TRACE(pidl,"(pidl=%p %p 0x%08lx)\n",pidl,lpszValue,dwSize);
 
-  if(!pidl)
-  { return 0;
+	if(!pidl)
+	{ return 0;
 	}
 		
-  while(pidlTemp->mkid.cb && !PidlMgr_IsValue(this,pidlTemp))
-  { pidlTemp = ILGetNext(pidlTemp);
-  }
-
-  if(!pidlTemp->mkid.cb)
-  { return 0;
+	while(pidlTemp->mkid.cb && !_ILIsValue(pidlTemp))
+	{ pidlTemp = ILGetNext(pidlTemp);
 	}
 
-  PidlMgr_GetItemText(this, pidlTemp, szText, sizeof(szText));
+	if(!pidlTemp->mkid.cb)
+	{ return 0;
+	}
 
-  if(!lpszValue)
-  { return strlen(szText) + 1;
-  }
-  strcpy(lpszValue, szText);
-	TRACE(pidl,"-- (%p)->(pidl=%p %p=%s 0x%08lx)\n",this,pidl,lpszValue,lpszValue,dwSize);
-  return strlen(lpszValue);
+	_ILGetItemText( pidlTemp, szText, sizeof(szText));
+
+	if(!lpszValue)
+	{ return strlen(szText) + 1;
+	}
+	strcpy(lpszValue, szText);
+	TRACE(pidl,"-- (pidl=%p %p=%s 0x%08lx)\n",pidl,lpszValue,lpszValue,dwSize);
+	return strlen(lpszValue);
 }
 /**************************************************************************
- *  PidlMgr_GetValueType()
+ *  _ILGetDataText()
+ * NOTES
+ *  used from ShellView
  */
-BOOL32 PidlMgr_GetValueType( LPPIDLMGR this,
-   LPCITEMIDLIST pidlPath,
-   LPCITEMIDLIST pidlValue,
-   LPDWORD pdwType)
-{ LPSTR    lpszFolder,
-           lpszValueName;
-  DWORD    dwNameSize;
- 
-  FIXME(pidl,"(%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)
+DWORD WINAPI _ILGetDataText( LPCITEMIDLIST pidlPath, LPCITEMIDLIST pidlValue, LPSTR lpszOut, DWORD dwOutSize)
 { LPSTR    lpszFolder,
            lpszValueName;
   DWORD    dwNameSize;
 
-  FIXME(pidl,"(%p)->(pidl=%p pidl=%p) stub\n",this,pidlPath,pidlValue);
+  FIXME(pidl,"(pidl=%p pidl=%p) stub\n",pidlPath,pidlValue);
 
   if(!lpszOut || !pidlPath || !pidlValue)
   { return FALSE;
@@ -625,43 +499,42 @@
   /* fixme: get the driveletter*/
 
   //assemble the Folder string
-  dwNameSize = PidlMgr_GetFolderText(this,pidlPath, NULL, 0);
+  dwNameSize = _ILGetFolderText(pidlPath, NULL, 0);
   lpszFolder = (LPSTR)HeapAlloc(GetProcessHeap(),0,dwNameSize);
   if(!lpszFolder)
   {  return FALSE;
 	}
-  PidlMgr_GetFolderText(this,pidlPath, lpszFolder, dwNameSize);
+  _ILGetFolderText(pidlPath, lpszFolder, dwNameSize);
 
   //assemble the value name
-  dwNameSize = PidlMgr_GetValueText(this,pidlValue, NULL, 0);
+  dwNameSize = _ILGetValueText(pidlValue, NULL, 0);
   lpszValueName = (LPSTR)HeapAlloc(GetProcessHeap(),0,dwNameSize);
   if(!lpszValueName)
   { HeapFree(GetProcessHeap(),0,lpszFolder);
     return FALSE;
   }
-  PidlMgr_GetValueText(this,pidlValue, lpszValueName, dwNameSize);
+  _ILGetValueText(pidlValue, lpszValueName, dwNameSize);
 
   /* fixme: we've got the path now do something with it*/
 	
   HeapFree(GetProcessHeap(),0,lpszFolder);
   HeapFree(GetProcessHeap(),0,lpszValueName);
 
-  TRACE(pidl,"-- (%p)->(%p=%s 0x%08lx)\n",this,lpszOut,lpszOut,dwOutSize);
+  TRACE(pidl,"-- (%p=%s 0x%08lx)\n",lpszOut,lpszOut,dwOutSize);
 
 	return TRUE;
 }
 
 /**************************************************************************
- *   CPidlMgr::GetPidlPath()
+ *  _ILGetPidlPath()
  *  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)
+DWORD WINAPI _ILGetPidlPath( LPCITEMIDLIST pidl, LPSTR lpszOut, DWORD dwOutSize)
 { LPSTR lpszTemp;
   WORD	len;
 
-  TRACE(pidl,"(%p)->(%p,%lu)\n",this,lpszOut,dwOutSize);
+  TRACE(pidl,"(%p,%lu)\n",lpszOut,dwOutSize);
 
   if(!lpszOut)
   { return 0;
@@ -670,7 +543,7 @@
   *lpszOut = 0;
   lpszTemp = lpszOut;
 
-  dwOutSize -= PidlMgr_GetFolderText(this,pidl, lpszTemp, dwOutSize);
+  dwOutSize -= _ILGetFolderText(pidl, lpszTemp, dwOutSize);
 
   //add a backslash if necessary
   len = strlen(lpszTemp);
@@ -683,164 +556,165 @@
   lpszTemp = lpszOut + strlen(lpszOut);
 
   //add the value string
-  PidlMgr_GetValueText(this,pidl, lpszTemp, dwOutSize);
+  _ILGetValueText(pidl, lpszTemp, dwOutSize);
 
   //remove the last backslash if necessary
   if(*(lpszOut + strlen(lpszOut) - 1) == '\\')
   { *(lpszOut + strlen(lpszOut) - 1) = 0;
   }
 
-  TRACE(pidl,"-- (%p)->(%p=%s,%lu)\n",this,lpszOut,lpszOut,dwOutSize);
+  TRACE(pidl,"-- (%p=%s,%lu)\n",lpszOut,lpszOut,dwOutSize);
 
   return strlen(lpszOut);
 
 }
 
 /**************************************************************************
- *  PidlMgr_Create()
+ *  _ILCreate()
  *  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;
+LPITEMIDLIST WINAPI _ILCreate(PIDLTYPE type, LPVOID pIn, UINT16 uInSize)
+{	LPITEMIDLIST   pidlOut=NULL;
+	UINT16         uSize;
+	LPITEMIDLIST   pidlTemp=NULL;
+	LPPIDLDATA     pData;
+	LPSTR	pszDest;
+	
+	TRACE(pidl,"(%x %p %x)\n",type,pIn,uInSize);
 
-  TRACE(pidl,"(%p)->(%x %p %x)\n",this,type,pIn,uInSize);
-
-  if ( type == PT_DESKTOP)
-  {   pidlOut = SHAlloc(2);
-      pidlOut->mkid.cb=0x0000;
-      return pidlOut;
+	if ( type == PT_DESKTOP)
+	{ pidlOut = SHAlloc(2);
+	  pidlOut->mkid.cb=0x0000;
+	  return pidlOut;
 	}
 
-  if (! pIn)
+	if (! pIn)
 	{ return NULL;
 	}	
 
-  uSize = 2 + (sizeof(PIDLTYPE)) + uInSize + 2;  /* cb + PIDLTYPE + uInSize +2 */
-  pidlOut = SHAlloc(uSize);
-  pidlTemp = pidlOut;
-  if(pidlOut)
-  { pidlTemp->mkid.cb = uSize - 2;
-    pData =(LPPIDLDATA) &(pidlTemp->mkid.abID[0]);
-    pData->type = type;
-    switch(type)
-    { case PT_MYCOMP:
-        memcpy(pData->szText, pIn, uInSize);
-                       TRACE(pidl,"- (%p)->create My Computer: %s\n",this,debugstr_a(pData->szText));
-                       break;
-      case PT_DRIVE:
-        memcpy(pData->szText, pIn, uInSize);
-                       TRACE(pidl,"- (%p)->create Drive: %s\n",this,debugstr_a(pData->szText));
-											 break;
-      case PT_FOLDER:
-      case PT_VALUE:   
-        memcpy(pData->szText, pIn, uInSize);
-                       TRACE(pidl,"- (%p)->create Value: %s\n",this,debugstr_a(pData->szText));
-											 break;
-      default: 
-        FIXME(pidl,"- (%p) wrong argument\n",this);
-			                 break;
-    }
+	/* the sizes of: cb(2), pidldata-1, szText+1, next cb(2) */
+	switch (type)
+	{ case PT_DRIVE:
+	    uSize = 4 + 10;
+	    break;
+	  default:
+	    uSize = 4 + (sizeof(PIDLDATA)) + uInSize; 
+	 }   
+	pidlOut = SHAlloc(uSize);
+	pidlTemp = pidlOut;
+	if(pidlOut)
+	{ pidlTemp->mkid.cb = uSize - 2;
+	  pData =_ILGetDataPointer(pidlTemp);
+	  pszDest =  _ILGetTextPointer(type, pData);
+	  pData->type = type;
+	  switch(type)
+	  { case PT_MYCOMP:
+	      memcpy(pszDest, pIn, uInSize);
+	      TRACE(pidl,"- create My Computer: %s\n",debugstr_a(pszDest));
+	      break;
+	    case PT_DRIVE:
+	      memcpy(pszDest, pIn, uInSize);
+	      TRACE(pidl,"- create Drive: %s\n",debugstr_a(pszDest));
+	      break;
+	    case PT_FOLDER:
+	    case PT_VALUE:   
+	      memcpy(pszDest, pIn, uInSize);
+	      TRACE(pidl,"- create Value: %s\n",debugstr_a(pszDest));
+	      break;
+	    default: 
+	      FIXME(pidl,"-- wrong argument\n");
+	      break;
+	  }
    
-    pidlTemp = ILGetNext(pidlTemp);
-  pidlTemp->mkid.cb = 0x00;
-  }
-  TRACE(pidl,"-- (%p)->(pidl=%p, size=%u)\n",this,pidlOut,uSize-2);
-  return pidlOut;
+	  pidlTemp = ILGetNext(pidlTemp);
+	  pidlTemp->mkid.cb = 0x00;
+	}
+	TRACE(pidl,"-- (pidl=%p, size=%u)\n",pidlOut,uSize-2);
+	return pidlOut;
 }
 /**************************************************************************
- *  PidlMgr_GetData(PIDLTYPE, LPCITEMIDLIST, LPVOID, UINT16)
+ *  _ILGetData(PIDLTYPE, LPCITEMIDLIST, LPVOID, UINT16)
  */
-DWORD PidlMgr_GetData(
-    LPPIDLMGR this,
-		PIDLTYPE type, 
-    LPCITEMIDLIST pidl,
-		LPVOID pOut,
-		UINT16 uOutSize)
-{ LPPIDLDATA  pData;
-  DWORD       dwReturn=0; 
-
-	TRACE(pidl,"(%p)->(%x %p %p %x)\n",this,type,pidl,pOut,uOutSize);
+DWORD WINAPI _ILGetData(PIDLTYPE type, LPCITEMIDLIST pidl, LPVOID pOut, UINT16 uOutSize)
+{	LPPIDLDATA  pData;
+	DWORD       dwReturn=0; 
+	LPSTR	    pszSrc;
 	
-  if(!pidl)
-  {  return 0;
+	TRACE(pidl,"(%x %p %p %x)\n",type,pidl,pOut,uOutSize);
+	
+	if(!pidl)
+	{  return 0;
 	}
 
-  pData = PidlMgr_GetDataPointer(this,pidl);
+	*(LPSTR)pOut = 0;	 
 
-  //copy the data
-  switch(type)
-  { case PT_MYCOMP:  if(uOutSize < 1)
-                       return 0;
-                     if(PT_MYCOMP != pData->type)
-                       return 0;
-										 *(LPSTR)pOut = 0;	 
-                     strncpy((LPSTR)pOut, "My Computer", uOutSize);
-										 dwReturn = strlen((LPSTR)pOut);
-                     break;
+	pData = _ILGetDataPointer(pidl);
+	if ( pData->type != type)
+	{ ERR(pidl,"-- wrong type\n");
+	  return 0;
+	}
+	pszSrc = _ILGetTextPointer(pData->type, pData);
 
-	 case PT_DRIVE:    if(uOutSize < 1)
-                       return 0;
-                     if(PT_DRIVE != pData->type)
-                       return 0;
-										 *(LPSTR)pOut = 0;	 
-                     strncpy((LPSTR)pOut, pData->szText, uOutSize);
-										 dwReturn = strlen((LPSTR)pOut);
-                     break;
+	switch(type)
+	{ case PT_MYCOMP:
+	    if(uOutSize < 1)
+	      return 0;
+	    strncpy((LPSTR)pOut, "My Computer", 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;
-   default:     break;										 
-  }
-	TRACE(pidl,"-- (%p)->(%p=%s 0x%08lx)\n",this,pOut,(char*)pOut,dwReturn);
-  return dwReturn;
+	  case PT_DRIVE:
+	    if(uOutSize < 1)
+	      return 0;
+	    strncpy((LPSTR)pOut, pszSrc, uOutSize);
+	    dwReturn = strlen((LPSTR)pOut);
+	    break;
+
+	  case PT_FOLDER:
+	  case PT_VALUE: 
+	     strncpy((LPSTR)pOut, pszSrc, uOutSize);
+	     dwReturn = strlen((LPSTR)pOut);
+	     break;
+	  default:
+	    ERR(pidl,"-- unknown type\n");
+	    break;										 
+	}
+	TRACE(pidl,"-- (%p=%s 0x%08lx)\n",pOut,(char*)pOut,dwReturn);
+	return dwReturn;
 }
 
 
 /**************************************************************************
- *  PidlMgr_GetDataPointer()
+ *  _ILGetDataPointer()
  */
-LPPIDLDATA PidlMgr_GetDataPointer(LPPIDLMGR this,LPITEMIDLIST pidl)
-{ if(!pidl)
-  {  return NULL;
+LPPIDLDATA WINAPI _ILGetDataPointer(LPITEMIDLIST pidl)
+{	if(!pidl)
+	{ return NULL;
 	}
-	TRACE(pidl,"(%p)->(%p)\n"	,this, pidl);
-  return (LPPIDLDATA)(pidl->mkid.abID);
+	TRACE(pidl,"(%p)\n",  pidl);
+	return (LPPIDLDATA)(&pidl->mkid.abID);
 }
-
 /**************************************************************************
- *  CPidlMgr_SeparatePathAndValue)
- *  Creates a separate path and value PIDL from a fully qualified PIDL.
+ *  _ILGetTextPointer()
+ * gets a pointer to the string stored in the pidl
  */
-BOOL32 PidlMgr_SeparatePathAndValue(LPPIDLMGR this, 
-   LPITEMIDLIST pidlFQ, LPITEMIDLIST *ppidlPath, LPITEMIDLIST *ppidlValue)
-{ LPITEMIDLIST   pidlTemp;
-	TRACE(pidl,"(%p)->(pidl=%p pidl=%p pidl=%p)",this,pidlFQ,ppidlPath,ppidlValue);
-  if(!pidlFQ)
-  {  return FALSE;
+LPSTR WINAPI _ILGetTextPointer(PIDLTYPE type, LPPIDLDATA pidldata)
+{	TRACE(pidl,"(type=%x data=%p)\n", type, pidldata);
+
+	if(!pidldata)
+	{ return NULL;
 	}
-
-  *ppidlValue = PidlMgr_GetLastItem(this,pidlFQ);
-
-  if(!PidlMgr_IsValue(this,*ppidlValue))
-  { return FALSE;
+	switch (type)
+	{ case PT_DRIVE:
+	    return (LPSTR)&(pidldata->u.drive.szDriveName);
+	  case PT_MYCOMP:
+	  case PT_FOLDER:
+	  case PT_VALUE:
+	    return (LPSTR)&(pidldata->u.file.szText);
 	}
-
-  *ppidlValue = ILClone(*ppidlValue);
-  *ppidlPath = ILClone(pidlFQ);
-
-  pidlTemp = PidlMgr_GetLastItem(this,*ppidlPath);
-  pidlTemp->mkid.cb = 0x00;
-
-  return TRUE;
+	return NULL;
 }
diff --git a/dlls/shell32/pidl.h b/dlls/shell32/pidl.h
index 0817b53..03ca832 100644
--- a/dlls/shell32/pidl.h
+++ b/dlls/shell32/pidl.h
@@ -1,31 +1,100 @@
-/*	  INTERNAL CLASS pidlmgr */
-
+/*
+ * internal pidl functions
+ * 1998 <juergen.schmied@metronet.de>
+ *
+ * DO NOT use this definitions outside the shell32.dll !
+ *
+ * The contents of a pidl should never used from a application
+ * directly. 
+ *
+ * This stuff is used from SHGetFileAttributes, ShellFolder 
+ * EnumIDList and ShellView.
+ */
+ 
 #ifndef __WINE_PIDL_H
 #define __WINE_PIDL_H
+#include "shlobj.h"
 
-extern LPITEMIDLIST PidlMgr_CreateDesktop(LPPIDLMGR);
-extern LPITEMIDLIST PidlMgr_CreateMyComputer(LPPIDLMGR);
-extern LPITEMIDLIST PidlMgr_CreateDrive(LPPIDLMGR,LPCSTR);
-extern LPITEMIDLIST PidlMgr_CreateFolder(LPPIDLMGR,LPCSTR);
-extern LPITEMIDLIST PidlMgr_CreateValue(LPPIDLMGR,LPCSTR);
-extern BOOL32 PidlMgr_GetDesktop(LPPIDLMGR,LPCITEMIDLIST,LPSTR);
-extern BOOL32 PidlMgr_GetDrive(LPPIDLMGR,LPCITEMIDLIST,LPSTR,UINT16);
-extern LPITEMIDLIST PidlMgr_GetLastItem(LPPIDLMGR,LPCITEMIDLIST);
-extern DWORD PidlMgr_GetItemText(LPPIDLMGR,LPCITEMIDLIST,LPSTR,UINT16);
-extern BOOL32 PidlMgr_IsDesktop(LPPIDLMGR,LPCITEMIDLIST);
-extern BOOL32 PidlMgr_IsMyComputer(LPPIDLMGR,LPCITEMIDLIST);
-extern BOOL32 PidlMgr_IsDrive(LPPIDLMGR,LPCITEMIDLIST);
-extern BOOL32 PidlMgr_IsFolder(LPPIDLMGR,LPCITEMIDLIST);
-extern BOOL32 PidlMgr_IsValue(LPPIDLMGR,LPCITEMIDLIST);
-extern BOOL32 PidlMgr_HasFolders(LPPIDLMGR,LPSTR,LPCITEMIDLIST);
-extern DWORD PidlMgr_GetFolderText(LPPIDLMGR,LPCITEMIDLIST,LPSTR,DWORD);
-extern DWORD PidlMgr_GetValueText(LPPIDLMGR,LPCITEMIDLIST,LPSTR,DWORD);
-extern BOOL32 PidlMgr_GetValueType(LPPIDLMGR,LPCITEMIDLIST,LPCITEMIDLIST,LPDWORD);
-extern DWORD PidlMgr_GetDataText(LPPIDLMGR,LPCITEMIDLIST,LPCITEMIDLIST,LPSTR,DWORD);
-extern DWORD PidlMgr_GetPidlPath(LPPIDLMGR,LPCITEMIDLIST,LPSTR,DWORD);
-extern LPITEMIDLIST PidlMgr_Create(LPPIDLMGR,PIDLTYPE,LPVOID,UINT16);
-extern DWORD PidlMgr_GetData(LPPIDLMGR,PIDLTYPE,LPCITEMIDLIST,LPVOID,UINT16);
-extern LPPIDLDATA PidlMgr_GetDataPointer(LPPIDLMGR,LPCITEMIDLIST);
-extern BOOL32 PidlMgr_SeparatePathAndValue(LPPIDLMGR,LPITEMIDLIST,LPITEMIDLIST*,LPITEMIDLIST*);
+/* 
+* the pidl does cache fileattributes to speed up SHGetAttributes when
+* displaying a big number of files.
+*
+* a pidl of NULL means the desktop
+*
+* The structure of the pidl seens to be a union. The first byte of the
+* PIDLDATA desribes the type of pidl.
+*
+* first byte - 	my Computer	0x1F
+*		control/printer	0x2E
+*		drive		0x23 
+*		folder	 	0x31 
+* drive: the second byte is the start of a string
+*	  C  :  \ 
+*	 43 3A 5C
+* file: see the PIDLDATA structure	 
+*/
 
+#define PT_DESKTOP	0x0000 /*fixme*/
+#define PT_MYCOMP	0x001F
+#define PT_SPECIAL	0x002E
+#define PT_DRIVE	0x0023
+#define PT_FOLDER	0x0031
+#define PT_VALUE	0x0033 /*fixme*/
+
+#pragma pack(1)
+typedef WORD PIDLTYPE;
+ typedef struct tagPIDLDATA
+{	PIDLTYPE type;
+	union
+	{ struct
+	  { CHAR szDriveName[4];
+	    /* end of MS compatible*/
+	    DWORD dwSFGAO;
+	  } drive;
+	  struct 
+	  { DWORD dwFileSize;
+	    WORD uFileDate;
+	    WORD uFileTime;
+	    WORD uFileAttribs;
+	    /* end of MS compatible*/
+	    DWORD dwSFGAO;
+	    CHAR  szAlternateName[14];	/* the 8.3 Name*/
+	    CHAR szText[1];		/* last entry, variable size */
+	  } file, folder, generic; 
+	}u;
+}
+	/* here starts my implementation*/
+ PIDLDATA, *LPPIDLDATA;
+#pragma pack(4)
+
+ LPITEMIDLIST WINAPI _ILCreateDesktop();
+ LPITEMIDLIST WINAPI _ILCreateMyComputer();
+ LPITEMIDLIST WINAPI _ILCreateDrive(LPCSTR);
+ LPITEMIDLIST WINAPI _ILCreateFolder(LPCSTR);
+ LPITEMIDLIST WINAPI _ILCreateValue(LPCSTR);
+ LPITEMIDLIST WINAPI _ILCreate(PIDLTYPE,LPVOID,UINT16);
+
+ BOOL32 WINAPI _ILGetDrive(LPCITEMIDLIST,LPSTR,UINT16);
+ DWORD WINAPI _ILGetItemText(LPCITEMIDLIST,LPSTR,UINT16);
+ DWORD WINAPI _ILGetFolderText(LPCITEMIDLIST,LPSTR,DWORD);
+ DWORD WINAPI _ILGetValueText(LPCITEMIDLIST,LPSTR,DWORD);
+ DWORD WINAPI _ILGetDataText(LPCITEMIDLIST,LPCITEMIDLIST,LPSTR,DWORD);
+ DWORD WINAPI _ILGetPidlPath(LPCITEMIDLIST,LPSTR,DWORD);
+ DWORD WINAPI _ILGetData(PIDLTYPE,LPCITEMIDLIST,LPVOID,UINT16);
+
+ BOOL32 WINAPI _ILIsDesktop(LPCITEMIDLIST);
+ BOOL32 WINAPI _ILIsMyComputer(LPCITEMIDLIST);
+ BOOL32 WINAPI _ILIsDrive(LPCITEMIDLIST);
+ BOOL32 WINAPI _ILIsFolder(LPCITEMIDLIST);
+ BOOL32 WINAPI _ILIsValue(LPCITEMIDLIST);
+
+ BOOL32 WINAPI _ILHasFolders(LPSTR,LPCITEMIDLIST);
+
+ LPPIDLDATA WINAPI _ILGetDataPointer(LPCITEMIDLIST);
+ LPSTR WINAPI _ILGetTextPointer(PIDLTYPE type, LPPIDLDATA pidldata);
+/*
+ BOOL32 WINAPI _ILGetDesktop(LPCITEMIDLIST,LPSTR);
+ BOOL32 WINAPI _ILSeparatePathAndValue(LPITEMIDLIST,LPITEMIDLIST*,LPITEMIDLIST*);
+ BOOL32 WINAPI _ILGetValueType(LPCITEMIDLIST,LPCITEMIDLIST,LPDWORD);
+*/
 #endif
diff --git a/dlls/shell32/shell32_main.c b/dlls/shell32/shell32_main.c
index 2a348f8..ea39237 100644
--- a/dlls/shell32/shell32_main.c
+++ b/dlls/shell32/shell32_main.c
@@ -30,6 +30,7 @@
 #include "commctrl.h"
 #include "authors.h"
 
+#include "pidl.h"
 #include "shell32_main.h"
 
 /*************************************************************************
@@ -108,16 +109,16 @@
 {	WARN(shell,"(%p,%p):semi-stub.\n",imglist1,imglist2);
 	if (imglist1)
 	{ *imglist1=ShellBigIconList;
-    }
-    if (imglist2)
-    { *imglist2=ShellSmallIconList;
-    }
+	}
+	if (imglist2)
+	{ *imglist2=ShellSmallIconList;
+	}
 
 	return TRUE;
 }
 
 /*************************************************************************
- *				SHGetFileInfoA		[SHELL32.218]
+ *  SHGetFileInfoA		[SHELL32.218]
  *
  * FIXME
  *   
@@ -128,43 +129,51 @@
 DWORD WINAPI SHGetFileInfo32A(LPCSTR path,DWORD dwFileAttributes,
                               SHFILEINFO32A *psfi, UINT32 sizeofpsfi,
                               UINT32 flags )
-{ CHAR szTemp[MAX_PATH];
-  DWORD ret=0;
+{	CHAR szTemp[MAX_PATH];
+	LPPIDLDATA 	pData;
+	DWORD ret=0;
   
-  TRACE(shell,"(%s,0x%lx,%p,0x%x,0x%x)\n",
+	TRACE(shell,"(%s,0x%lx,%p,0x%x,0x%x)\n",
 	      path,dwFileAttributes,psfi,sizeofpsfi,flags);
 
-  /* translate the pidl to a path*/
-  if (flags & SHGFI_PIDL)
-  { SHGetPathFromIDList32A ((LPCITEMIDLIST)path,szTemp);
-    TRACE(shell,"pidl=%p is %s\n",path,szTemp);
-  }
-  else
-  { TRACE(shell,"path=%p\n",path);
-  }
+	/* translate the pidl to a path*/
+	if (flags & SHGFI_PIDL)
+	{ SHGetPathFromIDList32A ((LPCITEMIDLIST)path,szTemp);
+	  TRACE(shell,"pidl=%p is %s\n",path,szTemp);
+	}
+	else
+	{ TRACE(shell,"path=%p\n",path);
+	}
 
-  if (flags & SHGFI_ATTRIBUTES)
-  { FIXME(shell,"file attributes, stub\n");
-    psfi->dwAttributes=SFGAO_FILESYSTEM;
-    ret=TRUE;    
-  }
+	if (flags & SHGFI_ATTRIBUTES)
+	{ if (flags & SHGFI_PIDL)
+	  { pData = _ILGetDataPointer((LPCITEMIDLIST)path);
+	    psfi->dwAttributes = pData->u.generic.dwSFGAO; /* fixme: no direct access*/
+	    ret=TRUE;
+	  }
+	  else
+	  { psfi->dwAttributes=SFGAO_FILESYSTEM;
+	    ret=TRUE;
+	  }
+	  FIXME(shell,"file attributes, stub\n");	    
+	}
 
-  if (flags & SHGFI_DISPLAYNAME)
-  { if (flags & SHGFI_PIDL)
-    { strcpy(psfi->szDisplayName,szTemp);
-    }
-    else
-    { strcpy(psfi->szDisplayName,path);
-      TRACE(shell,"displayname=%s\n", szTemp);
-    }
-    ret=TRUE;
-  }
+	if (flags & SHGFI_DISPLAYNAME)
+	{ if (flags & SHGFI_PIDL)
+	  { strcpy(psfi->szDisplayName,szTemp);
+	  }
+	  else
+	  { strcpy(psfi->szDisplayName,path);
+	  }
+	  TRACE(shell,"displayname=%s\n", psfi->szDisplayName);	  
+	  ret=TRUE;
+	}
   
-  if (flags & SHGFI_TYPENAME)
-  { FIXME(shell,"get the file type, stub\n");
-    strcpy(psfi->szTypeName,"");
-    ret=TRUE;
-  }
+	if (flags & SHGFI_TYPENAME)
+ 	{ FIXME(shell,"get the file type, stub\n");
+	  strcpy(psfi->szTypeName,"FIXME: Type");
+	  ret=TRUE;
+	}
   
   if (flags & SHGFI_ICONLOCATION)
   { FIXME(shell,"location of icon, stub\n");
@@ -422,17 +431,17 @@
   LPWSTR lpszDisplayName = (LPWSTR)&pszTemp[0];
   HKEY key;
 
-  enum 
-	{	FT_UNKNOWN= 0x00000000,
+	enum 
+	{ FT_UNKNOWN= 0x00000000,
 	  FT_DIR=     0x00000001, 
 	  FT_DESKTOP= 0x00000002
 	} tFolder; 
 
-  TRACE(shell,"(%04x,%d,%p)\n", hwndOwner,nFolder,ppidl);
+	TRACE(shell,"(%04x,%d,%p)\n", hwndOwner,nFolder,ppidl);
 
-  strcpy(buffer,"Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Shell Folders\\");
+	strcpy(buffer,"Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Shell Folders\\");
 
-  res=RegCreateKeyEx32A(HKEY_CURRENT_USER,buffer,0,NULL,REG_OPTION_NON_VOLATILE,KEY_WRITE,NULL,&key,&dwdisp);
+	res=RegCreateKeyEx32A(HKEY_CURRENT_USER,buffer,0,NULL,REG_OPTION_NON_VOLATILE,KEY_WRITE,NULL,&key,&dwdisp);
 	if (res)
 	{ ERR(shell,"Could not create key %s %08lx \n",buffer,res);
 	  return E_OUTOFMEMORY;
@@ -440,151 +449,152 @@
 
 	tFolder=FT_DIR;	
 	switch (nFolder)
-	{	case CSIDL_BITBUCKET:
-			strcpy (buffer,"xxx");			/*not in the registry*/
-			TRACE (shell,"looking for Recycler\n");
-			tFolder=FT_UNKNOWN;
-      break;
-		case CSIDL_CONTROLS:
-			strcpy (buffer,"xxx");			/*virtual folder*/
-      TRACE (shell,"looking for Control\n");
-			tFolder=FT_UNKNOWN;
-      break;
-		case CSIDL_DESKTOP:
-			strcpy (buffer,"xxx");			/*virtual folder*/
-			TRACE (shell,"looking for Desktop\n");
-			tFolder=FT_DESKTOP;			
-      break;
-		case CSIDL_DESKTOPDIRECTORY:
-			strcpy (buffer,"Desktop");
-      break;
-		case CSIDL_DRIVES:
-			strcpy (buffer,"xxx");			/*virtual folder*/
-      TRACE (shell,"looking for Drives\n");
-			tFolder=FT_UNKNOWN;
-      break;
-		case CSIDL_FONTS:
-			strcpy (buffer,"Fonts");			
-      break;
-		case CSIDL_NETHOOD:
-			strcpy (buffer,"NetHood");			
-      break;
-		case CSIDL_NETWORK:
-			strcpy (buffer,"xxx");				/*virtual folder*/
-			TRACE (shell,"looking for Network\n");
-			tFolder=FT_UNKNOWN;
-      break;
-		case CSIDL_PERSONAL:
-			strcpy (buffer,"Personal");			
-      break;
-		case CSIDL_FAVORITES:
-			strcpy (buffer,"Favorites");			
-      break;
-		case CSIDL_PRINTERS:
-			strcpy (buffer,"PrintHood");			
-      break;
-		case CSIDL_PROGRAMS:
-			strcpy (buffer,"Programs");			
-      break;
-		case CSIDL_RECENT:
-			strcpy (buffer,"Recent");
-      break;
-		case CSIDL_SENDTO:
-			strcpy (buffer,"SendTo");
- 		  break;
-		case CSIDL_STARTMENU:
-			strcpy (buffer,"Start Menu");
-      break;
-		case CSIDL_STARTUP:
-			strcpy (buffer,"Startup");			
-      break;
-		case CSIDL_TEMPLATES:
-			strcpy (buffer,"Templates");			
-      break;
-		default:
-      ERR (shell,"unknown CSIDL\n");
-			tFolder=FT_UNKNOWN;			
-      break;
+	{ case CSIDL_BITBUCKET:
+		strcpy (buffer,"xxx");			/*not in the registry*/
+		TRACE (shell,"looking for Recycler\n");
+		tFolder=FT_UNKNOWN;
+        break;
+	  case CSIDL_CONTROLS:
+		strcpy (buffer,"xxx");			/*virtual folder*/
+        TRACE (shell,"looking for Control\n");
+	    tFolder=FT_UNKNOWN;
+        break;
+	  case CSIDL_DESKTOP:
+	    strcpy (buffer,"xxx");			/*virtual folder*/
+	    TRACE (shell,"looking for Desktop\n");
+	    tFolder=FT_DESKTOP;			
+	    break;
+	  case CSIDL_DESKTOPDIRECTORY:
+	    strcpy (buffer,"Desktop");
+	    break;
+	  case CSIDL_DRIVES:
+	    strcpy (buffer,"xxx");			/*virtual folder*/
+	    TRACE (shell,"looking for Drives\n");
+	    tFolder=FT_UNKNOWN;
+	    break;
+	  case CSIDL_FONTS:
+	    strcpy (buffer,"Fonts");			
+	    break;
+	  case CSIDL_NETHOOD:
+	    strcpy (buffer,"NetHood");			
+	    break;
+	  case CSIDL_NETWORK:
+	    strcpy (buffer,"xxx");				/*virtual folder*/
+	    TRACE (shell,"looking for Network\n");
+	    tFolder=FT_UNKNOWN;
+	    break;
+	  case CSIDL_PERSONAL:
+	    strcpy (buffer,"Personal");			
+	    break;
+	  case CSIDL_FAVORITES:
+	    strcpy (buffer,"Favorites");			
+	    break;
+	  case CSIDL_PRINTERS:
+	    strcpy (buffer,"PrintHood");
+	    break;
+	  case CSIDL_PROGRAMS:
+	    strcpy (buffer,"Programs");			
+	    break;
+	  case CSIDL_RECENT:
+	    strcpy (buffer,"Recent");
+	    break;
+	  case CSIDL_SENDTO:
+	    strcpy (buffer,"SendTo");
+	    break;
+	  case CSIDL_STARTMENU:
+	    strcpy (buffer,"Start Menu");
+	    break;
+	  case CSIDL_STARTUP:
+	    strcpy (buffer,"Startup");			
+	    break;
+	  case CSIDL_TEMPLATES:
+	    strcpy (buffer,"Templates");			
+	    break;
+	  default:
+	    ERR (shell,"unknown CSIDL\n");
+	    tFolder=FT_UNKNOWN;			
+	    break;
 	}
 
-  TRACE(shell,"Key=%s\n",buffer);
+	TRACE(shell,"Key=%s\n",buffer);
 
-  type=REG_SZ;
+	type=REG_SZ;
 
-  switch (tFolder)
+	switch (tFolder)
 	{ case FT_DIR:
 	    /* Directory: get the value from the registry, if its not there 
 			create it and the directory*/
-    	if (RegQueryValueEx32A(key,buffer,NULL,&type,tpath,&tpathlen))
-  	  { GetWindowsDirectory32A(npath,MAX_PATH);
+	    if (RegQueryValueEx32A(key,buffer,NULL,&type,tpath,&tpathlen))
+  	    { GetWindowsDirectory32A(npath,MAX_PATH);
 	      PathAddBackslash(npath);
-  			switch (nFolder)
-  			{	case CSIDL_DESKTOPDIRECTORY:
-      			strcat (npath,"Desktop");
-            break;
+	      switch (nFolder)
+  		  { case CSIDL_DESKTOPDIRECTORY:
+      		  strcat (npath,"Desktop");
+         	  break;
       		case CSIDL_FONTS:
-      			strcat (npath,"Fonts");			
-            break;
+         	  strcat (npath,"Fonts");			
+         	  break;
       		case CSIDL_NETHOOD:
-      			strcat (npath,"NetHood");			
-            break;
+         	  strcat (npath,"NetHood");			
+         	  break;
   		    case CSIDL_PERSONAL:
-      			strcpy (npath,"C:\\Personal");			
-            break;
+         	  strcpy (npath,"C:\\Personal");			
+         	  break;
       		case CSIDL_FAVORITES:
-      			strcat (npath,"Favorites");			
-            break;
+         	  strcat (npath,"Favorites");			
+         	  break;
   		    case CSIDL_PRINTERS:
-      			strcat (npath,"PrintHood");			
-            break;
+         	  strcat (npath,"PrintHood");			
+         	  break;
       		case CSIDL_PROGRAMS:
-      			strcat (npath,"Start Menu");			
-  					CreateDirectory32A(npath,NULL);
-      			strcat (npath,"\\Programs");			
-            break;
+         	  strcat (npath,"Start Menu");			
+         	  CreateDirectory32A(npath,NULL);
+         	  strcat (npath,"\\Programs");			
+         	  break;
       		case CSIDL_RECENT:
-      			strcat (npath,"Recent");
-            break;
+         	  strcat (npath,"Recent");
+         	  break;
       		case CSIDL_SENDTO:
-      			strcat (npath,"SendTo");
-      			break;
+         	  strcat (npath,"SendTo");
+         	  break;
       		case CSIDL_STARTMENU:
-      			strcat (npath,"Start Menu");
-            break;
+         	  strcat (npath,"Start Menu");
+         	  break;
       		case CSIDL_STARTUP:
-      			strcat (npath,"Start Menu");			
-  					CreateDirectory32A(npath,NULL);
-      			strcat (npath,"\\Startup");			
-            break;
+         	  strcat (npath,"Start Menu");			
+         	  CreateDirectory32A(npath,NULL);
+         	  strcat (npath,"\\Startup");			
+         	  break;
       		case CSIDL_TEMPLATES:
-      			strcat (npath,"Templates");			
-            break;
-  				default:
+         	  strcat (npath,"Templates");			
+         	  break;
+         	default:
          	  RegCloseKey(key);
         	  return E_OUTOFMEMORY;
-  			}
-    		if (RegSetValueEx32A(key,buffer,0,REG_SZ,npath,sizeof(npath)+1))
-        {	ERR(shell,"could not create value %s\n",buffer);
-      	  RegCloseKey(key);
-      	  return E_OUTOFMEMORY;
-    		}
-    		TRACE(shell,"value %s=%s created\n",buffer,npath);
-    	  CreateDirectory32A(npath,NULL);
-      }
-			break;
-		case FT_DESKTOP:
-			strcpy (tpath,"Desktop");			
-		  break;
+	      }
+	      if (RegSetValueEx32A(key,buffer,0,REG_SZ,npath,sizeof(npath)+1))
+	      { ERR(shell,"could not create value %s\n",buffer);
+	        RegCloseKey(key);
+	        return E_OUTOFMEMORY;
+	      }
+	      TRACE(shell,"value %s=%s created\n",buffer,npath);
+	      CreateDirectory32A(npath,NULL);
+          strcpy(tpath,npath);
+	    }
+	    break;
+	  case FT_DESKTOP:
+	    strcpy (tpath,"Desktop");			
+		break;
 	  default:
-      RegCloseKey(key);
-      return E_OUTOFMEMORY;
-		  break;
-  }
+        RegCloseKey(key);
+	    return E_OUTOFMEMORY;
+	    break;
+	}
 
 	RegCloseKey(key);
 
-  TRACE(shell,"Value=%s\n",tpath);
-  LocalToWideChar32(lpszDisplayName, tpath, 256);
+	TRACE(shell,"Value=%s\n",tpath);
+	LocalToWideChar32(lpszDisplayName, tpath, 256);
   
 	if (SHGetDesktopFolder(&shellfolder)==S_OK)
 	{ shellfolder->lpvtbl->fnParseDisplayName(shellfolder,hwndOwner, NULL,lpszDisplayName,&pchEaten,ppidl,NULL);
@@ -935,7 +945,7 @@
       exit (1);
     }
     if ( ! ShellSmallIconList )
-    { if ( (ShellSmallIconList = pImageList_Create(sysMetrics[SM_CXSMICON],sysMetrics[SM_CYSMICON],0x101,0,0x20)) )
+    { if ( (ShellSmallIconList = pImageList_Create(sysMetrics[SM_CXSMICON],sysMetrics[SM_CYSMICON],ILC_COLORDDB | ILC_MASK,0,0x20)) )
       { for (index=0;index < 40; index++)
         { if ( ! ( htmpIcon = ExtractIcon32A(hinstDLL, szShellPath, index))
           || ( -1 == (iiconindex = pImageList_AddIcon (ShellSmallIconList, htmpIcon))) )
@@ -946,7 +956,7 @@
       }
     }
     if ( ! ShellBigIconList )
-    { if ( (ShellBigIconList = pImageList_Create(SYSMETRICS_CXSMICON, SYSMETRICS_CYSMICON,0x101,0,0x20)) )
+    { if ( (ShellBigIconList = pImageList_Create(SYSMETRICS_CXSMICON, SYSMETRICS_CYSMICON,ILC_COLORDDB | ILC_MASK,0,0x20)) )
       { for (index=0;index < 40; index++)
         { if ( ! (htmpIcon = ExtractIcon32A( hinstDLL, szShellPath, index)) 
            || (-1 == (iiconindex = pImageList_AddIcon (ShellBigIconList, htmpIcon))) )
diff --git a/dlls/shell32/shellole.c b/dlls/shell32/shellole.c
index fbbc42e..bf78ba6 100644
--- a/dlls/shell32/shellole.c
+++ b/dlls/shell32/shellole.c
@@ -29,29 +29,30 @@
 typedef DWORD (* WINAPI GetClassPtr)(REFCLSID,REFIID,LPVOID);
 
 static GetClassPtr SH_find_moduleproc(LPSTR dllname,HMODULE32 *xhmod,LPSTR name)
-{ HMODULE32  hmod;
-	FARPROC32	dllunload,nameproc;
+{	HMODULE32 hmod;
+	FARPROC32 dllunload,nameproc;
 
+	TRACE(shell,"dll=%s, hmodule=%p, name=%s\n",dllname, xhmod, name);
 	if (xhmod)
-    { *xhmod = 0;
-    }
+	{ *xhmod = 0;
+	}
 	if (!strcasecmp(PathFindFilename(dllname),"shell32.dll"))
 	{ return (GetClassPtr)SHELL32_DllGetClassObject;
-    }
+	}
 
 	hmod = LoadLibraryEx32A(dllname,0,LOAD_WITH_ALTERED_SEARCH_PATH);
 	if (!hmod)
 	{ return NULL;
-    }
+	}
 	dllunload = GetProcAddress32(hmod,"DllCanUnloadNow");
 	if (!dllunload)
 	{ if (xhmod)
-      { *xhmod = hmod;
-      }
-    }
+	  { *xhmod = hmod;
+	  }
+	}
 	nameproc = GetProcAddress32(hmod,name);
 	if (!nameproc)
-    { FreeLibrary32(hmod);
+	{ FreeLibrary32(hmod);
 	  return NULL;
 	}
 	/* register unloadable dll with unloadproc ... */
@@ -73,21 +74,14 @@
 	dllgetclassob = SH_find_moduleproc(dllname,NULL,"DllGetClassObject");
 	if (!dllgetclassob)
 	{ return 0x80070000|GetLastError();
-    }
+	}
 
-/* FIXME */
-/*
-	hres = (*dllgetclassob)(clsid,(REFIID)&IID_IClassFactory,inst);
-	if (hres<0)
-		return hres;
-
- */
 	hres = (*dllgetclassob)(clsid,(REFIID)&IID_IClassFactory,&classfac);
 	if (hres<0 || (hres>=0x80000000))
 	{ return hres;
-    }
+	}
 	if (!classfac)
-    { FIXME(shell,"no classfactory, but hres is 0x%ld!\n",hres);
+	{ FIXME(shell,"no classfactory, but hres is 0x%ld!\n",hres);
 	  return E_FAIL;
 	}
 	classfac->lpvtbl->fnCreateInstance(classfac,unknownouter,refiid,inst);
@@ -111,11 +105,11 @@
 
 	if (clsid)
 	{ WINE_StringFromCLSID(clsid,xclsid);
-    }
+	}
 	else
 	{ if (!aclsid)
 	  {	return 0x80040154;
-      }
+	  }
 	  strcpy(xclsid,aclsid);
 	}
 	TRACE(shell,"(%p,\n\tSID:\t%s,%p,\n\tIID:\t%s,%p)\n",aclsid,xclsid,unknownouter,xiid,inst);
@@ -124,11 +118,11 @@
 
 	if (RegOpenKeyEx32A(HKEY_CLASSES_ROOT,buffer,0,0x02000000,&inprockey))
 	{ return SH_get_instance(clsid,"shell32.dll",unknownouter,refiid,inst);
-    }
+	}
 	pathlen=sizeof(path);
 
 	if (RegQueryValue32A(inprockey,NULL,path,&pathlen))
-    { RegCloseKey(inprockey);
+	{ RegCloseKey(inprockey);
 	  return SH_get_instance(clsid,"shell32.dll",unknownouter,refiid,inst);
 	}
 
@@ -136,7 +130,7 @@
 	tmodellen=sizeof(tmodel);
 	type=REG_SZ;
 	if (RegQueryValueEx32A(inprockey,"ThreadingModel",NULL,&type,tmodel,&tmodellen))
-    { RegCloseKey(inprockey);
+	{ RegCloseKey(inprockey);
 	  return SH_get_instance(clsid,"shell32.dll",unknownouter,refiid,inst);
 	}
 
@@ -144,8 +138,8 @@
 
 	hres=SH_get_instance(clsid,path,unknownouter,refiid,inst);
 	if (hres<0)
-    { hres=SH_get_instance(clsid,"shell32.dll",unknownouter,refiid,inst);
-    }
+	{ hres=SH_get_instance(clsid,"shell32.dll",unknownouter,refiid,inst);
+	}
 	RegCloseKey(inprockey);
 	return hres;
 }
@@ -178,11 +172,11 @@
 	if(IsEqualCLSID(rclsid, &CLSID_ShellDesktop)|| 
 	   IsEqualCLSID(rclsid, &CLSID_ShellLink))
 	{ if(IsEqualCLSID(rclsid, &CLSID_ShellDesktop))      /*debug*/
-	  { TRACE(shell,"requested CLSID_ShellDesktop\n");
-      }
+	  { TRACE(shell,"-- requested CLSID_ShellDesktop\n");
+	  }
 	  if(IsEqualCLSID(rclsid, &CLSID_ShellLink))         /*debug*/
-	  { TRACE(shell,"requested CLSID_ShellLink\n");
-      }
+	  { TRACE(shell,"-- requested CLSID_ShellLink\n");
+	  }
 	  lpclf = IClassFactory_Constructor();
 	  if(lpclf)
 	  { hres = lpclf->lpvtbl->fnQueryInterface(lpclf,iid, ppv);
@@ -190,10 +184,10 @@
 	  }
 	}
 	else
-	{ WARN(shell, "clsid(%s) not in buildin SHELL32\n",xclsid);
+	{ WARN(shell, "-- CLSID not found\n");
 	  hres = CLASS_E_CLASSNOTAVAILABLE;
 	}
-	TRACE(shell,"RETURN pointer to interface: %p\n",ppv);
+	TRACE(shell,"-- return pointer to interface: %p\n",*ppv);
 	return hres;
 }
 
@@ -249,26 +243,26 @@
  */
 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);
+{	char	xriid[50];
+	WINE_StringFromCLSID((LPCLSID)riid,xriid);
+	TRACE(shell,"(%p)->(\n\tIID:\t%s)\n",this,xriid);
 
-  *ppvObj = NULL;
+	*ppvObj = NULL;
 
-  if(IsEqualIID(riid, &IID_IUnknown))          /*IUnknown*/
-  { *ppvObj = this; 
-  }
-  else if(IsEqualIID(riid, &IID_IClassFactory))  /*IClassFactory*/
-  {    *ppvObj = (IClassFactory*)this;
-  }   
+	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;
-  }
+	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;
+	return E_NOINTERFACE;
 }  
 /******************************************************************************
  * IClassFactory_AddRef
@@ -294,12 +288,12 @@
  */
 static HRESULT WINAPI IClassFactory_CreateInstance(
   LPCLASSFACTORY this, LPUNKNOWN pUnknown, REFIID riid, LPVOID *ppObject)
-{ IUnknown *pObj = NULL;
+{	IUnknown *pObj = NULL;
 	HRESULT hres;
 	char	xriid[50];
 
-  WINE_StringFromCLSID((LPCLSID)riid,xriid);
-  TRACE(shell,"%p->(%p,\n\tIID:\t%s,%p)\n",this,pUnknown,xriid,ppObject);
+	WINE_StringFromCLSID((LPCLSID)riid,xriid);
+	TRACE(shell,"%p->(%p,\n\tIID:\t%s,%p)\n",this,pUnknown,xriid,ppObject);
 
 	*ppObject = NULL;
 		
@@ -308,39 +302,39 @@
 	}
 
 	if (IsEqualIID(riid, &IID_IShellFolder))
-  { pObj = (IUnknown *)IShellFolder_Constructor(NULL,NULL);
-  } 
-  else if (IsEqualIID(riid, &IID_IShellView))
-  { pObj = (IUnknown *)IShellView_Constructor();
-  } 
-  else if (IsEqualIID(riid, &IID_IShellLink))
-  { pObj = (IUnknown *)IShellLink_Constructor();
-  } 
-  else if (IsEqualIID(riid, &IID_IExtractIcon))
-  { pObj = (IUnknown *)IExtractIcon_Constructor(NULL);
-  } 
-  else if (IsEqualIID(riid, &IID_IContextMenu))
-  { pObj = (IUnknown *)IContextMenu_Constructor(NULL, NULL, 0);
-  } 
-  else
-  { ERR(shell,"unknown IID requested\n\tIID:\t%s\n",xriid);
-    return(E_NOINTERFACE);
-  }
+	{ pObj = (IUnknown *)IShellFolder_Constructor(NULL,NULL);
+	} 
+	else if (IsEqualIID(riid, &IID_IShellView))
+	{ pObj = (IUnknown *)IShellView_Constructor();
+ 	} 
+	else if (IsEqualIID(riid, &IID_IShellLink))
+	{ pObj = (IUnknown *)IShellLink_Constructor();
+	} 
+	else if (IsEqualIID(riid, &IID_IExtractIcon))
+	{ pObj = (IUnknown *)IExtractIcon_Constructor(NULL);
+	} 
+	else if (IsEqualIID(riid, &IID_IContextMenu))
+	{ pObj = (IUnknown *)IContextMenu_Constructor(NULL, NULL, 0);
+ 	} 
+	else
+	{ ERR(shell,"unknown IID requested\n\tIID:\t%s\n",xriid);
+	  return(E_NOINTERFACE);
+	}
 	
-  if (!pObj)
-  { return(E_OUTOFMEMORY);
-  }
+	if (!pObj)
+	{ return(E_OUTOFMEMORY);
+	}
 	 
 	hres = pObj->lpvtbl->fnQueryInterface(pObj,riid, ppObject);
-  pObj->lpvtbl->fnRelease(pObj);
-  TRACE(shell,"-- Object created: (%p)->%p\n",this,*ppObject);
+	pObj->lpvtbl->fnRelease(pObj);
+	TRACE(shell,"-- Object created: (%p)->%p\n",this,*ppObject);
 
-  return hres;
+	return hres;
 }
 /******************************************************************************
  * IClassFactory_LockServer
  */
 static HRESULT WINAPI IClassFactory_LockServer(LPCLASSFACTORY this, BOOL32 fLock)
-{ TRACE(shell,"%p->(0x%x), not implemented\n",this, fLock);
-  return E_NOTIMPL;
+{	TRACE(shell,"%p->(0x%x), not implemented\n",this, fLock);
+	return E_NOTIMPL;
 }
diff --git a/dlls/shell32/shellord.c b/dlls/shell32/shellord.c
index ae9990f..b8aa3f8 100644
--- a/dlls/shell32/shellord.c
+++ b/dlls/shell32/shellord.c
@@ -416,8 +416,8 @@
  *
  */
 DWORD WINAPI
-SHMapPIDLToSystemImageListIndex(DWORD x,DWORD y,DWORD z)
-{ FIXME(shell,"(%08lx,%08lx,%08lx):stub.\n",x,y,z);
+SHMapPIDLToSystemImageListIndex(LPSHELLFOLDER sh,DWORD y,DWORD z)
+{ FIXME(shell,"(folder=%p,%08lx,%08lx):stub.\n",sh,y,z);
   return 0;
 }
 
@@ -452,15 +452,22 @@
  * SHCloneSpecialIDList [SHELL32.89]
  * 
  * PARAMETERS
- *  hwnd 
+ *  hwndOwner 	[in] 
+ *  nFolder 	[in]	CSIDL_xxxxx ??
+ *
+ * RETURNS
+ *  pidl ??
  * NOTES
  *     exported by ordinal
  */
-DWORD WINAPI SHCloneSpecialIDList(HWND32 hwnd,DWORD x2,DWORD x3) {
-  FIXME(shell,"(hwnd=0x%x,0x%lx,0x%lx):stub.\n",
-    hwnd,x2,x3
-  );
-  return S_OK;
+LPITEMIDLIST WINAPI SHCloneSpecialIDList(HWND32 hwndOwner,DWORD nFolder,DWORD x3)
+{	LPITEMIDLIST ppidl;
+	WARN(shell,"(hwnd=0x%x,csidl=0x%lx,0x%lx):semi-stub.\n",
+					 hwndOwner,nFolder,x3);
+
+	SHGetSpecialFolderLocation(hwndOwner, nFolder, &ppidl);
+
+	return ppidl;
 }
 
 /*************************************************************************
@@ -484,7 +491,7 @@
  *     exported by ordinal
  */
 void WINAPI SHGetSpecialFolderPath(DWORD x1,DWORD x2,DWORD x3,DWORD x4) {
-    FIXME(shell,"(0x%08lx,0x%08lx,0x%08lx,0x%08lx):stub.\n",
+    FIXME(shell,"(0x%04lx,0x%04lx,csidl=0x%04lx,0x%04lx):stub.\n",
       x1,x2,x3,x4
     );
 }
@@ -513,8 +520,8 @@
  */
 void __cdecl
 ShellMessageBoxA(HMODULE32 hmod,HWND32 hwnd,DWORD id,DWORD x,DWORD type,LPVOID arglist) {
-	char	buf[100],buf2[100],*buf3;
-	LPVOID	args = &arglist;
+	char	buf[100],buf2[100]/*,*buf3*/;
+/*	LPVOID	args = &arglist;*/
 
 	if (!LoadString32A(hmod,x,buf,100))
 		strcpy(buf,"Desktop");
@@ -584,11 +591,12 @@
  * SHCreateDirectory [SHELL32.165]
  *
  * NOTES
- *     exported by ordinal
+ *  exported by ordinal
+ *  not sure about LPSECURITY_ATTRIBUTES
  */
-DWORD WINAPI SHCreateDirectory(DWORD x,LPCSTR path) {
-	TRACE(shell,"(%08lx,%s):stub.\n",x,path);
-	if (CreateDirectory32A(path,x))
+DWORD WINAPI SHCreateDirectory(LPSECURITY_ATTRIBUTES sec,LPCSTR path) {
+	TRACE(shell,"(%p,%s):stub.\n",sec,path);
+	if (CreateDirectory32A(path,sec))
 		return TRUE;
 	/* SHChangeNotify(8,1,path,0); */
 	return FALSE;
@@ -760,7 +768,7 @@
  *     exported by name
  */
 DWORD WINAPI SHFileOperation32 (
-    LPSHFILEOPSTRUCT32 lpFileOp)   
+    LPSHFILEOPSTRUCT32A lpFileOp)   
 { FIXME (shell,"(%p):stub.\n", lpFileOp);
   return 1;
 }
@@ -794,34 +802,100 @@
 /*************************************************************************
  * SHFind_InitMenuPopup [SHELL32.149]
  *
+ * NOTES
+ *  Registers the menu behind the "Start" button
+ *
+ * PARAMETERS
+ *  hMenu		[in] handel of menu previously created
+ *  hWndParent	[in] parent window
+ *  w			[in] no pointer
+ *  x			[in] no pointer
  */
-HRESULT WINAPI SHFind_InitMenuPopup (DWORD u, DWORD v, DWORD w, DWORD x)
-{ FIXME(shell,"0x%08lx 0x%08lx 0x%08lx 0x%08lx stub\n",u,v,w,x);
-  return 0;
+HRESULT WINAPI SHFind_InitMenuPopup (HMENU32 hMenu, HWND32 hWndParent, DWORD w, DWORD x)
+{	FIXME(shell,"hmenu=0x%08x hwnd=0x%08x 0x%08lx 0x%08lx stub\n",
+		hMenu,hWndParent,w,x);
+	return 0;
+}
+/*************************************************************************
+ * FileMenu_InitMenuPopup [SHELL32.109]
+ *
+ */
+HRESULT WINAPI FileMenu_InitMenuPopup (DWORD hmenu)
+{	FIXME(shell,"hmenu=0x%lx stub\n",hmenu);
+	return 0;
 }
 /*************************************************************************
  * FileMenu_Create [SHELL32.114]
  *
+ * w retval from LoadBitmapA
+ *
+ *
  */
 HRESULT WINAPI FileMenu_Create (DWORD u, DWORD v, DWORD w, DWORD x, DWORD z)
-{ FIXME(shell,"0x%08lx 0x%08lx 0x%08lx 0x%08lx 0x%08lx stub\n",u,v,w,x,z);
+{ FIXME(shell,"0x%08lx 0x%08lx hbmp=0x%lx 0x%08lx 0x%08lx stub\n",u,v,w,x,z);
   return 0;
 }
 /*************************************************************************
+ * FileMenu_TrackPopupMenuEx [SHELL32.116]
+ *
+ * PARAMETERS
+ *  uFlags		[in]	according to TrackPopupMenuEx
+ *  posX		[in]
+ *  posY		[in]
+ *  hWndParent		[in]
+ *  z	could be rect (trace) or TPMPARAMS (TrackPopupMenuEx)
+ */
+HRESULT WINAPI FileMenu_TrackPopupMenuEx (DWORD t, DWORD uFlags, DWORD posX, DWORD posY, HWND32 hWndParent, DWORD z)
+{	FIXME(shell,"0x%lx flags=0x%lx posx=0x%lx posy=0x%lx hwndp=0x%x 0x%lx stub\n",
+		t,uFlags,posX,posY, hWndParent,z);
+	return 0;
+}
+/*************************************************************************
+ *  SHWinHelp [SHELL32.127]
+ *
+ */
+HRESULT WINAPI SHWinHelp (DWORD v, DWORD w, DWORD x, DWORD z)
+{	FIXME(shell,"0x%08lx 0x%08lx 0x%08lx 0x%08lx stub\n",v,w,x,z);
+	return 0;
+}
+/*************************************************************************
+ *  SHRunConrolPanel [SHELL32.161]
+ *
+ */
+HRESULT WINAPI SHRunConrolPanel (DWORD x, DWORD z)
+{	FIXME(shell,"0x%08lx 0x%08lx stub\n",x,z);
+	return 0;
+}
+/*************************************************************************
  * ShellExecuteEx [SHELL32.291]
  *
  */
-BOOL32 WINAPI ShellExecuteEx32A (LPSHELLEXECUTEINFOA u)
-{ FIXME(shell,"%p stub\n",u);
-  return 0;
+BOOL32 WINAPI ShellExecuteEx32A (LPSHELLEXECUTEINFO32A sei)
+{ 	CHAR szTemp[MAX_PATH];
+  	FIXME(shell,"%p stub\n",sei);
+
+	if (sei->fMask & SEE_MASK_IDLIST)
+	{ SHGetPathFromIDList32A (sei->lpIDList,szTemp);
+	  TRACE (shell,"-- idlist=%p (%s)\n", sei->lpIDList, szTemp);
+	}
+
+	if (sei->fMask & SEE_MASK_CLASSNAME)
+	{ TRACE (shell,"-- classname= %s\n", sei->lpClass);
+	}
+    
+	if (sei->lpVerb)
+	{ TRACE (shell,"-- action=%s\n", sei->lpVerb);
+	}
+	
+	return 0;
 }
 /*************************************************************************
  * SHSetInstanceExplorer [SHELL32.176]
  *
  */
 HRESULT WINAPI SHSetInstanceExplorer (DWORD u)
-{ FIXME(shell,"0x%08lx stub\n",u);
-  return 0;
+{	FIXME(shell,"0x%08lx stub\n",u);
+	return 0;
 }
 /*************************************************************************
  * SHGetInstanceExplorer [SHELL32.256]
@@ -830,8 +904,8 @@
  *  exported by name
  */
 HRESULT WINAPI SHGetInstanceExplorer (DWORD u)
-{ FIXME(shell,"0x%08lx stub\n",u);
-  return 0;
+{	FIXME(shell,"0x%08lx stub\n",u);
+	return 0;
 }
 /*************************************************************************
  * SHFreeUnusedLibraries [SHELL32.123]
@@ -840,6 +914,43 @@
  *  exported by name
  */
 HRESULT WINAPI SHFreeUnusedLibraries (DWORD u)
+{	FIXME(shell,"0x%08lx stub\n",u);
+	return 0;
+}
+/*************************************************************************
+ * DAD_ShowDragImage [SHELL32.137]
+ *
+ * NOTES
+ *  exported by name
+ */
+HRESULT WINAPI DAD_ShowDragImage (DWORD u)
 { FIXME(shell,"0x%08lx stub\n",u);
   return 0;
 }
+/*************************************************************************
+ * FileMenu_Destroy [SHELL32.118]
+ *
+ * NOTES
+ *  exported by name
+ */
+HRESULT WINAPI FileMenu_Destroy (DWORD u)
+{ FIXME(shell,"0x%08lx stub\n",u);
+  return 0;
+}
+/*************************************************************************
+ * SHGetDataFromIDListA [SHELL32.247]
+ *
+ */
+HRESULT WINAPI SHGetDataFromIDListA(DWORD u, DWORD v, DWORD w, DWORD x, DWORD y)
+{	FIXME(shell,"0x%04lx 0x%04lx 0x%04lx 0x%04lx 0x%04lx stub\n",u,v,w,x,y);
+	return 0;
+}
+/*************************************************************************
+ * SHFileOperationA [SHELL32.243]
+ *
+ */
+HRESULT WINAPI SHFileOperationA(DWORD x)
+{	FIXME(shell,"0x%08lx stub\n",x);
+	return 0;
+
+}
diff --git a/dlls/shell32/shlfolder.c b/dlls/shell32/shlfolder.c
index 4a516cf..5b03dcb 100644
--- a/dlls/shell32/shlfolder.c
+++ b/dlls/shell32/shlfolder.c
@@ -22,7 +22,7 @@
 #include "winnls.h"
 #include "winproc.h"
 #include "commctrl.h"
-
+#include "pidl.h"
 #include "shell32_main.h"
 
 static HRESULT WINAPI IShellFolder_QueryInterface(LPSHELLFOLDER,REFIID,LPVOID*);
@@ -55,25 +55,25 @@
  *    LPSTR pointer to first, not yet parsed char
  */
 LPSTR GetNextElement(LPSTR pszNext,LPSTR pszOut,DWORD dwOut)
-{ LPSTR   pszTail = pszNext;
-  DWORD dwCopy;
-  TRACE(shell,"(%s %p 0x%08lx)\n",debugstr_a(pszNext),pszOut,dwOut);
+{	LPSTR   pszTail = pszNext;
+	DWORD dwCopy;
+	TRACE(shell,"(%s %p 0x%08lx)\n",debugstr_a(pszNext),pszOut,dwOut);
 
-  if(!pszNext || !*pszNext)
-    return NULL;
+	if(!pszNext || !*pszNext)
+	  return NULL;
 
-  while(*pszTail && (*pszTail != '\\'))
-  { pszTail++;
-  }
-  dwCopy=((LPBYTE)pszTail-(LPBYTE)pszNext)/sizeof(CHAR)+1;
-  lstrcpyn32A(pszOut, pszNext, (dwOut<dwCopy)? dwOut : dwCopy);
+	while(*pszTail && (*pszTail != '\\'))
+	{ pszTail++;
+	}
+	dwCopy=((LPBYTE)pszTail-(LPBYTE)pszNext)/sizeof(CHAR)+1;
+	lstrcpyn32A(pszOut, pszNext, (dwOut<dwCopy)? dwOut : dwCopy);
 
-  if(*pszTail)
-  {  pszTail++;
+	if(*pszTail)
+	{  pszTail++;
 	}
 
-  TRACE(shell,"--(%s %s 0x%08lx)\n",debugstr_a(pszNext),debugstr_a(pszOut),dwOut);
-  return pszTail;
+	TRACE(shell,"--(%s %s 0x%08lx)\n",debugstr_a(pszNext),debugstr_a(pszOut),dwOut);
+	return pszTail;
 }
 
 /***********************************************************************
@@ -100,46 +100,38 @@
 */
 
 LPSHELLFOLDER IShellFolder_Constructor(LPSHELLFOLDER pParent,LPITEMIDLIST pidl) 
-{ LPSHELLFOLDER    sf;
+{	LPSHELLFOLDER    sf;
 	DWORD dwSize=0;
-  sf=(LPSHELLFOLDER)HeapAlloc(GetProcessHeap(),0,sizeof(IShellFolder));
-  sf->ref=1;
-  sf->lpvtbl=&sfvt;
-  sf->mlpszFolder=NULL;
+	sf=(LPSHELLFOLDER)HeapAlloc(GetProcessHeap(),0,sizeof(IShellFolder));
+	sf->ref=1;
+	sf->lpvtbl=&sfvt;
+	sf->mlpszFolder=NULL;
 	sf->mpSFParent=pParent;
 
 	TRACE(shell,"(%p)->(parent=%p, pidl=%p)\n",sf,pParent, pidl);
 	
-	/* create own pidl-manager*/
-  sf->pPidlMgr  = PidlMgr_Constructor();
-	if (! sf->pPidlMgr )
-	{ HeapFree(GetProcessHeap(),0,sf);
-	  ERR (shell,"-- Could not initialize PidMGR\n");
-	  return NULL;
-	}
-
-  /* keep a copy of the pidl in the instance*/
-  sf->mpidl = ILClone(pidl);
+	/* keep a copy of the pidl in the instance*/
+	sf->mpidl = ILClone(pidl);
 	sf->mpidlNSRoot = NULL;
 	
-  if(sf->mpidl)        /* do we have a pidl?*/
-  { 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 = SHAlloc(dwSize);
-    if(sf->mlpszFolder)
-    { *(sf->mlpszFolder)=0x00;
-      if(sf->mpSFParent->mlpszFolder)
-      {  strcpy(sf->mlpszFolder, sf->mpSFParent->mlpszFolder);
-         PathAddBackslash (sf->mlpszFolder);
-      }
-      sf->pPidlMgr->lpvtbl->fnGetFolderText(sf->pPidlMgr, sf->mpidl, sf->mlpszFolder+strlen(sf->mlpszFolder), dwSize-strlen(sf->mlpszFolder));
-    }
-  }
+	if(sf->mpidl)        /* do we have a pidl?*/
+	{ dwSize = 0;
+	  if(sf->mpSFParent->mlpszFolder)
+	  { dwSize += strlen(sf->mpSFParent->mlpszFolder) + 1;
+	  }   
+	  dwSize += _ILGetFolderText(sf->mpidl,NULL,0);
+	  sf->mlpszFolder = SHAlloc(dwSize);
+	  if(sf->mlpszFolder)
+	  { *(sf->mlpszFolder)=0x00;
+	    if(sf->mpSFParent->mlpszFolder)
+	    {  strcpy(sf->mlpszFolder, sf->mpSFParent->mlpszFolder);
+	       PathAddBackslash (sf->mlpszFolder);
+	    }
+	    _ILGetFolderText(sf->mpidl, sf->mlpszFolder+strlen(sf->mlpszFolder), dwSize-strlen(sf->mlpszFolder));
+	  }
+	}
 	
-  TRACE(shell,"-- (%p)->(%p,%p,parent=%s)\n",sf,pParent, pidl, debugstr_a(sf->mlpszFolder));
+	TRACE(shell,"-- (%p)->(%p,%p,parent=%s)\n",sf,pParent, pidl, debugstr_a(sf->mlpszFolder));
 	return sf;
 }
 /**************************************************************************
@@ -185,30 +177,27 @@
  *  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);
+{	TRACE(shell,"(%p)->(count=%lu)\n",this,this->ref);
+	if (!--(this->ref)) 
+	{ TRACE(shell,"-- destroying IShellFolder(%p)\n",this);
 
-		if (pdesktopfolder==this)
-		{ pdesktopfolder=NULL;
-		  TRACE(shell,"-- destroyed IShellFolder(%p) was Desktopfolder\n",this);
-		}
-    if (this->pPidlMgr)
-    { PidlMgr_Destructor(this->pPidlMgr);
-    }
-    if(this->mpidlNSRoot)
-    { SHFree(this->mpidlNSRoot);
-    }
-    if(this->mpidl)
-    { SHFree(this->mpidl);
-    }
-    if(this->mlpszFolder)
-    { SHFree(this->mlpszFolder);
-    }
+	  if (pdesktopfolder==this)
+	  { pdesktopfolder=NULL;
+	    TRACE(shell,"-- destroyed IShellFolder(%p) was Desktopfolder\n",this);
+	  }
+	  if(this->mpidlNSRoot)
+	  { SHFree(this->mpidlNSRoot);
+	  }
+	  if(this->mpidl)
+	  { SHFree(this->mpidl);
+	  }
+	  if(this->mlpszFolder)
+	  { SHFree(this->mlpszFolder);
+	  }
 
-		HeapFree(GetProcessHeap(),0,this);
+	  HeapFree(GetProcessHeap(),0,this);
 
-		return 0;
+	  return 0;
 	}
 	return this->ref;
 }
@@ -245,46 +234,46 @@
   TRACE(shell,"(%p)->(HWND=0x%08x,%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)
-    { if (strcmp(pszTemp,"Desktop")==0)
-      { pidlFull = (LPITEMIDLIST)HeapAlloc(GetProcessHeap(),0,2);
-			  pidlFull->mkid.cb = 0;
-			}
-		  else
-			{ pidlFull = this->pPidlMgr->lpvtbl->fnCreateMyComputer(this->pPidlMgr);
+	if(pszTemp)
+	{ hr = E_FAIL;
+	  WideCharToLocal32(pszTemp, lpszDisplayName, dwChars);
+	  if(*pszTemp)
+	  { if (strcmp(pszTemp,"Desktop")==0)
+	    { pidlFull = (LPITEMIDLIST)HeapAlloc(GetProcessHeap(),0,2);
+	      pidlFull->mkid.cb = 0;
+	    }
+	    else
+	    { pidlFull = _ILCreateMyComputer();
 
-        /* check if the lpszDisplayName is Folder or File*/
-  			bType = ! (GetFileAttributes32A(pszNext)&FILE_ATTRIBUTE_DIRECTORY);
-  			pszNext = GetNextElement(pszTemp, szElement, MAX_PATH);
+	      /* 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 = ILCombine(pidlFull,pidlTemp);
-        SHFree(pidlOld);
+	      pidlTemp = _ILCreateDrive(szElement);			
+	      pidlOld = pidlFull;
+	      pidlFull = ILCombine(pidlFull,pidlTemp);
+	      SHFree(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 = ILCombine(pidlFull,pidlTemp);
-            SHFree(pidlOld);
-          }
-          hr = S_OK;
-        }
-      }
-		}
-  }
+	      if(pidlFull)
+	      { while((pszNext=GetNextElement(pszNext, szElement, MAX_PATH)))
+	        { if(!*pszNext && bType)
+	          { pidlTemp = _ILCreateValue(szElement);
+	          }
+	          else				
+	          { pidlTemp = _ILCreateFolder(szElement);
+	          }
+	          pidlOld = pidlFull;
+	          pidlFull = ILCombine(pidlFull,pidlTemp);
+	          SHFree(pidlOld);
+	        }
+	        hr = S_OK;
+	      }
+	    }
+	  }
+	}
 	HeapFree(GetProcessHeap(),0,pszTemp);
-  *ppidl = pidlFull;
-  return hr;
+	*ppidl = pidlFull;
+	return hr;
 }
 
 /**************************************************************************
@@ -415,26 +404,26 @@
     pidlTemp2 = ILGetNext(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))
+  if(_ILIsValue(pidlTemp1) != _ILIsValue(pidlTemp2))
+  { if(_ILIsValue(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));
+  _ILGetDrive( pidl1,szString1,sizeof(szString1));
+  _ILGetDrive( 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));
+  _ILGetFolderText( pidl1,szString1,sizeof(szString1));
+  _ILGetFolderText( 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));
+  _ILGetValueText(pidl1,szString1,sizeof(szString1));
+  _ILGetValueText(pidl2,szString2,sizeof(szString2));
   return strcasecmp(szString1, szString2);
 }
 
@@ -489,11 +478,7 @@
 *  passes ONE element in the array and writing to further elements will
 *  cause the shell to fail later.
 */
-static HRESULT WINAPI IShellFolder_GetAttributesOf(
-	LPSHELLFOLDER this,
-	UINT32 cidl,
-    LPCITEMIDLIST *apidl, /*simple pidl's*/
-	DWORD *rgfInOut)
+static HRESULT WINAPI IShellFolder_GetAttributesOf(LPSHELLFOLDER this,UINT32 cidl,LPCITEMIDLIST *apidl,DWORD *rgfInOut)
 { LPCITEMIDLIST * pidltemp;
   DWORD i;
 
@@ -510,19 +495,19 @@
   
   do
   { if (*pidltemp)
-    { if (this->pPidlMgr->lpvtbl->fnIsDesktop(this->pPidlMgr, *pidltemp))
+    { if (_ILIsDesktop( *pidltemp))
       { *rgfInOut |= (SFGAO_FOLDER | SFGAO_HASSUBFOLDER | SFGAO_FILESYSANCESTOR);
       }
-      else if (this->pPidlMgr->lpvtbl->fnIsMyComputer(this->pPidlMgr, *pidltemp))
+      else if (_ILIsMyComputer( *pidltemp))
       { *rgfInOut |= (SFGAO_FOLDER | SFGAO_HASSUBFOLDER);
       }
-      else if (this->pPidlMgr->lpvtbl->fnIsDrive(this->pPidlMgr, *pidltemp))
-      { *rgfInOut |= (SFGAO_FOLDER | SFGAO_HASSUBFOLDER | SFGAO_FILESYSANCESTOR | SFGAO_FILESYSTEM);
+      else if (_ILIsDrive( *pidltemp))
+      { *rgfInOut |= (SFGAO_FOLDER | SFGAO_HASSUBFOLDER  | SFGAO_FILESYSTEM);
       }
-      else if (this->pPidlMgr->lpvtbl->fnIsFolder(this->pPidlMgr, *pidltemp))
-      { *rgfInOut |= (SFGAO_FOLDER | SFGAO_FILESYSTEM | SFGAO_HASSUBFOLDER);
+      else if (_ILIsFolder( *pidltemp))
+      { *rgfInOut |= (SFGAO_FOLDER | SFGAO_HASSUBFOLDER | SFGAO_FILESYSTEM );
       }
-      else if (this->pPidlMgr->lpvtbl->fnIsValue(this->pPidlMgr, *pidltemp))
+      else if (_ILIsValue( *pidltemp))
       { *rgfInOut |= (SFGAO_FILESYSTEM);
       }
     }
@@ -628,110 +613,107 @@
 #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, /* simple/complex pidl*/
-    DWORD dwFlags, 
-    LPSTRRET lpName)
-{ CHAR           szText[MAX_PATH];
-  CHAR           szTemp[MAX_PATH];
+static HRESULT WINAPI IShellFolder_GetDisplayNameOf( LPSHELLFOLDER this, LPCITEMIDLIST pidl, DWORD dwFlags, LPSTRRET lpName)
+{	CHAR           szText[MAX_PATH];
+	CHAR           szTemp[MAX_PATH];
 	CHAR           szSpecial[MAX_PATH];
 	CHAR           szDrive[MAX_PATH];
-  DWORD          dwVolumeSerialNumber,dwMaximumComponetLength,dwFileSystemFlags;
-  LPITEMIDLIST   pidlTemp=NULL;
+	DWORD          dwVolumeSerialNumber,dwMaximumComponetLength,dwFileSystemFlags;
+	LPITEMIDLIST   pidlTemp=NULL;
 	BOOL32				 bSimplePidl=FALSE;
 		
-  TRACE(shell,"(%p)->(pidl=%p,0x%08lx,%p)\n",this,pidl,dwFlags,lpName);
+	TRACE(shell,"(%p)->(pidl=%p,0x%08lx,%p)\n",this,pidl,dwFlags,lpName);
 
-  if (!pidl)
-  {  return E_OUTOFMEMORY;
-  } 
+	if (!pidl)
+	{  return E_OUTOFMEMORY;
+	} 
 
-  szSpecial[0]=0x00; 
-  szDrive[0]=0x00;
+	szSpecial[0]=0x00; 
+	szDrive[0]=0x00;
 
-  /* test if simple(relative) or complex(absolute) pidl */
-  pidlTemp = ILGetNext(pidl);
+	/* test if simple(relative) or complex(absolute) pidl */
+	pidlTemp = ILGetNext(pidl);
 	if (pidlTemp->mkid.cb==0x00)
 	{ bSimplePidl = TRUE;
 	}
-	if (this->pPidlMgr->lpvtbl->fnIsDesktop(this->pPidlMgr, pidl))
+	if (_ILIsDesktop( pidl))
 	{ strcpy (szText,"Desktop");
 	}
 	else
-  { if (this->pPidlMgr->lpvtbl->fnIsMyComputer(this->pPidlMgr, pidl))
-    { this->pPidlMgr->lpvtbl->fnGetItemText(this->pPidlMgr, pidl, szSpecial, MAX_PATH);
-    }
-	  if (this->pPidlMgr->lpvtbl->fnIsDrive(this->pPidlMgr, pidl))
-		{ pidlTemp = this->pPidlMgr->lpvtbl->fnGetLastItem(this->pPidlMgr,pidl);
-  		if (pidlTemp)
-      { this->pPidlMgr->lpvtbl->fnGetItemText(this->pPidlMgr, pidlTemp, szTemp, MAX_PATH);
-  		}
-		  if ( dwFlags==SHGDN_NORMAL || dwFlags==SHGDN_INFOLDER)
-  		{ GetVolumeInformation32A(szTemp,szDrive,MAX_PATH,&dwVolumeSerialNumber,&dwMaximumComponetLength,&dwFileSystemFlags,NULL,0);
-				if (szTemp[2]=='\\')
-        { szTemp[2]=0x00;
-				}
-        strcat (szDrive," (");
-				strcat (szDrive,szTemp);
-				strcat (szDrive,")"); 
-  		}
-			else
-			{  PathAddBackslash (szTemp);
-			   strcpy(szDrive,szTemp);
-			}
-		}
+	{ if (_ILIsMyComputer( pidl))
+	  { _ILGetItemText( pidl, szSpecial, MAX_PATH);
+	  }
+	  if (_ILIsDrive( pidl))
+	  { pidlTemp = ILFindLastID(pidl);
+	    if (pidlTemp)
+	    { _ILGetItemText( pidlTemp, szTemp, MAX_PATH);
+	    }
+	    if ( dwFlags==SHGDN_NORMAL || dwFlags==SHGDN_INFOLDER)
+	    { GetVolumeInformation32A(szTemp,szDrive,MAX_PATH,&dwVolumeSerialNumber,&dwMaximumComponetLength,&dwFileSystemFlags,NULL,0);
+	      if (szTemp[2]=='\\')
+	      { szTemp[2]=0x00;
+	      }
+	      strcat (szDrive," (");
+	      strcat (szDrive,szTemp);
+	      strcat (szDrive,")"); 
+	    }
+	    else
+	    {  PathAddBackslash (szTemp);
+	       strcpy(szDrive,szTemp);
+	    }
+	  }
 		
-  	switch(dwFlags)
-    { case SHGDN_NORMAL:
-        this->pPidlMgr->lpvtbl->fnGetPidlPath(this->pPidlMgr, pidl, szText, MAX_PATH);
-        break;
-      case SHGDN_INFOLDER:
-        pidlTemp = this->pPidlMgr->lpvtbl->fnGetLastItem(this->pPidlMgr,pidl);
-  			if (pidlTemp)
-        { this->pPidlMgr->lpvtbl->fnGetItemText(this->pPidlMgr, pidlTemp, szText, MAX_PATH);
-  			}
-   			break;				
-   		case	SHGDN_FORPARSING:
-			  if (bSimplePidl)
-				{ /* if the IShellFolder has parents, get the path from the
-				  parent and add the ItemName*/
-          szText[0]=0x00;
-				  if (this->mlpszFolder && strlen (this->mlpszFolder))
-          { if (strcmp(this->mlpszFolder,"My Computer"))
-  			  { strcpy (szText,this->mlpszFolder);
-  			    PathAddBackslash (szText);
-  			  }
-  		  	}
-          pidlTemp = this->pPidlMgr->lpvtbl->fnGetLastItem(this->pPidlMgr,pidl);
+	  switch(dwFlags)
+	  { case SHGDN_NORMAL:
+	      _ILGetPidlPath( pidl, szText, MAX_PATH);
+	      break;
+	    case SHGDN_INFOLDER:
+	      pidlTemp = ILFindLastID(pidl);
+	      if (pidlTemp)
+	      { _ILGetItemText( pidlTemp, szText, MAX_PATH);
+	      }
+	      break;				
+	    case SHGDN_FORPARSING:
+	      if (bSimplePidl)
+	      { /* if the IShellFolder has parents, get the path from the
+	        parent and add the ItemName*/
+	        szText[0]=0x00;
+	        if (this->mlpszFolder && strlen (this->mlpszFolder))
+	        { if (strcmp(this->mlpszFolder,"My Computer"))
+	          { strcpy (szText,this->mlpszFolder);
+	            PathAddBackslash (szText);
+	          }
+	        }
+	        pidlTemp = ILFindLastID(pidl);
         	if (pidlTemp)
-          { this->pPidlMgr->lpvtbl->fnGetItemText(this->pPidlMgr, pidlTemp, szTemp, MAX_PATH );
-        	} 
-					strcat(szText,szTemp);
-				}
-				else					
-				{ /* if the pidl is absolute, get everything from the pidl*/
-				  this->pPidlMgr->lpvtbl->fnGetPidlPath(this->pPidlMgr, pidl, szText, MAX_PATH);
-				}
-        break;
-      default:    return E_INVALIDARG;
-    }
-		if ((szText[0]==0x00 && szDrive[0]!=0x00)|| (bSimplePidl && szDrive[0]!=0x00))
-		{ strcpy(szText,szDrive);
-		}
-		if (szText[0]==0x00 && szSpecial[0]!=0x00)
-		{ strcpy(szText,szSpecial);
-		}
-  }
+	        { _ILGetItemText( pidlTemp, szTemp, MAX_PATH );
+	        } 
+	        strcat(szText,szTemp);
+	      }
+	      else					
+	      { /* if the pidl is absolute, get everything from the pidl*/
+	        _ILGetPidlPath( pidl, szText, MAX_PATH);
+	      }
+	      break;
+	    default:
+	      return E_INVALIDARG;
+	  }
+	  if ((szText[0]==0x00 && szDrive[0]!=0x00)|| (bSimplePidl && szDrive[0]!=0x00))
+	  { strcpy(szText,szDrive);
+	  }
+	  if (szText[0]==0x00 && szSpecial[0]!=0x00)
+	  { strcpy(szText,szSpecial);
+	  }
+	}
   
-  TRACE(shell,"-- (%p)->(%s,%s,%s)\n",this,szSpecial,szDrive,szText);
+	TRACE(shell,"-- (%p)->(%s,%s,%s)\n",this,szSpecial,szDrive,szText);
 
-  if(!(lpName))
-  {  return E_OUTOFMEMORY;
-  }
-  lpName->uType = STRRET_CSTR;	
-  strcpy(lpName->u.cStr,szText);
-  return S_OK;
+	if(!(lpName))
+	{  return E_OUTOFMEMORY;
+	}
+	lpName->uType = STRRET_CSTR;	
+	strcpy(lpName->u.cStr,szText);
+	return S_OK;
 }
 
 /**************************************************************************
@@ -762,21 +744,20 @@
 *  FIXME: drive not included
 */
 static BOOL32 WINAPI IShellFolder_GetFolderPath(LPSHELLFOLDER this, LPSTR lpszOut, DWORD dwOutSize)
-{	CHAR szTemp[MAX_PATH];
-	DWORD dwSize;
-    
-    TRACE(shell,"(%p)->(%p %lu)\n",this, lpszOut, dwOutSize);
-    if (!lpszOut)
-    { return FALSE;
-    }
-    
-    *lpszOut=0;
-    
-    dwSize = strlen (this->mlpszFolder) +1;
-    if ( dwSize > dwOutSize)
-      return FALSE;
-    strcpy(lpszOut, this->mlpszFolder);
+{	DWORD	dwSize;
 
-    TRACE(shell,"-- (%p)->(return=%s)\n",this, lpszOut);
-    return TRUE;
+	TRACE(shell,"(%p)->(%p %lu)\n",this, lpszOut, dwOutSize);
+	if (!lpszOut)
+	{ return FALSE;
+	}
+    
+	*lpszOut=0;
+    
+	dwSize = strlen (this->mlpszFolder) +1;
+	if ( dwSize > dwOutSize)
+	  return FALSE;
+	strcpy(lpszOut, this->mlpszFolder);
+
+	TRACE(shell,"-- (%p)->(return=%s)\n",this, lpszOut);
+	return TRUE;
 }
diff --git a/dlls/shell32/shlview.c b/dlls/shell32/shlview.c
index 90796db..3939b38 100644
--- a/dlls/shell32/shlview.c
+++ b/dlls/shell32/shlview.c
@@ -97,7 +97,8 @@
   sv->lpvtbl=&svvt;
   
   sv->mpidl = ILClone(pidl);
-
+  sv->hMenu=0;
+  
   sv->pSFParent = pFolder;
   if(sv->pSFParent)
     sv->pSFParent->lpvtbl->fnAddRef(sv->pSFParent);
@@ -118,8 +119,8 @@
 
   TRACE(shell,"%p\n",this);
 
-  dwStyle = WS_TABSTOP | WS_VISIBLE |WS_CHILD | WS_BORDER | LVS_REPORT |
-            LVS_SHAREIMAGELISTS | LVS_EDITLABELS ;
+  dwStyle = WS_TABSTOP | WS_VISIBLE | WS_CHILD | WS_BORDER |
+  		 LVS_ICON | LVS_SHAREIMAGELISTS | LVS_EDITLABELS ;
 
   this->hWndList=CreateWindowEx32A( WS_EX_CLIENTEDGE,WC_LISTVIEW32A,NULL,dwStyle,
   								0,0,0,0,
@@ -143,7 +144,7 @@
 int  nColumn4=100;
 
 BOOL32 ShellView_InitList(LPSHELLVIEW this)
-{ LV_COLUMN   lvColumn;
+{ LVCOLUMN32A lvColumn;
   CHAR        szString[50];
 
   TRACE(shell,"%p\n",this);
@@ -152,29 +153,32 @@
   ListView_DeleteAllItems(this->hWndList);		/*empty the list*/
 
   //initialize the columns
-  lvColumn.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT |  LVCF_SUBITEM;
+  lvColumn.mask = LVCF_FMT | LVCF_WIDTH  |  LVCF_SUBITEM;
+
   lvColumn.fmt = LVCFMT_LEFT;
   lvColumn.pszText = szString;
 
   lvColumn.cx = nColumn1;
   strcpy(szString,"File");
   /*LoadString32A(shell32_hInstance, IDS_COLUMN1, szString, sizeof(szString));*/
-  ListView_InsertColumn(this->hWndList, 0, &lvColumn);
+  ListView_InsertColumn32A(this->hWndList, 0, &lvColumn);
 
   lvColumn.cx = nColumn2;
-  strcpy(szString,"IDS_COLUMN2");
-  ListView_InsertColumn(this->hWndList, 1, &lvColumn);
+  strcpy(szString,"COLUMN2");
+  ListView_InsertColumn32A(this->hWndList, 1, &lvColumn);
 
   lvColumn.cx = nColumn3;
-  strcpy(szString,"IDS_COLUMN3");
-  ListView_InsertColumn(this->hWndList, 2, &lvColumn);
+  strcpy(szString,"COLUMN3");
+  ListView_InsertColumn32A(this->hWndList, 2, &lvColumn);
 
   lvColumn.cx = nColumn4;
-  strcpy(szString,"IDS_COLUMN4");
-  ListView_InsertColumn(this->hWndList, 3, &lvColumn);
+  strcpy(szString,"COLUMN4");
+  ListView_InsertColumn32A(this->hWndList, 3, &lvColumn);
 
-  ListView_SetImageList(this->hWndList, ShellBigIconList, LVSIL_SMALL);
-
+  ListView_SetImageList(this->hWndList, ShellSmallIconList, LVSIL_SMALL);
+  ListView_SetImageList(this->hWndList, ShellBigIconList, LVSIL_NORMAL);
+  ListView_SetBkColor(this->hWndList, 0x00800000 );
+  
   return TRUE;
 }
 /**************************************************************************
@@ -204,11 +208,11 @@
 { LPENUMIDLIST   pEnumIDList;
   LPITEMIDLIST   pidl;
   DWORD          dwFetched;
-  LV_ITEM  lvItem;
+  LVITEM32A      lvItem;
   
   TRACE(shell,"%p\n",this);
   
-  if(S_OK == this->pSFParent->lpvtbl->fnEnumObjects(this->pSFParent,this->hWnd, SHCONTF_NONFOLDERS | SHCONTF_FOLDERS, &pEnumIDList))
+  if(SUCCEEDED(this->pSFParent->lpvtbl->fnEnumObjects(this->pSFParent,this->hWnd, SHCONTF_NONFOLDERS | SHCONTF_FOLDERS, &pEnumIDList)))
   { SendMessage32A(this->hWndList, WM_SETREDRAW, FALSE, 0); /*turn the listview's redrawing off*/
 
     while((S_OK == pEnumIDList->lpvtbl->fnNext(pEnumIDList,1, &pidl, &dwFetched)) && dwFetched)
@@ -219,7 +223,7 @@
       lvItem.lParam = (LPARAM)ILClone(pidl);		/*set the item's data*/
       lvItem.pszText = LPSTR_TEXTCALLBACK32A;		/*get text on a callback basis*/
       lvItem.iImage = I_IMAGECALLBACK;				/*get the image on a callback basis*/
-      ListView_InsertItem(this->hWndList, &lvItem);	/*add the item*/    
+      ListView_InsertItem32A(this->hWndList, &lvItem);	/*add the item*/    
    }
 
    /*sort the items*/
@@ -267,9 +271,11 @@
 {   CHAR			szText[MAX_PATH];
 	MENUITEMINFO32A	mii;
 	int				nTools,i;
-	HMENU32 		hSubMenu = CreatePopupMenu32();
+	HMENU32 		hSubMenu;
 
 	TRACE(shell,"(%p) stub\n",this);
+
+    hSubMenu = CreatePopupMenu32();
 	if(hSubMenu)
 	{ /*get the number of items in our global array*/
 	  for(nTools = 0; g_Tools[nTools].idCommand != -1; nTools++){}
@@ -478,7 +484,7 @@
 }
 
 /**************************************************************************
-* CShellView::AddRemoveDockingWindow()
+* ShellView_AddRemoveDockingWindow()
 */   
 BOOL32 ShellView_AddRemoveDockingWindow(LPSHELLVIEW this, BOOL32 bAdd)
 {	TRACE(shell,"(%p)->(badd=0x%08x) stub\n",this,bAdd);
@@ -537,28 +543,6 @@
 }
 
 /**************************************************************************
-* ShellView_OnCommand()
-*/   
-LRESULT ShellView_OnCommand(LPSHELLVIEW this,DWORD dwCmdID, DWORD dwCmd, HWND32 hwndCmd)
-{	TRACE(shell,"(%p)->(0x%08lx 0x%08lx 0x%08x) stub\n",this, dwCmdID, dwCmd, hwndCmd);
-	switch(dwCmdID)
-    { case IDM_VIEW_FILES:
-        g_bViewKeys = ! g_bViewKeys;
-        IShellView_Refresh(this);
-        break;
-
-	  case IDM_VIEW_IDW:
-        g_bShowIDW = ! g_bShowIDW;
-        ShellView_AddRemoveDockingWindow(this, g_bShowIDW);
-        break;
-   
-	  case IDM_MYFILEITEM:
-        MessageBeep32(MB_OK);
-        break;
-	}
-	return 0;
-}
-/**************************************************************************
 * ShellView_CanDoIDockingWindow()
 */   
 BOOL32 ShellView_CanDoIDockingWindow(LPSHELLVIEW this)
@@ -590,12 +574,12 @@
 	CheckMenuItem32(hMenu, IDM_VIEW_FILES, MF_BYCOMMAND | (g_bViewKeys ? MF_CHECKED: MF_UNCHECKED));
 
 	if(ShellView_CanDoIDockingWindow(this))
-    { EnableMenuItem32(hMenu, IDM_VIEW_IDW, MF_BYCOMMAND | MF_ENABLED);
-      CheckMenuItem32(hMenu, IDM_VIEW_IDW, MF_BYCOMMAND | (g_bShowIDW ? MF_CHECKED: MF_UNCHECKED));
+	{ EnableMenuItem32(hMenu, IDM_VIEW_IDW, MF_BYCOMMAND | MF_ENABLED);
+	  CheckMenuItem32(hMenu, IDM_VIEW_IDW, MF_BYCOMMAND | (g_bShowIDW ? MF_CHECKED: MF_UNCHECKED));
 	}
 	else
 	{ EnableMenuItem32(hMenu, IDM_VIEW_IDW, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED);
-      CheckMenuItem32(hMenu, IDM_VIEW_IDW, MF_BYCOMMAND | MF_UNCHECKED);
+	  CheckMenuItem32(hMenu, IDM_VIEW_IDW, MF_BYCOMMAND | MF_UNCHECKED);
 	}
 	return 0;
 }
@@ -604,7 +588,7 @@
 *  ShellView_UpdateShellSettings()
    
 **************************************************************************/
-typedef void (WINAPI *PFNSHGETSETTINGSPROC)(LPSHELLFLAGSTATE lpsfs, DWORD dwMask);
+typedef void (CALLBACK *PFNSHGETSETTINGSPROC)(LPSHELLFLAGSTATE lpsfs, DWORD dwMask);
 
 
 void ShellView_UpdateShellSettings(LPSHELLVIEW this)
@@ -664,202 +648,239 @@
 *   ShellView_DoContextMenu()
 */   
 void ShellView_DoContextMenu(LPSHELLVIEW this, WORD x, WORD y, BOOL32 fDefault)
-{	UINT32			uSelected = ListView_GetSelectedCount(this->hWndList);
+{	UINT32		uCommand, i, uSelected = ListView_GetSelectedCount(this->hWndList);
+	HMENU32 hMenu;
+	BOOL32  fExplore = FALSE;
+	HWND32  hwndTree = 0;
+	INT32          	nMenuIndex;
 	LPITEMIDLIST	*aSelectedItems;
-	UINT32			i;
-	LPCONTEXTMENU	pContextMenu = NULL;
-	LVITEM			lvItem;
-	UINT32  		uCommand;
+	LVITEM32A	lvItem;
 	MENUITEMINFO32A	mii;
-	int            	nMenuIndex;
-    CMINVOKECOMMANDINFO  cmi;
-
+	LPCONTEXTMENU	pContextMenu = NULL;
+	CMINVOKECOMMANDINFO32  cmi;
+	
 	TRACE(shell,"(%p)->(0x%08x 0x%08x 0x%08x) stub\n",this, x, y, fDefault);
 	aSelectedItems = (LPITEMIDLIST*)SHAlloc(uSelected * sizeof(LPITEMIDLIST));
 
 	if(aSelectedItems)
-	{ ZeroMemory(&lvItem, sizeof(lvItem));
+	{ TRACE(shell,"-- aSelectedItems\n");
+	  ZeroMemory(&lvItem, sizeof(lvItem));
 	  lvItem.mask = LVIF_STATE | LVIF_PARAM;
 	  lvItem.stateMask = LVIS_SELECTED;
 	  lvItem.iItem = 0;
 
 	  i = 0;
    
-	  while(ListView_GetItem(this->hWndList, &lvItem) && (i < uSelected))
-      { if(lvItem.state & LVIS_SELECTED)
-        { aSelectedItems[i] = (LPITEMIDLIST)lvItem.lParam;
-          i++;
-        }
-        lvItem.iItem++;
-      }
+	  while(ListView_GetItem32A(this->hWndList, &lvItem) && (i < uSelected))
+	  { if(lvItem.state & LVIS_SELECTED)
+	    { aSelectedItems[i] = (LPITEMIDLIST)lvItem.lParam;
+	      i++;
+	    }
+	    lvItem.iItem++;
+	  }
 
 	  this->pSFParent->lpvtbl->fnGetUIObjectOf(this->pSFParent, this->hWndParent, uSelected,
       				(LPCITEMIDLIST*)aSelectedItems, &IID_IContextMenu, NULL,(LPVOID*)&pContextMenu);
    
 	  if(pContextMenu)
-      { HMENU32 hMenu = CreatePopupMenu32();
+	  { TRACE(shell,"-- pContextMenu\n");
+	    hMenu = CreatePopupMenu32();
 
         /* See if we are in Explore or Open mode. If the browser's tree is present, 
         then we are in Explore mode.*/
         
-	    BOOL32  fExplore = FALSE;
-	    HWND32  hwndTree = 0;
-	    if(S_OK==(this->pShellBrowser->lpvtbl->fnGetControlWindow(this->pShellBrowser,FCW_TREE, &hwndTree)) && hwndTree)
-        { fExplore = TRUE;
-        }
+	    fExplore = FALSE;
+	    hwndTree = 0;
+	    if(SUCCEEDED(this->pShellBrowser->lpvtbl->fnGetControlWindow(this->pShellBrowser,FCW_TREE, &hwndTree)) && hwndTree)
+	    { TRACE(shell,"-- fExplore\n");
+	      fExplore = TRUE;
+	    }
 
-	    if(hMenu && S_OK==(pContextMenu->lpvtbl->fnQueryContextMenu(pContextMenu,
+	    if(hMenu && SUCCEEDED(pContextMenu->lpvtbl->fnQueryContextMenu(pContextMenu,
         					hMenu,0,MENU_OFFSET,MENU_MAX,CMF_NORMAL | 
-							(uSelected != 1 ? 0 : CMF_CANRENAME) | (fExplore ? CMF_EXPLORE : 0))))
-        { if(fDefault)
-            { uCommand = 0;
+							(uSelected != 1 ? 0 : CMF_CANRENAME) |
+                            (fExplore ? CMF_EXPLORE : 0))))
+	    { if(fDefault)
+	      { TRACE(shell,"-- fDefault\n");
+	        uCommand = 0;
             
-              ZeroMemory(&mii, sizeof(mii));
-              mii.cbSize = sizeof(mii);
-              mii.fMask = MIIM_STATE | MIIM_ID;
+	        ZeroMemory(&mii, sizeof(mii));
+	        mii.cbSize = sizeof(mii);
+	        mii.fMask = MIIM_STATE | MIIM_ID;
 
-              nMenuIndex = 0;
+	        nMenuIndex = 0;
 
-              //find the default item in the menu
-              while(GetMenuItemInfo32A(hMenu, nMenuIndex, TRUE, &mii))
-              { if(mii.fState & MFS_DEFAULT)
-                { uCommand = mii.wID;
-                  break;
-                }
-                nMenuIndex++;
-              }
-            }
-            else
-            { uCommand = TrackPopupMenu32( hMenu,TPM_LEFTALIGN | TPM_RETURNCMD,x,y,0,this->hWnd,NULL);
-            }
+	        /*find the default item in the menu*/
+	        while(GetMenuItemInfo32A(hMenu, nMenuIndex, TRUE, &mii))
+	        { if(mii.fState & MFS_DEFAULT)
+	          { uCommand = mii.wID;
+	            break;
+	          }
+	          nMenuIndex++;
+	        }
+	      }
+	      else
+	      { TRACE(shell,"-- ! fDefault\n");
+	        uCommand = TrackPopupMenu32( hMenu,TPM_LEFTALIGN | TPM_RETURNCMD,x,y,0,this->hWnd,NULL);
+	      }
          
-            if(uCommand > 0)
-            { ZeroMemory(&cmi, sizeof(cmi));
-              cmi.cbSize = sizeof(cmi);
-              cmi.hwnd = this->hWndParent;
-              cmi.lpVerb = (LPCSTR)MAKEINTRESOURCE32A(uCommand - MENU_OFFSET);
-			  pContextMenu->lpvtbl->fnInvokeCommand(pContextMenu, &cmi);
-            }
-            DestroyMenu32(hMenu);
-         }
-         pContextMenu->lpvtbl->fnRelease(pContextMenu);
-      }
-      SHFree(aSelectedItems);
+	      if(uCommand > 0)
+	      { TRACE(shell,"-- ! uCommand\n");
+	        ZeroMemory(&cmi, sizeof(cmi));
+	        cmi.cbSize = sizeof(cmi);
+	        cmi.hwnd = this->hWndParent;
+	        cmi.lpVerb = (LPCSTR)MAKEINTRESOURCE32A(uCommand - MENU_OFFSET);
+			pContextMenu->lpvtbl->fnInvokeCommand(pContextMenu, &cmi);
+	      }
+	      DestroyMenu32(hMenu);
+	    }
+	  pContextMenu->lpvtbl->fnRelease(pContextMenu);
+	  }
+	  SHFree(aSelectedItems);
 	}
 }
 
 /**************************************************************************
+* ShellView_OnCommand()
+*/   
+LRESULT ShellView_OnCommand(LPSHELLVIEW this,DWORD dwCmdID, DWORD dwCmd, HWND32 hwndCmd)
+{	TRACE(shell,"(%p)->(0x%08lx 0x%08lx 0x%08x) stub\n",this, dwCmdID, dwCmd, hwndCmd);
+	switch(dwCmdID)
+	{ case IDM_VIEW_FILES:
+	    g_bViewKeys = ! g_bViewKeys;
+	    IShellView_Refresh(this);
+	    break;
+
+	  case IDM_VIEW_IDW:
+	    g_bShowIDW = ! g_bShowIDW;
+	    ShellView_AddRemoveDockingWindow(this, g_bShowIDW);
+	    break;
+   
+	  case IDM_MYFILEITEM:
+	    MessageBeep32(MB_OK);
+	    break;
+
+	  default:
+	    FIXME(shell,"-- unknown command\n");
+	}
+	return 0;
+}
+
+/**************************************************************************
 * ShellView_OnNotify()
 */
    
 LRESULT ShellView_OnNotify(LPSHELLVIEW this, UINT32 CtlID, LPNMHDR lpnmh)
-{ NM_LISTVIEW *lpnmlv = (NM_LISTVIEW*)lpnmh;
-  LV_DISPINFO *lpdi = (LV_DISPINFO *)lpnmh;
-  LPITEMIDLIST pidl;
-  DWORD dwCursor; 
-  STRRET   str;  
-  UINT32  uFlags;
-  IExtractIcon *pei;
+{	NM_LISTVIEW *lpnmlv = (NM_LISTVIEW*)lpnmh;
+	NMLVDISPINFO32A *lpdi = (NMLVDISPINFO32A *)lpnmh;
+	LPITEMIDLIST pidl;
+	DWORD dwCursor; 
+	STRRET   str;  
+	UINT32  uFlags;
+	IExtractIcon *pei;
   
-  TRACE(shell,"%p CtlID=%u lpnmh->code=%x\n",this,CtlID,lpnmh->code);
+	TRACE(shell,"%p CtlID=%u lpnmh->code=%x\n",this,CtlID,lpnmh->code);
   
-  switch(lpnmh->code)
-  { case NM_SETFOCUS:
-	  TRACE(shell,"NM_SETFOCUS %p\n",this);
-      ShellView_OnSetFocus(this);
-      break;
+	switch(lpnmh->code)
+	{   case NM_SETFOCUS:
+	    TRACE(shell,"NM_SETFOCUS %p\n",this);
+	    ShellView_OnSetFocus(this);
+	    break;
 
-    case NM_KILLFOCUS:
-	  TRACE(shell,"NM_KILLFOCUS %p\n",this);
-      ShellView_OnDeactivate(this);
-      break;
+	  case NM_KILLFOCUS:
+	    TRACE(shell,"NM_KILLFOCUS %p\n",this);
+	    ShellView_OnDeactivate(this);
+	    break;
 
-    case HDN_ENDTRACK:
-	  TRACE(shell,"HDN_ENDTRACK %p\n",this);
-      /*nColumn1 = ListView_GetColumnWidth(this->hWndList, 0);
-      nColumn2 = ListView_GetColumnWidth(this->hWndList, 1);*/
-	  return 0;
+	  case HDN_ENDTRACK32A:
+	    TRACE(shell,"HDN_ENDTRACK32A %p\n",this);
+	    /*nColumn1 = ListView_GetColumnWidth(this->hWndList, 0);
+	    nColumn2 = ListView_GetColumnWidth(this->hWndList, 1);*/
+	    return 0;
    
-   case LVN_DELETEITEM:
-	  TRACE(shell,"LVN_DELETEITEM %p\n",this);
-      SHFree((LPITEMIDLIST)lpnmlv->lParam);     /*delete the pidl because we made a copy of it*/
-      break;
+	  case LVN_DELETEITEM:
+	    TRACE(shell,"LVN_DELETEITEM %p\n",this);
+	    SHFree((LPITEMIDLIST)lpnmlv->lParam);     /*delete the pidl because we made a copy of it*/
+	    break;
    
 #ifdef LVN_ITEMACTIVATE
-   case LVN_ITEMACTIVATE:
-
-#else    //LVN_ITEMACTIVATE
-   case NM_DBLCLK:
-   case NM_RETURN:
-#endif   //LVN_ITEMACTIVATE
-	  TRACE(shell,"LVN_ITEMACTIVATE | NM_RETURN %p\n",this);
-      ShellView_DoContextMenu(this, 0, 0, TRUE);
-      return 0;
+	  case LVN_ITEMACTIVATE:
+#else
+	  case NM_DBLCLK:
+	  case NM_RETURN:
+#endif
+	    TRACE(shell,"LVN_ITEMACTIVATE | NM_RETURN %p\n",this);
+	    ShellView_DoContextMenu(this, 0, 0, TRUE);
+	    return 0;
    
-   case LVN_GETDISPINFO:
-      TRACE(shell,"LVN_GETDISPINFO %p\n",this);
-      pidl = (LPITEMIDLIST)lpdi->item.lParam;
+	  case NM_RCLICK:
+	    TRACE(shell,"NM_RCLICK %p\n",this);
+	    dwCursor = GetMessagePos();
+	    ShellView_DoContextMenu(this, LOWORD(dwCursor), HIWORD(dwCursor), FALSE);
+
+	  case LVN_GETDISPINFO32A:
+	    TRACE(shell,"LVN_GETDISPINFO32A %p\n",this);
+	    pidl = (LPITEMIDLIST)lpdi->item.lParam;
 
 
-      if(lpdi->item.iSubItem)	      /*is the sub-item information being requested?*/
-      { if(lpdi->item.mask & LVIF_TEXT)	 /*is the text being requested?*/
-        { if(PidlMgr_IsValue(NULL,pidl))	/*is this a value or a folder?*/
-          {  PidlMgr_GetDataText(NULL,this->mpidl, pidl, lpdi->item.pszText, lpdi->item.cchTextMax);
-             if(!*lpdi->item.pszText)
-               sprintf(lpdi->item.pszText, "file attrib %u", lpdi->item.iSubItem );
-          }
-          else  /*its a folder*/
-          { sprintf(lpdi->item.pszText, "folder attrib %u", lpdi->item.iSubItem );
-          }
-        }
-      }
-      else       /*the item text is being requested*/
-      { if(lpdi->item.mask & LVIF_TEXT)       /*is the text being requested?*/
-        { if(S_OK==this->pSFParent->lpvtbl->fnGetDisplayNameOf(this->pSFParent,pidl, SHGDN_NORMAL | SHGDN_INFOLDER, &str))
-          { if(STRRET_WSTR == str.uType)
-            { WideCharToLocal32(lpdi->item.pszText, str.u.pOleStr, lpdi->item.cchTextMax);
-              SHFree(str.u.pOleStr);
-            }
-            if(STRRET_CSTR == str.uType)
-            { strncpy(lpdi->item.pszText, str.u.cStr, lpdi->item.cchTextMax);
-            }
-          }
-        }
+	    if(lpdi->item.iSubItem)		  /*is the sub-item information being requested?*/
+	    { if(lpdi->item.mask & LVIF_TEXT)	 /*is the text being requested?*/
+	      { if(_ILIsValue(pidl))	/*is this a value or a folder?*/
+	        {  _ILGetDataText(this->mpidl, pidl, lpdi->item.pszText, lpdi->item.cchTextMax);
+	           if(!*lpdi->item.pszText)
+	           sprintf(lpdi->item.pszText, "file attrib %u", lpdi->item.iSubItem );
+	        }
+	        else  /*its a folder*/
+	        { sprintf(lpdi->item.pszText, "folder attrib %u", lpdi->item.iSubItem );
+	        }
+	      }
+	    }
+	    else	   /*the item text is being requested*/
+	    { if(lpdi->item.mask & LVIF_TEXT)	   /*is the text being requested?*/
+	      { if(SUCCEEDED(this->pSFParent->lpvtbl->fnGetDisplayNameOf(this->pSFParent,pidl, SHGDN_NORMAL | SHGDN_INFOLDER, &str)))
+	        { if(STRRET_WSTR == str.uType)
+	          { WideCharToLocal32(lpdi->item.pszText, str.u.pOleStr, lpdi->item.cchTextMax);
+	            SHFree(str.u.pOleStr);
+	          }
+	          if(STRRET_CSTR == str.uType)
+	          { strncpy(lpdi->item.pszText, str.u.cStr, lpdi->item.cchTextMax);
+	          }
+	        }
+	      }
 
-        if(lpdi->item.mask & LVIF_IMAGE) 		/*is the image being requested?*/
-        { if(S_OK == (this->pSFParent->lpvtbl->fnGetUIObjectOf(this->pSFParent,this->hWnd,1,
-        						(LPCITEMIDLIST*)&pidl, (REFIID)&IID_IExtractIcon, NULL, (LPVOID*)&pei)))
-          { //GetIconLoaction will give us the index into our image list
-            pei->lpvtbl->fnGetIconLocation(pei, GIL_FORSHELL, NULL, 0, &lpdi->item.iImage, &uFlags);
-	        pei->lpvtbl->fnRelease(pei);
-          }
-        }
-      }
-      TRACE(shell,"-- text=%s image=%x\n",lpdi->item.pszText, lpdi->item.iImage);
-      return 0;
+	      if(lpdi->item.mask & LVIF_IMAGE) 		/*is the image being requested?*/
+	      { if(SUCCEEDED(this->pSFParent->lpvtbl->fnGetUIObjectOf(this->pSFParent,this->hWnd,1,
+				(LPCITEMIDLIST*)&pidl, (REFIID)&IID_IExtractIcon, NULL, (LPVOID*)&pei)))
+	        { //GetIconLoaction will give us the index into our image list
+	          pei->lpvtbl->fnGetIconLocation(pei, GIL_FORSHELL, NULL, 0, &lpdi->item.iImage, &uFlags);
+	          pei->lpvtbl->fnRelease(pei);
+	        }
+	      }
+	    }
+	    TRACE(shell,"-- text=%s image=%x\n",lpdi->item.pszText, lpdi->item.iImage);
+	    return 0;
 
-    case NM_RCLICK:
-	  TRACE(shell,"NM_RCLICK %p\n",this);
-      dwCursor = GetMessagePos();
-      ShellView_DoContextMenu(this, LOWORD(dwCursor), HIWORD(dwCursor), FALSE);
+	  case NM_CLICK:
+	    TRACE(shell,"NM_CLICK %p\n",this);
+	    break;
 
-    case NM_CLICK:
-	  TRACE(shell,"NM_CLICK %p\n",this);
-      break;
+	  case LVN_ITEMCHANGING:
+	    TRACE(shell,"LVN_ITEMCHANGING %p\n",this);
+	    break;
 
-    case LVN_ITEMCHANGING:
-	  TRACE(shell,"LVN_ITEMCHANGING %p\n",this);
-      break;
+	  case LVN_ITEMCHANGED:
+	    TRACE(shell,"LVN_ITEMCHANGED %p\n",this);
+	    break;
 
-    case NM_CUSTOMDRAW:
-	  TRACE(shell,"NM_CUSTOMDRAW %p\n",this);
-      break;
+	  case NM_CUSTOMDRAW:
+	    TRACE(shell,"NM_CUSTOMDRAW %p\n",this);
+	    break;
 
-	default:
-      WARN (shell,"-- WM_NOTIFY unhandled\n");
-    return 0;
-  }
-  return 0;
+	  default:
+	    WARN (shell,"-- WM_NOTIFY unhandled\n");
+	    return 0;
+	}
+	return 0;
 }
 
 /**************************************************************************
@@ -875,7 +896,8 @@
 LRESULT CALLBACK ShellView_WndProc(HWND32 hWnd, UINT32 uMessage, WPARAM32 wParam, LPARAM lParam)
 { LPSHELLVIEW pThis = (LPSHELLVIEW)GetWindowLong32A(hWnd, GWL_USERDATA);
   LPCREATESTRUCT32A lpcs;
-
+  DWORD dwCursor;
+  
   FIXME(shell,"(hwnd=%x msg=%x wparm=%x lparm=%lx)\n",hWnd, uMessage, wParam, lParam);
     
   switch (uMessage)
@@ -970,6 +992,11 @@
 
    case WM_PARENTNOTIFY:
       TRACE(shell,"WM_PARENTNOTIFY\n");
+      if ( LOWORD(wParam) == WM_RBUTTONDOWN ) /* fixme: should not be handled here*/
+      { dwCursor = GetMessagePos();
+	ShellView_DoContextMenu(pThis, LOWORD(dwCursor), HIWORD(dwCursor), FALSE);
+	return TRUE;
+      }
       break;
 
    case WM_MOUSEACTIVATE:
@@ -1033,7 +1060,7 @@
   return this->ref;
 }
 /**************************************************************************
-*  IShellView::GetWindow
+*  ShellView_GetWindow
 */
 static HRESULT WINAPI IShellView_GetWindow(LPSHELLVIEW this,HWND32 * phWnd)
 { TRACE(shell,"(%p) stub\n",this);
@@ -1045,9 +1072,19 @@
 { FIXME(shell,"(%p) stub\n",this);
   return E_NOTIMPL;
 }
+/**************************************************************************
+* IShellView_TranslateAccelerator
+*
+* FIXME:
+*  use the accel functions
+*/
 static HRESULT WINAPI IShellView_TranslateAccelerator(LPSHELLVIEW this,LPMSG32 lpmsg)
-{ FIXME(shell,"(%p)->(%p) stub\n",this,lpmsg);
-  return E_NOTIMPL;
+{	FIXME(shell,"(%p)->(%p: hwnd=%x msg=%x lp=%lx wp=%x) stub\n",this,lpmsg, lpmsg->hwnd, lpmsg->message, lpmsg->lParam, lpmsg->wParam);
+/*	switch (lpmsg->message)
+	{ case WM_RBUTTONDOWN:		
+		return SendMessage32A ( lpmsg->hwnd, WM_NOTIFY, );
+	}*/
+	return S_FALSE;
 }
 static HRESULT WINAPI IShellView_EnableModeless(LPSHELLVIEW this,BOOL32 fEnable)
 { FIXME(shell,"(%p) stub\n",this);
@@ -1151,7 +1188,7 @@
 	IShellView_UIActivate(this, SVUIA_DEACTIVATE);
 	if(this->hMenu)
    	{ DestroyMenu32(this->hMenu);
-    }
+	}
 	DestroyWindow32(this->hWnd);
 	this->pShellBrowser->lpvtbl->fnRelease(this->pShellBrowser);
 	return S_OK;
diff --git a/documentation/common_controls b/documentation/common_controls
index 43b4430..69c2c9f 100644
--- a/documentation/common_controls
+++ b/documentation/common_controls
@@ -29,19 +29,29 @@
 -----------
   This paragraph describes the development status of the common controls.
 
-  
-
 
 3.1 Animation Control
 ---------------------
+  Author:
+      Dummy written by Eric Kohl. <ekohl@abo.rhein-zeitung.de>
+
   Status:
-      - Nothing done at all.
+      - Dummy control. No functionality.
+
+  Notes:
+      Author needed!! Any volunteers??
 
 
 3.2 Combo Box Ex Control
 ------------------------
+  Author:
+      Dummy written by Eric Kohl. <ekohl@abo.rhein-zeitung.de>
+
   Status:
-      - Nothing done at all.
+      - Dummy control. No functionality.
+
+  Notes:
+      Author needed!! Any volunteers??
 
 
 3.3 Date and Time Picker Control
@@ -49,18 +59,27 @@
   Status:
       - Nothing done at all.
 
+  Notes:
+      Author needed!! Any volunteers??
+
 
 3.4 Drag List Box Control
 -------------------------
   Status:
       - Nothing done at all.
 
+  Notes:
+      Author needed!! Any volunteers??
+
 
 3.5 Flat Scroll Bar Control
 ---------------------------
   Status:
       - Nothing done at all.
 
+  Notes:
+      Author needed!! Any volunteers??
+
 
 3.6 Header Control
 ------------------
@@ -73,8 +92,14 @@
 
 3.7 Hot Key Control
 -------------------
+  Author:
+      Dummy written by Eric Kohl. <ekohl@abo.rhein-zeitung.de>
+
   Status:
-      - Nothing done at all.
+      Dummy control. No functionality.
+
+  Notes:
+      Author needed!! Any volunteers??
 
 
 3.8 Image List (no control)
@@ -96,21 +121,30 @@
   Status:
       - Nothing done at all.
 
+  Notes:
+      Author needed!! Any volunteers??
+
 
 3.10 List View Control
 ----------------------
   Author:
-      James Michael Mastros <root@jennifer-unix.dyn.ml.org>
+      Dummy written by Eric Kohl. <ekohl@abo.rhein-zeitung.de>
 
   Status:
       - Development in progress.
 
+  Notes:
+      Author needed!! Any volunteers??
+
 
 3.11 Month Calendar Control
 ---------------------------
   Status:
       - Nothing done at all.
 
+  Notes:
+      Author needed!! Any volunteers??
+
 
 3.12 Pager Control
 ------------------
@@ -217,13 +251,11 @@
 3.20 Trackbar Control
 ---------------------
   Author:
-      Dummy written by Eric Kohl.
+      Dummy written by Eric Kohl <ekohl@abo.rhein-zeitung.de>
+      Alex Priem (alexp@sci.kun.nl)
 
   Status:
-      - Dummy control. No functionality.
-
-  Notes:
-      Author needed!! Any volunteers??
+      Under construction.
 
 
 3.21 Tree View Control
@@ -233,7 +265,7 @@
       Alex Priem (alexp@sci.kun.nl)
 
   Status:
-      - Dummy control. No functionality.
+      Under contstruction.
 
 
 3.22 Updown Control
@@ -266,16 +298,16 @@
 ------------------------
 
   There are quite a lot of undocumented functions like:
-     - DSA (Dynnamic Structure Array) functions.
-     - DPA (Dymnamic Pointer Array?) functions.
+     - DSA (Dynnamic Storage Array) functions.
+     - DPA (Dymnamic Pointer Array) functions.
      - MRU ("Most Recently Used" List) functions.
      - other unknown functions.
 
   Have a look at relay32/comctl32.spec.
 
 
-5.1 Dymnamic Structure Arrays (DSA)
-------------------------------------
+5.1 Dymnamic Storage Arrays (DSA)
+---------------------------------
   Most of the DSA functions are implemented. I used TASKMAN.EXE to write them.
   Since TASKMAN.EXE doesn't bail out or crash I think I've done it right.
 
diff --git a/documentation/filehandles b/documentation/filehandles
index d002e4a..b057596 100644
--- a/documentation/filehandles
+++ b/documentation/filehandles
@@ -14,13 +14,18 @@
 (((handle)==0) ? GetStdHandle(STD_INPUT_HANDLE) : \
  ((handle)==1) ? GetStdHandle(STD_OUTPUT_HANDLE) : \
  ((handle)==2) ? GetStdHandle(STD_ERROR_HANDLE) : \
+ ((handle)>0x400) ? handle : \
  (handle)-5)
 
 #define HFILE32_TO_HFILE16(handle) ({ HFILE32 hnd=handle; \
       ((hnd==HFILE_ERROR32) ? HFILE_ERROR16 : \
+      ((handle>0x400) ? handle : \
        (HFILE16)hnd+5); })
 
 WARNING: be careful not to use the macro HFILE16_TO_HFILE32 on
 functions with side-effects, as it will cause them to be evaluated
 several times.  This could be considered a bug, but the use of this
 macro is limited enough not to need a rewrite.
+
+NOTE: The 0x400 special case above deals with LZW filehandles (see 
+misc/lzexpand.c).
diff --git a/documentation/shell32 b/documentation/shell32
index 4fcb2ef..676486a 100644
--- a/documentation/shell32
+++ b/documentation/shell32
@@ -27,6 +27,12 @@
 ----------------
     Status:
 	- development started
+
+    Undocumented:
+    word95 gets a IContextMenu Interface and calls HandleMenuMsg()
+    whitch should only a member of IContextMenu2. 
+    I suppose IContextMenu and IContextMenu2/3 are using the same vtable
+    and are in effect the same.
  
 4.2 IShellExtInit
 -----------------
@@ -60,12 +66,20 @@
 4.7. PIDL Manager
 -----------------
   Status:
-	- roughly complete will be migrated to a set of functions because it's
+    - roughly complete will be migrated to a set of functions because it's
     not holding any instance data,
 
+  Undocumented:
+  MS says: the abID of SHITEMID should be treated as binary data and not
+  be interpreted by applications. Applys to everyone but MS itself.
+  Word95 interprets the contents of abID (Filesize/Date) so we have to go
+  for binary compatibility here.
+  I expect the file open/close dialog in comctl32 does so also.
+
 
 5. Structures
 -------------
 
 5.1 PIDL
 --------
+
diff --git a/files/dos_fs.c b/files/dos_fs.c
index fd168c4..f662eac 100644
--- a/files/dos_fs.c
+++ b/files/dos_fs.c
@@ -320,6 +320,10 @@
         return NULL;
     }
 
+    /* Treat empty path as root directory. This simplifies path split into
+       directory and mask in several other places */
+    if (!*path) path = "/";
+
 #ifdef VFAT_IOCTL_READDIR_BOTH
 
     /* Check if the VFAT ioctl is supported on this directory */
@@ -609,7 +613,7 @@
     FILE_OBJECT *file;
     HFILE32 handle;
 
-    if (!name) return NULL; /* if FILE_DupUnixHandle was used */
+    if (!name) return (HFILE32)NULL; /* if FILE_DupUnixHandle was used */
     if (name[0] && (name[1] == ':')) name += 2;
     if ((p = strrchr( name, '/' ))) name = p + 1;
     if ((p = strrchr( name, '\\' ))) name = p + 1;
@@ -624,18 +628,24 @@
 		if (!strcmp(DOSFS_Devices[i].name,"NUL"))
 			return FILE_OpenUnixFile("/dev/null",unixmode);
 		if (!strcmp(DOSFS_Devices[i].name,"CON")) {
+			HFILE32 to_dup;
+			HFILE32 handle;
 			switch (unixmode) {
 			case O_RDONLY:
-				return GetStdHandle( STD_INPUT_HANDLE );
+				to_dup = GetStdHandle( STD_INPUT_HANDLE );
 				break;
 			case O_WRONLY:
-				return GetStdHandle( STD_OUTPUT_HANDLE );
+				to_dup = GetStdHandle( STD_OUTPUT_HANDLE );
 				break;
 			default:
 				FIXME(dosfs,"can't open CON read/write\n");
 				return HFILE_ERROR32;
 				break;
 			}
+			if (!DuplicateHandle( GetCurrentProcess(), to_dup, GetCurrentProcess(),
+					      &handle, 0, FALSE, DUPLICATE_SAME_ACCESS ))
+			    handle = HFILE_ERROR32;
+			return handle;
 		}
 		if (!strcmp(DOSFS_Devices[i].name,"SCSIMGR$")) {
 		        if ((handle = FILE_Alloc( &file )) == INVALID_HANDLE_VALUE32)
@@ -1166,19 +1176,19 @@
 
     /* Skip to desired position */
     while (info.cur_pos < skip)
-        if (DOSFS_ReadDir( info.dir, &long_name, &short_name ))
+        if (info.dir && DOSFS_ReadDir( info.dir, &long_name, &short_name ))
             info.cur_pos++;
         else
             break;
 
-    if (info.cur_pos == skip && DOSFS_FindNextEx( &info, entry ))
+    if (info.dir && info.cur_pos == skip && DOSFS_FindNextEx( &info, entry ))
         count = info.cur_pos - skip;
     else
         count = 0;
 
     if (!count)
     {
-        DOSFS_CloseDir( info.dir );
+        if (info.dir) DOSFS_CloseDir( info.dir );
         memset( &info, '\0', sizeof(info) );
     }
 
diff --git a/files/drive.c b/files/drive.c
index fa813af..0fa08c5 100644
--- a/files/drive.c
+++ b/files/drive.c
@@ -784,7 +784,7 @@
     case TYPE_HD:      return DRIVE_FIXED;
     case TYPE_CDROM:   return DRIVE_CDROM;
     case TYPE_NETWORK: return DRIVE_REMOTE;
-    case TYPE_INVALID:
+    case TYPE_INVALID: return DRIVE_DOESNOTEXIST;
     default:           return DRIVE_CANNOTDETERMINE;
     }
 }
@@ -1040,3 +1040,8 @@
     HeapFree( GetProcessHeap(), 0, xfsname );
     return ret;
 }
+
+BOOL32 WINAPI SetVolumeLabel32A(LPCSTR rootpath,LPCSTR volname) {
+	FIXME(dosfs,"(%s,%s),stub!\n",rootpath,volname);
+	return TRUE;
+}
diff --git a/files/file.c b/files/file.c
index a2bd5dd..205c630 100644
--- a/files/file.c
+++ b/files/file.c
@@ -87,6 +87,7 @@
     (*file)->unix_handle = -1;
     (*file)->unix_name = NULL;
     (*file)->type = FILE_TYPE_DISK;
+    (*file)->pos = 0;
 
     handle = HANDLE_Alloc( PROCESS_Current(), &(*file)->header,
                            FILE_ALL_ACCESS | GENERIC_READ |
@@ -112,7 +113,8 @@
 		return TRUE;
 	}
 
-	if ((result = read(file->unix_handle, lpBuffer, nNumberOfChars)) == -1)
+        if ( (file->pos < 0) || /* workaround, see SetFilePointer */
+        ((result = read(file->unix_handle, lpBuffer, nNumberOfChars)) == -1) )
         {
             FILE_SetDosError();
             return FALSE;
@@ -144,6 +146,11 @@
 	 * win32 doesn't have interrupted system calls 
 	 */
 
+        if (file->pos < 0) { /* workaround, see SetFilePointer */
+            FILE_SetDosError();
+            return FALSE;
+        }
+
 	for (;;)
         {
 		result = write(file->unix_handle, lpBuffer, nNumberOfChars);
@@ -871,6 +878,7 @@
  */
 HFILE16 WINAPI OpenFile16( LPCSTR name, OFSTRUCT *ofs, UINT16 mode )
 {
+    TRACE(file,"OpenFile16(%s,%i)\n", name, mode);
     return HFILE32_TO_HFILE16(FILE_DoOpenFile( name, ofs, mode, FALSE ));
 }
 
@@ -999,7 +1007,7 @@
                              DWORD method )
 {
     FILE_OBJECT *file;
-    int origin, result;
+    DWORD result = 0xffffffff;
 
     if (highword && *highword)
     {
@@ -1008,28 +1016,56 @@
         return 0xffffffff;
     }
     TRACE(file, "handle %d offset %ld origin %ld\n",
-	  hFile, distance, method );
+          hFile, distance, method );
 
     if (!(file = FILE_GetFile( hFile ))) return 0xffffffff;
+
+
+    /* the pointer may be positioned before the start of the file;
+        no error is returned in that case,
+        but subsequent attempts at I/O will produce errors.
+        This is not allowed with Unix lseek(),
+        so we'll need some emulation here */
     switch(method)
     {
-        case FILE_CURRENT: origin = SEEK_CUR; break;
-        case FILE_END:     origin = SEEK_END; break;
-        default:           origin = SEEK_SET; break;
+        case FILE_CURRENT:
+            distance += file->pos; /* fall through */
+        case FILE_BEGIN:
+            if ((result = lseek(file->unix_handle, distance, SEEK_SET)) == -1)
+            {
+                if ((INT32)distance < 0)
+                    file->pos = result = distance;
+            }
+            else
+            file->pos = result;
+            break;
+        case FILE_END:
+            if ((result = lseek(file->unix_handle, distance, SEEK_END)) == -1)
+            {
+                if ((INT32)distance < 0)
+                {
+                    /* get EOF */
+                    result = lseek(file->unix_handle, 0, SEEK_END);
+
+                    /* return to the old pos, as the first lseek failed */
+                    lseek(file->unix_handle, file->pos, SEEK_END);
+
+                    file->pos = (result += distance);
+                }
+                else
+                ERR(file, "lseek: unknown error. Please report.\n");
+            }
+            else file->pos = result;
+            break;
+        default:
+            ERR(file, "Unknown origin %ld !\n", method);
     }
 
-    if ((result = lseek( file->unix_handle, distance, origin )) == -1)
-      {
-	/* care for this pathological case:
-	   SetFilePointer(00000006,ffffffff,00000000,00000002)
-	   ret=0062ab4a fs=01c7 */
-	if ((distance != -1))
+    if (result == -1)
         FILE_SetDosError();
-	else
-	  result = 0;
-      }
+
     FILE_ReleaseFile( file );
-    return (DWORD)result;
+    return result;
 }
 
 
@@ -1665,7 +1701,7 @@
 
 
 /***********************************************************************
- *              SetFileTime   (KERNEL32.493)
+ *              SetFileTime   (KERNEL32.650)
  */
 BOOL32 WINAPI SetFileTime( HFILE32 hFile,
                            const FILETIME *lpCreationTime,
@@ -1676,7 +1712,7 @@
     struct utimbuf utimbuf;
     
     if (!file) return FILE_TYPE_UNKNOWN; /* FIXME: correct? */
-    TRACE(file,"(%s,%p,%p,%p)\n",
+    TRACE(file,"('%s',%p,%p,%p)\n",
 	file->unix_name,
 	lpCreationTime,
 	lpLastAccessTime,
@@ -1692,6 +1728,7 @@
 	utimbuf.modtime	= 0; /* FIXME */
     if (-1==utime(file->unix_name,&utimbuf))
     {
+	MSG("Couldn't set the time for file '%s'. Insufficient permissions !?\n", file->unix_name);
         FILE_ReleaseFile( file );
 	FILE_SetDosError();
 	return FALSE;
diff --git a/files/profile.c b/files/profile.c
index 49b58d7..e921513 100644
--- a/files/profile.c
+++ b/files/profile.c
@@ -952,6 +952,19 @@
 
 
 /***********************************************************************
+ *           GetProfileSection32W   (KERNEL32)
+ */
+INT32 WINAPI GetProfileSection32W( LPCWSTR section, LPWSTR buffer, DWORD len )
+{
+    if (!wininiW) wininiW = HEAP_strdupAtoW( SystemHeap, 0, "win.ini" );
+    return GetPrivateProfileSection32W( section, buffer, len, wininiW );
+}
+
+
+
+
+
+/***********************************************************************
  *           WriteProfileString16   (KERNEL.59)
  */
 BOOL16 WINAPI WriteProfileString16( LPCSTR section, LPCSTR entry,
@@ -1090,6 +1103,25 @@
 }
 
 /***********************************************************************
+ *           GetPrivateProfileSection32W   (KERNEL32.256)
+ */
+
+INT32 WINAPI GetPrivateProfileSection32W (LPCWSTR section, LPWSTR buffer,
+                                          DWORD len, LPCWSTR filename )
+
+{
+    LPSTR sectionA  = HEAP_strdupWtoA( GetProcessHeap(), 0, section );
+    LPSTR filenameA = HEAP_strdupWtoA( GetProcessHeap(), 0, filename );
+    LPSTR bufferA   = HeapAlloc( GetProcessHeap(), 0, len );
+    INT32 ret = GetPrivateProfileSection32A( sectionA, bufferA, len, 
+						filenameA );
+    HeapFree( GetProcessHeap(), 0, sectionA );
+    HeapFree( GetProcessHeap(), 0, filenameA );
+    HeapFree( GetProcessHeap(), 0, bufferA);
+    return ret;
+}
+
+/***********************************************************************
  *           WritePrivateProfileString16   (KERNEL.129)
  */
 BOOL16 WINAPI WritePrivateProfileString16( LPCSTR section, LPCSTR entry,
@@ -1136,7 +1168,7 @@
 {
     char *p =(char*)string;
 
-    FIXME(profile, "WritePrivateProfileSection32A empty stup\n");
+    FIXME(profile, "WritePrivateProfileSection32A empty stub\n");
     if (TRACE_ON(profile)) {
       TRACE(profile, "(%s) => [%s]\n", filename, section);
       while (*(p+1)) {
@@ -1150,6 +1182,43 @@
 }
 
 /***********************************************************************
+ *           WritePrivateProfileSection32W   (KERNEL32)
+ */
+BOOL32 WINAPI WritePrivateProfileSection32W( LPCWSTR section,
+                                            LPCWSTR string, LPCWSTR filename)
+
+{
+    LPSTR sectionA  = HEAP_strdupWtoA( GetProcessHeap(), 0, section );
+    LPSTR stringA   = HEAP_strdupWtoA( GetProcessHeap(), 0, string );
+    LPSTR filenameA = HEAP_strdupWtoA( GetProcessHeap(), 0, filename );
+    BOOL32 res = WritePrivateProfileSection32A( sectionA, stringA, filenameA );
+    HeapFree( GetProcessHeap(), 0, sectionA );
+    HeapFree( GetProcessHeap(), 0, stringA );
+    HeapFree( GetProcessHeap(), 0, filenameA );
+    return res;
+}
+
+
+/***********************************************************************
+ *           WriteProfileSection32A   (KERNEL32.747)
+ */
+BOOL32 WINAPI WriteProfileSection32A( LPCSTR section, LPCSTR keys_n_values)
+                                     
+{
+    return WritePrivateProfileSection32A( section, keys_n_values, "win.ini");
+}
+
+/***********************************************************************
+ *           WriteProfileSection32W   (KERNEL32.748)
+ */
+BOOL32 WINAPI WriteProfileSection32W( LPCWSTR section, LPCWSTR keys_n_values)
+{
+   if (!wininiW) wininiW = HEAP_strdupAtoW( SystemHeap, 0, "win.ini");
+   
+   return (WritePrivateProfileSection32W (section,keys_n_values, wininiW));
+}
+
+/***********************************************************************
  *           GetPrivateProfileSectionNames16   (KERNEL.143)
  */
 WORD WINAPI GetPrivateProfileSectionNames16( LPSTR buffer, WORD size,
@@ -1182,6 +1251,45 @@
 }
 
 
+/***********************************************************************
+ *           GetProfileSectionNames16   (KERNEL.142)
+ */
+WORD WINAPI GetProfileSectionNames16( LPSTR buffer, WORD size)
+
+{
+ return (GetPrivateProfileSectionNames16 (buffer,size,"win.ini"));
+}
+
+
+/***********************************************************************
+ *           GetPrivateProfileSectionNames32A  (KERNEL32.365)
+ */
+DWORD WINAPI GetPrivateProfileSectionNames32A( LPSTR buffer, DWORD size,
+					 LPCSTR filename)
+
+{
+ return (GetPrivateProfileSectionNames16 (buffer,size,filename));
+}
+
+
+/***********************************************************************
+ *           GetPrivateProfileSectionNames32W  (KERNEL32.366)
+ */
+DWORD WINAPI GetPrivateProfileSectionNames32W( LPWSTR buffer, DWORD size,
+                                         LPCWSTR filename)
+
+{
+   LPSTR filenameA = HEAP_strdupWtoA( GetProcessHeap(), 0, filename );
+   LPSTR bufferA   = HeapAlloc( GetProcessHeap(), 0, size);
+
+   INT32 ret = GetPrivateProfileSectionNames16 (bufferA, size, filenameA);
+   lstrcpynAtoW( buffer, bufferA, size);   
+   HeapFree( GetProcessHeap(), 0, bufferA);
+   HeapFree( GetProcessHeap(), 0, filenameA );
+
+   return ret;
+}
+
 
 /***********************************************************************
  *           GetPrivateProfileStruct32A (KERNEL32.370)
@@ -1200,6 +1308,30 @@
   return FALSE;
 }
 
+/***********************************************************************
+ *           GetPrivateProfileStruct32W (KERNEL32.543)
+ */
+BOOL32 WINAPI GetPrivateProfileStruct32W (LPCWSTR section, LPCWSTR key,
+        LPVOID buffer, UINT32 len, LPCWSTR filename)
+{
+    LPSTR sectionA  = HEAP_strdupWtoA( GetProcessHeap(), 0, section );
+    LPSTR keyA      = HEAP_strdupWtoA( GetProcessHeap(), 0, key);
+    LPSTR filenameA = HEAP_strdupWtoA( GetProcessHeap(), 0, filename );
+    LPSTR bufferA   = HeapAlloc( GetProcessHeap(), 0, len );
+
+    INT32 ret = GetPrivateProfileStruct32A( sectionA, keyA, bufferA,
+                                            len, filenameA );
+    lstrcpynAtoW( buffer, bufferA, len );
+    HeapFree( GetProcessHeap(), 0, bufferA);
+    HeapFree( GetProcessHeap(), 0, sectionA );
+    HeapFree( GetProcessHeap(), 0, keyA );
+    HeapFree( GetProcessHeap(), 0, filenameA );
+
+    return ret;
+}
+
+
+
 
 /***********************************************************************
  *           WritePrivateProfileStruct32A (KERNEL32.744)
@@ -1216,6 +1348,24 @@
     return PROFILE_SetString( section, key, buf);
 }
 
+/***********************************************************************
+ *           WritePrivateProfileStruct32W (KERNEL32.544)
+ */
+BOOL32 WINAPI WritePrivateProfileStruct32W (LPCWSTR section, LPCWSTR key,
+        LPVOID buf, UINT32 bufsize, LPCWSTR filename)
+{
+    LPSTR sectionA  = HEAP_strdupWtoA( GetProcessHeap(), 0, section );
+    LPSTR keyA      = HEAP_strdupWtoA( GetProcessHeap(), 0, key);
+    LPSTR filenameA = HEAP_strdupWtoA( GetProcessHeap(), 0, filename );
+    INT32 ret = WritePrivateProfileStruct32A( sectionA, keyA, buf, bufsize,
+                                             filenameA );
+    HeapFree( GetProcessHeap(), 0, sectionA );
+    HeapFree( GetProcessHeap(), 0, keyA );
+    HeapFree( GetProcessHeap(), 0, filenameA );
+
+    return ret;
+}
+
 
 /***********************************************************************
  *           WriteOutProfiles   (KERNEL.315)
diff --git a/graphics/ddraw.c b/graphics/ddraw.c
index 3c64fcc..3e00742 100644
--- a/graphics/ddraw.c
+++ b/graphics/ddraw.c
@@ -369,6 +369,7 @@
 				this->t.xlib.image->width,
 				this->t.xlib.image->height
 	);
+	TSXSetWindowColormap(display,this->s.ddraw->e.xlib.drawable,this->s.palette->cm);
 	return 0;
 }
 
@@ -995,13 +996,67 @@
 	Xlib_IDirectDrawPalette_SetEntries
 };
 
+static HRESULT WINAPI IDirect3D_QueryInterface(
+        LPDIRECT3D this,REFIID refiid,LPVOID *obj
+) {
+	/* FIXME: Not sure if this is correct */
+        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_IDirect3D,refiid,sizeof(IID_IDirect3D))) {
+                LPDIRECT3D      d3d;
+
+                d3d = HeapAlloc(GetProcessHeap(),0,sizeof(*d3d));
+                d3d->ref = 1;
+                d3d->ddraw = (LPDIRECTDRAW)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 = (LPDIRECTDRAW)this;
+                this->lpvtbl->fnAddRef(this);
+                d3d->lpvtbl = &d3d2vt;
+                *obj = d3d;
+                return 0;
+        }
+        FIXME(ddraw,"(%p):interface for IID %s NOT found!\n",this,xrefiid);
+        return OLE_E_ENUM_NOMORE;
+}
+
+static ULONG WINAPI IDirect3D_AddRef(LPDIRECT3D this) {
+        return ++(this->ref);
+}
+
+static ULONG WINAPI IDirect3D_Release(LPDIRECT3D this)
+{
+        TRACE(ddraw,"(%p)->Release()\n",this);
+        if (!--(this->ref)) {
+                this->ddraw->lpvtbl->fnRelease(this->ddraw);
+                HeapFree(GetProcessHeap(),0,this);
+                return 0;
+        }
+        return this->ref;
+}
+
 /*******************************************************************************
  *				IDirect3D
  */
 static struct IDirect3D_VTable d3dvt = {
-	(void*)1,
-	(void*)2,
-	(void*)3,
+	(void*)IDirect3D_QueryInterface,
+	(void*)IDirect3D_AddRef,
+	(void*)IDirect3D_Release,
 	(void*)4,
 	(void*)5,
 	(void*)6,
@@ -1014,8 +1069,7 @@
  *				IDirect3D2
  */
 static ULONG WINAPI IDirect3D2_Release(LPDIRECT3D2 this) {
-	this->ref--;
-	if (!this->ref) {
+	if (!--(this->ref)) {
 		this->ddraw->lpvtbl->fnRelease(this->ddraw);
 		HeapFree(GetProcessHeap(),0,this);
 		return 0;
diff --git a/graphics/metafiledrv/graphics.c b/graphics/metafiledrv/graphics.c
index f6615ff..4afe965 100644
--- a/graphics/metafiledrv/graphics.c
+++ b/graphics/metafiledrv/graphics.c
@@ -202,3 +202,23 @@
     return MF_MetaParam1( dc, META_PAINTREGION, index );
 }
 
+
+/**********************************************************************
+ *          MFDRV_SetBkColor
+ */
+COLORREF
+MFDRV_SetBkColor( DC *dc, COLORREF color )
+{
+    return MF_MetaParam2(dc, META_SETBKCOLOR, HIWORD(color), LOWORD(color));
+}
+
+
+/**********************************************************************
+ *          MFDRV_SetTextColor
+ */
+COLORREF
+MFDRV_SetTextColor( DC *dc, COLORREF color )
+{
+    return MF_MetaParam2(dc, META_SETTEXTCOLOR, HIWORD(color), LOWORD(color));
+}
+
diff --git a/graphics/metafiledrv/init.c b/graphics/metafiledrv/init.c
index a9b5d2e..3869520 100644
--- a/graphics/metafiledrv/init.c
+++ b/graphics/metafiledrv/init.c
@@ -57,7 +57,7 @@
     NULL,                            /* pSelectClipRgn */
     MFDRV_SelectObject,              /* pSelectObject */
     NULL,                            /* pSelectPalette */
-    NULL,                            /* pSetBkColor */
+    MFDRV_SetBkColor,                /* pSetBkColor */
     NULL,                            /* pSetBkMode */
     NULL,                            /* pSetDeviceClipping */
     NULL,                            /* pSetDIBitsToDevice */
@@ -70,7 +70,7 @@
     NULL,                            /* pSetStretchBltMode */
     NULL,                            /* pSetTextAlign */
     NULL,                            /* pSetTextCharacterExtra */
-    NULL,                            /* pSetTextColor */
+    MFDRV_SetTextColor,              /* pSetTextColor */
     NULL,                            /* pSetTextJustification */
     MFDRV_SetViewportExt,            /* pSetViewportExt */
     MFDRV_SetViewportOrg,            /* pSetViewportOrg */
@@ -310,7 +310,7 @@
 /*
   need wide version as well
 */
-HDC32 CreateEnhMetaFile32A( 
+HDC32 WINAPI CreateEnhMetaFile32A( 
     HDC32 hdc, /* optional reference DC */
     LPCSTR filename, /* optional filename for disk metafiles */
     const RECT32 *rect, /* optional bounding rectangle */
@@ -351,7 +351,7 @@
     return 0;
 }
 
-HENHMETAFILE32 CloseEnhMetaFile32( 
+HENHMETAFILE32 WINAPI CloseEnhMetaFile32( 
                HDC32 hdc  /* metafile DC */
 	       )
 {
diff --git a/graphics/psdrv/Makefile.in b/graphics/psdrv/Makefile.in
index c829559..aa3ddde 100644
--- a/graphics/psdrv/Makefile.in
+++ b/graphics/psdrv/Makefile.in
@@ -7,12 +7,15 @@
 
 C_SRCS = \
 	afm.c \
+	brush.c \
+	color.c \
 	driver.c \
 	escape.c \
 	font.c \
 	graphics.c \
 	init.c \
 	objects.c \
+	pen.c \
 	ppd.c \
 	ps.c \
 	text.c
diff --git a/graphics/psdrv/README b/graphics/psdrv/README
index 33a0a1b..458b443 100644
--- a/graphics/psdrv/README
+++ b/graphics/psdrv/README
@@ -1,8 +1,8 @@
-Wine Postscript Driver
+Wine PostScript Driver
 ======================
 
-When complete this will allow Wine to generate Postscript files without needing
-an external printer driver. It should be possible to print to a non Postscript
+When complete this will allow Wine to generate PostScript files without needing
+an external printer driver. It should be possible to print to a non PostScript
 printer by filtering the output through ghostscript.
 
 
@@ -14,15 +14,15 @@
 if it were a DRV file called WINEPS.DRV . To install it as the default printer
 driver add
 
-device=Wine Postscript Driver,WINEPS,LPT1:
+device=Wine PostScript Driver,WINEPS,LPT1:
 
 to the [windows] section of win.ini . You may prefer to add
 
-Wine Postscript Driver=WINEPS,LPT1:
+Wine PostScript Driver=WINEPS,LPT1:
 
 to the [devices] section of win.ini instead.
 
-You will need Adobe Font Metric (AFM) files for the (type 1 Postscript) fonts
+You will need Adobe Font Metric (AFM) files for the (type 1 PostScript) fonts
 that you wish to use. You can get these from
 
 ftp://ftp.adobe.com/pub/adobe/type/win/all/afmfiles . The directories base17 or
@@ -39,13 +39,16 @@
 
 for each AFM file that you wish to use. [This might change in the future]
 
-You also require a ppd file for your printer. This describes certain
+You also require a PPD file for your printer. This describes certain
 characteristics of the printer such as which fonts are installed, how to select
 manual feed etc. Adobe also has many of these on its website, have a look in
 ftp://ftp.adobe.com/pub/adobe/printerdrivers/win/all/
-Put the ppd in the directory from which you start wine and call it default.ppd
+Put the PPD in the directory from which you start wine and call it default.ppd
 [this will definitely change soon].
 
+To enable colour printing you need to have the *ColorDevice entry in the PPD
+set to true, otherwise the driver will generate greyscale.
+
 Note that you need not set printer=on in the [wine] section of wine.conf, this
 enables printing via external printer drivers and does not affect wineps.
 
@@ -63,21 +66,21 @@
 therefore find a larger than normal selection of input bins in the print setup
 dialog box. I've only really tested ppd parsing on the hp4m6_v1.ppd file.
 
-Landscape mode probably doesn't quite work yet (this is easy to fix).
-
-Graphics are basically non-existent. Only MoveTo/LineTo/Rectangle with a thin
-black pen.
-
-No colour.
-
-AFM parsing is not finished (or ideal).
+Many graphics functions to do.
 
 No TrueType download.
 
+AdvancedSetup dialog box.
+
 Many partially implemented functions.
 
 ps.c is becoming messy.
 
+No clipping.
+
+Notepad often starts text too far to the left depending on the margin
+settings. However the win3.1 pscript.drv (under wine) also does this.
+
 Probably many more...
 
 Since the driver is very alpha, things are likely to change quickly.
diff --git a/graphics/psdrv/afm.c b/graphics/psdrv/afm.c
index 4477c27..dbbc60d 100644
--- a/graphics/psdrv/afm.c
+++ b/graphics/psdrv/afm.c
@@ -30,66 +30,81 @@
  */
 static void PSDRV_AFMGetCharMetrics(AFM *afm, FILE *fp)
 {
-    char buf[256];
-    char *cp, *item, *value;
-    int i, charno;
+    char line[256], valbuf[256];
+    char *cp, *item, *value, *curpos, *endpos;
+    int i;
+    AFMMETRICS **insert = &afm->Metrics, *metric;
 
     for(i = 0; i < afm->NumofMetrics; i++) {
-        char *name = NULL;
 
-        if(!fgets(buf, sizeof(buf), fp)) {
+        if(!fgets(line, sizeof(line), fp)) {
 	   ERR(psdrv, "Unexpected EOF\n");
 	   return;
 	}
-	cp = buf + strlen(buf);
+
+	metric = *insert = HeapAlloc( PSDRV_Heap, HEAP_ZERO_MEMORY, 
+				      sizeof(AFMMETRICS) );
+	insert = &metric->next;
+
+	cp = line + strlen(line);
 	do {
 	    *cp = '\0';
 	    cp--;
-	} while(cp > buf && isspace(*cp));
+	} while(cp > line && isspace(*cp));
 
-        item = strtok(buf, ";");
-	if(!strncmp(item, "C ", 2)) {
-	    value = strchr(item, ' ');
-	    sscanf(value, " %d", &charno);
-	} else if(!strncmp(item, "CH ", 3)) {
-	    value = strrchr(item, ' ');
-	    sscanf(value, " %x", &charno);
-	} else {
-	    WARN(psdrv, "Don't understand '%s'\n", item);
-	    return;
-	}
-
-	while((item = strtok(NULL, ";"))) {
+	curpos = line;
+	while(*curpos) {
+	    item = curpos;
 	    while(isspace(*item))
 	        item++;
-	    value = strchr(item, ' ');
-	    if(!value) /* last char maybe a ';' but no white space after it */
-	        break;
-	    value++;
+	    value = strpbrk(item, " \t");
+	    while(isspace(*value))
+	        value++;
+	    cp = endpos = strchr(value, ';');
+	    while(isspace(*--cp))
+	        ;
+	    memcpy(valbuf, value, cp - value + 1);
+	    valbuf[cp - value + 1] = '\0';
+	    value = valbuf;
 
-	    if(!strncmp("WX ", item, 3) || !strncmp("W0X ", item, 4)) {
-	        if(charno >= 0 && charno <= 0xff)
-		    sscanf(value, "%f", &(afm->CharWidths[charno]));
+	    if(!strncmp(item, "C ", 2)) {
+	        value = strchr(item, ' ');
+		sscanf(value, " %d", &metric->C);
+
+	    } else if(!strncmp(item, "CH ", 3)) {
+	        value = strrchr(item, ' ');
+		sscanf(value, " %x", &metric->C);
 	    }
-	    /* would carry on here to scan in BBox, name and ligs */
 
-	    /* Carry on to find BBox (or actually just ascent) of Aring. This
-	       will provide something like the lfHeight value */
+	    else if(!strncmp("WX ", item, 3) || !strncmp("W0X ", item, 4)) {
+	        sscanf(value, "%f", &metric->WX);
+	        if(metric->C >= 0 && metric->C <= 0xff)
+		    afm->CharWidths[metric->C] = metric->WX;
+	    }
 
 	    else if(!strncmp("N ", item, 2)) {
-	        name = value; /* may end in space */
+	        metric->N = HEAP_strdupA( PSDRV_Heap, 0, value);
 	    }
 
 	    else if(!strncmp("B ", item, 2)) {
-	        if(name && !strncmp("Aring", name, 5)) {
-		    float llx, lly, urx, ury;
-		    llx = lly = urx = ury = 0.0;
-		    sscanf(value, "%f%f%f%f", &llx, &lly, &urx, &ury);
-		    afm->FullAscender = ury;
-		}
+	        sscanf(value, "%f%f%f%f", &metric->B.llx, &metric->B.lly,
+				          &metric->B.urx, &metric->B.ury);
+
+		/* Store height of Aring to use as lfHeight */
+		if(metric->N && !strncmp(metric->N, "Aring", 5))
+		    afm->FullAscender = metric->B.ury;
 	    }
 
+	    /* Ligatures go here... */
+
+	    curpos = endpos + 1;
 	}
+
+#if 0	
+	TRACE(psdrv, "Metrics for '%s' WX = %f B = %f,%f - %f,%f\n",
+	      metric->N, metric->WX, metric->B.llx, metric->B.lly,
+	      metric->B.urx, metric->B.ury);
+#endif
     }
 
     return;
@@ -113,6 +128,8 @@
     AFM *afm;
     char *cp;
 
+    TRACE(psdrv, "parsing '%s'\n", file);
+
     if((fp = fopen(file, "r")) == NULL) {
         MSG("Can't open AFM file '%s'. Please check wine.conf .\n", file);
         return NULL;
@@ -133,7 +150,8 @@
 
         value = strchr(buf, ' ');
 	if(value)
-	    value++;
+	    while(isspace(*value))
+	        value++;
 
 	if(!strncmp("FontName", buf, 8)) {
 	    afm->FontName = HEAP_strdupA(PSDRV_Heap, 0, value);
@@ -223,8 +241,10 @@
 	    continue;
 	}
 
-
-
+	if(!strncmp("EncodingScheme", buf, 14)) {
+	    afm->EncodingScheme = HEAP_strdupA(PSDRV_Heap, 0, value);
+	    continue;
+	}
 
     }
     fclose(fp);
@@ -324,12 +344,49 @@
 
     return;
 }
-    
+
+/**********************************************************
+ *
+ *	PSDRV_ReencodeCharWidths
+ *
+ * Re map the CharWidths field of the afm to correspond to an ANSI encoding
+ *
+ */
+static void PSDRV_ReencodeCharWidths(AFM *afm)
+{
+    int i;
+    AFMMETRICS *metric;
+
+    for(i = 0; i < 256; i++) {
+        if(isalnum(i))
+	    continue;
+	if(PSDRV_ANSIVector[i] == NULL) {
+	    afm->CharWidths[i] = 0.0;
+	    continue;
+	}
+        for(metric = afm->Metrics; metric; metric = metric->next) {
+	    if(!strcmp(metric->N, PSDRV_ANSIVector[i])) {
+	        afm->CharWidths[i] = metric->WX;
+		break;
+	    }
+	}
+	if(!metric) {
+	    WARN(psdrv, "Couldn't find glyph '%s' in font '%s'\n",
+		 PSDRV_ANSIVector[i], afm->FontName);
+	    afm->CharWidths[i] = 0.0;
+	}
+    }
+    return;
+}
+
 /***********************************************************
  *
  *	PSDRV_afmfilesCallback
  *
  * Callback for PROFILE_EnumerateWineIniSection
+ * Try to parse AFM file `value', alter the CharWidths field of afm struct if
+ * the font is using AdobeStandardEncoding to correspond to WinANSI, then add
+ * afm to system font list.
  */
 static void PSDRV_afmfilesCallback(char const *key, char const *value,
 void *user)
@@ -337,8 +394,13 @@
     AFM *afm;
 
     afm = PSDRV_AFMParse(value);
-    if(afm)
+    if(afm) {
+        if(afm->EncodingScheme && 
+	   !strcmp(afm->EncodingScheme, "AdobeStandardEncoding")) {
+	    PSDRV_ReencodeCharWidths(afm);
+	}
         PSDRV_AddAFMtoList(&PSDRV_AFMFontList, afm);
+    }
     return;
 }
 
diff --git a/graphics/psdrv/brush.c b/graphics/psdrv/brush.c
new file mode 100644
index 0000000..8a82afd
--- /dev/null
+++ b/graphics/psdrv/brush.c
@@ -0,0 +1,73 @@
+/*
+ *	PostScript brush handling
+ *
+ * Copyright 1998  Huw D M Davies
+ *
+ */
+
+#include "windows.h"
+#include "psdrv.h"
+#include "brush.h"
+#include "debug.h"
+
+
+/***********************************************************************
+ *           PSDRV_BRUSH_SelectObject
+ */
+HBRUSH32 PSDRV_BRUSH_SelectObject( DC * dc, HBRUSH32 hbrush, BRUSHOBJ * brush )
+{
+    HBRUSH32 prevbrush = dc->w.hBrush;
+    PSDRV_PDEVICE *physDev = (PSDRV_PDEVICE *)dc->physDev;
+
+    TRACE(psdrv, "hbrush = %08x\n", hbrush);
+    dc->w.hBrush = hbrush;
+
+    switch(brush->logbrush.lbStyle) {
+
+    case BS_SOLID:
+        physDev->brush.style = BS_SOLID;
+        PSDRV_CreateColor(physDev, &physDev->brush.color, 
+			  brush->logbrush.lbColor);
+	break;
+
+    case BS_NULL:
+        physDev->brush.style = BS_NULL;
+        break;
+
+    case BS_HATCHED:
+    case BS_PATTERN:
+        FIXME(psdrv, "Unsupported brush style %d\n", brush->logbrush.lbStyle);
+	break;
+
+    default:
+        FIXME(psdrv, "Unrecognized brush style %d\n", brush->logbrush.lbStyle);
+	break;
+    }
+
+    physDev->brush.set = FALSE;
+    return prevbrush;
+}
+
+
+/**********************************************************************
+ *
+ *	PSDRV_SetBrush
+ *
+ */
+BOOL32 PSDRV_SetBrush(DC *dc)
+{
+    PSDRV_PDEVICE *physDev = (PSDRV_PDEVICE *)dc->physDev;
+
+    switch (physDev->brush.style) {
+    case BS_SOLID:
+        PSDRV_WriteSetColor(dc, &physDev->brush.color);
+	break;
+
+    default:
+        return FALSE;
+        break;
+
+    }
+    physDev->brush.set = TRUE;
+    return TRUE;
+}
diff --git a/graphics/psdrv/color.c b/graphics/psdrv/color.c
new file mode 100644
index 0000000..f53e037
--- /dev/null
+++ b/graphics/psdrv/color.c
@@ -0,0 +1,135 @@
+/*
+ *	PostScript colour functions
+ *
+ *	Copyright 1998  Huw D M Davies
+ *
+ */
+
+#include "windows.h"
+#include "psdrv.h"
+#include "debug.h"
+
+/**********************************************************************
+ *	     PSDRV_CmpColor
+ *
+ * Return TRUE if col1 == col2
+ */ 
+BOOL32 PSDRV_CmpColor(PSCOLOR *col1, PSCOLOR *col2)
+{
+    if(col1->type != col2->type)
+        return FALSE;
+
+    switch(col1->type) {
+    case PSCOLOR_GRAY:
+        if(col1->value.gray.i == col2->value.gray.i)
+	    return TRUE;
+	break;
+    case PSCOLOR_RGB:
+        if( col1->value.rgb.r == col2->value.rgb.r &&
+	    col1->value.rgb.g == col2->value.rgb.g &&
+	    col1->value.rgb.b == col2->value.rgb.b )
+	    return TRUE;
+	break;
+    default:
+        ERR(psdrv, "Unknown colour type %d\n", col1->type);
+    }
+    return FALSE;
+}
+
+
+/**********************************************************************
+ *	     PSDRV_CopyColor
+ *
+ * Copies col2 into col1. Return FALSE on error.
+ */ 
+BOOL32 PSDRV_CopyColor(PSCOLOR *col1, PSCOLOR *col2)
+{
+
+    switch(col2->type) {
+    case PSCOLOR_GRAY:
+        col1->value.gray.i = col2->value.gray.i;
+	break;
+
+    case PSCOLOR_RGB:
+        col1->value.rgb.r = col2->value.rgb.r;
+	col1->value.rgb.g = col2->value.rgb.g;
+	col1->value.rgb.b = col2->value.rgb.b;
+	break;
+
+    default:
+        ERR(psdrv, "Unknown colour type %d\n", col1->type);
+	return FALSE;
+    }
+
+    col1->type = col2->type;
+    return TRUE;
+}
+
+
+/**********************************************************************
+ *	     PSDRV_CreateColor
+ *
+ * Creates a PostScript colour from a COLORREF.
+ * Result is grey scale if ColorDevice field of ppd is FALSE else an
+ * rgb colour is produced.
+ */
+void PSDRV_CreateColor( PSDRV_PDEVICE *physDev, PSCOLOR *pscolor,
+		     COLORREF wincolor )
+{
+    int ctype = wincolor >> 24;
+    float r, g, b;
+
+    if(ctype != 0)
+        FIXME(psdrv, "Colour is %08lx\n", wincolor);
+
+    r = (wincolor & 0xff) / 256.0;
+    g = ((wincolor >> 8) & 0xff) / 256.0;
+    b = ((wincolor >> 16) & 0xff) / 256.0;
+
+    if(physDev->pi->ppd->ColorDevice) {
+        pscolor->type = PSCOLOR_RGB;
+	pscolor->value.rgb.r = r;
+	pscolor->value.rgb.g = g;
+	pscolor->value.rgb.b = b;
+    } else {
+        pscolor->type = PSCOLOR_GRAY;
+	/* FIXME configurable */
+	pscolor->value.gray.i = r * 0.3 + g * 0.59 + b * 0.11;
+    }
+    return;
+}
+
+
+/***********************************************************************
+ *           PSDRV_SetBkColor
+ */
+COLORREF PSDRV_SetBkColor( DC *dc, COLORREF color )
+{
+    PSDRV_PDEVICE *physDev = (PSDRV_PDEVICE *)dc->physDev;
+    COLORREF oldColor;
+
+    oldColor = dc->w.backgroundColor;
+    dc->w.backgroundColor = color;
+
+    PSDRV_CreateColor(physDev, &physDev->bkColor, color);
+
+    return oldColor;
+}
+
+
+/***********************************************************************
+ *           PSDRV_SetTextColor
+ */
+COLORREF PSDRV_SetTextColor( DC *dc, COLORREF color )
+{
+    PSDRV_PDEVICE *physDev = (PSDRV_PDEVICE *)dc->physDev;
+    COLORREF oldColor;
+
+    oldColor = dc->w.textColor;
+    dc->w.textColor = color;
+
+    PSDRV_CreateColor(physDev, &physDev->font.color, color);
+    physDev->font.set = FALSE;
+    return oldColor;
+}
+
diff --git a/graphics/psdrv/driver.c b/graphics/psdrv/driver.c
index ee62d63..3c456aa 100644
--- a/graphics/psdrv/driver.c
+++ b/graphics/psdrv/driver.c
@@ -9,13 +9,13 @@
  *
  */
 
-#include <windows.h>
-#include <psdrv.h>
-#include <debug.h>
-#include <resource.h>
 #include <string.h>
-#include <win.h>
-#include <print.h>
+#include "windows.h"
+#include "psdrv.h"
+#include "debug.h"
+#include "resource.h"
+#include "win.h"
+#include "print.h"
 
 static LONG Resolutions[][2] = { {600,600} };
 
diff --git a/graphics/psdrv/font.c b/graphics/psdrv/font.c
index 6abab35..6a05880 100644
--- a/graphics/psdrv/font.c
+++ b/graphics/psdrv/font.c
@@ -37,7 +37,7 @@
         it = TRUE;
     if(lf->lfWeight > 550)
         bd = TRUE;
-    lstrcpy32A(FaceName, lf->lfFaceName);
+    strcpy(FaceName, lf->lfFaceName);
     
     if(FaceName[0] == '\0') {
         switch(lf->lfPitchAndFamily & 0xf0) {
@@ -45,16 +45,16 @@
 	    break;
 	case FF_ROMAN:
 	case FF_SCRIPT:
-	    lstrcpy32A(FaceName, "Times");
+	    strcpy(FaceName, "Times");
 	    break;
 	case FF_SWISS:
-	    lstrcpy32A(FaceName, "Helvetica");
+	    strcpy(FaceName, "Helvetica");
 	    break;
 	case FF_MODERN:
-	    lstrcpy32A(FaceName, "Courier");
+	    strcpy(FaceName, "Courier");
 	    break;
 	case FF_DECORATIVE:
-	    lstrcpy32A(FaceName, "Symbol");
+	    strcpy(FaceName, "Symbol");
 	    break;
 	}
     }
@@ -62,23 +62,25 @@
     if(FaceName[0] == '\0') {
         switch(lf->lfPitchAndFamily & 0x0f) {
 	case VARIABLE_PITCH:
-	    lstrcpy32A(FaceName, "Times");
+	    strcpy(FaceName, "Times");
 	    break;
 	default:
-	    lstrcpy32A(FaceName, "Courier");
+	    strcpy(FaceName, "Courier");
 	    break;
 	}
     }
 
+    TRACE(psdrv, "Trying to find facename '%s'\n", FaceName);
+
     for(family = physDev->pi->Fonts; family; family = family->next) {
-        if(!lstrncmp32A(FaceName, family->FamilyName, 
-			                         strlen(family->FamilyName)))
+        if(!strcmp(FaceName, family->FamilyName))
 	    break;
     }
     if(!family)
         family = physDev->pi->Fonts;
 
-    
+    TRACE(psdrv, "Got family '%s'\n", family->FamilyName);
+
     for(afmle = family->afmlist; afmle; afmle = afmle->next) {
         if( (bd == (afmle->afm->Weight == FW_BOLD)) && 
 	    (it == (afmle->afm->ItalicAngle != 0.0)) )
@@ -165,8 +167,8 @@
     width = 0.0;
 
     for(i = 0; i < count && str[i]; i++) {
-        width += physDev->font.afm->CharWidths[ (UINT32)str[i] ];
-	TRACE(psdrv, "Width after %dth char '%c' = %f\n", i, str[i], width);
+        width += physDev->font.afm->CharWidths[ *((unsigned char *)str + i) ];
+/*	TRACE(psdrv, "Width after %dth char '%c' = %f\n", i, str[i], width);*/
     }
     width *= physDev->font.scale;
     TRACE(psdrv, "Width after scale (%f) is %f\n", physDev->font.scale, width);
@@ -182,11 +184,17 @@
 BOOL32 PSDRV_SetFont( DC *dc )
 {
     PSDRV_PDEVICE *physDev = (PSDRV_PDEVICE *)dc->physDev;
+    BOOL32 ReEncode = FALSE;
 
+    PSDRV_WriteSetColor(dc, &physDev->font.color);
     if(physDev->font.set) return TRUE;
 
-    PSDRV_WriteReencodeFont(dc);
-    PSDRV_WriteSetFont(dc);
+    if(physDev->font.afm->EncodingScheme && 
+       !strcmp(physDev->font.afm->EncodingScheme, "AdobeStandardEncoding"))
+        ReEncode = TRUE;
+    if(ReEncode)
+        PSDRV_WriteReencodeFont(dc);
+    PSDRV_WriteSetFont(dc, ReEncode);
     physDev->font.set = TRUE;
     return TRUE;
 }
@@ -218,7 +226,7 @@
     pTM->tmPitchAndFamily |= TMPF_DEVICE;
     plf->lfPitchAndFamily = 0;
 
-    lstrcpyn32A( plf->lfFaceName, pafm->FamilyName, LF_FACESIZE );
+    strncpy( plf->lfFaceName, pafm->FamilyName, LF_FACESIZE );
 #undef plf
 
     pTM->tmAscent = pafm->FullAscender * scale;
@@ -252,7 +260,7 @@
     if( plf->lfFaceName[0] ) {
         TRACE(psdrv, "lfFaceName = '%s'\n", plf->lfFaceName);
         for(family = physDev->pi->Fonts; family; family = family->next) {
-            if(!lstrncmp32A(plf->lfFaceName, family->FamilyName, 
+            if(!strncmp(plf->lfFaceName, family->FamilyName, 
 			strlen(family->FamilyName)))
 	        break;
 	}
diff --git a/graphics/psdrv/graphics.c b/graphics/psdrv/graphics.c
index 9b0e02d..70a84ce 100644
--- a/graphics/psdrv/graphics.c
+++ b/graphics/psdrv/graphics.c
@@ -3,7 +3,6 @@
  *
  *	Copyright 1998  Huw D M Davies
  *
- *	Not much here yet...
  */
 #include <string.h>
 #include "windows.h"
@@ -25,7 +24,7 @@
     dc->w.CursPosX = x;
     dc->w.CursPosY = y;
 
-    return PSDRV_WriteMoveTo(dc, XLPTODP(dc, x), YLPTODP(dc, y));
+    return TRUE;
 }
 
 /***********************************************************************
@@ -35,6 +34,9 @@
 {
     TRACE(psdrv, "%d %d\n", x, y);
 
+    PSDRV_SetPen(dc);
+    PSDRV_WriteMoveTo(dc, XLPTODP(dc, dc->w.CursPosX),
+		          YLPTODP(dc, dc->w.CursPosY));
     PSDRV_WriteLineTo(dc, XLPTODP(dc, x), YLPTODP(dc, y));
     PSDRV_WriteStroke(dc);
 
@@ -56,7 +58,13 @@
     TRACE(psdrv, "%d %d - %d %d\n", left, top, right, bottom);
 
     PSDRV_WriteRectangle(dc, XLPTODP(dc, left), YLPTODP(dc, top),
-		 width, height);
+			     width, height);
+
+    PSDRV_SetBrush(dc);
+    PSDRV_Writegsave(dc);
+    PSDRV_WriteFill(dc);
+    PSDRV_Writegrestore(dc);
+    PSDRV_SetPen(dc);
     PSDRV_WriteStroke(dc);
     return TRUE;
 }
@@ -65,10 +73,25 @@
 /***********************************************************************
  *           PSDRV_Ellipse
  */
-BOOL32 PSDRV_Ellipse( DC *dc, INT32 left, INT32 top, INT32 right, INT32 bottom )
+BOOL32 PSDRV_Ellipse( DC *dc, INT32 left, INT32 top, INT32 right, INT32 bottom)
 {
+    INT32 x, y, a, b;
+
     TRACE(psdrv, "%d %d - %d %d\n", left, top, right, bottom);
-    
+
+    x = XLPTODP(dc, (left + right)/2);
+    y = YLPTODP(dc, (top + bottom)/2);
+
+    a = XLSTODS(dc, (right - left)/2);
+    b = YLSTODS(dc, (bottom - top)/2);
+
+    PSDRV_WriteEllispe(dc, x, y, a, b);
+    PSDRV_SetBrush(dc);
+    PSDRV_Writegsave(dc);
+    PSDRV_WriteFill(dc);
+    PSDRV_Writegrestore(dc);
+    PSDRV_SetPen(dc);
+    PSDRV_WriteStroke(dc);
     return TRUE;
 }
 
@@ -81,6 +104,7 @@
     INT32 i;
     TRACE(psdrv, "count = %d\n", count);
     
+    PSDRV_SetPen(dc);
     PSDRV_WriteMoveTo(dc, XLPTODP(dc, pt[0].x), YLPTODP(dc, pt[0].y));
     for(i = 1; i < count; i++)
         PSDRV_WriteLineTo(dc, XLPTODP(dc, pt[i].x), YLPTODP(dc, pt[i].y));
@@ -97,6 +121,8 @@
     INT32 i;
     TRACE(psdrv, "count = %d\n", count);
     FIXME(psdrv, "Hack!\n");
+    
+    PSDRV_SetPen(dc);
     PSDRV_WriteMoveTo(dc, XLPTODP(dc, pt[0].x), YLPTODP(dc, pt[0].y));
     for(i = 1; i < count; i++)
         PSDRV_WriteLineTo(dc, XLPTODP(dc, pt[i].x), YLPTODP(dc, pt[i].y));
@@ -108,4 +134,3 @@
     return TRUE;
 }
 
-
diff --git a/graphics/psdrv/init.c b/graphics/psdrv/init.c
index 6a62a5a..cc43a6d 100644
--- a/graphics/psdrv/init.c
+++ b/graphics/psdrv/init.c
@@ -5,14 +5,14 @@
  *
  */
 
-#include <windows.h>
-#include <gdi.h>
-#include <psdrv.h>
-#include <debug.h>
-#include <heap.h>
-#include <winreg.h>
-#include <print.h>
-#include <winerror.h>
+#include "windows.h"
+#include "gdi.h"
+#include "psdrv.h"
+#include "debug.h"
+#include "heap.h"
+#include "winreg.h"
+#include "print.h"
+#include "winerror.h"
 
 static BOOL32 PSDRV_CreateDC( DC *dc, LPCSTR driver, LPCSTR device,
                                LPCSTR output, const DEVMODE16* initData );
@@ -62,7 +62,7 @@
     NULL,                            /* pSelectClipRgn */
     PSDRV_SelectObject,              /* pSelectObject */
     NULL,                            /* pSelectPalette */
-    NULL,                            /* pSetBkColor */
+    PSDRV_SetBkColor,                /* pSetBkColor */
     NULL,                            /* pSetBkMode */
     NULL,                            /* pSetDeviceClipping */
     NULL,                            /* pSetDIBitsToDevice */
@@ -75,7 +75,7 @@
     NULL,                            /* pSetStretchBltMode */
     NULL,                            /* pSetTextAlign */
     NULL,                            /* pSetTextCharacterExtra */
-    NULL,                            /* pSetTextColor */
+    PSDRV_SetTextColor,              /* pSetTextColor */
     NULL,                            /* pSetTextJustification */
     NULL,                            /* pSetViewportExt (optional) */
     NULL,                            /* pSetViewportOrg (optional) */
@@ -202,6 +202,8 @@
 
     TRACE(psdrv, "(%s %s %s %p)\n", driver, device, output, initData);
 
+    if(!pi) return FALSE;
+
     if(!pi->Fonts) {
         MSG("To use WINEPS you need to install some AFM files.\n");
 	return FALSE;
@@ -252,6 +254,13 @@
 				physDev->pi->ppd->DefaultResolution;
     devCaps->aspectXY = (int)hypot( (double)devCaps->aspectX, 
 				    (double)devCaps->aspectY );
+
+    if(physDev->pi->ppd->ColorDevice) {
+        devCaps->bitsPixel = 8;
+	devCaps->numColors = 256;
+	/* FIXME are these values OK? */
+    }
+
     /* etc */
 
     dc->w.devCaps = devCaps;
@@ -324,6 +333,14 @@
     }
 
     pi->ppd = PSDRV_ParsePPD(pi->Devmode->dmDrvPrivate.ppdFileName);
+    if(!pi->ppd) {
+        HeapFree(PSDRV_Heap, 0, pi->FriendlyName);
+        HeapFree(PSDRV_Heap, 0, pi->Devmode);
+        HeapFree(PSDRV_Heap, 0, pi);
+	*last = NULL;
+	return NULL;
+    }
+
     pi->next = NULL;
     pi->Fonts = NULL;
 
diff --git a/graphics/psdrv/objects.c b/graphics/psdrv/objects.c
index b8d8d47..187161e 100644
--- a/graphics/psdrv/objects.c
+++ b/graphics/psdrv/objects.c
@@ -25,27 +25,6 @@
 
 
 /***********************************************************************
- *           PSDRV_BRUSH_SelectObject
- */
-static HBRUSH32 PSDRV_BRUSH_SelectObject( DC * dc, HBRUSH32 hbrush,
-                                          BRUSHOBJ * brush )
-{
-    FIXME(psdrv, "stub\n");
-    return 0;
-}
-
-
-/***********************************************************************
- *           PSDRV_PEN_SelectObject
- */
-static HPEN32 PSDRV_PEN_SelectObject( DC * dc, HPEN32 hpen, PENOBJ * pen )
-{
-    FIXME(psdrv, "stub\n");
-    return 0;
-}
-
-
-/***********************************************************************
  *           PSDRV_SelectObject
  */
 HGDIOBJ32 PSDRV_SelectObject( DC *dc, HGDIOBJ32 handle )
diff --git a/graphics/psdrv/pen.c b/graphics/psdrv/pen.c
new file mode 100644
index 0000000..958ffda
--- /dev/null
+++ b/graphics/psdrv/pen.c
@@ -0,0 +1,90 @@
+/*
+ *	PostScript pen handling
+ *
+ *	Copyright 1998  Huw D M Davies
+ *
+ */
+
+#include "windows.h"
+#include "pen.h"
+#include "psdrv.h"
+#include "debug.h"
+
+static char PEN_dash[]       = "50 30";     /* -----   -----   -----  */
+static char PEN_dot[]        = "20";      /* --  --  --  --  --  -- */
+static char PEN_dashdot[]    = "40 30 20 30";  /* ----   --   ----   --  */
+static char PEN_dashdotdot[] = "40 20 20 20 20 20"; /* ----  --  --  ----  */
+static char PEN_alternate[]  = "1";
+
+/***********************************************************************
+ *           PSDRV_PEN_SelectObject
+ */
+extern HPEN32 PSDRV_PEN_SelectObject( DC * dc, HPEN32 hpen, PENOBJ * pen )
+{
+    HPEN32 prevpen = dc->w.hPen;
+    PSDRV_PDEVICE *physDev = (PSDRV_PDEVICE *)dc->physDev;
+
+    TRACE(psdrv, "hpen = %08x colour = %08lx\n", hpen, pen->logpen.lopnColor);
+    dc->w.hPen = hpen;
+
+    physDev->pen.width = XLSTODS(dc, pen->logpen.lopnWidth.x);
+    if(physDev->pen.width < 0)
+        physDev->pen.width = -physDev->pen.width;
+
+    PSDRV_CreateColor(physDev, &physDev->pen.color, pen->logpen.lopnColor);
+
+    if(physDev->pen.width > 1) { /* dashes only for 0 or 1 pixel pens */
+        physDev->pen.dash = NULL;
+    } else {
+        switch(pen->logpen.lopnStyle & PS_STYLE_MASK) {
+	case PS_DASH:
+	    physDev->pen.dash = PEN_dash;
+	    break;
+
+	case PS_DOT:
+	    physDev->pen.dash = PEN_dot;
+	    break;
+
+	case PS_DASHDOT:
+	    physDev->pen.dash = PEN_dashdot;
+	    break;
+
+	case PS_DASHDOTDOT:
+            physDev->pen.dash = PEN_dashdotdot;
+	    break;
+
+	case PS_ALTERNATE:
+            physDev->pen.dash = PEN_alternate;
+	    break;
+
+	default:
+            physDev->pen.dash = NULL;
+	    break;
+	}
+    }
+
+    physDev->pen.set = FALSE;
+    return prevpen;
+}
+
+
+/**********************************************************************
+ *
+ *	PSDRV_SetPen
+ *
+ */
+BOOL32 PSDRV_SetPen(DC *dc)
+{
+    PSDRV_PDEVICE *physDev = (PSDRV_PDEVICE *)dc->physDev;
+
+    PSDRV_WriteSetColor(dc, &physDev->pen.color);
+
+    if(!physDev->pen.set) {
+        PSDRV_WriteSetPen(dc);
+	physDev->pen.set = TRUE;
+    }
+
+    return TRUE;
+}
+
+
diff --git a/graphics/psdrv/ppd.c b/graphics/psdrv/ppd.c
index 8364d72..8f8d5c8 100644
--- a/graphics/psdrv/ppd.c
+++ b/graphics/psdrv/ppd.c
@@ -5,14 +5,14 @@
  *	Copyright 1998  Huw D M Davies
  */
 
-#include <windows.h>
-#include <winnt.h> /* HEAP_ZERO_MEMORY */
-#include <heap.h>
-#include <debug.h>
-#include <psdrv.h>
 #include <string.h>
 #include <ctype.h>
-#include <print.h>
+#include "windows.h"
+#include "winnt.h" /* HEAP_ZERO_MEMORY */
+#include "heap.h"
+#include "debug.h"
+#include "psdrv.h"
+#include "print.h"
 
 typedef struct {
 char	*key;
@@ -400,8 +400,10 @@
 
     TRACE(psdrv, "%s\n", fname);
 
-    if((fp = fopen(fname, "r")) == NULL)
+    if((fp = fopen(fname, "r")) == NULL) {
+        WARN(psdrv, "Couldn't open ppd file '%s'\n", fname);
         return NULL;
+    }
 
     ppd = HeapAlloc( PSDRV_Heap, HEAP_ZERO_MEMORY, sizeof(*ppd));
     if(!ppd) {
@@ -551,7 +553,7 @@
 	    if(!strcmp(tuple.value, "Plus90"))
 	        ppd->LandscapeOrientation = 90;
 	    else if(!strcmp(tuple.value, "Minus90"))
-	        ppd->LandscapeOrientation = 270;
+	        ppd->LandscapeOrientation = -90;
 
 	    /* anything else, namely 'any', leaves value at 0 */
 
diff --git a/graphics/psdrv/ps.c b/graphics/psdrv/ps.c
index 0893ee6..d301c36 100644
--- a/graphics/psdrv/ps.c
+++ b/graphics/psdrv/ps.c
@@ -5,92 +5,197 @@
  *
  */
 
-#include <windows.h>
-#include <psdrv.h>
-#include <print.h>
-#include <debug.h>
 #include <ctype.h>
+#include <string.h>
+#include "windows.h"
+#include "psdrv.h"
+#include "print.h"
+#include "debug.h"
 
-char psheader[] = /* title llx lly urx ury */
-"%%!PS-Adobe-3.0 (not quite)\n"
+static char psheader[] = /* title llx lly urx ury orientation */
+"%%!PS-Adobe-3.0\n"
 "%%%%Creator: Wine PostScript Driver\n"
 "%%%%Title: %s\n"
 "%%%%BoundingBox: %d %d %d %d\n"
 "%%%%Pages: (atend)\n"
-"%%%%EndComments\n"
-"%%%%BeginProlog\n"
+"%%%%Orientation: %s\n"
+"%%%%EndComments\n";
+
+static char psbeginprolog[] = 
+"%%BeginProlog\n";
+
+static char psendprolog[] =
+"%%EndProlog\n";
+
+static char psvectorstart[] =
+"/ANSIEncoding [\n";
+
+static char psvectorend[] =
+"] def\n";
+
+static char psprolog[] = /* output ANSIEncoding vector first */
 "/reencodefont {\n"
 "findfont\n"
 "dup length dict begin\n"
 "{1 index /FID ne {def} {pop pop} ifelse} forall\n"
-"/Encoding ISOLatin1Encoding def\n"
+"/Encoding ANSIEncoding def\n"
 "currentdict\n"
 "end\n"
 "definefont pop\n"
 "} bind def\n"
-"%%%%EndProlog\n";
+"/tmpmtrx matrix def\n";
 
-char psbeginsetup[] =
+static char psbeginsetup[] =
 "%%BeginSetup\n";
 
-char psendsetup[] =
+static char psendsetup[] =
 "%%EndSetup\n";
 
-char psbeginfeature[] = /* feature, value */
+static char psbeginfeature[] = /* feature, value */
 "mark {\n"
 "%%%%BeginFeature: %s %s\n";
 
-char psendfeature[] =
+static char psendfeature[] =
 "\n%%EndFeature\n"
 "} stopped cleartomark\n";
 
-char psnewpage[] = /* name, number */
+static char psnewpage[] = /* name, number, xres, yres, xtrans, ytrans, rot */
 "%%%%Page: %s %d\n"
 "%%%%BeginPageSetup\n"
 "/pgsave save def\n"
-"72 600 div dup scale\n"
-"0 7014 translate\n"
+"72 %d div 72 %d div scale\n"
+"%d %d translate\n"
 "1 -1 scale\n"
+"%d rotate\n"
 "%%%%EndPageSetup\n";
 
-char psendpage[] =
+static char psendpage[] =
 "pgsave restore\n"
 "showpage\n";
 
-char psfooter[] = /* pages */
+static char psfooter[] = /* pages */
 "%%%%Trailer\n"
 "%%%%Pages: %d\n"
 "%%%%EOF\n";
 
-char psmoveto[] = /* x, y */
+static char psmoveto[] = /* x, y */
 "%d %d moveto\n";
 
-char pslineto[] = /* x, y */
+static char pslineto[] = /* x, y */
 "%d %d lineto\n";
 
-char psrlineto[] = /* dx, dy */
-"%d %d rlineto\n";
-
-char psstroke[] = 
+static char psstroke[] = 
 "stroke\n";
 
-char psrectangle[] = /* x, y, width, height, -width */
+static char psrectangle[] = /* x, y, width, height, -width */
 "%d %d moveto\n"
 "%d 0 rlineto\n"
 "0 %d rlineto\n"
 "%d 0 rlineto\n"
 "closepath\n";
 
-char psshow[] = /* string */
+static char psshow[] = /* string */
 "(%s) show\n";
 
-char pssetfont[] = /* fontname, xscale, yscale, ascent, escapement */
+static char pssetfont[] = /* fontname, xscale, yscale, ascent, escapement */
 "/%s findfont\n"
 "[%d 0 0 %d 0 0]\n"
 "%d 10 div matrix rotate\n"
 "matrix concatmatrix\n"
 "makefont setfont\n";
 
+static char pssetlinewidth[] = /* width */
+"%d setlinewidth\n";
+
+static char pssetdash[] = /* dash, offset */
+"[%s] %d setdash\n";
+
+static char pssetgray[] = /* gray */
+"%.2f setgray\n";
+
+static char pssetrgbcolor[] = /* r, g, b */
+"%.2f %.2f %.2f setrgbcolor\n";
+
+static char psellipse[] = /* x, y, a, b */
+"tmpmtrx currentmatrix pop\n"
+"%d %d translate\n"
+"%d %d scale\n"
+"0 0 1 0 360 arc\n"
+"tmpmtrx setmatrix\n";
+
+static char psgsave[] =
+"gsave\n";
+
+static char psgrestore[] =
+"grestore\n";
+
+static char psfill[] =
+"fill\n";
+
+char *PSDRV_ANSIVector[256] = {
+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,
+"space",	"exclam",	"quotedbl",	"numbersign",
+"dollar",	"percent",	"ampersand",	"quotesingle",
+"parenleft",	"parenright",	"asterisk",	"plus",
+"comma",	"hyphen",	"period",	"slash",
+"zero",		"one",		"two",		"three",
+"four",		"five",		"six",		"seven",
+"eight",	"nine",		"colon",	"semicolon",
+"less",		"equal",	"greater",	"question",
+"at",		"A",		"B",		"C",
+"D",		"E",		"F",		"G",
+"H",		"I",		"J",		"K",
+"L",		"M",		"N",		"O",
+"P",		"Q",		"R",		"S",
+"T",		"U",		"V",		"W",
+"X",		"Y",		"Z",		"bracketleft",
+"backslash",	"bracketright",	"asciicircum",	"underscore",
+"grave",	"a",		"b",		"c",
+"d",		"e",		"f",		"g",
+"h",		"i",		"j",		"k",
+"l",		"m",		"n",		"o",
+"p",		"q",		"r",		"s",
+"t",		"u",		"v",		"w",
+"x",		"y",		"z",		"braceleft",
+"bar",		"braceright",	"asciitilde",	NULL,
+NULL,		NULL,		NULL,		NULL,
+NULL,		NULL,		NULL,		NULL,
+NULL,		NULL,		NULL,		NULL,
+NULL,		NULL,		NULL,		NULL,
+NULL,		"quoteleft",	"quoteright",	NULL,
+NULL,		NULL,		NULL,		NULL,
+NULL,		NULL,		NULL,		NULL,
+NULL,		NULL,		NULL,		NULL,
+NULL,		"exclamdown",	"cent",		"sterling",
+"currency",	"yen",		"brokenbar",	"section",
+"dieresis",	"copyright",	"ordfeminine",	"guillemotleft",
+"logicalnot",	"hyphen",	"registered",	"macron",
+"degree",	"plusminus",	"twosuperior",	"threesuperior",
+"acute",	"mu",		"paragraph",	"periodcentered",
+"cedilla",	"onesuperior",	"ordmasculine",	"guillemotright",
+"onequarter",	"onehalf",	"threequarters","questiondown",
+"Agrave",	"Aacute",	"Acircumflex",	"Atilde",
+"Adieresis",	"Aring",	"AE",		"Ccedilla",
+"Egrave",	"Eacute",	"Ecircumflex",	"Edieresis",
+"Igrave",	"Iacute",	"Icircumflex",	"Idieresis",
+"Eth",		"Ntilde",	"Ograve",	"Oacute",
+"Ocircumflex",	"Otilde",	"Odieresis",	"multiply",
+"Oslash",	"Ugrave",	"Uacute",	"Ucircumflex",
+"Udieresis",	"Yacute",	"Thorn",	"germandbls",
+"agrave",	"aacute",	"acircumflex",	"atilde",
+"adieresis",	"aring",	"ae",		"ccedilla",
+"egrave",	"eacute",	"ecircumflex",	"edieresis",
+"igrave",	"iacute",	"icircumflex",	"idieresis",
+"eth",		"ntilde",	"ograve",	"oacute",
+"ocircumflex",	"otilde",	"odieresis",	"divide",
+"oslash",	"ugrave",	"uacute",	"ucircumflex",
+"udieresis",	"yacute",	"thorn",	"ydieresis"
+};
+
+
 char psreencodefont[] = /* newfontname basefontname*/
 "/%s /%s reencodefont\n";
 
@@ -117,7 +222,7 @@
 			     strlen(feature) + strlen(value));
 
 
-    wsprintf32A(buf, psbeginfeature, feature, value);
+    sprintf(buf, psbeginfeature, feature, value);
     WriteSpool( hJob, buf, strlen(buf) );
 
     WriteSpool( hJob, invocation, strlen(invocation) );
@@ -133,9 +238,10 @@
 INT32 PSDRV_WriteHeader( DC *dc, char *title, int len )
 {
     PSDRV_PDEVICE *physDev = (PSDRV_PDEVICE *)dc->physDev;
-    char *buf, *titlebuf;
+    char *buf, *titlebuf, *orient, vectbuf[256];
     INPUTSLOT *slot;
     PAGESIZE *page;
+    int urx, ury, i, j;
 
     titlebuf = (char *)HeapAlloc( PSDRV_Heap, 0, len+1 );
     if(!titlebuf) {
@@ -145,16 +251,28 @@
     memcpy(titlebuf, title, len);
     titlebuf[len] = '\0';
 
-    buf = (char *)HeapAlloc( PSDRV_Heap, 0, sizeof(psheader) + len + 20);
+    buf = (char *)HeapAlloc( PSDRV_Heap, 0, sizeof(psheader) + len + 30);
     if(!buf) {
         WARN(psdrv, "HeapAlloc failed\n");
 	HeapFree( PSDRV_Heap, 0, titlebuf );
         return 0;
     }
 
-    wsprintf32A(buf, psheader, title, 0, 0, 
-		(int) (dc->w.devCaps->horzSize * 72.0 / 25.4),
-		(int) (dc->w.devCaps->vertSize * 72.0 / 25.4) );
+    if(physDev->Devmode->dmPublic.dmOrientation == DMORIENT_LANDSCAPE) {
+      /* BBox co-ords are in default user co-ord system so urx < ury even in
+	 landscape mode */
+	urx = (int) (dc->w.devCaps->vertSize * 72.0 / 25.4);
+        ury = (int) (dc->w.devCaps->horzSize * 72.0 / 25.4);
+	orient = "Landscape";
+    } else {
+        urx = (int) (dc->w.devCaps->horzSize * 72.0 / 25.4);
+	ury = (int) (dc->w.devCaps->vertSize * 72.0 / 25.4);
+	orient = "Portrait";
+    }
+
+    /* FIXME should do something better with BBox */
+
+    sprintf(buf, psheader, title, 0, 0, urx, ury, orient);		
 
     if( WriteSpool( physDev->job.hJob, buf, strlen(buf) ) != 
 	                                             strlen(buf) ) {
@@ -166,6 +284,28 @@
     HeapFree( PSDRV_Heap, 0, titlebuf );
     HeapFree( PSDRV_Heap, 0, buf );
 
+    WriteSpool( physDev->job.hJob, psbeginprolog, strlen(psbeginprolog) );
+    WriteSpool( physDev->job.hJob, psvectorstart, strlen(psvectorstart) );
+    
+    for(i = 0; i < 256; i += 8) {
+        vectbuf[0] = '\0';
+        for(j = 0; j < 8; j++) {
+	    strcat(vectbuf, "/");
+	    if(PSDRV_ANSIVector[i+j]) {
+	        strcat(vectbuf, PSDRV_ANSIVector[i+j]);
+		strcat(vectbuf, " ");
+	    } else {
+	        strcat(vectbuf, ".notdef ");
+	    }
+	}
+	strcat(vectbuf, "\n");
+	WriteSpool( physDev->job.hJob, vectbuf, strlen(vectbuf) );
+    }
+
+    WriteSpool( physDev->job.hJob, psvectorend, strlen(psvectorend) );
+    WriteSpool( physDev->job.hJob, psprolog, strlen(psprolog) );
+    WriteSpool( physDev->job.hJob, psendprolog, strlen(psendprolog) );
+
 
     WriteSpool( physDev->job.hJob, psbeginsetup, strlen(psbeginsetup) );
 
@@ -189,7 +329,6 @@
 	}
     }
 
-
     WriteSpool( physDev->job.hJob, psendsetup, strlen(psendsetup) );
 
 
@@ -208,7 +347,7 @@
         return 0;
     }
 
-    wsprintf32A(buf, psfooter, physDev->job.PageNo);
+    sprintf(buf, psfooter, physDev->job.PageNo);
 
     if( WriteSpool( physDev->job.hJob, buf, strlen(buf) ) != 
 	                                             strlen(buf) ) {
@@ -242,16 +381,35 @@
     PSDRV_PDEVICE *physDev = (PSDRV_PDEVICE *)dc->physDev;
     char *buf;
     char name[100];
-    
-    wsprintf32A(name, "%d", physDev->job.PageNo);
+    signed int xtrans, ytrans, rotation;
 
-    buf = (char *)HeapAlloc( PSDRV_Heap, 0, sizeof(psnewpage) + 100 );
+    sprintf(name, "%d", physDev->job.PageNo);
+
+    buf = (char *)HeapAlloc( PSDRV_Heap, 0, sizeof(psnewpage) + 200 );
     if(!buf) {
         WARN(psdrv, "HeapAlloc failed\n");
         return 0;
     }
 
-    wsprintf32A(buf, psnewpage, name, physDev->job.PageNo); 
+    if(physDev->Devmode->dmPublic.dmOrientation == DMORIENT_LANDSCAPE) {
+        if(physDev->pi->ppd->LandscapeOrientation == -90) {
+	    xtrans = dc->w.devCaps->vertRes;
+	    ytrans = dc->w.devCaps->horzRes;
+	    rotation = 90;
+	} else {
+	    xtrans = ytrans = 0;
+	    rotation = -90;
+	}
+    } else {
+        xtrans = 0;
+	ytrans = dc->w.devCaps->vertRes;
+	rotation = 0;
+    }
+
+    sprintf(buf, psnewpage, name, physDev->job.PageNo,
+	    dc->w.devCaps->logPixelsX, dc->w.devCaps->logPixelsY,
+	    xtrans, ytrans, rotation);
+
     if( WriteSpool( physDev->job.hJob, buf, strlen(buf) ) != 
 	                                             strlen(buf) ) {
         WARN(psdrv, "WriteSpool error\n");
@@ -267,7 +425,7 @@
 {
     char buf[100];
 
-    wsprintf32A(buf, psmoveto, x, y);
+    sprintf(buf, psmoveto, x, y);
     return PSDRV_WriteSpool(dc, buf, strlen(buf));
 }
 
@@ -275,7 +433,7 @@
 {
     char buf[100];
 
-    wsprintf32A(buf, pslineto, x, y);
+    sprintf(buf, pslineto, x, y);
     return PSDRV_WriteSpool(dc, buf, strlen(buf));
 }
 
@@ -292,13 +450,21 @@
 {
     char buf[100];
 
-    wsprintf32A(buf, psrectangle, x, y, width, height, -width);
+    sprintf(buf, psrectangle, x, y, width, height, -width);
     return PSDRV_WriteSpool(dc, buf, strlen(buf));
 }
 
-static char encodingext[] = "-ISOLatin1";
+BOOL32 PSDRV_WriteEllispe(DC *dc, INT32 x, INT32 y, INT32 a, INT32 b)
+{
+    char buf[256];
 
-BOOL32 PSDRV_WriteSetFont(DC *dc)
+    sprintf(buf, psellipse, x, y, a, b);
+    return PSDRV_WriteSpool(dc, buf, strlen(buf));
+}
+
+static char encodingext[] = "-ANSI";
+
+BOOL32 PSDRV_WriteSetFont(DC *dc, BOOL32 UseANSI)
 {
     PSDRV_PDEVICE *physDev = (PSDRV_PDEVICE *)dc->physDev;
     char *buf, *newbuf;
@@ -320,9 +486,12 @@
         return FALSE;
     }
 
-    wsprintf32A(newbuf, "%s%s", physDev->font.afm->FontName, encodingext);
+    if(UseANSI)
+        sprintf(newbuf, "%s%s", physDev->font.afm->FontName, encodingext);
+    else
+        strcpy(newbuf, physDev->font.afm->FontName);
 
-    wsprintf32A(buf, pssetfont, newbuf, 
+    sprintf(buf, pssetfont, newbuf, 
 		physDev->font.size, -physDev->font.size,
 	        -physDev->font.escapement);
 
@@ -331,6 +500,49 @@
     return TRUE;
 }    
 
+BOOL32 PSDRV_WriteSetColor(DC *dc, PSCOLOR *color)
+{
+    PSDRV_PDEVICE *physDev = (PSDRV_PDEVICE *)dc->physDev;
+    char buf[256];
+
+    if(PSDRV_CmpColor(&physDev->inkColor, color))
+        return TRUE;
+
+    PSDRV_CopyColor(&physDev->inkColor, color);
+    switch(color->type) {
+    case PSCOLOR_RGB:
+        sprintf(buf, pssetrgbcolor, color->value.rgb.r, color->value.rgb.g,
+		color->value.rgb.b);
+	return PSDRV_WriteSpool(dc, buf, strlen(buf));
+
+    case PSCOLOR_GRAY:	
+        sprintf(buf, pssetgray, color->value.gray.i);
+	return PSDRV_WriteSpool(dc, buf, strlen(buf));
+	
+    default:
+        ERR(psdrv, "Unkonwn colour type %d\n", color->type);
+	break;
+    }
+
+    return FALSE;
+}
+
+BOOL32 PSDRV_WriteSetPen(DC *dc)
+{
+    PSDRV_PDEVICE *physDev = (PSDRV_PDEVICE *)dc->physDev;
+    char buf[256];
+
+    sprintf(buf, pssetlinewidth, physDev->pen.width);
+    PSDRV_WriteSpool(dc, buf, strlen(buf));
+
+    if(physDev->pen.dash) {
+        sprintf(buf, pssetdash, physDev->pen.dash, 0);
+	PSDRV_WriteSpool(dc, buf, strlen(buf));
+    }
+
+    return TRUE;
+}
+
 BOOL32 PSDRV_WriteReencodeFont(DC *dc)
 {
     PSDRV_PDEVICE *physDev = (PSDRV_PDEVICE *)dc->physDev;
@@ -354,8 +566,8 @@
         return FALSE;
     }
 
-    wsprintf32A(newbuf, "%s%s", physDev->font.afm->FontName, encodingext);
-    wsprintf32A(buf, psreencodefont, newbuf, physDev->font.afm->FontName);
+    sprintf(newbuf, "%s%s", physDev->font.afm->FontName, encodingext);
+    sprintf(buf, psreencodefont, newbuf, physDev->font.afm->FontName);
 
     PSDRV_WriteSpool(dc, buf, strlen(buf));
 
@@ -392,7 +604,7 @@
 
     buf1 = (char *)HeapAlloc( PSDRV_Heap, 0, sizeof(psshow) + done);
 
-    wsprintf32A(buf1, psshow, buf);
+    sprintf(buf1, psshow, buf);
 
     PSDRV_WriteSpool(dc, buf1, strlen(buf1));
     HeapFree(PSDRV_Heap, 0, buf);
@@ -401,6 +613,21 @@
     return TRUE;
 }    
 
+BOOL32 PSDRV_WriteFill(DC *dc)
+{
+    return PSDRV_WriteSpool(dc, psfill, sizeof(psfill)-1);
+}
+
+BOOL32 PSDRV_Writegsave(DC *dc)
+{
+    return PSDRV_WriteSpool(dc, psgsave, sizeof(psgsave)-1);
+}
+
+BOOL32 PSDRV_Writegrestore(DC *dc)
+{
+    return PSDRV_WriteSpool(dc, psgrestore, sizeof(psgrestore)-1);
+}
+
 
 
 
diff --git a/graphics/win16drv/init.c b/graphics/win16drv/init.c
index 053a2f3..d389b98 100644
--- a/graphics/win16drv/init.c
+++ b/graphics/win16drv/init.c
@@ -660,9 +660,8 @@
 	  nRet = cch;
 	if (pPrintJob->hDC == 0) {
 	    ERR(print, "hDC == 0 !\n");
-	    return SP_ERROR;
 	}
-	if (!(QueryAbort(pPrintJob->hDC, (nRet == SP_OUTOFDISK) ? nRet : 0 )))
+        else if (!(QueryAbort(pPrintJob->hDC, (nRet == SP_OUTOFDISK) ? nRet : 0 )))
 	{
 	    CloseJob(hJob); /* printing aborted */
 	    nRet = SP_APPABORT;
diff --git a/graphics/wing.c b/graphics/wing.c
index a68cacf..0216670 100644
--- a/graphics/wing.c
+++ b/graphics/wing.c
@@ -1,5 +1,5 @@
 /*
- * WingG support
+ * WinG support
  *
  * Started by Robert Pouliot <krynos@clic.net>
  */
@@ -55,7 +55,7 @@
 	return;
       }
     } 
-    FIXME(wing,"WinG: no joy.\n");
+    FIXME(wing,"WinG: incorrect depth or unsupported card.\n");
     __WinGOK = False;
   }
 }
diff --git a/graphics/x11drv/bitblt.c b/graphics/x11drv/bitblt.c
index 6cc8994..87ddb15 100644
--- a/graphics/x11drv/bitblt.c
+++ b/graphics/x11drv/bitblt.c
@@ -837,8 +837,9 @@
                   rectDst.bottom - rectDst.top, dcDst->w.bitsPerPixel );
     BITBLT_StretchImage( imageSrc, imageDst, widthSrc, heightSrc,
                          widthDst, heightDst, &rectSrc, &rectDst,
-                         dcDst->w.textPixel, dcDst->w.bitsPerPixel != 1 ?
-                           dcDst->w.backgroundPixel : dcSrc->w.backgroundPixel,
+                         dcDst->u.x.textPixel, dcDst->w.bitsPerPixel != 1 ?
+                         dcDst->u.x.backgroundPixel :
+			 dcSrc->u.x.backgroundPixel,
                          dcDst->w.stretchBltMode );
     XPutImage( display, pixmap, gc, imageDst, 0, 0, 0, 0,
                rectDst.right - rectDst.left, rectDst.bottom - rectDst.top );
@@ -900,14 +901,14 @@
             if (COLOR_PixelToPalette)
             {
                 XSetBackground( display, gc, 
-                               COLOR_PixelToPalette[dcDst->w.textPixel] );
+                             COLOR_PixelToPalette[dcDst->u.x.textPixel] );
                 XSetForeground( display, gc,
-                               COLOR_PixelToPalette[dcDst->w.backgroundPixel]);
+                             COLOR_PixelToPalette[dcDst->u.x.backgroundPixel]);
             }
             else
             {
-                XSetBackground( display, gc, dcDst->w.textPixel );
-                XSetForeground( display, gc, dcDst->w.backgroundPixel );
+                XSetBackground( display, gc, dcDst->u.x.textPixel );
+                XSetForeground( display, gc, dcDst->u.x.backgroundPixel );
             }
             XCopyPlane( display, dcSrc->u.x.drawable, pixmap, gc,
                         visRectSrc->left, visRectSrc->top,
@@ -923,7 +924,7 @@
             for (y = 0; y < height; y++)
                 for (x = 0; x < width; x++)
                     XPutPixel(imageDst, x, y, (XGetPixel(imageSrc,x,y) ==
-                                               dcSrc->w.backgroundPixel) );
+                                               dcSrc->u.x.backgroundPixel) );
             XPutImage( display, pixmap, gc, imageDst,
                        0, 0, 0, 0, width, height );
             XDestroyImage( imageSrc );
@@ -1239,8 +1240,8 @@
         }
         if (dcSrc->w.bitsPerPixel == 1)
         {
-            XSetBackground( display, dcDst->u.x.gc, dcDst->w.textPixel );
-            XSetForeground( display, dcDst->u.x.gc, dcDst->w.backgroundPixel );
+            XSetBackground( display, dcDst->u.x.gc, dcDst->u.x.textPixel );
+            XSetForeground( display, dcDst->u.x.gc, dcDst->u.x.backgroundPixel );
             XSetFunction( display, dcDst->u.x.gc, GXcopy );
             XSetGraphicsExposures( display, dcDst->u.x.gc, True );
 	    XCopyPlane( display, dcSrc->u.x.drawable,
diff --git a/graphics/x11drv/graphics.c b/graphics/x11drv/graphics.c
index 3e5f189..e60fed8 100644
--- a/graphics/x11drv/graphics.c
+++ b/graphics/x11drv/graphics.c
@@ -1099,3 +1099,37 @@
     free(xpoints);
     return TRUE;
 }
+
+/**********************************************************************
+ *          X11DRV_SetBkColor
+ */
+COLORREF
+X11DRV_SetBkColor( DC *dc, COLORREF color )
+{
+    X11DRV_PDEVICE *physDev = (X11DRV_PDEVICE *)dc->physDev;
+    COLORREF oldColor;
+
+    oldColor = dc->w.backgroundColor;
+    dc->w.backgroundColor = color;
+
+    physDev->backgroundPixel = COLOR_ToPhysical( dc, color );
+
+    return oldColor;
+}
+
+/**********************************************************************
+ *          X11DRV_SetTextColor
+ */
+COLORREF
+X11DRV_SetTextColor( DC *dc, COLORREF color )
+{
+    X11DRV_PDEVICE *physDev = (X11DRV_PDEVICE *)dc->physDev;
+    COLORREF oldColor;
+
+    oldColor = dc->w.textColor;
+    dc->w.textColor = color;
+
+    physDev->textPixel = COLOR_ToPhysical( dc, color );
+
+    return oldColor;
+}
diff --git a/graphics/x11drv/init.c b/graphics/x11drv/init.c
index cf91c6d..89c2936 100644
--- a/graphics/x11drv/init.c
+++ b/graphics/x11drv/init.c
@@ -61,7 +61,7 @@
     NULL,                            /* pSelectClipRgn */
     X11DRV_SelectObject,             /* pSelectObject */
     NULL,                            /* pSelectPalette */
-    NULL,                            /* pSetBkColor */
+    X11DRV_SetBkColor,               /* pSetBkColor */
     NULL,                            /* pSetBkMode */
     X11DRV_SetDeviceClipping,        /* pSetDeviceClipping */
     NULL,                            /* pSetDIBitsToDevice */
@@ -74,7 +74,7 @@
     NULL,                            /* pSetStretchBltMode */
     NULL,                            /* pSetTextAlign */
     NULL,                            /* pSetTextCharacterExtra */
-    NULL,                            /* pSetTextColor */
+    X11DRV_SetTextColor,             /* pSetTextColor */
     NULL,                            /* pSetTextJustification */
     NULL,                            /* pSetViewportExt (optional) */
     NULL,                            /* pSetViewportOrg (optional) */
diff --git a/graphics/x11drv/text.c b/graphics/x11drv/text.c
index 09c78b0..0b93e10 100644
--- a/graphics/x11drv/text.c
+++ b/graphics/x11drv/text.c
@@ -103,7 +103,7 @@
 
     if (flags & ETO_OPAQUE)
     {
-        TSXSetForeground( display, dc->u.x.gc, dc->w.backgroundPixel );
+        TSXSetForeground( display, dc->u.x.gc, dc->u.x.backgroundPixel );
         TSXFillRectangle( display, dc->u.x.drawable, dc->u.x.gc,
                         dc->w.DCOrgX + rect.left, dc->w.DCOrgY + rect.top,
                         rect.right-rect.left, rect.bottom-rect.top );
@@ -196,7 +196,7 @@
                 (y - ascent < rect.top) ||
                 (y + descent >= rect.bottom))
             {
-                TSXSetForeground( display, dc->u.x.gc, dc->w.backgroundPixel );
+                TSXSetForeground( display, dc->u.x.gc, dc->u.x.backgroundPixel );
                 TSXFillRectangle( display, dc->u.x.drawable, dc->u.x.gc,
                                 dc->w.DCOrgX + x,
                                 dc->w.DCOrgY + y - ascent,
@@ -208,7 +208,7 @@
     
     /* Draw the text (count > 0 verified) */
 
-    TSXSetForeground( display, dc->u.x.gc, dc->w.textPixel );
+    TSXSetForeground( display, dc->u.x.gc, dc->u.x.textPixel );
     if (!dc->w.charExtra && !dc->w.breakExtra && !lpDx)
     {
       if(!rotated)
diff --git a/if1632/compobj.spec b/if1632/compobj.spec
index d37bbef..fb9e76b 100644
--- a/if1632/compobj.spec
+++ b/if1632/compobj.spec
@@ -7,7 +7,7 @@
 4 pascal CoGetMalloc(long ptr) CoGetMalloc16
 5 pascal CoRegisterClassObject(ptr ptr long long ptr) CoRegisterClassObject16
 6 stub COREVOKECLASSOBJECT
-7 stub COGETCLASSOBJECT
+7 pascal CoGetClassObject(ptr long ptr ptr ptr) CoGetClassObject
 8 stub COMARSHALINTERFACE
 9 stub COUNMARSHALINTERFACE
 10 stub COLOADLIBRARY
@@ -29,13 +29,13 @@
 26 stub GETSCODE
 27 pascal CoRegisterMessageFilter(ptr ptr) CoRegisterMessageFilter16
 28 stub COISHANDLERCONNECTED
-#29 WEP
+29 stub SHRADDREF
 30 pascal CoFileTimeToDosDateTime(ptr ptr ptr) FileTimeToDosDateTime
 31 pascal CoDosDateTimeToFileTime(word word ptr) DosDateTimeToFileTime
 32 stub COMARSHALHRESULT
 33 stub COUNMARSHALHRESULT
 34 pascal CoGetCurrentProcess() CoGetCurrentProcess
-#35 ___EXPORTEDSTUB
+35 stub SHRCREATE
 36 stub COISOLE1CLASS
 37 stub _GUID_NULL
 38 stub _IID_IUNKNOWN
@@ -71,7 +71,7 @@
 68 stub PROPAGATERESULT
 69 stub IIDFROMSTRING
 70 stub _IID_ISTDMARSHALINFO
-71 stub COCREATESTANDARDMALLOC
+71 pascal CoCreateStandardMalloc(long ptr) CoCreateStandardMalloc16
 72 stub _IID_IEXTERNALCONNECTION
 73 stub COCREATEGUID
 75 stub FNASSERT
@@ -94,21 +94,31 @@
 92 stub LRPCGETTHREADWINDOW
 93 stub TIMERCALLBACKPROC
 94 pascal LookupETask(ptr ptr) LookupETask
-95 stub SETETASK
+95 pascal16 SetETask(word ptr) SetETask
 96 stub LRPCFREEMONITORDATA
 97 stub REMLOOKUPSHUNK
+98 stub SHRGETSIZE
+99 stub CALLTHKMGRUNINITIALIZE
 100 stub ??0CARRAYFVALUE@@REC@KI@Z
 101 stub ??1CARRAYFVALUE@@REC@XZ
 102 stub ?ASSERTVALID@CARRAYFVALUE@@RFCXXZ
 103 stub ?FREEEXTRA@CARRAYFVALUE@@RECXXZ
 104 stub ?_GETAT@CARRAYFVALUE@@RFCPEXH@Z
 105 stub ?GETSIZE@CARRAYFVALUE@@RFCHXZ
+106 stub ?REMOVEALL@CARRAYFVALUE@@RECXXZ
+107 stub SHRDESTROY
 108 stub ?INDEXOF@CARRAYFVALUE@@RECHPEXII@Z
 109 stub ?INSERTAT@CARRAYFVALUE@@RECHHPEXH@Z
+110 stub COSETSTATE
 111 stub ?REMOVEAT@CARRAYFVALUE@@RECXHH@Z
 112 stub ?SETAT@CARRAYFVALUE@@RECXHPEX@Z
 113 stub ?SETATGROW@CARRAYFVALUE@@RECHHPEX@Z
 114 stub ?SETSIZE@CARRAYFVALUE@@RECHHH@Z
+115 pascal CoGetState(ptr) CoGetState16
+116 stub DLLENTRYPOINT
+117 stub ?RELEASE@CSTDMALLOC@@VEAKXZ
+118 stub ?ALLOC@CSTDMALLOC@@VEAPEXK@Z
+119 stub SHRRELEASE
 120 stub ?GETASSOCAT@CMAPKEYTOVALUE@@BFCPEUCASSOC@1@PEXIAEI@Z
 121 stub ?SETASSOCKEY@CMAPKEYTOVALUE@@BFCHPEUCASSOC@1@PEXI@Z
 122 stub ??1CMAPKEYTOVALUE@@REC@XZ
@@ -126,6 +136,7 @@
 134 stub ?GETASSOCVALUE@CMAPKEYTOVALUE@@BFCXPEUCASSOC@1@PEX@Z
 135 stub ?REMOVEKEY@CMAPKEYTOVALUE@@RECHPEXI@Z
 136 stub ?REMOVEALL@CMAPKEYTOVALUE@@RECXXZ
+137 stub SHRALLOC
 138 stub ?FREEASSOCKEY@CMAPKEYTOVALUE@@BFCXPEUCASSOC@1@@Z
 139 stub ?SETAT@CMAPKEYTOVALUE@@RECHPEXI0@Z
 140 stub ?LOOKUPHKEY@CMAPKEYTOVALUE@@RFCHKPEX@Z
@@ -137,16 +148,64 @@
 146 stub ?GETASSOCVALUEPTR@CMAPKEYTOVALUE@@BFCXPEUCASSOC@1@PEPEX@Z
 147 stub ?LOOKUPADD@CMAPKEYTOVALUE@@RFCHPEXI0@Z
 148 stub MKVDEFAULTHASHKEY
+149 stub DELETE16
 150 stub COMEMCTXOF
 151 stub COMEMALLOC
 152 stub COMEMFREE
+153 stub SHRREALLOC
+154 stub ___EXPORTEDSTUB
+155 stub LRPCREGISTERWIN32SMONITOR
+156 stub MYREMGETINFOFORCID
+157 stub SHRFREE
+158 stub OPNEW16
+159 stub ADDCOINFO
 160 stub CORUNMODALLOOP
 161 stub COHANDLEINCOMINGCALL
 162 stub COSETACKSTATE
-
+163 stub SHRDIDALLOC
+164 stub ?GETAT@CARRAYFVALUE@@RFCPEXH@Z
+165 stub ?GETUPPERBOUND@CARRAYFVALUE@@RFCHXZ
+166 stub OPDELETE16
+167 stub ?GETSIZEVALUE@CARRAYFVALUE@@RFCHXZ
+168 stub ?PROXY1632ADDREF@@ZAKPEVCPROXY1632@@@Z
+169 stub REMLOOKUPSHUNK
+170 stub ?ISEMPTY@CMAPKEYTOVALUE@@RFCHXZ
+171 stub ?FREE@CSTDMALLOC@@VEAXPEX@Z
+172 stub CALLTHKMGRINITIALIZE
+173 stub ?REALLOC@CSTDMALLOC@@VEAPEXPEXK@Z
+174 stub ?SM16RHQI@@ZAPEXPEVCSM16RELEASEHANDLER@@AFUGUID@@PEPEX@Z
+175 stub ?PROXY1632METHOD10@@ZAKPEVCPROXY1632@@@Z
+176 stub ___EXPORTEDSTUB
+177 stub ?PROXY1632METHOD20@@ZAKPEVCPROXY1632@@@Z
+178 stub ?PROXY1632METHOD11@@ZAKPEVCPROXY1632@@@Z
+179 stub ?PROXY1632METHOD30@@ZAKPEVCPROXY1632@@@Z
+180 stub ?PROXY1632METHOD21@@ZAKPEVCPROXY1632@@@Z
+181 stub ?PROXY1632METHOD12@@ZAKPEVCPROXY1632@@@Z
+182 stub ?PROXY1632METHOD31@@ZAKPEVCPROXY1632@@@Z
+183 stub ?PROXY1632METHOD22@@ZAKPEVCPROXY1632@@@Z
+184 stub ?PROXY1632METHOD13@@ZAKPEVCPROXY1632@@@Z
+185 stub ?GETSIZE@CSTDMALLOC@@VEAKPEX@Z
+186 stub ?PROXY1632METHOD23@@ZAKPEVCPROXY1632@@@Z
+187 stub ?PROXY1632METHOD14@@ZAKPEVCPROXY1632@@@Z
+188 stub ?PROXY1632METHOD24@@ZAKPEVCPROXY1632@@@Z
+189 stub ?PROXY1632METHOD15@@ZAKPEVCPROXY1632@@@Z
+190 stub ?PROXY1632METHOD25@@ZAKPEVCPROXY1632@@@Z
+191 stub ?PROXY1632METHOD16@@ZAKPEVCPROXY1632@@@Z
+192 stub ?PROXY1632METHOD26@@ZAKPEVCPROXY1632@@@Z
+193 stub ?PROXY1632METHOD17@@ZAKPEVCPROXY1632@@@Z
+194 stub ?PROXY1632METHOD27@@ZAKPEVCPROXY1632@@@Z
+195 stub ?PROXY1632METHOD18@@ZAKPEVCPROXY1632@@@Z
+196 stub ?PROXY1632METHOD28@@ZAKPEVCPROXY1632@@@Z
+197 stub ?ADDREF@CSTDMALLOC@@VEAKXZ
+198 stub ?PROXY1632METHOD19@@ZAKPEVCPROXY1632@@@Z
+199 stub ?PROXY1632METHOD29@@ZAKPEVCPROXY1632@@@Z
+200 stub CALL32INITIALIZE
 201 pascal CALLOBJECTINWOW(ptr ptr) CallObjectInWOW
-204 stub COMPOBJ_204
-207 stub COMPOBJ_207
+203 stub CALLOBJECTINWOWCHECKINIT
+204 stub CALLOBJECTINWOWCHECKTHKMGR
+205 stub CONVERTHR1632
+206 stub CONVERTHR3216
+207 stub ADDAPPCOMPATFLAG
 
 # WINE internal relays (for Win16 interfaces)
 500 cdecl IMalloc16_QueryInterface(ptr ptr ptr) IMalloc16_QueryInterface
diff --git a/if1632/kernel.spec b/if1632/kernel.spec
index 52bcd9a..f15d568 100644
--- a/if1632/kernel.spec
+++ b/if1632/kernel.spec
@@ -142,7 +142,7 @@
 139 stub DoSignal
 140 pascal16 SetSigHandler(segptr ptr ptr word word) SetSigHandler
 141 stub InitTask1
-142 stub GetProfileSectionNames
+142 pascal16 GetProfileSectionNames(ptr word) GetProfileSectionNames16
 143 pascal16 GetPrivateProfileSectionNames(ptr word str) GetPrivateProfileSectionNames16
 144 pascal16 CreateDirectory(ptr ptr) CreateDirectory16
 145 pascal16 RemoveDirectory(ptr) RemoveDirectory16
@@ -325,25 +325,46 @@
 485 pascal GetProcessDWORD(long s_word) GetProcessDword
 486 stub KERNEL_486
 491 stub RegisterServiceProcess
-500 stub KERNEL_500
-502 stub KERNEL_502
-503 stub KERNEL_503
-511 stub KERNEL_511
+
+# Those stubs can be found in WindowNT3.51 krnl386.exe. Some are used by Win95
+# too, some seem to specify different functions in Win95... Ugh.
+500 pascal WOW16Call(word word word) WOW16Call
+501 stub KDDBGOUT
+502 stub WOWGETNEXTVDMCOMMAND
+503 stub WOWREGISTERSHELLWINDOWHANDLE
+504 stub WOWLOADMODULE
+505 stub WOWQUERYPERFORMANCECOUNTER
+506 stub WOWCURSORICONOP
+507 stub WOWFAILEDEXEC
+508 stub WOWCLOSECOMPORT
+509 stub WOWKILLREMOTETASK
+511 stub WOWKILLREMOTETASK
+512 stub WOWQUERYDEBUG
 513 pascal   LoadLibraryEx32W(ptr long long) LoadLibraryEx32W16
 514 pascal16 FreeLibrary32W(long) FreeLibrary32
 515 pascal   GetProcAddress32W(long str) GetProcAddress32
 516 pascal GetVDMPointer32W(segptr long) GetVDMPointer32W
 517 pascal CallProc32W() WIN16_CallProc32W
 518 pascal CallProcEx32W() WIN16_CallProcEx32W 
-519 stub KERNEL_519
-522 stub KERNEL_522
-523 stub KERNEL_523
-525 stub KERNEL_525
-531 stub KERNEL_531
-532 stub KERNEL_532
+519 stub EXITKERNELTHUNK
+# the __MOD_ variables are WORD datareferences.
+520 equate __MOD_KERNEL 4200
+521 equate __MOD_DKERNEL 4201
+522 equate __MOD_USER 4203
+523 equate __MOD_DUSER 4204
+524 equate __MOD_GDI 4205
+525 equate __MOD_DGDI 4206
+526 equate __MOD_KEYBOARD 4207
+527 equate __MOD_SOUND 4208
+528 equate __MOD_SHELL 4209
+529 equate __MOD_WINSOCK 4210
+530 equate __MOD_TOOLHELP 4211
+531 equate __MOD_MMEDIA 4212
+532 equate __MOD_COMMDLG 4213
 540 stub KERNEL_540
-541 stub KERNEL_541
-544 stub KERNEL_544
+541 stub WOWSETEXITONLASTAPP
+544 stub WOWSETCOMPATHANDLE
+
 600 stub KERNEL_600
 601 stub KERNEL_601
 604 stub KERNEL_604
diff --git a/if1632/ole2.spec b/if1632/ole2.spec
index bc54fdc..77894dd 100644
--- a/if1632/ole2.spec
+++ b/if1632/ole2.spec
@@ -36,7 +36,7 @@
 33 stub READSTRINGSTREAM
 34 stub WRITESTRINGSTREAM
 35 pascal RegisterDragDrop(word segptr) RegisterDragDrop16
-36 stub REVOKEDRAGDROP
+36 pascal RevokeDragDrop(word) RevokeDragDrop16
 37 stub DODRAGDROP
 38 stub CREATEOLEADVISEHOLDER
 39 stub CREATEDATAADVISEHOLDER
diff --git a/if1632/snoop.c b/if1632/snoop.c
index 1f94665..bec6753 100644
--- a/if1632/snoop.c
+++ b/if1632/snoop.c
@@ -229,18 +229,6 @@
 		FIXME(snoop,"entrypoint 0x%08lx not found\n",entry);
 		return; /* oops */
 	}
-	/* guess cdecl ... */
-	if (fun->nrofargs<0) {
-		/* Typical cdecl return frame is:
-		 * 	add esp, xxxxxxxx 
-		 * which has (for xxxxxxxx up to 255 the opcode "83 C4 xx".
-		 */
-		LPBYTE	reteip = (LPBYTE)PTR_SEG_TO_LIN(CALLER1REF);
-
-		if ((reteip[0]==0x83)&&(reteip[1]==0xc4))
-			fun->nrofargs=reteip[2]/2;
-	}
-
 	while (*rets) {
 		for (i=0;i<sizeof((*rets)->entry)/sizeof((*rets)->entry[0]);i++)
 			if (!(*rets)->entry[i].origreturn)
@@ -273,7 +261,8 @@
 	if(!ret->show) return;
 	DPRINTF("Call %s.%ld: %s(",dll->name,ordinal,fun->name);
 	if (fun->nrofargs>0) {
-		max = fun->nrofargs; if (max>16) max=16;
+		max = fun->nrofargs;
+		if (max>16) max=16;
 		for (i=max;i--;)
 			DPRINTF("%04x%s",*(WORD*)(PTR_SEG_OFF_TO_LIN(SS_reg(context),SP_reg(context))+8+sizeof(WORD)*i),i?",":"");
 		if (max!=fun->nrofargs)
@@ -294,8 +283,9 @@
 	 * will be the difference between orig and current SP
 	 * If pascal -> everything ok.
 	 */
-	if (ret->dll->funs[ret->ordinal].nrofargs<0)
+	if (ret->dll->funs[ret->ordinal].nrofargs<0) {
 		ret->dll->funs[ret->ordinal].nrofargs=(SP_reg(context)-ret->origSP-4)/2;
+	}
 	IP_reg(context) = LOWORD(ret->origreturn);
 	CS_reg(context) = HIWORD(ret->origreturn);
 	if(!ret->show) {
@@ -305,10 +295,15 @@
 
 		DPRINTF("Ret  %s.%ld: %s(",ret->dll->name,ret->ordinal,ret->dll->funs[ret->ordinal].name);
 		max = ret->dll->funs[ret->ordinal].nrofargs;
-		if (max>16) max=16;
+		if (max>16)
+			max=16;
+		if (max<0) 
+			max=0;
 
 		for (i=max;i--;)
 			DPRINTF("%04x%s",ret->args[i],i?",":"");
+		if (max!=ret->dll->funs[ret->ordinal].nrofargs)
+			DPRINTF(" ...");
 		DPRINTF(") retval = %04x:%04x ret=%04x:%04x\n",
 			DX_reg(context),AX_reg(context),HIWORD(ret->origreturn),LOWORD(ret->origreturn)
 		);
diff --git a/if1632/thunk.c b/if1632/thunk.c
index 83f5d87..39d5b1d 100644
--- a/if1632/thunk.c
+++ b/if1632/thunk.c
@@ -898,3 +898,18 @@
         }
     }
 }
+
+DWORD WINAPI 
+WOW16Call(WORD x,WORD y,WORD z) {
+	int	i;
+	DWORD	calladdr;
+	FIXME(thunk,"(0x%04x,0x%04x,%d),calling (",x,y,z);
+
+	for (i=0;i<x/2;i++) {
+		WORD	a = STACK16_POP(THREAD_Current(),2);
+		DPRINTF("%04x ",a);
+	}
+	calladdr = STACK16_POP(THREAD_Current(),4);
+	DPRINTF(") calling address was 0x%08lx\n",calladdr);
+	return 0;
+}
diff --git a/if1632/user.spec b/if1632/user.spec
index 3c925a42..66a3bb5 100644
--- a/if1632/user.spec
+++ b/if1632/user.spec
@@ -509,7 +509,7 @@
 665 pascal16 GetMenuItemRect(word word word ptr) GetMenuItemRect16
 666 stub CheckMenuRadioItem
 667 stub TrackPopupMenuEx
-668 stub SetWindowRgn
+668 pascal16 SetWindowRgn(word word word) SetWindowRgn16
 669 stub GetWindowRgn
 800 stub CHOOSEFONT_CALLBACK16
 801 stub FINDREPLACE_CALLBACK16
diff --git a/include/animate.h b/include/animate.h
new file mode 100644
index 0000000..8867a9f
--- /dev/null
+++ b/include/animate.h
@@ -0,0 +1,19 @@
+/*
+ * Animation class extra info
+ *
+ * Copyright 1998 Eric Kohl
+ */
+
+#ifndef __WINE_ANIMATE_H
+#define __WINE_ANIMATE_H
+
+
+typedef struct tagANIMATE_INFO
+{
+    DWORD dwDummy;
+} ANIMATE_INFO;
+
+
+extern void ANIMATE_Register (void);
+
+#endif  /* __WINE_ANIMATE_H */
diff --git a/include/authors.h b/include/authors.h
index 2cfc70b..8481837 100644
--- a/include/authors.h
+++ b/include/authors.h
@@ -111,6 +111,7 @@
     "Rick Sladkey",
     "William Smith",
     "Dominik Strasser",
+    "Patrik Stridvall",
     "Vadim Strizhevsky",
     "Bertho Stultiens",
     "Erik Svendsen",
diff --git a/include/comboex.h b/include/comboex.h
new file mode 100644
index 0000000..b2fb082
--- /dev/null
+++ b/include/comboex.h
@@ -0,0 +1,23 @@
+/*
+ * ComboBoxEx class extra info
+ *
+ * Copyright 1998 Eric Kohl
+ */
+
+#ifndef __WINE_COMBOEX_H
+#define __WINE_COMBOEX_H
+
+
+typedef struct tagCOMBOEX_INFO
+{
+    HIMAGELIST himl;
+    HWND32     hwndCombo;
+    DWORD      dwExtStyle;
+
+
+} COMBOEX_INFO;
+
+
+extern void COMBOEX_Register (void);
+
+#endif  /* __WINE_COMBOEX_H */
diff --git a/include/commctrl.h b/include/commctrl.h
index 3284c98..4d41405 100644
--- a/include/commctrl.h
+++ b/include/commctrl.h
@@ -37,7 +37,6 @@
 
 
 /* common control styles */
-
 #define CCS_TOP             0x00000001L
 #define CCS_NOMOVEY         0x00000002L
 #define CCS_BOTTOM          0x00000003L
@@ -63,140 +62,34 @@
 
 
 /* common notification codes (WM_NOTIFY)*/
-#define NM_FIRST                (0U-  0U)       // generic to all controls
+#define NM_FIRST                (0U-  0U)
 #define NM_LAST                 (0U- 99U)
+#define NM_OUTOFMEMORY          (NM_FIRST-1)
+#define NM_CLICK                (NM_FIRST-2)
+#define NM_DBLCLK               (NM_FIRST-3)
+#define NM_RETURN               (NM_FIRST-4)
+#define NM_RCLICK               (NM_FIRST-5)
+#define NM_RDBLCLK              (NM_FIRST-6)
+#define NM_SETFOCUS             (NM_FIRST-7)
+#define NM_KILLFOCUS            (NM_FIRST-8)
+#define NM_CUSTOMDRAW           (NM_FIRST-12)
+#define NM_HOVER                (NM_FIRST-13)
+#define NM_NCHITTEST            (NM_FIRST-14)
+#define NM_KEYDOWN              (NM_FIRST-15)
+#define NM_RELEASEDCAPTURE      (NM_FIRST-16)
+#define NM_SETCURSOR            (NM_FIRST-17)
+#define NM_CHAR                 (NM_FIRST-18)
+#define NM_TOOLTIPSCREATED      (NM_FIRST-19)
 
-#define LVN_FIRST               (0U-100U)       // listview
-#define LVN_LAST                (0U-199U)
-
-#define HDN_FIRST               (0U-300U)       // header
-#define HDN_LAST                (0U-399U)
-
-#define TVN_FIRST               (0U-400U)       // treeview
-#define TVN_LAST                (0U-499U)
-
-#define TTN_FIRST               (0U-520U)       // tooltips
-#define TTN_LAST                (0U-549U)
-
-#define TCN_FIRST               (0U-550U)       // tab control
-#define TCN_LAST                (0U-580U)
-
-// Shell reserved               (0U-580U) -  (0U-589U)
-
-#define CDN_FIRST               (0U-601U)       // common dialog (new)
-#define CDN_LAST                (0U-699U)
-
-#define TBN_FIRST               (0U-700U)       // toolbar
-#define TBN_LAST                (0U-720U)
-
-#define UDN_FIRST               (0U-721)        // updown
-#define UDN_LAST                (0U-740)
-
-#define MCN_FIRST               (0U-750U)       // monthcal
-#define MCN_LAST                (0U-759U)
-
-#define DTN_FIRST               (0U-760U)       // datetimepick
-#define DTN_LAST                (0U-799U)
-
-#define CBEN_FIRST              (0U-800U)       // combo box ex
-#define CBEN_LAST               (0U-830U)
-
-#define RBN_FIRST               (0U-831U)       // rebar
-#define RBN_LAST                (0U-859U)
-
-#define IPN_FIRST               (0U-860U)       // internet address
-#define IPN_LAST                (0U-879U)       // internet address
-
-#define SBN_FIRST               (0U-880U)       // status bar
-#define SBN_LAST                (0U-899U)
-
-#define PGN_FIRST               (0U-900U)       // Pager Control
-#define PGN_LAST                (0U-950U)
-
-
-#define NM_OUTOFMEMORY       (NM_FIRST-1)
-#define NM_CLICK             (NM_FIRST-2)
-#define NM_DBLCLK            (NM_FIRST-3)
-#define NM_RETURN            (NM_FIRST-4)
-#define NM_RCLICK            (NM_FIRST-5)
-#define NM_RDBLCLK           (NM_FIRST-6)
-#define NM_SETFOCUS          (NM_FIRST-7)
-#define NM_KILLFOCUS         (NM_FIRST-8)
-#define NM_CUSTOMDRAW        (NM_FIRST-12)
-#define NM_HOVER             (NM_FIRST-13)
-#define NM_NCHITTEST         (NM_FIRST-14)
-#define NM_KEYDOWN           (NM_FIRST-15)
-#define NM_RELEASEDCAPTURE   (NM_FIRST-16)
-#define NM_SETCURSOR         (NM_FIRST-17)
-#define NM_CHAR              (NM_FIRST-18)
-#define NM_TOOLTIPSCREATED   (NM_FIRST-19)
-
-#define HDN_ITEMCHANGINGA       (HDN_FIRST-0)
-#define HDN_ITEMCHANGINGW       (HDN_FIRST-20)
-#define HDN_ITEMCHANGEDA        (HDN_FIRST-1)
-#define HDN_ITEMCHANGEDW        (HDN_FIRST-21)
-#define HDN_ITEMCLICKA          (HDN_FIRST-2)
-#define HDN_ITEMCLICKW          (HDN_FIRST-22)
-#define HDN_ITEMDBLCLICKA       (HDN_FIRST-3)
-#define HDN_ITEMDBLCLICKW       (HDN_FIRST-23)
-#define HDN_DIVIDERDBLCLICKA    (HDN_FIRST-5)
-#define HDN_DIVIDERDBLCLICKW    (HDN_FIRST-25)
-#define HDN_BEGINTRACKA         (HDN_FIRST-6)
-#define HDN_BEGINTRACKW         (HDN_FIRST-26)
-#define HDN_ENDTRACKA           (HDN_FIRST-7)
-#define HDN_ENDTRACKW           (HDN_FIRST-27)
-#define HDN_TRACKA              (HDN_FIRST-8)
-#define HDN_TRACKW              (HDN_FIRST-28)
-#define HDN_GETDISPINFOA        (HDN_FIRST-9)
-#define HDN_GETDISPINFOW        (HDN_FIRST-29)
-#define HDN_BEGINDRAG           (HDN_FIRST-10)
-#define HDN_ENDDRAG             (HDN_FIRST-11)
-
-
-#define HDN_ITEMCHANGING         HDN_ITEMCHANGINGA
-#define HDN_ITEMCHANGED          HDN_ITEMCHANGEDA
-#define HDN_ITEMCLICK            HDN_ITEMCLICKA
-#define HDN_ITEMDBLCLICK         HDN_ITEMDBLCLICKA
-#define HDN_DIVIDERDBLCLICK      HDN_DIVIDERDBLCLICKA
-#define HDN_BEGINTRACK           HDN_BEGINTRACKA
-#define HDN_ENDTRACK             HDN_ENDTRACKA
-#define HDN_TRACK                HDN_TRACKA
-#define HDN_GETDISPINFO          HDN_GETDISPINFOA
-
-#define LVN_ITEMCHANGING        (LVN_FIRST-0)
-#define LVN_ITEMCHANGED         (LVN_FIRST-1)
-#define LVN_INSERTITEM          (LVN_FIRST-2)
-#define LVN_DELETEITEM          (LVN_FIRST-3)
-#define LVN_DELETEALLITEMS      (LVN_FIRST-4)
-#define LVN_BEGINLABELEDITA     (LVN_FIRST-5)
-#define LVN_BEGINLABELEDITW     (LVN_FIRST-75)
-#define LVN_ENDLABELEDITA       (LVN_FIRST-6)
-#define LVN_ENDLABELEDITW       (LVN_FIRST-76)
-#define LVN_COLUMNCLICK         (LVN_FIRST-8)
-#define LVN_BEGINDRAG           (LVN_FIRST-9)
-#define LVN_BEGINRDRAG          (LVN_FIRST-11)
-#define LVN_ODCACHEHINT         (LVN_FIRST-13)
-#define LVN_ODFINDITEMA         (LVN_FIRST-52)
-#define LVN_ODFINDITEMW         (LVN_FIRST-79)
-#define LVN_ITEMACTIVATE        (LVN_FIRST-14)
-#define LVN_ODSTATECHANGED      (LVN_FIRST-15)
-#define LVN_HOTTRACK            (LVN_FIRST-21)
-#define LVN_GETDISPINFOA        (LVN_FIRST-50)
-#define LVN_GETDISPINFOW        (LVN_FIRST-77)
-#define LVN_SETDISPINFOA        (LVN_FIRST-51)
-#define LVN_SETDISPINFOW        (LVN_FIRST-78)
-
-#define LVN_ODFINDITEM          LVN_ODFINDITEMA
-#define LVN_BEGINLABELEDIT      LVN_BEGINLABELEDITA
-#define LVN_ENDLABELEDIT        LVN_ENDLABELEDITA
-#define LVN_GETDISPINFO         LVN_GETDISPINFOA
-#define LVN_SETDISPINFO         LVN_SETDISPINFOA
 
 /* callback constants */
 #define LPSTR_TEXTCALLBACK32A    ((LPSTR)-1L)
 #define LPSTR_TEXTCALLBACK32W    ((LPWSTR)-1L)
 #define LPSTR_TEXTCALLBACK WINELIB_NAME_AW(LPSTR_TEXTCALLBACK)
 
+#define I_IMAGECALLBACK          (-1)
+#define I_INDENTCALLBACK         (-1)
+
 
 /* owner drawn types */
 #define ODT_HEADER      100
@@ -211,13 +104,30 @@
 } NMTOOLTIPSCREATED, *LPNMTOOLTIPSCREATED;
 
 
+#ifndef CCSIZEOF_STRUCT
+#define CCSIZEOF_STRUCT(name, member) \
+    (((INT32)((LPBYTE)(&((name*)0)->member)-((LPBYTE)((name*)0))))+ \
+    sizeof(((name*)0)->member))
+#endif
+
+#define SNDMSG WINELIB_NAME_AW(SendMessage)
+
+
 /* StatusWindow */
 
 #define STATUSCLASSNAME16     "msctls_statusbar"
 #define STATUSCLASSNAME32A    "msctls_statusbar32"
-#define STATUSCLASSNAME32W   L"msctls_statusbar32"
+#define STATUSCLASSNAME32W    L"msctls_statusbar32"
 #define STATUSCLASSNAME WINELIB_NAME_AW(STATUSCLASSNAME)
 
+#define SBT_NOBORDERS         0x0100
+#define SBT_POPOUT            0x0200
+#define SBT_RTLREADING        0x0400  /* not supported */
+#define SBT_TOOLTIPS          0x0800
+#define SBT_OWNERDRAW         0x1000
+
+#define SBARS_SIZEGRIP        0x0100
+
 #define SB_SETTEXT32A         (WM_USER+1)
 #define SB_SETTEXT32W         (WM_USER+11)
 #define SB_SETTEXT WINELIB_NAME_AW(SB_SETTEXT)
@@ -245,19 +155,10 @@
 #define SB_GETICON            (WM_USER+20)
 #define SB_SETBKCOLOR         CCM_SETBKCOLOR   /* lParam = bkColor */
 
-#define SBT_NOBORDERS         0x0100
-#define SBT_POPOUT            0x0200
-#define SBT_RTLREADING        0x0400  /* not supported */
-#define SBT_TOOLTIPS          0x0800
-#define SBT_OWNERDRAW         0x1000
-
-#define SBARS_SIZEGRIP        0x0100
-
 #define SBN_FIRST             (0U-880U)
 #define SBN_LAST              (0U-899U)
 #define SBN_SIMPLEMODECHANGE  (SBN_FIRST-0)
 
-
 HWND32 WINAPI CreateStatusWindow32A (INT32, LPCSTR, HWND32, UINT32);
 HWND32 WINAPI CreateStatusWindow32W (INT32, LPCWSTR, HWND32, UINT32);
 #define    CreateStatusWindow WINELIB_NAME_AW(CreateStatusWindow)
@@ -270,10 +171,10 @@
 
 /* UpDown */
 
-#define UPDOWN_CLASS16        "msctls_updown"
-#define UPDOWN_CLASS32A       "msctls_updown32"
-#define UPDOWN_CLASS32W      L"msctls_updown32"   /*FIXME*/
-#define UPDOWN_CLASS          WINELIB_NAME_AW(UPDOWN_CLASS)
+#define UPDOWN_CLASS16          "msctls_updown"
+#define UPDOWN_CLASS32A         "msctls_updown32"
+#define UPDOWN_CLASS32W         L"msctls_updown32"
+#define UPDOWN_CLASS            WINELIB_NAME_AW(UPDOWN_CLASS)
 
 typedef struct tagUDACCEL
 {
@@ -294,6 +195,7 @@
 #define UDS_NOTHOUSANDS    0x0080
 
 #define UDN_FIRST          (0U-721)
+#define UDN_LAST           (0U-740)
 #define UDN_DELTAPOS       (UDN_FIRST-1)
 
 #define UDM_SETRANGE       (WM_USER+101)
@@ -336,18 +238,17 @@
 
 typedef struct
 {
-  INT32 iLow;
-  INT32 iHigh;
+    INT32 iLow;
+    INT32 iHigh;
 } PBRANGE, *PPBRANGE;
 
 
 /* ImageList */
 /*
-#if defined(__WINE__) && defined(__WINE_IMAGELIST_C)
-#else
+#if !defined(__WINE__) || !defined(__WINE_IMAGELIST_C)
 struct _IMAGELIST;
 typedef struct _IMAGELIST *HIMAGELIST;
-#endif*/  /* __WINE__ */
+#endif */  /* __WINE__ */
 
 #define CLR_NONE         0xFFFFFFFF
 #define CLR_DEFAULT      0xFF000000
@@ -468,11 +369,10 @@
 
 /* Header control */
 
-#define WC_HEADER16    "SysHeader" 
-#define WC_HEADER32A   "SysHeader32" 
-#define WC_HEADER32W  L"SysHeader32" 
-
-#define WC_HEADER     WINELIB_NAME_AW(WC_HEADER)
+#define WC_HEADER16             "SysHeader" 
+#define WC_HEADER32A            "SysHeader32" 
+#define WC_HEADER32W            L"SysHeader32" 
+#define WC_HEADER  WINELIB_NAME_AW(WC_HEADER)
  
 #define HDS_HORZ                0x0000 
 #define HDS_BUTTONS             0x0002 
@@ -540,25 +440,35 @@
 #define HDN_LAST                (0U-399U)
 #define HDN_ITEMCHANGING32A     (HDN_FIRST-0)
 #define HDN_ITEMCHANGING32W     (HDN_FIRST-20)
+#define HDN_ITEMCHANGING WINELIB_NAME_AW(HDN_ITEMCHANGING)
 #define HDN_ITEMCHANGED32A      (HDN_FIRST-1)
 #define HDN_ITEMCHANGED32W      (HDN_FIRST-21)
+#define HDN_ITEMCHANGED WINELIB_NAME_AW(HDN_ITEMCHANGED)
 #define HDN_ITEMCLICK32A        (HDN_FIRST-2)
 #define HDN_ITEMCLICK32W        (HDN_FIRST-22)
+#define HDN_ITEMCLICK WINELIB_NAME_AW(HDN_ITEMCLICK)
 #define HDN_ITEMDBLCLICK32A     (HDN_FIRST-3)
 #define HDN_ITEMDBLCLICK32W     (HDN_FIRST-23)
+#define HDN_ITEMDBLCLICK WINELIB_NAME_AW(HDN_ITEMDBLCLICK)
 #define HDN_DIVIDERDBLCLICK32A  (HDN_FIRST-5)
 #define HDN_DIVIDERDBLCLICK32W  (HDN_FIRST-25)
+#define HDN_DIVIDERDBLCLICK WINELIB_NAME_AW(HDN_DIVIDERDBLCLICK)
 #define HDN_BEGINTRACK32A       (HDN_FIRST-6)
 #define HDN_BEGINTRACK32W       (HDN_FIRST-26)
+#define HDN_BEGINTRACK WINELIB_NAME_AW(HDN_BEGINTRACK)
 #define HDN_ENDTRACK32A         (HDN_FIRST-7)
 #define HDN_ENDTRACK32W         (HDN_FIRST-27)
+#define HDN_ENDTRACK WINELIB_NAME_AW(HDN_ENDTRACK)
 #define HDN_TRACK32A            (HDN_FIRST-8)
 #define HDN_TRACK32W            (HDN_FIRST-28)
+#define HDN_TRACK WINELIB_NAME_AW(HDN_TRACK)
 #define HDN_GETDISPINFO32A      (HDN_FIRST-9)
 #define HDN_GETDISPINFO32W      (HDN_FIRST-29)
+#define HDN_GETDISPINFO WINELIB_NAME_AW(HDN_GETDISPINFO)
 #define HDN_BEGINDRACK          (HDN_FIRST-10)
 #define HDN_ENDDRACK            (HDN_FIRST-11)
 
+
 typedef struct _HD_LAYOUT
 {
     RECT32      *prc;
@@ -578,7 +488,27 @@
     LPARAM    lParam;
     INT32     iImage;
     INT32     iOrder;
-} HD_ITEMA;
+} HDITEM32A, *LPHDITEM32A;
+
+typedef struct _HD_ITEMW
+{
+    UINT32    mask;
+    INT32     cxy;
+    LPWSTR    pszText;
+    HBITMAP32 hbm;
+    INT32     cchTextMax;
+    INT32     fmt;
+    LPARAM    lParam;
+    INT32     iImage;
+    INT32     iOrder;
+} HDITEM32W, *LPHDITEM32W;
+
+#define HDITEM   WINELIB_NAME_AW(HDITEM)
+#define LPHDITEM WINELIB_NAME_AW(LPHDITEM)
+
+#define HDITEM_V1_SIZE32A CCSIZEOF_STRUCT(HDITEM32A, lParam)
+#define HDITEM_V1_SIZE32W CCSIZEOF_STRUCT(HDITEM32W, lParam)
+#define HDITEM_V1_SIZE WINELIB_NAME_AW(HDITEM_V1_SIZE)
 
 typedef struct _HD_HITTESTINFO
 {
@@ -591,56 +521,55 @@
 
 typedef struct tagNMHEADERA
 {
-    NMHDR    hdr;
-    INT32    iItem;
-    INT32    iButton;
-    HD_ITEMA *pitem;
+    NMHDR     hdr;
+    INT32     iItem;
+    INT32     iButton;
+    HDITEM32A *pitem;
 } NMHEADERA, *LPNMHEADERA;
 
-
+#ifndef __WINE__
 #define Header_GetItemCount(hwndHD) \
-  (INT32)SendMessage32A((hwndHD),HDM_GETITEMCOUNT,0,0L)
+  (INT32)SNDMSG((hwndHD),HDM_GETITEMCOUNT,0,0L)
 #define Header_InsertItem(hwndHD,i,phdi) \
-  (INT32)SendMessage32A((hwndHD),HDM_INSERTITEM,(WPARAM32)(INT32)(i),\
-			(LPARAM)(const HD_ITEMA*)(phdi))
+  (INT32)SNDMSG((hwndHD),HDM_INSERTITEM,(WPARAM32)(INT32)(i),(LPARAM)(const HDITEM *)(phdi))
 #define Header_DeleteItem(hwndHD,i) \
-  (BOOL32)SendMessage32A((hwndHD),HDM_DELETEITEM,(WPARAM32)(INT32)(i),0L)
+  (BOOL32)SNDMSG((hwndHD),HDM_DELETEITEM,(WPARAM32)(INT32)(i),0L)
 #define Header_GetItem(hwndHD,i,phdi) \
-  (BOOL32)SendMessage32A((hwndHD),HDM_GETITEM,(WPARAM32)(INT32)(i),(LPARAM)(HD_ITEMA*)(phdi))
+  (BOOL32)SNDMSG((hwndHD),HDM_GETITEM,(WPARAM32)(INT32)(i),(LPARAM)(HDITEM *)(phdi))
 #define Header_SetItem(hwndHD,i,phdi) \
-  (BOOL32)SendMessage32A((hwndHD),HDM_SETITEM,(WPARAM32)(INT32)(i),(LPARAM)(const HD_ITEMA*)(phdi))
+  (BOOL32)SNDMSG((hwndHD),HDM_SETITEM,(WPARAM32)(INT32)(i),(LPARAM)(const HDITEM *)(phdi))
 #define Header_Layout(hwndHD,playout) \
-  (BOOL32)SendMessage32A((hwndHD),HDM_LAYOUT,0,(LPARAM)(LPHDLAYOUT)(playout))
+  (BOOL32)SNDMSG((hwndHD),HDM_LAYOUT,0,(LPARAM)(LPHDLAYOUT)(playout))
 #define Header_GetItemRect(hwnd,iItem,lprc) \
-  (BOOL32)SendMessage32A((hwnd),HDM_GETITEMRECT,(WPARAM32)iItem,(LPARAM)lprc)
+  (BOOL32)SNDMSG((hwnd),HDM_GETITEMRECT,(WPARAM32)iItem,(LPARAM)lprc)
 #define Header_SetImageList(hwnd,himl) \
-  (HIMAGELIST)SendMessage32A((hwnd),HDM_SETIMAGELIST,0,(LPARAM)himl)
+  (HIMAGELIST)SNDMSG((hwnd),HDM_SETIMAGELIST,0,(LPARAM)himl)
 #define Header_GetImageList(hwnd) \
-  (HIMAGELIST)SendMessage32A((hwnd),HDM_GETIMAGELIST,0,0)
+  (HIMAGELIST)SNDMSG((hwnd),HDM_GETIMAGELIST,0,0)
 #define Header_OrderToIndex(hwnd,i) \
-  (INT32)SendMessage32A((hwnd),HDM_ORDERTOINDEX,(WPARAM32)i,0)
+  (INT32)SNDMSG((hwnd),HDM_ORDERTOINDEX,(WPARAM32)i,0)
 #define Header_CreateDragImage(hwnd,i) \
-  (HIMAGELIST)SendMessage32A((hwnd),HDM_CREATEDRAGIMAGE,(WPARAM32)i,0)
+  (HIMAGELIST)SNDMSG((hwnd),HDM_CREATEDRAGIMAGE,(WPARAM32)i,0)
 #define Header_GetOrderArray(hwnd,iCount,lpi) \
-  (BOOL32)SendMessage32A((hwnd),HDM_GETORDERARRAY,(WPARAM32)iCount,(LPARAM)lpi)
+  (BOOL32)SNDMSG((hwnd),HDM_GETORDERARRAY,(WPARAM32)iCount,(LPARAM)lpi)
 #define Header_SetOrderArray(hwnd,iCount,lpi) \
-  (BOOL32)SendMessage32A((hwnd),HDM_SETORDERARRAY,(WPARAM32)iCount,(LPARAM)lpi)
+  (BOOL32)SNDMSG((hwnd),HDM_SETORDERARRAY,(WPARAM32)iCount,(LPARAM)lpi)
 #define Header_SetHotDivider(hwnd,fPos,dw) \
-  (INT32)SendMessage32A((hwnd),HDM_SETHOTDIVIDER,(WPARAM32)fPos,(LPARAM)dw)
+  (INT32)SNDMSG((hwnd),HDM_SETHOTDIVIDER,(WPARAM32)fPos,(LPARAM)dw)
 #define Header_SetUnicodeFormat(hwnd,fUnicode) \
-  (BOOL32)SendMessage32A((hwnd),HDM_SETUNICODEFORMAT,(WPARAM32)(fUnicode),0)
+  (BOOL32)SNDMSG((hwnd),HDM_SETUNICODEFORMAT,(WPARAM32)(fUnicode),0)
 #define Header_GetUnicodeFormat(hwnd) \
-  (BOOL32)SendMessage32A((hwnd),HDM_GETUNICODEFORMAT,0,0)
+  (BOOL32)SNDMSG((hwnd),HDM_GETUNICODEFORMAT,0,0)
+#endif /* #ifndef __WINE__ */
 
 
 /* Toolbar */
 
-#define TOOLBARCLASSNAME16        "ToolbarWindow" 
-#define TOOLBARCLASSNAME32W       L"ToolbarWindow32" 
-#define TOOLBARCLASSNAME32A       "ToolbarWindow32" 
+#define TOOLBARCLASSNAME16      "ToolbarWindow" 
+#define TOOLBARCLASSNAME32W     L"ToolbarWindow32" 
+#define TOOLBARCLASSNAME32A     "ToolbarWindow32" 
 #define TOOLBARCLASSNAME WINELIB_NAME_AW(TOOLBARCLASSNAME)
 
- 
 #define CMB_MASKED              0x02 
  
 #define TBSTATE_CHECKED         0x01 
@@ -652,7 +581,6 @@
 #define TBSTATE_ELLIPSES        0x40
 #define TBSTATE_MARKED          0x80 
  
- 
 #define TBSTYLE_BUTTON          0x00 
 #define TBSTYLE_SEP             0x01 
 #define TBSTYLE_CHECK           0x02 
@@ -675,14 +603,6 @@
 #define TBIF_COMMAND            0x00000020
 #define TBIF_SIZE               0x00000040
  
-#define TBN_FIRST               (0U-700U)
-#define TBN_LAST                (0U-720U)
-#define TBN_GETBUTTONINFO32A    (TBN_FIRST-0)
-#define TBN_GETBUTTONINFO32W    (TBN_FIRST-20)
-
-#define TBN_GETINFOTIP32A       (TBN_FIRST-18)
-#define TBN_GETINFOTIP32W       (TBN_FIRST-19)
-
 
 #define TB_ENABLEBUTTON          (WM_USER+1)
 #define TB_CHECKBUTTON           (WM_USER+2)
@@ -775,13 +695,20 @@
 #define TB_SETPADDING            (WM_USER+87)
 #define TB_SETINSERTMARKCOLOR    (WM_USER+88)
 #define TB_GETINSERTMARKCOLOR    (WM_USER+89)
-
 #define TB_SETCOLORSCHEME        CCM_SETCOLORSCHEME
 #define TB_GETCOLORSCHEME        CCM_GETCOLORSCHEME
-
 #define TB_SETUNICODEFORMAT      CCM_SETUNICODEFORMAT
 #define TB_GETUNICODEFORMAT      CCM_GETUNICODEFORMAT
 
+#define TBN_FIRST               (0U-700U)
+#define TBN_LAST                (0U-720U)
+#define TBN_GETBUTTONINFO32A    (TBN_FIRST-0)
+#define TBN_GETBUTTONINFO32W    (TBN_FIRST-20)
+#define TBN_GETBUTTONINFO WINELIB_NAME_AW(TBN_GETBUTTONINFO)
+#define TBN_GETINFOTIP32A       (TBN_FIRST-18)
+#define TBN_GETINFOTIP32W       (TBN_FIRST-19)
+#define TBN_GETINFOTIP WINELIB_NAME_AW(TBN_GETINFOTIP)
+
 
 /* This is just for old CreateToolbar. */
 /* Don't use it in new programs. */
@@ -904,9 +831,9 @@
 
 /* Tool tips */
 
-#define TOOLTIPS_CLASS16         "tooltips_class"
+#define TOOLTIPS_CLASS16        "tooltips_class"
+#define TOOLTIPS_CLASS32A       "tooltips_class32"
 #define TOOLTIPS_CLASS32W       L"tooltips_class32"
-#define TOOLTIPS_CLASS32A        "tooltips_class32"
 #define TOOLTIPS_CLASS          WINELIB_NAME_AW(TOOLTIPS_CLASS)
 
 #define INFOTIPSIZE             1024
@@ -1014,6 +941,10 @@
 #define PTOOLINFO WINELIB_NAME_AW(PTOOLINFO)
 #define LPTTTOOLINFO WINELIB_NAME_AW(LPTTTOOLINFO)
 
+#define TTTOOLINFO_V1_SIZE32A CCSIZEOF_STRUCT(TTTOOLINFO32A, lpszText)
+#define TTTOOLINFO_V1_SIZE32W CCSIZEOF_STRUCT(TTTOOLINFO32W, lpszText)
+#define TTTOOLINFO_V1_SIZE WINELIB_NAME_AW(TTTOOLINFO_V1_SIZE)
+
 typedef struct _TT_HITTESTINFOA
 {
     HWND32        hwnd;
@@ -1054,6 +985,10 @@
 #define NMTTDISPINFO WINELIB_NAME_AW(NMTTDISPINFO)
 #define LPNMTTDISPINFO WINELIB_NAME_AW(LPNMTTDISPINFO)
 
+#define NMTTDISPINFO_V1_SIZE32A CCSIZEOF_STRUCT(NMTTDISPINFO32A, uFlags)
+#define NMTTDISPINFO_V1_SIZE32W CCSIZEOF_STRUCT(NMTTDISPINFO32W, uFlags)
+#define NMTTDISPINFO_V1_SIZE WINELIB_NAME_AW(NMTTDISPINFO_V1_SIZE)
+
 
 /* Rebar control */
 
@@ -1111,10 +1046,8 @@
 #define RB_GETBANDINFO WINELIB_NAME_AW(RB_GETBANDINFO)
 #define RB_MINIMIZEBAND         (WM_USER+30)
 #define RB_MAXIMIZEBAND         (WM_USER+31)
-
 #define RB_GETBANDORDERS        (WM_USER+34)
 #define RB_SHOWBAND             (WM_USER+35)
-
 #define RB_SETPALETTE           (WM_USER+37)
 #define RB_GETPALETTE           (WM_USER+38)
 #define RB_MOVEBAND             (WM_USER+39)
@@ -1124,6 +1057,9 @@
 #define RB_SETUNICODEFORMAT     CCS_SETUNICODEFORMAT
 #define RB_GETUNICODEFORMAT     CCS_GETUNICODEFORMAT
 
+#define RBN_FIRST               (0U-831U)
+#define RBN_LAST                (0U-859U)
+
 
 typedef struct tagREBARINFO
 {
@@ -1156,8 +1092,41 @@
     UINT32    cxHeader;
 } REBARBANDINFO32A, *LPREBARBANDINFO32A;
 
+typedef REBARBANDINFO32A const *LPCREBARBANDINFO32A;
 
+typedef struct tagREBARBANDINFOW
+{
+    UINT32    cbSize;
+    UINT32    fMask;
+    UINT32    fStyle;
+    COLORREF  clrFore;
+    COLORREF  clrBack;
+    LPSTR     lpText;
+    UINT32    cch;
+    INT32     iImage;
+    HWND32    hwndChild;
+    UINT32    cxMinChild;
+    UINT32    cyMinChild;
+    UINT32    cx;
+    HBITMAP32 hbmBack;
+    UINT32    wID;
+    UINT32    cyChild;
+    UINT32    cyMaxChild;
+    UINT32    cyIntegral;
+    UINT32    cxIdeal;
+    LPARAM    lParam;
+    UINT32    cxHeader;
+} REBARBANDINFO32W, *LPREBARBANDINFO32W;
 
+typedef REBARBANDINFO32W const *LPCREBARBANDINFO32W;
+
+#define REBARBANDINFO    WINELIB_NAME_AW(REBARBANDINFO)
+#define LPREBARBANDINFO  WINELIB_NAME_AW(LPREBARBANDINFO)
+#define LPCREBARBANDINFO WINELIB_NAME_AW(LPCREBARBANDINFO)
+
+#define REBARBANDINFO_V3_SIZE32A CCSIZEOF_STRUCT(REBARBANDINFO32A, wID)
+#define REBARBANDINFO_V3_SIZE32W CCSIZEOF_STRUCT(REBARBANDINFO32W, wID)
+#define REBARBANDINFO_V3_SIZE WINELIB_NAME_AW(REBARBANDINFO_V3_SIZE)
 
 
 /* Trackbar control */
@@ -1257,8 +1226,21 @@
 #define PGB_TOPORLEFT           0
 #define PGB_BOTTOMORRIGHT       1
 
-#define PGM_FIRST               0x1400
+/* only used with PGN_SCROLL */
+#define PGF_SCROLLUP            1
+#define PGF_SCROLLDOWN          2
+#define PGF_SCROLLLEFT          4
+#define PGF_SCROLLRIGHT         8
 
+#define PGK_SHIFT               1
+#define PGK_CONTROL             2
+#define PGK_MENU                4
+
+/* only used with PGN_CALCSIZE */
+#define PGF_CALCWIDTH           1
+#define PGF_CALCHEIGHT          2
+
+#define PGM_FIRST               0x1400
 #define PGM_SETCHILD            (PGM_FIRST+1)
 #define PGM_RECALCSIZE          (PGM_FIRST+2)
 #define PGM_FORWARDMOUSE        (PGM_FIRST+3)
@@ -1273,21 +1255,44 @@
 #define PGM_GETBUTTONSTATE      (PGM_FIRST+12)
 #define PGM_GETDROPTARGET       CCM_GETDROPTARGET
 
+#define PGN_FIRST               (0U-900U)
+#define PGN_LAST                (0U-950U)
+#define PGN_SCROLL              (PGN_FIRST-1)
+#define PGN_CALCSIZE            (PGN_FIRST-2)
+
+typedef struct
+{
+    NMHDR hdr;
+    WORD  fwKeys;
+    RECT32 rcParent;
+    INT32  iDir;
+    INT32  iXpos;
+    INT32  iYpos;
+    INT32  iScroll;
+} NMPGSCROLL, *LPNMPGSCROLL;
+
+typedef struct
+{
+    NMHDR hdr;
+    DWORD dwFlag;
+    INT32 iWidth;
+    INT32 iHeight;
+} NMPGCALCSIZE, *LPNMPGCALCSIZE;
 
 
 /* Treeview control */
 
 #define WC_TREEVIEW32A          "SysTreeView32"
 #define WC_TREEVIEW32W          L"SysTreeView32"
-#define WC_TREEVIEW  WINELIB_NAME_AW(WC_TREEVIEW)
+#define WC_TREEVIEW             WINELIB_NAME_AW(WC_TREEVIEW)
 
 #define TVSIL_NORMAL            0
 #define TVSIL_STATE             2
 
 #define TV_FIRST                0x1100
-
-#define TVM_INSERTITEMA         (TV_FIRST+0)
-#define TVM_INSERTITEMW         (TV_FIRST+50)
+#define TVM_INSERTITEM32A       (TV_FIRST+0)
+#define TVM_INSERTITEM32W       (TV_FIRST+50)
+#define TVM_INSERTITEM          WINELIB_NAME_AW(TVM_INSERTITEM)
 #define TVM_DELETEITEM          (TV_FIRST+1)
 #define TVM_EXPAND              (TV_FIRST+2)
 #define TVM_GETITEMRECT         (TV_FIRST+4)
@@ -1298,12 +1303,15 @@
 #define TVM_SETIMAGELIST        (TV_FIRST+9)
 #define TVM_GETNEXTITEM         (TV_FIRST+10)
 #define TVM_SELECTITEM          (TV_FIRST+11)
-#define TVM_GETITEMA            (TV_FIRST+12)
-#define TVM_GETITEMW            (TV_FIRST+62)
-#define TVM_SETITEMA            (TV_FIRST+13)
-#define TVM_SETITEMW            (TV_FIRST+63)
-#define TVM_EDITLABELA          (TV_FIRST+14)
-#define TVM_EDITLABELW          (TV_FIRST+65)
+#define TVM_GETITEM32A          (TV_FIRST+12)
+#define TVM_GETITEM32W          (TV_FIRST+62)
+#define TVM_GETITEM             WINELIB_NAME_AW(TVM_GETITEM)
+#define TVM_SETITEM32A          (TV_FIRST+13)
+#define TVM_SETITEM32W          (TV_FIRST+63)
+#define TVM_SETITEM             WINELIB_NAME_AW(TVM_SETITEM)
+#define TVM_EDITLABEL32A        (TV_FIRST+14)
+#define TVM_EDITLABEL32W        (TV_FIRST+65)
+#define TVM_EDITLABEL           WINELIB_NAME_AW(TVM_EDITLABEL)
 #define TVM_GETEDITCONTROL      (TV_FIRST+15)
 #define TVM_GETVISIBLECOUNT     (TV_FIRST+16)
 #define TVM_HITTEST             (TV_FIRST+17)
@@ -1312,10 +1320,28 @@
 #define TVM_ENSUREVISIBLE       (TV_FIRST+20)
 #define TVM_SORTCHILDRENCB      (TV_FIRST+21)
 #define TVM_ENDEDITLABELNOW     (TV_FIRST+22)
-#define TVM_GETISEARCHSTRINGA   (TV_FIRST+23)
-#define TVM_GETISEARCHSTRINGW   (TV_FIRST+64)
+#define TVM_GETISEARCHSTRING32A (TV_FIRST+23)
+#define TVM_GETISEARCHSTRING32W (TV_FIRST+64)
+#define TVM_GETISEARCHSTRING    WINELIB_NAME_AW(TVM_GETISEARCHSTRING)
 #define TVM_SETTOOLTIPS         (TV_FIRST+24)
 #define TVM_GETTOOLTIPS         (TV_FIRST+25)
+#define TVM_SETINSERTMARK       (TV_FIRST+26)
+#define TVM_SETITEMHEIGHT       (TV_FIRST+27)
+#define TVM_GETITEMHEIGHT       (TV_FIRST+28)
+#define TVM_SETBKCOLOR          (TV_FIRST+29)
+#define TVM_SETTEXTCOLOR        (TV_FIRST+30)
+#define TVM_GETBKCOLOR          (TV_FIRST+31)
+#define TVM_GETTEXTCOLOR        (TV_FIRST+32)
+#define TVM_SETSCROLLTIME       (TV_FIRST+33)
+#define TVM_GETSCROLLTIME       (TV_FIRST+34)
+#define TVM_SETINSERTMARKCOLOR  (TV_FIRST+37)
+#define TVM_GETINSERTMARKCOLOR  (TV_FIRST+38)
+#define TVM_SETUNICODEFORMAT    CCM_SETUNICODEFORMAT
+#define TVM_GETUNICODEFORMAT    CCM_GETUNICODEFORMAT
+
+#define TVN_FIRST               (0U-400U)
+#define TVN_LAST                (0U-499U)
+
 
 /* Listview control */
 
@@ -1323,20 +1349,6 @@
 #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_GETIMAGELIST        (LVM_FIRST+2)
-#define LVM_SETIMAGELIST        (LVM_FIRST+3)
-#define LVM_GETITEMCOUNT        (LVM_FIRST+4)
-#define LVM_GETITEM             (LVM_FIRST+5)
-#define LVM_INSERTITEM          (LVM_FIRST+7)
-#define LVM_DELETEALLITEMS      (LVM_FIRST+9)
-#define LVM_SETITEMPOSITION     (LVM_FIRST+15)
-#define LVM_INSERTCOLUMN        (LVM_FIRST+27)
-#define LVM_SORTITEMS           (LVM_FIRST+48)
-#define LVM_GETSELECTEDCOUNT    (LVM_FIRST+50)
-
 #define LVS_ICON                0x0000
 #define LVS_REPORT              0x0001
 #define LVS_SMALLICON           0x0002
@@ -1360,80 +1372,6 @@
 #define LVS_NOCOLUMNHEADER      0x4000
 #define LVS_NOSORTHEADER        0x8000
 
-#define I_IMAGECALLBACK         (-1)
-#define I_INDENTCALLBACK        (-1)
-#define LV_ITEMA LVITEMA
-#define LV_ITEMW LVITEMW
-
-#define LV_ITEM LVITEM
-
-#define LVITEMA_V1_SIZE CCSIZEOF_STRUCT(LVITEMA, lParam)
-#define LVITEMW_V1_SIZE CCSIZEOF_STRUCT(LVITEMW, lParam)
-
-typedef struct tagLVITEMA
-{
-    UINT32 mask;
-    int iItem;
-    int iSubItem;
-    UINT32 state;
-    UINT32 stateMask;
-    LPSTR pszText;
-    int cchTextMax;
-    int iImage;
-    LPARAM lParam;
-    int iIndent;	//(_WIN32_IE >= 0x0300)
-} LVITEMA, * LPLVITEMA;
-
-typedef struct tagLVITEMW
-{
-    UINT32 mask;
-    int iItem;
-    int iSubItem;
-    UINT32 state;
-    UINT32 stateMask;
-    LPWSTR pszText;
-    int cchTextMax;
-    int iImage;
-    LPARAM lParam;
-    int iIndent;	//(_WIN32_IE >= 0x0300)
-} LVITEMW, * LPLVITEMW;
-
-#define LVITEM    LVITEMA
-#define LPLVITEM  LPLVITEMA
-#define LVITEM_V1_SIZE LVITEMA_V1_SIZE
-
-#define LV_COLUMNA      LVCOLUMNA
-#define LV_COLUMNW      LVCOLUMNW
-#define LV_COLUMN       LVCOLUMN
-#define LVCOLUMNA_V1_SIZE CCSIZEOF_STRUCT(LVCOLUMNA, iSubItem)
-#define LVCOLUMNW_V1_SIZE CCSIZEOF_STRUCT(LVCOLUMNW, iSubItem)
-
-typedef struct tagLVCOLUMNA
-{   UINT32 mask;
-    int fmt;
-    int cx;
-    LPSTR pszText;
-    int cchTextMax;
-    int iSubItem;
-    int iImage;  //(_WIN32_IE >= 0x0300)
-    int iOrder;  //(_WIN32_IE >= 0x0300)
-} LVCOLUMNA,* LPLVCOLUMNA;
-
-typedef struct tagLVCOLUMNW
-{   UINT32 mask;
-    int fmt;
-    int cx;
-    LPWSTR pszText;
-    int cchTextMax;
-    int iSubItem;
-    int iImage;	//(_WIN32_IE >= 0x0300)
-    int iOrder;	//(_WIN32_IE >= 0x0300)
-} LVCOLUMNW,* LPLVCOLUMNW;
-
-#define  LVCOLUMN               LVCOLUMNA
-#define  LPLVCOLUMN             LPLVCOLUMNA
-#define LVCOLUMN_V1_SIZE LVCOLUMNA_V1_SIZE
-
 #define LVCF_FMT                0x0001
 #define LVCF_WIDTH              0x0002
 #define LVCF_TEXT               0x0004
@@ -1441,7 +1379,6 @@
 #define LVCF_IMAGE              0x0010
 #define LVCF_ORDER              0x0020
 
-
 #define LVCFMT_LEFT             0x0000
 #define LVCFMT_RIGHT            0x0001
 #define LVCFMT_CENTER           0x0002
@@ -1450,25 +1387,10 @@
 #define LVCFMT_BITMAP_ON_RIGHT  0x1000
 #define LVCFMT_COL_HAS_IMAGES   0x8000
 
-#define SNDMSG SendMessage32A
-#define ListView_GetImageList(hwnd, iImageList) (HIMAGELIST)SNDMSG((hwnd), LVM_GETIMAGELIST, (WPARAM)(INT)(iImageList), 0L)
-
 #define LVSIL_NORMAL            0
 #define LVSIL_SMALL             1
 #define LVSIL_STATE             2
 
-
-#define ListView_SetImageList(hwnd, himl, iImageList) (HIMAGELIST)(UINT32)SNDMSG((hwnd), LVM_SETIMAGELIST, (WPARAM32)(iImageList), (LPARAM)(UINT32)(HIMAGELIST)(himl))
-#define ListView_GetItemCount(hwnd)(int)SNDMSG((hwnd), LVM_GETITEMCOUNT, 0, 0L)
-#define ListView_GetItem(hwnd, pitem)(BOOL32)SNDMSG((hwnd), LVM_GETITEM, 0, (LPARAM)(LV_ITEM *)(pitem))
-#define ListView_InsertItem(hwnd, pitem) (int)SNDMSG((hwnd), LVM_INSERTITEM, 0, (LPARAM)(const LV_ITEM *)(pitem))
-#define ListView_DeleteAllItems(hwnd) (BOOL32)SNDMSG((hwnd), LVM_DELETEALLITEMS, 0, 0L)
-#define ListView_InsertColumn(hwnd, iCol, pcol)(int)SNDMSG((hwnd), LVM_INSERTCOLUMN, (WPARAM32)(int)(iCol), (LPARAM)(const LV_COLUMN *)(pcol))
-typedef int (CALLBACK *PFNLVCOMPARE)(LPARAM, LPARAM, LPARAM);
-#define ListView_SortItems(hwndLV, _pfnCompare, _lPrm)(BOOL32)SNDMSG((hwndLV), LVM_SORTITEMS, (WPARAM32)(LPARAM)_lPrm,(LPARAM)(PFNLVCOMPARE)_pfnCompare)
-#define ListView_SetItemPosition(hwndLV, i, x, y)(BOOL32)SNDMSG((hwndLV), LVM_SETITEMPOSITION, (WPARAM32)(int)(i), MAKELPARAM((x), (y)))
-#define ListView_GetSelectedCount(hwndLV)(UINT32)SNDMSG((hwndLV), LVM_GETSELECTEDCOUNT, 0, 0L)
-
 #define LVIF_TEXT               0x0001
 #define LVIF_IMAGE              0x0002
 #define LVIF_PARAM              0x0004
@@ -1485,37 +1407,435 @@
 #define LVIS_OVERLAYMASK        0x0F00
 #define LVIS_STATEIMAGEMASK     0xF000
 
-#define LPNM_LISTVIEW   LPNMLISTVIEW
-#define NM_LISTVIEW     NMLISTVIEW
+#define LVM_FIRST               0x1000
+#define LVM_GETBKCOLOR          (LVM_FIRST+0)
+#define LVM_SETBKCOLOR          (LVM_FIRST+1)
+#define LVM_GETIMAGELIST        (LVM_FIRST+2)
+#define LVM_SETIMAGELIST        (LVM_FIRST+3)
+#define LVM_GETITEMCOUNT        (LVM_FIRST+4)
+#define LVM_GETITEM32A          (LVM_FIRST+5)
+#define LVM_GETITEM32W          (LVM_FIRST+75)
+#define LVM_GETITEM             WINELIB_NAME_AW(LVM_GETITEM)
+#define LVM_SETITEM32A          (LVM_FIRST+6)
+#define LVM_SETITEM32W          (LVM_FIRST+76)
+#define LVM_SETITEM             WINELIB_NAME_AW(LVM_SETITEM)
+#define LVM_INSERTITEM32A       (LVM_FIRST+7)
+#define LVM_INSERTITEM32W       (LVM_FIRST+77)
+#define LVM_INSERTITEM          WINELIB_NAME_AW(LVM_INSERTITEM)
+#define LVM_DELETEITEM          (LVM_FIRST+8)
+#define LVM_DELETEALLITEMS      (LVM_FIRST+9)
+#define LVM_GETCALLBACKMASK     (LVM_FIRST+10)
+#define LVM_SETCALLBACKMASK     (LVM_FIRST+11)
+#define LVM_GETNEXTITEM         (LVM_FIRST+12)
+#define LVM_FINDITEM32A         (LVM_FIRST+13)
+#define LVM_FINDITEM32W         (LVM_FIRST+83)
+#define LVM_FINDITEM            WINELIB_NAME_AW(LVM_FINDITEM)
+#define LVM_GETITEMRECT         (LVM_FIRST+14)
+#define LVM_SETITEMPOSITION     (LVM_FIRST+15)
+#define LVM_GETITEMPOSITION     (LVM_FIRST+16)
+#define LVM_GETSTRINGWIDTH32A   (LVM_FIRST+17)
+#define LVM_GETSTRINGWIDTH32W   (LVM_FIRST+87)
+#define LVM_GETSTRINGWIDTH      WINELIB_NAME_AW(LVM_GETSTRINGWIDTH)
+#define LVM_HITTEST             (LVM_FIRST+18)
+#define LVM_ENSUREVISIBLE       (LVM_FIRST+19)
+#define LVM_SCROLL              (LVM_FIRST+20)
+#define LVM_REDRAWITEMS         (LVM_FIRST+21)
+#define LVM_ARRANGE             (LVM_FIRST+22)
+#define LVM_EDITLABEL32A        (LVM_FIRST+23)
+#define LVM_EDITLABEL32W        (LVM_FIRST+118)
+#define LVM_EDITLABEL           WINELIB_NAME_AW(LVM_EDITLABEL)
+#define LVM_GETEDITCONTROL      (LVM_FIRST+24)
+#define LVM_GETCOLUMN32A        (LVM_FIRST+25)
+#define LVM_GETCOLUMN32W        (LVM_FIRST+95)
+#define LVM_GETCOLUMN           WINELIB_NAME_AW(LVM_GETCOLUMN)
+#define LVM_SETCOLUMN32A        (LVM_FIRST+26)
+#define LVM_SETCOLUMN32W        (LVM_FIRST+96)
+#define LVM_SETCOLUMN           WINELIB_NAME_AW(LVM_SETCOLUMN)
+#define LVM_INSERTCOLUMN32A     (LVM_FIRST+27)
+#define LVM_INSERTCOLUMN32W     (LVM_FIRST+97)
+#define LVM_INSERTCOLUMN        WINELIB_NAME_AW(LVM_INSERTCOLUMN)
+#define LVM_DELETECOLUMN        (LVM_FIRST+28)
+#define LVM_GETCOLUMNWIDTH      (LVM_FIRST+29)
+#define LVM_GETHEADER           (LVM_FIRST+30)
+
+#define LVM_SORTITEMS           (LVM_FIRST+48)
+#define LVM_GETSELECTEDCOUNT    (LVM_FIRST+50)
+
+#define LVM_SETEXTENDEDLISTVIEWSTYLE (LVM_FIRST+54)
+#define LVM_GETEXTENDEDLISTVIEWSTYLE (LVM_FIRST+55)
+
+
+#define LVN_FIRST               (0U-100U)
+#define LVN_LAST                (0U-199U)
+#define LVN_ITEMCHANGING        (LVN_FIRST-0)
+#define LVN_ITEMCHANGED         (LVN_FIRST-1)
+#define LVN_INSERTITEM          (LVN_FIRST-2)
+#define LVN_DELETEITEM          (LVN_FIRST-3)
+#define LVN_DELETEALLITEMS      (LVN_FIRST-4)
+#define LVN_BEGINLABELEDIT32A   (LVN_FIRST-5)
+#define LVN_BEGINLABELEDIT32W   (LVN_FIRST-75)
+#define LVN_BEGINLABELEDIT WINELIB_NAME_AW(LVN_BEGINLABELEDIT)
+#define LVN_ENDLABELEDIT32A     (LVN_FIRST-6)
+#define LVN_ENDLABELEDIT32W     (LVN_FIRST-76)
+#define LVN_ENDLABELEDIT WINELIB_NAME_AW(LVN_ENDLABELEDIT)
+#define LVN_COLUMNCLICK         (LVN_FIRST-8)
+#define LVN_BEGINDRAG           (LVN_FIRST-9)
+#define LVN_BEGINRDRAG          (LVN_FIRST-11)
+#define LVN_ODCACHEHINT         (LVN_FIRST-13)
+#define LVN_ODFINDITEM32A       (LVN_FIRST-52)
+#define LVN_ODFINDITEM32W       (LVN_FIRST-79)
+#define LVN_ODFINDITEM WINELIB_NAME_AW(LVN_ODFINDITEM)
+#define LVN_ITEMACTIVATE        (LVN_FIRST-14)
+#define LVN_ODSTATECHANGED      (LVN_FIRST-15)
+#define LVN_HOTTRACK            (LVN_FIRST-21)
+#define LVN_GETDISPINFO32A      (LVN_FIRST-50)
+#define LVN_GETDISPINFO32W      (LVN_FIRST-77)
+#define LVN_GETDISPINFO WINELIB_NAME_AW(LVN_GETDISPINFO)
+#define LVN_SETDISPINFO32A      (LVN_FIRST-51)
+#define LVN_SETDISPINFO32W      (LVN_FIRST-78)
+#define LVN_SETDISPINFO WINELIB_NAME_AW(LVN_SETDISPINFO)
+
+
+typedef struct tagLVITEMA
+{
+    UINT32 mask;
+    INT32  iItem;
+    INT32  iSubItem;
+    UINT32 state;
+    UINT32 stateMask;
+    LPSTR  pszText;
+    INT32  cchTextMax;
+    INT32  iImage;
+    LPARAM lParam;
+    INT32  iIndent;	/* (_WIN32_IE >= 0x0300) */
+} LVITEM32A, *LPLVITEM32A;
+
+typedef struct tagLVITEMW
+{
+    UINT32 mask;
+    INT32  iItem;
+    INT32  iSubItem;
+    UINT32 state;
+    UINT32 stateMask;
+    LPWSTR pszText;
+    INT32  cchTextMax;
+    INT32  iImage;
+    LPARAM lParam;
+    INT32  iIndent;	/* (_WIN32_IE >= 0x0300) */
+} LVITEM32W, *LPLVITEM32W;
+
+#define LVITEM32   WINELIB_NAME_AW(LVITEM)
+#define LPLVITEM32 WINELIB_NAME_AW(LPLVITEM)
+
+#define LVITEM_V1_SIZE32A CCSIZEOF_STRUCT(LVITEM32A, lParam)
+#define LVITEM_V1_SIZE32W CCSIZEOF_STRUCT(LVITEM32W, lParam)
+#define LVITEM_V1_SIZE WINELIB_NAME_AW(LVITEM_V1_SIZE)
+
+#define LV_ITEM LVITEM
+
+/* Tab Control */
+
+#define WC_TABCONTROL16		 "SysTabControl"
+#define WC_TABCONTROL32A	 "SysTabControl32"
+#define WC_TABCONTROL32W	L"SysTabControl32"
+
+#define WC_TABCONTROL		WINELIB_NAME_AW(WC_TABCONTROL)
+
+#define TCM_FIRST		0x1300
+
+#define	TCM_INSERTITEM		(TCM_FIRST + 7)
+#define TCM_GETCURSEL		(TCM_FIRST + 11)
+
+#define TCIF_TEXT		0x0001
+#define TCIF_IMAGE		0x0002
+#define TCIF_RTLREADING		0x0004
+#define TCIF_PARAM		0x0008
+
+typedef struct tagTCITEM {
+    UINT32 mask;
+    UINT32 lpReserved1;
+    UINT32 lpReserved2;
+    LPSTR  pszText;
+    int    cchTextMax;
+    int    iImage;
+    LPARAM lParam;
+} TCITEM, *LPTCITEM;
+
+#define TCN_FIRST               (0U-550U)
+#define TCN_LAST                (0U-580U)
+#define TCN_KEYDOWN             (TCN_FIRST - 0)
+#define TCN_SELCHANGE		(TCN_FIRST - 1)
+#define TCN_SELCHANGING         (TCN_FIRST - 2)
+
+typedef struct tagLVCOLUMNA
+{
+    UINT32 mask;
+    INT32  fmt;
+    INT32  cx;
+    LPSTR  pszText;
+    INT32  cchTextMax;
+    INT32  iSubItem;
+    INT32  iImage;  /* (_WIN32_IE >= 0x0300) */
+    INT32  iOrder;  /* (_WIN32_IE >= 0x0300) */
+} LVCOLUMN32A, *LPLVCOLUMN32A;
+
+typedef struct tagLVCOLUMNW
+{
+    UINT32 mask;
+    INT32  fmt;
+    INT32  cx;
+    LPWSTR pszText;
+    INT32  cchTextMax;
+    INT32  iSubItem;
+    INT32  iImage;	/* (_WIN32_IE >= 0x0300) */
+    INT32  iOrder;	/* (_WIN32_IE >= 0x0300) */
+} LVCOLUMN32W, *LPLVCOLUMN32W;
+
+#define LVCOLUMN   WINELIB_NAME_AW(LVCOLUMN)
+#define LPLVCOLUMN WINELIB_NAME_AW(LPLVCOLUMN)
+
+#define LVCOLUMN_V1_SIZE32A CCSIZEOF_STRUCT(LVCOLUMN32A, iSubItem)
+#define LVCOLUMN_V1_SIZE32W CCSIZEOF_STRUCT(LVCOLUMN32W, iSubItem)
+#define LVCOLUMN_V1_SIZE WINELIB_NAME_AW(LVCOLUMN_V1_SIZE)
+
+#define LV_COLUMN       LVCOLUMN
+
 
 typedef struct tagNMLISTVIEW
-{   NMHDR   hdr;
-    int     iItem;
-    int     iSubItem;
+{
+    NMHDR   hdr;
+    INT32   iItem;
+    INT32   iSubItem;
     UINT32  uNewState;
     UINT32  uOldState;
     UINT32  uChanged;
     POINT32 ptAction;
     LPARAM  lParam;
-} NMLISTVIEW,*LPNMLISTVIEW;
+} NMLISTVIEW, *LPNMLISTVIEW;
+
+#define LPNM_LISTVIEW   LPNMLISTVIEW
+#define NM_LISTVIEW     NMLISTVIEW
 
 
-#define LV_DISPINFOA    NMLVDISPINFOA
-#define LV_DISPINFOW    NMLVDISPINFOW
+typedef struct tagLVDISPINFO
+{
+    NMHDR     hdr;
+    LVITEM32A item;
+} NMLVDISPINFO32A, *LPNMLVDISPINFO32A;
+
+typedef struct tagLVDISPINFOW
+{
+    NMHDR     hdr;
+    LVITEM32W item;
+} NMLVDISPINFO32W, *LPNMLVDISPINFO32W;
+
+#define NMLVDISPINFO   WINELIB_NAME_AW(NMLVDISPINFO)
+#define LPNMLVDISPINFO WINELIB_NAME_AW(LPNMLVDISPINFO)
 
 #define LV_DISPINFO     NMLVDISPINFO
 
-typedef struct tagLVDISPINFO {
-    NMHDR hdr;
-    LVITEMA item;
-} NMLVDISPINFOA, *LPNMLVDISPINFOA;
 
-typedef struct tagLVDISPINFOW {
-    NMHDR hdr;
-    LVITEMW item;
-} NMLVDISPINFOW, * LPNMLVDISPINFOW;
+typedef INT32 (CALLBACK *PFNLVCOMPARE)(LPARAM, LPARAM, LPARAM);
 
-#define  NMLVDISPINFO           NMLVDISPINFOA
+#define ListView_SetBkColor(hwnd,clrBk) \
+    (BOOL32)SendMessage32A((hwnd),LVM_SETBKCOLOR,0,(LPARAM)(COLORREF)(clrBk))
+#define ListView_GetImageList(hwnd,iImageList) \
+    (HIMAGELIST)SendMessage32A((hwnd),LVM_GETIMAGELIST,(WPARAM)(INT32)(iImageList),0L)
+#define ListView_SetImageList(hwnd,himl,iImageList) \
+    (HIMAGELIST)(UINT32)SendMessage32A((hwnd),LVM_SETIMAGELIST,(WPARAM32)(iImageList),(LPARAM)(UINT32)(HIMAGELIST)(himl))
+#define ListView_GetItemCount(hwnd) \
+    (INT32)SendMessage32A((hwnd),LVM_GETITEMCOUNT,0,0L)
+#define ListView_GetItem32A(hwnd,pitem) \
+    (BOOL32)SendMessage32A((hwnd),LVM_GETITEM32A,0,(LPARAM)(LVITEM32A *)(pitem))
+#define ListView_GetItem32W(hwnd,pitem) \
+    (BOOL32)SendMessage32W((hwnd),LVM_GETITEM32W,0,(LPARAM)(LVITEM32W *)(pitem))
+#define ListView_GetItem WINELIB_NAME_AW(ListView_GetItem)
+#define ListView_InsertItem32A(hwnd,pitem) \
+    (INT32)SendMessage32A((hwnd),LVM_INSERTITEM32A,0,(LPARAM)(const LVITEM32A *)(pitem))
+#define ListView_InsertItem32W(hwnd,pitem) \
+    (INT32)SendMessage32W((hwnd),LVM_INSERTITEM32W,0,(LPARAM)(const LVITEM32W *)(pitem))
+#define ListView_InsertItem WINELIB_NAME_AW(ListView_InsertItem)
+#define ListView_DeleteAllItems(hwnd) \
+    (BOOL32)SendMessage32A((hwnd),LVM_DELETEALLITEMS,0,0L)
+#define ListView_InsertColumn32A(hwnd,iCol,pcol) \
+    (INT32)SendMessage32A((hwnd),LVM_INSERTCOLUMN32A,(WPARAM32)(INT32)(iCol),(LPARAM)(const LVCOLUMN32A *)(pcol))
+#define ListView_InsertColumn32W(hwnd,iCol,pcol) \
+    (INT32)SendMessage32W((hwnd),LVM_INSERTCOLUMN32W,(WPARAM32)(INT32)(iCol),(LPARAM)(const LVCOLUMN32W *)(pcol))
+#define ListView_InsertColumn WINELIB_NAME_AW(ListView_InsertColumn)
+#define ListView_SortItems(hwndLV,_pfnCompare,_lPrm) \
+    (BOOL32)SendMessage32A((hwndLV),LVM_SORTITEMS,(WPARAM32)(LPARAM)_lPrm,(LPARAM)(PFNLVCOMPARE)_pfnCompare)
+#define ListView_SetItemPosition(hwndLV, i, x, y) \
+    (BOOL32)SendMessage32A((hwndLV),LVM_SETITEMPOSITION,(WPARAM32)(INT32)(i),MAKELPARAM((x),(y)))
+#define ListView_GetSelectedCount(hwndLV) \
+    (UINT32)SendMessage32A((hwndLV),LVM_GETSELECTEDCOUNT,0,0L)
+
+
+/* ComboBoxEx control */
+
+#define WC_COMBOBOXEX32A        "ComboBoxEx32"
+#define WC_COMBOBOXEX32W        L"ComboBoxEx32"
+#define WC_COMBOBOXEX           WINELIB_NAME_AW(WC_COMBOBOXEX)
+
+#define CBEM_INSERTITEM32A      (WM_USER+1)
+#define CBEM_INSERTITEM32W      (WM_USER+11)
+#define CBEM_INSERTITEM         WINELIB_NAME_AW(CBEM_INSERTITEM)
+#define CBEM_SETIMAGELIST       (WM_USER+2)
+#define CBEM_GETIMAGELIST       (WM_USER+3)
+#define CBEM_GETITEM32A         (WM_USER+4)
+#define CBEM_GETITEM32W         (WM_USER+13)
+#define CBEM_GETITEM            WINELIB_NAME_AW(CBEM_GETITEM)
+#define CBEM_SETITEM32A         (WM_USER+5)
+#define CBEM_SETITEM32W         (WM_USER+12)
+#define CBEM_SETITEM            WINELIB_NAME_AW(CBEM_SETITEM)
+#define CBEM_GETCOMBOCONTROL    (WM_USER+6)
+#define CBEM_GETEDITCONTROL     (WM_USER+7)
+#define CBEM_SETEXSTYLE         (WM_USER+8)
+#define CBEM_GETEXSTYLE         (WM_USER+9)
+#define CBEM_GETEXTENDEDSTYLE   (WM_USER+9)
+#define CBEM_SETEXTENDEDSTYLE   (WM_USER+14)
+#define CBEM_HASEDITCHANGED     (WM_USER+10)
+#define CBEM_SETUNICODEFORMAT   CCM_SETUNICODEFORMAT
+#define CBEM_GETUNICODEFORMAT   CCM_GETUNICODEFORMAT
+
+#define CBEN_FIRST              (0U-800U)
+#define CBEN_LAST               (0U-830U)
+
+
+/* Hotkey control */
+
+#define HOTKEY_CLASS16          "msctls_hotkey"
+#define HOTKEY_CLASS32A         "msctls_hotkey32"
+#define HOTKEY_CLASS32W         L"msctls_hotkey32"
+#define HOTKEY_CLASS            WINELIB_NAME_AW(HOTKEY_CLASS)
+
+#define HOTKEYF_SHIFT           0x01
+#define HOTKEYF_CONTROL         0x02
+#define HOTKEYF_ALT             0x04
+#define HOTKEYF_EXT             0x08
+
+#define HKCOMB_NONE             0x0001
+#define HKCOMB_S                0x0002
+#define HKCOMB_C                0x0004
+#define HKCOMB_A                0x0008
+#define HKCOMB_SC               0x0010
+#define HKCOMB_SA               0x0020
+#define HKCOMB_CA               0x0040
+#define HKCOMB_SCA              0x0080
+
+#define HKM_SETHOTKEY           (WM_USER+1)
+#define HKM_GETHOTKEY           (WM_USER+2)
+#define HKM_SETRULES            (WM_USER+3)
+
+
+/* animate control */
+
+#define ANIMATE_CLASS32A        "SysAnimate32"
+#define ANIMATE_CLASS32W        L"SysAnimate32"
+#define ANIMATE_CLASS           WINELIB_NAME_AW(ANIMATE_CLASS)
+
+#define ACS_CENTER              0x0001
+#define ACS_TRANSPARENT         0x0002
+#define ACS_AUTOPLAY            0x0004
+#define ACS_TIMER               0x0008  /* no threads, just timers */
+
+#define ACM_OPEN32A             (WM_USER+100)
+#define ACM_OPEN32W             (WM_USER+103)
+#define ACM_OPEN                WINELIB_NAME_AW(ACM_OPEN)
+#define ACM_PLAY                (WM_USER+101)
+#define ACM_STOP                (WM_USER+102)
+
+#define ACN_START               1
+#define ACN_STOP                2
+
+#ifndef __WINE__
+#define Animate_Create(hwndP,id,dwStyle,hInstance) \
+    CreateWindow(ANIMATE_CLASS,NULL,dwStyle,0,0,0,0,hwndP,(HMENU32)(id),hInstance,NULL)
+#define Animate_Open(hwnd,szName) \
+    (BOOL32)SNDMSG(hwnd,ACM_OPEN,0,(LPARAM)(LPTSTR)(szName))
+#define Animate_OpenEx(hwnd,hInst,szName) \
+    (BOOL32)SNDMSG(hwnd,ACM_OPEN,(WPARAM32)hInst,(LPARAM)(LPTSTR)(szName))
+#define Animate_Play(hwnd,from,to,rep) \
+    (BOOL32)SNDMSG(hwnd,ACM_PLAY,(WPARAM32)(UINT32)(rep),(LPARAM)MAKELONG(from,to))
+#define Animate_Stop(hwnd) \
+    (BOOL32)SNDMSG(hwnd,ACM_STOP,0,0)
+#define Animate_Close(hwnd) \
+    Animate_Open(hwnd,NULL)
+#define Animate_Seek(hwnd,frame) \
+    Animate_Play(hwnd,frame,frame,1)
+#endif  /* __WINE__ */
+
+
+
+/**************************************************************************
+ *  UNDOCUMENTED functions
+ */
+
+/* local heap memory functions */
+
+LPVOID WINAPI COMCTL32_Alloc (DWORD dwSize);
+LPVOID WINAPI COMCTL32_ReAlloc (LPVOID lpSrc, DWORD dwSize);
+BOOL32 WINAPI COMCTL32_Free (LPVOID lpMem);
+DWORD  WINAPI COMCTL32_GetSize (LPVOID lpMem);
+
+
+/* Dynamic Storage Array */
+
+typedef struct _DSA
+{
+    INT32  nItemCount;
+    LPVOID pData;
+    INT32  nMaxCount;
+    INT32  nItemSize;
+    INT32  nGrow;
+} DSA, *HDSA;
+
+HDSA   WINAPI DSA_Create (INT32 nSize, INT32 nGrow);
+BOOL32 WINAPI DSA_DeleteAllItems (const HDSA hdsa);
+INT32  WINAPI DSA_DeleteItem (const HDSA hdsa, INT32 nIndex);
+BOOL32 WINAPI DSA_Destroy (const HDSA hdsa);
+BOOL32 WINAPI DSA_GetItem (const HDSA hdsa, INT32 nIndex, LPVOID pDest);
+LPVOID WINAPI DSA_GetItemPtr (const HDSA hdsa, INT32 nIndex);
+INT32  WINAPI DSA_InsertItem (const HDSA hdsa, INT32 nIndex, LPVOID pSrc);
+BOOL32 WINAPI DSA_SetItem (const HDSA hdsa, INT32 nIndex, LPVOID pSrc);
+
+
+/* Dynamic Pointer Array */
+
+typedef struct _DPA
+{
+    INT32    nItemCount;
+    LPVOID   *ptrs; 
+    HANDLE32 hHeap;
+    INT32    nGrow;
+    INT32    nMaxCount;
+} DPA, *HDPA;
+
+HDPA   WINAPI DPA_Create (INT32 nGrow);
+HDPA   WINAPI DPA_CreateEx (INT32 nGrow, HANDLE32 hHeap);
+BOOL32 WINAPI DPA_Destroy (const HDPA hdpa);
+HDPA   WINAPI DPA_Clone (const HDPA hdpa, const HDPA hdpaNew);
+LPVOID WINAPI DPA_GetPtr (const HDPA hdpa, INT32 i);
+INT32  WINAPI DPA_GetPtrIndex (const HDPA hdpa, LPVOID p);
+BOOL32 WINAPI DPA_Grow (const HDPA pdpa, INT32 cp);
+BOOL32 WINAPI DPA_SetPtr (const HDPA hdpa, INT32 i, LPVOID p);
+INT32  WINAPI DPA_InsertPtr (const HDPA hdpa, INT32 i, LPVOID p);
+LPVOID WINAPI DPA_DeletePtr (const HDPA hdpa, INT32 i);
+BOOL32 WINAPI DPA_DeleteAllPtrs (const HDPA hdpa);
+
+typedef INT32 (CALLBACK *PFNDPACOMPARE)(LPVOID p1, LPVOID p2, LPARAM lParam);
+BOOL32 WINAPI DPA_Sort (const HDPA hdpa, PFNDPACOMPARE pfnCompare, LPARAM lParam);
+
+#define DPAS_SORTED             0x0001
+#define DPAS_INSERTBEFORE       0x0002
+#define DPAS_INSERTAFTER        0x0004
+ 
+INT32 WINAPI DPA_Search (const HDPA hdpa, LPVOID pFind, INT32 nStart,
+			 PFNDPACOMPARE pfnCompare,
+			 LPARAM lParam, UINT32 uOptions);
+
+#define DPA_GetPtrCount(hdpa)  (*(INT32*)(hdpa))
+#define DPA_GetPtrPtr(hdpa)    (*((LPVOID**)((BYTE*)(hdpa)+sizeof(INT32))))
+#define DPA_FastGetPtr(hdpa,i) (DPA_GetPtrPtr(hdpa)[i])
 
 
 #endif  /* __WINE_COMMCTRL_H */
diff --git a/include/debug.h b/include/debug.h
index 962d826..971d472 100644
--- a/include/debug.h
+++ b/include/debug.h
@@ -13,133 +13,137 @@
 #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_animate 8
+#define dbch_aspi 9
+#define dbch_atom 10
+#define dbch_bitblt 11
+#define dbch_bitmap 12
+#define dbch_caret 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_msvideo 76
-#define dbch_nonclient 77
-#define dbch_ntdll 78
-#define dbch_ole 79
-#define dbch_pager 80
-#define dbch_palette 81
-#define dbch_pidl 82
-#define dbch_print 83
-#define dbch_process 84
-#define dbch_profile 85
-#define dbch_progress 86
-#define dbch_prop 87
-#define dbch_psdrv 88
-#define dbch_rebar 89
-#define dbch_reg 90
-#define dbch_region 91
-#define dbch_relay 92
-#define dbch_resource 93
-#define dbch_s 94
-#define dbch_scroll 95
-#define dbch_security 96
-#define dbch_segment 97
-#define dbch_selector 98
-#define dbch_sem 99
-#define dbch_sendmsg 100
-#define dbch_shell 101
-#define dbch_shm 102
-#define dbch_snoop 103
-#define dbch_sound 104
-#define dbch_static 105
-#define dbch_statusbar 106
-#define dbch_stress 107
-#define dbch_string 108
-#define dbch_syscolor 109
-#define dbch_system 110
-#define dbch_task 111
-#define dbch_text 112
-#define dbch_thread 113
-#define dbch_thunk 114
-#define dbch_timer 115
-#define dbch_toolbar 116
-#define dbch_toolhelp 117
-#define dbch_tooltips 118
-#define dbch_trackbar 119
-#define dbch_treeview 120
-#define dbch_tweak 121
-#define dbch_uitools 122
-#define dbch_updown 123
-#define dbch_ver 124
-#define dbch_virtual 125
-#define dbch_vxd 126
-#define dbch_win 127
-#define dbch_win16drv 128
-#define dbch_win32 129
-#define dbch_wing 130
-#define dbch_winsock 131
-#define dbch_wnet 132
-#define dbch_x11 133
-#define dbch_x11drv 134
+#define dbch_comboex 19
+#define dbch_comm 20
+#define dbch_commctrl 21
+#define dbch_commdlg 22
+#define dbch_console 23
+#define dbch_crtdll 24
+#define dbch_cursor 25
+#define dbch_dc 26
+#define dbch_dde 27
+#define dbch_ddeml 28
+#define dbch_ddraw 29
+#define dbch_debug 30
+#define dbch_dialog 31
+#define dbch_dinput 32
+#define dbch_dll 33
+#define dbch_dosfs 34
+#define dbch_dosmem 35
+#define dbch_dplay 36
+#define dbch_driver 37
+#define dbch_dsound 38
+#define dbch_edit 39
+#define dbch_event 40
+#define dbch_exec 41
+#define dbch_file 42
+#define dbch_fixup 43
+#define dbch_font 44
+#define dbch_gdi 45
+#define dbch_global 46
+#define dbch_graphics 47
+#define dbch_header 48
+#define dbch_heap 49
+#define dbch_hook 50
+#define dbch_hotkey 51
+#define dbch_icon 52
+#define dbch_imagelist 53
+#define dbch_int 54
+#define dbch_int10 55
+#define dbch_int21 56
+#define dbch_int31 57
+#define dbch_key 58
+#define dbch_keyboard 59
+#define dbch_ldt 60
+#define dbch_listbox 61
+#define dbch_listview 62
+#define dbch_local 63
+#define dbch_mci 64
+#define dbch_mcianim 65
+#define dbch_mciwave 66
+#define dbch_mdi 67
+#define dbch_menu 68
+#define dbch_message 69
+#define dbch_metafile 70
+#define dbch_midi 71
+#define dbch_mmaux 72
+#define dbch_mmio 73
+#define dbch_mmsys 74
+#define dbch_mmtime 75
+#define dbch_module 76
+#define dbch_mpr 77
+#define dbch_msg 78
+#define dbch_msvideo 79
+#define dbch_nonclient 80
+#define dbch_ntdll 81
+#define dbch_ole 82
+#define dbch_pager 83
+#define dbch_palette 84
+#define dbch_pidl 85
+#define dbch_print 86
+#define dbch_process 87
+#define dbch_profile 88
+#define dbch_progress 89
+#define dbch_prop 90
+#define dbch_psdrv 91
+#define dbch_rebar 92
+#define dbch_reg 93
+#define dbch_region 94
+#define dbch_relay 95
+#define dbch_resource 96
+#define dbch_s 97
+#define dbch_scroll 98
+#define dbch_security 99
+#define dbch_segment 100
+#define dbch_selector 101
+#define dbch_sem 102
+#define dbch_sendmsg 103
+#define dbch_shell 104
+#define dbch_shm 105
+#define dbch_snoop 106
+#define dbch_sound 107
+#define dbch_static 108
+#define dbch_statusbar 109
+#define dbch_stress 110
+#define dbch_string 111
+#define dbch_syscolor 112
+#define dbch_system 113
+#define dbch_tab 114
+#define dbch_task 115
+#define dbch_text 116
+#define dbch_thread 117
+#define dbch_thunk 118
+#define dbch_timer 119
+#define dbch_toolbar 120
+#define dbch_toolhelp 121
+#define dbch_tooltips 122
+#define dbch_trackbar 123
+#define dbch_treeview 124
+#define dbch_tweak 125
+#define dbch_uitools 126
+#define dbch_updown 127
+#define dbch_ver 128
+#define dbch_virtual 129
+#define dbch_vxd 130
+#define dbch_win 131
+#define dbch_win16drv 132
+#define dbch_win32 133
+#define dbch_wing 134
+#define dbch_winsock 135
+#define dbch_wnet 136
+#define dbch_x11 137
+#define dbch_x11drv 138
 /* Definitions for classes identifiers */
 #define dbcl_fixme 0
 #define dbcl_err 1
diff --git a/include/debugdefs.h b/include/debugdefs.h
index 60ceded..7ff6fd7 100644
--- a/include/debugdefs.h
+++ b/include/debugdefs.h
@@ -4,7 +4,7 @@
 #include "debugtools.h"
 #endif
 
-#define DEBUG_CHANNEL_COUNT 135
+#define DEBUG_CHANNEL_COUNT 139
 #ifdef DEBUG_RUNTIME
 short debug_msg_enabled[][DEBUG_CLASS_COUNT] = {
 {1, 1, 0, 0},
@@ -142,6 +142,10 @@
 {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",
@@ -152,17 +156,18 @@
 "6",
 "accel",
 "advapi",
+"animate",
 "aspi",
 "atom",
 "bitblt",
 "bitmap",
 "caret",
-"cd",
 "cdaudio",
 "class",
 "clipboard",
 "clipping",
 "combo",
+"comboex",
 "comm",
 "commctrl",
 "commdlg",
@@ -194,9 +199,11 @@
 "header",
 "heap",
 "hook",
+"hotkey",
 "icon",
 "imagelist",
 "int",
+"int10",
 "int21",
 "int31",
 "key",
@@ -255,6 +262,7 @@
 "string",
 "syscolor",
 "system",
+"tab",
 "task",
 "text",
 "thread",
diff --git a/include/dosexe.h b/include/dosexe.h
index ad3a892..3eb82f5 100644
--- a/include/dosexe.h
+++ b/include/dosexe.h
@@ -28,6 +28,7 @@
 #define MZ_SUPPORTED
 
 extern int MZ_InitTask( LPDOSTASK lpDosTask );
+extern int MZ_InitMemory( LPDOSTASK lpDosTask, NE_MODULE *pModule );
 extern int MZ_RunModule( LPDOSTASK lpDosTask );
 extern void MZ_KillModule( LPDOSTASK lpDosTask );
 extern int DOSVM_Process( LPDOSTASK lpDosTask );
diff --git a/include/file.h b/include/file.h
index fc5f806..eb54708 100644
--- a/include/file.h
+++ b/include/file.h
@@ -21,6 +21,7 @@
     int       mode;
     char     *unix_name;
     DWORD     type;         /* Type for win32 apps */
+    DWORD     pos;	    /* workaround to emulate weird DOS error handling */
 } FILE_OBJECT;
 
 /* Definition of a full DOS file name */
@@ -41,14 +42,17 @@
 } DOS_DEVICE;
 
 /* Macros to convert 16 bit to 32 bit file handles and back */
+/* LZW handles are exempt as if not, could go below 0x400 */
 #define HFILE16_TO_HFILE32(handle) \
 (((handle)==0) ? GetStdHandle(STD_INPUT_HANDLE) : \
  ((handle)==1) ? GetStdHandle(STD_OUTPUT_HANDLE) : \
  ((handle)==2) ? GetStdHandle(STD_ERROR_HANDLE) : \
+ ((handle)>=0x400) ? handle : \
  (handle)-5)
 
 #define HFILE32_TO_HFILE16(handle) ({ HFILE32 hnd=handle; \
       ((hnd==HFILE_ERROR32) ? HFILE_ERROR16 : \
+      ((hnd)>=0x400) ? hnd : \
        (HFILE16)hnd+5); })
 
 
diff --git a/include/gdi.h b/include/gdi.h
index c8ca418..073ffec 100644
--- a/include/gdi.h
+++ b/include/gdi.h
@@ -112,8 +112,6 @@
     WORD          backgroundMode;
     COLORREF      backgroundColor;
     COLORREF      textColor;
-    int           backgroundPixel;
-    int           textPixel;
     short         brushOrgX;
     short         brushOrgY;
 
diff --git a/include/hotkey.h b/include/hotkey.h
new file mode 100644
index 0000000..f583a2e
--- /dev/null
+++ b/include/hotkey.h
@@ -0,0 +1,22 @@
+/*
+ * Hotkey class extra info
+ *
+ * Copyright 1998 Eric Kohl
+ */
+
+#ifndef __WINE_HOTKEY_H
+#define __WINE_HOTKEY_H
+
+
+typedef struct tagHOTKEY_INFO
+{
+    HFONT32 hFont;
+    BOOL32  bFocus;
+    INT32   nHeight;
+
+} HOTKEY_INFO;
+
+
+extern void HOTKEY_Register (void);
+
+#endif  /* __WINE_HOTKEY_H */
diff --git a/include/imm.h b/include/imm.h
new file mode 100644
index 0000000..5b40a6b
--- /dev/null
+++ b/include/imm.h
@@ -0,0 +1,24 @@
+/*
+ *	imm.h	-	Declarations for IMM32
+ */
+
+#ifndef __WINE_IMM_H
+#define __WINE_IMM_H
+
+typedef DWORD HIMC32;
+typedef DWORD HIMCC32;
+
+typedef HKL32 *LPHKL32;
+
+typedef int (CALLBACK *REGISTERWORDENUMPROCA)(LPCSTR, DWORD, LPCSTR, LPVOID);
+typedef int (CALLBACK *REGISTERWORDENUMPROCW)(LPCWSTR, DWORD, LPCWSTR, LPVOID);
+
+typedef void *LPCANDIDATELIST;
+typedef void *LPCANDIDATEFORM;
+
+typedef void *LPSTYLEBUFA;
+typedef void *LPSTYLEBUFW;
+
+typedef void *LPCOMPOSITIONFORM;
+
+#endif  /* __WINE_IMM_H */
diff --git a/include/listview.h b/include/listview.h
index 7e8c920e..10795e7 100644
--- a/include/listview.h
+++ b/include/listview.h
@@ -8,10 +8,31 @@
 #define __WINE_LISTVIEW_H
 
 
+typedef struct tagLISTVIEW_ITEM
+{
+    UINT32 state;
+    LPSTR  pszText;
+    INT32  iImage;
+    LPARAM lParam;
+    INT32  iIndent;
+
+    HDSA   hdsaItem;
+} LISTVIEW_ITEM;
+
+
 typedef struct tagLISTVIEW_INFO
 {
     COLORREF   clrBk;
+    HIMAGELIST himlNormal;
+    HIMAGELIST himlSmall;
+    HIMAGELIST himlState;
+    INT32      nItemCount;
+    HWND32     hwndHeader;
+    HFONT32    hDefaultFont;
+    HFONT32    hFont;
+    RECT32     rcList;       /* "client" area of the list (without header) */
 
+    HDSA       hdsaItems;
 
 } LISTVIEW_INFO;
 
diff --git a/include/metafiledrv.h b/include/metafiledrv.h
index b82ac98..b55b410 100644
--- a/include/metafiledrv.h
+++ b/include/metafiledrv.h
@@ -68,6 +68,8 @@
 extern BOOL32 MFDRV_PolyPolygon( struct tagDC *dc, LPPOINT32 pt, LPINT32 counts,
 				 UINT32 polygons);
 extern HGDIOBJ32 MFDRV_SelectObject( DC *dc, HGDIOBJ32 handle );
+extern COLORREF MFDRV_SetBkColor( DC *dc, COLORREF color );
+extern COLORREF MFDRV_SetTextColor( DC *dc, COLORREF color );
 extern BOOL32 MFDRV_ExtFloodFill( struct tagDC *dc, INT32 x, INT32 y,
 				  COLORREF color, UINT32 fillType );
 extern BOOL32 MFDRV_ExtTextOut( struct tagDC *dc, INT32 x, INT32 y,
diff --git a/include/miscemu.h b/include/miscemu.h
index 6855762..9c2b26a 100644
--- a/include/miscemu.h
+++ b/include/miscemu.h
@@ -14,6 +14,9 @@
 extern HANDLE16 DOSMEM_BiosSeg;
 extern DWORD DOSMEM_CollateTable;
 
+extern DWORD DOSMEM_ErrorCall;
+extern DWORD DOSMEM_ErrorBuffer;
+
 extern BOOL32 DOSMEM_Init(HMODULE16 hModule);
 extern void   DOSMEM_Tick(void);
 extern WORD   DOSMEM_AllocSelector(WORD);
@@ -29,6 +32,7 @@
 /* msdos/interrupts.c */
 extern FARPROC16 INT_GetHandler( BYTE intnum );
 extern void INT_SetHandler( BYTE intnum, FARPROC16 handler );
+extern int INT_RealModeInterrupt( BYTE intnum, PCONTEXT context );
 
 /* msdos/ioports.c */
 extern void IO_port_init (void);
@@ -39,6 +43,9 @@
 extern DWORD INT1A_GetTicksSinceMidnight(void);
 extern void WINAPI INT_Int1aHandler(CONTEXT*);
 
+/* msdos/int20.c */
+extern void WINAPI INT_Int20Handler(CONTEXT*);
+
 /* msdos/int2f.c */
 extern void WINAPI INT_Int2fHandler(CONTEXT*);
 
diff --git a/include/mmsystem.h b/include/mmsystem.h
index a0d46c8..1e10215 100644
--- a/include/mmsystem.h
+++ b/include/mmsystem.h
@@ -191,6 +191,7 @@
 #define SND_ALIAS_ID	0x00110000L /* alias is a predefined ID */
 #define SND_FILENAME    0x00020000L /* name is file name */
 #define SND_RESOURCE    0x00040004L /* name is resource name or atom */
+#define SND_PURGE	0x00000040L /* purge all sounds */
 
 /* waveform audio error return values */
 #define WAVERR_BADFORMAT      (WAVERR_BASE + 0)    /* unsupported wave format */
diff --git a/include/msdos.h b/include/msdos.h
index f154dab..dccb072 100644
--- a/include/msdos.h
+++ b/include/msdos.h
@@ -193,7 +193,7 @@
 #define EL_Memory            0x05
 
 void WINAPI DOS3Call( CONTEXT *context );
-void do_mscdex( CONTEXT *context, int dorealmode );
+void do_mscdex( CONTEXT *context );
 void do_mscdex_dd (CONTEXT * context, int dorealmode);
 
 #endif /* __WINE_MSDOS_H */
diff --git a/include/oledlg.h b/include/oledlg.h
new file mode 100644
index 0000000..1b937fc
--- /dev/null
+++ b/include/oledlg.h
@@ -0,0 +1,45 @@
+/*
+ *	oledlg.h	-	Declarations for OLEDLG
+ */
+
+#ifndef __WINE_OLEDLG_H
+#define __WINE_OLEDLG_H
+
+#define OLEUI_FALSE   0
+#define OLEUI_SUCCESS 1 /* Same as OLEUI_OK */
+#define OLEUI_OK      1 /* OK button pressed */ 
+#define OLEUI_CANCEL  2 /* Cancel button pressed */
+
+typedef void *LPOLEUIINSERTOBJECTA; /* FIXME: stub */
+typedef void *LPOLEUIINSERTOBJECTW; /* FIXME: stub */
+
+typedef void *LPOLEUIPASTESPECIALA;  /* FIXME: stub */
+typedef void *LPOLEUIPASTESPECIALW;  /* FIXME: stub */
+
+typedef void *LPOLEUIEDITLINKSA;  /* FIXME: stub */
+typedef void *LPOLEUIEDITLINKSW;  /* FIXME: stub */
+
+typedef void *LPOLEUICHANGEICONA; /* FIXME: stub */
+typedef void *LPOLEUICHANGEICONW; /* FIXME: stub */
+
+typedef void *LPOLEUICONVERTA; /* FIXME: stub */
+typedef void *LPOLEUICONVERTW; /* FIXME: stub */
+
+typedef void *LPOLEUIBUSYA; /* FIXME: stub */
+typedef void *LPOLEUIBUSYW; /* FIXME: stub */
+
+typedef void *LPOLEUILINKCONTAINERA; /* FIXME: stub */
+typedef void *LPOLEUILINKCONTAINERW; /* FIXME: stub */
+
+typedef void *LPOLEUIOBJECTPROPSA; /* FIXME: stub */
+typedef void *LPOLEUIOBJECTPROPSW; /* FIXME: stub */
+
+typedef void *LPOLEUICHANGESOURCEA; /* FIXME: stub */
+typedef void *LPOLEUICHANGESOURCEW; /* FIXME: stub */
+
+#endif  /* __WINE_OLEDLG_H */
+
+
+
+
+
diff --git a/include/pager.h b/include/pager.h
index 0808084..7342147 100644
--- a/include/pager.h
+++ b/include/pager.h
@@ -12,11 +12,13 @@
 {
     HWND32   hwndChild;
     COLORREF clrBk;
-    INT32    iBorder;
-    INT32    iButtonSize;
-    INT32    iPos;
+    INT32    nBorder;
+    INT32    nButtonSize;
+    INT32    nPos;
     BOOL32   bForward;
 
+    INT32    nChildSize;
+
 } PAGER_INFO;
 
 
diff --git a/include/pe_image.h b/include/pe_image.h
index bba5733..cb1d0dd 100644
--- a/include/pe_image.h
+++ b/include/pe_image.h
@@ -44,11 +44,12 @@
                                      LPCSTR env, LPSTARTUPINFO32A startup,
                                      LPPROCESS_INFORMATION info );
 
-struct _PDB32; /* forward definition */
 struct _THDB; /* forward definition */
 extern void PE_InitializeDLLs(struct _PDB32*,DWORD,LPVOID);
 extern void PE_InitTls(struct _THDB*);
 
 extern LPIMAGE_RESOURCE_DIRECTORY GetResDirEntryW(LPIMAGE_RESOURCE_DIRECTORY,LPCWSTR,DWORD,BOOL32);
 
+typedef DWORD (CALLBACK*DLLENTRYPROC32)(HMODULE32,DWORD,LPVOID);
+
 #endif /* __WINE_PE_IMAGE_H */
diff --git a/include/process.h b/include/process.h
index 539aee1..bce8f7f 100644
--- a/include/process.h
+++ b/include/process.h
@@ -31,6 +31,9 @@
     HANDLE_ENTRY  entries[1];
 } HANDLE_TABLE;
 
+/* Current Process pseudo-handle - Returned by GetCurrentProcess*/
+#define CURRENT_PROCESS_PSEUDOHANDLE ((HANDLE32)0x7fffffff)
+
 /* Win32 process environment database */
 typedef struct
 {
diff --git a/include/psdrv.h b/include/psdrv.h
index 171e085..f3ee787 100644
--- a/include/psdrv.h
+++ b/include/psdrv.h
@@ -6,6 +6,8 @@
  */
 #include "windows.h"
 #include "font.h"
+#include "pen.h"
+#include "brush.h"
 
 typedef struct {
     float	llx, lly, urx, ury;
@@ -30,6 +32,7 @@
     char		*FontName;
     char		*FullName;
     char		*FamilyName;
+    char		*EncodingScheme;
     int			Weight;			/* FW_NORMAL etc. */
     float		ItalicAngle;
     BOOL32		IsFixedPitch;
@@ -124,7 +127,7 @@
     int			LanguageLevel;
     BOOL32		ColorDevice;
     int			DefaultResolution;
-    int			LandscapeOrientation;
+    signed int		LandscapeOrientation;
     char		*JCLBegin;
     char		*JCLToPSInterpreter;
     char		*JCLEnd;
@@ -162,15 +165,50 @@
 } PRINTERINFO;
 
 typedef struct {
+    float		r, g, b;
+} PSRGB;
+
+typedef struct {
+    float		i;
+} PSGRAY;
+
+
+/* def's for PSCOLOR.type */
+#define PSCOLOR_GRAY	0
+#define PSCOLOR_RGB	1
+
+typedef struct {
+    int			type;
+    union {
+        PSRGB  rgb;
+        PSGRAY gray;
+    }                   value;
+} PSCOLOR;
+
+typedef struct {
     AFM			*afm;
     TEXTMETRIC32A	tm;
     INT32		size;
     float		scale;
     INT32		escapement;
+    PSCOLOR		color;
     BOOL32		set;		/* Have we done a setfont yet */
 } PSFONT;
 
 typedef struct {
+    PSCOLOR		color;
+    UINT32		style;
+    BOOL32		set;
+} PSBRUSH;
+
+typedef struct {
+    INT32		width;
+    char		*dash;
+    PSCOLOR		color;
+    BOOL32		set;
+} PSPEN;
+
+typedef struct {
     HANDLE16		hJob;
     LPSTR		output;		/* Output file/port */
     BOOL32              banding;        /* Have we received a NEXTBAND */
@@ -178,15 +216,19 @@
     INT32		PageNo;
 } JOB;
 
-typedef struct
-{
+typedef struct {
     PSFONT		font;		/* Current PS font */
+    PSPEN		pen;
+    PSBRUSH		brush;
+    PSCOLOR		bkColor;
+    PSCOLOR		inkColor;	/* Last colour set */
     JOB			job;
     PSDRV_DEVMODE16	*Devmode;
     PRINTERINFO		*pi;
 } PSDRV_PDEVICE;
 
 extern HANDLE32 PSDRV_Heap;
+extern char *PSDRV_ANSIVector[256];
 
 extern void PSDRV_MergeDevmodes(PSDRV_DEVMODE16 *dm1, PSDRV_DEVMODE16 *dm2,
 			 PRINTERINFO *pi);
@@ -199,7 +241,19 @@
 
 extern BOOL32 PSDRV_Init(void);
 extern HFONT16 PSDRV_FONT_SelectObject( DC *dc, HFONT16 hfont, FONTOBJ *font);
+extern HPEN32 PSDRV_PEN_SelectObject( DC * dc, HPEN32 hpen, PENOBJ * pen );
+extern HBRUSH32 PSDRV_BRUSH_SelectObject( DC * dc, HBRUSH32 hbrush,
+					  BRUSHOBJ * brush );
+
+extern BOOL32 PSDRV_SetBrush(DC *dc);
 extern BOOL32 PSDRV_SetFont( DC *dc );
+extern BOOL32 PSDRV_SetPen( DC *dc );
+
+extern BOOL32 PSDRV_CmpColor(PSCOLOR *col1, PSCOLOR *col2);
+extern BOOL32 PSDRV_CopyColor(PSCOLOR *col1, PSCOLOR *col2);
+extern void PSDRV_CreateColor( PSDRV_PDEVICE *physDev, PSCOLOR *pscolor,
+		     COLORREF wincolor );
+
 
 extern INT32 PSDRV_WriteHeader( DC *dc, char *title, int len );
 extern INT32 PSDRV_WriteFooter( DC *dc );
@@ -210,17 +264,24 @@
 extern BOOL32 PSDRV_WriteStroke(DC *dc);
 extern BOOL32 PSDRV_WriteRectangle(DC *dc, INT32 x, INT32 y, INT32 width, 
 			INT32 height);
-extern BOOL32 PSDRV_WriteSetFont(DC *dc);
+extern BOOL32 PSDRV_WriteSetFont(DC *dc, BOOL32 UseANSI);
 extern BOOL32 PSDRV_WriteShow(DC *dc, char *str, INT32 count);
 extern BOOL32 PSDRV_WriteReencodeFont(DC *dc);
+extern BOOL32 PSDRV_WriteSetPen(DC *dc);
+extern BOOL32 PSDRV_WriteEllispe(DC *dc, INT32 x, INT32 y, INT32 a, INT32 b);
+extern BOOL32 PSDRV_WriteSetColor(DC *dc, PSCOLOR *color);
+extern BOOL32 PSDRV_WriteSetBrush(DC *dc);
+extern BOOL32 PSDRV_WriteFill(DC *dc);
+extern BOOL32 PSDRV_Writegsave(DC *dc);
+extern BOOL32 PSDRV_Writegrestore(DC *dc);
 
 
 
 
 
 
-
-
+extern BOOL32 PSDRV_Ellipse(DC *dc, INT32 left, INT32 top, INT32 right,
+		       INT32 bottom);
 extern BOOL32 PSDRV_EnumDeviceFonts( DC* dc, LPLOGFONT16 plf, 
 				        DEVICEFONTENUMPROC proc, LPARAM lp );
 extern INT32 PSDRV_Escape( DC *dc, INT32 nEscape, INT32 cbInput, 
@@ -233,11 +294,13 @@
 extern BOOL32 PSDRV_GetTextMetrics( DC *dc, TEXTMETRIC32A *metrics );
 extern BOOL32 PSDRV_LineTo( DC *dc, INT32 x, INT32 y );
 extern BOOL32 PSDRV_MoveToEx( DC *dc, INT32 x, INT32 y, LPPOINT32 pt );
-extern BOOL32 PSDRV_Polyline( DC *dc, const LPPOINT32 pt, INT32 count );
 extern BOOL32 PSDRV_Polygon( DC *dc, LPPOINT32 pt, INT32 count );
-extern HGDIOBJ32 PSDRV_SelectObject( DC *dc, HGDIOBJ32 handle );
-
+extern BOOL32 PSDRV_Polyline( DC *dc, const LPPOINT32 pt, INT32 count );
 extern BOOL32 PSDRV_Rectangle(DC *dc, INT32 left, INT32 top, INT32 right,
 		       INT32 bottom);
-extern BOOL32 PSDRV_Ellipse(DC *dc, INT32 left, INT32 top, INT32 right,
-		       INT32 bottom);
+extern HGDIOBJ32 PSDRV_SelectObject( DC *dc, HGDIOBJ32 handle );
+extern COLORREF PSDRV_SetBkColor( DC *dc, COLORREF color );
+extern COLORREF PSDRV_SetTextColor( DC *dc, COLORREF color );
+
+
+
diff --git a/include/rebar.h b/include/rebar.h
index ff92512..8dd760b 100644
--- a/include/rebar.h
+++ b/include/rebar.h
@@ -27,7 +27,7 @@
     UINT32    cxHeader;
 
     LPSTR     lpText;
-
+    HWND32    hwndPrevParent;
 } REBAR_BAND;
 
 
diff --git a/include/region.h b/include/region.h
index 263379b..2d7be11 100644
--- a/include/region.h
+++ b/include/region.h
@@ -384,11 +384,3 @@
 #endif  /* __WINE_REGION_H */
 
 
-
-
-
-
-
-
-
-
diff --git a/include/shell.h b/include/shell.h
index e9dc4c5..3475ca4 100644
--- a/include/shell.h
+++ b/include/shell.h
@@ -93,6 +93,7 @@
 /****************************************************************************
 * SHITEMID, ITEMIDLIST, PIDL API 
 */
+#pragma pack(1)
 typedef struct 
 { WORD		cb;	/* nr of bytes in this item */
   BYTE		abID[1];/* first byte in this item */
@@ -101,10 +102,12 @@
 typedef struct 
 { SHITEMID mkid; /* first itemid in list */
 } ITEMIDLIST,*LPITEMIDLIST,*LPCITEMIDLIST;
+#pragma pack(4)
 
 LPITEMIDLIST WINAPI ILClone (LPCITEMIDLIST pidl);
 LPITEMIDLIST WINAPI ILGetNext(LPITEMIDLIST pidl);
 LPITEMIDLIST WINAPI ILCombine(LPCITEMIDLIST iil1,LPCITEMIDLIST iil2);
+LPITEMIDLIST WINAPI ILFindLastID(LPITEMIDLIST pidl);
 DWORD WINAPI ILGetSize(LPITEMIDLIST pidl);
 
 DWORD WINAPI SHGetPathFromIDList32A (LPCITEMIDLIST pidl,LPSTR pszPath);
@@ -161,12 +164,10 @@
   LPCWSTR         lpszProgressTitle;
 } SHFILEOPSTRUCT32W, *LPSHFILEOPSTRUCT32W;
 
-typedef SHFILEOPSTRUCT32A SHFILEOPSTRUCT32;
-typedef LPSHFILEOPSTRUCT32A LPSHFILEOPSTRUCT32;
+#define  SHFILEOPSTRUCT WINELIB_NAME_AW(SHFILEOPSTRUCT)
+#define  LPSHFILEOPSTRUCT WINELIB_NAME_AW(LPSHFILEOPSTRUCT)
 
-DECL_WINELIB_TYPE_AW(SHFILEOPSTRUCT)
-
-DWORD WINAPI SHFileOperation32(LPSHFILEOPSTRUCT32 lpFileOp);
+DWORD WINAPI SHFileOperation32(LPSHFILEOPSTRUCT32A lpFileOp);
 
 /****************************************************************************
 * APPBARDATA 
@@ -216,6 +217,10 @@
 DWORD WINAPI SHAddToRecentDocs(UINT32 uFlags, LPCVOID pv);
 
 /****************************************************************************
+* SHGetSpecialFolderLocation API
+*/
+HRESULT WINAPI SHGetSpecialFolderLocation(HWND32, INT32, LPITEMIDLIST *);
+/****************************************************************************
 *  string and path functions
 */
 LPSTR WINAPI PathAddBackslash(LPSTR path);	
@@ -253,4 +258,5 @@
 #define	CSIDL_FONTS		0x0014
 #define	CSIDL_TEMPLATES		0x0015
 
+
 #endif  /* __WINE_SHELL_H */
diff --git a/include/shlobj.h b/include/shlobj.h
index 4a900ac..fd4599d 100644
--- a/include/shlobj.h
+++ b/include/shlobj.h
@@ -26,15 +26,15 @@
 typedef LPVOID	LPBC; /* *IBindCtx really */
 
 /* foreward declaration of the objects*/
-
-typedef struct IContextMenu		IContextMenu,	*LPCONTEXTMENU;
-typedef struct IShellExtInit	IShellExtInit, 	*LPSHELLEXTINIT;
-typedef struct IEnumIDList		IEnumIDList,	*LPENUMIDLIST;
+typedef struct tagCONTEXTMENU	*LPCONTEXTMENU,	IContextMenu;
+typedef struct tagSHELLEXTINIT	*LPSHELLEXTINIT,IShellExtInit;
+typedef struct tagENUMIDLIST	*LPENUMIDLIST,	IEnumIDList;
 typedef struct tagSHELLFOLDER	*LPSHELLFOLDER,	IShellFolder;
 typedef struct tagSHELLVIEW		*LPSHELLVIEW,	IShellView;
 typedef struct tagSHELLBROWSER	*LPSHELLBROWSER,IShellBrowser;
 
 typedef struct IDataObject		IDataObject,	*LPDATAOBJECT;
+
 /****************************************************************************
 *  SHELL ID
 */
@@ -48,7 +48,7 @@
 DEFINE_SHLGUID(CGID_Explorer,           0x000214D0L, 0, 0);
 DEFINE_SHLGUID(CGID_ShellDocView,       0x000214D1L, 0, 0);
 
- /* shell32 Interface ids */
+ /* shell32interface ids */
 DEFINE_SHLGUID(IID_INewShortcutHookA,   0x000214E1L, 0, 0);
 DEFINE_SHLGUID(IID_IShellBrowser,       0x000214E2L, 0, 0);
 DEFINE_SHLGUID(IID_IShellView,          0x000214E3L, 0, 0);
@@ -85,75 +85,11 @@
 { UINT32 uType;		/* STRRET_xxx */
   union
   { LPWSTR	pOleStr;	/* OLESTR that will be freed */
-    UINT32	uOffset;	/* Offset into SHITEMID (ANSI) */
+    UINT32	uOffset;	/* OffsetINT32o SHITEMID (ANSI) */
     char	cStr[MAX_PATH];	/* Buffer to fill in */
   }u;
 } STRRET,*LPSTRRET;
 
-/****************************************************************************
- * 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_MYCOMP =  0x00000001,
-  PT_CONTROL = 0x00000002,
-  PT_RECYCLER =0x00000004,
-  PT_DRIVE =   0x00000008,
-  PT_FOLDER =  0x00000010,
-  PT_VALUE =   0x00000020,
-  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, CreateMyComputer) (THIS);
-   STDMETHOD_(LPITEMIDLIST, CreateDrive) (THIS_ LPCSTR);
-   STDMETHOD_(LPITEMIDLIST, CreateFolder) (THIS_ LPCSTR);
-   STDMETHOD_(LPITEMIDLIST, CreateValue) (THIS_ LPCSTR);
-
-   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, IsMyComputer) (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, LPCITEMIDLIST, LPDWORD);
-   STDMETHOD_(DWORD, GetDataText) (THIS_ LPCITEMIDLIST, LPCITEMIDLIST, LPSTR, DWORD);
-   STDMETHOD_(DWORD, GetPidlPath) (THIS_ LPCITEMIDLIST, LPSTR, DWORD);
-   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
 /*****************************************************************************
  * IContextMenu interface
  */
@@ -207,27 +143,27 @@
 #define CMIC_MASK_PTINVOKE      0x20000000
 
 /*NOTE: When SEE_MASK_HMONITOR is set, hIcon is treated as hMonitor */
-typedef struct _CMINVOKECOMMANDINFO 
+typedef struct tagCMINVOKECOMMANDINFO 
 {   DWORD cbSize;        // sizeof(CMINVOKECOMMANDINFO)
     DWORD fMask;         // any combination of CMIC_MASK_*
     HWND32 hwnd;         // might be NULL (indicating no owner window)
     LPCSTR lpVerb;       // either a string or MAKEINTRESOURCE(idOffset)
     LPCSTR lpParameters; // might be NULL (indicating no parameter)
     LPCSTR lpDirectory;  // might be NULL (indicating no specific directory)
-    int nShow;           // one of SW_ values for ShowWindow() API
+   INT32 nShow;           // one of SW_ values for ShowWindow() API
 
     DWORD dwHotKey;
     HANDLE32 hIcon;
-} CMINVOKECOMMANDINFO,  *LPCMINVOKECOMMANDINFO;
+} CMINVOKECOMMANDINFO32,  *LPCMINVOKECOMMANDINFO32;
 
-typedef struct _CMInvokeCommandInfoEx 
+typedef struct tagCMInvokeCommandInfoEx 
 {   DWORD cbSize;        // must be sizeof(CMINVOKECOMMANDINFOEX)
     DWORD fMask;         // any combination of CMIC_MASK_*
     HWND32 hwnd;         // might be NULL (indicating no owner window)
     LPCSTR lpVerb;       // either a string or MAKEINTRESOURCE(idOffset)
     LPCSTR lpParameters; // might be NULL (indicating no parameter)
     LPCSTR lpDirectory;  // might be NULL (indicating no specific directory)
-    int nShow;           // one of SW_ values for ShowWindow() API
+	INT32 nShow;           // one of SW_ values for ShowWindow() API
 
     DWORD dwHotKey;
     
@@ -239,7 +175,7 @@
     LPCWSTR lpTitleW;      // Unicode title (for those who can use it)
     POINT32 ptInvoke;      // Point where it's invoked
 
-} CMINVOKECOMMANDINFOEX,  *LPCMINVOKECOMMANDINFOEX;
+} CMINVOKECOMMANDINFOEX32,  *LPCMINVOKECOMMANDINFOEX32;
 
 
 typedef struct IContextMenu_VTable
@@ -249,16 +185,21 @@
     STDMETHOD_(ULONG,Release) (THIS) PURE;
 
     STDMETHOD(QueryContextMenu)(THIS_ HMENU32 hmenu,UINT32 indexMenu,UINT32 idCmdFirst, UINT32 idCmdLast,UINT32 uFlags) PURE;
-    STDMETHOD(InvokeCommand)(THIS_ LPCMINVOKECOMMANDINFO lpici) PURE;
+    STDMETHOD(InvokeCommand)(THIS_ LPCMINVOKECOMMANDINFO32 lpici) PURE;
     STDMETHOD(GetCommandString)(THIS_ UINT32 idCmd,UINT32 uType,UINT32 * pwReserved,LPSTR pszName,UINT32 cchMax) PURE;
+
+    /* undocumented not only in ContextMenu2 */
+    STDMETHOD(HandleMenuMsg)(THIS_  UINT32 uMsg,WPARAM32 wParam,LPARAM lParam) PURE;
+
+    /* possibly another nasty entry from ContextMenu3 ?*/    
+    void * guard;
 } IContextMenu_VTable,*LPCONTEXTMENU_VTABLE;
 
-struct IContextMenu
+struct tagCONTEXTMENU
 { LPCONTEXTMENU_VTABLE	lpvtbl;
   DWORD			ref;
   LPSHELLFOLDER	pSFParent;
   LPITEMIDLIST	*aPidls;
-  LPPIDLMGR		pPidlMgr;
   BOOL32		bAllValues;
 };
 
@@ -278,7 +219,7 @@
     STDMETHOD(Initialize)(THIS_ LPCITEMIDLIST pidlFolder, LPDATAOBJECT lpdobj, HKEY hkeyProgID) PURE;
 } IShellExtInit_VTable,*LPSHELLEXTINIT_VTABLE;
 
-struct IShellExtInit
+struct tagSHELLEXTINIT
 { LPSHELLEXTINIT_VTABLE	lpvtbl;
   DWORD			 ref;
 };
@@ -316,10 +257,9 @@
 		
 } IEnumIDList_VTable,*LPENUMIDLIST_VTABLE;
 
-struct IEnumIDList
+struct tagENUMIDLIST
 { LPENUMIDLIST_VTABLE	lpvtbl;
-  DWORD			 ref;
-  LPPIDLMGR  mpPidlMgr;
+  DWORD		 ref;
   LPENUMLIST mpFirst;
   LPENUMLIST mpLast;
   LPENUMLIST mpCurrent;
@@ -456,7 +396,6 @@
 	LPSHELLFOLDER_VTABLE	lpvtbl;
 	DWORD			ref;
 	LPSTR			mlpszFolder;
-    LPPIDLMGR		pPidlMgr;
 	LPITEMIDLIST	mpidl;
 	LPITEMIDLIST	mpidlNSRoot;
 	LPSHELLFOLDER	mpSFParent;
@@ -466,7 +405,7 @@
 #undef THIS
 
 /************************************************************************
-* IShellBrowser Inteface
+* IShellBrowser interface
 */
 #define THIS LPSHELLBROWSER this
 
@@ -512,7 +451,7 @@
 #undef THIS
 
 /************************************************************************
-* IShellView Inteface
+* IShellView interface
 */
 #define THIS LPSHELLVIEW this
 
@@ -646,18 +585,18 @@
     STDMETHOD_(ULONG,AddRef) (THIS)  PURE;
     STDMETHOD_(ULONG,Release) (THIS) PURE;
 
-    STDMETHOD(GetPath)(THIS_ LPSTR pszFile, INT32 cchMaxPath, WIN32_FIND_DATA32A *pfd, DWORD fFlags) PURE;
+    STDMETHOD(GetPath)(THIS_ LPSTR pszFile,INT32 cchMaxPath, WIN32_FIND_DATA32A *pfd, DWORD fFlags) PURE;
 
     STDMETHOD(GetIDList)(THIS_ LPITEMIDLIST * ppidl) PURE;
     STDMETHOD(SetIDList)(THIS_ LPCITEMIDLIST pidl) PURE;
 
-    STDMETHOD(GetDescription)(THIS_ LPSTR pszName, int cchMaxName) PURE;
+    STDMETHOD(GetDescription)(THIS_ LPSTR pszName,INT32 cchMaxName) PURE;
     STDMETHOD(SetDescription)(THIS_ LPCSTR pszName) PURE;
 
-    STDMETHOD(GetWorkingDirectory)(THIS_ LPSTR pszDir, int cchMaxPath) PURE;
+    STDMETHOD(GetWorkingDirectory)(THIS_ LPSTR pszDir,INT32 cchMaxPath) PURE;
     STDMETHOD(SetWorkingDirectory)(THIS_ LPCSTR pszDir) PURE;
 
-    STDMETHOD(GetArguments)(THIS_ LPSTR pszArgs, int cchMaxPath) PURE;
+    STDMETHOD(GetArguments)(THIS_ LPSTR pszArgs,INT32 cchMaxPath) PURE;
     STDMETHOD(SetArguments)(THIS_ LPCSTR pszArgs) PURE;
 
     STDMETHOD(GetHotkey)(THIS_ WORD *pwHotkey) PURE;
@@ -666,8 +605,8 @@
     STDMETHOD(GetShowCmd)(THIS_ INT32 *piShowCmd) PURE;
     STDMETHOD(SetShowCmd)(THIS_ INT32 iShowCmd) PURE;
 
-    STDMETHOD(GetIconLocation)(THIS_ LPSTR pszIconPath, INT32 cchIconPath, INT32 *piIcon) PURE;
-    STDMETHOD(SetIconLocation)(THIS_ LPCSTR pszIconPath, INT32 iIcon) PURE;
+    STDMETHOD(GetIconLocation)(THIS_ LPSTR pszIconPath,INT32 cchIconPath,INT32 *piIcon) PURE;
+    STDMETHOD(SetIconLocation)(THIS_ LPCSTR pszIconPath,INT32 iIcon) PURE;
 
     STDMETHOD(SetRelativePath)(THIS_ LPCSTR pszPathRel, DWORD dwReserved) PURE;
 
@@ -684,7 +623,7 @@
 #undef THIS
 
 /****************************************************************************
- * IExtractIcon interface
+ * IExtractIconinterface
  *
  * FIXME
  *  Is the ExtractIconA interface
@@ -711,7 +650,7 @@
   STDMETHOD_(ULONG,Release) (THIS) PURE;
 
   /*** IExtractIcon methods ***/
-  STDMETHOD(GetIconLocation)(THIS_ UINT32 uFlags, LPSTR szIconFile, UINT32 cchMax, int * piIndex, UINT32 * pwFlags) PURE;
+  STDMETHOD(GetIconLocation)(THIS_ UINT32 uFlags, LPSTR szIconFile, UINT32 cchMax,INT32 * piIndex, UINT32 * pwFlags) PURE;
   STDMETHOD(Extract)(THIS_ LPCSTR pszFile, UINT32 nIconIndex, HICON32 *phiconLarge, HICON32 *phiconSmall, UINT32 nIconSize) PURE;
 }IExtractIccon_VTable,*LPEXTRACTICON_VTABLE;
 
@@ -796,7 +735,7 @@
         LPCSTR   lpFile;
         LPCSTR   lpParameters;
         LPCSTR   lpDirectory;
-        int nShow;
+       INT32 nShow;
         HINSTANCE32 hInstApp;
         /* Optional fields */
         LPVOID lpIDList;
@@ -808,7 +747,7 @@
           HANDLE32 hMonitor;
         } u;
         HANDLE32 hProcess;
-} SHELLEXECUTEINFOA, *LPSHELLEXECUTEINFOA;
+} SHELLEXECUTEINFO32A, *LPSHELLEXECUTEINFO32A;
 
 typedef struct _SHELLEXECUTEINFOW
 {       DWORD cbSize;
@@ -818,7 +757,7 @@
         LPCWSTR  lpFile;
         LPCWSTR  lpParameters;
         LPCWSTR  lpDirectory;
-        int nShow;
+       INT32 nShow;
         HINSTANCE32 hInstApp;
         /* Optional fields*/
         LPVOID lpIDList;
@@ -830,19 +769,17 @@
           HANDLE32 hMonitor;
         } u;
         HANDLE32 hProcess;
-} SHELLEXECUTEINFOW, *LPSHELLEXECUTEINFOW;
+} SHELLEXECUTEINFO32W, *LPSHELLEXECUTEINFO32W;
 
-DECL_WINELIB_TYPE_AW(SHELLEXECUTEINFO)
+#define SHELLEXECUTEINFO   WINELIB_NAME_AW(SHELLEXECUTEINFO)
+#define LPSHELLEXECUTEINFO WINELIB_NAME_AW(LPSHELLEXECUTEINFO)
 
-typedef SHELLEXECUTEINFOA SHELLEXECUTEINFO;
-typedef LPSHELLEXECUTEINFOA LPSHELLEXECUTEINFO;
-
-BOOL32 WINAPI ShellExecuteEx32A(LPSHELLEXECUTEINFOA lpExecInfo);
-BOOL32 WINAPI ShellExecuteEx32W(LPSHELLEXECUTEINFOW lpExecInfo);
+BOOL32 WINAPI ShellExecuteEx32A(LPSHELLEXECUTEINFO32A lpExecInfo);
+BOOL32 WINAPI ShellExecuteEx32W(LPSHELLEXECUTEINFO32W lpExecInfo);
 #define ShellExecuteEx  WINELIB_NAME_AW(ShellExecuteEx)
 
-void WINAPI WinExecErrorA(HWND32 hwnd, int error, LPCSTR lpstrFileName, LPCSTR lpstrTitle);
-void WINAPI WinExecErrorW(HWND32 hwnd, int error, LPCWSTR lpstrFileName, LPCWSTR lpstrTitle);
+void WINAPI WinExecError32A(HWND32 hwnd,INT32 error, LPCSTR lpstrFileName, LPCSTR lpstrTitle);
+void WINAPI WinExecError32W(HWND32 hwnd,INT32 error, LPCWSTR lpstrFileName, LPCWSTR lpstrTitle);
 #define WinExecError  WINELIB_NAME_AW(WinExecError)
 
 
@@ -850,7 +787,7 @@
 /****************************************************************************
  * SHBrowseForFolder API
  */
-typedef int (CALLBACK* BFFCALLBACK)(HWND32 hwnd, UINT32 uMsg, LPARAM lParam, LPARAM lpData);
+typedef INT32 (CALLBACK* BFFCALLBACK)(HWND32 hwnd, UINT32 uMsg, LPARAM lParam, LPARAM lpData);
 
 typedef struct tagBROWSEINFO32A {
     HWND32        hwndOwner;
@@ -860,7 +797,7 @@
     UINT32        ulFlags;
     BFFCALLBACK   lpfn;
     LPARAM        lParam;
-    int           iImage;
+	INT32         iImage;
 } BROWSEINFO32A, *PBROWSEINFO32A, *LPBROWSEINFO32A;
 
 typedef struct tagBROWSEINFO32W {
@@ -871,7 +808,7 @@
     UINT32        ulFlags;
     BFFCALLBACK   lpfn;
     LPARAM        lParam;
-    int           iImage;
+	INT32         iImage;
 } BROWSEINFO32W, *PBROWSEINFO32W, *LPBROWSEINFO32W; 
 
 #define BROWSEINFO   WINELIB_NAME_AW(BROWSEINFO)
@@ -961,7 +898,7 @@
 
 /*
  The shell keeps track of some per-user state to handle display
- options that is of major interest to ISVs.
+ options that is of majorinterest to ISVs.
  The key one requested right now is "DoubleClickInWebView".
 */
 typedef struct 
diff --git a/include/tab.h b/include/tab.h
new file mode 100644
index 0000000..6b0b631
--- /dev/null
+++ b/include/tab.h
@@ -0,0 +1,36 @@
+/*
+ * Tab control class extra info
+ *
+ * Copyright 1998 Anders Carlsson
+ */
+
+#ifndef __WINE_TAB_H  
+#define __WINE_TAB_H
+
+typedef struct tagTAB_ITEM
+{
+    UINT32	mask;
+    UINT32	lpReserved1;
+    UINT32	lpReserved2;
+    LPSTR	pszText;
+    INT32	cchTextMax;
+    INT32	iImage;
+    LPARAM	lParam;
+    RECT32   	rect;		/* bounding rectangle of the item */
+} TAB_ITEM;
+
+typedef struct tagTAB_INFO
+{
+    UINT32	uNumItem;	/* number of tab items */
+    INT32	nHeight;	/* height of the tab row */
+    HFONT32	hFont;		/* handle to the current font */
+    HCURSOR32	hcurArrow;	/* handle to the current cursor */
+    INT32	iSelected;	/* the currently selected item */
+    TAB_ITEM	*items;		/* pointer to an array of TAB_ITEM's */
+    RECT32	rect;
+} TAB_INFO;
+
+
+extern void TAB_Register (void);
+
+#endif  /* __WINE_TAB_H */
diff --git a/include/thread.h b/include/thread.h
index 58ad89a..22e62bf 100644
--- a/include/thread.h
+++ b/include/thread.h
@@ -114,6 +114,9 @@
 #define THREAD_ID_TO_THDB(id)   ((THDB *)((id) ^ THREAD_OBFUSCATOR))
 #define THDB_TO_THREAD_ID(thdb) ((DWORD)(thdb) ^ THREAD_OBFUSCATOR)
 
+/* The pseudo handle value returned by GetCurrentThread */
+#define CURRENT_THREAD_PSEUDOHANDLE 0xfffffffe
+
 #ifdef __i386__
 /* On the i386, the current thread is in the %fs register */
 # define SET_CUR_THREAD(thdb) SET_FS((thdb)->teb_sel)
diff --git a/include/toolbar.h b/include/toolbar.h
index 4af9f98..1f4f443 100644
--- a/include/toolbar.h
+++ b/include/toolbar.h
@@ -53,9 +53,9 @@
     BOOL32     bTransparent;    /* background transparency flag */
     BOOL32     bAutoSize;       /* auto size deadlock indicator */
     DWORD      dwExStyle;       /* extended toolbar style */
-    SIZE32     maxSize;         /* maximum toolbar size */
 
     COLORREF   clrInsertMark;   /* insert mark color */
+    RECT32     rcBound;         /* bounding rectangle */
 
     TBUTTON_INFO *buttons;      /* pointer to button array */
     CHAR         **strings;
diff --git a/include/tooltips.h b/include/tooltips.h
index 2750cb4..d0d0c72 100644
--- a/include/tooltips.h
+++ b/include/tooltips.h
@@ -30,25 +30,25 @@
 
 typedef struct tagTOOLTIPS_INFO
 {
-    CHAR       szTipText[INFOTIPSIZE];
-    BOOL32     bActive;
-    BOOL32     bTrackActive;
-    UINT32     uNumTools;
-    COLORREF   clrBk;
-    COLORREF   clrText;
-    HFONT32    hFont;
-    INT32      xTrackPos;
-    INT32      yTrackPos;
-    INT32      nMaxTipWidth;
-    INT32      nTool;
-    INT32      nOldTool;
-    INT32      nCurrentTool;
-    INT32      nTrackTool;
-    INT32      nAutomaticTime;
-    INT32      nReshowTime;
-    INT32      nAutoPopTime;
-    INT32      nInitialTime;
-    RECT32     rcMargin;
+    CHAR        szTipText[INFOTIPSIZE];
+    BOOL32      bActive;
+    BOOL32      bTrackActive;
+    UINT32      uNumTools;
+    COLORREF    clrBk;
+    COLORREF    clrText;
+    HFONT32     hFont;
+    INT32       xTrackPos;
+    INT32       yTrackPos;
+    INT32       nMaxTipWidth;
+    INT32       nTool;
+    INT32       nOldTool;
+    INT32       nCurrentTool;
+    INT32       nTrackTool;
+    INT32       nAutomaticTime;
+    INT32       nReshowTime;
+    INT32       nAutoPopTime;
+    INT32       nInitialTime;
+    RECT32      rcMargin;
     TTTOOL_INFO *tools;
 } TOOLTIPS_INFO;
 
diff --git a/include/trackbar.h b/include/trackbar.h
index 0645f6a..f9ee1e8 100644
--- a/include/trackbar.h
+++ b/include/trackbar.h
@@ -16,10 +16,17 @@
     INT32  nSelMin;
     INT32  nSelMax;
     INT32  nPos;
-    INT32  nThumbLen;
+    UINT32 uThumbLen;
+    UINT32 uNumTics;
+    HWND32 hwndToolTip;
+    HWND32 hwndBuddyLA;
+    HWND32 hwndBuddyRB;
+    INT32  fLocation;
 
     BOOL32 bFocus;
     RECT32 rcChannel;
+    RECT32 rcThumb;
+    LPLONG tics;
 } TRACKBAR_INFO;
 
 
diff --git a/include/ts_xlib.h b/include/ts_xlib.h
index f78176c..5a100f9 100644
--- a/include/ts_xlib.h
+++ b/include/ts_xlib.h
@@ -124,6 +124,7 @@
 extern int  TSXUninstallColormap(Display*, Colormap);
 extern int  TSXUnmapWindow(Display*, Window);
 extern int  TSXWarpPointer(Display*, Window, Window, int, int, unsigned int, unsigned int, int, int);
+extern XIM  TSXOpenIM(Display*, struct _XrmHashBucketRec*, char*, char*);
 extern int (*TSXSynchronize(Display *, Bool))(Display *);
 extern void TS_XInitImageFuncPtrs(XImage *);
 
diff --git a/include/version.h b/include/version.h
index a6ca120..0062e05 100644
--- a/include/version.h
+++ b/include/version.h
@@ -1 +1 @@
-#define WINE_RELEASE_INFO "Wine release 980822"
+#define WINE_RELEASE_INFO "Wine release 980913"
diff --git a/include/windows.h b/include/windows.h
index e5c9f74..8765e68 100644
--- a/include/windows.h
+++ b/include/windows.h
@@ -8702,6 +8702,9 @@
 BOOL16      WINAPI RestoreDC16(HDC16,INT16);
 BOOL32      WINAPI RestoreDC32(HDC32,INT32);
 #define     RestoreDC WINELIB_NAME(RestoreDC)
+HRESULT     WINAPI RevokeDragDrop16(HWND16);
+HRESULT     WINAPI RevokeDragDrop32(HWND32);
+#define     RevokeDragDrop WINELIB_NAME(RevokeDragDrop)
 BOOL16      WINAPI RoundRect16(HDC16,INT16,INT16,INT16,INT16,INT16,INT16);
 BOOL32      WINAPI RoundRect32(HDC32,INT32,INT32,INT32,INT32,INT32,INT32);
 #define     RoundRect WINELIB_NAME(RoundRect)
@@ -9169,6 +9172,8 @@
 BOOL16      WINAPI WritePrivateProfileString16(LPCSTR,LPCSTR,LPCSTR,LPCSTR);
 BOOL32      WINAPI WritePrivateProfileString32A(LPCSTR,LPCSTR,LPCSTR,LPCSTR);
 BOOL32      WINAPI WritePrivateProfileString32W(LPCWSTR,LPCWSTR,LPCWSTR,LPCWSTR);
+BOOL32	     WINAPI WriteProfileSection32A(LPCSTR,LPCSTR);
+BOOL32	     WINAPI WriteProfileSection32W(LPCWSTR,LPCWSTR);
 #define     WritePrivateProfileString WINELIB_NAME_AW(WritePrivateProfileString)
 BOOL16      WINAPI WritePrivateProfileStruct16(LPCSTR,LPCSTR,LPVOID,UINT16,LPCSTR);
 BOOL32      WINAPI WritePrivateProfileStruct32A(LPCSTR,LPCSTR,LPVOID,UINT32,LPCSTR);
diff --git a/include/winerror.h b/include/winerror.h
index 91db795..1d368fb 100644
--- a/include/winerror.h
+++ b/include/winerror.h
@@ -13,7 +13,8 @@
     ((HRESULT) (((unsigned long)(sev)<<31) | ((unsigned long)(fac)<<16) | ((unsigned long)(code))) )
 #define MAKE_SCODE(sev,fac,code) \
         ((SCODE) (((unsigned long)(sev)<<31) | ((unsigned long)(fac)<<16) | ((unsigned long)(code))) )
-
+#define SUCCEEDED(stat) ((HRESULT)(stat)>=0)
+#define FAILED(stat) ((HRESULT)(stat)<0)
 
 /* ERROR_UNKNOWN is a placeholder for error conditions which haven't
  * been tested yet so we're not exactly sure what will be returned.
@@ -59,6 +60,7 @@
 #define ERROR_NOT_OWNER             288
 #define ERROR_TOO_MANY_POSTS        298
 #define ERROR_INVALID_ADDRESS       487
+#define ERROR_INVALID_ACCESS_TO_MEM 998 
 #define ERROR_CAN_NOT_COMPLETE      1003
 #define ERROR_BADKEY                1010 /* Config reg key invalid */
 #define ERROR_CANTREAD              1012 /* Config reg key couldn't be read */
diff --git a/include/winnls.h b/include/winnls.h
index 4967925..5024998 100644
--- a/include/winnls.h
+++ b/include/winnls.h
@@ -289,6 +289,9 @@
 #define DATE_LONGDATE          0x00000002  /* use long date picture */
 #define DATE_USE_ALT_CALENDAR  0x00000004  /* use alternate calendar */
                           /* alt. calendar support is broken anyway */
+
+#define TIME_FORCE24HOURFORMAT 0x00000008  /* force 24 hour format*/
+#define TIME_NOTIMEMARKER      0x00000004  /* show no AM/PM */
 #define TIME_NOSECONDS         0x00000002  /* show no seconds */
 #define TIME_NOMINUTESORSECONDS 0x0000001  /* show no minutes either */
 
diff --git a/include/x11drv.h b/include/x11drv.h
index 5968388..cb05e0d 100644
--- a/include/x11drv.h
+++ b/include/x11drv.h
@@ -43,6 +43,8 @@
     X_PHYSFONT    font;
     X_PHYSPEN     pen;
     X_PHYSBRUSH   brush;
+    int           backgroundPixel;
+    int           textPixel;
 } X11DRV_PDEVICE;
 
 typedef INT32 (*DEVICEFONTENUMPROC)(LPENUMLOGFONT16,LPNEWTEXTMETRIC16,UINT16,LPARAM);
@@ -102,6 +104,8 @@
 
 extern HGDIOBJ32 X11DRV_SelectObject( struct tagDC *dc, HGDIOBJ32 handle );
 
+extern COLORREF X11DRV_SetBkColor( struct tagDC *dc, COLORREF color );
+extern COLORREF X11DRV_SetTextColor( struct tagDC *dc, COLORREF color );
 extern BOOL32 X11DRV_ExtFloodFill( struct tagDC *dc, INT32 x, INT32 y,
 				   COLORREF color, UINT32 fillType );
 extern BOOL32 X11DRV_ExtTextOut( struct tagDC *dc, INT32 x, INT32 y,
diff --git a/libtest/hello4.c b/libtest/hello4.c
index 964c521..b625f65 100644
--- a/libtest/hello4.c
+++ b/libtest/hello4.c
@@ -3,12 +3,15 @@
 
 void Write (HDC dc, int x, int y, char *s)
 {
+    SetBkMode(dc, TRANSPARENT);
     TextOut (dc, x, y, s, strlen (s));
 }
 
 LRESULT WndProc (HWND wnd, UINT msg, WPARAM w, LPARAM l)
 {
     static short xChar, yChar;
+    static RECT  rectHola;
+    static char* strHola = "Hola";
     HDC dc;
     PAINTSTRUCT ps;
     TEXTMETRIC tm;
@@ -19,12 +22,20 @@
 	GetTextMetrics (dc, &tm);
 	xChar = tm.tmAveCharWidth;
 	yChar = tm.tmHeight;
+	GetTextExtentPoint32( dc, strHola, strlen(strHola), ((LPSIZE)&rectHola) + 1 );
+	OffsetRect( &rectHola, xChar, yChar );
 	ReleaseDC (wnd, dc);
 	break;
 
+    case WM_HSCROLL:
+    case WM_VSCROLL:
+	InvalidateRect(wnd, &rectHola, TRUE );
+        ScrollChildren32(wnd, msg, w, l);
+        return 0;
+
     case WM_PAINT:
 	dc = BeginPaint (wnd, &ps);
-	Write (dc, xChar, yChar, "Hola");
+	Write (dc, xChar, yChar, strHola);
 	EndPaint (wnd, &ps);
 	break;
 
@@ -41,6 +52,7 @@
 LRESULT WndProc2 (HWND wnd, UINT msg, WPARAM w, LPARAM l)
 {
     static short xChar, yChar;
+    static RECT  rectInfo;
     char buf[128];
     HDC dc;
     PAINTSTRUCT ps;
@@ -59,10 +71,19 @@
 	dc = BeginPaint (wnd, &ps);
         sprintf(buf,"ps.rcPaint = {left = %d, top = %d, right = %d, bottom = %d}",
                 ps.rcPaint.left,ps.rcPaint.top,ps.rcPaint.right,ps.rcPaint.bottom);
+	rectInfo.left = rectInfo.top = 0;
+	GetTextExtentPoint32 (dc, buf, strlen(buf), ((LPSIZE)&rectInfo) + 1 );
+	OffsetRect (&rectInfo, xChar, yChar );
 	Write (dc, xChar, yChar, buf);
 	EndPaint (wnd, &ps);
 	break;
 
+    case WM_MOVE:
+    case WM_SIZE:
+	InvalidateRect( wnd, &rectInfo, TRUE );
+	CalcChildScroll( (UINT16)GetParent(wnd), SB_BOTH );
+	break;
+
     case WM_DESTROY:
 	PostQuitMessage (0);
 	break;
@@ -97,19 +118,20 @@
 	    return FALSE;
     }
 
-    wnd = CreateWindow (className, winName, WS_OVERLAPPEDWINDOW,
+    wnd = CreateWindow (className, winName, WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN | WS_VSCROLL | WS_HSCROLL,
 			CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, 0, 
 			0, inst, 0);
 
     if (!prev){
         class.lpfnWndProc = WndProc2;
 	class.lpszClassName = class2Name;
+	class.hbrBackground = GetStockObject(GRAY_BRUSH);
         if (!RegisterClass (&class))
 	    return FALSE;
     }
 
-    wnd2= CreateWindow (class2Name,"Test app", WS_BORDER | WS_CHILD, 
-                        50, 50, 350, 50, wnd, 0, inst, 0);
+    wnd2= CreateWindow (class2Name,"Child window", WS_CAPTION | WS_CHILD | WS_THICKFRAME, 
+                        50, 50, 350, 100, wnd, 0, inst, 0);
 
     ShowWindow (wnd, show);
     UpdateWindow (wnd);
diff --git a/loader/dos/Makefile.in b/loader/dos/Makefile.in
index 67b4c7a..257425d 100644
--- a/loader/dos/Makefile.in
+++ b/loader/dos/Makefile.in
@@ -14,7 +14,7 @@
 all: $(MODULE).o $(PROGRAMS)
 
 dosmod: dosmod.c
-	$(CC) $(ALLCFLAGS) -o dosmod $<
+	$(CC) $(ALLCFLAGS) -o dosmod dosmod.c
 
 @MAKE_RULES@
 
diff --git a/loader/dos/dosmod.c b/loader/dos/dosmod.c
index 9807ecf..1be2171 100644
--- a/loader/dos/dosmod.c
+++ b/loader/dos/dosmod.c
@@ -22,12 +22,14 @@
 #include <sys/stat.h>
 #include <sys/mman.h>
 #include <sys/vm86.h>
-#include <sys/syscall.h>
 #include <sys/types.h>
 #include <sys/ptrace.h>
 #include <sys/wait.h>
 
-/* FIXME: hack because libc vm86 may be the old syscall version */
+ /* FIXME: hack because libc vm86 may be the old syscall version */
+
+#define SYS_vm86   166
+
 static __inline__ int vm86plus( int func, struct vm86plus_struct *ptr )
 {
     int res;
diff --git a/loader/dos/dosvm.c b/loader/dos/dosvm.c
index ec2e91d..9b4abb8 100644
--- a/loader/dos/dosvm.c
+++ b/loader/dos/dosvm.c
@@ -6,8 +6,6 @@
  * This code hasn't been completely cleaned up yet.
  */
 
-#ifdef linux
- 
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
@@ -28,6 +26,8 @@
 #include "ldt.h"
 #include "dosexe.h"
 
+#ifdef MZ_SUPPORTED
+
 static void DOSVM_Dump( LPDOSTASK lpDosTask)
 {
  unsigned iofs;
@@ -64,24 +64,10 @@
  exit(0);
 }
 
-static int DOSVM_Int(int vect, LPDOSTASK lpDosTask, PCONTEXT context )
+static int DOSVM_Int(int vect, PCONTEXT context )
 {
- /* we should really map to if1632/wprocs.spec, but not all
-    interrupt handlers are adapted to support our VM yet */
- switch (vect) {
-  case 0x20:
-   return -1;
-  case 0x21:
-   if (AH_reg(context)==0x4c) return -1;
-   DOS3Call(context);
-   break;
-  case 0x1a:
-   INT_Int1aHandler(context);
-   break;
-  case 0x2f:
-   INT_Int2fHandler(context);
-   break;
- }
+ /* moved to INT_RealModeInterrupt in msdos/interrupts.c */
+ INT_RealModeInterrupt(vect,context);
  return 0;
 }
 
@@ -109,8 +95,8 @@
    DOSVM_Dump(lpDosTask);
    break;
   case VM86_INTx:
-   TRACE(int,"DOS EXE calls INT %02x\n",VM86_ARG(lpDosTask->fn));
-   ret=DOSVM_Int(VM86_ARG(lpDosTask->fn),lpDosTask,&context); break;
+   TRACE(int,"DOS EXE calls INT %02x with AX=%04lx\n",VM86_ARG(lpDosTask->fn),context.Eax);
+   ret=DOSVM_Int(VM86_ARG(lpDosTask->fn),&context); break;
   case VM86_STI:
    break;
   case VM86_PICRETURN:
@@ -144,9 +130,9 @@
   /* no VM86 (dosmod) task is currently running, start one */
   if ((lpDosTask = calloc(1, sizeof(DOSTASK))) == NULL)
     return 0;
-  lpDosTask->img=DOSMEM_MemoryBase(pModule->self);
   lpDosTask->hModule=pModule->self;
-  stat=MZ_InitTask(lpDosTask);
+  stat=MZ_InitMemory(lpDosTask,pModule);
+  if (stat>=32) stat=MZ_InitTask(lpDosTask);
   if (stat<32) {
    free(lpDosTask);
    return -1;
@@ -177,7 +163,7 @@
  return 0;
 }
 
-#else /* !linux */
+#else /* !MZ_SUPPORTED */
 
 int DOSVM_Enter( PCONTEXT context )
 {
@@ -185,4 +171,4 @@
  return -1;
 }
 
-#endif /* linux */
+#endif
diff --git a/loader/dos/module.c b/loader/dos/module.c
index cce308f..2494135 100644
--- a/loader/dos/module.c
+++ b/loader/dos/module.c
@@ -6,8 +6,6 @@
  * This code hasn't been completely cleaned up yet.
  */
 
-#ifdef linux
- 
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
@@ -17,18 +15,22 @@
 #include <unistd.h>
 #include <sys/types.h>
 #include <sys/stat.h>
-#include <sys/mman.h>
-#include <sys/vm86.h>
 #include "windows.h"
 #include "winbase.h"
 #include "module.h"
 #include "task.h"
+#include "file.h"
 #include "ldt.h"
 #include "process.h"
 #include "miscemu.h"
 #include "debug.h"
 #include "dosexe.h"
 
+#ifdef MZ_SUPPORTED
+
+#include <sys/mman.h>
+#include <sys/vm86.h>
+
 /* define this to try mapping through /proc/pid/mem instead of a temp file,
    but Linus doesn't like mmapping /proc/pid/mem, so it doesn't work for me */
 #undef MZ_MAPSELF
@@ -85,25 +87,11 @@
  /* FIXME: integrate the PDB stuff from Wine (loader/task.c) */
 }
 
-static int MZ_LoadImage( HFILE16 hFile, LPCSTR cmdline, LPCSTR env,
-                         LPDOSTASK lpDosTask, NE_MODULE *pModule )
+int MZ_InitMemory( LPDOSTASK lpDosTask, NE_MODULE *pModule )
 {
- IMAGE_DOS_HEADER mz_header;
- DWORD image_start,image_size,min_size,max_size,avail;
- BYTE*psp_start,*load_start;
  int x;
- SEGPTR reloc;
 
- if ((_hread16(hFile,&mz_header,sizeof(mz_header)) != sizeof(mz_header)) ||
-     (mz_header.e_magic != IMAGE_DOS_SIGNATURE))
-     return 11; /* invalid exe */
- /* calculate load size */
- image_start=mz_header.e_cparhdr<<4;
- image_size=mz_header.e_cp<<9; /* pages are 512 bytes */
- if ((mz_header.e_cblp!=0)&&(mz_header.e_cblp!=4)) image_size-=512-mz_header.e_cblp;
- image_size-=image_start;
- min_size=image_size+((DWORD)mz_header.e_minalloc<<4)+(PSP_SIZE<<4);
- max_size=image_size+((DWORD)mz_header.e_maxalloc<<4)+(PSP_SIZE<<4);
+ if (lpDosTask->img_ofs) return 32; /* already allocated */
 
  /* allocate 1MB+64K shared memory */
  lpDosTask->img_ofs=START_OFFSET;
@@ -132,7 +120,43 @@
  /* initialize the memory */
  MZ_InitSystem(lpDosTask->img);
  TRACE(module,"Initializing DOS memory structures\n");
+ /* FIXME: make DOSMEM_Init copy static dosmem memory into newly allocated shared memory */
  DOSMEM_Init(lpDosTask->hModule);
+ return 32;
+}
+
+static int MZ_LoadImage( HFILE16 hFile, LPCSTR cmdline, LPCSTR env,
+                         LPDOSTASK lpDosTask, NE_MODULE *pModule )
+{
+ IMAGE_DOS_HEADER mz_header;
+ DWORD image_start,image_size,min_size,max_size,avail;
+ BYTE*psp_start,*load_start;
+ int x,old_com=0;
+ SEGPTR reloc;
+
+ if ((_hread16(hFile,&mz_header,sizeof(mz_header)) != sizeof(mz_header)) ||
+     (mz_header.e_magic != IMAGE_DOS_SIGNATURE)) {
+#if 0
+     return 11; /* invalid exe */
+#endif
+  old_com=1; /* assume .COM file */
+  image_start=0;
+  image_size=GetFileSize(HFILE16_TO_HFILE32(hFile),NULL);
+  min_size=0x10000; max_size=0x100000;
+  mz_header.e_crlc=0;
+  mz_header.e_ss=0; mz_header.e_sp=0xFFFE;
+  mz_header.e_cs=0; mz_header.e_ip=0x100;
+ } else {
+  /* calculate load size */
+  image_start=mz_header.e_cparhdr<<4;
+  image_size=mz_header.e_cp<<9; /* pages are 512 bytes */
+  if ((mz_header.e_cblp!=0)&&(mz_header.e_cblp!=4)) image_size-=512-mz_header.e_cblp;
+  image_size-=image_start;
+  min_size=image_size+((DWORD)mz_header.e_minalloc<<4)+(PSP_SIZE<<4);
+  max_size=image_size+((DWORD)mz_header.e_maxalloc<<4)+(PSP_SIZE<<4);
+ }
+
+ MZ_InitMemory(lpDosTask,pModule);
 
  /* FIXME: allocate memory for environment variables */
 
@@ -149,24 +173,26 @@
   ERR(module, "error allocating DOS memory\n");
   return 0;
  }
- lpDosTask->load_seg=lpDosTask->psp_seg+PSP_SIZE;
+ lpDosTask->load_seg=lpDosTask->psp_seg+(old_com?0:PSP_SIZE);
  load_start=psp_start+(PSP_SIZE<<4);
  MZ_InitPSP(psp_start, cmdline, env);
 
  /* load executable image */
- TRACE(module,"loading DOS EXE image size, %08lx bytes\n",image_size);
+ TRACE(module,"loading DOS %s image size, %08lx bytes\n",old_com?"COM":"EXE",image_size);
  _llseek16(hFile,image_start,FILE_BEGIN);
  if ((_hread16(hFile,load_start,image_size)) != image_size)
   return 11; /* invalid exe */
 
- /* load relocation table */
- TRACE(module,"loading DOS EXE relocation table, %d entries\n",mz_header.e_lfarlc);
- /* FIXME: is this too slow without read buffering? */
- _llseek16(hFile,mz_header.e_lfarlc,FILE_BEGIN);
- for (x=0; x<mz_header.e_crlc; x++) {
-  if (_lread16(hFile,&reloc,sizeof(reloc)) != sizeof(reloc))
-   return 11; /* invalid exe */
-  *(WORD*)SEGPTR16(load_start,reloc)+=lpDosTask->load_seg;
+ if (mz_header.e_crlc) {
+  /* load relocation table */
+  TRACE(module,"loading DOS EXE relocation table, %d entries\n",mz_header.e_lfarlc);
+  /* FIXME: is this too slow without read buffering? */
+  _llseek16(hFile,mz_header.e_lfarlc,FILE_BEGIN);
+  for (x=0; x<mz_header.e_crlc; x++) {
+   if (_lread16(hFile,&reloc,sizeof(reloc)) != sizeof(reloc))
+    return 11; /* invalid exe */
+   *(WORD*)SEGPTR16(load_start,reloc)+=lpDosTask->load_seg;
+  }
  }
 
  /* initialize vm86 struct */
@@ -184,9 +210,10 @@
 
 int MZ_InitTask( LPDOSTASK lpDosTask )
 {
+ extern char * DEBUG_argv0;
  int read_fd[2],write_fd[2];
  pid_t child;
- char *fname,*farg,arg[16],fproc[64];
+ char *fname,*farg,arg[16],fproc[64],path[256],*fpath;
 
  /* create read pipe */
  if (pipe(read_fd)<0) return 0;
@@ -236,7 +263,14 @@
   /* now load dosmod */
   execlp("dosmod",fname,farg,NULL);
   execl("dosmod",fname,farg,NULL);
+  /* hmm, they didn't install properly */
   execl("loader/dos/dosmod",fname,farg,NULL);
+  /* last resort, try to find it through argv[0] */
+  fpath=strrchr(strcpy(path,DEBUG_argv0),'/');
+  if (fpath) {
+   strcpy(fpath,"/loader/dos/dosmod");
+   execl(path,fname,farg,NULL);
+  }
   /* if failure, exit */
   ERR(module,"Failed to spawn dosmod, error=%s\n",strerror(errno));
   exit(1);
@@ -247,56 +281,65 @@
 HINSTANCE16 MZ_CreateProcess( LPCSTR name, LPCSTR cmdline, LPCSTR env, 
                               LPSTARTUPINFO32A startup, LPPROCESS_INFORMATION info )
 {
- LPDOSTASK lpDosTask;
+ LPDOSTASK lpDosTask = NULL; /* keep gcc from complaining */
  HMODULE16 hModule;
  HINSTANCE16 hInstance;
- NE_MODULE *pModule;
+ TDB *pTask = (TDB*)GlobalLock16( GetCurrentTask() );
+ NE_MODULE *pModule = pTask ? NE_GetPtr( pTask->hModule ) : NULL;
  HFILE16 hFile;
  OFSTRUCT ofs;
- int err;
+ int err, alloc = !(pModule && pModule->dos_image);
 
- if ((lpDosTask = calloc(1, sizeof(DOSTASK))) == NULL)
+ GlobalUnlock16( GetCurrentTask() );
+
+ if (alloc && (lpDosTask = calloc(1, sizeof(DOSTASK))) == NULL)
   return 0;
 
  if ((hFile = OpenFile16( name, &ofs, OF_READ )) == HFILE_ERROR16)
   return 2; /* File not found */
 
- if ((hModule = MODULE_CreateDummyModule(&ofs)) < 32)
-  return hModule;
+ if (alloc) {
+  if ((hModule = MODULE_CreateDummyModule(&ofs)) < 32)
+   return hModule;
 
- lpDosTask->hModule = hModule;
+  lpDosTask->hModule = hModule;
 
- pModule = (NE_MODULE *)GlobalLock16(hModule);
- pModule->lpDosTask = lpDosTask;
+  pModule = (NE_MODULE *)GlobalLock16(hModule);
+  pModule->lpDosTask = lpDosTask;
  
- lpDosTask->img=NULL; lpDosTask->mm_name[0]=0; lpDosTask->mm_fd=-1;
+  lpDosTask->img=NULL; lpDosTask->mm_name[0]=0; lpDosTask->mm_fd=-1;
+ } else lpDosTask=pModule->lpDosTask;
  err = MZ_LoadImage( hFile, cmdline, env, lpDosTask, pModule );
  _lclose16(hFile);
- pModule->dos_image = lpDosTask->img;
- if (err<32) {
+ if (alloc) {
+  pModule->dos_image = lpDosTask->img;
+  if (err<32) {
+   if (lpDosTask->mm_name[0]!=0) {
+    if (lpDosTask->img!=NULL) munmap(lpDosTask->img,0x110000-START_OFFSET);
+    if (lpDosTask->mm_fd>=0) close(lpDosTask->mm_fd);
+    unlink(lpDosTask->mm_name);
+   } else
+    if (lpDosTask->img!=NULL) VirtualFree(lpDosTask->img,0x110000,MEM_RELEASE);
+   return err;
+  }
+  err = MZ_InitTask( lpDosTask );
   if (lpDosTask->mm_name[0]!=0) {
-   if (lpDosTask->img!=NULL) munmap(lpDosTask->img,0x110000-START_OFFSET);
-   if (lpDosTask->mm_fd>=0) close(lpDosTask->mm_fd);
+   /* we unlink the temp file here to avoid leaving a mess in /tmp
+      if/when Wine crashes; the mapping still remains open, though */
    unlink(lpDosTask->mm_name);
-  } else
-   if (lpDosTask->img!=NULL) VirtualFree(lpDosTask->img,0x110000,MEM_RELEASE);
-  return err;
- }
- err = MZ_InitTask( lpDosTask );
- if (lpDosTask->mm_name[0]!=0) {
-  /* we unlink the temp file here to avoid leaving a mess in /tmp
-     if/when Wine crashes; the mapping still remains open, though */
-  unlink(lpDosTask->mm_name);
- }
- if (err<32) {
-  MZ_KillModule( lpDosTask );
-  /* FIXME: cleanup hModule */
-  return err;
- }
+  }
+  if (err<32) {
+   MZ_KillModule( lpDosTask );
+   /* FIXME: cleanup hModule */
+   return err;
+  }
 
- hInstance = NE_CreateInstance(pModule, NULL, (cmdline == NULL));
- PROCESS_Create( pModule, cmdline, env, hInstance, 0, startup, info );
- return hInstance;
+  hInstance = NE_CreateInstance(pModule, NULL, (cmdline == NULL));
+  PROCESS_Create( pModule, cmdline, env, hInstance, 0, startup, info );
+  return hInstance;
+ } else {
+  return (err<32) ? err : pTask->hInstance;
+ }
 }
 
 void MZ_KillModule( LPDOSTASK lpDosTask )
@@ -340,7 +383,7 @@
  return 0;
 }
 
-#else /* !linux */
+#else /* !MZ_SUPPORTED */
 
 HINSTANCE16 MZ_CreateProcess( LPCSTR name, LPCSTR cmdline, LPCSTR env, 
                               LPSTARTUPINFO32A startup, LPPROCESS_INFORMATION info )
diff --git a/loader/module.c b/loader/module.c
index 0804df3..1bbe11a 100644
--- a/loader/module.c
+++ b/loader/module.c
@@ -306,20 +306,22 @@
     else
     {
         hInstance = NE_LoadModule( name, &hPrevInstance, FALSE, FALSE );
-        pModule = hInstance >= 32 ? NE_GetPtr( hInstance ) : NULL;
+        if (hInstance < 32) return hInstance;
+
+        if (   !(pModule = NE_GetPtr(hInstance)) 
+            ||  (pModule->flags & NE_FFLAGS_LIBMODULE))
+        {
+            /* FIXME: cleanup */
+            return 11;
+        }
     }
 
     /* Create a task for this instance */
 
-    if (pModule && !(pModule->flags & NE_FFLAGS_LIBMODULE))
-    {
-        PDB32 *pdb;
+    pModule->flags |= NE_FFLAGS_GUI;  /* FIXME: is this necessary? */
 
-	pModule->flags |= NE_FFLAGS_GUI;
-
-        pdb = PROCESS_Create( pModule, cmd_line, env, hInstance,
-                              hPrevInstance, startup, info );
-    }
+    PROCESS_Create( pModule, cmd_line, env, hInstance,
+                    hPrevInstance, startup, info );
 
     return hInstance;
 }
@@ -331,39 +333,63 @@
 HINSTANCE16 WINAPI LoadModule16( LPCSTR name, LPVOID paramBlock )
 {
     LOADPARAMS *params;
-    LOADPARAMS32 params32;
-    HINSTANCE16 hInstance;
-    LPSTR cmd_line;
+    LPSTR cmd_line, new_cmd_line;
+    LPCVOID env = NULL;
+    STARTUPINFO32A startup;
+    PROCESS_INFORMATION info;
+    HINSTANCE16 hInstance, hPrevInstance;
+    NE_MODULE *pModule;
+    PDB32 *pdb;
+
+    /* Load module */
 
     if (!paramBlock || (paramBlock == (LPVOID)-1))
         return LoadLibrary16( name );
 
-    /* Transfer arguments to 32-bit param-block */
-    params = (LOADPARAMS *)paramBlock;
-    memset( &params32, '\0', sizeof(params32) );
+    hInstance = NE_LoadModule( name, &hPrevInstance, FALSE, FALSE );
+    if (   hInstance < 32 || !(pModule = NE_GetPtr(hInstance))
+        || (pModule->flags & NE_FFLAGS_LIBMODULE)) 
+        return hInstance;
 
+    /* Create a task for this instance */
+
+    pModule->flags |= NE_FFLAGS_GUI;  /* FIXME: is this necessary? */
+
+    params = (LOADPARAMS *)paramBlock;
     cmd_line = (LPSTR)PTR_SEG_TO_LIN( params->cmdLine );
     if (!cmd_line) cmd_line = "";
     else if (*cmd_line) cmd_line++;  /* skip the length byte */
 
-    if (!(params32.lpCmdLine = HeapAlloc( GetProcessHeap(), 0,
-                                          strlen(cmd_line)+strlen(name)+2 )))
+    if (!(new_cmd_line = HeapAlloc( GetProcessHeap(), 0,
+                                    strlen(cmd_line)+strlen(name)+2 )))
         return 0;
-    strcpy( params32.lpCmdLine, name );
-    strcat( params32.lpCmdLine, " " );
-    strcat( params32.lpCmdLine, cmd_line );
+    strcpy( new_cmd_line, name );
+    strcat( new_cmd_line, " " );
+    strcat( new_cmd_line, cmd_line );
 
-    if (params->hEnvironment)
-        params32.lpEnvAddress = GlobalLock16( params->hEnvironment );
+    if (params->hEnvironment) env = GlobalLock16( params->hEnvironment );
+
+    memset( &info, '\0', sizeof(info) );
+    memset( &startup, '\0', sizeof(startup) );
+    startup.cb = sizeof(startup);
     if (params->showCmd)
-        params32.lpCmdShow = PTR_SEG_TO_LIN( params->showCmd );
+    {
+        startup.dwFlags = STARTF_USESHOWWINDOW;
+        startup.wShowWindow = ((UINT16 *)PTR_SEG_TO_LIN(params->showCmd))[1];
+    }
 
-    /* Call LoadModule32 */
-    hInstance = LoadModule32( name, &params32 );
+    pdb = PROCESS_Create( pModule, new_cmd_line, env, 
+                          hInstance, hPrevInstance, &startup, &info );
 
-    /* Clean up */
+    CloseHandle( info.hThread );
+    CloseHandle( info.hProcess );
+
     if (params->hEnvironment) GlobalUnlock16( params->hEnvironment );
-    HeapFree( GetProcessHeap(), 0, params32.lpCmdLine );
+    HeapFree( GetProcessHeap(), 0, new_cmd_line );
+
+    /* Start task */
+
+    if (pdb) TASK_StartTask( pdb->task );
 
     return hInstance;
 }
@@ -521,11 +547,9 @@
                                       lpStartupInfo, lpProcessInfo );
 
     /* Try DOS module */
-#ifdef linux
     if (hInstance == 11)
         hInstance = MZ_CreateProcess( name, cmdline, lpEnvironment, 
                                       lpStartupInfo, lpProcessInfo );
-#endif
 
     if (hInstance < 32)
     {
diff --git a/loader/ne/resource.c b/loader/ne/resource.c
index 90fb416..da37944 100644
--- a/loader/ne/resource.c
+++ b/loader/ne/resource.c
@@ -383,7 +383,7 @@
 
     assert( !__winelib );  /* Can't use Win16 resource functions in Winelib */
 
-    if ((fd = _lopen16( NE_MODULE_NAME(pModule), OF_READ )) != -1)
+    if ((fd = _lopen16( NE_MODULE_NAME(pModule), OF_READ )) != HFILE_ERROR16)
     {
         WORD sizeShift = *(WORD *)((char *)pModule + pModule->res_table);
         NE_NAMEINFO *pNameInfo = (NE_NAMEINFO*)((char*)pModule + hRsrc);
diff --git a/loader/ne/segment.c b/loader/ne/segment.c
index ff92d5c..8215c30 100644
--- a/loader/ne/segment.c
+++ b/loader/ne/segment.c
@@ -106,10 +106,11 @@
         stack16Top->ip = 0;
         stack16Top->cs = 0;
 	TRACE(dll,"CallLoadAppSegProc(hmodule=0x%04x,hf=0x%04x,segnum=%d\n",
-		pModule->self,hf,segnum
-	);
+		pModule->self,hf,segnum );
  	newselector = Callbacks->CallLoadAppSegProc(selfloadheader->LoadAppSeg,
-                                                   pModule->self, hf, segnum );
+                                                    pModule->self,
+                                                    HFILE32_TO_HFILE16(hf),
+                                                    segnum );
 	TRACE(dll,"Ret CallLoadAppSegProc: selector = 0x%04x\n",newselector);
         _lclose32( hf );
  	if (newselector != oldselector) {
@@ -218,7 +219,7 @@
                             *((BYTE *)pTarget + pTarget->name_table),
                             (char *)pTarget + pTarget->name_table + 1,
                             ordinal );
-                    address = 0xdeadbeef;
+                    address = (FARPROC16)0xdeadbeef;
                 }
             }
             if (TRACE_ON(fixup))
@@ -248,7 +249,7 @@
                     *((BYTE *)pTarget + pTarget->name_table),
                     (char *)pTarget + pTarget->name_table + 1, func_name );
             }
-            if (!address) address = 0xdeadbeef;
+            if (!address) address = (FARPROC16) 0xdeadbeef;
             if (TRACE_ON(fixup))
             {
 	        NE_MODULE *pTarget = NE_GetPtr( module );
@@ -418,8 +419,10 @@
         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,"CallBootAppProc(hModule=0x%04x,hf=0x%04x)\n",pModule->self,
+              HFILE32_TO_HFILE16(hf));
+        Callbacks->CallBootAppProc(selfloadheader->BootApp, pModule->self,
+                                   HFILE32_TO_HFILE16(hf));
 	TRACE(dll,"Return from CallBootAppProc\n");
         _lclose32(hf);
         /* some BootApp procs overwrite the selector of dgroup */
diff --git a/loader/pe_image.c b/loader/pe_image.c
index 8ef9b73..dd26b2b 100644
--- a/loader/pe_image.c
+++ b/loader/pe_image.c
@@ -911,8 +911,7 @@
     if ((PE_HEADER(wm->module)->FileHeader.Characteristics & IMAGE_FILE_DLL) &&
         (PE_HEADER(wm->module)->OptionalHeader.AddressOfEntryPoint)
     ) {
-        DWORD (CALLBACK *entry)(HMODULE32,DWORD,LPVOID) = (void*)RVA_PTR( wm->module,
-                                          OptionalHeader.AddressOfEntryPoint );
+        DLLENTRYPROC32 entry = (void*)RVA_PTR( wm->module,OptionalHeader.AddressOfEntryPoint );
         TRACE(relay, "CallTo32(entryproc=%p,module=%08x,type=%ld,res=%p)\n",
                        entry, wm->module, type, lpReserved );
         entry( wm->module, type, lpReserved );
diff --git a/loader/resource.c b/loader/resource.c
index 798b8a5..6d11b55 100644
--- a/loader/resource.c
+++ b/loader/resource.c
@@ -85,7 +85,7 @@
 	case MODULE32_PE:
 	    ret =  PE_FindResourceEx32W(wm,name,type,lang);
         if ( ret==0 )
-          ERR(resource,"%s not found!\n",debugres_w (name));
+          ERR(resource,"(0x%08lx(%s),%s not found!\n",hModule,wm->modname,debugres_w (name));
 	    return ret;
 	default:
 	    ERR(module,"unknown module type %d\n",wm->type);
diff --git a/loader/task.c b/loader/task.c
index 099333e..df06353 100644
--- a/loader/task.c
+++ b/loader/task.c
@@ -1032,6 +1032,10 @@
     BYTE *thunk,*lfunc;
     SEGPTR thunkaddr;
 
+    if (!func) {
+      ERR(task, "Ouch ! MakeProcInstance called with func == NULL !\n");
+      return (FARPROC16)0; /* Windows seems to do the same */
+    }
     if (!hInstance) hInstance = CURRENT_DS;
     thunkaddr = TASK_AllocThunk( GetCurrentTask() );
     if (!thunkaddr) return (FARPROC16)0;
diff --git a/memory/global.c b/memory/global.c
index f2ba8f0..fd8bb5b 100644
--- a/memory/global.c
+++ b/memory/global.c
@@ -1190,6 +1190,12 @@
 	 /* make a fixed block moveable
 	  * actually only NT is able to do this. But it's soo simple
 	  */
+         if (hmem == 0)
+         {
+	     ERR(global, "GlobalReAlloc32 with null handle!\n");
+             SetLastError( ERROR_INVALID_ACCESS_TO_MEM );
+    	     return 0;
+         }
 	 size=HeapSize(GetProcessHeap(), 0, (LPVOID) hmem);
 	 hnew=GlobalAlloc32( flags, size);
 	 palloc=GlobalLock32(hnew);
@@ -1501,7 +1507,7 @@
  *
  * Combined GlobalUnlock and GlobalFree.
  */
-WORD WOWGlobalUnlockFree16(DWORD vpmem) {
+WORD WINAPI WOWGlobalUnlockFree16(DWORD vpmem) {
     if (!GlobalUnlock16(HIWORD(vpmem)))
     	return 0;
     return GlobalFree16(HIWORD(vpmem));
diff --git a/memory/string.c b/memory/string.c
index 85f77f2..decad7a 100644
--- a/memory/string.c
+++ b/memory/string.c
@@ -213,7 +213,11 @@
     }
     while (*str1)
     {
-        if ((res = towupper(*str1) - towupper(*str2)) != 0) return res;
+        if ((*str1<0x100 ) && (*str2<0x100)) {
+	    if ((res = toupper(*str1) - toupper(*str2)) != 0) return res;
+	} else {
+	    if ((res = towupper(*str1) - towupper(*str2)) != 0) return res;
+	}
         str1++;
         str2++;
     }
diff --git a/memory/virtual.c b/memory/virtual.c
index 801237c..3b4e94f 100644
--- a/memory/virtual.c
+++ b/memory/virtual.c
@@ -5,6 +5,7 @@
  */
 
 #include <assert.h>
+#include <errno.h>
 #include <fcntl.h>
 #include <unistd.h>
 #include <stdlib.h>
@@ -1111,7 +1112,7 @@
     /* Check parameters */
 
     TRACE(virtual,"(%x,%p,%08lx,%08lx%08lx,%s)\n",
-          hFile, sa, protect, size_high, size_low, name );
+          hFile, sa, protect, size_high, size_low, debugstr_a(name) );
 
     vprot = VIRTUAL_GetProt( protect );
     if (protect & SEC_RESERVE)
@@ -1359,9 +1360,17 @@
     ptr = (UINT32)FILE_dommap( mapping->file, addr, 0, size, 0, offset_low,
                                VIRTUAL_GetUnixProt( mapping->protect ),
                                flags );
-    if (ptr == (UINT32)-1)
-    {
-        SetLastError( ERROR_OUTOFMEMORY );
+    if (ptr == (UINT32)-1) {
+        /* KB: Q125713, 25-SEP-1995, "Common File Mapping Problems and
+	 * Platform Differences": 
+	 * Windows NT: ERROR_INVALID_PARAMETER
+	 * Windows 95: ERROR_INVALID_ADDRESS.
+	 * FIXME: So should we add a module dependend check here? -MM
+	 */
+	if (errno==ENOMEM)
+	    SetLastError( ERROR_OUTOFMEMORY );
+	else
+	    SetLastError( ERROR_INVALID_PARAMETER );
         goto error;
     }
 
diff --git a/misc/Makefile.in b/misc/Makefile.in
index c1d3170..bc5f783 100644
--- a/misc/Makefile.in
+++ b/misc/Makefile.in
@@ -15,7 +15,7 @@
 	ddeml.c \
 	debugstr.c \
 	error.c \
-	imagelist.c \
+	imm.c \
 	lstr.c \
 	lzexpand.c \
 	main.c \
diff --git a/misc/crtdll.c b/misc/crtdll.c
index 6b808a4..85e99de 100644
--- a/misc/crtdll.c
+++ b/misc/crtdll.c
@@ -877,7 +877,7 @@
  *
  * convert a string in place to lowercase 
  */
-LPSTR CRTDLL__strlwr(LPSTR x)
+LPSTR __cdecl CRTDLL__strlwr(LPSTR x)
 {
   unsigned char *y =x;
   
@@ -895,7 +895,7 @@
 /*********************************************************************
  *                  system       (CRTDLL.485)
  */
-INT32 CRTDLL_system(LPSTR x)
+INT32 __cdecl CRTDLL_system(LPSTR x)
 {
 #define SYSBUF_LENGTH 1500
   char buffer[SYSBUF_LENGTH];
diff --git a/misc/ddeml.c b/misc/ddeml.c
index 7a5c47a..069b1fc 100644
--- a/misc/ddeml.c
+++ b/misc/ddeml.c
@@ -56,6 +56,10 @@
                                 DWORD afCmd, DWORD ulRes )
 {
     FIXME(ddeml, "(%p,%p,%ld,%ld): stub\n",pidInst,pfnCallback,afCmd,ulRes);
+
+    if(pidInst)
+      *pidInst = 0;
+
     return DMLERR_NO_ERROR;
 }
 
@@ -528,3 +532,45 @@
      return 0;
 }
 
+
+/*****************************************************************
+ *            PackDDElParam (USER32.414)
+ *
+ * RETURNS
+ *   success: nonzero
+ *   failure: zero
+ */
+UINT32 WINAPI PackDDElParam32(UINT32 msg, UINT32 uiLo, UINT32 uiHi)
+{
+    FIXME(ddeml, "stub.\n");
+    return 0;
+}
+
+
+/*****************************************************************
+ *            UnpackDDElParam (USER32.562)
+ *
+ * RETURNS
+ *   success: nonzero
+ *   failure: zero
+ */
+UINT32 WINAPI UnpackDDElParam32(UINT32 msg, UINT32 lParam,
+				UINT32 *uiLo, UINT32 *uiHi)
+{
+    FIXME(ddeml, "stub.\n");
+    return 0;
+}
+
+
+/*****************************************************************
+ *            FreeDDElParam (USER32.204)
+ *
+ * RETURNS
+ *   success: nonzero
+ *   failure: zero
+ */
+UINT32 WINAPI FreeDDElParam32(UINT32 msg, UINT32 lParam)
+{
+    FIXME(ddeml, "stub.\n");
+    return 0;
+}
diff --git a/misc/imm.c b/misc/imm.c
new file mode 100644
index 0000000..579477d
--- /dev/null
+++ b/misc/imm.c
@@ -0,0 +1,546 @@
+/*
+ *	IMM32 library
+ *
+ *	Copyright 1998	Patrik Stridvall
+ */
+
+#include "windows.h"
+#include "wintypes.h"
+#include "imm.h"
+
+/***********************************************************************
+ *           ImmAssociateContext32 (IMM32.1)
+ */
+
+HIMC32 WINAPI ImmAssociateContext32(HWND32 hWnd, HIMC32 hIMC)
+{
+	return NULL;
+}
+
+/***********************************************************************
+ *           ImmConfigureIME32A (IMM32.2)
+ */
+
+BOOL32 WINAPI ImmConfigureIME32A(HKL32 hKL, HWND32 hWnd, DWORD dwMode, LPVOID lpData)
+{
+	return FALSE;
+}
+
+/***********************************************************************
+ *           ImmConfigureIME32W (IMM32.3)
+ */
+
+BOOL32 WINAPI ImmConfigureIME32W(HKL32 hKL, HWND32 hWnd, DWORD dwMode, LPVOID lpData)
+{
+	return FALSE;
+}
+
+/***********************************************************************
+ *           ImmCreateContext32 (IMM32.4)
+ */
+
+HIMC32 WINAPI ImmCreateContext32()
+{
+	return NULL;
+}
+
+/***********************************************************************
+ *           ImmDestroyContext32 (IMM32.7)
+ */
+
+BOOL32 WINAPI ImmDestroyContext32(HIMC32 hIMC)
+{
+	return FALSE;
+}
+
+
+/***********************************************************************
+ *           ImmEnumRegisterWord32A (IMM32.10)
+ */
+
+UINT32 WINAPI ImmEnumRegisterWord32A(
+    HKL32 hKL, REGISTERWORDENUMPROCA lpfnEnumProc, 
+	LPCSTR lpszReading, DWORD dwStyle, 
+	LPCSTR lpszRegister, LPVOID lpData)
+{
+	return 0;
+}
+
+/***********************************************************************
+ *           ImmEnumRegisterWord32W (IMM32.11)
+ */
+
+UINT32 WINAPI ImmEnumRegisterWord32W(
+    HKL32 hKL, REGISTERWORDENUMPROCW lpfnEnumProc,
+	LPCWSTR lpszReading, DWORD dwStyle, 
+	LPCWSTR lpszRegister, LPVOID lpData)
+{
+	return 0;
+}
+
+/***********************************************************************
+ *           ImmEscape32A (IMM32.12)
+ */
+
+LRESULT WINAPI ImmEscape32A(HKL32 hKL, HIMC32 hIMC, UINT32 uEscape, LPVOID lpData)
+{
+	return 0;
+}
+
+/***********************************************************************
+ *           ImmEscape32W (IMM32.13)
+ */
+
+LRESULT WINAPI ImmEscape32W(HKL32 hKL, HIMC32 hIMC, UINT32 uEscape, LPVOID lpData)
+{
+	return 0;
+}
+
+/***********************************************************************
+ *           ImmGetCandidateList32A (IMM32.15)
+ */
+
+DWORD WINAPI ImmGetCandidateList32A(HIMC32 hIMC, DWORD deIndex, LPCANDIDATELIST lpCandList, DWORD dwBufLen)
+{
+	return 0;
+}
+
+/***********************************************************************
+ *           ImmGetCandidateListCount32A (IMM32.16)
+ */
+
+DWORD WINAPI ImmGetCandidateListCount32A(HIMC32 hIMC, LPDWORD lpdwListCount)
+{
+	return 0;
+}
+
+/***********************************************************************
+ *           ImmGetCandidateListCount32W (IMM32.17)
+ */
+
+DWORD WINAPI ImmGetCandidateListCount32W(HIMC32 hIMC, LPDWORD lpdwListCount)
+{
+	return 0;
+}
+
+/***********************************************************************
+ *           ImmGetCandidateList32W (IMM32.18)
+ */
+
+DWORD WINAPI ImmGetCandidateList32W(HIMC32 hIMC, DWORD deIndex, LPCANDIDATELIST lpCandList, DWORD dwBufLen)
+{
+	return 0;
+}
+
+/***********************************************************************
+ *           ImmGetCandidateWindow32 (IMM32.19)
+ */
+
+BOOL32 WINAPI ImmGetCandidateWindow32(HIMC32 hIMC, DWORD dwBufLen, LPCANDIDATEFORM lpCandidate)
+{
+	return FALSE;
+}
+
+/***********************************************************************
+ *           ImmGetCompositionFont32A (IMM32.20)
+ */
+
+BOOL32 WINAPI ImmGetCompositionFont32A(HIMC32 hIMC, LPLOGFONT32A lplf)
+{
+	return FALSE;
+}
+
+/***********************************************************************
+ *           ImmGetCompositionFont32W (IMM32.21)
+ */
+
+BOOL32 WINAPI ImmGetCompositionFont32W(HIMC32 hIMC, LPLOGFONT32W lplf)
+{
+	return FALSE;
+}
+
+/***********************************************************************
+ *           ImmGetCompositionString32A (IMM32.22)
+ */
+
+LONG WINAPI ImmGetCompositionString32A(HIMC32 hIMC, DWORD dwIndex, LPVOID lpBuf, DWORD dwBufLen)
+{
+	return 0;
+}
+
+/***********************************************************************
+ *           ImmGetCompositionString32W (IMM32.23)
+ */
+
+LONG WINAPI ImmGetCompositionString32W(HIMC32 hIMC, DWORD dwIndex, LPVOID lpBuf, DWORD dwBufLen)
+{
+	return 0;
+}
+
+/***********************************************************************
+ *           ImmGetCompositionWindow32 (IMM32.24)
+ */
+
+BOOL32 WINAPI ImmGetCompositionWindow32(HIMC32 hIMC, LPCOMPOSITIONFORM lpCompForm)
+{
+	return 0;
+}
+
+/***********************************************************************
+ *           ImmGetContext32 (IMM32.25)
+ */
+
+HIMC32 WINAPI ImmGetContext32(HWND32 hWnd)
+{
+	return NULL;
+}
+
+/***********************************************************************
+ *           ImmGetConversionList32A (IMM32.26)
+ */
+
+DWORD WINAPI ImmGetConversionList32A(
+	HKL32 hKL, HIMC32 hIMC,
+	LPCSTR pSrc, LPCANDIDATELIST lpDst,
+	DWORD dwBufLen, UINT32 uFlag)
+{
+	return 0;
+}
+
+/***********************************************************************
+ *           ImmGetConversionList32W (IMM32.27)
+ */
+
+DWORD WINAPI ImmGetConversionList32W(
+	HKL32 hKL, HIMC32 hIMC,
+	LPCWSTR pSrc, LPCANDIDATELIST lpDst,
+	DWORD dwBufLen, UINT32 uFlag)
+{
+	return 0;
+}
+
+/***********************************************************************
+ *           ImmGetConversionStatus32 (IMM32.28)
+ */
+
+BOOL32 WINAPI ImmGetConversionStatus32(
+	HIMC32 hIMC, LPDWORD lpfdwConversion, LPDWORD lpfdwSentence)
+{
+	return FALSE;
+}
+
+/***********************************************************************
+ *           ImmGetDefaultIMEWnd32 (IMM32.29)
+ */
+
+HWND32 WINAPI ImmGetDefaultIMEWnd32(HWND32 hWnd)
+{
+	return NULL;
+}
+
+/***********************************************************************
+ *           ImmGetDescription32A (IMM32.30)
+ */
+
+UINT32 WINAPI ImmGetDescription32A(HKL32 hKL, LPSTR lpszDescription, UINT32 uBufLen)
+{
+	return 0;
+}
+
+/***********************************************************************
+ *           ImmGetDescription32W (IMM32.31)
+ */
+
+UINT32 WINAPI ImmGetDescription32W(HKL32 hKL, LPWSTR lpszDescription, UINT32 uBufLen)
+{
+	return 0;
+}
+
+/***********************************************************************
+ *           ImmGetGuideLine32A (IMM32.32)
+ */
+
+DWORD WINAPI ImmGetGuideLine32A(HIMC32 hIMC, DWORD dwIndex, LPSTR lpBuf, DWORD dwBufLen)
+{
+	return 0;
+}
+
+/***********************************************************************
+ *           ImmGetGuideLine32W (IMM32.33)
+ */
+
+DWORD WINAPI ImmGetGuideLine32W(HIMC32 hIMC, DWORD dwIndex, LPWSTR lpBuf, DWORD dwBufLen)
+{
+	return 0;
+}
+
+/***********************************************************************
+ *           ImmGetIMEFileName32A (IMM32.38)
+ */
+
+UINT32 WINAPI ImmGetIMEFileName32A(HKL32 hKL, LPSTR lpszFileName, UINT32 uBufLen)
+{
+	return 0;
+}
+
+/***********************************************************************
+ *           ImmGetIMEFileName32W (IMM32.39)
+ */
+
+UINT32 WINAPI ImmGetIMEFileName32W(HKL32 hKL, LPWSTR lpszFileName, UINT32 uBufLen)
+{
+	return 0;
+}
+
+/***********************************************************************
+ *           ImmGetOpenStatus32 (IMM32.40)
+ */
+
+BOOL32 WINAPI ImmGetOpenStatus32(HIMC32 hIMC)
+{
+	return FALSE;
+}
+
+/***********************************************************************
+ *           ImmGetProperty32 (IMM32.41)
+ */
+
+DWORD WINAPI ImmGetProperty32(HKL32 hKL, DWORD fdwIndex)
+{
+	return 0;
+}
+
+/***********************************************************************
+ *           ImmGetRegisterWordStyle32A (IMM32.42)
+ */
+
+UINT32 WINAPI ImmGetRegisterWordStyle32A(HKL32 hKL, UINT32 nItem, LPSTYLEBUFA lpStyleBuf)
+{
+	return 0;
+}
+
+/***********************************************************************
+ *           ImmGetRegisterWordStyle32W (IMM32.43)
+ */
+
+UINT32 WINAPI ImmGetRegisterWordStyle32W(HKL32 hKL, UINT32 nItem, LPSTYLEBUFW lpStyleBuf)
+{
+	return 0;
+}
+
+/***********************************************************************
+ *           ImmGetStatusWindowPos32 (IMM32.44)
+ */
+
+BOOL32 WINAPI ImmGetStatusWindowPos32(HIMC32 hIMC, LPPOINT32 lpptPos)
+{
+	return FALSE;
+}
+
+/***********************************************************************
+ *           ImmGetVirtualKey32 (IMM32.45)
+ */
+
+UINT32 WINAPI ImmGetVirtualKey32(HWND32 hWnd)
+{
+	return 0;
+}
+
+/***********************************************************************
+ *           ImmInstallIME32A (IMM32.46)
+ */
+
+HKL32 WINAPI ImmInstallIME32A(LPCSTR lpszIMEFileName, LPCSTR lpszLayoutText)
+{
+	return NULL;
+}
+
+/***********************************************************************
+ *           ImmInstallIME32W (IMM32.47)
+ */
+
+HKL32 WINAPI ImmInstallIME32W(LPCWSTR lpszIMEFileName, LPCWSTR lpszLayoutText)
+{
+	return NULL;
+}
+
+/***********************************************************************
+ *           ImmIsIME32 (IMM32.48)
+ */
+
+BOOL32 WINAPI ImmIsIME32(HKL32 hKL)
+{
+	return FALSE;
+}
+
+/***********************************************************************
+ *           ImmIsUIMessage32A (IMM32.49)
+ */
+
+BOOL32 WINAPI ImmIsUIMessage32A(HWND32 hWndIME, UINT32 msg, WPARAM32 wParam, LPARAM lParam)
+{
+	return FALSE;
+}
+
+/***********************************************************************
+ *           ImmIsUIMessage32W (IMM32.50)
+ */
+
+BOOL32 WINAPI ImmIsUIMessage32W(HWND32 hWndIME, UINT32 msg, WPARAM32 wParam, LPARAM lParam)
+{
+	return FALSE;
+}
+
+/***********************************************************************
+ *           ImmNotifyIME32 (IMM32.53)
+ */
+
+BOOL32 WINAPI ImmNotifyIME32(HIMC32 hIMC, DWORD dwAction, DWORD dwIndex, DWORD dwValue)
+{
+	return FALSE;
+}
+
+/***********************************************************************
+ *           ImmRegisterWord32A (IMM32.55)
+ */
+
+BOOL32 WINAPI ImmRegisterWord32A(HKL32 hKL, LPCSTR lpszReading, DWORD dwStyle, LPCSTR lpszRegister)
+{
+	return FALSE;
+}
+
+/***********************************************************************
+ *           ImmRegisterWord32W (IMM32.56)
+ */
+
+BOOL32 WINAPI ImmRegisterWord32W(HKL32 hKL, LPCWSTR lpszReading, DWORD dwStyle, LPCWSTR lpszRegister)
+{
+	return FALSE;
+}
+
+/***********************************************************************
+ *           ImmReleaseContext32 (IMM32.57)
+ */
+
+BOOL32 WINAPI ImmReleaseContext32(HWND32 hWnd, HIMC32 hIMC)
+{
+	return FALSE;
+}
+
+/***********************************************************************
+ *           ImmSetCandidateWindow32 (IMM32.58)
+ */
+
+BOOL32 WINAPI ImmSetCandidateWindow32 (HIMC32 hIMC, LPCANDIDATEFORM lpCandidate)
+{
+	return FALSE;
+}
+
+/***********************************************************************
+ *           ImmSetCompositionFont32A (IMM32.59)
+ */
+
+BOOL32 WINAPI ImmSetCompositionFont32A(HIMC32 hIMC, LPLOGFONT32A lplf)
+{
+	return FALSE;
+}
+
+/***********************************************************************
+ *           ImmSetCompositionFont32W (IMM32.60)
+ */
+
+BOOL32 WINAPI ImmSetCompositionFont32W(HIMC32 hIMC, LPLOGFONT32W lplf)
+{
+	return FALSE;
+}
+
+/***********************************************************************
+ *           ImmSetCompositionString32A (IMM32.61)
+ */
+
+BOOL32 WINAPI ImmSetCompositionString32A(
+	HIMC32 hIMC, DWORD dwIndex, 
+	LPCVOID lpComp, DWORD dwCompLen, 
+	LPCVOID lpRead, DWORD dwReadLen)
+{
+	return FALSE;
+}
+
+/***********************************************************************
+ *           ImmSetCompositionString32W (IMM32.62)
+ */
+
+BOOL32 WINAPI ImmSetCompositionString32W(
+	HIMC32 hIMC, DWORD dwIndex,
+	LPCVOID lpComp, DWORD dwCompLen,
+	LPCVOID lpRead, DWORD dwReadLen)
+{
+	return FALSE;
+}
+
+/***********************************************************************
+ *           ImmSetCompositionWindow32 (IMM32.63)
+ */
+
+BOOL32 WINAPI ImmSetCompositionWindow32(HIMC32 hIMC, LPCOMPOSITIONFORM lpCompForm)
+{
+	return FALSE;
+}
+
+/***********************************************************************
+ *           ImmSetConversionStatus32 (IMM32.64)
+ */
+
+BOOL32 WINAPI ImmSetConversionStatus32(HIMC32 hIMC, DWORD fdwConversion, DWORD fdwSentence)
+{
+	return FALSE;
+}
+
+/***********************************************************************
+ *           ImmSetOpenStatus32 (IMM32.66)
+ */
+
+BOOL32 WINAPI ImmSetOpenStatus32(HIMC32 hIMC, BOOL32 fOpen)
+{
+	return FALSE;
+}
+
+/***********************************************************************
+ *           ImmSetStatusWindowPos32 (IMM32.67)
+ */
+
+BOOL32 WINAPI ImmSetStatusWindowPos32(HIMC32 hIMC, LPPOINT32 lpptPos)
+{
+	return FALSE;
+}
+
+
+/***********************************************************************
+ *           ImmSimulateHotKey32 (IMM32.69)
+ */
+
+BOOL32 WINAPI ImmSimulateHotKey32(HWND32 hWnd, DWORD dwHotKeyID)
+{
+	return FALSE;
+}
+
+/***********************************************************************
+ *           ImmUnregisterWord32A (IMM32.72)
+ */
+
+BOOL32 WINAPI ImmUnregisterWord32A(HKL32 hKL, LPCSTR lpszReading, DWORD dwStyle, LPCSTR lpszUnregister)
+{
+	return FALSE;
+}
+
+/***********************************************************************
+ *           ImmUnregisterWord32W (IMM32.?)
+ * FIXME
+ *     I haven't been able to find the ordinal for this function,
+ *     This means it can't be called from outside the DLL.
+ */
+
+BOOL32 WINAPI ImmUnregisterWord32W(HKL32 hKL, LPCWSTR lpszReading, DWORD dwStyle, LPCWSTR lpszUnregister)
+{
+	return FALSE;
+}
diff --git a/misc/lzexpand.c b/misc/lzexpand.c
index 495ea9b..d968b19 100644
--- a/misc/lzexpand.c
+++ b/misc/lzexpand.c
@@ -137,7 +137,7 @@
  */
 HFILE16 WINAPI LZInit16( HFILE16 hfSrc )
 {
-    return LZInit32( HFILE16_TO_HFILE32(hfSrc) );
+    return HFILE32_TO_HFILE16( LZInit32( HFILE16_TO_HFILE32(hfSrc) ) );
 }
 
 
@@ -307,7 +307,7 @@
  */
 INT16 WINAPI LZRead16( HFILE16 fd, LPVOID buf, UINT16 toread )
 {
-    return LZRead32(fd,buf,toread);
+    return LZRead32(HFILE16_TO_HFILE32(fd),buf,toread);
 }
 
 
@@ -412,7 +412,7 @@
  */
 LONG WINAPI LZSeek16( HFILE16 fd, LONG off, INT16 type )
 {
-    return LZSeek32( fd, off, type );
+    return LZSeek32( HFILE16_TO_HFILE32(fd), off, type );
 }
 
 
@@ -456,10 +456,11 @@
 
 /***********************************************************************
  *           LZCopy16   (LZEXPAND.1)
+ *
  */
 LONG WINAPI LZCopy16( HFILE16 src, HFILE16 dest )
 {
-    return LZCopy32( src, dest );
+    return LZCopy32( HFILE16_TO_HFILE32(src), HFILE16_TO_HFILE32(dest) );
 }
 
 
@@ -541,7 +542,7 @@
  */
 HFILE16 WINAPI LZOpenFile16( LPCSTR fn, LPOFSTRUCT ofs, UINT16 mode )
 {
-    return LZOpenFile32A( fn, ofs, mode );
+    return HFILE32_TO_HFILE16 ( LZOpenFile32A( fn, ofs, mode ) );
 }
 
 
@@ -601,7 +602,7 @@
  */
 void WINAPI LZClose16( HFILE16 fd )
 {
-    return LZClose32( fd );
+    return LZClose32( HFILE16_TO_HFILE32 (fd) );
 }
 
 
@@ -636,7 +637,7 @@
 LONG WINAPI CopyLZFile16( HFILE16 src, HFILE16 dest )
 {
     TRACE(file,"(%d,%d)\n",src,dest);
-    return LZCopy32(src,dest);
+    return LZCopy32(HFILE16_TO_HFILE32(src),HFILE16_TO_HFILE32(dest));
 }
 
 
diff --git a/misc/main.c b/misc/main.c
index 814c5a4..0925f5d 100644
--- a/misc/main.c
+++ b/misc/main.c
@@ -402,6 +402,14 @@
 	exit(1);
     }
 
+    /* tell the libX11 that we will do input method handling ourselves
+     * that keep libX11 from doing anything whith dead keys, allowing Wine
+     * to have total control over dead keys, that is this line allows
+     * them to work in Wine, even whith a libX11 including the dead key
+     * patches from Th.Quinot (http://Web.FdN.FR/~tquinot/dead-keys.en.html)
+     */
+    TSXOpenIM(display,NULL,NULL,NULL);
+
       /* Merge file and screen databases */
     if ((xrm_string = TSXResourceManagerString( display )) != NULL)
     {
diff --git a/misc/ntdll.c b/misc/ntdll.c
index 60f7f8c..48188aa 100644
--- a/misc/ntdll.c
+++ b/misc/ntdll.c
@@ -570,11 +570,8 @@
 
 /**************************************************************************
  *                 NTDLL_chkstk   (NTDLL.862)
- *
- * NOTES
- *    Should this be WINAPI?
  */
-void NTDLL_chkstk(void)
+void WINAPI NTDLL_chkstk(void)
 {
     /* FIXME: should subtract %eax bytes from stack pointer */
     FIXME(ntdll, "(void): stub\n");
diff --git a/misc/registry.c b/misc/registry.c
index b2d1de4..b0b81a8 100644
--- a/misc/registry.c
+++ b/misc/registry.c
@@ -690,7 +690,9 @@
 	lplpkey= &(lpkey->nextsub);
 	lpxkey	= *lplpkey;
 	while (lpxkey) {
-		if (!lstrcmpi32W(lpxkey->keyname,keyname))
+		if (	(lpxkey->keyname[0]==keyname[0]) && 
+			!lstrcmpi32W(lpxkey->keyname,keyname)
+		)
 			break;
 		lplpkey	= &(lpxkey->next);
 		lpxkey	= *lplpkey;
@@ -726,6 +728,7 @@
 				break;
 		} else {
 			if (	val->name!=NULL && 
+				val->name[0]==name[0] &&
 				!lstrcmpi32W(val->name,name)
 			)
 				break;
@@ -1080,7 +1083,7 @@
  *   header:
  * 	0 :		"RGKN"	- magic
  *      4 : DWORD	offset to first RGDB section
- *      8 : DWORD	offset to ?
+ *      8 : DWORD	offset to the root record
  * 	C..0x1B: 	? (fill in)
  *      0x20 ... offset_of_RGDB_part: Disk Key Entry structures
  *
@@ -1239,18 +1242,22 @@
 		bytesread+=len;\
 	}
 
-	do {
-	  XREAD(&dkh, sizeof (dkh));
-	  if (dkh.nrLS == nrLS) break;
+	while (curdata < next) {
+	  struct	dkh *xdkh = curdata;
 
-	  curdata += dkh.nextkeyoff - sizeof(dkh);
-	} while (curdata < next);
+	  bytesread += sizeof(dkh); /* FIXME... nextkeyoff? */
+	  if (xdkh->nrLS == nrLS) {
+	  	memcpy(&dkh,xdkh,sizeof(dkh));
+	  	curdata += sizeof(dkh);
+	  	break;
+	  }
+	  curdata += xdkh->nextkeyoff;
+	};
 
 	if (dkh.nrLS != nrLS) return (NULL);
 
-	if (nrgdb != dkh.nrMS) {
+	if (nrgdb != dkh.nrMS)
 	  return (NULL);
-	}
 
         assert((dkh.keynamelen<2) || curdata[0]);
 	lpxkey=_find_or_add_key(lpkey,strcvtA2W(curdata, dkh.keynamelen));
@@ -1287,9 +1294,7 @@
 			     len,
 			     info->lastmodified
 			     );
-
 	}
-
 	return (lpxkey);
 }
 
@@ -2798,10 +2803,6 @@
     if (!lpkey)
         return ERROR_INVALID_HANDLE;
 
-    /* None asked for */
-    if (!iValue)
-        return ERROR_SUCCESS;
-
     if (lpkey->nrofvalues <= iValue)
         return ERROR_NO_MORE_ITEMS;
 
diff --git a/misc/version.c b/misc/version.c
index ea0348c..181588f 100644
--- a/misc/version.c
+++ b/misc/version.c
@@ -323,62 +323,6 @@
 }
 
 /***********************************************************************
- * DllGetVersion [COMCTL32.25]
- *
- *
- *
- */
-HRESULT WINAPI COMCTL32_DllGetVersion(DLLVERSIONINFO *pdvi)
-{
-    VERSION ver = VERSION_GetVersion();
-
-    if (pdvi->cbSize != sizeof(DLLVERSIONINFO))
-    {
-        WARN(ver, "wrong DLLVERSIONINFO size from app");
-        return OLE_ERROR_SIZE; /* FIXME: is this error correct ? */
-    }
-
-    pdvi->dwPlatformID = VersionData[ver].getVersionEx.dwPlatformId;
-    switch(VersionData[ver].getVersion32)
-    {
-        case 0x80000a03: /* Win 3.1 */
-        {
-            pdvi->dwMajorVersion = 3;
-            pdvi->dwMinorVersion = 51;
-            pdvi->dwBuildNumber = 0;
-        }
-        break;
-        case 0xc0000004: /* Win 95 */
-        {
-            pdvi->dwMajorVersion = 4;
-            pdvi->dwMinorVersion = 0;
-            pdvi->dwBuildNumber = 950;
-        }
-        break;
-        case 0x04213303: /* NT 3.51 FIXME: correct ? */
-        {
-            pdvi->dwMajorVersion = 3;
-            pdvi->dwMinorVersion = 51;
-            pdvi->dwBuildNumber = 0x421;
-        }
-        break;
-        case 0x05650004: /* NT 4.0 FIXME: correct ? */
-        {
-            pdvi->dwMajorVersion = 4;
-            pdvi->dwMinorVersion = 0;
-            pdvi->dwBuildNumber = 0x565;
-        }
-        break;
-        default:
-        {
-            ERR(ver, "Unknown Windows version, please add it to the list !\n");
-        }
-        break;
-    }
-    return 0; /* winerror.h: NOERROR */
-}
-
-/***********************************************************************
  *           OaBuildVersion           [OLEAUT32.170]
  */
 UINT32 WINAPI OaBuildVersion()
diff --git a/misc/win32s16.c b/misc/win32s16.c
index 48b00cb..42913d1 100644
--- a/misc/win32s16.c
+++ b/misc/win32s16.c
@@ -10,7 +10,7 @@
 #include "windows.h"
 #include "debug.h"
 
-void BootTask()
+void WINAPI BootTask()
 {
 	MSG("BootTask(): should only be used by WIN32S.EXE.\n");
 }
diff --git a/misc/windebug.c b/misc/windebug.c
index c22c712..53b4e25 100644
--- a/misc/windebug.c
+++ b/misc/windebug.c
@@ -14,7 +14,7 @@
  *           WinNotify       (WINDEBUG.3)
  *  written without _any_ docu
  */
-void WinNotify(CONTEXT *context)
+void WINAPI WinNotify(CONTEXT *context)
 {
 	FIXME(dll, "(AX=%04x):stub.\n", AX_reg(context));
 	switch (AX_reg(context))
diff --git a/msdos/dosmem.c b/msdos/dosmem.c
index 1affb0a..85ee94d 100644
--- a/msdos/dosmem.c
+++ b/msdos/dosmem.c
@@ -79,6 +79,9 @@
 
        DWORD 	 DOSMEM_CollateTable;
 
+       DWORD	 DOSMEM_ErrorCall;
+       DWORD	 DOSMEM_ErrorBuffer;
+
 /* use 2 low bits of 'size' for the housekeeping */
 
 #define DM_BLOCK_DEBUG		0xABE00000
@@ -186,6 +189,60 @@
 }
 
 /***********************************************************************
+ *           DOSMEM_InitErrorTable
+ *
+ * Initialises the error tables (DOS 5+)
+ */
+static void DOSMEM_InitErrorTable()
+{
+	DWORD		x;
+	char 		*call;
+
+        /* We will use a snippet of real mode code that calls */
+        /* a WINE-only interrupt to handle moving the requested */
+        /* message into the buffer... */
+
+        /* FIXME - There is still something wrong... */
+
+        /* FIXME - Find hex values for opcodes...
+           
+           (On call, AX contains message number
+                     DI contains 'offset' (??)
+            Resturn, ES:DI points to counted string )
+
+           PUSH BX
+           MOV BX, AX
+           MOV AX, (arbitrary subfunction number)
+           INT (WINE-only interrupt)
+           POP BX
+           RET
+
+        */
+           
+        const int	code = 4;	
+        const int	buffer = 80; 
+        const int 	SIZE_TO_ALLOCATE = code + buffer;
+
+        /* FIXME - Complete rewrite of the table system to save */
+        /* precious DOS space. Now, we return the 0001:???? as */
+        /* DOS 4+ (??, it seems to be the case in MS 7.10) treats that */
+        /* as a special case and programs will use the alternate */
+        /* interface (a farcall returned with INT 24 (AX = 0x122e, DL = */
+        /* 0x08) which lets us have a smaller memory footprint anyway. */
+ 
+ 	x = GlobalDOSAlloc(SIZE_TO_ALLOCATE);  
+
+	DOSMEM_ErrorCall = MAKELONG(0,(x>>16));
+        DOSMEM_ErrorBuffer = DOSMEM_ErrorCall + code;
+
+	call = DOSMEM_MapRealToLinear(DOSMEM_ErrorCall);
+
+        memset(call, 0, SIZE_TO_ALLOCATE);
+
+        /* Fixme - Copy assembly into buffer here */        
+}
+
+/***********************************************************************
  *           DOSMEM_InitMemory
  *
  * Initialises the DOS memory structures.
@@ -245,6 +302,7 @@
         DOSMEM_FillBiosSegment();
         DOSMEM_InitMemory(0);
         DOSMEM_InitCollateTable();
+        DOSMEM_InitErrorTable();
     }
     else
         DOSMEM_InitMemory(hModule);
diff --git a/msdos/dpmi.c b/msdos/dpmi.c
index ebcfca1..48ae756 100644
--- a/msdos/dpmi.c
+++ b/msdos/dpmi.c
@@ -143,7 +143,7 @@
     ESI_reg(context) = call->esi;
     EDI_reg(context) = call->edi;
     EBP_reg(context) = call->ebp;
-    EFL_reg(context) = call->fl;
+    EFL_reg(context) = call->fl | 0x00020000; /* V86 */
     EIP_reg(context) = call->ip;
     ESP_reg(context) = call->sp;
     CS_reg(context)  = call->cs;
@@ -151,6 +151,7 @@
     ES_reg(context)  = call->es;
     FS_reg(context)  = call->fs;
     GS_reg(context)  = call->gs;
+    (char*)V86BASE(context) = DOSMEM_MemoryBase(0);
 }
 
 
@@ -188,160 +189,8 @@
     INT_GetRealModeContext( call, &realmode_ctx );
 
     RESET_CFLAG(context);
-    switch (BL_reg(context))
-    {
-    case 0x2f:	/* int2f */
-        switch (AH_reg(&realmode_ctx))
-        {
-        case 0x15:
-            /* MSCDEX hook */
-            do_mscdex( &realmode_ctx, 1 );
-            break;
-        case 0x7a:
-            /* NOVELL NetWare */
-            switch (AL_reg(&realmode_ctx))
-	    {
-                case 0x20:  /* Get VLM Call Address */
-                    /* return nothing -> NetWare not installed */
-                    break;
-                default:
-                    SET_CFLAG(context);
-                    break;
-            }
-	    break;
-        default:
-            SET_CFLAG(context);
-            break;
-        }
-        break;
-    case 0x21:	/* int21 */
-        switch (AH_reg(&realmode_ctx))
-        {
-        case 0x52:
-            ES_reg(&realmode_ctx) = 0;
-            EBX_reg(&realmode_ctx) = 0;
-            break;
-        case 0x65:
-            switch (AL_reg(&realmode_ctx))
-            {
-            case 0x06:
-                {/* get collate table */
-                    /* ES:DI is a REALMODE pointer to 5 byte dosmem 
-                     * we fill that with 0x6, realmode pointer to collateTB
-                     */
-                    char *table = DOSMEM_MapRealToLinear(
-                       MAKELONG(EDI_reg(&realmode_ctx),ES_reg(&realmode_ctx)));
-                    *(BYTE*)table      = 0x06;
-                    *(DWORD*)(table+1) = DOSMEM_CollateTable;
-                    CX_reg(&realmode_ctx) = 258;/*FIXME: size of table?*/
-                    break;
-                }
-            default:
-                SET_CFLAG(context);
-                break;
-            }
-            break;
-        case 0x44:
-            switch (AL_reg(&realmode_ctx))
-            {
-            case 0x0D:
-                {/* generic block device request */
-                    BYTE *dataptr = DOSMEM_MapRealToLinear(
-                       MAKELONG(EDX_reg(&realmode_ctx),DS_reg(&realmode_ctx)));
-                    int drive = DOS_GET_DRIVE(BL_reg(&realmode_ctx));
-                    if (CH_reg(&realmode_ctx) != 0x08)
-                    {
-                        SET_CFLAG(context);
-                        break;
-                    }
-                    switch (CL_reg(&realmode_ctx))
-                    {
-                    case 0x66:
-                        {
-			    char    label[12],fsname[9],path[4];
-			    DWORD   serial;
-
-			    strcpy(path,"x:\\");path[0]=drive+'A';
-			    GetVolumeInformation32A(path,label,12,&serial,NULL,NULL,fsname,9);
-			    *(WORD*)dataptr         = 0;
-			    memcpy(dataptr+2,&serial,4);
-			    memcpy(dataptr+6,label  ,11);
-			    memcpy(dataptr+17,fsname,8);
-			    break;
-                        }
-                    case 0x60:	/* get device parameters */
-                                /* used by defrag.exe of win95 */
-                        memset(dataptr, 0, 0x26);
-                        dataptr[0] = 0x04;
-                        dataptr[6] = 0; /* media type */
-                        if (drive > 1)
-                        {
-                            dataptr[1] = 0x05; /* fixed disk */
-                            setword(&dataptr[2], 0x01); /* non removable */
-                            setword(&dataptr[4], 0x300); /* # of cylinders */
-                        }
-                        else
-                        {
-                            dataptr[1] = 0x07; /* block dev, floppy */
-                            setword(&dataptr[2], 0x02); /* removable */
-                            setword(&dataptr[4], 80); /* # of cylinders */
-                        }
-                        CreateBPB(drive, &dataptr[7], FALSE);
-                        break;
-                    default:
-                        SET_CFLAG(context);
-                        break;
-                    }
-                }
-                break;
-            default:
-                SET_CFLAG(context);
-                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));
-
-		TRACE(int31,"TRUENAME %s\n",path);
-		if (!GetFullPathName32A( 
-		    path,
-		    128,
-		    (LPSTR)DOSMEM_MapRealToLinear(
-		    (ES_reg(&realmode_ctx)<<16)+DI_reg(&realmode_ctx)),
-		    NULL
-		))
-		    SET_CFLAG(context);
-		else
-		    AX_reg(&realmode_ctx) = 0;
-	    }
-	    break;
-        default:
-            SET_CFLAG(context);
-            break;
-        }
-        break;
-    default:
-        SET_CFLAG(context);
-        break;
-    }
-
+    if (INT_RealModeInterrupt( BL_reg(context), context ))
+      SET_CFLAG(context);
     if (EFL_reg(context)&1) {
       FIXME(int31,"%02x: EAX=%08lx EBX=%08lx ECX=%08lx EDX=%08lx\n",
 	    BL_reg(context), EAX_reg(&realmode_ctx), EBX_reg(&realmode_ctx), 
diff --git a/msdos/int10.c b/msdos/int10.c
index d58c29e..5017e01 100644
--- a/msdos/int10.c
+++ b/msdos/int10.c
@@ -7,33 +7,300 @@
 /* #define DEBUG_INT */
 #include "debug.h"
 
-
 /**********************************************************************
  *	    INT_Int10Handler
  *
  * Handler for int 10h (video).
+ * 
+ * NOTE:
+ *    Most INT 10 functions for text-mode, CGA, EGA, and VGA cards
+ *    are present in this list. (SVGA and XGA are not) That is not
+ *    to say that all these functions should be supported, but if
+ *    anyone is braindamaged enough to want to emulate one of these
+ *    beasts then this should get you started. 
+ *
+ * NOTE:
+ *    Several common graphical extensions used by Microsoft hook
+ *    off of here. I have *not* added them to this list (yet). They
+ *    include:
+ *
+ *    MSHERC.COM - More functionality for Hercules cards.
+ *    EGA.SYS (also MOUSE.COM) - More for EGA cards.
+ *    
+ *    Yes, MS also added this support into their mouse driver. Don't
+ *    ask me, I don't work for them.
+ *
+ * Joseph Pranevich - 9/98 
  */
+
 void WINAPI INT_Int10Handler( CONTEXT *context )
 {
     switch(AH_reg(context))
     {
-    case 0x0f:
-        AL_reg(context) = 0x5b;
+    case 0x00: /* SET VIDEO MODE */
+        /* If the mode is 0x02 or 0x07 then we are still in
+           80x25 text and can ignore the request */
+        if ((AL_reg(context) == 0x02) || (AL_reg(context) == 0x07))
+           break;
+
+        FIXME(int10, "Set Video Mode - Not Supported\n");
         break;
 
-    case 0x12:
-        if (BL_reg(context) == 0x10)
-        {
-            BX_reg(context) = 0x0003;
-            CX_reg(context) = 0x0009;
+    case 0x01: /* SET CURSOR SHAPE */
+        FIXME(int10, "Set Cursor Shape - Not Supported\n");
+        break;
+
+    case 0x02: /* SET CURSOR POSITION */
+        FIXME(int10, "Set Cursor Position - Not Supported\n");
+        break;
+
+    case 0x03: /* GET CURSOR POSITION AND SIZE */
+        FIXME(int10, "Get Cursor Position and Size - Not Supported\n");
+        CX_reg(context) = 0x0000; /* Bogus cursor data */
+        DX_reg(context) = 0x0000;
+        break;
+
+    case 0x04: /* READ LIGHT PEN POSITION */
+        FIXME(int10, "Read Light Pen Position - Not Supported\n");
+        AH_reg(context) = 0x00; /* Not down */
+        break;
+
+    case 0x05: /* SELECT ACTIVE DISPLAY PAGE */
+        FIXME(int10, "Select Active Display Page - Not Supported\n");
+        break;
+
+    case 0x06: /* SCROLL UP WINDOW */
+        FIXME(int10, "Scroll Up Window - Not Supported\n");
+        break;
+
+    case 0x07: /* SCROLL DOWN WINDOW */
+        FIXME(int10, "Scroll Down Window - Not Supported\n");
+        break;
+
+    case 0x08: /* READ CHARACTER AND ATTRIBUTE AT CURSOR POSITION */
+        FIXME(int10, 
+          "Read Character and Attribute at Cursor Position - Not Supported\n");
+        break;
+
+    case 0x09: /* WRITE CHARACTER AND ATTRIBUTE AT CURSOR POSITION */
+    case 0x0a: /* WRITE CHARACTER ONLY AT CURSOR POSITION */ 
+       while (CX_reg(context)) {
+           _lwrite16(1, &AL_reg(context), 1);
+           (CX_reg(context))--;
         }
         break;
-			
-    case 0x1a:
-        BX_reg(context) = 0x0008;
+
+    case 0x0b: 
+        switch BH_reg(context) {
+        case 0x00: /* SET BACKGROUND/BORDER COLOR */
+            FIXME(int10, "Set Background/Border Color - Not Supported\n");
+            break;
+        case 0x01: /* SET PALETTE */
+            FIXME(int10, "Set Palette - Not Supported\n");
+            break;
+        default:
+            FIXME(int10, "INT 10 AH = 0x0b BH = 0x%x - Unknown\n", 
+               BH_reg(context));
+            break;
+        }
+        break;
+
+    case 0x0c: /* WRITE GRAPHICS PIXEL */
+        /* Not in graphics mode, can ignore w/o error */
+        FIXME(int10, "Write Graphics Pixel - Not Supported\n");
+        break;
+        
+    case 0x0d: /* READ GRAPHICS PIXEL */
+        /* Not in graphics mode, can ignore w/o error */
+        FIXME(int10, "Read Graphics Pixel - Not Supported\n");
+        break;
+              
+    case 0x0e: /* TELETYPE OUTPUT */
+        _lwrite16(1, &AL_reg(context), 1);
+        break;
+
+    case 0x0f: /* GET CURRENT VIDEO MODE */
+        AL_reg(context) = 0x5b; /* WHY ARE WE RETURNING THIS? */
+        break;
+
+    case 0x10: 
+        switch AL_reg(context) {
+        case 0x00: /* SET SINGLE PALETTE REGISTER */
+            FIXME(int10, "Set Single Palette Register - Not Supported\n");
+            break;
+        case 0x01: /* SET BORDER (OVERSCAN) */
+            FIXME(int10, "Set Border (Overscan) - Not Supported\n");
+            break;
+        case 0x02: /* SET ALL PALETTE REGISTERS */
+            FIXME(int10, "Set all palette registers - Not Supported\n");
+            break;
+        case 0x03: /* TOGGLE INTENSITY/BLINKING BIT */
+            FIXME(int10, "Toggle Intensity/Blinking Bit - Not Supported\n");
+            break;
+        case 0x07: /* GET INDIVIDUAL PALETTE REGISTER */
+            FIXME(int10, "Get Individual Palette Register - Not Supported\n");
+            break;
+        case 0x08: /* READ OVERSCAN (BORDER COLOR) REGISTER */
+            FIXME(int10, 
+               "Read Overscan (Border Color) Register - Not Supported\n");
+            break;
+        case 0x09: /* READ ALL PALETTE REGISTERS AND OVERSCAN REGISTER */
+            FIXME(int10, 
+               "Read All Palette Registers and Overscan Register "
+               " - Not Supported\n");
+            break;
+        case 0x10: /* SET INDIVIDUAL DAC REGISTER */
+            FIXME(int10, "Set Individual DAC register - Not Supported\n");
+            break;
+        case 0x12: /* SET BLOCK OF DAC REGISTERS */
+            FIXME(int10, "Set Block of DAC registers - Not Supported\n");
+            break;
+        case 0x13: /* SELECT VIDEO DAC COLOR PAGE */
+            FIXME(int10, "Select video DAC color page - Not Supported\n");
+            break;
+        case 0x15: /* READ INDIVIDUAL DAC REGISTER */
+            FIXME(int10, "Read individual DAC register - Not Supported\n");
+            break;
+        case 0x17: /* READ BLOCK OF DAC REGISTERS */
+            FIXME(int10, "Read block of DAC registers - Not Supported\n");
+            break;
+        case 0x18: /* SET PEL MASK */
+            FIXME(int10, "Set PEL mask - Not Supported\n");
+            break;
+        case 0x19: /* READ PEL MASK */
+            FIXME(int10, "Read PEL mask - Not Supported\n");
+            break;
+        case 0x1a: /* GET VIDEO DAC COLOR PAGE STATE */
+            FIXME(int10, "Get video DAC color page state - Not Supported\n");
+            break;
+        case 0x1b: /* PERFORM GRAY-SCALE SUMMING */
+            FIXME(int10, "Perform Gray-scale summing - Not Supported\n");
+            break;
+        default:
+            FIXME(int10, "INT 10 AH = 0x10 AL = 0x%x - Unknown\n", 
+               AL_reg(context));
+            break;
+        }
+        break;
+
+    case 0x11: /* TEXT MODE CHARGEN */
+        /* Note that second subfunction is *almost* identical. */
+        /* See INTERRUPT.A for details. */
+        switch AH_reg(context) {
+        case 0x00: /* LOAD USER SPECIFIED PATTERNS */
+        case 0x10:
+            FIXME(int10, "Load User Specified Patterns - Not Supported\n");
+            break;
+        case 0x01: /* LOAD ROM MONOCHROME PATTERNS */
+        case 0x11:
+            FIXME(int10, "Load ROM Monochrome Patterns - Not Suppoted\n");
+            break;
+        case 0x02: /* LOAD ROM 8x8 DOUBLE-DOT PATTERNS */
+        case 0x12:
+            FIXME(int10, 
+                "Load ROM 8x8 Double Dot Patterns - Not Supported\n");       
+            break;
+        case 0x03: /* SET BLOCK SPECIFIER */
+            FIXME(int10, "Set Block Specifier - Not Supported\n");
+            break;
+        case 0x04: /* LOAD ROM 8x16 CHARACTER SET */
+        case 0x14:
+            FIXME(int10, "Load ROM 8x16 Character Set - Not Supported\n");
+            break;
+        case 0x20: /* SET USER 8x16 GRAPHICS CHARS */
+            FIXME(int10, "Set User 8x16 Graphics Chars - Not Supported\n");
+            break;
+        case 0x21: /* SET USER GRAPICS CHARACTERS */
+            FIXME(int10, "Set User Graphics Characters - Not Supported\n");
+            break;
+        case 0x22: /* SET ROM 8x14 GRAPHICS CHARS */
+            FIXME(int10, "Set ROM 8x14 Graphics Chars - Not Supported\n");
+            break;
+        case 0x23: /* SET ROM 8x8 DBL DOT CHARS */
+            FIXME(int10, 
+                "Set ROM 8x8 Dbl Dot Chars (Graphics) - Not Supported\n");
+            break;
+        case 0x24: /* LOAD 8x16 GRAPHIC CHARS */
+            FIXME(int10, "Load 8x16 Graphic Chars - Not Supported\n");
+            break;
+        case 0x30: /* GET FONT INFORMATION */
+            FIXME(int10, "Get Font Information - Not Supported\n");
+            break;
+        default:
+            FIXME(int10, "INT 10 AH = 0x11 AL = 0x%x - Unknown\n", 
+               AL_reg(context));
+            break;
+        }
+        break;
+        
+    case 0x12: /* ALTERNATE FUNCTION SELECT */
+        switch BL_reg(context) {
+        case 0x10: /* GET EGA INFO */
+            TRACE(int10, "EGA Info Requested");
+            BX_reg(context) = 0x0003;
+            CX_reg(context) = 0x0009;
+            break;
+        case 0x20: /* ALTERNATE PRTSC */
+            FIXME(int10, "Install Alternate Print Screen - Not Supported\n");
+            break;
+        case 0x30: /* SELECT VERTICAL RESOULTION */
+            FIXME(int10, "Select Vertical Resoultion - Not Supported\n");
+            break;
+        case 0x31: /* ENABLE/DISABLE PALETTE LOADING */
+            FIXME(int10, "Palette Loading - Not Supported\n");
+            break;
+        case 0x32: /* ENABLE/DISABLE VIDEO ADDRERSSING */
+            FIXME(int10, "Video Addressing - Not Supported\n");
+            break;
+        case 0x33: /* ENABLE/DISABLE GRAY SCALE SUMMING */
+            FIXME(int10, "Gray Scale Summing - Not Supported\n");
+            break;
+        case 0x34: /* ENABLE/DISABLE CURSOR EMULATION */
+            FIXME(int10, "Cursor Emulation - Not Supported\n");
+            break;
+        case 0x36: /* VIDEO ADDRESS CONTROL */
+            FIXME(int10, "Video Address Control - Not Supported\n");
+            break;
+        default:
+            FIXME(int10, "INT 10 AH = 0x11 AL = 0x%x - Unknown\n", 
+               AL_reg(context));
+            break;
+        }
+        break;
+
+    case 0x13: /* WRITE STRING */
+        /* This one does not imply that string be at cursor. */
+        FIXME(int10, "Write String - Not Supported\n");
+        break;
+                             
+    case 0x1a: 
+        switch AL_reg(context) {
+        case 0x00: /* GET DISPLAY COMBINATION CODE */
+            TRACE(int10, "Get Display Combination Code");
+            /* Why are we saying this? */
+            /* Do we need to check if we are in a windows or text app? */
+            BX_reg(context) = 0x0008; /* VGA w/ color analog display */
+            break;
+        case 0x01: /* SET DISPLAY COMBINATION CODE */
+            FIXME(int10, "Set Display Combination Code - Not Supported\n");
+            break;
+        default:
+            FIXME(int10, "INT 10 AH = 0x1a AL = 0x%x - Unknown\n", 
+               AL_reg(context));
+            break;
+        }
+    break;
+
+    case 0x1b: /* FUNCTIONALITY/STATE INFORMATION */
+        FIXME(int10, "Get Functionality/State Information - Not Supported\n");
+        break;
+
+    case 0x1c: /* SAVE/RESTORE VIDEO STATE */
+        FIXME(int10, "Save/Restore Video State - Not Supported\n");
         break;
 
     default:
+        FIXME(int10, "Unknown - 0x%x\n", AH_reg(context));
         INT_BARF( context, 0x10 );
     }
 }
diff --git a/msdos/int1a.c b/msdos/int1a.c
index 1436bb3..3504f67 100644
--- a/msdos/int1a.c
+++ b/msdos/int1a.c
@@ -39,8 +39,10 @@
 /**********************************************************************
  *	    INT_Int1aHandler
  *
- * Handler for int 1ah (date and time).
- */
+ * Handler for int 1ah 
+ *     0x00 - 0x07 - date and time
+ *     0x?? - 0x?? - Microsoft Real Time Compression Interface
+ */ 
 void WINAPI INT_Int1aHandler( CONTEXT *context )
 {
     time_t ltime;
@@ -49,7 +51,7 @@
 
     switch(AH_reg(context))
     {
-	case 0:
+	case 0x00:
             ticks = INT1A_GetTicksSinceMidnight();
             CX_reg(context) = HIWORD(ticks);
             DX_reg(context) = LOWORD(ticks);
@@ -57,7 +59,7 @@
             TRACE(int,"int1a: AH=00 -- ticks=%ld\n", ticks);
             break;
 		
-	case 2: 
+	case 0x02: 
 		ltime = time(NULL);
 		bdtime = localtime(&ltime);
 		
@@ -65,7 +67,7 @@
                                    BIN_TO_BCD(bdtime->tm_min);
 		DX_reg(context) = (BIN_TO_BCD(bdtime->tm_sec)<<8);
 
-	case 4:
+	case 0x04:
 		ltime = time(NULL);
 		bdtime = localtime(&ltime);
 		CX_reg(context) = (BIN_TO_BCD(bdtime->tm_year/100)<<8) |
@@ -75,18 +77,29 @@
 		break;
 
 		/* setting the time,date or RTC is not allow -EB */
-	case 1:
+	case 0x01:
 		/* set system time */
-	case 3: 
+	case 0x03: 
 		/* set RTC time */
-	case 5:
+	case 0x05:
 		/* set RTC date */
-	case 6:
+	case 0x06:
 		/* set ALARM */
-	case 7:
+	case 0x07:
 		/* cancel ALARM */
 		break;
 
+        case 0xb0: /* Microsoft Real Time Compression */
+                switch AL_reg(context)
+                {
+                    case 0x01:
+                        /* not present */
+                        break;
+                    default:
+                        INT_BARF(context, 0x1a);
+                }
+                break;
+                
 	default:
 		INT_BARF( context, 0x1a );
     }
diff --git a/msdos/int21.c b/msdos/int21.c
index a4e95f1..a17b630 100644
--- a/msdos/int21.c
+++ b/msdos/int21.c
@@ -732,6 +732,7 @@
     if (*fcb == 0xff) pFCB = (FINDFILE_FCB *)(fcb + 7);
     else pFCB = (FINDFILE_FCB *)fcb;
     drive = DOS_GET_DRIVE( pFCB->drive );
+    if (!DRIVE_IsValid( drive )) return 0;
     root = DRIVE_GetRoot( drive );
     cwd  = DRIVE_GetUnixCwd( drive );
     pFCB->unixPath = HeapAlloc( GetProcessHeap(), 0,
@@ -894,6 +895,21 @@
      }
 }
 
+static void INT21_SetCurrentPSP(CONTEXT *context)
+{
+/* FIXME - What is this MZ stuff and what if it isn't supported?? */
+#ifdef MZ_SUPPORTED
+    TDB *pTask = hModule ? NULL : (TDB *)GlobalLock16( GetCurrentTask() );
+    NE_MODULE *pModule = (hModule || pTask) ? NE_GetPtr( hModule ? hModule : pTask->hModule ) : NULL;
+    
+    GlobalUnlock16( GetCurrentTask() );
+    if (pModule->lpDosTask)
+        pModule->lpDosTask->psp_seg = BX_reg(context);
+#else
+    FIXME(int21, "MZ Not Supported.\n");
+#endif
+}
+    
 static WORD INT21_GetCurrentPSP()
 {
 #ifdef MZ_SUPPORTED
@@ -1189,8 +1205,13 @@
 	      (AL_reg(context) == 0x00)?"OEM number":"version flag");
         AX_reg(context) = (HIWORD(GetVersion16()) >> 8) |
                           (HIWORD(GetVersion16()) << 8);
-        BX_reg(context) = 0x0012;     /* 0x123456 is Wine's serial # */
-        CX_reg(context) = 0x3456;
+#if 0
+        AH_reg(context) = 0x7;
+        AL_reg(context) = 0xA;
+#endif
+
+        BX_reg(context) = 0x00FF;     /* 0x123456 is Wine's serial # */
+        CX_reg(context) = 0x0000;
         break;
 
     case 0x31: /* TERMINATE AND STAY RESIDENT */
@@ -1554,10 +1575,21 @@
     case 0x48: /* ALLOCATE MEMORY */
         TRACE(int21,"ALLOCATE MEMORY for %d paragraphs\n", BX_reg(context));
         {
-            LPVOID *mem = DOSMEM_GetBlock(0,BX_reg(context)<<4,NULL);
+            LPVOID *mem; 
+	    if (ISV86(context))
+	      {
+		mem= DOSMEM_GetBlock(0,(DWORD)BX_reg(context)<<4,NULL);
             if (mem)
                 AX_reg(context) = DOSMEM_MapLinearToDos(mem)>>4;
-            else {
+	      }
+	    else
+	      {
+		mem = (LPVOID)GlobalDOSAlloc(BX_reg(context)<<4);
+		if (mem)
+		  AX_reg(context) = (DWORD)mem&0xffff;
+	      }
+	    if (!mem)
+	      {
                 SET_CFLAG(context);
                 AX_reg(context) = 0x0008; /* insufficient memory */
                 BX_reg(context) = DOSMEM_Available(0)>>4;
@@ -1567,15 +1599,29 @@
 
     case 0x49: /* FREE MEMORY */
         TRACE(int21,"FREE MEMORY segment %04lX\n", ES_reg(context));
-        if (!DOSMEM_FreeBlock(0,DOSMEM_MapDosToLinear(ES_reg(context)<<4)))
         {
+	  BOOL32 ret;
+	  if (ISV86(context))
+	    ret= DOSMEM_FreeBlock(0,DOSMEM_MapDosToLinear(ES_reg(context)<<4));
+	  else
+	    {
+	      ret = !GlobalDOSFree(ES_reg(context));
+	      /* If we don't reset ES_reg, we will fail in the relay code */
+	      ES_reg(context)=ret;
+	    }
+	  if (!ret)
+	    {
+	      TRACE(int21,"FREE MEMORY failed\n");
             SET_CFLAG(context);
             AX_reg(context) = 0x0009; /* memory block address invalid */
         }
+	}
         break;
 
     case 0x4a: /* RESIZE MEMORY BLOCK */
         TRACE(int21,"RESIZE MEMORY segment %04lX to %d paragraphs\n", ES_reg(context), BX_reg(context));
+	if (!ISV86(context))
+	  FIXME(int21,"RESIZE MEMORY probably insufficent implementation. Expect crash soon\n");
 	{
 	    LPVOID *mem = DOSMEM_ResizeBlock(0,DOSMEM_MapDosToLinear(ES_reg(context)<<4),
 					       BX_reg(context)<<4,NULL);
@@ -1624,7 +1670,11 @@
         }
         else AX_reg(context) = 0;  /* OK */
         break;
-
+    case 0x50: /* SET CURRENT PROCESS ID (SET PSP ADDRESS) */
+        TRACE(int21, "SET CURRENT PROCESS ID (GET PSP ADDRESS)\n");
+        /* FIXME: Is this right? */
+        INT21_SetCurrentPSP(context);
+        break;
     case 0x51: /* GET PSP ADDRESS */
         TRACE(int21,"GET CURRENT PROCESS ID (GET PSP ADDRESS)\n");
         /* FIXME: should we return the original DOS PSP upon */
diff --git a/msdos/int2f.c b/msdos/int2f.c
index 914333a..0559fff 100644
--- a/msdos/int2f.c
+++ b/msdos/int2f.c
@@ -26,19 +26,61 @@
  */
 void WINAPI INT_Int2fHandler( CONTEXT *context )
 {
+    TRACE(int,"Subfunction 0x%X\n", AH_reg(context));
+
     switch(AH_reg(context))
     {
     case 0x10:
         AL_reg(context) = 0xff; /* share is installed */
         break;
 
+    case 0x12:
+        switch (AL_reg(context))
+        {
+        case 0x2e: /* get or set DOS error table address */
+            switch (DL_reg(context))
+            {
+            /* Four tables: even commands are 'get', odd are 'set' */
+            /* DOS 5.0+ ignores "set" commands */
+            case 0x01:
+            case 0x03:
+            case 0x05:
+            case 0x07:
+            case 0x09:
+                break; 
+            /* Instead of having a message table in DOS-space, */
+            /* we can use a special case for MS-DOS to force   */
+            /* the secondary interface.			       */
+            case 0x00:
+            case 0x02:
+            case 0x04:
+            case 0x06: 
+                ES_reg(context) = 0x0001;
+                DI_reg(context) = 0x0000;
+                break;
+            case 0x08:
+                FIXME(int, "No real-mode handler for errors yet! (bye!)");
+                break;
+            default:
+                INT_BARF(context, 0x2f);
+            }
+            break;
+        default:
+           INT_BARF(context, 0x2f);
+        }  
+        break;
+   
     case 0x15: /* mscdex */
-        do_mscdex(context, FALSE );
+        do_mscdex(context);
         break;
 
     case 0x16:
         do_int2f_16( context );
         break;
+    case 0x43:
+    	FIXME(int,"check for XMS (not supported)\n");
+	AL_reg(context) = 0x42; /* != 0x80 */
+    	break;
 
     case 0x45:
        switch (AL_reg(context)) 
@@ -82,6 +124,17 @@
 	    INT_BARF( context, 0x2f );
 	}
 	break;
+    case 0x7a:  /* NOVELL NetWare */
+        switch (AL_reg(context))
+        {
+        case 0x20:  /* Get VLM Call Address */
+            /* return nothing -> NetWare not installed */
+            break;
+        default:
+            SET_CFLAG(context);
+            break;
+        }
+        break;
     case 0xb7:  /* append */
         AL_reg(context) = 0; /* not installed */
         break;
@@ -162,7 +215,9 @@
 
     /* FIXME: is this right?  Specs say that this should only be callable
        in real (v86) mode which we never enter.  */
+    /* FIXME: we do now, and this breaks pkunzip */
     case 0x87: /* DPMI installation check */
+        if (ISV86(context)) break; /* so bail out for now if in v86 mode */
         {
 	    SYSTEM_INFO si;
 
@@ -185,7 +240,7 @@
     }
 }
 
-void do_mscdex( CONTEXT *context, int dorealmode )
+void do_mscdex( CONTEXT *context )
 {
     int drive, count;
     char *p;
@@ -218,10 +273,7 @@
             break;
 
         case 0x0D: /* get drive letters */
-	    if (dorealmode)
-	    	p = DOSMEM_MapRealToLinear(MAKELONG(BX_reg(context),ES_reg(context)));
-	    else
-		p = PTR_SEG_OFF_TO_LIN(ES_reg(context), BX_reg(context));
+	    p = CTX_SEG_OFF_TO_LIN(context, ES_reg(context), BX_reg(context));
             memset( p, 0, MAX_DOS_DRIVES );
             for (drive = 0; drive < MAX_DOS_DRIVES; drive++)
             {
@@ -230,8 +282,11 @@
             break;
 
 #ifdef linux
+        /* FIXME: why a new linux-only CDROM drive access, for crying out loud?
+         * There are pretty complete routines in multimedia/mcicda.c already! */
 	case 0x10: /* direct driver acces */
-	    do_mscdex_dd(context,dorealmode);
+            FIXME(cdaudio,"mscdex should use multimedia/mcicda.c");
+	    do_mscdex_dd(context,ISV86(context));
 	    break;
 
 #endif
diff --git a/msdos/interrupts.c b/msdos/interrupts.c
index da6ff2a..79c7144 100644
--- a/msdos/interrupts.c
+++ b/msdos/interrupts.c
@@ -39,3 +39,35 @@
                  intnum, HIWORD(handler), LOWORD(handler) );
     INT_Vectors[intnum] = handler;
 }
+
+
+/**********************************************************************
+ *	    INT_RealModeInterrupt
+ *
+ * Handle real mode interrupts
+ */
+int INT_RealModeInterrupt( BYTE intnum, PCONTEXT context )
+{
+    /* we should really map to if1632/wprocs.spec, but not all
+     * interrupt handlers are adapted to support real mode yet */
+    switch (intnum) {
+        case 0x10:
+            INT_Int10Handler(context);
+            break;
+        case 0x1a:
+            INT_Int1aHandler(context);
+            break;
+        case 0x20:
+            INT_Int20Handler(context);
+            break;
+        case 0x21:
+            DOS3Call(context);
+            break;
+        case 0x2f:
+            INT_Int2fHandler(context);
+            break;
+        default:
+            return 1;
+    }
+    return 0;
+}
diff --git a/multimedia/mmsystem.c b/multimedia/mmsystem.c
index 40d4424..deffa1a 100644
--- a/multimedia/mmsystem.c
+++ b/multimedia/mmsystem.c
@@ -118,46 +118,55 @@
 	memcpy(&(mmt16->u),&(mmt32->u),sizeof(mmt16->u));
 }
 
-/**************************************************************************
- * 				PlaySoundA		[WINMM.1]
- */
-BOOL32 WINAPI PlaySound32A(LPCSTR pszSound, HMODULE32 hmod, DWORD fdwSound)
+HANDLE32	PlaySound_hThread = 0;
+HANDLE32	PlaySound_hPlayEvent = 0;
+HANDLE32	PlaySound_hReadyEvent = 0;
+HANDLE32	PlaySound_hMiddleEvent = 0;
+BOOL32		PlaySound_Result = FALSE;
+int		PlaySound_Stop = FALSE;
+int		PlaySound_Playing = FALSE;
+
+LPCSTR		PlaySound_pszSound = NULL;
+HMODULE32	PlaySound_hmod = 0;
+DWORD		PlaySound_fdwSound = 0;
+int		PlaySound_Loop = FALSE;
+int		PlaySound_SearchMode = 0; /* 1 - sndPlaySound search order
+                                             2 - PlaySound order */
+
+HMMIO16	get_mmioFromFile(LPCSTR lpszName)
 {
-  TRACE(mmsys, "pszSound='%p' hmod=%04X fdwSound=%08lX\n",
-	pszSound, hmod, fdwSound);
-  if(hmod != 0 || !(fdwSound & SND_FILENAME)) {
-    FIXME(mmsys, "only disk sound files are supported. Type: %08lx\n",fdwSound);
-    return FALSE;
-  } else
-    return  sndPlaySound(pszSound, (UINT16) fdwSound);
+  return mmioOpen16((LPSTR)lpszName, NULL,
+    MMIO_ALLOCBUF | MMIO_READ | MMIO_DENYWRITE);
 }
 
-/**************************************************************************
- * 				PlaySoundW		[WINMM.18]
- */
-BOOL32 WINAPI PlaySound32W(LPCWSTR pszSound, HMODULE32 hmod, DWORD fdwSound)
+HMMIO16 get_mmioFromProfile(UINT32 uFlags, LPCSTR lpszName) 
 {
-  LPSTR pszSoundA = HEAP_strdupWtoA(GetProcessHeap(),0,pszSound);
-  BOOL32 bSound;
-
-  bSound = PlaySound32A(pszSoundA, hmod, fdwSound);
-  HeapFree(GetProcessHeap(),0,pszSoundA);
-  return bSound;
+  char	   str[128];
+  LPSTR	   ptr;
+  HMMIO16  hmmio;
+  TRACE(mmsys, "searching in SystemSound List !\n");
+  GetProfileString32A("Sounds", (LPSTR)lpszName, "", str, sizeof(str));
+  if (strlen(str) == 0) {
+    if (uFlags & SND_NODEFAULT) return 0;
+    GetProfileString32A("Sounds", "Default", "", str, sizeof(str));
+    if (strlen(str) == 0) return 0;
+  }
+  if ( (ptr = (LPSTR)strchr(str, ',')) != NULL) *ptr = '\0';
+  hmmio = get_mmioFromFile(str);
+  if (hmmio == 0) {
+    WARN(mmsys, "can't find SystemSound='%s' !\n", str);
+    return 0;
+  }
+  return hmmio;
 }
 
-/**************************************************************************
-* 				sndPlaySound		[MMSYSTEM.2]
-*/
-BOOL16 WINAPI sndPlaySound(LPCSTR lpszSoundName, UINT16 uFlags)
+BOOL16 WINAPI proc_PlaySound(LPCSTR lpszSoundName, UINT32 uFlags)
 {
 	BOOL16			bRet = FALSE;
 	HMMIO16			hmmio;
 	MMCKINFO                ckMainRIFF;
-	char			str[128];
-	LPSTR			ptr;
 
-	TRACE(mmsys, "SoundName='%s' uFlags=%04X !\n", 
-									lpszSoundName, uFlags);
+	TRACE(mmsys, "SoundName='%s' uFlags=%04X !\n", lpszSoundName, uFlags);
 	if (lpszSoundName == NULL) {
 		TRACE(mmsys, "Stop !\n");
 		return FALSE;
@@ -170,26 +179,32 @@
 		mminfo.cchBuffer = -1;
 		TRACE(mmsys, "Memory sound %p\n",lpszSoundName);
 		hmmio = mmioOpen16(NULL, &mminfo, MMIO_READ);
-	} else
-		hmmio = mmioOpen16((LPSTR)lpszSoundName, NULL, 
-			MMIO_ALLOCBUF | MMIO_READ | MMIO_DENYWRITE);
+	} else {
+          hmmio = 0;
+	  if (uFlags & SND_ALIAS)
+	    if ((hmmio=get_mmioFromProfile(uFlags, lpszSoundName)) == 0) 
+	      return FALSE;
 
-	if (hmmio == 0) 
-	{
-		TRACE(mmsys, "searching in SystemSound List !\n");
-		GetProfileString32A("Sounds", (LPSTR)lpszSoundName, "", str, sizeof(str));
-		if (strlen(str) == 0) return FALSE;
-		if ( (ptr = (LPSTR)strchr(str, ',')) != NULL) *ptr = '\0';
-		hmmio = mmioOpen16(str, NULL, MMIO_ALLOCBUF | MMIO_READ | MMIO_DENYWRITE);
-		if (hmmio == 0) 
-		{
-			WARN(mmsys, "can't find SystemSound='%s' !\n", str);
-			return FALSE;
-		}
+	  if (uFlags & SND_FILENAME)
+	    if ((hmmio=get_mmioFromFile(lpszSoundName)) == 0) return FALSE;
+
+	  if (PlaySound_SearchMode == 1) {
+	    PlaySound_SearchMode = 0;
+	    if ((hmmio=get_mmioFromFile(lpszSoundName)) == 0) 
+	      if ((hmmio=get_mmioFromProfile(uFlags, lpszSoundName)) == 0) 
+	        return FALSE;
+          }
+	
+	  if (PlaySound_SearchMode == 2) {
+	    PlaySound_SearchMode = 0;
+	    if ((hmmio=get_mmioFromProfile(uFlags | SND_NODEFAULT, lpszSoundName)) == 0) 
+	      if ((hmmio=get_mmioFromFile(lpszSoundName)) == 0)	
+	        if ((hmmio=get_mmioFromProfile(uFlags, lpszSoundName)) == 0) return FALSE;
+	  }
 	}
-
+	
 	if (mmioDescend(hmmio, &ckMainRIFF, NULL, 0) == 0) 
-        {
+        do {
 	    TRACE(mmsys, "ParentChunk ckid=%.4s fccType=%.4s cksize=%08lX \n",
 				(LPSTR)&ckMainRIFF.ckid, (LPSTR)&ckMainRIFF.fccType, ckMainRIFF.cksize);
 
@@ -252,6 +267,11 @@
 				{
 				    while( left )
 				    {
+                                        if (PlaySound_Stop) {
+					  PlaySound_Stop = FALSE;
+					  PlaySound_Loop = FALSE;
+					  break;
+					}
 					if (bufsize > left) bufsize = left;
 					count = mmioRead32(hmmio,waveHdr.lpData,bufsize);
 					if (count < 1) break;
@@ -275,12 +295,150 @@
 		    }
 		}
 	    }
-	}
+	} while (PlaySound_Loop);
 
 	if (hmmio != 0) mmioClose32(hmmio, 0);
 	return bRet;
 }
 
+static DWORD PlaySound_Thread(LPVOID arg) 
+{
+    DWORD     res;
+    HRSRC32   hRES;
+    HGLOBAL32 hGLOB;
+    void      *ptr;
+
+    while (TRUE) {
+      PlaySound_Playing=FALSE;
+      SetEvent(PlaySound_hReadyEvent);
+      res=WaitForSingleObject(PlaySound_hPlayEvent, INFINITE32);
+      ResetEvent(PlaySound_hReadyEvent);
+      SetEvent(PlaySound_hMiddleEvent);
+      if (res==WAIT_FAILED) ExitThread(2);
+      if (res!=WAIT_OBJECT_0) continue;
+      PlaySound_Playing=TRUE;
+      
+      if ((PlaySound_fdwSound & SND_RESOURCE) == SND_RESOURCE) {
+        if ((hRES=FindResource32A(PlaySound_hmod, PlaySound_pszSound,
+	  "WAVE"))==0) {
+          PlaySound_Result=FALSE;
+	  continue;
+	}
+        if ((hGLOB=LoadResource32(PlaySound_hmod, hRES))==0) {
+          PlaySound_Result=FALSE;
+	  continue;
+	}
+        if ( (ptr=LockResource32(hGLOB)) == NULL ) {
+          FreeResource32(hGLOB);
+          PlaySound_Result=FALSE;
+	  continue;
+        }
+        PlaySound_Result=proc_PlaySound(ptr, 
+	  ((UINT16) PlaySound_fdwSound ^ SND_RESOURCE) | SND_MEMORY);
+        FreeResource32(hGLOB);
+        continue;
+      }
+      PlaySound_Result=proc_PlaySound(PlaySound_pszSound, 
+        (UINT16) PlaySound_fdwSound);
+  }
+}
+
+/**************************************************************************
+ * 				PlaySoundA		[WINMM.1]
+ */
+BOOL32 WINAPI PlaySound32A(LPCSTR pszSound, HMODULE32 hmod, DWORD fdwSound)
+{
+  static LPSTR StrDup = NULL;
+
+  TRACE(mmsys, "pszSound='%p' hmod=%04X fdwSound=%08lX\n",
+	pszSound, hmod, fdwSound);
+
+  if (PlaySound_hThread == 0) { /* This is the first time they called us */
+    DWORD	id;
+    if ((PlaySound_hThread = CreateThread(NULL, 0, PlaySound_Thread, 
+      0, 0, &id)) == 0) return FALSE;
+    if ((PlaySound_hReadyEvent=CreateEvent32A(NULL, TRUE, FALSE, NULL)) == 0)
+      return FALSE;
+    if ((PlaySound_hMiddleEvent=CreateEvent32A(NULL, FALSE, FALSE, NULL)) == 0)
+      return FALSE;
+    if ((PlaySound_hPlayEvent=CreateEvent32A(NULL, FALSE, FALSE, NULL)) == 0)
+      return FALSE;
+  }
+
+/* FIXME? I see no difference between SND_WAIT and SND_NOSTOP ! */ 
+  if ((fdwSound & (SND_NOWAIT | SND_NOSTOP)) && PlaySound_Playing) return FALSE;
+
+ /* Trying to stop if playing */
+  if (PlaySound_Playing) PlaySound_Stop = TRUE;
+
+/* Waiting playing thread to get ready. I think 10 secs is ok & if not then leave*/
+  if (WaitForSingleObject(PlaySound_hReadyEvent, 1000*10) != WAIT_OBJECT_0)
+    return FALSE;
+
+  if (!pszSound || (fdwSound & SND_PURGE)) return FALSE; /* We stoped playing so leaving */
+
+  if (PlaySound_SearchMode != 1) PlaySound_SearchMode = 2;
+  if (!(fdwSound & SND_ASYNC)) {
+    if (fdwSound & SND_LOOP) return FALSE;
+    PlaySound_pszSound = pszSound;
+    PlaySound_hmod = hmod;
+    PlaySound_fdwSound = fdwSound;
+    PlaySound_Result = FALSE;
+    SetEvent(PlaySound_hPlayEvent);
+    if (WaitForSingleObject(PlaySound_hMiddleEvent, INFINITE32) != 
+      WAIT_OBJECT_0) return FALSE;
+    if (WaitForSingleObject(PlaySound_hReadyEvent, INFINITE32) != 
+      WAIT_OBJECT_0) return FALSE;
+    return PlaySound_Result;
+  } else {
+    PlaySound_hmod = hmod;
+    PlaySound_fdwSound = fdwSound;
+    PlaySound_Result = FALSE;
+    if (StrDup) {
+      HeapFree(GetProcessHeap(), 0, StrDup);
+      StrDup = NULL;
+    }
+    if (!((fdwSound & SND_MEMORY) || ((fdwSound & SND_RESOURCE) && 
+      !((DWORD)pszSound >> 16)) || !pszSound)) {
+      StrDup = HEAP_strdupA(GetProcessHeap(),0,pszSound);
+      PlaySound_pszSound = StrDup;
+    } else PlaySound_pszSound = pszSound;
+    PlaySound_Loop = fdwSound & SND_LOOP;
+    SetEvent(PlaySound_hPlayEvent);
+    ResetEvent(PlaySound_hMiddleEvent);
+    return TRUE;
+  }
+  return FALSE;
+}
+
+/**************************************************************************
+ * 				PlaySoundW		[WINMM.18]
+ */
+BOOL32 WINAPI PlaySound32W(LPCWSTR pszSound, HMODULE32 hmod, DWORD fdwSound)
+{
+  LPSTR pszSoundA;
+  BOOL32 bSound;
+
+  if (!((fdwSound & SND_MEMORY) || ((fdwSound & SND_RESOURCE) && 
+    !((DWORD)pszSound >> 16)) || !pszSound)) {
+    pszSoundA = HEAP_strdupWtoA(GetProcessHeap(),0,pszSound);
+    bSound = PlaySound32A(pszSoundA, hmod, fdwSound);
+    HeapFree(GetProcessHeap(),0,pszSoundA);
+  } else  
+    bSound = PlaySound32A((LPCSTR)pszSound, hmod, fdwSound);
+
+  return bSound;
+}
+
+/**************************************************************************
+* 				sndPlaySound		[MMSYSTEM.2]
+*/
+BOOL16 WINAPI sndPlaySound(LPCSTR lpszSoundName, UINT16 uFlags)
+{
+    PlaySound_SearchMode = 1;
+    return PlaySound32A(lpszSoundName, 0, uFlags);
+}
+
 /**************************************************************************
  * 				mmsystemGetVersion	[WINMM.134]
  */
@@ -1416,9 +1574,9 @@
 }
 
 /**************************************************************************
- *                    	mciLoadCommandResource
+ *                    	mciLoadCommandResource16
  */
-UINT16 mciLoadCommandResource16(HANDLE16 hinst,LPCSTR resname,UINT16 type)
+UINT16 WINAPI mciLoadCommandResource16(HANDLE16 hinst,LPCSTR resname,UINT16 type)
 {
       char            buf[200];
       OFSTRUCT        ofs;
diff --git a/objects/dc.c b/objects/dc.c
index 1899d48..b1ad95e 100644
--- a/objects/dc.c
+++ b/objects/dc.c
@@ -117,8 +117,6 @@
     win_dc_info->backgroundMode      = OPAQUE;
     win_dc_info->backgroundColor     = RGB( 255, 255, 255 );
     win_dc_info->textColor           = RGB( 0, 0, 0 );
-    win_dc_info->backgroundPixel     = 0;
-    win_dc_info->textPixel           = 0;
     win_dc_info->brushOrgX           = 0;
     win_dc_info->brushOrgY           = 0;
     win_dc_info->textAlign           = TA_LEFT | TA_TOP | TA_NOUPDATECP;
@@ -234,13 +232,13 @@
 	 * We need to swap foreground and background because
 	 * Windows does it the wrong way...
 	 */
-	val.foreground = dc->w.backgroundPixel;
-	val.background = dc->w.textPixel;
+	val.foreground = dc->u.x.backgroundPixel;
+	val.background = dc->u.x.textPixel;
     }
     else
     {
 	val.foreground = dc->u.x.brush.pixel;
-	val.background = dc->w.backgroundPixel;
+	val.background = dc->u.x.backgroundPixel;
     }
     if (fMapColors && COLOR_PixelToPalette)
     {
@@ -358,7 +356,7 @@
 	val.foreground = dc->u.x.pen.pixel;
 	val.function   = DC_XROPfunction[dc->w.ROPmode-1];
     }
-    val.background = dc->w.backgroundPixel;
+    val.background = dc->u.x.backgroundPixel;
     val.fill_style = FillSolid;
     if ((dc->u.x.pen.style!=PS_SOLID) && (dc->u.x.pen.style!=PS_INSIDEFRAME))
     {
@@ -421,8 +419,8 @@
 	if (dc->w.flags & DC_DIRTY) CLIPPING_UpdateGCRegion(dc);
 
 	val.function   = GXcopy;  /* Text is always GXcopy */
-	val.foreground = dc->w.textPixel;
-	val.background = dc->w.backgroundPixel;
+	val.foreground = dc->u.x.textPixel;
+	val.background = dc->u.x.backgroundPixel;
 	val.fill_style = FillSolid;
 	val.font       = xfs->fid;
 
@@ -538,8 +536,6 @@
     newdc->w.backgroundMode   = dc->w.backgroundMode;
     newdc->w.backgroundColor  = dc->w.backgroundColor;
     newdc->w.textColor        = dc->w.textColor;
-    newdc->w.backgroundPixel  = dc->w.backgroundPixel;
-    newdc->w.textPixel        = dc->w.textPixel;
     newdc->w.brushOrgX        = dc->w.brushOrgX;
     newdc->w.brushOrgY        = dc->w.brushOrgY;
     newdc->w.textAlign        = dc->w.textAlign;
@@ -621,8 +617,6 @@
     dc->w.backgroundMode   = dcs->w.backgroundMode;
     dc->w.backgroundColor  = dcs->w.backgroundColor;
     dc->w.textColor        = dcs->w.textColor;
-    dc->w.backgroundPixel  = dcs->w.backgroundPixel;
-    dc->w.textPixel        = dcs->w.textPixel;
     dc->w.brushOrgX        = dcs->w.brushOrgX;
     dc->w.brushOrgY        = dcs->w.brushOrgY;
     dc->w.textAlign        = dcs->w.textAlign;
@@ -659,6 +653,8 @@
     SelectObject32( hdc, dcs->w.hBrush );
     SelectObject32( hdc, dcs->w.hFont );
     SelectObject32( hdc, dcs->w.hPen );
+    SetBkColor32( hdc, dcs->w.backgroundColor);
+    SetTextColor32( hdc, dcs->w.textColor);
     GDISelectPalette( hdc, dcs->w.hPalette, FALSE );
     GDI_HEAP_UNLOCK( hdc );
     GDI_HEAP_UNLOCK( hdcs );
@@ -800,8 +796,8 @@
     if (!(dc = DC_AllocDC( funcs ))) return 0;
     dc->w.flags = 0;
 
-    TRACE(dc, "(%s %s %s): returning %04x\n",
-               driver, device, output, dc->hSelf );
+    TRACE(dc, "(driver=%s, device=%s, output=%s): returning %04x\n",
+               debugstr_a(driver), debugstr_a(device), debugstr_a(output), dc->hSelf );
 
     if (dc->funcs->pCreateDC &&
         !dc->funcs->pCreateDC( dc, driver, device, output, initData ))
@@ -1057,19 +1053,15 @@
 COLORREF WINAPI SetBkColor32( HDC32 hdc, COLORREF color )
 {
     COLORREF oldColor;
-    DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC );
-    if (!dc) 
-    {
-	dc = (DC *)GDI_GetObjPtr(hdc, METAFILE_DC_MAGIC);
-	if (!dc) return 0x80000000;
-	MF_MetaParam2(dc, META_SETBKCOLOR, HIWORD(color), LOWORD(color));
-	GDI_HEAP_UNLOCK( hdc );
-	return 0;  /* ?? */
+    DC * dc = DC_GetDCPtr( hdc );
+  
+    if (!dc) return 0x80000000;
+    if (dc->funcs->pSetBkColor)
+        oldColor = dc->funcs->pSetBkColor(dc, color);
+    else {
+	oldColor = dc->w.backgroundColor;
+	dc->w.backgroundColor = color;
     }
-
-    oldColor = dc->w.backgroundColor;
-    dc->w.backgroundColor = color;
-    dc->w.backgroundPixel = COLOR_ToPhysical( dc, color );
     GDI_HEAP_UNLOCK( hdc );
     return oldColor;
 }
@@ -1090,19 +1082,15 @@
 COLORREF WINAPI SetTextColor32( HDC32 hdc, COLORREF color )
 {
     COLORREF oldColor;
-    DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC );
-    if (!dc) 
-    {
-	dc = (DC *)GDI_GetObjPtr(hdc, METAFILE_DC_MAGIC);
-	if (!dc) return 0x80000000;
-	MF_MetaParam2(dc, META_SETTEXTCOLOR, HIWORD(color), LOWORD(color));
-	GDI_HEAP_UNLOCK( hdc );
-	return 0;  /* ?? */
+    DC * dc = DC_GetDCPtr( hdc );
+  
+    if (!dc) return 0x80000000;
+    if (dc->funcs->pSetTextColor)
+        oldColor = dc->funcs->pSetTextColor(dc, color);
+    else {
+	oldColor = dc->w.textColor;
+	dc->w.textColor = color;
     }
-
-    oldColor = dc->w.textColor;
-    dc->w.textColor = color;
-    dc->w.textPixel = COLOR_ToPhysical( dc, color );
     GDI_HEAP_UNLOCK( hdc );
     return oldColor;
 }
diff --git a/objects/gdiobj.c b/objects/gdiobj.c
index c3ded34..ca12959 100644
--- a/objects/gdiobj.c
+++ b/objects/gdiobj.c
@@ -366,11 +366,15 @@
       case PALETTE_MAGIC: return PALETTE_DeleteObject(obj,(PALETTEOBJ*)header);
       case BITMAP_MAGIC:  return BITMAP_DeleteObject( obj, (BITMAPOBJ*)header);
       case REGION_MAGIC:  return REGION_DeleteObject( obj, (RGNOBJ*)header );
+      case 0 :
+        WARN(gdi, "Already deleted\n");
+        break;
+      default:
+        WARN(gdi, "Unknown magic number (%d)\n",header->wMagic);
     }
     return FALSE;
 }
 
-
 /***********************************************************************
  *           GetStockObject16    (GDI.87)
  */
diff --git a/objects/region.c b/objects/region.c
index 1f014a1..062bb27 100644
--- a/objects/region.c
+++ b/objects/region.c
@@ -122,16 +122,17 @@
 {
     WINEREGION *pReg;
 
-    if (!(pReg = HeapAlloc(SystemHeap, 0, sizeof( WINEREGION ))))
-	return NULL;
-    if (!(pReg->rects = HeapAlloc(SystemHeap, 0, sizeof( RECT32 ))))
+    if ((pReg = HeapAlloc(SystemHeap, 0, sizeof( WINEREGION ))))
     {
+	if ((pReg->rects = HeapAlloc(SystemHeap, 0, sizeof( RECT32 ))))
+	{
+	    pReg->size = 1;
+	    EMPTY_REGION(pReg);
+	    return pReg;
+	}
 	HeapFree(SystemHeap, 0, pReg);
-	return NULL;
     }
-    pReg->size = 1;
-    EMPTY_REGION(pReg);
-    return pReg;
+    return NULL;
 }
 
 /***********************************************************************
@@ -2517,9 +2518,8 @@
  */
 HRGN32 WINAPI GetRandomRgn(DWORD dwArg1, DWORD dwArg2, DWORD dwArg3)
 {
-    FIXME (region, "(0x%08x 0x%08x 0x%08x): empty stub!\n",
+    FIXME (region, "(0x%08lx 0x%08lx 0x%08lx): empty stub!\n",
 	   dwArg1, dwArg2, dwArg3);
 
-    return NULL;
+    return 0;
 }
-
diff --git a/objects/text.c b/objects/text.c
index f7f0cbf..08e80d3 100644
--- a/objects/text.c
+++ b/objects/text.c
@@ -319,7 +319,7 @@
 /***********************************************************************
  *           DrawTextEx32A    (USER32.165)
  */
-INT32 DrawTextEx32A( HDC32 hdc, LPCSTR str, INT32 count,
+INT32 WINAPI DrawTextEx32A( HDC32 hdc, LPCSTR str, INT32 count,
                      LPRECT32 rect, UINT32 flags, LPDRAWTEXTPARAMS dtp )
 {
     TRACE(text,"(%d,'%s',%d,%p,0x%08x,%p)\n",hdc,str,count,rect,flags,dtp);
@@ -330,7 +330,7 @@
 /***********************************************************************
  *           DrawTextEx32W    (USER32.166)
  */
-INT32 DrawTextEx32W( HDC32 hdc, LPCWSTR str, INT32 count,
+INT32 WINAPI DrawTextEx32W( HDC32 hdc, LPCWSTR str, INT32 count,
                      LPRECT32 rect, UINT32 flags, LPDRAWTEXTPARAMS dtp )
 {
     TRACE(text,"(%d,%p,%d,%p,0x%08x,%p)\n",hdc,str,count,rect,flags,dtp);
diff --git a/ole/Makefile.in b/ole/Makefile.in
index 134f4fc..64a7fe4 100644
--- a/ole/Makefile.in
+++ b/ole/Makefile.in
@@ -13,6 +13,7 @@
 	ole2disp.c \
 	ole2nls.c \
 	olecli.c \
+	oledlg.c \
 	olesvr.c \
 	storage.c \
 	typelib.c
diff --git a/ole/compobj.c b/ole/compobj.c
index a5fc327..30d0869 100644
--- a/ole/compobj.c
+++ b/ole/compobj.c
@@ -28,6 +28,9 @@
 LPMALLOC16 currentMalloc16=NULL;
 LPMALLOC32 currentMalloc32=NULL;
 
+HTASK16 hETask = 0;
+WORD Table_ETask[62];
+
 /***********************************************************************
  *           CoBuildVersion [COMPOBJ.1]
  *
@@ -102,6 +105,18 @@
 }
 
 /***********************************************************************
+ *           CoCreateStandardMalloc16 [COMPOBJ.71]
+ */
+OLESTATUS WINAPI CoCreateStandardMalloc16(DWORD dwMemContext,
+					  LPMALLOC16 *lpMalloc)
+{
+    /* FIXME: docu says we shouldn't return the same allocator as in
+     * CoGetMalloc16 */
+    *lpMalloc = IMalloc16_Constructor();
+    return S_OK;
+}
+
+/***********************************************************************
  *           CoDisconnectObject
  */
 OLESTATUS WINAPI CoDisconnectObject( LPUNKNOWN lpUnk, DWORD reserved )
@@ -400,13 +415,25 @@
 /***********************************************************************
  *           LookupETask (COMPOBJ.94)
  */
-OLESTATUS WINAPI LookupETask(LPVOID p1,LPVOID p2) {
-	FIXME(ole,"(%p,%p),stub!\n",p1,p2);
+OLESTATUS WINAPI LookupETask(HTASK16 *hTask,LPVOID p) {
+	FIXME(ole,"(%p,%p),stub!\n",hTask,p);
+	if ((*hTask = GetCurrentTask()) == hETask) {
+		memcpy(p, Table_ETask, sizeof(Table_ETask));
+	}
 	return 0;
 }
 
 /***********************************************************************
- *           LookupETask (COMPOBJ.201)
+ *           SetETask (COMPOBJ.95)
+ */
+OLESTATUS WINAPI SetETask(HTASK16 hTask, LPVOID p) {
+        FIXME(ole,"(%04x,%p),stub!\n",hTask,p);
+	hETask = hTask;
+	return 0;
+}
+
+/***********************************************************************
+ *           CallObjectInWOW (COMPOBJ.201)
  */
 OLESTATUS WINAPI CallObjectInWOW(LPVOID p1,LPVOID p2) {
 	FIXME(ole,"(%p,%p),stub!\n",p1,p2);
@@ -456,6 +483,30 @@
 }
 
 /***********************************************************************
+ *           CoGetClassObject [COMPOBJ.7]
+ */
+HRESULT WINAPI CoGetClassObject(REFCLSID rclsid, DWORD dwClsContext,
+                        LPVOID pvReserved, REFIID iid, LPVOID *ppv)
+{
+    char xclsid[50],xiid[50];
+    LPCLASSFACTORY lpclf;
+    HRESULT hres = E_UNEXPECTED;
+
+    WINE_StringFromCLSID((LPCLSID)rclsid,xclsid);
+    WINE_StringFromCLSID((LPCLSID)iid,xiid);
+    TRACE(ole,"\n\tCLSID:\t%s,\n\tIID:\t%s\n",xclsid,xiid);
+
+    *ppv = NULL;
+    lpclf = IClassFactory_Constructor();
+    if (lpclf)
+    {
+        hres = lpclf->lpvtbl->fnQueryInterface(lpclf,iid, ppv);
+        lpclf->lpvtbl->fnRelease(lpclf);
+    }
+    return hres;
+}
+
+/***********************************************************************
  *		CoRegisterMessageFilter [COMPOBJ.27]
  */
 OLESTATUS WINAPI CoRegisterMessageFilter16(
@@ -473,23 +524,32 @@
 	REFCLSID rclsid,
 	LPUNKNOWN pUnkOuter,
 	DWORD dwClsContext,
-	REFIID riid,
+	REFIID iid,
 	LPVOID *ppv
 ) {
+#if 0
 	char buf[80],xbuf[80];
 
 	if (rclsid)
 		WINE_StringFromCLSID(rclsid,buf);
 	else
 		sprintf(buf,"<rclsid-0x%08lx>",(DWORD)rclsid);
-	if (riid)
-		WINE_StringFromCLSID(riid,xbuf);
+	if (iid)
+		WINE_StringFromCLSID(iid,xbuf);
 	else
-		sprintf(xbuf,"<riid-0x%08lx>",(DWORD)riid);
+		sprintf(xbuf,"<iid-0x%08lx>",(DWORD)iid);
 
 	FIXME(ole,"(%s,%p,0x%08lx,%s,%p): stub !\n",buf,pUnkOuter,dwClsContext,xbuf,ppv);
 	*ppv = NULL;
-	return S_OK;
+#else	
+	HRESULT hres;
+	LPCLASSFACTORY lpclf = 0;
+
+	CoGetClassObject(rclsid, dwClsContext, NULL, &IID_IClassFactory, (LPVOID)&lpclf);
+	hres = lpclf->lpvtbl->fnCreateInstance(lpclf, pUnkOuter, iid, ppv);
+	lpclf->lpvtbl->fnRelease(lpclf);
+	return hres;
+#endif
 }
 
 /***********************************************************************
@@ -571,3 +631,13 @@
     FIXME(ole,"(%p,%d,%d),stub!\n",pUnk,fLock,fLastUnlockReleases);
     return S_OK;
 }
+
+/***********************************************************************
+ *           CoGetState16 [COMPOBJ.115]
+ */
+HRESULT WINAPI CoGetState16(LPDWORD state)
+{
+    FIXME(ole, "(%p),stub!\n", state);
+    *state = 0;
+    return S_OK;
+}
diff --git a/ole/ole2.c b/ole/ole2.c
index 228b01c..d14ef0c 100644
--- a/ole/ole2.c
+++ b/ole/ole2.c
@@ -105,3 +105,23 @@
 	FIXME(ole,"(0x%04x,%p),stub!\n",hwnd,pDropTarget);
 	return S_OK;
 }
+
+/***********************************************************************
+ *           RevokeDragDrop16 (OLE2.36)
+ */
+HRESULT WINAPI RevokeDragDrop16(
+	HWND16 hwnd
+) {
+	FIXME(ole,"(0x%04x),stub!\n",hwnd);
+	return S_OK;
+}
+
+/***********************************************************************
+ *           RevokeDragDrop32 (OLE32.141)
+ */
+HRESULT WINAPI RevokeDragDrop32(
+	HWND32 hwnd
+) {
+	FIXME(ole,"(0x%04x),stub!\n",hwnd);
+	return S_OK;
+}
diff --git a/ole/ole2nls.c b/ole/ole2nls.c
index e1684ea..4d97329b 100644
--- a/ole/ole2nls.c
+++ b/ole/ole2nls.c
@@ -236,7 +236,7 @@
  */
 LANGID WINAPI GetUserDefaultLangID()
 {
-	return (WORD)GetUserDefaultLCID();
+	return 0x400|(WORD)GetUserDefaultLCID();
 }
 
 /***********************************************************************
@@ -244,7 +244,7 @@
  */
 LANGID WINAPI GetSystemDefaultLangID()
 {
-	return GetUserDefaultLangID();
+	return 0x400|GetUserDefaultLangID();
 }
 
 /***********************************************************************
@@ -261,7 +261,7 @@
 	char	*retString;
 	int	found,i;
 
-	TRACE(ole,"(%8lX,%8lX,%p,%4X)\n",
+	TRACE(ole,"(0x%lx,0x%lx,%p,%x)\n",
 			lcid,LCType,buf,len);
 
 	LCType &= ~(LOCALE_NOUSEROVERRIDE|LOCALE_USE_CP_ACP);
@@ -2046,20 +2046,24 @@
 
 INT32 WINAPI OLE_GetFormatA(LCID locale,
 			    DWORD flags,
+			    DWORD tflags,
 			    LPSYSTEMTIME xtime,
-			    LPCSTR format, 
+			    LPCSTR _format, 
 			    LPSTR date, INT32 datelen)
 {
    INT32 inpos, outpos;
    int count, type, inquote, Overflow;
    char buf[40];
+   char format[40];
+   char * pos;
    int buflen;
 
    const char * _dgfmt[] = { "%d", "%02d" };
    const char ** dgfmt = _dgfmt - 1; 
 
    /* report, for debugging */
-   TRACE(ole, "func(%8lx,%8lx, time(d=%d,h=%d,m=%d,s=%d), fmt:\'%s\' (at %p), %p (%9s), len=%d)\n", locale, flags,
+   TRACE(ole, "(0x%lx,0x%lx, 0x%lx, time(d=%d,h=%d,m=%d,s=%d), fmt:\'%s\' (at %p), %p (%s), len=%d)\n",
+   	 locale, flags, tflags,
 	 xtime->wDay, xtime->wHour, xtime->wMinute, xtime->wSecond,
 	 format, format, date, date, datelen);
   
@@ -2069,6 +2073,21 @@
    type = '\0';
    date[0] = buf[0] = '\0';
       
+   strcpy(format,_format);
+
+   /* alter the formatstring, while it works for all languages now in wine
+   its possible that it fails when the time looks like ss:mm:hh as example*/   
+   if (tflags & (TIME_NOMINUTESORSECONDS))
+   { if ((pos = strstr ( format, ":mm")))
+     { memcpy ( pos, pos+3, strlen(format)-(pos-format)-2 );
+     }
+   }
+   if (tflags & (TIME_NOSECONDS))
+   { if ((pos = strstr ( format, ":ss")))
+     { memcpy ( pos, pos+3, strlen(format)-(pos-format)-2 );
+     }
+   }
+   
    for (inpos = 0;; inpos++) {
       /* TRACE(ole, "STATE inpos=%2d outpos=%2d count=%d inquote=%d type=%c buf,date = %c,%c\n", inpos, outpos, count, inquote, type, buf[inpos], date[outpos]); */
       if (inquote) {
@@ -2130,9 +2149,7 @@
 		      sprintf(buf, "%d", xtime->wYear);
 	       } else if (count == 3) {
 		  strcpy(buf, "yyy");
-		  WARN(ole,
-			      "unknown format,\
-c=%c, n=%d\n",  type, count);
+		  WARN(ole, "unknown format, c=%c, n=%d\n",  type, count);
 		 } else {
 		  sprintf(buf, dgfmt[count], xtime->wYear % 100);
 	       }
@@ -2142,9 +2159,7 @@
 		  strcpy(buf, "AD");
 	    } else {
 		  strcpy(buf, "g");
-		  WARN(ole,
-			       "unknown format, \
-c=%c, n=%d\n", type, count);
+		  WARN(ole, "unknown format, c=%c, n=%d\n", type, count);
 	       }
 	    } else if (type == 'h') {
 	       /* gives us hours 1:00 -- 12:00 */
@@ -2152,9 +2167,9 @@
 	    } else if (type == 'H') {
 	       /* 24-hour time */
 	       sprintf(buf, dgfmt[count], xtime->wHour);
-	    } else if (type == 'm') {
+	    } else if ( type == 'm') {
 	       sprintf(buf, dgfmt[count], xtime->wMinute);
-	    } else if (type == 's') {
+	    } else if ( type == 's') {
 	       sprintf(buf, dgfmt[count], xtime->wSecond);
 	    } else if (type == 't') {
 	       if        (count == 1) {
@@ -2235,7 +2250,7 @@
 /**************************************************************
  * OLE_GetFormatW  [internal]  
  */
-INT32 WINAPI OLE_GetFormatW(LCID locale, DWORD flags,
+INT32 WINAPI OLE_GetFormatW(LCID locale, DWORD flags, DWORD tflags,
 			    LPSYSTEMTIME xtime,
 			    LPCWSTR format,
 			    LPWSTR output, INT32 outlen)
@@ -2254,8 +2269,8 @@
 
    /* make a debug report */
    lstrcpynWtoA(abuf, format, sizeof(format));
-   TRACE(ole, "args: %8lx, %8lx, time(d=%d,h=%d,m=%d,s=%d), fmt:\'%s\' (at %p), %p with max len %d\n",
-	 locale, flags, 
+   TRACE(ole, "args: 0x%lx, 0x%lx, 0x%lx, time(d=%d,h=%d,m=%d,s=%d), fmt:\'%s\' (at %p), %p with max len %d\n",
+	 locale, flags, tflags,
 	 xtime->wDay, xtime->wHour, xtime->wMinute, xtime->wSecond,
 	 abuf, format, output, outlen);
    
@@ -2354,10 +2369,10 @@
 	 } else if (type == 'H') {
 	    wsnprintf32W(buf, 5, argarr[count], 
 			 xtime->wHour);
-	 } else if (type == 'm') {
+	 } else if (type == 'm' ) {
 	    wsnprintf32W(buf, 5, argarr[count],
 			 xtime->wMinute);
-	 } else if (type == 's') {
+	 } else if (type == 's' ) {
 	    wsnprintf32W(buf, 5, argarr[count],
 			 xtime->wSecond);
 	 } else if (type == 't') {
@@ -2507,7 +2522,7 @@
   };
 
   
-  ret = OLE_GetFormatA(thislocale, flags, thistime, thisformat, 
+  ret = OLE_GetFormatA(thislocale, flags, 0, thistime, thisformat, 
 		       date, datelen);
   
 
@@ -2599,6 +2614,7 @@
   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;
   }
@@ -2608,32 +2624,27 @@
   } 
   else if (locale == LOCALE_USER_DEFAULT) 
   { thislocale = GetUserDefaultLCID();
-	}
+  }
   else
   { thislocale = locale;
   }
+
+  if ( flags & (TIME_NOTIMEMARKER | TIME_FORCE24HOURFORMAT ))
+  { FIXME(ole,"TIME_NOTIMEMARKER or TIME_FORCE24HOURFORMAT not implemented\n");
+  }
+  flags &= (TIME_NOSECONDS | TIME_NOMINUTESORSECONDS); /* mask for OLE_GetFormatA*/
+
   if (format == NULL) 
-  { if (flags&LOCALE_NOUSEROVERRIDE)  /*use system default*/
+  { 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));
+    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;
@@ -2641,7 +2652,7 @@
   else
   { thistime = xtime;
   }
-  return OLE_GetFormatA(thislocale, thisflags, thistime, thisformat,timestr, timelen);
+  return OLE_GetFormatA(thislocale, thisflags, flags, thistime, thisformat, timestr, timelen);
 }
 
 
@@ -2706,7 +2717,7 @@
       GetSystemTime(realtime);
    }
 
-   retval = OLE_GetFormatW(locale, flags, realtime, realformat, timestr,  timelen);
+   retval = OLE_GetFormatW(locale, flags, 0, realtime, realformat, timestr,  timelen);
    if (fmt_buf)
 	free(fmt_buf);
    return retval;
diff --git a/ole/oledlg.c b/ole/oledlg.c
new file mode 100644
index 0000000..51d6051
--- /dev/null
+++ b/ole/oledlg.c
@@ -0,0 +1,292 @@
+/*
+ *	OLEDLG library
+ *
+ *	Copyright 1998	Patrik Stridvall
+ */
+
+#include "windows.h"
+#include "wintypes.h"
+#include "winerror.h"
+#include "ole.h"
+#include "oledlg.h"
+#include "compobj.h"
+#include "debug.h"
+
+/***********************************************************************
+ *           OleUIAddVerbMenu32A (OLEDLG.1)
+ */
+
+BOOL32 WINAPI OleUIAddVerbMenu32A(
+    LPOLEOBJECT lpOleObj, LPCSTR lpszShortType,
+    HMENU32 hMenu, UINT32 uPos, UINT32 uIDVerbMin, UINT32 uIDVerbMax,
+    BOOL32 bAddConvert, UINT32 idConvert, HMENU32 *lphMenu)
+{
+  FIXME(ole,"(%p,%s,0x%08x,%d,%d,%d,%d,%d,%p): stub\n",
+	lpOleObj, lpszShortType,
+        hMenu, uPos, uIDVerbMin, uIDVerbMax,
+        bAddConvert, idConvert, lphMenu
+  );
+  SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
+  return FALSE;
+}
+
+/***********************************************************************
+ *           OleUIAddVerbMenu32W (OLEDLG.14)
+ */
+
+BOOL32 WINAPI OleUIAddVerbMenu32W(
+    LPOLEOBJECT lpOleObj, LPCWSTR lpszShortType,
+    HMENU32 hMenu, UINT32 uPos, UINT32 uIDVerbMin, UINT32 uIDVerbMax,
+    BOOL32 bAddConvert, UINT32 idConvert, HMENU32 *lphMenu)
+{
+  FIXME(ole,"(%p,%s,0x%08x,%d,%d,%d,%d,%d,%p): stub\n",
+	lpOleObj, lpszShortType,
+        hMenu, uPos, uIDVerbMin, uIDVerbMax,
+        bAddConvert, idConvert, lphMenu
+  );
+  SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
+  return FALSE;
+}
+
+/***********************************************************************
+ *           OleUICanConvertOrActivateAs32 (OLEDLG.2)
+ */
+
+BOOL32 WINAPI OleUICanConvertOrActivateAs32(
+    REFCLSID rClsid, BOOL32 fIsLinkedObject, WORD wFormat)
+{
+  FIXME(ole,"stub\n");
+  SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
+  return FALSE;
+}
+
+/***********************************************************************
+ *           OleUIInsertObject32A (OLEDLG.3)
+ */
+
+UINT32 WINAPI OleUIInsertObject32A(LPOLEUIINSERTOBJECTA lpOleUIInsertObject)
+{
+  FIXME(ole,"(%p): stub\n",lpOleUIInsertObject);
+  SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
+  return OLEUI_FALSE;
+}
+
+/***********************************************************************
+ *           OleUIInsertObject32W (OLEDLG.20)
+ */
+
+UINT32 WINAPI OleUIInsertObject32W(LPOLEUIINSERTOBJECTW lpOleUIInsertObject)
+{
+  FIXME(ole,"(%p): stub\n",lpOleUIInsertObject);
+  SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
+  return OLEUI_FALSE;
+}
+
+/***********************************************************************
+ *           OleUIPasteSpecial32A (OLEDLG.4)
+ */
+
+UINT32 WINAPI OleUIPasteSpecial32A(LPOLEUIPASTESPECIALA lpOleUIPasteSpecial)
+{
+  FIXME(ole,"(%p): stub\n",lpOleUIPasteSpecial);
+  SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
+  return OLEUI_FALSE;
+}
+
+/***********************************************************************
+ *           OleUIPasteSpecial32W (OLEDLG.22)
+ */
+
+UINT32 WINAPI OleUIPasteSpecial32W(LPOLEUIPASTESPECIALW lpOleUIPasteSpecial)
+{
+  FIXME(ole,"(%p): stub\n",lpOleUIPasteSpecial);
+  SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
+  return OLEUI_FALSE;
+}
+
+/***********************************************************************
+ *           OleUIEditLinks32A (OLEDLG.5)
+ */
+
+UINT32 WINAPI OleUIEditLinks32A(LPOLEUIEDITLINKSA lpOleUIEditLinks)
+{
+  FIXME(ole,"(%p): stub\n",lpOleUIEditLinks);
+  SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
+  return OLEUI_FALSE;
+}
+
+/***********************************************************************
+ *           OleUIEditLinks32W (OLEDLG.19)
+ */
+
+UINT32 WINAPI OleUIEditLinks32W(LPOLEUIEDITLINKSW lpOleUIEditLinks)
+{
+  FIXME(ole,"(%p): stub\n",lpOleUIEditLinks);
+  SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
+  return OLEUI_FALSE;
+}
+
+/***********************************************************************
+ *           OleUIChangeIcon32A (OLEDLG.6)
+ */
+
+UINT32 WINAPI OleUIChangeIcon32A(LPOLEUICHANGEICONA lpOleUIChangeIcon)
+{
+  FIXME(ole,"(%p): stub\n",lpOleUIChangeIcon);
+  SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
+  return OLEUI_FALSE;
+}
+
+/***********************************************************************
+ *           OleUIChangeIcon32W (OLEDLG.16)
+ */
+
+UINT32 WINAPI OleUIChangeIcon32W(LPOLEUICHANGEICONW lpOleUIChangeIcon)
+{
+  FIXME(ole,"(%p): stub\n",lpOleUIChangeIcon);
+  SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
+  return OLEUI_FALSE;
+}
+
+/***********************************************************************
+ *           OleUIConvert32A (OLEDLG.7)
+ */
+
+UINT32 WINAPI OleUIConvert32A(LPOLEUICONVERTA lpOleUIConvert)
+{
+  FIXME(ole,"(%p): stub\n",lpOleUIConvert);
+  SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
+  return OLEUI_FALSE;
+}
+
+/***********************************************************************
+ *           OleUIConvert32W (OLEDLG.18)
+ */
+
+UINT32 WINAPI OleUIConvert32W(LPOLEUICONVERTW lpOleUIConvert)
+{
+  FIXME(ole,"(%p): stub\n",lpOleUIConvert);
+  SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
+  return OLEUI_FALSE;
+}
+
+/***********************************************************************
+ *           OleUIBusy32A (OLEDLG.8)
+ */
+
+UINT32 WINAPI OleUIBusy32A(LPOLEUIBUSYA lpOleUIBusy)
+{
+  FIXME(ole,"(%p): stub\n",lpOleUIBusy);
+  SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
+  return OLEUI_FALSE;
+}
+
+/***********************************************************************
+ *           OleUIBusy32W (OLEDLG.15)
+ */
+
+UINT32 WINAPI OleUIBusy32W(LPOLEUIBUSYW lpOleUIBusy)
+{
+  FIXME(ole,"(%p): stub\n",lpOleUIBusy);
+  SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
+  return OLEUI_FALSE;
+}
+
+/***********************************************************************
+ *           OleUIUpdateLinks32A (OLEDLG.9)
+ */
+
+BOOL32 WINAPI OleUIUpdateLinks32A(
+    LPOLEUILINKCONTAINERA lpOleUILinkCntr,
+    HWND32 hwndParent, LPSTR lpszTitle, INT32 cLinks)
+{
+  FIXME(ole,"(%p,0x%08x,%s,%d): stub\n",
+	lpOleUILinkCntr,hwndParent,lpszTitle, cLinks);
+  SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
+  return FALSE;
+}
+
+/***********************************************************************
+ *           OleUIUpdateLinks32W (OLEDLG.?)
+ * FIXME
+ *     I haven't been able to find the ordinal for this function,
+ *     This means it can't be called from outside the DLL.
+ */
+
+BOOL32 WINAPI OleUIUpdateLinks32W(
+    LPOLEUILINKCONTAINERW lpOleUILinkCntr,
+    HWND32 hwndParent, LPWSTR lpszTitle, INT32 cLinks)
+{
+  FIXME(ole,"(%p,0x%08x,%s,%d): stub\n",lpOleUILinkCntr,hwndParent,lpszTitle, cLinks);
+  SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
+  return FALSE;
+}
+
+/***********************************************************************
+ *           OleUIPromptUser32A (OLEDLG.10)
+ */
+
+INT32 __cdecl OleUIPromptUser32A(INT32 nTemplate, HWND32 hwndParent, ...)
+{
+  FIXME(ole,"(%d,0x%08x,...): stub\n",nTemplate,hwndParent);
+  SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
+  return OLEUI_FALSE;
+}
+
+/***********************************************************************
+ *           OleUIPromptUser32W (OLEDLG.13)
+ */
+
+INT32 __cdecl OleUIPromptUser32W(INT32 nTemplate, HWND32 hwndParent, ...)
+{
+  FIXME(ole,"(%d,0x%08x,...): stub\n",nTemplate,hwndParent);
+  SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
+  return OLEUI_FALSE;
+}
+
+/***********************************************************************
+ *           OleUIObjectProperties32A (OLEDLG.11)
+ */
+
+UINT32 WINAPI OleUIObjectProperties32A(LPOLEUIOBJECTPROPSA lpOleUIObjectProps)
+{
+  FIXME(ole,"(%p): stub\n",lpOleUIObjectProps);
+  SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
+  return OLEUI_FALSE;
+}
+
+/***********************************************************************
+ *           OleUIObjectProperties32W (OLEDLG.21)
+ */
+
+UINT32 WINAPI OleUIObjectProperties32W(LPOLEUIOBJECTPROPSW lpOleUIObjectProps)
+{
+  FIXME(ole,"(%p): stub\n",lpOleUIObjectProps);
+  SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
+  return OLEUI_FALSE;
+}
+
+/***********************************************************************
+ *           OleUIChangeSource32A (OLEDLG.12)
+ */
+
+UINT32 OleUIChangeSource32A(LPOLEUICHANGESOURCEA lpOleUIChangeSource)
+{
+  FIXME(ole,"(%p): stub\n",lpOleUIChangeSource);
+  SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
+  return OLEUI_FALSE;
+}
+
+/***********************************************************************
+ *           OleUIChangeSource32W (OLEDLG.17)
+ */
+
+UINT32 OleUIChangeSource32W(LPOLEUICHANGESOURCEW lpOleUIChangeSource)
+{
+  FIXME(ole,"(%p): stub\n",lpOleUIChangeSource);
+  SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
+  return OLEUI_FALSE;
+}
+
+
+
diff --git a/relay32/Makefile.in b/relay32/Makefile.in
index 0ce4e49..9d87194 100644
--- a/relay32/Makefile.in
+++ b/relay32/Makefile.in
@@ -17,14 +17,17 @@
 	dplayx.spec \
 	dsound.spec \
 	gdi32.spec \
+	imm32.spec \
 	kernel32.spec \
 	lz32.spec \
 	mpr.spec \
+	msnet32.spec \
 	msvfw32.spec \
 	ntdll.spec \
 	ole32.spec \
 	oleaut32.spec \
 	olecli32.spec \
+	oledlg.spec \
 	olesvr32.spec \
 	rasapi32.spec \
 	shell32.spec \
diff --git a/relay32/builtin32.c b/relay32/builtin32.c
index 04c579e..18081a9 100644
--- a/relay32/builtin32.c
+++ b/relay32/builtin32.c
@@ -39,14 +39,17 @@
 extern const BUILTIN32_DESCRIPTOR DPLAYX_Descriptor;
 extern const BUILTIN32_DESCRIPTOR DSOUND_Descriptor;
 extern const BUILTIN32_DESCRIPTOR GDI32_Descriptor;
+extern const BUILTIN32_DESCRIPTOR IMM32_Descriptor;
 extern const BUILTIN32_DESCRIPTOR KERNEL32_Descriptor;
 extern const BUILTIN32_DESCRIPTOR LZ32_Descriptor;
 extern const BUILTIN32_DESCRIPTOR MPR_Descriptor;
+extern const BUILTIN32_DESCRIPTOR MSNET32_Descriptor;
 extern const BUILTIN32_DESCRIPTOR MSVFW32_Descriptor;
 extern const BUILTIN32_DESCRIPTOR NTDLL_Descriptor;
 extern const BUILTIN32_DESCRIPTOR OLE32_Descriptor;
 extern const BUILTIN32_DESCRIPTOR OLEAUT32_Descriptor;
 extern const BUILTIN32_DESCRIPTOR OLECLI32_Descriptor;
+extern const BUILTIN32_DESCRIPTOR OLEDLG_Descriptor;
 extern const BUILTIN32_DESCRIPTOR OLESVR32_Descriptor;
 extern const BUILTIN32_DESCRIPTOR RASAPI32_Descriptor;
 extern const BUILTIN32_DESCRIPTOR SHELL32_Descriptor;
@@ -73,14 +76,17 @@
     { &DPLAYX_Descriptor,   TRUE  },
     { &DSOUND_Descriptor,   TRUE  },
     { &GDI32_Descriptor,    TRUE  },
+    { &IMM32_Descriptor,    FALSE },
     { &KERNEL32_Descriptor, TRUE  },
     { &LZ32_Descriptor,     TRUE  },
     { &MPR_Descriptor,      TRUE  },
+    { &MSNET32_Descriptor,  FALSE },
     { &MSVFW32_Descriptor,  FALSE },
     { &NTDLL_Descriptor,    TRUE  },
     { &OLE32_Descriptor,    FALSE },
     { &OLEAUT32_Descriptor, FALSE },
     { &OLECLI32_Descriptor, FALSE },
+    { &OLEDLG_Descriptor,   FALSE },
     { &OLESVR32_Descriptor, FALSE },
     { &RASAPI32_Descriptor, FALSE },
     { &SHELL32_Descriptor,  TRUE  },
diff --git a/relay32/comctl32.spec b/relay32/comctl32.spec
index c385cf6..e1f35e5 100644
--- a/relay32/comctl32.spec
+++ b/relay32/comctl32.spec
@@ -77,9 +77,9 @@
  69 stdcall ImageList_ReplaceIcon(ptr long long) ImageList_ReplaceIcon
  70 stdcall ImageList_SetBkColor(ptr long) ImageList_SetBkColor
  71 stdcall Alloc(long) COMCTL32_Alloc
- 72 stdcall ReAlloc(long long) COMCTL32_ReAlloc
- 73 stdcall Free(long) COMCTL32_Free
- 74 stdcall GetSize(long) COMCTL32_GetSize
+ 72 stdcall ReAlloc(ptr long) COMCTL32_ReAlloc
+ 73 stdcall Free(ptr) COMCTL32_Free
+ 74 stdcall GetSize(ptr) COMCTL32_GetSize
  75 stdcall ImageList_SetDragCursorImage(ptr long long long) ImageList_SetDragCursorImage
  76 stdcall ImageList_SetFilter(ptr long long) ImageList_SetFilter
  77 stdcall ImageList_SetIconSize(ptr long long) ImageList_SetIconSize
@@ -94,19 +94,19 @@
  86 stub UninitializeFlatSB
  87 stub _TrackMouseEvent
 
-151 stub CreateMRUList
-152 stub FreeMRUList
-153 stub AddMRUStringA
-154 stub EnumMRUListA
-155 stub FindMRUStringA
-156 stub DelMRUString
+151 stdcall CreateMRUListA(long) CreateMRUList32A
+152 stub FreeMRUList@4
+153 stub AddMRUStringA@8
+154 stub EnumMRUListA@16
+155 stub FindMRUStringA@12
+156 stub DelMRUString@8
 157 stub COMCTL32_157
 
 163 stub CreatePage
 164 stub CreateProxyPage
 
-167 stub AddMRUData
-169 stub FindMRUData
+167 stub AddMRUData@12
+169 stub FindMRUData@16
 
 233 stub Str_GetPtrA
 234 stdcall Str_SetPtrA(long long) COMCTL32_Str_SetPtrA
@@ -116,24 +116,23 @@
 320 stdcall DSA_Create(long long) DSA_Create
 321 stdcall DSA_Destroy(ptr) DSA_Destroy
 322 stdcall DSA_GetItem(ptr long long) DSA_GetItem
-323 stdcall DSA_GetItemPtr(long long) DSA_GetItemPtr
-324 stdcall DSA_InsertItem(long long long) DSA_InsertItem
-325 stdcall DSA_SetItem (long long long) DSA_SetItem
-326 stdcall DSA_DeleteItem(long long) DSA_DeleteItem
-327 stub DSA_DeleteAllItems
-
+323 stdcall DSA_GetItemPtr(ptr long) DSA_GetItemPtr
+324 stdcall DSA_InsertItem(ptr long long) DSA_InsertItem
+325 stdcall DSA_SetItem (ptr long long) DSA_SetItem
+326 stdcall DSA_DeleteItem(ptr long) DSA_DeleteItem
+327 stdcall DSA_DeleteAllItems(ptr) DSA_DeleteAllItems
 328 stdcall DPA_Create(long) DPA_Create
-329 stub DPA_Destroy
-330 stub DPA_Grow
-331 stub DPA_Clone
-332 stdcall DPA_GetPtr(long long) DPA_GetPtr
-333 stub DPA_GetPtrIndex
-334 stdcall DPA_InsertPtr(long long long) DPA_InsertPtr
-335 stub DPA_SetPtr
-336 stub DPA_DeletePtr
-337 stub DPA_DeleteAllPtrs
-338 stub DPA_Sort
-339 stub DPA_Search
+329 stdcall DPA_Destroy(ptr) DPA_Destroy
+330 stdcall DPA_Grow(ptr long) DPA_Grow
+331 stdcall DPA_Clone(ptr ptr) DPA_Clone
+332 stdcall DPA_GetPtr(ptr long) DPA_GetPtr
+333 stdcall DPA_GetPtrIndex(ptr ptr) DPA_GetPtrIndex
+334 stdcall DPA_InsertPtr(ptr long ptr) DPA_InsertPtr
+335 stdcall DPA_SetPtr(ptr long ptr) DPA_SetPtr
+336 stdcall DPA_DeletePtr(ptr long) DPA_DeletePtr
+337 stdcall DPA_DeleteAllPtrs(ptr) DPA_DeleteAllPtrs
+338 stdcall DPA_Sort(ptr ptr long) DPA_Sort
+339 stdcall DPA_Search(ptr ptr long ptr long long) DPA_Search
 340 stdcall DPA_CreateEx(long long) DPA_CreateEx
 341 stdcall SendNotify(long long long long) COMCTL32_SendNotify
 342 stub SendNotifyEx
@@ -163,12 +162,12 @@
 373 stub StrRStrIW
 374 stub StrCSpnIA
 375 stub StrCSpnIW
-376 stub IntlStrEqWorkerA
-377 stub IntlStrEqWorkerW
+376 stub IntlStrEqWorkerA@16
+377 stub IntlStrEqWorkerW@16
 
-382 stub SmoothScrollWindow
-383 stub DoReaderMode
-384 stub SetPathWordBreakProc
+382 stub SmoothScrollWindow@4
+383 stub DoReaderMode@4
+384 stub SetPathWordBreakProc@8
 385 stub COMCTL32_385
 386 stub COMCTL32_386
 387 stub COMCTL32_387
@@ -176,10 +175,10 @@
 389 stub COMCTL32_389
 390 stub COMCTL32_390
 
-400 stub COMCTL32_400
-401 stub COMCTL32_401
-402 stub COMCTL32_402
-403 stub COMCTL32_403
+400 stub CreateMRUListW@4
+401 stub AddMRUStringW@8
+402 stub FindMRUStringW@12
+403 stub EnumMRUListW@16
 404 stub COMCTL32_404
 
 410 stub COMCTL32_410
diff --git a/relay32/imm32.spec b/relay32/imm32.spec
new file mode 100644
index 0000000..f85fb83
--- /dev/null
+++ b/relay32/imm32.spec
@@ -0,0 +1,75 @@
+name	imm32
+type	win32
+
+  1 stdcall ImmAssociateContext(long long) ImmAssociateContext32
+  2 stdcall ImmConfigureIMEA(long long long ptr) ImmConfigureIME32A
+  3 stdcall ImmConfigureIMEW(long long long ptr) ImmConfigureIME32W
+  4 stdcall ImmCreateContext() ImmCreateContext32
+  5 stub ImmCreateIMCC
+  6 stub ImmCreateSoftKeyboard
+  7 stdcall ImmDestroyContext(long) ImmDestroyContext32
+  8 stub ImmDestroyIMCC
+  9 stub ImmDestroySoftKeyboard
+ 10 stdcall ImmEnumRegisterWordA(long ptr str long str ptr) ImmEnumRegisterWord32A
+ 11 stdcall ImmEnumRegisterWordW(long ptr wstr long wstr ptr) ImmEnumRegisterWord32W
+ 12 stdcall ImmEscapeA(long long long ptr) ImmEscape32A
+ 13 stdcall ImmEscapeW(long long long ptr) ImmEscape32W
+ 14 stub ImmGenerateMessage
+ 15 stdcall ImmGetCandidateListA(long long ptr long) ImmGetCandidateList32A
+ 16 stdcall ImmGetCandidateListCountA(long ptr) ImmGetCandidateListCount32A
+ 17 stdcall ImmGetCandidateListCountW(long ptr) ImmGetCandidateListCount32W
+ 18 stdcall ImmGetCandidateListW(long long ptr long) ImmGetCandidateList32W
+ 19 stdcall ImmGetCandidateWindow(long long ptr) ImmGetCandidateWindow32
+ 20 stdcall ImmGetCompositionFontA(long ptr) ImmGetCompositionFont32A
+ 21 stdcall ImmGetCompositionFontW(long ptr) ImmGetCompositionFont32W
+ 22 stdcall ImmGetCompositionStringA (long long ptr long) ImmGetCompositionString32A
+ 23 stdcall ImmGetCompositionStringW (long long ptr long) ImmGetCompositionString32W
+ 24 stdcall ImmGetCompositionWindow(long ptr) ImmGetCompositionWindow32
+ 25 stdcall ImmGetContext(long) ImmGetContext32
+ 26 stdcall ImmGetConversionListA(long long str ptr long long) ImmGetConversionList32A
+ 27 stdcall ImmGetConversionListW(long long wstr ptr long long) ImmGetConversionList32W
+ 28 stdcall ImmGetConversionStatus(long ptr ptr) ImmGetConversionStatus32
+ 29 stdcall ImmGetDefaultIMEWnd(long) ImmGetDefaultIMEWnd32
+ 30 stdcall ImmGetDescriptionA(long str long) ImmGetDescription32A
+ 31 stdcall ImmGetDescriptionW(long wstr long) ImmGetDescription32W
+ 32 stdcall ImmGetGuideLineA(long long str long) ImmGetGuideLine32A
+ 33 stdcall ImmGetGuideLineW(long long wstr long) ImmGetGuideLine32W
+ 34 stub ImmGetHotKey
+ 35 stub ImmGetIMCCLockCount
+ 36 stub ImmGetIMCCSize
+ 37 stub ImmGetIMCLockCount
+ 38 stdcall ImmGetIMEFileNameA(long str long) ImmGetIMEFileName32A
+ 39 stdcall ImmGetIMEFileNameW(long wstr long) ImmGetIMEFileName32W
+ 40 stdcall ImmGetOpenStatus(long) ImmGetOpenStatus32
+ 41 stdcall ImmGetProperty(long long) ImmGetProperty32
+ 42 stdcall ImmGetRegisterWordStyleA(long long ptr) ImmGetRegisterWordStyle32A
+ 43 stdcall ImmGetRegisterWordStyleW(long long ptr) ImmGetRegisterWordStyle32W
+ 44 stdcall ImmGetStatusWindowPos(long ptr) ImmGetStatusWindowPos32
+ 45 stdcall ImmGetVirtualKey(long) ImmGetVirtualKey32
+ 46 stdcall ImmInstallIMEA(str str) ImmInstallIME32A
+ 47 stdcall ImmInstallIMEW(wstr wstr) ImmInstallIME32W
+ 48 stdcall ImmIsIME(long) ImmIsIME32
+ 49 stdcall ImmIsUIMessageA(long long long long) ImmIsUIMessage32A
+ 50 stdcall ImmIsUIMessageW(long long long long) ImmIsUIMessage32W
+ 51 stub ImmLockIMC
+ 52 stub ImmLockIMCC
+ 53 stdcall ImmNotifyIME(long long long long) ImmNotifyIME32
+ 54 stub ImmReSizeIMCC
+ 55 stdcall ImmRegisterWordA(long str long str) ImmRegisterWord32A
+ 56 stdcall ImmRegisterWordW(long wstr long wstr) ImmRegisterWord32W
+ 57 stdcall ImmReleaseContext(long long) ImmReleaseContext32
+ 58 stdcall ImmSetCandidateWindow(long ptr) ImmSetCandidateWindow32
+ 59 stdcall ImmSetCompositionFontA(long ptr) ImmSetCompositionFont32A
+ 60 stdcall ImmSetCompositionFontW(long ptr) ImmSetCompositionFont32W
+ 61 stdcall ImmSetCompositionStringA(long long ptr long ptr long) ImmSetCompositionString32A
+ 62 stdcall ImmSetCompositionStringW(long long ptr long ptr long) ImmSetCompositionString32W
+ 63 stdcall ImmSetCompositionWindow(long ptr) ImmSetCompositionWindow32
+ 64 stdcall ImmSetConversionStatus(long long long) ImmSetConversionStatus32
+ 65 stub ImmSetHotKey
+ 66 stdcall ImmSetOpenStatus(long long) ImmSetOpenStatus32
+ 67 stdcall ImmSetStatusWindowPos(long ptr) ImmSetStatusWindowPos32
+ 68 stub ImmShowSoftKeyboard
+ 69 stdcall ImmSimulateHotKey(long long) ImmSimulateHotKey32
+ 70 stub ImmUnlockIMC
+ 71 stub ImmUnlockIMCC
+ 72 stdcall ImmUnregisterWordA(long str long str) ImmUnregisterWord32A
diff --git a/relay32/kernel32.spec b/relay32/kernel32.spec
index 2c08e16..7e11ef5 100644
--- a/relay32/kernel32.spec
+++ b/relay32/kernel32.spec
@@ -379,13 +379,13 @@
 362 stdcall GetPrivateProfileIntA(str str long str) GetPrivateProfileInt32A
 363 stdcall GetPrivateProfileIntW(wstr wstr long wstr) GetPrivateProfileInt32W
 364 stdcall GetPrivateProfileSectionA(str str long str) GetPrivateProfileSection32A
-365 stub GetPrivateProfileSectionNamesA
-366 stub GetPrivateProfileSectionNamesW
-367 stub GetPrivateProfileSectionW
+365 stdcall GetPrivateProfileSectionNamesA(ptr long str) GetPrivateProfileSectionNames32A
+366 stdcall GetPrivateProfileSectionNamesW(ptr long wstr) GetPrivateProfileSectionNames32W
+367 stdcall GetPrivateProfileSectionW(wstr wstr long wstr) GetPrivateProfileSection32W
 368 stdcall GetPrivateProfileStringA(str str str ptr long str) GetPrivateProfileString32A
 369 stdcall GetPrivateProfileStringW(wstr wstr wstr ptr long wstr) GetPrivateProfileString32W
 370 stdcall GetPrivateProfileStructA (str str ptr long str) GetPrivateProfileStruct32A
-371 stub GetPrivateProfileStructW
+371 stdcall GetPrivateProfileStructW(wstr wstr ptr long wstr) GetPrivateProfileStruct32W
 372 stdcall GetProcAddress(long str) GetProcAddress32
 373 stdcall GetProcessAffinityMask(long ptr ptr) GetProcessAffinityMask
 374 stdcall GetProcessFlags(long) GetProcessFlags
@@ -399,7 +399,7 @@
 382 stdcall GetProfileIntA(str str long) GetProfileInt32A
 383 stdcall GetProfileIntW(wstr wstr long) GetProfileInt32W
 384 stdcall GetProfileSectionA(str str long) GetProfileSection32A
-385 stub GetProfileSectionW
+385 stdcall GetProfileSectionW(wstr wstr long) GetProfileSection32W
 386 stdcall GetProfileStringA(str str str ptr long) GetProfileString32A
 387 stdcall GetProfileStringW(wstr wstr wstr ptr long) GetProfileString32W
 388 stub GetQueuedCompletionStatus
@@ -689,7 +689,7 @@
 672 stdcall SetThreadPriority(long long) SetThreadPriority
 673 stdcall SetTimeZoneInformation(ptr) SetTimeZoneInformation
 674 stdcall SetUnhandledExceptionFilter(ptr) SetUnhandledExceptionFilter
-675 stub SetVolumeLabelA
+675 stdcall SetVolumeLabelA(str str) SetVolumeLabel32A
 676 stub SetVolumeLabelW
 677 stdcall SetupComm(long long long) SetupComm
 678 stdcall SizeofResource(long long) SizeofResource32
@@ -755,14 +755,14 @@
 738 stdcall WriteFile(long ptr long ptr ptr) WriteFile
 739 stub WriteFileEx
 740 stdcall WritePrivateProfileSectionA(str str str) WritePrivateProfileSection32A
-741 stub WritePrivateProfileSectionW
+741 stdcall WritePrivateProfileSectionW(wstr wstr wstr) WritePrivateProfileSection32W
 742 stdcall WritePrivateProfileStringA(str str str str) WritePrivateProfileString32A
 743 stdcall WritePrivateProfileStringW(wstr wstr wstr wstr) WritePrivateProfileString32W
 744 stdcall WritePrivateProfileStructA (str str ptr long str) WritePrivateProfileStruct32A
-745 stub WritePrivateProfileStructW
+745 stdcall WritePrivateProfileStructW(wstr wstr ptr long wstr) WritePrivateProfileStruct32W
 746 stdcall WriteProcessMemory(long ptr ptr long ptr) WriteProcessMemory
-747 stub WriteProfileSectionA
-748 stub WriteProfileSectionW
+747 stdcall WriteProfileSectionA(str str) WriteProfileSection32A
+748 stdcall WriteProfileSectionW(str str) WriteProfileSection32W
 749 stdcall WriteProfileStringA(str str str) WriteProfileString32A
 750 stdcall WriteProfileStringW(wstr wstr wstr) WriteProfileString32W
 751 stub WriteTapemark
diff --git a/relay32/msnet32.spec b/relay32/msnet32.spec
new file mode 100644
index 0000000..7b316dd
--- /dev/null
+++ b/relay32/msnet32.spec
@@ -0,0 +1,100 @@
+name msnet32
+type win32
+
+  1 stub MSNET32_1
+  2 stub MSNET32_2
+  3 stub MSNET32_3
+  4 stub MSNET32_4
+  5 stub MSNET32_5
+  6 stub MSNET32_6
+  7 stub MSNET32_7
+  8 stub MSNET32_8
+  9 stub MSNET32_9
+ 10 stub MSNET32_10
+ 11 stub MSNET32_11
+ 12 stub MSNET32_12
+ 13 stub MSNET32_13
+ 14 stub MSNET32_14
+ 15 stub MSNET32_15
+ 16 stub MSNET32_16
+ 17 stub MSNET32_17
+ 18 stub MSNET32_18
+ 19 stub MSNET32_19
+ 20 stub MSNET32_20
+ 21 stub MSNET32_21
+ 22 stub MSNET32_22
+ 23 stub MSNET32_23
+ 24 stub MSNET32_24
+ 25 stub MSNET32_25
+ 26 stub MSNET32_26
+ 27 stub MSNET32_27
+ 28 stub MSNET32_28
+ 29 stub MSNET32_29
+ 30 stub MSNET32_30
+ 31 stub MSNET32_31
+ 32 stub MSNET32_32
+ 33 stub MSNET32_33
+ 34 stub MSNET32_34
+ 35 stub MSNET32_35
+ 36 stub MSNET32_36
+ 37 stub MSNET32_37
+ 38 stub MSNET32_38
+ 39 stub MSNET32_39
+ 40 stub MSNET32_40
+ 41 stub MSNET32_41
+ 42 stub MSNET32_42
+ 43 stub MSNET32_43
+ 44 stub MSNET32_44
+ 45 stub MSNET32_45
+ 46 stub MSNET32_46
+ 47 stub MSNET32_47
+ 48 stub MSNET32_48
+ 49 stub MSNET32_49
+ 50 stub MSNET32_50
+ 51 stub MSNET32_51
+ 52 stub MSNET32_52
+ 53 stub MSNET32_53
+ 54 stub MSNET32_54
+ 55 stub MSNET32_55
+ 56 stub MSNET32_56
+ 57 stub MSNET32_57
+ 58 stub MSNET32_58
+ 59 stub MSNET32_59
+ 60 stub MSNET32_60
+ 61 stub MSNET32_61
+ 62 stub MSNET32_62
+ 63 stub MSNET32_63
+ 64 stub MSNET32_64
+ 65 stub MSNET32_65
+ 66 stub MSNET32_66
+ 67 stub MSNET32_67
+ 68 stub MSNET32_68
+ 69 stub MSNET32_69
+ 70 stub MSNET32_70
+ 71 stub MSNET32_71
+ 72 stub MSNET32_72
+ 73 stub MSNET32_73
+ 74 stub MSNET32_74
+ 75 stub MSNET32_75
+ 76 stub MSNET32_76
+ 77 stub MSNET32_77
+ 78 stub MSNET32_78
+ 79 stub MSNET32_79
+ 80 stub MSNET32_80
+ 81 stub MSNET32_81
+ 82 stub MSNET32_82
+ 83 stub MSNET32_83
+ 84 stub MSNET32_84
+ 85 stub MSNET32_85
+ 86 stub MSNET32_86
+ 87 stub MSNET32_87
+ 88 stub MSNET32_88
+ 89 stub MSNET32_89
+ 90 stub MSNET32_90
+ 91 stub MSNET32_91
+ 92 stub MSNET32_92
+ 93 stub MSNET32_93
+ 94 stub MSNET32_94
+ 95 stub MSNET32_95
+ 96 stub MSNET32_96
+  
diff --git a/relay32/ole32.spec b/relay32/ole32.spec
index 4883fdb..dc4f26e 100644
--- a/relay32/ole32.spec
+++ b/relay32/ole32.spec
@@ -141,7 +141,7 @@
 138 stub ReadStringStream
 139 stdcall RegisterDragDrop(long ptr) RegisterDragDrop32
 140 stub ReleaseStgMedium
-141 stub RevokeDragDrop
+141 stdcall RevokeDragDrop(long) RevokeDragDrop32
 142 stub SetConvertStg
 143 stub SetDocumentBitStg
 144 stdcall StgCreateDocfile(wstr long long ptr) StgCreateDocFile32
diff --git a/relay32/oledlg.spec b/relay32/oledlg.spec
new file mode 100644
index 0000000..ba6b630
--- /dev/null
+++ b/relay32/oledlg.spec
@@ -0,0 +1,26 @@
+name	oledlg
+type	win32
+
+  1 stdcall OleUIAddVerbMenuA(ptr str long long long long long long ptr) OleUIAddVerbMenu32A
+  2 stdcall OleUICanConvertOrActivateAs(ptr long long) OleUICanConvertOrActivateAs32
+  3 stdcall OleUIInsertObjectA(ptr) OleUIInsertObject32A
+  4 stdcall OleUIPasteSpecialA(ptr) OleUIPasteSpecial32A
+  5 stdcall OleUIEditLinksA(ptr) OleUIEditLinks32A
+  6 stdcall OleUIChangeIconA(ptr) OleUIChangeIcon32A
+  7 stdcall OleUIConvertA(ptr) OleUIConvert32A
+  8 stdcall OleUIBusyA(ptr) OleUIBusy32A
+  9 stdcall OleUIUpdateLinksA(ptr long str long) OleUIUpdateLinks32A
+ 10 varargs OleUIPromptUserA() OleUIPromptUser32A
+ 11 stdcall OleUIObjectPropertiesA(ptr) OleUIObjectProperties32A
+ 12 stdcall OleUIChangeSourceA(ptr) OleUIChangeSource32A
+ 13 varargs OleUIPromptUserW() OleUIPromptUser32W
+ 14 stdcall OleUIAddVerbMenuW(ptr wstr long long long long long long ptr) OleUIAddVerbMenu32W
+ 15 stdcall OleUIBusyW(ptr) OleUIBusy32W
+ 16 stdcall OleUIChangeIconW(ptr) OleUIChangeIcon32W
+ 17 stdcall OleUIChangeSourceW(ptr) OleUIChangeSource32W
+ 18 stdcall OleUIConvertW(ptr) OleUIConvert32W
+ 19 stdcall OleUIEditLinksW(ptr) OleUIEditLinks32W
+ 20 stdcall OleUIInsertObjectW(ptr) OleUIInsertObject32W
+ 21 stdcall OleUIObjectPropertiesW(ptr) OleUIObjectProperties32W
+ 22 stdcall OleUIPasteSpecialW(ptr) OleUIPasteSpecial32W
+
diff --git a/relay32/shell32.spec b/relay32/shell32.spec
index 64e3546..d7fd6d0 100644
--- a/relay32/shell32.spec
+++ b/relay32/shell32.spec
@@ -114,16 +114,16 @@
  106 stub FileMenu_FindSubMenuByPidl
  107 stub FileMenu_GetLastSelectedItemPidls
  108 stub FileMenu_HandleMenuChar
- 109 stub FileMenu_InitMenuPopup
+ 109 stdcall FileMenu_InitMenuPopup (long) FileMenu_InitMenuPopup
  110 stub FileMenu_InsertUsingPidl
  111 stub FileMenu_Invalidate
  112 stub FileMenu_MeasureItem
  113 stub FileMenu_ReplaceUsingPidl
  114 stdcall FileMenu_Create (long long long long long) FileMenu_Create
  115 stub FileMenu_AppendItem
- 116 stub FileMenu_TrackPopupMenuEx
+ 116 stdcall FileMenu_TrackPopupMenuEx (long long long long long long) FileMenu_TrackPopupMenuEx
  117 stub FileMenu_DeleteItemByCmd
- 118 stub FileMenu_Destroy
+ 118 stdcall FileMenu_Destroy (long) FileMenu_Destroy
  119 stdcall IsLFNDrive(str) IsLFNDrive
  120 stub FileMenu_AbortInitMenu
  121 stub SHFlushClipboard
@@ -132,7 +132,7 @@
  124 stub FileMenu_AppendFilesForPidl
  125 stub FileMenu_AddFilesForPidl
  126 stub SHOutOfMemoryMessageBox
- 127 stub SHWinHelp
+ 127 stdcall SHWinHelp (long long long long) SHWinHelp
  128 stdcall DllGetClassObject(long long ptr) SHELL32_DllGetClassObject
  129 stub DAD_AutoScroll
  130 stub DAD_DragEnter
@@ -142,7 +142,7 @@
  134 stub DAD_DragMove
  135 stub DragQueryPoint   # exported by name
  136 stub DAD_SetDragImage
- 137 stub DAD_ShowDragImage
+ 137 stdcall DAD_ShowDragImage (long) DAD_ShowDragImage
  138 stub DuplicateIcon   # exported by name
  139 stub Desktop_UpdateBriefcaseOnEvent
  140 stub FileMenu_DeleteItemByIndex
@@ -166,7 +166,7 @@
  158 stdcall PathGetExtension(str long long) PathGetExtension
  159 stub PathIsDirectory
  160 stub SHNetConnectionDialog
- 161 stub SHRunConrolPanel
+ 161 stdcall SHRunConrolPanel (long long)SHRunConrolPanel
  162 stub SHSimpleIDListFromPath
  163 stub StrToOleStr
  164 stub Win32DeleteFile
@@ -247,12 +247,12 @@
  239 stdcall SHChangeNotify (long long ptr ptr) SHChangeNotify32  # exported by name
  240 stub SHEmptyRecycleBinA@12   # exported by name
  241 stub SHEmptyRecycleBinW@12   # exported by name
- 242 stdcall SHFileOperation(ptr) SHFileOperation32   # exported by name
- 243 stub SHFileOperationA@4   # exported by name
+ 242 stdcall SHFileOperation (ptr) SHFileOperation32   # exported by name
+ 243 stdcall SHFileOperationA (long) SHFileOperationA  # 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
+ 247 stdcall SHGetDataFromIDListA (long long long long long) SHGetDataFromIDListA  # exported by name
  248 stub SHGetDataFromIDListW@20   # exported by name
  249 stub PathParseIconLocation@4
  250 stub PathRemoveExtension@4
diff --git a/relay32/snoop.c b/relay32/snoop.c
index 9bc4e38..52c4ab8 100644
--- a/relay32/snoop.c
+++ b/relay32/snoop.c
@@ -283,6 +283,11 @@
 		FIXME(snoop,"entrypoint 0x%08lx not found\n",entry);
 		return; /* oops */
 	}
+	if (!SNOOP_ShowDebugmsgSnoop(dll->name, ordinal, fun->name)) {
+		/* we don't display, so we don't need returndisplay either */
+		EIP_reg(context)= (DWORD)fun->origfun;
+		return;
+	}
 	/* guess cdecl ... */
 	if (fun->nrofargs<0) {
 		/* Typical cdecl return frame is:
@@ -297,6 +302,7 @@
 		}
 	}
 
+
 	while (*rets) {
 		for (i=0;i<sizeof((*rets)->entry)/sizeof((*rets)->entry[0]);i++)
 			if (!(*rets)->entry[i].origreturn)
@@ -323,7 +329,6 @@
 
 	EIP_reg(context)= (DWORD)fun->origfun;
 
-	ret->show = SNOOP_ShowDebugmsgSnoop(dll->name, ordinal, fun->name);
 	if(!ret->show) return;
 	DPRINTF("Call %s.%ld: %s(",dll->name,ordinal,fun->name);
 	if (fun->nrofargs>0) {
diff --git a/relay32/user32.spec b/relay32/user32.spec
index ad34414..57a215d 100644
--- a/relay32/user32.spec
+++ b/relay32/user32.spec
@@ -204,7 +204,7 @@
 201 stdcall FindWindowW(wstr wstr) FindWindow32W
 202 stdcall FlashWindow(long long) FlashWindow32
 203 stdcall FrameRect(long ptr long) FrameRect32
-204 stub FreeDDElParam
+204 stdcall FreeDDElParam(long long) FreeDDElParam32
 205 stdcall GetActiveWindow() GetActiveWindow32
 206 stdcall GetAppCompatFlags(long) GetAppCompatFlags32
 207 stdcall GetAsyncKeyState(long) GetAsyncKeyState32
@@ -414,7 +414,7 @@
 411 stub OpenInputDesktop
 412 stub OpenWindowStationA
 413 stub OpenWindowStationW
-414 stub PackDDElParam
+414 stdcall PackDDElParam(long long long) PackDDElParam32
 415 stdcall PaintDesktop(long) PaintDesktop
 416 stdcall PeekMessageA(ptr long long long long) PeekMessage32A
 417 stdcall PeekMessageW(ptr long long long long) PeekMessage32W
@@ -562,7 +562,7 @@
 559 stdcall UnionRect(ptr ptr ptr) UnionRect32
 560 stub UnloadKeyboardLayout
 561 stub UnlockWindowStation
-562 stub UnpackDDElParam
+562 stdcall UnpackDDElParam(long long ptr ptr) UnpackDDElParam32
 563 stdcall UnregisterClassA(str long) UnregisterClass32A
 564 stdcall UnregisterClassW(wstr long) UnregisterClass32W
 565 stdcall UnregisterHotKey(long long) UnregisterHotKey
@@ -608,3 +608,7 @@
 604 stub ChangeDisplaySettingsA
 605 stub ChangeDisplaySettingsW
 606 stdcall SetWindowText(long str) SetWindowText32A
+607 stub GetMonitorInfoA
+608 stub MonitorFromWindow
+609 stub MonitorFromRect
+610 stub MonitorFromPoint
diff --git a/scheduler/handle.c b/scheduler/handle.c
index 4d5957d..0f5bdc0 100644
--- a/scheduler/handle.c
+++ b/scheduler/handle.c
@@ -12,6 +12,7 @@
 #include "heap.h"
 #include "process.h"
 #include "server.h"
+#include "thread.h"
 
 #define HTABLE_SIZE  0x30  /* Handle table initial size */
 #define HTABLE_INC   0x10  /* Handle table increment */
@@ -167,6 +168,18 @@
         else
             ptr = NULL;
     }
+    else if (handle == CURRENT_THREAD_PSEUDOHANDLE)
+    {
+       ptr = (K32OBJ *)THREAD_Current();
+       if (server_handle) *server_handle = CURRENT_THREAD_PSEUDOHANDLE;
+       K32OBJ_IncCount( ptr );
+    }
+    else if (handle == CURRENT_PROCESS_PSEUDOHANDLE)
+    {
+       ptr = (K32OBJ *)PROCESS_Current();
+       if (server_handle) *server_handle = CURRENT_PROCESS_PSEUDOHANDLE;
+       K32OBJ_IncCount( ptr );
+    }
     SYSTEM_UNLOCK();
     if (!ptr) SetLastError( ERROR_INVALID_HANDLE );
     return ptr;
diff --git a/scheduler/process.c b/scheduler/process.c
index 3c1f94a..adaf782 100644
--- a/scheduler/process.c
+++ b/scheduler/process.c
@@ -22,9 +22,6 @@
 #include "server.h"
 #include "debug.h"
 
-/* Process self-handle */
-#define PROCESS_SELF ((HANDLE32)0x7fffffff)
-
 static BOOL32 PROCESS_Signaled( K32OBJ *obj, DWORD thread_id );
 static BOOL32 PROCESS_Satisfied( K32OBJ *obj, DWORD thread_id );
 static void PROCESS_AddWait( K32OBJ *obj, DWORD thread_id );
@@ -59,16 +56,8 @@
  */
 PDB32 *PROCESS_GetPtr( HANDLE32 handle, DWORD access, int *server_handle )
 {
-    PDB32 *pdb = PROCESS_Current();
-
-    if (handle == PROCESS_SELF)
-    {
-        if (server_handle) *server_handle = PROCESS_SELF;
-        K32OBJ_IncCount( &pdb->header );
-        return pdb;
-    }
-    return (PDB32 *)HANDLE_GetObjPtr( pdb, handle, K32OBJ_PROCESS, access,
-                                      server_handle );
+    return (PDB32 *)HANDLE_GetObjPtr( PROCESS_Current(), handle,
+                                     K32OBJ_PROCESS, access, server_handle );
 }
 
 
@@ -451,7 +440,7 @@
  */
 HANDLE32 WINAPI GetCurrentProcess(void)
 {
-    return 0x7fffffff;
+    return CURRENT_PROCESS_PSEUDOHANDLE;
 }
 
 
@@ -735,7 +724,7 @@
  * A service process calls this function to ensure that it continues to run
  * even after a user logged off.
  */
-DWORD RegisterServiceProcess(DWORD dwProcessId, DWORD dwType)
+DWORD WINAPI RegisterServiceProcess(DWORD dwProcessId, DWORD dwType)
 {
 	/* I don't think that Wine needs to do anything in that function */
 	return 1; /* success */
diff --git a/scheduler/thread.c b/scheduler/thread.c
index 60365d5..b836b9c 100644
--- a/scheduler/thread.c
+++ b/scheduler/thread.c
@@ -42,9 +42,6 @@
     THREAD_Destroy      /* destroy */
 };
 
-/* The pseudohandle used for the current thread, see GetCurrentThread */
-#define CURRENT_THREAD_PSEUDOHANDLE 0xfffffffe
-
 /* Is threading code initialized? */
 BOOL32 THREAD_InitDone = FALSE;
 
@@ -56,17 +53,8 @@
  */
 THDB *THREAD_GetPtr( HANDLE32 handle, DWORD access, int *server_handle )
 {
-    THDB *thread;
-
-    if (handle == CURRENT_THREAD_PSEUDOHANDLE)  /* Self-thread handle */
-    {
-        thread = THREAD_Current();
-        if (server_handle) *server_handle = CURRENT_THREAD_PSEUDOHANDLE;
-        K32OBJ_IncCount( &thread->header );
-    }
-    else thread = (THDB *)HANDLE_GetObjPtr( PROCESS_Current(), handle,
-                                            K32OBJ_THREAD, access, server_handle );
-    return thread;
+    return (THDB *)HANDLE_GetObjPtr( PROCESS_Current(), handle,
+                                    K32OBJ_THREAD, access, server_handle );
 }
 
 
diff --git a/tools/build.c b/tools/build.c
index bd7f1e9..47d7ebd 100644
--- a/tools/build.c
+++ b/tools/build.c
@@ -1597,7 +1597,7 @@
 
     /* Save 16-bit fs and leave room for Win16Mutex recursion count */
 
-    fprintf( outfile, "\tpushw %%fs\n" );
+    fprintf( outfile, "\t.byte 0x66\n\tpushl %%fs\n" );
     fprintf( outfile, "\tpushw $0\n" );
 
     /* Setup bp to point to its copy on the stack */
diff --git a/tools/testrun b/tools/testrun
index 6508c01..7a52af2 100755
--- a/tools/testrun
+++ b/tools/testrun
@@ -29,7 +29,7 @@
 # How long before automatically killing all subprocesses
 # 30 is good for automatic testing, 300 or more for interactive testing.
 #
-$waittime = 30;
+$waittime = 50;
 #
 #diff command
 #
@@ -132,7 +132,7 @@
 	# kill all subprocesses called 'wine'. Do not kill find, diff, sh
 	# and friends, which are also subprocesses of us.
 	foreach (keys %kids) {
-		next unless ($cmdline{$_} =~ /wine/);
+		next unless ($cmdline{$_} =~ /(wine|dosmod)/);
 		# if we have already killed it using -TERM, use -KILL
 		if ($killedalready{$_}) {
 			kill(9,$_);	# FIXME: use correct number?
@@ -195,18 +195,7 @@
 
 	# Skip all mssetup, acmsetup , installshield whatever exes. 
 	# they seem to work, mostly and starting them is just annoying.
-	next if ($exe =~ /acmsetup/);
-	next if ($exe =~ /unwise/);
-	next if ($exe =~ /testexit/);
-	next if ($exe =~ /_msset/);
-	next if ($exe =~ /isun/i);
-	next if ($exe =~ /st4u/);
-	next if ($exe =~ /st5u/);
-	next if ($exe =~ /_mstest/);
-	next if ($exe =~ /_isdel/);
-	next if ($exe =~ /ms-setup/);
-	next if ($exe =~ /~mss/);
-	next if ($exe =~ /unin/);
+	next if ($exe =~ /acmsetup|unwise|testexit|_msset|isun|st4u|st5u|_mstest|_isdel|ms-setup|~ms|unin/io);
 
 	$runfile = $exe;
 	$runfile =~ s/[\/ ]/_/g;
diff --git a/tools/winapi-check b/tools/winapi-check
new file mode 100644
index 0000000..22e6405
--- /dev/null
+++ b/tools/winapi-check
@@ -0,0 +1,49 @@
+#!/bin/sh
+# This quick and dirty script prints the names of functions that don't have a
+# WINAPI in its header declaration or don't appear in any .c file at all.
+# I don't think it's very intelligent to use it when having < 64 MB ;)
+# FIXME: This script skips .spec function entries that occupy two or more
+# .spec lines !
+
+if [ ! -e ./ChangeLog ] ; then
+  echo You are not in Wine main directory !
+  exit
+fi
+echo crtdll.spec, ntdll.spec and wsock32.spec will be mentioned many times,
+echo as they use original UNIX functions that don\'t exist in Wine .c code.
+echo
+FIND_LIST="`find . -name "*.c"`"
+for i in if1632/*.spec relay32/*.spec
+do
+# skip wprocs.spec, as it contains many funcs that don't need a WINAPI
+  if [ $i = "if1632/wprocs.spec" ] ; then
+    continue
+  fi
+  LINE="`egrep "stdcall|cdecl|pascal|register" $i|grep -v "^#"|tr -d " "|tr "\n" " "`"
+  for j in $LINE
+  do
+    if [ -n "`echo "$j"|grep \)`" ] ; then
+      FUNC="`echo $j|cut -f2 -d\)|cut -f1 -d'#'`"
+      if [ -n "$FUNC" ] ; then
+        if [ -z "`grep -B 1 $FUNC $FIND_LIST|egrep "WINAPI|__cdecl|DC_GET_VAL|DC_SET_MODE|REGS_ENTRYPOINT"`" ] ; then
+	  case $FUNC in		# "black list"
+	   "GetBrushOrgEx16" ) ;;
+	   "GetCurrentPositionEx16" ) ;;
+	   "GetViewportExtEx16" ) ;;
+	   "GetViewportOrgEx16" ) ;;
+	   "GetWindowExtEx16" ) ;;
+	   "GetWindowOrgEx16" ) ;;
+
+	   "GetBrushOrgEx32" ) ;;
+           "GetCurrentPositionEx32" ) ;;
+           "GetViewportExtEx32" ) ;;
+           "GetViewportOrgEx32" ) ;;
+           "GetWindowExtEx32" ) ;;
+           "GetWindowOrgEx32" ) ;;
+	   * ) echo "$i: $FUNC" ;;
+	  esac
+	fi
+      fi
+    fi 
+  done
+done
diff --git a/tsx11/X11_calls b/tsx11/X11_calls
index 3f92e5b..3fe2370 100644
--- a/tsx11/X11_calls
+++ b/tsx11/X11_calls
@@ -93,6 +93,7 @@
 XNextEvent
 XOffsetRegion
 XOpenDisplay
+XOpenIM
 XParseGeometry
 XPending
 XPointInRegion
diff --git a/tsx11/ts_xlib.c b/tsx11/ts_xlib.c
index 40d727f..117c736 100644
--- a/tsx11/ts_xlib.c
+++ b/tsx11/ts_xlib.c
@@ -1249,6 +1249,17 @@
   return r;
 }
 
+XIM  TSXOpenIM(Display* a0, struct _XrmHashBucketRec* a1, char* a2, char* a3)
+{
+  XIM  r;
+  TRACE(x11, "Call XOpenIM\n");
+  EnterCriticalSection( &X11DRV_CritSection );
+  r = XOpenIM(a0, a1, a2, a3);
+  LeaveCriticalSection( &X11DRV_CritSection );
+  TRACE(x11, "Ret XOpenIM\n");
+  return r;
+}
+
 int (*TSXSynchronize(Display *a0, Bool a1))(Display *)
 {
   int (*r)(Display *);
diff --git a/win32/code_page.c b/win32/code_page.c
index ec18479..2cdf09e 100644
--- a/win32/code_page.c
+++ b/win32/code_page.c
@@ -166,7 +166,6 @@
  * ERRORS
  *   ERROR_INSUFFICIENT_BUFFER
  *   ERROR_INVALID_FLAGS (not yet implemented)
- *   ERROR_INVALID_PARAMETER (not yet implemented)
  *
  * BUGS
  *   Does not properly handle codepage conversions.
@@ -180,6 +179,12 @@
     int count = 0;
     int eos = 0;
     int dont_copy= (dstlen==0);
+
+    if ((!src) | ((!dst) && (!dont_copy)) )
+    {	SetLastError(ERROR_INVALID_PARAMETER);
+	return 0;
+    }
+    
     if (page!=GetACP() && page!=CP_OEMCP && page!=CP_ACP)
 	FIXME(win32,"Conversion in CP %d not supported\n",page);
 #if 0
diff --git a/win32/device.c b/win32/device.c
index 9ce240e..832c941 100644
--- a/win32/device.c
+++ b/win32/device.c
@@ -3,6 +3,7 @@
  *
  * Copyright 1998 Marcus Meissner
  * Copyright 1998 Ulrich Weigand
+ * Copyright 1998 Patrik Stridvall
  *
  */
 
@@ -26,6 +27,9 @@
 #include "debug.h"
 #include "winioctl.h"
 #include "stackframe.h"
+#include "winnt.h"
+#include "msdos.h"
+#include "miscemu.h"
 
 static void DEVICE_Destroy(K32OBJ *dev);
 const K32OBJ_OPS DEVICE_Ops =
@@ -59,6 +63,14 @@
 
 static BOOL32 VxDCall_VMM( DWORD *retv, DWORD service, CONTEXT *context );
 
+static BOOL32 VxDCall_IFSMgr( DWORD *retv, DWORD service, CONTEXT *context );
+
+static BOOL32 DeviceIo_IFSMgr(DEVICE_OBJECT *dev, DWORD dwIoControlCode, 
+			      LPVOID lpvInBuffer, DWORD cbInBuffer,
+			      LPVOID lpvOutBuffer, DWORD cbOutBuffer,
+			      LPDWORD lpcbBytesReturned,
+			      LPOVERLAPPED lpOverlapped);
+
 /*
  * VxD names are taken from the Win95 DDK
  */
@@ -137,7 +149,7 @@
     { "WINSOCK",  0x003E, NULL, NULL },
     { "WSOCK",    0x003E, NULL, NULL },
     { "WSIPX",    0x003F, NULL, NULL },
-    { "IFSMgr",   0x0040, NULL, NULL },
+    { "IFSMgr",   0x0040, VxDCall_IFSMgr, DeviceIo_IFSMgr },
     { "VCDFSD",   0x0041, NULL, NULL },
     { "MRCI2",    0x0042, NULL, NULL },
     { "PCI",      0x0043, NULL, NULL },
@@ -253,6 +265,143 @@
 };
 
 
+/*
+ * IFSMgr VxDCall service
+ */
+
+#define N_IFSMGR_SERVICE 118
+
+LPCSTR IFSMgr_Service_Name[N_IFSMGR_SERVICE] =
+{ 
+    "Get_Version",                 /* 0x0000 */
+    "RegisterMount",               /* 0x0001 */
+    "RegisterNet",                 /* 0x0002 */
+    "RegisterMailSlot",            /* 0x0003 */
+    "Attach",                      /* 0x0004 */
+    "Detach",                      /* 0x0005 */
+    "Get_NetTime",                 /* 0x0006 */
+    "Get_DOSTime",                 /* 0x0007 */
+    "SetupConnection",             /* 0x0008 */
+    "DerefConnection",             /* 0x0009 */
+    "ServerDOSCall",               /* 0x000A */
+    "CompleteAsync",               /* 0x000B */
+    "RegisterHeap",                /* 0x000C */
+    "GetHeap",                     /* 0x000D */
+    "RetHeap",                     /* 0x000E */
+    "CheckHeap",                   /* 0x000F */
+    "CheckHeapItem",               /* 0x0010 */
+    "FillHeapSpare",               /* 0x0011 */
+    "Block",                       /* 0x0012 */
+    "Wakeup",                      /* 0x0013 */
+    "Yield",                       /* 0x0014 */
+    "SchedEvent",                  /* 0x0015 */
+    "QueueEvent",                  /* 0x0016 */
+    "KillEvent",                   /* 0x0017 */
+    "FreeIOReq",                   /* 0x0018 */
+    "MakeMailSlot",                /* 0x0019 */
+    "DeleteMailSlot",              /* 0x001A */
+    "WriteMailSlot",               /* 0x001B */
+    "PopUp",                       /* 0x001C */
+    "printf",                      /* 0x001D */
+    "AssertFailed",                /* 0x001E */
+    "LogEntry",                    /* 0x001F */
+    "DebugMenu",                   /* 0x0020 */
+    "DebugVars",                   /* 0x0021 */
+    "GetDebugString",              /* 0x0022 */
+    "GetDebugHexNum",              /* 0x0023 */
+    "NetFunction",                 /* 0x0024 */
+    "DoDelAllUses",                /* 0x0025 */
+    "SetErrString",                /* 0x0026 */
+    "GetErrString",                /* 0x0027 */
+    "SetReqHook",                  /* 0x0028 */
+    "SetPathHook",                 /* 0x0029 */
+    "UseAdd",                      /* 0x002A */
+    "UseDel",                      /* 0x002B */
+    "InitUseAdd",                  /* 0x002C */
+    "ChangeDir",                   /* 0x002D */
+    "DelAllUses",                  /* 0x002E */
+    "CDROM_Attach",                /* 0x002F */
+    "CDROM_Detach",                /* 0x0030 */
+    "Win32DupHandle",              /* 0x0031 */
+    "Ring0_FileIO",                /* 0x0032 */
+    "Win32_Get_Ring0_Handle",      /* 0x0033 */
+    "Get_Drive_Info",              /* 0x0034 */
+    "Ring0GetDriveInfo",           /* 0x0035 */
+    "BlockNoEvents",               /* 0x0036 */
+    "NetToDosTime",                /* 0x0037 */
+    "DosToNetTime",                /* 0x0038 */
+    "DosToWin32Time",              /* 0x0039 */
+    "Win32ToDosTime",              /* 0x003A */
+    "NetToWin32Time",              /* 0x003B */
+    "Win32ToNetTime",              /* 0x003C */
+    "MetaMatch",                   /* 0x003D */
+    "TransMatch",                  /* 0x003E */
+    "CallProvider",                /* 0x003F */
+    "UniToBCS",                    /* 0x0040 */
+    "UniToBCSPath",                /* 0x0041 */
+    "BCSToUni",                    /* 0x0042 */
+    "UniToUpper",                  /* 0x0043 */
+    "UniCharToOEM",                /* 0x0044 */
+    "CreateBasis",                 /* 0x0045 */
+    "MatchBasisName",              /* 0x0046 */
+    "AppendBasisTail",             /* 0x0047 */
+    "FcbToShort",                  /* 0x0048 */
+    "ShortToFcb",                  /* 0x0049 */
+    "ParsePath",                   /* 0x004A */
+    "Query_PhysLock",              /* 0x004B */
+    "_VolFlush",                   /* 0x004C */
+    "NotifyVolumeArrival",         /* 0x004D */
+    "NotifyVolumeRemoval",         /* 0x004E */
+    "QueryVolumeRemoval",          /* 0x004F */
+    "FSDUnmountCFSD",              /* 0x0050 */
+    "GetConversionTablePtrs",      /* 0x0051 */
+    "CheckAccessConflict",         /* 0x0052 */
+    "LockFile",                    /* 0x0053 */
+    "UnlockFile",                  /* 0x0054 */
+    "RemoveLocks",                 /* 0x0055 */
+    "CheckLocks",                  /* 0x0056 */
+    "CountLocks",                  /* 0x0057 */
+    "ReassignLockFileInst",        /* 0x0058 */
+    "UnassignLockList",            /* 0x0059 */
+    "MountChildVolume",            /* 0x005A */
+    "UnmountChildVolume",          /* 0x005B */
+    "SwapDrives",                  /* 0x005C */
+    "FSDMapFHtoIOREQ",             /* 0x005D */
+    "FSDParsePath",                /* 0x005E */
+    "FSDAttachSFT",                /* 0x005F */
+    "GetTimeZoneBias",             /* 0x0060 */
+    "PNPEvent",                    /* 0x0061 */
+    "RegisterCFSD",                /* 0x0062 */
+    "Win32MapExtendedHandleToSFT", /* 0x0063 */
+    "DbgSetFileHandleLimit",       /* 0x0064 */
+    "Win32MapSFTToExtendedHandle", /* 0x0065 */
+    "FSDGetCurrentDrive",          /* 0x0066 */
+    "InstallFileSystemApiHook",    /* 0x0067 */
+    "RemoveFileSystemApiHook",     /* 0x0068 */
+    "RunScheduledEvents",          /* 0x0069 */
+    "CheckDelResource",            /* 0x006A */
+    "Win32GetVMCurdir",            /* 0x006B */
+    "SetupFailedConnection",       /* 0x006C */
+    "_GetMappedErr",               /* 0x006D */
+    "ShortToLossyFcb",             /* 0x006F */
+    "GetLockState",                /* 0x0070 */
+    "BcsToBcs",                    /* 0x0071 */
+    "SetLoopback",                 /* 0x0072 */
+    "ClearLoopback",               /* 0x0073 */
+    "ParseOneElement",             /* 0x0074 */
+    "BcsToBcsUpper"                /* 0x0075 */
+};
+
+
+/*
+ * IFSMgr DeviceIO service
+ */
+
+#define IFS_IOCTL_21				100
+#define IFS_IOCTL_2F				101
+#define	IFS_IOCTL_GET_RES			102
+#define IFS_IOCTL_GET_NETPRO_NAME_A	103
+
 
 HANDLE32 DEVICE_Open(LPCSTR filename, DWORD access) 
 {
@@ -273,7 +422,7 @@
 	    if (!lstrcmpi32A(VxDList[i].name, filename))
 	        break;
 	if (VxDList[i].name)
-	    dev->info = VxDList + i;
+	    dev->info = &VxDList[i];
 	else
 	    FIXME(win32, "Unknown VxD %s\n", filename);
 
@@ -331,17 +480,21 @@
 	}
 
 	/* Check if this is a user defined control code for a VxD */
-        if( HIWORD( dwIoControlCode ) == 0 )
-        {
-	    if ( dev->info && dev->info->deviceio )
-	        return dev->info->deviceio( dev, dwIoControlCode, 
-                                            lpvInBuffer, cbInBuffer, 
-                                            lpvOutBuffer, cbOutBuffer, 
-                                            lpcbBytesReturned, lpOverlapped );
-
-	    /* FIXME: Set appropriate error */
-	    FIXME( win32, "Unimplemented control %ld for VxD device %s\n", 
-	                  dwIoControlCode, dev->devname );
+	if( HIWORD( dwIoControlCode ) == 0 )
+	{
+		if ( dev->info && dev->info->deviceio )
+		{
+			return dev->info->deviceio( dev, dwIoControlCode, 
+                                        lpvInBuffer, cbInBuffer, 
+                                        lpvOutBuffer, cbOutBuffer, 
+                                        lpcbBytesReturned, lpOverlapped );
+		}
+		else
+		{
+			/* FIXME: Set appropriate error */
+			FIXME( win32, "Unimplemented control %ld for VxD device %s\n", 
+				          dwIoControlCode, dev->devname );
+		}
 	}
 	else
 	{
@@ -685,3 +838,144 @@
     return ok;
 }
 
+
+/***********************************************************************
+ *           VxDCall_IFSMgr
+ */
+BOOL32 VxDCall_IFSMgr( DWORD *retv, DWORD service, CONTEXT *context )
+{
+    if (LOWORD(service) < N_IFSMGR_SERVICE)
+        FIXME(win32, "Unimplemented service %s (%08lx)\n",
+                      IFSMgr_Service_Name[LOWORD(service)], service);
+    else
+        FIXME(win32, "Unknown service %08lx\n", service);
+
+	return FALSE;
+}
+
+
+
+/***********************************************************************
+ *           DeviceIo_IFSMgr
+ * NOTES
+ *   The ioctls is used by 'MSNET32.DLL'.
+ *
+ *   I have been unable to uncover any documentation about the ioctls so 
+ *   the implementation of the cases IFS_IOCTL_21 and IFS_IOCTL_2F are
+ *   based on a resonable guesses on information found in the Windows 95 DDK.
+ *   
+ */
+
+struct win32apireq {
+	unsigned long 	ar_proid;
+	unsigned long  	ar_eax;		
+	unsigned long  	ar_ebx;	
+	unsigned long  	ar_ecx;	
+	unsigned long  	ar_edx;	
+	unsigned long  	ar_esi;	
+	unsigned long  	ar_edi;
+	unsigned long  	ar_ebp;		
+	unsigned short 	ar_error;
+	unsigned short  ar_pad;
+};
+
+static void win32apieq_2_CONTEXT(struct win32apireq *pIn,CONTEXT *pCxt)
+{
+	memset(pCxt,0,sizeof(CONTEXT));
+
+	pCxt->ContextFlags=CONTEXT_INTEGER|CONTEXT_CONTROL;
+	pCxt->Eax = pIn->ar_eax;
+	pCxt->Ebx = pIn->ar_ebx;
+	pCxt->Ecx = pIn->ar_ecx;
+	pCxt->Edx = pIn->ar_edx;
+	pCxt->Esi = pIn->ar_esi;
+	pCxt->Edi = pIn->ar_edi;
+
+	/* FIXME: Only partial CONTEXT_CONTROL */
+	pCxt->Ebp = pIn->ar_ebp;
+
+	/* FIXME: pIn->ar_proid ignored */
+	/* FIXME: pIn->ar_error ignored */
+	/* FIXME: pIn->ar_pad ignored */
+}
+
+static void CONTEXT_2_win32apieq(CONTEXT *pCxt,struct win32apireq *pOut)
+{
+	memset(pOut,0,sizeof(struct win32apireq));
+
+	pOut->ar_eax = pCxt->Eax;
+	pOut->ar_ebx = pCxt->Ebx;
+	pOut->ar_ecx = pCxt->Ecx;
+	pOut->ar_edx = pCxt->Edx;
+	pOut->ar_esi = pCxt->Esi;
+	pOut->ar_edi = pCxt->Edi;
+
+	/* FIXME: Only partial CONTEXT_CONTROL */
+	pOut->ar_ebp = pCxt->Ebp;
+
+	/* FIXME: pOut->ar_proid ignored */
+	/* FIXME: pOut->ar_error ignored */
+	/* FIXME: pOut->ar_pad ignored */
+}
+
+static BOOL32 DeviceIo_IFSMgr(DEVICE_OBJECT *dev, DWORD dwIoControlCode, 
+			      LPVOID lpvInBuffer, DWORD cbInBuffer,
+			      LPVOID lpvOutBuffer, DWORD cbOutBuffer,
+			      LPDWORD lpcbBytesReturned,
+			      LPOVERLAPPED lpOverlapped)
+{
+    BOOL32 retv = TRUE;
+	TRACE(win32,"(%p,%ld,%p,%ld,%p,%ld,%p,%p): stub\n",
+			dev,dwIoControlCode,
+			lpvInBuffer,cbInBuffer,
+			lpvOutBuffer,cbOutBuffer,
+			lpcbBytesReturned,
+			lpOverlapped);
+
+    switch (dwIoControlCode)
+    {
+	case IFS_IOCTL_21:
+	case IFS_IOCTL_2F:{
+		CONTEXT cxt;
+		struct win32apireq *pIn=(struct win32apireq *) lpvInBuffer;
+		struct win32apireq *pOut=(struct win32apireq *) lpvOutBuffer;
+
+		TRACE(win32,
+			"Control '%s': "
+			"proid=0x%08lx, eax=0x%08lx, ebx=0x%08lx, ecx=0x%08lx, "
+			"edx=0x%08lx, esi=0x%08lx, edi=0x%08lx, ebp=0x%08lx, "
+			"error=0x%04x, pad=0x%04x\n",
+			(dwIoControlCode==IFS_IOCTL_21)?"IFS_IOCTL_21":"IFS_IOCTL_2F",
+			pIn->ar_proid, pIn->ar_eax, pIn->ar_ebx, pIn->ar_ecx,
+			pIn->ar_edx, pIn->ar_esi, pIn->ar_edi, pIn->ar_ebp,
+			pIn->ar_error, pIn->ar_pad
+		);				
+		
+		win32apieq_2_CONTEXT(pIn,&cxt);
+
+		if(dwIoControlCode==IFS_IOCTL_21)
+		{
+			DOS3Call(&cxt); /* Call int 21h */
+		} else {
+			INT_Int2fHandler(&cxt); /* Call int 2Fh */
+		}
+		
+		CONTEXT_2_win32apieq(&cxt,pOut);
+			
+        retv = TRUE;
+	} break;
+	case IFS_IOCTL_GET_RES:{
+        FIXME(win32, "Control 'IFS_IOCTL_GET_RES' not implemented\n");
+        retv = FALSE;
+	} break;
+	case IFS_IOCTL_GET_NETPRO_NAME_A:{
+        FIXME(win32, "Control 'IFS_IOCTL_GET_NETPRO_NAME_A' not implemented\n");
+        retv = FALSE;
+	} break;	 
+    default:
+        FIXME(win32, "Control %ld not implemented\n", dwIoControlCode);
+        retv = FALSE;
+    }
+
+    return retv;
+}
diff --git a/win32/except.c b/win32/except.c
index 63674db..014cb7f 100644
--- a/win32/except.c
+++ b/win32/except.c
@@ -161,11 +161,13 @@
     
     while((pframe!=NULL)&&(pframe!=((void *)0xFFFFFFFF)))
     {
+       PEXCEPTION_FRAME    prevframe; 
        TRACE(win32,"calling exception handler at 0x%x\n",
                                                 (int) pframe->Handler);
        dispatch=0;  
        TRACE(relay,"(except=%p,record=%p,frame=%p,context=%p,dispatch=%p)\n",
                      pframe->Handler, &record, pframe, context, &dispatch );
+       prevframe = pframe->Prev;
        retval=pframe->Handler(&record,pframe,context,&dispatch);
  
        TRACE(win32,"exception handler returns 0x%x, dispatch=0x%x\n",
@@ -173,7 +175,7 @@
                               
        if(retval==ExceptionContinueExecution)
           break;
-       pframe=pframe->Prev;
+       pframe=prevframe;
    }
 
    if (retval!=ExceptionContinueExecution)
diff --git a/win32/file.c b/win32/file.c
index a595d86..243c06d 100644
--- a/win32/file.c
+++ b/win32/file.c
@@ -129,6 +129,7 @@
                              DWORD attributes, HANDLE32 template)
 {
     int access_flags, create_flags;
+    HFILE32 to_dup = HFILE_ERROR32; /* handle to dup */
 
     /* Translate the various flags to Unix-style.
      */
@@ -165,12 +166,22 @@
         return HFILE_ERROR32;
     }
 
-    /* If the name is either CONIN$ or CONOUT$, give them stdin
+    /* If the name is either CONIN$ or CONOUT$, give them duplicated stdin
      * or stdout, respectively.
      */
-    if(!strcmp(filename, "CONIN$")) return GetStdHandle( STD_INPUT_HANDLE );
-    if(!strcmp(filename, "CONOUT$")) return GetStdHandle( STD_OUTPUT_HANDLE );
+    if(!strcmp(filename, "CONIN$"))
+	to_dup = GetStdHandle( STD_INPUT_HANDLE );
+    else if(!strcmp(filename, "CONOUT$"))
+	to_dup = GetStdHandle( STD_OUTPUT_HANDLE );
 
+    if(to_dup != HFILE_ERROR32)
+    {
+	HFILE32 handle;
+	if (!DuplicateHandle( GetCurrentProcess(), to_dup, GetCurrentProcess(),
+			      &handle, access, FALSE, 0 ))
+	    handle = HFILE_ERROR32;
+	return handle;
+    }
     return FILE_Open( filename, access_flags | create_flags );
 }
 
diff --git a/windows/class.c b/windows/class.c
index aef5cd3..bde35d1 100644
--- a/windows/class.c
+++ b/windows/class.c
@@ -1102,8 +1102,8 @@
     TRACE(class,"%x %p %p\n",hInstance, name, wc);
     
     if (!(atom = GlobalFindAtom32A( name )) ||
-        !(classPtr = CLASS_FindClassByAtom( atom, hInstance )) ||
-        (hInstance != classPtr->hInstance)) return FALSE;
+        !(classPtr = CLASS_FindClassByAtom( atom, hInstance )) 
+	/*|| (hInstance != classPtr->hInstance) */ ) return FALSE;
     wc->style         = classPtr->style;
     wc->lpfnWndProc   = (WNDPROC32)WINPROC_GetProc( classPtr->winproc,
                                                     WIN_PROC_32A );
diff --git a/windows/dce.c b/windows/dce.c
index 1e9b316..25145c8 100644
--- a/windows/dce.c
+++ b/windows/dce.c
@@ -144,7 +144,7 @@
 		}
 		else if( pDCE->DCXflags & DCX_DCEBUSY ) /* shared cache DCE */
 		{
-		    ERR(cd,"[%04x] GetDC() without ReleaseDC()!\n", 
+		    ERR(dc,"[%04x] GetDC() without ReleaseDC()!\n", 
 			pWnd->hwndSelf);
 		    DCE_ReleaseDC( pDCE );
 		}
diff --git a/windows/defwnd.c b/windows/defwnd.c
index 1a57fa4..46117e7 100644
--- a/windows/defwnd.c
+++ b/windows/defwnd.c
@@ -164,9 +164,15 @@
     case WM_CONTEXTMENU:
 	if( wndPtr->dwStyle & WS_CHILD )
 	    SendMessage32A( wndPtr->parent->hwndSelf, msg, wParam, lParam );
-
-     /* else 
-      *     FIXME: Track system popup if click was in the caption area. */
+	else
+	  if (wndPtr->hSysMenu)
+	  { /*
+	    TrackPopupMenu32(wndPtr->hSysMenu,TPM_LEFTALIGN | TPM_RETURNCMD,LOWORD(lParam),HIWORD(lParam),0,wndPtr->hwndSelf,NULL);
+	    DestroyMenu32(wndPtr->hSysMenu);
+	    */
+	    FIXME(win,"Display default popup menu\n");
+	  /* Track system popup if click was in the caption area. */
+	  }
 	break;
 
     case WM_NCACTIVATE:
diff --git a/windows/dialog.c b/windows/dialog.c
index 2226a2e..691813e 100644
--- a/windows/dialog.c
+++ b/windows/dialog.c
@@ -1583,7 +1583,7 @@
     {
         /* No ctrl specified -> start from the beginning */
         if (!(pWndCtrl = pWndDlg->child)) return 0;
-        if (fPrevious) while (pWndCtrl->next) pWndCtrl = pWndCtrl->next;
+        if (!fPrevious) while (pWndCtrl->next) pWndCtrl = pWndCtrl->next;
     }
 
     pWndLast = pWndCtrl;
diff --git a/windows/graphics.c b/windows/graphics.c
index fcdf859..2a1e9e2 100644
--- a/windows/graphics.c
+++ b/windows/graphics.c
@@ -84,8 +84,8 @@
     TSXSetFunction( display, dc->u.x.gc, GXcopy );
     if (bmp->bitmap.bmBitsPixel == 1)
     {
-        TSXSetForeground( display, dc->u.x.gc, dc->w.backgroundPixel );
-        TSXSetBackground( display, dc->u.x.gc, dc->w.textPixel );
+        TSXSetForeground( display, dc->u.x.gc, dc->u.x.backgroundPixel );
+        TSXSetBackground( display, dc->u.x.gc, dc->u.x.textPixel );
         TSXCopyPlane( display, bmp->pixmap, dc->u.x.drawable, dc->u.x.gc,
                     xsrc, ysrc, width, height, xdest, ydest, 1 );
     }
@@ -97,13 +97,13 @@
 
 	    if( COLOR_GetMonoPlane(&plane) )
 	    {
-		TSXSetForeground( display, dc->u.x.gc, dc->w.backgroundPixel );
-		TSXSetBackground( display, dc->u.x.gc, dc->w.textPixel );
+		TSXSetForeground(display, dc->u.x.gc, dc->u.x.backgroundPixel);
+		TSXSetBackground(display, dc->u.x.gc, dc->u.x.textPixel);
 	    }
 	    else
 	    {
-		TSXSetForeground( display, dc->u.x.gc, dc->w.textPixel );
-		TSXSetBackground( display, dc->u.x.gc, dc->w.backgroundPixel );
+		TSXSetForeground(display, dc->u.x.gc, dc->u.x.textPixel);
+		TSXSetBackground(display, dc->u.x.gc, dc->u.x.backgroundPixel);
 	    }
 	    TSXCopyPlane( display, bmp->pixmap, dc->u.x.drawable, dc->u.x.gc,
 			xsrc, ysrc, width, height, xdest, ydest, plane );
diff --git a/windows/keyboard.c b/windows/keyboard.c
index 667f2d5..5422700 100644
--- a/windows/keyboard.c
+++ b/windows/keyboard.c
@@ -773,6 +773,8 @@
 {
     LPACCEL32	lpAccelTbl = (LPACCEL32)LockResource32(hAccel);
     int 	i;
+
+    TRACE(accel,"hwnd=0x%x hacc=0x%x msg=0x%x wp=0x%x lp=0x%lx\n", hWnd, hAccel, msg->message, msg->wParam, msg->lParam);
     
     if (hAccel == 0 || msg == NULL ||
 	(msg->message != WM_KEYDOWN &&
diff --git a/windows/mdi.c b/windows/mdi.c
index dadc4c8..f38c164 100644
--- a/windows/mdi.c
+++ b/windows/mdi.c
@@ -259,7 +259,7 @@
     TRACE(mdi, "%04x %04x %04x\n",
                 hwnd, hmenuFrame, hmenuWindow);
 
-    FIXME(mdi,"partially function stub");
+    FIXME(mdi,"partial function stub\n");
 
     return oldFrameMenu;
 }
@@ -1600,7 +1600,6 @@
 {
     RECT32 childRect, clientRect;
     INT32  vmin, vmax, hmin, hmax, vpos, hpos;
-    BOOL32 noscroll = FALSE;
     WND *pWnd, *Wnd;
 
     if (!(Wnd = pWnd = WIN_FindWndPtr( hwnd ))) return;
@@ -1608,11 +1607,14 @@
     SetRectEmpty32( &childRect );
 
     for ( pWnd = pWnd->child; pWnd; pWnd = pWnd->next )
-	{
-          UnionRect32( &childRect, &pWnd->rectWindow, &childRect );
+    {
 	  if( pWnd->dwStyle & WS_MAXIMIZE )
-	      noscroll = TRUE;
-	} 
+	  {
+	      ShowScrollBar32(hwnd, SB_BOTH, FALSE);
+	      return;
+	  }
+	  UnionRect32( &childRect, &pWnd->rectWindow, &childRect );
+    } 
     UnionRect32( &childRect, &clientRect, &childRect );
 
     /* jump through the hoops to prevent excessive flashing 
@@ -1623,11 +1625,8 @@
     vmin = childRect.top; vmax = childRect.bottom - clientRect.bottom;
     vpos = clientRect.top - childRect.top;
 
-    if( noscroll )
-	ShowScrollBar32(hwnd, SB_BOTH, FALSE);
-    else
     switch( scroll )
-      {
+    {
 	case SB_HORZ:
 			vpos = hpos; vmin = hmin; vmax = hmax;
 	case SB_VERT:
@@ -1639,7 +1638,7 @@
 						  hmin, hmax, hpos);
 			SetWindowPos32(hwnd, 0, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE
                                        | SWP_NOACTIVATE | SWP_NOZORDER | SWP_FRAMECHANGED );
-      }    
+    }    
 }
 
 
diff --git a/windows/message.c b/windows/message.c
index 972e6ef..ea6c848 100644
--- a/windows/message.c
+++ b/windows/message.c
@@ -1585,7 +1585,7 @@
         TRACE(key, "(%s, %04X, %08lX)\n",
 		     SPY_GetMsgName(message), wParam, lParam );
 
-    if ((message != WM_KEYDOWN) && (message != WM_SYSKEYDOWN)) return FALSE;
+    if ((message != WM_KEYDOWN) && (message != WM_SYSKEYDOWN))	return FALSE;
 
     TRACE(key, "Translating key %04X, scancode %04X\n",
                  wParam, HIWORD(lParam) );
@@ -1912,7 +1912,7 @@
 	HWND32 hWnd,UINT32 Msg,WPARAM32 wParam,LPARAM lParam,
 	/*SENDASYNCPROC*/FARPROC32 lpResultCallBack,DWORD dwData
 ) {
-	FIXME(msg,"(0x%04x,0x%04x,0x%08lx,0x%08lx,%p,0x%08lx),stub!\n",
+	FIXME(msg,"(0x%04x,0x%04x,0x%08x,0x%08lx,%p,0x%08lx),stub!\n",
 		hWnd,Msg,wParam,lParam,lpResultCallBack,dwData
 	);
 	return FALSE;
diff --git a/windows/user.c b/windows/user.c
index 97cc773..46bfd5b 100644
--- a/windows/user.c
+++ b/windows/user.c
@@ -351,7 +351,7 @@
  *
  *	Used by Turbo Debugger for Windows
  */
-FARPROC16 SetEventHook(FARPROC16 lpfnEventHook)
+FARPROC16 WINAPI SetEventHook(FARPROC16 lpfnEventHook)
 {
 	FIXME(hook, "(lpfnEventHook=%08x): stub\n", (UINT32)lpfnEventHook);
 	return NULL;
diff --git a/windows/win.c b/windows/win.c
index 456f215..575457b 100644
--- a/windows/win.c
+++ b/windows/win.c
@@ -1560,7 +1560,9 @@
 {
     LONG *ptr, retval;
     WND * wndPtr = WIN_FindWndPtr( hwnd );
-
+    STYLESTRUCT style;
+    
+    TRACE(win,"%x=%p %x %lx %x\n",hwnd, wndPtr, offset, newval, type);
     if (!wndPtr) return 0;
     if (offset >= 0)
     {
@@ -1581,27 +1583,41 @@
     }
     else switch(offset)
     {
-        case GWL_ID:
-	    ptr = (DWORD*)&wndPtr->wIDmenu;
-	    break;
-        case GWL_HINSTANCE:
-            return SetWindowWord32( hwnd, offset, newval );
+	case GWL_ID:
+		ptr = (DWORD*)&wndPtr->wIDmenu;
+		break;
+	case GWL_HINSTANCE:
+		return SetWindowWord32( hwnd, offset, newval );
 	case GWL_WNDPROC:
-            retval = (LONG)WINPROC_GetProc( wndPtr->winproc, type );
-            WINPROC_SetProc( &wndPtr->winproc, (WNDPROC16)newval, 
+					retval = (LONG)WINPROC_GetProc( wndPtr->winproc, type );
+		WINPROC_SetProc( &wndPtr->winproc, (WNDPROC16)newval, 
 						type, WIN_PROC_WINDOW );
-            return retval;
+		return retval;
 	case GWL_STYLE:
+		if (wndPtr->flags & WIN_ISWIN32)
+		{	style.styleOld = wndPtr->dwStyle;
+			newval &= ~(WS_VISIBLE | WS_CHILD);	/* Some bits can't be changed this way */
+			style.styleNew = newval | (style.styleOld & (WS_VISIBLE | WS_CHILD));
 
-	    /* FIXME: WM_STYLE... messages for WIN_ISWIN32 windows */
-
-            ptr = &wndPtr->dwStyle;
-            /* Some bits can't be changed this way */
-            newval &= ~(WS_VISIBLE | WS_CHILD);
-            newval |= (*ptr & (WS_VISIBLE | WS_CHILD));
-            break;
-        case GWL_USERDATA: ptr = &wndPtr->userdata; break;
-        case GWL_EXSTYLE:  ptr = &wndPtr->dwExStyle; break;
+			SendMessage32A(hwnd,WM_STYLECHANGING,GWL_STYLE,(LPARAM)&style);
+			wndPtr->dwStyle = style.styleNew;
+			SendMessage32A(hwnd,WM_STYLECHANGED,GWL_STYLE,(LPARAM)&style);
+			UpdateWindow32(hwnd);
+			return style.styleOld;
+		}
+        case GWL_USERDATA: 
+		ptr = &wndPtr->userdata; 
+		break;
+        case GWL_EXSTYLE:  
+		if (wndPtr->flags & WIN_ISWIN32)
+		{	style.styleOld = wndPtr->dwExStyle;
+			style.styleNew = newval;
+			SendMessage32A(hwnd,WM_STYLECHANGING,GWL_EXSTYLE,(LPARAM)&style);
+			wndPtr->dwExStyle = newval;
+			SendMessage32A(hwnd,WM_STYLECHANGED,GWL_EXSTYLE,(LPARAM)&style);
+			UpdateWindow32(hwnd);
+			return style.styleOld;
+		}
 	default:
             WARN( win, "Invalid offset %d\n", offset );
             return 0;
@@ -1939,9 +1955,7 @@
 	    /* FIXME: Create an X counterpart for reparented top-level windows
 	     * when not in the desktop mode. */
      
-	    if ( pWndParent == pWndDesktop ) 
-		 wndPtr->dwStyle &= ~WS_CHILD;
-	    else wndPtr->dwStyle |= WS_CHILD;
+	    if ( pWndParent != pWndDesktop ) wndPtr->dwStyle |= WS_CHILD;
 	    WIN_LinkWindow(hwndChild, HWND_BOTTOM);
 
 	    if( bFixupDCE )
diff --git a/windows/winpos.c b/windows/winpos.c
index 74af90a..d1bbd21 100644
--- a/windows/winpos.c
+++ b/windows/winpos.c
@@ -260,7 +260,7 @@
 /***********************************************************************
  *           SetWindowRgn32 
  */
-BOOL32 WINAPI SetWindowRgn32 ( HWND32 hwnd, HRGN32 hrgn,BOOL32 bRedraw)
+INT32 WINAPI SetWindowRgn32( HWND32 hwnd, HRGN32 hrgn,BOOL32 bRedraw)
 
 {
 
@@ -268,6 +268,17 @@
   return TRUE;
 }
 
+/***********************************************************************
+ *           SetWindowRgn16 
+ */
+INT16 WINAPI SetWindowRgn16( HWND16 hwnd, HRGN16 hrgn,BOOL16 bRedraw)
+
+{
+
+  FIXME (win, "SetWindowRgn16: stub\n"); 
+  return TRUE;
+}
+
 
 /***********************************************************************
  *           GetClientRect16   (USER.33)
@@ -349,8 +360,15 @@
     INT16 hittest = HTERROR;
     POINT16 xy = pt;
 
-    *ppWnd = NULL;
+   *ppWnd = NULL;
     wndPtr = wndScope->child;
+    if( wndScope->flags & WIN_MANAGED )
+    {
+	/* this prevents mouse clicks from going "through" scrollbars in managed mode */
+	if( pt.x < wndScope->rectClient.left || pt.x >= wndScope->rectClient.right ||
+	    pt.y < wndScope->rectClient.top || pt.y >= wndScope->rectClient.bottom )
+	    goto hittest;
+    }
     MapWindowPoints16( GetDesktopWindow16(), wndScope->hwndSelf, &xy, 1 );
 
     for (;;)
@@ -388,6 +406,7 @@
             else wndPtr = wndPtr->next;
         }
 
+hittest:
         /* If nothing found, try the scope window */
         if (!*ppWnd) *ppWnd = wndScope;
 
@@ -1801,7 +1820,7 @@
  *           WINPOS_ReorderOwnedPopups
  *
  * fix Z order taking into account owned popups -
- * basically we need to maintain them above owner window
+ * basically we need to maintain them above the window that owns them
  */
 HWND32 WINPOS_ReorderOwnedPopups(HWND32 hwndInsertAfter,WND* wndPtr,WORD flags)
 {
@@ -2303,37 +2322,47 @@
 	       newClientRect.left - newWindowRect.left) ||
 	      (oldClientRect.top - oldWindowRect.top !=
 	       newClientRect.top - newWindowRect.top) ||
-              winpos.flags & SWP_NOCOPYBITS )
+              (winpos.flags & SWP_NOCOPYBITS) )
+	  {
+	      /* if the client area moved as a result of WM_NCCALCSIZE returning 
+	       * obscure WVR_ALIGNxxx flags then we simply redraw the whole thing
+	       *
+	       * TODO: use WINPOS_SizeMoveClean() if there is no SWP_NOCOPYBITS 
+	       */
 
 	      PAINT_RedrawWindow( wndPtr->hwndSelf, NULL, 0, RDW_INVALIDATE |
                               RDW_ALLCHILDREN | RDW_FRAME | RDW_ERASE, 0 );
+	  }
 	  else
 	      if( winpos.flags & SWP_FRAMECHANGED )
 	      {
 		WORD wErase = 0;
 		RECT32 rect;
 
-	        if( oldClientRect.right > newClientRect.right ) 
+	        if( newClientRect.right > oldClientRect.right ) /* redraw exposed client area on the right */
                 {
-		    rect.left = newClientRect.right; rect.top = newClientRect.top;
-		    rect.right = oldClientRect.right; rect.bottom = newClientRect.bottom;
+		    rect.top = 0; rect.bottom = newClientRect.bottom - newClientRect.top;
+		    rect.left = oldClientRect.right - newClientRect.left;
+		    rect.right = newClientRect.right - newClientRect.left;
 		    wErase = 1;
 		    PAINT_RedrawWindow( wndPtr->hwndSelf, &rect, 0,
-                                      RDW_INVALIDATE | RDW_FRAME | RDW_ALLCHILDREN, 0 );
+                                      RDW_INVALIDATE | RDW_FRAME | RDW_ERASE | RDW_ERASENOW | RDW_ALLCHILDREN, 0 );
                 }
-		if( oldClientRect.bottom > newClientRect.bottom )
+		if( newClientRect.bottom > oldClientRect.bottom ) /* redraw exposed client area on the bottom */
                 {
-		    rect.left = newClientRect.left; rect.top = newClientRect.bottom;
-		    rect.right = (wErase)?oldClientRect.right:newClientRect.right;
-		    rect.bottom = oldClientRect.bottom;
+		    rect.left = 0; rect.right = ((wErase)?oldClientRect.right:newClientRect.right) - newClientRect.left;
+		    rect.top = oldClientRect.bottom - newClientRect.top;
+		    rect.bottom = newClientRect.bottom - newClientRect.top;
 		    wErase = 1;
 		    PAINT_RedrawWindow( wndPtr->hwndSelf, &rect, 0,
-                                      RDW_INVALIDATE | RDW_FRAME | RDW_ALLCHILDREN, 0 );
+                                      RDW_INVALIDATE | RDW_FRAME | RDW_ERASE | RDW_ERASENOW | RDW_ALLCHILDREN, 0 );
                 }
-		if( !wErase ) wndPtr->flags |= WIN_NEEDS_NCPAINT;
+		if( !wErase ) /* just update the nonclient area */
+		    wndPtr->flags |= WIN_NEEDS_NCPAINT; 
 	      }
+	uFlags |= SMC_NOPARENTERASE; /* X windows do not have eraseable parents */
     }
-    else
+    else /* not an X window */
     {
 	RECT32 oldClientRect = wndPtr->rectClient;
 
@@ -2347,7 +2376,7 @@
 	    newClientRect.right - newClientRect.left ) result &= ~WVR_HREDRAW;
 
         if( !(flags & (SWP_NOREDRAW | SWP_HIDEWINDOW | SWP_SHOWWINDOW)) )
-	  {
+	{
 	    uFlags |=  ((winpos.flags & SWP_NOCOPYBITS) || 
 			(result >= WVR_HREDRAW && result < WVR_VALIDRECTS)) ? SMC_NOCOPY : 0;
 	    uFlags |=  (winpos.flags & SWP_FRAMECHANGED) ? SMC_DRAWFRAME : 0;
@@ -2356,13 +2385,13 @@
 		uFlags = WINPOS_SizeMoveClean(wndPtr, visRgn, &oldWindowRect, 
 							      &oldClientRect, uFlags);
 	    else
-	      { 
-		/* adjust frame and do not erase parent */
+	    { 
+		/* adjust the frame and do not erase the parent */
 
 		if( winpos.flags & SWP_FRAMECHANGED ) wndPtr->flags |= WIN_NEEDS_NCPAINT;
 		if( winpos.flags & SWP_NOZORDER ) uFlags |= SMC_NOPARENTERASE;
-	      }
-	  }
+	    }
+	}
         DeleteObject32(visRgn);
     }
 
diff --git a/windows/winproc.c b/windows/winproc.c
index bb6ff92..c813860 100644
--- a/windows/winproc.c
+++ b/windows/winproc.c
@@ -402,6 +402,7 @@
         }
         return 1;
     case WM_SETTEXT:
+    case LB_ADDSTRING32:
         *plparam = (LPARAM)HEAP_strdupAtoW( SystemHeap, 0, (LPCSTR)*plparam );
         return (*plparam ? 1 : -1);
     case WM_NCCREATE:
@@ -464,6 +465,7 @@
             HeapFree( SystemHeap, 0, ptr );
         }
         break;
+    case LB_ADDSTRING32:
     case WM_SETTEXT:
         HeapFree( SystemHeap, 0, (void *)lParam );
         break;
@@ -512,6 +514,7 @@
         }
         return 1;
     case WM_SETTEXT:
+    case LB_ADDSTRING32:
         *plparam = (LPARAM)HEAP_strdupWtoA( SystemHeap, 0, (LPCWSTR)*plparam );
         return (*plparam ? 1 : -1);
     case WM_NCCREATE:
@@ -574,6 +577,7 @@
             HeapFree( SystemHeap, 0, ptr );
         }
         break;
+    case LB_ADDSTRING32:
     case WM_SETTEXT:
         HeapFree( SystemHeap, 0, (void *)lParam );
         break;
