Index: /trunk/src/VBox/Frontends/VirtualBox/Makefile.kmk
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/Makefile.kmk	(revision 69005)
+++ /trunk/src/VBox/Frontends/VirtualBox/Makefile.kmk	(revision 69006)
@@ -566,4 +566,5 @@
 	src/widgets/UIMiniToolBar.cpp \
 	src/widgets/UIPortForwardingTable.cpp \
+	src/widgets/UIProgressDialog.cpp \
 	src/widgets/UITabBar.cpp \
 	src/wizards/importappliance/UIWizardImportApp.cpp
Index: /trunk/src/VBox/Frontends/VirtualBox/src/extradata/UIExtraDataDefs.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/extradata/UIExtraDataDefs.cpp	(revision 69005)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/extradata/UIExtraDataDefs.cpp	(revision 69006)
@@ -42,4 +42,7 @@
 const char* UIExtraDataDefs::GUI_UpdateCheckCount = "GUI/UpdateCheckCount";
 #endif /* VBOX_GUI_WITH_NETWORK_MANAGER */
+
+/* Progress: */
+const char* UIExtraDataDefs::GUI_Progress_LegacyMode = "GUI/Progress/LegacyMode";
 
 /* Settings: */
Index: /trunk/src/VBox/Frontends/VirtualBox/src/extradata/UIExtraDataDefs.h
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/extradata/UIExtraDataDefs.h	(revision 69005)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/extradata/UIExtraDataDefs.h	(revision 69006)
@@ -59,4 +59,10 @@
     /** @} */
 #endif /* VBOX_GUI_WITH_NETWORK_MANAGER */
+
+    /** @name Progress
+      * @{ */
+        /** Holds whether legacy progress handling method is requested. */
+        extern const char* GUI_Progress_LegacyMode;
+    /** @} */
 
     /** @name Settings
Index: /trunk/src/VBox/Frontends/VirtualBox/src/extradata/UIExtraDataManager.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/extradata/UIExtraDataManager.cpp	(revision 69005)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/extradata/UIExtraDataManager.cpp	(revision 69006)
@@ -1940,4 +1940,5 @@
            << GUI_PreventApplicationUpdate << GUI_UpdateDate << GUI_UpdateCheckCount
 #endif /* VBOX_GUI_WITH_NETWORK_MANAGER */
+           << GUI_Progress_LegacyMode
            << GUI_RestrictedGlobalSettingsPages << GUI_RestrictedMachineSettingsPages
            << GUI_LanguageID
@@ -2291,4 +2292,10 @@
 #endif /* VBOX_GUI_WITH_NETWORK_MANAGER */
 
+bool UIExtraDataManager::legacyProgressHandlingRequested()
+{
+    /* 'False' unless feature allowed: */
+    return isFeatureAllowed(GUI_Progress_LegacyMode);
+}
+
 bool UIExtraDataManager::guiFeatureEnabled(GUIFeatureType enmFeature)
 {
Index: /trunk/src/VBox/Frontends/VirtualBox/src/extradata/UIExtraDataManager.h
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/extradata/UIExtraDataManager.h	(revision 69005)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/extradata/UIExtraDataManager.h	(revision 69006)
@@ -177,4 +177,10 @@
     /** @} */
 #endif /* VBOX_GUI_WITH_NETWORK_MANAGER */
+
+    /** @name Progress
+      * @{ */
+        /** Returns whether legacy progress handling method is requested. */
+        bool legacyProgressHandlingRequested();
+    /** @} */
 
     /** @name Settings
Index: /trunk/src/VBox/Frontends/VirtualBox/src/globals/UIMainEventListener.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/globals/UIMainEventListener.cpp	(revision 69005)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/globals/UIMainEventListener.cpp	(revision 69006)
@@ -58,4 +58,6 @@
 # include "CCanShowWindowEvent.h"
 # include "CShowWindowEvent.h"
+# include "CProgressPercentageChangedEvent.h"
+# include "CProgressTaskCompletedEvent.h"
 #endif /* !VBOX_WITH_PRECOMPILED_HEADERS */
 
@@ -404,4 +406,16 @@
             break;
         }
