Index: /trunk/src/VBox/Frontends/VirtualBox/src/runtime/UIMachineView.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/runtime/UIMachineView.cpp	(revision 31340)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/runtime/UIMachineView.cpp	(revision 31341)
@@ -150,20 +150,11 @@
         case KMachineState_TeleportingPausedVM:
         {
-            if (vboxGlobal().vmRenderMode() != VBoxDefs::TimerMode &&  m_pFrameBuffer &&
-                (state != KMachineState_TeleportingPausedVM || m_previousState != KMachineState_Teleporting))
-            {
-                /* Take a screen snapshot. Note that TakeScreenShot() always needs a 32bpp image: */
-                QImage shot = QImage(m_pFrameBuffer->width(), m_pFrameBuffer->height(), QImage::Format_RGB32);
-                /* If TakeScreenShot fails or returns no image, just show a black image. */
-                shot.fill(0);
-                CDisplay dsp = session().GetConsole().GetDisplay();
-                dsp.TakeScreenShot(screenId(), shot.bits(), shot.width(), shot.height());
-                /* TakeScreenShot() may fail if, e.g. the Paused notification was delivered
-                 * after the machine execution was resumed. It's not fatal: */
-                if (dsp.isOk())
-                {
-                    dimImage(shot);
-                }
-                m_pauseShot = QPixmap::fromImage(shot);
+            if (   vboxGlobal().vmRenderMode() != VBoxDefs::TimerMode
+                && m_pFrameBuffer
+                &&
+                (   state           != KMachineState_TeleportingPausedVM
+                 || m_previousState != KMachineState_Teleporting))
+            {
+                takePauseShotLive();
                 /* Fully repaint to pick up m_pauseShot: */
                 viewport()->update();
@@ -171,4 +162,17 @@
             break;
         }
+#ifdef VBOX_TEST_IMAGE_ON_RESTORE
+        case KMachineState_Restoring:
+        {
+            /* Only works with the primary screen currently. */
+            if (screenId() == 0)
+            {
+                takePauseShotSnapshot();
+                /* Fully repaint to pick up m_pauseShot: */
+                viewport()->update();
+            }
+            break;
+        }
+#endif
         case KMachineState_Running:
         {
@@ -180,5 +184,5 @@
                 {
                     /* Reset the pixmap to free memory: */
-                    m_pauseShot = QPixmap();
+                    resetPauseShot();
                     /* Ask for full guest display update (it will also update
                      * the viewport through IFramebuffer::NotifyUpdate): */
@@ -192,4 +196,5 @@
             break;
     }
+
     m_previousState = state;
 }
@@ -379,4 +384,28 @@
     }
 
+#ifdef VBOX_TEST_IMAGE_ON_RESTORE
+    QSize size;
+#ifdef Q_WS_X11
+    /* Processing pseudo resize-event to synchronize frame-buffer with stored
+     * framebuffer size. On X11 this will be additional done when the machine
+     * state was 'saved'. */
+    if (session().GetMachine().GetState() == KMachineState_Saved)
+        QSize size = guestSizeHint();
+#endif /* Q_WS_X11 */
+    /* If there is a preview image saved, we will resize the framebuffer to the
+     * size of that image. */
+    ULONG buffer = 0, width = 0, height = 0;
+    CMachine machine = session().GetMachine();
+    machine.QuerySavedScreenshotPNGSize(0, buffer, width, height);
+    if (buffer > 0)
+        size = guestSizeHint();
+    /* If we have a valid size, resize the framebuffer. */
+    if (   size.width() > 0
+        && size.height() > 0)
+    {
+        UIResizeEvent event(FramebufferPixelFormat_Opaque, NULL, 0, 0, size.width(), size.height());
+        frameBuffer()->resizeEvent(&event);
+    }
+#else
 #ifdef Q_WS_X11
     /* Processing pseudo resize-event to synchronize frame-buffer
@@ -389,4 +418,5 @@
     }
 #endif /* Q_WS_X11 */
+#endif
 }
 
@@ -630,4 +660,32 @@
     QString strValue = QString("%1,%2").arg(sizeHint.width()).arg(sizeHint.height());
     machine.SetExtraData(strKey, strValue);
