Index: /trunk/src/VBox/Frontends/VirtualBox/Makefile.kmk
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/Makefile.kmk	(revision 41020)
+++ /trunk/src/VBox/Frontends/VirtualBox/Makefile.kmk	(revision 41021)
@@ -365,4 +365,5 @@
 	src/wizards/newvm/UIWizardNewVMPageBasic4.h \
 	src/wizards/newvm/UIWizardNewVMPageBasic5.h \
+	src/wizards/newvm/UIWizardNewVMPageExpert.h \
 	src/wizards/newvd/UIWizardNewVD.h \
 	src/wizards/newvd/UIWizardNewVDPageBasic1.h \
@@ -370,8 +371,10 @@
 	src/wizards/newvd/UIWizardNewVDPageBasic3.h \
 	src/wizards/newvd/UIWizardNewVDPageBasic4.h \
+	src/wizards/newvd/UIWizardNewVDPageExpert.h \
 	src/wizards/clonevm/UIWizardCloneVM.h \
 	src/wizards/clonevm/UIWizardCloneVMPageBasic1.h \
 	src/wizards/clonevm/UIWizardCloneVMPageBasic2.h \
 	src/wizards/clonevm/UIWizardCloneVMPageBasic3.h \
+	src/wizards/clonevm/UIWizardCloneVMPageExpert.h \
 	src/wizards/clonevd/UIWizardCloneVD.h \
 	src/wizards/clonevd/UIWizardCloneVDPageBasic1.h \
@@ -380,4 +383,5 @@
 	src/wizards/clonevd/UIWizardCloneVDPageBasic4.h \
 	src/wizards/clonevd/UIWizardCloneVDPageBasic5.h \
+	src/wizards/clonevd/UIWizardCloneVDPageExpert.h \
 	src/wizards/exportappliance/UIWizardExportApp.h \
 	src/wizards/exportappliance/UIWizardExportAppPageBasic1.h \
@@ -385,11 +389,14 @@
 	src/wizards/exportappliance/UIWizardExportAppPageBasic3.h \
 	src/wizards/exportappliance/UIWizardExportAppPageBasic4.h \
+	src/wizards/exportappliance/UIWizardExportAppPageExpert.h \
 	src/wizards/importappliance/UIWizardImportApp.h \
 	src/wizards/importappliance/UIWizardImportAppPageBasic1.h \
 	src/wizards/importappliance/UIWizardImportAppPageBasic2.h \
+	src/wizards/importappliance/UIWizardImportAppPageExpert.h \
 	src/wizards/firstrun/UIWizardFirstRun.h \
 	src/wizards/firstrun/UIWizardFirstRunPageBasic1.h \
 	src/wizards/firstrun/UIWizardFirstRunPageBasic2.h \
-	src/wizards/firstrun/UIWizardFirstRunPageBasic3.h
+	src/wizards/firstrun/UIWizardFirstRunPageBasic3.h \
+	src/wizards/firstrun/UIWizardFirstRunPageExpert.h
 
 VirtualBox_QT_MOCHDRS.darwin += \
@@ -574,4 +581,5 @@
 	src/wizards/newvm/UIWizardNewVMPageBasic4.cpp \
 	src/wizards/newvm/UIWizardNewVMPageBasic5.cpp \
+	src/wizards/newvm/UIWizardNewVMPageExpert.cpp \
 	src/wizards/newvd/UIWizardNewVD.cpp \
 	src/wizards/newvd/UIWizardNewVDPageBasic1.cpp \
@@ -579,8 +587,10 @@
 	src/wizards/newvd/UIWizardNewVDPageBasic3.cpp \
 	src/wizards/newvd/UIWizardNewVDPageBasic4.cpp \
+	src/wizards/newvd/UIWizardNewVDPageExpert.cpp \
 	src/wizards/clonevm/UIWizardCloneVM.cpp \
 	src/wizards/clonevm/UIWizardCloneVMPageBasic1.cpp \
 	src/wizards/clonevm/UIWizardCloneVMPageBasic2.cpp \
 	src/wizards/clonevm/UIWizardCloneVMPageBasic3.cpp \
+	src/wizards/clonevm/UIWizardCloneVMPageExpert.cpp \
 	src/wizards/clonevd/UIWizardCloneVD.cpp \
 	src/wizards/clonevd/UIWizardCloneVDPageBasic1.cpp \
@@ -589,4 +599,5 @@
 	src/wizards/clonevd/UIWizardCloneVDPageBasic4.cpp \
 	src/wizards/clonevd/UIWizardCloneVDPageBasic5.cpp \
+	src/wizards/clonevd/UIWizardCloneVDPageExpert.cpp \
 	src/wizards/exportappliance/UIWizardExportApp.cpp \
 	src/wizards/exportappliance/UIWizardExportAppPageBasic1.cpp \
@@ -594,11 +605,14 @@
 	src/wizards/exportappliance/UIWizardExportAppPageBasic3.cpp \
 	src/wizards/exportappliance/UIWizardExportAppPageBasic4.cpp \
+	src/wizards/exportappliance/UIWizardExportAppPageExpert.cpp \
 	src/wizards/importappliance/UIWizardImportApp.cpp \
 	src/wizards/importappliance/UIWizardImportAppPageBasic1.cpp \
 	src/wizards/importappliance/UIWizardImportAppPageBasic2.cpp \
+	src/wizards/importappliance/UIWizardImportAppPageExpert.cpp \
 	src/wizards/firstrun/UIWizardFirstRun.cpp \
 	src/wizards/firstrun/UIWizardFirstRunPageBasic1.cpp \
 	src/wizards/firstrun/UIWizardFirstRunPageBasic2.cpp \
-	src/wizards/firstrun/UIWizardFirstRunPageBasic3.cpp
+	src/wizards/firstrun/UIWizardFirstRunPageBasic3.cpp \
+	src/wizards/firstrun/UIWizardFirstRunPageExpert.cpp
 
 VirtualBox_SOURCES.win += \
Index: /trunk/src/VBox/Frontends/VirtualBox/src/globals/VBoxDefs.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/globals/VBoxDefs.cpp	(revision 41020)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/globals/VBoxDefs.cpp	(revision 41021)
@@ -43,4 +43,5 @@
 const char* VBoxDefs::GUI_AutoresizeGuest = "GUI/AutoresizeGuest";
 const char* VBoxDefs::GUI_FirstRun = "GUI/FirstRun";
+const char* VBoxDefs::GUI_HideDescriptionForWizards = "GUI/HideDescriptionForWizards";
 const char* VBoxDefs::GUI_SaveMountedAtRuntime = "GUI/SaveMountedAtRuntime";
 const char* VBoxDefs::GUI_ShowMiniToolBar = "GUI/ShowMiniToolBar";
Index: /trunk/src/VBox/Frontends/VirtualBox/src/globals/VBoxDefs.h
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/globals/VBoxDefs.h	(revision 41020)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/globals/VBoxDefs.h	(revision 41021)
@@ -123,4 +123,5 @@
     static const char* GUI_AutoresizeGuest;
     static const char* GUI_FirstRun;
+    static const char* GUI_HideDescriptionForWizards;
     static const char* GUI_SaveMountedAtRuntime;
     static const char* GUI_ShowMiniToolBar;
Index: /trunk/src/VBox/Frontends/VirtualBox/src/selector/UISelectorWindow.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/selector/UISelectorWindow.cpp	(revision 41020)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/selector/UISelectorWindow.cpp	(revision 41021)
@@ -216,5 +216,5 @@
     QString strTmpFile = strFileName;
 #endif /* !Q_WS_MAC */
-    UIWizardImportApp wizard(strTmpFile, this);
+    UIWizardImportApp wizard(this, strTmpFile);
     if (strFileName.isEmpty() || wizard.isValid())
         wizard.exec();
Index: /trunk/src/VBox/Frontends/VirtualBox/src/widgets/VBoxFilePathSelectorWidget.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/widgets/VBoxFilePathSelectorWidget.cpp	(revision 41020)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/widgets/VBoxFilePathSelectorWidget.cpp	(revision 41021)
@@ -678,4 +678,14 @@
 }
 
+void VBoxEmptyFileSelector::setChooseButtonText(const QString &strText)
+{
+    mSelectButton->setText(strText);
+}
+
+QString VBoxEmptyFileSelector::chooseButtonText() const
+{
+    return mSelectButton->text();
+}
+
 void VBoxEmptyFileSelector::setFileDialogTitle (const QString& aTitle)
 {
Index: /trunk/src/VBox/Frontends/VirtualBox/src/widgets/VBoxFilePathSelectorWidget.h
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/widgets/VBoxFilePathSelectorWidget.h	(revision 41020)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/widgets/VBoxFilePathSelectorWidget.h	(revision 41021)
@@ -161,4 +161,7 @@
     bool isModified () const { return mIsModified; }
     void resetModified () { mIsModified = false; }
+
+    void setChooseButtonText(const QString &aText);
+    QString chooseButtonText() const;
 
     void setFileDialogTitle (const QString& aTitle);
Index: /trunk/src/VBox/Frontends/VirtualBox/src/wizards/UIWizard.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/wizards/UIWizard.cpp	(revision 41020)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/wizards/UIWizard.cpp	(revision 41021)
@@ -29,96 +29,241 @@
 #include "QIRichTextLabel.h"
 
-UIWizard::UIWizard(QWidget *pParent)
+int	UIWizard::exec()
+{
+    /* Prepare wizard: */
+    prepare();
+    /* Call to base-class: */
+    return QWizard::exec();
+}
+
+void UIWizard::sltCurrentIdChanged(int iId)
+{
+    /* Enable 1st button (Hide/Show Description) for 1st page only: */
+    setOption(QWizard::HaveCustomButton1, iId == 0);
+}
+
+void UIWizard::sltCustomButtonClicked(int iId)
+{
+    /* Handle 1st button: */
+    if (iId == CustomButton1)
+    {
+        /* Cleanup: */
+        cleanup();
+
+        /* Compose wizard's name: */
+        QString strWizardName = nameForType(m_type);
+        /* Load mode settings: */
+        QStringList wizards = vboxGlobal().virtualBox().GetExtraDataStringList(VBoxDefs::GUI_HideDescriptionForWizards);
+
+        /* Switch mode: */
+        switch (m_mode)
+        {
+            case UIWizardMode_Basic:
+            {
+                m_mode = UIWizardMode_Expert;
+                if (!wizards.contains(strWizardName))
+                    wizards << strWizardName;
+                break;
+            }
+            case UIWizardMode_Expert:
+            {
+                m_mode = UIWizardMode_Basic;
+                if (wizards.contains(strWizardName))
+                    wizards.removeAll(strWizardName);
+                break;
+            }
+        }
+
+        /* Save mode settings: */
+        vboxGlobal().virtualBox().SetExtraDataStringList(VBoxDefs::GUI_HideDescriptionForWizards, wizards);
+
+        /* Prepare: */
+        prepare();
+    }
+}
+
+UIWizard::UIWizard(QWidget *pParent, UIWizardType type)
     : QIWithRetranslateUI<QWizard>(pParent)
-{
-#if 0 // This is VERY important change, have to discuss first!
-    /* Qt have a bug-o-feature which silently fallbacks complex-wizard-style
-     * to more simple in case it failed to initialize that complex-wizard-style.
-     * Further wizard's look-n-feel may partially corresponds to both:
-     * complex-wizard-style and falled-back-one, we have to be sure which we are using. */
-    setWizardStyle(wizardStyle());
-#endif
+    , m_type(type)
+    , m_mode(loadModeForType(m_type))
+{
+#ifdef Q_WS_WIN
+    /* Hide window icon: */
+    setWindowIcon(QIcon());
+#endif /* Q_WS_WIN */
 
 #ifdef Q_WS_MAC
-    /* I'm really not sure why there shouldn't be any default button on Mac OS
-     * X. This prevents the using of Enter to jump to the next page. */
+    /* I'm really not sure why there shouldn't be any default button on Mac OS X.
+     * This prevents the using of Enter to jump to the next page. */
     setOptions(options() ^ QWizard::NoDefaultButton);
 #endif /* Q_WS_MAC */
-}
-
-int	UIWizard::addPage(UIWizardPage *pPage)
+
+    /* Setup connections: */
+    connect(this, SIGNAL(currentIdChanged(int)), this, SLOT(sltCurrentIdChanged(int)));
+    connect(this, SIGNAL(customButtonClicked(int)), this, SLOT(sltCustomButtonClicked(int)));
+}
+
+void UIWizard::retranslateUi()
+{
+    /* Translate basic/expert button: */
+    switch (m_mode)
+    {
+        case UIWizardMode_Basic: setButtonText(QWizard::CustomButton1, tr("Hide Description")); break;
+        case UIWizardMode_Expert: setButtonText(QWizard::CustomButton1, tr("Show Description")); break;
+    }
+}
+
+void UIWizard::retranslatePages()
+{
+    /* Translate all the pages: */
+    QList<int> ids = pageIds();
+    for (int i = 0; i < ids.size(); ++i)
+        qobject_cast<UIWizardPage*>(page(ids[i]))->retranslate();
+}
+
+void UIWizard::setPage(int iId, UIWizardPage *pPage)
 {
     /* Configure page first: */
     configurePage(pPage);
-
-    /* Add page finally: */
-    return QWizard::addPage(pPage);
-}
-
-void UIWizard::setPage(int iId, UIWizardPage *pPage)
-{
-    /* Configure page first: */
-    configurePage(pPage);
-
     /* Add page finally: */
     QWizard::setPage(iId, pPage);
 }
 
-void UIWizard::retranslateAllPages()
-{
-    QList<UIWizardPage*> pages = findChildren<UIWizardPage*>();
-    for(int i = 0; i < pages.size(); ++i)
-        qobject_cast<UIWizardPage*>(pages.at((i)))->retranslate();
-}
-
-void UIWizard::resizeToGoldenRatio(UIWizardType wizardType)
-{
-    /* Get corresponding ratio: */
-    double dRatio = ratioForWizardType(wizardType);
-
-    /* Use some small (!) initial QIRichTextLabel width: */
-    int iInitialLabelWidth = 200;
-
-    /* Resize wizard according that initial width,
-     * actually there could be other content
-     * which wants to be wider than that initial width. */
-    resizeAccordingLabelWidth(iInitialLabelWidth);
-
-    /* Get all the pages: */
-    QList<UIWizardPage*> pages = findChildren<UIWizardPage*>();
-    /* Get some (first) of those pages: */
-    UIWizardPage *pSomePage = pages[0];
-
-    /* Calculate actual label width: */
-    int iPageWidth = pSomePage->width();
-    int iLeft, iTop, iRight, iBottom;
-    pSomePage->layout()->getContentsMargins(&iLeft, &iTop, &iRight, &iBottom);
-    int iCurrentLabelWidth = iPageWidth - iLeft - iRight;
-
-    /* Calculate summary margin length, including margins of the page and wizard: */
-    int iMarginsLength = width() - iCurrentLabelWidth;
-
-    /* Calculating nearest to 'golden ratio' label width: */
-    int iCurrentWizardWidth = width();
-    int iCurrentWizardHeight = height();
+void UIWizard::prepare()
+{
+    /* Translate wizard: */
+    retranslateUi();
+    /* Translate wizard pages: */
+    retranslatePages();
+
+    /* Resize wizard to 'golden ratio': */
+    resizeToGoldenRatio();
+
+    /* Notify pages they are ready: */
+    QList<int> ids = pageIds();
+    for (int i = 0; i < ids.size(); ++i)
+        qobject_cast<UIWizardPage*>(page(ids[i]))->markReady();
+
+    /* Make sure custom buttons shown even if final page is first to show: */
+    sltCurrentIdChanged(startId());
+}
+
+void UIWizard::cleanup()
+{
+    /* Remove all the pages: */
+    QList<int> ids = pageIds();
+    for (int i = ids.size() - 1; i >= 0 ; --i)
+    {
+        /* Get enumerated page ID: */
+        int iId = ids[i];
+        /* Get corresponding page: */
+        QWizardPage *pWizardPage = page(iId);
+
+        /* Remove page from the wizard: */
+        removePage(iId);
+        /* Delete page finally: */
+        delete pWizardPage;
+    }
+
 #ifndef Q_WS_MAC
-    /* We should take into account watermar thought its not assigned yet: */
-    QPixmap watermarkPixmap(m_strWatermarkName);
-    int iWatermarkWidth = watermarkPixmap.width();
-    iCurrentWizardWidth += iWatermarkWidth;
+    /* Cleanup watermark: */
+    if (!m_strWatermarkName.isEmpty())
+        setPixmap(QWizard::WatermarkPixmap, QPixmap());
 #endif /* !Q_WS_MAC */
-    int iGoldenRatioWidth = (int)qSqrt(dRatio * iCurrentWizardWidth * iCurrentWizardHeight);
-    int iProposedLabelWidth = iGoldenRatioWidth - iMarginsLength;
+}
+
+void UIWizard::resizeToGoldenRatio()
+{
+    /* Check if wizard is in basic or expert mode: */
+    if (m_mode == UIWizardMode_Expert)
+    {
+        /* Unfortunately QWizard hides some of useful API in private part,
+         * and also have few layouting bugs which could be easy fixed
+         * by that API, so we will use QWizard::restart() method
+         * to call the same functionality indirectly...
+         * Early call restart() which is usually goes on show()! */
+        restart();
+
+        /* Now we have correct label size-hint(s) for all the pages.
+         * We have to make sure all the pages uses maximum available size-hint. */
+        QSize maxOfSizeHints;
+        QList<UIWizardPage*> pages = findChildren<UIWizardPage*>();
+        /* Search for the maximum available size-hint: */
+        foreach (UIWizardPage *pPage, pages)
+        {
+            maxOfSizeHints.rwidth() = pPage->sizeHint().width() > maxOfSizeHints.width() ?
+                                      pPage->sizeHint().width() : maxOfSizeHints.width();
+            maxOfSizeHints.rheight() = pPage->sizeHint().height() > maxOfSizeHints.height() ?
+                                       pPage->sizeHint().height() : maxOfSizeHints.height();
+        }
+        /* Minimum height to 350pix: */
+        if (maxOfSizeHints.height() < 350)
+            maxOfSizeHints.setHeight(350);
+        /* Feat corresponding height: */
+        maxOfSizeHints.setWidth(qMax((int)(1.5 * maxOfSizeHints.height()), maxOfSizeHints.width()));
+        /* Use that size-hint for all the pages: */
+        foreach (UIWizardPage *pPage, pages)
+            pPage->setMinimumSize(maxOfSizeHints);
+
+        /* Relayout widgets: */
+        QList<QLayout*> layouts = findChildren<QLayout*>();
+        foreach(QLayout *pLayout, layouts)
+            pLayout->activate();
+
+        /* Unfortunately QWizard hides some of useful API in private part,
+         * BUT it also have few layouting bugs which could be easy fixed
+         * by that API, so we will use QWizard::restart() method
+         * to call the same functionality indirectly...
+         * And now we call restart() after layout activation procedure! */
+        restart();
+
+        /* Resize it to minimum size: */
+        resize(QSize(0, 0));
+    }
+    else
+    {
+        /* Use some small (!) initial QIRichTextLabel width: */
+        int iInitialLabelWidth = 200;
+
+        /* Resize wizard according that initial width,
+         * actually there could be other content
+         * which wants to be wider than that initial width. */
+        resizeAccordingLabelWidth(iInitialLabelWidth);
+
+        /* Get some (first) of those pages: */
+        UIWizardPage *pPage = qobject_cast<UIWizardPage*>(page(0));
+        /* Calculate actual label width: */
+        int iPageWidth = pPage->minimumWidth();
+        int iLeft, iTop, iRight, iBottom;
+        pPage->layout()->getContentsMargins(&iLeft, &iTop, &iRight, &iBottom);
+        int iCurrentLabelWidth = iPageWidth - iLeft - iRight;
+        /* Calculate summary margin length,
+         * including margins of the page and the wizard: */
+        int iMarginsLength = width() - iCurrentLabelWidth;
+
+        /* Get current wizard width and height: */
+        int iCurrentWizardWidth = width();
+        int iCurrentWizardHeight = height();
 #ifndef Q_WS_MAC
-    /* We should take into account watermar thought its not assigned yet: */
-    iProposedLabelWidth -= iWatermarkWidth;
+        /* We should take into account watermark like its assigned already: */
+        QPixmap watermarkPixmap(m_strWatermarkName);
+        int iWatermarkWidth = watermarkPixmap.width();
+        iCurrentWizardWidth += iWatermarkWidth;
 #endif /* !Q_WS_MAC */
-
-    /* Choose maximum between current and proposed label width: */
-    int iNewLabelWidth = qMax(iCurrentLabelWidth, iProposedLabelWidth);
-
-    /* Finally resize wizard according new label width,
-     * taking into account all the content and 'golden ratio' rule: */
-    resizeAccordingLabelWidth(iNewLabelWidth);
+        /* Calculating nearest to 'golden ratio' label width: */
+        int iGoldenRatioWidth = (int)qSqrt(ratio() * iCurrentWizardWidth * iCurrentWizardHeight);
+        int iProposedLabelWidth = iGoldenRatioWidth - iMarginsLength;
+#ifndef Q_WS_MAC
+        /* We should take into account watermark like its assigned already: */
+        iProposedLabelWidth -= iWatermarkWidth;
+#endif /* !Q_WS_MAC */
+
+        /* Choose maximum between current and proposed label width: */
+        int iNewLabelWidth = qMax(iCurrentLabelWidth, iProposedLabelWidth);
+
+        /* Finally resize wizard according new label width,
+         * taking into account all the content and 'golden ratio' rule: */
+        resizeAccordingLabelWidth(iNewLabelWidth);
+    }
 
 #ifndef Q_WS_MAC
@@ -221,5 +366,5 @@
 }
 
-double UIWizard::ratioForWizardType(UIWizardType wizardType)
+double UIWizard::ratio()
 {
     /* Default value: */
@@ -247,5 +392,5 @@
 #endif /* Q_WS_WIN */
 
-    switch (wizardType)
+    switch (m_type)
     {
         /* New VM wizard much wider than others, fixing: */
@@ -273,5 +418,5 @@
      * 1. wizard-layout top-margin (for modern style),
      * 2. wizard-header height,
-     * 3. margin between wizard-header and wizard-page,
+     * 3. spacing between wizard-header and wizard-page,
      * 4. wizard-page height,
      * 5. wizard-layout bottom-margin (for modern style). */
@@ -282,21 +427,37 @@
     /* Acquire wizard-layout top-margin: */
     int iTopMargin = 0;
-    if (wizardStyle() == QWizard::ModernStyle)
-        iTopMargin = pStyle->pixelMetric(QStyle::PM_LayoutTopMargin);
-
-    /* We have no direct access to QWizardHeader inside QWizard private data...
-     * From Qt sources it seems title font is hardcoded as current font point-size + 4: */
-    QFont titleFont(QApplication::font());
-    titleFont.setPointSize(titleFont.pointSize() + 4);
-    QFontMetrics titleFontMetrics(titleFont);
-    int iTitleHeight = titleFontMetrics.height();
-
-    /* We have no direct access to margin between QWizardHeader and wizard-pages...
-     * From Qt sources it seems its hardcoded as just 7 pixels: */
-    int iMarginBetweenTitleAndPage = 7;
-
-    /* Also we should get any page height: */
-    QList<UIWizardPage*> pages = findChildren<UIWizardPage*>();
-    int iPageHeight = pages[0]->height();
+    if (m_mode == UIWizardMode_Basic)
+    {
+        if (wizardStyle() == QWizard::ModernStyle)
+            iTopMargin = pStyle->pixelMetric(QStyle::PM_LayoutTopMargin);
+    }
+
+    /* Acquire wizard-header height: */
+    int iTitleHeight = 0;
+    if (m_mode == UIWizardMode_Basic)
+    {
+        /* We have no direct access to QWizardHeader inside QWizard private data...
+         * From Qt sources it seems title font is hardcoded as current font point-size + 4: */
+        QFont titleFont(QApplication::font());
+        titleFont.setPointSize(titleFont.pointSize() + 4);
+        QFontMetrics titleFontMetrics(titleFont);
+        iTitleHeight = titleFontMetrics.height();
+    }
+
+    /* Acquire spacing between wizard-header and wizard-page: */
+    int iMarginBetweenTitleAndPage = 0;
+    if (m_mode == UIWizardMode_Basic)
+    {
+        /* We have no direct access to margin between QWizardHeader and wizard-pages...
+         * From Qt sources it seems its hardcoded as just 7 pixels: */
+        iMarginBetweenTitleAndPage = 7;
+    }
+
+    /* Acquire wizard-page height: */
+    int iPageHeight = 0;
+    if (page(0))
+    {
+        iPageHeight = page(0)->minimumSize().height();
+    }
 
     /* Acquire wizard-layout bottom-margin: */
@@ -320,7 +481,7 @@
     /* Create final image on the basis of incoming, applying the rules: */
     QImage imgWatermarkNew(imgWatermark.width(), qMax(imgWatermark.height(), proposedWatermarkHeight()), imgWatermark.format());
-    for (int y = 0; y < imgWatermarkNew.height(); ++ y)
-    {
-        for (int x = 0; x < imgWatermarkNew.width(); ++ x)
+    for (int y = 0; y < imgWatermarkNew.height(); ++y)
+    {
+        for (int x = 0; x < imgWatermarkNew.width(); ++x)
         {
             /* Border rule 1 - draw border for ClassicStyle */
@@ -351,2 +512,32 @@
 #endif /* !Q_WS_MAC */
 
+/* static */
+QString UIWizard::nameForType(UIWizardType type)
+{
+    QString strName;
+    switch (type)
+    {
+        case UIWizardType_NewVM: strName = "NewVM"; break;
+        case UIWizardType_CloneVM: strName = "CloneVM"; break;
+        case UIWizardType_ExportAppliance: strName = "ExportAppliance"; break;
+        case UIWizardType_ImportAppliance: strName = "ImportAppliance"; break;
+        case UIWizardType_FirstRun: strName = "FirstRun"; break;
+        case UIWizardType_NewVD: strName = "NewVD"; break;
+        case UIWizardType_CloneVD: strName = "CloneVD"; break;
+    }
+    return strName;
+}
+
+/* static */
+UIWizardMode UIWizard::loadModeForType(UIWizardType type)
+{
+    /* Default mode is Basic: */
+    UIWizardMode mode = UIWizardMode_Basic;
+    /* Get mode from extra-data: */
+    QStringList wizards = vboxGlobal().virtualBox().GetExtraDataStringList(VBoxDefs::GUI_HideDescriptionForWizards);
+    if (wizards.contains(nameForType(type)))
+        mode = UIWizardMode_Expert;
+    /* Return mode: */
+    return mode;
+}
+
Index: /trunk/src/VBox/Frontends/VirtualBox/src/wizards/UIWizard.h
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/wizards/UIWizard.h	(revision 41020)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/wizards/UIWizard.h	(revision 41021)
@@ -29,4 +29,23 @@
 class UIWizardPage;
 
+/* Wizard type: */
+enum UIWizardType
+{
+    UIWizardType_NewVM,
+    UIWizardType_CloneVM,
+    UIWizardType_ExportAppliance,
+    UIWizardType_ImportAppliance,
+    UIWizardType_FirstRun,
+    UIWizardType_NewVD,
+    UIWizardType_CloneVD
+};
+
+/* Wizard mode: */
+enum UIWizardMode
+{
+    UIWizardMode_Basic,
+    UIWizardMode_Expert
+};
+
 /* QWizard class reimplementation with extended funtionality. */
 class UIWizard : public QIWithRetranslateUI<QWizard>
@@ -34,32 +53,35 @@
     Q_OBJECT;
 
-public:
+public slots:
 
-    /* Constructor: */
-    UIWizard(QWidget *pParent);
+    /* Exec slot: */
+    int	exec();
+
+protected slots:
+
+    /* Page change handler: */
+    virtual void sltCurrentIdChanged(int iId);
+    /* Custom button 1 click handler: */
+    virtual void sltCustomButtonClicked(int iId);
 
 protected:
 
-    /* Wizard type: */
-    enum UIWizardType
-    {
-        UIWizardType_NewVM,
-        UIWizardType_CloneVM,
-        UIWizardType_ExportAppliance,
-        UIWizardType_ImportAppliance,
-        UIWizardType_FirstRun,
-        UIWizardType_NewVD,
-        UIWizardType_CloneVD
-    };
+    /* Constructor: */
+    UIWizard(QWidget *pParent, UIWizardType type);
+
+    /* Translation stuff: */
+    void retranslateUi();
+    void retranslatePages();
+
+    /* Mode related stuff: */
+    UIWizardMode mode() { return m_mode; }
 
     /* Page related methods: */
-    int addPage(UIWizardPage *pPage);
     void setPage(int iId, UIWizardPage *pPage);
-
-    /* Translation stuff: */
-    void retranslateAllPages();
+    virtual void prepare();
+    void cleanup();
 
     /* Adjusting stuff: */
-    void resizeToGoldenRatio(UIWizardType wizardType);
+    void resizeToGoldenRatio();
 
     /* Design stuff: */
@@ -78,8 +100,16 @@
     void configurePage(UIWizardPage *pPage);
     void resizeAccordingLabelWidth(int iLabelWidth);
-    double ratioForWizardType(UIWizardType wizardType);
+    double ratio();
 #ifndef Q_WS_MAC
     int proposedWatermarkHeight();
     void assignWatermarkHelper();
+#endif /* !Q_WS_MAC */
+    static QString nameForType(UIWizardType type);
+    static UIWizardMode loadModeForType(UIWizardType type);
+
+    /* Variables: */
+    UIWizardType m_type;
+    UIWizardMode m_mode;
+#ifndef Q_WS_MAC
     QString m_strWatermarkName;
 #endif /* !Q_WS_MAC */
Index: /trunk/src/VBox/Frontends/VirtualBox/src/wizards/UIWizardPage.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/wizards/UIWizardPage.cpp	(revision 41020)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/wizards/UIWizardPage.cpp	(revision 41021)
@@ -26,6 +26,41 @@
 #include "VBoxGlobal.h"
 
+UIWizard* UIWizardPageBase::wizardImp()
+{
+    /* Should be reimplemented in sub-class to enable access to wizard! */
+    AssertMsgFailed(("UIWizardPageBase::wizardImp() should be reimplemented!"));
+    return 0;
+}
+
+UIWizardPage* UIWizardPageBase::thisImp()
+{
+    /* Should be reimplemented in sub-class to enable access to wizard page! */
+    AssertMsgFailed(("UIWizardPageBase::thisImp() should be reimplemented!"));
+    return 0;
+}
+
+QVariant UIWizardPageBase::fieldImp(const QString &) const
+{
+    /* Should be reimplemented in sub-class to enable access to wizard field! */
+    AssertMsgFailed(("UIWizardPageBase::fieldImp(const QString &) should be reimplemented!"));
+    return QVariant();
+}
+
 UIWizardPage::UIWizardPage()
+    : m_fReady(false)
 {
+}
+
+void UIWizardPage::markReady()
+{
+    m_fReady = true;
+    QWizardPage::setTitle(m_strTitle);
+}
+
+void UIWizardPage::setTitle(const QString &strTitle)
+{
+    m_strTitle = strTitle;
+    if (m_fReady)
+        QWizardPage::setTitle(m_strTitle);
 }
 
Index: /trunk/src/VBox/Frontends/VirtualBox/src/wizards/UIWizardPage.h
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/wizards/UIWizardPage.h	(revision 41020)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/wizards/UIWizardPage.h	(revision 41021)
@@ -21,4 +21,5 @@
 
 /* Global includes: */
+#include <QVariant>
 #include <QWizardPage>
 
@@ -28,6 +29,20 @@
 /* Forward declarations: */
 class UIWizard;
+class UIWizardPage;
 
-/* QWizardPage class reimplementation with extended funtionality. */
+/* One of interfaces for wizard page,
+ * providing API for basic/expert pages. */
+class UIWizardPageBase
+{
+protected:
+
+    /* Helpers: */
+    virtual UIWizard* wizardImp();
+    virtual UIWizardPage* thisImp();
+    virtual QVariant fieldImp(const QString &strFieldName) const;
+};
+
+/* One of interfaces for wizard page,
+ * QWizardPage class reimplementation with extended funtionality. */
 class UIWizardPage : public QIWithRetranslateUI<QWizardPage>
 {
@@ -42,4 +57,10 @@
     void retranslate() { retranslateUi(); }
 
+    /* Prepare stuff: */
+    void markReady();
+
+    /* Title stuff: */
+    void setTitle(const QString &strTitle);
+
 protected:
 
@@ -49,4 +70,8 @@
     void startProcessing();
     void endProcessing();
+
+    /* Variables: */
+    bool m_fReady;
+    QString m_strTitle;
 };
 
Index: /trunk/src/VBox/Frontends/VirtualBox/src/wizards/clonevd/UIWizardCloneVD.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/wizards/clonevd/UIWizardCloneVD.cpp	(revision 41020)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/wizards/clonevd/UIWizardCloneVD.cpp	(revision 41021)
@@ -28,28 +28,12 @@
 #include "UIWizardCloneVDPageBasic4.h"
 #include "UIWizardCloneVDPageBasic5.h"
+#include "UIWizardCloneVDPageExpert.h"
 #include "VBoxGlobal.h"
 #include "UIMessageCenter.h"
 
 UIWizardCloneVD::UIWizardCloneVD(QWidget *pParent, const CMedium &sourceVirtualDisk)
-    : UIWizard(pParent)
+    : UIWizard(pParent, UIWizardType_CloneVD)
+    , m_sourceVirtualDisk(sourceVirtualDisk)
 {
-#ifdef Q_WS_WIN
-    /* Hide window icon: */
-    setWindowIcon(QIcon());
-#endif /* Q_WS_WIN */
-
-    /* Create & add pages: */
-    setPage(Page1, new UIWizardCloneVDPageBasic1(sourceVirtualDisk));
-    setPage(Page2, new UIWizardCloneVDPageBasic2);
-    setPage(Page3, new UIWizardCloneVDPageBasic3);
-    setPage(Page4, new UIWizardCloneVDPageBasic4);
-    setPage(Page5, new UIWizardCloneVDPageBasic5);
-
-    /* Translate wizard: */
-    retranslateUi();
-
-    /* Translate wizard pages: */
-    retranslateAllPages();
-
 #ifndef Q_WS_MAC
     /* Assign watermark: */
@@ -59,7 +43,4 @@
     assignBackground(":/vmw_new_harddisk_bg.png");
 #endif /* Q_WS_MAC */
-
-    /* Resize wizard to 'golden ratio': */
-    resizeToGoldenRatio(UIWizardType_CloneVD);
 }
 
@@ -135,4 +116,7 @@
 void UIWizardCloneVD::retranslateUi()
 {
+    /* Call to base-class: */
+    UIWizard::retranslateUi();
+
     /* Translate wizard: */
     setWindowTitle(tr("Copy Virtual Disk"));
@@ -140,2 +124,26 @@
 }
 
+void UIWizardCloneVD::prepare()
+{
+    /* Create corresponding pages: */
+    switch (mode())
+    {
+        case UIWizardMode_Basic:
+        {
+            setPage(Page1, new UIWizardCloneVDPageBasic1(m_sourceVirtualDisk));
+            setPage(Page2, new UIWizardCloneVDPageBasic2);
+            setPage(Page3, new UIWizardCloneVDPageBasic3);
+            setPage(Page4, new UIWizardCloneVDPageBasic4);
+            setPage(Page5, new UIWizardCloneVDPageBasic5);
+            break;
+        }
+        case UIWizardMode_Expert:
+        {
+            setPage(PageExpert, new UIWizardCloneVDPageExpert(m_sourceVirtualDisk));
+            break;
+        }
+    }
+    /* Call to base-class: */
+    UIWizard::prepare();
+}
+
Index: /trunk/src/VBox/Frontends/VirtualBox/src/wizards/clonevd/UIWizardCloneVD.h
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/wizards/clonevd/UIWizardCloneVD.h	(revision 41020)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/wizards/clonevd/UIWizardCloneVD.h	(revision 41021)
@@ -41,4 +41,10 @@
     };
 
+    /* Page IDs: */
+    enum
+    {
+        PageExpert
+    };
+
     /* Constructor: */
     UIWizardCloneVD(QWidget *pParent, const CMedium &sourceVirtualDisk);
@@ -57,4 +63,5 @@
     /* Who will be able to copy virtual-disk: */
     friend class UIWizardCloneVDPageBasic5;
+    friend class UIWizardCloneVDPageExpert;
 
 private:
@@ -63,5 +70,9 @@
     void retranslateUi();
 
+    /* Pages related stuff: */
+    void prepare();
+
     /* Variables: */
+    CMedium m_sourceVirtualDisk;
     CMedium m_virtualDisk;
 };
Index: /trunk/src/VBox/Frontends/VirtualBox/src/wizards/clonevd/UIWizardCloneVDPageBasic1.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/wizards/clonevd/UIWizardCloneVDPageBasic1.cpp	(revision 41020)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/wizards/clonevd/UIWizardCloneVDPageBasic1.cpp	(revision 41021)
@@ -31,40 +31,12 @@
 #include "QIToolButton.h"
 
-UIWizardCloneVDPageBasic1::UIWizardCloneVDPageBasic1(const CMedium &sourceVirtualDisk)
+UIWizardCloneVDPage1::UIWizardCloneVDPage1()
 {
-    /* Create widgets: */
-    QVBoxLayout *pMainLayout = new QVBoxLayout(this);
-        m_pLabel = new QIRichTextLabel(this);
-        m_pSourceDiskContainer = new QGroupBox(this);
-            m_pSourceDiskContainer->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Fixed);
-            QHBoxLayout *pSourceDiskLayout = new QHBoxLayout(m_pSourceDiskContainer);
-                m_pSourceDiskSelector = new VBoxMediaComboBox(m_pSourceDiskContainer);
-                    m_pSourceDiskSelector->setSizePolicy(QSizePolicy::Ignored, QSizePolicy::Fixed);
-                    m_pSourceDiskSelector->setType(VBoxDefs::MediumType_HardDisk);
-                    m_pSourceDiskSelector->setCurrentItem(sourceVirtualDisk.GetId());
-                    m_pSourceDiskSelector->repopulate();
-                m_pOpenSourceDiskButton = new QIToolButton(m_pSourceDiskContainer);
-                    m_pOpenSourceDiskButton->setAutoRaise(true);
-                    m_pOpenSourceDiskButton->setIcon(UIIconPool::iconSet(":/select_file_16px.png", ":/select_file_dis_16px.png"));
-            pSourceDiskLayout->addWidget(m_pSourceDiskSelector);
-            pSourceDiskLayout->addWidget(m_pOpenSourceDiskButton);
-    pMainLayout->addWidget(m_pLabel);
-    pMainLayout->addWidget(m_pSourceDiskContainer);
-    pMainLayout->addStretch();
-
-    /* Setup connections: */
-    connect(m_pSourceDiskSelector, SIGNAL(currentIndexChanged(int)), this, SIGNAL(completeChanged()));
-    connect(m_pOpenSourceDiskButton, SIGNAL(clicked()), this, SLOT(sltHandleOpenSourceDiskClick()));
-
-    /* Register CMedium class: */
-    qRegisterMetaType<CMedium>();
-    /* Register 'sourceVirtualDisk' field: */
-    registerField("sourceVirtualDisk", this, "sourceVirtualDisk");
 }
 
-void UIWizardCloneVDPageBasic1::sltHandleOpenSourceDiskClick()
+void UIWizardCloneVDPage1::onHandleOpenSourceDiskClick()
 {
     /* Get source virtual-disk using file-open dialog: */
-    QString strMediumId = vboxGlobal().openMediumWithFileOpenDialog(VBoxDefs::MediumType_HardDisk, this);
+    QString strMediumId = vboxGlobal().openMediumWithFileOpenDialog(VBoxDefs::MediumType_HardDisk, thisImp());
     if (!strMediumId.isNull())
     {
@@ -76,12 +48,68 @@
 }
 
+CMedium UIWizardCloneVDPage1::sourceVirtualDisk() const
+{
+    return vboxGlobal().findMedium(m_pSourceDiskSelector->id()).medium();
+}
+
+void UIWizardCloneVDPage1::setSourceVirtualDisk(const CMedium &sourceVirtualDisk)
+{
+    m_pSourceDiskSelector->setCurrentItem(sourceVirtualDisk.GetId());
+}
+
+UIWizardCloneVDPageBasic1::UIWizardCloneVDPageBasic1(const CMedium &sourceVirtualDisk)
+{
+    /* Create widgets: */
+    QVBoxLayout *pMainLayout = new QVBoxLayout(this);
+    {
+        m_pLabel = new QIRichTextLabel(this);
+        m_pSourceDiskCnt = new QGroupBox(this);
+        {
+            m_pSourceDiskCnt->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Fixed);
+            QHBoxLayout *pSourceDiskCntLayout = new QHBoxLayout(m_pSourceDiskCnt);
+            {
+                m_pSourceDiskSelector = new VBoxMediaComboBox(m_pSourceDiskCnt);
+                {
+                    m_pSourceDiskSelector->setSizePolicy(QSizePolicy::Ignored, QSizePolicy::Fixed);
+                    m_pSourceDiskSelector->setType(VBoxDefs::MediumType_HardDisk);
+                    m_pSourceDiskSelector->setCurrentItem(sourceVirtualDisk.GetId());
+                    m_pSourceDiskSelector->repopulate();
+                }
+                m_pSourceDiskOpenButton = new QIToolButton(m_pSourceDiskCnt);
+                {
+                    m_pSourceDiskOpenButton->setAutoRaise(true);
+                    m_pSourceDiskOpenButton->setIcon(UIIconPool::iconSet(":/select_file_16px.png", ":/select_file_dis_16px.png"));
+                }
+                pSourceDiskCntLayout->addWidget(m_pSourceDiskSelector);
+                pSourceDiskCntLayout->addWidget(m_pSourceDiskOpenButton);
+            }
+        }
+        pMainLayout->addWidget(m_pLabel);
+        pMainLayout->addWidget(m_pSourceDiskCnt);
+        pMainLayout->addStretch();
+    }
+
+    /* Setup connections: */
+    connect(m_pSourceDiskSelector, SIGNAL(currentIndexChanged(int)), this, SIGNAL(completeChanged()));
+    connect(m_pSourceDiskOpenButton, SIGNAL(clicked()), this, SLOT(sltHandleOpenSourceDiskClick()));
+
+    /* Register classes: */
+    qRegisterMetaType<CMedium>();
+    /* Register fields: */
+    registerField("sourceVirtualDisk", this, "sourceVirtualDisk");
+}
+
+void UIWizardCloneVDPageBasic1::sltHandleOpenSourceDiskClick()
+{
+    /* Call to base-class: */
+    onHandleOpenSourceDiskClick();
+}
+
 void UIWizardCloneVDPageBasic1::retranslateUi()
 {
     /* Translate page: */
-    setTitle(UIWizardCloneVD::tr("Welcome to the virtual disk copying wizard"));
+    setTitle(UIWizardCloneVD::tr("Welcome to the Copy Virtual Disk wizard!"));
 
     /* Translate widgets: */
-    m_pSourceDiskContainer->setTitle(UIWizardCloneVD::tr("Virtual disk to copy"));
-    m_pOpenSourceDiskButton->setToolTip(UIWizardCloneVD::tr("Choose a virtual hard disk file..."));
     m_pLabel->setText(UIWizardCloneVD::tr("<p>This wizard will help you to copy a virtual disk.</p>"));
     m_pLabel->setText(m_pLabel->text() + QString("<p>%1</p>").arg(standardHelpText()));
@@ -90,4 +118,6 @@
                                                              "choose one from the list or use the folder icon "
                                                              "beside the list to select a virtual disk file."));
+    m_pSourceDiskCnt->setTitle(UIWizardCloneVD::tr("Virtual disk to copy"));
+    m_pSourceDiskOpenButton->setToolTip(UIWizardCloneVD::tr("Choose a virtual hard disk file..."));
 }
 
@@ -100,16 +130,6 @@
 bool UIWizardCloneVDPageBasic1::isComplete() const
 {
-    /* Check what source virtual-disk feats the rules: */
+    /* Make sure source virtual-disk feats the rules: */
     return !sourceVirtualDisk().isNull();
 }
 
-CMedium UIWizardCloneVDPageBasic1::sourceVirtualDisk() const
-{
-    return vboxGlobal().findMedium(m_pSourceDiskSelector->id()).medium();
-}
-
-void UIWizardCloneVDPageBasic1::setSourceVirtualDisk(const CMedium &sourceVirtualDisk)
-{
-    m_pSourceDiskSelector->setCurrentItem(sourceVirtualDisk.GetId());
-}
-
Index: /trunk/src/VBox/Frontends/VirtualBox/src/wizards/clonevd/UIWizardCloneVDPageBasic1.h
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/wizards/clonevd/UIWizardCloneVDPageBasic1.h	(revision 41020)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/wizards/clonevd/UIWizardCloneVDPageBasic1.h	(revision 41021)
@@ -25,11 +25,32 @@
 
 /* Forward declarations: */
-class QIRichTextLabel;
 class QGroupBox;
 class VBoxMediaComboBox;
 class QIToolButton;
+class QIRichTextLabel;
 
-/* 1st page of the Clone Virtual Disk wizard: */
-class UIWizardCloneVDPageBasic1 : public UIWizardPage
+/* 1st page of the Clone Virtual Disk wizard (base part): */
+class UIWizardCloneVDPage1 : public UIWizardPageBase
+{
+protected:
+
+    /* Constructor: */
+    UIWizardCloneVDPage1();
+
+    /* Handlers: */
+    void onHandleOpenSourceDiskClick();
+
+    /* Stuff for 'sourceVirtualDisk' field: */
+    CMedium sourceVirtualDisk() const;
+    void setSourceVirtualDisk(const CMedium &sourceVirtualDisk);
+
+    /* Widgets: */
+    QGroupBox *m_pSourceDiskCnt;
+    VBoxMediaComboBox *m_pSourceDiskSelector;
+    QIToolButton *m_pSourceDiskOpenButton;
+};
+
+/* 1st page of the Clone Virtual Disk wizard (basic extension): */
+class UIWizardCloneVDPageBasic1 : public UIWizardPage, public UIWizardCloneVDPage1
 {
     Q_OBJECT;
@@ -40,4 +61,9 @@
     /* Constructor: */
     UIWizardCloneVDPageBasic1(const CMedium &sourceVirtualDisk);
+
+protected:
+
+    /* Wrapper to access 'this' from base part: */
+    UIWizardPage* thisImp() { return this; }
 
 private slots:
@@ -57,13 +83,6 @@
     bool isComplete() const;
 
-    /* Stuff for 'sourceVirtualDisk' field: */
-    CMedium sourceVirtualDisk() const;
-    void setSourceVirtualDisk(const CMedium &sourceVirtualDisk);
-
     /* Widgets: */
     QIRichTextLabel *m_pLabel;
-    QGroupBox *m_pSourceDiskContainer;
-    VBoxMediaComboBox *m_pSourceDiskSelector;
-    QIToolButton *m_pOpenSourceDiskButton;
 };
 
Index: /trunk/src/VBox/Frontends/VirtualBox/src/wizards/clonevd/UIWizardCloneVDPageBasic2.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/wizards/clonevd/UIWizardCloneVDPageBasic2.cpp	(revision 41020)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/wizards/clonevd/UIWizardCloneVDPageBasic2.cpp	(revision 41021)
@@ -20,7 +20,7 @@
 /* Global includes: */
 #include <QVBoxLayout>
+#include <QButtonGroup>
+#include <QGroupBox>
 #include <QRadioButton>
-#include <QGroupBox>
-#include <QButtonGroup>
 
 /* Local includes: */
@@ -30,120 +30,9 @@
 #include "QIRichTextLabel.h"
 
-UIWizardCloneVDPageBasic2::UIWizardCloneVDPageBasic2()
-    : m_pDefaultButton(0)
+UIWizardCloneVDPage2::UIWizardCloneVDPage2()
 {
-    /* Create widgets: */
-    QVBoxLayout *pMainLayout = new QVBoxLayout(this);
-        m_pLabel = new QIRichTextLabel(this);
-        m_pFormatContainer = new QGroupBox(this);
-            m_pFormatContainer->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Fixed);
-            QVBoxLayout *pFormatsLayout = new QVBoxLayout(m_pFormatContainer);
-    pMainLayout->addWidget(m_pLabel);
-    pMainLayout->addWidget(m_pFormatContainer);
-    pMainLayout->addStretch();
-
-    /* Greate button group: */
-    m_pButtonGroup = new QButtonGroup(this);
-
-    /* Enumerate supportable formats: */
-    CSystemProperties systemProperties = vboxGlobal().virtualBox().GetSystemProperties();
-    const QVector<CMediumFormat> &medFormats = systemProperties.GetMediumFormats();
-    /* Search for default (VDI) format first: */
-    for (int i = 0; i < medFormats.size(); ++i)
-    {
-        /* Get iterated medium format: */
-        const CMediumFormat &medFormat = medFormats[i];
-        QString strFormatName(medFormat.GetName());
-        if (strFormatName == "VDI")
-        {
-            QRadioButton *pButton = addFormatButton(pFormatsLayout, medFormat);
-            if (pButton)
-            {
-                m_formats << medFormat;
-                m_formatNames << strFormatName;
-                m_pButtonGroup->addButton(pButton, m_formatNames.size() - 1);
-                m_pDefaultButton = pButton;
-            }
-        }
-    }
-    /* Look for other formats: */
-    for (int i = 0; i < medFormats.size(); ++i)
-    {
-        /* Get iterated medium format: */
-        const CMediumFormat &medFormat = medFormats[i];
-        QString strFormatName(medFormat.GetName());
-        if (strFormatName != "VDI")
-        {
-            QRadioButton *pButton = addFormatButton(pFormatsLayout, medFormat);
-            if (pButton)
-            {
-                m_formats << medFormat;
-                m_formatNames << strFormatName;
-                m_pButtonGroup->addButton(pButton, m_formatNames.size() - 1);
-            }
-        }
-    }
-    /* Check/focus default button: */
-    m_pDefaultButton->setChecked(true);
-    m_pDefaultButton->setFocus();
-
-    /* Setup connections: */
-    connect(m_pButtonGroup, SIGNAL(buttonClicked(QAbstractButton*)), this, SIGNAL(completeChanged()));
-
-    /* Register CMediumFormat class: */
-    qRegisterMetaType<CMediumFormat>();
-    /* Register 'mediumFormat' field: */
-    registerField("mediumFormat", this, "mediumFormat");
 }
 
-void UIWizardCloneVDPageBasic2::retranslateUi()
-{
-    /* Translate page: */
-    setTitle(UIWizardCloneVD::tr("Virtual disk file type"));
-
-    /* Translate widgets: */
-    m_pLabel->setText(UIWizardCloneVD::tr("Please choose the type of file that you would like "
-                                          "to use for the new virtual disk. If you do not need "
-                                          "to use it with other virtualization software you can "
-                                          "leave this setting unchanged."));
-    m_pFormatContainer->setTitle(UIWizardCloneVD::tr("File type"));
-
-    /* Translate 'format' buttons: */
-    QList<QAbstractButton*> buttons = m_pButtonGroup->buttons();
-    for (int i = 0; i < buttons.size(); ++i)
-    {
-        QAbstractButton *pButton = buttons[i];
-        pButton->setText(UIWizardCloneVD::fullFormatName(m_formatNames[m_pButtonGroup->id(pButton)]));
-    }
-}
-
-void UIWizardCloneVDPageBasic2::initializePage()
-{
-    /* Translate page: */
-    retranslateUi();
-}
-
-bool UIWizardCloneVDPageBasic2::isComplete() const
-{
-    return !mediumFormat().isNull();
-}
-
-int UIWizardCloneVDPageBasic2::nextId() const
-{
-    CMediumFormat medFormat = mediumFormat();
-    ULONG uCapabilities = medFormat.GetCapabilities();
-    int cTest = 0;
-    if (uCapabilities & KMediumFormatCapabilities_CreateDynamic)
-        ++cTest;
-    if (uCapabilities & KMediumFormatCapabilities_CreateFixed)
-        ++cTest;
-    if (uCapabilities & KMediumFormatCapabilities_CreateSplit2G)
-        ++cTest;
-    if (cTest > 1)
-        return UIWizardCloneVD::Page3;
-    return UIWizardCloneVD::Page4;
-}
-
-QRadioButton* UIWizardCloneVDPageBasic2::addFormatButton(QVBoxLayout *pFormatsLayout, CMediumFormat medFormat)
+QRadioButton* UIWizardCloneVDPage2::addFormatButton(QVBoxLayout *pFormatsLayout, CMediumFormat medFormat)
 {
     /* Check that medium format supports creation: */
@@ -161,22 +50,135 @@
 
     /* Create/add corresponding radio-button: */
-    QRadioButton *pFormatButton = new QRadioButton(m_pFormatContainer);
+    QRadioButton *pFormatButton = new QRadioButton(m_pFormatCnt);
     pFormatsLayout->addWidget(pFormatButton);
     return pFormatButton;
 }
 
-CMediumFormat UIWizardCloneVDPageBasic2::mediumFormat() const
+CMediumFormat UIWizardCloneVDPage2::mediumFormat() const
 {
-    return m_pButtonGroup->checkedButton() ? m_formats[m_pButtonGroup->checkedId()] : CMediumFormat();
+    return m_pFormatButtonGroup->checkedButton() ? m_formats[m_pFormatButtonGroup->checkedId()] : CMediumFormat();
 }
 
-void UIWizardCloneVDPageBasic2::setMediumFormat(const CMediumFormat &mediumFormat)
+void UIWizardCloneVDPage2::setMediumFormat(const CMediumFormat &mediumFormat)
 {
     int iPosition = m_formats.indexOf(mediumFormat);
     if (iPosition >= 0)
     {
-        m_pButtonGroup->button(iPosition)->click();
-        m_pButtonGroup->button(iPosition)->setFocus();
+        m_pFormatButtonGroup->button(iPosition)->click();
+        m_pFormatButtonGroup->button(iPosition)->setFocus();
     }
 }
 
+UIWizardCloneVDPageBasic2::UIWizardCloneVDPageBasic2()
+{
+    /* Create widgets: */
+    QVBoxLayout *pMainLayout = new QVBoxLayout(this);
+    {
+        m_pLabel = new QIRichTextLabel(this);
+        m_pFormatCnt = new QGroupBox(this);
+        {
+            m_pFormatCnt->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Fixed);
+            QVBoxLayout *pFormatsLayout = new QVBoxLayout(m_pFormatCnt);
+            {
+                m_pFormatButtonGroup = new QButtonGroup(this);
+                {
+                    CSystemProperties systemProperties = vboxGlobal().virtualBox().GetSystemProperties();
+                    const QVector<CMediumFormat> &medFormats = systemProperties.GetMediumFormats();
+                    for (int i = 0; i < medFormats.size(); ++i)
+                    {
+                        const CMediumFormat &medFormat = medFormats[i];
+                        QString strFormatName(medFormat.GetName());
+                        if (strFormatName == "VDI")
+                        {
+                            QRadioButton *pButton = addFormatButton(pFormatsLayout, medFormat);
+                            if (pButton)
+                            {
+                                m_formats << medFormat;
+                                m_formatNames << strFormatName;
+                                m_pFormatButtonGroup->addButton(pButton, m_formatNames.size() - 1);
+                            }
+                        }
+                    }
+                    for (int i = 0; i < medFormats.size(); ++i)
+                    {
+                        const CMediumFormat &medFormat = medFormats[i];
+                        QString strFormatName(medFormat.GetName());
+                        if (strFormatName != "VDI")
+                        {
+                            QRadioButton *pButton = addFormatButton(pFormatsLayout, medFormat);
+                            if (pButton)
+                            {
+                                m_formats << medFormat;
+                                m_formatNames << strFormatName;
+                                m_pFormatButtonGroup->addButton(pButton, m_formatNames.size() - 1);
+                            }
+                        }
+                    }
+                    m_pFormatButtonGroup->button(0)->click();
+                    m_pFormatButtonGroup->button(0)->setFocus();
+                }
+            }
+        }
+        pMainLayout->addWidget(m_pLabel);
+        pMainLayout->addWidget(m_pFormatCnt);
+        pMainLayout->addStretch();
+    }
+
+    /* Setup connections: */
+    connect(m_pFormatButtonGroup, SIGNAL(buttonClicked(QAbstractButton *)), this, SIGNAL(completeChanged()));
+
+    /* Register classes: */
+    qRegisterMetaType<CMediumFormat>();
+    /* Register fields: */
+    registerField("mediumFormat", this, "mediumFormat");
+}
+
+void UIWizardCloneVDPageBasic2::retranslateUi()
+{
+    /* Translate page: */
+    setTitle(UIWizardCloneVD::tr("Virtual disk file type"));
+
+    /* Translate widgets: */
+    m_pLabel->setText(UIWizardCloneVD::tr("Please choose the type of file that you would like "
+                                          "to use for the new virtual disk. If you do not need "
+                                          "to use it with other virtualization software you can "
+                                          "leave this setting unchanged."));
+    m_pFormatCnt->setTitle(UIWizardCloneVD::tr("File type"));
+    QList<QAbstractButton*> buttons = m_pFormatButtonGroup->buttons();
+    for (int i = 0; i < buttons.size(); ++i)
+    {
+        QAbstractButton *pButton = buttons[i];
+        pButton->setText(UIWizardCloneVD::fullFormatName(m_formatNames[m_pFormatButtonGroup->id(pButton)]));
+    }
+}
+
+void UIWizardCloneVDPageBasic2::initializePage()
+{
+    /* Translate page: */
+    retranslateUi();
+}
+
+bool UIWizardCloneVDPageBasic2::isComplete() const
+{
+    /* Make sure medium format is correct: */
+    return !mediumFormat().isNull();
+}
+
+int UIWizardCloneVDPageBasic2::nextId() const
+{
+    /* Show variant page only if there is something to show: */
+    CMediumFormat medFormat = mediumFormat();
+    ULONG uCapabilities = medFormat.GetCapabilities();
+    int cTest = 0;
+    if (uCapabilities & KMediumFormatCapabilities_CreateDynamic)
+        ++cTest;
+    if (uCapabilities & KMediumFormatCapabilities_CreateFixed)
+        ++cTest;
+    if (uCapabilities & KMediumFormatCapabilities_CreateSplit2G)
+        ++cTest;
+    if (cTest > 1)
+        return UIWizardCloneVD::Page3;
+    /* Skip otherwise: */
+    return UIWizardCloneVD::Page4;
+}
+
Index: /trunk/src/VBox/Frontends/VirtualBox/src/wizards/clonevd/UIWizardCloneVDPageBasic2.h
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/wizards/clonevd/UIWizardCloneVDPageBasic2.h	(revision 41020)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/wizards/clonevd/UIWizardCloneVDPageBasic2.h	(revision 41021)
@@ -26,11 +26,35 @@
 /* Forward declarations: */
 class QVBoxLayout;
+class QGroupBox;
+class QButtonGroup;
 class QRadioButton;
 class QIRichTextLabel;
-class QGroupBox;
-class QButtonGroup;
 
-/* 2nd page of the Clone Virtual Disk wizard: */
-class UIWizardCloneVDPageBasic2 : public UIWizardPage
+/* 2nd page of the Clone Virtual Disk wizard (base part): */
+class UIWizardCloneVDPage2 : public UIWizardPageBase
+{
+protected:
+
+    /* Constructor: */
+    UIWizardCloneVDPage2();
+
+    /* Helping stuff: */
+    QRadioButton* addFormatButton(QVBoxLayout *pFormatsLayout, CMediumFormat mediumFormat);
+
+    /* Stuff for 'mediumFormat' field: */
+    CMediumFormat mediumFormat() const;
+    void setMediumFormat(const CMediumFormat &mediumFormat);
+
+    /* Variables: */
+    QButtonGroup *m_pFormatButtonGroup;
+    QList<CMediumFormat> m_formats;
+    QStringList m_formatNames;
+
+    /* Widgets: */
+    QGroupBox *m_pFormatCnt;
+};
+
+/* 2nd page of the Clone Virtual Disk wizard (basic extension): */
+class UIWizardCloneVDPageBasic2 : public UIWizardPage, public UIWizardCloneVDPage2
 {
     Q_OBJECT;
@@ -56,20 +80,6 @@
     int nextId() const;
 
-    /* Helping stuff: */
-    QRadioButton* addFormatButton(QVBoxLayout *pFormatsLayout, CMediumFormat mediumFormat);
-
-    /* Stuff for 'mediumFormat' field: */
-    CMediumFormat mediumFormat() const;
-    void setMediumFormat(const CMediumFormat &mediumFormat);
-
-    /* Variables: */
-    QRadioButton *m_pDefaultButton;
-    QButtonGroup *m_pButtonGroup;
-    QList<CMediumFormat> m_formats;
-    QStringList m_formatNames;
-
     /* Widgets: */
     QIRichTextLabel *m_pLabel;
-    QGroupBox *m_pFormatContainer;
 };
 
Index: /trunk/src/VBox/Frontends/VirtualBox/src/wizards/clonevd/UIWizardCloneVDPageBasic3.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/wizards/clonevd/UIWizardCloneVDPageBasic3.cpp	(revision 41020)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/wizards/clonevd/UIWizardCloneVDPageBasic3.cpp	(revision 41021)
@@ -20,7 +20,8 @@
 /* Global includes: */
 #include <QVBoxLayout>
+#include <QGroupBox>
+#include <QButtonGroup>
 #include <QRadioButton>
 #include <QCheckBox>
-#include <QGroupBox>
 
 /* Local includes: */
@@ -30,37 +31,89 @@
 #include "QIRichTextLabel.h"
 
+UIWizardCloneVDPage3::UIWizardCloneVDPage3()
+{
+}
+
+qulonglong UIWizardCloneVDPage3::mediumVariant() const
+{
+    /* Initial value: */
+    qulonglong uMediumVariant = (qulonglong)KMediumVariant_Max;
+
+    /* Exclusive options: */
+    if (m_pDynamicalButton->isChecked())
+        uMediumVariant = (qulonglong)KMediumVariant_Standard;
+    else if (m_pFixedButton->isChecked())
+        uMediumVariant = (qulonglong)KMediumVariant_Fixed;
+
+    /* Additional options: */
+    if (m_pSplitBox->isChecked())
+        uMediumVariant |= (qulonglong)KMediumVariant_VmdkSplit2G;
+
+    /* Return options: */
+    return uMediumVariant;
+}
+
+void UIWizardCloneVDPage3::setMediumVariant(qulonglong uMediumVariant)
+{
+    /* Exclusive options: */
+    if (uMediumVariant & (qulonglong)KMediumVariant_Fixed)
+    {
+        m_pFixedButton->click();
+        m_pFixedButton->setFocus();
+    }
+    else
+    {
+        m_pDynamicalButton->click();
+        m_pDynamicalButton->setFocus();
+    }
+
+    /* Additional options: */
+    m_pSplitBox->setChecked(uMediumVariant & (qulonglong)KMediumVariant_VmdkSplit2G);
+}
+
 UIWizardCloneVDPageBasic3::UIWizardCloneVDPageBasic3()
-    : m_pDynamicalButton(0), m_pFixedButton(0), m_pSplitBox(0)
 {
     /* Create widgets: */
     QVBoxLayout *pMainLayout = new QVBoxLayout(this);
+    {
         m_pDescriptionLabel = new QIRichTextLabel(this);
         m_pDynamicLabel = new QIRichTextLabel(this);
         m_pFixedLabel = new QIRichTextLabel(this);
         m_pSplitLabel = new QIRichTextLabel(this);
-        m_pVariantContainer = new QGroupBox(this);
-            m_pVariantContainer->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Fixed);
-            QVBoxLayout *pVariantsLayout = new QVBoxLayout(m_pVariantContainer);
-                m_pDynamicalButton = new QRadioButton(m_pVariantContainer);
-                    m_pDynamicalButton->click();
-                    m_pDynamicalButton->setFocus();
-                m_pFixedButton = new QRadioButton(m_pVariantContainer);
-                m_pSplitBox = new QCheckBox(m_pVariantContainer);
-            pVariantsLayout->addWidget(m_pDynamicalButton);
-            pVariantsLayout->addWidget(m_pFixedButton);
-            pVariantsLayout->addWidget(m_pSplitBox);
-    pMainLayout->addWidget(m_pDescriptionLabel);
-    pMainLayout->addWidget(m_pDynamicLabel);
-    pMainLayout->addWidget(m_pFixedLabel);
-    pMainLayout->addWidget(m_pSplitLabel);
-    pMainLayout->addWidget(m_pVariantContainer);
-    pMainLayout->addStretch();
+        m_pVariantCnt = new QGroupBox(this);
+        {
+            m_pVariantCnt->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Fixed);
+            QVBoxLayout *pVariantCntLayout = new QVBoxLayout(m_pVariantCnt);
+            {
+                m_pVariantButtonGroup = new QButtonGroup(m_pVariantCnt);
+                {
+                    m_pDynamicalButton = new QRadioButton(m_pVariantCnt);
+                    {
+                        m_pDynamicalButton->click();
+                        m_pDynamicalButton->setFocus();
+                    }
+                    m_pFixedButton = new QRadioButton(m_pVariantCnt);
+                    m_pVariantButtonGroup->addButton(m_pDynamicalButton, 0);
+                    m_pVariantButtonGroup->addButton(m_pFixedButton, 1);
+                }
+                m_pSplitBox = new QCheckBox(m_pVariantCnt);
+                pVariantCntLayout->addWidget(m_pDynamicalButton);
+                pVariantCntLayout->addWidget(m_pFixedButton);
+                pVariantCntLayout->addWidget(m_pSplitBox);
+            }
+        }
+        pMainLayout->addWidget(m_pDescriptionLabel);
+        pMainLayout->addWidget(m_pDynamicLabel);
+        pMainLayout->addWidget(m_pFixedLabel);
+        pMainLayout->addWidget(m_pSplitLabel);
+        pMainLayout->addWidget(m_pVariantCnt);
+        pMainLayout->addStretch();
+    }
 
     /* Setup connections: */
-    connect(m_pDynamicalButton, SIGNAL(clicked(bool)), this, SIGNAL(completeChanged()));
-    connect(m_pFixedButton, SIGNAL(clicked(bool)), this, SIGNAL(completeChanged()));
+    connect(m_pVariantButtonGroup, SIGNAL(buttonClicked(QAbstractButton *)), this, SIGNAL(completeChanged()));
     connect(m_pSplitBox, SIGNAL(stateChanged(int)), this, SIGNAL(completeChanged()));
 
-    /* Register 'mediumVariant' field: */
+    /* Register fields: */
     registerField("mediumVariant", this, "mediumVariant");
 }
@@ -83,7 +136,6 @@
                                                "virtual machine on removable USB devices or old systems, some of which cannot "
                                                "handle very large files."));
-    m_pVariantContainer->setTitle(UIWizardCloneVD::tr("Storage details"));
 
-    /* Translate buttons: */
+    m_pVariantCnt->setTitle(UIWizardCloneVD::tr("Storage details"));
     m_pDynamicalButton->setText(UIWizardCloneVD::tr("&Dynamically allocated"));
     m_pFixedButton->setText(UIWizardCloneVD::tr("&Fixed size"));
@@ -112,42 +164,6 @@
 bool UIWizardCloneVDPageBasic3::isComplete() const
 {
+    /* Make sure medium variant is correct: */
     return mediumVariant() != (qulonglong)KMediumVariant_Max;
 }
 
-qulonglong UIWizardCloneVDPageBasic3::mediumVariant() const
-{
-    /* Initial value: */
-    qulonglong uMediumVariant = (qulonglong)KMediumVariant_Max;
-
-    /* Exclusive options: */
-    if (m_pDynamicalButton->isChecked())
-        uMediumVariant = (qulonglong)KMediumVariant_Standard;
-    else if (m_pFixedButton->isChecked())
-        uMediumVariant = (qulonglong)KMediumVariant_Fixed;
-
-    /* Additional options: */
-    if (m_pSplitBox->isChecked())
-        uMediumVariant |= (qulonglong)KMediumVariant_VmdkSplit2G;
-
-    /* Return options: */
-    return uMediumVariant;
-}
-
-void UIWizardCloneVDPageBasic3::setMediumVariant(qulonglong uMediumVariant)
-{
-    /* Exclusive options: */
-    if (uMediumVariant & (qulonglong)KMediumVariant_Fixed)
-    {
-        m_pFixedButton->click();
-        m_pFixedButton->setFocus();
-    }
-    else
-    {
-        m_pDynamicalButton->click();
-        m_pDynamicalButton->setFocus();
-    }
-
-    /* Additional options: */
-    m_pSplitBox->setChecked(uMediumVariant & (qulonglong)KMediumVariant_VmdkSplit2G);
-}
-
Index: /trunk/src/VBox/Frontends/VirtualBox/src/wizards/clonevd/UIWizardCloneVDPageBasic3.h
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/wizards/clonevd/UIWizardCloneVDPageBasic3.h	(revision 41020)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/wizards/clonevd/UIWizardCloneVDPageBasic3.h	(revision 41021)
@@ -24,11 +24,32 @@
 
 /* Forward declarations: */
+class QGroupBox;
+class QButtonGroup;
 class QRadioButton;
 class QCheckBox;
 class QIRichTextLabel;
-class QGroupBox;
 
-/* 3rd page of the Clone Virtual Disk wizard: */
-class UIWizardCloneVDPageBasic3 : public UIWizardPage
+/* 3rd page of the Clone Virtual Disk wizard (base part): */
+class UIWizardCloneVDPage3 : public UIWizardPageBase
+{
+protected:
+
+    /* Constructor: */
+    UIWizardCloneVDPage3();
+
+    /* Stuff for 'variant' field: */
+    qulonglong mediumVariant() const;
+    void setMediumVariant(qulonglong uMediumVariant);
+
+    /* Widgets: */
+    QGroupBox *m_pVariantCnt;
+    QButtonGroup *m_pVariantButtonGroup;
+    QRadioButton *m_pDynamicalButton;
+    QRadioButton *m_pFixedButton;
+    QCheckBox *m_pSplitBox;
+};
+
+/* 3rd page of the Clone Virtual Disk wizard (basic extension): */
+class UIWizardCloneVDPageBasic3 : public UIWizardPage, public UIWizardCloneVDPage3
 {
     Q_OBJECT;
@@ -51,13 +72,4 @@
     bool isComplete() const;
 
-    /* Stuff for 'variant' field: */
-    qulonglong mediumVariant() const;
-    void setMediumVariant(qulonglong uMediumVariant);
-
-    /* Variables: */
-    QRadioButton *m_pDynamicalButton;
-    QRadioButton *m_pFixedButton;
-    QCheckBox *m_pSplitBox;
-
     /* Widgets: */
     QIRichTextLabel *m_pDescriptionLabel;
@@ -65,5 +77,4 @@
     QIRichTextLabel *m_pFixedLabel;
     QIRichTextLabel *m_pSplitLabel;
-    QGroupBox *m_pVariantContainer;
 };
 
Index: /trunk/src/VBox/Frontends/VirtualBox/src/wizards/clonevd/UIWizardCloneVDPageBasic4.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/wizards/clonevd/UIWizardCloneVDPageBasic4.cpp	(revision 41020)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/wizards/clonevd/UIWizardCloneVDPageBasic4.cpp	(revision 41021)
@@ -29,4 +29,5 @@
 #include "UIWizardCloneVD.h"
 #include "COMDefs.h"
+#include "VBoxGlobal.h"
 #include "UIMessageCenter.h"
 #include "UIIconPool.h"
@@ -34,46 +35,13 @@
 #include "QIRichTextLabel.h"
 #include "QIToolButton.h"
-#include "iprt/path.h"
-
-UIWizardCloneVDPageBasic4::UIWizardCloneVDPageBasic4()
-    : m_uMediumSize(0)
-{
-    /* Create widgets: */
-    QVBoxLayout *pMainLayout = new QVBoxLayout(this);
-        m_pLabel = new QIRichTextLabel(this);
-        m_pLocationCnt = new QGroupBox(this);
-            m_pLocationCnt->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Fixed);
-            QHBoxLayout *pOptionsLayout = new QHBoxLayout(m_pLocationCnt);
-                m_pLocationEditor = new QLineEdit(m_pLocationCnt);
-                m_pLocationSelector = new QIToolButton(m_pLocationCnt);
-                    m_pLocationSelector->setAutoRaise(true);
-                    m_pLocationSelector->setIcon(UIIconPool::iconSet(":/select_file_16px.png", "select_file_dis_16px.png"));
-            pOptionsLayout->addWidget(m_pLocationEditor);
-            pOptionsLayout->addWidget(m_pLocationSelector);
-    pMainLayout->addWidget(m_pLabel);
-    pMainLayout->addWidget(m_pLocationCnt);
-    pMainLayout->addStretch();
-
-    /* Setup page connections: */
-    connect(m_pLocationEditor, SIGNAL(textChanged(const QString &)), this, SLOT(sltLocationEditorTextChanged(const QString &)));
-    connect(m_pLocationSelector, SIGNAL(clicked()), this, SLOT(sltSelectLocationButtonClicked()));
-
-    /* Register 'mediumPath', 'mediumSize' fields: */
-    registerField("mediumPath", this, "mediumPath");
-    registerField("mediumSize", this, "mediumSize");
-}
-
-void UIWizardCloneVDPageBasic4::sltLocationEditorTextChanged(const QString &strMediumName)
-{
-    /* Compose new medium path: */
-    m_strMediumPath = absoluteFilePath(toFileName(strMediumName, m_strDefaultExtension), m_strDefaultPath);
-    /* Notify wizard sub-system about complete status changed: */
-    emit completeChanged();
-}
-
-void UIWizardCloneVDPageBasic4::sltSelectLocationButtonClicked()
+
+UIWizardCloneVDPage4::UIWizardCloneVDPage4()
+{
+}
+
+void UIWizardCloneVDPage4::onSelectLocationButtonClicked()
 {
     /* Get current folder and filename: */
-    QFileInfo fullFilePath(m_strMediumPath);
+    QFileInfo fullFilePath(mediumPath());
     QDir folder = fullFilePath.path();
     QString strFileName = fullFilePath.fileName();
@@ -97,7 +65,7 @@
 
     /* Prepare backends list: */
-    CMediumFormat mediumFormat = field("mediumFormat").value<CMediumFormat>();
     QVector<QString> fileExtensions;
     QVector<KDeviceType> deviceTypes;
+    CMediumFormat mediumFormat = fieldImp("mediumFormat").value<CMediumFormat>();
     mediumFormat.DescribeFileExtensions(fileExtensions, deviceTypes);
     QStringList validExtensionList;
@@ -110,6 +78,6 @@
     /* Open corresponding file-dialog: */
     QString strChosenFilePath = QIFileDialog::getSaveFileName(folder.absoluteFilePath(strFileName),
-                                                              strBackendsList, this,
-                                                              UIWizardCloneVD::tr("Select a file for the new hard disk image file"));
+                                                              strBackendsList, thisImp(),
+                                                              VBoxGlobal::tr("Choose a virtual hard disk file"));
 
     /* If there was something really chosen: */
@@ -119,61 +87,12 @@
         if (QFileInfo(strChosenFilePath).suffix().isEmpty())
             strChosenFilePath += QString(".%1").arg(m_strDefaultExtension);
-        m_pLocationEditor->setText(QDir::toNativeSeparators(strChosenFilePath));
-        m_pLocationEditor->selectAll();
-        m_pLocationEditor->setFocus();
-    }
-}
-
-void UIWizardCloneVDPageBasic4::retranslateUi()
-{
-    /* Translate page: */
-    setTitle(UIWizardCloneVD::tr("Virtual disk file location"));
-
-    /* Translate widgets: */
-    m_pLabel->setText(UIWizardCloneVD::tr("Please type the name of the new virtual disk file into the box below or "
-                                          "click on the folder icon to select a different folder to create the file in."));
-    m_pLocationCnt->setTitle(UIWizardCloneVD::tr("&Location"));
-}
-
-void UIWizardCloneVDPageBasic4::initializePage()
-{
-    /* Translate page: */
-    retranslateUi();
-
-    /* Get source virtual-disk: */
-    const CMedium &sourceVirtualDisk = field("sourceVirtualDisk").value<CMedium>();
-    /* Get default path: */
-    m_strDefaultPath = QFileInfo(sourceVirtualDisk.GetLocation()).absolutePath();
-    /* Get default name: */
-    QString strMediumName = UIWizardCloneVD::tr("%1_copy", "copied virtual disk name")
-                                               .arg(QFileInfo(sourceVirtualDisk.GetLocation()).baseName());
-    /* Get virtual-disk size: */
-    m_uMediumSize = sourceVirtualDisk.GetLogicalSize();
-    /* Get virtual-disk extension: */
-    m_strDefaultExtension = defaultExtension(field("mediumFormat").value<CMediumFormat>());
-    /* Compose path for cloned virtual-disk: */
-    m_strMediumPath = absoluteFilePath(toFileName(strMediumName, m_strDefaultExtension), m_strDefaultPath);
-    /* Set text to location editor: */
-    m_pLocationEditor->setText(strMediumName);
-}
-
-bool UIWizardCloneVDPageBasic4::isComplete() const
-{
-    /* Check what current name is not empty! */
-    return !m_pLocationEditor->text().trimmed().isEmpty();
-}
-
-bool UIWizardCloneVDPageBasic4::validatePage()
-{
-    if (QFileInfo(m_strMediumPath).exists())
-    {
-        msgCenter().sayCannotOverwriteHardDiskStorage(this, m_strMediumPath);
-        return false;
-    }
-    return true;
+        m_pDestinationDiskEditor->setText(QDir::toNativeSeparators(strChosenFilePath));
+        m_pDestinationDiskEditor->selectAll();
+        m_pDestinationDiskEditor->setFocus();
+    }
 }
 
 /* static */
-QString UIWizardCloneVDPageBasic4::toFileName(const QString &strName, const QString &strExtension)
+QString UIWizardCloneVDPage4::toFileName(const QString &strName, const QString &strExtension)
 {
     /* Convert passed name to native separators (it can be full, actually): */
@@ -194,5 +113,5 @@
 
 /* static */
-QString UIWizardCloneVDPageBasic4::absoluteFilePath(const QString &strFileName, const QString &strDefaultPath)
+QString UIWizardCloneVDPage4::absoluteFilePath(const QString &strFileName, const QString &strDefaultPath)
 {
     /* Wrap file-info around received file name: */
@@ -209,5 +128,5 @@
 
 /* static */
-QString UIWizardCloneVDPageBasic4::defaultExtension(const CMediumFormat &mediumFormatRef)
+QString UIWizardCloneVDPage4::defaultExtension(const CMediumFormat &mediumFormatRef)
 {
     /* Load extension / device list: */
@@ -223,2 +142,101 @@
 }
 
+QString UIWizardCloneVDPage4::mediumPath() const
+{
+    return absoluteFilePath(toFileName(m_pDestinationDiskEditor->text(), m_strDefaultExtension), m_strDefaultPath);
+}
+
+qulonglong UIWizardCloneVDPage4::mediumSize() const
+{
+    const CMedium &sourceVirtualDisk = fieldImp("sourceVirtualDisk").value<CMedium>();
+    return sourceVirtualDisk.isNull() ? 0 : sourceVirtualDisk.GetLogicalSize();
+}
+
+UIWizardCloneVDPageBasic4::UIWizardCloneVDPageBasic4()
+{
+    /* Create widgets: */
+    QVBoxLayout *pMainLayout = new QVBoxLayout(this);
+    {
+        m_pLabel = new QIRichTextLabel(this);
+        m_pDestinationCnt = new QGroupBox(this);
+        {
+            m_pDestinationCnt->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Fixed);
+            QHBoxLayout *pLocationCntLayout = new QHBoxLayout(m_pDestinationCnt);
+            {
+                m_pDestinationDiskEditor = new QLineEdit(m_pDestinationCnt);
+                m_pDestinationDiskOpenButton = new QIToolButton(m_pDestinationCnt);
+                {
+                    m_pDestinationDiskOpenButton->setAutoRaise(true);
+                    m_pDestinationDiskOpenButton->setIcon(UIIconPool::iconSet(":/select_file_16px.png", "select_file_dis_16px.png"));
+                }
+                pLocationCntLayout->addWidget(m_pDestinationDiskEditor);
+                pLocationCntLayout->addWidget(m_pDestinationDiskOpenButton);
+            }
+        }
+        pMainLayout->addWidget(m_pLabel);
+        pMainLayout->addWidget(m_pDestinationCnt);
+        pMainLayout->addStretch();
+    }
+
+    /* Setup page connections: */
+    connect(m_pDestinationDiskEditor, SIGNAL(textChanged(const QString &)), this, SIGNAL(completeChanged()));
+    connect(m_pDestinationDiskOpenButton, SIGNAL(clicked()), this, SLOT(sltSelectLocationButtonClicked()));
+
+    /* Register fields: */
+    registerField("mediumPath", this, "mediumPath");
+    registerField("mediumSize", this, "mediumSize");
+}
+
+void UIWizardCloneVDPageBasic4::sltSelectLocationButtonClicked()
+{
+    /* Call to base-class: */
+    onSelectLocationButtonClicked();
+}
+
+void UIWizardCloneVDPageBasic4::retranslateUi()
+{
+    /* Translate page: */
+    setTitle(UIWizardCloneVD::tr("Virtual disk file location"));
+
+    /* Translate widgets: */
+    m_pLabel->setText(UIWizardCloneVD::tr("Please type the name of the new virtual disk file into the box below or "
+                                          "click on the folder icon to select a different folder to create the file in."));
+    m_pDestinationCnt->setTitle(UIWizardCloneVD::tr("&Location"));
+    m_pDestinationDiskOpenButton->setToolTip(UIWizardCloneVD::tr("Choose a virtual hard disk file..."));
+}
+
+void UIWizardCloneVDPageBasic4::initializePage()
+{
+    /* Translate page: */
+    retranslateUi();
+
+    /* Get source virtual-disk file-information: */
+    QFileInfo sourceFileInfo(field("sourceVirtualDisk").value<CMedium>().GetLocation());
+    /* Get default path for virtual-disk copy: */
+    m_strDefaultPath = sourceFileInfo.absolutePath();
+    /* Get default extension for virtual-disk copy: */
+    m_strDefaultExtension = defaultExtension(field("mediumFormat").value<CMediumFormat>());
+    /* Compose default-name for virtual-disk copy: */
+    QString strMediumName = UIWizardCloneVD::tr("%1_copy", "copied virtual disk name").arg(sourceFileInfo.baseName());
+    /* Set default-name as text for location editor: */
+    m_pDestinationDiskEditor->setText(strMediumName);
+}
+
+bool UIWizardCloneVDPageBasic4::isComplete() const
+{
+    /* Make sure current name is not empty: */
+    return !m_pDestinationDiskEditor->text().trimmed().isEmpty();
+}
+
+bool UIWizardCloneVDPageBasic4::validatePage()
+{
+    /* Make sure such virtual-disk doesn't exists already: */
+    QString strMediumPath(mediumPath());
+    if (QFileInfo(strMediumPath).exists())
+    {
+        msgCenter().sayCannotOverwriteHardDiskStorage(this, strMediumPath);
+        return false;
+    }
+    return true;
+}
+
Index: /trunk/src/VBox/Frontends/VirtualBox/src/wizards/clonevd/UIWizardCloneVDPageBasic4.h
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/wizards/clonevd/UIWizardCloneVDPageBasic4.h	(revision 41020)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/wizards/clonevd/UIWizardCloneVDPageBasic4.h	(revision 41021)
@@ -20,4 +20,7 @@
 #define __UIWizardCloneVDPageBasic4_h__
 
+/* Global includes: */
+#include <QVariant>
+
 /* Local includes: */
 #include "UIWizardPage.h"
@@ -25,16 +28,48 @@
 
 /* Forward declarations: */
-class QIRichTextLabel;
+class CMediumFormat;
 class QGroupBox;
 class QLineEdit;
 class QIToolButton;
-class CMediumFormat;
+class QIRichTextLabel;
 
-/* 4th page of the Clone Virtual Disk wizard: */
-class UIWizardCloneVDPageBasic4 : public UIWizardPage
+/* 4th page of the Clone Virtual Disk wizard (base part): */
+class UIWizardCloneVDPage4 : public UIWizardPageBase
+{
+protected:
+
+    /* Constructor: */
+    UIWizardCloneVDPage4();
+
+    /* Handlers: */
+    void onSelectLocationButtonClicked();
+
+    /* Location-editors stuff: */
+    static QString toFileName(const QString &strName, const QString &strExtension);
+    static QString absoluteFilePath(const QString &strFileName, const QString &strDefaultPath);
+    static QString defaultExtension(const CMediumFormat &mediumFormatRef);
+
+    /* Stuff for 'mediumPath' field: */
+    QString mediumPath() const;
+
+    /* Stuff for 'mediumSize' field: */
+    qulonglong mediumSize() const;
+
+    /* Variables: */
+    QString m_strDefaultPath;
+    QString m_strDefaultExtension;
+
+    /* Widgets: */
+    QGroupBox *m_pDestinationCnt;
+    QLineEdit *m_pDestinationDiskEditor;
+    QIToolButton *m_pDestinationDiskOpenButton;
+};
+
+/* 4th page of the Clone Virtual Disk wizard (basic extension): */
+class UIWizardCloneVDPageBasic4 : public UIWizardPage, public UIWizardCloneVDPage4
 {
     Q_OBJECT;
-    Q_PROPERTY(QString mediumPath READ mediumPath WRITE setMediumPath);
-    Q_PROPERTY(qulonglong mediumSize READ mediumSize WRITE setMediumSize);
+    Q_PROPERTY(QString mediumPath READ mediumPath);
+    Q_PROPERTY(qulonglong mediumSize READ mediumSize);
 
 public:
@@ -43,8 +78,14 @@
     UIWizardCloneVDPageBasic4();
 
+protected:
+
+    /* Wrapper to access 'this' from base part: */
+    UIWizardPage* thisImp() { return this; }
+    /* Wrapper to access 'wizard-field' from base part: */
+    QVariant fieldImp(const QString &strFieldName) const { return UIWizardPage::field(strFieldName); }
+
 private slots:
 
-    /* Location editors stuff: */
-    void sltLocationEditorTextChanged(const QString &strMediumName);
+    /* Location editor stuff: */
     void sltSelectLocationButtonClicked();
 
@@ -61,28 +102,6 @@
     bool validatePage();
 
-    /* Location-editors stuff: */
-    static QString toFileName(const QString &strName, const QString &strExtension);
-    static QString absoluteFilePath(const QString &strFileName, const QString &strDefaultPath);
-    static QString defaultExtension(const CMediumFormat &mediumFormatRef);
-
-    /* Stuff for 'mediumPath' field: */
-    QString mediumPath() const { return m_strMediumPath; }
-    void setMediumPath(const QString &strMediumPath) { m_strMediumPath = strMediumPath; }
-    QString m_strMediumPath;
-
-    /* Stuff for 'mediumSize' field: */
-    qulonglong mediumSize() const { return m_uMediumSize; }
-    void setMediumSize(qulonglong uMediumSize) { m_uMediumSize = uMediumSize; }
-    qulonglong m_uMediumSize;
-
-    /* Location-editors variables: */
-    QString m_strDefaultPath;
-    QString m_strDefaultExtension;
-
     /* Widgets: */
     QIRichTextLabel *m_pLabel;
-    QGroupBox *m_pLocationCnt;
-    QLineEdit *m_pLocationEditor;
-    QIToolButton *m_pLocationSelector;
 };
 
Index: /trunk/src/VBox/Frontends/VirtualBox/src/wizards/clonevd/UIWizardCloneVDPageBasic5.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/wizards/clonevd/UIWizardCloneVDPageBasic5.cpp	(revision 41020)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/wizards/clonevd/UIWizardCloneVDPageBasic5.cpp	(revision 41021)
@@ -24,15 +24,21 @@
 #include "QIRichTextLabel.h"
 
+UIWizardCloneVDPage5::UIWizardCloneVDPage5()
+{
+}
+
 UIWizardCloneVDPageBasic5::UIWizardCloneVDPageBasic5()
 {
     /* Create widgets: */
     QVBoxLayout *pMainLayout = new QVBoxLayout(this);
+    {
         m_pLabel1 = new QIRichTextLabel(this);
         m_pSummaryText = new QIRichTextLabel(this);
         m_pLabel2 = new QIRichTextLabel(this);
-    pMainLayout->addWidget(m_pLabel1);
-    pMainLayout->addWidget(m_pSummaryText);
-    pMainLayout->addWidget(m_pLabel2);
-    pMainLayout->addStretch();
+        pMainLayout->addWidget(m_pLabel1);
+        pMainLayout->addWidget(m_pSummaryText);
+        pMainLayout->addWidget(m_pLabel2);
+        pMainLayout->addStretch();
+    }
 }
 
@@ -81,8 +87,18 @@
 bool UIWizardCloneVDPageBasic5::validatePage()
 {
+    /* Initial result: */
+    bool fResult = true;
+
+    /* Lock finish button: */
+    startProcessing();
+
     /* Try to copy virtual-disk: */
-    startProcessing();
-    bool fResult = qobject_cast<UIWizardCloneVD*>(wizard())->copyVirtualDisk();
+    if (fResult)
+        fResult = qobject_cast<UIWizardCloneVD*>(wizard())->copyVirtualDisk();
+
+    /* Unlock finish button: */
     endProcessing();
+
+    /* Return result: */
     return fResult;
 }
Index: /trunk/src/VBox/Frontends/VirtualBox/src/wizards/clonevd/UIWizardCloneVDPageBasic5.h
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/wizards/clonevd/UIWizardCloneVDPageBasic5.h	(revision 41020)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/wizards/clonevd/UIWizardCloneVDPageBasic5.h	(revision 41021)
@@ -27,6 +27,15 @@
 class QIRichTextLabel;
 
-/* 5th page of the Clone Virtual Disk wizard: */
-class UIWizardCloneVDPageBasic5 : public UIWizardPage
+/* 5th page of the Clone Virtual Disk wizard (base part): */
+class UIWizardCloneVDPage5 : public UIWizardPageBase
+{
+protected:
+
+    /* Constructor: */
+    UIWizardCloneVDPage5();
+};
+
+/* 5th page of the Clone Virtual Disk wizard (basic extension): */
+class UIWizardCloneVDPageBasic5 : public UIWizardPage, public UIWizardCloneVDPage5
 {
     Q_OBJECT;
Index: /trunk/src/VBox/Frontends/VirtualBox/src/wizards/clonevd/UIWizardCloneVDPageExpert.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/wizards/clonevd/UIWizardCloneVDPageExpert.cpp	(revision 41021)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/wizards/clonevd/UIWizardCloneVDPageExpert.cpp	(revision 41021)
@@ -0,0 +1,297 @@
+/* $Id$ */
+/** @file
+ *
+ * VBox frontends: Qt4 GUI ("VirtualBox"):
+ * UIWizardCloneVDPageExpert class implementation
+ */
+
+/*
+ * Copyright (C) 2006-2012 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ */
+
+/* Global includes: */
+#include <QGridLayout>
+#include <QVBoxLayout>
+#include <QHBoxLayout>
+#include <QButtonGroup>
+#include <QGroupBox>
+#include <QRadioButton>
+#include <QCheckBox>
+#include <QLineEdit>
+
+/* Local includes: */
+#include "UIWizardCloneVDPageExpert.h"
+#include "UIWizardCloneVD.h"
+#include "UIMessageCenter.h"
+#include "UIIconPool.h"
+#include "VBoxMediaComboBox.h"
+#include "QIToolButton.h"
+
+UIWizardCloneVDPageExpert::UIWizardCloneVDPageExpert(const CMedium &sourceVirtualDisk)
+{
+    /* Create widgets: */
+    QGridLayout *pMainLayout = new QGridLayout(this);
+    {
+        pMainLayout->setContentsMargins(8, 6, 8, 6);
+        m_pSourceDiskCnt = new QGroupBox(this);
+        {
+            m_pSourceDiskCnt->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Fixed);
+            QHBoxLayout *pSourceDiskCntLayout = new QHBoxLayout(m_pSourceDiskCnt);
+            {
+                m_pSourceDiskSelector = new VBoxMediaComboBox(m_pSourceDiskCnt);
+                {
+                    m_pSourceDiskSelector->setSizePolicy(QSizePolicy::Ignored, QSizePolicy::Fixed);
+                    m_pSourceDiskSelector->setType(VBoxDefs::MediumType_HardDisk);
+                    m_pSourceDiskSelector->setCurrentItem(sourceVirtualDisk.GetId());
+                    m_pSourceDiskSelector->repopulate();
+                }
+                m_pSourceDiskOpenButton = new QIToolButton(m_pSourceDiskCnt);
+                {
+                    m_pSourceDiskOpenButton->setAutoRaise(true);
+                    m_pSourceDiskOpenButton->setIcon(UIIconPool::iconSet(":/select_file_16px.png", ":/select_file_dis_16px.png"));
+                }
+                pSourceDiskCntLayout->addWidget(m_pSourceDiskSelector);
+                pSourceDiskCntLayout->addWidget(m_pSourceDiskOpenButton);
+            }
+        }
+        m_pDestinationCnt = new QGroupBox(this);
+        {
+            m_pDestinationCnt->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Fixed);
+            QHBoxLayout *pLocationCntLayout = new QHBoxLayout(m_pDestinationCnt);
+            {
+                m_pDestinationDiskEditor = new QLineEdit(m_pDestinationCnt);
+                m_pDestinationDiskOpenButton = new QIToolButton(m_pDestinationCnt);
+                {
+                    m_pDestinationDiskOpenButton->setAutoRaise(true);
+                    m_pDestinationDiskOpenButton->setIcon(UIIconPool::iconSet(":/select_file_16px.png", "select_file_dis_16px.png"));
+                }
+            }
+            pLocationCntLayout->addWidget(m_pDestinationDiskEditor);
+            pLocationCntLayout->addWidget(m_pDestinationDiskOpenButton);
+        }
+        QVBoxLayout *pFormatWrappingLayout = new QVBoxLayout;
+        {
+            m_pFormatCnt = new QGroupBox(this);
+            {
+                m_pFormatCnt->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Fixed);
+                QVBoxLayout *pFormatsLayout = new QVBoxLayout(m_pFormatCnt);
+                {
+                    m_pFormatButtonGroup = new QButtonGroup(this);
+                    {
+                        CSystemProperties systemProperties = vboxGlobal().virtualBox().GetSystemProperties();
+                        const QVector<CMediumFormat> &medFormats = systemProperties.GetMediumFormats();
+                        for (int i = 0; i < medFormats.size(); ++i)
+                        {
+                            const CMediumFormat &medFormat = medFormats[i];
+                            QString strFormatName(medFormat.GetName());
+                            if (strFormatName == "VDI")
+                            {
+                                QRadioButton *pButton = addFormatButton(pFormatsLayout, medFormat);
+                                if (pButton)
+                                {
+                                    m_formats << medFormat;
+                                    m_formatNames << strFormatName;
+                                    m_pFormatButtonGroup->addButton(pButton, m_formatNames.size() - 1);
+                                }
+                            }
+                        }
+                        for (int i = 0; i < medFormats.size(); ++i)
+                        {
+                            const CMediumFormat &medFormat = medFormats[i];
+                            QString strFormatName(medFormat.GetName());
+                            if (strFormatName != "VDI")
+                            {
+                                QRadioButton *pButton = addFormatButton(pFormatsLayout, medFormat);
+                                if (pButton)
+                                {
+                                    m_formats << medFormat;
+                                    m_formatNames << strFormatName;
+                                    m_pFormatButtonGroup->addButton(pButton, m_formatNames.size() - 1);
+                                }
+                            }
+                        }
+                        m_pFormatButtonGroup->button(0)->click();
+                        m_pFormatButtonGroup->button(0)->setFocus();
+                    }
+                }
+            }
+            QSpacerItem *m_pSizeSpacer = new QSpacerItem(0, 0, QSizePolicy::Fixed, QSizePolicy::Expanding);
+            pFormatWrappingLayout->addWidget(m_pFormatCnt);
+            pFormatWrappingLayout->addItem(m_pSizeSpacer);
+        }
+        QVBoxLayout *pVariantWrappingLayout = new QVBoxLayout;
+        {
+            m_pVariantCnt = new QGroupBox(this);
+            {
+                m_pVariantCnt->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Fixed);
+                QVBoxLayout *pVariantCntLayout = new QVBoxLayout(m_pVariantCnt);
+                {
+                    m_pVariantButtonGroup = new QButtonGroup(m_pVariantCnt);
+                    {
+                        m_pDynamicalButton = new QRadioButton(m_pVariantCnt);
+                        {
+                            m_pDynamicalButton->click();
+                            m_pDynamicalButton->setFocus();
+                        }
+                        m_pFixedButton = new QRadioButton(m_pVariantCnt);
+                        m_pVariantButtonGroup->addButton(m_pDynamicalButton, 0);
+                        m_pVariantButtonGroup->addButton(m_pFixedButton, 1);
+                    }
+                    m_pSplitBox = new QCheckBox(m_pVariantCnt);
+                    pVariantCntLayout->addWidget(m_pDynamicalButton);
+                    pVariantCntLayout->addWidget(m_pFixedButton);
+                    pVariantCntLayout->addWidget(m_pSplitBox);
+                }
+            }
+            QSpacerItem *m_pSizeSpacer = new QSpacerItem(0, 0, QSizePolicy::Fixed, QSizePolicy::Expanding);
+            pVariantWrappingLayout->addWidget(m_pVariantCnt);
+            pVariantWrappingLayout->addItem(m_pSizeSpacer);
+        }
+        pMainLayout->addWidget(m_pSourceDiskCnt, 0, 0, 1, 2);
+        pMainLayout->addWidget(m_pDestinationCnt, 1, 0, 1, 2);
+        pMainLayout->addLayout(pFormatWrappingLayout, 2, 0);
+        pMainLayout->addLayout(pVariantWrappingLayout, 2, 1);
+        sltHandleSourceDiskChange();
+        sltMediumFormatChanged();
+    }
+
+    /* Setup connections: */
+    connect(m_pSourceDiskSelector, SIGNAL(currentIndexChanged(int)), this, SLOT(sltHandleSourceDiskChange()));
+    connect(m_pSourceDiskOpenButton, SIGNAL(clicked()), this, SLOT(sltHandleOpenSourceDiskClick()));
+    connect(m_pFormatButtonGroup, SIGNAL(buttonClicked(QAbstractButton*)), this, SLOT(sltMediumFormatChanged()));
+    connect(m_pVariantButtonGroup, SIGNAL(buttonClicked(QAbstractButton *)), this, SIGNAL(completeChanged()));
+    connect(m_pSplitBox, SIGNAL(stateChanged(int)), this, SIGNAL(completeChanged()));
+    connect(m_pDestinationDiskEditor, SIGNAL(textChanged(const QString &)), this, SIGNAL(completeChanged()));
+    connect(m_pDestinationDiskOpenButton, SIGNAL(clicked()), this, SLOT(sltSelectLocationButtonClicked()));
+
+    /* Register classes: */
+    qRegisterMetaType<CMedium>();
+    qRegisterMetaType<CMediumFormat>();
+    /* Register fields: */
+    registerField("sourceVirtualDisk", this, "sourceVirtualDisk");
+    registerField("mediumFormat", this, "mediumFormat");
+    registerField("mediumVariant", this, "mediumVariant");
+    registerField("mediumPath", this, "mediumPath");
+    registerField("mediumSize", this, "mediumSize");
+}
+
+void UIWizardCloneVDPageExpert::sltHandleSourceDiskChange()
+{
+    /* Get source virtual-disk file-information: */
+    QFileInfo sourceFileInfo(sourceVirtualDisk().GetLocation());
+    /* Get default path for virtual-disk copy: */
+    m_strDefaultPath = sourceFileInfo.absolutePath();
+    /* Compose name for virtual-disk copy: */
+    QString strMediumName = UIWizardCloneVD::tr("%1_copy", "copied virtual disk name").arg(sourceFileInfo.baseName());
+    /* Set text to location editor: */
+    m_pDestinationDiskEditor->setText(strMediumName);
+
+    /* Broadcast complete-change: */
+    emit completeChanged();
+}
+
+void UIWizardCloneVDPageExpert::sltHandleOpenSourceDiskClick()
+{
+    /* Call to base-class: */
+    onHandleOpenSourceDiskClick();
+}
+
+void UIWizardCloneVDPageExpert::sltMediumFormatChanged()
+{
+    /* Get medium format: */
+    CMediumFormat mf = mediumFormat();
+
+    /* Enable/disable widgets: */
+    ULONG uCapabilities = mf.GetCapabilities();
+    bool fIsCreateDynamicPossible = uCapabilities & KMediumFormatCapabilities_CreateDynamic;
+    bool fIsCreateFixedPossible = uCapabilities & KMediumFormatCapabilities_CreateFixed;
+    bool fIsCreateSplitPossible = uCapabilities & KMediumFormatCapabilities_CreateSplit2G;
+    m_pDynamicalButton->setEnabled(fIsCreateDynamicPossible);
+    m_pFixedButton->setEnabled(fIsCreateFixedPossible);
+    m_pSplitBox->setEnabled(fIsCreateSplitPossible);
+
+    /* Compose virtual-disk extension: */
+    m_strDefaultExtension = defaultExtension(mf);
+
+    /* Broadcast complete-change: */
+    emit completeChanged();
+}
+
+void UIWizardCloneVDPageExpert::sltSelectLocationButtonClicked()
+{
+    /* Call to base-class: */
+    onSelectLocationButtonClicked();
+}
+
+void UIWizardCloneVDPageExpert::retranslateUi()
+{
+    /* Translate widgets: */
+    m_pSourceDiskCnt->setTitle(UIWizardCloneVD::tr("&Source virtual disk"));
+    m_pSourceDiskOpenButton->setToolTip(UIWizardCloneVD::tr("Choose a virtual hard disk file..."));
+    m_pDestinationCnt->setTitle(UIWizardCloneVD::tr("&Destination virtual disk"));
+    m_pDestinationDiskOpenButton->setToolTip(UIWizardCloneVD::tr("Choose a virtual hard disk file..."));
+    m_pFormatCnt->setTitle(UIWizardCloneVD::tr("File type"));
+    QList<QAbstractButton*> buttons = m_pFormatButtonGroup->buttons();
+    for (int i = 0; i < buttons.size(); ++i)
+    {
+        QAbstractButton *pButton = buttons[i];
+        pButton->setText(UIWizardCloneVD::fullFormatName(m_formatNames[m_pFormatButtonGroup->id(pButton)]));
+    }
+    m_pVariantCnt->setTitle(UIWizardCloneVD::tr("Storage details"));
+    m_pDynamicalButton->setText(UIWizardCloneVD::tr("&Dynamically allocated"));
+    m_pFixedButton->setText(UIWizardCloneVD::tr("&Fixed size"));
+    m_pSplitBox->setText(UIWizardCloneVD::tr("&Split into files of less than 2GB"));
+}
+
+void UIWizardCloneVDPageExpert::initializePage()
+{
+    /* Translate page: */
+    retranslateUi();
+}
+
+bool UIWizardCloneVDPageExpert::isComplete() const
+{
+    /* Check what source virtual-disk feats the rules,
+     * medium format/variant is correct,
+     * current name is not empty: */
+    return !sourceVirtualDisk().isNull() &&
+           !mediumFormat().isNull() &&
+           mediumVariant() != (qulonglong)KMediumVariant_Max &&
+           !m_pDestinationDiskEditor->text().trimmed().isEmpty();
+}
+
+bool UIWizardCloneVDPageExpert::validatePage()
+{
+    /* Initial result: */
+    bool fResult = true;
+
+    /* Lock finish button: */
+    startProcessing();
+
+    /* Make sure such virtual-disk doesn't exists already: */
+    QString strMediumPath(mediumPath());
+    if (fResult && QFileInfo(strMediumPath).exists())
+    {
+        msgCenter().sayCannotOverwriteHardDiskStorage(this, strMediumPath);
+        fResult = false;
+    }
+
+    /* Try to copy virtual-disk: */
+    if (fResult)
+        fResult = qobject_cast<UIWizardCloneVD*>(wizard())->copyVirtualDisk();
+
+    /* Unlock finish button: */
+    endProcessing();
+
+    /* Return result: */
+    return fResult;
+}
+
Index: /trunk/src/VBox/Frontends/VirtualBox/src/wizards/clonevd/UIWizardCloneVDPageExpert.h
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/wizards/clonevd/UIWizardCloneVDPageExpert.h	(revision 41021)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/wizards/clonevd/UIWizardCloneVDPageExpert.h	(revision 41021)
@@ -0,0 +1,82 @@
+/** @file
+ *
+ * VBox frontends: Qt4 GUI ("VirtualBox"):
+ * UIWizardCloneVDPageExpert class declaration
+ */
+
+/*
+ * Copyright (C) 2006-2012 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ */
+
+#ifndef __UIWizardCloneVDPageExpert_h__
+#define __UIWizardCloneVDPageExpert_h__
+
+/* Local includes: */
+#include "UIWizardCloneVDPageBasic1.h"
+#include "UIWizardCloneVDPageBasic2.h"
+#include "UIWizardCloneVDPageBasic3.h"
+#include "UIWizardCloneVDPageBasic4.h"
+#include "UIWizardCloneVDPageBasic5.h"
+
+/* Expert page of the Clone Virtual Disk wizard: */
+class UIWizardCloneVDPageExpert : public UIWizardPage,
+                                  public UIWizardCloneVDPage1,
+                                  public UIWizardCloneVDPage2,
+                                  public UIWizardCloneVDPage3,
+                                  public UIWizardCloneVDPage4,
+                                  public UIWizardCloneVDPage5
+{
+    Q_OBJECT;
+    Q_PROPERTY(CMedium sourceVirtualDisk READ sourceVirtualDisk WRITE setSourceVirtualDisk);
+    Q_PROPERTY(CMediumFormat mediumFormat READ mediumFormat WRITE setMediumFormat);
+    Q_PROPERTY(qulonglong mediumVariant READ mediumVariant WRITE setMediumVariant);
+    Q_PROPERTY(QString mediumPath READ mediumPath);
+    Q_PROPERTY(qulonglong mediumSize READ mediumSize);
+
+public:
+
+    /* Constructor: */
+    UIWizardCloneVDPageExpert(const CMedium &sourceVirtualDisk);
+
+protected:
+
+    /* Wrapper to access 'this' from base part: */
+    UIWizardPage* thisImp() { return this; }
+    /* Wrapper to access 'wizard-field' from base part: */
+    QVariant fieldImp(const QString &strFieldName) const { return UIWizardPage::field(strFieldName); }
+
+private slots:
+
+    /* Source virtual-disk stuff: */
+    void sltHandleSourceDiskChange();
+    void sltHandleOpenSourceDiskClick();
+
+    /* Medium format stuff: */
+    void sltMediumFormatChanged();
+
+    /* Location editor stuff: */
+    void sltSelectLocationButtonClicked();
+
+private:
+
+    /* Translation stuff: */
+    void retranslateUi();
+
+    /* Prepare stuff: */
+    void initializePage();
+
+    /* Validation stuff: */
+    bool isComplete() const;
+    bool validatePage();
+};
+
+#endif // __UIWizardCloneVDPageExpert_h__
+
Index: /trunk/src/VBox/Frontends/VirtualBox/src/wizards/clonevm/UIWizardCloneVM.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/wizards/clonevm/UIWizardCloneVM.cpp	(revision 41020)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/wizards/clonevm/UIWizardCloneVM.cpp	(revision 41021)
@@ -23,31 +23,13 @@
 #include "UIWizardCloneVMPageBasic2.h"
 #include "UIWizardCloneVMPageBasic3.h"
+#include "UIWizardCloneVMPageExpert.h"
 #include "VBoxGlobal.h"
 #include "UIMessageCenter.h"
 
 UIWizardCloneVM::UIWizardCloneVM(QWidget *pParent, const CMachine &machine, CSnapshot snapshot /* = CSnapshot() */)
-    : UIWizard(pParent)
+    : UIWizard(pParent, UIWizardType_CloneVM)
     , m_machine(machine)
     , m_snapshot(snapshot)
 {
-#ifdef Q_WS_WIN
-    /* Hide window icon: */
-    setWindowIcon(QIcon());
-#endif /* Q_WS_WIN */
-
-    /* Create & add pages: */
-    setPage(Page1, new UIWizardCloneVMPageBasic1(m_machine.GetName()));
-    /* If we are having a snapshot we can show the "Linked" option. */
-    setPage(Page2, new UIWizardCloneVMPageBasic2(snapshot.isNull()));
-    /* If the machine has no snapshots, we don't bother the user about options for it. */
-    if (m_machine.GetSnapshotCount() > 0)
-        setPage(Page3, new UIWizardCloneVMPageBasic3(snapshot.isNull() ? false : snapshot.GetChildrenCount() > 0));
-
-    /* Translate wizard: */
-    retranslateUi();
-
-    /* Translate wizard pages: */
-    retranslateAllPages();
-
 #ifndef Q_WS_MAC
     /* Assign watermark: */
@@ -58,14 +40,4 @@
     assignBackground(":/vmw_clone_bg.png");
 #endif /* Q_WS_MAC */
-
-    /* Resize wizard to 'golden ratio': */
-    resizeToGoldenRatio(UIWizardType_CloneVM);
-}
-
-void UIWizardCloneVM::retranslateUi()
-{
-    /* Translate wizard: */
-    setWindowTitle(tr("Clone Virtual Machine"));
-    setButtonText(QWizard::FinishButton, tr("Clone"));
 }
 
@@ -79,10 +51,14 @@
     bool fLinked = field("linkedClone").toBool();
     /* Get clone mode: */
-    KCloneMode mode = page(Page3) ? field("cloneMode").value<KCloneMode>() : KCloneMode_MachineState;
+    KCloneMode cloneMode = (mode() == UIWizardMode_Basic && page(Page3)) ||
+                           (mode() == UIWizardMode_Expert && page(PageExpert)) ?
+                           field("cloneMode").value<KCloneMode>() : KCloneMode_MachineState;
 
+    /* Get VBox object: */
     CVirtualBox vbox = vboxGlobal().virtualBox();
-    const QString &strSettingsFile = vbox.ComposeMachineFilename(strName, QString::null);
 
+    /* Prepare machine for cloning: */
     CMachine srcMachine = m_machine;
+
     /* If the user like to create a linked clone from the current machine, we
      * have to take a little bit more action. First we create an snapshot, so
@@ -91,8 +67,10 @@
     if (fLinked && m_snapshot.isNull())
     {
-        const QString &strId = m_machine.GetId();
-        CSession session = vboxGlobal().openSession(strId);
+        /* Open session: */
+        CSession session = vboxGlobal().openSession(m_machine.GetId());
         if (session.isNull())
             return false;
+
+        /* Prepare console: */
         CConsole console = session.GetConsole();
 
@@ -132,4 +110,5 @@
 
     /* Create a new machine object. */
+    const QString &strSettingsFile = vbox.ComposeMachineFilename(strName, QString::null);
     CMachine cloneMachine = vbox.CreateMachine(strSettingsFile, strName, QString::null, QString::null, false);
     if (!vbox.isOk())
@@ -148,5 +127,5 @@
 
     /* Start cloning. */
-    CProgress progress = srcMachine.CloneTo(cloneMachine, mode, options);
+    CProgress progress = srcMachine.CloneTo(cloneMachine, cloneMode, options);
     if (!srcMachine.isOk())
     {
@@ -176,2 +155,37 @@
 }
 
+void UIWizardCloneVM::retranslateUi()
+{
+    /* Call to base-class: */
+    UIWizard::retranslateUi();
+
+    /* Translate wizard: */
+    setWindowTitle(tr("Clone Virtual Machine"));
+    setButtonText(QWizard::FinishButton, tr("Clone"));
+}
+
+void UIWizardCloneVM::prepare()
+{
+    /* Create corresponding pages: */
+    switch (mode())
+    {
+        case UIWizardMode_Basic:
+        {
+            setPage(Page1, new UIWizardCloneVMPageBasic1(m_machine.GetName()));
+            setPage(Page2, new UIWizardCloneVMPageBasic2(m_snapshot.isNull()));
+            if (m_machine.GetSnapshotCount() > 0)
+                setPage(Page3, new UIWizardCloneVMPageBasic3(m_snapshot.isNull() ? false : m_snapshot.GetChildrenCount() > 0));
+            break;
+        }
+        case UIWizardMode_Expert:
+        {
+            setPage(PageExpert, new UIWizardCloneVMPageExpert(m_machine.GetName(),
+                                                              m_snapshot.isNull(),
+                                                              m_snapshot.isNull() ? false : m_snapshot.GetChildrenCount() > 0));
+            break;
+        }
+    }
+    /* Call to base-class: */
+    UIWizard::prepare();
+}
+
Index: /trunk/src/VBox/Frontends/VirtualBox/src/wizards/clonevm/UIWizardCloneVM.h
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/wizards/clonevm/UIWizardCloneVM.h	(revision 41020)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/wizards/clonevm/UIWizardCloneVM.h	(revision 41021)
@@ -39,4 +39,10 @@
     };
 
+    /* Page IDs: */
+    enum
+    {
+        PageExpert
+    };
+
     /* Constructor: */
     UIWizardCloneVM(QWidget *pParent, const CMachine &machine, CSnapshot snapshot = CSnapshot());
@@ -51,4 +57,5 @@
     friend class UIWizardCloneVMPageBasic2;
     friend class UIWizardCloneVMPageBasic3;
+    friend class UIWizardCloneVMPageExpert;
 
 private:
@@ -56,4 +63,7 @@
     /* Translation stuff: */
     void retranslateUi();
+
+    /* Pages related stuff: */
+    void prepare();
 
     /* Variables: */
Index: /trunk/src/VBox/Frontends/VirtualBox/src/wizards/clonevm/UIWizardCloneVMPageBasic1.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/wizards/clonevm/UIWizardCloneVMPageBasic1.cpp	(revision 41020)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/wizards/clonevm/UIWizardCloneVMPageBasic1.cpp	(revision 41021)
@@ -20,4 +20,5 @@
 /* Global includes: */
 #include <QVBoxLayout>
+#include <QGroupBox>
 #include <QLineEdit>
 #include <QCheckBox>
@@ -29,22 +30,53 @@
 #include "QIRichTextLabel.h"
 
+UIWizardCloneVMPage1::UIWizardCloneVMPage1(const QString &strOriginalName)
+    : m_strOriginalName(strOriginalName)
+{
+}
+
+QString UIWizardCloneVMPage1::cloneName() const
+{
+    return m_pNameEditor->text();
+}
+
+void UIWizardCloneVMPage1::setCloneName(const QString &strName)
+{
+    m_pNameEditor->setText(strName);
+}
+
+bool UIWizardCloneVMPage1::isReinitMACsChecked() const
+{
+    return m_pReinitMACsCheckBox->isChecked();
+}
+
 UIWizardCloneVMPageBasic1::UIWizardCloneVMPageBasic1(const QString &strOriginalName)
-    : m_strOriginalName(strOriginalName)
+    : UIWizardCloneVMPage1(strOriginalName)
 {
     /* Create widgets: */
     QVBoxLayout *pMainLayout = new QVBoxLayout(this);
+    {
         m_pLabel1 = new QIRichTextLabel(this);
         m_pLabel2 = new QIRichTextLabel(this);
-        m_pNameEditor = new QLineEdit(this);
-            m_pNameEditor->setText(UIWizardCloneVM::tr("%1 Clone").arg(m_strOriginalName));
+        m_pNameCnt = new QGroupBox(this);
+        {
+            QVBoxLayout *pNameCntLayout = new QVBoxLayout(m_pNameCnt);
+            {
+                m_pNameEditor = new QLineEdit(m_pNameCnt);
+                {
+                    m_pNameEditor->setText(UIWizardCloneVM::tr("%1 Clone").arg(m_strOriginalName));
+                }
+                pNameCntLayout->addWidget(m_pNameEditor);
+            }
+        }
         m_pReinitMACsCheckBox = new QCheckBox(this);
-    pMainLayout->addWidget(m_pLabel1);
-    pMainLayout->addWidget(m_pLabel2);
-    pMainLayout->addWidget(m_pNameEditor);
-    pMainLayout->addWidget(m_pReinitMACsCheckBox);
-    pMainLayout->addStretch();
+        pMainLayout->addWidget(m_pLabel1);
+        pMainLayout->addWidget(m_pLabel2);
+        pMainLayout->addWidget(m_pNameCnt);
+        pMainLayout->addWidget(m_pReinitMACsCheckBox);
+        pMainLayout->addStretch();
+    }
 
     /* Setup connections: */
-    connect(m_pNameEditor, SIGNAL(textChanged(const QString&)), this, SIGNAL(completeChanged()));
+    connect(m_pNameEditor, SIGNAL(textChanged(const QString &)), this, SIGNAL(completeChanged()));
 
     /* Register fields: */
@@ -56,15 +88,13 @@
 {
     /* Translate page: */
-    setTitle(UIWizardCloneVM::tr("Welcome to the virtual machine clone wizard"));
+    setTitle(UIWizardCloneVM::tr("Welcome to the Clone Virtual Machine wizard!"));
 
     /* Translate widgets: */
     m_pLabel1->setText(UIWizardCloneVM::tr("<p>This wizard will help you to create a clone of your virtual machine.</p>"));
+    m_pLabel1->setText(m_pLabel1->text() + QString("<p>%1</p>").arg(standardHelpText()));
     m_pLabel2->setText(UIWizardCloneVM::tr("<p>Please choose a name for the new virtual machine:</p>"));
+    m_pNameCnt->setTitle(UIWizardCloneVM::tr("&Name"));
     m_pReinitMACsCheckBox->setToolTip(UIWizardCloneVM::tr("When checked a new unique MAC address will be assigned to all configured network cards."));
     m_pReinitMACsCheckBox->setText(UIWizardCloneVM::tr("&Reinitialize the MAC address of all network cards"));
-
-    /* Append page text with common part: */
-    QString strCommonPart = QString("<p>%1</p>").arg(standardHelpText());
-    m_pLabel1->setText(m_pLabel1->text() + strCommonPart);
 }
 
@@ -77,35 +107,7 @@
 bool UIWizardCloneVMPageBasic1::isComplete() const
 {
+    /* Make sure VM name feat the rules: */
     QString strName = m_pNameEditor->text().trimmed();
     return !strName.isEmpty() && strName != m_strOriginalName;
 }
 
-bool UIWizardCloneVMPageBasic1::validatePage()
-{
-    if (isFinalPage())
-    {
-        /* Try to create the clone: */
-        startProcessing();
-        bool fResult = qobject_cast<UIWizardCloneVM*>(wizard())->cloneVM();
-        endProcessing();
-        return fResult;
-    }
-    else
-        return true;
-}
-
-QString UIWizardCloneVMPageBasic1::cloneName() const
-{
-    return m_pNameEditor->text();
-}
-
-void UIWizardCloneVMPageBasic1::setCloneName(const QString &strName)
-{
-    m_pNameEditor->setText(strName);
-}
-
-bool UIWizardCloneVMPageBasic1::isReinitMACsChecked() const
-{
-    return m_pReinitMACsCheckBox->isChecked();
-}
-
Index: /trunk/src/VBox/Frontends/VirtualBox/src/wizards/clonevm/UIWizardCloneVMPageBasic1.h
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/wizards/clonevm/UIWizardCloneVMPageBasic1.h	(revision 41020)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/wizards/clonevm/UIWizardCloneVMPageBasic1.h	(revision 41021)
@@ -24,10 +24,35 @@
 
 /* Forward declarations: */
-class QIRichTextLabel;
+class QGroupBox;
 class QLineEdit;
 class QCheckBox;
+class QIRichTextLabel;
 
-/* 1st page of the Clone Virtual Machine wizard: */
-class UIWizardCloneVMPageBasic1 : public UIWizardPage
+/* 1st page of the Clone Virtual Machine wizard (base part): */
+class UIWizardCloneVMPage1 : public UIWizardPageBase
+{
+protected:
+
+    /* Constructor: */
+    UIWizardCloneVMPage1(const QString &strOriginalName);
+
+    /* Stuff for 'cloneName' field: */
+    QString cloneName() const;
+    void setCloneName(const QString &strName);
+
+    /* Stuff for 'reinitMACs' field: */
+    bool isReinitMACsChecked() const;
+
+    /* Variables: */
+    QString m_strOriginalName;
+
+    /* Widgets: */
+    QGroupBox *m_pNameCnt;
+    QLineEdit *m_pNameEditor;
+    QCheckBox *m_pReinitMACsCheckBox;
+};
+
+/* 1st page of the Clone Virtual Machine wizard (basic extension): */
+class UIWizardCloneVMPageBasic1 : public UIWizardPage, public UIWizardCloneVMPage1
 {
     Q_OBJECT;
@@ -50,21 +75,8 @@
     /* Validation stuff: */
     bool isComplete() const;
-    bool validatePage();
-
-    /* Stuff for 'cloneName' field: */
-    QString cloneName() const;
-    void setCloneName(const QString &strName);
-
-    /* Stuff for 'reinitMACs' field: */
-    bool isReinitMACsChecked() const;
-
-    /* Variables: */
-    QString m_strOriginalName;
 
     /* Widgets: */
     QIRichTextLabel *m_pLabel1;
     QIRichTextLabel *m_pLabel2;
-    QLineEdit *m_pNameEditor;
-    QCheckBox *m_pReinitMACsCheckBox;
 };
 
Index: /trunk/src/VBox/Frontends/VirtualBox/src/wizards/clonevm/UIWizardCloneVMPageBasic2.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/wizards/clonevm/UIWizardCloneVMPageBasic2.cpp	(revision 41020)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/wizards/clonevm/UIWizardCloneVMPageBasic2.cpp	(revision 41021)
@@ -20,4 +20,5 @@
 /* Global includes: */
 #include <QVBoxLayout>
+#include <QGroupBox>
 #include <QRadioButton>
 #include <QButtonGroup>
@@ -29,25 +30,46 @@
 #include "QIRichTextLabel.h"
 
+UIWizardCloneVMPage2::UIWizardCloneVMPage2(bool fAdditionalInfo)
+    : m_fAdditionalInfo(fAdditionalInfo)
+{
+}
+
+bool UIWizardCloneVMPage2::isLinkedClone() const
+{
+    return m_pLinkedCloneRadio->isChecked();
+}
+
 UIWizardCloneVMPageBasic2::UIWizardCloneVMPageBasic2(bool fAdditionalInfo)
-    : m_fAdditionalInfo(fAdditionalInfo)
+    : UIWizardCloneVMPage2(fAdditionalInfo)
 {
     /* Create widgets: */
     QVBoxLayout *pMainLayout = new QVBoxLayout(this);
+    {
         m_pLabel = new QIRichTextLabel(this);
-        m_pFullCloneRadio = new QRadioButton(this);
-            m_pFullCloneRadio->setChecked(true);
-        m_pLinkedCloneRadio = new QRadioButton(this);
-    pMainLayout->addWidget(m_pLabel);
-    pMainLayout->addWidget(m_pFullCloneRadio);
-    pMainLayout->addWidget(m_pLinkedCloneRadio);
-    pMainLayout->addStretch();
-
-    /* Create button-group: */
-    QButtonGroup *pButtonGroup = new QButtonGroup(this);
-    pButtonGroup->addButton(m_pFullCloneRadio);
-    pButtonGroup->addButton(m_pLinkedCloneRadio);
+        m_pCloneTypeCnt = new QGroupBox(this);
+        {
+            m_pButtonGroup = new QButtonGroup(m_pCloneTypeCnt);
+            {
+                QVBoxLayout *pCloneTypeCntLayout = new QVBoxLayout(m_pCloneTypeCnt);
+                {
+                    m_pFullCloneRadio = new QRadioButton(m_pCloneTypeCnt);
+                    {
+                        m_pFullCloneRadio->setChecked(true);
+                    }
+                    m_pLinkedCloneRadio = new QRadioButton(m_pCloneTypeCnt);
+                    pCloneTypeCntLayout->addWidget(m_pFullCloneRadio);
+                    pCloneTypeCntLayout->addWidget(m_pLinkedCloneRadio);
+                }
+                m_pButtonGroup->addButton(m_pFullCloneRadio);
+                m_pButtonGroup->addButton(m_pLinkedCloneRadio);
+            }
+        }
+        pMainLayout->addWidget(m_pLabel);
+        pMainLayout->addWidget(m_pCloneTypeCnt);
+        pMainLayout->addStretch();
+    }
 
     /* Setup connections: */
-    connect(pButtonGroup, SIGNAL(buttonClicked(QAbstractButton *)), this, SLOT(buttonClicked(QAbstractButton *)));
+    connect(m_pButtonGroup, SIGNAL(buttonClicked(QAbstractButton *)), this, SLOT(sltButtonClicked(QAbstractButton *)));
 
     /* Register fields: */
@@ -55,5 +77,5 @@
 }
 
-void UIWizardCloneVMPageBasic2::buttonClicked(QAbstractButton *pButton)
+void UIWizardCloneVMPageBasic2::sltButtonClicked(QAbstractButton *pButton)
 {
     setFinalPage(pButton != m_pFullCloneRadio);
@@ -72,8 +94,4 @@
 
     /* Translate widgets: */
-    m_pFullCloneRadio->setText(UIWizardCloneVM::tr("Full Clone"));
-    m_pLinkedCloneRadio->setText(UIWizardCloneVM::tr("Linked Clone"));
-
-    /* Set label text: */
     QString strLabel = UIWizardCloneVM::tr("<p>Please select the type of the clone.</p><p>If you choose <b>Full Clone</b> an exact copy "
                                            "(including all virtual disk images) of the original VM will be created. If you select <b>Linked Clone</b>, "
@@ -82,4 +100,8 @@
         strLabel += UIWizardCloneVM::tr("<p>Note that a new snapshot within the source VM is created in case you select <b>Linked Clone</b>.</p>");
     m_pLabel->setText(strLabel);
+
+    m_pCloneTypeCnt->setTitle(UIWizardCloneVM::tr("&Type"));
+    m_pFullCloneRadio->setText(UIWizardCloneVM::tr("Full Clone"));
+    m_pLinkedCloneRadio->setText(UIWizardCloneVM::tr("Linked Clone"));
 }
 
@@ -92,10 +114,21 @@
 bool UIWizardCloneVMPageBasic2::validatePage()
 {
+    /* This page could be final: */
     if (isFinalPage())
     {
-        /* Try to create the clone: */
+        /* Initial result: */
+        bool fResult = true;
+
+        /* Lock finish button: */
         startProcessing();
-        bool fResult = qobject_cast<UIWizardCloneVM*>(wizard())->cloneVM();
+
+        /* Trying to clone VM: */
+        if (fResult)
+            fResult = qobject_cast<UIWizardCloneVM*>(wizard())->cloneVM();
+
+        /* Unlock finish button: */
         endProcessing();
+
+        /* Return result: */
         return fResult;
     }
@@ -109,7 +142,2 @@
 }
 
-bool UIWizardCloneVMPageBasic2::isLinkedClone() const
-{
-    return m_pLinkedCloneRadio->isChecked();
-}
-
Index: /trunk/src/VBox/Frontends/VirtualBox/src/wizards/clonevm/UIWizardCloneVMPageBasic2.h
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/wizards/clonevm/UIWizardCloneVMPageBasic2.h	(revision 41020)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/wizards/clonevm/UIWizardCloneVMPageBasic2.h	(revision 41021)
@@ -24,9 +24,32 @@
 
 /* Forward declarations: */
+class QGroupBox;
+class QButtonGroup;
+class QRadioButton;
 class QIRichTextLabel;
-class QRadioButton;
 
-/* 2nd page of the Clone Virtual Machine wizard: */
-class UIWizardCloneVMPageBasic2 : public UIWizardPage
+/* 2nd page of the Clone Virtual Machine wizard (base part): */
+class UIWizardCloneVMPage2 : public UIWizardPageBase
+{
+protected:
+
+    /* Constructor: */
+    UIWizardCloneVMPage2(bool fAdditionalInfo);
+
+    /* Stuff for 'linkedClone' field: */
+    bool isLinkedClone() const;
+
+    /* Variables: */
+    bool m_fAdditionalInfo;
+
+    /* Widgets: */
+    QGroupBox *m_pCloneTypeCnt;
+    QButtonGroup *m_pButtonGroup;
+    QRadioButton *m_pFullCloneRadio;
+    QRadioButton *m_pLinkedCloneRadio;
+};
+
+/* 2nd page of the Clone Virtual Machine wizard (basic extension): */
+class UIWizardCloneVMPageBasic2 : public UIWizardPage, public UIWizardCloneVMPage2
 {
     Q_OBJECT;
@@ -41,5 +64,5 @@
 
     /* Button click handler: */
-    void buttonClicked(QAbstractButton *pButton);
+    void sltButtonClicked(QAbstractButton *pButton);
 
 private:
@@ -57,14 +80,6 @@
     int nextId() const;
 
-    /* Stuff for 'linkedClone' field: */
-    bool isLinkedClone() const;
-
-    /* Variables: */
-    bool m_fAdditionalInfo;
-
     /* Widgets: */
     QIRichTextLabel *m_pLabel;
-    QRadioButton *m_pFullCloneRadio;
-    QRadioButton *m_pLinkedCloneRadio;
 };
 
Index: /trunk/src/VBox/Frontends/VirtualBox/src/wizards/clonevm/UIWizardCloneVMPageBasic3.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/wizards/clonevm/UIWizardCloneVMPageBasic3.cpp	(revision 41020)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/wizards/clonevm/UIWizardCloneVMPageBasic3.cpp	(revision 41021)
@@ -20,4 +20,5 @@
 /* Global includes: */
 #include <QVBoxLayout>
+#include <QGroupBox>
 #include <QRadioButton>
 
@@ -27,24 +28,62 @@
 #include "QIRichTextLabel.h"
 
-UIWizardCloneVMPageBasic3::UIWizardCloneVMPageBasic3(bool fShowChildsOption /* = true */)
+UIWizardCloneVMPage3::UIWizardCloneVMPage3(bool fShowChildsOption)
     : m_fShowChildsOption(fShowChildsOption)
+{
+}
+
+KCloneMode UIWizardCloneVMPage3::cloneMode() const
+{
+    if (m_pMachineAndChildsRadio->isChecked())
+        return KCloneMode_MachineAndChildStates;
+    else if (m_pAllRadio->isChecked())
+        return KCloneMode_AllStates;
+    return KCloneMode_MachineState;
+}
+
+void UIWizardCloneVMPage3::setCloneMode(KCloneMode cloneMode)
+{
+    switch (cloneMode)
+    {
+        case KCloneMode_MachineState: m_pMachineRadio->setChecked(true); break;
+        case KCloneMode_MachineAndChildStates: m_pMachineAndChildsRadio->setChecked(true); break;
+        case KCloneMode_AllStates: m_pAllRadio->setChecked(true); break;
+    }
+}
+
+UIWizardCloneVMPageBasic3::UIWizardCloneVMPageBasic3(bool fShowChildsOption)
+    : UIWizardCloneVMPage3(fShowChildsOption)
 {
     /* Create widgets: */
     QVBoxLayout *pMainLayout = new QVBoxLayout(this);
+    {
         m_pLabel = new QIRichTextLabel(this);
-        m_pMachineRadio = new QRadioButton(this);
-            m_pMachineRadio->setChecked(true);
-        m_pMachineAndChildsRadio = new QRadioButton(this);
-            if (!m_fShowChildsOption)
-               m_pMachineAndChildsRadio->hide();
-        m_pAllRadio = new QRadioButton(this);
-    pMainLayout->addWidget(m_pLabel);
-    pMainLayout->addWidget(m_pMachineRadio);
-    pMainLayout->addWidget(m_pMachineAndChildsRadio);
-    pMainLayout->addWidget(m_pAllRadio);
-    pMainLayout->addStretch();
+        m_pCloneModeCnt = new QGroupBox(this);
+        {
+            QVBoxLayout *pCloneModeCntLayout = new QVBoxLayout(m_pCloneModeCnt);
+            {
+                m_pMachineRadio = new QRadioButton(m_pCloneModeCnt);
+                {
+                    m_pMachineRadio->setChecked(true);
+                }
+                m_pMachineAndChildsRadio = new QRadioButton(m_pCloneModeCnt);
+                {
+                    if (!m_fShowChildsOption)
+                       m_pMachineAndChildsRadio->hide();
+                }
+                m_pAllRadio = new QRadioButton(m_pCloneModeCnt);
+                pCloneModeCntLayout->addWidget(m_pMachineRadio);
+                pCloneModeCntLayout->addWidget(m_pMachineAndChildsRadio);
+                pCloneModeCntLayout->addWidget(m_pAllRadio);
+            }
+        }
+        pMainLayout->addWidget(m_pLabel);
+        pMainLayout->addWidget(m_pCloneModeCnt);
+        pMainLayout->addStretch();
+    }
 
-    /* Register KCloneMode class: */
+    /* Register classes: */
     qRegisterMetaType<KCloneMode>();
+    /* Register fields: */
     registerField("cloneMode", this, "cloneMode");
 }
@@ -56,8 +95,4 @@
 
     /* Translate widgets: */
-    m_pMachineRadio->setText(UIWizardCloneVM::tr("Current machine state"));
-    m_pMachineAndChildsRadio->setText(UIWizardCloneVM::tr("Current machine and all child states"));
-    m_pAllRadio->setText(UIWizardCloneVM::tr("All states"));
-
     const QString strGeneral = UIWizardCloneVM::tr("Please choose which parts of the virtual machine should be cloned.");
     const QString strOpt1    = UIWizardCloneVM::tr("If you select <b>Current machine state</b>, only the current state "
@@ -78,4 +113,9 @@
                           .arg(strOpt1)
                           .arg(strOpt3));
+
+    m_pCloneModeCnt->setTitle(UIWizardCloneVM::tr("&Mode"));
+    m_pMachineRadio->setText(UIWizardCloneVM::tr("Current machine state"));
+    m_pMachineAndChildsRadio->setText(UIWizardCloneVM::tr("Current machine and all child states"));
+    m_pAllRadio->setText(UIWizardCloneVM::tr("All states"));
 }
 
@@ -88,28 +128,19 @@
 bool UIWizardCloneVMPageBasic3::validatePage()
 {
+    /* Initial result: */
+    bool fResult = true;
+
+    /* Lock finish button: */
+    startProcessing();
+
     /* Try to clone VM: */
-    startProcessing();
-    bool fResult = qobject_cast<UIWizardCloneVM*>(wizard())->cloneVM();
+    if (fResult)
+        fResult = qobject_cast<UIWizardCloneVM*>(wizard())->cloneVM();
+
+    /* Unlock finish button: */
     endProcessing();
+
+    /* Return result: */
     return fResult;
 }
 
-KCloneMode UIWizardCloneVMPageBasic3::cloneMode() const
-{
-    if (m_pMachineAndChildsRadio->isChecked())
-        return KCloneMode_MachineAndChildStates;
-    else if (m_pAllRadio->isChecked())
-        return KCloneMode_AllStates;
-    return KCloneMode_MachineState;
-}
-
-void UIWizardCloneVMPageBasic3::setCloneMode(KCloneMode cloneMode)
-{
-    switch (cloneMode)
-    {
-        case KCloneMode_MachineState: m_pMachineRadio->setChecked(true); break;
-        case KCloneMode_MachineAndChildStates: m_pMachineAndChildsRadio->setChecked(true); break;
-        case KCloneMode_AllStates: m_pAllRadio->setChecked(true); break;
-    }
-}
-
Index: /trunk/src/VBox/Frontends/VirtualBox/src/wizards/clonevm/UIWizardCloneVMPageBasic3.h
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/wizards/clonevm/UIWizardCloneVMPageBasic3.h	(revision 41020)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/wizards/clonevm/UIWizardCloneVMPageBasic3.h	(revision 41021)
@@ -25,9 +25,32 @@
 
 /* Forward declaration: */
+class QGroupBox;
+class QRadioButton;
 class QIRichTextLabel;
-class QRadioButton;
 
-/* 3rd page of the Clone Virtual Machine wizard: */
-class UIWizardCloneVMPageBasic3 : public UIWizardPage
+/* 3rd page of the Clone Virtual Machine wizard (base part): */
+class UIWizardCloneVMPage3 : public UIWizardPageBase
+{
+protected:
+
+    /* Constructor: */
+    UIWizardCloneVMPage3(bool fShowChildsOption);
+
+    /* Stuff for 'cloneMode' field: */
+    KCloneMode cloneMode() const;
+    void setCloneMode(KCloneMode cloneMode);
+
+    /* Variables: */
+    bool m_fShowChildsOption;
+
+    /* Widgets: */
+    QGroupBox *m_pCloneModeCnt;
+    QRadioButton *m_pMachineRadio;
+    QRadioButton *m_pMachineAndChildsRadio;
+    QRadioButton *m_pAllRadio;
+};
+
+/* 3rd page of the Clone Virtual Machine wizard (basic extension): */
+class UIWizardCloneVMPageBasic3 : public UIWizardPage, public UIWizardCloneVMPage3
 {
     Q_OBJECT;
@@ -37,5 +60,5 @@
 
     /* Constructor: */
-    UIWizardCloneVMPageBasic3(bool fShowChildsOption = true);
+    UIWizardCloneVMPageBasic3(bool fShowChildsOption);
 
 private:
@@ -50,16 +73,6 @@
     bool validatePage();
 
-    /* Stuff for 'cloneMode' field: */
-    KCloneMode cloneMode() const;
-    void setCloneMode(KCloneMode cloneMode);
-
-    /* Variables: */
-    bool m_fShowChildsOption;
-
     /* Widgets: */
     QIRichTextLabel *m_pLabel;
-    QRadioButton *m_pMachineRadio;
-    QRadioButton *m_pMachineAndChildsRadio;
-    QRadioButton *m_pAllRadio;
 };
 
Index: /trunk/src/VBox/Frontends/VirtualBox/src/wizards/clonevm/UIWizardCloneVMPageExpert.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/wizards/clonevm/UIWizardCloneVMPageExpert.cpp	(revision 41021)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/wizards/clonevm/UIWizardCloneVMPageExpert.cpp	(revision 41021)
@@ -0,0 +1,163 @@
+/* $Id$ */
+/** @file
+ *
+ * VBox frontends: Qt4 GUI ("VirtualBox"):
+ * UIWizardCloneVMPageExpert class implementation
+ */
+
+/*
+ * Copyright (C) 2011-2012 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ */
+
+/* Global includes: */
+#include <QVBoxLayout>
+#include <QButtonGroup>
+#include <QGroupBox>
+#include <QLineEdit>
+#include <QCheckBox>
+#include <QRadioButton>
+
+/* Local includes: */
+#include "UIWizardCloneVMPageExpert.h"
+#include "UIWizardCloneVM.h"
+
+UIWizardCloneVMPageExpert::UIWizardCloneVMPageExpert(const QString &strOriginalName, bool fAdditionalInfo, bool fShowChildsOption)
+    : UIWizardCloneVMPage1(strOriginalName)
+    , UIWizardCloneVMPage2(fAdditionalInfo)
+    , UIWizardCloneVMPage3(fShowChildsOption)
+{
+    /* Create widgets: */
+    QVBoxLayout *pMainLayout = new QVBoxLayout(this);
+    {
+        pMainLayout->setContentsMargins(8, 6, 8, 6);
+        m_pNameCnt = new QGroupBox(this);
+        {
+            QVBoxLayout *pNameCntLayout = new QVBoxLayout(m_pNameCnt);
+            {
+                m_pNameEditor = new QLineEdit(m_pNameCnt);
+                {
+                    m_pNameEditor->setText(UIWizardCloneVM::tr("%1 Clone").arg(m_strOriginalName));
+                }
+                pNameCntLayout->addWidget(m_pNameEditor);
+            }
+        }
+        m_pCloneTypeCnt = new QGroupBox(this);
+        {
+            m_pButtonGroup = new QButtonGroup(m_pCloneTypeCnt);
+            {
+                QVBoxLayout *pCloneTypeCntLayout = new QVBoxLayout(m_pCloneTypeCnt);
+                {
+                    m_pFullCloneRadio = new QRadioButton(m_pCloneTypeCnt);
+                    {
+                        m_pFullCloneRadio->setChecked(true);
+                    }
+                    m_pLinkedCloneRadio = new QRadioButton(m_pCloneTypeCnt);
+                    pCloneTypeCntLayout->addWidget(m_pFullCloneRadio);
+                    pCloneTypeCntLayout->addWidget(m_pLinkedCloneRadio);
+                }
+                m_pButtonGroup->addButton(m_pFullCloneRadio);
+                m_pButtonGroup->addButton(m_pLinkedCloneRadio);
+            }
+        }
+        m_pCloneModeCnt = new QGroupBox(this);
+        {
+            QVBoxLayout *pCloneModeCntLayout = new QVBoxLayout(m_pCloneModeCnt);
+            {
+                m_pMachineRadio = new QRadioButton(m_pCloneModeCnt);
+                {
+                    m_pMachineRadio->setChecked(true);
+                }
+                m_pMachineAndChildsRadio = new QRadioButton(m_pCloneModeCnt);
+                {
+                    if (!m_fShowChildsOption)
+                       m_pMachineAndChildsRadio->hide();
+                }
+                m_pAllRadio = new QRadioButton(m_pCloneModeCnt);
+                pCloneModeCntLayout->addWidget(m_pMachineRadio);
+                pCloneModeCntLayout->addWidget(m_pMachineAndChildsRadio);
+                pCloneModeCntLayout->addWidget(m_pAllRadio);
+            }
+        }
+        m_pReinitMACsCheckBox = new QCheckBox(this);
+        pMainLayout->addWidget(m_pNameCnt);
+        pMainLayout->addWidget(m_pCloneTypeCnt);
+        pMainLayout->addWidget(m_pCloneModeCnt);
+        pMainLayout->addWidget(m_pReinitMACsCheckBox);
+        pMainLayout->addStretch();
+        sltButtonClicked(m_pFullCloneRadio);
+    }
+
+    /* Setup connections: */
+    connect(m_pNameEditor, SIGNAL(textChanged(const QString &)), this, SIGNAL(completeChanged()));
+    connect(m_pButtonGroup, SIGNAL(buttonClicked(QAbstractButton *)), this, SLOT(sltButtonClicked(QAbstractButton *)));
+
+    /* Register classes: */
+    qRegisterMetaType<KCloneMode>();
+    /* Register fields: */
+    registerField("cloneName", this, "cloneName");
+    registerField("reinitMACs", this, "reinitMACs");
+    registerField("linkedClone", this, "linkedClone");
+    registerField("cloneMode", this, "cloneMode");
+}
+
+void UIWizardCloneVMPageExpert::sltButtonClicked(QAbstractButton *pButton)
+{
+    /* Enabled/disable mode container: */
+    m_pCloneModeCnt->setEnabled(pButton == m_pFullCloneRadio);
+}
+
+void UIWizardCloneVMPageExpert::retranslateUi()
+{
+    /* Translate widgets: */
+    m_pNameCnt->setTitle(UIWizardCloneVM::tr("&Name"));
+    m_pCloneTypeCnt->setTitle(UIWizardCloneVM::tr("&Type"));
+    m_pFullCloneRadio->setText(UIWizardCloneVM::tr("Full Clone"));
+    m_pLinkedCloneRadio->setText(UIWizardCloneVM::tr("Linked Clone"));
+    m_pCloneModeCnt->setTitle(UIWizardCloneVM::tr("&Mode"));
+    m_pMachineRadio->setText(UIWizardCloneVM::tr("Current machine state"));
+    m_pMachineAndChildsRadio->setText(UIWizardCloneVM::tr("Current machine and all child states"));
+    m_pAllRadio->setText(UIWizardCloneVM::tr("All states"));
+    m_pReinitMACsCheckBox->setToolTip(UIWizardCloneVM::tr("When checked a new unique MAC address will be assigned to all configured network cards."));
+    m_pReinitMACsCheckBox->setText(UIWizardCloneVM::tr("&Reinitialize the MAC address of all network cards"));
+}
+
+void UIWizardCloneVMPageExpert::initializePage()
+{
+    /* Translate page: */
+    retranslateUi();
+}
+
+bool UIWizardCloneVMPageExpert::isComplete() const
+{
+    /* Make sure VM name feat the rules: */
+    QString strName = m_pNameEditor->text().trimmed();
+    return !strName.isEmpty() && strName != m_strOriginalName;
+}
+
+bool UIWizardCloneVMPageExpert::validatePage()
+{
+    /* Initial result: */
+    bool fResult = true;
+
+    /* Lock finish button: */
+    startProcessing();
+
+    /* Trying to clone VM: */
+    if (fResult)
+        fResult = qobject_cast<UIWizardCloneVM*>(wizard())->cloneVM();
+
+    /* Unlock finish button: */
+    endProcessing();
+
+    /* Return result: */
+    return fResult;
+}
+
Index: /trunk/src/VBox/Frontends/VirtualBox/src/wizards/clonevm/UIWizardCloneVMPageExpert.h
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/wizards/clonevm/UIWizardCloneVMPageExpert.h	(revision 41021)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/wizards/clonevm/UIWizardCloneVMPageExpert.h	(revision 41021)
@@ -0,0 +1,63 @@
+/** @file
+ *
+ * VBox frontends: Qt4 GUI ("VirtualBox"):
+ * UIWizardCloneVMPageExpert class declaration
+ */
+
+/*
+ * Copyright (C) 2011-2012 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ */
+
+#ifndef __UIWizardCloneVMPageExpert_h__
+#define __UIWizardCloneVMPageExpert_h__
+
+/* Local includes: */
+#include "UIWizardCloneVMPageBasic1.h"
+#include "UIWizardCloneVMPageBasic2.h"
+#include "UIWizardCloneVMPageBasic3.h"
+
+/* Expert page of the Clone Virtual Machine wizard: */
+class UIWizardCloneVMPageExpert : public UIWizardPage,
+                                  public UIWizardCloneVMPage1,
+                                  public UIWizardCloneVMPage2,
+                                  public UIWizardCloneVMPage3
+{
+    Q_OBJECT;
+    Q_PROPERTY(QString cloneName READ cloneName WRITE setCloneName);
+    Q_PROPERTY(bool reinitMACs READ isReinitMACsChecked);
+    Q_PROPERTY(bool linkedClone READ isLinkedClone);
+    Q_PROPERTY(KCloneMode cloneMode READ cloneMode WRITE setCloneMode);
+
+public:
+
+    /* Constructor: */
+    UIWizardCloneVMPageExpert(const QString &strOriginalName, bool fAdditionalInfo, bool fShowChildsOption);
+
+private slots:
+
+    /* Button click handler: */
+    void sltButtonClicked(QAbstractButton *pButton);
+
+private:
+
+    /* Translation stuff: */
+    void retranslateUi();
+
+    /* Prepare stuff: */
+    void initializePage();
+
+    /* Validation stuff: */
+    bool isComplete() const;
+    bool validatePage();
+};
+
+#endif // __UIWizardCloneVMPageExpert_h__
+
Index: /trunk/src/VBox/Frontends/VirtualBox/src/wizards/exportappliance/UIWizardExportApp.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/wizards/exportappliance/UIWizardExportApp.cpp	(revision 41020)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/wizards/exportappliance/UIWizardExportApp.cpp	(revision 41021)
@@ -29,22 +29,12 @@
 #include "UIWizardExportAppPageBasic3.h"
 #include "UIWizardExportAppPageBasic4.h"
+#include "UIWizardExportAppPageExpert.h"
 #include "COMDefs.h"
 #include "UIMessageCenter.h"
 
 UIWizardExportApp::UIWizardExportApp(QWidget *pParent, const QStringList &selectedVMNames)
-    : UIWizard(pParent)
-{
-    /* Create & add pages */
-    setPage(Page1, new UIWizardExportAppPageBasic1(selectedVMNames));
-    setPage(Page2, new UIWizardExportAppPageBasic2);
-    setPage(Page3, new UIWizardExportAppPageBasic3);
-    setPage(Page4, new UIWizardExportAppPageBasic4);
-
-    /* Translate wizard: */
-    retranslateUi();
-
-    /* Translate wizard pages: */
-    retranslateAllPages();
-
+    : UIWizard(pParent, UIWizardType_ExportAppliance)
+    , m_selectedVMNames(selectedVMNames)
+{
 #ifndef Q_WS_MAC
     /* Assign watermark: */
@@ -54,12 +44,4 @@
     assignBackground(":/vmw_ovf_export_bg.png");
 #endif /* Q_WS_MAC */
-
-    /* Resize wizard to 'golden ratio': */
-    resizeToGoldenRatio(UIWizardType_ExportAppliance);
-
-    /* Setup connections: */
-    AssertMsg(!field("applianceWidget").value<ExportAppliancePointer>().isNull(), ("Appliance Widget is not set!\n"));
-    connect(this, SIGNAL(customButtonClicked(int)), field("applianceWidget").value<ExportAppliancePointer>(), SLOT(restoreDefaults()));
-    connect(this, SIGNAL(currentIdChanged(int)), this, SLOT(sltCurrentIdChanged(int)));
 }
 
@@ -219,15 +201,61 @@
 }
 
+void UIWizardExportApp::sltCurrentIdChanged(int iId)
+{
+    /* Call to base-class: */
+    UIWizard::sltCurrentIdChanged(iId);
+    /* Enable 2nd button (Reset to Defaults) for 4th and Expert pages only! */
+    setOption(QWizard::HaveCustomButton2, (mode() == UIWizardMode_Basic && iId == Page4) ||
+                                          (mode() == UIWizardMode_Expert && iId == PageExpert));
+}
+
+void UIWizardExportApp::sltCustomButtonClicked(int iId)
+{
+    /* Call to base-class: */
+    UIWizard::sltCustomButtonClicked(iId);
+
+    /* Handle 2nd button: */
+    if (iId == CustomButton2)
+    {
+        /* Get appliance widget: */
+        ExportAppliancePointer pApplianceWidget = field("applianceWidget").value<ExportAppliancePointer>();
+        AssertMsg(!pApplianceWidget.isNull(), ("Appliance Widget is not set!\n"));
+        /* Reset it to default: */
+        pApplianceWidget->restoreDefaults();
+    }
+}
+
 void UIWizardExportApp::retranslateUi()
 {
+    /* Call to base-class: */
+    UIWizard::retranslateUi();
+
     /* Translate wizard: */
     setWindowTitle(tr("Appliance Export Wizard"));
-    setButtonText(QWizard::CustomButton1, tr("Restore Defaults"));
+    setButtonText(QWizard::CustomButton2, tr("Restore Defaults"));
     setButtonText(QWizard::FinishButton, tr("Export"));
 }
 
-void UIWizardExportApp::sltCurrentIdChanged(int iId)
-{
-    setOption(QWizard::HaveCustomButton1, iId == Page4);
-}
-
+void UIWizardExportApp::prepare()
+{
+    /* Create corresponding pages: */
+    switch (mode())
+    {
+        case UIWizardMode_Basic:
+        {
+            setPage(Page1, new UIWizardExportAppPageBasic1(m_selectedVMNames));
+            setPage(Page2, new UIWizardExportAppPageBasic2);
+            setPage(Page3, new UIWizardExportAppPageBasic3);
+            setPage(Page4, new UIWizardExportAppPageBasic4);
+            break;
+        }
+        case UIWizardMode_Expert:
+        {
+            setPage(PageExpert, new UIWizardExportAppPageExpert(m_selectedVMNames));
+            break;
+        }
+    }
+    /* Call to base-class: */
+    UIWizard::prepare();
+}
+
Index: /trunk/src/VBox/Frontends/VirtualBox/src/wizards/exportappliance/UIWizardExportApp.h
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/wizards/exportappliance/UIWizardExportApp.h	(revision 41020)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/wizards/exportappliance/UIWizardExportApp.h	(revision 41021)
@@ -42,4 +42,10 @@
     };
 
+    /* Page IDs: */
+    enum
+    {
+        PageExpert
+    };
+
     /* Constructor: */
     UIWizardExportApp(QWidget *pParent, const QStringList &selectedVMNames = QStringList());
@@ -53,5 +59,7 @@
 
     /* Who will be able to export appliance: */
+    friend class UIWizardExportAppPage4;
     friend class UIWizardExportAppPageBasic4;
+    friend class UIWizardExportAppPageExpert;
 
 private slots:
@@ -59,4 +67,6 @@
     /* Page change handler: */
     void sltCurrentIdChanged(int iId);
+    /* Custom button 2 click handler: */
+    void sltCustomButtonClicked(int iId);
 
 private:
@@ -64,4 +74,10 @@
     /* Translation stuff: */
     void retranslateUi();
+
+    /* Pages related stuff: */
+    void prepare();
+
+    /* Variables: */
+    QStringList m_selectedVMNames;
 };
 
Index: /trunk/src/VBox/Frontends/VirtualBox/src/wizards/exportappliance/UIWizardExportAppDefs.h
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/wizards/exportappliance/UIWizardExportAppDefs.h	(revision 41020)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/wizards/exportappliance/UIWizardExportAppDefs.h	(revision 41021)
@@ -23,4 +23,5 @@
 #include <QMetaType>
 #include <QPointer>
+#include <QListWidget>
 
 /* Local includes: */
@@ -35,4 +36,29 @@
 Q_DECLARE_METATYPE(ExportAppliancePointer);
 
+class VMListWidgetItem : public QListWidgetItem
+{
+public:
+
+    VMListWidgetItem(QPixmap &pixIcon, QString &strText, QString strUuid, bool fInSaveState, QListWidget *pParent)
+        : QListWidgetItem(pixIcon, strText, pParent)
+        , m_strUuid(strUuid)
+        , m_fInSaveState(fInSaveState)
+    {
+    }
+
+    bool operator<(const QListWidgetItem &other) const
+    {
+        return text().toLower() < other.text().toLower();
+    }
+
+    QString uuid() { return m_strUuid; }
+    bool isInSaveState() { return m_fInSaveState; }
+
+private:
+
+    QString m_strUuid;
+    bool m_fInSaveState;
+};
+
 #endif /* __UIWizardExportAppDefs_h__ */
 
Index: /trunk/src/VBox/Frontends/VirtualBox/src/wizards/exportappliance/UIWizardExportAppPageBasic1.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/wizards/exportappliance/UIWizardExportAppPageBasic1.cpp	(revision 41020)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/wizards/exportappliance/UIWizardExportAppPageBasic1.cpp	(revision 41021)
@@ -20,123 +20,19 @@
 /* Global includes: */
 #include <QVBoxLayout>
-#include <QListWidget>
 
 /* Local includes: */
 #include "UIWizardExportAppPageBasic1.h"
 #include "UIWizardExportApp.h"
+#include "UIWizardExportAppDefs.h"
 #include "VBoxGlobal.h"
 #include "UIMessageCenter.h"
+#include "QILabelSeparator.h"
 #include "QIRichTextLabel.h"
 
-class VMListWidgetItems : public QListWidgetItem
+UIWizardExportAppPage1::UIWizardExportAppPage1()
 {
-public:
-
-    VMListWidgetItems(QPixmap &pixIcon, QString &strText, QString strUuid, bool fInSaveState, QListWidget *pParent)
-        : QListWidgetItem(pixIcon, strText, pParent)
-        , m_strUuid(strUuid)
-        , m_fInSaveState(fInSaveState)
-    {
-    }
-
-    bool operator<(const QListWidgetItem &other) const
-    {
-        return text().toLower() < other.text().toLower();
-    }
-
-    QString uuid() { return m_strUuid; }
-    bool isInSaveState() { return m_fInSaveState; }
-
-private:
-
-    QString m_strUuid;
-    bool m_fInSaveState;
-};
-
-UIWizardExportAppPageBasic1::UIWizardExportAppPageBasic1(const QStringList &selectedVMNames)
-    : m_selectedVMNames(selectedVMNames)
-{
-    /* Create widgets: */
-    QVBoxLayout *pMainLayout = new QVBoxLayout(this);
-        m_pLabel = new QIRichTextLabel(this);
-        m_pVMSelector = new QListWidget(this);
-            m_pVMSelector->setAlternatingRowColors(true);
-            m_pVMSelector->setSelectionMode(QAbstractItemView::ExtendedSelection);
-            populateVMSelectorItems();
-    pMainLayout->addWidget(m_pLabel);
-    pMainLayout->addWidget(m_pVMSelector);
-
-    /* Choose initially selected items (if passed): */
-    for (int i = 0; i < m_selectedVMNames.size(); ++i)
-    {
-        QList<QListWidgetItem*> list = m_pVMSelector->findItems(m_selectedVMNames[i], Qt::MatchExactly);
-        if (list.size() > 0)
-        {
-            if (m_pVMSelector->selectedItems().isEmpty())
-                m_pVMSelector->setCurrentItem(list.first());
-            else
-                list.first()->setSelected(true);
-        }
-    }
-
-    /* Setup connections: */
-    connect(m_pVMSelector, SIGNAL(itemSelectionChanged()), this, SIGNAL(completeChanged()));
-
-    /* Register 'machineNames', 'machineIDs' fields! */
-    registerField("machineNames", this, "machineNames");
-    registerField("machineIDs", this, "machineIDs");
 }
 
-void UIWizardExportAppPageBasic1::retranslateUi()
-{
-    /* Translate page: */
-    setTitle(UIWizardExportApp::tr("Welcome to the Appliance Export Wizard!"));
-
-    /* Translate widgets: */
-    m_pLabel->setText(UIWizardExportApp::tr("<p>This wizard will guide you through the process of "
-                                            "exporting an appliance.</p><p>%1</p><p>Please select "
-                                            "the virtual machines that should be added to the "
-                                            "appliance. You can select more than one. Please note "
-                                            "that these machines have to be turned off before they "
-                                            "can be exported.</p>")
-                                            .arg(standardHelpText()));
-}
-
-void UIWizardExportAppPageBasic1::initializePage()
-{
-    /* Translate page: */
-    retranslateUi();
-}
-
-bool UIWizardExportAppPageBasic1::isComplete() const
-{
-    /* There should be at least one vm selected! */
-    return m_pVMSelector->selectedItems().size() > 0;
-}
-
-bool UIWizardExportAppPageBasic1::validatePage()
-{
-    /* Ask user machines which are in save state currently. */
-    QStringList savedMachines;
-    QList<QListWidgetItem*> pItems = m_pVMSelector->selectedItems();
-    for (int i=0; i < pItems.size(); ++i)
-    {
-        if (static_cast<VMListWidgetItems*>(pItems.at(i))->isInSaveState())
-            savedMachines << pItems.at(i)->text();
-    }
-
-    if (!savedMachines.isEmpty())
-        return msgCenter().confirmExportMachinesInSaveState(savedMachines, this);
-
-    return true;
-}
-
-int UIWizardExportAppPageBasic1::nextId() const
-{
-    /* Skip next (2nd, Storage-type) page for now! */
-    return UIWizardExportApp::Page3;
-}
-
-void UIWizardExportAppPageBasic1::populateVMSelectorItems()
+void UIWizardExportAppPage1::populateVMSelectorItems(const QStringList &selectedVMNames)
 {
     /* Add all VM items into 'VM Selector': */
@@ -163,5 +59,5 @@
             pixIcon = QPixmap(":/os_other.png").scaled(16, 16, Qt::IgnoreAspectRatio, Qt::SmoothTransformation);
         }
-        QListWidgetItem *pItem = new VMListWidgetItems(pixIcon, strName, strUuid, fInSaveState, m_pVMSelector);
+        QListWidgetItem *pItem = new VMListWidgetItem(pixIcon, strName, strUuid, fInSaveState, m_pVMSelector);
         if (!fEnabled)
             pItem->setFlags(0);
@@ -169,7 +65,20 @@
     }
     m_pVMSelector->sortItems();
+
+    /* Choose initially selected items (if passed): */
+    for (int i = 0; i < selectedVMNames.size(); ++i)
+    {
+        QList<QListWidgetItem*> list = m_pVMSelector->findItems(selectedVMNames[i], Qt::MatchExactly);
+        if (list.size() > 0)
+        {
+            if (m_pVMSelector->selectedItems().isEmpty())
+                m_pVMSelector->setCurrentItem(list.first());
+            else
+                list.first()->setSelected(true);
+        }
+    }
 }
 
-QStringList UIWizardExportAppPageBasic1::machineNames() const
+QStringList UIWizardExportAppPage1::machineNames() const
 {
     /* Prepare list: */
@@ -182,5 +91,5 @@
 }
 
-QStringList UIWizardExportAppPageBasic1::machineIDs() const
+QStringList UIWizardExportAppPage1::machineIDs() const
 {
     /* Prepare list: */
@@ -188,7 +97,91 @@
     /* Iterate over all the selected items: */
     foreach (QListWidgetItem *pItem, m_pVMSelector->selectedItems())
-        machineIDs << static_cast<VMListWidgetItems*>(pItem)->uuid();
+        machineIDs << static_cast<VMListWidgetItem*>(pItem)->uuid();
     /* Return result list: */
     return machineIDs;
 }
 
+UIWizardExportAppPageBasic1::UIWizardExportAppPageBasic1(const QStringList &selectedVMNames)
+{
+    /* Create widgets: */
+    QVBoxLayout *pMainLayout = new QVBoxLayout(this);
+    {
+        m_pLabel = new QIRichTextLabel(this);
+        m_pVMSelectorLabel = new QILabelSeparator(this);
+        {
+            m_pVMSelectorLabel->hide();
+        }
+        m_pVMSelector = new QListWidget(this);
+        {
+            m_pVMSelector->setAlternatingRowColors(true);
+            m_pVMSelector->setSelectionMode(QAbstractItemView::ExtendedSelection);
+            m_pVMSelectorLabel->setBuddy(m_pVMSelector);
+        }
+        pMainLayout->addWidget(m_pLabel);
+        pMainLayout->addWidget(m_pVMSelectorLabel);
+        pMainLayout->addWidget(m_pVMSelector);
+        populateVMSelectorItems(selectedVMNames);
+    }
+
+    /* Setup connections: */
+    connect(m_pVMSelector, SIGNAL(itemSelectionChanged()), this, SIGNAL(completeChanged()));
+
+    /* Register fields: */
+    registerField("machineNames", this, "machineNames");
+    registerField("machineIDs", this, "machineIDs");
+}
+
+void UIWizardExportAppPageBasic1::retranslateUi()
+{
+    /* Translate page: */
+    setTitle(UIWizardExportApp::tr("Welcome to the Appliance Export wizard!"));
+
+    /* Translate widgets: */
+    m_pLabel->setText(UIWizardExportApp::tr("<p>This wizard will guide you through the process of "
+                                            "exporting an appliance.</p><p>%1</p><p>Please select "
+                                            "the virtual machines that should be added to the "
+                                            "appliance. You can select more than one. Please note "
+                                            "that these machines have to be turned off before they "
+                                            "can be exported.</p>")
+                                            .arg(standardHelpText()));
+    m_pVMSelectorLabel->setText(UIWizardExportApp::tr("VM &List"));
+}
+
+void UIWizardExportAppPageBasic1::initializePage()
+{
+    /* Translate page: */
+    retranslateUi();
+}
+
+bool UIWizardExportAppPageBasic1::isComplete() const
+{
+    /* There should be at least one vm selected: */
+    return m_pVMSelector->selectedItems().size() > 0;
+}
+
+bool UIWizardExportAppPageBasic1::validatePage()
+{
+    /* Initial result: */
+    bool fResult = true;
+
+    /* Ask user about machines which are in save state currently: */
+    QStringList savedMachines;
+    QList<QListWidgetItem*> pItems = m_pVMSelector->selectedItems();
+    for (int i=0; i < pItems.size(); ++i)
+    {
+        if (static_cast<VMListWidgetItem*>(pItems.at(i))->isInSaveState())
+            savedMachines << pItems.at(i)->text();
+    }
+    if (!savedMachines.isEmpty())
+        fResult = msgCenter().confirmExportMachinesInSaveState(savedMachines, this);
+
+    /* Return result: */
+    return fResult;
+}
+
+int UIWizardExportAppPageBasic1::nextId() const
+{
+    /* Skip next (2nd, storage-type) page for now! */
+    return UIWizardExportApp::Page3;
+}
+
Index: /trunk/src/VBox/Frontends/VirtualBox/src/wizards/exportappliance/UIWizardExportAppPageBasic1.h
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/wizards/exportappliance/UIWizardExportAppPageBasic1.h	(revision 41020)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/wizards/exportappliance/UIWizardExportAppPageBasic1.h	(revision 41021)
@@ -24,9 +24,32 @@
 
 /* Forward declarations: */
+class QILabelSeparator;
+class QListWidget;
 class QIRichTextLabel;
-class QListWidget;
 
-/* 1st page of the Export Appliance wizard: */
-class UIWizardExportAppPageBasic1 : public UIWizardPage
+/* 1st page of the Export Appliance wizard (base part): */
+class UIWizardExportAppPage1 : public UIWizardPageBase
+{
+protected:
+
+    /* Constructor: */
+    UIWizardExportAppPage1();
+
+    /* Helping stuff: */
+    void populateVMSelectorItems(const QStringList &selectedVMNames);
+
+    /* Stuff for 'machineNames' field: */
+    QStringList machineNames() const;
+
+    /* Stuff for 'machineIDs' field: */
+    QStringList machineIDs() const;
+
+    /* Widgets: */
+    QILabelSeparator *m_pVMSelectorLabel;
+    QListWidget *m_pVMSelector;
+};
+
+/* 1st page of the Export Appliance wizard (basic extension): */
+class UIWizardExportAppPageBasic1 : public UIWizardPage, public UIWizardExportAppPage1
 {
     Q_OBJECT;
@@ -54,19 +77,6 @@
     int nextId() const;
 
-    /* Helping stuff: */
-    void populateVMSelectorItems();
-
-    /* Stuff for 'machineNames' field: */
-    QStringList machineNames() const;
-
-    /* Stuff for 'machineIDs' field: */
-    QStringList machineIDs() const;
-
-    /* Variables: */
-    QStringList m_selectedVMNames;
-
     /* Widgets: */
     QIRichTextLabel *m_pLabel;
-    QListWidget *m_pVMSelector;
 };
 
Index: /trunk/src/VBox/Frontends/VirtualBox/src/wizards/exportappliance/UIWizardExportAppPageBasic2.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/wizards/exportappliance/UIWizardExportAppPageBasic2.cpp	(revision 41020)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/wizards/exportappliance/UIWizardExportAppPageBasic2.cpp	(revision 41021)
@@ -20,4 +20,5 @@
 /* Global includes: */
 #include <QVBoxLayout>
+#include <QGroupBox>
 #include <QRadioButton>
 
@@ -27,18 +28,10 @@
 #include "QIRichTextLabel.h"
 
-UIWizardExportAppPageBasic2::UIWizardExportAppPageBasic2()
+UIWizardExportAppPage2::UIWizardExportAppPage2()
 {
-    /* Create widgets: */
-    QVBoxLayout *pMainLayout = new QVBoxLayout(this);
-        m_pLabel = new QIRichTextLabel(this);
-        m_pTypeLocalFilesystem = new QRadioButton(this);
-        m_pTypeSunCloud = new QRadioButton(this);
-        m_pTypeSimpleStorageSystem = new QRadioButton(this);
-    pMainLayout->addWidget(m_pLabel);
-    pMainLayout->addWidget(m_pTypeLocalFilesystem);
-    pMainLayout->addWidget(m_pTypeSunCloud);
-    pMainLayout->addWidget(m_pTypeSimpleStorageSystem);
-    pMainLayout->addStretch();
+}
 
+void UIWizardExportAppPage2::chooseDefaultStorageType()
+{
     /* Select default storage type: */
 #if 0
@@ -52,38 +45,7 @@
     setStorageType(Filesystem);
 #endif
-
-    /* Setup connections: */
-    connect(m_pTypeLocalFilesystem, SIGNAL(clicked()), this, SIGNAL(completeChanged()));
-    connect(m_pTypeSunCloud, SIGNAL(clicked()), this, SIGNAL(completeChanged()));
-    connect(m_pTypeSimpleStorageSystem, SIGNAL(clicked()), this, SIGNAL(completeChanged()));
-
-    /* Register StorageType class: */
-    qRegisterMetaType<StorageType>();
-    /* Register 'storageType' field! */
-    registerField("storageType", this, "storageType");
 }
 
-void UIWizardExportAppPageBasic2::retranslateUi()
-{
-    /* Translate page: */
-    setTitle(UIWizardExportApp::tr("Appliance Export Settings"));
-
-    /* Translate widgets: */
-    m_pLabel->setText(UIWizardExportApp::tr("Please specify the target for the OVF export. "
-                                            "You can choose between a local file system export, "
-                                            "uploading the OVF to the Sun Cloud service "
-                                            "or an S3 storage server."));
-    m_pTypeLocalFilesystem->setText(UIWizardExportApp::tr("&Local Filesystem "));
-    m_pTypeSunCloud->setText(UIWizardExportApp::tr("Sun &Cloud"));
-    m_pTypeSimpleStorageSystem->setText(UIWizardExportApp::tr("&Simple Storage System (S3)"));
-}
-
-void UIWizardExportAppPageBasic2::initializePage()
-{
-    /* Translate page: */
-    retranslateUi();
-}
-
-StorageType UIWizardExportAppPageBasic2::storageType() const
+StorageType UIWizardExportAppPage2::storageType() const
 {
     if (m_pTypeSunCloud->isChecked())
@@ -94,5 +56,5 @@
 }
 
-void UIWizardExportAppPageBasic2::setStorageType(StorageType storageType)
+void UIWizardExportAppPage2::setStorageType(StorageType storageType)
 {
     switch (storageType)
@@ -113,2 +75,59 @@
 }
 
+UIWizardExportAppPageBasic2::UIWizardExportAppPageBasic2()
+{
+    /* Create widgets: */
+    QVBoxLayout *pMainLayout = new QVBoxLayout(this);
+    {
+        m_pLabel = new QIRichTextLabel(this);
+        m_pTypeCnt = new QGroupBox(this);
+        {
+            QVBoxLayout *pTypeCntLayout = new QVBoxLayout(m_pTypeCnt);
+            {
+                m_pTypeLocalFilesystem = new QRadioButton(m_pTypeCnt);
+                m_pTypeSunCloud = new QRadioButton(m_pTypeCnt);
+                m_pTypeSimpleStorageSystem = new QRadioButton(m_pTypeCnt);
+                pTypeCntLayout->addWidget(m_pTypeLocalFilesystem);
+                pTypeCntLayout->addWidget(m_pTypeSunCloud);
+                pTypeCntLayout->addWidget(m_pTypeSimpleStorageSystem);
+            }
+        }
+        pMainLayout->addWidget(m_pLabel);
+        pMainLayout->addWidget(m_pTypeCnt);
+        pMainLayout->addStretch();
+        chooseDefaultStorageType();
+    }
+
+    /* Setup connections: */
+    connect(m_pTypeLocalFilesystem, SIGNAL(clicked()), this, SIGNAL(completeChanged()));
+    connect(m_pTypeSunCloud, SIGNAL(clicked()), this, SIGNAL(completeChanged()));
+    connect(m_pTypeSimpleStorageSystem, SIGNAL(clicked()), this, SIGNAL(completeChanged()));
+
+    /* Register classes: */
+    qRegisterMetaType<StorageType>();
+    /* Register fields: */
+    registerField("storageType", this, "storageType");
+}
+
+void UIWizardExportAppPageBasic2::retranslateUi()
+{
+    /* Translate page: */
+    setTitle(UIWizardExportApp::tr("Appliance Export Settings"));
+
+    /* Translate widgets: */
+    m_pLabel->setText(UIWizardExportApp::tr("Please specify the target for the OVF export. "
+                                            "You can choose between a local file system export, "
+                                            "uploading the OVF to the Sun Cloud service "
+                                            "or an S3 storage server."));
+    m_pTypeCnt->setTitle(UIWizardExportApp::tr("&Destination"));
+    m_pTypeLocalFilesystem->setText(UIWizardExportApp::tr("&Local Filesystem "));
+    m_pTypeSunCloud->setText(UIWizardExportApp::tr("Sun &Cloud"));
+    m_pTypeSimpleStorageSystem->setText(UIWizardExportApp::tr("&Simple Storage System (S3)"));
+}
+
+void UIWizardExportAppPageBasic2::initializePage()
+{
+    /* Translate page: */
+    retranslateUi();
+}
+
Index: /trunk/src/VBox/Frontends/VirtualBox/src/wizards/exportappliance/UIWizardExportAppPageBasic2.h
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/wizards/exportappliance/UIWizardExportAppPageBasic2.h	(revision 41020)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/wizards/exportappliance/UIWizardExportAppPageBasic2.h	(revision 41021)
@@ -25,9 +25,32 @@
 
 /* Forward declarations: */
+class QGroupBox;
+class QRadioButton;
 class QIRichTextLabel;
-class QRadioButton;
 
-/* 2nd page of the Export Appliance wizard: */
-class UIWizardExportAppPageBasic2 : public UIWizardPage
+/* 2nd page of the Export Appliance wizard (base part): */
+class UIWizardExportAppPage2 : public UIWizardPageBase
+{
+protected:
+
+    /* Constructor: */
+    UIWizardExportAppPage2();
+
+    /* Helpers: */
+    void chooseDefaultStorageType();
+
+    /* Stuff for 'storageType' field: */
+    StorageType storageType() const;
+    void setStorageType(StorageType storageType);
+
+    /* Widgets: */
+    QGroupBox *m_pTypeCnt;
+    QRadioButton *m_pTypeLocalFilesystem;
+    QRadioButton *m_pTypeSunCloud;
+    QRadioButton *m_pTypeSimpleStorageSystem;
+};
+
+/* 2nd page of the Export Appliance wizard (basic extension): */
+class UIWizardExportAppPageBasic2 : public UIWizardPage, public UIWizardExportAppPage2
 {
     Q_OBJECT;
@@ -47,13 +70,6 @@
     void initializePage();
 
-    /* Stuff for 'storageType' field: */
-    StorageType storageType() const;
-    void setStorageType(StorageType storageType);
-
     /* Widgets: */
     QIRichTextLabel *m_pLabel;
-    QRadioButton *m_pTypeLocalFilesystem;
-    QRadioButton *m_pTypeSunCloud;
-    QRadioButton *m_pTypeSimpleStorageSystem;
 };
 
Index: /trunk/src/VBox/Frontends/VirtualBox/src/wizards/exportappliance/UIWizardExportAppPageBasic3.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/wizards/exportappliance/UIWizardExportAppPageBasic3.cpp	(revision 41020)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/wizards/exportappliance/UIWizardExportAppPageBasic3.cpp	(revision 41021)
@@ -31,6 +31,154 @@
 #include "UIWizardExportAppDefs.h"
 #include "VBoxGlobal.h"
+#include "VBoxFilePathSelectorWidget.h"
 #include "QIRichTextLabel.h"
-#include "VBoxFilePathSelectorWidget.h"
+
+UIWizardExportAppPage3::UIWizardExportAppPage3()
+{
+}
+
+void UIWizardExportAppPage3::chooseDefaultSettings()
+{
+    /* Select default settings: */
+#if 0
+    m_pUsernameEditor->setText(vboxGlobal().virtualBox().GetExtraData(VBoxDefs::GUI_Export_Username));
+    m_pHostnameEditor->setText(vboxGlobal().virtualBox().GetExtraData(VBoxDefs::GUI_Export_Hostname));
+    m_pBucketEditor->setText(vboxGlobal().virtualBox().GetExtraData(VBoxDefs::GUI_Export_Bucket));
+#else
+    /* Do nothing for now... */
+#endif
+}
+
+void UIWizardExportAppPage3::refreshCurrentSettings()
+{
+    /* Setup components for chosen storage-type: */
+    StorageType storageType = fieldImp("storageType").value<StorageType>();
+    switch (storageType)
+    {
+        case Filesystem:
+        {
+            m_pUsernameLabel->setVisible(false);
+            m_pUsernameEditor->setVisible(false);
+            m_pPasswordLabel->setVisible(false);
+            m_pPasswordEditor->setVisible(false);
+            m_pHostnameLabel->setVisible(false);
+            m_pHostnameEditor->setVisible(false);
+            m_pBucketLabel->setVisible(false);
+            m_pBucketEditor->setVisible(false);
+            m_pOVF09Checkbox->setVisible(true);
+            m_pFileSelector->setChooserVisible(true);
+            break;
+        }
+        case SunCloud:
+        {
+            m_pUsernameLabel->setVisible(true);
+            m_pUsernameEditor->setVisible(true);
+            m_pPasswordLabel->setVisible(true);
+            m_pPasswordEditor->setVisible(true);
+            m_pHostnameLabel->setVisible(false);
+            m_pHostnameEditor->setVisible(false);
+            m_pBucketLabel->setVisible(true);
+            m_pBucketEditor->setVisible(true);
+            m_pOVF09Checkbox->setVisible(false);
+            m_pOVF09Checkbox->setChecked(false);
+            m_pFileSelector->setChooserVisible(false);
+            break;
+        }
+        case S3:
+        {
+            m_pUsernameLabel->setVisible(true);
+            m_pUsernameEditor->setVisible(true);
+            m_pPasswordLabel->setVisible(true);
+            m_pPasswordEditor->setVisible(true);
+            m_pHostnameLabel->setVisible(true);
+            m_pHostnameEditor->setVisible(true);
+            m_pBucketLabel->setVisible(true);
+            m_pBucketEditor->setVisible(true);
+            m_pOVF09Checkbox->setVisible(true);
+            m_pFileSelector->setChooserVisible(false);
+            break;
+        }
+    }
+
+    /* Use the default filename: */
+    QString strName = m_strDefaultApplianceName;
+    /* If it is one VM only, we use the VM name as filename: */
+    if (fieldImp("machineNames").toStringList().size() == 1)
+        strName = fieldImp("machineNames").toStringList()[0];
+    strName += ".ova";
+    if (storageType == Filesystem)
+        strName = QDir::toNativeSeparators(QString("%1/%2").arg(vboxGlobal().documentsPath()).arg(strName));
+    m_pFileSelector->setPath(strName);
+}
+
+bool UIWizardExportAppPage3::isOVF09Selected() const
+{
+    return m_pOVF09Checkbox->isChecked();
+}
+
+void UIWizardExportAppPage3::setOVF09Selected(bool fChecked)
+{
+    m_pOVF09Checkbox->setChecked(fChecked);
+}
+
+bool UIWizardExportAppPage3::isManifestSelected() const
+{
+    return m_pManifestCheckbox->isChecked();
+}
+
+void UIWizardExportAppPage3::setManifestSelected(bool fChecked)
+{
+    m_pManifestCheckbox->setChecked(fChecked);
+}
+
+QString UIWizardExportAppPage3::username() const
+{
+    return m_pUsernameEditor->text();
+}
+
+void UIWizardExportAppPage3::setUserName(const QString &strUserName)
+{
+    m_pUsernameEditor->setText(strUserName);
+}
+
+QString UIWizardExportAppPage3::password() const
+{
+    return m_pPasswordEditor->text();
+}
+
+void UIWizardExportAppPage3::setPassword(const QString &strPassword)
+{
+    m_pPasswordEditor->setText(strPassword);
+}
+
+QString UIWizardExportAppPage3::hostname() const
+{
+    return m_pHostnameEditor->text();
+}
+
+void UIWizardExportAppPage3::setHostname(const QString &strHostname)
+{
+    m_pHostnameEditor->setText(strHostname);
+}
+
+QString UIWizardExportAppPage3::bucket() const
+{
+    return m_pBucketEditor->text();
+}
+
+void UIWizardExportAppPage3::setBucket(const QString &strBucket)
+{
+    m_pBucketEditor->setText(strBucket);
+}
+
+QString UIWizardExportAppPage3::path() const
+{
+    return m_pFileSelector->path();
+}
+
+void UIWizardExportAppPage3::setPath(const QString &strPath)
+{
+    m_pFileSelector->setPath(strPath);
+}
 
 UIWizardExportAppPageBasic3::UIWizardExportAppPageBasic3()
@@ -38,51 +186,67 @@
     /* Create widgets: */
     QVBoxLayout *pMainLayout = new QVBoxLayout(this);
+    {
         m_pLabel = new QIRichTextLabel(this);
         QGridLayout *pSettingsLayout = new QGridLayout;
+        {
             m_pUsernameEditor = new QLineEdit(this);
-                //m_pUsernameEditor->setText(vboxGlobal().virtualBox().GetExtraData(VBoxDefs::GUI_Export_Username));
             m_pUsernameLabel = new QLabel(this);
+            {
                 m_pUsernameLabel->setAlignment(Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter);
                 m_pUsernameLabel->setBuddy(m_pUsernameEditor);
+            }
             m_pPasswordEditor = new QLineEdit(this);
+            {
                 m_pPasswordEditor->setEchoMode(QLineEdit::Password);
+            }
             m_pPasswordLabel = new QLabel(this);
+            {
                 m_pPasswordLabel->setAlignment(Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter);
                 m_pPasswordLabel->setBuddy(m_pPasswordEditor);
+            }
             m_pHostnameEditor = new QLineEdit(this);
-                //m_pHostnameEditor->setText(vboxGlobal().virtualBox().GetExtraData(VBoxDefs::GUI_Export_Hostname));
             m_pHostnameLabel = new QLabel(this);
+            {
                 m_pHostnameLabel->setAlignment(Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter);
                 m_pHostnameLabel->setBuddy(m_pHostnameEditor);
+            }
             m_pBucketEditor = new QLineEdit(this);
-                //m_pBucketEditor->setText(vboxGlobal().virtualBox().GetExtraData(VBoxDefs::GUI_Export_Bucket));
             m_pBucketLabel = new QLabel(this);
+            {
                 m_pBucketLabel->setAlignment(Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter);
                 m_pBucketLabel->setBuddy(m_pBucketEditor);
+            }
             m_pFileSelector = new VBoxEmptyFileSelector(this);
+            {
                 m_pFileSelector->setMode(VBoxFilePathSelectorWidget::Mode_File_Save);
                 m_pFileSelector->setEditable(true);
                 m_pFileSelector->setButtonPosition(VBoxEmptyFileSelector::RightPosition);
                 m_pFileSelector->setDefaultSaveExt("ova");
+            }
             m_pFileSelectorLabel = new QLabel(this);
+            {
                 m_pFileSelectorLabel->setAlignment(Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter);
                 m_pFileSelectorLabel->setBuddy(m_pFileSelector);
-        pSettingsLayout->addWidget(m_pUsernameLabel, 0, 0);
-        pSettingsLayout->addWidget(m_pUsernameEditor, 0, 1);
-        pSettingsLayout->addWidget(m_pPasswordLabel, 1, 0);
-        pSettingsLayout->addWidget(m_pPasswordEditor, 1, 1);
-        pSettingsLayout->addWidget(m_pHostnameLabel, 2, 0);
-        pSettingsLayout->addWidget(m_pHostnameEditor, 2, 1);
-        pSettingsLayout->addWidget(m_pBucketLabel, 3, 0);
-        pSettingsLayout->addWidget(m_pBucketEditor, 3, 1);
-        pSettingsLayout->addWidget(m_pFileSelectorLabel, 4, 0);
-        pSettingsLayout->addWidget(m_pFileSelector, 4, 1);
+            }
+            pSettingsLayout->addWidget(m_pUsernameLabel, 0, 0);
+            pSettingsLayout->addWidget(m_pUsernameEditor, 0, 1);
+            pSettingsLayout->addWidget(m_pPasswordLabel, 1, 0);
+            pSettingsLayout->addWidget(m_pPasswordEditor, 1, 1);
+            pSettingsLayout->addWidget(m_pHostnameLabel, 2, 0);
+            pSettingsLayout->addWidget(m_pHostnameEditor, 2, 1);
+            pSettingsLayout->addWidget(m_pBucketLabel, 3, 0);
+            pSettingsLayout->addWidget(m_pBucketEditor, 3, 1);
+            pSettingsLayout->addWidget(m_pFileSelectorLabel, 4, 0);
+            pSettingsLayout->addWidget(m_pFileSelector, 4, 1);
+        }
         m_pOVF09Checkbox = new QCheckBox(this);
         m_pManifestCheckbox = new QCheckBox(this);
-    pMainLayout->addWidget(m_pLabel);
-    pMainLayout->addLayout(pSettingsLayout);
-    pMainLayout->addWidget(m_pOVF09Checkbox);
-    pMainLayout->addWidget(m_pManifestCheckbox);
-    pMainLayout->addStretch();
+        pMainLayout->addWidget(m_pLabel);
+        pMainLayout->addLayout(pSettingsLayout);
+        pMainLayout->addWidget(m_pOVF09Checkbox);
+        pMainLayout->addWidget(m_pManifestCheckbox);
+        pMainLayout->addStretch();
+        chooseDefaultSettings();
+    }
 
     /* Setup connections: */
@@ -108,5 +272,5 @@
     setTitle(UIWizardExportApp::tr("Appliance Export Settings"));
 
-    /* Translate defaults: */
+    /* Translate objects: */
     m_strDefaultApplianceName = UIWizardExportApp::tr("Appliance");
     /* Translate widgets: */
@@ -130,5 +294,50 @@
     retranslateUi();
 
-    /* Setup components for chosen storage-type */
+    /* Refresh current settings: */
+    refreshCurrentSettings();
+}
+
+bool UIWizardExportAppPageBasic3::isComplete() const
+{
+    /* Initial result: */
+    bool fResult = true;
+
+    /* Check storage-type attributes: */
+    if (fResult)
+    {
+        const QString &strFile = m_pFileSelector->path().toLower();
+        fResult = VBoxGlobal::hasAllowedExtension(strFile, VBoxDefs::OVFFileExts);
+        if (fResult)
+        {
+            StorageType storageType = field("storageType").value<StorageType>();
+            switch (storageType)
+            {
+                case Filesystem:
+                    break;
+                case SunCloud:
+                    fResult &= !m_pUsernameEditor->text().isEmpty() &&
+                               !m_pPasswordEditor->text().isEmpty() &&
+                               !m_pBucketEditor->text().isEmpty();
+                    break;
+                case S3:
+                    fResult &= !m_pUsernameEditor->text().isEmpty() &&
+                               !m_pPasswordEditor->text().isEmpty() &&
+                               !m_pHostnameEditor->text().isEmpty() &&
+                               !m_pBucketEditor->text().isEmpty();
+                    break;
+            }
+        }
+    }
+
+    /* Return result: */
+    return fResult;
+}
+
+void UIWizardExportAppPageBasic3::refreshCurrentSettings()
+{
+    /* Refresh base-class settings: */
+    UIWizardExportAppPage3::refreshCurrentSettings();
+
+    /* Setup components for chosen storage-type: */
     StorageType storageType = field("storageType").value<StorageType>();
     switch (storageType)
@@ -141,14 +350,4 @@
                                  "If you use an <i>ovf</i> extension, several files "
                                  "will be written separately. Other extensions are not allowed."));
-            m_pUsernameLabel->setVisible(false);
-            m_pUsernameEditor->setVisible(false);
-            m_pPasswordLabel->setVisible(false);
-            m_pPasswordEditor->setVisible(false);
-            m_pHostnameLabel->setVisible(false);
-            m_pHostnameEditor->setVisible(false);
-            m_pBucketLabel->setVisible(false);
-            m_pBucketEditor->setVisible(false);
-            m_pOVF09Checkbox->setVisible(true);
-            m_pFileSelector->setChooserVisible(true);
             m_pFileSelector->setFocus();
             break;
@@ -158,15 +357,4 @@
             m_pLabel->setText(tr("Please complete the additional fields like the username, password "
                                  "and the bucket, and provide a filename for the OVF target."));
-            m_pUsernameLabel->setVisible(true);
-            m_pUsernameEditor->setVisible(true);
-            m_pPasswordLabel->setVisible(true);
-            m_pPasswordEditor->setVisible(true);
-            m_pHostnameLabel->setVisible(false);
-            m_pHostnameEditor->setVisible(false);
-            m_pBucketLabel->setVisible(true);
-            m_pBucketEditor->setVisible(true);
-            m_pOVF09Checkbox->setVisible(false);
-            m_pOVF09Checkbox->setChecked(false);
-            m_pFileSelector->setChooserVisible(false);
             m_pUsernameEditor->setFocus();
             break;
@@ -176,133 +364,8 @@
             m_pLabel->setText(tr("Please complete the additional fields like the username, password, "
                                  "hostname and the bucket, and provide a filename for the OVF target."));
-            m_pUsernameLabel->setVisible(true);
-            m_pUsernameEditor->setVisible(true);
-            m_pPasswordLabel->setVisible(true);
-            m_pPasswordEditor->setVisible(true);
-            m_pHostnameLabel->setVisible(true);
-            m_pHostnameEditor->setVisible(true);
-            m_pBucketLabel->setVisible(true);
-            m_pBucketEditor->setVisible(true);
-            m_pOVF09Checkbox->setVisible(true);
-            m_pFileSelector->setChooserVisible(false);
             m_pUsernameEditor->setFocus();
             break;
         }
     }
-
-    if (!m_pFileSelector->path().isEmpty())
-    {
-        QFileInfo fi(m_pFileSelector->path());
-        QString strName = fi.fileName();
-        if (storageType == Filesystem)
-            strName = QDir::toNativeSeparators(QString("%1/%2").arg(vboxGlobal().documentsPath()).arg(strName));
-        m_pFileSelector->setPath(strName);
-    }
-
-    if (m_pFileSelector->path().isEmpty())
-    {
-        /* Set the default filename: */
-        QString strName = m_strDefaultApplianceName;
-        /* If it is one VM only, we use the VM name as file name: */
-        if (field("machineNames").toStringList().size() == 1)
-            strName = field("machineNames").toStringList()[0];
-
-        strName += ".ova";
-
-        if (storageType == Filesystem)
-            strName = QDir::toNativeSeparators(QString("%1/%2").arg(vboxGlobal().documentsPath()).arg(strName));
-        m_pFileSelector->setPath(strName);
-    }
-}
-
-bool UIWizardExportAppPageBasic3::isComplete() const
-{
-    const QString &strFile = m_pFileSelector->path().toLower();
-    bool bComplete = VBoxGlobal::hasAllowedExtension(strFile, VBoxDefs::OVFFileExts);
-    StorageType storageType = field("storageType").value<StorageType>();
-    switch (storageType)
-    {
-        case Filesystem:
-            break;
-        case SunCloud:
-            bComplete &= !m_pUsernameEditor->text().isEmpty() && !m_pPasswordEditor->text().isEmpty() &&
-                         !m_pBucketEditor->text().isEmpty();
-            break;
-        case S3:
-            bComplete &= !m_pUsernameEditor->text().isEmpty() && !m_pPasswordEditor->text().isEmpty() &&
-                         !m_pHostnameEditor->text().isEmpty() && !m_pBucketEditor->text().isEmpty();
-            break;
-    }
-    return bComplete;
-}
-
-bool UIWizardExportAppPageBasic3::isOVF09Selected() const
-{
-    return m_pOVF09Checkbox->isChecked();
-}
-
-void UIWizardExportAppPageBasic3::setOVF09Selected(bool fChecked)
-{
-    m_pOVF09Checkbox->setChecked(fChecked);
-}
-
-bool UIWizardExportAppPageBasic3::isManifestSelected() const
-{
-    return m_pManifestCheckbox->isChecked();
-}
-
-void UIWizardExportAppPageBasic3::setManifestSelected(bool fChecked)
-{
-    m_pManifestCheckbox->setChecked(fChecked);
-}
-
-QString UIWizardExportAppPageBasic3::username() const
-{
-    return m_pUsernameEditor->text();
-}
-
-void UIWizardExportAppPageBasic3::setUserName(const QString &strUserName)
-{
-    m_pUsernameEditor->setText(strUserName);
-}
-
-QString UIWizardExportAppPageBasic3::password() const
-{
-    return m_pPasswordEditor->text();
-}
-
-void UIWizardExportAppPageBasic3::setPassword(const QString &strPassword)
-{
-    m_pPasswordEditor->setText(strPassword);
-}
-
-QString UIWizardExportAppPageBasic3::hostname() const
-{
-    return m_pHostnameEditor->text();
-}
-
-void UIWizardExportAppPageBasic3::setHostname(const QString &strHostname)
-{
-    m_pHostnameEditor->setText(strHostname);
-}
-
-QString UIWizardExportAppPageBasic3::bucket() const
-{
-    return m_pBucketEditor->text();
-}
-
-void UIWizardExportAppPageBasic3::setBucket(const QString &strBucket)
-{
-    m_pBucketEditor->setText(strBucket);
-}
-
-QString UIWizardExportAppPageBasic3::path() const
-{
-    return m_pFileSelector->path();
-}
-
-void UIWizardExportAppPageBasic3::setPath(const QString &strPath)
-{
-    m_pFileSelector->setPath(strPath);
-}
-
+}
+
Index: /trunk/src/VBox/Frontends/VirtualBox/src/wizards/exportappliance/UIWizardExportAppPageBasic3.h
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/wizards/exportappliance/UIWizardExportAppPageBasic3.h	(revision 41020)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/wizards/exportappliance/UIWizardExportAppPageBasic3.h	(revision 41021)
@@ -20,41 +20,28 @@
 #define __UIWizardExportAppPageBasic3_h__
 
+/* Global includes: */
+#include <QVariant>
+
 /* Local includes: */
 #include "UIWizardPage.h"
 
 /* Forward declarations: */
-class QIRichTextLabel;
 class QLabel;
 class QLineEdit;
 class VBoxEmptyFileSelector;
 class QCheckBox;
+class QIRichTextLabel;
 
-/* 3rd page of the Export Appliance wizard: */
-class UIWizardExportAppPageBasic3 : public UIWizardPage
+/* 3rd page of the Export Appliance wizard (base part): */
+class UIWizardExportAppPage3 : public UIWizardPageBase
 {
-    Q_OBJECT;
-    Q_PROPERTY(bool OVF09Selected READ isOVF09Selected WRITE setOVF09Selected);
-    Q_PROPERTY(bool manifestSelected READ isManifestSelected WRITE setManifestSelected);
-    Q_PROPERTY(QString username READ username WRITE setUserName);
-    Q_PROPERTY(QString password READ password WRITE setPassword);
-    Q_PROPERTY(QString hostname READ hostname WRITE setHostname);
-    Q_PROPERTY(QString bucket READ bucket WRITE setBucket);
-    Q_PROPERTY(QString path READ path WRITE setPath);
-
-public:
+protected:
 
     /* Constructor: */
-    UIWizardExportAppPageBasic3();
+    UIWizardExportAppPage3();
 
-private:
-
-    /* Translate stuff: */
-    void retranslateUi();
-
-    /* Prepare stuff: */
-    void initializePage();
-
-    /* Validation stuff: */
-    bool isComplete() const;
+    /* Helpers: */
+    void chooseDefaultSettings();
+    virtual void refreshCurrentSettings();
 
     /* Stuff for 'OVF09Selected' field: */
@@ -84,5 +71,4 @@
 
     /* Widgets: */
-    QIRichTextLabel *m_pLabel;
     QLabel *m_pUsernameLabel;
     QLineEdit *m_pUsernameEditor;
@@ -99,4 +85,44 @@
 };
 
+/* 3rd page of the Export Appliance wizard (basic extension): */
+class UIWizardExportAppPageBasic3 : public UIWizardPage, public UIWizardExportAppPage3
+{
+    Q_OBJECT;
+    Q_PROPERTY(bool OVF09Selected READ isOVF09Selected WRITE setOVF09Selected);
+    Q_PROPERTY(bool manifestSelected READ isManifestSelected WRITE setManifestSelected);
+    Q_PROPERTY(QString username READ username WRITE setUserName);
+    Q_PROPERTY(QString password READ password WRITE setPassword);
+    Q_PROPERTY(QString hostname READ hostname WRITE setHostname);
+    Q_PROPERTY(QString bucket READ bucket WRITE setBucket);
+    Q_PROPERTY(QString path READ path WRITE setPath);
+
+public:
+
+    /* Constructor: */
+    UIWizardExportAppPageBasic3();
+
+protected:
+
+    /* Wrapper to access 'wizard-field' from base part: */
+    QVariant fieldImp(const QString &strFieldName) const { return UIWizardPage::field(strFieldName); }
+
+private:
+
+    /* Translate stuff: */
+    void retranslateUi();
+
+    /* Prepare stuff: */
+    void initializePage();
+
+    /* Validation stuff: */
+    bool isComplete() const;
+
+    /* Helpers: */
+    void refreshCurrentSettings();
+
+    /* Widgets: */
+    QIRichTextLabel *m_pLabel;
+};
+
 #endif /* __UIWizardExportAppPageBasic3_h__ */
 
Index: /trunk/src/VBox/Frontends/VirtualBox/src/wizards/exportappliance/UIWizardExportAppPageBasic4.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/wizards/exportappliance/UIWizardExportAppPageBasic4.cpp	(revision 41020)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/wizards/exportappliance/UIWizardExportAppPageBasic4.cpp	(revision 41021)
@@ -26,40 +26,14 @@
 #include "VBoxGlobal.h"
 #include "UIMessageCenter.h"
+#include "QILabelSeparator.h"
 #include "QIRichTextLabel.h"
 
-UIWizardExportAppPageBasic4::UIWizardExportAppPageBasic4()
+UIWizardExportAppPage4::UIWizardExportAppPage4()
 {
-    /* Create widgets: */
-    QVBoxLayout *pMainLayout = new QVBoxLayout(this);
-        m_pLabel = new QIRichTextLabel(this);
-        m_pApplianceWidget = new UIApplianceExportEditorWidget(this);
-            m_pApplianceWidget->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::MinimumExpanding);
-    pMainLayout->addWidget(m_pLabel);
-    pMainLayout->addWidget(m_pApplianceWidget);
-
-    /* Register ExportAppliancePointer class: */
-    qRegisterMetaType<ExportAppliancePointer>();
-    /* Register 'applianceWidget' field! */
-    registerField("applianceWidget", this, "applianceWidget");
 }
 
-void UIWizardExportAppPageBasic4::retranslateUi()
+void UIWizardExportAppPage4::refreshApplianceSettingsWidget()
 {
-    /* Translate page: */
-    setTitle(UIWizardExportApp::tr("Appliance Export Settings"));
-
-    /* Translate widgets: */
-    m_pLabel->setText(UIWizardExportApp::tr("Here you can change additional configuration "
-                                            "values of the selected virtual machines. "
-                                            "You can modify most of the properties shown "
-                                            "by double-clicking on the items."));
-}
-
-void UIWizardExportAppPageBasic4::initializePage()
-{
-    /* Translate page: */
-    retranslateUi();
-
-    /* Prepare settings widget: */
+    /* Refresh settings widget: */
     CVirtualBox vbox = vboxGlobal().virtualBox();
     CAppliance *pAppliance = m_pApplianceWidget->init();
@@ -68,5 +42,5 @@
     {
         /* Iterate over all the selected machine ids: */
-        QStringList uuids = field("machineIDs").toStringList();
+        QStringList uuids = fieldImp("machineIDs").toStringList();
         foreach (const QString &uuid, uuids)
         {
@@ -77,9 +51,9 @@
             {
                 /* Add the export description to our appliance object: */
-                CVirtualSystemDescription vsd = machine.Export(*pAppliance, qobject_cast<UIWizardExportApp*>(wizard())->uri());
+                CVirtualSystemDescription vsd = machine.Export(*pAppliance, qobject_cast<UIWizardExportApp*>(wizardImp())->uri());
                 fResult = machine.isOk();
                 if (!fResult)
                 {
-                    msgCenter().cannotExportAppliance(machine, pAppliance, this);
+                    msgCenter().cannotExportAppliance(machine, pAppliance, thisImp());
                     return;
                 }
@@ -99,13 +73,71 @@
     }
     if (!fResult)
-        msgCenter().cannotExportAppliance(pAppliance, this);
+        msgCenter().cannotExportAppliance(pAppliance, thisImp());
+}
+
+UIWizardExportAppPageBasic4::UIWizardExportAppPageBasic4()
+{
+    /* Create widgets: */
+    QVBoxLayout *pMainLayout = new QVBoxLayout(this);
+    {
+        m_pLabel = new QIRichTextLabel(this);
+        m_pVMApplianceLabel = new QILabelSeparator(this);
+        {
+            m_pVMApplianceLabel->hide();
+        }
+        m_pApplianceWidget = new UIApplianceExportEditorWidget(this);
+        {
+            m_pApplianceWidget->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::MinimumExpanding);
+            m_pVMApplianceLabel->setBuddy(m_pApplianceWidget);
+        }
+        pMainLayout->addWidget(m_pLabel);
+        pMainLayout->addWidget(m_pVMApplianceLabel);
+        pMainLayout->addWidget(m_pApplianceWidget);
+    }
+
+    /* Register classes: */
+    qRegisterMetaType<ExportAppliancePointer>();
+    /* Register fields: */
+    registerField("applianceWidget", this, "applianceWidget");
+}
+
+void UIWizardExportAppPageBasic4::retranslateUi()
+{
+    /* Translate page: */
+    setTitle(UIWizardExportApp::tr("Appliance Export Settings"));
+
+    /* Translate widgets: */
+    m_pLabel->setText(UIWizardExportApp::tr("Here you can change additional configuration "
+                                            "values of the selected virtual machines. "
+                                            "You can modify most of the properties shown "
+                                            "by double-clicking on the items."));
+    m_pVMApplianceLabel->setText(UIWizardExportApp::tr("&Settings"));
+}
+
+void UIWizardExportAppPageBasic4::initializePage()
+{
+    /* Translate page: */
+    retranslateUi();
+
+    /* Refresh appliance settings widget: */
+    refreshApplianceSettingsWidget();
 }
 
 bool UIWizardExportAppPageBasic4::validatePage()
 {
+    /* Initial result: */
+    bool fResult = true;
+
+    /* Lock finish button: */
+    startProcessing();
+
     /* Try to export appliance: */
-    startProcessing();
-    bool fResult = qobject_cast<UIWizardExportApp*>(wizard())->exportAppliance();
+    if (fResult)
+        fResult = qobject_cast<UIWizardExportApp*>(wizard())->exportAppliance();
+
+    /* Unlock finish button: */
     endProcessing();
+
+    /* Return result: */
     return fResult;
 }
Index: /trunk/src/VBox/Frontends/VirtualBox/src/wizards/exportappliance/UIWizardExportAppPageBasic4.h
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/wizards/exportappliance/UIWizardExportAppPageBasic4.h	(revision 41020)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/wizards/exportappliance/UIWizardExportAppPageBasic4.h	(revision 41021)
@@ -20,4 +20,7 @@
 #define __UIWizardExportAppPageBasic4_h__
 
+/* Global includes: */
+#include <QVariant>
+
 /* Local includes: */
 #include "UIWizardPage.h"
@@ -25,8 +28,29 @@
 
 /* Forward declarations: */
+class QILabelSeparator;
+class UIWizardExportApp;
 class QIRichTextLabel;
 
-/* 4th page of the Export Appliance wizard: */
-class UIWizardExportAppPageBasic4 : public UIWizardPage
+/* 4th page of the Export Appliance wizard (base part): */
+class UIWizardExportAppPage4 : public UIWizardPageBase
+{
+protected:
+
+    /* Constructor: */
+    UIWizardExportAppPage4();
+
+    /* Helpers: */
+    void refreshApplianceSettingsWidget(    );
+
+    /* Stuff for 'applianceWidget' field: */
+    ExportAppliancePointer applianceWidget() const { return m_pApplianceWidget; }
+
+    /* Widgets: */
+    QILabelSeparator *m_pVMApplianceLabel;
+    UIApplianceExportEditorWidget *m_pApplianceWidget;
+};
+
+/* 4th page of the Export Appliance wizard (basic extension): */
+class UIWizardExportAppPageBasic4 : public UIWizardPage, public UIWizardExportAppPage4
 {
     Q_OBJECT;
@@ -37,4 +61,13 @@
     /* Constructor: */
     UIWizardExportAppPageBasic4();
+
+protected:
+
+    /* Wrapper to access 'wizard' from base part: */
+    UIWizard* wizardImp() { return UIWizardPage::wizard(); }
+    /* Wrapper to access 'this' from base part: */
+    UIWizardPage* thisImp() { return this; }
+    /* Wrapper to access 'wizard-field' from base part: */
+    QVariant fieldImp(const QString &strFieldName) const { return UIWizardPage::field(strFieldName); }
 
 private:
@@ -49,10 +82,6 @@
     bool validatePage();
 
-    /* Stuff for 'applianceWidget' field: */
-    ExportAppliancePointer applianceWidget() const { return m_pApplianceWidget; }
-
     /* Widgets: */
     QIRichTextLabel *m_pLabel;
-    UIApplianceExportEditorWidget *m_pApplianceWidget;
 };
 
Index: /trunk/src/VBox/Frontends/VirtualBox/src/wizards/exportappliance/UIWizardExportAppPageExpert.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/wizards/exportappliance/UIWizardExportAppPageExpert.cpp	(revision 41021)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/wizards/exportappliance/UIWizardExportAppPageExpert.cpp	(revision 41021)
@@ -0,0 +1,290 @@
+/* $Id$ */
+/** @file
+ *
+ * VBox frontends: Qt4 GUI ("VirtualBox"):
+ * UIWizardExportAppPageExpert class implementation
+ */
+
+/*
+ * Copyright (C) 2009-2012 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ */
+
+/* Global includes: */
+#include <QVBoxLayout>
+#include <QGridLayout>
+#include <QListWidget>
+#include <QGroupBox>
+#include <QRadioButton>
+#include <QLineEdit>
+#include <QLabel>
+#include <QCheckBox>
+
+/* Local includes: */
+#include "UIWizardExportAppPageExpert.h"
+#include "UIWizardExportApp.h"
+#include "UIWizardExportAppDefs.h"
+#include "VBoxGlobal.h"
+#include "UIMessageCenter.h"
+#include "QILabelSeparator.h"
+#include "VBoxFilePathSelectorWidget.h"
+#include "UIApplianceExportEditorWidget.h"
+
+UIWizardExportAppPageExpert::UIWizardExportAppPageExpert(const QStringList &selectedVMNames)
+{
+    /* Create widgets: */
+    QGridLayout *pMainLayout = new QGridLayout(this);
+    {
+        pMainLayout->setContentsMargins(8, 6, 8, 6);
+        m_pVMSelectorLabel = new QILabelSeparator(this);
+        m_pVMSelector = new QListWidget(this);
+        {
+            m_pVMSelector->setAlternatingRowColors(true);
+            m_pVMSelector->setSelectionMode(QAbstractItemView::ExtendedSelection);
+            m_pVMSelectorLabel->setBuddy(m_pVMSelector);
+        }
+        m_pVMApplianceLabel = new QILabelSeparator(this);
+        m_pApplianceWidget = new UIApplianceExportEditorWidget(this);
+        {
+            m_pApplianceWidget->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::MinimumExpanding);
+            m_pVMApplianceLabel->setBuddy(m_pApplianceWidget);
+        }
+        m_pTypeCnt = new QGroupBox(this);
+        {
+            m_pTypeCnt->hide();
+            QVBoxLayout *pTypeCntLayout = new QVBoxLayout(m_pTypeCnt);
+            {
+                m_pTypeLocalFilesystem = new QRadioButton(m_pTypeCnt);
+                m_pTypeSunCloud = new QRadioButton(m_pTypeCnt);
+                m_pTypeSimpleStorageSystem = new QRadioButton(m_pTypeCnt);
+                pTypeCntLayout->addWidget(m_pTypeLocalFilesystem);
+                pTypeCntLayout->addWidget(m_pTypeSunCloud);
+                pTypeCntLayout->addWidget(m_pTypeSimpleStorageSystem);
+            }
+        }
+        QGridLayout *pSettingsLayout = new QGridLayout;
+        {
+            m_pUsernameEditor = new QLineEdit(this);
+            m_pUsernameLabel = new QLabel(this);
+            {
+                m_pUsernameLabel->setAlignment(Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter);
+                m_pUsernameLabel->setBuddy(m_pUsernameEditor);
+            }
+            m_pPasswordEditor = new QLineEdit(this);
+            {
+                m_pPasswordEditor->setEchoMode(QLineEdit::Password);
+            }
+            m_pPasswordLabel = new QLabel(this);
+            {
+                m_pPasswordLabel->setAlignment(Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter);
+                m_pPasswordLabel->setBuddy(m_pPasswordEditor);
+            }
+            m_pHostnameEditor = new QLineEdit(this);
+            m_pHostnameLabel = new QLabel(this);
+            {
+                m_pHostnameLabel->setAlignment(Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter);
+                m_pHostnameLabel->setBuddy(m_pHostnameEditor);
+            }
+            m_pBucketEditor = new QLineEdit(this);
+            m_pBucketLabel = new QLabel(this);
+            {
+                m_pBucketLabel->setAlignment(Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter);
+                m_pBucketLabel->setBuddy(m_pBucketEditor);
+            }
+            m_pFileSelector = new VBoxEmptyFileSelector(this);
+            {
+                m_pFileSelector->setMode(VBoxFilePathSelectorWidget::Mode_File_Save);
+                m_pFileSelector->setEditable(true);
+                m_pFileSelector->setButtonPosition(VBoxEmptyFileSelector::RightPosition);
+                m_pFileSelector->setDefaultSaveExt("ova");
+            }
+            m_pFileSelectorLabel = new QLabel(this);
+            {
+                m_pFileSelectorLabel->setAlignment(Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter);
+                m_pFileSelectorLabel->setBuddy(m_pFileSelector);
+            }
+            pSettingsLayout->addWidget(m_pUsernameLabel, 0, 0);
+            pSettingsLayout->addWidget(m_pUsernameEditor, 0, 1);
+            pSettingsLayout->addWidget(m_pPasswordLabel, 1, 0);
+            pSettingsLayout->addWidget(m_pPasswordEditor, 1, 1);
+            pSettingsLayout->addWidget(m_pHostnameLabel, 2, 0);
+            pSettingsLayout->addWidget(m_pHostnameEditor, 2, 1);
+            pSettingsLayout->addWidget(m_pBucketLabel, 3, 0);
+            pSettingsLayout->addWidget(m_pBucketEditor, 3, 1);
+            pSettingsLayout->addWidget(m_pFileSelectorLabel, 4, 0);
+            pSettingsLayout->addWidget(m_pFileSelector, 4, 1);
+        }
+        m_pOVF09Checkbox = new QCheckBox(this);
+        m_pManifestCheckbox = new QCheckBox(this);
+        pMainLayout->addWidget(m_pVMSelectorLabel, 0, 0);
+        pMainLayout->addWidget(m_pVMApplianceLabel, 0, 1);
+        pMainLayout->addWidget(m_pVMSelector, 1, 0);
+        pMainLayout->addWidget(m_pApplianceWidget, 1, 1);
+        pMainLayout->addWidget(m_pTypeCnt, 2, 0, 1, 2);
+        pMainLayout->addLayout(pSettingsLayout, 3, 0, 1, 2);
+        pMainLayout->addWidget(m_pOVF09Checkbox, 4, 0, 1, 2);
+        pMainLayout->addWidget(m_pManifestCheckbox, 5, 0, 1, 2);
+        populateVMSelectorItems(selectedVMNames);
+        chooseDefaultStorageType();
+        chooseDefaultSettings();
+    }
+
+    /* Setup connections: */
+    connect(m_pVMSelector, SIGNAL(itemSelectionChanged()), this, SLOT(sltVMSelectionChangeHandler()));
+    connect(m_pTypeLocalFilesystem, SIGNAL(clicked()), this, SLOT(sltStorageTypeChangeHandler()));
+    connect(m_pTypeSunCloud, SIGNAL(clicked()), this, SLOT(sltStorageTypeChangeHandler()));
+    connect(m_pTypeSimpleStorageSystem, SIGNAL(clicked()), this, SLOT(sltStorageTypeChangeHandler()));
+    connect(m_pUsernameEditor, SIGNAL(textChanged(const QString &)), this, SIGNAL(completeChanged()));
+    connect(m_pPasswordEditor, SIGNAL(textChanged(const QString &)), this, SIGNAL(completeChanged()));
+    connect(m_pHostnameEditor, SIGNAL(textChanged(const QString &)), this, SIGNAL(completeChanged()));
+    connect(m_pBucketEditor, SIGNAL(textChanged(const QString &)), this, SIGNAL(completeChanged()));
+    connect(m_pFileSelector, SIGNAL(pathChanged(const QString &)), this, SIGNAL(completeChanged()));
+
+    /* Register classes: */
+    qRegisterMetaType<StorageType>();
+    qRegisterMetaType<ExportAppliancePointer>();
+    /* Register fields: */
+    registerField("machineNames", this, "machineNames");
+    registerField("machineIDs", this, "machineIDs");
+    registerField("storageType", this, "storageType");
+    registerField("OVF09Selected", this, "OVF09Selected");
+    registerField("manifestSelected", this, "manifestSelected");
+    registerField("username", this, "username");
+    registerField("password", this, "password");
+    registerField("hostname", this, "hostname");
+    registerField("bucket", this, "bucket");
+    registerField("path", this, "path");
+    registerField("applianceWidget", this, "applianceWidget");
+}
+
+void UIWizardExportAppPageExpert::sltVMSelectionChangeHandler()
+{
+    /* Call to base-class: */
+    refreshApplianceSettingsWidget();
+    refreshCurrentSettings();
+
+    /* Broadcast complete-change: */
+    emit completeChanged();
+}
+
+void UIWizardExportAppPageExpert::sltStorageTypeChangeHandler()
+{
+    /* Call to base-class: */
+    refreshCurrentSettings();
+
+    /* Broadcast complete-change: */
+    emit completeChanged();
+}
+
+void UIWizardExportAppPageExpert::retranslateUi()
+{
+    /* Translate objects: */
+    m_strDefaultApplianceName = UIWizardExportApp::tr("Appliance");
+    /* Translate widgets: */
+    m_pVMSelectorLabel->setText(UIWizardExportApp::tr("VM &List"));
+    m_pVMApplianceLabel->setText(UIWizardExportApp::tr("&Settings"));
+    m_pTypeCnt->setTitle(UIWizardExportApp::tr("&Destination"));
+    m_pTypeLocalFilesystem->setText(UIWizardExportApp::tr("&Local Filesystem "));
+    m_pTypeSunCloud->setText(UIWizardExportApp::tr("Sun &Cloud"));
+    m_pTypeSimpleStorageSystem->setText(UIWizardExportApp::tr("&Simple Storage System (S3)"));
+    m_pUsernameLabel->setText(UIWizardExportApp::tr("&Username:"));
+    m_pPasswordLabel->setText(UIWizardExportApp::tr("&Password:"));
+    m_pHostnameLabel->setText(UIWizardExportApp::tr("&Hostname:"));
+    m_pBucketLabel->setText(UIWizardExportApp::tr("&Bucket:"));
+    m_pFileSelectorLabel->setText(UIWizardExportApp::tr("&File:"));
+    m_pFileSelector->setFileDialogTitle(UIWizardExportApp::tr("Select a file to export into"));
+    m_pFileSelector->setFileFilters(UIWizardExportApp::tr("Open Virtualization Format Archive (%1)").arg("*.ova") + ";;" +
+                                    UIWizardExportApp::tr("Open Virtualization Format (%1)").arg("*.ovf"));
+    m_pOVF09Checkbox->setToolTip(UIWizardExportApp::tr("Write in legacy OVF 0.9 format for compatibility with other virtualization products."));
+    m_pOVF09Checkbox->setText(UIWizardExportApp::tr("&Write legacy OVF 0.9"));
+    m_pManifestCheckbox->setToolTip(UIWizardExportApp::tr("Create a Manifest file for automatic data integrity checks on import."));
+    m_pManifestCheckbox->setText(UIWizardExportApp::tr("Write &Manifest file"));
+}
+
+void UIWizardExportAppPageExpert::initializePage()
+{
+    /* Translate page: */
+    retranslateUi();
+
+    /* Call to base-class: */
+    refreshApplianceSettingsWidget();
+    refreshCurrentSettings();
+}
+
+bool UIWizardExportAppPageExpert::isComplete() const
+{
+    /* Initial result: */
+    bool fResult = true;
+
+    /* There should be at least one vm selected: */
+    if (fResult)
+        fResult = (m_pVMSelector->selectedItems().size() > 0);
+
+    /* Check storage-type attributes: */
+    if (fResult)
+    {
+        const QString &strFile = m_pFileSelector->path().toLower();
+        fResult = VBoxGlobal::hasAllowedExtension(strFile, VBoxDefs::OVFFileExts);
+        if (fResult)
+        {
+            StorageType st = storageType();
+            switch (st)
+            {
+                case Filesystem:
+                    break;
+                case SunCloud:
+                    fResult &= !m_pUsernameEditor->text().isEmpty() &&
+                               !m_pPasswordEditor->text().isEmpty() &&
+                               !m_pBucketEditor->text().isEmpty();
+                    break;
+                case S3:
+                    fResult &= !m_pUsernameEditor->text().isEmpty() &&
+                               !m_pPasswordEditor->text().isEmpty() &&
+                               !m_pHostnameEditor->text().isEmpty() &&
+                               !m_pBucketEditor->text().isEmpty();
+                    break;
+            }
+        }
+    }
+
+    /* Return result: */
+    return fResult;
+}
+
+bool UIWizardExportAppPageExpert::validatePage()
+{
+    /* Initial result: */
+    bool fResult = true;
+
+    /* Lock finish button: */
+    startProcessing();
+
+    /* Ask user about machines which are in save state currently: */
+    QStringList savedMachines;
+    QList<QListWidgetItem*> pItems = m_pVMSelector->selectedItems();
+    for (int i=0; i < pItems.size(); ++i)
+    {
+        if (static_cast<VMListWidgetItem*>(pItems.at(i))->isInSaveState())
+            savedMachines << pItems.at(i)->text();
+    }
+    if (!savedMachines.isEmpty())
+        fResult = msgCenter().confirmExportMachinesInSaveState(savedMachines, this);
+
+    /* Try to export appliance: */
+    if (fResult)
+        fResult = qobject_cast<UIWizardExportApp*>(wizard())->exportAppliance();
+
+    /* Unlock finish button: */
+    endProcessing();
+
+    /* Return result: */
+    return fResult;
+}
+
Index: /trunk/src/VBox/Frontends/VirtualBox/src/wizards/exportappliance/UIWizardExportAppPageExpert.h
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/wizards/exportappliance/UIWizardExportAppPageExpert.h	(revision 41021)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/wizards/exportappliance/UIWizardExportAppPageExpert.h	(revision 41021)
@@ -0,0 +1,87 @@
+/** @file
+ *
+ * VBox frontends: Qt4 GUI ("VirtualBox"):
+ * UIWizardExportAppPageExpert class declaration
+ */
+
+/*
+ * Copyright (C) 2009-2012 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ */
+
+#ifndef __UIWizardExportAppPageExpert_h__
+#define __UIWizardExportAppPageExpert_h__
+
+/* Local includes: */
+#include "UIWizardExportAppPageBasic1.h"
+#include "UIWizardExportAppPageBasic2.h"
+#include "UIWizardExportAppPageBasic3.h"
+#include "UIWizardExportAppPageBasic4.h"
+
+/* Expert page of the Export Appliance wizard: */
+class UIWizardExportAppPageExpert : public UIWizardPage,
+                                    public UIWizardExportAppPage1,
+                                    public UIWizardExportAppPage2,
+                                    public UIWizardExportAppPage3,
+                                    public UIWizardExportAppPage4
+{
+    Q_OBJECT;
+    Q_PROPERTY(QStringList machineNames READ machineNames);
+    Q_PROPERTY(QStringList machineIDs READ machineIDs);
+    Q_PROPERTY(StorageType storageType READ storageType WRITE setStorageType);
+    Q_PROPERTY(bool OVF09Selected READ isOVF09Selected WRITE setOVF09Selected);
+    Q_PROPERTY(bool manifestSelected READ isManifestSelected WRITE setManifestSelected);
+    Q_PROPERTY(QString username READ username WRITE setUserName);
+    Q_PROPERTY(QString password READ password WRITE setPassword);
+    Q_PROPERTY(QString hostname READ hostname WRITE setHostname);
+    Q_PROPERTY(QString bucket READ bucket WRITE setBucket);
+    Q_PROPERTY(QString path READ path WRITE setPath);
+    Q_PROPERTY(ExportAppliancePointer applianceWidget READ applianceWidget);
+
+public:
+
+    /* Constructor: */
+    UIWizardExportAppPageExpert(const QStringList &selectedVMNames);
+
+protected:
+
+    /* Wrapper to access 'wizard' from base part: */
+    UIWizard* wizardImp() { return UIWizardPage::wizard(); }
+    /* Wrapper to access 'this' from base part: */
+    UIWizardPage* thisImp() { return this; }
+    /* Wrapper to access 'wizard-field' from base part: */
+    QVariant fieldImp(const QString &strFieldName) const { return UIWizardPage::field(strFieldName); }
+
+private slots:
+
+    /* VM Selector selection change handler: */
+    void sltVMSelectionChangeHandler();
+
+    /* Storage-type change handler: */
+    void sltStorageTypeChangeHandler();
+
+private:
+
+    /* Field API: */
+    QVariant field(const QString &strFieldName) const { return UIWizardPage::field(strFieldName); }
+
+    /* Translate stuff: */
+    void retranslateUi();
+
+    /* Prepare stuff: */
+    void initializePage();
+
+    /* Validation stuff: */
+    bool isComplete() const;
+    bool validatePage();
+};
+
+#endif /* __UIWizardExportAppPageExpert_h__ */
+
Index: /trunk/src/VBox/Frontends/VirtualBox/src/wizards/firstrun/UIWizardFirstRun.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/wizards/firstrun/UIWizardFirstRun.cpp	(revision 41020)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/wizards/firstrun/UIWizardFirstRun.cpp	(revision 41021)
@@ -23,25 +23,13 @@
 #include "UIWizardFirstRunPageBasic2.h"
 #include "UIWizardFirstRunPageBasic3.h"
+#include "UIWizardFirstRunPageExpert.h"
 #include "VBoxGlobal.h"
 #include "UIMessageCenter.h"
 
 UIWizardFirstRun::UIWizardFirstRun(QWidget *pParent, const CMachine &machine)
-    : UIWizard(pParent)
+    : UIWizard(pParent, UIWizardType_FirstRun)
     , m_machine(machine)
+    , m_fHardDiskWasSet(isBootHardDiskAttached(m_machine))
 {
-    /* Check if boot hard disk was set: */
-    bool fHardDiskWasSet = isBootHardDiskAttached(machine);
-
-    /* Create & add pages: */
-    setPage(Page1, new UIWizardFirstRunPageBasic1(fHardDiskWasSet));
-    setPage(Page2, new UIWizardFirstRunPageBasic2(machine, fHardDiskWasSet));
-    setPage(Page3, new UIWizardFirstRunPageBasic3(fHardDiskWasSet));
-
-    /* Translate wizard: */
-    retranslateUi();
-
-    /* Translate wizard pages: */
-    retranslateAllPages();
-
 #ifndef Q_WS_MAC
     /* Assign watermark: */
@@ -51,7 +39,4 @@
     assignBackground(":/vmw_first_run_bg.png");
 #endif /* Q_WS_MAC */
-
-    /* Resize to 'golden ratio': */
-    resizeToGoldenRatio(UIWizardType_FirstRun);
 }
 
@@ -103,7 +88,32 @@
 void UIWizardFirstRun::retranslateUi()
 {
+    /* Call to base-class: */
+    UIWizard::retranslateUi();
+
     /* Translate wizard: */
     setWindowTitle(tr("First Run Wizard"));
     setButtonText(QWizard::FinishButton, tr("Start"));
+}
+
+void UIWizardFirstRun::prepare()
+{
+    /* Create corresponding pages: */
+    switch (mode())
+    {
+        case UIWizardMode_Basic:
+        {
+            setPage(Page1, new UIWizardFirstRunPageBasic1(m_fHardDiskWasSet));
+            setPage(Page2, new UIWizardFirstRunPageBasic2(m_machine.GetId(), m_fHardDiskWasSet));
+            setPage(Page3, new UIWizardFirstRunPageBasic3(m_fHardDiskWasSet));
+            break;
+        }
+        case UIWizardMode_Expert:
+        {
+            setPage(PageExpert, new UIWizardFirstRunPageExpert(m_machine.GetId(), m_fHardDiskWasSet));
+            break;
+        }
+    }
+    /* Call to base-class: */
+    UIWizard::prepare();
 }
 
Index: /trunk/src/VBox/Frontends/VirtualBox/src/wizards/firstrun/UIWizardFirstRun.h
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/wizards/firstrun/UIWizardFirstRun.h	(revision 41020)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/wizards/firstrun/UIWizardFirstRun.h	(revision 41021)
@@ -39,4 +39,10 @@
     };
 
+    /* Page IDs: */
+    enum
+    {
+        PageExpert
+    };
+
     /* Constructor: */
     UIWizardFirstRun(QWidget *pParent, const CMachine &machine);
@@ -49,4 +55,5 @@
     /* Who will be able to export appliance: */
     friend class UIWizardFirstRunPageBasic3;
+    friend class UIWizardFirstRunPageExpert;
 
 private:
@@ -55,4 +62,7 @@
     void retranslateUi();
 
+    /* Pages related stuff: */
+    void prepare();
+
     /* Helping stuff: */
     static bool isBootHardDiskAttached(const CMachine &machine);
@@ -60,4 +70,5 @@
     /* Variables: */
     CMachine m_machine;
+    bool m_fHardDiskWasSet;
 };
 
Index: /trunk/src/VBox/Frontends/VirtualBox/src/wizards/firstrun/UIWizardFirstRunPageBasic1.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/wizards/firstrun/UIWizardFirstRunPageBasic1.cpp	(revision 41020)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/wizards/firstrun/UIWizardFirstRunPageBasic1.cpp	(revision 41021)
@@ -26,12 +26,19 @@
 #include "QIRichTextLabel.h"
 
+UIWizardFirstRunPage1::UIWizardFirstRunPage1(bool fBootHardDiskWasSet)
+    : m_fBootHardDiskWasSet(fBootHardDiskWasSet)
+{
+}
+
 UIWizardFirstRunPageBasic1::UIWizardFirstRunPageBasic1(bool fBootHardDiskWasSet)
-    : m_fBootHardDiskWasSet(fBootHardDiskWasSet)
+    : UIWizardFirstRunPage1(fBootHardDiskWasSet)
 {
     /* Create widgets: */
     QVBoxLayout *pMainLayout = new QVBoxLayout(this);
+    {
         m_pLabel = new QIRichTextLabel(this);
-    pMainLayout->addWidget(m_pLabel);
-    pMainLayout->addStretch();
+        pMainLayout->addWidget(m_pLabel);
+        pMainLayout->addStretch();
+    }
 }
 
@@ -39,5 +46,5 @@
 {
     /* Translate page: */
-    setTitle(UIWizardFirstRun::tr("Welcome to the First Run Wizard!"));
+    setTitle(UIWizardFirstRun::tr("Welcome to the First Run wizard!"));
 
     /* Translate widgets: */
Index: /trunk/src/VBox/Frontends/VirtualBox/src/wizards/firstrun/UIWizardFirstRunPageBasic1.h
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/wizards/firstrun/UIWizardFirstRunPageBasic1.h	(revision 41020)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/wizards/firstrun/UIWizardFirstRunPageBasic1.h	(revision 41021)
@@ -26,6 +26,18 @@
 class QIRichTextLabel;
 
-/* 1st page of the First Run wizard: */
-class UIWizardFirstRunPageBasic1 : public UIWizardPage
+/* 1st page of the First Run wizard (base part): */
+class UIWizardFirstRunPage1 : public UIWizardPageBase
+{
+protected:
+
+    /* Constructor: */
+    UIWizardFirstRunPage1(bool fBootHardDiskWasSet);
+
+    /* Variables: */
+    bool m_fBootHardDiskWasSet;
+};
+
+/* 1st page of the First Run wizard (basic extension): */
+class UIWizardFirstRunPageBasic1 : public UIWizardPage, public UIWizardFirstRunPage1
 {
     Q_OBJECT;
@@ -44,7 +56,4 @@
     void initializePage();
 
-    /* Variables: */
-    bool m_fBootHardDiskWasSet;
-
     /* Widgets: */
     QIRichTextLabel *m_pLabel;
Index: /trunk/src/VBox/Frontends/VirtualBox/src/wizards/firstrun/UIWizardFirstRunPageBasic2.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/wizards/firstrun/UIWizardFirstRunPageBasic2.cpp	(revision 41020)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/wizards/firstrun/UIWizardFirstRunPageBasic2.cpp	(revision 41021)
@@ -28,34 +28,69 @@
 #include "COMDefs.h"
 #include "UIIconPool.h"
+#include "VBoxGlobal.h"
 #include "UIMessageCenter.h"
-#include "QIRichTextLabel.h"
 #include "VBoxMediaComboBox.h"
 #include "QIToolButton.h"
+#include "QIRichTextLabel.h"
 
-UIWizardFirstRunPageBasic2::UIWizardFirstRunPageBasic2(const CMachine &machine, bool fBootHardDiskWasSet)
+UIWizardFirstRunPage2::UIWizardFirstRunPage2(bool fBootHardDiskWasSet)
     : m_fBootHardDiskWasSet(fBootHardDiskWasSet)
+{
+}
+
+void UIWizardFirstRunPage2::onOpenMediumWithFileOpenDialog()
+{
+    /* Get opened vboxMedium id: */
+    QString strMediumId = vboxGlobal().openMediumWithFileOpenDialog(m_pMediaSelector->type(), thisImp());
+    /* Update medium-combo if necessary: */
+    if (!strMediumId.isNull())
+        m_pMediaSelector->setCurrentItem(strMediumId);
+}
+
+QString UIWizardFirstRunPage2::id() const
+{
+    return m_pMediaSelector->id();
+}
+
+void UIWizardFirstRunPage2::setId(const QString &strId)
+{
+    m_pMediaSelector->setCurrentItem(strId);
+}
+
+UIWizardFirstRunPageBasic2::UIWizardFirstRunPageBasic2(const QString &strMachineId, bool fBootHardDiskWasSet)
+    : UIWizardFirstRunPage2(fBootHardDiskWasSet)
 {
     /* Create widgets: */
     QVBoxLayout *pMainLayout = new QVBoxLayout(this);
+    {
         m_pLabel = new QIRichTextLabel(this);
-        m_pCntSource = new QGroupBox(this);
-            m_pCntSource->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Fixed);
-            QHBoxLayout *pSourceLayout = new QHBoxLayout(m_pCntSource);
-                m_pMediaSelector = new VBoxMediaComboBox(m_pCntSource);
-                    m_pMediaSelector->setMachineId(machine.GetId());
+        m_pSourceCnt = new QGroupBox(this);
+        {
+            m_pSourceCnt->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Fixed);
+            QHBoxLayout *pSourceCntLayout = new QHBoxLayout(m_pSourceCnt);
+            {
+                m_pMediaSelector = new VBoxMediaComboBox(m_pSourceCnt);
+                {
+                    m_pMediaSelector->setMachineId(strMachineId);
                     m_pMediaSelector->setType(VBoxDefs::MediumType_DVD);
                     m_pMediaSelector->repopulate();
-                m_pSelectMediaButton = new QIToolButton(m_pCntSource);
+                }
+                m_pSelectMediaButton = new QIToolButton(m_pSourceCnt);
+                {
                     m_pSelectMediaButton->setIcon(UIIconPool::iconSet(":/select_file_16px.png", ":/select_file_dis_16px.png"));
                     m_pSelectMediaButton->setAutoRaise(true);
-            pSourceLayout->addWidget(m_pMediaSelector);
-            pSourceLayout->addWidget(m_pSelectMediaButton);
-    pMainLayout->addWidget(m_pLabel);
-    pMainLayout->addWidget(m_pCntSource);
-    pMainLayout->addStretch();
+                }
+                pSourceCntLayout->addWidget(m_pMediaSelector);
+                pSourceCntLayout->addWidget(m_pSelectMediaButton);
+            }
+        }
+        pMainLayout->addWidget(m_pLabel);
+        pMainLayout->addWidget(m_pSourceCnt);
+        pMainLayout->addStretch();
+    }
 
     /* Setup connections: */
     connect(m_pMediaSelector, SIGNAL(currentIndexChanged(int)), this, SIGNAL(completeChanged()));
-    connect(m_pSelectMediaButton, SIGNAL(clicked()), this, SLOT(sltOpenWithFileOpenDialog()));
+    connect(m_pSelectMediaButton, SIGNAL(clicked()), this, SLOT(sltOpenMediumWithFileOpenDialog()));
 
     /* Register fields: */
@@ -64,11 +99,8 @@
 }
 
-void UIWizardFirstRunPageBasic2::sltOpenWithFileOpenDialog()
+void UIWizardFirstRunPageBasic2::sltOpenMediumWithFileOpenDialog()
 {
-    /* Get opened vboxMedium id: */
-    QString strMediumId = vboxGlobal().openMediumWithFileOpenDialog(m_pMediaSelector->type(), this);
-    /* Update medium-combo if necessary: */
-    if (!strMediumId.isNull())
-        m_pMediaSelector->setCurrentItem(strMediumId);
+    /* Call to base-class: */
+    onOpenMediumWithFileOpenDialog();
 }
 
@@ -87,5 +119,6 @@
                                                "you want to work with. This media must be bootable, "
                                                "otherwise the operating system will not be able to start.</p>"));
-    m_pCntSource->setTitle(UIWizardFirstRun::tr("Media Source"));
+    m_pSourceCnt->setTitle(UIWizardFirstRun::tr("Media Source"));
+    m_pSelectMediaButton->setToolTip(VBoxGlobal::tr("Choose a virtual CD/DVD disk file"));
 }
 
@@ -94,11 +127,9 @@
     /* Translate page: */
     retranslateUi();
-
-    /* Media selector should have focus initially: */
-    m_pMediaSelector->setFocus();
 }
 
 bool UIWizardFirstRunPageBasic2::isComplete() const
 {
+    /* Make sure valid medium chosen: */
     return !vboxGlobal().findMedium(id()).isNull();
 }
@@ -109,12 +140,2 @@
 }
 
-QString UIWizardFirstRunPageBasic2::id() const
-{
-    return m_pMediaSelector->id();
-}
-
-void UIWizardFirstRunPageBasic2::setId(const QString &strId)
-{
-    m_pMediaSelector->setCurrentItem(strId);
-}
-
Index: /trunk/src/VBox/Frontends/VirtualBox/src/wizards/firstrun/UIWizardFirstRunPageBasic2.h
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/wizards/firstrun/UIWizardFirstRunPageBasic2.h	(revision 41020)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/wizards/firstrun/UIWizardFirstRunPageBasic2.h	(revision 41021)
@@ -25,11 +25,35 @@
 /* Forward declarations: */
 class CMachine;
-class QIRichTextLabel;
 class QGroupBox;
 class VBoxMediaComboBox;
 class QIToolButton;
+class QIRichTextLabel;
 
-/* 2nd page of the First Run wizard: */
-class UIWizardFirstRunPageBasic2 : public UIWizardPage
+/* 2nd page of the First Run wizard (base part): */
+class UIWizardFirstRunPage2 : public UIWizardPageBase
+{
+protected:
+
+    /* Constructor: */
+    UIWizardFirstRunPage2(bool fBootHardDiskWasSet);
+
+    /* Handlers: */
+    void onOpenMediumWithFileOpenDialog();
+
+    /* Stuff for 'id' field: */
+    QString id() const;
+    void setId(const QString &strId);
+
+    /* Variables: */
+    bool m_fBootHardDiskWasSet;
+
+    /* Widgets: */
+    QGroupBox *m_pSourceCnt;
+    VBoxMediaComboBox *m_pMediaSelector;
+    QIToolButton *m_pSelectMediaButton;
+};
+
+/* 2nd page of the First Run wizard (basic extension): */
+class UIWizardFirstRunPageBasic2 : public UIWizardPage, public UIWizardFirstRunPage2
 {
     Q_OBJECT;
@@ -40,10 +64,15 @@
 
     /* Constructor: */
-    UIWizardFirstRunPageBasic2(const CMachine &machine, bool fBootHardDiskWasSet);
+    UIWizardFirstRunPageBasic2(const QString &strMachineId, bool fBootHardDiskWasSet);
+
+protected:
+
+    /* Wrapper to access 'this' from base part: */
+    UIWizardPage* thisImp() { return this; }
 
 private slots:
 
     /* Open with file-open dialog: */
-    void sltOpenWithFileOpenDialog();
+    void sltOpenMediumWithFileOpenDialog();
 
 private:
@@ -61,16 +90,6 @@
     QString source() const;
 
-    /* Stuff for 'id' field: */
-    QString id() const;
-    void setId(const QString &strId);
-
-    /* Variables: */
-    bool m_fBootHardDiskWasSet;
-
     /* Widgets: */
     QIRichTextLabel *m_pLabel;
-    QGroupBox *m_pCntSource;
-    VBoxMediaComboBox *m_pMediaSelector;
-    QIToolButton *m_pSelectMediaButton;
 };
 
Index: /trunk/src/VBox/Frontends/VirtualBox/src/wizards/firstrun/UIWizardFirstRunPageBasic3.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/wizards/firstrun/UIWizardFirstRunPageBasic3.cpp	(revision 41020)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/wizards/firstrun/UIWizardFirstRunPageBasic3.cpp	(revision 41021)
@@ -26,16 +26,23 @@
 #include "QIRichTextLabel.h"
 
+UIWizardFirstRunPage3::UIWizardFirstRunPage3(bool fBootHardDiskWasSet)
+    : m_fBootHardDiskWasSet(fBootHardDiskWasSet)
+{
+}
+
 UIWizardFirstRunPageBasic3::UIWizardFirstRunPageBasic3(bool fBootHardDiskWasSet)
-    : m_fBootHardDiskWasSet(fBootHardDiskWasSet)
+    : UIWizardFirstRunPage3(fBootHardDiskWasSet)
 {
     /* Create widgets: */
     QVBoxLayout *pMainLayout = new QVBoxLayout(this);
+    {
         m_pLabel1 = new QIRichTextLabel(this);
         m_pSummaryText = new QIRichTextLabel(this);
         m_pLabel2 = new QIRichTextLabel(this);
-    pMainLayout->addWidget(m_pLabel1);
-    pMainLayout->addWidget(m_pSummaryText);
-    pMainLayout->addWidget(m_pLabel2);
-    pMainLayout->addStretch();
+        pMainLayout->addWidget(m_pLabel1);
+        pMainLayout->addWidget(m_pSummaryText);
+        pMainLayout->addWidget(m_pLabel2);
+        pMainLayout->addStretch();
+    }
 }
 
@@ -93,8 +100,18 @@
 bool UIWizardFirstRunPageBasic3::validatePage()
 {
-    /* Insert chosen medium: */
+    /* Initial result: */
+    bool fResult = true;
+
+    /* Lock finish button: */
     startProcessing();
-    bool fResult = qobject_cast<UIWizardFirstRun*>(wizard())->insertMedium();
+
+    /* Try to insert chosen medium: */
+    if (fResult)
+        fResult = qobject_cast<UIWizardFirstRun*>(wizard())->insertMedium();
+
+    /* Unlock finish button: */
     endProcessing();
+
+    /* Return result: */
     return fResult;
 }
Index: /trunk/src/VBox/Frontends/VirtualBox/src/wizards/firstrun/UIWizardFirstRunPageBasic3.h
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/wizards/firstrun/UIWizardFirstRunPageBasic3.h	(revision 41020)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/wizards/firstrun/UIWizardFirstRunPageBasic3.h	(revision 41021)
@@ -26,6 +26,18 @@
 class QIRichTextLabel;
 
-/* 3rd page of the First Run wizard: */
-class UIWizardFirstRunPageBasic3 : public UIWizardPage
+/* 3rd page of the First Run wizard (base part): */
+class UIWizardFirstRunPage3 : public UIWizardPageBase
+{
+protected:
+
+    /* Constructor: */
+    UIWizardFirstRunPage3(bool fBootHardDiskWasSet);
+
+    /* Variables: */
+    bool m_fBootHardDiskWasSet;
+};
+
+/* 3rd page of the First Run wizard (basic extension): */
+class UIWizardFirstRunPageBasic3 : public UIWizardPage, public UIWizardFirstRunPage3
 {
     Q_OBJECT;
@@ -47,7 +59,4 @@
     bool validatePage();
 
-    /* Variables: */
-    bool m_fBootHardDiskWasSet;
-
     /* Widgets: */
     QIRichTextLabel *m_pLabel1;
Index: /trunk/src/VBox/Frontends/VirtualBox/src/wizards/firstrun/UIWizardFirstRunPageExpert.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/wizards/firstrun/UIWizardFirstRunPageExpert.cpp	(revision 41021)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/wizards/firstrun/UIWizardFirstRunPageExpert.cpp	(revision 41021)
@@ -0,0 +1,117 @@
+/* $Id$ */
+/** @file
+ *
+ * VBox frontends: Qt4 GUI ("VirtualBox"):
+ * UIWizardFirstRunPageExpert class implementation
+ */
+
+/*
+ * Copyright (C) 2008-2012 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ */
+
+/* Global includes: */
+#include <QVBoxLayout>
+#include <QHBoxLayout>
+#include <QGroupBox>
+
+/* Local includes: */
+#include "UIWizardFirstRunPageExpert.h"
+#include "UIWizardFirstRun.h"
+#include "VBoxGlobal.h"
+#include "UIIconPool.h"
+#include "VBoxMediaComboBox.h"
+#include "QIToolButton.h"
+
+UIWizardFirstRunPageExpert::UIWizardFirstRunPageExpert(const QString &strMachineId, bool fBootHardDiskWasSet)
+    : UIWizardFirstRunPage1(fBootHardDiskWasSet)
+    , UIWizardFirstRunPage2(fBootHardDiskWasSet)
+    , UIWizardFirstRunPage3(fBootHardDiskWasSet)
+{
+    /* Create widgets: */
+    QVBoxLayout *pMainLayout = new QVBoxLayout(this);
+    {
+        pMainLayout->setContentsMargins(8, 6, 8, 6);
+        m_pSourceCnt = new QGroupBox(this);
+        {
+            m_pSourceCnt->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Fixed);
+            QHBoxLayout *pSourceCntLayout = new QHBoxLayout(m_pSourceCnt);
+            {
+                m_pMediaSelector = new VBoxMediaComboBox(m_pSourceCnt);
+                {
+                    m_pMediaSelector->setMachineId(strMachineId);
+                    m_pMediaSelector->setType(VBoxDefs::MediumType_DVD);
+                    m_pMediaSelector->repopulate();
+                }
+                m_pSelectMediaButton = new QIToolButton(m_pSourceCnt);
+                {
+                    m_pSelectMediaButton->setIcon(UIIconPool::iconSet(":/select_file_16px.png", ":/select_file_dis_16px.png"));
+                    m_pSelectMediaButton->setAutoRaise(true);
+                }
+                pSourceCntLayout->addWidget(m_pMediaSelector);
+                pSourceCntLayout->addWidget(m_pSelectMediaButton);
+            }
+        }
+        pMainLayout->addWidget(m_pSourceCnt);
+        pMainLayout->addStretch();
+    }
+
+    /* Setup connections: */
+    connect(m_pMediaSelector, SIGNAL(currentIndexChanged(int)), this, SIGNAL(completeChanged()));
+    connect(m_pSelectMediaButton, SIGNAL(clicked()), this, SLOT(sltOpenMediumWithFileOpenDialog()));
+
+    /* Register fields: */
+    registerField("id", this, "id");
+}
+
+void UIWizardFirstRunPageExpert::sltOpenMediumWithFileOpenDialog()
+{
+    /* Call to base-class: */
+    onOpenMediumWithFileOpenDialog();
+}
+
+void UIWizardFirstRunPageExpert::retranslateUi()
+{
+    /* Translate widgets: */
+    m_pSourceCnt->setTitle(UIWizardFirstRun::tr("Media Source"));
+    m_pSelectMediaButton->setToolTip(VBoxGlobal::tr("Choose a virtual CD/DVD disk file"));
+}
+
+void UIWizardFirstRunPageExpert::initializePage()
+{
+    /* Translate page: */
+    retranslateUi();
+}
+
+bool UIWizardFirstRunPageExpert::isComplete() const
+{
+    /* Make sure valid medium chosen: */
+    return !vboxGlobal().findMedium(id()).isNull();
+}
+
+bool UIWizardFirstRunPageExpert::validatePage()
+{
+    /* Initial result: */
+    bool fResult = true;
+
+    /* Lock finish button: */
+    startProcessing();
+
+    /* Try to insert chosen medium: */
+    if (fResult)
+        fResult = qobject_cast<UIWizardFirstRun*>(wizard())->insertMedium();
+
+    /* Unlock finish button: */
+    endProcessing();
+
+    /* Return result: */
+    return fResult;
+}
+
Index: /trunk/src/VBox/Frontends/VirtualBox/src/wizards/firstrun/UIWizardFirstRunPageExpert.h
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/wizards/firstrun/UIWizardFirstRunPageExpert.h	(revision 41021)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/wizards/firstrun/UIWizardFirstRunPageExpert.h	(revision 41021)
@@ -0,0 +1,65 @@
+/** @file
+ *
+ * VBox frontends: Qt4 GUI ("VirtualBox"):
+ * UIWizardFirstRunPageExpert class declaration
+ */
+
+/*
+ * Copyright (C) 2008-2012 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ */
+
+#ifndef __UIWizardFirstRunPageExpert_h__
+#define __UIWizardFirstRunPageExpert_h__
+
+/* Local includes: */
+#include "UIWizardFirstRunPageBasic1.h"
+#include "UIWizardFirstRunPageBasic2.h"
+#include "UIWizardFirstRunPageBasic3.h"
+
+/* Expert page of the First Run wizard: */
+class UIWizardFirstRunPageExpert : public UIWizardPage,
+                                   public UIWizardFirstRunPage1,
+                                   public UIWizardFirstRunPage2,
+                                   public UIWizardFirstRunPage3
+{
+    Q_OBJECT;
+    Q_PROPERTY(QString id READ id WRITE setId);
+
+public:
+
+    /* Constructor: */
+    UIWizardFirstRunPageExpert(const QString &strMachineId, bool fBootHardDiskWasSet);
+
+protected:
+
+    /* Wrapper to access 'this' from base part: */
+    UIWizardPage* thisImp() { return this; }
+
+private slots:
+
+    /* Open with file-open dialog: */
+    void sltOpenMediumWithFileOpenDialog();
+
+private:
+
+    /* Translate stuff: */
+    void retranslateUi();
+
+    /* Prepare stuff: */
+    void initializePage();
+
+    /* Validation stuff: */
+    bool isComplete() const;
+    bool validatePage();
+};
+
+#endif // __UIWizardFirstRunPageExpert_h__
+
Index: /trunk/src/VBox/Frontends/VirtualBox/src/wizards/importappliance/UIWizardImportApp.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/wizards/importappliance/UIWizardImportApp.cpp	(revision 41020)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/wizards/importappliance/UIWizardImportApp.cpp	(revision 41021)
@@ -29,4 +29,5 @@
 #include "UIWizardImportAppPageBasic1.h"
 #include "UIWizardImportAppPageBasic2.h"
+#include "UIWizardImportAppPageExpert.h"
 #include "VBoxGlobal.h"
 #include "QIDialog.h"
@@ -134,18 +135,8 @@
 };
 
-UIWizardImportApp::UIWizardImportApp(const QString &strFileName /* = QString() */, QWidget *pParent /* = 0 */)
-    : UIWizard(pParent)
-{
-    /* Create & add pages: */
-    if (strFileName.isEmpty())
-        setPage(Page1, new UIWizardImportAppPageBasic1);
-    setPage(Page2, new UIWizardImportAppPageBasic2(strFileName));
-
-    /* Translate wizard: */
-    retranslateUi();
-
-    /* Translate wizard pages: */
-    retranslateAllPages();
-
+UIWizardImportApp::UIWizardImportApp(QWidget *pParent, const QString &strFileName)
+    : UIWizard(pParent, UIWizardType_ImportAppliance)
+    , m_strFileName(strFileName)
+{
 #ifndef Q_WS_MAC
     /* Assign watermark: */
@@ -155,15 +146,4 @@
     assignBackground(":/vmw_ovf_import_bg.png");
 #endif /* Q_WS_MAC */
-
-    /* Resize wizard to 'golden ratio': */
-    resizeToGoldenRatio(UIWizardType_ImportAppliance);
-
-    /* Setup connections: */
-    AssertMsg(!field("applianceWidget").value<ImportAppliancePointer>().isNull(), ("Appliance Widget is not set!\n"));
-    connect(this, SIGNAL(customButtonClicked(int)), field("applianceWidget").value<ImportAppliancePointer>(), SLOT(restoreDefaults()));
-    connect(this, SIGNAL(currentIdChanged(int)), this, SLOT(sltCurrentIdChanged(int)));
-
-    /* Make sure custom button shown even if final page is first to show: */
-    sltCurrentIdChanged(startId());
 }
 
@@ -174,17 +154,4 @@
         fResult = pImportApplianceWidget->isValid();
     return fResult;
-}
-
-void UIWizardImportApp::retranslateUi()
-{
-    /* Translate wizard: */
-    setWindowTitle(tr("Appliance Import Wizard"));
-    setButtonText(QWizard::CustomButton1, tr("Restore Defaults"));
-    setButtonText(QWizard::FinishButton, tr("Import"));
-}
-
-void UIWizardImportApp::sltCurrentIdChanged(int iId)
-{
-    setOption(QWizard::HaveCustomButton1, iId == Page2);
 }
 
@@ -212,4 +179,62 @@
 }
 
+void UIWizardImportApp::sltCurrentIdChanged(int iId)
+{
+    /* Call to base-class: */
+    UIWizard::sltCurrentIdChanged(iId);
+    /* Enable 2nd button (Reset to Defaults) for 2nd and Expert pages only! */
+    setOption(QWizard::HaveCustomButton2, (mode() == UIWizardMode_Basic && iId == Page2) ||
+                                          (mode() == UIWizardMode_Expert && iId == PageExpert));
+}
+
+void UIWizardImportApp::sltCustomButtonClicked(int iId)
+{
+    /* Call to base-class: */
+    UIWizard::sltCustomButtonClicked(iId);
+
+    /* Handle 2nd button: */
+    if (iId == CustomButton2)
+    {
+        /* Get appliance widget: */
+        ImportAppliancePointer pApplianceWidget = field("applianceWidget").value<ImportAppliancePointer>();
+        AssertMsg(!pApplianceWidget.isNull(), ("Appliance Widget is not set!\n"));
+        /* Reset it to default: */
+        pApplianceWidget->restoreDefaults();
+    }
+}
+
+void UIWizardImportApp::retranslateUi()
+{
+    /* Call to base-class: */
+    UIWizard::retranslateUi();
+
+    /* Translate wizard: */
+    setWindowTitle(tr("Appliance Import Wizard"));
+    setButtonText(QWizard::CustomButton2, tr("Restore Defaults"));
+    setButtonText(QWizard::FinishButton, tr("Import"));
+}
+
+void UIWizardImportApp::prepare()
+{
+    /* Create corresponding pages: */
+    switch (mode())
+    {
+        case UIWizardMode_Basic:
+        {
+            if (m_strFileName.isEmpty())
+                setPage(Page1, new UIWizardImportAppPageBasic1);
+            setPage(Page2, new UIWizardImportAppPageBasic2(m_strFileName));
+            break;
+        }
+        case UIWizardMode_Expert:
+        {
+            setPage(PageExpert, new UIWizardImportAppPageExpert(m_strFileName));
+            break;
+        }
+    }
+    /* Call to base-class: */
+    UIWizard::prepare();
+}
+
 #include "UIWizardImportApp.moc"
 
Index: /trunk/src/VBox/Frontends/VirtualBox/src/wizards/importappliance/UIWizardImportApp.h
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/wizards/importappliance/UIWizardImportApp.h	(revision 41020)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/wizards/importappliance/UIWizardImportApp.h	(revision 41021)
@@ -37,6 +37,12 @@
     };
 
+    /* Page IDs: */
+    enum
+    {
+        PageExpert
+    };
+
     /* Constructor: */
-    UIWizardImportApp(const QString &strFileName = QString(), QWidget *pParent = 0);
+    UIWizardImportApp(QWidget *pParent, const QString &strFileName);
 
     /* Is appliance valid? */
@@ -50,4 +56,5 @@
     /* Who will be able to import appliance: */
     friend class UIWizardImportAppPageBasic2;
+    friend class UIWizardImportAppPageExpert;
 
 private slots:
@@ -55,4 +62,6 @@
     /* Page change handler: */
     void sltCurrentIdChanged(int iId);
+    /* Custom button 2 click handler: */
+    void sltCustomButtonClicked(int iId);
 
 private:
@@ -60,4 +69,10 @@
     /* Translation stuff: */
     void retranslateUi();
+
+    /* Pages related stuff: */
+    void prepare();
+
+    /* Variables: */
+    QString m_strFileName;
 };
 
Index: /trunk/src/VBox/Frontends/VirtualBox/src/wizards/importappliance/UIWizardImportAppPageBasic1.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/wizards/importappliance/UIWizardImportAppPageBasic1.cpp	(revision 41020)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/wizards/importappliance/UIWizardImportAppPageBasic1.cpp	(revision 41021)
@@ -27,6 +27,10 @@
 #include "UIWizardImportApp.h"
 #include "VBoxGlobal.h"
+#include "VBoxFilePathSelectorWidget.h"
 #include "QIRichTextLabel.h"
-#include "VBoxFilePathSelectorWidget.h"
+
+UIWizardImportAppPage1::UIWizardImportAppPage1()
+{
+}
 
 UIWizardImportAppPageBasic1::UIWizardImportAppPageBasic1()
@@ -34,11 +38,15 @@
     /* Create widgets: */
     QVBoxLayout *pMainLayout = new QVBoxLayout(this);
+    {
         m_pLabel = new QIRichTextLabel(this);
         m_pFileSelector = new VBoxEmptyFileSelector(this);
+        {
             m_pFileSelector->setMode(VBoxFilePathSelectorWidget::Mode_File_Open);
             m_pFileSelector->setHomeDir(vboxGlobal().documentsPath());
-    pMainLayout->addWidget(m_pLabel);
-    pMainLayout->addWidget(m_pFileSelector);
-    pMainLayout->addStretch();
+        }
+        pMainLayout->addWidget(m_pLabel);
+        pMainLayout->addWidget(m_pFileSelector);
+        pMainLayout->addStretch();
+    }
 
     /* Setup connections: */
@@ -49,9 +57,7 @@
 {
     /* Translate page: */
-    setTitle(UIWizardImportApp::tr("Welcome to the Appliance Import Wizard!"));
+    setTitle(UIWizardImportApp::tr("Welcome to the Appliance Import wizard!"));
 
     /* Translate widgets: */
-    m_pFileSelector->setFileDialogTitle(UIWizardImportApp::tr("Select an appliance to import"));
-    m_pFileSelector->setFileFilters(UIWizardImportApp::tr("Open Virtualization Format (%1)").arg("*.ova *.ovf"));
     m_pLabel->setText(UIWizardImportApp::tr("<p>This wizard will guide you through importing an appliance.</p>"
                                             "<p>%1</p><p>VirtualBox currently supports importing appliances "
@@ -59,4 +65,7 @@
                                             "select the file to import below:</p>")
                                            .arg(standardHelpText()));
+    m_pFileSelector->setChooseButtonText(UIWizardImportApp::tr("Open appliance..."));
+    m_pFileSelector->setFileDialogTitle(UIWizardImportApp::tr("Select an appliance to import"));
+    m_pFileSelector->setFileFilters(UIWizardImportApp::tr("Open Virtualization Format (%1)").arg("*.ova *.ovf"));
 }
 
@@ -69,6 +78,7 @@
 bool UIWizardImportAppPageBasic1::isComplete() const
 {
-    const QString &strFile = m_pFileSelector->path().toLower();
-    return VBoxGlobal::hasAllowedExtension(strFile, VBoxDefs::OVFFileExts) && QFileInfo(m_pFileSelector->path()).exists();
+    /* Make sure appliance file has allowed extension and exists: */
+    return VBoxGlobal::hasAllowedExtension(m_pFileSelector->path().toLower(), VBoxDefs::OVFFileExts) &&
+           QFileInfo(m_pFileSelector->path()).exists();
 }
 
Index: /trunk/src/VBox/Frontends/VirtualBox/src/wizards/importappliance/UIWizardImportAppPageBasic1.h
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/wizards/importappliance/UIWizardImportAppPageBasic1.h	(revision 41020)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/wizards/importappliance/UIWizardImportAppPageBasic1.h	(revision 41021)
@@ -24,9 +24,21 @@
 
 /* Forward declarations: */
+class VBoxEmptyFileSelector;
 class QIRichTextLabel;
-class VBoxEmptyFileSelector;
 
-/* 1st page of the Import Appliance wizard: */
-class UIWizardImportAppPageBasic1 : public UIWizardPage
+/* 1st page of the Import Appliance wizard (base part): */
+class UIWizardImportAppPage1 : public UIWizardPageBase
+{
+protected:
+
+    /* Constructor: */
+    UIWizardImportAppPage1();
+
+    /* Widgets: */
+    VBoxEmptyFileSelector *m_pFileSelector;
+};
+
+/* 1st page of the Import Appliance wizard (basic extension): */
+class UIWizardImportAppPageBasic1 : public UIWizardPage, public UIWizardImportAppPage1
 {
     Q_OBJECT;
@@ -51,5 +63,4 @@
     /* Widgets: */
     QIRichTextLabel *m_pLabel;
-    VBoxEmptyFileSelector *m_pFileSelector;
 };
 
Index: /trunk/src/VBox/Frontends/VirtualBox/src/wizards/importappliance/UIWizardImportAppPageBasic2.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/wizards/importappliance/UIWizardImportAppPageBasic2.cpp	(revision 41020)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/wizards/importappliance/UIWizardImportAppPageBasic2.cpp	(revision 41021)
@@ -26,18 +26,26 @@
 #include "QIRichTextLabel.h"
 
+UIWizardImportAppPage2::UIWizardImportAppPage2()
+{
+}
+
 UIWizardImportAppPageBasic2::UIWizardImportAppPageBasic2(const QString &strFileName)
 {
     /* Create widgets: */
     QVBoxLayout *pMainLayout = new QVBoxLayout(this);
+    {
         m_pLabel = new QIRichTextLabel(this);
         m_pApplianceWidget = new UIApplianceImportEditorWidget(this);
+        {
             m_pApplianceWidget->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::MinimumExpanding);
             m_pApplianceWidget->setFile(strFileName);
-    pMainLayout->addWidget(m_pLabel);
-    pMainLayout->addWidget(m_pApplianceWidget);
+        }
+        pMainLayout->addWidget(m_pLabel);
+        pMainLayout->addWidget(m_pApplianceWidget);
+    }
 
-    /* Register ImportAppliancePointer class: */
+    /* Register classes: */
     qRegisterMetaType<ImportAppliancePointer>();
-    /* Register 'applianceWidget' field! */
+    /* Register fields: */
     registerField("applianceWidget", this, "applianceWidget");
 }
@@ -71,8 +79,18 @@
 bool UIWizardImportAppPageBasic2::validatePage()
 {
-    /* Import appliance: */
+    /* Initial result: */
+    bool fResult = true;
+
+    /* Lock finish button: */
     startProcessing();
-    bool fResult = qobject_cast<UIWizardImportApp*>(wizard())->importAppliance();
+
+    /* Try to import appliance: */
+    if (fResult)
+        fResult = qobject_cast<UIWizardImportApp*>(wizard())->importAppliance();
+
+    /* Unlock finish button: */
     endProcessing();
+
+    /* Return result: */
     return fResult;
 }
Index: /trunk/src/VBox/Frontends/VirtualBox/src/wizards/importappliance/UIWizardImportAppPageBasic2.h
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/wizards/importappliance/UIWizardImportAppPageBasic2.h	(revision 41020)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/wizards/importappliance/UIWizardImportAppPageBasic2.h	(revision 41021)
@@ -28,6 +28,21 @@
 class QIRichTextLabel;
 
-/* 2nd page of the Import Appliance wizard: */
-class UIWizardImportAppPageBasic2 : public UIWizardPage
+/* 2nd page of the Import Appliance wizard (base part): */
+class UIWizardImportAppPage2 : public UIWizardPageBase
+{
+protected:
+
+    /* Constructor: */
+    UIWizardImportAppPage2();
+
+    /* Stuff for 'applianceWidget' field: */
+    ImportAppliancePointer applianceWidget() const { return m_pApplianceWidget; }
+
+    /* Widgets: */
+    ImportAppliancePointer m_pApplianceWidget;
+};
+
+/* 2nd page of the Import Appliance wizard (basic extension): */
+class UIWizardImportAppPageBasic2 : public UIWizardPage, public UIWizardImportAppPage2
 {
     Q_OBJECT;
@@ -36,4 +51,5 @@
 public:
 
+    /* Constructor: */
     UIWizardImportAppPageBasic2(const QString &strFileName);
 
@@ -50,10 +66,6 @@
     bool validatePage();
 
-    /* Stuff for 'applianceWidget' field: */
-    ImportAppliancePointer applianceWidget() const { return m_pApplianceWidget; }
-
     /* Widgets: */
     QIRichTextLabel *m_pLabel;
-    ImportAppliancePointer m_pApplianceWidget;
 };
 
Index: /trunk/src/VBox/Frontends/VirtualBox/src/wizards/importappliance/UIWizardImportAppPageExpert.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/wizards/importappliance/UIWizardImportAppPageExpert.cpp	(revision 41021)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/wizards/importappliance/UIWizardImportAppPageExpert.cpp	(revision 41021)
@@ -0,0 +1,112 @@
+/* $Id$ */
+/** @file
+ *
+ * VBox frontends: Qt4 GUI ("VirtualBox"):
+ * UIWizardImportAppPageExpert class implementation
+ */
+
+/*
+ * Copyright (C) 2009-2012 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ */
+
+/* Global includes: */
+#include <QFileInfo>
+#include <QVBoxLayout>
+
+/* Local includes: */
+#include "UIWizardImportAppPageExpert.h"
+#include "UIWizardImportApp.h"
+#include "VBoxGlobal.h"
+#include "VBoxFilePathSelectorWidget.h"
+#include "UIApplianceImportEditorWidget.h"
+
+UIWizardImportAppPageExpert::UIWizardImportAppPageExpert(const QString &strFileName)
+{
+    /* Create widgets: */
+    QVBoxLayout *pMainLayout = new QVBoxLayout(this);
+    {
+        pMainLayout->setContentsMargins(8, 6, 8, 6);
+        m_pFileSelector = new VBoxEmptyFileSelector(this);
+        {
+            m_pFileSelector->setMode(VBoxFilePathSelectorWidget::Mode_File_Open);
+            m_pFileSelector->setHomeDir(vboxGlobal().documentsPath());
+        }
+        m_pApplianceWidget = new UIApplianceImportEditorWidget(this);
+        {
+            m_pApplianceWidget->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::MinimumExpanding);
+            m_pApplianceWidget->setFile(strFileName);
+        }
+        pMainLayout->addWidget(m_pFileSelector);
+        pMainLayout->addWidget(m_pApplianceWidget);
+    }
+
+    /* Setup connections: */
+    connect(m_pFileSelector, SIGNAL(pathChanged(const QString&)), this, SLOT(sltFilePathChangeHandler()));
+
+    /* Register classes: */
+    qRegisterMetaType<ImportAppliancePointer>();
+    /* Register fields: */
+    registerField("applianceWidget", this, "applianceWidget");
+}
+
+void UIWizardImportAppPageExpert::sltFilePathChangeHandler()
+{
+    /* Check if set file contains valid appliance: */
+    if (m_pApplianceWidget->setFile(m_pFileSelector->path()))
+    {
+        /* Reset the modified bit if file was correctly set: */
+        m_pFileSelector->resetModified();
+    }
+
+    emit completeChanged();
+}
+
+void UIWizardImportAppPageExpert::retranslateUi()
+{
+    /* Translate widgets: */
+    m_pFileSelector->setChooseButtonText(UIWizardImportApp::tr("Open appliance..."));
+    m_pFileSelector->setFileDialogTitle(UIWizardImportApp::tr("Select an appliance to import"));
+    m_pFileSelector->setFileFilters(UIWizardImportApp::tr("Open Virtualization Format (%1)").arg("*.ova *.ovf"));
+}
+
+void UIWizardImportAppPageExpert::initializePage()
+{
+    /* Translate page: */
+    retranslateUi();
+}
+
+bool UIWizardImportAppPageExpert::isComplete() const
+{
+    /* Make sure appliance file has allowed extension and exists and appliance widget is valid: */
+    return VBoxGlobal::hasAllowedExtension(m_pFileSelector->path().toLower(), VBoxDefs::OVFFileExts) &&
+           QFileInfo(m_pFileSelector->path()).exists() &&
+           m_pApplianceWidget->isValid();
+}
+
+bool UIWizardImportAppPageExpert::validatePage()
+{
+    /* Initial result: */
+    bool fResult = true;
+
+    /* Lock finish button: */
+    startProcessing();
+
+    /* Try to import appliance: */
+    if (fResult)
+        fResult = qobject_cast<UIWizardImportApp*>(wizard())->importAppliance();
+
+    /* Unlock finish button: */
+    endProcessing();
+
+    /* Return result: */
+    return fResult;
+}
+
Index: /trunk/src/VBox/Frontends/VirtualBox/src/wizards/importappliance/UIWizardImportAppPageExpert.h
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/wizards/importappliance/UIWizardImportAppPageExpert.h	(revision 41021)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/wizards/importappliance/UIWizardImportAppPageExpert.h	(revision 41021)
@@ -0,0 +1,58 @@
+/** @file
+ *
+ * VBox frontends: Qt4 GUI ("VirtualBox"):
+ * UIWizardImportAppPageExpert class declaration
+ */
+
+/*
+ * Copyright (C) 2009-2012 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ */
+
+#ifndef __UIWizardImportAppPageExpert_h__
+#define __UIWizardImportAppPageExpert_h__
+
+/* Local includes: */
+#include "UIWizardImportAppPageBasic1.h"
+#include "UIWizardImportAppPageBasic2.h"
+
+/* Expert page of the Import Appliance wizard: */
+class UIWizardImportAppPageExpert : public UIWizardPage,
+                                    public UIWizardImportAppPage1,
+                                    public UIWizardImportAppPage2
+{
+    Q_OBJECT;
+    Q_PROPERTY(ImportAppliancePointer applianceWidget READ applianceWidget);
+
+public:
+
+    /* Constructor: */
+    UIWizardImportAppPageExpert(const QString &strFileName);
+
+private slots:
+
+    /* File-path change handler: */
+    void sltFilePathChangeHandler();
+
+private:
+
+    /* Translate stuff: */
+    void retranslateUi();
+
+    /* Prepare stuff: */
+    void initializePage();
+
+    /* Validation stuff: */
+    bool isComplete() const;
+    bool validatePage();
+};
+
+#endif /* __UIWizardImportAppPageExpert_h__ */
+
Index: /trunk/src/VBox/Frontends/VirtualBox/src/wizards/newvd/UIWizardNewVD.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/wizards/newvd/UIWizardNewVD.cpp	(revision 41020)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/wizards/newvd/UIWizardNewVD.cpp	(revision 41021)
@@ -27,27 +27,14 @@
 #include "UIWizardNewVDPageBasic3.h"
 #include "UIWizardNewVDPageBasic4.h"
+#include "UIWizardNewVDPageExpert.h"
 #include "VBoxGlobal.h"
 #include "UIMessageCenter.h"
 
 UIWizardNewVD::UIWizardNewVD(QWidget *pParent, const QString &strDefaultName, const QString &strDefaultPath, qulonglong uDefaultSize)
-    : UIWizard(pParent)
+    : UIWizard(pParent, UIWizardType_NewVD)
+    , m_strDefaultName(strDefaultName)
+    , m_strDefaultPath(strDefaultPath)
+    , m_uDefaultSize(uDefaultSize)
 {
-#ifdef Q_WS_WIN
-    /* Hide window icon: */
-    setWindowIcon(QIcon());
-#endif /* Q_WS_WIN */
-
-    /* Create & add pages: */
-    setPage(Page1, new UIWizardNewVDPageBasic1);
-    setPage(Page2, new UIWizardNewVDPageBasic2);
-    setPage(Page3, new UIWizardNewVDPageBasic3(strDefaultName, strDefaultPath, uDefaultSize));
-    setPage(Page4, new UIWizardNewVDPageBasic4);
-
-    /* Translate wizard: */
-    retranslateUi();
-
-    /* Translate wizard pages: */
-    retranslateAllPages();
-
 #ifndef Q_WS_MAC
     /* Assign watermark: */
@@ -57,7 +44,4 @@
     assignBackground(":/vmw_new_harddisk_bg.png");
 #endif /* Q_WS_MAC */
-
-    /* Resize wizard to 'golden ratio': */
-    resizeToGoldenRatio(UIWizardType_NewVD);
 }
 
@@ -87,5 +71,4 @@
     QString strMediumPath = field("mediumPath").toString();
     qulonglong uSize = field("mediumSize").toULongLong();
-
     /* Check attributes: */
     AssertReturn(!strMediumPath.isNull(), false);
@@ -106,6 +89,4 @@
     /* Create base storage for the new hard disk: */
     progress = virtualDisk.CreateBaseStorage(uSize, uVariant);
-
-    /* Check for errors: */
     if (!virtualDisk.isOk())
     {
@@ -113,4 +94,6 @@
         return false;
     }
+
+    /* Show creation progress: */
     msgCenter().showModalProgressDialog(progress, windowTitle(), ":/progress_media_create_90px.png", this, true);
     if (progress.GetCanceled())
@@ -122,5 +105,5 @@
     }
 
-    /* Assign virtualDisk field value: */
+    /* Remember created virtual-disk: */
     m_virtualDisk = virtualDisk;
 
@@ -133,4 +116,7 @@
 void UIWizardNewVD::retranslateUi()
 {
+    /* Call to base-class: */
+    UIWizard::retranslateUi();
+
     /* Translate wizard: */
     setWindowTitle(tr("Create New Virtual Disk"));
@@ -138,2 +124,25 @@
 }
 
+void UIWizardNewVD::prepare()
+{
+    /* Create corresponding pages: */
+    switch (mode())
+    {
+        case UIWizardMode_Basic:
+        {
+            setPage(Page1, new UIWizardNewVDPageBasic1);
+            setPage(Page2, new UIWizardNewVDPageBasic2);
+            setPage(Page3, new UIWizardNewVDPageBasic3(m_strDefaultName, m_strDefaultPath, m_uDefaultSize));
+            setPage(Page4, new UIWizardNewVDPageBasic4);
+            break;
+        }
+        case UIWizardMode_Expert:
+        {
+            setPage(PageExpert, new UIWizardNewVDPageExpert(m_strDefaultName, m_strDefaultPath, m_uDefaultSize));
+            break;
+        }
+    }
+    /* Call to base-class: */
+    UIWizard::prepare();
+}
+
Index: /trunk/src/VBox/Frontends/VirtualBox/src/wizards/newvd/UIWizardNewVD.h
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/wizards/newvd/UIWizardNewVD.h	(revision 41020)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/wizards/newvd/UIWizardNewVD.h	(revision 41021)
@@ -40,7 +40,14 @@
     };
 
+    /* Page IDs: */
+    enum
+    {
+        PageExpert
+    };
+
     /* Constructor: */
-    UIWizardNewVD(QWidget *pParent, const QString &strDefaultName,
-                  const QString &strDefaultPath, qulonglong uDefaultSize);
+    UIWizardNewVD(QWidget *pParent,
+                  const QString &strDefaultName, const QString &strDefaultPath,
+                  qulonglong uDefaultSize);
 
     /* Returns virtual-disk: */
@@ -57,4 +64,5 @@
     /* Who will be able to create virtual-disk: */
     friend class UIWizardNewVDPageBasic4;
+    friend class UIWizardNewVDPageExpert;
 
 private:
@@ -63,5 +71,11 @@
     void retranslateUi();
 
+    /* Pages related stuff: */
+    void prepare();
+
     /* Variables: */
+    QString m_strDefaultName;
+    QString m_strDefaultPath;
+    qulonglong m_uDefaultSize;
     CMedium m_virtualDisk;
 };
Index: /trunk/src/VBox/Frontends/VirtualBox/src/wizards/newvd/UIWizardNewVDPageBasic1.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/wizards/newvd/UIWizardNewVDPageBasic1.cpp	(revision 41020)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/wizards/newvd/UIWizardNewVDPageBasic1.cpp	(revision 41021)
@@ -20,7 +20,7 @@
 /* Global includes: */
 #include <QVBoxLayout>
+#include <QButtonGroup>
+#include <QGroupBox>
 #include <QRadioButton>
-#include <QGroupBox>
-#include <QButtonGroup>
 
 /* Local includes: */
@@ -30,67 +30,105 @@
 #include "QIRichTextLabel.h"
 
+UIWizardNewVDPage1::UIWizardNewVDPage1()
+{
+}
+
+QRadioButton* UIWizardNewVDPage1::addFormatButton(QVBoxLayout *pFormatsLayout, CMediumFormat mf)
+{
+    /* Check that medium format supports creation: */
+    ULONG uFormatCapabilities = mf.GetCapabilities();
+    if (!(uFormatCapabilities & MediumFormatCapabilities_CreateFixed ||
+          uFormatCapabilities & MediumFormatCapabilities_CreateDynamic))
+        return 0;
+
+    /* Check that medium format supports creation of virtual hard-disks: */
+    QVector<QString> fileExtensions;
+    QVector<KDeviceType> deviceTypes;
+    mf.DescribeFileExtensions(fileExtensions, deviceTypes);
+    if (!deviceTypes.contains(KDeviceType_HardDisk))
+        return 0;
+
+    /* Create/add corresponding radio-button: */
+    QRadioButton *pFormatButton = new QRadioButton(m_pFormatCnt);
+    pFormatsLayout->addWidget(pFormatButton);
+    return pFormatButton;
+}
+
+CMediumFormat UIWizardNewVDPage1::mediumFormat() const
+{
+    return m_pFormatButtonGroup->checkedButton() ? m_formats[m_pFormatButtonGroup->checkedId()] : CMediumFormat();
+}
+
+void UIWizardNewVDPage1::setMediumFormat(const CMediumFormat &mediumFormat)
+{
+    int iPosition = m_formats.indexOf(mediumFormat);
+    if (iPosition >= 0)
+    {
+        m_pFormatButtonGroup->button(iPosition)->click();
+        m_pFormatButtonGroup->button(iPosition)->setFocus();
+    }
+}
+
 UIWizardNewVDPageBasic1::UIWizardNewVDPageBasic1()
 {
     /* Create widgets: */
     QVBoxLayout *pMainLayout = new QVBoxLayout(this);
+    {
         m_pLabel = new QIRichTextLabel(this);
-        m_pFormatContainer = new QGroupBox(this);
-            m_pFormatContainer->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Fixed);
-            QVBoxLayout *pFormatsLayout = new QVBoxLayout(m_pFormatContainer);
-    pMainLayout->addWidget(m_pLabel);
-    pMainLayout->addWidget(m_pFormatContainer);
-    pMainLayout->addStretch();
-
-    /* Greate button group: */
-    m_pButtonGroup = new QButtonGroup(this);
-
-    /* Enumerate supportable formats: */
-    CSystemProperties systemProperties = vboxGlobal().virtualBox().GetSystemProperties();
-    const QVector<CMediumFormat> &medFormats = systemProperties.GetMediumFormats();
-    /* Search for default (VDI) format first: */
-    for (int i = 0; i < medFormats.size(); ++i)
-    {
-        /* Get iterated medium format: */
-        const CMediumFormat &medFormat = medFormats[i];
-        QString strFormatName(medFormat.GetName());
-        if (strFormatName == "VDI")
+        m_pFormatCnt = new QGroupBox(this);
         {
-            QRadioButton *pButton = addFormatButton(pFormatsLayout, medFormat);
-            if (pButton)
+            m_pFormatCnt->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Fixed);
+            m_pFormatButtonGroup = new QButtonGroup(m_pFormatCnt);
             {
-                m_formats << medFormat;
-                m_formatNames << strFormatName;
-                m_pButtonGroup->addButton(pButton, m_formatNames.size() - 1);
+                QVBoxLayout *pFormatsLayout = new QVBoxLayout(m_pFormatCnt);
+                {
+                    CSystemProperties systemProperties = vboxGlobal().virtualBox().GetSystemProperties();
+                    const QVector<CMediumFormat> &medFormats = systemProperties.GetMediumFormats();
+                    for (int i = 0; i < medFormats.size(); ++i)
+                    {
+                        const CMediumFormat &medFormat = medFormats[i];
+                        QString strFormatName(medFormat.GetName());
+                        if (strFormatName == "VDI")
+                        {
+                            QRadioButton *pButton = addFormatButton(pFormatsLayout, medFormat);
+                            if (pButton)
+                            {
+                                m_formats << medFormat;
+                                m_formatNames << strFormatName;
+                                m_pFormatButtonGroup->addButton(pButton, m_formatNames.size() - 1);
+                            }
+                        }
+                    }
+                    for (int i = 0; i < medFormats.size(); ++i)
+                    {
+                        const CMediumFormat &medFormat = medFormats[i];
+                        QString strFormatName(medFormat.GetName());
+                        if (strFormatName != "VDI")
+                        {
+                            QRadioButton *pButton = addFormatButton(pFormatsLayout, medFormat);
+                            if (pButton)
+                            {
+                                m_formats << medFormat;
+                                m_formatNames << strFormatName;
+                                m_pFormatButtonGroup->addButton(pButton, m_formatNames.size() - 1);
+                            }
+                        }
+                    }
+                }
+                m_pFormatButtonGroup->button(0)->click();
+                m_pFormatButtonGroup->button(0)->setFocus();
             }
         }
-    }
-    /* Look for other formats: */
-    for (int i = 0; i < medFormats.size(); ++i)
-    {
-        /* Get iterated medium format: */
-        const CMediumFormat &medFormat = medFormats[i];
-        QString strFormatName(medFormat.GetName());
-        if (strFormatName != "VDI")
-        {
-            QRadioButton *pButton = addFormatButton(pFormatsLayout, medFormat);
-            if (pButton)
-            {
-                m_formats << medFormat;
-                m_formatNames << strFormatName;
-                m_pButtonGroup->addButton(pButton, m_formatNames.size() - 1);
-            }
-        }
+        pMainLayout->addWidget(m_pLabel);
+        pMainLayout->addWidget(m_pFormatCnt);
+        pMainLayout->addStretch();
     }
 
     /* Setup connections: */
-    connect(m_pButtonGroup, SIGNAL(buttonClicked(QAbstractButton*)), this, SIGNAL(completeChanged()));
+    connect(m_pFormatButtonGroup, SIGNAL(buttonClicked(QAbstractButton*)), this, SIGNAL(completeChanged()));
 
-    /* Initialize connections: */
-    m_pButtonGroup->button(0)->click();
-    m_pButtonGroup->button(0)->setFocus();
-
-    /* Register CMediumFormat class: */
+    /* Register classes: */
     qRegisterMetaType<CMediumFormat>();
-    /* Register 'mediumFormat' field: */
+    /* Register fields: */
     registerField("mediumFormat", this, "mediumFormat");
 }
@@ -99,5 +137,5 @@
 {
     /* Translate page: */
-    setTitle(UIWizardNewVD::tr("Welcome to the virtual disk creation wizard"));
+    setTitle(UIWizardNewVD::tr("Welcome to the New Virtual Disk wizard!"));
 
     /* Translate widgets: */
@@ -108,12 +146,10 @@
                                                            "to use it with other virtualization software you can "
                                                            "leave this setting unchanged.</p>"));
-    m_pFormatContainer->setTitle(UIWizardNewVD::tr("File type"));
-
-    /* Translate 'format' buttons: */
-    QList<QAbstractButton*> buttons = m_pButtonGroup->buttons();
+    m_pFormatCnt->setTitle(UIWizardNewVD::tr("File type"));
+    QList<QAbstractButton*> buttons = m_pFormatButtonGroup->buttons();
     for (int i = 0; i < buttons.size(); ++i)
     {
         QAbstractButton *pButton = buttons[i];
-        pButton->setText(UIWizardNewVD::fullFormatName(m_formatNames[m_pButtonGroup->id(pButton)]));
+        pButton->setText(UIWizardNewVD::fullFormatName(m_formatNames[m_pFormatButtonGroup->id(pButton)]));
     }
 }
@@ -127,4 +163,5 @@
 bool UIWizardNewVDPageBasic1::isComplete() const
 {
+    /* Make sure medium format is correct: */
     return !mediumFormat().isNull();
 }
@@ -132,6 +169,7 @@
 int UIWizardNewVDPageBasic1::nextId() const
 {
-    CMediumFormat medFormat = mediumFormat();
-    ULONG uCapabilities = medFormat.GetCapabilities();
+    /* Show variant page only if there is something to show: */
+    CMediumFormat mf = mediumFormat();
+    ULONG uCapabilities = mf.GetCapabilities();
     int cTest = 0;
     if (uCapabilities & KMediumFormatCapabilities_CreateDynamic)
@@ -143,41 +181,6 @@
     if (cTest > 1)
         return UIWizardNewVD::Page2;
+    /* Skip otherwise: */
     return UIWizardNewVD::Page3;
 }
 
-QRadioButton* UIWizardNewVDPageBasic1::addFormatButton(QVBoxLayout *pFormatsLayout, CMediumFormat medFormat)
-{
-    /* Check that medium format supports creation: */
-    ULONG uFormatCapabilities = medFormat.GetCapabilities();
-    if (!(uFormatCapabilities & MediumFormatCapabilities_CreateFixed ||
-          uFormatCapabilities & MediumFormatCapabilities_CreateDynamic))
-        return 0;
-
-    /* Check that medium format supports creation of virtual hard-disks: */
-    QVector<QString> fileExtensions;
-    QVector<KDeviceType> deviceTypes;
-    medFormat.DescribeFileExtensions(fileExtensions, deviceTypes);
-    if (!deviceTypes.contains(KDeviceType_HardDisk))
-        return 0;
-
-    /* Create/add corresponding radio-button: */
-    QRadioButton *pFormatButton = new QRadioButton(m_pFormatContainer);
-    pFormatsLayout->addWidget(pFormatButton);
-    return pFormatButton;
-}
-
-CMediumFormat UIWizardNewVDPageBasic1::mediumFormat() const
-{
-    return m_pButtonGroup->checkedButton() ? m_formats[m_pButtonGroup->checkedId()] : CMediumFormat();
-}
-
-void UIWizardNewVDPageBasic1::setMediumFormat(const CMediumFormat &mediumFormat)
-{
-    int iPosition = m_formats.indexOf(mediumFormat);
-    if (iPosition >= 0)
-    {
-        m_pButtonGroup->button(iPosition)->click();
-        m_pButtonGroup->button(iPosition)->setFocus();
-    }
-}
-
Index: /trunk/src/VBox/Frontends/VirtualBox/src/wizards/newvd/UIWizardNewVDPageBasic1.h
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/wizards/newvd/UIWizardNewVDPageBasic1.h	(revision 41020)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/wizards/newvd/UIWizardNewVDPageBasic1.h	(revision 41021)
@@ -26,11 +26,35 @@
 /* Forward declarations: */
 class QVBoxLayout;
+class QButtonGroup;
+class QGroupBox;
 class QRadioButton;
 class QIRichTextLabel;
-class QGroupBox;
-class QButtonGroup;
 
-/* 1st page of the New Virtual Disk wizard: */
-class UIWizardNewVDPageBasic1 : public UIWizardPage
+/* 1st page of the New Virtual Disk wizard (base part): */
+class UIWizardNewVDPage1 : public UIWizardPageBase
+{
+protected:
+
+    /* Constructor: */
+    UIWizardNewVDPage1();
+
+    /* Helping stuff: */
+    QRadioButton* addFormatButton(QVBoxLayout *pFormatsLayout, CMediumFormat mf);
+
+    /* Stuff for 'mediumFormat' field: */
+    CMediumFormat mediumFormat() const;
+    void setMediumFormat(const CMediumFormat &mediumFormat);
+
+    /* Variables: */
+    QButtonGroup *m_pFormatButtonGroup;
+    QList<CMediumFormat> m_formats;
+    QStringList m_formatNames;
+
+    /* Widgets: */
+    QGroupBox *m_pFormatCnt;
+};
+
+/* 1st page of the New Virtual Disk wizard (basic extension): */
+class UIWizardNewVDPageBasic1 : public UIWizardPage, public UIWizardNewVDPage1
 {
     Q_OBJECT;
@@ -56,19 +80,6 @@
     int nextId() const;
 
-    /* Helping stuff: */
-    QRadioButton* addFormatButton(QVBoxLayout *pFormatsLayout, CMediumFormat mediumFormat);
-
-    /* Stuff for 'mediumFormat' field: */
-    CMediumFormat mediumFormat() const;
-    void setMediumFormat(const CMediumFormat &mediumFormat);
-
-    /* Variables: */
-    QButtonGroup *m_pButtonGroup;
-    QList<CMediumFormat> m_formats;
-    QStringList m_formatNames;
-
     /* Widgets: */
     QIRichTextLabel *m_pLabel;
-    QGroupBox *m_pFormatContainer;
 };
 
Index: /trunk/src/VBox/Frontends/VirtualBox/src/wizards/newvd/UIWizardNewVDPageBasic2.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/wizards/newvd/UIWizardNewVDPageBasic2.cpp	(revision 41020)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/wizards/newvd/UIWizardNewVDPageBasic2.cpp	(revision 41021)
@@ -20,7 +20,8 @@
 /* Global includes: */
 #include <QVBoxLayout>
+#include <QGroupBox>
+#include <QButtonGroup>
 #include <QRadioButton>
 #include <QCheckBox>
-#include <QGroupBox>
 
 /* Local includes: */
@@ -30,37 +31,89 @@
 #include "QIRichTextLabel.h"
 
+UIWizardNewVDPage2::UIWizardNewVDPage2()
+{
+}
+
+qulonglong UIWizardNewVDPage2::mediumVariant() const
+{
+    /* Initial value: */
+    qulonglong uMediumVariant = (qulonglong)KMediumVariant_Max;
+
+    /* Exclusive options: */
+    if (m_pDynamicalButton->isChecked())
+        uMediumVariant = (qulonglong)KMediumVariant_Standard;
+    else if (m_pFixedButton->isChecked())
+        uMediumVariant = (qulonglong)KMediumVariant_Fixed;
+
+    /* Additional options: */
+    if (m_pSplitBox->isChecked())
+        uMediumVariant |= (qulonglong)KMediumVariant_VmdkSplit2G;
+
+    /* Return options: */
+    return uMediumVariant;
+}
+
+void UIWizardNewVDPage2::setMediumVariant(qulonglong uMediumVariant)
+{
+    /* Exclusive options: */
+    if (uMediumVariant & (qulonglong)KMediumVariant_Fixed)
+    {
+        m_pFixedButton->click();
+        m_pFixedButton->setFocus();
+    }
+    else
+    {
+        m_pDynamicalButton->click();
+        m_pDynamicalButton->setFocus();
+    }
+
+    /* Additional options: */
+    m_pSplitBox->setChecked(uMediumVariant & (qulonglong)KMediumVariant_VmdkSplit2G);
+}
+
 UIWizardNewVDPageBasic2::UIWizardNewVDPageBasic2()
-    : m_pDynamicalButton(0), m_pFixedButton(0), m_pSplitBox(0)
 {
     /* Create widgets: */
     QVBoxLayout *pMainLayout = new QVBoxLayout(this);
+    {
         m_pDescriptionLabel = new QIRichTextLabel(this);
         m_pDynamicLabel = new QIRichTextLabel(this);
         m_pFixedLabel = new QIRichTextLabel(this);
         m_pSplitLabel = new QIRichTextLabel(this);
-        m_pVariantContainer = new QGroupBox(this);
-            m_pVariantContainer->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Fixed);
-            QVBoxLayout *pVariantsLayout = new QVBoxLayout(m_pVariantContainer);
-                m_pDynamicalButton = new QRadioButton(m_pVariantContainer);
-                    m_pDynamicalButton->click();
-                    m_pDynamicalButton->setFocus();
-                m_pFixedButton = new QRadioButton(m_pVariantContainer);
-                m_pSplitBox = new QCheckBox(m_pVariantContainer);
-            pVariantsLayout->addWidget(m_pDynamicalButton);
-            pVariantsLayout->addWidget(m_pFixedButton);
-            pVariantsLayout->addWidget(m_pSplitBox);
-    pMainLayout->addWidget(m_pDescriptionLabel);
-    pMainLayout->addWidget(m_pDynamicLabel);
-    pMainLayout->addWidget(m_pFixedLabel);
-    pMainLayout->addWidget(m_pSplitLabel);
-    pMainLayout->addWidget(m_pVariantContainer);
-    pMainLayout->addStretch();
+        m_pVariantCnt = new QGroupBox(this);
+        {
+            m_pVariantCnt->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Fixed);
+            QVBoxLayout *pVariantCntLayout = new QVBoxLayout(m_pVariantCnt);
+            {
+                m_pVariantButtonGroup = new QButtonGroup(m_pVariantCnt);
+                {
+                    m_pDynamicalButton = new QRadioButton(m_pVariantCnt);
+                    {
+                        m_pDynamicalButton->click();
+                        m_pDynamicalButton->setFocus();
+                    }
+                    m_pFixedButton = new QRadioButton(m_pVariantCnt);
+                    m_pVariantButtonGroup->addButton(m_pDynamicalButton, 0);
+                    m_pVariantButtonGroup->addButton(m_pFixedButton, 1);
+                }
+                m_pSplitBox = new QCheckBox(m_pVariantCnt);
+                pVariantCntLayout->addWidget(m_pDynamicalButton);
+                pVariantCntLayout->addWidget(m_pFixedButton);
+                pVariantCntLayout->addWidget(m_pSplitBox);
+            }
+        }
+        pMainLayout->addWidget(m_pDescriptionLabel);
+        pMainLayout->addWidget(m_pDynamicLabel);
+        pMainLayout->addWidget(m_pFixedLabel);
+        pMainLayout->addWidget(m_pSplitLabel);
+        pMainLayout->addWidget(m_pVariantCnt);
+        pMainLayout->addStretch();
+    }
 
     /* Setup connections: */
-    connect(m_pDynamicalButton, SIGNAL(clicked(bool)), this, SIGNAL(completeChanged()));
-    connect(m_pFixedButton, SIGNAL(clicked(bool)), this, SIGNAL(completeChanged()));
+    connect(m_pVariantButtonGroup, SIGNAL(buttonClicked(QAbstractButton *)), this, SIGNAL(completeChanged()));
     connect(m_pSplitBox, SIGNAL(stateChanged(int)), this, SIGNAL(completeChanged()));
 
-    /* Register 'mediumVariant' field: */
+    /* Register fields: */
     registerField("mediumVariant", this, "mediumVariant");
 }
@@ -83,7 +136,5 @@
                                              "virtual machine on removable USB devices or old systems, some of which cannot "
                                              "handle very large files."));
-    m_pVariantContainer->setTitle(UIWizardNewVD::tr("Storage details"));
-
-    /* Translate buttons: */
+    m_pVariantCnt->setTitle(UIWizardNewVD::tr("Storage details"));
     m_pDynamicalButton->setText(UIWizardNewVD::tr("&Dynamically allocated"));
     m_pFixedButton->setText(UIWizardNewVD::tr("&Fixed size"));
@@ -112,42 +163,6 @@
 bool UIWizardNewVDPageBasic2::isComplete() const
 {
+    /* Make sure medium variant is correct: */
     return mediumVariant() != (qulonglong)KMediumVariant_Max;
 }
 
-qulonglong UIWizardNewVDPageBasic2::mediumVariant() const
-{
-    /* Initial value: */
-    qulonglong uMediumVariant = (qulonglong)KMediumVariant_Max;
-
-    /* Exclusive options: */
-    if (m_pDynamicalButton->isChecked())
-        uMediumVariant = (qulonglong)KMediumVariant_Standard;
-    else if (m_pFixedButton->isChecked())
-        uMediumVariant = (qulonglong)KMediumVariant_Fixed;
-
-    /* Additional options: */
-    if (m_pSplitBox->isChecked())
-        uMediumVariant |= (qulonglong)KMediumVariant_VmdkSplit2G;
-
-    /* Return options: */
-    return uMediumVariant;
-}
-
-void UIWizardNewVDPageBasic2::setMediumVariant(qulonglong uMediumVariant)
-{
-    /* Exclusive options: */
-    if (uMediumVariant & (qulonglong)KMediumVariant_Fixed)
-    {
-        m_pFixedButton->click();
-        m_pFixedButton->setFocus();
-    }
-    else
-    {
-        m_pDynamicalButton->click();
-        m_pDynamicalButton->setFocus();
-    }
-
-    /* Additional options: */
-    m_pSplitBox->setChecked(uMediumVariant & (qulonglong)KMediumVariant_VmdkSplit2G);
-}
-
Index: /trunk/src/VBox/Frontends/VirtualBox/src/wizards/newvd/UIWizardNewVDPageBasic2.h
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/wizards/newvd/UIWizardNewVDPageBasic2.h	(revision 41020)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/wizards/newvd/UIWizardNewVDPageBasic2.h	(revision 41021)
@@ -24,11 +24,32 @@
 
 /* Forward declarations: */
+class QGroupBox;
+class QButtonGroup;
 class QRadioButton;
 class QCheckBox;
 class QIRichTextLabel;
-class QGroupBox;
 
-/* 2nd page of the New Virtual Disk wizard: */
-class UIWizardNewVDPageBasic2 : public UIWizardPage
+/* 2nd page of the New Virtual Disk wizard (base part): */
+class UIWizardNewVDPage2 : public UIWizardPageBase
+{
+protected:
+
+    /* Constructor: */
+    UIWizardNewVDPage2();
+
+    /* Stuff for 'variant' field: */
+    qulonglong mediumVariant() const;
+    void setMediumVariant(qulonglong uMediumVariant);
+
+    /* Widgets: */
+    QGroupBox *m_pVariantCnt;
+    QButtonGroup *m_pVariantButtonGroup;
+    QRadioButton *m_pDynamicalButton;
+    QRadioButton *m_pFixedButton;
+    QCheckBox *m_pSplitBox;
+};
+
+/* 2nd page of the New Virtual Disk wizard (basic extension): */
+class UIWizardNewVDPageBasic2 : public UIWizardPage, public UIWizardNewVDPage2
 {
     Q_OBJECT;
@@ -51,13 +72,4 @@
     bool isComplete() const;
 
-    /* Stuff for 'variant' field: */
-    qulonglong mediumVariant() const;
-    void setMediumVariant(qulonglong uMediumVariant);
-
-    /* Variables: */
-    QRadioButton *m_pDynamicalButton;
-    QRadioButton *m_pFixedButton;
-    QCheckBox *m_pSplitBox;
-
     /* Widgets: */
     QIRichTextLabel *m_pDescriptionLabel;
@@ -65,5 +77,4 @@
     QIRichTextLabel *m_pFixedLabel;
     QIRichTextLabel *m_pSplitLabel;
-    QGroupBox *m_pVariantContainer;
 };
 
Index: /trunk/src/VBox/Frontends/VirtualBox/src/wizards/newvd/UIWizardNewVDPageBasic3.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/wizards/newvd/UIWizardNewVDPageBasic3.cpp	(revision 41020)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/wizards/newvd/UIWizardNewVDPageBasic3.cpp	(revision 41021)
@@ -40,100 +40,18 @@
 #include "QIToolButton.h"
 #include "QILineEdit.h"
-#include "iprt/path.h"
-
-UIWizardNewVDPageBasic3::UIWizardNewVDPageBasic3(const QString &strDefaultName, const QString &strDefaultPath, qulonglong uDefaultSize)
+
+UIWizardNewVDPage3::UIWizardNewVDPage3(const QString &strDefaultName, const QString &strDefaultPath)
     : m_strDefaultName(strDefaultName.isEmpty() ? QString("NewVirtualDisk1") : strDefaultName)
     , m_strDefaultPath(strDefaultPath)
     , m_uMediumSizeMin(_4M)
     , m_uMediumSizeMax(vboxGlobal().virtualBox().GetSystemProperties().GetInfoVDSize())
-    , m_iSliderScale(0)
-{
-    /* Detect how many steps to recognize between adjacent powers of 2
-     * to ensure that the last slider step is exactly that we need: */
-    int iPower = log2i(m_uMediumSizeMax);
-    qulonglong uTickMB = qulonglong (1) << iPower;
-    if (uTickMB < m_uMediumSizeMax)
-    {
-        qulonglong uTickMBNext = qulonglong (1) << (iPower + 1);
-        qulonglong uGap = uTickMBNext - m_uMediumSizeMax;
-        m_iSliderScale = (int)((uTickMBNext - uTickMB) / uGap);
-    }
-    m_iSliderScale = qMax(m_iSliderScale, 8);
-
-    /* Create widgets: */
-    QVBoxLayout *pMainLayout = new QVBoxLayout(this);
-        m_pLocationLabel = new QIRichTextLabel(this);
-        m_pLocationCnt = new QGroupBox(this);
-            m_pLocationCnt->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Fixed);
-            QHBoxLayout *pOptionsLayout = new QHBoxLayout(m_pLocationCnt);
-                m_pLocationEditor = new QLineEdit(m_pLocationCnt);
-                m_pLocationSelector = new QIToolButton(m_pLocationCnt);
-                    m_pLocationSelector->setAutoRaise(true);
-                    m_pLocationSelector->setIcon(UIIconPool::iconSet(":/select_file_16px.png", "select_file_dis_16px.png"));
-            pOptionsLayout->addWidget(m_pLocationEditor);
-            pOptionsLayout->addWidget(m_pLocationSelector);
-        m_pSizeLabel = new QIRichTextLabel(this);
-        m_pSizeCnt = new QGroupBox(this);
-            m_pSizeCnt->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Fixed);
-            QGridLayout *m_pSizeLayout = new QGridLayout(m_pSizeCnt);
-                m_pSizeSlider = new QSlider(m_pSizeCnt);
-                    m_pSizeSlider->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);
-                    m_pSizeSlider->setOrientation(Qt::Horizontal);
-                    m_pSizeSlider->setTickPosition(QSlider::TicksBelow);
-                    m_pSizeSlider->setFocusPolicy(Qt::StrongFocus);
-                    m_pSizeSlider->setPageStep(m_iSliderScale);
-                    m_pSizeSlider->setSingleStep(m_iSliderScale / 8);
-                    m_pSizeSlider->setTickInterval(0);
-                    m_pSizeSlider->setMinimum(sizeMBToSlider(m_uMediumSizeMin, m_iSliderScale));
-                    m_pSizeSlider->setMaximum(sizeMBToSlider(m_uMediumSizeMax, m_iSliderScale));
-                m_pSizeEditor = new QILineEdit(m_pSizeCnt);
-                    m_pSizeEditor->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed);
-                    m_pSizeEditor->setFixedWidthByText("88888.88 MB");
-                    m_pSizeEditor->setAlignment(Qt::AlignRight);
-                    m_pSizeEditor->setValidator(new QRegExpValidator(QRegExp(vboxGlobal().sizeRegexp()), this));
-                QLabel *m_pSizeMin = new QLabel(m_pSizeCnt);
-                    m_pSizeMin->setSizePolicy(QSizePolicy::Maximum, QSizePolicy::Fixed);
-                    m_pSizeMin->setText(vboxGlobal().formatSize(m_uMediumSizeMin));
-                QSpacerItem *m_pSizeSpacer = new QSpacerItem(0, 0, QSizePolicy::Expanding, QSizePolicy::Fixed);
-                QLabel *m_pSizeMax = new QLabel(m_pSizeCnt);
-                    m_pSizeMax->setSizePolicy(QSizePolicy::Maximum, QSizePolicy::Fixed);
-                    m_pSizeMax->setText(vboxGlobal().formatSize(m_uMediumSizeMax));
-            m_pSizeLayout->addWidget(m_pSizeSlider, 0, 0, 1, 3);
-            m_pSizeLayout->addWidget(m_pSizeEditor, 0, 3);
-            m_pSizeLayout->addWidget(m_pSizeMin, 1, 0);
-            m_pSizeLayout->addItem(m_pSizeSpacer, 1, 1);
-            m_pSizeLayout->addWidget(m_pSizeMax, 1, 2);
-    pMainLayout->addWidget(m_pLocationLabel);
-    pMainLayout->addWidget(m_pLocationCnt);
-    pMainLayout->addWidget(m_pSizeLabel);
-    pMainLayout->addWidget(m_pSizeCnt);
-    pMainLayout->addStretch();
-
-    /* Setup connections: */
-    connect(m_pLocationEditor, SIGNAL(textChanged(const QString &)), this, SLOT(sltLocationEditorTextChanged(const QString &)));
-    connect(m_pLocationSelector, SIGNAL(clicked()), this, SLOT(sltSelectLocationButtonClicked()));
-    connect(m_pSizeSlider, SIGNAL(valueChanged(int)), this, SLOT(sltSizeSliderValueChanged(int)));
-    connect(m_pSizeEditor, SIGNAL(textChanged(const QString &)), this, SLOT(sltSizeEditorTextChanged(const QString &)));
-
-    /* Initialize connections: */
-    setMediumSize(uDefaultSize);
-
-    /* Register 'mediumPath', 'mediumSize' fields: */
-    registerField("mediumPath", this, "mediumPath");
-    registerField("mediumSize", this, "mediumSize");
-}
-
-void UIWizardNewVDPageBasic3::sltLocationEditorTextChanged(const QString &strMediumName)
-{
-    /* Compose new medium path: */
-    m_strMediumPath = absoluteFilePath(toFileName(strMediumName, m_strDefaultExtension), m_strDefaultPath);
-    /* Notify wizard sub-system about complete status changed: */
-    emit completeChanged();
-}
-
-void UIWizardNewVDPageBasic3::sltSelectLocationButtonClicked()
+    , m_iSliderScale(calculateSliderScale(m_uMediumSizeMax))
+{
+}
+
+void UIWizardNewVDPage3::onSelectLocationButtonClicked()
 {
     /* Get current folder and filename: */
-    QFileInfo fullFilePath(m_strMediumPath);
+    QFileInfo fullFilePath(mediumPath());
     QDir folder = fullFilePath.path();
     QString strFileName = fullFilePath.fileName();
@@ -157,7 +75,7 @@
 
     /* Prepare backends list: */
-    CMediumFormat mediumFormat = field("mediumFormat").value<CMediumFormat>();
     QVector<QString> fileExtensions;
     QVector<KDeviceType> deviceTypes;
+    CMediumFormat mediumFormat = fieldImp("mediumFormat").value<CMediumFormat>();
     mediumFormat.DescribeFileExtensions(fileExtensions, deviceTypes);
     QStringList validExtensionList;
@@ -170,6 +88,6 @@
     /* Open corresponding file-dialog: */
     QString strChosenFilePath = QIFileDialog::getSaveFileName(folder.absoluteFilePath(strFileName),
-                                                              strBackendsList, this,
-                                                              UIWizardNewVD::tr("Select a file for the new hard disk image file"));
+                                                              strBackendsList, thisImp(),
+                                                              VBoxGlobal::tr("Choose a virtual hard disk file"));
 
     /* If there was something really chosen: */
@@ -185,5 +103,5 @@
 }
 
-void UIWizardNewVDPageBasic3::sltSizeSliderValueChanged(int iValue)
+void UIWizardNewVDPage3::onSizeSliderValueChanged(int iValue)
 {
     /* Get full size: */
@@ -195,9 +113,7 @@
     m_pSizeEditor->setText(vboxGlobal().formatSize(uMediumSize));
     m_pSizeEditor->blockSignals(false);
-    /* Notify wizard sub-system about complete status changed: */
-    emit completeChanged();
-}
-
-void UIWizardNewVDPageBasic3::sltSizeEditorTextChanged(const QString &strValue)
+}
+
+void UIWizardNewVDPage3::onSizeEditorTextChanged(const QString &strValue)
 {
     /* Get full size: */
@@ -209,54 +125,8 @@
     m_pSizeSlider->setValue(sizeMBToSlider(uMediumSize, m_iSliderScale));
     m_pSizeSlider->blockSignals(false);
-    /* Notify wizard sub-system about complete status changed: */
-    emit completeChanged();
-}
-
-void UIWizardNewVDPageBasic3::retranslateUi()
-{
-    /* Translate page: */
-    setTitle(UIWizardNewVD::tr("Virtual disk file location and size"));
-
-    /* Translate widgets: */
-    m_pLocationLabel->setText(UIWizardNewVD::tr("Please type the name of the new virtual disk file into the box below or "
-                                                "click on the folder icon to select a different folder to create the file in."));
-    m_pLocationCnt->setTitle(tr("&Location"));
-    m_pSizeLabel->setText(UIWizardNewVD::tr("Select the size of the virtual disk in megabytes. This size will be reported "
-                                            "to the Guest OS as the maximum size of this virtual disk."));
-    m_pSizeCnt->setTitle(UIWizardNewVD::tr("&Size"));
-}
-
-void UIWizardNewVDPageBasic3::initializePage()
-{
-    /* Translate page: */
-    retranslateUi();
-
-    /* Reset name to default: */
-    m_pLocationEditor->setText(m_strDefaultName);
-    /* Get virtual-disk extension: */
-    m_strDefaultExtension = defaultExtension(field("mediumFormat").value<CMediumFormat>());
-    /* Compose path for new virtual-disk: */
-    m_strMediumPath = absoluteFilePath(toFileName(m_strDefaultName, m_strDefaultExtension), m_strDefaultPath);
-}
-
-bool UIWizardNewVDPageBasic3::isComplete() const
-{
-    /* Check what current name is not empty & current size feats the bounds: */
-    return !m_pLocationEditor->text().trimmed().isEmpty() &&
-           mediumSize() >= m_uMediumSizeMin && mediumSize() <= m_uMediumSizeMax;
-}
-
-bool UIWizardNewVDPageBasic3::validatePage()
-{
-    if (QFileInfo(m_strMediumPath).exists())
-    {
-        msgCenter().sayCannotOverwriteHardDiskStorage(this, m_strMediumPath);
-        return false;
-    }
-    return true;
-}
-
-/* static */
-QString UIWizardNewVDPageBasic3::toFileName(const QString &strName, const QString &strExtension)
+}
+
+/* static */
+QString UIWizardNewVDPage3::toFileName(const QString &strName, const QString &strExtension)
 {
     /* Convert passed name to native separators (it can be full, actually): */
@@ -277,5 +147,5 @@
 
 /* static */
-QString UIWizardNewVDPageBasic3::absoluteFilePath(const QString &strFileName, const QString &strDefaultPath)
+QString UIWizardNewVDPage3::absoluteFilePath(const QString &strFileName, const QString &strDefaultPath)
 {
     /* Wrap file-info around received file name: */
@@ -292,5 +162,5 @@
 
 /* static */
-QString UIWizardNewVDPageBasic3::defaultExtension(const CMediumFormat &mediumFormatRef)
+QString UIWizardNewVDPage3::defaultExtension(const CMediumFormat &mediumFormatRef)
 {
     /* Load extension / device list: */
@@ -307,5 +177,22 @@
 
 /* static */
-int UIWizardNewVDPageBasic3::log2i(qulonglong uValue)
+int UIWizardNewVDPage3::calculateSliderScale(qulonglong uMaximumMediumSize)
+{
+    /* Detect how many steps to recognize between adjacent powers of 2
+     * to ensure that the last slider step is exactly that we need: */
+    int iSliderScale = 0;
+    int iPower = log2i(uMaximumMediumSize);
+    qulonglong uTickMB = (qulonglong)1 << iPower;
+    if (uTickMB < uMaximumMediumSize)
+    {
+        qulonglong uTickMBNext = (qulonglong)1 << (iPower + 1);
+        qulonglong uGap = uTickMBNext - uMaximumMediumSize;
+        iSliderScale = (int)((uTickMBNext - uTickMB) / uGap);
+    }
+    return qMax(iSliderScale, 8);
+}
+
+/* static */
+int UIWizardNewVDPage3::log2i(qulonglong uValue)
 {
     int iPower = -1;
@@ -319,5 +206,5 @@
 
 /* static */
-int UIWizardNewVDPageBasic3::sizeMBToSlider(qulonglong uValue, int iSliderScale)
+int UIWizardNewVDPage3::sizeMBToSlider(qulonglong uValue, int iSliderScale)
 {
     int iPower = log2i(uValue);
@@ -329,5 +216,5 @@
 
 /* static */
-qulonglong UIWizardNewVDPageBasic3::sliderToSizeMB(int uValue, int iSliderScale)
+qulonglong UIWizardNewVDPage3::sliderToSizeMB(int uValue, int iSliderScale)
 {
     int iPower = uValue / iSliderScale;
@@ -338,5 +225,5 @@
 }
 
-void UIWizardNewVDPageBasic3::updateSizeToolTips(qulonglong uSize)
+void UIWizardNewVDPage3::updateSizeToolTips(qulonglong uSize)
 {
     QString strToolTip = UIWizardNewVD::tr("<nobr>%1 (%2 B)</nobr>").arg(vboxGlobal().formatSize(uSize)).arg(uSize);
@@ -345,11 +232,15 @@
 }
 
-qulonglong UIWizardNewVDPageBasic3::mediumSize() const
-{
-    /* Return slider value scaled at 'm_iSliderScale': */
+QString UIWizardNewVDPage3::mediumPath() const
+{
+    return absoluteFilePath(toFileName(m_pLocationEditor->text(), m_strDefaultExtension), m_strDefaultPath);
+}
+
+qulonglong UIWizardNewVDPage3::mediumSize() const
+{
     return sliderToSizeMB(m_pSizeSlider->value(), m_iSliderScale);
 }
 
-void UIWizardNewVDPageBasic3::setMediumSize(qulonglong uMediumSize)
+void UIWizardNewVDPage3::setMediumSize(qulonglong uMediumSize)
 {
     /* Block signals: */
@@ -365,2 +256,154 @@
 }
 
+UIWizardNewVDPageBasic3::UIWizardNewVDPageBasic3(const QString &strDefaultName, const QString &strDefaultPath, qulonglong uDefaultSize)
+    : UIWizardNewVDPage3(strDefaultName, strDefaultPath)
+{
+    /* Create widgets: */
+    QVBoxLayout *pMainLayout = new QVBoxLayout(this);
+    {
+        m_pLocationLabel = new QIRichTextLabel(this);
+        m_pLocationCnt = new QGroupBox(this);
+        {
+            m_pLocationCnt->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Fixed);
+            QHBoxLayout *pLocationCntLayout = new QHBoxLayout(m_pLocationCnt);
+            {
+                m_pLocationEditor = new QLineEdit(m_pLocationCnt);
+                m_pLocationOpenButton = new QIToolButton(m_pLocationCnt);
+                {
+                    m_pLocationOpenButton->setAutoRaise(true);
+                    m_pLocationOpenButton->setIcon(UIIconPool::iconSet(":/select_file_16px.png", "select_file_dis_16px.png"));
+                }
+                pLocationCntLayout->addWidget(m_pLocationEditor);
+                pLocationCntLayout->addWidget(m_pLocationOpenButton);
+            }
+        }
+        m_pSizeLabel = new QIRichTextLabel(this);
+        m_pSizeCnt = new QGroupBox(this);
+        {
+            m_pSizeCnt->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Fixed);
+            QGridLayout *m_pSizeCntLayout = new QGridLayout(m_pSizeCnt);
+            {
+                m_pSizeSlider = new QSlider(m_pSizeCnt);
+                {
+                    m_pSizeSlider->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);
+                    m_pSizeSlider->setOrientation(Qt::Horizontal);
+                    m_pSizeSlider->setTickPosition(QSlider::TicksBelow);
+                    m_pSizeSlider->setFocusPolicy(Qt::StrongFocus);
+                    m_pSizeSlider->setPageStep(m_iSliderScale);
+                    m_pSizeSlider->setSingleStep(m_iSliderScale / 8);
+                    m_pSizeSlider->setTickInterval(0);
+                    m_pSizeSlider->setMinimum(sizeMBToSlider(m_uMediumSizeMin, m_iSliderScale));
+                    m_pSizeSlider->setMaximum(sizeMBToSlider(m_uMediumSizeMax, m_iSliderScale));
+                }
+                m_pSizeEditor = new QILineEdit(m_pSizeCnt);
+                {
+                    m_pSizeEditor->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed);
+                    m_pSizeEditor->setFixedWidthByText("88888.88 MB");
+                    m_pSizeEditor->setAlignment(Qt::AlignRight);
+                    m_pSizeEditor->setValidator(new QRegExpValidator(QRegExp(vboxGlobal().sizeRegexp()), this));
+                }
+                QLabel *m_pSizeMin = new QLabel(m_pSizeCnt);
+                {
+                    m_pSizeMin->setSizePolicy(QSizePolicy::Maximum, QSizePolicy::Fixed);
+                    m_pSizeMin->setText(vboxGlobal().formatSize(m_uMediumSizeMin));
+                }
+                QSpacerItem *m_pSizeSpacer = new QSpacerItem(0, 0, QSizePolicy::Expanding, QSizePolicy::Fixed);
+                QLabel *m_pSizeMax = new QLabel(m_pSizeCnt);
+                {
+                    m_pSizeMax->setSizePolicy(QSizePolicy::Maximum, QSizePolicy::Fixed);
+                    m_pSizeMax->setText(vboxGlobal().formatSize(m_uMediumSizeMax));
+                }
+                m_pSizeCntLayout->addWidget(m_pSizeSlider, 0, 0, 1, 3);
+                m_pSizeCntLayout->addWidget(m_pSizeEditor, 0, 3);
+                m_pSizeCntLayout->addWidget(m_pSizeMin, 1, 0);
+                m_pSizeCntLayout->addItem(m_pSizeSpacer, 1, 1);
+                m_pSizeCntLayout->addWidget(m_pSizeMax, 1, 2);
+            }
+            setMediumSize(uDefaultSize);
+        }
+        pMainLayout->addWidget(m_pLocationLabel);
+        pMainLayout->addWidget(m_pLocationCnt);
+        pMainLayout->addWidget(m_pSizeLabel);
+        pMainLayout->addWidget(m_pSizeCnt);
+        pMainLayout->addStretch();
+    }
+
+    /* Setup connections: */
+    connect(m_pLocationEditor, SIGNAL(textChanged(const QString &)), this, SIGNAL(completeChanged()));
+    connect(m_pLocationOpenButton, SIGNAL(clicked()), this, SLOT(sltSelectLocationButtonClicked()));
+    connect(m_pSizeSlider, SIGNAL(valueChanged(int)), this, SLOT(sltSizeSliderValueChanged(int)));
+    connect(m_pSizeEditor, SIGNAL(textChanged(const QString &)), this, SLOT(sltSizeEditorTextChanged(const QString &)));
+
+    /* Register fields: */
+    registerField("mediumPath", this, "mediumPath");
+    registerField("mediumSize", this, "mediumSize");
+}
+
+void UIWizardNewVDPageBasic3::sltSelectLocationButtonClicked()
+{
+    /* Call to base-class: */
+    onSelectLocationButtonClicked();
+}
+
+void UIWizardNewVDPageBasic3::sltSizeSliderValueChanged(int iValue)
+{
+    /* Call to base-class: */
+    onSizeSliderValueChanged(iValue);
+
+    /* Broadcast complete-change: */
+    emit completeChanged();
+}
+
+void UIWizardNewVDPageBasic3::sltSizeEditorTextChanged(const QString &strValue)
+{
+    /* Call to base-class: */
+    onSizeEditorTextChanged(strValue);
+
+    /* Broadcast complete-change: */
+    emit completeChanged();
+}
+
+void UIWizardNewVDPageBasic3::retranslateUi()
+{
+    /* Translate page: */
+    setTitle(UIWizardNewVD::tr("Virtual disk file location and size"));
+
+    /* Translate widgets: */
+    m_pLocationLabel->setText(UIWizardNewVD::tr("Please type the name of the new virtual disk file into the box below or "
+                                                "click on the folder icon to select a different folder to create the file in."));
+    m_pLocationCnt->setTitle(UIWizardNewVD::tr("&Location"));
+    m_pSizeLabel->setText(UIWizardNewVD::tr("Select the size of the virtual disk in megabytes. This size will be reported "
+                                            "to the Guest OS as the maximum size of this virtual disk."));
+    m_pSizeCnt->setTitle(UIWizardNewVD::tr("&Size"));
+}
+
+void UIWizardNewVDPageBasic3::initializePage()
+{
+    /* Translate page: */
+    retranslateUi();
+
+    /* Get default extension for new virtual-disk: */
+    m_strDefaultExtension = defaultExtension(field("mediumFormat").value<CMediumFormat>());
+    /* Set default name as text for location editor: */
+    m_pLocationEditor->setText(m_strDefaultName);
+}
+
+bool UIWizardNewVDPageBasic3::isComplete() const
+{
+    /* Make sure current name is not empty and current size feats the bounds: */
+    return !m_pLocationEditor->text().trimmed().isEmpty() &&
+           mediumSize() >= m_uMediumSizeMin && mediumSize() <= m_uMediumSizeMax;
+}
+
+bool UIWizardNewVDPageBasic3::validatePage()
+{
+    /* Make sure such virtual-disk doesn't exists already: */
+    QString strMediumPath(mediumPath());
+    if (QFileInfo(strMediumPath).exists())
+    {
+        msgCenter().sayCannotOverwriteHardDiskStorage(this, strMediumPath);
+        return false;
+    }
+    return true;
+}
+
Index: /trunk/src/VBox/Frontends/VirtualBox/src/wizards/newvd/UIWizardNewVDPageBasic3.h
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/wizards/newvd/UIWizardNewVDPageBasic3.h	(revision 41020)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/wizards/newvd/UIWizardNewVDPageBasic3.h	(revision 41021)
@@ -26,5 +26,4 @@
 /* Forward declarations: */
 class CMediumFormat;
-class QIRichTextLabel;
 class QGroupBox;
 class QLineEdit;
@@ -32,10 +31,60 @@
 class QSlider;
 class QILineEdit;
+class QIRichTextLabel;
 
-/* 3rd page of the New Virtual Disk wizard: */
-class UIWizardNewVDPageBasic3 : public UIWizardPage
+/* 3rd page of the New Virtual Disk wizard (base part): */
+class UIWizardNewVDPage3 : public UIWizardPageBase
+{
+protected:
+
+    /* Constructor: */
+    UIWizardNewVDPage3(const QString &strDefaultName, const QString &strDefaultPath);
+
+    /* Handlers: */
+    void onSelectLocationButtonClicked();
+    void onSizeSliderValueChanged(int iValue);
+    void onSizeEditorTextChanged(const QString &strValue);
+
+    /* Location-editors stuff: */
+    static QString toFileName(const QString &strName, const QString &strExtension);
+    static QString absoluteFilePath(const QString &strFileName, const QString &strDefaultPath);
+    static QString defaultExtension(const CMediumFormat &mediumFormatRef);
+
+    /* Size-editors stuff: */
+    static int calculateSliderScale(qulonglong uMaximumMediumSize);
+    static int log2i(qulonglong uValue);
+    static int sizeMBToSlider(qulonglong uValue, int iSliderScale);
+    static qulonglong sliderToSizeMB(int uValue, int iSliderScale);
+    void updateSizeToolTips(qulonglong uSize);
+
+    /* Stuff for 'mediumPath' field: */
+    QString mediumPath() const;
+
+    /* Stuff for 'mediumSize' field: */
+    qulonglong mediumSize() const;
+    void setMediumSize(qulonglong uMediumSize);
+
+    /* Variables: */
+    QString m_strDefaultName;
+    QString m_strDefaultPath;
+    QString m_strDefaultExtension;
+    qulonglong m_uMediumSizeMin;
+    qulonglong m_uMediumSizeMax;
+    int m_iSliderScale;
+
+    /* Widgets: */
+    QGroupBox *m_pLocationCnt;
+    QLineEdit *m_pLocationEditor;
+    QIToolButton *m_pLocationOpenButton;
+    QGroupBox *m_pSizeCnt;
+    QSlider *m_pSizeSlider;
+    QILineEdit *m_pSizeEditor;
+};
+
+/* 3rd page of the New Virtual Disk wizard (basic extension): */
+class UIWizardNewVDPageBasic3 : public UIWizardPage, public UIWizardNewVDPage3
 {
     Q_OBJECT;
-    Q_PROPERTY(QString mediumPath READ mediumPath WRITE setMediumPath);
+    Q_PROPERTY(QString mediumPath READ mediumPath);
     Q_PROPERTY(qulonglong mediumSize READ mediumSize WRITE setMediumSize);
 
@@ -45,8 +94,14 @@
     UIWizardNewVDPageBasic3(const QString &strDefaultName, const QString &strDefaultPath, qulonglong uDefaultSize);
 
+protected:
+
+    /* Wrapper to access 'this' from base part: */
+    UIWizardPage* thisImp() { return this; }
+    /* Wrapper to access 'wizard-field' from base part: */
+    QVariant fieldImp(const QString &strFieldName) const { return UIWizardPage::field(strFieldName); }
+
 private slots:
 
     /* Location editors stuff: */
-    void sltLocationEditorTextChanged(const QString &strMediumName);
     void sltSelectLocationButtonClicked();
 
@@ -67,43 +122,7 @@
     bool validatePage();
 
-    /* Location-editors stuff: */
-    static QString toFileName(const QString &strName, const QString &strExtension);
-    static QString absoluteFilePath(const QString &strFileName, const QString &strDefaultPath);
-    static QString defaultExtension(const CMediumFormat &mediumFormatRef);
-
-    /* Size-editors stuff: */
-    static int log2i(qulonglong uValue);
-    static int sizeMBToSlider(qulonglong uValue, int iSliderScale);
-    static qulonglong sliderToSizeMB(int uValue, int iSliderScale);
-    void updateSizeToolTips(qulonglong uSize);
-
-    /* Stuff for 'mediumPath' field: */
-    QString mediumPath() const { return m_strMediumPath; }
-    void setMediumPath(const QString &strMediumPath) { m_strMediumPath = strMediumPath; }
-    QString m_strMediumPath;
-
-    /* Stuff for 'mediumSize' field: */
-    qulonglong mediumSize() const;
-    void setMediumSize(qulonglong uMediumSize);
-
-    /* Location-editors variables: */
-    QString m_strDefaultName;
-    QString m_strDefaultPath;
-    QString m_strDefaultExtension;
-
-    /* Size-editors variables: */
-    qulonglong m_uMediumSizeMin;
-    qulonglong m_uMediumSizeMax;
-    int m_iSliderScale;
-
     /* Widgets: */
     QIRichTextLabel *m_pLocationLabel;
     QIRichTextLabel *m_pSizeLabel;
-    QGroupBox *m_pLocationCnt;
-    QLineEdit *m_pLocationEditor;
-    QIToolButton *m_pLocationSelector;
-    QGroupBox *m_pSizeCnt;
-    QSlider *m_pSizeSlider;
-    QILineEdit *m_pSizeEditor;
 };
 
Index: /trunk/src/VBox/Frontends/VirtualBox/src/wizards/newvd/UIWizardNewVDPageBasic4.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/wizards/newvd/UIWizardNewVDPageBasic4.cpp	(revision 41020)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/wizards/newvd/UIWizardNewVDPageBasic4.cpp	(revision 41021)
@@ -24,20 +24,21 @@
 #include "QIRichTextLabel.h"
 
+UIWizardNewVDPage4::UIWizardNewVDPage4()
+{
+}
+
 UIWizardNewVDPageBasic4::UIWizardNewVDPageBasic4()
 {
     /* Create widgets: */
     QVBoxLayout *pMainLayout = new QVBoxLayout(this);
+    {
         m_pLabel1 = new QIRichTextLabel(this);
         m_pSummaryText = new QIRichTextLabel(this);
         m_pLabel2 = new QIRichTextLabel(this);
-    pMainLayout->addWidget(m_pLabel1);
-    pMainLayout->addWidget(m_pSummaryText);
-    pMainLayout->addWidget(m_pLabel2);
-    pMainLayout->addStretch();
-
-    /* Register CMedium class: */
-    qRegisterMetaType<CMedium>();
-    /* Register 'virtualDisk' field: */
-    registerField("virtualDisk", this, "virtualDisk");
+        pMainLayout->addWidget(m_pLabel1);
+        pMainLayout->addWidget(m_pSummaryText);
+        pMainLayout->addWidget(m_pLabel2);
+        pMainLayout->addStretch();
+    }
 }
 
@@ -84,8 +85,18 @@
 bool UIWizardNewVDPageBasic4::validatePage()
 {
+    /* Initial result: */
+    bool fResult = true;
+
+    /* Lock finish button: */
+    startProcessing();
+
     /* Try to create virtual-disk: */
-    startProcessing();
-    bool fResult = qobject_cast<UIWizardNewVD*>(wizard())->createVirtualDisk();
+    if (fResult)
+        fResult = qobject_cast<UIWizardNewVD*>(wizard())->createVirtualDisk();
+
+    /* Unlock finish button: */
     endProcessing();
+
+    /* Return result: */
     return fResult;
 }
Index: /trunk/src/VBox/Frontends/VirtualBox/src/wizards/newvd/UIWizardNewVDPageBasic4.h
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/wizards/newvd/UIWizardNewVDPageBasic4.h	(revision 41020)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/wizards/newvd/UIWizardNewVDPageBasic4.h	(revision 41021)
@@ -22,14 +22,21 @@
 /* Local includes: */
 #include "UIWizardPage.h"
-#include "COMDefs.h"
 
 /* Forward declarations: */
 class QIRichTextLabel;
 
-/* 4th page of the New Virtual Disk wizard: */
-class UIWizardNewVDPageBasic4 : public UIWizardPage
+/* 4th page of the New Virtual Disk wizard (base part): */
+class UIWizardNewVDPage4 : public UIWizardPageBase
+{
+protected:
+
+    /* Constructor: */
+    UIWizardNewVDPage4();
+};
+
+/* 4th page of the New Virtual Disk wizard (basic extension): */
+class UIWizardNewVDPageBasic4 : public UIWizardPage, public UIWizardNewVDPage4
 {
     Q_OBJECT;
-    Q_PROPERTY(CMedium virtualDisk READ virtualDisk WRITE setVirtualDisk);
 
 public:
@@ -49,9 +56,4 @@
     bool validatePage();
 
-    /* Stuff for 'virtualDisk' field: */
-    CMedium virtualDisk() const { return m_virtualDisk; }
-    void setVirtualDisk(const CMedium &virtualDisk) { m_virtualDisk = virtualDisk; }
-    CMedium m_virtualDisk;
-
     /* Widgets: */
     QIRichTextLabel *m_pLabel1;
Index: /trunk/src/VBox/Frontends/VirtualBox/src/wizards/newvd/UIWizardNewVDPageExpert.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/wizards/newvd/UIWizardNewVDPageExpert.cpp	(revision 41021)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/wizards/newvd/UIWizardNewVDPageExpert.cpp	(revision 41021)
@@ -0,0 +1,315 @@
+/* $Id$ */
+/** @file
+ *
+ * VBox frontends: Qt4 GUI ("VirtualBox"):
+ * UIWizardNewVDPageExpert class implementation
+ */
+
+/*
+ * Copyright (C) 2006-2012 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ */
+
+/* Global includes: */
+#include <QGridLayout>
+#include <QVBoxLayout>
+#include <QRegExpValidator>
+#include <QGroupBox>
+#include <QRadioButton>
+#include <QCheckBox>
+#include <QButtonGroup>
+#include <QLineEdit>
+#include <QSlider>
+#include <QLabel>
+
+/* Local includes: */
+#include "UIWizardNewVDPageExpert.h"
+#include "UIWizardNewVD.h"
+#include "VBoxGlobal.h"
+#include "UIMessageCenter.h"
+#include "UIIconPool.h"
+#include "QIRichTextLabel.h"
+#include "QIToolButton.h"
+#include "QILineEdit.h"
+
+UIWizardNewVDPageExpert::UIWizardNewVDPageExpert(const QString &strDefaultName, const QString &strDefaultPath, qulonglong uDefaultSize)
+    : UIWizardNewVDPage3(strDefaultName, strDefaultPath)
+{
+    /* Create widgets: */
+    QGridLayout *pMainLayout = new QGridLayout(this);
+    {
+        pMainLayout->setContentsMargins(8, 6, 8, 6);
+        m_pLocationCnt = new QGroupBox(this);
+        {
+            m_pLocationCnt->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Fixed);
+            QHBoxLayout *pLocationCntLayout = new QHBoxLayout(m_pLocationCnt);
+            {
+                m_pLocationEditor = new QLineEdit(m_pLocationCnt);
+                {
+                    m_pLocationEditor->setText(m_strDefaultName);
+                }
+                m_pLocationOpenButton = new QIToolButton(m_pLocationCnt);
+                {
+                    m_pLocationOpenButton->setAutoRaise(true);
+                    m_pLocationOpenButton->setIcon(UIIconPool::iconSet(":/select_file_16px.png", "select_file_dis_16px.png"));
+                }
+                pLocationCntLayout->addWidget(m_pLocationEditor);
+                pLocationCntLayout->addWidget(m_pLocationOpenButton);
+            }
+        }
+        m_pSizeCnt = new QGroupBox(this);
+        {
+            m_pSizeCnt->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Fixed);
+            QGridLayout *m_pSizeCntLayout = new QGridLayout(m_pSizeCnt);
+            {
+                m_pSizeSlider = new QSlider(m_pSizeCnt);
+                {
+                    m_pSizeSlider->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);
+                    m_pSizeSlider->setOrientation(Qt::Horizontal);
+                    m_pSizeSlider->setTickPosition(QSlider::TicksBelow);
+                    m_pSizeSlider->setFocusPolicy(Qt::StrongFocus);
+                    m_pSizeSlider->setPageStep(m_iSliderScale);
+                    m_pSizeSlider->setSingleStep(m_iSliderScale / 8);
+                    m_pSizeSlider->setTickInterval(0);
+                    m_pSizeSlider->setMinimum(sizeMBToSlider(m_uMediumSizeMin, m_iSliderScale));
+                    m_pSizeSlider->setMaximum(sizeMBToSlider(m_uMediumSizeMax, m_iSliderScale));
+                }
+                m_pSizeEditor = new QILineEdit(m_pSizeCnt);
+                {
+                    m_pSizeEditor->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed);
+                    m_pSizeEditor->setFixedWidthByText("88888.88 MB");
+                    m_pSizeEditor->setAlignment(Qt::AlignRight);
+                    m_pSizeEditor->setValidator(new QRegExpValidator(QRegExp(vboxGlobal().sizeRegexp()), this));
+                }
+                QLabel *m_pSizeMin = new QLabel(m_pSizeCnt);
+                {
+                    m_pSizeMin->setSizePolicy(QSizePolicy::Maximum, QSizePolicy::Fixed);
+                    m_pSizeMin->setText(vboxGlobal().formatSize(m_uMediumSizeMin));
+                }
+                QSpacerItem *m_pSizeSpacer = new QSpacerItem(0, 0, QSizePolicy::Expanding, QSizePolicy::Fixed);
+                QLabel *m_pSizeMax = new QLabel(m_pSizeCnt);
+                {
+                    m_pSizeMax->setSizePolicy(QSizePolicy::Maximum, QSizePolicy::Fixed);
+                    m_pSizeMax->setText(vboxGlobal().formatSize(m_uMediumSizeMax));
+                }
+                m_pSizeCntLayout->addWidget(m_pSizeSlider, 0, 0, 1, 3);
+                m_pSizeCntLayout->addWidget(m_pSizeEditor, 0, 3);
+                m_pSizeCntLayout->addWidget(m_pSizeMin, 1, 0);
+                m_pSizeCntLayout->addItem(m_pSizeSpacer, 1, 1);
+                m_pSizeCntLayout->addWidget(m_pSizeMax, 1, 2);
+            }
+        }
+        QVBoxLayout *pFormatWrappingLayout = new QVBoxLayout;
+        {
+            m_pFormatCnt = new QGroupBox(this);
+            {
+                m_pFormatCnt->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Fixed);
+                QVBoxLayout *pFormatCntLayout = new QVBoxLayout(m_pFormatCnt);
+                {
+                    m_pFormatButtonGroup = new QButtonGroup(m_pFormatCnt);
+                    {
+                        CSystemProperties systemProperties = vboxGlobal().virtualBox().GetSystemProperties();
+                        const QVector<CMediumFormat> &medFormats = systemProperties.GetMediumFormats();
+                        for (int i = 0; i < medFormats.size(); ++i)
+                        {
+                            const CMediumFormat &medFormat = medFormats[i];
+                            QString strFormatName(medFormat.GetName());
+                            if (strFormatName == "VDI")
+                            {
+                                QRadioButton *pButton = addFormatButton(pFormatCntLayout, medFormat);
+                                if (pButton)
+                                {
+                                    m_formats << medFormat;
+                                    m_formatNames << strFormatName;
+                                    m_pFormatButtonGroup->addButton(pButton, m_formatNames.size() - 1);
+                                }
+                            }
+                        }
+                        for (int i = 0; i < medFormats.size(); ++i)
+                        {
+                            const CMediumFormat &medFormat = medFormats[i];
+                            QString strFormatName(medFormat.GetName());
+                            if (strFormatName != "VDI")
+                            {
+                                QRadioButton *pButton = addFormatButton(pFormatCntLayout, medFormat);
+                                if (pButton)
+                                {
+                                    m_formats << medFormat;
+                                    m_formatNames << strFormatName;
+                                    m_pFormatButtonGroup->addButton(pButton, m_formatNames.size() - 1);
+                                }
+                            }
+                        }
+                        m_pFormatButtonGroup->button(0)->click();
+                        m_pFormatButtonGroup->button(0)->setFocus();
+                    }
+                }
+            }
+            QSpacerItem *m_pSizeSpacer = new QSpacerItem(0, 0, QSizePolicy::Fixed, QSizePolicy::Expanding);
+            pFormatWrappingLayout->addWidget(m_pFormatCnt);
+            pFormatWrappingLayout->addItem(m_pSizeSpacer);
+        }
+        QVBoxLayout *pVariantWrappingLayout = new QVBoxLayout;
+        {
+            m_pVariantCnt = new QGroupBox(this);
+            {
+                m_pVariantCnt->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Fixed);
+                QVBoxLayout *pVariantsLayout = new QVBoxLayout(m_pVariantCnt);
+                {
+                    m_pVariantButtonGroup = new QButtonGroup(m_pVariantCnt);
+                    {
+                        m_pDynamicalButton = new QRadioButton(m_pVariantCnt);
+                        {
+                            m_pDynamicalButton->click();
+                            m_pDynamicalButton->setFocus();
+                        }
+                        m_pFixedButton = new QRadioButton(m_pVariantCnt);
+                        m_pVariantButtonGroup->addButton(m_pDynamicalButton, 0);
+                        m_pVariantButtonGroup->addButton(m_pFixedButton, 1);
+                    }
+                    m_pSplitBox = new QCheckBox(m_pVariantCnt);
+                    pVariantsLayout->addWidget(m_pDynamicalButton);
+                    pVariantsLayout->addWidget(m_pFixedButton);
+                    pVariantsLayout->addWidget(m_pSplitBox);
+                }
+            }
+            QSpacerItem *m_pSizeSpacer = new QSpacerItem(0, 0, QSizePolicy::Fixed, QSizePolicy::Expanding);
+            pVariantWrappingLayout->addWidget(m_pVariantCnt);
+            pVariantWrappingLayout->addItem(m_pSizeSpacer);
+        }
+        pMainLayout->addWidget(m_pLocationCnt, 0, 0, 1, 2);
+        pMainLayout->addWidget(m_pSizeCnt, 1, 0, 1, 2);
+        pMainLayout->addLayout(pFormatWrappingLayout, 2, 0);
+        pMainLayout->addLayout(pVariantWrappingLayout, 2, 1);
+        setMediumSize(uDefaultSize);
+        sltMediumFormatChanged();
+    }
+
+    /* Setup connections: */
+    connect(m_pFormatButtonGroup, SIGNAL(buttonClicked(QAbstractButton*)), this, SLOT(sltMediumFormatChanged()));
+    connect(m_pVariantButtonGroup, SIGNAL(buttonClicked(QAbstractButton *)), this, SIGNAL(completeChanged()));
+    connect(m_pSplitBox, SIGNAL(stateChanged(int)), this, SIGNAL(completeChanged()));
+    connect(m_pLocationEditor, SIGNAL(textChanged(const QString &)), this, SIGNAL(completeChanged()));
+    connect(m_pLocationOpenButton, SIGNAL(clicked()), this, SLOT(sltSelectLocationButtonClicked()));
+    connect(m_pSizeSlider, SIGNAL(valueChanged(int)), this, SLOT(sltSizeSliderValueChanged(int)));
+    connect(m_pSizeEditor, SIGNAL(textChanged(const QString &)), this, SLOT(sltSizeEditorTextChanged(const QString &)));
+
+    /* Register classes: */
+    qRegisterMetaType<CMediumFormat>();
+    /* Register fields: */
+    registerField("mediumFormat", this, "mediumFormat");
+    registerField("mediumVariant", this, "mediumVariant");
+    registerField("mediumPath", this, "mediumPath");
+    registerField("mediumSize", this, "mediumSize");
+}
+
+void UIWizardNewVDPageExpert::sltMediumFormatChanged()
+{
+    /* Get medium format: */
+    CMediumFormat mf = mediumFormat();
+
+    /* Enable/disable widgets: */
+    ULONG uCapabilities = mf.GetCapabilities();
+    bool fIsCreateDynamicPossible = uCapabilities & KMediumFormatCapabilities_CreateDynamic;
+    bool fIsCreateFixedPossible = uCapabilities & KMediumFormatCapabilities_CreateFixed;
+    bool fIsCreateSplitPossible = uCapabilities & KMediumFormatCapabilities_CreateSplit2G;
+    m_pDynamicalButton->setEnabled(fIsCreateDynamicPossible);
+    m_pFixedButton->setEnabled(fIsCreateFixedPossible);
+    m_pSplitBox->setEnabled(fIsCreateSplitPossible);
+
+    /* Compose virtual-disk extension: */
+    m_strDefaultExtension = defaultExtension(mf);
+
+    /* Broadcast complete-change: */
+    completeChanged();
+}
+
+void UIWizardNewVDPageExpert::sltSelectLocationButtonClicked()
+{
+    /* Call to base-class: */
+    onSelectLocationButtonClicked();
+}
+
+void UIWizardNewVDPageExpert::sltSizeSliderValueChanged(int iValue)
+{
+    onSizeSliderValueChanged(iValue);
+
+    emit completeChanged();
+}
+
+void UIWizardNewVDPageExpert::sltSizeEditorTextChanged(const QString &strValue)
+{
+    onSizeEditorTextChanged(strValue);
+
+    emit completeChanged();
+}
+
+void UIWizardNewVDPageExpert::retranslateUi()
+{
+    /* Translate widgets: */
+    m_pLocationCnt->setTitle(UIWizardNewVD::tr("&Location"));
+    m_pLocationOpenButton->setToolTip(UIWizardNewVD::tr("Choose a virtual hard disk file..."));
+    m_pSizeCnt->setTitle(UIWizardNewVD::tr("&Size"));
+    m_pFormatCnt->setTitle(UIWizardNewVD::tr("File type"));
+    QList<QAbstractButton*> buttons = m_pFormatButtonGroup->buttons();
+    for (int i = 0; i < buttons.size(); ++i)
+    {
+        QAbstractButton *pButton = buttons[i];
+        pButton->setText(UIWizardNewVD::fullFormatName(m_formatNames[m_pFormatButtonGroup->id(pButton)]));
+    }
+    m_pVariantCnt->setTitle(UIWizardNewVD::tr("Storage details"));
+    m_pDynamicalButton->setText(UIWizardNewVD::tr("&Dynamically allocated"));
+    m_pFixedButton->setText(UIWizardNewVD::tr("&Fixed size"));
+    m_pSplitBox->setText(UIWizardNewVD::tr("&Split into files of less than 2GB"));
+}
+
+void UIWizardNewVDPageExpert::initializePage()
+{
+    /* Translate page: */
+    retranslateUi();
+}
+
+bool UIWizardNewVDPageExpert::isComplete() const
+{
+    /* Make sure medium format/variant is correct,
+     * current name is not empty and current size feats the bounds: */
+    return !mediumFormat().isNull() &&
+           mediumVariant() != (qulonglong)KMediumVariant_Max &&
+           !m_pLocationEditor->text().trimmed().isEmpty() &&
+           mediumSize() >= m_uMediumSizeMin && mediumSize() <= m_uMediumSizeMax;
+}
+
+bool UIWizardNewVDPageExpert::validatePage()
+{
+    /* Initial result: */
+    bool fResult = true;
+
+    /* Lock finish button: */
+    startProcessing();
+
+    /* Make sure that virtual-disk doesn't exists: */
+    QString strMediumPath(mediumPath());
+    if (fResult && QFileInfo(strMediumPath).exists())
+    {
+        msgCenter().sayCannotOverwriteHardDiskStorage(this, strMediumPath);
+        fResult = false;
+    }
+
+    /* Try to create virtual-disk: */
+    if (fResult)
+        fResult = qobject_cast<UIWizardNewVD*>(wizard())->createVirtualDisk();
+
+    /* Unlock finish button: */
+    endProcessing();
+
+    /* Return result: */
+    return fResult;
+}
+
Index: /trunk/src/VBox/Frontends/VirtualBox/src/wizards/newvd/UIWizardNewVDPageExpert.h
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/wizards/newvd/UIWizardNewVDPageExpert.h	(revision 41021)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/wizards/newvd/UIWizardNewVDPageExpert.h	(revision 41021)
@@ -0,0 +1,78 @@
+/** @file
+ *
+ * VBox frontends: Qt4 GUI ("VirtualBox"):
+ * UIWizardNewVDPageExpert class declaration
+ */
+
+/*
+ * Copyright (C) 2006-2012 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ */
+
+#ifndef __UIWizardNewVDPageExpert_h__
+#define __UIWizardNewVDPageExpert_h__
+
+/* Local includes: */
+#include "UIWizardNewVDPageBasic1.h"
+#include "UIWizardNewVDPageBasic2.h"
+#include "UIWizardNewVDPageBasic3.h"
+#include "UIWizardNewVDPageBasic4.h"
+
+/* Expert page of the New Virtual Disk wizard: */
+class UIWizardNewVDPageExpert : public UIWizardPage,
+                                public UIWizardNewVDPage1,
+                                public UIWizardNewVDPage2,
+                                public UIWizardNewVDPage3,
+                                public UIWizardNewVDPage4
+{
+    Q_OBJECT;
+    Q_PROPERTY(CMediumFormat mediumFormat READ mediumFormat WRITE setMediumFormat);
+    Q_PROPERTY(qulonglong mediumVariant READ mediumVariant WRITE setMediumVariant);
+    Q_PROPERTY(QString mediumPath READ mediumPath);
+    Q_PROPERTY(qulonglong mediumSize READ mediumSize WRITE setMediumSize);
+
+public:
+
+    /* Constructor: */
+    UIWizardNewVDPageExpert(const QString &strDefaultName, const QString &strDefaultPath, qulonglong uDefaultSize);
+
+protected:
+
+    /* Wrapper to access 'this' from base part: */
+    UIWizardPage* thisImp() { return this; }
+    /* Wrapper to access 'wizard-field' from base part: */
+    QVariant fieldImp(const QString &strFieldName) const { return UIWizardPage::field(strFieldName); }
+
+private slots:
+
+    /* Medium format stuff: */
+    void sltMediumFormatChanged();
+
+    /* Location editors stuff: */
+    void sltSelectLocationButtonClicked();
+    /* Size editors stuff: */
+    void sltSizeSliderValueChanged(int iValue);
+    void sltSizeEditorTextChanged(const QString &strValue);
+
+private:
+
+    /* Translation stuff: */
+    void retranslateUi();
+
+    /* Prepare stuff: */
+    void initializePage();
+
+    /* Validation stuff: */
+    bool isComplete() const;
+    bool validatePage();
+};
+
+#endif // __UIWizardNewVDPageExpert_h__
+
Index: /trunk/src/VBox/Frontends/VirtualBox/src/wizards/newvm/UIWizardNewVM.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/wizards/newvm/UIWizardNewVM.cpp	(revision 41020)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/wizards/newvm/UIWizardNewVM.cpp	(revision 41021)
@@ -25,4 +25,5 @@
 #include "UIWizardNewVMPageBasic4.h"
 #include "UIWizardNewVMPageBasic5.h"
+#include "UIWizardNewVMPageExpert.h"
 #include "VBoxDefs.h"
 #include "VBoxGlobal.h"
@@ -33,5 +34,5 @@
 
 UIWizardNewVM::UIWizardNewVM(QWidget *pParent)
-    : UIWizard(pParent)
+    : UIWizard(pParent, UIWizardType_NewVM)
     , m_iIDECount(0)
     , m_iSATACount(0)
@@ -40,17 +41,4 @@
     , m_iSASCount(0)
 {
-    /* Create & add pages: */
-    setPage(Page1, new UIWizardNewVMPageBasic1);
-    setPage(Page2, new UIWizardNewVMPageBasic2);
-    setPage(Page3, new UIWizardNewVMPageBasic3);
-    setPage(Page4, new UIWizardNewVMPageBasic4);
-    setPage(Page5, new UIWizardNewVMPageBasic5);
-
-    /* Translate wizard: */
-    retranslateUi();
-
-    /* Translate wizard pages: */
-    retranslateAllPages();
-
 #ifndef Q_WS_MAC
     /* Assign watermark: */
@@ -60,7 +48,4 @@
     assignBackground(":/vmw_new_welcome_bg.png");
 #endif /* Q_WS_MAC */
-
-    /* Resize wizard to 'golden ratio': */
-    resizeToGoldenRatio(UIWizardType_NewVM);
 }
 
@@ -273,7 +258,34 @@
 void UIWizardNewVM::retranslateUi()
 {
+    /* Call to base-class: */
+    UIWizard::retranslateUi();
+
     /* Translate wizard: */
     setWindowTitle(tr("Create New Virtual Machine"));
     setButtonText(QWizard::FinishButton, tr("Create"));
+}
+
+void UIWizardNewVM::prepare()
+{
+    /* Create corresponding pages: */
+    switch (mode())
+    {
+        case UIWizardMode_Basic:
+        {
+            setPage(Page1, new UIWizardNewVMPageBasic1);
+            setPage(Page2, new UIWizardNewVMPageBasic2);
+            setPage(Page3, new UIWizardNewVMPageBasic3);
+            setPage(Page4, new UIWizardNewVMPageBasic4);
+            setPage(Page5, new UIWizardNewVMPageBasic5);
+            break;
+        }
+        case UIWizardMode_Expert:
+        {
+            setPage(PageExpert, new UIWizardNewVMPageExpert);
+            break;
+        }
+    }
+    /* Call to base-class: */
+    UIWizard::prepare();
 }
 
Index: /trunk/src/VBox/Frontends/VirtualBox/src/wizards/newvm/UIWizardNewVM.h
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/wizards/newvm/UIWizardNewVM.h	(revision 41020)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/wizards/newvm/UIWizardNewVM.h	(revision 41021)
@@ -41,4 +41,10 @@
     };
 
+    /* Page IDs: */
+    enum
+    {
+        PageExpert
+    };
+
     /* Constructor: */
     UIWizardNewVM(QWidget *pParent);
@@ -51,4 +57,5 @@
     /* Who will be able to create virtual-machine: */
     friend class UIWizardNewVMPageBasic5;
+    friend class UIWizardNewVMPageExpert;
 
 private:
@@ -56,4 +63,7 @@
     /* Translation stuff: */
     void retranslateUi();
+
+    /* Pages related stuff: */
+    void prepare();
 
     /* Helping stuff: */
Index: /trunk/src/VBox/Frontends/VirtualBox/src/wizards/newvm/UIWizardNewVMPageBasic1.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/wizards/newvm/UIWizardNewVMPageBasic1.cpp	(revision 41020)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/wizards/newvm/UIWizardNewVMPageBasic1.cpp	(revision 41021)
@@ -27,9 +27,15 @@
 #include "QIRichTextLabel.h"
 
+UIWizardNewVMPage1::UIWizardNewVMPage1()
+{
+}
+
 UIWizardNewVMPageBasic1::UIWizardNewVMPageBasic1()
 {
     /* Create widgets: */
     QVBoxLayout *pMainLayout = new QVBoxLayout(this);
+    {
         m_pLabel1 = new QIRichTextLabel(this);
+        {
             /* Register 'message-box warning-icon' image in m_pLabel1 as 'image': */
             QSize wSize(64, 64);
@@ -39,8 +45,10 @@
             QImage wImage = wPixmap.toImage();
             m_pLabel1->registerImage(wImage, "image");
+        }
         m_pLabel2 = new QIRichTextLabel(this);
-    pMainLayout->addWidget(m_pLabel1);
-    pMainLayout->addWidget(m_pLabel2);
-    pMainLayout->addStretch();
+        pMainLayout->addWidget(m_pLabel1);
+        pMainLayout->addWidget(m_pLabel2);
+        pMainLayout->addStretch();
+    }
 }
 
@@ -48,5 +56,5 @@
 {
     /* Translate page: */
-    setTitle(UIWizardNewVM::tr("Welcome to the New Virtual Machine Wizard!"));
+    setTitle(UIWizardNewVM::tr("Welcome to the New Virtual Machine wizard!"));
 
     /* Translate widgets: */
Index: /trunk/src/VBox/Frontends/VirtualBox/src/wizards/newvm/UIWizardNewVMPageBasic1.h
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/wizards/newvm/UIWizardNewVMPageBasic1.h	(revision 41020)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/wizards/newvm/UIWizardNewVMPageBasic1.h	(revision 41021)
@@ -22,12 +22,19 @@
 /* Local includes: */
 #include "UIWizardPage.h"
-#include "COMDefs.h"
-#include "QIWithRetranslateUI.h"
 
 /* Forward declarations: */
 class QIRichTextLabel;
 
-/* 1st page of the New Virtual Machine wizard: */
-class UIWizardNewVMPageBasic1 : public UIWizardPage
+/* 1st page of the New Virtual Machine wizard (base part): */
+class UIWizardNewVMPage1 : public UIWizardPageBase
+{
+protected:
+
+    /* Constructor: */
+    UIWizardNewVMPage1();
+};
+
+/* 1st page of the New Virtual Machine wizard (basic extension): */
+class UIWizardNewVMPageBasic1 : public UIWizardPage, public UIWizardNewVMPage1
 {
     Q_OBJECT;
Index: /trunk/src/VBox/Frontends/VirtualBox/src/wizards/newvm/UIWizardNewVMPageBasic2.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/wizards/newvm/UIWizardNewVMPageBasic2.cpp	(revision 41020)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/wizards/newvm/UIWizardNewVMPageBasic2.cpp	(revision 41021)
@@ -29,6 +29,6 @@
 #include "UIWizardNewVM.h"
 #include "UIMessageCenter.h"
+#include "VBoxOSTypeSelectorWidget.h"
 #include "QIRichTextLabel.h"
-#include "VBoxOSTypeSelectorWidget.h"
 
 /* Defines some patterns to guess the right OS type. Should be in sync with
@@ -138,40 +138,12 @@
 };
 
-UIWizardNewVMPageBasic2::UIWizardNewVMPageBasic2()
-{
-    /* Create widgets: */
-    QVBoxLayout *pMainLayout = new QVBoxLayout(this);
-        m_pLabel = new QIRichTextLabel(this);
-        m_pNameEditorCnt = new QGroupBox(this);
-            m_pNameEditorCnt->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Fixed);
-            QHBoxLayout *pNameEditorLayout = new QHBoxLayout(m_pNameEditorCnt);
-                m_pNameEditor = new QLineEdit(m_pNameEditorCnt);
-            pNameEditorLayout->addWidget(m_pNameEditor);
-        m_pTypeSelectorCnt = new QGroupBox(this);
-            m_pTypeSelectorCnt->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Fixed);
-            QHBoxLayout *pTypeSelectorLayout = new QHBoxLayout(m_pTypeSelectorCnt);
-                m_pTypeSelector = new VBoxOSTypeSelectorWidget(m_pTypeSelectorCnt);
-                    m_pTypeSelector->activateLayout();
-            pTypeSelectorLayout->addWidget(m_pTypeSelector);
-    pMainLayout->addWidget(m_pLabel);
-    pMainLayout->addWidget(m_pNameEditorCnt);
-    pMainLayout->addWidget(m_pTypeSelectorCnt);
-    pMainLayout->addStretch();
-
-    /* Setup connections: */
-    connect(m_pNameEditor, SIGNAL(textChanged(const QString&)), this, SLOT(sltNameChanged(const QString&)));
-    connect(m_pTypeSelector, SIGNAL(osTypeChanged()), this, SLOT(sltOsTypeChanged()));
-
-    /* Register fields: */
-    registerField("name*", m_pNameEditor);
-    registerField("type", m_pTypeSelector, "type", SIGNAL(osTypeChanged()));
-    registerField("machineFolder", this, "machineFolder");
-    registerField("machineBaseName", this, "machineBaseName");
-}
-
-void UIWizardNewVMPageBasic2::sltNameChanged(const QString &strNewName)
+UIWizardNewVMPage2::UIWizardNewVMPage2()
+{
+}
+
+void UIWizardNewVMPage2::onNameChanged(const QString &strNewName)
 {
     /* Search for a matching OS type based on the string the user typed already. */
-    for (size_t i=0; i < RT_ELEMENTS(gs_OSTypePattern); ++i)
+    for (size_t i = 0; i < RT_ELEMENTS(gs_OSTypePattern); ++i)
         if (strNewName.contains(gs_OSTypePattern[i].pattern))
         {
@@ -183,58 +155,22 @@
 }
 
-void UIWizardNewVMPageBasic2::sltOsTypeChanged()
+void UIWizardNewVMPage2::onOsTypeChanged()
 {
     /* If the user manually edited the OS type, we didn't want our automatic OS type guessing anymore.
      * So simply disconnect the text-edit signal. */
-    disconnect(m_pNameEditor, SIGNAL(textChanged(const QString&)), this, SLOT(sltNameChanged(const QString&)));
-}
-
-void UIWizardNewVMPageBasic2::retranslateUi()
-{
-    /* Translate page: */
-    setTitle(UIWizardNewVM::tr("VM Name and OS Type"));
-
-    /* Translate widgets: */
-    m_pLabel->setText(UIWizardNewVM::tr("<p>Enter a name for the new virtual machine and select the type of the guest operating system "
-                                        "you plan to install onto the virtual machine.</p><p>The name of the virtual machine usually "
-                                        "indicates its software and hardware configuration. It will be used by all VirtualBox components "
-                                        "to identify your virtual machine.</p>"));
-    m_pNameEditorCnt->setTitle(UIWizardNewVM::tr("N&ame"));
-    m_pTypeSelectorCnt->setTitle(UIWizardNewVM::tr("OS &Type"));
-}
-
-void UIWizardNewVMPageBasic2::initializePage()
-{
-    /* Translate page: */
-    retranslateUi();
-
-    /* 'Name' field should have focus initially: */
-    m_pNameEditor->setFocus();
-}
-
-void UIWizardNewVMPageBasic2::cleanupPage()
-{
-    /* Cleanup: */
-    cleanupMachineFolder();
-    /* Call for base-class: */
-    UIWizardPage::cleanupPage();
-}
-
-bool UIWizardNewVMPageBasic2::validatePage()
-{
-    return createMachineFolder();
-}
-
-bool UIWizardNewVMPageBasic2::machineFolderCreated()
+    m_pNameEditor->disconnect(thisImp());
+}
+
+bool UIWizardNewVMPage2::machineFolderCreated()
 {
     return !m_strMachineFolder.isEmpty();
 }
 
-bool UIWizardNewVMPageBasic2::createMachineFolder()
+bool UIWizardNewVMPage2::createMachineFolder()
 {
     /* Cleanup previosly created folder if any: */
     if (machineFolderCreated() && !cleanupMachineFolder())
     {
-        msgCenter().warnAboutCannotRemoveMachineFolder(this, m_strMachineFolder);
+        msgCenter().warnAboutCannotRemoveMachineFolder(thisImp(), m_strMachineFolder);
         return false;
     }
@@ -254,5 +190,5 @@
     if (QDir(strMachineFolder).exists())
     {
-        msgCenter().warnAboutCannotRewriteMachineFolder(this, strMachineFolder);
+        msgCenter().warnAboutCannotRewriteMachineFolder(thisImp(), strMachineFolder);
         return false;
     }
@@ -262,5 +198,5 @@
     if (!fMachineFolderCreated)
     {
-        msgCenter().warnAboutCannotCreateMachineFolder(this, strMachineFolder);
+        msgCenter().warnAboutCannotCreateMachineFolder(thisImp(), strMachineFolder);
         return false;
     }
@@ -272,5 +208,5 @@
 }
 
-bool UIWizardNewVMPageBasic2::cleanupMachineFolder()
+bool UIWizardNewVMPage2::cleanupMachineFolder()
 {
     /* Make sure folder was previosly created: */
@@ -286,22 +222,95 @@
 }
 
-QString UIWizardNewVMPageBasic2::machineFolder() const
-{
-    return m_strMachineFolder;
-}
-
-void UIWizardNewVMPageBasic2::setMachineFolder(const QString &strMachineFolder)
-{
-    m_strMachineFolder = strMachineFolder;
-}
-
-QString UIWizardNewVMPageBasic2::machineBaseName() const
-{
-    return m_strMachineBaseName;
-}
-
-void UIWizardNewVMPageBasic2::setMachineBaseName(const QString &strMachineBaseName)
-{
-    m_strMachineBaseName = strMachineBaseName;
-}
-
+UIWizardNewVMPageBasic2::UIWizardNewVMPageBasic2()
+{
+    /* Create widgets: */
+    QVBoxLayout *pMainLayout = new QVBoxLayout(this);
+    {
+        m_pLabel = new QIRichTextLabel(this);
+        m_pNameCnt = new QGroupBox(this);
+        {
+            m_pNameCnt->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Fixed);
+            QHBoxLayout *pNameCntLayout = new QHBoxLayout(m_pNameCnt);
+            {
+                m_pNameEditor = new QLineEdit(m_pNameCnt);
+                pNameCntLayout->addWidget(m_pNameEditor);
+            }
+        }
+        m_pTypeCnt = new QGroupBox(this);
+        {
+            m_pTypeCnt->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Fixed);
+            QHBoxLayout *pTypeSelectorLayout = new QHBoxLayout(m_pTypeCnt);
+            {
+                m_pTypeSelector = new VBoxOSTypeSelectorWidget(m_pTypeCnt);
+                {
+                    m_pTypeSelector->activateLayout();
+                }
+                pTypeSelectorLayout->addWidget(m_pTypeSelector);
+            }
+        }
+        pMainLayout->addWidget(m_pLabel);
+        pMainLayout->addWidget(m_pNameCnt);
+        pMainLayout->addWidget(m_pTypeCnt);
+        pMainLayout->addStretch();
+    }
+
+    /* Setup connections: */
+    connect(m_pNameEditor, SIGNAL(textChanged(const QString&)), this, SLOT(sltNameChanged(const QString&)));
+    connect(m_pTypeSelector, SIGNAL(osTypeChanged()), this, SLOT(sltOsTypeChanged()));
+
+    /* Register fields: */
+    registerField("name*", m_pNameEditor);
+    registerField("type", m_pTypeSelector, "type", SIGNAL(osTypeChanged()));
+    registerField("machineFolder", this, "machineFolder");
+    registerField("machineBaseName", this, "machineBaseName");
+}
+
+void UIWizardNewVMPageBasic2::sltNameChanged(const QString &strNewName)
+{
+    /* Call to base-class: */
+    onNameChanged(strNewName);
+}
+
+void UIWizardNewVMPageBasic2::sltOsTypeChanged()
+{
+    /* Call to base-class: */
+    onOsTypeChanged();
+}
+
+void UIWizardNewVMPageBasic2::retranslateUi()
+{
+    /* Translate page: */
+    setTitle(UIWizardNewVM::tr("VM Name and OS Type"));
+
+    /* Translate widgets: */
+    m_pLabel->setText(UIWizardNewVM::tr("<p>Enter a name for the new virtual machine and select the type of the guest operating system "
+                                        "you plan to install onto the virtual machine.</p><p>The name of the virtual machine usually "
+                                        "indicates its software and hardware configuration. It will be used by all VirtualBox components "
+                                        "to identify your virtual machine.</p>"));
+    m_pNameCnt->setTitle(UIWizardNewVM::tr("&Name"));
+    m_pTypeCnt->setTitle(UIWizardNewVM::tr("OS &Type"));
+}
+
+void UIWizardNewVMPageBasic2::initializePage()
+{
+    /* Translate page: */
+    retranslateUi();
+
+    /* 'Name' field should have focus initially: */
+    m_pNameEditor->setFocus();
+}
+
+void UIWizardNewVMPageBasic2::cleanupPage()
+{
+    /* Cleanup: */
+    cleanupMachineFolder();
+    /* Call to base-class: */
+    UIWizardPage::cleanupPage();
+}
+
+bool UIWizardNewVMPageBasic2::validatePage()
+{
+    /* Try to create machine folder: */
+    return createMachineFolder();
+}
+
Index: /trunk/src/VBox/Frontends/VirtualBox/src/wizards/newvm/UIWizardNewVMPageBasic2.h
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/wizards/newvm/UIWizardNewVMPageBasic2.h	(revision 41020)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/wizards/newvm/UIWizardNewVMPageBasic2.h	(revision 41021)
@@ -24,11 +24,47 @@
 
 /* Forward declarations: */
-class QIRichTextLabel;
 class QGroupBox;
 class QLineEdit;
 class VBoxOSTypeSelectorWidget;
+class QIRichTextLabel;
 
-/* 2nd page of the New Virtual Machine wizard: */
-class UIWizardNewVMPageBasic2 : public UIWizardPage
+/* 2nd page of the New Virtual Machine wizard (base part): */
+class UIWizardNewVMPage2 : public UIWizardPageBase
+{
+protected:
+
+    /* Constructor: */
+    UIWizardNewVMPage2();
+
+    /* Handlers: */
+    void onNameChanged(const QString &strNewName);
+    void onOsTypeChanged();
+
+    /* Helping stuff: */
+    bool machineFolderCreated();
+    bool createMachineFolder();
+    bool cleanupMachineFolder();
+
+    /* Stuff for 'machineFolder' field: */
+    QString machineFolder() const { return m_strMachineFolder; }
+    void setMachineFolder(const QString &strMachineFolder) { m_strMachineFolder = strMachineFolder; }
+
+    /* Stuff for 'machineBaseName' field: */
+    QString machineBaseName() const { return m_strMachineBaseName; }
+    void setMachineBaseName(const QString &strMachineBaseName) { m_strMachineBaseName = strMachineBaseName; }
+
+    /* Variables: */
+    QString m_strMachineFolder;
+    QString m_strMachineBaseName;
+
+    /* Widgets: */
+    QGroupBox *m_pNameCnt;
+    QLineEdit *m_pNameEditor;
+    QGroupBox *m_pTypeCnt;
+    VBoxOSTypeSelectorWidget *m_pTypeSelector;
+};
+
+/* 2nd page of the New Virtual Machine wizard (basic extension): */
+class UIWizardNewVMPageBasic2 : public UIWizardPage, public UIWizardNewVMPage2
 {
     Q_OBJECT;
@@ -40,4 +76,9 @@
     /* Constructor: */
     UIWizardNewVMPageBasic2();
+
+protected:
+
+    /* Wrapper to access 'this' from base part: */
+    UIWizardPage* thisImp() { return this; }
 
 private slots:
@@ -59,25 +100,6 @@
     bool validatePage();
 
-    /* Helping stuff: */
-    bool machineFolderCreated();
-    bool createMachineFolder();
-    bool cleanupMachineFolder();
-
-    /* Stuff for 'machineFolder' field: */
-    QString machineFolder() const;
-    void setMachineFolder(const QString &strMachineFolder);
-    QString m_strMachineFolder;
-
-    /* Stuff for 'machineBaseName' field: */
-    QString machineBaseName() const;
-    void setMachineBaseName(const QString &strMachineBaseName);
-    QString m_strMachineBaseName;
-
     /* Widgets: */
     QIRichTextLabel *m_pLabel;
-    QGroupBox *m_pNameEditorCnt;
-    QLineEdit *m_pNameEditor;
-    QGroupBox *m_pTypeSelectorCnt;
-    VBoxOSTypeSelectorWidget *m_pTypeSelector;
 };
 
Index: /trunk/src/VBox/Frontends/VirtualBox/src/wizards/newvm/UIWizardNewVMPageBasic3.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/wizards/newvm/UIWizardNewVMPageBasic3.cpp	(revision 41020)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/wizards/newvm/UIWizardNewVMPageBasic3.cpp	(revision 41021)
@@ -31,7 +31,27 @@
 #include "COMDefs.h"
 #include "VBoxGlobal.h"
-#include "QIRichTextLabel.h"
 #include "VBoxGuestRAMSlider.h"
 #include "QILineEdit.h"
+#include "QIRichTextLabel.h"
+
+UIWizardNewVMPage3::UIWizardNewVMPage3()
+{
+}
+
+void UIWizardNewVMPage3::onRamSliderValueChanged(int iValue)
+{
+    /* Update 'ram' field editor connected to slider: */
+    m_pRamEditor->blockSignals(true);
+    m_pRamEditor->setText(QString::number(iValue));
+    m_pRamEditor->blockSignals(false);
+}
+
+void UIWizardNewVMPage3::onRamEditorTextChanged(const QString &strText)
+{
+    /* Update 'ram' field slider connected to editor: */
+    m_pRamSlider->blockSignals(true);
+    m_pRamSlider->setValue(strText.toInt());
+    m_pRamSlider->blockSignals(false);
+}
 
 UIWizardNewVMPageBasic3::UIWizardNewVMPageBasic3()
@@ -39,57 +59,76 @@
     /* Create widget: */
     QVBoxLayout *pMainLayout = new QVBoxLayout(this);
+    {
         m_pLabel1 = new QIRichTextLabel(this);
         m_pLabel2 = new QIRichTextLabel(this);
         m_pMemoryCnt = new QGroupBox(this);
+        {
             m_pMemoryCnt->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Fixed);
-            QGridLayout *pMemoryLayout = new QGridLayout(m_pMemoryCnt);
+            QGridLayout *pMemoryCntLayout = new QGridLayout(m_pMemoryCnt);
+            {
                 m_pRamSlider = new VBoxGuestRAMSlider(m_pMemoryCnt);
+                {
                     m_pRamSlider->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);
                     m_pRamSlider->setOrientation(Qt::Horizontal);
                     m_pRamSlider->setTickPosition(QSlider::TicksBelow);
+                }
                 m_pRamEditor = new QILineEdit(m_pMemoryCnt);
+                {
                     m_pRamEditor->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);
                     m_pRamEditor->setFixedWidthByText("88888");
                     m_pRamEditor->setAlignment(Qt::AlignRight);
                     m_pRamEditor->setValidator(new QIntValidator(m_pRamSlider->minRAM(), m_pRamSlider->maxRAM(), this));
+                }
                 m_pRamUnits = new QLabel(m_pMemoryCnt);
+                {
                     m_pRamUnits->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Fixed);
+                }
                 m_pRamMin = new QLabel(m_pMemoryCnt);
+                {
                     m_pRamMin->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Fixed);
+                }
                 QSpacerItem *m_pRamSpacer = new QSpacerItem(0, 0, QSizePolicy::Expanding);
                 m_pRamMax = new QLabel(m_pMemoryCnt);
+                {
                     m_pRamMax->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Fixed);
-            pMemoryLayout->addWidget(m_pRamSlider, 0, 0, 1, 3);
-            pMemoryLayout->addWidget(m_pRamEditor, 0, 3);
-            pMemoryLayout->addWidget(m_pRamUnits, 0, 4);
-            pMemoryLayout->addWidget(m_pRamMin, 1, 0);
-            pMemoryLayout->addItem(m_pRamSpacer, 1, 1);
-            pMemoryLayout->addWidget(m_pRamMax, 1, 2);
-    pMainLayout->addWidget(m_pLabel1);
-    pMainLayout->addWidget(m_pLabel2);
-    pMainLayout->addWidget(m_pMemoryCnt);
-    pMainLayout->addStretch();
+                }
+                pMemoryCntLayout->addWidget(m_pRamSlider, 0, 0, 1, 3);
+                pMemoryCntLayout->addWidget(m_pRamEditor, 0, 3);
+                pMemoryCntLayout->addWidget(m_pRamUnits, 0, 4);
+                pMemoryCntLayout->addWidget(m_pRamMin, 1, 0);
+                pMemoryCntLayout->addItem(m_pRamSpacer, 1, 1);
+                pMemoryCntLayout->addWidget(m_pRamMax, 1, 2);
+            }
+        }
+        pMainLayout->addWidget(m_pLabel1);
+        pMainLayout->addWidget(m_pLabel2);
+        pMainLayout->addWidget(m_pMemoryCnt);
+        pMainLayout->addStretch();
+    }
 
     /* Setup connections: */
-    connect(m_pRamSlider, SIGNAL(valueChanged(int)), this, SLOT(ramSliderValueChanged(int)));
-    connect(m_pRamEditor, SIGNAL(textChanged(const QString&)), this, SLOT(ramEditorTextChanged(const QString&)));
+    connect(m_pRamSlider, SIGNAL(valueChanged(int)), this, SLOT(sltRamSliderValueChanged(int)));
+    connect(m_pRamEditor, SIGNAL(textChanged(const QString&)), this, SLOT(sltRamEditorTextChanged(const QString&)));
 
-    /* Initialize connections: */
-    ramSliderValueChanged(m_pRamSlider->value());
-
-    /* Register field: */
-    registerField("ram*", m_pRamSlider, "value", SIGNAL(valueChanged(int)));
+    /* Register fields: */
+    registerField("ram", m_pRamSlider, "value", SIGNAL(valueChanged(int)));
 }
 
-void UIWizardNewVMPageBasic3::ramSliderValueChanged(int iValue)
+void UIWizardNewVMPageBasic3::sltRamSliderValueChanged(int iValue)
 {
-    /* Update 'ram' field editor connected to slider: */
-    m_pRamEditor->setText(QString::number(iValue));
+    /* Call to base-class: */
+    onRamSliderValueChanged(iValue);
+
+    /* Broadcast complete-change: */
+    emit completeChanged();
 }
 
-void UIWizardNewVMPageBasic3::ramEditorTextChanged(const QString &strText)
+void UIWizardNewVMPageBasic3::sltRamEditorTextChanged(const QString &strText)
 {
-    /* Update 'ram' field slider connected to editor: */
-    m_pRamSlider->setValue(strText.toInt());
+    /* Call to base-class: */
+    onRamEditorTextChanged(strText);
+
+    /* Broadcast complete-change: */
+    emit completeChanged();
 }
 
@@ -117,5 +156,6 @@
     /* Get recommended 'ram' field value: */
     CGuestOSType type = field("type").value<CGuestOSType>();
-    ramSliderValueChanged(type.GetRecommendedRAM());
+    m_pRamSlider->setValue(type.GetRecommendedRAM());
+    m_pRamEditor->setText(QString::number(type.GetRecommendedRAM()));
 
     /* 'Ram' field should have focus initially: */
@@ -125,5 +165,5 @@
 bool UIWizardNewVMPageBasic3::isComplete() const
 {
-    /* Check what 'ram' field value feats the bounds: */
+    /* Make sure 'ram' field feats the bounds: */
     return m_pRamSlider->value() >= qMax(1, (int)m_pRamSlider->minRAM()) &&
            m_pRamSlider->value() <= (int)m_pRamSlider->maxRAM();
Index: /trunk/src/VBox/Frontends/VirtualBox/src/wizards/newvm/UIWizardNewVMPageBasic3.h
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/wizards/newvm/UIWizardNewVMPageBasic3.h	(revision 41020)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/wizards/newvm/UIWizardNewVMPageBasic3.h	(revision 41021)
@@ -24,12 +24,33 @@
 
 /* Forward declarations: */
-class QIRichTextLabel;
 class QGroupBox;
 class VBoxGuestRAMSlider;
 class QILineEdit;
 class QLabel;
+class QIRichTextLabel;
 
-/* 3rd page of the New Virtual Machine wizard: */
-class UIWizardNewVMPageBasic3 : public UIWizardPage
+/* 3rd page of the New Virtual Machine wizard (base part): */
+class UIWizardNewVMPage3 : public UIWizardPageBase
+{
+protected:
+
+    /* Constructor: */
+    UIWizardNewVMPage3();
+
+    /* Handlers: */
+    void onRamSliderValueChanged(int iValue);
+    void onRamEditorTextChanged(const QString &strText);
+
+    /* Widgets: */
+    QGroupBox *m_pMemoryCnt;
+    VBoxGuestRAMSlider *m_pRamSlider;
+    QILineEdit *m_pRamEditor;
+    QLabel *m_pRamMin;
+    QLabel *m_pRamMax;
+    QLabel *m_pRamUnits;
+};
+
+/* 3rd page of the New Virtual Machine wizard (basic extension): */
+class UIWizardNewVMPageBasic3 : public UIWizardPage, public UIWizardNewVMPage3
 {
     Q_OBJECT;
@@ -43,6 +64,6 @@
 
     /* Handlers: */
-    void ramSliderValueChanged(int iValue);
-    void ramEditorTextChanged(const QString &strText);
+    void sltRamSliderValueChanged(int iValue);
+    void sltRamEditorTextChanged(const QString &strText);
 
 private:
@@ -60,10 +81,4 @@
     QIRichTextLabel *m_pLabel1;
     QIRichTextLabel *m_pLabel2;
-    QGroupBox *m_pMemoryCnt;
-    VBoxGuestRAMSlider *m_pRamSlider;
-    QILineEdit *m_pRamEditor;
-    QLabel *m_pRamMin;
-    QLabel *m_pRamMax;
-    QLabel *m_pRamUnits;
 };
 
Index: /trunk/src/VBox/Frontends/VirtualBox/src/wizards/newvm/UIWizardNewVMPageBasic4.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/wizards/newvm/UIWizardNewVMPageBasic4.cpp	(revision 41020)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/wizards/newvm/UIWizardNewVMPageBasic4.cpp	(revision 41021)
@@ -28,11 +28,101 @@
 #include "UIWizardNewVMPageBasic4.h"
 #include "UIWizardNewVM.h"
+#include "VBoxDefs.h"
+#include "UIMessageCenter.h"
 #include "UIIconPool.h"
-#include "UIMessageCenter.h"
-#include "VBoxDefs.h"
-#include "QIRichTextLabel.h"
 #include "VBoxMediaComboBox.h"
 #include "QIToolButton.h"
 #include "UIWizardNewVD.h"
+#include "QIRichTextLabel.h"
+
+UIWizardNewVMPage4::UIWizardNewVMPage4()
+{
+}
+
+void UIWizardNewVMPage4::updateVirtualDiskSource()
+{
+    /* Enable/disable controls: */
+    m_pDiskCreate->setEnabled(m_pDiskCnt->isChecked());
+    m_pDiskPresent->setEnabled(m_pDiskCnt->isChecked());
+    m_pDiskSelector->setEnabled(m_pDiskPresent->isEnabled() && m_pDiskPresent->isChecked());
+    m_pVMMButton->setEnabled(m_pDiskPresent->isEnabled() && m_pDiskPresent->isChecked());
+
+    /* Fetch filed values: */
+    if (m_pDiskCnt->isChecked() && m_pDiskPresent->isChecked())
+    {
+        m_strVirtualDiskId = m_pDiskSelector->id();
+        m_strVirtualDiskName = m_pDiskSelector->currentText();
+        m_strVirtualDiskLocation = m_pDiskSelector->location();
+    }
+    else
+    {
+        m_strVirtualDiskId = QString();
+        m_strVirtualDiskName = QString();
+        m_strVirtualDiskLocation = QString();
+    }
+}
+
+void UIWizardNewVMPage4::getWithFileOpenDialog()
+{
+    /* Get opened medium id: */
+    QString strMediumId = vboxGlobal().openMediumWithFileOpenDialog(VBoxDefs::MediumType_HardDisk, thisImp());
+    if (!strMediumId.isNull())
+    {
+        /* Update medium-combo if necessary: */
+        m_pDiskSelector->setCurrentItem(strMediumId);
+        /* Update hard disk source: */
+        updateVirtualDiskSource();
+        /* Focus on hard disk combo: */
+        m_pDiskSelector->setFocus();
+    }
+}
+
+bool UIWizardNewVMPage4::getWithNewVirtualDiskWizard()
+{
+    /* Create New Virtual Disk wizard: */
+    UIWizardNewVD dlg(thisImp(),
+                      fieldImp("machineBaseName").toString(),
+                      fieldImp("machineFolder").toString(),
+                      fieldImp("type").value<CGuestOSType>().GetRecommendedHDD());
+    if (dlg.exec() == QDialog::Accepted)
+    {
+        m_virtualDisk = dlg.virtualDisk();
+        m_pDiskSelector->setCurrentItem(m_virtualDisk.GetId());
+        m_pDiskPresent->click();
+        return true;
+    }
+    return false;
+}
+
+void UIWizardNewVMPage4::ensureNewVirtualDiskDeleted()
+{
+    /* Make sure virtual-disk exists: */
+    if (m_virtualDisk.isNull())
+        return;
+
+    /* Remember virtual-disk ID: */
+    QString strId = m_virtualDisk.GetId();
+
+    /* 1st step: start delete-storage progress: */
+    CProgress progress = m_virtualDisk.DeleteStorage();
+    /* Get initial state: */
+    bool fSuccess = m_virtualDisk.isOk();
+
+    /* 2nd step: show delete-storage progress: */
+    if (fSuccess)
+    {
+        msgCenter().showModalProgressDialog(progress, thisImp()->windowTitle(), ":/progress_media_delete_90px.png", thisImp(), true);
+        fSuccess = progress.isOk() && progress.GetResultCode() == S_OK;
+    }
+
+    /* 3rd step: notify GUI about virtual-disk was deleted or show error if any: */
+    if (fSuccess)
+        vboxGlobal().removeMedium(VBoxDefs::MediumType_HardDisk, strId);
+    else
+        msgCenter().cannotDeleteHardDiskStorage(thisImp(), m_virtualDisk, progress);
+
+    /* Detach virtual-disk finally: */
+    m_virtualDisk.detach();
+}
 
 UIWizardNewVMPageBasic4::UIWizardNewVMPageBasic4()
@@ -40,45 +130,53 @@
     /* Create widgets: */
     QVBoxLayout *pMainLayout = new QVBoxLayout(this);
+    {
         m_pLabel1 = new QIRichTextLabel(this);
         m_pLabel2 = new QIRichTextLabel(this);
-        m_pBootHDCnt = new QGroupBox(this);
-            m_pBootHDCnt->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Fixed);
-            m_pBootHDCnt->setCheckable(true);
-            QGridLayout *pDiskLayout = new QGridLayout(m_pBootHDCnt);
-                m_pDiskCreate = new QRadioButton(m_pBootHDCnt);
-                m_pDiskPresent = new QRadioButton(m_pBootHDCnt);
+        m_pDiskCnt = new QGroupBox(this);
+        {
+            m_pDiskCnt->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Fixed);
+            m_pDiskCnt->setCheckable(true);
+            QGridLayout *pDiskLayout = new QGridLayout(m_pDiskCnt);
+            {
+                m_pDiskCreate = new QRadioButton(m_pDiskCnt);
+                m_pDiskPresent = new QRadioButton(m_pDiskCnt);
                 QStyleOptionButton options;
                 options.initFrom(m_pDiskCreate);
-                int wid = m_pDiskCreate->style()->subElementRect(QStyle::SE_RadioButtonIndicator, &options, m_pDiskCreate).width() +
-                          m_pDiskCreate->style()->pixelMetric(QStyle::PM_RadioButtonLabelSpacing, &options, m_pDiskCreate) -
-                          pDiskLayout->spacing() - 1;
-                QSpacerItem *pSpacer = new QSpacerItem(wid, 0, QSizePolicy::Fixed, QSizePolicy::Fixed);
-                m_pDiskSelector = new VBoxMediaComboBox(m_pBootHDCnt);
+                int iWidth = m_pDiskCreate->style()->subElementRect(QStyle::SE_RadioButtonIndicator, &options, m_pDiskCreate).width() +
+                             m_pDiskCreate->style()->pixelMetric(QStyle::PM_RadioButtonLabelSpacing, &options, m_pDiskCreate) -
+                             pDiskLayout->spacing() - 1;
+                QSpacerItem *pSpacer = new QSpacerItem(iWidth, 0, QSizePolicy::Fixed, QSizePolicy::Fixed);
+                m_pDiskSelector = new VBoxMediaComboBox(m_pDiskCnt);
+                {
                     m_pDiskSelector->setType(VBoxDefs::MediumType_HardDisk);
                     m_pDiskSelector->repopulate();
-                m_pVMMButton = new QIToolButton(m_pBootHDCnt);
+                }
+                m_pVMMButton = new QIToolButton(m_pDiskCnt);
+                {
                     m_pVMMButton->setAutoRaise(true);
                     m_pVMMButton->setIcon(UIIconPool::iconSet(":/select_file_16px.png", ":/select_file_dis_16px.png"));
-            pDiskLayout->addWidget(m_pDiskCreate, 0, 0, 1, 3);
-            pDiskLayout->addWidget(m_pDiskPresent, 1, 0, 1, 3);
-            pDiskLayout->addItem(pSpacer, 2, 0);
-            pDiskLayout->addWidget(m_pDiskSelector, 2, 1);
-            pDiskLayout->addWidget(m_pVMMButton, 2, 2);
-    pMainLayout->addWidget(m_pLabel1);
-    pMainLayout->addWidget(m_pLabel2);
-    pMainLayout->addWidget(m_pBootHDCnt);
-    pMainLayout->addStretch();
+                }
+                pDiskLayout->addWidget(m_pDiskCreate, 0, 0, 1, 3);
+                pDiskLayout->addWidget(m_pDiskPresent, 1, 0, 1, 3);
+                pDiskLayout->addItem(pSpacer, 2, 0);
+                pDiskLayout->addWidget(m_pDiskSelector, 2, 1);
+                pDiskLayout->addWidget(m_pVMMButton, 2, 2);
+            }
+        }
+        pMainLayout->addWidget(m_pLabel1);
+        pMainLayout->addWidget(m_pLabel2);
+        pMainLayout->addWidget(m_pDiskCnt);
+        pMainLayout->addStretch();
+        updateVirtualDiskSource();
+    }
 
     /* Setup connections: */
-    connect(m_pBootHDCnt, SIGNAL(toggled(bool)), this, SLOT(virtualDiskSourceChanged()));
-    connect(m_pDiskCreate, SIGNAL(toggled(bool)), this, SLOT(virtualDiskSourceChanged()));
-    connect(m_pDiskPresent, SIGNAL(toggled(bool)), this, SLOT(virtualDiskSourceChanged()));
-    connect(m_pDiskSelector, SIGNAL(currentIndexChanged(int)), this, SLOT(virtualDiskSourceChanged()));
-    connect(m_pVMMButton, SIGNAL(clicked()), this, SLOT(getWithFileOpenDialog()));
-
-    /* Initialise connections: */
-    virtualDiskSourceChanged();
-
-    /* Register CMedium class: */
+    connect(m_pDiskCnt, SIGNAL(toggled(bool)), this, SLOT(sltVirtualDiskSourceChanged()));
+    connect(m_pDiskCreate, SIGNAL(toggled(bool)), this, SLOT(sltVirtualDiskSourceChanged()));
+    connect(m_pDiskPresent, SIGNAL(toggled(bool)), this, SLOT(sltVirtualDiskSourceChanged()));
+    connect(m_pDiskSelector, SIGNAL(currentIndexChanged(int)), this, SLOT(sltVirtualDiskSourceChanged()));
+    connect(m_pVMMButton, SIGNAL(clicked()), this, SLOT(sltGetWithFileOpenDialog()));
+
+    /* Register classes: */
     qRegisterMetaType<CMedium>();
     /* Register fields: */
@@ -89,65 +187,17 @@
 }
 
-void UIWizardNewVMPageBasic4::ensureNewVirtualDiskDeleted()
-{
-    if (m_virtualDisk.isNull())
-        return;
-
-    QString strId = m_virtualDisk.GetId();
-
-    bool fSuccess = false;
-
-    CProgress progress = m_virtualDisk.DeleteStorage();
-    if (m_virtualDisk.isOk())
-    {
-        msgCenter().showModalProgressDialog(progress, windowTitle(), ":/progress_media_delete_90px.png", this, true);
-        if (progress.isOk() && progress.GetResultCode() == S_OK)
-            fSuccess = true;
-    }
-
-    if (fSuccess)
-        vboxGlobal().removeMedium(VBoxDefs::MediumType_HardDisk, strId);
-    else
-        msgCenter().cannotDeleteHardDiskStorage(this, m_virtualDisk, progress);
-
-    m_virtualDisk.detach();
-}
-
-void UIWizardNewVMPageBasic4::virtualDiskSourceChanged()
-{
-    m_pDiskCreate->setEnabled(m_pBootHDCnt->isChecked());
-    m_pDiskPresent->setEnabled(m_pBootHDCnt->isChecked());
-    m_pDiskSelector->setEnabled(m_pDiskPresent->isEnabled() && m_pDiskPresent->isChecked());
-    m_pVMMButton->setEnabled(m_pDiskPresent->isEnabled() && m_pDiskPresent->isChecked());
-
-    if (m_pBootHDCnt->isChecked() && m_pDiskPresent->isChecked())
-    {
-        m_strVirtualDiskId = m_pDiskSelector->id();
-        m_strVirtualDiskName = m_pDiskSelector->currentText();
-        m_strVirtualDiskLocation = m_pDiskSelector->location();
-    }
-    else
-    {
-        m_strVirtualDiskId.clear();
-        m_strVirtualDiskName.clear();
-        m_strVirtualDiskLocation.clear();
-    }
-
+void UIWizardNewVMPageBasic4::sltVirtualDiskSourceChanged()
+{
+    /* Call to base-class: */
+    updateVirtualDiskSource();
+
+    /* Broadcast complete-change: */
     emit completeChanged();
 }
 
-void UIWizardNewVMPageBasic4::getWithFileOpenDialog()
-{
-    /* Get opened vboxMedium id: */
-    QString strMediumId = vboxGlobal().openMediumWithFileOpenDialog(VBoxDefs::MediumType_HardDisk, this);
-    if (!strMediumId.isNull())
-    {
-        /* Update medium-combo if necessary: */
-        m_pDiskSelector->setCurrentItem(strMediumId);
-        /* Update hard disk source: */
-        virtualDiskSourceChanged();
-        /* Focus on hard disk combo: */
-        m_pDiskSelector->setFocus();
-    }
+void UIWizardNewVMPageBasic4::sltGetWithFileOpenDialog()
+{
+    /* Call to base-class: */
+    getWithFileOpenDialog();
 }
 
@@ -159,12 +209,12 @@
     /* Translate widgets: */
     m_pLabel1->setText(UIWizardNewVM::tr("<p>If you wish you can now add a start-up disk to the new machine. "
-                              "You can either create a new virtual disk or select one from the list "
-                              "or from another location using the folder icon.</p>"
-                              "<p>If you need a more complex virtual disk setup you can skip this step "
-                              "and make the changes to the machine settings once the machine is created.</p>"));
+                                         "You can either create a new virtual disk or select one from the list "
+                                         "or from another location using the folder icon.</p>"
+                                         "<p>If you need a more complex virtual disk setup you can skip this step "
+                                         "and make the changes to the machine settings once the machine is created.</p>"));
     QString strRecommendedHDD = field("type").value<CGuestOSType>().isNull() ? QString() :
                                 VBoxGlobal::formatSize(field("type").value<CGuestOSType>().GetRecommendedHDD());
     m_pLabel2->setText(UIWizardNewVM::tr("The recommended size of the start-up disk is <b>%1</b>.").arg(strRecommendedHDD));
-    m_pBootHDCnt->setTitle(UIWizardNewVM::tr("Start-up &Disk"));
+    m_pDiskCnt->setTitle(UIWizardNewVM::tr("Start-up &Disk"));
     m_pDiskCreate->setText(UIWizardNewVM::tr("&Create new hard disk"));
     m_pDiskPresent->setText(UIWizardNewVM::tr("&Use existing hard disk"));
@@ -178,5 +228,5 @@
 
     /* Prepare initial choice: */
-    m_pBootHDCnt->setChecked(true);
+    m_pDiskCnt->setChecked(true);
     m_pDiskSelector->setCurrentIndex(0);
     m_pDiskCreate->setChecked(true);
@@ -188,7 +238,6 @@
 void UIWizardNewVMPageBasic4::cleanupPage()
 {
-    /* Clean medium if present */
+    /* Call to base-class: */
     ensureNewVirtualDiskDeleted();
-    /* Clean fields of that page */
     UIWizardPage::cleanupPage();
 }
@@ -196,6 +245,6 @@
 bool UIWizardNewVMPageBasic4::isComplete() const
 {
-    /* Check what virtualDisk feats the rules: */
-    return !m_pBootHDCnt->isChecked() ||
+    /* Make sure 'virtualDisk' field feats the rules: */
+    return !m_pDiskCnt->isChecked() ||
            !m_pDiskPresent->isChecked() ||
            !vboxGlobal().findMedium(m_pDiskSelector->id()).isNull();
@@ -204,70 +253,24 @@
 bool UIWizardNewVMPageBasic4::validatePage()
 {
+    /* Initial result: */
+    bool fResult = true;
+
     /* Ensure unused virtual-disk is deleted: */
-    if (!m_pBootHDCnt->isChecked() || m_pDiskCreate->isChecked() || (!m_virtualDisk.isNull() && m_strVirtualDiskId != m_virtualDisk.GetId()))
+    if (!m_pDiskCnt->isChecked() || m_pDiskCreate->isChecked() || (!m_virtualDisk.isNull() && m_strVirtualDiskId != m_virtualDisk.GetId()))
         ensureNewVirtualDiskDeleted();
 
-    /* Ask user about disk-less machine: */
-    if (!m_pBootHDCnt->isChecked() && !msgCenter().confirmHardDisklessMachine(this))
-        return false;
-
-    /* Show the New Virtual Disk wizard: */
-    if (m_pBootHDCnt->isChecked() && m_pDiskCreate->isChecked() && !getWithNewVirtualDiskWizard())
-        return false;
-
-    return true;
-}
-
-bool UIWizardNewVMPageBasic4::getWithNewVirtualDiskWizard()
-{
-    UIWizardNewVD dlg(this, field("machineBaseName").toString(), field("machineFolder").toString(), field("type").value<CGuestOSType>().GetRecommendedHDD());
-    if (dlg.exec() == QDialog::Accepted)
-    {
-        m_virtualDisk = dlg.virtualDisk();
-        m_pDiskSelector->setCurrentItem(m_virtualDisk.GetId());
-        m_pDiskPresent->click();
-        return true;
-    }
-    return false;
-}
-
-CMedium UIWizardNewVMPageBasic4::virtualDisk() const
-{
-    return m_virtualDisk;
-}
-
-void UIWizardNewVMPageBasic4::setVirtualDisk(const CMedium &virtualDisk)
-{
-    m_virtualDisk = virtualDisk;
-}
-
-QString UIWizardNewVMPageBasic4::virtualDiskId() const
-{
-    return m_strVirtualDiskId;
-}
-
-void UIWizardNewVMPageBasic4::setVirtualDiskId(const QString &strVirtualDiskId)
-{
-    m_strVirtualDiskId = strVirtualDiskId;
-}
-
-QString UIWizardNewVMPageBasic4::virtualDiskName() const
-{
-    return m_strVirtualDiskName;
-}
-
-void UIWizardNewVMPageBasic4::setVirtualDiskName(const QString &strVirtualDiskName)
-{
-    m_strVirtualDiskName = strVirtualDiskName;
-}
-
-QString UIWizardNewVMPageBasic4::virtualDiskLocation() const
-{
-    return m_strVirtualDiskLocation;
-}
-
-void UIWizardNewVMPageBasic4::setVirtualDiskLocation(const QString &strVirtualDiskLocation)
-{
-    m_strVirtualDiskLocation = strVirtualDiskLocation;
-}
-
+    if (!m_pDiskCnt->isChecked())
+    {
+        /* Ask user about disk-less machine: */
+        fResult = msgCenter().confirmHardDisklessMachine(this);
+    }
+    else if (m_pDiskCreate->isChecked())
+    {
+        /* Show the New Virtual Disk wizard: */
+        fResult = getWithNewVirtualDiskWizard();
+    }
+
+    /* Return result: */
+    return fResult;
+}
+
Index: /trunk/src/VBox/Frontends/VirtualBox/src/wizards/newvm/UIWizardNewVMPageBasic4.h
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/wizards/newvm/UIWizardNewVMPageBasic4.h	(revision 41020)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/wizards/newvm/UIWizardNewVMPageBasic4.h	(revision 41021)
@@ -20,4 +20,7 @@
 #define __UIWizardNewVMPageBasic4_h__
 
+/* Global includes: */
+#include <QVariant>
+
 /* Local includes: */
 #include "UIWizardPage.h"
@@ -25,12 +28,58 @@
 
 /* Forward declarations: */
-class QIRichTextLabel;
 class QGroupBox;
 class QRadioButton;
 class VBoxMediaComboBox;
 class QIToolButton;
+class QIRichTextLabel;
 
-/* 4th page of the New Virtual Machine wizard: */
-class UIWizardNewVMPageBasic4 : public UIWizardPage
+/* 4th page of the New Virtual Machine wizard (base part): */
+class UIWizardNewVMPage4 : public UIWizardPageBase
+{
+protected:
+
+    /* Constructor: */
+    UIWizardNewVMPage4();
+
+    /* Handlers: */
+    void updateVirtualDiskSource();
+    void getWithFileOpenDialog();
+    bool getWithNewVirtualDiskWizard();
+
+    /* Stuff for 'virtualDisk' field: */
+    CMedium virtualDisk() const { return m_virtualDisk; }
+    void setVirtualDisk(const CMedium &virtualDisk) { m_virtualDisk = virtualDisk; }
+
+    /* Stuff for 'virtualDiskId' field: */
+    QString virtualDiskId() const { return m_strVirtualDiskId; }
+    void setVirtualDiskId(const QString &strVirtualDiskId) { m_strVirtualDiskId = strVirtualDiskId; }
+
+    /* Stuff for 'virtualDiskName' field: */
+    QString virtualDiskName() const { return m_strVirtualDiskName; }
+    void setVirtualDiskName(const QString &strVirtualDiskName) { m_strVirtualDiskName = strVirtualDiskName; }
+
+    /* Stuff for 'virtualDiskLocation' field: */
+    QString virtualDiskLocation() const { return m_strVirtualDiskLocation; }
+    void setVirtualDiskLocation(const QString &strVirtualDiskLocation) { m_strVirtualDiskLocation = strVirtualDiskLocation; }
+
+    /* Helpers: */
+    void ensureNewVirtualDiskDeleted();
+
+    /* Variables: */
+    CMedium m_virtualDisk;
+    QString m_strVirtualDiskId;
+    QString m_strVirtualDiskName;
+    QString m_strVirtualDiskLocation;
+
+    /* Widgets: */
+    QGroupBox *m_pDiskCnt;
+    QRadioButton *m_pDiskCreate;
+    QRadioButton *m_pDiskPresent;
+    VBoxMediaComboBox *m_pDiskSelector;
+    QIToolButton *m_pVMMButton;
+};
+
+/* 4th page of the New Virtual Machine wizard (basic extension): */
+class UIWizardNewVMPageBasic4 : public UIWizardPage, public UIWizardNewVMPage4
 {
     Q_OBJECT;
@@ -45,10 +94,16 @@
     UIWizardNewVMPageBasic4();
 
+protected:
+
+    /* Wrapper to access 'this' from base part: */
+    UIWizardPage* thisImp() { return this; }
+    /* Wrapper to access 'wizard-field' from base part: */
+    QVariant fieldImp(const QString &strFieldName) const { return UIWizardPage::field(strFieldName); }
+
 private slots:
 
     /* Handlers: */
-    void ensureNewVirtualDiskDeleted();
-    void virtualDiskSourceChanged();
-    void getWithFileOpenDialog();
+    void sltVirtualDiskSourceChanged();
+    void sltGetWithFileOpenDialog();
 
 private:
@@ -65,35 +120,7 @@
     bool validatePage();
 
-    /* Helpers: */
-    bool getWithNewVirtualDiskWizard();
-
-    /* Stuff for 'virtualDisk' field: */
-    CMedium virtualDisk() const;
-    void setVirtualDisk(const CMedium &virtualDisk);
-    CMedium m_virtualDisk;
-
-    /* Stuff for 'virtualDiskId' field: */
-    QString virtualDiskId() const;
-    void setVirtualDiskId(const QString &strVirtualDiskId);
-    QString m_strVirtualDiskId;
-
-    /* Stuff for 'virtualDiskName' field: */
-    QString virtualDiskName() const;
-    void setVirtualDiskName(const QString &strVirtualDiskName);
-    QString m_strVirtualDiskName;
-
-    /* Stuff for 'virtualDiskLocation' field: */
-    QString virtualDiskLocation() const;
-    void setVirtualDiskLocation(const QString &strVirtualDiskLocation);
-    QString m_strVirtualDiskLocation;
-
     /* Widgets: */
     QIRichTextLabel *m_pLabel1;
     QIRichTextLabel *m_pLabel2;
-    QGroupBox *m_pBootHDCnt;
-    QRadioButton *m_pDiskCreate;
-    QRadioButton *m_pDiskPresent;
-    VBoxMediaComboBox *m_pDiskSelector;
-    QIToolButton *m_pVMMButton;
 };
 
Index: /trunk/src/VBox/Frontends/VirtualBox/src/wizards/newvm/UIWizardNewVMPageBasic5.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/wizards/newvm/UIWizardNewVMPageBasic5.cpp	(revision 41020)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/wizards/newvm/UIWizardNewVMPageBasic5.cpp	(revision 41021)
@@ -27,15 +27,21 @@
 #include "QIRichTextLabel.h"
 
+UIWizardNewVMPage5::UIWizardNewVMPage5()
+{
+}
+
 UIWizardNewVMPageBasic5::UIWizardNewVMPageBasic5()
 {
     /* Create widget: */
     QVBoxLayout *pMainLayout = new QVBoxLayout(this);
-        m_pPage5Text1 = new QIRichTextLabel(this);
-        m_pSummaryText = new QIRichTextLabel(this);
-        m_pPage5Text2 = new QIRichTextLabel(this);
-    pMainLayout->addWidget(m_pPage5Text1);
-    pMainLayout->addWidget(m_pSummaryText);
-    pMainLayout->addWidget(m_pPage5Text2);
-    pMainLayout->addStretch();
+    {
+        m_pLabel1 = new QIRichTextLabel(this);
+        m_pSummary = new QIRichTextLabel(this);
+        m_pLabel2 = new QIRichTextLabel(this);
+        pMainLayout->addWidget(m_pLabel1);
+        pMainLayout->addWidget(m_pSummary);
+        pMainLayout->addWidget(m_pLabel2);
+        pMainLayout->addStretch();
+    }
 }
 
@@ -46,11 +52,11 @@
 
     /* Translate widgets: */
-    m_pPage5Text1->setText(UIWizardNewVM::tr("<p>You are going to create a new virtual machine with the following parameters:</p>"));
-    m_pPage5Text2->setText(UIWizardNewVM::tr("<p>If the above is correct press the <b>%1</b> button. Once "
-                                             "you press it, a new virtual machine will be created. </p><p>Note "
-                                             "that you can alter these and all other setting of the created "
-                                             "virtual machine at any time using the <b>Settings</b> dialog "
-                                             "accessible through the menu of the main window.</p>")
-                                            .arg(VBoxGlobal::replaceHtmlEntities(VBoxGlobal::removeAccelMark(wizard()->buttonText(QWizard::FinishButton)))));
+    m_pLabel1->setText(UIWizardNewVM::tr("<p>You are going to create a new virtual machine with the following parameters:</p>"));
+    m_pLabel2->setText(UIWizardNewVM::tr("<p>If the above is correct press the <b>%1</b> button. Once "
+                                         "you press it, a new virtual machine will be created. </p><p>Note "
+                                         "that you can alter these and all other setting of the created "
+                                         "virtual machine at any time using the <b>Settings</b> dialog "
+                                         "accessible through the menu of the main window.</p>")
+                                        .arg(VBoxGlobal::replaceHtmlEntities(VBoxGlobal::removeAccelMark(wizard()->buttonText(QWizard::FinishButton)))));
 
     /* Compose common summary: */
@@ -74,5 +80,5 @@
                              .arg(UIWizardNewVM::tr("Start-up Disk", "summary"), field("virtualDiskName").toString());
     }
-    m_pSummaryText->setText("<table cellspacing=0 cellpadding=0>" + strSummary + "</table>");
+    m_pSummary->setText("<table cellspacing=0 cellpadding=0>" + strSummary + "</table>");
 }
 
@@ -83,13 +89,23 @@
 
     /* Summary should have focus initially: */
-    m_pSummaryText->setFocus();
+    m_pSummary->setFocus();
 }
 
 bool UIWizardNewVMPageBasic5::validatePage()
 {
+    /* Initial result: */
+    bool fResult = true;
+
+    /* Lock finish button: */
+    startProcessing();
+
     /* Try to create VM: */
-    startProcessing();
-    bool fResult = qobject_cast<UIWizardNewVM*>(wizard())->createVM();
+    if (fResult)
+        fResult = qobject_cast<UIWizardNewVM*>(wizard())->createVM();
+
+    /* Unlock finish button: */
     endProcessing();
+
+    /* Return result: */
     return fResult;
 }
Index: /trunk/src/VBox/Frontends/VirtualBox/src/wizards/newvm/UIWizardNewVMPageBasic5.h
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/wizards/newvm/UIWizardNewVMPageBasic5.h	(revision 41020)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/wizards/newvm/UIWizardNewVMPageBasic5.h	(revision 41021)
@@ -26,6 +26,15 @@
 class QIRichTextLabel;
 
-/* 5th page of the New Virtual Machine wizard: */
-class UIWizardNewVMPageBasic5 : public UIWizardPage
+/* 5th page of the New Virtual Machine wizard (base part): */
+class UIWizardNewVMPage5 : public UIWizardPageBase
+{
+protected:
+
+    /* Constructor: */
+    UIWizardNewVMPage5();
+};
+
+/* 5th page of the New Virtual Machine wizard (basic extension): */
+class UIWizardNewVMPageBasic5 : public UIWizardPage, public UIWizardNewVMPage5
 {
     Q_OBJECT;
@@ -36,5 +45,5 @@
     UIWizardNewVMPageBasic5();
 
-protected:
+private:
 
     /* Translate stuff: */
@@ -47,10 +56,8 @@
     bool validatePage();
 
-private:
-
     /* Widgets: */
-    QIRichTextLabel *m_pPage5Text1;
-    QIRichTextLabel *m_pSummaryText;
-    QIRichTextLabel *m_pPage5Text2;
+    QIRichTextLabel *m_pLabel1;
+    QIRichTextLabel *m_pSummary;
+    QIRichTextLabel *m_pLabel2;
 };
 
Index: /trunk/src/VBox/Frontends/VirtualBox/src/wizards/newvm/UIWizardNewVMPageExpert.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/wizards/newvm/UIWizardNewVMPageExpert.cpp	(revision 41021)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/wizards/newvm/UIWizardNewVMPageExpert.cpp	(revision 41021)
@@ -0,0 +1,320 @@
+/* $Id$ */
+/** @file
+ *
+ * VBox frontends: Qt4 GUI ("VirtualBox"):
+ * UIWizardNewVMPageExpert class implementation
+ */
+
+/*
+ * Copyright (C) 2006-2012 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ */
+
+/* Global includes: */
+#include <QVBoxLayout>
+#include <QHBoxLayout>
+#include <QGroupBox>
+#include <QGridLayout>
+#include <QSpacerItem>
+#include <QLineEdit>
+#include <QLabel>
+#include <QRadioButton>
+
+/* Local includes: */
+#include "UIWizardNewVMPageExpert.h"
+#include "UIWizardNewVM.h"
+#include "UIIconPool.h"
+#include "UIMessageCenter.h"
+#include "VBoxOSTypeSelectorWidget.h"
+#include "VBoxGuestRAMSlider.h"
+#include "VBoxMediaComboBox.h"
+#include "QILineEdit.h"
+#include "QIToolButton.h"
+
+UIWizardNewVMPageExpert::UIWizardNewVMPageExpert()
+{
+    /* Create widgets: */
+    QVBoxLayout *pMainLayout = new QVBoxLayout(this);
+    {
+        pMainLayout->setContentsMargins(8, 6, 8, 6);
+        m_pNameCnt = new QGroupBox(this);
+        {
+            m_pNameCnt->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Fixed);
+            QHBoxLayout *pNameCntLayout = new QHBoxLayout(m_pNameCnt);
+            {
+                m_pNameEditor = new QLineEdit(m_pNameCnt);
+                pNameCntLayout->addWidget(m_pNameEditor);
+            }
+        }
+        m_pTypeCnt = new QGroupBox(this);
+        {
+            m_pTypeCnt->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Fixed);
+            QHBoxLayout *pTypeCntLayout = new QHBoxLayout(m_pTypeCnt);
+            {
+                m_pTypeSelector = new VBoxOSTypeSelectorWidget(m_pTypeCnt);
+                {
+                    m_pTypeSelector->activateLayout();
+                }
+                pTypeCntLayout->addWidget(m_pTypeSelector);
+            }
+        }
+        m_pMemoryCnt = new QGroupBox(this);
+        {
+            m_pMemoryCnt->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Fixed);
+            QGridLayout *pMemoryCntLayout = new QGridLayout(m_pMemoryCnt);
+            {
+                m_pRamSlider = new VBoxGuestRAMSlider(m_pMemoryCnt);
+                {
+                    m_pRamSlider->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);
+                    m_pRamSlider->setOrientation(Qt::Horizontal);
+                    m_pRamSlider->setTickPosition(QSlider::TicksBelow);
+                    m_pRamSlider->setValue(m_pTypeSelector->type().GetRecommendedRAM());
+                }
+                m_pRamEditor = new QILineEdit(m_pMemoryCnt);
+                {
+                    m_pRamEditor->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);
+                    m_pRamEditor->setFixedWidthByText("88888");
+                    m_pRamEditor->setAlignment(Qt::AlignRight);
+                    m_pRamEditor->setValidator(new QIntValidator(m_pRamSlider->minRAM(), m_pRamSlider->maxRAM(), this));
+                    m_pRamEditor->setText(QString::number(m_pTypeSelector->type().GetRecommendedRAM()));
+                }
+                m_pRamUnits = new QLabel(m_pMemoryCnt);
+                {
+                    m_pRamUnits->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Fixed);
+                }
+                m_pRamMin = new QLabel(m_pMemoryCnt);
+                {
+                    m_pRamMin->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Fixed);
+                }
+                QSpacerItem *m_pRamSpacer = new QSpacerItem(0, 0, QSizePolicy::Expanding);
+                m_pRamMax = new QLabel(m_pMemoryCnt);
+                {
+                    m_pRamMax->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Fixed);
+                }
+                pMemoryCntLayout->addWidget(m_pRamSlider, 0, 0, 1, 3);
+                pMemoryCntLayout->addWidget(m_pRamEditor, 0, 3);
+                pMemoryCntLayout->addWidget(m_pRamUnits, 0, 4);
+                pMemoryCntLayout->addWidget(m_pRamMin, 1, 0);
+                pMemoryCntLayout->addItem(m_pRamSpacer, 1, 1);
+                pMemoryCntLayout->addWidget(m_pRamMax, 1, 2);
+            }
+        }
+        m_pDiskCnt = new QGroupBox(this);
+        {
+            m_pDiskCnt->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Fixed);
+            m_pDiskCnt->setCheckable(true);
+            m_pDiskCnt->setChecked(true);
+            QGridLayout *pDiskCntLayout = new QGridLayout(m_pDiskCnt);
+            {
+                m_pDiskCreate = new QRadioButton(m_pDiskCnt);
+                {
+                    m_pDiskCreate->setChecked(true);
+                }
+                m_pDiskPresent = new QRadioButton(m_pDiskCnt);
+                QStyleOptionButton options;
+                options.initFrom(m_pDiskCreate);
+                int iWidth = m_pDiskCreate->style()->subElementRect(QStyle::SE_RadioButtonIndicator, &options, m_pDiskCreate).width() +
+                             m_pDiskCreate->style()->pixelMetric(QStyle::PM_RadioButtonLabelSpacing, &options, m_pDiskCreate) -
+                             pDiskCntLayout->spacing() - 1;
+                QSpacerItem *pSpacer = new QSpacerItem(iWidth, 0, QSizePolicy::Fixed, QSizePolicy::Fixed);
+                m_pDiskSelector = new VBoxMediaComboBox(m_pDiskCnt);
+                {
+                    m_pDiskSelector->setType(VBoxDefs::MediumType_HardDisk);
+                    m_pDiskSelector->repopulate();
+                }
+                m_pVMMButton = new QIToolButton(m_pDiskCnt);
+                {
+                    m_pVMMButton->setAutoRaise(true);
+                    m_pVMMButton->setIcon(UIIconPool::iconSet(":/select_file_16px.png", ":/select_file_dis_16px.png"));
+                }
+                pDiskCntLayout->addWidget(m_pDiskCreate, 0, 0, 1, 3);
+                pDiskCntLayout->addWidget(m_pDiskPresent, 1, 0, 1, 3);
+                pDiskCntLayout->addItem(pSpacer, 2, 0);
+                pDiskCntLayout->addWidget(m_pDiskSelector, 2, 1);
+                pDiskCntLayout->addWidget(m_pVMMButton, 2, 2);
+            }
+        }
+        pMainLayout->addWidget(m_pNameCnt);
+        pMainLayout->addWidget(m_pTypeCnt);
+        pMainLayout->addWidget(m_pMemoryCnt);
+        pMainLayout->addWidget(m_pDiskCnt);
+        pMainLayout->addStretch();
+        updateVirtualDiskSource();
+    }
+
+    /* Setup connections: */
+    connect(m_pNameEditor, SIGNAL(textChanged(const QString &)), this, SLOT(sltNameChanged(const QString &)));
+    connect(m_pTypeSelector, SIGNAL(osTypeChanged()), this, SLOT(sltOsTypeChanged()));
+    connect(m_pRamSlider, SIGNAL(valueChanged(int)), this, SLOT(sltRamSliderValueChanged(int)));
+    connect(m_pRamEditor, SIGNAL(textChanged(const QString &)), this, SLOT(sltRamEditorTextChanged(const QString &)));
+    connect(m_pDiskCnt, SIGNAL(toggled(bool)), this, SLOT(sltVirtualDiskSourceChanged()));
+    connect(m_pDiskCreate, SIGNAL(toggled(bool)), this, SLOT(sltVirtualDiskSourceChanged()));
+    connect(m_pDiskPresent, SIGNAL(toggled(bool)), this, SLOT(sltVirtualDiskSourceChanged()));
+    connect(m_pDiskSelector, SIGNAL(currentIndexChanged(int)), this, SLOT(sltVirtualDiskSourceChanged()));
+    connect(m_pVMMButton, SIGNAL(clicked()), this, SLOT(sltGetWithFileOpenDialog()));
+
+    /* Register classes: */
+    qRegisterMetaType<CMedium>();
+    /* Register fields: */
+    registerField("name*", m_pNameEditor);
+    registerField("type", m_pTypeSelector, "type", SIGNAL(osTypeChanged()));
+    registerField("machineFolder", this, "machineFolder");
+    registerField("machineBaseName", this, "machineBaseName");
+    registerField("ram", m_pRamSlider, "value", SIGNAL(valueChanged(int)));
+    registerField("virtualDisk", this, "virtualDisk");
+    registerField("virtualDiskId", this, "virtualDiskId");
+    registerField("virtualDiskLocation", this, "virtualDiskLocation");
+}
+
+void UIWizardNewVMPageExpert::sltNameChanged(const QString &strNewText)
+{
+    /* Call to base-class: */
+    onNameChanged(strNewText);
+
+    /* Fetch recommended RAM value: */
+    CGuestOSType type = m_pTypeSelector->type();
+    m_pRamSlider->setValue(type.GetRecommendedRAM());
+    m_pRamEditor->setText(QString::number(type.GetRecommendedRAM()));
+
+    /* Broadcast complete-change: */
+    emit completeChanged();
+}
+
+void UIWizardNewVMPageExpert::sltOsTypeChanged()
+{
+    /* Call to base-class: */
+    onOsTypeChanged();
+
+    /* Fetch recommended RAM value: */
+    CGuestOSType type = m_pTypeSelector->type();
+    m_pRamSlider->setValue(type.GetRecommendedRAM());
+    m_pRamEditor->setText(QString::number(type.GetRecommendedRAM()));
+
+    /* Broadcast complete-change: */
+    emit completeChanged();
+}
+
+void UIWizardNewVMPageExpert::sltRamSliderValueChanged(int iValue)
+{
+    /* Call to base-class: */
+    onRamSliderValueChanged(iValue);
+
+    /* Broadcast complete-change: */
+    emit completeChanged();
+}
+
+void UIWizardNewVMPageExpert::sltRamEditorTextChanged(const QString &strText)
+{
+    /* Call to base-class: */
+    onRamEditorTextChanged(strText);
+
+    /* Broadcast complete-change: */
+    emit completeChanged();
+}
+
+void UIWizardNewVMPageExpert::sltVirtualDiskSourceChanged()
+{
+    /* Call to base-class: */
+    updateVirtualDiskSource();
+
+    /* Broadcast complete-change: */
+    emit completeChanged();
+}
+
+void UIWizardNewVMPageExpert::sltGetWithFileOpenDialog()
+{
+    /* Call to base-class: */
+    getWithFileOpenDialog();
+}
+
+void UIWizardNewVMPageExpert::retranslateUi()
+{
+    /* Translate widgets: */
+    m_pNameCnt->setTitle(UIWizardNewVM::tr("&Name"));
+    m_pTypeCnt->setTitle(UIWizardNewVM::tr("OS &Type"));
+    m_pMemoryCnt->setTitle(UIWizardNewVM::tr("Base &Memory Size"));
+    m_pRamUnits->setText(VBoxGlobal::tr("MB", "size suffix MBytes=1024 KBytes"));
+    m_pRamMin->setText(QString("%1 %2").arg(m_pRamSlider->minRAM()).arg(VBoxGlobal::tr("MB", "size suffix MBytes=1024 KBytes")));
+    m_pRamMax->setText(QString("%1 %2").arg(m_pRamSlider->maxRAM()).arg(VBoxGlobal::tr("MB", "size suffix MBytes=1024 KBytes")));
+    m_pDiskCnt->setTitle(UIWizardNewVM::tr("Start-up &Disk"));
+    m_pDiskCreate->setText(UIWizardNewVM::tr("&Create new hard disk"));
+    m_pDiskPresent->setText(UIWizardNewVM::tr("&Use existing hard disk"));
+    m_pVMMButton->setToolTip(UIWizardNewVM::tr("Choose a virtual hard disk file..."));
+}
+
+void UIWizardNewVMPageExpert::initializePage()
+{
+    /* Translate page: */
+    retranslateUi();
+
+    /* 'Name' field should have focus initially: */
+    m_pNameEditor->setFocus();
+}
+
+void UIWizardNewVMPageExpert::cleanupPage()
+{
+    /* Call to base-class: */
+    ensureNewVirtualDiskDeleted();
+    cleanupMachineFolder();
+}
+
+bool UIWizardNewVMPageExpert::isComplete() const
+{
+    /* Make sure mandatory fields are complete,
+     * 'ram' field feats the bounds,
+     * 'virtualDisk' field feats the rules: */
+    return UIWizardPage::isComplete() &&
+           (m_pRamSlider->value() >= qMax(1, (int)m_pRamSlider->minRAM()) && m_pRamSlider->value() <= (int)m_pRamSlider->maxRAM()) &&
+           (!m_pDiskCnt->isChecked() || !m_pDiskPresent->isChecked() || !vboxGlobal().findMedium(m_pDiskSelector->id()).isNull());
+}
+
+bool UIWizardNewVMPageExpert::validatePage()
+{
+    /* Initial result: */
+    bool fResult = true;
+
+    /* Lock finish button: */
+    startProcessing();
+
+    /* Try to create machine folder: */
+    if (fResult)
+        fResult = createMachineFolder();
+
+    /* Try to assign boot virtual-disk: */
+    if (fResult)
+    {
+        /* Ensure there is no virtual-disk created yet: */
+        Assert(m_virtualDisk.isNull());
+        if (fResult)
+        {
+            if (!m_pDiskCnt->isChecked())
+            {
+                /* Ask user about disk-less machine: */
+                fResult = msgCenter().confirmHardDisklessMachine(this);
+            }
+            else if (m_pDiskCreate->isChecked())
+            {
+                /* Show the New Virtual Disk wizard if necessary: */
+                fResult = getWithNewVirtualDiskWizard();
+            }
+        }
+    }
+
+    /* Try to create VM: */
+    if (fResult)
+        fResult = qobject_cast<UIWizardNewVM*>(wizard())->createVM();
+
+    /* Unlock finish button: */
+    endProcessing();
+
+    /* Return result: */
+    return fResult;
+}
+
Index: /trunk/src/VBox/Frontends/VirtualBox/src/wizards/newvm/UIWizardNewVMPageExpert.h
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/wizards/newvm/UIWizardNewVMPageExpert.h	(revision 41021)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/wizards/newvm/UIWizardNewVMPageExpert.h	(revision 41021)
@@ -0,0 +1,81 @@
+/** @file
+ *
+ * VBox frontends: Qt4 GUI ("VirtualBox"):
+ * UIWizardNewVMPageExpert class declaration
+ */
+
+/*
+ * Copyright (C) 2006-2012 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ */
+
+#ifndef __UIWizardNewVMPageExpert_h__
+#define __UIWizardNewVMPageExpert_h__
+
+/* Local includes: */
+#include "UIWizardNewVMPageBasic1.h"
+#include "UIWizardNewVMPageBasic2.h"
+#include "UIWizardNewVMPageBasic3.h"
+#include "UIWizardNewVMPageBasic4.h"
+#include "UIWizardNewVMPageBasic5.h"
+
+/* Expert page of the New Virtual Machine wizard: */
+class UIWizardNewVMPageExpert : public UIWizardPage,
+                                public UIWizardNewVMPage1,
+                                public UIWizardNewVMPage2,
+                                public UIWizardNewVMPage3,
+                                public UIWizardNewVMPage4,
+                                public UIWizardNewVMPage5
+{
+    Q_OBJECT;
+    Q_PROPERTY(QString machineFolder READ machineFolder WRITE setMachineFolder);
+    Q_PROPERTY(QString machineBaseName READ machineBaseName WRITE setMachineBaseName);
+    Q_PROPERTY(CMedium virtualDisk READ virtualDisk WRITE setVirtualDisk);
+    Q_PROPERTY(QString virtualDiskId READ virtualDiskId WRITE setVirtualDiskId);
+    Q_PROPERTY(QString virtualDiskLocation READ virtualDiskLocation WRITE setVirtualDiskLocation);
+
+public:
+
+    /* Constructor: */
+    UIWizardNewVMPageExpert();
+
+protected:
+
+    /* Wrapper to access 'this' from base part: */
+    UIWizardPage* thisImp() { return this; }
+    /* Wrapper to access 'wizard-field' from base part: */
+    QVariant fieldImp(const QString &strFieldName) const { return UIWizardPage::field(strFieldName); }
+
+private slots:
+
+    /* Handlers: */
+    void sltNameChanged(const QString &strNewText);
+    void sltOsTypeChanged();
+    void sltRamSliderValueChanged(int iValue);
+    void sltRamEditorTextChanged(const QString &strText);
+    void sltVirtualDiskSourceChanged();
+    void sltGetWithFileOpenDialog();
+
+private:
+
+    /* Translation stuff: */
+    void retranslateUi();
+
+    /* Prepare stuff: */
+    void initializePage();
+    void cleanupPage();
+
+    /* Validation stuff: */
+    bool isComplete() const;
+    bool validatePage();
+};
+
+#endif // __UIWizardNewVMPageExpert_h__
+
