Index: /trunk/src/VBox/Frontends/VirtualBox/VirtualBox1.qrc
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/VirtualBox1.qrc	(revision 23579)
+++ /trunk/src/VBox/Frontends/VirtualBox/VirtualBox1.qrc	(revision 23580)
@@ -208,13 +208,21 @@
     <file alias="ide_expand_16px.png">images/ide_expand_16px.png</file>
     <file alias="ide_collapse_16px.png">images/ide_collapse_16px.png</file>
+    <file alias="ide_add_16px.png">images/ide_add_16px.png</file>
+    <file alias="ide_add_disabled_16px.png">images/ide_add_disabled_16px.png</file>
     <file alias="sata_16px.png">images/sata_16px.png</file>
     <file alias="sata_expand_16px.png">images/sata_expand_16px.png</file>
     <file alias="sata_collapse_16px.png">images/sata_collapse_16px.png</file>
+    <file alias="sata_add_16px.png">images/sata_add_16px.png</file>
+    <file alias="sata_add_disabled_16px.png">images/sata_add_disabled_16px.png</file>
     <file alias="scsi_16px.png">images/scsi_16px.png</file>
     <file alias="scsi_expand_16px.png">images/scsi_expand_16px.png</file>
     <file alias="scsi_collapse_16px.png">images/scsi_collapse_16px.png</file>
+    <file alias="scsi_add_16px.png">images/scsi_add_16px.png</file>
+    <file alias="scsi_add_disabled_16px.png">images/scsi_add_disabled_16px.png</file>
     <file alias="floppy_16px.png">images/floppy_16px.png</file>
     <file alias="floppy_expand_16px.png">images/floppy_expand_16px.png</file>
     <file alias="floppy_collapse_16px.png">images/floppy_collapse_16px.png</file>
+    <file alias="floppy_add_16px.png">images/floppy_add_16px.png</file>
+    <file alias="floppy_add_disabled_16px.png">images/floppy_add_disabled_16px.png</file>
     <file alias="import_16px.png">images/import_16px.png</file>
     <file alias="export_16px.png">images/export_16px.png</file>
Index: /trunk/src/VBox/Frontends/VirtualBox/include/VBoxMediaComboBox.h
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/include/VBoxMediaComboBox.h	(revision 23579)
+++ /trunk/src/VBox/Frontends/VirtualBox/include/VBoxMediaComboBox.h	(revision 23580)
@@ -44,4 +44,5 @@
     QString id (int = -1) const;
     QString location (int = -1) const;
+    VBoxDefs::MediumType type() const { return mType; }
 
     void setCurrentItem (const QString &aItemId);
