Index: trunk/src/VBox/Frontends/VirtualBox/src/globals/UIThreadPool.h
===================================================================
--- trunk/src/VBox/Frontends/VirtualBox/src/globals/UIThreadPool.h	(revision 57671)
+++ trunk/src/VBox/Frontends/VirtualBox/src/globals/UIThreadPool.h	(revision 57672)
@@ -128,4 +128,5 @@
     {
         Type_MediumEnumeration = 1,
+        Type_DetailsPopulation = 2,
     };
 
Index: trunk/src/VBox/Frontends/VirtualBox/src/selector/graphics/details/UIGDetailsElements.cpp
===================================================================
--- trunk/src/VBox/Frontends/VirtualBox/src/selector/graphics/details/UIGDetailsElements.cpp	(revision 57671)
+++ trunk/src/VBox/Frontends/VirtualBox/src/selector/graphics/details/UIGDetailsElements.cpp	(revision 57672)
@@ -21,6 +21,7 @@
 
 /* Qt includes: */
+# include <QDir>
 # include <QTimer>
-# include <QDir>
+# include <QGraphicsLinearLayout>
 
 /* GUI includes: */
@@ -36,4 +37,6 @@
 
 /* COM includes: */
+# include "COMEnums.h"
+# include "CMachine.h"
 # include "CSystemProperties.h"
 # include "CVRDEServer.h"
@@ -52,29 +55,27 @@
 #endif /* !VBOX_WITH_PRECOMPILED_HEADERS */
 
