Index: trunk/src/VBox/Frontends/VirtualBox/Makefile.kmk
===================================================================
--- trunk/src/VBox/Frontends/VirtualBox/Makefile.kmk	(revision 51989)
+++ trunk/src/VBox/Frontends/VirtualBox/Makefile.kmk	(revision 51992)
@@ -268,6 +268,6 @@
 	src/extensions/QIRichToolButton.h \
 	src/extensions/QISplitter.h \
-	src/extensions/QIStateIndicator.h \
 	src/extensions/QIStatusBar.h \
+	src/extensions/QIStatusBarIndicator.h \
 	src/extensions/QITabWidget.h \
 	src/extensions/QITableView.h \
@@ -538,6 +538,6 @@
 	src/extensions/QIRichToolButton.cpp \
 	src/extensions/QISplitter.cpp \
-	src/extensions/QIStateIndicator.cpp \
 	src/extensions/QIStatusBar.cpp \
+	src/extensions/QIStatusBarIndicator.cpp \
 	src/extensions/QITableView.cpp \
 	src/extensions/QITreeView.cpp \
Index: trunk/src/VBox/Frontends/VirtualBox/src/extensions/QIStateIndicator.cpp
===================================================================
--- trunk/src/VBox/Frontends/VirtualBox/src/extensions/QIStateIndicator.cpp	(revision 51989)
+++ 	(revision )
@@ -1,122 +1,0 @@
-/* $Id$ */
-/** @file
- *
- * VBox frontends: Qt GUI ("VirtualBox"):
- * VirtualBox Qt extensions: QIStateIndicator class implementation
- */
-
-/*
- * Copyright (C) 2006-2012 Oracle Corporation
- *
- * This file is part of VirtualBox Open Source Edition (OSE), as
- * available from http://www.virtualbox.org. This file is free software;
- * you can redistribute it and/or modify it under the terms of the GNU
- * General Public License (GPL) as published by the Free Software
- * Foundation, in version 2 as it comes in the "COPYING" file of the
- * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
- * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
- */
-
-#include "QIStateIndicator.h"
-
-/* Qt includes */
-#include <QIcon>
-#include <QPainter>
-#ifdef Q_WS_MAC
-# include <QContextMenuEvent>
-#endif
-
-QIStateIndicator::QIStateIndicator(QWidget *pParent /* = 0*/)
-  : QIWithRetranslateUI<QFrame>(pParent)
-  , mState(0)
-  , mSize(0, 0)
-{
-    setSizePolicy(QSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed));
-}
-
-QIStateIndicator::~QIStateIndicator()
-{
-    qDeleteAll (mStateIcons);
-}
-
-QSize QIStateIndicator::sizeHint() const
-{
-    return mSize;
-}
-
-QPixmap QIStateIndicator::stateIcon(int state) const
-{
-    /* Check if state-icon was set before: */
-    Icon *pIcon = mStateIcons[state];
-    return pIcon ? pIcon->pixmap : QPixmap();
-}
-
-void QIStateIndicator::setStateIcon(int state, const QIcon &icon)
-{
-    /* Get minimum size: */
-    QSize size = icon.availableSizes().first();
-
-    /* Get pixmap of size above: */
-    QPixmap pixmap = icon.pixmap(size);
-
-    /* Assign that pixmap to state-pixmap: */
-    mStateIcons.insert(state, new Icon(pixmap));
-
-    /* Adjust minimum size-hint: */
-    mSize = mSize.expandedTo(size);
-}
-
-void QIStateIndicator::setState (int aState)
-{
-    mState = aState;
-    repaint();
-}
-
-void QIStateIndicator::paintEvent (QPaintEvent * /* aEv */)
-{
-    QPainter painter (this);
-    drawContents (&painter);
-}
-
-void QIStateIndicator::drawContents (QPainter *aPainter)
-{
-    Icon *icon = mStateIcons [mState];
-    if (icon)
-        aPainter->drawPixmap(contentsRect().topLeft(), icon->pixmap);
-}
-
-#ifdef Q_WS_MAC
-/**
- * Make the left button also show the context menu to make things
- * simpler for users with single mouse button mice (laptops++).
- */
-void QIStateIndicator::mousePressEvent (QMouseEvent *aEv)
-{
-    /* Do this for the left mouse button event only, cause in the case of the
-     * right mouse button it could happen that the context menu event is
-     * triggered twice. Also this isn't necessary for the middle mouse button
-     * which would be some kind of overstated. */
-    if (aEv->button() == Qt::LeftButton)
-    {
-        QContextMenuEvent qme (QContextMenuEvent::Mouse, aEv->pos(), aEv->globalPos());
-        emit contextMenuRequested (this, &qme);
-        if (qme.isAccepted())
-            aEv->accept();
-        else
-            QFrame::mousePressEvent (aEv);
-    }
-    else
-        QFrame::mousePressEvent (aEv);
-}
-#endif /* Q_WS_MAC */
-
-void QIStateIndicator::mouseDoubleClickEvent (QMouseEvent * e)
-{
-    emit mouseDoubleClicked (this, e);
-}
-
-void QIStateIndicator::contextMenuEvent (QContextMenuEvent * e)
-{
-    emit contextMenuRequested (this, e);
-}
-
Index: trunk/src/VBox/Frontends/VirtualBox/src/extensions/QIStateIndicator.h
===================================================================
--- trunk/src/VBox/Frontends/VirtualBox/src/extensions/QIStateIndicator.h	(revision 51989)
+++ 	(revision )
@@ -1,94 +1,0 @@
-/** @file
- *
- * VBox frontends: Qt GUI ("VirtualBox"):
- * VirtualBox Qt extensions: QIStateIndicator class declaration
- */
-
-/*
- * Copyright (C) 2006-2010 Oracle Corporation
- *
- * This file is part of VirtualBox Open Source Edition (OSE), as
- * available from http://www.virtualbox.org. This file is free software;
- * you can redistribute it and/or modify it under the terms of the GNU
- * General Public License (GPL) as published by the Free Software
- * Foundation, in version 2 as it comes in the "COPYING" file of the
- * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
- * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
- */
-
-#ifndef __QIStateIndicator_h__
-#define __QIStateIndicator_h__
-
-/* Qt includes */
-#include <QFrame>
-#include <QHash>
-
-/* GUI includes: */
-#include "QIWithRetranslateUI.h"
-
-class QIStateIndicator : public QIWithRetranslateUI<QFrame>
-{
-    Q_OBJECT;
-
-public:
-
-    QIStateIndicator(QWidget *pParent = 0);
-    ~QIStateIndicator();
-
-    virtual QSize sizeHint() const;
-
-    int state () const { return mState; }
-
-    /** Returns state-icon for passed @a state. */
-    QPixmap stateIcon(int state) const;
-    /** Defines state-icon for passed @a state as @a icon. */
-    void setStateIcon(int state, const QIcon &icon);
-
-    virtual void updateAppearance() {}
-
-public slots:
-
-    virtual void setState (int aState);
-    virtual void setState (bool aState) { setState ((int) aState); }
-
-signals:
-
-    void mouseDoubleClicked (QIStateIndicator *aIndicator,
-                             QMouseEvent *aEv);
-    void contextMenuRequested (QIStateIndicator *aIndicator,
-                               QContextMenuEvent *aEv);
-
-protected:
-
-    virtual void paintEvent (QPaintEvent *aEv);
-    virtual void drawContents (QPainter *aPainter);
-
-#ifdef Q_WS_MAC
-    virtual void mousePressEvent (QMouseEvent *aEv);
-#endif
-    virtual void mouseDoubleClickEvent (QMouseEvent *aEv);
-    virtual void contextMenuEvent (QContextMenuEvent *aEv);
-
-private:
-
-    int mState;
-    QSize mSize;
-
-    struct Icon
-    {
-        Icon (const QPixmap &aPixmap)
-            : pixmap (aPixmap)
-            , bgPixmap (NULL) {}
-
-        QPixmap pixmap;
-        QPixmap cached;
-        QColor bgColor;
-        const QPixmap *bgPixmap;
-        QPoint bgOff;
-    };
-
-    QHash <int, Icon *> mStateIcons;
-};
-
-#endif // __QIStateIndicator_h__
-
Index: trunk/src/VBox/Frontends/VirtualBox/src/extensions/QIStatusBarIndicator.cpp
===================================================================
--- trunk/src/VBox/Frontends/VirtualBox/src/extensions/QIStatusBarIndicator.cpp	(revision 51992)
+++ trunk/src/VBox/Frontends/VirtualBox/src/extensions/QIStatusBarIndicator.cpp	(revision 51992)
@@ -0,0 +1,132 @@
+/* $Id$ */
+/** @file
+ * VBox Qt GUI - QIStatusBarIndicator interface implementation.
+ */
+
+/*
+ * Copyright (C) 2006-2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ */
+
+/* Qt includes: */
+#include <QIcon>
+#include <QPainter>
+#include <QHBoxLayout>
+#include <QLabel>
+#ifdef Q_WS_MAC
+# include <QContextMenuEvent>
+#endif /* Q_WS_MAC */
+
+/* GUI includes: */
+#include "QIStatusBarIndicator.h"
+
+
+QIStatusBarIndicator::QIStatusBarIndicator(QWidget *pParent /* = 0 */)
+    : QWidget(pParent)
+{
+    /* Configure size-policy: */
+    setSizePolicy(QSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed));
+}
+
+#ifdef Q_WS_MAC
+void QIStatusBarIndicator::mousePressEvent(QMouseEvent *pEvent)
+{
+    /* Do this for the left mouse button event only, cause in the case of the
+     * right mouse button it could happen that the context menu event is
+     * triggered twice. Also this isn't necessary for the middle mouse button
+     * which would be some kind of overstated. */
+    if (pEvent->button() == Qt::LeftButton)
+    {
+        QContextMenuEvent cme(QContextMenuEvent::Mouse, pEvent->pos(), pEvent->globalPos());
+        emit sigContextMenuRequest(this, &cme);
+        if (cme.isAccepted())
+            pEvent->accept();
+        else
+            QWidget::mousePressEvent(pEvent);
+    }
+    else
+        QWidget::mousePressEvent(pEvent);
+}
+#endif /* Q_WS_MAC */
+
+void QIStatusBarIndicator::mouseDoubleClickEvent(QMouseEvent *pEvent)
+{
+    emit sigMouseDoubleClick(this, pEvent);
+}
+
+void QIStatusBarIndicator::contextMenuEvent(QContextMenuEvent *pEvent)
+{
+    emit sigContextMenuRequest(this, pEvent);
+}
+
+
+QIStateStatusBarIndicator::QIStateStatusBarIndicator(QWidget *pParent /* = 0 */)
+  : QIStatusBarIndicator(pParent)
+  , m_iState(0)
+{
+}
+
+QIcon QIStateStatusBarIndicator::stateIcon(int iState) const
+{
+    /* Check if state-icon was set before: */
+    return m_icons.value(iState, QIcon());
+}
+
+void QIStateStatusBarIndicator::setStateIcon(int iState, const QIcon &icon)
+{
+    /* Adjust size-hint: */
+    m_size = m_size.expandedTo(icon.availableSizes().first());
+    /* Cache passed-icon: */
+    m_icons[iState] = icon;
+}
+
+void QIStateStatusBarIndicator::paintEvent(QPaintEvent*)
+{
+    QPainter painter(this);
+    drawContents(&painter);
+}
+
+void QIStateStatusBarIndicator::drawContents(QPainter *pPainter)
+{
+    if (m_icons.contains(m_iState))
+        pPainter->drawPixmap(contentsRect().topLeft(), m_icons.value(m_iState).pixmap(m_size));
+}
+
+
+QITextStatusBarIndicator::QITextStatusBarIndicator(QWidget *pParent /* = 0 */)
+    : QIStatusBarIndicator(pParent)
+{
+    /* Create main-layout: */
+    QHBoxLayout *pMainLayout = new QHBoxLayout(this);
+    if (pMainLayout)
+    {
+        /* Configure main-layout: */
+        pMainLayout->setContentsMargins(0, 0, 0, 0);
+        pMainLayout->setSpacing(0);
+        /* Crete label: */
+        m_pLabel = new QLabel;
+        if (m_pLabel)
+        {
+            /* Add label into main-layout: */
+            pMainLayout->addWidget(m_pLabel);
+        }
+    }
+}
+
+QString QITextStatusBarIndicator::text() const
+{
+    return m_pLabel->text();
+}
+
+void QITextStatusBarIndicator::setText(const QString &strText)
+{
+    m_pLabel->setText(strText);
+}
+
Index: trunk/src/VBox/Frontends/VirtualBox/src/extensions/QIStatusBarIndicator.h
===================================================================
--- trunk/src/VBox/Frontends/VirtualBox/src/extensions/QIStatusBarIndicator.h	(revision 51992)
+++ trunk/src/VBox/Frontends/VirtualBox/src/extensions/QIStatusBarIndicator.h	(revision 51992)
@@ -0,0 +1,127 @@
+/** @file
+ * VBox Qt GUI - QIStatusBarIndicator interface declaration.
+ */
+
+/*
+ * Copyright (C) 2006-2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ */
+
+#ifndef ___QIStatusBarIndicators_h___
+#define ___QIStatusBarIndicators_h___
+
+/* Qt includes: */
+#include <QWidget>
+#include <QMap>
+#include <QIcon>
+
+/* Forward declarations: */
+class QLabel;
+
+/** QWidget extension used as status-bar indicator. */
+class QIStatusBarIndicator : public QWidget
+{
+    Q_OBJECT;
+
+signals:
+
+    /** Notifies about mouse-double-click-event: */
+    void sigMouseDoubleClick(QIStatusBarIndicator *pIndicator, QMouseEvent *pEvent);
+    /** Notifies about context-menu-request-event: */
+    void sigContextMenuRequest(QIStatusBarIndicator *pIndicator, QContextMenuEvent *pEvent);
+
+public:
+
+    /** Constructor, passes @a pParent to the QWidget constructor. */
+    QIStatusBarIndicator(QWidget *pParent = 0);
+
+    /** Returns size-hint. */
+    virtual QSize sizeHint() const { return m_size.isValid() ? m_size : QWidget::sizeHint(); }
+
+protected:
+
+#ifdef Q_WS_MAC
+    /** Mac OS X: Mouse-press-event handler.
+      *           Make the left button also show the context-menu to make things
+      *           simpler for users with single mouse button mice (laptops++). */
+    virtual void mousePressEvent(QMouseEvent *pEvent);
+#endif /* Q_WS_MAC */
+    /** Mouse-double-click-event handler. */
+    virtual void mouseDoubleClickEvent(QMouseEvent *pEvent);
+    /** Context-menu-event handler. */
+    virtual void contextMenuEvent(QContextMenuEvent *pEvent);
+
+    /** Holds currently cached size. */
+    QSize m_size;
+};
+
+/** QIStatusBarIndicator extension used as status-bar state indicator. */
+class QIStateStatusBarIndicator : public QIStatusBarIndicator
+{
+    Q_OBJECT;
+
+public:
+
+    /** Constructor, passes @a pParent to the QIStatusBarIndicator constructor. */
+    QIStateStatusBarIndicator(QWidget *pParent = 0);
+
+    /** Returns current state. */
+    int state() const { return m_iState; }
+
+    /** Returns state-icon for passed @a iState. */
+    QIcon stateIcon(int iState) const;
+    /** Defines state-icon for passed @a iState as @a icon. */
+    void setStateIcon(int iState, const QIcon &icon);
+
+public slots:
+
+    /** Defines int @a state. */
+    virtual void setState(int iState) { m_iState = iState; repaint(); }
+    /** Defines bool @a state. */
+    virtual void setState(bool fState) { setState((int)fState); }
+
+protected:
+
+    /** Paint-event handler. */
+    virtual void paintEvent(QPaintEvent *pEvent);
+
+    /** Draw-contents routine. */
+    virtual void drawContents(QPainter *pPainter);
+
+private:
+
+    /** Holds current state. */
+    int m_iState;
+    /** Holds cached state icons. */
+    QMap<int, QIcon> m_icons;
+};
+
+/** QIStatusBarIndicator extension used as status-bar state indicator. */
+class QITextStatusBarIndicator : public QIStatusBarIndicator
+{
+    Q_OBJECT;
+
+public:
+
+    /** Constructor, passes @a pParent to the QIStatusBarIndicator constructor. */
+    QITextStatusBarIndicator(QWidget *pParent = 0);
+
+    /** Returns text. */
+    QString text() const;
+    /** Defines @a strText. */
+    void setText(const QString &strText);
+
+private:
+
+    /** Holds the label instance. */
+    QLabel *m_pLabel;
+};
+
+#endif /* !___QIStatusBarIndicators_h___ */
Index: trunk/src/VBox/Frontends/VirtualBox/src/extradata/UIExtraDataDefs.h
===================================================================
--- trunk/src/VBox/Frontends/VirtualBox/src/extradata/UIExtraDataDefs.h	(revision 51989)
+++ trunk/src/VBox/Frontends/VirtualBox/src/extradata/UIExtraDataDefs.h	(revision 51992)
@@ -482,6 +482,6 @@
     IndicatorType_OpticalDisks,
     IndicatorType_FloppyDisks,
