diff --git a/hw/xwin/InitInput.c b/hw/xwin/InitInput.c
index 52f837e..af6225d 100644
--- a/hw/xwin/InitInput.c
+++ b/hw/xwin/InitInput.c
@@ -96,7 +94,7 @@ ProcessInputEvents (void)
 #endif
 
   mieqProcessInputEvents ();
-  miPointerUpdate ();
+  miPointerUpdateSprite (winMouse);
 
 #if 0
   ErrorF ("ProcessInputEvents - returning\n");
@@ -123,8 +127,6 @@ TimeSinceLastInputEvent ()
 void
 InitInput (int argc, char *argv[])
 {
-  DeviceIntPtr		pMouse, pKeyboard;
-
 #if CYGDEBUG
   winDebug ("InitInput\n");
 #endif
@@ -146,14 +148,13 @@ InitInput (int argc, char *argv[])
     }
 #endif
 
-  pMouse = AddInputDevice (winMouseProc, TRUE);
-  pKeyboard = AddInputDevice (winKeybdProc, TRUE);
+  winMouse = AddInputDevice (winMouseProc, TRUE);
+  winKeybd = AddInputDevice (winKeybdProc, TRUE);
   
-  RegisterPointerDevice (pMouse);
-  RegisterKeyboardDevice (pKeyboard);
+  RegisterPointerDevice (winMouse);
+  RegisterKeyboardDevice (winKeybd);
 
-  miRegisterPointerDevice (screenInfo.screens[0], pMouse);
-  mieqInit ((DevicePtr)pKeyboard, (DevicePtr)pMouse);
+  mieqInit ();
 
   /* Initialize the mode key states */
   winInitializeModeKeyStates ();
diff --git a/hw/xwin/win.h b/hw/xwin/win.h
index 09a9fb2..163d1dc 100644
--- a/hw/xwin/win.h
+++ b/hw/xwin/win.h
@@ -627,6 +629,8 @@ typedef struct {
  * Extern declares for general global variables
  */
 
+extern DeviceIntPtr		winMouse;
+extern DeviceIntPtr		winKeybd;
 extern winScreenInfo		g_ScreenInfo[];
 extern miPointerScreenFuncRec	g_winPointerCursorFuncs;
 extern DWORD			g_dwEvents;
diff --git a/hw/xwin/winglobals.c b/hw/xwin/winglobals.c
index af8190d..f1de874 100644
--- a/hw/xwin/winglobals.c
+++ b/hw/xwin/winglobals.c
@@ -38,6 +38,8 @@
  * General global variables
  */
 
+DeviceIntPtr	winMouse = NULL;
+DeviceIntPtr	winKeybd = NULL;
 int		g_iNumScreens = 0;
 winScreenInfo	g_ScreenInfo[MAXSCREENS];
 int		g_iLastScreen = -1;
diff --git a/hw/xwin/winkeybd.c b/hw/xwin/winkeybd.c
index d574f20..936b8dd 100644
--- a/hw/xwin/winkeybd.c
+++ b/hw/xwin/winkeybd.c
@@ -548,7 +548,7 @@ winIsFakeCtrl_L (UINT message, WPARAM wParam, LPARAM lParam)
  */
 
 void
-winKeybdReleaseKeys ()
+winKeybdReleaseKeys (void)
 {
   int				i;
 
@@ -597,7 +597,7 @@ winSendKeyEvent (DWORD dwKey, Bool fDown)
   xCurrentEvent.u.keyButtonPointer.time =
     g_c32LastInputEventTime = GetTickCount ();
   xCurrentEvent.u.u.detail = dwKey + MIN_KEYCODE;
-  mieqEnqueue (&xCurrentEvent);
+  mieqEnqueue (winKeybd, &xCurrentEvent);
 }
 
 BOOL winCheckKeyPressed(WPARAM wParam, LPARAM lParam)
diff --git a/hw/xwin/winlayouts.h b/hw/xwin/winlayouts.h
index cc07524..065e35b 100644
--- a/hw/xwin/winlayouts.h
+++ b/hw/xwin/winlayouts.h
@@ -49,6 +49,7 @@ WinKBLayoutRec winKBLayouts[] =
     {  0x409, -1, "pc105", "us",      NULL, NULL, "English (USA)"},
     {0x10409, -1, "pc105", "dvorak",  NULL, NULL, "English (USA, Dvorak)"}, 
     {0x20409, -1, "pc105", "us_intl", NULL, NULL, "English (USA, International)"}, 
+    {  0x804, -1, "pc105", "us",      NULL, NULL, "Chinese (Simplified)"},
     {  0x809, -1, "pc105", "gb",      NULL, NULL, "English (United Kingdom)"},
     { 0x1809, -1, "pc105", "ie",      NULL, NULL, "Irish"},
     {  0x40a, -1, "pc105", "es",      NULL, NULL, "Spanish (Spain, Traditional Sort)"},
diff --git a/hw/xwin/winmouse.c b/hw/xwin/winmouse.c
index 1507dd3..e5ad5ce 100644
--- a/hw/xwin/winmouse.c
+++ b/hw/xwin/winmouse.c
@@ -233,7 +233,7 @@ winMouseButtonsSendEvent (int iEventType, int iButton)
   xCurrentEvent.u.u.detail = iButton;
   xCurrentEvent.u.keyButtonPointer.time
     = g_c32LastInputEventTime = GetTickCount ();
-  mieqEnqueue (&xCurrentEvent);
+  mieqEnqueue (winMouse, &xCurrentEvent);
 }
 
 
