Index: /trunk/src/VBox/Frontends/VirtualBox/src/manager/UIVirtualBoxManager.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/manager/UIVirtualBoxManager.cpp	(revision 91367)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/manager/UIVirtualBoxManager.cpp	(revision 91368)
@@ -911,9 +911,9 @@
     /* Use the "safe way" to open stack of Mac OS X Sheets: */
     QWidget *pWizardParent = windowManager().realParentWindow(this);
-    UISafePointerWizard pWizard = new UIWizardExportApp(pWizardParent, names,
-                                                        pAction &&
-                                                        pAction == actionPool()->action(UIActionIndexMN_M_Machine_S_ExportToOCI));
+    UINativeWizardPointer pWizard = new UIWizardExportApp(pWizardParent,
+                                                          names,
+                                                          pAction &&
+                                                          pAction == actionPool()->action(UIActionIndexMN_M_Machine_S_ExportToOCI));
     windowManager().registerNewParent(pWizard, pWizardParent);
-    pWizard->prepare();
     pWizard->exec();
     delete pWizard;
Index: /trunk/src/VBox/Frontends/VirtualBox/src/wizards/exportappliance/UIWizardExportApp.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/wizards/exportappliance/UIWizardExportApp.cpp	(revision 91367)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/wizards/exportappliance/UIWizardExportApp.cpp	(revision 91368)
@@ -17,6 +17,6 @@
 
 /* Qt includes: */
-#include <QAbstractButton>
 #include <QFileInfo>
+#include <QPushButton>
 #include <QVariant>
 
@@ -35,34 +35,189 @@
 /* COM includes: */
 #include "CAppliance.h"
-
-/* COM includes: */
 #include "CVFSExplorer.h"
 
 
 UIWizardExportApp::UIWizardExportApp(QWidget *pParent,
-                                     const QStringList &selectedVMNames /* = QStringList() */,
+                                     const QStringList &predefinedMachineNames /* = QStringList() */,
                                      bool fFastTraverToExportOCI /* = false */)
-    : UIWizard(pParent, WizardType_ExportAppliance)
-    , m_selectedVMNames(selectedVMNames)
+    : UINativeWizard(pParent, WizardType_ExportAppliance, WizardMode_Auto,
+                     fFastTraverToExportOCI ? "cloud-export-oci" : "ovf")
+    , m_predefinedMachineNames(predefinedMachineNames)
     , m_fFastTraverToExportOCI(fFastTraverToExportOCI)
+    , m_fFormatCloudOne(false)
 {
 #ifndef VBOX_WS_MAC
     /* Assign watermark: */
-    assignWatermark(":/wizard_ovf_export.png");
+    setPixmapName(":/wizard_ovf_export.png");
 #else
     /* Assign background image: */
-    assignBackground(":/wizard_ovf_export_bg.png");
+    setPixmapName(":/wizard_ovf_export_bg.png");
 #endif
 }
 