+    IndicatorType_USB,
     IndicatorType_Network,
-    IndicatorType_USB,
     IndicatorType_SharedFolders,
     IndicatorType_VideoCapture,
@@ -489,4 +489,5 @@
     IndicatorType_Mouse,
     IndicatorType_Keyboard,
+    IndicatorType_KeyboardExtension,
     IndicatorType_Max
 };
Index: trunk/src/VBox/Frontends/VirtualBox/src/net/UINetworkManager.cpp
===================================================================
--- trunk/src/VBox/Frontends/VirtualBox/src/net/UINetworkManager.cpp	(revision 51989)
+++ trunk/src/VBox/Frontends/VirtualBox/src/net/UINetworkManager.cpp	(revision 51992)
@@ -115,5 +115,5 @@
     {
         m_pNetworkManagerIndicator = new UINetworkManagerIndicator;
-        connect(m_pNetworkManagerIndicator, SIGNAL(mouseDoubleClicked(QIStateIndicator *, QMouseEvent *)), this, SLOT(show()));
+        connect(m_pNetworkManagerIndicator, SIGNAL(sigMouseDoubleClick(QIStateStatusBarIndicator*, QMouseEvent *)), this, SLOT(show()));
     }
 }
Index: trunk/src/VBox/Frontends/VirtualBox/src/net/UINetworkManagerIndicator.h
===================================================================
--- trunk/src/VBox/Frontends/VirtualBox/src/net/UINetworkManagerIndicator.h	(revision 51989)
+++ trunk/src/VBox/Frontends/VirtualBox/src/net/UINetworkManagerIndicator.h	(revision 51992)
@@ -25,5 +25,5 @@
 
 /* Local includes: */
-#include "QIStateIndicator.h"
+#include "QIStatusBarIndicator.h"
 
 /* Forward declarations: */
@@ -39,7 +39,12 @@
 
 /* Network-manager status-bar indicator: */