Index: /trunk/src/VBox/Frontends/VirtualBox/include/VBoxVMSettingsHD.h
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/include/VBoxVMSettingsHD.h	(revision 23579)
+++ /trunk/src/VBox/Frontends/VirtualBox/include/VBoxVMSettingsHD.h	(revision 23580)
@@ -62,42 +62,51 @@
     enum PixmapType
     {
-        InvalidPixmap      = -1,
-
-        AddControllerEn    =  0,
-        AddControllerDis   =  1,
-        DelControllerEn    =  2,
-        DelControllerDis   =  3,
-
-        AddAttachmentEn    =  4,
-        AddAttachmentDis   =  5,
-        DelAttachmentEn    =  6,
-        DelAttachmentDis   =  7,
-
-        IDEController      =  8,
-        IDEExpand          =  9,
-        IDECollapse        = 10,
-        SATAController     = 11,
-        SATAExpand         = 12,
-        SATACollapse       = 13,
-        SCSIController     = 14,
-        SCSIExpand         = 15,
-        SCSICollapse       = 16,
-        FloppyController   = 17,
-        FloppyExpand       = 18,
-        FloppyCollapse     = 19,
-
-        HDAttachmentEn     = 20,
-        CDAttachmentEn     = 21,
-        FDAttachmentEn     = 22,
-
-        HDAttachmentAddEn  = 23,
-        HDAttachmentAddDis = 24,
-        CDAttachmentAddEn  = 25,
-        CDAttachmentAddDis = 26,
-        FDAttachmentAddEn  = 27,
-        FDAttachmentAddDis = 28,
-
-        VMMEn              = 29,
-        VMMDis             = 30,
+        InvalidPixmap            = -1,
+
+        ControllerAddEn          =  0,
+        ControllerAddDis         =  1,
+        ControllerDelEn          =  2,
+        ControllerDelDis         =  3,
+
+        AttachmentAddEn          =  4,
+        AttachmentAddDis         =  5,
+        AttachmentDelEn          =  6,
+        AttachmentDelDis         =  7,
+
+        IDEControllerNormal      =  8,
+        IDEControllerExpand      =  9,
+        IDEControllerCollapse    = 10,
+        SATAControllerNormal     = 11,
+        SATAControllerExpand     = 12,
+        SATAControllerCollapse   = 13,
+        SCSIControllerNormal     = 14,
+        SCSIControllerExpand     = 15,
+        SCSIControllerCollapse   = 16,
+        FloppyControllerNormal   = 17,
+        FloppyControllerExpand   = 18,
+        FloppyControllerCollapse = 19,
+
+        IDEControllerAddEn       = 20,
+        IDEControllerAddDis      = 21,
+        SATAControllerAddEn      = 22,
+        SATAControllerAddDis     = 23,
+        SCSIControllerAddEn      = 24,
+        SCSIControllerAddDis     = 25,
+        FloppyControllerAddEn    = 26,
+        FloppyControllerAddDis   = 27,
+
+        HDAttachmentNormal       = 28,
+        CDAttachmentNormal       = 29,
+        FDAttachmentNormal       = 30,
+
+        HDAttachmentAddEn        = 31,
+        HDAttachmentAddDis       = 32,
+        CDAttachmentAddEn        = 33,
+        CDAttachmentAddDis       = 34,
+        FDAttachmentAddEn        = 35,
+        FDAttachmentAddDis       = 36,
+
+        VMMEn                    = 37,
+        VMMDis                   = 38,
 
         MaxIndex
@@ -255,4 +264,6 @@
     RootItem();
    ~RootItem();
+
+    ULONG childCount (KStorageBus aBus) const;
 
 private:
@@ -395,5 +406,8 @@
 
         R_ToolTipType,
-        R_IsMoreControllersPossible,
+        R_IsMoreIDEControllersPossible,
+        R_IsMoreSATAControllersPossible,
+        R_IsMoreSCSIControllersPossible,
+        R_IsMoreFloppyControllersPossible,
         R_IsMoreAttachmentsPossible,
 
@@ -538,5 +552,8 @@
     void delController();
 
-    void addAttachment (KDeviceType aDeviceType = KDeviceType_Null);
+    void addAttachment();
+    void addHDAttachment();
+    void addCDAttachment();
+    void addFDAttachment();
     void delAttachment();
 
@@ -561,4 +578,7 @@
 
 private:
+
+    void addControllerWrapper (const QString &aName, KStorageBus aBus, KStorageControllerType aType);
+    void addAttachmentWrapper (KDeviceType aDevice);
 
     QString getWithNewHDWizard();
@@ -581,4 +601,7 @@
     QAction *mDelCtrAction;
     QAction *mAddAttAction;
+    QAction *mAddHDAttAction;
+    QAction *mAddCDAttAction;
+    QAction *mAddFDAttAction;
     QAction *mDelAttAction;
 
Index: /trunk/src/VBox/Frontends/VirtualBox/src/VBoxVMSettingsHD.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/VBoxVMSettingsHD.cpp	(revision 23579)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/VBoxVMSettingsHD.cpp	(revision 23580)
@@ -114,40 +114,49 @@
     mPool.resize (MaxIndex);
 
-    mPool [AddControllerEn]    = QPixmap (":/controller_add_16px.png");
-    mPool [AddControllerDis]   = QPixmap (":/controller_add_disabled_16px.png");
-    mPool [DelControllerEn]    = QPixmap (":/controller_remove_16px.png");
-    mPool [DelControllerDis]   = QPixmap (":/controller_remove_disabled_16px.png");
-
-    mPool [AddAttachmentEn]    = QPixmap (":/attachment_add_16px.png");
-    mPool [AddAttachmentDis]   = QPixmap (":/attachment_add_disabled_16px.png");
-    mPool [DelAttachmentEn]    = QPixmap (":/attachment_remove_16px.png");
-    mPool [DelAttachmentDis]   = QPixmap (":/attachment_remove_disabled_16px.png");
-
-    mPool [IDEController]      = QPixmap (":/ide_16px.png");
-    mPool [IDEExpand]          = QPixmap (":/ide_expand_16px.png");
-    mPool [IDECollapse]        = QPixmap (":/ide_collapse_16px.png");
-    mPool [SATAController]     = QPixmap (":/sata_16px.png");
-    mPool [SATAExpand]         = QPixmap (":/sata_expand_16px.png");
-    mPool [SATACollapse]       = QPixmap (":/sata_collapse_16px.png");
-    mPool [SCSIController]     = QPixmap (":/scsi_16px.png");
-    mPool [SCSIExpand]         = QPixmap (":/scsi_expand_16px.png");
-    mPool [SCSICollapse]       = QPixmap (":/scsi_collapse_16px.png");
-    mPool [FloppyController]   = QPixmap (":/floppy_16px.png");
-    mPool [FloppyExpand]       = QPixmap (":/floppy_expand_16px.png");
-    mPool [FloppyCollapse]     = QPixmap (":/floppy_collapse_16px.png");
-
-    mPool [HDAttachmentEn]     = QPixmap (":/hd_16px.png");
-    mPool [CDAttachmentEn]     = QPixmap (":/cd_16px.png");
-    mPool [FDAttachmentEn]     = QPixmap (":/fd_16px.png");
-
-    mPool [HDAttachmentAddEn]  = QPixmap (":/hd_add_16px.png");
-    mPool [HDAttachmentAddDis] = QPixmap (":/hd_add_disabled_16px.png");
-    mPool [CDAttachmentAddEn]  = QPixmap (":/cd_add_16px.png");
-    mPool [CDAttachmentAddDis] = QPixmap (":/cd_add_disabled_16px.png");
-    mPool [FDAttachmentAddEn]  = QPixmap (":/fd_add_16px.png");
-    mPool [FDAttachmentAddDis] = QPixmap (":/fd_add_disabled_16px.png");
-
-    mPool [VMMEn]              = QPixmap (":/select_file_16px.png");
-    mPool [VMMDis]             = QPixmap (":/select_file_dis_16px.png");
+    mPool [ControllerAddEn]          = QPixmap (":/controller_add_16px.png");
+    mPool [ControllerAddDis]         = QPixmap (":/controller_add_disabled_16px.png");
+    mPool [ControllerDelEn]          = QPixmap (":/controller_remove_16px.png");
+    mPool [ControllerDelDis]         = QPixmap (":/controller_remove_disabled_16px.png");
+
+    mPool [AttachmentAddEn]          = QPixmap (":/attachment_add_16px.png");
+    mPool [AttachmentAddDis]         = QPixmap (":/attachment_add_disabled_16px.png");
+    mPool [AttachmentDelEn]          = QPixmap (":/attachment_remove_16px.png");
+    mPool [AttachmentDelDis]         = QPixmap (":/attachment_remove_disabled_16px.png");
+
+    mPool [IDEControllerNormal]      = QPixmap (":/ide_16px.png");
+    mPool [IDEControllerExpand]      = QPixmap (":/ide_expand_16px.png");
+    mPool [IDEControllerCollapse]    = QPixmap (":/ide_collapse_16px.png");
+    mPool [SATAControllerNormal]     = QPixmap (":/sata_16px.png");
+    mPool [SATAControllerExpand]     = QPixmap (":/sata_expand_16px.png");
+    mPool [SATAControllerCollapse]   = QPixmap (":/sata_collapse_16px.png");
+    mPool [SCSIControllerNormal]     = QPixmap (":/scsi_16px.png");
+    mPool [SCSIControllerExpand]     = QPixmap (":/scsi_expand_16px.png");
+    mPool [SCSIControllerCollapse]   = QPixmap (":/scsi_collapse_16px.png");
+    mPool [FloppyControllerNormal]   = QPixmap (":/floppy_16px.png");
+    mPool [FloppyControllerExpand]   = QPixmap (":/floppy_expand_16px.png");
+    mPool [FloppyControllerCollapse] = QPixmap (":/floppy_collapse_16px.png");
+
+    mPool [IDEControllerAddEn]       = QPixmap (":/ide_add_16px.png");
+    mPool [IDEControllerAddDis]      = QPixmap (":/ide_add_disabled_16px.png");
+    mPool [SATAControllerAddEn]      = QPixmap (":/sata_add_16px.png");
+    mPool [SATAControllerAddDis]     = QPixmap (":/sata_add_disabled_16px.png");
+    mPool [SCSIControllerAddEn]      = QPixmap (":/scsi_add_16px.png");
+    mPool [SCSIControllerAddDis]     = QPixmap (":/scsi_add_disabled_16px.png");
+    mPool [FloppyControllerAddEn]    = QPixmap (":/floppy_add_16px.png");
+    mPool [FloppyControllerAddDis]   = QPixmap (":/floppy_add_disabled_16px.png");
+
+    mPool [HDAttachmentNormal]       = QPixmap (":/hd_16px.png");
+    mPool [CDAttachmentNormal]       = QPixmap (":/cd_16px.png");
+    mPool [FDAttachmentNormal]       = QPixmap (":/fd_16px.png");
+
+    mPool [HDAttachmentAddEn]        = QPixmap (":/hd_add_16px.png");
+    mPool [HDAttachmentAddDis]       = QPixmap (":/hd_add_disabled_16px.png");
+    mPool [CDAttachmentAddEn]        = QPixmap (":/cd_add_16px.png");
+    mPool [CDAttachmentAddDis]       = QPixmap (":/cd_add_disabled_16px.png");
+    mPool [FDAttachmentAddEn]        = QPixmap (":/fd_add_16px.png");
+    mPool [FDAttachmentAddDis]       = QPixmap (":/fd_add_disabled_16px.png");
+
+    mPool [VMMEn]                    = QPixmap (":/select_file_16px.png");
+    mPool [VMMDis]                   = QPixmap (":/select_file_dis_16px.png");
 }
 
