Index: /trunk/src/VBox/Main/idl/VirtualBox.xidl
===================================================================
--- /trunk/src/VBox/Main/idl/VirtualBox.xidl	(revision 78508)
+++ /trunk/src/VBox/Main/idl/VirtualBox.xidl	(revision 78509)
@@ -598,4 +598,10 @@
     <const name="v1_17" value="19">
       <desc>Settings version "1.17", written by VirtualBox 6.0.x.</desc>
+      <!--
+          Machine changes: nested hardware virtualization, UART type selection.
+      -->
+    </const>
+    <const name="v1_18" value="20">
+      <desc>Settings version "1.18", written by VirtualBox 6.1.x.</desc>
       <!--
           Machine changes: nested hardware virtualization, UART type selection.
@@ -21714,5 +21720,5 @@
   <enum
     name="StorageBus"
-    uuid="21371490-8542-4b5a-a74d-ee9ac2d45a90"
+    uuid="f9510869-7d07-46ba-96a6-6728fbf4adee"
     >
     <desc>
@@ -21730,9 +21736,10 @@
     <const name="USB"       value="6"/>
     <const name="PCIe"      value="7"/>
+    <const name="VirtioSCSI" value="8"/>
   </enum>
 
   <enum
     name="StorageControllerType"
-    uuid="9427f309-82e7-468f-9964-abfefc4d3058"
+    uuid="a77d457d-66a3-4368-b24c-293d0f562a9f"
     >
     <desc>
@@ -21773,4 +21780,7 @@
     <const name="NVMe"          value="10">
       <desc>An NVMe storage controller.</desc>
+    </const>
+    <const name="VirtioSCSI"    value="11">
+      <desc>Virtio SCSI storage controller.</desc>
     </const>
   </enum>
Index: /trunk/src/VBox/Main/include/ConsoleImpl.h
===================================================================
--- /trunk/src/VBox/Main/include/ConsoleImpl.h	(revision 78508)
+++ /trunk/src/VBox/Main/include/ConsoleImpl.h	(revision 78509)
@@ -984,5 +984,7 @@
         iLedNvme    = iLedUsb + cLedUsb,
         cLedNvme    = 30,
-        cLedStorage = cLedFloppy + cLedIde + cLedSata + cLedScsi + cLedSas + cLedUsb + cLedNvme
+        iLedVirtio  = iLedNvme + cLedNvme,
+        cLedVirtio  = 16,
+        cLedStorage = cLedFloppy + cLedIde + cLedSata + cLedScsi + cLedSas + cLedUsb + cLedNvme + cLedVirtio
     };
     DeviceType_T maStorageDevType[cLedStorage];
Index: /trunk/src/VBox/Main/src-client/BusAssignmentManager.cpp
===================================================================
--- /trunk/src/VBox/Main/src-client/BusAssignmentManager.cpp	(revision 78508)
+++ /trunk/src/VBox/Main/src-client/BusAssignmentManager.cpp	(revision 78509)
@@ -72,4 +72,5 @@
     {"lsilogicsas",   0, 22, 0,  1},
     {"nvme",          0, 14, 0,  1},
+    {"virtio-scsi",   0, 15, 0,  1},
 
     /* USB controllers */
@@ -204,5 +205,5 @@
     {"nic",           2, 31, 0,   0},
 
-    /* Storage controller #2 (NVMe) */
+    /* Storage controller #2 (NVMe, virtio-scsi) */
     {"nvme",          3,  0, 0,   0},
     {"nvme",          3,  1, 0,   0},
@@ -212,4 +213,11 @@
     {"nvme",          3,  5, 0,   0},
     {"nvme",          3,  6, 0,   0},
+    {"virtio-scsi",   3,  7, 0,   0},
+    {"virtio-scsi",   3,  8, 0,   0},
+    {"virtio-scsi",   3,  9, 0,   0},
+    {"virtio-scsi",   3, 10, 0,   0},
+    {"virtio-scsi",   3, 11, 0,   0},
+    {"virtio-scsi",   3, 12, 0,   0},
+    {"virtio-scsi",   3, 13, 0,   0},
 
     { NULL,          -1, -1, -1,  0}
@@ -226,5 +234,6 @@
     {"buslogic",    "storage"},
     {"lsilogicsas", "storage"},
-    {"nvme",        "storage"}
+    {"nvme",        "storage"},
+    {"virtio-scsi", "storage"}
 };
 
Index: /trunk/src/VBox/Main/src-client/ConsoleImpl.cpp
===================================================================
--- /trunk/src/VBox/Main/src-client/ConsoleImpl.cpp	(revision 78508)
+++ /trunk/src/VBox/Main/src-client/ConsoleImpl.cpp	(revision 78509)
@@ -3310,4 +3310,6 @@
         case StorageControllerType_NVMe:
             return "nvme";
