Index: /trunk/src/VBox/Main/include/ApplianceImpl.h
===================================================================
--- /trunk/src/VBox/Main/include/ApplianceImpl.h	(revision 58004)
+++ /trunk/src/VBox/Main/include/ApplianceImpl.h	(revision 58005)
@@ -114,5 +114,5 @@
 
     struct ImportStack;
-    struct TaskOVF;
+    class TaskOVF;
     struct Data;            // opaque, defined in ApplianceImpl.cpp
     Data *m;
Index: /trunk/src/VBox/Main/include/ApplianceImplPrivate.h
===================================================================
--- /trunk/src/VBox/Main/include/ApplianceImplPrivate.h	(revision 58004)
+++ /trunk/src/VBox/Main/include/ApplianceImplPrivate.h	(revision 58005)
@@ -23,4 +23,5 @@
 #include "ovfreader.h"
 #include "SecretKeyStore.h"
+#include "ThreadTask.h"
 #include <map>
 #include <vector>
@@ -122,6 +123,7 @@
 };
 
-struct Appliance::TaskOVF
-{
+class Appliance::TaskOVF: public ThreadTask
+{
+public:
     enum TaskType
     {
@@ -135,5 +137,6 @@
             LocationInfo aLocInfo,
             ComObjPtr<Progress> &aProgress)
-      : pAppliance(aThat),
+      : ThreadTask("TaskOVF"),
+        pAppliance(aThat),
         taskType(aType),
         locInfo(aLocInfo),
@@ -141,9 +144,15 @@
         enFormat(ovf::OVFVersion_unknown),
         rc(S_OK)
-    {}
+    {
+        switch (taskType)
+        {
+            case TaskOVF::Read:     m_strTaskName = "ApplRead"; break;
+            case TaskOVF::Import:   m_strTaskName = "ApplImp"; break;
+            case TaskOVF::Write:    m_strTaskName = "ApplWrit"; break;
+            default:                m_strTaskName = "ApplTask"; break;
+        }
+    }
 
     static DECLCALLBACK(int) updateProgress(unsigned uPercent, void *pvUser);
-
-    HRESULT startThread();
 
     Appliance *pAppliance;
@@ -155,4 +164,9 @@
 
     HRESULT rc;
+
+    void handler()
+    {
+        int vrc = Appliance::i_taskThreadImportOrExport(NULL, this);
+    }
 };
 
Index: /trunk/src/VBox/Main/src-server/ApplianceImpl.cpp
===================================================================
--- /trunk/src/VBox/Main/src-server/ApplianceImpl.cpp	(revision 58004)
+++ /trunk/src/VBox/Main/src-server/ApplianceImpl.cpp	(revision 58005)
@@ -1185,28 +1185,4 @@
 
 /**
- * Starts the worker thread for the task.
- *
- * @return COM status code.
- */
-HRESULT Appliance::TaskOVF::startThread()
-{
-    /* Pick a thread name suitable for logging (<= 8 chars). */
-    const char *pszTaskNm;
-    switch (taskType)
-    {
-        case TaskOVF::Read:     pszTaskNm = "ApplRead"; break;
-        case TaskOVF::Import:   pszTaskNm = "ApplImp"; break;
-        case TaskOVF::Write:    pszTaskNm = "ApplWrit"; break;
-        default:                pszTaskNm = "ApplTask"; break;
-    }
-
-    int vrc = RTThreadCreate(NULL, Appliance::i_taskThreadImportOrExport, this,
-                             0, RTTHREADTYPE_MAIN_HEAVY_WORKER, 0, pszTaskNm);
-    if (RT_SUCCESS(vrc))
-        return S_OK;
-    return Appliance::i_setErrorStatic(E_FAIL, Utf8StrFmt("Could not create OVF task thread (%Rrc)\n", vrc));
-}
-
-/**
  * Thread function for the thread started in Appliance::readImpl() and Appliance::importImpl()
  * and Appliance::writeImpl().
@@ -1220,6 +1196,6 @@
 DECLCALLBACK(int) Appliance::i_taskThreadImportOrExport(RTTHREAD /* aThread */, void *pvUser)
 {
-    std::auto_ptr<TaskOVF> task(static_cast<TaskOVF*>(pvUser));
-    AssertReturn(task.get(), VERR_GENERAL_FAILURE);
+    TaskOVF* task = static_cast<TaskOVF*>(pvUser);
+    AssertReturn(task, VERR_GENERAL_FAILURE);
 
     Appliance *pAppliance = task->pAppliance;
@@ -1234,8 +1210,8 @@
         case TaskOVF::Read:
             if (task->locInfo.storageType == VFSType_File)
-                taskrc = pAppliance->i_readFS(task.get());
+                taskrc = pAppliance->i_readFS(task);
             else if (task->locInfo.storageType == VFSType_S3)
 #ifdef VBOX_WITH_S3
-                taskrc = pAppliance->i_readS3(task.get());
+                taskrc = pAppliance->i_readS3(task);
 #else
                 taskrc = VERR_NOT_IMPLEMENTED;
@@ -1245,8 +1221,8 @@
         case TaskOVF::Import:
             if (task->locInfo.storageType == VFSType_File)
-                taskrc = pAppliance->i_importFS(task.get());
+                taskrc = pAppliance->i_importFS(task);
             else if (task->locInfo.storageType == VFSType_S3)
 #ifdef VBOX_WITH_S3
-                taskrc = pAppliance->i_importS3(task.get());
+                taskrc = pAppliance->i_importS3(task);
 #else
                 taskrc = VERR_NOT_IMPLEMENTED;
@@ -1256,8 +1232,8 @@
         case TaskOVF::Write:
             if (task->locInfo.storageType == VFSType_File)
-                taskrc = pAppliance->i_writeFS(task.get());
+                taskrc = pAppliance->i_writeFS(task);
             else if (task->locInfo.storageType == VFSType_S3)
 #ifdef VBOX_WITH_S3
-                taskrc = pAppliance->i_writeS3(task.get());
+                taskrc = pAppliance->i_writeS3(task);
 #else
                 taskrc = VERR_NOT_IMPLEMENTED;
Index: /trunk/src/VBox/Main/src-server/ApplianceImplExport.cpp
===================================================================
--- /trunk/src/VBox/Main/src-server/ApplianceImplExport.cpp	(revision 58004)
+++ /trunk/src/VBox/Main/src-server/ApplianceImplExport.cpp	(revision 58005)
@@ -28,5 +28,4 @@
 #include "ApplianceImpl.h"
 #include "VirtualBoxImpl.h"
-
 #include "ProgressImpl.h"
 #include "MachineImpl.h"
@@ -754,13 +753,22 @@
 
         /* Initialize our worker task */
-        std::auto_ptr<TaskOVF> task(new TaskOVF(this, TaskOVF::Write, aLocInfo, aProgress));
+        TaskOVF* task = NULL;
+        try
+        {
+            task = new TaskOVF(this, TaskOVF::Write, aLocInfo, aProgress);
+        }
+        catch(...)
+        {
+            delete task;
+            throw rc = setError(VBOX_E_OBJECT_NOT_FOUND, 
+                                tr("Could not create TaskOVF object for for writing out the OVF to disk"));
+        }
+
         /* The OVF version to write */
         task->enFormat = aFormat;
 
-        rc = task->startThread();
+        rc = task->createThread();
         if (FAILED(rc)) throw rc;
 
-        /* Don't destruct on success */
-        task.release();
     }
     catch (HRESULT aRC)
Index: /trunk/src/VBox/Main/src-server/ApplianceImplImport.cpp
===================================================================
--- /trunk/src/VBox/Main/src-server/ApplianceImplImport.cpp	(revision 58004)
+++ /trunk/src/VBox/Main/src-server/ApplianceImplImport.cpp	(revision 58005)
@@ -874,11 +874,18 @@
 
     /* Initialize our worker task */
-    std::auto_ptr<TaskOVF> task(new TaskOVF(this, TaskOVF::Read, aLocInfo, aProgress));
-
-    rc = task->startThread();
+    TaskOVF* task = NULL;
+    try
+    {
+        task = new TaskOVF(this, TaskOVF::Read, aLocInfo, aProgress);
+    }
+    catch(...)
+    {
+        delete task;
+        throw rc = setError(VBOX_E_OBJECT_NOT_FOUND, 
+                            tr("Could not create TaskOVF object for reading the OVF from disk"));
+    }
+
+    rc = task->createThread();
     if (FAILED(rc)) throw rc;
-
-    /* Don't destruct on success */
-    task.release();
 
     return rc;
@@ -1371,11 +1378,18 @@
 
     /* Initialize our worker task */
-    std::auto_ptr<TaskOVF> task(new TaskOVF(this, TaskOVF::Import, locInfo, progress));
-
-    rc = task->startThread();
+    TaskOVF* task = NULL;
+    try
+    {
+        task = new TaskOVF(this, TaskOVF::Import, locInfo, progress);
+    }
+    catch(...)
+    {
+        delete task;
+        throw rc = setError(VBOX_E_OBJECT_NOT_FOUND, 
+                            tr("Could not create TaskOVF object for importing OVF data into VirtualBox"));
+    }
+
+    rc = task->createThread();
     if (FAILED(rc)) throw rc;
-
-    /* Don't destruct on success */
-    task.release();
 
     return rc;
