Index: /trunk/src/VBox/Frontends/VirtualBox/include/VBoxGlobal.h
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/include/VBoxGlobal.h	(revision 252)
+++ /trunk/src/VBox/Frontends/VirtualBox/include/VBoxGlobal.h	(revision 253)
@@ -47,5 +47,5 @@
 struct VBoxMedia
 {
-    enum Status { Ok = 0, Error = 0x01, Inaccessible = 0x02 };
+    enum Status { Unknown, Ok, Error, Inaccessible };
 
     VBoxMedia() : type (VBoxDefs::InvalidType), status (Ok) {}
@@ -298,4 +298,5 @@
 
     void startEnumeratingMedia();
+    bool isInEnumeratingProcess() { return media_enum_thread ? true : false; }
 
     /** Returns a list of all currently enumerated media (it is empty if the
Index: /trunk/src/VBox/Frontends/VirtualBox/include/VBoxMediaComboBox.h
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/include/VBoxMediaComboBox.h	(revision 252)
+++ /trunk/src/VBox/Frontends/VirtualBox/include/VBoxMediaComboBox.h	(revision 253)
@@ -24,9 +24,10 @@
 #define __VBoxMediaComboBox_h__
 
+#include "VBoxGlobal.h"
+
 #include <qcombobox.h>
 #include <quuid.h>
 
-struct VBoxMedia;
-typedef QValueList <VBoxMedia> VBoxMediaList;
+class QListBoxItem;
 
 class VBoxMediaComboBox : public QComboBox
@@ -38,30 +39,38 @@
     VBoxMediaComboBox (QWidget *aParent = 0,
                        const char *aName = 0, int aType = 0);
-    ~VBoxMediaComboBox () {}
+    ~VBoxMediaComboBox() {}
 
-    void refresh();
+    void  refresh();
+    void  appendItem (const QString &, const QUuid &, const QString &);
+    void  replaceItem (int, const QString &, const QString &);
+    void  removeLastItem();
+    void  setReadyForRefresh();
+    void  setRequiredItem (const QUuid &);
+    void  setUseEmptyItem (bool);
+    void  setBelongsTo (const QUuid &);
     QUuid getId();
-    void appendItem (const QString&, const QUuid&);
-    void removeLastItem();
-    void setRequiredItem (const QUuid&);
-    void setUseEmptyItem (bool);
-    void setReadyForRefresh();
-    void setBelongsTo (const QUuid&);
     QUuid getBelongsTo();
-    void loadShortCuts (const QStringList&, const QStringList&);
+    void setCurrentItem (int);
 
 protected slots:
 
-    void updateShortcuts (const VBoxMediaList &);
+    void mediaEnumerated (const VBoxMedia &);
+    void listEnumerated (const VBoxMediaList &);
+    void processOnItem (QListBoxItem *);
+    void updateToolTip (int);
 
 protected:
 
+    void loadCleanContent();
+    int updateMedia (const QString &, const QUuid &, const QString &,
+                     VBoxMedia::Status);
+
     int         mType;
     QStringList mUuidList;
+    QStringList mTipList;
     QUuid       mMachineId;
     QUuid       mRequiredId;
     bool        mUseEmptyItem;
     bool        mToBeRefreshed;
-    bool        mWasEnabled;
 };
 
Index: /trunk/src/VBox/Frontends/VirtualBox/src/VBoxMediaComboBox.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/VBoxMediaComboBox.cpp	(revision 252)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/VBoxMediaComboBox.cpp	(revision 253)
@@ -22,87 +22,217 @@
 
 #include "VBoxMediaComboBox.h"
+#include "VBoxDiskImageManagerDlg.h"
 #include "VBoxGlobal.h"
 
 #include <qfileinfo.h>
+#include <qimage.h>
 #include <qdir.h>
 #include <qfile.h>
+#include <qtooltip.h>
+#include <qlistbox.h>
 
 VBoxMediaComboBox::VBoxMediaComboBox (QWidget *aParent, const char *aName, int aType)
     : QComboBox (aParent , aName),
-    mType(aType), mRequiredId(QUuid()), mUseEmptyItem(false), mToBeRefreshed(false)
+    mType (aType), mRequiredId (QUuid()), mUseEmptyItem (false), mToBeRefreshed (false)
 {
     setSizePolicy (QSizePolicy::Expanding, QSizePolicy::Fixed);
     /* Media shortcuts creating */
+    connect (&vboxGlobal(), SIGNAL (mediaEnumerated (const VBoxMedia &)),
+             this, SLOT (mediaEnumerated (const VBoxMedia &)));
     connect (&vboxGlobal(), SIGNAL (mediaEnumerated (const VBoxMediaList &)),
-             this, SLOT (updateShortcuts (const VBoxMediaList &)));
-}
-
-void VBoxMediaComboBox::updateShortcuts (const VBoxMediaList &aList)
-{
-    /* check&reset refresh flag */
-    if (!mToBeRefreshed)
-        return;
-    else
-        mToBeRefreshed = false;
-    /* combo-box clearing */
-    clear();
-    mUuidList.clear();
-    /* prepend empty item if used */
-    if (mUseEmptyItem)
-        appendItem (tr ("<no hard disk>"), QUuid());
-    int activatedItem = 0;
-    /* processing all medias */
-    VBoxMediaList::const_iterator it;
-    for (it = aList.begin(); it != aList.end(); ++ it)
+             this, SLOT (listEnumerated (const VBoxMediaList &)));
+    connect (this, SIGNAL (activated (int)),
+             this, SLOT (updateToolTip (int)));
+    connect (listBox(), SIGNAL (onItem (QListBoxItem*)),
+             this, SLOT (processOnItem (QListBoxItem*)));
+}
+
+void VBoxMediaComboBox::loadCleanContent()
+{
+    CVirtualBox vbox = vboxGlobal().virtualBox();
+
+    switch (mType)
     {
-        const VBoxMedia& media = *it;
-        if (!(media.type & mType))
-            continue;
-        QString src;
-        QUuid   mediaId;
-        switch (media.type)
-        {
-            case VBoxDefs::HD:
+        /* load hd list */
+        case VBoxDefs::HD:
+        {
+            CHardDiskEnumerator en = vbox.GetHardDisks().Enumerate();
+            while (en.HasMore())
             {
-                CHardDisk hd = media.disk;
-                src = hd.GetLocation();
+                QUuid mediaId;
+                QString toolTip;
+                CHardDisk hd = en.GetNext();
+                QString src = hd.GetLocation();
                 QUuid machineId = hd.GetMachineId();
                 /* append list only with free hd */
                 if (machineId.isNull() || machineId == mMachineId)
+                {
                     mediaId = hd.GetId();
-                break;
+                    toolTip = VBoxDiskImageManagerDlg::composeHdToolTip (hd, VBoxMedia::Unknown);
+                }
+                if (!mediaId.isNull()) updateMedia (src, mediaId, toolTip, VBoxMedia::Unknown);
             }
-            case VBoxDefs::CD:
+            break;
+        }
+        /* load cd list */
+        case VBoxDefs::CD:
+        {
+            CDVDImageEnumerator en = vbox.GetDVDImages().Enumerate();
+            while (en.HasMore())
             {
-                CDVDImage dvd = media.disk;
-                src = dvd.GetFilePath();
-                mediaId = dvd.GetId();
-                break;
+                QUuid mediaId;
+                QString toolTip;
+                CDVDImage cd = en.GetNext();
+                QString src = cd.GetFilePath();
+                mediaId = cd.GetId();
+                toolTip = VBoxDiskImageManagerDlg::composeCdToolTip (cd, VBoxMedia::Unknown);
+                updateMedia (src, mediaId, toolTip, VBoxMedia::Unknown);
             }
-            case VBoxDefs::FD:
+            break;
+        }
+        /* load fd list */
+        case VBoxDefs::FD:
+        {
+            CFloppyImageEnumerator en = vbox.GetFloppyImages().Enumerate();
+            while (en.HasMore())
             {
-                CFloppyImage floppy = media.disk;
-                src = floppy.GetFilePath();
-                mediaId = floppy.GetId();
-                break;
+                QUuid mediaId;
+                QString toolTip;
+                CFloppyImage fd = en.GetNext();
+                QString src = fd.GetFilePath();
+                mediaId = fd.GetId();
+                toolTip = VBoxDiskImageManagerDlg::composeFdToolTip (fd, VBoxMedia::Unknown);
+                updateMedia (src, mediaId, toolTip, VBoxMedia::Unknown);
             }
-            default:
-                AssertFailed();
-        }
-        if (!mediaId.isNull())
-        {
-            QFileInfo fi (src);
-            appendItem (fi.fileName() + " (" +
-                        QDir::convertSeparators (fi.dirPath()) + ")", mediaId);
-            if (mediaId == mRequiredId)
+            break;
+        }
+        default:
+            AssertFailed();
+    }
+}
+
+void VBoxMediaComboBox::mediaEnumerated (const VBoxMedia &aMedia)
+{
+    if (!mToBeRefreshed) return;
+    if (!(aMedia.type & mType))
+        return;
+
+    QString src;
+    QUuid   mediaId;
+    QString toolTip;
+
+    switch (aMedia.type)
+    {
+        case VBoxDefs::HD:
+        {
+            CHardDisk hd = aMedia.disk;
+            src = hd.GetLocation();
+            QUuid machineId = hd.GetMachineId();
+            /* append list only with free hd */
+            if (machineId.isNull() || machineId == mMachineId)
             {
-                activatedItem = count() - 1;
-                setCurrentItem (activatedItem);
+                mediaId = hd.GetId();
+                toolTip = VBoxDiskImageManagerDlg::composeHdToolTip (hd, aMedia.status);
             }
-        }
+            break;
+        }
+        case VBoxDefs::CD:
+        {
+            CDVDImage dvd = aMedia.disk;
+            src = dvd.GetFilePath();
+            mediaId = dvd.GetId();
+            toolTip = VBoxDiskImageManagerDlg::composeCdToolTip (dvd, aMedia.status);
+            break;
+        }
+        case VBoxDefs::FD:
+        {
+            CFloppyImage floppy = aMedia.disk;
+            src = floppy.GetFilePath();
+            mediaId = floppy.GetId();
+            toolTip = VBoxDiskImageManagerDlg::composeFdToolTip (floppy, aMedia.status);
+            break;
+        }
+        default:
+            AssertFailed();
     }
-    emit activated (activatedItem);
-    if (mWasEnabled)
-        setEnabled (true);
+    int updatedMedia = -1;
+    if (!mediaId.isNull())
+        updatedMedia = updateMedia (src, mediaId, toolTip, aMedia.status);
+    if (updatedMedia == -1) return;
+
+    /* update warning/error icons */
+    /// @todo (r=dmik) cache pixmaps as class members
+    QPixmap pixmap;
+    QImage img;
+    if (aMedia.status == VBoxMedia::Inaccessible)
+        img = QMessageBox::standardIcon (QMessageBox::Warning).convertToImage();
+    else if (aMedia.status == VBoxMedia::Error)
+        img = QMessageBox::standardIcon (QMessageBox::Critical).convertToImage();
+    if (!img.isNull())
+    {
+        img = img.smoothScale (14, 14);
+        pixmap.convertFromImage (img);
+    }
+    if (!pixmap.isNull())
+        changeItem (pixmap, text (updatedMedia), updatedMedia); 
+}
+
+int VBoxMediaComboBox::updateMedia (const QString &aSrc,
+                                    const QUuid   &aId,
+                                    const QString &aTip,
+                                    VBoxMedia::Status /* aStatus */)
+{
+    /* search & update media */
+    QFileInfo fi (aSrc);
+    int index = mUuidList.findIndex (aId);
+    QString name = QString ("%1 (%2)").arg (fi.fileName())
+                   .arg (QDir::convertSeparators (fi.dirPath()));
+    index == -1 ? appendItem (name, aId, aTip) : replaceItem (index, name, aTip);
+    if (aId == mRequiredId)
+    {
+        int activatedItem = index == -1 ? count() - 1 : index;
+        setCurrentItem (activatedItem);
+        emit activated (activatedItem);
+    }
+    else
+        updateToolTip (currentItem());
+    return index == -1 ? count() - 1 : index;
+}
+
+void VBoxMediaComboBox::listEnumerated (const VBoxMediaList &aList)
+{
+    emit activated (currentItem());
+    mToBeRefreshed = false;
+}
+
+void VBoxMediaComboBox::updateToolTip (int aItem)
+{
+    /* combobox tooltip attaching */
+    QToolTip::remove (this);
+    QToolTip::add (this, mTipList [aItem]);
+}
+
+void VBoxMediaComboBox::processOnItem (QListBoxItem* aItem)
+{
+    /* combobox item's tooltip attaching */
+    int index = listBox()->index (aItem);
+    QToolTip::remove (listBox()->viewport());
+    QToolTip::add (listBox()->viewport(), mTipList [index]);
+}
+
+void VBoxMediaComboBox::setReadyForRefresh()
+{
+    mToBeRefreshed = true;
+    /* clearing media combobox */
+    clear(), mUuidList.clear(), mTipList.clear();
+    /* prepend empty item if used */
+    if (mUseEmptyItem)
+        appendItem (tr ("<no hard disk>"), QUuid(), tr ("No hard disk"));
+    /* load all non-enumerated shortcuts */
+    if (!vboxGlobal().isInEnumeratingProcess()) loadCleanContent();
+    /* update already enumerated shortcuts */
+    VBoxMediaList list = vboxGlobal().currentMediaList();
+    for (VBoxMediaList::const_iterator it = list.begin(); it != list.end(); ++ it)
+        mediaEnumerated (*it);
 }
 