+        case KVBoxEventType_OnProgressPercentageChanged:
+        {
+            CProgressPercentageChangedEvent es(pEvent);
+            emit sigProgressPercentageChange(es.GetProgressId(), (int)es.GetPercent());
+            break;
+        }
+        case KVBoxEventType_OnProgressTaskCompleted:
+        {
+            CProgressTaskCompletedEvent es(pEvent);
+            emit sigProgressTaskComplete(es.GetProgressId());
+            break;
+        }
 
         default: break;
Index: /trunk/src/VBox/Frontends/VirtualBox/src/globals/UIMainEventListener.h
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/globals/UIMainEventListener.h	(revision 69005)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/globals/UIMainEventListener.h	(revision 69006)
@@ -122,4 +122,9 @@
     void sigAudioAdapterChange();
 
+    /** Notifies about @a iPercent change for progress with @a strProgressId. */
+    void sigProgressPercentageChange(QString strProgressId, int iPercent);
+    /** Notifies about task complete for progress with @a strProgressId. */
+    void sigProgressTaskComplete(QString strProgressId);
+
 public:
 
Index: /trunk/src/VBox/Frontends/VirtualBox/src/widgets/UIProgressDialog.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/widgets/UIProgressDialog.cpp	(revision 69005)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/widgets/UIProgressDialog.cpp	(revision 69006)
@@ -32,4 +32,6 @@
 # include "QILabel.h"
 # include "UIErrorString.h"
+# include "UIExtraDataManager.h"
+# include "UIMainEventListener.h"
 # include "UIModalWindowManager.h"
 # include "UIProgressDialog.h"
@@ -41,7 +43,160 @@
 
 /* COM includes: */
+# include "CEventListener.h"
+# include "CEventSource.h"
 # include "CProgress.h"
 
 #endif /* !VBOX_WITH_PRECOMPILED_HEADERS */
+
+
+/** Private QObject extension
+  * providing UIExtraDataManager with the CVirtualBox event-source. */
+class UIProgressEventHandler : public QObject
+{
+    Q_OBJECT;
+
+signals:
+
+    /** Notifies about @a iPercent change for progress with @a strProgressId. */
+    void sigProgressPercentageChange(QString strProgressId, int iPercent);
+    /** Notifies about task complete for progress with @a strProgressId. */
+    void sigProgressTaskComplete(QString strProgressId);
+
+public:
+
+    /** Constructs event proxy object on the basis of passed @a pParent. */
+    UIProgressEventHandler(QObject *pParent, const CProgress &comProgress);
+    /** Destructs event proxy object. */
+    ~UIProgressEventHandler();
+
+protected:
+
+    /** @name Prepare/Cleanup cascade.
+      * @{ */
+        /** Prepares all. */
+        void prepare();
+        /** Prepares listener. */
+        void prepareListener();
+        /** Prepares connections. */
+        void prepareConnections();
+
+        /** Cleanups connections. */
+        void cleanupConnections();
+        /** Cleanups listener. */
+        void cleanupListener();
+        /** Cleanups all. */
+        void cleanup();
+    /** @} */
+
+private:
+
+    /** Holds the progress wrapper. */
+    CProgress m_comProgress;
+
+    /** Holds the Qt event listener instance. */
+    ComObjPtr<UIMainEventListenerImpl> m_pQtListener;
+    /** Holds the COM event listener instance. */
+    CEventListener m_comEventListener;
+};
+
+
+/*********************************************************************************************************************************
+*   Class UIProgressEventHandler implementation.                                                                                 *
+*********************************************************************************************************************************/
+
+UIProgressEventHandler::UIProgressEventHandler(QObject *pParent, const CProgress &comProgress)
+    : QObject(pParent)
+    , m_comProgress(comProgress)
+{
+    /* Prepare: */
+    prepare();
+}
+
+UIProgressEventHandler::~UIProgressEventHandler()
+{
+    /* Cleanup: */
+    cleanup();
+}
+
+void UIProgressEventHandler::prepare()
+{
+    /* Prepare: */
+    prepareListener();
+    prepareConnections();
+}
+
+void UIProgressEventHandler::prepareListener()
+{
+    /* Create event listener instance: */
+    m_pQtListener.createObject();
+    m_pQtListener->init(new UIMainEventListener, this);
+    m_comEventListener = CEventListener(m_pQtListener);
+
+    /* Get CProgress event source: */
+    CEventSource comEventSourceProgress = m_comProgress.GetEventSource();
+    AssertWrapperOk(comEventSourceProgress);
+
+    /* Enumerate all the required event-types: */
+    QVector<KVBoxEventType> eventTypes;
+    eventTypes
+        << KVBoxEventType_OnProgressPercentageChanged
+        << KVBoxEventType_OnProgressTaskCompleted;
+
+    /* Register event listener for CProgress event source: */
+    comEventSourceProgress.RegisterListener(m_comEventListener, eventTypes,
+        gEDataManager->eventHandlingType() == EventHandlingType_Active ? TRUE : FALSE);
+    AssertWrapperOk(comEventSourceProgress);
+
+    /* If event listener registered as passive one: */
+    if (gEDataManager->eventHandlingType() == EventHandlingType_Passive)
+    {
+        /* Register event sources in their listeners as well: */
+        m_pQtListener->getWrapped()->registerSource(comEventSourceProgress, m_comEventListener);
+    }
+}
+
+void UIProgressEventHandler::prepareConnections()
+{
+    /* Create direct (sync) connections for signals of main listener: */
+    connect(m_pQtListener->getWrapped(), &UIMainEventListener::sigProgressPercentageChange,
+            this, &UIProgressEventHandler::sigProgressPercentageChange,
+            Qt::DirectConnection);
+    connect(m_pQtListener->getWrapped(), &UIMainEventListener::sigProgressTaskComplete,
+            this, &UIProgressEventHandler::sigProgressTaskComplete,
+            Qt::DirectConnection);
+}
+
+void UIProgressEventHandler::cleanupConnections()
+{
+    /* Nothing for now. */
+}
+
+void UIProgressEventHandler::cleanupListener()
+{
+    /* If event listener registered as passive one: */
+    if (gEDataManager->eventHandlingType() == EventHandlingType_Passive)
+    {
+        /* Unregister everything: */
+        m_pQtListener->getWrapped()->unregisterSources();
+    }
+
+    /* Make sure VBoxSVC is available: */
+    if (!vboxGlobal().isVBoxSVCAvailable())
+        return;
+
+    /* Get CProgress event source: */
+    CEventSource comEventSourceProgress = m_comProgress.GetEventSource();
+    AssertWrapperOk(comEventSourceProgress);
+
+    /* Unregister event listener for CProgress event source: */
+    comEventSourceProgress.UnregisterListener(m_comEventListener);
+}
+
+void UIProgressEventHandler::cleanup()
+{
+    /* Cleanup: */
+    cleanupConnections();
+    cleanupListener();
+}
 
 
@@ -62,4 +217,5 @@
     , m_pImage(pImage)
     , m_cMinDuration(cMinDuration)
