Index: /trunk/src/VBox/Frontends/VirtualBox/include/VBoxMedium.h
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/include/VBoxMedium.h	(revision 23584)
+++ /trunk/src/VBox/Frontends/VirtualBox/include/VBoxMedium.h	(revision 23585)
@@ -186,9 +186,9 @@
     VBoxMedium &root() const;
 
-    QString toolTip (bool aNoDiffs = false, bool aCheckRO = false) const;
+    QString toolTip (bool aNoDiffs = false, bool aCheckRO = false, bool aNullAllowed = false) const;
     QPixmap icon (bool aNoDiffs = false, bool aCheckRO = false) const;
 
     /** Shortcut to <tt>#toolTip (aNoDiffs, true)</tt>. */
-    QString toolTipCheckRO (bool aNoDiffs = false) const { return toolTip (aNoDiffs, true); }
+    QString toolTipCheckRO (bool aNoDiffs = false, bool aNullAllowed = false) const { return toolTip (aNoDiffs, true, aNullAllowed); }
 
     /** Shortcut to <tt>#icon (aNoDiffs, true)</tt>. */
Index: /trunk/src/VBox/Frontends/VirtualBox/include/VBoxProblemReporter.h
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/include/VBoxProblemReporter.h	(revision 23584)
+++ /trunk/src/VBox/Frontends/VirtualBox/include/VBoxProblemReporter.h	(revision 23585)
@@ -250,15 +250,13 @@
                                       const CMedium &aHD,
                                       const CProgress &aProgress);
-    void cannotAttachHardDisk (QWidget *aParent, const CMachine &aMachine,
-                               const QString &aLocation, KStorageBus aBus,
-                               LONG aChannel, LONG aDevice);
-    void cannotDetachHardDisk (QWidget *aParent, const CMachine &aMachine,
-                               const QString &aLocation, KStorageBus aBus,
-                               LONG aChannel, LONG aDevice);
-
-    void cannotMountMedium (QWidget *aParent, const CMachine &aMachine,
-                            const VBoxMedium &aMedium, const COMResult &aResult);
-    void cannotUnmountMedium (QWidget *aParent, const CMachine &aMachine,
-                            const VBoxMedium &aMedium, const COMResult &aResult);
+    void cannotAttachDevice (QWidget *aParent, const CMachine &aMachine,
+                             VBoxDefs::MediumType aType, const QString &aLocation,
+                             KStorageBus aBus, LONG aChannel, LONG aDevice);
+    void cannotDetachDevice (QWidget *aParent, const CMachine &aMachine,
+                             VBoxDefs::MediumType aType, const QString &aLocation,
+                             KStorageBus aBus, LONG aChannel, LONG aDevice);
+
+    void cannotMountMedium (QWidget *aParent, const CMachine &aMachine, const VBoxMedium &aMedium);
+    void cannotUnmountMedium (QWidget *aParent, const CMachine &aMachine, const VBoxMedium &aMedium);
     void cannotOpenMedium (QWidget *aParent, const CVirtualBox &aVBox,
                            VBoxDefs::MediumType aType, const QString &aLocation);
@@ -358,5 +356,6 @@
                            const QString &errorMsg) const;
 
-    static QString toAccusative (VBoxDefs::MediumType aType);
+    static QString mediumToAccusative (VBoxDefs::MediumType aType, bool aIsHostDrive = false);
+    static QString deviceToAccusative (VBoxDefs::MediumType aType);
 
     static QString formatRC (HRESULT aRC);
Index: /trunk/src/VBox/Frontends/VirtualBox/include/VBoxVMFirstRunWzd.h
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/include/VBoxVMFirstRunWzd.h	(revision 23584)
+++ /trunk/src/VBox/Frontends/VirtualBox/include/VBoxVMFirstRunWzd.h	(revision 23585)
@@ -6,5 +6,5 @@
 
 /*
- * Copyright (C) 2006-2008 Sun Microsystems, Inc.
+ * Copyright (C) 2008-2009 Sun Microsystems, Inc.
  *
  * This file is part of VirtualBox Open Source Edition (OSE), as
@@ -24,11 +24,14 @@
 #define __VBoxVMFirstRunWzd_h__
 
+/* Local includes */
 #include "QIAbstractWizard.h"
 #include "VBoxVMFirstRunWzd.gen.h"
 #include "COMDefs.h"
-#include "QIWidgetValidator.h"
 #include "QIWithRetranslateUI.h"
 
-class VBoxVMFirstRunWzd : public QIWithRetranslateUI<QIAbstractWizard>,
+/* Local forwardes */
+class QIWidgetValidator;
+
+class VBoxVMFirstRunWzd : public QIWithRetranslateUI <QIAbstractWizard>,
                           public Ui::VBoxVMFirstRunWzd
 {
@@ -46,17 +49,14 @@
 
     void accept();
-    void revalidate (QIWidgetValidator *aWval);
+    void revalidate (QIWidgetValidator *aValidator);
     void mediaTypeChanged();
-    void mediaSourceChanged();
     void openMediaManager();
-    void enableNext (const QIWidgetValidator *aWval);
+    void enableNext (const QIWidgetValidator *aValidator);
     void onPageShow();
 
 private:
 
-    QIWidgetValidator         *mWvalType;
-    CMachine                   mMachine;
-    QVector <CMedium>          mHostDVDs;
-    QVector <CMedium>          mHostFloppys;
+    QIWidgetValidator *mValidator;
+    CMachine           mMachine;
 };
 