+        case StorageControllerType_VirtioSCSI:
+            return "virtio-scsi";
         default:
             return NULL;
@@ -3331,4 +3333,5 @@
         case StorageBus_SAS:
         case StorageBus_PCIe:
+        case StorageBus_VirtioSCSI:
         {
             uLun = port;
Index: /trunk/src/VBox/Main/src-client/ConsoleImpl2.cpp
===================================================================
--- /trunk/src/VBox/Main/src-client/ConsoleImpl2.cpp	(revision 78508)
+++ /trunk/src/VBox/Main/src-client/ConsoleImpl2.cpp	(revision 78509)
@@ -2135,5 +2135,5 @@
          */
         com::SafeIfaceArray<IStorageController> ctrls;
-        PCFGMNODE aCtrlNodes[StorageControllerType_NVMe + 1] = {};
+        PCFGMNODE aCtrlNodes[StorageControllerType_VirtioSCSI + 1] = {};
         hrc = pMachine->COMGETTER(StorageControllers)(ComSafeArrayAsOutParam(ctrls));       H();
 
@@ -2392,4 +2392,20 @@
                                        &mapMediumAttachments, pszCtrlDev, ulInstance);
                     paLedDevType = &maStorageDevType[iLedNvme];
+                    break;
+                }
+
+                case StorageControllerType_VirtioSCSI:
+                {
+                    hrc = pBusMgr->assignPCIDevice("virtio-scsi", pCtlInst);                H();
+
+                    ULONG cPorts = 0;
+                    hrc = ctrls[i]->COMGETTER(PortCount)(&cPorts);                          H();
+                    InsertConfigInteger(pCfg, "NumTargets", cPorts);
+
+                    /* Attach the status driver */
+                    AssertRelease(cPorts <= cLedSata);
+                    i_attachStatusDriver(pCtlInst, &mapStorageLeds[iLedVirtio], 0, cPorts - 1,
+                                       &mapMediumAttachments, pszCtrlDev, ulInstance);
+                    paLedDevType = &maStorageDevType[iLedVirtio];
                     break;
                 }
Index: /trunk/src/VBox/Main/src-server/MachineImpl.cpp
===================================================================
--- /trunk/src/VBox/Main/src-server/MachineImpl.cpp	(revision 78508)
+++ /trunk/src/VBox/Main/src-server/MachineImpl.cpp	(revision 78509)
@@ -6000,5 +6000,5 @@
 {
     if (   (aConnectionType <= StorageBus_Null)
-        || (aConnectionType >  StorageBus_PCIe))
+        || (aConnectionType >  StorageBus_VirtioSCSI))
         return setError(E_INVALIDARG,
                         tr("Invalid connection type: %d"),
Index: /trunk/src/VBox/Main/src-server/StorageControllerImpl.cpp
===================================================================
--- /trunk/src/VBox/Main/src-server/StorageControllerImpl.cpp	(revision 78508)
+++ /trunk/src/VBox/Main/src-server/StorageControllerImpl.cpp	(revision 78509)
@@ -96,5 +96,5 @@
     ComAssertRet(aParent && !aName.isEmpty(), E_INVALIDARG);
     if (   (aStorageBus <= StorageBus_Null)
-        || (aStorageBus >  StorageBus_PCIe))
+        || (aStorageBus >  StorageBus_VirtioSCSI))
         return setError(E_INVALIDARG,
                         tr("Invalid storage connection type"));
@@ -162,4 +162,8 @@
             m->bd->ulPortCount = 1;
             m->bd->controllerType = StorageControllerType_NVMe;
+            break;
+        case StorageBus_VirtioSCSI:
+            m->bd->ulPortCount = 1;
+            m->bd->controllerType = StorageControllerType_VirtioSCSI;
             break;
         case StorageBus_Null: break; /* Shut up MSC. */
@@ -415,4 +419,10 @@
             break;
         }
+        case StorageBus_VirtioSCSI:
+        {
+            if (aControllerType != StorageControllerType_VirtioSCSI)
+                rc = E_INVALIDARG;
+            break;
+        }
         default:
             AssertMsgFailed(("Invalid controller type %d\n", m->bd->storageBus));
@@ -560,4 +570,15 @@
                                 tr("Invalid port count: %lu (must be in range [%lu, %lu])"),
                                 aPortCount, 1, 255);
+            break;
+        }
+        case StorageBus_VirtioSCSI:
+        {
+            /*
+             * virtio-scsi supports 256 targets (with 16384 LUNs each).
+             */
+            if (aPortCount < 1 || aPortCount > 256)
+                return setError(E_INVALIDARG,
+                                tr("Invalid port count: %lu (must be in range [%lu, %lu])"),
+                                aPortCount, 1, 256);
             break;
         }