@@ -116,11 +246,22 @@
 QUuid VBoxMediaComboBox::getId()
 {
-    return mUuidList.isEmpty() ? QUuid() : QUuid (mUuidList[currentItem()]);
-}
-
-void VBoxMediaComboBox::appendItem (const QString &aName, const QUuid &aId)
-{
-    insertItem(aName);
+    return mUuidList.isEmpty() ? QUuid() : QUuid (mUuidList [currentItem()]);
+}
+
+void VBoxMediaComboBox::appendItem (const QString &aName,
+                                    const QUuid   &aId,
+                                    const QString &aTip)
+{
+    insertItem (aName);
     mUuidList << aId;
+    mTipList  << aTip;
+}
+
+void VBoxMediaComboBox::replaceItem (int aNumber,
+                                     const QString &aName,
+                                     const QString &aTip)
+{
+    changeItem (aName, aNumber);
+    mTipList [aNumber] = aTip;
 }
 
@@ -130,4 +271,5 @@
         removeItem (count() - 1);
     mUuidList.pop_back();
+    mTipList.pop_back();
 }
 
@@ -142,15 +284,4 @@
 }
 
-void VBoxMediaComboBox::setReadyForRefresh()
-{
-    mToBeRefreshed = true;
-    /* clearing media combobox */
-    clear(), mUuidList.clear();
-    /* blocking media combobox */
-    mWasEnabled = isEnabled();
-    setEnabled (false);
-    insertItem (tr ("...enumerating media..."));
-}
-
 void VBoxMediaComboBox::setBelongsTo (const QUuid &aMachineId)
 {
@@ -163,23 +294,7 @@
 }
 
-void VBoxMediaComboBox::loadShortCuts (const QStringList& aNameList,
-                                       const QStringList& aKeyList)
-{
-    /* clearing media combobox */
-    clear(), mUuidList.clear();
-    /* load shortcuts from string lists */
-    QStringList::const_iterator itName = aNameList.begin();
-    QStringList::const_iterator itKey  = aKeyList.begin();
-    int activatedItem = 0;
-    for (;itName != aNameList.end() && itKey != aKeyList.end();)
-    {
-        appendItem (*itName, *itKey);
-        if (*itKey == mRequiredId)
-        {
-            activatedItem = count() - 1;
-            setCurrentItem (activatedItem);
-        }
-        ++itName; ++itKey;
-    }
-    emit activated (activatedItem);
-}
+void VBoxMediaComboBox::setCurrentItem (int aIndex)
+{
+    QComboBox::setCurrentItem (aIndex);
+    updateToolTip (aIndex);
+}
Index: /trunk/src/VBox/Frontends/VirtualBox/ui/VBoxDiskImageManagerDlg.ui
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/ui/VBoxDiskImageManagerDlg.ui	(revision 252)
+++ /trunk/src/VBox/Frontends/VirtualBox/ui/VBoxDiskImageManagerDlg.ui	(revision 253)
@@ -303,5 +303,5 @@
                 <widget class="QLayoutWidget">
                     <property name="name">
-                        <cstring>layout6</cstring>
+                        <cstring>buttonLayout</cstring>
                     </property>
                     <hbox>
@@ -329,4 +329,21 @@
                             <property name="name">
                                 <cstring>Spacer1</cstring>
+                            </property>
+                            <property name="orientation">
+                                <enum>Horizontal</enum>
+                            </property>
+                            <property name="sizeType">
+                                <enum>Expanding</enum>
+                            </property>
+                            <property name="sizeHint">
+                                <size>
+                                    <width>214</width>
+                                    <height>16</height>
+                                </size>
+                            </property>
+                        </spacer>
+                        <spacer>
+                            <property name="name">
+                                <cstring>Spacer2</cstring>
                             </property>
                             <property name="orientation">
@@ -509,5 +526,5 @@
     <forward>class QSizeGrip</forward>
     <forward>class QIRichLabel</forward>
-    <forward>class ProgressBarItem</forward>
+    <forward>class QProgressBar</forward>
 </forwards>
 <variables>
@@ -546,7 +563,6 @@
     <variable access="private">static VBoxDiskImageManagerDlg *mModelessDialog;</variable>
     <variable access="private">bool mToBeRefreshed;</variable>
-    <variable access="private">ProgressBarItem *mHdsProgress;</variable>
-    <variable access="private">ProgressBarItem *mCdsProgress;</variable>
-    <variable access="private">ProgressBarItem *mFdsProgress;</variable>
+    <variable access="private">QProgressBar *mProgressBar;</variable>
+    <variable access="private">QLabel *mProgressText;</variable>
 </variables>
 <slots>