Index: /trunk/src/VBox/Frontends/VirtualBox/src/VBoxMediaComboBox.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/VBoxMediaComboBox.cpp	(revision 23584)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/VBoxMediaComboBox.cpp	(revision 23585)
@@ -295,5 +295,5 @@
 
     mMedia.append (Medium (aMedium.id(), aMedium.location(),
-                           aMedium.toolTipCheckRO (!mShowDiffs)));
+                           aMedium.toolTipCheckRO (!mShowDiffs, mShowNullItem && mType != VBoxDefs::MediumType_HardDisk)));
 
     insertItem (count(), aMedium.iconCheckRO (!mShowDiffs),
@@ -307,5 +307,5 @@
     mMedia [aIndex].id = aMedium.id();
     mMedia [aIndex].location = aMedium.location();
-    mMedia [aIndex].toolTip = aMedium.toolTipCheckRO (!mShowDiffs);
+    mMedia [aIndex].toolTip = aMedium.toolTipCheckRO (!mShowDiffs, mShowNullItem && mType != VBoxDefs::MediumType_HardDisk);
 
     setItemText (aIndex, aMedium.details (!mShowDiffs));
Index: /trunk/src/VBox/Frontends/VirtualBox/src/VBoxMediaManagerDlg.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/VBoxMediaManagerDlg.cpp	(revision 23584)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/VBoxMediaManagerDlg.cpp	(revision 23585)
@@ -1271,7 +1271,7 @@
                         CStorageController ctl = machine.GetStorageControllerByName(hda.GetController());
 
-                        vboxProblem().cannotDetachHardDisk (
-                            this, machine, aMedium.location(), ctl.GetBus(),
-                            hda.GetPort(), hda.GetDevice());
+                        vboxProblem().cannotDetachDevice (this, machine,
+                            VBoxDefs::MediumType_HardDisk, aMedium.location(),
+                            ctl.GetBus(), hda.GetPort(), hda.GetDevice());
                         success = false;
                         break;
@@ -1286,6 +1286,5 @@
             if (!machine.isOk())
             {
-                vboxProblem().cannotUnmountMedium (this, machine, aMedium,
-                                                   COMResult (machine));
+                vboxProblem().cannotUnmountMedium (this, machine, aMedium);
                 success = false;
             }
@@ -1297,6 +1296,5 @@
             if (!machine.isOk())
             {
-                vboxProblem().cannotUnmountMedium (this, machine, aMedium,
-                                                   COMResult (machine));
+                vboxProblem().cannotUnmountMedium (this, machine, aMedium);
                 success = false;
             }
Index: /trunk/src/VBox/Frontends/VirtualBox/src/VBoxMedium.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/VBoxMedium.cpp	(revision 23584)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/VBoxMedium.cpp	(revision 23585)
@@ -79,5 +79,5 @@
     mIsHostDrive = mMedium.isNull() ? false : mMedium.GetHostDrive();
 
-    mName = mMedium.isNull() ? VBoxGlobal::tr ("Not Set", "medium") :
+    mName = mMedium.isNull() ? VBoxGlobal::tr ("Empty", "medium") :
             !mIsHostDrive ? mMedium.GetName() :
             VBoxGlobal::tr ("Host Drive '%1'", "medium").arg (QDir::toNativeSeparators (mMedium.GetLocation()));
@@ -195,10 +195,5 @@
 
     /* Compose the tooltip */
-    if (mMedium.isNull())
-    {
-        mToolTip = VBoxGlobal::tr ("<nobr><b>No&nbsp;Medium&nbsp;Available</b></nobr><br>"
-                                   "Use the Virtual Media Manager to add medium of the corresponding type.");
-    }
-    else
+    if (!mMedium.isNull())
     {
         mToolTip = QString ("<nobr><b>%1</b></nobr>").arg (mIsHostDrive ? mName : mLocation);
@@ -274,15 +269,26 @@
  *                  accordingly.
  */
-QString VBoxMedium::toolTip (bool aNoDiffs /*= false*/, bool aCheckRO /*= false*/) const
-{
-    unconst (this)->checkNoDiffs (aNoDiffs);
-
-    QString tip = aNoDiffs ? mNoDiffs.toolTip : mToolTip;
-
-    if (aCheckRO && mIsReadOnly)
-        tip += VBoxGlobal::tr (
-            "<hr><img src=%1/>&nbsp;Attaching this hard disk will "
-            "be performed indirectly using a newly created "
-            "differencing hard disk.", "medium").arg (":/new_16px.png");
+QString VBoxMedium::toolTip (bool aNoDiffs /*= false*/, bool aCheckRO /*= false*/, bool aNullAllowed /*= false*/) const
+{
+    QString tip;
+
+    if (mMedium.isNull())
+    {
+        tip = aNullAllowed ? VBoxGlobal::tr ("<nobr><b>Not&nbsp;Set</b></nobr><br>"
+                                             "Required virtual image or host-drive could be mounted at runtime.") :
+                             VBoxGlobal::tr ("<nobr><b>Not&nbsp;Available</b></nobr><br>"
+                                             "Use the Virtual Media Manager to add image of the corresponding type.");
+    }
+    else
+    {
+        unconst (this)->checkNoDiffs (aNoDiffs);
+
+        tip = aNoDiffs ? mNoDiffs.toolTip : mToolTip;
+
+        if (aCheckRO && mIsReadOnly)
+            tip += VBoxGlobal::tr ("<hr><img src=%1/>&nbsp;Attaching this hard disk will "
+                                   "be performed indirectly using a newly created "
+                                   "differencing hard disk.", "medium").arg (":/new_16px.png");
+    }
 
     return tip;
Index: /trunk/src/VBox/Frontends/VirtualBox/src/VBoxNewVMWzd.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/VBoxNewVMWzd.cpp	(revision 23584)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/VBoxNewVMWzd.cpp	(revision 23585)
@@ -352,4 +352,12 @@
     }
 
+    /* Create default storage controllers */
+    QString ideCtrName ("IDE Controller");
+    QString floppyCtrName ("Floppy Controller");
+    KStorageBus ideBus = KStorageBus_IDE;
+    KStorageBus floppyBus = KStorageBus_Floppy;
+    mMachine.AddStorageController (ideCtrName, ideBus);
+    mMachine.AddStorageController (floppyCtrName, floppyBus);
+
     /* Register the VM prior to attaching hard disks */
     vbox.RegisterMachine (mMachine);
@@ -360,6 +368,5 @@
     }
 
-    /* Boot hard disk (IDE Primary Master) */
-    if (mGbHDA->isChecked())
+    /* Attach default devices */
     {
         bool success = false;
@@ -369,5 +376,23 @@
         {
             CMachine m = session.GetMachine();
-            m.AttachDevice ("IDE Controller", 0, 0, KDeviceType_HardDisk, mHDCombo->id());
+
+            /* Boot hard disk (IDE Primary Master) */
+            if (mGbHDA->isChecked())
+            {
+                m.AttachDevice (ideCtrName, 0, 0, KDeviceType_HardDisk, mHDCombo->id());
+                if (!m.isOk())
+                    vboxProblem().cannotAttachDevice (this, m, VBoxDefs::MediumType_HardDisk, mHDCombo->location(), ideBus, 0, 0);
+            }
+
+            /* Attach empty CD/DVD ROM Device */
+            m.AttachDevice (ideCtrName, 1, 0, KDeviceType_DVD, QString());
+            if (!m.isOk())
+                vboxProblem().cannotAttachDevice (this, m, VBoxDefs::MediumType_DVD, QString(), ideBus, 1, 0);
+
+            /* Attach empty Floppy Device */
+            m.AttachDevice (floppyCtrName, 0, 0, KDeviceType_Floppy, QString());
+            if (!m.isOk())
+                vboxProblem().cannotAttachDevice (this, m, VBoxDefs::MediumType_Floppy, QString(), floppyBus, 0, 0);
+
             if (m.isOk())
             {
@@ -378,8 +403,5 @@
                     vboxProblem().cannotSaveMachineSettings (m, this);
             }
-            else
-                vboxProblem().cannotAttachHardDisk (this, m,
-                                                    mHDCombo->location(),
-                                                    KStorageBus_IDE, 0, 0);
+
             session.Close();
         }
Index: /trunk/src/VBox/Frontends/VirtualBox/src/VBoxProblemReporter.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/VBoxProblemReporter.cpp	(revision 23584)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/VBoxProblemReporter.cpp	(revision 23585)
@@ -993,5 +993,5 @@
             "<p>This will detach it from the "
             "following virtual machine(s): <b>%3</b>.</p>")
-            .arg (toAccusative (aMedium.type()))
+            .arg (mediumToAccusative (aMedium.type()))
             .arg (aMedium.location())
             .arg (aUsage),
@@ -1008,5 +1008,5 @@
         tr ("<p>Are you sure you want to remove the %1 "
             "<nobr><b>%2</b></nobr> from the list of known media?</p>")
-            .arg (toAccusative (aMedium.type()))
+            .arg (mediumToAccusative (aMedium.type()))
             .arg (aMedium.location());
 
@@ -1153,58 +1153,62 @@
 }
 
-void VBoxProblemReporter::cannotAttachHardDisk (
-    QWidget *aParent, const CMachine &aMachine, const QString &aLocation,
-    KStorageBus aBus, LONG aChannel, LONG aDevice)
-{
+void VBoxProblemReporter::cannotAttachDevice (QWidget *aParent, const CMachine &aMachine,
+                                              VBoxDefs::MediumType aType, const QString &aLocation,
+                                              KStorageBus aBus, LONG aChannel, LONG aDevice)
+{
+    QString what (deviceToAccusative (aType));
+    if (!aLocation.isNull())
+        what += QString (" (<nobr><b>%1</b></nobr>)").arg (aLocation);
+
     message (aParent, Error,
-        tr ("Failed to attach the hard disk <nobr><b>%1</b></nobr> "
-            "to the slot <i>%2</i> of the machine <b>%3</b>.")
-            .arg (aLocation)
-            .arg (vboxGlobal().toString (StorageSlot (aBus, aChannel, aDevice)))
-            .arg (CMachine (aMachine).GetName()),
-        formatErrorInfo (aMachine));
-}
-
-void VBoxProblemReporter::cannotDetachHardDisk (
-    QWidget *aParent, const CMachine &aMachine, const QString &aLocation,
-    KStorageBus aBus, LONG aChannel, LONG aDevice)
-{
+             tr ("Failed to attach the %1 to the slot <i>%2</i> of the machine <b>%3</b>.")
+                 .arg (what)
+                 .arg (vboxGlobal().toString (StorageSlot (aBus, aChannel, aDevice)))
+                 .arg (CMachine (aMachine).GetName()),
+             formatErrorInfo (aMachine));
+}
+
+void VBoxProblemReporter::cannotDetachDevice (QWidget *aParent, const CMachine &aMachine,
+                                              VBoxDefs::MediumType aType, const QString &aLocation,
+                                              KStorageBus aBus, LONG aChannel, LONG aDevice)
+{
+    QString what (deviceToAccusative (aType));
+    if (!aLocation.isNull())
+        what += QString (" (<nobr><b>%1</b></nobr>)").arg (aLocation);
+
     message (aParent, Error,
-        tr ("Failed to detach the hard disk <nobr><b>%1</b></nobr> "
-            "from the slot <i>%2</i> of the machine <b>%3</b>.")
-            .arg (aLocation)
-            .arg (vboxGlobal().toString (StorageSlot (aBus, aChannel, aDevice)))
-            .arg (CMachine (aMachine).GetName()),
-         formatErrorInfo (aMachine));
-}
-
-void VBoxProblemReporter::
-cannotMountMedium (QWidget *aParent, const CMachine &aMachine,
-                   const VBoxMedium &aMedium, const COMResult &aResult)
+             tr ("Failed to detach the $1 from the slot <i>%2</i> of the machine <b>%3</b>.")
+                 .arg (what)
+                 .arg (vboxGlobal().toString (StorageSlot (aBus, aChannel, aDevice)))
+                 .arg (CMachine (aMachine).GetName()),
+             formatErrorInfo (aMachine));
+}
+
+void VBoxProblemReporter::cannotMountMedium (QWidget *aParent, const CMachine &aMachine,
+                                             const VBoxMedium &aMedium)
 {
     /** @todo (translation-related): the gender of "the" in translations
      * will depend on the gender of aMedium.type(). */
     message (aParent, Error,
-        tr ("Failed to mount the %1 <nobr><b>%2</b></nobr> "
-            "to the machine <b>%3</b>.")
-            .arg (toAccusative (aMedium.type()))
-            .arg (aMedium.location())
-            .arg (CMachine (aMachine).GetName()),
-      formatErrorInfo (aResult));
-}
-
-void VBoxProblemReporter::
-cannotUnmountMedium (QWidget *aParent, const CMachine &aMachine,
-                     const VBoxMedium &aMedium, const COMResult &aResult)
+             tr ("Failed to mount the %1 <nobr><b>%2</b></nobr> "
+                 "to the machine <b>%3</b>.")
+                 .arg (mediumToAccusative (aMedium.type(), aMedium.isHostDrive()))
+                 .arg (aMedium.isHostDrive() ? aMedium.name() : aMedium.location())
+                 .arg (CMachine (aMachine).GetName()),
+             formatErrorInfo (aMachine));
+}
+
+void VBoxProblemReporter::cannotUnmountMedium (QWidget *aParent, const CMachine &aMachine,
+                                               const VBoxMedium &aMedium)
 {
     /** @todo (translation-related): the gender of "the" in translations
      * will depend on the gender of aMedium.type(). */
     message (aParent, Error,
-        tr ("Failed to unmount the %1 <nobr><b>%2</b></nobr> "
-            "from the machine <b>%3</b>.")
-            .arg (toAccusative (aMedium.type()))
-            .arg (aMedium.location())
-            .arg (CMachine (aMachine).GetName()),
-      formatErrorInfo (aResult));
+             tr ("Failed to unmount the %1 <nobr><b>%2</b></nobr> "
+                 "from the machine <b>%3</b>.")
+                 .arg (mediumToAccusative (aMedium.type(), aMedium.isHostDrive()))
+                 .arg (aMedium.isHostDrive() ? aMedium.name() : aMedium.location())
+                 .arg (CMachine (aMachine).GetName()),
+             formatErrorInfo (aMachine));
 }
 
