Index: /trunk/src/VBox/Frontends/VirtualBox/src/runtime/UIFrameBuffer.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/runtime/UIFrameBuffer.cpp	(revision 54103)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/runtime/UIFrameBuffer.cpp	(revision 54104)
@@ -88,6 +88,7 @@
         prepareConnections();
 
-    /* Resize frame-buffer to default size: */
+    /* Resize/rescale frame-buffer to the default size: */
     performResize(640, 480);
+    performRescale();
 
 #ifdef Q_OS_WIN
@@ -761,8 +762,29 @@
 
     unlock();
-
-    /* Update scaled-size according scale-factor for modes except the 'Scale' one: */
-    if (m_pMachineView->machineLogic()->visualStateType() != UIVisualStateType_Scale)
-        setScaledSize(scaleFactor() == 1.0 ? QSize() : QSize((int)(m_iWidth * scaleFactor()), (int)(m_iHeight * scaleFactor())));
+}
+
+void UIFrameBuffer::performRescale()
+{
+//    printf("UIFrameBuffer::performRescale\n");
+
+    /* Make sure machine-view is assigned: */
+    AssertPtrReturnVoid(m_pMachineView);
+
+    /* Depending on current visual state: */
+    switch (m_pMachineView->machineLogic()->visualStateType())
+    {
+        case UIVisualStateType_Scale:
+            m_scaledSize = m_scaledSize.width() == m_iWidth && m_scaledSize.height() == m_iHeight ? QSize() : m_scaledSize;
+            break;
+        default:
+            m_scaledSize = scaleFactor() == 1.0 ? QSize() : QSize((int)(m_iWidth * scaleFactor()), (int)(m_iHeight * scaleFactor()));
+            break;
+    }
+
+    /* Update coordinate-system: */
+    updateCoordinateSystem();
+
+//    printf("UIFrameBuffer::performRescale: Complete: Scale-factor=%f, Scaled-size=%dx%d\n",
+//           scaleFactor(), scaledSize().width(), scaledSize().height());
 }
 
@@ -776,34 +798,4 @@
 }
 #endif /* VBOX_WITH_VIDEOHWACCEL */
-
-void UIFrameBuffer::setScaleFactor(double dScaleFactor)
-{
-    /* Remember new scale-factor: */
-    m_dScaleFactor = dScaleFactor;
-
-    /* Update scaled-size according scale-factor: */
-    setScaledSize(scaleFactor() == 1.0 ? QSize() : QSize((int)(m_iWidth * scaleFactor()), (int)(m_iHeight * scaleFactor())));
-
-    /* Update coordinate-system: */
-    updateCoordinateSystem();
-}
-
-void UIFrameBuffer::setBackingScaleFactor(double dBackingScaleFactor)
-{
-    /* Remember new backing-scale-factor: */
-    m_dBackingScaleFactor = dBackingScaleFactor;
-
-    /* Update coordinate-system: */
-    updateCoordinateSystem();
-}
-
-void UIFrameBuffer::setUseUnscaledHiDPIOutput(bool fUseUnscaledHiDPIOutput)
-{
-    /* Remember new use-unscaled-HiDPI-output value: */
-    m_fUseUnscaledHiDPIOutput = fUseUnscaledHiDPIOutput;
-
-    /* Update coordinate-system: */
-    updateCoordinateSystem();
-}
 
 void UIFrameBuffer::prepareConnections()
Index: /trunk/src/VBox/Frontends/VirtualBox/src/runtime/UIFrameBuffer.h
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/runtime/UIFrameBuffer.h	(revision 54103)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/runtime/UIFrameBuffer.h	(revision 54104)
@@ -208,4 +208,6 @@
     /** Performs frame-buffer resizing. */
     virtual void performResize(int iWidth, int iHeight);
+    /** Performs frame-buffer rescaling. */
+    virtual void performRescale();
 
 #ifdef VBOX_WITH_VIDEOHWACCEL
@@ -221,15 +223,15 @@
     double scaleFactor() const { return m_dScaleFactor; }
     /** Define the scale-factor used by the frame-buffer. */
-    void setScaleFactor(double dScaleFactor);
+    void setScaleFactor(double dScaleFactor) { m_dScaleFactor = dScaleFactor; }
 
     /** Returns backing-scale-factor used by HiDPI frame-buffer. */
     double backingScaleFactor() const { return m_dBackingScaleFactor; }
     /** Defines backing-scale-factor used by HiDPI frame-buffer. */