+QStringList UIWizardExportApp::machineNames() const
+{
+    return m_machineNames;
+}
+
+void UIWizardExportApp::setMachineNames(const QStringList &names)
+{
+    m_machineNames = names;
+}
+
+QList<QUuid> UIWizardExportApp::machineIDs() const
+{
+    return m_machineIDs;
+}
+
+void UIWizardExportApp::setMachineIDs(const QList<QUuid> &ids)
+{
+    m_machineIDs = ids;
+}
+
+QString UIWizardExportApp::format() const
+{
+    return m_strFormat;
+}
+
+void UIWizardExportApp::setFormat(const QString &strFormat)
+{
+    m_strFormat = strFormat;
+}
+
+bool UIWizardExportApp::isFormatCloudOne() const
+{
+    return m_fFormatCloudOne;
+}
+
+void UIWizardExportApp::setFormatCloudOne(bool fCloudOne)
+{
+    m_fFormatCloudOne = fCloudOne;
+}
+
+QString UIWizardExportApp::path() const
+{
+    return m_strPath;
+}
+
+void UIWizardExportApp::setPath(const QString &strPath)
+{
+    m_strPath = strPath;
+}
+
+MACAddressExportPolicy UIWizardExportApp::macAddressExportPolicy() const
+{
+    return m_enmMACAddressExportPolicy;
+}
+
+void UIWizardExportApp::setMACAddressExportPolicy(MACAddressExportPolicy enmPolicy)
+{
+    m_enmMACAddressExportPolicy = enmPolicy;
+}
+
+bool UIWizardExportApp::isManifestSelected() const
+{
+    return m_fManifestSelected;
+}
+
+void UIWizardExportApp::setManifestSelected(bool fSelected)
+{
+    m_fManifestSelected = fSelected;
+}
+
+bool UIWizardExportApp::isIncludeISOsSelected() const
+{
+    return m_fIncludeISOsSelected;
+}
+
+void UIWizardExportApp::setIncludeISOsSelected(bool fSelected)
+{
+    m_fIncludeISOsSelected = fSelected;
+}
+
+CAppliance UIWizardExportApp::localAppliance()
+{
+    return m_comLocalAppliance;
+}
+
+void UIWizardExportApp::setLocalAppliance(const CAppliance &comAppliance)
+{
+    m_comLocalAppliance = comAppliance;
+}
+
+QString UIWizardExportApp::profileName() const
+{
+    return m_strProfileName;
+}
+
+void UIWizardExportApp::setProfileName(const QString &strName)
+{
+    m_strProfileName = strName;
+}
+
+CAppliance UIWizardExportApp::cloudAppliance()
+{
+    return m_comCloudAppliance;
+}
+
+void UIWizardExportApp::setCloudAppliance(const CAppliance &comAppliance)
+{
+    m_comCloudAppliance = comAppliance;
+}
+
+CCloudClient UIWizardExportApp::cloudClient()
+{
+    return m_comCloudClient;
+}
+
+void UIWizardExportApp::setCloudClient(const CCloudClient &comClient)
+{
+    m_comCloudClient = comClient;
+}
+
+CVirtualSystemDescription UIWizardExportApp::vsd()
+{
+    return m_comVsd;
+}
+
+void UIWizardExportApp::setVsd(const CVirtualSystemDescription &comDescription)
+{
+    m_comVsd = comDescription;
+}
+
+CVirtualSystemDescriptionForm UIWizardExportApp::vsdExportForm()
+{
+    return m_comVsdExportForm;
+}
+
+void UIWizardExportApp::setVsdExportForm(const CVirtualSystemDescriptionForm &comForm)
+{
+    m_comVsdExportForm = comForm;
+}
+
+CloudExportMode UIWizardExportApp::cloudExportMode() const
+{
+    return m_enmCloudExportMode;
+}
+
+void UIWizardExportApp::setCloudExportMode(const CloudExportMode &enmMode)
+{
+    m_enmCloudExportMode = enmMode;
+}
+
+void UIWizardExportApp::goForward()
+{
+    wizardButton(WizardButtonType_Next)->click();
+}
+
 QString UIWizardExportApp::uri(bool fWithFile) const
 {
     /* For Cloud formats: */
-    if (field("isFormatCloudOne").toBool())
-        return QString("%1://").arg(field("providerShortName").toString());
+    if (isFormatCloudOne())
+        return QString("%1://").arg(format());
     else
     {
         /* Prepare storage path: */
-        QString strPath = field("path").toString();
+        QString strPath = path();
         /* Append file name if requested: */
         if (!fWithFile)
@@ -80,9 +235,8 @@
 {
     /* Check whether there was cloud target selected: */
-    const bool fIsFormatCloudOne = field("isFormatCloudOne").toBool();
-    if (fIsFormatCloudOne)
+    if (isFormatCloudOne())
     {
         /* Get appliance: */
-        CAppliance comAppliance = field("cloudAppliance").value<CAppliance>();
+        CAppliance comAppliance = cloudAppliance();
         AssertReturn(comAppliance.isNotNull(), false);
 
@@ -93,5 +247,5 @@
     {
         /* Get appliance: */
-        CAppliance comAppliance = field("localAppliance").value<CAppliance>();
+        CAppliance comAppliance = localAppliance();
         AssertReturn(comAppliance.isNotNull(), false);
 
@@ -101,5 +255,5 @@
 
         /* Compose a list of all required files: */
-        QFileInfo fi(field("path").toString());
+        QFileInfo fi(path());
         QVector<QString> files;
 
@@ -111,5 +265,5 @@
         {
             /* Add manifest file if requested: */
-            if (field("manifestSelected").toBool())
+            if (isManifestSelected())
                 files << fi.baseName() + ".mf";
 
@@ -174,26 +328,5 @@
 }
 
-void UIWizardExportApp::sltCurrentIdChanged(int iId)
-{
-    /* Call to base-class: */
-    UIWizard::sltCurrentIdChanged(iId);
-
-    /* Enable 2nd button (Reset to Defaults) for 3rd and Expert pages only! */
-    setOption(QWizard::HaveCustomButton2,    (mode() == WizardMode_Basic && iId == Page3)
-                                          || (mode() == WizardMode_Expert && iId == PageExpert));
-}
-
-void UIWizardExportApp::retranslateUi()
-{
-    /* Call to base-class: */
-    UIWizard::retranslateUi();
-
-    /* Translate wizard: */
-    setWindowTitle(tr("Export Virtual Appliance"));
-    setButtonText(QWizard::CustomButton2, tr("Restore Defaults"));
-    setButtonText(QWizard::FinishButton, tr("Export"));
-}
-
-void UIWizardExportApp::prepare()
+void UIWizardExportApp::populatePages()
 {
     /* Create corresponding pages: */
@@ -202,12 +335,12 @@
         case WizardMode_Basic:
         {
-            setPage(Page1, new UIWizardExportAppPageBasic1(m_selectedVMNames));
-            setPage(Page2, new UIWizardExportAppPageBasic2(m_fFastTraverToExportOCI));
-            setPage(Page3, new UIWizardExportAppPageBasic3);
+            addPage(new UIWizardExportAppPageBasic1(m_predefinedMachineNames, m_fFastTraverToExportOCI));
+            addPage(new UIWizardExportAppPageBasic2(m_fFastTraverToExportOCI));
+            addPage(new UIWizardExportAppPageBasic3);
             break;
         }
         case WizardMode_Expert:
         {
-            setPage(PageExpert, new UIWizardExportAppPageExpert(m_selectedVMNames, m_fFastTraverToExportOCI));
+            addPage(new UIWizardExportAppPageExpert(m_predefinedMachineNames, m_fFastTraverToExportOCI));
             break;
         }
@@ -218,18 +351,15 @@
         }
     }
-
-    if (!m_fFastTraverToExportOCI)
-        enableHelpButton("ovf");
-    else
-        enableHelpButton("cloud-export-oci");
-
+}
+
+void UIWizardExportApp::retranslateUi()
+{
     /* Call to base-class: */
-    UIWizard::prepare();
-
-    /* Now, when we are ready, we can
-     * fast traver to page 2 if requested: */
-    if (   mode() == WizardMode_Basic
-        && m_fFastTraverToExportOCI)
-        button(QWizard::NextButton)->click();
+    UINativeWizard::retranslateUi();
+
+    /* Translate wizard: */
+    setWindowTitle(tr("Export Virtual Appliance"));
+    /// @todo implement this?
+    //setButtonText(QWizard::FinishButton, tr("Export"));
 }
 
@@ -290,5 +420,5 @@
         /* Prepare export options: */
         QVector<KExportOptions> options;
-        switch (field("macAddressExportPolicy").value<MACAddressExportPolicy>())
+        switch (macAddressExportPolicy())
         {
             case MACAddressExportPolicy_StripAllNonNATMACs: options.append(KExportOptions_StripAllNonNATMACs); break;
@@ -296,11 +426,11 @@
             default: break;
         }
-        if (field("manifestSelected").toBool())
+        if (isManifestSelected())
             options.append(KExportOptions_CreateManifest);
-        if (field("includeISOsSelected").toBool())
+        if (isIncludeISOsSelected())
             options.append(KExportOptions_ExportDVDImages);
 
         /* Is this VM being exported to cloud? */
-        if (field("isFormatCloudOne").toBool())
+        if (isFormatCloudOne())
         {
             /* We can have wizard and it's result
@@ -308,13 +438,16 @@
             int iWizardResult = -1;
 
-            switch (field("cloudExportMode").value<CloudExportMode>())
+            switch (cloudExportMode())
             {
                 case CloudExportMode_AskThenExport:
                 {
                     /* Get the required parameters to init short wizard mode: */
-                    CCloudClient comClient = field("client").value<CCloudClient>();
-                    CVirtualSystemDescription comDescription = field("vsd").value<CVirtualSystemDescription>();
+                    CCloudClient comClient = cloudClient();
+                    CVirtualSystemDescription comDescription = vsd();
                     /* Create and run wizard as modal dialog, but prevent final step: */
-                    pNewCloudVMWizard = new UIWizardNewCloudVM(this, QString() /** @todo pass proper full group name! */, comClient, comDescription, mode());
+                    QWidget *pWizardParent = windowManager().realParentWindow(this);
+                    const QString strGroupName = QString("/%1/%2").arg(format(), profileName());
+                    pNewCloudVMWizard = new UIWizardNewCloudVM(pWizardParent, strGroupName, comClient, comDescription, mode());
+                    windowManager().registerNewParent(pNewCloudVMWizard, pWizardParent);
                     pNewCloudVMWizard->setFinalStepPrevented(true);
                     iWizardResult = pNewCloudVMWizard->exec();
@@ -331,5 +464,5 @@
 
             /* Prepare Export VM progress: */
-            CProgress comProgress = comAppliance.Write(field("format").toString(), options, uri());
+            CProgress comProgress = comAppliance.Write(format(), options, uri());
             if (!comAppliance.isOk())
             {
@@ -353,5 +486,5 @@
             iWizardResult = -1;
 
-            switch (field("cloudExportMode").value<CloudExportMode>())
+            switch (cloudExportMode())
             {
                 case CloudExportMode_AskThenExport:
@@ -368,9 +501,10 @@
                 {
                     /* Get the required parameters to init short wizard mode: */
-                    CCloudClient comClient = field("client").value<CCloudClient>();
-                    CVirtualSystemDescription comDescription = field("vsd").value<CVirtualSystemDescription>();
+                    CCloudClient comClient = cloudClient();
+                    CVirtualSystemDescription comDescription = vsd();
                     /* Create and run short wizard mode as modal dialog: */
                     QWidget *pWizardParent = windowManager().realParentWindow(this);
-                    pNewCloudVMWizard = new UIWizardNewCloudVM(pWizardParent, QString() /** @todo pass proper full group name! */, comClient, comDescription, mode());
+                    const QString strGroupName = QString("/%1/%2").arg(format(), profileName());
+                    pNewCloudVMWizard = new UIWizardNewCloudVM(pWizardParent, strGroupName, comClient, comDescription, mode());
                     windowManager().registerNewParent(pNewCloudVMWizard, pWizardParent);
                     iWizardResult = pNewCloudVMWizard->exec();
@@ -391,5 +525,5 @@
             /* Export appliance: */
             UINotificationProgressApplianceExport *pNotification = new UINotificationProgressApplianceExport(comAppliance,
-                                                                                                             field("format").toString(),
+                                                                                                             format(),
                                                                                                              options,
                                                                                                              uri());
Index: /trunk/src/VBox/Frontends/VirtualBox/src/wizards/exportappliance/UIWizardExportApp.h
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/wizards/exportappliance/UIWizardExportApp.h	(revision 91367)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/wizards/exportappliance/UIWizardExportApp.h	(revision 91368)
@@ -23,11 +23,35 @@
 
 /* GUI includes: */
-#include "UIWizard.h"
-
-/* Forward declarations: */
-class CAppliance;
+#include "UINativeWizard.h"
+
+/* COM includes: */
+#include "COMEnums.h"
+#include "CAppliance.h"
+#include "CCloudClient.h"
+#include "CVirtualSystemDescription.h"
+#include "CVirtualSystemDescriptionForm.h"
+
+/** MAC address export policies. */
+enum MACAddressExportPolicy
+{
+    MACAddressExportPolicy_KeepAllMACs,
+    MACAddressExportPolicy_StripAllNonNATMACs,
+    MACAddressExportPolicy_StripAllMACs,
+    MACAddressExportPolicy_MAX
+};
+Q_DECLARE_METATYPE(MACAddressExportPolicy);
+
+/** Cloud export option modes. */
+enum CloudExportMode
+{
+    CloudExportMode_Invalid,
+    CloudExportMode_AskThenExport,
+    CloudExportMode_ExportThenAsk,
+    CloudExportMode_DoNotAsk
+};
+Q_DECLARE_METATYPE(CloudExportMode);
 
 /** Export Appliance wizard. */
-class UIWizardExportApp : public UIWizard
+class UIWizardExportApp : public UINativeWizard
 {
     Q_OBJECT;
@@ -35,53 +59,176 @@
 public:
 
-    /** Basic page IDs. */
-    enum
-    {
-        Page1,
-        Page2,
-        Page3
-    };
-
-    /** Expert page IDs. */
-    enum
-    {
-        PageExpert
-    };
-
-    /** Constructs export appliance wizard passing @a pParent to the base-class.
-      * @param  selectedVMNames  Brings the names of VMs to be exported. */
+    /** Constructs Export Appliance wizard passing @a pParent to the base-class.
+      * @param  predefinedMachineNames  Brings the predefined list of machine names.
+      * @param  fFastTraverToExportOCI  Brings whether wizard should start with OCI target. */
     UIWizardExportApp(QWidget *pParent,
-                      const QStringList &selectedVMNames = QStringList(),
+                      const QStringList &predefinedMachineNames = QStringList(),
                       bool fFastTraverToExportOCI = false);
 
-    /** Composes universal resource identifier.
-      * @param  fWithFile  Brings whether uri should include file name as well. */
-    QString uri(bool fWithFile = true) const;
-
-    /** Exports Appliance. */
-    bool exportAppliance();
-
-protected slots:
-
-    /** Handles page change to @a iId. */
-    virtual void sltCurrentIdChanged(int iId) /* override final */;
+    /** @name Common fields.
+      * @{ */
+        /** Returns a list of machine names. */
+        QStringList machineNames() const;
+        /** Defines a list of machine @a names. */
+        void setMachineNames(const QStringList &names);
+        /** Returns a list of machine IDs. */
+        QList<QUuid> machineIDs() const;
+        /** Defines a list of machine @a ids. */
+        void setMachineIDs(const QList<QUuid> &ids);
+
+        /** Returns format. */
+        QString format() const;
+        /** Defines @a strFormat. */
+        void setFormat(const QString &strFormat);
+
+        /** Returns whether format is cloud one. */
+        bool isFormatCloudOne() const;
+        /** Defines whether format is @a fCloudOne. */
+        void setFormatCloudOne(bool fCloudOne);
+    /** @} */
+
+    /** @name Local export fields.
+      * @{ */
+        /** Returns path. */
+        QString path() const;
+        /** Defines @a strPath. */
+        void setPath(const QString &strPath);
+
+        /** Returns MAC address export policy. */
+        MACAddressExportPolicy macAddressExportPolicy() const;
+        /** Defines MAC address export @a enmPolicy. */
+        void setMACAddressExportPolicy(MACAddressExportPolicy enmPolicy);
+
+        /** Returns whether manifest is selected. */
+        bool isManifestSelected() const;
+        /** Defines whether manifest is @a fSelected. */
+        void setManifestSelected(bool fSelected);
+
+        /** Returns whether include ISOs is selected. */
+        bool isIncludeISOsSelected() const;
+        /** Defines whether include ISOs is @a fSelected. */
+        void setIncludeISOsSelected(bool fSelected);
+
+        /** Returns local appliance object. */
+        CAppliance localAppliance();
+        /** Defines local @a comAppliance object. */
+        void setLocalAppliance(const CAppliance &comAppliance);
+    /** @} */
+
+    /** @name Cloud export fields.
+      * @{ */
+        /** Returns profile name. */
+        QString profileName() const;
+        /** Defines profile @a strName. */
+        void setProfileName(const QString &strName);
+
+        /** Returns cloud appliance object. */
+        CAppliance cloudAppliance();
+        /** Defines cloud @a comAppliance object. */
+        void setCloudAppliance(const CAppliance &comAppliance);
+
+        /** Returns cloud client object. */
+        CCloudClient cloudClient();
+        /** Defines cloud @a comClient object. */
+        void setCloudClient(const CCloudClient &comClient);
+
+        /** Returns virtual system description object. */
+        CVirtualSystemDescription vsd();
+        /** Defines virtual system @a comDescription object. */
+        void setVsd(const CVirtualSystemDescription &comDescription);
+
+        /** Returns virtual system description export form object. */
+        CVirtualSystemDescriptionForm vsdExportForm();
+        /** Defines virtual system description export @a comForm object. */
+        void setVsdExportForm(const CVirtualSystemDescriptionForm &comForm);
+
+        /** Returns cloud export mode. */
+        CloudExportMode cloudExportMode() const;
+        /** Defines cloud export @a enmMode. */
+        void setCloudExportMode(const CloudExportMode &enmMode);
+    /** @} */
+
+    /** @name Auxiliary stuff.
+      * @{ */
+        /** Goes forward. Required for fast travel to next page. */
+        void goForward();
+
+        /** Composes universal resource identifier.
+          * @param  fWithFile  Brings whether uri should include file name as well. */
+        QString uri(bool fWithFile = true) const;
+
+        /** Exports Appliance. */
+        bool exportAppliance();
+    /** @} */
 
 protected:
 
-    /** Handles translation event. */
-    virtual void retranslateUi() /* override final */;
-
-    /** Prepares all. */
-    virtual void prepare() /* override final */;
+    /** @name Virtual stuff.
+      * @{ */
+        /** Populates pages. */
+        virtual void populatePages() /* override final */;
+
+        /** Handles translation event. */
+        virtual void retranslateUi() /* override final */;
+    /** @} */
 
 private:
 
-    /** Exports VMs enumerated in @a comAppliance. */
-    bool exportVMs(CAppliance &comAppliance);
-
-    /** Holds the names of VMs to be exported. */
-    QStringList  m_selectedVMNames;
-    /** Holds whether we should fast travel to page 2. */
-    bool         m_fFastTraverToExportOCI;
+    /** @name Auxiliary stuff.
+      * @{ */
+        /** Exports VMs enumerated in @a comAppliance. */
+        bool exportVMs(CAppliance &comAppliance);
+    /** @} */
+
+    /** @name Arguments.
+      * @{ */
+        /** Holds the predefined list of machine names. */
+        QStringList  m_predefinedMachineNames;
+        /** Holds whether we should fast travel to page 2. */
+        bool         m_fFastTraverToExportOCI;
+    /** @} */
+
+    /** @name Common fields.
+      * @{ */
+        /** Holds the list of machine names. */
+        QStringList   m_machineNames;
+        /** Holds the list of machine IDs. */
+        QList<QUuid>  m_machineIDs;
+
+        /** Holds the format. */
+        QString  m_strFormat;
+        /** Holds whether format is cloud one. */
+        bool     m_fFormatCloudOne;
+    /** @} */
+
+    /** @name Local export fields.
+      * @{ */
+        /** Holds the path. */
+        QString                 m_strPath;
+        /** Holds the MAC address export policy. */
+        MACAddressExportPolicy  m_enmMACAddressExportPolicy;
+        /** Holds whether manifest is selected. */
+        bool                    m_fManifestSelected;
+        /** Holds whether ISOs are included. */
+        bool                    m_fIncludeISOsSelected;
+        /** Holds local appliance object. */
+        CAppliance              m_comLocalAppliance;
+    /** @} */
+
+    /** @name Cloud export fields.
+      * @{ */
+        /** Holds profile name. */
+        QString                        m_strProfileName;
+        /** Holds cloud appliance object. */
+        CAppliance                     m_comCloudAppliance;
+        /** Returns cloud client object. */
+        CCloudClient                   m_comCloudClient;
+        /** Returns virtual system description object. */
+        CVirtualSystemDescription      m_comVsd;
+        /** Returns virtual system description export form object. */
+        CVirtualSystemDescriptionForm  m_comVsdExportForm;
+        /** Returns cloud export mode. */
+        CloudExportMode                m_enmCloudExportMode;
+    /** @} */
 };
 
Index: /trunk/src/VBox/Frontends/VirtualBox/src/wizards/exportappliance/UIWizardExportAppPageBasic1.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/wizards/exportappliance/UIWizardExportAppPageBasic1.cpp	(revision 91367)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/wizards/exportappliance/UIWizardExportAppPageBasic1.cpp	(revision 91368)
@@ -21,5 +21,4 @@
 
 /* GUI includes: */
-#include "QILabelSeparator.h"
 #include "QIRichTextLabel.h"
 #include "UICommon.h"
@@ -32,4 +31,7 @@
 #include "CMachine.h"
 
+/* Namespaces: */
+using namespace UIWizardExportAppPage1;
+
 
 /** QListWidgetItem subclass for Export Appliance wizard VM list. */
@@ -41,7 +43,7 @@
       * @param  strUuid       Brings the machine ID.
       * @param  fInSaveState  Brings whether machine is in Saved state. */
-    UIVMListWidgetItem(QPixmap &pixIcon, QString &strText, QUuid aUuid, bool fInSaveState, QListWidget *pParent)
+    UIVMListWidgetItem(QPixmap &pixIcon, QString &strText, QUuid uUuid, bool fInSaveState, QListWidget *pParent)
         : QListWidgetItem(pixIcon, strText, pParent)
-        , m_uUuid(aUuid)
+        , m_uUuid(uUuid)
         , m_fInSaveState(fInSaveState)
     {}
@@ -61,7 +63,7 @@
 
     /** Holds the machine ID. */
-    QUuid    m_uUuid;
+    QUuid  m_uUuid;
     /** Holds whether machine is in Saved state. */
-    bool     m_fInSaveState;
+    bool   m_fInSaveState;
 };
 
@@ -71,12 +73,8 @@
 *********************************************************************************************************************************/
 
-UIWizardExportAppPage1::UIWizardExportAppPage1()
-{
-}
-
-void UIWizardExportAppPage1::populateVMSelectorItems(const QStringList &selectedVMNames)
+void UIWizardExportAppPage1::populateVMItems(QListWidget *pVMSelector, const QStringList &selectedVMNames)
 {
     /* Add all VM items into VM selector: */
-    foreach (const CMachine &machine, uiCommon().virtualBox().GetMachines())
+    foreach (const CMachine &comMachine, uiCommon().virtualBox().GetMachines())
     {
         QPixmap pixIcon;
@@ -85,38 +83,36 @@
         bool fInSaveState = false;
         bool fEnabled = false;
-        const QStyle *pStyle = QApplication::style();
-        const int iIconMetric = pStyle->pixelMetric(QStyle::PM_SmallIconSize);
-        if (machine.GetAccessible())
-        {
-            pixIcon = generalIconPool().userMachinePixmapDefault(machine);
+        const int iIconMetric = QApplication::style()->pixelMetric(QStyle::PM_SmallIconSize);
+        if (comMachine.GetAccessible())
+        {
+            pixIcon = generalIconPool().userMachinePixmapDefault(comMachine);
             if (pixIcon.isNull())
-                pixIcon = generalIconPool().guestOSTypePixmapDefault(machine.GetOSTypeId());
-            strName = machine.GetName();
-            uUuid = machine.GetId();
-            fEnabled = machine.GetSessionState() == KSessionState_Unlocked;
-            fInSaveState = machine.GetState() == KMachineState_Saved || machine.GetState() == KMachineState_AbortedSaved;
+                pixIcon = generalIconPool().guestOSTypePixmapDefault(comMachine.GetOSTypeId());
+            strName = comMachine.GetName();
+            uUuid = comMachine.GetId();
+            fEnabled = comMachine.GetSessionState() == KSessionState_Unlocked;
+            fInSaveState = comMachine.GetState() == KMachineState_Saved || comMachine.GetState() == KMachineState_AbortedSaved;
         }
         else
         {
-            QString settingsFile = machine.GetSettingsFilePath();
-            QFileInfo fi(settingsFile);
+            QFileInfo fi(comMachine.GetSettingsFilePath());
             strName = UICommon::hasAllowedExtension(fi.completeSuffix(), VBoxFileExts) ? fi.completeBaseName() : fi.fileName();
             pixIcon = QPixmap(":/os_other.png").scaled(iIconMetric, iIconMetric, Qt::IgnoreAspectRatio, Qt::SmoothTransformation);
         }
-        QListWidgetItem *pItem = new UIVMListWidgetItem(pixIcon, strName, uUuid, fInSaveState, m_pVMSelector);
+        QListWidgetItem *pItem = new UIVMListWidgetItem(pixIcon, strName, uUuid, fInSaveState, pVMSelector);
         if (!fEnabled)
             pItem->setFlags(Qt::ItemFlags());
-        m_pVMSelector->addItem(pItem);
-    }
-    m_pVMSelector->sortItems();
+        pVMSelector->addItem(pItem);
+    }
+    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);
+    foreach (const QString &strSelectedVMName, selectedVMNames)
+    {
+        const QList<QListWidgetItem*> list = pVMSelector->findItems(strSelectedVMName, Qt::MatchExactly);
         if (list.size() > 0)
         {
-            if (m_pVMSelector->selectedItems().isEmpty())
-                m_pVMSelector->setCurrentItem(list.first());
+            if (pVMSelector->selectedItems().isEmpty())
+                pVMSelector->setCurrentItem(list.first());
             else
                 list.first()->setSelected(true);
@@ -125,24 +121,32 @@
 }
 
-QStringList UIWizardExportAppPage1::machineNames() const
+void UIWizardExportAppPage1::refreshSavedMachines(QStringList &savedMachines, QListWidget *pVMSelector)
+{
+    savedMachines.clear();
+    foreach (QListWidgetItem *pItem, pVMSelector->selectedItems())
+        if (static_cast<UIVMListWidgetItem*>(pItem)->isInSaveState())
+            savedMachines << pItem->text();
+}
+
+QStringList UIWizardExportAppPage1::machineNames(QListWidget *pVMSelector)
 {
     /* Prepare list: */
-    QStringList machineNames;
+    QStringList names;
     /* Iterate over all the selected items: */
-    foreach (QListWidgetItem *pItem, m_pVMSelector->selectedItems())
-        machineNames << pItem->text();
+    foreach (QListWidgetItem *pItem, pVMSelector->selectedItems())
+        names << pItem->text();
     /* Return result list: */
-    return machineNames;
-}
-
-QList<QUuid> UIWizardExportAppPage1::machineIDs() const
+    return names;
+}
+
+QList<QUuid> UIWizardExportAppPage1::machineIDs(QListWidget *pVMSelector)
 {
     /* Prepare list: */
-    QList<QUuid> machineIDs;
+    QList<QUuid> ids;
     /* Iterate over all the selected items: */
-    foreach (QListWidgetItem *pItem, m_pVMSelector->selectedItems())
-        machineIDs.append(static_cast<UIVMListWidgetItem*>(pItem)->uuid());
+    foreach (QListWidgetItem *pItem, pVMSelector->selectedItems())
+        ids.append(static_cast<UIVMListWidgetItem*>(pItem)->uuid());
     /* Return result list: */
-    return machineIDs;
+    return ids;
 }
 
@@ -152,39 +156,37 @@
 *********************************************************************************************************************************/
 
-UIWizardExportAppPageBasic1::UIWizardExportAppPageBasic1(const QStringList &selectedVMNames)
-{
-    /* Create main layout: */
-    QVBoxLayout *pMainLayout = new QVBoxLayout(this);
-    if (pMainLayout)
-    {
-        /* Create label: */
-        m_pLabel = new QIRichTextLabel;
-        if (m_pLabel)
-        {
-            /* Add into layout: */
-            pMainLayout->addWidget(m_pLabel);
-        }
-
-        /* Create VM selector: */
-        m_pVMSelector = new QListWidget;
+UIWizardExportAppPageBasic1::UIWizardExportAppPageBasic1(const QStringList &selectedVMNames, bool fFastTravelToNextPage)
+    : m_selectedVMNames(selectedVMNames)
+    , m_fFastTravelToNextPage(fFastTravelToNextPage)
+    , m_pLabelMain(0)
+    , m_pVMSelector(0)
+{
+    /* Prepare main layout: */
+    QVBoxLayout *pLayoutMain = new QVBoxLayout(this);
+    if (pLayoutMain)
+    {
+        /* Prepare main label: */
+        m_pLabelMain = new QIRichTextLabel(this);
+        if (m_pLabelMain)
+            pLayoutMain->addWidget(m_pLabelMain);
+
+        /* Prepare VM selector: */
+        m_pVMSelector = new QListWidget(this);
         if (m_pVMSelector)
         {
             m_pVMSelector->setAlternatingRowColors(true);
             m_pVMSelector->setSelectionMode(QAbstractItemView::ExtendedSelection);
-
-            /* Add into layout: */
-            pMainLayout->addWidget(m_pVMSelector);
-        }
-    }
-
-    /* Populate VM selector items: */
-    populateVMSelectorItems(selectedVMNames);
+            pLayoutMain->addWidget(m_pVMSelector);
+        }
+    }
 
     /* Setup connections: */
-    connect(m_pVMSelector, &QListWidget::itemSelectionChanged, this, &UIWizardExportAppPageBasic1::completeChanged);
-
-    /* Register fields: */
-    registerField("machineNames", this, "machineNames");
-    registerField("machineIDs", this, "machineIDs");
+    connect(m_pVMSelector, &QListWidget::itemSelectionChanged,
+            this, &UIWizardExportAppPageBasic1::sltHandleVMItemSelectionChanged);
+}
+
+UIWizardExportApp *UIWizardExportAppPageBasic1::wizard() const
+{
+    return qobject_cast<UIWizardExportApp*>(UINativeWizardPage::wizard());
 }
 
@@ -195,34 +197,42 @@
 
     /* Translate widgets: */
-    m_pLabel->setText(UIWizardExportApp::tr("<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>"));
+    m_pLabelMain->setText(UIWizardExportApp::tr("<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>"));
 }
 
 void UIWizardExportAppPageBasic1::initializePage()
 {
+    /* Populate VM items: */
+    populateVMItems(m_pVMSelector, m_selectedVMNames);
     /* Translate page: */
     retranslateUi();
+
+    /* Now, when we are ready, we can
+     * fast traver to page 2 if requested: */
+    if (m_fFastTravelToNextPage)
+        wizard()->goForward();
 }
 
 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;
 
+    /* There should be at least one VM selected: */
+    fResult = wizard()->machineNames().size() > 0;
+
+    /* Return result: */
+    return fResult;
+}
+
+bool UIWizardExportAppPageBasic1::validatePage()
+{
+    /* Initial result: */
+    bool fResult = true;
+
     /* Ask user about machines which are in Saved state currently: */
     QStringList savedMachines;
-    QList<QListWidgetItem*> items = m_pVMSelector->selectedItems();
-    for (int i=0; i < items.size(); ++i)
-    {
-        if (static_cast<UIVMListWidgetItem*>(items.at(i))->isInSaveState())
-            savedMachines << items.at(i)->text();
-    }
+    refreshSavedMachines(savedMachines, m_pVMSelector);
     if (!savedMachines.isEmpty())
         fResult = msgCenter().confirmExportMachinesInSaveState(savedMachines, this);
@@ -231,2 +241,15 @@
     return fResult;
 }
+
+void UIWizardExportAppPageBasic1::sltHandleVMItemSelectionChanged()
+{
+    updateMachines();
+    emit completeChanged();
+}
+
+void UIWizardExportAppPageBasic1::updateMachines()
+{
+    /* Update wizard fields: */
+    wizard()->setMachineNames(machineNames(m_pVMSelector));
+    wizard()->setMachineIDs(machineIDs(m_pVMSelector));
+}
Index: /trunk/src/VBox/Frontends/VirtualBox/src/wizards/exportappliance/UIWizardExportAppPageBasic1.h
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/wizards/exportappliance/UIWizardExportAppPageBasic1.h	(revision 91367)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/wizards/exportappliance/UIWizardExportAppPageBasic1.h	(revision 91368)
@@ -5,5 +5,5 @@
 
 /*
- * Copyright (C) 2009-2020 Oracle Corporation
+ * Copyright (C) 2009-2021 Oracle Corporation
  *
  * This file is part of VirtualBox Open Source Edition (OSE), as
@@ -26,46 +26,43 @@
 
 /* GUI includes: */
-#include "UIWizardPage.h"
+#include "UINativeWizardPage.h"
 
 /* Forward declarations: */
 class QListWidget;
 class QIRichTextLabel;
+class UIWizardExportApp;
 
+/** Namespace for 1st basic page of the Export Appliance wizard. */
+namespace UIWizardExportAppPage1
+{
+    /** Populates @a pVMSelector with items on the basis of passed @a selectedVMNames. */
+    void populateVMItems(QListWidget *pVMSelector, const QStringList &selectedVMNames);
 
-/** UIWizardPageBase extension for 1st page of the Export Appliance wizard. */
-class UIWizardExportAppPage1 : public UIWizardPageBase
-{
-protected:
+    /** Refresh a list of saved machines selected in @a pVMSelector. */
+    void refreshSavedMachines(QStringList &savedMachines, QListWidget *pVMSelector);
 
-    /** Constructs 1st page base. */
-    UIWizardExportAppPage1();
+    /** Returns a list of machine names selected in @a pVMSelector. */
+    QStringList machineNames(QListWidget *pVMSelector);
+    /** Returns a list of machine IDs selected in @a pVMSelector. */
+    QList<QUuid> machineIDs(QListWidget *pVMSelector);
+}
 
-    /** Populates VM selector items on the basis of passed @a selectedVMNames. */
-    void populateVMSelectorItems(const QStringList &selectedVMNames);
-
-    /** Returns a list of selected machine names. */
-    QStringList machineNames() const;
-    /** Returns a list of selected machine IDs. */
-    QList<QUuid> machineIDs() const;
-
-    /** Holds the VM selector instance. */
-    QListWidget *m_pVMSelector;
-};
-
-
-/** UIWizardPage extension for 1st page of the Export Appliance wizard, extends UIWizardExportAppPage1 as well. */
-class UIWizardExportAppPageBasic1 : public UIWizardPage, public UIWizardExportAppPage1
+/** UINativeWizardPage extension for 1st basic page of the Export Appliance wizard,
+  * based on UIWizardAddCloudVMPage1 namespace functions. */
+class UIWizardExportAppPageBasic1 : public UINativeWizardPage
 {
     Q_OBJECT;
-    Q_PROPERTY(QStringList machineNames READ machineNames);
-    Q_PROPERTY(QList<QUuid> machineIDs READ machineIDs);
 
 public:
 
     /** Constructs 1st basic page.
-      * @param  selectedVMNames  Brings the list of selected VM names. */
-    UIWizardExportAppPageBasic1(const QStringList &selectedVMNames);
+      * @param  selectedVMNames        Brings the list of selected VM names.
+      * @param  fFastTravelToNextPage  Brings whether we should fast-travel to next page. */
+    UIWizardExportAppPageBasic1(const QStringList &selectedVMNames, bool fFastTravelToNextPage);
 
-private:
+protected:
+
+    /** Returns wizard this page belongs to. */
+    UIWizardExportApp *wizard() const;
 
     /** Handles translation event. */
@@ -81,8 +78,23 @@
     virtual bool validatePage() /* override */;
 
+private slots:
+
+    /** Handles VM item selection change. */
+    void sltHandleVMItemSelectionChanged();
+
 private:
 
-    /** Holds the label instance. */
-    QIRichTextLabel *m_pLabel;
+    /** Updates machines. */
+    void updateMachines();
+
+    /** Holds the list of selected VM names. */
+    const QStringList  m_selectedVMNames;
+    /** Holds whether we should fast travel to next page. */
+    bool               m_fFastTravelToNextPage;
+
+    /** Holds the main label instance. */
+    QIRichTextLabel *m_pLabelMain;
+    /** Holds the VM selector instance. */
+    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 91367)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/wizards/exportappliance/UIWizardExportAppPageBasic2.cpp	(revision 91368)
@@ -5,5 +5,5 @@
 
 /*
- * Copyright (C) 2009-2020 Oracle Corporation
+ * Copyright (C) 2009-2021 Oracle Corporation
  *
  * This file is part of VirtualBox Open Source Edition (OSE), as
@@ -17,21 +17,19 @@
 
 /* Qt includes: */
+#include <QButtonGroup>
 #include <QCheckBox>
-#include <QComboBox>
 #include <QDir>
 #include <QGridLayout>
-#include <QHeaderView>
 #include <QLabel>
 #include <QRadioButton>
 #include <QStackedWidget>
-#include <QTableWidget>
 #include <QVBoxLayout>
 
 /* GUI includes: */
+#include "QIComboBox.h"
 #include "QIRichTextLabel.h"
 #include "QIToolButton.h"
 #include "UICloudNetworkingStuff.h"
 #include "UICommon.h"
-#include "UIConverter.h"
 #include "UIEmptyFilePathSelector.h"
 #include "UIIconPool.h"
@@ -46,4 +44,7 @@
 #include "CSystemProperties.h"
 
+/* Namespaces: */
+using namespace UIWizardExportAppPage2;
+
 
 /*********************************************************************************************************************************
@@ -51,12 +52,515 @@
 *********************************************************************************************************************************/
 
-UIWizardExportAppPage2::UIWizardExportAppPage2(bool fExportToOCIByDefault)
+void UIWizardExportAppPage2::populateFormats(QIComboBox *pCombo, bool fExportToOCIByDefault)
+{
+    /* Sanity check: */
+    AssertPtrReturnVoid(pCombo);
+    /* We need top-level parent as well: */
+    QWidget *pParent = pCombo->window();
+    AssertPtrReturnVoid(pParent);
+
+    /* Remember current item data to be able to restore it: */
+    QString strOldData;
+    if (pCombo->currentIndex() != -1)
+        strOldData = pCombo->currentData(FormatData_ShortName).toString();
+    else
+    {
+        /* Otherwise "OCI" or "ovf-1.0" should be the default one: */
+        if (fExportToOCIByDefault)
+            strOldData = "OCI";
+        else
+            strOldData = "ovf-1.0";
+    }
+
+    /* Block signals while updating: */
+    pCombo->blockSignals(true);
+
+    /* Clear combo initially: */
+    pCombo->clear();
+
+    /* Compose hardcoded format list: */
+    QStringList formats;
+    formats << "ovf-0.9";
+    formats << "ovf-1.0";
+    formats << "ovf-2.0";
+    /* Add that list to combo: */
+    foreach (const QString &strShortName, formats)
+    {
+        /* Compose empty item, fill it's data: */
+        pCombo->addItem(QString());
+        pCombo->setItemData(pCombo->count() - 1, strShortName, FormatData_ShortName);
+    }
+
+    /* Iterate through existing providers: */
+    foreach (const CCloudProvider &comProvider, listCloudProviders(pParent))
+    {
+        /* Skip if we have nothing to populate (file missing?): */
+        if (comProvider.isNull())
+            continue;
+        /* Acquire provider name: */
+        QString strProviderName;
+        if (!cloudProviderName(comProvider, strProviderName, pParent))
+            continue;
+        /* Acquire provider short name: */
+        QString strProviderShortName;
+        if (!cloudProviderShortName(comProvider, strProviderShortName, pParent))
+            continue;
+
+        /* Compose empty item, fill it's data: */
+        pCombo->addItem(QString());
+        pCombo->setItemData(pCombo->count() - 1, strProviderName,      FormatData_Name);
+        pCombo->setItemData(pCombo->count() - 1, strProviderShortName, FormatData_ShortName);
+        pCombo->setItemData(pCombo->count() - 1, true,                 FormatData_IsItCloudFormat);
+    }
+
+    /* Set previous/default item if possible: */
+    int iNewIndex = -1;
+    if (   iNewIndex == -1
+        && !strOldData.isNull())
+        iNewIndex = pCombo->findData(strOldData, FormatData_ShortName);
+    if (   iNewIndex == -1
+        && pCombo->count() > 0)
+        iNewIndex = 0;
+    if (iNewIndex != -1)
+        pCombo->setCurrentIndex(iNewIndex);
+
+    /* Unblock signals after update: */
+    pCombo->blockSignals(false);
+}
+
+void UIWizardExportAppPage2::populateMACAddressPolicies(QIComboBox *pCombo)
+{
+    /* Sanity check: */
+    AssertPtrReturnVoid(pCombo);
+    /* We need top-level parent as well: */
+    QWidget *pParent = pCombo->window();
+    AssertPtrReturnVoid(pParent);
+
+    /* Map known export options to known MAC address export policies: */
+    QMap<KExportOptions, MACAddressExportPolicy> knownOptions;
+    knownOptions[KExportOptions_StripAllMACs] = MACAddressExportPolicy_StripAllMACs;
+    knownOptions[KExportOptions_StripAllNonNATMACs] = MACAddressExportPolicy_StripAllNonNATMACs;
+    /* Load currently supported export options: */
+    const QVector<KExportOptions> supportedOptions =
+        uiCommon().virtualBox().GetSystemProperties().GetSupportedExportOptions();
+    /* Check which of supported options/policies are known: */
+    QList<MACAddressExportPolicy> supportedPolicies;
+    foreach (const KExportOptions &enmOption, supportedOptions)
+        if (knownOptions.contains(enmOption))
+            supportedPolicies << knownOptions.value(enmOption);
+
+    /* Remember current item data to be able to restore it: */
+    MACAddressExportPolicy enmOldData = MACAddressExportPolicy_MAX;
+    if (pCombo->currentIndex() != -1)
+        enmOldData = pCombo->currentData().value<MACAddressExportPolicy>();
+    else
+    {
+        if (supportedPolicies.contains(MACAddressExportPolicy_StripAllNonNATMACs))
+            enmOldData = MACAddressExportPolicy_StripAllNonNATMACs;
+        else
+            enmOldData = MACAddressExportPolicy_KeepAllMACs;
+    }
+
+    /* Block signals while updating: */
+    pCombo->blockSignals(true);
+
+    /* Clear combo initially: */
+    pCombo->clear();
+
+    /* Add supported policies first: */
+    foreach (const MACAddressExportPolicy &enmPolicy, supportedPolicies)
+        pCombo->addItem(QString(), QVariant::fromValue(enmPolicy));
+
+    /* Add hardcoded policy finally: */
+    pCombo->addItem(QString(), QVariant::fromValue(MACAddressExportPolicy_KeepAllMACs));
+
+    /* Set previous/default item if possible: */
+    int iNewIndex = -1;
+    if (   iNewIndex == -1
+        && enmOldData != MACAddressExportPolicy_MAX)
+        iNewIndex = pCombo->findData(QVariant::fromValue(enmOldData));
+    if (   iNewIndex == -1
+        && pCombo->count() > 0)
+        iNewIndex = 0;
+    if (iNewIndex != -1)
+        pCombo->setCurrentIndex(iNewIndex);
+
+    /* Unblock signals after update: */
+    pCombo->blockSignals(false);
+}
+
+QString UIWizardExportAppPage2::format(QIComboBox *pCombo)
+{
+    return pCombo->currentData(FormatData_ShortName).toString();
+}
+
+bool UIWizardExportAppPage2::isFormatCloudOne(QIComboBox *pCombo, int iIndex /* = -1 */)
+{
+    /* Sanity check: */
+    AssertPtrReturn(pCombo, false);
+
+    /* Handle special case, -1 means "current one": */
+    if (iIndex == -1)
+        iIndex = pCombo->currentIndex();
+
+    /* Give the actual result: */
+    return pCombo->itemData(iIndex, FormatData_IsItCloudFormat).toBool();
+}
+
+void UIWizardExportAppPage2::refreshStackedWidget(QStackedWidget *pStackedWidget, bool fIsFormatCloudOne)
+{
+    /* Update stack appearance according to chosen format: */
+    pStackedWidget->setCurrentIndex((int)fIsFormatCloudOne);
+}
+
+void UIWizardExportAppPage2::refreshFileSelectorName(QString &strFileSelectorName,
+                                                     const QStringList &machineNames,
+                                                     const QString &strDefaultApplianceName,
+                                                     bool fIsFormatCloudOne)
+{
+    /* If format is cloud one: */
+    if (fIsFormatCloudOne)
+    {
+        /* We use no name: */
+        strFileSelectorName.clear();
+    }
+    /* If format is local one: */
+    else
+    {
+        /* If it's one VM only, we use the VM name as file-name: */
+        if (machineNames.size() == 1)
+            strFileSelectorName = machineNames.first();
+        /* Otherwise => we use the default file-name: */
+        else
+            strFileSelectorName = strDefaultApplianceName;
+    }
+}
+
+void UIWizardExportAppPage2::refreshFileSelectorExtension(QString &strFileSelectorExt,
+                                                          UIEmptyFilePathSelector *pFileSelector,
+                                                          bool fIsFormatCloudOne)
+{
+    /* If format is cloud one: */
+    if (fIsFormatCloudOne)
+    {
+        /* We use no extension: */
+        strFileSelectorExt.clear();
+
+        /* Update file chooser accordingly: */
+        pFileSelector->setFileFilters(QString());
+    }
+    /* If format is local one: */
+    else
+    {
+        /* We use the default (.ova) extension: */
+        strFileSelectorExt = ".ova";
+
+        /* Update file chooser accordingly: */
+        pFileSelector->setFileFilters(UIWizardExportApp::tr("Open Virtualization Format Archive (%1)").arg("*.ova") + ";;" +
+                                      UIWizardExportApp::tr("Open Virtualization Format (%1)").arg("*.ovf"));
+    }
+}
+
+void UIWizardExportAppPage2::refreshFileSelectorPath(UIEmptyFilePathSelector *pFileSelector,
+                                                     const QString &strFileSelectorName,
+                                                     const QString &strFileSelectorExt,
+                                                     bool fIsFormatCloudOne)
+{
+    /* If format is cloud one: */
+    if (fIsFormatCloudOne)
+    {
+        /* Clear file selector path: */
+        pFileSelector->setPath(QString());
+    }
+    /* If format is local one: */
+    else
+    {
+        /* Compose file selector path: */
+        const QString strPath = QDir::toNativeSeparators(QString("%1/%2")
+                                                         .arg(uiCommon().documentsPath())
+                                                         .arg(strFileSelectorName + strFileSelectorExt));
+        pFileSelector->setPath(strPath);
+    }
+}
+
+void UIWizardExportAppPage2::refreshManifestCheckBoxAccess(QCheckBox *pCheckBox,
+                                                           bool fIsFormatCloudOne)
+{
+    /* If format is cloud one: */
+    if (fIsFormatCloudOne)
+    {
+        /* Disable manifest check-box: */
+        pCheckBox->setChecked(false);
+        pCheckBox->setEnabled(false);
+    }
+    /* If format is local one: */
+    else
+    {
+        /* Enable and select manifest check-box: */
+        pCheckBox->setChecked(true);
+        pCheckBox->setEnabled(true);
+    }
+}
+
+void UIWizardExportAppPage2::refreshIncludeISOsCheckBoxAccess(QCheckBox *pCheckBox,
+                                                              bool fIsFormatCloudOne)
+{
+    /* If format is cloud one: */
+    if (fIsFormatCloudOne)
+    {
+        /* Disable include ISO check-box: */
+        pCheckBox->setChecked(false);
+        pCheckBox->setEnabled(false);
+    }
+    /* If format is local one: */
+    else
+    {
+        /* Enable include ISO check-box: */
+        pCheckBox->setEnabled(true);
+    }
+}
+
+void UIWizardExportAppPage2::refreshProfileCombo(QIComboBox *pCombo,
+                                                 const QString &strFormat,
+                                                 bool fIsFormatCloudOne)
+{
+    /* Sanity check: */
+    AssertPtrReturnVoid(pCombo);
+
+    /* If format is cloud one: */
+    if (fIsFormatCloudOne)
+    {
+        /* We need top-level parent as well: */
+        QWidget *pParent = pCombo->window();
+        AssertPtrReturnVoid(pParent);
+        /* Acquire provider: */
+        CCloudProvider comProvider = cloudProviderByShortName(strFormat, pParent);
+        AssertReturnVoid(comProvider.isNotNull());
+
+        /* Remember current item data to be able to restore it: */
+        QString strOldData;
+        if (pCombo->currentIndex() != -1)
+            strOldData = pCombo->currentData(ProfileData_Name).toString();
+
+        /* Block signals while updating: */
+        pCombo->blockSignals(true);
+
+        /* Clear combo initially: */
+        pCombo->clear();
+
+        /* Iterate through existing profile names: */
+        foreach (const CCloudProfile &comProfile, listCloudProfiles(comProvider, pParent))
+        {
+            /* Skip if we have nothing to populate (wtf happened?): */
+            if (comProfile.isNull())
+                continue;
+            /* Acquire profile name: */
+            QString strProfileName;
+            if (!cloudProfileName(comProfile, strProfileName, pParent))
+                continue;
+
+            /* Compose item, fill it's data: */
+            pCombo->addItem(strProfileName);
+            pCombo->setItemData(pCombo->count() - 1, strProfileName, ProfileData_Name);
+        }
+
+        /* Set previous/default item if possible: */
+        int iNewIndex = -1;
+        if (   iNewIndex == -1
+            && !strOldData.isNull())
+            iNewIndex = pCombo->findData(strOldData, ProfileData_Name);
+        if (   iNewIndex == -1
+            && pCombo->count() > 0)
+            iNewIndex = 0;
+        if (iNewIndex != -1)
+            pCombo->setCurrentIndex(iNewIndex);
+
+        /* Unblock signals after update: */
+        pCombo->blockSignals(false);
+    }
+    /* If format is local one: */
+    else
+    {
+        /* Block signals while updating: */
+        pCombo->blockSignals(true);
+
+        /* Clear combo initially: */
+        pCombo->clear();
+
+        /* Unblock signals after update: */
+        pCombo->blockSignals(false);
+    }
+}
+
+void UIWizardExportAppPage2::refreshCloudProfile(CCloudProfile &comCloudProfile,
+                                                 const QString &strShortProviderName,
+                                                 const QString &strProfileName,
+                                                 bool fIsFormatCloudOne)
+{
+    /* If format is cloud one: */
+    if (fIsFormatCloudOne)
+        comCloudProfile = cloudProfileByName(strShortProviderName, strProfileName);
+    /* If format is local one: */
+    else
+        comCloudProfile = CCloudProfile();
+}
+
+void UIWizardExportAppPage2::refreshCloudExportMode(const QMap<CloudExportMode, QAbstractButton*> &radios,
+                                                    bool fIsFormatCloudOne)
+{
+    /* If format is cloud one: */
+    if (fIsFormatCloudOne)
+    {
+        /* Check if something already chosen: */
+        bool fSomethingChosen = false;
+        foreach (QAbstractButton *pButton, radios.values())
+            if (pButton->isChecked())
+                fSomethingChosen = true;
+        /* Choose default cloud export option: */
+        if (!fSomethingChosen)
+            radios.value(CloudExportMode_ExportThenAsk)->setChecked(true);
+    }
+    /* If format is local one: */
+    else
+    {
+        /* Make sure nothing chosen: */
+        foreach (QAbstractButton *pButton, radios.values())
+            pButton->setChecked(false);
+    }
+}
+
+void UIWizardExportAppPage2::refreshCloudStuff(CAppliance &comCloudAppliance,
+                                               CCloudClient &comCloudClient,
+                                               CVirtualSystemDescription &comCloudVsd,
+                                               CVirtualSystemDescriptionForm &comCloudVsdExportForm,
+                                               const CCloudProfile &comCloudProfile,
+                                               const QList<QUuid> &machineIDs,
+                                               const QString &strUri,
+                                               const CloudExportMode enmCloudExportMode)
+{
+    /* Clear stuff: */
+    comCloudAppliance = CAppliance();
+    comCloudClient = CCloudClient();
+    comCloudVsd = CVirtualSystemDescription();
+    comCloudVsdExportForm = CVirtualSystemDescriptionForm();
+
+    /* Sanity check: */
+    if (comCloudProfile.isNull())
+        return;
+    if (machineIDs.isEmpty())
+        return;
+
+    /* Perform cloud export procedure for first uuid only: */
+    const QUuid uMachineId = machineIDs.first();
+
+    /* Get the machine with the uMachineId: */
+    CVirtualBox comVBox = uiCommon().virtualBox();
+    CMachine comMachine = comVBox.FindMachine(uMachineId.toString());
+    if (!comVBox.isOk())
+    {
+        msgCenter().cannotFindMachineById(comVBox, uMachineId);
+        return;
+    }
+
+    /* Create appliance: */
+    CAppliance comAppliance = comVBox.CreateAppliance();
+    if (!comVBox.isOk())
+    {
+        msgCenter().cannotCreateAppliance(comVBox);
+        return;
+    }
+
+    /* Remember appliance: */
+    comCloudAppliance = comAppliance;
+
+    /* Add the export virtual system description to our appliance object: */
+    CVirtualSystemDescription comVsd = comMachine.ExportTo(comCloudAppliance, strUri);
+    if (!comMachine.isOk())
+    {
+        msgCenter().cannotExportAppliance(comMachine, comCloudAppliance.GetPath());
+        return;
+    }
+
+    /* Remember description: */
+    comCloudVsd = comVsd;
+
+    /* Add Launch Instance flag to virtual system description: */
+    switch (enmCloudExportMode)
+    {
+        case CloudExportMode_AskThenExport:
+        case CloudExportMode_ExportThenAsk:
+            comCloudVsd.AddDescription(KVirtualSystemDescriptionType_CloudLaunchInstance, "true", QString());
+            break;
+        default:
+            comCloudVsd.AddDescription(KVirtualSystemDescriptionType_CloudLaunchInstance, "false", QString());
+            break;
+    }
+    if (!comCloudVsd.isOk())
+    {
+        msgCenter().cannotAddVirtualSystemDescriptionValue(comCloudVsd);
+        return;
+    }
+
+    /* Create Cloud Client: */
+    CCloudClient comClient = cloudClient(comCloudProfile);
+    if (comClient.isNull())
+        return;
+
+    /* Remember client: */
+    comCloudClient = comClient;
+
+    /* Read Cloud Client Export description form: */
+    CVirtualSystemDescriptionForm comVsdExportForm;
+    bool fResult = exportDescriptionForm(comCloudClient, comCloudVsd, comVsdExportForm);
+    if (!fResult)
+        return;
+
+    /* Remember export description form: */
+    comCloudVsdExportForm = comVsdExportForm;
+}
+
+QString UIWizardExportAppPage2::profileName(QIComboBox *pCombo)
+{
+    return pCombo->currentData(ProfileData_Name).toString();
+}
+
+void UIWizardExportAppPage2::updateFormatComboToolTip(QIComboBox *pCombo)
+{
+    AssertPtrReturnVoid(pCombo);
+    QString strCurrentToolTip;
+    if (pCombo->count() != 0)
+    {
+        strCurrentToolTip = pCombo->currentData(Qt::ToolTipRole).toString();
+        AssertMsg(!strCurrentToolTip.isEmpty(), ("Data not found!"));
+    }
+    pCombo->setToolTip(strCurrentToolTip);
+}
+
+void UIWizardExportAppPage2::updateMACAddressExportPolicyComboToolTip(QIComboBox *pCombo)
+{
+    AssertPtrReturnVoid(pCombo);
+    QString strCurrentToolTip;
+    if (pCombo->count() != 0)
+    {
+        strCurrentToolTip = pCombo->currentData(Qt::ToolTipRole).toString();
+        AssertMsg(!strCurrentToolTip.isEmpty(), ("Data not found!"));
+    }
+    pCombo->setToolTip(strCurrentToolTip);
+}
+
+
+/*********************************************************************************************************************************
+*   Class UIWizardExportAppPageBasic2 implementation.                                                                            *
+*********************************************************************************************************************************/
+
+UIWizardExportAppPageBasic2::UIWizardExportAppPageBasic2(bool fExportToOCIByDefault)
     : m_fExportToOCIByDefault(fExportToOCIByDefault)
+    , m_pLabelFormat(0)
+    , m_pLabelSettings(0)
     , m_pFormatLayout(0)
-    , m_pSettingsLayout1(0)
-    , m_pSettingsLayout2(0)
     , m_pFormatComboBoxLabel(0)
     , m_pFormatComboBox(0)
     , m_pSettingsWidget(0)
+    , m_pSettingsLayout1(0)
     , m_pFileSelectorLabel(0)
     , m_pFileSelector(0)
@@ -66,492 +570,10 @@
     , m_pManifestCheckbox(0)
     , m_pIncludeISOsCheckbox(0)
+    , m_pSettingsLayout2(0)
     , m_pProfileLabel(0)
     , m_pProfileComboBox(0)
     , m_pProfileToolButton(0)
-    , m_pMachineLabel(0)
-    , m_pRadioDoNotAsk(0)
-    , m_pRadioAskThenExport(0)
-    , m_pRadioExportThenAsk(0)
-{
-}
-
-void UIWizardExportAppPage2::populateFormats()
-{
-    AssertReturnVoid(m_pFormatComboBox->count() == 0);
-
-    /* Compose hardcoded format list: */
-    QStringList formats;
-    formats << "ovf-0.9";
-    formats << "ovf-1.0";
-    formats << "ovf-2.0";
-    /* Add that list to combo: */
-    foreach (const QString &strShortName, formats)
-    {
-        /* Compose empty item, fill it's data: */
-        m_pFormatComboBox->addItem(QString());
-        m_pFormatComboBox->setItemData(m_pFormatComboBox->count() - 1, strShortName, FormatData_ShortName);
-    }
-
-    /* Initialize Cloud Provider Manager: */
-    bool fOCIPresent = false;
-    m_comCloudProviderManager = cloudProviderManager(wizardImp());
-    if (m_comCloudProviderManager.isNotNull())
-    {
-        /* Iterate through existing providers: */
-        foreach (const CCloudProvider &comProvider, listCloudProviders(wizardImp()))
-        {
-            /* Skip if we have nothing to populate (file missing?): */
-            if (comProvider.isNull())
-                continue;
-
-            /* Compose empty item, fill it's data: */
-            m_pFormatComboBox->addItem(QString());
-            m_pFormatComboBox->setItemData(m_pFormatComboBox->count() - 1, comProvider.GetId(),        FormatData_ID);
-            m_pFormatComboBox->setItemData(m_pFormatComboBox->count() - 1, comProvider.GetName(),      FormatData_Name);
-            m_pFormatComboBox->setItemData(m_pFormatComboBox->count() - 1, comProvider.GetShortName(), FormatData_ShortName);
-            m_pFormatComboBox->setItemData(m_pFormatComboBox->count() - 1, true,                       FormatData_IsItCloudFormat);
-            if (m_pFormatComboBox->itemData(m_pFormatComboBox->count() - 1, FormatData_ShortName).toString() == "OCI")
-                fOCIPresent = true;
-        }
-    }
-
-    /* Set default: */
-    if (m_fExportToOCIByDefault && fOCIPresent)
-        setFormat("OCI");
-    else
-        setFormat("ovf-1.0");
-}
-
-void UIWizardExportAppPage2::populateMACAddressPolicies()
-{
-    AssertReturnVoid(m_pMACComboBox->count() == 0);
-
-    /* Map known export options to known MAC address export policies: */
-    QMap<KExportOptions, MACAddressExportPolicy> knownOptions;
-    knownOptions[KExportOptions_StripAllMACs] = MACAddressExportPolicy_StripAllMACs;
-    knownOptions[KExportOptions_StripAllNonNATMACs] = MACAddressExportPolicy_StripAllNonNATMACs;
-
-    /* Load currently supported export options: */
-    CSystemProperties comProperties = uiCommon().virtualBox().GetSystemProperties();
-    const QVector<KExportOptions> supportedOptions = comProperties.GetSupportedExportOptions();
-
-    /* Check which of supported options/policies are known: */
-    QList<MACAddressExportPolicy> supportedPolicies;
-    foreach (const KExportOptions &enmOption, supportedOptions)
-        if (knownOptions.contains(enmOption))
-            supportedPolicies << knownOptions.value(enmOption);
-
-    /* Add supported policies first: */
-    foreach (const MACAddressExportPolicy &enmPolicy, supportedPolicies)
-        m_pMACComboBox->addItem(QString(), QVariant::fromValue(enmPolicy));
-
-    /* Add hardcoded policy finally: */
-    m_pMACComboBox->addItem(QString(), QVariant::fromValue(MACAddressExportPolicy_KeepAllMACs));
-
-    /* Set default: */
-    if (supportedPolicies.contains(MACAddressExportPolicy_StripAllNonNATMACs))
-        setMACAddressExportPolicy(MACAddressExportPolicy_StripAllNonNATMACs);
-    else
-        setMACAddressExportPolicy(MACAddressExportPolicy_KeepAllMACs);
-}
-
-void UIWizardExportAppPage2::populateProfiles()
-{
-    /* Block signals while updating: */
-    m_pProfileComboBox->blockSignals(true);
-
-    /* Remember current item data to be able to restore it: */
-    QString strOldData;
-    if (m_pProfileComboBox->currentIndex() != -1)
-        strOldData = m_pProfileComboBox->itemData(m_pProfileComboBox->currentIndex(), ProfileData_Name).toString();
-
-    /* Clear combo initially: */
-    m_pProfileComboBox->clear();
-    /* Clear Cloud Provider: */
-    m_comCloudProvider = CCloudProvider();
-
-    /* If provider chosen: */
-    if (!providerId().isNull())
-    {
-        /* (Re)initialize Cloud Provider: */
-        m_comCloudProvider = cloudProviderById(providerId(), wizardImp());
-        if (m_comCloudProvider.isNotNull())
-        {
-            /* Iterate through existing profile names: */
-            foreach (const CCloudProfile &comProfile, listCloudProfiles(m_comCloudProvider, wizardImp()))
-            {
-                /* Acquire profile name: */
-                QString strProfileName;
-                if (cloudProfileName(comProfile, strProfileName, wizardImp()))
-                {
-                    /* Compose item, fill it's data: */
-                    m_pProfileComboBox->addItem(strProfileName);
-                    m_pProfileComboBox->setItemData(m_pProfileComboBox->count() - 1, strProfileName, ProfileData_Name);
-                }
-            }
-        }
-
-        /* Set previous/default item if possible: */
-        int iNewIndex = -1;
-        if (   iNewIndex == -1
-            && !strOldData.isNull())
-            iNewIndex = m_pProfileComboBox->findData(strOldData, ProfileData_Name);
-        if (   iNewIndex == -1
-            && m_pProfileComboBox->count() > 0)
-            iNewIndex = 0;
-        if (iNewIndex != -1)
-            m_pProfileComboBox->setCurrentIndex(iNewIndex);
-    }
-
-    /* Unblock signals after update: */
-    m_pProfileComboBox->blockSignals(false);
-}
-
-void UIWizardExportAppPage2::populateProfile()
-{
-    /* Clear Cloud Profile: */
-    m_comCloudProfile = CCloudProfile();
-
-    /* If both provider and profile chosen: */
-    if (!providerShortName().isNull() && !profileName().isNull())
-    {
-        /* Acquire Cloud Profile: */
-        m_comCloudProfile = cloudProfileByName(providerShortName(), profileName(), wizardImp());
-    }
-}
-
-void UIWizardExportAppPage2::populateFormProperties()
-{
-    /* Clear appliance: */
-    m_comAppliance = CAppliance();
-    /* Clear cloud client: */
-    m_comClient = CCloudClient();
-    /* Clear description: */
-    m_comVSD = CVirtualSystemDescription();
-    /* Clear description form: */
-    m_comVSDExportForm = CVirtualSystemDescriptionForm();
-
-    /* If profile chosen: */
-    if (m_comCloudProfile.isNotNull())
-    {
-        /* Main API request sequence, can be interrupted after any step: */
-        do
-        {
-            /* Perform cloud export procedure for first uuid only: */
-            const QList<QUuid> uuids = fieldImp("machineIDs").value<QList<QUuid> >();
-            AssertReturnVoid(!uuids.isEmpty());
-            const QUuid uMachineId = uuids.first();
-
-            /* Get the machine with the uMachineId: */
-            CVirtualBox comVBox = uiCommon().virtualBox();
-            CMachine comMachine = comVBox.FindMachine(uMachineId.toString());
-            if (!comVBox.isOk())
-            {
-                msgCenter().cannotFindMachineById(comVBox, uMachineId);
-                break;
-            }
-
-            /* Create appliance: */
-            CAppliance comAppliance = comVBox.CreateAppliance();
-            if (!comVBox.isOk())
-            {
-                msgCenter().cannotCreateAppliance(comVBox);
-                break;
-            }
-
-            /* Remember appliance: */
-            m_comAppliance = comAppliance;
-
-            /* Add the export virtual system description to our appliance object: */
-            CVirtualSystemDescription comVSD = comMachine.ExportTo(m_comAppliance, qobject_cast<UIWizardExportApp*>(wizardImp())->uri());
-            if (!comMachine.isOk())
-            {
-                msgCenter().cannotExportAppliance(comMachine, m_comAppliance.GetPath(), thisImp());
-                break;
-            }
-
-            /* Remember description: */
-            m_comVSD = comVSD;
-
-            /* Add Launch Instance flag to virtual system description: */
-            switch (cloudExportMode())
-            {
-                case CloudExportMode_AskThenExport:
-                case CloudExportMode_ExportThenAsk:
-                    m_comVSD.AddDescription(KVirtualSystemDescriptionType_CloudLaunchInstance, "true", QString());
-                    break;
-                default:
-                    m_comVSD.AddDescription(KVirtualSystemDescriptionType_CloudLaunchInstance, "false", QString());
-                    break;
-            }
-            if (!m_comVSD.isOk())
-            {
-                msgCenter().cannotAddVirtualSystemDescriptionValue(m_comVSD);
-                break;
-            }
-
-            /* Create Cloud Client: */
-            CCloudClient comClient = cloudClient(m_comCloudProfile);
-            if (comClient.isNull())
-                break;
-
-            /* Remember client: */
-            m_comClient = comClient;
-
-            /* Read Cloud Client Export description form: */
-            CVirtualSystemDescriptionForm comExportForm;
-            bool fResult = exportDescriptionForm(m_comClient, m_comVSD, comExportForm, wizardImp());
-            if (!fResult)
-                break;
-
-            /* Remember description form: */
-            m_comVSDExportForm = comExportForm;
-        }
-        while (0);
-    }
-}
-
-void UIWizardExportAppPage2::updatePageAppearance()
-{
-    /* Update page appearance according to chosen format: */
-    m_pSettingsWidget->setCurrentIndex((int)isFormatCloudOne());
-}
-
-void UIWizardExportAppPage2::refreshFileSelectorName()
-{
-    /* If it's one VM only, we use the VM name as file-name: */
-    if (fieldImp("machineNames").toStringList().size() == 1)
-        m_strFileSelectorName = fieldImp("machineNames").toStringList()[0];
-    /* Otherwise => we use the default file-name: */
-    else
-        m_strFileSelectorName = m_strDefaultApplianceName;
-
-    /* Cascade update for file selector path: */
-    refreshFileSelectorPath();
-}
-
-void UIWizardExportAppPage2::refreshFileSelectorExtension()
-{
-    /* Save old extension to compare afterwards: */
-    const QString strOldExtension = m_strFileSelectorExt;
-
-    /* If format is cloud one: */
-    if (isFormatCloudOne())
-    {
-        /* We use no extension: */
-        m_strFileSelectorExt.clear();
-
-        /* Update file chooser accordingly: */
-        m_pFileSelector->setFileFilters(QString());
-    }
-    /* Otherwise: */
-    else
-    {
-        /* We use the default (.ova) extension: */
-        m_strFileSelectorExt = ".ova";
-
-        /* Update file chooser accordingly: */
-        m_pFileSelector->setFileFilters(UIWizardExportApp::tr("Open Virtualization Format Archive (%1)").arg("*.ova") + ";;" +
-                                        UIWizardExportApp::tr("Open Virtualization Format (%1)").arg("*.ovf"));
-    }
-
-    /* Cascade update for file selector path if necessary: */
-    if (m_strFileSelectorExt != strOldExtension)
-        refreshFileSelectorPath();
-}
-
-void UIWizardExportAppPage2::refreshFileSelectorPath()
-{
-    /* If format is cloud one: */
-    if (isFormatCloudOne())
-    {
-        /* Clear file selector path: */
-        m_pFileSelector->setPath(QString());
-    }
-    else
-    {
-        /* Compose file selector path: */
-        const QString strPath = QDir::toNativeSeparators(QString("%1/%2")
-                                                         .arg(uiCommon().documentsPath())
-                                                         .arg(m_strFileSelectorName + m_strFileSelectorExt));
-        m_pFileSelector->setPath(strPath);
-    }
-}
-
-void UIWizardExportAppPage2::refreshManifestCheckBoxAccess()
-{
-    /* If format is cloud one: */
-    if (isFormatCloudOne())
-    {
-        /* Disable manifest check-box: */
-        m_pManifestCheckbox->setChecked(false);
-        m_pManifestCheckbox->setEnabled(false);
-    }
-    /* Otherwise: */
-    else
-    {
-        /* Enable manifest check-box: */
-        m_pManifestCheckbox->setChecked(true);
-        m_pManifestCheckbox->setEnabled(true);
-    }
-}
-
-void UIWizardExportAppPage2::refreshIncludeISOsCheckBoxAccess()
-{
-    /* If format is cloud one: */
-    if (isFormatCloudOne())
-    {
-        /* Disable include ISO check-box: */
-        m_pIncludeISOsCheckbox->setChecked(false);
-        m_pIncludeISOsCheckbox->setEnabled(false);
-    }
-    /* Otherwise: */
-    else
-    {
-        /* Enable include ISO check-box: */
-        m_pIncludeISOsCheckbox->setEnabled(true);
-    }
-}
-
-void UIWizardExportAppPage2::updateFormatComboToolTip()
-{
-    const int iCurrentIndex = m_pFormatComboBox->currentIndex();
-    const QString strCurrentToolTip = m_pFormatComboBox->itemData(iCurrentIndex, Qt::ToolTipRole).toString();
-    AssertMsg(!strCurrentToolTip.isEmpty(), ("Data not found!"));
-    m_pFormatComboBox->setToolTip(strCurrentToolTip);
-}
-
-void UIWizardExportAppPage2::updateMACAddressExportPolicyComboToolTip()
-{
-    const QString strCurrentToolTip = m_pMACComboBox->currentData(Qt::ToolTipRole).toString();
-    AssertMsg(!strCurrentToolTip.isEmpty(), ("Data not found!"));
-    m_pMACComboBox->setToolTip(strCurrentToolTip);
-}
-
-void UIWizardExportAppPage2::setFormat(const QString &strFormat)
-{
-    const int iIndex = m_pFormatComboBox->findData(strFormat, FormatData_ShortName);
-    AssertMsg(iIndex != -1, ("Data not found!"));
-    m_pFormatComboBox->setCurrentIndex(iIndex);
-}
-
-QString UIWizardExportAppPage2::format() const
-{
-    const int iIndex = m_pFormatComboBox->currentIndex();
-    return m_pFormatComboBox->itemData(iIndex, FormatData_ShortName).toString();
-}
-
-bool UIWizardExportAppPage2::isFormatCloudOne(int iIndex /* = -1 */) const
-{
-    if (iIndex == -1)
-        iIndex = m_pFormatComboBox->currentIndex();
-    return m_pFormatComboBox->itemData(iIndex, FormatData_IsItCloudFormat).toBool();
-}
-
-void UIWizardExportAppPage2::setPath(const QString &strPath)
-{
-    m_pFileSelector->setPath(strPath);
-}
-
-QString UIWizardExportAppPage2::path() const
-{
-    return m_pFileSelector->path();
-}
-
-void UIWizardExportAppPage2::setMACAddressExportPolicy(MACAddressExportPolicy enmMACAddressExportPolicy)
-{
-    const int iIndex = m_pMACComboBox->findData(enmMACAddressExportPolicy);
-    AssertMsg(iIndex != -1, ("Data not found!"));
-    m_pMACComboBox->setCurrentIndex(iIndex);
-}
-
-MACAddressExportPolicy UIWizardExportAppPage2::macAddressExportPolicy() const
-{
-    return m_pMACComboBox->currentData().value<MACAddressExportPolicy>();
-}
-
-void UIWizardExportAppPage2::setManifestSelected(bool fChecked)
-{
-    m_pManifestCheckbox->setChecked(fChecked);
-}
-
-bool UIWizardExportAppPage2::isManifestSelected() const
-{
-    return m_pManifestCheckbox->isChecked();
-}
-
-void UIWizardExportAppPage2::setIncludeISOsSelected(bool fChecked)
-{
-    m_pIncludeISOsCheckbox->setChecked(fChecked);
-}
-
-bool UIWizardExportAppPage2::isIncludeISOsSelected() const
-{
-    return m_pIncludeISOsCheckbox->isChecked();
-}
-
-void UIWizardExportAppPage2::setProviderById(const QUuid &uId)
-{
-    const int iIndex = m_pFormatComboBox->findData(uId, FormatData_ID);
-    AssertMsg(iIndex != -1, ("Data not found!"));
-    m_pFormatComboBox->setCurrentIndex(iIndex);
-}
-
-QUuid UIWizardExportAppPage2::providerId() const
-{
-    const int iIndex = m_pFormatComboBox->currentIndex();
-    return m_pFormatComboBox->itemData(iIndex, FormatData_ID).toUuid();
-}
-
-QString UIWizardExportAppPage2::providerShortName() const
-{
-    const int iIndex = m_pFormatComboBox->currentIndex();
-    return m_pFormatComboBox->itemData(iIndex, FormatData_ShortName).toString();
-}
-
-QString UIWizardExportAppPage2::profileName() const
-{
-    const int iIndex = m_pProfileComboBox->currentIndex();
-    return m_pProfileComboBox->itemData(iIndex, ProfileData_Name).toString();
-}
-
-CAppliance UIWizardExportAppPage2::cloudAppliance() const
-{
-    return m_comAppliance;
-}
-
-CCloudClient UIWizardExportAppPage2::client() const
-{
-    return m_comClient;
-}
-
-CVirtualSystemDescription UIWizardExportAppPage2::vsd() const
-{
-    return m_comVSD;
-}
-
-CVirtualSystemDescriptionForm UIWizardExportAppPage2::vsdExportForm() const
-{
-    return m_comVSDExportForm;
-}
-
-CloudExportMode UIWizardExportAppPage2::cloudExportMode() const
-{
-    if (m_pRadioAskThenExport->isChecked())
-        return CloudExportMode_AskThenExport;
-    else if (m_pRadioExportThenAsk->isChecked())
-        return CloudExportMode_ExportThenAsk;
-    return CloudExportMode_DoNotAsk;
-}
-
-
-/*********************************************************************************************************************************
-*   Class UIWizardExportAppPageBasic2 implementation.                                                                            *
-*********************************************************************************************************************************/
-
-UIWizardExportAppPageBasic2::UIWizardExportAppPageBasic2(bool fExportToOCIByDefault)
-    : UIWizardExportAppPage2(fExportToOCIByDefault)
-    , m_pLabelFormat(0)
-    , m_pLabelSettings(0)
+    , m_pExportModeLabel(0)
+    , m_pExportModeButtonGroup(0)
 {
     /* Create main layout: */
@@ -560,10 +582,7 @@
     {
         /* Create format label: */
-        m_pLabelFormat = new QIRichTextLabel;
+        m_pLabelFormat = new QIRichTextLabel(this);
         if (m_pLabelFormat)
-        {
-            /* Add into layout: */
             pMainLayout->addWidget(m_pLabelFormat);
-        }
 
         /* Create format layout: */
@@ -581,20 +600,17 @@
             m_pFormatLayout->setColumnStretch(1, 1);
 
-            /* Create format combo-box: */
-            m_pFormatComboBox = new QComboBox;
-            if (m_pFormatComboBox)
-            {
-                /* Add into layout: */
-                m_pFormatLayout->addWidget(m_pFormatComboBox, 0, 1);
-            }
             /* Create format combo-box label: */
-            m_pFormatComboBoxLabel = new QLabel;
+            m_pFormatComboBoxLabel = new QLabel(this);
             if (m_pFormatComboBoxLabel)
             {
                 m_pFormatComboBoxLabel->setAlignment(Qt::AlignRight | Qt::AlignTrailing | Qt::AlignVCenter);
+                m_pFormatLayout->addWidget(m_pFormatComboBoxLabel, 0, 0);
+            }
+            /* Create format combo-box: */
+            m_pFormatComboBox = new QIComboBox(this);
+            if (m_pFormatComboBox)
+            {
                 m_pFormatComboBoxLabel->setBuddy(m_pFormatComboBox);
-
-                /* Add into layout: */
-                m_pFormatLayout->addWidget(m_pFormatComboBoxLabel, 0, 0);
+                m_pFormatLayout->addWidget(m_pFormatComboBox, 0, 1);
             }
 
@@ -604,17 +620,14 @@
 
         /* Create settings label: */
-        m_pLabelSettings = new QIRichTextLabel;
+        m_pLabelSettings = new QIRichTextLabel(this);
         if (m_pLabelSettings)
-        {
-            /* Add into layout: */
             pMainLayout->addWidget(m_pLabelSettings);
-        }
 
         /* Create settings layout: */
-        m_pSettingsWidget = new QStackedWidget;
+        m_pSettingsWidget = new QStackedWidget(this);
         if (m_pSettingsWidget)
         {
             /* Create settings pane 1: */
-            QWidget *pSettingsPane1 = new QWidget;
+            QWidget *pSettingsPane1 = new QWidget(m_pSettingsWidget);
             if (pSettingsPane1)
             {
@@ -634,5 +647,5 @@
 
                     /* Create file selector: */
-                    m_pFileSelector = new UIEmptyFilePathSelector;
+                    m_pFileSelector = new UIEmptyFilePathSelector(pSettingsPane1);
                     if (m_pFileSelector)
                     {
@@ -641,68 +654,48 @@
                         m_pFileSelector->setButtonPosition(UIEmptyFilePathSelector::RightPosition);
                         m_pFileSelector->setDefaultSaveExt("ova");
-
-                        /* Add into layout: */
                         m_pSettingsLayout1->addWidget(m_pFileSelector, 0, 1, 1, 2);
                     }
                     /* Create file selector label: */
-                    m_pFileSelectorLabel = new QLabel;
+                    m_pFileSelectorLabel = new QLabel(pSettingsPane1);
                     if (m_pFileSelectorLabel)
                     {
                         m_pFileSelectorLabel->setAlignment(Qt::AlignRight | Qt::AlignTrailing | Qt::AlignVCenter);
                         m_pFileSelectorLabel->setBuddy(m_pFileSelector);
-
-                        /* Add into layout: */
                         m_pSettingsLayout1->addWidget(m_pFileSelectorLabel, 0, 0);
                     }
 
                     /* Create MAC policy combo-box: */
-                    m_pMACComboBox = new QComboBox;
+                    m_pMACComboBox = new QIComboBox(pSettingsPane1);
                     if (m_pMACComboBox)
-                    {
-                        /* Add into layout: */
                         m_pSettingsLayout1->addWidget(m_pMACComboBox, 1, 1, 1, 2);
-                    }
                     /* Create format combo-box label: */
-                    m_pMACComboBoxLabel = new QLabel;
+                    m_pMACComboBoxLabel = new QLabel(pSettingsPane1);
                     if (m_pMACComboBoxLabel)
                     {
                         m_pMACComboBoxLabel->setAlignment(Qt::AlignRight | Qt::AlignTrailing | Qt::AlignVCenter);
                         m_pMACComboBoxLabel->setBuddy(m_pMACComboBox);
-
-                        /* Add into layout: */
                         m_pSettingsLayout1->addWidget(m_pMACComboBoxLabel, 1, 0);
                     }
 
                     /* Create advanced label: */
-                    m_pAdditionalLabel = new QLabel;
+                    m_pAdditionalLabel = new QLabel(pSettingsPane1);
                     if (m_pAdditionalLabel)
                     {
                         m_pAdditionalLabel->setAlignment(Qt::AlignRight | Qt::AlignTrailing | Qt::AlignVCenter);
-
-                        /* Add into layout: */
                         m_pSettingsLayout1->addWidget(m_pAdditionalLabel, 2, 0);
                     }
                     /* Create manifest check-box: */
-                    m_pManifestCheckbox = new QCheckBox;
+                    m_pManifestCheckbox = new QCheckBox(pSettingsPane1);
                     if (m_pManifestCheckbox)
-                    {
-                        /* Add into layout: */
                         m_pSettingsLayout1->addWidget(m_pManifestCheckbox, 2, 1);
-                    }
                     /* Create include ISOs check-box: */
-                    m_pIncludeISOsCheckbox = new QCheckBox;
+                    m_pIncludeISOsCheckbox = new QCheckBox(pSettingsPane1);
                     if (m_pIncludeISOsCheckbox)
-                    {
-                        /* Add into layout: */
                         m_pSettingsLayout1->addWidget(m_pIncludeISOsCheckbox, 3, 1);
-                    }
 
                     /* Create placeholder: */
-                    QWidget *pPlaceholder = new QWidget;
+                    QWidget *pPlaceholder = new QWidget(pSettingsPane1);
                     if (pPlaceholder)
-                    {
-                        /* Add into layout: */
                         m_pSettingsLayout1->addWidget(pPlaceholder, 4, 0, 1, 3);
-                    }
                 }
 
@@ -712,5 +705,5 @@
 
             /* Create settings pane 2: */
-            QWidget *pSettingsPane2 = new QWidget;
+            QWidget *pSettingsPane2 = new QWidget(m_pSettingsWidget);
             if (pSettingsPane2)
             {
@@ -732,10 +725,8 @@
 
                     /* Create profile label: */
-                    m_pProfileLabel = new QLabel;
+                    m_pProfileLabel = new QLabel(pSettingsPane2);
                     if (m_pProfileLabel)
                     {
                         m_pProfileLabel->setAlignment(Qt::AlignRight | Qt::AlignTrailing | Qt::AlignVCenter);
-
-                        /* Add into layout: */
                         m_pSettingsLayout2->addWidget(m_pProfileLabel, 0, 0);
                     }
@@ -748,20 +739,16 @@
 
                         /* Create profile combo-box: */
-                        m_pProfileComboBox = new QComboBox;
+                        m_pProfileComboBox = new QIComboBox(pSettingsPane2);
                         if (m_pProfileComboBox)
                         {
                             m_pProfileLabel->setBuddy(m_pProfileComboBox);
-
-                            /* Add into layout: */
                             pSubLayout->addWidget(m_pProfileComboBox);
                         }
                         /* Create profile tool-button: */
-                        m_pProfileToolButton = new QIToolButton;
+                        m_pProfileToolButton = new QIToolButton(pSettingsPane2);
                         if (m_pProfileToolButton)
                         {
                             m_pProfileToolButton->setIcon(UIIconPool::iconSet(":/cloud_profile_manager_16px.png",
                                                                               ":/cloud_profile_manager_disabled_16px.png"));
-
-                            /* Add into layout: */
                             pSubLayout->addWidget(m_pProfileToolButton);
                         }
@@ -772,32 +759,36 @@
 
                     /* Create profile label: */
-                    m_pMachineLabel = new QLabel;
-                    if (m_pMachineLabel)
+                    m_pExportModeLabel = new QLabel(pSettingsPane2);
+                    if (m_pExportModeLabel)
                     {
-                        m_pMachineLabel->setAlignment(Qt::AlignRight | Qt::AlignTrailing | Qt::AlignVCenter);
-
-                        /* Add into layout: */
-                        m_pSettingsLayout2->addWidget(m_pMachineLabel, 1, 0);
+                        m_pExportModeLabel->setAlignment(Qt::AlignRight | Qt::AlignTrailing | Qt::AlignVCenter);
+                        m_pSettingsLayout2->addWidget(m_pExportModeLabel, 1, 0);
                     }
-                    /* Create Do Not Ask button: */
-                    m_pRadioDoNotAsk = new QRadioButton;
-                    if (m_pRadioDoNotAsk)
+
+                    /* Create button-group: */
+                    m_pExportModeButtonGroup = new QButtonGroup(pSettingsPane2);
+                    if (m_pExportModeButtonGroup)
                     {
-                        /* Add into layout: */
-                        m_pSettingsLayout2->addWidget(m_pRadioDoNotAsk, 1, 1);
-                    }
-                    /* Create Ask Then Export button: */
-                    m_pRadioAskThenExport = new QRadioButton;
-                    if (m_pRadioAskThenExport)
-                    {
-                        /* Add into layout: */
-                        m_pSettingsLayout2->addWidget(m_pRadioAskThenExport, 2, 1);
-                    }
-                    /* Create Export Then Ask button: */
-                    m_pRadioExportThenAsk = new QRadioButton;
-                    if (m_pRadioExportThenAsk)
-                    {
-                        /* Add into layout: */
-                        m_pSettingsLayout2->addWidget(m_pRadioExportThenAsk, 3, 1);
+                        /* Create Do Not Ask button: */
+                        m_exportModeButtons[CloudExportMode_DoNotAsk] = new QRadioButton(pSettingsPane2);
+                        if (m_exportModeButtons.value(CloudExportMode_DoNotAsk))
+                        {
+                            m_pExportModeButtonGroup->addButton(m_exportModeButtons.value(CloudExportMode_DoNotAsk));
+                            m_pSettingsLayout2->addWidget(m_exportModeButtons.value(CloudExportMode_DoNotAsk), 1, 1);
+                        }
+                        /* Create Ask Then Export button: */
+                        m_exportModeButtons[CloudExportMode_AskThenExport] = new QRadioButton(pSettingsPane2);
+                        if (m_exportModeButtons.value(CloudExportMode_AskThenExport))
+                        {
+                            m_pExportModeButtonGroup->addButton(m_exportModeButtons.value(CloudExportMode_AskThenExport));
+                            m_pSettingsLayout2->addWidget(m_exportModeButtons.value(CloudExportMode_AskThenExport), 2, 1);
+                        }
+                        /* Create Export Then Ask button: */
+                        m_exportModeButtons[CloudExportMode_ExportThenAsk] = new QRadioButton(pSettingsPane2);
+                        if (m_exportModeButtons.value(CloudExportMode_ExportThenAsk))
+                        {
+                            m_pExportModeButtonGroup->addButton(m_exportModeButtons.value(CloudExportMode_ExportThenAsk));
+                            m_pSettingsLayout2->addWidget(m_exportModeButtons.value(CloudExportMode_ExportThenAsk), 3, 1);
+                        }
                     }
                 }
@@ -811,13 +802,4 @@
         }
     }
-
-    /* Populate formats: */
-    populateFormats();
-    /* Populate MAC address policies: */
-    populateMACAddressPolicies();
-    /* Populate profiles: */
-    populateProfiles();
-    /* Populate profile: */
-    populateProfile();
 
     /* Setup connections: */
@@ -828,26 +810,23 @@
     connect(m_pFileSelector, &UIEmptyFilePathSelector::pathChanged,
             this, &UIWizardExportAppPageBasic2::sltHandleFileSelectorChange);
-    connect(m_pFormatComboBox, static_cast<void(QComboBox::*)(int)>(&QComboBox::currentIndexChanged),
+    connect(m_pFormatComboBox, static_cast<void(QIComboBox::*)(int)>(&QIComboBox::currentIndexChanged),
             this, &UIWizardExportAppPageBasic2::sltHandleFormatComboChange);
-    connect(m_pMACComboBox, static_cast<void(QComboBox::*)(int)>(&QComboBox::currentIndexChanged),
+    connect(m_pMACComboBox, static_cast<void(QIComboBox::*)(int)>(&QIComboBox::currentIndexChanged),
             this, &UIWizardExportAppPageBasic2::sltHandleMACAddressExportPolicyComboChange);
-    connect(m_pProfileComboBox, static_cast<void(QComboBox::*)(int)>(&QComboBox::currentIndexChanged),
+    connect(m_pManifestCheckbox, &QCheckBox::stateChanged,
+            this, &UIWizardExportAppPageBasic2::sltHandleManifestCheckBoxChange);
+    connect(m_pIncludeISOsCheckbox, &QCheckBox::stateChanged,
+            this, &UIWizardExportAppPageBasic2::sltHandleIncludeISOsCheckBoxChange);
+    connect(m_pProfileComboBox, static_cast<void(QIComboBox::*)(int)>(&QIComboBox::currentIndexChanged),
             this, &UIWizardExportAppPageBasic2::sltHandleProfileComboChange);
+    connect(m_pExportModeButtonGroup, static_cast<void(QButtonGroup::*)(QAbstractButton*, bool)>(&QButtonGroup::buttonToggled),
+            this, &UIWizardExportAppPageBasic2::sltHandleRadioButtonToggled);
     connect(m_pProfileToolButton, &QIToolButton::clicked,
             this, &UIWizardExportAppPageBasic2::sltHandleProfileButtonClick);
-
-    /* Register fields: */
-    registerField("format", this, "format");
-    registerField("isFormatCloudOne", this, "isFormatCloudOne");
-    registerField("path", this, "path");
-    registerField("macAddressExportPolicy", this, "macAddressExportPolicy");
-    registerField("manifestSelected", this, "manifestSelected");
-    registerField("includeISOsSelected", this, "includeISOsSelected");
-    registerField("providerShortName", this, "providerShortName");
-    registerField("cloudAppliance", this, "cloudAppliance");
-    registerField("client", this, "client");
-    registerField("vsd", this, "vsd");
-    registerField("vsdExportForm", this, "vsdExportForm");
-    registerField("cloudExportMode", this, "cloudExportMode");
+}
+
+UIWizardExportApp *UIWizardExportAppPageBasic2::wizard() const
+{
+    return qobject_cast<UIWizardExportApp*>(UINativeWizardPage::wizard());
 }
 
@@ -859,4 +838,6 @@
     /* Translate objects: */
     m_strDefaultApplianceName = UIWizardExportApp::tr("Appliance");
+    refreshFileSelectorName(m_strFileSelectorName, wizard()->machineNames(), m_strDefaultApplianceName, wizard()->isFormatCloudOne());
+    refreshFileSelectorPath(m_pFileSelector, m_strFileSelectorName, m_strFileSelectorExt, wizard()->isFormatCloudOne());
 
     /* Translate format label: */
@@ -869,4 +850,16 @@
                                "<p>The <b>Oracle Cloud Infrastructure</b> format supports exporting to remote cloud servers only. "
                                "Main virtual disk of each selected machine will be uploaded to remote server.</p>"));
+
+    /* Translate settings label: */
+    if (wizard()->isFormatCloudOne())
+        m_pLabelSettings->setText(UIWizardExportApp::
+                                  tr("<p>Please choose one of cloud service profiles you have registered to export virtual "
+                                     "machines to. It will be used to establish network connection required to upload your "
+                                     "virtual machine files to a remote cloud facility.</p>"));
+    else
+        m_pLabelSettings->setText(UIWizardExportApp::
+                                  tr("<p>Please choose a filename to export the virtual appliance to. Besides that you can "
+                                     "specify a certain amount of options which affects the size and content of resulting "
+                                     "archive.</p>"));
 
     /* Translate file selector: */
@@ -887,5 +880,5 @@
      * We are enumerating starting from 0 for simplicity: */
     for (int i = 0; i < m_pFormatComboBox->count(); ++i)
-        if (isFormatCloudOne(i))
+        if (isFormatCloudOne(m_pFormatComboBox, i))
         {
             m_pFormatComboBox->setItemText(i, m_pFormatComboBox->itemData(i, FormatData_Name).toString());
@@ -903,5 +896,6 @@
             {
                 m_pMACComboBox->setItemText(i, UIWizardExportApp::tr("Include all network adapter MAC addresses"));
-                m_pMACComboBox->setItemData(i, UIWizardExportApp::tr("Include all network adapter MAC addresses in exported appliance archive."), Qt::ToolTipRole);
+                m_pMACComboBox->setItemData(i, UIWizardExportApp::tr("Include all network adapter MAC addresses in exported "
+                                                                     "appliance archive."), Qt::ToolTipRole);
                 break;
             }
@@ -909,5 +903,6 @@
             {
                 m_pMACComboBox->setItemText(i, UIWizardExportApp::tr("Include only NAT network adapter MAC addresses"));
-                m_pMACComboBox->setItemData(i, UIWizardExportApp::tr("Include only NAT network adapter MAC addresses in exported appliance archive."), Qt::ToolTipRole);
+                m_pMACComboBox->setItemData(i, UIWizardExportApp::tr("Include only NAT network adapter MAC addresses in exported "
+                                                                     "appliance archive."), Qt::ToolTipRole);
                 break;
             }
@@ -915,5 +910,6 @@
             {
                 m_pMACComboBox->setItemText(i, UIWizardExportApp::tr("Strip all network adapter MAC addresses"));
-                m_pMACComboBox->setItemData(i, UIWizardExportApp::tr("Strip all network adapter MAC addresses from exported appliance archive."), Qt::ToolTipRole);
+                m_pMACComboBox->setItemData(i, UIWizardExportApp::tr("Strip all network adapter MAC addresses from exported "
+                                                                     "appliance archive."), Qt::ToolTipRole);
                 break;
             }
@@ -927,5 +923,5 @@
     m_pManifestCheckbox->setToolTip(UIWizardExportApp::tr("Create a Manifest file for automatic data integrity checks on import."));
     m_pManifestCheckbox->setText(UIWizardExportApp::tr("&Write Manifest file"));
-    m_pIncludeISOsCheckbox->setToolTip(UIWizardExportApp::tr("Include ISO image files in exported VM archive."));
+    m_pIncludeISOsCheckbox->setToolTip(UIWizardExportApp::tr("Include ISO image files into exported VM archive."));
     m_pIncludeISOsCheckbox->setText(UIWizardExportApp::tr("&Include ISO image files"));
 
@@ -935,8 +931,8 @@
 
     /* Translate option label: */
-    m_pMachineLabel->setText(UIWizardExportApp::tr("Machine Creation:"));
-    m_pRadioDoNotAsk->setText(UIWizardExportApp::tr("Do not ask me about it, leave custom &image for future usage"));
-    m_pRadioAskThenExport->setText(UIWizardExportApp::tr("Ask me about it &before exporting disk as custom image"));
-    m_pRadioExportThenAsk->setText(UIWizardExportApp::tr("Ask me about it &after exporting disk as custom image"));
+    m_pExportModeLabel->setText(UIWizardExportApp::tr("Machine Creation:"));
+    m_exportModeButtons.value(CloudExportMode_DoNotAsk)->setText(UIWizardExportApp::tr("Do not ask me about it, leave custom &image for future usage"));
+    m_exportModeButtons.value(CloudExportMode_AskThenExport)->setText(UIWizardExportApp::tr("Ask me about it &before exporting disk as custom image"));
+    m_exportModeButtons.value(CloudExportMode_ExportThenAsk)->setText(UIWizardExportApp::tr("Ask me about it &after exporting disk as custom image"));
 
     /* Adjust label widths: */
@@ -947,5 +943,5 @@
     labels << m_pAdditionalLabel;
     labels << m_pProfileLabel;
-    labels << m_pMachineLabel;
+    labels << m_pExportModeLabel;
     int iMaxWidth = 0;
     foreach (QWidget *pLabel, labels)
@@ -955,31 +951,26 @@
     m_pSettingsLayout2->setColumnMinimumWidth(0, iMaxWidth);
 
-    /* Refresh file selector name: */
-    refreshFileSelectorName();
-
-    /* Update page appearance: */
-    updatePageAppearance();
-
     /* Update tool-tips: */
-    updateFormatComboToolTip();
-    updateMACAddressExportPolicyComboToolTip();
+    updateFormatComboToolTip(m_pFormatComboBox);
+    updateMACAddressExportPolicyComboToolTip(m_pMACComboBox);
 }
 
 void UIWizardExportAppPageBasic2::initializePage()
 {
+    /* Populate formats: */
+    populateFormats(m_pFormatComboBox, m_fExportToOCIByDefault);
+    /* Populate MAC address policies: */
+    populateMACAddressPolicies(m_pMACComboBox);
     /* Translate page: */
     retranslateUi();
 
-    /* Refresh file selector name: */
-    // refreshFileSelectorName(); already called from retranslateUi();
-    /* Refresh file selector extension: */
-    refreshFileSelectorExtension();
-    /* Refresh manifest check-box access: */
-    refreshManifestCheckBoxAccess();
-    /* Refresh include ISOs check-box access: */
-    refreshIncludeISOsCheckBoxAccess();
-
-    /* Choose default cloud export option: */
-    m_pRadioExportThenAsk->setChecked(true);
+    /* Choose initially focused widget: */
+    if (wizard()->isFormatCloudOne())
+        m_pProfileComboBox->setFocus();
+    else
+        m_pFileSelector->setFocus();
+
+    /* Fetch it, asynchronously: */
+    QMetaObject::invokeMethod(this, "sltHandleFormatComboChange", Qt::QueuedConnection);
 }
 
@@ -990,8 +981,8 @@
 
     /* Check whether there was cloud target selected: */
-    if (isFormatCloudOne())
+    if (wizard()->isFormatCloudOne())
         fResult = m_comCloudProfile.isNotNull();
     else
-        fResult = UICommon::hasAllowedExtension(path().toLower(), OVFFileExts);
+        fResult = UICommon::hasAllowedExtension(wizard()->path().toLower(), OVFFileExts);
 
     /* Return result: */
@@ -1005,13 +996,13 @@
 
     /* Check whether there was cloud target selected: */
-    if (isFormatCloudOne())
-    {
-        /* Create appliance and populate form properties: */
-        populateFormProperties();
-        /* Which are required to continue to the next page: */
-        fResult =    field("cloudAppliance").value<CAppliance>().isNotNull()
-                  && field("client").value<CCloudClient>().isNotNull()
-                  && field("vsd").value<CVirtualSystemDescription>().isNotNull()
-                  && field("vsdExportForm").value<CVirtualSystemDescriptionForm>().isNotNull();
+    if (wizard()->isFormatCloudOne())
+    {
+        /* Update cloud stuff: */
+        updateCloudStuff();
+        /* Which is required to continue to the next page: */
+        fResult =    wizard()->cloudAppliance().isNotNull()
+                  && wizard()->cloudClient().isNotNull()
+                  && wizard()->vsd().isNotNull()
+                  && wizard()->vsdExportForm().isNotNull();
     }
 
@@ -1020,40 +1011,7 @@
 }
 
-void UIWizardExportAppPageBasic2::updatePageAppearance()
-{
-    /* Call to base-class: */
-    UIWizardExportAppPage2::updatePageAppearance();
-
-    /* Update page appearance according to chosen storage-type: */
-    if (isFormatCloudOne())
-    {
-        m_pLabelSettings->setText(UIWizardExportApp::
-                                  tr("<p>Please choose one of cloud service profiles you have registered to export virtual "
-                                     "machines to. It will be used to establish network connection required to upload your "
-                                     "virtual machine files to a remote cloud facility.</p>"));
-        m_pProfileComboBox->setFocus();
-    }
-    else
-    {
-        m_pLabelSettings->setText(UIWizardExportApp::
-                                  tr("<p>Please choose a filename to export the virtual appliance to. Besides that you can "
-                                     "specify a certain amount of options which affects the size and content of resulting "
-                                     "archive.</p>"));
-        m_pFileSelector->setFocus();
-    }
-}
-
 void UIWizardExportAppPageBasic2::sltHandleFormatComboChange()
 {
-    /* Update tool-tip: */
-    updateFormatComboToolTip();
-
-    /* Refresh required settings: */
-    updatePageAppearance();
-    refreshFileSelectorExtension();
-    refreshManifestCheckBoxAccess();
-    refreshIncludeISOsCheckBoxAccess();
-    populateProfiles();
-    populateProfile();
+    updateFormat();
     emit completeChanged();
 }
@@ -1061,9 +1019,10 @@
 void UIWizardExportAppPageBasic2::sltHandleFileSelectorChange()
 {
-    /* Remember changed name, except empty one: */
-    if (!m_pFileSelector->path().isEmpty())
-        m_strFileSelectorName = QFileInfo(m_pFileSelector->path()).completeBaseName();
-
-    /* Refresh required settings: */
+    /* Skip empty paths: */
+    if (m_pFileSelector->path().isEmpty())
+        return;
+
+    m_strFileSelectorName = QFileInfo(m_pFileSelector->path()).completeBaseName();
+    wizard()->setPath(m_pFileSelector->path());
     emit completeChanged();
 }
@@ -1071,12 +1030,36 @@
 void UIWizardExportAppPageBasic2::sltHandleMACAddressExportPolicyComboChange()
 {
-    /* Update tool-tip: */
-    updateMACAddressExportPolicyComboToolTip();
+    updateMACAddressExportPolicyComboToolTip(m_pMACComboBox);
+    wizard()->setMACAddressExportPolicy(m_pMACComboBox->currentData().value<MACAddressExportPolicy>());
+    emit completeChanged();
+}
+
+void UIWizardExportAppPageBasic2::sltHandleManifestCheckBoxChange()
+{
+    wizard()->setManifestSelected(m_pManifestCheckbox->isChecked());
+    emit completeChanged();
+}
+
+void UIWizardExportAppPageBasic2::sltHandleIncludeISOsCheckBoxChange()
+{
+    wizard()->setIncludeISOsSelected(m_pIncludeISOsCheckbox->isChecked());
+    emit completeChanged();
 }
 
 void UIWizardExportAppPageBasic2::sltHandleProfileComboChange()
 {
-    /* Refresh required settings: */
-    populateProfile();
+    updateProfile();
+    emit completeChanged();
+}
+
+void UIWizardExportAppPageBasic2::sltHandleRadioButtonToggled(QAbstractButton *pButton, bool fToggled)
+{
+    /* Handle checked buttons only: */
+    if (!fToggled)
+        return;
+
+    /* Update cloud export mode field value: */
+    wizard()->setCloudExportMode(m_exportModeButtons.key(pButton));
+    emit completeChanged();
 }
 
@@ -1087,2 +1070,59 @@
         gpManager->openCloudProfileManager();
 }
+
+void UIWizardExportAppPageBasic2::updateFormat()
+{
+    /* Update combo tool-tip: */
+    updateFormatComboToolTip(m_pFormatComboBox);
+
+    /* Update wizard fields: */
+    wizard()->setFormat(format(m_pFormatComboBox));
+    wizard()->setFormatCloudOne(isFormatCloudOne(m_pFormatComboBox));
+
+    /* Refresh settings widget state: */
+    refreshStackedWidget(m_pSettingsWidget, wizard()->isFormatCloudOne());
+
+    /* Update export settings: */
+    refreshFileSelectorExtension(m_strFileSelectorExt, m_pFileSelector, wizard()->isFormatCloudOne());
+    refreshFileSelectorPath(m_pFileSelector, m_strFileSelectorName, m_strFileSelectorExt, wizard()->isFormatCloudOne());
+    refreshManifestCheckBoxAccess(m_pManifestCheckbox, wizard()->isFormatCloudOne());
+    refreshIncludeISOsCheckBoxAccess(m_pIncludeISOsCheckbox, wizard()->isFormatCloudOne());
+    refreshProfileCombo(m_pProfileComboBox, wizard()->format(), wizard()->isFormatCloudOne());
+    refreshCloudExportMode(m_exportModeButtons, wizard()->isFormatCloudOne());
+
+    /* Update profile: */
+    updateProfile();
+}
+
+void UIWizardExportAppPageBasic2::updateProfile()
+{
+    /* Update wizard fields: */
+    wizard()->setProfileName(profileName(m_pProfileComboBox));
+
+    /* Update export settings: */
+    refreshCloudProfile(m_comCloudProfile,
+                        wizard()->format(),
+                        wizard()->profileName(),
+                        wizard()->isFormatCloudOne());
+}
+
+void UIWizardExportAppPageBasic2::updateCloudStuff()
+{
+    /* Create appliance, client, VSD and VSD export form: */
+    CAppliance comAppliance;
+    CCloudClient comClient;
+    CVirtualSystemDescription comDescription;
+    CVirtualSystemDescriptionForm comForm;
+    refreshCloudStuff(comAppliance,
+                      comClient,
+                      comDescription,
+                      comForm,
+                      m_comCloudProfile,
+                      wizard()->machineIDs(),
+                      wizard()->uri(),
+                      wizard()->cloudExportMode());
+    wizard()->setCloudAppliance(comAppliance);
+    wizard()->setCloudClient(comClient);
+    wizard()->setVsd(comDescription);
+    wizard()->setVsdExportForm(comForm);
+}
Index: /trunk/src/VBox/Frontends/VirtualBox/src/wizards/exportappliance/UIWizardExportAppPageBasic2.h
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/wizards/exportappliance/UIWizardExportAppPageBasic2.h	(revision 91367)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/wizards/exportappliance/UIWizardExportAppPageBasic2.h	(revision 91368)
@@ -5,5 +5,5 @@
 
 /*
- * Copyright (C) 2009-2020 Oracle Corporation
+ * Copyright (C) 2009-2021 Oracle Corporation
  *
  * This file is part of VirtualBox Open Source Edition (OSE), as
@@ -22,10 +22,7 @@
 #endif
 
-/* Qt includes: */
-#include <QVariant>
-
 /* GUI includes: */
-#include "UIApplianceEditorWidget.h"
-#include "UIWizardPage.h"
+#include "UINativeWizardPage.h"
+#include "UIWizardExportApp.h"
 
 /* COM includes: */
@@ -34,40 +31,25 @@
 #include "CCloudClient.h"
 #include "CCloudProfile.h"
-#include "CCloudProvider.h"
-#include "CCloudProviderManager.h"
 #include "CVirtualSystemDescription.h"
 #include "CVirtualSystemDescriptionForm.h"
 
 /* Forward declarations: */
+class QAbstractButton;
+class QButtonGroup;
 class QCheckBox;
-class QComboBox;
 class QGridLayout;
 class QLabel;
-class QLineEdit;
-class QRadioButton;
 class QStackedWidget;
-class QTableWidget;
+class QIComboBox;
 class QIRichTextLabel;
 class QIToolButton;
 class UIEmptyFilePathSelector;
 
-
-/** MAC address export policies. */
-enum MACAddressExportPolicy
-{
-    MACAddressExportPolicy_KeepAllMACs,
-    MACAddressExportPolicy_StripAllNonNATMACs,
-    MACAddressExportPolicy_StripAllMACs,
-    MACAddressExportPolicy_MAX
-};
-Q_DECLARE_METATYPE(MACAddressExportPolicy);
-
 /** Format combo data fields. */
 enum
 {
-    FormatData_ID              = Qt::UserRole + 1,
-    FormatData_Name            = Qt::UserRole + 2,
-    FormatData_ShortName       = Qt::UserRole + 3,
-    FormatData_IsItCloudFormat = Qt::UserRole + 4
+    FormatData_Name            = Qt::UserRole + 1,
+    FormatData_ShortName       = Qt::UserRole + 2,
+    FormatData_IsItCloudFormat = Qt::UserRole + 3
 };
 
@@ -78,120 +60,143 @@
 };
 
-/** Cloud export option modes. */
-enum CloudExportMode
-{
-    CloudExportMode_Invalid,
-    CloudExportMode_AskThenExport,
-    CloudExportMode_ExportThenAsk,
-    CloudExportMode_DoNotAsk
-};
-Q_DECLARE_METATYPE(CloudExportMode);
-
-
-/** UIWizardPageBase extension for 2nd page of the Export Appliance wizard. */
-class UIWizardExportAppPage2 : public UIWizardPageBase
-{
+/** Namespace for 2nd basic page of the Export Appliance wizard. */
+namespace UIWizardExportAppPage2
+{
+    /** Populates formats. */
+    void populateFormats(QIComboBox *pCombo, bool fExportToOCIByDefault);
+    /** Populates MAC address policies. */
+    void populateMACAddressPolicies(QIComboBox *pCombo);
+
+    /** Returns current format of @a pCombo specified. */
+    QString format(QIComboBox *pCombo);
+    /** Returns whether format under certain @a iIndex is cloud one. */
+    bool isFormatCloudOne(QIComboBox *pCombo, int iIndex = -1);
+
+    /** Refresh stacked widget. */
+    void refreshStackedWidget(QStackedWidget *pStackedWidget,
+                              bool fIsFormatCloudOne);
+
+    /** Refresh file selector name. */
+    void refreshFileSelectorName(QString &strFileSelectorName,
+                                 const QStringList &machineNames,
+                                 const QString &strDefaultApplianceName,
+                                 bool fIsFormatCloudOne);
+    /** Refresh file selector extension. */
+    void refreshFileSelectorExtension(QString &strFileSelectorExt,
+                                      UIEmptyFilePathSelector *pFileSelector,
+                                      bool fIsFormatCloudOne);
+    /** Refresh file selector path. */
+    void refreshFileSelectorPath(UIEmptyFilePathSelector *pFileSelector,
+                                 const QString &strFileSelectorName,
+                                 const QString &strFileSelectorExt,
+                                 bool fIsFormatCloudOne);
+    /** Refresh Manifest check-box access. */
+    void refreshManifestCheckBoxAccess(QCheckBox *pCheckBox,
+                                       bool fIsFormatCloudOne);
+    /** Refresh Include ISOs check-box access. */
+    void refreshIncludeISOsCheckBoxAccess(QCheckBox *pCheckBox,
+                                          bool fIsFormatCloudOne);
+
+    /** Refresh profile combo. */
+    void refreshProfileCombo(QIComboBox *pCombo,
+                             const QString &strFormat,
+                             bool fIsFormatCloudOne);
+    /** Refresh cloud profile. */
+    void refreshCloudProfile(CCloudProfile &comCloudProfile,
+                             const QString &strShortProviderName,
+                             const QString &strProfileName,
+                             bool fIsFormatCloudOne);
+    /** Refresh cloud export mode. */
+    void refreshCloudExportMode(const QMap<CloudExportMode, QAbstractButton*> &radios,
+                                bool fIsFormatCloudOne);
+    /** Refresh cloud stuff. */
+    void refreshCloudStuff(CAppliance &comCloudAppliance,
+                           CCloudClient &comCloudClient,
+                           CVirtualSystemDescription &comCloudVsd,
+                           CVirtualSystemDescriptionForm &comCloudVsdExportForm,
+                           const CCloudProfile &comCloudProfile,
+                           const QList<QUuid> &machineIDs,
+                           const QString &strUri,
+                           const CloudExportMode enmCloudExportMode);
+
+    /** Returns current profile name of @a pCombo specified. */
+    QString profileName(QIComboBox *pCombo);
+    /** Returns current cloud export mode chosen in @a radioButtons specified. */
+    CloudExportMode cloudExportMode(const QMap<CloudExportMode, QAbstractButton*> &radioButtons);
+
+    /** Updates format combo tool-tips. */
+    void updateFormatComboToolTip(QIComboBox *pCombo);
+    /** Updates MAC address export policy combo tool-tips. */
+    void updateMACAddressExportPolicyComboToolTip(QIComboBox *pCombo);
+}
+
+/** UINativeWizardPage extension for 2nd basic page of the Export Appliance wizard,
+  * based on UIWizardAddCloudVMPage2 namespace functions. */
+class UIWizardExportAppPageBasic2 : public UINativeWizardPage
+{
+    Q_OBJECT;
+
+public:
+
+    /** Constructs 2nd basic page. */
+    UIWizardExportAppPageBasic2(bool fExportToOCIByDefault);
+
 protected:
 
-    /** Constructs 2nd page base. */
-    UIWizardExportAppPage2(bool fExportToOCIByDefault);
-
-    /** Populates formats. */
-    void populateFormats();
-    /** Populates MAC address policies. */
-    void populateMACAddressPolicies();
-    /** Populates profiles. */
-    void populateProfiles();
-    /** Populates profile. */
-    void populateProfile();
-    /** Populates form properties. */
-    void populateFormProperties();
-
-    /** Updates page appearance. */
-    virtual void updatePageAppearance();
-
-    /** Refresh file selector name. */
-    void refreshFileSelectorName();
-    /** Refresh file selector extension. */
-    void refreshFileSelectorExtension();
-    /** Refresh file selector path. */
-    void refreshFileSelectorPath();
-    /** Refresh Manifest check-box access. */
-    void refreshManifestCheckBoxAccess();
-    /** Refresh Include ISOs check-box access. */
-    void refreshIncludeISOsCheckBoxAccess();
-
-    /** Updates format combo tool-tips. */
-    void updateFormatComboToolTip();
-    /** Updates MAC address export policy combo tool-tips. */
-    void updateMACAddressExportPolicyComboToolTip();
-
-    /** Defines @a strFormat. */
-    void setFormat(const QString &strFormat);
-    /** Returns format. */
-    QString format() const;
-    /** Returns whether format under certain @a iIndex is cloud one. */
-    bool isFormatCloudOne(int iIndex = -1) const;
-
-    /** Defines @a strPath. */
-    void setPath(const QString &strPath);
-    /** Returns path. */
-    QString path() const;
-
-    /** Defines @a enmMACAddressExportPolicy. */
-    void setMACAddressExportPolicy(MACAddressExportPolicy enmMACAddressExportPolicy);
-    /** Returns MAC address export policy. */
-    MACAddressExportPolicy macAddressExportPolicy() const;
-
-    /** Defines whether manifest @a fSelected. */
-    void setManifestSelected(bool fChecked);
-    /** Returns whether manifest selected. */
-    bool isManifestSelected() const;
-
-    /** Defines whether include ISOs @a fSelected. */
-    void setIncludeISOsSelected(bool fChecked);
-    /** Returns whether include ISOs selected. */
-    bool isIncludeISOsSelected() const;
-
-    /** Defines provider by @a uId. */
-    void setProviderById(const QUuid &uId);
-    /** Returns provider ID. */
-    QUuid providerId() const;
-    /** Returns provider short name. */
-    QString providerShortName() const;
-    /** Returns profile name. */
-    QString profileName() const;
-    /** Returns Cloud Appliance object. */
-    CAppliance cloudAppliance() const;
-    /** Returns Cloud Client object. */
-    CCloudClient client() const;
-    /** Returns Virtual System Description object. */
-    CVirtualSystemDescription vsd() const;
-    /** Returns Virtual System Description Export Form object. */
-    CVirtualSystemDescriptionForm vsdExportForm() const;
-    /** Returns cloud export mode. */
-    CloudExportMode cloudExportMode() const;
+    /** Returns wizard this page belongs to. */
+    UIWizardExportApp *wizard() const;
+
+    /** Handles translation event. */
+    virtual void retranslateUi() /* override */;
+
+    /** Performs page initialization. */
+    virtual void initializePage() /* override */;
+
+    /** Returns whether page is complete. */
+    virtual bool isComplete() const /* override */;
+
+    /** Performs page validation. */
+    virtual bool validatePage() /* override */;
+
+private slots:
+
+    /** Handles change in format combo-box. */
+    void sltHandleFormatComboChange();
+
+    /** Handles change in file-name selector. */
+    void sltHandleFileSelectorChange();
+
+    /** Handles change in MAC address export policy combo-box. */
+    void sltHandleMACAddressExportPolicyComboChange();
+
+    /** Handles change in manifest check-box. */
+    void sltHandleManifestCheckBoxChange();
+
+    /** Handles change in include ISOs check-box. */
+    void sltHandleIncludeISOsCheckBoxChange();
+
+    /** Handles change in profile combo-box. */
+    void sltHandleProfileComboChange();
+
+    /** Handles cloud export radio-button clicked. */
+    void sltHandleRadioButtonToggled(QAbstractButton *pButton, bool fToggled);
+
+    /** Handles profile tool-button click. */
+    void sltHandleProfileButtonClick();
+
+private:
+
+    /** Updates format. */
+    void updateFormat();
+    /** Updates profile. */
+    void updateProfile();
+    /** Updates cloud stuff. */
+    void updateCloudStuff();
 
     /** Holds whether default format should be Export to OCI. */
     bool  m_fExportToOCIByDefault;
 
-    /** Holds the Cloud Provider Manager reference. */
-    CCloudProviderManager          m_comCloudProviderManager;
-    /** Holds the Cloud Provider object reference. */
-    CCloudProvider                 m_comCloudProvider;
-    /** Holds the Cloud Profile object reference. */
-    CCloudProfile                  m_comCloudProfile;
-    /** Holds the Appliance object reference. */
-    CAppliance                     m_comAppliance;
-    /** Holds the Cloud Client object reference. */
-    CCloudClient                   m_comClient;
-    /** Holds the Virtual System Description object reference. */
-    CVirtualSystemDescription      m_comVSD;
-    /** Holds the Virtual System Description Export Form object reference. */
-    CVirtualSystemDescriptionForm  m_comVSDExportForm;
-
     /** Holds the default appliance name. */
     QString  m_strDefaultApplianceName;
-
     /** Holds the file selector name. */
     QString  m_strFileSelectorName;
@@ -199,125 +204,56 @@
     QString  m_strFileSelectorExt;
 
+    /** Holds the Cloud Profile object instance. */
+    CCloudProfile  m_comCloudProfile;
+
+
+    /** Holds the format label instance. */
+    QIRichTextLabel *m_pLabelFormat;
+    /** Holds the settings label instance. */
+    QIRichTextLabel *m_pLabelSettings;
+
     /** Holds the format layout. */
     QGridLayout *m_pFormatLayout;
-    /** Holds the settings layout 1. */
-    QGridLayout *m_pSettingsLayout1;
-    /** Holds the settings layout 2. */
-    QGridLayout *m_pSettingsLayout2;
-
     /** Holds the format combo-box label instance. */
-    QLabel    *m_pFormatComboBoxLabel;
+    QLabel      *m_pFormatComboBoxLabel;
     /** Holds the format combo-box instance. */
-    QComboBox *m_pFormatComboBox;
+    QIComboBox  *m_pFormatComboBox;
 
     /** Holds the settings widget instance. */
     QStackedWidget *m_pSettingsWidget;
 
+    /** Holds the settings layout 1. */
+    QGridLayout             *m_pSettingsLayout1;
     /** Holds the file selector label instance. */
     QLabel                  *m_pFileSelectorLabel;
     /** Holds the file selector instance. */
     UIEmptyFilePathSelector *m_pFileSelector;
-
     /** Holds the MAC address policy combo-box label instance. */
-    QLabel    *m_pMACComboBoxLabel;
+    QLabel                  *m_pMACComboBoxLabel;
     /** Holds the MAC address policy check-box instance. */
-    QComboBox *m_pMACComboBox;
-
+    QIComboBox              *m_pMACComboBox;
     /** Holds the additional label instance. */
-    QLabel    *m_pAdditionalLabel;
+    QLabel                  *m_pAdditionalLabel;
     /** Holds the manifest check-box instance. */
-    QCheckBox *m_pManifestCheckbox;
+    QCheckBox               *m_pManifestCheckbox;
     /** Holds the include ISOs check-box instance. */
-    QCheckBox *m_pIncludeISOsCheckbox;
-
+    QCheckBox               *m_pIncludeISOsCheckbox;
+
+    /** Holds the settings layout 2. */
+    QGridLayout   *m_pSettingsLayout2;
     /** Holds the profile label instance. */
-    QLabel       *m_pProfileLabel;
+    QLabel        *m_pProfileLabel;
     /** Holds the profile combo-box instance. */
-    QComboBox    *m_pProfileComboBox;
+    QIComboBox    *m_pProfileComboBox;
     /** Holds the profile management tool-button instance. */
-    QIToolButton *m_pProfileToolButton;
-
-    /** Holds the machine label instance. */
-    QLabel       *m_pMachineLabel;
-    /** Holds the don't ask radio button instance. */
-    QRadioButton *m_pRadioDoNotAsk;
-    /** Holds the ask then export radio button instance. */
-    QRadioButton *m_pRadioAskThenExport;
-    /** Holds the export then ask radio button instance. */
-    QRadioButton *m_pRadioExportThenAsk;
+    QIToolButton  *m_pProfileToolButton;
+
+    /** Holds the export mode label instance. */
+    QLabel                                  *m_pExportModeLabel;
+    /** Holds the export mode button group instance. */
+    QButtonGroup                            *m_pExportModeButtonGroup;
+    /** Holds the map of export mode button instances. */
+    QMap<CloudExportMode, QAbstractButton*>  m_exportModeButtons;
 };
 
-
-/** UIWizardPage extension for 2nd page of the Export Appliance wizard, extends UIWizardExportAppPage2 as well. */
-class UIWizardExportAppPageBasic2 : public UIWizardPage, public UIWizardExportAppPage2
-{
-    Q_OBJECT;
-    Q_PROPERTY(QString format READ format WRITE setFormat);
-    Q_PROPERTY(bool isFormatCloudOne READ isFormatCloudOne);
-    Q_PROPERTY(QString path READ path WRITE setPath);
-    Q_PROPERTY(MACAddressExportPolicy macAddressExportPolicy READ macAddressExportPolicy WRITE setMACAddressExportPolicy);
-    Q_PROPERTY(bool manifestSelected READ isManifestSelected WRITE setManifestSelected);
-    Q_PROPERTY(bool includeISOsSelected READ isIncludeISOsSelected WRITE setIncludeISOsSelected);
-    Q_PROPERTY(QString providerShortName READ providerShortName);
-    Q_PROPERTY(CAppliance cloudAppliance READ cloudAppliance);
-    Q_PROPERTY(CCloudClient client READ client);
-    Q_PROPERTY(CVirtualSystemDescription vsd READ vsd);
-    Q_PROPERTY(CVirtualSystemDescriptionForm vsdExportForm READ vsdExportForm);
-    Q_PROPERTY(CloudExportMode cloudExportMode READ cloudExportMode);
-
-public:
-
-    /** Constructs 2nd basic page. */
-    UIWizardExportAppPageBasic2(bool fExportToOCIByDefault);
-
-protected:
-
-    /** Allows access wizard from base part. */
-    UIWizard *wizardImp() const { return UIWizardPage::wizard(); }
-    /** Allows access page from base part. */
-    UIWizardPage* thisImp() { return this; }
-    /** Allows access wizard-field from base part. */
-    QVariant fieldImp(const QString &strFieldName) const { return UIWizardPage::field(strFieldName); }
-
-    /** Handles translation event. */
-    virtual void retranslateUi() /* override */;
-
-    /** Performs page initialization. */
-    virtual void initializePage() /* override */;
-
-    /** Returns whether page is complete. */
-    virtual bool isComplete() const /* override */;
-
-    /** Performs page validation. */
-    virtual bool validatePage() /* override */;
-
-    /** Updates page appearance. */
-    virtual void updatePageAppearance() /* override */;
-
-private slots:
-
-    /** Handles change in format combo-box. */
-    void sltHandleFormatComboChange();
-
-    /** Handles change in file-name selector. */
-    void sltHandleFileSelectorChange();
-
-    /** Handles change in MAC address export policy combo-box. */
-    void sltHandleMACAddressExportPolicyComboChange();
-
-    /** Handles change in profile combo-box. */
-    void sltHandleProfileComboChange();
-
-    /** Handles profile tool-button click. */
-    void sltHandleProfileButtonClick();
-
-private:
-
-    /** Holds the format label instance. */
-    QIRichTextLabel *m_pLabelFormat;
-
-    /** Holds the settings label instance. */
-    QIRichTextLabel *m_pLabelSettings;
-};
-
 #endif /* !FEQT_INCLUDED_SRC_wizards_exportappliance_UIWizardExportAppPageBasic2_h */
Index: /trunk/src/VBox/Frontends/VirtualBox/src/wizards/exportappliance/UIWizardExportAppPageBasic3.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/wizards/exportappliance/UIWizardExportAppPageBasic3.cpp	(revision 91367)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/wizards/exportappliance/UIWizardExportAppPageBasic3.cpp	(revision 91368)
@@ -5,5 +5,5 @@
 
 /*
- * Copyright (C) 2009-2020 Oracle Corporation
+ * Copyright (C) 2009-2021 Oracle Corporation
  *
  * This file is part of VirtualBox Open Source Edition (OSE), as
@@ -25,4 +25,5 @@
 #include "UIApplianceExportEditorWidget.h"
 #include "UICommon.h"
+#include "UIFormEditorWidget.h"
 #include "UIMessageCenter.h"
 #include "UIWizardExportApp.h"
@@ -33,4 +34,7 @@
 #include "CVirtualSystemDescriptionForm.h"
 
+/* Namespaces: */
+using namespace UIWizardExportAppPage3;
+
 
 /*********************************************************************************************************************************
@@ -38,27 +42,26 @@
 *********************************************************************************************************************************/
 
-UIWizardExportAppPage3::UIWizardExportAppPage3()
-    : m_pSettingsCntLayout(0)
-    , m_pApplianceWidget(0)
-{
-}
-
-void UIWizardExportAppPage3::updatePageAppearance()
-{
-    /* Check whether there was cloud target selected: */
-    const bool fIsFormatCloudOne = fieldImp("isFormatCloudOne").toBool();
-    /* Update page appearance according to chosen source: */
-    m_pSettingsCntLayout->setCurrentIndex((int)fIsFormatCloudOne);
-}
-
-void UIWizardExportAppPage3::refreshApplianceSettingsWidget()
-{
+void UIWizardExportAppPage3::refreshStackedLayout(QStackedLayout *pStackedLayout,
+                                                  bool fIsFormatCloudOne)
+{
+    /* Update stack appearance according to chosen format: */
+    pStackedLayout->setCurrentIndex((int)fIsFormatCloudOne);
+}
+
+void UIWizardExportAppPage3::refreshApplianceSettingsWidget(UIApplianceExportEditorWidget *pApplianceWidget,
+                                                            const QList<QUuid> &machineIDs,
+                                                            const QString &strUri,
+                                                            bool fIsFormatCloudOne)
+{
+    /* Nothing for cloud case? */
+    if (fIsFormatCloudOne)
+        return;
+
     /* Acquire appliance: */
-    CAppliance *pAppliance = m_pApplianceWidget->init();
+    CAppliance *pAppliance = pApplianceWidget->init();
     if (pAppliance->isOk())
     {
         /* Iterate over all the selected machine uuids: */
-        const QList<QUuid> uuids = fieldImp("machineIDs").value<QList<QUuid> >();
-        foreach (const QUuid &uMachineId, uuids)
+        foreach (const QUuid &uMachineId, machineIDs)
         {
             /* Get the machine with the uMachineId: */
@@ -68,5 +71,5 @@
             {
                 /* Add the export description to our appliance object: */
-                CVirtualSystemDescription comVsd = comMachine.ExportTo(*pAppliance, qobject_cast<UIWizardExportApp*>(wizardImp())->uri());
+                CVirtualSystemDescription comVsd = comMachine.ExportTo(*pAppliance, strUri);
                 if (comMachine.isOk() && comVsd.isNotNull())
                 {
@@ -80,5 +83,5 @@
                 }
                 else
-                    return msgCenter().cannotExportAppliance(comMachine, pAppliance->GetPath(), thisImp());
+                    return msgCenter().cannotExportAppliance(comMachine, pAppliance->GetPath());
             }
             else
@@ -86,21 +89,19 @@
         }
         /* Make sure the settings widget get the new descriptions: */
-        m_pApplianceWidget->populate();
-    }
-}
-
-void UIWizardExportAppPage3::refreshFormPropertiesTable()
-{
-    /* Acquire VSD form: */
-    CVirtualSystemDescriptionForm comForm = fieldImp("vsdExportForm").value<CVirtualSystemDescriptionForm>();
+        pApplianceWidget->populate();
+    }
+}
+
+void UIWizardExportAppPage3::refreshFormPropertiesTable(UIFormEditorWidget *pFormEditor,
+                                                        const CVirtualSystemDescriptionForm &comVsdExportForm,
+                                                        bool fIsFormatCloudOne)
+{
+    /* Nothing for local case? */
+    if (!fIsFormatCloudOne)
+        return;
+
     /* Make sure the properties table get the new description form: */
-    if (comForm.isNotNull())
-        m_pFormEditor->setVirtualSystemDescriptionForm(comForm);
-}
-
-CAppliance UIWizardExportAppPage3::localAppliance() const
-{
-    CAppliance *pAppliance = m_pApplianceWidget->appliance();
-    return pAppliance ? *pAppliance : CAppliance();
+    if (comVsdExportForm.isNotNull())
+        pFormEditor->setVirtualSystemDescriptionForm(comVsdExportForm);
 }
 
@@ -117,14 +118,11 @@
     {
         /* Create label: */
-        m_pLabel = new QIRichTextLabel;
+        m_pLabel = new QIRichTextLabel(this);
         if (m_pLabel)
-        {
-            /* Add into layout: */
             pMainLayout->addWidget(m_pLabel);
-        }
 
         /* Create settings container layout: */
-        m_pSettingsCntLayout = new QStackedLayout;
-        if (m_pSettingsCntLayout)
+        m_pSettingsLayout = new QStackedLayout(this);
+        if (m_pSettingsLayout)
         {
             /* Create appliance widget container: */
@@ -139,10 +137,8 @@
 
                     /* Create appliance widget: */
-                    m_pApplianceWidget = new UIApplianceExportEditorWidget;
+                    m_pApplianceWidget = new UIApplianceExportEditorWidget(pApplianceWidgetCnt);
                     if (m_pApplianceWidget)
                     {
                         m_pApplianceWidget->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::MinimumExpanding);
-
-                        /* Add into layout: */
                         pApplianceWidgetLayout->addWidget(m_pApplianceWidget);
                     }
@@ -150,5 +146,5 @@
 
                 /* Add into layout: */
-                m_pSettingsCntLayout->addWidget(pApplianceWidgetCnt);
+                m_pSettingsLayout->addWidget(pApplianceWidgetCnt);
             }
 
@@ -166,21 +162,20 @@
                     m_pFormEditor = new UIFormEditorWidget(pFormEditorCnt);
                     if (m_pFormEditor)
-                    {
-                        /* Add into layout: */
                         pFormEditorLayout->addWidget(m_pFormEditor);
-                    }
                 }
 
                 /* Add into layout: */
-                m_pSettingsCntLayout->addWidget(pFormEditorCnt);
+                m_pSettingsLayout->addWidget(pFormEditorCnt);
             }
 
             /* Add into layout: */
-            pMainLayout->addLayout(m_pSettingsCntLayout);
+            pMainLayout->addLayout(m_pSettingsLayout);
         }
     }
