Index: /trunk/src/VBox/Frontends/VBoxManage/VBoxManageMisc.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VBoxManage/VBoxManageMisc.cpp	(revision 35272)
+++ /trunk/src/VBox/Frontends/VBoxManage/VBoxManageMisc.cpp	(revision 35273)
@@ -859,5 +859,8 @@
         CHECK_ERROR2_RET(ptrExtPackMgr, OpenExtPackFile(bstrTarball.raw(), ptrExtPackFile.asOutParam()), RTEXITCODE_FAILURE);
         CHECK_ERROR2_RET(ptrExtPackFile, COMGETTER(Name)(bstrName.asOutParam()), RTEXITCODE_FAILURE);
-        CHECK_ERROR2_RET(ptrExtPackFile, Install(fReplace), RTEXITCODE_FAILURE);
+        ComPtr<IProgress> ptrProgress;
+        CHECK_ERROR2_RET(ptrExtPackFile, Install(fReplace, NULL, ptrProgress.asOutParam()), RTEXITCODE_FAILURE);
+        if (!ptrProgress.isNull())
+            CHECK_ERROR2_RET(ptrProgress, WaitForCompletion(-1), RTEXITCODE_FAILURE);
         RTPrintf("Successfully installed \"%lS\".\n", bstrName.raw());
     }
@@ -895,5 +898,8 @@
 
         Bstr bstrName(pszName);
-        CHECK_ERROR2_RET(ptrExtPackMgr, Uninstall(bstrName.raw(), fForced), RTEXITCODE_FAILURE);
+        ComPtr<IProgress> ptrProgress;
+        CHECK_ERROR2_RET(ptrExtPackMgr, Uninstall(bstrName.raw(), fForced, NULL, ptrProgress.asOutParam()), RTEXITCODE_FAILURE);
+        if (!ptrProgress.isNull())
+            CHECK_ERROR2_RET(ptrProgress, WaitForCompletion(-1), RTEXITCODE_FAILURE);
         RTPrintf("Successfully uninstalled \"%s\".\n", pszName);
     }
Index: /trunk/src/VBox/Frontends/VirtualBox/src/globals/VBoxProblemReporter.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/globals/VBoxProblemReporter.cpp	(revision 35272)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/globals/VBoxProblemReporter.cpp	(revision 35273)
@@ -2142,18 +2142,25 @@
 }
 
