Index: /trunk/src/VBox/Frontends/VirtualBox/src/converter/UIConverterBackendCOM.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/converter/UIConverterBackendCOM.cpp	(revision 78512)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/converter/UIConverterBackendCOM.cpp	(revision 78513)
@@ -579,4 +579,5 @@
         case KStorageBus_USB:    return QApplication::translate("VBoxGlobal", "USB", "StorageBus");
         case KStorageBus_PCIe:   return QApplication::translate("VBoxGlobal", "PCIe", "StorageBus");
+        case KStorageBus_VirtioSCSI: return QApplication::translate("VBoxGlobal", "virtio-scsi", "StorageBus");
         default: AssertMsgFailed(("No text for %d", bus)); break;
     }
@@ -599,4 +600,5 @@
         case KStorageControllerType_USB:         return QApplication::translate("VBoxGlobal", "USB", "StorageControllerType");
         case KStorageControllerType_NVMe:        return QApplication::translate("VBoxGlobal", "NVMe", "StorageControllerType");
+        case KStorageControllerType_VirtioSCSI:  return QApplication::translate("VBoxGlobal", "virtio-scsi", "StorageControllerType");
         default: AssertMsgFailed(("No text for %d", type)); break;
     }
@@ -618,4 +620,5 @@
     list.insert(QApplication::translate("VBoxGlobal", "USB", "StorageControllerType"),          KStorageControllerType_USB);
     list.insert(QApplication::translate("VBoxGlobal", "NVMe", "StorageControllerType"),         KStorageControllerType_NVMe);
+    list.insert(QApplication::translate("VBoxGlobal", "virtio-scsi", "StorageControllerType"),  KStorageControllerType_VirtioSCSI);
     if (!list.contains(strType))
     {
Index: /trunk/src/VBox/Frontends/VirtualBox/src/converter/UIConverterBackendGlobal.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/converter/UIConverterBackendGlobal.cpp	(revision 78512)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/converter/UIConverterBackendGlobal.cpp	(revision 78513)
@@ -245,4 +245,20 @@
             break;
         }
+        case KStorageBus_VirtioSCSI:
+        {
+            int iMaxPort = vboxGlobal().virtualBox().GetSystemProperties().GetMaxPortCountForStorageBus(storageSlot.bus);
+            if (storageSlot.port < 0 || storageSlot.port > iMaxPort)
+            {
+                AssertMsgFailed(("No text for bus=%d & port=%d", storageSlot.bus, storageSlot.port));
+                break;
+            }
+            if (storageSlot.device != 0)
+            {
+                AssertMsgFailed(("No text for bus=%d & port=%d & device=%d", storageSlot.bus, storageSlot.port, storageSlot.device));
+                break;
+            }
+            strResult = QApplication::translate("VBoxGlobal", "virtio-scsi Port %1", "StorageSlot").arg(storageSlot.port);
+            break;
+        }
         default:
         {
@@ -267,4 +283,6 @@
     list[7] = QApplication::translate("VBoxGlobal", "Floppy Device %1", "StorageSlot");
     list[8] = QApplication::translate("VBoxGlobal", "USB Port %1", "StorageSlot");
+    list[9] = QApplication::translate("VBoxGlobal", "NVMe Port %1", "StorageSlot");
+    list[10] = QApplication::translate("VBoxGlobal", "virtio-scsi Port %1", "StorageSlot");
     int index = -1;
     QRegExp regExp;
Index: /trunk/src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsStorage.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsStorage.cpp	(revision 78512)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsStorage.cpp	(revision 78513)
@@ -323,4 +323,7 @@
     m_names.insert(NVMeControllerExpand,     ":/ide_expand_16px.png");
     m_names.insert(NVMeControllerCollapse,   ":/ide_collapse_16px.png");
+    m_names.insert(VirtioSCSIControllerNormal, ":/scsi_16px.png");
+    m_names.insert(VirtioSCSIControllerExpand, ":/scsi_expand_16px.png");
+    m_names.insert(VirtioSCSIControllerCollapse, ":/scsi_collapse_16px.png");
     m_names.insert(FloppyControllerNormal,   ":/floppy_16px.png");
     m_names.insert(FloppyControllerExpand,   ":/floppy_expand_16px.png");
@@ -337,4 +340,6 @@
     m_names.insert(NVMeControllerAddEn,      ":/ide_add_16px.png");
     m_names.insert(NVMeControllerAddDis,     ":/ide_add_disabled_16px.png");
+    m_names.insert(VirtioSCSIControllerAddEn, ":/scsi_add_16px.png");
+    m_names.insert(VirtioSCSIControllerAddDis, ":/scsi_add_disabled_16px.png");
     m_names.insert(FloppyControllerAddEn,    ":/floppy_add_16px.png");
     m_names.insert(FloppyControllerAddDis,   ":/floppy_add_disabled_16px.png");
@@ -402,4 +407,7 @@
                 mPixmaps [i] = (PixmapType)(NVMeControllerNormal + i);
                 break;
+            case KStorageBus_VirtioSCSI:
+                mPixmaps [i] = (PixmapType)(VirtioSCSIControllerNormal + i);
+                break;
             default:
                 break;
@@ -470,4 +478,21 @@
         default:                 AssertFailedReturn(0);
     }