@@ -171,14 +180,14 @@
         {
             case KStorageBus_IDE:
-                mPixmaps [i] = (PixmapPool::PixmapType) (PixmapPool::IDEController + i);
+                mPixmaps [i] = (PixmapPool::PixmapType) (PixmapPool::IDEControllerNormal + i);
                 break;
             case KStorageBus_SATA:
-                mPixmaps [i] = (PixmapPool::PixmapType) (PixmapPool::SATAController + i);
+                mPixmaps [i] = (PixmapPool::PixmapType) (PixmapPool::SATAControllerNormal + i);
                 break;
             case KStorageBus_SCSI:
-                mPixmaps [i] = (PixmapPool::PixmapType) (PixmapPool::SCSIController + i);
+                mPixmaps [i] = (PixmapPool::PixmapType) (PixmapPool::SCSIControllerNormal + i);
                 break;
             case KStorageBus_Floppy:
-                mPixmaps [i] = (PixmapPool::PixmapType) (PixmapPool::FloppyController + i);
+                mPixmaps [i] = (PixmapPool::PixmapType) (PixmapPool::FloppyControllerNormal + i);
                 break;
             default:
@@ -344,4 +353,16 @@
     while (!mControllers.isEmpty())
         delete mControllers.first();
+}
+
+ULONG RootItem::childCount (KStorageBus aBus) const
+{
+    ULONG result = 0;
+    foreach (AbstractItem *item, mControllers)
+    {
+        ControllerItem *ctrItem = static_cast <ControllerItem*> (item);
+        if (ctrItem->ctrBusType() == aBus)
+            ++ result;
+    }
+    return result;
 }
 
@@ -817,11 +838,11 @@
         {
             case KDeviceType_HardDisk:
-                mAttPixmap = PixmapPool::pool()->pixmap (PixmapPool::HDAttachmentEn);
+                mAttPixmap = PixmapPool::pool()->pixmap (PixmapPool::HDAttachmentNormal);
                 break;
             case KDeviceType_DVD:
-                mAttPixmap = PixmapPool::pool()->pixmap (PixmapPool::CDAttachmentEn);
+                mAttPixmap = PixmapPool::pool()->pixmap (PixmapPool::CDAttachmentNormal);
                 break;
             case KDeviceType_Floppy:
-                mAttPixmap = PixmapPool::pool()->pixmap (PixmapPool::FDAttachmentEn);
+                mAttPixmap = PixmapPool::pool()->pixmap (PixmapPool::FDAttachmentNormal);
                 break;
             default:
@@ -1012,7 +1033,23 @@
             return QVariant::fromValue (mToolTipType);
         }