-class UINetworkManagerIndicator : public QIStateIndicator
+class UINetworkManagerIndicator : public QIStateStatusBarIndicator
 {
     Q_OBJECT;
+
+public:
+
+    /** Update routine. */
+    void updateAppearance();
 
 protected:
@@ -89,5 +94,4 @@
     /* Update stuff: */
     void recalculateIndicatorState();
-    void updateAppearance();
 
     /* Variables: */
Index: trunk/src/VBox/Frontends/VirtualBox/src/precomp.h
===================================================================
--- trunk/src/VBox/Frontends/VirtualBox/src/precomp.h	(revision 51989)
+++ trunk/src/VBox/Frontends/VirtualBox/src/precomp.h	(revision 51992)
@@ -176,6 +176,6 @@
 #include "QIRichToolButton.h"
 #include "QISplitter.h"
-#include "QIStateIndicator.h"
 #include "QIStatusBar.h"
+#include "QIStatusBarIndicator.h"
 #include "QIToolButton.h"
 #include "QITreeView.h"
Index: trunk/src/VBox/Frontends/VirtualBox/src/runtime/UIIndicatorsPool.cpp
===================================================================
--- trunk/src/VBox/Frontends/VirtualBox/src/runtime/UIIndicatorsPool.cpp	(revision 51989)
+++ trunk/src/VBox/Frontends/VirtualBox/src/runtime/UIIndicatorsPool.cpp	(revision 51992)
@@ -1,11 +1,9 @@
 /* $Id$ */
 /** @file
- *
- * VBox frontends: Qt GUI ("VirtualBox"):
- * UIIndicatorsPool class implementation
+ * VBox Qt GUI - UIIndicatorsPool class implementation.
  */
 
 /*
- * Copyright (C) 2010-2012 Oracle Corporation
+ * Copyright (C) 2010-2013 Oracle Corporation
  *
  * This file is part of VirtualBox Open Source Edition (OSE), as
@@ -21,14 +19,19 @@
 #include <QTimer>
 #include <QPainter>
+#include <QHBoxLayout>
 
 /* GUI includes: */
 #include "UIIndicatorsPool.h"
-#include "VBoxGlobal.h"
+#include "QIWithRetranslateUI.h"
 #include "UIExtraDataManager.h"
 #include "UIMachineDefs.h"
 #include "UIConverter.h"
 #include "UIAnimationFramework.h"
+#include "UISession.h"
 #include "UIMedium.h"
 #include "UIIconPool.h"
+#include "UIHostComboEditor.h"
+#include "QIStatusBarIndicator.h"
+#include "VBoxGlobal.h"
 
 /* COM includes: */
@@ -50,5 +53,7 @@
 #include <iprt/time.h>
 
-class UIIndicatorHardDisks : public QIStateIndicator
+
+/** QIStateStatusBarIndicator extension for Runtime UI. */
+class UISessionStateStatusBarIndicator : public QIWithRetranslateUI<QIStateStatusBarIndicator>
 {
     Q_OBJECT;
@@ -56,6 +61,26 @@
 public:
 
-    UIIndicatorHardDisks(CSession &session)
-      : m_session(session)
+    /** Constructor which remembers passed @a session object. */
+    UISessionStateStatusBarIndicator(CSession &session) : m_session(session) {}
+
+    /** Abstract update routine. */
+    virtual void updateAppearance() = 0;
+
+protected:
+
+    /** Holds the session reference. */
+    CSession &m_session;
+};
+
+/** UISessionStateStatusBarIndicator extension for Runtime UI: Hard-drive indicator. */
+class UIIndicatorHardDrive : public UISessionStateStatusBarIndicator
+{
+    Q_OBJECT;
+
+public:
+
+    /** Constructor, passes @a session to the UISessionStateStatusBarIndicator constructor. */
+    UIIndicatorHardDrive(CSession &session)
+        : UISessionStateStatusBarIndicator(session)
     {
         setStateIcon(KDeviceActivity_Idle,    UIIconPool::iconSet(":/hd_16px.png"));
@@ -67,4 +92,7 @@
     }
 
+private:
+
+    /** Retranslation routine. */
     void retranslateUi()
     {
@@ -72,4 +100,5 @@
     }
 
+    /** Update routine. */
     void updateAppearance()
     {
@@ -109,12 +138,8 @@
         setState(fAttachmentsPresent ? KDeviceActivity_Idle : KDeviceActivity_Null);
     }
-
-protected:
-    /* For compatibility reason we do it here, later this should be moved to
-     * QIStateIndicator. */
-    CSession &m_session;
 };
 
-class UIIndicatorOpticalDisks : public QIStateIndicator
+/** UISessionStateStatusBarIndicator extension for Runtime UI: Optical-drive indicator. */
+class UIIndicatorOpticalDisks : public UISessionStateStatusBarIndicator
 {
     Q_OBJECT;
@@ -122,6 +147,7 @@
 public:
 
+    /** Constructor, passes @a session to the UISessionStateStatusBarIndicator constructor. */
     UIIndicatorOpticalDisks(CSession &session)
-      : m_session(session)
+        : UISessionStateStatusBarIndicator(session)
     {
         setStateIcon(KDeviceActivity_Idle,    UIIconPool::iconSet(":/cd_16px.png"));
@@ -133,4 +159,7 @@
     }
 
+private:
+
+    /** Retranslation routine. */
     void retranslateUi()
     {
@@ -138,4 +167,5 @@
     }
 
+    /** Update routine. */
     void updateAppearance()
     {
@@ -179,12 +209,8 @@
         setState(fAttachmentsMounted ? KDeviceActivity_Idle : KDeviceActivity_Null);
     }
-
-protected:
-    /* For compatibility reason we do it here, later this should be moved to
-     * QIStateIndicator. */
-    CSession &m_session;
 };
 
-class UIIndicatorFloppyDisks : public QIStateIndicator
+/** UISessionStateStatusBarIndicator extension for Runtime UI: Floppy-drive indicator. */
+class UIIndicatorFloppyDisks : public UISessionStateStatusBarIndicator
 {
     Q_OBJECT;
@@ -192,6 +218,7 @@
 public:
 
+    /** Constructor, passes @a session to the UISessionStateStatusBarIndicator constructor. */
     UIIndicatorFloppyDisks(CSession &session)
-      : m_session(session)
+        : UISessionStateStatusBarIndicator(session)
     {
         setStateIcon(KDeviceActivity_Idle,    UIIconPool::iconSet(":/fd_16px.png"));
@@ -203,4 +230,7 @@
     }
 
+private:
+
+    /** Retranslation routine. */
     void retranslateUi()
     {
@@ -208,4 +238,5 @@
     }
 
+    /** Update routine. */
     void updateAppearance()
     {
@@ -249,12 +280,8 @@
         setState(fAttachmentsMounted ? KDeviceActivity_Idle : KDeviceActivity_Null);
     }
-
-protected:
-    /* For compatibility reason we do it here, later this should be moved to
-     * QIStateIndicator. */
-    CSession &m_session;
 };
 
-class UIIndicatorNetwork : public QIStateIndicator
+/** UISessionStateStatusBarIndicator extension for Runtime UI: Network indicator. */
+class UIIndicatorNetwork : public UISessionStateStatusBarIndicator
 {
     Q_OBJECT;
@@ -262,7 +289,8 @@
 public:
 
+    /** Constructor, passes @a session to the UISessionStateStatusBarIndicator constructor. */
     UIIndicatorNetwork(CSession &session)
-      : m_session(session)
-      , m_pUpdateTimer(new QTimer(this))
+        : UISessionStateStatusBarIndicator(session)
+        , m_pUpdateTimer(new QTimer(this))
     {
         setStateIcon(KDeviceActivity_Idle,    UIIconPool::iconSet(":/nw_16px.png"));
@@ -277,4 +305,15 @@
     }
 
+private slots:
+
+    /** Updates network IP addresses. */
+    void sltUpdateNetworkIPs()
+    {
+        updateAppearance();
+    }
+
+private:
+
+    /** Retranslation routine. */
     void retranslateUi()
     {
@@ -282,4 +321,5 @@
     }
 
+    /** Update routine. */
     void updateAppearance()
     {
@@ -348,19 +388,11 @@
         setToolTip(strToolTip.arg(strFullData));
     }
-protected slots:
-
-    void sltUpdateNetworkIPs()
-    {
-        updateAppearance();
-    }
-
-protected:
-    /* For compatibility reason we do it here, later this should be moved to
-     * QIStateIndicator. */
-    CSession &m_session;
+
+    /** Holds the auto-update timer instance. */
     QTimer *m_pUpdateTimer;
 };
 
-class UIIndicatorUSB : public QIStateIndicator
+/** UISessionStateStatusBarIndicator extension for Runtime UI: USB indicator. */
+class UIIndicatorUSB : public UISessionStateStatusBarIndicator
 {
     Q_OBJECT;
@@ -368,6 +400,7 @@
 public:
 
+    /** Constructor, passes @a session to the UISessionStateStatusBarIndicator constructor. */
     UIIndicatorUSB(CSession &session)
-      : m_session(session)
+        : UISessionStateStatusBarIndicator(session)
     {
         setStateIcon(KDeviceActivity_Idle,    UIIconPool::iconSet(":/usb_16px.png"));
@@ -379,4 +412,7 @@
     }
 
+private:
+
+    /** Retranslation routine. */
     void retranslateUi()
     {
@@ -384,4 +420,5 @@
     }
 
+    /** Update routine. */
     void updateAppearance()
     {
@@ -416,12 +453,8 @@
         setToolTip(strToolTip.arg(strFullData));
     }
-
-protected:
-    /* For compatibility reason we do it here, later this should be moved to
-     * QIStateIndicator. */
-    CSession &m_session;
 };
 
-class UIIndicatorSharedFolders : public QIStateIndicator
+/** UISessionStateStatusBarIndicator extension for Runtime UI: Shared-folders indicator. */
+class UIIndicatorSharedFolders : public UISessionStateStatusBarIndicator
 {
     Q_OBJECT;
@@ -429,6 +462,7 @@
 public:
 
+    /** Constructor, passes @a session to the UISessionStateStatusBarIndicator constructor. */
     UIIndicatorSharedFolders(CSession &session)
-      : m_session(session)
+        : UISessionStateStatusBarIndicator(session)
     {
         setStateIcon(KDeviceActivity_Idle,    UIIconPool::iconSet(":/sf_16px.png"));
@@ -440,4 +474,7 @@
     }
 
+private:
+
+    /** Retranslation routine. */
     void retranslateUi()
     {
@@ -445,4 +482,5 @@
     }
 
+    /** Update routine. */
     void updateAppearance()
     {
@@ -491,12 +529,8 @@
         setToolTip(strToolTip.arg(strFullData));
     }
-
-protected:
-    /* For compatibility reason we do it here, later this should be moved to
-     * QIStateIndicator. */
-    CSession &m_session;
 };
 
-class UIIndicatorVideoCapture : public QIStateIndicator
+/** UISessionStateStatusBarIndicator extension for Runtime UI: Video-capture indicator. */
+class UIIndicatorVideoCapture : public UISessionStateStatusBarIndicator
 {
     Q_OBJECT;
@@ -505,7 +539,5 @@
     Q_PROPERTY(double rotationAngle READ rotationAngle WRITE setRotationAngle);
 
-public:
-
-    /* State enumerator: */
+    /** Video-capture states. */
     enum UIIndicatorStateVideoCapture
     {
@@ -514,7 +546,9 @@
     };
 
-    /* Constructor: */
+public:
+
+    /** Constructor, passes @a session to the UISessionStateStatusBarIndicator constructor. */
     UIIndicatorVideoCapture(CSession &session)
-        : m_session(session)
+        : UISessionStateStatusBarIndicator(session)
         , m_pAnimation(0)
         , m_dRotationAngle(0)
@@ -533,5 +567,57 @@
     }
 
-    /* API: Update stuff: */
+private slots:
+
+    /** Handles state change. */
+    void setState(int iState)
+    {
+        /* Update animation state: */
+        switch (iState)
+        {
+            case UIIndicatorStateVideoCapture_Disabled:
+                m_pAnimation->stop();
+                m_dRotationAngle = 0;
+                break;
+            case UIIndicatorStateVideoCapture_Enabled:
+                m_pAnimation->start();
+                break;
+            default:
+                break;
+        }
+        /* Call to base-class: */
+        QIStateStatusBarIndicator::setState(iState);
+    }
+
+private:
+
+    /** Retranslation routine. */
+    void retranslateUi()
+    {
+        updateAppearance();
+    }
+
+    /** Paint-event handler. */
+    void paintEvent(QPaintEvent*)
+    {
+        /* Create new painter: */
+        QPainter painter(this);
+        /* Configure painter for *enabled* state: */
+        if (state() == UIIndicatorStateVideoCapture_Enabled)
+        {
+            /* Configure painter for smooth animation: */
+            painter.setRenderHint(QPainter::Antialiasing);
+            painter.setRenderHint(QPainter::SmoothPixmapTransform);
+            /* Shift rotation origin according pixmap center: */
+            painter.translate(height() / 2, height() / 2);
+            /* Rotate painter: */
+            painter.rotate(rotationAngle());
+            /* Unshift rotation origin according pixmap center: */
+            painter.translate(- height() / 2, - height() / 2);
+        }
+        /* Draw contents: */
+        drawContents(&painter);
+    }
+
+    /** Update routine. */
     void updateAppearance()
     {
@@ -563,71 +649,21 @@
     }
 
-public slots:
-
-    /* Handler: State stuff: */
-    void setState(int iState)
-    {
-        /* Update animation state: */
-        switch (iState)
-        {
-            case UIIndicatorStateVideoCapture_Disabled:
-                m_pAnimation->stop();
-                m_dRotationAngle = 0;
-                break;
-            case UIIndicatorStateVideoCapture_Enabled:
-                m_pAnimation->start();
-                break;
-            default:
-                break;
-        }
-
-        /* Call to base-class: */
-        QIStateIndicator::setState(iState);
-    }
-
-protected:
-
-    /* Handler: Translate stuff: */
-    void retranslateUi()
-    {
-        updateAppearance();
-    }
-
-    /* Handler: Paint stuff: */
-    void paintEvent(QPaintEvent*)
-    {
-        /* Create new painter: */
-        QPainter painter(this);
-        /* Configure painter for *enabled* state: */
-        if (state() == UIIndicatorStateVideoCapture_Enabled)
-        {
-            /* Configure painter for smooth animation: */
-            painter.setRenderHint(QPainter::Antialiasing);
-            painter.setRenderHint(QPainter::SmoothPixmapTransform);
-            /* Shift rotation origin according pixmap center: */
-            painter.translate(height() / 2, height() / 2);
-            /* Rotate painter: */
-            painter.rotate(rotationAngle());
-            /* Unshift rotation origin according pixmap center: */
-            painter.translate(- height() / 2, - height() / 2);
-        }
-        /* Draw contents: */
-        drawContents(&painter);
-    }
-
-    /* Properties: Rotation stuff: */
+    /** Returns rotation start angle. */
     double rotationAngleStart() const { return 0; }
+    /** Returns rotation finish angle. */
     double rotationAngleFinal() const { return 360; }
+    /** Returns current rotation angle. */
     double rotationAngle() const { return m_dRotationAngle; }
+    /** Defines current rotation angle. */
     void setRotationAngle(double dRotationAngle) { m_dRotationAngle = dRotationAngle; update(); }
 
-    /* For compatibility reason we do it here,
-     * later this should be moved to QIStateIndicator. */
-    CSession &m_session;
+    /** Holds the rotation animation instance. */
     UIAnimationLoop *m_pAnimation;
+    /** Holds current rotation angle. */
     double m_dRotationAngle;
 };
 