diff --git a/hw/xwin/winmultiwindowwndproc.c b/hw/xwin/winmultiwindowwndproc.c
index 0a7579b..4ee98dc 100644
--- a/hw/xwin/winmultiwindowwndproc.c
+++ b/hw/xwin/winmultiwindowwndproc.c
@@ -479,6 +479,17 @@ winTopLevelWindowProc (HWND hwnd, UINT message,
       return 0;
 
     case WM_MOUSEMOVE:
+      {
+      int x, y, i, nevents;
+      int valuators[2];
+      xEvent* events = (xEvent*)xcalloc(sizeof(xEvent), GetMaximumEventsNum());
+
+      if (!events)
+      {
+          FatalError("Could not allocate event store.\n");
+          return 0;
+      }
+
       /* Unpack the client area mouse coordinates */
       ptMouse.x = GET_X_LPARAM(lParam);
       ptMouse.y = GET_Y_LPARAM(lParam);
@@ -494,11 +505,12 @@ winTopLevelWindowProc (HWND hwnd, UINT message,
       if (s_pScreenPriv == NULL || s_pScreenInfo->fIgnoreInput)
 	break;
 
+      x = ptMouse.x - s_pScreenInfo->dwXOffset;
+      y = ptMouse.y - s_pScreenInfo->dwYOffset;
+
       /* Has the mouse pointer crossed screens? */
-      if (s_pScreen != miPointerGetScreen(inputInfo.pointer))
-	miPointerSetScreen (inputInfo.pointer, s_pScreenInfo->dwScreen,
-			       ptMouse.x - s_pScreenInfo->dwXOffset,
-			       ptMouse.y - s_pScreenInfo->dwYOffset);
+      if (s_pScreen != miPointerGetScreen(winMouse))
+	miPointerSetScreen (winMouse, s_pScreenInfo->dwScreen, x, y);
 
       /* Are we tracking yet? */
       if (!s_fTracking)
@@ -535,11 +547,21 @@ winTopLevelWindowProc (HWND hwnd, UINT message,
 	}
 
       /* Deliver absolute cursor position to X Server */
-      miPointerAbsoluteCursor (ptMouse.x - s_pScreenInfo->dwXOffset,
-			       ptMouse.y - s_pScreenInfo->dwYOffset,
-			       g_c32LastInputEventTime = GetTickCount ());
+      miPointerSetPosition (winMouse, &x, &y, 
+			    g_c32LastInputEventTime = GetTickCount ());
+
+      /* generate motion notify */
+      valuators[0] = x;
+      valuators[1] = y;
+
+      nevents = GetPointerEvents(events, winMouse, MotionNotify, 0,
+                               POINTER_ABSOLUTE, 0, 2, valuators);
+
+      for (i = 0; i < nevents; i++)
+          mieqEnqueue(winMouse, &events[i]);
+
       return 0;
-      
+      }      
     case WM_NCMOUSEMOVE:
       /*
        * We break instead of returning 0 since we need to call
diff --git a/hw/xwin/winwin32rootlesswndproc.c b/hw/xwin/winwin32rootlesswndproc.c
index 859aafd..7305539 100755
--- a/hw/xwin/winwin32rootlesswndproc.c
+++ b/hw/xwin/winwin32rootlesswndproc.c
@@ -516,6 +516,16 @@ winMWExtWMWindowProc (HWND hwnd, UINT message,
       break;
 
     case WM_MOUSEMOVE:
+      {
+      int x, y, i, nevents;
+      int valuators[2];      
+      xEvent* events = (xEvent*)xcalloc(sizeof(xEvent), GetMaximumEventsNum());
+
+      if (!events)
+      {
+          FatalError("Could not allocate event store.\n");
+          return 0;
+      }
 #if CYGMULTIWINDOW_DEBUG && 0
       winDebug ("winMWExtWMWindowProc - WM_MOUSEMOVE\n");
 #endif
@@ -534,11 +544,12 @@ winMWExtWMWindowProc (HWND hwnd, UINT message,
       if (pScreenPriv == NULL || pScreenInfo->fIgnoreInput)
 	break;
 
+      x = ptMouse.x - pScreenInfo->dwXOffset;
+      y = ptMouse.y - pScreenInfo->dwYOffset;
+
       /* Has the mouse pointer crossed screens? */
-      if (pScreen != miPointerGetScreen(inputInfo.pointer))
-	miPointerSetScreen (inputInfo.pointer, pScreenInfo->dwScreen,
-			       ptMouse.x - pScreenInfo->dwXOffset,
-			       ptMouse.y - pScreenInfo->dwYOffset);
+      if (pScreen != miPointerGetScreen(winMouse))
+	miPointerSetScreen (winMouse, pScreenInfo->dwScreen, x, y);
 
       /* Are we tracking yet? */
       if (!s_fTracking)
@@ -567,11 +578,21 @@ winMWExtWMWindowProc (HWND hwnd, UINT message,
 	}
 
       /* Deliver absolute cursor position to X Server */
-      miPointerAbsoluteCursor (ptMouse.x - pScreenInfo->dwXOffset,
-			       ptMouse.y - pScreenInfo->dwYOffset,
-			       g_c32LastInputEventTime = GetTickCount ());
+      miPointerSetPosition (winMouse, &x, &y, 
+			    g_c32LastInputEventTime = GetTickCount ());
+
+      /* generate motion notify */
+      valuators[0] = x;
+      valuators[1] = y;
+
+      nevents = GetPointerEvents(events, winMouse, MotionNotify, 0,
+                               POINTER_ABSOLUTE, 0, 2, valuators);
+
+      for (i = 0; i < nevents; i++)
+          mieqEnqueue(winMouse, &events[i]);
+
       return 0;
-      
+      }
     case WM_NCMOUSEMOVE:
 #if CYGMULTIWINDOW_DEBUG && 0
       winDebug ("winMWExtWMWindowProc - WM_NCMOUSEMOVE\n");
diff --git a/hw/xwin/winwndproc.c b/hw/xwin/winwndproc.c
index 29ea81f..f0ccc9a 100644
--- a/hw/xwin/winwndproc.c
+++ b/hw/xwin/winwndproc.c
@@ -719,15 +719,27 @@ winWindowProc (HWND hwnd, UINT message,
       }
 
     case WM_MOUSEMOVE:
+      {
+      int x, y, nevents;
+      int valuators[2];
+      xEvent* events = (xEvent*)xcalloc(sizeof(xEvent), GetMaximumEventsNum());
+
+      if (!events)
+      {
+          FatalError("Could not allocate event store.\n");
+          return 0;
+      }
+
       /* We can't do anything without privates */
       if (s_pScreenPriv == NULL || s_pScreenInfo->fIgnoreInput)
 	break;
 
+      x = GET_X_LPARAM(lParam) - s_pScreenInfo->dwXOffset;
+      y = GET_Y_LPARAM(lParam) - s_pScreenInfo->dwYOffset;
+
       /* Has the mouse pointer crossed screens? */
-      if (s_pScreen != miPointerGetScreen(inputInfo.pointer))
-	miPointerSetScreen (inputInfo.pointer, s_pScreenInfo->dwScreen,
-			       GET_X_LPARAM(lParam)-s_pScreenInfo->dwXOffset,
-			       GET_Y_LPARAM(lParam)-s_pScreenInfo->dwYOffset);
+      if (s_pScreen != miPointerGetScreen(winMouse))
+	miPointerSetScreen (winMouse, s_pScreenInfo->dwScreen, x, y);
 
       /* Are we tracking yet? */
       if (!s_fTracking)
@@ -764,11 +776,21 @@ winWindowProc (HWND hwnd, UINT message,
 	}
       
       /* Deliver absolute cursor position to X Server */
-      miPointerAbsoluteCursor (GET_X_LPARAM(lParam)-s_pScreenInfo->dwXOffset,
-			       GET_Y_LPARAM(lParam)-s_pScreenInfo->dwYOffset,
-			       g_c32LastInputEventTime = GetTickCount ());
-      return 0;
+      miPointerSetPosition (winMouse, &x, &y, 
+			    g_c32LastInputEventTime = GetTickCount ());
+ 
+      /* generate motion notify */
+      valuators[0] = x;
+      valuators[1] = y;
+
+      nevents = GetPointerEvents(events, winMouse, MotionNotify, 0,
+                               POINTER_ABSOLUTE, 0, 2, valuators);
+
+      for (i = 0; i < nevents; i++)
+          mieqEnqueue(winMouse, &events[i]);
 
+      return 0;
+      }
     case WM_NCMOUSEMOVE:
       /*
        * We break instead of returning 0 since we need to call
@@ -920,6 +942,7 @@ winWindowProc (HWND hwnd, UINT message,
 	    POINT		point;
 	    WPARAM		wL, wM, wR, wShift, wCtrl;
 	    LPARAM		lPos;
+	    int			x, y;
 	    
 	    /* Get the current position of the mouse cursor */
 	    GetCursorPos (&point);
@@ -928,8 +951,11 @@ winWindowProc (HWND hwnd, UINT message,
 	    point.x -= GetSystemMetrics (SM_XVIRTUALSCREEN);
 	    point.y -= GetSystemMetrics (SM_YVIRTUALSCREEN);
 	    
+	    x = point.x;
+	    y = point.y;
+
 	    /* Deliver absolute cursor position to X Server */
-	    miPointerAbsoluteCursor (point.x, point.y,
+	    miPointerSetPosition (winMouse, &x, &y,
 				     g_c32LastInputEventTime = GetTickCount());
 
 	    /* Check if a button was released but we didn't see it */