-        case R_IsMoreControllersPossible:
-        {
-            return rowCount (root()) < 16;
+        case R_IsMoreIDEControllersPossible:
+        {
+            return static_cast <RootItem*> (mRootItem)->childCount (KStorageBus_IDE) <
+                   vboxGlobal().virtualBox().GetSystemProperties().GetMaxInstancesOfStorageBus (KStorageBus_IDE);
+        }
+        case R_IsMoreSATAControllersPossible:
+        {
+            return static_cast <RootItem*> (mRootItem)->childCount (KStorageBus_SATA) <
+                   vboxGlobal().virtualBox().GetSystemProperties().GetMaxInstancesOfStorageBus (KStorageBus_SATA);
+        }
+        case R_IsMoreSCSIControllersPossible:
+        {
+            return static_cast <RootItem*> (mRootItem)->childCount (KStorageBus_SCSI) <
+                   vboxGlobal().virtualBox().GetSystemProperties().GetMaxInstancesOfStorageBus (KStorageBus_SCSI);
+        }
+        case R_IsMoreFloppyControllersPossible:
+        {
+            return static_cast <RootItem*> (mRootItem)->childCount (KStorageBus_Floppy) <
+                   vboxGlobal().virtualBox().GetSystemProperties().GetMaxInstancesOfStorageBus (KStorageBus_Floppy);
         }
         case R_IsMoreAttachmentsPossible:
@@ -1181,13 +1218,13 @@
         case R_HDPixmapEn:
         {
-            return PixmapPool::pool()->pixmap (PixmapPool::HDAttachmentEn);
+            return PixmapPool::pool()->pixmap (PixmapPool::HDAttachmentNormal);
         }
         case R_CDPixmapEn:
         {
-            return PixmapPool::pool()->pixmap (PixmapPool::CDAttachmentEn);
+            return PixmapPool::pool()->pixmap (PixmapPool::CDAttachmentNormal);
         }
         case R_FDPixmapEn:
         {
-            return PixmapPool::pool()->pixmap (PixmapPool::FDAttachmentEn);
+            return PixmapPool::pool()->pixmap (PixmapPool::FDAttachmentNormal);
         }
 
@@ -1524,31 +1561,47 @@
     /* Controller Actions */
     mAddCtrAction = new QAction (this);
-    mAddCtrAction->setIcon (VBoxGlobal::iconSet (PixmapPool::pool()->pixmap (PixmapPool::AddControllerEn),
-                                                 PixmapPool::pool()->pixmap (PixmapPool::AddControllerDis)));
+    mAddCtrAction->setIcon (VBoxGlobal::iconSet (PixmapPool::pool()->pixmap (PixmapPool::ControllerAddEn),
+                                                 PixmapPool::pool()->pixmap (PixmapPool::ControllerAddDis)));
 
     mAddIDECtrAction = new QAction (this);
-    mAddIDECtrAction->setIcon (VBoxGlobal::iconSet (PixmapPool::pool()->pixmap (PixmapPool::IDEController)));
+    mAddIDECtrAction->setIcon (VBoxGlobal::iconSet (PixmapPool::pool()->pixmap (PixmapPool::IDEControllerAddEn),
+                                                    PixmapPool::pool()->pixmap (PixmapPool::IDEControllerAddDis)));
 
     mAddSATACtrAction = new QAction (this);
-    mAddSATACtrAction->setIcon (VBoxGlobal::iconSet (PixmapPool::pool()->pixmap (PixmapPool::SATAController)));
+    mAddSATACtrAction->setIcon (VBoxGlobal::iconSet (PixmapPool::pool()->pixmap (PixmapPool::SATAControllerAddEn),
+                                                     PixmapPool::pool()->pixmap (PixmapPool::SATAControllerAddDis)));
 
     mAddSCSICtrAction = new QAction (this);
-    mAddSCSICtrAction->setIcon (VBoxGlobal::iconSet (PixmapPool::pool()->pixmap (PixmapPool::SCSIController)));
+    mAddSCSICtrAction->setIcon (VBoxGlobal::iconSet (PixmapPool::pool()->pixmap (PixmapPool::SCSIControllerAddEn),
+                                                     PixmapPool::pool()->pixmap (PixmapPool::SCSIControllerAddDis)));
 
     mAddFloppyCtrAction = new QAction (this);
-    mAddFloppyCtrAction->setIcon (VBoxGlobal::iconSet (PixmapPool::pool()->pixmap (PixmapPool::FloppyController)));
+    mAddFloppyCtrAction->setIcon (VBoxGlobal::iconSet (PixmapPool::pool()->pixmap (PixmapPool::FloppyControllerAddEn),
+                                                       PixmapPool::pool()->pixmap (PixmapPool::FloppyControllerAddDis)));
 
     mDelCtrAction = new QAction (this);
-    mDelCtrAction->setIcon (VBoxGlobal::iconSet (PixmapPool::pool()->pixmap (PixmapPool::DelControllerEn),
-                                                 PixmapPool::pool()->pixmap (PixmapPool::DelControllerDis)));
+    mDelCtrAction->setIcon (VBoxGlobal::iconSet (PixmapPool::pool()->pixmap (PixmapPool::ControllerDelEn),
+                                                 PixmapPool::pool()->pixmap (PixmapPool::ControllerDelDis)));
 
     /* Attachment Actions */
     mAddAttAction = new QAction (this);
-    mAddAttAction->setIcon (VBoxGlobal::iconSet (PixmapPool::pool()->pixmap (PixmapPool::AddAttachmentEn),
-                                                 PixmapPool::pool()->pixmap (PixmapPool::AddAttachmentDis)));
+    mAddAttAction->setIcon (VBoxGlobal::iconSet (PixmapPool::pool()->pixmap (PixmapPool::AttachmentAddEn),
+                                                 PixmapPool::pool()->pixmap (PixmapPool::AttachmentAddDis)));
+
+    mAddHDAttAction = new QAction (this);
+    mAddHDAttAction->setIcon (VBoxGlobal::iconSet (PixmapPool::pool()->pixmap (PixmapPool::HDAttachmentAddEn),
+                                                   PixmapPool::pool()->pixmap (PixmapPool::HDAttachmentAddDis)));
+
+    mAddCDAttAction = new QAction (this);
+    mAddCDAttAction->setIcon (VBoxGlobal::iconSet (PixmapPool::pool()->pixmap (PixmapPool::CDAttachmentAddEn),
+                                                   PixmapPool::pool()->pixmap (PixmapPool::CDAttachmentAddDis)));
+
+    mAddFDAttAction = new QAction (this);
+    mAddFDAttAction->setIcon (VBoxGlobal::iconSet (PixmapPool::pool()->pixmap (PixmapPool::FDAttachmentAddEn),
+                                                   PixmapPool::pool()->pixmap (PixmapPool::FDAttachmentAddDis)));
 
     mDelAttAction = new QAction (this);
-    mDelAttAction->setIcon (VBoxGlobal::iconSet (PixmapPool::pool()->pixmap (PixmapPool::DelAttachmentEn),
-                                                 PixmapPool::pool()->pixmap (PixmapPool::DelAttachmentDis)));
+    mDelAttAction->setIcon (VBoxGlobal::iconSet (PixmapPool::pool()->pixmap (PixmapPool::AttachmentDelEn),
+                                                 PixmapPool::pool()->pixmap (PixmapPool::AttachmentDelDis)));
 
     /* Storage Model/View */
@@ -1605,4 +1658,7 @@
     connect (mDelCtrAction, SIGNAL (triggered (bool)), this, SLOT (delController()));
     connect (mAddAttAction, SIGNAL (triggered (bool)), this, SLOT (addAttachment()));
+    connect (mAddHDAttAction, SIGNAL (triggered (bool)), this, SLOT (addHDAttachment()));
+    connect (mAddCDAttAction, SIGNAL (triggered (bool)), this, SLOT (addCDAttachment()));
+    connect (mAddFDAttAction, SIGNAL (triggered (bool)), this, SLOT (addFDAttachment()));
     connect (mDelAttAction, SIGNAL (triggered (bool)), this, SLOT (delAttachment()));
     connect (mStorageModel, SIGNAL (rowsInserted (const QModelIndex&, int, int)),
@@ -1625,5 +1681,4 @@
     connect (mCbType, SIGNAL (activated (int)), this, SLOT (setInformation()));
     connect (mCbSlot, SIGNAL (activated (int)), this, SLOT (setInformation()));
-    connect (mCbDevice, SIGNAL (activated (int)), this, SLOT (setInformation()));
     connect (mCbVdi, SIGNAL (activated (int)), this, SLOT (setInformation()));
     connect (mTbVmm, SIGNAL (clicked (bool)), this, SLOT (onVmmInvoked()));
@@ -1639,5 +1694,5 @@
     /* Initial setup */
     setMinimumWidth (500);
-    mSplitter->setSizes (QList<int>() << 0.45 * minimumWidth() << 0.55 * minimumWidth());
+    mSplitter->setSizes (QList<int>() << (int) (0.45 * minimumWidth()) << (int) (0.55 * minimumWidth()));
 }
 
@@ -1765,4 +1820,7 @@
     mDelCtrAction->setText (tr ("Remove Controller"));
     mAddAttAction->setText (tr ("Add Attachment"));
+    mAddHDAttAction->setText (tr ("Add Hard Disk"));
+    mAddCDAttAction->setText (tr ("Add CD/DVD Device"));
+    mAddFDAttAction->setText (tr ("Add Floppy Device"));
     mDelAttAction->setText (tr ("Remove Attachment"));
 
@@ -1797,8 +1855,8 @@
         mLtController->setColumnMinimumWidth (0, 10);
         mLtAttachment->setColumnMinimumWidth (0, 10);
-
+#if 0
         /* Second column indent minimum width */
         QList <QLabel*> labelsList;
-        labelsList << mLbSlot << mLbDevice << mLbVdi
+        labelsList << mLbSlot << mLbVdi
                    << mLbHDVirtualSize << mLbHDActualSize << mLbSize
                    << mLbLocation << mLbHDFormat << mLbUsage;
@@ -1811,4 +1869,5 @@
         }
         mLtAttachment->setColumnMinimumWidth (1, maxWidth);