-void VBoxProblemReporter::cannotInstallExtPack(const QString &strFilename, const CExtPackFile &extPackFile, QWidget *pParent)
-{
-    message (pParent ? pParent : mainWindowShown(),
+void VBoxProblemReporter::cannotInstallExtPack(const QString &strFilename, const CExtPackFile &extPackFile, const CProgress &progress, QWidget *pParent)
+{
+    if (!pParent)
+        pParent = mainWindowShown();
+    QString strErrInfo = !extPackFile.isOk() ? formatErrorInfo(extPackFile) : formatErrorInfo(progress.GetErrorInfo());
+    message (pParent,
              Error,
              tr("Failed to install the Extension Pack <b>%1</b>.").arg(strFilename),
-             formatErrorInfo(extPackFile));
-}
-
-void VBoxProblemReporter::cannotUninstallExtPack(const QString &strPackName, const CExtPackManager &extPackManager, QWidget *pParent)
-{
-    message (pParent ? pParent : mainWindowShown(),
+             strErrInfo);
+}
+
+void VBoxProblemReporter::cannotUninstallExtPack(const QString &strPackName, const CExtPackManager &extPackManager,
+                                                 const CProgress &progress, QWidget *pParent)
+{
+    if (!pParent)
+        pParent = mainWindowShown();
+    QString strErrInfo = !extPackManager.isOk() ? formatErrorInfo(extPackManager) : formatErrorInfo(progress.GetErrorInfo());
+    message (pParent,
              Error,
              tr("Failed to uninstall the Extension Pack <b>%1</b>.").arg(strPackName),
-             formatErrorInfo(extPackManager));
+             strErrInfo);
 }
 
Index: /trunk/src/VBox/Frontends/VirtualBox/src/globals/VBoxProblemReporter.h
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/globals/VBoxProblemReporter.h	(revision 35272)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/globals/VBoxProblemReporter.h	(revision 35273)
@@ -342,6 +342,6 @@
     void cannotOpenExtPack(const QString &strFilename, const CExtPackManager &extPackManager, QWidget *pParent);
     void badExtPackFile(const QString &strFilename, const CExtPackFile &extPackFile, QWidget *pParent);
-    void cannotInstallExtPack(const QString &strFilename, const CExtPackFile &extPackFile, QWidget *pParent);
-    void cannotUninstallExtPack(const QString &strPackName, const CExtPackManager &extPackManager, QWidget *pParent);
+    void cannotInstallExtPack(const QString &strFilename, const CExtPackFile &extPackFile, const CProgress &progress, QWidget *pParent);
+    void cannotUninstallExtPack(const QString &strPackName, const CExtPackManager &extPackManager, const CProgress &progress, QWidget *pParent);
     bool confirmInstallingPackage(const QString &strPackName, const QString &strPackVersion, const QString &strPackDescription, QWidget *pParent);
     bool confirmReplacePackage(const QString &strPackName, const QString &strPackVersionNew, const QString &strPackVersionOld,
Index: /trunk/src/VBox/Frontends/VirtualBox/src/settings/global/UIGlobalSettingsExtension.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/settings/global/UIGlobalSettingsExtension.cpp	(revision 35272)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/settings/global/UIGlobalSettingsExtension.cpp	(revision 35273)
@@ -177,9 +177,24 @@
      * do a refresh even on failure.
      */
-    extPackFile.Install(fReplaceIt);
+    QString displayInfo;
+    CProgress progress = extPackFile.Install(fReplaceIt, displayInfo);
     if (extPackFile.isOk())
-        vboxProblem().notifyAboutExtPackInstalled(strPackName, pParent);
+    {
+        if (progress.isNull())
+            vboxProblem().notifyAboutExtPackInstalled(strPackName, pParent);
+        else
+        {
+            vboxProblem().showModalProgressDialog(progress, tr("Extensions"));
+            if (!progress.GetCanceled())
+            {
+                if (progress.isOk() && progress.GetResultCode() == 0)
+                    vboxProblem().notifyAboutExtPackInstalled(strPackName, pParent);
+                else
+                    vboxProblem().cannotInstallExtPack(strFilePath, extPackFile, progress, pParent);
+            }
+        }
+    }
     else
-        vboxProblem().cannotInstallExtPack(strFilePath, extPackFile, pParent);
+        vboxProblem().cannotInstallExtPack(strFilePath, extPackFile, progress, pParent);
 
     if (pstrExtPackName)
@@ -374,24 +389,39 @@
         if (vboxProblem().confirmRemovingPackage(strSelectedPackageName, this))
         {
-            /* Get package manager: */
+            /*
+             * Uninstall the package.
+             */
             CExtPackManager manager = vboxGlobal().virtualBox().GetExtensionPackManager();
-            /* Uninstall package: */
             /** @todo Refuse this if any VMs are running. */
-            manager.Uninstall(strSelectedPackageName, false /* forced removal? */);
+            QString displayInfo;
+            CProgress progress = manager.Uninstall(strSelectedPackageName, false /* forced removal? */, displayInfo);
             if (manager.isOk())
             {
-                /* Remove selected package from cache: */
-                for (int i = 0; i < m_cache.m_items.size(); ++i)
+                bool fOk = true;
+                if (!progress.isNull())
                 {
-                    if (!strSelectedPackageName.compare(m_cache.m_items[i].m_strName, Qt::CaseInsensitive))
+                    vboxProblem().showModalProgressDialog(progress, tr("Extensions"));
+                    fOk = progress.isOk() && progress.GetResultCode() == 0;
+                }
+                if (fOk)
+                {
+                    /* Remove selected package from cache: */
+                    for (int i = 0; i < m_cache.m_items.size(); ++i)
                     {
-                        m_cache.m_items.removeAt(i);
-                        break;
+                        if (!strSelectedPackageName.compare(m_cache.m_items[i].m_strName, Qt::CaseInsensitive))
+                        {
+                            m_cache.m_items.removeAt(i);
+                            break;
+                        }
                     }
+
+                    /* Remove selected package from tree: */
+                    delete pItem;
                 }
-                /* Remove selected package from tree: */
-                delete pItem;
+                else
+                    vboxProblem().cannotUninstallExtPack(strSelectedPackageName, manager, progress, this);
             }
-            else vboxProblem().cannotUninstallExtPack(strSelectedPackageName, manager, this);
+            else
+                vboxProblem().cannotUninstallExtPack(strSelectedPackageName, manager, progress, this);
         }
     }
Index: /trunk/src/VBox/Main/ExtPackManagerImpl.cpp
===================================================================
--- /trunk/src/VBox/Main/ExtPackManagerImpl.cpp	(revision 35272)
+++ /trunk/src/VBox/Main/ExtPackManagerImpl.cpp	(revision 35273)
@@ -585,6 +585,10 @@
 }
 
