Index: /trunk/src/VBox/Frontends/VirtualBox/src/settings/UISettingsDialogSpecific.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/settings/UISettingsDialogSpecific.cpp	(revision 33931)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/settings/UISettingsDialogSpecific.cpp	(revision 33932)
@@ -892,4 +892,45 @@
 #endif /* !VBOX_OSE */
 
+    if (pPage == m_pSelector->idToPage(VMSettingsPage_Storage))
+    {
+        /* Get System & Storage pages: */
+        UIMachineSettingsSystem *pSystemPage =
+            qobject_cast<UIMachineSettingsSystem*>(m_pSelector->idToPage(VMSettingsPage_System));
+        UIMachineSettingsStorage *pStoragePage =
+            qobject_cast<UIMachineSettingsStorage*>(m_pSelector->idToPage(VMSettingsPage_Storage));
+        if (pSystemPage && pStoragePage)
+        {
+            /* Update chiset type for the Storage settings page: */
+            if (pStoragePage->chipsetType() != pSystemPage->chipsetType())
+                pStoragePage->setChipsetType(pSystemPage->chipsetType());
+            /* Check for excessive controllers on Storage page controllers list: */
+            QStringList excessiveList;
+            QMap<KStorageBus, int> currentType = pStoragePage->currentControllerTypes();
+            QMap<KStorageBus, int> maximumType = pStoragePage->maximumControllerTypes();
+            for (int iStorageBusType = KStorageBus_IDE; iStorageBusType <= KStorageBus_SAS; ++iStorageBusType)
+            {
+                if (currentType[(KStorageBus)iStorageBusType] > maximumType[(KStorageBus)iStorageBusType])
+                {
+                    QString strExcessiveRecord = QString("%1 (%2)");
+                    strExcessiveRecord = strExcessiveRecord.arg(QString("<b>%1</b>").arg(vboxGlobal().toString((KStorageBus)iStorageBusType)));
+                    strExcessiveRecord = strExcessiveRecord.arg(maximumType[(KStorageBus)iStorageBusType] == 1 ?
+                                                                tr("at most one supported") :
+                                                                tr("up to %1 supported").arg(maximumType[(KStorageBus)iStorageBusType]));
+                    excessiveList << strExcessiveRecord;
+                }
+            }
+            if (!excessiveList.isEmpty())
+            {
+                strWarning = tr(
+                    "you are currently using more storage controllers than a %1 chipset supports. "
+                    "Please change the chipset type on the System settings page or reduce the number "
+                    "of the following storage controllers on the Storage settings page: %2.")
+                    .arg(vboxGlobal().toString(pStoragePage->chipsetType()))
+                    .arg(excessiveList.join(", "));
+                return false;
+            }
+        }
+    }
+
     return true;
 }
Index: /trunk/src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsStorage.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsStorage.cpp	(revision 33931)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsStorage.cpp	(revision 33932)
@@ -1507,15 +1507,40 @@
 }
 
+KChipsetType StorageModel::chipsetType() const
+{
+    return m_chipsetType;
+}
+
+void StorageModel::setChipsetType(KChipsetType type)
+{
+    m_chipsetType = type;
+}
+
+QMap<KStorageBus, int> StorageModel::currentControllerTypes() const
+{
+    QMap<KStorageBus, int> currentMap;
+    for (int iStorageBusType = KStorageBus_IDE; iStorageBusType <= KStorageBus_SAS; ++iStorageBusType)
+    {
+        currentMap.insert((KStorageBus)iStorageBusType,
+                          static_cast<RootItem*>(mRootItem)->childCount((KStorageBus)iStorageBusType));
+    }
+    return currentMap;
+}
+
+QMap<KStorageBus, int> StorageModel::maximumControllerTypes() const
+{
+    QMap<KStorageBus, int> maximumMap;
+    for (int iStorageBusType = KStorageBus_IDE; iStorageBusType <= KStorageBus_SAS; ++iStorageBusType)
+    {
+        maximumMap.insert((KStorageBus)iStorageBusType,
+                          vboxGlobal().virtualBox().GetSystemProperties().GetMaxInstancesOfStorageBus(chipsetType(), (KStorageBus)iStorageBusType));
+    }
+    return maximumMap;
+}
+
 Qt::ItemFlags StorageModel::flags (const QModelIndex &aIndex) const
 {
     return !aIndex.isValid() ? QAbstractItemModel::flags (aIndex) :
            Qt::ItemIsEnabled | Qt::ItemIsSelectable;
-}
-
-KChipsetType StorageModel::chipsetType() const
-{
-    CMachine machine = vboxGlobal().virtualBox().FindMachine(mRootItem->machineId());
-    Assert(!machine.isNull());
-    return machine.GetChipsetType();
 }
 
@@ -1797,4 +1822,25 @@
 }
 
+KChipsetType UIMachineSettingsStorage::chipsetType() const
+{
+    return mStorageModel->chipsetType();
+}
+
+void UIMachineSettingsStorage::setChipsetType(KChipsetType type)
+{
+    mStorageModel->setChipsetType(type);
+    updateActionsState();
+}
+
+QMap<KStorageBus, int> UIMachineSettingsStorage::currentControllerTypes() const
+{
+    return mStorageModel->currentControllerTypes();
+}
+
+QMap<KStorageBus, int> UIMachineSettingsStorage::maximumControllerTypes() const
+{
+    return mStorageModel->maximumControllerTypes();
+}
+
 /* Load data to cashe from corresponding external object(s),
  * this task COULD be performed in other than GUI thread: */
Index: /trunk/src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsStorage.h
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsStorage.h	(revision 33931)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsStorage.h	(revision 33932)
@@ -498,9 +498,13 @@
     QModelIndex attachmentBySlot(QModelIndex controllerIndex, StorageSlot attachmentStorageSlot);
 
+    KChipsetType chipsetType() const;
+    void setChipsetType(KChipsetType type);
+
+    QMap<KStorageBus, int> currentControllerTypes() const;
+    QMap<KStorageBus, int> maximumControllerTypes() const;
+
 private:
 
     Qt::ItemFlags flags (const QModelIndex &aIndex) const;
-
-    KChipsetType chipsetType() const;
 
     AbstractItem *mRootItem;
@@ -513,4 +517,6 @@
 
     ToolTipType mToolTipType;
+
+    KChipsetType m_chipsetType;
 };
 Q_DECLARE_METATYPE (StorageModel::ToolTipType);
@@ -568,4 +574,10 @@
 
     UIMachineSettingsStorage();
+
+    KChipsetType chipsetType() const;
+    void setChipsetType(KChipsetType type);
+
+    QMap<KStorageBus, int> currentControllerTypes() const;
+    QMap<KStorageBus, int> maximumControllerTypes() const;
 
 signals:
Index: /trunk/src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsSystem.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsSystem.cpp	(revision 33931)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsSystem.cpp	(revision 33932)
@@ -158,4 +158,9 @@
 {
     return mCbUseAbsHID->isChecked();
+}
+
+KChipsetType UIMachineSettingsSystem::chipsetType() const
+{
+    return (KChipsetType)mCbChipset->itemData(mCbChipset->currentIndex()).toInt();
 }
 
Index: /trunk/src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsSystem.h
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsSystem.h	(revision 33931)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsSystem.h	(revision 33932)
@@ -62,4 +62,5 @@
     int cpuCount() const;
     bool isHIDEnabled() const;
+    KChipsetType chipsetType() const;
 
 signals:
