Index: /trunk/src/VBox/Main/idl/VirtualBox.xidl
===================================================================
--- /trunk/src/VBox/Main/idl/VirtualBox.xidl	(revision 84531)
+++ /trunk/src/VBox/Main/idl/VirtualBox.xidl	(revision 84532)
@@ -3957,5 +3957,5 @@
   <enum
     name="VirtualSystemDescriptionType"
-    uuid="9078595f-74cf-4454-8787-34a8f72beed5"
+    uuid="6e18c6d7-e1b7-4cb0-9706-1f31d18248f8"
     >
     <desc>Used with <link to="IVirtualSystemDescription" /> to describe the type of
@@ -4025,4 +4025,5 @@
     <const name="CloudPublicSSHKey" value="48" />
     <const name="BootingFirmware" value="49" />
+    <const name="HardDiskControllerVirtioSCSI" value="60" />
   </enum>
 
Index: /trunk/src/VBox/Main/include/ovfreader.h
===================================================================
--- /trunk/src/VBox/Main/include/ovfreader.h	(revision 84531)
+++ /trunk/src/VBox/Main/include/ovfreader.h	(revision 84532)
@@ -535,6 +535,6 @@
     uint32_t                idController;       // instance ID (Item/InstanceId); this gets referenced from VirtualDisk
 
-    enum ControllerSystemType { IDE, SATA, SCSI };
-    ControllerSystemType    system;             // one of IDE, SATA, SCSI
+    enum ControllerSystemType { IDE, SATA, SCSI, VIRTIOSCSI };
+    ControllerSystemType    system;             // one of IDE, SATA, SCSI, VIRTIOSCSI
 
     RTCString        strControllerType;
Index: /trunk/src/VBox/Main/src-server/ApplianceImpl.cpp
===================================================================
--- /trunk/src/VBox/Main/src-server/ApplianceImpl.cpp	(revision 84531)
+++ /trunk/src/VBox/Main/src-server/ApplianceImpl.cpp	(revision 84532)
@@ -1770,4 +1770,5 @@
             case VirtualSystemDescriptionType_HardDiskControllerSATA:
             case VirtualSystemDescriptionType_HardDiskControllerSCSI:
+            case VirtualSystemDescriptionType_HardDiskControllerVirtioSCSI:
             case VirtualSystemDescriptionType_HardDiskControllerSAS:
                 if (d.strRef == strRef)
Index: /trunk/src/VBox/Main/src-server/ApplianceImplExport.cpp
===================================================================
--- /trunk/src/VBox/Main/src-server/ApplianceImplExport.cpp	(revision 84531)
+++ /trunk/src/VBox/Main/src-server/ApplianceImplExport.cpp	(revision 84532)
@@ -187,4 +187,5 @@
         int32_t lSATAControllerIndex = 0;
         int32_t lSCSIControllerIndex = 0;
+        int32_t lVirtioSCSIControllerIndex = 0;
 
         /* Fetch all available storage controllers */
@@ -196,4 +197,5 @@
         ComPtr<IStorageController> pSATAController;
         ComPtr<IStorageController> pSCSIController;
+        ComPtr<IStorageController> pVirtioSCSIController;
         ComPtr<IStorageController> pSASController;
         for (size_t j = 0; j < nwControllers.size(); ++j)
@@ -214,4 +216,7 @@
                      && pSASController.isNull())
                 pSASController = nwControllers[j];
+            else if (   eType == StorageBus_VirtioSCSI
+                     && pVirtioSCSIController.isNull())
+                pVirtioSCSIController = nwControllers[j];
         }
 
@@ -294,4 +299,26 @@
         }
 
+        if (!pVirtioSCSIController.isNull())
+        {
+            StorageControllerType_T ctlr;
+            rc = pVirtioSCSIController->COMGETTER(ControllerType)(&ctlr);
+            if (SUCCEEDED(rc))
+            {
+                Utf8Str strVBox = "VirtioSCSI";       // the default in VBox
+                switch (ctlr)
+                {
+                    case StorageControllerType_VirtioSCSI: strVBox = "VirtioSCSI"; break;
+                    default: break; /* Shut up MSC. */
+                }
+                lVirtioSCSIControllerIndex = (int32_t)pNewDesc->m->maDescriptions.size();
+                pNewDesc->i_addEntry(VirtualSystemDescriptionType_HardDiskControllerVirtioSCSI,
+                                     Utf8StrFmt("%d", lVirtioSCSIControllerIndex),
+                                     strVBox,
+                                     strVBox);
+            }
+            else
+                throw rc;
+        }
+
 //     <const name="HardDiskImage" value="9" />
 //     <const name="Floppy" value="18" />
