Index: /trunk/src/VBox/Frontends/VirtualBox/src/settings/UISettingsDialog.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/settings/UISettingsDialog.cpp	(revision 54927)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/settings/UISettingsDialog.cpp	(revision 54928)
@@ -166,10 +166,15 @@
     loadOwnData();
 
-    /* Execute dialog and wait for completion: */
-    if (exec() != QDialog::Accepted)
-        return;
-
+    /* Execute dialog: */
+    exec();
+}
+
+void UISettingsDialog::accept()
+{
     /* Save data: */
     saveOwnData();
+
+    /* Call to base-class: */
+    QIWithRetranslateUI<QIMainDialog>::accept();
 }
 
@@ -245,8 +250,6 @@
 
     /* Create settings loader: */
-    UISettingsSerializer *pSettingsLoader = new UISettingsSerializer(this,
-                                                                     UISettingsSerializer::Load,
-                                                                     QVariant::fromValue(data),
-                                                                     m_pSelector->settingPages());
+    UISettingsSerializer *pSettingsLoader = new UISettingsSerializer(this, UISettingsSerializer::Load,
+                                                                     data, m_pSelector->settingPages());
     AssertPtrReturnVoid(pSettingsLoader);
     {
@@ -271,16 +274,16 @@
 
     /* Create settings saver: */
-    UISettingsSerializer *pSettingsSaver = new UISettingsSerializer(this,
-                                                                    UISettingsSerializer::Save,
-                                                                    QVariant::fromValue(data),
-                                                                    m_pSelector->settingPages());
-    AssertPtrReturnVoid(pSettingsSaver);
-    {
+    UISettingsSerializerProgress *pSettingsSaveProgress = new UISettingsSerializerProgress(this, UISettingsSerializer::Save,
+                                                                                           data, m_pSelector->settingPages());
+    AssertPtrReturnVoid(pSettingsSaveProgress);
+    {
+        /* Configure settings saver: */
+        connect(pSettingsSaveProgress, SIGNAL(finished(int)), this, SLOT(sltMarkSaved()));
         /* Start settings saver: */
-        pSettingsSaver->start();
+        pSettingsSaveProgress->exec();
     }
 
     /* Upload data finally: */
-    data = pSettingsSaver->data();
+    data = pSettingsSaveProgress->data();
 }
 
Index: /trunk/src/VBox/Frontends/VirtualBox/src/settings/UISettingsDialog.h
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/settings/UISettingsDialog.h	(revision 54927)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/settings/UISettingsDialog.h	(revision 54928)
@@ -51,4 +51,7 @@
 
 protected slots:
+
+    /** Hides the modal dialog and sets the result code to Accepted. */
+    virtual void accept();
 
     /* Category-change slot: */
Index: /trunk/src/VBox/Frontends/VirtualBox/src/settings/UISettingsDialogSpecific.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/settings/UISettingsDialogSpecific.cpp	(revision 54927)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/settings/UISettingsDialogSpecific.cpp	(revision 54928)
@@ -235,7 +235,4 @@
     else if (!(newSettings == settings))
         vboxGlobal().setSettings(newSettings);
-
-    /* Mark page processed: */
-    sltMarkSaved();
 }
 
@@ -576,7 +573,4 @@
     if (!m_machine.isOk())
         msgCenter().cannotSaveMachineSettings(m_machine, this);
-
-    /* Mark page processed: */
-    sltMarkSaved();
 }
 
@@ -700,5 +694,6 @@
     UISettingsDialog::sltMarkLoaded();
 
-    sltSetFirstRunFlag();
+    /* No need to reset 'first run' flag: */
+    m_fResetFirstRunFlag = false;
 
     /* Unlock the session if exists: */
@@ -794,9 +789,4 @@
 {
     m_fAllowResetFirstRunFlag = true;
-}
-
-void UISettingsDialogMachine::sltSetFirstRunFlag()
-{
-    m_fResetFirstRunFlag = false;
 }
 
Index: /trunk/src/VBox/Frontends/VirtualBox/src/settings/UISettingsDialogSpecific.h
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/settings/UISettingsDialogSpecific.h	(revision 54927)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/settings/UISettingsDialogSpecific.h	(revision 54928)
@@ -86,5 +86,4 @@
     void sltCategoryChanged(int cId);
     void sltAllowResetFirstRunFlag();
-    void sltSetFirstRunFlag();
     void sltResetFirstRunFlag();
 
Index: /trunk/src/VBox/Frontends/VirtualBox/src/settings/UISettingsSerializer.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/settings/UISettingsSerializer.cpp	(revision 54927)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/settings/UISettingsSerializer.cpp	(revision 54928)
@@ -40,9 +40,6 @@
 
     /* Copy the page(s) from incoming list to our map: */
-    for (int iPageIndex = 0; iPageIndex < pages.size(); ++iPageIndex)
-    {
-        UISettingsPage *pPage = pages[iPageIndex];
+    foreach (UISettingsPage *pPage, pages)
         m_pages.insert(pPage->id(), pPage);
-    }
 
     /* Handling internal signals, they are also redirected in their handlers: */
@@ -89,22 +86,4 @@
     /* Start async serializing thread: */
     QThread::start(priority);