+#endif
     }
     VBoxSettingsPage::showEvent (aEvent);
@@ -1865,28 +1924,20 @@
 void VBoxVMSettingsHD::addIDEController()
 {
-    mStorageModel->addController (generateUniqueName (tr ("IDE Controller")),
-                                  KStorageBus_IDE, KStorageControllerType_PIIX4);
-    emit storageChanged();
+    addControllerWrapper (generateUniqueName (tr ("IDE Controller")), KStorageBus_IDE, KStorageControllerType_PIIX4);
 }
 
 void VBoxVMSettingsHD::addSATAController()
 {
-    mStorageModel->addController (generateUniqueName (tr ("SATA Controller")),
-                                  KStorageBus_SATA, KStorageControllerType_IntelAhci);
-    emit storageChanged();
+    addControllerWrapper (generateUniqueName (tr ("SATA Controller")), KStorageBus_SATA, KStorageControllerType_IntelAhci);
 }
 
 void VBoxVMSettingsHD::addSCSIController()
 {
-    mStorageModel->addController (generateUniqueName (tr ("SCSI Controller")),
-                                  KStorageBus_SCSI, KStorageControllerType_LsiLogic);
-    emit storageChanged();
+    addControllerWrapper (generateUniqueName (tr ("SCSI Controller")), KStorageBus_SCSI, KStorageControllerType_LsiLogic);
 }
 
 void VBoxVMSettingsHD::addFloppyController()
 {
-    mStorageModel->addController (generateUniqueName (tr ("Floppy Controller")),
-                                  KStorageBus_Floppy, KStorageControllerType_I82078);
-    emit storageChanged();
+    addControllerWrapper (generateUniqueName (tr ("Floppy Controller")), KStorageBus_Floppy, KStorageControllerType_I82078);
 }
 
@@ -1901,15 +1952,36 @@
 }
 
-void VBoxVMSettingsHD::addAttachment (KDeviceType aDeviceType)
+void VBoxVMSettingsHD::addAttachment()
 {
     QModelIndex index = mTwStorageTree->currentIndex();
-    if (!mStorageModel->data (index, StorageModel::R_IsController).toBool()) return;
-
-    if (aDeviceType == KDeviceType_Null)
-        aDeviceType = mStorageModel->data (index, StorageModel::R_CtrDevices).value <DeviceTypeList>() [0];
-
-    mStorageModel->addAttachment (QUuid (mStorageModel->data (index, StorageModel::R_ItemId).toString()), aDeviceType);
-    emit storageChanged();
-    mValidator->revalidate();
+    Assert (mStorageModel->data (index, StorageModel::R_IsController).toBool());
+
+    if (mStorageModel->data (index, StorageModel::R_CtrBusType).value <KStorageBus>() == KStorageBus_Floppy)
+    {
+        Assert (mAddFDAttAction->isEnabled());
+        mAddFDAttAction->trigger();
+    }
+    else
+    {
+        QMenu menu;
+        menu.addAction (mAddHDAttAction);
+        menu.addAction (mAddCDAttAction);
+        menu.exec (QCursor::pos());
+    }
+}
+
+void VBoxVMSettingsHD::addHDAttachment()
+{
+    addAttachmentWrapper (KDeviceType_HardDisk);
+}
+
+void VBoxVMSettingsHD::addCDAttachment()
+{
+    addAttachmentWrapper (KDeviceType_DVD);
+}
+
+void VBoxVMSettingsHD::addFDAttachment()
+{
+    addAttachmentWrapper (KDeviceType_Floppy);
 }
 