+    , m_fLegacyHandling(gEDataManager->legacyProgressHandlingRequested())
     , m_pLabelImage(0)
     , m_pLabelDescription(0)
@@ -71,4 +227,5 @@
     , m_fCancelEnabled(false)
     , m_fEnded(false)
+    , m_pEventHandler(0)
 {
     /* Prepare: */
@@ -101,6 +258,8 @@
     }
 
-    /* Start refresh timer: */
-    int id = startTimer(cRefreshInterval);
+    /* Start refresh timer (if necessary): */
+    int id = 0;
+    if (m_fLegacyHandling)
+        id = startTimer(cRefreshInterval);
 
     /* Set busy cursor.
@@ -129,6 +288,7 @@
     }
 
-    /* Kill refresh timer: */
-    killTimer(id);
+    /* Kill refresh timer (if necessary): */
+    if (m_fLegacyHandling)
+        killTimer(id);
 
 #ifndef VBOX_WS_MAC
@@ -171,4 +331,40 @@
 }
 
+void UIProgressDialog::sltHandleProgressPercentageChange(QString /* strProgressId */, int iPercent)
+{
+    /* New mode only: */
+    AssertReturnVoid(!m_fLegacyHandling);
+
+    /* Update progress: */
+    updateProgressState();
+    updateProgressPercentage(iPercent);
+}
+
+void UIProgressDialog::sltHandleProgressTaskComplete(QString /* strProgressId */)
+{
+    /* New mode only: */
+    AssertReturnVoid(!m_fLegacyHandling);
+
+    /* If progress-dialog is not yet ended but progress is aborted or completed: */
+    if (!m_fEnded && (!m_comProgress.isOk() || m_comProgress.GetCompleted()))
+    {
+        /* Set progress to 100%: */
+        updateProgressPercentage(100);
+
+        /* Try to close the dialog: */
+        closeProgressDialog();
+    }
+}
+
+void UIProgressDialog::sltHandleWindowStackChange()
+{
+    /* If progress-dialog is not yet ended but progress is aborted or completed: */
+    if (!m_fEnded && (!m_comProgress.isOk() || m_comProgress.GetCompleted()))
+    {
+        /* Try to close the dialog: */
+        closeProgressDialog();
+    }
+}
+
 void UIProgressDialog::sltCancelOperation()
 {
@@ -186,6 +382,24 @@
 #endif
 
+    /* Make sure dialog is handling window stack changes: */
+    connect(&windowManager(), &UIModalWindowManager::sigStackChanged,
+            this, &UIProgressDialog::sltHandleWindowStackChange);
+
     /* Prepare: */
+    prepareEventHandler();
     prepareWidgets();
+}
+
+void UIProgressDialog::prepareEventHandler()
+{
+    if (!m_fLegacyHandling)
+    {
+        /* Create CProgress event handler: */
+        m_pEventHandler = new UIProgressEventHandler(this, m_comProgress);
+        connect(m_pEventHandler, &UIProgressEventHandler::sigProgressPercentageChange,
+                this, &UIProgressDialog::sltHandleProgressPercentageChange);
+        connect(m_pEventHandler, &UIProgressEventHandler::sigProgressTaskComplete,
+                this, &UIProgressDialog::sltHandleProgressTaskComplete);
+    }
 }
 