-
-    /* Register fields: */
-    registerField("localAppliance", this, "localAppliance");
+}
+
+UIWizardExportApp *UIWizardExportAppPageBasic3::wizard() const
+{
+    return qobject_cast<UIWizardExportApp*>(UINativeWizardPage::wizard());
 }
 
@@ -190,6 +185,12 @@
     setTitle(UIWizardExportApp::tr("Virtual system settings"));
 
-    /* Update page appearance: */
-    updatePageAppearance();
+    /* Translate label: */
+    if (wizard()->isFormatCloudOne())
+        m_pLabel->setText(UIWizardExportApp::tr("This is the descriptive information which will be used to determine settings "
+                                                "for a cloud storage your VM being exported to.  You can change it by double "
+                                                "clicking on individual lines."));
+    else
+        m_pLabel->setText(UIWizardExportApp::tr("This is the descriptive information which will be added to the virtual "
+                                                "appliance.  You can change it by double clicking on individual lines."));
 }
 
@@ -199,25 +200,15 @@
     retranslateUi();
 
-    /* Check whether there was cloud target selected: */
-    const bool fIsFormatCloudOne = field("isFormatCloudOne").toBool();
-    if (fIsFormatCloudOne)
-        refreshFormPropertiesTable();
+    /* Refresh settings layout state: */
+    refreshStackedLayout(m_pSettingsLayout, wizard()->isFormatCloudOne());
+    /* Refresh corresponding widgets: */
+    refreshApplianceSettingsWidget(m_pApplianceWidget, wizard()->machineIDs(), wizard()->uri(), wizard()->isFormatCloudOne());
+    refreshFormPropertiesTable(m_pFormEditor, wizard()->vsdExportForm(), wizard()->isFormatCloudOne());
+
+    /* Choose initially focused widget: */
+    if (wizard()->isFormatCloudOne())
+        m_pFormEditor->setFocus();
     else
-        refreshApplianceSettingsWidget();
-
-    /* Listen for custom button clicks: */
-    connect(wizard(), &UIWizard::customButtonClicked,
-            this, &UIWizardExportAppPageBasic3::sltHandleCustomButtonClicked,
-            Qt::UniqueConnection);
-}
-
-void UIWizardExportAppPageBasic3::cleanupPage()
-{
-    /* Call to base-class: */
-    UIWizardPage::cleanupPage();
-
-    /* Stop listen for custom button clicks: */
-    disconnect(wizard(), &UIWizard::customButtonClicked,
-               this, &UIWizardExportAppPageBasic3::sltHandleCustomButtonClicked);
+        m_pApplianceWidget->setFocus();
 }
 
@@ -227,10 +218,6 @@
     bool fResult = true;
 
-    /* Lock finish button: */
-    startProcessing();
-
     /* Check whether there was cloud target selected: */
-    const bool fIsFormatCloudOne = fieldImp("isFormatCloudOne").toBool();
-    if (fIsFormatCloudOne)
+    if (wizard()->isFormatCloudOne())
     {
         /* Make sure table has own data committed: */
@@ -238,5 +225,5 @@
 
         /* Check whether we have proper VSD form: */
-        CVirtualSystemDescriptionForm comForm = fieldImp("vsdExportForm").value<CVirtualSystemDescriptionForm>();
+        CVirtualSystemDescriptionForm comForm = wizard()->vsdExportForm();
         fResult = comForm.isNotNull();
         Assert(fResult);
@@ -256,46 +243,12 @@
         /* Prepare export: */
         m_pApplianceWidget->prepareExport();
+        wizard()->setLocalAppliance(*m_pApplianceWidget->appliance());
     }
 
     /* Try to export appliance: */
     if (fResult)
-        fResult = qobject_cast<UIWizardExportApp*>(wizard())->exportAppliance();
-
-    /* Unlock finish button: */
-    endProcessing();
+        fResult = wizard()->exportAppliance();
 
     /* Return result: */
     return fResult;
 }
-
-void UIWizardExportAppPageBasic3::updatePageAppearance()
-{
-    /* Call to base-class: */
-    UIWizardExportAppPage3::updatePageAppearance();
-
-    /* Check whether there was cloud target selected: */
-    const bool fIsFormatCloudOne = field("isFormatCloudOne").toBool();
-    if (fIsFormatCloudOne)
-    {
-        m_pLabel->setText(UIWizardExportApp::tr("This is the descriptive information which will be used to determine settings "
-                                                "for a cloud storage your VM being exported to.  You can change it by double "
-                                                "clicking on individual lines."));
-        m_pFormEditor->setFocus();
-    }
-    else
-    {
-        m_pLabel->setText(UIWizardExportApp::tr("This is the descriptive information which will be added to the virtual "
-                                                "appliance.  You can change it by double clicking on individual lines."));
-        m_pApplianceWidget->setFocus();
-    }
-}
-
-void UIWizardExportAppPageBasic3::sltHandleCustomButtonClicked(int iId)
-{
-    /* Handle 2nd button: */
-    if (iId == QWizard::CustomButton2)
-    {
-        /* Reset widget to default: */
-        m_pApplianceWidget->restoreDefaults();
-    }
-}
Index: /trunk/src/VBox/Frontends/VirtualBox/src/wizards/exportappliance/UIWizardExportAppPageBasic3.h
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/wizards/exportappliance/UIWizardExportAppPageBasic3.h	(revision 91367)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/wizards/exportappliance/UIWizardExportAppPageBasic3.h	(revision 91368)
@@ -5,5 +5,5 @@
 
 /*
- * Copyright (C) 2009-2020 Oracle Corporation
+ * Copyright (C) 2009-2021 Oracle Corporation
  *
  * This file is part of VirtualBox Open Source Edition (OSE), as
@@ -24,12 +24,10 @@
 /* Qt includes: */
 #include <QList>
-#include <QVariant>
 
 /* GUI includes: */
-#include "UIExtraDataDefs.h"
-#include "UIFormEditorWidget.h"
-#include "UIWizardPage.h"
+#include "UINativeWizardPage.h"
 
 /* COM includes: */
+#include "COMEnums.h"
 #include "CAppliance.h"
 
@@ -38,41 +36,30 @@
 class QIRichTextLabel;
 class UIApplianceExportEditorWidget;
+class UIFormEditorWidget;
 class UIWizardExportApp;
 
-
-/** UIWizardPageBase extension for 3rd page of the Export Appliance wizard. */
-class UIWizardExportAppPage3 : public UIWizardPageBase
+/** Namespace for 3rd basic page of the Export Appliance wizard. */
+namespace UIWizardExportAppPage3
 {
-protected:
-
-    /** Constructs 3rd page base. */
-    UIWizardExportAppPage3();
-
-    /** Updates page appearance. */
-    virtual void updatePageAppearance();
+    /** Refresh stacked layout. */
+    void refreshStackedLayout(QStackedLayout *pStackedLayout,
+                              bool fIsFormatCloudOne);
 
     /** Refreshes appliance settings widget. */
-    void refreshApplianceSettingsWidget();
+    void refreshApplianceSettingsWidget(UIApplianceExportEditorWidget *pApplianceWidget,
+                                        const QList<QUuid> &machineIDs,
+                                        const QString &strUri,
+                                        bool fIsFormatCloudOne);
     /** Refreshes form properties table. */
-    void refreshFormPropertiesTable();
+    void refreshFormPropertiesTable(UIFormEditorWidget *pFormEditor,
+                                    const CVirtualSystemDescriptionForm &comVsdExportForm,
+                                    bool fIsFormatCloudOne);
+}
 