-class UIIndicatorFeatures : public QIStateIndicator
+/** UISessionStateStatusBarIndicator extension for Runtime UI: Features indicator. */
+class UIIndicatorFeatures : public UISessionStateStatusBarIndicator
 {
     Q_OBJECT;
@@ -635,6 +671,7 @@
 public:
 
+    /** Constructor, passes @a session to the UISessionStateStatusBarIndicator constructor. */
     UIIndicatorFeatures(CSession &session)
-      : m_session(session)
+        : UISessionStateStatusBarIndicator(session)
     {
         setStateIcon(0, UIIconPool::iconSet(":/vtx_amdv_disabled_16px.png"));
@@ -644,4 +681,7 @@
     }
 
+private:
+
+    /** Retranslation routine. */
     void retranslateUi()
     {
@@ -649,4 +689,5 @@
     }
 
+    /** Update routine. */
     void updateAppearance()
     {
@@ -696,12 +737,8 @@
         setState(bVirtEnabled);
     }
-
-protected:
-    /* For compatibility reason we do it here, later this should be moved to
-     * QIStateIndicator. */
-    CSession &m_session;
 };
 
-class UIIndicatorMouse : public QIStateIndicator
+/** UISessionStateStatusBarIndicator extension for Runtime UI: Mouse indicator. */
+class UIIndicatorMouse : public UISessionStateStatusBarIndicator
 {
     Q_OBJECT;
@@ -709,6 +746,7 @@
 public:
 
+    /** Constructor, passes @a session to the UISessionStateStatusBarIndicator constructor. */
     UIIndicatorMouse(CSession &session)
-      : m_session(session)
+        : UISessionStateStatusBarIndicator(session)
     {
         setStateIcon(0, UIIconPool::iconSet(":/mouse_disabled_16px.png"));
@@ -721,17 +759,7 @@
     }
 
-    void retranslateUi()
-    {
-        setToolTip(QApplication::translate("UIIndicatorsPool", "Indicates whether the host mouse pointer is captured by the guest OS:<br>"
-                      "<nobr><img src=:/mouse_disabled_16px.png/>&nbsp;&nbsp;pointer is not captured</nobr><br>"
-                      "<nobr><img src=:/mouse_16px.png/>&nbsp;&nbsp;pointer is captured</nobr><br>"
-                      "<nobr><img src=:/mouse_seamless_16px.png/>&nbsp;&nbsp;mouse integration (MI) is On</nobr><br>"
-                      "<nobr><img src=:/mouse_can_seamless_16px.png/>&nbsp;&nbsp;MI is Off, pointer is captured</nobr><br>"
-                      "<nobr><img src=:/mouse_can_seamless_uncaptured_16px.png/>&nbsp;&nbsp;MI is Off, pointer is not captured</nobr><br>"
-                      "Note that the mouse integration feature requires Guest Additions to be installed in the guest OS."));
-    }
-
-public slots:
-
+private slots:
+
+    /** Handles state change. */
     void setState(int iState)
     {
@@ -740,19 +768,33 @@
             !(iState & UIMouseStateType_MouseCaptured))
         {
-            QIStateIndicator::setState(4);
+            QIStateStatusBarIndicator::setState(4);
         }
         else
         {
-            QIStateIndicator::setState(iState & (UIMouseStateType_MouseAbsolute | UIMouseStateType_MouseCaptured));
-        }
-    }
-
-protected:
-    /* For compatibility reason we do it here, later this should be moved to
-     * QIStateIndicator. */
-    CSession &m_session;
+            QIStateStatusBarIndicator::setState(iState & (UIMouseStateType_MouseAbsolute | UIMouseStateType_MouseCaptured));
+        }
+    }
+
+private:
+
+    /** Retranslation routine. */
+    void retranslateUi()
+    {
+        setToolTip(QApplication::translate("UIIndicatorsPool",
+                   "Indicates whether the host mouse pointer is captured by the guest OS:<br>"
+                   "<nobr><img src=:/mouse_disabled_16px.png/>&nbsp;&nbsp;pointer is not captured</nobr><br>"
+                   "<nobr><img src=:/mouse_16px.png/>&nbsp;&nbsp;pointer is captured</nobr><br>"
+                   "<nobr><img src=:/mouse_seamless_16px.png/>&nbsp;&nbsp;mouse integration (MI) is On</nobr><br>"
+                   "<nobr><img src=:/mouse_can_seamless_16px.png/>&nbsp;&nbsp;MI is Off, pointer is captured</nobr><br>"
+                   "<nobr><img src=:/mouse_can_seamless_uncaptured_16px.png/>&nbsp;&nbsp;MI is Off, pointer is not captured</nobr><br>"
+                   "Note that the mouse integration feature requires Guest Additions to be installed in the guest OS."));
+    }
+
+    /** Update routine. */
+    void updateAppearance() {}
 };
 
-class UIIndicatorKeyboard : public QIStateIndicator
+/** UISessionStateStatusBarIndicator extension for Runtime UI: Keyboard indicator. */
+class UIIndicatorKeyboard : public UISessionStateStatusBarIndicator
 {
     Q_OBJECT;
@@ -760,6 +802,7 @@
 public:
 
+    /** Constructor, passes @a session to the UISessionStateStatusBarIndicator constructor. */
     UIIndicatorKeyboard(CSession &session)
-      : m_session(session)
+        : UISessionStateStatusBarIndicator(session)
     {
         setStateIcon(0, UIIconPool::iconSet(":/hostkey_16px.png"));
@@ -771,20 +814,63 @@
     }
 
+private:
+
+    /** Retranslation routine. */
     void retranslateUi()
     {
-        setToolTip(QApplication::translate("UIIndicatorsPool", "Indicates whether the keyboard is captured by the guest OS "
-                      "(<img src=:/hostkey_captured_16px.png/>) or not (<img src=:/hostkey_16px.png/>)."));
-    }
-
-protected:
-    /* For compatibility reason we do it here, later this should be moved to
-     * QIStateIndicator. */
-    CSession &m_session;
+        setToolTip(QApplication::translate("UIIndicatorsPool",
+                   "Indicates whether the keyboard is captured by the guest OS "
+                   "(<img src=:/hostkey_captured_16px.png/>) or not (<img src=:/hostkey_16px.png/>)."));
+    }
+
+    /** Update routine. */
+    void updateAppearance() {}
 };
 
-UIIndicatorsPool::UIIndicatorsPool(CSession &session, QObject *pParent)
-    : QObject(pParent)
-    , m_session(session)
-    , m_pool(IndicatorType_Max)
+/** QITextStatusBarIndicator extension for Runtime UI: Keyboard-extension indicator. */
+class UIIndicatorKeyboardExtension : public QIWithRetranslateUI<QITextStatusBarIndicator>
+{
+    Q_OBJECT;
+
+public:
+
+    /** Constructor. */
+    UIIndicatorKeyboardExtension()
+    {
+        /* Make sure host-combination label will be updated: */
+        connect(&vboxGlobal().settings(), SIGNAL(propertyChanged(const char *, const char *)),
+                this, SLOT(sltUpdateAppearance()));
+        /* Translate finally: */
+        retranslateUi();
+    }
+
+public slots:
+
+    /** Update routine. */
+    void sltUpdateAppearance()
+    {
+        setText(UIHostCombo::toReadableString(vboxGlobal().settings().hostCombo()));
+    }
+
+private:
+
+    /** Retranslation routine. */
+    void retranslateUi()
+    {
+        sltUpdateAppearance();
+        setToolTip(QApplication::translate("UIMachineWindowNormal",
+                                           "Shows the currently assigned Host key.<br>"
+                                           "This key, when pressed alone, toggles the keyboard and mouse "
+                                           "capture state. It can also be used in combination with other keys "
+                                           "to quickly perform actions from the main menu."));
+    }
+};
+
+
+UIIndicatorsPool::UIIndicatorsPool(UISession *pSession, QWidget *pParent /* = 0 */)
+    : QWidget(pParent)
+    , m_pSession(pSession)
+    , m_session(m_pSession->session())
+    , m_pTimerAutoUpdate(0)
 {
     /* Prepare: */
@@ -798,38 +884,173 @@
 }
 