-
-    /* If serializer saves settings: */
-    if (m_direction == Save)
-    {
-        /* We should block calling thread until all pages will be saved: */
-        while (!m_fSavingComplete)
-        {
-            /* Lock mutex initially: */
-            m_mutex.lock();
-            /* Perform idle-processing every 100ms,
-             * and waiting for direct wake up signal: */
-            m_condition.wait(&m_mutex, 100);
-            /* Process queued signals posted to GUI thread: */
-            qApp->processEvents();
-            /* Unlock mutex finally: */
-            m_mutex.unlock();
-        }
-    }
 }
 
@@ -198,2 +177,61 @@
 }
 
+UISettingsSerializerProgress::UISettingsSerializerProgress(QWidget *pParent, UISettingsSerializer::SerializationDirection direction,
+                                                           const QVariant &data, const UISettingsPageList &pages)
+    : QIWithRetranslateUI<QProgressDialog>(pParent)
+    , m_pSerializer(0)
+    , m_direction(direction)
+    , m_data(data)
+    , m_pages(pages)
+{
+    /* Prepare: */
+    prepare();
+
+    /* Translate: */
+    retranslateUi();
+}
+
+int UISettingsSerializerProgress::exec()
+{
+    /* Start the serializer: */
+    m_pSerializer->start();
+
+    /* Call to base-class: */
+    return QIWithRetranslateUI<QProgressDialog>::exec();
+}
+
+QVariant& UISettingsSerializerProgress::data()
+{
+    AssertPtrReturn(m_pSerializer, m_data);
+    return m_pSerializer->data();
+}
+
+void UISettingsSerializerProgress::prepare()
+{
+    /* Create serializer: */
+    m_pSerializer = new UISettingsSerializer(this, m_direction, m_data, m_pages);
+    AssertPtrReturnVoid(m_pSerializer);
+    {
+        /* Install progress handler: */
+        connect(m_pSerializer, SIGNAL(sigNotifyAboutPagePostprocessed(int)),
+                this, SLOT(sltAdvanceProgressValue()));
+        connect(m_pSerializer, SIGNAL(sigNotifyAboutPagesPostprocessed()),
+                this, SLOT(sltAdvanceProgressValue()));
+    }
+
+    /* Set maximum/minimum/current values: */
+    setMaximum(m_pSerializer->pageCount() + 1);
+    setMinimum(0);
+    setValue(0);
+}
+
+void UISettingsSerializerProgress::retranslateUi()
+{
+    /* Translate title: */
+    switch (m_pSerializer->direction())
+    {
+        case UISettingsSerializer::Load: setLabelText(tr("Loading Settings...")); break;
+        case UISettingsSerializer::Save: setLabelText(tr("Saving Settings...")); break;
+    }
+}
+
Index: /trunk/src/VBox/Frontends/VirtualBox/src/settings/UISettingsSerializer.h
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/settings/UISettingsSerializer.h	(revision 54927)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/settings/UISettingsSerializer.h	(revision 54928)
@@ -22,7 +22,11 @@
 #include <QVariant>
 #include <QWaitCondition>
+#include <QProgressDialog>
 #include <QMutex>
 #include <QList>
 #include <QMap>
+
+/* GUI includes: */
+#include "QIWithRetranslateUI.h"
 
 /* Forward declarations: */
@@ -76,6 +80,12 @@
     ~UISettingsSerializer();
 
+    /** Returns the load/save direction. */
+    SerializationDirection direction() const { return m_direction; }
+
     /** Returns the instance of wrapper(s) to load/save the data from/to. */
     QVariant& data() { return m_data; }
+
+    /** Returns the count of the page(s) to load/save the data to/from. */
+    int pageCount() const { return m_pages.size(); }
 
     /** Raises the priority of page with @a iPageId. */
@@ -103,6 +113,6 @@
     static UISettingsSerializer *m_spInstance;
 
-    /** Holds the the load/save direction. */
-    SerializationDirection m_direction;
+    /** Holds the load/save direction. */
+    const SerializationDirection m_direction;
 
     /** Holds the wrapper(s) to load/save the data from/to. */
@@ -121,3 +131,52 @@
 };
 
+/** QProgressDialog reimplementation used to
+  * reflect the settings serialization operation. */
+class UISettingsSerializerProgress : public QIWithRetranslateUI<QProgressDialog>
+{
+    Q_OBJECT;
+
+public:
+
+    /** Constructor.
+      * @param pParent   being passed to the base-class,
+      * @param direction determines the load/save direction,
+      * @param data      contains the wrapper(s) to load/save the data from/to,
+      * @param pages     contains the page(s) to load/save the data to/from. */
+    UISettingsSerializerProgress(QWidget *pParent, UISettingsSerializer::SerializationDirection direction,
+                                 const QVariant &data, const UISettingsPageList &pages);
+
+    /** Executes the dialog. */
+    int exec();
+
+    /** Returns the instance of wrapper(s) to load/save the data from/to. */
+    QVariant& data();
+
+protected:
+
+    /** Prepare routine. */
+    void prepare();
+
+    /** Translate routine: */
+    void retranslateUi();
+
+private slots:
+
+    /** Advances the current progress value. */
+    void sltAdvanceProgressValue() { setValue(value() + 1); }
+
+private:
+
+    /** Holds the load/save direction. */
+    const UISettingsSerializer::SerializationDirection m_direction;
+
+    /** Holds the wrapper(s) to load/save the data from/to. */
+    QVariant m_data;
+    /** Holds the page(s) to load/save the data to/from. */
+    UISettingsPageList m_pages;
+
+    /** Holds the pointer to the thread loading/saving settings in async mode. */
+    UISettingsSerializer *m_pSerializer;
+};
+
 #endif /* !___UISettingsSerializer_h___ */