-    void setBackingScaleFactor(double dBackingScaleFactor);
+    void setBackingScaleFactor(double dBackingScaleFactor) { m_dBackingScaleFactor = dBackingScaleFactor; }
 
     /** Returns whether frame-buffer should use unscaled HiDPI output. */
     bool useUnscaledHiDPIOutput() const { return m_fUseUnscaledHiDPIOutput; }
     /** Defines whether frame-buffer should use unscaled HiDPI output. */
-    void setUseUnscaledHiDPIOutput(bool fUseUnscaledHiDPIOutput);
+    void setUseUnscaledHiDPIOutput(bool fUseUnscaledHiDPIOutput) { m_fUseUnscaledHiDPIOutput = fUseUnscaledHiDPIOutput; }
 
     /** Return HiDPI frame-buffer optimization type. */
Index: /trunk/src/VBox/Frontends/VirtualBox/src/runtime/UIMachineView.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/runtime/UIMachineView.cpp	(revision 54103)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/runtime/UIMachineView.cpp	(revision 54104)
@@ -183,4 +183,7 @@
     const bool fUseUnscaledHiDPIOutput = gEDataManager->useUnscaledHiDPIOutput(vboxGlobal().managedVMUuid());
     frameBuffer()->setUseUnscaledHiDPIOutput(fUseUnscaledHiDPIOutput);
+
+    /* Perform frame-buffer rescaling: */
+    frameBuffer()->performRescale();
 }
 
@@ -234,5 +237,8 @@
                                    frameBuffer()->height() != (ulong)iHeight;
 
-        /* Adjust 'scale' mode to current machine-view size: */
+        /* Perform frame-buffer mode-change: */
+        frameBuffer()->handleNotifyChange(iWidth, iHeight);
+
+        /* For 'scale' mode: */
         if (visualStateType() == UIVisualStateType_Scale)
         {
@@ -240,10 +246,6 @@
             frameBuffer()->setScaledSize(size());
         }
-
-        /* Perform frame-buffer mode-change: */
-        frameBuffer()->handleNotifyChange(iWidth, iHeight);
-
-        /* Scale-mode doesn't need this.. */
-        if (visualStateType() != UIVisualStateType_Scale)
+        /* For other than 'scale' mode: */
+        else
         {
             /* Adjust maximum-size restriction for machine-view: */
@@ -267,4 +269,7 @@
                 machineWindow()->normalizeGeometry(true /* adjust position */);
         }
+
+        /* Perform frame-buffer rescaling: */
+        frameBuffer()->performRescale();
 
 #ifdef Q_WS_MAC
@@ -362,8 +367,7 @@
                                       (uint32_t)(dScaleFactor * VBOX_OGL_SCALE_FACTOR_MULTIPLIER));
 
-    /* Adjust frame-buffer, machine-window and guest-screen size if necessary: */
-    sltHandleNotifyChange(frameBuffer()->width(), frameBuffer()->height());
-    frameBuffer()->performResize(frameBuffer()->width(), frameBuffer()->height());
-    machineWindow()->normalizeGeometry(true /* adjust position */);
+    /* Handle scale attributes change: */
+    handleScaleChange();
+    /* Adjust guest-screen size: */
     adjustGuestScreenSize();
 
@@ -383,8 +387,7 @@
     frameBuffer()->setUseUnscaledHiDPIOutput(fUseUnscaledHiDPIOutput);
 
-    /* Adjust frame-buffer, machine-window and guest-screen size if necessary: */
-    sltHandleNotifyChange(frameBuffer()->width(), frameBuffer()->height());
-    frameBuffer()->performResize(frameBuffer()->width(), frameBuffer()->height());
-    machineWindow()->normalizeGeometry(true /* adjust position */);
+    /* Handle scale attributes change: */
+    handleScaleChange();
+    /* Adjust guest-screen size: */
     adjustGuestScreenSize();
 
@@ -558,4 +561,7 @@
         m_pFrameBuffer->setUseUnscaledHiDPIOutput(fUseUnscaledHiDPIOutput);
 
+        /* Perform frame-buffer rescaling: */
+        m_pFrameBuffer->performRescale();
+
         /* Associate uisession with frame-buffer finally: */
         uisession()->setFrameBuffer(screenId(), m_pFrameBuffer);
