Index: trunk/src/VBox/Frontends/VirtualBox/src/manager/UIVirtualBoxManager.cpp
===================================================================
--- trunk/src/VBox/Frontends/VirtualBox/src/manager/UIVirtualBoxManager.cpp	(revision 89998)
+++ trunk/src/VBox/Frontends/VirtualBox/src/manager/UIVirtualBoxManager.cpp	(revision 89999)
@@ -1043,5 +1043,4 @@
         UISafePointerWizardAddCloudVM pWizard = new UIWizardAddCloudVM(pWizardParent, m_pWidget->fullGroupName());
         windowManager().registerNewParent(pWizard, pWizardParent);
-        pWizard->prepare();
 
         /* Execute wizard: */
Index: trunk/src/VBox/Frontends/VirtualBox/src/wizards/addcloudvm/UIWizardAddCloudVM.cpp
===================================================================
--- trunk/src/VBox/Frontends/VirtualBox/src/wizards/addcloudvm/UIWizardAddCloudVM.cpp	(revision 89998)
+++ trunk/src/VBox/Frontends/VirtualBox/src/wizards/addcloudvm/UIWizardAddCloudVM.cpp	(revision 89999)
@@ -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,4 +24,5 @@
 
 /* COM includes: */
+#include "CCloudMachine.h"
 #include "CProgress.h"
 
@@ -30,39 +31,14 @@
                                        const QString &strFullGroupName /* = QString() */,
                                        WizardMode enmMode /* = WizardMode_Auto */)
-    : UIWizard(pParent, WizardType_AddCloudVM, enmMode)
+    : UINativeWizard(pParent, WizardType_AddCloudVM, enmMode)
     , m_strFullGroupName(strFullGroupName)
 {
 #ifndef VBOX_WS_MAC
     /* Assign watermark: */
-    assignWatermark(":/wizard_new_cloud_vm.png");
+    setPixmapName(":/wizard_new_cloud_vm.png");
 #else
     /* Assign background image: */
-    assignBackground(":/wizard_new_cloud_vm_bg.png");
+    setPixmapName(":/wizard_new_cloud_vm_bg.png");
 #endif
-}
-
-void UIWizardAddCloudVM::prepare()
-{
-    /* Create corresponding pages: */
-    switch (mode())
-    {
-        case WizardMode_Basic:
-        {
-            setPage(Page1, new UIWizardAddCloudVMPageBasic1);
-            break;
-        }
-        case WizardMode_Expert:
-        {
-            setPage(PageExpert, new UIWizardAddCloudVMPageExpert);
-            break;
-        }
-        default:
-        {
-            AssertMsgFailed(("Invalid mode: %d", mode()));
-            break;
-        }
-    }
-    /* Call to base-class: */
-    UIWizard::prepare();
 }
 
@@ -77,5 +53,5 @@
 
     /* For each cloud instance name we have: */