-STDMETHODIMP ExtPackFile::Install(BOOL a_fReplace)
-{
+STDMETHODIMP ExtPackFile::Install(BOOL a_fReplace, IN_BSTR a_bstrDisplayInfo, IProgress **a_ppProgress)
+{
+    if (a_ppProgress)
+        *a_ppProgress = NULL;
+    Utf8Str strDisplayInfo(a_bstrDisplayInfo);
+
     AutoCaller autoCaller(this);
     HRESULT hrc = autoCaller.rc();
@@ -592,5 +596,5 @@
     {
         if (m->fUsable)
-            hrc = m->ptrExtPackMgr->doInstall(this, RT_BOOL(a_fReplace));
+            hrc = m->ptrExtPackMgr->doInstall(this, RT_BOOL(a_fReplace), &strDisplayInfo, a_ppProgress);
         else
             hrc = setError(E_FAIL, "%s", m->strWhyUnusable.c_str());
@@ -1924,8 +1928,12 @@
 }
 
-STDMETHODIMP ExtPackManager::Uninstall(IN_BSTR a_bstrName, BOOL a_fForcedRemoval)
+STDMETHODIMP ExtPackManager::Uninstall(IN_BSTR a_bstrName, BOOL a_fForcedRemoval, IN_BSTR a_bstrDisplayInfo,
+                                       IProgress **a_ppProgress)
 {
     CheckComArgNotNull(a_bstrName);
     Utf8Str strName(a_bstrName);
+    Utf8Str strDisplayInfo(a_bstrDisplayInfo);
+    if (a_ppProgress)
+        *a_ppProgress = NULL;
     Assert(m->enmContext == VBOXEXTPACKCTX_PER_USER_DAEMON);
 
@@ -1965,5 +1973,6 @@
                      */
                     const char *pszForcedOpt = a_fForcedRemoval ? "--forced" : NULL;
-                    hrc = runSetUidToRootHelper("uninstall",
+                    hrc = runSetUidToRootHelper(&strDisplayInfo,
+                                                "uninstall",
                                                 "--base-dir", m->strBaseDir.c_str(),
                                                 "--name",     strName.c_str(),
@@ -2021,5 +2030,6 @@
          */
         AutoWriteLock autoLock(this COMMA_LOCKVAL_SRC_POS);
-        hrc = runSetUidToRootHelper("cleanup",
+        hrc = runSetUidToRootHelper(NULL,
+                                    "cleanup",
                                     "--base-dir", m->strBaseDir.c_str(),
                                     (const char *)NULL);
@@ -2078,4 +2088,5 @@
  *
  * @returns S_OK or a failure status with error information set.
+ * @param   a_pstrDisplayInfo   Platform specific display info hacks.
  * @param   a_pszCommand        The command to execute.
  * @param   ...                 The argument strings that goes along with the
@@ -2083,5 +2094,5 @@
  *                              NULL.
  */
-HRESULT ExtPackManager::runSetUidToRootHelper(const char *a_pszCommand, ...)
+HRESULT ExtPackManager::runSetUidToRootHelper(Utf8Str const *a_pstrDisplayInfo, const char *a_pszCommand, ...)
 {
     /*
@@ -2100,5 +2111,17 @@
     const char *apszArgs[20];
     unsigned    cArgs = 0;
+
+    LogRel(("ExtPack: Executing '%s'", szExecName));
     apszArgs[cArgs++] = &szExecName[0];
+
+    if (   a_pstrDisplayInfo
+        && a_pstrDisplayInfo->isNotEmpty())
+    {
+        LogRel((" '--display-info-hack' '%s'", a_pstrDisplayInfo->c_str()));
+        apszArgs[cArgs++] = "--display-info-hack";
+        apszArgs[cArgs++] = a_pstrDisplayInfo->c_str();
+    }
+
+    LogRel(("'%s'", a_pszCommand));
     apszArgs[cArgs++] = a_pszCommand;
 
@@ -2106,14 +2129,16 @@
     va_start(va, a_pszCommand);
     const char *pszLastArg;
-    LogRel(("ExtPack: Executing '%s'", szExecName));
-    do
-    {
-        LogRel((" '%s'", apszArgs[cArgs - 1]));
+    for (;;)
+    {
         AssertReturn(cArgs < RT_ELEMENTS(apszArgs) - 1, E_UNEXPECTED);
         pszLastArg = va_arg(va, const char *);
+        if (!pszLastArg)
+            break;
+        LogRel((" '%s'", pszLastArg));
         apszArgs[cArgs++] = pszLastArg;
-    } while (pszLastArg != NULL);
+    };
+    va_end(va);
+
     LogRel(("\n"));
-    va_end(va);
     apszArgs[cArgs] = NULL;
 
@@ -2450,14 +2475,19 @@
  *
  * @returns COM status code.
- * @param   a_pExtPackFile  The extension pack file, caller checks that it's
- *                          usable.
- * @param   a_fReplace      Whether to replace any existing extpack or just
- *                          fail.
- */
-HRESULT ExtPackManager::doInstall(ExtPackFile *a_pExtPackFile, bool a_fReplace)
+ * @param   a_pExtPackFile      The extension pack file, caller checks that
+ *                              it's usable.
+ * @param   a_fReplace          Whether to replace any existing extpack or just
+ *                              fail.
+ * @param   a_pstrDisplayInfo   Host specific display information hacks.
+ * @param   a_ppProgress        Where to return a progress object some day. Can
+ *                              be NULL.
+ */
+HRESULT ExtPackManager::doInstall(ExtPackFile *a_pExtPackFile, bool a_fReplace, Utf8Str const *a_pstrDisplayInfo,
+                                  IProgress **a_ppProgress)
 {
     AssertReturn(m->enmContext == VBOXEXTPACKCTX_PER_USER_DAEMON, E_UNEXPECTED);
     iprt::MiniString const * const pStrName     = &a_pExtPackFile->m->Desc.strName;
     iprt::MiniString const * const pStrTarball  = &a_pExtPackFile->m->strExtPackFile;
+    NOREF(a_ppProgress); /** @todo implement progress object */
 
     AutoCaller autoCaller(this);
@@ -2491,5 +2521,6 @@
              */
             /** @todo add a hash (SHA-256) of the tarball or maybe just the manifest. */
-            hrc = runSetUidToRootHelper("install",
+            hrc = runSetUidToRootHelper(a_pstrDisplayInfo,
+                                        "install",
                                         "--base-dir",   m->strBaseDir.c_str(),
                                         "--cert-dir",   m->strCertificatDirPath.c_str(),
@@ -2517,5 +2548,6 @@
                          */
                         if (ErrInfo.Core.rc == VERR_EXTPACK_UNSUPPORTED_HOST_UNINSTALL)
-                            runSetUidToRootHelper("uninstall",
+                            runSetUidToRootHelper(a_pstrDisplayInfo,
+                                                  "uninstall",
                                                   "--base-dir", m->strBaseDir.c_str(),
                                                   "--name",     pStrName->c_str(),
Index: /trunk/src/VBox/Main/VBoxExtPackHelperApp.cpp
===================================================================
--- /trunk/src/VBox/Main/VBoxExtPackHelperApp.cpp	(revision 35272)
+++ /trunk/src/VBox/Main/VBoxExtPackHelperApp.cpp	(revision 35273)
@@ -89,4 +89,5 @@
 # define OPT_STDERR         1092
 #endif
+#define OPT_DISP_INFO_HACK  1093
 /** @}  */
 
@@ -1463,6 +1464,7 @@
  * @param   argv                The arguments.
  * @param   iCmd                The command that is being executed.
- */
-static RTEXITCODE RelaunchElevated(int argc, char **argv, int iCmd)
+ * @param   pszDisplayInfoHack  Display information hack.  Platform specific++.
+ */
+static RTEXITCODE RelaunchElevated(int argc, char **argv, int iCmd, const char *pszDisplayInfoHack)
 {
     /*
@@ -1694,7 +1696,8 @@
      * Elevation check.
      */
-    RTEXITCODE rcExit;
+    const char *pszDisplayInfoHack = NULL;
+    RTEXITCODE  rcExit;
 #ifdef WITH_ELEVATION
-    bool fElevated;
+    bool        fElevated;
     rcExit = ElevationCheck(&fElevated);
     if (rcExit != RTEXITCODE_SUCCESS)
@@ -1707,12 +1710,13 @@
     static const RTGETOPTDEF s_aOptions[] =
     {
-        { "install",    CMD_INSTALL,    RTGETOPT_REQ_NOTHING },
-        { "uninstall",  CMD_UNINSTALL,  RTGETOPT_REQ_NOTHING },
-        { "cleanup",    CMD_CLEANUP,    RTGETOPT_REQ_NOTHING },
+        { "install",                CMD_INSTALL,        RTGETOPT_REQ_NOTHING },
+        { "uninstall",              CMD_UNINSTALL,      RTGETOPT_REQ_NOTHING },
+        { "cleanup",                CMD_CLEANUP,        RTGETOPT_REQ_NOTHING },
 #ifdef WITH_ELEVATION
-        { "--elevated", OPT_ELEVATED,   RTGETOPT_REQ_NOTHING },
-        { "--stdout",   OPT_STDOUT,     RTGETOPT_REQ_STRING  },
-        { "--stderr",   OPT_STDERR,     RTGETOPT_REQ_STRING  },
+        { "--elevated",             OPT_ELEVATED,       RTGETOPT_REQ_NOTHING },
+        { "--stdout",               OPT_STDOUT,         RTGETOPT_REQ_STRING  },
+        { "--stderr",               OPT_STDERR,         RTGETOPT_REQ_STRING  },
 #endif
+        { "--display-info-hack",    OPT_DISP_INFO_HACK, RTGETOPT_REQ_STRING  },
     };
     RTGETOPTSTATE GetState;
@@ -1735,5 +1739,5 @@
 #ifdef WITH_ELEVATION
                 if (!fElevated)
-                    return RelaunchElevated(argc, argv, ch);
+                    return RelaunchElevated(argc, argv, ch, pszDisplayInfoHack);
 #endif
                 int         cCmdargs     = argc - GetState.iNext;
@@ -1793,4 +1797,10 @@
 #endif
 
+            case OPT_DISP_INFO_HACK:
+                if (pszDisplayInfoHack)
+                    return RTMsgErrorExit(RTEXITCODE_SYNTAX, "--display-info-hack shall only occur once");
+                pszDisplayInfoHack = ValueUnion.psz;
+                break;
+
             case 'h':
             case 'V':
Index: /trunk/src/VBox/Main/idl/VirtualBox.xidl
===================================================================
--- /trunk/src/VBox/Main/idl/VirtualBox.xidl	(revision 35272)
+++ /trunk/src/VBox/Main/idl/VirtualBox.xidl	(revision 35273)
@@ -14779,5 +14779,5 @@
   <interface
     name="IExtPackFile" extends="IExtPackBase"
-    uuid="64b65bda-eedf-442c-9fd2-d179a021031a"
+    uuid="b6b49f55-efcc-4f08-b486-56e8d8afb10b"
     wsmap="suppress"
     >
@@ -14804,4 +14804,15 @@
         </desc>
       </param>
+      <param name="displayInfo" type="wstring" dir="in">
+        <desc>
+          Platform specific display information.  Reserved for future hacks.
+        </desc>
+      </param>
+      <param name="progess" type="IProgress" dir="return">
+        <desc>
+          Progress object for the operation if it was decided that it should
+          be executed asynchronously - i.e. never in 4.0.0, but maybe in 4.0.x.
+        </desc>
+      </param>
     </method>
   </interface>
@@ -14809,5 +14820,5 @@
   <interface
     name="IExtPackManager" extends="$unknown"
-    uuid="70d808a9-176f-4d45-adad-7c509b8309b3"
+    uuid="2451b1ba-ab1c-42fb-b453-c58433bea8c7"
     wsmap="suppress"
     >
@@ -14863,4 +14874,15 @@
           Forced removal of the extension pack.  This means that the uninstall
           hook will not be called.
+        </desc>
+      </param>
+      <param name="displayInfo" type="wstring" dir="in">
+        <desc>
+          Platform specific display information.  Reserved for future hacks.
+        </desc>
+      </param>
+      <param name="progess" type="IProgress" dir="return">
+        <desc>
+          Progress object for the operation if it was decided that it should
+          be executed asynchronously - i.e. never in 4.0.0, but maybe in 4.0.x.
         </desc>
       </param>
Index: /trunk/src/VBox/Main/include/ExtPackManagerImpl.h
===================================================================
--- /trunk/src/VBox/Main/include/ExtPackManagerImpl.h	(revision 35272)
+++ /trunk/src/VBox/Main/include/ExtPackManagerImpl.h	(revision 35273)
@@ -70,5 +70,5 @@
      * @{ */
     STDMETHOD(COMGETTER(FilePath))(BSTR *a_pbstrPath);
-    STDMETHOD(Install)(BOOL a_fReplace);
+    STDMETHOD(Install)(BOOL a_fReplace, IN_BSTR a_bstrDisplayInfo, IProgress **a_ppProgress);
     /** @}  */
 
@@ -211,5 +211,5 @@
     STDMETHOD(Find)(IN_BSTR a_bstrName, IExtPack **a_pExtPack);
     STDMETHOD(OpenExtPackFile)(IN_BSTR a_bstrTarball, IExtPackFile **a_ppExtPackFile);
-    STDMETHOD(Uninstall)(IN_BSTR a_bstrName, BOOL a_fForcedRemoval);
+    STDMETHOD(Uninstall)(IN_BSTR a_bstrName, BOOL a_fForcedRemoval, IN_BSTR a_bstrDisplayInfo, IProgress **a_ppProgress);
     STDMETHOD(Cleanup)(void);
     STDMETHOD(QueryAllPlugInsForFrontend)(IN_BSTR a_bstrFrontend, ComSafeArrayOut(BSTR, a_pabstrPlugInModules));
@@ -219,5 +219,6 @@
     /** @name Internal interfaces used by other Main classes.
      * @{ */
-    HRESULT     doInstall(ExtPackFile *a_pExtPackFile, bool a_fReplace);
+    HRESULT     doInstall(ExtPackFile *a_pExtPackFile, bool a_fReplace, Utf8Str const *a_pstrDisplayInfo,
+                          IProgress **a_ppProgress);
     void        callAllVirtualBoxReadyHooks(void);
     void        callAllConsoleReadyHooks(IConsole *a_pConsole);
@@ -233,5 +234,5 @@
 
 private:
-    HRESULT     runSetUidToRootHelper(const char *a_pszCommand, ...);
+    HRESULT     runSetUidToRootHelper(Utf8Str const *a_pstrDisplayInfo, const char *a_pszCommand, ...);
     ExtPack    *findExtPack(const char *a_pszName);
     void        removeExtPack(const char *a_pszName);
