diff --git a/if1632/user.spec b/if1632/user.spec
index b9d9b7899e5e103049e3ee3f97a211504d6477f8..fba8d434c775fc2492c625b68e50d48c7214c5f1 100644
--- a/if1632/user.spec
+++ b/if1632/user.spec
@@ -91,7 +91,7 @@ file	user.exe
 87  pascal16 DialogBox(word segstr word segptr) DialogBox16
 88  pascal16 EndDialog(word s_word) EndDialog16
 89  pascal16 CreateDialog(word segstr word segptr) CreateDialog16
-90  pascal16 IsDialogMessage(word ptr) IsDialogMessage16
+90  pascal16 IsDialogMessage(word segptr) WIN16_IsDialogMessage16
 91  pascal16 GetDlgItem(word word) GetDlgItem16
 92  pascal16 SetDlgItemText(word word segstr) SetDlgItemText16
 93  pascal16 GetDlgItemText(word word segptr word) GetDlgItemText16
diff --git a/windows/dialog.c b/windows/dialog.c
index fa6e8a7eeff94f8973ec2fda47b213fd6fca13a8..c4f763d5c49aa24f3ff1d623d95bb97c8036cd4a 100644
--- a/windows/dialog.c
+++ b/windows/dialog.c
@@ -1193,16 +1193,16 @@ static BOOL32 DIALOG_IsDialogMessage( HWND32 hwnd, HWND32 hwndDlg,
 /***********************************************************************
  *           IsDialogMessage16   (USER.90)
  */
-BOOL16 WINAPI IsDialogMessage16( HWND16 hwndDlg, LPMSG16 msg )
+BOOL16 WINAPI WIN16_IsDialogMessage16( HWND16 hwndDlg, SEGPTR msg16 )
 {
+    LPMSG16 msg = PTR_SEG_TO_LIN(msg16);
     BOOL32 ret, translate, dispatch;
     INT32 dlgCode;
 
     if ((hwndDlg != msg->hwnd) && !IsChild16( hwndDlg, msg->hwnd ))
         return FALSE;
 
-
-    dlgCode = SendMessage16( msg->hwnd, WM_GETDLGCODE, 0, (LPARAM)msg);
+    dlgCode = SendMessage16( msg->hwnd, WM_GETDLGCODE, 0, (LPARAM)msg16);
     ret = DIALOG_IsDialogMessage( msg->hwnd, hwndDlg, msg->message,
                                   msg->wParam, msg->lParam,
                                   &translate, &dispatch, dlgCode );
@@ -1212,6 +1212,17 @@ BOOL16 WINAPI IsDialogMessage16( HWND16 hwndDlg, LPMSG16 msg )
 }
 
 
+BOOL16 WINAPI IsDialogMessage16( HWND16 hwndDlg, LPMSG16 msg )
+{
+    LPMSG16 msg16 = SEGPTR_NEW(MSG16);
+    BOOL32 ret;
+
+    *msg16 = *msg;
+    ret = WIN16_IsDialogMessage16( hwndDlg, SEGPTR_GET(msg16) );
+    SEGPTR_FREE(msg16);
+    return ret;
+}
+
 /***********************************************************************
  *           IsDialogMessage32A   (USER32.342)
  */
diff --git a/windows/winproc.c b/windows/winproc.c
index e6ddfed12c7b52a3b1bd1c3ed2c1c1fa46b9f373..1fda1196967f2361cbacabf931f9645f40e0123f 100644
--- a/windows/winproc.c
+++ b/windows/winproc.c
@@ -800,6 +800,7 @@ INT32 WINPROC_MapMsg16To32A( UINT16 msg16, WPARAM16 wParam16, UINT32 *pmsg32,
         }
         return 1;
     case WM_GETTEXT:
+    case WM_SETTEXT:
         *plparam = (LPARAM)PTR_SEG_TO_LIN(*plparam);
         return 0;
     case WM_MDICREATE:
@@ -883,9 +884,6 @@ INT32 WINPROC_MapMsg16To32A( UINT16 msg16, WPARAM16 wParam16, UINT32 *pmsg32,
             *plparam   = (LPARAM)(HWND32)LOWORD(*plparam);
         }
         return 0;
-    case WM_SETTEXT:
-        *plparam = (LPARAM)PTR_SEG_TO_LIN(*plparam);
-        return 0;
     case WM_WINDOWPOSCHANGING:
     case WM_WINDOWPOSCHANGED:
         {
@@ -898,6 +896,26 @@ INT32 WINPROC_MapMsg16To32A( UINT16 msg16, WPARAM16 wParam16, UINT32 *pmsg32,
             *plparam = (LPARAM)wp;
         }
         return 1;
+    case WM_GETDLGCODE:
+        {
+            LPMSG16 msg16 = (LPMSG16)PTR_SEG_TO_LIN(*plparam);
+            LPMSG32 msg32 = (LPMSG32)HeapAlloc( SystemHeap, 0, sizeof(MSG32) );
+
+            if (!msg32) return -1;
+            msg32->hwnd = msg16->hwnd;
+            msg32->lParam = msg16->lParam;
+            msg32->time = msg16->time;
+            CONV_POINT16TO32(&msg16->pt,&msg32->pt);
+            /* this is right, right? */
+            if (WINPROC_MapMsg16To32A(msg16->message,msg16->wParam,
+                                     &msg32->message,&msg32->wParam,
+                                     &msg32->lParam)<0) {
+                HeapFree( SystemHeap, 0, msg32 );
+                return -1;
+            }
+            *plparam = (LPARAM)msg32;
+        }
+        return 1;
     case WM_NOTIFY:
     	*plparam = (LPARAM)PTR_SEG_TO_LIN(*plparam);
     	return 1;
@@ -1003,6 +1021,15 @@ LRESULT WINPROC_UnmapMsg16To32A( UINT32 msg, WPARAM32 wParam, LPARAM lParam,
             HeapFree( SystemHeap, 0, wp );
         }
         break;
+    case WM_GETDLGCODE:
+        {
+            LPMSG32 msg32 = (LPMSG32)lParam;
+
+            WINPROC_UnmapMsg16To32A( msg32->message, msg32->wParam, msg32->lParam,
+                                     result);
+            HeapFree( SystemHeap, 0, msg32 );
+        }
+        break;
     }
     return result;
 }