@@ -1972,13 +2044,4 @@
                 mCbSlot->setCurrentIndex (attSlotPos == -1 ? 0 : attSlotPos);
 
-                /* Getting Attachment Device */
-                mCbDevice->clear();
-                DeviceTypeList deviceTypeList (mStorageModel->data (index, StorageModel::R_AttDevices).value <DeviceTypeList>());
-                for (int i = 0; i < deviceTypeList.size(); ++ i)
-                    mCbDevice->insertItem (mCbDevice->count(), vboxGlobal().toString (deviceTypeList [i]));
-                KDeviceType device = mStorageModel->data (index, StorageModel::R_AttDevice).value <KDeviceType>();
-                int attDevicePos = mCbDevice->findText (vboxGlobal().toString (device));
-                mCbDevice->setCurrentIndex (attDevicePos == -1 ? 0 : attDevicePos);
-
                 /* Getting Show Diffs state */
                 bool isShowDiffs = mStorageModel->data (index, StorageModel::R_AttIsShowDiffs).toBool();
@@ -1986,4 +2049,19 @@
 
                 /* Getting Attachment Medium */
+                KDeviceType device = mStorageModel->data (index, StorageModel::R_AttDevice).value <KDeviceType>();
+                switch (device)
+                {
+                    case KDeviceType_HardDisk:
+                        mLbVdi->setText (tr ("Hard &Disk:"));
+                        break;
+                    case KDeviceType_DVD:
+                        mLbVdi->setText (tr ("&CD/DVD Device:"));
+                        break;
+                    case KDeviceType_Floppy:
+                        mLbVdi->setText (tr ("&Floppy Device:"));
+                        break;
+                    default:
+                        break;
+                }
                 mCbVdi->setType (typeToLocal (device));
                 mCbVdi->setShowDiffs (isShowDiffs);
@@ -2046,13 +2124,4 @@
                 mStorageModel->setData (index, QVariant::fromValue (vboxGlobal().toStorageSlot (mCbSlot->currentText())),
                                         StorageModel::R_AttSlot);
-            /* Setting Attachment Device-Type */
-            else if (sdr == mCbDevice)
-            {
-                KDeviceType device = vboxGlobal().toDeviceType (mCbDevice->currentText());
-                mStorageModel->setData (index, QVariant::fromValue (device), StorageModel::R_AttDevice);
-                mCbVdi->setType (typeToLocal (device));
-                mCbVdi->setShowDiffs (mCbShowDiffs->isChecked());
-                mCbVdi->refresh();
-            }
             /* Setting Attachment Medium */
             else if (sdr == mCbVdi)
@@ -2077,5 +2146,5 @@
 void VBoxVMSettingsHD::onVmmInvoked()
 {
-    QString id = getWithMediaManager (typeToLocal (vboxGlobal().toDeviceType (mCbDevice->currentText())));
+    QString id = getWithMediaManager (mCbVdi->type());
     if (!id.isNull())
         mCbVdi->setCurrentItem (id);
@@ -2086,14 +2155,26 @@
     QModelIndex index = mTwStorageTree->currentIndex();
 
-    mAddCtrAction->setEnabled (mStorageModel->data (index, StorageModel::R_IsMoreControllersPossible).toBool());
-    mAddIDECtrAction->setEnabled (mStorageModel->data (index, StorageModel::R_IsMoreControllersPossible).toBool());
-    mAddSATACtrAction->setEnabled (mStorageModel->data (index, StorageModel::R_IsMoreControllersPossible).toBool());
-    mAddSCSICtrAction->setEnabled (mStorageModel->data (index, StorageModel::R_IsMoreControllersPossible).toBool());
-    mAddFloppyCtrAction->setEnabled (mStorageModel->data (index, StorageModel::R_IsMoreControllersPossible).toBool());
-    mAddAttAction->setEnabled (mStorageModel->data (index, StorageModel::R_IsController).toBool() &&
-                               mStorageModel->data (index, StorageModel::R_IsMoreAttachmentsPossible).toBool());
-
-    mDelCtrAction->setEnabled (mStorageModel->data (index, StorageModel::R_IsController).toBool());
-    mDelAttAction->setEnabled (mStorageModel->data (index, StorageModel::R_IsAttachment).toBool());
+    bool isIDEPossible = mStorageModel->data (index, StorageModel::R_IsMoreIDEControllersPossible).toBool();
+    bool isSATAPossible = mStorageModel->data (index, StorageModel::R_IsMoreSATAControllersPossible).toBool();
+    bool isSCSIPossible = mStorageModel->data (index, StorageModel::R_IsMoreSCSIControllersPossible).toBool();
+    bool isFloppyPossible = mStorageModel->data (index, StorageModel::R_IsMoreFloppyControllersPossible).toBool();
+
+    bool isController = mStorageModel->data (index, StorageModel::R_IsController).toBool();
+    bool isAttachment = mStorageModel->data (index, StorageModel::R_IsAttachment).toBool();
+    bool isAttachmentsPossible = mStorageModel->data (index, StorageModel::R_IsMoreAttachmentsPossible).toBool();
+
+    mAddCtrAction->setEnabled (isIDEPossible || isSATAPossible || isSCSIPossible || isFloppyPossible);
+    mAddIDECtrAction->setEnabled (isIDEPossible);
+    mAddSATACtrAction->setEnabled (isSATAPossible);
+    mAddSCSICtrAction->setEnabled (isSCSIPossible);
+    mAddFloppyCtrAction->setEnabled (isFloppyPossible);
+
+    mAddAttAction->setEnabled (isController && isAttachmentsPossible);
+    mAddHDAttAction->setEnabled (isController && isAttachmentsPossible);
+    mAddCDAttAction->setEnabled (isController && isAttachmentsPossible);
+    mAddFDAttAction->setEnabled (isController && isAttachmentsPossible);
+
+    mDelCtrAction->setEnabled (isController);
+    mDelAttAction->setEnabled (isAttachment);
 }
 
