diff --git a/windows/message.c b/windows/message.c
index 7976502..db9ea24 100644
--- a/windows/message.c
+++ b/windows/message.c
@@ -441,9 +441,12 @@
 static BOOL32 MSG_PeekHardwareMsg( MSG16 *msg, HWND16 hwnd, DWORD filter,
                                    BOOL32 remove )
 {
+    /* FIXME: should deal with MSG32 instead of MSG16 */
+    
     DWORD status = SYSQ_MSG_ACCEPT;
     MESSAGEQUEUE *sysMsgQueue = QUEUE_GetSysQueue();
-    int i, kbd_msg, pos = sysMsgQueue->nextMessage;
+    int kbd_msg;
+    QMSG *nextqmsg, *qmsg = sysMsgQueue->firstMsg;
 
     /* FIXME: there has to be a better way to do this */
     joySendMessages();
@@ -453,16 +456,20 @@
                                && EVENT_Pending())
         EVENT_WaitNetEvent( FALSE, FALSE );
 
-    for (i = kbd_msg = 0; i < sysMsgQueue->msgCount; i++, pos++)
+    for ( kbd_msg = 0; qmsg; qmsg = nextqmsg)
     {
-        if (pos >= sysMsgQueue->queueSize) pos = 0;
-	*msg = sysMsgQueue->messages[pos].msg;
+
+        /* FIXME: this line will be reenabled when msg will be a MSG32 */
+        /* *msg = qmsg->msg; */
+        STRUCT32_MSG32to16(&qmsg->msg, msg);
+
+        nextqmsg = qmsg->nextMsg;
 
           /* Translate message */
 
         if ((msg->message >= WM_MOUSEFIRST) && (msg->message <= WM_MOUSELAST))
         {
-	    HWND32 hWndScope = (HWND32)sysMsgQueue->messages[pos].extraInfo;
+            HWND32 hWndScope = (HWND32)qmsg->extraInfo;
 
 	    status = MSG_TranslateMouseMsg(hwnd, filter, msg, remove, 
 					  (Options.managed && IsWindow32(hWndScope) ) 
@@ -490,7 +497,7 @@
                 SEGPTR_FREE(hook);
                 if (ret) 
 		{
-		    QUEUE_RemoveMsg( sysMsgQueue, pos );
+                    QUEUE_RemoveMsg( sysMsgQueue, qmsg );
 		    continue;
 		}
 		status = SYSQ_MSG_ACCEPT; 
@@ -525,7 +532,7 @@
                 }
 
 		if (remove)
-		    QUEUE_RemoveMsg( sysMsgQueue, pos );
+		    QUEUE_RemoveMsg( sysMsgQueue, qmsg );
 		/* continue */
 
 	   case SYSQ_MSG_CONTINUE:
@@ -538,7 +545,7 @@
         if (remove)
         {
             if (HOOK_IsHooked( WH_JOURNALRECORD )) MSG_JournalRecordMsg( msg );
-            QUEUE_RemoveMsg( sysMsgQueue, pos );
+            QUEUE_RemoveMsg( sysMsgQueue, qmsg );
         }
         return TRUE;
     }
@@ -546,6 +553,7 @@
 }
 
 
+
 /**********************************************************************
  *           SetDoubleClickTime16   (USER.20)
  */
@@ -611,11 +619,9 @@
     }
 
     /* resume sending */ 
-
-    queue->hWnd       = hwnd;
-    queue->msg        = msg;
-    queue->wParam     = LOWORD(wParam);
-    queue->wParamHigh = HIWORD(wParam);
+    queue->hWnd32     = hwnd;
+    queue->msg32      = msg;
+    queue->wParam32   = wParam;
     queue->lParam     = lParam;
     queue->hPrevSendingTask = destQ->hSendingTask;
     destQ->hSendingTask = GetFastQueue();