@@ -567,13 +583,14 @@
     <slot access="protected">reject()</slot>
     <slot access="protected">mouseOnItem( QListViewItem *item )</slot>
-    <slot access="protected">addDroppedImages( QDropEvent* )</slot>
 </slots>
 <functions>
     <function access="private">init()</function>
+    <function access="private">loadListViews()</function>
     <function access="private" returnType="int">result()</function>
     <function access="private">setResult( int )</function>
     <function returnType="int">exec()</function>
     <function access="private">done( int )</function>
-    <function access="private">insertMedia( const VBoxMedia &amp; media )</function>
+    <function access="private">updateMedia( const VBoxMedia &amp; media )</function>
+    <function access="private" returnType="DiskImageItem*">searchItem( QListView*, QUuid )</function>
     <function specifier="non virtual" access="private" returnType="QString">static getDVDImageUsage( const QUuid &amp; id )</function>
     <function specifier="non virtual" access="private" returnType="QString">static getFloppyImageUsage( const QUuid &amp; id )</function>
@@ -585,10 +602,11 @@
     <function access="private" returnType="QListView*">getCurrentListView()</function>
     <function returnType="bool">eventFilter( QObject *, QEvent * )</function>
-    <function access="private">addDroppedImage( QString aSource, VBoxDefs::DiskType aDiskType )</function>
+    <function access="private">addDroppedImages( QStringList* )</function>
+    <function access="private" returnType="DiskImageItem*">addImageToList( QString aSource, VBoxDefs::DiskType aDiskType )</function>
     <function access="private" returnType="DiskImageItem*">createImageNode( QListView *aList, DiskImageItem *aRoot, QString aName, QString aLabel1 = QString::null, QString aLabel2 = QString::null, QString aLabel3 = QString::null, QString aLabel4 = QString::null, QString aLabel5 = QString::null, QString aLabel6 = QString::null, QString aLabel7 = QString::null )</function>
-    <function access="private" returnType="DiskImageItem*">createHdItem( QListView*, DiskImageItem*, CHardDisk &amp; )</function>
-    <function access="private" returnType="DiskImageItem*">createCdItem( QListView*, DiskImageItem*, CDVDImage &amp; )</function>
-    <function access="private" returnType="DiskImageItem*">createFdItem( QListView*, DiskImageItem*, CFloppyImage &amp; )</function>
-    <function access="private">createHdChildren( DiskImageItem*, CHardDisk &amp; )</function>
+    <function access="private" returnType="DiskImageItem*">createHdItem( QListView*, DiskImageItem*, CHardDisk &amp;, VBoxMedia::Status )</function>
+    <function access="private" returnType="DiskImageItem*">createCdItem( QListView*, DiskImageItem*, CDVDImage &amp;, VBoxMedia::Status )</function>
+    <function access="private" returnType="DiskImageItem*">createFdItem( QListView*, DiskImageItem*, CFloppyImage &amp;, VBoxMedia::Status )</function>
+    <function access="private">createHdChildren( DiskImageItem*, CHardDisk &amp;, VBoxMedia::Status )</function>
     <function access="protected">showEvent( QShowEvent * )</function>
     <function access="protected">resizeEvent( QResizeEvent* )</function>
@@ -597,11 +615,10 @@
     <function access="protected" returnType="QIRichLabel*">createInfoString( QString, QWidget*, int, int )</function>
     <function access="protected" returnType="QPushButton*">searchDefaultButton()</function>
-    <function access="protected">setCurrentItem( QListView*, DiskImageItem* )</function>
-    <function>uploadCurrentList( QStringList&amp;, QStringList&amp;, const QUuid&amp; )</function>
+    <function access="protected">setCurrentItem( QListView*, QListViewItem* )</function>
     <function specifier="non virtual">static showModeless( const VBoxMediaList * = NULL )</function>
-    <function access="protected">refreshList( QListView*, ProgressBarItem*&amp; )</function>
-    <function specifier="non virtual" returnType="QString">static composeHdToolTip( CHardDisk &amp; )</function>
-    <function specifier="non virtual" returnType="QString">static composeCdToolTip( CDVDImage &amp; )</function>
-    <function specifier="non virtual" returnType="QString">static composeFdToolTip( CFloppyImage &amp; )</function>
+    <function specifier="non virtual" returnType="QString">static composeHdToolTip( CHardDisk &amp;, VBoxMedia::Status = VBoxMedia::Ok )</function>
+    <function specifier="non virtual" returnType="QString">static composeCdToolTip( CDVDImage &amp;, VBoxMedia::Status = VBoxMedia::Ok )</function>
+    <function specifier="non virtual" returnType="QString">static composeFdToolTip( CFloppyImage &amp;, VBoxMedia::Status = VBoxMedia::Ok )</function>
+    <function access="protected">prepareToRefresh()</function>
 </functions>
 <layoutdefaults spacing="10" margin="10"/>
Index: /trunk/src/VBox/Frontends/VirtualBox/ui/VBoxDiskImageManagerDlg.ui.h
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/ui/VBoxDiskImageManagerDlg.ui.h	(revision 252)
+++ /trunk/src/VBox/Frontends/VirtualBox/ui/VBoxDiskImageManagerDlg.ui.h	(revision 253)
@@ -44,5 +44,6 @@
                    QString aLabel8 = QString::null) :
         QListViewItem (parent, aLabel1, aLabel2, aLabel3, aLabel4, aLabel5,
-                       aLabel6, aLabel7, aLabel8), mName (aLabel1) {}
+                       aLabel6, aLabel7, aLabel8),
+        mName (aLabel1), mStatus (VBoxMedia::Unknown) {}
 
     DiskImageItem (QListView *parent, QString aLabel1,
@@ -55,5 +56,6 @@
                    QString aLabel8 = QString::null) :
         QListViewItem (parent, aLabel1, aLabel2, aLabel3, aLabel4, aLabel5,
-                       aLabel6, aLabel7, aLabel8), mName (aLabel1) {}
+                       aLabel6, aLabel7, aLabel8),
+        mName (aLabel1), mStatus (VBoxMedia::Unknown) {}
 
     QString getName() { return mName; }
@@ -86,4 +88,8 @@
     void setMachineId (QString aMachineId) { mMachineId = aMachineId; }
     const QString &getMachineId() { return mMachineId; }
+
+
+    void setStatus (VBoxMedia::Status aStatus) { mStatus = aStatus; }
+    VBoxMedia::Status getStatus() { return mStatus; }
 
 
@@ -106,7 +112,4 @@
     int compare (QListViewItem *aItem, int aColumn, bool aAscending) const
     {
-        if (aItem->rtti() == 1002)
-            return aAscending ? 1 : -1;
-
         ULONG64 thisValue = vboxGlobal().parseSize (       text (aColumn));
         ULONG64 thatValue = vboxGlobal().parseSize (aItem->text (aColumn));
@@ -127,4 +130,13 @@
                 QListViewItem::nextSibling()->rtti() == 1001) ?
                 static_cast<DiskImageItem*> (QListViewItem::nextSibling()) : 0;
+    }
+
+    void paintCell (QPainter *aPainter, const QColorGroup &aColorGroup,
+                    int aColumn, int aWidth, int aSlign)
+    {
+        QColorGroup cGroup (aColorGroup);
+        if (mStatus == VBoxMedia::Unknown)
+            cGroup.setColor (QColorGroup::Text, cGroup.mid());
+        QListViewItem::paintCell (aPainter, cGroup, aColumn, aWidth, aSlign);
     }
 
@@ -144,45 +156,6 @@
 
     QString mToolTip;
-};
-
-
-class ProgressBarItem : public QListViewItem, public QProgressBar
-{
-public:
-
-    ProgressBarItem (QListView *aParent, ULONG aTotalSteps) :
-        QListViewItem (aParent)
-    {
-        setFrameShadow (Sunken);
-        setFrameShape (Panel);
-        setSelectable (false);
-        setProgress (0, aTotalSteps);
-        setPercentageVisible (false);
-    }
-
-    void paintCell (QPainter *p, const QColorGroup &cg,
-                    int column, int width, int align)
-    {
-        setMaximumWidth (100);
-        setFixedHeight (QListViewItem::height());
-        QListViewItem::paintCell (p, cg, column, width, align);
-        if (column == 0)
-        {
-            drawContents (p);
-            drawFrame (p);
-        }
-    }
-
-    void increaseProgress() { setProgress (progress() + 1); }
-
-    int rtti() const { return 1002; }
-
-    int compare (QListViewItem *aItem, int /*aColumn*/, bool aAscending) const
-    {
-        if (aItem->rtti() == 1001)
-            return aAscending ? -1 : 1;
-        else
-            return 0;
-    }
+
+    VBoxMedia::Status mStatus;
 };
 
@@ -206,6 +179,6 @@
         /// @todo refreshAll() may be slow, so it may be better to analyze
         //  event details and update only what is changed */