@@ -311,4 +525,14 @@
 }
 
+void UIProgressDialog::cleanupEventHandler()
+{
+    if (!m_fLegacyHandling)
+    {
+        /* Destroy CProgress event handler: */
+        delete m_pEventHandler;
+        m_pEventHandler = 0;
+    }
+}
+
 void UIProgressDialog::cleanup()
 {
@@ -317,7 +541,9 @@
 
     /* Call the timer event handling delegate: */
-    handleTimerEvent();
+    if (m_fLegacyHandling)
+        handleTimerEvent();
 
     /* Cleanup: */
+    cleanupEventHandler();
     cleanupWidgets();
 }
@@ -430,4 +656,7 @@
 void UIProgressDialog::handleTimerEvent()
 {
+    /* Old mode only: */
+    AssertReturnVoid(m_fLegacyHandling);
+
     /* If progress-dialog is ended: */
     if (m_fEnded)
@@ -536,2 +765,4 @@
 }
 
+#include "UIProgressDialog.moc"
+
Index: /trunk/src/VBox/Frontends/VirtualBox/src/widgets/UIProgressDialog.h
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/widgets/UIProgressDialog.h	(revision 69005)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/widgets/UIProgressDialog.h	(revision 69006)
@@ -28,4 +28,5 @@
 class QILabel;
 class UIMiniCancelButton;
+class UIProgressEventHandler;
 class CProgress;
 
@@ -86,4 +87,12 @@
 private slots:
 
+    /** Handles percentage changed event for progress with @a strProgressId to @a iPercent. */
+    void sltHandleProgressPercentageChange(QString strProgressId, int iPercent);
+    /** Handles task completed event for progress with @a strProgressId. */
+    void sltHandleProgressTaskComplete(QString strProgressId);
+
+    /** Handles window stack changed signal. */
+    void sltHandleWindowStackChange();
+
     /** Handles request to cancel operation. */
     void sltCancelOperation();
@@ -93,8 +102,12 @@
     /** Prepares all. */
     void prepare();
+    /** Prepares event handler. */
+    void prepareEventHandler();
     /** Prepares widgets. */
     void prepareWidgets();
     /** Cleanups widgets. */
     void cleanupWidgets();
+    /** Cleanups event handler. */
+    void cleanupEventHandler();
     /** Cleanups all. */
     void cleanup();
@@ -119,4 +132,7 @@
     /** Holds the minimum duration before the progress-dialog is shown. */
     int        m_cMinDuration;
+
+    /** Holds whether legacy handling is requested for this progress. */
+    bool  m_fLegacyHandling;
 
     /** Holds the image label instance. */
@@ -140,4 +156,7 @@
     bool         m_fEnded;
 
+    /** Holds the progress event handler instance. */
+    UIProgressEventHandler *m_pEventHandler;
+
     /** Holds the operation description template. */
     static const char *m_spcszOpDescTpl;
