diff --git a/dlls/commdlg/cdlg.h b/dlls/commdlg/cdlg.h
index d63ed8e..cb2e7af 100644
--- a/dlls/commdlg/cdlg.h
+++ b/dlls/commdlg/cdlg.h
@@ -24,6 +24,10 @@
 #include "dlgs.h"
 #include "wine/windef16.h"
 
+/* handle conversions */
+#define HWND_16(h32)		(LOWORD(h32))
+#define HWND_32(h16)		((HWND)(ULONG_PTR)(h16))
+
 /*---------------- 16-bit ----------------*/
 extern HINSTANCE16	COMMDLG_hInstance;
 extern HINSTANCE	COMMDLG_hInstance32;
diff --git a/dlls/commdlg/colordlg.c b/dlls/commdlg/colordlg.c
index 4e079a0..04684de 100644
--- a/dlls/commdlg/colordlg.c
+++ b/dlls/commdlg/colordlg.c
@@ -845,8 +845,9 @@
            return FALSE;
        }
        ch32->lStructSize = sizeof(CHOOSECOLORW);
-       ch32->hwndOwner = ch16->hwndOwner;
-       ch32->hInstance = ch16->hInstance;
+       ch32->hwndOwner = HWND_32(ch16->hwndOwner);
+       /* Should be an HINSTANCE but MS made a typo */
+       ch32->hInstance = HWND_32(ch16->hInstance);
        ch32->lpCustColors = MapSL(ch16->lpCustColors);
        ch32->lpfnHook = (LPCCHOOKPROC) ch16->lpfnHook; /* only used as flag */
        ch32->Flags = ch16->Flags;
@@ -917,7 +918,8 @@
    if (CC_HookCallChk(lpp->lpcc))
    {
       if (b16)
-          res = CallWindowProc16( (WNDPROC16)lpp->lpcc16->lpfnHook, hDlg, WM_INITDIALOG, wParam, lParam);
+          res = CallWindowProc16( (WNDPROC16)lpp->lpcc16->lpfnHook,
+				  HWND_16(hDlg), WM_INITDIALOG, wParam, lParam);
       else
           res = CallWindowProcA( (WNDPROC)lpp->lpcc->lpfnHook, hDlg, WM_INITDIALOG, wParam, lParam);
    }
@@ -1054,8 +1056,9 @@
                    if (lpp->lpcc->hwndOwner)
 		       SendMessageA(lpp->lpcc->hwndOwner, i, 0, (LPARAM)lpp->lpcc16);
                    if ( CC_HookCallChk(lpp->lpcc))