+}
+
+
+/* virtio-scsi Controller Type */
+VirtioSCSIStorageControllerType::VirtioSCSIStorageControllerType (KStorageControllerType aSubType)
+    : AbstractControllerType (KStorageBus_VirtioSCSI, aSubType)
+{
+}
+
+KStorageControllerType VirtioSCSIStorageControllerType::first() const
+{
+    return KStorageControllerType_VirtioSCSI;
+}
+
+uint VirtioSCSIStorageControllerType::size() const
+{
+    return 1;
 }
 
@@ -633,4 +658,7 @@
         case KStorageBus_PCIe:
             mCtrType = new AbstractControllerType(KStorageBus_PCIe, aControllerType);
+            break;
+        case KStorageBus_VirtioSCSI:
+            mCtrType = new VirtioSCSIStorageControllerType (aControllerType);
             break;
 
@@ -1280,4 +1308,10 @@
                    (static_cast<RootItem*>(mRootItem)->childCount(KStorageBus_PCIe) <
                     vboxGlobal().virtualBox().GetSystemProperties().GetMaxInstancesOfStorageBus(chipsetType(), KStorageBus_PCIe));
+        }
+        case R_IsMoreVirtioSCSIControllersPossible:
+        {
+            return (m_configurationAccessLevel == ConfigurationAccessLevel_Full) &&
+                   (static_cast<RootItem*>(mRootItem)->childCount(KStorageBus_VirtioSCSI) <
+                    vboxGlobal().virtualBox().GetSystemProperties().GetMaxInstancesOfStorageBus(chipsetType(), KStorageBus_VirtioSCSI));
         }
         case R_IsMoreAttachmentsPossible:
@@ -2047,5 +2081,5 @@
     : m_pModelStorage(0)
     , m_pActionAddController(0), m_pActionRemoveController(0)
-    , m_pActionAddControllerIDE(0), m_pActionAddControllerSATA(0), m_pActionAddControllerSCSI(0), m_pActionAddControllerSAS(0), m_pActionAddControllerFloppy(0), m_pActionAddControllerUSB(0), m_pActionAddControllerNVMe(0)
+    , m_pActionAddControllerIDE(0), m_pActionAddControllerSATA(0), m_pActionAddControllerSCSI(0), m_pActionAddControllerSAS(0), m_pActionAddControllerFloppy(0), m_pActionAddControllerUSB(0), m_pActionAddControllerNVMe(0), m_pActionAddControllerVirtioSCSI(0)
     , m_pActionAddAttachment(0), m_pActionRemoveAttachment(0)
     , m_pActionAddAttachmentHD(0), m_pActionAddAttachmentCD(0), m_pActionAddAttachmentFD(0)