-    foreach (const QString &strInstanceName, field("instanceIds").toStringList())
+    foreach (const QString &strInstanceName, instanceIds())
     {
         /* Initiate cloud VM add procedure: */
@@ -109,7 +85,10 @@
                     if (comMachine.isNotNull())
                     {
-                        uiCommon().notifyCloudMachineRegistered(field("source").toString(),
-                                                                field("profileName").toString(),
+                        /* Notify GUI about VM was added: */
+                        uiCommon().notifyCloudMachineRegistered(shortProviderName(),
+                                                                profileName(),
                                                                 comMachine);
+
+                        /* Finally, success: */
                         fResult = true;
                     }
@@ -123,11 +102,35 @@
 }
 
+void UIWizardAddCloudVM::populatePages()
+{
+    /* Create corresponding pages: */
+    switch (mode())
+    {
+        case WizardMode_Basic:
+        {
+            addPage(new UIWizardAddCloudVMPageBasic1);
+            break;
+        }
+        case WizardMode_Expert:
+        {
+            addPage(new UIWizardAddCloudVMPageExpert);
+            break;
+        }
+        default:
+        {
+            AssertMsgFailed(("Invalid mode: %d", mode()));
+            break;
+        }
+    }
+}
+
 void UIWizardAddCloudVM::retranslateUi()
 {
     /* Call to base-class: */
-    UIWizard::retranslateUi();
+    UINativeWizard::retranslateUi();
 
     /* Translate wizard: */
     setWindowTitle(tr("Add Cloud Virtual Machine"));
-    setButtonText(QWizard::FinishButton, tr("Add"));
+    /// @todo implement this?
+    //setButtonText(QWizard::FinishButton, tr("Add"));
 }
Index: trunk/src/VBox/Frontends/VirtualBox/src/wizards/addcloudvm/UIWizardAddCloudVM.h
===================================================================
--- trunk/src/VBox/Frontends/VirtualBox/src/wizards/addcloudvm/UIWizardAddCloudVM.h	(revision 89998)
+++ trunk/src/VBox/Frontends/VirtualBox/src/wizards/addcloudvm/UIWizardAddCloudVM.h	(revision 89999)
@@ -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,29 +23,16 @@
 
 /* GUI includes: */
-#include "UIWizard.h"
+#include "UINativeWizard.h"
 
 /* COM includes: */
 #include "COMEnums.h"
 #include "CCloudClient.h"
-#include "CCloudMachine.h"
 
 /** Add Cloud VM wizard. */
-class UIWizardAddCloudVM : public UIWizard
+class UIWizardAddCloudVM : public UINativeWizard
 {
     Q_OBJECT;
 
 public:
-
-    /** Basic page IDs. */
-    enum
-    {
-        Page1
-    };
-
-    /** Expert page IDs. */
-    enum
-    {
-        PageExpert
-    };
 
     /** Constructs Add Cloud VM wizard passing @a pParent & @a enmMode to the base-class.
@@ -55,9 +42,21 @@
                        WizardMode enmMode = WizardMode_Auto);
 
-    /** Prepares all. */
-    virtual void prepare() /* override */;
-
     /** Returns full group name. */
     QString fullGroupName() const { return m_strFullGroupName; }
+
+    /** Defines @a strShortProviderName. */
+    void setShortProviderName(const QString &strShortProviderName) { m_strShortProviderName = strShortProviderName; }
+    /** Returns short provider name. */
+    QString shortProviderName() const { return m_strShortProviderName; }
+
+    /** Defines @a strProfileName. */
+    void setProfileName(const QString &strProfileName) { m_strProfileName = strProfileName; }
+    /** Returns profile name. */
+    QString profileName() const { return m_strProfileName; }
+
+    /** Defines @a instanceIds. */
+    void setInstanceIds(const QStringList &instanceIds) { m_instanceIds = instanceIds; }
+    /** Returns instance IDs. */
+    QStringList instanceIds() const { return m_instanceIds; }
 
     /** Defines Cloud @a comClient object wrapper. */
@@ -71,12 +70,20 @@
 protected:
 
+    /** Populates pages. */
+    virtual void populatePages() /* override final */;
+
     /** Handles translation event. */
-    virtual void retranslateUi() /* override */;
+    virtual void retranslateUi() /* override final */;
 
 private:
 
     /** Holds the full group name (/provider/profile) to add VM to. */
-    QString  m_strFullGroupName;
-
+    QString       m_strFullGroupName;
+    /** Holds the short provider name. */
+    QString       m_strShortProviderName;
+    /** Holds the profile name. */
+    QString       m_strProfileName;
+    /** Holds the instance ids. */
+    QStringList   m_instanceIds;
     /** Holds the Cloud Client object wrapper. */
     CCloudClient  m_comClient;
Index: trunk/src/VBox/Frontends/VirtualBox/src/wizards/addcloudvm/UIWizardAddCloudVMPageBasic1.cpp
===================================================================
--- trunk/src/VBox/Frontends/VirtualBox/src/wizards/addcloudvm/UIWizardAddCloudVMPageBasic1.cpp	(revision 89998)
+++ trunk/src/VBox/Frontends/VirtualBox/src/wizards/addcloudvm/UIWizardAddCloudVMPageBasic1.cpp	(revision 89999)
@@ -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,9 +17,8 @@
 
 /* Qt includes: */
+#include <QGridLayout>
 #include <QHeaderView>
-#include <QGridLayout>
 #include <QLabel>
 #include <QListWidget>
-#include <QTableWidget>
 #include <QVBoxLayout>
 
@@ -39,87 +38,90 @@
 #include "CStringArray.h"
 
+/* Namespaces: */
+using namespace UIWizardAddCloudVMPage1;
+
 
 /*********************************************************************************************************************************
-*   Class UIWizardAddCloudVMPage1 implementation.                                                                                *
+*   Namespace UIWizardAddCloudVMPage1 implementation.                                                                            *
 *********************************************************************************************************************************/
 
-UIWizardAddCloudVMPage1::UIWizardAddCloudVMPage1()
-    : m_fPolished(false)
-    , m_pSourceLayout(0)
-    , m_pSourceLabel(0)
-    , m_pSourceComboBox(0)
-    , m_pCloudContainerLayout(0)
-    , m_pProfileLabel(0)
-    , m_pProfileComboBox(0)
-    , m_pProfileToolButton(0)
-    , m_pProfileInstanceLabel(0)
-    , m_pProfileInstanceList(0)
-{
-}
-
-void UIWizardAddCloudVMPage1::populateSources()
-{
-    /* To be executed just once, so combo should be empty: */
-    AssertReturnVoid(m_pSourceComboBox->count() == 0);
-
-    /* Do we have OCI source? */
-    bool fOCIPresent = false;
-
-    /* Main API request sequence, can be interrupted after any step: */
-    do
-    {
-        /* Initialize Cloud Provider Manager: */
-        CVirtualBox comVBox = uiCommon().virtualBox();
-        m_comCloudProviderManager = comVBox.GetCloudProviderManager();
-        if (!comVBox.isOk())
-        {
-            msgCenter().cannotAcquireCloudProviderManager(comVBox);
-            break;
-        }
-
-        /* Acquire existing providers: */
-        const QVector<CCloudProvider> providers = m_comCloudProviderManager.GetProviders();
-        if (!m_comCloudProviderManager.isOk())
-        {
-            msgCenter().cannotAcquireCloudProviderManagerParameter(m_comCloudProviderManager);
-            break;
-        }
-
-        /* Iterate through existing providers: */
-        foreach (const CCloudProvider &comProvider, providers)
-        {
-            /* Skip if we have nothing to populate (file missing?): */
-            if (comProvider.isNull())
-                continue;
-
-            /* Compose empty item, fill it's data: */
-            m_pSourceComboBox->addItem(QString());
-            m_pSourceComboBox->setItemData(m_pSourceComboBox->count() - 1, comProvider.GetId(),        SourceData_ID);
-            m_pSourceComboBox->setItemData(m_pSourceComboBox->count() - 1, comProvider.GetName(),      SourceData_Name);
-            m_pSourceComboBox->setItemData(m_pSourceComboBox->count() - 1, comProvider.GetShortName(), SourceData_ShortName);
-            if (m_pSourceComboBox->itemData(m_pSourceComboBox->count() - 1, SourceData_ShortName).toString() == "OCI")
-                fOCIPresent = true;
-        }
-    }
-    while (0);
-
-    /* Set default: */
-    if (fOCIPresent)
-        setSource("OCI");
-}
-
-void UIWizardAddCloudVMPage1::populateProfiles()
-{
+void UIWizardAddCloudVMPage1::populateProviders(QIComboBox *pCombo)
+{
+    /* Sanity check: */
+    AssertPtrReturnVoid(pCombo);
+    /* We need top-level parent as well: */
+    QWidget *pParent = pCombo->window();
+    AssertPtrReturnVoid(pParent);
+
     /* Block signals while updating: */
-    m_pProfileComboBox->blockSignals(true);
+    pCombo->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();
+    if (pCombo->currentIndex() != -1)
+        strOldData = pCombo->itemData(pCombo->currentIndex(), ProviderData_ShortName).toString();
+    /* Otherwise "OCI" should be the default one: */
     else
+        strOldData = "OCI";
+
+    /* Clear combo initially: */
+    pCombo->clear();
+
+    /* 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 the data: */
+        pCombo->addItem(QString());
+        pCombo->setItemData(pCombo->count() - 1, strProviderName,      ProviderData_Name);
+        pCombo->setItemData(pCombo->count() - 1, strProviderShortName, ProviderData_ShortName);
+    }
+
+    /* Set previous/default item if possible: */
+    int iNewIndex = -1;
+    if (   iNewIndex == -1
+        && !strOldData.isNull())
+        iNewIndex = pCombo->findData(strOldData, ProviderData_ShortName);
+    if (   iNewIndex == -1
+        && pCombo->count() > 0)
+        iNewIndex = 0;
+    if (iNewIndex != -1)
+        pCombo->setCurrentIndex(iNewIndex);
+
+    /* Unblock signals after update: */
+    pCombo->blockSignals(false);
+}
+
+void UIWizardAddCloudVMPage1::populateProfiles(QIComboBox *pCombo, const CCloudProvider &comProvider)
+{
+    /* Sanity check: */
+    AssertPtrReturnVoid(pCombo);
+    AssertReturnVoid(comProvider.isNotNull());
+    /* We need top-level parent as well: */
+    QWidget *pParent = pCombo->window();
+    AssertPtrReturnVoid(pParent);
+
+    /* Block signals while updating: */
+    pCombo->blockSignals(true);
+
+    /* Remember current item data to be able to restore it: */
+    QString strOldData;
+    if (pCombo->currentIndex() != -1)
+        strOldData = pCombo->itemData(pCombo->currentIndex(), ProfileData_Name).toString();
+    else
     {
         /* Try to fetch "old" profile name from wizard full group name: */
-        UIWizardAddCloudVM *pWizard = qobject_cast<UIWizardAddCloudVM*>(wizardImp());
+        UIWizardAddCloudVM *pWizard = qobject_cast<UIWizardAddCloudVM*>(pParent);
         AssertPtrReturnVoid(pWizard);
         const QString strFullGroupName = pWizard->fullGroupName();
@@ -130,186 +132,100 @@
 
     /* Clear combo initially: */
-    m_pProfileComboBox->clear();
-    /* Clear Cloud Provider: */
-    m_comCloudProvider = CCloudProvider();
-
-    /* If provider chosen: */
-    if (!sourceId().isNull())
-    {
-        /* Main API request sequence, can be interrupted after any step: */
-        do
+    pCombo->clear();
+
+    /* Iterate through existing profiles: */
+    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 the 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);
+}
+
+void UIWizardAddCloudVMPage1::populateProfileInstances(QListWidget *pList, const CCloudClient &comClient)
+{
+    /* Sanity check: */
+    AssertPtrReturnVoid(pList);
+    AssertReturnVoid(comClient.isNotNull());
+    /* We need top-level parent as well: */
+    QWidget *pParent = pList->window();
+    AssertPtrReturnVoid(pParent);
+
+    /* Block signals while updating: */
+    pList->blockSignals(true);
+
+    /* Clear list initially: */
+    pList->clear();
+
+    /* Gather instance names and ids: */
+    CStringArray comNames;
+    CStringArray comIDs;
+    if (listCloudSourceInstances(comClient, comNames, comIDs, pParent))
+    {
+        /* Push acquired names to list rows: */
+        const QVector<QString> names = comNames.GetValues();
+        const QVector<QString> ids = comIDs.GetValues();
+        for (int i = 0; i < names.size(); ++i)
         {
-            /* (Re)initialize Cloud Provider: */
-            m_comCloudProvider = m_comCloudProviderManager.GetProviderById(sourceId());
-            if (!m_comCloudProviderManager.isOk())
+            /* Create list item: */
+            QListWidgetItem *pItem = new QListWidgetItem(names.at(i), pList);
+            if (pItem)
             {
-                msgCenter().cannotFindCloudProvider(m_comCloudProviderManager, sourceId());
-                break;
+                pItem->setFlags(pItem->flags() & ~Qt::ItemIsEditable);
+                pItem->setData(Qt::UserRole, ids.at(i));
             }
-
-            /* Acquire existing profile names: */
-            const QVector<QString> profileNames = m_comCloudProvider.GetProfileNames();
-            if (!m_comCloudProvider.isOk())
-            {
-                msgCenter().cannotAcquireCloudProviderParameter(m_comCloudProvider);
-                break;
-            }
-
-            /* Iterate through existing profile names: */
-            foreach (const QString &strProfileName, profileNames)
-            {
-                /* Skip if we have nothing to show (wtf happened?): */
-                if (strProfileName.isEmpty())
-                    continue;
-
-                /* 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);
         }
-        while (0);
-    }
+    }
+
+    /* Choose the 1st one by default if possible: */
+    if (pList->count())
+        pList->setCurrentRow(0);
 
     /* Unblock signals after update: */
-    m_pProfileComboBox->blockSignals(false);
-}
-
-void UIWizardAddCloudVMPage1::populateProfile()
-{
-    /* Clear Cloud Profile: */
-    m_comCloudProfile = CCloudProfile();
-
-    /* If both provider and profile chosen: */
-    if (m_comCloudProvider.isNotNull() && !profileName().isNull())
-    {
-        /* Acquire Cloud Profile: */
-        m_comCloudProfile = m_comCloudProvider.GetProfileByName(profileName());
-        /* Show error message if necessary: */
-        if (!m_comCloudProvider.isOk())
-            msgCenter().cannotFindCloudProfile(m_comCloudProvider, profileName());
-    }
-}
-
-void UIWizardAddCloudVMPage1::populateProfileInstances()
-{
-    /* Block signals while updating: */
-    m_pProfileInstanceList->blockSignals(true);
-
-    /* Clear list initially: */
-    m_pProfileInstanceList->clear();
-    /* Clear Cloud Client: */
-    setClient(CCloudClient());
-
-    /* If profile chosen: */
-    if (m_comCloudProfile.isNotNull())
-    {
-        /* Main API request sequence, can be interrupted after any step: */
-        do
-        {
-            /* Acquire Cloud Client: */
-            CCloudClient comCloudClient = m_comCloudProfile.CreateCloudClient();
-            if (!m_comCloudProfile.isOk())
-            {
-                msgCenter().cannotCreateCloudClient(m_comCloudProfile);
-                break;
-            }
-
-            /* Remember Cloud Client: */
-            setClient(comCloudClient);
-
-            /* Gather instance names and ids: */
-            CStringArray comNames;
-            CStringArray comIDs;
-            if (listCloudSourceInstances(comCloudClient, comNames, comIDs, wizardImp()))
-            {
-                /* Push acquired names to list rows: */
-                const QVector<QString> names = comNames.GetValues();
-                const QVector<QString> ids = comIDs.GetValues();
-                for (int i = 0; i < names.size(); ++i)
-                {
-                    /* Create list item: */
-                    QListWidgetItem *pItem = new QListWidgetItem(names.at(i), m_pProfileInstanceList);
-                    if (pItem)
-                    {
-                        pItem->setFlags(pItem->flags() & ~Qt::ItemIsEditable);
-                        pItem->setData(Qt::UserRole, ids.at(i));
-                    }
-                }
-            }
-
-            /* Choose the 1st one by default if possible: */
-            if (m_pProfileInstanceList->count())
-                m_pProfileInstanceList->setCurrentRow(0);
-        }
-        while (0);
-    }
-
-    /* Unblock signals after update: */
-    m_pProfileInstanceList->blockSignals(false);
-}
-
-void UIWizardAddCloudVMPage1::updateSourceComboToolTip()
-{
-    const int iCurrentIndex = m_pSourceComboBox->currentIndex();
+    pList->blockSignals(false);
+}
+
+void UIWizardAddCloudVMPage1::updateComboToolTip(QIComboBox *pCombo)
+{
+    /* Sanity check: */
+    AssertPtrReturnVoid(pCombo);
+
+    const int iCurrentIndex = pCombo->currentIndex();
     if (iCurrentIndex != -1)
     {
-        const QString strCurrentToolTip = m_pSourceComboBox->itemData(iCurrentIndex, Qt::ToolTipRole).toString();
-        AssertMsg(!strCurrentToolTip.isEmpty(), ("Data not found!"));
-        m_pSourceComboBox->setToolTip(strCurrentToolTip);
-    }
-}
-
-void UIWizardAddCloudVMPage1::setSource(const QString &strSource)
-{
-    const int iIndex = m_pSourceComboBox->findData(strSource, SourceData_ShortName);
-    AssertMsg(iIndex != -1, ("Data not found!"));
-    m_pSourceComboBox->setCurrentIndex(iIndex);
-}
-
-QString UIWizardAddCloudVMPage1::source() const
-{
-    const int iIndex = m_pSourceComboBox->currentIndex();
-    return m_pSourceComboBox->itemData(iIndex, SourceData_ShortName).toString();
-}
-
-QUuid UIWizardAddCloudVMPage1::sourceId() const
-{
-    const int iIndex = m_pSourceComboBox->currentIndex();
-    return m_pSourceComboBox->itemData(iIndex, SourceData_ID).toUuid();
-}
-
-QString UIWizardAddCloudVMPage1::profileName() const
-{
-    const int iIndex = m_pProfileComboBox->currentIndex();
-    return m_pProfileComboBox->itemData(iIndex, ProfileData_Name).toString();
-}
-
-QStringList UIWizardAddCloudVMPage1::instanceIds() const
+        const QString strCurrentToolTip = pCombo->itemData(iCurrentIndex, Qt::ToolTipRole).toString();
+        AssertMsg(!strCurrentToolTip.isEmpty(), ("Tool-tip data not found!\n"));
+        pCombo->setToolTip(strCurrentToolTip);
+    }
+}
+
+QStringList UIWizardAddCloudVMPage1::currentListWidgetData(QListWidget *pList)
 {
     QStringList result;
-    foreach (QListWidgetItem *pItem, m_pProfileInstanceList->selectedItems())
+    foreach (QListWidgetItem *pItem, pList->selectedItems())
         result << pItem->data(Qt::UserRole).toString();
     return result;
-}
-
-void UIWizardAddCloudVMPage1::setClient(const CCloudClient &comClient)
-{
-    qobject_cast<UIWizardAddCloudVM*>(wizardImp())->setClient(comClient);
-}
-
-CCloudClient UIWizardAddCloudVMPage1::client() const
-{
-    return qobject_cast<UIWizardAddCloudVM*>(wizardImp())->client();
 }
 
@@ -321,89 +237,84 @@
 UIWizardAddCloudVMPageBasic1::UIWizardAddCloudVMPageBasic1()
     : m_pLabelMain(0)
+    , m_pProviderLayout(0)
+    , m_pProviderLabel(0)
+    , m_pProviderComboBox(0)
     , m_pLabelDescription(0)
-{
-    /* Create main layout: */
-    QVBoxLayout *pMainLayout = new QVBoxLayout(this);
-    if (pMainLayout)
-    {
-        /* Create main label: */
+    , m_pOptionsLayout(0)
+    , m_pProfileLabel(0)
+    , m_pProfileComboBox(0)
+    , m_pProfileToolButton(0)
+    , m_pSourceInstanceLabel(0)
+    , m_pSourceInstanceList(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 provider layout: */
+        m_pProviderLayout = new QGridLayout;
+        if (m_pProviderLayout)
         {
+            m_pProviderLayout->setContentsMargins(0, 0, 0, 0);
+            m_pProviderLayout->setColumnStretch(0, 0);
+            m_pProviderLayout->setColumnStretch(1, 1);
+
+            /* Prepare provider label: */
+            m_pProviderLabel = new QLabel(this);
+            if (m_pProviderLabel)
+                m_pProviderLayout->addWidget(m_pProviderLabel, 0, 0, Qt::AlignRight);
+            /* Prepare provider combo-box: */
+            m_pProviderComboBox = new QIComboBox(this);
+            if (m_pProviderComboBox)
+            {
+                m_pProviderLabel->setBuddy(m_pProviderComboBox);
+                m_pProviderLayout->addWidget(m_pProviderComboBox, 0, 1);
+            }
+
             /* Add into layout: */
-            pMainLayout->addWidget(m_pLabelMain);
+            pLayoutMain->addLayout(m_pProviderLayout);
         }
 
-        /* Create source layout: */
-        m_pSourceLayout = new QGridLayout;
-        if (m_pSourceLayout)
-        {
-            m_pSourceLayout->setContentsMargins(0, 0, 0, 0);
-            m_pSourceLayout->setColumnStretch(0, 0);
-            m_pSourceLayout->setColumnStretch(1, 1);
-
-            /* Create source label: */
-            m_pSourceLabel = new QLabel(this);
-            if (m_pSourceLabel)
-            {
-                /* Add into layout: */
-                m_pSourceLayout->addWidget(m_pSourceLabel, 0, 0, Qt::AlignRight);
-            }
-            /* Create source selector: */
-            m_pSourceComboBox = new QIComboBox(this);
-            if (m_pSourceComboBox)
-            {
-                m_pSourceLabel->setBuddy(m_pSourceComboBox);
-
-                /* Add into layout: */
-                m_pSourceLayout->addWidget(m_pSourceComboBox, 0, 1);
-            }
-
-            /* Add into layout: */
-            pMainLayout->addLayout(m_pSourceLayout);
-        }
-
-        /* Create description label: */
+        /* Prepare description label: */
         m_pLabelDescription = new QIRichTextLabel(this);
         if (m_pLabelDescription)
+            pLayoutMain->addWidget(m_pLabelDescription);
+
+        /* Prepare options layout: */
+        m_pOptionsLayout = new QGridLayout;
+        if (m_pOptionsLayout)
         {
-            /* Add into layout: */
-            pMainLayout->addWidget(m_pLabelDescription);
-        }
-
-        /* Create cloud container layout: */
-        m_pCloudContainerLayout = new QGridLayout;
-        if (m_pCloudContainerLayout)
-        {
-            m_pCloudContainerLayout->setContentsMargins(0, 0, 0, 0);
-            m_pCloudContainerLayout->setColumnStretch(0, 0);
-            m_pCloudContainerLayout->setColumnStretch(1, 1);
-            m_pCloudContainerLayout->setRowStretch(1, 0);
-            m_pCloudContainerLayout->setRowStretch(2, 1);
-
-            /* Create profile label: */
+            m_pOptionsLayout->setContentsMargins(0, 0, 0, 0);
+            m_pOptionsLayout->setColumnStretch(0, 0);
+            m_pOptionsLayout->setColumnStretch(1, 1);
+            m_pOptionsLayout->setRowStretch(1, 0);
+            m_pOptionsLayout->setRowStretch(2, 1);
+
+            /* Prepare profile label: */
             m_pProfileLabel = new QLabel(this);
             if (m_pProfileLabel)
+                m_pOptionsLayout->addWidget(m_pProfileLabel, 0, 0, Qt::AlignRight);
+
+            /* Prepare profile layout: */
+            QHBoxLayout *pProfileLayout = new QHBoxLayout;
+            if (pProfileLayout)
             {
-                /* Add into layout: */
-                m_pCloudContainerLayout->addWidget(m_pProfileLabel, 0, 0, Qt::AlignRight);
-            }
-            /* Create sub-layout: */
-            QHBoxLayout *pSubLayout = new QHBoxLayout;
-            if (pSubLayout)
-            {
-                pSubLayout->setContentsMargins(0, 0, 0, 0);
-                pSubLayout->setSpacing(1);
-
-                /* Create profile combo-box: */
+                pProfileLayout->setContentsMargins(0, 0, 0, 0);
+                pProfileLayout->setSpacing(1);
+
+                /* Prepare profile combo-box: */
                 m_pProfileComboBox = new QIComboBox(this);
                 if (m_pProfileComboBox)
                 {
                     m_pProfileLabel->setBuddy(m_pProfileComboBox);
-
-                    /* Add into layout: */
-                    pSubLayout->addWidget(m_pProfileComboBox);
+                    pProfileLayout->addWidget(m_pProfileComboBox);
                 }
-                /* Create profile tool-button: */
+
+                /* Prepare profile tool-button: */
                 m_pProfileToolButton = new QIToolButton(this);
                 if (m_pProfileToolButton)
@@ -411,41 +322,38 @@
                     m_pProfileToolButton->setIcon(UIIconPool::iconSet(":/cloud_profile_manager_16px.png",
                                                                       ":/cloud_profile_manager_disabled_16px.png"));
-
-                    /* Add into layout: */
-                    pSubLayout->addWidget(m_pProfileToolButton);
+                    pProfileLayout->addWidget(m_pProfileToolButton);
                 }
 
                 /* Add into layout: */
-                m_pCloudContainerLayout->addLayout(pSubLayout, 0, 1);
+                m_pOptionsLayout->addLayout(pProfileLayout, 0, 1);
             }
 
-            /* Create profile instance label: */
-            m_pProfileInstanceLabel = new QLabel(this);
-            if (m_pProfileInstanceLabel)
+            /* Prepare source instance label: */
+            m_pSourceInstanceLabel = new QLabel(this);
+            if (m_pSourceInstanceLabel)
+                m_pOptionsLayout->addWidget(m_pSourceInstanceLabel, 1, 0, Qt::AlignRight);
+
+            /* Prepare source instances table: */
+            m_pSourceInstanceList = new QListWidget(this);
+            if (m_pSourceInstanceList)
             {
-                /* Add into layout: */
-                m_pCloudContainerLayout->addWidget(m_pProfileInstanceLabel, 1, 0, Qt::AlignRight);
-            }
-            /* Create profile instances table: */
-            m_pProfileInstanceList = new QListWidget(this);
-            if (m_pProfileInstanceList)
-            {
-                m_pProfileInstanceLabel->setBuddy(m_pProfileInstanceLabel);
-                const QFontMetrics fm(m_pProfileInstanceList->font());
+                m_pSourceInstanceLabel->setBuddy(m_pSourceInstanceLabel);
+                /* Make source image list fit 50 symbols
+                 * horizontally and 8 lines vertically: */
+                const QFontMetrics fm(m_pSourceInstanceList->font());
                 const int iFontWidth = fm.width('x');
                 const int iTotalWidth = 50 * iFontWidth;
                 const int iFontHeight = fm.height();
-                const int iTotalHeight = 4 * iFontHeight;
-                m_pProfileInstanceList->setMinimumSize(QSize(iTotalWidth, iTotalHeight));
-                //m_pProfileInstanceList->setSizePolicy(QSizePolicy::Ignored, QSizePolicy::Ignored);
-                m_pProfileInstanceList->setAlternatingRowColors(true);
-                m_pProfileInstanceList->setSelectionMode(QAbstractItemView::ExtendedSelection);
+                const int iTotalHeight = 8 * iFontHeight;
+                m_pSourceInstanceList->setMinimumSize(QSize(iTotalWidth, iTotalHeight));
+                m_pSourceInstanceList->setAlternatingRowColors(true);
+                m_pSourceInstanceList->setSelectionMode(QAbstractItemView::ExtendedSelection);
 
                 /* Add into layout: */
-                m_pCloudContainerLayout->addWidget(m_pProfileInstanceList, 1, 1, 2, 1);
+                m_pOptionsLayout->addWidget(m_pSourceInstanceList, 1, 1, 2, 1);
             }
 
             /* Add into layout: */
-            pMainLayout->addLayout(m_pCloudContainerLayout);
+            pLayoutMain->addLayout(m_pOptionsLayout);
         }
     }
@@ -453,20 +361,15 @@
     /* Setup connections: */
     connect(gVBoxEvents, &UIVirtualBoxEventHandler::sigCloudProfileRegistered,
-            this, &UIWizardAddCloudVMPageBasic1::sltHandleSourceChange);
+            this, &UIWizardAddCloudVMPageBasic1::sltHandleProviderComboChange);
     connect(gVBoxEvents, &UIVirtualBoxEventHandler::sigCloudProfileChanged,
-            this, &UIWizardAddCloudVMPageBasic1::sltHandleSourceChange);
-    connect(m_pSourceComboBox, static_cast<void(QIComboBox::*)(int)>(&QIComboBox::activated),
-            this, &UIWizardAddCloudVMPageBasic1::sltHandleSourceChange);
+            this, &UIWizardAddCloudVMPageBasic1::sltHandleProviderComboChange);
+    connect(m_pProviderComboBox, static_cast<void(QIComboBox::*)(int)>(&QIComboBox::activated),
+            this, &UIWizardAddCloudVMPageBasic1::sltHandleProviderComboChange);
     connect(m_pProfileComboBox, static_cast<void(QIComboBox::*)(int)>(&QIComboBox::currentIndexChanged),
             this, &UIWizardAddCloudVMPageBasic1::sltHandleProfileComboChange);
     connect(m_pProfileToolButton, &QIToolButton::clicked,
             this, &UIWizardAddCloudVMPageBasic1::sltHandleProfileButtonClick);
-    connect(m_pProfileInstanceList, &QListWidget::currentRowChanged,
-            this, &UIWizardAddCloudVMPageBasic1::completeChanged);
-
-    /* Register fields: */
-    registerField("source", this, "source");
-    registerField("profileName", this, "profileName");
-    registerField("instanceIds", this, "instanceIds");
+    connect(m_pSourceInstanceList, &QListWidget::currentRowChanged,
+            this, &UIWizardAddCloudVMPageBasic1::sltHandleSourceInstanceChange);
 }
 
@@ -480,12 +383,12 @@
                                                  "be one of known cloud service providers below."));
 