@@ -339,11 +366,14 @@
                 Utf8Str strStBus;
                 if ( storageBus == StorageBus_IDE)
-                strStBus = "IDE";
+                    strStBus = "IDE";
                 else if ( storageBus == StorageBus_SATA)
-                strStBus = "SATA";
+                    strStBus = "SATA";
                 else if ( storageBus == StorageBus_SCSI)
-                strStBus = "SCSI";
+                    strStBus = "SCSI";
                 else if ( storageBus == StorageBus_SAS)
-                strStBus = "SAS";
+                    strStBus = "SAS";
+                else if ( storageBus == StorageBus_VirtioSCSI)
+                    strStBus = "VirtioSCSI";
+
                 LogRel(("Warning: skip the medium (bus: %s, slot: %d, port: %d). No storage device attached.\n",
                 strStBus.c_str(), lDevice, lChannel));
@@ -516,4 +546,9 @@
                     break;
 
+                case StorageBus_VirtioSCSI:
+                    lChannelVsys = lChannel;        // should be between 0 and 255
+                    lControllerVsys = lVirtioSCSIControllerIndex;
+                    break;
+
                 case StorageBus_SCSI:
                 case StorageBus_SAS:
@@ -896,6 +931,5 @@
     }
 
-    // we need to do that as otherwise Task won't be created successfully
-    /// @todo r=bird: What's 'that' here exactly?
+    // Create a progress object here otherwise Task won't be created successfully
     HRESULT hrc = aProgress.createObject();
     if (SUCCEEDED(hrc))
@@ -1479,4 +1513,6 @@
     uint32_t idSCSIController = 0;
     int32_t lSCSIControllerIndex = 0;
+    uint32_t idVirtioSCSIController = 0;
+    int32_t lVirtioSCSIControllerIndex = 0;
 
     uint32_t ulInstanceID = 1;
@@ -1691,4 +1727,29 @@
                     break;
 
+
+                case VirtualSystemDescriptionType_HardDiskControllerVirtioSCSI:
+                    /*  <Item>
+                            <rasd:Caption>VirtioSCSIController0</rasd:Caption>
+                            <rasd:Description>VirtioSCSI Controller</rasd:Description>
+                            <rasd:InstanceId>4</rasd:InstanceId>
+                            <rasd:ResourceType>20</rasd:ResourceType>
+                            <rasd:Address>0</rasd:Address>
+                            <rasd:BusNumber>0</rasd:BusNumber>
+                        </Item>
+                    */
+                    if (uLoop == 1)
+                    {
+                        strDescription = "VirtioSCSI Controller";
+                        strCaption = "virtioSCSIController0";
+                        type = ovf::ResourceType_OtherStorageDevice; // 20
+                        lAddress = 0;
+                        lBusNumber = 0;
+                        strResourceSubType = "VirtioSCSI";
+                        // remember this ID
+                        idVirtioSCSIController = ulInstanceID;
+                        lVirtioSCSIControllerIndex = lIndexThis;
+                    }
+                    break;
+
                 case VirtualSystemDescriptionType_HardDiskImage:
                     /*  <Item>
@@ -1727,4 +1788,6 @@
                             else if (lControllerIndex == lSATAControllerIndex)
                                 ulParent = idSATAController;
+                            else if (lControllerIndex == lVirtioSCSIControllerIndex)
+                                ulParent = idVirtioSCSIController;
                         }
                         if (pos2 != Utf8Str::npos)
Index: /trunk/src/VBox/Main/src-server/ApplianceImplImport.cpp
===================================================================
--- /trunk/src/VBox/Main/src-server/ApplianceImplImport.cpp	(revision 84531)
+++ /trunk/src/VBox/Main/src-server/ApplianceImplImport.cpp	(revision 84532)
@@ -563,4 +563,6 @@
             uint16_t cSATAused = 0; NOREF(cSATAused);
             uint16_t cSCSIused = 0; NOREF(cSCSIused);
+            uint16_t cVIRTIOSCSIused = 0; NOREF(cVIRTIOSCSIused);
+
             ovf::ControllersMap::const_iterator hdcIt;
             /* Iterate through all storage controllers */