-        connect (&vboxGlobal(), SIGNAL (machineDataChanged (const VBoxMachineDataChangeEvent &)),
-                 mModelessDialog, SLOT (refreshAll()));
+        //connect (&vboxGlobal(), SIGNAL (machineDataChanged (const VBoxMachineDataChangeEvent &)),
+        //         mModelessDialog, SLOT (refreshAll()));
         connect (&vboxGlobal(), SIGNAL (machineRegistered (const VBoxMachineRegisteredEvent &)),
                  mModelessDialog, SLOT (refreshAll()));
@@ -223,5 +196,4 @@
                                      ~WindowMinimized);
     mModelessDialog->setActiveWindow();
-
 }
 
@@ -233,8 +205,4 @@
     mToBeRefreshed = false;
     mInLoop = false;
-
-    mHdsProgress = 0;
-    mCdsProgress = 0;
-    mFdsProgress = 0;
 
     defaultButton = searchDefaultButton();
@@ -273,9 +241,4 @@
 
     /* setup image list views */
-
-    hdsView->setShowSortIndicator (true);
-    cdsView->setShowSortIndicator (true);
-    fdsView->setShowSortIndicator (true);
-
     hdsView->setColumnAlignment (1, Qt::AlignRight);
     hdsView->setColumnAlignment (2, Qt::AlignRight);
@@ -290,4 +253,5 @@
     cdsView->header()->setStretchEnabled (false);
     cdsView->header()->setStretchEnabled (true, 0);
+
 
     /* setup list-view's item tooltip */
@@ -302,17 +266,8 @@
              this, SLOT (mouseOnItem(QListViewItem*)));
 
-    /* setup dnd handlers */
-    hdsView->viewport()->setAcceptDrops (true);
-    cdsView->viewport()->setAcceptDrops (true);
-    fdsView->viewport()->setAcceptDrops (true);
-    connect (hdsView, SIGNAL (dropped (QDropEvent *)),
-             this, SLOT (addDroppedImages (QDropEvent*)));
-    connect (cdsView, SIGNAL (dropped (QDropEvent*)),
-             this, SLOT (addDroppedImages (QDropEvent*)));
-    connect (fdsView, SIGNAL (dropped (QDropEvent*)),
-             this, SLOT (addDroppedImages (QDropEvent*)));
 
     /* status-bar currently disabled */
     statusBar()->setHidden (true);
+
 
     /* context menu composing */
@@ -435,4 +390,48 @@
     fdsPane1 = createInfoString (tr ("Location"), fdsContainer, 0, -1);
     fdsPane2 = createInfoString (tr ("Attached to"), fdsContainer, 1, -1);
+
+
+    /* enumeration progressbar creation */
+    mProgressText = new QLabel (tr ("Checking accessibility"), centralWidget());
+    mProgressText->setHidden (true);
+    buttonLayout->insertWidget (2, mProgressText);
+    mProgressBar = new QProgressBar (centralWidget());
+    mProgressBar->setHidden (true);
+    mProgressBar->setFrameShadow (QFrame::Sunken);
+    mProgressBar->setFrameShape  (QFrame::Panel);
+    mProgressBar->setPercentageVisible (false);
+    mProgressBar->setMaximumWidth (100);
+    buttonLayout->insertWidget (3, mProgressBar);
+
+    if (!vboxGlobal().isInEnumeratingProcess()) loadListViews();
+}
+
+
+void VBoxDiskImageManagerDlg::loadListViews()
+{
+    /* load hd list */
+    CHardDiskEnumerator hdEnum = vbox.GetHardDisks().Enumerate();
+    while (hdEnum.HasMore())
+    {
+        CHardDisk hd = hdEnum.GetNext();
+        DiskImageItem *item = createHdItem (hdsView, 0, hd, VBoxMedia::Unknown);
+        createHdChildren (item, hd, VBoxMedia::Unknown);
+    }
+
+    /* load cd list */
+    CDVDImageEnumerator cdEnum = vbox.GetDVDImages().Enumerate();
+    while (cdEnum.HasMore())
+    {
+        CDVDImage cd = cdEnum.GetNext();
+        DiskImageItem *item = createCdItem (cdsView, 0, cd, VBoxMedia::Unknown);
+    }
+
+    /* load fd list */
+    CFloppyImageEnumerator fdEnum = vbox.GetFloppyImages().Enumerate();
+    while (fdEnum.HasMore())
+    {
+        CFloppyImage fd = fdEnum.GetNext();
+        DiskImageItem *item = createFdItem (fdsView, 0, fd, VBoxMedia::Unknown);
+    }
 }
 
@@ -504,7 +503,4 @@
         case 1001:
             tip = static_cast<DiskImageItem*> (aItem)->getToolTip();
-            break;
-        case 1002:
-            tip = tr ("Enumeration in progress...", "Media accessibility check");
             break;
         default:
@@ -624,5 +620,33 @@
                 QDragEnterEvent *dragEnterEvent =
                     static_cast<QDragEnterEvent*>(aEvent);
-                dragEnterEvent->accept();
+                dragEnterEvent->acceptAction();
+                return true;
+            }
+            break;
+        }
+        case QEvent::Drop:
+        {
+            if (aObject == currentList)
+            {
+                QDropEvent *dropEvent =
+                    static_cast<QDropEvent*>(aEvent);
+                QStringList *droppedList = new QStringList();
+                QUriDrag::decodeLocalFiles (dropEvent, *droppedList);
+                QCustomEvent *updateEvent = new QCustomEvent (1001);
+                updateEvent->setData (droppedList);
+                QApplication::postEvent (currentList, updateEvent);
+                dropEvent->acceptAction();
+                return true;
+            }
+            break;
+        }
+        case 1001: /* QCustomEvent 1001 - DnD Update Event */
+        {
+            if (aObject == currentList)
+            {
+                QCustomEvent *updateEvent =
+                    static_cast<QCustomEvent*>(aEvent);
+                addDroppedImages ((QStringList*) updateEvent->data());
+                return true;
             }
             break;
@@ -655,13 +679,11 @@
 
 
-void VBoxDiskImageManagerDlg::addDroppedImages (QDropEvent *aEvent)
+void VBoxDiskImageManagerDlg::addDroppedImages (QStringList *aDroppedList)
 {
     QListView *currentList = getCurrentListView();
 
-    QStringList droppedList;
-    QUriDrag::decodeLocalFiles (aEvent, droppedList);
-
-    for (QStringList::Iterator it = droppedList.begin();
-         it != droppedList.end(); ++it)
+    DiskImageItem *item = 0;
+    for (QStringList::Iterator it = (*aDroppedList).begin();
+         it != (*aDroppedList).end(); ++it)
     {
         // Checking dropped media type
@@ -680,17 +702,17 @@
         }
         // If media type has been determined - attach this device
-        if (type)
-            addDroppedImage (*it, type);
-    }
-
-    refreshAll();
-}
-
-
-void VBoxDiskImageManagerDlg::addDroppedImage (QString aSource, VBoxDefs::DiskType aDiskType)
+        if (type) item = addImageToList (*it, type);
+    }
+    delete aDroppedList;
+    setCurrentItem (currentList, item);
+}
+
+
+DiskImageItem* VBoxDiskImageManagerDlg::addImageToList (QString aSource, VBoxDefs::DiskType aDiskType)
 {
     if (aSource.isEmpty())
-        return;
-
+        return 0;
+
+    DiskImageItem *item = 0;
     QUuid uuid;
     switch (aDiskType)
@@ -703,4 +725,14 @@
                 CHardDisk hardDisk = CUnknown (vdi);
                 vbox.RegisterHardDisk (hardDisk);
+                if (vbox.isOk())
+                {
+                    VBoxMedia::Status status = hardDisk.GetAccessible() ?
+                        VBoxMedia::Ok : VBoxMedia::Inaccessible;
+                    item = createHdItem (hdsView, 0, hardDisk, status);
+                    /* synchronize modeless dialog if present */
+                    if (mModelessDialog && mModelessDialog != this)
+                        mModelessDialog->createHdItem (mModelessDialog->hdsView,
+                                                       0, hardDisk, status);
+                }
             }
             break;
@@ -710,5 +742,17 @@
             CDVDImage dvdImage = vbox.OpenDVDImage (aSource, uuid);
             if (vbox.isOk())
+            {
                 vbox.RegisterDVDImage (dvdImage);
+                if (vbox.isOk())
+                {
+                    VBoxMedia::Status status = dvdImage.GetAccessible() ?
+                        VBoxMedia::Ok : VBoxMedia::Inaccessible;
+                    item = createCdItem (cdsView, 0, dvdImage, status);
+                    /* synchronize modeless dialog if present */
+                    if (mModelessDialog && mModelessDialog != this)
+                        mModelessDialog->createCdItem (mModelessDialog->cdsView,
+                                                       0, dvdImage, status);
+                }
+            }
             break;
         }
@@ -717,5 +761,17 @@
             CFloppyImage floppyImage = vbox.OpenFloppyImage (aSource, uuid);
             if (vbox.isOk())
+            {
                 vbox.RegisterFloppyImage (floppyImage);
+                if (vbox.isOk())
+                {
+                    VBoxMedia::Status status = floppyImage.GetAccessible() ?
+                        VBoxMedia::Ok : VBoxMedia::Inaccessible;
+                    item = createFdItem (fdsView, 0, floppyImage, status);
+                    /* synchronize modeless dialog if present */
+                    if (mModelessDialog && mModelessDialog != this)
+                        mModelessDialog->createFdItem (mModelessDialog->fdsView,
+                                                       0, floppyImage, status);
+                }
+            }
             break;
         }