@@ -2140,4 +2221,7 @@
 void VBoxVMSettingsHD::onRowRemoved()
 {
+    if (mStorageModel->rowCount (mStorageModel->root()) == 0)
+        mTwStorageTree->setCurrentIndex (mStorageModel->root());
+
     updateActionsState();
     getInformation();
@@ -2160,5 +2244,22 @@
         case AbstractItem::Type_ControllerItem:
         {
-            menu.addAction (mAddAttAction);
+            DeviceTypeList deviceTypeList (mStorageModel->data (index, StorageModel::R_CtrDevices).value <DeviceTypeList>());
+            foreach (KDeviceType deviceType, deviceTypeList)
+            {
+                switch (deviceType)
+                {
+                    case KDeviceType_HardDisk:
+                        menu.addAction (mAddHDAttAction);
+                        break;
+                    case KDeviceType_DVD:
+                        menu.addAction (mAddCDAttAction);
+                        break;
+                    case KDeviceType_Floppy:
+                        menu.addAction (mAddFDAttAction);
+                        break;
+                    default:
+                        break;
+                }
+            }
             menu.addAction (mDelCtrAction);
             break;
@@ -2341,9 +2442,45 @@
                 aEvent->setAccepted (true);
                 if (mAddAttAction->isEnabled())
-                    addAttachment (deviceType);
+                    addAttachmentWrapper (deviceType);
                 return;
             }
         }
     }
+}
+
+void VBoxVMSettingsHD::addControllerWrapper (const QString &aName, KStorageBus aBus, KStorageControllerType aType)
+{
+    QModelIndex index = mTwStorageTree->currentIndex();
+    switch (aBus)
+    {
+        case KStorageBus_IDE:
+            Assert (mStorageModel->data (index, StorageModel::R_IsMoreIDEControllersPossible).toBool());
+            break;
+        case KStorageBus_SATA:
+            Assert (mStorageModel->data (index, StorageModel::R_IsMoreSATAControllersPossible).toBool());
+            break;
+        case KStorageBus_SCSI:
+            Assert (mStorageModel->data (index, StorageModel::R_IsMoreSCSIControllersPossible).toBool());
+            break;
+        case KStorageBus_Floppy:
+            Assert (mStorageModel->data (index, StorageModel::R_IsMoreFloppyControllersPossible).toBool());
+            break;
+        default:
+            break;
+    }
+
+    mStorageModel->addController (aName, aBus, aType);
+    emit storageChanged();
+}
+
+void VBoxVMSettingsHD::addAttachmentWrapper (KDeviceType aDevice)
+{
+    QModelIndex index = mTwStorageTree->currentIndex();
+    Assert (mStorageModel->data (index, StorageModel::R_IsController).toBool());
+    Assert (mStorageModel->data (index, StorageModel::R_IsMoreAttachmentsPossible).toBool());
+
+    mStorageModel->addAttachment (QUuid (mStorageModel->data (index, StorageModel::R_ItemId).toString()), aDevice);
+    emit storageChanged();
+    mValidator->revalidate();
 }
 
Index: /trunk/src/VBox/Frontends/VirtualBox/ui/VBoxVMSettingsHD.ui
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/ui/VBoxVMSettingsHD.ui	(revision 23579)
+++ /trunk/src/VBox/Frontends/VirtualBox/ui/VBoxVMSettingsHD.ui	(revision 23580)
@@ -72,5 +72,5 @@
           <widget class="QITreeView" native="1" name="mTwStorageTree" >
            <property name="whatsThis" >
-            <string>Contains all the created storage controllers and all the attached mediums representing virtual images and real host-drives.</string>
+            <string>Contains all the created storage controllers and all the attached virtual images and host-drives.</string>
            </property>
           </widget>
@@ -277,34 +277,5 @@
         </item>
         <item row="2" column="1" >
-         <widget class="QLabel" name="mLbDevice" >
-          <property name="text" >
-           <string>&amp;Device:</string>
-          </property>
-          <property name="buddy" >
-           <cstring>mCbDevice</cstring>
-          </property>
-          <property name="alignment" >
-           <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
-          </property>
-         </widget>
-        </item>
-        <item row="2" column="2" colspan="2" >
-         <widget class="QComboBox" name="mCbDevice" >
-          <property name="whatsThis" >
-           <string>Allows to select the type of the device represented by the currently selected attachment. The list of possible device types depends on parent controller type.</string>
-          </property>
-          <property name="sizePolicy" >
-           <sizepolicy vsizetype="Fixed" hsizetype="Expanding" >
-            <horstretch>0</horstretch>
-            <verstretch>0</verstretch>
-           </sizepolicy>
-          </property>
-         </widget>
-        </item>
-        <item row="3" column="1" >
          <widget class="QLabel" name="mLbVdi" >
-          <property name="text" >
-           <string>&amp;Medium:</string>
-          </property>
           <property name="buddy" >
            <cstring>mCbVdi</cstring>
@@ -315,8 +286,8 @@
          </widget>
         </item>
-        <item row="3" column="2" >
+        <item row="2" column="2" >
          <widget class="VBoxMediaComboBox" native="1" name="mCbVdi" >
           <property name="whatsThis" >
-           <string>Allows to select the medium assigned for the currently selected attachment according to device type of this attachment. Available mediums list could contain virtual images and real host drives corresponding to device type currently chosen for this attachment.</string>
+           <string>Allows to select virtual image or host-drive assigned for the currently selected attachment according to device type of this attachment.</string>
           </property>
           <property name="sizePolicy" >
@@ -328,8 +299,8 @@
          </widget>
         </item>
-        <item row="3" column="3" >
+        <item row="2" column="3" >
          <widget class="QIToolButton" name="mTbVmm" >
           <property name="whatsThis" >
-           <string>Invokes the Virtual Media Manager to select a medium to mount.</string>
+           <string>Opens the Virtual Media Manager to select a virtual image for this attachment.</string>
           </property>
           <property name="toolTip" >
@@ -344,5 +315,5 @@
          </widget>
         </item>
-        <item row="4" column="2" colspan="2" >
+        <item row="3" column="2" colspan="2" >
          <widget class="QCheckBox" name="mCbShowDiffs">
           <property name="sizePolicy" >
@@ -360,5 +331,5 @@
          </widget>
         </item>