@@ -1064,6 +1091,26 @@ INT32 WINPROC_MapMsg16To32W( UINT16 msg16, WPARAM16 wParam16, UINT32 *pmsg32,
             *plparam = (LPARAM)cs;
         }
         return 1;
+    case WM_GETDLGCODE:
+        {
+            LPMSG16 msg16 = (LPMSG16)PTR_SEG_TO_LIN(*plparam);
+            LPMSG32 msg32 = (LPMSG32)HeapAlloc( SystemHeap, 0, sizeof(MSG32) );
+
+            if (!msg32) return -1;
+            msg32->hwnd = msg16->hwnd;
+            msg32->lParam = msg16->lParam;
+            msg32->time = msg16->time;
+            CONV_POINT16TO32(&msg16->pt,&msg32->pt);
+            /* this is right, right? */
+            if (WINPROC_MapMsg16To32W(msg16->message,msg16->wParam,
+                                     &msg32->message,&msg32->wParam,
+                                     &msg32->lParam)<0) {
+                HeapFree( SystemHeap, 0, msg32 );
+                return -1;
+            }
+            *plparam = (LPARAM)msg32;
+        }
+        return 1;
     default:  /* No Unicode translation needed */
         return WINPROC_MapMsg16To32A( msg16, wParam16, pmsg32,
                                       pwparam32, plparam );
@@ -1112,6 +1159,15 @@ LRESULT WINPROC_UnmapMsg16To32W( UINT32 msg, WPARAM32 wParam, LPARAM lParam,
             HeapFree( SystemHeap, 0, cs );
         }
         break;
+    case WM_GETDLGCODE:
+        {
+            LPMSG32 msg32 = (LPMSG32)lParam;
+
+            WINPROC_UnmapMsg16To32W( msg32->message, msg32->wParam, msg32->lParam,
+                                     result);
+            HeapFree( SystemHeap, 0, msg32 );
+        }
+        break;
     default:
         return WINPROC_UnmapMsg16To32A( msg, wParam, lParam, result );
     }
@@ -1526,7 +1582,8 @@ INT32 WINPROC_MapMsg32ATo16( HWND32 hwnd, UINT32 msg32, WPARAM32 wParam32,
     case WM_PAINTCLIPBOARD:
     case WM_SIZECLIPBOARD:
     case WM_WININICHANGE:
-        WARN( msg, "message %04x needs translation\n", msg32 );
+    case WM_GETDLGCODE:
+        FIXME( msg, "message %04x needs translation\n", msg32 );
         return -1;
 
     default:  /* No translation needed */