Index: win32ss/user/ntuser/keyboard.c
===================================================================
--- win32ss/user/ntuser/keyboard.c	(revision 72194)
+++ win32ss/user/ntuser/keyboard.c	(working copy)
@@ -15,6 +15,7 @@
 static PKEYBOARD_INDICATOR_TRANSLATION gpKeyboardIndicatorTrans = NULL;
 static KEYBOARD_INDICATOR_PARAMETERS gIndicators = {0, 0};
 KEYBOARD_ATTRIBUTES gKeyboardInfo;
+int gLanguageToggleKeyState = 0;
 
 /* FUNCTIONS *****************************************************************/
 
@@ -819,7 +820,7 @@
     }
 
     /* Check if this is a hotkey */
-    if (co_UserProcessHotKeys(wSimpleVk, bIsDown))
+    if (co_UserProcessHotKeys(wSimpleVk, bIsDown)) //// Check if this is correct, refer to hotkey sequence message tests.
     {
         TRACE("HotKey Processed\n");
         bPostMsg = FALSE;
@@ -922,22 +923,6 @@
            }
         }
 
-        // TODO: When initializing win32k: Reading from the registry hotkey combination
-        // to switch the keyboard layout and store it to global variable.
-        // Using this combination of hotkeys in this function
-        if (wVk == VK_LSHIFT && IS_KEY_DOWN(gafAsyncKeyState, VK_LMENU))
-        {
-            PKL pkl = pti->KeyboardLayout;
-
-            if (pkl != NULL)
-            {
-                UserPostMessage(UserHMGetHandle(Wnd),
-                                WM_INPUTLANGCHANGEREQUEST,
-                                INPUTLANGCHANGE_FORWARD,
-                                (LPARAM)pkl->hkl);
-            }
-        }
-
         /* If it is VK_PACKET, high word of wParam is used for wchar */
         if (!bPacket)
         {
Index: win32ss/user/ntuser/input.h
===================================================================
--- win32ss/user/ntuser/input.h	(revision 72194)
+++ win32ss/user/ntuser/input.h	(working copy)
@@ -75,6 +75,7 @@
 BOOL NTAPI UserSendKeyboardInput(KEYBDINPUT *pKbdInput, BOOL bInjected);
 PKL NTAPI UserHklToKbl(HKL hKl);
 BOOL NTAPI UserSetDefaultInputLang(HKL hKl);
+extern int gLanguageToggleKeyState;
 
 /* Mouse */
 WORD FASTCALL UserGetMouseButtonsState(VOID);
Index: win32ss/user/ntuser/msgqueue.c
===================================================================
--- win32ss/user/ntuser/msgqueue.c	(revision 72194)
+++ win32ss/user/ntuser/msgqueue.c	(working copy)
@@ -1773,6 +1773,7 @@
     PWND pWnd;
     UINT ImmRet;
     BOOL Ret = TRUE;
+    WPARAM wParam = Msg->wParam;
     PTHREADINFO pti = PsGetCurrentThreadWin32Thread();
 
     if (Msg->message == VK_PACKET)
@@ -1833,6 +1834,74 @@
         }
     }
 
+    //// Key Down!
+    if ( *RemoveMessages && Msg->message == WM_SYSKEYDOWN )
+    {
+        if ( HIWORD(Msg->lParam) & KF_ALTDOWN )
+        {
+            if ( Msg->wParam == VK_ESCAPE || Msg->wParam == VK_TAB ) // Alt-Tab/ESC Alt-Shift-Tab/ESC
+            {
+                WPARAM wParamTmp;
+
+                wParamTmp = UserGetKeyState(VK_SHIFT) & 0x8000 ? SC_PREVWINDOW : SC_NEXTWINDOW;
+                ERR("Send WM_SYSCOMMAND\n");
+                co_IntSendMessage( Msg->hwnd, WM_SYSCOMMAND, wParamTmp, Msg->wParam );
+
+                //// Keep looping.
+                Ret = FALSE;
+                //// Skip the rest.
+                goto Exit;
+            }
+        }
+        //if (globallanguageKSstrunct is active????) Read TODO note.
+        {
+            if (IS_KEY_DOWN(gafAsyncKeyState, VK_LMENU)) // Patch point Virtual-Key L Alt or L Ctrl.
+            {
+                if ( wParam == VK_LSHIFT ) gLanguageToggleKeyState = 1; // Left Alt - Left Shift, Next
+                if ( wParam == VK_RSHIFT ) gLanguageToggleKeyState = 2; // Left Alt - Right Shift, Previous
+            }
+         }
+    }
+
+    //// Key Up!
+    if ( *RemoveMessages && Msg->message == WM_SYSKEYUP )
+    {
+        // TODO: When initializing win32k: Reading from the registry hotkey combination
+        // to switch the keyboard layout and store it to global variable.
+        // Using this combination of hotkeys in this function
+        if ( IS_KEY_DOWN(gafAsyncKeyState, VK_LMENU) ) // Patch point Virtual-Key L Alt or L Ctrl.
+        {
+            if ( wParam == VK_LSHIFT && !(IS_KEY_DOWN(gafAsyncKeyState, VK_LSHIFT))) // Patch point Scan Key.
+            {
+                PKL pkl = pti->KeyboardLayout;
+
+                if (pWnd) UserDerefObjectCo(pWnd);
+
+                //// Seems to override message window.
+                if (!(pWnd = pti->MessageQueue->spwndFocus))
+                {
+                     pWnd = pti->MessageQueue->spwndActive;
+                }
+                if (pWnd) UserRefObjectCo(pWnd, &Ref);
+
+                if (pkl != NULL)
+                {
+                    ERR("Posting WM_INPUTLANGCHANGEREQUEST KeyState %d\n", gLanguageToggleKeyState );
+                    UserPostMessage(UserHMGetHandle(pWnd),
+                                    WM_INPUTLANGCHANGEREQUEST,
+                                    INPUTLANGCHANGE_FORWARD, //// FIXME, support more, see gLanguageToggleKeyState.
+                                    (LPARAM)pkl->hkl);
+
+                    gLanguageToggleKeyState = 0;
+                    //// Keep looping.
+                    Ret = FALSE;
+                    //// Skip the rest.
+                    goto Exit;
+                }
+            }
+        }
+    }
+
     if (co_HOOK_CallHooks( WH_KEYBOARD,
                           *RemoveMessages ? HC_ACTION : HC_NOREMOVE,
                            LOWORD(Msg->wParam),
@@ -1865,7 +1934,7 @@
             }
         }
     }
-
+Exit:
     if (pWnd) UserDerefObjectCo(pWnd);
     return Ret;
 }
