Index: /trunk/src/VBox/Frontends/VirtualBox/src/runtime/UIActionPoolRuntime.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/runtime/UIActionPoolRuntime.cpp	(revision 71614)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/runtime/UIActionPoolRuntime.cpp	(revision 71615)
@@ -23,11 +23,8 @@
 # include "UIActionPoolRuntime.h"
 # include "UIDesktopWidgetWatchdog.h"
-# include "UIMultiScreenLayout.h"
 # include "UIExtraDataManager.h"
 # include "UIShortcutPool.h"
-# include "UIFrameBuffer.h"
 # include "UIConverter.h"
 # include "UIIconPool.h"
-# include "UISession.h"
 # include "VBoxGlobal.h"
 
@@ -2047,50 +2044,44 @@
 UIActionPoolRuntime::UIActionPoolRuntime(bool fTemporary /* = false */)
     : UIActionPool(UIActionPoolType_Runtime, fTemporary)
-    , m_pSession(0)
-    , m_pMultiScreenLayout(0)
-{
-}
-
-void UIActionPoolRuntime::setSession(UISession *pSession)
-{
-    m_pSession = pSession;
+    , m_cHostScreens(0)
+    , m_cGuestScreens(0)
+    , m_fGuestSupportsGraphics(false)
+{
+}
+
+void UIActionPoolRuntime::setHostScreenCount(int cCount)
+{
+    m_cHostScreens = cCount;
     m_invalidations << UIActionIndexRT_M_View << UIActionIndexRT_M_ViewPopup;
 }
 
-void UIActionPoolRuntime::setMultiScreenLayout(UIMultiScreenLayout *pMultiScreenLayout)
-{
-    /* Do not allow NULL pointers: */
-    AssertPtrReturnVoid(pMultiScreenLayout);
-
-    /* Assign new multi-screen layout: */
-    m_pMultiScreenLayout = pMultiScreenLayout;
-
-    /* Connect new stuff: */
-    connect(this, SIGNAL(sigNotifyAboutTriggeringViewScreenRemap(int, int)),
-            m_pMultiScreenLayout, SLOT(sltHandleScreenLayoutChange(int, int)));
-    connect(m_pMultiScreenLayout, SIGNAL(sigScreenLayoutUpdate()),
-            this, SLOT(sltHandleScreenLayoutUpdate()));
-
-    /* Invalidate View menu: */
-    m_invalidations << UIActionIndexRT_M_View;
-}
-
-void UIActionPoolRuntime::unsetMultiScreenLayout(UIMultiScreenLayout *pMultiScreenLayout)
-{
-    /* Do not allow NULL pointers: */
-    AssertPtrReturnVoid(pMultiScreenLayout);
-
-    /* Disconnect old stuff: */
-    disconnect(this, SIGNAL(sigNotifyAboutTriggeringViewScreenRemap(int, int)),
-               pMultiScreenLayout, SLOT(sltHandleScreenLayoutChange(int, int)));
-    disconnect(pMultiScreenLayout, SIGNAL(sigScreenLayoutUpdate()),
-               this, SLOT(sltHandleScreenLayoutUpdate()));
-
-    /* Unset old multi-screen layout: */
-    if (m_pMultiScreenLayout == pMultiScreenLayout)
-        m_pMultiScreenLayout = 0;
-
-    /* Invalidate View menu: */
-    m_invalidations << UIActionIndexRT_M_View;
+void UIActionPoolRuntime::setGuestScreenCount(int cCount)
+{
+    m_cGuestScreens = cCount;
+    m_invalidations << UIActionIndexRT_M_View << UIActionIndexRT_M_ViewPopup;
+}
+
+void UIActionPoolRuntime::setGuestScreenSize(int iGuestScreen, const QSize &size)
+{
+    m_mapGuestScreenSize[iGuestScreen] = size;
+    m_invalidations << UIActionIndexRT_M_View << UIActionIndexRT_M_ViewPopup;
+}
+
+void UIActionPoolRuntime::setGuestScreenVisible(int iGuestScreen, bool fVisible)
+{
+    m_mapGuestScreenIsVisible[iGuestScreen] = fVisible;
+    m_invalidations << UIActionIndexRT_M_View << UIActionIndexRT_M_ViewPopup;
+}
+
+void UIActionPoolRuntime::setGuestSupportsGraphics(bool fSupports)
+{
+    m_fGuestSupportsGraphics = fSupports;
+    m_invalidations << UIActionIndexRT_M_View << UIActionIndexRT_M_ViewPopup;
+}
+
+void UIActionPoolRuntime::setHostScreenForGuestScreenMap(const QMap<int, int> &map)
+{
+    m_mapHostScreenForGuestScreen = map;
+    m_invalidations << UIActionIndexRT_M_View << UIActionIndexRT_M_ViewPopup;
 }
 
@@ -2239,10 +2230,4 @@
     const int iHostScreenIndex = pAction->property("Host Screen Index").toInt();
     emit sigNotifyAboutTriggeringViewScreenRemap(iGuestScreenIndex, iHostScreenIndex);
-}
-
-void UIActionPoolRuntime::sltHandleScreenLayoutUpdate()
-{
-    /* Invalidate View menu: */
-    m_invalidations << UIActionIndexRT_M_View;
 }
 
@@ -2653,7 +2638,7 @@
     const bool fAllowToShowActionResize = isAllowedInMenuView(UIExtraDataMetaDefs::RuntimeMenuViewActionType_Resize);
     const bool fAllowToShowActionMultiscreen = isAllowedInMenuView(UIExtraDataMetaDefs::RuntimeMenuViewActionType_Multiscreen);
-    if (fAllowToShowActionResize && uisession())
-    {
-        for (int iGuestScreenIndex = 0; iGuestScreenIndex < uisession()->frameBuffers().size(); ++iGuestScreenIndex)
+    if (fAllowToShowActionResize)
+    {
+        for (int iGuestScreenIndex = 0; iGuestScreenIndex < m_cGuestScreens; ++iGuestScreenIndex)
         {
             /* Add 'Virtual Screen %1' menu: */
@@ -2665,10 +2650,10 @@
         }
     }
-    else if (fAllowToShowActionMultiscreen && multiScreenLayout())
+    else if (fAllowToShowActionMultiscreen)
     {
         /* Only for multi-screen host case: */
-        if (uisession()->hostScreens().size() > 1)
+        if (m_cHostScreens > 1)
         {
-            for (int iGuestScreenIndex = 0; iGuestScreenIndex < uisession()->frameBuffers().size(); ++iGuestScreenIndex)
+            for (int iGuestScreenIndex = 0; iGuestScreenIndex < m_cGuestScreens; ++iGuestScreenIndex)
             {
                 /* Add 'Virtual Screen %1' menu: */
@@ -2715,7 +2700,7 @@
     /* Do we have to show resize menu? */
     const bool fAllowToShowActionResize = isAllowedInMenuView(UIExtraDataMetaDefs::RuntimeMenuViewActionType_Resize);
-    if (fAllowToShowActionResize && uisession())
-    {
-        for (int iGuestScreenIndex = 0; iGuestScreenIndex < uisession()->frameBuffers().size(); ++iGuestScreenIndex)
+    if (fAllowToShowActionResize)
+    {
+        for (int iGuestScreenIndex = 0; iGuestScreenIndex < m_cGuestScreens; ++iGuestScreenIndex)
         {
             /* Add 'Virtual Screen %1' menu: */
@@ -2882,7 +2867,4 @@
 void UIActionPoolRuntime::updateMenuViewScreen(QMenu *pMenu)
 {
-    /* Make sure UI session defined: */
-    AssertPtrReturnVoid(uisession());
-
     /* Clear contents: */
     pMenu->clear();
@@ -2905,7 +2887,6 @@
     /* Get corresponding screen index and frame-buffer size: */
     const int iGuestScreenIndex = pMenu->property("Guest Screen Index").toInt();
-    const UIFrameBuffer* pFrameBuffer = uisession()->frameBuffer(iGuestScreenIndex);
-    const QSize screenSize = QSize(pFrameBuffer->width(), pFrameBuffer->height());
-    const bool fScreenEnabled = uisession()->isScreenVisible(iGuestScreenIndex);
+    const QSize screenSize = m_mapGuestScreenSize.value(iGuestScreenIndex);
+    const bool fScreenEnabled = m_mapGuestScreenIsVisible.value(iGuestScreenIndex);
 
     /* For non-primary screens: */
@@ -2918,5 +2899,5 @@
         {
             /* Configure 'toggle' action: */
-            pToggleAction->setEnabled(uisession()->isGuestSupportsGraphics());
+            pToggleAction->setEnabled(m_fGuestSupportsGraphics);
             pToggleAction->setProperty("Guest Screen Index", iGuestScreenIndex);
             pToggleAction->setCheckable(true);
@@ -2942,5 +2923,5 @@
             {
                 /* Configure exclusive 'resize' action: */
-                pAction->setEnabled(uisession()->isGuestSupportsGraphics() && fScreenEnabled);
+                pAction->setEnabled(m_fGuestSupportsGraphics && fScreenEnabled);
                 pAction->setProperty("Guest Screen Index", iGuestScreenIndex);
                 pAction->setProperty("Requested Size", size);
@@ -2961,7 +2942,4 @@
 void UIActionPoolRuntime::updateMenuViewMultiscreen(QMenu *pMenu)
 {
-    /* Make sure UI session defined: */
-    AssertPtrReturnVoid(multiScreenLayout());
-
     /* Clear contents: */
     pMenu->clear();
@@ -2976,7 +2954,8 @@
         /* Configure exclusive action-group: */
         pActionGroup->setExclusive(true);
-        for (int iHostScreenIndex = 0; iHostScreenIndex < uisession()->hostScreens().size(); ++iHostScreenIndex)
+        for (int iHostScreenIndex = 0; iHostScreenIndex < m_cHostScreens; ++iHostScreenIndex)
         {
-            QAction *pAction = pActionGroup->addAction(UIMultiScreenLayout::tr("Use Host Screen %1")
+            QAction *pAction = pActionGroup->addAction(QApplication::translate("UIMultiScreenLayout",
+                                                                               "Use Host Screen %1")
                                                                                .arg(iHostScreenIndex + 1));
             AssertPtrReturnVoid(pAction);
@@ -2985,6 +2964,6 @@
                 pAction->setProperty("Guest Screen Index", iGuestScreenIndex);
                 pAction->setProperty("Host Screen Index", iHostScreenIndex);
-                if (multiScreenLayout()->hasHostScreenForGuestScreen(iGuestScreenIndex) &&
-                    multiScreenLayout()->hostScreenForGuestScreen(iGuestScreenIndex) == iHostScreenIndex)
+                if (m_mapHostScreenForGuestScreen.contains(iGuestScreenIndex) &&
+                    m_mapHostScreenForGuestScreen.value(iGuestScreenIndex) == iHostScreenIndex)
                     pAction->setChecked(true);
             }
Index: /trunk/src/VBox/Frontends/VirtualBox/src/runtime/UIActionPoolRuntime.h
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/runtime/UIActionPoolRuntime.h	(revision 71614)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/runtime/UIActionPoolRuntime.h	(revision 71615)
@@ -28,6 +28,6 @@
 
 /* Forward declarations: */
-class UISession;
-class UIMultiScreenLayout;
+class QSize;
+
 
 /** Runtime action-pool index enum.
@@ -152,18 +152,19 @@
 public:
 
-    /** Defines UI session object reference.
-      * @note For menus which uses it to build contents. */
-    void setSession(UISession *pSession);
-    /** Returns UI session object reference. */
-    UISession* uisession() const { return m_pSession; }
-
-    /** Defines UI multi-screen layout object reference.
-      * @note For menus which uses it to build contents. */
-    void setMultiScreenLayout(UIMultiScreenLayout *pMultiScreenLayout);
-    /** Undefines UI multi-screen layout object reference.
-      * @note For menus which uses it to build contents. */
-    void unsetMultiScreenLayout(UIMultiScreenLayout *pMultiScreenLayout);
-    /** Returns UI multi-screen layout object reference. */
-    UIMultiScreenLayout* multiScreenLayout() const { return m_pMultiScreenLayout; }
+    /** Defines host-screen @a cCount. */
+    void setHostScreenCount(int cCount);
+    /** Defines guest-screen @a cCount. */
+    void setGuestScreenCount(int cCount);
+
+    /** Defines @a iGuestScreen @a size. */
+    void setGuestScreenSize(int iGuestScreen, const QSize &size);
+    /** Defines whether @a iGuestScreen is @a fVisible. */
+    void setGuestScreenVisible(int iGuestScreen, bool fVisible);
+
+    /** Defines whether guest supports graphics. */
+    void setGuestSupportsGraphics(bool fSupports);
+
+    /** Defines host-to-guest mapping scheme. */
+    void setHostScreenForGuestScreenMap(const QMap<int, int> &map);
 
     /** Returns whether the action with passed @a type is allowed in the 'Machine' menu. */
@@ -213,7 +214,4 @@
     /** Handles 'View' : 'Virtual Screen #' menu : 'Remap' @a pAction trigger. */
     void sltHandleActionTriggerViewScreenRemap(QAction *pAction);
-
-    /** Handles screen-layout update. */
-    void sltHandleScreenLayoutUpdate();
 
 protected:
@@ -288,8 +286,19 @@
 private:
 
-    /** Holds the UI session object reference. */
-    UISession *m_pSession;
-    /** Holds the UI multi-screen layout object reference. */
-    UIMultiScreenLayout *m_pMultiScreenLayout;
+    /** Holds the host-screen count. */
+    int m_cHostScreens;
+    /** Holds the guest-screen count. */
+    int m_cGuestScreens;
+
+    /** Holds the map of guest-screen sizes. */
+    QMap<int, QSize> m_mapGuestScreenSize;
+    /** Holds the map of guest-screen visibility states. */
+    QMap<int, bool>  m_mapGuestScreenIsVisible;
+
+    /** Holds whether guest supports graphics. */
+    bool m_fGuestSupportsGraphics;
+
+    /** Holds the host-to-guest mapping scheme. */
+    QMap<int, int>  m_mapHostScreenForGuestScreen;
 
     /** Holds the list of Runtime UI main menus. */
Index: /trunk/src/VBox/Frontends/VirtualBox/src/runtime/UIFrameBuffer.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/runtime/UIFrameBuffer.cpp	(revision 71614)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/runtime/UIFrameBuffer.cpp	(revision 71615)
@@ -25,4 +25,6 @@
 # include <QTransform>
 /* GUI includes: */
+# include "UIActionPool.h"
+# include "UIActionPoolRuntime.h"
 # include "UIFrameBuffer.h"
 # include "UISession.h"
@@ -1261,4 +1263,8 @@
 
     unlock();
+
+    /* Make sure action-pool knows frame-buffer size: */
+    m_pMachineView->uisession()->actionPool()->toRuntime()->setGuestScreenSize(m_pMachineView->screenId(),
+                                                                               QSize(m_iWidth, m_iHeight));
 }
 
Index: /trunk/src/VBox/Frontends/VirtualBox/src/runtime/UIMultiScreenLayout.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/runtime/UIMultiScreenLayout.cpp	(revision 71614)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/runtime/UIMultiScreenLayout.cpp	(revision 71615)
@@ -54,4 +54,7 @@
     calculateHostMonitorCount();
     calculateGuestScreenCount();
+
+    /* Prpeare connections: */
+    prepareConnections();
 }
 
@@ -170,6 +173,6 @@
     }
 
-    /* Notifies about layout update: */
-    emit sigScreenLayoutUpdate();
+    /* Make sure action-pool knows whether multi-screen layout has host-screen for guest-screen: */
+    m_pMachineLogic->actionPool()->toRuntime()->setHostScreenForGuestScreenMap(m_screenMap);
 
     LogRelFlow(("UIMultiScreenLayout::update: Finished!\n"));
@@ -249,4 +252,7 @@
     m_screenMap = tmpMap;
 
+    /* Make sure action-pool knows whether multi-screen layout has host-screen for guest-screen: */
+    m_pMachineLogic->actionPool()->toRuntime()->setHostScreenForGuestScreenMap(m_screenMap);
+
     /* Save guest-to-host mapping: */
     saveScreenMapping();
@@ -271,4 +277,11 @@
         else
             m_disabledGuestScreens << iGuestScreen;
+}
+
+void UIMultiScreenLayout::prepareConnections()
+{
+    /* Connect action-pool: */
+    connect(m_pMachineLogic->actionPool()->toRuntime(), &UIActionPoolRuntime::sigNotifyAboutTriggeringViewScreenRemap,
+            this, &UIMultiScreenLayout::sltHandleScreenLayoutChange);
 }
 
Index: /trunk/src/VBox/Frontends/VirtualBox/src/runtime/UIMultiScreenLayout.h
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/runtime/UIMultiScreenLayout.h	(revision 71614)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/runtime/UIMultiScreenLayout.h	(revision 71615)
@@ -35,6 +35,4 @@
 signals:
 
-    /** Notifies about layout update. */
-    void sigScreenLayoutUpdate();
     /** Notifies about layout change. */
     void sigScreenLayoutChange();
@@ -66,4 +64,5 @@
     void calculateHostMonitorCount();
     void calculateGuestScreenCount();
+    void prepareConnections();
 
     /* Other helpers: */
Index: /trunk/src/VBox/Frontends/VirtualBox/src/runtime/UISession.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/runtime/UISession.cpp	(revision 71614)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/runtime/UISession.cpp	(revision 71615)
@@ -896,4 +896,7 @@
         m_fIsGuestSupportsGraphics = fIsGuestSupportsGraphics;
         m_fIsGuestSupportsSeamless = fIsGuestSupportsSeamless;
+
+        /* Make sure action-pool knows whether GA supports graphics: */
+        actionPool()->toRuntime()->setGuestSupportsGraphics(m_fIsGuestSupportsGraphics);
 
         /* Notify listeners about GA state really changed: */
@@ -1062,7 +1065,4 @@
     AssertPtrReturnVoid(actionPool());
     {
-        /* Configure action-pool: */
-        actionPool()->toRuntime()->setSession(this);
-
         /* Update action restrictions: */
         updateActionRestrictions();
@@ -1230,10 +1230,12 @@
     }
 
-    /* Prepare initial screen visibility status of host-desires.
-     * This is mostly dummy initialization as host-desires should get updated later in multi-screen layout.
-     * By default making host-desires same as facts. */
+    /* Prepare initial screen visibility status of host-desires (same as facts): */
     m_monitorVisibilityVectorHostDesires.resize(machine().GetMonitorCount());
     for (int iScreenIndex = 0; iScreenIndex < m_monitorVisibilityVector.size(); ++iScreenIndex)
         m_monitorVisibilityVectorHostDesires[iScreenIndex] = m_monitorVisibilityVector[iScreenIndex];
+
+    /* Make sure action-pool knows guest-screen visibility status: */
+    for (int iScreenIndex = 0; iScreenIndex < m_monitorVisibilityVector.size(); ++iScreenIndex)
+        actionPool()->toRuntime()->setGuestScreenVisible(iScreenIndex, m_monitorVisibilityVector.at(iScreenIndex));
 }
 
@@ -1242,4 +1244,7 @@
     /* Each framebuffer will be really prepared on first UIMachineView creation: */
     m_frameBufferVector.resize(machine().GetMonitorCount());
+
+    /* Make sure action-pool knows guest-screen count: */
+    actionPool()->toRuntime()->setGuestScreenCount(m_frameBufferVector.size());
 }
 
@@ -1368,4 +1373,7 @@
     }
     m_frameBufferVector.clear();
+
+    /* Make sure action-pool knows guest-screen count: */
+    actionPool()->toRuntime()->setGuestScreenCount(m_frameBufferVector.size());
 }
 
@@ -2070,4 +2078,7 @@
     /* Remember 'desired' visibility status: */
     gEDataManager->setLastGuestScreenVisibilityStatus(uScreenId, fIsMonitorVisible, vboxGlobal().managedVMUuid());
+
+    /* Make sure action-pool knows guest-screen visibility status: */
+    actionPool()->toRuntime()->setGuestScreenVisible(uScreenId, fIsMonitorVisible);
 }
 
@@ -2135,7 +2146,11 @@
 void UISession::updateHostScreenData()
 {
+    /* Rebuild host-screen data vector: */
     m_hostScreens.clear();
     for (int iScreenIndex = 0; iScreenIndex < gpDesktop->screenCount(); ++iScreenIndex)
         m_hostScreens << gpDesktop->screenGeometry(iScreenIndex);
+
+    /* Make sure action-pool knows host-screen count: */
+    actionPool()->toRuntime()->setHostScreenCount(m_hostScreens.size());
 }
 
Index: /trunk/src/VBox/Frontends/VirtualBox/src/runtime/fullscreen/UIMachineLogicFullscreen.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/runtime/fullscreen/UIMachineLogicFullscreen.cpp	(revision 71614)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/runtime/fullscreen/UIMachineLogicFullscreen.cpp	(revision 71615)
@@ -55,5 +55,4 @@
     /* Create multiscreen layout: */
     m_pScreenLayout = new UIMultiScreenLayout(this);
-    actionPool()->toRuntime()->setMultiScreenLayout(m_pScreenLayout);
 }
 
@@ -61,5 +60,4 @@
 {
     /* Delete multiscreen layout: */
-    actionPool()->toRuntime()->unsetMultiScreenLayout(m_pScreenLayout);
     delete m_pScreenLayout;
 }
Index: /trunk/src/VBox/Frontends/VirtualBox/src/runtime/seamless/UIMachineLogicSeamless.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/runtime/seamless/UIMachineLogicSeamless.cpp	(revision 71614)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/runtime/seamless/UIMachineLogicSeamless.cpp	(revision 71615)
@@ -52,5 +52,4 @@
     /* Create multiscreen layout: */
     m_pScreenLayout = new UIMultiScreenLayout(this);
-    actionPool()->toRuntime()->setMultiScreenLayout(m_pScreenLayout);
 }
 
@@ -58,5 +57,4 @@
 {
     /* Delete multiscreen layout: */
-    actionPool()->toRuntime()->unsetMultiScreenLayout(m_pScreenLayout);
     delete m_pScreenLayout;
 }
