diff --git a/ANNOUNCE b/ANNOUNCE
index b2c5356..820759c 100644
--- a/ANNOUNCE
+++ b/ANNOUNCE
@@ -1,12 +1,13 @@
-This is release 960528 of Wine the MS Windows emulator.  This is still a
+This is release 960606 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.
+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-960528: (see ChangeLog for details)
-	- First attempt at inter-task SendMessage(); still broken.
+WHAT'S NEW with Wine-960606: (see ChangeLog for details)
+	- More Win32 code.
+	- Window repainting fixes.
 	- Lots of bug fixes.
 
 See the README file in the distribution for installation instructions.
@@ -15,10 +16,10 @@
 the release is available at the ftp sites.  The sources will be available
 from the following locations:
 
-    sunsite.unc.edu:/pub/Linux/ALPHA/wine/development/Wine-960528.tar.gz
-    tsx-11.mit.edu:/pub/linux/ALPHA/Wine/development/Wine-960528.tar.gz
-    ftp.infomagic.com:/pub/mirrors/linux/wine/development/Wine-960528.tar.gz
-    aris.com:/pub/linux/ALPHA/Wine/development/Wine-960528.tar.gz
+    sunsite.unc.edu:/pub/Linux/ALPHA/wine/development/Wine-960606.tar.gz
+    tsx-11.mit.edu:/pub/linux/ALPHA/Wine/development/Wine-960606.tar.gz
+    ftp.infomagic.com:/pub/mirrors/linux/wine/development/Wine-960606.tar.gz
+    aris.com:/pub/linux/ALPHA/Wine/development/Wine-960606.tar.gz
 
 It should also be available from any site that mirrors tsx-11 or sunsite.
 
diff --git a/ChangeLog b/ChangeLog
index 488637b..34238c6 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,4 +1,96 @@
 ----------------------------------------------------------------------
+Wed Jun  5 20:13:54 1996  Alexandre Julliard  <julliard@lrc.epfl.ch>
+
+	* [controls/button.c] [controls/listbox.c]
+	Fixed wParam of WM_DRAWITEM message.
+
+	* [if1632/Makefile.in] [loader/builtin.c]
+	Remove WPROCS32 DLL, as the relay code can call Wine routines
+	directly.
+
+	* [loader/module.c] [loader/ne_image.c]
+	Fixed initial stack layout for self-loading modules.
+
+	* [tools/build.c]
+	Fixed data segment building for Win16 modules.
+
+	* [windows/defdlg.c]
+	Implemented Win32 versions of DefDlgProc().
+
+	* [windows/dialog.c]
+	Merged Win16 and Win32 dialog code.
+	Added support for control extra data in dialog item template.
+
+	* [windows/win.c]
+	Unified Win16 and Win32 versions of CreateWindow().
+	Implemented Win32 version of GetWindowLong().
+
+	* [windows/winproc.c]
+	Changed the implementation of window procedures, so that 16-bit
+	winprocs are valid segmented pointers.
+
+Sun Jun  2 16:39:46 1996  Marcus Meissner <msmeissn@cip.informatik.uni-erlangen.de>
+
+	* [misc/registry.c]
+	Fixed another bug in the w95 loader. Quietened some debug output.
+
+Sun Jun  2 10:00:22 1996  Ulrich Schmid  <uschmid@mail.hh.provi.de>
+
+	* [windows/winproc.c]
+	Bug fix: WM_PARENTNOTIFY: don't fall through to WM_SETTEXT.
+
+Sat Jun  1 12:37:22 1996  Tristan Tarrant <tst@sthinc.demon.co.uk>
+
+	* [resources/TODO] [resources/sysres_It.rc]
+	Updated font dialog box.
+
+Thu May 30 21:05:19 1996  Albrecht Kleine  <kleine@ak.sax.de>
+
+	* [include/commdlg.h] [misc/commdlg.c]
+	ChooseFont() and ChooseColor(): 
+	Bugfixes and added more support for some CF_* and CC_* flags: 
+	dialog templates and font size control.
+	Bugfix in structure definition of CHOOSECOLOR definition.
+
+	* [ipc/dde_proc.c] [windows/event.c]
+	Replaced SendMessage with SendMessage16 and added inclusion of
+ 	dde_proc.h for error-free compilation of ipc module.
+
+Thu May 30 19:00:00 1996  Alex Korobka <alex@phm30.pharm.sunysb.edu>
+
+	* [windows/scroll.c]
+	Made ScrollDC to save/restore current clipping region.
+
+	* [misc/clipboard.c] [windows/event.c]
+	Implemented most of the previously missing features (not tested), 
+	improved text pasting from/to X. 
+
+	* [if1632/user.spec] [if1632/gdi.spec] [objects/dc.c]
+	  [objects/gdiobj.c] [objects/clipping.c] [windows/dce.c]
+	  [windows/winpos.c] [windows/painting.c]
+	Updated DCE code, implemented dynamic invalidation of owned DCs.
+	This fixes a lot of problems with scrolling in WinWord. Not
+	sure about the effect on -desktop.
+
+Wed May 29 23:35:44 1996  Jukka Iivonen <iivonen@cc.helsinki.fi>
+
+	* [win32/time.c] [if1632/kernel32.spec]
+	Added SetSystemTime and SetTimeZoneInformation.
+
+	* [if1632/kernel32.spec]
+	Added lstrcat, lstrcatA, lstrcmp, lstrcmpA, lstrcpy, lstrlen.
+
+	* [include/windows.h]
+	Added SYSTEM_POWER_STATUS structure and prototypes for
+	GetSystemPowerStatus, SetSystemPowerState, SetSystemTime.
+
+	* [include/kernel32.h]
+	Added a prototype for SetTimeZoneInformation.
+
+	* [win32/environment.c] [if1632/kernel32.spec]
+	Added GetSystemPowerStatus and SetSystemPowerState stubs.
+
+----------------------------------------------------------------------
 Tue May 28 19:36:36 1996  Alexandre Julliard  <julliard@lrc.epfl.ch>
 
 	* [controls/combo.c]
diff --git a/controls/button.c b/controls/button.c
index 7e24f64..a7870ed 100644
--- a/controls/button.c
+++ b/controls/button.c
@@ -519,5 +519,6 @@
     dis.hDC        = hDC;
     dis.itemData   = 0;
     GetClientRect32( wndPtr->hwndSelf, &dis.rcItem );
-    SendMessage32A( GetParent(wndPtr->hwndSelf), WM_DRAWITEM, 1, (LPARAM)&dis);
+    SendMessage32A( GetParent(wndPtr->hwndSelf), WM_DRAWITEM,
+                    wndPtr->wIDmenu, (LPARAM)&dis );
 }
diff --git a/controls/combo.c b/controls/combo.c
index 409f720..44540dd 100644
--- a/controls/combo.c
+++ b/controls/combo.c
@@ -60,12 +60,12 @@
 
 LPHEADCOMBO ComboGetStorageHeader(HWND hwnd)
 {
-  return (LPHEADCOMBO)GetWindowLong(hwnd,4);
+  return (LPHEADCOMBO)GetWindowLong32A(hwnd,4);
 }
 
 LPHEADLIST ComboGetListHeader(HWND hwnd)
 {
-  return (LPHEADLIST)GetWindowLong(hwnd,0);
+  return (LPHEADLIST)GetWindowLong32A(hwnd,0);
 }
 
 int CreateComboStruct(HWND hwnd, LONG style)
@@ -118,7 +118,7 @@
   LPHEADLIST   lphl;
   LPHEADCOMBO  lphc;
   LONG         style = 0;
-  LONG         cstyle = GetWindowLong(hwnd,GWL_STYLE);
+  LONG         cstyle = GetWindowLong32A(hwnd,GWL_STYLE);
   RECT16       rect,lboxrect;
   WND*         wndPtr = WIN_FindWndPtr(hwnd);
   char className[] = "COMBOLBOX";  /* Hack so that class names are > 0x10000 */
@@ -172,21 +172,21 @@
   }
 
   if ((cstyle & 3) != CBS_DROPDOWNLIST)
-      lphc->hWndEdit = CreateWindow16(MAKE_SEGPTR(editName), (SEGPTR)0,
+      lphc->hWndEdit = CreateWindow16( editName, NULL,
 				  WS_CHILD | WS_CLIPCHILDREN | WS_VISIBLE | ES_LEFT,
 				  0, 0, rect.right-6-CBitWidth,
 				  lphl->StdItemHeight+2*SYSMETRICS_CYBORDER,
-				  hwnd, (HMENU)ID_EDIT, WIN_GetWindowInstance(hwnd), 0L);
+				  hwnd, (HMENU)ID_EDIT, WIN_GetWindowInstance(hwnd), NULL );
 				  
   lboxrect.top+=lphc->LBoxTop;
-  lphc->hWndLBox = CreateWindow16(MAKE_SEGPTR(className), (SEGPTR)0, style |
+  lphc->hWndLBox = CreateWindow16( className, NULL, style |
  				((cstyle & WS_HSCROLL)? WS_HSCROLL : 0) |
  				((cstyle & WS_VSCROLL)? WS_VSCROLL : 0),
 				lboxrect.left, lboxrect.top,
 				lboxrect.right - lboxrect.left, 
 				lboxrect.bottom - lboxrect.top,
 				hwndp,(HMENU)ID_CLB, WIN_GetWindowInstance(hwnd),
-				(SEGPTR)hwnd );
+				(LPVOID)(HWND32)hwnd );
 
    wndPtr->dwStyle &= ~(WS_VSCROLL | WS_HSCROLL);
 
@@ -628,7 +628,7 @@
 {
   LPHEADCOMBO  lphc = ComboGetStorageHeader(hwnd);
   LPHEADLIST   lphl = ComboGetListHeader(hwnd);
-  LONG         cstyle = GetWindowLong(hwnd,GWL_STYLE);
+  LONG         cstyle = GetWindowLong32A(hwnd,GWL_STYLE);
   RECT16       cRect,wRect;
 
   if (lphc->hWndLBox == 0) return FALSE;
@@ -781,11 +781,7 @@
 
 HWND CLBoxGetCombo(HWND hwnd)
 {
-#ifdef WINELIB32
-  return (HWND)GetWindowLong(hwnd,0);
-#else
-  return (HWND)GetWindowWord(hwnd,0);
-#endif
+  return (HWND)GetWindowLong32A(hwnd,0);
 }
 
 LPHEADLIST CLBoxGetListHeader(HWND hwnd)
@@ -799,11 +795,7 @@
 static LRESULT CBLCreate( HWND hwnd, WPARAM wParam, LPARAM lParam )
 {
   CREATESTRUCT16 *createStruct = (CREATESTRUCT16 *)PTR_SEG_TO_LIN(lParam);
-#ifdef WINELIB32
-  SetWindowLong(hwnd,0,(LONG)createStruct->lpCreateParams);
-#else
-  SetWindowWord(hwnd,0,LOWORD(createStruct->lpCreateParams));
-#endif
+  SetWindowLong32A(hwnd,0,(LONG)createStruct->lpCreateParams);
   return 0;
 }
 
diff --git a/controls/listbox.c b/controls/listbox.c
index 25d4bfb..27a173a 100644
--- a/controls/listbox.c
+++ b/controls/listbox.c
@@ -95,9 +95,9 @@
   lphl->hSelf          = hwnd;  
   if (CtlType==ODT_COMBOBOX)              /* use the "faked" style for COMBOLBOX */
                                           /* LBS_SORT instead CBS_SORT e.g.      */
-    lphl->dwStyle   = MAKELONG(LOWORD(styles),HIWORD(GetWindowLong(hwnd,GWL_STYLE)));
+    lphl->dwStyle   = MAKELONG(LOWORD(styles),HIWORD(GetWindowLong32A(hwnd,GWL_STYLE)));
   else
-    lphl->dwStyle   = GetWindowLong(hwnd,GWL_STYLE); /* use original style dword */
+    lphl->dwStyle   = GetWindowLong32A(hwnd,GWL_STYLE); /* use original style dword */
   lphl->hParent        = parent;
   lphl->StdItemHeight  = 15; /* FIXME: should get the font height */
   lphl->OwnerDrawn     = styles & (LBS_OWNERDRAWFIXED | LBS_OWNERDRAWVARIABLE);
@@ -146,7 +146,7 @@
 
 static LPHEADLIST ListBoxGetStorageHeader(HWND hwnd)
 {
-    return (LPHEADLIST)GetWindowLong(hwnd,0);
+    return (LPHEADLIST)GetWindowLong32A(hwnd,0);
 }
 
 /* Send notification "code" as part of a WM_COMMAND-message if hwnd
@@ -245,7 +245,7 @@
         dis.itemAction = itemAction;
         dis.itemState  = itemState;
         CONV_RECT16TO32( rect, &dis.rcItem );
-        SendMessage32A( lphl->hParent, WM_DRAWITEM, 0, (LPARAM)&dis );
+        SendMessage32A( lphl->hParent, WM_DRAWITEM, dis.CtlID, (LPARAM)&dis );
         return;
     }
     if (itemAction == ODA_DRAWENTIRE || itemAction == ODA_SELECT) {
@@ -315,7 +315,7 @@
  
   *lpmeasure = lpls->mis;
   lpmeasure->itemHeight = lphl->StdItemHeight;
-  SendMessage16(lphl->hParent, WM_MEASUREITEM, 0, (LPARAM)USER_HEAP_SEG_ADDR(hTemp));
+  SendMessage16(lphl->hParent, WM_MEASUREITEM, lphl->CtlID, (LPARAM)USER_HEAP_SEG_ADDR(hTemp));
 
   if (lphl->dwStyle & LBS_OWNERDRAWFIXED) {
     if (lpmeasure->itemHeight > lphl->StdItemHeight)
@@ -765,7 +765,7 @@
 static LONG LBCreate(HWND hwnd, WORD wParam, LONG lParam)
 {
   LPHEADLIST   lphl;
-  LONG	       dwStyle = GetWindowLong(hwnd,GWL_STYLE);
+  LONG	       dwStyle = GetWindowLong32A(hwnd,GWL_STYLE);
   RECT16 rect;
 
   CreateListBoxStruct(hwnd, ODT_LISTBOX, dwStyle, GetParent(hwnd));
@@ -978,7 +978,7 @@
    }
 
 #ifndef WINELIB
-  if (GetWindowLong(lphl->hSelf,GWL_EXSTYLE) & WS_EX_DRAGDETECT)
+  if (GetWindowLong32A(lphl->hSelf,GWL_EXSTYLE) & WS_EX_DRAGDETECT)
      if( DragDetect(lphl->hSelf,MAKEPOINT16(lParam)) )
          SendMessage16(lphl->hParent, WM_BEGINDRAG,0,0L);
 #endif
diff --git a/controls/menu.c b/controls/menu.c
index 3372b74..093627c 100644
--- a/controls/menu.c
+++ b/controls/menu.c
@@ -774,11 +774,12 @@
 
     if (!pTopPWnd)
     {
-	pTopPWnd = WIN_FindWndPtr(CreateWindow16( POPUPMENU_CLASS_ATOM, (SEGPTR)0,
-				   		WS_POPUP | WS_BORDER, x, y, 
-				   		menu->Width + 2*SYSMETRICS_CXBORDER,
-				   		menu->Height + 2*SYSMETRICS_CYBORDER,
-				   		0, 0, wndPtr->hInstance, (SEGPTR)hmenu ));
+	pTopPWnd = WIN_FindWndPtr(CreateWindow16( POPUPMENU_CLASS_ATOM, NULL,
+                                          WS_POPUP | WS_BORDER, x, y,
+                                          menu->Width + 2*SYSMETRICS_CXBORDER,
+                                          menu->Height + 2*SYSMETRICS_CYBORDER,
+                                          0, 0, wndPtr->hInstance,
+                                          (LPVOID)(HMENU32)hmenu ));
 	if (!pTopPWnd) return FALSE;
 	skip_init = TRUE;
     }
@@ -786,11 +787,12 @@
     if( uSubPWndLevel )
     {
 	/* create new window for the submenu */
-	HWND  hWnd = CreateWindow16( POPUPMENU_CLASS_ATOM, (SEGPTR)0,
+	HWND  hWnd = CreateWindow16( POPUPMENU_CLASS_ATOM, NULL,
                                    WS_POPUP | WS_BORDER, x, y,
                                    menu->Width + 2*SYSMETRICS_CXBORDER,
                                    menu->Height + 2*SYSMETRICS_CYBORDER,
-                                   menu->hWnd, 0, wndPtr->hInstance, (SEGPTR)hmenu );
+                                   menu->hWnd, 0, wndPtr->hInstance,
+                                   (LPVOID)(HMENU32)hmenu );
 	if( !hWnd ) return FALSE;
 	menu->hWnd = hWnd;
     }
@@ -1832,13 +1834,7 @@
     case WM_CREATE:
 	{
 	    CREATESTRUCT16 *cs = (CREATESTRUCT16*)PTR_SEG_TO_LIN(lParam);
-#ifdef WINELIB32
-	    HMENU hmenu = (HMENU) (cs->lpCreateParams);
-	    SetWindowLong( hwnd, 0, hmenu );
-#else
-	    HMENU hmenu = (HMENU) ((int)cs->lpCreateParams & 0xffff);
-	    SetWindowWord( hwnd, 0, hmenu );
-#endif
+	    SetWindowLong32A( hwnd, 0, (LONG)cs->lpCreateParams );
 	    return 0;
 	}
 
@@ -1850,12 +1846,7 @@
 	    PAINTSTRUCT16 ps;
 	    BeginPaint16( hwnd, &ps );
 	    MENU_DrawPopupMenu( hwnd, ps.hdc,
-#ifdef WINELIB32
-			        (HMENU)GetWindowLong( hwnd, 0 )
-#else
-			        (HMENU)GetWindowWord( hwnd, 0 )
-#endif
- 			       );
+                                (HMENU)GetWindowLong32A( hwnd, 0 ) );
 	    EndPaint16( hwnd, &ps );
 	    return 0;
 	}
@@ -1872,12 +1863,7 @@
 	    break;
 
     case WM_USER:
-	if( wParam )
-#ifdef WINELIB32
-            SetWindowLong( hwnd, 0, (HMENU)wParam );
-#else
-            SetWindowWord( hwnd, 0, (HMENU)wParam );
-#endif
+	if (wParam) SetWindowLong32A( hwnd, 0, (HMENU)wParam );
         break;
     default:
 	return DefWindowProc16(hwnd, message, wParam, lParam);
diff --git a/if1632/Makefile.in b/if1632/Makefile.in
index ea85539..5cb814c 100644
--- a/if1632/Makefile.in
+++ b/if1632/Makefile.in
@@ -42,7 +42,6 @@
 	winsock.spec \
 	winspool.spec \
 	wprocs.spec \
-	wprocs32.spec \
 	wsock32.spec
 
 SPEC_FILES = $(DLLS:.spec=.S)
diff --git a/if1632/gdi.spec b/if1632/gdi.spec
index 3d9119a..ef8e645 100644
--- a/if1632/gdi.spec
+++ b/if1632/gdi.spec
@@ -156,9 +156,9 @@
 180 pascal16 SetDCState(word word) SetDCState
 181 pascal16 RectInRegionOld(word ptr) RectInRegion16
 188 stub GetTextExtentEx
-190 stub SetDCHook
-191 stub GetDCHook
-192 stub SetHookFlags
+190 pascal16 SetDCHook(word segptr long) SetDCHook
+191 pascal   GetDCHook(word ptr) GetDCHook
+192 pascal16 SetHookFlags(word word) SetHookFlags
 193 stub SetBoundsRect
 194 stub GetBoundsRect
 195 stub SelectBitmap
diff --git a/if1632/kernel32.spec b/if1632/kernel32.spec
index 5ff0b8c..82ced33 100644
--- a/if1632/kernel32.spec
+++ b/if1632/kernel32.spec
@@ -510,7 +510,7 @@
 0504 stub SetProcessShutdownParameters
 0505 stub SetProcessWorkingSetSize
 0506 stub SetStdHandle
-0507 stub SetSystemTime
+0507    stdcall SetSystemTime(ptr) SetSystemTime
 0508 stub SetSystemTimeAdjustment
 0509 stub SetTapeParameters
 0510 stub SetTapePosition
@@ -518,7 +518,7 @@
 0512 stub SetThreadContext
 0513 stub SetThreadLocale
 0514 stub SetThreadPriority
-0515 stub SetTimeZoneInformation
+0515    stdcall SetTimeZoneInformation(ptr) SetTimeZoneInformation
 0516    stdcall SetUnhandledExceptionFilter(ptr) SetUnhandledExceptionFilter
 0517 stub SetVDMCurrentDirectories
 0518 stub SetVolumeLabelA
@@ -601,22 +601,22 @@
 0595 stub _lopen
 0596 stub _lread
 0597 stub _lwrite
-0598 stub lstrcat
-0599 stub lstrcatA
+0598    stdcall lstrcat(ptr ptr) strcat
+0599    stdcall lstrcatA(ptr ptr) strcat
 0600 stub lstrcatW
-0601 stub lstrcmp
-0602 stub lstrcmpA
+0601    stdcall lstrcmp(ptr ptr) strcmp
+0602    stdcall lstrcmpA(ptr ptr) strcmp
 0603 stub lstrcmpW
 0604 stub lstrcmpi
 0605 stub lstrcmpiA
 0606 stub lstrcmpiW
-0607 stub lstrcpy
+0607    stdcall lstrcpy(ptr ptr) strcpy
 0608 	stdcall lstrcpyA(ptr ptr) strcpy
 0609 stub lstrcpyW
 0610 stub lstrcpyn
 0611 stub lstrcpynA
 0612 stub lstrcpynW
-0613 stub lstrlen
+0613    stdcall lstrlen(ptr) strlen
 0614 	stdcall lstrlenA(ptr) strlen
 0615 stub lstrlenW
 #late additions
@@ -625,7 +625,7 @@
 0618 stub GetPrivateProfileStructA
 0619 stub GetPrivateProfileStructW
 0620 stub GetProcessVersion
-0621 stub GetSystemPowerStatus
+0621    stdcall GetSystemPowerStatus(ptr) GetSystemPowerStatus
 0622 stub GetSystemTimeAsFileTime
 0623 stub HeapCreateTagsW
 0624 stub HeapExtend
@@ -634,7 +634,7 @@
 0627 stub HeapUsage
 0628 stub IsDebuggerPresent
 0629 stub PostQueuedCompletionStatus
-0630 stub SetSystemPowerState
+0630    stdcall SetSystemPowerState(byte byte) SetSystemPowerState
 0631 stub WritePrivateProfileStructA
 0632 stub WritePrivateProfileStructW
 0633 stub MakeCriticalSectionGlobal
diff --git a/if1632/user.spec b/if1632/user.spec
index 2444720..0a3c3bf 100644
--- a/if1632/user.spec
+++ b/if1632/user.spec
@@ -40,7 +40,7 @@
 38  pascal16 GetWindowTextLength(word) GetWindowTextLength
 39  pascal16 BeginPaint(word ptr) BeginPaint16
 40  pascal16 EndPaint(word ptr) EndPaint16
-41  pascal16 CreateWindow(segptr segptr long s_word s_word s_word s_word
+41  pascal16 CreateWindow(ptr ptr long s_word s_word s_word s_word
 	                  word word word segptr) CreateWindow16
 42  pascal16 ShowWindow(word word) ShowWindow
 43  pascal16 CloseWindow(word) CloseWindow
@@ -86,9 +86,9 @@
 83  pascal16 FrameRect(word ptr word) FrameRect16
 84  pascal16 DrawIcon(word s_word s_word word) DrawIcon
 85  pascal16 DrawText(word ptr s_word ptr word) DrawText16
-87  pascal16 DialogBox(word segptr word segptr) DialogBox
+87  pascal16 DialogBox(word segptr word segptr) DialogBox16
 88  pascal16 EndDialog(word s_word) EndDialog
-89  pascal16 CreateDialog(word segptr word segptr) CreateDialog
+89  pascal16 CreateDialog(word segptr word segptr) CreateDialog16
 90  pascal16 IsDialogMessage(word ptr) IsDialogMessage
 91  pascal16 GetDlgItem(word word) GetDlgItem
 92  pascal16 SetDlgItemText(word word segptr) SetDlgItemText16
@@ -134,7 +134,7 @@
 132 pascal   SetClassLong(word s_word long) SetClassLong16
 133 pascal16 GetWindowWord(word s_word) GetWindowWord
 134 pascal16 SetWindowWord(word s_word word) SetWindowWord
-135 pascal   GetWindowLong(word s_word) GetWindowLong
+135 pascal   GetWindowLong(word s_word) GetWindowLong16
 136 pascal   SetWindowLong(word s_word long) SetWindowLong16
 137 pascal16 OpenClipboard(word) OpenClipboard
 138 pascal16 CloseClipboard() CloseClipboard
@@ -218,8 +218,8 @@
 215 pascal16 FlushComm(word word) FlushComm
 #216 USERSEEUSERDO
 217 pascal16 LookupMenuHandle(word s_word) LookupMenuHandle
-218 pascal16 DialogBoxIndirect(word word word segptr) DialogBoxIndirect
-219 pascal16 CreateDialogIndirect(word segptr word segptr) CreateDialogIndirect
+218 pascal16 DialogBoxIndirect(word word word segptr) DialogBoxIndirect16
+219 pascal16 CreateDialogIndirect(word ptr word segptr) CreateDialogIndirect16
 220 pascal16 LoadMenuIndirect(ptr) LoadMenuIndirect16
 221 pascal16 ScrollDC(word s_word s_word ptr ptr word ptr) ScrollDC
 222 pascal16 GetKeyboardState(ptr) GetKeyboardState
@@ -239,12 +239,12 @@
 236 pascal16 GetCapture() GetCapture
 237 pascal16 GetUpdateRgn(word word word) GetUpdateRgn
 238 pascal16 ExcludeUpdateRgn(word word) ExcludeUpdateRgn
-239 pascal16 DialogBoxParam(word segptr word segptr long) DialogBoxParam
+239 pascal16 DialogBoxParam(word segptr word segptr long) DialogBoxParam16
 240 pascal16 DialogBoxIndirectParam(word word word segptr long)
-             DialogBoxIndirectParam
-241 pascal16 CreateDialogParam(word segptr word segptr long) CreateDialogParam
-242 pascal16 CreateDialogIndirectParam(word segptr word segptr long)
-             CreateDialogIndirectParam
+             DialogBoxIndirectParam16
+241 pascal16 CreateDialogParam(word segptr word segptr long) CreateDialogParam16
+242 pascal16 CreateDialogIndirectParam(word ptr word segptr long)
+             CreateDialogIndirectParam16
 243 pascal   GetDialogBaseUnits() GetDialogBaseUnits
 244 pascal16 EqualRect(ptr ptr) EqualRect16
 245 stub EnableCommNotification
@@ -302,7 +302,7 @@
 300 stub UnloadInstalledDrivers
 #301 BOZOSLIVEHERE :-))	<- this is actually EditWndProc
 #306 BEAR306
-308 pascal   DefDlgProc(word word word long) DefDlgProc
+308 pascal   DefDlgProc(word word word long) DefDlgProc16
 309 pascal16 GetClipCursor(ptr) GetClipCursor16
 314 stub SignalProc
 319 pascal16 ScrollWindowEx(word s_word s_word ptr ptr word ptr word)
@@ -327,7 +327,7 @@
 357 stub LoadDIBIconHandler
 358 pascal16 IsMenu(word) IsMenu
 359 pascal16 GetDCEx(word word long) GetDCEx
-362 stub DCHook
+362 pascal16 DCHook(word word long long) DCHook
 364 stub LookupIconIDFromDirectoryEx
 368 pascal16 CopyIcon(word word) CopyIcon
 369 pascal16 CopyCursor(word word) CopyCursor
@@ -397,7 +397,7 @@
 449 stub DrawState
 450 stub CreateIconFromResourceEx
 451 pascal16 TranslateMDISysAccel(word ptr) TranslateMDISysAccel
-452 pascal16 CreateWindowEx(long segptr segptr long s_word s_word s_word s_word
+452 pascal16 CreateWindowEx(long ptr ptr long s_word s_word s_word s_word
                             word word word segptr) CreateWindowEx16
 454 pascal16 AdjustWindowRectEx(ptr long word long) AdjustWindowRectEx16
 455 pascal16 GetIconID(word long) GetIconID
diff --git a/if1632/user32.spec b/if1632/user32.spec
index ecbbf4e..f764aca 100644
--- a/if1632/user32.spec
+++ b/if1632/user32.spec
@@ -71,15 +71,11 @@
 0066 stub CreateCursor
 0067 stub CreateDesktopA
 0068 stub CreateDesktopW
-0069 stdcall CreateDialogIndirectParamA(long ptr long ptr long)	
-	USER32_CreateDialogIndirectParamA
+0069 stdcall CreateDialogIndirectParamA(long ptr long ptr long) CreateDialogIndirectParam32A
 0070 stub CreateDialogIndirectParamAorW
-0071 stdcall CreateDialogIndirectParamW(long ptr long ptr long)	
-	USER32_CreateDialogIndirectParamW
-0072 stdcall CreateDialogParamA(long ptr long ptr long)	
-	USER32_CreateDialogParamA
-0073 stdcall CreateDialogParamW(long ptr long ptr long)	
-	USER32_CreateDialogParamW
+0071 stdcall CreateDialogIndirectParamW(long ptr long ptr long) CreateDialogIndirectParam32W
+0072 stdcall CreateDialogParamA(long ptr long ptr long) CreateDialogParam32A
+0073 stdcall CreateDialogParamW(long ptr long ptr long) CreateDialogParam32W
 0074 stub CreateIcon
 0075 stub CreateIconFromResource
 0076 stub CreateIconFromResourceEx
@@ -127,8 +123,8 @@
 0116 stub DdeSetUserHandle
 0117 stub DdeUnaccessData
 0118 stub DdeUninitialize
-0119 stub DefDlgProcA
-0120 stub DefDlgProcW
+0119 stdcall DefDlgProcA(long long long long) DefDlgProc32A
+0120 stdcall DefDlgProcW(long long long long) DefDlgProc32W
 0121 stdcall DefFrameProcA(long long long long long) DefFrameProc32A
 0122 stdcall DefFrameProcW(long long long long long) DefFrameProc32W
 0123 stdcall DefMDIChildProcA(long long long long) DefMDIChildProc32A
@@ -143,13 +139,11 @@
 0132 stub DestroyIcon
 0133 stub DestroyMenu
 0134 stub DestroyWindow
-0135 stdcall DialogBoxIndirectParamA(long ptr long ptr long)	
-			USER32_DialogBoxIndirectParamA
+0135 stdcall DialogBoxIndirectParamA(long ptr long ptr long) DialogBoxIndirectParam32A
 0136 stub DialogBoxIndirectParamAorW
-0137 stdcall DialogBoxIndirectParamW(long ptr long ptr long)	
-			USER32_DialogBoxIndirectParamW
-0138 stdcall DialogBoxParamA(long ptr long ptr long)	USER32_DialogBoxParamA
-0139 stdcall DialogBoxParamW(long ptr long ptr long)	USER32_DialogBoxParamW
+0137 stdcall DialogBoxIndirectParamW(long ptr long ptr long) DialogBoxIndirectParam32W
+0138 stdcall DialogBoxParamA(long ptr long ptr long) DialogBoxParam32A
+0139 stdcall DialogBoxParamW(long ptr long ptr long) DialogBoxParam32W
 0140 stdcall DispatchMessageA(ptr) USER32_DispatchMessageA
 0141 stub DispatchMessageW
 0142 stub DlgDirListA
@@ -314,8 +308,8 @@
 0301 stdcall GetWindow(long long) GetWindow
 0302 stub GetWindowContextHelpId
 0303 stdcall GetWindowDC(long) GetWindowDC
-0304 stub GetWindowLongA
-0305 stub GetWindowLongW
+0304 stdcall GetWindowLongA(long long) GetWindowLong32A
+0305 stdcall GetWindowLongW(long long) GetWindowLong32W
 0306 stdcall GetWindowPlacement(long ptr) GetWindowPlacement32
 0307 stdcall GetWindowRect(long ptr) GetWindowRect32
 0308 stdcall GetWindowTextA(long ptr long) GetWindowText32A
diff --git a/if1632/wprocs.spec b/if1632/wprocs.spec
index 00e6332..531b647 100644
--- a/if1632/wprocs.spec
+++ b/if1632/wprocs.spec
@@ -7,7 +7,7 @@
 5  pascal ComboBoxWndProc(word word word long) ComboBoxWndProc
 6  pascal EditWndProc(word word word long) EditWndProc
 7  pascal PopupMenuWndProc(word word word long) PopupMenuWndProc
-9  pascal DefDlgProc(word word word long) DefDlgProc
+9  pascal DefDlgProc(word word word long) DefDlgProc16
 10 pascal MDIClientWndProc(word word word long) MDIClientWndProc
 13 pascal SystemMessageBoxProc(word word word long) SystemMessageBoxProc
 14 pascal FileOpenDlgProc(word word word long) FileOpenDlgProc
diff --git a/if1632/wprocs32.spec b/if1632/wprocs32.spec
deleted file mode 100644
index e49d04f..0000000
--- a/if1632/wprocs32.spec
+++ /dev/null
@@ -1,23 +0,0 @@
-name	wprocs32
-type	win32
-
-2  stdcall StaticWndProc(long long long long) StaticWndProc32
-3  stdcall ScrollBarWndProc(long long long long) ScrollBarWndProc32
-4  stdcall ListBoxWndProc(long long long long) ListBoxWndProc32
-5  stdcall ComboBoxWndProc(long long long long) ComboBoxWndProc32
-6  stdcall EditWndProc(long long long long) EditWndProc32
-7  stdcall PopupMenuWndProc(long long long long) PopupMenuWndProc32
-9  stdcall DefDlgProc(long long long long) DefDlgProc32
-10 stdcall MDIClientWndProc(long long long long) MDIClientWndProc32
-11 stdcall DefWindowProc(long long long long) DefWindowProc32A
-13 stdcall SystemMessageBoxProc(long long long long) SystemMessageBoxProc32
-14 stdcall FileOpenDlgProc(long long long long) FileOpenDlgProc32
-15 stdcall FileSaveDlgProc(long long long long) FileSaveDlgProc32
-16 stdcall ColorDlgProc(long long long long) ColorDlgProc32
-17 stdcall FindTextDlgProc(long long long long) FindTextDlgProc32
-18 stdcall ReplaceTextDlgProc(long long long long) ReplaceTextDlgProc32
-19 stdcall PrintSetupDlgProc(long long long long) PrintSetupDlgProc32
-20 stdcall PrintDlgProc(long long long long) PrintDlgProc32
-21 stdcall AboutDlgProc(long long long long) AboutDlgProc32
-22 stdcall ComboLBoxWndProc(long long long long) ComboLBoxWndProc32
-23 stdcall CARET_Callback(long long long long) CARET_Callback
diff --git a/include/bitmap.h b/include/bitmap.h
index db8db52..5f0d360 100644
--- a/include/bitmap.h
+++ b/include/bitmap.h
@@ -39,7 +39,7 @@
 extern BOOL BITMAP_Init(void);
 extern int BITMAP_GetObject( BITMAPOBJ * bmp, int count, LPSTR buffer );
 extern BOOL BITMAP_DeleteObject( HBITMAP hbitmap, BITMAPOBJ * bitmap );
-extern HBITMAP BITMAP_SelectObject( HDC hdc, DC * dc, HBITMAP hbitmap,
+extern HBITMAP BITMAP_SelectObject( DC * dc, HBITMAP hbitmap,
                                     BITMAPOBJ * bmp );
 
   /* objects/dib.c */
diff --git a/include/brush.h b/include/brush.h
index c548dbe..daa2eaa 100644
--- a/include/brush.h
+++ b/include/brush.h
@@ -27,7 +27,6 @@
 extern BOOL BRUSH_Init(void);
 extern int BRUSH_GetObject( BRUSHOBJ * brush, int count, LPSTR buffer );
 extern BOOL BRUSH_DeleteObject( HBRUSH hbrush, BRUSHOBJ * brush );
-extern HBRUSH BRUSH_SelectObject( HDC hdc, DC * dc, HBRUSH hbrush,
-                                  BRUSHOBJ * brush );
+extern HBRUSH BRUSH_SelectObject( DC * dc, HBRUSH hbrush, BRUSHOBJ * brush );
 
 #endif  /* __WINE_BRUSH_H */
diff --git a/include/callback.h b/include/callback.h
index c636e60..fb07a71 100644
--- a/include/callback.h
+++ b/include/callback.h
@@ -34,6 +34,7 @@
 extern WORD CallTo16_word_llwl ( FARPROC, WORD, LONG, LONG, WORD, LONG );
 extern LONG CallTo16_long_wwwl ( FARPROC, WORD, WORD, WORD, WORD, LONG );
 extern WORD CallTo16_word_lwww ( FARPROC, WORD, LONG, WORD, WORD, WORD );
+extern WORD CallTo16_word_wwll ( FARPROC, WORD, WORD, WORD, LONG, LONG);
 extern WORD CallTo16_word_wllwl( FARPROC, WORD, WORD, LONG, LONG, WORD, LONG );
 extern WORD CallTo16_word_wwlll( FARPROC, WORD, WORD, WORD, LONG, LONG, LONG );
 extern LONG CallTo16_long_lllllllwlwwwl( FARPROC, WORD, LONG, LONG, LONG,
@@ -71,6 +72,8 @@
     CallTo16_long_wwwl( func, ds, hwnd, msg, wParam, lParam )
 #define CallWordBreakProc( func, lpch, ichCurrent, cch, code ) \
     CallTo16_word_lwww( func, CURRENT_DS, lpch, ichCurrent, cch, code )
+#define CallDCHookProc( func, hdc, code, data, lparam) \
+    CallTo16_word_wwll( func, CURRENT_DS, hdc, code, data, lparam )
 #define CallWndProcNCCREATE16( func, ds, exStyle, clsName, winName, style, \
                                x, y, cx, cy, hparent, hmenu, instance, \
                                params, hwnd, msg, wParam, lParam ) \
@@ -124,6 +127,8 @@
     (*func)( hwnd, msg, wParam, lParam )
 #define CallWndProc32( func, hwnd, msg, wParam, lParam ) \
     (*func)( hwnd, msg, wParam, lParam )
+#define CallDCHookProc( func, hdc, code, data, lparam ) \
+    (*func)( hdc, code, data, lparam )
 #define CallWordBreakProc( func, lpch, ichCurrent, cch, code ) \
     (*func)( lpch, ichCurrent, cch, code )
 
diff --git a/include/class.h b/include/class.h
index b958529..8cd8d06 100644
--- a/include/class.h
+++ b/include/class.h
@@ -17,7 +17,7 @@
     UINT32           magic;         /* Magic number */
     UINT32           cWindows;      /* Count of existing windows */
     UINT32           style;         /* Class style */
-    WNDPROC16        lpfnWndProc;   /* Window procedure */ 
+    HANDLE32         winproc;       /* Window procedure */ 
     INT32            cbClsExtra;    /* Class extra bytes */
     INT32            cbWndExtra;    /* Window extra bytes */
     LPSTR            menuNameA;     /* Default menu name (ASCII string) */
diff --git a/include/clipboard.h b/include/clipboard.h
index 502e314..62bdcab 100644
--- a/include/clipboard.h
+++ b/include/clipboard.h
@@ -1,7 +1,9 @@
 #ifndef __WINE_CLIPBOARD_H
 #define __WINE_CLIPBOARD_H
 
-extern void CLIPBOARD_ReadSelection(Window w,Atom prop);
+void CLIPBOARD_ReadSelection(Window w,Atom prop);
 void CLIPBOARD_ReleaseSelection(HWND hwnd);
+void CLIPBOARD_DisOwn(HWND hWnd);
+BOOL CLIPBOARD_IsPresent(WORD wFormat);
 
 #endif /* __WINE_CLIPBOARD_H */
diff --git a/include/commdlg.h b/include/commdlg.h
index 624822b..47efc9d 100644
--- a/include/commdlg.h
+++ b/include/commdlg.h
@@ -2,8 +2,12 @@
  * COMMDLG - Common Wine Dialog ... :-)
  */
 
-#ifndef COMMDLG_H
-#define COMMDLG_H
+#ifndef __WINE_COMMDLG_H
+#define __WINE_COMMDLG_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
 
 #include "wintypes.h"		/* needed for CHOOSEFONT structure */
 
@@ -87,7 +91,7 @@
 	DWORD 		Flags;
 	LPARAM		lCustData;
 	UINT		(*lpfnHook)(HWND, UINT, WPARAM, LPARAM);
-	LPCSTR 		lpTemplateName;
+	SEGPTR 		lpTemplateName;
 	} CHOOSECOLOR;
 typedef CHOOSECOLOR *LPCHOOSECOLOR;
 
@@ -306,6 +310,8 @@
 #pragma pack(4)
 #endif
 
-#endif 		/* #ifdef COMMDLG_H */
+#ifdef __cplusplus
+}
+#endif
 
-
+#endif  /* __WINE_COMMDLG_H */
diff --git a/include/dc.h b/include/dc.h
index 7e3874a..6356a6b 100644
--- a/include/dc.h
+++ b/include/dc.h
@@ -10,11 +10,12 @@
 
 #include "gdi.h"
 
-extern void DC_InitDC( HDC hdc );
+extern void DC_InitDC( DC* dc );
 extern BOOL DC_SetupGCForPatBlt( DC * dc, GC gc, BOOL fMapColors );
 extern BOOL DC_SetupGCForBrush( DC * dc );
 extern BOOL DC_SetupGCForPen( DC * dc );
 extern BOOL DC_SetupGCForText( DC * dc );
+extern BOOL DC_CallHookProc( DC * dc, WORD code, LPARAM lParam );
 
 extern const int DC_XROPfunction[];
 
diff --git a/include/dce.h b/include/dce.h
index e38c194..43a7ec5 100644
--- a/include/dce.h
+++ b/include/dce.h
@@ -9,6 +9,21 @@
 
 #include "windows.h"
 
+/* additional DCX flags 
+ */
+
+#define DCX_NORESETATTR		0x00000004
+#define DCX_EXCLUDEUPDATE    	0x00000100
+#define DCX_INTERSECTUPDATE  	0x00000200
+#define DCX_LOCKWINDOWUPDATE 	0x00000400
+#define DCX_NORECOMPUTE      	0x00100000
+#define DCX_VALIDATE         	0x00200000
+
+#define DCX_DCEBUSY		0x00001000
+#define DCX_WINDOWPAINT		0x00020000
+#define DCX_KEEPCLIPRGN		0x00040000
+#define DCX_NOCLIPCHILDREN      0x00080000
+
 typedef enum
 {
     DCE_CACHE_DC,   /* This is a cached DC (allocated by USER) */
@@ -20,17 +35,17 @@
 typedef struct tagDCE
 {
     HANDLE     hNext;
+    HDC	       hDC;
     HWND       hwndCurrent;
-    HDC        hdc;
+    HWND       hwndDC;
+    HRGN       hClipRgn;
     DCE_TYPE   type;
-    BOOL       inUse;
-    WORD       xOrigin;
-    WORD       yOrigin;
+    DWORD      DCXflags;
 } DCE;
 
 
-extern void DCE_Init(void);
-extern HANDLE DCE_AllocDCE( DCE_TYPE type );
-extern void DCE_FreeDCE( HANDLE hdce );
+extern void 	DCE_Init(void);
+extern HANDLE 	DCE_AllocDCE( HWND hWnd, DCE_TYPE type );
+extern void 	DCE_FreeDCE( HANDLE hdce );
 
 #endif  /* DCE_H */
diff --git a/include/dialog.h b/include/dialog.h
index e835b5b..bb4b677 100644
--- a/include/dialog.h
+++ b/include/dialog.h
@@ -9,19 +9,14 @@
 
 #include "windows.h"
 
-extern BOOL DIALOG_Init(void);
-extern HWND DIALOG_GetFirstTabItem( HWND hwndDlg );
-
-#pragma pack(1)
-
   /* Dialog info structure.
    * This structure is stored into the window extra bytes (cbWndExtra).
    * sizeof(DIALOGINFO) must be <= DLGWINDOWEXTRA (=30).
    */
 typedef struct
 {
-    LONG      msgResult;   /* Result of EndDialog() / Default button id */
-    WNDPROC   dlgProc;     /* Dialog procedure */
+    INT32     msgResult;   /* Result of EndDialog() / Default button id */
+    HANDLE32  dlgProc;     /* Dialog procedure */
     LONG      userInfo;    /* User information (for DWL_USER) */
     HWND      hwndFocus;   /* Current control with focus */
     HFONT     hUserFont;   /* Dialog font */
@@ -32,38 +27,7 @@
     HANDLE    hDialogHeap;
 } DIALOGINFO;
 
-
-  /* Dialog control header */
-typedef struct
-{
-    DWORD      style;
-    WORD       x;
-    WORD       y;
-    WORD       cx;
-    WORD       cy;
-    WORD       id;
-} DLGCONTROLHEADER;
-
-
-  /* Dialog template */
-typedef struct
-{
-    DWORD              style;
-    WORD               nbItems;
-    WORD               x;
-    WORD               y;
-    WORD               cx;
-    WORD               cy;
-    SEGPTR             menuName;
-    SEGPTR             className;
-    SEGPTR             caption;
-    WORD               pointSize;
-    SEGPTR             faceName;
-} DLGTEMPLATE;
-
-#pragma pack(4)
-
-extern WORD xBaseUnit,yBaseUnit;
-int DIALOG_DoDialogBox( HWND hwnd, HWND owner );
+extern BOOL DIALOG_Init(void);
+extern HWND DIALOG_GetFirstTabItem( HWND hwndDlg );
 
 #endif  /* DIALOG_H */
diff --git a/include/gdi.h b/include/gdi.h
index 96847b9..ac9b3a6 100644
--- a/include/gdi.h
+++ b/include/gdi.h
@@ -185,6 +185,9 @@
 {
     GDIOBJHDR     header;
     WORD          saveLevel;
+    DWORD         dwHookData;
+    FARPROC16     hookProc;
+    HDC           hSelf;
     WIN_DC_INFO   w;
     union
     {
@@ -193,9 +196,18 @@
     } u;
 } DC;
 
+  /* DC hook codes */
+#define DCHC_INVALIDVISRGN      0x0001
+#define DCHC_DELETEDC           0x0002
+
+#define DCHF_INVALIDATEVISRGN   0x0001
+#define DCHF_VALIDATEVISRGN     0x0002
+
   /* DC flags */
-#define DC_MEMORY     1   /* It is a memory DC */
-#define DC_SAVED      2   /* It is a saved DC */
+#define DC_MEMORY     0x0001   /* It is a memory DC */
+#define DC_SAVED      0x0002   /* It is a saved DC */
+#define DC_DIRTY      0x0004   /* hVisRgn has to be updated */
+#define DC_THUNKHOOK  0x0008   /* DC hook is in the 16-bit code */ 
 
   /* Last 32 bytes are reserved for stock object handles */
 #define GDI_HEAP_SIZE               0xffe0
@@ -267,6 +279,10 @@
 extern HANDLE GDI_AllocObject( WORD, WORD );
 extern BOOL GDI_FreeObject( HANDLE );
 extern GDIOBJHDR * GDI_GetObjPtr( HANDLE, WORD );
+extern FARPROC16 GDI_GetDefDCHook(void);
+
+#define UpdateDirtyDC(dc) \
+	    DC_CallHookProc(dc, DCHC_INVALIDVISRGN, 0)
 
 extern Display * display;
 extern Screen * screen;
diff --git a/include/kernel32.h b/include/kernel32.h
index 9b5b014..834cc2f 100644
--- a/include/kernel32.h
+++ b/include/kernel32.h
@@ -119,4 +119,6 @@
 #define FILE_ATTRIBUTE_ATOMIC_WRITE     0x0200
 #define FILE_ATTRIBUTE_XACTION_WRITE    0x0400
 
+BOOL       SetTimeZoneInformation(const TIME_ZONE_INFORMATION*);
+
 #endif  /* __WINE_KERNEL32_H */
diff --git a/include/module.h b/include/module.h
index c867f43..6ded804 100644
--- a/include/module.h
+++ b/include/module.h
@@ -127,7 +127,6 @@
 extern SEGPTR MODULE_GetEntryPoint( HMODULE hModule, WORD ordinal );
 extern BOOL MODULE_SetEntryPoint( HMODULE hModule, WORD ordinal, WORD offset );
 extern FARPROC16 MODULE_GetWndProcEntry16( const char *name );
-extern FARPROC32 MODULE_GetWndProcEntry32( const char *name );
 
 /* builtin.c */
 extern BOOL BUILTIN_Init(void);
diff --git a/include/struct32.h b/include/struct32.h
index a1c1e36..702b918 100644
--- a/include/struct32.h
+++ b/include/struct32.h
@@ -35,16 +35,6 @@
 	WORD cy WINE_PACKED;
 } DLGTEMPLATE32;
 
-typedef struct {
-	DWORD style;
-	DWORD dwExtendedStyle;
-	short x WINE_PACKED;
-	short y WINE_PACKED;
-	short cx WINE_PACKED;
-	short cy WINE_PACKED;
-	WORD id WINE_PACKED;
-} DLGITEMTEMPLATE32;
-
 typedef struct tagMSG32
 {
 	DWORD hwnd;
diff --git a/include/win.h b/include/win.h
index b451832..81e0c08 100644
--- a/include/win.h
+++ b/include/win.h
@@ -34,10 +34,10 @@
     struct tagWND *parent;        /* Window parent (from CreateWindow) */
     struct tagWND *owner;         /* Window owner */
     CLASS         *class;         /* Window class */
+    HANDLE32       winproc;       /* Window procedure */
     DWORD          dwMagic;       /* Magic number (must be WND_MAGIC) */
     HWND16         hwndSelf;      /* Handle of this window */
     HINSTANCE16    hInstance;     /* Window hInstance (from CreateWindow) */
-    WNDPROC16      lpfnWndProc;   /* Window procedure */
     RECT16         rectClient;    /* Client area rel. to parent client area */
     RECT16         rectWindow;    /* Whole window rel. to parent client area */
     RECT16         rectNormal;    /* Window rect. when in normal state */
@@ -57,6 +57,7 @@
     Window         window;        /* X window (only for top-level windows) */
     HMENU          hSysMenu;      /* window's copy of System Menu */
     HANDLE         hProp;         /* Handle of Properties List */
+    DWORD          userdata;      /* User private data */
     DWORD          wExtra[1];     /* Window extra bytes */
 } WND;
 
diff --git a/include/windows.h b/include/windows.h
index 03cf15b..3a1dcec 100644
--- a/include/windows.h
+++ b/include/windows.h
@@ -1,7 +1,11 @@
 /* Initial draft attempt of windows.h, by Peter MacDonald, pmacdona@sanjuan.uvic.ca */
 
-#ifndef WINDOWS_H
-#define WINDOWS_H
+#ifndef __WINE_WINDOWS_H
+#define __WINE_WINDOWS_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
 
 #include "wintypes.h"
 #include "winuser.h"
@@ -544,8 +548,6 @@
   POINT16   pt WINE_PACKED;
 } MSG, *LPMSG;
 	
-#define MAKEINTATOM(i)   ((SEGPTR)MAKELONG((i),0))
-
   /* Raster operations */
 
 #define R2_BLACK         1
@@ -2795,6 +2797,17 @@
         DWORD  dmDisplayFrequency;
 } DEVMODE;
 
+typedef struct _SYSTEM_POWER_STATUS
+{
+  BOOL    ACLineStatus;
+  BYTE    BatteryFlag;
+  BYTE    BatteryLifePercent;
+  BYTE    reserved;
+  DWORD   BatteryLifeTime;
+  DWORD   BatteryFullLifeTime;
+} SYSTEM_POWER_STATUS, *LPSYSTEM_POWER_STATUS;
+
+
 #ifndef WINELIB
 #pragma pack(4)
 #endif
@@ -2863,10 +2876,6 @@
 HDC        CreateDC(LPCSTR,LPCSTR,LPCSTR,const DEVMODE*);
 HBRUSH     CreateDIBPatternBrush(HGLOBAL,UINT);
 HBITMAP    CreateDIBitmap(HDC,BITMAPINFOHEADER*,DWORD,LPVOID,BITMAPINFO*,UINT);
-HWND       CreateDialog(HINSTANCE,SEGPTR,HWND,DLGPROC);
-HWND       CreateDialogIndirect(HINSTANCE,SEGPTR,HWND,DLGPROC);
-HWND       CreateDialogIndirectParam(HINSTANCE,SEGPTR,HWND,DLGPROC,LPARAM);
-HWND       CreateDialogParam(HINSTANCE,SEGPTR,HWND,DLGPROC,LPARAM);
 HBITMAP    CreateDiscardableBitmap(HDC,INT,INT);
 HRGN       CreateEllipticRgn(INT32,INT32,INT32,INT32);
 HFONT      CreateFont(INT,INT,INT,INT,INT,BYTE,BYTE,BYTE,BYTE,BYTE,BYTE,BYTE,BYTE,LPCSTR);
@@ -2885,7 +2894,6 @@
 HRGN       CreateRoundRectRgn(INT32,INT32,INT32,INT32,INT32,INT32);
 HBRUSH     CreateSolidBrush(COLORREF);
 void       DebugBreak(void);
-LRESULT    DefDlgProc(HWND,UINT,WPARAM,LPARAM);
 DWORD      DefHookProc(short,WORD,DWORD,HHOOK*);
 HDWP16     DeferWindowPos(HDWP16,HWND,HWND,INT,INT,INT,INT,UINT);
 ATOM       DeleteAtom(ATOM);
@@ -2898,10 +2906,6 @@
 BOOL       DestroyIcon(HICON);
 BOOL       DestroyMenu(HMENU);
 BOOL       DestroyWindow(HWND);
-INT        DialogBox(HINSTANCE,SEGPTR,HWND,DLGPROC);
-INT        DialogBoxIndirect(HINSTANCE,HANDLE,HWND,DLGPROC);
-INT        DialogBoxIndirectParam(HINSTANCE,HANDLE,HWND,DLGPROC,LONG);
-INT        DialogBoxParam(HINSTANCE,SEGPTR,HWND,DLGPROC,LONG);
 HANDLE     DirectResAlloc(HANDLE,WORD,WORD);
 void       DirectedYield(HTASK);
 LONG       DispatchMessage(const MSG*);
@@ -2920,7 +2924,6 @@
 BOOL       EnableScrollBar(HWND,UINT,UINT);
 BOOL       EnableWindow(HWND,BOOL);
 BOOL       EndDeferWindowPos(HDWP16);
-BOOL       EndDialog(HWND,INT);
 BOOL       EnumChildWindows(HWND,WNDENUMPROC,LPARAM);
 UINT       EnumClipboardFormats(UINT);
 INT        EnumFontFamilies(HDC,LPCSTR,FONTENUMPROC,LPARAM);
@@ -2989,6 +2992,7 @@
 HCURSOR    GetCursor(void);
 HDC        GetDC(HWND);
 HDC        GetDCEx(HWND,HRGN,DWORD);
+DWORD      GetDCHook(HDC,FARPROC16*);
 DWORD      GetDCOrg(HDC);
 HDC        GetDCState(HDC);
 int        GetDIBits(HDC,HANDLE,WORD,WORD,LPSTR,LPBITMAPINFO,WORD);
@@ -3071,6 +3075,7 @@
 int        GetSystemMetrics(WORD);
 WORD       GetSystemPaletteEntries(HDC,WORD,WORD,LPPALETTEENTRY);
 WORD       GetSystemPaletteUse(HDC);
+BOOL       GetSystemPowerStatus(LPSYSTEM_POWER_STATUS);
 VOID       GetSystemTime(LPSYSTEMTIME); /* Win32 */
 DWORD      GetTabbedTextExtent(HDC,LPSTR,int,int,LPINT16);
 HINSTANCE  GetTaskDS(void);
@@ -3247,6 +3252,7 @@
 BOOL32     SetCurrentDirectory(LPCSTR);
 HCURSOR    SetCursor(HCURSOR);
 void       SetCursorPos(short,short);
+BOOL       SetDCHook(HDC,FARPROC16,DWORD);
 void       SetDCState(HDC,HDC);
 int        SetDIBits(HDC,HANDLE,WORD,WORD,LPSTR,LPBITMAPINFO,WORD);
 int        SetDIBitsToDevice(HDC,short,short,WORD,WORD,WORD,WORD,WORD,WORD,LPSTR,LPBITMAPINFO,WORD);
@@ -3257,6 +3263,7 @@
 UINT       SetErrorMode(UINT);
 HWND       SetFocus(HWND);
 WORD       SetHandleCount(WORD);
+WORD       SetHookFlags(HDC,WORD);
 void       SetKeyboardState(BYTE*);
 WORD       SetMapMode(HDC,WORD);
 DWORD      SetMapperFlags(HDC,DWORD);
@@ -3283,6 +3290,8 @@
 void       SetSysColors(int,LPINT16,COLORREF*);
 HWND       SetSysModalWindow(HWND);
 WORD       SetSystemPaletteUse(HDC,WORD);
+BOOL       SetSystemPowerState(BOOL, BOOL);
+BOOL       SetSystemTime(const SYSTEMTIME*);
 WORD       SetSystemTimer(HWND,WORD,WORD,FARPROC);
 HQUEUE     SetTaskQueue(HTASK,HQUEUE);
 WORD       SetTextAlign(HDC,WORD);
@@ -3332,6 +3341,7 @@
 BOOL       UnrealizeObject(HBRUSH);
 int        UpdateColors(HDC);
 void       UpdateWindow(HWND32);
+void       UserYield(void);
 void       ValidateCodeSegments(void);
 LPSTR      ValidateFreeSpaces(void);
 void       ValidateRgn(HWND32,HRGN32);
@@ -3370,13 +3380,13 @@
 
 /* Declarations for functions that are the same in Win16 and Win32 */
 
+BOOL16     EndDialog(HWND32,INT32);
 INT16      ExcludeUpdateRgn(HDC32,HWND32);
 void       FillWindow(HWND16,HWND16,HDC16,HBRUSH16);
 DWORD      GetBitmapDimension(HBITMAP16);
 WORD       GetClassWord(HWND32,INT32);
 DWORD      GetLogicalDrives(void);
 INT16      GetUpdateRgn(HWND32,HRGN32,BOOL32);
-LONG       GetWindowLong(HWND32,INT32);
 WORD       GetWindowWord(HWND32,INT32);
 INT16      OffsetRgn(HRGN32,INT32,INT32);
 DWORD      OffsetViewportOrg(HDC16,INT16,INT16);
@@ -3429,6 +3439,26 @@
 BOOL16     CopyRect16(RECT16*,const RECT16*);
 BOOL32     CopyRect32(RECT32*,const RECT32*);
 #define    CopyRect WINELIB_NAME(CopyRect)
+HWND16     CreateDialog16(HINSTANCE16,SEGPTR,HWND16,DLGPROC);
+#define    CreateDialog32A(inst,ptr,hwnd,dlg) \
+           CreateDialogParam32A(inst,ptr,hwnd,dlg,0)
+#define    CreateDialog32W(inst,ptr,hwnd,dlg) \
+           CreateDialogParam32W(inst,ptr,hwnd,dlg,0)
+#define    CreateDialog WINELIB_NAME_AW(CreateDialog)
+HWND16     CreateDialogIndirect16(HINSTANCE16,LPCVOID,HWND16,DLGPROC);
+#define    CreateDialogIndirect32A(inst,ptr,hwnd,dlg) \
+           CreateDialogIndirectParam32A(inst,ptr,hwnd,dlg,0)
+#define    CreateDialogIndirect32W(inst,ptr,hwnd,dlg) \
+           CreateDialogIndirectParam32W(inst,ptr,hwnd,dlg,0)
+#define    CreateDialogIndirect WINELIB_NAME_AW(CreateDialogIndirect)
+HWND16     CreateDialogIndirectParam16(HINSTANCE16,LPCVOID,HWND16,DLGPROC,LPARAM);
+HWND32     CreateDialogIndirectParam32A(HINSTANCE32,LPCVOID,HWND32,DLGPROC,LPARAM);
+HWND32     CreateDialogIndirectParam32W(HINSTANCE32,LPCVOID,HWND32,DLGPROC,LPARAM);
+#define    CreateDialogIndirectParam WINELIB_NAME_AW(CreateDialogIndirectParam)
+HWND16     CreateDialogParam16(HINSTANCE16,SEGPTR,HWND16,DLGPROC,LPARAM);
+HWND32     CreateDialogParam32A(HINSTANCE32,LPCSTR,HWND32,DLGPROC,LPARAM);
+HWND32     CreateDialogParam32W(HINSTANCE32,LPCWSTR,HWND32,DLGPROC,LPARAM);
+#define    CreateDialogParam WINELIB_NAME_AW(CreateDialogParam)
 HRGN16     CreateEllipticRgnIndirect16(const RECT16 *);
 HRGN32     CreateEllipticRgnIndirect32(const RECT32 *);
 #define    CreateEllipticRgnIndirect WINELIB_NAME(CreateEllipticRgnIndirect)
@@ -3441,7 +3471,7 @@
 HRGN16     CreateRectRgnIndirect16(const RECT16*);
 HRGN32     CreateRectRgnIndirect32(const RECT32*);
 #define    CreateRectRgnIndirect WINELIB_NAME(CreateRectRgnIndirect)
-HWND16     CreateWindow16(SEGPTR,SEGPTR,DWORD,INT16,INT16,INT16,INT16,HWND16,HMENU16,HINSTANCE16,SEGPTR);
+HWND16     CreateWindow16(LPCSTR,LPCSTR,DWORD,INT16,INT16,INT16,INT16,HWND16,HMENU16,HINSTANCE16,LPVOID);
 #define    CreateWindow32A(className,titleName,style,x,y,width,height,\
                            parent,menu,instance,param) \
            CreateWindowEx32A(0,className,titleName,style,x,y,width,height,\
@@ -3451,10 +3481,14 @@
            CreateWindowEx32W(0,className,titleName,style,x,y,width,height,\
                            parent,menu,instance,param)
 #define    CreateWindow WINELIB_NAME_AW(CreateWindow)
-HWND16     CreateWindowEx16(DWORD,SEGPTR,SEGPTR,DWORD,INT16,INT16,INT16,INT16,HWND16,HMENU16,HINSTANCE16,SEGPTR);
+HWND16     CreateWindowEx16(DWORD,LPCSTR,LPCSTR,DWORD,INT16,INT16,INT16,INT16,HWND16,HMENU16,HINSTANCE16,LPVOID);
 HWND32     CreateWindowEx32A(DWORD,LPCSTR,LPCSTR,DWORD,INT32,INT32,INT32,INT32,HWND32,HMENU32,HINSTANCE32,LPVOID);
 HWND32     CreateWindowEx32W(DWORD,LPCWSTR,LPCWSTR,DWORD,INT32,INT32,INT32,INT32,HWND32,HMENU32,HINSTANCE32,LPVOID);
 #define    CreateWindowEx WINELIB_NAME_AW(CreateWindowEx)
+LRESULT    DefDlgProc16(HWND16,UINT16,WPARAM16,LPARAM);
+LRESULT    DefDlgProc32A(HWND32,UINT32,WPARAM32,LPARAM);
+LRESULT    DefDlgProc32W(HWND32,UINT32,WPARAM32,LPARAM);
+#define    DefDlgProc WINELIB_NAME_AW(DefDlgProc)
 LRESULT    DefFrameProc16(HWND16,HWND16,UINT16,WPARAM16,LPARAM);
 LRESULT    DefFrameProc32A(HWND32,HWND32,UINT32,WPARAM32,LPARAM);
 LRESULT    DefFrameProc32W(HWND32,HWND32,UINT32,WPARAM32,LPARAM);
@@ -3467,6 +3501,26 @@
 LRESULT    DefWindowProc32A(HWND32,UINT32,WPARAM32,LPARAM);
 LRESULT    DefWindowProc32W(HWND32,UINT32,WPARAM32,LPARAM);
 #define    DefWindowProc WINELIB_NAME_AW(DefWindowProc)
+INT16      DialogBox16(HINSTANCE16,SEGPTR,HWND16,DLGPROC);
+#define    DialogBox32A(inst,template,owner,func) \
+           DialogBoxParam32A(inst,template,owner,func,0)
+#define    DialogBox32W(inst,template,owner,func) \
+           DialogBoxParam32W(inst,template,owner,func,0)
+#define    DialogBox WINELIB_NAME_AW(DialogBox)
+INT16      DialogBoxIndirect16(HINSTANCE16,HANDLE16,HWND16,DLGPROC);
+#define    DialogBoxIndirect32A(inst,template,owner,func) \
+           DialogBoxIndirectParam32A(inst,template,owner,func,0)
+#define    DialogBoxIndirect32W(inst,template,owner,func) \
+           DialogBoxIndirectParam32W(inst,template,owner,func,0)
+#define    DialogBoxIndirect WINELIB_NAME_AW(DialogBoxIndirect)
+INT16      DialogBoxIndirectParam16(HINSTANCE16,HANDLE16,HWND16,DLGPROC,LPARAM);
+INT32      DialogBoxIndirectParam32A(HINSTANCE32,LPCVOID,HWND32,DLGPROC,LPARAM);
+INT32      DialogBoxIndirectParam32W(HINSTANCE32,LPCVOID,HWND32,DLGPROC,LPARAM);
+#define    DialogBoxIndirectParam WINELIB_NAME_AW(DialogBoxIndirectParam)
+INT16      DialogBoxParam16(HINSTANCE16,SEGPTR,HWND16,DLGPROC,LPARAM);
+INT32      DialogBoxParam32A(HINSTANCE32,LPCSTR,HWND32,DLGPROC,LPARAM);
+INT32      DialogBoxParam32W(HINSTANCE32,LPCWSTR,HWND32,DLGPROC,LPARAM);
+#define    DialogBoxParam WINELIB_NAME_AW(DialogBoxParam)
 INT16      DlgDirListComboBox16(HWND16,LPCSTR,INT16,INT16,UINT16);
 INT32      DlgDirListComboBox32A(HWND32,LPCSTR,INT32,INT32,UINT32);
 INT32      DlgDirListComboBox32W(HWND32,LPCWSTR,INT32,INT32,UINT32);
@@ -3574,6 +3628,10 @@
 BOOL16     GetWindowExtEx16(HDC16,LPPOINT16);
 BOOL32     GetWindowExtEx32(HDC32,LPPOINT32);
 #define    GetWindowExtEx WINELIB_NAME(GetWindowExtEx)
+LONG       GetWindowLong16(HWND16,INT16);
+LONG       GetWindowLong32A(HWND32,INT32);
+LONG       GetWindowLong32W(HWND32,INT32);
+#define    GetWindowLong WINELIB_NAME_AW(GetWindowLong)
 BOOL16     GetWindowOrgEx16(HDC16,LPPOINT16);
 BOOL32     GetWindowOrgEx32(HDC32,LPPOINT32);
 #define    GetWindowOrgEx WINELIB_NAME(GetWindowOrgEx)
@@ -3890,4 +3948,9 @@
 #ifdef WINELIB
 #define WINELIB_UNIMP(x) fprintf (stderr, "WineLib: Unimplemented %s\n", x)
 #endif
-#endif  /* WINDOWS_H */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif  /* __WINE_WINDOWS_H */
diff --git a/include/winproc.h b/include/winproc.h
index c26546c..7f799e1 100644
--- a/include/winproc.h
+++ b/include/winproc.h
@@ -17,9 +17,11 @@
     WIN_PROC_32W
 } WINDOWPROCTYPE;
 
-extern WNDPROC16 WINPROC_AllocWinProc( WNDPROC32 func, WINDOWPROCTYPE type );
-extern WINDOWPROCTYPE WINPROC_GetWinProcType( WNDPROC16 func );
-extern WNDPROC32 WINPROC_GetWinProcFunc( WNDPROC16 func );
-extern void WINPROC_FreeWinProc( WNDPROC16 func );
+extern HANDLE32 WINPROC_AllocWinProc( UINT32 func, WINDOWPROCTYPE type );
+extern HANDLE32 WINPROC_CopyWinProc( HANDLE32 handle );
+extern void WINPROC_FreeWinProc( HANDLE32 handle );
+extern WINDOWPROCTYPE WINPROC_GetWinProcType( HANDLE32 handle );
+extern WNDPROC16 WINPROC_GetFunc16( HANDLE32 handle );
+extern WNDPROC32 WINPROC_GetFunc32( HANDLE32 handle );
 
 #endif  /* __WINE_WINPROC_H */
diff --git a/include/wintypes.h b/include/wintypes.h
index 0ed35af..97718cc 100644
--- a/include/wintypes.h
+++ b/include/wintypes.h
@@ -345,6 +345,7 @@
                                        (((DWORD)((WORD)(high))) << 16)))
 #define MAKELPARAM(low,high)   ((LPARAM)MAKELONG(low,high))
 #define MAKEWPARAM(low,high)   ((WPARAM32)MAKELONG(low,high))
+#define MAKEINTATOM(atom)      ((LPCSTR)MAKELONG((atom),0))
 
 #define SELECTOROF(ptr)     (HIWORD(ptr))
 #define OFFSETOF(ptr)       (LOWORD(ptr))
diff --git a/ipc/dde_proc.c b/ipc/dde_proc.c
index 660dfd6..b65b5fa 100644
--- a/ipc/dde_proc.c
+++ b/ipc/dde_proc.c
@@ -452,7 +452,7 @@
 		    remote_message->wParam, (int)remote_message->lParam);
 
 	/* execute the recieved message */
-	passed= SendMessage(dde_window, remote_message->message,
+	passed= SendMessage16(dde_window, remote_message->message,
 			    remote_message->wParam, remote_message->lParam);
 
 	/* Tell the sended, that the message is here */
@@ -481,7 +481,7 @@
   {
      if (wndPtr->dwStyle & WS_POPUP || wndPtr->dwStyle & WS_CAPTION) {
 	if (was_sent)
-	   SendMessage( wndPtr->hwndSelf, remote_message->message,
+	   SendMessage16( wndPtr->hwndSelf, remote_message->message,
 			remote_message->wParam, remote_message->lParam );
 	else
 	   PostMessage( wndPtr->hwndSelf, remote_message->message,
@@ -528,7 +528,7 @@
   if (hwnd==0)
       hwnd=-1;
   /* just send a message to see how things are going */
-  SendMessage( hwnd, WM_DDE_INITIATE, 0, 0);
+  SendMessage16( hwnd, WM_DDE_INITIATE, 0, 0);
 }
 
 void dde_proc_delete(int proc_idx)
@@ -553,7 +553,7 @@
 
 static void print_dde_message(char *desc, MSG *msg)
 {
-    extern const char *MessageTypeNames[];
+/*    extern const char *MessageTypeNames[];*/
     extern int debug_last_handle_size;
     WORD wStatus,hWord;
     void *ptr;
@@ -571,7 +571,7 @@
 
     fprintf(stddeb,"%s", desc);
     fprintf(stddeb,"%04x %04x==%s %04x %08lx ",
-	    msg->hwnd, msg->message,MessageTypeNames[msg->message],
+	    msg->hwnd, msg->message,"",/*MessageTypeNames[msg->message],*/
 	    msg->wParam, msg->lParam);
     switch(msg->message) {
       case WM_DDE_INITIATE:
diff --git a/library/miscstubs.c b/library/miscstubs.c
index 0999340..ed8aaa7 100644
--- a/library/miscstubs.c
+++ b/library/miscstubs.c
@@ -103,16 +103,6 @@
   return ErrorProc;
 }
 
-/***********************************************************************
- *           MODULE_GetWndProcEntry32 (not a Windows API function)
- *
- * Return an entry point from the WPROCS32 dll.
- */
-WNDPROC MODULE_GetWndProcEntry32( char *name )
-{
-    return MODULE_GetWndProcEntry16( name );
-}
-
 void DEBUG_EnterDebugger(void)
 {
 }
diff --git a/loader/builtin.c b/loader/builtin.c
index e261ab0..76c0d29 100644
--- a/loader/builtin.c
+++ b/loader/builtin.c
@@ -103,7 +103,6 @@
 extern const DLL_DESCRIPTOR NTDLL_Descriptor;
 extern const DLL_DESCRIPTOR SHELL32_Descriptor;
 extern const DLL_DESCRIPTOR USER32_Descriptor;
-extern const DLL_DESCRIPTOR WPROCS32_Descriptor;
 extern const DLL_DESCRIPTOR WINSPOOL_Descriptor;
 extern const DLL_DESCRIPTOR WSOCK32_Descriptor;
 
@@ -151,7 +150,6 @@
     { &NTDLL_Descriptor,    0 },
     { &SHELL32_Descriptor,  0 },
     { &USER32_Descriptor,   0 },
-    { &WPROCS32_Descriptor, DLL_FLAG_ALWAYS_USED },
     { &WINSPOOL_Descriptor, 0 },
     { &WSOCK32_Descriptor,  0 },
     /* Last entry */
diff --git a/loader/module.c b/loader/module.c
index f6638fd..9257c75 100644
--- a/loader/module.c
+++ b/loader/module.c
@@ -775,25 +775,6 @@
 
 
 /***********************************************************************
- *           MODULE_GetWndProcEntry32  (not a Windows API function)
- *
- * Return an entry point from the WPROCS32 dll.
- */
-#ifndef WINELIB
-FARPROC32 MODULE_GetWndProcEntry32( const char *name )
-{
-    FARPROC32 ret;
-    static HMODULE hModule = 0;
-
-    if (!hModule) hModule = GetModuleHandle( "WPROCS32" );
-    if (!(ret = PE_GetProcAddress( hModule, name )))
-        fprintf( stderr, "GetWndProc32: %s not found, please report\n", name );
-    return ret;
-}
-#endif
-
-
-/***********************************************************************
  *           MODULE_GetModuleName
  */
 LPSTR MODULE_GetModuleName( HMODULE hModule )
@@ -1003,7 +984,7 @@
                     char *p;
 
                     /* Try with prepending the path of the current module */
-                    GetModuleFileName( hModule, buffer, 256 );
+                    GetModuleFileName( hModule, buffer, sizeof(buffer) );
                     if (!(p = strrchr( buffer, '\\' ))) p = buffer;
                     memcpy( p + 1, pstr + 1, *pstr );
                     strcpy( p + 1 + *pstr, ".dll" );
@@ -1033,6 +1014,7 @@
 		/* Handle self loading modules */
 		SEGTABLEENTRY * pSegTable = (SEGTABLEENTRY *) NE_SEG_TABLE(pModule);
 		SELFLOADHEADER *selfloadheader;
+                STACK16FRAME *stack16Top;
 		HMODULE hselfload = GetModuleHandle("WPROCS");
 		WORD oldss, oldsp, saved_dgroup = pSegTable[pModule->dgroup - 1].selector;
 		fprintf (stderr, "Warning:  %*.*s is a self-loading module\n"
@@ -1054,7 +1036,18 @@
 		oldss = IF1632_Saved16_ss;
 		oldsp = IF1632_Saved16_sp;
 		IF1632_Saved16_ss = pModule->self_loading_sel;
-		IF1632_Saved16_sp = 0xFF00;
+		IF1632_Saved16_sp = 0xFF00 - sizeof(*stack16Top);
+                stack16Top = CURRENT_STACK16;
+                stack16Top->saved_ss = 0;
+                stack16Top->saved_sp = 0;
+                stack16Top->ds = stack16Top->es = pModule->self_loading_sel;
+                stack16Top->entry_point = 0;
+                stack16Top->entry_ip = 0;
+                stack16Top->entry_cs = 0;
+                stack16Top->bp = 0;
+                stack16Top->ip = 0;
+                stack16Top->cs = 0;
+
 		if (!IF1632_Stack32_base) {
 		  STACK32FRAME* frame32;
 		  char *stack32Top;
diff --git a/loader/ne_image.c b/loader/ne_image.c
index 8fb2030..9ef9966 100644
--- a/loader/ne_image.c
+++ b/loader/ne_image.c
@@ -65,6 +65,7 @@
 #ifndef WINELIB
  	/* Implement self loading segments */
  	SELFLOADHEADER *selfloadheader;
+        STACK16FRAME *stack16Top;
  	WORD oldss, oldsp, oldselector, newselector;
  	selfloadheader = (SELFLOADHEADER *)
  		PTR_SEG_OFF_TO_LIN(pSegTable->selector,0);
@@ -72,7 +73,17 @@
  	oldsp = IF1632_Saved16_sp;
  	oldselector = pSeg->selector;
  	IF1632_Saved16_ss = pModule->self_loading_sel;
- 	IF1632_Saved16_sp = 0xFF00;
+ 	IF1632_Saved16_sp = 0xFF00 - sizeof(*stack16Top);
+        stack16Top = CURRENT_STACK16;
+        stack16Top->saved_ss = 0;
+        stack16Top->saved_sp = 0;
+        stack16Top->ds = stack16Top->es = pModule->self_loading_sel;
+        stack16Top->entry_point = 0;
+        stack16Top->entry_ip = 0;
+        stack16Top->entry_cs = 0;
+        stack16Top->bp = 0;
+        stack16Top->ip = 0;
+        stack16Top->cs = 0;
         /* FIXME: we probably need to pass a DOS file handle here */
  	newselector =  CallTo16_word_www(selfloadheader->LoadAppSeg,
  		pModule->self_loading_sel, hModule, fd, segnum);
diff --git a/loader/pe_image.c b/loader/pe_image.c
index fffff8a..e97df39 100644
--- a/loader/pe_image.c
+++ b/loader/pe_image.c
@@ -170,6 +170,16 @@
   	char *name = (char*)load_addr+pe_imp->ModuleName;
 	mod_ptr[i] = LoadModule(name,(LPVOID)-1);
 	if(mod_ptr[i]<=(HMODULE)32)
+        {
+            char *p, buffer[256];
+
+            /* Try with prepending the path of the current module */
+            GetModuleFileName( hModule, buffer, sizeof(buffer) );
+            if (!(p = strrchr( buffer, '\\' ))) p = buffer;
+            strcpy( p + 1, name );
+            mod_ptr[i] = LoadModule( buffer, (LPVOID)-1 );
+        }
+	if(mod_ptr[i]<=(HMODULE)32)
 	{
 		fprintf(stderr,"Module %s not found\n",name);
 		exit(0);
diff --git a/misc/clipboard.c b/misc/clipboard.c
index 0cc5848..a9c01d9 100644
--- a/misc/clipboard.c
+++ b/misc/clipboard.c
@@ -2,27 +2,33 @@
  * 'Wine' Clipboard function handling
  *
  * Copyright 1994 Martin Ayotte
-static char Copyright[] = "Copyright Martin Ayotte, 1994";
-*/
+ *	     1996 Alex Korobka
+ *
+ */
 
 #include <stdlib.h>
 #include <stdio.h>
-#include <windows.h>
 #include <sys/types.h>
 #include <sys/stat.h>
 #include <fcntl.h>
 #include <unistd.h>
+#include <string.h>
 #include <X11/Xlib.h>
 #include <X11/Xatom.h>
+#include "windows.h"
 #include "win.h"
 #include "message.h"
 #include "clipboard.h"
+#include "xmalloc.h"
 #include "stddebug.h"
 #include "debug.h"
 
+#define  CF_REGFORMATBASE 	0xC000
+
 typedef struct tagCLIPFORMAT {
     WORD	wFormatID;
     WORD	wRefCount;
+    WORD	wDataPresent;
     LPSTR	Name;
     HANDLE	hData;
     DWORD	BufSize;
@@ -30,36 +36,132 @@
     void	*NextFormat;
 } CLIPFORMAT, *LPCLIPFORMAT;
 
-static HWND hWndClipboardOwner = 0;
-static HWND hWndViewer = 0;
-static WORD LastRegFormat = 0xC000;
+/* *************************************************************************
+ *			internal variables
+ */
+
+static HWND hWndClipOwner  = 0;		/* current clipboard owner */
+static HWND hWndClipWindow = 0;		/* window that opened clipboard */
+static HWND hWndViewer     = 0;		/* start of viewers chain */
+
+static BOOL bClipChanged  = FALSE;
+static WORD LastRegFormat = CF_REGFORMATBASE;
+
 static Bool wait_for_selection = False;
 static Bool wineOwnsSelection = False;
 
-CLIPFORMAT ClipFormats[12]  = {
-    { CF_TEXT, 1, "Text", (HANDLE)NULL, 0, NULL, &ClipFormats[1] },
-    { CF_BITMAP, 1, "Bitmap", (HANDLE)NULL, 0, &ClipFormats[0], &ClipFormats[2] },
-    { CF_METAFILEPICT, 1, "MetaFile Picture", (HANDLE)NULL, 0, &ClipFormats[1], &ClipFormats[3] },
-    { CF_SYLK, 1, "Sylk", (HANDLE)NULL, 0, &ClipFormats[2], &ClipFormats[4] },
-    { CF_DIF, 1, "DIF", (HANDLE)NULL, 0, &ClipFormats[3], &ClipFormats[5] },
-    { CF_TIFF, 1, "TIFF", (HANDLE)NULL, 0, &ClipFormats[4], &ClipFormats[6] },
-    { CF_OEMTEXT, 1, "OEM Text", (HANDLE)NULL, 0, &ClipFormats[5], &ClipFormats[7] },
-    { CF_DIB, 1, "DIB", (HANDLE)NULL, 0, &ClipFormats[6], &ClipFormats[8] },
-    { CF_PALETTE, 1, "Palette", (HANDLE)NULL, 0, &ClipFormats[7], &ClipFormats[9] },
-    { CF_PENDATA, 1, "PenData", (HANDLE)NULL, 0, &ClipFormats[8], &ClipFormats[10] },
-    { CF_RIFF, 1, "RIFF", (HANDLE)NULL, 0, &ClipFormats[9], &ClipFormats[11] },
-    { CF_WAVE, 1, "Wave", (HANDLE)NULL, 0, &ClipFormats[10], NULL }
+CLIPFORMAT ClipFormats[16]  = {
+    { CF_TEXT, 1, 0, "Text", (HANDLE)NULL, 0, NULL, &ClipFormats[1] },
+    { CF_BITMAP, 1, 0, "Bitmap", (HANDLE)NULL, 0, &ClipFormats[0], &ClipFormats[2] },
+    { CF_METAFILEPICT, 1, 0, "MetaFile Picture", (HANDLE)NULL, 0, &ClipFormats[1], &ClipFormats[3] },
+    { CF_SYLK, 1, 0, "Sylk", (HANDLE)NULL, 0, &ClipFormats[2], &ClipFormats[4] },
+    { CF_DIF, 1, 0, "DIF", (HANDLE)NULL, 0, &ClipFormats[3], &ClipFormats[5] },
+    { CF_TIFF, 1, 0, "TIFF", (HANDLE)NULL, 0, &ClipFormats[4], &ClipFormats[6] },
+    { CF_OEMTEXT, 1, 0, "OEM Text", (HANDLE)NULL, 0, &ClipFormats[5], &ClipFormats[7] },
+    { CF_DIB, 1, 0, "DIB", (HANDLE)NULL, 0, &ClipFormats[6], &ClipFormats[8] },
+    { CF_PALETTE, 1, 0, "Palette", (HANDLE)NULL, 0, &ClipFormats[7], &ClipFormats[9] },
+    { CF_PENDATA, 1, 0, "PenData", (HANDLE)NULL, 0, &ClipFormats[8], &ClipFormats[10] },
+    { CF_RIFF, 1, 0, "RIFF", (HANDLE)NULL, 0, &ClipFormats[9], &ClipFormats[11] },
+    { CF_WAVE, 1, 0, "Wave", (HANDLE)NULL, 0, &ClipFormats[10], &ClipFormats[12] },
+    { CF_OWNERDISPLAY, 1, 0, "Owner Display", (HANDLE)NULL, 0, &ClipFormats[11], &ClipFormats[13] },
+    { CF_DSPTEXT, 1, 0, "DSPText", (HANDLE)NULL, 0, &ClipFormats[12], &ClipFormats[14] },
+    { CF_DSPMETAFILEPICT, 1, 0, "DSPMetaFile Picture", (HANDLE)NULL, 0, &ClipFormats[13], &ClipFormats[15] },
+    { CF_DSPBITMAP, 1, 0, "DSPBitmap", (HANDLE)NULL, 0, &ClipFormats[14], NULL }
     };
 
 /**************************************************************************
+ *			CLIPBOARD_DisOwn
+ */
+void CLIPBOARD_DisOwn(HWND hWnd)
+{
+  LPCLIPFORMAT lpFormat = ClipFormats;
+
+  if( hWnd != hWndClipOwner || !hWndClipOwner ) return;
+
+  SendMessage16(hWndClipOwner,WM_RENDERALLFORMATS,0,0L);
+
+  /* check if all formats were rendered */
+
+  while(lpFormat)
+    { 
+       if( lpFormat->wDataPresent && !lpFormat->hData )
+	 {
+	   dprintf_clipboard(stddeb,"\tdata missing for clipboard format %i\n", lpFormat->wFormatID); 
+	   lpFormat->wDataPresent = 0;
+	 }
+       lpFormat = lpFormat->NextFormat;
+    }
+
+  hWndClipOwner = 0;
+}
+
+/**************************************************************************
+ *			CLIPBOARD_DeleteRecord
+ */
+void CLIPBOARD_DeleteRecord(LPCLIPFORMAT lpFormat)
+{
+  if( lpFormat->wFormatID >= CF_GDIOBJFIRST &&
+      lpFormat->wFormatID <= CF_GDIOBJLAST )
+      DeleteObject(lpFormat->hData);
+  else if( lpFormat->hData )
+           GlobalFree16(lpFormat->hData);
+
+  lpFormat->wDataPresent = 0; 
+  lpFormat->hData = 0;
+
+  bClipChanged = TRUE;
+}
+
+/**************************************************************************
+ *			CLIPBOARD_RequestXSelection
+ */
+BOOL CLIPBOARD_RequestXSelection()
+{
+  wait_for_selection=True;
+  dprintf_clipboard(stddeb,"Requesting selection\n");
+
+  XConvertSelection(display,XA_PRIMARY,XA_STRING,
+                    XInternAtom(display,"PRIMARY_TEXT",False),
+                    WIN_GetXWindow(hWndClipWindow),CurrentTime);
+
+  /* TODO: need time-out for broken clients */
+  while(wait_for_selection) EVENT_WaitXEvent(-1);
+
+  return (BOOL)ClipFormats[0].wDataPresent;
+}
+
+/**************************************************************************
+ *			CLIPBOARD_IsPresent
+ */
+BOOL CLIPBOARD_IsPresent(WORD wFormat)
+{
+    LPCLIPFORMAT lpFormat = ClipFormats; 
+
+    while(TRUE) {
+        if (lpFormat == NULL) return FALSE;
+        if (lpFormat->wFormatID == wFormat) break;
+        lpFormat = lpFormat->NextFormat;
+        }
+    return (lpFormat->wDataPresent);
+}
+
+/**************************************************************************
  *			OpenClipboard		[USER.137]
  */
 BOOL OpenClipboard(HWND hWnd)
 {
-    if (hWndClipboardOwner != 0) return FALSE;
-    hWndClipboardOwner = hWnd;
-    dprintf_clipboard(stddeb,"OpenClipboard(%04x); !\n", hWnd);
-    return TRUE;
+    BOOL bRet = FALSE;
+    dprintf_clipboard(stddeb,"OpenClipboard(%04x) = ", hWnd);
+
+    if (!hWndClipWindow)
+       {
+    	 hWndClipWindow = hWnd;
+	 bRet = TRUE;
+       }
+    bClipChanged = FALSE;
+
+    dprintf_clipboard(stddeb,"%i\n", bRet);
+    return bRet;
 }
 
 
@@ -68,9 +170,13 @@
  */
 BOOL CloseClipboard()
 {
-    if (hWndClipboardOwner == 0) return FALSE;
-    hWndClipboardOwner = 0;
     dprintf_clipboard(stddeb,"CloseClipboard(); !\n");
+
+    if (hWndClipWindow == 0) return FALSE;
+    hWndClipWindow = 0;
+
+    if (bClipChanged && hWndViewer) SendMessage16(hWndViewer,WM_DRAWCLIPBOARD,0,0L);
+
     return TRUE;
 }
 
@@ -81,16 +187,26 @@
 BOOL EmptyClipboard()
 {
     LPCLIPFORMAT lpFormat = ClipFormats; 
-    if (hWndClipboardOwner == 0) return FALSE;
-    dprintf_clipboard(stddeb,"EmptyClipboard(); !\n");
-    while(TRUE) {
-	if (lpFormat == NULL) break;
-	if (lpFormat->hData != 0) {
-	    GlobalFree16(lpFormat->hData);
-	    lpFormat->hData = 0;
-	    }
+
+    dprintf_clipboard(stddeb,"EmptyClipboard()\n");
+
+    if (hWndClipWindow == 0) return FALSE;
+
+    /* destroy private objects */
+
+    if (hWndClipOwner)
+	SendMessage16(hWndClipOwner,WM_DESTROYCLIPBOARD,0,0L);
+  
+    while(lpFormat) 
+      {
+	if ( lpFormat->wDataPresent )
+	     CLIPBOARD_DeleteRecord( lpFormat );
+
 	lpFormat = lpFormat->NextFormat;
-	}
+      }
+
+    hWndClipOwner = hWndClipWindow;
+
     if(wineOwnsSelection){
         dprintf_clipboard(stddeb,"Losing selection\n");
 	wineOwnsSelection=False;
@@ -106,8 +222,8 @@
 HWND GetClipboardOwner()
 {
     dprintf_clipboard(stddeb,
-		"GetClipboardOwner() = %04x !\n", hWndClipboardOwner);
-    return hWndClipboardOwner;
+		"GetClipboardOwner() = %04x !\n", hWndClipOwner);
+    return hWndClipOwner;
 }
 
 
@@ -117,20 +233,40 @@
 HANDLE SetClipboardData(WORD wFormat, HANDLE hData)
 {
     LPCLIPFORMAT lpFormat = ClipFormats; 
+    Window       owner;
+
     dprintf_clipboard(stddeb,
 		"SetClipboardDate(%04X, %04x) !\n", wFormat, hData);
-    while(TRUE) {
+
+    while(TRUE) 
+      {
 	if (lpFormat == NULL) return 0;
 	if (lpFormat->wFormatID == wFormat) break;
 	lpFormat = lpFormat->NextFormat;
-	}
-    /* doc says we shouldn't use CurrentTime */
-    /* should we become owner of CLIPBOARD as well? */
-    XSetSelectionOwner(display,XA_PRIMARY,WIN_GetXWindow(hWndClipboardOwner),CurrentTime);
-    wineOwnsSelection = True;
-    dprintf_clipboard(stddeb,"Getting selection\n");
-    if (lpFormat->hData != 0) GlobalFree16(lpFormat->hData);
+      }
+
+    /* Acquire X selection:
+     *
+     * doc says we shouldn't use CurrentTime 
+     * should we become owner of CLIPBOARD as well? 
+     */
+
+    owner = WIN_GetXWindow(hWndClipWindow);
+
+    XSetSelectionOwner(display,XA_PRIMARY,owner,CurrentTime);
+    if( XGetSelectionOwner(display,XA_PRIMARY) == owner )
+      {
+        wineOwnsSelection = True;
+        dprintf_clipboard(stddeb,"Getting selection\n");
+      }
+
+    if ( lpFormat->wDataPresent ) 
+         CLIPBOARD_DeleteRecord(lpFormat);
+
+    bClipChanged = TRUE;
+    lpFormat->wDataPresent = TRUE;
     lpFormat->hData = hData;
+
     return lpFormat->hData;
 }
 
@@ -141,22 +277,26 @@
 HANDLE GetClipboardData(WORD wFormat)
 {
     LPCLIPFORMAT lpFormat = ClipFormats; 
-    dprintf_clipboard(stddeb,"GetClipboardData(%04X) !\n", wFormat);
-    if (!hWndClipboardOwner) return 0;
-    if(wFormat == CF_TEXT && !wineOwnsSelection)
-    {	wait_for_selection=True;
-        dprintf_clipboard(stddeb,"Requesting selection\n");
-	XConvertSelection(display,XA_PRIMARY,XA_STRING,
-		XInternAtom(display,"PRIMARY_TEXT",False),
-		WIN_GetXWindow(hWndClipboardOwner),CurrentTime);
-	/* TODO: need time-out for broken clients */
-	while(wait_for_selection) EVENT_WaitXEvent(-1);
-    }
+    dprintf_clipboard(stddeb,"GetClipboardData(%04X)\n", wFormat);
+
+    if (!hWndClipWindow) return 0;
+
+    /*  if(wFormat == CF_TEXT && !wineOwnsSelection)
+        CLIPBOARD_RequestXSelection(); 
+     */
+
     while(TRUE) {
 	if (lpFormat == NULL) return 0;
 	if (lpFormat->wFormatID == wFormat) break;
 	lpFormat = lpFormat->NextFormat;
 	}
+
+    if( lpFormat->wDataPresent && !lpFormat->hData )
+      if( IsWindow(hWndClipOwner) )
+	  SendMessage16(hWndClipOwner,WM_RENDERFORMAT,(WPARAM)lpFormat->wFormatID,0L);
+      else
+	  dprintf_clipboard(stddeb,"\thWndClipOwner is lost\n");
+      
     return lpFormat->hData;
 }
 
@@ -166,19 +306,23 @@
  */
 INT CountClipboardFormats()
 {
-    int FormatCount = 0;
+    int 	 FormatCount = 0;
     LPCLIPFORMAT lpFormat = ClipFormats; 
+
+    dprintf_clipboard(stddeb,"CountClipboardFormats()\n");
+
     while(TRUE) {
 	if (lpFormat == NULL) break;
-	if (lpFormat->hData != 0) {
-        dprintf_clipboard(stddeb,
-		"CountClipboardFormats // Find Not Empty (%04x) !\n",
-					lpFormat->hData);
-	    FormatCount++;
+	if (lpFormat->wDataPresent) 
+	    {
+               dprintf_clipboard(stddeb, "\tdata found for format %i\n", lpFormat->wFormatID);
+
+	       FormatCount++;
 	    }
 	lpFormat = lpFormat->NextFormat;
 	}
-    dprintf_clipboard(stddeb,"CountClipboardFormats() = %d !\n", FormatCount);
+
+    dprintf_clipboard(stddeb,"\ttotal %d\n", FormatCount);
     return FormatCount;
 }
 
@@ -189,28 +333,37 @@
 UINT EnumClipboardFormats(UINT wFormat)
 {
     LPCLIPFORMAT lpFormat = ClipFormats; 
-    dprintf_clipboard(stddeb,"EnumClipboardFormats(%04X) !\n", wFormat);
+
+    dprintf_clipboard(stddeb,"EnumClipboardFormats(%04X)\n", wFormat);
+
+    if( (!wFormat || wFormat == CF_TEXT) && !wineOwnsSelection)
+        CLIPBOARD_RequestXSelection();
+
     if (wFormat == 0) {
-	if (lpFormat->hData != 0) 
+	if (lpFormat->wDataPresent) 
 	    return lpFormat->wFormatID;
 	else 
 	    wFormat = lpFormat->wFormatID;
 	}
+
+    /* walk up to the specified format record */
+
     while(TRUE) {
 	if (lpFormat == NULL) return 0;
 	if (lpFormat->wFormatID == wFormat) break;
 	lpFormat = lpFormat->NextFormat;
 	}
-    dprintf_clipboard(stddeb,"EnumClipboardFormats // Find Last (%04X) !\n",
-				lpFormat->wFormatID);
+
+    /* find next format with available data */
+
     lpFormat = lpFormat->NextFormat;
     while(TRUE) {
 	if (lpFormat == NULL) return 0;
-	if (lpFormat->hData != 0) break;
+	if (lpFormat->wDataPresent ) break;
 	lpFormat = lpFormat->NextFormat;
 	}
-    dprintf_clipboard(stddeb,
-		"EnumClipboardFormats // Find Not Empty Id=%04X hData=%04x !\n",
+
+    dprintf_clipboard(stddeb, "\t got not empty - Id=%04X hData=%04x !\n",
 				lpFormat->wFormatID, lpFormat->hData);
     return lpFormat->wFormatID;
 }
@@ -223,27 +376,41 @@
 {
     LPCLIPFORMAT lpNewFormat; 
     LPCLIPFORMAT lpFormat = ClipFormats; 
+
     if (FormatName == NULL) return 0;
+
+    dprintf_clipboard(stddeb,"RegisterClipboardFormat('%s') !\n", FormatName);
+
+    /* walk format chain to see if it's already registered */
+
     while(TRUE) {
-	if (lpFormat->NextFormat == NULL) break;
+	if ( !strcmp(lpFormat->Name,FormatName) )
+	   {
+	     lpFormat->wRefCount++;
+	     return lpFormat->wFormatID;
+	   }
+ 
+	if ( lpFormat->NextFormat == NULL ) break;
+
 	lpFormat = lpFormat->NextFormat;
 	}
-    lpNewFormat = (LPCLIPFORMAT)malloc(sizeof(CLIPFORMAT));
-    if (lpNewFormat == NULL) return 0;
+
+    /* allocate storage for new format entry */
+
+    lpNewFormat = (LPCLIPFORMAT)xmalloc(sizeof(CLIPFORMAT));
     lpFormat->NextFormat = lpNewFormat;
-    dprintf_clipboard(stddeb,"RegisterClipboardFormat('%s') !\n", FormatName);
     lpNewFormat->wFormatID = LastRegFormat;
     lpNewFormat->wRefCount = 1;
-    lpNewFormat->Name = (LPSTR)malloc(strlen(FormatName) + 1);
-    if (lpNewFormat->Name == NULL) {
-	free(lpNewFormat);
-    	return 0;
-    	}
+
+    lpNewFormat->Name = (LPSTR)xmalloc(strlen(FormatName) + 1);
     strcpy(lpNewFormat->Name, FormatName);
+
+    lpNewFormat->wDataPresent = 0;
     lpNewFormat->hData = 0;
     lpNewFormat->BufSize = 0;
     lpNewFormat->PrevFormat = lpFormat;
     lpNewFormat->NextFormat = NULL;
+
     return LastRegFormat++;
 }
 
@@ -254,21 +421,26 @@
 int GetClipboardFormatName(WORD wFormat, LPSTR retStr, short maxlen)
 {
     LPCLIPFORMAT lpFormat = ClipFormats; 
+
     dprintf_clipboard(stddeb,
 	"GetClipboardFormat(%04X, %p, %d) !\n", wFormat, retStr, maxlen);
+
     while(TRUE) {
 	if (lpFormat == NULL) return 0;
 	if (lpFormat->wFormatID == wFormat) break;
 	lpFormat = lpFormat->NextFormat;
 	}
-    if (lpFormat->Name == NULL) return 0;
+
+    if (lpFormat->Name == NULL || 
+	lpFormat->wFormatID < CF_REGFORMATBASE) return 0;
+
     dprintf_clipboard(stddeb,
 		"GetClipboardFormat // Name='%s' !\n", lpFormat->Name);
-    maxlen = MIN(maxlen - 1, strlen(lpFormat->Name));
-    dprintf_clipboard(stddeb,"GetClipboardFormat // maxlen=%d !\n", maxlen);
-    memcpy(retStr, lpFormat->Name, maxlen);
+
+    strncpy(retStr, lpFormat->Name, maxlen - 1);
     retStr[maxlen] = 0;
-    return maxlen;
+
+    return strlen(retStr);
 }
 
 
@@ -278,7 +450,9 @@
 HWND SetClipboardViewer(HWND hWnd)
 {
     HWND hwndPrev = hWndViewer;
-    dprintf_clipboard(stddeb,"SetClipboardViewer(%04x) !\n", hWnd);
+
+    dprintf_clipboard(stddeb,"SetClipboardViewer(%04x)\n", hWnd);
+
     hWndViewer = hWnd;
     return hwndPrev;
 }
@@ -289,7 +463,8 @@
  */
 HWND GetClipboardViewer()
 {
-    dprintf_clipboard(stddeb,"GetClipboardFormat() = %04x !\n", hWndViewer);
+    dprintf_clipboard(stddeb,"GetClipboardFormat() = %04x\n", hWndViewer);
+
     return hWndViewer;
 }
 
@@ -299,10 +474,18 @@
  */
 BOOL ChangeClipboardChain(HWND hWnd, HWND hWndNext)
 {
-    dprintf_clipboard(stdnimp,
-		"ChangeClipboardChain(%04x, %04x) !\n", hWnd, hWndNext);
+    BOOL bRet = 0;
 
-     return 0;
+    dprintf_clipboard(stdnimp, "ChangeClipboardChain(%04x, %04x)\n", hWnd, hWndNext);
+
+    if( hWndViewer )
+      bRet = !SendMessage16( hWndViewer, WM_CHANGECBCHAIN, (WPARAM)hWnd, (LPARAM)hWndNext);   
+    else
+      dprintf_clipboard(stddeb,"ChangeClipboardChain: hWndViewer is lost\n");
+
+    if( hWnd == hWndViewer ) hWndViewer = hWndNext;
+
+    return 0;
 }
 
 
@@ -311,16 +494,12 @@
  */
 BOOL IsClipboardFormatAvailable(WORD wFormat)
 {
-    LPCLIPFORMAT lpFormat = ClipFormats; 
     dprintf_clipboard(stddeb,"IsClipboardFormatAvailable(%04X) !\n", wFormat);
-    if(wFormat == CF_TEXT && !wineOwnsSelection) /* obtain selection as text if possible */
-	return GetClipboardData(CF_TEXT)!=0;
-    while(TRUE) {
-	if (lpFormat == NULL) return FALSE;
-	if (lpFormat->wFormatID == wFormat) break;
-	lpFormat = lpFormat->NextFormat;
-	}
-    return (lpFormat->hData != 0);
+
+    if(wFormat == CF_TEXT && !wineOwnsSelection)
+	CLIPBOARD_RequestXSelection();
+
+    return CLIPBOARD_IsPresent(wFormat);
 }
 
 
@@ -330,8 +509,8 @@
 HWND GetOpenClipboardWindow()
 {
     dprintf_clipboard(stddeb,
-		"GetOpenClipboardWindow() = %04x !\n", hWndClipboardOwner);
-    return hWndClipboardOwner;
+		"GetOpenClipboardWindow() = %04x\n", hWndClipWindow);
+    return hWndClipWindow;
 }
 
 
@@ -359,18 +538,24 @@
     LPCLIPFORMAT lpFormat = ClipFormats; 
     if(prop==None)
         hText=0;
-    else{
+    else
+      {
 	Atom atype=None;
 	int aformat;
 	unsigned long nitems,remain;
 	unsigned char *val=NULL;
+
         dprintf_clipboard(stddeb,"Received prop %s\n",XGetAtomName(display,prop));
+
         /* TODO: Properties longer than 64K */
+
 	if(XGetWindowProperty(display,w,prop,0,0x3FFF,True,XA_STRING,
 	    &atype, &aformat, &nitems, &remain, &val)!=Success)
-		printf("couldn't read property\n");
+		fprintf(stderr,"couldn't read property\n");
+
         dprintf_clipboard(stddeb,"Type %s,Format %d,nitems %ld,value %s\n",
 		XGetAtomName(display,atype),aformat,nitems,val);
+
 	if(atype!=XA_STRING || aformat!=8){
 	    fprintf(stderr,"Property not set\n");
 	    hText=0;
@@ -381,14 +566,20 @@
 	    GlobalUnlock16(hText);
 	}
 	XFree(val);
-    }
+      }
+
     while(TRUE) {
 	if (lpFormat == NULL) return;
 	if (lpFormat->wFormatID == CF_TEXT) break;
 	lpFormat = lpFormat->NextFormat;
 	}
-    if (lpFormat->hData != 0) GlobalFree16(lpFormat->hData);
+
+    if (lpFormat->wDataPresent) 
+       CLIPBOARD_DeleteRecord(lpFormat);
+
     wait_for_selection=False;
+
+    lpFormat->wDataPresent = TRUE;
     lpFormat->hData = hText;
     dprintf_clipboard(stddeb,"Received selection\n");
 }
diff --git a/misc/commdlg.c b/misc/commdlg.c
index 9dae2c0..95b18f9 100644
--- a/misc/commdlg.c
+++ b/misc/commdlg.c
@@ -84,7 +84,7 @@
     }
 
     hInst = WIN_GetWindowInstance( lpofn->hwndOwner );
-    bRet = DialogBoxIndirectParam( hInst, hDlgTmpl, lpofn->hwndOwner,
+    bRet = DialogBoxIndirectParam16( hInst, hDlgTmpl, lpofn->hwndOwner,
                                    MODULE_GetWndProcEntry16("FileOpenDlgProc"),
                                    (DWORD)lpofn );
 
@@ -126,7 +126,7 @@
     else hDlgTmpl = SYSRES_LoadResource( SYSRES_DIALOG_SAVE_FILE );
 
     hInst = WIN_GetWindowInstance( lpofn->hwndOwner );
-    bRet = DialogBoxIndirectParam( hInst, hDlgTmpl, lpofn->hwndOwner,
+    bRet = DialogBoxIndirectParam16( hInst, hDlgTmpl, lpofn->hwndOwner,
                                    MODULE_GetWndProcEntry16("FileSaveDlgProc"),
                                    (DWORD)lpofn); 
     if (!(lpofn->Flags & OFN_ENABLETEMPLATEHANDLE))
@@ -416,7 +416,7 @@
   notification = HIWORD(lParam);
 #endif
     
-  lpofn = (LPOPENFILENAME)GetWindowLong(hWnd, DWL_USER);
+  lpofn = (LPOPENFILENAME)GetWindowLong32A(hWnd, DWL_USER);
   switch (control)
     {
     case lst1: /* file list */
@@ -591,7 +591,7 @@
  */
 LRESULT FileOpenDlgProc(HWND hWnd, UINT wMsg, WPARAM wParam, LPARAM lParam)
 {  
- LPOPENFILENAME lpofn = (LPOPENFILENAME)GetWindowLong(hWnd, DWL_USER);
+ LPOPENFILENAME lpofn = (LPOPENFILENAME)GetWindowLong32A(hWnd, DWL_USER);
  
  if (wMsg!=WM_INITDIALOG)
   if (FILEDLG_HookCallChk(lpofn))
@@ -634,7 +634,7 @@
  */
 LRESULT FileSaveDlgProc(HWND hWnd, UINT wMsg, WPARAM wParam, LPARAM lParam)
 {
- LPOPENFILENAME lpofn = (LPOPENFILENAME)GetWindowLong(hWnd, DWL_USER);
+ LPOPENFILENAME lpofn = (LPOPENFILENAME)GetWindowLong32A(hWnd, DWL_USER);
  
  if (wMsg!=WM_INITDIALOG)
   if (FILEDLG_HookCallChk(lpofn))
@@ -677,31 +677,13 @@
 
 
 /***********************************************************************
- *           ChooseColor   (COMMDLG.5)
- */
-BOOL ChooseColor(LPCHOOSECOLOR lpChCol)
-{
-    HANDLE hInst, hDlgTmpl;
-    BOOL bRet;
-
-    hDlgTmpl = SYSRES_LoadResource( SYSRES_DIALOG_CHOOSE_COLOR );
-    hInst = WIN_GetWindowInstance( lpChCol->hwndOwner );
-    bRet = DialogBoxIndirectParam( hInst, hDlgTmpl, lpChCol->hwndOwner,
-                                   MODULE_GetWndProcEntry16("ColorDlgProc"), 
-                                   (DWORD)lpChCol );
-    SYSRES_FreeResource( hDlgTmpl );
-    return bRet;
-}
-
-
-/***********************************************************************
  *           FindTextDlg   (COMMDLG.11)
  */
 BOOL FindText(LPFINDREPLACE lpFind)
 {
     HANDLE hInst, hDlgTmpl;
     BOOL bRet;
-    SEGPTR ptr;
+    LPCVOID ptr;
 
     /*
      * FIXME : Should respond to FR_ENABLETEMPLATE and FR_ENABLEHOOK here
@@ -713,10 +695,10 @@
      */
     hDlgTmpl = SYSRES_LoadResource( SYSRES_DIALOG_FIND_TEXT );
     hInst = WIN_GetWindowInstance( lpFind->hwndOwner );
-    if (!(ptr = (SEGPTR)WIN16_GlobalLock16( hDlgTmpl ))) return -1;
-    bRet = CreateDialogIndirectParam( hInst, ptr, lpFind->hwndOwner,
-                                      MODULE_GetWndProcEntry16("FindTextDlgProc"),
-                                      (DWORD)lpFind );
+    if (!(ptr = GlobalLock16( hDlgTmpl ))) return -1;
+    bRet = CreateDialogIndirectParam16( hInst, ptr, lpFind->hwndOwner,
+                                        MODULE_GetWndProcEntry16("FindTextDlgProc"),
+                                        (DWORD)lpFind );
     GlobalUnlock16( hDlgTmpl );
     SYSRES_FreeResource( hDlgTmpl );
     return bRet;
@@ -730,7 +712,7 @@
 {
     HANDLE hInst, hDlgTmpl;
     BOOL bRet;
-    SEGPTR ptr;
+    LPCVOID ptr;
 
     /*
      * FIXME : Should respond to FR_ENABLETEMPLATE and FR_ENABLEHOOK here
@@ -742,10 +724,10 @@
      */
     hDlgTmpl = SYSRES_LoadResource( SYSRES_DIALOG_REPLACE_TEXT );
     hInst = WIN_GetWindowInstance( lpFind->hwndOwner );
-    if (!(ptr = (SEGPTR)WIN16_GlobalLock16( hDlgTmpl ))) return -1;
-    bRet = CreateDialogIndirectParam( hInst, ptr, lpFind->hwndOwner,
-                                      MODULE_GetWndProcEntry16("ReplaceTextDlgProc"),
-                                      (DWORD)lpFind );
+    if (!(ptr = GlobalLock16( hDlgTmpl ))) return -1;
+    bRet = CreateDialogIndirectParam16( hInst, ptr, lpFind->hwndOwner,
+                                        MODULE_GetWndProcEntry16("ReplaceTextDlgProc"),
+                                        (DWORD)lpFind );
     GlobalUnlock16( hDlgTmpl );
     SYSRES_FreeResource( hDlgTmpl );
     return bRet;
@@ -806,7 +788,7 @@
     int uFindReplaceMessage = RegisterWindowMessage32A( FINDMSGSTRING );
     int uHelpMessage = RegisterWindowMessage32A( HELPMSGSTRING );
 
-    lpfr = (LPFINDREPLACE)GetWindowLong(hWnd, DWL_USER);
+    lpfr = (LPFINDREPLACE)GetWindowLong32A(hWnd, DWL_USER);
     switch (wParam) {
 	case IDOK:
 	    GetDlgItemText16(hWnd, edt1, lpfr->lpstrFindWhat, lpfr->wFindWhatLen);
@@ -898,7 +880,7 @@
     int uFindReplaceMessage = RegisterWindowMessage32A( FINDMSGSTRING );
     int uHelpMessage = RegisterWindowMessage32A( HELPMSGSTRING );
 
-    lpfr = (LPFINDREPLACE)GetWindowLong(hWnd, DWL_USER);
+    lpfr = (LPFINDREPLACE)GetWindowLong32A(hWnd, DWL_USER);
     switch (wParam) {
 	case IDOK:
 	    GetDlgItemText16(hWnd, edt1, lpfr->lpstrFindWhat, lpfr->wFindWhatLen);
@@ -989,7 +971,7 @@
 	hDlgTmpl = SYSRES_LoadResource( SYSRES_DIALOG_PRINT );
 
     hInst = WIN_GetWindowInstance( lpPrint->hwndOwner );
-    bRet = DialogBoxIndirectParam( hInst, hDlgTmpl, lpPrint->hwndOwner,
+    bRet = DialogBoxIndirectParam16( hInst, hDlgTmpl, lpPrint->hwndOwner,
                                    (lpPrint->Flags & PD_PRINTSETUP) ?
                                      MODULE_GetWndProcEntry16("PrintSetupDlgProc") :
                                      MODULE_GetWndProcEntry16("PrintDlgProc"),
@@ -1095,7 +1077,48 @@
 }
 
 
-/* --------------------------- Choose Color Dialog ------------------------------ */
+/* ------------------------ Choose Color Dialog --------------------------- */
+
+/***********************************************************************
+ *           ChooseColor   (COMMDLG.5)
+ */
+BOOL ChooseColor(LPCHOOSECOLOR lpChCol)
+{
+    HINSTANCE hInst;
+    HANDLE hDlgTmpl, hResInfo;
+    BOOL bRet;
+
+    dprintf_commdlg(stddeb,"ChooseColor\n");
+    if (!lpChCol) return FALSE;    
+    if (lpChCol->Flags & CC_ENABLETEMPLATEHANDLE) hDlgTmpl = lpChCol->hInstance;
+    else if (lpChCol->Flags & CC_ENABLETEMPLATE)
+    {
+        if (!(hResInfo = FindResource( lpChCol->hInstance,
+                                       lpChCol->lpTemplateName, RT_DIALOG)))
+        {
+            CommDlgLastError = CDERR_FINDRESFAILURE;
+            return FALSE;
+        }
+        hDlgTmpl = LoadResource( lpChCol->hInstance, hResInfo );
+    }
+    else hDlgTmpl = SYSRES_LoadResource( SYSRES_DIALOG_CHOOSE_COLOR );
+    if (!hDlgTmpl)
+    {
+        CommDlgLastError = CDERR_LOADRESFAILURE;
+        return FALSE;
+    }
+    hInst = WIN_GetWindowInstance( lpChCol->hwndOwner );
+    bRet = DialogBoxIndirectParam16( hInst, hDlgTmpl, lpChCol->hwndOwner,
+                                     MODULE_GetWndProcEntry16("ColorDlgProc"), 
+                                     (DWORD)lpChCol );
+    if (!(lpChCol->Flags & CC_ENABLETEMPLATEHANDLE))
+    {
+        if (lpChCol->Flags & CC_ENABLETEMPLATE) FreeResource( hDlgTmpl );
+        else SYSRES_FreeResource( hDlgTmpl );
+    }
+    return bRet;
+}
+
 
 static const COLORREF predefcolors[6][8]=
 {
@@ -1456,7 +1479,7 @@
  int oben;
  RECT16 rect;
  HWND hwnd=GetDlgItem(hDlg,0x2be);
- struct CCPRIVATE *lpp=(struct CCPRIVATE *)GetWindowLong(hDlg, DWL_USER); 
+ struct CCPRIVATE *lpp=(struct CCPRIVATE *)GetWindowLong32A(hDlg, DWL_USER); 
 
  if (IsWindowVisible(GetDlgItem(hDlg,0x2c6)))   /* if full size */
  {
@@ -1496,7 +1519,7 @@
  HDC hDC;
  int w=GetDialogBaseUnits();
  HWND hwnd=GetDlgItem(hDlg,0x2c6);
- struct CCPRIVATE * lpp=(struct CCPRIVATE *)GetWindowLong(hDlg, DWL_USER); 
+ struct CCPRIVATE * lpp=(struct CCPRIVATE *)GetWindowLong32A(hDlg, DWL_USER); 
  RECT16 rect;
  POINT16 point;
  HPEN16 hPen;
@@ -1541,7 +1564,7 @@
 {
  int sdif,hdif,xdif,ydif,r,g,b,hue,sat;
  HWND hwnd=GetDlgItem(hDlg,0x2c6);
- struct CCPRIVATE * lpp=(struct CCPRIVATE *)GetWindowLong(hDlg, DWL_USER);  
+ struct CCPRIVATE * lpp=(struct CCPRIVATE *)GetWindowLong32A(hDlg, DWL_USER);  
  HBRUSH hbrush;
  HDC hdc ;
  RECT16 rect,client;
@@ -1584,7 +1607,7 @@
 static void CC_PaintColorGraph(HWND hDlg)
 {
  HWND hwnd=GetDlgItem(hDlg,0x2c6);
- struct CCPRIVATE * lpp=(struct CCPRIVATE *)GetWindowLong(hDlg, DWL_USER); 
+ struct CCPRIVATE * lpp=(struct CCPRIVATE *)GetWindowLong32A(hDlg, DWL_USER); 
  HDC  hDC;
  RECT16 rect;
  if (IsWindowVisible(hwnd))   /* if full size */
@@ -1643,7 +1666,7 @@
 static void CC_EditSetRGB(HWND hDlg,COLORREF cr)
 {
  char buffer[10];
- struct CCPRIVATE * lpp=(struct CCPRIVATE *)GetWindowLong(hDlg, DWL_USER); 
+ struct CCPRIVATE * lpp=(struct CCPRIVATE *)GetWindowLong32A(hDlg, DWL_USER); 
  int r=GetRValue(cr);
  int g=GetGValue(cr);
  int b=GetBValue(cr);
@@ -1666,7 +1689,7 @@
 static void CC_EditSetHSL(HWND hDlg,int h,int s,int l)
 {
  char buffer[10];
- struct CCPRIVATE * lpp=(struct CCPRIVATE *)GetWindowLong(hDlg, DWL_USER); 
+ struct CCPRIVATE * lpp=(struct CCPRIVATE *)GetWindowLong32A(hDlg, DWL_USER); 
  lpp->updating=TRUE;
  if (IsWindowVisible(GetDlgItem(hDlg,0x2c6)))   /* if full size */
  {
@@ -1688,7 +1711,7 @@
 static void CC_SwitchToFullSize(HWND hDlg,COLORREF result,LPRECT16 lprect)
 {
  int i;
- struct CCPRIVATE * lpp=(struct CCPRIVATE *)GetWindowLong(hDlg, DWL_USER); 
+ struct CCPRIVATE * lpp=(struct CCPRIVATE *)GetWindowLong32A(hDlg, DWL_USER); 
  
  EnableWindow(GetDlgItem(hDlg,0x2cf),FALSE);
  CC_PrepareColorGraph(hDlg);
@@ -1885,7 +1908,7 @@
     UINT cokmsg;
     HDC hdc;
     COLORREF *cr;
-    struct CCPRIVATE * lpp=(struct CCPRIVATE *)GetWindowLong(hDlg, DWL_USER); 
+    struct CCPRIVATE * lpp=(struct CCPRIVATE *)GetWindowLong32A(hDlg, DWL_USER); 
     dprintf_commdlg(stddeb,"CC_WMCommand wParam=%x lParam=%lx\n",wParam,lParam);
     switch (wParam)
     {
@@ -2008,7 +2031,7 @@
  */
 static LRESULT CC_WMPaint(HWND hDlg, WPARAM wParam, LPARAM lParam) 
 {
-    struct CCPRIVATE * lpp=(struct CCPRIVATE *)GetWindowLong(hDlg, DWL_USER); 
+    struct CCPRIVATE * lpp=(struct CCPRIVATE *)GetWindowLong32A(hDlg, DWL_USER); 
     /* we have to paint dialog children except text and buttons */
  
     CC_PaintPredefColorArray(hDlg,6,8);
@@ -2035,7 +2058,7 @@
  */
 static LRESULT CC_WMLButtonDown(HWND hDlg, WPARAM wParam, LPARAM lParam) 
 {
-   struct CCPRIVATE * lpp=(struct CCPRIVATE *)GetWindowLong(hDlg, DWL_USER); 
+   struct CCPRIVATE * lpp=(struct CCPRIVATE *)GetWindowLong32A(hDlg, DWL_USER); 
    int r,g,b,i;
    i=0;
    if (CC_MouseCheckPredefColorArray(hDlg,0x2d0,6,8,lParam,&lpp->lpcc->rgbResult))
@@ -2085,7 +2108,7 @@
 			 UINT wParam, LONG lParam)
 {
  int res;
- struct CCPRIVATE * lpp=(struct CCPRIVATE *)GetWindowLong(hDlg, DWL_USER); 
+ struct CCPRIVATE * lpp=(struct CCPRIVATE *)GetWindowLong32A(hDlg, DWL_USER); 
  if (message!=WM_INITDIALOG)
  {
   if (!lpp)
@@ -2142,15 +2165,38 @@
  */
 BOOL ChooseFont(LPCHOOSEFONT lpChFont)
 {
-    HANDLE hInst, hDlgTmpl;
+    HINSTANCE hInst;
+    HANDLE hDlgTmpl, hResInfo;
     BOOL bRet;
+
     dprintf_commdlg(stddeb,"ChooseFont\n");
-    hDlgTmpl = SYSRES_LoadResource( SYSRES_DIALOG_CHOOSE_FONT );
+    if (!lpChFont) return FALSE;    
+    if (lpChFont->Flags & CF_ENABLETEMPLATEHANDLE) hDlgTmpl = lpChFont->hInstance;
+    else if (lpChFont->Flags & CF_ENABLETEMPLATE)
+    {
+        if (!(hResInfo = FindResource( lpChFont->hInstance,
+                                       lpChFont->lpTemplateName, RT_DIALOG)))
+        {
+            CommDlgLastError = CDERR_FINDRESFAILURE;
+            return FALSE;
+        }
+        hDlgTmpl = LoadResource( lpChFont->hInstance, hResInfo );
+    }
+    else hDlgTmpl = SYSRES_LoadResource( SYSRES_DIALOG_CHOOSE_FONT );
+    if (!hDlgTmpl)
+    {
+        CommDlgLastError = CDERR_LOADRESFAILURE;
+        return FALSE;
+    }
     hInst = WIN_GetWindowInstance( lpChFont->hwndOwner );
-    bRet = DialogBoxIndirectParam( hInst, hDlgTmpl, lpChFont->hwndOwner,
+    bRet = DialogBoxIndirectParam16( hInst, hDlgTmpl, lpChFont->hwndOwner,
                                    MODULE_GetWndProcEntry16("FormatCharDlgProc"), 
                                    (DWORD)lpChFont );
-    SYSRES_FreeResource( hDlgTmpl );
+    if (!(lpChFont->Flags & CF_ENABLETEMPLATEHANDLE))
+    {
+        if (lpChFont->Flags & CF_ENABLETEMPLATE) FreeResource( hDlgTmpl );
+        else SYSRES_FreeResource( hDlgTmpl );
+    }
     return bRet;
 }
 
@@ -2188,7 +2234,7 @@
   WORD w;
   HWND hwnd=LOWORD(lParam);
   HWND hDlg=GetParent(hwnd);
-  LPCHOOSEFONT lpcf=(LPCHOOSEFONT)GetWindowLong(hDlg, DWL_USER); 
+  LPCHOOSEFONT lpcf=(LPCHOOSEFONT)GetWindowLong32A(hDlg, DWL_USER); 
 
   dprintf_commdlg(stddeb,"FontFamilyEnumProc: font=%s (nFontType=%d)\n",
      			lplf->lfFaceName,nFontType);
@@ -2294,7 +2340,7 @@
   HWND hcmb2=LOWORD(lParam);
   HWND hcmb3=HIWORD(lParam);
   HWND hDlg=GetParent(hcmb3);
-  LPCHOOSEFONT lpcf=(LPCHOOSEFONT)GetWindowLong(hDlg, DWL_USER); 
+  LPCHOOSEFONT lpcf=(LPCHOOSEFONT)GetWindowLong32A(hDlg, DWL_USER); 
   int i;
   
   dprintf_commdlg(stddeb,"FontStyleEnumProc: (nFontType=%d)\n",nFontType);
@@ -2544,7 +2590,7 @@
  */
 LRESULT CFn_WMCtlColor(HWND hDlg, WPARAM wParam, LPARAM lParam)
 {
-  LPCHOOSEFONT lpcf=(LPCHOOSEFONT)GetWindowLong(hDlg, DWL_USER); 
+  LPCHOOSEFONT lpcf=(LPCHOOSEFONT)GetWindowLong32A(hDlg, DWL_USER); 
 
   if (lpcf->Flags & CF_EFFECTS)
    if (HIWORD(lParam)==CTLCOLOR_STATIC && GetDlgCtrlID(LOWORD(lParam))==stc6)
@@ -2566,7 +2612,7 @@
   int i,j;
   long l;
   HDC hdc;
-  LPCHOOSEFONT lpcf=(LPCHOOSEFONT)GetWindowLong(hDlg, DWL_USER); 
+  LPCHOOSEFONT lpcf=(LPCHOOSEFONT)GetWindowLong32A(hDlg, DWL_USER); 
   LPLOGFONT lpxx=PTR_SEG_TO_LIN(lpcf->lpLogFont);
   
   dprintf_commdlg(stddeb,"FormatCharDlgProc // WM_COMMAND lParam=%08lX\n", lParam);
@@ -2642,6 +2688,7 @@
 		    lpxx->lfOutPrecision=OUT_DEFAULT_PRECIS;
 		    lpxx->lfClipPrecision=CLIP_DEFAULT_PRECIS;
 		    lpxx->lfQuality=DEFAULT_QUALITY;
+                    lpcf->iPointSize= -10*lpxx->lfHeight;
 
 		    hFont=CreateFontIndirect(lpxx);
 		    if (hFont)
@@ -2665,7 +2712,16 @@
 		    CallWindowProc16(lpcf->lpfnHook,hDlg,WM_COMMAND,psh15,(LPARAM)lpcf);
 		  break;
 
-	case IDOK:EndDialog(hDlg, TRUE);
+	case IDOK:if (  (!(lpcf->Flags & CF_LIMITSIZE))  ||
+                     ( (lpcf->Flags & CF_LIMITSIZE) && 
+                      (-lpxx->lfHeight >= lpcf->nSizeMin) && 
+                      (-lpxx->lfHeight <= lpcf->nSizeMax)))
+	             EndDialog(hDlg, TRUE);
+	          else
+	          {
+	           sprintf(buffer,"Select a font size among %d and %d points.",lpcf->nSizeMin,lpcf->nSizeMax);
+	           MessageBox(hDlg,buffer,NULL,MB_OK);
+	          } 
 		  return(TRUE);
 	case IDCANCEL:EndDialog(hDlg, FALSE);
 		  return(TRUE);
@@ -2682,7 +2738,7 @@
  */
 LRESULT FormatCharDlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
 {
-  LPCHOOSEFONT lpcf=(LPCHOOSEFONT)GetWindowLong(hDlg, DWL_USER);  
+  LPCHOOSEFONT lpcf=(LPCHOOSEFONT)GetWindowLong32A(hDlg, DWL_USER);  
   if (message!=WM_INITDIALOG)
   {
    int res=0;
diff --git a/misc/escape.c b/misc/escape.c
index f86def0..9336c84 100644
--- a/misc/escape.c
+++ b/misc/escape.c
@@ -13,6 +13,6 @@
 INT Escape(HDC hdc, INT nEscape, INT cbInput, 
 	   LPCSTR lpszInData, LPVOID lpvOutData)
 {
-    fprintf(stderr, "Escape(nEscape = %04x)\n", nEscape);
+/*     fprintf(stderr, "Escape(nEscape = %04x)\n", nEscape); */
     return 0;
 }
diff --git a/misc/registry.c b/misc/registry.c
index faaf190..9a71264 100644
--- a/misc/registry.c
+++ b/misc/registry.c
@@ -880,11 +880,10 @@
 
 	while (key) {
 		if (key->name == NULL) {
-			fprintf(stderr,"key with dkeaddr %lx not loaded, skipping hierarchy\n",
+			fprintf(stderr,"_w95_walk_tree:Please report: key with dkeaddr %lx not loaded, skipping hierarchy\n",
 				key->dkeaddr
 			);
-			key = key->next;
-			continue;
+			return;
 		}
 		lpxkey=_find_or_add_key(lpkey,strdupA2W(key->name));
 
@@ -963,7 +962,9 @@
 	for (i=0;i<n;i++)
 		if (nr2da[(i+off)%n].dkeaddr == dkeaddr)
 			return keys+nr2da[(i+off)%n].nr;
-	fprintf(stderr,"search didn't found dkeaddr %lx?\n",dkeaddr);
+	/* 0x3C happens often, just report unusual values */
+	if (dkeaddr!=0x3c)
+		dprintf_reg(stddeb,"search hasn't found dkeaddr %lx?\n",dkeaddr);
 	return NULL;
 }
 
@@ -1043,7 +1044,7 @@
 	where	= 0x40;
 	end	= rgdbsection;
 
-	nrofdkes = (end-where)/sizeof(struct dke);
+	nrofdkes = (end-where)/sizeof(struct dke)+100;
 	data = (char*)xmalloc(end-where);
 	if ((end-where)!=read(fd,data,end-where))
 		return;
@@ -1052,6 +1053,7 @@
 	keys = (struct _w95key*)xmalloc(nrofdkes * sizeof(struct _w95key));
 	memset(keys,'\0',nrofdkes*sizeof(struct _w95key));
 	nr2da= (struct _w95nr2da*)xmalloc(nrofdkes * sizeof(struct _w95nr2da));
+	memset(nr2da,'\0',nrofdkes*sizeof(struct _w95nr2da));
 
 	for (i=0;i<nrofdkes;i++) {
 		struct	dke	dke;
@@ -1080,7 +1082,9 @@
 				dkeaddr = dkeaddr & ~0xFFF;
 		}
 		if (nr>nrofdkes) {
-			dprintf_reg(stddeb,"nr %ld exceeds nrofdkes %d, skipping.\n",nr,nrofdkes);
+			/* 0xFFFFFFFF happens often, just report unusual values */
+			if (nr!=0xFFFFFFFF)
+				dprintf_reg(stddeb,"nr %ld exceeds nrofdkes %d, skipping.\n",nr,nrofdkes);
 			continue;
 		}
 		if (keys[nr].dkeaddr) {
@@ -1091,8 +1095,13 @@
 					break;
 			if (x==-1)
 				break; /* finished reading if we got only 0 */
-			if (nr)
-				dprintf_reg(stddeb,"key doubled? nr=%ld,key->dkeaddr=%lx,dkeaddr=%lx\n",nr,keys[nr].dkeaddr,dkeaddr);
+			if (nr) {
+				if (	(dke.next!=(long)keys[nr].next)	||
+					(dke.nextsub!=(long)keys[nr].nextsub)	||
+					(dke.prevlvl!=(long)keys[nr].prevlvl) 
+				)
+					dprintf_reg(stddeb,"key doubled? nr=%ld,key->dkeaddr=%lx,dkeaddr=%lx\n",nr,keys[nr].dkeaddr,dkeaddr);
+			}
 			continue;
 		}
 		nr2da[i].nr	 = nr;
@@ -1144,7 +1153,7 @@
 				nextrgdb = curdata+off_next_rgdb;
 				curdata+=0x20;
 			} else {
-				dprintf_reg(stddeb,"at end of RGDB section, but no next header. Breaking.\n");
+				dprintf_reg(stddeb,"at end of RGDB section, but no next header (%x of %lx). Breaking.\n",curdata-data,end-rgdbsection);
 				break;
 			}
 		}
@@ -1157,22 +1166,12 @@
 
 		XREAD(&dkh,sizeof(dkh));
 		nr = dkh.nrLS + (dkh.nrMS<<8);
-		if (nr>nrofdkes) {
+		if ((nr>nrofdkes) || (dkh.nrLS == 0xFFFF)) {
 			if (dkh.nrLS == 0xFFFF) {
-				curdata+= dkh.nextkeyoff - bytesread;
-				XREAD(magic,4);
-				if (strcmp(magic,"RGDB")) {
-					if ((curdata-data)<end)
-						dprintf_reg(stddeb,"while skipping to next RGDB block found magic %s\n",magic);
-					break;
-				}
-				curdata+=0x1c;
+				/* skip over key using nextkeyoff */
+ 				curdata+=dkh.nextkeyoff-sizeof(struct dkh);
 				continue;
 			}
-			if (dkh.nrLS == 0xFFFE) {
-				dprintf_reg(stddeb,"0xFFFE at %x\n",curdata-data);
-				break;
-			}
 			dprintf_reg(stddeb,"haven't found nr %ld.\n",nr);
 			key = &xkey;
 			memset(key,'\0',sizeof(xkey));
diff --git a/misc/shell.c b/misc/shell.c
index 4ee423e..6228161 100644
--- a/misc/shell.c
+++ b/misc/shell.c
@@ -361,7 +361,7 @@
     if (!hIcon) hIcon = LoadIcon(0,MAKEINTRESOURCE(OIC_WINEICON));
     handle = SYSRES_LoadResource( SYSRES_DIALOG_SHELL_ABOUT_MSGBOX );
     if (!handle) return FALSE;
-    bRet = DialogBoxIndirectParam( WIN_GetWindowInstance( hWnd ),
+    bRet = DialogBoxIndirectParam16( WIN_GetWindowInstance( hWnd ),
                                    handle, hWnd,
                                    MODULE_GetWndProcEntry16("AboutDlgProc"), 
 				   (LONG)hIcon );
diff --git a/misc/spy.c b/misc/spy.c
index 072f62e..f1cbabe 100644
--- a/misc/spy.c
+++ b/misc/spy.c
@@ -191,9 +191,16 @@
     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
 
     /* 0x0130 */
-    NULL, "wm_lbtrackpoint", 
-    NULL, NULL, NULL, NULL, NULL, NULL,
-    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+    NULL,
+    "wm_lbtrackpoint",          /* 0x0131 */
+    "WM_CTLCOLORMSGBOX",        /* 0x0132 */
+    "WM_CTLCOLOREDIT",          /* 0x0133 */
+    "WM_CTLCOLORLISTBOX",       /* 0x0134 */
+    "WM_CTLCOLORBTN",           /* 0x0135 */
+    "WM_CTLCOLORDLG",           /* 0x0136 */
+    "WM_CTLCOLORSCROLLBAR",     /* 0x0137 */
+    "WM_CTLCOLORSTATIC",        /* 0x0138 */
+    NULL, NULL, NULL, NULL, NULL, NULL, NULL,
 
     /* 0x0140 - Win32 Comboboxes */
     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
diff --git a/objects/bitblt.c b/objects/bitblt.c
index 2805a10..9db1ceb 100644
--- a/objects/bitblt.c
+++ b/objects/bitblt.c
@@ -35,6 +35,8 @@
 
 #define MAX_OP_LEN  6  /* Longest opcode + 1 for the terminating 0 */
 
+extern void CLIPPING_UpdateGCRegion(DC* );
+
 static const unsigned char BITBLT_Opcodes[256][MAX_OP_LEN] =
 {
     { OP(PAT,DST,GXclear) },                         /* 0x00  0              */
@@ -1031,6 +1033,9 @@
     useDst = (((rop >> 1) & 0x550000) != (rop & 0x550000));
     if (!dcSrc && useSrc) return FALSE;
 
+    if (dcDst->w.flags & DC_DIRTY) CLIPPING_UpdateGCRegion( dcDst );
+    if (dcSrc && (dcSrc->w.flags & DC_DIRTY)) CLIPPING_UpdateGCRegion( dcSrc );
+
       /* Map the coordinates to device coords */
 
     xDst      = dcDst->w.DCOrgX + XLPTODP( dcDst, xDst );
@@ -1270,7 +1275,7 @@
     dcSrc = (DC *) GDI_GetObjPtr( hdcSrc, DC_MAGIC );
 
     dprintf_bitblt(stddeb,
-                "BitBlt: %04x %d,%d %d bpp -> %04x %d,%d %dx%dx%d rop=%06lx\n",
+                "BitBlt: hdcSrc=%04x %d,%d %d bpp -> hdcDest=%04x %d,%d %dx%dx%d rop=%06lx\n",
                 hdcSrc, xSrc, ySrc, dcSrc ? dcSrc->w.bitsPerPixel : 0,
                 hdcDst, xDst, yDst, width, height, dcDst->w.bitsPerPixel, rop);
 
diff --git a/objects/bitmap.c b/objects/bitmap.c
index a028713..870667e 100644
--- a/objects/bitmap.c
+++ b/objects/bitmap.c
@@ -122,11 +122,17 @@
  */
 HBITMAP CreateCompatibleBitmap( HDC hdc, INT width, INT height )
 {
-    DC * dc;
-    dprintf_gdi(stddeb, "CreateCompatibleBitmap: %04x %dx%d\n", 
+    HBITMAP	hbmpRet = 0;
+    DC * 	dc;
+    dprintf_gdi(stddeb, "CreateCompatibleBitmap(%04x,%d,%d) = \n", 
 		hdc, width, height );
     if (!(dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC ))) return 0;
-    return CreateBitmap( width, height, 1, dc->w.bitsPerPixel, NULL );
+    
+    hbmpRet = CreateBitmap( width, height, 1, dc->w.bitsPerPixel, NULL );
+
+    dprintf_gdi(stddeb,"\t\t%04x\n", hbmpRet);
+
+    return hbmpRet;
 }
 
 
@@ -278,7 +284,7 @@
 /***********************************************************************
  *           BITMAP_SelectObject
  */
-HBITMAP BITMAP_SelectObject( HDC hdc, DC * dc, HBITMAP hbitmap,
+HBITMAP BITMAP_SelectObject( DC * dc, HBITMAP hbitmap,
 			     BITMAPOBJ * bmp )
 {
     HRGN hrgn;
@@ -300,7 +306,7 @@
 	XFreeGC( display, dc->u.x.gc );
 	dc->u.x.gc = XCreateGC( display, dc->u.x.drawable, 0, NULL );
 	dc->w.bitsPerPixel = bmp->bitmap.bmBitsPixel;
-        DC_InitDC( hdc );
+        DC_InitDC( dc );
     }
     else CLIPPING_UpdateGCRegion( dc );  /* Just update GC clip region */
     return prevHandle;
diff --git a/objects/brush.c b/objects/brush.c
index e5ee9b0..a1780ba 100644
--- a/objects/brush.c
+++ b/objects/brush.c
@@ -334,14 +334,14 @@
 /***********************************************************************
  *           BRUSH_SelectObject
  */
-HBRUSH BRUSH_SelectObject( HDC hdc, DC * dc, HBRUSH hbrush, BRUSHOBJ * brush )
+HBRUSH BRUSH_SelectObject( DC * dc, HBRUSH hbrush, BRUSHOBJ * brush )
 {
     HBITMAP hBitmap;
     BITMAPINFO * bmpInfo;
     HBRUSH prevHandle = dc->w.hBrush;
 
     dprintf_gdi(stddeb, "Brush_SelectObject: hdc=%04x hbrush=%04x\n",
-                hdc,hbrush);
+                dc->hSelf,hbrush);
     if (dc->header.wMagic == METAFILE_DC_MAGIC)
     {
 	switch (brush->logbrush.lbStyle)
@@ -400,7 +400,7 @@
 	if ((bmpInfo = (BITMAPINFO *) GlobalLock16( (HANDLE)brush->logbrush.lbHatch )))
 	{
 	    int size = DIB_BitmapInfoSize( bmpInfo, brush->logbrush.lbColor );
-	    hBitmap = CreateDIBitmap( hdc, &bmpInfo->bmiHeader, CBM_INIT,
+	    hBitmap = CreateDIBitmap( dc->hSelf, &bmpInfo->bmiHeader, CBM_INIT,
 				      ((char *)bmpInfo) + size, bmpInfo,
 				      (WORD) brush->logbrush.lbColor );
 	    BRUSH_SelectPatternBrush( dc, hBitmap );
diff --git a/objects/clipping.c b/objects/clipping.c
index 7064d03..3683d58 100644
--- a/objects/clipping.c
+++ b/objects/clipping.c
@@ -50,6 +50,13 @@
         fprintf( stderr, "UpdateGCRegion: hVisRgn is zero. Please report this.\n" );
         exit(1);
     }
+
+    if (dc->w.flags & DC_DIRTY)
+    {
+        UpdateDirtyDC(dc);
+        dc->w.flags &= ~DC_DIRTY;
+    }
+
     if (!dc->w.hClipRgn)
         CombineRgn( dc->w.hGCClipRgn, dc->w.hVisRgn, 0, RGN_COPY );
     else
@@ -80,6 +87,7 @@
 	dc->w.hClipRgn = 0;
 	retval = SIMPLEREGION; /* Clip region == whole DC */
     }
+
     CLIPPING_UpdateGCRegion( dc );
     return retval;
 }
@@ -96,6 +104,8 @@
 
     dprintf_clipping(stddeb, "SelectVisRgn: %04x %04x\n", hdc, hrgn );
 
+    dc->w.flags &= ~DC_DIRTY;
+
     retval = CombineRgn( dc->w.hVisRgn, hrgn, 0, RGN_COPY );
     CLIPPING_UpdateGCRegion( dc );
     return retval;
@@ -271,6 +281,7 @@
     if (!dc) return ERROR;    
     dprintf_clipping(stddeb, "ExcludeVisRect: %04x %dx%d,%dx%d\n",
 	    hdc, left, top, right, bottom );
+
     return CLIPPING_IntersectVisRect( dc, left, top, right, bottom, TRUE );
 }
 
@@ -285,6 +296,7 @@
     if (!dc) return ERROR;    
     dprintf_clipping(stddeb, "IntersectVisRect: %04x %dx%d,%dx%d\n",
 	    hdc, left, top, right, bottom );
+
     return CLIPPING_IntersectVisRect( dc, left, top, right, bottom, FALSE );
 }
 
@@ -299,6 +311,10 @@
 
     dprintf_clipping(stddeb, "PtVisible: %04x %d,%d\n", hdc, x, y );
     if (!dc->w.hGCClipRgn) return FALSE;
+
+    if( dc->w.flags & DC_DIRTY ) UpdateDirtyDC(dc);
+    dc->w.flags &= ~DC_DIRTY;
+
     return PtInRegion( dc->w.hGCClipRgn, XLPTODP(dc,x), YLPTODP(dc,y) );
 }
 
@@ -375,6 +391,9 @@
         fprintf( stderr, "SaveVisRgn: hVisRgn is zero. Please report this.\n" );
         exit(1);
     }
+    if( dc->w.flags & DC_DIRTY ) UpdateDirtyDC(dc);
+    dc->w.flags &= ~DC_DIRTY;
+
     if (!(obj = (RGNOBJ *) GDI_GetObjPtr( dc->w.hVisRgn, REGION_MAGIC )))
 	return 0;
     if (!(copy = CreateRectRgn( 0, 0, 0, 0 ))) return 0;
diff --git a/objects/dc.c b/objects/dc.c
index 8094756..6349560 100644
--- a/objects/dc.c
+++ b/objects/dc.c
@@ -14,11 +14,13 @@
 #include "color.h"
 #include "debug.h"
 #include "font.h"
+#include "callback.h"
 #include "xmalloc.h"
 
 static DeviceCaps * displayDevCaps = NULL;
 
 extern void CLIPPING_UpdateGCRegion( DC * dc );     /* objects/clipping.c */
+extern BOOL DCHook( HDC, WORD, DWORD, DWORD );      /* windows/dce.c */
 
   /* Default DC values */
 static const WIN_DC_INFO DC_defaultValues =
@@ -142,15 +144,14 @@
  *
  * Setup device-specific DC values for a newly created DC.
  */
-void DC_InitDC( HDC hdc )
+void DC_InitDC( DC* dc )
 {
-    DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC );
-    RealizeDefaultPalette( hdc );
-    SetTextColor( hdc, dc->w.textColor );
-    SetBkColor( hdc, dc->w.backgroundColor );
-    SelectObject( hdc, dc->w.hPen );
-    SelectObject( hdc, dc->w.hBrush );
-    SelectObject( hdc, dc->w.hFont );
+    RealizeDefaultPalette( dc->hSelf );
+    SetTextColor( dc->hSelf, dc->w.textColor );
+    SetBkColor( dc->hSelf, dc->w.backgroundColor );
+    SelectObject( dc->hSelf, dc->w.hPen );
+    SelectObject( dc->hSelf, dc->w.hBrush );
+    SelectObject( dc->hSelf, dc->w.hFont );
     XSetGraphicsExposures( display, dc->u.x.gc, False );
     XSetSubwindowMode( display, dc->u.x.gc, IncludeInferiors );
     CLIPPING_UpdateGCRegion( dc );
@@ -191,6 +192,8 @@
         val.background = COLOR_PixelToPalette[val.background];
     }
 
+    if (dc->w.flags & DC_DIRTY) CLIPPING_UpdateGCRegion(dc);
+
     val.function = DC_XROPfunction[dc->w.ROPmode-1];
     val.fill_style = dc->u.x.brush.fillStyle;
     switch(val.fill_style)
@@ -262,6 +265,8 @@
 
     if (dc->u.x.pen.style == PS_NULL) return FALSE;
 
+    if (dc->w.flags & DC_DIRTY) CLIPPING_UpdateGCRegion(dc); 
+
     if ((screenDepth <= 8) &&  /* FIXME: Should check for palette instead */
         ((dc->w.ROPmode == R2_BLACK) || (dc->w.ROPmode == R2_WHITE)))
     {
@@ -309,6 +314,9 @@
         fprintf( stderr, "DC_SetupGCForText: fstruct is NULL. Please report this\n" );
         return FALSE;
     }
+   
+    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;
@@ -322,6 +330,26 @@
 
 
 /***********************************************************************
+ *           DC_CallHookProc
+ */
+BOOL DC_CallHookProc(DC* dc, WORD code, LPARAM lParam)
+{
+  BOOL   bRet = 0;
+  FARPROC ptr = GDI_GetDefDCHook();
+
+  dprintf_dc(stddeb,"CallDCHook: code %04x\n", code);
+
+  /* if 16-bit callback is, in fact, a thunk to DCHook simply call DCHook */
+
+  if( dc->hookProc && !(dc->w.flags & (DC_SAVED | DC_MEMORY)) )
+    bRet = (dc->hookProc == ptr) ?
+          DCHook(dc->hSelf, code, dc->dwHookData, lParam):
+          CallDCHookProc(dc->hookProc, dc->hSelf, code, dc->dwHookData, lParam);
+
+  return bRet;
+}
+
+/***********************************************************************
  *           GetDCState    (GDI.179)
  */
 HDC GetDCState( HDC hdc )
@@ -338,6 +366,8 @@
     memset( &newdc->u.x, 0, sizeof(newdc->u.x) );
     memcpy( &newdc->w, &dc->w, sizeof(dc->w) );
     memcpy( &newdc->u.x.pen, &dc->u.x.pen, sizeof(dc->u.x.pen) );
+
+    newdc->hSelf = (HDC)handle;
     newdc->saveLevel = 0;
     newdc->w.flags |= DC_SAVED;
 
@@ -474,7 +504,11 @@
 	DC_FillDevCaps( displayDevCaps );
     }
 
+    dc->hSelf = (HDC)handle;
     dc->saveLevel = 0;
+    dc->dwHookData = 0L;
+    dc->hookProc = (SEGPTR)NULL;
+
     memcpy( &dc->w, &DC_defaultValues, sizeof(DC_defaultValues) );
     memset( &dc->u.x, 0, sizeof(dc->u.x) );
 
@@ -491,7 +525,7 @@
         return 0;
     }
 
-    DC_InitDC( handle );
+    DC_InitDC( dc );
 
     return handle;
 }
@@ -530,8 +564,12 @@
 	return 0;
     }
     bmp = (BITMAPOBJ *) GDI_GetObjPtr( hbitmap, BITMAP_MAGIC );
-    
+
+    dc->hSelf = (HDC)handle;    
     dc->saveLevel = 0;
+    dc->dwHookData = 0L; 
+    dc->hookProc = (SEGPTR)NULL;
+
     memcpy( &dc->w, &DC_defaultValues, sizeof(DC_defaultValues) );
     memset( &dc->u.x, 0, sizeof(dc->u.x) );
 
@@ -551,7 +589,7 @@
         return 0;
     }
 
-    DC_InitDC( handle );
+    DC_InitDC( dc );
 
     return handle;
 }
@@ -713,3 +751,60 @@
     dc->w.DCOrgY = y;
     return prevOrg;
 }
+
+
+/***********************************************************************
+ *           SetDCHook   (GDI.190)
+ */
+BOOL SetDCHook( HDC hDC, FARPROC16 hookProc, DWORD dwHookData )
+{
+    DC *dc = (DC *)GDI_GetObjPtr( hDC, DC_MAGIC );
+
+    dprintf_dc( stddeb, "SetDCHook: hookProc %08x, default is %08x\n",
+                (unsigned)hookProc,(unsigned)GDI_GetDefDCHook() );
+
+    if (!dc) return FALSE;
+    dc->hookProc = hookProc;
+    dc->dwHookData = dwHookData;
+    return TRUE;
+}
+
+
+/***********************************************************************
+ *           GetDCHook   (GDI.191)
+ */
+DWORD GetDCHook( HDC hDC, FARPROC16 *phookProc )
+{
+    DC *dc = (DC *)GDI_GetObjPtr( hDC, DC_MAGIC );
+    if (!dc) return 0;
+    *phookProc = dc->hookProc;
+    return dc->dwHookData;
+}
+
+
+/***********************************************************************
+ *           SetHookFlags       (GDI.192)
+ */
+WORD SetHookFlags(HDC hDC, WORD flags)
+{
+  DC* dc = (DC*)GDI_GetObjPtr( hDC, DC_MAGIC );
+
+  if( dc )
+    {
+        WORD wRet = dc->w.flags & DC_DIRTY;
+
+        /* "Undocumented Windows" info is slightly
+         *  confusing
+         */
+
+        dprintf_dc(stddeb,"SetHookFlags: hDC %04x, flags %04x\n",hDC,flags);
+
+        if( flags & DCHF_INVALIDATEVISRGN )
+            dc->w.flags |= DC_DIRTY;
+        else if( flags & DCHF_VALIDATEVISRGN || !flags )
+            dc->w.flags &= ~DC_DIRTY;
+        return wRet;
+    }
+  return 0;
+}
+
diff --git a/objects/dib.c b/objects/dib.c
index 26ef98e..becf185 100644
--- a/objects/dib.c
+++ b/objects/dib.c
@@ -18,6 +18,7 @@
 #include "debug.h"
 #include "xmalloc.h"
 
+extern void CLIPPING_UpdateGCRegion(DC* );
 
 /***********************************************************************
  *           DIB_GetImageWidthBytes
@@ -575,6 +576,8 @@
         if (!(colorMapping = DIB_BuildColorMap( dc, coloruse, depth, info )))
             return 0;
 
+    if( dc->w.flags & DC_DIRTY ) CLIPPING_UpdateGCRegion(dc);
+
       /* Transfer the pixels */
     XCREATEIMAGE(bmpImage, infoWidth, lines, depth );
 
diff --git a/objects/font.c b/objects/font.c
index ff7c0c6..8f3b4a1 100644
--- a/objects/font.c
+++ b/objects/font.c
@@ -785,7 +785,12 @@
  */
 BOOL GetCharABCWidths(HDC hdc, UINT wFirstChar, UINT wLastChar, LPABC lpABC)
 {
-    /* No TrueType fonts in Wine */
+
+    /* No TrueType fonts in Wine so far */
+
+    fprintf(stdnimp,"STUB: GetCharABCWidths(%04x,%04x,%04x,%08x)\n",
+			   hdc,wFirstChar,wLastChar,(unsigned)lpABC);
+  
     return FALSE;
 }
 
diff --git a/objects/gdiobj.c b/objects/gdiobj.c
index 6af4d94..81c1c16 100644
--- a/objects/gdiobj.c
+++ b/objects/gdiobj.c
@@ -12,6 +12,7 @@
 #include "brush.h"
 #include "font.h"
 #include "heap.h"
+#include "module.h"
 #include "palette.h"
 #include "pen.h"
 #include "region.h"
@@ -152,16 +153,23 @@
     (GDIOBJHDR *) &SystemFixedFont
 };
 
+static FARPROC16 defDCHookCallback;
+
 
 /***********************************************************************
  *           GDI_Init
  *
- * GDI initialisation.
+ * GDI initialization.
  */
 BOOL GDI_Init(void)
 {
     HPALETTE16 hpalette;
 
+    defDCHookCallback = (FARPROC16)MODULE_GetEntryPoint(GetModuleHandle("USER"),
+                                                        362  /* DCHook */ );
+    dprintf_gdi( stddeb, "DCHook: 16-bit callback is %08x\n",
+                 (unsigned)defDCHookCallback );
+
       /* Create default palette */
 
     if (!(hpalette = COLOR_Init())) return FALSE;
@@ -171,11 +179,11 @@
 
     if (!BITMAP_Init()) return FALSE;
 
-      /* Initialise brush dithering */
+      /* Initialize brush dithering */
 
     if (!BRUSH_Init()) return FALSE;
 
-      /* Initialise fonts */
+      /* Initialize fonts */
 
     if (!FONT_Init()) return FALSE;
 
@@ -184,6 +192,15 @@
 
 
 /***********************************************************************
+ *           GDI_GetDefDCHook
+ */
+FARPROC16 GDI_GetDefDCHook(void)
+{
+    return defDCHookCallback;
+}
+
+
+/***********************************************************************
  *           GDI_AllocObject
  */
 HANDLE GDI_AllocObject( WORD size, WORD magic )
@@ -321,7 +338,7 @@
     GDIOBJHDR * ptr = NULL;
     DC * dc;
     
-    dprintf_gdi(stddeb, "SelectObject: %04x %04x\n", hdc, handle );
+    dprintf_gdi(stddeb, "SelectObject: hdc=%04x %04x\n", hdc, handle );
     if ((handle >= FIRST_STOCK_HANDLE) && (handle <= LAST_STOCK_HANDLE))
       ptr = StockObjects[handle - FIRST_STOCK_HANDLE];
     else 
@@ -340,9 +357,9 @@
       case PEN_MAGIC:
 	  return PEN_SelectObject( dc, handle, (PENOBJ *)ptr );
       case BRUSH_MAGIC:
-	  return BRUSH_SelectObject( hdc, dc, handle, (BRUSHOBJ *)ptr );
+	  return BRUSH_SelectObject( dc, handle, (BRUSHOBJ *)ptr );
       case BITMAP_MAGIC:
-	  return BITMAP_SelectObject( hdc, dc, handle, (BITMAPOBJ *)ptr );
+	  return BITMAP_SelectObject( dc, handle, (BITMAPOBJ *)ptr );
       case FONT_MAGIC:
 	  return FONT_SelectObject( dc, handle, (FONTOBJ *)ptr );	  
       case REGION_MAGIC:
diff --git a/objects/text.c b/objects/text.c
index 10ef8b4..1d5a5e1 100644
--- a/objects/text.c
+++ b/objects/text.c
@@ -338,9 +338,9 @@
     if (!DC_SetupGCForText( dc )) return TRUE;
     font = dc->u.x.font.fstruct;
 
-    dprintf_text(stddeb,"ExtTextOut: %d,%d '%*.*s', %d  flags=%d\n",
-            x, y, count, count, str, count, flags);
-    if (lprect != NULL) dprintf_text(stddeb, "rect %d %d %d %d\n",
+    dprintf_text(stddeb,"ExtTextOut: hdc=%04x %d,%d '%*.*s', %d  flags=%d\n",
+            hdc, x, y, count, count, str, count, flags);
+    if (lprect != NULL) dprintf_text(stddeb, "\trect=(%d,%d- %d,%d)\n",
                                      lprect->left, lprect->top,
                                      lprect->right, lprect->bottom );
 
@@ -363,6 +363,9 @@
         if (rect.bottom < rect.top) SWAP_INT( rect.top, rect.bottom );
     }
 
+    dprintf_text(stddeb,"\treal coord: x=%i, y=%i, rect=(%d,%d-%d,%d)\n",
+			  x, y, rect.left, rect.top, rect.right, rect.bottom);
+
       /* Draw the rectangle */
 
     if (flags & ETO_OPAQUE)
@@ -394,6 +397,7 @@
 	  x -= info.width / 2;
 	  break;
     }
+
     switch( dc->w.textAlign & (TA_TOP | TA_BOTTOM | TA_BASELINE) )
     {
       case TA_TOP:
diff --git a/programs/progman/ChangeLog b/programs/progman/ChangeLog
index 12efc7a..9345fd7 100644
--- a/programs/progman/ChangeLog
+++ b/programs/progman/ChangeLog
@@ -1,3 +1,7 @@
+Sun Jun  2 13:14:55 1996  Ulrich Schmid  <uschmid@mail.hh.provi.de>
+
+	* Program icons: repaint on WM_NCPAINT or WM_PAINTICON
+
 Sun Apr 14 20:09:19 1996  Pablo Saratxaga <srtxg@linux.chanae.stben.be>
 
 	* [Fr.rc] (new)
diff --git a/programs/progman/program.c b/programs/progman/program.c
index b2ecdfb..84d4fff 100644
--- a/programs/progman/program.c
+++ b/programs/progman/program.c
@@ -32,7 +32,8 @@
 	return(0);
       }
 
-    case WM_PAINT:
+    case WM_PAINTICON:
+    case WM_NCPAINT:
       {
 	PROGRAM *program;
 	PAINTSTRUCT      ps;
@@ -205,6 +206,7 @@
   SetWindowLong(program->hWnd, 0, (LONG) hProgram);
 
   ShowWindow (program->hWnd, SW_SHOWMINIMIZED);
+  SetWindowPos (program->hWnd, 0, x, y, 0, 0, SWP_NOZORDER | SWP_NOACTIVATE | SWP_NOSIZE);
   UpdateWindow (program->hWnd);
 
   return hProgram;
diff --git a/resources/TODO b/resources/TODO
index 1263235..b46b36f 100644
--- a/resources/TODO
+++ b/resources/TODO
@@ -63,6 +63,7 @@
 * English
 * German
 * Finnish
+* Italian
 .....
 
 Thank you.
diff --git a/resources/sysres_It.rc b/resources/sysres_It.rc
index 35a5626..82a9bb9 100644
--- a/resources/sysres_It.rc
+++ b/resources/sysres_It.rc
@@ -38,7 +38,6 @@
  ICON "", 1088, 195, 10, 18, 20
 }
 
-
 OPEN_FILE DIALOG LOADONCALL MOVEABLE DISCARDABLE 36, 24, 275, 134
 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
 CAPTION "Apri"
@@ -131,16 +130,32 @@
  COMBOBOX 1138, 168, 110, 92, 68, CBS_DROPDOWNLIST | CBS_OWNERDRAWFIXED | CBS_AUTOHSCROLL | CBS_SORT | CBS_HASSTRINGS | WS_BORDER | WS_VSCROLL | WS_TABSTOP
 }
 
-
-CHOOSE_FONT DIALOG LOADONCALL MOVEABLE DISCARDABLE 36, 24, 264, 134
+CHOOSE_FONT DIALOG DISCARDABLE  13, 54, 264, 147
 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
 CAPTION "Font"
 FONT 8, "Helv"
 {
- LTEXT "Font:", 1088, 6, 6, 40, 9
- LTEXT "", 1089, 60, 6, 150, 9
- DEFPUSHBUTTON "Ok", 1, 206, 6, 56, 14, BS_DEFPUSHBUTTON | WS_GROUP | WS_TABSTOP
- PUSHBUTTON "Annulla", 2, 206, 24, 56, 14, WS_GROUP | WS_TABSTOP
+    LTEXT           "&Font:",1088 ,6,3,40,9
+    COMBOBOX        1136 ,6,13,94,54,  CBS_OWNERDRAWFIXED | CBS_HASSTRINGS | CBS_DISABLENOSCROLL |
+                    CBS_AUTOHSCROLL | CBS_SORT | WS_VSCROLL | WS_TABSTOP | CBS_SIMPLE
+    LTEXT           "St&ile:",1089 ,108,3,44,9
+    COMBOBOX        1137,108,13,64,54, CBS_OWNERDRAWFIXED | CBS_HASSTRINGS | CBS_DISABLENOSCROLL |
+                    WS_VSCROLL | WS_TABSTOP | CBS_SIMPLE
+    LTEXT           "&Dimensione:",1090,179,3,30,9
+    COMBOBOX        1138,179,13,32,54, CBS_OWNERDRAWFIXED | CBS_HASSTRINGS | CBS_DISABLENOSCROLL |
+                    WS_VSCROLL | WS_TABSTOP | CBS_SIMPLE | CBS_SORT
+    DEFPUSHBUTTON   "OK",IDOK,218,6,40,14,WS_GROUP
+    PUSHBUTTON      "Annulla",IDCANCEL,218,23,40,14,WS_GROUP
+    PUSHBUTTON      "A&pplica", 1026,218,40,40,14,WS_GROUP
+    PUSHBUTTON      "&Aiuto" , 1038,218,57,40,14,WS_GROUP
+    GROUPBOX        "Effetti",1072,6,72,84,34,WS_GROUP
+    CHECKBOX	    "&Barrato", 1040, 10,82,50,10, BS_AUTOCHECKBOX | WS_TABSTOP
+    CHECKBOX 	    "&Sottolineato", 1041, 10,94,50,10, BS_AUTOCHECKBOX 
+    LTEXT           "&Colore:", 1091 ,6,110,30,9
+    COMBOBOX        1139,6,120,84,100,CBS_DROPDOWNLIST | CBS_OWNERDRAWFIXED | CBS_HASSTRINGS |
+		    CBS_AUTOHSCROLL |  WS_BORDER | WS_VSCROLL | WS_TABSTOP
+    GROUPBOX        "Esempio",1073,98,72,160,49,WS_GROUP
+    CTEXT           "AaBbYyZz",1093,104,81,149,37,SS_NOPREFIX | WS_VISIBLE
 }
 
 CHOOSE_COLOR DIALOG LOADONCALL MOVEABLE DISCARDABLE 36, 24, 300, 200
diff --git a/tools/build.c b/tools/build.c
index 62944d5..b64c9af 100644
--- a/tools/build.c
+++ b/tools/build.c
@@ -1016,21 +1016,18 @@
             break;
 
           case TYPE_BYTE:
-            printf( "/* %s.%d */\n", DLLName, i);
             odp->offset = data_offset;
-            data_offset += StoreVariableCode( data, 1, odp);
+            data_offset += StoreVariableCode( data + data_offset, 1, odp);
             break;
 
           case TYPE_WORD:
-            printf( "/* %s.%d */\n", DLLName, i);
             odp->offset = data_offset;
-            data_offset += StoreVariableCode( data, 2, odp);
+            data_offset += StoreVariableCode( data + data_offset, 2, odp);
             break;
 
           case TYPE_LONG:
-            printf( "/* %s.%d */\n", DLLName, i);
             odp->offset = data_offset;
-            data_offset += StoreVariableCode( data, 4, odp);
+            data_offset += StoreVariableCode( data + data_offset, 4, odp);
             break;
 
           case TYPE_RETURN:
diff --git a/win32/Makefile.in b/win32/Makefile.in
index 72d1277..1b36259 100644
--- a/win32/Makefile.in
+++ b/win32/Makefile.in
@@ -21,8 +21,7 @@
 	struct32.c \
 	thread.c \
 	time.c \
-	user32.c \
-	winprocs.c
+	user32.c
 
 all: $(MODULE).o
 
diff --git a/win32/environment.c b/win32/environment.c
index 57e6b00..54267c1 100644
--- a/win32/environment.c
+++ b/win32/environment.c
@@ -37,3 +37,33 @@
     return buffer;
 }
 
+
+/***********************************************************************
+ *           GetSystemPowerStatus      (KERNEL32.621)
+ */
+BOOL GetSystemPowerStatus(LPSYSTEM_POWER_STATUS sps_ptr)
+{
+    return FALSE;   /* no power management support */
+}
+
+
+/***********************************************************************
+ *           SetSystemPowerState      (KERNEL32.630)
+ */
+BOOL SetSystemPowerState(BOOL suspend_or_hibernate, BOOL force_flag)
+{
+    /* suspend_or_hibernate flag: w95 does not support
+       this feature anyway */
+
+    for ( ;0; )
+    {
+        if ( force_flag )
+        {
+        }
+        else
+        {
+        }
+    }
+    return TRUE;
+}
+
diff --git a/win32/time.c b/win32/time.c
index 610d4a6..5d649a0 100644
--- a/win32/time.c
+++ b/win32/time.c
@@ -60,6 +60,43 @@
     systime->wMilliseconds = (tv.tv_usec / 1000) % 1000;
 }
 
+
+/***********************************************************************
+ *              SetSystemTime            (KERNEL32.507)
+ */
+BOOL SetSystemTime(const SYSTEMTIME *systime)
+{
+    struct timeval tv;
+    struct timezone tz;
+    struct tm t;
+    time_t sec;
+
+    /* call gettimeofday to get the current timezone */
+    gettimeofday(&tv, &tz);
+
+    /* get the number of seconds */
+    t.tm_sec = systime->wSecond;
+    t.tm_min = systime->wMinute;
+    t.tm_hour = systime->wHour;
+    t.tm_mday = systime->wDay;
+    t.tm_mon = systime->wMonth;
+    t.tm_year = systime->wYear;
+    sec = mktime (&t);
+
+    /* set the new time */
+    tv.tv_sec = sec;
+    tv.tv_usec = systime->wMilliseconds * 1000;
+    if (settimeofday(&tv, &tz))
+    {
+        return FALSE;
+    }
+    else
+    {
+        return TRUE;
+    }
+}
+
+
 /***********************************************************************
  *              GetTimeZoneInformation  (KERNEL32.302)
  */
@@ -78,6 +115,27 @@
     return TIME_ZONE_ID_UNKNOWN;
 }
 
+
+/***********************************************************************
+ *              SetTimeZoneInformation  (KERNEL32.515)
+ */
+BOOL SetTimeZoneInformation(const TIME_ZONE_INFORMATION *tzinfo)
+{
+    struct timezone tz;
+
+    tz.tz_minuteswest = tzinfo->Bias;
+    tz.tz_dsttime = DST_NONE;
+    if (settimeofday(NULL, &tz))
+    {
+        return FALSE;
+    }
+    else
+    {
+        return TRUE;
+    }
+}
+
+
 /***********************************************************************
  *              Sleep  (KERNEL32.523)
  */
diff --git a/win32/user32.c b/win32/user32.c
index 7572b7e..290e1cc 100644
--- a/win32/user32.c
+++ b/win32/user32.c
@@ -18,7 +18,6 @@
 #include "struct32.h"
 #include "resource32.h"
 #include "string32.h"
-#include "dialog.h"
 #include "win.h"
 #include "winproc.h"
 #include "debug.h"
@@ -68,275 +67,6 @@
     return SetTimer( hwnd, id, timeout, MAKE_SEGPTR(proc));
 }   
 
-/* WARNING: It has not been verified that the signature or semantics
-   of the corresponding NT function is the same */
-
-HWND USER32_CreateDialogIndirectParamAorW(HINSTANCE hInst,LPVOID templ,
-	HWND hWndParent,DLGPROC lpDialogFunc,LPARAM dwInitParam,int A)
-{
-	DLGTEMPLATE32 *dlgTempl=templ;
-	DLGITEMTEMPLATE32 *dlgitem;
-	WORD *ptr;
-	DWORD MenuName=0;
-	DWORD ClassName=0;
-	DWORD szFontName=0;
-	WORD wPointSize;
-	HFONT hFont=0;
-	HMENU hMenu=0;
-	DWORD exStyle;
-	DWORD szCaption;
-	RECT16 rect;
-	DIALOGINFO *dlgInfo;
-	WND *wndPtr;
-	WORD xUnit = xBaseUnit;
-	WORD yUnit = yBaseUnit;
-	int i;
-	DWORD ClassId;
-	DWORD Text;
-	HWND hwnd,hwndCtrl;
-	HWND hwndDefButton=0;
-	WCHAR buffer[200];
-
-	/* parse the dialog template header*/
-	exStyle = dlgTempl->dwExtendedStyle;
-	ptr = (WORD*)(dlgTempl+1);
-	switch(*ptr){
-		case 0: MenuName=0;ptr++;break;
-		case 0xFFFF: MenuName=*(ptr+1);ptr+=2;break;
-		default: MenuName = (DWORD)ptr;
-			ptr += STRING32_lstrlenW(ptr)+1;
-	}
-	switch(*ptr){ 
-		case 0: ClassName = DIALOG_CLASS_ATOM;ptr++;break;
-		case 0xFFFF: ClassName = *(ptr+1);ptr+=2;break;
-		default: ClassName = (DWORD)ptr;
-				ptr += STRING32_lstrlenW(ptr)+1;
-	}
-	szCaption=(DWORD)ptr;
-	ptr+=STRING32_lstrlenW(ptr)+1;
-	if(dlgTempl->style & DS_SETFONT)
-	{
-		wPointSize = *ptr;
-		ptr++;
-		szFontName = (DWORD)ptr;
-		ptr+=STRING32_lstrlenW(ptr)+1;
-	}
-	
-	if(MenuName) hMenu=WIN32_LoadMenuW(hInst,(LPWSTR)MenuName);
-	if(dlgTempl->style & DS_SETFONT)
-	{
-		fprintf(stderr,"Win32: dialog fonts not supported yet\n");
-	}
-	
-	/* Create dialog main window */
-	rect.left = rect.top = 0;
-	rect.right = dlgTempl->cx * xUnit / 4;
-	rect.bottom = dlgTempl->cy * yUnit / 8;
-
-	/* FIXME: proper modalframe handling ??*/
-	if (dlgTempl->style & DS_MODALFRAME) exStyle |= WS_EX_DLGMODALFRAME;
-
-        AdjustWindowRectEx16( &rect, dlgTempl->style,
-                              hMenu ? TRUE : FALSE , exStyle );
-	rect.right -= rect.left;
-	rect.bottom -= rect.top;
-
-	if(dlgTempl->x == CW_USEDEFAULT16)
-		rect.left = rect.top = CW_USEDEFAULT16;
-	else{
-		rect.left += dlgTempl->x * xUnit / 4;
-		rect.top += dlgTempl->y * yUnit / 8;
-		if (!(dlgTempl->style & DS_ABSALIGN))
-			ClientToScreen16(hWndParent, (POINT16 *)&rect );
-	}
-
-	/* FIXME: Here is the place to consider A */
-	hwnd = CreateWindowEx32W(exStyle, (LPWSTR)ClassName, (LPWSTR)szCaption,
-		dlgTempl->style & ~WS_VISIBLE, 
-		rect.left, rect.top, rect.right, rect.bottom,
-		hWndParent, hMenu, hInst, 0);
-
-	if(!hwnd)
-	{
-		if(hFont)DeleteObject(hFont);
-		if(hMenu)DeleteObject(hMenu);
-		return 0;
-	}
-
-	wndPtr = WIN_FindWndPtr(hwnd);
-
-	/* FIXME: should purge junk from system menu, but windows/dialog.c
-	   says this does not belong here */
-
-	/* Create control windows */
-	dprintf_dialog(stddeb, " BEGIN\n" );
-	dlgInfo = (DIALOGINFO *)wndPtr->wExtra;
-	dlgInfo->msgResult = 0;	/* This is used to store the default button id */
-	dlgInfo->hDialogHeap = 0;
-
-	for (i = 0; i < dlgTempl->noOfItems; i++)
-	{
-		if((int)ptr&3)
-			ptr++;
-		dlgitem = (DLGITEMTEMPLATE32*)ptr;
-		ptr = (WORD*)(dlgitem+1);
-		if(*ptr == 0xFFFF) {
-			/* FIXME: ignore HIBYTE? */
-			ClassId = *(ptr+1);
-			ptr+=2;
-		}else{
-			ClassId = (DWORD)ptr;
-			ptr += STRING32_lstrlenW(ptr)+1;
-		}
-		if(*ptr == 0xFFFF) {
-			Text = *(ptr+1);
-			ptr+=2;
-		}else{
-			Text = (DWORD)ptr;
-			ptr += STRING32_lstrlenW(ptr)+1;
-		}
-		if(!HIWORD(ClassId))
-		{
-			switch(LOWORD(ClassId))
-			{
-				case 0x80: STRING32_AnsiToUni(buffer,"BUTTON" ); break;
-				case 0x81: STRING32_AnsiToUni( buffer, "EDIT" ); break;
-				case 0x82: STRING32_AnsiToUni( buffer, "STATIC" ); break;
-				case 0x83: STRING32_AnsiToUni( buffer, "LISTBOX" ); break;
-				case 0x84: STRING32_AnsiToUni( buffer, "SCROLLBAR" ); break;
-				case 0x85: STRING32_AnsiToUni( buffer, "COMBOBOX" ); break;
-				default:   buffer[0] = '\0'; break;
-			}
-			ClassId = (DWORD)buffer;
-		}
-		/*FIXME: debugging output*/
-		/*FIXME: local edit ?*/
-		exStyle = dlgitem->dwExtendedStyle|WS_EX_NOPARENTNOTIFY;
-		if(*ptr)
-		{
-			fprintf(stderr,"having data\n");
-		}
-		ptr++;
-		hwndCtrl = CreateWindowEx32W(WS_EX_NOPARENTNOTIFY,
-			(LPWSTR)ClassId, (LPWSTR)Text,
-			dlgitem->style | WS_CHILD,
-			dlgitem->x * xUnit / 4,
-			dlgitem->y * yUnit / 8,
-			dlgitem->cx * xUnit / 4,
-			dlgitem->cy * yUnit / 8,
-			hwnd, (HMENU)((DWORD)dlgitem->id),
-			hInst, (SEGPTR)0 );
-		SetWindowPos( hwndCtrl, HWND_BOTTOM, 0, 0, 0, 0,
-			SWP_NOSIZE | SWP_NOMOVE | SWP_NOACTIVATE );
-		/* Send initialisation messages to the control */
-		if (hFont) SendMessage32A( hwndCtrl, WM_SETFONT, (WPARAM)hFont, 0 );
-		if (SendMessage32A( hwndCtrl, WM_GETDLGCODE, 0, 0 ) & DLGC_DEFPUSHBUTTON)
-		{
-			/* If there's already a default push-button, set it back */
-			/* to normal and use this one instead. */
-			if (hwndDefButton)
-				SendMessage32A( hwndDefButton, BM_SETSTYLE32, BS_PUSHBUTTON, FALSE);
-			hwndDefButton = hwndCtrl;
-			dlgInfo->msgResult = GetWindowWord( hwndCtrl, GWW_ID );
-		}
-	}
-	dprintf_dialog(stddeb, " END\n" );
-
-	 /* Initialise dialog extra data */
-	dlgInfo->dlgProc   = WINPROC_AllocWinProc(lpDialogFunc,WIN_PROC_32A);
-	dlgInfo->hUserFont = hFont;
-	dlgInfo->hMenu     = hMenu;
-	dlgInfo->xBaseUnit = xUnit;
-	dlgInfo->yBaseUnit = yUnit;
-	dlgInfo->hwndFocus = DIALOG_GetFirstTabItem( hwnd );
-
-	/* Send initialisation messages and set focus */
-	if (dlgInfo->hUserFont)
-		SendMessage32A( hwnd, WM_SETFONT, (WPARAM)dlgInfo->hUserFont, 0 );
-	if (SendMessage32A( hwnd, WM_INITDIALOG, (WPARAM)dlgInfo->hwndFocus, dwInitParam ))
-		SetFocus( dlgInfo->hwndFocus );
-	if (dlgTempl->style & WS_VISIBLE) ShowWindow(hwnd, SW_SHOW);
-		return hwnd;
-}
-
-HWND USER32_CreateDialogIndirectParamW(HINSTANCE hInst,LPVOID dlgTempl,
-	HWND hWndParent,DLGPROC lpDialogFunc,LPARAM dwInitParam)
-{
-	return USER32_CreateDialogIndirectParamAorW(hInst,dlgTempl,hWndParent,
-		lpDialogFunc,dwInitParam,0);
-}
-
-HWND USER32_CreateDialogIndirectParamA(HINSTANCE hInst,LPVOID dlgTempl,
-	HWND hWndParent,DLGPROC lpDialogFunc,LPARAM dwInitParam)
-{
-	return USER32_CreateDialogIndirectParamAorW(hInst,dlgTempl,hWndParent,
-		lpDialogFunc,dwInitParam,1);
-}
-
-HWND USER32_CreateDialogParamW(HINSTANCE hInst,LPCWSTR lpszName,
-	HWND hWndParent,DLGPROC lpDialogFunc,LPARAM dwInitParam)
-{
-	HANDLE32 hrsrc;
-	hrsrc=FindResource32(hInst,lpszName,(LPWSTR)RT_DIALOG);
-	if(!hrsrc)return 0;
-	return USER32_CreateDialogIndirectParamW(hInst,
-		LoadResource32(hInst, hrsrc),hWndParent,lpDialogFunc,dwInitParam);
-}
-
-HWND USER32_CreateDialogParamA(HINSTANCE hInst,LPCSTR lpszName,
-	HWND hWndParent,DLGPROC lpDialogFunc,LPARAM dwInitParam)
-{
-	HWND res;
-	if(!HIWORD(lpszName))
-		res = USER32_CreateDialogParamW(hInst,(LPCWSTR)lpszName,hWndParent,
-				lpDialogFunc,dwInitParam);
-	else{
-		LPWSTR uni=STRING32_DupAnsiToUni(lpszName);
-		res=USER32_CreateDialogParamW(hInst,uni,hWndParent,
-			lpDialogFunc,dwInitParam);
-	}
-	return res;
-}
-
-int USER32_DialogBoxIndirectParamW(HINSTANCE hInstance,LPVOID dlgTempl,
-	HWND hWndParent,DLGPROC lpDialogFunc,LPARAM dwInitParam)
-{
-	HWND hwnd;
-	hwnd = USER32_CreateDialogIndirectParamW(hInstance,dlgTempl,
-		hWndParent,lpDialogFunc,dwInitParam);
-	if(hwnd)return DIALOG_DoDialogBox(hwnd,hWndParent);
-	return -1;
-}
-
-int USER32_DialogBoxIndirectParamA(HINSTANCE hInstance,LPVOID dlgTempl,
-	HWND hWndParent,DLGPROC lpDialogFunc,LPARAM dwInitParam)
-{
-	HWND hwnd;
-	hwnd = USER32_CreateDialogIndirectParamA(hInstance,dlgTempl,
-		hWndParent,lpDialogFunc,dwInitParam);
-	if(hwnd)return DIALOG_DoDialogBox(hwnd,hWndParent);
-	return -1;
-}
-
-int USER32_DialogBoxParamW(HINSTANCE hInstance,LPCWSTR lpszName,
-	HWND hWndParent,DLGPROC lpDialogFunc,LPARAM dwInitParam)
-{
-	HWND hwnd;
-	hwnd = USER32_CreateDialogParamW(hInstance,lpszName,
-		hWndParent,lpDialogFunc,dwInitParam);
-	if(hwnd)return DIALOG_DoDialogBox(hwnd,hWndParent);
-	 return -1;
-}
-
-int USER32_DialogBoxParamA(HINSTANCE hInstance,LPCSTR lpszName,
-	HWND hWndParent,DLGPROC lpDialogFunc,LPARAM dwInitParam)
-{
-	HWND hwnd;
-	hwnd = USER32_CreateDialogParamA(hInstance,lpszName,
-		hWndParent,lpDialogFunc,dwInitParam);
-	if(hwnd)return DIALOG_DoDialogBox(hwnd,hWndParent);
-	return -1;
-}
 
 int USER32_wsprintfA( int *args )
 {
diff --git a/win32/winprocs.c b/win32/winprocs.c
deleted file mode 100644
index 428b5ab..0000000
--- a/win32/winprocs.c
+++ /dev/null
@@ -1,229 +0,0 @@
-/*
- * Win32 WndProc function stubs
- *
- * Copyright 1995 Thomas Sandford (tdgsandf@prds-grn.demon.co.uk)
- *
- * These functions are simply lParam fixers for the Win16 routines
- */
-
-#include <stdio.h>
-#include "windows.h"
-
-#ifndef WINELIB32
-
-#include "winerror.h"
-#include "kernel32.h"
-#include "wintypes.h"
-#include "struct32.h"
-#include "wincon.h"
-#include "stackframe.h"
-#include "stddebug.h"
-#include "debug.h"
-
-BOOL UsesLParamPtr(DWORD message)
-
-{
-    switch (message) {
-	case WM_NCCREATE:
-	case WM_NCCALCSIZE:
-	case WM_WINDOWPOSCHANGING:
-	case WM_WINDOWPOSCHANGED:
-	case WM_GETTEXT:
-	case WM_SETTEXT:
-	case WM_GETMINMAXINFO:
-	    return TRUE;
-	default:
-	    return FALSE;
-    }
-}
-
-BOOL WIN32_CallWindowProcTo16(LRESULT(*func)(HWND,UINT,WPARAM,LPARAM),
-	HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam)
-{
-	WINDOWPOS16 wp;
-	union{
-		MINMAXINFO16 mmi;
-		NCCALCSIZE_PARAMS16 nccs;
-		CREATESTRUCT16 cs;
-	} st;
-	WINDOWPOS32 *pwp;
-	CREATESTRUCT32A *pcs;
-	LONG result;
-	if(!lParam || !UsesLParamPtr(msg))
-		return func(hwnd,msg,wParam,lParam);
-	switch(msg)
-	{
-		case WM_GETMINMAXINFO:
-			STRUCT32_MINMAXINFO32to16((void*)lParam,&st.mmi);
-			result=func(hwnd,msg,wParam,MAKE_SEGPTR(&st.mmi));
-			STRUCT32_MINMAXINFO16to32(&st.mmi,(void*)lParam);
-			return result;
-		case WM_WINDOWPOSCHANGING:
-		case WM_WINDOWPOSCHANGED:
-			STRUCT32_WINDOWPOS32to16((void*)lParam,&wp);
-			result=func(hwnd,msg,wParam,MAKE_SEGPTR(&wp));
-			STRUCT32_WINDOWPOS16to32(&wp,(void*)lParam);
-			return result;
-		 case WM_NCCALCSIZE:
-		 	pwp=((NCCALCSIZE_PARAMS32*)lParam)->lppos;
-		 	STRUCT32_NCCALCSIZE32to16Flat((void*)lParam,&st.nccs,wParam);
-			if (wParam && pwp) {
-				STRUCT32_WINDOWPOS32to16(pwp,&wp);
-				st.nccs.lppos = &wp;
-			}else
-				st.nccs.lppos = 0;
-			result=func(hwnd,msg,wParam,MAKE_SEGPTR(&st.nccs));
-			STRUCT32_NCCALCSIZE16to32Flat(&st.nccs,(void*)lParam,wParam);
-			if (wParam && pwp)
-				STRUCT32_WINDOWPOS16to32(&wp,pwp);
-			return result;
-		case WM_NCCREATE:
-			pcs = (CREATESTRUCT32A*)lParam;
-			STRUCT32_CREATESTRUCT32Ato16((void*)lParam,&st.cs);
-			st.cs.lpszName = HIWORD(pcs->lpszName) ? 
-				MAKE_SEGPTR(pcs->lpszName) : pcs->lpszName;
-			st.cs.lpszClass = HIWORD(pcs->lpszClass) ? 
-				MAKE_SEGPTR(pcs->lpszClass) : pcs->lpszClass;
-			result=func(hwnd,msg,wParam,MAKE_SEGPTR(&st.cs));
-			STRUCT32_CREATESTRUCT16to32A(&st.cs,(void*)lParam);
-			pcs->lpszName = HIWORD(pcs->lpszName) ? 
-				PTR_SEG_TO_LIN(st.cs.lpszName) : pcs->lpszName;
-			pcs->lpszClass = HIWORD(pcs-> lpszClass) ? 
-				PTR_SEG_TO_LIN(st.cs.lpszClass) : pcs-> lpszClass;
-			return result;
-		case WM_GETTEXT:
-		case WM_SETTEXT:
-			return func(hwnd,msg,wParam,MAKE_SEGPTR((void*)lParam));
-		default:
-			fprintf(stderr,"No support for 32-16 msg 0x%x\n",msg);
-	}
-	return func(hwnd,msg,wParam,MAKE_SEGPTR((void*)lParam));
-}
-
-
-extern LRESULT AboutDlgProc(HWND,UINT,WPARAM,LPARAM);
-extern LRESULT ColorDlgProc(HWND,UINT,WPARAM,LPARAM);
-extern LRESULT ComboBoxWndProc(HWND,UINT,WPARAM,LPARAM);
-extern LRESULT EditWndProc(HWND,UINT,WPARAM,LPARAM);
-extern LRESULT FileOpenDlgProc(HWND,UINT,WPARAM,LPARAM);
-extern LRESULT FileSaveDlgProc(HWND,UINT,WPARAM,LPARAM);
-extern LRESULT FindTextDlgProc(HWND,UINT,WPARAM,LPARAM);
-extern LRESULT ListBoxWndProc(HWND,UINT,WPARAM,LPARAM);
-extern LRESULT MDIClientWndProc(HWND,UINT,WPARAM,LPARAM);
-extern LRESULT PopupMenuWndProc(HWND,UINT,WPARAM,LPARAM);
-extern LRESULT PrintDlgProc(HWND,UINT,WPARAM,LPARAM);
-extern LRESULT PrintSetupDlgProc(HWND,UINT,WPARAM,LPARAM);
-extern LRESULT ReplaceTextDlgProc(HWND,UINT,WPARAM,LPARAM);
-extern LRESULT ScrollBarWndProc(HWND,UINT,WPARAM,LPARAM);
-extern LRESULT StaticWndProc(HWND,UINT,WPARAM,LPARAM);
-extern LRESULT SystemMessageBoxProc(HWND,UINT,WPARAM,LPARAM);
-extern LRESULT ComboLBoxWndProc(HWND,UINT,WPARAM,LPARAM);
-
-LRESULT StaticWndProc32(DWORD hwnd, DWORD msg, DWORD wParam, DWORD lParam)
-
-{
-	return WIN32_CallWindowProcTo16(StaticWndProc,(HWND)hwnd, msg, wParam, lParam);
-}
-
-LRESULT ScrollBarWndProc32(DWORD hwnd, DWORD msg, DWORD wParam, DWORD lParam)
-
-{
-	return WIN32_CallWindowProcTo16(ScrollBarWndProc,(HWND)hwnd, msg, wParam, lParam);
-}
-
-LRESULT ListBoxWndProc32(DWORD hwnd, DWORD msg, DWORD wParam, DWORD lParam)
-
-{
-	return WIN32_CallWindowProcTo16(ListBoxWndProc,(HWND)hwnd, msg, wParam, lParam);
-}
-
-LRESULT ComboBoxWndProc32(DWORD hwnd, DWORD msg, DWORD wParam, DWORD lParam)
-
-{
-	return WIN32_CallWindowProcTo16(ComboBoxWndProc,(HWND)hwnd, msg, wParam, lParam);
-}
-
-LRESULT EditWndProc32(DWORD hwnd, DWORD msg, DWORD wParam, DWORD lParam)
-
-{
-	return WIN32_CallWindowProcTo16(EditWndProc,(HWND)hwnd, msg, wParam,lParam);
-}
-
-LRESULT PopupMenuWndProc32(DWORD hwnd, DWORD msg, DWORD wParam, DWORD lParam)
-
-{
-	return WIN32_CallWindowProcTo16(PopupMenuWndProc,(HWND)hwnd, msg, wParam, lParam);
-}
-
-LRESULT DefDlgProc32(DWORD hwnd, DWORD msg, DWORD wParam, DWORD lParam)
-
-{
-	return WIN32_CallWindowProcTo16(DefDlgProc,(HWND)hwnd, msg, wParam, lParam);
-}
-
-LRESULT MDIClientWndProc32(DWORD hwnd, DWORD msg, DWORD wParam, DWORD lParam)
-
-{
-	return WIN32_CallWindowProcTo16(MDIClientWndProc,(HWND)hwnd, msg, wParam, lParam);
-}
-
-LRESULT SystemMessageBoxProc32(DWORD hwnd, DWORD msg, DWORD wParam, DWORD lParam)
-
-{
-	return WIN32_CallWindowProcTo16(SystemMessageBoxProc,(HWND)hwnd, msg, wParam, lParam);
-}
-
-LRESULT FileOpenDlgProc32(DWORD hwnd, DWORD msg, DWORD wParam, DWORD lParam)
-
-{
-	return WIN32_CallWindowProcTo16(FileOpenDlgProc,(HWND)hwnd, msg, wParam, lParam);
-}
-
-LRESULT FileSaveDlgProc32(DWORD hwnd, DWORD msg, DWORD wParam, DWORD lParam)
-
-{
-	return WIN32_CallWindowProcTo16(FileSaveDlgProc,(HWND)hwnd, msg, wParam, lParam);
-}
-
-LRESULT ColorDlgProc32(DWORD hwnd, DWORD msg, DWORD wParam, DWORD lParam)
-
-{
-	return WIN32_CallWindowProcTo16(ColorDlgProc,(HWND)hwnd, msg, wParam, lParam);
-}
-
-LRESULT FindTextDlgProc32(DWORD hwnd, DWORD msg, DWORD wParam, DWORD lParam)
-
-{
-	return WIN32_CallWindowProcTo16(FindTextDlgProc,(HWND)hwnd, msg, wParam, lParam);
-}
-
-LRESULT ReplaceTextDlgProc32(DWORD hwnd, DWORD msg, DWORD wParam, DWORD lParam)
-
-{
-	return WIN32_CallWindowProcTo16(ReplaceTextDlgProc,(HWND)hwnd, msg, wParam, lParam);
-}
-
-LRESULT PrintSetupDlgProc32(DWORD hwnd, DWORD msg, DWORD wParam, DWORD lParam)
-
-{
-	return WIN32_CallWindowProcTo16(PrintSetupDlgProc,(HWND)hwnd, msg, wParam, lParam);
-}
-
-LRESULT PrintDlgProc32(DWORD hwnd, DWORD msg, DWORD wParam, DWORD lParam)
-
-{
-	return WIN32_CallWindowProcTo16(PrintDlgProc,(HWND)hwnd, msg, wParam, lParam);
-}
-
-LRESULT AboutDlgProc32(DWORD hwnd, DWORD msg, DWORD wParam, DWORD lParam)
-
-{
-	return WIN32_CallWindowProcTo16(AboutDlgProc,(HWND)hwnd, msg, wParam, lParam);
-}
-
-LRESULT ComboLBoxWndProc32(DWORD hwnd, DWORD msg, DWORD wParam, DWORD lParam)
-
-{
-	return WIN32_CallWindowProcTo16(ComboLBoxWndProc,(HWND)hwnd, msg, wParam, lParam);
-}
-#endif
diff --git a/windows/class.c b/windows/class.c
index 4a3f6eb..4cf9e11 100644
--- a/windows/class.c
+++ b/windows/class.c
@@ -43,11 +43,11 @@
 
     fprintf( stderr, "Class %p:\n", ptr );
     fprintf( stderr,
-             "next=%p  name=%04x '%s'  style=%08x  wndProc=%08lx\n"
+             "next=%p  name=%04x '%s'  style=%08x  wndProc=%08x\n"
              "inst=%04x  hdce=%04x  icon=%04x  cursor=%04x  bkgnd=%04x\n"
              "clsExtra=%d  winExtra=%d  #windows=%d\n",
              ptr->next, ptr->atomName, className, ptr->style,
-             (DWORD)ptr->lpfnWndProc, ptr->hInstance, ptr->hdce,
+             ptr->winproc, ptr->hInstance, ptr->hdce,
              ptr->hIcon, ptr->hCursor, ptr->hbrBackground,
              ptr->cbClsExtra, ptr->cbWndExtra, ptr->cWindows );
     if (ptr->cbClsExtra)
@@ -76,7 +76,7 @@
     {
         GlobalGetAtomName32A( ptr->atomName, className, sizeof(className) );
         fprintf( stderr, "%08x %-20.20s %08x %08x\n", (UINT32)ptr, className,
-                 ptr->style, (UINT32)ptr->lpfnWndProc );
+                 ptr->style, ptr->winproc );
     }
     fprintf( stderr, "\n" );
 }
@@ -160,13 +160,12 @@
  *
  * Set the window procedure and return the old one.
  */
-static WNDPROC16 CLASS_SetWndProc( CLASS *classPtr, WNDPROC16 proc,
-                                   WINDOWPROCTYPE type )
+static HANDLE32 CLASS_SetWndProc( CLASS *classPtr, HANDLE32 proc,
+                                  WINDOWPROCTYPE type )
 {
-    WNDPROC16 oldProc = classPtr->lpfnWndProc;
-    if (type == WIN_PROC_16) classPtr->lpfnWndProc = proc;
-    else classPtr->lpfnWndProc = WINPROC_AllocWinProc( (WNDPROC32)proc, type );
-    WINPROC_FreeWinProc( oldProc );
+    HANDLE32 oldProc = classPtr->winproc;
+    classPtr->winproc = WINPROC_AllocWinProc( proc, type );
+    if (oldProc) WINPROC_FreeWinProc( oldProc );
     return oldProc;
 }
 
@@ -274,7 +273,7 @@
  */
 static CLASS *CLASS_RegisterClass( ATOM atom, HINSTANCE32 hInstance,
                                    DWORD style, INT32 classExtra,
-                                   INT32 winExtra, WNDPROC16 wndProc,
+                                   INT32 winExtra, HANDLE32 wndProc,
                                    WINDOWPROCTYPE wndProcType )
 {
     CLASS *classPtr;
@@ -309,14 +308,14 @@
     classPtr->magic       = CLASS_MAGIC;
     classPtr->cWindows    = 0;  
     classPtr->style       = style;
-    classPtr->lpfnWndProc = 0;
+    classPtr->winproc     = 0;
     classPtr->cbWndExtra  = winExtra;
     classPtr->cbClsExtra  = classExtra;
     classPtr->hInstance   = hInstance;
     classPtr->atomName    = atom;
     classPtr->menuNameA   = 0;
     classPtr->menuNameW   = 0;
-    classPtr->hdce        = (style&CS_CLASSDC) ? DCE_AllocDCE(DCE_CLASS_DC): 0;
+    classPtr->hdce        = (style&CS_CLASSDC) ? DCE_AllocDCE(0, DCE_CLASS_DC): 0;
     CLASS_SetWndProc( classPtr, wndProc, wndProcType );
     /* Other values must be set by caller */
 
@@ -339,7 +338,8 @@
     if (!(atom = GlobalAddAtom16( wc->lpszClassName ))) return 0;
     if (!(classPtr = CLASS_RegisterClass( atom, hInstance, wc->style,
                                           wc->cbClsExtra, wc->cbWndExtra,
-                                          wc->lpfnWndProc, WIN_PROC_16 )))
+                                          (HANDLE32)wc->lpfnWndProc,
+                                          WIN_PROC_16 )))
     {
         GlobalDeleteAtom( atom );
         return 0;
@@ -375,7 +375,7 @@
     if (!(atom = GlobalAddAtom32A( wc->lpszClassName ))) return 0;
     if (!(classPtr = CLASS_RegisterClass( atom, hInstance, wc->style,
                                           wc->cbClsExtra, wc->cbWndExtra,
-                                          (WNDPROC16)wc->lpfnWndProc,
+                                          (HANDLE32)wc->lpfnWndProc,
                                           WIN_PROC_32A )))
     {
         GlobalDeleteAtom( atom );
@@ -410,7 +410,7 @@
     if (!(atom = GlobalAddAtom32W( wc->lpszClassName ))) return 0;
     if (!(classPtr = CLASS_RegisterClass( atom, hInstance, wc->style,
                                           wc->cbClsExtra, wc->cbWndExtra,
-                                          (WNDPROC16)wc->lpfnWndProc,
+                                          (HANDLE32)wc->lpfnWndProc,
                                           WIN_PROC_32W )))
     {
         GlobalDeleteAtom( atom );
@@ -444,7 +444,8 @@
     if (!(atom = GlobalAddAtom16( wc->lpszClassName ))) return 0;
     if (!(classPtr = CLASS_RegisterClass( atom, hInstance, wc->style,
                                           wc->cbClsExtra, wc->cbWndExtra,
-                                          wc->lpfnWndProc, WIN_PROC_16 )))
+                                          (HANDLE32)wc->lpfnWndProc,
+                                          WIN_PROC_16 )))
     {
         GlobalDeleteAtom( atom );
         return 0;
@@ -480,7 +481,7 @@
     if (!(atom = GlobalAddAtom32A( wc->lpszClassName ))) return 0;
     if (!(classPtr = CLASS_RegisterClass( atom, hInstance, wc->style,
                                           wc->cbClsExtra, wc->cbWndExtra,
-                                          (WNDPROC16)wc->lpfnWndProc,
+                                          (HANDLE32)wc->lpfnWndProc,
                                           WIN_PROC_32A )))
     {
         GlobalDeleteAtom( atom );
@@ -515,7 +516,7 @@
     if (!(atom = GlobalAddAtom32W( wc->lpszClassName ))) return 0;
     if (!(classPtr = CLASS_RegisterClass( atom, hInstance, wc->style,
                                           wc->cbClsExtra, wc->cbWndExtra,
-                                          (WNDPROC16)wc->lpfnWndProc,
+                                          (HANDLE32)wc->lpfnWndProc,
                                           WIN_PROC_32W )))
     {
         GlobalDeleteAtom( atom );
@@ -620,9 +621,19 @@
  */
 LONG GetClassLong16( HWND hwnd, INT16 offset )
 {
-    DWORD ret = GetClassLong32A( hwnd, offset );
-    if ((offset == GCL_MENUNAME) && HIWORD(ret))
-        return (LONG)SEGPTR_GET((void *)ret);  /* Name needs to be a SEGPTR */
+    LONG ret;
+
+    switch( offset )
+    {
+    case GCL_MENUNAME:
+        ret = GetClassLong32A( hwnd, offset );
+        return (LONG)SEGPTR_GET( (void *)ret );
+    case GCL_WNDPROC:
+        ret = GetClassLong32A( hwnd, offset );
+        return (LONG)WINPROC_GetFunc16( (HANDLE32)ret );
+    default:
+        return GetClassLong32A( hwnd, offset );
+    }
     return (LONG)ret;
 }
 
@@ -645,8 +656,9 @@
         case GCL_STYLE:      return (LONG)wndPtr->class->style;
         case GCL_CBWNDEXTRA: return (LONG)wndPtr->class->cbWndExtra;
         case GCL_CBCLSEXTRA: return (LONG)wndPtr->class->cbClsExtra;
-        case GCL_WNDPROC:    return (LONG)wndPtr->class->lpfnWndProc;
         case GCL_HMODULE:    return (LONG)wndPtr->class->hInstance;
+        case GCL_WNDPROC:
+            return (LONG)WINPROC_GetFunc32( wndPtr->class->winproc );
         case GCL_MENUNAME:
             return (LONG)CLASS_GetMenuNameA( wndPtr->class );
         case GCL_HBRBACKGROUND:
@@ -727,7 +739,7 @@
     {
     case GCL_WNDPROC:
         if (!(wndPtr = WIN_FindWndPtr(hwnd))) return 0;
-        return (LONG)CLASS_SetWndProc( wndPtr->class, (WNDPROC16)newval,
+        return (LONG)CLASS_SetWndProc( wndPtr->class, (HANDLE32)newval,
                                        WIN_PROC_16 );
     case GCL_MENUNAME:
         return SetClassLong32A( hwnd, offset, (LONG)PTR_SEG_TO_LIN(newval) );
@@ -764,7 +776,7 @@
             CLASS_SetMenuNameA( wndPtr->class, (LPCSTR)newval );
             return 0;  /* Old value is now meaningless anyway */
         case GCL_WNDPROC:
-            return (LONG)CLASS_SetWndProc( wndPtr->class, (WNDPROC16)newval,
+            return (LONG)CLASS_SetWndProc( wndPtr->class, (HANDLE32)newval,
                                            WIN_PROC_32A );
         case GCL_HBRBACKGROUND:
         case GCL_HCURSOR:
@@ -797,7 +809,7 @@
     switch(offset)
     {
     case GCL_WNDPROC:
-        return (LONG)CLASS_SetWndProc( wndPtr->class, (WNDPROC16)newval,
+        return (LONG)CLASS_SetWndProc( wndPtr->class, (HANDLE32)newval,
                                        WIN_PROC_32W );
     case GCL_MENUNAME:
         CLASS_SetMenuNameW( wndPtr->class, (LPCWSTR)newval );
@@ -854,7 +866,7 @@
         !(classPtr = CLASS_FindClassByAtom( atom, hInstance )) ||
         (hInstance != classPtr->hInstance)) return FALSE;
     wc->style         = (UINT16)classPtr->style;
-    wc->lpfnWndProc   = classPtr->lpfnWndProc;
+    wc->lpfnWndProc   = WINPROC_GetFunc16( classPtr->winproc );
     wc->cbClsExtra    = (INT16)classPtr->cbClsExtra;
     wc->cbWndExtra    = (INT16)classPtr->cbWndExtra;
     wc->hInstance     = (HINSTANCE16)classPtr->hInstance;
@@ -882,7 +894,7 @@
         !(classPtr = CLASS_FindClassByAtom( atom, hInstance )) ||
         (hInstance != classPtr->hInstance)) return FALSE;
     wc->style         = classPtr->style;
-    wc->lpfnWndProc   = (WNDPROC32)classPtr->lpfnWndProc;
+    wc->lpfnWndProc   = WINPROC_GetFunc32( classPtr->winproc );
     wc->cbClsExtra    = classPtr->cbClsExtra;
     wc->cbWndExtra    = classPtr->cbWndExtra;
     wc->hInstance     = classPtr->hInstance;
@@ -908,7 +920,7 @@
         !(classPtr = CLASS_FindClassByAtom( atom, hInstance )) ||
         (hInstance != classPtr->hInstance)) return FALSE;
     wc->style         = classPtr->style;
-    wc->lpfnWndProc   = (WNDPROC32)classPtr->lpfnWndProc;
+    wc->lpfnWndProc   = WINPROC_GetFunc32( classPtr->winproc );
     wc->cbClsExtra    = classPtr->cbClsExtra;
     wc->cbWndExtra    = classPtr->cbWndExtra;
     wc->hInstance     = classPtr->hInstance;
@@ -937,7 +949,7 @@
         !(classPtr = CLASS_FindClassByAtom( atom, hInstance )) ||
         (hInstance != classPtr->hInstance)) return FALSE;
     wc->style         = classPtr->style;
-    wc->lpfnWndProc   = classPtr->lpfnWndProc;
+    wc->lpfnWndProc   = WINPROC_GetFunc16( classPtr->winproc );
     wc->cbClsExtra    = (INT16)classPtr->cbClsExtra;
     wc->cbWndExtra    = (INT16)classPtr->cbWndExtra;
     wc->hInstance     = (HINSTANCE16)classPtr->hInstance;
@@ -966,7 +978,7 @@
         !(classPtr = CLASS_FindClassByAtom( atom, hInstance )) ||
         (hInstance != classPtr->hInstance)) return FALSE;
     wc->style         = classPtr->style;
-    wc->lpfnWndProc   = (WNDPROC32)classPtr->lpfnWndProc;
+    wc->lpfnWndProc   = WINPROC_GetFunc32( classPtr->winproc );
     wc->cbClsExtra    = classPtr->cbClsExtra;
     wc->cbWndExtra    = classPtr->cbWndExtra;
     wc->hInstance     = classPtr->hInstance;
@@ -993,7 +1005,7 @@
         !(classPtr = CLASS_FindClassByAtom( atom, hInstance )) ||
         (hInstance != classPtr->hInstance)) return FALSE;
     wc->style         = classPtr->style;
-    wc->lpfnWndProc   = (WNDPROC32)classPtr->lpfnWndProc;
+    wc->lpfnWndProc   = WINPROC_GetFunc32( classPtr->winproc );
     wc->cbClsExtra    = classPtr->cbClsExtra;
     wc->cbWndExtra    = classPtr->cbWndExtra;
     wc->hInstance     = classPtr->hInstance;
diff --git a/windows/dce.c b/windows/dce.c
index 5728434..4ec7624 100644
--- a/windows/dce.c
+++ b/windows/dce.c
@@ -2,9 +2,18 @@
  * USER DCE functions
  *
  * Copyright 1993 Alexandre Julliard
+ *	     1996 Alex Korobka
  *
-static char Copyright[] = "Copyright  Alexandre Julliard, 1993";
-*/
+ *
+ * Note: Visible regions of CS_OWNDC/CS_CLASSDC window DCs 
+ * have to be updated dynamically. 
+ * 
+ * Internal DCX flags:
+ *
+ * DCX_DCEBUSY     - dce structure is in use
+ * DCX_KEEPCLIPRGN - do not delete clipping region in ReleaseDC
+ * DCX_WINDOWPAINT - BeginPaint specific flag
+ */
 
 #include "dce.h"
 #include "class.h"
@@ -21,30 +30,48 @@
 static HANDLE firstDCE = 0;
 static HDC defaultDCstate = 0;
 
+BOOL   DCHook(HDC, WORD, DWORD, DWORD);
 
 /***********************************************************************
  *           DCE_AllocDCE
- *
+*
  * Allocate a new DCE.
  */
-HANDLE DCE_AllocDCE( DCE_TYPE type )
+HANDLE DCE_AllocDCE( HWND hWnd, DCE_TYPE type )
 {
     DCE * dce;
     HANDLE handle = USER_HEAP_ALLOC( sizeof(DCE) );
     if (!handle) return 0;
     dce = (DCE *) USER_HEAP_LIN_ADDR( handle );
-    if (!(dce->hdc = CreateDC( "DISPLAY", NULL, NULL, NULL )))
+    if (!(dce->hDC = CreateDC( "DISPLAY", NULL, NULL, NULL )))
     {
 	USER_HEAP_FREE( handle );
 	return 0;
     }
-    dce->hwndCurrent = 0;
-    dce->type  = type;
-    dce->inUse = (type != DCE_CACHE_DC);
-    dce->xOrigin = 0;
-    dce->yOrigin = 0;
+
+    /* store DCE handle in DC hook data field */
+
+    SetDCHook(dce->hDC, GDI_GetDefDCHook(), MAKELONG(handle,DC_MAGIC));
+
+    dce->hwndCurrent = hWnd;
     dce->hNext = firstDCE;
+    dce->hClipRgn = 0;
     firstDCE = handle;
+
+    if( type != DCE_CACHE_DC )
+      {
+	dce->DCXflags = DCX_DCEBUSY;
+	if( hWnd )
+	  {
+	    WND* wnd = WIN_FindWndPtr(hWnd);
+	
+	    if( wnd->dwStyle & WS_CLIPCHILDREN ) dce->DCXflags |= DCX_CLIPCHILDREN;
+	    if( wnd->dwStyle & WS_CLIPSIBLINGS ) dce->DCXflags |= DCX_CLIPSIBLINGS;
+	  }
+	SetHookFlags(dce->hDC,DCHF_INVALIDATEVISRGN);
+      }
+    else dce->DCXflags = DCX_CACHE;
+
     return handle;
 }
 
@@ -64,10 +91,77 @@
 	handle = &prev->hNext;
     }
     if (*handle == hdce) *handle = dce->hNext;
-    DeleteDC( dce->hdc );
+
+    SetDCHook(dce->hDC,(SEGPTR)NULL,0L);
+
+    DeleteDC( dce->hDC );
+    if( dce->hClipRgn && !(dce->DCXflags & DCX_KEEPCLIPRGN) )
+	DeleteObject(dce->hClipRgn);
     USER_HEAP_FREE( hdce );
 }
 
+/***********************************************************************
+ *           DCE_FindDCE
+ */
+HANDLE DCE_FindDCE(HDC hDC)
+{
+ HANDLE hdce = firstDCE;
+ DCE*   dce;
+
+ while( hdce )
+  {
+    dce = (DCE *) USER_HEAP_LIN_ADDR(hdce);
+    if( dce->hDC == hDC ) break;
+    hdce = dce->hNext;
+  }
+ return hdce;
+}
+
+/***********************************************************************
+ *   DCE_InvalidateDCE
+ */
+BOOL DCE_InvalidateDCE(WND* wndScope, RECT16* pRectUpdate)
+{
+ HANDLE hdce;
+ DCE*   dce;
+
+ if( !wndScope ) return 0;
+
+ dprintf_dc(stddeb,"InvalidateDCE: scope hwnd = %04x, (%i,%i - %i,%i)\n",
+                    wndScope->hwndSelf, pRectUpdate->left,pRectUpdate->top,
+				        pRectUpdate->right,pRectUpdate->bottom);
+
+ for( hdce = firstDCE; (hdce); hdce=dce->hNext)
+  { 
+    dce = (DCE*)USER_HEAP_LIN_ADDR(hdce);
+
+    if( dce->DCXflags & DCX_DCEBUSY )
+      {
+        WND * wndCurrent, * wnd; 
+
+	wnd = wndCurrent = WIN_FindWndPtr(dce->hwndCurrent);
+
+	/* desktop is not critical */
+
+	if( wnd == WIN_GetDesktop() ) continue;
+
+	for( ; wnd ; wnd = wnd->parent )
+	    if( wnd == wndScope )
+	      { 
+	        RECT16 wndRect = wndCurrent->rectWindow;
+
+	        dprintf_dc(stddeb,"\tgot hwnd %04x\n", wndCurrent->hwndSelf);
+  
+	        MapWindowPoints16(wndCurrent->parent->hwndSelf, wndScope->hwndSelf,
+			 				(LPPOINT16)&wndRect, 2);
+	        if( IntersectRect16(&wndRect,&wndRect,pRectUpdate) )
+	            SetHookFlags(dce->hDC, DCHF_INVALIDATEVISRGN);
+	        break;
+	      }
+      }
+  }
+ return 1;
+}
 
 /***********************************************************************
  *           DCE_Init
@@ -80,9 +174,9 @@
         
     for (i = 0; i < NB_DCE; i++)
     {
-	if (!(handle = DCE_AllocDCE( DCE_CACHE_DC ))) return;
+	if (!(handle = DCE_AllocDCE( 0, DCE_CACHE_DC ))) return;
 	dce = (DCE *) USER_HEAP_LIN_ADDR( handle );	
-	if (!defaultDCstate) defaultDCstate = GetDCState( dce->hdc );
+	if (!defaultDCstate) defaultDCstate = GetDCState( dce->hDC );
     }
 }
 
@@ -186,9 +280,11 @@
     int xoffset, yoffset;
     WND *wndPtr = WIN_FindWndPtr( hwnd );
 
-      /* Get visible rectangle and create a region with it */
+      /* Get visible rectangle and create a region with it 
+       * FIXME: do we really need to calculate vis rgns for X windows? 
+       */
 
-    if (!DCE_GetVisRect( wndPtr, !(flags & DCX_WINDOW), &rect ))
+    if (!wndPtr || !DCE_GetVisRect( wndPtr, !(flags & DCX_WINDOW), &rect ))
     {
         return CreateRectRgn( 0, 0, 0, 0 );  /* Visible region is empty */
     }
@@ -281,103 +377,147 @@
     }
 }
 
-
 /***********************************************************************
  *           GetDCEx    (USER.359)
- */
-/* Unimplemented flags: DCX_LOCKWINDOWUPDATE
+ *
+ * Unimplemented flags: DCX_LOCKWINDOWUPDATE
  */
 HDC GetDCEx( HWND hwnd, HRGN hrgnClip, DWORD flags )
 {
-    HANDLE hdce;
-    HRGN hrgnVisible;
-    HDC hdc = 0;
-    DCE * dce;
-    DC * dc;
-    WND * wndPtr;
+    HANDLE 	hdce;
+    HRGN 	hrgnVisible;
+    HDC 	hdc = 0;
+    DCE * 	dce;
+    DC * 	dc;
+    WND * 	wndPtr;
+    DWORD 	dcx_flags = 0;
+    BOOL	need_update = TRUE;
+
+    dprintf_dc(stddeb,"GetDCEx: hwnd %04x, hrgnClip %04x, flags %08x\n", hwnd, hrgnClip, (unsigned)flags);
     
-    if (hwnd)
-    {
-	if (!(wndPtr = WIN_FindWndPtr( hwnd ))) return 0;
-    }
-    else wndPtr = NULL;
+    if (!(wndPtr = WIN_FindWndPtr( hwnd ))) return 0;
 
     if (flags & DCX_USESTYLE)
     {
-        /* Set the flags according to the window style. */
-	/* Not sure if this is the real meaning of the DCX_USESTYLE flag... */
-	flags &= ~(DCX_CACHE | DCX_CLIPCHILDREN |
-                   DCX_CLIPSIBLINGS | DCX_PARENTCLIP);
-	if (wndPtr)
+	flags &= ~( DCX_CLIPCHILDREN | DCX_CLIPSIBLINGS | DCX_PARENTCLIP);
+
+        if( wndPtr->dwStyle & WS_CLIPSIBLINGS )
+            flags |= DCX_CLIPSIBLINGS;
+
+	if ( !(flags & DCX_WINDOW) )
 	{
             if (!(wndPtr->class->style & (CS_OWNDC | CS_CLASSDC)))
 		flags |= DCX_CACHE;
+
             if (wndPtr->class->style & CS_PARENTDC) flags |= DCX_PARENTCLIP;
-	    if (wndPtr->dwStyle & WS_CLIPCHILDREN) flags |= DCX_CLIPCHILDREN;
-	    if (wndPtr->dwStyle & WS_CLIPSIBLINGS) flags |= DCX_CLIPSIBLINGS;
+
+	    if (wndPtr->dwStyle & WS_CLIPCHILDREN &&
+                     !(wndPtr->dwStyle & WS_MINIMIZE) ) flags |= DCX_CLIPCHILDREN;
 	}
 	else flags |= DCX_CACHE;
     }
 
-      /* Can only use PARENTCLIP on child windows */
-    if (!wndPtr || !(wndPtr->dwStyle & WS_CHILD)) flags &= ~DCX_PARENTCLIP;
+    if( flags & DCX_NOCLIPCHILDREN )
+      {
+        flags |= DCX_CACHE;
+        flags &= ~(DCX_PARENTCLIP | DCX_CLIPCHILDREN);
+      }
 
-      /* Whole window DC implies using cache DC and not clipping children */
+    if (hwnd==GetDesktopWindow() || !(wndPtr->dwStyle & WS_CHILD)) flags &= ~DCX_PARENTCLIP;
+
     if (flags & DCX_WINDOW) flags = (flags & ~DCX_CLIPCHILDREN) | DCX_CACHE;
 
+    if( flags & DCX_PARENTCLIP )
+      {
+        flags |= DCX_CACHE;
+        if( !(flags & (DCX_CLIPSIBLINGS | DCX_CLIPCHILDREN)) )
+          if( (wndPtr->dwStyle & WS_VISIBLE) && (wndPtr->parent->dwStyle & WS_VISIBLE) )
+            {
+              flags &= ~DCX_CLIPCHILDREN;
+              if( wndPtr->parent->dwStyle & WS_CLIPSIBLINGS )
+                flags |= DCX_CLIPSIBLINGS;
+            }
+      }
+
     if (flags & DCX_CACHE)
     {
 	for (hdce = firstDCE; (hdce); hdce = dce->hNext)
 	{
 	    if (!(dce = (DCE *) USER_HEAP_LIN_ADDR( hdce ))) return 0;
-	    if ((dce->type == DCE_CACHE_DC) && (!dce->inUse)) break;
+	    if ((dce->DCXflags & DCX_CACHE) && !(dce->DCXflags & DCX_DCEBUSY)) break;
 	}
     }
-    else hdce = wndPtr->hdce;
+    else 
+    {
+        hdce = (wndPtr->class->style & CS_OWNDC)?wndPtr->hdce:wndPtr->class->hdce;
+	dce = (DCE *) USER_HEAP_LIN_ADDR( hdce );
+
+	if( dce->hwndCurrent == hwnd )
+	  {
+	    dprintf_dc(stddeb,"\tskipping hVisRgn update\n");
+	    need_update = FALSE;
+	  }
+
+	if( hrgnClip && dce->hClipRgn && !(dce->DCXflags & DCX_KEEPCLIPRGN))
+	  {
+	    fprintf(stdnimp,"GetDCEx: hClipRgn collision!\n");
+            DeleteObject(dce->hClipRgn); 
+	    need_update = TRUE;
+	  }
+    }
+
+    dcx_flags = flags & ( DCX_CLIPSIBLINGS | DCX_CLIPCHILDREN | DCX_CACHE | DCX_WINDOW | DCX_WINDOWPAINT);
 
     if (!hdce) return 0;
     dce = (DCE *) USER_HEAP_LIN_ADDR( hdce );
     dce->hwndCurrent = hwnd;
-    dce->inUse       = TRUE;
-    hdc = dce->hdc;
-    
-      /* Initialize DC */
+    dce->hClipRgn = 0;
+    dce->DCXflags = dcx_flags | DCX_DCEBUSY;
+    hdc = dce->hDC;
     
     if (!(dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC ))) return 0;
 
     DCE_SetDrawable( wndPtr, dc, flags );
-    if (hwnd)
-    {
-        if (flags & DCX_PARENTCLIP)  /* Get a VisRgn for the parent */
+    if( need_update || dc->w.flags & DC_DIRTY )
+     {
+      dprintf_dc(stddeb,"updating hDC anyway\n");
+
+      if (flags & DCX_PARENTCLIP)
         {
             WND *parentPtr = wndPtr->parent;
-            DWORD newflags = flags & ~(DCX_CLIPSIBLINGS | DCX_CLIPCHILDREN |
+            dcx_flags = flags & ~(DCX_CLIPSIBLINGS | DCX_CLIPCHILDREN |
                                        DCX_WINDOW);
             if (parentPtr->dwStyle & WS_CLIPSIBLINGS)
-                newflags |= DCX_CLIPSIBLINGS;
-            hrgnVisible = DCE_GetVisRgn( parentPtr->hwndSelf, newflags );
+                dcx_flags |= DCX_CLIPSIBLINGS;
+            hrgnVisible = DCE_GetVisRgn( parentPtr->hwndSelf, dcx_flags );
             if (flags & DCX_WINDOW)
                 OffsetRgn( hrgnVisible, -wndPtr->rectWindow.left,
                                         -wndPtr->rectWindow.top );
             else OffsetRgn( hrgnVisible, -wndPtr->rectClient.left,
                                          -wndPtr->rectClient.top );
         }
-        else hrgnVisible = DCE_GetVisRgn( hwnd, flags );
-    }
-    else  /* Get a VisRgn for the whole screen */
-    {
-        hrgnVisible = CreateRectRgn( 0, 0, SYSMETRICS_CXSCREEN,
+      else if( hwnd==GetDesktopWindow() ) hrgnVisible = CreateRectRgn( 0, 0, SYSMETRICS_CXSCREEN,
                                      SYSMETRICS_CYSCREEN);
-    }
+      else hrgnVisible = DCE_GetVisRgn( hwnd, flags );
 
-      /* Intersect VisRgn with the given region */
+      dc->w.flags &= ~DC_DIRTY;
+
+      SelectVisRgn( hdc, hrgnVisible );
+     }
+    else hrgnVisible = CreateRectRgn(0,0,0,0);
 
     if ((flags & DCX_INTERSECTRGN) || (flags & DCX_EXCLUDERGN))
     {
-        CombineRgn( hrgnVisible, hrgnVisible, hrgnClip,
+	dce->DCXflags |= flags & (DCX_KEEPCLIPRGN | DCX_INTERSECTRGN | DCX_EXCLUDERGN);
+	dce->hClipRgn = hrgnClip;
+
+	dprintf_dc(stddeb, "\tsaved VisRgn, clipRgn = %04x\n", hrgnClip);
+
+	SaveVisRgn( hdc );
+        CombineRgn( hrgnVisible, InquireVisRgn( hdc ), hrgnClip,
                     (flags & DCX_INTERSECTRGN) ? RGN_AND : RGN_DIFF );
+	SelectVisRgn( hdc, hrgnVisible );
     }
-    SelectVisRgn( hdc, hrgnVisible );
     DeleteObject( hrgnVisible );
 
     dprintf_dc(stddeb, "GetDCEx(%04x,%04x,0x%lx): returning %04x\n", 
@@ -385,12 +525,13 @@
     return hdc;
 }
 
-
 /***********************************************************************
  *           GetDC    (USER.66)
  */
 HDC GetDC( HWND hwnd )
 {
+    if( !hwnd ) return GetDCEx( GetDesktopWindow(), 0, DCX_CACHE | DCX_WINDOW );
+
     return GetDCEx( hwnd, 0, DCX_USESTYLE );
 }
 
@@ -400,15 +541,14 @@
  */
 HDC GetWindowDC( HWND hwnd )
 {
-    int flags = DCX_CACHE | DCX_WINDOW;
     if (hwnd)
     {
 	WND * wndPtr;
 	if (!(wndPtr = WIN_FindWndPtr( hwnd ))) return 0;
-/*	if (wndPtr->dwStyle & WS_CLIPCHILDREN) flags |= DCX_CLIPCHILDREN; */
-	if (wndPtr->dwStyle & WS_CLIPSIBLINGS) flags |= DCX_CLIPSIBLINGS;
     }
-    return GetDCEx( hwnd, 0, flags );
+    else hwnd = GetDesktopWindow();
+
+    return GetDCEx( hwnd, 0, DCX_USESTYLE | DCX_WINDOW );
 }
 
 
@@ -425,14 +565,98 @@
     for (hdce = firstDCE; (hdce); hdce = dce->hNext)
     {
 	if (!(dce = (DCE *) USER_HEAP_LIN_ADDR( hdce ))) return 0;
-	if (dce->inUse && (dce->hdc == hdc)) break;
+	if (dce->hDC == hdc) break;
     }
     if (!hdce) return 0;
+    if (!(dce->DCXflags & DCX_DCEBUSY) ) return 0;
 
-    if (dce->type == DCE_CACHE_DC)
+    /* restore previous visible region */
+
+    if ( dce->DCXflags & (DCX_INTERSECTRGN | DCX_EXCLUDERGN) &&
+	(dce->DCXflags & DCX_CACHE || dce->DCXflags & DCX_WINDOWPAINT) )
     {
-	SetDCState( dce->hdc, defaultDCstate );
-	dce->inUse = FALSE;
+	dprintf_dc(stddeb,"\tcleaning up visrgn...\n");
+	dce->DCXflags &= ~(DCX_EXCLUDERGN | DCX_INTERSECTRGN | DCX_WINDOWPAINT);
+
+	if( dce->DCXflags & DCX_KEEPCLIPRGN )
+	    dce->DCXflags &= ~DCX_KEEPCLIPRGN;
+	else
+	  {
+	    if( dce->hClipRgn > 1 )
+	        DeleteObject( dce->hClipRgn );
+	    dce->hClipRgn = 0;
+	  } 
+        dce->hClipRgn = 0;
+	RestoreVisRgn(dce->hDC);
+    }
+
+    if (dce->DCXflags & DCX_CACHE)
+    {
+	SetDCState( dce->hDC, defaultDCstate );
+	dce->DCXflags &= ~DCX_DCEBUSY;
     }
     return 1;
 }
+
+/***********************************************************************
+ *           DCHook    (USER.362)
+ *
+ * See "Undoc. Windows" for hints (DC, SetDCHook, SetHookFlags)..  
+ */
+BOOL DCHook(HDC hDC, WORD code, DWORD data, DWORD lParam)
+{
+  HANDLE hdce;
+  HRGN hVisRgn;
+
+  dprintf_dc(stddeb,"DCHook: hDC = %04x, %i\n", hDC, code);
+
+  if( HIWORD(data) == DC_MAGIC )
+      hdce = (HANDLE)LOWORD(data);
+  else
+      hdce = DCE_FindDCE(hDC);
+
+  if( !hdce ) return 0;
+
+  switch( code )
+    {
+      case DCHC_INVALIDVISRGN:
+         {
+           DCE* dce = (DCE*) USER_HEAP_LIN_ADDR(hdce);
+
+           if( dce->DCXflags & DCX_DCEBUSY )
+ 	     {
+	       SetHookFlags(hDC, DCHF_VALIDATEVISRGN);
+	       hVisRgn = DCE_GetVisRgn(dce->hwndCurrent, dce->DCXflags);
+
+	       dprintf_dc(stddeb,"\tapplying saved clipRgn\n");
+  
+	       /* clip this region with saved clipping region */
+
+               if ( (dce->DCXflags & DCX_INTERSECTRGN && dce->hClipRgn != 1) ||
+                  (  dce->DCXflags & DCX_EXCLUDERGN && dce->hClipRgn) )
+                  {
+
+                    if( (!dce->hClipRgn && dce->DCXflags & DCX_INTERSECTRGN) ||
+                         (dce->hClipRgn == 1 && dce->DCXflags & DCX_EXCLUDERGN) )            
+                         SetRectRgn(hVisRgn,0,0,0,0);
+                    else
+                         CombineRgn(hVisRgn, hVisRgn, dce->hClipRgn, 
+                                      (dce->DCXflags & DCX_EXCLUDERGN)? RGN_DIFF:RGN_AND);
+	          }  
+	       SelectVisRgn(hDC, hVisRgn);
+	       DeleteObject(hVisRgn);
+	     }
+           else
+	     dprintf_dc(stddeb,"DCHook: DC is not in use!\n");
+         }
+	 break;
+
+      case DCHC_DELETEDC: /* FIXME: ?? */
+	 break;
+
+      default:
+	 fprintf(stdnimp,"DCHook: unknown code\n");
+    }
+  return 0;
+}
+
diff --git a/windows/defdlg.c b/windows/defdlg.c
index 39e77e0..9379e07 100644
--- a/windows/defdlg.c
+++ b/windows/defdlg.c
@@ -1,16 +1,15 @@
 /*
  * Default dialog procedure
  *
- * Copyright 1993 Alexandre Julliard
+ * Copyright 1993, 1996 Alexandre Julliard
  *
  */
 
 #include "windows.h"
 #include "dialog.h"
 #include "win.h"
-#include "stddebug.h"
-/* #define DEBUG_DIALOG */
-#include "debug.h"
+#include "winproc.h"
+
 
 /***********************************************************************
  *           DEFDLG_SetFocus
@@ -110,37 +109,22 @@
 
 
 /***********************************************************************
- *           DefDlgProc   (USER.308)
+ *           DEFDLG_Proc
+ *
+ * Implementation of DefDlgProc(). Only handle messages that need special
+ * handling for dialogs.
  */
-LRESULT DefDlgProc( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam )
+static LRESULT DEFDLG_Proc( HWND32 hwnd, UINT32 msg, WPARAM32 wParam,
+                            LPARAM lParam, DIALOGINFO *dlgInfo )
 {
-    DIALOGINFO * dlgInfo;
-    BOOL result = FALSE;
-    WND * wndPtr = WIN_FindWndPtr( hwnd );
-    
-    if (!wndPtr) return 0;
-    dlgInfo = (DIALOGINFO *)&wndPtr->wExtra;
-
-    dlgInfo->msgResult = 0;
-    if (dlgInfo->dlgProc)
-    {
-	  /* Call dialog procedure */
-	result = (BOOL)CallWindowProc16( dlgInfo->dlgProc, hwnd, 
-                                         msg, wParam, lParam );
-
-	  /* Check if window destroyed by dialog procedure */
-	wndPtr = WIN_FindWndPtr( hwnd );
-	if (!wndPtr) return result;
-    }
-    
-    if (!result) switch(msg)
+    switch(msg)
     {
 	case WM_INITDIALOG:
-	    break;
+	    return 0;
 
         case WM_ERASEBKGND:
 	    FillWindow( hwnd, hwnd, (HDC)wParam, (HBRUSH)CTLCOLOR_DLG );
-	    return TRUE;
+	    return 1;
 
 	case WM_NCDESTROY:
 
@@ -166,28 +150,34 @@
 		dlgInfo->hMenu = 0;
 	    }
 
+            /* Delete window procedure */
+            if (dlgInfo->dlgProc)
+            {
+                WINPROC_FreeWinProc( dlgInfo->dlgProc );
+                dlgInfo->dlgProc = 0;
+            }
+
 	      /* Window clean-up */
-	    DefWindowProc16( hwnd, msg, wParam, lParam );
-	    break;
+	    return DefWindowProc32A( hwnd, msg, wParam, lParam );
 
 	case WM_SHOWWINDOW:
 	    if (!wParam) DEFDLG_SaveFocus( hwnd, dlgInfo );
-	    return DefWindowProc16( hwnd, msg, wParam, lParam );
+	    return DefWindowProc32A( hwnd, msg, wParam, lParam );
 
 	case WM_ACTIVATE:
 	    if (wParam) DEFDLG_RestoreFocus( hwnd, dlgInfo );
 	    else DEFDLG_SaveFocus( hwnd, dlgInfo );
-	    break;
+	    return 0;
 
 	case WM_SETFOCUS:
 	    DEFDLG_RestoreFocus( hwnd, dlgInfo );
-	    break;
+	    return 0;
 
         case DM_SETDEFID:
-            if (dlgInfo->fEnd) return TRUE;
+            if (dlgInfo->fEnd) return 1;
             DEFDLG_SetDefButton( hwnd, dlgInfo,
                                  wParam ? GetDlgItem( hwnd, wParam ) : 0 );
-            return TRUE;
+            return 1;
 
         case DM_GETDEFID:
             if (dlgInfo->fEnd || !dlgInfo->msgResult) return 0;
@@ -207,16 +197,142 @@
                 if (hwndDest) DEFDLG_SetFocus( hwnd, hwndDest );
                 DEFDLG_SetDefButton( hwnd, dlgInfo, hwndDest );
             }
-            break;
+            return 0;
 
         case WM_CLOSE:
             EndDialog( hwnd, TRUE );
             DestroyWindow( hwnd );
             return 0;
+    }
+    return 0;
+}
+
+
+/***********************************************************************
+ *           DefDlgProc16   (USER.308)
+ */
+LRESULT DefDlgProc16( HWND16 hwnd, UINT16 msg, WPARAM16 wParam, LPARAM lParam )
+{
+    DIALOGINFO * dlgInfo;
+    BOOL16 result = FALSE;
+    WND * wndPtr = WIN_FindWndPtr( hwnd );
+    
+    if (!wndPtr) return 0;
+    dlgInfo = (DIALOGINFO *)&wndPtr->wExtra;
+
+    dlgInfo->msgResult = 0;
+    if (dlgInfo->dlgProc)
+    {
+	  /* Call dialog procedure */
+	result = (BOOL16)CallWindowProc16( (WNDPROC16)dlgInfo->dlgProc, hwnd, 
+                                           msg, wParam, lParam );
+
+        /* Check if window was destroyed by dialog procedure */
+        if (result || !IsWindow( hwnd )) return result;
+    }
+    
+    switch(msg)
+    {
+	case WM_INITDIALOG:
+        case WM_ERASEBKGND:
+	case WM_NCDESTROY:
+	case WM_SHOWWINDOW:
+	case WM_ACTIVATE:
+	case WM_SETFOCUS:
+        case DM_SETDEFID:
+        case DM_GETDEFID:
+	case WM_NEXTDLGCTL:
+        case WM_CLOSE:
+            return DEFDLG_Proc( (HWND32)hwnd, msg, (WPARAM32)wParam,
+                                lParam, dlgInfo );
 
 	default:
 	    return DefWindowProc16( hwnd, msg, wParam, lParam );
     }
-        
-    return result;
+}
+
+
+/***********************************************************************
+ *           DefDlgProc32A   (USER32.119)
+ */
+LRESULT DefDlgProc32A( HWND32 hwnd, UINT32 msg, WPARAM32 wParam, LPARAM lParam)
+{
+    DIALOGINFO * dlgInfo;
+    BOOL16 result = FALSE;
+    WND * wndPtr = WIN_FindWndPtr( hwnd );
+    
+    if (!wndPtr) return 0;
+    dlgInfo = (DIALOGINFO *)&wndPtr->wExtra;
+
+    dlgInfo->msgResult = 0;
+    if (dlgInfo->dlgProc)
+    {
+	  /* Call dialog procedure */
+	result = (BOOL16)CallWindowProc32A( (WNDPROC32)dlgInfo->dlgProc, hwnd, 
+                                            msg, wParam, lParam );
+
+        /* Check if window was destroyed by dialog procedure */
+        if (result || !IsWindow( hwnd )) return result;
+    }
+    
+    switch(msg)
+    {
+	case WM_INITDIALOG:
+        case WM_ERASEBKGND:
+	case WM_NCDESTROY:
+	case WM_SHOWWINDOW:
+	case WM_ACTIVATE:
+	case WM_SETFOCUS:
+        case DM_SETDEFID:
+        case DM_GETDEFID:
+	case WM_NEXTDLGCTL:
+        case WM_CLOSE:
+            return DEFDLG_Proc( hwnd, msg, wParam, lParam, dlgInfo );
+
+	default:
+	    return DefWindowProc32A( hwnd, msg, wParam, lParam );
+    }
+}
+
+
+/***********************************************************************
+ *           DefDlgProc32W   (USER32.120)
+ */
+LRESULT DefDlgProc32W( HWND32 hwnd, UINT32 msg, WPARAM32 wParam, LPARAM lParam)
+{
+    DIALOGINFO * dlgInfo;
+    BOOL16 result = FALSE;
+    WND * wndPtr = WIN_FindWndPtr( hwnd );
+    
+    if (!wndPtr) return 0;
+    dlgInfo = (DIALOGINFO *)&wndPtr->wExtra;
+
+    dlgInfo->msgResult = 0;
+    if (dlgInfo->dlgProc)
+    {
+	  /* Call dialog procedure */
+	result = (BOOL16)CallWindowProc32W( (WNDPROC32)dlgInfo->dlgProc, hwnd, 
+                                            msg, wParam, lParam );
+
+        /* Check if window was destroyed by dialog procedure */
+        if (result || !IsWindow( hwnd )) return result;
+    }
+    
+    switch(msg)
+    {
+	case WM_INITDIALOG:
+        case WM_ERASEBKGND:
+	case WM_NCDESTROY:
+	case WM_SHOWWINDOW:
+	case WM_ACTIVATE:
+	case WM_SETFOCUS:
+        case DM_SETDEFID:
+        case DM_GETDEFID:
+	case WM_NEXTDLGCTL:
+        case WM_CLOSE:
+            return DEFDLG_Proc( hwnd, msg, wParam, lParam, dlgInfo );
+
+	default:
+	    return DefWindowProc32W( hwnd, msg, wParam, lParam );
+    }
 }
diff --git a/windows/defwnd.c b/windows/defwnd.c
index d3eb72a..bed9009 100644
--- a/windows/defwnd.c
+++ b/windows/defwnd.c
@@ -377,7 +377,7 @@
         if (wParam && wndPtr->text)
         {
             lstrcpyn( (LPSTR)PTR_SEG_TO_LIN(lParam), wndPtr->text, wParam );
-            return (LRESULT)strlen( (LPSTR)PTR_SEG_TO_LIN(lParam) ) + 1;
+            result = (LRESULT)strlen( (LPSTR)PTR_SEG_TO_LIN(lParam) ) + 1;
         }
         break;
 
@@ -442,7 +442,7 @@
         if (wParam && wndPtr->text)
         {
             lstrcpyn( (LPSTR)lParam, wndPtr->text, wParam );
-            return (LRESULT)strlen( (LPSTR)lParam ) + 1;
+            result = (LRESULT)strlen( (LPSTR)lParam ) + 1;
         }
         break;
 
diff --git a/windows/dialog.c b/windows/dialog.c
index edf4623..4e010bc 100644
--- a/windows/dialog.c
+++ b/windows/dialog.c
@@ -1,8 +1,7 @@
 /*
  * Dialog functions
  *
- * Copyright 1993, 1994 Alexandre Julliard
- *
+ * Copyright 1993, 1994, 1996 Alexandre Julliard
  */
 
 #include <stdlib.h>
@@ -13,15 +12,50 @@
 #include "heap.h"
 #include "win.h"
 #include "ldt.h"
+#include "resource32.h"
 #include "stackframe.h"
+#include "string32.h"
 #include "user.h"
+#include "winproc.h"
 #include "message.h"
 #include "stddebug.h"
-/* #define DEBUG_DIALOG */
 #include "debug.h"
 
+
+  /* Dialog control information */
+typedef struct
+{
+    DWORD      style;
+    DWORD      exStyle;
+    INT16      x;
+    INT16      y;
+    INT16      cx;
+    INT16      cy;
+    UINT16     id;
+    LPCSTR     className;
+    LPCSTR     windowName;
+    LPVOID     data;
+} DLG_CONTROL_INFO;
+
+  /* Dialog template */
+typedef struct
+{
+    DWORD      style;
+    DWORD      exStyle;
+    UINT16     nbItems;
+    INT16      x;
+    INT16      y;
+    INT16      cx;
+    INT16      cy;
+    LPCSTR     menuName;
+    LPCSTR     className;
+    LPCSTR     caption;
+    WORD       pointSize;
+    LPCSTR     faceName;
+} DLG_TEMPLATE;
+
   /* Dialog base units */
-WORD xBaseUnit = 0, yBaseUnit = 0;
+static WORD xBaseUnit = 0, yBaseUnit = 0;
 
 
 /***********************************************************************
@@ -36,9 +70,9 @@
     
       /* Calculate the dialog base units */
 
-    if (!(hdc = GetDC( 0 ))) return FALSE;
+    if (!(hdc = CreateDC( "DISPLAY", NULL, NULL, NULL ))) return FALSE;
     GetTextMetrics( hdc, &tm );
-    ReleaseDC( 0, hdc );
+    DeleteDC( hdc );
     xBaseUnit = tm.tmAveCharWidth;
     yBaseUnit = tm.tmHeight;
 
@@ -67,96 +101,278 @@
 
 
 /***********************************************************************
- *           DIALOG_GetControl
+ *           DIALOG_GetControl16
  *
  * Return the class and text of the control pointed to by ptr,
  * fill the header structure and return a pointer to the next control.
  */
-static SEGPTR DIALOG_GetControl( SEGPTR ptr, DLGCONTROLHEADER *header,
-                                 SEGPTR *class, SEGPTR *text )
+static LPCSTR DIALOG_GetControl16( LPCSTR p, DLG_CONTROL_INFO *info )
 {
-    unsigned char *base = (unsigned char *)PTR_SEG_TO_LIN( ptr );
-    unsigned char *p = base;
+    static char buffer[10];
 
-    header->x  = GET_WORD(p); p += sizeof(WORD);
-    header->y  = GET_WORD(p); p += sizeof(WORD);
-    header->cx = GET_WORD(p); p += sizeof(WORD);
-    header->cy = GET_WORD(p); p += sizeof(WORD);
-    header->id = GET_WORD(p); p += sizeof(WORD);
-    header->style = GET_DWORD(p); p += sizeof(DWORD);
+    info->x       = GET_WORD(p);  p += sizeof(WORD);
+    info->y       = GET_WORD(p);  p += sizeof(WORD);
+    info->cx      = GET_WORD(p);  p += sizeof(WORD);
+    info->cy      = GET_WORD(p);  p += sizeof(WORD);
+    info->id      = GET_WORD(p);  p += sizeof(WORD);
+    info->style   = GET_DWORD(p); p += sizeof(DWORD);
+    info->exStyle = 0;
 
     if (*p & 0x80)
     {
-        *class = MAKEINTRESOURCE( *p );
+        switch((BYTE)*p)
+        {
+            case 0x80: strcpy( buffer, "BUTTON" ); break;
+            case 0x81: strcpy( buffer, "EDIT" ); break;
+            case 0x82: strcpy( buffer, "STATIC" ); break;
+            case 0x83: strcpy( buffer, "LISTBOX" ); break;
+            case 0x84: strcpy( buffer, "SCROLLBAR" ); break;
+            case 0x85: strcpy( buffer, "COMBOBOX" ); break;
+            default:   buffer[0] = '\0'; break;
+        }
+        info->className = buffer;
         p++;
     }
     else 
     {
-	*class = ptr + (WORD)(p - base);
+	info->className = p;
 	p += strlen(p) + 1;
     }
+    dprintf_dialog(stddeb, "   %s ", info->className );
 
-    if (*p == 0xff)
+    if ((BYTE)*p == 0xff)
     {
 	  /* Integer id, not documented (?). Only works for SS_ICON controls */
-	*text = MAKEINTRESOURCE( GET_WORD(p+1) );
-	p += 4;
+	info->windowName = (LPCSTR)(UINT32)GET_WORD(p+1);
+	p += 3;
+        dprintf_dialog( stddeb,"%04x", LOWORD(info->windowName) );
     }
     else
     {
-	*text = ptr + (WORD)(p - base);
-	p += strlen(p) + 2;
+	info->windowName = p;
+	p += strlen(p) + 1;
+        dprintf_dialog(stddeb,"'%s'", info->windowName );
     }
-    return ptr + (WORD)(p - base);
+
+    info->data = (LPVOID)(*p ? p + 1 : NULL);  /* FIXME: is this right? */
+    p += *p + 1;
+
+    dprintf_dialog( stddeb," %d, %d, %d, %d, %d, %08lx, %08lx\n", 
+                    info->id, info->x, info->y, info->cx, info->cy,
+                    info->style, (DWORD)info->data);
+    return p;
 }
 
 
 /***********************************************************************
- *           DIALOG_ParseTemplate
+ *           DIALOG_GetControl32
  *
- * Fill a DLGTEMPLATE structure from the dialog template, and return
- * a pointer to the first control.
+ * Return the class and text of the control pointed to by ptr,
+ * fill the header structure and return a pointer to the next control.
  */
-static SEGPTR DIALOG_ParseTemplate( SEGPTR template, DLGTEMPLATE * result )
+static const WORD *DIALOG_GetControl32( const WORD *p, DLG_CONTROL_INFO *info )
 {
-    unsigned char *base = (unsigned char *)PTR_SEG_TO_LIN(template);
-    unsigned char * p = base;
- 
-    result->style = GET_DWORD(p); p += sizeof(DWORD);
-    result->nbItems = *p++;
-    result->x  = GET_WORD(p); p += sizeof(WORD);
-    result->y  = GET_WORD(p); p += sizeof(WORD);
-    result->cx = GET_WORD(p); p += sizeof(WORD);
-    result->cy = GET_WORD(p); p += sizeof(WORD);
+    static WCHAR buffer[10];
 
-    /* Get the menu name */
+    info->style   = GET_DWORD(p); p += 2;
+    info->exStyle = GET_DWORD(p); p += 2;
+    info->x       = GET_WORD(p); p++;
+    info->y       = GET_WORD(p); p++;
+    info->cx      = GET_WORD(p); p++;
+    info->cy      = GET_WORD(p); p++;
+    info->id      = GET_WORD(p); p++;
 
-    if (*p == 0xff)
+    if (GET_WORD(p) == 0xffff)
     {
-        result->menuName = MAKEINTRESOURCE( GET_WORD(p+1) );
-        p += 3;
-    }
-    else if (*p)
-    {
-        result->menuName = template + (WORD)(p - base);
-        p += strlen(p) + 1;
+        switch(GET_WORD(p+1))
+        {
+            case 0x80: STRING32_AnsiToUni( buffer, "BUTTON" ); break;
+            case 0x81: STRING32_AnsiToUni( buffer, "EDIT" ); break;
+            case 0x82: STRING32_AnsiToUni( buffer, "STATIC" ); break;
+            case 0x83: STRING32_AnsiToUni( buffer, "LISTBOX" ); break;
+            case 0x84: STRING32_AnsiToUni( buffer, "SCROLLBAR" ); break;
+            case 0x85: STRING32_AnsiToUni( buffer, "COMBOBOX" ); break;
+            default:   buffer[0] = '\0'; break;
+        }
+        info->className = (LPCSTR)buffer;
+        p += 2;
     }
     else
     {
+        info->className = (LPCSTR)p;
+        p += STRING32_lstrlenW( (LPCWSTR)p ) + 1;
+    }
+    dprintf_dialog(stddeb, "   %p ", info->className );
+
+    if (GET_WORD(p) == 0xffff)
+    {
+	info->windowName = (LPCSTR)(p + 1);
+	p += 2;
+        dprintf_dialog( stddeb,"%04x", LOWORD(info->windowName) );
+    }
+    else
+    {
+	info->windowName = (LPCSTR)p;
+        p += STRING32_lstrlenW( (LPCWSTR)p ) + 1;
+        dprintf_dialog(stddeb,"'%p'", info->windowName );
+    }
+
+    if (GET_WORD(p))
+    {
+        info->data = (LPVOID)(p + 1);
+        p += GET_WORD(p) / sizeof(WORD);
+    }
+    else info->data = NULL;
+    p++;
+
+    dprintf_dialog( stddeb," %d, %d, %d, %d, %d, %08lx, %08lx, %08lx\n", 
+                    info->id, info->x, info->y, info->cx, info->cy,
+                    info->style, info->exStyle, (DWORD)info->data);
+    /* Next control is on dword boundary */
+    return (const WORD *)((((int)p) + 3) & ~3);
+}
+
+
+/***********************************************************************
+ *           DIALOG_CreateControls
+ *
+ * Create the control windows for a dialog.
+ */
+static BOOL32 DIALOG_CreateControls( WND *pWnd, LPCSTR template, INT32 items,
+                                     HINSTANCE32 hInst, BOOL win32 )
+{
+    DIALOGINFO *dlgInfo = (DIALOGINFO *)pWnd->wExtra;
+    DLG_CONTROL_INFO info;
+    HWND32 hwndCtrl, hwndDefButton = 0;
+
+    dprintf_dialog(stddeb, " BEGIN\n" );
+    while (items--)
+    {
+        if (!win32)
+        {
+            HINSTANCE16 instance;
+            template = DIALOG_GetControl16( template, &info );
+            if (HIWORD(info.className) && !strcmp( info.className, "EDIT") &&
+                ((info.style & DS_LOCALEDIT) != DS_LOCALEDIT))
+            {
+                if (!dlgInfo->hDialogHeap)
+                {
+                    dlgInfo->hDialogHeap = GlobalAlloc16(GMEM_FIXED, 0x10000);
+                    if (!dlgInfo->hDialogHeap)
+                    {
+                        fprintf( stderr, "CreateDialogIndirectParam: Insufficient memory to create heap for edit control\n" );
+                        continue;
+                    }
+                    LocalInit(dlgInfo->hDialogHeap, 0, 0xffff);
+                }
+                instance = dlgInfo->hDialogHeap;
+            }
+            else instance = (HINSTANCE16)hInst;
+
+            hwndCtrl = CreateWindowEx16( info.exStyle | WS_EX_NOPARENTNOTIFY,
+                                         info.className, info.windowName,
+                                         info.style | WS_CHILD,
+                                         info.x * dlgInfo->xBaseUnit / 4,
+                                         info.y * dlgInfo->yBaseUnit / 8,
+                                         info.cx * dlgInfo->xBaseUnit / 4,
+                                         info.cy * dlgInfo->yBaseUnit / 8,
+                                         pWnd->hwndSelf, (HMENU)info.id,
+                                         instance, info.data );
+        }
+        else
+        {
+            template = (LPCSTR)DIALOG_GetControl32( (WORD *)template, &info );
+            hwndCtrl = CreateWindowEx32W( info.exStyle | WS_EX_NOPARENTNOTIFY,
+                                          (LPCWSTR)info.className,
+                                          (LPCWSTR)info.windowName,
+                                          info.style | WS_CHILD,
+                                          info.x * dlgInfo->xBaseUnit / 4,
+                                          info.y * dlgInfo->yBaseUnit / 8,
+                                          info.cx * dlgInfo->xBaseUnit / 4,
+                                          info.cy * dlgInfo->yBaseUnit / 8,
+                                          pWnd->hwndSelf, (HMENU)info.id,
+                                          hInst, info.data );
+        }
+        if (!hwndCtrl) return FALSE;
+
+        /* Make the control last one in Z-order, so that controls remain
+           in the order in which they were created */
+	SetWindowPos( hwndCtrl, HWND_BOTTOM, 0, 0, 0, 0,
+                      SWP_NOSIZE | SWP_NOMOVE | SWP_NOACTIVATE );
+
+            /* Send initialisation messages to the control */
+        if (dlgInfo->hUserFont) SendMessage32A( hwndCtrl, WM_SETFONT,
+                                               (WPARAM)dlgInfo->hUserFont, 0 );
+        if (SendMessage32A(hwndCtrl, WM_GETDLGCODE, 0, 0) & DLGC_DEFPUSHBUTTON)
+        {
+              /* If there's already a default push-button, set it back */
+              /* to normal and use this one instead. */
+            if (hwndDefButton)
+                SendMessage32A( hwndDefButton, BM_SETSTYLE32,
+                                BS_PUSHBUTTON,FALSE );
+            hwndDefButton = hwndCtrl;
+            dlgInfo->msgResult = GetWindowWord( hwndCtrl, GWW_ID );
+        }
+    }    
+    dprintf_dialog(stddeb, " END\n" );
+    return TRUE;
+}
+
+
+/***********************************************************************
+ *           DIALOG_ParseTemplate16
+ *
+ * Fill a DLG_TEMPLATE structure from the dialog template, and return
+ * a pointer to the first control.
+ */
+static LPCSTR DIALOG_ParseTemplate16( LPCSTR p, DLG_TEMPLATE * result )
+{
+    result->style   = GET_DWORD(p); p += sizeof(DWORD);
+    result->exStyle = 0;
+    result->nbItems = *p++;
+    result->x       = GET_WORD(p);  p += sizeof(WORD);
+    result->y       = GET_WORD(p);  p += sizeof(WORD);
+    result->cx      = GET_WORD(p);  p += sizeof(WORD);
+    result->cy      = GET_WORD(p);  p += sizeof(WORD);
+    dprintf_dialog( stddeb, "DIALOG %d, %d, %d, %d\n",
+                    result->x, result->y, result->cx, result->cy );
+    dprintf_dialog( stddeb, " STYLE %08lx\n", result->style );
+
+    /* Get the menu name */
+
+    switch( (BYTE)*p )
+    {
+    case 0:
         result->menuName = 0;
         p++;
+        break;
+    case 0xff:
+        result->menuName = (LPCSTR)(UINT32)GET_WORD( p + 1 );
+        p += 3;
+	dprintf_dialog(stddeb, " MENU %04x\n", LOWORD(result->menuName) );
+        break;
+    default:
+        result->menuName = p;
+        dprintf_dialog( stddeb, " MENU '%s'\n", p );
+        p += strlen(p) + 1;
+        break;
     }
 
     /* Get the class name */
 
-    if (*p) result->className = template + (WORD)(p - base);
+    if (*p)
+    {
+        result->className = p;
+        dprintf_dialog( stddeb, " CLASS '%s'\n", result->className );
+    }
     else result->className = DIALOG_CLASS_ATOM;
     p += strlen(p) + 1;
 
     /* Get the window caption */
 
-    result->caption = template + (WORD)(p - base);
+    result->caption = p;
     p += strlen(p) + 1;
+    dprintf_dialog( stddeb, " CAPTION '%s'\n", result->caption );
 
     /* Get the font name */
 
@@ -164,114 +380,130 @@
     {
 	result->pointSize = GET_WORD(p);
         p += sizeof(WORD);
-	result->faceName = template + (WORD)(p - base);
+	result->faceName = p;
         p += strlen(p) + 1;
+	dprintf_dialog( stddeb, " FONT %d,'%s'\n",
+                        result->pointSize, result->faceName );
+    }
+    return p;
+}
+
+
+/***********************************************************************
+ *           DIALOG_ParseTemplate32
+ *
+ * Fill a DLG_TEMPLATE structure from the dialog template, and return
+ * a pointer to the first control.
+ */
+static LPCSTR DIALOG_ParseTemplate32( LPCSTR template, DLG_TEMPLATE * result )
+{
+    const WORD *p = (const WORD *)template;
+
+    result->style   = GET_DWORD(p); p += 2;
+    result->exStyle = GET_DWORD(p); p += 2;
+    result->nbItems = GET_WORD(p); p++;
+    result->x       = GET_WORD(p); p++;
+    result->y       = GET_WORD(p); p++;
+    result->cx      = GET_WORD(p); p++;
+    result->cy      = GET_WORD(p); p++;
+    dprintf_dialog( stddeb, "DIALOG %d, %d, %d, %d\n",
+                    result->x, result->y, result->cx, result->cy );
+    dprintf_dialog( stddeb, " STYLE %08lx\n", result->style );
+    dprintf_dialog( stddeb, " EXSTYLE %08lx\n", result->exStyle );
+
+    /* Get the menu name */
+
+    switch(GET_WORD(p))
+    {
+    case 0x0000:
+        result->menuName = NULL;
+        p++;
+        break;
+    case 0xffff:
+        result->menuName = (LPCSTR)(UINT32)GET_WORD( p + 1 );
+        p += 2;
+	dprintf_dialog(stddeb, " MENU %04x\n", LOWORD(result->menuName) );
+        break;
+    default:
+        result->menuName = (LPCSTR)p;
+        dprintf_dialog( stddeb, " MENU '%p'\n", p );
+        p += STRING32_lstrlenW( (LPCWSTR)p ) + 1;
+        break;
     }
 
-    return template + (WORD)(p - base);
-}
+    /* Get the class name */
 
+    switch(GET_WORD(p))
+    {
+    case 0x0000:
+        result->className = DIALOG_CLASS_ATOM;
+        p++;
+        break;
+    case 0xffff:
+        result->className = (LPCSTR)(UINT32)GET_WORD( p + 1 );
+        p += 2;
+	dprintf_dialog(stddeb, " CLASS %04x\n", LOWORD(result->className) );
+        break;
+    default:
+        result->className = (LPCSTR)p;
+        dprintf_dialog( stddeb, " CLASS '%p'\n", p );
+        p += STRING32_lstrlenW( (LPCWSTR)p ) + 1;
+        break;
+    }
 
-/***********************************************************************
- *           DIALOG_DisplayTemplate
- */
-static void DIALOG_DisplayTemplate( DLGTEMPLATE * result )
-{
-    dprintf_dialog(stddeb, "DIALOG %d, %d, %d, %d\n", result->x, result->y,
-                   result->cx, result->cy );
-    dprintf_dialog(stddeb, " STYLE %08lx\n", result->style );
-    dprintf_dialog( stddeb, " CAPTION '%s'\n",
-                    (char *)PTR_SEG_TO_LIN(result->caption) );
+    /* Get the window caption */
 
-    if (HIWORD(result->className))
-        dprintf_dialog( stddeb, " CLASS '%s'\n",
-                        (char *)PTR_SEG_TO_LIN(result->className) );
-    else
-        dprintf_dialog( stddeb, " CLASS #%d\n", LOWORD(result->className) );
+    result->caption = (LPCSTR)p;
+    p += STRING32_lstrlenW( (LPCWSTR)p ) + 1;
+    dprintf_dialog( stddeb, " CAPTION '%p'\n", result->caption );
 
-    if (HIWORD(result->menuName))
-        dprintf_dialog( stddeb, " MENU '%s'\n",
-                        (char *)PTR_SEG_TO_LIN(result->menuName) );
-    else if (LOWORD(result->menuName))
-	dprintf_dialog(stddeb, " MENU %04x\n", LOWORD(result->menuName) );
+    /* Get the font name */
 
     if (result->style & DS_SETFONT)
-	dprintf_dialog( stddeb, " FONT %d,'%s'\n", result->pointSize,
-                        (char *)PTR_SEG_TO_LIN(result->faceName) );
+    {
+	result->pointSize = GET_WORD(p);
+        p++;
+	result->faceName = (LPCSTR)p;
+        p += STRING32_lstrlenW( (LPCWSTR)p ) + 1;
+	dprintf_dialog( stddeb, " FONT %d,'%p'\n",
+                        result->pointSize, result->faceName );
+    }
+    /* First control is on dword boundary */
+    return (LPCSTR)((((int)p) + 3) & ~3);
 }
 
 
 /***********************************************************************
- *           CreateDialog   (USER.89)
+ *           DIALOG_CreateIndirect
  */
-HWND CreateDialog( HINSTANCE hInst, SEGPTR dlgTemplate,
-		   HWND owner, DLGPROC dlgProc )
-{
-    return CreateDialogParam( hInst, dlgTemplate, owner, dlgProc, 0 );
-}
-
-
-/***********************************************************************
- *           CreateDialogParam   (USER.241)
- */
-HWND CreateDialogParam( HINSTANCE hInst, SEGPTR dlgTemplate,
-		        HWND owner, DLGPROC dlgProc, LPARAM param )
-{
-    HWND hwnd = 0;
-    HRSRC hRsrc;
-    HGLOBAL hmem;
-    SEGPTR data;
-
-    dprintf_dialog(stddeb, "CreateDialogParam: %04x,%08lx,%04x,%08lx,%ld\n",
-                   hInst, (DWORD)dlgTemplate, owner, (DWORD)dlgProc, param );
-     
-    if (!(hRsrc = FindResource( hInst, dlgTemplate, RT_DIALOG ))) return 0;
-    if (!(hmem = LoadResource( hInst, hRsrc ))) return 0;
-    if (!(data = WIN16_LockResource( hmem ))) hwnd = 0;
-    else hwnd = CreateDialogIndirectParam(hInst, data, owner, dlgProc, param);
-    FreeResource( hmem );
-    return hwnd;
-}
-
-
-/***********************************************************************
- *           CreateDialogIndirect   (USER.219)
- */
-HWND CreateDialogIndirect( HINSTANCE hInst, SEGPTR dlgTemplate,
-			   HWND owner, DLGPROC dlgProc )
-{
-    return CreateDialogIndirectParam( hInst, dlgTemplate, owner, dlgProc, 0 );
-}
-
-
-/***********************************************************************
- *           CreateDialogIndirectParam   (USER.242)
- */
-HWND CreateDialogIndirectParam( HINSTANCE hInst, SEGPTR dlgTemplate,
-			        HWND owner, DLGPROC dlgProc, LPARAM param )
+static HWND DIALOG_CreateIndirect( HINSTANCE hInst, LPCSTR dlgTemplate,
+                                   HWND owner, HANDLE32 dlgProc,
+                                   LPARAM param, BOOL win32 )
 {
     HMENU hMenu = 0;
     HFONT hFont = 0;
-    HWND hwnd, hwndCtrl;
+    HWND hwnd;
     RECT16 rect;
     WND * wndPtr;
-    int i;
-    DLGTEMPLATE template;
-    SEGPTR headerPtr;
+    DLG_TEMPLATE template;
     DIALOGINFO * dlgInfo;
-    DWORD exStyle = 0;
     WORD xUnit = xBaseUnit;
     WORD yUnit = yBaseUnit;
 
       /* Parse dialog template */
 
     if (!dlgTemplate) return 0;
-    headerPtr = DIALOG_ParseTemplate( dlgTemplate, &template );
-    if (debugging_dialog) DIALOG_DisplayTemplate( &template );
+    if (win32) dlgTemplate = DIALOG_ParseTemplate32( dlgTemplate, &template );
+    else dlgTemplate = DIALOG_ParseTemplate16( dlgTemplate, &template );
 
       /* Load menu */
 
-    if (template.menuName) hMenu = LoadMenu( hInst, template.menuName );
+    if (template.menuName)
+    {
+        LPSTR str = SEGPTR_STRDUP( template.menuName );  /* FIXME: win32 */
+        hMenu = LoadMenu( hInst, SEGPTR_GET(str) );
+        SEGPTR_FREE( str );
+    }
 
       /* Create custom font if needed */
 
@@ -282,7 +514,7 @@
 	hFont = CreateFont( -template.pointSize, 0, 0, 0, FW_DONTCARE,
 			    FALSE, FALSE, FALSE, DEFAULT_CHARSET, 0, 0,
 			    DEFAULT_QUALITY, FF_DONTCARE,
-                            (LPSTR)PTR_SEG_TO_LIN(template.faceName) );
+                            template.faceName );  /* FIXME: win32 */
 	if (hFont)
 	{
 	    TEXTMETRIC tm;
@@ -301,14 +533,15 @@
 	}
     }
     
-      /* Create dialog main window */
+    /* Create dialog main window */
 
     rect.left = rect.top = 0;
     rect.right = template.cx * xUnit / 4;
     rect.bottom = template.cy * yUnit / 8;
-    if (template.style & DS_MODALFRAME) exStyle |= WS_EX_DLGMODALFRAME;
+    if (template.style & DS_MODALFRAME)
+        template.exStyle |= WS_EX_DLGMODALFRAME;
     AdjustWindowRectEx16( &rect, template.style, 
-                          hMenu ? TRUE : FALSE , exStyle );
+                          hMenu ? TRUE : FALSE , template.exStyle );
     rect.right -= rect.left;
     rect.bottom -= rect.top;
 
@@ -322,10 +555,17 @@
             ClientToScreen16( owner, (POINT16 *)&rect );
     }
 
-    hwnd = CreateWindowEx16( exStyle, template.className, template.caption, 
-			   template.style & ~WS_VISIBLE,
-			   rect.left, rect.top, rect.right, rect.bottom,
-			   owner, hMenu, hInst, (SEGPTR)0 );
+    if (win32)
+        hwnd = CreateWindowEx32W(template.exStyle, (LPCWSTR)template.className,
+                                 (LPCWSTR)template.caption,
+                                 template.style & ~WS_VISIBLE,
+                                 rect.left, rect.top, rect.right, rect.bottom,
+                                 owner, hMenu, hInst, NULL );
+    else
+        hwnd = CreateWindowEx16(template.exStyle, template.className,
+                                template.caption, template.style & ~WS_VISIBLE,
+                                rect.left, rect.top, rect.right, rect.bottom,
+                                owner, hMenu, hInst, NULL );
     if (!hwnd)
     {
 	if (hFont) DeleteObject( hFont );
@@ -334,137 +574,161 @@
     }
     wndPtr = WIN_FindWndPtr( hwnd );
 
-      /* Create control windows */
-
-    dprintf_dialog(stddeb, " BEGIN\n" );
-
-    dlgInfo = (DIALOGINFO *)wndPtr->wExtra;
-    dlgInfo->msgResult = 0;  /* This is used to store the default button id */
-    dlgInfo->hDialogHeap = 0;
-
-    for (i = 0; i < template.nbItems; i++)
-    {
-	DLGCONTROLHEADER header;
-	SEGPTR className, winName;
-        HWND hwndDefButton = 0;
-        char buffer[10];
-
-	headerPtr = DIALOG_GetControl( headerPtr, &header,
-                                       &className, &winName );
-
-        if (!HIWORD(className))
-        {
-            switch(LOWORD(className))
-            {
-            case 0x80: strcpy( buffer, "BUTTON" ); break;
-            case 0x81: strcpy( buffer, "EDIT" ); break;
-            case 0x82: strcpy( buffer, "STATIC" ); break;
-            case 0x83: strcpy( buffer, "LISTBOX" ); break;
-            case 0x84: strcpy( buffer, "SCROLLBAR" ); break;
-            case 0x85: strcpy( buffer, "COMBOBOX" ); break;
-            default:   buffer[0] = '\0'; break;
-            }
-            className = MAKE_SEGPTR(buffer);
-        }
-
-        if (HIWORD(className))
-            dprintf_dialog(stddeb, "   %s ", (char*)PTR_SEG_TO_LIN(className));
-        else dprintf_dialog(stddeb, "   %04x ", LOWORD(className) );
-	if (HIWORD(winName))
-            dprintf_dialog(stddeb,"'%s'", (char *)PTR_SEG_TO_LIN(winName) );
-	else dprintf_dialog(stddeb,"%04x", LOWORD(winName) );
-
-	dprintf_dialog(stddeb," %d, %d, %d, %d, %d, %08lx\n", 
-                       header.id, header.x, header.y, 
-                       header.cx, header.cy, header.style );
-
-	if (HIWORD(className) &&
-            !strcmp( (char *)PTR_SEG_TO_LIN(className), "EDIT") &&
-            ((header.style & DS_LOCALEDIT) != DS_LOCALEDIT))
-        {
-	    if (!dlgInfo->hDialogHeap)
-            {
-		dlgInfo->hDialogHeap = GlobalAlloc16(GMEM_FIXED, 0x10000);
-		if (!dlgInfo->hDialogHeap)
-                {
-		    fprintf(stderr,"CreateDialogIndirectParam: Insufficient memory to create heap for edit control\n");
-		    continue;
-		}
-		LocalInit(dlgInfo->hDialogHeap, 0, 0xffff);
-	    }
-	    hwndCtrl = CreateWindowEx16(WS_EX_NOPARENTNOTIFY, className, winName,
-                                      header.style | WS_CHILD,
-                                      header.x * xUnit / 4,
-                                      header.y * yUnit / 8,
-                                      header.cx * xUnit / 4,
-                                      header.cy * yUnit / 8,
-                                      hwnd, (HMENU)header.id,
-                                      dlgInfo->hDialogHeap, (SEGPTR)0 );
-	}
-	else
-        {
-	    hwndCtrl = CreateWindowEx16( WS_EX_NOPARENTNOTIFY, className,
-                                         winName,
-                                         header.style | WS_CHILD,
-                                         header.x * xUnit / 4,
-                                         header.y * yUnit / 8,
-                                         header.cx * xUnit / 4,
-                                         header.cy * yUnit / 8,
-                                         hwnd, (HMENU)header.id,
-                                         hInst, (SEGPTR)0 );
-	}
-
-        /* Make the control last one in Z-order, so that controls remain
-           in the order in which they were created */
-	SetWindowPos( hwndCtrl, HWND_BOTTOM, 0, 0, 0, 0,
-                      SWP_NOSIZE | SWP_NOMOVE | SWP_NOACTIVATE );
-
-            /* Send initialisation messages to the control */
-        if (hFont) SendMessage16( hwndCtrl, WM_SETFONT, (WPARAM)hFont, 0 );
-        if (SendMessage16( hwndCtrl, WM_GETDLGCODE, 0, 0 ) & DLGC_DEFPUSHBUTTON)
-        {
-              /* If there's already a default push-button, set it back */
-              /* to normal and use this one instead. */
-            if (hwndDefButton)
-                SendMessage32A( hwndDefButton, BM_SETSTYLE32,
-                                BS_PUSHBUTTON,FALSE );
-            hwndDefButton = hwndCtrl;
-            dlgInfo->msgResult = GetWindowWord( hwndCtrl, GWW_ID );
-        }
-    }    
-
-    dprintf_dialog(stddeb, " END\n" );
-    
       /* Initialise dialog extra data */
 
+    dlgInfo = (DIALOGINFO *)wndPtr->wExtra;
     dlgInfo->dlgProc   = dlgProc;
     dlgInfo->hUserFont = hFont;
     dlgInfo->hMenu     = hMenu;
     dlgInfo->xBaseUnit = xUnit;
     dlgInfo->yBaseUnit = yUnit;
+    dlgInfo->msgResult = 0;  /* This is used to store the default button id */
+    dlgInfo->hDialogHeap = 0;
+
+    /* Create controls */
+
+    if (!DIALOG_CreateControls( wndPtr, dlgTemplate, template.nbItems,
+                                hInst, win32 ))
+    {
+        DestroyWindow( hwnd );
+        return 0;
+    }
+
+    /* Send initialisation messages and set focus */
+
     dlgInfo->hwndFocus = DIALOG_GetFirstTabItem( hwnd );
-
-      /* Send initialisation messages and set focus */
-
     if (dlgInfo->hUserFont)
-	SendMessage16( hwnd, WM_SETFONT, (WPARAM)dlgInfo->hUserFont, 0 );
-    if (SendMessage16( hwnd, WM_INITDIALOG, (WPARAM)dlgInfo->hwndFocus, param ))
+	SendMessage32A( hwnd, WM_SETFONT, (WPARAM)dlgInfo->hUserFont, 0 );
+    if (SendMessage32A(hwnd, WM_INITDIALOG, (WPARAM)dlgInfo->hwndFocus, param))
 	SetFocus( dlgInfo->hwndFocus );
-    if (template.style & WS_VISIBLE) ShowWindow(hwnd, SW_SHOW);
+    if (template.style & WS_VISIBLE) ShowWindow( hwnd, SW_SHOW );
     return hwnd;
 }
 
 
 /***********************************************************************
+ *           CreateDialog16   (USER.89)
+ */
+HWND16 CreateDialog16( HINSTANCE16 hInst, SEGPTR dlgTemplate,
+                       HWND16 owner, DLGPROC dlgProc )
+{
+    return CreateDialogParam16( hInst, dlgTemplate, owner, dlgProc, 0 );
+}
+
+
+/***********************************************************************
+ *           CreateDialogParam16   (USER.241)
+ */
+HWND16 CreateDialogParam16( HINSTANCE16 hInst, SEGPTR dlgTemplate,
+                            HWND16 owner, DLGPROC dlgProc, LPARAM param )
+{
+    HWND16 hwnd = 0;
+    HRSRC hRsrc;
+    HGLOBAL16 hmem;
+    LPCVOID data;
+
+    dprintf_dialog(stddeb, "CreateDialogParam16: %04x,%08lx,%04x,%08lx,%ld\n",
+                   hInst, (DWORD)dlgTemplate, owner, (DWORD)dlgProc, param );
+
+    if (!(hRsrc = FindResource( hInst, dlgTemplate, RT_DIALOG ))) return 0;
+    if (!(hmem = LoadResource( hInst, hRsrc ))) return 0;
+    if (!(data = LockResource( hmem ))) hwnd = 0;
+    else hwnd = CreateDialogIndirectParam16( hInst, data, owner,
+                                             dlgProc, param );
+    FreeResource( hmem );
+    return hwnd;
+}
+
+
+/***********************************************************************
+ *           CreateDialogParam32A   (USER32.72)
+ */
+HWND32 CreateDialogParam32A( HINSTANCE32 hInst, LPCSTR name,
+                             HWND32 owner, DLGPROC dlgProc, LPARAM param )
+{
+    if (HIWORD(name))
+    {
+        LPWSTR str = STRING32_DupAnsiToUni( name );
+        HWND32 hwnd = CreateDialogParam32W( hInst, str, owner, dlgProc, param);
+        free( str );
+        return hwnd;
+    }
+    return CreateDialogParam32W( hInst, (LPCWSTR)name, owner, dlgProc, param );
+}
+
+
+/***********************************************************************
+ *           CreateDialogParam32W   (USER32.73)
+ */
+HWND32 CreateDialogParam32W( HINSTANCE32 hInst, LPCWSTR name,
+                             HWND32 owner, DLGPROC dlgProc, LPARAM param )
+{
+    HANDLE32 hrsrc = FindResource32( hInst, name, (LPWSTR)RT_DIALOG );
+    if (!hrsrc) return 0;
+    return CreateDialogIndirectParam32W( hInst, LoadResource32( hInst, hrsrc ),
+                                         owner, dlgProc, param );
+}
+
+
+/***********************************************************************
+ *           CreateDialogIndirect16   (USER.219)
+ */
+HWND16 CreateDialogIndirect16( HINSTANCE16 hInst, LPCVOID dlgTemplate,
+                               HWND16 owner, DLGPROC dlgProc )
+{
+    return CreateDialogIndirectParam16( hInst, dlgTemplate, owner, dlgProc, 0);
+}
+
+
+/***********************************************************************
+ *           CreateDialogIndirectParam16   (USER.242)
+ */
+HWND16 CreateDialogIndirectParam16( HINSTANCE16 hInst, LPCVOID dlgTemplate,
+                                    HWND16 owner, DLGPROC dlgProc,
+                                    LPARAM param )
+{
+    HANDLE32 proc = WINPROC_AllocWinProc( (UINT32)dlgProc, WIN_PROC_16 );
+    return DIALOG_CreateIndirect( hInst, dlgTemplate,
+                                  owner, proc, param, FALSE );
+}
+
+
+/***********************************************************************
+ *           CreateDialogIndirectParam32A   (USER32.69)
+ */
+HWND32 CreateDialogIndirectParam32A( HINSTANCE32 hInst, LPCVOID dlgTemplate,
+                                     HWND32 owner, DLGPROC dlgProc,
+                                     LPARAM param )
+{
+    HANDLE32 proc = WINPROC_AllocWinProc( (UINT32)dlgProc, WIN_PROC_32A );
+    return DIALOG_CreateIndirect( hInst, dlgTemplate,
+                                  owner, proc, param, TRUE );
+}
+
+
+/***********************************************************************
+ *           CreateDialogIndirectParam32W   (USER32.71)
+ */
+HWND32 CreateDialogIndirectParam32W( HINSTANCE32 hInst, LPCVOID dlgTemplate,
+                                     HWND32 owner, DLGPROC dlgProc,
+                                     LPARAM param )
+{
+    HANDLE32 proc = WINPROC_AllocWinProc( (UINT32)dlgProc, WIN_PROC_32W );
+    return DIALOG_CreateIndirect( hInst, dlgTemplate,
+                                  owner, proc, param, TRUE );
+}
+
+
+/***********************************************************************
  *           DIALOG_DoDialogBox
  */
-int DIALOG_DoDialogBox( HWND hwnd, HWND owner )
+static INT32 DIALOG_DoDialogBox( HWND hwnd, HWND owner )
 {
     WND * wndPtr;
     DIALOGINFO * dlgInfo;
     HANDLE msgHandle;
     MSG* lpmsg;
-    int retval;
+    INT32 retval;
 
       /* Owner must be a top-level window */
     owner = WIN_GetTopParent( owner );
@@ -495,62 +759,108 @@
 
 
 /***********************************************************************
- *           DialogBox   (USER.87)
+ *           DialogBox16   (USER.87)
  */
-INT DialogBox( HINSTANCE hInst, SEGPTR dlgTemplate,
-	       HWND owner, DLGPROC dlgProc )
+INT16 DialogBox16( HINSTANCE16 hInst, SEGPTR dlgTemplate,
+                   HWND16 owner, DLGPROC dlgProc )
 {
-    return DialogBoxParam( hInst, dlgTemplate, owner, dlgProc, 0 );
+    return DialogBoxParam16( hInst, dlgTemplate, owner, dlgProc, 0 );
 }
 
 
 /***********************************************************************
- *           DialogBoxParam   (USER.239)
+ *           DialogBoxParam16   (USER.239)
  */
-INT DialogBoxParam( HINSTANCE hInst, SEGPTR dlgTemplate,
-		    HWND owner, DLGPROC dlgProc, LPARAM param )
+INT16 DialogBoxParam16( HINSTANCE16 hInst, SEGPTR template,
+                        HWND16 owner, DLGPROC dlgProc, LPARAM param )
 {
-    HWND hwnd;
-    
-    dprintf_dialog(stddeb, "DialogBoxParam: %04x,%08lx,%04x,%08lx,%ld\n",
-                   hInst, (DWORD)dlgTemplate, owner, (DWORD)dlgProc, param );
-    hwnd = CreateDialogParam( hInst, dlgTemplate, owner, dlgProc, param );
+    HWND16 hwnd = CreateDialogParam16( hInst, template, owner, dlgProc, param);
+    if (hwnd) return (INT16)DIALOG_DoDialogBox( hwnd, owner );
+    return -1;
+}
+
+
+/***********************************************************************
+ *           DialogBoxParam32A   (USER32.138)
+ */
+INT32 DialogBoxParam32A( HINSTANCE32 hInst, LPCSTR name,
+                         HWND32 owner, DLGPROC dlgProc, LPARAM param )
+{
+    HWND32 hwnd = CreateDialogParam32A( hInst, name, owner, dlgProc, param );
     if (hwnd) return DIALOG_DoDialogBox( hwnd, owner );
     return -1;
 }
 
 
 /***********************************************************************
- *           DialogBoxIndirect   (USER.218)
+ *           DialogBoxParam32W   (USER32.139)
  */
-INT DialogBoxIndirect( HINSTANCE hInst, HANDLE dlgTemplate,
-		       HWND owner, DLGPROC dlgProc )
+INT32 DialogBoxParam32W( HINSTANCE32 hInst, LPCWSTR name,
+                         HWND32 owner, DLGPROC dlgProc, LPARAM param )
 {
-    return DialogBoxIndirectParam( hInst, dlgTemplate, owner, dlgProc, 0 );
+    HWND32 hwnd = CreateDialogParam32W( hInst, name, owner, dlgProc, param );
+    if (hwnd) return DIALOG_DoDialogBox( hwnd, owner );
+    return -1;
 }
 
 
 /***********************************************************************
- *           DialogBoxIndirectParam   (USER.240)
+ *           DialogBoxIndirect16   (USER.218)
  */
-INT DialogBoxIndirectParam( HINSTANCE hInst, HANDLE dlgTemplate,
-			    HWND owner, DLGPROC dlgProc, LPARAM param )
+INT16 DialogBoxIndirect16( HINSTANCE16 hInst, HANDLE16 dlgTemplate,
+                           HWND16 owner, DLGPROC dlgProc )
 {
-    HWND hwnd;
-    SEGPTR ptr;
+    return DialogBoxIndirectParam16( hInst, dlgTemplate, owner, dlgProc, 0 );
+}
 
-    if (!(ptr = (SEGPTR)WIN16_GlobalLock16( dlgTemplate ))) return -1;
-    hwnd = CreateDialogIndirectParam( hInst, ptr, owner, dlgProc, param );
+
+/***********************************************************************
+ *           DialogBoxIndirectParam16   (USER.240)
+ */
+INT16 DialogBoxIndirectParam16( HINSTANCE16 hInst, HANDLE16 dlgTemplate,
+                                HWND16 owner, DLGPROC dlgProc, LPARAM param )
+{
+    HWND16 hwnd;
+    LPCVOID ptr;
+
+    if (!(ptr = GlobalLock16( dlgTemplate ))) return -1;
+    hwnd = CreateDialogIndirectParam16( hInst, ptr, owner, dlgProc, param );
     GlobalUnlock16( dlgTemplate );
+    if (hwnd) return (INT16)DIALOG_DoDialogBox( hwnd, owner );
+    return -1;
+}
+
+
+/***********************************************************************
+ *           DialogBoxIndirectParam32A   (USER32.135)
+ */
+INT32 DialogBoxIndirectParam32A( HINSTANCE32 hInstance, LPCVOID template,
+                                 HWND32 owner, DLGPROC dlgProc ,LPARAM param )
+{
+    HWND32 hwnd = CreateDialogIndirectParam32A( hInstance, template,
+                                                owner, dlgProc, param );
     if (hwnd) return DIALOG_DoDialogBox( hwnd, owner );
     return -1;
 }
 
 
 /***********************************************************************
- *           EndDialog   (USER.88)
+ *           DialogBoxIndirectParam32W   (USER32.137)
  */
-BOOL EndDialog( HWND hwnd, INT retval )
+INT32 DialogBoxIndirectParam32W( HINSTANCE32 hInstance, LPCVOID template,
+                                 HWND32 owner, DLGPROC dlgProc ,LPARAM param )
+{
+    HWND32 hwnd = CreateDialogIndirectParam32W( hInstance, template,
+                                                owner, dlgProc, param );
+    if (hwnd) return DIALOG_DoDialogBox( hwnd, owner );
+    return -1;
+}
+
+
+/***********************************************************************
+ *           EndDialog   (USER.88) (USER32.173)
+ */
+BOOL16 EndDialog( HWND32 hwnd, INT32 retval )
 {
     WND * wndPtr = WIN_FindWndPtr( hwnd );
     DIALOGINFO * dlgInfo = (DIALOGINFO *)wndPtr->wExtra;
diff --git a/windows/event.c b/windows/event.c
index 53beabe..ce75d90 100644
--- a/windows/event.c
+++ b/windows/event.c
@@ -32,6 +32,7 @@
 #include "registers.h"
 #include "stddebug.h"
 #include "debug.h"
+#include "dde_proc.h"
 
 
 #ifdef ndef
@@ -628,14 +629,18 @@
  */
 static void EVENT_ConfigureNotify( HWND hwnd, XConfigureEvent *event )
 {
-    if (hwnd == GetDesktopWindow())
+    /* FIXME: with -desktop xxx we get this event _before_ desktop 
+     * window structure is created. WIN_GetDesktop() check is a hack.
+     */
+
+    if ( !WIN_GetDesktop() || hwnd == GetDesktopWindow())
     {
         desktopX = event->x;
 	desktopY = event->y;
     }
     else
     {
-      /* A managed window; most of this code is shamelessly
+      /* Managed window; most of this code is shamelessly
        * stolen from SetWindowPos - FIXME: outdated
        */
       
@@ -710,17 +715,20 @@
 static void EVENT_SelectionRequest( HWND hwnd, XSelectionRequestEvent *event )
 {
     XSelectionEvent result;
-    Atom rprop;
-    Window request=event->requestor;
-    rprop=None;
+    Atom 	    rprop = None;
+    Window 	    request = event->requestor;
+
     if(event->target == XA_STRING)
     {
 	HANDLE hText;
 	LPSTR text;
-        rprop=event->property;
-	if(rprop == None)rprop=event->target;
-        if(event->selection!=XA_PRIMARY)rprop=None;
-        else if(!IsClipboardFormatAvailable(CF_TEXT))rprop=None;
+
+        rprop = event->property;
+
+	if(rprop == None) rprop = event->target;
+
+        if(event->selection!=XA_PRIMARY) rprop = None;
+        else if(!CLIPBOARD_IsPresent(CF_TEXT)) rprop = None;
 	else{
             /* Don't worry if we can't open */
 	    BOOL couldOpen=OpenClipboard(hwnd);
@@ -733,8 +741,10 @@
 	    if(couldOpen)CloseClipboard();
 	}
     }
-    if(rprop==None) dprintf_event(stddeb,"Request for %s ignored\n",
-	XGetAtomName(display,event->target));
+
+    if(rprop==None) 
+       dprintf_event(stddeb,"Request for %s ignored\n", XGetAtomName(display,event->target));
+
     result.type=SelectionNotify;
     result.display=display;
     result.requestor=request;
diff --git a/windows/mdi.c b/windows/mdi.c
index b515e58..a48aea3 100644
--- a/windows/mdi.c
+++ b/windows/mdi.c
@@ -356,10 +356,11 @@
         style |= (WS_VISIBLE | WS_OVERLAPPEDWINDOW);
       }
  
-    hwnd = CreateWindow16( cs->szClass, cs->szTitle, style, 
+    hwnd = CreateWindow16( (LPCSTR)PTR_SEG_TO_LIN(cs->szClass),
+                           (LPCSTR)PTR_SEG_TO_LIN(cs->szTitle), style, 
 			  cs->x, cs->y, cs->cx, cs->cy, parent, 
                          (HMENU)(DWORD)(WORD)wIDmenu, w->hInstance, 
-			 (SEGPTR)lParam);
+			 (LPVOID)lParam);
 
     if (hwnd)
     {
diff --git a/windows/message.c b/windows/message.c
index aef426c..e12db33 100644
--- a/windows/message.c
+++ b/windows/message.c
@@ -699,7 +699,8 @@
     }
 
     SPY_EnterMessage( SPY_SENDMESSAGE16, hwnd, msg, wParam, lParam );
-    ret = CallWindowProc16( wndPtr->lpfnWndProc, hwnd, msg, wParam, lParam );
+    ret = CallWindowProc16( (WNDPROC16)wndPtr->winproc,
+                            hwnd, msg, wParam, lParam );
     SPY_ExitMessage( SPY_RESULT_OK16, hwnd, msg, ret );
     return ret;
 }
@@ -738,7 +739,7 @@
     }
 
     SPY_EnterMessage( SPY_SENDMESSAGE32, hwnd, msg, wParam, lParam );
-    ret = CallWindowProc32A( (WNDPROC32)wndPtr->lpfnWndProc,
+    ret = CallWindowProc32A( (WNDPROC32)wndPtr->winproc,
                              hwnd, msg, wParam, lParam );
     SPY_ExitMessage( SPY_RESULT_OK32, hwnd, msg, ret );
     return ret;
@@ -778,7 +779,7 @@
     }
 
     SPY_EnterMessage( SPY_SENDMESSAGE32, hwnd, msg, wParam, lParam );
-    ret = CallWindowProc32W( (WNDPROC32)wndPtr->lpfnWndProc,
+    ret = CallWindowProc32W( (WNDPROC32)wndPtr->winproc,
                              hwnd, msg, wParam, lParam );
     SPY_ExitMessage( SPY_RESULT_OK32, hwnd, msg, ret );
     return ret;
@@ -869,14 +870,14 @@
 
     if (!msg->hwnd) return 0;
     if (!(wndPtr = WIN_FindWndPtr( msg->hwnd ))) return 0;
-    if (!wndPtr->lpfnWndProc) return 0;
+    if (!wndPtr->winproc) return 0;
     painting = (msg->message == WM_PAINT);
     if (painting) wndPtr->flags |= WIN_NEEDS_BEGINPAINT;
 /*    HOOK_CallHooks( WH_CALLWNDPROC, HC_ACTION, 0, FIXME ); */
 
     SPY_EnterMessage( SPY_DISPATCHMESSAGE16, msg->hwnd, msg->message,
                       msg->wParam, msg->lParam );
-    retval = CallWindowProc16( wndPtr->lpfnWndProc, msg->hwnd, msg->message,
+    retval = CallWindowProc16( wndPtr->winproc, msg->hwnd, msg->message,
                                msg->wParam, msg->lParam );
     SPY_ExitMessage( SPY_RESULT_OK16, msg->hwnd, msg->message, retval );
 
diff --git a/windows/msgbox.c b/windows/msgbox.c
index dc33193..ca18764 100644
--- a/windows/msgbox.c
+++ b/windows/msgbox.c
@@ -99,11 +99,10 @@
     bwidth = rect.left;
     GetWindowRect16(GetDlgItem(hwnd, 1), &rect);
     bwidth -= rect.left;
-    for (buttons = 0, i = 1; i < 8; i++) {
+    for (buttons = 0, i = 1; i < 8; i++)
+    {
       hItem = GetDlgItem(hwnd, i);
-      if (GetWindowLong(hItem, GWL_STYLE) & WS_VISIBLE) {
-	buttons++;
-      }
+      if (GetWindowLong32A(hItem, GWL_STYLE) & WS_VISIBLE) buttons++;
     }
     
     /* Get the text size */
@@ -141,7 +140,7 @@
     for (buttons = i = 0; i < 7; i++) {
       /* some arithmetic to get the right order for YesNoCancel windows */
       hItem = GetDlgItem(hwnd, (i + 5) % 7 + 1);
-      if (GetWindowLong(hItem, GWL_STYLE) & WS_VISIBLE) {
+      if (GetWindowLong32A(hItem, GWL_STYLE) & WS_VISIBLE) {
 	if (buttons++ == ((lpmb->type & MB_DEFMASK) >> 8)) {
 	  SetFocus(hItem);
 	  SendMessage32A( hItem, BM_SETSTYLE32, BS_DEFPUSHBUTTON, TRUE );
@@ -187,7 +186,7 @@
 
     handle = SYSRES_LoadResource( SYSRES_DIALOG_MSGBOX );
     if (!handle) return 0;
-    ret = DialogBoxIndirectParam( WIN_GetWindowInstance(hWnd),
+    ret = DialogBoxIndirectParam16( WIN_GetWindowInstance(hWnd),
                                   handle, hWnd,
                                   MODULE_GetWndProcEntry16("SystemMessageBoxProc"),
                                   (LONG)&mbox );
diff --git a/windows/painting.c b/windows/painting.c
index 10bdb97..e9c8283 100644
--- a/windows/painting.c
+++ b/windows/painting.c
@@ -10,6 +10,7 @@
 #include "win.h"
 #include "queue.h"
 #include "gdi.h"
+#include "dce.h"
 #include "stddebug.h"
 /* #define DEBUG_WIN */
 #include "debug.h"
@@ -104,8 +105,14 @@
 
     HideCaret( hwnd );
 
-    lps->hdc = GetDCEx( hwnd, hrgnUpdate, DCX_INTERSECTRGN | DCX_USESTYLE );
-    if(hrgnUpdate > 1) DeleteObject( hrgnUpdate );
+    dprintf_win(stddeb,"hrgnUpdate = %04x, ", hrgnUpdate);
+
+    lps->hdc = GetDCEx( hwnd, hrgnUpdate, DCX_INTERSECTRGN | DCX_WINDOWPAINT | DCX_USESTYLE );
+
+    dprintf_win(stddeb,"hdc = %04x\n", lps->hdc);
+
+    /* pseudocode from "Internals" doesn't delete hrgnUpdate - yet another clue
+       that ReleaseDC should take care of it (hence DCX_KEEPCLIPRGN) */
 
     if (!lps->hdc)
     {
@@ -348,7 +355,7 @@
         if (wndPtr->flags & WIN_NEEDS_ERASEBKGND)
         {
             HDC hdc = GetDCEx( hwnd, wndPtr->hrgnUpdate,
-                               DCX_INTERSECTRGN | DCX_USESTYLE );
+                               DCX_INTERSECTRGN | DCX_USESTYLE | DCX_KEEPCLIPRGN | DCX_WINDOWPAINT);
             if (hdc)
             {
               /* Don't send WM_ERASEBKGND to icons */
diff --git a/windows/scroll.c b/windows/scroll.c
index 5569093..d25450d 100644
--- a/windows/scroll.c
+++ b/windows/scroll.c
@@ -17,10 +17,9 @@
 /* #define DEBUG_SCROLL */
 #include "debug.h"
 
-
-
-extern HRGN DCE_GetVisRgn(HWND, WORD);
-extern HWND CARET_GetHwnd();
+extern HRGN DCE_GetVisRgn(HWND, WORD);		/* windows/dce.c */
+extern HWND CARET_GetHwnd();			/* windows/caret.c */
+extern void CLIPPING_UpdateGCRegion(DC* );	/* objects/clipping.c */
 
 static int RgnType;
 
@@ -112,9 +111,7 @@
 /*************************************************************************
  *             ScrollWindow         (USER.61)
  *
- * FIXME: a bit broken
  */
-
 void ScrollWindow(HWND hwnd, short dx, short dy, LPRECT16 rect, LPRECT16 clipRect)
 {
     HDC  hdc;
@@ -131,7 +128,7 @@
     /* if rect is NULL children have to be moved */
     if ( !rect )
        {
-	GetClientRect16(hwnd, &rc);
+	  GetClientRect16(hwnd, &rc);
 	  hrgnClip = CreateRectRgnIndirect16( &rc );
 
           if ((hCaretWnd == hwnd) || IsChild(hwnd,hCaretWnd))
@@ -192,14 +189,14 @@
 /*************************************************************************
  *             ScrollDC         (USER.221)
  *
- * FIXME: half-broken
  */
-
 BOOL ScrollDC(HDC hdc, short dx, short dy, LPRECT16 rc, LPRECT16 cliprc,
 	      HRGN hrgnUpdate, LPRECT16 rcUpdate)
 {
-    HRGN hrgnClip;
-    POINT16 src, dest;
+    HRGN        hrgnClip 	= 0;
+    HRGN 	hrgnScrollClip  = 0;
+    RECT16	rectClip;
+    POINT16 	src, dest;
     short width, height;
     DC *dc = (DC *)GDI_GetObjPtr(hdc, DC_MAGIC);
 
@@ -207,20 +204,37 @@
                    dx, dy, hrgnUpdate, rcUpdate, cliprc, rc ? rc->left : 0,
                    rc ? rc->top : 0, rc ? rc->right : 0, rc ? rc->bottom : 0 );
 
-    if (rc == NULL)
+    if (rc == NULL || !hdc || !dc)
 	return FALSE;
 
-    if (!dc) 
-    { 
-        fprintf(stdnimp,"ScrollDC: Invalid HDC\n");
-        return FALSE;
-    }
+    /* set clipping region */
 
     if (cliprc)
-    {
-	hrgnClip = CreateRectRgnIndirect16(cliprc);
-	SelectClipRgn(hdc, hrgnClip);
-    }
+	IntersectRect16(&rectClip,rc,cliprc);
+    else
+	rectClip = *rc;
+
+    if( rectClip.left >= rectClip.right || rectClip.top >= rectClip.bottom )
+	return FALSE;
+    
+    hrgnClip = GetClipRgn(hdc);
+    hrgnScrollClip = CreateRectRgnIndirect16(&rectClip);
+
+    if( hrgnClip )
+      {
+        /* call UpdateGCRegion directly to avoid
+         * one more temporary region
+	 */ 
+
+        CombineRgn( hrgnScrollClip, hrgnClip, 0, RGN_COPY );
+        SetRectRgn( hrgnClip, rectClip.left, rectClip.top, rectClip.right, rectClip.bottom );
+
+	CLIPPING_UpdateGCRegion( dc );
+      }
+    else
+        SelectClipRgn( hdc, hrgnScrollClip ); 
+
+    /* translate coordinates */
 
     if (dx > 0)
     {
@@ -246,10 +260,14 @@
     width = rc->right - rc->left - abs(dx);
     height = rc->bottom - rc->top - abs(dy);
 
+    /* copy bits */
+
     if (!BitBlt(hdc, dest.x, dest.y, width, height, hdc, src.x, src.y, 
 		SRCCOPY))
 	return FALSE;
 
+    /* compute update areas */
+
     if (hrgnUpdate)
     {
 	HRGN hrgn1,hrgn2;
@@ -291,6 +309,11 @@
 	UnionRect16( rcUpdate, &rx, &ry );
     }
 
+    /* restore clipping region */
+
+    SelectClipRgn( hdc, (hrgnClip)?hrgnScrollClip:0 );
+    DeleteObject( hrgnScrollClip );     
+
     return TRUE;
 }
 
diff --git a/windows/win.c b/windows/win.c
index c89ef23..a59225c 100644
--- a/windows/win.c
+++ b/windows/win.c
@@ -3,6 +3,7 @@
  *
  * Copyright 1993, 1994 Alexandre Julliard
  */
+
 #include <stdlib.h>
 #include <stdio.h>
 #include <string.h>
@@ -27,6 +28,7 @@
 #include "shm_main_blk.h"
 #include "dde_proc.h"
 #include "callback.h"
+#include "clipboard.h"
 #include "winproc.h"
 #include "stddebug.h"
 /* #define DEBUG_WIN  */ 
@@ -90,13 +92,13 @@
     fprintf( stderr,
              "next=%p  child=%p  parent=%p  owner=%p  class=%p '%s'\n"
              "inst=%04x  taskQ=%04x  updRgn=%04x  active=%04x hdce=%04x  idmenu=%04x\n"
-             "style=%08lx  exstyle=%08lx  wndproc=%08lx  text='%s'\n"
+             "style=%08lx  exstyle=%08lx  wndproc=%08x  text='%s'\n"
              "client=%d,%d-%d,%d  window=%d,%d-%d,%d  iconpos=%d,%d  maxpos=%d,%d\n"
              "sysmenu=%04x  flags=%04x  props=%04x  vscroll=%04x  hscroll=%04x\n",
              ptr->next, ptr->child, ptr->parent, ptr->owner,
              ptr->class, className, ptr->hInstance, ptr->hmemTaskQ,
              ptr->hrgnUpdate, ptr->hwndLastActive, ptr->hdce, ptr->wIDmenu,
-             ptr->dwStyle, ptr->dwExStyle, (DWORD)ptr->lpfnWndProc,
+             ptr->dwStyle, ptr->dwExStyle, ptr->winproc,
              ptr->text ? ptr->text : "",
              ptr->rectClient.left, ptr->rectClient.top, ptr->rectClient.right,
              ptr->rectClient.bottom, ptr->rectWindow.left, ptr->rectWindow.top,
@@ -142,11 +144,9 @@
 
         GlobalGetAtomName16(ptr->class->atomName,className,sizeof(className));
         
-        fprintf( stderr, "%08lx %-6.4x %-17.17s %08x %04x:%04x\n",
+        fprintf( stderr, "%08lx %-6.4x %-17.17s %08x %08x\n",
                  (DWORD)ptr, ptr->hmemTaskQ, className,
-                 (unsigned) ptr->dwStyle,
-                 HIWORD(ptr->lpfnWndProc),
-                 LOWORD(ptr->lpfnWndProc));
+                 (unsigned) ptr->dwStyle, ptr->winproc );
         
         if (ptr->child) WIN_WalkWindows( ptr->child->hwndSelf, indent+1 );
         ptr = ptr->next;
@@ -307,12 +307,11 @@
  *
  * Set the window procedure and return the old one.
  */
-static WNDPROC16 WIN_SetWndProc(WND *pWnd, WNDPROC16 proc, WINDOWPROCTYPE type)
+static HANDLE32 WIN_SetWndProc( WND *pWnd, HANDLE32 proc, WINDOWPROCTYPE type)
 {
-    WNDPROC16 oldProc = pWnd->lpfnWndProc;
-    if (type == WIN_PROC_16) pWnd->lpfnWndProc = proc;
-    else pWnd->lpfnWndProc = WINPROC_AllocWinProc( (WNDPROC32)proc, type );
-    WINPROC_FreeWinProc( oldProc );
+    HANDLE32 oldProc = pWnd->winproc;
+    pWnd->winproc = WINPROC_AllocWinProc( proc, type );
+    if (oldProc) WINPROC_FreeWinProc( oldProc );
     return oldProc;
 }
 
@@ -382,6 +381,8 @@
     HDC hdc;
     HWND hwndDesktop;
 
+    dprintf_win(stddeb,"Creating desktop window\n");
+
     if (!(class = CLASS_FindClassByAtom( DESKTOP_CLASS_ATOM, 0 )))
 	return FALSE;
 
@@ -394,6 +395,7 @@
     pWndDesktop->parent            = NULL;
     pWndDesktop->owner             = NULL;
     pWndDesktop->class             = class;
+    pWndDesktop->winproc           = WINPROC_CopyWinProc( class->winproc );
     pWndDesktop->dwMagic           = WND_MAGIC;
     pWndDesktop->hwndSelf          = hwndDesktop;
     pWndDesktop->hInstance         = 0;
@@ -411,7 +413,6 @@
     pWndDesktop->hmemTaskQ         = 0; /* Desktop does not belong to a task */
     pWndDesktop->hrgnUpdate        = 0;
     pWndDesktop->hwndLastActive    = hwndDesktop;
-    pWndDesktop->lpfnWndProc       = (WNDPROC16)0;
     pWndDesktop->dwStyle           = WS_VISIBLE | WS_CLIPCHILDREN |
                                      WS_CLIPSIBLINGS;
     pWndDesktop->dwExStyle         = 0;
@@ -423,8 +424,8 @@
     pWndDesktop->window            = rootWindow;
     pWndDesktop->hSysMenu          = 0;
     pWndDesktop->hProp             = 0;
-    WIN_SetWndProc( pWndDesktop, class->lpfnWndProc,
-                    WINPROC_GetWinProcType(class->lpfnWndProc) );
+    pWndDesktop->userdata          = 0;
+
     EVENT_RegisterWindow( pWndDesktop->window, hwndDesktop );
     SendMessage32A( hwndDesktop, WM_NCCREATE, 0, 0 );
     if ((hdc = GetDC( hwndDesktop )) != 0)
@@ -441,27 +442,37 @@
  *
  * Implementation of CreateWindowEx().
  */
-static HWND WIN_CreateWindowEx( DWORD exStyle, ATOM classAtom, DWORD style,
-                                INT16 x, INT16 y, INT16 width, INT16 height,
-                                HWND parent, HMENU menu, HINSTANCE16 instance )
+static HWND WIN_CreateWindowEx( CREATESTRUCT32A *cs, ATOM classAtom,
+                                BOOL unicode )
 {
     CLASS *classPtr;
     WND *wndPtr;
     HWND16 hwnd;
     POINT16 maxSize, maxPos, minTrack, maxTrack;
+    LRESULT wmcreate;
+
+    dprintf_win( stddeb, "CreateWindowEx: " );
+    if (HIWORD(cs->lpszName)) dprintf_win( stddeb, "'%s' ", cs->lpszName );
+    else dprintf_win( stddeb, "#%04x ", LOWORD(cs->lpszName) );
+    if (HIWORD(cs->lpszClass)) dprintf_win( stddeb, "'%s' ", cs->lpszClass );
+    else dprintf_win( stddeb, "#%04x ", LOWORD(cs->lpszClass) );
+
+    dprintf_win( stddeb, "%08lx %08lx %d,%d %dx%d %04x %04x %04x %p\n",
+		 cs->dwExStyle, cs->style, cs->x, cs->y, cs->cx, cs->cy,
+		 cs->hwndParent, cs->hMenu, cs->hInstance, cs->lpCreateParams);
 
     /* Find the parent window */
 
-    if (parent)
+    if (cs->hwndParent)
     {
 	/* Make sure parent is valid */
-        if (!IsWindow( parent ))
+        if (!IsWindow( cs->hwndParent ))
         {
-            fprintf( stderr, "CreateWindowEx: bad parent %04x\n", parent );
+            fprintf( stderr, "CreateWindowEx: bad parent %04x\n", cs->hwndParent );
 	    return 0;
 	}
     }
-    else if (style & WS_CHILD)
+    else if (cs->style & WS_CHILD)
     {
         fprintf( stderr, "CreateWindowEx: no parent for child window\n" );
         return 0;  /* WS_CHILD needs a parent */
@@ -469,7 +480,8 @@
 
     /* Find the window class */
 
-    if (!(classPtr = CLASS_FindClassByAtom( classAtom, GetExePtr(instance) )))
+    if (!(classPtr = CLASS_FindClassByAtom( classAtom,
+                                            GetExePtr(cs->hInstance) )))
     {
         char buffer[256];
         GlobalGetAtomName32A( classAtom, buffer, sizeof(buffer) );
@@ -479,14 +491,14 @@
 
     /* Fix the coordinates */
 
-    if (x == CW_USEDEFAULT16) x = y = 0;
-    if (width == CW_USEDEFAULT16)
+    if (cs->x == CW_USEDEFAULT32) cs->x = cs->y = 0;
+    if (cs->cx == CW_USEDEFAULT32)
     {
-/*        if (!(style & (WS_CHILD | WS_POPUP))) width = height = 0;
+/*        if (!(cs->style & (WS_CHILD | WS_POPUP))) cs->cx = cs->cy = 0;
         else */
         {
-            width = 600;
-            height = 400;
+            cs->cx = 600;
+            cs->cy = 400;
         }
     }
 
@@ -504,13 +516,16 @@
     wndPtr = (WND *) USER_HEAP_LIN_ADDR( hwnd );
     wndPtr->next           = NULL;
     wndPtr->child          = NULL;
-    wndPtr->parent         = (style & WS_CHILD) ? WIN_FindWndPtr( parent ) : pWndDesktop;
-    wndPtr->owner          = (style & WS_CHILD) ? NULL : WIN_FindWndPtr(WIN_GetTopParent(parent));
+    wndPtr->parent         = (cs->style & WS_CHILD) ?
+                              WIN_FindWndPtr( cs->hwndParent ) : pWndDesktop;
+    wndPtr->owner          = (cs->style & WS_CHILD) ? NULL :
+                              WIN_FindWndPtr(WIN_GetTopParent(cs->hwndParent));
     wndPtr->window         = 0;
     wndPtr->class          = classPtr;
+    wndPtr->winproc        = WINPROC_CopyWinProc( classPtr->winproc );
     wndPtr->dwMagic        = WND_MAGIC;
     wndPtr->hwndSelf       = hwnd;
-    wndPtr->hInstance      = instance;
+    wndPtr->hInstance      = cs->hInstance;
     wndPtr->ptIconPos.x    = -1;
     wndPtr->ptIconPos.y    = -1;
     wndPtr->ptMaxPos.x     = -1;
@@ -519,71 +534,66 @@
     wndPtr->hmemTaskQ      = GetTaskQueue(0);
     wndPtr->hrgnUpdate     = 0;
     wndPtr->hwndLastActive = hwnd;
-    wndPtr->lpfnWndProc    = (WNDPROC16)0;
-    wndPtr->dwStyle        = style & ~WS_VISIBLE;
-    wndPtr->dwExStyle      = exStyle;
+    wndPtr->dwStyle        = cs->style & ~WS_VISIBLE;
+    wndPtr->dwExStyle      = cs->dwExStyle;
     wndPtr->wIDmenu        = 0;
     wndPtr->flags          = 0;
     wndPtr->hVScroll       = 0;
     wndPtr->hHScroll       = 0;
     wndPtr->hSysMenu       = MENU_GetDefSysMenu();
     wndPtr->hProp          = 0;
+    wndPtr->userdata       = 0;
 
     if (classPtr->cbWndExtra) memset( wndPtr->wExtra, 0, classPtr->cbWndExtra);
     classPtr->cWindows++;
 
     /* Correct the window style */
 
-    if (!(style & (WS_POPUP | WS_CHILD)))  /* Overlapped window */
+    if (!(cs->style & (WS_POPUP | WS_CHILD)))  /* Overlapped window */
     {
         wndPtr->dwStyle |= WS_CAPTION | WS_CLIPSIBLINGS;
         wndPtr->flags |= WIN_NEED_SIZE;
     }
-    if (exStyle & WS_EX_DLGMODALFRAME) wndPtr->dwStyle &= ~WS_THICKFRAME;
+    if (cs->dwExStyle & WS_EX_DLGMODALFRAME) wndPtr->dwStyle &= ~WS_THICKFRAME;
 
     /* Get class or window DC if needed */
 
-    if (classPtr->style & CS_OWNDC) wndPtr->hdce = DCE_AllocDCE(DCE_WINDOW_DC);
+    if (classPtr->style & CS_OWNDC) wndPtr->hdce = DCE_AllocDCE(hwnd, DCE_WINDOW_DC);
     else if (classPtr->style & CS_CLASSDC) wndPtr->hdce = classPtr->hdce;
     else wndPtr->hdce = 0;
 
-    /* Set the window procedure */
-
-    WIN_SetWndProc( wndPtr, classPtr->lpfnWndProc,
-                    WINPROC_GetWinProcType(classPtr->lpfnWndProc) );
-
     /* Insert the window in the linked list */
 
     WIN_LinkWindow( hwnd, HWND_TOP );
 
     /* Send the WM_GETMINMAXINFO message and fix the size if needed */
 
-    if ((style & WS_THICKFRAME) || !(style & (WS_POPUP | WS_CHILD)))
+    if ((cs->style & WS_THICKFRAME) || !(cs->style & (WS_POPUP | WS_CHILD)))
     {
         NC_GetMinMaxInfo( hwnd, &maxSize, &maxPos, &minTrack, &maxTrack );
-        if (maxSize.x < width) width = maxSize.x;
-        if (maxSize.y < height) height = maxSize.y;
+        if (maxSize.x < cs->cx) cs->cx = maxSize.x;
+        if (maxSize.y < cs->cy) cs->cy = maxSize.y;
     }
-    if (width <= 0) width = 1;
-    if (height <= 0) height = 1;
+    if (cs->cx <= 0) cs->cx = 1;
+    if (cs->cy <= 0) cs->cy = 1;
 
-    wndPtr->rectWindow.left   = x;
-    wndPtr->rectWindow.top    = y;
-    wndPtr->rectWindow.right  = x + width;
-    wndPtr->rectWindow.bottom = y + height;
+    wndPtr->rectWindow.left   = cs->x;
+    wndPtr->rectWindow.top    = cs->y;
+    wndPtr->rectWindow.right  = cs->x + cs->cx;
+    wndPtr->rectWindow.bottom = cs->y + cs->cy;
     wndPtr->rectClient        = wndPtr->rectWindow;
     wndPtr->rectNormal        = wndPtr->rectWindow;
 
     /* Create the X window (only for top-level windows, and then only */
     /* when there's no desktop window) */
 
-    if (!(style & WS_CHILD) && (rootWindow == DefaultRootWindow(display)))
+    if (!(cs->style & WS_CHILD) && (rootWindow == DefaultRootWindow(display)))
     {
         XSetWindowAttributes win_attr;
         Atom XA_WM_DELETE_WINDOW;
 
-	if (Options.managed && ((style & (WS_DLGFRAME | WS_THICKFRAME)) ||
-            (exStyle & WS_EX_DLGMODALFRAME)))
+	if (Options.managed && ((cs->style & (WS_DLGFRAME | WS_THICKFRAME)) ||
+            (cs->dwExStyle & WS_EX_DLGMODALFRAME)))
         {
 	    win_attr.event_mask = ExposureMask | KeyPressMask |
 	                          KeyReleaseMask | PointerMotionMask |
@@ -604,8 +614,8 @@
         win_attr.backing_store = Options.backingstore ? WhenMapped : NotUseful;
         win_attr.save_under    = ((classPtr->style & CS_SAVEBITS) != 0);
         win_attr.cursor        = CURSORICON_XCursor;
-        wndPtr->window = XCreateWindow( display, rootWindow, x, y,
-                                        width, height, 0, CopyFromParent,
+        wndPtr->window = XCreateWindow( display, rootWindow, cs->x, cs->y,
+                                        cs->cx, cs->cy, 0, CopyFromParent,
                                         InputOutput, CopyFromParent,
                                         CWEventMask | CWOverrideRedirect |
                                         CWColormap | CWCursor | CWSaveUnder |
@@ -613,9 +623,9 @@
 	XA_WM_DELETE_WINDOW = XInternAtom( display, "WM_DELETE_WINDOW",
 					   False );
 	XSetWMProtocols( display, wndPtr->window, &XA_WM_DELETE_WINDOW, 1 );
-	if (parent)  /* Get window owner */
+	if (cs->hwndParent)  /* Get window owner */
 	{
-            Window win = WIN_GetXWindow( parent );
+            Window win = WIN_GetXWindow( cs->hwndParent );
             if (win) XSetTransientForHint( display, wndPtr->window, win );
 	}
         EVENT_RegisterWindow( wndPtr->window, hwnd );
@@ -623,189 +633,45 @@
 
     /* Set the window menu */
 
-    if ((style & WS_CAPTION) && !(style & WS_CHILD))
+    if ((cs->style & WS_CAPTION) && !(cs->style & WS_CHILD))
     {
-        if (menu) SetMenu(hwnd, menu);
+        if (cs->hMenu) SetMenu(hwnd, cs->hMenu);
         else
         {
 #if 0  /* FIXME: should check if classPtr->menuNameW can be used as is */
             if (classPtr->menuNameA)
-                menu = HIWORD(classPtr->menuNameA) ?
-                       LoadMenu( instance, SEGPTR_GET(classPtr->menuNameA) ) :
-                       LoadMenu( instance, (SEGPTR)classPtr->menuNameA );
+                cs->hMenu = HIWORD(classPtr->menuNameA) ?
+                       LoadMenu(cs->hInstance,SEGPTR_GET(classPtr->menuNameA)):
+                       LoadMenu(cs->hInstance,(SEGPTR)classPtr->menuNameA);
 #else
             SEGPTR menuName = (SEGPTR)GetClassLong16( hwnd, GCL_MENUNAME );
-            if (menuName) menu = LoadMenu( instance, menuName );
+            if (menuName) cs->hMenu = LoadMenu( cs->hInstance, menuName );
 #endif
         }
-        if (menu) SetMenu( hwnd, menu );
+        if (cs->hMenu) SetMenu( hwnd, cs->hMenu );
     }
-    else wndPtr->wIDmenu = (UINT)menu;
+    else wndPtr->wIDmenu = (UINT)cs->hMenu;
 
-    return hwnd;
-}
+    /* Send the WM_CREATE message */
 
-
-/***********************************************************************
- *           WIN_FinalWindowInit
- */
-static HWND WIN_FinalWindowInit( WND *wndPtr, DWORD style )
-{
-    if (!(wndPtr->flags & WIN_NEED_SIZE))
+    if (unicode)
     {
-	/* send it anyway */
-	SendMessage16( wndPtr->hwndSelf, WM_SIZE, SIZE_RESTORED,
-		     MAKELONG(wndPtr->rectClient.right-wndPtr->rectClient.left,
-                            wndPtr->rectClient.bottom-wndPtr->rectClient.top));
-        SendMessage16( wndPtr->hwndSelf, WM_MOVE, 0,
-                   MAKELONG(wndPtr->rectClient.left, wndPtr->rectClient.top) );
-    } 
-
-    WIN_SendParentNotify( wndPtr->hwndSelf, WM_CREATE, wndPtr->wIDmenu,
-                          (LONG)wndPtr->hwndSelf );
-    if (!IsWindow(wndPtr->hwndSelf)) return 0;
-
-    /* Show the window, maximizing or minimizing if needed */
-
-    if (wndPtr->dwStyle & WS_MINIMIZE)
-    {
-        wndPtr->dwStyle &= ~WS_MAXIMIZE;
-        WINPOS_FindIconPos( wndPtr->hwndSelf );
-        SetWindowPos(wndPtr->hwndSelf, 0, wndPtr->ptIconPos.x,
-                     wndPtr->ptIconPos.y, SYSMETRICS_CXICON, SYSMETRICS_CYICON,
-                     SWP_FRAMECHANGED |
-                     (style & WS_VISIBLE) ? SWP_SHOWWINDOW : 0 );
-    }
-    else if (wndPtr->dwStyle & WS_MAXIMIZE)
-    {
-        POINT16 maxSize, maxPos, minTrack, maxTrack;
-        NC_GetMinMaxInfo( wndPtr->hwndSelf, &maxSize, &maxPos,
-                          &minTrack, &maxTrack );
-        SetWindowPos( wndPtr->hwndSelf, 0, maxPos.x, maxPos.y, maxSize.x,
-                      maxSize.y, SWP_FRAMECHANGED |
-                      (style & WS_VISIBLE) ? SWP_SHOWWINDOW : 0 );
-    }
-    else if (style & WS_VISIBLE) ShowWindow( wndPtr->hwndSelf, SW_SHOW );
-
-    /* Call WH_SHELL hook */
-
-    if (!(wndPtr->dwStyle & WS_CHILD) && !wndPtr->owner)
-        HOOK_CallHooks( WH_SHELL, HSHELL_WINDOWCREATED, wndPtr->hwndSelf, 0 );
-
-    return wndPtr->hwndSelf;
-}
-
-
-/***********************************************************************
- *           CreateWindow16   (USER.41)
- */
-HWND16 CreateWindow16( SEGPTR className, SEGPTR windowName,
-                       DWORD style, INT16 x, INT16 y, INT16 width,
-                       INT16 height, HWND16 parent, HMENU16 menu,
-                       HINSTANCE16 instance, SEGPTR data ) 
-{
-    return CreateWindowEx16( 0, className, windowName, style,
-			   x, y, width, height, parent, menu, instance, data );
-}
-
-
-/***********************************************************************
- *           CreateWindowEx16   (USER.452)
- */
-HWND16 CreateWindowEx16( DWORD exStyle, SEGPTR className, SEGPTR windowName,
-                         DWORD style, INT16 x, INT16 y, INT16 width,
-                         INT16 height, HWND16 parent, HMENU16 menu,
-                         HINSTANCE16 instance, SEGPTR data ) 
-{
-    ATOM classAtom;
-    HWND16 hwnd;
-    WND *wndPtr;
-    LRESULT wmcreate;
-
-    dprintf_win( stddeb, "CreateWindowEx: " );
-    if (HIWORD(windowName))
-	dprintf_win( stddeb, "'%s' ", (char *)PTR_SEG_TO_LIN(windowName) );
-    else
-	dprintf_win( stddeb, "%04x ", LOWORD(windowName) );
-    if (HIWORD(className))
-        dprintf_win( stddeb, "'%s' ", (char *)PTR_SEG_TO_LIN(className) );
-    else
-        dprintf_win( stddeb, "%04x ", LOWORD(className) );
-
-    dprintf_win(stddeb, "%08lx %08lx %d,%d %dx%d %04x %04x %04x %08lx\n",
-		exStyle, style, x, y, width, height,
-		parent, menu, instance, (DWORD)data);
-
-    /* Find the class atom */
-
-    if (!(classAtom = GlobalFindAtom16( className )))
-    {
-        fprintf( stderr, "CreateWindowEx16: bad class name " );
-        if (!HIWORD(className)) fprintf( stderr, "%04x\n", LOWORD(className) );
-        else fprintf( stderr, "'%s'\n", (char *)PTR_SEG_TO_LIN(className) );
-        return 0;
-    }
-
-    hwnd = WIN_CreateWindowEx( exStyle, classAtom, style, x, y, width, height,
-                               parent, menu, instance );
-    if (!hwnd) return 0;
-    wndPtr = (WND *) USER_HEAP_LIN_ADDR( hwnd );
-
-      /* Send the WM_CREATE message */
-
-#ifndef WINELIB
-    if (WINPROC_GetWinProcType( wndPtr->lpfnWndProc ) == WIN_PROC_16)
-    {
-        /* Build the CREATESTRUCT on the 16-bit stack. */
-        /* This is really ugly, but some programs (notably the */
-        /* "Undocumented Windows" examples) want it that way.  */
-        if (!CallWndProcNCCREATE16( wndPtr->lpfnWndProc, wndPtr->hInstance,
-                  wndPtr->dwExStyle, className, windowName, wndPtr->dwStyle,
-                  wndPtr->rectWindow.left, wndPtr->rectWindow.top,
-                  wndPtr->rectWindow.right - wndPtr->rectWindow.left,
-                  wndPtr->rectWindow.bottom - wndPtr->rectWindow.top,
-                  parent, menu, wndPtr->hInstance, data, hwnd, WM_NCCREATE, 0,
-                  MAKELONG( IF1632_Saved16_sp-sizeof(CREATESTRUCT16),
-                            IF1632_Saved16_ss ) ))
-            wmcreate = -1;
+        if (!SendMessage32W( hwnd, WM_NCCREATE, 0, (LPARAM)cs)) wmcreate = -1;
         else
         {
             WINPOS_SendNCCalcSize( hwnd, FALSE, &wndPtr->rectWindow,
                                    NULL, NULL, 0, &wndPtr->rectClient );
-            wmcreate = CallWndProcNCCREATE16( wndPtr->lpfnWndProc,
-                   wndPtr->hInstance, wndPtr->dwExStyle, className,
-                   windowName, wndPtr->dwStyle,
-                   wndPtr->rectWindow.left, wndPtr->rectWindow.top,
-                   wndPtr->rectWindow.right - wndPtr->rectWindow.left,
-                   wndPtr->rectWindow.bottom - wndPtr->rectWindow.top,
-                   parent, menu, wndPtr->hInstance, data, hwnd, WM_CREATE, 0,
-                   MAKELONG( IF1632_Saved16_sp-sizeof(CREATESTRUCT16),
-                             IF1632_Saved16_ss ) );
+            wmcreate = SendMessage32W( hwnd, WM_CREATE, 0, (LPARAM)cs );
         }
     }
-    else  /* We have a 32-bit window procedure */
-#endif  /* WINELIB */
+    else
     {
-        CREATESTRUCT32A cs;
-        cs.lpCreateParams = (LPVOID)data;
-        cs.hInstance      = wndPtr->hInstance;
-        cs.hMenu          = wndPtr->wIDmenu;
-        cs.hwndParent     = parent;
-        cs.cx             = wndPtr->rectWindow.right - wndPtr->rectWindow.left;
-        cs.cy             = wndPtr->rectWindow.bottom - wndPtr->rectWindow.top;
-        cs.x              = wndPtr->rectWindow.left;
-        cs.y              = wndPtr->rectWindow.top;
-        cs.style          = wndPtr->dwStyle | (style & WS_VISIBLE);
-        cs.lpszName       = PTR_SEG_TO_LIN(windowName);
-        cs.lpszClass      = PTR_SEG_TO_LIN(className);
-        cs.dwExStyle      = wndPtr->dwExStyle;
-
-        if (!SendMessage32A( hwnd, WM_NCCREATE, 0, (LPARAM)&cs)) wmcreate = -1;
+        if (!SendMessage32A( hwnd, WM_NCCREATE, 0, (LPARAM)cs)) wmcreate = -1;
         else
         {
             WINPOS_SendNCCalcSize( hwnd, FALSE, &wndPtr->rectWindow,
                                    NULL, NULL, 0, &wndPtr->rectClient );
-            wmcreate = SendMessage32A( hwnd, WM_CREATE, 0, (LPARAM)&cs );
+            wmcreate = SendMessage32A( hwnd, WM_CREATE, 0, (LPARAM)cs );
         }
     }
     
@@ -817,8 +683,102 @@
 	return 0;
     }
 
-    dprintf_win(stddeb, "CreateWindowEx16: return %04x\n", hwnd);
-    return WIN_FinalWindowInit( wndPtr, style );
+    /* Send the size messages */
+
+    if (!(wndPtr->flags & WIN_NEED_SIZE))
+    {
+	/* send it anyway */
+	SendMessage16( hwnd, WM_SIZE, SIZE_RESTORED,
+                   MAKELONG(wndPtr->rectClient.right-wndPtr->rectClient.left,
+                            wndPtr->rectClient.bottom-wndPtr->rectClient.top));
+        SendMessage16( hwnd, WM_MOVE, 0, MAKELONG( wndPtr->rectClient.left,
+                                                   wndPtr->rectClient.top ));
+    } 
+
+    WIN_SendParentNotify( hwnd, WM_CREATE, wndPtr->wIDmenu, (LONG)hwnd );
+    if (!IsWindow(hwnd)) return 0;
+
+    /* Show the window, maximizing or minimizing if needed */
+
+    if (wndPtr->dwStyle & WS_MINIMIZE)
+    {
+        wndPtr->dwStyle &= ~WS_MAXIMIZE;
+        WINPOS_FindIconPos( hwnd );
+        SetWindowPos( hwnd, 0, wndPtr->ptIconPos.x, wndPtr->ptIconPos.y,
+                      SYSMETRICS_CXICON, SYSMETRICS_CYICON, SWP_FRAMECHANGED |
+                      (cs->style & WS_VISIBLE) ? SWP_SHOWWINDOW : 0 );
+    }
+    else if (wndPtr->dwStyle & WS_MAXIMIZE)
+    {
+        POINT16 maxSize, maxPos, minTrack, maxTrack;
+        NC_GetMinMaxInfo( hwnd, &maxSize, &maxPos, &minTrack, &maxTrack );
+        SetWindowPos( hwnd, 0, maxPos.x, maxPos.y, maxSize.x, maxSize.y,
+            SWP_FRAMECHANGED | (cs->style & WS_VISIBLE) ? SWP_SHOWWINDOW : 0 );
+    }
+    else if (cs->style & WS_VISIBLE) ShowWindow( hwnd, SW_SHOW );
+
+    /* Call WH_SHELL hook */
+
+    if (!(wndPtr->dwStyle & WS_CHILD) && !wndPtr->owner)
+        HOOK_CallHooks( WH_SHELL, HSHELL_WINDOWCREATED, hwnd, 0 );
+
+    dprintf_win(stddeb, "CreateWindowEx: returning %04x\n", hwnd);
+    return hwnd;
+}
+
+
+/***********************************************************************
+ *           CreateWindow16   (USER.41)
+ */
+HWND16 CreateWindow16( LPCSTR className, LPCSTR windowName,
+                       DWORD style, INT16 x, INT16 y, INT16 width,
+                       INT16 height, HWND16 parent, HMENU16 menu,
+                       HINSTANCE16 instance, LPVOID data ) 
+{
+    return CreateWindowEx16( 0, className, windowName, style,
+			   x, y, width, height, parent, menu, instance, data );
+}
+
+
+/***********************************************************************
+ *           CreateWindowEx16   (USER.452)
+ */
+HWND16 CreateWindowEx16( DWORD exStyle, LPCSTR className, LPCSTR windowName,
+                         DWORD style, INT16 x, INT16 y, INT16 width,
+                         INT16 height, HWND16 parent, HMENU16 menu,
+                         HINSTANCE16 instance, LPVOID data ) 
+{
+    ATOM classAtom;
+    CREATESTRUCT32A cs;
+
+    /* Find the class atom */
+
+    if (!(classAtom = GlobalFindAtom32A( className )))
+    {
+        fprintf( stderr, "CreateWindowEx16: bad class name " );
+        if (!HIWORD(className)) fprintf( stderr, "%04x\n", LOWORD(className) );
+        else fprintf( stderr, "'%s'\n", className );
+        return 0;
+    }
+
+    /* Fix the coordinates */
+
+    cs.x  = (x == CW_USEDEFAULT16) ? CW_USEDEFAULT32 : (INT32)x;
+    cs.y  = (y == CW_USEDEFAULT16) ? CW_USEDEFAULT32 : (INT32)y;
+    cs.cx = (width == CW_USEDEFAULT16) ? CW_USEDEFAULT32 : (INT32)width;
+    cs.cy = (height == CW_USEDEFAULT16) ? CW_USEDEFAULT32 : (INT32)height;
+
+    /* Create the window */
+
+    cs.lpCreateParams = data;
+    cs.hInstance      = (HINSTANCE32)instance;
+    cs.hMenu          = (HMENU32)menu;
+    cs.hwndParent     = (HWND32)parent;
+    cs.style          = style;
+    cs.lpszName       = windowName;
+    cs.lpszClass      = className;
+    cs.dwExStyle      = exStyle;
+    return WIN_CreateWindowEx( &cs, classAtom, FALSE );
 }
 
 
@@ -831,9 +791,6 @@
                           HINSTANCE32 instance, LPVOID data )
 {
     ATOM classAtom;
-    HWND16 hwnd;
-    WND *wndPtr;
-    LRESULT wmcreate;
     CREATESTRUCT32A cs;
 
     /* Find the class atom */
@@ -846,51 +803,21 @@
         return 0;
     }
 
-    /* Fix the coordinates */
-
-    if (x == CW_USEDEFAULT32) x = y = (UINT32)CW_USEDEFAULT16;
-    if (width == CW_USEDEFAULT32) width = height = (UINT32)CW_USEDEFAULT16;
-
-    /* Create the window structure */
-
-    hwnd = WIN_CreateWindowEx( exStyle, classAtom, style, x, y, width, height,
-                               parent, menu, instance );
-    if (!hwnd) return 0;
-    wndPtr = (WND *) USER_HEAP_LIN_ADDR( hwnd );
-
-    /* Send the WM_CREATE message */
+    /* Create the window */
 
     cs.lpCreateParams = data;
-    cs.hInstance      = wndPtr->hInstance;
-    cs.hMenu          = wndPtr->wIDmenu;
+    cs.hInstance      = instance;
+    cs.hMenu          = menu;
     cs.hwndParent     = parent;
-    cs.cx             = wndPtr->rectWindow.right - wndPtr->rectWindow.left;
-    cs.cy             = wndPtr->rectWindow.bottom - wndPtr->rectWindow.top;
-    cs.x              = wndPtr->rectWindow.left;
-    cs.y              = wndPtr->rectWindow.top;
-    cs.style          = wndPtr->dwStyle | (style & WS_VISIBLE);
+    cs.x              = x;
+    cs.y              = y;
+    cs.cx             = width;
+    cs.cy             = height;
+    cs.style          = style;
     cs.lpszName       = windowName;
     cs.lpszClass      = className;
-    cs.dwExStyle      = wndPtr->dwExStyle;
-
-    if (!SendMessage32A( hwnd, WM_NCCREATE, 0, (LPARAM)&cs )) wmcreate = -1;
-    else
-    {
-        WINPOS_SendNCCalcSize( hwnd, FALSE, &wndPtr->rectWindow,
-                               NULL, NULL, 0, &wndPtr->rectClient );
-        wmcreate = SendMessage32A( hwnd, WM_CREATE, 0, (LPARAM)&cs );
-    }
-
-    if (wmcreate == -1)
-    {
-	  /* Abort window creation */
-	dprintf_win(stddeb,"CreateWindowEx32A: wmcreate==-1, aborting\n");
-        WIN_DestroyWindow( hwnd );
-	return 0;
-    }
-
-    dprintf_win(stddeb, "CreateWindowEx32A: return %04x\n", hwnd);
-    return WIN_FinalWindowInit( wndPtr, style );
+    cs.dwExStyle      = exStyle;
+    return WIN_CreateWindowEx( &cs, classAtom, FALSE );
 }
 
 
@@ -903,9 +830,6 @@
                           HINSTANCE32 instance, LPVOID data )
 {
     ATOM classAtom;
-    HWND16 hwnd;
-    WND *wndPtr;
-    LRESULT wmcreate;
     CREATESTRUCT32W cs;
 
     /* Find the class atom */
@@ -916,51 +840,23 @@
         return 0;
     }
 
-    /* Fix the coordinates */
-
-    if (x == CW_USEDEFAULT32) x = y = (UINT32)CW_USEDEFAULT16;
-    if (width == CW_USEDEFAULT32) width = height = (UINT32)CW_USEDEFAULT16;
-
-    /* Create the window structure */
-
-    hwnd = WIN_CreateWindowEx( exStyle, classAtom, style, x, y, width, height,
-                               parent, menu, instance );
-    if (!hwnd) return 0;
-    wndPtr = (WND *) USER_HEAP_LIN_ADDR( hwnd );
-
-    /* Send the WM_CREATE message */
+    /* Create the window */
 
     cs.lpCreateParams = data;
-    cs.hInstance      = wndPtr->hInstance;
-    cs.hMenu          = wndPtr->wIDmenu;
+    cs.hInstance      = instance;
+    cs.hMenu          = menu;
     cs.hwndParent     = parent;
-    cs.cx             = wndPtr->rectWindow.right - wndPtr->rectWindow.left;
-    cs.cy             = wndPtr->rectWindow.bottom - wndPtr->rectWindow.top;
-    cs.x              = wndPtr->rectWindow.left;
-    cs.y              = wndPtr->rectWindow.top;
-    cs.style          = wndPtr->dwStyle | (style & WS_VISIBLE);
+    cs.x              = x;
+    cs.y              = y;
+    cs.cx             = width;
+    cs.cy             = height;
+    cs.style          = style;
     cs.lpszName       = windowName;
     cs.lpszClass      = className;
-    cs.dwExStyle      = wndPtr->dwExStyle;
-
-    if (!SendMessage32W( hwnd, WM_NCCREATE, 0, (LPARAM)&cs )) wmcreate = -1;
-    else
-    {
-        WINPOS_SendNCCalcSize( hwnd, FALSE, &wndPtr->rectWindow,
-                               NULL, NULL, 0, &wndPtr->rectClient );
-        wmcreate = SendMessage32W( hwnd, WM_CREATE, 0, (LPARAM)&cs );
-    }
-
-    if (wmcreate == -1)
-    {
-	  /* Abort window creation */
-	dprintf_win(stddeb,"CreateWindowEx32W: wmcreate==-1, aborting\n");
-        WIN_DestroyWindow( hwnd );
-	return 0;
-    }
-
-    dprintf_win(stddeb, "CreateWindowEx32W: return %04x\n", hwnd);
-    return WIN_FinalWindowInit( wndPtr, style );
+    cs.dwExStyle      = exStyle;
+    /* Note: we rely on the fact that CREATESTRUCT32A and */
+    /* CREATESTRUCT32W have the same layout. */
+    return WIN_CreateWindowEx( (CREATESTRUCT32A *)&cs, classAtom, TRUE );
 }
 
 
@@ -975,8 +871,8 @@
     
       /* Initialization */
 
-    if (hwnd == pWndDesktop->hwndSelf) return FALSE; /* Can't destroy desktop*/
     if (!(wndPtr = WIN_FindWndPtr( hwnd ))) return FALSE;
+    if (wndPtr == pWndDesktop) return FALSE; /* Can't destroy desktop */
 
       /* Top-level window */
 
@@ -1010,6 +906,8 @@
         else break;
     }
 
+    CLIPBOARD_DisOwn( hwnd );
+
       /* Send destroy messages and destroy children */
 
     SendMessage16( hwnd, WM_DESTROY, 0, 0 );
@@ -1252,7 +1150,7 @@
     WND * wndPtr; 
 
     if (!(wndPtr = WIN_FindWndPtr(hwnd))) return FALSE;
-    return (WINPROC_GetWinProcType( wndPtr->lpfnWndProc ) == WIN_PROC_32W);
+    return (WINPROC_GetWinProcType( wndPtr->winproc ) == WIN_PROC_32W);
 }
 
 
@@ -1311,44 +1209,64 @@
 
 
 /**********************************************************************
- *	     GetWindowLong    (USER.135)
+ *	     GetWindowLong16    (USER.135)
  */
-LONG GetWindowLong( HWND32 hwnd, INT32 offset )
+LONG GetWindowLong16( HWND16 hwnd, INT16 offset )
+{
+    LONG ret = GetWindowLong32A( (HWND32)hwnd, offset );
+    if (offset == GWL_WNDPROC) return (LONG)WINPROC_GetFunc16( (HANDLE32)ret );
+    return ret;
+}
+
+
+/**********************************************************************
+ *	     GetWindowLong32A    (USER32.304)
+ */
+LONG GetWindowLong32A( HWND32 hwnd, INT32 offset )
 {
     WND * wndPtr = WIN_FindWndPtr( hwnd );
     if (!wndPtr) return 0;
     if (offset >= 0) return *(LONG *)(((char *)wndPtr->wExtra) + offset);
     switch(offset)
     {
-        case GWL_USERDATA:   return 0;
+        case GWL_USERDATA:   return wndPtr->userdata;
         case GWL_STYLE:      return wndPtr->dwStyle;
         case GWL_EXSTYLE:    return wndPtr->dwExStyle;
         case GWL_ID:         return wndPtr->wIDmenu;
-        case GWL_WNDPROC:    return (LONG)wndPtr->lpfnWndProc;
+        case GWL_WNDPROC:    return (LONG)WINPROC_GetFunc32( wndPtr->winproc );
         case GWL_HWNDPARENT: return wndPtr->parent ?
                                         (HWND32)wndPtr->parent->hwndSelf : 0;
         case GWL_HINSTANCE:  return (HINSTANCE32)wndPtr->hInstance;
         default:
-            fprintf( stderr, "GetWindowLong: unknown offset %d\n", offset );
+            fprintf( stderr, "GetWindowLong32A: unknown offset %d\n", offset );
     }
     return 0;
 }
 
 
 /**********************************************************************
+ *	     GetWindowLong32W    (USER32.305)
+ */
+LONG GetWindowLong32W( HWND32 hwnd, INT32 offset )
+{
+    return GetWindowLong32A( hwnd, offset );
+}
+
+
+/**********************************************************************
  *	     SetWindowLong16    (USER.136)
  */
 LONG SetWindowLong16( HWND16 hwnd, INT16 offset, LONG newval )
 {
-    WND *wndPtr;
-    switch(offset)
+    if (offset == GWL_WNDPROC)
     {
-    case GWL_WNDPROC:
-        wndPtr = WIN_FindWndPtr( hwnd );
-        return (LONG)WIN_SetWndProc( wndPtr, (WNDPROC16)newval, WIN_PROC_16 );
-    default:
-        return SetWindowLong32A( hwnd, offset, newval );
+        HANDLE32 ret;
+        WND *wndPtr = WIN_FindWndPtr( hwnd );
+        if (!wndPtr) return 0;
+        ret = WIN_SetWndProc( wndPtr, (HANDLE32)newval, WIN_PROC_16 );
+        return (LONG)WINPROC_GetFunc16( ret );
     }
+    return SetWindowLong32A( hwnd, offset, newval );
 }
 
 
@@ -1367,11 +1285,12 @@
         case GWL_HINSTANCE:
             return SetWindowWord( hwnd, offset, (WORD)newval );
 	case GWL_WNDPROC:
-            return (LONG)WIN_SetWndProc( wndPtr, (WNDPROC16)newval,
-                                         WIN_PROC_32A );
-        case GWL_USERDATA: return 0;
-	case GWL_STYLE:   ptr = &wndPtr->dwStyle; break;
-        case GWL_EXSTYLE: ptr = &wndPtr->dwExStyle; break;
+            return (LONG)WINPROC_GetFunc32( WIN_SetWndProc( wndPtr,
+                                                            (HANDLE32)newval,
+                                                            WIN_PROC_32A ));
+        case GWL_USERDATA: ptr = &wndPtr->userdata; break;
+	case GWL_STYLE:    ptr = &wndPtr->dwStyle; break;
+        case GWL_EXSTYLE:  ptr = &wndPtr->dwExStyle; break;
 	default:
             fprintf( stderr, "SetWindowLong: invalid offset %d\n", offset );
             return 0;
@@ -1387,15 +1306,15 @@
  */
 LONG SetWindowLong32W( HWND32 hwnd, INT32 offset, LONG newval )
 {
-    WND *wndPtr;
-    switch(offset)
+    if (offset == GCL_WNDPROC)
     {
-    case GWL_WNDPROC:
-        wndPtr = WIN_FindWndPtr( hwnd );
-        return (LONG)WIN_SetWndProc( wndPtr, (WNDPROC16)newval, WIN_PROC_32W );
-    default:
-        return SetWindowLong32A( hwnd, offset, newval );
+        WND *wndPtr = WIN_FindWndPtr( hwnd );
+        if (!wndPtr) return 0;
+        return (LONG)WINPROC_GetFunc32( WIN_SetWndProc( wndPtr,
+                                                        (HANDLE32)newval,
+                                                        WIN_PROC_32W ));
     }
+    return SetWindowLong32A( hwnd, offset, newval );
 }
 
 
diff --git a/windows/winpos.c b/windows/winpos.c
index 74a8942..5088673 100644
--- a/windows/winpos.c
+++ b/windows/winpos.c
@@ -15,6 +15,7 @@
 #include "queue.h"
 #include "stackframe.h"
 #include "winpos.h"
+#include "dce.h"
 #include "nonclient.h"
 #include "stddebug.h"
 /* #define DEBUG_WIN */
@@ -27,6 +28,7 @@
 extern void 	FOCUS_SwitchFocus( HWND , HWND );
 extern HRGN 	DCE_GetVisRgn( HWND, WORD );
 extern HWND	CARET_GetHwnd();
+extern BOOL     DCE_InvalidateDCE(WND*, RECT16* );
 
 /* ----- internal variables ----- */
 
@@ -1346,10 +1348,10 @@
 	     OffsetRgn( newVisRgn, Wnd->rectClient.left, Wnd->rectClient.top);
 	     CombineRgn( oldVisRgn, oldVisRgn, newVisRgn, RGN_OR );
 
-             hDC = GetDCEx( Wnd->parent->hwndSelf, oldVisRgn, DCX_INTERSECTRGN | DCX_CACHE | DCX_CLIPSIBLINGS);
+             hDC = GetDCEx( Wnd->parent->hwndSelf, oldVisRgn, DCX_KEEPCLIPRGN | DCX_INTERSECTRGN | DCX_CACHE | DCX_CLIPSIBLINGS);
 
-             BitBlt(hDC, xto, yto, lpOldClientRect->right - lpOldClientRect->left + 1, 
-				   lpOldClientRect->bottom - lpOldClientRect->top + 1,
+             BitBlt(hDC, xto, yto, lpOldClientRect->right - lpOldClientRect->left, 
+				   lpOldClientRect->bottom - lpOldClientRect->top,
 				   hDC, xfrom, yfrom, SRCCOPY );
     
              ReleaseDC( Wnd->parent->hwndSelf, hDC); 
@@ -1563,6 +1565,18 @@
 				    newClientRect.top != wndPtr->rectClient.top) )
 	    winpos.flags &= ~SWP_NOCLIENTMOVE;
 
+    /* Update active DCEs */
+
+    if( !(flags & SWP_NOZORDER) || (flags & SWP_HIDEWINDOW) || (flags & SWP_SHOWWINDOW)
+                                || (memcmp(&newWindowRect,&wndPtr->rectWindow,sizeof(RECT16))
+                                    && wndPtr->dwStyle & WS_VISIBLE ) )
+      {
+        RECT16 rect;
+
+        UnionRect16(&rect,&newWindowRect,&wndPtr->rectWindow);
+        DCE_InvalidateDCE(wndPtr->parent, &rect);
+      }
+
     /* Perform the moving and resizing */
 
     if (wndPtr->window)
@@ -1628,12 +1642,9 @@
 			   (result >= WVR_HREDRAW && result < WVR_VALIDRECTS);
 
 	    if( (winpos.flags & SWP_NOPOSCHANGE) != SWP_NOPOSCHANGE )
-	      {
 	        /* optimize cleanup by BitBlt'ing where possible */
 
 	        WINPOS_SizeMoveClean(wndPtr, visRgn, &oldWindowRect, &oldClientRect, bNoCopy);
-	        DeleteObject(visRgn);
-	      }
 	    else
 	       if( winpos.flags & SWP_FRAMECHANGED )
         	  RedrawWindow32( winpos.hwnd, NULL, 0, RDW_NOCHILDREN | RDW_FRAME ); 
diff --git a/windows/winproc.c b/windows/winproc.c
index 16ce933..05d2a24 100644
--- a/windows/winproc.c
+++ b/windows/winproc.c
@@ -19,88 +19,96 @@
 
 typedef struct
 {
-    WNDPROC32       func;        /* 32-bit function, or 0 if free */
-    unsigned int    count : 30;  /* Reference count, or next free if func==0 */
-    WINDOWPROCTYPE  type : 2;    /* Function type */
+    UINT32          magic;    /* Magic number */
+    WINDOWPROCTYPE  type;     /* Function type */
+    UINT32          count;    /* Reference count */
+    UINT32          func;     /* 16- or 32-bit function */
 } WINDOWPROC;
 
-#define NB_WINPROCS    1024  /* Must be < 64K; 1024 should be enough for now */
+#define WINPROC_MAGIC  ('W' | ('P' << 8) | ('R' << 16) | ('C' << 24))
 
-static WINDOWPROC winProcs[NB_WINPROCS];
-static int lastWinProc = 0;
-static int freeWinProc = NB_WINPROCS;
 
-/* Check if a win proc was created by WINPROC_AllocWinProc */
-#define IS_ALLOCATED_WINPROC(func)  (HIWORD(func) == 0xffff)
+static HANDLE32 WinProcHeap = 0;
+
+
+/**********************************************************************
+ *	     WINPROC_GetPtr
+ *
+ * Return a pointer to the win proc.
+ */
+static WINDOWPROC *WINPROC_GetPtr( HANDLE32 handle )
+{
+    WINDOWPROC *proc;
+
+    /* Check for a linear pointer */
+
+    if (HEAP_IsInsideHeap( WinProcHeap, 0, (LPVOID)handle ))
+    {
+        proc = (WINDOWPROC *)handle;
+        if (proc->magic == WINPROC_MAGIC) return proc;
+    }
+
+    /* Check for a segmented pointer */
+
+    if (!IsBadReadPtr( (SEGPTR)handle, sizeof(WINDOWPROC) ))
+    {
+        proc = (WINDOWPROC *)PTR_SEG_TO_LIN(handle);
+        if (proc->magic == WINPROC_MAGIC) return proc;
+    }
+
+    return NULL;
+}
+
 
 /**********************************************************************
  *	     WINPROC_AllocWinProc
  *
  * Allocate a new window procedure.
  */
-WNDPROC16 WINPROC_AllocWinProc( WNDPROC32 func, WINDOWPROCTYPE type )
+HANDLE32 WINPROC_AllocWinProc( UINT32 func, WINDOWPROCTYPE type )
 {
     WINDOWPROC *proc;
-    if (!func) return (WNDPROC16)0;  /* Null win proc remains null */
-    if (IS_ALLOCATED_WINPROC(func))  /* Already allocated? */
+
+    /* Create the heap if necessary */
+
+    if (!WinProcHeap)
     {
-        if (LOWORD(func) >= NB_WINPROCS) return (WNDPROC16)0;
-        proc = &winProcs[LOWORD(func)];
-        if (!proc->func) return (WNDPROC16)0;
+        if (!(WinProcHeap = HeapCreate( HEAP_WINE_SEGPTR, 0, 0 ))) return 0;
+    }
+
+    /* Check if function is already a win proc */
+
+    if ((proc = WINPROC_GetPtr( (HANDLE32)func )))
+    {
         proc->count++;
-        return (WNDPROC16)func;
+        return (HANDLE32)func;
     }
-    if (freeWinProc < NB_WINPROCS)  /* There is a free entry */
-    {
-        proc = &winProcs[freeWinProc];
-        proc->func = func;
-        func = (WNDPROC32)MAKELONG( freeWinProc, 0xffff );
-        freeWinProc = proc->count;  /* Next free entry */
-        proc->count = 1;
-        proc->type  = type;
-        return (WNDPROC16)func;
-    }
-    if (lastWinProc < NB_WINPROCS)  /* There's a free entry at the end */
-    {
-        proc = &winProcs[lastWinProc];
-        proc->func = func;
-        func = (WNDPROC32)MAKELONG( lastWinProc, 0xffff );
-        lastWinProc++;
-        proc->count = 1;
-        proc->type  = type;
-        return (WNDPROC16)func;
-    }
-    fprintf( stderr, "WINPROC_AllocWinProc: out of window procedures.\n"
-                     "Please augment NB_WINPROCS in winproc.c\n" );
-    return (WNDPROC16)0;
+
+    /* Now allocate a new one */
+
+    if (!(proc = HeapAlloc( WinProcHeap, 0, sizeof(WINDOWPROC) ))) return 0;
+    proc->magic = WINPROC_MAGIC;
+    proc->type  = type;
+    proc->count = 1;
+    proc->func  = func;
+    return (HANDLE32)proc;
 }
 
 
 /**********************************************************************
- *	     WINPROC_GetWinProcType
+ *	     WINPROC_CopyWinProc
  *
- * Return the type of a window procedure.
+ * Copy a window procedure.
  */
-WINDOWPROCTYPE WINPROC_GetWinProcType( WNDPROC16 func )
+HANDLE32 WINPROC_CopyWinProc( HANDLE32 handle )
 {
-    WORD id = LOWORD(func);
-    if (!IS_ALLOCATED_WINPROC(func)) return WIN_PROC_16;
-    if ((id >= NB_WINPROCS) || !winProcs[id].func) return WIN_PROC_INVALID;
-    return winProcs[id].type;
-}
-
-
-/**********************************************************************
- *	     WINPROC_GetWinProcFunc
- *
- * Return the 32-bit window procedure for a winproc.
- */
-WNDPROC32 WINPROC_GetWinProcFunc( WNDPROC16 func )
-{
-    WORD id = LOWORD(func);
-    if (!IS_ALLOCATED_WINPROC(func)) return NULL;
-    if (id >= NB_WINPROCS) return NULL;
-    return winProcs[id].func;
+    WINDOWPROC *proc;
+    if ((proc = WINPROC_GetPtr( (HANDLE32)handle )))
+    {
+        proc->count++;
+        return handle;
+    }
+    return (HANDLE32)0;
 }
 
 
@@ -109,26 +117,63 @@
  *
  * Free a window procedure.
  */
-void WINPROC_FreeWinProc( WNDPROC16 func )
+void WINPROC_FreeWinProc( HANDLE32 handle )
 {
-    WORD id = LOWORD(func);
-    if (!IS_ALLOCATED_WINPROC(func)) return;
-    if ((id >= NB_WINPROCS) || !winProcs[id].func)
+    WINDOWPROC *proc;
+
+    if (!(proc = WINPROC_GetPtr( handle )))
     {
-        fprintf( stderr, "WINPROC_FreeWinProc: invalid proc %08x\n",
-                 (UINT32)func );
+        fprintf( stderr, "WINPROC_FreeWinProc: invalid proc %08x\n", handle );
         return;
     }
-    if (--winProcs[id].count == 0)
+    if (--proc->count == 0)
     {
-        winProcs[id].func = 0;
-        winProcs[id].count = freeWinProc;
-        freeWinProc = id;
+        proc->magic = 0;  /* Just in case */
+        HeapFree( WinProcHeap, 0, proc );
     }
 }
 
 
 /**********************************************************************
+ *	     WINPROC_GetWinProcType
+ *
+ * Return the window procedure type.
+ */
+WINDOWPROCTYPE WINPROC_GetWinProcType( HANDLE32 handle )
+{
+    WINDOWPROC *proc = WINPROC_GetPtr( handle );
+    if (!proc) return WIN_PROC_INVALID;
+    return proc->type;
+}
+
+
+/**********************************************************************
+ *	     WINPROC_GetFunc16
+ *
+ * Return the 16-bit function pointer, or NULL if none.
+ */
+WNDPROC16 WINPROC_GetFunc16( HANDLE32 handle )
+{
+    WINDOWPROC *proc = WINPROC_GetPtr( handle );
+    if (!proc) return (WNDPROC16)0;
+    return (WNDPROC16)HEAP_GetSegptr( WinProcHeap, 0, proc );
+}
+
+
+/**********************************************************************
+ *	     WINPROC_GetFunc32
+ *
+ * Return the 32-bit function pointer, or NULL if none.
+ */
+WNDPROC32 WINPROC_GetFunc32( HANDLE32 handle )
+{
+    WINDOWPROC *proc = WINPROC_GetPtr( handle );
+    if (!proc) return (WNDPROC32)0;
+    return (WNDPROC32)proc;
+}
+
+
+/**********************************************************************
  *	     WINPROC_CallProc32ATo32W
  *
  * Call a window procedure, translating args from Ansi to Unicode.
@@ -148,8 +193,8 @@
             result = CallWndProc32( func, hwnd, msg, wParam, (LPARAM)str );
             STRING32_UniToAnsi( (LPSTR)lParam, str );
             HeapFree( SystemHeap, 0, str );
-            return strlen( (LPSTR)lParam ) + 1;
         }
+        return result;  /* FIXME? */
 
     case WM_SETTEXT:
         {
@@ -198,8 +243,8 @@
             result = CallWndProc32( func, hwnd, msg, wParam, (LPARAM)str );
             STRING32_AnsiToUni( (LPWSTR)lParam, str );
             HeapFree( SystemHeap, 0, str );
-            return STRING32_lstrlenW( (LPWSTR)lParam ) + 1;  /* FIXME? */
         }
+        return result;  /* FIXME? */
 
     case WM_SETTEXT:
         {
@@ -214,11 +259,13 @@
     case WM_CREATE:
         {
             CREATESTRUCT32A cs = *(CREATESTRUCT32A *)lParam;
-            cs.lpszName  = STRING32_DupUniToAnsi( (LPCWSTR)cs.lpszName );
-            cs.lpszClass = STRING32_DupUniToAnsi( (LPCWSTR)cs.lpszName );
+            if (HIWORD(cs.lpszName))
+                cs.lpszName  = STRING32_DupUniToAnsi( (LPCWSTR)cs.lpszName );
+            if (HIWORD(cs.lpszClass))
+                cs.lpszClass = STRING32_DupUniToAnsi( (LPCWSTR)cs.lpszName );
             result = CallWndProc32( func, hwnd, msg, wParam, (LPARAM)&cs );
-            free( (LPVOID)cs.lpszName );
-            free( (LPVOID)cs.lpszClass );
+            if (HIWORD(cs.lpszName)) free( (LPVOID)cs.lpszName );
+            if (HIWORD(cs.lpszClass)) free( (LPVOID)cs.lpszClass );
         }
         return result;
 	
@@ -563,13 +610,21 @@
             cls  = SEGPTR_STRDUP( cs32->lpszClass );
             cs->lpszName  = SEGPTR_GET(name);
             cs->lpszClass = SEGPTR_GET(cls);
+#ifdef WINELIB
             result = CallWndProc16( func, ds, hwnd, msg, (WPARAM16)wParam,
                                     (LPARAM)SEGPTR_GET(cs) );
-            STRUCT32_CREATESTRUCT16to32A( cs, cs32 );
-            if (PTR_SEG_TO_LIN(cs->lpszName) != name)
-                cs32->lpszName  = (LPCSTR)PTR_SEG_TO_LIN( cs->lpszName );
-            if (PTR_SEG_TO_LIN(cs->lpszClass) != cls)
-                cs32->lpszClass = (LPCSTR)PTR_SEG_TO_LIN( cs->lpszClass );
+#else
+            /* Build the CREATESTRUCT on the 16-bit stack. */
+            /* This is really ugly, but some programs (notably the */
+            /* "Undocumented Windows" examples) want it that way.  */
+            result = CallWndProcNCCREATE16( func, ds, cs->dwExStyle,
+                      cs->lpszClass, cs->lpszName, cs->style, cs->x, cs->y,
+                      cs->cx, cs->cy, cs->hwndParent, cs->hMenu, cs->hInstance,
+                      (LONG)cs->lpCreateParams, hwnd, msg, (WPARAM16)wParam,
+                      MAKELONG( IF1632_Saved16_sp-sizeof(CREATESTRUCT16),
+                                IF1632_Saved16_ss ) );
+#endif  /* WINELIB */
+            /* We don't bother to translate the structure back */
             SEGPTR_FREE(name);
             SEGPTR_FREE(cls);
             SEGPTR_FREE(cs);
@@ -580,6 +635,10 @@
         if ((wParam == WM_CREATE) || (wParam == WM_DESTROY))
             return CallWndProc16( func, ds, hwnd, msg, (WPARAM16)wParam,
                                   MAKELPARAM( (HWND16)lParam, LOWORD(wParam)));
+        else
+            return CallWndProc16( func, ds, hwnd, msg,
+                                  (WPARAM16)wParam, lParam );
+
     case WM_SETTEXT:
         {
             LPSTR str = SEGPTR_STRDUP( (LPSTR)lParam );
@@ -650,12 +709,14 @@
     case WM_CREATE:
         {
             CREATESTRUCT32A cs = *(CREATESTRUCT32A *)lParam;
-            cs.lpszName  = STRING32_DupUniToAnsi( (LPCWSTR)cs.lpszName );
-            cs.lpszClass = STRING32_DupUniToAnsi( (LPCWSTR)cs.lpszName );
+            if (HIWORD(cs.lpszName))
+                cs.lpszName  = STRING32_DupUniToAnsi( (LPCWSTR)cs.lpszName );
+            if (HIWORD(cs.lpszClass))
+                cs.lpszClass = STRING32_DupUniToAnsi( (LPCWSTR)cs.lpszName );
             result = WINPROC_CallProc32ATo16( func, ds, hwnd, msg, wParam,
                                               (LPARAM)&cs );
-            free( (LPVOID)cs.lpszName );
-            free( (LPVOID)cs.lpszClass );
+            if (HIWORD(cs.lpszName)) free( (LPVOID)cs.lpszName );
+            if (HIWORD(cs.lpszClass)) free( (LPVOID)cs.lpszClass );
         }
         return result;
 	
@@ -683,22 +744,31 @@
                           WPARAM16 wParam, LPARAM lParam )
 {
     WND *wndPtr;
+    WINDOWPROC *proc = WINPROC_GetPtr( (HANDLE32)func );
 
-    switch(WINPROC_GetWinProcType(func))
+    if (!proc)
     {
-    case WIN_PROC_16:
         wndPtr = WIN_FindWndPtr( hwnd );
         return CallWndProc16( (FARPROC)func,
                               wndPtr ? wndPtr->hInstance : CURRENT_DS,
                               hwnd, msg, wParam, lParam );
+    }
+
+    switch(proc->type)
+    {
+    case WIN_PROC_16:
+        wndPtr = WIN_FindWndPtr( hwnd );
+        return CallWndProc16( (FARPROC)proc->func,
+                              wndPtr ? wndPtr->hInstance : CURRENT_DS,
+                              hwnd, msg, wParam, lParam );
     case WIN_PROC_32A:
-        return WINPROC_CallProc16To32A( WINPROC_GetWinProcFunc(func),
+        return WINPROC_CallProc16To32A( (WNDPROC32)proc->func,
                                         hwnd, msg, wParam, lParam );
     case WIN_PROC_32W:
-        return WINPROC_CallProc16To32W( WINPROC_GetWinProcFunc(func),
+        return WINPROC_CallProc16To32W( (WNDPROC32)proc->func,
                                         hwnd, msg, wParam, lParam );
     default:
-        fprintf(stderr, "CallWindowProc16: invalid func %08x\n", (UINT32)func);
+        fprintf( stderr, "CallWindowProc16: invalid proc %p\n", proc );
         return 0;
     }
 }
@@ -711,22 +781,25 @@
                            WPARAM32 wParam, LPARAM lParam )
 {
     WND *wndPtr;
+    WINDOWPROC *proc = WINPROC_GetPtr( (HANDLE32)func );
 
-    switch(WINPROC_GetWinProcType( (WNDPROC16)func ))
+    if (!proc) return CallWndProc32( func, hwnd, msg, wParam, lParam );
+
+    switch(proc->type)
     {
     case WIN_PROC_16:
         wndPtr = WIN_FindWndPtr( hwnd );
-        return WINPROC_CallProc32ATo16( (FARPROC)func,
+        return WINPROC_CallProc32ATo16( (FARPROC)proc->func,
                                        wndPtr ? wndPtr->hInstance : CURRENT_DS,
                                        hwnd, msg, wParam, lParam );
     case WIN_PROC_32A:
-        return CallWndProc32( WINPROC_GetWinProcFunc( (WNDPROC16)func ),
+        return CallWndProc32( (WNDPROC32)proc->func,
                               hwnd, msg, wParam, lParam );
     case WIN_PROC_32W:
-        return WINPROC_CallProc32ATo32W(WINPROC_GetWinProcFunc((WNDPROC16)func),
-                                        hwnd, msg, wParam, lParam );
+        return WINPROC_CallProc32ATo32W( (WNDPROC32)proc->func,
+                                         hwnd, msg, wParam, lParam );
     default:
-        fprintf(stderr,"CallWindowProc32A: invalid func %08x\n",(UINT32)func);
+        fprintf( stderr, "CallWindowProc32A: invalid proc %p\n", proc );
         return 0;
     }
 }
@@ -739,22 +812,25 @@
                            WPARAM32 wParam, LPARAM lParam )
 {
     WND *wndPtr;
+    WINDOWPROC *proc = WINPROC_GetPtr( (HANDLE32)func );
 
-    switch(WINPROC_GetWinProcType( (WNDPROC16)func ))
+    if (!proc) return CallWndProc32( func, hwnd, msg, wParam, lParam );
+
+    switch(proc->type)
     {
     case WIN_PROC_16:
         wndPtr = WIN_FindWndPtr( hwnd );
-        return WINPROC_CallProc32WTo16( (FARPROC)func,
+        return WINPROC_CallProc32WTo16( (FARPROC)proc->func,
                                        wndPtr ? wndPtr->hInstance : CURRENT_DS,
                                        hwnd, msg, wParam, lParam );
     case WIN_PROC_32A:
-        return WINPROC_CallProc32WTo32A(WINPROC_GetWinProcFunc((WNDPROC16)func),
-                                        hwnd, msg, wParam, lParam );
+        return WINPROC_CallProc32WTo32A( (WNDPROC32)proc->func,
+                                         hwnd, msg, wParam, lParam );
     case WIN_PROC_32W:
-        return CallWndProc32( WINPROC_GetWinProcFunc( (WNDPROC16)func ),
+        return CallWndProc32( (WNDPROC32)proc->func,
                               hwnd, msg, wParam, lParam );
     default:
-        fprintf(stderr,"CallWindowProc32W: invalid func %08x\n",(UINT32)func);
+        fprintf( stderr, "CallWindowProc32W: invalid proc %p\n", proc );
         return 0;
     }
 }
