Index: /trunk/src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsStorage.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsStorage.cpp	(revision 37955)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsStorage.cpp	(revision 37956)
@@ -386,4 +386,5 @@
     , mCtrName (aName)
     , mCtrType (0)
+    , mPortCount (0)
     , mUseIoCache (false)
 {
@@ -444,4 +445,16 @@
 }
 
+uint ControllerItem::portCount()
+{
+    /* Recalculate actual port count: */
+    for (int i = 0; i < mAttachments.size(); ++i)
+    {
+        AttachmentItem *pItem = static_cast<AttachmentItem*>(mAttachments[i]);
+        if (mPortCount < (uint)pItem->attSlot().port + 1)
+            mPortCount = (uint)pItem->attSlot().port + 1;
+    }
+    return mPortCount;
+}
+
 bool ControllerItem::ctrUseIoCache() const
 {
@@ -457,4 +470,10 @@
 {
     mCtrType->setCtrType (aCtrType);
+}
+
+void ControllerItem::setPortCount (uint aPortCount)
+{
+    /* Limit maximum port count: */
+    mPortCount = qMin(aPortCount, (uint)vboxGlobal().virtualBox().GetSystemProperties().GetMaxPortCountForStorageBus(ctrBusType()));
 }
 
@@ -1047,4 +1066,11 @@
             return result;
         }
+        case R_CtrPortCount:
+        {
+            if (AbstractItem *item = static_cast <AbstractItem*> (aIndex.internalPointer()))
+                if (item->rtti() == AbstractItem::Type_ControllerItem)
+                    return static_cast <ControllerItem*> (item)->portCount();
+            return 0;
+        }
         case R_CtrIoCache:
         {
@@ -1262,4 +1288,15 @@
                 {
                     static_cast <ControllerItem*> (item)->setCtrType (aValue.value <KStorageControllerType>());
+                    emit dataChanged (aIndex, aIndex);
+                    return true;
+                }
+            return false;
+        }
+        case R_CtrPortCount:
+        {
+            if (AbstractItem *item = static_cast <AbstractItem*> (aIndex.internalPointer()))
+                if (item->rtti() == AbstractItem::Type_ControllerItem)
+                {
+                    static_cast <ControllerItem*> (item)->setPortCount (aValue.toUInt());
                     emit dataChanged (aIndex, aIndex);
                     return true;
@@ -1775,4 +1812,7 @@
     QMenu *pOpenMediumMenu = new QMenu(this);
     mTbOpen->setMenu(pOpenMediumMenu);
+
+    /* Controller pane initialization: */
+    mSbPortCount->setValue(0);
 
     /* Info Pane initialization */
@@ -1824,4 +1864,5 @@
     connect (mCbType, SIGNAL (activated (int)), this, SLOT (setInformation()));
     connect (mCbSlot, SIGNAL (activated (int)), this, SLOT (setInformation()));
+    connect (mSbPortCount, SIGNAL (valueChanged (int)), this, SLOT (setInformation()));
     connect (mCbIoCache, SIGNAL (stateChanged (int)), this, SLOT (setInformation()));
     connect (m_pMediumIdHolder, SIGNAL (sigChanged()), this, SLOT (setInformation()));
@@ -1876,4 +1917,5 @@
             storageControllerData.m_controllerBus = controller.GetBus();
             storageControllerData.m_controllerType = controller.GetControllerType();
+            storageControllerData.m_uPortCount = controller.GetPortCount();
             storageControllerData.m_fUseHostIOCache = controller.GetUseHostIOCache();
 
@@ -1938,4 +1980,5 @@
                                                                    controllerData.m_controllerType);
         QUuid controllerId = QUuid(mStorageModel->data(controllerIndex, StorageModel::R_ItemId).toString());
+        mStorageModel->setData(controllerIndex, controllerData.m_uPortCount, StorageModel::R_CtrPortCount);
         mStorageModel->setData(controllerIndex, controllerData.m_fUseHostIOCache, StorageModel::R_CtrIoCache);
 
@@ -1993,4 +2036,5 @@
         controllerData.m_controllerBus = mStorageModel->data(controllerIndex, StorageModel::R_CtrBusType).value<KStorageBus>();
         controllerData.m_controllerType = mStorageModel->data(controllerIndex, StorageModel::R_CtrType).value<KStorageControllerType>();
+        controllerData.m_uPortCount = mStorageModel->data(controllerIndex, StorageModel::R_CtrPortCount).toUInt();
         controllerData.m_fUseHostIOCache = mStorageModel->data(controllerIndex, StorageModel::R_CtrIoCache).toBool();
 
@@ -2386,4 +2430,10 @@
                 int ctrPos = mCbType->findText (vboxGlobal().toString (type));
                 mCbType->setCurrentIndex (ctrPos == -1 ? 0 : ctrPos);
+
+                KStorageBus bus = mStorageModel->data (index, StorageModel::R_CtrBusType).value <KStorageBus>();
+                mLbPortCount->setVisible (bus == KStorageBus_SATA);
+                mSbPortCount->setVisible (bus == KStorageBus_SATA);
+                uint uPortCount = mStorageModel->data (index, StorageModel::R_CtrPortCount).toUInt();
+                mSbPortCount->setValue (uPortCount);
 
                 bool isUseIoCache = mStorageModel->data (index, StorageModel::R_CtrIoCache).toBool();
@@ -2498,4 +2548,6 @@
                 mStorageModel->setData (index, QVariant::fromValue (vboxGlobal().toControllerType (mCbType->currentText())),
                                         StorageModel::R_CtrType);
+            else if (sdr == mSbPortCount)
+                mStorageModel->setData (index, mSbPortCount->value(), StorageModel::R_CtrPortCount);
             else if (sdr == mCbIoCache)
                 mStorageModel->setData (index, mCbIoCache->isChecked(), StorageModel::R_CtrIoCache);
@@ -3245,4 +3297,5 @@
         KStorageBus controllerBus = controllerData.m_controllerBus;
         KStorageControllerType controllerType = controllerData.m_controllerType;
+        ULONG uPortCount = controllerData.m_uPortCount;
         bool fUseHostIOCache = controllerData.m_fUseHostIOCache;
 
@@ -3263,14 +3316,10 @@
                 controller.SetControllerType(controllerType);
                 controller.SetUseHostIOCache(fUseHostIOCache);
-
-                /* Set port count to max possible initially: */
                 if (controllerData.m_controllerBus == KStorageBus_SATA)
                 {
-                    CSystemProperties properties = vboxGlobal().virtualBox().GetSystemProperties();
-                    controller.SetPortCount(properties.GetMaxPortCountForStorageBus(KStorageBus_SATA));
+                    uPortCount = qMax(uPortCount, controller.GetMinPortCount());
+                    uPortCount = qMin(uPortCount, controller.GetMaxPortCount());
+                    controller.SetPortCount(uPortCount);
                 }
-
-                /* Prepare max used port for SATA controller: */
-                int cMaxUsedPort = -1;
 
                 /* For each storage attachment: */
@@ -3283,22 +3332,4 @@
                     if (!attachmentCache.wasRemoved())
                         fSuccess = createStorageAttachment(controllerCache, attachmentCache);
-
-                    /* Check that machine is OK: */
-                    if (fSuccess)
-                    {
-                        /* Get storage attachment data: */
-                        const UIDataSettingsMachineStorageAttachment &attachmentData = attachmentCache.data();
-                        /* Calculate the number of used ports: */
-                        cMaxUsedPort = attachmentData.m_iAttachmentPort > cMaxUsedPort ? attachmentData.m_iAttachmentPort : cMaxUsedPort;
-                    }
-                }
-
-                /* Set max used port for SATA controller: */
-                if (fSuccess && controllerData.m_controllerBus == KStorageBus_SATA)
-                {
-                    ULONG uSataPortsCount = cMaxUsedPort + 1;
-                    uSataPortsCount = qMax(uSataPortsCount, controller.GetMinPortCount());
-                    uSataPortsCount = qMin(uSataPortsCount, controller.GetMaxPortCount());
-                    controller.SetPortCount(uSataPortsCount);
                 }
             }
@@ -3322,4 +3353,5 @@
         KStorageBus controllerBus = controllerData.m_controllerBus;
         KStorageControllerType controllerType = controllerData.m_controllerType;
+        ULONG uPortCount = controllerData.m_uPortCount;
         bool fUseHostIOCache = controllerData.m_fUseHostIOCache;
 
@@ -3333,14 +3365,10 @@
             controller.SetControllerType(controllerType);
             controller.SetUseHostIOCache(fUseHostIOCache);
-
-            /* Set port count to max possible initially: */
             if (controllerData.m_controllerBus == KStorageBus_SATA)
             {
-                CSystemProperties properties = vboxGlobal().virtualBox().GetSystemProperties();
-                controller.SetPortCount(properties.GetMaxPortCountForStorageBus(KStorageBus_SATA));
+                uPortCount = qMax(uPortCount, controller.GetMinPortCount());
+                uPortCount = qMin(uPortCount, controller.GetMaxPortCount());
+                controller.SetPortCount(uPortCount);
             }
-
-            /* Prepare max used port for SATA controller: */
-            int cMaxUsedPort = -1;
 
             /* For each storage attachment: */