@@ -598,7 +604,10 @@
         }
 
-        /* If we have a valid size, resize the framebuffer. */
+        /* If we have a valid size, resize/rescale the frame-buffer. */
         if (size.width() > 0 && size.height() > 0)
+        {
             frameBuffer()->performResize(size.width(), size.height());
+            frameBuffer()->performRescale();
+        }
     }
 }
@@ -844,4 +853,50 @@
     /* Return size: */
     return size;
+}
+
+void UIMachineView::handleScaleChange()
+{
+    LogRel(("UIMachineView::handleScaleChange: Screen=%d.\n",
+            (unsigned long)m_uScreenId));
+
+    /* If machine-window is visible: */
+    if (uisession()->isScreenVisible(m_uScreenId))
+    {
+        /* For 'scale' mode: */
+        if (visualStateType() == UIVisualStateType_Scale)
+        {
+            /* Assign new frame-buffer logical-size: */
+            frameBuffer()->setScaledSize(size());
+        }
+        /* For other than 'scale' mode: */
+        else
+        {
+            /* Adjust maximum-size restriction for machine-view: */
+            setMaximumSize(sizeHint());
+
+            /* Disable the resize hint override hack: */
+            m_sizeHintOverride = QSize(-1, -1);
+
+            /* Force machine-window update own layout: */
+            QCoreApplication::sendPostedEvents(0, QEvent::LayoutRequest);
+
+            /* Update machine-view sliders: */
+            updateSliders();
+
+            /* By some reason Win host forgets to update machine-window central-widget
+             * after main-layout was updated, let's do it for all the hosts: */
+            machineWindow()->centralWidget()->update();
+
+            /* Normalize 'normal' machine-window geometry: */
+            if (visualStateType() == UIVisualStateType_Normal)
+                machineWindow()->normalizeGeometry(true /* adjust position */);
+        }
+
+        /* Perform frame-buffer rescaling: */
+        frameBuffer()->performRescale();
+    }
+
+    LogRelFlow(("UIMachineView::handleScaleChange: Complete for Screen=%d.\n",
+                (unsigned long)m_uScreenId));
 }
 
@@ -1233,7 +1288,11 @@
             case QEvent::Move:
             {
-                /* Update backing-scale-factor for underlying frame-buffer: */
                 if (m_pFrameBuffer)
+                {
+                    /* Update backing-scale-factor for underlying frame-buffer: */
                     m_pFrameBuffer->setBackingScaleFactor(darwinBackingScaleFactor(machineWindow()));
+                    /* Perform frame-buffer rescaling: */
+                    m_pFrameBuffer->performRescale();
+                }
                 break;
             }
Index: /trunk/src/VBox/Frontends/VirtualBox/src/runtime/UIMachineView.h
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/runtime/UIMachineView.h	(revision 54103)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/runtime/UIMachineView.h	(revision 54104)
@@ -196,4 +196,7 @@
     QSize guestSizeHint();
 
+    /** Handles machine-view scale changes. */
+    void handleScaleChange();
+
     /* Protected setters: */
     /** Store a guest size hint value to extra data, called on switching to
Index: /trunk/src/VBox/Frontends/VirtualBox/src/runtime/scale/UIMachineViewScale.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/runtime/scale/UIMachineViewScale.cpp	(revision 54103)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/runtime/scale/UIMachineViewScale.cpp	(revision 54104)
@@ -66,7 +66,4 @@
     saveMachineViewSettings();
 
-    /* Return scaled-size to 'default' mode: */
-    UIMachineView::applyMachineViewScaleFactor();
-
     /* Cleanup frame buffer: */
     cleanupFrameBuffer();
@@ -76,5 +73,6 @@
 {
     /* Adjust frame-buffer scaled-size: */
-    frameBuffer()->setScaledSize(viewport()->size());
+    frameBuffer()->setScaledSize(size());
+    frameBuffer()->performRescale();
 
     /* If scaled-size is valid: */
@@ -150,4 +148,7 @@
     const bool fUseUnscaledHiDPIOutput = gEDataManager->useUnscaledHiDPIOutput(vboxGlobal().managedVMUuid());
     frameBuffer()->setUseUnscaledHiDPIOutput(fUseUnscaledHiDPIOutput);
+
+    /* Perform frame-buffer rescaling: */
+    frameBuffer()->performRescale();
 }
 