-    /** Returns Local Appliance object. */
-    CAppliance localAppliance() const;
-
-    /** Holds the settings container layout instance. */
-    QStackedLayout *m_pSettingsCntLayout;
-
-    /** Holds the appliance widget reference. */
-    UIApplianceExportEditorWidget *m_pApplianceWidget;
-    /** Holds the Form Editor widget instance. */
-    UIFormEditorWidgetPointer      m_pFormEditor;
-};
-
-
-/** UIWizardPage extension for 3rd page of the Export Appliance wizard, extends UIWizardExportAppPage3 as well. */
-class UIWizardExportAppPageBasic3 : public UIWizardPage, public UIWizardExportAppPage3
+/** UINativeWizardPage extension for 3rd basic page of the Export Appliance wizard,
+  * based on UIWizardAddCloudVMPage3 namespace functions. */
+class UIWizardExportAppPageBasic3 : public UINativeWizardPage
 {
     Q_OBJECT;
-    Q_PROPERTY(CAppliance localAppliance READ localAppliance);
 
 public:
@@ -83,10 +70,6 @@
 protected:
 
-    /** Allows access wizard from base part. */
-    UIWizard *wizardImp() const { return UIWizardPage::wizard(); }
-    /** Allows access page from base part. */
-    UIWizardPage* thisImp() { return this; }
-    /** Allows access wizard-field from base part. */
-    QVariant fieldImp(const QString &strFieldName) const { return UIWizardPage::field(strFieldName); }
+    /** Returns wizard this page belongs to. */
+    UIWizardExportApp *wizard() const;
 
     /** Handles translation event. */
@@ -95,18 +78,7 @@
     /** Performs page initialization. */
     virtual void initializePage() /* override */;
-    /** Performs page cleanup. */
-    virtual void cleanupPage() /* override */;
 
     /** Performs page validation. */
     virtual bool validatePage() /* override */;
-
-    /** Updates page appearance. */
-    virtual void updatePageAppearance() /* override */;
-
-private slots:
-
-    /** Handles custom button clicked.
-      * @param  iId  Brings clicked button id. */
-    void sltHandleCustomButtonClicked(int iId);
 
 private:
@@ -114,4 +86,12 @@
     /** Holds the label instance. */
     QIRichTextLabel *m_pLabel;
+
+    /** Holds the settings container layout instance. */
+    QStackedLayout *m_pSettingsLayout;
+
+    /** Holds the appliance widget reference. */
+    UIApplianceExportEditorWidget *m_pApplianceWidget;
+    /** Holds the Form Editor widget instance. */
+    UIFormEditorWidget            *m_pFormEditor;
 };
 
Index: /trunk/src/VBox/Frontends/VirtualBox/src/wizards/exportappliance/UIWizardExportAppPageExpert.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/wizards/exportappliance/UIWizardExportAppPageExpert.cpp	(revision 91367)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/wizards/exportappliance/UIWizardExportAppPageExpert.cpp	(revision 91368)
@@ -5,5 +5,5 @@
 
 /*
- * Copyright (C) 2009-2020 Oracle Corporation
+ * Copyright (C) 2009-2021 Oracle Corporation
  *
  * This file is part of VirtualBox Open Source Edition (OSE), as
@@ -17,4 +17,5 @@
 
 /* Qt includes: */
+#include <QButtonGroup>
 #include <QCheckBox>
 #include <QGridLayout>
@@ -31,4 +32,5 @@
 
 /* GUI includes: */
+#include "QIComboBox.h"
 #include "QIToolButton.h"
 #include "UICommon.h"
@@ -36,4 +38,5 @@
 #include "UIConverter.h"
 #include "UIEmptyFilePathSelector.h"
+#include "UIFormEditorWidget.h"
 #include "UIIconPool.h"
 #include "UIMessageCenter.h"
@@ -41,5 +44,13 @@
 #include "UIVirtualBoxManager.h"
 #include "UIWizardExportApp.h"
+#include "UIWizardExportAppPageBasic1.h"
+#include "UIWizardExportAppPageBasic2.h"
+#include "UIWizardExportAppPageBasic3.h"
 #include "UIWizardExportAppPageExpert.h"
+
+/* Namespaces: */
+using namespace UIWizardExportAppPage1;
+using namespace UIWizardExportAppPage2;
+using namespace UIWizardExportAppPage3;
 
 
@@ -49,9 +60,31 @@
 
 UIWizardExportAppPageExpert::UIWizardExportAppPageExpert(const QStringList &selectedVMNames, bool fExportToOCIByDefault)
-    : UIWizardExportAppPage2(fExportToOCIByDefault)
-    , m_fPolished(false)
+    : m_selectedVMNames(selectedVMNames)
+    , m_fExportToOCIByDefault(fExportToOCIByDefault)
     , m_pSelectorCnt(0)
+    , m_pVMSelector(0)
     , m_pApplianceCnt(0)
+    , m_pSettingsLayout(0)
+    , m_pApplianceWidget(0)
+    , m_pFormEditor(0)
     , m_pSettingsCnt(0)
+    , m_pFormatLayout(0)
+    , m_pFormatComboBoxLabel(0)
+    , m_pFormatComboBox(0)
+    , m_pSettingsWidget(0)
+    , m_pSettingsLayout1(0)
+    , m_pFileSelectorLabel(0)
+    , m_pFileSelector(0)
+    , m_pMACComboBoxLabel(0)
+    , m_pMACComboBox(0)
+    , m_pAdditionalLabel(0)
+    , m_pManifestCheckbox(0)
+    , m_pIncludeISOsCheckbox(0)
+    , m_pSettingsLayout2(0)
+    , m_pProfileLabel(0)
+    , m_pProfileComboBox(0)
+    , m_pProfileToolButton(0)
+    , m_pExportModeLabel(0)
+    , m_pExportModeButtonGroup(0)
 {
     /* Create widgets: */
@@ -62,5 +95,5 @@
 
         /* Create VM selector container: */
-        m_pSelectorCnt = new QGroupBox;
+        m_pSelectorCnt = new QGroupBox(this);
         if (m_pSelectorCnt)
         {
@@ -70,11 +103,9 @@
             {
                 /* Create VM selector: */
-                m_pVMSelector = new QListWidget;
+                m_pVMSelector = new QListWidget(m_pSelectorCnt);
                 if (m_pVMSelector)
                 {
                     m_pVMSelector->setAlternatingRowColors(true);
                     m_pVMSelector->setSelectionMode(QAbstractItemView::ExtendedSelection);
-
-                    /* Add into layout: */
                     pSelectorCntLayout->addWidget(m_pVMSelector);
                 }
@@ -86,5 +117,5 @@
 
         /* Create appliance widget container: */
-        m_pApplianceCnt = new QGroupBox;
+        m_pApplianceCnt = new QGroupBox(this);
         if (m_pApplianceCnt)
         {
@@ -94,6 +125,6 @@
             {
                 /* Create settings container layout: */
-                m_pSettingsCntLayout = new QStackedLayout;
-                if (m_pSettingsCntLayout)
+                m_pSettingsLayout = new QStackedLayout;
+                if (m_pSettingsLayout)
                 {
                     /* Create appliance widget container: */
@@ -108,11 +139,9 @@
 
                             /* Create appliance widget: */
-                            m_pApplianceWidget = new UIApplianceExportEditorWidget;
+                            m_pApplianceWidget = new UIApplianceExportEditorWidget(pApplianceWidgetCnt);
                             if (m_pApplianceWidget)
                             {
                                 m_pApplianceWidget->setMinimumHeight(250);
                                 m_pApplianceWidget->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::MinimumExpanding);
-
-                                /* Add into layout: */
                                 pApplianceWidgetLayout->addWidget(m_pApplianceWidget);
                             }
@@ -120,5 +149,5 @@
 
                         /* Add into layout: */
-                        m_pSettingsCntLayout->addWidget(pApplianceWidgetCnt);
+                        m_pSettingsLayout->addWidget(pApplianceWidgetCnt);
                     }
 
@@ -136,16 +165,13 @@
                             m_pFormEditor = new UIFormEditorWidget(pFormEditorCnt);
                             if (m_pFormEditor)
-                            {
-                                /* Add into layout: */
                                 pFormEditorLayout->addWidget(m_pFormEditor);
-                            }
                         }
 
                         /* Add into layout: */
-                        m_pSettingsCntLayout->addWidget(pFormEditorCnt);
+                        m_pSettingsLayout->addWidget(pFormEditorCnt);
                     }
 
                     /* Add into layout: */
-                    pApplianceCntLayout->addLayout(m_pSettingsCntLayout);
+                    pApplianceCntLayout->addLayout(m_pSettingsLayout);
                 }
             }
@@ -156,5 +182,5 @@
 
         /* Create settings widget container: */