+}
+
+void UIMachineView::takePauseShotLive()
+{
+    /* Take a screen snapshot. Note that TakeScreenShot() always needs a 32bpp image: */
+    QImage shot = QImage(m_pFrameBuffer->width(), m_pFrameBuffer->height(), QImage::Format_RGB32);
+    /* If TakeScreenShot fails or returns no image, just show a black image. */
+    shot.fill(0);
+    CDisplay dsp = session().GetConsole().GetDisplay();
+    dsp.TakeScreenShot(screenId(), shot.bits(), shot.width(), shot.height());
+    /* TakeScreenShot() may fail if, e.g. the Paused notification was delivered
+     * after the machine execution was resumed. It's not fatal: */
+    if (dsp.isOk())
+        dimImage(shot);
+    m_pauseShot = QPixmap::fromImage(shot);
+}
+
+void UIMachineView::takePauseShotSnapshot()
+{
+    CMachine machine = session().GetMachine();
+    ULONG width = 0, height = 0;
+    QVector<BYTE> screenData = machine.ReadSavedScreenshotPNGToArray(0, width, height);
+    if (screenData.size() != 0)
+    {
+        QImage shot = QImage::fromData(screenData.data(), screenData.size(), "PNG").scaled(guestSizeHint());
+        dimImage(shot);
+        m_pauseShot = QPixmap::fromImage(shot);
+    }
 }
 
@@ -885,5 +943,5 @@
         viewport()->setAttribute(Qt::WA_PaintOnScreen, false);
         QPainter pnt(viewport());
-        pnt.drawPixmap(r.x(), r.y(), m_pauseShot, r.x() + contentsX(), r.y() + contentsY(), r.width(), r.height());
+        pnt.drawPixmap(r, m_pauseShot, QRect(r.x() + contentsX(), r.y() + contentsY(), r.width(), r.height()));
         /* Restore the attribute to its previous state: */
         viewport()->setAttribute(Qt::WA_PaintOnScreen, paintOnScreen);
@@ -953,3 +1011,2 @@
 
 #endif
-
Index: /trunk/src/VBox/Frontends/VirtualBox/src/runtime/UIMachineView.h
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/runtime/UIMachineView.h	(revision 31340)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/runtime/UIMachineView.h	(revision 31341)
@@ -130,4 +130,7 @@
 
     /* Protected helpers: */
+    virtual void takePauseShotLive();
+    virtual void takePauseShotSnapshot();
+    virtual void resetPauseShot() { m_pauseShot = QPixmap(); }
     virtual QRect workingArea() = 0;
     virtual void calculateDesktopGeometry() = 0;
Index: /trunk/src/VBox/Frontends/VirtualBox/src/runtime/scale/UIMachineViewScale.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/runtime/scale/UIMachineViewScale.cpp	(revision 31340)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/runtime/scale/UIMachineViewScale.cpp	(revision 31341)
@@ -47,5 +47,5 @@
 #endif
                     )
-    , m_fShouldWeDoScale(false)
+    , m_pPauseImage(0)
 {
     /* Load machine view settings: */
@@ -83,22 +83,52 @@
 }
 