-    /* Translate source label: */
-    m_pSourceLabel->setText(UIWizardAddCloudVM::tr("&Source:"));
+    /* Translate provider label: */
+    m_pProviderLabel->setText(UIWizardAddCloudVM::tr("&Source:"));
     /* Translate received values of Source combo-box.
      * We are enumerating starting from 0 for simplicity: */
-    for (int i = 0; i < m_pSourceComboBox->count(); ++i)
-    {
-        m_pSourceComboBox->setItemText(i, m_pSourceComboBox->itemData(i, SourceData_Name).toString());
-        m_pSourceComboBox->setItemData(i, UIWizardAddCloudVM::tr("Add VM from cloud service provider."), Qt::ToolTipRole);
+    for (int i = 0; i < m_pProviderComboBox->count(); ++i)
+    {
+        m_pProviderComboBox->setItemText(i, m_pProviderComboBox->itemData(i, ProviderData_Name).toString());
+        m_pProviderComboBox->setItemData(i, UIWizardAddCloudVM::tr("Add VM from cloud service provider."), Qt::ToolTipRole);
     }
 
@@ -499,35 +402,31 @@
     m_pProfileLabel->setText(UIWizardAddCloudVM::tr("&Profile:"));
     m_pProfileToolButton->setToolTip(UIWizardAddCloudVM::tr("Open Cloud Profile Manager..."));
-    m_pProfileInstanceLabel->setText(UIWizardAddCloudVM::tr("&Instances:"));
+    m_pSourceInstanceLabel->setText(UIWizardAddCloudVM::tr("&Instances:"));
 
     /* Adjust label widths: */
     QList<QWidget*> labels;
-    labels << m_pSourceLabel;
+    labels << m_pProviderLabel;
     labels << m_pProfileLabel;
-    labels << m_pProfileInstanceLabel;
+    labels << m_pSourceInstanceLabel;
     int iMaxWidth = 0;
     foreach (QWidget *pLabel, labels)
         iMaxWidth = qMax(iMaxWidth, pLabel->minimumSizeHint().width());
-    m_pSourceLayout->setColumnMinimumWidth(0, iMaxWidth);
-    m_pCloudContainerLayout->setColumnMinimumWidth(0, iMaxWidth);
+    m_pProviderLayout->setColumnMinimumWidth(0, iMaxWidth);
+    m_pOptionsLayout->setColumnMinimumWidth(0, iMaxWidth);
 
     /* Update tool-tips: */
-    updateSourceComboToolTip();
+    updateComboToolTip(m_pProviderComboBox);
 }
 
 void UIWizardAddCloudVMPageBasic1::initializePage()
 {
-    /* If wasn't polished yet: */
-    if (!m_fPolished)
-    {
-        /* Populate sources: */
-        populateSources();
-        /* Choose one of them, asynchronously: */
-        QMetaObject::invokeMethod(this, "sltHandleSourceChange", Qt::QueuedConnection);
-        m_fPolished = true;
-    }
-
-    /* Translate page: */
+    /* Populate providers: */
+    populateProviders(m_pProviderComboBox);
+    /* Translate providers: */
     retranslateUi();
+    /* Fetch it, asynchronously: */
+    QMetaObject::invokeMethod(this, "sltHandleProviderComboChange", Qt::QueuedConnection);
+    /* Make image list focused by default: */
+    m_pSourceInstanceList->setFocus();
 }
 