-        m_pSettingsCnt = new QGroupBox;
+        m_pSettingsCnt = new QGroupBox(this);
         if (m_pSettingsCnt)
         {
@@ -179,18 +205,13 @@
 
                     /* Create format combo-box: */
-                    m_pFormatComboBox = new QComboBox;
+                    m_pFormatComboBox = new QIComboBox(m_pSettingsCnt);
                     if (m_pFormatComboBox)
-                    {
-                        /* Add into layout: */
                         m_pFormatLayout->addWidget(m_pFormatComboBox, 0, 1);
-                    }
                     /* Create format combo-box label: */
-                    m_pFormatComboBoxLabel = new QLabel;
+                    m_pFormatComboBoxLabel = new QLabel(m_pSettingsCnt);
                     if (m_pFormatComboBoxLabel)
                     {
                         m_pFormatComboBoxLabel->setAlignment(Qt::AlignRight | Qt::AlignTrailing | Qt::AlignVCenter);
                         m_pFormatComboBoxLabel->setBuddy(m_pFormatComboBox);
-
-                        /* Add into layout: */
                         m_pFormatLayout->addWidget(m_pFormatComboBoxLabel, 0, 0);
                     }
@@ -205,5 +226,5 @@
                 {
                     /* Create settings pane 1: */
-                    QWidget *pSettingsPane1 = new QWidget;
+                    QWidget *pSettingsPane1 = new QWidget(m_pSettingsWidget);
                     if (pSettingsPane1)
                     {
@@ -243,5 +264,5 @@
 
                             /* Create MAC policy combo-box: */
-                            m_pMACComboBox = new QComboBox;
+                            m_pMACComboBox = new QIComboBox;
                             if (m_pMACComboBox)
                             {
@@ -298,5 +319,5 @@
 
                     /* Create settings pane 2: */
-                    QWidget *pSettingsPane2 = new QWidget;
+                    QWidget *pSettingsPane2 = new QWidget(m_pSettingsWidget);
                     if (pSettingsPane2)
                     {
@@ -313,10 +334,8 @@
 
                             /* Create profile label: */
-                            m_pProfileLabel = new QLabel;
+                            m_pProfileLabel = new QLabel(pSettingsPane2);
                             if (m_pProfileLabel)
                             {
                                 m_pProfileLabel->setAlignment(Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter);
-
-                                /* Add into layout: */
                                 m_pSettingsLayout2->addWidget(m_pProfileLabel, 0, 0);
                             }
@@ -329,20 +348,16 @@
 
                                 /* Create profile combo-box: */
-                                m_pProfileComboBox = new QComboBox;
+                                m_pProfileComboBox = new QIComboBox(pSettingsPane2);
                                 if (m_pProfileComboBox)
                                 {
                                     m_pProfileLabel->setBuddy(m_pProfileComboBox);
-
-                                    /* Add into layout: */
                                     pSubLayout->addWidget(m_pProfileComboBox);
                                 }
                                 /* Create profile tool-button: */
-                                m_pProfileToolButton = new QIToolButton;
+                                m_pProfileToolButton = new QIToolButton(pSettingsPane2);
                                 if (m_pProfileToolButton)
                                 {
                                     m_pProfileToolButton->setIcon(UIIconPool::iconSet(":/cloud_profile_manager_16px.png",
                                                                                       ":/cloud_profile_manager_disabled_16px.png"));
-
-                                    /* Add into layout: */
                                     pSubLayout->addWidget(m_pProfileToolButton);
                                 }
@@ -353,32 +368,36 @@
 
                             /* Create profile label: */
-                            m_pMachineLabel = new QLabel;
-                            if (m_pMachineLabel)
-                            {
-                                m_pMachineLabel->setAlignment(Qt::AlignRight | Qt::AlignTrailing | Qt::AlignVCenter);
-
-                                /* Add into layout: */
-                                m_pSettingsLayout2->addWidget(m_pMachineLabel, 1, 0);
-                            }
-                            /* Create Do Not Ask button: */
-                            m_pRadioDoNotAsk = new QRadioButton;
-                            if (m_pRadioDoNotAsk)
-                            {
-                                /* Add into layout: */
-                                m_pSettingsLayout2->addWidget(m_pRadioDoNotAsk, 1, 1);
-                            }
-                            /* Create Ask Then Export button: */
-                            m_pRadioAskThenExport = new QRadioButton;
-                            if (m_pRadioAskThenExport)
-                            {
-                                /* Add into layout: */
-                                m_pSettingsLayout2->addWidget(m_pRadioAskThenExport, 2, 1);
-                            }
-                            /* Create Export Then Ask button: */
-                            m_pRadioExportThenAsk = new QRadioButton;
-                            if (m_pRadioExportThenAsk)
-                            {
-                                /* Add into layout: */
-                                m_pSettingsLayout2->addWidget(m_pRadioExportThenAsk, 3, 1);
+                            m_pExportModeLabel = new QLabel(pSettingsPane2);
+                            if (m_pExportModeLabel)
+                            {
+                                m_pExportModeLabel->setAlignment(Qt::AlignRight | Qt::AlignTrailing | Qt::AlignVCenter);
+                                m_pSettingsLayout2->addWidget(m_pExportModeLabel, 1, 0);
+                            }
+
+                            /* Create button-group: */
+                            m_pExportModeButtonGroup = new QButtonGroup(pSettingsPane2);
+                            if (m_pExportModeButtonGroup)
+                            {
+                                /* Create Do Not Ask button: */
+                                m_exportModeButtons[CloudExportMode_DoNotAsk] = new QRadioButton(pSettingsPane2);
+                                if (m_exportModeButtons.value(CloudExportMode_DoNotAsk))
+                                {
+                                    m_pExportModeButtonGroup->addButton(m_exportModeButtons.value(CloudExportMode_DoNotAsk));
+                                    m_pSettingsLayout2->addWidget(m_exportModeButtons.value(CloudExportMode_DoNotAsk), 1, 1);
+                                }
+                                /* Create Ask Then Export button: */
+                                m_exportModeButtons[CloudExportMode_AskThenExport] = new QRadioButton(pSettingsPane2);
+                                if (m_exportModeButtons.value(CloudExportMode_AskThenExport))
+                                {
+                                    m_pExportModeButtonGroup->addButton(m_exportModeButtons.value(CloudExportMode_AskThenExport));
+                                    m_pSettingsLayout2->addWidget(m_exportModeButtons.value(CloudExportMode_AskThenExport), 2, 1);
+                                }
+                                /* Create Export Then Ask button: */
+                                m_exportModeButtons[CloudExportMode_ExportThenAsk] = new QRadioButton(pSettingsPane2);
+                                if (m_exportModeButtons.value(CloudExportMode_ExportThenAsk))
+                                {
+                                    m_pExportModeButtonGroup->addButton(m_exportModeButtons.value(CloudExportMode_ExportThenAsk));
+                                    m_pSettingsLayout2->addWidget(m_exportModeButtons.value(CloudExportMode_ExportThenAsk), 3, 1);
+                                }
                             }
                         }
@@ -397,11 +416,4 @@
         }
     }
-
-    /* Populate VM selector items: */
-    populateVMSelectorItems(selectedVMNames);
-    /* Populate formats: */
-    populateFormats();
-    /* Populate MAC address policies: */
-    populateMACAddressPolicies();
 
     /* Setup connections: */
@@ -410,32 +422,27 @@
     connect(gVBoxEvents, &UIVirtualBoxEventHandler::sigCloudProfileChanged,
             this, &UIWizardExportAppPageExpert::sltHandleFormatComboChange);
-    connect(m_pVMSelector, &QListWidget::itemSelectionChanged,      this, &UIWizardExportAppPageExpert::sltVMSelectionChangeHandler);
+    connect(m_pVMSelector, &QListWidget::itemSelectionChanged,
+            this, &UIWizardExportAppPageExpert::sltHandleVMItemSelectionChanged);
     connect(m_pFileSelector, &UIEmptyFilePathSelector::pathChanged,
             this, &UIWizardExportAppPageExpert::sltHandleFileSelectorChange);
-    connect(m_pFormatComboBox, static_cast<void(QComboBox::*)(int)>(&QComboBox::currentIndexChanged),
+    connect(m_pFormatComboBox, static_cast<void(QIComboBox::*)(int)>(&QIComboBox::currentIndexChanged),
             this, &UIWizardExportAppPageExpert::sltHandleFormatComboChange);
-    connect(m_pMACComboBox, static_cast<void(QComboBox::*)(int)>(&QComboBox::currentIndexChanged),
+    connect(m_pMACComboBox, static_cast<void(QIComboBox::*)(int)>(&QIComboBox::currentIndexChanged),
             this, &UIWizardExportAppPageExpert::sltHandleMACAddressExportPolicyComboChange);
-    connect(m_pProfileComboBox, static_cast<void(QComboBox::*)(int)>(&QComboBox::currentIndexChanged),
+    connect(m_pManifestCheckbox, &QCheckBox::stateChanged,
+            this, &UIWizardExportAppPageExpert::sltHandleManifestCheckBoxChange);
+    connect(m_pIncludeISOsCheckbox, &QCheckBox::stateChanged,
+            this, &UIWizardExportAppPageExpert::sltHandleIncludeISOsCheckBoxChange);
+    connect(m_pProfileComboBox, static_cast<void(QIComboBox::*)(int)>(&QIComboBox::currentIndexChanged),
             this, &UIWizardExportAppPageExpert::sltHandleProfileComboChange);
+    connect(m_pExportModeButtonGroup, static_cast<void(QButtonGroup::*)(QAbstractButton*, bool)>(&QButtonGroup::buttonToggled),
+            this, &UIWizardExportAppPageExpert::sltHandleRadioButtonToggled);
     connect(m_pProfileToolButton, &QIToolButton::clicked,
             this, &UIWizardExportAppPageExpert::sltHandleProfileButtonClick);
-
-    /* Register fields: */
-    registerField("machineNames", this, "machineNames");
-    registerField("machineIDs", this, "machineIDs");
-    registerField("format", this, "format");
-    registerField("isFormatCloudOne", this, "isFormatCloudOne");
-    registerField("path", this, "path");
-    registerField("macAddressExportPolicy", this, "macAddressExportPolicy");
-    registerField("manifestSelected", this, "manifestSelected");
-    registerField("includeISOsSelected", this, "includeISOsSelected");
-    registerField("providerShortName", this, "providerShortName");
-    registerField("cloudAppliance", this, "cloudAppliance");
-    registerField("client", this, "client");
-    registerField("vsd", this, "vsd");
-    registerField("vsdExportForm", this, "vsdExportForm");
-    registerField("cloudExportMode", this, "cloudExportMode");
-    registerField("localAppliance", this, "localAppliance");
+}
+
+UIWizardExportApp *UIWizardExportAppPageExpert::wizard() const
+{
+    return qobject_cast<UIWizardExportApp*>(UINativeWizardPage::wizard());
 }
 
@@ -444,4 +451,6 @@
     /* Translate objects: */
     m_strDefaultApplianceName = UIWizardExportApp::tr("Appliance");
+    refreshFileSelectorName(m_strFileSelectorName, wizard()->machineNames(), m_strDefaultApplianceName, wizard()->isFormatCloudOne());
+    refreshFileSelectorPath(m_pFileSelector, m_strFileSelectorName, m_strFileSelectorExt, wizard()->isFormatCloudOne());
 
     /* Translate group-boxes: */
@@ -467,5 +476,5 @@
      * We are enumerating starting from 0 for simplicity: */
     for (int i = 0; i < m_pFormatComboBox->count(); ++i)
-        if (isFormatCloudOne(i))
+        if (isFormatCloudOne(m_pFormatComboBox, i))
         {
             m_pFormatComboBox->setItemText(i, m_pFormatComboBox->itemData(i, FormatData_Name).toString());
@@ -483,5 +492,6 @@
             {
                 m_pMACComboBox->setItemText(i, UIWizardExportApp::tr("Include all network adapter MAC addresses"));
-                m_pMACComboBox->setItemData(i, UIWizardExportApp::tr("Include all network adapter MAC addresses in exported appliance archive."), Qt::ToolTipRole);
+                m_pMACComboBox->setItemData(i, UIWizardExportApp::tr("Include all network adapter MAC addresses in exported "
+                                                                     "appliance archive."), Qt::ToolTipRole);
                 break;
             }
@@ -489,5 +499,6 @@
             {
                 m_pMACComboBox->setItemText(i, UIWizardExportApp::tr("Include only NAT network adapter MAC addresses"));
-                m_pMACComboBox->setItemData(i, UIWizardExportApp::tr("Include only NAT network adapter MAC addresses in exported appliance archive."), Qt::ToolTipRole);
+                m_pMACComboBox->setItemData(i, UIWizardExportApp::tr("Include only NAT network adapter MAC addresses in exported "
+                                                                     "appliance archive."), Qt::ToolTipRole);
                 break;
             }
@@ -495,5 +506,6 @@
             {
                 m_pMACComboBox->setItemText(i, UIWizardExportApp::tr("Strip all network adapter MAC addresses"));
-                m_pMACComboBox->setItemData(i, UIWizardExportApp::tr("Strip all network adapter MAC addresses from exported appliance archive."), Qt::ToolTipRole);
+                m_pMACComboBox->setItemData(i, UIWizardExportApp::tr("Strip all network adapter MAC addresses from exported "
+                                                                     "appliance archive."), Qt::ToolTipRole);
                 break;
             }
@@ -505,18 +517,18 @@
     /* Translate addtional stuff: */
     m_pAdditionalLabel->setText(UIWizardExportApp::tr("Additionally:"));
-    m_pManifestCheckbox->setToolTip(UIWizardExportApp::tr("Creates a manifest file for automatic data integrity checks on import."));
+    m_pManifestCheckbox->setToolTip(UIWizardExportApp::tr("Create a Manifest file for automatic data integrity checks on import."));
     m_pManifestCheckbox->setText(UIWizardExportApp::tr("&Write Manifest file"));
-    m_pIncludeISOsCheckbox->setToolTip(UIWizardExportApp::tr("Includes ISO image files into exported VM archive."));
+    m_pIncludeISOsCheckbox->setToolTip(UIWizardExportApp::tr("Include ISO image files into exported VM archive."));
     m_pIncludeISOsCheckbox->setText(UIWizardExportApp::tr("&Include ISO image files"));
 
     /* Translate profile stuff: */
     m_pProfileLabel->setText(UIWizardExportApp::tr("&Profile:"));
-    m_pProfileToolButton->setToolTip(UIWizardExportApp::tr("Opens Cloud Profile Manager..."));
+    m_pProfileToolButton->setToolTip(UIWizardExportApp::tr("Open Cloud Profile Manager..."));
 
     /* Translate option label: */
-    m_pMachineLabel->setText(UIWizardExportApp::tr("Machine Creation:"));
-    m_pRadioDoNotAsk->setText(UIWizardExportApp::tr("Do not ask me about it, leave custom &image for future usage"));
-    m_pRadioAskThenExport->setText(UIWizardExportApp::tr("Ask me about it &before exporting disk as custom image"));
-    m_pRadioExportThenAsk->setText(UIWizardExportApp::tr("Ask me about it &after exporting disk as custom image"));
+    m_pExportModeLabel->setText(UIWizardExportApp::tr("Machine Creation:"));
+    m_exportModeButtons.value(CloudExportMode_DoNotAsk)->setText(UIWizardExportApp::tr("Do not ask me about it, leave custom &image for future usage"));
+    m_exportModeButtons.value(CloudExportMode_AskThenExport)->setText(UIWizardExportApp::tr("Ask me about it &before exporting disk as custom image"));
+    m_exportModeButtons.value(CloudExportMode_ExportThenAsk)->setText(UIWizardExportApp::tr("Ask me about it &after exporting disk as custom image"));
 
     /* Adjust label widths: */
@@ -527,5 +539,5 @@
     labels << m_pAdditionalLabel;
     labels << m_pProfileLabel;
-    labels << m_pMachineLabel;
+    labels << m_pExportModeLabel;
     int iMaxWidth = 0;
     foreach (QWidget *pLabel, labels)
@@ -535,67 +547,51 @@
     m_pSettingsLayout2->setColumnMinimumWidth(0, iMaxWidth);
 
-    /* Refresh file selector name: */
-    refreshFileSelectorName();
-
     /* Update tool-tips: */
-    updateFormatComboToolTip();
-    updateMACAddressExportPolicyComboToolTip();
+    updateFormatComboToolTip(m_pFormatComboBox);
+    updateMACAddressExportPolicyComboToolTip(m_pMACComboBox);
 }
 
 void UIWizardExportAppPageExpert::initializePage()
 {
-    /* If wasn't polished yet: */
-    if (!m_fPolished)
-    {
-        QMetaObject::invokeMethod(this, "sltHandleFormatComboChange", Qt::QueuedConnection);
-        m_fPolished = true;
-    }
-
+    /* Populate VM items: */
+    populateVMItems(m_pVMSelector, m_selectedVMNames);
+    /* Populate formats: */
+    populateFormats(m_pFormatComboBox, m_fExportToOCIByDefault);
+    /* Populate MAC address policies: */
+    populateMACAddressPolicies(m_pMACComboBox);
     /* Translate page: */
     retranslateUi();
 
-    /* Choose default cloud export option: */
-    m_pRadioExportThenAsk->setChecked(true);
-
-    /* Listen for custom button clicks: */
-    connect(wizard(), &UIWizard::customButtonClicked,
-            this, &UIWizardExportAppPageExpert::sltHandleCustomButtonClicked,
-            Qt::UniqueConnection);
-}
-
-void UIWizardExportAppPageExpert::cleanupPage()
-{
-    /* Do not pass call to base-class, we don't want field values to be reseted. */
-
-    /* Stop listen for custom button clicks: */
-    disconnect(wizard(), &UIWizard::customButtonClicked,
-               this, &UIWizardExportAppPageExpert::sltHandleCustomButtonClicked);
+    /* Fetch it, asynchronously: */
+    QMetaObject::invokeMethod(this, "sltHandleFormatComboChange", Qt::QueuedConnection);
 }
 
 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);
+        fResult = wizard()->machineNames().size() > 0;
 
     /* Check appliance settings: */
     if (fResult)
     {
-        const bool fOVF =    field("format").toString() == "ovf-0.9"
-                          || field("format").toString() == "ovf-1.0"
-                          || field("format").toString() == "ovf-2.0";
-        const bool fCSP =    field("isFormatCloudOne").toBool();
+        const bool fOVF =    wizard()->format() == "ovf-0.9"
+                          || wizard()->format() == "ovf-1.0"
+                          || wizard()->format() == "ovf-2.0";
+        const bool fCSP =    wizard()->isFormatCloudOne();
 
         fResult =    (   fOVF
-                      && UICommon::hasAllowedExtension(path().toLower(), OVFFileExts))
+                      && UICommon::hasAllowedExtension(wizard()->path().toLower(), OVFFileExts))
                   || (   fCSP
-                      && field("cloudAppliance").value<CAppliance>().isNotNull()
-                      && field("client").value<CCloudClient>().isNotNull()
-                      && field("vsd").value<CVirtualSystemDescription>().isNotNull()
-                      && field("vsdExportForm").value<CVirtualSystemDescriptionForm>().isNotNull());
+                      && wizard()->cloudAppliance().isNotNull()
+                      && wizard()->cloudClient().isNotNull()
+                      && wizard()->vsd().isNotNull()
+                      && wizard()->vsdExportForm().isNotNull());
     }
 
+    /* Return result: */
     return fResult;
 }
@@ -606,10 +602,6 @@
     bool fResult = true;
 
-    /* Lock finish button: */
-    startProcessing();
-
     /* Check whether there was cloud target selected: */
-    const bool fIsFormatCloudOne = fieldImp("isFormatCloudOne").toBool();
-    if (fIsFormatCloudOne)
+    if (wizard()->isFormatCloudOne())
     {
         /* Make sure table has own data committed: */
@@ -617,5 +609,5 @@
 
         /* Check whether we have proper VSD form: */
-        CVirtualSystemDescriptionForm comForm = fieldImp("vsdExportForm").value<CVirtualSystemDescriptionForm>();
+        CVirtualSystemDescriptionForm comForm = wizard()->vsdExportForm();
         fResult = comForm.isNotNull();
         Assert(fResult);
@@ -633,14 +625,21 @@
     else
     {
+        /* Ask user about machines which are in Saved state currently: */
+        QStringList savedMachines;
+        refreshSavedMachines(savedMachines, m_pVMSelector);
+        if (!savedMachines.isEmpty())
+            fResult = msgCenter().confirmExportMachinesInSaveState(savedMachines, this);
+
         /* Prepare export: */
-        m_pApplianceWidget->prepareExport();
+        if (fResult)
+        {
+            m_pApplianceWidget->prepareExport();
+            wizard()->setLocalAppliance(*m_pApplianceWidget->appliance());
+        }
     }
 
     /* Try to export appliance: */
     if (fResult)
-        fResult = qobject_cast<UIWizardExportApp*>(wizard())->exportAppliance();
-
-    /* Unlock finish button: */
-    endProcessing();
+        fResult = wizard()->exportAppliance();
 
     /* Return result: */
@@ -648,18 +647,7 @@
 }
 
-void UIWizardExportAppPageExpert::sltVMSelectionChangeHandler()
-{
-    /* Refresh required settings: */
-    refreshFileSelectorName();
-    populateFormProperties();
-
-    /* Check whether there was cloud target selected: */
-    const bool fIsFormatCloudOne = field("isFormatCloudOne").toBool();
-    if (fIsFormatCloudOne)
-        refreshFormPropertiesTable();
-    else
-        refreshApplianceSettingsWidget();
-
-    /* Broadcast complete-change: */
+void UIWizardExportAppPageExpert::sltHandleVMItemSelectionChanged()
+{
+    updateMachines();
     emit completeChanged();
 }
@@ -667,25 +655,5 @@
 void UIWizardExportAppPageExpert::sltHandleFormatComboChange()
 {
-    /* Update tool-tip: */
-    updateFormatComboToolTip();
-
-    /* Refresh required settings: */
-    UIWizardExportAppPage2::updatePageAppearance();
-    UIWizardExportAppPage3::updatePageAppearance();
-    refreshFileSelectorExtension();
-    refreshManifestCheckBoxAccess();
-    refreshIncludeISOsCheckBoxAccess();
-    populateProfiles();
-    populateProfile();
-    populateFormProperties();
-
-    /* Check whether there was cloud target selected: */
-    const bool fIsFormatCloudOne = field("isFormatCloudOne").toBool();
-    if (fIsFormatCloudOne)
-        refreshFormPropertiesTable();
-    else
-        refreshApplianceSettingsWidget();
-
-    /* Broadcast complete-change: */
+    updateFormat();
     emit completeChanged();
 }
@@ -693,9 +661,10 @@
 void UIWizardExportAppPageExpert::sltHandleFileSelectorChange()
 {
-    /* Remember changed name, except empty one: */
-    if (!m_pFileSelector->path().isEmpty())
-        m_strFileSelectorName = QFileInfo(m_pFileSelector->path()).completeBaseName();
-
-    /* Broadcast complete-change: */
+    /* Skip empty paths: */
+    if (m_pFileSelector->path().isEmpty())
+        return;
+
+    m_strFileSelectorName = QFileInfo(m_pFileSelector->path()).completeBaseName();
+    wizard()->setPath(m_pFileSelector->path());
     emit completeChanged();
 }
@@ -703,32 +672,35 @@
 void UIWizardExportAppPageExpert::sltHandleMACAddressExportPolicyComboChange()
 {
-    /* Update tool-tip: */
-    updateMACAddressExportPolicyComboToolTip();
-}
-
-void UIWizardExportAppPageExpert::sltHandleCustomButtonClicked(int iId)
-{
-    /* Handle 2nd button: */
-    if (iId == QWizard::CustomButton2)
-    {
-        /* Reset widget to default: */
-        m_pApplianceWidget->restoreDefaults();
-    }
+    updateMACAddressExportPolicyComboToolTip(m_pMACComboBox);
+    wizard()->setMACAddressExportPolicy(m_pMACComboBox->currentData().value<MACAddressExportPolicy>());
+    emit completeChanged();
+}
+
+void UIWizardExportAppPageExpert::sltHandleManifestCheckBoxChange()
+{
+    wizard()->setManifestSelected(m_pManifestCheckbox->isChecked());
+    emit completeChanged();
+}
+
+void UIWizardExportAppPageExpert::sltHandleIncludeISOsCheckBoxChange()
+{
+    wizard()->setIncludeISOsSelected(m_pIncludeISOsCheckbox->isChecked());
+    emit completeChanged();
 }
 
 void UIWizardExportAppPageExpert::sltHandleProfileComboChange()
 {
-    /* Refresh required settings: */
-    populateProfile();
-    populateFormProperties();
-
-    /* Check whether there was cloud target selected: */
-    const bool fIsFormatCloudOne = field("isFormatCloudOne").toBool();
-    if (fIsFormatCloudOne)
-        refreshFormPropertiesTable();
-    else
-        refreshApplianceSettingsWidget();
-
-    /* Broadcast complete-change: */
+    updateProfile();
+    emit completeChanged();
+}
+
+void UIWizardExportAppPageExpert::sltHandleRadioButtonToggled(QAbstractButton *pButton, bool fToggled)
+{
+    /* Handle checked buttons only: */
+    if (!fToggled)
+        return;
+
+    /* Update cloud export mode field value: */
+    wizard()->setCloudExportMode(m_exportModeButtons.key(pButton));
     emit completeChanged();
 }
@@ -740,2 +712,81 @@
         gpManager->openCloudProfileManager();
 }
+
+void UIWizardExportAppPageExpert::updateMachines()
+{
+    /* Update wizard fields: */
+    wizard()->setMachineNames(machineNames(m_pVMSelector));
+    wizard()->setMachineIDs(machineIDs(m_pVMSelector));
+
+    /* Refresh required settings: */
+    refreshFileSelectorName(m_strFileSelectorName, wizard()->machineNames(), m_strDefaultApplianceName, wizard()->isFormatCloudOne());
+    refreshFileSelectorPath(m_pFileSelector, m_strFileSelectorName, m_strFileSelectorExt, wizard()->isFormatCloudOne());
+
+    /* Update cloud stuff: */
+    updateCloudStuff();
+}
+
+void UIWizardExportAppPageExpert::updateFormat()
+{
+    /* Update combo tool-tip: */
+    updateFormatComboToolTip(m_pFormatComboBox);
+
+    /* Update wizard fields: */
+    wizard()->setFormat(format(m_pFormatComboBox));
+    wizard()->setFormatCloudOne(isFormatCloudOne(m_pFormatComboBox));
+
+    /* Refresh settings widget state: */
+    refreshStackedWidget(m_pSettingsWidget, wizard()->isFormatCloudOne());
+    refreshStackedLayout(m_pSettingsLayout, wizard()->isFormatCloudOne());
+
+    /* Update export settings: */
+    refreshFileSelectorExtension(m_strFileSelectorExt, m_pFileSelector, wizard()->isFormatCloudOne());
+    refreshFileSelectorPath(m_pFileSelector, m_strFileSelectorName, m_strFileSelectorExt, wizard()->isFormatCloudOne());
+    refreshManifestCheckBoxAccess(m_pManifestCheckbox, wizard()->isFormatCloudOne());
+    refreshIncludeISOsCheckBoxAccess(m_pIncludeISOsCheckbox, wizard()->isFormatCloudOne());
+    refreshProfileCombo(m_pProfileComboBox, wizard()->format(), wizard()->isFormatCloudOne());
+    refreshCloudExportMode(m_exportModeButtons, wizard()->isFormatCloudOne());
+
+    /* Update profile: */
+    updateProfile();
+}
+
+void UIWizardExportAppPageExpert::updateProfile()
+{
+    /* Update wizard fields: */
+    wizard()->setProfileName(profileName(m_pProfileComboBox));
+
+    /* Update export settings: */
+    refreshCloudProfile(m_comCloudProfile,
+                        wizard()->format(),
+                        wizard()->profileName(),
+                        wizard()->isFormatCloudOne());
+
+    /* Update cloud stuff: */
+    updateCloudStuff();
+}
+
+void UIWizardExportAppPageExpert::updateCloudStuff()
+{
+    /* Create appliance, client, VSD and VSD export form: */
+    CAppliance comAppliance;
+    CCloudClient comClient;
+    CVirtualSystemDescription comDescription;
+    CVirtualSystemDescriptionForm comForm;
+    refreshCloudStuff(comAppliance,
+                      comClient,
+                      comDescription,
+                      comForm,
+                      m_comCloudProfile,
+                      wizard()->machineIDs(),
+                      wizard()->uri(),
+                      wizard()->cloudExportMode());
+    wizard()->setCloudAppliance(comAppliance);
+    wizard()->setCloudClient(comClient);
+    wizard()->setVsd(comDescription);
+    wizard()->setVsdExportForm(comForm);
+
+    /* Refresh corresponding widgets: */
+    refreshApplianceSettingsWidget(m_pApplianceWidget, wizard()->machineIDs(), wizard()->uri(), wizard()->isFormatCloudOne());
+    refreshFormPropertiesTable(m_pFormEditor, wizard()->vsdExportForm(), wizard()->isFormatCloudOne());
+}
Index: /trunk/src/VBox/Frontends/VirtualBox/src/wizards/exportappliance/UIWizardExportAppPageExpert.h
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/wizards/exportappliance/UIWizardExportAppPageExpert.h	(revision 91367)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/wizards/exportappliance/UIWizardExportAppPageExpert.h	(revision 91368)
@@ -5,5 +5,5 @@
 
 /*
- * Copyright (C) 2009-2020 Oracle Corporation
+ * Copyright (C) 2009-2021 Oracle Corporation
  *
  * This file is part of VirtualBox Open Source Edition (OSE), as
@@ -23,33 +23,36 @@
 
 /* GUI includes: */
-#include "UIWizardExportAppPageBasic1.h"
-#include "UIWizardExportAppPageBasic2.h"
-#include "UIWizardExportAppPageBasic3.h"
+#include "UINativeWizardPage.h"
+#include "UIWizardExportApp.h"
+
+/* COM includes: */
+#include "COMEnums.h"
+#include "CAppliance.h"
+#include "CCloudClient.h"
+#include "CCloudProfile.h"
+#include "CVirtualSystemDescription.h"
+#include "CVirtualSystemDescriptionForm.h"
 
 /* Forward declarations: */
+class QAbstractButton;
+class QButtonGroup;
+class QCheckBox;
+class QGridLayout;
 class QGroupBox;
+class QLabel;
+class QListWidget;
+class QStackedLayout;
+class QStackedWidget;
+class QIComboBox;
+class QIToolButton;
+class UIApplianceExportEditorWidget;
+class UIEmptyFilePathSelector;
+class UIFormEditorWidget;
+class UIWizardExportApp;
 
 /** UIWizardPage extension for UIWizardExportAppPage1, UIWizardExportAppPage2 and UIWizardExportAppPage3. */
-class UIWizardExportAppPageExpert : public UIWizardPage,
-                                    public UIWizardExportAppPage1,
-                                    public UIWizardExportAppPage2,
-                                    public UIWizardExportAppPage3
+class UIWizardExportAppPageExpert : public UINativeWizardPage
 {
     Q_OBJECT;
-    Q_PROPERTY(QStringList machineNames READ machineNames);
-    Q_PROPERTY(QList<QUuid> machineIDs READ machineIDs);
-    Q_PROPERTY(QString format READ format WRITE setFormat);
-    Q_PROPERTY(bool isFormatCloudOne READ isFormatCloudOne);
-    Q_PROPERTY(QString path READ path WRITE setPath);
-    Q_PROPERTY(MACAddressExportPolicy macAddressExportPolicy READ macAddressExportPolicy WRITE setMACAddressExportPolicy);
-    Q_PROPERTY(bool manifestSelected READ isManifestSelected WRITE setManifestSelected);
-    Q_PROPERTY(bool includeISOsSelected READ isIncludeISOsSelected WRITE setIncludeISOsSelected);
-    Q_PROPERTY(QString providerShortName READ providerShortName);
-    Q_PROPERTY(CAppliance cloudAppliance READ cloudAppliance);
-    Q_PROPERTY(CCloudClient client READ client);
-    Q_PROPERTY(CVirtualSystemDescription vsd READ vsd);
-    Q_PROPERTY(CVirtualSystemDescriptionForm vsdExportForm READ vsdExportForm);
-    Q_PROPERTY(CloudExportMode cloudExportMode READ cloudExportMode);
-    Q_PROPERTY(CAppliance localAppliance READ localAppliance);
 
 public:
@@ -61,10 +64,6 @@
 protected:
 
-    /** Allows access wizard from base part. */
-    UIWizard *wizardImp() const { return UIWizardPage::wizard(); }
-    /** Allows access page from base part. */
-    UIWizardPage* thisImp() { return this; }
-    /** Allows access wizard-field from base part. */
-    QVariant fieldImp(const QString &strFieldName) const { return UIWizardPage::field(strFieldName); }
+    /** Returns wizard this page belongs to. */
+    UIWizardExportApp *wizard() const;
 
     /** Handles translation event. */
@@ -73,6 +72,4 @@
     /** Performs page initialization. */
     virtual void initializePage() /* override */;
-    /** Performs page uninitialization. */
-    virtual void cleanupPage() /* override */;
 
     /** Returns whether page is complete. */
@@ -85,5 +82,5 @@
 
     /** Handles VM selector index change. */
-    void sltVMSelectionChangeHandler();
+    void sltHandleVMItemSelectionChanged();
 
     /** Handles format combo change. */
@@ -96,11 +93,16 @@
     void sltHandleMACAddressExportPolicyComboChange();
 
-    /** Handles custom button clicked.
-      * @param  iId  Brings clicked button id. */
-    void sltHandleCustomButtonClicked(int iId);
+    /** Handles change in manifest check-box. */
+    void sltHandleManifestCheckBoxChange();
+
+    /** Handles change in include ISOs check-box. */
+    void sltHandleIncludeISOsCheckBoxChange();
 
     /** Handles change in profile combo-box. */
     void sltHandleProfileComboChange();
 
+    /** Handles cloud export radio-button clicked. */
+    void sltHandleRadioButtonToggled(QAbstractButton *pButton, bool fToggled);
+
     /** Handles profile tool-button click. */
     void sltHandleProfileButtonClick();
@@ -108,13 +110,93 @@
 private:
 
-    /** Holds whether starting page was polished. */
-    bool  m_fPolished;
+    /** Updates machines. */
+    void updateMachines();
+    /** Updates format. */
+    void updateFormat();
+    /** Updates profile. */
+    void updateProfile();
+    /** Updates cloud stuff. */
+    void updateCloudStuff();
+
+    /** Holds the list of selected VM names. */
+    const QStringList  m_selectedVMNames;
+    /** Holds whether default format should be Export to OCI. */
+    bool               m_fExportToOCIByDefault;
+
+    /** Holds the default appliance name. */
+    QString  m_strDefaultApplianceName;
+    /** Holds the file selector name. */
+    QString  m_strFileSelectorName;
+    /** Holds the file selector ext. */
+    QString  m_strFileSelectorExt;
+
+    /** Holds the Cloud Profile object reference. */
+    CCloudProfile  m_comCloudProfile;
+
 
     /** Holds the VM selector container instance. */
-    QGroupBox *m_pSelectorCnt;
+    QGroupBox   *m_pSelectorCnt;
+
+    /** Holds the VM selector instance. */
+    QListWidget *m_pVMSelector;
+
+
     /** Holds the appliance widget container reference. */
-    QGroupBox *m_pApplianceCnt;
+    QGroupBox   *m_pApplianceCnt;
+
+    /** Holds the settings container layout instance. */
+    QStackedLayout *m_pSettingsLayout;
+
+    /** Holds the appliance widget reference. */
+    UIApplianceExportEditorWidget *m_pApplianceWidget;
+    /** Holds the Form Editor widget instance. */
+    UIFormEditorWidget            *m_pFormEditor;
+
+
     /** Holds the settings widget container reference. */
     QGroupBox *m_pSettingsCnt;
+
+    /** Holds the format layout. */
+    QGridLayout *m_pFormatLayout;
+    /** Holds the format combo-box label instance. */
+    QLabel      *m_pFormatComboBoxLabel;
+    /** Holds the format combo-box instance. */
+    QIComboBox  *m_pFormatComboBox;
+
+    /** Holds the settings widget instance. */
+    QStackedWidget *m_pSettingsWidget;
+
+    /** Holds the settings layout 1. */
+    QGridLayout             *m_pSettingsLayout1;
+    /** Holds the file selector label instance. */
+    QLabel                  *m_pFileSelectorLabel;
+    /** Holds the file selector instance. */
+    UIEmptyFilePathSelector *m_pFileSelector;
+    /** Holds the MAC address policy combo-box label instance. */
+    QLabel                  *m_pMACComboBoxLabel;
+    /** Holds the MAC address policy check-box instance. */
+    QIComboBox              *m_pMACComboBox;
+    /** Holds the additional label instance. */
+    QLabel                  *m_pAdditionalLabel;
+    /** Holds the manifest check-box instance. */
+    QCheckBox               *m_pManifestCheckbox;
+    /** Holds the include ISOs check-box instance. */
+    QCheckBox               *m_pIncludeISOsCheckbox;
+
+    /** Holds the settings layout 2. */
+    QGridLayout   *m_pSettingsLayout2;
+    /** Holds the profile label instance. */
+    QLabel        *m_pProfileLabel;
+    /** Holds the profile combo-box instance. */
+    QIComboBox    *m_pProfileComboBox;
+    /** Holds the profile management tool-button instance. */
+    QIToolButton  *m_pProfileToolButton;
+
+    /** Holds the export mode label instance. */
+    QLabel                                  *m_pExportModeLabel;
+    /** Holds the export mode button group instance. */
+    QButtonGroup                            *m_pExportModeButtonGroup;
+    /** Holds the map of export mode button instances. */
+    QMap<CloudExportMode, QAbstractButton*>  m_exportModeButtons;
 };
 