-QIStateIndicator* UIIndicatorsPool::indicator(IndicatorType index)
-{
-    /* Just return what already exists: */
-    return m_pool[index];
+void UIIndicatorsPool::updateAppearance(IndicatorType indicatorType)
+{
+    /* Skip missed indicators: */
+    if (!m_pool.contains(indicatorType))
+        return;
+
+    /* Get indicator: */
+    QIStatusBarIndicator *pIndicator = m_pool.value(indicatorType);
+
+    /* Assert indicators with NO appearance: */
+    UISessionStateStatusBarIndicator *pSessionStateIndicator =
+        qobject_cast<UISessionStateStatusBarIndicator*>(pIndicator);
+    AssertPtrReturnVoid(pSessionStateIndicator);
+
+    /* Update indicator appearance: */
+    pSessionStateIndicator->updateAppearance();
+}
+
+void UIIndicatorsPool::setAutoUpdateIndicatorStates(bool fEnabled)
+{
+    /* Make sure auto-update timer exists: */
+    AssertPtrReturnVoid(m_pTimerAutoUpdate);
+
+    /* Start/stop timer: */
+    if (fEnabled)
+        m_pTimerAutoUpdate->start(100);
+    else
+        m_pTimerAutoUpdate->stop();
+}
+
+void UIIndicatorsPool::sltAutoUpdateIndicatorStates()
+{
+    /* Update states for following indicators: */
+    if (m_pool.contains(IndicatorType_HardDisks))
+        updateIndicatorStateForDevice(m_pool.value(IndicatorType_HardDisks),     KDeviceType_HardDisk);
+    if (m_pool.contains(IndicatorType_OpticalDisks))
+        updateIndicatorStateForDevice(m_pool.value(IndicatorType_OpticalDisks),  KDeviceType_DVD);
+    if (m_pool.contains(IndicatorType_FloppyDisks))
+        updateIndicatorStateForDevice(m_pool.value(IndicatorType_FloppyDisks),   KDeviceType_Floppy);
+    if (m_pool.contains(IndicatorType_USB))
+        updateIndicatorStateForDevice(m_pool.value(IndicatorType_USB),           KDeviceType_USB);
+    if (m_pool.contains(IndicatorType_Network))
+        updateIndicatorStateForDevice(m_pool.value(IndicatorType_Network),       KDeviceType_Network);
+    if (m_pool.contains(IndicatorType_SharedFolders))
+        updateIndicatorStateForDevice(m_pool.value(IndicatorType_SharedFolders), KDeviceType_SharedFolder);
+}
+
+void UIIndicatorsPool::sltContextMenuRequest(QIStatusBarIndicator *pIndicator, QContextMenuEvent *pEvent)
+{
+    /* If that is one of pool indicators: */
+    foreach (IndicatorType indicatorType, m_pool.keys())
+        if (m_pool[indicatorType] == pIndicator)
+        {
+            /* Notify listener: */
+            emit sigContextMenuRequest(indicatorType, pEvent->globalPos());
+            return;
+        }
 }
 
 void UIIndicatorsPool::prepare()
 {
-    /* Get the list of restricted indicators: */
-    QList<IndicatorType> restrictedIndicators = gEDataManager->restrictedStatusBarIndicators(vboxGlobal().managedVMUuid());
-
-    /* Populate indicator-pool: */
-    for (int iIndex = 0; iIndex < IndicatorType_Max; ++iIndex)
-    {
-        /* Make sure indicator presence is permitted: */
-        IndicatorType index = static_cast<IndicatorType>(iIndex);
-        if (restrictedIndicators.contains(index))
-            continue;
-
-        /* Prepare indicator: */
-        switch (index)
-        {
-            case IndicatorType_HardDisks:     m_pool[index] = new UIIndicatorHardDisks(m_session); break;
-            case IndicatorType_OpticalDisks:  m_pool[index] = new UIIndicatorOpticalDisks(m_session); break;
-            case IndicatorType_FloppyDisks:   m_pool[index] = new UIIndicatorFloppyDisks(m_session); break;
-            case IndicatorType_Network:       m_pool[index] = new UIIndicatorNetwork(m_session); break;
-            case IndicatorType_USB:           m_pool[index] = new UIIndicatorUSB(m_session); break;
-            case IndicatorType_SharedFolders: m_pool[index] = new UIIndicatorSharedFolders(m_session); break;
-            case IndicatorType_VideoCapture:  m_pool[index] = new UIIndicatorVideoCapture(m_session); break;
-            case IndicatorType_Features:      m_pool[index] = new UIIndicatorFeatures(m_session); break;
-            case IndicatorType_Mouse:         m_pool[index] = new UIIndicatorMouse(m_session); break;
-            case IndicatorType_Keyboard:      m_pool[index] = new UIIndicatorKeyboard(m_session); break;
-            default: break;
-        }
+    /* Prepare connections: */
+    prepareConnections();
+    /* Prepare contents: */
+    prepareContents();
+    /* Prepare auto-update timer: */
+    prepareUpdateTimer();
+}
+
+void UIIndicatorsPool::prepareConnections()
+{
+    /* Listen for the status-bar configuration changes: */
+    connect(gEDataManager, SIGNAL(sigStatusBarConfigurationChange()),
+            this, SLOT(sltHandleConfigurationChange()));
+}
+
+void UIIndicatorsPool::prepareContents()
+{
+    /* Create main-layout: */
+    m_pMainLayout = new QHBoxLayout(this);
+    AssertPtrReturnVoid(m_pMainLayout);
+    {
+        /* Configure main-layout: */
+        m_pMainLayout->setContentsMargins(0, 0, 0, 0);
+        m_pMainLayout->setSpacing(5);
+        /* Update pool: */
+        updatePool();
+    }
+}
+
+void UIIndicatorsPool::prepareUpdateTimer()
+{
+    /* Create auto-update timer: */
+    m_pTimerAutoUpdate = new QTimer(this);
+    AssertPtrReturnVoid(m_pTimerAutoUpdate);
+    {
+        /* Configure auto-update timer: */
+        connect(m_pTimerAutoUpdate, SIGNAL(timeout()),
+                this, SLOT(sltAutoUpdateIndicatorStates()));
+        setAutoUpdateIndicatorStates(true);
+    }
+}
+
+void UIIndicatorsPool::updatePool()
+{
+    /* Recache the list of restricted indicators: */
+    m_configuration = gEDataManager->restrictedStatusBarIndicators(vboxGlobal().managedVMUuid());
+
+    /* Update indicators: */
+    for (int iType = IndicatorType_Invalid; iType < IndicatorType_Max; ++iType)
+    {
+        /* Determine indicator presence: */
+        const IndicatorType indicatorType = static_cast<IndicatorType>(iType);
+        bool fPresenceAllowed = !m_configuration.contains(indicatorType);
+
+        /* If presence restricted: */
+        if (!fPresenceAllowed && m_pool.contains(indicatorType))
+        {
+            /* Cleanup indicator: */
+            delete m_pool.value(indicatorType);
+            m_pool.remove(indicatorType);
+        }
+        /* If presence allowed: */
+        else if (fPresenceAllowed && !m_pool.contains(indicatorType))
+        {
+            /* Create indicator: */
+            switch (indicatorType)
+            {
+                case IndicatorType_HardDisks:         m_pool[indicatorType] = new UIIndicatorHardDrive(m_session);     break;
+                case IndicatorType_OpticalDisks:      m_pool[indicatorType] = new UIIndicatorOpticalDisks(m_session);  break;
+                case IndicatorType_FloppyDisks:       m_pool[indicatorType] = new UIIndicatorFloppyDisks(m_session);   break;
+                case IndicatorType_USB:               m_pool[indicatorType] = new UIIndicatorUSB(m_session);           break;
+                case IndicatorType_Network:           m_pool[indicatorType] = new UIIndicatorNetwork(m_session);       break;
+                case IndicatorType_SharedFolders:     m_pool[indicatorType] = new UIIndicatorSharedFolders(m_session); break;
+                case IndicatorType_VideoCapture:      m_pool[indicatorType] = new UIIndicatorVideoCapture(m_session);  break;
+                case IndicatorType_Features:          m_pool[indicatorType] = new UIIndicatorFeatures(m_session);      break;
+                case IndicatorType_Mouse:             m_pool[indicatorType] = new UIIndicatorMouse(m_session);         break;
+                case IndicatorType_Keyboard:          m_pool[indicatorType] = new UIIndicatorKeyboard(m_session);      break;
+                case IndicatorType_KeyboardExtension: m_pool[indicatorType] = new UIIndicatorKeyboardExtension;        break;
+                default: break;
+            }
+            /* Configure indicator: */
+            connect(m_pool.value(indicatorType), SIGNAL(sigContextMenuRequest(QIStatusBarIndicator*, QContextMenuEvent*)),
+                    this, SLOT(sltContextMenuRequest(QIStatusBarIndicator*, QContextMenuEvent*)));
+            /* Insert indicator into main-layout: */
+            m_pMainLayout->insertWidget(indicatorPosition(indicatorType), m_pool.value(indicatorType));
+        }
+    }
+}
+
+void UIIndicatorsPool::cleanupUpdateTimer()
+{
+    /* Destroy auto-update timer: */
+    AssertPtrReturnVoid(m_pTimerAutoUpdate);
+    {
+        m_pTimerAutoUpdate->stop();
+        delete m_pTimerAutoUpdate;
+        m_pTimerAutoUpdate = 0;
+    }
+}
+
+void UIIndicatorsPool::cleanupContents()
+{
+    /* Cleanup indicators: */
+    while (!m_pool.isEmpty())
+    {
+        const IndicatorType firstType = m_pool.keys().first();
+        delete m_pool.value(firstType);
+        m_pool.remove(firstType);
     }
 }
@@ -837,12 +1058,48 @@
 void UIIndicatorsPool::cleanup()
 {
-    /* Wipe-out indicator-pool: */
-    for (int iIndex = 0; iIndex < IndicatorType_Max; ++iIndex)
-    {
-        /* Wipe-out indicator: */
-        delete m_pool[iIndex];
-        m_pool[iIndex] = 0;
+    /* Cleanup auto-update timer: */
+    cleanupUpdateTimer();
+    /* Cleanup indicators: */
+    cleanupContents();
+}
+
+int UIIndicatorsPool::indicatorPosition(IndicatorType indicatorType) const
+{
+    int iPosition = 0;
+    foreach (const IndicatorType &iteratedIndicatorType, m_pool.keys())
+        if (iteratedIndicatorType == indicatorType)
+            return iPosition;
+        else
+            ++iPosition;
+    return iPosition;
+}
+
+void UIIndicatorsPool::updateIndicatorStateForDevice(QIStatusBarIndicator *pIndicator, KDeviceType deviceType)
+{
+    /* Assert indicators with NO state: */
+    QIStateStatusBarIndicator *pStateIndicator = qobject_cast<QIStateStatusBarIndicator*>(pIndicator);
+    AssertPtrReturnVoid(pStateIndicator);
+
+    /* Skip indicators with NULL state: */
+    if (pStateIndicator->state() == KDeviceActivity_Null)
+        return;
+
+    /* Paused VM have all indicator states set to IDLE: */
+    if (m_pSession->isPaused())
+    {
+        /* If current state differs from IDLE => set the IDLE one:  */
+        if (pStateIndicator->state() != KDeviceActivity_Idle)
+            pStateIndicator->setState(KDeviceActivity_Idle);
+    }
+    else
+    {
+        /* Get actual indicator state: */
+        const int iState = m_session.GetConsole().GetDeviceActivity(deviceType);
+        /* If curren state differs from actual => set the actual one: */
+        if (pStateIndicator->state() != iState)
+            pStateIndicator->setState(iState);
     }
 }
 
 #include "UIIndicatorsPool.moc"
+
Index: trunk/src/VBox/Frontends/VirtualBox/src/runtime/UIIndicatorsPool.h
===================================================================
--- trunk/src/VBox/Frontends/VirtualBox/src/runtime/UIIndicatorsPool.h	(revision 51989)
+++ trunk/src/VBox/Frontends/VirtualBox/src/runtime/UIIndicatorsPool.h	(revision 51992)
@@ -1,6 +1,4 @@
 /** @file
- *
- * VBox frontends: Qt GUI ("VirtualBox"):
- * UIIndicatorsPool class declaration
+ * VBox Qt GUI - UIIndicatorsPool class declaration.
  */
 
@@ -17,39 +15,103 @@
  */
 
-#ifndef __UIIndicatorsPool_h__
-#define __UIIndicatorsPool_h__
+#ifndef ___UIIndicatorsPool_h___
+#define ___UIIndicatorsPool_h___
+
+/* Qt includes: */
+#include <QWidget>
+#include <QList>
+#include <QMap>
 
 /* GUI includes: */
-#include "QIStateIndicator.h"
 #include "UIExtraDataDefs.h"
 
+/* COM includes: */
+#include "COMEnums.h"
+
 /* Forward declarations: */
+class UISession;
 class CSession;
+class QIStatusBarIndicator;
+class QHBoxLayout;
+class QTimer;
 
-/* Indicator pool interface/prototype: */
-class UIIndicatorsPool : public QObject
+/** QWidget extension
+  * providing Runtime UI with status-bar indicators. */
+class UIIndicatorsPool : public QWidget
 {
     Q_OBJECT;
 
+signals:
+
+    /** Notifies about context menu request.
+      * @param indicatorType reflects which type of indicator it is,
+      * @param position      reflects contex-menu position. */
+    void sigContextMenuRequest(IndicatorType indicatorType, const QPoint &position);
+
 public:
 
-    /* Constructor/destructor: */
-    UIIndicatorsPool(CSession &session, QObject *pParent);
+    /** Constructor, passes @a pParent to the QWidget constructor.
+      * @param pSession is used to retrieve appearance information. */
+    UIIndicatorsPool(UISession *pSession, QWidget *pParent = 0);
+    /** Destructor. */
     ~UIIndicatorsPool();
 
-    /* API indicator access stuff: */
-    QIStateIndicator* indicator(IndicatorType index);
+    /** Returns indicator corresponding to passed @a indicatorType. */
+    QIStatusBarIndicator* indicator(IndicatorType indicatorType) const { return m_pool.value(indicatorType); }
+
+    /** Updates appearance for passed @a indicatorType. */
+    void updateAppearance(IndicatorType indicatorType);
+
+    /** Defines whether indicator-states auto-update is @a fEnabled. */
+    void setAutoUpdateIndicatorStates(bool fEnabled);
+
+private slots:
+
+    /** Handles indicator-states auto-update. */
+    void sltAutoUpdateIndicatorStates();
+
+    /** Handles context-menu request. */
+    void sltContextMenuRequest(QIStatusBarIndicator *pIndicator, QContextMenuEvent *pEvent);
 
 private:
 
-    /* Helpers: Prepare/cleanup stuff: */
+    /** Prepare routine. */
     void prepare();
+    /** Prepare connections routine: */
+    void prepareConnections();
+    /** Prepare contents routine. */
+    void prepareContents();
+    /** Prepare update-timer routine: */
+    void prepareUpdateTimer();
+
+    /** Update pool routine. */
+    void updatePool();
+
+    /** Cleanup update-timer routine: */
+    void cleanupUpdateTimer();
+    /** Cleanup contents routine. */
+    void cleanupContents();
+    /** Cleanup routine. */
     void cleanup();
 
-    /* Variables: */
+    /** Returns position for passed @a indicatorType. */
+    int indicatorPosition(IndicatorType indicatorType) const;
+
+    /** Updates state for passed @a pIndicator through @a deviceType. */
+    void updateIndicatorStateForDevice(QIStatusBarIndicator *pIndicator, KDeviceType deviceType);
+
+    /** Holds the UI session reference. */
+    UISession *m_pSession;
+    /** Holds the session reference. */
     CSession &m_session;
-    QVector<QIStateIndicator*> m_pool;
+    /** Holds the cached configuration. */
+    QList<IndicatorType> m_configuration;
+    /** Holds cached indicator instances. */
+    QMap<IndicatorType, QIStatusBarIndicator*> m_pool;
+    /** Holds the main-layout instance. */
+    QHBoxLayout *m_pMainLayout;
+    /** Holds the auto-update timer instance. */
+    QTimer *m_pTimerAutoUpdate;
 };
 
-#endif // __UIIndicatorsPool_h__
-
+#endif /* !___UIIndicatorsPool_h___ */
Index: trunk/src/VBox/Frontends/VirtualBox/src/runtime/normal/UIMachineWindowNormal.cpp
===================================================================
--- trunk/src/VBox/Frontends/VirtualBox/src/runtime/normal/UIMachineWindowNormal.cpp	(revision 51989)
+++ trunk/src/VBox/Frontends/VirtualBox/src/runtime/normal/UIMachineWindowNormal.cpp	(revision 51992)
@@ -37,6 +37,5 @@
 #include "UIMachineView.h"
 #include "QIStatusBar.h"
-#include "QIStateIndicator.h"
-#include "UIHostComboEditor.h"
+#include "QIStatusBarIndicator.h"
 #ifdef Q_WS_MAC
 # include "VBoxUtils.h"
@@ -52,7 +51,5 @@
 UIMachineWindowNormal::UIMachineWindowNormal(UIMachineLogic *pMachineLogic, ulong uScreenId)
     : UIMachineWindow(pMachineLogic, uScreenId)
-    , m_pIndicatorsPool(new UIIndicatorsPool(pMachineLogic->uisession()->session(), this))
-    , m_pNameHostkey(0)
-    , m_pIdleTimer(0)
+    , m_pIndicatorsPool(0)
 {
 }
@@ -115,84 +112,24 @@
 }
 
-void UIMachineWindowNormal::sltUpdateIndicators()
-{
-    /* Update indicators: */
-    if (indicatorsPool()->indicator(IndicatorType_HardDisks))
-        updateIndicatorState(indicatorsPool()->indicator(IndicatorType_HardDisks), KDeviceType_HardDisk);
-    if (indicatorsPool()->indicator(IndicatorType_OpticalDisks))
-        updateIndicatorState(indicatorsPool()->indicator(IndicatorType_OpticalDisks), KDeviceType_DVD);
-    if (indicatorsPool()->indicator(IndicatorType_FloppyDisks))
-        updateIndicatorState(indicatorsPool()->indicator(IndicatorType_FloppyDisks), KDeviceType_Floppy);
-    if (indicatorsPool()->indicator(IndicatorType_USB))
-        updateIndicatorState(indicatorsPool()->indicator(IndicatorType_USB), KDeviceType_USB);
-    if (indicatorsPool()->indicator(IndicatorType_Network))
-        updateIndicatorState(indicatorsPool()->indicator(IndicatorType_Network), KDeviceType_Network);
-    if (indicatorsPool()->indicator(IndicatorType_SharedFolders))
-        updateIndicatorState(indicatorsPool()->indicator(IndicatorType_SharedFolders), KDeviceType_SharedFolder);
-}
-
-void UIMachineWindowNormal::sltShowIndicatorsContextMenu(QIStateIndicator *pIndicator, QContextMenuEvent *pEvent)
-{
-    /* Show hard-disks LED context menu: */
-    if (pIndicator == indicatorsPool()->indicator(IndicatorType_HardDisks))
-    {
-        if (gActionPool->action(UIActionIndexRuntime_Menu_HardDisks)->isEnabled())
-            gActionPool->action(UIActionIndexRuntime_Menu_HardDisks)->menu()->exec(pEvent->globalPos());
-    }
-    /* Show optical-disks LED context menu: */
-    else if (pIndicator == indicatorsPool()->indicator(IndicatorType_OpticalDisks))
-    {
-        if (gActionPool->action(UIActionIndexRuntime_Menu_OpticalDevices)->isEnabled())
-            gActionPool->action(UIActionIndexRuntime_Menu_OpticalDevices)->menu()->exec(pEvent->globalPos());
-    }
-    /* Show floppy-disks LED context menu: */
-    else if (pIndicator == indicatorsPool()->indicator(IndicatorType_FloppyDisks))
-    {
-        if (gActionPool->action(UIActionIndexRuntime_Menu_FloppyDevices)->isEnabled())
-            gActionPool->action(UIActionIndexRuntime_Menu_FloppyDevices)->menu()->exec(pEvent->globalPos());
-    }
-    /* Show usb LED context menu: */
-    else if (pIndicator == indicatorsPool()->indicator(IndicatorType_USB))
-    {
-        if (gActionPool->action(UIActionIndexRuntime_Menu_USBDevices)->isEnabled())
-            gActionPool->action(UIActionIndexRuntime_Menu_USBDevices)->menu()->exec(pEvent->globalPos());
-    }
-    /* Show network LED context menu: */
-    else if (pIndicator == indicatorsPool()->indicator(IndicatorType_Network))
-    {
-        if (gActionPool->action(UIActionIndexRuntime_Menu_Network)->isEnabled())
-            gActionPool->action(UIActionIndexRuntime_Menu_Network)->menu()->exec(pEvent->globalPos());
-    }
-    /* Show shared-folders LED context menu: */
-    else if (pIndicator == indicatorsPool()->indicator(IndicatorType_SharedFolders))
-    {
-        if (gActionPool->action(UIActionIndexRuntime_Menu_SharedFolders)->isEnabled())
-            gActionPool->action(UIActionIndexRuntime_Menu_SharedFolders)->menu()->exec(pEvent->globalPos());
-    }
-    /* Show video-capture LED context menu: */
-    else if (pIndicator == indicatorsPool()->indicator(IndicatorType_VideoCapture))
-    {
-        if (gActionPool->action(UIActionIndexRuntime_Menu_VideoCapture)->isEnabled())
-            gActionPool->action(UIActionIndexRuntime_Menu_VideoCapture)->menu()->exec(pEvent->globalPos());
-    }
-    /* Show mouse LED context menu: */
-    else if (pIndicator == indicatorsPool()->indicator(IndicatorType_Mouse))
-    {
-        if (gActionPool->action(UIActionIndexRuntime_Menu_MouseIntegration)->isEnabled())
-            gActionPool->action(UIActionIndexRuntime_Menu_MouseIntegration)->menu()->exec(pEvent->globalPos());
-    }
-    /* Show keyboard LED context menu: */
-    else if (pIndicator == indicatorsPool()->indicator(IndicatorType_Keyboard))
-    {
-        if (gActionPool->action(UIActionIndexRuntime_Menu_Keyboard)->isEnabled())
-            gActionPool->action(UIActionIndexRuntime_Menu_Keyboard)->menu()->exec(pEvent->globalPos());
-    }
-}
-
-void UIMachineWindowNormal::sltProcessGlobalSettingChange(const char * /* aPublicName */, const char * /* aName */)
-{
-    /* Update host-combination status-bar label: */
-    if (m_pNameHostkey)
-        m_pNameHostkey->setText(UIHostCombo::toReadableString(vboxGlobal().settings().hostCombo()));
+void UIMachineWindowNormal::sltHandleIndicatorContextMenuRequest(IndicatorType indicatorType, const QPoint &position)
+{
+    /* Determine action depending on indicator-type: */
+    UIAction *pAction = 0;
+    switch (indicatorType)
+    {
+        case IndicatorType_HardDisks:     pAction = gActionPool->action(UIActionIndexRuntime_Menu_HardDisks);        break;
+        case IndicatorType_OpticalDisks:  pAction = gActionPool->action(UIActionIndexRuntime_Menu_OpticalDevices);   break;
+        case IndicatorType_FloppyDisks:   pAction = gActionPool->action(UIActionIndexRuntime_Menu_FloppyDevices);    break;
+        case IndicatorType_USB:           pAction = gActionPool->action(UIActionIndexRuntime_Menu_USBDevices);       break;
+        case IndicatorType_Network:       pAction = gActionPool->action(UIActionIndexRuntime_Menu_Network);          break;
+        case IndicatorType_SharedFolders: pAction = gActionPool->action(UIActionIndexRuntime_Menu_SharedFolders);    break;
+        case IndicatorType_VideoCapture:  pAction = gActionPool->action(UIActionIndexRuntime_Menu_VideoCapture);     break;
+        case IndicatorType_Mouse:         pAction = gActionPool->action(UIActionIndexRuntime_Menu_MouseIntegration); break;
+        case IndicatorType_Keyboard:      pAction = gActionPool->action(UIActionIndexRuntime_Menu_Keyboard);         break;
+        default: break;
+    }
+    /* Raise action's context-menu: */
+    if (pAction && pAction->isEnabled())
+        pAction->menu()->exec(position);
 }
 
@@ -249,124 +186,19 @@
     UIMachineWindow::prepareStatusBar();
 
-    /* Setup: */
-    setStatusBar(new QIStatusBar(this));
-    QWidget *pIndicatorBox = new QWidget;
-    QHBoxLayout *pIndicatorBoxHLayout = new QHBoxLayout(pIndicatorBox);
-    pIndicatorBoxHLayout->setContentsMargins(0, 0, 0, 0);
-    pIndicatorBoxHLayout->setSpacing(5);
-    bool fAtLeastOneAddedToLeftSection = false;
-
-    /* Hard Disks: */
-    if (QIStateIndicator *pLedHardDisks = indicatorsPool()->indicator(IndicatorType_HardDisks))
-    {
-        pIndicatorBoxHLayout->addWidget(pLedHardDisks);
-        connect(pLedHardDisks, SIGNAL(contextMenuRequested(QIStateIndicator*, QContextMenuEvent*)),
-                this, SLOT(sltShowIndicatorsContextMenu(QIStateIndicator*, QContextMenuEvent*)));
-        fAtLeastOneAddedToLeftSection = true;
-    }
-
-    /* Optical Disks: */
-    if (QIStateIndicator *pLedOpticalDisks = indicatorsPool()->indicator(IndicatorType_OpticalDisks))
-    {
-        pIndicatorBoxHLayout->addWidget(pLedOpticalDisks);
-        connect(pLedOpticalDisks, SIGNAL(contextMenuRequested(QIStateIndicator*, QContextMenuEvent*)),
-                this, SLOT(sltShowIndicatorsContextMenu(QIStateIndicator*, QContextMenuEvent*)));
-        fAtLeastOneAddedToLeftSection = true;
-    }
-
-    /* Floppy Disks: */
-    if (QIStateIndicator *pLedFloppyDisks = indicatorsPool()->indicator(IndicatorType_FloppyDisks))
-    {
-        pIndicatorBoxHLayout->addWidget(pLedFloppyDisks);
-        connect(pLedFloppyDisks, SIGNAL(contextMenuRequested(QIStateIndicator*, QContextMenuEvent*)),
-                this, SLOT(sltShowIndicatorsContextMenu(QIStateIndicator*, QContextMenuEvent*)));
-        fAtLeastOneAddedToLeftSection = true;
-    }
-
-    /* USB: */
-    if (QIStateIndicator *pLedUSB = indicatorsPool()->indicator(IndicatorType_USB))
-    {
-        pIndicatorBoxHLayout->addWidget(pLedUSB);
-        connect(pLedUSB, SIGNAL(contextMenuRequested(QIStateIndicator*, QContextMenuEvent*)),
-                this, SLOT(sltShowIndicatorsContextMenu(QIStateIndicator*, QContextMenuEvent*)));
-        fAtLeastOneAddedToLeftSection = true;
-    }
-
-    /* Network: */
-    if (QIStateIndicator *pLedNetwork = indicatorsPool()->indicator(IndicatorType_Network))
-    {
-        pIndicatorBoxHLayout->addWidget(pLedNetwork);
-        connect(pLedNetwork, SIGNAL(contextMenuRequested(QIStateIndicator*, QContextMenuEvent*)),
-                this, SLOT(sltShowIndicatorsContextMenu(QIStateIndicator*, QContextMenuEvent*)));
-        fAtLeastOneAddedToLeftSection = true;
-    }
-
-    /* Shared Folders: */
-    if (QIStateIndicator *pLedSharedFolders = indicatorsPool()->indicator(IndicatorType_SharedFolders))
-    {
-        pIndicatorBoxHLayout->addWidget(pLedSharedFolders);
-        connect(pLedSharedFolders, SIGNAL(contextMenuRequested(QIStateIndicator*, QContextMenuEvent*)),
-                this, SLOT(sltShowIndicatorsContextMenu(QIStateIndicator*, QContextMenuEvent*)));
-        fAtLeastOneAddedToLeftSection = true;
-    }
-
-    /* Video Capture: */
-    if (QIStateIndicator *pLedVideoCapture = indicatorsPool()->indicator(IndicatorType_VideoCapture))
-    {
-        pIndicatorBoxHLayout->addWidget(pLedVideoCapture);
-        connect(pLedVideoCapture, SIGNAL(contextMenuRequested(QIStateIndicator*, QContextMenuEvent*)),
-                this, SLOT(sltShowIndicatorsContextMenu(QIStateIndicator*, QContextMenuEvent*)));
-        fAtLeastOneAddedToLeftSection = true;
-    }
-
-    /* Features: */
-    if (QIStateIndicator *pLedFeatures = indicatorsPool()->indicator(IndicatorType_Features))
-    {
-        pIndicatorBoxHLayout->addWidget(pLedFeatures);
-        fAtLeastOneAddedToLeftSection = true;
-    }
-
-    /* Separator: */
-    if (fAtLeastOneAddedToLeftSection)
-    {
-        QFrame *pSeparator = new QFrame;
-        pSeparator->setFrameStyle(QFrame::VLine | QFrame::Sunken);
-        pIndicatorBoxHLayout->addWidget(pSeparator);
-    }
-
-    /* Mouse: */
-    if (QIStateIndicator *pLedMouse = indicatorsPool()->indicator(IndicatorType_Mouse))
-    {
-        pIndicatorBoxHLayout->addWidget(pLedMouse);
-        connect(pLedMouse, SIGNAL(contextMenuRequested(QIStateIndicator*, QContextMenuEvent*)),
-                this, SLOT(sltShowIndicatorsContextMenu(QIStateIndicator*, QContextMenuEvent*)));
-    }
-
-    /* Keyboard: */
-    if (QIStateIndicator *pLedKeyboard = indicatorsPool()->indicator(IndicatorType_Keyboard))
-    {
-        if (QWidget *pContainerWidgetHostkey = new QWidget)
-        {
-            if (QHBoxLayout *pContainerLayoutHostkey = new QHBoxLayout(pContainerWidgetHostkey))
-            {
-                pContainerLayoutHostkey->setContentsMargins(0, 0, 0, 0);
-                pContainerLayoutHostkey->setSpacing(3);
-                m_pNameHostkey = new QLabel(UIHostCombo::toReadableString(vboxGlobal().settings().hostCombo()));
-                pContainerLayoutHostkey->addWidget(pLedKeyboard);
-                pContainerLayoutHostkey->addWidget(m_pNameHostkey);
-            }
-            pIndicatorBoxHLayout->addWidget(pContainerWidgetHostkey);
-        }
-        connect(pLedKeyboard, SIGNAL(contextMenuRequested(QIStateIndicator*, QContextMenuEvent*)),
-                this, SLOT(sltShowIndicatorsContextMenu(QIStateIndicator*, QContextMenuEvent*)));
-    }
-
-    /* Add to status-bar: */
-    statusBar()->addPermanentWidget(pIndicatorBox, 0);
-
-    /* Create & start timer to update LEDs: */
-    m_pIdleTimer = new QTimer(this);
-    connect(m_pIdleTimer, SIGNAL(timeout()), this, SLOT(sltUpdateIndicators()));
-    m_pIdleTimer->start(100);
+    /* Create status-bar: */
+    setStatusBar(new QIStatusBar);
+    AssertPtrReturnVoid(statusBar());
+    {
+        /* Create indicator-pool: */
+        m_pIndicatorsPool = new UIIndicatorsPool(machineLogic()->uisession());
+        AssertPtrReturnVoid(m_pIndicatorsPool);
+        {
+            /* Configure indicator-pool: */
+            connect(m_pIndicatorsPool, SIGNAL(sigContextMenuRequest(IndicatorType, const QPoint&)),
+                    this, SLOT(sltHandleIndicatorContextMenuRequest(IndicatorType, const QPoint&)));
+            /* Add indicator-pool into status-bar: */
+            statusBar()->addPermanentWidget(m_pIndicatorsPool, 0);
+        }
+    }
 
 #ifdef Q_WS_MAC
@@ -390,8 +222,4 @@
 #endif /* VBOX_GUI_WITH_CUSTOMIZATIONS1 */
 
-    /* Make sure host-combination LED will be updated: */
-    connect(&vboxGlobal().settings(), SIGNAL(propertyChanged(const char *, const char *)),
-            this, SLOT(sltProcessGlobalSettingChange(const char *, const char *)));
-
 #ifdef Q_WS_MAC
     /* Beta label? */
@@ -409,17 +237,23 @@
     UIMachineWindow::prepareHandlers();
 
-    /* Connect keyboard state-change handler: */
-    if (indicatorsPool()->indicator(IndicatorType_Keyboard))
+    /* Get keyboard/mouse indicators: */
+    QIStateStatusBarIndicator *pKeyboardIndicator =
+        qobject_cast<QIStateStatusBarIndicator*>(m_pIndicatorsPool->indicator(IndicatorType_Keyboard));
+    QIStateStatusBarIndicator *pMouseIndicator =
+        qobject_cast<QIStateStatusBarIndicator*>(m_pIndicatorsPool->indicator(IndicatorType_Mouse));
+
+    /* Connect keyboard/mouse state-change handlers: */
+    if (pKeyboardIndicator)
         connect(machineLogic()->keyboardHandler(), SIGNAL(keyboardStateChanged(int)),
-                indicatorsPool()->indicator(IndicatorType_Keyboard), SLOT(setState(int)));
-    /* Connect mouse state-change handler: */
-    if (indicatorsPool()->indicator(IndicatorType_Mouse))
+                pKeyboardIndicator, SLOT(setState(int)));
+    if (pMouseIndicator)
         connect(machineLogic()->mouseHandler(), SIGNAL(mouseStateChanged(int)),
-                indicatorsPool()->indicator(IndicatorType_Mouse), SLOT(setState(int)));
+                pMouseIndicator, SLOT(setState(int)));
+
     /* Early initialize created connections: */
-    if (indicatorsPool()->indicator(IndicatorType_Keyboard))
-        indicatorsPool()->indicator(IndicatorType_Keyboard)->setState(machineLogic()->keyboardHandler()->keyboardState());
-    if (indicatorsPool()->indicator(IndicatorType_Mouse))
-        indicatorsPool()->indicator(IndicatorType_Mouse)->setState(machineLogic()->mouseHandler()->mouseState());
+    if (pKeyboardIndicator)
+        pKeyboardIndicator->setState(machineLogic()->keyboardHandler()->keyboardState());
+    if (pMouseIndicator)
+        pMouseIndicator->setState(machineLogic()->mouseHandler()->mouseState());
 }
 