@@ -3357,22 +3385,4 @@
                 if (attachmentCache.wasUpdated() && isAttachmentCouldBeUpdated(attachmentCache))
                     fSuccess = updateStorageAttachment(controllerCache, attachmentCache);
-
-                /* Check that machine is OK: */
-                if (fSuccess && (attachmentCache.wasCreated() || attachmentCache.wasUpdated()))
-                {
-                    /* Get storage attachment data: */
-                    const UIDataSettingsMachineStorageAttachment &attachmentData = attachmentCache.data();
-                    /* Calculate the number of used ports: */
-                    cMaxUsedPort = attachmentData.m_iAttachmentPort > cMaxUsedPort ? attachmentData.m_iAttachmentPort : cMaxUsedPort;
-                }
-            }
-
-            /* Set max used port for SATA controller: */
-            if (fSuccess && controllerBus == KStorageBus_SATA)
-            {
-                ULONG uSataPortsCount = cMaxUsedPort + 1;
-                uSataPortsCount = qMax(uSataPortsCount, controller.GetMinPortCount());
-                uSataPortsCount = qMin(uSataPortsCount, controller.GetMaxPortCount());
-                controller.SetPortCount(uSataPortsCount);
             }
         }
@@ -3627,4 +3637,6 @@
     mLbType->setEnabled(isMachineOffline());
     mCbType->setEnabled(isMachineOffline());
+    mLbPortCount->setEnabled(isMachineOffline());
+    mSbPortCount->setEnabled(isMachineOffline());
     mCbIoCache->setEnabled(isMachineOffline());
     /* Attachments pane: */
Index: /trunk/src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsStorage.h
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsStorage.h	(revision 37955)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsStorage.h	(revision 37956)
@@ -311,8 +311,10 @@
     KStorageControllerType ctrType() const;
     ControllerTypeList ctrTypes() const;
+    uint portCount();
     bool ctrUseIoCache() const;
 
     void setCtrName (const QString &aCtrName);
     void setCtrType (KStorageControllerType aCtrType);
+    void setPortCount (uint aPortCount);
     void setCtrUseIoCache (bool aUseIoCache);
 
@@ -338,4 +340,5 @@
     QString mCtrName;
     AbstractControllerType *mCtrType;
+    uint mPortCount;
     bool mUseIoCache;
     QList <AbstractItem*> mAttachments;
@@ -441,4 +444,5 @@
         R_CtrDevices,
         R_CtrBusType,
+        R_CtrPortCount,
         R_CtrIoCache,
 
@@ -601,4 +605,5 @@
         , m_controllerBus(KStorageBus_Null)
         , m_controllerType(KStorageControllerType_Null)
+        , m_uPortCount(0)
         , m_fUseHostIOCache(false) {}
     /* Functions: */
@@ -608,4 +613,5 @@
                (m_controllerBus == other.m_controllerBus) &&
                (m_controllerType == other.m_controllerType) &&
+               (m_uPortCount == other.m_uPortCount) &&
                (m_fUseHostIOCache == other.m_fUseHostIOCache);
     }
@@ -617,4 +623,5 @@
     KStorageBus m_controllerBus;
     KStorageControllerType m_controllerType;
+    uint m_uPortCount;
     bool m_fUseHostIOCache;
 };
Index: /trunk/src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsStorage.ui
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsStorage.ui	(revision 37955)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsStorage.ui	(revision 37956)
@@ -209,5 +209,31 @@
          </widget>
         </item>
+        <item row="3" column="1" >
+         <widget class="QLabel" name="mLbPortCount" >
+          <property name="text" >
+           <string>&amp;Port Count:</string>
+          </property>
+          <property name="buddy" >
+           <cstring>mSbPortCount</cstring>
+          </property>
+          <property name="alignment" >
+           <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
+          </property>
+         </widget>
+        </item>
         <item row="3" column="2" >
+         <widget class="QSpinBox" name="mSbPortCount" >
+          <property name="whatsThis" >
+           <string>Selects the port count of the SATA storage controller currently selected in the Storage Tree. This value can't be less than the maximum used port number + 1.</string>
+          </property>
+          <property name="sizePolicy" >
+           <sizepolicy vsizetype="Fixed" hsizetype="Expanding" >
+            <horstretch>0</horstretch>
+            <verstretch>0</verstretch>
+           </sizepolicy>
+          </property>
+         </widget>
+        </item>
+        <item row="4" column="2" >
          <widget class="QCheckBox" name="mCbIoCache" >
           <property name="whatsThis" >
@@ -219,5 +245,5 @@
          </widget>
         </item>
-        <item row="4" column="0" colspan="3" >
+        <item row="5" column="0" colspan="3" >
          <spacer name="mSp3" >
           <property name="orientation" >
