Index: /trunk/src/VBox/Frontends/VirtualBox/src/runtime/UIMachineView.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/runtime/UIMachineView.cpp	(revision 58010)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/runtime/UIMachineView.cpp	(revision 58011)
@@ -218,11 +218,16 @@
     frameBuffer()->performRescale();
 
-    // TODO: How to make it work?
+    /* Update console's display viewport and 3D overlay: */
+    updateViewport();
+}
+
+double UIMachineView::aspectRatio() const
+{
+    return frameBuffer() ? (double)(frameBuffer()->width()) / frameBuffer()->height() : 0;
+}
+
+void UIMachineView::updateViewport()
+{
     display().ViewportChanged(screenId(), contentsX(), contentsY(), visibleWidth(), visibleHeight());
-}
-
-double UIMachineView::aspectRatio() const
-{
-    return frameBuffer() ? (double)(frameBuffer()->width()) / frameBuffer()->height() : 0;
 }
 
@@ -426,6 +431,6 @@
     viewport()->update();
 
-    // TODO: How to make it work?
-    display().ViewportChanged(screenId(), contentsX(), contentsY(), visibleWidth(), visibleHeight());
+    /* Update console's display viewport and 3D overlay: */
+    updateViewport();
 }
 
@@ -480,6 +485,6 @@
     viewport()->update();
 
-    // TODO: How to make it work?
-    display().ViewportChanged(screenId(), contentsX(), contentsY(), visibleWidth(), visibleHeight());
+    /* Update console's display viewport and 3D overlay: */
+    updateViewport();
 }
 
@@ -554,4 +559,7 @@
     , m_pFrameBuffer(0)
     , m_previousState(KMachineState_Null)
+#ifdef Q_WS_MAC
+    , m_iHostScreenNumber(0)
+#endif /* Q_WS_MAC */
     , m_maxGuestSizePolicy(MaxGuestSizePolicy_Invalid)
     , m_u64MaxGuestSize(0)
@@ -1241,7 +1249,6 @@
     QAbstractScrollArea::scrollContentsBy(dx, dy);
 
-    display().ViewportChanged(screenId(),
-                              contentsX(), contentsY(),
-                              visibleWidth(), visibleHeight());
+    /* Update console's display viewport and 3D overlay: */
+    updateViewport();
 }
 
@@ -1342,7 +1349,6 @@
                     m_pFrameBuffer->viewportResized(pResizeEvent);
 #endif /* VBOX_WITH_VIDEOHWACCEL */
-                display().ViewportChanged(screenId(),
-                                          contentsX(), contentsY(),
-                                          visibleWidth(), visibleHeight());
+                /* Update console's display viewport and 3D overlay: */
+                updateViewport();
                 break;
             }
@@ -1358,10 +1364,6 @@
             case QEvent::Move:
             {
-                /* In some cases viewport resize-events can provoke the
-                 * machine-view position changes inside the machine-window.
-                 * We have to notify interested listeners like 3D service. */
-                display().ViewportChanged(screenId(),
-                                          contentsX(), contentsY(),
-                                          visibleWidth(), visibleHeight());
+                /* Update console's display viewport and 3D overlay: */
+                updateViewport();
                 break;
             }
@@ -1394,10 +1396,22 @@
             case QEvent::Move:
             {
-                if (m_pFrameBuffer)
+                /* Get current host-screen number: */
+                const int iCurrentHostScreenNumber = vboxGlobal().screenNumber(this);
+                if (m_iHostScreenNumber != iCurrentHostScreenNumber)
                 {
-                    /* Update backing-scale-factor for underlying frame-buffer: */
-                    m_pFrameBuffer->setBackingScaleFactor(darwinBackingScaleFactor(machineWindow()));
-                    /* Perform frame-buffer rescaling: */
-                    m_pFrameBuffer->performRescale();
+                    /* Recache current host screen: */
+                    m_iHostScreenNumber = iCurrentHostScreenNumber;
+
+                    /* Update frame-buffer arguments: */
+                    if (m_pFrameBuffer)
+                    {
+                        /* Update backing-scale-factor for underlying frame-buffer: */
+                        m_pFrameBuffer->setBackingScaleFactor(darwinBackingScaleFactor(machineWindow()));
+                        /* Perform frame-buffer rescaling: */
+                        m_pFrameBuffer->performRescale();
+                    }
+
+                    /* Update console's display viewport and 3D overlay: */
+                    updateViewport();
                 }
                 break;
Index: /trunk/src/VBox/Frontends/VirtualBox/src/runtime/UIMachineView.h
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/runtime/UIMachineView.h	(revision 58010)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/runtime/UIMachineView.h	(revision 58011)
@@ -108,4 +108,8 @@
     double aspectRatio() const;
 
+    /** Updates console's display viewport.
+      * @remarks Used to update 3D-service overlay viewport as well. */
+    void updateViewport();
+
 protected slots:
 
@@ -181,5 +185,5 @@
     /** Returns the session's console reference. */
     CConsole& console() const;
-    /** Returns the display's display reference. */
+    /** Returns the console's display reference. */
     CDisplay& display() const;
     /** Returns the console's guest reference. */
@@ -349,4 +353,9 @@
     QSize m_sizeHintOverride;
 
+#ifdef Q_WS_MAC
+    /** Holds current host-screen number. */
+    int m_iHostScreenNumber;
+#endif /* Q_WS_MAC */
+
     /** The policy for calculating the maximum guest resolution which we wish
      * to handle. */
Index: /trunk/src/VBox/Frontends/VirtualBox/src/runtime/fullscreen/UIMachineWindowFullscreen.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/runtime/fullscreen/UIMachineWindowFullscreen.cpp	(revision 58010)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/runtime/fullscreen/UIMachineWindowFullscreen.cpp	(revision 58011)
@@ -82,4 +82,6 @@
         LogRel(("UIMachineWindowFullscreen::handleNativeNotification: "
                 "Native fullscreen mode entered, notifying listener...\n"));
+        /* Update console's display viewport and 3D overlay: */
+        machineView()->updateViewport();
         emit sigNotifyAboutNativeFullscreenDidEnter();
     }
@@ -98,4 +100,6 @@
         LogRel(("UIMachineWindowFullscreen::handleNativeNotification: "
                 "Native fullscreen mode exited, notifying listener...\n"));
+        /* Update console's display viewport and 3D overlay: */
+        machineView()->updateViewport();
         emit sigNotifyAboutNativeFullscreenDidExit();
     }
Index: /trunk/src/VBox/Frontends/VirtualBox/src/runtime/scale/UIMachineViewScale.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/runtime/scale/UIMachineViewScale.cpp	(revision 58010)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/runtime/scale/UIMachineViewScale.cpp	(revision 58011)
@@ -146,6 +146,6 @@
     frameBuffer()->performRescale();
 
-    // TODO: How to make it work?
-    display().ViewportChanged(screenId(), contentsX(), contentsY(), visibleWidth(), visibleHeight());
+    /* Update console's display viewport and 3D overlay: */
+    updateViewport();
 }
 