@@ -651,4 +653,26 @@
                         ++cSCSIused;
                     break;
+
+                    case ovf::HardDiskController::VIRTIOSCSI:
+                        /* Check for the constrains */
+                        if (cVIRTIOSCSIused < 1)
+                        {
+                            pNewDesc->i_addEntry(VirtualSystemDescriptionType_HardDiskControllerVirtioSCSI,
+                                                 strControllerID,
+                                                 hdc.strControllerType,
+                                                 "VirtioSCSI");
+                        }
+                        else
+                        {
+                            /* Warn only once */
+                            if (cVIRTIOSCSIused == 1)
+                                i_addWarning(tr("The virtual system \"%s\" requests support for more than one "
+                                                "VirtioSCSI controller, but VirtualBox has support for only one"),
+                                                vsysThis.strName.c_str());
+
+                        }
+                        ++cVIRTIOSCSIused;
+                    break;
+
                 }
             }
@@ -3944,4 +3968,10 @@
         }
 
+        case ovf::HardDiskController::VIRTIOSCSI:
+            controllerName = "VirtioSCSI";
+            lControllerPort = (long)ulAddressOnParent;
+            lDevice = (long)0;
+            break;
+
         default: break;
     }
@@ -4655,4 +4685,32 @@
         rc = pController->COMSETTER(ControllerType)(StorageControllerType_LsiLogicSas);
         if (FAILED(rc)) throw rc;
+    }
+
+
+    /* Storage controller VirtioSCSI */
+    std::list<VirtualSystemDescriptionEntry*> vsdeHDCVirtioSCSI =
+        vsdescThis->i_findByType(VirtualSystemDescriptionType_HardDiskControllerVirtioSCSI);
+    if (vsdeHDCVirtioSCSI.size() > 1)
+        throw setError(VBOX_E_FILE_ERROR,
+                       tr("Too many VirtioSCSI controllers in OVF; import facility only supports one"));
+    if (!vsdeHDCVirtioSCSI.empty())
+    {
+        ComPtr<IStorageController> pController;
+        Utf8Str strName("VirtioSCSI");
+        const Utf8Str &hdcVBox = vsdeHDCVirtioSCSI.front()->strVBoxCurrent;
+        if (hdcVBox == "VirtioSCSI")
+        {
+            rc = pNewMachine->AddStorageController(Bstr(strName).raw(),
+                                                   StorageBus_VirtioSCSI,
+                                                   pController.asOutParam());
+            if (FAILED(rc)) throw rc;
+
+            rc = pController->COMSETTER(ControllerType)(StorageControllerType_VirtioSCSI);
+            if (FAILED(rc)) throw rc;
+        }
+        else
+            throw setError(VBOX_E_FILE_ERROR,
+                           tr("Invalid VirtioSCSI controller type \"%s\""),
+                           hdcVBox.c_str());
     }
 
Index: /trunk/src/VBox/Main/xml/ovfreader.cpp
===================================================================
--- /trunk/src/VBox/Main/xml/ovfreader.cpp	(revision 84531)
+++ /trunk/src/VBox/Main/xml/ovfreader.cpp	(revision 84532)
@@ -662,4 +662,13 @@
                             vsys.mapControllers[i.ulInstanceID] = hdc;
                         }
+                        else if ( i.strResourceSubType.compare("VirtioSCSI", RTCString::CaseInsensitive) == 0 )
+                        {
+                            HardDiskController hdc;
+                            hdc.system = HardDiskController::VIRTIOSCSI;
+                            hdc.idController = i.ulInstanceID;
+                            //<rasd:ResourceSubType>VirtioSCSI</rasd:ResourceSubType>
+                            hdc.strControllerType = i.strResourceSubType;
+                            vsys.mapControllers[i.ulInstanceID] = hdc;
+                        }
                         else
                             throw OVFLogicError(N_("Error reading \"%s\": Host resource of type \"Other Storage Device (%d)\" is supported with SATA AHCI controllers only, line %d (subtype:%s)"),