-void UIMachineViewScale::sltMachineStateChanged()
-{
-    /* Base-class processing: */
-    UIMachineView::sltMachineStateChanged();
-
-    /* Get machine state: */
-    KMachineState state = uisession()->machineState();
-    switch (state)
-    {
-        case KMachineState_Paused:
-        case KMachineState_TeleportingPausedVM:
+void UIMachineViewScale::takePauseShotLive()
+{
+    /* Take a screen snapshot. Note that TakeScreenShot() always needs a 32bpp image: */
+    QImage shot = QImage(m_pFrameBuffer->width(), m_pFrameBuffer->height(), QImage::Format_RGB32);
+    /* If TakeScreenShot fails or returns no image, just show a black image. */
+    shot.fill(0);
+    CDisplay dsp = session().GetConsole().GetDisplay();
+    dsp.TakeScreenShot(screenId(), shot.bits(), shot.width(), shot.height());
+    m_pPauseImage = new QImage(shot);
+    scalePauseShot();
+}
+
+void UIMachineViewScale::takePauseShotSnapshot()
+{
+    CMachine machine = session().GetMachine();
+    ULONG width = 0, height = 0;
+    QVector<BYTE> screenData = machine.ReadSavedScreenshotPNGToArray(0, width, height);
+    if (screenData.size() != 0)
+    {
+        QImage shot = QImage::fromData(screenData.data(), screenData.size(), "PNG").scaled(guestSizeHint());
+        m_pPauseImage = new QImage(shot);
+        scalePauseShot();
+    }
+}
+
+void UIMachineViewScale::resetPauseShot()
+{
+    /* Call the base class */
+    UIMachineView::resetPauseShot();
+
+    if (m_pPauseImage)
+    {
+        delete m_pPauseImage;
+        m_pPauseImage = 0;
+    }
+}
+
+void UIMachineViewScale::scalePauseShot()
+{
+    if (m_pPauseImage)
+    {
+        QSize scaledSize = frameBuffer()->scaledSize();
+        if (scaledSize.isValid())
         {
-            /* Scale stored pause-shot, it will be repainted on the next event-processing step: */
-            m_pauseShot = m_pauseShot.scaled(frameBuffer()->scaledSize(), Qt::IgnoreAspectRatio, Qt::SmoothTransformation);
-            break;
+            QImage bla1 = m_pPauseImage->scaled(frameBuffer()->scaledSize(), Qt::IgnoreAspectRatio, Qt::SmoothTransformation);
+            dimImage(bla1);
+            m_pauseShot = QPixmap::fromImage(bla1);
         }
-        default:
-            break;
     }
 }
@@ -110,4 +140,7 @@
     frameBuffer()->setScaledSize(viewport()->size());
 
+    /* Scale the pause image if necessary */
+    scalePauseShot();
+
     /* Update viewport: */
     viewport()->repaint();
@@ -115,7 +148,4 @@
     /* Update machine-view sliders: */
     updateSliders();
-
-    /* Set request reflector to 'false' after scaling is done: */
-    m_fShouldWeDoScale = false;
 }
 
@@ -285,4 +315,30 @@
         display.SetFramebuffer(m_uScreenId, CFramebuffer(m_pFrameBuffer));
     }
+
+#ifdef VBOX_TEST_IMAGE_ON_RESTORE
+    QSize size;
+#ifdef Q_WS_X11
+    /* Processing pseudo resize-event to synchronize frame-buffer with stored
+     * framebuffer size. On X11 this will be additional done when the machine
+     * state was 'saved'. */
+    if (session().GetMachine().GetState() == KMachineState_Saved)
+        QSize size = guestSizeHint();
+#endif /* Q_WS_X11 */
+    /* If there is a preview image saved, we will resize the framebuffer to the
+     * size of that image. */
+    ULONG buffer = 0, width = 0, height = 0;
+    CMachine machine = session().GetMachine();
+    machine.QuerySavedScreenshotPNGSize(0, buffer, width, height);
+    if (buffer > 0)
+        size = guestSizeHint();
+    /* If we have a valid size, resize the framebuffer. */
+    if (   size.width() > 0
+        && size.height() > 0)
+    {
+        UIResizeEvent event(FramebufferPixelFormat_Opaque, NULL, 0, 0, size.width(), size.height());
+        frameBuffer()->resizeEvent(&event);
+        QTimer::singleShot(0, this, SLOT(sltPerformGuestScale()));
+    }
+#endif
 }
 
Index: /trunk/src/VBox/Frontends/VirtualBox/src/runtime/scale/UIMachineViewScale.h
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/runtime/scale/UIMachineViewScale.h	(revision 31340)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/runtime/scale/UIMachineViewScale.h	(revision 31341)
@@ -39,8 +39,10 @@
     virtual ~UIMachineViewScale();
 
+    virtual void takePauseShotLive();
+    virtual void takePauseShotSnapshot();
+    virtual void resetPauseShot();
+    void scalePauseShot();
+
 private slots:
-
-    /* Console callback handlers: */
-    void sltMachineStateChanged();
 
     /* Slot to perform guest resize: */
@@ -75,5 +77,5 @@
 
     /* Private members: */
-    bool m_fShouldWeDoScale : 1;
+    QImage *m_pPauseImage;
 
     /* Friend classes: */