@@ -1217,5 +1221,5 @@
     message (aParent, Error,
         tr ("Failed to open the %1 <nobr><b>%2</b></nobr>.")
-            .arg (toAccusative (aType))
+            .arg (mediumToAccusative (aType))
             .arg (aLocation),
         formatErrorInfo (aVBox));
@@ -1229,5 +1233,5 @@
     message (aParent, Error,
         tr ("Failed to close the %1 <nobr><b>%2</b></nobr>.")
-            .arg (toAccusative (aMedium.type()))
+            .arg (mediumToAccusative (aMedium.type()))
             .arg (aMedium.location()),
         formatErrorInfo (aResult));
@@ -2187,13 +2191,33 @@
 
 /* static */
-QString VBoxProblemReporter::toAccusative (VBoxDefs::MediumType aType)
+QString VBoxProblemReporter::mediumToAccusative (VBoxDefs::MediumType aType, bool aIsHostDrive /* = false */)
 {
     QString type =
         aType == VBoxDefs::MediumType_HardDisk ?
-            tr ("hard disk", "failed to close ...") :
+            tr ("hard disk", "failed to mount ...") :
+        aType == VBoxDefs::MediumType_DVD && aIsHostDrive ?
+            tr ("CD/DVD", "failed to mount ... host-drive") :
+        aType == VBoxDefs::MediumType_DVD && !aIsHostDrive ?
+            tr ("CD/DVD image", "failed to mount ...") :
+        aType == VBoxDefs::MediumType_Floppy && aIsHostDrive ?
+            tr ("floppy", "failed to mount ... host-drive") :
+        aType == VBoxDefs::MediumType_Floppy && !aIsHostDrive ?
+            tr ("floppy image", "failed to mount ...") :
+        QString::null;
+
+    Assert (!type.isNull());
+    return type;
+}
+
+/* static */
+QString VBoxProblemReporter::deviceToAccusative (VBoxDefs::MediumType aType)
+{
+    QString type =
+        aType == VBoxDefs::MediumType_HardDisk ?
+            tr ("hard disk", "failed to attach ...") :
         aType == VBoxDefs::MediumType_DVD ?
-            tr ("CD/DVD image", "failed to close ...") :
+            tr ("CD/DVD device", "failed to attach ...") :
         aType == VBoxDefs::MediumType_Floppy ?
-            tr ("floppy image", "failed to close ...") :
+            tr ("floppy device", "failed to close ...") :
         QString::null;
 
Index: /trunk/src/VBox/Frontends/VirtualBox/src/VBoxSelectorWnd.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/VBoxSelectorWnd.cpp	(revision 23584)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/VBoxSelectorWnd.cpp	(revision 23585)
@@ -917,5 +917,5 @@
                 {
                     CStorageController ctl = machine.GetStorageControllerByName(ctlName);
-                    vboxProblem().cannotDetachHardDisk (this, machine,
+                    vboxProblem().cannotDetachDevice (this, machine, VBoxDefs::MediumType_HardDisk,
                         vboxGlobal().getMedium (CMedium (hda.GetMedium())).location(),
                         ctl.GetBus(), hda.GetPort(), hda.GetDevice());
Index: /trunk/src/VBox/Frontends/VirtualBox/src/VBoxVMFirstRunWzd.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/VBoxVMFirstRunWzd.cpp	(revision 23584)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/VBoxVMFirstRunWzd.cpp	(revision 23585)
@@ -6,5 +6,5 @@
 
 /*
- * Copyright (C) 2006-2009 Sun Microsystems, Inc.
+ * Copyright (C) 2008-2009 Sun Microsystems, Inc.
  *
  * This file is part of VirtualBox Open Source Edition (OSE), as
@@ -21,10 +21,14 @@
  */
 
+/* Local includes */
 #include "VBoxVMFirstRunWzd.h"
 #include "VBoxGlobal.h"
+#include "VBoxProblemReporter.h"
 #include "VBoxMediaManagerDlg.h"
+#include "QIWidgetValidator.h"
 
 VBoxVMFirstRunWzd::VBoxVMFirstRunWzd (const CMachine &aMachine, QWidget *aParent)
-    : QIWithRetranslateUI<QIAbstractWizard> (aParent)
+    : QIWithRetranslateUI <QIAbstractWizard> (aParent)
+    , mValidator (0)
     , mMachine (aMachine)
 {
@@ -36,43 +40,31 @@
 
     /* Hide unnecessary text labels */
-    CMediumAttachmentVector vec = mMachine.GetMediumAttachments();
-    if (vec.size() != 0)
-    {
-        mTextWelcome2->setHidden (true);
-        mTextType2->setHidden (true);
-        mTextSource2->setHidden (true);
-        mTextSummaryHdr2->setHidden (true);
-        mTextSummaryFtr2->setHidden (true);
-    }
-    else
-    {
-        mTextWelcome1->setHidden (true);
-        mTextType1->setHidden (true);
-        mTextSource1->setHidden (true);
-        mTextSummaryHdr1->setHidden (true);
-        mTextSummaryFtr1->setHidden (true);
-    }
+    CMediumAttachment hda = mMachine.GetMediumAttachment ("IDE Controller", 0, 0);
+    mTextWelcome1->setHidden (hda.isNull());
+    mTextType1->setHidden (hda.isNull());
+    mTextSource1->setHidden (hda.isNull());
+    mTextSummaryHdr1->setHidden (hda.isNull());
+    mTextSummaryFtr1->setHidden (hda.isNull());
+    mTextWelcome2->setHidden (!hda.isNull());
+    mTextType2->setHidden (!hda.isNull());
+    mTextSource2->setHidden (!hda.isNull());
+    mTextSummaryHdr2->setHidden (!hda.isNull());
+    mTextSummaryFtr2->setHidden (!hda.isNull());
 
     /* Media page */
-    mCbImage->setMachineId (mMachine.GetId());
-    mTbVmm->setIcon (VBoxGlobal::iconSet (":/select_file_16px.png",
-                                          ":/select_file_dis_16px.png"));
-    mWvalType = new QIWidgetValidator (mPageMedia, this);
-    connect (mWvalType, SIGNAL (validityChanged (const QIWidgetValidator *)),
+    mCbMedia->setMachineId (mMachine.GetId());
+    mTbVmm->setIcon (VBoxGlobal::iconSet (":/select_file_16px.png", ":/select_file_dis_16px.png"));
+    mValidator = new QIWidgetValidator (mPageMedia, this);
+    connect (mValidator, SIGNAL (validityChanged (const QIWidgetValidator *)),
              this, SLOT (enableNext (const QIWidgetValidator *)));
-    connect (mWvalType, SIGNAL (isValidRequested (QIWidgetValidator *)),
+    connect (mValidator, SIGNAL (isValidRequested (QIWidgetValidator *)),
              this, SLOT (revalidate (QIWidgetValidator *)));
     connect (mRbCdType, SIGNAL (clicked()), this, SLOT (mediaTypeChanged()));
     connect (mRbFdType, SIGNAL (clicked()), this, SLOT (mediaTypeChanged()));
-    connect (mRbHost, SIGNAL (clicked()), this, SLOT (mediaSourceChanged()));
-    connect (mRbImage, SIGNAL (clicked()), this, SLOT (mediaSourceChanged()));
     connect (mTbVmm, SIGNAL (clicked()), this, SLOT (openMediaManager()));
     mRbCdType->animateClick();
-    mRbHost->animateClick();
 
-    /* Summary page */
-    /* Update the next button state for pages with validation
-     * (validityChanged() connected to enableNext() will do the job) */
-    mWvalType->revalidate();
+    /* Revalidate updated page */
+    mValidator->revalidate();
 
     /* Initialize wizard ftr */
@@ -91,21 +83,13 @@
     if (page == mPageSummary)
     {
-        /* compose summary */
-        QString type =
-            mRbCdType->isChecked() ? tr ("CD/DVD-ROM Device") :
-            mRbFdType->isChecked() ? tr ("Floppy Device") :
-            QString::null;
-        QString source =
-            mRbHost->isChecked() ? tr ("Host Drive %1").arg (mCbHost->currentText()) :
-            mRbImage->isChecked() ? mCbImage->currentText() : QString::null;
-        QString summary = QString (
-            "<table>"
-            "<tr><td>%1:&nbsp;</td><td>%2</td></tr>"
-            "<tr><td>%3:&nbsp;</td><td>%4</td></tr>"
-            "</table>"
-        )
-            .arg (tr ("Type", "summary"), type)
-            .arg (tr ("Source", "summary"), source);
-
+        /* Compose Summary */
+        QString type = mRbCdType->isChecked() ? tr ("CD/DVD-ROM Device") : tr ("Floppy Device");
+        QString source = mCbMedia->currentText();
+        QString summary = QString ("<table>"
+                                   "<tr><td>%1:&nbsp;</td><td>%2</td></tr>"
+                                   "<tr><td>%3:&nbsp;</td><td>%4</td></tr>"
+                                   "</table>")
+                                   .arg (tr ("Type", "summary"), type)
+                                   .arg (tr ("Source", "summary"), source);
         mTeSummary->setText (summary);
     }
@@ -114,135 +98,69 @@
 void VBoxVMFirstRunWzd::accept()
 {
-    /* CD/DVD Media selected */
-    if (mRbCdType->isChecked())
-    {
-        if (mRbHost->isChecked())
-        {
-            CMedium hostDrive = mHostDVDs [mCbHost->currentIndex()];
-            if (!hostDrive.isNull())
-                mMachine.MountMedium ("IDE Controller", 1, 0, hostDrive.GetId());
-        }
-        else if (mRbImage->isChecked())
-            mMachine.MountMedium ("IDE Controller", 1, 0, mCbImage->id());
-    }
-    /* Floppy Media selected */
-    else if (mRbFdType->isChecked())
-    {
-        if (mRbHost->isChecked())
-        {
-            CMedium hostDrive = mHostFloppys [mCbHost->currentIndex()];
-            if (!hostDrive.isNull())
-                mMachine.MountMedium ("IDE Controller", 1, 0, hostDrive.GetId());
-        }
-        else if (mRbImage->isChecked())
-            mMachine.MountMedium ("IDE Controller", 1, 0, mCbImage->id());
-    }
-
-    QIAbstractWizard::accept();
+    /* Composing default controller name */
+    QString ctrName (mRbCdType->isChecked() ? "IDE Controller" : "Floppy Controller");
+    LONG ctrPort = mRbCdType->isChecked() ? 1 : 0;
+    LONG ctrDevice = 0;
+    /* Default should present */
+    CStorageController ctr = mMachine.GetStorageControllerByName (ctrName);
+    Assert (!ctr.isNull());
+    /* Mount medium to the predefined port/device */
+    mMachine.MountMedium (ctrName, ctrPort, ctrDevice, mCbMedia->id());
+    if (mMachine.isOk())
+        QIAbstractWizard::accept();
+    else
+        vboxProblem().cannotMountMedium (this, mMachine, vboxGlobal().findMedium (mCbMedia->id()));
 }
 
-void VBoxVMFirstRunWzd::revalidate (QIWidgetValidator *aWval)
+void VBoxVMFirstRunWzd::revalidate (QIWidgetValidator *aValidator)
 {
-    /* do individual validations for pages */
-    QWidget *pg = aWval->widget();
-    bool valid = aWval->isOtherValid();
+    /* Do individual validations for pages */
+    QWidget *pg = aValidator->widget();
+    bool valid = aValidator->isOtherValid();
 
+    /* Allow to go to Summary only if non-null medium selected */
     if (pg == mPageMedia)
-    {
-        valid = (mRbHost->isChecked() && !mCbHost->currentText().isEmpty()) ||
-                (mRbImage->isChecked() && !mCbImage->currentText().isEmpty());
-    }
+        valid = !vboxGlobal().findMedium (mCbMedia->id()).isNull();
 
-    aWval->setOtherValid (valid);
+    aValidator->setOtherValid (valid);
 }
 
 void VBoxVMFirstRunWzd::mediaTypeChanged()
 {
-    /* CD/DVD Media type selected */
-    mCbHost->clear();
+    /* CD/DVD media type selected */
     if (sender() == mRbCdType)
     {
-        /* Search for the host dvd-drives */
-        CMediumVector coll =
-            vboxGlobal().virtualBox().GetHost().GetDVDDrives();
-        mHostDVDs.resize (coll.size());
-
-        for (int id = 0; id < coll.size(); ++id)
-        {
-            CMedium hostDVD = coll[id];
-            QString name = hostDVD.GetName();
-            QString description = hostDVD.GetDescription();
-            QString fullName = description.isEmpty() ?
-                name : QString ("%1 (%2)").arg (description, name);
-            mCbHost->insertItem (id, fullName);
-            mHostDVDs [id] = hostDVD;
-        }
-
-        /* Switch media images type to DVD */
-        mCbImage->setType (VBoxDefs::MediumType_DVD);
+        /* Switch media combo-box type to CD/DVD */
+        mCbMedia->setType (VBoxDefs::MediumType_DVD);
     }
     /* Floppy media type selected */
     else if (sender() == mRbFdType)
     {
-        /* Search for the host floppy-drives */
-        CMediumVector coll =
-            vboxGlobal().virtualBox().GetHost().GetFloppyDrives();
-        mHostFloppys.resize (coll.size());
-
-        for (int id = 0; id < coll.size(); ++id)
-        {
-            CMedium hostFloppy = coll[id];
-            QString name = hostFloppy.GetName();
-            QString description = hostFloppy.GetDescription();
-            QString fullName = description.isEmpty() ?
-                name : QString ("%1 (%2)").arg (description, name);
-            mCbHost->insertItem (id, fullName);
-            mHostFloppys [id] = hostFloppy;
-        }
-
-        /* Switch media images type to FD */
-        mCbImage->setType (VBoxDefs::MediumType_Floppy);
+        /* Switch media combo-box type to Floppy */
+        mCbMedia->setType (VBoxDefs::MediumType_Floppy);
     }
 
-    /* Repopulate the media list */
-    mCbImage->repopulate();
+    /* Update the media combo-box */
+    mCbMedia->repopulate();
 
     /* Revalidate updated page */
-    mWvalType->revalidate();
-}
-
-void VBoxVMFirstRunWzd::mediaSourceChanged()
-{
-    mCbHost->setEnabled (sender() == mRbHost);
-    mCbImage->setEnabled (sender() == mRbImage);
-    mTbVmm->setEnabled (sender() == mRbImage);
-
-    /* Revalidate updated page */
-    mWvalType->revalidate();
+    mValidator->revalidate();
 }
 
 void VBoxVMFirstRunWzd::openMediaManager()
 {
-    VBoxDefs::MediumType type =
-        mRbCdType->isChecked() ? VBoxDefs::MediumType_DVD :
-        mRbFdType->isChecked() ? VBoxDefs::MediumType_Floppy :
-        VBoxDefs::MediumType_Invalid;
+    /* Create & open VMM */
+    VBoxMediaManagerDlg dlg (this);
+    dlg.setup (mCbMedia->type(), true /* aDoSelect */);
+    if (dlg.exec() == QDialog::Accepted)
+        mCbMedia->setCurrentItem (dlg.selectedId());
 
-    AssertReturnVoid (type != VBoxDefs::MediumType_Invalid);
-
-    VBoxMediaManagerDlg dlg (this);
-    dlg.setup (type, true /* aDoSelect */);
-    if (dlg.exec() == QDialog::Accepted)
-    {
-        mCbImage->setCurrentItem (dlg.selectedId());
-
-        /* Revalidate updated page */
-        mWvalType->revalidate();
-    }
+    /* Revalidate updated page */
+    mValidator->revalidate();
 }
 
-void VBoxVMFirstRunWzd::enableNext (const QIWidgetValidator *aWval)
+void VBoxVMFirstRunWzd::enableNext (const QIWidgetValidator *aValidator)
 {
-    nextButton (aWval->widget())->setEnabled (aWval->isValid());
+    nextButton (aValidator->widget())->setEnabled (aValidator->isValid());
 }
 
Index: /trunk/src/VBox/Frontends/VirtualBox/src/VBoxVMSettingsHD.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/VBoxVMSettingsHD.cpp	(revision 23584)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/VBoxVMSettingsHD.cpp	(revision 23585)
@@ -778,5 +778,5 @@
     /* Cache medium information */
     mAttName = medium.name (!mAttIsShowDiffs);
-    mAttTip = medium.toolTipCheckRO (!mAttIsShowDiffs);
+    mAttTip = medium.toolTipCheckRO (!mAttIsShowDiffs, mAttDeviceType != KDeviceType_HardDisk);
     mAttPixmap = medium.iconCheckRO (!mAttIsShowDiffs);
     mAttIsHostDrive = medium.isHostDrive();
Index: /trunk/src/VBox/Frontends/VirtualBox/ui/VBoxVMFirstRunWzd.ui
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/ui/VBoxVMFirstRunWzd.ui	(revision 23584)
+++ /trunk/src/VBox/Frontends/VirtualBox/ui/VBoxVMFirstRunWzd.ui	(revision 23585)
@@ -3,5 +3,5 @@
  VBox frontends: Qt4 GUI ("VirtualBox"):
 
- Copyright (C) 2008 Sun Microsystems, Inc.
+ Copyright (C) 2008-2009 Sun Microsystems, Inc.
 
  This file is part of VirtualBox Open Source Edition (OSE), as
@@ -439,59 +439,17 @@
               <string>Media Source</string>
              </property>
-             <layout class="QVBoxLayout" >
+             <layout class="QHBoxLayout" >
               <property name="topMargin" >
                <number>4</number>
               </property>
               <item>
-               <layout class="QHBoxLayout" >
-                <item>
-                 <widget class="QRadioButton" name="mRbHost" >
-                  <property name="text" >
-                   <string>&amp;Host Drive</string>
-                  </property>
-                 </widget>
-                </item>
-                <item>
-                 <widget class="QComboBox" name="mCbHost" >
-                  <property name="sizeAdjustPolicy" >
-                   <enum>QComboBox::AdjustToContentsOnFirstShow</enum>
-                  </property>
-                 </widget>
-                </item>
-                <item>
-                 <spacer>
-                  <property name="orientation" >
-                   <enum>Qt::Horizontal</enum>
-                  </property>
-                  <property name="sizeHint" >
-                   <size>
-                    <width>40</width>
-                    <height>5</height>
-                   </size>
-                  </property>
-                 </spacer>
-                </item>
-               </layout>
+               <widget class="VBoxMediaComboBox" name="mCbMedia" />
               </item>
               <item>
-               <widget class="QRadioButton" name="mRbImage" >
-                <property name="text" >
-                 <string>&amp;Image File</string>
+               <widget class="QToolButton" name="mTbVmm" >
+                <property name="icon" >
+                 <iconset resource="../VirtualBox1.qrc" >:/select_file_16px.png</iconset>
                 </property>
                </widget>
-              </item>
-              <item>
-               <layout class="QHBoxLayout" >
-                <item>
-                 <widget class="VBoxMediaComboBox" name="mCbImage" />
-                </item>
-                <item>
-                 <widget class="QToolButton" name="mTbVmm" >
-                  <property name="icon" >
-                   <iconset resource="../VirtualBox1.qrc" >:/select_file_16px.png</iconset>
-                  </property>
-                 </widget>
-                </item>
-               </layout>
               </item>
              </layout>
@@ -721,10 +679,5 @@
              </property>
              <property name="text" >
-              <string>&lt;html>&lt;head>&lt;meta name="qrichtext" content="1" />&lt;style type="text/css">
-p, li { white-space: pre-wrap; }
-&lt;/style>&lt;/head>&lt;body style=" font-family:'Arial'; font-size:9pt; font-weight:400; font-style:normal;">
-&lt;p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">If the above is correct, press the &lt;span style=" font-weight:600;">Finish&lt;/span> button. Once you press it, the selected media will be temporarily mounted on the virtual machine and the machine will start execution.&lt;/p>
-&lt;p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Please note that when you close the virtual machine, the specified media will be automatically unmounted and the boot device will be set back to the first hard disk.&lt;/p>
-&lt;p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Depending on the type of the setup program, you may need to manually unmount (eject) the media after the setup program reboots the virtual machine, to prevent the installation process from starting again. You can do this by selecting the corresponding &lt;span style=" font-weight:600;">Unmount...&lt;/span> action in the &lt;span style=" font-weight:600;">Devices&lt;/span> menu&lt;span style=" font-weight:600;">.&lt;/span>&lt;/p>&lt;/body>&lt;/html></string>
+              <string>&lt;p>If the above is correct, press the &lt;b>Finish&lt;/b> button. Once you press it, the selected media will be temporarily mounted on the virtual machine and the machine will start execution.&lt;/p>&lt;p>Please note that when you close the virtual machine, the specified media will be automatically unmounted and the boot device will be set back to the first hard disk.&lt;/p>&lt;p>Depending on the type of the setup program, you may need to manually unmount (eject) the media after the setup program reboots the virtual machine, to prevent the installation process from starting again. You can do this by selecting the corresponding &lt;b>Unmount...&lt;/b> action in the &lt;b>Devices&lt;/b> menu.&lt;/p></string>
              </property>
              <property name="alignment" >
Index: /trunk/src/VBox/Main/MachineImpl.cpp
===================================================================
--- /trunk/src/VBox/Main/MachineImpl.cpp	(revision 23584)
+++ /trunk/src/VBox/Main/MachineImpl.cpp	(revision 23585)
@@ -515,14 +515,4 @@
                         mSerialPorts [slot]->applyDefaults (aOsType);
                 }
-
-                /* The default is that the VM has at least one IDE controller. */
-                /** @todo does this forced IDE controller make sense any more? */
-                ComPtr<IStorageController> pController;
-                rc = AddStorageController(Bstr("IDE Controller"), StorageBus_IDE, pController.asOutParam());
-                CheckComRCReturnRC(rc);
-                ComObjPtr<StorageController> ctl;
-                rc = getStorageControllerByName(Bstr("IDE Controller"), ctl, true);
-                CheckComRCReturnRC(rc);
-                ctl->COMSETTER(ControllerType)(StorageControllerType_PIIX4);
             }
 