@@ -440,27 +274,5 @@
         statusBar()->setHidden(settings.isFeatureActive("noStatusBar"));
         if (statusBar()->isHidden())
-            m_pIdleTimer->stop();
-    }
-
-    /* Load availability settings: */
-    {
-        /* USB Stuff: */
-        if (indicatorsPool()->indicator(IndicatorType_USB))
-        {
-            bool fUSBEnabled =    !m.GetUSBDeviceFilters().isNull()
-                               && !m.GetUSBControllers().isEmpty()
-                               && m.GetUSBProxyAvailable();
-
-            if (!fUSBEnabled)
-            {
-                /* Hide USB menu: */
-                indicatorsPool()->indicator(IndicatorType_USB)->setHidden(true);
-            }
-            else
-            {
-                /* Toggle USB LED: */
-                indicatorsPool()->indicator(IndicatorType_USB)->setState(KDeviceActivity_Idle);
-            }
-        }
+            m_pIndicatorsPool->setAutoUpdateIndicatorStates(false);
     }
 
@@ -533,31 +345,4 @@
 }
 
-void UIMachineWindowNormal::cleanupStatusBar()
-{
-    /* Stop LED-update timer: */
-    m_pIdleTimer->stop();
-    m_pIdleTimer->disconnect(SIGNAL(timeout()), this, SLOT(sltUpdateIndicators()));
-
-    /* Call to base-class: */
-    UIMachineWindow::cleanupStatusBar();
-}
-
-void UIMachineWindowNormal::retranslateUi()
-{
-    /* Call to base-class: */
-    UIMachineWindow::retranslateUi();
-
-    /* Translate host-combo LED: */
-    if (m_pNameHostkey)
-    {
-        m_pNameHostkey->setToolTip(
-            QApplication::translate("UIMachineWindowNormal", "Shows the currently assigned Host key.<br>"
-               "This key, when pressed alone, toggles the keyboard and mouse "
-               "capture state. It can also be used in combination with other keys "
-               "to quickly perform actions from the main menu."));
-        m_pNameHostkey->setText(UIHostCombo::toReadableString(vboxGlobal().settings().hostCombo()));
-    }
-}
-
 bool UIMachineWindowNormal::event(QEvent *pEvent)
 {
@@ -671,36 +456,26 @@
         if (!statusBar()->isHidden())
         {
-            if (uisession()->isPaused() && m_pIdleTimer->isActive())
-                m_pIdleTimer->stop();
-            else if (uisession()->isRunning() && !m_pIdleTimer->isActive())
-                m_pIdleTimer->start(100);
-            sltUpdateIndicators();
-        }
-    }
-    if ((iElement & UIVisualElement_HDStuff) &&
-        indicatorsPool()->indicator(IndicatorType_HardDisks))
-        indicatorsPool()->indicator(IndicatorType_HardDisks)->updateAppearance();
-    if ((iElement & UIVisualElement_CDStuff) &&
-        indicatorsPool()->indicator(IndicatorType_OpticalDisks))
-        indicatorsPool()->indicator(IndicatorType_OpticalDisks)->updateAppearance();
-    if ((iElement & UIVisualElement_FDStuff) &&
-        indicatorsPool()->indicator(IndicatorType_FloppyDisks))
-        indicatorsPool()->indicator(IndicatorType_FloppyDisks)->updateAppearance();
-    if ((iElement & UIVisualElement_NetworkStuff) &&
-        indicatorsPool()->indicator(IndicatorType_Network))
-        indicatorsPool()->indicator(IndicatorType_Network)->updateAppearance();
-    if ((iElement & UIVisualElement_USBStuff) &&
-        indicatorsPool()->indicator(IndicatorType_USB) &&
-        !indicatorsPool()->indicator(IndicatorType_USB)->isHidden())
-        indicatorsPool()->indicator(IndicatorType_USB)->updateAppearance();
-    if ((iElement & UIVisualElement_SharedFolderStuff) &&
-        indicatorsPool()->indicator(IndicatorType_SharedFolders))
-        indicatorsPool()->indicator(IndicatorType_SharedFolders)->updateAppearance();
-    if ((iElement & UIVisualElement_VideoCapture) &&
-        indicatorsPool()->indicator(IndicatorType_VideoCapture))
-        indicatorsPool()->indicator(IndicatorType_VideoCapture)->updateAppearance();
-    if ((iElement & UIVisualElement_FeaturesStuff) &&
-        indicatorsPool()->indicator(IndicatorType_Features))
-        indicatorsPool()->indicator(IndicatorType_Features)->updateAppearance();
+            if (uisession()->isPaused())
+                m_pIndicatorsPool->setAutoUpdateIndicatorStates(false);
+            else if (uisession()->isRunning())
+                m_pIndicatorsPool->setAutoUpdateIndicatorStates(true);
+        }
+    }
+    if (iElement & UIVisualElement_HDStuff)
+        m_pIndicatorsPool->updateAppearance(IndicatorType_HardDisks);
+    if (iElement & UIVisualElement_CDStuff)
+        m_pIndicatorsPool->updateAppearance(IndicatorType_OpticalDisks);
+    if (iElement & UIVisualElement_FDStuff)
+        m_pIndicatorsPool->updateAppearance(IndicatorType_FloppyDisks);
+    if (iElement & UIVisualElement_NetworkStuff)
+        m_pIndicatorsPool->updateAppearance(IndicatorType_Network);
+    if (iElement & UIVisualElement_USBStuff)
+        m_pIndicatorsPool->updateAppearance(IndicatorType_USB);
+    if (iElement & UIVisualElement_SharedFolderStuff)
+        m_pIndicatorsPool->updateAppearance(IndicatorType_SharedFolders);
+    if (iElement & UIVisualElement_VideoCapture)
+        m_pIndicatorsPool->updateAppearance(IndicatorType_VideoCapture);
+    if (iElement & UIVisualElement_FeaturesStuff)
+        m_pIndicatorsPool->updateAppearance(IndicatorType_Features);
 }
 