@@ -551,29 +450,14 @@
     bool fResult = true;
 
-    /* Lock finish button: */
-    startProcessing();
-
     /* Try to add cloud VMs: */
     fResult = qobject_cast<UIWizardAddCloudVM*>(wizard())->addCloudVMs();
 
-    /* Unlock finish button: */
-    endProcessing();
-
     /* Return result: */
     return fResult;
 }
 
-void UIWizardAddCloudVMPageBasic1::sltHandleSourceChange()
-{
-    /* Update tool-tip: */
-    updateSourceComboToolTip();
-
-    /* Make instance list focused by default: */
-    m_pProfileInstanceList->setFocus();
-
-    /* Refresh required settings: */
-    populateProfiles();
-    populateProfile();
-    populateProfileInstances();
+void UIWizardAddCloudVMPageBasic1::sltHandleProviderComboChange()
+{
+    updateProvider();
     emit completeChanged();
 }
@@ -581,7 +465,5 @@
 void UIWizardAddCloudVMPageBasic1::sltHandleProfileComboChange()
 {
-    /* Refresh required settings: */
-    populateProfile();
-    populateProfileInstances();
+    updateProfile();
     emit completeChanged();
 }
@@ -589,6 +471,73 @@
 void UIWizardAddCloudVMPageBasic1::sltHandleProfileButtonClick()
 {
-    /* Open Cloud Profile Manager: */
     if (gpManager)
         gpManager->openCloudProfileManager();
 }
+
+void UIWizardAddCloudVMPageBasic1::sltHandleSourceInstanceChange()
+{
+    updateSourceInstance();
+    emit completeChanged();
+}
+
+void UIWizardAddCloudVMPageBasic1::setShortProviderName(const QString &strShortProviderName)
+{
+    qobject_cast<UIWizardAddCloudVM*>(wizard())->setShortProviderName(strShortProviderName);
+}
+
+QString UIWizardAddCloudVMPageBasic1::shortProviderName() const
+{
+    return qobject_cast<UIWizardAddCloudVM*>(wizard())->shortProviderName();
+}
+
+void UIWizardAddCloudVMPageBasic1::setProfileName(const QString &strProfileName)
+{
+    qobject_cast<UIWizardAddCloudVM*>(wizard())->setProfileName(strProfileName);
+}
+
+QString UIWizardAddCloudVMPageBasic1::profileName() const
+{
+    return qobject_cast<UIWizardAddCloudVM*>(wizard())->profileName();
+}
+
+void UIWizardAddCloudVMPageBasic1::setClient(const CCloudClient &comClient)
+{
+    qobject_cast<UIWizardAddCloudVM*>(wizard())->setClient(comClient);
+}
+
+CCloudClient UIWizardAddCloudVMPageBasic1::client() const
+{
+    return qobject_cast<UIWizardAddCloudVM*>(wizard())->client();
+}
+
+void UIWizardAddCloudVMPageBasic1::setInstanceIds(const QStringList &instanceIds)
+{
+    qobject_cast<UIWizardAddCloudVM*>(wizard())->setInstanceIds(instanceIds);
+}
+
+QStringList UIWizardAddCloudVMPageBasic1::instanceIds() const
+{
+    return qobject_cast<UIWizardAddCloudVM*>(wizard())->instanceIds();
+}
+
+void UIWizardAddCloudVMPageBasic1::updateProvider()
+{
+    updateComboToolTip(m_pProviderComboBox);
+    setShortProviderName(m_pProviderComboBox->currentData(ProviderData_ShortName).toString());
+    CCloudProvider comCloudProvider = cloudProviderByShortName(shortProviderName(), wizard());
+    populateProfiles(m_pProfileComboBox, comCloudProvider);
+    updateProfile();
+}
+
+void UIWizardAddCloudVMPageBasic1::updateProfile()
+{
+    setProfileName(m_pProfileComboBox->currentData(ProfileData_Name).toString());
+    setClient(cloudClientByName(shortProviderName(), profileName(), wizard()));
+    populateProfileInstances(m_pSourceInstanceList, client());
+    updateSourceInstance();
+}
+
+void UIWizardAddCloudVMPageBasic1::updateSourceInstance()
+{
+    setInstanceIds(currentListWidgetData(m_pSourceInstanceList));
+}
Index: trunk/src/VBox/Frontends/VirtualBox/src/wizards/addcloudvm/UIWizardAddCloudVMPageBasic1.h
===================================================================
--- trunk/src/VBox/Frontends/VirtualBox/src/wizards/addcloudvm/UIWizardAddCloudVMPageBasic1.h	(revision 89998)
+++ trunk/src/VBox/Frontends/VirtualBox/src/wizards/addcloudvm/UIWizardAddCloudVMPageBasic1.h	(revision 89999)
@@ -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,12 +23,9 @@
 
 /* GUI includes: */
-#include "UIWizardPage.h"
+#include "UINativeWizardPage.h"
 
 /* COM includes: */
 #include "COMEnums.h"
 #include "CCloudClient.h"
-#include "CCloudProfile.h"
-#include "CCloudProvider.h"
-#include "CCloudProviderManager.h"
 
 /* Forward declarations: */
@@ -36,15 +33,13 @@
 class QLabel;
 class QListWidget;
-class QTableWidget;
 class QIComboBox;
 class QIRichTextLabel;
 class QIToolButton;
 
-/** Source combo data fields. */
+/** Provider combo data fields. */
 enum
 {
-    SourceData_ID        = Qt::UserRole + 1,
-    SourceData_Name      = Qt::UserRole + 2,
-    SourceData_ShortName = Qt::UserRole + 3
+    ProviderData_Name      = Qt::UserRole + 1,
+    ProviderData_ShortName = Qt::UserRole + 2
 };
 
@@ -55,79 +50,26 @@
 };
 