Index: /trunk/src/VBox/Main/src-server/SystemPropertiesImpl.cpp
===================================================================
--- /trunk/src/VBox/Main/src-server/SystemPropertiesImpl.cpp	(revision 78508)
+++ /trunk/src/VBox/Main/src-server/SystemPropertiesImpl.cpp	(revision 78509)
@@ -363,4 +363,5 @@
         case StorageBus_USB:
         case StorageBus_PCIe:
+        case StorageBus_VirtioSCSI:
         {
             /* SATA and both SCSI controllers only support one device per port. */
@@ -392,4 +393,5 @@
         case StorageBus_SAS:
         case StorageBus_PCIe:
+        case StorageBus_VirtioSCSI:
         {
             *aMinPortCount = 1;
@@ -458,4 +460,9 @@
         {
             *aMaxPortCount = 8;
+            break;
+        }
+        case StorageBus_VirtioSCSI:
+        {
+            *aMaxPortCount = 256;
             break;
         }
@@ -480,4 +487,5 @@
         case StorageBus_SAS:
         case StorageBus_PCIe:
+        case StorageBus_VirtioSCSI:
             cCtrs = aChipset == ChipsetType_ICH9 ? 8 : 1;
             break;
@@ -511,4 +519,5 @@
         case StorageBus_SAS:
         case StorageBus_USB:
+        case StorageBus_VirtioSCSI:
         {
             aDeviceTypes.resize(2);
@@ -548,4 +557,5 @@
         case StorageControllerType_USB:
         case StorageControllerType_NVMe:
+        case StorageControllerType_VirtioSCSI:
             *aEnabled = false;
             break;
@@ -575,4 +585,5 @@
         case StorageControllerType_BusLogic:
         case StorageControllerType_NVMe:
+        case StorageControllerType_VirtioSCSI:
         case StorageControllerType_PIIX3:
         case StorageControllerType_PIIX4:
Index: /trunk/src/VBox/Main/xml/Settings.cpp
===================================================================
--- /trunk/src/VBox/Main/xml/Settings.cpp	(revision 78508)
+++ /trunk/src/VBox/Main/xml/Settings.cpp	(revision 78509)
@@ -411,5 +411,7 @@
             else if (ulMinor == 17)
                 sv = SettingsVersion_v1_17;
-            else if (ulMinor > 17)
+            else if (ulMinor == 18)
+                sv = SettingsVersion_v1_18;
+            else if (ulMinor > 18)
                 sv = SettingsVersion_Future;
         }
@@ -1040,4 +1042,8 @@
             break;
 
+        case SettingsVersion_v1_18:
+            pcszVersion = "1.18";
+            break;
+
         default:
             // catch human error: the assertion below will trigger in debug
@@ -1062,6 +1068,6 @@
                 // but as it's an omission of someone who changed this file
                 // it's the only generic possibility.
-                pcszVersion = "1.17";
-                m->sv = SettingsVersion_v1_17;
+                pcszVersion = "1.18";
+                m->sv = SettingsVersion_v1_18;
             }
             break;
@@ -5035,4 +5041,9 @@
             sctl.controllerType = StorageControllerType_NVMe;
         }
+        else if (strType == "VirtioSCSI")
+        {
+            sctl.storageBus = StorageBus_VirtioSCSI;
+            sctl.controllerType = StorageControllerType_VirtioSCSI;
+        }
         else
             throw ConfigFileError(this, pelmController, N_("Invalid value '%s' for StorageController/@type attribute"), strType.c_str());
@@ -6868,4 +6879,5 @@
             case StorageControllerType_USB: pcszType = "USB"; break;
             case StorageControllerType_NVMe: pcszType = "NVMe"; break;
+            case StorageControllerType_VirtioSCSI: pcszType = "VirtioSCSI"; break;
             default: /*case StorageControllerType_PIIX3:*/ pcszType = "PIIX3"; break;
         }
@@ -7360,4 +7372,21 @@
 void MachineConfigFile::bumpSettingsVersionIfNeeded()
 {
+    if (m->sv < SettingsVersion_v1_18)
+    {
+        // VirtualBox 6.1 adds a virtio-scsi storage controller.
+        for (StorageControllersList::const_iterator it = hardwareMachine.storage.llStorageControllers.begin();
+             it != hardwareMachine.storage.llStorageControllers.end();
+             ++it)
+        {
+            const StorageController &sctl = *it;
+
+            if (sctl.controllerType == StorageControllerType_VirtioSCSI)
+            {
+                m->sv = SettingsVersion_v1_18;
+                return;
+            }
+        }
+    }
+
     if (m->sv < SettingsVersion_v1_17)
     {