@@ -716,26 +491,3 @@
 }
 
-void UIMachineWindowNormal::updateIndicatorState(QIStateIndicator *pIndicator, KDeviceType deviceType)
-{
-    /* Do NOT update indicators with NULL state: */
-    if (pIndicator->state() == KDeviceActivity_Null)
-        return;
-
-    /* Paused VM have all indicator states set to IDLE: */
-    bool fPaused = uisession()->isPaused();
-    if (fPaused)
-    {
-        /* If state differs from IDLE => set IDLE one:  */
-        if (pIndicator->state() != KDeviceActivity_Idle)
-            pIndicator->setState(KDeviceActivity_Idle);
-    }
-    else
-    {
-        /* Get current indicator state: */
-        int state = session().GetConsole().GetDeviceActivity(deviceType);
-        /* If state differs => set new one:  */
-        if (pIndicator->state() != state)
-            pIndicator->setState(state);
-    }
-}
-
+
Index: trunk/src/VBox/Frontends/VirtualBox/src/runtime/normal/UIMachineWindowNormal.h
===================================================================
--- trunk/src/VBox/Frontends/VirtualBox/src/runtime/normal/UIMachineWindowNormal.h	(revision 51989)
+++ trunk/src/VBox/Frontends/VirtualBox/src/runtime/normal/UIMachineWindowNormal.h	(revision 51992)
@@ -20,7 +20,4 @@
 #define __UIMachineWindowNormal_h__
 