@@ -725,4 +781,5 @@
         }
     }
+    return item;
 }
 
@@ -838,8 +895,8 @@
 
 
-QString VBoxDiskImageManagerDlg::composeHdToolTip (CHardDisk &aHd)
+QString VBoxDiskImageManagerDlg::composeHdToolTip (CHardDisk &aHd,
+                                                   VBoxMedia::Status aStatus)
 {
     CVirtualBox vbox = vboxGlobal().virtualBox();
-    bool accessible = aHd.GetAccessible();
     QUuid machineId = aHd.GetMachineId();
 
@@ -867,30 +924,55 @@
     /* compose tool-tip information */
     QString tip;
-    if (!accessible)
-    {
-        tip = tr ("<nobr><b>%1</b></nobr><br>%2")
-                  .arg (location)
-                  .arg (aHd.GetLastAccessError());
-    }
-    else
-    {
-        tip = tr ("<nobr><b>%1</b></nobr><br>"
-                  "<nobr>Disk type:&nbsp;&nbsp;%2</nobr><br>"
-                  "<nobr>Storage type:&nbsp;&nbsp;%3</nobr>")
-                  .arg (location)
-                  .arg (hardDiskType)
-                  .arg (storageType);
-
-        if (!usage.isNull())
-            tip += tr ("<br><nobr>Attached to:&nbsp;&nbsp;%1</nobr>").arg (usage);
-        if (!snapshotName.isNull())
-            tip += tr ("<br><nobr>Snapshot:&nbsp;&nbsp;%5</nobr>").arg (snapshotName);
+    switch (aStatus)
+    {
+        case VBoxMedia::Unknown:
+        {
+            tip = tr ("<nobr><b>%1</b></nobr><br>"
+                      "Checking accessibility...", "HDD")
+                      .arg (location);
+            break;
+        }
+        case VBoxMedia::Ok:
+        {
+            tip = tr ("<nobr><b>%1</b></nobr><br>"
+                      "<nobr>Disk type:&nbsp;&nbsp;%2</nobr><br>"
+                      "<nobr>Storage type:&nbsp;&nbsp;%3</nobr>")
+                      .arg (location)
+                      .arg (hardDiskType)
+                      .arg (storageType);
+
+            if (!usage.isNull())
+                tip += tr ("<br><nobr>Attached to:&nbsp;&nbsp;%1</nobr>", "HDD")
+                           .arg (usage);
+            if (!snapshotName.isNull())
+                tip += tr ("<br><nobr>Snapshot:&nbsp;&nbsp;%5</nobr>", "HDD")
+                           .arg (snapshotName);
+            break;
+        }
+        case VBoxMedia::Error:
+        {
+            /// @todo (r=dmik) paass a complete VBoxMedia instance here
+            //  to get the result of blabla.GetAccessible() call form CUnknown
+            tip = tr ("<nobr><b>%1</b></nobr><br>"
+                      "Error checking media accessibility", "HDD")
+                      .arg (location);
+            break;
+        }
+        case VBoxMedia::Inaccessible:
+        {
+            tip = tr ("<nobr><b>%1</b></nobr><br>%2", "HDD")
+                      .arg (location)
+                      .arg (aHd.GetLastAccessError());
+            break;
+        }
+        default:
+            AssertFailed();
     }
     return tip;
 }
 
-QString VBoxDiskImageManagerDlg::composeCdToolTip (CDVDImage &aCd)
-{
-    bool accessible = aCd.GetAccessible();
+QString VBoxDiskImageManagerDlg::composeCdToolTip (CDVDImage &aCd,
+                                                   VBoxMedia::Status aStatus)
+{
     QString src = aCd.GetFilePath();
     QFileInfo fi (src);
@@ -901,27 +983,52 @@
     /* compose tool-tip information */
     QString tip;
-    if (!accessible)
-    {
-        /// @todo (r=dmik) correct this when GetLastAccessError() is
-        //  implemented for IFloppyImage/IDVDImage
-        tip = tr ("<nobr><b>%1</b></nobr><br>%2")
-                  .arg (location)
-                  .arg (tr ("The image file is not accessible",
-                            "CD/DVD/Floppy"));
-    }
-    else
-    {
-        tip = tr ("<nobr><b>%1</b></nobr>")
-                  .arg (location);
-
-        if (!usage.isNull())
-            tip += tr ("<br><nobr>Attached to:&nbsp;&nbsp;%1</nobr>").arg (usage);
+    switch (aStatus)
+    {
+        case VBoxMedia::Unknown:
+        {
+            tip = tr ("<nobr><b>%1</b></nobr><br>"
+                      "Checking accessibility...", "CD/DVD/Floppy")
+                      .arg (location);
+            break;
+        }
+        case VBoxMedia::Ok:
+        {
+            tip = tr ("<nobr><b>%1</b></nobr>", "CD/DVD/Floppy")
+                      .arg (location);
+
+            if (!usage.isNull())
+                tip += tr ("<br><nobr>Attached to:&nbsp;&nbsp;%1</nobr>",
+                           "CD/DVD/Floppy")
+                           .arg (usage);
+            break;
+        }
+        case VBoxMedia::Error:
+        {
+            /// @todo (r=dmik) paass a complete VBoxMedia instance here
+            //  to get the result of blabla.GetAccessible() call form CUnknown
+            tip = tr ("<nobr><b>%1</b></nobr><br>"
+                      "Error checking media accessibility", "CD/DVD/Floppy")
+                      .arg (location);
+            break;
+        }
+        case VBoxMedia::Inaccessible:
+        {
+            /// @todo (r=dmik) correct this when GetLastAccessError() is
+            //  implemented for IDVDImage
+            tip = tr ("<nobr><b>%1</b></nobr><br>%2")
+                      .arg (location)
+                      .arg (tr ("The image file is not accessible",
+                                "CD/DVD/Floppy"));
+            break;
+        }
+        default:
+            AssertFailed();
     }
     return tip;
 }
 
-QString VBoxDiskImageManagerDlg::composeFdToolTip (CFloppyImage &aFd)
-{
-    bool accessible = aFd.GetAccessible();
+QString VBoxDiskImageManagerDlg::composeFdToolTip (CFloppyImage &aFd,
+                                                   VBoxMedia::Status aStatus)
+{
     QString src = aFd.GetFilePath();
     QFileInfo fi (src);
@@ -931,21 +1038,47 @@
 
     /* compose tool-tip information */
+    /* compose tool-tip information */
     QString tip;
-    if (!accessible)
-    {
-        /// @todo (r=dmik) correct this when GetLastAccessError() is
-        //  implemented for IFloppyImage/IDVDImage
-        tip = tr ("<nobr><b>%1</b></nobr><br>%2")
-                  .arg (location)
-                  .arg (tr ("The image file is not accessible",
-                            "CD/DVD/Floppy"));
-    }
-    else
-    {
-        tip = tr ("<nobr><b>%1</b></nobr>")
+    switch (aStatus)
+    {
+        case VBoxMedia::Unknown:
+        {
+            tip = tr ("<nobr><b>%1</b></nobr><br>"
+                      "Checking accessibility...", "CD/DVD/Floppy")
                       .arg (location);
-
-        if (!usage.isNull())
-            tip += tr ("<br><nobr>Attached to:&nbsp;&nbsp;%1</nobr>").arg (usage);
+            break;
+        }
+        case VBoxMedia::Ok:
+        {
+            tip = tr ("<nobr><b>%1</b></nobr>", "CD/DVD/Floppy")
+                      .arg (location);
+
+            if (!usage.isNull())
+                tip += tr ("<br><nobr>Attached to:&nbsp;&nbsp;%1</nobr>",
+                           "CD/DVD/Floppy")
+                           .arg (usage);
+            break;
+        }
+        case VBoxMedia::Error:
+        {
+            /// @todo (r=dmik) paass a complete VBoxMedia instance here
+            //  to get the result of blabla.GetAccessible() call form CUnknown
+            tip = tr ("<nobr><b>%1</b></nobr><br>"
+                      "Error checking media accessibility", "CD/DVD/Floppy")
+                      .arg (location);
+            break;
+        }
+        case VBoxMedia::Inaccessible:
+        {
+            /// @todo (r=dmik) correct this when GetLastAccessError() is
+            //  implemented for IDVDImage
+            tip = tr ("<nobr><b>%1</b></nobr><br>%2")
+                      .arg (location)
+                      .arg (tr ("The image file is not accessible",
+                                "CD/DVD/Floppy"));
+            break;
+        }
+        default:
+            AssertFailed();
     }
     return tip;
@@ -955,5 +1088,6 @@
 DiskImageItem* VBoxDiskImageManagerDlg::createHdItem (QListView *aList,
                                                       DiskImageItem *aRoot,
-                                                      CHardDisk &aHd)
+                                                      CHardDisk &aHd,
+                                                      VBoxMedia::Status aStatus)
 {
     DiskImageItem *item = 0;
@@ -962,5 +1096,4 @@
     QString src = aHd.GetLocation();
     QUuid machineId = aHd.GetMachineId();
-    bool accessible = aHd.GetAccessible();
 
     QString usage;
@@ -969,7 +1102,7 @@
     QString storageType = vboxGlobal().toString (aHd.GetStorageType());
     QString hardDiskType = vboxGlobal().hardDiskTypeString (aHd);
-    QString virtualSize = accessible ?
-        vboxGlobal().formatSize (aHd.GetSize() * _1M) : QString ("--");
-    QString actualSize = accessible ?
+    QString virtualSize = aStatus == VBoxMedia::Ok ?
+        vboxGlobal().formatSize ((ULONG64)aHd.GetSize() * _1M) : QString ("--");
+    QString actualSize = aStatus == VBoxMedia::Ok ?
         vboxGlobal().formatSize (aHd.GetActualSize()) : QString ("--");
     QString snapshotName;
@@ -983,10 +1116,8 @@
     QFileInfo fi (src);
 
-    item = createImageNode (
-        aList, aRoot,
-        fi.fileName(),
-        virtualSize,
-        actualSize
-    );
+    item = createImageNode (aList, aRoot,
+                            fi.fileName(),
+                            virtualSize,
+                            actualSize);
     item->setPath (aHd.GetStorageType() == CEnums::ISCSIHardDisk ? src :
                    QDir::convertSeparators (fi.absFilePath()));
@@ -999,5 +1130,6 @@
     item->setUuid (uuid);
     item->setMachineId (machineId);
-    item->setToolTip (composeHdToolTip (aHd));
+    item->setToolTip (composeHdToolTip (aHd, aStatus));
+    item->setStatus (aStatus);
 
     return item;
@@ -1007,5 +1139,6 @@
 DiskImageItem* VBoxDiskImageManagerDlg::createCdItem (QListView *aList,
                                                       DiskImageItem *aRoot,
-                                                      CDVDImage &aCd)
+                                                      CDVDImage &aCd,
+                                                      VBoxMedia::Status aStatus)
 {
     DiskImageItem *item = 0;
@@ -1014,7 +1147,6 @@
     QString src = aCd.GetFilePath();
     QString usage = getDVDImageUsage (uuid);
-    bool accessible = aCd.GetAccessible();
-
-    QString size = accessible ?
+
+    QString size = aStatus == VBoxMedia::Ok ?
         vboxGlobal().formatSize (aCd.GetSize()) : QString ("--");
     QFileInfo fi (src);
@@ -1027,5 +1159,6 @@
     item->setActualSize (size);
     item->setUuid (uuid);
-    item->setToolTip (composeCdToolTip (aCd));
+    item->setToolTip (composeCdToolTip (aCd, aStatus));
+    item->setStatus (aStatus);
 
     return item;
@@ -1035,5 +1168,6 @@
 DiskImageItem* VBoxDiskImageManagerDlg::createFdItem (QListView *aList,
                                                       DiskImageItem *aRoot,
-                                                      CFloppyImage &aFd)
+                                                      CFloppyImage &aFd,
+                                                      VBoxMedia::Status aStatus)
 {
     DiskImageItem *item = 0;
@@ -1042,7 +1176,6 @@
     QString src = aFd.GetFilePath();
     QString usage = getFloppyImageUsage (uuid);
-    bool accessible = aFd.GetAccessible();
-
-    QString size = accessible ?
+
+    QString size = aStatus == VBoxMedia::Ok ?
         vboxGlobal().formatSize (aFd.GetSize()) : QString ("--");
     QFileInfo fi (src);
@@ -1055,5 +1188,6 @@
     item->setActualSize (size);
     item->setUuid (uuid);
-    item->setToolTip (composeFdToolTip (aFd));
+    item->setToolTip (composeFdToolTip (aFd, aStatus));
+    item->setStatus (aStatus);
 
     return item;
@@ -1062,5 +1196,6 @@
 
 void VBoxDiskImageManagerDlg::createHdChildren (DiskImageItem *aRoot,
-                                                CHardDisk &aHd)
+                                                CHardDisk &aHd,
+                                                VBoxMedia::Status aStatus)
 {
     CHardDiskEnumerator enumerator = aHd.GetChildren().Enumerate();
@@ -1068,44 +1203,58 @@
     {
         CHardDisk subHd = enumerator.GetNext();
-        DiskImageItem *subItem = createHdItem (0, aRoot, subHd);
-        createHdChildren (subItem, subHd);
-    }
-}
-
-
-void VBoxDiskImageManagerDlg::insertMedia (const VBoxMedia &aMedia)
-{
-    /* ignore non-interesting aMedia */
+        DiskImageItem *subItem = createHdItem (0, aRoot, subHd, aStatus);
+        createHdChildren (subItem, subHd, aStatus);
+    }
+}
+
+
+DiskImageItem* VBoxDiskImageManagerDlg::searchItem (QListView *aList, QUuid aId)
+{
+    DiskImageItem *item = 0, *iterator = 0;
+    if (aList->firstChild() && aList->firstChild()->rtti() == 1001)
+        iterator = static_cast<DiskImageItem*>(aList->firstChild());
+    while (iterator)
+    {
+        if (iterator->getUuid() == aId)
+            item = iterator;
+        iterator = iterator->nextSibling();
+    }
+    return item;
+}
+
+
+void VBoxDiskImageManagerDlg::updateMedia (const VBoxMedia &aMedia)
+{
+    /* ignore non-updated aMedia */
     if (!(type & aMedia.type))
         return;
 
+    /* search for updated listview item */
     DiskImageItem *item = 0;
-
     switch (aMedia.type)
     {
         case VBoxDefs::HD:
         {
-            refreshList (hdsView, mHdsProgress);
             CHardDisk hd = aMedia.disk;
-            item = createHdItem (hdsView, 0, hd);
-            createHdChildren (item, hd);
-            hdsView->adjustColumn (1);
-            hdsView->adjustColumn (2);
+            item = searchItem (hdsView, hd.GetId());
+            delete item;
+            item = createHdItem (hdsView, 0, hd, aMedia.status);
+            createHdChildren (item, hd, aMedia.status);
             break;
         }
         case VBoxDefs::CD:
         {
-            refreshList (cdsView, mCdsProgress);
             CDVDImage cd = aMedia.disk;
-            item = createCdItem (cdsView, 0, cd);
-            cdsView->adjustColumn (1);
+            item = searchItem (cdsView, cd.GetId());
+            delete item;
+            item = createCdItem (cdsView, 0, cd, aMedia.status);
             break;
         }
         case VBoxDefs::FD:
         {
-            refreshList (fdsView, mFdsProgress);
             CFloppyImage fd = aMedia.disk;
-            item = createFdItem (fdsView, 0, fd);
-            fdsView->adjustColumn (1);
+            item = searchItem (fdsView, fd.GetId());
+            delete item;
+            item = createFdItem (fdsView, 0, fd, aMedia.status);
             break;
         }
@@ -1121,4 +1270,6 @@
     else if (aMedia.status == VBoxMedia::Error)
         item->setPixmap (0, pxErroneous);
+
+    mProgressBar->setProgress (mProgressBar->progress() + 1);
 }
 
@@ -1160,13 +1311,18 @@
 
     VBoxMediaList::const_iterator it;
+    prepareToRefresh();
     for (it = list.begin(); it != list.end(); ++ it)
-        insertMedia (*it);
-
-    if (!mediaList)
+        updateMedia (*it);
+
+    if (mediaList)
+    {
+        mediaEnumerated (*mediaList);
+    }
+    else
     {
         /* only start enumerating media if we haven't been supplied with a list
          * (it's ok if the enumeration has been already started, nothing will
          * happen) */
-        refreshAll();
+        vboxGlobal().startEnumeratingMedia();
     }
 }
@@ -1176,6 +1332,6 @@
 {
     if (!mToBeRefreshed) return;
-
-    insertMedia (aMedia);
+    updateMedia (aMedia);
+    processCurrentChanged();
 }
 
@@ -1185,14 +1341,6 @@
     if (!mToBeRefreshed) return;
 
-    delete mHdsProgress, delete mCdsProgress, delete mFdsProgress;
-    mHdsProgress = 0, mCdsProgress = 0, mFdsProgress = 0;
-
-    cdsView->setCurrentItem (cdsView->firstChild());
-    fdsView->setCurrentItem (fdsView->firstChild());
-    hdsView->setCurrentItem (hdsView->firstChild());
-    cdsView->setSelected (cdsView->currentItem(), true);
-    fdsView->setSelected (fdsView->currentItem(), true);
-    hdsView->setSelected (hdsView->currentItem(), true);
-    processCurrentChanged();
+    mProgressBar->setHidden (true);
+    mProgressText->setHidden (true);
 
     imRefreshAction->setEnabled (true);
@@ -1226,5 +1374,5 @@
 
 
-void VBoxDiskImageManagerDlg::refreshAll()
+void VBoxDiskImageManagerDlg::prepareToRefresh()
 {
     if (mToBeRefreshed) return;
@@ -1238,26 +1386,34 @@
     fdsPane1->clear(), fdsPane2->clear();
 
+    /* prepare progressbar */
+    if (mProgressBar)
+    {
+        int totalSteps = 0;
+        if (type & VBoxDefs::HD)
+            totalSteps += vbox.GetHardDisks().GetCount();
+        if (type & VBoxDefs::CD)
+            totalSteps += vbox.GetDVDImages().GetCount();
+        if (type & VBoxDefs::FD)
+            totalSteps += vbox.GetFloppyImages().GetCount();
+        mProgressBar->setProgress (0, totalSteps);
+        mProgressBar->setHidden (false);
+        mProgressText->setHidden (false);
+    }
+
     imRefreshAction->setEnabled (false);
     setCursor (QCursor (BusyCursor));
-
+}
+
+
+void VBoxDiskImageManagerDlg::refreshAll()
+{
+    if (mToBeRefreshed) return;
+    prepareToRefresh();
+    /* lists clearing */
+    hdsView->clear(), cdsView->clear(), fdsView->clear();
+    /* load all lists */
+    loadListViews();
     /* start enumerating media */
     vboxGlobal().startEnumeratingMedia();
-}
-
-void VBoxDiskImageManagerDlg::refreshList (QListView *aView, ProgressBarItem *&aItem)
-{
-    if (!aItem)
-    {
-        aView->clear();
-        ULONG iCount = 0;
-        if (aView == hdsView)
-            iCount = vbox.GetHardDisks().GetCount();
-        else if (aView == cdsView)
-            iCount = vbox.GetDVDImages().GetCount();
-        else if (aView == fdsView)
-            iCount = vbox.GetFloppyImages().GetCount();
-        aItem = new ProgressBarItem (aView, iCount);
-    }
-    aItem->increaseProgress();
 }
 
@@ -1323,14 +1479,16 @@
 
 
-void VBoxDiskImageManagerDlg::setCurrentItem (QListView *aListView, DiskImageItem *aItem)
-{
+void VBoxDiskImageManagerDlg::setCurrentItem (QListView *aListView, QListViewItem *aItem)
+{
+    aListView->setFocus();
     if (aItem)
     {
         aListView->setCurrentItem (aItem);
         aListView->setSelected (aListView->currentItem(), true);
+        /* it is strange repeat but it works */
         aListView->adjustColumn (1);
         aListView->adjustColumn (2);
-    }
-    aListView->setFocus();
+        aListView->adjustColumn (1);
+    }
     processCurrentChanged (aListView->currentItem());
 }
@@ -1341,4 +1499,9 @@
     QListView *currentList = getCurrentListView();
     currentList->setFocus();
+
+    QListViewItem *itemToSelect =
+        !currentList->isSelected (currentList->currentItem()) ?
+        currentList->firstChild() : currentList->currentItem();
+    setCurrentItem (currentList, itemToSelect);
 
     /* tab stop setup */
@@ -1360,6 +1523,4 @@
     setTabOrder (buttonHelp, buttonOk);
     setTabOrder (buttonOk, twImages);
-
-    processCurrentChanged (currentList->selectedItem());
 }
 
@@ -1440,9 +1601,12 @@
     {
         CHardDisk hd = dlg.hardDisk();
-        DiskImageItem *createdItem = createHdItem (hdsView, 0, hd);
+        VBoxMedia::Status status = hd.GetAccessible() ?
+            VBoxMedia::Ok : VBoxMedia::Inaccessible;
+        DiskImageItem *createdItem = createHdItem (hdsView, 0, hd, status);
         setCurrentItem (hdsView, createdItem);
         /* synchronize modeless dialog if present */
         if (mModelessDialog && mModelessDialog != this)
-            mModelessDialog->createHdItem (mModelessDialog->hdsView, 0, hd);
+            mModelessDialog->createHdItem (mModelessDialog->hdsView,
+                                           0, hd, status);
     }
 }
@@ -1457,5 +1621,5 @@
 
     QString dir;
-    if (item)
+    if (item && item->getStatus() == VBoxMedia::Ok)
         dir = item->getPath().stripWhiteSpace();
 
@@ -1490,66 +1654,11 @@
                                                 title);
 
-    DiskImageItem *createdItem = 0;
-    if (src)
-    {
-        QUuid uuid;
-        if (currentList == hdsView)
-        {
-            CVirtualDiskImage vdi = vbox.OpenVirtualDiskImage (src);
-            if (vbox.isOk())
-            {
-                /// @todo (dmik) later, change wrappers so that converting
-                //  to CUnknown is not necessary for cross-assignments
-                CHardDisk hardDisk = CUnknown (vdi);
-                vbox.RegisterHardDisk (hardDisk);
-                if (vbox.isOk())
-                {
-                    createdItem = createHdItem (hdsView, 0, hardDisk);
-                    /* synchronize modeless dialog if present */
-                    if (mModelessDialog && mModelessDialog != this)
-                        mModelessDialog->createHdItem (mModelessDialog->hdsView, 0, hardDisk);
-                }
-            }
-        }
-        else
-        if (currentList == cdsView)
-        {
-            CDVDImage dvdImage = vbox.OpenDVDImage (src, uuid);
-            if (vbox.isOk())
-            {
-                vbox.RegisterDVDImage (dvdImage);
-                if (vbox.isOk())
-                {
-                    createdItem = createCdItem (cdsView, 0, dvdImage);
-                    /* synchronize modeless dialog if present */
-                    if (mModelessDialog && mModelessDialog != this)
-                        mModelessDialog->createCdItem (mModelessDialog->cdsView, 0, dvdImage);
-                }
-            }
-        }
-        else
-        if (currentList == fdsView)
-        {
-            CFloppyImage floppyImage = vbox.OpenFloppyImage (src, uuid);
-            if (vbox.isOk())
-            {
-                vbox.RegisterFloppyImage (floppyImage);
-                if (vbox.isOk())
-                {
-                    createdItem = createFdItem (fdsView, 0, floppyImage);
-                    /* synchronize modeless dialog if present */
-                    if (mModelessDialog && mModelessDialog != this)
-                        mModelessDialog->createFdItem (mModelessDialog->fdsView, 0, floppyImage);
-                }
-            }
-        }
-
-        if (!vbox.isOk())
-        {
-            vboxProblem().cannotRegisterMedia (this, vbox, type, src);
-        }
-    }
-    /* set current item */
+    DiskImageItem *createdItem = addImageToList (src, type);
     setCurrentItem (currentList, createdItem);
+
+    if (!vbox.isOk())
+    {
+        vboxProblem().cannotRegisterMedia (this, vbox, type, src);
+    }
 }
 
@@ -1573,5 +1682,5 @@
         int deleteImage;
         if (vbox.GetHardDisk (uuid).GetStorageType() == CEnums::VirtualDiskImage &&
-            vbox.GetHardDisk (uuid).GetAccessible())
+            item->getStatus() == VBoxMedia::Ok)
         {
             deleteImage = vboxProblem().confirmHardDiskImageDeletion (this, src);
@@ -1613,5 +1722,5 @@
     {
         delete item;
-        setCurrentItem (currentList, (DiskImageItem*)currentList->currentItem());
+        setCurrentItem (currentList, currentList->currentItem());
         /* synchronize modeless dialog if present */
         if (mModelessDialog && mModelessDialog != this)
@@ -1825,27 +1934,2 @@
         accept();
 }
-
-
-void VBoxDiskImageManagerDlg::uploadCurrentList (QStringList &aNames,
-                                                 QStringList &aKeys,
-                                                 const QUuid &aMachineId)
-{
-    QListView *currentList = getCurrentListView();
-    DiskImageItem *item = 0;
-    if (currentList->firstChild() &&
-        currentList->firstChild()->rtti() == 1001)
-        item = static_cast<DiskImageItem*> (currentList->firstChild());
-    Assert (item);
-
-    do {
-        if (QUuid (item->getMachineId()).isNull() ||
-            QUuid (item->getMachineId()) == aMachineId)
-        {
-            aNames << QString ("%1 (%2)")
-                      .arg (item->getName().stripWhiteSpace())
-                      .arg (item->getPath().stripWhiteSpace());
-            aKeys  << item->getUuid();
-        }
-        item = item->nextSibling();
-    } while (item);
-}
Index: /trunk/src/VBox/Frontends/VirtualBox/ui/VBoxNewVMWzd.ui.h
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/ui/VBoxNewVMWzd.ui.h	(revision 252)
+++ /trunk/src/VBox/Frontends/VirtualBox/ui/VBoxNewVMWzd.ui.h	(revision 253)
@@ -402,6 +402,8 @@
         /* update media combobox */
         QFileInfo fi (chd.GetLocation());
-        mediaCombo->appendItem (fi.fileName() + " (" +
-                                QDir::convertSeparators (fi.dirPath()) + ")", uuidHD);
+        mediaCombo->appendItem (QString ("%1 (%2)")
+            .arg (fi.fileName())
+            .arg (QDir::convertSeparators (fi.dirPath())),
+            uuidHD, VBoxDiskImageManagerDlg::composeHdToolTip (chd));
         mediaCombo->setCurrentItem (mediaCombo->count() - 1);
         mediaCombo->setFocus();
Index: /trunk/src/VBox/Frontends/VirtualBox/ui/VBoxVMSettingsDlg.ui
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/ui/VBoxVMSettingsDlg.ui	(revision 252)
+++ /trunk/src/VBox/Frontends/VirtualBox/ui/VBoxVMSettingsDlg.ui	(revision 253)
@@ -2458,5 +2458,5 @@
     <function access="protected">showEvent( QShowEvent * )</function>
     <function returnType="bool">eventFilter( QObject * watched, QEvent * e )</function>
-    <function access="protected">updateShortcuts( VBoxDefs::DiskType, VBoxDiskImageManagerDlg *aVdm = 0 )</function>
+    <function access="protected">updateShortcuts()</function>
     <function access="protected" returnType="QString">getHdInfo( QGroupBox*, QUuid )</function>
 </functions>
Index: /trunk/src/VBox/Frontends/VirtualBox/ui/VBoxVMSettingsDlg.ui.h
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/ui/VBoxVMSettingsDlg.ui.h	(revision 252)
+++ /trunk/src/VBox/Frontends/VirtualBox/ui/VBoxVMSettingsDlg.ui.h	(revision 253)
@@ -226,5 +226,5 @@
 {
     polished = false;
-    
+
     setIcon (QPixmap::fromMimeSource ("settings_16px.png"));
 
@@ -333,5 +333,5 @@
     QWhatsThis::add (cbHDD, tr ("Displays the virtual hard disk to attach to this IDE slot "
                                 "and allows to quickly select a different hard disk."));
-    
+
     wvalHDD = new QIWidgetValidator( pageHDD, this );
     connect (wvalHDD, SIGNAL (validityChanged (const QIWidgetValidator *)),
@@ -417,5 +417,5 @@
                          "virtual machine that uses the specified driver to communicate "
                          "to the host audio card."));
-    
+
     /* Network Page */
 
@@ -563,5 +563,5 @@
     if (!object->isWidgetType())
         return QDialog::eventFilter (object, event);
-    
+
     QWidget *widget = static_cast <QWidget *> (object);
     if (widget->topLevelWidget() != this)
@@ -595,5 +595,5 @@
 {
     QDialog::showEvent (e);
-    
+
     /* one may think that QWidget::polish() is the right place to do things
      * below, but apparently, by the time when QWidget::polish() is called,
@@ -601,13 +601,13 @@
      * size hint is not properly calculated. Since this is sometimes necessary,
      * we provide our own "polish" implementation. */
-    
+
     if (polished)
         return;
-    
+
     polished = true;
-    
+
     /* resize to the miminum possible size */
     resize (minimumSize());
-    
+
     VBoxGlobal::centerWidget (this, parentWidget());
 }
@@ -622,8 +622,7 @@
 }
 