-        <item row="5" column="2" colspan="2" >
+        <item row="4" column="2" colspan="2" >
          <widget class="QCheckBox" name="mCbPassthrough" >
           <property name="sizePolicy" >
@@ -369,5 +340,5 @@
           </property>
           <property name="whatsThis" >
-           <string>When checked, allows the guest to send ATAPI commands directly to the host drive which makes it possible to use CD/DVD writers connected to the host inside the VM. Note that writing audio CD inside the VM is not yet supported.</string>
+           <string>When checked, allows the guest to send ATAPI commands directly to the host-drive which makes it possible to use CD/DVD writers connected to the host inside the VM. Note that writing audio CD inside the VM is not yet supported.</string>
           </property>
           <property name="text" >
@@ -376,5 +347,5 @@
          </widget>
         </item>
-        <item row="6" column="0" colspan="4" >
+        <item row="5" column="0" colspan="4" >
          <widget class="QILabelSeparator" native="1" name="mLsInformation" >
           <property name="text" >
@@ -383,8 +354,28 @@
          </widget>
         </item>
+        <item row="6" column="1" >
+         <widget class="QLabel" name="mLbHDVirtualSize" >
+          <property name="text" >
+           <string>Virtual Size:</string>
+          </property>
+          <property name="alignment" >
+           <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
+          </property>
+         </widget>
+        </item>
+        <item row="6" column="2" colspan="2" >
+         <widget class="QILabel" name="mLbHDVirtualSizeValue" >
+          <property name="sizePolicy" >
+           <sizepolicy vsizetype="Preferred" hsizetype="Ignored" >
+            <horstretch>0</horstretch>
+            <verstretch>0</verstretch>
+           </sizepolicy>
+          </property>
+         </widget>
+        </item>
         <item row="7" column="1" >
-         <widget class="QLabel" name="mLbHDVirtualSize" >
-          <property name="text" >
-           <string>Virtual Size:</string>
+         <widget class="QLabel" name="mLbHDActualSize" >
+          <property name="text" >
+           <string>Actual Size:</string>
           </property>
           <property name="alignment" >
@@ -394,5 +385,5 @@
         </item>
         <item row="7" column="2" colspan="2" >
-         <widget class="QILabel" name="mLbHDVirtualSizeValue" >
+         <widget class="QILabel" name="mLbHDActualSizeValue" >
           <property name="sizePolicy" >
            <sizepolicy vsizetype="Preferred" hsizetype="Ignored" >
@@ -404,7 +395,7 @@
         </item>
         <item row="8" column="1" >
-         <widget class="QLabel" name="mLbHDActualSize" >
-          <property name="text" >
-           <string>Actual Size:</string>
+         <widget class="QLabel" name="mLbSize" >
+          <property name="text" >
+           <string>Size:</string>
           </property>
           <property name="alignment" >
@@ -414,5 +405,5 @@
         </item>
         <item row="8" column="2" colspan="2" >
-         <widget class="QILabel" name="mLbHDActualSizeValue" >
+         <widget class="QILabel" name="mLbSizeValue" >
           <property name="sizePolicy" >
            <sizepolicy vsizetype="Preferred" hsizetype="Ignored" >
@@ -424,7 +415,7 @@
         </item>
         <item row="9" column="1" >
-         <widget class="QLabel" name="mLbSize" >
-          <property name="text" >
-           <string>Size:</string>
+         <widget class="QLabel" name="mLbLocation" >
+          <property name="text" >
+           <string>Location:</string>
           </property>
           <property name="alignment" >
@@ -434,5 +425,5 @@
         </item>
         <item row="9" column="2" colspan="2" >
-         <widget class="QILabel" name="mLbSizeValue" >
+         <widget class="QILabel" name="mLbLocationValue" >
           <property name="sizePolicy" >
            <sizepolicy vsizetype="Preferred" hsizetype="Ignored" >
@@ -444,7 +435,7 @@
         </item>
         <item row="10" column="1" >
-         <widget class="QLabel" name="mLbLocation" >
-          <property name="text" >
-           <string>Location:</string>
+         <widget class="QLabel" name="mLbHDFormat" >
+          <property name="text" >
+           <string>Type (Format):</string>
           </property>
           <property name="alignment" >
@@ -454,5 +445,5 @@
         </item>
         <item row="10" column="2" colspan="2" >
-         <widget class="QILabel" name="mLbLocationValue" >
+         <widget class="QILabel" name="mLbHDFormatValue" >
           <property name="sizePolicy" >
            <sizepolicy vsizetype="Preferred" hsizetype="Ignored" >
@@ -464,7 +455,7 @@
         </item>
         <item row="11" column="1" >
-         <widget class="QLabel" name="mLbHDFormat" >
-          <property name="text" >
-           <string>Type (Format):</string>
+         <widget class="QLabel" name="mLbUsage" >
+          <property name="text" >
+           <string>Attached To:</string>
           </property>
           <property name="alignment" >
@@ -474,5 +465,5 @@
         </item>
         <item row="11" column="2" colspan="2" >
-         <widget class="QILabel" name="mLbHDFormatValue" >
+         <widget class="QILabel" name="mLbUsageValue" >
           <property name="sizePolicy" >
            <sizepolicy vsizetype="Preferred" hsizetype="Ignored" >
@@ -483,25 +474,5 @@
          </widget>
         </item>
-        <item row="12" column="1" >
-         <widget class="QLabel" name="mLbUsage" >
-          <property name="text" >
-           <string>Attached To:</string>
-          </property>
-          <property name="alignment" >
-           <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
-          </property>
-         </widget>
-        </item>
-        <item row="12" column="2" colspan="2" >
-         <widget class="QILabel" name="mLbUsageValue" >
-          <property name="sizePolicy" >
-           <sizepolicy vsizetype="Preferred" hsizetype="Ignored" >
-            <horstretch>0</horstretch>
-            <verstretch>0</verstretch>
-           </sizepolicy>
-          </property>
-         </widget>
-        </item>
-        <item row="13" column="0" colspan="4" >
+        <item row="12" column="0" colspan="4" >
          <spacer name="mSp6" >
           <property name="orientation" >