-/** UIWizardPageBase extension for 1st page of the Add Cloud VM wizard. */
-class UIWizardAddCloudVMPage1 : public UIWizardPageBase
+/** Namespace for 1st page of the Add Cloud VM wizard. */
+namespace UIWizardAddCloudVMPage1
 {
-protected:
+    /** Populates @a pCombo with known providers. */
+    void populateProviders(QIComboBox *pCombo);
+    /** Populates @a pCombo with known profiles of @a comProvider specified. */
+    void populateProfiles(QIComboBox *pCombo, const CCloudProvider &comProvider);
+    /** Populates @a pList with profile instances available in @a comClient. */
+    void populateProfileInstances(QListWidget *pList, const CCloudClient &comClient);
 
-    /** Constructs 1st page base. */
-    UIWizardAddCloudVMPage1();
+    /** Updates @a pCombo tool-tips. */
+    void updateComboToolTip(QIComboBox *pCombo);
 
-    /** Populates sources. */
-    void populateSources();
-    /** Populates profiles. */
-    void populateProfiles();
-    /** Populates profile. */
-    void populateProfile();
-    /** Populates profile instances. */
-    void populateProfileInstances();
+    /** Returns current user data for @a pList specified. */
+    QStringList currentListWidgetData(QListWidget *pList);
+}
 