@@ -635,7 +641,8 @@
     {
       if (!(queue->wakeBits & QS_SMRESULT))
       {
-        if (THREAD_IsWin16( THREAD_Current() )) DirectedYield( destQ->hTask );
+        if (THREAD_IsWin16( THREAD_Current() ))
+            DirectedYield( destQ->thdb->teb.htask16 );
         QUEUE_WaitBits( QS_SMRESULT );
 	TRACE(sendmsg,"\tsm: have result!\n");
       }
@@ -675,8 +682,8 @@
 
     while( (senderQ = (MESSAGEQUEUE*)GlobalLock16( queue->InSendMessageHandle)))
     {
-      TRACE(msg,"\trpm: replying to %04x (%04x -> %04x)\n",
-                          queue->msg, queue->self, senderQ->self);
+      TRACE(msg,"\trpm: replying to %08x (%04x -> %04x)\n",
+            queue->msg32, queue->self, senderQ->self);
 
       if( queue->wakeBits & QS_SENDMESSAGE )
       {
@@ -697,7 +704,8 @@
     queue->InSendMessageHandle = 0;
 
     QUEUE_SetWakeBit( senderQ, QS_SMRESULT );
-    if (THREAD_IsWin16(THREAD_Current())) DirectedYield( senderQ->hTask );
+    if (THREAD_IsWin16( THREAD_Current() ))
+        DirectedYield( senderQ->thdb->teb.htask16 );
 }
 
 
@@ -707,7 +715,7 @@
 static BOOL32 MSG_PeekMessage( LPMSG16 msg, HWND16 hwnd, WORD first, WORD last,
                                WORD flags, BOOL32 peek )
 {
-    int pos, mask;
+    int mask;
     MESSAGEQUEUE *msgQueue;
     HQUEUE16 hQueue;
 
@@ -735,6 +743,8 @@
 
     while(1)
     {    
+        QMSG *qmsg;
+        
 	hQueue   = GetFastQueue();
         msgQueue = (MESSAGEQUEUE *)GlobalLock16( hQueue );
         if (!msgQueue) return FALSE;
@@ -762,15 +772,17 @@
         /* Now find a normal message */
 
         if (((msgQueue->wakeBits & mask) & QS_POSTMESSAGE) &&
-            ((pos = QUEUE_FindMsg( msgQueue, hwnd, first, last )) != -1))
+            ((qmsg = QUEUE_FindMsg( msgQueue, hwnd, first, last )) != 0))
         {
-            QMSG *qmsg = &msgQueue->messages[pos];
-            *msg = qmsg->msg;
+            /* FIXME: this line will be reenabled when msg will be a MSG32 */
+            /* *msg = qmsg->msg; */
+            STRUCT32_MSG32to16(&qmsg->msg, msg);
+            
             msgQueue->GetMessageTimeVal      = msg->time;
             msgQueue->GetMessagePosVal       = *(DWORD *)&msg->pt;
             msgQueue->GetMessageExtraInfoVal = qmsg->extraInfo;
 
-            if (flags & PM_REMOVE) QUEUE_RemoveMsg( msgQueue, pos );
+            if (flags & PM_REMOVE) QUEUE_RemoveMsg( msgQueue, qmsg );
             break;
         }
 
@@ -1129,7 +1141,7 @@
 BOOL16 WINAPI PostMessage16( HWND16 hwnd, UINT16 message, WPARAM16 wParam,
                              LPARAM lParam )
 {
-    MSG16 	msg;
+    MSG32       msg;
     WND 	*wndPtr;
 
     msg.hwnd    = hwnd;
@@ -1204,7 +1216,7 @@
 BOOL16 WINAPI PostAppMessage16( HTASK16 hTask, UINT16 message, WPARAM16 wParam,
                                 LPARAM lParam )
 {
-    MSG16 msg;
+    MSG32 msg;
 
     if (GetTaskQueue(hTask) == 0) return FALSE;
     msg.hwnd    = 0;