-#include <QGraphicsLinearLayout>
-
-
-UIGDetailsUpdateThread::UIGDetailsUpdateThread(const CMachine &machine)
-    : m_machine(machine)
-{
-    qRegisterMetaType<UITextTable>();
+
+UIGDetailsUpdateTask::UIGDetailsUpdateTask(const CMachine &machine)
+    : UITask(UITask::Type_DetailsPopulation)
+{
+    /* Store machine as property: */
+    setProperty("machine", QVariant::fromValue(machine));
 }
 
 UIGDetailsElementInterface::UIGDetailsElementInterface(UIGDetailsSet *pParent, DetailsElementType type, bool fOpened)
     : UIGDetailsElement(pParent, type, fOpened)
-    , m_pThread(0)
+    , m_pTask(0)
 {
     /* Assign corresponding icon: */
     setIcon(gpConverter->toIcon(elementType()));
 
+    /* Listen for the global thread-pool: */
+    connect(vboxGlobal().threadPool(), SIGNAL(sigTaskComplete(UITask*)),
+            this, SLOT(sltUpdateAppearanceFinished(UITask*)));
+
     /* Translate finally: */
     retranslateUi();
 }
 
-UIGDetailsElementInterface::~UIGDetailsElementInterface()
-{
-    cleanupThread();
-}
-
 void UIGDetailsElementInterface::retranslateUi()
 {
@@ -85,33 +86,37 @@
 void UIGDetailsElementInterface::updateAppearance()
 {
-    /* Call for base class: */
+    /* Call to base-class: */
     UIGDetailsElement::updateAppearance();
 
-    /* Create/start update thread in necessary: */
-    if (!m_pThread)
-    {
-        m_pThread = createUpdateThread();
-        connect(m_pThread, SIGNAL(sigComplete(const UITextTable&)),
-                this, SLOT(sltUpdateAppearanceFinished(const UITextTable&)));
-        m_pThread->start();
-    }
-}
-
-void UIGDetailsElementInterface::sltUpdateAppearanceFinished(const UITextTable &newText)
-{
+    /* Prepare/start update task: */
+    if (!m_pTask)
+    {
+        /* Prepare update task: */
+        m_pTask = createUpdateTask();
+        /* Post task into global thread-pool: */
+        vboxGlobal().threadPool()->enqueueTask(m_pTask);
+    }
+}
+
+void UIGDetailsElementInterface::sltUpdateAppearanceFinished(UITask *pTask)
+{
+    /* Make sure that is one of our tasks: */
+    if (pTask->type() != UITask::Type_DetailsPopulation)
+        return;
+
+    /* Skip unrelated tasks: */
+    if (m_pTask != pTask)
+        return;
+
+    /* Assign new text if changed: */
+    const UITextTable newText = pTask->property("table").value<UITextTable>();
     if (text() != newText)
         setText(newText);
-    cleanupThread();
+
+    /* Mark task processed: */
+    m_pTask = 0;
+
+    /* Notify listeners about update task complete: */
     emit sigBuildDone();
-}
-
-void UIGDetailsElementInterface::cleanupThread()
-{
-    if (m_pThread)
-    {
-        m_pThread->wait();
-        delete m_pThread;
-        m_pThread = 0;
-    }
 }
 
@@ -120,19 +125,29 @@
     : UIGDetailsElement(pParent, DetailsElementType_Preview, fOpened)
 {
-    /* Icon: */
-    setIcon(UIIconPool::iconSet(":/machine_16px.png"));
-
-    /* Prepare variables: */
-    int iMargin = data(ElementData_Margin).toInt();
-    /* Prepare layout: */
+    /* Assign corresponding icon: */
+    setIcon(gpConverter->toIcon(elementType()));
+
+    /* Create layout: */
     QGraphicsLinearLayout *pLayout = new QGraphicsLinearLayout;
-    pLayout->setContentsMargins(iMargin, 2 * iMargin + minimumHeaderHeight(), iMargin, iMargin);
-    setLayout(pLayout);
-
-    /* Create preview: */
-    m_pPreview = new UIGMachinePreview(this);
-    connect(m_pPreview, SIGNAL(sigSizeHintChanged()),
-            this, SLOT(sltPreviewSizeHintChanged()));
-    pLayout->addItem(m_pPreview);
+    AssertPtr(pLayout);
+    {
+        /* Prepare layout: */
+        const int iMargin = data(ElementData_Margin).toInt();
+        pLayout->setContentsMargins(iMargin, 2 * iMargin + minimumHeaderHeight(), iMargin, iMargin);
+        /* Assign layout to widget: */
+        setLayout(pLayout);
+        /* Create preview: */
+        m_pPreview = new UIGMachinePreview(this);
+        AssertPtr(m_pPreview);
+        {
+            /* Prepare preview: */
+            connect(m_pPreview, SIGNAL(sigSizeHintChanged()),
+                    this, SLOT(sltPreviewSizeHintChanged()));
+            /* Add preview into layout: */
+            pLayout->addItem(m_pPreview);
+        }
+    }
+
+    /* Set fixed size policy finally (after all content constructed): */
     setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
 
@@ -218,8 +233,8 @@
 void UIGDetailsElementPreview::updateAppearance()
 {
-    /* Call for base class: */
+    /* Call to base-class: */
     UIGDetailsElement::updateAppearance();
 
-    /* Set new machine attribute: */
+    /* Set new machine attribute directly: */
     m_pPreview->setMachine(machine());
     emit sigBuildDone();
@@ -227,444 +242,429 @@
 
 
-void UIGDetailsUpdateThreadGeneral::run()
-{
-    COMBase::InitializeCOM(false);
-
-    if (!machine().isNull())
-    {
-        /* Prepare table: */
-        UITextTable m_text;
-
-        /* Gather information: */
-        if (machine().GetAccessible())
-        {
-            /* Machine name: */
-            m_text << UITextTableLine(QApplication::translate("UIGDetails", "Name", "details (general)"), machine().GetName());
-
-            /* Operating system type: */
-            m_text << UITextTableLine(QApplication::translate("UIGDetails", "Operating System", "details (general)"),
-                                       vboxGlobal().vmGuestOSTypeDescription(machine().GetOSTypeId()));
-
-            /* Get groups: */
-            QStringList groups = machine().GetGroups().toList();
-            /* Do not show groups for machine which is in root group only: */
-            if (groups.size() == 1)
-                groups.removeAll("/");
-            /* If group list still not empty: */
-            if (!groups.isEmpty())
+void UIGDetailsUpdateTaskGeneral::run()
+{
+    /* Acquire corresponding machine: */
+    CMachine machine = property("machine").value<CMachine>();
+    if (machine.isNull())
+        return;
+
+    /* Prepare table: */
+    UITextTable table;
+
+    /* Gather information: */
+    if (machine.GetAccessible())
+    {
+        /* Machine name: */
+        table << UITextTableLine(QApplication::translate("UIGDetails", "Name", "details (general)"), machine.GetName());
+
+        /* Operating system type: */
+        table << UITextTableLine(QApplication::translate("UIGDetails", "Operating System", "details (general)"),
+                                 vboxGlobal().vmGuestOSTypeDescription(machine.GetOSTypeId()));
+
+        /* Get groups: */
+        QStringList groups = machine.GetGroups().toList();
+        /* Do not show groups for machine which is in root group only: */
+        if (groups.size() == 1)
+            groups.removeAll("/");
+        /* If group list still not empty: */
+        if (!groups.isEmpty())
+        {
+            /* For every group: */
+            for (int i = 0; i < groups.size(); ++i)
             {
-                /* For every group: */
-                for (int i = 0; i < groups.size(); ++i)
+                /* Trim first '/' symbol: */
+                QString &strGroup = groups[i];
+                if (strGroup.startsWith("/") && strGroup != "/")
+                    strGroup.remove(0, 1);
+            }
+            table << UITextTableLine(QApplication::translate("UIGDetails", "Groups", "details (general)"), groups.join(", "));
+        }
+    }
+    else
+        table << UITextTableLine(QApplication::translate("UIGDetails", "Information Inaccessible", "details"), QString());
+
+    /* Save the table as property: */
+    setProperty("table", QVariant::fromValue(table));
+}
+
+
+void UIGDetailsUpdateTaskSystem::run()
+{
+    /* Acquire corresponding machine: */
+    CMachine machine = property("machine").value<CMachine>();
+    if (machine.isNull())
+        return;
+
+    /* Prepare table: */
+    UITextTable table;
+
+    /* Gather information: */
+    if (machine.GetAccessible())
+    {
+        /* Base memory: */
+        table << UITextTableLine(QApplication::translate("UIGDetails", "Base Memory", "details (system)"),
+                                 QApplication::translate("UIGDetails", "%1 MB", "details").arg(machine.GetMemorySize()));
+
+        /* CPU count: */
+        int cCPU = machine.GetCPUCount();
+        if (cCPU > 1)
+            table << UITextTableLine(QApplication::translate("UIGDetails", "Processors", "details (system)"),
+                                     QString::number(cCPU));
+
+        /* CPU execution cap: */
+        int iCPUExecCap = machine.GetCPUExecutionCap();
+        if (iCPUExecCap < 100)
+            table << UITextTableLine(QApplication::translate("UIGDetails", "Execution Cap", "details (system)"),
+                                     QApplication::translate("UIGDetails", "%1%", "details").arg(iCPUExecCap));
+
+        /* Boot-order: */
+        QStringList bootOrder;
+        for (ulong i = 1; i <= vboxGlobal().virtualBox().GetSystemProperties().GetMaxBootPosition(); ++i)
+        {
+            KDeviceType device = machine.GetBootOrder(i);
+            if (device == KDeviceType_Null)
+                continue;
+            bootOrder << gpConverter->toString(device);
+        }
+        if (bootOrder.isEmpty())
+            bootOrder << gpConverter->toString(KDeviceType_Null);
+        table << UITextTableLine(QApplication::translate("UIGDetails", "Boot Order", "details (system)"), bootOrder.join(", "));
+
+        /* Acceleration: */
+        QStringList acceleration;
+        if (vboxGlobal().virtualBox().GetHost().GetProcessorFeature(KProcessorFeature_HWVirtEx))
+        {
+            /* VT-x/AMD-V: */
+            if (machine.GetHWVirtExProperty(KHWVirtExPropertyType_Enabled))
+            {
+                acceleration << QApplication::translate("UIGDetails", "VT-x/AMD-V", "details (system)");
+                /* Nested Paging (only when hw virt is enabled): */
+                if (machine.GetHWVirtExProperty(KHWVirtExPropertyType_NestedPaging))
+                    acceleration << QApplication::translate("UIGDetails", "Nested Paging", "details (system)");
+            }
+        }
+        if (machine.GetCPUProperty(KCPUPropertyType_PAE))
+            acceleration << QApplication::translate("UIGDetails", "PAE/NX", "details (system)");
+        switch (machine.GetEffectiveParavirtProvider())
+        {
+            case KParavirtProvider_Minimal: acceleration << QApplication::translate("UIGDetails", "Minimal Paravirtualization", "details (system)"); break;
+            case KParavirtProvider_HyperV:  acceleration << QApplication::translate("UIGDetails", "Hyper-V Paravirtualization", "details (system)"); break;
+            case KParavirtProvider_KVM:     acceleration << QApplication::translate("UIGDetails", "KVM Paravirtualization", "details (system)"); break;
+            default: break;
+        }
+        if (!acceleration.isEmpty())
+            table << UITextTableLine(QApplication::translate("UIGDetails", "Acceleration", "details (system)"),
+                                     acceleration.join(", "));
+    }
+    else
+        table << UITextTableLine(QApplication::translate("UIGDetails", "Information Inaccessible", "details"),
+                                 QString());
+
+    /* Save the table as property: */
+    setProperty("table", QVariant::fromValue(table));
+}
+
+
+void UIGDetailsUpdateTaskDisplay::run()
+{
+    /* Acquire corresponding machine: */
+    CMachine machine = property("machine").value<CMachine>();
+    if (machine.isNull())
+        return;
+
+    /* Prepare table: */
+    UITextTable table;
+
+    /* Gather information: */
+    if (machine.GetAccessible())
+    {
+        /* Video memory: */
+        table << UITextTableLine(QApplication::translate("UIGDetails", "Video Memory", "details (display)"),
+                                 QApplication::translate("UIGDetails", "%1 MB", "details").arg(machine.GetVRAMSize()));
+
+        /* Screen count: */
+        int cGuestScreens = machine.GetMonitorCount();
+        if (cGuestScreens > 1)
+            table << UITextTableLine(QApplication::translate("UIGDetails", "Screens", "details (display)"),
+                                     QString::number(cGuestScreens));
+
+        /* Get scale-factor value: */
+        const QString strScaleFactor = machine.GetExtraData(UIExtraDataDefs::GUI_ScaleFactor);
+        {
+            /* Try to convert loaded data to double: */
+            bool fOk = false;
+            double dValue = strScaleFactor.toDouble(&fOk);
+            /* Invent the default value: */
+            if (!fOk || !dValue)
+                dValue = 1.0;
+            /* Append information: */
+            if (dValue != 1.0)
+                table << UITextTableLine(QApplication::translate("UIGDetails", "Scale-factor", "details (display)"),
+                                         QString::number(dValue, 'f', 2));
+        }
+
+#ifdef Q_WS_MAC
+        /* Get 'Unscaled HiDPI Video Output' mode value: */
+        const QString strUnscaledHiDPIMode = machine.GetExtraData(UIExtraDataDefs::GUI_HiDPI_UnscaledOutput);
+        {
+            /* Try to convert loaded data to bool: */
+            const bool fEnabled  = strUnscaledHiDPIMode.compare("true", Qt::CaseInsensitive) == 0 ||
+                                   strUnscaledHiDPIMode.compare("yes", Qt::CaseInsensitive) == 0 ||
+                                   strUnscaledHiDPIMode.compare("on", Qt::CaseInsensitive) == 0 ||
+                                   strUnscaledHiDPIMode == "1";
+            /* Append information: */
+            if (fEnabled)
+                table << UITextTableLine(QApplication::translate("UIGDetails", "Unscaled HiDPI Video Output", "details (display)"),
+                                         QApplication::translate("UIGDetails", "Enabled", "details (display/Unscaled HiDPI Video Output)"));
+        }
+#endif /* Q_WS_MAC */
+
+        QStringList acceleration;
+#ifdef VBOX_WITH_VIDEOHWACCEL
+        /* 2D acceleration: */
+        if (machine.GetAccelerate2DVideoEnabled())
+            acceleration << QApplication::translate("UIGDetails", "2D Video", "details (display)");
+#endif /* VBOX_WITH_VIDEOHWACCEL */
+        /* 3D acceleration: */
+        if (machine.GetAccelerate3DEnabled())
+            acceleration << QApplication::translate("UIGDetails", "3D", "details (display)");
+        if (!acceleration.isEmpty())
+            table << UITextTableLine(QApplication::translate("UIGDetails", "Acceleration", "details (display)"),
+                                     acceleration.join(", "));
+
+        /* VRDE info: */
+        CVRDEServer srv = machine.GetVRDEServer();
+        if (!srv.isNull())
+        {
+            if (srv.GetEnabled())
+                table << UITextTableLine(QApplication::translate("UIGDetails", "Remote Desktop Server Port", "details (display/vrde)"),
+                                         srv.GetVRDEProperty("TCP/Ports"));
+            else
+                table << UITextTableLine(QApplication::translate("UIGDetails", "Remote Desktop Server", "details (display/vrde)"),
+                                         QApplication::translate("UIGDetails", "Disabled", "details (display/vrde/VRDE server)"));
+        }
+
+        /* Video Capture info: */
+        if (machine.GetVideoCaptureEnabled())
+        {
+            table << UITextTableLine(QApplication::translate("UIGDetails", "Video Capture File", "details (display/video capture)"),
+                                     machine.GetVideoCaptureFile());
+            table << UITextTableLine(QApplication::translate("UIGDetails", "Video Capture Attributes", "details (display/video capture)"),
+                                     QApplication::translate("UIGDetails", "Frame Size: %1x%2, Frame Rate: %3fps, Bit Rate: %4kbps")
+                                         .arg(machine.GetVideoCaptureWidth()).arg(machine.GetVideoCaptureHeight())
+                                         .arg(machine.GetVideoCaptureFPS()).arg(machine.GetVideoCaptureRate()));
+        }
+        else
+        {
+            table << UITextTableLine(QApplication::translate("UIGDetails", "Video Capture", "details (display/video capture)"),
+                                     QApplication::translate("UIGDetails", "Disabled", "details (display/video capture)"));
+        }
+    }
+    else
+        table << UITextTableLine(QApplication::translate("UIGDetails", "Information Inaccessible", "details"), QString());
+
+    /* Save the table as property: */
+    setProperty("table", QVariant::fromValue(table));
+}
+
+
+void UIGDetailsUpdateTaskStorage::run()
+{
+    /* Acquire corresponding machine: */
+    CMachine machine = property("machine").value<CMachine>();
+    if (machine.isNull())
+        return;
+
+    /* Prepare table: */
+    UITextTable table;
+
+    /* Gather information: */
+    if (machine.GetAccessible())
+    {
+        /* Iterate over all the machine controllers: */
+        bool fSomeInfo = false;
+        foreach (const CStorageController &controller, machine.GetStorageControllers())
+        {
+            /* Add controller information: */
+            QString strControllerName = QApplication::translate("UIMachineSettingsStorage", "Controller: %1");
+            table << UITextTableLine(strControllerName.arg(controller.GetName()), QString());
+            fSomeInfo = true;
+            /* Populate map (its sorted!): */
+            QMap<StorageSlot, QString> attachmentsMap;
+            foreach (const CMediumAttachment &attachment, machine.GetMediumAttachmentsOfController(controller.GetName()))
+            {
+                /* Prepare current storage slot: */
+                StorageSlot attachmentSlot(controller.GetBus(), attachment.GetPort(), attachment.GetDevice());
+                AssertMsg(controller.isOk(),
+                          ("Unable to acquire controller data: %s\n",
+                           msgCenter().formatRC(controller.lastRC()).toAscii().constData()));
+                if (!controller.isOk())
+                    continue;
+                /* Prepare attachment information: */
+                QString strAttachmentInfo = vboxGlobal().details(attachment.GetMedium(), false, false);
+                /* That temporary hack makes sure 'Inaccessible' word is always bold: */
+                { // hack
+                    QString strInaccessibleString(VBoxGlobal::tr("Inaccessible", "medium"));
+                    QString strBoldInaccessibleString(QString("<b>%1</b>").arg(strInaccessibleString));
+                    strAttachmentInfo.replace(strInaccessibleString, strBoldInaccessibleString);
+                } // hack
+                /* Append 'device slot name' with 'device type name' for optical devices only: */
+                KDeviceType deviceType = attachment.GetType();
+                QString strDeviceType = deviceType == KDeviceType_DVD ?
+                            QApplication::translate("UIGDetails", "[Optical Drive]", "details (storage)") : QString();
+                if (!strDeviceType.isNull())
+                    strDeviceType.append(' ');
+                /* Insert that attachment information into the map: */
+                if (!strAttachmentInfo.isNull())
                 {
-                    /* Trim first '/' symbol: */
-                    QString &strGroup = groups[i];
-                    if (strGroup.startsWith("/") && strGroup != "/")
-                        strGroup.remove(0, 1);
-                }
-                m_text << UITextTableLine(QApplication::translate("UIGDetails", "Groups", "details (general)"), groups.join(", "));
-            }
-        }
-        else
-            m_text << UITextTableLine(QApplication::translate("UIGDetails", "Information Inaccessible", "details"), QString());
-
-        /* Send information into GUI thread: */
-        emit sigComplete(m_text);
-    }
-
-    COMBase::CleanupCOM();
-}
-
-
-void UIGDetailsUpdateThreadSystem::run()
-{
-    COMBase::InitializeCOM(false);
-
-    if (!machine().isNull())
-    {
-        /* Prepare table: */
-        UITextTable m_text;
-
-        /* Gather information: */
-        if (machine().GetAccessible())
-        {
-            /* Base memory: */
-            m_text << UITextTableLine(QApplication::translate("UIGDetails", "Base Memory", "details (system)"),
-                                      QApplication::translate("UIGDetails", "%1 MB", "details").arg(machine().GetMemorySize()));
-
-            /* CPU count: */
-            int cCPU = machine().GetCPUCount();
-            if (cCPU > 1)
-                m_text << UITextTableLine(QApplication::translate("UIGDetails", "Processors", "details (system)"),
-                                          QString::number(cCPU));
-
-            /* CPU execution cap: */
-            int iCPUExecCap = machine().GetCPUExecutionCap();
-            if (iCPUExecCap < 100)
-                m_text << UITextTableLine(QApplication::translate("UIGDetails", "Execution Cap", "details (system)"),
-                                          QApplication::translate("UIGDetails", "%1%", "details").arg(iCPUExecCap));
-
-            /* Boot-order: */
-            QStringList bootOrder;
-            for (ulong i = 1; i <= vboxGlobal().virtualBox().GetSystemProperties().GetMaxBootPosition(); ++i)
-            {
-                KDeviceType device = machine().GetBootOrder(i);
-                if (device == KDeviceType_Null)
-                    continue;
-                bootOrder << gpConverter->toString(device);
-            }
-            if (bootOrder.isEmpty())
-                bootOrder << gpConverter->toString(KDeviceType_Null);
-            m_text << UITextTableLine(QApplication::translate("UIGDetails", "Boot Order", "details (system)"), bootOrder.join(", "));
-
-            /* Acceleration: */
-            QStringList acceleration;
-            if (vboxGlobal().virtualBox().GetHost().GetProcessorFeature(KProcessorFeature_HWVirtEx))
-            {
-                /* VT-x/AMD-V: */
-                if (machine().GetHWVirtExProperty(KHWVirtExPropertyType_Enabled))
-                {
-                    acceleration << QApplication::translate("UIGDetails", "VT-x/AMD-V", "details (system)");
-                    /* Nested Paging (only when hw virt is enabled): */
-                    if (machine().GetHWVirtExProperty(KHWVirtExPropertyType_NestedPaging))
-                        acceleration << QApplication::translate("UIGDetails", "Nested Paging", "details (system)");
+                    /* Configure hovering anchors: */
+                    const QString strAnchorType = deviceType == KDeviceType_DVD || deviceType == KDeviceType_Floppy ? QString("mount") :
+                                                  deviceType == KDeviceType_HardDisk ? QString("attach") : QString();
+                    const CMedium medium = attachment.GetMedium();
+                    const QString strMediumLocation = medium.isNull() ? QString() : medium.GetLocation();
+                    attachmentsMap.insert(attachmentSlot,
+                                          QString("<a href=#%1,%2,%3,%4>%5</a>")
+                                                  .arg(strAnchorType,
+                                                       controller.GetName(),
+                                                       gpConverter->toString(attachmentSlot),
+                                                       strMediumLocation,
+                                                       strDeviceType + strAttachmentInfo));
                 }
             }
-            if (machine().GetCPUProperty(KCPUPropertyType_PAE))
-                acceleration << QApplication::translate("UIGDetails", "PAE/NX", "details (system)");
-            switch (machine().GetEffectiveParavirtProvider())
+            /* Iterate over the sorted map: */
+            QList<StorageSlot> storageSlots = attachmentsMap.keys();
+            QList<QString> storageInfo = attachmentsMap.values();
+            for (int i = 0; i < storageSlots.size(); ++i)
+                table << UITextTableLine(QString("  ") + gpConverter->toString(storageSlots[i]), storageInfo[i]);
+        }
+        if (!fSomeInfo)
+            table << UITextTableLine(QApplication::translate("UIGDetails", "Not Attached", "details (storage)"), QString());
+    }
+    else
+        table << UITextTableLine(QApplication::translate("UIGDetails", "Information Inaccessible", "details"), QString());
+
+    /* Save the table as property: */
+    setProperty("table", QVariant::fromValue(table));
+}
+
+
+void UIGDetailsUpdateTaskAudio::run()
+{
+    /* Acquire corresponding machine: */
+    CMachine machine = property("machine").value<CMachine>();
+    if (machine.isNull())
+        return;
+
+    /* Prepare table: */
+    UITextTable table;
+
+    /* Gather information: */
+    if (machine.GetAccessible())
+    {
+        const CAudioAdapter &audio = machine.GetAudioAdapter();
+        if (audio.GetEnabled())
+        {
+            /* Driver: */
+            table << UITextTableLine(QApplication::translate("UIGDetails", "Host Driver", "details (audio)"),
+                                     gpConverter->toString(audio.GetAudioDriver()));
+
+            /* Controller: */
+            table << UITextTableLine(QApplication::translate("UIGDetails", "Controller", "details (audio)"),
+                                     gpConverter->toString(audio.GetAudioController()));
+        }
+        else
+            table << UITextTableLine(QApplication::translate("UIGDetails", "Disabled", "details (audio)"),
+                                     QString());
+    }
+    else
+        table << UITextTableLine(QApplication::translate("UIGDetails", "Information Inaccessible", "details"),
+                                 QString());
+
+    /* Save the table as property: */
+    setProperty("table", QVariant::fromValue(table));
+}
+
+
+void UIGDetailsUpdateTaskNetwork::run()
+{
+    /* Acquire corresponding machine: */
+    CMachine machine = property("machine").value<CMachine>();
+    if (machine.isNull())
+        return;
+
+    /* Prepare table: */
+    UITextTable table;
+
+    /* Gather information: */
+    if (machine.GetAccessible())
+    {
+        /* Iterate over all the adapters: */
+        bool fSomeInfo = false;
+        ulong uSount = vboxGlobal().virtualBox().GetSystemProperties().GetMaxNetworkAdapters(KChipsetType_PIIX3);
+        for (ulong uSlot = 0; uSlot < uSount; ++uSlot)
+        {
+            const CNetworkAdapter &adapter = machine.GetNetworkAdapter(uSlot);
+            if (adapter.GetEnabled())
             {
-                case KParavirtProvider_Minimal: acceleration << QApplication::translate("UIGDetails", "Minimal Paravirtualization", "details (system)"); break;
-                case KParavirtProvider_HyperV:  acceleration << QApplication::translate("UIGDetails", "Hyper-V Paravirtualization", "details (system)"); break;
-                case KParavirtProvider_KVM:     acceleration << QApplication::translate("UIGDetails", "KVM Paravirtualization", "details (system)"); break;
-                default: break;
-            }
-            if (!acceleration.isEmpty())
-                m_text << UITextTableLine(QApplication::translate("UIGDetails", "Acceleration", "details (system)"),
-                                          acceleration.join(", "));
-        }
-        else
-            m_text << UITextTableLine(QApplication::translate("UIGDetails", "Information Inaccessible", "details"),
-                                      QString());
-
-        /* Send information into GUI thread: */
-        emit sigComplete(m_text);
-    }
-
-    COMBase::CleanupCOM();
-}
-
-
-void UIGDetailsUpdateThreadDisplay::run()
-{
-    COMBase::InitializeCOM(false);
-
-    if (!machine().isNull())
-    {
-        /* Prepare table: */
-        UITextTable m_text;
-
-        /* Gather information: */
-        if (machine().GetAccessible())
-        {
-            /* Damn GetExtraData should be const already :( */
-            CMachine localMachine = machine();
-
-            /* Video memory: */
-            m_text << UITextTableLine(QApplication::translate("UIGDetails", "Video Memory", "details (display)"),
-                                      QApplication::translate("UIGDetails", "%1 MB", "details").arg(localMachine.GetVRAMSize()));
-
-            /* Screen count: */
-            int cGuestScreens = localMachine.GetMonitorCount();
-            if (cGuestScreens > 1)
-                m_text << UITextTableLine(QApplication::translate("UIGDetails", "Screens", "details (display)"),
-                                          QString::number(cGuestScreens));
-
-            /* Get scale-factor value: */
-            const QString strScaleFactor = localMachine.GetExtraData(UIExtraDataDefs::GUI_ScaleFactor);
-            {
-                /* Try to convert loaded data to double: */
-                bool fOk = false;
-                double dValue = strScaleFactor.toDouble(&fOk);
-                /* Invent the default value: */
-                if (!fOk || !dValue)
-                    dValue = 1.0;
-                /* Append information: */
-                if (dValue != 1.0)
-                    m_text << UITextTableLine(QApplication::translate("UIGDetails", "Scale-factor", "details (display)"),
-                                              QString::number(dValue, 'f', 2));
-            }
-
-#ifdef Q_WS_MAC
-            /* Get 'Unscaled HiDPI Video Output' mode value: */
-            const QString strUnscaledHiDPIMode = localMachine.GetExtraData(UIExtraDataDefs::GUI_HiDPI_UnscaledOutput);
-            {
-                /* Try to convert loaded data to bool: */
-                const bool fEnabled  = strUnscaledHiDPIMode.compare("true", Qt::CaseInsensitive) == 0 ||
-                                       strUnscaledHiDPIMode.compare("yes", Qt::CaseInsensitive) == 0 ||
-                                       strUnscaledHiDPIMode.compare("on", Qt::CaseInsensitive) == 0 ||
-                                       strUnscaledHiDPIMode == "1";
-                /* Append information: */
-                if (fEnabled)
-                    m_text << UITextTableLine(QApplication::translate("UIGDetails", "Unscaled HiDPI Video Output", "details (display)"),
-                                              QApplication::translate("UIGDetails", "Enabled", "details (display/Unscaled HiDPI Video Output)"));
-            }
-#endif /* Q_WS_MAC */
-
-            QStringList acceleration;
-#ifdef VBOX_WITH_VIDEOHWACCEL
-            /* 2D acceleration: */
-            if (localMachine.GetAccelerate2DVideoEnabled())
-                acceleration << QApplication::translate("UIGDetails", "2D Video", "details (display)");
-#endif /* VBOX_WITH_VIDEOHWACCEL */
-            /* 3D acceleration: */
-            if (localMachine.GetAccelerate3DEnabled())
-                acceleration << QApplication::translate("UIGDetails", "3D", "details (display)");
-            if (!acceleration.isEmpty())
-                m_text << UITextTableLine(QApplication::translate("UIGDetails", "Acceleration", "details (display)"),
-                                          acceleration.join(", "));
-
-            /* VRDE info: */
-            CVRDEServer srv = localMachine.GetVRDEServer();
-            if (!srv.isNull())
-            {
-                if (srv.GetEnabled())
-                    m_text << UITextTableLine(QApplication::translate("UIGDetails", "Remote Desktop Server Port", "details (display/vrde)"),
-                                              srv.GetVRDEProperty("TCP/Ports"));
-                else
-                    m_text << UITextTableLine(QApplication::translate("UIGDetails", "Remote Desktop Server", "details (display/vrde)"),
-                                              QApplication::translate("UIGDetails", "Disabled", "details (display/vrde/VRDE server)"));
-            }
-
-            /* Video Capture info: */
-            if (localMachine.GetVideoCaptureEnabled())
-            {
-                m_text << UITextTableLine(QApplication::translate("UIGDetails", "Video Capture File", "details (display/video capture)"),
-                                          localMachine.GetVideoCaptureFile());
-                m_text << UITextTableLine(QApplication::translate("UIGDetails", "Video Capture Attributes", "details (display/video capture)"),
-                                          QApplication::translate("UIGDetails", "Frame Size: %1x%2, Frame Rate: %3fps, Bit Rate: %4kbps")
-                                             .arg(localMachine.GetVideoCaptureWidth()).arg(localMachine.GetVideoCaptureHeight())
-                                             .arg(localMachine.GetVideoCaptureFPS()).arg(localMachine.GetVideoCaptureRate()));
-            }
-            else
-            {
-                m_text << UITextTableLine(QApplication::translate("UIGDetails", "Video Capture", "details (display/video capture)"),
-                                          QApplication::translate("UIGDetails", "Disabled", "details (display/video capture)"));
-            }
-        }
-        else
-            m_text << UITextTableLine(QApplication::translate("UIGDetails", "Information Inaccessible", "details"), QString());
-
-        /* Send information into GUI thread: */
-        emit sigComplete(m_text);
-    }
-
-    COMBase::CleanupCOM();
-}
-
-
-void UIGDetailsUpdateThreadStorage::run()
-{
-    COMBase::InitializeCOM(false);
-
-    if (!machine().isNull())
-    {
-        /* Prepare table: */
-        UITextTable m_text;
-
-        /* Gather information: */
-        if (machine().GetAccessible())
-        {
-            /* Iterate over all the machine controllers: */
-            bool fSomeInfo = false;
-            foreach (const CStorageController &controller, machine().GetStorageControllers())
-            {
-                /* Add controller information: */
-                QString strControllerName = QApplication::translate("UIMachineSettingsStorage", "Controller: %1");
-                m_text << UITextTableLine(strControllerName.arg(controller.GetName()), QString());
-                fSomeInfo = true;
-                /* Populate map (its sorted!): */
-                QMap<StorageSlot, QString> attachmentsMap;
-                foreach (const CMediumAttachment &attachment, machine().GetMediumAttachmentsOfController(controller.GetName()))
+                KNetworkAttachmentType type = adapter.GetAttachmentType();
+                QString strAttachmentType = gpConverter->toString(adapter.GetAdapterType())
+                                            .replace(QRegExp("\\s\\(.+\\)"), " (%1)");
+                switch (type)
                 {
-                    /* Prepare current storage slot: */
-                    StorageSlot attachmentSlot(controller.GetBus(), attachment.GetPort(), attachment.GetDevice());
-                    AssertMsg(controller.isOk(),
-                              ("Unable to acquire controller data: %s\n",
-                               msgCenter().formatRC(controller.lastRC()).toAscii().constData()));
-                    if (!controller.isOk())
-                        continue;
-                    /* Prepare attachment information: */
-                    QString strAttachmentInfo = vboxGlobal().details(attachment.GetMedium(), false, false);
-                    /* That temporary hack makes sure 'Inaccessible' word is always bold: */
-                    { // hack
-                        QString strInaccessibleString(VBoxGlobal::tr("Inaccessible", "medium"));
-                        QString strBoldInaccessibleString(QString("<b>%1</b>").arg(strInaccessibleString));
-                        strAttachmentInfo.replace(strInaccessibleString, strBoldInaccessibleString);
-                    } // hack
-                    /* Append 'device slot name' with 'device type name' for optical devices only: */
-                    KDeviceType deviceType = attachment.GetType();
-                    QString strDeviceType = deviceType == KDeviceType_DVD ?
-                                QApplication::translate("UIGDetails", "[Optical Drive]", "details (storage)") : QString();
-                    if (!strDeviceType.isNull())
-                        strDeviceType.append(' ');
-                    /* Insert that attachment information into the map: */
-                    if (!strAttachmentInfo.isNull())
+                    case KNetworkAttachmentType_Bridged:
                     {
-                        /* Configure hovering anchors: */
-                        const QString strAnchorType = deviceType == KDeviceType_DVD || deviceType == KDeviceType_Floppy ? QString("mount") :
-                                                      deviceType == KDeviceType_HardDisk ? QString("attach") : QString();
-                        const CMedium medium = attachment.GetMedium();
-                        const QString strMediumLocation = medium.isNull() ? QString() : medium.GetLocation();
-                        attachmentsMap.insert(attachmentSlot,
-                                              QString("<a href=#%1,%2,%3,%4>%5</a>")
-                                                      .arg(strAnchorType,
-                                                           controller.GetName(),
-                                                           gpConverter->toString(attachmentSlot),
-                                                           strMediumLocation,
-                                                           strDeviceType + strAttachmentInfo));
+                        strAttachmentType = strAttachmentType.arg(QApplication::translate("UIGDetails", "Bridged Adapter, %1", "details (network)")
+                                                                  .arg(adapter.GetBridgedInterface()));
+                        break;
+                    }
+                    case KNetworkAttachmentType_Internal:
+                    {
+                        strAttachmentType = strAttachmentType.arg(QApplication::translate("UIGDetails", "Internal Network, '%1'", "details (network)")
+                                                                  .arg(adapter.GetInternalNetwork()));
+                        break;
+                    }
+                    case KNetworkAttachmentType_HostOnly:
+                    {
+                        strAttachmentType = strAttachmentType.arg(QApplication::translate("UIGDetails", "Host-only Adapter, '%1'", "details (network)")
+                                                                  .arg(adapter.GetHostOnlyInterface()));
+                        break;
+                    }
+                    case KNetworkAttachmentType_Generic:
+                    {
+                        QString strGenericDriverProperties(summarizeGenericProperties(adapter));
+                        strAttachmentType = strGenericDriverProperties.isNull() ?
+                                  strAttachmentType.arg(QApplication::translate("UIGDetails", "Generic Driver, '%1'", "details (network)").arg(adapter.GetGenericDriver())) :
+                                  strAttachmentType.arg(QApplication::translate("UIGDetails", "Generic Driver, '%1' { %2 }", "details (network)")
+                                                        .arg(adapter.GetGenericDriver(), strGenericDriverProperties));
+                        break;
+                    }
+                    case KNetworkAttachmentType_NATNetwork:
+                    {
+                        strAttachmentType = strAttachmentType.arg(QApplication::translate("UIGDetails", "NAT Network, '%1'", "details (network)")
+                                                                  .arg(adapter.GetNATNetwork()));
+                        break;
+                    }
+                    default:
+                    {
+                        strAttachmentType = strAttachmentType.arg(gpConverter->toString(type));
+                        break;
                     }
                 }
-                /* Iterate over the sorted map: */
-                QList<StorageSlot> storageSlots = attachmentsMap.keys();
-                QList<QString> storageInfo = attachmentsMap.values();
-                for (int i = 0; i < storageSlots.size(); ++i)
-                    m_text << UITextTableLine(QString("  ") + gpConverter->toString(storageSlots[i]), storageInfo[i]);
+                table << UITextTableLine(QApplication::translate("UIGDetails", "Adapter %1", "details (network)").arg(adapter.GetSlot() + 1), strAttachmentType);
+                fSomeInfo = true;
             }
-            if (!fSomeInfo)
-                m_text << UITextTableLine(QApplication::translate("UIGDetails", "Not Attached", "details (storage)"), QString());
-        }
-        else
-            m_text << UITextTableLine(QApplication::translate("UIGDetails", "Information Inaccessible", "details"), QString());
-
-        /* Send information into GUI thread: */
-        emit sigComplete(m_text);
-    }
-
-    COMBase::CleanupCOM();
-}
-
-
-void UIGDetailsUpdateThreadAudio::run()
-{
-    COMBase::InitializeCOM(false);
-
-    if (!machine().isNull())
-    {
-        /* Prepare table: */
-        UITextTable m_text;
-
-        /* Gather information: */
-        if (machine().GetAccessible())
-        {
-            const CAudioAdapter &audio = machine().GetAudioAdapter();
-            if (audio.GetEnabled())
-            {
-                /* Driver: */
-                m_text << UITextTableLine(QApplication::translate("UIGDetails", "Host Driver", "details (audio)"),
-                                          gpConverter->toString(audio.GetAudioDriver()));
-
-                /* Controller: */
-                m_text << UITextTableLine(QApplication::translate("UIGDetails", "Controller", "details (audio)"),
-                                          gpConverter->toString(audio.GetAudioController()));
-            }
-            else
-                m_text << UITextTableLine(QApplication::translate("UIGDetails", "Disabled", "details (audio)"),
-                                          QString());
-        }
-        else
-            m_text << UITextTableLine(QApplication::translate("UIGDetails", "Information Inaccessible", "details"),
-                                      QString());
-
-        /* Send information into GUI thread: */
-        emit sigComplete(m_text);
-    }
-
-    COMBase::CleanupCOM();
-}
-
-
-void UIGDetailsUpdateThreadNetwork::run()
-{
-    COMBase::InitializeCOM(false);
-
-    if (!machine().isNull())
-    {
-        /* Prepare table: */
-        UITextTable m_text;
-
-        /* Gather information: */
-        if (machine().GetAccessible())
-        {
-            /* Iterate over all the adapters: */
-            bool fSomeInfo = false;
-            ulong uSount = vboxGlobal().virtualBox().GetSystemProperties().GetMaxNetworkAdapters(KChipsetType_PIIX3);
-            for (ulong uSlot = 0; uSlot < uSount; ++uSlot)
-            {
-                const CNetworkAdapter &adapter = machine().GetNetworkAdapter(uSlot);
-                if (adapter.GetEnabled())
-                {
-                    KNetworkAttachmentType type = adapter.GetAttachmentType();
-                    QString strAttachmentType = gpConverter->toString(adapter.GetAdapterType())
-                                                .replace(QRegExp("\\s\\(.+\\)"), " (%1)");
-                    switch (type)
-                    {
-                        case KNetworkAttachmentType_Bridged:
-                        {
-                            strAttachmentType = strAttachmentType.arg(QApplication::translate("UIGDetails", "Bridged Adapter, %1", "details (network)")
-                                                                      .arg(adapter.GetBridgedInterface()));
-                            break;
-                        }
-                        case KNetworkAttachmentType_Internal:
-                        {
-                            strAttachmentType = strAttachmentType.arg(QApplication::translate("UIGDetails", "Internal Network, '%1'", "details (network)")
-                                                                      .arg(adapter.GetInternalNetwork()));
-                            break;
-                        }
-                        case KNetworkAttachmentType_HostOnly:
-                        {
-                            strAttachmentType = strAttachmentType.arg(QApplication::translate("UIGDetails", "Host-only Adapter, '%1'", "details (network)")
-                                                                      .arg(adapter.GetHostOnlyInterface()));
-                            break;
-                        }
-                        case KNetworkAttachmentType_Generic:
-                        {
-                            QString strGenericDriverProperties(summarizeGenericProperties(adapter));
-                            strAttachmentType = strGenericDriverProperties.isNull() ?
-                                      strAttachmentType.arg(QApplication::translate("UIGDetails", "Generic Driver, '%1'", "details (network)").arg(adapter.GetGenericDriver())) :
-                                      strAttachmentType.arg(QApplication::translate("UIGDetails", "Generic Driver, '%1' { %2 }", "details (network)")
-                                                            .arg(adapter.GetGenericDriver(), strGenericDriverProperties));
-                            break;
-                        }
-                        case KNetworkAttachmentType_NATNetwork:
-                        {
-                            strAttachmentType = strAttachmentType.arg(QApplication::translate("UIGDetails", "NAT Network, '%1'", "details (network)")
-                                                                      .arg(adapter.GetNATNetwork()));
-                            break;
-                        }
-                        default:
-                        {
-                            strAttachmentType = strAttachmentType.arg(gpConverter->toString(type));
-                            break;
-                        }
-                    }
-                    m_text << UITextTableLine(QApplication::translate("UIGDetails", "Adapter %1", "details (network)").arg(adapter.GetSlot() + 1), strAttachmentType);
-                    fSomeInfo = true;
-                }
-            }
-            if (!fSomeInfo)
-                m_text << UITextTableLine(QApplication::translate("UIGDetails", "Disabled", "details (network/adapter)"), QString());
-        }
-        else
-            m_text << UITextTableLine(QApplication::translate("UIGDetails", "Information Inaccessible", "details"), QString());
-
-        /* Send information into GUI thread: */
-        emit sigComplete(m_text);
-    }
-
-    COMBase::CleanupCOM();
+        }
+        if (!fSomeInfo)
+            table << UITextTableLine(QApplication::translate("UIGDetails", "Disabled", "details (network/adapter)"), QString());
+    }
+    else
+        table << UITextTableLine(QApplication::translate("UIGDetails", "Information Inaccessible", "details"), QString());
+
+    /* Save the table as property: */
+    setProperty("table", QVariant::fromValue(table));
 }
 
 /* static */
-QString UIGDetailsUpdateThreadNetwork::summarizeGenericProperties(const CNetworkAdapter &adapter)
+QString UIGDetailsUpdateTaskNetwork::summarizeGenericProperties(const CNetworkAdapter &adapter)
 {
     QVector<QString> names;
@@ -682,293 +682,278 @@
 
 
-void UIGDetailsUpdateThreadSerial::run()
-{
-    COMBase::InitializeCOM(false);
-
-    if (!machine().isNull())
-    {
-        /* Prepare table: */
-        UITextTable m_text;
-
-        /* Gather information: */
-        if (machine().GetAccessible())
-        {
-            /* Iterate over all the ports: */
-            bool fSomeInfo = false;
-            ulong uCount = vboxGlobal().virtualBox().GetSystemProperties().GetSerialPortCount();
-            for (ulong uSlot = 0; uSlot < uCount; ++uSlot)
+void UIGDetailsUpdateTaskSerial::run()
+{
+    /* Acquire corresponding machine: */
+    CMachine machine = property("machine").value<CMachine>();
+    if (machine.isNull())
+        return;
+
+    /* Prepare table: */
+    UITextTable table;
+
+    /* Gather information: */
+    if (machine.GetAccessible())
+    {
+        /* Iterate over all the ports: */
+        bool fSomeInfo = false;
+        ulong uCount = vboxGlobal().virtualBox().GetSystemProperties().GetSerialPortCount();
+        for (ulong uSlot = 0; uSlot < uCount; ++uSlot)
+        {
+            const CSerialPort &port = machine.GetSerialPort(uSlot);
+            if (port.GetEnabled())
             {
-                const CSerialPort &port = machine().GetSerialPort(uSlot);
-                if (port.GetEnabled())
+                KPortMode mode = port.GetHostMode();
+                QString data = vboxGlobal().toCOMPortName(port.GetIRQ(), port.GetIOBase()) + ", ";
+                if (mode == KPortMode_HostPipe || mode == KPortMode_HostDevice ||
+                    mode == KPortMode_RawFile || mode == KPortMode_TCP)
+                    data += QString("%1 (%2)").arg(gpConverter->toString(mode)).arg(QDir::toNativeSeparators(port.GetPath()));
+                else
+                    data += gpConverter->toString(mode);
+                table << UITextTableLine(QApplication::translate("UIGDetails", "Port %1", "details (serial)").arg(port.GetSlot() + 1), data);
+                fSomeInfo = true;
+            }
+        }
+        if (!fSomeInfo)
+            table << UITextTableLine(QApplication::translate("UIGDetails", "Disabled", "details (serial)"), QString());
+    }
+    else
+        table << UITextTableLine(QApplication::translate("UIGDetails", "Information Inaccessible", "details"), QString());
+
+    /* Save the table as property: */
+    setProperty("table", QVariant::fromValue(table));
+}
+
+
+#ifdef VBOX_WITH_PARALLEL_PORTS
+void UIGDetailsUpdateTaskParallel::run()
+{
+    /* Acquire corresponding machine: */
+    CMachine machine = property("machine").value<CMachine>();
+    if (machine.isNull())
+        return;
+
+    /* Prepare table: */
+    UITextTable table;
+
+    /* Gather information: */
+    if (machine.GetAccessible())
+    {
+        bool fSomeInfo = false;
+        ulong uCount = vboxGlobal().virtualBox().GetSystemProperties().GetParallelPortCount();
+        for (ulong uSlot = 0; uSlot < uCount; ++uSlot)
+        {
+            const CParallelPort &port = machine.GetParallelPort(uSlot);
+            if (port.GetEnabled())
+            {
+                QString data = vboxGlobal().toLPTPortName(port.GetIRQ(), port.GetIOBase()) +
+                               QString(" (<nobr>%1</nobr>)").arg(QDir::toNativeSeparators(port.GetPath()));
+                table << UITextTableLine(QApplication::translate("UIGDetails", "Port %1", "details (parallel)").arg(port.GetSlot() + 1), data);
+                fSomeInfo = true;
+            }
+        }
+        if (!fSomeInfo)
+            table << UITextTableLine(QApplication::translate("UIGDetails", "Disabled", "details (parallel)"), QString());
+    }
+    else
+        table << UITextTableLine(QApplication::translate("UIGDetails", "Information Inaccessible", "details"), QString());
+
+    /* Save the table as property: */
+    setProperty("table", QVariant::fromValue(table));
+}
+#endif /* VBOX_WITH_PARALLEL_PORTS */
+
+
+void UIGDetailsUpdateTaskUSB::run()
+{
+    /* Acquire corresponding machine: */
+    CMachine machine = property("machine").value<CMachine>();
+    if (machine.isNull())
+        return;
+
+    /* Prepare table: */
+    UITextTable table;
+
+    /* Gather information: */
+    if (machine.GetAccessible())
+    {
+        /* Iterate over all the USB filters: */
+        const CUSBDeviceFilters &filters = machine.GetUSBDeviceFilters();
+        if (!filters.isNull() && machine.GetUSBProxyAvailable())
+        {
+            const CUSBDeviceFilters flts = machine.GetUSBDeviceFilters();
+            const CUSBControllerVector controllers = machine.GetUSBControllers();
+            if (!flts.isNull() && !controllers.isEmpty())
+            {
+                /* USB Controllers info: */
+                QStringList controllerList;
+                foreach (const CUSBController &controller, controllers)
+                    controllerList << gpConverter->toString(controller.GetType());
+                table << UITextTableLine(QApplication::translate("UIGDetails", "USB Controller", "details (usb)"),
+                                          controllerList.join(", "));
+                /* USB Device Filters info: */
+                const CUSBDeviceFilterVector &coll = flts.GetDeviceFilters();
+                uint uActive = 0;
+                for (int i = 0; i < coll.size(); ++i)
+                    if (coll[i].GetActive())
+                        ++uActive;
+                table << UITextTableLine(QApplication::translate("UIGDetails", "Device Filters", "details (usb)"),
+                                         QApplication::translate("UIGDetails", "%1 (%2 active)", "details (usb)").arg(coll.size()).arg(uActive));
+            }
+            else
+                table << UITextTableLine(QApplication::translate("UIGDetails", "Disabled", "details (usb)"), QString());
+        }
+        else
+            table << UITextTableLine(QApplication::translate("UIGDetails", "USB Controller Inaccessible", "details (usb)"), QString());
+    }
+    else
+        table << UITextTableLine(QApplication::translate("UIGDetails", "Information Inaccessible", "details"), QString());
+
+    /* Save the table as property: */
+    setProperty("table", QVariant::fromValue(table));
+}
+
+
+void UIGDetailsUpdateTaskSF::run()
+{
+    /* Acquire corresponding machine: */
+    CMachine machine = property("machine").value<CMachine>();
+    if (machine.isNull())
+        return;
+
+    /* Prepare table: */
+    UITextTable table;
+
+    /* Gather information: */
+    if (machine.GetAccessible())
+    {
+        /* Iterate over all the shared folders: */
+        ulong uCount = machine.GetSharedFolders().size();
+        if (uCount > 0)
+            table << UITextTableLine(QApplication::translate("UIGDetails", "Shared Folders", "details (shared folders)"), QString::number(uCount));
+        else
+            table << UITextTableLine(QApplication::translate("UIGDetails", "None", "details (shared folders)"), QString());
+    }
+    else
+        table << UITextTableLine(QApplication::translate("UIGDetails", "Information Inaccessible", "details"), QString());
+
+    /* Save the table as property: */
+    setProperty("table", QVariant::fromValue(table));
+}
+
+
+void UIGDetailsUpdateTaskUI::run()
+{
+    /* Acquire corresponding machine: */
+    CMachine machine = property("machine").value<CMachine>();
+    if (machine.isNull())
+        return;
+
+    /* Prepare table: */
+    UITextTable table;
+
+    /* Gather information: */
+    if (machine.GetAccessible())
+    {
+#ifndef Q_WS_MAC
+        /* Get menu-bar availability status: */
+        const QString strMenubarEnabled = machine.GetExtraData(UIExtraDataDefs::GUI_MenuBar_Enabled);
+        {
+            /* Try to convert loaded data to bool: */
+            const bool fEnabled = !(strMenubarEnabled.compare("false", Qt::CaseInsensitive) == 0 ||
+                                    strMenubarEnabled.compare("no", Qt::CaseInsensitive) == 0 ||
+                                    strMenubarEnabled.compare("off", Qt::CaseInsensitive) == 0 ||
+                                    strMenubarEnabled == "0");
+            /* Append information: */
+            table << UITextTableLine(QApplication::translate("UIGDetails", "Menu-bar", "details (user interface)"),
+                                     fEnabled ? QApplication::translate("UIGDetails", "Enabled", "details (user interface/menu-bar)") :
+                                                QApplication::translate("UIGDetails", "Disabled", "details (user interface/menu-bar)"));
+        }
+#endif /* !Q_WS_MAC */
+
+        /* Get status-bar availability status: */
+        const QString strStatusbarEnabled = machine.GetExtraData(UIExtraDataDefs::GUI_StatusBar_Enabled);
+        {
+            /* Try to convert loaded data to bool: */
+            const bool fEnabled = !(strStatusbarEnabled.compare("false", Qt::CaseInsensitive) == 0 ||
+                                    strStatusbarEnabled.compare("no", Qt::CaseInsensitive) == 0 ||
+                                    strStatusbarEnabled.compare("off", Qt::CaseInsensitive) == 0 ||
+                                    strStatusbarEnabled == "0");
+            /* Append information: */
+            table << UITextTableLine(QApplication::translate("UIGDetails", "Status-bar", "details (user interface)"),
+                                     fEnabled ? QApplication::translate("UIGDetails", "Enabled", "details (user interface/status-bar)") :
+                                                QApplication::translate("UIGDetails", "Disabled", "details (user interface/status-bar)"));
+        }
+
+#ifndef Q_WS_MAC
+        /* Get mini-toolbar availability status: */
+        const QString strMiniToolbarEnabled = machine.GetExtraData(UIExtraDataDefs::GUI_ShowMiniToolBar);
+        {
+            /* Try to convert loaded data to bool: */
+            const bool fEnabled = !(strMiniToolbarEnabled.compare("false", Qt::CaseInsensitive) == 0 ||
+                                    strMiniToolbarEnabled.compare("no", Qt::CaseInsensitive) == 0 ||
+                                    strMiniToolbarEnabled.compare("off", Qt::CaseInsensitive) == 0 ||
+                                    strMiniToolbarEnabled == "0");
+            /* Append information: */
+            if (fEnabled)
+            {
+                /* Get mini-toolbar position: */
+                const QString &strMiniToolbarPosition = machine.GetExtraData(UIExtraDataDefs::GUI_MiniToolBarAlignment);
                 {
-                    KPortMode mode = port.GetHostMode();
-                    QString data = vboxGlobal().toCOMPortName(port.GetIRQ(), port.GetIOBase()) + ", ";
-                    if (mode == KPortMode_HostPipe || mode == KPortMode_HostDevice ||
-                        mode == KPortMode_RawFile || mode == KPortMode_TCP)
-                        data += QString("%1 (%2)").arg(gpConverter->toString(mode)).arg(QDir::toNativeSeparators(port.GetPath()));
-                    else
-                        data += gpConverter->toString(mode);
-                    m_text << UITextTableLine(QApplication::translate("UIGDetails", "Port %1", "details (serial)").arg(port.GetSlot() + 1), data);
-                    fSomeInfo = true;
+                    /* Try to convert loaded data to alignment: */
+                    switch (gpConverter->fromInternalString<MiniToolbarAlignment>(strMiniToolbarPosition))
+                    {
+                        /* Append information: */
+                        case MiniToolbarAlignment_Top:
+                            table << UITextTableLine(QApplication::translate("UIGDetails", "Mini-toolbar Position", "details (user interface)"),
+                                                     QApplication::translate("UIGDetails", "Top", "details (user interface/mini-toolbar position)"));
+                            break;
+                        /* Append information: */
+                        case MiniToolbarAlignment_Bottom:
+                            table << UITextTableLine(QApplication::translate("UIGDetails", "Mini-toolbar Position", "details (user interface)"),
+                                                     QApplication::translate("UIGDetails", "Bottom", "details (user interface/mini-toolbar position)"));
+                            break;
+                    }
                 }
             }
-            if (!fSomeInfo)
-                m_text << UITextTableLine(QApplication::translate("UIGDetails", "Disabled", "details (serial)"), QString());
-        }
+            /* Append information: */
+            else
+                table << UITextTableLine(QApplication::translate("UIGDetails", "Mini-toolbar", "details (user interface)"),
+                                         QApplication::translate("UIGDetails", "Disabled", "details (user interface/mini-toolbar)"));
+        }
+#endif /* !Q_WS_MAC */
+    }
+    else
+        table << UITextTableLine(QApplication::translate("UIGDetails", "Information Inaccessible", "details"), QString());
+
+    /* Save the table as property: */
+    setProperty("table", QVariant::fromValue(table));
+}
+
+
+void UIGDetailsUpdateTaskDescription::run()
+{
+    /* Acquire corresponding machine: */
+    CMachine machine = property("machine").value<CMachine>();
+    if (machine.isNull())
+        return;
+
+    /* Prepare table: */
+    UITextTable table;
+
+    /* Gather information: */
+    if (machine.GetAccessible())
+    {
+        /* Get description: */
+        const QString &strDesc = machine.GetDescription();
+        if (!strDesc.isEmpty())
+            table << UITextTableLine(strDesc, QString());
         else
-            m_text << UITextTableLine(QApplication::translate("UIGDetails", "Information Inaccessible", "details"), QString());
-
-        /* Send information into GUI thread: */
-        emit sigComplete(m_text);
-    }
-
-    COMBase::CleanupCOM();
-}
-
-
-#ifdef VBOX_WITH_PARALLEL_PORTS
-void UIGDetailsUpdateThreadParallel::run()
-{
-    COMBase::InitializeCOM(false);
-
-    if (!machine().isNull())
-    {
-        /* Prepare table: */
-        UITextTable m_text;
-
-        /* Gather information: */
-        if (machine().GetAccessible())
-        {
-            bool fSomeInfo = false;
-            ulong uCount = vboxGlobal().virtualBox().GetSystemProperties().GetParallelPortCount();
-            for (ulong uSlot = 0; uSlot < uCount; ++uSlot)
-            {
-                const CParallelPort &port = machine().GetParallelPort(uSlot);
-                if (port.GetEnabled())
-                {
-                    QString data = vboxGlobal().toLPTPortName(port.GetIRQ(), port.GetIOBase()) +
-                                   QString(" (<nobr>%1</nobr>)").arg(QDir::toNativeSeparators(port.GetPath()));
-                    m_text << UITextTableLine(QApplication::translate("UIGDetails", "Port %1", "details (parallel)").arg(port.GetSlot() + 1), data);
-                    fSomeInfo = true;
-                }
-            }
-            if (!fSomeInfo)
-                m_text << UITextTableLine(QApplication::translate("UIGDetails", "Disabled", "details (parallel)"), QString());
-        }
-        else
-            m_text << UITextTableLine(QApplication::translate("UIGDetails", "Information Inaccessible", "details"), QString());
-
-        /* Send information into GUI thread: */
-        emit sigComplete(m_text);
-    }
-
-    COMBase::CleanupCOM();
-}
-#endif /* VBOX_WITH_PARALLEL_PORTS */
-
-
-void UIGDetailsUpdateThreadUSB::run()
-{
-    COMBase::InitializeCOM(false);
-
-    if (!machine().isNull())
-    {
-        /* Prepare table: */
-        UITextTable m_text;
-
-        /* Gather information: */
-        if (machine().GetAccessible())
-        {
-            /* Iterate over all the USB filters: */
-            const CUSBDeviceFilters &filters = machine().GetUSBDeviceFilters();
-            if (!filters.isNull() && machine().GetUSBProxyAvailable())
-            {
-                const CUSBDeviceFilters flts = machine().GetUSBDeviceFilters();
-                const CUSBControllerVector controllers = machine().GetUSBControllers();
-                if (!flts.isNull() && !controllers.isEmpty())
-                {
-                    /* USB Controllers info: */
-                    QStringList controllerList;
-                    foreach (const CUSBController &controller, controllers)
-                        controllerList << gpConverter->toString(controller.GetType());
-                    m_text << UITextTableLine(QApplication::translate("UIGDetails", "USB Controller", "details (usb)"),
-                                              controllerList.join(", "));
-                    /* USB Device Filters info: */
-                    const CUSBDeviceFilterVector &coll = flts.GetDeviceFilters();
-                    uint uActive = 0;
-                    for (int i = 0; i < coll.size(); ++i)
-                        if (coll[i].GetActive())
-                            ++uActive;
-                    m_text << UITextTableLine(QApplication::translate("UIGDetails", "Device Filters", "details (usb)"),
-                                              QApplication::translate("UIGDetails", "%1 (%2 active)", "details (usb)").arg(coll.size()).arg(uActive));
-                }
-                else
-                    m_text << UITextTableLine(QApplication::translate("UIGDetails", "Disabled", "details (usb)"), QString());
-            }
-            else
-                m_text << UITextTableLine(QApplication::translate("UIGDetails", "USB Controller Inaccessible", "details (usb)"), QString());
-        }
-        else
-            m_text << UITextTableLine(QApplication::translate("UIGDetails", "Information Inaccessible", "details"), QString());
-
-        /* Send information into GUI thread: */
-        emit sigComplete(m_text);
-    }
-
-    COMBase::CleanupCOM();
-}
-
-
-void UIGDetailsUpdateThreadSF::run()
-{
-    COMBase::InitializeCOM(false);
-
-    if (!machine().isNull())
-    {
-        /* Prepare table: */
-        UITextTable m_text;
-
-        /* Gather information: */
-        if (machine().GetAccessible())
-        {
-            /* Iterate over all the shared folders: */
-            ulong uCount = machine().GetSharedFolders().size();
-            if (uCount > 0)
-                m_text << UITextTableLine(QApplication::translate("UIGDetails", "Shared Folders", "details (shared folders)"), QString::number(uCount));
-            else
-                m_text << UITextTableLine(QApplication::translate("UIGDetails", "None", "details (shared folders)"), QString());
-        }
-        else
-            m_text << UITextTableLine(QApplication::translate("UIGDetails", "Information Inaccessible", "details"), QString());
-
-        /* Send information into GUI thread: */
-        emit sigComplete(m_text);
-    }
-
-    COMBase::CleanupCOM();
-}
-
-
-void UIGDetailsUpdateThreadUI::run()
-{
-    COMBase::InitializeCOM(false);
-
-    if (!machine().isNull())
-    {
-        /* Prepare table: */
-        UITextTable m_text;
-
-        /* Gather information: */
-        if (machine().GetAccessible())
-        {
-            /* Damn GetExtraData should be const already :( */
-            CMachine localMachine = machine();
-
-#ifndef Q_WS_MAC
-            /* Get menu-bar availability status: */
-            const QString strMenubarEnabled = localMachine.GetExtraData(UIExtraDataDefs::GUI_MenuBar_Enabled);
-            {
-                /* Try to convert loaded data to bool: */
-                const bool fEnabled = !(strMenubarEnabled.compare("false", Qt::CaseInsensitive) == 0 ||
-                                        strMenubarEnabled.compare("no", Qt::CaseInsensitive) == 0 ||
-                                        strMenubarEnabled.compare("off", Qt::CaseInsensitive) == 0 ||
-                                        strMenubarEnabled == "0");
-                /* Append information: */
-                m_text << UITextTableLine(QApplication::translate("UIGDetails", "Menu-bar", "details (user interface)"),
-                                          fEnabled ? QApplication::translate("UIGDetails", "Enabled", "details (user interface/menu-bar)") :
-                                                     QApplication::translate("UIGDetails", "Disabled", "details (user interface/menu-bar)"));
-            }
-#endif /* !Q_WS_MAC */
-
-            /* Get status-bar availability status: */
-            const QString strStatusbarEnabled = localMachine.GetExtraData(UIExtraDataDefs::GUI_StatusBar_Enabled);
-            {
-                /* Try to convert loaded data to bool: */
-                const bool fEnabled = !(strStatusbarEnabled.compare("false", Qt::CaseInsensitive) == 0 ||
-                                        strStatusbarEnabled.compare("no", Qt::CaseInsensitive) == 0 ||
-                                        strStatusbarEnabled.compare("off", Qt::CaseInsensitive) == 0 ||
-                                        strStatusbarEnabled == "0");
-                /* Append information: */
-                m_text << UITextTableLine(QApplication::translate("UIGDetails", "Status-bar", "details (user interface)"),
-                                          fEnabled ? QApplication::translate("UIGDetails", "Enabled", "details (user interface/status-bar)") :
-                                                     QApplication::translate("UIGDetails", "Disabled", "details (user interface/status-bar)"));
-            }
-
-#ifndef Q_WS_MAC
-            /* Get mini-toolbar availability status: */
-            const QString strMiniToolbarEnabled = localMachine.GetExtraData(UIExtraDataDefs::GUI_ShowMiniToolBar);
-            {
-                /* Try to convert loaded data to bool: */
-                const bool fEnabled = !(strMiniToolbarEnabled.compare("false", Qt::CaseInsensitive) == 0 ||
-                                        strMiniToolbarEnabled.compare("no", Qt::CaseInsensitive) == 0 ||
-                                        strMiniToolbarEnabled.compare("off", Qt::CaseInsensitive) == 0 ||
-                                        strMiniToolbarEnabled == "0");
-                /* Append information: */
-                if (fEnabled)
-                {
-                    /* Get mini-toolbar position: */
-                    const QString &strMiniToolbarPosition = localMachine.GetExtraData(UIExtraDataDefs::GUI_MiniToolBarAlignment);
-                    {
-                        /* Try to convert loaded data to alignment: */
-                        switch (gpConverter->fromInternalString<MiniToolbarAlignment>(strMiniToolbarPosition))
-                        {
-                            /* Append information: */
-                            case MiniToolbarAlignment_Top:
-                                m_text << UITextTableLine(QApplication::translate("UIGDetails", "Mini-toolbar Position", "details (user interface)"),
-                                                          QApplication::translate("UIGDetails", "Top", "details (user interface/mini-toolbar position)"));
-                                break;
-                            /* Append information: */
-                            case MiniToolbarAlignment_Bottom:
-                                m_text << UITextTableLine(QApplication::translate("UIGDetails", "Mini-toolbar Position", "details (user interface)"),
-                                                          QApplication::translate("UIGDetails", "Bottom", "details (user interface/mini-toolbar position)"));
-                                break;
-                        }
-                    }
-                }
-                /* Append information: */
-                else
-                    m_text << UITextTableLine(QApplication::translate("UIGDetails", "Mini-toolbar", "details (user interface)"),
-                                              QApplication::translate("UIGDetails", "Disabled", "details (user interface/mini-toolbar)"));
-            }
-#endif /* !Q_WS_MAC */
-        }
-        else
-            m_text << UITextTableLine(QApplication::translate("UIGDetails", "Information Inaccessible", "details"), QString());
-
-        /* Send information into GUI thread: */
-        emit sigComplete(m_text);
-    }
-
-    COMBase::CleanupCOM();
-}
-
-
-void UIGDetailsUpdateThreadDescription::run()
-{
-    COMBase::InitializeCOM(false);
-
-    if (!machine().isNull())
-    {
-        /* Prepare table: */
-        UITextTable m_text;
-
-        /* Gather information: */
-        if (machine().GetAccessible())
-        {
-            /* Get description: */
-            const QString &strDesc = machine().GetDescription();
-            if (!strDesc.isEmpty())
-                m_text << UITextTableLine(strDesc, QString());
-            else
-                m_text << UITextTableLine(QApplication::translate("UIGDetails", "None", "details (description)"), QString());
-        }
-        else
-            m_text << UITextTableLine(QApplication::translate("UIGDetails", "Information Inaccessible", "details"), QString());
-
-        /* Send information into GUI thread: */
-        emit sigComplete(m_text);
-    }
-
-    COMBase::CleanupCOM();
-}
-
+            table << UITextTableLine(QApplication::translate("UIGDetails", "None", "details (description)"), QString());
+    }
+    else
+        table << UITextTableLine(QApplication::translate("UIGDetails", "Information Inaccessible", "details"), QString());
+
+    /* Save the table as property: */
+    setProperty("table", QVariant::fromValue(table));
+}
+
Index: trunk/src/VBox/Frontends/VirtualBox/src/selector/graphics/details/UIGDetailsElements.h
===================================================================
--- trunk/src/VBox/Frontends/VirtualBox/src/selector/graphics/details/UIGDetailsElements.h	(revision 57671)
+++ trunk/src/VBox/Frontends/VirtualBox/src/selector/graphics/details/UIGDetailsElements.h	(revision 57672)
@@ -19,42 +19,22 @@
 #define __UIGDetailsElements_h__
 
-/* Qt includes: */
-#include <QThread>
-
 /* GUI includes: */
+#include "UIThreadPool.h"
 #include "UIGDetailsElement.h"
-
-/* COM includes: */
-#include "COMEnums.h"
-#include "CMachine.h"
 
 /* Forward declarations: */
 class UIGMachinePreview;
-
-
-/* Element update thread: */
-class UIGDetailsUpdateThread : public QThread
-{
-    Q_OBJECT;
-
-signals:
-
-    /* Notifier: Prepare stuff: */
-    void sigComplete(const UITextTable &text);
-
-public:
-
-    /* Constructor: */
-    UIGDetailsUpdateThread(const CMachine &machine);
-
-protected:
-
-    /* Internal API: Machine stuff: */
-    const CMachine& machine() const { return m_machine; }
-
-private:
-
-    /* Variables: */
-    const CMachine &m_machine;
+class CNetworkAdapter;
+
+
+/* Element update task: */
+class UIGDetailsUpdateTask : public UITask
+{
+    Q_OBJECT;
+
+public:
+
+    /* Constructor: */
+    UIGDetailsUpdateTask(const CMachine &machine);
 };
 
@@ -68,27 +48,23 @@
     /* Constructor/destructor: */
     UIGDetailsElementInterface(UIGDetailsSet *pParent, DetailsElementType type, bool fOpened);
-    ~UIGDetailsElementInterface();
 
 protected:
 
     /* Helper: Translate stuff: */
-    void retranslateUi();
+    virtual void retranslateUi();
 
     /* Helpers: Update stuff: */
-    void updateAppearance();
-    virtual UIGDetailsUpdateThread* createUpdateThread() = 0;
+    virtual void updateAppearance();
+    virtual UITask* createUpdateTask() = 0;
 
 private slots:
 
     /* Handler: Update stuff: */
-    virtual void sltUpdateAppearanceFinished(const UITextTable &newText);
-
-private:
-
-    /* Helpers: Cleanup stuff: */
-    void cleanupThread();
+    virtual void sltUpdateAppearanceFinished(UITask *pTask);
+
+private:
 
     /* Variables: */
-    UIGDetailsUpdateThread *m_pThread;
+    UITask *m_pTask;
 };
 
@@ -112,5 +88,5 @@
 
     /* Helper: Translate stuff: */
-    void retranslateUi();
+    virtual void retranslateUi();
 
     /* Helpers: Layout stuff: */
@@ -127,14 +103,14 @@
 
 
-/* Thread 'General': */
-class UIGDetailsUpdateThreadGeneral : public UIGDetailsUpdateThread
-{
-    Q_OBJECT;
-
-public:
-
-    /* Constructor: */
-    UIGDetailsUpdateThreadGeneral(const CMachine &machine)
-        : UIGDetailsUpdateThread(machine) {}
+/* Task 'General': */
+class UIGDetailsUpdateTaskGeneral : public UIGDetailsUpdateTask
+{
+    Q_OBJECT;
+
+public:
+
+    /* Constructor: */
+    UIGDetailsUpdateTaskGeneral(const CMachine &machine)
+        : UIGDetailsUpdateTask(machine) {}
 
 private:
@@ -158,18 +134,18 @@
 
     /* Helper: Update stuff: */
-    UIGDetailsUpdateThread* createUpdateThread() { return new UIGDetailsUpdateThreadGeneral(machine()); }
-};
-
-
-/* Thread 'System': */
-class UIGDetailsUpdateThreadSystem : public UIGDetailsUpdateThread
-{
-    Q_OBJECT;
-
-public:
-
-    /* Constructor: */
-    UIGDetailsUpdateThreadSystem(const CMachine &machine)
-        : UIGDetailsUpdateThread(machine) {}
+    UITask* createUpdateTask() { return new UIGDetailsUpdateTaskGeneral(machine()); }
+};
+
+
+/* Task 'System': */
+class UIGDetailsUpdateTaskSystem : public UIGDetailsUpdateTask
+{
+    Q_OBJECT;
+
+public:
+
+    /* Constructor: */
+    UIGDetailsUpdateTaskSystem(const CMachine &machine)
+        : UIGDetailsUpdateTask(machine) {}
 
 private:
@@ -193,18 +169,18 @@
 
     /* Helper: Update stuff: */
-    UIGDetailsUpdateThread* createUpdateThread() { return new UIGDetailsUpdateThreadSystem(machine()); }
-};
-
-
-/* Thread 'Display': */
-class UIGDetailsUpdateThreadDisplay : public UIGDetailsUpdateThread
-{
-    Q_OBJECT;
-
-public:
-
-    /* Constructor: */
-    UIGDetailsUpdateThreadDisplay(const CMachine &machine)
-        : UIGDetailsUpdateThread(machine) {}
+    UITask* createUpdateTask() { return new UIGDetailsUpdateTaskSystem(machine()); }
+};
+
+
+/* Task 'Display': */
+class UIGDetailsUpdateTaskDisplay : public UIGDetailsUpdateTask
+{
+    Q_OBJECT;
+
+public:
+
+    /* Constructor: */
+    UIGDetailsUpdateTaskDisplay(const CMachine &machine)
+        : UIGDetailsUpdateTask(machine) {}
 
 private:
@@ -228,18 +204,18 @@
 
     /* Helper: Update stuff: */
-    UIGDetailsUpdateThread* createUpdateThread() { return new UIGDetailsUpdateThreadDisplay(machine()); }
-};
-
-
-/* Thread 'Storage': */
-class UIGDetailsUpdateThreadStorage : public UIGDetailsUpdateThread
-{
-    Q_OBJECT;
-
-public:
-
-    /* Constructor: */
-    UIGDetailsUpdateThreadStorage(const CMachine &machine)
-        : UIGDetailsUpdateThread(machine) {}
+    UITask* createUpdateTask() { return new UIGDetailsUpdateTaskDisplay(machine()); }
+};
+
+
+/* Task 'Storage': */
+class UIGDetailsUpdateTaskStorage : public UIGDetailsUpdateTask
+{
+    Q_OBJECT;
+
+public:
+
+    /* Constructor: */
+    UIGDetailsUpdateTaskStorage(const CMachine &machine)
+        : UIGDetailsUpdateTask(machine) {}
 
 private:
@@ -263,18 +239,18 @@
 
     /* Helper: Update stuff: */
-    UIGDetailsUpdateThread* createUpdateThread() { return new UIGDetailsUpdateThreadStorage(machine()); }
-};
-
-
-/* Thread 'Audio': */
-class UIGDetailsUpdateThreadAudio : public UIGDetailsUpdateThread
-{
-    Q_OBJECT;
-
-public:
-
-    /* Constructor: */
-    UIGDetailsUpdateThreadAudio(const CMachine &machine)
-        : UIGDetailsUpdateThread(machine) {}
+    UITask* createUpdateTask() { return new UIGDetailsUpdateTaskStorage(machine()); }
+};
+
+
+/* Task 'Audio': */
+class UIGDetailsUpdateTaskAudio : public UIGDetailsUpdateTask
+{
+    Q_OBJECT;
+
+public:
+
+    /* Constructor: */
+    UIGDetailsUpdateTaskAudio(const CMachine &machine)
+        : UIGDetailsUpdateTask(machine) {}
 
 private:
@@ -298,18 +274,18 @@
 
     /* Helper: Update stuff: */
-    UIGDetailsUpdateThread* createUpdateThread() { return new UIGDetailsUpdateThreadAudio(machine()); }
-};
-
-
-/* Thread 'Network': */
-class UIGDetailsUpdateThreadNetwork : public UIGDetailsUpdateThread
-{
-    Q_OBJECT;
-
-public:
-
-    /* Constructor: */
-    UIGDetailsUpdateThreadNetwork(const CMachine &machine)
-        : UIGDetailsUpdateThread(machine) {}
+    UITask* createUpdateTask() { return new UIGDetailsUpdateTaskAudio(machine()); }
+};
+
+
+/* Task 'Network': */
+class UIGDetailsUpdateTaskNetwork : public UIGDetailsUpdateTask
+{
+    Q_OBJECT;
+
+public:
+
+    /* Constructor: */
+    UIGDetailsUpdateTaskNetwork(const CMachine &machine)
+        : UIGDetailsUpdateTask(machine) {}
 
 private:
@@ -334,18 +310,18 @@
 
     /* Helper: Update stuff: */
-    UIGDetailsUpdateThread* createUpdateThread() { return new UIGDetailsUpdateThreadNetwork(machine()); }
-};
-
-
-/* Thread 'Serial': */
-class UIGDetailsUpdateThreadSerial : public UIGDetailsUpdateThread
-{
-    Q_OBJECT;
-
-public:
-
-    /* Constructor: */
-    UIGDetailsUpdateThreadSerial(const CMachine &machine)
-        : UIGDetailsUpdateThread(machine) {}
+    UITask* createUpdateTask() { return new UIGDetailsUpdateTaskNetwork(machine()); }
+};
+
+
+/* Task 'Serial': */
+class UIGDetailsUpdateTaskSerial : public UIGDetailsUpdateTask
+{
+    Q_OBJECT;
+
+public:
+
+    /* Constructor: */
+    UIGDetailsUpdateTaskSerial(const CMachine &machine)
+        : UIGDetailsUpdateTask(machine) {}
 
 private:
@@ -369,19 +345,19 @@
 
     /* Helper: Update stuff: */
-    UIGDetailsUpdateThread* createUpdateThread() { return new UIGDetailsUpdateThreadSerial(machine()); }
+    UITask* createUpdateTask() { return new UIGDetailsUpdateTaskSerial(machine()); }
 };
 
 
 #ifdef VBOX_WITH_PARALLEL_PORTS
-/* Thread 'Parallel': */
-class UIGDetailsUpdateThreadParallel : public UIGDetailsUpdateThread
-{
-    Q_OBJECT;
-
-public:
-
-    /* Constructor: */
-    UIGDetailsUpdateThreadParallel(const CMachine &machine)
-        : UIGDetailsUpdateThread(machine) {}
+/* Task 'Parallel': */
+class UIGDetailsUpdateTaskParallel : public UIGDetailsUpdateTask
+{
+    Q_OBJECT;
+
+public:
+
+    /* Constructor: */
+    UIGDetailsUpdateTaskParallel(const CMachine &machine)
+        : UIGDetailsUpdateTask(machine) {}
 
 private:
@@ -405,19 +381,19 @@
 
     /* Helper: Update stuff: */
-    UIGDetailsUpdateThread* createUpdateThread() { return new UIGDetailsUpdateThreadParallel(machine()); }
+    UITask* createUpdateTask() { return new UIGDetailsUpdateTaskParallel(machine()); }
 };
 #endif /* VBOX_WITH_PARALLEL_PORTS */
 
 
-/* Thread 'USB': */
-class UIGDetailsUpdateThreadUSB : public UIGDetailsUpdateThread
-{
-    Q_OBJECT;
-
-public:
-
-    /* Constructor: */
-    UIGDetailsUpdateThreadUSB(const CMachine &machine)
-        : UIGDetailsUpdateThread(machine) {}
+/* Task 'USB': */
+class UIGDetailsUpdateTaskUSB : public UIGDetailsUpdateTask
+{
+    Q_OBJECT;
+
+public:
+
+    /* Constructor: */
+    UIGDetailsUpdateTaskUSB(const CMachine &machine)
+        : UIGDetailsUpdateTask(machine) {}
 
 private:
@@ -441,18 +417,18 @@
 
     /* Helper: Update stuff: */
-    UIGDetailsUpdateThread* createUpdateThread() { return new UIGDetailsUpdateThreadUSB(machine()); }
-};
-
-
-/* Thread 'SF': */
-class UIGDetailsUpdateThreadSF : public UIGDetailsUpdateThread
-{
-    Q_OBJECT;
-
-public:
-
-    /* Constructor: */
-    UIGDetailsUpdateThreadSF(const CMachine &machine)
-        : UIGDetailsUpdateThread(machine) {}
+    UITask* createUpdateTask() { return new UIGDetailsUpdateTaskUSB(machine()); }
+};
+
+
+/* Task 'SF': */
+class UIGDetailsUpdateTaskSF : public UIGDetailsUpdateTask
+{
+    Q_OBJECT;
+
+public:
+
+    /* Constructor: */
+    UIGDetailsUpdateTaskSF(const CMachine &machine)
+        : UIGDetailsUpdateTask(machine) {}
 
 private:
@@ -476,18 +452,18 @@
 
     /* Helper: Update stuff: */
-    UIGDetailsUpdateThread* createUpdateThread() { return new UIGDetailsUpdateThreadSF(machine()); }
-};
-
-
-/* Thread 'UI': */
-class UIGDetailsUpdateThreadUI : public UIGDetailsUpdateThread
-{
-    Q_OBJECT;
-
-public:
-
-    /* Constructor: */
-    UIGDetailsUpdateThreadUI(const CMachine &machine)
-        : UIGDetailsUpdateThread(machine) {}
+    UITask* createUpdateTask() { return new UIGDetailsUpdateTaskSF(machine()); }
+};
+
+
+/* Task 'UI': */
+class UIGDetailsUpdateTaskUI : public UIGDetailsUpdateTask
+{
+    Q_OBJECT;
+
+public:
+
+    /* Constructor: */
+    UIGDetailsUpdateTaskUI(const CMachine &machine)
+        : UIGDetailsUpdateTask(machine) {}
 
 private:
@@ -511,18 +487,18 @@
 
     /* Helper: Update stuff: */
-    UIGDetailsUpdateThread* createUpdateThread() { return new UIGDetailsUpdateThreadUI(machine()); }
-};
-
-
-/* Thread 'Description': */
-class UIGDetailsUpdateThreadDescription : public UIGDetailsUpdateThread
-{
-    Q_OBJECT;
-
-public:
-
-    /* Constructor: */
-    UIGDetailsUpdateThreadDescription(const CMachine &machine)
-        : UIGDetailsUpdateThread(machine) {}
+    UITask* createUpdateTask() { return new UIGDetailsUpdateTaskUI(machine()); }
+};
+
+
+/* Task 'Description': */
+class UIGDetailsUpdateTaskDescription : public UIGDetailsUpdateTask
+{
+    Q_OBJECT;
+
+public:
+
+    /* Constructor: */
+    UIGDetailsUpdateTaskDescription(const CMachine &machine)
+        : UIGDetailsUpdateTask(machine) {}
 
 private:
@@ -546,5 +522,5 @@
 
     /* Helper: Update stuff: */
-    UIGDetailsUpdateThread* createUpdateThread() { return new UIGDetailsUpdateThreadDescription(machine()); }
+    UITask* createUpdateTask() { return new UIGDetailsUpdateTaskDescription(machine()); }
 };
 