-/* Global includes: */
-#include <QLabel>
-
 /* Local includes: */
 #include "UIMachineWindow.h"
@@ -29,5 +26,4 @@
 class CMediumAttachment;
 class UIIndicatorsPool;
-class QIStateIndicator;
 
 /* Normal machine-window implementation: */
@@ -58,8 +54,6 @@
     void sltCPUExecutionCapChange();
 
-    /* LED connections: */
-    void sltUpdateIndicators();
-    void sltShowIndicatorsContextMenu(QIStateIndicator *pIndicator, QContextMenuEvent *pEvent);
-    void sltProcessGlobalSettingChange(const char *aPublicName, const char *aName);
+    /** Handles indicator context-menu-request: */
+    void sltHandleIndicatorContextMenuRequest(IndicatorType indicatorType, const QPoint &position);
 
 private:
@@ -77,10 +71,7 @@
     //void cleanupHandlers() {}
     //coid cleanupVisualState() {}
-    void cleanupStatusBar();
+    //void cleanupStatusBar() {}
     //void cleanupMenu() {}
     //void cleanupConsoleConnections() {}
-
-    /* Translate stuff: */
-    void retranslateUi();
 
     /* Show stuff: */
@@ -97,14 +88,10 @@
 
     /* Helpers: */
-    UIIndicatorsPool* indicatorsPool() { return m_pIndicatorsPool; }
     bool isMaximizedChecked();
-    void updateIndicatorState(QIStateIndicator *pIndicator, KDeviceType deviceType);
 
-    /* Widgets: */
+    /** Holds the indicator-pool instance. */
     UIIndicatorsPool *m_pIndicatorsPool;
-    QLabel *m_pNameHostkey;
 
-    /* Variables: */
-    QTimer *m_pIdleTimer;
+    /** Holds current window geometry. */
     QRect m_normalGeometry;
 
Index: trunk/src/VBox/Frontends/VirtualBox/src/selector/UISelectorWindow.cpp
===================================================================
--- trunk/src/VBox/Frontends/VirtualBox/src/selector/UISelectorWindow.cpp	(revision 51989)
+++ trunk/src/VBox/Frontends/VirtualBox/src/selector/UISelectorWindow.cpp	(revision 51992)
@@ -1350,5 +1350,5 @@
 
     /* Add network-manager indicator: */
-    QIStateIndicator *pIndicator = gNetworkManager->indicator();
+    UINetworkManagerIndicator *pIndicator = gNetworkManager->indicator();
     statusBar()->addPermanentWidget(pIndicator);
     pIndicator->updateAppearance();