-void VBoxVMSettingsDlg::updateShortcuts (VBoxDefs::DiskType aType,
-                                         VBoxDiskImageManagerDlg *aVdm)
-{
-    /* update request for selected item */
+void VBoxVMSettingsDlg::updateShortcuts()
+{
+    /* setup necessary combobox item */
     cbHDA->setRequiredItem (uuidHDA);
     cbHDB->setRequiredItem (uuidHDB);
@@ -631,41 +630,12 @@
     cbISODVD->setRequiredItem (uuidISODVD);
     cbISOFloppy->setRequiredItem (uuidISOFloppy);
-
-    if (aVdm)
-    /* quick update from vdm data */
-    {
-        QStringList names, keys;
-        aVdm->uploadCurrentList (names, keys, cbHDA->getBelongsTo());
-
-        switch (aType)
-        {
-            case VBoxDefs::HD:
-                cbHDA->loadShortCuts (names, keys);
-                cbHDB->loadShortCuts (names, keys);
-                cbHDD->loadShortCuts (names, keys);
-                break;
-            case VBoxDefs::CD:
-                cbISODVD->loadShortCuts (names, keys);
-                break;
-            case VBoxDefs::FD:
-                cbISOFloppy->loadShortCuts (names, keys);
-                break;
-            default:
-                Assert (0);
-                break;
-        }
-    }
-    else
-    /* slow update through media-enumeration process */
-    {
-        /* request for refresh every combo-box */
-        cbHDA->setReadyForRefresh();
-        cbHDB->setReadyForRefresh();
-        cbHDD->setReadyForRefresh();
-        cbISODVD->setReadyForRefresh();
-        cbISOFloppy->setReadyForRefresh();
-        /* starting media-enumerating process */
-        vboxGlobal().startEnumeratingMedia();
-    }
+    /* request for refresh every combo-box */
+    cbHDA->setReadyForRefresh();
+    cbHDB->setReadyForRefresh();
+    cbHDD->setReadyForRefresh();
+    cbISODVD->setReadyForRefresh();
+    cbISOFloppy->setReadyForRefresh();
+    /* starting media-enumerating process */
+    vboxGlobal().startEnumeratingMedia();
 }
 
@@ -674,11 +644,6 @@
 {
     uuidHDA = grbHDA->isChecked() ? cbHDA->getId() : QUuid();
+    cbHDA->setRequiredItem (uuidHDA);
     txHDA->setText (getHdInfo (grbHDA, uuidHDA));
-    /* tool-tip composing */
-    if (!uuidHDA.isNull())
-    {
-        CHardDisk hd = vboxGlobal().virtualBox().GetHardDisk (uuidHDA);
-        QToolTip::add (cbHDA, VBoxDiskImageManagerDlg::composeHdToolTip (hd));
-    }
     /* revailidate */
     wvalHDD->revalidate();
@@ -689,11 +654,6 @@
 {
     uuidHDB = grbHDB->isChecked() ? cbHDB->getId() : QUuid();
+    cbHDB->setRequiredItem (uuidHDB);
     txHDB->setText (getHdInfo (grbHDB, uuidHDB));
-    /* tool-tip composing */
-    if (!uuidHDB.isNull())
-    {
-        CHardDisk hd = vboxGlobal().virtualBox().GetHardDisk (uuidHDB);
-        QToolTip::add (cbHDB, VBoxDiskImageManagerDlg::composeHdToolTip (hd));
-    }
     /* revailidate */
     wvalHDD->revalidate();
@@ -704,11 +664,6 @@
 {
     uuidHDD = grbHDD->isChecked() ? cbHDD->getId() : QUuid();
+    cbHDD->setRequiredItem (uuidHDD);
     txHDD->setText (getHdInfo (grbHDD, uuidHDD));
-    /* tool-tip composing */
-    if (!uuidHDD.isNull())
-    {
-        CHardDisk hd = vboxGlobal().virtualBox().GetHardDisk (uuidHDD);
-        QToolTip::add (cbHDD, VBoxDiskImageManagerDlg::composeHdToolTip (hd));
-    }
     /* revailidate */
     wvalHDD->revalidate();
@@ -719,10 +674,5 @@
 {
     uuidISODVD = bgDVD->isChecked() ? cbISODVD->getId() : QUuid();
-    /* tool-tip composing */
-    if (!uuidISODVD.isNull())
-    {
-        CDVDImage cd = vboxGlobal().virtualBox().GetDVDImage (uuidISODVD);
-        QToolTip::add (cbISODVD, VBoxDiskImageManagerDlg::composeCdToolTip (cd));
-    }
+    cbISODVD->setRequiredItem (uuidISODVD);
     /* revailidate */
     wvalDVD->revalidate();
@@ -733,10 +683,5 @@
 {
     uuidISOFloppy = bgFloppy->isChecked() ? cbISOFloppy->getId() : QUuid();
-    /* tool-tip composing */
-    if (!uuidISOFloppy.isNull())
-    {
-        CFloppyImage fd = vboxGlobal().virtualBox().GetFloppyImage (uuidISOFloppy);
-        QToolTip::add (cbISOFloppy, VBoxDiskImageManagerDlg::composeFdToolTip (fd));
-    }
+    cbISOFloppy->setRequiredItem (uuidISOFloppy);
     /* revailidate */
     wvalFloppy->revalidate();
@@ -746,5 +691,5 @@
 QString VBoxVMSettingsDlg::getHdInfo (QGroupBox *aGroupBox, QUuid aId)
 {
-    QString notAttached = tr ("<not attached>", "hard disk"); 
+    QString notAttached = tr ("<not attached>", "hard disk");
     if (aId.isNull())
         return notAttached;
@@ -790,5 +735,5 @@
     if (!warning.isEmpty())
         warningString = QString ("<font color=red>%1</font>").arg (warning);
-    
+
     if (!warningString.isEmpty())
         whatsThisLabel->setText (warningString);
@@ -1269,5 +1214,5 @@
     cbHDB->setBelongsTo(machine.GetId());
     cbHDD->setBelongsTo(machine.GetId());
-    updateShortcuts (VBoxDefs::InvalidType);
+    updateShortcuts();
 
     /* revalidate pages with custom validation */
@@ -1506,5 +1451,5 @@
     if (dlg.exec() == VBoxDiskImageManagerDlg::Accepted)
         *id = dlg.getSelectedUuid();
-    updateShortcuts (type, &dlg);
+    updateShortcuts();
     cbb->setFocus();
 }