-    /** Updates source combo tool-tips. */
-    void updateSourceComboToolTip();
-
-    /** Defines @a strSource. */
-    void setSource(const QString &strSource);
-    /** Returns source. */
-    QString source() const;
-    /** Returns source ID. */
-    QUuid sourceId() const;
-
-    /** Returns profile name. */
-    QString profileName() const;
-    /** Returns instance IDs. */
-    QStringList instanceIds() const;
-
-    /** Defines Cloud @a comClient object. */
-    void setClient(const CCloudClient &comClient);
-    /** Returns Cloud Client object. */
-    CCloudClient client() const;
-
-    /** Holds whether starting page was polished. */
-    bool  m_fPolished;
-
-    /** 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 source layout instance. */
-    QGridLayout *m_pSourceLayout;
-    /** Holds the source type label instance. */
-    QLabel      *m_pSourceLabel;
-    /** Holds the source type combo-box instance. */
-    QIComboBox  *m_pSourceComboBox;
-
-    /** Holds the cloud container layout instance. */
-    QGridLayout  *m_pCloudContainerLayout;
-    /** 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 profile instance label instance. */
-    QLabel       *m_pProfileInstanceLabel;
-    /** Holds the profile instance list instance. */
-    QListWidget  *m_pProfileInstanceList;
-};
-
-/** UIWizardPage extension for 1st page of the Add Cloud VM wizard, extends UIWizardAddCloudVMPage1 as well. */
-class UIWizardAddCloudVMPageBasic1 : public UIWizardPage, public UIWizardAddCloudVMPage1
+/** UINativeWizardPage extension for 1st page of the Add Cloud VM wizard,
+  * based on UIWizardAddCloudVMPage1 namespace functions. */
+class UIWizardAddCloudVMPageBasic1 : public UINativeWizardPage
 {
     Q_OBJECT;
-    Q_PROPERTY(QString source READ source);
-    Q_PROPERTY(QString profileName READ profileName);
-    Q_PROPERTY(QStringList instanceIds READ instanceIds);
 
 public:
@@ -138,36 +80,83 @@
 protected:
 
-    /** Allows access wizard from base part. */
-    virtual UIWizard *wizardImp() const /* override */ { return UIWizardPage::wizard(); }
-
     /** Handles translation event. */
-    virtual void retranslateUi() /* override */;
+    virtual void retranslateUi() /* override final */;
 
     /** Performs page initialization. */
-    virtual void initializePage() /* override */;
+    virtual void initializePage() /* override final */;
 
     /** Returns whether page is complete. */
-    virtual bool isComplete() const /* override */;
+    virtual bool isComplete() const /* override final */;
 
     /** Performs page validation. */
-    virtual bool validatePage() /* override */;
+    virtual bool validatePage() /* override final */;
 
 private slots:
 
-    /** Handles change in source combo-box. */
-    void sltHandleSourceChange();
+    /** Handles change in provider combo-box. */
+    void sltHandleProviderComboChange();
 
     /** Handles change in profile combo-box. */
     void sltHandleProfileComboChange();
-
     /** Handles profile tool-button click. */
     void sltHandleProfileButtonClick();
 
+    /** Handles change in instance list. */
+    void sltHandleSourceInstanceChange();
+
 private:
+
+    /** Defines short provider name. */
+    void setShortProviderName(const QString &strShortProviderName);
+    /** Returns profile name. */
+    QString shortProviderName() const;
+
+    /** Defines profile name. */
+    void setProfileName(const QString &strProfileName);
+    /** Returns profile name. */
+    QString profileName() const;
+
+    /** Defines Cloud @a comClient object. */
+    void setClient(const CCloudClient &comClient);
+    /** Returns Cloud Client object. */
+    CCloudClient client() const;
+
+    /** Defines @a instanceIds. */
+    void setInstanceIds(const QStringList &instanceIds);
+    /** Returns instance IDs. */
+    QStringList instanceIds() const;
+
+    /** Updates provider. */
+    void updateProvider();
+    /** Updates profile. */
+    void updateProfile();
+    /** Updates source instance. */
+    void updateSourceInstance();
 
     /** Holds the main label instance. */
     QIRichTextLabel *m_pLabelMain;
+
+    /** Holds the provider layout instance. */
+    QGridLayout *m_pProviderLayout;
+    /** Holds the provider type label instance. */
+    QLabel      *m_pProviderLabel;
+    /** Holds the provider type combo-box instance. */
+    QIComboBox  *m_pProviderComboBox;
+
     /** Holds the description label instance. */
     QIRichTextLabel *m_pLabelDescription;
+
+    /** Holds the options layout instance. */
+    QGridLayout  *m_pOptionsLayout;
+    /** 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 source instance label instance. */
+    QLabel       *m_pSourceInstanceLabel;
+    /** Holds the source instance list instance. */
+    QListWidget  *m_pSourceInstanceList;
 };
 
Index: trunk/src/VBox/Frontends/VirtualBox/src/wizards/addcloudvm/UIWizardAddCloudVMPageExpert.cpp
===================================================================
--- trunk/src/VBox/Frontends/VirtualBox/src/wizards/addcloudvm/UIWizardAddCloudVMPageExpert.cpp	(revision 89998)
+++ trunk/src/VBox/Frontends/VirtualBox/src/wizards/addcloudvm/UIWizardAddCloudVMPageExpert.cpp	(revision 89999)
@@ -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,4 +26,5 @@
 #include "QIComboBox.h"
 #include "QIToolButton.h"
+#include "UICloudNetworkingStuff.h"
 #include "UIIconPool.h"
 #include "UIMessageCenter.h"
@@ -33,36 +34,45 @@
 #include "UIWizardAddCloudVMPageExpert.h"
 
+/* Namespaces: */
+using namespace UIWizardAddCloudVMPage1;
+
 
 UIWizardAddCloudVMPageExpert::UIWizardAddCloudVMPageExpert()
