Index: /trunk/src/VBox/Frontends/VirtualBox/include/VBoxConsoleView.h
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/include/VBoxConsoleView.h	(revision 244)
+++ /trunk/src/VBox/Frontends/VirtualBox/include/VBoxConsoleView.h	(revision 245)
@@ -84,4 +84,6 @@
     void onFullscreenChange (bool on);
     
+    void FixModifierState (LONG *codes, uint *count);
+
 signals:
 
@@ -100,5 +102,5 @@
     bool winEvent (MSG *msg);
 #elif defined(Q_WS_X11)
-    bool x11Event( XEvent *event );
+    bool x11Event (XEvent *event );
 #endif
 
@@ -145,4 +147,5 @@
 
     bool processHotKey (const QKeySequence &key, QMenuData *data);
+    void updateModifiers (bool fNumLock, bool fCapsLock, bool fScrollLock);
 
     void releaseAllKeysPressed (bool release_hostkey = true);
@@ -193,4 +196,9 @@
     bool autoresize_guest : 1;
 
+    bool mfNumLock;
+    bool mfScrollLock;
+    bool mfCapsLock;
+    long muNumLockAdaptionCnt;
+
     QTimer *resize_hint_timer;
 
Index: /trunk/src/VBox/Frontends/VirtualBox/include/VBoxDefs.h
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/include/VBoxDefs.h	(revision 244)
+++ /trunk/src/VBox/Frontends/VirtualBox/include/VBoxDefs.h	(revision 245)
@@ -148,4 +148,5 @@
         SessionStateChangeEventType = QEvent::User + 7,
         SnapshotEventType = QEvent::User + 8,
+        ModifierKeyChangeEventType = QEvent::User + 9,
         EnumerateMediaEventType = QEvent::User + 100,
         ActivateMenuEventType = QEvent::User + 101,
Index: /trunk/src/VBox/Frontends/VirtualBox/src/VBoxConsoleView.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/VBoxConsoleView.cpp	(revision 244)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/VBoxConsoleView.cpp	(revision 245)
@@ -194,4 +194,18 @@
 };
 
+/** Modifier key change event */
+class ModifierKeyChangeEvent : public QEvent
+{
+public:
+    ModifierKeyChangeEvent(bool fNumLock, bool fScrollLock, bool fCapsLock) :
+        QEvent ((QEvent::Type) VBoxDefs::ModifierKeyChangeEventType),
+        mfNumLock(fNumLock), mfScrollLock(fScrollLock), mfCapsLock(fCapsLock) {}
+    bool NumLock()    const { return mfNumLock; }
+    bool ScrollLock() const { return mfScrollLock; }
+    bool CapsLock()   const { return mfCapsLock; }
+private:
+    bool mfNumLock, mfScrollLock, mfCapsLock;
+};
+
 //
 // VBoxConsoleCallback class
@@ -280,8 +294,6 @@
     STDMETHOD(OnKeyboardLedsChange)(BOOL fNumLock, BOOL fScrollLock, BOOL fCapsLock)
     {
-        /** @todo */
-        Q_UNUSED (fNumLock);
-        Q_UNUSED (fScrollLock);
-        Q_UNUSED (fCapsLock);
+        QApplication::postEvent (
+            view, new ModifierKeyChangeEvent (fNumLock, fScrollLock, fCapsLock));
         return S_OK;
     }
@@ -337,4 +349,5 @@
     , ignore_mainwnd_resize (false)
     , autoresize_guest (false)
+    , muNumLockAdaptionCnt (2)
     , mode (rm)
 {
@@ -763,4 +776,15 @@
                     vboxProblem().remindAboutMouseIntegration (mouse_absolute);
                 }
+                return true;
+            }
+
+            case VBoxDefs::ModifierKeyChangeEventType:
+            {
+                ModifierKeyChangeEvent *me = (ModifierKeyChangeEvent* )e;
+                if (me->NumLock() != mfNumLock)
+                    muNumLockAdaptionCnt = 2;
+                mfNumLock    = me->NumLock();
+                mfScrollLock = me->ScrollLock();
+                mfCapsLock   = me->CapsLock();
                 return true;
             }
@@ -1257,4 +1281,64 @@
 
 /**
+ *  Synchronize the views of the host and the guest to the modifier keys.
+ *  This function will add up to 6 additional keycodes to codes.
+ *
+ *  @param  codes  pointer to keycodes which are sent to the keyboard
+ *  @param  count  pointer to the keycodes counter
+ */
+void VBoxConsoleView::FixModifierState(LONG *codes, uint *count)
+{
+    unsigned uKeyMaskNum = 0, uKeyMaskCaps = 0, uKeyMaskScroll = 0;
+
+#if defined(Q_WS_X11)
+
+    Window   wDummy1, wDummy2;
+    int      iDummy3, iDummy4, iDummy5, iDummy6;
+    unsigned uMask;
+
+    uKeyMaskCaps          = LockMask;
+    XModifierKeymap* map  = XGetModifierMapping(qt_xdisplay());
+    KeyCode keyCodeNum    = XKeysymToKeycode(qt_xdisplay(), XK_Num_Lock);
+    KeyCode keyCodeScroll = XKeysymToKeycode(qt_xdisplay(), XK_Scroll_Lock);
+
+    for (int i = 0; i < 8; i++)
+    {
+        if (   keyCodeNum != NoSymbol
+            && map->modifiermap[map->max_keypermod * i] == keyCodeNum)
+            uKeyMaskNum    = 1 << i;
+        else if (   keyCodeScroll != NoSymbol
+                 && map->modifiermap[map->max_keypermod * i] == keyCodeScroll)
+            uKeyMaskScroll = 1 << i;
+    }
+    XQueryPointer(qt_xdisplay(), DefaultRootWindow(qt_xdisplay()), &wDummy1, &wDummy2,
+                  &iDummy3, &iDummy4, &iDummy5, &iDummy6, &uMask);
+    XFreeModifiermap(map);
+
+    if (muNumLockAdaptionCnt && (mfNumLock ^ !!(uMask & uKeyMaskNum)))
+    {
+        muNumLockAdaptionCnt--;
+        codes[(*count)++] = 0x45;
+        codes[(*count)++] = 0x45 | 0x80;
+    }
+
+#elif defined(Q_WS_WIN32)
+
+    if (muNumLockAdaptionCnt && (mfNumLock ^ !!(GetKeyState(VK_NUMLOCK))))
+    {
+        muNumLockAdaptionCnt--;
+        codes[(*count)++] = 0x45;
+        codes[(*count)++] = 0x45 | 0x80;
+    }
+
+#else
+
+#warning Adapt VBoxConsoleView::FixModifierState
+
+#endif
+
+
+}
+
+/**
  *  Called on every key press and release (while in focus).
  *
@@ -1275,5 +1359,5 @@
     const bool is_hostkey = key == gs.hostKey();
 
-    LONG buf [2];
+    LONG buf [16];
     LONG *codes = buf;
     uint count = 0;
@@ -1331,4 +1415,10 @@
             else
                 keys_pressed [scan] &= ~IsKbdCaptured;
+
+            // Check if the guest has the same view on the modifier keys (NumLock,
+            // CapsLock, ScrollLock) as the X server. If not, send KeyPress events
+            // to synchronize the state.
+            FixModifierState (codes, &count);
+            
         }
     }