@@ -2426,4 +2460,5 @@
     m_pActionAddControllerUSB->setText(tr("Add USB Controller"));
     m_pActionAddControllerNVMe->setText(tr("Add NVMe Controller"));
+    m_pActionAddControllerVirtioSCSI->setText(tr("Add virtio-scsi Controller"));
     m_pActionRemoveController->setText(tr("Remove Controller"));
     m_pActionAddAttachment->setText(tr("Add Attachment"));
@@ -2587,4 +2622,5 @@
     menu.addAction(m_pActionAddControllerUSB);
     menu.addAction(m_pActionAddControllerNVMe);
+    menu.addAction(m_pActionAddControllerVirtioSCSI);
     menu.exec(QCursor::pos());
 }
@@ -2623,4 +2659,9 @@
 {
     addControllerWrapper(generateUniqueControllerName("NVMe"), KStorageBus_PCIe, KStorageControllerType_NVMe);
+}
+
+void UIMachineSettingsStorage::sltAddControllerVirtioSCSI()
+{
+    addControllerWrapper(generateUniqueControllerName("VirtIO"), KStorageBus_VirtioSCSI, KStorageControllerType_VirtioSCSI);
 }
 
@@ -3064,4 +3105,5 @@
     const bool fUSBPossible = m_pModelStorage->data(index, StorageModel::R_IsMoreUSBControllersPossible).toBool();
     const bool fNVMePossible = m_pModelStorage->data(index, StorageModel::R_IsMoreNVMeControllersPossible).toBool();
+    const bool fVirtioSCSIPossible = m_pModelStorage->data(index, StorageModel::R_IsMoreVirtioSCSIControllersPossible).toBool();
 
     const bool fController = m_pModelStorage->data(index, StorageModel::R_IsController).toBool();
@@ -3071,5 +3113,5 @@
 
     /* Configure "add controller" actions: */
-    m_pActionAddController->setEnabled(fIDEPossible || fSATAPossible || fSCSIPossible || fFloppyPossible || fSASPossible || fUSBPossible || fNVMePossible);
+    m_pActionAddController->setEnabled(fIDEPossible || fSATAPossible || fSCSIPossible || fFloppyPossible || fSASPossible || fUSBPossible || fNVMePossible || fVirtioSCSIPossible);
     m_pActionAddControllerIDE->setEnabled(fIDEPossible);
     m_pActionAddControllerSATA->setEnabled(fSATAPossible);
@@ -3079,4 +3121,5 @@
     m_pActionAddControllerUSB->setEnabled(fUSBPossible);
     m_pActionAddControllerNVMe->setEnabled(fNVMePossible);
+    m_pActionAddControllerVirtioSCSI->setEnabled(fVirtioSCSIPossible);
 
     /* Configure "add attachment" actions: */
@@ -3509,4 +3552,12 @@
         }
 
+        /* Create 'Add virtio-scsi Controller' action: */
+        m_pActionAddControllerVirtioSCSI = new QAction(this);
+        AssertPtrReturnVoid(m_pActionAddControllerVirtioSCSI);
+        {
+            /* Configure action: */
+            m_pActionAddControllerVirtioSCSI->setIcon(iconPool()->icon(VirtioSCSIControllerAddEn, VirtioSCSIControllerAddDis));
+        }
+
         /* Create 'Remove Controller' action: */
         m_pActionRemoveController = new QAction(this);
@@ -3645,4 +3696,5 @@
     connect(m_pActionAddControllerUSB, SIGNAL(triggered(bool)), this, SLOT(sltAddControllerUSB()));
     connect(m_pActionAddControllerNVMe, SIGNAL(triggered(bool)), this, SLOT(sltAddControllerNVMe()));