-    : m_pCntSource(0)
-{
-    /* Create main layout: */
-    QHBoxLayout *pMainLayout = new QHBoxLayout(this);
-    if (pMainLayout)
+    : m_pCntProvider(0)
+    , m_pProviderLayout(0)
+    , m_pProviderLabel(0)
+    , m_pProviderComboBox(0)
+    , m_pOptionsLayout(0)
+    , m_pProfileLabel(0)
+    , m_pProfileComboBox(0)
+    , m_pProfileToolButton(0)
+    , m_pSourceInstanceLabel(0)
+    , m_pSourceInstanceList(0)
+{
+    /* Prepare main layout: */
+    QHBoxLayout *pLayoutMain = new QHBoxLayout(this);
+    if (pLayoutMain)
     {
-        /* Create source container: */
-        m_pCntSource = new QGroupBox(this);
-        if (m_pCntSource)
+        /* Prepare provider container: */
+        m_pCntProvider = new QGroupBox(this);
+        if (m_pCntProvider)
         {
-            /* Create source layout: */
-            m_pSourceLayout = new QGridLayout(m_pCntSource);
-            if (m_pSourceLayout)
+            /* Prepare provider layout: */
+            m_pProviderLayout = new QGridLayout(m_pCntProvider);
+            if (m_pProviderLayout)
             {
-                /* Create source selector: */
-                m_pSourceComboBox = new QIComboBox(m_pCntSource);
-                if (m_pSourceComboBox)
+                /* Prepare provider selector: */
+                m_pProviderComboBox = new QIComboBox(m_pCntProvider);
+                if (m_pProviderComboBox)
+                    m_pProviderLayout->addWidget(m_pProviderComboBox, 0, 0);
+
+                /* Prepare options layout: */
+                m_pOptionsLayout = new QGridLayout;
+                if (m_pOptionsLayout)
                 {
-                    /* Add into layout: */
-                    m_pSourceLayout->addWidget(m_pSourceComboBox, 0, 0);
-                }
-
-                /* Create cloud container layout: */
-                m_pCloudContainerLayout = new QGridLayout;
-                if (m_pCloudContainerLayout)
-                {
-                    m_pCloudContainerLayout->setContentsMargins(0, 0, 0, 0);
-                    m_pCloudContainerLayout->setRowStretch(1, 1);
-
-                    /* Create sub-layout: */
+                    m_pOptionsLayout->setContentsMargins(0, 0, 0, 0);
+                    m_pOptionsLayout->setRowStretch(1, 1);
+
+                    /* Prepare sub-layout: */
                     QHBoxLayout *pSubLayout = new QHBoxLayout;
                     if (pSubLayout)
@@ -71,51 +81,48 @@
                         pSubLayout->setSpacing(1);
 
-                        /* Create profile combo-box: */
-                        m_pProfileComboBox = new QIComboBox(m_pCntSource);
+                        /* Prepare profile combo-box: */
+                        m_pProfileComboBox = new QIComboBox(m_pCntProvider);
                         if (m_pProfileComboBox)
-                        {
-                            /* Add into layout: */
                             pSubLayout->addWidget(m_pProfileComboBox);
-                        }
-                        /* Create profile tool-button: */
-                        m_pProfileToolButton = new QIToolButton(m_pCntSource);
+
+                        /* Prepare profile tool-button: */
+                        m_pProfileToolButton = new QIToolButton(m_pCntProvider);
                         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);
                         }
 
                         /* Add into layout: */
-                        m_pCloudContainerLayout->addLayout(pSubLayout, 0, 0);
+                        m_pOptionsLayout->addLayout(pSubLayout, 0, 0);
                     }
 
-                    /* Create profile instances table: */
-                    m_pProfileInstanceList = new QListWidget(m_pCntSource);
-                    if (m_pProfileInstanceList)
+                    /* Prepare source instances table: */
+                    m_pSourceInstanceList = new QListWidget(m_pCntProvider);
+                    if (m_pSourceInstanceList)
                     {
-                        const QFontMetrics fm(m_pProfileInstanceList->font());
+                        /* Make source image list fit 50 symbols
+                         * horizontally and 8 lines vertically: */
+                        const QFontMetrics fm(m_pSourceInstanceList->font());
                         const int iFontWidth = fm.width('x');
                         const int iTotalWidth = 50 * iFontWidth;
                         const int iFontHeight = fm.height();
-                        const int iTotalHeight = 4 * iFontHeight;
-                        m_pProfileInstanceList->setMinimumSize(QSize(iTotalWidth, iTotalHeight));
-                        //m_pProfileInstanceList->setSizePolicy(QSizePolicy::Ignored, QSizePolicy::Ignored);
-                        m_pProfileInstanceList->setAlternatingRowColors(true);
-                        m_pProfileInstanceList->setSelectionMode(QAbstractItemView::ExtendedSelection);
+                        const int iTotalHeight = 8 * iFontHeight;
+                        m_pSourceInstanceList->setMinimumSize(QSize(iTotalWidth, iTotalHeight));
+                        m_pSourceInstanceList->setAlternatingRowColors(true);
+                        m_pSourceInstanceList->setSelectionMode(QAbstractItemView::ExtendedSelection);
 
                         /* Add into layout: */
-                        m_pCloudContainerLayout->addWidget(m_pProfileInstanceList, 1, 0);
+                        m_pOptionsLayout->addWidget(m_pSourceInstanceList, 1, 0);
                     }
 
                     /* Add into layout: */
-                    m_pSourceLayout->addLayout(m_pCloudContainerLayout, 1, 0);
+                    m_pProviderLayout->addLayout(m_pOptionsLayout, 1, 0);
                 }
             }
 
             /* Add into layout: */
-            pMainLayout->addWidget(m_pCntSource);
+            pLayoutMain->addWidget(m_pCntProvider);
         }
     }
@@ -123,20 +130,15 @@
     /* Setup connections: */
     connect(gVBoxEvents, &UIVirtualBoxEventHandler::sigCloudProfileRegistered,
-            this, &UIWizardAddCloudVMPageExpert::sltHandleSourceChange);
+            this, &UIWizardAddCloudVMPageExpert::sltHandleProviderComboChange);
     connect(gVBoxEvents, &UIVirtualBoxEventHandler::sigCloudProfileChanged,
-            this, &UIWizardAddCloudVMPageExpert::sltHandleSourceChange);
-    connect(m_pSourceComboBox, static_cast<void(QIComboBox::*)(int)>(&QIComboBox::activated),
-            this, &UIWizardAddCloudVMPageExpert::sltHandleSourceChange);
+            this, &UIWizardAddCloudVMPageExpert::sltHandleProviderComboChange);
+    connect(m_pProviderComboBox, static_cast<void(QIComboBox::*)(int)>(&QIComboBox::activated),
+            this, &UIWizardAddCloudVMPageExpert::sltHandleProviderComboChange);
     connect(m_pProfileComboBox, static_cast<void(QIComboBox::*)(int)>(&QIComboBox::currentIndexChanged),
             this, &UIWizardAddCloudVMPageExpert::sltHandleProfileComboChange);
     connect(m_pProfileToolButton, &QIToolButton::clicked,
             this, &UIWizardAddCloudVMPageExpert::sltHandleProfileButtonClick);
-    connect(m_pProfileInstanceList, &QListWidget::currentRowChanged,
+    connect(m_pSourceInstanceList, &QListWidget::currentRowChanged,
             this, &UIWizardAddCloudVMPageExpert::completeChanged);
-
-    /* Register fields: */
-    registerField("source", this, "source");
-    registerField("profileName", this, "profileName");
-    registerField("instanceIds", this, "instanceIds");
 }
 
@@ -144,5 +146,5 @@
 {
     /* Translate source container: */
-    m_pCntSource->setTitle(UIWizardAddCloudVM::tr("Source"));
+    m_pCntProvider->setTitle(UIWizardAddCloudVM::tr("Source"));
 
     /* Translate profile stuff: */
@@ -151,28 +153,24 @@
     /* Translate received values of Source combo-box.
      * We are enumerating starting from 0 for simplicity: */
-    for (int i = 0; i < m_pSourceComboBox->count(); ++i)
+    for (int i = 0; i < m_pProviderComboBox->count(); ++i)
     {
-        m_pSourceComboBox->setItemText(i, m_pSourceComboBox->itemData(i, SourceData_Name).toString());
-        m_pSourceComboBox->setItemData(i, UIWizardAddCloudVM::tr("Add VM from cloud service provider."), Qt::ToolTipRole);
+        m_pProviderComboBox->setItemText(i, m_pProviderComboBox->itemData(i, ProviderData_Name).toString());
+        m_pProviderComboBox->setItemData(i, UIWizardAddCloudVM::tr("Add VM from cloud service provider."), Qt::ToolTipRole);
     }
 
     /* Update tool-tips: */
-    updateSourceComboToolTip();
+    updateComboToolTip(m_pProviderComboBox);
 }
 
 void UIWizardAddCloudVMPageExpert::initializePage()
 {
-    /* If wasn't polished yet: */
-    if (!UIWizardAddCloudVMPage1::m_fPolished)
-    {
-        /* Populate sources: */
-        populateSources();
-        /* Choose one of them, asynchronously: */
-        QMetaObject::invokeMethod(this, "sltHandleSourceChange", Qt::QueuedConnection);
-        UIWizardAddCloudVMPage1::m_fPolished = true;
-    }
-
-    /* Translate page: */
+    /* Populate providers: */
+    populateProviders(m_pProviderComboBox);
+    /* Translate providers: */
     retranslateUi();
+    /* Fetch it, asynchronously: */
+    QMetaObject::invokeMethod(this, "sltHandleProviderComboChange", Qt::QueuedConnection);
+    /* Make image list focused by default: */
+    m_pSourceInstanceList->setFocus();
 }
 