-		       CallWindowProc16( (WNDPROC16) lpp->lpcc16->lpfnHook, hDlg,
-		          WM_COMMAND, psh15, (LPARAM)lpp->lpcc16);
+		       CallWindowProc16( (WNDPROC16) lpp->lpcc16->lpfnHook,
+					 HWND_16(hDlg), WM_COMMAND, psh15,
+					 (LPARAM)lpp->lpcc16);
                }
                else
                {
@@ -1299,10 +1302,12 @@
 /***********************************************************************
  *           ColorDlgProc   (COMMDLG.8)
  */
-LRESULT WINAPI ColorDlgProc16( HWND16 hDlg, UINT16 message,
+LRESULT WINAPI ColorDlgProc16( HWND16 hDlg16, UINT16 message,
                             WPARAM16 wParam, LONG lParam )
 {
  int res;
+ HWND hDlg = HWND_32(hDlg16);
+
  LCCPRIV lpp = (LCCPRIV)GetWindowLongA(hDlg, DWL_USER);
  if (message != WM_INITDIALOG)
  {
@@ -1310,7 +1315,7 @@
      return FALSE;
   res=0;
   if (CC_HookCallChk(lpp->lpcc))
-     res = CallWindowProc16( (WNDPROC16)lpp->lpcc16->lpfnHook, hDlg, message, wParam, lParam);
+     res = CallWindowProc16( (WNDPROC16)lpp->lpcc16->lpfnHook, hDlg16, message, wParam, lParam);
   if (res)
      return res;
  }
@@ -1332,7 +1337,8 @@
 	                SetWindowLongA(hDlg, DWL_USER, 0L); /* we don't need it anymore */
 	                break;
 	  case WM_COMMAND:
-	                if (CC_WMCommand(hDlg, wParam, lParam, HIWORD(lParam), (HWND)LOWORD(lParam)))
+	                if (CC_WMCommand(hDlg, wParam, lParam,
+					 HIWORD(lParam), HWND_32(LOWORD(lParam))))
 	                   return TRUE;
 	                break;
 	  case WM_PAINT:
@@ -1432,7 +1438,7 @@
     }
 
     ptr = GetProcAddress16(GetModuleHandle16("COMMDLG"), (LPCSTR) 8);
-    hInst = GetWindowLongA(lpChCol->hwndOwner, GWL_HINSTANCE);
+    hInst = GetWindowLongA(HWND_32(lpChCol->hwndOwner), GWL_HINSTANCE);
     bRet = DialogBoxIndirectParam16(hInst, hDlgTmpl16, lpChCol->hwndOwner,
                      (DLGPROC16) ptr, (DWORD)lpChCol);
     if (hResource16) FreeResource16(hDlgTmpl16);
diff --git a/dlls/commdlg/filedlg.c b/dlls/commdlg/filedlg.c
index 6aa7335..1f0bdae 100644
--- a/dlls/commdlg/filedlg.c
+++ b/dlls/commdlg/filedlg.c
@@ -297,7 +297,7 @@
     if (lfs->ofn16)
     {
         return (BOOL16) CallWindowProc16(
-          (WNDPROC16)lfs->ofn16->lpfnHook, lfs->hwnd,
+          (WNDPROC16)lfs->ofn16->lpfnHook, HWND_16(lfs->hwnd),
           (UINT16)wMsg, (WPARAM16)wParam, lParam);
     }
     if (lfs->ofnA)
@@ -1042,7 +1042,7 @@
     lpdis->itemID = lpdis16->itemID;
     lpdis->itemAction = lpdis16->itemAction;
     lpdis->itemState = lpdis16->itemState;
-    lpdis->hwndItem = lpdis16->hwndItem;
+    lpdis->hwndItem = HWND_32(lpdis16->hwndItem);
     lpdis->hDC = lpdis16->hDC;
     lpdis->rcItem.right = lpdis16->rcItem.right;
     lpdis->rcItem.left = lpdis16->rcItem.left;
@@ -1145,7 +1145,7 @@
     /* first convert to linear pointers */
     memset(&ofnA, 0, sizeof(OPENFILENAMEA));
     ofnA.lStructSize = sizeof(OPENFILENAMEA);
-    ofnA.hwndOwner = ofn16->hwndOwner;
+    ofnA.hwndOwner = HWND_32(ofn16->hwndOwner);
     ofnA.hInstance = ofn16->hInstance;
     if (ofn16->lpstrFilter)
         ofnA.lpstrFilter = MapSL(ofn16->lpstrFilter);
@@ -1343,9 +1343,10 @@
 /***********************************************************************
  *           FileOpenDlgProc   (COMMDLG.6)
  */
-LRESULT WINAPI FileOpenDlgProc16(HWND16 hWnd, UINT16 wMsg, WPARAM16 wParam,
+LRESULT WINAPI FileOpenDlgProc16(HWND16 hWnd16, UINT16 wMsg, WPARAM16 wParam,
                                LPARAM lParam)
 {
+    HWND hWnd = HWND_32(hWnd16);
     LFSPRIVATE lfs = (LFSPRIVATE)GetPropA(hWnd,OFN_PROP);
     DRAWITEMSTRUCT dis;
 
@@ -1362,7 +1363,7 @@
         return FILEDLG_WMInitDialog(hWnd, wParam, lParam);
 
     case WM_MEASUREITEM:
-        return FILEDLG_WMMeasureItem16(hWnd, wParam, lParam);
+        return FILEDLG_WMMeasureItem16(hWnd16, wParam, lParam);
 
     case WM_DRAWITEM:
         FILEDLG_MapDrawItemStruct(MapSL(lParam), &dis);
@@ -1391,9 +1392,10 @@
 /***********************************************************************
  *           FileSaveDlgProc   (COMMDLG.7)
  */
-LRESULT WINAPI FileSaveDlgProc16(HWND16 hWnd, UINT16 wMsg, WPARAM16 wParam,
+LRESULT WINAPI FileSaveDlgProc16(HWND16 hWnd16, UINT16 wMsg, WPARAM16 wParam,
                                LPARAM lParam)
 {
+ HWND hWnd = HWND_32(hWnd16);
  LFSPRIVATE lfs = (LFSPRIVATE)GetPropA(hWnd,OFN_PROP);
  DRAWITEMSTRUCT dis;
 
@@ -1410,7 +1412,7 @@
       return FILEDLG_WMInitDialog(hWnd, wParam, lParam);
 
    case WM_MEASUREITEM:
-      return FILEDLG_WMMeasureItem16(hWnd, wParam, lParam);
+      return FILEDLG_WMMeasureItem16(hWnd16, wParam, lParam);
 
    case WM_DRAWITEM:
       FILEDLG_MapDrawItemStruct(MapSL(lParam), &dis);
@@ -1515,7 +1517,7 @@
     lfs = FILEDLG_AllocPrivate((LPARAM) ofn, LFS16, OPEN_DIALOG);
     if (lfs)
     {
-        hInst = GetWindowLongA( lpofn->hwndOwner, GWL_HINSTANCE );
+        hInst = GetWindowLongA( HWND_32(lpofn->hwndOwner), GWL_HINSTANCE );
         ptr = GetProcAddress16(GetModuleHandle16("COMMDLG"), (LPCSTR) 6);
         bRet = DialogBoxIndirectParam16( hInst, lfs->hDlgTmpl16, lpofn->hwndOwner,
              (DLGPROC16) ptr, (DWORD) lfs);
@@ -1553,7 +1555,7 @@
     lfs = FILEDLG_AllocPrivate((LPARAM) ofn, LFS16, SAVE_DIALOG);
     if (lfs)
     {
-        hInst = GetWindowLongA( lpofn->hwndOwner, GWL_HINSTANCE );
+        hInst = GetWindowLongA( HWND_32(lpofn->hwndOwner), GWL_HINSTANCE );
         ptr = GetProcAddress16(GetModuleHandle16("COMMDLG"), (LPCSTR) 7);
         bRet = DialogBoxIndirectParam16( hInst, lfs->hDlgTmpl16, lpofn->hwndOwner,
              (DLGPROC16) ptr, (DWORD) lfs);
diff --git a/dlls/commdlg/finddlg.c b/dlls/commdlg/finddlg.c
index 5ef7f00..1e6f540 100644
--- a/dlls/commdlg/finddlg.c
+++ b/dlls/commdlg/finddlg.c
@@ -176,7 +176,7 @@
     lfr->find = TRUE;
     if (FINDDLG_Get16BitsTemplate(lfr))
     {
-        hInst = GetWindowLongA( lfr->fr16->hwndOwner , GWL_HINSTANCE);
+        hInst = GetWindowLongA( HWND_32(lfr->fr16->hwndOwner), GWL_HINSTANCE);
         ptr = GetProcAddress16(GetModuleHandle16("COMMDLG"), (LPCSTR) 13);
         ret = CreateDialogIndirectParam16( hInst, lfr->template,
                     lfr->fr16->hwndOwner, (DLGPROC16) ptr, find);
@@ -206,7 +206,7 @@
     lfr->find = FALSE;
     if (FINDDLG_Get16BitsTemplate(lfr))
     {
-        hInst = GetWindowLongA( lfr->fr16->hwndOwner , GWL_HINSTANCE);
+        hInst = GetWindowLongA( HWND_32(lfr->fr16->hwndOwner), GWL_HINSTANCE);
         ptr = GetProcAddress16(GetModuleHandle16("COMMDLG"), (LPCSTR) 14);
         ret = CreateDialogIndirectParam16( hInst, lfr->template,
                     lfr->fr16->hwndOwner, (DLGPROC16) ptr, find);
@@ -311,9 +311,10 @@
 /***********************************************************************
  *           FindTextDlgProc   (COMMDLG.13)
  */
-LRESULT WINAPI FindTextDlgProc16(HWND16 hWnd, UINT16 wMsg, WPARAM16 wParam,
+LRESULT WINAPI FindTextDlgProc16(HWND16 hWnd16, UINT16 wMsg, WPARAM16 wParam,
                                  LPARAM lParam)
 {
+    HWND hWnd = HWND_32(hWnd16);
     LPFINDREPLACE16 lpfr;
     switch (wMsg) {
 	case WM_INITDIALOG:
@@ -322,7 +323,7 @@
 		MapSL(lpfr->lpstrFindWhat), FALSE);
 	case WM_COMMAND:
 	    lpfr=MapSL(GetWindowLongA(hWnd, DWL_USER));
-	    return FINDDLG_WMCommand(hWnd, wParam, lpfr->hwndOwner,
+	    return FINDDLG_WMCommand(hWnd, wParam, HWND_32(lpfr->hwndOwner),
 		&lpfr->Flags, MapSL(lpfr->lpstrFindWhat),
 		lpfr->wFindWhatLen, FALSE);
     }
@@ -467,9 +468,10 @@
 /***********************************************************************
  *           ReplaceTextDlgProc   (COMMDLG.14)
  */
-LRESULT WINAPI ReplaceTextDlgProc16(HWND16 hWnd, UINT16 wMsg, WPARAM16 wParam,
+LRESULT WINAPI ReplaceTextDlgProc16(HWND16 hWnd16, UINT16 wMsg, WPARAM16 wParam,
                                     LPARAM lParam)
 {
+    HWND hWnd = HWND_32(hWnd16);
     LPFINDREPLACE16 lpfr;
     switch (wMsg) {
 	case WM_INITDIALOG:
@@ -479,11 +481,10 @@
 		    MapSL(lpfr->lpstrReplaceWith), FALSE);
 	case WM_COMMAND:
 	    lpfr=MapSL(GetWindowLongA(hWnd, DWL_USER));
-	    return REPLACEDLG_WMCommand(hWnd, wParam, lpfr->hwndOwner,
+	    return REPLACEDLG_WMCommand(hWnd, wParam, HWND_32(lpfr->hwndOwner),
 		    &lpfr->Flags, MapSL(lpfr->lpstrFindWhat),
 		    lpfr->wFindWhatLen, MapSL(lpfr->lpstrReplaceWith),
 		    lpfr->wReplaceWithLen, FALSE);
     }
     return FALSE;
 }
-
diff --git a/dlls/commdlg/fontdlg.c b/dlls/commdlg/fontdlg.c
index 7e883cd..df04772 100644
--- a/dlls/commdlg/fontdlg.c
+++ b/dlls/commdlg/fontdlg.c
@@ -70,7 +70,7 @@
 static void CFn_CHOOSEFONT16to32A(LPCHOOSEFONT16 chf16, LPCHOOSEFONTA chf32a)
 {
   chf32a->lStructSize=sizeof(CHOOSEFONTA);
-  chf32a->hwndOwner=chf16->hwndOwner;
+  chf32a->hwndOwner=HWND_32(chf16->hwndOwner);
   chf32a->hDC=chf16->hDC;
   chf32a->iPointSize=chf16->iPointSize;
   chf32a->Flags=chf16->Flags;
@@ -223,7 +223,7 @@
     lpChFont->lpTemplateName=(SEGPTR)&cf32a;
 
     ptr = GetProcAddress16(GetModuleHandle16("COMMDLG"), (LPCSTR) 16);
-    hInst = GetWindowLongA(lpChFont->hwndOwner, GWL_HINSTANCE);
+    hInst = GetWindowLongA(HWND_32(lpChFont->hwndOwner), GWL_HINSTANCE);
     bRet = DialogBoxIndirectParam16(hInst, hDlgTmpl16, lpChFont->hwndOwner,
                      (DLGPROC16) ptr, (DWORD)lpChFont);
     if (hResource16) FreeResource16(hDlgTmpl16);
@@ -536,7 +536,7 @@
 INT16 WINAPI FontFamilyEnumProc16( SEGPTR logfont, SEGPTR metrics,
                                    UINT16 nFontType, LPARAM lParam )
 {
-  HWND16 hwnd=LOWORD(lParam);
+  HWND hwnd=HWND_32(LOWORD(lParam));
   HWND hDlg=GetParent(hwnd);
   LPCHOOSEFONT16 lpcf=(LPCHOOSEFONT16)GetWindowLongA(hDlg, DWL_USER);
   LOGFONT16 *lplf = MapSL( logfont );
@@ -667,8 +667,8 @@
 INT16 WINAPI FontStyleEnumProc16( SEGPTR logfont, SEGPTR metrics,
                                   UINT16 nFontType, LPARAM lParam )
 {
-  HWND16 hcmb2=LOWORD(lParam);
-  HWND16 hcmb3=HIWORD(lParam);
+  HWND hcmb2=HWND_32(LOWORD(lParam));
+  HWND hcmb3=HWND_32(HIWORD(lParam));
   HWND hDlg=GetParent(hcmb3);
   LPCHOOSEFONT16 lpcf=(LPCHOOSEFONT16)GetWindowLongA(hDlg, DWL_USER);
   LOGFONT16 *lplf = MapSL(logfont);
@@ -782,7 +782,7 @@
       {
         SendDlgItemMessageA(hDlg, cmb1, CB_SETCURSEL, j, 0);
 	SendMessageA(hDlg, WM_COMMAND, MAKEWPARAM(cmb1, CBN_SELCHANGE),
-                       GetDlgItem(hDlg,cmb1));
+                     (LPARAM)GetDlgItem(hDlg,cmb1));
         init=1;
         /* look for fitting font style in combobox2 */
         l=MAKELONG(lpxx->lfWeight > FW_MEDIUM ? FW_BOLD:FW_NORMAL,lpxx->lfItalic !=0);
@@ -805,7 +805,7 @@
     {
       SendDlgItemMessageA(hDlg,cmb1,CB_SETCURSEL,0,0);
       SendMessageA(hDlg, WM_COMMAND, MAKEWPARAM(cmb1, CBN_SELCHANGE),
-                       GetDlgItem(hDlg,cmb1));
+                   (LPARAM)GetDlgItem(hDlg,cmb1));
     }
     if (lpcf->Flags & CF_USESTYLE && lpcf->lpszStyle)
     {
@@ -814,7 +814,7 @@
       {
         j=SendDlgItemMessageA(hDlg,cmb2,CB_SETCURSEL,j,0);
         SendMessageA(hDlg,WM_COMMAND,cmb2,
-                       MAKELONG(GetDlgItem(hDlg,cmb2),CBN_SELCHANGE));
+                       MAKELONG(HWND_16(GetDlgItem(hDlg,cmb2)),CBN_SELCHANGE));
       }
     }
   }
@@ -957,7 +957,7 @@
                              LPCHOOSEFONTA lpcf)
 {
   if (lpcf->Flags & CF_EFFECTS)
-   if (GetDlgCtrlID(lParam)==stc6)
+   if (GetDlgCtrlID(HWND_32(LOWORD(lParam)))==stc6)
    {
      SetTextColor((HDC)wParam, lpcf->rgbColors);
      return GetStockObject(WHITE_BRUSH);
@@ -1118,9 +1118,10 @@
                     2. some CF_.. flags are not supported
                     3. some TType extensions
  */
-LRESULT WINAPI FormatCharDlgProc16(HWND16 hDlg, UINT16 message, WPARAM16 wParam,
-                                   LPARAM lParam)
+LRESULT WINAPI FormatCharDlgProc16(HWND16 hDlg16, UINT16 message,
+				   WPARAM16 wParam, LPARAM lParam)
 {
+  HWND hDlg = HWND_32(hDlg16);
   LPCHOOSEFONT16 lpcf;
   LPCHOOSEFONTA lpcf32a;
   LRESULT res=0;
@@ -1130,7 +1131,7 @@
    if (!lpcf)
       return FALSE;
    if (CFn_HookCallChk(lpcf))
-     res=CallWindowProc16((WNDPROC16)lpcf->lpfnHook,hDlg,message,wParam,lParam);
+     res=CallWindowProc16((WNDPROC16)lpcf->lpfnHook,hDlg16,message,wParam,lParam);
    if (res)
     return res;
   }
@@ -1144,7 +1145,7 @@
       return FALSE;
     }
     if (CFn_HookCallChk(lpcf))
-      return CallWindowProc16((WNDPROC16)lpcf->lpfnHook,hDlg,WM_INITDIALOG,wParam,lParam);
+      return CallWindowProc16((WNDPROC16)lpcf->lpfnHook,hDlg16,WM_INITDIALOG,wParam,lParam);
   }
   lpcf32a=(LPCHOOSEFONTA)lpcf->lpTemplateName;
   switch (message)
@@ -1173,7 +1174,7 @@
             dis.itemID     = dis16->itemID;
             dis.itemAction = dis16->itemAction;
             dis.itemState  = dis16->itemState;
-            dis.hwndItem   = dis16->hwndItem;
+            dis.hwndItem   = HWND_32(dis16->hwndItem);
             dis.hDC        = dis16->hDC;
             dis.itemData   = dis16->itemData;
             CONV_RECT16TO32( &dis16->rcItem, &dis.rcItem );
@@ -1182,7 +1183,7 @@
         break;
     case WM_CTLCOLOR:
         if (HIWORD(lParam) == CTLCOLOR_STATIC)
-            res=CFn_WMCtlColorStatic(hDlg, (HDC)wParam, (HWND)LOWORD(lParam), lpcf32a);
+            res=CFn_WMCtlColorStatic(hDlg, (HDC)wParam, LOWORD(lParam), lpcf32a);
         break;
     case WM_COMMAND:
         res=CFn_WMCommand(hDlg, MAKEWPARAM( wParam, HIWORD(lParam) ), LOWORD(lParam), lpcf32a);
diff --git a/dlls/commdlg/printdlg.c b/dlls/commdlg/printdlg.c
index e6475de..b014e84 100644
--- a/dlls/commdlg/printdlg.c
+++ b/dlls/commdlg/printdlg.c
@@ -1726,7 +1726,7 @@
 
 	    memcpy(&pdlg,PrintStructures->dlg.lpPrintDlg16,sizeof(pdlg));
 	    pdlg.Flags |= PD_PRINTSETUP;
-	    pdlg.hwndOwner = hDlg;
+	    pdlg.hwndOwner = HWND_16(hDlg);
 	    if (!PrintDlg16(&pdlg))
 		break;
 	}
@@ -2660,7 +2660,7 @@
 ) {
     BOOL      bRet = FALSE;
     LPVOID   ptr;
-    HINSTANCE hInst = GetWindowLongA( lppd->hwndOwner, GWL_HINSTANCE );
+    HINSTANCE hInst = GetWindowLongA( HWND_32(lppd->hwndOwner), GWL_HINSTANCE );
 
     if(TRACE_ON(commdlg)) {
         char flagstr[1000] = "";
@@ -2743,7 +2743,9 @@
 	PrintStructures->dlg.lpPrintDlg = (LPPRINTDLGA)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(PRINTDLGA));
 #define CVAL(x)	PrintStructures->dlg.lpPrintDlg->x = lppd->x;
 #define MVAL(x)	PrintStructures->dlg.lpPrintDlg->x = MapSL(lppd->x);
-	CVAL(Flags);CVAL(hwndOwner);CVAL(hDC);
+	CVAL(Flags);
+	PrintStructures->dlg.lpPrintDlg->hwndOwner = HWND_32(lppd->hwndOwner);
+	CVAL(hDC);
 	CVAL(nFromPage);CVAL(nToPage);CVAL(nMinPage);CVAL(nMaxPage);
 	CVAL(nCopies);CVAL(hInstance);CVAL(lCustData);
 	MVAL(lpPrintTemplateName);MVAL(lpSetupTemplateName);
@@ -3459,9 +3461,10 @@
 /***********************************************************************
  *           PrintDlgProc   (COMMDLG.21)
  */
-LRESULT WINAPI PrintDlgProc16(HWND16 hDlg, UINT16 uMsg, WPARAM16 wParam,
+LRESULT WINAPI PrintDlgProc16(HWND16 hDlg16, UINT16 uMsg, WPARAM16 wParam,
                             LPARAM lParam)
 {
+    HWND hDlg = HWND_32(hDlg16);
     PRINT_PTRA* PrintStructures;
     LRESULT res=FALSE;
 
@@ -3477,7 +3480,7 @@
 	if(PrintStructures->dlg.lpPrintDlg16->Flags & PD_ENABLEPRINTHOOK) {
 	    res = CallWindowProc16(
 		(WNDPROC16)PrintStructures->dlg.lpPrintDlg16->lpfnPrintHook,
-		hDlg, uMsg, wParam, (LPARAM)PrintStructures->dlg.lpPrintDlg16
+		hDlg16, uMsg, wParam, (LPARAM)PrintStructures->dlg.lpPrintDlg16
 	    );
 	}
 	return res;
@@ -3486,7 +3489,7 @@
     if(PrintStructures->dlg.lpPrintDlg16->Flags & PD_ENABLEPRINTHOOK) {
         res = CallWindowProc16(
 		(WNDPROC16)PrintStructures->dlg.lpPrintDlg16->lpfnPrintHook,
-		hDlg,uMsg, wParam, lParam
+		hDlg16,uMsg, wParam, lParam
 	);
 	if(LOWORD(res)) return res;
     }
@@ -3517,9 +3520,10 @@
 /***********************************************************************
  *           PrintSetupDlgProc   (COMMDLG.22)
  */
-LRESULT WINAPI PrintSetupDlgProc16(HWND16 hWnd, UINT16 wMsg, WPARAM16 wParam,
+LRESULT WINAPI PrintSetupDlgProc16(HWND16 hWnd16, UINT16 wMsg, WPARAM16 wParam,
 				   LPARAM lParam)
 {
+  HWND hWnd = HWND_32(hWnd16);
   switch (wMsg)
     {
     case WM_INITDIALOG:
diff --git a/dlls/wineps/driver.c b/dlls/wineps/driver.c
index 6c0acf2..a488393 100644
--- a/dlls/wineps/driver.c
+++ b/dlls/wineps/driver.c
@@ -32,6 +32,8 @@
 
 WINE_DEFAULT_DEBUG_CHANNEL(psdrv);
 
+#define HWND_16(h32)		(LOWORD(h32))
+#define HWND_32(h16)		((HWND)(ULONG_PTR)(h16))
 
 /************************************************************************
  *
@@ -325,7 +327,7 @@
     psh.dwSize = sizeof(psh);
     psh.pszCaption = SetupW;
     psh.nPages = 1;
-    psh.hwndParent = hwnd;
+    psh.hwndParent = HWND_32(hwnd);
     psh.u3.phpage = hpsp;
 
     pPropertySheet(&psh);
@@ -351,8 +353,8 @@
 			LPSTR lpszDevice, LPSTR lpszPort, LPDEVMODEA lpdmInput,
 			LPSTR lpszProfile, DWORD dwMode)
 {
-    return PSDRV_ExtDeviceMode16(hwnd, 0, lpdmOutput, lpszDevice, lpszPort,
-				 lpdmInput, lpszProfile, dwMode);
+    return PSDRV_ExtDeviceMode16(HWND_16(hwnd), 0, lpdmOutput, lpszDevice,
+				 lpszPort, lpdmInput, lpszProfile, dwMode);
 }
 
 /***********************************************************************
diff --git a/dlls/winsock/async.c b/dlls/winsock/async.c
index 15239ca..3f45704 100644
--- a/dlls/winsock/async.c
+++ b/dlls/winsock/async.c
@@ -485,7 +485,7 @@
 		}
 		break;
 	}
-	PostMessageA(aq->hWnd,aq->uMsg,aq->async_handle,size|(fail<<16));
+	PostMessageA(HWND_32(aq->hWnd),aq->uMsg,aq->async_handle,size|(fail<<16));
 	HeapFree(GetProcessHeap(),0,arg);
 	return 0;
 }
@@ -540,7 +540,7 @@
 	case AQ_DUPLOWPTR2: pfm = ptr2; ptr2 = pto; do *pto++ = tolower(*pfm); while (*pfm++);	break;
 	}
 
-	aq->hWnd	= hWnd;
+	aq->hWnd	= HWND_16(hWnd);
 	aq->uMsg	= uMsg;
 	aq->int1	= int1;
 	aq->ptr1	= ptr1;
@@ -567,7 +567,8 @@
 {
 	TRACE("hwnd %04x, msg %04x, addr %08x[%i]\n",
 	       hWnd, uMsg, (unsigned)addr , len );
-	return __WSAsyncDBQuery(hWnd,uMsg,len,addr,type,NULL,(void*)sbuf,buflen,
+	return __WSAsyncDBQuery(HWND_32(hWnd),uMsg,len,addr,type,NULL,
+				(void*)sbuf,buflen,
 				AQ_NUMBER|AQ_COPYPTR1|AQ_WIN16|AQ_GETHOST);
 }
 
@@ -591,7 +592,8 @@
 {
 	TRACE("hwnd %04x, msg %04x, host %s, buffer %i\n",
 	      hWnd, uMsg, (name)?name:"<null>", (int)buflen );
-	return __WSAsyncDBQuery(hWnd,uMsg,0,name,0,NULL,(void*)sbuf,buflen,
+	return __WSAsyncDBQuery(HWND_32(hWnd),uMsg,0,name,0,NULL,
+				(void*)sbuf,buflen,
 				AQ_NAME|AQ_DUPLOWPTR1|AQ_WIN16|AQ_GETHOST);
 }
 
@@ -602,7 +604,7 @@
 					LPSTR sbuf, INT buflen)
 {
 	TRACE("hwnd %04x, msg %08x, host %s, buffer %i\n",
-	       (HWND16)hWnd, uMsg, (name)?name:"<null>", (int)buflen );
+	       hWnd, uMsg, (name)?name:"<null>", (int)buflen );
 	return __WSAsyncDBQuery(hWnd,uMsg,0,name,0,NULL,sbuf,buflen,
 				AQ_NAME|AQ_DUPLOWPTR1|AQ_WIN32|AQ_GETHOST);
 }
@@ -614,8 +616,9 @@
                                          SEGPTR sbuf, INT16 buflen)
 {
 	TRACE("hwnd %04x, msg %08x, protocol %s\n",
-	       (HWND16)hWnd, uMsg, (name)?name:"<null>" );
-	return __WSAsyncDBQuery(hWnd,uMsg,0,name,0,NULL,(void*)sbuf,buflen,
+	       hWnd, uMsg, (name)?name:"<null>" );
+	return __WSAsyncDBQuery(HWND_32(hWnd),uMsg,0,name,0,NULL,
+				(void*)sbuf,buflen,
 				AQ_NAME|AQ_DUPLOWPTR1|AQ_WIN16|AQ_GETPROTO);
 }
 
@@ -626,7 +629,7 @@
                                          LPSTR sbuf, INT buflen)
 {
 	TRACE("hwnd %04x, msg %08x, protocol %s\n",
-	       (HWND16)hWnd, uMsg, (name)?name:"<null>" );
+	       hWnd, uMsg, (name)?name:"<null>" );
 	return __WSAsyncDBQuery(hWnd,uMsg,0,name,0,NULL,sbuf,buflen,
 				AQ_NAME|AQ_DUPLOWPTR1|AQ_WIN32|AQ_GETPROTO);
 }
@@ -639,7 +642,8 @@
                                            SEGPTR sbuf, INT16 buflen)
 {
 	TRACE("hwnd %04x, msg %04x, num %i\n", hWnd, uMsg, number );
-	return __WSAsyncDBQuery(hWnd,uMsg,number,NULL,0,NULL,(void*)sbuf,buflen,
+	return __WSAsyncDBQuery(HWND_32(hWnd),uMsg,number,NULL,0,NULL,
+				(void*)sbuf,buflen,
 				AQ_GETPROTO|AQ_NUMBER|AQ_WIN16);
 }
 
@@ -662,7 +666,8 @@
 {
 	TRACE("hwnd %04x, msg %04x, name %s, proto %s\n",
 	       hWnd, uMsg, (name)?name:"<null>", (proto)?proto:"<null>");
-	return __WSAsyncDBQuery(hWnd,uMsg,0,name,0,proto,(void*)sbuf,buflen,
+	return __WSAsyncDBQuery(HWND_32(hWnd),uMsg,0,name,0,proto,
+				(void*)sbuf,buflen,
 				AQ_GETSERV|AQ_NAME|AQ_DUPLOWPTR1|AQ_DUPLOWPTR2|AQ_WIN16);
 }
 
@@ -686,7 +691,8 @@
 {
 	TRACE("hwnd %04x, msg %04x, port %i, proto %s\n",
 	       hWnd, uMsg, port, (proto)?proto:"<null>" );
-	return __WSAsyncDBQuery(hWnd,uMsg,port,NULL,0,proto,(void*)sbuf,buflen,
+	return __WSAsyncDBQuery(HWND_32(hWnd),uMsg,port,NULL,0,proto,
+				(void*)sbuf,buflen,
 				AQ_GETSERV|AQ_NUMBER|AQ_DUPLOWPTR2|AQ_WIN16);
 }
 
diff --git a/dlls/winsock/socket.c b/dlls/winsock/socket.c
index 5b04361..81e8d00 100644
--- a/dlls/winsock/socket.c
+++ b/dlls/winsock/socket.c
@@ -3314,7 +3314,7 @@
  */
 INT16 WINAPI WSAAsyncSelect16(SOCKET16 s, HWND16 hWnd, UINT16 wMsg, LONG lEvent)
 {
-    return (INT16)WSAAsyncSelect( s, hWnd, wMsg, lEvent );
+    return (INT16)WSAAsyncSelect( s, HWND_32(hWnd), wMsg, lEvent );
 }
 
 /***********************************************************************
diff --git a/include/windef.h b/include/windef.h
index 8e0af59..5f60721 100644
--- a/include/windef.h
+++ b/include/windef.h
@@ -94,7 +94,7 @@
 DECLARE_HANDLE(HTASK);
 DECLARE_HANDLE(HWINEVENTHOOK);
 DECLARE_HANDLE(HWINSTA);
-DECLARE_OLD_HANDLE(HWND);
+DECLARE_HANDLE(HWND);
 
 /* Handle types that must remain interchangeable even with strict on */
 
diff --git a/include/wine/winsock16.h b/include/wine/winsock16.h
index ceed17b..2ea8a05 100644
--- a/include/wine/winsock16.h
+++ b/include/wine/winsock16.h
@@ -105,4 +105,7 @@
 INT16     WINAPI WSAAsyncSelect16(SOCKET16 s, HWND16 hWnd, UINT16 wMsg, LONG lEvent);
 INT16     WINAPI WSARecvEx16(SOCKET16 s, char *buf, INT16 len, INT16 *flags);
 
+#define HWND_16(h32)		(LOWORD(h32))
+#define HWND_32(h16)		((HWND)(ULONG_PTR)(h16))
+
 #endif /* __WINE_WINE_WINSOCK16_H */