+    connect(m_pActionAddControllerVirtioSCSI, SIGNAL(triggered(bool)), this, SLOT(sltAddControllerVirtioSCSI()));
     connect(m_pActionRemoveController, SIGNAL(triggered(bool)), this, SLOT(sltRemoveController()));
     connect(m_pActionAddAttachment, SIGNAL(triggered(bool)), this, SLOT(sltAddAttachment()));
@@ -3707,4 +3759,7 @@
             Assert(m_pModelStorage->data(index, StorageModel::R_IsMoreNVMeControllersPossible).toBool());
             break;
+        case KStorageBus_VirtioSCSI:
+            Assert(m_pModelStorage->data(index, StorageModel::R_IsMoreVirtioSCSIControllersPossible).toBool());
+            break;
         default:
             break;
@@ -3991,5 +4046,6 @@
                 && (   newControllerData.m_controllerBus == KStorageBus_SATA
                     || newControllerData.m_controllerBus == KStorageBus_SAS
-                    || newControllerData.m_controllerBus == KStorageBus_PCIe))
+                    || newControllerData.m_controllerBus == KStorageBus_PCIe
+                    || newControllerData.m_controllerBus == KStorageBus_VirtioSCSI))
             {
                 ULONG uNewPortCount = newControllerData.m_uPortCount;
@@ -4070,5 +4126,6 @@
                 && (   newControllerData.m_controllerBus == KStorageBus_SATA
                     || newControllerData.m_controllerBus == KStorageBus_SAS
-                    || newControllerData.m_controllerBus == KStorageBus_PCIe))
+                    || newControllerData.m_controllerBus == KStorageBus_PCIe
+                    || newControllerData.m_controllerBus == KStorageBus_VirtioSCSI))
             {
                 ULONG uNewPortCount = newControllerData.m_uPortCount;
Index: /trunk/src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsStorage.h
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsStorage.h	(revision 78512)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsStorage.h	(revision 78513)
@@ -96,4 +96,7 @@
     NVMeControllerExpand,
     NVMeControllerCollapse,
+    VirtioSCSIControllerNormal,
+    VirtioSCSIControllerExpand,
+    VirtioSCSIControllerCollapse,
     FloppyControllerNormal,
     FloppyControllerExpand,
@@ -110,4 +113,6 @@
     NVMeControllerAddEn,
     NVMeControllerAddDis,
+    VirtioSCSIControllerAddEn,
+    VirtioSCSIControllerAddDis,
     FloppyControllerAddEn,
     FloppyControllerAddDis,
@@ -161,4 +166,17 @@
     KStorageControllerType mCtrType;
     QList<PixmapType> mPixmaps;
+};
+
+/* virtio-scsi Controller Type */
+class SHARED_LIBRARY_STUFF VirtioSCSIStorageControllerType : public AbstractControllerType
+{
+public:
+
+    VirtioSCSIStorageControllerType (KStorageControllerType aSubType);
+
+private:
+
+    KStorageControllerType first() const;
+    uint size() const;
 };
 
@@ -380,4 +398,5 @@
         R_IsMoreUSBControllersPossible,
         R_IsMoreNVMeControllersPossible,
+        R_IsMoreVirtioSCSIControllersPossible,
         R_IsMoreAttachmentsPossible,
 
@@ -587,4 +606,6 @@
     /** Handles command to add NVMe controller. */
     void sltAddControllerNVMe();
+    /** Handles command to add virtio-scsi controller. */
+    void sltAddControllerVirtioSCSI();
     /** Handles command to remove controller. */
     void sltRemoveController();
@@ -733,4 +754,6 @@
     /** Holds the 'Add NVMe Controller' action instance. */
     QAction *m_pActionAddControllerNVMe;
+    /** Holds the 'Add virtio-scsi Controller' action instance. */
+    QAction *m_pActionAddControllerVirtioSCSI;
     /** Holds the 'Add Attachment' action instance. */
     QAction *m_pActionAddAttachment;