@@ -184,6 +182,6 @@
     /* Make sure client is not NULL and
      * at least one instance is selected: */
-    fResult =   UIWizardAddCloudVMPage1::client().isNotNull()
-            && !UIWizardAddCloudVMPage1::instanceIds().isEmpty();
+    fResult =    client().isNotNull()
+              && !instanceIds().isEmpty();
 
     /* Return result: */
@@ -196,29 +194,14 @@
     bool fResult = true;
 
-    /* Lock finish button: */
-    startProcessing();
-
     /* Try to add cloud VMs: */
     fResult = qobject_cast<UIWizardAddCloudVM*>(wizard())->addCloudVMs();
 
-    /* Unlock finish button: */
-    endProcessing();
-
     /* Return result: */
     return fResult;
 }
 
-void UIWizardAddCloudVMPageExpert::sltHandleSourceChange()
-{
-    /* Update tool-tip: */
-    updateSourceComboToolTip();
-
-    /* Make instance list focused by default: */
-    m_pProfileInstanceList->setFocus();
-
-    /* Refresh required settings: */
-    populateProfiles();
-    populateProfile();
-    populateProfileInstances();
+void UIWizardAddCloudVMPageExpert::sltHandleProviderComboChange()
+{
+    updateProvider();
     emit completeChanged();
 }
@@ -226,7 +209,5 @@
 void UIWizardAddCloudVMPageExpert::sltHandleProfileComboChange()
 {
-    /* Refresh required settings: */
-    populateProfile();
-    populateProfileInstances();
+    updateProfile();
     emit completeChanged();
 }
@@ -234,6 +215,73 @@
 void UIWizardAddCloudVMPageExpert::sltHandleProfileButtonClick()
 {
-    /* Open Cloud Profile Manager: */
     if (gpManager)
         gpManager->openCloudProfileManager();
 }
+
+void UIWizardAddCloudVMPageExpert::sltHandleSourceInstanceChange()
+{
+    updateSourceInstance();
+    emit completeChanged();
+}
+
+void UIWizardAddCloudVMPageExpert::setShortProviderName(const QString &strShortProviderName)
+{
+    qobject_cast<UIWizardAddCloudVM*>(wizard())->setShortProviderName(strShortProviderName);
+}
+
+QString UIWizardAddCloudVMPageExpert::shortProviderName() const
+{
+    return qobject_cast<UIWizardAddCloudVM*>(wizard())->shortProviderName();
+}
+
+void UIWizardAddCloudVMPageExpert::setProfileName(const QString &strProfileName)
+{
+    qobject_cast<UIWizardAddCloudVM*>(wizard())->setProfileName(strProfileName);
+}
+
+QString UIWizardAddCloudVMPageExpert::profileName() const
+{
+    return qobject_cast<UIWizardAddCloudVM*>(wizard())->profileName();
+}
+
+void UIWizardAddCloudVMPageExpert::setClient(const CCloudClient &comClient)
+{
+    qobject_cast<UIWizardAddCloudVM*>(wizard())->setClient(comClient);
+}
+
+CCloudClient UIWizardAddCloudVMPageExpert::client() const
+{
+    return qobject_cast<UIWizardAddCloudVM*>(wizard())->client();
+}
+
+void UIWizardAddCloudVMPageExpert::setInstanceIds(const QStringList &instanceIds)
+{
+    qobject_cast<UIWizardAddCloudVM*>(wizard())->setInstanceIds(instanceIds);
+}
+
+QStringList UIWizardAddCloudVMPageExpert::instanceIds() const
+{
+    return qobject_cast<UIWizardAddCloudVM*>(wizard())->instanceIds();
+}
+
+void UIWizardAddCloudVMPageExpert::updateProvider()
+{
+    updateComboToolTip(m_pProviderComboBox);
+    setShortProviderName(m_pProviderComboBox->currentData(ProviderData_ShortName).toString());
+    CCloudProvider comCloudProvider = cloudProviderByShortName(shortProviderName(), wizard());
+    populateProfiles(m_pProfileComboBox, comCloudProvider);
+    updateProfile();
+}
+
+void UIWizardAddCloudVMPageExpert::updateProfile()
+{
+    setProfileName(m_pProfileComboBox->currentData(ProfileData_Name).toString());
+    setClient(cloudClientByName(shortProviderName(), profileName(), wizard()));
+    populateProfileInstances(m_pSourceInstanceList, client());
+    updateSourceInstance();
+}
+
+void UIWizardAddCloudVMPageExpert::updateSourceInstance()
+{
+    setInstanceIds(currentListWidgetData(m_pSourceInstanceList));
+}
Index: trunk/src/VBox/Frontends/VirtualBox/src/wizards/addcloudvm/UIWizardAddCloudVMPageExpert.h
===================================================================
--- trunk/src/VBox/Frontends/VirtualBox/src/wizards/addcloudvm/UIWizardAddCloudVMPageExpert.h	(revision 89998)
+++ trunk/src/VBox/Frontends/VirtualBox/src/wizards/addcloudvm/UIWizardAddCloudVMPageExpert.h	(revision 89999)
@@ -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
@@ -28,12 +28,9 @@
 class QGroupBox;
 
-/** UIWizardPage extension for UIWizardAddCloudVMPage1. */
-class UIWizardAddCloudVMPageExpert : public UIWizardPage,
-                                     public UIWizardAddCloudVMPage1
+/** UINativeWizardPage extension for Expert page of the Add Cloud VM wizard,
+  * based on UIWizardAddCloudVMPage1 namespace functions. */
+class UIWizardAddCloudVMPageExpert : public UINativeWizardPage
 {
     Q_OBJECT;
-    Q_PROPERTY(QString source READ source);
-    Q_PROPERTY(QString profileName READ profileName);
-    Q_PROPERTY(QStringList instanceIds READ instanceIds);
 
 public:
@@ -44,34 +41,80 @@
 protected:
 
-    /** Allows access wizard from base part. */
-    virtual UIWizard *wizardImp() const /* override */ { return UIWizardPage::wizard(); }
-
     /** Handles translation event. */
-    virtual void retranslateUi() /* override */;
+    virtual void retranslateUi() /* override final */;
 
     /** Performs page initialization. */
-    virtual void initializePage() /* override */;
+    virtual void initializePage() /* override final */;
 
     /** Returns whether page is complete. */
-    virtual bool isComplete() const /* override */;
+    virtual bool isComplete() const /* override final */;
 
     /** Performs page validation. */
-    virtual bool validatePage() /* override */;
+    virtual bool validatePage() /* override final */;
 
 private slots:
 
-    /** Handles change in source combo-box. */
-    void sltHandleSourceChange();
+    /** Handles change in provider combo-box. */
+    void sltHandleProviderComboChange();
 
     /** Handles change in profile combo-box. */
     void sltHandleProfileComboChange();
-
     /** Handles profile tool-button click. */
     void sltHandleProfileButtonClick();
 
+    /** Handles change in instance list. */
+    void sltHandleSourceInstanceChange();
+
 private:
 
-    /** Holds the source container instance. */
-    QGroupBox *m_pCntSource;
+    /** Defines short provider name. */
+    void setShortProviderName(const QString &strShortProviderName);
+    /** Returns profile name. */
+    QString shortProviderName() const;
+
+    /** Defines profile name. */
+    void setProfileName(const QString &strProfileName);
+    /** Returns profile name. */
+    QString profileName() const;
+
+    /** Defines Cloud @a comClient object. */
+    void setClient(const CCloudClient &comClient);
+    /** Returns Cloud Client object. */
+    CCloudClient client() const;
+
+    /** Defines @a instanceIds. */
+    void setInstanceIds(const QStringList &instanceIds);
+    /** Returns instance IDs. */
+    QStringList instanceIds() const;
+
+    /** Updates provider. */
+    void updateProvider();
+    /** Updates profile. */
+    void updateProfile();
+    /** Updates source instance. */
+    void updateSourceInstance();
+
+    /** Holds the provider container instance. */
+    QGroupBox *m_pCntProvider;
+
+    /** Holds the provider layout instance. */
+    QGridLayout *m_pProviderLayout;
+    /** Holds the provider type label instance. */
+    QLabel      *m_pProviderLabel;
+    /** Holds the provider type combo-box instance. */
+    QIComboBox  *m_pProviderComboBox;
+
+    /** Holds the options layout instance. */
+    QGridLayout  *m_pOptionsLayout;
+    /** 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 source instance label instance. */
+    QLabel       *m_pSourceInstanceLabel;
+    /** Holds the source instance list instance. */
+    QListWidget  *m_pSourceInstanceList;
 };
 
